diff --git a/BUILD.gn b/BUILD.gn
index 590d1fd..2f51c21 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -801,6 +801,544 @@
 
   static_library("xfa") {
     sources = [
+      "xfa/fde/css/fde_css.h",
+      "xfa/fde/css/fde_csscache.cpp",
+      "xfa/fde/css/fde_csscache.h",
+      "xfa/fde/css/fde_cssdatatable.cpp",
+      "xfa/fde/css/fde_cssdatatable.h",
+      "xfa/fde/css/fde_cssdeclaration.cpp",
+      "xfa/fde/css/fde_cssdeclaration.h",
+      "xfa/fde/css/fde_cssstyleselector.cpp",
+      "xfa/fde/css/fde_cssstyleselector.h",
+      "xfa/fde/css/fde_cssstylesheet.cpp",
+      "xfa/fde/css/fde_cssstylesheet.h",
+      "xfa/fde/css/fde_csssyntax.cpp",
+      "xfa/fde/css/fde_csssyntax.h",
+      "xfa/fde/fde_brush.h",
+      "xfa/fde/fde_devbasic.cpp",
+      "xfa/fde/fde_devbasic.h",
+      "xfa/fde/fde_gedevice.cpp",
+      "xfa/fde/fde_gedevice.h",
+      "xfa/fde/fde_geobject.cpp",
+      "xfa/fde/fde_geobject.h",
+      "xfa/fde/fde_image.h",
+      "xfa/fde/fde_iterator.cpp",
+      "xfa/fde/fde_iterator.h",
+      "xfa/fde/fde_object.cpp",
+      "xfa/fde/fde_object.h",
+      "xfa/fde/fde_path.h",
+      "xfa/fde/fde_pen.h",
+      "xfa/fde/fde_render.cpp",
+      "xfa/fde/fde_render.h",
+      "xfa/fde/fde_renderdevice.h",
+      "xfa/fde/tto/fde_textout.cpp",
+      "xfa/fde/tto/fde_textout.h",
+      "xfa/fde/xml/fde_xml.h",
+      "xfa/fde/xml/fde_xml_imp.cpp",
+      "xfa/fde/xml/fde_xml_imp.h",
+      "xfa/fee/fde_txtedtbuf.cpp",
+      "xfa/fee/fde_txtedtbuf.h",
+      "xfa/fee/fde_txtedtengine.cpp",
+      "xfa/fee/fde_txtedtengine.h",
+      "xfa/fee/fde_txtedtpage.cpp",
+      "xfa/fee/fde_txtedtpage.h",
+      "xfa/fee/fde_txtedtparag.cpp",
+      "xfa/fee/fde_txtedtparag.h",
+      "xfa/fee/fx_wordbreak/fx_wordbreak.h",
+      "xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp",
+      "xfa/fee/fx_wordbreak/fx_wordbreak_impl.h",
+      "xfa/fee/fx_wordbreak/fx_wordbreakdata.cpp",
+      "xfa/fee/ifde_txtedtbuf.h",
+      "xfa/fee/ifde_txtedtengine.h",
+      "xfa/fee/ifde_txtedtpage.h",
+      "xfa/fgas/crt/fgas_algorithm.cpp",
+      "xfa/fgas/crt/fgas_algorithm.h",
+      "xfa/fgas/crt/fgas_codepage.cpp",
+      "xfa/fgas/crt/fgas_codepage.h",
+      "xfa/fgas/crt/fgas_encode.cpp",
+      "xfa/fgas/crt/fgas_language.h",
+      "xfa/fgas/crt/fgas_memory.cpp",
+      "xfa/fgas/crt/fgas_memory.h",
+      "xfa/fgas/crt/fgas_stream.cpp",
+      "xfa/fgas/crt/fgas_stream.h",
+      "xfa/fgas/crt/fgas_system.cpp",
+      "xfa/fgas/crt/fgas_system.h",
+      "xfa/fgas/crt/fgas_utils.cpp",
+      "xfa/fgas/crt/fgas_utils.h",
+      "xfa/fgas/font/fgas_font.h",
+      "xfa/fgas/font/fgas_fontutils.cpp",
+      "xfa/fgas/font/fgas_fontutils.h",
+      "xfa/fgas/font/fgas_gefont.cpp",
+      "xfa/fgas/font/fgas_gefont.h",
+      "xfa/fgas/font/fgas_stdfontmgr.cpp",
+      "xfa/fgas/font/fgas_stdfontmgr.h",
+      "xfa/fgas/layout/fgas_linebreak.cpp",
+      "xfa/fgas/layout/fgas_linebreak.h",
+      "xfa/fgas/layout/fgas_rtfbreak.cpp",
+      "xfa/fgas/layout/fgas_rtfbreak.h",
+      "xfa/fgas/layout/fgas_textbreak.cpp",
+      "xfa/fgas/layout/fgas_textbreak.h",
+      "xfa/fgas/layout/fgas_unicode.cpp",
+      "xfa/fgas/layout/fgas_unicode.h",
+      "xfa/fgas/localization/fgas_datetime.cpp",
+      "xfa/fgas/localization/fgas_datetime.h",
+      "xfa/fgas/localization/fgas_locale.cpp",
+      "xfa/fgas/localization/fgas_locale.h",
+      "xfa/fgas/localization/fgas_localeimp.h",
+      "xfa/fgas/localization/fgas_localemgr.cpp",
+      "xfa/fgas/localization/fgas_localemgr.h",
+      "xfa/fgas/xml/fgas_sax.h",
+      "xfa/fgas/xml/fgas_sax_imp.cpp",
+      "xfa/fgas/xml/fgas_sax_imp.h",
+      "xfa/fwl/basewidget/fwl_barcodeimp.cpp",
+      "xfa/fwl/basewidget/fwl_barcodeimp.h",
+      "xfa/fwl/basewidget/fwl_caretimp.cpp",
+      "xfa/fwl/basewidget/fwl_caretimp.h",
+      "xfa/fwl/basewidget/fwl_checkboximp.cpp",
+      "xfa/fwl/basewidget/fwl_checkboximp.h",
+      "xfa/fwl/basewidget/fwl_comboboximp.cpp",
+      "xfa/fwl/basewidget/fwl_comboboximp.h",
+      "xfa/fwl/basewidget/fwl_datetimepickerimp.cpp",
+      "xfa/fwl/basewidget/fwl_datetimepickerimp.h",
+      "xfa/fwl/basewidget/fwl_editimp.cpp",
+      "xfa/fwl/basewidget/fwl_editimp.h",
+      "xfa/fwl/basewidget/fwl_formproxyimp.cpp",
+      "xfa/fwl/basewidget/fwl_formproxyimp.h",
+      "xfa/fwl/basewidget/fwl_listboximp.cpp",
+      "xfa/fwl/basewidget/fwl_listboximp.h",
+      "xfa/fwl/basewidget/fwl_monthcalendarimp.cpp",
+      "xfa/fwl/basewidget/fwl_monthcalendarimp.h",
+      "xfa/fwl/basewidget/fwl_pictureboximp.cpp",
+      "xfa/fwl/basewidget/fwl_pictureboximp.h",
+      "xfa/fwl/basewidget/fwl_pushbuttonimp.cpp",
+      "xfa/fwl/basewidget/fwl_pushbuttonimp.h",
+      "xfa/fwl/basewidget/fwl_scrollbarimp.cpp",
+      "xfa/fwl/basewidget/fwl_scrollbarimp.h",
+      "xfa/fwl/basewidget/fwl_spinbuttonimp.cpp",
+      "xfa/fwl/basewidget/fwl_spinbuttonimp.h",
+      "xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp",
+      "xfa/fwl/basewidget/fwl_tooltipctrlimp.h",
+      "xfa/fwl/basewidget/fxmath_barcodeimp.cpp",
+      "xfa/fwl/basewidget/fxmath_barcodeimp.h",
+      "xfa/fwl/core/fwl_appimp.cpp",
+      "xfa/fwl/core/fwl_appimp.h",
+      "xfa/fwl/core/fwl_contentimp.cpp",
+      "xfa/fwl/core/fwl_contentimp.h",
+      "xfa/fwl/core/fwl_formimp.cpp",
+      "xfa/fwl/core/fwl_formimp.h",
+      "xfa/fwl/core/fwl_gridimp.cpp",
+      "xfa/fwl/core/fwl_gridimp.h",
+      "xfa/fwl/core/fwl_noteimp.cpp",
+      "xfa/fwl/core/fwl_noteimp.h",
+      "xfa/fwl/core/fwl_panelimp.cpp",
+      "xfa/fwl/core/fwl_panelimp.h",
+      "xfa/fwl/core/fwl_sdadapterimp.cpp",
+      "xfa/fwl/core/fwl_targetimp.cpp",
+      "xfa/fwl/core/fwl_targetimp.h",
+      "xfa/fwl/core/fwl_threadimp.cpp",
+      "xfa/fwl/core/fwl_threadimp.h",
+      "xfa/fwl/core/fwl_timerimp.cpp",
+      "xfa/fwl/core/fwl_widgetimp.cpp",
+      "xfa/fwl/core/fwl_widgetimp.h",
+      "xfa/fwl/core/fwl_widgetmgrimp.cpp",
+      "xfa/fwl/core/fwl_widgetmgrimp.h",
+      "xfa/fwl/lightwidget/app.cpp",
+      "xfa/fwl/lightwidget/barcode.cpp",
+      "xfa/fwl/lightwidget/caret.cpp",
+      "xfa/fwl/lightwidget/checkbox.cpp",
+      "xfa/fwl/lightwidget/combobox.cpp",
+      "xfa/fwl/lightwidget/datetimepicker.cpp",
+      "xfa/fwl/lightwidget/edit.cpp",
+      "xfa/fwl/lightwidget/listbox.cpp",
+      "xfa/fwl/lightwidget/picturebox.cpp",
+      "xfa/fwl/lightwidget/pushbutton.cpp",
+      "xfa/fwl/lightwidget/scrollbar.cpp",
+      "xfa/fwl/lightwidget/theme.cpp",
+      "xfa/fwl/lightwidget/tooltipctrl.cpp",
+      "xfa/fwl/lightwidget/widget.cpp",
+      "xfa/fwl/theme/barcodetp.cpp",
+      "xfa/fwl/theme/carettp.cpp",
+      "xfa/fwl/theme/checkboxtp.cpp",
+      "xfa/fwl/theme/comboboxtp.cpp",
+      "xfa/fwl/theme/datetimepickertp.cpp",
+      "xfa/fwl/theme/edittp.cpp",
+      "xfa/fwl/theme/formtp.cpp",
+      "xfa/fwl/theme/listboxtp.cpp",
+      "xfa/fwl/theme/monthcalendartp.cpp",
+      "xfa/fwl/theme/pictureboxtp.cpp",
+      "xfa/fwl/theme/pushbuttontp.cpp",
+      "xfa/fwl/theme/scrollbartp.cpp",
+      "xfa/fwl/theme/widgettp.cpp",
+      "xfa/fxbarcode/BC_BarCode.cpp",
+      "xfa/fxbarcode/BC_Binarizer.cpp",
+      "xfa/fxbarcode/BC_Binarizer.h",
+      "xfa/fxbarcode/BC_BinaryBitmap.cpp",
+      "xfa/fxbarcode/BC_BinaryBitmap.h",
+      "xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp",
+      "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h",
+      "xfa/fxbarcode/BC_DecoderResult.h",
+      "xfa/fxbarcode/BC_Dimension.cpp",
+      "xfa/fxbarcode/BC_Dimension.h",
+      "xfa/fxbarcode/BC_Library.cpp",
+      "xfa/fxbarcode/BC_LuminanceSource.cpp",
+      "xfa/fxbarcode/BC_LuminanceSource.h",
+      "xfa/fxbarcode/BC_Reader.cpp",
+      "xfa/fxbarcode/BC_Reader.h",
+      "xfa/fxbarcode/BC_ResultPoint.cpp",
+      "xfa/fxbarcode/BC_ResultPoint.h",
+      "xfa/fxbarcode/BC_TwoDimWriter.cpp",
+      "xfa/fxbarcode/BC_TwoDimWriter.h",
+      "xfa/fxbarcode/BC_UtilCodingConvert.cpp",
+      "xfa/fxbarcode/BC_UtilCodingConvert.h",
+      "xfa/fxbarcode/BC_UtilRSS.cpp",
+      "xfa/fxbarcode/BC_UtilRSS.h",
+      "xfa/fxbarcode/BC_Utils.cpp",
+      "xfa/fxbarcode/BC_Writer.cpp",
+      "xfa/fxbarcode/BC_Writer.h",
+      "xfa/fxbarcode/common/BC_CommonBitArray.cpp",
+      "xfa/fxbarcode/common/BC_CommonBitArray.h",
+      "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp",
+      "xfa/fxbarcode/common/BC_CommonBitMatrix.h",
+      "xfa/fxbarcode/common/BC_CommonBitSource.cpp",
+      "xfa/fxbarcode/common/BC_CommonBitSource.h",
+      "xfa/fxbarcode/common/BC_CommonByteArray.cpp",
+      "xfa/fxbarcode/common/BC_CommonByteArray.h",
+      "xfa/fxbarcode/common/BC_CommonByteMatrix.cpp",
+      "xfa/fxbarcode/common/BC_CommonByteMatrix.h",
+      "xfa/fxbarcode/common/BC_CommonCharacterSetECI.cpp",
+      "xfa/fxbarcode/common/BC_CommonCharacterSetECI.h",
+      "xfa/fxbarcode/common/BC_CommonDecoderResult.cpp",
+      "xfa/fxbarcode/common/BC_CommonDecoderResult.h",
+      "xfa/fxbarcode/common/BC_CommonECI.cpp",
+      "xfa/fxbarcode/common/BC_CommonECI.h",
+      "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
+      "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h",
+      "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp",
+      "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h",
+      "xfa/fxbarcode/common/BC_WhiteRectangleDetector.cpp",
+      "xfa/fxbarcode/common/BC_WhiteRectangleDetector.h",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp",
+      "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h",
+      "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h",
+      "xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h",
+      "xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_C40Encoder.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h",
+      "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp",
+      "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h",
+      "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h",
+      "xfa/fxbarcode/datamatrix/BC_Encoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_Encoder.h",
+      "xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp",
+      "xfa/fxbarcode/datamatrix/BC_EncoderContext.h",
+      "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp",
+      "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h",
+      "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h",
+      "xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp",
+      "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h",
+      "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp",
+      "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h",
+      "xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_TextEncoder.h",
+      "xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp",
+      "xfa/fxbarcode/datamatrix/BC_X12Encoder.h",
+      "xfa/fxbarcode/oned/BC_OneDReader.cpp",
+      "xfa/fxbarcode/oned/BC_OneDReader.h",
+      "xfa/fxbarcode/oned/BC_OneDimReader.cpp",
+      "xfa/fxbarcode/oned/BC_OneDimReader.h",
+      "xfa/fxbarcode/oned/BC_OneDimWriter.cpp",
+      "xfa/fxbarcode/oned/BC_OneDimWriter.h",
+      "xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h",
+      "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h",
+      "xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCode128Reader.h",
+      "xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCode128Writer.h",
+      "xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCode39Reader.h",
+      "xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp",
+      "xfa/fxbarcode/oned/BC_OnedCode39Writer.h",
+      "xfa/fxbarcode/oned/BC_OnedEAN13Reader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h",
+      "xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp",
+      "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h",
+      "xfa/fxbarcode/oned/BC_OnedEAN8Reader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h",
+      "xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp",
+      "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h",
+      "xfa/fxbarcode/oned/BC_OnedUPCAReader.cpp",
+      "xfa/fxbarcode/oned/BC_OnedUPCAReader.h",
+      "xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp",
+      "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Common.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Common.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Detector.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Detector.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Dimensions.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Reader.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h",
+      "xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417Writer.h",
+      "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp",
+      "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h",
+      "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h",
+      "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h",
+      "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h",
+      "xfa/fxbarcode/qrcode/BC_QRCodeReader.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCodeReader.h",
+      "xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoder.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoder.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderECB.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderMode.h",
+      "xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h",
+      "xfa/fxbarcode/qrcode/BC_QRDataBlock.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRDataBlock.h",
+      "xfa/fxbarcode/qrcode/BC_QRDataMask.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRDataMask.h",
+      "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h",
+      "xfa/fxbarcode/qrcode/BC_QRDetector.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRDetector.h",
+      "xfa/fxbarcode/qrcode/BC_QRDetectorResult.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h",
+      "xfa/fxbarcode/qrcode/BC_QRFinderPattern.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h",
+      "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h",
+      "xfa/fxbarcode/qrcode/BC_QRGridSampler.cpp",
+      "xfa/fxbarcode/qrcode/BC_QRGridSampler.h",
+      "xfa/fxbarcode/utils.h",
+      "xfa/fxfa/app/xfa_checksum.cpp",
+      "xfa/fxfa/app/xfa_checksum.h",
+      "xfa/fxfa/app/xfa_ffapp.cpp",
+      "xfa/fxfa/app/xfa_ffapp.h",
+      "xfa/fxfa/app/xfa_ffbarcode.cpp",
+      "xfa/fxfa/app/xfa_ffbarcode.h",
+      "xfa/fxfa/app/xfa_ffcheckbutton.cpp",
+      "xfa/fxfa/app/xfa_ffcheckbutton.h",
+      "xfa/fxfa/app/xfa_ffchoicelist.cpp",
+      "xfa/fxfa/app/xfa_ffchoicelist.h",
+      "xfa/fxfa/app/xfa_ffdoc.cpp",
+      "xfa/fxfa/app/xfa_ffdoc.h",
+      "xfa/fxfa/app/xfa_ffdochandler.cpp",
+      "xfa/fxfa/app/xfa_ffdochandler.h",
+      "xfa/fxfa/app/xfa_ffdocview.cpp",
+      "xfa/fxfa/app/xfa_ffdocview.h",
+      "xfa/fxfa/app/xfa_ffdraw.cpp",
+      "xfa/fxfa/app/xfa_ffdraw.h",
+      "xfa/fxfa/app/xfa_ffexclgroup.cpp",
+      "xfa/fxfa/app/xfa_ffexclgroup.h",
+      "xfa/fxfa/app/xfa_fffield.cpp",
+      "xfa/fxfa/app/xfa_fffield.h",
+      "xfa/fxfa/app/xfa_ffimage.cpp",
+      "xfa/fxfa/app/xfa_ffimage.h",
+      "xfa/fxfa/app/xfa_ffimageedit.cpp",
+      "xfa/fxfa/app/xfa_ffimageedit.h",
+      "xfa/fxfa/app/xfa_ffnotify.cpp",
+      "xfa/fxfa/app/xfa_ffnotify.h",
+      "xfa/fxfa/app/xfa_ffpageview.cpp",
+      "xfa/fxfa/app/xfa_ffpageview.h",
+      "xfa/fxfa/app/xfa_ffpath.cpp",
+      "xfa/fxfa/app/xfa_ffpath.h",
+      "xfa/fxfa/app/xfa_ffpushbutton.cpp",
+      "xfa/fxfa/app/xfa_ffpushbutton.h",
+      "xfa/fxfa/app/xfa_ffsignature.cpp",
+      "xfa/fxfa/app/xfa_ffsignature.h",
+      "xfa/fxfa/app/xfa_ffsubform.cpp",
+      "xfa/fxfa/app/xfa_ffsubform.h",
+      "xfa/fxfa/app/xfa_fftext.cpp",
+      "xfa/fxfa/app/xfa_fftext.h",
+      "xfa/fxfa/app/xfa_fftextedit.cpp",
+      "xfa/fxfa/app/xfa_fftextedit.h",
+      "xfa/fxfa/app/xfa_ffwidget.cpp",
+      "xfa/fxfa/app/xfa_ffwidget.h",
+      "xfa/fxfa/app/xfa_ffwidgetacc.cpp",
+      "xfa/fxfa/app/xfa_ffwidgetacc.h",
+      "xfa/fxfa/app/xfa_ffwidgethandler.cpp",
+      "xfa/fxfa/app/xfa_ffwidgethandler.h",
+      "xfa/fxfa/app/xfa_fontmgr.cpp",
+      "xfa/fxfa/app/xfa_fontmgr.h",
+      "xfa/fxfa/app/xfa_fwladapter.cpp",
+      "xfa/fxfa/app/xfa_fwladapter.h",
+      "xfa/fxfa/app/xfa_fwltheme.cpp",
+      "xfa/fxfa/app/xfa_fwltheme.h",
+      "xfa/fxfa/app/xfa_rendercontext.cpp",
+      "xfa/fxfa/app/xfa_rendercontext.h",
+      "xfa/fxfa/app/xfa_textlayout.cpp",
+      "xfa/fxfa/app/xfa_textlayout.h",
+      "xfa/fxfa/fm2js/xfa_error.cpp",
+      "xfa/fxfa/fm2js/xfa_error.h",
+      "xfa/fxfa/fm2js/xfa_expression.cpp",
+      "xfa/fxfa/fm2js/xfa_expression.h",
+      "xfa/fxfa/fm2js/xfa_fm2jsapi.cpp",
+      "xfa/fxfa/fm2js/xfa_fm2jsapi.h",
+      "xfa/fxfa/fm2js/xfa_fm2jscontext.cpp",
+      "xfa/fxfa/fm2js/xfa_fm2jscontext.h",
+      "xfa/fxfa/fm2js/xfa_fmparse.cpp",
+      "xfa/fxfa/fm2js/xfa_fmparse.h",
+      "xfa/fxfa/fm2js/xfa_lexer.cpp",
+      "xfa/fxfa/fm2js/xfa_lexer.h",
+      "xfa/fxfa/fm2js/xfa_program.cpp",
+      "xfa/fxfa/fm2js/xfa_program.h",
+      "xfa/fxfa/fm2js/xfa_simpleexpression.cpp",
+      "xfa/fxfa/fm2js/xfa_simpleexpression.h",
+      "xfa/fxfa/parser/xfa_basic_data.cpp",
+      "xfa/fxfa/parser/xfa_basic_data.h",
+      "xfa/fxfa/parser/xfa_basic_imp.cpp",
+      "xfa/fxfa/parser/xfa_basic_imp.h",
+      "xfa/fxfa/parser/xfa_docdata.h",
+      "xfa/fxfa/parser/xfa_doclayout.h",
+      "xfa/fxfa/parser/xfa_document.h",
+      "xfa/fxfa/parser/xfa_document_datadescription_imp.cpp",
+      "xfa/fxfa/parser/xfa_document_datadescription_imp.h",
+      "xfa/fxfa/parser/xfa_document_datamerger_imp.cpp",
+      "xfa/fxfa/parser/xfa_document_datamerger_imp.h",
+      "xfa/fxfa/parser/xfa_document_imp.cpp",
+      "xfa/fxfa/parser/xfa_document_layout_imp.cpp",
+      "xfa/fxfa/parser/xfa_document_layout_imp.h",
+      "xfa/fxfa/parser/xfa_document_serialize.cpp",
+      "xfa/fxfa/parser/xfa_document_serialize.h",
+      "xfa/fxfa/parser/xfa_layout_appadapter.cpp",
+      "xfa/fxfa/parser/xfa_layout_appadapter.h",
+      "xfa/fxfa/parser/xfa_layout_itemlayout.cpp",
+      "xfa/fxfa/parser/xfa_layout_itemlayout.h",
+      "xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp",
+      "xfa/fxfa/parser/xfa_layout_pagemgr_new.h",
+      "xfa/fxfa/parser/xfa_locale.cpp",
+      "xfa/fxfa/parser/xfa_locale.h",
+      "xfa/fxfa/parser/xfa_localemgr.cpp",
+      "xfa/fxfa/parser/xfa_localemgr.h",
+      "xfa/fxfa/parser/xfa_localevalue.cpp",
+      "xfa/fxfa/parser/xfa_localevalue.h",
+      "xfa/fxfa/parser/xfa_object.h",
+      "xfa/fxfa/parser/xfa_object_imp.cpp",
+      "xfa/fxfa/parser/xfa_objectacc_imp.cpp",
+      "xfa/fxfa/parser/xfa_parser.h",
+      "xfa/fxfa/parser/xfa_parser_imp.cpp",
+      "xfa/fxfa/parser/xfa_parser_imp.h",
+      "xfa/fxfa/parser/xfa_script.h",
+      "xfa/fxfa/parser/xfa_script_datawindow.cpp",
+      "xfa/fxfa/parser/xfa_script_datawindow.h",
+      "xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp",
+      "xfa/fxfa/parser/xfa_script_eventpseudomodel.h",
+      "xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp",
+      "xfa/fxfa/parser/xfa_script_hostpseudomodel.h",
+      "xfa/fxfa/parser/xfa_script_imp.cpp",
+      "xfa/fxfa/parser/xfa_script_imp.h",
+      "xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp",
+      "xfa/fxfa/parser/xfa_script_layoutpseudomodel.h",
+      "xfa/fxfa/parser/xfa_script_logpseudomodel.cpp",
+      "xfa/fxfa/parser/xfa_script_logpseudomodel.h",
+      "xfa/fxfa/parser/xfa_script_nodehelper.cpp",
+      "xfa/fxfa/parser/xfa_script_nodehelper.h",
+      "xfa/fxfa/parser/xfa_script_resolveprocessor.cpp",
+      "xfa/fxfa/parser/xfa_script_resolveprocessor.h",
+      "xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp",
+      "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h",
+      "xfa/fxfa/parser/xfa_utils.h",
+      "xfa/fxfa/parser/xfa_utils_imp.cpp",
+      "xfa/fxgraphics/fx_graphics.cpp",
+      "xfa/fxgraphics/fx_path_generator.cpp",
+      "xfa/fxgraphics/fx_path_generator.h",
+      "xfa/fxgraphics/pre.h",
       "xfa/include/fwl/adapter/fwl_adapternative.h",
       "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h",
       "xfa/include/fwl/adapter/fwl_adaptertimermgr.h",
@@ -870,559 +1408,21 @@
       "xfa/include/fxfa/fxfa_widget.h",
       "xfa/include/fxgraphics/fx_graphics.h",
       "xfa/include/fxjse/fxjse.h",
-      "xfa/src/fde/css/fde_css.h",
-      "xfa/src/fde/css/fde_csscache.cpp",
-      "xfa/src/fde/css/fde_csscache.h",
-      "xfa/src/fde/css/fde_cssdatatable.cpp",
-      "xfa/src/fde/css/fde_cssdatatable.h",
-      "xfa/src/fde/css/fde_cssdeclaration.cpp",
-      "xfa/src/fde/css/fde_cssdeclaration.h",
-      "xfa/src/fde/css/fde_cssstyleselector.cpp",
-      "xfa/src/fde/css/fde_cssstyleselector.h",
-      "xfa/src/fde/css/fde_cssstylesheet.cpp",
-      "xfa/src/fde/css/fde_cssstylesheet.h",
-      "xfa/src/fde/css/fde_csssyntax.cpp",
-      "xfa/src/fde/css/fde_csssyntax.h",
-      "xfa/src/fde/fde_brush.h",
-      "xfa/src/fde/fde_devbasic.cpp",
-      "xfa/src/fde/fde_devbasic.h",
-      "xfa/src/fde/fde_gedevice.cpp",
-      "xfa/src/fde/fde_gedevice.h",
-      "xfa/src/fde/fde_geobject.cpp",
-      "xfa/src/fde/fde_geobject.h",
-      "xfa/src/fde/fde_image.h",
-      "xfa/src/fde/fde_iterator.cpp",
-      "xfa/src/fde/fde_iterator.h",
-      "xfa/src/fde/fde_object.cpp",
-      "xfa/src/fde/fde_object.h",
-      "xfa/src/fde/fde_path.h",
-      "xfa/src/fde/fde_pen.h",
-      "xfa/src/fde/fde_render.cpp",
-      "xfa/src/fde/fde_render.h",
-      "xfa/src/fde/fde_renderdevice.h",
-      "xfa/src/fde/tto/fde_textout.cpp",
-      "xfa/src/fde/tto/fde_textout.h",
-      "xfa/src/fde/xml/fde_xml.h",
-      "xfa/src/fde/xml/fde_xml_imp.cpp",
-      "xfa/src/fde/xml/fde_xml_imp.h",
-      "xfa/src/fee/fde_txtedtbuf.cpp",
-      "xfa/src/fee/fde_txtedtbuf.h",
-      "xfa/src/fee/fde_txtedtengine.cpp",
-      "xfa/src/fee/fde_txtedtengine.h",
-      "xfa/src/fee/fde_txtedtpage.cpp",
-      "xfa/src/fee/fde_txtedtpage.h",
-      "xfa/src/fee/fde_txtedtparag.cpp",
-      "xfa/src/fee/fde_txtedtparag.h",
-      "xfa/src/fee/fx_wordbreak/fx_wordbreak.h",
-      "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.cpp",
-      "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h",
-      "xfa/src/fee/fx_wordbreak/fx_wordbreakdata.cpp",
-      "xfa/src/fee/ifde_txtedtbuf.h",
-      "xfa/src/fee/ifde_txtedtengine.h",
-      "xfa/src/fee/ifde_txtedtpage.h",
-      "xfa/src/fgas/crt/fgas_algorithm.cpp",
-      "xfa/src/fgas/crt/fgas_algorithm.h",
-      "xfa/src/fgas/crt/fgas_codepage.cpp",
-      "xfa/src/fgas/crt/fgas_codepage.h",
-      "xfa/src/fgas/crt/fgas_encode.cpp",
-      "xfa/src/fgas/crt/fgas_language.h",
-      "xfa/src/fgas/crt/fgas_memory.cpp",
-      "xfa/src/fgas/crt/fgas_memory.h",
-      "xfa/src/fgas/crt/fgas_stream.cpp",
-      "xfa/src/fgas/crt/fgas_stream.h",
-      "xfa/src/fgas/crt/fgas_system.cpp",
-      "xfa/src/fgas/crt/fgas_system.h",
-      "xfa/src/fgas/crt/fgas_utils.cpp",
-      "xfa/src/fgas/crt/fgas_utils.h",
-      "xfa/src/fgas/font/fgas_font.h",
-      "xfa/src/fgas/font/fgas_fontutils.cpp",
-      "xfa/src/fgas/font/fgas_fontutils.h",
-      "xfa/src/fgas/font/fgas_gefont.cpp",
-      "xfa/src/fgas/font/fgas_gefont.h",
-      "xfa/src/fgas/font/fgas_stdfontmgr.cpp",
-      "xfa/src/fgas/font/fgas_stdfontmgr.h",
-      "xfa/src/fgas/layout/fgas_linebreak.cpp",
-      "xfa/src/fgas/layout/fgas_linebreak.h",
-      "xfa/src/fgas/layout/fgas_rtfbreak.cpp",
-      "xfa/src/fgas/layout/fgas_rtfbreak.h",
-      "xfa/src/fgas/layout/fgas_textbreak.cpp",
-      "xfa/src/fgas/layout/fgas_textbreak.h",
-      "xfa/src/fgas/layout/fgas_unicode.cpp",
-      "xfa/src/fgas/layout/fgas_unicode.h",
-      "xfa/src/fgas/localization/fgas_datetime.cpp",
-      "xfa/src/fgas/localization/fgas_datetime.h",
-      "xfa/src/fgas/localization/fgas_locale.cpp",
-      "xfa/src/fgas/localization/fgas_locale.h",
-      "xfa/src/fgas/localization/fgas_localeimp.h",
-      "xfa/src/fgas/localization/fgas_localemgr.cpp",
-      "xfa/src/fgas/localization/fgas_localemgr.h",
-      "xfa/src/fgas/xml/fgas_sax.h",
-      "xfa/src/fgas/xml/fgas_sax_imp.cpp",
-      "xfa/src/fgas/xml/fgas_sax_imp.h",
-      "xfa/src/fwl/basewidget/fwl_barcodeimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_barcodeimp.h",
-      "xfa/src/fwl/basewidget/fwl_caretimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_caretimp.h",
-      "xfa/src/fwl/basewidget/fwl_checkboximp.cpp",
-      "xfa/src/fwl/basewidget/fwl_checkboximp.h",
-      "xfa/src/fwl/basewidget/fwl_comboboximp.cpp",
-      "xfa/src/fwl/basewidget/fwl_comboboximp.h",
-      "xfa/src/fwl/basewidget/fwl_datetimepickerimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_datetimepickerimp.h",
-      "xfa/src/fwl/basewidget/fwl_editimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_editimp.h",
-      "xfa/src/fwl/basewidget/fwl_formproxyimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_formproxyimp.h",
-      "xfa/src/fwl/basewidget/fwl_listboximp.cpp",
-      "xfa/src/fwl/basewidget/fwl_listboximp.h",
-      "xfa/src/fwl/basewidget/fwl_monthcalendarimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_monthcalendarimp.h",
-      "xfa/src/fwl/basewidget/fwl_pictureboximp.cpp",
-      "xfa/src/fwl/basewidget/fwl_pictureboximp.h",
-      "xfa/src/fwl/basewidget/fwl_pushbuttonimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_pushbuttonimp.h",
-      "xfa/src/fwl/basewidget/fwl_scrollbarimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_scrollbarimp.h",
-      "xfa/src/fwl/basewidget/fwl_spinbuttonimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_spinbuttonimp.h",
-      "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.cpp",
-      "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h",
-      "xfa/src/fwl/basewidget/fxmath_barcodeimp.cpp",
-      "xfa/src/fwl/basewidget/fxmath_barcodeimp.h",
-      "xfa/src/fwl/core/fwl_appimp.cpp",
-      "xfa/src/fwl/core/fwl_appimp.h",
-      "xfa/src/fwl/core/fwl_contentimp.cpp",
-      "xfa/src/fwl/core/fwl_contentimp.h",
-      "xfa/src/fwl/core/fwl_formimp.cpp",
-      "xfa/src/fwl/core/fwl_formimp.h",
-      "xfa/src/fwl/core/fwl_gridimp.cpp",
-      "xfa/src/fwl/core/fwl_gridimp.h",
-      "xfa/src/fwl/core/fwl_noteimp.cpp",
-      "xfa/src/fwl/core/fwl_noteimp.h",
-      "xfa/src/fwl/core/fwl_panelimp.cpp",
-      "xfa/src/fwl/core/fwl_panelimp.h",
-      "xfa/src/fwl/core/fwl_sdadapterimp.cpp",
-      "xfa/src/fwl/core/fwl_targetimp.cpp",
-      "xfa/src/fwl/core/fwl_targetimp.h",
-      "xfa/src/fwl/core/fwl_threadimp.cpp",
-      "xfa/src/fwl/core/fwl_threadimp.h",
-      "xfa/src/fwl/core/fwl_timerimp.cpp",
-      "xfa/src/fwl/core/fwl_widgetimp.cpp",
-      "xfa/src/fwl/core/fwl_widgetimp.h",
-      "xfa/src/fwl/core/fwl_widgetmgrimp.cpp",
-      "xfa/src/fwl/core/fwl_widgetmgrimp.h",
-      "xfa/src/fwl/lightwidget/app.cpp",
-      "xfa/src/fwl/lightwidget/barcode.cpp",
-      "xfa/src/fwl/lightwidget/caret.cpp",
-      "xfa/src/fwl/lightwidget/checkbox.cpp",
-      "xfa/src/fwl/lightwidget/combobox.cpp",
-      "xfa/src/fwl/lightwidget/datetimepicker.cpp",
-      "xfa/src/fwl/lightwidget/edit.cpp",
-      "xfa/src/fwl/lightwidget/listbox.cpp",
-      "xfa/src/fwl/lightwidget/picturebox.cpp",
-      "xfa/src/fwl/lightwidget/pushbutton.cpp",
-      "xfa/src/fwl/lightwidget/scrollbar.cpp",
-      "xfa/src/fwl/lightwidget/theme.cpp",
-      "xfa/src/fwl/lightwidget/tooltipctrl.cpp",
-      "xfa/src/fwl/lightwidget/widget.cpp",
-      "xfa/src/fwl/theme/barcodetp.cpp",
-      "xfa/src/fwl/theme/carettp.cpp",
-      "xfa/src/fwl/theme/checkboxtp.cpp",
-      "xfa/src/fwl/theme/comboboxtp.cpp",
-      "xfa/src/fwl/theme/datetimepickertp.cpp",
-      "xfa/src/fwl/theme/edittp.cpp",
-      "xfa/src/fwl/theme/formtp.cpp",
-      "xfa/src/fwl/theme/listboxtp.cpp",
-      "xfa/src/fwl/theme/monthcalendartp.cpp",
-      "xfa/src/fwl/theme/pictureboxtp.cpp",
-      "xfa/src/fwl/theme/pushbuttontp.cpp",
-      "xfa/src/fwl/theme/scrollbartp.cpp",
-      "xfa/src/fwl/theme/widgettp.cpp",
-      "xfa/src/fxbarcode/BC_BarCode.cpp",
-      "xfa/src/fxbarcode/BC_Binarizer.cpp",
-      "xfa/src/fxbarcode/BC_Binarizer.h",
-      "xfa/src/fxbarcode/BC_BinaryBitmap.cpp",
-      "xfa/src/fxbarcode/BC_BinaryBitmap.h",
-      "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp",
-      "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h",
-      "xfa/src/fxbarcode/BC_DecoderResult.h",
-      "xfa/src/fxbarcode/BC_Dimension.cpp",
-      "xfa/src/fxbarcode/BC_Dimension.h",
-      "xfa/src/fxbarcode/BC_Library.cpp",
-      "xfa/src/fxbarcode/BC_LuminanceSource.cpp",
-      "xfa/src/fxbarcode/BC_LuminanceSource.h",
-      "xfa/src/fxbarcode/BC_Reader.cpp",
-      "xfa/src/fxbarcode/BC_Reader.h",
-      "xfa/src/fxbarcode/BC_ResultPoint.cpp",
-      "xfa/src/fxbarcode/BC_ResultPoint.h",
-      "xfa/src/fxbarcode/BC_TwoDimWriter.cpp",
-      "xfa/src/fxbarcode/BC_TwoDimWriter.h",
-      "xfa/src/fxbarcode/BC_UtilCodingConvert.cpp",
-      "xfa/src/fxbarcode/BC_UtilCodingConvert.h",
-      "xfa/src/fxbarcode/BC_UtilRSS.cpp",
-      "xfa/src/fxbarcode/BC_UtilRSS.h",
-      "xfa/src/fxbarcode/BC_Utils.cpp",
-      "xfa/src/fxbarcode/BC_Writer.cpp",
-      "xfa/src/fxbarcode/BC_Writer.h",
-      "xfa/src/fxbarcode/common/BC_CommonBitArray.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonBitArray.h",
-      "xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h",
-      "xfa/src/fxbarcode/common/BC_CommonBitSource.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonBitSource.h",
-      "xfa/src/fxbarcode/common/BC_CommonByteArray.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonByteArray.h",
-      "xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h",
-      "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h",
-      "xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h",
-      "xfa/src/fxbarcode/common/BC_CommonECI.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonECI.h",
-      "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
-      "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h",
-      "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp",
-      "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h",
-      "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp",
-      "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp",
-      "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h",
-      "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h",
-      "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h",
-      "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_Encoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h",
-      "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h",
-      "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h",
-      "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h",
-      "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h",
-      "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp",
-      "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h",
-      "xfa/src/fxbarcode/oned/BC_OneDReader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OneDReader.h",
-      "xfa/src/fxbarcode/oned/BC_OneDimReader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OneDimReader.h",
-      "xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp",
-      "xfa/src/fxbarcode/oned/BC_OneDimWriter.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h",
-      "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h",
-      "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp",
-      "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp",
-      "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h",
-      "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoder.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRDetector.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h",
-      "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp",
-      "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h",
-      "xfa/src/fxbarcode/utils.h",
-      "xfa/src/fxfa/app/xfa_checksum.cpp",
-      "xfa/src/fxfa/app/xfa_checksum.h",
-      "xfa/src/fxfa/app/xfa_ffapp.cpp",
-      "xfa/src/fxfa/app/xfa_ffapp.h",
-      "xfa/src/fxfa/app/xfa_ffbarcode.cpp",
-      "xfa/src/fxfa/app/xfa_ffbarcode.h",
-      "xfa/src/fxfa/app/xfa_ffcheckbutton.cpp",
-      "xfa/src/fxfa/app/xfa_ffcheckbutton.h",
-      "xfa/src/fxfa/app/xfa_ffchoicelist.cpp",
-      "xfa/src/fxfa/app/xfa_ffchoicelist.h",
-      "xfa/src/fxfa/app/xfa_ffdoc.cpp",
-      "xfa/src/fxfa/app/xfa_ffdoc.h",
-      "xfa/src/fxfa/app/xfa_ffdochandler.cpp",
-      "xfa/src/fxfa/app/xfa_ffdochandler.h",
-      "xfa/src/fxfa/app/xfa_ffdocview.cpp",
-      "xfa/src/fxfa/app/xfa_ffdocview.h",
-      "xfa/src/fxfa/app/xfa_ffdraw.cpp",
-      "xfa/src/fxfa/app/xfa_ffdraw.h",
-      "xfa/src/fxfa/app/xfa_ffexclgroup.cpp",
-      "xfa/src/fxfa/app/xfa_ffexclgroup.h",
-      "xfa/src/fxfa/app/xfa_fffield.cpp",
-      "xfa/src/fxfa/app/xfa_fffield.h",
-      "xfa/src/fxfa/app/xfa_ffimage.cpp",
-      "xfa/src/fxfa/app/xfa_ffimage.h",
-      "xfa/src/fxfa/app/xfa_ffimageedit.cpp",
-      "xfa/src/fxfa/app/xfa_ffimageedit.h",
-      "xfa/src/fxfa/app/xfa_ffnotify.cpp",
-      "xfa/src/fxfa/app/xfa_ffnotify.h",
-      "xfa/src/fxfa/app/xfa_ffpageview.cpp",
-      "xfa/src/fxfa/app/xfa_ffpageview.h",
-      "xfa/src/fxfa/app/xfa_ffpath.cpp",
-      "xfa/src/fxfa/app/xfa_ffpath.h",
-      "xfa/src/fxfa/app/xfa_ffpushbutton.cpp",
-      "xfa/src/fxfa/app/xfa_ffpushbutton.h",
-      "xfa/src/fxfa/app/xfa_ffsignature.cpp",
-      "xfa/src/fxfa/app/xfa_ffsignature.h",
-      "xfa/src/fxfa/app/xfa_ffsubform.cpp",
-      "xfa/src/fxfa/app/xfa_ffsubform.h",
-      "xfa/src/fxfa/app/xfa_fftext.cpp",
-      "xfa/src/fxfa/app/xfa_fftext.h",
-      "xfa/src/fxfa/app/xfa_fftextedit.cpp",
-      "xfa/src/fxfa/app/xfa_fftextedit.h",
-      "xfa/src/fxfa/app/xfa_ffwidget.cpp",
-      "xfa/src/fxfa/app/xfa_ffwidget.h",
-      "xfa/src/fxfa/app/xfa_ffwidgetacc.cpp",
-      "xfa/src/fxfa/app/xfa_ffwidgetacc.h",
-      "xfa/src/fxfa/app/xfa_ffwidgethandler.cpp",
-      "xfa/src/fxfa/app/xfa_ffwidgethandler.h",
-      "xfa/src/fxfa/app/xfa_fontmgr.cpp",
-      "xfa/src/fxfa/app/xfa_fontmgr.h",
-      "xfa/src/fxfa/app/xfa_fwladapter.cpp",
-      "xfa/src/fxfa/app/xfa_fwladapter.h",
-      "xfa/src/fxfa/app/xfa_fwltheme.cpp",
-      "xfa/src/fxfa/app/xfa_fwltheme.h",
-      "xfa/src/fxfa/app/xfa_rendercontext.cpp",
-      "xfa/src/fxfa/app/xfa_rendercontext.h",
-      "xfa/src/fxfa/app/xfa_textlayout.cpp",
-      "xfa/src/fxfa/app/xfa_textlayout.h",
-      "xfa/src/fxfa/fm2js/xfa_error.cpp",
-      "xfa/src/fxfa/fm2js/xfa_error.h",
-      "xfa/src/fxfa/fm2js/xfa_expression.cpp",
-      "xfa/src/fxfa/fm2js/xfa_expression.h",
-      "xfa/src/fxfa/fm2js/xfa_fm2jsapi.cpp",
-      "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h",
-      "xfa/src/fxfa/fm2js/xfa_fm2jscontext.cpp",
-      "xfa/src/fxfa/fm2js/xfa_fm2jscontext.h",
-      "xfa/src/fxfa/fm2js/xfa_fmparse.cpp",
-      "xfa/src/fxfa/fm2js/xfa_fmparse.h",
-      "xfa/src/fxfa/fm2js/xfa_lexer.cpp",
-      "xfa/src/fxfa/fm2js/xfa_lexer.h",
-      "xfa/src/fxfa/fm2js/xfa_program.cpp",
-      "xfa/src/fxfa/fm2js/xfa_program.h",
-      "xfa/src/fxfa/fm2js/xfa_simpleexpression.cpp",
-      "xfa/src/fxfa/fm2js/xfa_simpleexpression.h",
-      "xfa/src/fxfa/parser/xfa_basic_data.cpp",
-      "xfa/src/fxfa/parser/xfa_basic_data.h",
-      "xfa/src/fxfa/parser/xfa_basic_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_basic_imp.h",
-      "xfa/src/fxfa/parser/xfa_docdata.h",
-      "xfa/src/fxfa/parser/xfa_doclayout.h",
-      "xfa/src/fxfa/parser/xfa_document.h",
-      "xfa/src/fxfa/parser/xfa_document_datadescription_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_document_datadescription_imp.h",
-      "xfa/src/fxfa/parser/xfa_document_datamerger_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_document_datamerger_imp.h",
-      "xfa/src/fxfa/parser/xfa_document_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_document_layout_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_document_layout_imp.h",
-      "xfa/src/fxfa/parser/xfa_document_serialize.cpp",
-      "xfa/src/fxfa/parser/xfa_document_serialize.h",
-      "xfa/src/fxfa/parser/xfa_layout_appadapter.cpp",
-      "xfa/src/fxfa/parser/xfa_layout_appadapter.h",
-      "xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp",
-      "xfa/src/fxfa/parser/xfa_layout_itemlayout.h",
-      "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.cpp",
-      "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h",
-      "xfa/src/fxfa/parser/xfa_locale.cpp",
-      "xfa/src/fxfa/parser/xfa_locale.h",
-      "xfa/src/fxfa/parser/xfa_localemgr.cpp",
-      "xfa/src/fxfa/parser/xfa_localemgr.h",
-      "xfa/src/fxfa/parser/xfa_localevalue.cpp",
-      "xfa/src/fxfa/parser/xfa_localevalue.h",
-      "xfa/src/fxfa/parser/xfa_object.h",
-      "xfa/src/fxfa/parser/xfa_object_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_objectacc_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_parser.h",
-      "xfa/src/fxfa/parser/xfa_parser_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_parser_imp.h",
-      "xfa/src/fxfa/parser/xfa_script.h",
-      "xfa/src/fxfa/parser/xfa_script_datawindow.cpp",
-      "xfa/src/fxfa/parser/xfa_script_datawindow.h",
-      "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.cpp",
-      "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h",
-      "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.cpp",
-      "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h",
-      "xfa/src/fxfa/parser/xfa_script_imp.cpp",
-      "xfa/src/fxfa/parser/xfa_script_imp.h",
-      "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.cpp",
-      "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h",
-      "xfa/src/fxfa/parser/xfa_script_logpseudomodel.cpp",
-      "xfa/src/fxfa/parser/xfa_script_logpseudomodel.h",
-      "xfa/src/fxfa/parser/xfa_script_nodehelper.cpp",
-      "xfa/src/fxfa/parser/xfa_script_nodehelper.h",
-      "xfa/src/fxfa/parser/xfa_script_resolveprocessor.cpp",
-      "xfa/src/fxfa/parser/xfa_script_resolveprocessor.h",
-      "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.cpp",
-      "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h",
-      "xfa/src/fxfa/parser/xfa_utils.h",
-      "xfa/src/fxfa/parser/xfa_utils_imp.cpp",
-      "xfa/src/fxgraphics/fx_graphics.cpp",
-      "xfa/src/fxgraphics/fx_path_generator.cpp",
-      "xfa/src/fxgraphics/fx_path_generator.h",
-      "xfa/src/fxgraphics/pre.h",
     ]
     include_dirs = [ "." ]
     if (pdf_enable_v8) {
       sources += [
-        "xfa/src/fxjse/class.cpp",
-        "xfa/src/fxjse/class.h",
-        "xfa/src/fxjse/context.cpp",
-        "xfa/src/fxjse/context.h",
-        "xfa/src/fxjse/dynprop.cpp",
-        "xfa/src/fxjse/runtime.cpp",
-        "xfa/src/fxjse/runtime.h",
-        "xfa/src/fxjse/scope_inline.h",
-        "xfa/src/fxjse/util_inline.h",
-        "xfa/src/fxjse/value.cpp",
-        "xfa/src/fxjse/value.h",
+        "xfa/fxjse/class.cpp",
+        "xfa/fxjse/class.h",
+        "xfa/fxjse/context.cpp",
+        "xfa/fxjse/context.h",
+        "xfa/fxjse/dynprop.cpp",
+        "xfa/fxjse/runtime.cpp",
+        "xfa/fxjse/runtime.h",
+        "xfa/fxjse/scope_inline.h",
+        "xfa/fxjse/util_inline.h",
+        "xfa/fxjse/value.cpp",
+        "xfa/fxjse/value.h",
       ]
       include_dirs += [
         "//v8",
@@ -1473,8 +1473,8 @@
   ]
   if (pdf_enable_xfa) {
     sources += [
-      "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp",
-      "xfa/src/fxfa/parser/xfa_utils_imp_unittest.cpp",
+      "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp",
+      "xfa/fxfa/parser/xfa_utils_imp_unittest.cpp",
     ]
   }
   configs += [ ":pdfium_config" ]
@@ -1502,7 +1502,7 @@
     "testing/embedder_test.h",
     "testing/embedder_test_mock_delegate.h",
     "testing/embedder_test_timer_handling_delegate.h",
-    "xfa/src/fxfa/parser/xfa_parser_imp_embeddertest.cpp",
+    "xfa/fxfa/parser/xfa_parser_imp_embeddertest.cpp",
   ]
   deps = [
     ":pdfium",
diff --git a/fpdfsdk/javascript/JS_Runtime.cpp b/fpdfsdk/javascript/JS_Runtime.cpp
index d56a8ac..208348f 100644
--- a/fpdfsdk/javascript/JS_Runtime.cpp
+++ b/fpdfsdk/javascript/JS_Runtime.cpp
@@ -30,7 +30,7 @@
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h"
-#include "xfa/src/fxjse/value.h"
+#include "xfa/fxjse/value.h"
 #endif  // PDF_ENABLE_XFA
 
 // static
diff --git a/pdfium.gyp b/pdfium.gyp
index d1ace61..a7cb00d 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -836,8 +836,8 @@
       'conditions': [
         ['pdf_enable_xfa==1', {
           'sources': [
-            'xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp',
-            'xfa/src/fxfa/parser/xfa_utils_imp_unittest.cpp',
+            'xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp',
+            'xfa/fxfa/parser/xfa_utils_imp_unittest.cpp',
           ],
         }],
       ],
@@ -876,7 +876,7 @@
       'conditions': [
         ['pdf_enable_xfa==1', {
           'sources': [
-            'xfa/src/fxfa/parser/xfa_parser_imp_embeddertest.cpp',
+            'xfa/fxfa/parser/xfa_parser_imp_embeddertest.cpp',
           ],
         }],
         ['pdf_enable_v8==1', {
diff --git a/testing/libfuzzer/pdf_fm2js_fuzzer.cc b/testing/libfuzzer/pdf_fm2js_fuzzer.cc
index 6a1b820..acbbf8f 100644
--- a/testing/libfuzzer/pdf_fm2js_fuzzer.cc
+++ b/testing/libfuzzer/pdf_fm2js_fuzzer.cc
@@ -7,7 +7,7 @@
 
 #include "core/include/fxcrt/fx_basic.h"
 #include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fxfa/fm2js/xfa_program.h"
+#include "xfa/fxfa/fm2js/xfa_program.h"
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   if (size > std::numeric_limits<FX_STRSIZE>::max())
diff --git a/testing/libfuzzer/pdf_xml_fuzzer.cc b/testing/libfuzzer/pdf_xml_fuzzer.cc
index bd36f72..50187e6 100644
--- a/testing/libfuzzer/pdf_xml_fuzzer.cc
+++ b/testing/libfuzzer/pdf_xml_fuzzer.cc
@@ -9,8 +9,8 @@
 
 #include "core/include/fxcrt/fx_basic.h"
 #include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_parser_imp.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_parser_imp.h"
 
 namespace {
 
diff --git a/xfa.gyp b/xfa.gyp
index 885663e..39de1be 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -106,544 +106,544 @@
         "xfa/include/fxfa/fxfa_widget.h",
         "xfa/include/fxgraphics/fx_graphics.h",
         "xfa/include/fxjse/fxjse.h",
-        "xfa/src/fde/css/fde_css.h",
-        "xfa/src/fde/css/fde_csscache.cpp",
-        "xfa/src/fde/css/fde_csscache.h",
-        "xfa/src/fde/css/fde_cssdatatable.cpp",
-        "xfa/src/fde/css/fde_cssdatatable.h",
-        "xfa/src/fde/css/fde_cssdeclaration.cpp",
-        "xfa/src/fde/css/fde_cssdeclaration.h",
-        "xfa/src/fde/css/fde_cssstyleselector.cpp",
-        "xfa/src/fde/css/fde_cssstyleselector.h",
-        "xfa/src/fde/css/fde_cssstylesheet.cpp",
-        "xfa/src/fde/css/fde_cssstylesheet.h",
-        "xfa/src/fde/css/fde_csssyntax.cpp",
-        "xfa/src/fde/css/fde_csssyntax.h",
-        "xfa/src/fde/fde_brush.h",
-        "xfa/src/fde/fde_devbasic.cpp",
-        "xfa/src/fde/fde_devbasic.h",
-        "xfa/src/fde/fde_renderdevice.h",
-        "xfa/src/fde/fde_gedevice.cpp",
-        "xfa/src/fde/fde_gedevice.h",
-        "xfa/src/fde/fde_geobject.cpp",
-        "xfa/src/fde/fde_geobject.h",
-        "xfa/src/fde/fde_image.h",
-        "xfa/src/fde/fde_iterator.cpp",
-        "xfa/src/fde/fde_iterator.h",
-        "xfa/src/fde/fde_object.cpp",
-        "xfa/src/fde/fde_object.h",
-        "xfa/src/fde/fde_path.h",
-        "xfa/src/fde/fde_pen.h",
-        "xfa/src/fde/fde_render.cpp",
-        "xfa/src/fde/fde_render.h",
-        "xfa/src/fde/tto/fde_textout.cpp",
-        "xfa/src/fde/tto/fde_textout.h",
-        "xfa/src/fde/xml/fde_xml.h",
-        "xfa/src/fde/xml/fde_xml_imp.cpp",
-        "xfa/src/fde/xml/fde_xml_imp.h",
-        "xfa/src/fee/fde_txtedtbuf.cpp",
-        "xfa/src/fee/fde_txtedtbuf.h",
-        "xfa/src/fee/fde_txtedtengine.cpp",
-        "xfa/src/fee/fde_txtedtengine.h",
-        "xfa/src/fee/fde_txtedtpage.cpp",
-        "xfa/src/fee/fde_txtedtpage.h",
-        "xfa/src/fee/fde_txtedtparag.cpp",
-        "xfa/src/fee/fde_txtedtparag.h",
-        "xfa/src/fee/fx_wordbreak/fx_wordbreak.h",
-        "xfa/src/fee/fx_wordbreak/fx_wordbreakdata.cpp",
-        "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.cpp",
-        "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h",
-        "xfa/src/fee/ifde_txtedtbuf.h",
-        "xfa/src/fee/ifde_txtedtengine.h",
-        "xfa/src/fee/ifde_txtedtpage.h",
-        "xfa/src/fgas/crt/fgas_algorithm.cpp",
-        "xfa/src/fgas/crt/fgas_algorithm.h",
-        "xfa/src/fgas/crt/fgas_codepage.cpp",
-        "xfa/src/fgas/crt/fgas_codepage.h",
-        "xfa/src/fgas/crt/fgas_encode.cpp",
-        "xfa/src/fgas/crt/fgas_language.h",
-        "xfa/src/fgas/crt/fgas_memory.cpp",
-        "xfa/src/fgas/crt/fgas_memory.h",
-        "xfa/src/fgas/crt/fgas_stream.cpp",
-        "xfa/src/fgas/crt/fgas_stream.h",
-        "xfa/src/fgas/crt/fgas_system.cpp",
-        "xfa/src/fgas/crt/fgas_system.h",
-        "xfa/src/fgas/crt/fgas_utils.cpp",
-        "xfa/src/fgas/crt/fgas_utils.h",
-        "xfa/src/fgas/font/fgas_font.h",
-        "xfa/src/fgas/font/fgas_fontutils.cpp",
-        "xfa/src/fgas/font/fgas_fontutils.h",
-        "xfa/src/fgas/font/fgas_gefont.cpp",
-        "xfa/src/fgas/font/fgas_gefont.h",
-        "xfa/src/fgas/font/fgas_stdfontmgr.cpp",
-        "xfa/src/fgas/font/fgas_stdfontmgr.h",
-        "xfa/src/fgas/layout/fgas_linebreak.cpp",
-        "xfa/src/fgas/layout/fgas_linebreak.h",
-        "xfa/src/fgas/layout/fgas_rtfbreak.cpp",
-        "xfa/src/fgas/layout/fgas_rtfbreak.h",
-        "xfa/src/fgas/layout/fgas_textbreak.cpp",
-        "xfa/src/fgas/layout/fgas_textbreak.h",
-        "xfa/src/fgas/layout/fgas_unicode.cpp",
-        "xfa/src/fgas/layout/fgas_unicode.h",
-        "xfa/src/fgas/localization/fgas_datetime.cpp",
-        "xfa/src/fgas/localization/fgas_datetime.h",
-        "xfa/src/fgas/localization/fgas_locale.cpp",
-        "xfa/src/fgas/localization/fgas_locale.h",
-        "xfa/src/fgas/localization/fgas_localeimp.h",
-        "xfa/src/fgas/localization/fgas_localemgr.cpp",
-        "xfa/src/fgas/localization/fgas_localemgr.h",
-        "xfa/src/fgas/xml/fgas_sax.h",
-        "xfa/src/fgas/xml/fgas_sax_imp.cpp",
-        "xfa/src/fgas/xml/fgas_sax_imp.h",
-        "xfa/src/fwl/basewidget/fwl_barcodeimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_barcodeimp.h",
-        "xfa/src/fwl/basewidget/fwl_caretimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_caretimp.h",
-        "xfa/src/fwl/basewidget/fwl_checkboximp.cpp",
-        "xfa/src/fwl/basewidget/fwl_checkboximp.h",
-        "xfa/src/fwl/basewidget/fwl_comboboximp.cpp",
-        "xfa/src/fwl/basewidget/fwl_comboboximp.h",
-        "xfa/src/fwl/basewidget/fwl_datetimepickerimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_datetimepickerimp.h",
-        "xfa/src/fwl/basewidget/fwl_editimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_editimp.h",
-        "xfa/src/fwl/basewidget/fwl_formproxyimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_formproxyimp.h",
-        "xfa/src/fwl/basewidget/fwl_listboximp.cpp",
-        "xfa/src/fwl/basewidget/fwl_listboximp.h",
-        "xfa/src/fwl/basewidget/fwl_monthcalendarimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_monthcalendarimp.h",
-        "xfa/src/fwl/basewidget/fwl_pictureboximp.cpp",
-        "xfa/src/fwl/basewidget/fwl_pictureboximp.h",
-        "xfa/src/fwl/basewidget/fwl_pushbuttonimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_pushbuttonimp.h",
-        "xfa/src/fwl/basewidget/fwl_scrollbarimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_scrollbarimp.h",
-        "xfa/src/fwl/basewidget/fwl_spinbuttonimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_spinbuttonimp.h",
-        "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.cpp",
-        "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h",
-        "xfa/src/fwl/basewidget/fxmath_barcodeimp.cpp",
-        "xfa/src/fwl/basewidget/fxmath_barcodeimp.h",
-        "xfa/src/fwl/core/fwl_appimp.cpp",
-        "xfa/src/fwl/core/fwl_appimp.h",
-        "xfa/src/fwl/core/fwl_contentimp.cpp",
-        "xfa/src/fwl/core/fwl_contentimp.h",
-        "xfa/src/fwl/core/fwl_formimp.cpp",
-        "xfa/src/fwl/core/fwl_formimp.h",
-        "xfa/src/fwl/core/fwl_gridimp.cpp",
-        "xfa/src/fwl/core/fwl_gridimp.h",
-        "xfa/src/fwl/core/fwl_noteimp.cpp",
-        "xfa/src/fwl/core/fwl_noteimp.h",
-        "xfa/src/fwl/core/fwl_panelimp.cpp",
-        "xfa/src/fwl/core/fwl_panelimp.h",
-        "xfa/src/fwl/core/fwl_sdadapterimp.cpp",
-        "xfa/src/fwl/core/fwl_targetimp.cpp",
-        "xfa/src/fwl/core/fwl_targetimp.h",
-        "xfa/src/fwl/core/fwl_threadimp.cpp",
-        "xfa/src/fwl/core/fwl_threadimp.h",
-        "xfa/src/fwl/core/fwl_timerimp.cpp",
-        "xfa/src/fwl/core/fwl_widgetimp.cpp",
-        "xfa/src/fwl/core/fwl_widgetimp.h",
-        "xfa/src/fwl/core/fwl_widgetmgrimp.cpp",
-        "xfa/src/fwl/core/fwl_widgetmgrimp.h",
-        "xfa/src/fwl/lightwidget/app.cpp",
-        "xfa/src/fwl/lightwidget/barcode.cpp",
-        "xfa/src/fwl/lightwidget/caret.cpp",
-        "xfa/src/fwl/lightwidget/checkbox.cpp",
-        "xfa/src/fwl/lightwidget/combobox.cpp",
-        "xfa/src/fwl/lightwidget/datetimepicker.cpp",
-        "xfa/src/fwl/lightwidget/edit.cpp",
-        "xfa/src/fwl/lightwidget/listbox.cpp",
-        "xfa/src/fwl/lightwidget/picturebox.cpp",
-        "xfa/src/fwl/lightwidget/pushbutton.cpp",
-        "xfa/src/fwl/lightwidget/scrollbar.cpp",
-        "xfa/src/fwl/lightwidget/theme.cpp",
-        "xfa/src/fwl/lightwidget/tooltipctrl.cpp",
-        "xfa/src/fwl/lightwidget/widget.cpp",
-        "xfa/src/fwl/theme/barcodetp.cpp",
-        "xfa/src/fwl/theme/carettp.cpp",
-        "xfa/src/fwl/theme/checkboxtp.cpp",
-        "xfa/src/fwl/theme/comboboxtp.cpp",
-        "xfa/src/fwl/theme/datetimepickertp.cpp",
-        "xfa/src/fwl/theme/edittp.cpp",
-        "xfa/src/fwl/theme/formtp.cpp",
-        "xfa/src/fwl/theme/listboxtp.cpp",
-        "xfa/src/fwl/theme/monthcalendartp.cpp",
-        "xfa/src/fwl/theme/pictureboxtp.cpp",
-        "xfa/src/fwl/theme/pushbuttontp.cpp",
-        "xfa/src/fwl/theme/scrollbartp.cpp",
-        "xfa/src/fwl/theme/widgettp.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonBitArray.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonBitSource.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonByteArray.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonECI.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
-        "xfa/src/fxbarcode/common/BC_CommonBitArray.h",
-        "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h",
-        "xfa/src/fxbarcode/common/BC_CommonBitSource.h",
-        "xfa/src/fxbarcode/common/BC_CommonByteArray.h",
-        "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h",
-        "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h",
-        "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h",
-        "xfa/src/fxbarcode/common/BC_CommonECI.h",
-        "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h",
-        "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp",
-        "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h",
-        "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp",
-        "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h",
-        "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h",
-        "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp",
-        "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h",
-        "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h",
-        "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h",
-        "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h",
-        "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h",
-        "xfa/src/fxbarcode/datamatrix/BC_Encoder.h",
-        "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp",
-        "xfa/src/fxbarcode/oned/BC_OneDimReader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp",
-        "xfa/src/fxbarcode/oned/BC_OneDReader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp",
-        "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h",
-        "xfa/src/fxbarcode/oned/BC_OneDimReader.h",
-        "xfa/src/fxbarcode/oned/BC_OneDimWriter.h",
-        "xfa/src/fxbarcode/oned/BC_OneDReader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h",
-        "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h",
-        "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoder.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRDetector.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h",
-        "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h",
-        "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp",
-        "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h",
-        "xfa/src/fxbarcode/BC_BarCode.cpp",
-        "xfa/src/fxbarcode/BC_Binarizer.cpp",
-        "xfa/src/fxbarcode/BC_BinaryBitmap.cpp",
-        "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp",
-        "xfa/src/fxbarcode/BC_Dimension.cpp",
-        "xfa/src/fxbarcode/BC_Library.cpp",
-        "xfa/src/fxbarcode/BC_LuminanceSource.cpp",
-        "xfa/src/fxbarcode/BC_Reader.cpp",
-        "xfa/src/fxbarcode/BC_ResultPoint.cpp",
-        "xfa/src/fxbarcode/BC_TwoDimWriter.cpp",
-        "xfa/src/fxbarcode/BC_UtilCodingConvert.cpp",
-        "xfa/src/fxbarcode/BC_UtilRSS.cpp",
-        "xfa/src/fxbarcode/BC_Utils.cpp",
-        "xfa/src/fxbarcode/BC_Writer.cpp",
-        "xfa/src/fxbarcode/BC_Binarizer.h",
-        "xfa/src/fxbarcode/BC_BinaryBitmap.h",
-        "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h",
-        "xfa/src/fxbarcode/BC_DecoderResult.h",
-        "xfa/src/fxbarcode/BC_Dimension.h",
-        "xfa/src/fxbarcode/BC_LuminanceSource.h",
-        "xfa/src/fxbarcode/BC_Reader.h",
-        "xfa/src/fxbarcode/BC_ResultPoint.h",
-        "xfa/src/fxbarcode/BC_TwoDimWriter.h",
-        "xfa/src/fxbarcode/BC_UtilCodingConvert.h",
-        "xfa/src/fxbarcode/BC_UtilRSS.h",
-        "xfa/src/fxbarcode/BC_Writer.h",
-        "xfa/src/fxbarcode/utils.h",
-        "xfa/src/fxfa/app/xfa_checksum.cpp",
-        "xfa/src/fxfa/app/xfa_checksum.h",
-        "xfa/src/fxfa/app/xfa_ffapp.cpp",
-        "xfa/src/fxfa/app/xfa_ffapp.h",
-        "xfa/src/fxfa/app/xfa_ffbarcode.cpp",
-        "xfa/src/fxfa/app/xfa_ffbarcode.h",
-        "xfa/src/fxfa/app/xfa_ffcheckbutton.cpp",
-        "xfa/src/fxfa/app/xfa_ffcheckbutton.h",
-        "xfa/src/fxfa/app/xfa_ffchoicelist.cpp",
-        "xfa/src/fxfa/app/xfa_ffchoicelist.h",
-        "xfa/src/fxfa/app/xfa_ffdoc.cpp",
-        "xfa/src/fxfa/app/xfa_ffdoc.h",
-        "xfa/src/fxfa/app/xfa_ffdochandler.cpp",
-        "xfa/src/fxfa/app/xfa_ffdochandler.h",
-        "xfa/src/fxfa/app/xfa_ffdocview.cpp",
-        "xfa/src/fxfa/app/xfa_ffdocview.h",
-        "xfa/src/fxfa/app/xfa_ffdraw.cpp",
-        "xfa/src/fxfa/app/xfa_ffdraw.h",
-        "xfa/src/fxfa/app/xfa_ffexclgroup.cpp",
-        "xfa/src/fxfa/app/xfa_ffexclgroup.h",
-        "xfa/src/fxfa/app/xfa_fffield.cpp",
-        "xfa/src/fxfa/app/xfa_fffield.h",
-        "xfa/src/fxfa/app/xfa_ffimage.cpp",
-        "xfa/src/fxfa/app/xfa_ffimage.h",
-        "xfa/src/fxfa/app/xfa_ffimageedit.cpp",
-        "xfa/src/fxfa/app/xfa_ffimageedit.h",
-        "xfa/src/fxfa/app/xfa_ffnotify.cpp",
-        "xfa/src/fxfa/app/xfa_ffnotify.h",
-        "xfa/src/fxfa/app/xfa_ffpageview.cpp",
-        "xfa/src/fxfa/app/xfa_ffpageview.h",
-        "xfa/src/fxfa/app/xfa_ffpath.cpp",
-        "xfa/src/fxfa/app/xfa_ffpath.h",
-        "xfa/src/fxfa/app/xfa_ffpushbutton.cpp",
-        "xfa/src/fxfa/app/xfa_ffpushbutton.h",
-        "xfa/src/fxfa/app/xfa_ffsignature.cpp",
-        "xfa/src/fxfa/app/xfa_ffsignature.h",
-        "xfa/src/fxfa/app/xfa_ffsubform.cpp",
-        "xfa/src/fxfa/app/xfa_ffsubform.h",
-        "xfa/src/fxfa/app/xfa_fftext.cpp",
-        "xfa/src/fxfa/app/xfa_fftext.h",
-        "xfa/src/fxfa/app/xfa_fftextedit.cpp",
-        "xfa/src/fxfa/app/xfa_fftextedit.h",
-        "xfa/src/fxfa/app/xfa_ffwidget.cpp",
-        "xfa/src/fxfa/app/xfa_ffwidget.h",
-        "xfa/src/fxfa/app/xfa_ffwidgetacc.cpp",
-        "xfa/src/fxfa/app/xfa_ffwidgetacc.h",
-        "xfa/src/fxfa/app/xfa_ffwidgethandler.cpp",
-        "xfa/src/fxfa/app/xfa_ffwidgethandler.h",
-        "xfa/src/fxfa/app/xfa_fontmgr.cpp",
-        "xfa/src/fxfa/app/xfa_fontmgr.h",
-        "xfa/src/fxfa/app/xfa_fwladapter.cpp",
-        "xfa/src/fxfa/app/xfa_fwladapter.h",
-        "xfa/src/fxfa/app/xfa_fwltheme.cpp",
-        "xfa/src/fxfa/app/xfa_fwltheme.h",
-        "xfa/src/fxfa/app/xfa_rendercontext.cpp",
-        "xfa/src/fxfa/app/xfa_rendercontext.h",
-        "xfa/src/fxfa/app/xfa_textlayout.cpp",
-        "xfa/src/fxfa/app/xfa_textlayout.h",
-        "xfa/src/fxfa/fm2js/xfa_error.cpp",
-        "xfa/src/fxfa/fm2js/xfa_error.h",
-        "xfa/src/fxfa/fm2js/xfa_expression.cpp",
-        "xfa/src/fxfa/fm2js/xfa_expression.h",
-        "xfa/src/fxfa/fm2js/xfa_fm2jsapi.cpp",
-        "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h",
-        "xfa/src/fxfa/fm2js/xfa_fm2jscontext.cpp",
-        "xfa/src/fxfa/fm2js/xfa_fm2jscontext.h",
-        "xfa/src/fxfa/fm2js/xfa_fmparse.cpp",
-        "xfa/src/fxfa/fm2js/xfa_fmparse.h",
-        "xfa/src/fxfa/fm2js/xfa_lexer.cpp",
-        "xfa/src/fxfa/fm2js/xfa_lexer.h",
-        "xfa/src/fxfa/fm2js/xfa_program.cpp",
-        "xfa/src/fxfa/fm2js/xfa_program.h",
-        "xfa/src/fxfa/fm2js/xfa_simpleexpression.cpp",
-        "xfa/src/fxfa/fm2js/xfa_simpleexpression.h",
-        "xfa/src/fxfa/parser/xfa_basic_data.cpp",
-        "xfa/src/fxfa/parser/xfa_basic_data.h",
-        "xfa/src/fxfa/parser/xfa_basic_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_basic_imp.h",
-        "xfa/src/fxfa/parser/xfa_docdata.h",
-        "xfa/src/fxfa/parser/xfa_doclayout.h",
-        "xfa/src/fxfa/parser/xfa_document.h",
-        "xfa/src/fxfa/parser/xfa_document_datadescription_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_document_datadescription_imp.h",
-        "xfa/src/fxfa/parser/xfa_document_datamerger_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_document_datamerger_imp.h",
-        "xfa/src/fxfa/parser/xfa_document_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_document_layout_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_document_layout_imp.h",
-        "xfa/src/fxfa/parser/xfa_document_serialize.cpp",
-        "xfa/src/fxfa/parser/xfa_document_serialize.h",
-        "xfa/src/fxfa/parser/xfa_layout_appadapter.cpp",
-        "xfa/src/fxfa/parser/xfa_layout_appadapter.h",
-        "xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp",
-        "xfa/src/fxfa/parser/xfa_layout_itemlayout.h",
-        "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.cpp",
-        "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h",
-        "xfa/src/fxfa/parser/xfa_locale.cpp",
-        "xfa/src/fxfa/parser/xfa_locale.h",
-        "xfa/src/fxfa/parser/xfa_localemgr.cpp",
-        "xfa/src/fxfa/parser/xfa_localemgr.h",
-        "xfa/src/fxfa/parser/xfa_localevalue.cpp",
-        "xfa/src/fxfa/parser/xfa_localevalue.h",
-        "xfa/src/fxfa/parser/xfa_object.h",
-        "xfa/src/fxfa/parser/xfa_objectacc_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_object_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_parser.h",
-        "xfa/src/fxfa/parser/xfa_parser_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_parser_imp.h",
-        "xfa/src/fxfa/parser/xfa_script.h",
-        "xfa/src/fxfa/parser/xfa_script_datawindow.cpp",
-        "xfa/src/fxfa/parser/xfa_script_datawindow.h",
-        "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.cpp",
-        "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h",
-        "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.cpp",
-        "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h",
-        "xfa/src/fxfa/parser/xfa_script_imp.cpp",
-        "xfa/src/fxfa/parser/xfa_script_imp.h",
-        "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.cpp",
-        "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h",
-        "xfa/src/fxfa/parser/xfa_script_logpseudomodel.cpp",
-        "xfa/src/fxfa/parser/xfa_script_logpseudomodel.h",
-        "xfa/src/fxfa/parser/xfa_script_nodehelper.cpp",
-        "xfa/src/fxfa/parser/xfa_script_nodehelper.h",
-        "xfa/src/fxfa/parser/xfa_script_resolveprocessor.cpp",
-        "xfa/src/fxfa/parser/xfa_script_resolveprocessor.h",
-        "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.cpp",
-        "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h",
-        "xfa/src/fxfa/parser/xfa_utils.h",
-        "xfa/src/fxfa/parser/xfa_utils_imp.cpp",
-        "xfa/src/fxgraphics/fx_graphics.cpp",
-        "xfa/src/fxgraphics/fx_path_generator.cpp",
-        "xfa/src/fxgraphics/fx_path_generator.h",
-        "xfa/src/fxgraphics/pre.h",
+        "xfa/fde/css/fde_css.h",
+        "xfa/fde/css/fde_csscache.cpp",
+        "xfa/fde/css/fde_csscache.h",
+        "xfa/fde/css/fde_cssdatatable.cpp",
+        "xfa/fde/css/fde_cssdatatable.h",
+        "xfa/fde/css/fde_cssdeclaration.cpp",
+        "xfa/fde/css/fde_cssdeclaration.h",
+        "xfa/fde/css/fde_cssstyleselector.cpp",
+        "xfa/fde/css/fde_cssstyleselector.h",
+        "xfa/fde/css/fde_cssstylesheet.cpp",
+        "xfa/fde/css/fde_cssstylesheet.h",
+        "xfa/fde/css/fde_csssyntax.cpp",
+        "xfa/fde/css/fde_csssyntax.h",
+        "xfa/fde/fde_brush.h",
+        "xfa/fde/fde_devbasic.cpp",
+        "xfa/fde/fde_devbasic.h",
+        "xfa/fde/fde_renderdevice.h",
+        "xfa/fde/fde_gedevice.cpp",
+        "xfa/fde/fde_gedevice.h",
+        "xfa/fde/fde_geobject.cpp",
+        "xfa/fde/fde_geobject.h",
+        "xfa/fde/fde_image.h",
+        "xfa/fde/fde_iterator.cpp",
+        "xfa/fde/fde_iterator.h",
+        "xfa/fde/fde_object.cpp",
+        "xfa/fde/fde_object.h",
+        "xfa/fde/fde_path.h",
+        "xfa/fde/fde_pen.h",
+        "xfa/fde/fde_render.cpp",
+        "xfa/fde/fde_render.h",
+        "xfa/fde/tto/fde_textout.cpp",
+        "xfa/fde/tto/fde_textout.h",
+        "xfa/fde/xml/fde_xml.h",
+        "xfa/fde/xml/fde_xml_imp.cpp",
+        "xfa/fde/xml/fde_xml_imp.h",
+        "xfa/fee/fde_txtedtbuf.cpp",
+        "xfa/fee/fde_txtedtbuf.h",
+        "xfa/fee/fde_txtedtengine.cpp",
+        "xfa/fee/fde_txtedtengine.h",
+        "xfa/fee/fde_txtedtpage.cpp",
+        "xfa/fee/fde_txtedtpage.h",
+        "xfa/fee/fde_txtedtparag.cpp",
+        "xfa/fee/fde_txtedtparag.h",
+        "xfa/fee/fx_wordbreak/fx_wordbreak.h",
+        "xfa/fee/fx_wordbreak/fx_wordbreakdata.cpp",
+        "xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp",
+        "xfa/fee/fx_wordbreak/fx_wordbreak_impl.h",
+        "xfa/fee/ifde_txtedtbuf.h",
+        "xfa/fee/ifde_txtedtengine.h",
+        "xfa/fee/ifde_txtedtpage.h",
+        "xfa/fgas/crt/fgas_algorithm.cpp",
+        "xfa/fgas/crt/fgas_algorithm.h",
+        "xfa/fgas/crt/fgas_codepage.cpp",
+        "xfa/fgas/crt/fgas_codepage.h",
+        "xfa/fgas/crt/fgas_encode.cpp",
+        "xfa/fgas/crt/fgas_language.h",
+        "xfa/fgas/crt/fgas_memory.cpp",
+        "xfa/fgas/crt/fgas_memory.h",
+        "xfa/fgas/crt/fgas_stream.cpp",
+        "xfa/fgas/crt/fgas_stream.h",
+        "xfa/fgas/crt/fgas_system.cpp",
+        "xfa/fgas/crt/fgas_system.h",
+        "xfa/fgas/crt/fgas_utils.cpp",
+        "xfa/fgas/crt/fgas_utils.h",
+        "xfa/fgas/font/fgas_font.h",
+        "xfa/fgas/font/fgas_fontutils.cpp",
+        "xfa/fgas/font/fgas_fontutils.h",
+        "xfa/fgas/font/fgas_gefont.cpp",
+        "xfa/fgas/font/fgas_gefont.h",
+        "xfa/fgas/font/fgas_stdfontmgr.cpp",
+        "xfa/fgas/font/fgas_stdfontmgr.h",
+        "xfa/fgas/layout/fgas_linebreak.cpp",
+        "xfa/fgas/layout/fgas_linebreak.h",
+        "xfa/fgas/layout/fgas_rtfbreak.cpp",
+        "xfa/fgas/layout/fgas_rtfbreak.h",
+        "xfa/fgas/layout/fgas_textbreak.cpp",
+        "xfa/fgas/layout/fgas_textbreak.h",
+        "xfa/fgas/layout/fgas_unicode.cpp",
+        "xfa/fgas/layout/fgas_unicode.h",
+        "xfa/fgas/localization/fgas_datetime.cpp",
+        "xfa/fgas/localization/fgas_datetime.h",
+        "xfa/fgas/localization/fgas_locale.cpp",
+        "xfa/fgas/localization/fgas_locale.h",
+        "xfa/fgas/localization/fgas_localeimp.h",
+        "xfa/fgas/localization/fgas_localemgr.cpp",
+        "xfa/fgas/localization/fgas_localemgr.h",
+        "xfa/fgas/xml/fgas_sax.h",
+        "xfa/fgas/xml/fgas_sax_imp.cpp",
+        "xfa/fgas/xml/fgas_sax_imp.h",
+        "xfa/fwl/basewidget/fwl_barcodeimp.cpp",
+        "xfa/fwl/basewidget/fwl_barcodeimp.h",
+        "xfa/fwl/basewidget/fwl_caretimp.cpp",
+        "xfa/fwl/basewidget/fwl_caretimp.h",
+        "xfa/fwl/basewidget/fwl_checkboximp.cpp",
+        "xfa/fwl/basewidget/fwl_checkboximp.h",
+        "xfa/fwl/basewidget/fwl_comboboximp.cpp",
+        "xfa/fwl/basewidget/fwl_comboboximp.h",
+        "xfa/fwl/basewidget/fwl_datetimepickerimp.cpp",
+        "xfa/fwl/basewidget/fwl_datetimepickerimp.h",
+        "xfa/fwl/basewidget/fwl_editimp.cpp",
+        "xfa/fwl/basewidget/fwl_editimp.h",
+        "xfa/fwl/basewidget/fwl_formproxyimp.cpp",
+        "xfa/fwl/basewidget/fwl_formproxyimp.h",
+        "xfa/fwl/basewidget/fwl_listboximp.cpp",
+        "xfa/fwl/basewidget/fwl_listboximp.h",
+        "xfa/fwl/basewidget/fwl_monthcalendarimp.cpp",
+        "xfa/fwl/basewidget/fwl_monthcalendarimp.h",
+        "xfa/fwl/basewidget/fwl_pictureboximp.cpp",
+        "xfa/fwl/basewidget/fwl_pictureboximp.h",
+        "xfa/fwl/basewidget/fwl_pushbuttonimp.cpp",
+        "xfa/fwl/basewidget/fwl_pushbuttonimp.h",
+        "xfa/fwl/basewidget/fwl_scrollbarimp.cpp",
+        "xfa/fwl/basewidget/fwl_scrollbarimp.h",
+        "xfa/fwl/basewidget/fwl_spinbuttonimp.cpp",
+        "xfa/fwl/basewidget/fwl_spinbuttonimp.h",
+        "xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp",
+        "xfa/fwl/basewidget/fwl_tooltipctrlimp.h",
+        "xfa/fwl/basewidget/fxmath_barcodeimp.cpp",
+        "xfa/fwl/basewidget/fxmath_barcodeimp.h",
+        "xfa/fwl/core/fwl_appimp.cpp",
+        "xfa/fwl/core/fwl_appimp.h",
+        "xfa/fwl/core/fwl_contentimp.cpp",
+        "xfa/fwl/core/fwl_contentimp.h",
+        "xfa/fwl/core/fwl_formimp.cpp",
+        "xfa/fwl/core/fwl_formimp.h",
+        "xfa/fwl/core/fwl_gridimp.cpp",
+        "xfa/fwl/core/fwl_gridimp.h",
+        "xfa/fwl/core/fwl_noteimp.cpp",
+        "xfa/fwl/core/fwl_noteimp.h",
+        "xfa/fwl/core/fwl_panelimp.cpp",
+        "xfa/fwl/core/fwl_panelimp.h",
+        "xfa/fwl/core/fwl_sdadapterimp.cpp",
+        "xfa/fwl/core/fwl_targetimp.cpp",
+        "xfa/fwl/core/fwl_targetimp.h",
+        "xfa/fwl/core/fwl_threadimp.cpp",
+        "xfa/fwl/core/fwl_threadimp.h",
+        "xfa/fwl/core/fwl_timerimp.cpp",
+        "xfa/fwl/core/fwl_widgetimp.cpp",
+        "xfa/fwl/core/fwl_widgetimp.h",
+        "xfa/fwl/core/fwl_widgetmgrimp.cpp",
+        "xfa/fwl/core/fwl_widgetmgrimp.h",
+        "xfa/fwl/lightwidget/app.cpp",
+        "xfa/fwl/lightwidget/barcode.cpp",
+        "xfa/fwl/lightwidget/caret.cpp",
+        "xfa/fwl/lightwidget/checkbox.cpp",
+        "xfa/fwl/lightwidget/combobox.cpp",
+        "xfa/fwl/lightwidget/datetimepicker.cpp",
+        "xfa/fwl/lightwidget/edit.cpp",
+        "xfa/fwl/lightwidget/listbox.cpp",
+        "xfa/fwl/lightwidget/picturebox.cpp",
+        "xfa/fwl/lightwidget/pushbutton.cpp",
+        "xfa/fwl/lightwidget/scrollbar.cpp",
+        "xfa/fwl/lightwidget/theme.cpp",
+        "xfa/fwl/lightwidget/tooltipctrl.cpp",
+        "xfa/fwl/lightwidget/widget.cpp",
+        "xfa/fwl/theme/barcodetp.cpp",
+        "xfa/fwl/theme/carettp.cpp",
+        "xfa/fwl/theme/checkboxtp.cpp",
+        "xfa/fwl/theme/comboboxtp.cpp",
+        "xfa/fwl/theme/datetimepickertp.cpp",
+        "xfa/fwl/theme/edittp.cpp",
+        "xfa/fwl/theme/formtp.cpp",
+        "xfa/fwl/theme/listboxtp.cpp",
+        "xfa/fwl/theme/monthcalendartp.cpp",
+        "xfa/fwl/theme/pictureboxtp.cpp",
+        "xfa/fwl/theme/pushbuttontp.cpp",
+        "xfa/fwl/theme/scrollbartp.cpp",
+        "xfa/fwl/theme/widgettp.cpp",
+        "xfa/fxbarcode/common/BC_CommonBitArray.cpp",
+        "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp",
+        "xfa/fxbarcode/common/BC_CommonBitSource.cpp",
+        "xfa/fxbarcode/common/BC_CommonByteArray.cpp",
+        "xfa/fxbarcode/common/BC_CommonByteMatrix.cpp",
+        "xfa/fxbarcode/common/BC_CommonCharacterSetECI.cpp",
+        "xfa/fxbarcode/common/BC_CommonDecoderResult.cpp",
+        "xfa/fxbarcode/common/BC_CommonECI.cpp",
+        "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
+        "xfa/fxbarcode/common/BC_CommonBitArray.h",
+        "xfa/fxbarcode/common/BC_CommonBitMatrix.h",
+        "xfa/fxbarcode/common/BC_CommonBitSource.h",
+        "xfa/fxbarcode/common/BC_CommonByteArray.h",
+        "xfa/fxbarcode/common/BC_CommonByteMatrix.h",
+        "xfa/fxbarcode/common/BC_CommonCharacterSetECI.h",
+        "xfa/fxbarcode/common/BC_CommonDecoderResult.h",
+        "xfa/fxbarcode/common/BC_CommonECI.h",
+        "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h",
+        "xfa/fxbarcode/common/BC_WhiteRectangleDetector.cpp",
+        "xfa/fxbarcode/common/BC_WhiteRectangleDetector.h",
+        "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp",
+        "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h",
+        "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h",
+        "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h",
+        "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp",
+        "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp",
+        "xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp",
+        "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp",
+        "xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp",
+        "xfa/fxbarcode/datamatrix/BC_Encoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp",
+        "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h",
+        "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h",
+        "xfa/fxbarcode/datamatrix/BC_C40Encoder.h",
+        "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h",
+        "xfa/fxbarcode/datamatrix/BC_EncoderContext.h",
+        "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h",
+        "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h",
+        "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h",
+        "xfa/fxbarcode/datamatrix/BC_TextEncoder.h",
+        "xfa/fxbarcode/datamatrix/BC_X12Encoder.h",
+        "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h",
+        "xfa/fxbarcode/datamatrix/BC_Encoder.h",
+        "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h",
+        "xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp",
+        "xfa/fxbarcode/oned/BC_OnedEAN13Reader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp",
+        "xfa/fxbarcode/oned/BC_OnedEAN8Reader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp",
+        "xfa/fxbarcode/oned/BC_OneDimReader.cpp",
+        "xfa/fxbarcode/oned/BC_OneDimWriter.cpp",
+        "xfa/fxbarcode/oned/BC_OneDReader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedUPCAReader.cpp",
+        "xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp",
+        "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h",
+        "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h",
+        "xfa/fxbarcode/oned/BC_OnedCode128Reader.h",
+        "xfa/fxbarcode/oned/BC_OnedCode128Writer.h",
+        "xfa/fxbarcode/oned/BC_OnedCode39Reader.h",
+        "xfa/fxbarcode/oned/BC_OnedCode39Writer.h",
+        "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h",
+        "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h",
+        "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h",
+        "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h",
+        "xfa/fxbarcode/oned/BC_OneDimReader.h",
+        "xfa/fxbarcode/oned/BC_OneDimWriter.h",
+        "xfa/fxbarcode/oned/BC_OneDReader.h",
+        "xfa/fxbarcode/oned/BC_OnedUPCAReader.h",
+        "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Common.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Detector.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Dimensions.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp",
+        "xfa/fxbarcode/pdf417/BC_PDF417.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Common.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Detector.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Reader.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h",
+        "xfa/fxbarcode/pdf417/BC_PDF417Writer.h",
+        "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoder.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCodeReader.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRDataBlock.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRDataMask.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRDetector.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRDetectorResult.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRFinderPattern.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRGridSampler.cpp",
+        "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h",
+        "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h",
+        "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoder.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h",
+        "xfa/fxbarcode/qrcode/BC_QRCodeReader.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderECB.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderMode.h",
+        "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h",
+        "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h",
+        "xfa/fxbarcode/qrcode/BC_QRDataBlock.h",
+        "xfa/fxbarcode/qrcode/BC_QRDataMask.h",
+        "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h",
+        "xfa/fxbarcode/qrcode/BC_QRDetector.h",
+        "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h",
+        "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h",
+        "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h",
+        "xfa/fxbarcode/qrcode/BC_QRGridSampler.h",
+        "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp",
+        "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h",
+        "xfa/fxbarcode/BC_BarCode.cpp",
+        "xfa/fxbarcode/BC_Binarizer.cpp",
+        "xfa/fxbarcode/BC_BinaryBitmap.cpp",
+        "xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp",
+        "xfa/fxbarcode/BC_Dimension.cpp",
+        "xfa/fxbarcode/BC_Library.cpp",
+        "xfa/fxbarcode/BC_LuminanceSource.cpp",
+        "xfa/fxbarcode/BC_Reader.cpp",
+        "xfa/fxbarcode/BC_ResultPoint.cpp",
+        "xfa/fxbarcode/BC_TwoDimWriter.cpp",
+        "xfa/fxbarcode/BC_UtilCodingConvert.cpp",
+        "xfa/fxbarcode/BC_UtilRSS.cpp",
+        "xfa/fxbarcode/BC_Utils.cpp",
+        "xfa/fxbarcode/BC_Writer.cpp",
+        "xfa/fxbarcode/BC_Binarizer.h",
+        "xfa/fxbarcode/BC_BinaryBitmap.h",
+        "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h",
+        "xfa/fxbarcode/BC_DecoderResult.h",
+        "xfa/fxbarcode/BC_Dimension.h",
+        "xfa/fxbarcode/BC_LuminanceSource.h",
+        "xfa/fxbarcode/BC_Reader.h",
+        "xfa/fxbarcode/BC_ResultPoint.h",
+        "xfa/fxbarcode/BC_TwoDimWriter.h",
+        "xfa/fxbarcode/BC_UtilCodingConvert.h",
+        "xfa/fxbarcode/BC_UtilRSS.h",
+        "xfa/fxbarcode/BC_Writer.h",
+        "xfa/fxbarcode/utils.h",
+        "xfa/fxfa/app/xfa_checksum.cpp",
+        "xfa/fxfa/app/xfa_checksum.h",
+        "xfa/fxfa/app/xfa_ffapp.cpp",
+        "xfa/fxfa/app/xfa_ffapp.h",
+        "xfa/fxfa/app/xfa_ffbarcode.cpp",
+        "xfa/fxfa/app/xfa_ffbarcode.h",
+        "xfa/fxfa/app/xfa_ffcheckbutton.cpp",
+        "xfa/fxfa/app/xfa_ffcheckbutton.h",
+        "xfa/fxfa/app/xfa_ffchoicelist.cpp",
+        "xfa/fxfa/app/xfa_ffchoicelist.h",
+        "xfa/fxfa/app/xfa_ffdoc.cpp",
+        "xfa/fxfa/app/xfa_ffdoc.h",
+        "xfa/fxfa/app/xfa_ffdochandler.cpp",
+        "xfa/fxfa/app/xfa_ffdochandler.h",
+        "xfa/fxfa/app/xfa_ffdocview.cpp",
+        "xfa/fxfa/app/xfa_ffdocview.h",
+        "xfa/fxfa/app/xfa_ffdraw.cpp",
+        "xfa/fxfa/app/xfa_ffdraw.h",
+        "xfa/fxfa/app/xfa_ffexclgroup.cpp",
+        "xfa/fxfa/app/xfa_ffexclgroup.h",
+        "xfa/fxfa/app/xfa_fffield.cpp",
+        "xfa/fxfa/app/xfa_fffield.h",
+        "xfa/fxfa/app/xfa_ffimage.cpp",
+        "xfa/fxfa/app/xfa_ffimage.h",
+        "xfa/fxfa/app/xfa_ffimageedit.cpp",
+        "xfa/fxfa/app/xfa_ffimageedit.h",
+        "xfa/fxfa/app/xfa_ffnotify.cpp",
+        "xfa/fxfa/app/xfa_ffnotify.h",
+        "xfa/fxfa/app/xfa_ffpageview.cpp",
+        "xfa/fxfa/app/xfa_ffpageview.h",
+        "xfa/fxfa/app/xfa_ffpath.cpp",
+        "xfa/fxfa/app/xfa_ffpath.h",
+        "xfa/fxfa/app/xfa_ffpushbutton.cpp",
+        "xfa/fxfa/app/xfa_ffpushbutton.h",
+        "xfa/fxfa/app/xfa_ffsignature.cpp",
+        "xfa/fxfa/app/xfa_ffsignature.h",
+        "xfa/fxfa/app/xfa_ffsubform.cpp",
+        "xfa/fxfa/app/xfa_ffsubform.h",
+        "xfa/fxfa/app/xfa_fftext.cpp",
+        "xfa/fxfa/app/xfa_fftext.h",
+        "xfa/fxfa/app/xfa_fftextedit.cpp",
+        "xfa/fxfa/app/xfa_fftextedit.h",
+        "xfa/fxfa/app/xfa_ffwidget.cpp",
+        "xfa/fxfa/app/xfa_ffwidget.h",
+        "xfa/fxfa/app/xfa_ffwidgetacc.cpp",
+        "xfa/fxfa/app/xfa_ffwidgetacc.h",
+        "xfa/fxfa/app/xfa_ffwidgethandler.cpp",
+        "xfa/fxfa/app/xfa_ffwidgethandler.h",
+        "xfa/fxfa/app/xfa_fontmgr.cpp",
+        "xfa/fxfa/app/xfa_fontmgr.h",
+        "xfa/fxfa/app/xfa_fwladapter.cpp",
+        "xfa/fxfa/app/xfa_fwladapter.h",
+        "xfa/fxfa/app/xfa_fwltheme.cpp",
+        "xfa/fxfa/app/xfa_fwltheme.h",
+        "xfa/fxfa/app/xfa_rendercontext.cpp",
+        "xfa/fxfa/app/xfa_rendercontext.h",
+        "xfa/fxfa/app/xfa_textlayout.cpp",
+        "xfa/fxfa/app/xfa_textlayout.h",
+        "xfa/fxfa/fm2js/xfa_error.cpp",
+        "xfa/fxfa/fm2js/xfa_error.h",
+        "xfa/fxfa/fm2js/xfa_expression.cpp",
+        "xfa/fxfa/fm2js/xfa_expression.h",
+        "xfa/fxfa/fm2js/xfa_fm2jsapi.cpp",
+        "xfa/fxfa/fm2js/xfa_fm2jsapi.h",
+        "xfa/fxfa/fm2js/xfa_fm2jscontext.cpp",
+        "xfa/fxfa/fm2js/xfa_fm2jscontext.h",
+        "xfa/fxfa/fm2js/xfa_fmparse.cpp",
+        "xfa/fxfa/fm2js/xfa_fmparse.h",
+        "xfa/fxfa/fm2js/xfa_lexer.cpp",
+        "xfa/fxfa/fm2js/xfa_lexer.h",
+        "xfa/fxfa/fm2js/xfa_program.cpp",
+        "xfa/fxfa/fm2js/xfa_program.h",
+        "xfa/fxfa/fm2js/xfa_simpleexpression.cpp",
+        "xfa/fxfa/fm2js/xfa_simpleexpression.h",
+        "xfa/fxfa/parser/xfa_basic_data.cpp",
+        "xfa/fxfa/parser/xfa_basic_data.h",
+        "xfa/fxfa/parser/xfa_basic_imp.cpp",
+        "xfa/fxfa/parser/xfa_basic_imp.h",
+        "xfa/fxfa/parser/xfa_docdata.h",
+        "xfa/fxfa/parser/xfa_doclayout.h",
+        "xfa/fxfa/parser/xfa_document.h",
+        "xfa/fxfa/parser/xfa_document_datadescription_imp.cpp",
+        "xfa/fxfa/parser/xfa_document_datadescription_imp.h",
+        "xfa/fxfa/parser/xfa_document_datamerger_imp.cpp",
+        "xfa/fxfa/parser/xfa_document_datamerger_imp.h",
+        "xfa/fxfa/parser/xfa_document_imp.cpp",
+        "xfa/fxfa/parser/xfa_document_layout_imp.cpp",
+        "xfa/fxfa/parser/xfa_document_layout_imp.h",
+        "xfa/fxfa/parser/xfa_document_serialize.cpp",
+        "xfa/fxfa/parser/xfa_document_serialize.h",
+        "xfa/fxfa/parser/xfa_layout_appadapter.cpp",
+        "xfa/fxfa/parser/xfa_layout_appadapter.h",
+        "xfa/fxfa/parser/xfa_layout_itemlayout.cpp",
+        "xfa/fxfa/parser/xfa_layout_itemlayout.h",
+        "xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp",
+        "xfa/fxfa/parser/xfa_layout_pagemgr_new.h",
+        "xfa/fxfa/parser/xfa_locale.cpp",
+        "xfa/fxfa/parser/xfa_locale.h",
+        "xfa/fxfa/parser/xfa_localemgr.cpp",
+        "xfa/fxfa/parser/xfa_localemgr.h",
+        "xfa/fxfa/parser/xfa_localevalue.cpp",
+        "xfa/fxfa/parser/xfa_localevalue.h",
+        "xfa/fxfa/parser/xfa_object.h",
+        "xfa/fxfa/parser/xfa_objectacc_imp.cpp",
+        "xfa/fxfa/parser/xfa_object_imp.cpp",
+        "xfa/fxfa/parser/xfa_parser.h",
+        "xfa/fxfa/parser/xfa_parser_imp.cpp",
+        "xfa/fxfa/parser/xfa_parser_imp.h",
+        "xfa/fxfa/parser/xfa_script.h",
+        "xfa/fxfa/parser/xfa_script_datawindow.cpp",
+        "xfa/fxfa/parser/xfa_script_datawindow.h",
+        "xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp",
+        "xfa/fxfa/parser/xfa_script_eventpseudomodel.h",
+        "xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp",
+        "xfa/fxfa/parser/xfa_script_hostpseudomodel.h",
+        "xfa/fxfa/parser/xfa_script_imp.cpp",
+        "xfa/fxfa/parser/xfa_script_imp.h",
+        "xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp",
+        "xfa/fxfa/parser/xfa_script_layoutpseudomodel.h",
+        "xfa/fxfa/parser/xfa_script_logpseudomodel.cpp",
+        "xfa/fxfa/parser/xfa_script_logpseudomodel.h",
+        "xfa/fxfa/parser/xfa_script_nodehelper.cpp",
+        "xfa/fxfa/parser/xfa_script_nodehelper.h",
+        "xfa/fxfa/parser/xfa_script_resolveprocessor.cpp",
+        "xfa/fxfa/parser/xfa_script_resolveprocessor.h",
+        "xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp",
+        "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h",
+        "xfa/fxfa/parser/xfa_utils.h",
+        "xfa/fxfa/parser/xfa_utils_imp.cpp",
+        "xfa/fxgraphics/fx_graphics.cpp",
+        "xfa/fxgraphics/fx_path_generator.cpp",
+        "xfa/fxgraphics/fx_path_generator.h",
+        "xfa/fxgraphics/pre.h",
       ],
       "conditions": [
         ["clang==1" , {
@@ -660,17 +660,17 @@
             '<(DEPTH)/v8/include',
           ],
           'sources': [
-            "xfa/src/fxjse/class.cpp",
-            "xfa/src/fxjse/class.h",
-            "xfa/src/fxjse/context.cpp",
-            "xfa/src/fxjse/context.h",
-            "xfa/src/fxjse/dynprop.cpp",
-            "xfa/src/fxjse/runtime.cpp",
-            "xfa/src/fxjse/runtime.h",
-            "xfa/src/fxjse/scope_inline.h",
-            "xfa/src/fxjse/util_inline.h",
-            "xfa/src/fxjse/value.cpp",
-            "xfa/src/fxjse/value.h"
+            "xfa/fxjse/class.cpp",
+            "xfa/fxjse/class.h",
+            "xfa/fxjse/context.cpp",
+            "xfa/fxjse/context.h",
+            "xfa/fxjse/dynprop.cpp",
+            "xfa/fxjse/runtime.cpp",
+            "xfa/fxjse/runtime.h",
+            "xfa/fxjse/scope_inline.h",
+            "xfa/fxjse/util_inline.h",
+            "xfa/fxjse/value.cpp",
+            "xfa/fxjse/value.h"
           ],
         }],
         ["OS == 'win'", {
diff --git a/xfa/fde/css/fde_css.h b/xfa/fde/css/fde_css.h
new file mode 100644
index 0000000..4c3e253
--- /dev/null
+++ b/xfa/fde/css/fde_css.h
@@ -0,0 +1,1082 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSS_H_
+#define XFA_FDE_CSS_FDE_CSS_H_
+
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fgas/crt/fgas_stream.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+class IFDE_CSSValue;
+class IFDE_CSSValueList;
+class IFDE_CSSDeclaration;
+class IFDE_CSSSelector;
+class IFDE_CSSRule;
+class IFDE_CSSStyleSheet;
+class IFDE_CSSStyleSheetCache;
+class IFDE_CSSSyntaxParser;
+class IFDE_CSSRubyStyle;
+class IFDE_CSSMultiColumnStyle;
+class IFDE_CSSGeneratedContentStyle;
+class IFDE_CSSFontStyle;
+class IFDE_CSSBoundaryStyle;
+class IFDE_CSSPositionStyle;
+class IFDE_CSSParagraphStyle;
+class IFDE_CSSBackgroundStyle;
+class IFDE_CSSListStyle;
+class IFDE_CSSTableStyle;
+class IFDE_CSSVisualStyle;
+class IFDE_CSSComputedStyle;
+class IFDE_CSSTagProvider;
+class IFDE_CSSAccelerator;
+class IFDE_CSSStyleSelector;
+
+enum FDE_CSSVALUETYPE {
+  FDE_CSSVALUETYPE_Primitive = 1,
+  FDE_CSSVALUETYPE_List = 2,
+  FDE_CSSVALUETYPE_Shorthand,
+};
+enum FDE_CSSPRIMITIVETYPE {
+  FDE_CSSPRIMITIVETYPE_Unknown = 0,
+  FDE_CSSPRIMITIVETYPE_Number = 1,
+  FDE_CSSPRIMITIVETYPE_Percent = 2,
+  FDE_CSSPRIMITIVETYPE_EMS = 3,
+  FDE_CSSPRIMITIVETYPE_EXS = 4,
+  FDE_CSSPRIMITIVETYPE_PX = 5,
+  FDE_CSSPRIMITIVETYPE_CM = 6,
+  FDE_CSSPRIMITIVETYPE_MM = 7,
+  FDE_CSSPRIMITIVETYPE_IN = 8,
+  FDE_CSSPRIMITIVETYPE_PT = 9,
+  FDE_CSSPRIMITIVETYPE_PC = 10,
+  FDE_CSSPRIMITIVETYPE_String = 19,
+  FDE_CSSPRIMITIVETYPE_URI = 20,
+  FDE_CSSPRIMITIVETYPE_RGB = 25,
+  FDE_CSSPRIMITIVETYPE_Enum,
+  FDE_CSSPRIMITIVETYPE_Function,
+};
+enum FDE_CSSPROPERTYVALUE {
+  FDE_CSSPROPERTYVALUE_Bolder,
+  FDE_CSSPROPERTYVALUE_LowerLatin,
+  FDE_CSSPROPERTYVALUE_Lowercase,
+  FDE_CSSPROPERTYVALUE_LowerGreek,
+  FDE_CSSPROPERTYVALUE_Sesame,
+  FDE_CSSPROPERTYVALUE_None,
+  FDE_CSSPROPERTYVALUE_NwResize,
+  FDE_CSSPROPERTYVALUE_WResize,
+  FDE_CSSPROPERTYVALUE_Dot,
+  FDE_CSSPROPERTYVALUE_End,
+  FDE_CSSPROPERTYVALUE_Ltr,
+  FDE_CSSPROPERTYVALUE_Pre,
+  FDE_CSSPROPERTYVALUE_Rtl,
+  FDE_CSSPROPERTYVALUE_Sub,
+  FDE_CSSPROPERTYVALUE_Top,
+  FDE_CSSPROPERTYVALUE_Visible,
+  FDE_CSSPROPERTYVALUE_Filled,
+  FDE_CSSPROPERTYVALUE_SwResize,
+  FDE_CSSPROPERTYVALUE_NoRepeat,
+  FDE_CSSPROPERTYVALUE_Default,
+  FDE_CSSPROPERTYVALUE_Transparent,
+  FDE_CSSPROPERTYVALUE_Ridge,
+  FDE_CSSPROPERTYVALUE_Right,
+  FDE_CSSPROPERTYVALUE_HorizontalTb,
+  FDE_CSSPROPERTYVALUE_DistributeLetter,
+  FDE_CSSPROPERTYVALUE_DoubleCircle,
+  FDE_CSSPROPERTYVALUE_Ruby,
+  FDE_CSSPROPERTYVALUE_Collapse,
+  FDE_CSSPROPERTYVALUE_Normal,
+  FDE_CSSPROPERTYVALUE_Avoid,
+  FDE_CSSPROPERTYVALUE_UpperRoman,
+  FDE_CSSPROPERTYVALUE_Auto,
+  FDE_CSSPROPERTYVALUE_Text,
+  FDE_CSSPROPERTYVALUE_XSmall,
+  FDE_CSSPROPERTYVALUE_Thin,
+  FDE_CSSPROPERTYVALUE_Repeat,
+  FDE_CSSPROPERTYVALUE_Small,
+  FDE_CSSPROPERTYVALUE_NeResize,
+  FDE_CSSPROPERTYVALUE_NoContent,
+  FDE_CSSPROPERTYVALUE_Outside,
+  FDE_CSSPROPERTYVALUE_EResize,
+  FDE_CSSPROPERTYVALUE_TableRow,
+  FDE_CSSPROPERTYVALUE_Bottom,
+  FDE_CSSPROPERTYVALUE_Underline,
+  FDE_CSSPROPERTYVALUE_CjkIdeographic,
+  FDE_CSSPROPERTYVALUE_SeResize,
+  FDE_CSSPROPERTYVALUE_Fixed,
+  FDE_CSSPROPERTYVALUE_Double,
+  FDE_CSSPROPERTYVALUE_Solid,
+  FDE_CSSPROPERTYVALUE_RubyBaseGroup,
+  FDE_CSSPROPERTYVALUE_OpenQuote,
+  FDE_CSSPROPERTYVALUE_Lighter,
+  FDE_CSSPROPERTYVALUE_LowerRoman,
+  FDE_CSSPROPERTYVALUE_Strict,
+  FDE_CSSPROPERTYVALUE_TableCaption,
+  FDE_CSSPROPERTYVALUE_Oblique,
+  FDE_CSSPROPERTYVALUE_Decimal,
+  FDE_CSSPROPERTYVALUE_Loose,
+  FDE_CSSPROPERTYVALUE_Hebrew,
+  FDE_CSSPROPERTYVALUE_Hidden,
+  FDE_CSSPROPERTYVALUE_Dashed,
+  FDE_CSSPROPERTYVALUE_Embed,
+  FDE_CSSPROPERTYVALUE_TableRowGroup,
+  FDE_CSSPROPERTYVALUE_TableColumn,
+  FDE_CSSPROPERTYVALUE_Static,
+  FDE_CSSPROPERTYVALUE_Outset,
+  FDE_CSSPROPERTYVALUE_DecimalLeadingZero,
+  FDE_CSSPROPERTYVALUE_KeepWords,
+  FDE_CSSPROPERTYVALUE_KatakanaIroha,
+  FDE_CSSPROPERTYVALUE_Super,
+  FDE_CSSPROPERTYVALUE_Center,
+  FDE_CSSPROPERTYVALUE_TableHeaderGroup,
+  FDE_CSSPROPERTYVALUE_Inside,
+  FDE_CSSPROPERTYVALUE_XxLarge,
+  FDE_CSSPROPERTYVALUE_Triangle,
+  FDE_CSSPROPERTYVALUE_RubyTextGroup,
+  FDE_CSSPROPERTYVALUE_Circle,
+  FDE_CSSPROPERTYVALUE_Hiragana,
+  FDE_CSSPROPERTYVALUE_RepeatX,
+  FDE_CSSPROPERTYVALUE_RepeatY,
+  FDE_CSSPROPERTYVALUE_Move,
+  FDE_CSSPROPERTYVALUE_HiraganaIroha,
+  FDE_CSSPROPERTYVALUE_RubyBase,
+  FDE_CSSPROPERTYVALUE_Scroll,
+  FDE_CSSPROPERTYVALUE_Smaller,
+  FDE_CSSPROPERTYVALUE_TableFooterGroup,
+  FDE_CSSPROPERTYVALUE_Baseline,
+  FDE_CSSPROPERTYVALUE_Separate,
+  FDE_CSSPROPERTYVALUE_Armenian,
+  FDE_CSSPROPERTYVALUE_Open,
+  FDE_CSSPROPERTYVALUE_Relative,
+  FDE_CSSPROPERTYVALUE_Thick,
+  FDE_CSSPROPERTYVALUE_Justify,
+  FDE_CSSPROPERTYVALUE_Middle,
+  FDE_CSSPROPERTYVALUE_Always,
+  FDE_CSSPROPERTYVALUE_DistributeSpace,
+  FDE_CSSPROPERTYVALUE_LineEdge,
+  FDE_CSSPROPERTYVALUE_PreWrap,
+  FDE_CSSPROPERTYVALUE_Medium,
+  FDE_CSSPROPERTYVALUE_NResize,
+  FDE_CSSPROPERTYVALUE_ListItem,
+  FDE_CSSPROPERTYVALUE_Show,
+  FDE_CSSPROPERTYVALUE_Currentcolor,
+  FDE_CSSPROPERTYVALUE_NoCloseQuote,
+  FDE_CSSPROPERTYVALUE_VerticalLr,
+  FDE_CSSPROPERTYVALUE_VerticalRl,
+  FDE_CSSPROPERTYVALUE_Pointer,
+  FDE_CSSPROPERTYVALUE_XxSmall,
+  FDE_CSSPROPERTYVALUE_Bold,
+  FDE_CSSPROPERTYVALUE_Both,
+  FDE_CSSPROPERTYVALUE_SmallCaps,
+  FDE_CSSPROPERTYVALUE_Katakana,
+  FDE_CSSPROPERTYVALUE_After,
+  FDE_CSSPROPERTYVALUE_Horizontal,
+  FDE_CSSPROPERTYVALUE_Dotted,
+  FDE_CSSPROPERTYVALUE_Disc,
+  FDE_CSSPROPERTYVALUE_Georgian,
+  FDE_CSSPROPERTYVALUE_Inline,
+  FDE_CSSPROPERTYVALUE_Overline,
+  FDE_CSSPROPERTYVALUE_Wait,
+  FDE_CSSPROPERTYVALUE_BreakAll,
+  FDE_CSSPROPERTYVALUE_UpperAlpha,
+  FDE_CSSPROPERTYVALUE_Capitalize,
+  FDE_CSSPROPERTYVALUE_Nowrap,
+  FDE_CSSPROPERTYVALUE_TextBottom,
+  FDE_CSSPROPERTYVALUE_NoOpenQuote,
+  FDE_CSSPROPERTYVALUE_Groove,
+  FDE_CSSPROPERTYVALUE_Progress,
+  FDE_CSSPROPERTYVALUE_Larger,
+  FDE_CSSPROPERTYVALUE_CloseQuote,
+  FDE_CSSPROPERTYVALUE_TableCell,
+  FDE_CSSPROPERTYVALUE_PreLine,
+  FDE_CSSPROPERTYVALUE_Absolute,
+  FDE_CSSPROPERTYVALUE_InlineTable,
+  FDE_CSSPROPERTYVALUE_BidiOverride,
+  FDE_CSSPROPERTYVALUE_InlineBlock,
+  FDE_CSSPROPERTYVALUE_Inset,
+  FDE_CSSPROPERTYVALUE_Crosshair,
+  FDE_CSSPROPERTYVALUE_UpperLatin,
+  FDE_CSSPROPERTYVALUE_Help,
+  FDE_CSSPROPERTYVALUE_Hide,
+  FDE_CSSPROPERTYVALUE_Uppercase,
+  FDE_CSSPROPERTYVALUE_SResize,
+  FDE_CSSPROPERTYVALUE_Table,
+  FDE_CSSPROPERTYVALUE_Blink,
+  FDE_CSSPROPERTYVALUE_Block,
+  FDE_CSSPROPERTYVALUE_Start,
+  FDE_CSSPROPERTYVALUE_TableColumnGroup,
+  FDE_CSSPROPERTYVALUE_Italic,
+  FDE_CSSPROPERTYVALUE_LineThrough,
+  FDE_CSSPROPERTYVALUE_KeepAll,
+  FDE_CSSPROPERTYVALUE_LowerAlpha,
+  FDE_CSSPROPERTYVALUE_RunIn,
+  FDE_CSSPROPERTYVALUE_Square,
+  FDE_CSSPROPERTYVALUE_XLarge,
+  FDE_CSSPROPERTYVALUE_Large,
+  FDE_CSSPROPERTYVALUE_Before,
+  FDE_CSSPROPERTYVALUE_Left,
+  FDE_CSSPROPERTYVALUE_TextTop,
+  FDE_CSSPROPERTYVALUE_RubyText,
+  FDE_CSSPROPERTYVALUE_NoDisplay,
+  FDE_CSSPROPERTYVALUE_MAX
+};
+class IFDE_CSSValue {
+ public:
+  virtual ~IFDE_CSSValue() {}
+  virtual FDE_CSSVALUETYPE GetType() const = 0;
+};
+class IFDE_CSSPrimitiveValue : public IFDE_CSSValue {
+ public:
+  virtual FDE_CSSVALUETYPE GetType() const {
+    return FDE_CSSVALUETYPE_Primitive;
+  }
+  virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const = 0;
+  virtual FX_ARGB GetRGBColor() const = 0;
+  virtual FX_FLOAT GetFloat() const = 0;
+  virtual const FX_WCHAR* GetString(int32_t& iLength) const = 0;
+  virtual FDE_CSSPROPERTYVALUE GetEnum() const = 0;
+  virtual const FX_WCHAR* GetFuncName() const = 0;
+  virtual int32_t CountArgs() const = 0;
+  virtual IFDE_CSSValue* GetArgs(int32_t index) const = 0;
+};
+class IFDE_CSSValueList : public IFDE_CSSValue {
+ public:
+  virtual FDE_CSSVALUETYPE GetType() const { return FDE_CSSVALUETYPE_List; }
+  virtual int32_t CountValues() const = 0;
+  virtual IFDE_CSSValue* GetValue(int32_t index) const = 0;
+};
+enum FDE_CSSPROPERTY {
+  FDE_CSSPROPERTY_WritingMode,
+  FDE_CSSPROPERTY_ColumnRuleWidth,
+  FDE_CSSPROPERTY_BorderLeft,
+  FDE_CSSPROPERTY_ColumnRule,
+  FDE_CSSPROPERTY_Height,
+  FDE_CSSPROPERTY_CounterReset,
+  FDE_CSSPROPERTY_Content,
+  FDE_CSSPROPERTY_RubyPosition,
+  FDE_CSSPROPERTY_BackgroundColor,
+  FDE_CSSPROPERTY_Width,
+  FDE_CSSPROPERTY_Src,
+  FDE_CSSPROPERTY_Top,
+  FDE_CSSPROPERTY_Margin,
+  FDE_CSSPROPERTY_BorderColor,
+  FDE_CSSPROPERTY_Widows,
+  FDE_CSSPROPERTY_BorderBottomColor,
+  FDE_CSSPROPERTY_TextIndent,
+  FDE_CSSPROPERTY_Right,
+  FDE_CSSPROPERTY_TextEmphasisStyle,
+  FDE_CSSPROPERTY_PaddingLeft,
+  FDE_CSSPROPERTY_ColumnWidth,
+  FDE_CSSPROPERTY_MarginLeft,
+  FDE_CSSPROPERTY_Border,
+  FDE_CSSPROPERTY_BorderTop,
+  FDE_CSSPROPERTY_RubyOverhang,
+  FDE_CSSPROPERTY_PageBreakBefore,
+  FDE_CSSPROPERTY_MaxHeight,
+  FDE_CSSPROPERTY_MinWidth,
+  FDE_CSSPROPERTY_BorderLeftColor,
+  FDE_CSSPROPERTY_Bottom,
+  FDE_CSSPROPERTY_Quotes,
+  FDE_CSSPROPERTY_MaxWidth,
+  FDE_CSSPROPERTY_PaddingRight,
+  FDE_CSSPROPERTY_ListStyleImage,
+  FDE_CSSPROPERTY_WhiteSpace,
+  FDE_CSSPROPERTY_BorderBottom,
+  FDE_CSSPROPERTY_ListStyleType,
+  FDE_CSSPROPERTY_WordBreak,
+  FDE_CSSPROPERTY_OverflowX,
+  FDE_CSSPROPERTY_OverflowY,
+  FDE_CSSPROPERTY_BorderTopColor,
+  FDE_CSSPROPERTY_FontFamily,
+  FDE_CSSPROPERTY_Cursor,
+  FDE_CSSPROPERTY_RubyAlign,
+  FDE_CSSPROPERTY_ColumnRuleColor,
+  FDE_CSSPROPERTY_FontWeight,
+  FDE_CSSPROPERTY_BorderRightStyle,
+  FDE_CSSPROPERTY_MinHeight,
+  FDE_CSSPROPERTY_Color,
+  FDE_CSSPROPERTY_LetterSpacing,
+  FDE_CSSPROPERTY_EmptyCells,
+  FDE_CSSPROPERTY_TextAlign,
+  FDE_CSSPROPERTY_RubySpan,
+  FDE_CSSPROPERTY_Position,
+  FDE_CSSPROPERTY_BorderStyle,
+  FDE_CSSPROPERTY_BorderBottomStyle,
+  FDE_CSSPROPERTY_BorderCollapse,
+  FDE_CSSPROPERTY_ColumnCount,
+  FDE_CSSPROPERTY_BorderRightWidth,
+  FDE_CSSPROPERTY_UnicodeBidi,
+  FDE_CSSPROPERTY_VerticalAlign,
+  FDE_CSSPROPERTY_PaddingTop,
+  FDE_CSSPROPERTY_Columns,
+  FDE_CSSPROPERTY_Overflow,
+  FDE_CSSPROPERTY_TableLayout,
+  FDE_CSSPROPERTY_FontVariant,
+  FDE_CSSPROPERTY_ListStyle,
+  FDE_CSSPROPERTY_BackgroundPosition,
+  FDE_CSSPROPERTY_BorderWidth,
+  FDE_CSSPROPERTY_TextEmphasisColor,
+  FDE_CSSPROPERTY_BorderLeftStyle,
+  FDE_CSSPROPERTY_PageBreakInside,
+  FDE_CSSPROPERTY_TextEmphasis,
+  FDE_CSSPROPERTY_BorderBottomWidth,
+  FDE_CSSPROPERTY_ColumnGap,
+  FDE_CSSPROPERTY_Orphans,
+  FDE_CSSPROPERTY_BorderRight,
+  FDE_CSSPROPERTY_FontSize,
+  FDE_CSSPROPERTY_PageBreakAfter,
+  FDE_CSSPROPERTY_CaptionSide,
+  FDE_CSSPROPERTY_BackgroundRepeat,
+  FDE_CSSPROPERTY_BorderTopStyle,
+  FDE_CSSPROPERTY_BorderSpacing,
+  FDE_CSSPROPERTY_TextTransform,
+  FDE_CSSPROPERTY_FontStyle,
+  FDE_CSSPROPERTY_Font,
+  FDE_CSSPROPERTY_LineHeight,
+  FDE_CSSPROPERTY_MarginRight,
+  FDE_CSSPROPERTY_Float,
+  FDE_CSSPROPERTY_BorderLeftWidth,
+  FDE_CSSPROPERTY_Display,
+  FDE_CSSPROPERTY_Clear,
+  FDE_CSSPROPERTY_ColumnRuleStyle,
+  FDE_CSSPROPERTY_TextCombine,
+  FDE_CSSPROPERTY_ListStylePosition,
+  FDE_CSSPROPERTY_Visibility,
+  FDE_CSSPROPERTY_PaddingBottom,
+  FDE_CSSPROPERTY_BackgroundAttachment,
+  FDE_CSSPROPERTY_BackgroundImage,
+  FDE_CSSPROPERTY_LineBreak,
+  FDE_CSSPROPERTY_Background,
+  FDE_CSSPROPERTY_BorderTopWidth,
+  FDE_CSSPROPERTY_WordSpacing,
+  FDE_CSSPROPERTY_BorderRightColor,
+  FDE_CSSPROPERTY_CounterIncrement,
+  FDE_CSSPROPERTY_Left,
+  FDE_CSSPROPERTY_TextDecoration,
+  FDE_CSSPROPERTY_Padding,
+  FDE_CSSPROPERTY_MarginBottom,
+  FDE_CSSPROPERTY_MarginTop,
+  FDE_CSSPROPERTY_Direction,
+  FDE_CSSPROPERTY_MAX
+};
+class IFDE_CSSDeclaration {
+ public:
+  virtual ~IFDE_CSSDeclaration() {}
+  virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty,
+                                     FX_BOOL& bImportant) const = 0;
+  virtual FX_POSITION GetStartPosition() const = 0;
+  virtual void GetNextProperty(FX_POSITION& pos,
+                               FDE_CSSPROPERTY& eProperty,
+                               IFDE_CSSValue*& pValue,
+                               FX_BOOL& bImportant) const = 0;
+  virtual FX_POSITION GetStartCustom() const = 0;
+  virtual void GetNextCustom(FX_POSITION& pos,
+                             CFX_WideString& wsName,
+                             CFX_WideString& wsValue) const = 0;
+};
+typedef CFX_ArrayTemplate<IFDE_CSSDeclaration*> CFDE_CSSDeclarationArray;
+enum FDE_CSSPERSUDO {
+  FDE_CSSPERSUDO_After,
+  FDE_CSSPERSUDO_Before,
+  FDE_CSSPERSUDO_NONE
+};
+enum FDE_CSSSELECTORTYPE {
+  FDE_CSSSELECTORTYPE_Element,
+  FDE_CSSSELECTORTYPE_Descendant,
+  FDE_CSSSELECTORTYPE_Class,
+  FDE_CSSSELECTORTYPE_Persudo,
+  FDE_CSSSELECTORTYPE_ID,
+};
+class IFDE_CSSSelector {
+ public:
+  virtual ~IFDE_CSSSelector() {}
+  virtual FDE_CSSSELECTORTYPE GetType() const = 0;
+  virtual FX_DWORD GetNameHash() const = 0;
+  virtual IFDE_CSSSelector* GetNextSelector() const = 0;
+};
+#define FDE_CSSMEDIATYPE_Braille 0x01
+#define FDE_CSSMEDIATYPE_Emboss 0x02
+#define FDE_CSSMEDIATYPE_Handheld 0x04
+#define FDE_CSSMEDIATYPE_Print 0x08
+#define FDE_CSSMEDIATYPE_Projection 0x10
+#define FDE_CSSMEDIATYPE_Screen 0x20
+#define FDE_CSSMEDIATYPE_TTY 0x40
+#define FDE_CSSMEDIATYPE_TV 0x80
+#define FDE_CSSMEDIATYPE_ALL 0xFF
+enum FDE_CSSRULETYPE {
+  FDE_CSSRULETYPE_Unknown = 0,
+  FDE_CSSRULETYPE_Style = 1,
+  FDE_CSSRULETYPE_Media = 4,
+  FDE_CSSRULETYPE_FontFace = 5,
+};
+class IFDE_CSSRule {
+ public:
+  virtual ~IFDE_CSSRule() {}
+  virtual FDE_CSSRULETYPE GetType() const = 0;
+};
+typedef CFX_MassArrayTemplate<IFDE_CSSRule*> CFDE_CSSRuleArray;
+class IFDE_CSSStyleRule : public IFDE_CSSRule {
+ public:
+  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_Style; }
+  virtual int32_t CountSelectorLists() const = 0;
+  virtual IFDE_CSSSelector* GetSelectorList(int32_t index) const = 0;
+  virtual IFDE_CSSDeclaration* GetDeclaration() const = 0;
+};
+class IFDE_CSSMediaRule : public IFDE_CSSRule {
+ public:
+  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_Media; }
+  virtual FX_DWORD GetMediaList() const = 0;
+  virtual int32_t CountRules() const = 0;
+  virtual IFDE_CSSRule* GetRule(int32_t index) = 0;
+};
+class IFDE_CSSFontFaceRule : public IFDE_CSSRule {
+ public:
+  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_FontFace; }
+  virtual IFDE_CSSDeclaration* GetDeclaration() const = 0;
+};
+class IFDE_CSSStyleSheet : public IFX_Unknown {
+ public:
+  static IFDE_CSSStyleSheet* LoadHTMLStandardStyleSheet();
+  static IFDE_CSSStyleSheet* LoadFromStream(
+      const CFX_WideString& szUrl,
+      IFX_Stream* pStream,
+      FX_WORD wCodePage,
+      FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
+  static IFDE_CSSStyleSheet* LoadFromBuffer(
+      const CFX_WideString& szUrl,
+      const FX_WCHAR* pBuffer,
+      int32_t iBufSize,
+      FX_WORD wCodePage,
+      FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
+  virtual FX_BOOL GetUrl(CFX_WideString& szUrl) = 0;
+  virtual FX_DWORD GetMediaList() const = 0;
+  virtual FX_WORD GetCodePage() const = 0;
+
+  virtual int32_t CountRules() const = 0;
+  virtual IFDE_CSSRule* GetRule(int32_t index) = 0;
+};
+typedef CFX_ArrayTemplate<IFDE_CSSStyleSheet*> CFDE_CSSStyleSheetArray;
+#define FDE_CSSUSERSTYLESHEET (FX_BSTRC("#USERSHEET"))
+#define FDE_CSSUAGENTSTYLESHEET (FX_BSTRC("#AGENTSHEET"))
+class IFDE_CSSStyleSheetCache {
+ public:
+  static IFDE_CSSStyleSheetCache* Create();
+  virtual ~IFDE_CSSStyleSheetCache() {}
+  virtual void Release() = 0;
+  virtual void SetMaxItems(int32_t iMaxCount = 5) = 0;
+  virtual void AddStyleSheet(const CFX_ByteStringC& szKey,
+                             IFDE_CSSStyleSheet* pStyleSheet) = 0;
+  virtual IFDE_CSSStyleSheet* GetStyleSheet(
+      const CFX_ByteStringC& szKey) const = 0;
+  virtual void RemoveStyleSheet(const CFX_ByteStringC& szKey) = 0;
+};
+enum FDE_CSSSYNTAXSTATUS {
+  FDE_CSSSYNTAXSTATUS_Error,
+  FDE_CSSSYNTAXSTATUS_EOS,
+  FDE_CSSSYNTAXSTATUS_None,
+  FDE_CSSSYNTAXSTATUS_Charset,
+  FDE_CSSSYNTAXSTATUS_ImportRule,
+  FDE_CSSSYNTAXSTATUS_ImportClose,
+  FDE_CSSSYNTAXSTATUS_PageRule,
+  FDE_CSSSYNTAXSTATUS_StyleRule,
+  FDE_CSSSYNTAXSTATUS_FontFaceRule,
+  FDE_CSSSYNTAXSTATUS_MediaRule,
+  FDE_CSSSYNTAXSTATUS_MediaType,
+  FDE_CSSSYNTAXSTATUS_URI,
+  FDE_CSSSYNTAXSTATUS_Selector,
+  FDE_CSSSYNTAXSTATUS_DeclOpen,
+  FDE_CSSSYNTAXSTATUS_DeclClose,
+  FDE_CSSSYNTAXSTATUS_PropertyName,
+  FDE_CSSSYNTAXSTATUS_PropertyValue,
+};
+class IFDE_CSSSyntaxParser {
+ public:
+  static IFDE_CSSSyntaxParser* Create();
+  virtual ~IFDE_CSSSyntaxParser() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL Init(IFX_Stream* pStream,
+                       int32_t iCSSPlaneSize,
+                       int32_t iTextDataSize = 32,
+                       FX_BOOL bOnlyDeclaration = FALSE) = 0;
+  virtual FX_BOOL Init(const FX_WCHAR* pBuffer,
+                       int32_t iBufferSize,
+                       int32_t iTextDatSize = 32,
+                       FX_BOOL bOnlyDeclaration = FALSE) = 0;
+
+  virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse() = 0;
+  virtual const FX_WCHAR* GetCurrentString(int32_t& iLength) const = 0;
+};
+enum FDE_CSSLENGTHUNIT {
+  FDE_CSSLENGTHUNIT_Auto,
+  FDE_CSSLENGTHUNIT_None,
+  FDE_CSSLENGTHUNIT_Normal,
+  FDE_CSSLENGTHUNIT_Point,
+  FDE_CSSLENGTHUNIT_Percent,
+};
+#define FDE_CSSUNITBITS (3)
+#define FDE_CSSUNITMASK ((1 << FDE_CSSUNITBITS) - 1)
+struct FDE_CSSLENGTH {
+  FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit) {
+    m_iData = eUnit;
+    return *this;
+  }
+  FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
+    m_iData = ((intptr_t)(fValue * 1024.0f) << FDE_CSSUNITBITS) | eUnit;
+    return *this;
+  }
+  FDE_CSSLENGTHUNIT GetUnit() const {
+    return (FDE_CSSLENGTHUNIT)(m_iData & FDE_CSSUNITMASK);
+  }
+  FX_FLOAT GetValue() const { return (m_iData >> FDE_CSSUNITBITS) / 1024.0f; }
+  FX_BOOL NonZero() const { return (m_iData >> FDE_CSSUNITBITS) != 0; }
+
+ private:
+  intptr_t m_iData;
+};
+struct FDE_CSSPOINT {
+  FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit) {
+    x.Set(eUnit);
+    y.Set(eUnit);
+    return *this;
+  }
+  FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
+    x.Set(eUnit, fValue);
+    y.Set(eUnit, fValue);
+    return *this;
+  }
+  FDE_CSSLENGTH x, y;
+};
+struct FDE_CSSSIZE {
+  FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit) {
+    cx.Set(eUnit);
+    cy.Set(eUnit);
+    return *this;
+  }
+  FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
+    cx.Set(eUnit, fValue);
+    cy.Set(eUnit, fValue);
+    return *this;
+  }
+  FDE_CSSLENGTH cx, cy;
+};
+struct FDE_CSSRECT {
+  FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit) {
+    left.Set(eUnit);
+    top.Set(eUnit);
+    right.Set(eUnit);
+    bottom.Set(eUnit);
+    return *this;
+  }
+  FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
+    left.Set(eUnit, fValue);
+    top.Set(eUnit, fValue);
+    right.Set(eUnit, fValue);
+    bottom.Set(eUnit, fValue);
+    return *this;
+  }
+
+  FDE_CSSLENGTH left, top, right, bottom;
+};
+enum FDE_CSSBKGATTACHMENT {
+  FDE_CSSBKGATTACHMENT_Scroll,
+  FDE_CSSBKGATTACHMENT_Fixed,
+};
+enum FDE_CSSBKGREPEAT {
+  FDE_CSSBKGREPEAT_Repeat,
+  FDE_CSSBKGREPEAT_RepeatX,
+  FDE_CSSBKGREPEAT_RepeatY,
+  FDE_CSSBKGREPEAT_NoRepeat,
+};
+enum FDE_CSSBORDERSTYLE {
+  FDE_CSSBORDERSTYLE_None,
+  FDE_CSSBORDERSTYLE_Hidden,
+  FDE_CSSBORDERSTYLE_Dotted,
+  FDE_CSSBORDERSTYLE_Dashed,
+  FDE_CSSBORDERSTYLE_Solid,
+  FDE_CSSBORDERSTYLE_Double,
+  FDE_CSSBORDERSTYLE_Groove,
+  FDE_CSSBORDERSTYLE_Ridge,
+  FDE_CSSBORDERSTYLE_Inset,
+  FDE_CSSBORDERSTYLE_outset,
+};
+enum FDE_CSSCLEAR {
+  FDE_CSSCLEAR_None,
+  FDE_CSSCLEAR_Left,
+  FDE_CSSCLEAR_Right,
+  FDE_CSSCLEAR_Both,
+};
+enum FDE_CSSDISPLAY {
+  FDE_CSSDISPLAY_None,
+  FDE_CSSDISPLAY_ListItem,
+  FDE_CSSDISPLAY_RunIn,
+  FDE_CSSDISPLAY_Block,
+  FDE_CSSDISPLAY_Inline,
+  FDE_CSSDISPLAY_InlineBlock,
+  FDE_CSSDISPLAY_InlineTable,
+  FDE_CSSDISPLAY_Table,
+  FDE_CSSDISPLAY_TableRow,
+  FDE_CSSDISPLAY_TableCell,
+  FDE_CSSDISPLAY_TableCaption,
+  FDE_CSSDISPLAY_TableColumn,
+  FDE_CSSDISPLAY_TableRowGroup,
+  FDE_CSSDISPLAY_TableColumnGroup,
+  FDE_CSSDISPLAY_TableHeaderGroup,
+  FDE_CSSDISPLAY_TableFooterGroup,
+  FDE_CSSDISPLAY_Ruby,
+  FDE_CSSDISPLAY_RubyBase,
+  FDE_CSSDISPLAY_RubyText,
+  FDE_CSSDISPLSY_RubyBaseGroup,
+  FDE_CSSDISPLAY_RubyTextGroup,
+};
+enum FDE_CSSVISIBILITY {
+  FDE_CSSVISIBILITY_Visible,
+  FDE_CSSVISIBILITY_Hidden,
+  FDE_CSSVISIBILITY_Collapse,
+};
+enum FDE_CSSFONTSTYLE {
+  FDE_CSSFONTSTYLE_Normal,
+  FDE_CSSFONTSTYLE_Italic,
+};
+enum FDE_CSSFLOAT {
+  FDE_CSSFLOAT_None,
+  FDE_CSSFLOAT_Left,
+  FDE_CSSFLOAT_Right,
+};
+enum FDE_CSSWRITINGMODE {
+  FDE_CSSWRITINGMODE_HorizontalTb,
+  FDE_CSSWRITINGMODE_VerticalRl,
+  FDE_CSSWRITINGMODE_VerticalLr,
+};
+enum FDE_CSSWORDBREAK {
+  FDE_CSSWORDBREAK_Normal,
+  FDE_CSSWORDBREAK_KeepAll,
+  FDE_CSSWORDBREAK_BreakAll,
+  FDE_CSSWORDBREAK_KeepWords,
+};
+enum FDE_CSSPAGEBREAK {
+  FDE_CSSPAGEBREAK_Auto,
+  FDE_CSSPAGEBREAK_Always,
+  FDE_CSSPAGEBREAK_Avoid,
+  FDE_CSSPAGEBREAK_Left,
+  FDE_CSSPAGEBREAK_Right,
+};
+enum FDE_CSSOVERFLOW {
+  FDE_CSSOVERFLOW_Visible,
+  FDE_CSSOVERFLOW_Hidden,
+  FDE_CSSOVERFLOW_Scroll,
+  FDE_CSSOVERFLOW_Auto,
+  FDE_CSSOVERFLOW_NoDisplay,
+  FDE_CSSOVERFLOW_NoContent,
+};
+enum FDE_CSSLINEBREAK {
+  FDE_CSSLINEBREAK_Auto,
+  FDE_CSSLINEBREAK_Loose,
+  FDE_CSSLINEBREAK_Normal,
+  FDE_CSSLINEBREAK_Strict,
+};
+enum FDE_CSSTEXTEMPHASISFILL {
+  FDE_CSSTEXTEMPHASISFILL_Filled,
+  FDE_CSSTEXTEMPHASISFILL_Open,
+};
+enum FDE_CSSTEXTEMPHASISMARK {
+  FDE_CSSTEXTEMPHASISMARK_None,
+  FDE_CSSTEXTEMPHASISMARK_Auto,
+  FDE_CSSTEXTEMPHASISMARK_Dot,
+  FDE_CSSTEXTEMPHASISMARK_Circle,
+  FDE_CSSTEXTEMPHASISMARK_DoubleCircle,
+  FDE_CSSTEXTEMPHASISMARK_Triangle,
+  FDE_CSSTEXTEMPHASISMARK_Sesame,
+  FDE_CSSTEXTEMPHASISMARK_Custom,
+};
+enum FDE_CSSTEXTCOMBINE {
+  FDE_CSSTEXTCOMBINE_Horizontal,
+  FDE_CSSTEXTCOMBINE_None,
+};
+enum FDE_CSSCURSOR {
+  FDE_CSSCURSOR_Auto,
+  FDE_CSSCURSOR_Crosshair,
+  FDE_CSSCURSOR_Default,
+  FDE_CSSCURSOR_Pointer,
+  FDE_CSSCURSOR_Move,
+  FDE_CSSCURSOR_EResize,
+  FDE_CSSCURSOR_NeResize,
+  FDE_CSSCURSOR_NwResize,
+  FDE_CSSCURSOR_NResize,
+  FDE_CSSCURSOR_SeResize,
+  FDE_CSSCURSOR_SwResize,
+  FDE_CSSCURSOR_SResize,
+  FDE_CSSCURSOR_WResize,
+  FDE_CSSCURSOR_Text,
+  FDE_CSSCURSOR_Wait,
+  FDE_CSSCURSOR_Help,
+  FDE_CSSCURSOR_Progress,
+};
+enum FDE_CSSPOSITION {
+  FDE_CSSPOSITION_Static,
+  FDE_CSSPOSITION_Relative,
+  FDE_CSSPOSITION_Absolute,
+  FDE_CSSPOSITION_Fixed,
+};
+enum FDE_CSSCAPTIONSIDE {
+  FDE_CSSCAPTIONSIDE_Top,
+  FDE_CSSCAPTIONSIDE_Bottom,
+  FDE_CSSCAPTIONSIDE_Left,
+  FDE_CSSCAPTIONSIDE_Right,
+  FDE_CSSCAPTIONSIDE_Before,
+  FDE_CSSCAPTIONSIDE_After,
+};
+enum FDE_CSSRUBYALIGN {
+  FDE_CSSRUBYALIGN_Auto,
+  FDE_CSSRUBYALIGN_Start,
+  FDE_CSSRUBYALIGN_Left,
+  FDE_CSSRUBYALIGN_Center,
+  FDE_CSSRUBYALIGN_End,
+  FDE_CSSRUBYALIGN_Right,
+  FDE_CSSRUBYALIGN_DistributeLetter,
+  FDE_CSSRUBYALIGN_DistributeSpace,
+  FDE_CSSRUBYALIGN_LineEdge,
+};
+enum FDE_CSSRUBYOVERHANG {
+  FDE_CSSRUBYOVERHANG_Auto,
+  FDE_CSSRUBYOVERHANG_Start,
+  FDE_CSSRUBYOVERHANG_End,
+  FDE_CSSRUBYOVERHANG_None,
+};
+enum FDE_CSSRUBYPOSITION {
+  FDE_CSSRUBYPOSITION_Before,
+  FDE_CSSRUBYPOSITION_After,
+  FDE_CSSRUBYPOSITION_Right,
+  FDE_CSSRUBYPOSITION_Inline,
+};
+enum FDE_CSSRUBYSPAN {
+  FDE_CSSRUBYSPAN_None,
+  FDE_CSSRUBYSPAN_Attr,
+};
+enum FDE_CSSTEXTALIGN {
+  FDE_CSSTEXTALIGN_Left,
+  FDE_CSSTEXTALIGN_Right,
+  FDE_CSSTEXTALIGN_Center,
+  FDE_CSSTEXTALIGN_Justify,
+  FDE_CSSTEXTALIGN_JustifyAll,
+};
+enum FDE_CSSVERTICALALIGN {
+  FDE_CSSVERTICALALIGN_Baseline,
+  FDE_CSSVERTICALALIGN_Sub,
+  FDE_CSSVERTICALALIGN_Super,
+  FDE_CSSVERTICALALIGN_Top,
+  FDE_CSSVERTICALALIGN_TextTop,
+  FDE_CSSVERTICALALIGN_Middle,
+  FDE_CSSVERTICALALIGN_Bottom,
+  FDE_CSSVERTICALALIGN_TextBottom,
+  FDE_CSSVERTICALALIGN_Number,
+};
+enum FDE_CSSLISTSTYLETYPE {
+  FDE_CSSLISTSTYLETYPE_Disc,
+  FDE_CSSLISTSTYLETYPE_Circle,
+  FDE_CSSLISTSTYLETYPE_Square,
+  FDE_CSSLISTSTYLETYPE_Decimal,
+  FDE_CSSLISTSTYLETYPE_DecimalLeadingZero,
+  FDE_CSSLISTSTYLETYPE_LowerRoman,
+  FDE_CSSLISTSTYLETYPE_UpperRoman,
+  FDE_CSSLISTSTYLETYPE_LowerGreek,
+  FDE_CSSLISTSTYLETYPE_LowerLatin,
+  FDE_CSSLISTSTYLETYPE_UpperLatin,
+  FDE_CSSLISTSTYLETYPE_Armenian,
+  FDE_CSSLISTSTYLETYPE_Georgian,
+  FDE_CSSLISTSTYLETYPE_LowerAlpha,
+  FDE_CSSLISTSTYLETYPE_UpperAlpha,
+  FDE_CSSLISTSTYLETYPE_None,
+  FDE_CSSLISTSTYLETYPE_CjkIdeographic,
+  FDE_CSSLISTSTYLETYPE_Hebrew,
+  FDE_CSSLISTSTYLETYPE_Hiragana,
+  FDE_CSSLISTSTYLETYPE_HiraganaIroha,
+  FDE_CSSLISTSTYLETYPE_Katakana,
+  FDE_CSSLISTSTYLETYPE_KatakanaIroha,
+};
+enum FDE_CSSLISTSTYLEPOSITION {
+  FDE_CSSLISTSTYLEPOSITION_Outside,
+  FDE_CSSLISTSTYLEPOSITION_Inside,
+};
+enum FDE_CSSWHITESPACE {
+  FDE_CSSWHITESPACE_Normal,
+  FDE_CSSWHITESPACE_Pre,
+  FDE_CSSWHITESPACE_Nowrap,
+  FDE_CSSWHITESPACE_PreWrap,
+  FDE_CSSWHITESPACE_PreLine,
+};
+enum FDE_CSSFONTVARIANT {
+  FDE_CSSFONTVARIANT_Normal,
+  FDE_CSSFONTVARIANT_SmallCaps,
+};
+enum FDE_CSSTEXTTRANSFORM {
+  FDE_CSSTEXTTRANSFORM_None,
+  FDE_CSSTEXTTRANSFORM_Capitalize,
+  FDE_CSSTEXTTRANSFORM_UpperCase,
+  FDE_CSSTEXTTRANSFORM_LowerCase,
+};
+enum FDE_CSSTEXTDECORATION {
+  FDE_CSSTEXTDECORATION_None = 0,
+  FDE_CSSTEXTDECORATION_Underline = 1,
+  FDE_CSSTEXTDECORATION_Overline = 2,
+  FDE_CSSTEXTDECORATION_LineThrough = 4,
+  FDE_CSSTEXTDECORATION_Blink = 8,
+  FDE_CSSTEXTDECORATION_Double = 16,
+};
+class IFDE_CSSRubyStyle {
+ public:
+  virtual ~IFDE_CSSRubyStyle() {}
+  virtual FDE_CSSRUBYALIGN GetRubyAlign() const = 0;
+  virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const = 0;
+  virtual FDE_CSSRUBYPOSITION GetRubyPosition() const = 0;
+  virtual FDE_CSSRUBYSPAN GetRubySpanType() const = 0;
+  virtual IFDE_CSSValue* GetRubySpanAttr() const = 0;
+};
+class IFDE_CSSMultiColumnStyle {
+ public:
+  virtual ~IFDE_CSSMultiColumnStyle() {}
+  virtual const FDE_CSSLENGTH& GetColumnCount() const = 0;
+  virtual const FDE_CSSLENGTH& GetColumnGap() const = 0;
+  virtual FX_ARGB GetColumnRuleColor() const = 0;
+  virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const = 0;
+  virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const = 0;
+  virtual const FDE_CSSLENGTH& GetColumnWidth() const = 0;
+  virtual void SetColumnCount(const FDE_CSSLENGTH& columnCount) = 0;
+  virtual void SetColumnGap(const FDE_CSSLENGTH& columnGap) = 0;
+  virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) = 0;
+  virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) = 0;
+  virtual void SetColumnRuleWidth(const FDE_CSSLENGTH& columnRuleWidth) = 0;
+  virtual void SetColumnWidth(const FDE_CSSLENGTH& columnWidth) = 0;
+};
+class IFDE_CSSGeneratedContentStyle {
+ public:
+  virtual ~IFDE_CSSGeneratedContentStyle() {}
+  virtual int32_t CountCounters() = 0;
+  virtual const FX_WCHAR* GetCounterIdentifier(int32_t index) = 0;
+  virtual FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) = 0;
+  virtual FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) = 0;
+  virtual IFDE_CSSValueList* GetContent() const = 0;
+  virtual int32_t CountQuotes() const = 0;
+  virtual const FX_WCHAR* GetQuotes(int32_t index) const = 0;
+};
+class IFDE_CSSFontStyle {
+ public:
+  virtual ~IFDE_CSSFontStyle() {}
+  virtual int32_t CountFontFamilies() const = 0;
+  virtual const FX_WCHAR* GetFontFamily(int32_t index) const = 0;
+  virtual FX_WORD GetFontWeight() const = 0;
+  virtual FDE_CSSFONTVARIANT GetFontVariant() const = 0;
+  virtual FDE_CSSFONTSTYLE GetFontStyle() const = 0;
+  virtual FX_FLOAT GetFontSize() const = 0;
+  virtual FX_ARGB GetColor() const = 0;
+  virtual void SetFontWeight(FX_WORD wFontWeight) = 0;
+  virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) = 0;
+  virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) = 0;
+  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+  virtual void SetColor(FX_ARGB dwFontColor) = 0;
+};
+class IFDE_CSSBoundaryStyle {
+ public:
+  virtual ~IFDE_CSSBoundaryStyle() {}
+  virtual FX_ARGB GetBorderLeftColor() const = 0;
+  virtual FX_ARGB GetBorderTopColor() const = 0;
+  virtual FX_ARGB GetBorderRightColor() const = 0;
+  virtual FX_ARGB GetBorderBottomColor() const = 0;
+  virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const = 0;
+  virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const = 0;
+  virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const = 0;
+  virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const = 0;
+  virtual const FDE_CSSRECT* GetBorderWidth() const = 0;
+  virtual const FDE_CSSRECT* GetMarginWidth() const = 0;
+  virtual const FDE_CSSRECT* GetPaddingWidth() const = 0;
+  virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) = 0;
+  virtual void SetBorderTopColor(FX_ARGB dwBorderColor) = 0;
+  virtual void SetBorderRightColor(FX_ARGB dwBorderColor) = 0;
+  virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) = 0;
+
+  virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
+  virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
+  virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
+  virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
+
+  virtual void SetBorderWidth(const FDE_CSSRECT& rect) = 0;
+  virtual void SetMarginWidth(const FDE_CSSRECT& rect) = 0;
+  virtual void SetPaddingWidth(const FDE_CSSRECT& rect) = 0;
+};
+class IFDE_CSSPositionStyle {
+ public:
+  virtual ~IFDE_CSSPositionStyle() {}
+  virtual FDE_CSSDISPLAY GetDisplay() const = 0;
+  virtual const FDE_CSSSIZE& GetBoxSize() const = 0;
+  virtual const FDE_CSSSIZE& GetMinBoxSize() const = 0;
+  virtual const FDE_CSSSIZE& GetMaxBoxSize() const = 0;
+  virtual FDE_CSSFLOAT GetFloat() const = 0;
+  virtual FDE_CSSCLEAR GetClear() const = 0;
+  virtual FDE_CSSPOSITION GetPosition() const = 0;
+  virtual FDE_CSSLENGTH GetTop() const = 0;
+  virtual FDE_CSSLENGTH GetBottom() const = 0;
+  virtual FDE_CSSLENGTH GetLeft() const = 0;
+  virtual FDE_CSSLENGTH GetRight() const = 0;
+  virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) = 0;
+  virtual void SetBoxSize(const FDE_CSSSIZE& boxSize) = 0;
+  virtual void SetMinBoxSize(const FDE_CSSSIZE& minBoxSize) = 0;
+  virtual void SetMaxBoxSize(const FDE_CSSSIZE& maxBoxSize) = 0;
+  virtual void SetFloat(FDE_CSSFLOAT eFloat) = 0;
+  virtual void SetClear(FDE_CSSCLEAR eClear) = 0;
+};
+class IFDE_CSSParagraphStyle {
+ public:
+  virtual ~IFDE_CSSParagraphStyle() {}
+  virtual FX_FLOAT GetLineHeight() const = 0;
+  virtual FDE_CSSWHITESPACE GetWhiteSpace() const = 0;
+  virtual const FDE_CSSLENGTH& GetTextIndent() const = 0;
+  virtual FDE_CSSTEXTALIGN GetTextAlign() const = 0;
+  virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const = 0;
+  virtual FX_FLOAT GetNumberVerticalAlign() const = 0;
+  virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const = 0;
+  virtual FX_DWORD GetTextDecoration() const = 0;
+  virtual const FDE_CSSLENGTH& GetLetterSpacing() const = 0;
+  virtual const FDE_CSSLENGTH& GetWordSpacing() const = 0;
+  virtual FDE_CSSWRITINGMODE GetWritingMode() const = 0;
+  virtual FDE_CSSWORDBREAK GetWordBreak() const = 0;
+  virtual int32_t GetWidows() const = 0;
+  virtual FX_ARGB GetTextEmphasisColor() const = 0;
+  virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const = 0;
+  virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const = 0;
+  virtual FDE_CSSPAGEBREAK GetPageBreakInside() const = 0;
+  virtual int32_t GetOrphans() const = 0;
+  virtual FDE_CSSLINEBREAK GetLineBreak() const = 0;
+  virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const = 0;
+  virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const = 0;
+  virtual const FX_WCHAR* GetTextEmphasisCustom() const = 0;
+  virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const = 0;
+  virtual FX_BOOL HasTextCombineNumber() const = 0;
+  virtual FX_FLOAT GetTextCombineNumber() const = 0;
+  virtual void SetLineHeight(FX_FLOAT fLineHeight) = 0;
+  virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) = 0;
+  virtual void SetTextIndent(const FDE_CSSLENGTH& textIndent) = 0;
+  virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) = 0;
+  virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) = 0;
+  virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) = 0;
+  virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) = 0;
+  virtual void SetTextDecoration(FX_DWORD dwTextDecoration) = 0;
+  virtual void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) = 0;
+  virtual void SetWordSpacing(const FDE_CSSLENGTH& wordSpacing) = 0;
+  virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) = 0;
+  virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) = 0;
+  virtual void SetWidows(int32_t iWidows) = 0;
+  virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) = 0;
+  virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) = 0;
+  virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) = 0;
+  virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) = 0;
+  virtual void SetOrphans(int32_t iOrphans) = 0;
+  virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) = 0;
+};
+class IFDE_CSSBackgroundStyle {
+ public:
+  virtual ~IFDE_CSSBackgroundStyle() {}
+  virtual FX_ARGB GetBKGColor() const = 0;
+  virtual const FX_WCHAR* GetBKGImage() const = 0;
+  virtual FDE_CSSBKGREPEAT GetBKGRepeat() const = 0;
+  virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const = 0;
+  virtual const FDE_CSSPOINT& GetBKGPosition() const = 0;
+  virtual void SetBKGColor(FX_ARGB dwBKGColor) = 0;
+  virtual void SetBKGPosition(const FDE_CSSPOINT& bkgPosition) = 0;
+};
+class IFDE_CSSListStyle {
+ public:
+  virtual ~IFDE_CSSListStyle() {}
+  virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const = 0;
+  virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const = 0;
+  virtual const FX_WCHAR* GetListStyleImage() const = 0;
+  virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) = 0;
+  virtual void SetListStylePosition(
+      FDE_CSSLISTSTYLEPOSITION eListStylePosition) = 0;
+};
+class IFDE_CSSTableStyle {
+ public:
+  virtual ~IFDE_CSSTableStyle() {}
+  virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const = 0;
+};
+class IFDE_CSSVisualStyle {
+ public:
+  virtual ~IFDE_CSSVisualStyle() {}
+  virtual FDE_CSSVISIBILITY GetVisibility() const = 0;
+  virtual FDE_CSSOVERFLOW GetOverflowX() const = 0;
+  virtual FDE_CSSOVERFLOW GetOverflowY() const = 0;
+  virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) = 0;
+};
+class IFDE_CSSComputedStyle : public IFX_Unknown {
+ public:
+  virtual void Reset() = 0;
+  virtual IFDE_CSSFontStyle* GetFontStyles() const = 0;
+  virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const = 0;
+  virtual IFDE_CSSPositionStyle* GetPositionStyles() const = 0;
+  virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const = 0;
+  virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const = 0;
+  virtual IFDE_CSSVisualStyle* GetVisualStyles() const = 0;
+  virtual IFDE_CSSListStyle* GetListStyles() const = 0;
+  virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const = 0;
+  virtual IFDE_CSSTableStyle* GetTableStyle() const = 0;
+  virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const = 0;
+  virtual IFDE_CSSRubyStyle* GetRubyStyle() const = 0;
+  virtual FX_BOOL GetCustomStyle(const CFX_WideStringC& wsName,
+                                 CFX_WideString& wsValue) const = 0;
+};
+enum FDE_CSSSTYLESHEETGROUP {
+  FDE_CSSSTYLESHEETGROUP_UserAgent,
+  FDE_CSSSTYLESHEETGROUP_User,
+  FDE_CSSSTYLESHEETGROUP_Author,
+  FDE_CSSSTYLESHEETGROUP_MAX,
+};
+enum FDE_CSSSTYLESHEETPRIORITY {
+  FDE_CSSSTYLESHEETPRIORITY_High,
+  FDE_CSSSTYLESHEETPRIORITY_Mid,
+  FDE_CSSSTYLESHEETPRIORITY_Low,
+  FDE_CSSSTYLESHEETPRIORITY_MAX,
+};
+class IFDE_CSSTagProvider {
+ public:
+  virtual ~IFDE_CSSTagProvider() {}
+  virtual CFX_WideStringC GetTagName() = 0;
+  virtual FX_POSITION GetFirstAttribute() = 0;
+  virtual void GetNextAttribute(FX_POSITION& pos,
+                                CFX_WideStringC& wsAttr,
+                                CFX_WideStringC& wsValue) = 0;
+};
+class IFDE_CSSAccelerator {
+ public:
+  virtual ~IFDE_CSSAccelerator() {}
+  virtual void OnEnterTag(IFDE_CSSTagProvider* pTag) = 0;
+  virtual void OnLeaveTag(IFDE_CSSTagProvider* pTag) = 0;
+};
+class IFDE_CSSStyleSelector {
+ public:
+  static IFDE_CSSStyleSelector* Create();
+  virtual ~IFDE_CSSStyleSelector() {}
+  virtual void Release() = 0;
+  virtual void SetFontMgr(IFX_FontMgr* pFontMgr) = 0;
+  virtual void SetDefFontSize(FX_FLOAT fFontSize) = 0;
+  virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
+                                IFDE_CSSStyleSheet* pSheet) = 0;
+  virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType,
+                                 const CFDE_CSSStyleSheetArray* pArray) = 0;
+  virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType,
+                                FDE_CSSSTYLESHEETPRIORITY ePriority) = 0;
+  virtual void UpdateStyleIndex(FX_DWORD dwMediaList) = 0;
+  virtual IFDE_CSSAccelerator* InitAccelerator() = 0;
+  virtual IFDE_CSSComputedStyle* CreateComputedStyle(
+      IFDE_CSSComputedStyle* pParentStyle) = 0;
+  virtual int32_t MatchDeclarations(
+      IFDE_CSSTagProvider* pTag,
+      CFDE_CSSDeclarationArray& matchedDecls,
+      FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE) = 0;
+  virtual void ComputeStyle(IFDE_CSSTagProvider* pTag,
+                            const IFDE_CSSDeclaration** ppDeclArray,
+                            int32_t iDeclCount,
+                            IFDE_CSSComputedStyle* pDestStyle) = 0;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSS_H_
diff --git a/xfa/fde/css/fde_csscache.cpp b/xfa/fde/css/fde_csscache.cpp
new file mode 100644
index 0000000..aba863e
--- /dev/null
+++ b/xfa/fde/css/fde_csscache.cpp
@@ -0,0 +1,149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_csscache.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_ext.h"
+
+FDE_CSSCacheItem::FDE_CSSCacheItem(IFDE_CSSStyleSheet* p)
+    : pStylesheet(p), dwActivity(0) {
+  FXSYS_assert(pStylesheet);
+  pStylesheet->AddRef();
+}
+FDE_CSSCacheItem::~FDE_CSSCacheItem() {
+  pStylesheet->Release();
+}
+IFDE_CSSStyleSheetCache* IFDE_CSSStyleSheetCache::Create() {
+  return new CFDE_CSSStyleSheetCache;
+}
+
+CFDE_CSSStyleSheetCache::CFDE_CSSStyleSheetCache()
+    : m_pFixedStore(NULL), m_iMaxItems(5) {}
+
+CFDE_CSSStyleSheetCache::~CFDE_CSSStyleSheetCache() {
+  for (const auto& pair : m_Stylesheets) {
+    FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, pair.second);
+  }
+  m_Stylesheets.clear();
+  if (m_pFixedStore) {
+    m_pFixedStore->Release();
+  }
+}
+void CFDE_CSSStyleSheetCache::AddStyleSheet(const CFX_ByteStringC& szKey,
+                                            IFDE_CSSStyleSheet* pStyleSheet) {
+  FXSYS_assert(pStyleSheet != NULL);
+  if (m_pFixedStore == NULL) {
+    m_pFixedStore =
+        FX_CreateAllocator(FX_ALLOCTYPE_Fixed, std::max(10, m_iMaxItems),
+                           sizeof(FDE_CSSCacheItem));
+    FXSYS_assert(m_pFixedStore != NULL);
+  }
+  auto it = m_Stylesheets.find(szKey);
+  if (it != m_Stylesheets.end()) {
+    FDE_CSSCacheItem* pItem = it->second;
+    if (pItem->pStylesheet != pStyleSheet) {
+      pItem->pStylesheet->Release();
+      pItem->pStylesheet = pStyleSheet;
+      pItem->pStylesheet->AddRef();
+      pItem->dwActivity = 0;
+    }
+  } else {
+    while (static_cast<int32_t>(m_Stylesheets.size()) >= m_iMaxItems) {
+      RemoveLowestActivityItem();
+    }
+    m_Stylesheets[szKey] =
+        FXTARGET_NewWith(m_pFixedStore) FDE_CSSCacheItem(pStyleSheet);
+  }
+}
+IFDE_CSSStyleSheet* CFDE_CSSStyleSheetCache::GetStyleSheet(
+    const CFX_ByteStringC& szKey) const {
+  auto it = m_Stylesheets.find(szKey);
+  if (it == m_Stylesheets.end()) {
+    return nullptr;
+  }
+  FDE_CSSCacheItem* pItem = it->second;
+  pItem->dwActivity++;
+  pItem->pStylesheet->AddRef();
+  return pItem->pStylesheet;
+}
+void CFDE_CSSStyleSheetCache::RemoveStyleSheet(const CFX_ByteStringC& szKey) {
+  auto it = m_Stylesheets.find(szKey);
+  if (it == m_Stylesheets.end()) {
+    return;
+  }
+  FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, it->second);
+  m_Stylesheets.erase(it);
+}
+void CFDE_CSSStyleSheetCache::RemoveLowestActivityItem() {
+  auto found = m_Stylesheets.end();
+  for (auto it = m_Stylesheets.begin(); it != m_Stylesheets.end(); ++it) {
+    switch (it->first.GetID()) {
+      case FXBSTR_ID('#', 'U', 'S', 'E'):
+      case FXBSTR_ID('#', 'A', 'G', 'E'):
+        continue;
+    }
+    if (found == m_Stylesheets.end() ||
+        it->second->dwActivity > found->second->dwActivity) {
+      found = it;
+    }
+  }
+  if (found != m_Stylesheets.end()) {
+    FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, found->second);
+    m_Stylesheets.erase(found);
+  }
+}
+FDE_CSSTagCache::FDE_CSSTagCache(FDE_CSSTagCache* parent,
+                                 IFDE_CSSTagProvider* tag)
+    : pTag(tag),
+      pParent(parent),
+      dwIDHash(0),
+      dwTagHash(0),
+      iClassIndex(0),
+      dwClassHashs(1) {
+  FXSYS_assert(pTag != NULL);
+  CFX_WideStringC wsValue, wsName = pTag->GetTagName();
+  dwTagHash =
+      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
+  FX_POSITION pos = pTag->GetFirstAttribute();
+  while (pos != NULL) {
+    pTag->GetNextAttribute(pos, wsName, wsValue);
+    FX_DWORD dwNameHash =
+        FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
+    static const FX_DWORD s_dwIDHash = FX_HashCode_String_GetW(L"id", 2, TRUE);
+    static const FX_DWORD s_dwClassHash =
+        FX_HashCode_String_GetW(L"class", 5, TRUE);
+    if (dwNameHash == s_dwClassHash) {
+      FX_DWORD dwHash =
+          FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
+      dwClassHashs.Add(dwHash);
+    } else if (dwNameHash == s_dwIDHash) {
+      dwIDHash = FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
+    }
+  }
+}
+FDE_CSSTagCache::FDE_CSSTagCache(const FDE_CSSTagCache& it)
+    : pTag(it.pTag),
+      pParent(it.pParent),
+      dwIDHash(it.dwIDHash),
+      dwTagHash(it.dwTagHash),
+      iClassIndex(0),
+      dwClassHashs(1) {
+  if (it.dwClassHashs.GetSize() > 0) {
+    dwClassHashs.Copy(it.dwClassHashs);
+  }
+}
+void CFDE_CSSAccelerator::OnEnterTag(IFDE_CSSTagProvider* pTag) {
+  FDE_CSSTagCache* pTop = GetTopElement();
+  FDE_CSSTagCache item(pTop, pTag);
+  m_Stack.Push(item);
+}
+void CFDE_CSSAccelerator::OnLeaveTag(IFDE_CSSTagProvider* pTag) {
+  FXSYS_assert(m_Stack.GetTopElement());
+  FXSYS_assert(m_Stack.GetTopElement()->GetTag() == pTag);
+  m_Stack.Pop();
+}
diff --git a/xfa/fde/css/fde_csscache.h b/xfa/fde/css/fde_csscache.h
new file mode 100644
index 0000000..b886424
--- /dev/null
+++ b/xfa/fde/css/fde_csscache.h
@@ -0,0 +1,85 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSCACHE_H_
+#define XFA_FDE_CSS_FDE_CSSCACHE_H_
+
+#include <map>
+
+#include "xfa/fde/css/fde_css.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class FDE_CSSCacheItem : public CFX_Target {
+ public:
+  explicit FDE_CSSCacheItem(IFDE_CSSStyleSheet* p);
+  ~FDE_CSSCacheItem();
+
+  IFDE_CSSStyleSheet* pStylesheet;
+  FX_DWORD dwActivity;
+};
+
+class CFDE_CSSStyleSheetCache : public IFDE_CSSStyleSheetCache,
+                                public CFX_Target {
+ public:
+  CFDE_CSSStyleSheetCache();
+  ~CFDE_CSSStyleSheetCache();
+  virtual void Release() { delete this; }
+
+  virtual void SetMaxItems(int32_t iMaxCount = 5) {
+    FXSYS_assert(iMaxCount >= 3);
+    m_iMaxItems = iMaxCount;
+  }
+
+  virtual void AddStyleSheet(const CFX_ByteStringC& szKey,
+                             IFDE_CSSStyleSheet* pStyleSheet);
+  virtual IFDE_CSSStyleSheet* GetStyleSheet(const CFX_ByteStringC& szKey) const;
+  virtual void RemoveStyleSheet(const CFX_ByteStringC& szKey);
+
+ protected:
+  void RemoveLowestActivityItem();
+  std::map<CFX_ByteString, FDE_CSSCacheItem*> m_Stylesheets;
+  IFX_MEMAllocator* m_pFixedStore;
+  int32_t m_iMaxItems;
+};
+
+class FDE_CSSTagCache : public CFX_Target {
+ public:
+  FDE_CSSTagCache(FDE_CSSTagCache* parent, IFDE_CSSTagProvider* tag);
+  FDE_CSSTagCache(const FDE_CSSTagCache& it);
+  FDE_CSSTagCache* GetParent() const { return pParent; }
+  IFDE_CSSTagProvider* GetTag() const { return pTag; }
+  FX_DWORD HashID() const { return dwIDHash; }
+  FX_DWORD HashTag() const { return dwTagHash; }
+  int32_t CountHashClass() const { return dwClassHashs.GetSize(); }
+  void SetClassIndex(int32_t index) { iClassIndex = index; }
+  FX_DWORD HashClass() const {
+    return iClassIndex < dwClassHashs.GetSize()
+               ? dwClassHashs.GetAt(iClassIndex)
+               : 0;
+  }
+
+ protected:
+  IFDE_CSSTagProvider* pTag;
+  FDE_CSSTagCache* pParent;
+  FX_DWORD dwIDHash;
+  FX_DWORD dwTagHash;
+  int32_t iClassIndex;
+  CFDE_DWordArray dwClassHashs;
+};
+typedef CFX_ObjectStackTemplate<FDE_CSSTagCache> CFDE_CSSTagStack;
+
+class CFDE_CSSAccelerator : public IFDE_CSSAccelerator, public CFX_Target {
+ public:
+  virtual void OnEnterTag(IFDE_CSSTagProvider* pTag);
+  virtual void OnLeaveTag(IFDE_CSSTagProvider* pTag);
+  void Clear() { m_Stack.RemoveAll(); }
+  FDE_CSSTagCache* GetTopElement() const { return m_Stack.GetTopElement(); }
+
+ protected:
+  CFDE_CSSTagStack m_Stack;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSSCACHE_H_
diff --git a/xfa/fde/css/fde_cssdatatable.cpp b/xfa/fde/css/fde_cssdatatable.cpp
new file mode 100644
index 0000000..ef09e99
--- /dev/null
+++ b/xfa/fde/css/fde_cssdatatable.cpp
@@ -0,0 +1,889 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_cssdatatable.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_algorithm.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_system.h"
+
+FX_BOOL FDE_CSSLengthToFloat(const FDE_CSSLENGTH& len,
+                             FX_FLOAT fPercentBase,
+                             FX_FLOAT& fResult) {
+  switch (len.GetUnit()) {
+    case FDE_CSSLENGTHUNIT_Point:
+      fResult = len.GetValue();
+      return TRUE;
+    case FDE_CSSLENGTHUNIT_Percent:
+      fResult = len.GetValue() * fPercentBase;
+      return TRUE;
+    default:
+      return FALSE;
+  }
+}
+CFX_FloatRect FDE_CSSBoundaryToRect(IFDE_CSSBoundaryStyle* pBoundStyle,
+                                    FX_FLOAT fContainerWidth,
+                                    FX_BOOL bPadding,
+                                    FX_BOOL bBorder,
+                                    FX_BOOL bMargin) {
+  FXSYS_assert(pBoundStyle != NULL);
+  FX_FLOAT fResult;
+  const FDE_CSSRECT* pRect;
+  CFX_FloatRect rect(0, 0, 0, 0);
+  if (bPadding) {
+    pRect = pBoundStyle->GetPaddingWidth();
+    if (pRect != NULL) {
+      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
+        rect.left += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
+        rect.top += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
+        rect.right += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
+        rect.bottom += fResult;
+      }
+    }
+  }
+  if (bBorder) {
+    pRect = pBoundStyle->GetBorderWidth();
+    if (pRect != NULL) {
+      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
+        rect.left += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
+        rect.top += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
+        rect.right += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
+        rect.bottom += fResult;
+      }
+    }
+  }
+  if (bMargin) {
+    pRect = pBoundStyle->GetMarginWidth();
+    if (pRect != NULL) {
+      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
+        rect.left += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
+        rect.top += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
+        rect.right += fResult;
+      }
+      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
+        rect.bottom += fResult;
+      }
+    }
+  }
+  return rect;
+}
+FX_DWORD FDE_CSSFontStyleToFDE(IFDE_CSSFontStyle* pFontStyle) {
+  FXSYS_assert(pFontStyle != NULL);
+  FX_DWORD dwFontStyle = FX_FONTSTYLE_Normal;
+  if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) {
+    dwFontStyle |= FX_FONTSTYLE_Italic;
+  }
+  if (pFontStyle->GetFontWeight() >= 700) {
+    dwFontStyle |= FX_FONTSTYLE_Bold;
+  }
+  return dwFontStyle;
+}
+static const FDE_CSSPROPERTYTABLE g_FDE_CSSProperties[] = {
+    {FDE_CSSPROPERTY_WritingMode, L"writing-mode", 0x01878076,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_ColumnRuleWidth, L"column-rule-width", 0x0200FB00,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderLeft, L"border-left", 0x04080036,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_ColumnRule, L"column-rule", 0x04C83DF3,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_Height, L"height", 0x05A5C519,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_CounterReset, L"counter-reset", 0x0894F9B0,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_Content, L"content", 0x097BE91B,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeURI | FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_RubyPosition, L"ruby-position", 0x09ACD024,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BackgroundColor, L"background-color", 0x09E8E8AC,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_Width, L"width", 0x0A8A8F80,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Src, L"src", 0x0BD37048,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeURI},
+    {FDE_CSSPROPERTY_Top, L"top", 0x0BEDAF33, FDE_CSSVALUETYPE_Primitive |
+                                                  FDE_CSSVALUETYPE_MaybeEnum |
+                                                  FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Margin, L"margin", 0x0CB016BE,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderColor, L"border-color", 0x0CBB528A,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_Widows, L"widows", 0x1026C59D,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderBottomColor, L"border-bottom-color", 0x121E22EC,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_TextIndent, L"text-indent", 0x169ADB74,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Right, L"right", 0x193ADE3E,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_TextEmphasisStyle, L"text-emphasis-style", 0x20DBAF4A,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_PaddingLeft, L"padding-left", 0x228CF02F,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_ColumnWidth, L"column-width", 0x24C9AC9B,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_MarginLeft, L"margin-left", 0x297C5656,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
+         FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Border, L"border", 0x2A23349E, FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_BorderTop, L"border-top", 0x2B866ADE,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_RubyOverhang, L"ruby-overhang", 0x2CCA0D89,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_PageBreakBefore, L"page-break-before", 0x3119B36F,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_MaxHeight, L"max-height", 0x343597EC,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_MinWidth, L"min-width", 0x35832871,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderLeftColor, L"border-left-color", 0x35C64022,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_Bottom, L"bottom", 0x399F02B5,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Quotes, L"quotes", 0x3D8C6A01,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_MaxWidth, L"max-width", 0x3EA274F3,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_PaddingRight, L"padding-right", 0x3F616AC2,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_ListStyleImage, L"list-style-image", 0x42A8A86A,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeURI},
+    {FDE_CSSPROPERTY_WhiteSpace, L"white-space", 0x42F0429A,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderBottom, L"border-bottom", 0x452CE780,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_ListStyleType, L"list-style-type", 0x48094789,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_WordBreak, L"word-break", 0x4D74A3CE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_OverflowX, L"overflow-x", 0x4ECEBF99,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_OverflowY, L"overflow-y", 0x4ECEBF9A,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderTopColor, L"border-top-color", 0x5109B8CA,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_FontFamily, L"font-family", 0x574686E6,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_Cursor, L"cursor", 0x59DFCA5E,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_RubyAlign, L"ruby-align", 0x6077BDFA,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_ColumnRuleColor, L"column-rule-color", 0x65DDFD9F,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_FontWeight, L"font-weight", 0x6692F60C,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderRightStyle, L"border-right-style", 0x6920DDA7,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_MinHeight, L"min-height", 0x6AAE312A,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Color, L"color", 0x6E67921F,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_LetterSpacing, L"letter-spacing", 0x70536102,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_EmptyCells, L"empty-cells", 0x7531528F,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_TextAlign, L"text-align", 0x7553F1BD,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_RubySpan, L"ruby-span", 0x76FCFCE1,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeFunction},
+    {FDE_CSSPROPERTY_Position, L"position", 0x814F82B5,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderStyle, L"border-style", 0x82A4CD5C,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderBottomStyle, L"border-bottom-style", 0x88079DBE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderCollapse, L"border-collapse", 0x8883C7FE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_ColumnCount, L"column-count", 0x89936A64,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderRightWidth, L"border-right-width", 0x8F5A6036,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_UnicodeBidi, L"unicode-bidi", 0x91670F6C,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_VerticalAlign, L"vertical-align", 0x934A87D2,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_PaddingTop, L"padding-top", 0x959D22B7,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Columns, L"columns", 0x96FA5D81,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_Overflow, L"overflow", 0x97B76B54,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_TableLayout, L"table-layout", 0x9B1CB4B3,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_FontVariant, L"font-variant", 0x9C785779,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_ListStyle, L"list-style", 0x9E6C471A,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_BackgroundPosition, L"background-position", 0xA8846D22,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderWidth, L"border-width", 0xA8DE4FEB,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_TextEmphasisColor, L"text-emphasis-color", 0xAAF23478,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_BorderLeftStyle, L"border-left-style", 0xABAFBAF4,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_PageBreakInside, L"page-break-inside", 0xACB695F8,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_TextEmphasis, L"text-emphasis", 0xAD0E580C,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_BorderBottomWidth, L"border-bottom-width", 0xAE41204D,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_ColumnGap, L"column-gap", 0xB5C1BA73,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Orphans, L"orphans", 0xB716467B,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderRight, L"border-right", 0xB78E9EA9,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_FontSize, L"font-size", 0xB93956DF,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_PageBreakAfter, L"page-break-after", 0xBC358AEE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_CaptionSide, L"caption-side", 0xC03F3560,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BackgroundRepeat, L"background-repeat", 0xC2C2FDCE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderTopStyle, L"border-top-style", 0xC6F3339C,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderSpacing, L"border-spacing", 0xC72030F0,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_TextTransform, L"text-transform", 0xC88EEA6E,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_FontStyle, L"font-style", 0xCB1950F5,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Font, L"font", 0xCD308B77, FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_LineHeight, L"line-height", 0xCFCACE2E,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_MarginRight, L"margin-right", 0xD13C58C9,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
+         FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Float, L"float", 0xD1532876,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BorderLeftWidth, L"border-left-width", 0xD1E93D83,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_Display, L"display", 0xD4224C36,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Clear, L"clear", 0xD8ED1467,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_ColumnRuleStyle, L"column-rule-style", 0xDBC77871,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_TextCombine, L"text-combine", 0xDC5207CF,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_ListStylePosition, L"list-style-position", 0xE1A1DE3C,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Visibility, L"visibility", 0xE29F5168,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_PaddingBottom, L"padding-bottom", 0xE555B3B9,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BackgroundAttachment, L"background-attachment", 0xE77981F6,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_BackgroundImage, L"background-image", 0xE9AEB710,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeURI},
+    {FDE_CSSPROPERTY_LineBreak, L"line-break", 0xEA2D1D9A,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Background, L"background", 0xEB49DD40,
+     FDE_CSSVALUETYPE_Shorthand},
+    {FDE_CSSPROPERTY_BorderTopWidth, L"border-top-width", 0xED2CB62B,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_WordSpacing, L"word-spacing", 0xEDA63BAE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_BorderRightColor, L"border-right-color", 0xF33762D5,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeColor},
+    {FDE_CSSPROPERTY_CounterIncrement, L"counter-increment", 0xF4CFB1B2,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString},
+    {FDE_CSSPROPERTY_Left, L"left", 0xF5AD782B,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
+         FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_TextDecoration, L"text-decoration", 0xF7C634BA,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Padding, L"padding", 0xF8C373F7,
+     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber},
+    {FDE_CSSPROPERTY_MarginBottom, L"margin-bottom", 0xF93485A0,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
+         FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_MarginTop, L"margin-top", 0xFE51DCFE,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
+         FDE_CSSVALUETYPE_MaybeEnum},
+    {FDE_CSSPROPERTY_Direction, L"direction", 0xFE746E61,
+     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
+};
+static const FDE_CSSPROPERTYVALUETABLE g_FDE_CSSPropertyValues[] = {
+    {FDE_CSSPROPERTYVALUE_Bolder, L"bolder", 0x009F1058},
+    {FDE_CSSPROPERTYVALUE_LowerLatin, L"lower-latin", 0x016014CE},
+    {FDE_CSSPROPERTYVALUE_Lowercase, L"lowercase", 0x02ACB805},
+    {FDE_CSSPROPERTYVALUE_LowerGreek, L"lower-greek", 0x03D81D64},
+    {FDE_CSSPROPERTYVALUE_Sesame, L"sesame", 0x0432ECDE},
+    {FDE_CSSPROPERTYVALUE_None, L"none", 0x048B6670},
+    {FDE_CSSPROPERTYVALUE_NwResize, L"nw-resize", 0x054B4BE4},
+    {FDE_CSSPROPERTYVALUE_WResize, L"w-resize", 0x0A2F8D76},
+    {FDE_CSSPROPERTYVALUE_Dot, L"dot", 0x0A48CB27},
+    {FDE_CSSPROPERTYVALUE_End, L"end", 0x0A631437},
+    {FDE_CSSPROPERTYVALUE_Ltr, L"ltr", 0x0B1B56D2},
+    {FDE_CSSPROPERTYVALUE_Pre, L"pre", 0x0B848587},
+    {FDE_CSSPROPERTYVALUE_Rtl, L"rtl", 0x0BB92C52},
+    {FDE_CSSPROPERTYVALUE_Sub, L"sub", 0x0BD37FAA},
+    {FDE_CSSPROPERTYVALUE_Top, L"top", 0x0BEDAF33},
+    {FDE_CSSPROPERTYVALUE_Visible, L"visible", 0x0F55D7EE},
+    {FDE_CSSPROPERTYVALUE_Filled, L"filled", 0x10827DD0},
+    {FDE_CSSPROPERTYVALUE_SwResize, L"sw-resize", 0x10B548E9},
+    {FDE_CSSPROPERTYVALUE_NoRepeat, L"no-repeat", 0x1235C18B},
+    {FDE_CSSPROPERTYVALUE_Default, L"default", 0x14DA2125},
+    {FDE_CSSPROPERTYVALUE_Transparent, L"transparent", 0x17B64DB2},
+    {FDE_CSSPROPERTYVALUE_Ridge, L"ridge", 0x18EBEE4B},
+    {FDE_CSSPROPERTYVALUE_Right, L"right", 0x193ADE3E},
+    {FDE_CSSPROPERTYVALUE_HorizontalTb, L"horizontal-tb", 0x1A66A86D},
+    {FDE_CSSPROPERTYVALUE_DistributeLetter, L"distribute-letter", 0x1EDBD75C},
+    {FDE_CSSPROPERTYVALUE_DoubleCircle, L"double-circle", 0x1FF082BA},
+    {FDE_CSSPROPERTYVALUE_Ruby, L"ruby", 0x20D66C02},
+    {FDE_CSSPROPERTYVALUE_Collapse, L"collapse", 0x2128D673},
+    {FDE_CSSPROPERTYVALUE_Normal, L"normal", 0x247CF3E9},
+    {FDE_CSSPROPERTYVALUE_Avoid, L"avoid", 0x24E684B3},
+    {FDE_CSSPROPERTYVALUE_UpperRoman, L"upper-roman", 0x28BAC2B6},
+    {FDE_CSSPROPERTYVALUE_Auto, L"auto", 0x2B35B6D9},
+    {FDE_CSSPROPERTYVALUE_Text, L"text", 0x2D08AF85},
+    {FDE_CSSPROPERTYVALUE_XSmall, L"x-small", 0x2D2FCAFE},
+    {FDE_CSSPROPERTYVALUE_Thin, L"thin", 0x2D574D53},
+    {FDE_CSSPROPERTYVALUE_Repeat, L"repeat", 0x306614A1},
+    {FDE_CSSPROPERTYVALUE_Small, L"small", 0x316A3739},
+    {FDE_CSSPROPERTYVALUE_NeResize, L"ne-resize", 0x31FD5E12},
+    {FDE_CSSPROPERTYVALUE_NoContent, L"no-content", 0x33A1C545},
+    {FDE_CSSPROPERTYVALUE_Outside, L"outside", 0x36DF693D},
+    {FDE_CSSPROPERTYVALUE_EResize, L"e-resize", 0x36E19FA4},
+    {FDE_CSSPROPERTYVALUE_TableRow, L"table-row", 0x3912A02D},
+    {FDE_CSSPROPERTYVALUE_Bottom, L"bottom", 0x399F02B5},
+    {FDE_CSSPROPERTYVALUE_Underline, L"underline", 0x3A0273A6},
+    {FDE_CSSPROPERTYVALUE_CjkIdeographic, L"cjk-ideographic", 0x3A641CC4},
+    {FDE_CSSPROPERTYVALUE_SeResize, L"se-resize", 0x3D675B17},
+    {FDE_CSSPROPERTYVALUE_Fixed, L"fixed", 0x3D7DEB10},
+    {FDE_CSSPROPERTYVALUE_Double, L"double", 0x3D98515B},
+    {FDE_CSSPROPERTYVALUE_Solid, L"solid", 0x40623B5B},
+    {FDE_CSSPROPERTYVALUE_RubyBaseGroup, L"ruby-base-group", 0x41014E84},
+    {FDE_CSSPROPERTYVALUE_OpenQuote, L"open-quote", 0x44A41E8D},
+    {FDE_CSSPROPERTYVALUE_Lighter, L"lighter", 0x45BEB7AF},
+    {FDE_CSSPROPERTYVALUE_LowerRoman, L"lower-roman", 0x5044D253},
+    {FDE_CSSPROPERTYVALUE_Strict, L"strict", 0x52F4EBD9},
+    {FDE_CSSPROPERTYVALUE_TableCaption, L"table-caption", 0x5325CD63},
+    {FDE_CSSPROPERTYVALUE_Oblique, L"oblique", 0x53EBDDB1},
+    {FDE_CSSPROPERTYVALUE_Decimal, L"decimal", 0x54034C2F},
+    {FDE_CSSPROPERTYVALUE_Loose, L"loose", 0x54D3A1E2},
+    {FDE_CSSPROPERTYVALUE_Hebrew, L"hebrew", 0x565792DD},
+    {FDE_CSSPROPERTYVALUE_Hidden, L"hidden", 0x573CB40C},
+    {FDE_CSSPROPERTYVALUE_Dashed, L"dashed", 0x58A3DD29},
+    {FDE_CSSPROPERTYVALUE_Embed, L"embed", 0x59C8F27D},
+    {FDE_CSSPROPERTYVALUE_TableRowGroup, L"table-row-group", 0x5A43BD07},
+    {FDE_CSSPROPERTYVALUE_TableColumn, L"table-column", 0x5E705DA3},
+    {FDE_CSSPROPERTYVALUE_Static, L"static", 0x5E7555E8},
+    {FDE_CSSPROPERTYVALUE_Outset, L"outset", 0x61236164},
+    {FDE_CSSPROPERTYVALUE_DecimalLeadingZero, L"decimal-leading-zero",
+     0x61DFC55D},
+    {FDE_CSSPROPERTYVALUE_KeepWords, L"keep-words", 0x63964801},
+    {FDE_CSSPROPERTYVALUE_KatakanaIroha, L"katakana-iroha", 0x65D7C91C},
+    {FDE_CSSPROPERTYVALUE_Super, L"super", 0x6A4F842F},
+    {FDE_CSSPROPERTYVALUE_Center, L"center", 0x6C51AFC1},
+    {FDE_CSSPROPERTYVALUE_TableHeaderGroup, L"table-header-group", 0x706103D8},
+    {FDE_CSSPROPERTYVALUE_Inside, L"inside", 0x709CB0FC},
+    {FDE_CSSPROPERTYVALUE_XxLarge, L"xx-large", 0x70BB1508},
+    {FDE_CSSPROPERTYVALUE_Triangle, L"triangle", 0x7524EDF6},
+    {FDE_CSSPROPERTYVALUE_RubyTextGroup, L"ruby-text-group", 0x78C2B98E},
+    {FDE_CSSPROPERTYVALUE_Circle, L"circle", 0x7ABEC0D2},
+    {FDE_CSSPROPERTYVALUE_Hiragana, L"hiragana", 0x7BF5E25B},
+    {FDE_CSSPROPERTYVALUE_RepeatX, L"repeat-x", 0x7C8F3226},
+    {FDE_CSSPROPERTYVALUE_RepeatY, L"repeat-y", 0x7C8F3227},
+    {FDE_CSSPROPERTYVALUE_Move, L"move", 0x7DA03417},
+    {FDE_CSSPROPERTYVALUE_HiraganaIroha, L"hiragana-iroha", 0x7EE863FB},
+    {FDE_CSSPROPERTYVALUE_RubyBase, L"ruby-base", 0x7FD1B1EA},
+    {FDE_CSSPROPERTYVALUE_Scroll, L"scroll", 0x84787AEF},
+    {FDE_CSSPROPERTYVALUE_Smaller, L"smaller", 0x849769F0},
+    {FDE_CSSPROPERTYVALUE_TableFooterGroup, L"table-footer-group", 0x85BDD97E},
+    {FDE_CSSPROPERTYVALUE_Baseline, L"baseline", 0x87436BA3},
+    {FDE_CSSPROPERTYVALUE_Separate, L"separate", 0x877C66B5},
+    {FDE_CSSPROPERTYVALUE_Armenian, L"armenian", 0x889BE4EB},
+    {FDE_CSSPROPERTYVALUE_Open, L"open", 0x8B90E1F2},
+    {FDE_CSSPROPERTYVALUE_Relative, L"relative", 0x8C995B5C},
+    {FDE_CSSPROPERTYVALUE_Thick, L"thick", 0x8CC35EB3},
+    {FDE_CSSPROPERTYVALUE_Justify, L"justify", 0x8D269CAE},
+    {FDE_CSSPROPERTYVALUE_Middle, L"middle", 0x947FA00F},
+    {FDE_CSSPROPERTYVALUE_Always, L"always", 0x959AB231},
+    {FDE_CSSPROPERTYVALUE_DistributeSpace, L"distribute-space", 0x97A20E58},
+    {FDE_CSSPROPERTYVALUE_LineEdge, L"line-edge", 0x9A845D2A},
+    {FDE_CSSPROPERTYVALUE_PreWrap, L"pre-wrap", 0x9D59588E},
+    {FDE_CSSPROPERTYVALUE_Medium, L"medium", 0xA084A381},
+    {FDE_CSSPROPERTYVALUE_NResize, L"n-resize", 0xA088968D},
+    {FDE_CSSPROPERTYVALUE_ListItem, L"list-item", 0xA32382B8},
+    {FDE_CSSPROPERTYVALUE_Show, L"show", 0xA66C10C1},
+    {FDE_CSSPROPERTYVALUE_Currentcolor, L"currentColor", 0xA7883922},
+    {FDE_CSSPROPERTYVALUE_NoCloseQuote, L"no-close-quote", 0xA79CBFFB},
+    {FDE_CSSPROPERTYVALUE_VerticalLr, L"vertical-lr", 0xA8673F65},
+    {FDE_CSSPROPERTYVALUE_VerticalRl, L"vertical-rl", 0xA8675E25},
+    {FDE_CSSPROPERTYVALUE_Pointer, L"pointer", 0xA90929C1},
+    {FDE_CSSPROPERTYVALUE_XxSmall, L"xx-small", 0xADE1FC76},
+    {FDE_CSSPROPERTYVALUE_Bold, L"bold", 0xB18313A1},
+    {FDE_CSSPROPERTYVALUE_Both, L"both", 0xB1833CAD},
+    {FDE_CSSPROPERTYVALUE_SmallCaps, L"small-caps", 0xB299428D},
+    {FDE_CSSPROPERTYVALUE_Katakana, L"katakana", 0xB421A4BC},
+    {FDE_CSSPROPERTYVALUE_After, L"after", 0xB6B44172},
+    {FDE_CSSPROPERTYVALUE_Horizontal, L"horizontal", 0xB7732DEA},
+    {FDE_CSSPROPERTYVALUE_Dotted, L"dotted", 0xB88652A4},
+    {FDE_CSSPROPERTYVALUE_Disc, L"disc", 0xBEBC18C3},
+    {FDE_CSSPROPERTYVALUE_Georgian, L"georgian", 0xBEF99E8C},
+    {FDE_CSSPROPERTYVALUE_Inline, L"inline", 0xC02D649F},
+    {FDE_CSSPROPERTYVALUE_Overline, L"overline", 0xC0EC9FA4},
+    {FDE_CSSPROPERTYVALUE_Wait, L"wait", 0xC1613BB5},
+    {FDE_CSSPROPERTYVALUE_BreakAll, L"break-all", 0xC3145BAB},
+    {FDE_CSSPROPERTYVALUE_UpperAlpha, L"upper-alpha", 0xC52D4A9F},
+    {FDE_CSSPROPERTYVALUE_Capitalize, L"capitalize", 0xC5321D46},
+    {FDE_CSSPROPERTYVALUE_Nowrap, L"nowrap", 0xC7994417},
+    {FDE_CSSPROPERTYVALUE_TextBottom, L"text-bottom", 0xC7D08D87},
+    {FDE_CSSPROPERTYVALUE_NoOpenQuote, L"no-open-quote", 0xC8CD7877},
+    {FDE_CSSPROPERTYVALUE_Groove, L"groove", 0xCB24A412},
+    {FDE_CSSPROPERTYVALUE_Progress, L"progress", 0xCD1D9835},
+    {FDE_CSSPROPERTYVALUE_Larger, L"larger", 0xCD3C409D},
+    {FDE_CSSPROPERTYVALUE_CloseQuote, L"close-quote", 0xCF8696D1},
+    {FDE_CSSPROPERTYVALUE_TableCell, L"table-cell", 0xCFB5E595},
+    {FDE_CSSPROPERTYVALUE_PreLine, L"pre-line", 0xD04FEDBC},
+    {FDE_CSSPROPERTYVALUE_Absolute, L"absolute", 0xD0B2D55F},
+    {FDE_CSSPROPERTYVALUE_InlineTable, L"inline-table", 0xD131F494},
+    {FDE_CSSPROPERTYVALUE_BidiOverride, L"bidi-override", 0xD161FDE5},
+    {FDE_CSSPROPERTYVALUE_InlineBlock, L"inline-block", 0xD26A8BD7},
+    {FDE_CSSPROPERTYVALUE_Inset, L"inset", 0xD6F23243},
+    {FDE_CSSPROPERTYVALUE_Crosshair, L"crosshair", 0xD6F8018E},
+    {FDE_CSSPROPERTYVALUE_UpperLatin, L"upper-latin", 0xD9D60531},
+    {FDE_CSSPROPERTYVALUE_Help, L"help", 0xDA002969},
+    {FDE_CSSPROPERTYVALUE_Hide, L"hide", 0xDA69395A},
+    {FDE_CSSPROPERTYVALUE_Uppercase, L"uppercase", 0xDAD595A8},
+    {FDE_CSSPROPERTYVALUE_SResize, L"s-resize", 0xDB3AADF2},
+    {FDE_CSSPROPERTYVALUE_Table, L"table", 0xDB9BE968},
+    {FDE_CSSPROPERTYVALUE_Blink, L"blink", 0xDC36E390},
+    {FDE_CSSPROPERTYVALUE_Block, L"block", 0xDCD480AB},
+    {FDE_CSSPROPERTYVALUE_Start, L"start", 0xE1D9D5AE},
+    {FDE_CSSPROPERTYVALUE_TableColumnGroup, L"table-column-group", 0xE2258EFD},
+    {FDE_CSSPROPERTYVALUE_Italic, L"italic", 0xE31D5396},
+    {FDE_CSSPROPERTYVALUE_LineThrough, L"line-through", 0xE4C5A276},
+    {FDE_CSSPROPERTYVALUE_KeepAll, L"keep-all", 0xE704A72B},
+    {FDE_CSSPROPERTYVALUE_LowerAlpha, L"lower-alpha", 0xECB75A3C},
+    {FDE_CSSPROPERTYVALUE_RunIn, L"run-in", 0xEEC930B9},
+    {FDE_CSSPROPERTYVALUE_Square, L"square", 0xEF85D351},
+    {FDE_CSSPROPERTYVALUE_XLarge, L"x-large", 0xF008E390},
+    {FDE_CSSPROPERTYVALUE_Large, L"large", 0xF4434FCB},
+    {FDE_CSSPROPERTYVALUE_Before, L"before", 0xF4FFCE73},
+    {FDE_CSSPROPERTYVALUE_Left, L"left", 0xF5AD782B},
+    {FDE_CSSPROPERTYVALUE_TextTop, L"text-top", 0xFCB58D45},
+    {FDE_CSSPROPERTYVALUE_RubyText, L"ruby-text", 0xFCC77174},
+    {FDE_CSSPROPERTYVALUE_NoDisplay, L"no-display", 0xFE482860},
+};
+static const FDE_CSSMEDIATYPETABLE g_FDE_CSSMediaTypes[] = {
+    {0xF09, 0x02},  {0x4880, 0x20}, {0x536A, 0x80},
+    {0x741D, 0x10}, {0x76ED, 0x08}, {0x7CFB, 0x01},
+    {0x9578, 0x04}, {0xC8E1, 0x40}, {0xD0F9, 0xFF},
+};
+static const FDE_CSSLENGTHUNITTABLE g_FDE_CSSLengthUnits[] = {
+    {0x0672, 3},  {0x067D, 4}, {0x1AF7, 8}, {0x2F7A, 7},
+    {0x3ED3, 10}, {0x3EE4, 9}, {0x3EE8, 5}, {0xFC30, 6},
+};
+static const FDE_CSSCOLORTABLE g_FDE_CSSColors[] = {
+    {0x031B47FE, 0xff000080}, {0x0BB8DF5B, 0xffff0000},
+    {0x0D82A78C, 0xff800000}, {0x2ACC82E8, 0xff00ffff},
+    {0x2D083986, 0xff008080}, {0x4A6A6195, 0xffc0c0c0},
+    {0x546A8EF3, 0xff808080}, {0x65C9169C, 0xffffa500},
+    {0x8422BB61, 0xffffffff}, {0x9271A558, 0xff800080},
+    {0xA65A3EE3, 0xffff00ff}, {0xB1345708, 0xff0000ff},
+    {0xB6D2CF1F, 0xff808000}, {0xD19B5E1C, 0xffffff00},
+    {0xDB64391D, 0xff000000}, {0xF616D507, 0xff00ff00},
+    {0xF6EFFF31, 0xff008000},
+};
+static const FDE_CSSPERSUDOTABLE g_FDE_CSSPersudoType[] = {
+    {FDE_CSSPERSUDO_After, L":after", 0x16EE1FEC},
+    {FDE_CSSPERSUDO_Before, L":before", 0x7DCDDE2D},
+};
+FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo) {
+  return (ePersudo < FDE_CSSPERSUDO_NONE) ? (g_FDE_CSSPersudoType + ePersudo)
+                                          : NULL;
+}
+FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(const FX_WCHAR* pszName,
+                                                 int32_t iLength) {
+  FXSYS_assert(pszName != NULL && iLength > 0);
+  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
+  int32_t iEnd = FDE_CSSPROPERTY_MAX - 1;
+  int32_t iMid, iStart = 0;
+  FX_DWORD dwMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    dwMid = g_FDE_CSSProperties[iMid].dwHash;
+    if (dwHash == dwMid) {
+      return g_FDE_CSSProperties + iMid;
+    } else if (dwHash > dwMid) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName) {
+  return (eName < FDE_CSSPROPERTY_MAX) ? (g_FDE_CSSProperties + eName) : NULL;
+}
+FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(
+    const FX_WCHAR* pszName,
+    int32_t iLength) {
+  FXSYS_assert(pszName != NULL && iLength > 0);
+  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
+  int32_t iEnd = FDE_CSSPROPERTYVALUE_MAX - 1;
+  int32_t iMid, iStart = 0;
+  FX_DWORD dwMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    dwMid = g_FDE_CSSPropertyValues[iMid].dwHash;
+    if (dwHash == dwMid) {
+      return g_FDE_CSSPropertyValues + iMid;
+    } else if (dwHash > dwMid) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(
+    FDE_CSSPROPERTYVALUE eName) {
+  return (eName < FDE_CSSPROPERTYVALUE_MAX) ? (g_FDE_CSSPropertyValues + eName)
+                                            : NULL;
+}
+FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(const FX_WCHAR* pszName,
+                                                   int32_t iLength) {
+  FXSYS_assert(pszName != NULL && iLength > 0);
+  FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE);
+  int32_t iEnd =
+      sizeof(g_FDE_CSSMediaTypes) / sizeof(FDE_CSSMEDIATYPETABLE) - 1;
+  int32_t iMid, iStart = 0;
+  FX_WORD uMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    uMid = g_FDE_CSSMediaTypes[iMid].wHash;
+    if (wHash == uMid) {
+      return g_FDE_CSSMediaTypes + iMid;
+    } else if (wHash > uMid) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(const FX_WCHAR* pszName,
+                                                     int32_t iLength) {
+  FXSYS_assert(pszName != NULL && iLength > 0);
+  FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE);
+  int32_t iEnd =
+      sizeof(g_FDE_CSSLengthUnits) / sizeof(FDE_CSSLENGTHUNITTABLE) - 1;
+  int32_t iMid, iStart = 0;
+  FX_WORD wMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    wMid = g_FDE_CSSLengthUnits[iMid].wHash;
+    if (wHash == wMid) {
+      return g_FDE_CSSLengthUnits + iMid;
+    } else if (wHash > wMid) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(const FX_WCHAR* pszName,
+                                           int32_t iLength) {
+  FXSYS_assert(pszName != NULL && iLength > 0);
+  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
+  int32_t iEnd = sizeof(g_FDE_CSSColors) / sizeof(FDE_CSSCOLORTABLE) - 1;
+  int32_t iMid, iStart = 0;
+  FX_DWORD dwMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    dwMid = g_FDE_CSSColors[iMid].dwHash;
+    if (dwHash == dwMid) {
+      return g_FDE_CSSColors + iMid;
+    } else if (dwHash > dwMid) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+FX_BOOL FDE_ParseCSSNumber(const FX_WCHAR* pszValue,
+                           int32_t iValueLen,
+                           FX_FLOAT& fValue,
+                           FDE_CSSPRIMITIVETYPE& eUnit) {
+  FXSYS_assert(pszValue != NULL && iValueLen > 0);
+  int32_t iUsedLen = 0;
+  fValue = FX_wcstof(pszValue, iValueLen, &iUsedLen);
+  if (iUsedLen <= 0) {
+    return FALSE;
+  }
+  iValueLen -= iUsedLen;
+  pszValue += iUsedLen;
+  eUnit = FDE_CSSPRIMITIVETYPE_Number;
+  if (iValueLen >= 1 && *pszValue == '%') {
+    eUnit = FDE_CSSPRIMITIVETYPE_Percent;
+  } else if (iValueLen == 2) {
+    FDE_LPCCSSLENGTHUNITTABLE pUnit = FDE_GetCSSLengthUnitByName(pszValue, 2);
+    if (pUnit != NULL) {
+      eUnit = (FDE_CSSPRIMITIVETYPE)pUnit->wValue;
+    }
+  }
+  return TRUE;
+}
+
+FX_BOOL FDE_ParseCSSString(const FX_WCHAR* pszValue,
+                           int32_t iValueLen,
+                           int32_t& iOffset,
+                           int32_t& iLength) {
+  FXSYS_assert(pszValue != NULL && iValueLen > 0);
+  iOffset = 0;
+  iLength = iValueLen;
+  if (iValueLen >= 2) {
+    FX_WCHAR first = pszValue[0], last = pszValue[iValueLen - 1];
+    if ((first == '\"' && last == '\"') || (first == '\'' && last == '\'')) {
+      iOffset = 1, iLength -= 2;
+    }
+  }
+  return iValueLen > 0;
+}
+
+FX_BOOL FDE_ParseCSSURI(const FX_WCHAR* pszValue,
+                        int32_t iValueLen,
+                        int32_t& iOffset,
+                        int32_t& iLength) {
+  FXSYS_assert(pszValue != NULL && iValueLen > 0);
+  if (iValueLen < 6 || pszValue[iValueLen - 1] != ')' ||
+      FX_wcsnicmp(L"url(", pszValue, 4)) {
+    return FALSE;
+  }
+  if (FDE_ParseCSSString(pszValue + 4, iValueLen - 5, iOffset, iLength)) {
+    iOffset += 4;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+FX_BOOL FDE_ParseCSSColor(const FX_WCHAR* pszValue,
+                          int32_t iValueLen,
+                          FX_ARGB& dwColor) {
+  FXSYS_assert(pszValue != NULL && iValueLen > 0);
+  if (*pszValue == '#') {
+    switch (iValueLen) {
+      case 4: {
+        uint8_t red = FX_Hex2Dec((uint8_t)pszValue[1], (uint8_t)pszValue[1]);
+        uint8_t green = FX_Hex2Dec((uint8_t)pszValue[2], (uint8_t)pszValue[2]);
+        uint8_t blue = FX_Hex2Dec((uint8_t)pszValue[3], (uint8_t)pszValue[3]);
+        dwColor = ArgbEncode(255, red, green, blue);
+      }
+        return TRUE;
+      case 7: {
+        uint8_t red = FX_Hex2Dec((uint8_t)pszValue[1], (uint8_t)pszValue[2]);
+        uint8_t green = FX_Hex2Dec((uint8_t)pszValue[3], (uint8_t)pszValue[4]);
+        uint8_t blue = FX_Hex2Dec((uint8_t)pszValue[5], (uint8_t)pszValue[6]);
+        dwColor = ArgbEncode(255, red, green, blue);
+      }
+        return TRUE;
+    }
+  } else if (iValueLen >= 10) {
+    if (pszValue[iValueLen - 1] != ')' || FX_wcsnicmp(L"rgb(", pszValue, 4)) {
+      return FALSE;
+    }
+    uint8_t rgb[3] = {0};
+    FX_FLOAT fValue;
+    FDE_CSSPRIMITIVETYPE eType;
+    CFDE_CSSValueListParser list(pszValue + 4, iValueLen - 5, ',');
+    for (int32_t i = 0; i < 3; ++i) {
+      if (!list.NextValue(eType, pszValue, iValueLen)) {
+        return FALSE;
+      }
+      if (eType != FDE_CSSPRIMITIVETYPE_Number) {
+        return FALSE;
+      }
+      if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+        return FALSE;
+      }
+      rgb[i] = eType == FDE_CSSPRIMITIVETYPE_Percent
+                   ? FXSYS_round(fValue * 2.55f)
+                   : FXSYS_round(fValue);
+    }
+    dwColor = ArgbEncode(255, rgb[0], rgb[1], rgb[2]);
+    return TRUE;
+  } else {
+    FDE_LPCCSSCOLORTABLE pColor = FDE_GetCSSColorByName(pszValue, iValueLen);
+    if (pColor != NULL) {
+      dwColor = pColor->dwValue;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+CFDE_CSSValueList::CFDE_CSSValueList(IFX_MEMAllocator* pStaticStore,
+                                     const CFDE_CSSValueArray& list) {
+  m_iCount = list.GetSize();
+  int32_t iByteCount = m_iCount * sizeof(IFDE_CSSValue*);
+  m_ppList = (IFDE_CSSValue**)pStaticStore->Alloc(iByteCount);
+  FXSYS_memcpy(m_ppList, list.GetData(), iByteCount);
+}
+FX_BOOL CFDE_CSSValueListParser::NextValue(FDE_CSSPRIMITIVETYPE& eType,
+                                           const FX_WCHAR*& pStart,
+                                           int32_t& iLength) {
+  while (m_pCur < m_pEnd && (*m_pCur <= ' ' || *m_pCur == m_Separator)) {
+    ++m_pCur;
+  }
+  if (m_pCur >= m_pEnd) {
+    return FALSE;
+  }
+  eType = FDE_CSSPRIMITIVETYPE_Unknown;
+  pStart = m_pCur;
+  iLength = 0;
+  FX_WCHAR wch = *m_pCur;
+  if (wch == '#') {
+    iLength = SkipTo(' ');
+    if (iLength == 4 || iLength == 7) {
+      eType = FDE_CSSPRIMITIVETYPE_RGB;
+    }
+  } else if ((wch >= '0' && wch <= '9') || wch == '.' || wch == '-' ||
+             wch == '+') {
+    while (m_pCur < m_pEnd && (*m_pCur > ' ' && *m_pCur != m_Separator)) {
+      ++m_pCur;
+    }
+    iLength = m_pCur - pStart;
+    if (iLength > 0) {
+      eType = FDE_CSSPRIMITIVETYPE_Number;
+    }
+  } else if (wch == '\"' || wch == '\'') {
+    pStart++;
+    iLength = SkipTo(wch) - 1;
+    m_pCur++;
+    eType = FDE_CSSPRIMITIVETYPE_String;
+  } else if (m_pEnd - m_pCur > 5 && m_pCur[3] == '(') {
+    if (FX_wcsnicmp(L"url", m_pCur, 3) == 0) {
+      wch = m_pCur[4];
+      if (wch == '\"' || wch == '\'') {
+        pStart += 5;
+        iLength = SkipTo(wch) - 6;
+        m_pCur += 2;
+      } else {
+        pStart += 4;
+        iLength = SkipTo(')') - 4;
+        m_pCur++;
+      }
+      eType = FDE_CSSPRIMITIVETYPE_URI;
+    } else if (FX_wcsnicmp(L"rgb", m_pCur, 3) == 0) {
+      iLength = SkipTo(')') + 1;
+      m_pCur++;
+      eType = FDE_CSSPRIMITIVETYPE_RGB;
+    }
+  } else {
+    iLength = SkipTo(m_Separator, TRUE, TRUE);
+    eType = FDE_CSSPRIMITIVETYPE_String;
+  }
+  return m_pCur <= m_pEnd && iLength > 0;
+}
+int32_t CFDE_CSSValueListParser::SkipTo(FX_WCHAR wch,
+                                        FX_BOOL bWSSeparator,
+                                        FX_BOOL bBrContinue) {
+  const FX_WCHAR* pStart = m_pCur;
+  if (!bBrContinue) {
+    if (bWSSeparator) {
+      while ((++m_pCur < m_pEnd) && (*m_pCur != wch) && (*m_pCur > ' ')) {
+        continue;
+      }
+    } else {
+      while (++m_pCur < m_pEnd && *m_pCur != wch) {
+        continue;
+      }
+    }
+
+  } else {
+    int32_t iBracketCount = 0;
+    if (bWSSeparator) {
+      while ((m_pCur < m_pEnd) && (*m_pCur != wch) && (*m_pCur > ' ')) {
+        if (*m_pCur == '(') {
+          iBracketCount++;
+        } else if (*m_pCur == ')') {
+          iBracketCount--;
+        }
+        m_pCur++;
+      }
+    } else {
+      while (m_pCur < m_pEnd && *m_pCur != wch) {
+        if (*m_pCur == '(') {
+          iBracketCount++;
+        } else if (*m_pCur == ')') {
+          iBracketCount--;
+        }
+        m_pCur++;
+      }
+    }
+    while (iBracketCount > 0 && m_pCur < m_pEnd) {
+      if (*m_pCur == ')') {
+        iBracketCount--;
+      }
+      m_pCur++;
+    }
+  }
+  return m_pCur - pStart;
+}
diff --git a/xfa/fde/css/fde_cssdatatable.h b/xfa/fde/css/fde_cssdatatable.h
new file mode 100644
index 0000000..ef7e0dc
--- /dev/null
+++ b/xfa/fde/css/fde_cssdatatable.h
@@ -0,0 +1,200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSDATATABLE_H_
+#define XFA_FDE_CSS_FDE_CSSDATATABLE_H_
+
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fde/css/fde_css.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class CFDE_CSSFunction : public CFX_Target {
+ public:
+  CFDE_CSSFunction(const FX_WCHAR* pszFuncName, IFDE_CSSValueList* pArgList)
+      : m_pArgList(pArgList), m_pszFuncName(pszFuncName) {
+    FXSYS_assert(pArgList != NULL);
+  }
+  int32_t CountArgs() const { return m_pArgList->CountValues(); }
+  IFDE_CSSValue* GetArgs(int32_t index) const {
+    return m_pArgList->GetValue(index);
+  }
+  const FX_WCHAR* GetFuncName() const { return m_pszFuncName; }
+
+ protected:
+  IFDE_CSSValueList* m_pArgList;
+  const FX_WCHAR* m_pszFuncName;
+};
+class CFDE_CSSPrimitiveValue : public IFDE_CSSPrimitiveValue,
+                               public CFX_Target {
+ public:
+  CFDE_CSSPrimitiveValue(const CFDE_CSSPrimitiveValue& src) { *this = src; }
+  CFDE_CSSPrimitiveValue(FX_ARGB color)
+      : m_eType(FDE_CSSPRIMITIVETYPE_RGB), m_dwColor(color) {}
+  CFDE_CSSPrimitiveValue(FDE_CSSPROPERTYVALUE eValue)
+      : m_eType(FDE_CSSPRIMITIVETYPE_Enum), m_eEnum(eValue) {}
+  CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, FX_FLOAT fValue)
+      : m_eType(eType), m_fNumber(fValue) {}
+  CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, const FX_WCHAR* pValue)
+      : m_eType(eType), m_pString(pValue) {
+    FXSYS_assert(m_pString != NULL);
+  }
+  CFDE_CSSPrimitiveValue(CFDE_CSSFunction* pFunction)
+      : m_eType(FDE_CSSPRIMITIVETYPE_Function), m_pFunction(pFunction) {}
+
+  virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const { return m_eType; }
+
+  virtual FX_ARGB GetRGBColor() const {
+    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_RGB);
+    return m_dwColor;
+  }
+  virtual FX_FLOAT GetFloat() const {
+    FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_Number &&
+                 m_eType <= FDE_CSSPRIMITIVETYPE_PC);
+    return m_fNumber;
+  }
+  virtual const FX_WCHAR* GetString(int32_t& iLength) const {
+    FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_String &&
+                 m_eType <= FDE_CSSPRIMITIVETYPE_URI);
+    iLength = FXSYS_wcslen(m_pString);
+    return m_pString;
+  }
+  virtual FDE_CSSPROPERTYVALUE GetEnum() const {
+    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Enum);
+    return m_eEnum;
+  }
+  virtual const FX_WCHAR* GetFuncName() const {
+    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
+    return m_pFunction->GetFuncName();
+  }
+  virtual int32_t CountArgs() const {
+    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
+    return m_pFunction->CountArgs();
+  }
+  virtual IFDE_CSSValue* GetArgs(int32_t index) const {
+    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
+    return m_pFunction->GetArgs(index);
+  }
+
+  FDE_CSSPRIMITIVETYPE m_eType;
+  union {
+    FX_ARGB m_dwColor;
+    FX_FLOAT m_fNumber;
+    const FX_WCHAR* m_pString;
+    FDE_CSSPROPERTYVALUE m_eEnum;
+    CFDE_CSSFunction* m_pFunction;
+  };
+};
+typedef CFX_ArrayTemplate<IFDE_CSSPrimitiveValue*> CFDE_CSSPrimitiveArray;
+typedef CFX_ArrayTemplate<IFDE_CSSValue*> CFDE_CSSValueArray;
+class CFDE_CSSValueList : public IFDE_CSSValueList, public CFX_Target {
+ public:
+  CFDE_CSSValueList(IFX_MEMAllocator* pStaticStore,
+                    const CFDE_CSSValueArray& list);
+  virtual int32_t CountValues() const { return m_iCount; }
+  virtual IFDE_CSSValue* GetValue(int32_t index) const {
+    return m_ppList[index];
+  }
+
+ protected:
+  IFDE_CSSValue** m_ppList;
+  int32_t m_iCount;
+};
+class CFDE_CSSValueListParser : public CFX_Target {
+ public:
+  CFDE_CSSValueListParser(const FX_WCHAR* psz, int32_t iLen, FX_WCHAR separator)
+      : m_Separator(separator), m_pCur(psz), m_pEnd(psz + iLen) {
+    FXSYS_assert(psz != NULL && iLen > 0);
+  }
+  FX_BOOL NextValue(FDE_CSSPRIMITIVETYPE& eType,
+                    const FX_WCHAR*& pStart,
+                    int32_t& iLength);
+  FX_WCHAR m_Separator;
+
+ protected:
+  int32_t SkipTo(FX_WCHAR wch,
+                 FX_BOOL bWSSeparator = FALSE,
+                 FX_BOOL bBrContinue = FALSE);
+  const FX_WCHAR* m_pCur;
+  const FX_WCHAR* m_pEnd;
+};
+
+#define FDE_CSSVALUETYPE_MaybeNumber 0x0100
+#define FDE_CSSVALUETYPE_MaybeEnum 0x0200
+#define FDE_CSSVALUETYPE_MaybeURI 0x0400
+#define FDE_CSSVALUETYPE_MaybeString 0x0800
+#define FDE_CSSVALUETYPE_MaybeColor 0x1000
+#define FDE_CSSVALUETYPE_MaybeFunction 0x2000
+#define FDE_IsOnlyValue(type, enum) \
+  (((type) & ~(enum)) == FDE_CSSVALUETYPE_Primitive)
+struct FDE_CSSPROPERTYTABLE {
+  FDE_CSSPROPERTY eName;
+  const FX_WCHAR* pszName;
+  FX_DWORD dwHash;
+  FX_DWORD dwType;
+};
+typedef FDE_CSSPROPERTYTABLE const* FDE_LPCCSSPROPERTYTABLE;
+
+FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(const FX_WCHAR* pszName,
+                                                 int32_t iLength);
+FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName);
+struct FDE_CSSPROPERTYVALUETABLE {
+  FDE_CSSPROPERTYVALUE eName;
+  const FX_WCHAR* pszName;
+  FX_DWORD dwHash;
+};
+typedef FDE_CSSPROPERTYVALUETABLE const* FDE_LPCCSSPROPERTYVALUETABLE;
+
+FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(
+    const FX_WCHAR* pszName,
+    int32_t iLength);
+FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(
+    FDE_CSSPROPERTYVALUE eName);
+struct FDE_CSSMEDIATYPETABLE {
+  FX_WORD wHash;
+  FX_WORD wValue;
+};
+typedef FDE_CSSMEDIATYPETABLE const* FDE_LPCCSSMEDIATYPETABLE;
+FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(const FX_WCHAR* pszName,
+                                                   int32_t iLength);
+struct FDE_CSSLENGTHUNITTABLE {
+  FX_WORD wHash;
+  FX_WORD wValue;
+};
+typedef FDE_CSSLENGTHUNITTABLE const* FDE_LPCCSSLENGTHUNITTABLE;
+FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(const FX_WCHAR* pszName,
+                                                     int32_t iLength);
+struct FDE_CSSCOLORTABLE {
+  FX_DWORD dwHash;
+  FX_ARGB dwValue;
+};
+typedef FDE_CSSCOLORTABLE const* FDE_LPCCSSCOLORTABLE;
+FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(const FX_WCHAR* pszName,
+                                           int32_t iLength);
+struct FDE_CSSPERSUDOTABLE {
+  FDE_CSSPERSUDO eName;
+  const FX_WCHAR* pszName;
+  FX_DWORD dwHash;
+};
+typedef FDE_CSSPERSUDOTABLE const* FDE_LPCCSSPERSUDOTABLE;
+
+FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo);
+FX_BOOL FDE_ParseCSSNumber(const FX_WCHAR* pszValue,
+                           int32_t iValueLen,
+                           FX_FLOAT& fValue,
+                           FDE_CSSPRIMITIVETYPE& eUnit);
+FX_BOOL FDE_ParseCSSString(const FX_WCHAR* pszValue,
+                           int32_t iValueLen,
+                           int32_t& iOffset,
+                           int32_t& iLength);
+FX_BOOL FDE_ParseCSSColor(const FX_WCHAR* pszValue,
+                          int32_t iValueLen,
+                          FX_ARGB& dwColor);
+FX_BOOL FDE_ParseCSSURI(const FX_WCHAR* pszValue,
+                        int32_t iValueLen,
+                        int32_t& iOffset,
+                        int32_t& iLength);
+
+#endif  // XFA_FDE_CSS_FDE_CSSDATATABLE_H_
diff --git a/xfa/fde/css/fde_cssdeclaration.cpp b/xfa/fde/css/fde_cssdeclaration.cpp
new file mode 100644
index 0000000..decc397
--- /dev/null
+++ b/xfa/fde/css/fde_cssdeclaration.cpp
@@ -0,0 +1,1377 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_cssdeclaration.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_system.h"
+
+IFDE_CSSValue* CFDE_CSSDeclaration::GetProperty(FDE_CSSPROPERTY eProperty,
+                                                FX_BOOL& bImportant) const {
+  for (const FDE_CSSPropertyHolder* pHolder = m_pFirstProperty; pHolder;
+       pHolder = pHolder->pNext) {
+    if (pHolder->eProperty == eProperty) {
+      bImportant = pHolder->bImportant;
+      return pHolder->pValue;
+    }
+  }
+  return NULL;
+}
+FX_POSITION CFDE_CSSDeclaration::GetStartPosition() const {
+  return (FX_POSITION)m_pFirstProperty;
+}
+void CFDE_CSSDeclaration::GetNextProperty(FX_POSITION& pos,
+                                          FDE_CSSPROPERTY& eProperty,
+                                          IFDE_CSSValue*& pValue,
+                                          FX_BOOL& bImportant) const {
+  const FDE_CSSPropertyHolder* pHolder = (const FDE_CSSPropertyHolder*)pos;
+  FXSYS_assert(pHolder != NULL);
+  bImportant = pHolder->bImportant;
+  eProperty = (FDE_CSSPROPERTY)pHolder->eProperty;
+  pValue = pHolder->pValue;
+  pos = (FX_POSITION)pHolder->pNext;
+}
+FX_POSITION CFDE_CSSDeclaration::GetStartCustom() const {
+  return (FX_POSITION)m_pFirstCustom;
+}
+void CFDE_CSSDeclaration::GetNextCustom(FX_POSITION& pos,
+                                        CFX_WideString& wsName,
+                                        CFX_WideString& wsValue) const {
+  const FDE_CSSCustomProperty* pProperty = (const FDE_CSSCustomProperty*)pos;
+  if (pProperty == NULL) {
+    return;
+  }
+  wsName = pProperty->pwsName;
+  wsValue = pProperty->pwsValue;
+  pos = (FX_POSITION)pProperty->pNext;
+}
+const FX_WCHAR* CFDE_CSSDeclaration::CopyToLocal(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen) {
+  FXSYS_assert(iValueLen > 0);
+  CFX_MapPtrToPtr* pCache = pArgs->pStringCache;
+  void* pKey = NULL;
+  if (pCache) {
+    void* pszCached = NULL;
+    pKey =
+        (void*)(uintptr_t)FX_HashCode_String_GetW(pszValue, iValueLen, FALSE);
+    if (pCache->Lookup(pKey, pszCached)) {
+      return (const FX_WCHAR*)pszCached;
+    }
+  }
+  FX_WCHAR* psz =
+      (FX_WCHAR*)pArgs->pStaticStore->Alloc((iValueLen + 1) * sizeof(FX_WCHAR));
+  if (psz == NULL) {
+    return NULL;
+  }
+  FXSYS_wcsncpy(psz, pszValue, iValueLen);
+  psz[iValueLen] = '\0';
+  if (pCache) {
+    pCache->SetAt(pKey, psz);
+  }
+  return psz;
+}
+IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewNumberValue(
+    IFX_MEMAllocator* pStaticStore,
+    FDE_CSSPRIMITIVETYPE eUnit,
+    FX_FLOAT fValue) const {
+  static CFDE_CSSPrimitiveValue s_ZeroValue(FDE_CSSPRIMITIVETYPE_Number, 0.0f);
+  if (eUnit == FDE_CSSPRIMITIVETYPE_Number && FXSYS_fabs(fValue) < 0.001f) {
+    return &s_ZeroValue;
+  }
+  return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eUnit, fValue);
+}
+inline IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewEnumValue(
+    IFX_MEMAllocator* pStaticStore,
+    FDE_CSSPROPERTYVALUE eValue) const {
+  return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eValue);
+}
+void CFDE_CSSDeclaration::AddPropertyHolder(IFX_MEMAllocator* pStaticStore,
+                                            FDE_CSSPROPERTY eProperty,
+                                            IFDE_CSSValue* pValue,
+                                            FX_BOOL bImportant) {
+  FDE_CSSPropertyHolder* pHolder =
+      FXTARGET_NewWith(pStaticStore) FDE_CSSPropertyHolder;
+  pHolder->bImportant = bImportant;
+  pHolder->eProperty = eProperty;
+  pHolder->pValue = pValue;
+  pHolder->pNext = NULL;
+  if (m_pLastProperty == NULL) {
+    m_pLastProperty = m_pFirstProperty = pHolder;
+  } else {
+    m_pLastProperty->pNext = pHolder;
+    m_pLastProperty = pHolder;
+  }
+}
+FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                         const FX_WCHAR* pszValue,
+                                         int32_t iValueLen) {
+  FXSYS_assert(iValueLen > 0);
+  FX_BOOL bImportant = FALSE;
+  if (iValueLen >= 10 && pszValue[iValueLen - 10] == '!' &&
+      FX_wcsnicmp(L"important", pszValue + iValueLen - 9, 9) == 0) {
+    if ((iValueLen -= 10) == 0) {
+      return FALSE;
+    }
+    bImportant = TRUE;
+  }
+  const FX_DWORD dwType = pArgs->pProperty->dwType;
+  switch (dwType & 0x0F) {
+    case FDE_CSSVALUETYPE_Primitive: {
+      static const FX_DWORD g_ValueGuessOrder[] = {
+          FDE_CSSVALUETYPE_MaybeNumber,   FDE_CSSVALUETYPE_MaybeEnum,
+          FDE_CSSVALUETYPE_MaybeColor,    FDE_CSSVALUETYPE_MaybeURI,
+          FDE_CSSVALUETYPE_MaybeFunction, FDE_CSSVALUETYPE_MaybeString,
+      };
+      static const int32_t g_ValueGuessCount =
+          sizeof(g_ValueGuessOrder) / sizeof(FX_DWORD);
+      for (int32_t i = 0; i < g_ValueGuessCount; ++i) {
+        const FX_DWORD dwMatch = dwType & g_ValueGuessOrder[i];
+        if (dwMatch == 0) {
+          continue;
+        }
+        IFDE_CSSValue* pCSSValue = NULL;
+        switch (dwMatch) {
+          case FDE_CSSVALUETYPE_MaybeFunction:
+            pCSSValue = ParseFunction(pArgs, pszValue, iValueLen);
+            break;
+          case FDE_CSSVALUETYPE_MaybeNumber:
+            pCSSValue = ParseNumber(pArgs, pszValue, iValueLen);
+            break;
+          case FDE_CSSVALUETYPE_MaybeEnum:
+            pCSSValue = ParseEnum(pArgs, pszValue, iValueLen);
+            break;
+          case FDE_CSSVALUETYPE_MaybeColor:
+            pCSSValue = ParseColor(pArgs, pszValue, iValueLen);
+            break;
+          case FDE_CSSVALUETYPE_MaybeURI:
+            pCSSValue = ParseURI(pArgs, pszValue, iValueLen);
+            break;
+          case FDE_CSSVALUETYPE_MaybeString:
+            pCSSValue = ParseString(pArgs, pszValue, iValueLen);
+            break;
+          default:
+            break;
+        }
+        if (pCSSValue != NULL) {
+          AddPropertyHolder(pArgs->pStaticStore, pArgs->pProperty->eName,
+                            pCSSValue, bImportant);
+          return TRUE;
+        }
+        if (FDE_IsOnlyValue(dwType, g_ValueGuessOrder[i])) {
+          return FALSE;
+        }
+      }
+    } break;
+    case FDE_CSSVALUETYPE_Shorthand: {
+      IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+      IFDE_CSSValue *pColor, *pStyle, *pWidth;
+      switch (pArgs->pProperty->eName) {
+        case FDE_CSSPROPERTY_Font:
+          return ParseFontProperty(pArgs, pszValue, iValueLen, bImportant);
+        case FDE_CSSPROPERTY_Background:
+          return ParseBackgroundProperty(pArgs, pszValue, iValueLen,
+                                         bImportant);
+        case FDE_CSSPROPERTY_ListStyle:
+          return ParseListStyleProperty(pArgs, pszValue, iValueLen, bImportant);
+        case FDE_CSSPROPERTY_Border:
+          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
+                                   pStyle, pWidth)) {
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderLeftColor,
+                              FDE_CSSPROPERTY_BorderLeftStyle,
+                              FDE_CSSPROPERTY_BorderLeftWidth);
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderTopColor,
+                              FDE_CSSPROPERTY_BorderTopStyle,
+                              FDE_CSSPROPERTY_BorderTopWidth);
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderRightColor,
+                              FDE_CSSPROPERTY_BorderRightStyle,
+                              FDE_CSSPROPERTY_BorderRightWidth);
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderBottomColor,
+                              FDE_CSSPROPERTY_BorderBottomStyle,
+                              FDE_CSSPROPERTY_BorderBottomWidth);
+            return TRUE;
+          }
+          break;
+        case FDE_CSSPROPERTY_BorderLeft:
+          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
+                                   pStyle, pWidth)) {
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderLeftColor,
+                              FDE_CSSPROPERTY_BorderLeftStyle,
+                              FDE_CSSPROPERTY_BorderLeftWidth);
+            return TRUE;
+          }
+          break;
+        case FDE_CSSPROPERTY_BorderTop:
+          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
+                                   pStyle, pWidth)) {
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderTopColor,
+                              FDE_CSSPROPERTY_BorderTopStyle,
+                              FDE_CSSPROPERTY_BorderTopWidth);
+            return TRUE;
+          }
+          break;
+        case FDE_CSSPROPERTY_BorderRight:
+          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
+                                   pStyle, pWidth)) {
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderRightColor,
+                              FDE_CSSPROPERTY_BorderRightStyle,
+                              FDE_CSSPROPERTY_BorderRightWidth);
+            return TRUE;
+          }
+          break;
+        case FDE_CSSPROPERTY_BorderBottom:
+          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
+                                   pStyle, pWidth)) {
+            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
+                              FDE_CSSPROPERTY_BorderBottomColor,
+                              FDE_CSSPROPERTY_BorderBottomStyle,
+                              FDE_CSSPROPERTY_BorderBottomWidth);
+            return TRUE;
+          }
+          break;
+        case FDE_CSSPROPERTY_Overflow:
+          return ParseOverflowProperty(pArgs, pszValue, iValueLen, bImportant);
+        case FDE_CSSPROPERTY_ColumnRule:
+          return ParseColumnRuleProperty(pArgs, pszValue, iValueLen,
+                                         bImportant);
+        default:
+          break;
+      }
+    } break;
+    case FDE_CSSVALUETYPE_List:
+      switch (pArgs->pProperty->eName) {
+        case FDE_CSSPROPERTY_CounterIncrement:
+        case FDE_CSSPROPERTY_CounterReset:
+          return ParseCounterProperty(pArgs, pszValue, iValueLen, bImportant);
+        case FDE_CSSPROPERTY_Content:
+          return ParseContentProperty(pArgs, pszValue, iValueLen, bImportant);
+        default:
+          return ParseValueListProperty(pArgs, pszValue, iValueLen, bImportant);
+      }
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  return FALSE;
+}
+FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                         const FX_WCHAR* pszName,
+                                         int32_t iNameLen,
+                                         const FX_WCHAR* pszValue,
+                                         int32_t iValueLen) {
+  FDE_CSSCustomProperty* pProperty =
+      FXTARGET_NewWith(pArgs->pStaticStore) FDE_CSSCustomProperty;
+  pProperty->pwsName = CopyToLocal(pArgs, pszName, iNameLen);
+  pProperty->pwsValue = CopyToLocal(pArgs, pszValue, iValueLen);
+  pProperty->pNext = NULL;
+  if (m_pLastCustom == NULL) {
+    m_pLastCustom = m_pFirstCustom = pProperty;
+  } else {
+    m_pLastCustom->pNext = pProperty;
+    m_pLastCustom = pProperty;
+  }
+  return TRUE;
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseNumber(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen) {
+  FX_FLOAT fValue;
+  FDE_CSSPRIMITIVETYPE eUnit;
+  if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eUnit)) {
+    return NULL;
+  }
+  return NewNumberValue(pArgs->pStaticStore, eUnit, fValue);
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseEnum(const FDE_CSSPROPERTYARGS* pArgs,
+                                              const FX_WCHAR* pszValue,
+                                              int32_t iValueLen) {
+  const FDE_CSSPROPERTYVALUETABLE* pValue =
+      FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+  return pValue ? NewEnumValue(pArgs->pStaticStore, pValue->eName) : NULL;
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseColor(const FDE_CSSPROPERTYARGS* pArgs,
+                                               const FX_WCHAR* pszValue,
+                                               int32_t iValueLen) {
+  FX_ARGB dwColor;
+  if (!FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+    return NULL;
+  }
+  return FXTARGET_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseURI(const FDE_CSSPROPERTYARGS* pArgs,
+                                             const FX_WCHAR* pszValue,
+                                             int32_t iValueLen) {
+  int32_t iOffset;
+  if (!FDE_ParseCSSURI(pszValue, iValueLen, iOffset, iValueLen)) {
+    return NULL;
+  }
+  if (iValueLen <= 0) {
+    return NULL;
+  }
+  pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen);
+  return pszValue
+             ? FXTARGET_NewWith(pArgs->pStaticStore)
+                   CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_URI, pszValue)
+             : NULL;
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseString(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen) {
+  int32_t iOffset;
+  if (!FDE_ParseCSSString(pszValue, iValueLen, iOffset, iValueLen)) {
+    return NULL;
+  }
+  if (iValueLen <= 0) {
+    return NULL;
+  }
+  pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen);
+  return pszValue
+             ? FXTARGET_NewWith(pArgs->pStaticStore)
+                   CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)
+             : NULL;
+}
+IFDE_CSSValue* CFDE_CSSDeclaration::ParseFunction(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen) {
+  if (pszValue[iValueLen - 1] != ')') {
+    return NULL;
+  }
+  int32_t iStartBracket = 0;
+  while (pszValue[iStartBracket] != '(') {
+    if (iStartBracket < iValueLen) {
+      iStartBracket++;
+    } else {
+      return NULL;
+    }
+  }
+  if (iStartBracket == 0) {
+    return NULL;
+  }
+  const FX_WCHAR* pszFuncName = CopyToLocal(pArgs, pszValue, iStartBracket);
+  pszValue += (iStartBracket + 1);
+  iValueLen -= (iStartBracket + 2);
+  CFDE_CSSValueArray argumentArr;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ',');
+  FDE_CSSPRIMITIVETYPE ePrimitiveType;
+  while (parser.NextValue(ePrimitiveType, pszValue, iValueLen)) {
+    switch (ePrimitiveType) {
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pPropertyValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pPropertyValue != NULL) {
+          argumentArr.Add(
+              NewEnumValue(pArgs->pStaticStore, pPropertyValue->eName));
+          continue;
+        }
+        IFDE_CSSValue* pFunctionValue =
+            ParseFunction(pArgs, pszValue, iValueLen);
+        if (pFunctionValue != NULL) {
+          argumentArr.Add(pFunctionValue);
+          continue;
+        }
+        argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore)
+                            CFDE_CSSPrimitiveValue(
+                                FDE_CSSPRIMITIVETYPE_String,
+                                CopyToLocal(pArgs, pszValue, iValueLen)));
+      } break;
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, ePrimitiveType)) {
+          argumentArr.Add(
+              NewNumberValue(pArgs->pStaticStore, ePrimitiveType, fValue));
+        }
+      } break;
+      default:
+        argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore)
+                            CFDE_CSSPrimitiveValue(
+                                FDE_CSSPRIMITIVETYPE_String,
+                                CopyToLocal(pArgs, pszValue, iValueLen)));
+        break;
+    }
+  }
+  IFDE_CSSValueList* pArgumentList = FXTARGET_NewWith(pArgs->pStaticStore)
+      CFDE_CSSValueList(pArgs->pStaticStore, argumentArr);
+  CFDE_CSSFunction* pFunction = FXTARGET_NewWith(pArgs->pStaticStore)
+      CFDE_CSSFunction(pszFuncName, pArgumentList);
+  return FXTARGET_NewWith(pArgs->pStaticStore)
+      CFDE_CSSPrimitiveValue(pFunction);
+}
+FX_BOOL CFDE_CSSDeclaration::ParseContentProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = (IFX_MEMAllocator*)pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  FDE_CSSPRIMITIVETYPE eType;
+  CFDE_CSSValueArray list;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_URI:
+        list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+            eType, CopyToLocal(pArgs, pszValue, iValueLen)));
+        break;
+      case FDE_CSSPRIMITIVETYPE_Number:
+        return FALSE;
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue != NULL) {
+          switch (pValue->eName) {
+            case FDE_CSSPROPERTYVALUE_Normal:
+            case FDE_CSSPROPERTYVALUE_None: {
+              if (list.GetSize() == 0) {
+                list.Add(NewEnumValue(pStaticStore, pValue->eName));
+              } else {
+                return FALSE;
+              }
+            } break;
+            case FDE_CSSPROPERTYVALUE_OpenQuote:
+            case FDE_CSSPROPERTYVALUE_CloseQuote:
+            case FDE_CSSPROPERTYVALUE_NoOpenQuote:
+            case FDE_CSSPROPERTYVALUE_NoCloseQuote:
+              list.Add(NewEnumValue(pStaticStore, pValue->eName));
+              break;
+            default:
+              return FALSE;
+          }
+          continue;
+        }
+        IFDE_CSSValue* pFunction = ParseFunction(pArgs, pszValue, iValueLen);
+        if (pFunction != NULL) {
+          list.Add(pFunction);
+          continue;
+        }
+        list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+            eType, CopyToLocal(pArgs, pszValue, iValueLen)));
+      } break;
+      case FDE_CSSPRIMITIVETYPE_RGB:
+        return FALSE;
+      default:
+        break;
+    }
+  }
+  if (list.GetSize() == 0) {
+    return FALSE;
+  }
+  AddPropertyHolder(pStaticStore, pArgs->pProperty->eName,
+                    FXTARGET_NewWith(pStaticStore)
+                        CFDE_CSSValueList(pStaticStore, list),
+                    bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseCounterProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  CFDE_CSSValueArray list;
+  CFDE_CSSValueArray listFull;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+          if (list.GetSize() == 1) {
+            list.Add(NewNumberValue(pStaticStore, eType, fValue));
+            listFull.Add(FXTARGET_NewWith(pStaticStore)
+                             CFDE_CSSValueList(pStaticStore, list));
+            list.RemoveAll();
+          } else {
+            return FALSE;
+          }
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_String: {
+        if (list.GetSize() == 0) {
+          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
+          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              FDE_CSSPRIMITIVETYPE_String, pszValue));
+        } else {
+          listFull.Add(FXTARGET_NewWith(pStaticStore)
+                           CFDE_CSSValueList(pStaticStore, list));
+          list.RemoveAll();
+          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
+          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              FDE_CSSPRIMITIVETYPE_String, pszValue));
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (list.GetSize() == 1) {
+    listFull.Add(FXTARGET_NewWith(pStaticStore)
+                     CFDE_CSSValueList(pStaticStore, list));
+  }
+  if (listFull.GetSize() == 0) {
+    return FALSE;
+  }
+  AddPropertyHolder(pStaticStore, pArgs->pProperty->eName,
+                    FXTARGET_NewWith(pStaticStore)
+                        CFDE_CSSValueList(pStaticStore, listFull),
+                    bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseValueListProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  FX_WCHAR separator =
+      (pArgs->pProperty->eName == FDE_CSSPROPERTY_FontFamily) ? ',' : ' ';
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, separator);
+  const FX_DWORD dwType = pArgs->pProperty->dwType;
+  FDE_CSSPRIMITIVETYPE eType;
+  CFDE_CSSValueArray list;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_Number:
+        if (dwType & FDE_CSSVALUETYPE_MaybeNumber) {
+          FX_FLOAT fValue;
+          if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+            list.Add(NewNumberValue(pStaticStore, eType, fValue));
+          }
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_String:
+        if (dwType & FDE_CSSVALUETYPE_MaybeColor) {
+          FX_ARGB dwColor;
+          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+            list.Add(FXTARGET_NewWith(pStaticStore)
+                         CFDE_CSSPrimitiveValue(dwColor));
+            continue;
+          }
+        }
+        if (dwType & FDE_CSSVALUETYPE_MaybeEnum) {
+          const FDE_CSSPROPERTYVALUETABLE* pValue =
+              FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+          if (pValue != NULL) {
+            list.Add(NewEnumValue(pStaticStore, pValue->eName));
+            continue;
+          }
+        }
+        if (dwType & FDE_CSSVALUETYPE_MaybeString) {
+          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
+          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              FDE_CSSPRIMITIVETYPE_String, pszValue));
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_RGB:
+        if (dwType & FDE_CSSVALUETYPE_MaybeColor) {
+          FX_ARGB dwColor;
+          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+            list.Add(FXTARGET_NewWith(pStaticStore)
+                         CFDE_CSSPrimitiveValue(dwColor));
+          }
+        }
+        break;
+      default:
+        break;
+    }
+  }
+  if (list.GetSize() == 0) {
+    return FALSE;
+  }
+  switch (pArgs->pProperty->eName) {
+    case FDE_CSSPROPERTY_BorderColor:
+      return Add4ValuesProperty(
+          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftColor,
+          FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderRightColor,
+          FDE_CSSPROPERTY_BorderBottomColor);
+    case FDE_CSSPROPERTY_BorderStyle:
+      return Add4ValuesProperty(
+          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftStyle,
+          FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderRightStyle,
+          FDE_CSSPROPERTY_BorderBottomStyle);
+    case FDE_CSSPROPERTY_BorderWidth:
+      return Add4ValuesProperty(
+          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftWidth,
+          FDE_CSSPROPERTY_BorderTopWidth, FDE_CSSPROPERTY_BorderRightWidth,
+          FDE_CSSPROPERTY_BorderBottomWidth);
+    case FDE_CSSPROPERTY_Margin:
+      return Add4ValuesProperty(
+          pStaticStore, list, bImportant, FDE_CSSPROPERTY_MarginLeft,
+          FDE_CSSPROPERTY_MarginTop, FDE_CSSPROPERTY_MarginRight,
+          FDE_CSSPROPERTY_MarginBottom);
+    case FDE_CSSPROPERTY_Padding:
+      return Add4ValuesProperty(
+          pStaticStore, list, bImportant, FDE_CSSPROPERTY_PaddingLeft,
+          FDE_CSSPROPERTY_PaddingTop, FDE_CSSPROPERTY_PaddingRight,
+          FDE_CSSPROPERTY_PaddingBottom);
+    default: {
+      CFDE_CSSValueList* pList =
+          FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list);
+      AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, pList,
+                        bImportant);
+      return TRUE;
+    } break;
+  }
+  return FALSE;
+}
+FX_BOOL CFDE_CSSDeclaration::Add4ValuesProperty(IFX_MEMAllocator* pStaticStore,
+                                                const CFDE_CSSValueArray& list,
+                                                FX_BOOL bImportant,
+                                                FDE_CSSPROPERTY eLeft,
+                                                FDE_CSSPROPERTY eTop,
+                                                FDE_CSSPROPERTY eRight,
+                                                FDE_CSSPROPERTY eBottom) {
+  switch (list.GetSize()) {
+    case 1:
+      AddPropertyHolder(pStaticStore, eLeft, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eRight, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant);
+      return TRUE;
+    case 2:
+      AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant);
+      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
+      AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant);
+      return TRUE;
+    case 3:
+      AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant);
+      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
+      AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant);
+      return TRUE;
+    case 4:
+      AddPropertyHolder(pStaticStore, eLeft, list[3], bImportant);
+      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
+      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
+      AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant);
+      return TRUE;
+    default:
+      break;
+  }
+  return FALSE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseBorderPropoerty(
+    IFX_MEMAllocator* pStaticStore,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    IFDE_CSSValue*& pColor,
+    IFDE_CSSValue*& pStyle,
+    IFDE_CSSValue*& pWidth) const {
+  pColor = pStyle = pWidth = NULL;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_Number:
+        if (pWidth == NULL) {
+          FX_FLOAT fValue;
+          if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+            pWidth = NewNumberValue(pStaticStore, eType, fValue);
+          }
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_RGB:
+        if (pColor == NULL) {
+          FX_ARGB dwColor;
+          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+            pColor =
+                FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
+          }
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSCOLORTABLE* pColorItem =
+            FDE_GetCSSColorByName(pszValue, iValueLen);
+        if (pColorItem != NULL) {
+          if (pColor == NULL) {
+            pColor = FXTARGET_NewWith(pStaticStore)
+                CFDE_CSSPrimitiveValue(pColorItem->dwValue);
+          }
+          continue;
+        }
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue == NULL) {
+          continue;
+        }
+        switch (pValue->eName) {
+          case FDE_CSSPROPERTYVALUE_Transparent:
+            if (pColor == NULL) {
+              pColor = FXTARGET_NewWith(pStaticStore)
+                  CFDE_CSSPrimitiveValue((FX_ARGB)0);
+            }
+            break;
+          case FDE_CSSPROPERTYVALUE_Thin:
+          case FDE_CSSPROPERTYVALUE_Thick:
+          case FDE_CSSPROPERTYVALUE_Medium:
+            if (pWidth == NULL) {
+              pWidth = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          case FDE_CSSPROPERTYVALUE_None:
+          case FDE_CSSPROPERTYVALUE_Hidden:
+          case FDE_CSSPROPERTYVALUE_Dotted:
+          case FDE_CSSPROPERTYVALUE_Dashed:
+          case FDE_CSSPROPERTYVALUE_Solid:
+          case FDE_CSSPROPERTYVALUE_Double:
+          case FDE_CSSPROPERTYVALUE_Groove:
+          case FDE_CSSPROPERTYVALUE_Ridge:
+          case FDE_CSSPROPERTYVALUE_Inset:
+          case FDE_CSSPROPERTYVALUE_Outset:
+            if (pStyle == NULL) {
+              pStyle = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          default:
+            break;
+        }
+      }; break;
+      default:
+        break;
+    }
+  }
+  if (pColor == NULL) {
+    pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
+  }
+  if (pStyle == NULL) {
+    pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
+  }
+  if (pWidth == NULL) {
+    pWidth = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
+  }
+  return TRUE;
+}
+void CFDE_CSSDeclaration::AddBorderProperty(IFX_MEMAllocator* pStaticStore,
+                                            IFDE_CSSValue* pColor,
+                                            IFDE_CSSValue* pStyle,
+                                            IFDE_CSSValue* pWidth,
+                                            FX_BOOL bImportant,
+                                            FDE_CSSPROPERTY eColor,
+                                            FDE_CSSPROPERTY eStyle,
+                                            FDE_CSSPROPERTY eWidth) {
+  AddPropertyHolder(pStaticStore, eStyle, pStyle, bImportant);
+  AddPropertyHolder(pStaticStore, eWidth, pWidth, bImportant);
+  AddPropertyHolder(pStaticStore, eColor, pColor, bImportant);
+}
+FX_BOOL CFDE_CSSDeclaration::ParseListStyleProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  IFDE_CSSPrimitiveValue *pType = NULL, *pImage = NULL, *pPosition = NULL;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_URI:
+        if (pImage == NULL) {
+          pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              eType, CopyToLocal(pArgs, pszValue, iValueLen));
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue == NULL) {
+          break;
+        }
+        switch (pValue->eName) {
+          case FDE_CSSPROPERTYVALUE_None:
+            if (pImage == NULL) {
+              pImage = NewEnumValue(pStaticStore, pValue->eName);
+            } else if (pType == NULL) {
+              pImage = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          case FDE_CSSPROPERTYVALUE_Inside:
+          case FDE_CSSPROPERTYVALUE_Outside:
+            if (pPosition == NULL) {
+              pPosition = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          case FDE_CSSPROPERTYVALUE_Disc:
+          case FDE_CSSPROPERTYVALUE_Circle:
+          case FDE_CSSPROPERTYVALUE_Square:
+          case FDE_CSSPROPERTYVALUE_Decimal:
+          case FDE_CSSPROPERTYVALUE_DecimalLeadingZero:
+          case FDE_CSSPROPERTYVALUE_LowerRoman:
+          case FDE_CSSPROPERTYVALUE_UpperRoman:
+          case FDE_CSSPROPERTYVALUE_LowerGreek:
+          case FDE_CSSPROPERTYVALUE_LowerLatin:
+          case FDE_CSSPROPERTYVALUE_UpperLatin:
+          case FDE_CSSPROPERTYVALUE_Armenian:
+          case FDE_CSSPROPERTYVALUE_Georgian:
+          case FDE_CSSPROPERTYVALUE_LowerAlpha:
+          case FDE_CSSPROPERTYVALUE_UpperAlpha:
+            if (pType == NULL) {
+              pType = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          default:
+            break;
+        }
+      }; break;
+      default:
+        break;
+    }
+  }
+  if (pPosition == NULL) {
+    pPosition = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Outside);
+  }
+  if (pImage == NULL) {
+    pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
+  }
+  if (pType == NULL) {
+    pType = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
+  }
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStylePosition, pPosition,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleImage, pImage,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleType, pType,
+                    bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseBackgroundProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  IFDE_CSSPrimitiveValue *pColor = NULL, *pImage = NULL, *pRepeat = NULL;
+  IFDE_CSSPrimitiveValue *pPosX = NULL, *pPosY = NULL, *pAttachment = NULL;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_URI:
+        if (pImage == NULL) {
+          pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              eType, CopyToLocal(pArgs, pszValue, iValueLen));
+        }
+        break;
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+          break;
+        }
+        if (pPosX == NULL) {
+          pPosX = NewNumberValue(pStaticStore, eType, fValue);
+        } else if (pPosY == NULL) {
+          pPosY = NewNumberValue(pStaticStore, eType, fValue);
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue != NULL) {
+          switch (pValue->eName) {
+            case FDE_CSSPROPERTYVALUE_None:
+              if (pImage == NULL) {
+                pImage = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Transparent:
+              if (pColor == NULL) {
+                pColor = FXTARGET_NewWith(pStaticStore)
+                    CFDE_CSSPrimitiveValue((FX_ARGB)0);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Fixed:
+            case FDE_CSSPROPERTYVALUE_Scroll:
+              if (pAttachment == NULL) {
+                pAttachment = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Repeat:
+            case FDE_CSSPROPERTYVALUE_RepeatX:
+            case FDE_CSSPROPERTYVALUE_RepeatY:
+            case FDE_CSSPROPERTYVALUE_NoRepeat:
+              if (pRepeat == NULL) {
+                pRepeat = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Left:
+            case FDE_CSSPROPERTYVALUE_Right:
+              if (pPosX == NULL) {
+                pPosX = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Top:
+            case FDE_CSSPROPERTYVALUE_Bottom:
+              if (pPosY == NULL) {
+                pPosX = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Center:
+              if (pPosX == NULL) {
+                pPosX = NewEnumValue(pStaticStore, pValue->eName);
+              } else if (pPosY == NULL) {
+                pPosX = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            default:
+              break;
+          }
+          break;
+        }
+        const FDE_CSSCOLORTABLE* pColorItem =
+            FDE_GetCSSColorByName(pszValue, iValueLen);
+        if (pColorItem != NULL) {
+          if (pColor == NULL) {
+            pColor = FXTARGET_NewWith(pStaticStore)
+                CFDE_CSSPrimitiveValue(pColorItem->dwValue);
+          }
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_RGB:
+        if (pColor == NULL) {
+          FX_ARGB dwColor;
+          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+            pColor =
+                FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
+          }
+        }
+        break;
+      default:
+        break;
+    }
+  }
+  if (pColor == NULL) {
+    pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
+  }
+  if (pImage == NULL) {
+    pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
+  }
+  if (pRepeat == NULL) {
+    pRepeat = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Repeat);
+  }
+  if (pAttachment == NULL) {
+    pAttachment = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Scroll);
+  }
+  if (pPosX == NULL) {
+    pPosX = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
+    pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
+  } else if (pPosY == NULL) {
+    pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
+  }
+  CFDE_CSSValueArray position;
+  position.Add(pPosX);
+  position.Add(pPosY);
+  CFDE_CSSValueList* pPosList =
+      FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, position);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundColor, pColor,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundImage, pImage,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundRepeat, pRepeat,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundPosition, pPosList,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundAttachment,
+                    pAttachment, bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseFontProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                               const FX_WCHAR* pszValue,
+                                               int32_t iValueLen,
+                                               FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, '/');
+  IFDE_CSSPrimitiveValue *pStyle = NULL, *pVariant = NULL, *pWeight = NULL;
+  IFDE_CSSPrimitiveValue *pFontSize = NULL, *pLineHeight = NULL;
+  CFDE_CSSValueArray familyList;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue != NULL) {
+          switch (pValue->eName) {
+            case FDE_CSSPROPERTYVALUE_XxSmall:
+            case FDE_CSSPROPERTYVALUE_XSmall:
+            case FDE_CSSPROPERTYVALUE_Small:
+            case FDE_CSSPROPERTYVALUE_Medium:
+            case FDE_CSSPROPERTYVALUE_Large:
+            case FDE_CSSPROPERTYVALUE_XLarge:
+            case FDE_CSSPROPERTYVALUE_XxLarge:
+            case FDE_CSSPROPERTYVALUE_Smaller:
+            case FDE_CSSPROPERTYVALUE_Larger:
+              if (pFontSize == NULL) {
+                pFontSize = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              continue;
+            case FDE_CSSPROPERTYVALUE_Bold:
+            case FDE_CSSPROPERTYVALUE_Bolder:
+            case FDE_CSSPROPERTYVALUE_Lighter:
+              if (pWeight == NULL) {
+                pWeight = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              continue;
+            case FDE_CSSPROPERTYVALUE_Italic:
+            case FDE_CSSPROPERTYVALUE_Oblique:
+              if (pStyle == NULL) {
+                pStyle = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              continue;
+            case FDE_CSSPROPERTYVALUE_SmallCaps:
+              if (pVariant == NULL) {
+                pVariant = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              continue;
+            case FDE_CSSPROPERTYVALUE_Normal:
+              if (pStyle == NULL) {
+                pStyle = NewEnumValue(pStaticStore, pValue->eName);
+              } else if (pVariant == NULL) {
+                pVariant = NewEnumValue(pStaticStore, pValue->eName);
+              } else if (pWeight == NULL) {
+                pWeight = NewEnumValue(pStaticStore, pValue->eName);
+              } else if (pFontSize == NULL) {
+                pFontSize = NewEnumValue(pStaticStore, pValue->eName);
+              } else if (pLineHeight == NULL) {
+                pLineHeight = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              continue;
+            default:
+              break;
+          }
+        }
+        if (pFontSize != NULL) {
+          familyList.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
+              eType, CopyToLocal(pArgs, pszValue, iValueLen)));
+        }
+        parser.m_Separator = ',';
+      } break;
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+          break;
+        }
+        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          switch ((int32_t)fValue) {
+            case 100:
+            case 200:
+            case 300:
+            case 400:
+            case 500:
+            case 600:
+            case 700:
+            case 800:
+            case 900:
+              if (pWeight == NULL) {
+                pWeight = NewNumberValue(pStaticStore,
+                                         FDE_CSSPRIMITIVETYPE_Number, fValue);
+              }
+              continue;
+          }
+        }
+        if (pFontSize == NULL) {
+          pFontSize = NewNumberValue(pStaticStore, eType, fValue);
+        } else if (pLineHeight == NULL) {
+          pLineHeight = NewNumberValue(pStaticStore, eType, fValue);
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (pStyle == NULL) {
+    pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
+  }
+  if (pVariant == NULL) {
+    pVariant = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
+  }
+  if (pWeight == NULL) {
+    pWeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
+  }
+  if (pFontSize == NULL) {
+    pFontSize = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium);
+  }
+  if (pLineHeight == NULL) {
+    pLineHeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
+  }
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontStyle, pStyle,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontVariant, pVariant,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontWeight, pWeight,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontSize, pFontSize,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_LineHeight, pLineHeight,
+                    bImportant);
+  if (familyList.GetSize() > 0) {
+    CFDE_CSSValueList* pList = FXTARGET_NewWith(pStaticStore)
+        CFDE_CSSValueList(pStaticStore, familyList);
+    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontFamily, pList,
+                      bImportant);
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseColumnRuleProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  IFDE_CSSPrimitiveValue* pColumnRuleWidth = NULL;
+  IFDE_CSSPrimitiveValue* pColumnRuleStyle = NULL;
+  IFDE_CSSPrimitiveValue* pColumnRuleColor = NULL;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue != NULL) {
+          switch (pValue->eName) {
+            case FDE_CSSPROPERTYVALUE_None:
+            case FDE_CSSPROPERTYVALUE_Hidden:
+            case FDE_CSSPROPERTYVALUE_Dotted:
+            case FDE_CSSPROPERTYVALUE_Dashed:
+            case FDE_CSSPROPERTYVALUE_Solid:
+            case FDE_CSSPROPERTYVALUE_Double:
+            case FDE_CSSPROPERTYVALUE_Groove:
+            case FDE_CSSPROPERTYVALUE_Ridge:
+            case FDE_CSSPROPERTYVALUE_Inset:
+            case FDE_CSSPROPERTYVALUE_Outset:
+              if (pColumnRuleStyle == NULL) {
+                pColumnRuleStyle = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Transparent:
+              if (pColumnRuleColor == NULL) {
+                pColumnRuleColor = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            case FDE_CSSPROPERTYVALUE_Thin:
+            case FDE_CSSPROPERTYVALUE_Medium:
+            case FDE_CSSPROPERTYVALUE_Thick:
+              if (pColumnRuleWidth == NULL) {
+                pColumnRuleWidth = NewEnumValue(pStaticStore, pValue->eName);
+              }
+              break;
+            default:
+              break;
+          }
+          continue;
+        }
+        FX_ARGB dwColor;
+        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor) &&
+            pColumnRuleColor == NULL) {
+          pColumnRuleColor = FXTARGET_NewWith(pStaticStore)
+              CFDE_CSSPrimitiveValue((FX_ARGB)dwColor);
+          continue;
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType) &&
+            pColumnRuleWidth == NULL) {
+          pColumnRuleWidth = NewNumberValue(pStaticStore, eType, fValue);
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_RGB: {
+        FX_ARGB dwColor;
+        if (pColumnRuleColor == NULL &&
+            FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+          pColumnRuleColor = FXTARGET_NewWith(pStaticStore)
+              CFDE_CSSPrimitiveValue((FX_ARGB)dwColor);
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (pColumnRuleColor == NULL && pColumnRuleStyle == NULL &&
+      pColumnRuleWidth == NULL) {
+    return FALSE;
+  }
+  if (pColumnRuleStyle == NULL) {
+    pColumnRuleStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
+  }
+  if (pColumnRuleWidth == NULL) {
+    pColumnRuleWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium);
+  }
+  if (pColumnRuleColor == NULL) {
+    pColumnRuleColor =
+        FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
+  }
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleStyle,
+                    pColumnRuleStyle, bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleWidth,
+                    pColumnRuleWidth, bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleColor,
+                    pColumnRuleColor, bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseTextEmphasisProperty(
+    FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  CFDE_CSSValueArray arrEmphasisStyle;
+  FDE_CSSPRIMITIVETYPE eType;
+  IFDE_CSSPrimitiveValue* pEmphasisColor = NULL;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue != NULL) {
+          arrEmphasisStyle.Add(NewEnumValue(pStaticStore, pValue->eName));
+          continue;
+        }
+        FX_ARGB dwColor;
+        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+          pEmphasisColor =
+              FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
+          continue;
+        }
+        pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
+        arrEmphasisStyle.Add(
+            FXTARGET_NewWith(pStaticStore)
+                CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue));
+      } break;
+      case FDE_CSSPRIMITIVETYPE_RGB: {
+        FX_ARGB dwColor;
+        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
+          pEmphasisColor =
+              FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (arrEmphasisStyle.GetSize() != 0) {
+    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisStyle,
+                      FXTARGET_NewWith(pStaticStore)
+                          CFDE_CSSValueList(pStaticStore, arrEmphasisStyle),
+                      bImportant);
+  }
+  if (pEmphasisColor != NULL) {
+    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisColor,
+                      pEmphasisColor, bImportant);
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseColumnsProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  IFDE_CSSPrimitiveValue* pColumnWidth = NULL;
+  IFDE_CSSPrimitiveValue* pColumnCount = NULL;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    switch (eType) {
+      case FDE_CSSPRIMITIVETYPE_String: {
+        const FDE_CSSPROPERTYVALUETABLE* pValue =
+            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+        if (pValue == NULL && pValue->eName == FDE_CSSPROPERTYVALUE_Auto) {
+          pColumnWidth = NewEnumValue(pStaticStore, pValue->eName);
+        }
+      } break;
+      case FDE_CSSPRIMITIVETYPE_Number: {
+        FX_FLOAT fValue;
+        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
+          switch (eType) {
+            case FDE_CSSPRIMITIVETYPE_Number:
+              if (pColumnCount == NULL) {
+                pColumnCount = NewNumberValue(pStaticStore, eType, fValue);
+              }
+              break;
+            default:
+              if (pColumnWidth == NULL) {
+                pColumnWidth = NewNumberValue(pStaticStore, eType, fValue);
+              }
+              break;
+          }
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (pColumnWidth == NULL && pColumnCount == NULL) {
+    return FALSE;
+  } else if (pColumnWidth == NULL) {
+    pColumnWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto);
+  } else if (pColumnCount == NULL) {
+    pColumnCount = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto);
+  }
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnWidth, pColumnWidth,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnCount, pColumnCount,
+                    bImportant);
+  return TRUE;
+}
+FX_BOOL CFDE_CSSDeclaration::ParseOverflowProperty(
+    const FDE_CSSPROPERTYARGS* pArgs,
+    const FX_WCHAR* pszValue,
+    int32_t iValueLen,
+    FX_BOOL bImportant) {
+  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
+  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
+  IFDE_CSSPrimitiveValue* pOverflowX = NULL;
+  IFDE_CSSPrimitiveValue* pOverflowY = NULL;
+  FDE_CSSPRIMITIVETYPE eType;
+  while (parser.NextValue(eType, pszValue, iValueLen)) {
+    if (eType == FDE_CSSPRIMITIVETYPE_String) {
+      const FDE_CSSPROPERTYVALUETABLE* pValue =
+          FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
+      if (pValue != NULL) {
+        switch (pValue->eName) {
+          case FDE_CSSOVERFLOW_Visible:
+          case FDE_CSSOVERFLOW_Hidden:
+          case FDE_CSSOVERFLOW_Scroll:
+          case FDE_CSSOVERFLOW_Auto:
+          case FDE_CSSOVERFLOW_NoDisplay:
+          case FDE_CSSOVERFLOW_NoContent:
+            if (pOverflowX != NULL && pOverflowY != NULL) {
+              return FALSE;
+            } else if (pOverflowX == NULL) {
+              pOverflowX = NewEnumValue(pStaticStore, pValue->eName);
+            } else if (pOverflowY == NULL) {
+              pOverflowY = NewEnumValue(pStaticStore, pValue->eName);
+            }
+            break;
+          default:
+            break;
+        }
+      }
+    }
+  }
+  if (pOverflowX == NULL && pOverflowY == NULL) {
+    return FALSE;
+  } else if (pOverflowY == NULL) {
+    pOverflowY = NewEnumValue(pStaticStore, pOverflowX->GetEnum());
+  }
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowX, pOverflowX,
+                    bImportant);
+  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowY, pOverflowY,
+                    bImportant);
+  return TRUE;
+}
diff --git a/xfa/fde/css/fde_cssdeclaration.h b/xfa/fde/css/fde_cssdeclaration.h
new file mode 100644
index 0000000..2a3031e
--- /dev/null
+++ b/xfa/fde/css/fde_cssdeclaration.h
@@ -0,0 +1,158 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSDECLARATION_H_
+#define XFA_FDE_CSS_FDE_CSSDECLARATION_H_
+
+#include "xfa/fde/css/fde_cssdatatable.h"
+
+class FDE_CSSPropertyHolder : public CFX_Target {
+ public:
+  int16_t eProperty;
+  int16_t bImportant;
+  IFDE_CSSValue* pValue;
+  FDE_CSSPropertyHolder* pNext;
+};
+
+class FDE_CSSCustomProperty : public CFX_Target {
+ public:
+  const FX_WCHAR* pwsName;
+  const FX_WCHAR* pwsValue;
+  FDE_CSSCustomProperty* pNext;
+};
+
+struct FDE_CSSPROPERTYARGS {
+  IFX_MEMAllocator* pStaticStore;
+  CFX_MapPtrToPtr* pStringCache;
+  FDE_LPCCSSPROPERTYTABLE pProperty;
+};
+
+class CFDE_CSSDeclaration : public IFDE_CSSDeclaration, public CFX_Target {
+ public:
+  CFDE_CSSDeclaration()
+      : m_pFirstProperty(NULL),
+        m_pLastProperty(NULL),
+        m_pFirstCustom(NULL),
+        m_pLastCustom(NULL) {}
+  virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty,
+                                     FX_BOOL& bImportant) const;
+  virtual FX_POSITION GetStartPosition() const;
+  virtual void GetNextProperty(FX_POSITION& pos,
+                               FDE_CSSPROPERTY& eProperty,
+                               IFDE_CSSValue*& pValue,
+                               FX_BOOL& bImportant) const;
+  virtual FX_POSITION GetStartCustom() const;
+  virtual void GetNextCustom(FX_POSITION& pos,
+                             CFX_WideString& wsName,
+                             CFX_WideString& wsValue) const;
+  FX_BOOL AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                      const FX_WCHAR* pszValue,
+                      int32_t iValueLen);
+  FX_BOOL AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                      const FX_WCHAR* pszName,
+                      int32_t iNameLen,
+                      const FX_WCHAR* pszValue,
+                      int32_t iValueLen);
+
+ protected:
+  FX_BOOL ParseTextEmphasisProperty(FDE_CSSPROPERTYARGS* pArgs,
+                                    const FX_WCHAR* pszValue,
+                                    int32_t iValueLen,
+                                    FX_BOOL bImportant);
+  FX_BOOL ParseColumnsProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                               const FX_WCHAR* pszValue,
+                               int32_t iValueLen,
+                               FX_BOOL bImportant);
+  FX_BOOL ParseColumnRuleProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                  const FX_WCHAR* pszValue,
+                                  int32_t iValueLen,
+                                  FX_BOOL bImportant);
+  FX_BOOL ParseOverflowProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                const FX_WCHAR* pszValue,
+                                int32_t iValueLen,
+                                FX_BOOL bImportant);
+  FX_BOOL ParseFontProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                            const FX_WCHAR* pszValue,
+                            int32_t iValueLen,
+                            FX_BOOL bImportant);
+  FX_BOOL ParseBackgroundProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                  const FX_WCHAR* pszValue,
+                                  int32_t iValueLen,
+                                  FX_BOOL bImportant);
+  FX_BOOL ParseListStyleProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                 const FX_WCHAR* pszValue,
+                                 int32_t iValueLen,
+                                 FX_BOOL bImportant);
+  FX_BOOL ParseBorderPropoerty(IFX_MEMAllocator* pStaticStore,
+                               const FX_WCHAR* pszValue,
+                               int32_t iValueLen,
+                               IFDE_CSSValue*& pColor,
+                               IFDE_CSSValue*& pStyle,
+                               IFDE_CSSValue*& pWidth) const;
+  void AddBorderProperty(IFX_MEMAllocator* pStaticStore,
+                         IFDE_CSSValue* pColor,
+                         IFDE_CSSValue* pStyle,
+                         IFDE_CSSValue* pWidth,
+                         FX_BOOL bImportant,
+                         FDE_CSSPROPERTY eColor,
+                         FDE_CSSPROPERTY eStyle,
+                         FDE_CSSPROPERTY eWidth);
+  FX_BOOL ParseContentProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                               const FX_WCHAR* pszValue,
+                               int32_t iValueLen,
+                               FX_BOOL bImportant);
+  FX_BOOL ParseCounterProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                               const FX_WCHAR* pszValue,
+                               int32_t iValueLen,
+                               FX_BOOL bImportant);
+  FX_BOOL ParseValueListProperty(const FDE_CSSPROPERTYARGS* pArgs,
+                                 const FX_WCHAR* pszValue,
+                                 int32_t iValueLen,
+                                 FX_BOOL bImportant);
+  FX_BOOL Add4ValuesProperty(IFX_MEMAllocator* pStaticStore,
+                             const CFDE_CSSValueArray& list,
+                             FX_BOOL bImportant,
+                             FDE_CSSPROPERTY eLeft,
+                             FDE_CSSPROPERTY eTop,
+                             FDE_CSSPROPERTY eRight,
+                             FDE_CSSPROPERTY eBottom);
+  IFDE_CSSValue* ParseNumber(const FDE_CSSPROPERTYARGS* pArgs,
+                             const FX_WCHAR* pszValue,
+                             int32_t iValueLen);
+  IFDE_CSSValue* ParseEnum(const FDE_CSSPROPERTYARGS* pArgs,
+                           const FX_WCHAR* pszValue,
+                           int32_t iValueLen);
+  IFDE_CSSValue* ParseColor(const FDE_CSSPROPERTYARGS* pArgs,
+                            const FX_WCHAR* pszValue,
+                            int32_t iValueLen);
+  IFDE_CSSValue* ParseURI(const FDE_CSSPROPERTYARGS* pArgs,
+                          const FX_WCHAR* pszValue,
+                          int32_t iValueLen);
+  IFDE_CSSValue* ParseString(const FDE_CSSPROPERTYARGS* pArgs,
+                             const FX_WCHAR* pszValue,
+                             int32_t iValueLen);
+  IFDE_CSSValue* ParseFunction(const FDE_CSSPROPERTYARGS* pArgs,
+                               const FX_WCHAR* pszValue,
+                               int32_t iValueLen);
+  const FX_WCHAR* CopyToLocal(const FDE_CSSPROPERTYARGS* pArgs,
+                              const FX_WCHAR* pszValue,
+                              int32_t iValueLen);
+  void AddPropertyHolder(IFX_MEMAllocator* pStaticStore,
+                         FDE_CSSPROPERTY eProperty,
+                         IFDE_CSSValue* pValue,
+                         FX_BOOL bImportant);
+  IFDE_CSSPrimitiveValue* NewNumberValue(IFX_MEMAllocator* pStaticStore,
+                                         FDE_CSSPRIMITIVETYPE eUnit,
+                                         FX_FLOAT fValue) const;
+  IFDE_CSSPrimitiveValue* NewEnumValue(IFX_MEMAllocator* pStaticStore,
+                                       FDE_CSSPROPERTYVALUE eValue) const;
+  FDE_CSSPropertyHolder* m_pFirstProperty;
+  FDE_CSSPropertyHolder* m_pLastProperty;
+  FDE_CSSCustomProperty* m_pFirstCustom;
+  FDE_CSSCustomProperty* m_pLastCustom;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSSDECLARATION_H_
diff --git a/xfa/fde/css/fde_cssstyleselector.cpp b/xfa/fde/css/fde_cssstyleselector.cpp
new file mode 100644
index 0000000..ca3a01c
--- /dev/null
+++ b/xfa/fde/css/fde_cssstyleselector.cpp
@@ -0,0 +1,1794 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_cssstyleselector.h"
+
+#include <algorithm>
+
+#include "xfa/fde/css/fde_csscache.h"
+#include "xfa/fde/css/fde_cssdeclaration.h"
+
+int32_t CFDE_CSSCounterStyle::FindIndex(const FX_WCHAR* pszIdentifier) {
+  int32_t iCount = m_arrCounterData.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) ==
+        0) {
+      return i;
+    }
+  }
+  return -1;
+}
+void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList* pList) {
+  if (pList == NULL) {
+    return;
+  }
+  int32_t iCount = pList->CountValues();
+  FX_FLOAT fDefValue = 1.0;
+  FX_BOOL bDefIncrement = TRUE;
+  if (pList == m_pCounterReset) {
+    fDefValue = 0.0;
+    bDefIncrement = FALSE;
+  }
+  for (int32_t i = 0; i < iCount; i++) {
+    IFDE_CSSValueList* pCounter = (IFDE_CSSValueList*)pList->GetValue(i);
+    int32_t iLen;
+    const FX_WCHAR* pszIdentifier =
+        ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(0)))->GetString(iLen);
+    FX_FLOAT fValue = fDefValue;
+    if (pCounter->CountValues() > 1) {
+      fValue = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(1)))->GetFloat();
+    }
+    int32_t iIndex = FindIndex(pszIdentifier);
+    if (iIndex == -1) {
+      FDE_CSSCOUNTERDATA data;
+      data.m_pszIdent = pszIdentifier;
+      if (bDefIncrement) {
+        data.m_bIncrement = TRUE;
+        data.m_iIncVal = (int32_t)fValue;
+      } else {
+        data.m_iResetVal = (int32_t)fValue;
+        data.m_bReset = TRUE;
+      }
+      m_arrCounterData.Add(data);
+    } else {
+      FDE_CSSCOUNTERDATA& data = m_arrCounterData.ElementAt(iIndex);
+      if (bDefIncrement) {
+        data.m_bIncrement = TRUE;
+        data.m_iIncVal += (int32_t)fValue;
+      } else {
+        data.m_bReset = TRUE;
+        data.m_iResetVal = (int32_t)fValue;
+      }
+    }
+  }
+}
+void CFDE_CSSCounterStyle::UpdateIndex() {
+  if (!m_bIndexDirty) {
+    return;
+  }
+  m_arrCounterData.RemoveAll();
+  DoUpdateIndex(m_pCounterInc);
+  DoUpdateIndex(m_pCounterReset);
+  m_bIndexDirty = FALSE;
+}
+FDE_CSSTEXTEMPHASISMARK CFDE_CSSComputedStyle::GetTextEmphasisMark() const {
+  if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) {
+    return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark;
+  }
+  if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) {
+    return FDE_CSSTEXTEMPHASISMARK_Dot;
+  }
+  return FDE_CSSTEXTEMPHASISMARK_Sesame;
+}
+FDE_CSSRuleData::FDE_CSSRuleData(IFDE_CSSSelector* pSel,
+                                 IFDE_CSSDeclaration* pDecl,
+                                 FX_DWORD dwPos)
+    : pSelector(pSel), pDeclaration(pDecl), dwPriority(dwPos), pNext(NULL) {
+  static const FX_DWORD s_Specific[5] = {0x00010000, 0x00010000, 0x00100000,
+                                         0x00100000, 0x01000000};
+  for (; pSel != NULL; pSel = pSel->GetNextSelector()) {
+    FDE_CSSSELECTORTYPE eType = pSel->GetType();
+    if (eType > FDE_CSSSELECTORTYPE_Descendant ||
+        pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) {
+      dwPriority += s_Specific[eType];
+    }
+  }
+}
+void CFDE_CSSRuleCollection::Clear() {
+  m_IDRules.RemoveAll();
+  m_TagRules.RemoveAll();
+  m_ClassRules.RemoveAll();
+  m_pUniversalRules = NULL;
+  m_pStaticStore = NULL;
+  m_iSelectors = 0;
+}
+void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets,
+                                          FX_DWORD dwMediaList,
+                                          IFX_FontMgr* pFontMgr) {
+  int32_t iSheets = sheets.GetSize();
+  for (int32_t i = 0; i < iSheets; ++i) {
+    IFDE_CSSStyleSheet* pSheet = sheets.GetAt(i);
+    if (FX_DWORD dwMatchMedia = pSheet->GetMediaList() & dwMediaList) {
+      int32_t iRules = pSheet->CountRules();
+      for (int32_t j = 0; j < iRules; j++) {
+        AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr);
+      }
+    }
+  }
+}
+void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet,
+                                          IFDE_CSSRule* pRule,
+                                          FX_DWORD dwMediaList,
+                                          IFX_FontMgr* pFontMgr) {
+  switch (pRule->GetType()) {
+    case FDE_CSSRULETYPE_Style: {
+      IFDE_CSSStyleRule* pStyleRule = (IFDE_CSSStyleRule*)pRule;
+      IFDE_CSSDeclaration* pDeclaration = pStyleRule->GetDeclaration();
+      int32_t iSelectors = pStyleRule->CountSelectorLists();
+      for (int32_t i = 0; i < iSelectors; ++i) {
+        IFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i);
+        if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) {
+          FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration);
+          AddRuleTo(m_pPersudoRules, pData);
+          continue;
+        }
+        if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) {
+          AddRuleTo(m_TagRules, pSelector->GetNameHash(), pSelector,
+                    pDeclaration);
+          continue;
+        }
+        IFDE_CSSSelector* pNext = pSelector->GetNextSelector();
+        if (pNext == NULL) {
+          FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration);
+          AddRuleTo(m_pUniversalRules, pData);
+          continue;
+        }
+        switch (pNext->GetType()) {
+          case FDE_CSSSELECTORTYPE_ID:
+            AddRuleTo(m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration);
+            break;
+          case FDE_CSSSELECTORTYPE_Class:
+            AddRuleTo(m_ClassRules, pNext->GetNameHash(), pSelector,
+                      pDeclaration);
+            break;
+          case FDE_CSSSELECTORTYPE_Descendant:
+          case FDE_CSSSELECTORTYPE_Element:
+            AddRuleTo(m_pUniversalRules, NewRuleData(pSelector, pDeclaration));
+            break;
+          default:
+            FXSYS_assert(FALSE);
+            break;
+        }
+      }
+    } break;
+    case FDE_CSSRULETYPE_Media: {
+      IFDE_CSSMediaRule* pMediaRule = (IFDE_CSSMediaRule*)pRule;
+      if (pMediaRule->GetMediaList() & dwMediaList) {
+        int32_t iRules = pMediaRule->CountRules();
+        for (int32_t i = 0; i < iRules; ++i) {
+          AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList,
+                       pFontMgr);
+        }
+      }
+    } break;
+    default:
+      break;
+  }
+}
+void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr& map,
+                                       FX_DWORD dwKey,
+                                       IFDE_CSSSelector* pSel,
+                                       IFDE_CSSDeclaration* pDecl) {
+  void* pKey = (void*)(uintptr_t)dwKey;
+  FDE_CSSRuleData* pData = NewRuleData(pSel, pDecl);
+  FDE_CSSRuleData* pList = NULL;
+  if (!map.Lookup(pKey, (void*&)pList)) {
+    map.SetAt(pKey, pData);
+  } else if (AddRuleTo(pList, pData)) {
+    map.SetAt(pKey, pList);
+  }
+}
+
+FX_BOOL CFDE_CSSRuleCollection::AddRuleTo(FDE_CSSRuleData*& pList,
+                                          FDE_CSSRuleData* pData) {
+  if (pList) {
+    pData->pNext = pList->pNext;
+    pList->pNext = pData;
+    return FALSE;
+  }
+
+  pList = pData;
+  return TRUE;
+}
+
+FDE_CSSRuleData* CFDE_CSSRuleCollection::NewRuleData(
+    IFDE_CSSSelector* pSel,
+    IFDE_CSSDeclaration* pDecl) {
+  return FXTARGET_NewWith(m_pStaticStore)
+      FDE_CSSRuleData(pSel, pDecl, ++m_iSelectors);
+}
+
+IFDE_CSSStyleSelector* IFDE_CSSStyleSelector::Create() {
+  return new CFDE_CSSStyleSelector;
+}
+CFDE_CSSStyleSelector::CFDE_CSSStyleSelector()
+    : m_pFontMgr(NULL),
+      m_fDefFontSize(12.0f),
+      m_pRuleDataStore(NULL),
+      m_pInlineStyleStore(NULL),
+      m_pFixedStyleStore(NULL),
+      m_pAccelerator(NULL) {
+  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author;
+  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User;
+  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] =
+      FDE_CSSSTYLESHEETGROUP_UserAgent;
+}
+CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector() {
+  Reset();
+  if (m_pInlineStyleStore != NULL) {
+    m_pInlineStyleStore->Release();
+  }
+  if (m_pFixedStyleStore != NULL) {
+    m_pFixedStyleStore->Release();
+  }
+  if (m_pAccelerator != NULL) {
+    delete m_pAccelerator;
+  }
+}
+void CFDE_CSSStyleSelector::SetFontMgr(IFX_FontMgr* pFontMgr) {
+  m_pFontMgr = pFontMgr;
+}
+void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) {
+  FXSYS_assert(fFontSize > 0);
+  m_fDefFontSize = fFontSize;
+}
+IFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() {
+  if (m_pAccelerator == NULL) {
+    m_pAccelerator = new CFDE_CSSAccelerator;
+    FXSYS_assert(m_pAccelerator != NULL);
+  }
+  m_pAccelerator->Clear();
+  return m_pAccelerator;
+}
+IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(
+    IFDE_CSSComputedStyle* pParentStyle) {
+  if (m_pFixedStyleStore == NULL) {
+    m_pFixedStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 16,
+                                            sizeof(CFDE_CSSComputedStyle));
+    FXSYS_assert(m_pFixedStyleStore != NULL);
+  }
+  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore)
+      CFDE_CSSComputedStyle(m_pFixedStyleStore);
+  if (pParentStyle) {
+    pStyle->m_InheritedData =
+        ((CFDE_CSSComputedStyle*)pParentStyle)->m_InheritedData;
+  } else {
+    pStyle->m_InheritedData.Reset();
+  }
+  pStyle->m_NonInheritedData.Reset();
+  return pStyle;
+}
+FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
+                                             IFDE_CSSStyleSheet* pSheet) {
+  FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);
+  CFDE_CSSStyleSheetArray& dest = m_SheetGroups[eType];
+  dest.RemoveAt(0, dest.GetSize());
+  if (pSheet != NULL) {
+    dest.Add(pSheet);
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(
+    FDE_CSSSTYLESHEETGROUP eType,
+    const CFDE_CSSStyleSheetArray* pArray) {
+  FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);
+  CFDE_CSSStyleSheetArray& dest = m_SheetGroups[eType];
+  if (pArray == NULL) {
+    dest.RemoveAt(0, dest.GetSize());
+  } else {
+    dest.Copy(*pArray);
+  }
+  return TRUE;
+}
+void CFDE_CSSStyleSelector::SetStylePriority(
+    FDE_CSSSTYLESHEETGROUP eType,
+    FDE_CSSSTYLESHEETPRIORITY ePriority) {
+  m_ePriorities[ePriority] = eType;
+}
+void CFDE_CSSStyleSelector::UpdateStyleIndex(FX_DWORD dwMediaList) {
+  Reset();
+  m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0);
+  FXSYS_assert(m_pRuleDataStore != NULL);
+  for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
+    CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup];
+    rules.m_pStaticStore = m_pRuleDataStore;
+    rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr);
+  }
+}
+void CFDE_CSSStyleSelector::Reset() {
+  for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
+    m_RuleCollection[iGroup].Clear();
+  }
+  if (m_pRuleDataStore != NULL) {
+    m_pRuleDataStore->Release();
+    m_pRuleDataStore = NULL;
+  }
+}
+int32_t CFDE_CSSStyleSelector::MatchDeclarations(
+    IFDE_CSSTagProvider* pTag,
+    CFDE_CSSDeclarationArray& matchedDecls,
+    FDE_CSSPERSUDO ePersudoType) {
+  FXSYS_assert(m_pAccelerator != NULL && pTag != NULL);
+  FDE_CSSTagCache* pCache = m_pAccelerator->GetTopElement();
+  FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag);
+  matchedDecls.RemoveAt(0, matchedDecls.GetSize());
+  for (int32_t ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0;
+       --ePriority) {
+    FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority];
+    CFDE_CSSRuleCollection& rules = m_RuleCollection[eGroup];
+    if (rules.CountSelectors() == 0) {
+      continue;
+    }
+    if (ePersudoType == FDE_CSSPERSUDO_NONE) {
+      MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType);
+      if (pCache->HashTag()) {
+        MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()),
+                   ePersudoType);
+      }
+      int32_t iCount = pCache->CountHashClass();
+      for (int32_t i = 0; i < iCount; i++) {
+        pCache->SetClassIndex(i);
+        MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()),
+                   ePersudoType);
+      }
+    } else {
+      MatchRules(pCache, rules.GetPersudoRuleData(), ePersudoType);
+    }
+
+    std::sort(m_MatchedRules.begin(), m_MatchedRules.end(),
+              [](const FDE_CSSRuleData* p1, const FDE_CSSRuleData* p2) {
+                return p1->dwPriority < p2->dwPriority;
+              });
+    for (const auto& rule : m_MatchedRules)
+      matchedDecls.Add(rule->pDeclaration);
+    m_MatchedRules.clear();
+  }
+  return matchedDecls.GetSize();
+}
+
+void CFDE_CSSStyleSelector::MatchRules(FDE_CSSTagCache* pCache,
+                                       FDE_CSSRuleData* pList,
+                                       FDE_CSSPERSUDO ePersudoType) {
+  while (pList) {
+    if (MatchSelector(pCache, pList->pSelector, ePersudoType))
+      m_MatchedRules.push_back(pList);
+    pList = pList->pNext;
+  }
+}
+
+FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_CSSTagCache* pCache,
+                                             IFDE_CSSSelector* pSel,
+                                             FDE_CSSPERSUDO ePersudoType) {
+  FX_DWORD dwHash;
+  while (pSel != NULL && pCache != NULL) {
+    switch (pSel->GetType()) {
+      case FDE_CSSSELECTORTYPE_Descendant:
+        dwHash = pSel->GetNameHash();
+        while ((pCache = pCache->GetParent()) != NULL) {
+          if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {
+            continue;
+          }
+          if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) {
+            return TRUE;
+          }
+        }
+        return FALSE;
+      case FDE_CSSSELECTORTYPE_ID:
+        dwHash = pCache->HashID();
+        if (dwHash != pSel->GetNameHash()) {
+          return FALSE;
+        }
+        break;
+      case FDE_CSSSELECTORTYPE_Class:
+        dwHash = pCache->HashClass();
+        if (dwHash != pSel->GetNameHash()) {
+          return FALSE;
+        }
+        break;
+      case FDE_CSSSELECTORTYPE_Element:
+        dwHash = pSel->GetNameHash();
+        if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {
+          return FALSE;
+        }
+        break;
+      case FDE_CSSSELECTORTYPE_Persudo:
+        dwHash = FDE_GetCSSPersudoByEnum(ePersudoType)->dwHash;
+        if (dwHash != pSel->GetNameHash()) {
+          return FALSE;
+        }
+        break;
+      default:
+        FXSYS_assert(FALSE);
+        break;
+    }
+    pSel = pSel->GetNextSelector();
+  }
+  return pSel == NULL && pCache != NULL;
+}
+
+void CFDE_CSSStyleSelector::ComputeStyle(
+    IFDE_CSSTagProvider* pTag,
+    const IFDE_CSSDeclaration** ppDeclArray,
+    int32_t iDeclCount,
+    IFDE_CSSComputedStyle* pDestStyle) {
+  FXSYS_assert(iDeclCount >= 0);
+  FXSYS_assert(pDestStyle);
+  FX_POSITION pos = pTag->GetFirstAttribute();
+  if (pos != NULL) {
+    if (m_pInlineStyleStore == NULL) {
+      m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0);
+    }
+    CFDE_CSSDeclaration* pDecl = NULL;
+    CFX_WideStringC wsAttri, wsValue;
+    FX_DWORD dwAttriHash;
+    do {
+      pTag->GetNextAttribute(pos, wsAttri, wsValue);
+      dwAttriHash =
+          FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE);
+      static const FX_DWORD s_dwStyleHash =
+          FX_HashCode_String_GetW(L"style", 5, TRUE);
+      static const FX_DWORD s_dwAlignHash =
+          FX_HashCode_String_GetW(L"align", 5, TRUE);
+      if (dwAttriHash == s_dwStyleHash) {
+        if (pDecl == NULL) {
+          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+        }
+        AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength());
+      } else if (dwAttriHash == s_dwAlignHash) {
+        if (pDecl == NULL) {
+          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+        }
+        FDE_CSSPROPERTYARGS args;
+        args.pStringCache = NULL;
+        args.pStaticStore = m_pInlineStyleStore;
+        args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);
+        pDecl->AddProperty(&args, wsValue.GetPtr(), wsValue.GetLength());
+      }
+    } while (pos != NULL);
+    if (pDecl != NULL) {
+      CFDE_CSSDeclarationArray decls;
+      decls.SetSize(iDeclCount + 1);
+      IFDE_CSSDeclaration** ppInline = decls.GetData();
+      FXSYS_memcpy(ppInline, ppDeclArray,
+                   iDeclCount * sizeof(IFDE_CSSDeclaration*));
+      ppInline[iDeclCount++] = pDecl;
+      ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration**)ppInline, iDeclCount,
+                        pDestStyle);
+      ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration**)ppInline,
+                        iDeclCount, pDestStyle);
+      return;
+    }
+  }
+  if (iDeclCount > 0) {
+    FXSYS_assert(ppDeclArray != NULL);
+    ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle);
+    ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle);
+  }
+}
+void CFDE_CSSStyleSelector::ApplyDeclarations(
+    FX_BOOL bPriority,
+    const IFDE_CSSDeclaration** ppDeclArray,
+    int32_t iDeclCount,
+    IFDE_CSSComputedStyle* pDestStyle) {
+  CFDE_CSSComputedStyle* pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle;
+  IFDE_CSSValue* pVal;
+  FX_BOOL bImportant;
+  int32_t i;
+  if (bPriority) {
+    IFDE_CSSValue *pLastest = NULL, *pImportant = NULL;
+    for (i = 0; i < iDeclCount; ++i) {
+      pVal = ppDeclArray[i]->GetProperty(FDE_CSSPROPERTY_FontSize, bImportant);
+      if (pVal == NULL) {
+        continue;
+      } else if (bImportant) {
+        pImportant = pVal;
+      } else {
+        pLastest = pVal;
+      }
+    }
+    if (pImportant) {
+      ApplyProperty(FDE_CSSPROPERTY_FontSize, pImportant, pComputedStyle);
+    } else if (pLastest) {
+      ApplyProperty(FDE_CSSPROPERTY_FontSize, pLastest, pComputedStyle);
+    }
+  } else {
+    CFDE_CSSDeclarationArray importants;
+    const IFDE_CSSDeclaration* pDecl = NULL;
+    FDE_CSSPROPERTY eProp;
+    FX_POSITION pos;
+    for (i = 0; i < iDeclCount; ++i) {
+      pDecl = ppDeclArray[i];
+      pos = pDecl->GetStartPosition();
+      while (pos != NULL) {
+        pDecl->GetNextProperty(pos, eProp, pVal, bImportant);
+        if (eProp == FDE_CSSPROPERTY_FontSize) {
+          continue;
+        } else if (!bImportant) {
+          ApplyProperty(eProp, pVal, pComputedStyle);
+        } else if (importants.GetSize() == 0 ||
+                   importants[importants.GetUpperBound()] != pDecl) {
+          importants.Add((IFDE_CSSDeclaration*)pDecl);
+        }
+      }
+    }
+    iDeclCount = importants.GetSize();
+    for (i = 0; i < iDeclCount; ++i) {
+      pDecl = importants[i];
+      pos = pDecl->GetStartPosition();
+      while (pos != NULL) {
+        pDecl->GetNextProperty(pos, eProp, pVal, bImportant);
+        if (bImportant && eProp != FDE_CSSPROPERTY_FontSize) {
+          ApplyProperty(eProp, pVal, pComputedStyle);
+        }
+      }
+    }
+    CFX_WideString wsName, wsValue;
+    pos = pDecl->GetStartCustom();
+    while (pos) {
+      pDecl->GetNextCustom(pos, wsName, wsValue);
+      pComputedStyle->AddCustomStyle(wsName, wsValue);
+    }
+  }
+}
+void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
+                                              const FX_WCHAR* psz,
+                                              int32_t iLen) {
+  FXSYS_assert(pDecl != NULL && psz != NULL && iLen > 0);
+  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
+  if (pSyntax == NULL) {
+    return;
+  }
+  if (pSyntax->Init(psz, iLen, 32, TRUE)) {
+    int32_t iLen;
+    const FX_WCHAR* psz;
+    FDE_CSSPROPERTYARGS args;
+    args.pStringCache = NULL;
+    args.pStaticStore = m_pInlineStyleStore;
+    args.pProperty = NULL;
+    CFX_WideString wsName;
+    for (;;) {
+      FDE_CSSSYNTAXSTATUS eStatus = pSyntax->DoSyntaxParse();
+      if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyName) {
+        psz = pSyntax->GetCurrentString(iLen);
+        args.pProperty = FDE_GetCSSPropertyByName(psz, iLen);
+        if (args.pProperty == NULL) {
+          wsName = CFX_WideStringC(psz, iLen);
+        }
+      } else if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyValue) {
+        if (args.pProperty != NULL) {
+          psz = pSyntax->GetCurrentString(iLen);
+          if (iLen > 0) {
+            pDecl->AddProperty(&args, psz, iLen);
+          }
+        } else if (iLen > 0) {
+          psz = pSyntax->GetCurrentString(iLen);
+          if (iLen > 0) {
+            pDecl->AddProperty(&args, wsName, wsName.GetLength(), psz, iLen);
+          }
+        }
+      } else {
+        break;
+      }
+    }
+  }
+  pSyntax->Release();
+}
+#define FDE_CSSNONINHERITS (pComputedStyle->m_NonInheritedData)
+#define FDE_CSSINHERITS (pComputedStyle->m_InheritedData)
+#define FDE_CSSFONTSIZE (FDE_CSSINHERITS.m_fFontSize)
+void CFDE_CSSStyleSelector::ApplyProperty(
+    FDE_CSSPROPERTY eProperty,
+    IFDE_CSSValue* pValue,
+    CFDE_CSSComputedStyle* pComputedStyle) {
+  if (pValue->GetType() == FDE_CSSVALUETYPE_Primitive) {
+    IFDE_CSSPrimitiveValue* pPrimitive = (IFDE_CSSPrimitiveValue*)pValue;
+    FDE_CSSPRIMITIVETYPE eType = pPrimitive->GetPrimitiveType();
+    switch (eProperty) {
+      case FDE_CSSPROPERTY_Display:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eDisplay = ToDisplay(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_FontSize: {
+        FX_FLOAT& fFontSize = FDE_CSSFONTSIZE;
+        if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
+            eType <= FDE_CSSPRIMITIVETYPE_PC) {
+          fFontSize = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          fFontSize = ToFontSize(pPrimitive->GetEnum(), fFontSize);
+        }
+      } break;
+      case FDE_CSSPROPERTY_LineHeight:
+        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          FDE_CSSINHERITS.m_fLineHeight =
+              pPrimitive->GetFloat() * FDE_CSSFONTSIZE;
+        } else if (eType > FDE_CSSPRIMITIVETYPE_Number &&
+                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
+          FDE_CSSINHERITS.m_fLineHeight =
+              ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);
+        }
+        break;
+      case FDE_CSSPROPERTY_TextAlign:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eTextAligh = ToTextAlign(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_TextIndent:
+        SetLengthWithPercent(FDE_CSSINHERITS.m_TextIndent, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_FontWeight:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_wFontWeight = ToFontWeight(pPrimitive->GetEnum());
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          int32_t iValue = (int32_t)pPrimitive->GetFloat() / 100;
+          if (iValue >= 1 && iValue <= 9) {
+            FDE_CSSINHERITS.m_wFontWeight = iValue * 100;
+          }
+        }
+        break;
+      case FDE_CSSPROPERTY_FontStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eFontStyle = ToFontStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_Color:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSINHERITS.m_dwFontColor = pPrimitive->GetRGBColor();
+        }
+        break;
+      case FDE_CSSPROPERTY_MarginLeft:
+        FDE_CSSNONINHERITS.m_bHasMargin |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.left, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MarginTop:
+        FDE_CSSNONINHERITS.m_bHasMargin |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.top, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MarginRight:
+        FDE_CSSNONINHERITS.m_bHasMargin |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.right, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MarginBottom:
+        FDE_CSSNONINHERITS.m_bHasMargin |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.bottom, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_PaddingLeft:
+        FDE_CSSNONINHERITS.m_bHasPadding |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.left, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_PaddingTop:
+        FDE_CSSNONINHERITS.m_bHasPadding |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.top, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_PaddingRight:
+        FDE_CSSNONINHERITS.m_bHasPadding |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.right, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_PaddingBottom:
+        FDE_CSSNONINHERITS.m_bHasPadding |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.bottom,
+                                 eType, pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BorderLeftWidth:
+        FDE_CSSNONINHERITS.m_bHasBorder |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.left, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BorderTopWidth:
+        FDE_CSSNONINHERITS.m_bHasBorder |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.top, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BorderRightWidth:
+        FDE_CSSNONINHERITS.m_bHasBorder |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.right, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BorderBottomWidth:
+        FDE_CSSNONINHERITS.m_bHasBorder |=
+            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.bottom, eType,
+                                 pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BorderLeftStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBDRLeftStyle =
+              ToBorderStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderTopStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBDRTopStyle =
+              ToBorderStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderRightStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBDRRightStyle =
+              ToBorderStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderBottomStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBDRBottomStyle =
+              ToBorderStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderLeftColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwBDRLeftColor = pPrimitive->GetRGBColor();
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderTopColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwBDRTopColor = pPrimitive->GetRGBColor();
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderRightColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwBDRRightColor = pPrimitive->GetRGBColor();
+        }
+        break;
+      case FDE_CSSPROPERTY_BorderBottomColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwBDRBottomColor = pPrimitive->GetRGBColor();
+        }
+        break;
+      case FDE_CSSPROPERTY_ListStyleType:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eListStyleType =
+              ToListStyleType(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_ListStylePosition:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eListStylePosition =
+              ToListStylePosition(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BackgroundColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwBKGColor = pPrimitive->GetRGBColor();
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_dwBKGColor = 0;
+        }
+        break;
+      case FDE_CSSPROPERTY_Visibility:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eVisibility = ToVisibility(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_Width:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cx, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_Height:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cy, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MinWidth:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cx, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MinHeight:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cy, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MaxWidth:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cx, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_MaxHeight:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cy, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_VerticalAlign:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eVerticalAlign =
+              ToVerticalAlign(pPrimitive->GetEnum());
+        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
+                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
+          FDE_CSSNONINHERITS.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number;
+          FDE_CSSNONINHERITS.m_fVerticalAlign =
+              ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);
+        }
+        break;
+      case FDE_CSSPROPERTY_WhiteSpace:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eWhiteSpace = ToWhiteSpace(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_TextTransform:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eTextTransform =
+              ToTextTransform(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_FontVariant:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eFontVariant = ToFontVariant(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_LetterSpacing:
+        if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
+          break;
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
+        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
+                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
+          SetLengthWithPercent(FDE_CSSINHERITS.m_LetterSpacing, eType,
+                               pPrimitive, FDE_CSSFONTSIZE);
+        }
+        break;
+      case FDE_CSSPROPERTY_WordSpacing:
+        if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
+          break;
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
+        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
+                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
+          SetLengthWithPercent(FDE_CSSINHERITS.m_WordSpacing, eType, pPrimitive,
+                               FDE_CSSFONTSIZE);
+        }
+        break;
+      case FDE_CSSPROPERTY_Float:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eFloat = ToFloat(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_Clear:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eClear = ToClear(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_WritingMode:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eWritingMode = ToWritingMode(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_WordBreak:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eWordBreak = ToWordBreak(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_Widows:
+        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          FDE_CSSINHERITS.m_iWidows = (int32_t)pPrimitive->GetFloat();
+        }
+        break;
+      case FDE_CSSPROPERTY_Orphans:
+        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          FDE_CSSINHERITS.m_iOrphans = (int32_t)pPrimitive->GetFloat();
+        }
+        break;
+      case FDE_CSSPROPERTY_TextEmphasisColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          switch (pPrimitive->GetEnum()) {
+            case FDE_CSSPROPERTYVALUE_Transparent:
+              FDE_CSSINHERITS.m_dwTextEmphasisColor = 0;
+              FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;
+              break;
+            case FDE_CSSPROPERTYVALUE_Currentcolor:
+              FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = TRUE;
+              break;
+            default:
+              break;
+          }
+        } else if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSINHERITS.m_dwTextEmphasisColor = pPrimitive->GetRGBColor();
+          FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;
+        }
+        break;
+      case FDE_CSSPROPERTY_PageBreakBefore:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_ePageBreakBefore =
+              ToPageBreak(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_PageBreakAfter:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_ePageBreakAfter =
+              ToPageBreak(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_PageBreakInside:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_ePageBreakInside =
+              ToPageBreak(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_OverflowX:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eOverflowX = ToOverflow(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_OverflowY:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eOverflowY = ToOverflow(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_LineBreak:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eLineBreak = ToLineBreak(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_ColumnCount:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);
+        } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {
+          FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Point,
+                                               pPrimitive->GetFloat());
+        }
+        break;
+      case FDE_CSSPROPERTY_ColumnGap:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnGap, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_ColumnRuleColor:
+        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
+          FDE_CSSNONINHERITS.m_dwColumnRuleColor = pPrimitive->GetRGBColor();
+          FDE_CSSNONINHERITS.m_bColumnRuleColorSame = FALSE;
+        }
+        break;
+      case FDE_CSSPROPERTY_ColumnRuleStyle:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eColumnRuleStyle =
+              ToBorderStyle(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_ColumnRuleWidth:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnRuleWidth, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_ColumnWidth:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnWidth, eType,
+                             pPrimitive, FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_BackgroundImage:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_pszBKGImage = NULL;
+        } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {
+          int32_t iLength;
+          FDE_CSSNONINHERITS.m_pszBKGImage = pPrimitive->GetString(iLength);
+        }
+        break;
+      case FDE_CSSPROPERTY_Position:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_ePosition = ToPosition(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_Top:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Top, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_Bottom:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Bottom, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_Left:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Left, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_Right:
+        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Right, eType, pPrimitive,
+                             FDE_CSSFONTSIZE);
+        break;
+      case FDE_CSSPROPERTY_ListStyleImage:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_pszListStyleImage = NULL;
+        } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {
+          int32_t iLength;
+          FDE_CSSINHERITS.m_pszListStyleImage = pPrimitive->GetString(iLength);
+        }
+        break;
+      case FDE_CSSPROPERTY_CaptionSide:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eCaptionSide = ToCaptionSide(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BackgroundRepeat:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBKGRepeat = ToBKGRepeat(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_BackgroundAttachment:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSNONINHERITS.m_eBKGAttachment =
+              ToBKGAttachment(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_RubyAlign:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eRubyAlign = ToRubyAlign(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_RubyOverhang:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eRubyOverhang =
+              ToRubyOverhang(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_RubyPosition:
+        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+          FDE_CSSINHERITS.m_eRubyPosition =
+              ToRubyPosition(pPrimitive->GetEnum());
+        }
+        break;
+      case FDE_CSSPROPERTY_RubySpan:
+        FDE_CSSNONINHERITS.m_pRubySpan = pPrimitive;
+        break;
+      default:
+        break;
+    }
+  } else if (pValue->GetType() == FDE_CSSVALUETYPE_List) {
+    IFDE_CSSValueList* pList = (IFDE_CSSValueList*)pValue;
+    int32_t iCount = pList->CountValues();
+    if (iCount > 0) {
+      switch (eProperty) {
+        case FDE_CSSPROPERTY_FontFamily:
+          FDE_CSSINHERITS.m_pFontFamily = pList;
+          break;
+        case FDE_CSSPROPERTY_TextDecoration:
+          FDE_CSSNONINHERITS.m_dwTextDecoration = ToTextDecoration(pList);
+          break;
+        case FDE_CSSPROPERTY_CounterIncrement: {
+          if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {
+            FDE_CSSNONINHERITS.m_pCounterStyle = new CFDE_CSSCounterStyle;
+          }
+          FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterIncrementList(pList);
+        } break;
+        case FDE_CSSPROPERTY_CounterReset: {
+          if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {
+            FDE_CSSNONINHERITS.m_pCounterStyle = new CFDE_CSSCounterStyle;
+          }
+          FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterResetList(pList);
+        } break;
+        case FDE_CSSPROPERTY_Content:
+          FDE_CSSNONINHERITS.m_pContentList = pList;
+          break;
+        case FDE_CSSPROPERTY_Quotes:
+          FDE_CSSINHERITS.m_pQuotes = pList;
+          break;
+        case FDE_CSSPROPERTY_TextCombine: {
+          for (int32_t i = 0; i < pList->CountValues(); i++) {
+            IFDE_CSSPrimitiveValue* pVal =
+                (IFDE_CSSPrimitiveValue*)pList->GetValue(i);
+            switch (pVal->GetPrimitiveType()) {
+              case FDE_CSSPRIMITIVETYPE_Enum: {
+                switch (pVal->GetEnum()) {
+                  case FDE_CSSPROPERTYVALUE_None: {
+                    FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_None;
+                    FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;
+                  } break;
+                  case FDE_CSSPROPERTYVALUE_Horizontal: {
+                    FDE_CSSNONINHERITS.m_eTextCombine =
+                        FDE_CSSTEXTCOMBINE_Horizontal;
+                    FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;
+                  } break;
+                  default:
+                    break;
+                }
+              } break;
+              case FDE_CSSPRIMITIVETYPE_Number:
+                FDE_CSSNONINHERITS.m_fTextCombineNumber = pVal->GetFloat();
+                break;
+              default:
+                break;
+            }
+          }
+        } break;
+        case FDE_CSSPROPERTY_TextEmphasisStyle: {
+          FDE_CSSTEXTEMPHASISFILL eFill;
+          FDE_CSSTEXTEMPHASISMARK eMark;
+          for (int32_t i = 0; i < pList->CountValues(); i++) {
+            IFDE_CSSPrimitiveValue* pVal =
+                (IFDE_CSSPrimitiveValue*)pList->GetValue(i);
+            switch (pVal->GetPrimitiveType()) {
+              case FDE_CSSPRIMITIVETYPE_Enum: {
+                if (ToTextEmphasisFill(pVal->GetEnum(), eFill)) {
+                  FDE_CSSINHERITS.m_eTextEmphasisFill = eFill;
+                  continue;
+                } else if (ToTextEmphasisMark(pVal->GetEnum(), eMark)) {
+                  FDE_CSSINHERITS.m_eTextEmphasisMark = eMark;
+                }
+              } break;
+              case FDE_CSSPRIMITIVETYPE_String: {
+                FDE_CSSINHERITS.m_eTextEmphasisMark =
+                    FDE_CSSTEXTEMPHASISMARK_Custom;
+                int32_t iLen;
+                FDE_CSSINHERITS.m_pszTextEmphasisCustomMark =
+                    pVal->GetString(iLen);
+              } break;
+              default:
+                break;
+            }
+          }
+        } break;
+        default:
+          break;
+      }
+    }
+  } else {
+    FXSYS_assert(FALSE);
+  }
+}
+FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
+                                            FX_FLOAT fValue,
+                                            FX_FLOAT fPercentBase) {
+  switch (eUnit) {
+    case FDE_CSSPRIMITIVETYPE_PX:
+    case FDE_CSSPRIMITIVETYPE_Number:
+      return fValue * 72 / 96;
+    case FDE_CSSPRIMITIVETYPE_PT:
+      return fValue;
+    case FDE_CSSPRIMITIVETYPE_EMS:
+    case FDE_CSSPRIMITIVETYPE_EXS:
+      return fValue * fPercentBase;
+    case FDE_CSSPRIMITIVETYPE_Percent:
+      return fValue * fPercentBase / 100.0f;
+    case FDE_CSSPRIMITIVETYPE_CM:
+      return fValue * 28.3464f;
+    case FDE_CSSPRIMITIVETYPE_MM:
+      return fValue * 2.8346f;
+    case FDE_CSSPRIMITIVETYPE_IN:
+      return fValue * 72.0f;
+    case FDE_CSSPRIMITIVETYPE_PC:
+      return fValue / 12.0f;
+    default:
+      return fValue;
+  }
+}
+FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+    default:
+      return FDE_CSSRUBYSPAN_None;
+  }
+}
+FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Before:
+      return FDE_CSSRUBYPOSITION_Before;
+    case FDE_CSSPROPERTYVALUE_After:
+      return FDE_CSSRUBYPOSITION_After;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSRUBYPOSITION_Right;
+    case FDE_CSSPROPERTYVALUE_Inline:
+      return FDE_CSSRUBYPOSITION_Inline;
+    default:
+      return FDE_CSSRUBYPOSITION_Before;
+  }
+}
+FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSRUBYOVERHANG_Auto;
+    case FDE_CSSPROPERTYVALUE_Start:
+      return FDE_CSSRUBYOVERHANG_Start;
+    case FDE_CSSPROPERTYVALUE_End:
+      return FDE_CSSRUBYOVERHANG_End;
+    case FDE_CSSPROPERTYVALUE_None:
+    default:
+      return FDE_CSSRUBYOVERHANG_None;
+  }
+}
+FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSRUBYALIGN_Auto;
+    case FDE_CSSPROPERTYVALUE_Start:
+      return FDE_CSSRUBYALIGN_Start;
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSRUBYALIGN_End;
+    case FDE_CSSPROPERTYVALUE_Center:
+      return FDE_CSSRUBYALIGN_Center;
+    case FDE_CSSPROPERTYVALUE_End:
+      return FDE_CSSRUBYALIGN_End;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSRUBYALIGN_Right;
+    case FDE_CSSPROPERTYVALUE_DistributeLetter:
+      return FDE_CSSRUBYALIGN_DistributeLetter;
+    case FDE_CSSPROPERTYVALUE_DistributeSpace:
+      return FDE_CSSRUBYALIGN_DistributeSpace;
+    case FDE_CSSPROPERTYVALUE_LineEdge:
+      return FDE_CSSRUBYALIGN_LineEdge;
+    default:
+      return FDE_CSSRUBYALIGN_Auto;
+  }
+}
+FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(
+    FDE_CSSPROPERTYVALUE eValue,
+    FDE_CSSTEXTEMPHASISMARK& eMark) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+      eMark = FDE_CSSTEXTEMPHASISMARK_None;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_Dot:
+      eMark = FDE_CSSTEXTEMPHASISMARK_Dot;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_Circle:
+      eMark = FDE_CSSTEXTEMPHASISMARK_Circle;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_DoubleCircle:
+      eMark = FDE_CSSTEXTEMPHASISMARK_DoubleCircle;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_Triangle:
+      eMark = FDE_CSSTEXTEMPHASISMARK_Triangle;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_Sesame:
+      eMark = FDE_CSSTEXTEMPHASISMARK_Sesame;
+      return TRUE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(
+    FDE_CSSPROPERTYVALUE eValue,
+    FDE_CSSTEXTEMPHASISFILL& eFill) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Filled:
+      eFill = FDE_CSSTEXTEMPHASISFILL_Filled;
+      return TRUE;
+    case FDE_CSSPROPERTYVALUE_Open:
+      eFill = FDE_CSSTEXTEMPHASISFILL_Open;
+      return TRUE;
+    default:
+      return FALSE;
+  }
+}
+FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Fixed:
+      return FDE_CSSBKGATTACHMENT_Fixed;
+    case FDE_CSSPROPERTYVALUE_Scroll:
+      return FDE_CSSBKGATTACHMENT_Scroll;
+    default:
+      return FDE_CSSBKGATTACHMENT_Fixed;
+  }
+}
+FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Top:
+      return FDE_CSSCAPTIONSIDE_Top;
+    case FDE_CSSPROPERTYVALUE_Bottom:
+      return FDE_CSSCAPTIONSIDE_Bottom;
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSCAPTIONSIDE_Left;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSCAPTIONSIDE_Right;
+    case FDE_CSSPROPERTYVALUE_Before:
+      return FDE_CSSCAPTIONSIDE_Before;
+    case FDE_CSSPROPERTYVALUE_After:
+      return FDE_CSSCAPTIONSIDE_After;
+    default:
+      return FDE_CSSCAPTIONSIDE_Top;
+  }
+}
+FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Static:
+      return FDE_CSSPOSITION_Static;
+    case FDE_CSSPROPERTYVALUE_Relative:
+      return FDE_CSSPOSITION_Relative;
+    case FDE_CSSPROPERTYVALUE_Fixed:
+      return FDE_CSSPOSITION_Fixed;
+    case FDE_CSSPROPERTYVALUE_Absolute:
+      return FDE_CSSPOSITION_Absolute;
+    default:
+      return FDE_CSSPOSITION_Static;
+  }
+}
+FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSCURSOR_Auto;
+    case FDE_CSSPROPERTYVALUE_Crosshair:
+      return FDE_CSSCURSOR_Crosshair;
+    case FDE_CSSPROPERTYVALUE_Default:
+      return FDE_CSSCURSOR_Default;
+    case FDE_CSSPROPERTYVALUE_Pointer:
+      return FDE_CSSCURSOR_Pointer;
+    case FDE_CSSPROPERTYVALUE_Move:
+      return FDE_CSSCURSOR_Move;
+    case FDE_CSSPROPERTYVALUE_EResize:
+      return FDE_CSSCURSOR_EResize;
+    case FDE_CSSPROPERTYVALUE_NeResize:
+      return FDE_CSSCURSOR_NeResize;
+    case FDE_CSSPROPERTYVALUE_NwResize:
+      return FDE_CSSCURSOR_NwResize;
+    case FDE_CSSPROPERTYVALUE_NResize:
+      return FDE_CSSCURSOR_NResize;
+    case FDE_CSSPROPERTYVALUE_SeResize:
+      return FDE_CSSCURSOR_SeResize;
+    case FDE_CSSPROPERTYVALUE_SwResize:
+      return FDE_CSSCURSOR_SwResize;
+    default:
+      return FDE_CSSCURSOR_Auto;
+  }
+}
+FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Repeat:
+      return FDE_CSSBKGREPEAT_Repeat;
+    case FDE_CSSPROPERTYVALUE_RepeatX:
+      return FDE_CSSBKGREPEAT_RepeatX;
+    case FDE_CSSPROPERTYVALUE_RepeatY:
+      return FDE_CSSBKGREPEAT_RepeatY;
+    case FDE_CSSPROPERTYVALUE_NoRepeat:
+      return FDE_CSSBKGREPEAT_NoRepeat;
+    default:
+      return FDE_CSSBKGREPEAT_Repeat;
+  }
+}
+FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Horizontal:
+      return FDE_CSSTEXTCOMBINE_Horizontal;
+    case FDE_CSSPROPERTYVALUE_None:
+    default:
+      return FDE_CSSTEXTCOMBINE_None;
+  }
+}
+FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSLINEBREAK_Auto;
+    case FDE_CSSPROPERTYVALUE_Loose:
+      return FDE_CSSLINEBREAK_Loose;
+    case FDE_CSSPROPERTYVALUE_Normal:
+      return FDE_CSSLINEBREAK_Normal;
+    case FDE_CSSPROPERTYVALUE_Strict:
+      return FDE_CSSLINEBREAK_Strict;
+    default:
+      return FDE_CSSLINEBREAK_Auto;
+  }
+}
+FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Visible:
+      return FDE_CSSOVERFLOW_Visible;
+    case FDE_CSSPROPERTYVALUE_Hidden:
+      return FDE_CSSOVERFLOW_Hidden;
+    case FDE_CSSPROPERTYVALUE_Scroll:
+      return FDE_CSSOVERFLOW_Scroll;
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSOVERFLOW_Auto;
+    case FDE_CSSPROPERTYVALUE_NoDisplay:
+      return FDE_CSSOVERFLOW_NoDisplay;
+    case FDE_CSSPROPERTYVALUE_NoContent:
+      return FDE_CSSOVERFLOW_NoContent;
+    default:
+      return FDE_CSSOVERFLOW_Visible;
+  }
+}
+FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_HorizontalTb:
+      return FDE_CSSWRITINGMODE_HorizontalTb;
+    case FDE_CSSPROPERTYVALUE_VerticalRl:
+      return FDE_CSSWRITINGMODE_VerticalRl;
+    case FDE_CSSPROPERTYVALUE_VerticalLr:
+      return FDE_CSSWRITINGMODE_VerticalLr;
+    default:
+      return FDE_CSSWRITINGMODE_HorizontalTb;
+  }
+}
+FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Normal:
+      return FDE_CSSWORDBREAK_Normal;
+    case FDE_CSSPROPERTYVALUE_KeepAll:
+      return FDE_CSSWORDBREAK_KeepAll;
+    case FDE_CSSPROPERTYVALUE_BreakAll:
+      return FDE_CSSWORDBREAK_BreakAll;
+    case FDE_CSSPROPERTYVALUE_KeepWords:
+      return FDE_CSSWORDBREAK_KeepWords;
+    default:
+      return FDE_CSSWORDBREAK_Normal;
+  }
+}
+FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSFLOAT_Left;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSFLOAT_Right;
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSFLOAT_None;
+    default:
+      return FDE_CSSFLOAT_None;
+  }
+}
+FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSCLEAR_None;
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSCLEAR_Left;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSCLEAR_Right;
+    case FDE_CSSPROPERTYVALUE_Both:
+      return FDE_CSSCLEAR_Both;
+    default:
+      return FDE_CSSCLEAR_None;
+  }
+}
+FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Avoid:
+      return FDE_CSSPAGEBREAK_Avoid;
+    case FDE_CSSPROPERTYVALUE_Auto:
+      return FDE_CSSPAGEBREAK_Auto;
+    case FDE_CSSPROPERTYVALUE_Always:
+      return FDE_CSSPAGEBREAK_Always;
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSPAGEBREAK_Left;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSPAGEBREAK_Right;
+    default:
+      return FDE_CSSPAGEBREAK_Auto;
+  }
+}
+FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Inline:
+      return FDE_CSSDISPLAY_Inline;
+    case FDE_CSSPROPERTYVALUE_Block:
+      return FDE_CSSDISPLAY_Block;
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSDISPLAY_None;
+    case FDE_CSSPROPERTYVALUE_ListItem:
+      return FDE_CSSDISPLAY_ListItem;
+    case FDE_CSSPROPERTYVALUE_TableCell:
+      return FDE_CSSDISPLAY_TableCell;
+    case FDE_CSSPROPERTYVALUE_TableRow:
+      return FDE_CSSDISPLAY_TableRow;
+    case FDE_CSSPROPERTYVALUE_Table:
+      return FDE_CSSDISPLAY_Table;
+    case FDE_CSSPROPERTYVALUE_TableCaption:
+      return FDE_CSSDISPLAY_TableCaption;
+    case FDE_CSSPROPERTYVALUE_TableRowGroup:
+      return FDE_CSSDISPLAY_TableRowGroup;
+    case FDE_CSSPROPERTYVALUE_TableHeaderGroup:
+      return FDE_CSSDISPLAY_TableHeaderGroup;
+    case FDE_CSSPROPERTYVALUE_TableFooterGroup:
+      return FDE_CSSDISPLAY_TableFooterGroup;
+    case FDE_CSSPROPERTYVALUE_TableColumnGroup:
+      return FDE_CSSDISPLAY_TableColumnGroup;
+    case FDE_CSSPROPERTYVALUE_TableColumn:
+      return FDE_CSSDISPLAY_TableColumn;
+    case FDE_CSSPROPERTYVALUE_InlineTable:
+      return FDE_CSSDISPLAY_InlineTable;
+    case FDE_CSSPROPERTYVALUE_InlineBlock:
+      return FDE_CSSDISPLAY_InlineBlock;
+    case FDE_CSSPROPERTYVALUE_RunIn:
+      return FDE_CSSDISPLAY_RunIn;
+    case FDE_CSSPROPERTYVALUE_Ruby:
+      return FDE_CSSDISPLAY_Ruby;
+    case FDE_CSSPROPERTYVALUE_RubyBase:
+      return FDE_CSSDISPLAY_RubyBase;
+    case FDE_CSSPROPERTYVALUE_RubyText:
+      return FDE_CSSDISPLAY_RubyText;
+    case FDE_CSSPROPERTYVALUE_RubyBaseGroup:
+      return FDE_CSSDISPLSY_RubyBaseGroup;
+    case FDE_CSSPROPERTYVALUE_RubyTextGroup:
+      return FDE_CSSDISPLAY_RubyTextGroup;
+    default:
+      return FDE_CSSDISPLAY_Inline;
+  }
+}
+FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Left:
+      return FDE_CSSTEXTALIGN_Left;
+    case FDE_CSSPROPERTYVALUE_Center:
+      return FDE_CSSTEXTALIGN_Center;
+    case FDE_CSSPROPERTYVALUE_Right:
+      return FDE_CSSTEXTALIGN_Right;
+    case FDE_CSSPROPERTYVALUE_Justify:
+      return FDE_CSSTEXTALIGN_Justify;
+    default:
+      return FDE_CSSTEXTALIGN_Left;
+  }
+}
+FX_WORD CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Normal:
+      return 400;
+    case FDE_CSSPROPERTYVALUE_Bold:
+      return 700;
+    case FDE_CSSPROPERTYVALUE_Bolder:
+      return 900;
+    case FDE_CSSPROPERTYVALUE_Lighter:
+      return 200;
+    default:
+      return 400;
+  }
+}
+FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Italic:
+    case FDE_CSSPROPERTYVALUE_Oblique:
+      return FDE_CSSFONTSTYLE_Italic;
+    default:
+      return FDE_CSSFONTSTYLE_Normal;
+  }
+}
+FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSBORDERSTYLE_None;
+    case FDE_CSSPROPERTYVALUE_Solid:
+      return FDE_CSSBORDERSTYLE_Solid;
+    case FDE_CSSPROPERTYVALUE_Hidden:
+      return FDE_CSSBORDERSTYLE_Hidden;
+    case FDE_CSSPROPERTYVALUE_Dotted:
+      return FDE_CSSBORDERSTYLE_Dotted;
+    case FDE_CSSPROPERTYVALUE_Dashed:
+      return FDE_CSSBORDERSTYLE_Dashed;
+    case FDE_CSSPROPERTYVALUE_Double:
+      return FDE_CSSBORDERSTYLE_Double;
+    case FDE_CSSPROPERTYVALUE_Groove:
+      return FDE_CSSBORDERSTYLE_Groove;
+    case FDE_CSSPROPERTYVALUE_Ridge:
+      return FDE_CSSBORDERSTYLE_Ridge;
+    case FDE_CSSPROPERTYVALUE_Inset:
+      return FDE_CSSBORDERSTYLE_Inset;
+    case FDE_CSSPROPERTYVALUE_Outset:
+      return FDE_CSSBORDERSTYLE_outset;
+    default:
+      return FDE_CSSBORDERSTYLE_None;
+  }
+}
+FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(
+    FDE_CSSLENGTH& width,
+    FDE_CSSPRIMITIVETYPE eType,
+    IFDE_CSSPrimitiveValue* pPrimitive,
+    FX_FLOAT fFontSize) {
+  if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
+    width.Set(FDE_CSSLENGTHUNIT_Percent, pPrimitive->GetFloat() / 100.0f);
+    return width.NonZero();
+  } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
+             eType <= FDE_CSSPRIMITIVETYPE_PC) {
+    FX_FLOAT fValue = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);
+    width.Set(FDE_CSSLENGTHUNIT_Point, fValue);
+    return width.NonZero();
+  } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
+    switch (pPrimitive->GetEnum()) {
+      case FDE_CSSPROPERTYVALUE_Auto:
+        width.Set(FDE_CSSLENGTHUNIT_Auto);
+        return TRUE;
+      case FDE_CSSPROPERTYVALUE_None:
+        width.Set(FDE_CSSLENGTHUNIT_None);
+        return TRUE;
+      case FDE_CSSPROPERTYVALUE_Thin:
+        width.Set(FDE_CSSLENGTHUNIT_Point, 2);
+        return TRUE;
+      case FDE_CSSPROPERTYVALUE_Medium:
+        width.Set(FDE_CSSLENGTHUNIT_Point, 3);
+        return TRUE;
+      case FDE_CSSPROPERTYVALUE_Thick:
+        width.Set(FDE_CSSLENGTHUNIT_Point, 4);
+        return TRUE;
+      default:
+        return FALSE;
+    }
+  }
+  return FALSE;
+}
+FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue,
+                                           FX_FLOAT fCurFontSize) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_XxSmall:
+      return m_fDefFontSize / 1.2f / 1.2f / 1.2f;
+    case FDE_CSSPROPERTYVALUE_XSmall:
+      return m_fDefFontSize / 1.2f / 1.2f;
+    case FDE_CSSPROPERTYVALUE_Small:
+      return m_fDefFontSize / 1.2f;
+    case FDE_CSSPROPERTYVALUE_Medium:
+      return m_fDefFontSize;
+    case FDE_CSSPROPERTYVALUE_Large:
+      return m_fDefFontSize * 1.2f;
+    case FDE_CSSPROPERTYVALUE_XLarge:
+      return m_fDefFontSize * 1.2f * 1.2f;
+    case FDE_CSSPROPERTYVALUE_XxLarge:
+      return m_fDefFontSize * 1.2f * 1.2f * 1.2f;
+    case FDE_CSSPROPERTYVALUE_Larger:
+      return fCurFontSize * 1.2f;
+    case FDE_CSSPROPERTYVALUE_Smaller:
+      return fCurFontSize / 1.2f;
+    default:
+      return fCurFontSize;
+  }
+}
+FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Baseline:
+      return FDE_CSSVERTICALALIGN_Baseline;
+    case FDE_CSSPROPERTYVALUE_Middle:
+      return FDE_CSSVERTICALALIGN_Middle;
+    case FDE_CSSPROPERTYVALUE_Bottom:
+      return FDE_CSSVERTICALALIGN_Bottom;
+    case FDE_CSSPROPERTYVALUE_Super:
+      return FDE_CSSVERTICALALIGN_Super;
+    case FDE_CSSPROPERTYVALUE_Sub:
+      return FDE_CSSVERTICALALIGN_Sub;
+    case FDE_CSSPROPERTYVALUE_Top:
+      return FDE_CSSVERTICALALIGN_Top;
+    case FDE_CSSPROPERTYVALUE_TextTop:
+      return FDE_CSSVERTICALALIGN_TextTop;
+    case FDE_CSSPROPERTYVALUE_TextBottom:
+      return FDE_CSSVERTICALALIGN_TextBottom;
+    default:
+      return FDE_CSSVERTICALALIGN_Baseline;
+  }
+}
+FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSLISTSTYLETYPE_None;
+    case FDE_CSSPROPERTYVALUE_Disc:
+      return FDE_CSSLISTSTYLETYPE_Disc;
+    case FDE_CSSPROPERTYVALUE_Circle:
+      return FDE_CSSLISTSTYLETYPE_Circle;
+    case FDE_CSSPROPERTYVALUE_Square:
+      return FDE_CSSLISTSTYLETYPE_Square;
+    case FDE_CSSPROPERTYVALUE_Decimal:
+      return FDE_CSSLISTSTYLETYPE_Decimal;
+    case FDE_CSSPROPERTYVALUE_DecimalLeadingZero:
+      return FDE_CSSLISTSTYLETYPE_DecimalLeadingZero;
+    case FDE_CSSPROPERTYVALUE_LowerRoman:
+      return FDE_CSSLISTSTYLETYPE_LowerRoman;
+    case FDE_CSSPROPERTYVALUE_UpperRoman:
+      return FDE_CSSLISTSTYLETYPE_UpperRoman;
+    case FDE_CSSPROPERTYVALUE_LowerGreek:
+      return FDE_CSSLISTSTYLETYPE_LowerGreek;
+    case FDE_CSSPROPERTYVALUE_LowerLatin:
+      return FDE_CSSLISTSTYLETYPE_LowerLatin;
+    case FDE_CSSPROPERTYVALUE_UpperLatin:
+      return FDE_CSSLISTSTYLETYPE_UpperLatin;
+    case FDE_CSSPROPERTYVALUE_Armenian:
+      return FDE_CSSLISTSTYLETYPE_Armenian;
+    case FDE_CSSPROPERTYVALUE_Georgian:
+      return FDE_CSSLISTSTYLETYPE_Georgian;
+    case FDE_CSSPROPERTYVALUE_LowerAlpha:
+      return FDE_CSSLISTSTYLETYPE_LowerAlpha;
+    case FDE_CSSPROPERTYVALUE_UpperAlpha:
+      return FDE_CSSLISTSTYLETYPE_UpperAlpha;
+    case FDE_CSSPROPERTYVALUE_CjkIdeographic:
+      return FDE_CSSLISTSTYLETYPE_CjkIdeographic;
+    case FDE_CSSPROPERTYVALUE_Hebrew:
+      return FDE_CSSLISTSTYLETYPE_Hebrew;
+    case FDE_CSSLISTSTYLETYPE_Hiragana:
+      return FDE_CSSLISTSTYLETYPE_Hiragana;
+    case FDE_CSSLISTSTYLETYPE_HiraganaIroha:
+      return FDE_CSSLISTSTYLETYPE_HiraganaIroha;
+    case FDE_CSSLISTSTYLETYPE_Katakana:
+      return FDE_CSSLISTSTYLETYPE_Katakana;
+    case FDE_CSSLISTSTYLETYPE_KatakanaIroha:
+      return FDE_CSSLISTSTYLETYPE_KatakanaIroha;
+    default:
+      return FDE_CSSLISTSTYLETYPE_Disc;
+  }
+}
+FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(
+    FDE_CSSPROPERTYVALUE eValue) {
+  return eValue == FDE_CSSPROPERTYVALUE_Inside
+             ? FDE_CSSLISTSTYLEPOSITION_Inside
+             : FDE_CSSLISTSTYLEPOSITION_Outside;
+}
+FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Visible:
+      return FDE_CSSVISIBILITY_Visible;
+    case FDE_CSSPROPERTYVALUE_Hidden:
+      return FDE_CSSVISIBILITY_Hidden;
+    case FDE_CSSPROPERTYVALUE_Collapse:
+      return FDE_CSSVISIBILITY_Collapse;
+    default:
+      return FDE_CSSVISIBILITY_Visible;
+  }
+}
+FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_Normal:
+      return FDE_CSSWHITESPACE_Normal;
+    case FDE_CSSPROPERTYVALUE_Pre:
+      return FDE_CSSWHITESPACE_Pre;
+    case FDE_CSSPROPERTYVALUE_Nowrap:
+      return FDE_CSSWHITESPACE_Nowrap;
+    case FDE_CSSPROPERTYVALUE_PreWrap:
+      return FDE_CSSWHITESPACE_PreWrap;
+    case FDE_CSSPROPERTYVALUE_PreLine:
+      return FDE_CSSWHITESPACE_PreLine;
+    default:
+      return FDE_CSSWHITESPACE_Normal;
+  }
+}
+FX_DWORD CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) {
+  FX_DWORD dwDecoration = 0;
+  for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) {
+    IFDE_CSSPrimitiveValue* pPrimitive =
+        (IFDE_CSSPrimitiveValue*)pValue->GetValue(i);
+    if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) {
+      switch (pPrimitive->GetEnum()) {
+        case FDE_CSSPROPERTYVALUE_Underline:
+          dwDecoration |= FDE_CSSTEXTDECORATION_Underline;
+          break;
+        case FDE_CSSPROPERTYVALUE_LineThrough:
+          dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough;
+          break;
+        case FDE_CSSPROPERTYVALUE_Overline:
+          dwDecoration |= FDE_CSSTEXTDECORATION_Overline;
+          break;
+        case FDE_CSSPROPERTYVALUE_Blink:
+          dwDecoration |= FDE_CSSTEXTDECORATION_Blink;
+          break;
+        case FDE_CSSPROPERTYVALUE_Double:
+          dwDecoration |= FDE_CSSTEXTDECORATION_Double;
+          break;
+        default:
+          break;
+      }
+    }
+  }
+  return dwDecoration;
+}
+FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(
+    FDE_CSSPROPERTYVALUE eValue) {
+  switch (eValue) {
+    case FDE_CSSPROPERTYVALUE_None:
+      return FDE_CSSTEXTTRANSFORM_None;
+    case FDE_CSSPROPERTYVALUE_Capitalize:
+      return FDE_CSSTEXTTRANSFORM_Capitalize;
+    case FDE_CSSPROPERTYVALUE_Uppercase:
+      return FDE_CSSTEXTTRANSFORM_UpperCase;
+    case FDE_CSSPROPERTYVALUE_Lowercase:
+      return FDE_CSSTEXTTRANSFORM_LowerCase;
+    default:
+      return FDE_CSSTEXTTRANSFORM_None;
+  }
+}
+FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(
+    FDE_CSSPROPERTYVALUE eValue) {
+  return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps
+                                                  : FDE_CSSFONTVARIANT_Normal;
+}
diff --git a/xfa/fde/css/fde_cssstyleselector.h b/xfa/fde/css/fde_cssstyleselector.h
new file mode 100644
index 0000000..4f8177f
--- /dev/null
+++ b/xfa/fde/css/fde_cssstyleselector.h
@@ -0,0 +1,901 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
+#define XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
+
+#include <vector>
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fde/css/fde_css.h"
+#include "xfa/fde/css/fde_csscache.h"
+#include "xfa/fde/css/fde_cssdeclaration.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_system.h"
+
+#define FDE_CSSUNIVERSALHASH ('*')
+
+class FDE_CSSRuleData : public CFX_Target {
+ public:
+  FDE_CSSRuleData(IFDE_CSSSelector* pSel,
+                  IFDE_CSSDeclaration* pDecl,
+                  FX_DWORD dwPos);
+
+  IFDE_CSSSelector* pSelector;
+  IFDE_CSSDeclaration* pDeclaration;
+  FX_DWORD dwPriority;
+  FDE_CSSRuleData* pNext;
+};
+
+class CFDE_CSSRuleCollection : public CFX_Target {
+ public:
+  CFDE_CSSRuleCollection()
+      : m_pStaticStore(nullptr),
+        m_pUniversalRules(nullptr),
+        m_pPersudoRules(nullptr),
+        m_iSelectors(0) {}
+  ~CFDE_CSSRuleCollection() { Clear(); }
+  void AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets,
+                    FX_DWORD dwMediaList,
+                    IFX_FontMgr* pFontMgr);
+  void Clear();
+
+  int32_t CountSelectors() const { return m_iSelectors; }
+  FDE_CSSRuleData* GetIDRuleData(FX_DWORD dwIDHash) {
+    void* pData;
+    return m_IDRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
+               ? (FDE_CSSRuleData*)pData
+               : NULL;
+  }
+  FDE_CSSRuleData* GetTagRuleData(FX_DWORD dwTagHasn) {
+    void* pData;
+    return m_TagRules.Lookup((void*)(uintptr_t)dwTagHasn, pData)
+               ? (FDE_CSSRuleData*)pData
+               : NULL;
+  }
+  FDE_CSSRuleData* GetClassRuleData(FX_DWORD dwIDHash) {
+    void* pData;
+    return m_ClassRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
+               ? (FDE_CSSRuleData*)pData
+               : NULL;
+  }
+  FDE_CSSRuleData* GetUniversalRuleData() { return m_pUniversalRules; }
+  FDE_CSSRuleData* GetPersudoRuleData() { return m_pPersudoRules; }
+  IFX_MEMAllocator* m_pStaticStore;
+
+ protected:
+  void AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet,
+                    IFDE_CSSRule* pRule,
+                    FX_DWORD dwMediaList,
+                    IFX_FontMgr* pFontMgr);
+  void AddRuleTo(CFX_MapPtrToPtr& map,
+                 FX_DWORD dwKey,
+                 IFDE_CSSSelector* pSel,
+                 IFDE_CSSDeclaration* pDecl);
+  FX_BOOL AddRuleTo(FDE_CSSRuleData*& pList, FDE_CSSRuleData* pData);
+  FDE_CSSRuleData* NewRuleData(IFDE_CSSSelector* pSel,
+                               IFDE_CSSDeclaration* pDecl);
+  CFX_MapPtrToPtr m_IDRules;
+  CFX_MapPtrToPtr m_TagRules;
+  CFX_MapPtrToPtr m_ClassRules;
+  FDE_CSSRuleData* m_pUniversalRules;
+  FDE_CSSRuleData* m_pPersudoRules;
+  int32_t m_iSelectors;
+};
+class CFDE_CSSAccelerator;
+class CFDE_CSSComputedStyle;
+class CFDE_CSSStyleSelector : public IFDE_CSSStyleSelector, public CFX_Target {
+ public:
+  CFDE_CSSStyleSelector();
+  ~CFDE_CSSStyleSelector();
+  virtual void Release() { delete this; }
+
+  virtual void SetFontMgr(IFX_FontMgr* pFontMgr);
+  virtual void SetDefFontSize(FX_FLOAT fFontSize);
+
+  virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
+                                IFDE_CSSStyleSheet* pSheet);
+  virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType,
+                                 const CFDE_CSSStyleSheetArray* pArray);
+  virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType,
+                                FDE_CSSSTYLESHEETPRIORITY ePriority);
+  virtual void UpdateStyleIndex(FX_DWORD dwMediaList);
+  virtual IFDE_CSSAccelerator* InitAccelerator();
+  virtual IFDE_CSSComputedStyle* CreateComputedStyle(
+      IFDE_CSSComputedStyle* pParentStyle);
+  virtual int32_t MatchDeclarations(
+      IFDE_CSSTagProvider* pTag,
+      CFDE_CSSDeclarationArray& matchedDecls,
+      FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE);
+  virtual void ComputeStyle(IFDE_CSSTagProvider* pTag,
+                            const IFDE_CSSDeclaration** ppDeclArray,
+                            int32_t iDeclCount,
+                            IFDE_CSSComputedStyle* pDestStyle);
+
+ protected:
+  void Reset();
+  void MatchRules(FDE_CSSTagCache* pCache,
+                  FDE_CSSRuleData* pList,
+                  FDE_CSSPERSUDO ePersudoType);
+  FX_BOOL MatchSelector(FDE_CSSTagCache* pCache,
+                        IFDE_CSSSelector* pSel,
+                        FDE_CSSPERSUDO ePersudoType);
+  void AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
+                         const FX_WCHAR* psz,
+                         int32_t iLen);
+  void ApplyDeclarations(FX_BOOL bPriority,
+                         const IFDE_CSSDeclaration** ppDeclArray,
+                         int32_t iDeclCount,
+                         IFDE_CSSComputedStyle* pDestStyle);
+  void ApplyProperty(FDE_CSSPROPERTY eProperty,
+                     IFDE_CSSValue* pValue,
+                     CFDE_CSSComputedStyle* pComputedStyle);
+
+  FX_FLOAT ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
+                       FX_FLOAT fValue,
+                       FX_FLOAT fPercentBase);
+  FX_BOOL SetLengthWithPercent(FDE_CSSLENGTH& width,
+                               FDE_CSSPRIMITIVETYPE eType,
+                               IFDE_CSSPrimitiveValue* pPrimitive,
+                               FX_FLOAT fFontSize);
+  FX_FLOAT ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize);
+  FDE_CSSDISPLAY ToDisplay(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSTEXTALIGN ToTextAlign(FDE_CSSPROPERTYVALUE eValue);
+  FX_WORD ToFontWeight(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSFONTSTYLE ToFontStyle(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSBORDERSTYLE ToBorderStyle(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSVERTICALALIGN ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSLISTSTYLETYPE ToListStyleType(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSLISTSTYLEPOSITION ToListStylePosition(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSVISIBILITY ToVisibility(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSWHITESPACE ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue);
+  FX_DWORD ToTextDecoration(IFDE_CSSValueList* pList);
+  FDE_CSSTEXTTRANSFORM ToTextTransform(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSFONTVARIANT ToFontVariant(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSFLOAT ToFloat(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSCLEAR ToClear(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSWRITINGMODE ToWritingMode(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSWORDBREAK ToWordBreak(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSPAGEBREAK ToPageBreak(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSOVERFLOW ToOverflow(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSLINEBREAK ToLineBreak(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSTEXTCOMBINE ToTextCombine(FDE_CSSPROPERTYVALUE eValue);
+  FX_BOOL ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue,
+                             FDE_CSSTEXTEMPHASISMARK& eMark);
+  FX_BOOL ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue,
+                             FDE_CSSTEXTEMPHASISFILL& eFill);
+  FDE_CSSCURSOR ToCursor(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSPOSITION ToPosition(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSCAPTIONSIDE ToCaptionSide(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSBKGREPEAT ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSBKGATTACHMENT ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSRUBYALIGN ToRubyAlign(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSRUBYOVERHANG ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue);
+  FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue);
+  IFX_FontMgr* m_pFontMgr;
+  FX_FLOAT m_fDefFontSize;
+  IFX_MEMAllocator* m_pRuleDataStore;
+  CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX];
+  CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX];
+  FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX];
+  IFX_MEMAllocator* m_pInlineStyleStore;
+  IFX_MEMAllocator* m_pFixedStyleStore;
+  CFDE_CSSAccelerator* m_pAccelerator;
+  std::vector<FDE_CSSRuleData*> m_MatchedRules;
+};
+
+struct FDE_CSSCOUNTERDATA {
+ public:
+  FDE_CSSCOUNTERDATA() { FXSYS_memset(this, 0, sizeof(FDE_CSSCOUNTERDATA)); }
+  FX_BOOL GetCounterIncrement(int32_t& iValue) {
+    iValue = m_iIncVal;
+    return m_bIncrement;
+  }
+  FX_BOOL GetCounterReset(int32_t& iValue) {
+    iValue = m_iResetVal;
+    return m_bReset;
+  }
+
+  const FX_WCHAR* m_pszIdent;
+  FX_BOOL m_bIncrement;
+  FX_BOOL m_bReset;
+  int32_t m_iIncVal;
+  int32_t m_iResetVal;
+};
+
+class CFDE_CSSCounterStyle {
+ public:
+  CFDE_CSSCounterStyle() : m_pCounterInc(NULL), m_pCounterReset(NULL) {}
+  void SetCounterIncrementList(IFDE_CSSValueList* pList) {
+    m_pCounterInc = pList;
+    m_bIndexDirty = TRUE;
+  }
+  void SetCounterResetList(IFDE_CSSValueList* pList) {
+    m_pCounterReset = pList;
+    m_bIndexDirty = TRUE;
+  }
+  int32_t CountCounters() {
+    UpdateIndex();
+    return m_arrCounterData.GetSize();
+  }
+  FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
+    UpdateIndex();
+    return m_arrCounterData.ElementAt(index).GetCounterIncrement(iValue);
+  }
+  FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
+    UpdateIndex();
+    return m_arrCounterData.ElementAt(index).GetCounterReset(iValue);
+  }
+  const FX_WCHAR* GetCounterIdentifier(int32_t index) {
+    UpdateIndex();
+    return m_arrCounterData.ElementAt(index).m_pszIdent;
+  }
+
+ protected:
+  void UpdateIndex();
+  void DoUpdateIndex(IFDE_CSSValueList* pList);
+  int32_t FindIndex(const FX_WCHAR* pszIdentifier);
+  IFDE_CSSValueList* m_pCounterInc;
+  IFDE_CSSValueList* m_pCounterReset;
+  CFX_ArrayTemplate<FDE_CSSCOUNTERDATA> m_arrCounterData;
+  FX_BOOL m_bIndexDirty;
+};
+class CFDE_CSSInheritedData {
+ public:
+  void Reset() {
+    FXSYS_memset(this, 0, sizeof(CFDE_CSSInheritedData));
+    m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
+    m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
+    m_TextIndent.Set(FDE_CSSLENGTHUNIT_Point, 0);
+    m_fFontSize = 12.0f;
+    m_fLineHeight = 14.0f;
+    m_wFontWeight = 400;
+    m_dwFontColor = 0xFF000000;
+    m_iWidows = 2;
+    m_bTextEmphasisColorCurrent = TRUE;
+    m_iOrphans = 2;
+  }
+  const FX_WCHAR* m_pszListStyleImage;
+  FDE_CSSLENGTH m_LetterSpacing;
+  FDE_CSSLENGTH m_WordSpacing;
+  FDE_CSSLENGTH m_TextIndent;
+  IFDE_CSSValueList* m_pFontFamily;
+  IFDE_CSSValueList* m_pQuotes;
+  IFDE_CSSValueList* m_pCursorUris;
+  FDE_CSSCURSOR m_eCursor;
+  FX_FLOAT m_fFontSize;
+  FX_FLOAT m_fLineHeight;
+  FX_ARGB m_dwFontColor;
+  FX_ARGB m_dwTextEmphasisColor;
+  FX_WORD m_wFontWeight;
+  int32_t m_iWidows;
+  int32_t m_iOrphans;
+  const FX_WCHAR* m_pszTextEmphasisCustomMark;
+  FX_WORD m_eFontVariant : 1;
+  FX_WORD m_eFontStyle : 1;
+  FX_WORD m_bTextEmphasisColorCurrent : 1;
+  FX_WORD m_eTextAligh : 2;
+  FX_WORD m_eVisibility : 2;
+  FX_WORD m_eWhiteSpace : 3;
+  FX_WORD m_eTextTransform : 2;
+  FX_WORD m_eWritingMode : 2;
+  FX_WORD m_eWordBreak : 2;
+  FX_WORD m_eLineBreak : 2;
+  FX_WORD m_eTextEmphasisFill : 1;
+  FX_WORD m_eTextEmphasisMark : 3;
+  FX_WORD m_eCaptionSide : 3;
+
+  FX_WORD m_eRubyAlign : 4;
+  FX_WORD m_eRubyOverhang : 2;
+  FX_WORD m_eRubyPosition : 2;
+};
+class CFDE_CSSNonInheritedData {
+ public:
+  void Reset() {
+    FXSYS_memset(this, 0, sizeof(CFDE_CSSNonInheritedData));
+    m_MarginWidth = m_BorderWidth =
+        m_PaddingWidth.Set(FDE_CSSLENGTHUNIT_Point, 0);
+    m_MinBoxSize.Set(FDE_CSSLENGTHUNIT_Point, 0);
+    m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None);
+    m_eDisplay = FDE_CSSDISPLAY_Inline;
+    m_fVerticalAlign = 0.0f;
+    m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);
+    m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal);
+    m_bColumnRuleColorSame = TRUE;
+    m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto);
+    m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto);
+    m_eTextCombine = FDE_CSSTEXTCOMBINE_None;
+  }
+
+  IFDE_CSSValueList* m_pContentList;
+  CFDE_CSSCounterStyle* m_pCounterStyle;
+  FDE_CSSRECT m_MarginWidth;
+  FDE_CSSRECT m_BorderWidth;
+  FDE_CSSRECT m_PaddingWidth;
+  FDE_CSSSIZE m_BoxSize;
+  FDE_CSSSIZE m_MinBoxSize;
+  FDE_CSSSIZE m_MaxBoxSize;
+  FDE_CSSPOINT m_BKGPosition;
+  const FX_WCHAR* m_pszBKGImage;
+  FX_ARGB m_dwBKGColor;
+  FX_ARGB m_dwBDRLeftColor;
+  FX_ARGB m_dwBDRTopColor;
+  FX_ARGB m_dwBDRRightColor;
+  FX_ARGB m_dwBDRBottomColor;
+  IFDE_CSSValue* m_pRubySpan;
+  FDE_CSSLENGTH m_ColumnCount;
+  FDE_CSSLENGTH m_ColumnGap;
+  FDE_CSSLENGTH m_ColumnRuleWidth;
+  FDE_CSSLENGTH m_ColumnWidth;
+  FX_ARGB m_dwColumnRuleColor;
+  FDE_CSSLENGTH m_Top;
+  FDE_CSSLENGTH m_Bottom;
+  FDE_CSSLENGTH m_Left;
+  FDE_CSSLENGTH m_Right;
+
+  FX_FLOAT m_fVerticalAlign;
+  FX_FLOAT m_fTextCombineNumber;
+  FX_DWORD m_eBDRLeftStyle : 4;
+  FX_DWORD m_eBDRTopStyle : 4;
+  FX_DWORD m_eBDRRightStyle : 4;
+  FX_DWORD m_eBDRBottomStyle : 4;
+  FX_DWORD m_eDisplay : 5;
+  FX_DWORD m_eVerticalAlign : 4;
+  FX_DWORD m_eListStyleType : 5;
+  FX_DWORD m_eColumnRuleStyle : 4;
+  FX_DWORD m_ePageBreakInside : 3;
+  FX_DWORD m_ePageBreakAfter : 3;
+  FX_DWORD m_ePageBreakBefore : 3;
+  FX_DWORD m_ePosition : 2;
+  FX_DWORD m_eBKGRepeat : 2;
+  FX_DWORD m_eFloat : 2;
+  FX_DWORD m_eClear : 2;
+  FX_DWORD m_eOverflowX : 3;
+  FX_DWORD m_eOverflowY : 3;
+  FX_DWORD m_eListStylePosition : 1;
+  FX_DWORD m_eBKGAttachment : 1;
+  FX_DWORD m_bHasMargin : 1;
+  FX_DWORD m_bHasBorder : 1;
+  FX_DWORD m_bHasPadding : 1;
+  FX_DWORD m_dwTextDecoration : 5;
+  FX_DWORD m_eTextCombine : 1;
+  FX_DWORD m_bColumnRuleColorSame : 1;
+  FX_DWORD m_bHasTextCombineNumber : 1;
+};
+class CFDE_CSSComputedStyle : public IFDE_CSSComputedStyle,
+                              public IFDE_CSSFontStyle,
+                              public IFDE_CSSBoundaryStyle,
+                              public IFDE_CSSPositionStyle,
+                              public IFDE_CSSParagraphStyle,
+                              public IFDE_CSSBackgroundStyle,
+                              public IFDE_CSSVisualStyle,
+                              public IFDE_CSSListStyle,
+                              public IFDE_CSSMultiColumnStyle,
+                              public IFDE_CSSGeneratedContentStyle,
+                              public IFDE_CSSTableStyle,
+                              public IFDE_CSSRubyStyle,
+                              public CFX_Target {
+ public:
+  CFDE_CSSComputedStyle(IFX_MEMAllocator* pAlloc)
+      : m_dwRefCount(1), m_pAllocator(pAlloc) {}
+  ~CFDE_CSSComputedStyle() {}
+  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
+  virtual FX_DWORD Release() {
+    FX_DWORD dwRefCount = --m_dwRefCount;
+    if (dwRefCount == 0) {
+      if (m_NonInheritedData.m_pCounterStyle != NULL) {
+        delete m_NonInheritedData.m_pCounterStyle;
+      }
+      FXTARGET_DeleteWith(CFDE_CSSComputedStyle, m_pAllocator, this);
+    }
+    return dwRefCount;
+  }
+
+  virtual void Reset() {
+    m_InheritedData.Reset();
+    m_NonInheritedData.Reset();
+  }
+  virtual IFDE_CSSFontStyle* GetFontStyles() const {
+    return (IFDE_CSSFontStyle * const) this;
+  }
+  virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const {
+    return (IFDE_CSSBoundaryStyle * const) this;
+  }
+  virtual IFDE_CSSPositionStyle* GetPositionStyles() const {
+    return (IFDE_CSSPositionStyle * const) this;
+  }
+  virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const {
+    return (IFDE_CSSParagraphStyle * const) this;
+  }
+  virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const {
+    return (IFDE_CSSBackgroundStyle * const) this;
+  }
+  virtual IFDE_CSSVisualStyle* GetVisualStyles() const {
+    return (IFDE_CSSVisualStyle * const) this;
+  }
+  virtual IFDE_CSSListStyle* GetListStyles() const {
+    return (IFDE_CSSListStyle * const) this;
+  }
+  virtual IFDE_CSSTableStyle* GetTableStyle() const {
+    return (IFDE_CSSTableStyle * const) this;
+  }
+  virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const {
+    return (IFDE_CSSMultiColumnStyle * const) this;
+  }
+  virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const {
+    return (IFDE_CSSGeneratedContentStyle * const) this;
+  }
+  virtual IFDE_CSSRubyStyle* GetRubyStyle() const {
+    return (IFDE_CSSRubyStyle * const) this;
+  }
+  virtual FX_BOOL GetCustomStyle(const CFX_WideStringC& wsName,
+                                 CFX_WideString& wsValue) const {
+    for (int32_t i = m_CustomProperties.GetSize() - 2; i > -1; i -= 2) {
+      if (wsName == m_CustomProperties[i]) {
+        wsValue = m_CustomProperties[i + 1];
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+  virtual FDE_CSSRUBYALIGN GetRubyAlign() const {
+    return (FDE_CSSRUBYALIGN)m_InheritedData.m_eRubyAlign;
+  }
+  virtual FDE_CSSRUBYPOSITION GetRubyPosition() const {
+    return (FDE_CSSRUBYPOSITION)m_InheritedData.m_eRubyPosition;
+  }
+  virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const {
+    return (FDE_CSSRUBYOVERHANG)m_InheritedData.m_eRubyOverhang;
+  }
+  virtual FDE_CSSRUBYSPAN GetRubySpanType() const {
+    return m_NonInheritedData.m_pRubySpan == NULL ? FDE_CSSRUBYSPAN_None
+                                                  : FDE_CSSRUBYSPAN_Attr;
+  }
+  virtual IFDE_CSSValue* GetRubySpanAttr() const {
+    return m_NonInheritedData.m_pRubySpan;
+  }
+  virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const {
+    return (FDE_CSSCAPTIONSIDE)m_InheritedData.m_eCaptionSide;
+  }
+  virtual int32_t CountCounters() {
+    return (m_NonInheritedData.m_pCounterStyle == NULL)
+               ? 0
+               : m_NonInheritedData.m_pCounterStyle->CountCounters();
+  }
+  virtual const FX_WCHAR* GetCounterIdentifier(int32_t index) {
+    return m_NonInheritedData.m_pCounterStyle->GetCounterIdentifier(index);
+  }
+  virtual FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
+    return m_NonInheritedData.m_pCounterStyle->GetCounterReset(index, iValue);
+  }
+  virtual FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
+    return m_NonInheritedData.m_pCounterStyle->GetCounterIncrement(index,
+                                                                   iValue);
+  }
+  virtual IFDE_CSSValueList* GetContent() const {
+    return m_NonInheritedData.m_pContentList;
+  }
+  virtual int32_t CountQuotes() const {
+    return m_InheritedData.m_pQuotes == NULL
+               ? 0
+               : m_InheritedData.m_pQuotes->CountValues();
+  }
+  virtual const FX_WCHAR* GetQuotes(int32_t index) const {
+    FXSYS_assert(m_InheritedData.m_pQuotes != NULL &&
+                 m_InheritedData.m_pQuotes->CountValues() > index);
+    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pQuotes->GetValue(
+                index)))
+        ->GetString(index);
+  }
+  virtual const FDE_CSSLENGTH& GetColumnCount() const {
+    return m_NonInheritedData.m_ColumnCount;
+  }
+  virtual const FDE_CSSLENGTH& GetColumnGap() const {
+    return m_NonInheritedData.m_ColumnGap;
+  }
+  virtual FX_ARGB GetColumnRuleColor() const {
+    return m_NonInheritedData.m_bColumnRuleColorSame
+               ? m_InheritedData.m_dwFontColor
+               : m_NonInheritedData.m_dwColumnRuleColor;
+  }
+  virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const {
+    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eColumnRuleStyle;
+  }
+  virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const {
+    return m_NonInheritedData.m_ColumnRuleWidth;
+  }
+  virtual const FDE_CSSLENGTH& GetColumnWidth() const {
+    return m_NonInheritedData.m_ColumnWidth;
+  }
+  virtual void SetColumnCount(const FDE_CSSLENGTH& columnCount) {
+    m_NonInheritedData.m_ColumnCount = columnCount;
+  }
+  virtual void SetColumnGap(const FDE_CSSLENGTH& columnGap) {
+    m_NonInheritedData.m_ColumnGap = columnGap;
+  }
+  virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) {
+    m_NonInheritedData.m_dwColumnRuleColor = dwColumnRuleColor,
+    m_NonInheritedData.m_bColumnRuleColorSame = FALSE;
+  }
+  virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) {
+    m_NonInheritedData.m_eColumnRuleStyle = eColumnRuleStyle;
+  }
+  virtual void SetColumnRuleWidth(const FDE_CSSLENGTH& columnRuleWidth) {
+    m_NonInheritedData.m_ColumnRuleWidth = columnRuleWidth;
+  }
+  virtual void SetColumnWidth(const FDE_CSSLENGTH& columnWidth) {
+    m_NonInheritedData.m_ColumnWidth = columnWidth;
+  }
+  virtual int32_t CountFontFamilies() const {
+    return m_InheritedData.m_pFontFamily
+               ? m_InheritedData.m_pFontFamily->CountValues()
+               : 0;
+  }
+  virtual const FX_WCHAR* GetFontFamily(int32_t index) const {
+    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pFontFamily->GetValue(
+                index)))
+        ->GetString(index);
+  }
+  virtual FX_WORD GetFontWeight() const {
+    return m_InheritedData.m_wFontWeight;
+  }
+  virtual FDE_CSSFONTVARIANT GetFontVariant() const {
+    return (FDE_CSSFONTVARIANT)m_InheritedData.m_eFontVariant;
+  }
+  virtual FDE_CSSFONTSTYLE GetFontStyle() const {
+    return (FDE_CSSFONTSTYLE)m_InheritedData.m_eFontStyle;
+  }
+  virtual FX_FLOAT GetFontSize() const { return m_InheritedData.m_fFontSize; }
+  virtual FX_ARGB GetColor() const { return m_InheritedData.m_dwFontColor; }
+  virtual void SetFontWeight(FX_WORD wFontWeight) {
+    m_InheritedData.m_wFontWeight = wFontWeight;
+  }
+  virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) {
+    m_InheritedData.m_eFontVariant = eFontVariant;
+  }
+  virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) {
+    m_InheritedData.m_eFontStyle = eFontStyle;
+  }
+  virtual void SetFontSize(FX_FLOAT fFontSize) {
+    m_InheritedData.m_fFontSize = fFontSize;
+  }
+  virtual void SetColor(FX_ARGB dwFontColor) {
+    m_InheritedData.m_dwFontColor = dwFontColor;
+  }
+  virtual FX_ARGB GetBorderLeftColor() const {
+    return m_NonInheritedData.m_dwBDRLeftColor;
+  }
+  virtual FX_ARGB GetBorderTopColor() const {
+    return m_NonInheritedData.m_dwBDRTopColor;
+  }
+  virtual FX_ARGB GetBorderRightColor() const {
+    return m_NonInheritedData.m_dwBDRRightColor;
+  }
+  virtual FX_ARGB GetBorderBottomColor() const {
+    return m_NonInheritedData.m_dwBDRBottomColor;
+  }
+
+  virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const {
+    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRLeftStyle;
+  }
+  virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const {
+    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRTopStyle;
+  }
+  virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const {
+    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRRightStyle;
+  }
+  virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const {
+    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRBottomStyle;
+  }
+
+  virtual const FDE_CSSRECT* GetBorderWidth() const {
+    return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth)
+                                           : NULL;
+  }
+  virtual const FDE_CSSRECT* GetMarginWidth() const {
+    return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth)
+                                           : NULL;
+  }
+  virtual const FDE_CSSRECT* GetPaddingWidth() const {
+    return m_NonInheritedData.m_bHasPadding
+               ? &(m_NonInheritedData.m_PaddingWidth)
+               : NULL;
+  }
+  virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) {
+    m_NonInheritedData.m_dwBDRLeftColor = dwBorderColor;
+  }
+  virtual void SetBorderTopColor(FX_ARGB dwBorderColor) {
+    m_NonInheritedData.m_dwBDRTopColor = dwBorderColor;
+  }
+  virtual void SetBorderRightColor(FX_ARGB dwBorderColor) {
+    m_NonInheritedData.m_dwBDRRightColor = dwBorderColor;
+  }
+  virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) {
+    m_NonInheritedData.m_dwBDRBottomColor = dwBorderColor;
+  }
+
+  virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
+    m_NonInheritedData.m_eBDRLeftStyle = eBorderStyle;
+  }
+  virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
+    m_NonInheritedData.m_eBDRTopStyle = eBorderStyle;
+  }
+  virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
+    m_NonInheritedData.m_eBDRRightStyle = eBorderStyle;
+  }
+  virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
+    m_NonInheritedData.m_eBDRBottomStyle = eBorderStyle;
+  }
+
+  virtual void SetBorderWidth(const FDE_CSSRECT& rect) {
+    m_NonInheritedData.m_BorderWidth = rect;
+    m_NonInheritedData.m_bHasBorder = TRUE;
+  }
+  virtual void SetMarginWidth(const FDE_CSSRECT& rect) {
+    m_NonInheritedData.m_MarginWidth = rect;
+    m_NonInheritedData.m_bHasMargin = TRUE;
+  }
+  virtual void SetPaddingWidth(const FDE_CSSRECT& rect) {
+    m_NonInheritedData.m_PaddingWidth = rect;
+    m_NonInheritedData.m_bHasPadding = TRUE;
+  }
+  virtual FDE_CSSDISPLAY GetDisplay() const {
+    return (FDE_CSSDISPLAY)m_NonInheritedData.m_eDisplay;
+  }
+  virtual const FDE_CSSSIZE& GetBoxSize() const {
+    return m_NonInheritedData.m_BoxSize;
+  }
+  virtual const FDE_CSSSIZE& GetMinBoxSize() const {
+    return m_NonInheritedData.m_MinBoxSize;
+  }
+  virtual const FDE_CSSSIZE& GetMaxBoxSize() const {
+    return m_NonInheritedData.m_MaxBoxSize;
+  }
+  virtual FDE_CSSFLOAT GetFloat() const {
+    return (FDE_CSSFLOAT)m_NonInheritedData.m_eFloat;
+  }
+  virtual FDE_CSSCLEAR GetClear() const {
+    return (FDE_CSSCLEAR)m_NonInheritedData.m_eClear;
+  }
+  virtual FDE_CSSPOSITION GetPosition() const {
+    return (FDE_CSSPOSITION)m_NonInheritedData.m_ePosition;
+  }
+  virtual FDE_CSSLENGTH GetTop() const { return m_NonInheritedData.m_Top; }
+  virtual FDE_CSSLENGTH GetBottom() const {
+    return m_NonInheritedData.m_Bottom;
+  }
+  virtual FDE_CSSLENGTH GetLeft() const { return m_NonInheritedData.m_Left; }
+  virtual FDE_CSSLENGTH GetRight() const { return m_NonInheritedData.m_Right; }
+
+  virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) {
+    m_NonInheritedData.m_eDisplay = eDisplay;
+  }
+  virtual void SetBoxSize(const FDE_CSSSIZE& size) {
+    m_NonInheritedData.m_BoxSize = size;
+  }
+  virtual void SetMinBoxSize(const FDE_CSSSIZE& size) {
+    m_NonInheritedData.m_MinBoxSize = size;
+  }
+  virtual void SetMaxBoxSize(const FDE_CSSSIZE& size) {
+    m_NonInheritedData.m_MaxBoxSize = size;
+  }
+  virtual void SetFloat(FDE_CSSFLOAT eFloat) {
+    m_NonInheritedData.m_eFloat = eFloat;
+  }
+  virtual void SetClear(FDE_CSSCLEAR eClear) {
+    m_NonInheritedData.m_eClear = eClear;
+  }
+  virtual FX_FLOAT GetLineHeight() const {
+    return m_InheritedData.m_fLineHeight;
+  }
+  virtual FDE_CSSWHITESPACE GetWhiteSpace() const {
+    return (FDE_CSSWHITESPACE)m_InheritedData.m_eWhiteSpace;
+  }
+  virtual const FDE_CSSLENGTH& GetTextIndent() const {
+    return m_InheritedData.m_TextIndent;
+  }
+  virtual FDE_CSSTEXTALIGN GetTextAlign() const {
+    return (FDE_CSSTEXTALIGN)m_InheritedData.m_eTextAligh;
+  }
+  virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const {
+    return (FDE_CSSVERTICALALIGN)m_NonInheritedData.m_eVerticalAlign;
+  }
+  virtual FX_FLOAT GetNumberVerticalAlign() const {
+    return m_NonInheritedData.m_fVerticalAlign;
+  }
+  virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const {
+    return (FDE_CSSTEXTTRANSFORM)m_InheritedData.m_eTextTransform;
+  }
+  virtual FX_DWORD GetTextDecoration() const {
+    return m_NonInheritedData.m_dwTextDecoration;
+  }
+  virtual const FDE_CSSLENGTH& GetLetterSpacing() const {
+    return m_InheritedData.m_LetterSpacing;
+  }
+  virtual const FDE_CSSLENGTH& GetWordSpacing() const {
+    return m_InheritedData.m_WordSpacing;
+  }
+  virtual FDE_CSSWRITINGMODE GetWritingMode() const {
+    return (FDE_CSSWRITINGMODE)m_InheritedData.m_eWritingMode;
+  }
+  virtual FDE_CSSWORDBREAK GetWordBreak() const {
+    return (FDE_CSSWORDBREAK)m_InheritedData.m_eWordBreak;
+  }
+  virtual int32_t GetWidows() const { return m_InheritedData.m_iWidows; }
+  virtual FX_ARGB GetTextEmphasisColor() const {
+    return m_InheritedData.m_bTextEmphasisColorCurrent
+               ? m_InheritedData.m_dwFontColor
+               : m_InheritedData.m_dwTextEmphasisColor;
+  }
+  virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const {
+    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakBefore;
+  }
+  virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const {
+    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakAfter;
+  }
+  virtual FDE_CSSPAGEBREAK GetPageBreakInside() const {
+    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakInside;
+  }
+  virtual int32_t GetOrphans() const { return m_InheritedData.m_iOrphans; }
+  virtual FDE_CSSLINEBREAK GetLineBreak() const {
+    return (FDE_CSSLINEBREAK)m_InheritedData.m_eLineBreak;
+  }
+  virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const;
+  virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const {
+    return (FDE_CSSTEXTEMPHASISFILL)m_InheritedData.m_eTextEmphasisFill;
+  }
+  virtual const FX_WCHAR* GetTextEmphasisCustom() const {
+    FXSYS_assert(m_InheritedData.m_eTextEmphasisMark ==
+                 FDE_CSSTEXTEMPHASISMARK_Custom);
+    return m_InheritedData.m_pszTextEmphasisCustomMark;
+  }
+  virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const {
+    return (FDE_CSSTEXTCOMBINE)m_NonInheritedData.m_eTextCombine;
+  }
+  virtual FX_BOOL HasTextCombineNumber() const {
+    return m_NonInheritedData.m_bHasTextCombineNumber;
+  }
+  virtual FX_FLOAT GetTextCombineNumber() const {
+    FXSYS_assert(m_NonInheritedData.m_eTextCombine ==
+                 FDE_CSSTEXTCOMBINE_Horizontal);
+    return m_NonInheritedData.m_fTextCombineNumber;
+  }
+  virtual void SetLineHeight(FX_FLOAT fLineHeight) {
+    m_InheritedData.m_fLineHeight = fLineHeight;
+  }
+  virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) {
+    m_InheritedData.m_eWhiteSpace = eWhiteSpace;
+  }
+  virtual void SetTextIndent(const FDE_CSSLENGTH& textIndent) {
+    m_InheritedData.m_TextIndent = textIndent;
+  }
+  virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) {
+    m_InheritedData.m_eTextAligh = eTextAlign;
+  }
+  virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) {
+    m_NonInheritedData.m_eVerticalAlign = eVerticalAlign;
+  }
+  virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) {
+    m_NonInheritedData.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number,
+    m_NonInheritedData.m_fVerticalAlign = fAlign;
+  }
+  virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) {
+    m_InheritedData.m_eTextTransform = eTextTransform;
+  }
+  virtual void SetTextDecoration(FX_DWORD dwTextDecoration) {
+    m_NonInheritedData.m_dwTextDecoration = dwTextDecoration;
+  }
+  virtual void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) {
+    m_InheritedData.m_LetterSpacing = letterSpacing;
+  }
+  virtual void SetWordSpacing(const FDE_CSSLENGTH& wordSpacing) {
+    m_InheritedData.m_WordSpacing = wordSpacing;
+  }
+  virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) {
+    m_InheritedData.m_eWritingMode = eWritingMode;
+  }
+  virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) {
+    m_InheritedData.m_eWordBreak = eWordBreak;
+  }
+  virtual void SetWidows(int32_t iWidows) {
+    m_InheritedData.m_iWidows = iWidows;
+  }
+  virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) {
+    m_InheritedData.m_dwTextEmphasisColor = dwTextEmphasisColor,
+    m_InheritedData.m_bTextEmphasisColorCurrent = FALSE;
+  }
+  virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) {
+    m_NonInheritedData.m_ePageBreakBefore = ePageBreakBefore;
+  }
+  virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) {
+    m_NonInheritedData.m_ePageBreakAfter = ePageBreakAfter;
+  }
+  virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) {
+    m_NonInheritedData.m_ePageBreakInside = ePageBreakInside;
+  }
+  virtual void SetOrphans(int32_t iOrphans) {
+    m_InheritedData.m_iOrphans = iOrphans;
+  }
+  virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) {
+    m_InheritedData.m_eLineBreak = eLineBreak;
+  }
+  virtual FX_ARGB GetBKGColor() const {
+    return m_NonInheritedData.m_dwBKGColor;
+  }
+  virtual const FX_WCHAR* GetBKGImage() const {
+    return m_NonInheritedData.m_pszBKGImage;
+  }
+  virtual const FDE_CSSPOINT& GetBKGPosition() const {
+    return m_NonInheritedData.m_BKGPosition;
+  }
+  virtual FDE_CSSBKGREPEAT GetBKGRepeat() const {
+    return (FDE_CSSBKGREPEAT)m_NonInheritedData.m_eBKGRepeat;
+  }
+  virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const {
+    return (FDE_CSSBKGATTACHMENT)m_NonInheritedData.m_eBKGAttachment;
+  }
+  virtual void SetBKGColor(FX_ARGB dwBKGColor) {
+    m_NonInheritedData.m_dwBKGColor = dwBKGColor;
+  }
+  virtual void SetBKGPosition(const FDE_CSSPOINT& bkgPosition) {
+    m_NonInheritedData.m_BKGPosition = bkgPosition;
+  }
+  virtual FDE_CSSVISIBILITY GetVisibility() const {
+    return (FDE_CSSVISIBILITY)m_InheritedData.m_eVisibility;
+  }
+  virtual FDE_CSSOVERFLOW GetOverflowX() const {
+    return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowX;
+  }
+  virtual FDE_CSSOVERFLOW GetOverflowY() const {
+    return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowY;
+  }
+  virtual int32_t CountCursorUrls() const {
+    return m_InheritedData.m_pCursorUris == NULL
+               ? 0
+               : m_InheritedData.m_pCursorUris->CountValues();
+  }
+  virtual const FX_WCHAR* GetCursorUrl(int32_t index) const {
+    FXSYS_assert(m_InheritedData.m_pCursorUris != NULL);
+    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pCursorUris->GetValue(
+                index)))
+        ->GetString(index);
+  }
+  virtual FDE_CSSCURSOR GetCursorType() const {
+    return m_InheritedData.m_eCursor;
+  }
+  virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) {
+    m_InheritedData.m_eVisibility = eVisibility;
+  }
+  virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const {
+    return (FDE_CSSLISTSTYLETYPE)m_NonInheritedData.m_eListStyleType;
+  }
+  virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const {
+    return (FDE_CSSLISTSTYLEPOSITION)m_NonInheritedData.m_eListStylePosition;
+  }
+  virtual const FX_WCHAR* GetListStyleImage() const {
+    return m_InheritedData.m_pszListStyleImage;
+  }
+  virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) {
+    m_NonInheritedData.m_eListStyleType = eListStyleType;
+  }
+  virtual void SetListStylePosition(
+      FDE_CSSLISTSTYLEPOSITION eListStylePosition) {
+    m_NonInheritedData.m_eListStylePosition = eListStylePosition;
+  }
+  void AddCustomStyle(const CFX_WideString& wsName,
+                      const CFX_WideString& wsValue) {
+    m_CustomProperties.Add(wsName);
+    m_CustomProperties.Add(wsValue);
+  }
+  FX_DWORD m_dwRefCount;
+  IFX_MEMAllocator* m_pAllocator;
+  CFDE_CSSInheritedData m_InheritedData;
+  CFDE_CSSNonInheritedData m_NonInheritedData;
+  CFX_WideStringArray m_CustomProperties;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
diff --git a/xfa/fde/css/fde_cssstylesheet.cpp b/xfa/fde/css/fde_cssstylesheet.cpp
new file mode 100644
index 0000000..561b2f4
--- /dev/null
+++ b/xfa/fde/css/fde_cssstylesheet.cpp
@@ -0,0 +1,509 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_cssstylesheet.h"
+
+#include "xfa/fde/css/fde_cssdatatable.h"
+#include "xfa/fde/css/fde_csssyntax.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+
+IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadHTMLStandardStyleSheet() {
+  static const FX_WCHAR* s_pStyle =
+      L"html,address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,frameset,"
+      L"h1,h2,h3,h4,h5,h6,noframes,ol,p,ul,center,dir,hr,menu,pre{display:"
+      L"block}"
+      L"li{display:list-item}head{display:none}table{display:table}tr{display:"
+      L"table-row}thead{display:table-header-group}tbody{display:table-row-"
+      L"group}tfoot{display:table-footer-group}"
+      L"col{display:table-column}colgroup{display:table-column-group}td,th{"
+      L"display:table-cell}caption{display:table-caption}th{font-weight:bolder;"
+      L"text-align:center}caption{text-align:center}"
+      L"body{margin:0}h1{font-size:2em;margin:.67em "
+      L"0}h2{font-size:1.5em;margin:.75em 0}h3{font-size:1.17em;margin:.83em "
+      L"0}h4,p,blockquote,ul,fieldset,form,ol,dl,dir,menu{margin:1.12em 0}"
+      L"h5{font-size:.83em;margin:1.5em 0}h6{font-size:.75em;margin:1.67em "
+      L"0}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bolder}blockquote{margin-left:"
+      L"40px;margin-right:40px}i,cite,em,var,address{font-style:italic}"
+      L"pre,tt,code,kbd,samp{font-family:monospace}pre{white-space:pre}button,"
+      L"textarea,input,select{display:inline-block}big{font-size:1.17em}small,"
+      L"sub,sup{font-size:.83em}sub{vertical-align:sub}"
+      L"sup{vertical-align:super}table{border-spacing:2px}thead,tbody,tfoot{"
+      L"vertical-align:middle}td,th,tr{vertical-align:inherit}s,strike,del{"
+      L"text-decoration:line-through}hr{border:1px inset silver}"
+      L"ol,ul,dir,menu,dd{margin-left:40px}ol{list-style-type:decimal}ol ul,ul "
+      L"ol,ul ul,ol "
+      L"ol{margin-top:0;margin-bottom:0}u,ins{text-decoration:underline}center{"
+      L"text-align:center}"
+      L"ruby{display:ruby}rt{display:ruby-text;font-size:.5em}rb{display:ruby-"
+      L"base}rbc{display:ruby-base-group}rtc{display:ruby-text-group}"
+      L"q:before{content:open-quote}q:after{content:close-quote}"
+      L"rp{display:none}";
+  return IFDE_CSSStyleSheet::LoadFromBuffer(
+      CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8);
+}
+
+IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromStream(
+    const CFX_WideString& szUrl,
+    IFX_Stream* pStream,
+    FX_WORD wCodePage,
+    FX_DWORD dwMediaList) {
+  CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList);
+  if (!pStyleSheet->LoadFromStream(szUrl, pStream, wCodePage)) {
+    pStyleSheet->Release();
+    pStyleSheet = NULL;
+  }
+  return pStyleSheet;
+}
+IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromBuffer(
+    const CFX_WideString& szUrl,
+    const FX_WCHAR* pBuffer,
+    int32_t iBufSize,
+    FX_WORD wCodePage,
+    FX_DWORD dwMediaList) {
+  CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList);
+  if (!pStyleSheet->LoadFromBuffer(szUrl, pBuffer, iBufSize, wCodePage)) {
+    pStyleSheet->Release();
+    pStyleSheet = NULL;
+  }
+  return pStyleSheet;
+}
+CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(FX_DWORD dwMediaList)
+    : m_wCodePage(FX_CODEPAGE_UTF8),
+      m_wRefCount(1),
+      m_dwMediaList(dwMediaList),
+      m_pAllocator(NULL) {
+  FXSYS_assert(m_dwMediaList > 0);
+}
+CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() {
+  Reset();
+}
+void CFDE_CSSStyleSheet::Reset() {
+  for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) {
+    IFDE_CSSRule* pRule = m_RuleArray.GetAt(i);
+    switch (pRule->GetType()) {
+      case FDE_CSSRULETYPE_Style:
+        ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule();
+        break;
+      case FDE_CSSRULETYPE_Media:
+        ((CFDE_CSSMediaRule*)pRule)->~CFDE_CSSMediaRule();
+        break;
+      case FDE_CSSRULETYPE_FontFace:
+        ((CFDE_CSSFontFaceRule*)pRule)->~CFDE_CSSFontFaceRule();
+        break;
+      default:
+        FXSYS_assert(FALSE);
+        break;
+    }
+  }
+  m_RuleArray.RemoveAll();
+  m_Selectors.RemoveAll();
+  m_StringCache.RemoveAll();
+  if (m_pAllocator) {
+    m_pAllocator->Release();
+    m_pAllocator = NULL;
+  }
+}
+FX_DWORD CFDE_CSSStyleSheet::AddRef() {
+  return ++m_wRefCount;
+}
+FX_DWORD CFDE_CSSStyleSheet::Release() {
+  FX_DWORD dwRefCount = --m_wRefCount;
+  if (dwRefCount == 0) {
+    delete this;
+  }
+  return dwRefCount;
+}
+int32_t CFDE_CSSStyleSheet::CountRules() const {
+  return m_RuleArray.GetSize();
+}
+IFDE_CSSRule* CFDE_CSSStyleSheet::GetRule(int32_t index) {
+  return m_RuleArray.GetAt(index);
+}
+FX_BOOL CFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString& szUrl,
+                                           IFX_Stream* pStream,
+                                           FX_WORD wCodePage) {
+  FXSYS_assert(pStream != NULL);
+  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
+  if (pSyntax == NULL) {
+    return FALSE;
+  }
+  if (pStream->GetCodePage() != wCodePage) {
+    pStream->SetCodePage(wCodePage);
+  }
+  FX_BOOL bRet = pSyntax->Init(pStream, 4096) && LoadFromSyntax(pSyntax);
+  pSyntax->Release();
+  m_wCodePage = wCodePage;
+  m_szUrl = szUrl;
+  return bRet;
+}
+FX_BOOL CFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString& szUrl,
+                                           const FX_WCHAR* pBuffer,
+                                           int32_t iBufSize,
+                                           FX_WORD wCodePage) {
+  FXSYS_assert(pBuffer != NULL && iBufSize > 0);
+  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
+  if (pSyntax == NULL) {
+    return FALSE;
+  }
+  FX_BOOL bRet = pSyntax->Init(pBuffer, iBufSize) && LoadFromSyntax(pSyntax);
+  pSyntax->Release();
+  m_wCodePage = wCodePage;
+  m_szUrl = szUrl;
+  return bRet;
+}
+FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax) {
+  Reset();
+  m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0);
+  if (m_pAllocator == NULL) {
+    return FALSE;
+  }
+  FDE_CSSSYNTAXSTATUS eStatus;
+  do {
+    switch (eStatus = pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_StyleRule:
+        eStatus = LoadStyleRule(pSyntax, m_RuleArray);
+        break;
+      case FDE_CSSSYNTAXSTATUS_MediaRule:
+        eStatus = LoadMediaRule(pSyntax);
+        break;
+      case FDE_CSSSYNTAXSTATUS_FontFaceRule:
+        eStatus = LoadFontFaceRule(pSyntax, m_RuleArray);
+        break;
+      case FDE_CSSSYNTAXSTATUS_ImportRule:
+        eStatus = LoadImportRule(pSyntax);
+        break;
+      case FDE_CSSSYNTAXSTATUS_PageRule:
+        eStatus = LoadPageRule(pSyntax);
+        break;
+      default:
+        break;
+    }
+  } while (eStatus >= FDE_CSSSYNTAXSTATUS_None);
+  m_Selectors.RemoveAll();
+  m_StringCache.RemoveAll();
+  return eStatus != FDE_CSSSYNTAXSTATUS_Error;
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule(
+    IFDE_CSSSyntaxParser* pSyntax) {
+  FX_DWORD dwMediaList = 0;
+  CFDE_CSSMediaRule* pMediaRule = NULL;
+  for (;;) {
+    switch (pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_MediaType: {
+        int32_t iLen;
+        const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen);
+        FDE_LPCCSSMEDIATYPETABLE pMediaType =
+            FDE_GetCSSMediaTypeByName(psz, iLen);
+        if (pMediaType != NULL) {
+          dwMediaList |= pMediaType->wValue;
+        }
+      } break;
+      case FDE_CSSSYNTAXSTATUS_StyleRule:
+        if (pMediaRule == NULL) {
+          SkipRuleSet(pSyntax);
+        } else {
+          FDE_CSSSYNTAXSTATUS eStatus =
+              LoadStyleRule(pSyntax, pMediaRule->GetArray());
+          if (eStatus < FDE_CSSSYNTAXSTATUS_None) {
+            return eStatus;
+          }
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclOpen:
+        if ((dwMediaList & m_dwMediaList) > 0 && pMediaRule == NULL) {
+          pMediaRule =
+              FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList);
+          m_RuleArray.Add(pMediaRule);
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclClose:
+        return FDE_CSSSYNTAXSTATUS_None;
+        FDE_CSSSWITCHDEFAULTS();
+    }
+  }
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule(
+    IFDE_CSSSyntaxParser* pSyntax,
+    CFDE_CSSRuleArray& ruleArray) {
+  m_Selectors.RemoveAt(0, m_Selectors.GetSize());
+  CFDE_CSSStyleRule* pStyleRule = NULL;
+  const FX_WCHAR* pszValue = NULL;
+  int32_t iValueLen = 0;
+  FDE_CSSPROPERTYARGS propertyArgs;
+  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStringCache = &m_StringCache;
+  propertyArgs.pProperty = NULL;
+  CFX_WideString wsName;
+  for (;;) {
+    switch (pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_Selector: {
+        pszValue = pSyntax->GetCurrentString(iValueLen);
+        IFDE_CSSSelector* pSelector =
+            CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen);
+        if (pSelector != NULL) {
+          m_Selectors.Add(pSelector);
+        }
+      } break;
+      case FDE_CSSSYNTAXSTATUS_PropertyName:
+        pszValue = pSyntax->GetCurrentString(iValueLen);
+        propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen);
+        if (propertyArgs.pProperty == NULL) {
+          wsName = CFX_WideStringC(pszValue, iValueLen);
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_PropertyValue:
+        if (propertyArgs.pProperty != NULL) {
+          pszValue = pSyntax->GetCurrentString(iValueLen);
+          if (iValueLen > 0) {
+            pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue,
+                                                 iValueLen);
+          }
+        } else if (iValueLen > 0) {
+          pszValue = pSyntax->GetCurrentString(iValueLen);
+          if (iValueLen > 0) {
+            pStyleRule->GetDeclImp().AddProperty(
+                &propertyArgs, wsName, wsName.GetLength(), pszValue, iValueLen);
+          }
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclOpen:
+        if (pStyleRule == NULL && m_Selectors.GetSize() > 0) {
+          pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule;
+          pStyleRule->SetSelector(m_pAllocator, m_Selectors);
+          ruleArray.Add(pStyleRule);
+        } else {
+          SkipRuleSet(pSyntax);
+          return FDE_CSSSYNTAXSTATUS_None;
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclClose:
+        if (pStyleRule != NULL &&
+            pStyleRule->GetDeclImp().GetStartPosition() == NULL) {
+          pStyleRule->~CFDE_CSSStyleRule();
+          ruleArray.RemoveLast(1);
+        }
+        return FDE_CSSSYNTAXSTATUS_None;
+        FDE_CSSSWITCHDEFAULTS();
+    }
+  }
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule(
+    IFDE_CSSSyntaxParser* pSyntax,
+    CFDE_CSSRuleArray& ruleArray) {
+  CFDE_CSSFontFaceRule* pFontFaceRule = NULL;
+  const FX_WCHAR* pszValue = NULL;
+  int32_t iValueLen = 0;
+  FDE_CSSPROPERTYARGS propertyArgs;
+  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStringCache = &m_StringCache;
+  propertyArgs.pProperty = NULL;
+  for (;;) {
+    switch (pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_PropertyName:
+        pszValue = pSyntax->GetCurrentString(iValueLen);
+        propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen);
+        break;
+      case FDE_CSSSYNTAXSTATUS_PropertyValue:
+        if (propertyArgs.pProperty != NULL) {
+          pszValue = pSyntax->GetCurrentString(iValueLen);
+          if (iValueLen > 0) {
+            pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue,
+                                                    iValueLen);
+          }
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclOpen:
+        if (pFontFaceRule == NULL) {
+          pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule;
+          ruleArray.Add(pFontFaceRule);
+        }
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclClose:
+        return FDE_CSSSYNTAXSTATUS_None;
+        FDE_CSSSWITCHDEFAULTS();
+    }
+  }
+  return FDE_CSSSYNTAXSTATUS_None;
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadImportRule(
+    IFDE_CSSSyntaxParser* pSyntax) {
+  for (;;) {
+    switch (pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_ImportClose:
+        return FDE_CSSSYNTAXSTATUS_None;
+      case FDE_CSSSYNTAXSTATUS_URI:
+        break;
+        FDE_CSSSWITCHDEFAULTS();
+    }
+  }
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadPageRule(
+    IFDE_CSSSyntaxParser* pSyntax) {
+  return SkipRuleSet(pSyntax);
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::SkipRuleSet(
+    IFDE_CSSSyntaxParser* pSyntax) {
+  for (;;) {
+    switch (pSyntax->DoSyntaxParse()) {
+      case FDE_CSSSYNTAXSTATUS_Selector:
+      case FDE_CSSSYNTAXSTATUS_DeclOpen:
+      case FDE_CSSSYNTAXSTATUS_PropertyName:
+      case FDE_CSSSYNTAXSTATUS_PropertyValue:
+        break;
+      case FDE_CSSSYNTAXSTATUS_DeclClose:
+        return FDE_CSSSYNTAXSTATUS_None;
+        FDE_CSSSWITCHDEFAULTS();
+    }
+  }
+  return FDE_CSSSYNTAXSTATUS_None;
+}
+void CFDE_CSSStyleRule::SetSelector(IFX_MEMAllocator* pStaticStore,
+                                    const CFDE_CSSSelectorArray& list) {
+  FXSYS_assert(m_ppSelector == NULL);
+  m_iSelectors = list.GetSize();
+  m_ppSelector = (IFDE_CSSSelector**)pStaticStore->Alloc(
+      m_iSelectors * sizeof(IFDE_CSSSelector*));
+  for (int32_t i = 0; i < m_iSelectors; ++i) {
+    m_ppSelector[i] = list.GetAt(i);
+  }
+}
+CFDE_CSSMediaRule::~CFDE_CSSMediaRule() {
+  for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) {
+    IFDE_CSSRule* pRule = m_RuleArray.GetAt(i);
+    switch (pRule->GetType()) {
+      case FDE_CSSRULETYPE_Style:
+        ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule();
+        break;
+      default:
+        FXSYS_assert(FALSE);
+        break;
+    }
+  }
+}
+inline FX_BOOL FDE_IsCSSChar(FX_WCHAR wch) {
+  return (wch >= 'a' && wch <= 'z') || (wch >= 'A' && wch <= 'Z');
+}
+int32_t FDE_GetCSSPersudoLen(const FX_WCHAR* psz, const FX_WCHAR* pEnd) {
+  FXSYS_assert(*psz == ':');
+  const FX_WCHAR* pStart = psz;
+  while (psz < pEnd) {
+    FX_WCHAR wch = *psz;
+    if (FDE_IsCSSChar(wch) || wch == ':') {
+      ++psz;
+    } else {
+      break;
+    }
+  }
+  return psz - pStart;
+}
+int32_t FDE_GetCSSNameLen(const FX_WCHAR* psz, const FX_WCHAR* pEnd) {
+  const FX_WCHAR* pStart = psz;
+  while (psz < pEnd) {
+    FX_WCHAR wch = *psz;
+    if (FDE_IsCSSChar(wch) || (wch >= '0' && wch <= '9') || wch == '_' ||
+        wch == '-') {
+      ++psz;
+    } else {
+      break;
+    }
+  }
+  return psz - pStart;
+}
+IFDE_CSSSelector* CFDE_CSSSelector::FromString(IFX_MEMAllocator* pStaticStore,
+                                               const FX_WCHAR* psz,
+                                               int32_t iLen) {
+  FXSYS_assert(pStaticStore != NULL && psz != NULL && iLen > 0);
+  const FX_WCHAR* pStart = psz;
+  const FX_WCHAR* pEnd = psz + iLen;
+  for (; psz < pEnd; ++psz) {
+    switch (*psz) {
+      case '>':
+      case '[':
+      case '+':
+        return NULL;
+    }
+  }
+  CFDE_CSSSelector *pFirst = NULL, *pLast = NULL;
+  CFDE_CSSSelector *pPersudoFirst = NULL, *pPersudoLast = NULL;
+  for (psz = pStart; psz < pEnd;) {
+    FX_WCHAR wch = *psz;
+    if (wch == '.' || wch == '#') {
+      if (psz == pStart || psz[-1] == ' ') {
+        CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
+            CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, L"*", 1, TRUE);
+        if (p == NULL) {
+          return NULL;
+        }
+        if (pFirst != NULL) {
+          pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant);
+          p->SetNext(pFirst);
+        }
+        pFirst = pLast = p;
+      }
+      FXSYS_assert(pLast != NULL);
+      int32_t iNameLen = FDE_GetCSSNameLen(++psz, pEnd);
+      if (iNameLen == 0) {
+        return NULL;
+      }
+      FDE_CSSSELECTORTYPE eType =
+          wch == '.' ? FDE_CSSSELECTORTYPE_Class : FDE_CSSSELECTORTYPE_ID;
+      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
+          CFDE_CSSSelector(eType, psz, iNameLen, FALSE);
+      if (p == NULL) {
+        return NULL;
+      }
+      p->SetNext(pLast->GetNextSelector());
+      pLast->SetNext(p);
+      pLast = p;
+      psz += iNameLen;
+    } else if (FDE_IsCSSChar(wch) || wch == '*') {
+      int32_t iNameLen = wch == '*' ? 1 : FDE_GetCSSNameLen(psz, pEnd);
+      if (iNameLen == 0) {
+        return NULL;
+      }
+      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
+          CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, psz, iNameLen, TRUE);
+      if (p == NULL) {
+        return NULL;
+      }
+      if (pFirst == NULL) {
+        pFirst = pLast = p;
+      } else {
+        pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant);
+        p->SetNext(pFirst);
+        pFirst = pLast = p;
+      }
+      psz += iNameLen;
+    } else if (wch == ':') {
+      int32_t iNameLen = FDE_GetCSSPersudoLen(psz, pEnd);
+      if (iNameLen == 0) {
+        return NULL;
+      }
+      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
+          CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Persudo, psz, iNameLen, TRUE);
+      if (p == NULL) {
+        return NULL;
+      }
+      if (pPersudoFirst == NULL) {
+        pPersudoFirst = pPersudoLast = p;
+      } else {
+        pPersudoLast->SetNext(p);
+        pPersudoLast = p;
+      }
+      psz += iNameLen;
+    } else if (wch == ' ') {
+      psz++;
+    } else {
+      return NULL;
+    }
+  }
+  if (pPersudoFirst == NULL) {
+    return pFirst;
+  } else {
+    pPersudoLast->SetNext(pFirst);
+    return pPersudoFirst;
+  }
+}
diff --git a/xfa/fde/css/fde_cssstylesheet.h b/xfa/fde/css/fde_cssstylesheet.h
new file mode 100644
index 0000000..f39ff1f
--- /dev/null
+++ b/xfa/fde/css/fde_cssstylesheet.h
@@ -0,0 +1,141 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
+#define XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fde/css/fde_cssdeclaration.h"
+
+class CFDE_CSSSelector : public IFDE_CSSSelector, public CFX_Target {
+ public:
+  CFDE_CSSSelector(FDE_CSSSELECTORTYPE eType,
+                   const FX_WCHAR* psz,
+                   int32_t iLen,
+                   FX_BOOL bIgnoreCase)
+      : m_eType(eType),
+        m_dwHash(FX_HashCode_String_GetW(psz, iLen, bIgnoreCase)),
+        m_pNext(NULL) {}
+  virtual FDE_CSSSELECTORTYPE GetType() const { return m_eType; }
+
+  virtual FX_DWORD GetNameHash() const { return m_dwHash; }
+
+  virtual IFDE_CSSSelector* GetNextSelector() const { return m_pNext; }
+  static IFDE_CSSSelector* FromString(IFX_MEMAllocator* pStaticStore,
+                                      const FX_WCHAR* psz,
+                                      int32_t iLen);
+  void SetNext(IFDE_CSSSelector* pNext) { m_pNext = pNext; }
+
+ protected:
+  static CFDE_CSSSelector* ParseSelector(IFX_MEMAllocator* pStaticStore,
+                                         const FX_WCHAR* psz,
+                                         int32_t& iOff,
+                                         int32_t iLen,
+                                         FDE_CSSSELECTORTYPE eType);
+  void SetType(FDE_CSSSELECTORTYPE eType) { m_eType = eType; }
+  FDE_CSSSELECTORTYPE m_eType;
+  FX_DWORD m_dwHash;
+  IFDE_CSSSelector* m_pNext;
+};
+typedef CFX_ArrayTemplate<IFDE_CSSSelector*> CFDE_CSSSelectorArray;
+class CFDE_CSSStyleRule : public IFDE_CSSStyleRule, public CFX_Target {
+ public:
+  CFDE_CSSStyleRule() : m_ppSelector(NULL), m_iSelectors(0) {}
+  virtual int32_t CountSelectorLists() const { return m_iSelectors; }
+  virtual IFDE_CSSSelector* GetSelectorList(int32_t index) const {
+    return m_ppSelector[index];
+  }
+
+  virtual IFDE_CSSDeclaration* GetDeclaration() const {
+    return (IFDE_CSSDeclaration*)&m_Declaration;
+  }
+  CFDE_CSSDeclaration& GetDeclImp() { return m_Declaration; }
+  void SetSelector(IFX_MEMAllocator* pStaticStore,
+                   const CFDE_CSSSelectorArray& list);
+
+ protected:
+  CFDE_CSSDeclaration m_Declaration;
+  IFDE_CSSSelector** m_ppSelector;
+  int32_t m_iSelectors;
+};
+class CFDE_CSSMediaRule : public IFDE_CSSMediaRule, public CFX_Target {
+ public:
+  CFDE_CSSMediaRule(FX_DWORD dwMediaList) : m_dwMediaList(dwMediaList) {}
+  ~CFDE_CSSMediaRule();
+
+  virtual FX_DWORD GetMediaList() const { return m_dwMediaList; }
+
+  virtual int32_t CountRules() const { return m_RuleArray.GetSize(); }
+  virtual IFDE_CSSRule* GetRule(int32_t index) {
+    return m_RuleArray.GetAt(index);
+  }
+  CFDE_CSSRuleArray& GetArray() { return m_RuleArray; }
+
+ protected:
+  FX_DWORD m_dwMediaList;
+  CFDE_CSSRuleArray m_RuleArray;
+};
+class CFDE_CSSFontFaceRule : public IFDE_CSSFontFaceRule, public CFX_Target {
+ public:
+  virtual IFDE_CSSDeclaration* GetDeclaration() const {
+    return (IFDE_CSSDeclaration*)&m_Declaration;
+  }
+  CFDE_CSSDeclaration& GetDeclImp() { return m_Declaration; }
+
+ protected:
+  CFDE_CSSDeclaration m_Declaration;
+};
+#define FDE_CSSSWITCHDEFAULTS()     \
+  case FDE_CSSSYNTAXSTATUS_EOS:     \
+    return FDE_CSSSYNTAXSTATUS_EOS; \
+  case FDE_CSSSYNTAXSTATUS_Error:   \
+  default:                          \
+    return FDE_CSSSYNTAXSTATUS_Error;
+class CFDE_CSSStyleSheet : public IFDE_CSSStyleSheet, public CFX_Target {
+ public:
+  CFDE_CSSStyleSheet(FX_DWORD dwMediaList);
+  ~CFDE_CSSStyleSheet();
+  virtual FX_DWORD AddRef();
+  virtual FX_DWORD Release();
+
+  virtual FX_BOOL GetUrl(CFX_WideString& szUrl) {
+    szUrl = m_szUrl;
+    return szUrl.GetLength() > 0;
+  }
+  virtual FX_DWORD GetMediaList() const { return m_dwMediaList; }
+  virtual FX_WORD GetCodePage() const { return m_wCodePage; }
+  virtual int32_t CountRules() const;
+  virtual IFDE_CSSRule* GetRule(int32_t index);
+  FX_BOOL LoadFromStream(const CFX_WideString& szUrl,
+                         IFX_Stream* pStream,
+                         FX_WORD wCodePage);
+  FX_BOOL LoadFromBuffer(const CFX_WideString& szUrl,
+                         const FX_WCHAR* pBuffer,
+                         int32_t iBufSize,
+                         FX_WORD wCodePage);
+
+ protected:
+  void Reset();
+  FX_BOOL LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax);
+  FDE_CSSSYNTAXSTATUS LoadStyleRule(IFDE_CSSSyntaxParser* pSyntax,
+                                    CFDE_CSSRuleArray& ruleArray);
+  FDE_CSSSYNTAXSTATUS LoadImportRule(IFDE_CSSSyntaxParser* pSyntax);
+  FDE_CSSSYNTAXSTATUS LoadPageRule(IFDE_CSSSyntaxParser* pSyntax);
+  FDE_CSSSYNTAXSTATUS LoadMediaRule(IFDE_CSSSyntaxParser* pSyntax);
+  FDE_CSSSYNTAXSTATUS LoadFontFaceRule(IFDE_CSSSyntaxParser* pSyntax,
+                                       CFDE_CSSRuleArray& ruleArray);
+  FDE_CSSSYNTAXSTATUS SkipRuleSet(IFDE_CSSSyntaxParser* pSyntax);
+  FX_WORD m_wCodePage;
+  FX_WORD m_wRefCount;
+  FX_DWORD m_dwMediaList;
+  IFX_MEMAllocator* m_pAllocator;
+  CFDE_CSSRuleArray m_RuleArray;
+  CFX_WideString m_szUrl;
+  CFDE_CSSSelectorArray m_Selectors;
+  CFX_MapPtrToPtr m_StringCache;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
diff --git a/xfa/fde/css/fde_csssyntax.cpp b/xfa/fde/css/fde_csssyntax.cpp
new file mode 100644
index 0000000..e03c57c
--- /dev/null
+++ b/xfa/fde/css/fde_csssyntax.cpp
@@ -0,0 +1,487 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/css/fde_csssyntax.h"
+
+#include "xfa/fde/css/fde_cssdatatable.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+inline FX_BOOL FDE_IsSelectorStart(FX_WCHAR wch) {
+  return wch == '.' || wch == '#' || wch == '*' || (wch >= 'a' && wch <= 'z') ||
+         (wch >= 'A' && wch <= 'Z');
+}
+
+#ifdef _cplusplus
+};
+#endif
+
+IFDE_CSSSyntaxParser* IFDE_CSSSyntaxParser::Create() {
+  return new CFDE_CSSSyntaxParser;
+}
+CFDE_CSSSyntaxParser::CFDE_CSSSyntaxParser()
+    : m_pStream(NULL),
+      m_iStreamPos(0),
+      m_iPlaneSize(0),
+      m_iTextDatLen(0),
+      m_dwCheck((FX_DWORD)-1),
+      m_eMode(FDE_CSSSYNTAXMODE_RuleSet),
+      m_eStatus(FDE_CSSSYNTAXSTATUS_None) {}
+CFDE_CSSSyntaxParser::~CFDE_CSSSyntaxParser() {
+  m_TextData.Reset();
+  m_TextPlane.Reset();
+}
+FX_BOOL CFDE_CSSSyntaxParser::Init(IFX_Stream* pStream,
+                                   int32_t iCSSPlaneSize,
+                                   int32_t iTextDataSize,
+                                   FX_BOOL bOnlyDeclaration) {
+  FXSYS_assert(pStream != NULL && iCSSPlaneSize > 0 && iTextDataSize > 0);
+  Reset(bOnlyDeclaration);
+  if (!m_TextData.EstimateSize(iTextDataSize)) {
+    return FALSE;
+  }
+  uint8_t bom[4];
+  m_pStream = pStream;
+  m_iStreamPos = m_pStream->GetBOM(bom);
+  m_iPlaneSize = iCSSPlaneSize;
+  return TRUE;
+}
+FX_BOOL CFDE_CSSSyntaxParser::Init(const FX_WCHAR* pBuffer,
+                                   int32_t iBufferSize,
+                                   int32_t iTextDatSize,
+                                   FX_BOOL bOnlyDeclaration) {
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0 && iTextDatSize > 0);
+  Reset(bOnlyDeclaration);
+  if (!m_TextData.EstimateSize(iTextDatSize)) {
+    return FALSE;
+  }
+  return m_TextPlane.AttachBuffer(pBuffer, iBufferSize);
+}
+void CFDE_CSSSyntaxParser::Reset(FX_BOOL bOnlyDeclaration) {
+  m_TextPlane.Reset();
+  m_TextData.Reset();
+  m_pStream = NULL;
+  m_iStreamPos = 0;
+  m_iTextDatLen = 0;
+  m_dwCheck = (FX_DWORD)-1;
+  m_eStatus = FDE_CSSSYNTAXSTATUS_None;
+  m_eMode = bOnlyDeclaration ? FDE_CSSSYNTAXMODE_PropertyName
+                             : FDE_CSSSYNTAXMODE_RuleSet;
+}
+FDE_CSSSYNTAXSTATUS CFDE_CSSSyntaxParser::DoSyntaxParse() {
+  while (m_eStatus >= FDE_CSSSYNTAXSTATUS_None) {
+    if (m_TextPlane.IsEOF()) {
+      if (m_pStream == NULL) {
+        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
+            m_TextData.GetLength() > 0) {
+          SaveTextData();
+          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
+        }
+        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
+      }
+      FX_BOOL bEOS;
+      int32_t iLen = m_TextPlane.LoadFromStream(m_pStream, m_iStreamPos,
+                                                m_iPlaneSize, bEOS);
+      m_iStreamPos = m_pStream->GetPosition();
+      if (iLen < 1) {
+        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
+            m_TextData.GetLength() > 0) {
+          SaveTextData();
+          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
+        }
+        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
+      }
+    }
+    FX_WCHAR wch;
+    while (!m_TextPlane.IsEOF()) {
+      wch = m_TextPlane.GetChar();
+      switch (m_eMode) {
+        case FDE_CSSSYNTAXMODE_RuleSet:
+          switch (wch) {
+            case '@':
+              m_TextPlane.MoveNext();
+              SwitchMode(FDE_CSSSYNTAXMODE_AtRule);
+              break;
+            case '}':
+              m_TextPlane.MoveNext();
+              if (RestoreMode()) {
+                return FDE_CSSSYNTAXSTATUS_DeclClose;
+              } else {
+                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+              }
+              break;
+            case '/':
+              if (m_TextPlane.GetNextChar() == '*') {
+                m_ModeStack.Push(m_eMode);
+                SwitchMode(FDE_CSSSYNTAXMODE_Comment);
+                break;
+              }
+            default:
+              if (wch <= ' ') {
+                m_TextPlane.MoveNext();
+              } else if (FDE_IsSelectorStart(wch)) {
+                SwitchMode(FDE_CSSSYNTAXMODE_Selector);
+                return FDE_CSSSYNTAXSTATUS_StyleRule;
+              } else {
+                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+              }
+              break;
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_Selector:
+          switch (wch) {
+            case ',':
+              m_TextPlane.MoveNext();
+              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
+              if (m_iTextDatLen > 0) {
+                return FDE_CSSSYNTAXSTATUS_Selector;
+              }
+              break;
+            case '{':
+              if (m_TextData.GetLength() > 0) {
+                SaveTextData();
+                return FDE_CSSSYNTAXSTATUS_Selector;
+              } else {
+                m_TextPlane.MoveNext();
+                m_ModeStack.Push(FDE_CSSSYNTAXMODE_RuleSet);
+                SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
+                return FDE_CSSSYNTAXSTATUS_DeclOpen;
+              }
+              break;
+            case '/':
+              if (m_TextPlane.GetNextChar() == '*') {
+                if (SwitchToComment() > 0) {
+                  return FDE_CSSSYNTAXSTATUS_Selector;
+                }
+                break;
+              }
+            default:
+              AppendChar(wch);
+              break;
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_PropertyName:
+          switch (wch) {
+            case ':':
+              m_TextPlane.MoveNext();
+              SwitchMode(FDE_CSSSYNTAXMODE_PropertyValue);
+              return FDE_CSSSYNTAXSTATUS_PropertyName;
+            case '}':
+              m_TextPlane.MoveNext();
+              if (RestoreMode()) {
+                return FDE_CSSSYNTAXSTATUS_DeclClose;
+              } else {
+                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+              }
+              break;
+            case '/':
+              if (m_TextPlane.GetNextChar() == '*') {
+                if (SwitchToComment() > 0) {
+                  return FDE_CSSSYNTAXSTATUS_PropertyName;
+                }
+                break;
+              }
+            default:
+              AppendChar(wch);
+              break;
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_PropertyValue:
+          switch (wch) {
+            case ';':
+              m_TextPlane.MoveNext();
+            case '}':
+              SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
+              return FDE_CSSSYNTAXSTATUS_PropertyValue;
+            case '/':
+              if (m_TextPlane.GetNextChar() == '*') {
+                if (SwitchToComment() > 0) {
+                  return FDE_CSSSYNTAXSTATUS_PropertyValue;
+                }
+                break;
+              }
+            default:
+              AppendChar(wch);
+              break;
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_Comment:
+          if (wch == '/' && m_TextData.GetLength() > 0 &&
+              m_TextData.GetAt(m_TextData.GetLength() - 1) == '*') {
+            RestoreMode();
+          } else {
+            m_TextData.AppendChar(wch);
+          }
+          m_TextPlane.MoveNext();
+          break;
+        case FDE_CSSSYNTAXMODE_MediaType:
+          switch (wch) {
+            case ',':
+              m_TextPlane.MoveNext();
+              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
+              if (m_iTextDatLen > 0) {
+                return FDE_CSSSYNTAXSTATUS_MediaType;
+              }
+              break;
+            case '{': {
+              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
+              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_MediaRule) {
+                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+              }
+              if (m_TextData.GetLength() > 0) {
+                SaveTextData();
+                return FDE_CSSSYNTAXSTATUS_MediaType;
+              } else {
+                m_TextPlane.MoveNext();
+                *pMode = FDE_CSSSYNTAXMODE_RuleSet;
+                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
+                return FDE_CSSSYNTAXSTATUS_DeclOpen;
+              }
+            } break;
+            case ';': {
+              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
+              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
+                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+              }
+              if (m_TextData.GetLength() > 0) {
+                SaveTextData();
+                if (IsImportEnabled()) {
+                  return FDE_CSSSYNTAXSTATUS_MediaType;
+                }
+              } else {
+                FX_BOOL bEnabled = IsImportEnabled();
+                m_TextPlane.MoveNext();
+                m_ModeStack.Pop();
+                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
+                if (bEnabled) {
+                  DisableImport();
+                  return FDE_CSSSYNTAXSTATUS_ImportClose;
+                }
+              }
+            } break;
+            case '/':
+              if (m_TextPlane.GetNextChar() == '*') {
+                if (SwitchToComment() > 0) {
+                  return FDE_CSSSYNTAXSTATUS_MediaType;
+                }
+                break;
+              }
+            default:
+              AppendChar(wch);
+              break;
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_URI: {
+          FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
+          if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
+            return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
+          }
+          if (wch <= ' ' || wch == ';') {
+            int32_t iURIStart, iURILength = m_TextData.GetLength();
+            if (iURILength > 0 &&
+                FDE_ParseCSSURI(m_TextData.GetBuffer(), iURILength, iURIStart,
+                                iURILength)) {
+              m_TextData.Subtract(iURIStart, iURILength);
+              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
+              if (IsImportEnabled()) {
+                return FDE_CSSSYNTAXSTATUS_URI;
+              } else {
+                break;
+              }
+            }
+          }
+          AppendChar(wch);
+        } break;
+        case FDE_CSSSYNTAXMODE_AtRule:
+          if (wch > ' ') {
+            AppendChar(wch);
+          } else {
+            int32_t iLen = m_TextData.GetLength();
+            const FX_WCHAR* psz = m_TextData.GetBuffer();
+            if (FXSYS_wcsncmp(L"charset", psz, iLen) == 0) {
+              SwitchMode(FDE_CSSSYNTAXMODE_Charset);
+            } else if (FXSYS_wcsncmp(L"import", psz, iLen) == 0) {
+              m_ModeStack.Push(FDE_CSSSYNTAXMODE_Import);
+              SwitchMode(FDE_CSSSYNTAXMODE_URI);
+              if (IsImportEnabled()) {
+                return FDE_CSSSYNTAXSTATUS_ImportRule;
+              } else {
+                break;
+              }
+            } else if (FXSYS_wcsncmp(L"media", psz, iLen) == 0) {
+              m_ModeStack.Push(FDE_CSSSYNTAXMODE_MediaRule);
+              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
+              return FDE_CSSSYNTAXSTATUS_MediaRule;
+            } else if (FXSYS_wcsncmp(L"font-face", psz, iLen) == 0) {
+              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
+              return FDE_CSSSYNTAXSTATUS_FontFaceRule;
+            } else if (FXSYS_wcsncmp(L"page", psz, iLen) == 0) {
+              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
+              return FDE_CSSSYNTAXSTATUS_PageRule;
+            } else {
+              SwitchMode(FDE_CSSSYNTAXMODE_UnknownRule);
+            }
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_Charset:
+          if (wch == ';') {
+            m_TextPlane.MoveNext();
+            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
+            if (IsCharsetEnabled()) {
+              DisableCharset();
+              if (m_iTextDatLen > 0) {
+                if (m_pStream != NULL) {
+                  FX_WORD wCodePage = FX_GetCodePageFormStringW(
+                      m_TextData.GetBuffer(), m_iTextDatLen);
+                  if (wCodePage < 0xFFFF &&
+                      m_pStream->GetCodePage() != wCodePage) {
+                    m_pStream->SetCodePage(wCodePage);
+                  }
+                }
+                return FDE_CSSSYNTAXSTATUS_Charset;
+              }
+            }
+          } else {
+            AppendChar(wch);
+          }
+          break;
+        case FDE_CSSSYNTAXMODE_UnknownRule:
+          if (wch == ';') {
+            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
+          }
+          m_TextPlane.MoveNext();
+          break;
+        default:
+          FXSYS_assert(FALSE);
+          break;
+      }
+    }
+  }
+  return m_eStatus;
+}
+FX_BOOL CFDE_CSSSyntaxParser::IsImportEnabled() const {
+  if ((m_dwCheck & FDE_CSSSYNTAXCHECK_AllowImport) == 0) {
+    return FALSE;
+  }
+  if (m_ModeStack.GetSize() > 1) {
+    return FALSE;
+  }
+  return TRUE;
+}
+inline FX_BOOL CFDE_CSSSyntaxParser::AppendChar(FX_WCHAR wch) {
+  m_TextPlane.MoveNext();
+  if (m_TextData.GetLength() > 0 || wch > ' ') {
+    m_TextData.AppendChar(wch);
+    return TRUE;
+  }
+  return FALSE;
+}
+inline int32_t CFDE_CSSSyntaxParser::SaveTextData() {
+  m_iTextDatLen = m_TextData.TrimEnd();
+  m_TextData.Clear();
+  return m_iTextDatLen;
+}
+inline void CFDE_CSSSyntaxParser::SwitchMode(FDE_CSSSYNTAXMODE eMode) {
+  m_eMode = eMode;
+  SaveTextData();
+}
+inline int32_t CFDE_CSSSyntaxParser::SwitchToComment() {
+  int32_t iLength = m_TextData.GetLength();
+  m_ModeStack.Push(m_eMode);
+  SwitchMode(FDE_CSSSYNTAXMODE_Comment);
+  return iLength;
+}
+inline FX_BOOL CFDE_CSSSyntaxParser::RestoreMode() {
+  FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
+  if (pMode == NULL) {
+    return FALSE;
+  }
+  SwitchMode(*pMode);
+  m_ModeStack.Pop();
+  return TRUE;
+}
+const FX_WCHAR* CFDE_CSSSyntaxParser::GetCurrentString(int32_t& iLength) const {
+  iLength = m_iTextDatLen;
+  return m_TextData.GetBuffer();
+}
+CFDE_CSSTextBuf::CFDE_CSSTextBuf()
+    : m_bExtBuf(FALSE),
+      m_pBuffer(NULL),
+      m_iBufLen(0),
+      m_iDatLen(0),
+      m_iDatPos(0) {}
+CFDE_CSSTextBuf::~CFDE_CSSTextBuf() {
+  Reset();
+}
+void CFDE_CSSTextBuf::Reset() {
+  if (!m_bExtBuf) {
+    FX_Free(m_pBuffer);
+    m_pBuffer = NULL;
+  }
+  m_iDatPos = m_iDatLen = m_iBufLen;
+}
+FX_BOOL CFDE_CSSTextBuf::AttachBuffer(const FX_WCHAR* pBuffer,
+                                      int32_t iBufLen) {
+  Reset();
+  m_pBuffer = (FX_WCHAR*)pBuffer;
+  m_iDatLen = m_iBufLen = iBufLen;
+  return m_bExtBuf = TRUE;
+}
+FX_BOOL CFDE_CSSTextBuf::EstimateSize(int32_t iAllocSize) {
+  FXSYS_assert(iAllocSize > 0);
+  Clear();
+  m_bExtBuf = FALSE;
+  return ExpandBuf(iAllocSize);
+}
+int32_t CFDE_CSSTextBuf::LoadFromStream(IFX_Stream* pTxtStream,
+                                        int32_t iStreamOffset,
+                                        int32_t iMaxChars,
+                                        FX_BOOL& bEOS) {
+  FXSYS_assert(iStreamOffset >= 0 && iMaxChars > 0);
+  Clear();
+  m_bExtBuf = FALSE;
+  if (!ExpandBuf(iMaxChars)) {
+    return 0;
+  }
+  if (pTxtStream->GetPosition() != iStreamOffset) {
+    pTxtStream->Seek(FX_STREAMSEEK_Begin, iStreamOffset);
+  }
+  m_iDatLen = pTxtStream->ReadString(m_pBuffer, iMaxChars, bEOS);
+  return m_iDatLen;
+}
+FX_BOOL CFDE_CSSTextBuf::ExpandBuf(int32_t iDesiredSize) {
+  if (m_bExtBuf) {
+    return FALSE;
+  }
+  if (!m_pBuffer) {
+    m_pBuffer = FX_Alloc(FX_WCHAR, iDesiredSize);
+  } else if (m_iBufLen != iDesiredSize) {
+    m_pBuffer = FX_Realloc(FX_WCHAR, m_pBuffer, iDesiredSize);
+  } else {
+    return TRUE;
+  }
+  if (!m_pBuffer) {
+    m_iBufLen = 0;
+    return FALSE;
+  }
+  m_iBufLen = iDesiredSize;
+  return TRUE;
+}
+void CFDE_CSSTextBuf::Subtract(int32_t iStart, int32_t iLength) {
+  FXSYS_assert(iStart >= 0 && iLength > 0);
+  if (iLength > m_iDatLen - iStart) {
+    iLength = m_iDatLen - iStart;
+  }
+  if (iLength < 0) {
+    iLength = 0;
+  } else {
+    FXSYS_memmove(m_pBuffer, m_pBuffer + iStart, iLength * sizeof(FX_WCHAR));
+  }
+  m_iDatLen = iLength;
+}
diff --git a/xfa/fde/css/fde_csssyntax.h b/xfa/fde/css/fde_csssyntax.h
new file mode 100644
index 0000000..a25ab3b
--- /dev/null
+++ b/xfa/fde/css/fde_csssyntax.h
@@ -0,0 +1,119 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_CSS_FDE_CSSSYNTAX_H_
+#define XFA_FDE_CSS_FDE_CSSSYNTAX_H_
+
+#include "xfa/fde/css/fde_css.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_stream.h"
+
+class CFDE_CSSTextBuf : public CFX_Target {
+ public:
+  CFDE_CSSTextBuf();
+  ~CFDE_CSSTextBuf();
+  FX_BOOL AttachBuffer(const FX_WCHAR* pBuffer, int32_t iBufLen);
+  FX_BOOL EstimateSize(int32_t iAllocSize);
+  int32_t LoadFromStream(IFX_Stream* pTxtStream,
+                         int32_t iStreamOffset,
+                         int32_t iMaxChars,
+                         FX_BOOL& bEOS);
+  FX_BOOL AppendChar(FX_WCHAR wch) {
+    if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) {
+      return FALSE;
+    }
+    return (m_pBuffer[m_iDatLen++] = wch), TRUE;
+  }
+  void Clear() { m_iDatPos = m_iDatLen = 0; }
+  void Reset();
+  int32_t TrimEnd() {
+    while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') {
+      --m_iDatLen;
+    }
+    AppendChar(0);
+    return --m_iDatLen;
+  }
+  void Subtract(int32_t iStart, int32_t iLength);
+  FX_BOOL IsEOF() const { return m_iDatPos >= m_iDatLen; }
+  FX_WCHAR GetAt(int32_t index) const { return m_pBuffer[index]; }
+  FX_WCHAR GetChar() const { return m_pBuffer[m_iDatPos]; }
+  FX_WCHAR GetNextChar() const {
+    return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1];
+  }
+  void MoveNext() { m_iDatPos++; }
+  int32_t GetLength() const { return m_iDatLen; }
+  const FX_WCHAR* GetBuffer() const { return m_pBuffer; }
+
+ protected:
+  FX_BOOL ExpandBuf(int32_t iDesiredSize);
+  FX_BOOL m_bExtBuf;
+  FX_WCHAR* m_pBuffer;
+  int32_t m_iBufLen;
+  int32_t m_iDatLen;
+  int32_t m_iDatPos;
+};
+
+#define FDE_CSSSYNTAXCHECK_AllowCharset 1
+#define FDE_CSSSYNTAXCHECK_AllowImport 2
+
+enum FDE_CSSSYNTAXMODE {
+  FDE_CSSSYNTAXMODE_RuleSet,
+  FDE_CSSSYNTAXMODE_Comment,
+  FDE_CSSSYNTAXMODE_AtRule,
+  FDE_CSSSYNTAXMODE_UnknownRule,
+  FDE_CSSSYNTAXMODE_Charset,
+  FDE_CSSSYNTAXMODE_Import,
+  FDE_CSSSYNTAXMODE_MediaRule,
+  FDE_CSSSYNTAXMODE_URI,
+  FDE_CSSSYNTAXMODE_MediaType,
+  FDE_CSSSYNTAXMODE_Selector,
+  FDE_CSSSYNTAXMODE_PropertyName,
+  FDE_CSSSYNTAXMODE_PropertyValue,
+};
+
+class CFDE_CSSSyntaxParser : public IFDE_CSSSyntaxParser, public CFX_Target {
+ public:
+  CFDE_CSSSyntaxParser();
+  ~CFDE_CSSSyntaxParser();
+  virtual void Release() { delete this; }
+  virtual FX_BOOL Init(IFX_Stream* pStream,
+                       int32_t iCSSPlaneSize,
+                       int32_t iTextDataSize = 32,
+                       FX_BOOL bOnlyDeclaration = FALSE);
+  virtual FX_BOOL Init(const FX_WCHAR* pBuffer,
+                       int32_t iBufferSize,
+                       int32_t iTextDatSize = 32,
+                       FX_BOOL bOnlyDeclaration = FALSE);
+  virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse();
+  virtual const FX_WCHAR* GetCurrentString(int32_t& iLength) const;
+
+ protected:
+  void Reset(FX_BOOL bOnlyDeclaration);
+  void SwitchMode(FDE_CSSSYNTAXMODE eMode);
+  int32_t SwitchToComment();
+
+  FX_BOOL RestoreMode();
+  FX_BOOL AppendChar(FX_WCHAR wch);
+  int32_t SaveTextData();
+  FX_BOOL IsCharsetEnabled() const {
+    return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0;
+  }
+  void DisableCharset() { m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport; }
+  FX_BOOL IsImportEnabled() const;
+  void DisableImport() { m_dwCheck = 0; }
+  IFX_Stream* m_pStream;
+  int32_t m_iStreamPos;
+  int32_t m_iPlaneSize;
+  CFDE_CSSTextBuf m_TextData;
+  CFDE_CSSTextBuf m_TextPlane;
+  int32_t m_iTextDatLen;
+  FX_DWORD m_dwCheck;
+  FDE_CSSSYNTAXMODE m_eMode;
+  FDE_CSSSYNTAXSTATUS m_eStatus;
+  CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack;
+};
+
+#endif  // XFA_FDE_CSS_FDE_CSSSYNTAX_H_
diff --git a/xfa/fde/fde_brush.h b/xfa/fde/fde_brush.h
new file mode 100644
index 0000000..898ea01
--- /dev/null
+++ b/xfa/fde/fde_brush.h
@@ -0,0 +1,150 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_BRUSH_H_
+#define XFA_FDE_FDE_BRUSH_H_
+
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+
+class IFDE_Image;
+
+#define FDE_BRUSHTYPE_Unknown -1
+#define FDE_BRUSHTYPE_Solid 0
+#define FDE_BRUSHTYPE_Hatch 1
+#define FDE_BRUSHTYPE_Texture 2
+#define FDE_BRUSHTYPE_LinearGradient 3
+#define FDE_BRUSHTYPE_MAX 3
+#define FDE_WRAPMODE_Tile 0
+#define FDE_WRAPMODE_TileFlipX 1
+#define FDE_WRAPMODE_TileFlipY 2
+#define FDE_WRAPMODE_TileFlipXY 3
+#define FDE_WRAPMODE_Clamp 4
+
+struct FDE_GRADIENTCOLOR {
+  FX_FLOAT pos;
+  FX_ARGB color;
+};
+typedef CFX_ArrayTemplate<FDE_GRADIENTCOLOR> CFDE_GradientColors;
+
+class IFDE_Brush {
+ public:
+  static IFDE_Brush* Create(int32_t iType);
+  virtual ~IFDE_Brush() {}
+  virtual void Release() = 0;
+  virtual int32_t GetType() const = 0;
+};
+
+class IFDE_SolidBrush : public IFDE_Brush {
+ public:
+  virtual FX_ARGB GetColor() const = 0;
+  virtual void SetColor(FX_ARGB color) = 0;
+  virtual const CFX_Matrix& GetMatrix() const = 0;
+  virtual void ResetMatrix() = 0;
+  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) = 0;
+  virtual void RotateMatrix(FX_FLOAT fRadian) = 0;
+  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) = 0;
+  virtual void ConcatMatrix(const CFX_Matrix& matrix) = 0;
+  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
+};
+
+#define FDE_HATCHSTYLE_Horizontal 0
+#define FDE_HATCHSTYLE_Vertical 1
+#define FDE_HATCHSTYLE_ForwardDiagonal 2
+#define FDE_HATCHSTYLE_BackwardDiagonal 3
+#define FDE_HATCHSTYLE_Cross 4
+#define FDE_HATCHSTYLE_DiagonalCross 5
+#define FDE_HATCHSTYLE_05Percent 6
+#define FDE_HATCHSTYLE_10Percent 7
+#define FDE_HATCHSTYLE_20Percent 8
+#define FDE_HATCHSTYLE_25Percent 9
+#define FDE_HATCHSTYLE_30Percent 10
+#define FDE_HATCHSTYLE_40Percent 11
+#define FDE_HATCHSTYLE_50Percent 12
+#define FDE_HATCHSTYLE_60Percent 13
+#define FDE_HATCHSTYLE_70Percent 14
+#define FDE_HATCHSTYLE_75Percent 15
+#define FDE_HATCHSTYLE_80Percent 16
+#define FDE_HATCHSTYLE_90Percent 17
+#define FDE_HATCHSTYLE_LightDownwardDiagonal 18
+#define FDE_HATCHSTYLE_LightUpwardDiagonal 19
+#define FDE_HATCHSTYLE_DarkDownwardDiagonal 20
+#define FDE_HATCHSTYLE_DarkUpwardDiagonal 21
+#define FDE_HATCHSTYLE_WideDownwardDiagonal 22
+#define FDE_HATCHSTYLE_WideUpwardDiagonal 23
+#define FDE_HATCHSTYLE_LightVertical 24
+#define FDE_HATCHSTYLE_LightHorizontal 25
+#define FDE_HATCHSTYLE_NarrowVertical 26
+#define FDE_HATCHSTYLE_NarrowHorizontal 27
+#define FDE_HATCHSTYLE_DarkVertical 28
+#define FDE_HATCHSTYLE_DarkHorizontal 29
+#define FDE_HATCHSTYLE_DashedDownwardDiagonal 30
+#define FDE_HATCHSTYLE_DashedUpwardDiagonal 31
+#define FDE_HATCHSTYLE_DashedHorizontal 32
+#define FDE_HATCHSTYLE_DashedVertical 33
+#define FDE_HATCHSTYLE_SmallConfetti 34
+#define FDE_HATCHSTYLE_LargeConfetti 35
+#define FDE_HATCHSTYLE_ZigZag 36
+#define FDE_HATCHSTYLE_Wave 37
+#define FDE_HATCHSTYLE_DiagonalBrick 38
+#define FDE_HATCHSTYLE_HorizontalBrick 39
+#define FDE_HATCHSTYLE_Weave 40
+#define FDE_HATCHSTYLE_Plaid 41
+#define FDE_HATCHSTYLE_Divot 42
+#define FDE_HATCHSTYLE_DottedGrid 43
+#define FDE_HATCHSTYLE_DottedDiamond 44
+#define FDE_HATCHSTYLE_Shingle 45
+#define FDE_HATCHSTYLE_Trellis 46
+#define FDE_HATCHSTYLE_Sphere 47
+#define FDE_HATCHSTYLE_SmallGrid 48
+#define FDE_HATCHSTYLE_SmallCheckerBoard 49
+#define FDE_HATCHSTYLE_LargeCheckerBoard 50
+#define FDE_HATCHSTYLE_OutlinedDiamond 51
+#define FDE_HATCHSTYLE_SolidDiamond 52
+#define FDE_HATCHSTYLE_Total 53
+#define FDE_HATCHSTYLE_LargeGrid FDE_HATCHSTYLE_Cross
+#define FDE_HATCHSTYLE_Min FDE_HATCHSTYLE_Horizontal
+#define FDE_HATCHSTYLE_Max (FDE_HATCHSTYLE_Total - 1)
+
+class IFDE_HatchBrush : public IFDE_Brush {
+ public:
+  virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const = 0;
+  virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) = 0;
+  virtual int32_t GetHatchStyle() const = 0;
+  virtual FX_BOOL SetHatchStyle(int32_t iHatchStyle) = 0;
+};
+
+class IFDE_TextureBrush : public IFDE_Brush {
+ public:
+  virtual IFDE_Image* GetImage() const = 0;
+  virtual void SetImage(IFDE_Image* pImage, FX_BOOL bAutoRelease) = 0;
+  virtual int32_t GetWrapMode() const = 0;
+  virtual void SetWrapMode(int32_t iWrapMode) = 0;
+};
+
+#define FDE_LINEARGRADIENTMODE_Horizontal 0
+#define FDE_LINEARGRADIENTMODE_Vertical 1
+#define FDE_LINEARGRADIENTMODE_ForwardDiagonal 2
+#define FDE_LINEARGRADIENTMODE_BackwardDiagonal 3
+
+class IFDE_LinearGradientBrush : public IFDE_Brush {
+ public:
+  virtual void GetLinearPoints(CFX_PointF& startingPoint,
+                               CFX_PointF& endingPoint) const = 0;
+  virtual void SetLinearPoints(const CFX_PointF& startingPoint,
+                               const CFX_PointF& endingPoint) = 0;
+  virtual void GetLinearColors(FX_ARGB& startingColor,
+                               FX_ARGB& endingColor) const = 0;
+  virtual void SetLinearColors(const FX_ARGB& startingColor,
+                               const FX_ARGB& endingColor) = 0;
+  virtual int32_t CountGradientColors() const = 0;
+  virtual FX_BOOL GetGradientColors(CFDE_GradientColors& colors) const = 0;
+  virtual FX_BOOL SetGradientColors(const CFDE_GradientColors& colors) = 0;
+  virtual int32_t GetWrapMode() const = 0;
+  virtual void SetWrapMode(int32_t iWrapMode) = 0;
+};
+
+#endif  // XFA_FDE_FDE_BRUSH_H_
diff --git a/xfa/fde/fde_devbasic.cpp b/xfa/fde/fde_devbasic.cpp
new file mode 100644
index 0000000..c85b125
--- /dev/null
+++ b/xfa/fde/fde_devbasic.cpp
@@ -0,0 +1,550 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_devbasic.h"
+
+#include <cstdint>
+
+#include "xfa/fde/fde_brush.h"
+
+static const FDE_HATCHDATA gs_HatchBitmapData[FDE_HATCHSTYLE_Total] = {
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x15, 0x15, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x7f, 0x7f, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
+         0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,
+         0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
+         0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00,
+         0x83, 0x83, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
+         0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
+         0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,
+         0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00,
+         0xc1, 0xc1, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x04, 0x04, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
+         0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
+         0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00,
+         0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00,
+         0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,
+         0x8d, 0x8d, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
+         0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
+         0xc0, 0xc0, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x51, 0x51, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00,
+         0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
+         0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
+         0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
+         0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00,
+         0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,
+         0xf8, 0xf8, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
+         0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+};
+FDE_LPCHATCHDATA FDE_DEVGetHatchData(int32_t iHatchStyle) {
+  if (iHatchStyle < FDE_HATCHSTYLE_Min || iHatchStyle > FDE_HATCHSTYLE_Max) {
+    return NULL;
+  }
+  return &gs_HatchBitmapData[iHatchStyle];
+}
diff --git a/xfa/fde/fde_devbasic.h b/xfa/fde/fde_devbasic.h
new file mode 100644
index 0000000..9c9b25d
--- /dev/null
+++ b/xfa/fde/fde_devbasic.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_DEVBASIC_H_
+#define XFA_FDE_FDE_DEVBASIC_H_
+
+#include <cstdint>
+
+struct FDE_HATCHDATA {
+  int32_t iWidth;
+  int32_t iHeight;
+  uint8_t MaskBits[64];
+};
+typedef FDE_HATCHDATA const* FDE_LPCHATCHDATA;
+FDE_LPCHATCHDATA FDE_DEVGetHatchData(int32_t iHatchStyle);
+
+#endif  // XFA_FDE_FDE_DEVBASIC_H_
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp
new file mode 100644
index 0000000..ab62999
--- /dev/null
+++ b/xfa/fde/fde_gedevice.cpp
@@ -0,0 +1,573 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_gedevice.h"
+
+#include <algorithm>
+
+#include "xfa/fde/fde_brush.h"
+#include "xfa/fde/fde_devbasic.h"
+#include "xfa/fde/fde_geobject.h"
+#include "xfa/fde/fde_image.h"
+#include "xfa/fde/fde_pen.h"
+
+FX_BOOL FDE_GetStockHatchMask(int32_t iHatchStyle, CFX_DIBitmap& hatchMask) {
+  FDE_LPCHATCHDATA pData = FDE_DEVGetHatchData(iHatchStyle);
+  if (!pData) {
+    return FALSE;
+  }
+  hatchMask.Create(pData->iWidth, pData->iHeight, FXDIB_1bppMask);
+  FXSYS_memcpy(hatchMask.GetBuffer(), pData->MaskBits,
+               hatchMask.GetPitch() * pData->iHeight);
+  return TRUE;
+}
+
+IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap,
+                                             FX_BOOL bRgbByteOrder) {
+  if (pBitmap == NULL) {
+    return NULL;
+  }
+  CFX_FxgeDevice* pDevice = new CFX_FxgeDevice;
+  pDevice->Attach(pBitmap, 0, bRgbByteOrder);
+  return new CFDE_FxgeDevice(pDevice, TRUE);
+}
+IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_RenderDevice* pDevice) {
+  return pDevice ? new CFDE_FxgeDevice(pDevice, FALSE) : nullptr;
+}
+CFDE_FxgeDevice::CFDE_FxgeDevice(CFX_RenderDevice* pDevice,
+                                 FX_BOOL bOwnerDevice)
+    : m_pDevice(pDevice),
+      m_bOwnerDevice(bOwnerDevice),
+      m_pCharPos(NULL),
+      m_iCharCount(0) {
+  FXSYS_assert(pDevice != NULL);
+  FX_RECT rt = m_pDevice->GetClipBox();
+  m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
+               (FX_FLOAT)rt.Height());
+}
+CFDE_FxgeDevice::~CFDE_FxgeDevice() {
+  FX_Free(m_pCharPos);
+  if (m_bOwnerDevice)
+    delete m_pDevice;
+}
+int32_t CFDE_FxgeDevice::GetWidth() const {
+  return m_pDevice->GetWidth();
+}
+int32_t CFDE_FxgeDevice::GetHeight() const {
+  return m_pDevice->GetHeight();
+}
+FDE_HDEVICESTATE CFDE_FxgeDevice::SaveState() {
+  m_pDevice->SaveState();
+  return NULL;
+}
+void CFDE_FxgeDevice::RestoreState(FDE_HDEVICESTATE hState) {
+  m_pDevice->RestoreState();
+  const FX_RECT& rt = m_pDevice->GetClipBox();
+  m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
+               (FX_FLOAT)rt.Height());
+}
+FX_BOOL CFDE_FxgeDevice::SetClipRect(const CFX_RectF& rtClip) {
+  m_rtClip = rtClip;
+  return m_pDevice->SetClip_Rect(FX_RECT((int32_t)FXSYS_floor(rtClip.left),
+                                         (int32_t)FXSYS_floor(rtClip.top),
+                                         (int32_t)FXSYS_ceil(rtClip.right()),
+                                         (int32_t)FXSYS_ceil(rtClip.bottom())));
+}
+const CFX_RectF& CFDE_FxgeDevice::GetClipRect() {
+  return m_rtClip;
+}
+FX_BOOL CFDE_FxgeDevice::SetClipPath(const IFDE_Path* pClip) {
+  return FALSE;
+}
+IFDE_Path* CFDE_FxgeDevice::GetClipPath() const {
+  return NULL;
+}
+FX_FLOAT CFDE_FxgeDevice::GetDpiX() const {
+  return 96;
+}
+FX_FLOAT CFDE_FxgeDevice::GetDpiY() const {
+  return 96;
+}
+FX_BOOL CFDE_FxgeDevice::DrawImage(CFX_DIBSource* pDib,
+                                   const CFX_RectF* pSrcRect,
+                                   const CFX_RectF& dstRect,
+                                   const CFX_Matrix* pImgMatrix,
+                                   const CFX_Matrix* pDevMatrix) {
+  FXSYS_assert(pDib != NULL);
+  CFX_RectF srcRect;
+  if (pSrcRect) {
+    srcRect = *pSrcRect;
+  } else {
+    srcRect.Set(0, 0, (FX_FLOAT)pDib->GetWidth(), (FX_FLOAT)pDib->GetHeight());
+  }
+  if (srcRect.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_Matrix dib2fxdev;
+  if (pImgMatrix) {
+    dib2fxdev = *pImgMatrix;
+  } else {
+    dib2fxdev.SetIdentity();
+  }
+  dib2fxdev.a = dstRect.width;
+  dib2fxdev.d = -dstRect.height;
+  dib2fxdev.e = dstRect.left;
+  dib2fxdev.f = dstRect.bottom();
+  if (pDevMatrix) {
+    dib2fxdev.Concat(*pDevMatrix);
+  }
+  void* handle = NULL;
+  m_pDevice->StartDIBits(pDib, 255, 0, (const CFX_Matrix*)&dib2fxdev, 0,
+                         handle);
+  while (m_pDevice->ContinueDIBits(handle, NULL)) {
+  }
+  m_pDevice->CancelDIBits(handle);
+  return handle != NULL;
+}
+FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush,
+                                    IFX_Font* pFont,
+                                    const FXTEXT_CHARPOS* pCharPos,
+                                    int32_t iCount,
+                                    FX_FLOAT fFontSize,
+                                    const CFX_Matrix* pMatrix) {
+  FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL &&
+               iCount > 0);
+  CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache();
+  CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont();
+  switch (pBrush->GetType()) {
+    case FDE_BRUSHTYPE_Solid: {
+      FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor();
+      if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
+          !pFxFont->IsItalic()) {
+        FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+        FX_FLOAT* pAM;
+        for (int32_t i = 0; i < iCount; ++i) {
+          static const FX_FLOAT mc = 0.267949f;
+          pAM = pCP->m_AdjustMatrix;
+          pAM[2] = mc * pAM[0] + pAM[2];
+          pAM[3] = mc * pAM[1] + pAM[3];
+          pCP++;
+        }
+      }
+      FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+      IFX_Font* pCurFont = NULL;
+      IFX_Font* pSTFont = NULL;
+      FXTEXT_CHARPOS* pCurCP = NULL;
+      int32_t iCurCount = 0;
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      FX_DWORD dwFontStyle = pFont->GetFontStyles();
+      CFX_Font FxFont;
+      CFX_SubstFont SubstFxFont;
+      FxFont.SetSubstFont(&SubstFxFont);
+      SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
+      SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight;
+      SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
+      SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      for (int32_t i = 0; i < iCount; ++i) {
+        pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
+        pCP->m_GlyphIndex &= 0x00FFFFFF;
+        pCP->m_bFontStyle = FALSE;
+        if (pCurFont != pSTFont) {
+          if (pCurFont != NULL) {
+            pFxFont = (CFX_Font*)pCurFont->GetDevFont();
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+            FxFont.SetFace(pFxFont->GetFace());
+            m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache,
+                                      -fFontSize, (const CFX_Matrix*)pMatrix,
+                                      argb, FXTEXT_CLEARTYPE);
+#else
+            m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
+                                      -fFontSize, (const CFX_Matrix*)pMatrix,
+                                      argb, FXTEXT_CLEARTYPE);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+          }
+          pCurFont = pSTFont;
+          pCurCP = pCP;
+          iCurCount = 1;
+        } else {
+          iCurCount++;
+        }
+        pCP++;
+      }
+      if (pCurFont != NULL && iCurCount) {
+        pFxFont = (CFX_Font*)pCurFont->GetDevFont();
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+        FxFont.SetFace(pFxFont->GetFace());
+        FX_BOOL bRet = m_pDevice->DrawNormalText(
+            iCurCount, pCurCP, &FxFont, pCache, -fFontSize,
+            (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE);
+        FxFont.SetSubstFont(nullptr);
+        FxFont.SetFace(nullptr);
+        return bRet;
+#else
+        return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
+                                         -fFontSize, (const CFX_Matrix*)pMatrix,
+                                         argb, FXTEXT_CLEARTYPE);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      }
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      FxFont.SetSubstFont(nullptr);
+      FxFont.SetFace(nullptr);
+#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      return TRUE;
+    } break;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen,
+                                    FX_FLOAT fPenWidth,
+                                    const CFX_PointF& pt1,
+                                    const CFX_PointF& pt2,
+                                    const CFX_PointF& pt3,
+                                    const CFX_PointF& pt4,
+                                    const CFX_Matrix* pMatrix) {
+  CFX_PointsF points;
+  points.Add(pt1);
+  points.Add(pt2);
+  points.Add(pt3);
+  points.Add(pt4);
+  CFDE_Path path;
+  path.AddBezier(points);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen,
+                                   FX_FLOAT fPenWidth,
+                                   const CFX_PointsF& points,
+                                   FX_BOOL bClosed,
+                                   FX_FLOAT fTension,
+                                   const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddCurve(points, bClosed, fTension);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen,
+                                     FX_FLOAT fPenWidth,
+                                     const CFX_RectF& rect,
+                                     const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddEllipse(rect);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen,
+                                   FX_FLOAT fPenWidth,
+                                   const CFX_PointsF& points,
+                                   const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddLines(points);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen,
+                                  FX_FLOAT fPenWidth,
+                                  const CFX_PointF& pt1,
+                                  const CFX_PointF& pt2,
+                                  const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddLine(pt1, pt2);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen,
+                                  FX_FLOAT fPenWidth,
+                                  const IFDE_Path* pPath,
+                                  const CFX_Matrix* pMatrix) {
+  CFDE_Path* pGePath = (CFDE_Path*)pPath;
+  if (pGePath == NULL) {
+    return FALSE;
+  }
+  CFX_GraphStateData graphState;
+  if (!CreatePen(pPen, fPenWidth, graphState)) {
+    return FALSE;
+  }
+  return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix,
+                             &graphState, 0, pPen->GetColor(), 0);
+}
+FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen,
+                                     FX_FLOAT fPenWidth,
+                                     const CFX_PointsF& points,
+                                     const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddPolygon(points);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen,
+                                       FX_FLOAT fPenWidth,
+                                       const CFX_RectF& rect,
+                                       const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddRectangle(rect);
+  return DrawPath(pPen, fPenWidth, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush,
+                                         const CFX_PointsF& points,
+                                         FX_FLOAT fTension,
+                                         const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddCurve(points, TRUE, fTension);
+  return FillPath(pBrush, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush,
+                                     const CFX_RectF& rect,
+                                     const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddEllipse(rect);
+  return FillPath(pBrush, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush* pBrush,
+                                     const CFX_PointsF& points,
+                                     const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddPolygon(points);
+  return FillPath(pBrush, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush* pBrush,
+                                       const CFX_RectF& rect,
+                                       const CFX_Matrix* pMatrix) {
+  CFDE_Path path;
+  path.AddRectangle(rect);
+  return FillPath(pBrush, &path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen,
+                                   FX_FLOAT fPenWidth,
+                                   CFX_GraphStateData& graphState) {
+  if (pPen == NULL) {
+    return FALSE;
+  }
+  graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap();
+  graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin();
+  graphState.m_LineWidth = fPenWidth;
+  graphState.m_MiterLimit = pPen->GetMiterLimit();
+  graphState.m_DashPhase = pPen->GetDashPhase();
+  CFX_FloatArray dashArray;
+  switch (pPen->GetDashStyle()) {
+    case FDE_DASHSTYLE_Dash:
+      dashArray.Add(3);
+      dashArray.Add(1);
+      break;
+    case FDE_DASHSTYLE_Dot:
+      dashArray.Add(1);
+      dashArray.Add(1);
+      break;
+    case FDE_DASHSTYLE_DashDot:
+      dashArray.Add(3);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      break;
+    case FDE_DASHSTYLE_DashDotDot:
+      dashArray.Add(3);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      dashArray.Add(1);
+      break;
+    case FDE_DASHSTYLE_Customized:
+      pPen->GetDashArray(dashArray);
+      break;
+  }
+  int32_t iDashCount = dashArray.GetSize();
+  if (iDashCount > 0) {
+    graphState.SetDashCount(iDashCount);
+    for (int32_t i = 0; i < iDashCount; ++i) {
+      graphState.m_DashArray[i] = dashArray[i] * fPenWidth;
+    }
+  }
+  return TRUE;
+}
+typedef FX_BOOL (CFDE_FxgeDevice::*pfFillPath)(IFDE_Brush* pBrush,
+                                               const CFX_PathData* pPath,
+                                               const CFX_Matrix* pMatrix);
+static const pfFillPath gs_FillPath[] = {
+    &CFDE_FxgeDevice::FillSolidPath, &CFDE_FxgeDevice::FillHatchPath,
+    &CFDE_FxgeDevice::FillTexturePath, &CFDE_FxgeDevice::FillLinearGradientPath,
+};
+FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush,
+                                  const IFDE_Path* pPath,
+                                  const CFX_Matrix* pMatrix) {
+  CFDE_Path* pGePath = (CFDE_Path*)pPath;
+  if (pGePath == NULL) {
+    return FALSE;
+  }
+  if (pBrush == NULL) {
+    return FALSE;
+  }
+  int32_t iType = pBrush->GetType();
+  if (iType < 0 || iType > FDE_BRUSHTYPE_MAX) {
+    return FALSE;
+  }
+  return (this->*gs_FillPath[iType])(pBrush, &pGePath->m_Path, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush,
+                                       const CFX_PathData* pPath,
+                                       const CFX_Matrix* pMatrix) {
+  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid);
+  IFDE_SolidBrush* pSolidBrush = (IFDE_SolidBrush*)pBrush;
+  return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL,
+                             pSolidBrush->GetColor(), 0, FXFILL_WINDING);
+}
+FX_BOOL CFDE_FxgeDevice::FillHatchPath(IFDE_Brush* pBrush,
+                                       const CFX_PathData* pPath,
+                                       const CFX_Matrix* pMatrix) {
+  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Hatch);
+  IFDE_HatchBrush* pHatchBrush = (IFDE_HatchBrush*)pBrush;
+  int32_t iStyle = pHatchBrush->GetHatchStyle();
+  if (iStyle < FDE_HATCHSTYLE_Min || iStyle > FDE_HATCHSTYLE_Max) {
+    return FALSE;
+  }
+  CFX_DIBitmap mask;
+  if (!FDE_GetStockHatchMask(iStyle, mask)) {
+    return FALSE;
+  }
+  FX_ARGB dwForeColor = pHatchBrush->GetColor(TRUE);
+  FX_ARGB dwBackColor = pHatchBrush->GetColor(FALSE);
+  CFX_FloatRect rectf = pPath->GetBoundingBox();
+  if (pMatrix) {
+    rectf.Transform((const CFX_Matrix*)pMatrix);
+  }
+  FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
+               FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
+  m_pDevice->SaveState();
+  m_pDevice->StartRendering();
+  m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix,
+                              FXFILL_WINDING);
+  m_pDevice->FillRect(&rect, dwBackColor);
+  for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight())
+    for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) {
+      m_pDevice->SetBitMask(&mask, i, j, dwForeColor);
+    }
+  m_pDevice->EndRendering();
+  m_pDevice->RestoreState();
+  return TRUE;
+}
+FX_BOOL CFDE_FxgeDevice::FillTexturePath(IFDE_Brush* pBrush,
+                                         const CFX_PathData* pPath,
+                                         const CFX_Matrix* pMatrix) {
+  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Texture);
+  IFDE_TextureBrush* pTextureBrush = static_cast<IFDE_TextureBrush*>(pBrush);
+  IFDE_Image* pImage = pTextureBrush->GetImage();
+  if (!pImage)
+    return FALSE;
+
+  CFX_Size size(pImage->GetImageWidth(), pImage->GetImageHeight());
+  CFX_DIBitmap bmp;
+  bmp.Create(size.x, size.y, FXDIB_Argb);
+  if (!pImage->StartLoadImage(&bmp, 0, 0, size.x, size.y, 0, 0, size.x,
+                              size.y)) {
+    return FALSE;
+  }
+  if (pImage->DoLoadImage() < 100) {
+    return FALSE;
+  }
+  pImage->StopLoadImage();
+  return WrapTexture(pTextureBrush->GetWrapMode(), &bmp, pPath, pMatrix);
+}
+FX_BOOL CFDE_FxgeDevice::WrapTexture(int32_t iWrapMode,
+                                     const CFX_DIBitmap* pBitmap,
+                                     const CFX_PathData* pPath,
+                                     const CFX_Matrix* pMatrix) {
+  CFX_FloatRect rectf = pPath->GetBoundingBox();
+  if (pMatrix) {
+    rectf.Transform((const CFX_Matrix*)pMatrix);
+  }
+  FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
+               FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
+  rect.Normalize();
+  if (rect.IsEmpty()) {
+    return FALSE;
+  }
+  m_pDevice->SaveState();
+  m_pDevice->StartRendering();
+  m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix,
+                              FXFILL_WINDING);
+  switch (iWrapMode) {
+    case FDE_WRAPMODE_Tile:
+    case FDE_WRAPMODE_TileFlipX:
+    case FDE_WRAPMODE_TileFlipY:
+    case FDE_WRAPMODE_TileFlipXY: {
+      FX_BOOL bFlipX = iWrapMode == FDE_WRAPMODE_TileFlipXY ||
+                       iWrapMode == FDE_WRAPMODE_TileFlipX;
+      FX_BOOL bFlipY = iWrapMode == FDE_WRAPMODE_TileFlipXY ||
+                       iWrapMode == FDE_WRAPMODE_TileFlipY;
+      const CFX_DIBitmap* pFlip[2][2];
+      pFlip[0][0] = pBitmap;
+      pFlip[0][1] = bFlipX ? pBitmap->FlipImage(TRUE, FALSE) : pBitmap;
+      pFlip[1][0] = bFlipY ? pBitmap->FlipImage(FALSE, TRUE) : pBitmap;
+      pFlip[1][1] =
+          (bFlipX || bFlipY) ? pBitmap->FlipImage(bFlipX, bFlipY) : pBitmap;
+      int32_t iCounterY = 0;
+      for (int32_t j = rect.top; j < rect.bottom; j += pBitmap->GetHeight()) {
+        int32_t indexY = iCounterY++ % 2;
+        int32_t iCounterX = 0;
+        for (int32_t i = rect.left; i < rect.right; i += pBitmap->GetWidth()) {
+          int32_t indexX = iCounterX++ % 2;
+          m_pDevice->SetDIBits(pFlip[indexY][indexX], i, j);
+        }
+      }
+      if (pFlip[0][1] != pFlip[0][0]) {
+        delete pFlip[0][1];
+      }
+      if (pFlip[1][0] != pFlip[0][0]) {
+        delete pFlip[1][0];
+      }
+      if (pFlip[1][1] != pFlip[0][0]) {
+        delete pFlip[1][1];
+      }
+    } break;
+    case FDE_WRAPMODE_Clamp: {
+      m_pDevice->SetDIBits(pBitmap, rect.left, rect.bottom);
+    } break;
+  }
+  m_pDevice->EndRendering();
+  m_pDevice->RestoreState();
+  return TRUE;
+}
+FX_BOOL CFDE_FxgeDevice::FillLinearGradientPath(IFDE_Brush* pBrush,
+                                                const CFX_PathData* pPath,
+                                                const CFX_Matrix* pMatrix) {
+  FXSYS_assert(pPath && pBrush &&
+               pBrush->GetType() == FDE_BRUSHTYPE_LinearGradient);
+  IFDE_LinearGradientBrush* pLinearBrush = (IFDE_LinearGradientBrush*)pBrush;
+  CFX_PointF pt0, pt1;
+  pLinearBrush->GetLinearPoints(pt0, pt1);
+  CFX_VectorF fDiagonal(pt0, pt1);
+  FX_FLOAT fTheta = FXSYS_atan2(fDiagonal.y, fDiagonal.x);
+  FX_FLOAT fLength = fDiagonal.Length();
+  FX_FLOAT fTotalX = fLength / FXSYS_cos(fTheta);
+  FX_FLOAT fTotalY = fLength / FXSYS_cos(FX_PI / 2 - fTheta);
+  FX_FLOAT fSteps = std::max(fTotalX, fTotalY);
+  FX_FLOAT dx = fTotalX / fSteps;
+  FX_FLOAT dy = fTotalY / fSteps;
+  FX_ARGB cr0, cr1;
+  pLinearBrush->GetLinearColors(cr0, cr1);
+  FX_FLOAT a0 = FXARGB_A(cr0);
+  FX_FLOAT r0 = FXARGB_R(cr0);
+  FX_FLOAT g0 = FXARGB_G(cr0);
+  FX_FLOAT b0 = FXARGB_B(cr0);
+  FX_FLOAT da = (FXARGB_A(cr1) - a0) / fSteps;
+  FX_FLOAT dr = (FXARGB_R(cr1) - r0) / fSteps;
+  FX_FLOAT dg = (FXARGB_G(cr1) - g0) / fSteps;
+  FX_FLOAT db = (FXARGB_B(cr1) - b0) / fSteps;
+  CFX_DIBitmap bmp;
+  bmp.Create(FXSYS_round(FXSYS_fabs(fDiagonal.x)),
+             FXSYS_round(FXSYS_fabs(fDiagonal.y)), FXDIB_Argb);
+  CFX_FxgeDevice dev;
+  dev.Attach(&bmp);
+  pt1 = pt0;
+  int32_t iSteps = FXSYS_round(FXSYS_ceil(fSteps));
+  while (--iSteps >= 0) {
+    cr0 = ArgbEncode(FXSYS_round(a0), FXSYS_round(r0), FXSYS_round(g0),
+                     FXSYS_round(b0));
+    dev.DrawCosmeticLine(pt0.x, pt0.y, pt1.x, pt1.y, cr0);
+    pt1.x += dx;
+    pt0.y += dy;
+    a0 += da;
+    r0 += dr;
+    g0 += dg;
+    b0 += db;
+  }
+  return WrapTexture(pLinearBrush->GetWrapMode(), &bmp, pPath, pMatrix);
+}
diff --git a/xfa/fde/fde_gedevice.h b/xfa/fde/fde_gedevice.h
new file mode 100644
index 0000000..6846739
--- /dev/null
+++ b/xfa/fde/fde_gedevice.h
@@ -0,0 +1,136 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_GEDEVICE_H_
+#define XFA_FDE_FDE_GEDEVICE_H_
+
+#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class CFDE_FxgeDevice : public IFDE_RenderDevice, public CFX_Target {
+ public:
+  CFDE_FxgeDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
+  ~CFDE_FxgeDevice();
+  virtual void Release() { delete this; }
+
+  virtual int32_t GetWidth() const;
+  virtual int32_t GetHeight() const;
+  virtual FDE_HDEVICESTATE SaveState();
+  virtual void RestoreState(FDE_HDEVICESTATE hState);
+  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip);
+  virtual IFDE_Path* GetClipPath() const;
+  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip);
+  virtual const CFX_RectF& GetClipRect();
+
+  virtual FX_FLOAT GetDpiX() const;
+  virtual FX_FLOAT GetDpiY() const;
+
+  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
+                            const CFX_RectF* pSrcRect,
+                            const CFX_RectF& dstRect,
+                            const CFX_Matrix* pImgMatrix = NULL,
+                            const CFX_Matrix* pDevMatrix = NULL);
+  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
+                             IFX_Font* pFont,
+                             const FXTEXT_CHARPOS* pCharPos,
+                             int32_t iCount,
+                             FX_FLOAT fFontSize,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
+                             FX_FLOAT fPenWidth,
+                             const CFX_PointF& pt1,
+                             const CFX_PointF& pt2,
+                             const CFX_PointF& pt3,
+                             const CFX_PointF& pt4,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
+                            FX_FLOAT fPenWidth,
+                            const CFX_PointsF& points,
+                            FX_BOOL bClosed,
+                            FX_FLOAT fTension = 0.5f,
+                            const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
+                              FX_FLOAT fPenWidth,
+                              const CFX_RectF& rect,
+                              const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
+                            FX_FLOAT fPenWidth,
+                            const CFX_PointsF& points,
+                            const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
+                           FX_FLOAT fPenWidth,
+                           const CFX_PointF& pt1,
+                           const CFX_PointF& pt2,
+                           const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
+                           FX_FLOAT fPenWidth,
+                           const IFDE_Path* pPath,
+                           const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
+                              FX_FLOAT fPenWidth,
+                              const CFX_PointsF& points,
+                              const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
+                                FX_FLOAT fPenWidth,
+                                const CFX_RectF& rect,
+                                const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
+                                  const CFX_PointsF& points,
+                                  FX_FLOAT fTension = 0.5f,
+                                  const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
+                              const CFX_RectF& rect,
+                              const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
+                           const IFDE_Path* pPath,
+                           const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
+                              const CFX_PointsF& points,
+                              const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
+                                const CFX_RectF& rect,
+                                const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL FillSolidPath(IFDE_Brush* pBrush,
+                        const CFX_PathData* pPath,
+                        const CFX_Matrix* pMatrix);
+  FX_BOOL FillHatchPath(IFDE_Brush* pBrush,
+                        const CFX_PathData* pPath,
+                        const CFX_Matrix* pMatrix);
+  FX_BOOL FillTexturePath(IFDE_Brush* pBrush,
+                          const CFX_PathData* pPath,
+                          const CFX_Matrix* pMatrix);
+  FX_BOOL FillLinearGradientPath(IFDE_Brush* pBrush,
+                                 const CFX_PathData* pPath,
+                                 const CFX_Matrix* pMatrix);
+  FX_BOOL DrawSolidString(IFDE_Brush* pBrush,
+                          IFX_Font* pFont,
+                          const FXTEXT_CHARPOS* pCharPos,
+                          int32_t iCount,
+                          FX_FLOAT fFontSize,
+                          const CFX_Matrix* pMatrix);
+  FX_BOOL DrawStringPath(IFDE_Brush* pBrush,
+                         IFX_Font* pFont,
+                         const FXTEXT_CHARPOS* pCharPos,
+                         int32_t iCount,
+                         FX_FLOAT fFontSize,
+                         const CFX_Matrix* pMatrix);
+
+ protected:
+  FX_BOOL CreatePen(IFDE_Pen* pPen,
+                    FX_FLOAT fPenWidth,
+                    CFX_GraphStateData& graphState);
+  FX_BOOL WrapTexture(int32_t iWrapMode,
+                      const CFX_DIBitmap* pBitmap,
+                      const CFX_PathData* pPath,
+                      const CFX_Matrix* pMatrix);
+  CFX_RenderDevice* m_pDevice;
+  CFX_RectF m_rtClip;
+  FX_BOOL m_bOwnerDevice;
+  FXTEXT_CHARPOS* m_pCharPos;
+  int32_t m_iCharCount;
+};
+
+#endif  // XFA_FDE_FDE_GEDEVICE_H_
diff --git a/xfa/fde/fde_geobject.cpp b/xfa/fde/fde_geobject.cpp
new file mode 100644
index 0000000..f4aede0
--- /dev/null
+++ b/xfa/fde/fde_geobject.cpp
@@ -0,0 +1,255 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_geobject.h"
+
+#include "xfa/fde/fde_object.h"
+
+IFDE_Path* IFDE_Path::Create() {
+  return new CFDE_Path;
+}
+FX_BOOL CFDE_Path::StartFigure() {
+  return CloseFigure();
+}
+FX_BOOL CFDE_Path::CloseFigure() {
+  FX_PATHPOINT* pPoint = GetLastPoint();
+  if (pPoint) {
+    pPoint->m_Flag |= FXPT_CLOSEFIGURE;
+  }
+  return TRUE;
+}
+FX_PATHPOINT* CFDE_Path::GetLastPoint(int32_t iCount) const {
+  if (iCount < 1) {
+    return NULL;
+  }
+  int32_t iPoints = m_Path.GetPointCount();
+  if (iCount > iPoints) {
+    return NULL;
+  }
+  return m_Path.GetPoints() + iPoints - iCount;
+}
+FX_BOOL CFDE_Path::FigureClosed() const {
+  FX_PATHPOINT* pPoint = GetLastPoint();
+  return pPoint ? (pPoint->m_Flag & FXPT_CLOSEFIGURE) : TRUE;
+}
+FX_PATHPOINT* CFDE_Path::AddPoints(int32_t iCount) {
+  if (iCount < 1) {
+    return NULL;
+  }
+  int32_t iPoints = m_Path.GetPointCount();
+  m_Path.AddPointCount(iCount);
+  return m_Path.GetPoints() + iPoints;
+}
+void CFDE_Path::MoveTo(FX_FLOAT fx, FX_FLOAT fy) {
+  FX_PATHPOINT* pPoint = AddPoints(1);
+  pPoint->m_PointX = fx;
+  pPoint->m_PointY = fy;
+  pPoint->m_Flag = FXPT_MOVETO;
+}
+void CFDE_Path::LineTo(FX_FLOAT fx, FX_FLOAT fy) {
+  FX_PATHPOINT* pPoint = AddPoints(1);
+  pPoint->m_PointX = fx;
+  pPoint->m_PointY = fy;
+  pPoint->m_Flag = FXPT_LINETO;
+}
+void CFDE_Path::BezierTo(const CFX_PointF& p1,
+                         const CFX_PointF& p2,
+                         const CFX_PointF& p3) {
+  FX_PATHPOINT* p = AddPoints(3);
+  p[0].m_PointX = p1.x;
+  p[0].m_PointY = p1.y;
+  p[0].m_Flag = FXPT_BEZIERTO;
+  p[1].m_PointX = p2.x;
+  p[1].m_PointY = p2.y;
+  p[1].m_Flag = FXPT_BEZIERTO;
+  p[2].m_PointX = p3.x;
+  p[2].m_PointY = p3.y;
+  p[2].m_Flag = FXPT_BEZIERTO;
+}
+void CFDE_Path::ArcTo(FX_BOOL bStart,
+                      const CFX_RectF& rect,
+                      FX_FLOAT startAngle,
+                      FX_FLOAT endAngle) {
+  FX_FLOAT rx = rect.width / 2;
+  FX_FLOAT ry = rect.height / 2;
+  FX_FLOAT cx = rect.left + rx;
+  FX_FLOAT cy = rect.top + ry;
+  FX_FLOAT alpha =
+      FXSYS_atan2(rx * FXSYS_sin(startAngle), ry * FXSYS_cos(startAngle));
+  FX_FLOAT beta =
+      FXSYS_atan2(rx * FXSYS_sin(endAngle), ry * FXSYS_cos(endAngle));
+  if (FXSYS_fabs(beta - alpha) > FX_PI) {
+    if (beta > alpha) {
+      beta -= 2 * FX_PI;
+    } else {
+      alpha -= 2 * FX_PI;
+    }
+  }
+  FX_FLOAT half_delta = (beta - alpha) / 2;
+  FX_FLOAT bcp = 4.0f / 3 * (1 - FXSYS_cos(half_delta)) / FXSYS_sin(half_delta);
+  FX_FLOAT sin_alpha = FXSYS_sin(alpha);
+  FX_FLOAT sin_beta = FXSYS_sin(beta);
+  FX_FLOAT cos_alpha = FXSYS_cos(alpha);
+  FX_FLOAT cos_beta = FXSYS_cos(beta);
+  if (bStart)
+    MoveTo(CFX_PointF(cx + rx * cos_alpha, cy + ry * sin_alpha));
+
+  BezierTo(CFX_PointF(cx + rx * (cos_alpha - bcp * sin_alpha),
+                      cy + ry * (sin_alpha + bcp * cos_alpha)),
+           CFX_PointF(cx + rx * (cos_beta + bcp * sin_beta),
+                      cy + ry * (sin_beta - bcp * cos_beta)),
+           CFX_PointF(cx + rx * cos_beta, cy + ry * sin_beta));
+}
+
+void CFDE_Path::AddBezier(const CFX_PointsF& points) {
+  if (points.GetSize() != 4) {
+    return;
+  }
+  const CFX_PointF* p = points.GetData();
+  MoveTo(p[0]);
+  BezierTo(p[1], p[2], p[3]);
+}
+void CFDE_Path::AddBeziers(const CFX_PointsF& points) {
+  int32_t iCount = points.GetSize();
+  if (iCount < 4) {
+    return;
+  }
+  const CFX_PointF* p = points.GetData();
+  const CFX_PointF* pEnd = p + iCount;
+  MoveTo(p[0]);
+  for (++p; p <= pEnd - 3; p += 3) {
+    BezierTo(p[0], p[1], p[2]);
+  }
+}
+void CFDE_Path::GetCurveTangents(const CFX_PointsF& points,
+                                 CFX_PointsF& tangents,
+                                 FX_BOOL bClosed,
+                                 FX_FLOAT fTension) const {
+  int32_t iCount = points.GetSize();
+  tangents.SetSize(iCount);
+  if (iCount < 3) {
+    return;
+  }
+  FX_FLOAT fCoefficient = fTension / 3.0f;
+  const CFX_PointF* pPoints = points.GetData();
+  CFX_PointF* pTangents = tangents.GetData();
+  for (int32_t i = 0; i < iCount; ++i) {
+    int32_t r = i + 1;
+    int32_t s = i - 1;
+    if (r >= iCount) {
+      r = bClosed ? (r - iCount) : (iCount - 1);
+    }
+    if (s < 0) {
+      s = bClosed ? (s + iCount) : 0;
+    }
+    pTangents[i].x += (fCoefficient * (pPoints[r].x - pPoints[s].x));
+    pTangents[i].y += (fCoefficient * (pPoints[r].y - pPoints[s].y));
+  }
+}
+void CFDE_Path::AddCurve(const CFX_PointsF& points,
+                         FX_BOOL bClosed,
+                         FX_FLOAT fTension) {
+  int32_t iLast = points.GetUpperBound();
+  if (iLast < 1) {
+    return;
+  }
+  CFX_PointsF tangents;
+  GetCurveTangents(points, tangents, bClosed, fTension);
+  const CFX_PointF* pPoints = points.GetData();
+  CFX_PointF* pTangents = tangents.GetData();
+  MoveTo(pPoints[0]);
+  for (int32_t i = 0; i < iLast; ++i) {
+    BezierTo(CFX_PointF(pPoints[i].x + pTangents[i].x,
+                        pPoints[i].y + pTangents[i].y),
+             CFX_PointF(pPoints[i + 1].x - pTangents[i + 1].x,
+                        pPoints[i + 1].y - pTangents[i + 1].y),
+             CFX_PointF(pPoints[i + 1].x, pPoints[i + 1].y));
+  }
+  if (bClosed) {
+    BezierTo(CFX_PointF(pPoints[iLast].x + pTangents[iLast].x,
+                        pPoints[iLast].y + pTangents[iLast].y),
+             CFX_PointF(pPoints[0].x - pTangents[0].x,
+                        pPoints[0].y - pTangents[0].y),
+             CFX_PointF(pPoints[0].x, pPoints[0].y));
+    CloseFigure();
+  }
+}
+void CFDE_Path::AddEllipse(const CFX_RectF& rect) {
+  FX_FLOAT fStartAngle = 0;
+  FX_FLOAT fEndAngle = FX_PI / 2;
+  for (int32_t i = 0; i < 4; ++i) {
+    ArcTo(i == 0, rect, fStartAngle, fEndAngle);
+    fStartAngle += FX_PI / 2;
+    fEndAngle += FX_PI / 2;
+  }
+  CloseFigure();
+}
+void CFDE_Path::AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) {
+  FX_PATHPOINT* pLast = GetLastPoint();
+  if (pLast == NULL || FXSYS_fabs(pLast->m_PointX - pt1.x) > 0.001 ||
+      FXSYS_fabs(pLast->m_PointY - pt1.y) > 0.001) {
+    MoveTo(pt1);
+  }
+  LineTo(pt2);
+}
+void CFDE_Path::AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) {
+  CFDE_Path* pPath = (CFDE_Path*)pSrc;
+  if (pPath == NULL) {
+    return;
+  }
+  int32_t iCount = pPath->m_Path.GetPointCount();
+  if (iCount < 1) {
+    return;
+  }
+  if (bConnect) {
+    LineTo(pPath->m_Path.GetPointX(0), pPath->m_Path.GetPointY(0));
+  }
+  m_Path.Append(&pPath->m_Path, NULL);
+}
+void CFDE_Path::AddPolygon(const CFX_PointsF& points) {
+  int32_t iCount = points.GetSize();
+  if (iCount < 2) {
+    return;
+  }
+  AddLines(points);
+  const CFX_PointF* p = points.GetData();
+  if (FXSYS_fabs(p[0].x - p[iCount - 1].x) < 0.01f ||
+      FXSYS_fabs(p[0].y - p[iCount - 1].y) < 0.01f) {
+    LineTo(p[0]);
+  }
+  CloseFigure();
+}
+void CFDE_Path::AddLines(const CFX_PointsF& points) {
+  int32_t iCount = points.GetSize();
+  if (iCount < 2) {
+    return;
+  }
+  const CFX_PointF* p = points.GetData();
+  const CFX_PointF* pEnd = p + iCount;
+  MoveTo(p[0]);
+  for (++p; p < pEnd; ++p) {
+    LineTo(*p);
+  }
+}
+void CFDE_Path::AddRectangle(const CFX_RectF& rect) {
+  MoveTo(rect.TopLeft());
+  LineTo(rect.TopRight());
+  LineTo(rect.BottomRight());
+  LineTo(rect.BottomLeft());
+  CloseFigure();
+}
+void CFDE_Path::GetBBox(CFX_RectF& bbox) const {
+  CFX_FloatRect rect = m_Path.GetBoundingBox();
+  bbox.Set(rect.left, rect.top, rect.Width(), rect.Height());
+  bbox.Normalize();
+}
+void CFDE_Path::GetBBox(CFX_RectF& bbox,
+                        FX_FLOAT fLineWidth,
+                        FX_FLOAT fMiterLimit) const {
+  CFX_FloatRect rect = m_Path.GetBoundingBox(fLineWidth, fMiterLimit);
+  bbox.Set(rect.left, rect.top, rect.Width(), rect.Height());
+  bbox.Normalize();
+}
diff --git a/xfa/fde/fde_geobject.h b/xfa/fde/fde_geobject.h
new file mode 100644
index 0000000..1181915
--- /dev/null
+++ b/xfa/fde/fde_geobject.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_GEOBJECT_H_
+#define XFA_FDE_FDE_GEOBJECT_H_
+
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fde/fde_path.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class CFDE_Path : public IFDE_Path, public CFX_Target {
+ public:
+  virtual void Release() { delete this; }
+
+  virtual FX_BOOL StartFigure();
+  virtual FX_BOOL CloseFigure();
+
+  virtual void AddBezier(const CFX_PointsF& points);
+  virtual void AddBeziers(const CFX_PointsF& points);
+  virtual void AddCurve(const CFX_PointsF& points,
+                        FX_BOOL bClosed,
+                        FX_FLOAT fTension = 0.5f);
+  virtual void AddEllipse(const CFX_RectF& rect);
+  virtual void AddLines(const CFX_PointsF& points);
+  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
+  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect);
+  virtual void AddPolygon(const CFX_PointsF& points);
+  virtual void AddRectangle(const CFX_RectF& rect);
+  virtual void GetBBox(CFX_RectF& bbox) const;
+  virtual void GetBBox(CFX_RectF& bbox,
+                       FX_FLOAT fLineWidth,
+                       FX_FLOAT fMiterLimit) const;
+  FX_PATHPOINT* AddPoints(int32_t iCount);
+  FX_PATHPOINT* GetLastPoint(int32_t iCount = 1) const;
+  FX_BOOL FigureClosed() const;
+  void MoveTo(FX_FLOAT fx, FX_FLOAT fy);
+  void LineTo(FX_FLOAT fx, FX_FLOAT fy);
+  void BezierTo(const CFX_PointF& p1,
+                const CFX_PointF& p2,
+                const CFX_PointF& p3);
+  void ArcTo(FX_BOOL bStart,
+             const CFX_RectF& rect,
+             FX_FLOAT startAngle,
+             FX_FLOAT endAngle);
+  void MoveTo(const CFX_PointF& p0) { MoveTo(p0.x, p0.y); }
+  void LineTo(const CFX_PointF& p1) { LineTo(p1.x, p1.y); }
+  void GetCurveTangents(const CFX_PointsF& points,
+                        CFX_PointsF& tangents,
+                        FX_BOOL bClosed,
+                        FX_FLOAT fTension) const;
+  CFX_PathData m_Path;
+};
+
+#endif  // XFA_FDE_FDE_GEOBJECT_H_
diff --git a/xfa/fde/fde_image.h b/xfa/fde/fde_image.h
new file mode 100644
index 0000000..011f232
--- /dev/null
+++ b/xfa/fde/fde_image.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_IMAGE_H_
+#define XFA_FDE_FDE_IMAGE_H_
+
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_stream.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+
+class IFDE_Image {
+ public:
+  virtual ~IFDE_Image() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL LoadImage() = 0;
+  virtual void FreeImage() = 0;
+  virtual int32_t CountFrames() const = 0;
+  virtual FX_BOOL LoadFrame(int32_t index) = 0;
+  virtual CFX_DIBitmap* GetFrameImage() = 0;
+  virtual int32_t GetImageFormat() const = 0;
+  virtual int32_t GetImageWidth() const = 0;
+  virtual int32_t GetImageHeight() const = 0;
+  virtual int32_t GetDelayTime(int32_t iFrameIndex) const = 0;
+  virtual int32_t GetLoopCount() const = 0;
+  virtual FX_BOOL StartLoadImage(CFX_DIBitmap* pDIBitmap,
+                                 int32_t dibX,
+                                 int32_t dibY,
+                                 int32_t dibCX,
+                                 int32_t dibCY,
+                                 int32_t imgX,
+                                 int32_t imgY,
+                                 int32_t imgCX,
+                                 int32_t imgCY,
+                                 int32_t iFrameIndex = 0) = 0;
+  virtual int32_t DoLoadImage(IFX_Pause* pPause = NULL) = 0;
+  virtual void StopLoadImage() = 0;
+};
+
+#endif  // XFA_FDE_FDE_IMAGE_H_
diff --git a/xfa/fde/fde_iterator.cpp b/xfa/fde/fde_iterator.cpp
new file mode 100644
index 0000000..50018b7
--- /dev/null
+++ b/xfa/fde/fde_iterator.cpp
@@ -0,0 +1,98 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_iterator.h"
+
+#include "xfa/fgas/crt/fgas_utils.h"
+
+IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create() {
+  return new CFDE_VisualSetIterator;
+}
+CFDE_VisualSetIterator::CFDE_VisualSetIterator() : m_dwFilter(0) {}
+CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {
+  m_CanvasStack.RemoveAll();
+}
+FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet* pCanvas) {
+  FXSYS_assert(pCanvas != NULL);
+  m_CanvasStack.RemoveAll();
+  FDE_CANVASITEM canvas;
+  canvas.hCanvas = NULL;
+  canvas.pCanvas = pCanvas;
+  canvas.hPos = pCanvas->GetFirstPosition(NULL);
+  if (canvas.hPos == NULL) {
+    return FALSE;
+  }
+  return m_CanvasStack.Push(canvas) == 0;
+}
+FX_BOOL CFDE_VisualSetIterator::FilterObjects(FX_DWORD dwObjects) {
+  if (m_CanvasStack.GetSize() == 0) {
+    return FALSE;
+  }
+  while (m_CanvasStack.GetSize() > 1) {
+    m_CanvasStack.Pop();
+  }
+  m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget;
+  if (dwObjects & FDE_VISUALOBJ_Widget) {
+    m_dwFilter |= 0xFF00;
+  }
+  FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
+  FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
+  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);
+  return pCanvas->hPos != NULL;
+}
+void CFDE_VisualSetIterator::Reset() {
+  FilterObjects(m_dwFilter);
+}
+FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet*& pVisualSet,
+                                               FDE_HVISUALOBJ* phCanvasObj,
+                                               IFDE_CanvasSet** ppCanvasSet) {
+  while (m_CanvasStack.GetSize() > 0) {
+    FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
+    FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
+    if (pCanvas->hPos == NULL) {
+      if (m_CanvasStack.GetSize() == 1) {
+        break;
+      }
+      m_CanvasStack.Pop();
+      continue;
+    }
+    do {
+      FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(
+          pCanvas->hCanvas, pCanvas->hPos, pVisualSet);
+      FXSYS_assert(hObj != NULL);
+      FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
+      if (eType == FDE_VISUALOBJ_Canvas) {
+        FDE_CANVASITEM canvas;
+        canvas.hCanvas = hObj;
+        canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;
+        canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj);
+        m_CanvasStack.Push(canvas);
+        break;
+      }
+      FX_DWORD dwObj =
+          (eType == FDE_VISUALOBJ_Widget)
+              ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj)
+              : (FX_DWORD)eType;
+      if ((m_dwFilter & dwObj) != 0) {
+        if (ppCanvasSet) {
+          *ppCanvasSet = pCanvas->pCanvas;
+        }
+        if (phCanvasObj) {
+          *phCanvasObj = pCanvas->hCanvas;
+        }
+        return hObj;
+      }
+    } while (pCanvas->hPos != NULL);
+  }
+  if (ppCanvasSet) {
+    *ppCanvasSet = NULL;
+  }
+  if (phCanvasObj) {
+    *phCanvasObj = NULL;
+  }
+  pVisualSet = NULL;
+  return NULL;
+}
diff --git a/xfa/fde/fde_iterator.h b/xfa/fde/fde_iterator.h
new file mode 100644
index 0000000..6be6c4c
--- /dev/null
+++ b/xfa/fde/fde_iterator.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_ITERATOR_H_
+#define XFA_FDE_FDE_ITERATOR_H_
+
+#include "xfa/fde/fde_visualset.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+struct FDE_CANVASITEM {
+  IFDE_CanvasSet* pCanvas;
+  FDE_HVISUALOBJ hCanvas;
+  FX_POSITION hPos;
+};
+
+class CFDE_VisualSetIterator : public IFDE_VisualSetIterator,
+                               public CFX_Target {
+ public:
+  CFDE_VisualSetIterator();
+  ~CFDE_VisualSetIterator();
+  virtual void Release() { delete this; }
+
+  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas);
+  virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF);
+
+  virtual void Reset();
+  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
+                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
+                                 IFDE_CanvasSet** ppCanvasSet = NULL);
+
+ protected:
+  FX_DWORD m_dwFilter;
+  CFX_StackTemplate<FDE_CANVASITEM> m_CanvasStack;
+};
+
+#endif  // XFA_FDE_FDE_ITERATOR_H_
diff --git a/xfa/fde/fde_object.cpp b/xfa/fde/fde_object.cpp
new file mode 100644
index 0000000..92b9f8a
--- /dev/null
+++ b/xfa/fde/fde_object.cpp
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_object.h"
+
+IFDE_Pen* IFDE_Pen::Create() {
+  return new CFDE_Pen();
+}
+IFDE_Brush* IFDE_Brush::Create(int32_t iType) {
+  switch (iType) {
+    case FDE_BRUSHTYPE_Solid:
+      return new CFDE_SolidBrush;
+    case FDE_BRUSHTYPE_Hatch:
+      return new CFDE_HatchBrush;
+    case FDE_BRUSHTYPE_Texture:
+      return new CFDE_TextureBrush;
+    case FDE_BRUSHTYPE_LinearGradient:
+      return new CFDE_LinearBrush;
+    default:
+      return NULL;
+  }
+}
diff --git a/xfa/fde/fde_object.h b/xfa/fde/fde_object.h
new file mode 100644
index 0000000..ae7b95a
--- /dev/null
+++ b/xfa/fde/fde_object.h
@@ -0,0 +1,246 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_OBJECT_H_
+#define XFA_FDE_FDE_OBJECT_H_
+
+#include <cstdint>
+
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fde/fde_brush.h"
+#include "xfa/fde/fde_pen.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class CFDE_Pen : public IFDE_Pen, public CFX_Target {
+ public:
+  CFDE_Pen()
+      : m_Color(0),
+        m_iLineCap(0),
+        m_iLineJoin(0),
+        m_iDashStyle(0),
+        m_fDashPhase(0),
+        m_fMiterLimit(10),
+        m_bAutoRelease(FALSE),
+        m_pBrush(NULL) {}
+
+  ~CFDE_Pen() {
+    if (m_pBrush && m_bAutoRelease) {
+      m_pBrush->Release();
+    }
+  }
+  virtual void Release() { delete this; }
+
+  virtual int32_t GetType() const {
+    return m_pBrush ? m_pBrush->GetType() : FDE_PENTYPE_SolidColor;
+  }
+
+  virtual FX_ARGB GetColor() const { return m_Color; }
+  virtual void SetColor(FX_ARGB color) { m_Color = color; }
+  virtual IFDE_Brush* GetBrush() const { return m_pBrush; }
+  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) {
+    m_bAutoRelease = bAutoRelease;
+    m_pBrush = pBrush;
+    if (m_pBrush && m_pBrush->GetType() == FDE_BRUSHTYPE_Solid) {
+      m_Color = ((IFDE_SolidBrush*)m_pBrush)->GetColor();
+    }
+  }
+  virtual int32_t GetLineCap() const { return m_iLineCap; }
+  virtual void SetLineCap(int32_t iLineCap) { m_iLineCap = iLineCap; }
+  virtual int32_t GetDashStyle() const { return m_iDashStyle; }
+  virtual void SetDashStyle(int32_t iDashStyle) { m_iDashStyle = iDashStyle; }
+  virtual FX_FLOAT GetDashPhase() const { return m_fDashPhase; }
+  virtual void SetDashPhase(FX_FLOAT fPhase) { m_fDashPhase = fPhase; }
+  virtual int32_t CountDashArray() const { return m_DashArray.GetSize(); }
+  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const {
+    dashArray.Copy(m_DashArray);
+    return dashArray.GetSize();
+  }
+  virtual void SetDashArray(const CFX_FloatArray& dashArray) {
+    m_DashArray.Copy(dashArray);
+  }
+  virtual int32_t GetLineJoin() const { return m_iLineJoin; }
+  virtual void SetLineJoin(int32_t iLineJoin) { m_iLineJoin = iLineJoin; }
+  virtual FX_FLOAT GetMiterLimit() const { return m_fMiterLimit; }
+  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) {
+    m_fMiterLimit = fMiterLimit;
+  }
+  virtual int32_t CountCompoundPatterns() const {
+    return m_CompoundPatterns.GetSize();
+  }
+  virtual FX_BOOL GetCompoundPatterns(
+      CFDE_CompoundPatterns& compoundPatterns) const {
+    return compoundPatterns.Copy(m_CompoundPatterns), TRUE;
+  }
+  virtual FX_BOOL SetCompoundPatterns(
+      const CFDE_CompoundPatterns& compoundPatterns) {
+    return m_CompoundPatterns.Copy(compoundPatterns), TRUE;
+  }
+
+  FX_ARGB m_Color;
+  int32_t m_iLineCap;
+  int32_t m_iLineJoin;
+  int32_t m_iDashStyle;
+  FX_FLOAT m_fDashPhase;
+  FX_FLOAT m_fMiterLimit;
+  FX_BOOL m_bAutoRelease;
+  IFDE_Brush* m_pBrush;
+  CFX_FloatArray m_DashArray;
+  CFDE_CompoundPatterns m_CompoundPatterns;
+};
+class CFDE_SolidBrush : public IFDE_SolidBrush, public CFX_Target {
+ public:
+  CFDE_SolidBrush() : m_Color(0xFF000000) { m_Matrix.SetIdentity(); }
+
+  virtual void Release() { delete this; }
+  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Solid; }
+  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
+  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
+  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
+    m_Matrix.Translate(dx, dy);
+  }
+  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
+  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
+  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
+    m_Matrix.Concat(matrix);
+  }
+  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
+  virtual FX_ARGB GetColor() const { return m_Color; }
+  virtual void SetColor(FX_ARGB color) { m_Color = color; }
+
+  FX_ARGB m_Color;
+  CFX_Matrix m_Matrix;
+};
+class CFDE_HatchBrush : public IFDE_HatchBrush, public CFX_Target {
+ public:
+  CFDE_HatchBrush() : m_iStyle(-1), m_BackColor(0), m_ForeColor(0) {
+    m_Matrix.SetIdentity();
+  }
+
+  virtual void Release() { delete this; }
+  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Hatch; }
+  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
+  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
+  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
+    m_Matrix.Translate(dx, dy);
+  }
+  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
+  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
+  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
+    m_Matrix.Concat(matrix);
+  }
+  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
+  virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const {
+    return bForegroundColor ? m_ForeColor : m_BackColor;
+  }
+  virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) {
+    if (bForegroundColor) {
+      m_ForeColor = color;
+    } else {
+      m_BackColor = color;
+    }
+  }
+
+  virtual int32_t GetHatchStyle() const { return m_iStyle; }
+  virtual FX_BOOL SetHatchStyle(int32_t iHatchStyle) {
+    m_iStyle = iHatchStyle;
+    return m_iStyle >= FDE_HATCHSTYLE_Min && m_iStyle <= FDE_HATCHSTYLE_Max;
+  }
+  int32_t m_iStyle;
+  FX_ARGB m_BackColor;
+  FX_ARGB m_ForeColor;
+  CFX_Matrix m_Matrix;
+};
+class CFDE_TextureBrush : public IFDE_TextureBrush, public CFX_Target {
+ public:
+  CFDE_TextureBrush() : m_iWrap(0), m_pImage(NULL), m_bAutoRelease(FALSE) {
+    m_Matrix.SetIdentity();
+  }
+
+  virtual void Release() { delete this; }
+  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Texture; }
+  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
+  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
+  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
+    m_Matrix.Translate(dx, dy);
+  }
+  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
+  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
+  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
+    m_Matrix.Concat(matrix);
+  }
+  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
+  virtual IFDE_Image* GetImage() const { return m_pImage; }
+  virtual void SetImage(IFDE_Image* pImage, FX_BOOL bAutoRelease) {
+    m_pImage = pImage;
+    m_bAutoRelease = bAutoRelease;
+  }
+  virtual int32_t GetWrapMode() const { return m_iWrap; }
+  virtual void SetWrapMode(int32_t iWrapMode) { m_iWrap = iWrapMode; }
+  int32_t m_iWrap;
+  IFDE_Image* m_pImage;
+  FX_BOOL m_bAutoRelease;
+  CFX_Matrix m_Matrix;
+};
+class CFDE_LinearBrush : public IFDE_LinearGradientBrush, public CFX_Target {
+ public:
+  CFDE_LinearBrush() : m_EndColor(0), m_StartColor(0), m_iWrapMode(0) {
+    m_StartPoint.x = m_StartPoint.y = m_EndPoint.x = m_EndPoint.y = 0;
+    m_Matrix.SetIdentity();
+  }
+
+  virtual void Release() { delete this; }
+  virtual int32_t GetType() const { return FDE_BRUSHTYPE_LinearGradient; }
+  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
+  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
+  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
+    m_Matrix.Translate(dx, dy);
+  }
+  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
+  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
+  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
+    m_Matrix.Concat(matrix);
+  }
+  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
+  virtual void GetLinearPoints(CFX_PointF& startingPoint,
+                               CFX_PointF& endingPoint) const {
+    startingPoint = m_StartPoint;
+    endingPoint = m_EndPoint;
+  }
+  virtual void SetLinearPoints(const CFX_PointF& startingPoint,
+                               const CFX_PointF& endingPoint) {
+    m_StartPoint = startingPoint;
+    m_EndPoint = endingPoint;
+  }
+  virtual void GetLinearColors(FX_ARGB& startingColor,
+                               FX_ARGB& endingColor) const {
+    startingColor = m_StartColor;
+    endingColor = m_EndColor;
+  }
+  virtual void SetLinearColors(const FX_ARGB& startingColor,
+                               const FX_ARGB& endingColor) {
+    m_StartColor = startingColor;
+    m_EndColor = endingColor;
+  }
+  virtual int32_t CountGradientColors() const { return m_GradColors.GetSize(); }
+  virtual FX_BOOL GetGradientColors(CFDE_GradientColors& colors) const {
+    return colors.Copy(m_GradColors), TRUE;
+  }
+  virtual FX_BOOL SetGradientColors(const CFDE_GradientColors& colors) {
+    return m_GradColors.Copy(colors), TRUE;
+  }
+
+  virtual int32_t GetWrapMode() const { return m_iWrapMode; }
+  virtual void SetWrapMode(int32_t iWrapMode) { m_iWrapMode = iWrapMode; }
+  CFX_PointF m_EndPoint;
+  CFX_PointF m_StartPoint;
+  FX_ARGB m_EndColor;
+  FX_ARGB m_StartColor;
+  CFDE_GradientColors m_GradColors;
+  int32_t m_iWrapMode;
+  CFX_Matrix m_Matrix;
+};
+
+#endif  // XFA_FDE_FDE_OBJECT_H_
diff --git a/xfa/fde/fde_path.h b/xfa/fde/fde_path.h
new file mode 100644
index 0000000..9ffba6c
--- /dev/null
+++ b/xfa/fde/fde_path.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_PATH_H_
+#define XFA_FDE_FDE_PATH_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class IFDE_Path {
+ public:
+  static IFDE_Path* Create();
+  virtual ~IFDE_Path() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL StartFigure() = 0;
+  virtual FX_BOOL CloseFigure() = 0;
+  virtual void AddBezier(const CFX_PointsF& points) = 0;
+  virtual void AddBeziers(const CFX_PointsF& points) = 0;
+  virtual void AddCurve(const CFX_PointsF& points,
+                        FX_BOOL bClosed,
+                        FX_FLOAT fTension = 0.5f) = 0;
+  virtual void AddEllipse(const CFX_RectF& rect) = 0;
+  virtual void AddLines(const CFX_PointsF& points) = 0;
+  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) = 0;
+  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) = 0;
+  virtual void AddPolygon(const CFX_PointsF& points) = 0;
+  virtual void AddRectangle(const CFX_RectF& rect) = 0;
+  virtual void GetBBox(CFX_RectF& bbox) const = 0;
+  virtual void GetBBox(CFX_RectF& bbox,
+                       FX_FLOAT fLineWidth,
+                       FX_FLOAT fMiterLimit) const = 0;
+};
+
+#endif  // XFA_FDE_FDE_PATH_H_
diff --git a/xfa/fde/fde_pen.h b/xfa/fde/fde_pen.h
new file mode 100644
index 0000000..4dfdd8a
--- /dev/null
+++ b/xfa/fde/fde_pen.h
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_PEN_H_
+#define XFA_FDE_FDE_PEN_H_
+
+class IFDE_Pen;
+
+#define FDE_PENTYPE_Unknown FDE_BRUSHTYPE_Unknown
+#define FDE_PENTYPE_SolidColor FDE_BRUSHTYPE_Solid
+#define FDE_PENTYPE_HatchBrush FDE_BRUSHTYPE_Hatch
+#define FDE_PENTYPE_TextureBrush FDE_BRUSHTYPE_Texture
+#define FDE_PENTYPE_LinearGradient FDE_BRUSHTYPE_LinearGradient
+#define FDE_PENTYPE_MAX FDE_BRUSHTYPE_MAX
+
+#define FDE_DASHSTYLE_Solid 0
+#define FDE_DASHSTYLE_Dash 1
+#define FDE_DASHSTYLE_Dot 2
+#define FDE_DASHSTYLE_DashDot 3
+#define FDE_DASHSTYLE_DashDotDot 4
+#define FDE_DASHSTYLE_Customized 5
+
+#define FDE_LINEJOIN_Miter 0
+#define FDE_LINEJOIN_Round 1
+#define FDE_LINEJOIN_Bevel 2
+
+#define FDE_LINECAP_Flat 0
+#define FDE_LINECAP_Round 1
+#define FDE_LINECAP_Square 2
+
+struct FDE_COMPOUNDPATTERN {
+  FX_FLOAT pos;
+  FX_FLOAT width;
+};
+typedef CFX_ArrayTemplate<FDE_COMPOUNDPATTERN> CFDE_CompoundPatterns;
+
+class IFDE_Pen {
+ public:
+  static IFDE_Pen* Create();
+  virtual ~IFDE_Pen() {}
+  virtual void Release() = 0;
+  virtual int32_t GetType() const = 0;
+  virtual FX_ARGB GetColor() const = 0;
+  virtual void SetColor(FX_ARGB color) = 0;
+  virtual IFDE_Brush* GetBrush() const = 0;
+  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) = 0;
+  virtual int32_t GetLineCap() const = 0;
+  virtual void SetLineCap(int32_t iLineCap) = 0;
+  virtual int32_t GetDashStyle() const = 0;
+  virtual void SetDashStyle(int32_t iDashStyle) = 0;
+  virtual FX_FLOAT GetDashPhase() const = 0;
+  virtual void SetDashPhase(FX_FLOAT fPhase) = 0;
+  virtual int32_t CountDashArray() const = 0;
+  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const = 0;
+  virtual void SetDashArray(const CFX_FloatArray& dashArray) = 0;
+  virtual int32_t GetLineJoin() const = 0;
+  virtual void SetLineJoin(int32_t iLineJoin) = 0;
+  virtual FX_FLOAT GetMiterLimit() const = 0;
+  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) = 0;
+  virtual int32_t CountCompoundPatterns() const = 0;
+  virtual FX_BOOL GetCompoundPatterns(
+      CFDE_CompoundPatterns& compoundPatterns) const = 0;
+  virtual FX_BOOL SetCompoundPatterns(
+      const CFDE_CompoundPatterns& compoundPatterns) = 0;
+};
+
+#endif  // XFA_FDE_FDE_PEN_H_
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
new file mode 100644
index 0000000..7d86a7b
--- /dev/null
+++ b/xfa/fde/fde_render.cpp
@@ -0,0 +1,290 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/fde_render.h"
+
+#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+#define FDE_PATHRENDER_Stroke 1
+#define FDE_PATHRENDER_Fill 2
+
+namespace {
+
+class CFDE_RenderContext : public IFDE_RenderContext, public CFX_Target {
+ public:
+  CFDE_RenderContext();
+  virtual ~CFDE_RenderContext();
+  virtual void Release() { delete this; }
+  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
+                              IFDE_CanvasSet* pCanvasSet,
+                              const CFX_Matrix& tmDoc2Device);
+  virtual FDE_RENDERSTATUS GetStatus() const { return m_eStatus; }
+  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL);
+  virtual void StopRender();
+  void RenderPath(IFDE_PathSet* pPathSet, FDE_HVISUALOBJ hPath);
+  void RenderText(IFDE_TextSet* pTextSet, FDE_HVISUALOBJ hText);
+  FX_BOOL ApplyClip(IFDE_VisualSet* pVisualSet,
+                    FDE_HVISUALOBJ hObj,
+                    FDE_HDEVICESTATE& hState);
+  void RestoreClip(FDE_HDEVICESTATE hState);
+
+ protected:
+  FDE_RENDERSTATUS m_eStatus;
+  IFDE_RenderDevice* m_pRenderDevice;
+  IFDE_SolidBrush* m_pSolidBrush;
+  CFX_Matrix m_Transform;
+  FXTEXT_CHARPOS* m_pCharPos;
+  int32_t m_iCharPosCount;
+  IFDE_VisualSetIterator* m_pIterator;
+};
+
+}  // namespace
+
+void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
+                       const CFX_RectF& docPageRect,
+                       const CFX_Rect& devicePageRect,
+                       int32_t iRotate,
+                       FX_DWORD dwCoordinatesType) {
+  FXSYS_assert(iRotate >= 0 && iRotate <= 3);
+  FX_BOOL bFlipX = (dwCoordinatesType & 0x01) != 0;
+  FX_BOOL bFlipY = (dwCoordinatesType & 0x02) != 0;
+  CFX_Matrix m;
+  m.Set((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0);
+  if (iRotate == 0 || iRotate == 2) {
+    m.a *= (FX_FLOAT)devicePageRect.width / docPageRect.width;
+    m.d *= (FX_FLOAT)devicePageRect.height / docPageRect.height;
+  } else {
+    m.a *= (FX_FLOAT)devicePageRect.height / docPageRect.width;
+    m.d *= (FX_FLOAT)devicePageRect.width / docPageRect.height;
+  }
+  m.Rotate(iRotate * 1.57079632675f);
+  switch (iRotate) {
+    case 0:
+      m.e = bFlipX ? (FX_FLOAT)devicePageRect.right()
+                   : (FX_FLOAT)devicePageRect.left;
+      m.f = bFlipY ? (FX_FLOAT)devicePageRect.bottom()
+                   : (FX_FLOAT)devicePageRect.top;
+      break;
+    case 1:
+      m.e = bFlipY ? (FX_FLOAT)devicePageRect.left
+                   : (FX_FLOAT)devicePageRect.right();
+      m.f = bFlipX ? (FX_FLOAT)devicePageRect.bottom()
+                   : (FX_FLOAT)devicePageRect.top;
+      break;
+    case 2:
+      m.e = bFlipX ? (FX_FLOAT)devicePageRect.left
+                   : (FX_FLOAT)devicePageRect.right();
+      m.f = bFlipY ? (FX_FLOAT)devicePageRect.top
+                   : (FX_FLOAT)devicePageRect.bottom();
+      break;
+    case 3:
+      m.e = bFlipY ? (FX_FLOAT)devicePageRect.right()
+                   : (FX_FLOAT)devicePageRect.left;
+      m.f = bFlipX ? (FX_FLOAT)devicePageRect.top
+                   : (FX_FLOAT)devicePageRect.bottom();
+      break;
+    default:
+      break;
+  }
+  pageMatrix = m;
+}
+IFDE_RenderContext* IFDE_RenderContext::Create() {
+  return new CFDE_RenderContext;
+}
+CFDE_RenderContext::CFDE_RenderContext()
+    : m_eStatus(FDE_RENDERSTATUS_Reset),
+      m_pRenderDevice(NULL),
+      m_pSolidBrush(NULL),
+      m_Transform(),
+      m_pCharPos(NULL),
+      m_iCharPosCount(0),
+      m_pIterator(NULL) {
+  m_Transform.SetIdentity();
+}
+CFDE_RenderContext::~CFDE_RenderContext() {
+  StopRender();
+}
+FX_BOOL CFDE_RenderContext::StartRender(IFDE_RenderDevice* pRenderDevice,
+                                        IFDE_CanvasSet* pCanvasSet,
+                                        const CFX_Matrix& tmDoc2Device) {
+  if (m_pRenderDevice != NULL) {
+    return FALSE;
+  }
+  if (pRenderDevice == NULL) {
+    return FALSE;
+  }
+  if (pCanvasSet == NULL) {
+    return FALSE;
+  }
+
+  m_eStatus = FDE_RENDERSTATUS_Paused;
+  m_pRenderDevice = pRenderDevice;
+  m_Transform = tmDoc2Device;
+  if (m_pIterator == NULL) {
+    m_pIterator = IFDE_VisualSetIterator::Create();
+    FXSYS_assert(m_pIterator != NULL);
+  }
+  return m_pIterator->AttachCanvas(pCanvasSet) && m_pIterator->FilterObjects();
+}
+FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) {
+  if (m_pRenderDevice == NULL) {
+    return FDE_RENDERSTATUS_Failed;
+  }
+  if (m_pIterator == NULL) {
+    return FDE_RENDERSTATUS_Failed;
+  }
+  FDE_RENDERSTATUS eStatus = FDE_RENDERSTATUS_Paused;
+  CFX_Matrix rm;
+  rm.SetReverse(m_Transform);
+  CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect();
+  if (rtDocClip.IsEmpty()) {
+    rtDocClip.left = rtDocClip.top = 0;
+    rtDocClip.width = (FX_FLOAT)m_pRenderDevice->GetWidth();
+    rtDocClip.height = (FX_FLOAT)m_pRenderDevice->GetHeight();
+  }
+  rm.TransformRect(rtDocClip);
+  IFDE_VisualSet* pVisualSet;
+  FDE_HVISUALOBJ hVisualObj;
+  CFX_RectF rtObj;
+  int32_t iCount = 0;
+  while (TRUE) {
+    hVisualObj = m_pIterator->GetNext(pVisualSet);
+    if (hVisualObj == NULL || pVisualSet == NULL) {
+      eStatus = FDE_RENDERSTATUS_Done;
+      break;
+    }
+    rtObj.Empty();
+    pVisualSet->GetRect(hVisualObj, rtObj);
+    if (!rtDocClip.IntersectWith(rtObj)) {
+      continue;
+    }
+    switch (pVisualSet->GetType()) {
+      case FDE_VISUALOBJ_Text:
+        RenderText((IFDE_TextSet*)pVisualSet, hVisualObj);
+        iCount += 5;
+        break;
+      case FDE_VISUALOBJ_Path:
+        RenderPath((IFDE_PathSet*)pVisualSet, hVisualObj);
+        iCount += 20;
+        break;
+      case FDE_VISUALOBJ_Widget:
+        iCount += 10;
+        break;
+      case FDE_VISUALOBJ_Canvas:
+        FXSYS_assert(FALSE);
+        break;
+      default:
+        break;
+    }
+    if (iCount >= 100 && pPause != NULL && pPause->NeedToPauseNow()) {
+      eStatus = FDE_RENDERSTATUS_Paused;
+      break;
+    }
+  }
+  return m_eStatus = eStatus;
+}
+void CFDE_RenderContext::StopRender() {
+  m_eStatus = FDE_RENDERSTATUS_Reset;
+  m_pRenderDevice = nullptr;
+  m_Transform.SetIdentity();
+  if (m_pIterator) {
+    m_pIterator->Release();
+    m_pIterator = nullptr;
+  }
+  if (m_pSolidBrush) {
+    m_pSolidBrush->Release();
+    m_pSolidBrush = nullptr;
+  }
+  FX_Free(m_pCharPos);
+  m_pCharPos = nullptr;
+  m_iCharPosCount = 0;
+}
+void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
+                                    FDE_HVISUALOBJ hText) {
+  FXSYS_assert(m_pRenderDevice != NULL);
+  FXSYS_assert(pTextSet != NULL && hText != NULL);
+  IFX_Font* pFont = pTextSet->GetFont(hText);
+  if (pFont == NULL) {
+    return;
+  }
+  int32_t iCount = pTextSet->GetDisplayPos(hText, NULL, FALSE);
+  if (iCount < 1) {
+    return;
+  }
+  if (m_pSolidBrush == NULL) {
+    m_pSolidBrush = (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
+    if (m_pSolidBrush == NULL) {
+      return;
+    }
+  }
+  if (m_pCharPos == NULL) {
+    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iCount);
+  } else if (m_iCharPosCount < iCount) {
+    m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iCount);
+  }
+  if (m_iCharPosCount < iCount) {
+    m_iCharPosCount = iCount;
+  }
+  iCount = pTextSet->GetDisplayPos(hText, m_pCharPos, FALSE);
+  FX_FLOAT fFontSize = pTextSet->GetFontSize(hText);
+  FX_ARGB dwColor = pTextSet->GetFontColor(hText);
+  m_pSolidBrush->SetColor(dwColor);
+  FDE_HDEVICESTATE hState;
+  FX_BOOL bClip = ApplyClip(pTextSet, hText, hState);
+  m_pRenderDevice->DrawString(m_pSolidBrush, pFont, m_pCharPos, iCount,
+                              fFontSize, &m_Transform);
+  if (bClip) {
+    RestoreClip(hState);
+  }
+}
+void CFDE_RenderContext::RenderPath(IFDE_PathSet* pPathSet,
+                                    FDE_HVISUALOBJ hPath) {
+  FXSYS_assert(m_pRenderDevice != NULL);
+  FXSYS_assert(pPathSet != NULL && hPath != NULL);
+  IFDE_Path* pPath = pPathSet->GetPath(hPath);
+  if (pPath == NULL) {
+    return;
+  }
+  FDE_HDEVICESTATE hState;
+  FX_BOOL bClip = ApplyClip(pPathSet, hPath, hState);
+  int32_t iRenderMode = pPathSet->GetRenderMode(hPath);
+  if (iRenderMode & FDE_PATHRENDER_Stroke) {
+    IFDE_Pen* pPen = pPathSet->GetPen(hPath);
+    FX_FLOAT fWidth = pPathSet->GetPenWidth(hPath);
+    if (pPen != NULL && fWidth > 0) {
+      m_pRenderDevice->DrawPath(pPen, fWidth, pPath, &m_Transform);
+    }
+  }
+  if (iRenderMode & FDE_PATHRENDER_Fill) {
+    IFDE_Brush* pBrush = pPathSet->GetBrush(hPath);
+    if (pBrush != NULL) {
+      m_pRenderDevice->FillPath(pBrush, pPath, &m_Transform);
+    }
+  }
+  if (bClip) {
+    RestoreClip(hState);
+  }
+}
+FX_BOOL CFDE_RenderContext::ApplyClip(IFDE_VisualSet* pVisualSet,
+                                      FDE_HVISUALOBJ hObj,
+                                      FDE_HDEVICESTATE& hState) {
+  CFX_RectF rtClip;
+  if (!pVisualSet->GetClip(hObj, rtClip)) {
+    return FALSE;
+  }
+  CFX_RectF rtObj;
+  pVisualSet->GetRect(hObj, rtObj);
+  rtClip.Offset(rtObj.left, rtObj.top);
+  m_Transform.TransformRect(rtClip);
+  const CFX_RectF& rtDevClip = m_pRenderDevice->GetClipRect();
+  rtClip.Intersect(rtDevClip);
+  hState = m_pRenderDevice->SaveState();
+  return m_pRenderDevice->SetClipRect(rtClip);
+}
+void CFDE_RenderContext::RestoreClip(FDE_HDEVICESTATE hState) {
+  m_pRenderDevice->RestoreState(hState);
+}
diff --git a/xfa/fde/fde_render.h b/xfa/fde/fde_render.h
new file mode 100644
index 0000000..2cf7e5c
--- /dev/null
+++ b/xfa/fde/fde_render.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_RENDER_H_
+#define XFA_FDE_FDE_RENDER_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "xfa/fde/fde_visualset.h"
+
+class IFDE_RenderDevice;
+
+void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
+                       const CFX_RectF& docPageRect,
+                       const CFX_Rect& devicePageRect,
+                       int32_t iRotate,
+                       FX_DWORD dwCoordinatesType = 0);
+enum FDE_RENDERSTATUS {
+  FDE_RENDERSTATUS_Reset = 0,
+  FDE_RENDERSTATUS_Paused,
+  FDE_RENDERSTATUS_Done,
+  FDE_RENDERSTATUS_Failed,
+};
+
+class IFDE_RenderContext {
+ public:
+  static IFDE_RenderContext* Create();
+  virtual ~IFDE_RenderContext() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
+                              IFDE_CanvasSet* pCanvasSet,
+                              const CFX_Matrix& tmDoc2Device) = 0;
+  virtual FDE_RENDERSTATUS GetStatus() const = 0;
+  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL) = 0;
+  virtual void StopRender() = 0;
+};
+
+#endif  // XFA_FDE_FDE_RENDER_H_
diff --git a/xfa/fde/fde_renderdevice.h b/xfa/fde/fde_renderdevice.h
new file mode 100644
index 0000000..a9e7190
--- /dev/null
+++ b/xfa/fde/fde_renderdevice.h
@@ -0,0 +1,110 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_RENDERDEVICE_H_
+#define XFA_FDE_FDE_RENDERDEVICE_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxge/fx_font.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fde/fde_path.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+class IFDE_Pen;
+class IFDE_Brush;
+class CFX_DIBitmap;
+class CFX_DIBSource;
+
+typedef struct FDE_HDEVICESTATE_ { void* pData; } * FDE_HDEVICESTATE;
+
+class IFDE_RenderDevice {
+ public:
+  static IFDE_RenderDevice* Create(CFX_DIBitmap* pBitmap,
+                                   FX_BOOL bRgbByteOrder = FALSE);
+  static IFDE_RenderDevice* Create(CFX_RenderDevice* pDevice);
+  virtual ~IFDE_RenderDevice() {}
+  virtual void Release() = 0;
+
+  virtual int32_t GetWidth() const = 0;
+  virtual int32_t GetHeight() const = 0;
+  virtual FDE_HDEVICESTATE SaveState() = 0;
+  virtual void RestoreState(FDE_HDEVICESTATE hState) = 0;
+  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip) = 0;
+  virtual IFDE_Path* GetClipPath() const = 0;
+  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip) = 0;
+  virtual const CFX_RectF& GetClipRect() = 0;
+
+  virtual FX_FLOAT GetDpiX() const = 0;
+  virtual FX_FLOAT GetDpiY() const = 0;
+
+  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
+                            const CFX_RectF* pSrcRect,
+                            const CFX_RectF& dstRect,
+                            const CFX_Matrix* pImgMatrix = NULL,
+                            const CFX_Matrix* pDevMatrix = NULL) = 0;
+  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
+                             IFX_Font* pFont,
+                             const FXTEXT_CHARPOS* pCharPos,
+                             int32_t iCount,
+                             FX_FLOAT fFontSize,
+                             const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
+                             FX_FLOAT fPenWidth,
+                             const CFX_PointF& pt1,
+                             const CFX_PointF& pt2,
+                             const CFX_PointF& pt3,
+                             const CFX_PointF& pt4,
+                             const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
+                            FX_FLOAT fPenWidth,
+                            const CFX_PointsF& points,
+                            FX_BOOL bClosed,
+                            FX_FLOAT fTension = 0.5f,
+                            const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
+                              FX_FLOAT fPenWidth,
+                              const CFX_RectF& rect,
+                              const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
+                            FX_FLOAT fPenWidth,
+                            const CFX_PointsF& points,
+                            const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
+                           FX_FLOAT fPenWidth,
+                           const CFX_PointF& pt1,
+                           const CFX_PointF& pt2,
+                           const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
+                           FX_FLOAT fPenWidth,
+                           const IFDE_Path* pPath,
+                           const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
+                              FX_FLOAT fPenWidth,
+                              const CFX_PointsF& points,
+                              const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
+                                FX_FLOAT fPenWidth,
+                                const CFX_RectF& rect,
+                                const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
+                                  const CFX_PointsF& points,
+                                  FX_FLOAT fTension = 0.5f,
+                                  const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
+                              const CFX_RectF& rect,
+                              const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
+                           const IFDE_Path* pPath,
+                           const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
+                              const CFX_PointsF& points,
+                              const CFX_Matrix* pMatrix = NULL) = 0;
+  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
+                                const CFX_RectF& rect,
+                                const CFX_Matrix* pMatrix = NULL) = 0;
+};
+
+#endif  // XFA_FDE_FDE_RENDERDEVICE_H_
diff --git a/xfa/fde/fde_visualset.h b/xfa/fde/fde_visualset.h
new file mode 100644
index 0000000..5da21fb
--- /dev/null
+++ b/xfa/fde/fde_visualset.h
@@ -0,0 +1,123 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_FDE_VISUALSET_H_
+#define XFA_FDE_FDE_VISUALSET_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fde/fde_brush.h"
+#include "xfa/fde/fde_image.h"
+#include "xfa/fde/fde_path.h"
+#include "xfa/fde/fde_pen.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+enum FDE_VISUALOBJTYPE {
+  FDE_VISUALOBJ_Canvas = 0x00,
+  FDE_VISUALOBJ_Text = 0x01,
+  FDE_VISUALOBJ_Image = 0x02,
+  FDE_VISUALOBJ_Path = 0x04,
+  FDE_VISUALOBJ_Widget = 0x08,
+};
+
+typedef struct FDE_HVISUALOBJ_ { void* pData; } const* FDE_HVISUALOBJ;
+
+class IFDE_VisualSet {
+ public:
+  virtual ~IFDE_VisualSet() {}
+  virtual FDE_VISUALOBJTYPE GetType() = 0;
+  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) = 0;
+  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix) = 0;
+  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) = 0;
+  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) = 0;
+};
+
+class IFDE_CanvasSet : public IFDE_VisualSet {
+ public:
+  virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas) = 0;
+  virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas,
+                                 FX_POSITION& pos,
+                                 IFDE_VisualSet*& pVisualSet) = 0;
+  virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas,
+                                         IFDE_VisualSet*& pVisualSet) = 0;
+};
+
+class IFDE_TextSet : public IFDE_VisualSet {
+ public:
+  virtual int32_t GetString(FDE_HVISUALOBJ hText, CFX_WideString& wsText) = 0;
+  virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText) = 0;
+  virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText) = 0;
+  virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText) = 0;
+  virtual int32_t GetDisplayPos(FDE_HVISUALOBJ hText,
+                                FXTEXT_CHARPOS* pCharPos,
+                                FX_BOOL bCharCode = FALSE,
+                                CFX_WideString* pWSForms = NULL) = 0;
+  virtual int32_t GetCharRects(FDE_HVISUALOBJ hText,
+                               CFX_RectFArray& rtArray) = 0;
+};
+
+struct FDE_IMAGEFILTERPARAMS : public CFX_Target {
+  int32_t iFilterType;
+};
+
+class IFDE_ImageSet : public IFDE_VisualSet {
+ public:
+  virtual IFDE_Image* GetImage(FDE_HVISUALOBJ hImage) = 0;
+  virtual FX_POSITION GetFirstFilterPosition(FDE_HVISUALOBJ hImage) = 0;
+  virtual const FDE_IMAGEFILTERPARAMS* GetNextFilter(FDE_HVISUALOBJ hImage,
+                                                     FX_POSITION& pos) = 0;
+};
+
+class IFDE_PathSet : public IFDE_VisualSet {
+ public:
+  virtual IFDE_Path* GetPath(FDE_HVISUALOBJ hPath) = 0;
+  virtual int32_t GetFillMode(FDE_HVISUALOBJ hPath) = 0;
+  virtual int32_t GetRenderMode(FDE_HVISUALOBJ hPath) = 0;
+  virtual IFDE_Pen* GetPen(FDE_HVISUALOBJ hPath) = 0;
+  virtual FX_FLOAT GetPenWidth(FDE_HVISUALOBJ hPath) = 0;
+  virtual IFDE_Brush* GetBrush(FDE_HVISUALOBJ hPath) = 0;
+};
+
+enum FDE_WIDGETOBJ {
+  FDE_WIDGETOBJ_Unknown = 0x0000,
+  FDE_WIDGETOBJ_Anchor = 0x0100,
+  FDE_WIDGETOBJ_NamedDest = 0x0200,
+  FDE_WIDGETOBJ_HyperLink = 0x0400,
+};
+
+class IFDE_WidgetSet : public IFDE_VisualSet {
+ public:
+  virtual FDE_WIDGETOBJ GetWidgetType(FDE_HVISUALOBJ hWidget) = 0;
+  virtual FX_FLOAT GetFloat(FDE_HVISUALOBJ hWidget,
+                            int32_t iParameter,
+                            FX_FLOAT fDefVal = 0.0f) = 0;
+  virtual int32_t GetInteger(FDE_HVISUALOBJ hWidget,
+                             int32_t iParameter,
+                             int32_t iDefVal = 0) = 0;
+  virtual FX_BOOL GetString(FDE_HVISUALOBJ hWidget,
+                            int32_t iParameter,
+                            CFX_WideString& wsValue) = 0;
+  virtual FX_BOOL GetRects(FDE_HVISUALOBJ hWidget,
+                           int32_t iParameter,
+                           CFX_RectFArray& rects) = 0;
+};
+
+class IFDE_VisualSetIterator {
+ public:
+  static IFDE_VisualSetIterator* Create();
+  virtual ~IFDE_VisualSetIterator() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas) = 0;
+  virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF) = 0;
+  virtual void Reset() = 0;
+  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
+                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
+                                 IFDE_CanvasSet** ppCanvasSet = NULL) = 0;
+};
+
+#endif  // XFA_FDE_FDE_VISUALSET_H_
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
new file mode 100644
index 0000000..2105cf0
--- /dev/null
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -0,0 +1,1120 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/tto/fde_textout.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fde/fde_brush.h"
+#include "xfa/fde/fde_pen.h"
+#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/layout/fgas_textbreak.h"
+
+namespace {
+
+struct FDE_TTOPIECE {
+ public:
+  int32_t iStartChar;
+  int32_t iChars;
+  FX_DWORD dwCharStyles;
+  CFX_RectF rtPiece;
+};
+typedef FDE_TTOPIECE* FDE_LPTTOPIECE;
+typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
+
+class CFDE_TTOLine : public CFX_Target {
+ public:
+  CFDE_TTOLine();
+  CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
+  ~CFDE_TTOLine();
+  int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
+  int32_t GetSize() const;
+  FDE_LPTTOPIECE GetPtrAt(int32_t index);
+  void RemoveLast(int32_t iCount);
+  void RemoveAll(FX_BOOL bLeaveMemory);
+  FX_BOOL m_bNewReload;
+  CFDE_TTOPieceArray m_pieces;
+
+ protected:
+  int32_t m_iPieceCount;
+};
+typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
+
+class CFDE_TextOut : public IFDE_TextOut, public CFX_Target {
+ public:
+  CFDE_TextOut();
+  ~CFDE_TextOut();
+  virtual void Release() { delete this; }
+  virtual void SetFont(IFX_Font* pFont);
+  virtual void SetFontSize(FX_FLOAT fFontSize);
+  virtual void SetTextColor(FX_ARGB color);
+  virtual void SetStyles(FX_DWORD dwStyles);
+  virtual void SetTabWidth(FX_FLOAT fTabWidth);
+  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis);
+  virtual void SetParagraphBreakChar(FX_WCHAR wch);
+  virtual void SetAlignment(int32_t iAlignment);
+  virtual void SetLineSpace(FX_FLOAT fLineSpace);
+  virtual void SetDIBitmap(CFX_DIBitmap* pDIB);
+  virtual void SetRenderDevice(CFX_RenderDevice* pDevice);
+  virtual void SetClipRect(const CFX_Rect& rtClip);
+  virtual void SetClipRect(const CFX_RectF& rtClip);
+  virtual void SetMatrix(const CFX_Matrix& matrix);
+  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_Size& size);
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_SizeF& size);
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_Rect& rect);
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_RectF& rect);
+
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        int32_t x,
+                        int32_t y);
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        FX_FLOAT x,
+                        FX_FLOAT y);
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        const CFX_Rect& rect);
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        const CFX_RectF& rect);
+
+  virtual void SetLogicClipRect(const CFX_RectF& rtClip);
+  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             CFX_SizeF& size);
+  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             CFX_RectF& rect);
+  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             FX_FLOAT x,
+                             FX_FLOAT y);
+  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             const CFX_RectF& rect);
+  virtual int32_t GetTotalLines();
+
+ protected:
+  void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
+  FX_BOOL RetrieveLineWidth(FX_DWORD dwBreakStatus,
+                            FX_FLOAT& fStartPos,
+                            FX_FLOAT& fWidth,
+                            FX_FLOAT& fHeight);
+  void SetLineWidth(CFX_RectF& rect);
+  void DrawText(const FX_WCHAR* pwsStr,
+                int32_t iLength,
+                const CFX_RectF& rect,
+                const CFX_RectF& rtClip);
+  void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
+  void LoadEllipsis();
+  void ExpandBuffer(int32_t iSize, int32_t iType);
+  void RetrieveEllPieces(int32_t*& pCharWidths);
+
+  void Reload(const CFX_RectF& rect);
+  void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
+  FX_BOOL RetriecePieces(FX_DWORD dwBreakStatus,
+                         int32_t& iStartChar,
+                         int32_t& iPieceWidths,
+                         FX_BOOL bReload,
+                         const CFX_RectF& rect);
+  void AppendPiece(const FDE_TTOPIECE& ttoPiece,
+                   FX_BOOL bNeedReload,
+                   FX_BOOL bEnd);
+  void ReplaceWidthEllipsis();
+  void DoAlignment(const CFX_RectF& rect);
+  void OnDraw(const CFX_RectF& rtClip);
+  int32_t GetDisplayPos(FDE_LPTTOPIECE pPiece);
+  int32_t GetCharRects(FDE_LPTTOPIECE pPiece);
+
+  void ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr);
+  void DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen);
+
+  IFX_TxtBreak* m_pTxtBreak;
+  IFX_Font* m_pFont;
+  FX_FLOAT m_fFontSize;
+  FX_FLOAT m_fLineSpace;
+  FX_FLOAT m_fLinePos;
+  FX_FLOAT m_fTolerance;
+  int32_t m_iAlignment;
+  int32_t m_iTxtBkAlignment;
+  int32_t* m_pCharWidths;
+  int32_t m_iChars;
+  int32_t* m_pEllCharWidths;
+  int32_t m_iEllChars;
+  FX_WCHAR m_wParagraphBkChar;
+  FX_ARGB m_TxtColor;
+  FX_DWORD m_dwStyles;
+  FX_DWORD m_dwTxtBkStyles;
+  CFX_WideString m_wsEllipsis;
+  FX_BOOL m_bElliChanged;
+  int32_t m_iEllipsisWidth;
+  CFX_WideString m_wsText;
+  CFX_RectF m_rtClip;
+  CFX_RectF m_rtLogicClip;
+  CFX_Matrix m_Matrix;
+  CFDE_TTOLineArray m_ttoLines;
+  int32_t m_iCurLine;
+  int32_t m_iCurPiece;
+  int32_t m_iTotalLines;
+  FXTEXT_CHARPOS* m_pCharPos;
+  int32_t m_iCharPosSize;
+  IFDE_RenderDevice* m_pRenderDevice;
+  CFX_Int32Array m_hotKeys;
+  CFX_RectFArray m_rectArray;
+};
+
+}  // namespace
+
+IFDE_TextOut* IFDE_TextOut::Create() {
+  return new CFDE_TextOut;
+}
+CFDE_TextOut::CFDE_TextOut()
+    : m_pFont(NULL),
+      m_fFontSize(12.0f),
+      m_fLineSpace(m_fFontSize),
+      m_fLinePos(0.0f),
+      m_fTolerance(0.0f),
+      m_iAlignment(0),
+      m_iTxtBkAlignment(0),
+      m_pCharWidths(NULL),
+      m_iChars(0),
+      m_pEllCharWidths(NULL),
+      m_iEllChars(0),
+      m_wParagraphBkChar(L'\n'),
+      m_TxtColor(0xFF000000),
+      m_dwStyles(0),
+      m_dwTxtBkStyles(0),
+      m_bElliChanged(FALSE),
+      m_iEllipsisWidth(0),
+      m_ttoLines(5),
+      m_iCurLine(0),
+      m_iCurPiece(0),
+      m_iTotalLines(0),
+      m_pCharPos(NULL),
+      m_iCharPosSize(0),
+      m_pRenderDevice(NULL) {
+  m_pTxtBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
+  FXSYS_assert(m_pTxtBreak != NULL);
+  m_Matrix.SetIdentity();
+  m_rtClip.Reset();
+  m_rtLogicClip.Reset();
+}
+CFDE_TextOut::~CFDE_TextOut() {
+  if (m_pTxtBreak) {
+    m_pTxtBreak->Release();
+  }
+  FX_Free(m_pCharWidths);
+  FX_Free(m_pEllCharWidths);
+  if (m_pRenderDevice) {
+    m_pRenderDevice->Release();
+  }
+  FX_Free(m_pCharPos);
+  m_ttoLines.RemoveAll();
+}
+void CFDE_TextOut::SetFont(IFX_Font* pFont) {
+  FXSYS_assert(pFont);
+  m_pFont = pFont;
+  m_pTxtBreak->SetFont(pFont);
+}
+void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) {
+  FXSYS_assert(fFontSize > 0);
+  m_fFontSize = fFontSize;
+  m_pTxtBreak->SetFontSize(fFontSize);
+}
+void CFDE_TextOut::SetTextColor(FX_ARGB color) {
+  m_TxtColor = color;
+}
+void CFDE_TextOut::SetStyles(FX_DWORD dwStyles) {
+  m_dwStyles = dwStyles;
+  m_dwTxtBkStyles = 0;
+  if (dwStyles & FDE_TTOSTYLE_SingleLine) {
+    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_SingleLine;
+  }
+  if (dwStyles & FDE_TTOSTYLE_ExpandTab) {
+    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ExpandTab;
+  }
+  if (dwStyles & FDE_TTOSTYLE_ArabicShapes) {
+    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicShapes;
+  }
+  if (dwStyles & FDE_TTOSTYLE_RTL) {
+    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
+  }
+  if (dwStyles & FDE_TTOSTYLE_ArabicContext) {
+    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicContext;
+  }
+  if (dwStyles & FDE_TTOSTYLE_VerticalLayout) {
+    m_dwTxtBkStyles |=
+        (FX_TXTLAYOUTSTYLE_VerticalChars | FX_TXTLAYOUTSTYLE_VerticalLayout);
+  }
+  m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
+}
+void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) {
+  FXSYS_assert(fTabWidth > 1.0f);
+  m_pTxtBreak->SetTabWidth(fTabWidth, FALSE);
+}
+void CFDE_TextOut::SetEllipsisString(const CFX_WideString& wsEllipsis) {
+  m_bElliChanged = TRUE;
+  m_wsEllipsis = wsEllipsis;
+}
+void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) {
+  m_wParagraphBkChar = wch;
+  m_pTxtBreak->SetParagraphBreakChar(wch);
+}
+void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
+  m_iAlignment = iAlignment;
+  switch (m_iAlignment) {
+    case FDE_TTOALIGNMENT_TopCenter:
+    case FDE_TTOALIGNMENT_Center:
+    case FDE_TTOALIGNMENT_BottomCenter:
+      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Center;
+      break;
+    case FDE_TTOALIGNMENT_TopRight:
+    case FDE_TTOALIGNMENT_CenterRight:
+    case FDE_TTOALIGNMENT_BottomRight:
+      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Right;
+      break;
+    default:
+      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Left;
+      break;
+  }
+  m_pTxtBreak->SetAlignment(m_iTxtBkAlignment);
+}
+void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
+  FXSYS_assert(fLineSpace > 1.0f);
+  m_fLineSpace = fLineSpace;
+}
+void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) {
+  FXSYS_assert(pDIB != NULL);
+  if (m_pRenderDevice != NULL) {
+    m_pRenderDevice->Release();
+  }
+  m_pRenderDevice = IFDE_RenderDevice::Create(pDIB);
+}
+void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) {
+  FXSYS_assert(pDevice != NULL);
+  if (m_pRenderDevice != NULL) {
+    m_pRenderDevice->Release();
+  }
+  m_pRenderDevice = IFDE_RenderDevice::Create(pDevice);
+}
+void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) {
+  m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
+               (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
+}
+void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) {
+  m_rtClip = rtClip;
+}
+void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) {
+  m_rtLogicClip = rtClip;
+}
+void CFDE_TextOut::SetMatrix(const CFX_Matrix& matrix) {
+  m_Matrix = matrix;
+}
+void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) {
+  m_fTolerance = fTolerance;
+  m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
+}
+int32_t CFDE_TextOut::GetTotalLines() {
+  return m_iTotalLines;
+}
+void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            CFX_Size& size) {
+  CFX_RectF rtText;
+  rtText.Set(0.0f, 0.0f, (FX_FLOAT)size.x, (FX_FLOAT)size.y);
+  CalcSize(pwsStr, iLength, rtText);
+  size.x = (int32_t)rtText.Width();
+  size.y = (int32_t)rtText.Height();
+}
+void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            CFX_SizeF& size) {
+  CFX_RectF rtText;
+  rtText.Set(0.0f, 0.0f, size.x, size.y);
+  CalcSize(pwsStr, iLength, rtText);
+  size.x = rtText.Width();
+  size.y = rtText.Height();
+}
+void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            CFX_Rect& rect) {
+  CFX_RectF rtText;
+  rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.Width(),
+             (FX_FLOAT)rect.Height());
+  CalcSize(pwsStr, iLength, rtText);
+  rect.Set((int32_t)rtText.left, (int32_t)rtText.top, (int32_t)rtText.Width(),
+           (int32_t)rtText.Height());
+}
+void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            CFX_RectF& rect) {
+  if (pwsStr == NULL || iLength < 1) {
+    rect.width = 0.0f;
+    rect.height = 0.0f;
+  } else {
+    CFX_Matrix rm;
+    rm.SetReverse(m_Matrix);
+    rm.TransformRect(rect);
+    CalcTextSize(pwsStr, iLength, rect);
+    m_Matrix.TransformRect(rect);
+  }
+}
+void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
+                                 int32_t iLength,
+                                 CFX_SizeF& size) {
+  CFX_RectF rtText;
+  rtText.Set(0.0f, 0.0f, size.x, size.y);
+  CalcLogicSize(pwsStr, iLength, rtText);
+  size.x = rtText.Width();
+  size.y = rtText.Height();
+}
+void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
+                                 int32_t iLength,
+                                 CFX_RectF& rect) {
+  if (pwsStr == NULL || iLength < 1) {
+    rect.width = 0.0f;
+    rect.height = 0.0f;
+  } else {
+    CalcTextSize(pwsStr, iLength, rect);
+  }
+}
+void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
+                                int32_t iLength,
+                                CFX_RectF& rect) {
+  FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f);
+  SetLineWidth(rect);
+  m_iTotalLines = 0;
+  const FX_WCHAR* pStr = pwsStr;
+  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  FX_FLOAT fWidth = 0.0f;
+  FX_FLOAT fHeight = 0.0f;
+  FX_FLOAT fStartPos = bVertical ? rect.bottom() : rect.right();
+  FX_DWORD dwBreakStatus = 0;
+  FX_WCHAR wPreChar = 0;
+  FX_WCHAR wch;
+  FX_WCHAR wBreak = 0;
+  while (iLength-- > 0) {
+    wch = *pStr++;
+    if (wBreak == 0 && (wch == L'\n' || wch == L'\r')) {
+      wBreak = wch;
+      m_pTxtBreak->SetParagraphBreakChar(wch);
+    }
+    if (bHotKey && wch == L'&' && wPreChar != L'&') {
+      wPreChar = wch;
+      continue;
+    }
+    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight);
+    }
+    wPreChar = 0;
+  }
+  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+    RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight);
+  }
+  m_pTxtBreak->Reset();
+  FX_FLOAT fInc = rect.Height() - fHeight;
+  if (bVertical) {
+    fInc = rect.Width() - fHeight;
+  }
+  if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft &&
+      m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) {
+    fInc /= 2.0f;
+  } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) {
+    fInc = 0.0f;
+  }
+  if (bVertical) {
+    rect.top += fStartPos;
+    rect.left += fInc;
+    rect.width = fHeight;
+    rect.height = std::min(fWidth, rect.Height());
+  } else {
+    rect.left += fStartPos;
+    rect.top += fInc;
+    rect.width = std::min(fWidth, rect.Width());
+    rect.height = fHeight;
+    if (m_dwStyles & FDE_TTOSTYLE_LastLineHeight) {
+      rect.height -= m_fLineSpace - m_fFontSize;
+    }
+  }
+}
+void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
+  if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) {
+    FX_FLOAT fLineWidth = 0.0f;
+    if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) {
+      if (rect.Height() < 1.0f) {
+        rect.height = m_fFontSize * 1000.0f;
+      }
+      fLineWidth = rect.Height();
+    } else {
+      if (rect.Width() < 1.0f) {
+        rect.width = m_fFontSize * 1000.0f;
+      }
+      fLineWidth = rect.Width();
+    }
+    m_pTxtBreak->SetLineWidth(fLineWidth);
+  }
+}
+FX_BOOL CFDE_TextOut::RetrieveLineWidth(FX_DWORD dwBreakStatus,
+                                        FX_FLOAT& fStartPos,
+                                        FX_FLOAT& fWidth,
+                                        FX_FLOAT& fHeight) {
+  if (dwBreakStatus <= FX_TXTBREAK_PieceBreak) {
+    return FALSE;
+  }
+  FX_FLOAT fLineStep =
+      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
+  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
+  FX_FLOAT fLineWidth = 0.0f;
+  int32_t iCount = m_pTxtBreak->CountBreakPieces();
+  for (int32_t i = 0; i < iCount; i++) {
+    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
+    fLineWidth += (FX_FLOAT)pPiece->m_iWidth / 20000.0f;
+    fStartPos = std::min(fStartPos, (FX_FLOAT)pPiece->m_iStartPos / 20000.0f);
+  }
+  m_pTxtBreak->ClearBreakPieces();
+  if (dwBreakStatus == FX_TXTBREAK_ParagraphBreak) {
+    m_pTxtBreak->Reset();
+  }
+  if (!bLineWrap && dwBreakStatus == FX_TXTBREAK_LineBreak) {
+    fWidth += fLineWidth;
+  } else {
+    fWidth = std::max(fWidth, fLineWidth);
+    fHeight += fLineStep;
+  }
+  m_iTotalLines++;
+  return TRUE;
+}
+void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            int32_t x,
+                            int32_t y) {
+  CFX_RectF rtText;
+  rtText.Set((FX_FLOAT)x, (FX_FLOAT)y, m_fFontSize * 1000.0f,
+             m_fFontSize * 1000.0f);
+  DrawText(pwsStr, iLength, rtText);
+}
+void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            FX_FLOAT x,
+                            FX_FLOAT y) {
+  CFX_RectF rtText;
+  rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
+  DrawText(pwsStr, iLength, rtText);
+}
+void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            const CFX_Rect& rect) {
+  CFX_RectF rtText;
+  rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.width,
+             (FX_FLOAT)rect.height);
+  DrawText(pwsStr, iLength, rtText);
+}
+void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            const CFX_RectF& rect) {
+  CFX_RectF rtText;
+  rtText.Set(rect.left, rect.top, rect.width, rect.height);
+  CFX_Matrix rm;
+  rm.SetReverse(m_Matrix);
+  rm.TransformRect(rtText);
+  DrawText(pwsStr, iLength, rtText, m_rtClip);
+}
+void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
+                                 int32_t iLength,
+                                 FX_FLOAT x,
+                                 FX_FLOAT y) {
+  CFX_RectF rtText;
+  rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
+  DrawLogicText(pwsStr, iLength, rtText);
+}
+void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
+                                 int32_t iLength,
+                                 const CFX_RectF& rect) {
+  CFX_RectF rtClip;
+  rtClip.Set(m_rtLogicClip.left, m_rtLogicClip.top, m_rtLogicClip.width,
+             m_rtLogicClip.height);
+  m_Matrix.TransformRect(rtClip);
+  DrawText(pwsStr, iLength, rect, rtClip);
+}
+void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            const CFX_RectF& rect,
+                            const CFX_RectF& rtClip) {
+  FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f);
+  if (pwsStr == NULL || iLength < 1) {
+    return;
+  }
+  if (rect.width < m_fFontSize || rect.height < m_fFontSize) {
+    return;
+  }
+  FX_FLOAT fLineWidth = rect.width;
+  if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) {
+    fLineWidth = rect.height;
+  }
+  m_pTxtBreak->SetLineWidth(fLineWidth);
+  m_ttoLines.RemoveAll(TRUE);
+  m_wsText.Empty();
+  LoadText(pwsStr, iLength, rect);
+  if (m_dwStyles & FDE_TTOSTYLE_Ellipsis) {
+    ReplaceWidthEllipsis();
+  }
+  Reload(rect);
+  DoAlignment(rect);
+  OnDraw(rtClip);
+}
+void CFDE_TextOut::ExpandBuffer(int32_t iSize, int32_t iType) {
+  switch (iType) {
+    case 0:
+      if (!m_pCharWidths) {
+        m_pCharWidths = FX_Alloc(int32_t, iSize);
+        m_iChars = iSize;
+      } else if (m_iChars < iSize) {
+        m_pCharWidths = FX_Realloc(int32_t, m_pCharWidths, iSize);
+        m_iChars = iSize;
+      }
+      FXSYS_memset(m_pCharWidths, 0, iSize * sizeof(int32_t));
+      break;
+    case 1:
+      if (!m_pEllCharWidths) {
+        m_pEllCharWidths = FX_Alloc(int32_t, iSize);
+        m_iEllChars = iSize;
+      } else if (m_iEllChars < iSize) {
+        m_pEllCharWidths = FX_Realloc(int32_t, m_pEllCharWidths, iSize);
+        m_iEllChars = iSize;
+      }
+      FXSYS_memset(m_pEllCharWidths, 0, iSize * sizeof(int32_t));
+      break;
+    case 2:
+      if (m_pCharPos == NULL) {
+        m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iSize);
+        m_iCharPosSize = iSize;
+      } else if (m_iCharPosSize < iSize) {
+        m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iSize);
+        m_iCharPosSize = iSize;
+      }
+      break;
+  }
+}
+void CFDE_TextOut::LoadEllipsis() {
+  if (!m_bElliChanged) {
+    return;
+  }
+  m_bElliChanged = FALSE;
+  m_iEllipsisWidth = 0;
+  int32_t iLength = m_wsEllipsis.GetLength();
+  if (iLength < 1) {
+    return;
+  }
+  ExpandBuffer(iLength, 1);
+  const FX_WCHAR* pStr = (const FX_WCHAR*)m_wsEllipsis;
+  int32_t* pCharWidths = m_pEllCharWidths;
+  FX_DWORD dwBreakStatus;
+  FX_WCHAR wch;
+  while (iLength-- > 0) {
+    wch = *pStr++;
+    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      RetrieveEllPieces(pCharWidths);
+    }
+  }
+  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+    RetrieveEllPieces(pCharWidths);
+  }
+  m_pTxtBreak->Reset();
+}
+void CFDE_TextOut::RetrieveEllPieces(int32_t*& pCharWidths) {
+  int32_t iCount = m_pTxtBreak->CountBreakPieces();
+  CFX_Char* pTC;
+  for (int32_t i = 0; i < iCount; i++) {
+    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
+    int32_t iPieceChars = pPiece->GetLength();
+    for (int32_t j = 0; j < iPieceChars; j++) {
+      pTC = pPiece->GetCharPtr(j);
+      if (pTC->m_iCharWidth <= 0) {
+        *pCharWidths = 0;
+      } else {
+        *pCharWidths = pTC->m_iCharWidth;
+      }
+      m_iEllipsisWidth += *pCharWidths;
+      pCharWidths++;
+    }
+  }
+  m_pTxtBreak->ClearBreakPieces();
+}
+void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
+                            int32_t iLength,
+                            const CFX_RectF& rect) {
+  FX_WCHAR* pStr = m_wsText.GetBuffer(iLength);
+  int32_t iTxtLength = iLength;
+  ExpandBuffer(iTxtLength, 0);
+  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
+  FX_FLOAT fLineStep =
+      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
+  FX_FLOAT fLineStop = bVertical ? rect.left : rect.bottom();
+  m_fLinePos = bVertical ? rect.right() : rect.top;
+  if (bVertical) {
+    fLineStep = -fLineStep;
+  }
+  m_hotKeys.RemoveAll();
+  int32_t iStartChar = 0;
+  int32_t iChars = 0;
+  int32_t iPieceWidths = 0;
+  FX_DWORD dwBreakStatus;
+  FX_WCHAR wch;
+  FX_BOOL bRet = FALSE;
+  while (iTxtLength-- > 0) {
+    wch = *pwsStr++;
+    if (wch == L'&' && bHotKey && (pStr - 1) != NULL && *(pStr - 1) != L'&') {
+      if (iTxtLength > 0) {
+        m_hotKeys.Add(iChars);
+      }
+      continue;
+    }
+    *pStr++ = wch;
+    iChars++;
+    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      FX_BOOL bEndofLine =
+          RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect);
+      if (bEndofLine && (bLineWrap || (dwBreakStatus > FX_TXTBREAK_LineBreak &&
+                                       !bLineWrap))) {
+        iPieceWidths = 0;
+        m_iCurLine++;
+        m_fLinePos += fLineStep;
+      }
+      if ((bVertical && m_fLinePos + fLineStep < fLineStop) ||
+          (!bVertical && m_fLinePos + fLineStep > fLineStop)) {
+        int32_t iCurLine = m_iCurLine;
+        if (bEndofLine) {
+          iCurLine--;
+        }
+        CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iCurLine);
+        pLine->m_bNewReload = TRUE;
+        bRet = TRUE;
+        break;
+      }
+    }
+  }
+  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak && !bRet) {
+    RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect);
+  }
+  m_pTxtBreak->ClearBreakPieces();
+  m_pTxtBreak->Reset();
+  m_wsText.ReleaseBuffer(iLength);
+}
+FX_BOOL CFDE_TextOut::RetriecePieces(FX_DWORD dwBreakStatus,
+                                     int32_t& iStartChar,
+                                     int32_t& iPieceWidths,
+                                     FX_BOOL bReload,
+                                     const CFX_RectF& rect) {
+  FX_BOOL bSingleLine = !!(m_dwStyles & FDE_TTOSTYLE_SingleLine);
+  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  FX_FLOAT fLineStep =
+      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
+  if (bVertical) {
+    fLineStep = -fLineStep;
+  }
+  CFX_Char* pTC = NULL;
+  FX_BOOL bNeedReload = FALSE;
+  FX_FLOAT fLineWidth = bVertical ? rect.Height() : rect.Width();
+  int32_t iLineWidth = FXSYS_round(fLineWidth * 20000.0f);
+  int32_t iCount = m_pTxtBreak->CountBreakPieces();
+  for (int32_t i = 0; i < iCount; i++) {
+    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
+    int32_t iPieceChars = pPiece->GetLength();
+    int32_t iChar = iStartChar;
+    int32_t iWidth = 0;
+    int32_t j = 0;
+    for (; j < iPieceChars; j++) {
+      pTC = pPiece->GetCharPtr(j);
+      int32_t iCurCharWidth = pTC->m_iCharWidth > 0 ? pTC->m_iCharWidth : 0;
+      if (bSingleLine || !bLineWrap) {
+        if (iLineWidth - iPieceWidths - iWidth < iCurCharWidth) {
+          bNeedReload = TRUE;
+          break;
+        }
+      }
+      iWidth += iCurCharWidth;
+      m_pCharWidths[iChar++] = iCurCharWidth;
+    }
+    if (j == 0 && !bReload) {
+      CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
+      pLine->m_bNewReload = TRUE;
+    } else if (j > 0) {
+      CFX_RectF rtPiece;
+      if (bVertical) {
+        rtPiece.left = m_fLinePos;
+        rtPiece.top = rect.top + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+        rtPiece.width = fLineStep;
+        rtPiece.height = iWidth / 20000.0f;
+      } else {
+        rtPiece.left = rect.left + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+        rtPiece.top = m_fLinePos;
+        rtPiece.width = iWidth / 20000.0f;
+        rtPiece.height = fLineStep;
+      }
+      FDE_TTOPIECE ttoPiece;
+      ttoPiece.iStartChar = iStartChar;
+      ttoPiece.iChars = j;
+      ttoPiece.rtPiece = rtPiece;
+      ttoPiece.dwCharStyles = pPiece->m_dwCharStyles;
+      if (FX_IsOdd(pPiece->m_iBidiLevel)) {
+        ttoPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
+      }
+      AppendPiece(ttoPiece, bNeedReload, (bReload && i == iCount - 1));
+    }
+    iStartChar += iPieceChars;
+    iPieceWidths += iWidth;
+  }
+  m_pTxtBreak->ClearBreakPieces();
+  FX_BOOL bRet = bSingleLine || bLineWrap || (!bLineWrap && bNeedReload) ||
+                 dwBreakStatus == FX_TXTBREAK_ParagraphBreak;
+  return bRet;
+}
+void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
+                               FX_BOOL bNeedReload,
+                               FX_BOOL bEnd) {
+  if (m_iCurLine >= m_ttoLines.GetSize()) {
+    CFDE_TTOLine ttoLine;
+    ttoLine.m_bNewReload = bNeedReload;
+    m_iCurPiece = ttoLine.AddPiece(m_iCurPiece, ttoPiece);
+    m_iCurLine = m_ttoLines.Add(ttoLine);
+  } else {
+    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
+    pLine->m_bNewReload = bNeedReload;
+    m_iCurPiece = pLine->AddPiece(m_iCurPiece, ttoPiece);
+    if (bEnd) {
+      int32_t iPieces = pLine->GetSize();
+      if (m_iCurPiece < iPieces) {
+        pLine->RemoveLast(iPieces - m_iCurPiece - 1);
+      }
+    }
+  }
+  if (!bEnd && bNeedReload) {
+    m_iCurPiece = 0;
+  }
+}
+void CFDE_TextOut::ReplaceWidthEllipsis() {
+  LoadEllipsis();
+  int32_t iLength = m_wsEllipsis.GetLength();
+  if (iLength < 1) {
+    return;
+  }
+  int32_t iLines = m_ttoLines.GetSize();
+  for (int32_t i = 0; i < iLines; i++) {
+    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
+    if (!pLine->m_bNewReload) {
+      continue;
+    }
+    int32_t iEllipsisCharIndex = iLength - 1;
+    int32_t iCharWidth = 0;
+    int32_t iCharCount = 0;
+    int32_t iPiece = pLine->GetSize();
+    while (iPiece-- > 0) {
+      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece);
+      if (pPiece == NULL) {
+        break;
+      }
+      for (int32_t j = pPiece->iChars - 1; j >= 0; j--) {
+        if (iEllipsisCharIndex < 0) {
+          break;
+        }
+        int32_t index = pPiece->iStartChar + j;
+        iCharWidth += m_pCharWidths[index];
+        iCharCount++;
+        if (iCharCount <= iLength) {
+          m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex));
+          m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex];
+        } else if (iCharWidth <= m_iEllipsisWidth) {
+          m_wsText.SetAt(index, 0);
+          m_pCharWidths[index] = 0;
+        }
+        iEllipsisCharIndex--;
+      }
+      if (iEllipsisCharIndex < 0) {
+        break;
+      }
+    }
+  }
+}
+void CFDE_TextOut::Reload(const CFX_RectF& rect) {
+  int32_t iCount = m_ttoLines.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
+    if (pLine == NULL || !pLine->m_bNewReload) {
+      continue;
+    }
+    m_iCurLine = i;
+    m_iCurPiece = 0;
+    ReloadLinePiece(pLine, rect);
+  }
+}
+void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) {
+  const FX_WCHAR* pwsStr = (const FX_WCHAR*)m_wsText;
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  int32_t iPieceWidths = 0;
+  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
+  int32_t iStartChar = pPiece->iStartChar;
+  m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top;
+  int32_t iPieceCount = pLine->GetSize();
+  int32_t iPieceIndex = 0;
+  FX_DWORD dwBreakStatus = 0;
+  FX_WCHAR wch;
+  while (iPieceIndex < iPieceCount) {
+    int32_t iStar = iStartChar;
+    int32_t iEnd = pPiece->iChars + iStar;
+    while (iStar < iEnd) {
+      wch = *(pwsStr + iStar);
+      dwBreakStatus = m_pTxtBreak->AppendChar(wch);
+      if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+        RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect);
+      }
+      iStar++;
+    }
+    iPieceIndex++;
+    pPiece = pLine->GetPtrAt(iPieceIndex);
+  }
+  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+    RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect);
+  }
+  m_pTxtBreak->Reset();
+}
+void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom();
+  int32_t iLines = m_ttoLines.GetSize();
+  if (iLines < 1) {
+    return;
+  }
+  CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1);
+  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
+  if (pPiece == NULL) {
+    return;
+  }
+  FX_FLOAT fLineStopD =
+      bVertical ? pPiece->rtPiece.right() : pPiece->rtPiece.bottom();
+  FX_FLOAT fInc = fLineStopS - fLineStopD;
+  if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft &&
+      m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) {
+    fInc /= 2.0f;
+  } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) {
+    fInc = 0.0f;
+  }
+  if (fInc < 1.0f) {
+    return;
+  }
+  for (int32_t i = 0; i < iLines; i++) {
+    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
+    int32_t iPieces = pLine->GetSize();
+    for (int32_t j = 0; j < iPieces; j++) {
+      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
+      if (bVertical) {
+        pPiece->rtPiece.left += fInc;
+      } else {
+        pPiece->rtPiece.top += fInc;
+      }
+    }
+  }
+}
+void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
+  if (m_pRenderDevice == NULL) {
+    return;
+  }
+  int32_t iLines = m_ttoLines.GetSize();
+  if (iLines < 1) {
+    return;
+  }
+  IFDE_SolidBrush* pBrush =
+      (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
+  pBrush->SetColor(m_TxtColor);
+  IFDE_Pen* pPen = NULL;
+  FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState();
+  if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) {
+    m_pRenderDevice->SetClipRect(rtClip);
+  }
+  for (int32_t i = 0; i < iLines; i++) {
+    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
+    int32_t iPieces = pLine->GetSize();
+    for (int32_t j = 0; j < iPieces; j++) {
+      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
+      if (pPiece == NULL) {
+        continue;
+      }
+      int32_t iCount = GetDisplayPos(pPiece);
+      if (iCount > 0) {
+        m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount,
+                                    m_fFontSize, &m_Matrix);
+      }
+      DrawLine(pPiece, pPen);
+    }
+  }
+  m_pRenderDevice->RestoreState(hDev);
+  if (pBrush) {
+    pBrush->Release();
+  }
+  if (pPen) {
+    pPen->Release();
+  }
+}
+int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) {
+  FX_TXTRUN tr;
+  ToTextRun(pPiece, tr);
+  ExpandBuffer(tr.iLength, 2);
+  return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
+}
+int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) {
+  FX_TXTRUN tr;
+  ToTextRun(pPiece, tr);
+  m_rectArray.RemoveAll();
+  return m_pTxtBreak->GetCharRects(&tr, m_rectArray);
+}
+void CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr) {
+  tr.pAccess = NULL;
+  tr.pIdentity = NULL;
+  tr.pStr = (const FX_WCHAR*)m_wsText + pPiece->iStartChar;
+  tr.pWidths = m_pCharWidths + pPiece->iStartChar;
+  tr.iLength = pPiece->iChars;
+  tr.pFont = m_pFont;
+  tr.fFontSize = m_fFontSize;
+  tr.dwStyles = m_dwTxtBkStyles;
+  tr.iCharRotation = 0;
+  tr.dwCharStyles = pPiece->dwCharStyles;
+  tr.wLineBreakChar = m_wParagraphBkChar;
+  tr.pRect = &pPiece->rtPiece;
+}
+void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen) {
+  FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline);
+  FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout);
+  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
+  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
+  if (!bUnderLine && !bStrikeOut && !bHotKey) {
+    return;
+  }
+  if (pPen == NULL) {
+    pPen = IFDE_Pen::Create();
+    pPen->SetColor(m_TxtColor);
+  }
+  IFDE_Path* pPath = IFDE_Path::Create();
+  int32_t iLineCount = 0;
+  CFX_RectF rtText = pPiece->rtPiece;
+  CFX_PointF pt1, pt2;
+  if (bUnderLine) {
+    if (bVertical) {
+      pt1.x = rtText.left;
+      pt1.y = rtText.top;
+      pt2.x = rtText.left;
+      pt2.y = rtText.bottom();
+    } else {
+      pt1.x = rtText.left;
+      pt1.y = rtText.bottom();
+      pt2.x = rtText.right();
+      pt2.y = rtText.bottom();
+    }
+    pPath->AddLine(pt1, pt2);
+    iLineCount++;
+  }
+  if (bStrikeOut) {
+    if (bVertical) {
+      pt1.x = rtText.left + rtText.width * 2.0f / 5.0f;
+      pt1.y = rtText.top;
+      pt2.x = pt1.x;
+      pt2.y = rtText.bottom();
+    } else {
+      pt1.x = rtText.left;
+      pt1.y = rtText.bottom() - rtText.height * 2.0f / 5.0f;
+      pt2.x = rtText.right();
+      pt2.y = pt1.y;
+    }
+    pPath->AddLine(pt1, pt2);
+    iLineCount++;
+  }
+  if (bHotKey) {
+    int32_t iHotKeys = m_hotKeys.GetSize();
+    int32_t iCount = GetCharRects(pPiece);
+    if (iCount > 0) {
+      for (int32_t i = 0; i < iHotKeys; i++) {
+        int32_t iCharIndex = m_hotKeys.GetAt(i);
+        if (iCharIndex >= pPiece->iStartChar &&
+            iCharIndex < pPiece->iStartChar + pPiece->iChars) {
+          CFX_RectF rect = m_rectArray.GetAt(iCharIndex - pPiece->iStartChar);
+          if (bVertical) {
+            pt1.x = rect.left;
+            pt1.y = rect.top;
+            pt2.x = rect.left;
+            pt2.y = rect.bottom();
+          } else {
+            pt1.x = rect.left;
+            pt1.y = rect.bottom();
+            pt2.x = rect.right();
+            pt2.y = rect.bottom();
+          }
+          pPath->AddLine(pt1, pt2);
+          iLineCount++;
+        }
+      }
+    }
+  }
+  if (iLineCount > 0) {
+    m_pRenderDevice->DrawPath(pPen, 1, pPath, &m_Matrix);
+  }
+  pPath->Release();
+}
+CFDE_TTOLine::CFDE_TTOLine()
+    : m_bNewReload(FALSE), m_pieces(5), m_iPieceCount(0) {}
+CFDE_TTOLine::CFDE_TTOLine(const CFDE_TTOLine& ttoLine) : m_pieces(5) {
+  m_bNewReload = ttoLine.m_bNewReload;
+  m_iPieceCount = ttoLine.m_iPieceCount;
+  m_pieces.Copy(ttoLine.m_pieces);
+}
+CFDE_TTOLine::~CFDE_TTOLine() {}
+int32_t CFDE_TTOLine::AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece) {
+  if (index >= m_iPieceCount) {
+    index = m_pieces.Add(ttoPiece) + 1;
+    m_iPieceCount++;
+  } else {
+    FDE_TTOPIECE& piece = m_pieces.GetAt(index);
+    piece = ttoPiece;
+  }
+  return index;
+}
+int32_t CFDE_TTOLine::GetSize() const {
+  return m_iPieceCount;
+}
+FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) {
+  if (index >= m_iPieceCount) {
+    return NULL;
+  }
+  return m_pieces.GetPtrAt(index);
+}
+void CFDE_TTOLine::RemoveLast(int32_t iCount) {
+  m_pieces.RemoveLast(iCount);
+}
+void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) {
+  m_pieces.RemoveAll(bLeaveMemory);
+}
diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h
new file mode 100644
index 0000000..c94571b
--- /dev/null
+++ b/xfa/fde/tto/fde_textout.h
@@ -0,0 +1,102 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_TTO_FDE_TEXTOUT_H_
+#define XFA_FDE_TTO_FDE_TEXTOUT_H_
+
+#include "core/include/fxge/fx_dib.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+#define FDE_TTOSTYLE_Underline 0x0001
+#define FDE_TTOSTYLE_Strikeout 0x0002
+#define FDE_TTOSTYLE_VerticalLayout 0x0004
+#define FDE_TTOSTYLE_SingleLine 0x0010
+#define FDE_TTOSTYLE_ExpandTab 0x0020
+#define FDE_TTOSTYLE_HotKey 0x0040
+#define FDE_TTOSTYLE_Ellipsis 0x0080
+#define FDE_TTOSTYLE_LineWrap 0x0100
+#define FDE_TTOSTYLE_ArabicShapes 0x0200
+#define FDE_TTOSTYLE_RTL 0x0400
+#define FDE_TTOSTYLE_ArabicContext 0x0800
+#define FDE_TTOSTYLE_LastLineHeight 0x1000
+#define FDE_TTOALIGNMENT_TopLeft 0
+#define FDE_TTOALIGNMENT_TopCenter 1
+#define FDE_TTOALIGNMENT_TopRight 2
+#define FDE_TTOALIGNMENT_TopAuto 3
+#define FDE_TTOALIGNMENT_CenterLeft 4
+#define FDE_TTOALIGNMENT_Center 5
+#define FDE_TTOALIGNMENT_CenterRight 6
+#define FDE_TTOALIGNMENT_CenterAuto 7
+#define FDE_TTOALIGNMENT_BottomLeft 8
+#define FDE_TTOALIGNMENT_BottomCenter 9
+#define FDE_TTOALIGNMENT_BottomRight 10
+#define FDE_TTOALIGNMENT_BottomAuto 11
+
+class IFDE_TextOut {
+ public:
+  static IFDE_TextOut* Create();
+  virtual ~IFDE_TextOut() {}
+  virtual void Release() = 0;
+  virtual void SetFont(IFX_Font* pFont) = 0;
+  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+  virtual void SetTextColor(FX_ARGB color) = 0;
+  virtual void SetStyles(FX_DWORD dwStyles) = 0;
+  virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0;
+  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis) = 0;
+  virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
+  virtual void SetAlignment(int32_t iAlignment) = 0;
+  virtual void SetLineSpace(FX_FLOAT fLineSpace) = 0;
+  virtual void SetDIBitmap(CFX_DIBitmap* pDIB) = 0;
+  virtual void SetRenderDevice(CFX_RenderDevice* pDevice) = 0;
+  virtual void SetClipRect(const CFX_Rect& rtClip) = 0;
+  virtual void SetClipRect(const CFX_RectF& rtClip) = 0;
+  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
+  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_Size& size) = 0;
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_SizeF& size) = 0;
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_Rect& rect) = 0;
+  virtual void CalcSize(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        CFX_RectF& rect) = 0;
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        int32_t x,
+                        int32_t y) = 0;
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        FX_FLOAT x,
+                        FX_FLOAT y) = 0;
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        const CFX_Rect& rect) = 0;
+  virtual void DrawText(const FX_WCHAR* pwsStr,
+                        int32_t iLength,
+                        const CFX_RectF& rect) = 0;
+  virtual void SetLogicClipRect(const CFX_RectF& rtClip) = 0;
+  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             CFX_SizeF& size) = 0;
+  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             CFX_RectF& rect) = 0;
+  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             FX_FLOAT x,
+                             FX_FLOAT y) = 0;
+  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
+                             int32_t iLength,
+                             const CFX_RectF& rect) = 0;
+  virtual int32_t GetTotalLines() = 0;
+};
+
+#endif  // XFA_FDE_TTO_FDE_TEXTOUT_H_
diff --git a/xfa/fde/xml/fde_xml.h b/xfa/fde/xml/fde_xml.h
new file mode 100644
index 0000000..757ebf9
--- /dev/null
+++ b/xfa/fde/xml/fde_xml.h
@@ -0,0 +1,226 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_XML_FDE_XML_H_
+#define XFA_FDE_XML_FDE_XML_H_
+
+#include "xfa/fgas/crt/fgas_stream.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+
+class IFDE_XMLNode;
+class IFDE_XMLInstruction;
+class IFDE_XMLDeclaration;
+class IFDE_XMLElement;
+class IFDE_XMLText;
+class IFDE_XMLDoc;
+class IFDE_XMLParser;
+class IFDE_XMLSyntaxParser;
+
+enum FDE_XMLNODETYPE {
+  FDE_XMLNODE_Unknown = 0,
+  FDE_XMLNODE_Instruction,
+  FDE_XMLNODE_Element,
+  FDE_XMLNODE_Text,
+  FDE_XMLNODE_CharData,
+};
+
+struct FDE_XMLNODE {
+  int32_t iNodeNum;
+  FDE_XMLNODETYPE eNodeType;
+};
+typedef CFX_StackTemplate<FDE_XMLNODE> CFDE_XMLNodeStack;
+
+FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch);
+FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch);
+FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar);
+
+class IFDE_XMLNode {
+ public:
+  virtual ~IFDE_XMLNode() {}
+  virtual void Release() = 0;
+  virtual FDE_XMLNODETYPE GetType() const = 0;
+  virtual int32_t CountChildNodes() const = 0;
+  virtual IFDE_XMLNode* GetChildNode(int32_t index) const = 0;
+  virtual int32_t GetChildNodeIndex(IFDE_XMLNode* pNode) const = 0;
+  virtual IFDE_XMLNode* GetPath(const FX_WCHAR* pPath,
+                                int32_t iLength = -1,
+                                FX_BOOL bQualifiedName = TRUE) const = 0;
+  virtual int32_t InsertChildNode(IFDE_XMLNode* pNode, int32_t index = -1) = 0;
+  virtual void RemoveChildNode(IFDE_XMLNode* pNode) = 0;
+  virtual void DeleteChildren() = 0;
+  enum NodeItem {
+    Root = 0,
+    Parent,
+    FirstSibling,
+    PriorSibling,
+    NextSibling,
+    LastSibling,
+    FirstNeighbor,
+    PriorNeighbor,
+    NextNeighbor,
+    LastNeighbor,
+    FirstChild,
+    LastChild
+  };
+  virtual IFDE_XMLNode* GetNodeItem(NodeItem eItem) const = 0;
+  virtual int32_t GetNodeLevel() const = 0;
+  virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
+                                 IFDE_XMLNode* pNode) = 0;
+  virtual IFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) = 0;
+  virtual IFDE_XMLNode* Clone(FX_BOOL bRecursive) = 0;
+  virtual void SaveXMLNode(IFX_Stream* pXMLStream) = 0;
+};
+class IFDE_XMLInstruction : public IFDE_XMLNode {
+ public:
+  static IFDE_XMLInstruction* Create(const CFX_WideString& wsTarget);
+  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
+  virtual int32_t CountAttributes() const = 0;
+  virtual FX_BOOL GetAttribute(int32_t index,
+                               CFX_WideString& wsAttriName,
+                               CFX_WideString& wsAttriValue) const = 0;
+  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
+  virtual void GetString(const FX_WCHAR* pwsAttriName,
+                         CFX_WideString& wsAttriValue,
+                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
+  virtual void SetString(const CFX_WideString& wsAttriName,
+                         const CFX_WideString& wsAttriValue) = 0;
+  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
+                             int32_t iDefValue = 0) const = 0;
+  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
+                          int32_t iAttriValue) = 0;
+  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
+                            FX_FLOAT fDefValue = 0) const = 0;
+  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
+  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
+  virtual int32_t CountData() const = 0;
+  virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const = 0;
+  virtual void AppendData(const CFX_WideString& wsData) = 0;
+  virtual void RemoveData(int32_t index) = 0;
+};
+class IFDE_XMLElement : public IFDE_XMLNode {
+ public:
+  static IFDE_XMLElement* Create(const CFX_WideString& wsTag);
+  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
+  virtual void GetLocalTagName(CFX_WideString& wsTag) const = 0;
+  virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const = 0;
+  virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const = 0;
+  virtual int32_t CountAttributes() const = 0;
+  virtual FX_BOOL GetAttribute(int32_t index,
+                               CFX_WideString& wsAttriName,
+                               CFX_WideString& wsAttriValue) const = 0;
+  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
+  virtual void GetString(const FX_WCHAR* pwsAttriName,
+                         CFX_WideString& wsAttriValue,
+                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
+  virtual void SetString(const CFX_WideString& wsAttriName,
+                         const CFX_WideString& wsAttriValue) = 0;
+  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
+                             int32_t iDefValue = 0) const = 0;
+  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
+                          int32_t iAttriValue) = 0;
+  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
+                            FX_FLOAT fDefValue = 0) const = 0;
+  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
+  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
+  virtual void GetTextData(CFX_WideString& wsText) const = 0;
+  virtual void SetTextData(const CFX_WideString& wsText) = 0;
+};
+class IFDE_XMLText : public IFDE_XMLNode {
+ public:
+  static IFDE_XMLText* Create(const CFX_WideString& wsText);
+  virtual void GetText(CFX_WideString& wsText) const = 0;
+  virtual void SetText(const CFX_WideString& wsText) = 0;
+};
+class IFDE_XMLDeclaration : public IFDE_XMLNode {
+ public:
+};
+class IFDE_XMLCharData : public IFDE_XMLDeclaration {
+ public:
+  static IFDE_XMLCharData* Create(const CFX_WideString& wsCData);
+  virtual ~IFDE_XMLCharData() {}
+
+  virtual void GetCharData(CFX_WideString& wsCData) const = 0;
+  virtual void SetCharData(const CFX_WideString& wsCData) = 0;
+};
+
+struct FDE_XMLREADERHANDLER {
+  void* pData;
+  void (*OnTagEnter)(FDE_XMLREADERHANDLER* pThis,
+                     FDE_XMLNODETYPE eType,
+                     const CFX_WideString& wsTagName);
+  void (*OnTagBreak)(FDE_XMLREADERHANDLER* pThis,
+                     const CFX_WideString& wsTagName);
+  void (*OnTagClose)(FDE_XMLREADERHANDLER* pThis,
+                     const CFX_WideString& wsTagName);
+  void (*OnAttribute)(FDE_XMLREADERHANDLER* pThis,
+                      const CFX_WideString& wsName,
+                      const CFX_WideString& wsValue);
+  void (*OnData)(FDE_XMLREADERHANDLER* pThis,
+                 FDE_XMLNODETYPE eType,
+                 const CFX_WideString& wsValue);
+};
+
+class IFDE_XMLDoc {
+ public:
+  static IFDE_XMLDoc* Create();
+  virtual ~IFDE_XMLDoc() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream,
+                          int32_t iXMLPlaneSize = 8192,
+                          int32_t iTextDataSize = 256,
+                          FDE_XMLREADERHANDLER* pHandler = NULL) = 0;
+  virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser) = 0;
+  virtual int32_t DoLoad(IFX_Pause* pPause = NULL) = 0;
+  virtual void CloseXML() = 0;
+  virtual IFDE_XMLNode* GetRoot() const = 0;
+  virtual void SaveXML(IFX_Stream* pXMLStream = NULL,
+                       FX_BOOL bSaveBOM = TRUE) = 0;
+  virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode) = 0;
+};
+class IFDE_XMLParser {
+ public:
+  virtual ~IFDE_XMLParser() {}
+  virtual void Release() = 0;
+  virtual int32_t DoParser(IFX_Pause* pPause) = 0;
+};
+#define FDE_XMLSYNTAXSTATUS_None 0x00
+#define FDE_XMLSYNTAXSTATUS_InstructionOpen 0x01
+#define FDE_XMLSYNTAXSTATUS_InstructionClose 0x02
+#define FDE_XMLSYNTAXSTATUS_ElementOpen 0x03
+#define FDE_XMLSYNTAXSTATUS_ElementBreak 0x04
+#define FDE_XMLSYNTAXSTATUS_ElementClose 0x05
+#define FDE_XMLSYNTAXSTATUS_TargetName 0x06
+#define FDE_XMLSYNTAXSTATUS_TagName 0x07
+#define FDE_XMLSYNTAXSTATUS_AttriName 0x08
+#define FDE_XMLSYNTAXSTATUS_AttriValue 0x09
+#define FDE_XMLSYNTAXSTATUS_Text 0x0A
+#define FDE_XMLSYNTAXSTATUS_CData 0x0B
+#define FDE_XMLSYNTAXSTATUS_TargetData 0x0C
+#define FDE_XMLSYNTAXSTATUS_Error 0xFE
+#define FDE_XMLSYNTAXSTATUS_EOS 0xFF
+class IFDE_XMLSyntaxParser {
+ public:
+  static IFDE_XMLSyntaxParser* Create();
+  virtual ~IFDE_XMLSyntaxParser() {}
+  virtual void Release() = 0;
+  virtual void Init(IFX_Stream* pStream,
+                    int32_t iXMLPlaneSize,
+                    int32_t iTextDataSize = 256) = 0;
+  virtual FX_DWORD DoSyntaxParse() = 0;
+  virtual int32_t GetStatus() const = 0;
+  virtual int32_t GetCurrentPos() const = 0;
+  virtual FX_FILESIZE GetCurrentBinaryPos() const = 0;
+  virtual int32_t GetCurrentNodeNumber() const = 0;
+  virtual int32_t GetLastNodeNumber() const = 0;
+  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
+  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
+  virtual void GetAttributeName(CFX_WideString& wsAttriName) const = 0;
+  virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const = 0;
+  virtual void GetTextData(CFX_WideString& wsText) const = 0;
+  virtual void GetTargetData(CFX_WideString& wsData) const = 0;
+};
+
+#endif  // XFA_FDE_XML_FDE_XML_H_
diff --git a/xfa/fde/xml/fde_xml_imp.cpp b/xfa/fde/xml/fde_xml_imp.cpp
new file mode 100644
index 0000000..ce719de
--- /dev/null
+++ b/xfa/fde/xml/fde_xml_imp.cpp
@@ -0,0 +1,2100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fde/xml/fde_xml_imp.h"
+
+#include <algorithm>
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_system.h"
+
+#define FDE_XMLVALIDCHARRANGENUM 5
+
+static const FX_WCHAR g_XMLValidCharRange[FDE_XMLVALIDCHARRANGENUM][2] = {
+    {0x09, 0x09},
+    {0x0A, 0x0A},
+    {0x0D, 0x0D},
+    {0x20, 0xD7FF},
+    {0xE000, 0xFFFD}};
+
+FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch) {
+  int32_t iStart = 0, iEnd = FDE_XMLVALIDCHARRANGENUM - 1, iMid;
+  while (iStart <= iEnd) {
+    iMid = (iStart + iEnd) / 2;
+    if (ch < g_XMLValidCharRange[iMid][0]) {
+      iEnd = iMid - 1;
+    } else if (ch > g_XMLValidCharRange[iMid][1]) {
+      iStart = iMid + 1;
+    } else {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch) {
+  return ch == L' ' || ch == 0x0A || ch == 0x0D || ch == 0x09;
+}
+
+struct FDE_XMLNAMECHAR {
+  FX_WCHAR wStart;
+  FX_WCHAR wEnd;
+  FX_BOOL bStartChar;
+};
+
+#define FDE_XMLNAMECHARSNUM 20
+static FDE_XMLNAMECHAR g_XMLNameChars[FDE_XMLNAMECHARSNUM] = {
+    {L'-', L'.', FALSE},    {L'0', L'9', FALSE},     {L':', L':', FALSE},
+    {L'A', L'Z', TRUE},     {L'_', L'_', TRUE},      {L'a', L'z', TRUE},
+    {0xB7, 0xB7, FALSE},    {0xC0, 0xD6, TRUE},      {0xD8, 0xF6, TRUE},
+    {0xF8, 0x02FF, TRUE},   {0x0300, 0x036F, FALSE}, {0x0370, 0x037D, TRUE},
+    {0x037F, 0x1FFF, TRUE}, {0x200C, 0x200D, TRUE},  {0x203F, 0x2040, FALSE},
+    {0x2070, 0x218F, TRUE}, {0x2C00, 0x2FEF, TRUE},  {0x3001, 0xD7FF, TRUE},
+    {0xF900, 0xFDCF, TRUE}, {0xFDF0, 0xFFFD, TRUE},
+};
+
+FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar) {
+  int32_t iStart = 0, iEnd = FDE_XMLNAMECHARSNUM - 1, iMid;
+  while (iStart <= iEnd) {
+    iMid = (iStart + iEnd) / 2;
+    if (ch < g_XMLNameChars[iMid].wStart) {
+      iEnd = iMid - 1;
+    } else if (ch > g_XMLNameChars[iMid].wEnd) {
+      iStart = iMid + 1;
+    } else {
+      if (bFirstChar) {
+        return g_XMLNameChars[iMid].bStartChar;
+      }
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+CFDE_XMLNode::CFDE_XMLNode()
+    : m_pParent(NULL), m_pChild(NULL), m_pPrior(NULL), m_pNext(NULL) {}
+CFDE_XMLNode::~CFDE_XMLNode() {
+  DeleteChildren();
+}
+void CFDE_XMLNode::DeleteChildren() {
+  CFDE_XMLNode *pChild = m_pChild, *pTemp;
+  while (pChild != NULL) {
+    pTemp = pChild->m_pNext;
+    pChild->Release();
+    pChild = pTemp;
+  }
+  m_pChild = NULL;
+}
+int32_t CFDE_XMLNode::CountChildNodes() const {
+  int32_t iCount = 0;
+  CFDE_XMLNode* pChild = m_pChild;
+  while (pChild != NULL) {
+    iCount++;
+    pChild = pChild->m_pNext;
+  }
+  return iCount;
+}
+CFDE_XMLNode* CFDE_XMLNode::GetChildNode(int32_t index) const {
+  CFDE_XMLNode* pChild = m_pChild;
+  while (pChild != NULL) {
+    if (index == 0) {
+      return pChild;
+    }
+    index--;
+    pChild = pChild->m_pNext;
+  }
+  return NULL;
+}
+int32_t CFDE_XMLNode::GetChildNodeIndex(CFDE_XMLNode* pNode) const {
+  int32_t index = 0;
+  CFDE_XMLNode* pChild = m_pChild;
+  while (pChild != NULL) {
+    if (pChild == pNode) {
+      return index;
+    }
+    index++;
+    pChild = pChild->m_pNext;
+  }
+  return -1;
+}
+CFDE_XMLNode* CFDE_XMLNode::GetPath(const FX_WCHAR* pPath,
+                                    int32_t iLength,
+                                    FX_BOOL bQualifiedName) const {
+  FXSYS_assert(pPath != NULL);
+  if (iLength < 0) {
+    iLength = FXSYS_wcslen(pPath);
+  }
+  if (iLength == 0) {
+    return NULL;
+  }
+  CFX_WideString csPath;
+  const FX_WCHAR* pStart = pPath;
+  const FX_WCHAR* pEnd = pPath + iLength;
+  FX_WCHAR ch;
+  while (pStart < pEnd) {
+    ch = *pStart++;
+    if (ch == L'/') {
+      break;
+    } else {
+      csPath += ch;
+    }
+  }
+  iLength -= pStart - pPath;
+  CFDE_XMLNode* pFind = NULL;
+  if (csPath.GetLength() < 1) {
+    pFind = GetNodeItem(IFDE_XMLNode::Root);
+  } else if (csPath.Compare(L"..") == 0) {
+    pFind = m_pParent;
+  } else if (csPath.Compare(L".") == 0) {
+    pFind = (CFDE_XMLNode*)this;
+  } else {
+    CFX_WideString wsTag;
+    CFDE_XMLNode* pNode = m_pChild;
+    while (pNode != NULL) {
+      if (pNode->GetType() == FDE_XMLNODE_Element) {
+        if (bQualifiedName) {
+          ((CFDE_XMLElement*)pNode)->GetTagName(wsTag);
+        } else {
+          ((CFDE_XMLElement*)pNode)->GetLocalTagName(wsTag);
+        }
+        if (wsTag.Compare(csPath) == 0) {
+          if (iLength < 1) {
+            pFind = pNode;
+          } else {
+            pFind = pNode->GetPath(pStart, iLength, bQualifiedName);
+          }
+          if (pFind != NULL) {
+            return pFind;
+          }
+        }
+      }
+      pNode = pNode->m_pNext;
+    }
+  }
+  if (pFind == NULL || iLength < 1) {
+    return pFind;
+  }
+  return pFind->GetPath(pStart, iLength, bQualifiedName);
+}
+int32_t CFDE_XMLNode::InsertChildNode(CFDE_XMLNode* pNode, int32_t index) {
+  FXSYS_assert(pNode != NULL);
+  pNode->m_pParent = this;
+  if (m_pChild == NULL) {
+    m_pChild = pNode;
+    pNode->m_pPrior = NULL;
+    pNode->m_pNext = NULL;
+    return 0;
+  } else if (index == 0) {
+    pNode->m_pNext = m_pChild;
+    pNode->m_pPrior = NULL;
+    m_pChild->m_pPrior = pNode;
+    m_pChild = pNode;
+    return 0;
+  }
+  int32_t iCount = 0;
+  CFDE_XMLNode* pFind = m_pChild;
+  while (++iCount != index && pFind->m_pNext != NULL) {
+    pFind = pFind->m_pNext;
+  }
+  pNode->m_pPrior = pFind;
+  pNode->m_pNext = pFind->m_pNext;
+  if (pFind->m_pNext != NULL) {
+    pFind->m_pNext->m_pPrior = pNode;
+  }
+  pFind->m_pNext = pNode;
+  return iCount;
+}
+void CFDE_XMLNode::RemoveChildNode(CFDE_XMLNode* pNode) {
+  FXSYS_assert(m_pChild != NULL && pNode != NULL);
+  if (m_pChild == pNode) {
+    m_pChild = pNode->m_pNext;
+  } else {
+    pNode->m_pPrior->m_pNext = pNode->m_pNext;
+  }
+  if (pNode->m_pNext != NULL) {
+    pNode->m_pNext->m_pPrior = pNode->m_pPrior;
+  }
+  pNode->m_pParent = NULL;
+  pNode->m_pNext = NULL;
+  pNode->m_pPrior = NULL;
+}
+CFDE_XMLNode* CFDE_XMLNode::GetNodeItem(IFDE_XMLNode::NodeItem eItem) const {
+  switch (eItem) {
+    case IFDE_XMLNode::Root: {
+      CFDE_XMLNode* pParent = (CFDE_XMLNode*)this;
+      while (pParent->m_pParent != NULL) {
+        pParent = pParent->m_pParent;
+      }
+      return pParent;
+    }
+    case IFDE_XMLNode::Parent:
+      return m_pParent;
+    case IFDE_XMLNode::FirstSibling: {
+      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
+      while (pItem->m_pPrior != NULL) {
+        pItem = pItem->m_pPrior;
+      }
+      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
+    }
+    case IFDE_XMLNode::PriorSibling:
+      return m_pPrior;
+    case IFDE_XMLNode::NextSibling:
+      return m_pNext;
+    case IFDE_XMLNode::LastSibling: {
+      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
+      while (pItem->m_pNext != NULL) {
+        pItem = pItem->m_pNext;
+      }
+      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
+    }
+    case IFDE_XMLNode::FirstNeighbor: {
+      CFDE_XMLNode* pParent = (CFDE_XMLNode*)this;
+      while (pParent->m_pParent != NULL) {
+        pParent = pParent->m_pParent;
+      }
+      return pParent == (CFDE_XMLNode*)this ? NULL : pParent;
+    }
+    case IFDE_XMLNode::PriorNeighbor: {
+      if (m_pPrior == NULL) {
+        return m_pParent;
+      }
+      CFDE_XMLNode* pItem = m_pPrior;
+      while (CFDE_XMLNode* pTemp = pItem->m_pChild) {
+        pItem = pTemp;
+        while ((pTemp = pItem->m_pNext) != NULL) {
+          pItem = pTemp;
+        }
+      }
+      return pItem;
+    }
+    case IFDE_XMLNode::NextNeighbor: {
+      if (m_pChild != NULL) {
+        return m_pChild;
+      }
+      if (m_pNext != NULL) {
+        return m_pNext;
+      }
+      CFDE_XMLNode* pItem = m_pParent;
+      while (pItem != NULL) {
+        if (pItem->m_pNext != NULL) {
+          return pItem->m_pNext;
+        }
+        pItem = pItem->m_pParent;
+      }
+      return NULL;
+    }
+    case IFDE_XMLNode::LastNeighbor: {
+      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
+      while (pItem->m_pParent != NULL) {
+        pItem = pItem->m_pParent;
+      }
+      while (TRUE) {
+        while (pItem->m_pNext != NULL) {
+          pItem = pItem->m_pNext;
+        }
+        if (pItem->m_pChild == NULL) {
+          break;
+        }
+        pItem = pItem->m_pChild;
+      }
+      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
+    }
+    case IFDE_XMLNode::FirstChild:
+      return m_pChild;
+    case IFDE_XMLNode::LastChild: {
+      if (m_pChild == NULL) {
+        return NULL;
+      }
+      CFDE_XMLNode* pChild = m_pChild;
+      while (pChild->m_pNext != NULL) {
+        pChild = pChild->m_pNext;
+      }
+      return pChild;
+    }
+    default:
+      break;
+  }
+  return NULL;
+}
+int32_t CFDE_XMLNode::GetNodeLevel() const {
+  int32_t iLevel = 0;
+  CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
+  while ((pItem = pItem->m_pParent) != NULL) {
+    iLevel++;
+  }
+  return iLevel;
+}
+FX_BOOL CFDE_XMLNode::InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
+                                     CFDE_XMLNode* pNode) {
+  FXSYS_assert(pNode != NULL);
+  switch (eItem) {
+    case IFDE_XMLNode::NextSibling: {
+      pNode->m_pParent = m_pParent;
+      pNode->m_pNext = m_pNext;
+      pNode->m_pPrior = this;
+      if (m_pNext) {
+        m_pNext->m_pPrior = pNode;
+      }
+      m_pNext = pNode;
+      return TRUE;
+    }
+    case IFDE_XMLNode::PriorSibling: {
+      pNode->m_pParent = m_pParent;
+      pNode->m_pNext = this;
+      pNode->m_pPrior = m_pPrior;
+      if (m_pPrior) {
+        m_pPrior->m_pNext = pNode;
+      } else if (m_pParent) {
+        m_pParent->m_pChild = pNode;
+      }
+      m_pPrior = pNode;
+      return TRUE;
+    }
+    default:
+      return FALSE;
+  }
+  return FALSE;
+}
+CFDE_XMLNode* CFDE_XMLNode::RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) {
+  CFDE_XMLNode* pNode = NULL;
+  switch (eItem) {
+    case IFDE_XMLNode::NextSibling:
+      if (m_pNext) {
+        pNode = m_pNext;
+        m_pNext = pNode->m_pNext;
+        if (m_pNext) {
+          m_pNext->m_pPrior = this;
+        }
+        pNode->m_pParent = NULL;
+        pNode->m_pNext = NULL;
+        pNode->m_pPrior = NULL;
+      }
+      break;
+    default:
+      break;
+  }
+  return pNode;
+}
+CFDE_XMLNode* CFDE_XMLNode::Clone(FX_BOOL bRecursive) {
+  return NULL;
+}
+void CFDE_XMLNode::SaveXMLNode(IFX_Stream* pXMLStream) {
+  CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
+  FXSYS_assert(pXMLStream != NULL && pNode != NULL);
+  switch (pNode->GetType()) {
+    case FDE_XMLNODE_Instruction: {
+      CFX_WideString ws;
+      CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
+      if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
+        ws = L"<?xml version=\"1.0\" encoding=\"";
+        FX_WORD wCodePage = pXMLStream->GetCodePage();
+        if (wCodePage == FX_CODEPAGE_UTF16LE) {
+          ws += L"UTF-16";
+        } else if (wCodePage == FX_CODEPAGE_UTF16BE) {
+          ws += L"UTF-16be";
+        } else {
+          ws += L"UTF-8";
+        }
+        ws += L"\"?>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      } else {
+        ws.Format(L"<?%s", (const FX_WCHAR*)pInstruction->m_wsTarget);
+        pXMLStream->WriteString(ws, ws.GetLength());
+        CFX_WideStringArray& attributes = pInstruction->m_Attributes;
+        int32_t i, iCount = attributes.GetSize();
+        CFX_WideString wsValue;
+        for (i = 0; i < iCount; i += 2) {
+          ws = L" ";
+          ws += attributes[i];
+          ws += L"=\"";
+          wsValue = attributes[i + 1];
+          wsValue.Replace(L"&", L"&amp;");
+          wsValue.Replace(L"<", L"&lt;");
+          wsValue.Replace(L">", L"&gt;");
+          wsValue.Replace(L"\'", L"&apos;");
+          wsValue.Replace(L"\"", L"&quot;");
+          ws += wsValue;
+          ws += L"\"";
+          pXMLStream->WriteString(ws, ws.GetLength());
+        }
+        CFX_WideStringArray& targetdata = pInstruction->m_TargetData;
+        iCount = targetdata.GetSize();
+        for (i = 0; i < iCount; i++) {
+          ws = L" \"";
+          ws += targetdata[i];
+          ws += L"\"";
+          pXMLStream->WriteString(ws, ws.GetLength());
+        }
+        ws = L"?>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+    } break;
+    case FDE_XMLNODE_Element: {
+      CFX_WideString ws;
+      ws = L"<";
+      ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
+      pXMLStream->WriteString(ws, ws.GetLength());
+      CFX_WideStringArray& attributes = ((CFDE_XMLElement*)pNode)->m_Attributes;
+      int32_t iCount = attributes.GetSize();
+      CFX_WideString wsValue;
+      for (int32_t i = 0; i < iCount; i += 2) {
+        ws = L" ";
+        ws += attributes[i];
+        ws += L"=\"";
+        wsValue = attributes[i + 1];
+        wsValue.Replace(L"&", L"&amp;");
+        wsValue.Replace(L"<", L"&lt;");
+        wsValue.Replace(L">", L"&gt;");
+        wsValue.Replace(L"\'", L"&apos;");
+        wsValue.Replace(L"\"", L"&quot;");
+        ws += wsValue;
+        ws += L"\"";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+      if (pNode->m_pChild == NULL) {
+        ws = L"\n/>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      } else {
+        ws = L"\n>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+        CFDE_XMLNode* pChild = pNode->m_pChild;
+        while (pChild != NULL) {
+          pChild->SaveXMLNode(pXMLStream);
+          pChild = pChild->m_pNext;
+        }
+        ws = L"</";
+        ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
+        ws += L"\n>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+    } break;
+    case FDE_XMLNODE_Text: {
+      CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText;
+      ws.Replace(L"&", L"&amp;");
+      ws.Replace(L"<", L"&lt;");
+      ws.Replace(L">", L"&gt;");
+      ws.Replace(L"\'", L"&apos;");
+      ws.Replace(L"\"", L"&quot;");
+      pXMLStream->WriteString(ws, ws.GetLength());
+    } break;
+    case FDE_XMLNODE_CharData: {
+      CFX_WideString ws = L"<![CDATA[";
+      ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
+      ws += L"]]>";
+      pXMLStream->WriteString(ws, ws.GetLength());
+    } break;
+    case FDE_XMLNODE_Unknown:
+      break;
+    default:
+      break;
+  }
+}
+void CFDE_XMLNode::CloneChildren(CFDE_XMLNode* pClone) {
+  if (!m_pChild) {
+    return;
+  }
+  CFDE_XMLNode* pNext = m_pChild;
+  CFDE_XMLNode* pCloneNext = pNext->Clone(TRUE);
+  pClone->InsertChildNode(pCloneNext);
+  pNext = pNext->m_pNext;
+  while (pNext) {
+    CFDE_XMLNode* pChild = pNext->Clone(TRUE);
+    pCloneNext->InsertNodeItem(IFDE_XMLNode::NextSibling, pChild);
+    pCloneNext = pChild;
+    pNext = pNext->m_pNext;
+  }
+}
+IFDE_XMLInstruction* IFDE_XMLInstruction::Create(
+    const CFX_WideString& wsTarget) {
+  return (IFDE_XMLInstruction*)new CFDE_XMLInstruction(wsTarget);
+}
+CFDE_XMLInstruction::CFDE_XMLInstruction(const CFX_WideString& wsTarget)
+    : m_wsTarget(wsTarget) {
+  FXSYS_assert(m_wsTarget.GetLength() > 0);
+}
+CFDE_XMLNode* CFDE_XMLInstruction::Clone(FX_BOOL bRecursive) {
+  CFDE_XMLInstruction* pClone = new CFDE_XMLInstruction(m_wsTarget);
+  if (!pClone) {
+    return pClone;
+  }
+  pClone->m_Attributes.Copy(m_Attributes);
+  pClone->m_TargetData.Copy(m_TargetData);
+  if (bRecursive) {
+    CloneChildren(pClone);
+  }
+  return pClone;
+}
+int32_t CFDE_XMLInstruction::CountAttributes() const {
+  return m_Attributes.GetSize() / 2;
+}
+FX_BOOL CFDE_XMLInstruction::GetAttribute(int32_t index,
+                                          CFX_WideString& wsAttriName,
+                                          CFX_WideString& wsAttriValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  FXSYS_assert(index > -1 && index < iCount / 2);
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (index == 0) {
+      wsAttriName = m_Attributes[i];
+      wsAttriValue = m_Attributes[i + 1];
+      return TRUE;
+    }
+    index--;
+  }
+  return FALSE;
+}
+FX_BOOL CFDE_XMLInstruction::HasAttribute(const FX_WCHAR* pwsAttriName) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CFDE_XMLInstruction::GetString(const FX_WCHAR* pwsAttriName,
+                                    CFX_WideString& wsAttriValue,
+                                    const FX_WCHAR* pwsDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      wsAttriValue = m_Attributes[i + 1];
+      return;
+    }
+  }
+  wsAttriValue = pwsDefValue;
+}
+void CFDE_XMLInstruction::SetString(const CFX_WideString& wsAttriName,
+                                    const CFX_WideString& wsAttriValue) {
+  FXSYS_assert(wsAttriName.GetLength() > 0);
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(wsAttriName) == 0) {
+      m_Attributes[i] = wsAttriName;
+      m_Attributes[i + 1] = wsAttriValue;
+      return;
+    }
+  }
+  m_Attributes.Add(wsAttriName);
+  m_Attributes.Add(wsAttriValue);
+}
+int32_t CFDE_XMLInstruction::GetInteger(const FX_WCHAR* pwsAttriName,
+                                        int32_t iDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return FXSYS_wtoi((const FX_WCHAR*)m_Attributes[i + 1]);
+    }
+  }
+  return iDefValue;
+}
+void CFDE_XMLInstruction::SetInteger(const FX_WCHAR* pwsAttriName,
+                                     int32_t iAttriValue) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%d", iAttriValue);
+  SetString(pwsAttriName, wsValue);
+}
+FX_FLOAT CFDE_XMLInstruction::GetFloat(const FX_WCHAR* pwsAttriName,
+                                       FX_FLOAT fDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return FX_wcstof((const FX_WCHAR*)m_Attributes[i + 1]);
+    }
+  }
+  return fDefValue;
+}
+void CFDE_XMLInstruction::SetFloat(const FX_WCHAR* pwsAttriName,
+                                   FX_FLOAT fAttriValue) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%f", fAttriValue);
+  SetString(pwsAttriName, wsValue);
+}
+void CFDE_XMLInstruction::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      m_Attributes.RemoveAt(i + 1);
+      m_Attributes.RemoveAt(i);
+      return;
+    }
+  }
+}
+int32_t CFDE_XMLInstruction::CountData() const {
+  return m_TargetData.GetSize();
+}
+FX_BOOL CFDE_XMLInstruction::GetData(int32_t index,
+                                     CFX_WideString& wsData) const {
+  if (index < 0 || index >= m_TargetData.GetSize()) {
+    return FALSE;
+  }
+  wsData = m_TargetData[index];
+  return TRUE;
+}
+void CFDE_XMLInstruction::AppendData(const CFX_WideString& wsData) {
+  m_TargetData.Add(wsData);
+}
+void CFDE_XMLInstruction::RemoveData(int32_t index) {
+  m_TargetData.RemoveAt(index);
+}
+IFDE_XMLElement* IFDE_XMLElement::Create(const CFX_WideString& wsTag) {
+  return (IFDE_XMLElement*)new CFDE_XMLElement(wsTag);
+}
+CFDE_XMLElement::CFDE_XMLElement(const CFX_WideString& wsTag)
+    : CFDE_XMLNode(), m_wsTag(wsTag), m_Attributes() {
+  FXSYS_assert(m_wsTag.GetLength() > 0);
+}
+CFDE_XMLElement::~CFDE_XMLElement() {
+  m_Attributes.RemoveAll();
+}
+CFDE_XMLNode* CFDE_XMLElement::Clone(FX_BOOL bRecursive) {
+  CFDE_XMLElement* pClone = new CFDE_XMLElement(m_wsTag);
+  if (!pClone) {
+    return NULL;
+  }
+  pClone->m_Attributes.Copy(m_Attributes);
+  if (bRecursive) {
+    CloneChildren(pClone);
+  } else {
+    CFX_WideString wsText;
+    CFDE_XMLNode* pChild = m_pChild;
+    while (pChild != NULL) {
+      switch (pChild->GetType()) {
+        case FDE_XMLNODE_Text:
+          wsText += ((CFDE_XMLText*)pChild)->m_wsText;
+          break;
+        default:
+          break;
+      }
+      pChild = pChild->m_pNext;
+    }
+    pClone->SetTextData(wsText);
+  }
+  return pClone;
+}
+void CFDE_XMLElement::GetTagName(CFX_WideString& wsTag) const {
+  wsTag = m_wsTag;
+}
+void CFDE_XMLElement::GetLocalTagName(CFX_WideString& wsTag) const {
+  FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
+  if (iFind < 0) {
+    wsTag = m_wsTag;
+  } else {
+    wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1);
+  }
+}
+void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const {
+  FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
+  if (iFind < 0) {
+    wsPrefix.Empty();
+  } else {
+    wsPrefix = m_wsTag.Left(iFind);
+  }
+}
+void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const {
+  CFX_WideString wsAttri(L"xmlns"), wsPrefix;
+  GetNamespacePrefix(wsPrefix);
+  if (wsPrefix.GetLength() > 0) {
+    wsAttri += L":";
+    wsAttri += wsPrefix;
+  }
+  wsNamespace.Empty();
+  CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
+  while (pNode != NULL) {
+    if (pNode->GetType() != FDE_XMLNODE_Element) {
+      break;
+    }
+    CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode;
+    if (!pElement->HasAttribute(wsAttri)) {
+      pNode = pNode->GetNodeItem(IFDE_XMLNode::Parent);
+      continue;
+    }
+    pElement->GetString(wsAttri, wsNamespace);
+    break;
+  }
+}
+int32_t CFDE_XMLElement::CountAttributes() const {
+  return m_Attributes.GetSize() / 2;
+}
+FX_BOOL CFDE_XMLElement::GetAttribute(int32_t index,
+                                      CFX_WideString& wsAttriName,
+                                      CFX_WideString& wsAttriValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  FXSYS_assert(index > -1 && index < iCount / 2);
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (index == 0) {
+      wsAttriName = m_Attributes[i];
+      wsAttriValue = m_Attributes[i + 1];
+      return TRUE;
+    }
+    index--;
+  }
+  return FALSE;
+}
+FX_BOOL CFDE_XMLElement::HasAttribute(const FX_WCHAR* pwsAttriName) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CFDE_XMLElement::GetString(const FX_WCHAR* pwsAttriName,
+                                CFX_WideString& wsAttriValue,
+                                const FX_WCHAR* pwsDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      wsAttriValue = m_Attributes[i + 1];
+      return;
+    }
+  }
+  wsAttriValue = pwsDefValue;
+}
+void CFDE_XMLElement::SetString(const CFX_WideString& wsAttriName,
+                                const CFX_WideString& wsAttriValue) {
+  FXSYS_assert(wsAttriName.GetLength() > 0);
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(wsAttriName) == 0) {
+      m_Attributes[i] = wsAttriName;
+      m_Attributes[i + 1] = wsAttriValue;
+      return;
+    }
+  }
+  m_Attributes.Add(wsAttriName);
+  m_Attributes.Add(wsAttriValue);
+}
+int32_t CFDE_XMLElement::GetInteger(const FX_WCHAR* pwsAttriName,
+                                    int32_t iDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return FXSYS_wtoi((const FX_WCHAR*)m_Attributes[i + 1]);
+    }
+  }
+  return iDefValue;
+}
+void CFDE_XMLElement::SetInteger(const FX_WCHAR* pwsAttriName,
+                                 int32_t iAttriValue) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%d", iAttriValue);
+  SetString(pwsAttriName, wsValue);
+}
+FX_FLOAT CFDE_XMLElement::GetFloat(const FX_WCHAR* pwsAttriName,
+                                   FX_FLOAT fDefValue) const {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      return FX_wcstof((const FX_WCHAR*)m_Attributes[i + 1]);
+    }
+  }
+  return fDefValue;
+}
+void CFDE_XMLElement::SetFloat(const FX_WCHAR* pwsAttriName,
+                               FX_FLOAT fAttriValue) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%f", fAttriValue);
+  SetString(pwsAttriName, wsValue);
+}
+void CFDE_XMLElement::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
+  int32_t iCount = m_Attributes.GetSize();
+  for (int32_t i = 0; i < iCount; i += 2) {
+    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
+      m_Attributes.RemoveAt(i + 1);
+      m_Attributes.RemoveAt(i);
+      return;
+    }
+  }
+}
+void CFDE_XMLElement::GetTextData(CFX_WideString& wsText) const {
+  CFX_WideTextBuf buffer;
+  CFDE_XMLNode* pChild = m_pChild;
+  while (pChild != NULL) {
+    switch (pChild->GetType()) {
+      case FDE_XMLNODE_Text:
+        buffer << ((CFDE_XMLText*)pChild)->m_wsText;
+        break;
+      case FDE_XMLNODE_CharData:
+        buffer << ((CFDE_XMLCharData*)pChild)->m_wsCharData;
+        break;
+      default:
+        break;
+    }
+    pChild = pChild->m_pNext;
+  }
+  wsText = buffer.GetWideString();
+}
+void CFDE_XMLElement::SetTextData(const CFX_WideString& wsText) {
+  if (wsText.GetLength() < 1) {
+    return;
+  }
+  InsertChildNode(new CFDE_XMLText(wsText));
+}
+IFDE_XMLText* IFDE_XMLText::Create(const CFX_WideString& wsText) {
+  return (IFDE_XMLText*)new CFDE_XMLText(wsText);
+}
+CFDE_XMLText::CFDE_XMLText(const CFX_WideString& wsText)
+    : CFDE_XMLNode(), m_wsText(wsText) {}
+CFDE_XMLNode* CFDE_XMLText::Clone(FX_BOOL bRecursive) {
+  CFDE_XMLText* pClone = new CFDE_XMLText(m_wsText);
+  return pClone;
+}
+IFDE_XMLCharData* IFDE_XMLCharData::Create(const CFX_WideString& wsCData) {
+  return (IFDE_XMLCharData*)new CFDE_XMLCharData(wsCData);
+}
+CFDE_XMLCharData::CFDE_XMLCharData(const CFX_WideString& wsCData)
+    : CFDE_XMLDeclaration(), m_wsCharData(wsCData) {}
+CFDE_XMLNode* CFDE_XMLCharData::Clone(FX_BOOL bRecursive) {
+  CFDE_XMLCharData* pClone = new CFDE_XMLCharData(m_wsCharData);
+  return pClone;
+}
+IFDE_XMLDoc* IFDE_XMLDoc::Create() {
+  return (IFDE_XMLDoc*)new CFDE_XMLDoc;
+}
+CFDE_XMLDoc::CFDE_XMLDoc()
+    : m_pRoot(NULL), m_pSyntaxParser(NULL), m_pXMLParser(NULL) {
+  Reset(TRUE);
+  CFDE_XMLInstruction* pXML = new CFDE_XMLInstruction(L"xml");
+  m_pRoot->InsertChildNode(pXML);
+}
+CFDE_XMLDoc::~CFDE_XMLDoc() {
+  Reset(FALSE);
+}
+void CFDE_XMLDoc::Reset(FX_BOOL bInitRoot) {
+  m_iStatus = 0;
+  m_pStream = NULL;
+  if (bInitRoot) {
+    if (m_pRoot == NULL) {
+      m_pRoot = new CFDE_XMLNode;
+    } else {
+      m_pRoot->DeleteChildren();
+    }
+  } else {
+    if (m_pRoot != NULL) {
+      m_pRoot->Release();
+      m_pRoot = NULL;
+    }
+  }
+  ReleaseParser();
+}
+void CFDE_XMLDoc::ReleaseParser() {
+  if (m_pXMLParser != NULL) {
+    m_pXMLParser->Release();
+    m_pXMLParser = NULL;
+  }
+  if (m_pSyntaxParser != NULL) {
+    m_pSyntaxParser->Release();
+    m_pSyntaxParser = NULL;
+  }
+}
+FX_BOOL CFDE_XMLDoc::LoadXML(IFX_Stream* pXMLStream,
+                             int32_t iXMLPlaneSize,
+                             int32_t iTextDataSize,
+                             FDE_XMLREADERHANDLER* pHandler) {
+  if (pXMLStream == NULL) {
+    return FALSE;
+  }
+  Reset(TRUE);
+  iXMLPlaneSize = iXMLPlaneSize / 1024;
+  if (iXMLPlaneSize < 1) {
+    iXMLPlaneSize = 1;
+  }
+  iXMLPlaneSize *= 1024;
+  if (iXMLPlaneSize < 4096) {
+    iXMLPlaneSize = 4096;
+  }
+  iTextDataSize = iTextDataSize / 128;
+  if (iTextDataSize < 1) {
+    iTextDataSize = 1;
+  }
+  iTextDataSize *= 128;
+  if (iTextDataSize < 128) {
+    iTextDataSize = 128;
+  }
+  m_pStream = pXMLStream;
+  FX_WORD wCodePage = m_pStream->GetCodePage();
+  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
+      wCodePage != FX_CODEPAGE_UTF8) {
+    m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
+  }
+  m_pSyntaxParser = IFDE_XMLSyntaxParser::Create();
+  if (m_pSyntaxParser == NULL) {
+    return FALSE;
+  }
+  m_pSyntaxParser->Init(m_pStream, iXMLPlaneSize, iTextDataSize);
+  if (pHandler == NULL) {
+    m_pXMLParser = new CFDE_XMLDOMParser(m_pRoot, m_pSyntaxParser);
+  } else {
+    m_pXMLParser = new CFDE_XMLSAXParser(pHandler, m_pSyntaxParser);
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_XMLDoc::LoadXML(IFDE_XMLParser* pXMLParser) {
+  if (pXMLParser == NULL) {
+    return FALSE;
+  }
+  Reset(TRUE);
+  m_pXMLParser = pXMLParser;
+  return m_pXMLParser != NULL;
+}
+int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) {
+  if (m_iStatus >= 100) {
+    return m_iStatus;
+  }
+  FXSYS_assert(m_pXMLParser != NULL);
+  return m_iStatus = m_pXMLParser->DoParser(pPause);
+}
+void CFDE_XMLDoc::CloseXML() {
+  ReleaseParser();
+}
+void CFDE_XMLDoc::SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pINode) {
+  CFDE_XMLNode* pNode = (CFDE_XMLNode*)pINode;
+  FXSYS_assert(pXMLStream != NULL && pNode != NULL);
+  switch (pNode->GetType()) {
+    case FDE_XMLNODE_Instruction: {
+      CFX_WideString ws;
+      CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
+      if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
+        ws = L"<?xml version=\"1.0\" encoding=\"";
+        FX_WORD wCodePage = pXMLStream->GetCodePage();
+        if (wCodePage == FX_CODEPAGE_UTF16LE) {
+          ws += L"UTF-16";
+        } else if (wCodePage == FX_CODEPAGE_UTF16BE) {
+          ws += L"UTF-16be";
+        } else {
+          ws += L"UTF-8";
+        }
+        ws += L"\"?>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      } else {
+        ws.Format(L"<?%s", (const FX_WCHAR*)pInstruction->m_wsTarget);
+        pXMLStream->WriteString(ws, ws.GetLength());
+        CFX_WideStringArray& attributes = pInstruction->m_Attributes;
+        int32_t i, iCount = attributes.GetSize();
+        CFX_WideString wsValue;
+        for (i = 0; i < iCount; i += 2) {
+          ws = L" ";
+          ws += attributes[i];
+          ws += L"=\"";
+          wsValue = attributes[i + 1];
+          wsValue.Replace(L"&", L"&amp;");
+          wsValue.Replace(L"<", L"&lt;");
+          wsValue.Replace(L">", L"&gt;");
+          wsValue.Replace(L"\'", L"&apos;");
+          wsValue.Replace(L"\"", L"&quot;");
+          ws += wsValue;
+          ws += L"\"";
+          pXMLStream->WriteString(ws, ws.GetLength());
+        }
+        CFX_WideStringArray& targetdata = pInstruction->m_TargetData;
+        iCount = targetdata.GetSize();
+        for (i = 0; i < iCount; i++) {
+          ws = L" \"";
+          ws += targetdata[i];
+          ws += L"\"";
+          pXMLStream->WriteString(ws, ws.GetLength());
+        }
+        ws = L"?>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+    } break;
+    case FDE_XMLNODE_Element: {
+      CFX_WideString ws;
+      ws = L"<";
+      ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
+      pXMLStream->WriteString(ws, ws.GetLength());
+      CFX_WideStringArray& attributes = ((CFDE_XMLElement*)pNode)->m_Attributes;
+      int32_t iCount = attributes.GetSize();
+      CFX_WideString wsValue;
+      for (int32_t i = 0; i < iCount; i += 2) {
+        ws = L" ";
+        ws += attributes[i];
+        ws += L"=\"";
+        wsValue = attributes[i + 1];
+        wsValue.Replace(L"&", L"&amp;");
+        wsValue.Replace(L"<", L"&lt;");
+        wsValue.Replace(L">", L"&gt;");
+        wsValue.Replace(L"\'", L"&apos;");
+        wsValue.Replace(L"\"", L"&quot;");
+        ws += wsValue;
+        ws += L"\"";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+      if (pNode->m_pChild == NULL) {
+        ws = L"\n/>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      } else {
+        ws = L"\n>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+        CFDE_XMLNode* pChild = pNode->m_pChild;
+        while (pChild != NULL) {
+          SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pChild);
+          pChild = pChild->m_pNext;
+        }
+        ws = L"</";
+        ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
+        ws += L"\n>";
+        pXMLStream->WriteString(ws, ws.GetLength());
+      }
+    } break;
+    case FDE_XMLNODE_Text: {
+      CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText;
+      ws.Replace(L"&", L"&amp;");
+      ws.Replace(L"<", L"&lt;");
+      ws.Replace(L">", L"&gt;");
+      ws.Replace(L"\'", L"&apos;");
+      ws.Replace(L"\"", L"&quot;");
+      pXMLStream->WriteString(ws, ws.GetLength());
+    } break;
+    case FDE_XMLNODE_CharData: {
+      CFX_WideString ws = L"<![CDATA[";
+      ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
+      ws += L"]]>";
+      pXMLStream->WriteString(ws, ws.GetLength());
+    } break;
+    case FDE_XMLNODE_Unknown:
+      break;
+    default:
+      break;
+  }
+}
+void CFDE_XMLDoc::SaveXML(IFX_Stream* pXMLStream, FX_BOOL bSaveBOM) {
+  if (pXMLStream == NULL || pXMLStream == m_pStream) {
+    m_pStream->Seek(FX_STREAMSEEK_Begin, 0);
+    pXMLStream = m_pStream;
+  }
+  FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Text) != 0);
+  FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Write) != 0);
+  FX_WORD wCodePage = pXMLStream->GetCodePage();
+  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
+      wCodePage != FX_CODEPAGE_UTF8) {
+    wCodePage = FX_CODEPAGE_UTF8;
+    pXMLStream->SetCodePage(wCodePage);
+  }
+  if (bSaveBOM) {
+    pXMLStream->WriteString(L"\xFEFF", 1);
+  }
+  CFDE_XMLNode* pNode = m_pRoot->m_pChild;
+  while (pNode != NULL) {
+    SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pNode);
+    pNode = pNode->m_pNext;
+  }
+  if (pXMLStream == m_pStream) {
+    int32_t iPos = pXMLStream->GetPosition();
+    pXMLStream->SetLength(iPos);
+  }
+}
+CFDE_XMLDOMParser::CFDE_XMLDOMParser(CFDE_XMLNode* pRoot,
+                                     IFDE_XMLSyntaxParser* pParser)
+    : m_pParser(pParser),
+      m_pParent(pRoot),
+      m_pChild(NULL),
+      m_NodeStack(16),
+      m_ws1(),
+      m_ws2() {
+  m_NodeStack.Push(m_pParent);
+}
+CFDE_XMLDOMParser::~CFDE_XMLDOMParser() {
+  m_NodeStack.RemoveAll();
+  m_ws1.Empty();
+  m_ws2.Empty();
+}
+int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) {
+  FX_DWORD dwRet;
+  int32_t iCount = 0;
+  while (TRUE) {
+    dwRet = m_pParser->DoSyntaxParse();
+    switch (dwRet) {
+      case FDE_XMLSYNTAXSTATUS_InstructionOpen:
+        break;
+      case FDE_XMLSYNTAXSTATUS_InstructionClose:
+        if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementOpen:
+      case FDE_XMLSYNTAXSTATUS_ElementBreak:
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementClose:
+        if (m_pChild->GetType() != FDE_XMLNODE_Element) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pParser->GetTagName(m_ws1);
+        ((CFDE_XMLElement*)m_pChild)->GetTagName(m_ws2);
+        if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_ws2) != 0) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_NodeStack.Pop();
+        if (m_NodeStack.GetSize() < 1) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement();
+        m_pChild = m_pParent;
+        iCount++;
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetName:
+        m_pParser->GetTargetName(m_ws1);
+        m_pChild = new CFDE_XMLInstruction(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_ws1.Empty();
+        break;
+      case FDE_XMLSYNTAXSTATUS_TagName:
+        m_pParser->GetTagName(m_ws1);
+        m_pChild = new CFDE_XMLElement(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_NodeStack.Push(m_pChild);
+        m_pParent = m_pChild;
+        break;
+      case FDE_XMLSYNTAXSTATUS_AttriName:
+        m_pParser->GetAttributeName(m_ws1);
+        break;
+      case FDE_XMLSYNTAXSTATUS_AttriValue:
+        if (m_pChild == NULL) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pParser->GetAttributeName(m_ws2);
+        if (m_pChild->GetType() == FDE_XMLNODE_Element) {
+          ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2);
+        } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) {
+          ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2);
+        }
+        m_ws1.Empty();
+        break;
+      case FDE_XMLSYNTAXSTATUS_Text:
+        m_pParser->GetTextData(m_ws1);
+        m_pChild = new CFDE_XMLText(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_CData:
+        m_pParser->GetTextData(m_ws1);
+        m_pChild = new CFDE_XMLCharData(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetData:
+        if (m_pChild == NULL ||
+            m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        if (!m_ws1.IsEmpty()) {
+          ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
+        }
+        m_pParser->GetTargetData(m_ws1);
+        ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
+        m_ws1.Empty();
+        break;
+      default:
+        break;
+    }
+    if (dwRet == FDE_XMLSYNTAXSTATUS_Error ||
+        dwRet == FDE_XMLSYNTAXSTATUS_EOS) {
+      break;
+    }
+    if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) {
+      break;
+    }
+  }
+  return m_pParser->GetStatus();
+}
+CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler,
+                                     IFDE_XMLSyntaxParser* pParser)
+    : m_pHandler(pHandler),
+      m_pParser(pParser),
+      m_TagStack(16),
+      m_pTagTop(NULL),
+      m_ws1(),
+      m_ws2() {}
+CFDE_XMLSAXParser::~CFDE_XMLSAXParser() {
+  m_TagStack.RemoveAll();
+  m_ws1.Empty();
+  m_ws2.Empty();
+}
+int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) {
+  FX_DWORD dwRet = 0;
+  int32_t iCount = 0;
+  while (TRUE) {
+    dwRet = m_pParser->DoSyntaxParse();
+    switch (dwRet) {
+      case FDE_XMLSYNTAXSTATUS_ElementBreak:
+        if (m_pTagTop == NULL) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        if (m_pTagTop->eType == FDE_XMLNODE_Element) {
+          m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName);
+        }
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementClose:
+        if (m_pTagTop == NULL || m_pTagTop->eType != FDE_XMLNODE_Element) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pParser->GetTagName(m_ws1);
+        if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_pTagTop->wsTagName) != 0) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        } else if (m_ws1.GetLength() == 0) {
+          m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName);
+        }
+        m_pHandler->OnTagClose(m_pHandler, m_pTagTop->wsTagName);
+        Pop();
+        iCount++;
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetName: {
+        m_pParser->GetTargetName(m_ws1);
+        CFDE_XMLTAG xmlTag;
+        xmlTag.wsTagName = m_ws1;
+        xmlTag.eType = FDE_XMLNODE_Instruction;
+        Push(xmlTag);
+        m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction,
+                               m_pTagTop->wsTagName);
+        m_ws1.Empty();
+      } break;
+      case FDE_XMLSYNTAXSTATUS_TagName: {
+        m_pParser->GetTargetName(m_ws1);
+        CFDE_XMLTAG xmlTag;
+        xmlTag.wsTagName = m_ws1;
+        xmlTag.eType = FDE_XMLNODE_Element;
+        Push(xmlTag);
+        m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element,
+                               m_pTagTop->wsTagName);
+      } break;
+      case FDE_XMLSYNTAXSTATUS_AttriName:
+        m_pParser->GetTargetName(m_ws1);
+        break;
+      case FDE_XMLSYNTAXSTATUS_AttriValue:
+        m_pParser->GetAttributeName(m_ws2);
+        if (m_pTagTop == NULL) {
+          dwRet = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        if (m_pTagTop->eType == FDE_XMLNODE_Element) {
+          m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2);
+        }
+        m_ws1.Empty();
+        break;
+      case FDE_XMLSYNTAXSTATUS_CData:
+        m_pParser->GetTextData(m_ws1);
+        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1);
+        break;
+      case FDE_XMLSYNTAXSTATUS_Text:
+        m_pParser->GetTextData(m_ws1);
+        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1);
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetData:
+        m_pParser->GetTargetData(m_ws1);
+        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1);
+        m_ws1.Empty();
+        break;
+      default:
+        break;
+    }
+    if (dwRet == FDE_XMLSYNTAXSTATUS_Error ||
+        dwRet == FDE_XMLSYNTAXSTATUS_EOS) {
+      break;
+    }
+    if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) {
+      break;
+    }
+  }
+  return m_pParser->GetStatus();
+}
+inline void CFDE_XMLSAXParser::Push(const CFDE_XMLTAG& xmlTag) {
+  m_TagStack.Push(xmlTag);
+  m_pTagTop = m_TagStack.GetTopElement();
+}
+inline void CFDE_XMLSAXParser::Pop() {
+  m_TagStack.Pop();
+  m_pTagTop = m_TagStack.GetTopElement();
+}
+
+CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep)
+    : m_iDataLength(0),
+      m_iBufferSize(0),
+      m_iAllocStep(iAllocStep),
+      m_iStartPosition(0) {}
+CFDE_BlockBuffer::~CFDE_BlockBuffer() {
+  ClearBuffer();
+}
+FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) {
+  iIndexInBlock = 0;
+  if (!m_BlockArray.GetSize()) {
+    return nullptr;
+  }
+  int32_t iRealIndex = m_iStartPosition + m_iDataLength;
+  if (iRealIndex == m_iBufferSize) {
+    FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
+    m_BlockArray.Add(pBlock);
+    m_iBufferSize += m_iAllocStep;
+    return pBlock;
+  }
+  iIndexInBlock = iRealIndex % m_iAllocStep;
+  return (FX_WCHAR*)m_BlockArray[iRealIndex / m_iAllocStep];
+}
+FX_BOOL CFDE_BlockBuffer::InitBuffer(int32_t iBufferSize) {
+  ClearBuffer();
+  int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1;
+  for (int32_t i = 0; i < iNumOfBlock; i++) {
+    m_BlockArray.Add(FX_Alloc(FX_WCHAR, m_iAllocStep));
+  }
+  m_iBufferSize = iNumOfBlock * m_iAllocStep;
+  return TRUE;
+}
+void CFDE_BlockBuffer::SetTextChar(int32_t iIndex, FX_WCHAR ch) {
+  if (iIndex < 0) {
+    return;
+  }
+  int32_t iRealIndex = m_iStartPosition + iIndex;
+  int32_t iBlockIndex = iRealIndex / m_iAllocStep;
+  int32_t iInnerIndex = iRealIndex % m_iAllocStep;
+  int32_t iBlockSize = m_BlockArray.GetSize();
+  if (iBlockIndex >= iBlockSize) {
+    int32_t iNewBlocks = iBlockIndex - iBlockSize + 1;
+    do {
+      FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
+      m_BlockArray.Add(pBlock);
+      m_iBufferSize += m_iAllocStep;
+    } while (--iNewBlocks);
+  }
+  FX_WCHAR* pTextData = (FX_WCHAR*)m_BlockArray[iBlockIndex];
+  *(pTextData + iInnerIndex) = ch;
+  if (m_iDataLength <= iIndex) {
+    m_iDataLength = iIndex + 1;
+  }
+}
+int32_t CFDE_BlockBuffer::DeleteTextChars(int32_t iCount, FX_BOOL bDirection) {
+  if (iCount <= 0) {
+    return m_iDataLength;
+  }
+  if (iCount >= m_iDataLength) {
+    Reset(FALSE);
+    return 0;
+  }
+  if (bDirection) {
+    m_iStartPosition += iCount;
+    m_iDataLength -= iCount;
+  } else {
+    m_iDataLength -= iCount;
+  }
+  return m_iDataLength;
+}
+void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData,
+                                   int32_t iStart,
+                                   int32_t iLength) const {
+  wsTextData.Empty();
+  int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition;
+  if (iStart < 0 || iStart > iMaybeDataLength) {
+    return;
+  }
+  if (iLength == -1 || iLength > iMaybeDataLength) {
+    iLength = iMaybeDataLength;
+  }
+  if (iLength <= 0) {
+    return;
+  }
+  FX_WCHAR* pBuf = wsTextData.GetBuffer(iLength);
+  if (!pBuf) {
+    return;
+  }
+  int32_t iStartBlockIndex = 0;
+  int32_t iStartInnerIndex = 0;
+  TextDataIndex2BufIndex(iStart, iStartBlockIndex, iStartInnerIndex);
+  int32_t iEndBlockIndex = 0;
+  int32_t iEndInnerIndex = 0;
+  TextDataIndex2BufIndex(iStart + iLength, iEndBlockIndex, iEndInnerIndex);
+  int32_t iPointer = 0;
+  for (int32_t i = iStartBlockIndex; i <= iEndBlockIndex; i++) {
+    int32_t iBufferPointer = 0;
+    int32_t iCopyLength = m_iAllocStep;
+    if (i == iStartBlockIndex) {
+      iCopyLength -= iStartInnerIndex;
+      iBufferPointer = iStartInnerIndex;
+    }
+    if (i == iEndBlockIndex) {
+      iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex);
+    }
+    FX_WCHAR* pBlockBuf = (FX_WCHAR*)m_BlockArray[i];
+    FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer,
+                 iCopyLength * sizeof(FX_WCHAR));
+    iPointer += iCopyLength;
+  }
+  wsTextData.ReleaseBuffer(iLength);
+}
+void CFDE_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex,
+                                              int32_t& iBlockIndex,
+                                              int32_t& iInnerIndex) const {
+  FXSYS_assert(iIndex >= 0);
+  int32_t iRealIndex = m_iStartPosition + iIndex;
+  iBlockIndex = iRealIndex / m_iAllocStep;
+  iInnerIndex = iRealIndex % m_iAllocStep;
+}
+void CFDE_BlockBuffer::ClearBuffer() {
+  m_iBufferSize = 0;
+  int32_t iSize = m_BlockArray.GetSize();
+  for (int32_t i = 0; i < iSize; i++) {
+    FX_Free(m_BlockArray[i]);
+    m_BlockArray[i] = NULL;
+  }
+  m_BlockArray.RemoveAll();
+}
+
+IFDE_XMLSyntaxParser* IFDE_XMLSyntaxParser::Create() {
+  return new CFDE_XMLSyntaxParser;
+}
+
+CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser()
+    : m_pStream(nullptr),
+      m_iXMLPlaneSize(-1),
+      m_iCurrentPos(0),
+      m_iCurrentNodeNum(-1),
+      m_iLastNodeNum(-1),
+      m_iParsedChars(0),
+      m_iParsedBytes(0),
+      m_pBuffer(nullptr),
+      m_iBufferChars(0),
+      m_bEOS(FALSE),
+      m_pStart(nullptr),
+      m_pEnd(nullptr),
+      m_XMLNodeStack(16),
+      m_iAllocStep(m_BlockBuffer.GetAllocStep()),
+      m_iDataLength(m_BlockBuffer.GetDataLengthRef()),
+      m_pCurrentBlock(nullptr),
+      m_iIndexInBlock(0),
+      m_iTextDataLength(0),
+      m_dwStatus(FDE_XMLSYNTAXSTATUS_None),
+      m_dwMode(FDE_XMLSYNTAXMODE_Text),
+      m_wQuotationMark(0),
+      m_iEntityStart(-1),
+      m_SkipStack(16) {
+  m_CurNode.iNodeNum = -1;
+  m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
+}
+void CFDE_XMLSyntaxParser::Init(IFX_Stream* pStream,
+                                int32_t iXMLPlaneSize,
+                                int32_t iTextDataSize) {
+  FXSYS_assert(m_pStream == NULL && m_pBuffer == NULL);
+  FXSYS_assert(pStream != NULL && iXMLPlaneSize > 0);
+  int32_t iStreamLength = pStream->GetLength();
+  FXSYS_assert(iStreamLength > 0);
+  m_pStream = pStream;
+  m_iXMLPlaneSize = std::min(iXMLPlaneSize, iStreamLength);
+  uint8_t bom[4];
+  m_iCurrentPos = m_pStream->GetBOM(bom);
+  FXSYS_assert(m_pBuffer == NULL);
+  m_pBuffer = FX_Alloc(FX_WCHAR, m_iXMLPlaneSize);
+  m_pStart = m_pEnd = m_pBuffer;
+  FXSYS_assert(!m_BlockBuffer.IsInitialized());
+  m_BlockBuffer.InitBuffer();
+  m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+  m_iParsedBytes = m_iParsedChars = 0;
+  m_iBufferChars = 0;
+}
+FX_DWORD CFDE_XMLSyntaxParser::DoSyntaxParse() {
+  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error ||
+      m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
+    return m_dwStatus;
+  }
+  FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized());
+  int32_t iStreamLength = m_pStream->GetLength();
+  int32_t iPos;
+  FX_WCHAR ch;
+  FX_DWORD dwStatus = FDE_XMLSYNTAXSTATUS_None;
+  while (TRUE) {
+    if (m_pStart >= m_pEnd) {
+      if (m_bEOS || m_iCurrentPos >= iStreamLength) {
+        m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
+        return m_dwStatus;
+      }
+      m_iParsedChars += (m_pEnd - m_pBuffer);
+      m_iParsedBytes = m_iCurrentPos;
+      if (m_pStream->GetPosition() != m_iCurrentPos) {
+        m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos);
+      }
+      m_iBufferChars =
+          m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS);
+      iPos = m_pStream->GetPosition();
+      if (m_iBufferChars < 1) {
+        m_iCurrentPos = iStreamLength;
+        m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
+        return m_dwStatus;
+      }
+      m_iCurrentPos = iPos;
+      m_pStart = m_pBuffer;
+      m_pEnd = m_pBuffer + m_iBufferChars;
+    }
+    while (m_pStart < m_pEnd) {
+      ch = *m_pStart;
+      switch (m_dwMode) {
+        case FDE_XMLSYNTAXMODE_Text:
+          if (ch == L'<') {
+            if (m_iDataLength > 0) {
+              m_iTextDataLength = m_iDataLength;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_iEntityStart = -1;
+              dwStatus = FDE_XMLSYNTAXSTATUS_Text;
+            } else {
+              m_pStart++;
+              m_dwMode = FDE_XMLSYNTAXMODE_Node;
+            }
+          } else {
+            ParseTextChar(ch);
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_Node:
+          if (ch == L'!') {
+            m_pStart++;
+            m_dwMode = FDE_XMLSYNTAXMODE_SkipCommentOrDecl;
+          } else if (ch == L'/') {
+            m_pStart++;
+            m_dwMode = FDE_XMLSYNTAXMODE_CloseElement;
+          } else if (ch == L'?') {
+            m_iLastNodeNum++;
+            m_iCurrentNodeNum = m_iLastNodeNum;
+            m_CurNode.iNodeNum = m_iLastNodeNum;
+            m_CurNode.eNodeType = FDE_XMLNODE_Instruction;
+            m_XMLNodeStack.Push(m_CurNode);
+            m_pStart++;
+            m_dwMode = FDE_XMLSYNTAXMODE_Target;
+            dwStatus = FDE_XMLSYNTAXSTATUS_InstructionOpen;
+          } else {
+            m_iLastNodeNum++;
+            m_iCurrentNodeNum = m_iLastNodeNum;
+            m_CurNode.iNodeNum = m_iLastNodeNum;
+            m_CurNode.eNodeType = FDE_XMLNODE_Element;
+            m_XMLNodeStack.Push(m_CurNode);
+            m_dwMode = FDE_XMLSYNTAXMODE_Tag;
+            dwStatus = FDE_XMLSYNTAXSTATUS_ElementOpen;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_Target:
+        case FDE_XMLSYNTAXMODE_Tag:
+          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
+            if (m_iDataLength < 1) {
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            } else {
+              m_iTextDataLength = m_iDataLength;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (m_dwMode != FDE_XMLSYNTAXMODE_Target) {
+                dwStatus = FDE_XMLSYNTAXSTATUS_TagName;
+              } else {
+                dwStatus = FDE_XMLSYNTAXSTATUS_TargetName;
+              }
+              m_dwMode = FDE_XMLSYNTAXMODE_AttriName;
+            }
+          } else {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = ch;
+            m_iDataLength++;
+            m_pStart++;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_AttriName:
+          if (m_iDataLength < 1 && FDE_IsXMLWhiteSpace(ch)) {
+            m_pStart++;
+            break;
+          }
+          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
+            if (m_iDataLength < 1) {
+              if (m_CurNode.eNodeType == FDE_XMLNODE_Element) {
+                if (ch == L'>' || ch == L'/') {
+                  m_dwMode = FDE_XMLSYNTAXMODE_BreakElement;
+                  break;
+                }
+              } else if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
+                if (ch == L'?') {
+                  m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction;
+                  m_pStart++;
+                } else {
+                  m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
+                }
+                break;
+              }
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            } else {
+              if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
+                if (ch != '=' && !FDE_IsXMLWhiteSpace(ch)) {
+                  m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
+                  break;
+                }
+              }
+              m_iTextDataLength = m_iDataLength;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_dwMode = FDE_XMLSYNTAXMODE_AttriEqualSign;
+              dwStatus = FDE_XMLSYNTAXSTATUS_AttriName;
+            }
+          } else {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = ch;
+            m_iDataLength++;
+            m_pStart++;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_AttriEqualSign:
+          if (FDE_IsXMLWhiteSpace(ch)) {
+            m_pStart++;
+            break;
+          }
+          if (ch != L'=') {
+            if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
+              m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
+              break;
+            }
+            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+            return m_dwStatus;
+          } else {
+            m_dwMode = FDE_XMLSYNTAXMODE_AttriQuotation;
+            m_pStart++;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_AttriQuotation:
+          if (FDE_IsXMLWhiteSpace(ch)) {
+            m_pStart++;
+            break;
+          }
+          if (ch != L'\"' && ch != L'\'') {
+            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+            return m_dwStatus;
+          } else {
+            m_wQuotationMark = ch;
+            m_dwMode = FDE_XMLSYNTAXMODE_AttriValue;
+            m_pStart++;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_AttriValue:
+          if (ch == m_wQuotationMark) {
+            if (m_iEntityStart > -1) {
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            }
+            m_iTextDataLength = m_iDataLength;
+            m_wQuotationMark = 0;
+            m_BlockBuffer.Reset();
+            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+            m_pStart++;
+            m_dwMode = FDE_XMLSYNTAXMODE_AttriName;
+            dwStatus = FDE_XMLSYNTAXSTATUS_AttriValue;
+          } else {
+            ParseTextChar(ch);
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_CloseInstruction:
+          if (ch != L'>') {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = ch;
+            m_iDataLength++;
+            m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
+          } else if (m_iDataLength > 0) {
+            m_iTextDataLength = m_iDataLength;
+            m_BlockBuffer.Reset();
+            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+            dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
+          } else {
+            m_pStart++;
+            FDE_XMLNODE* pXMLNode = m_XMLNodeStack.GetTopElement();
+            if (pXMLNode == NULL) {
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            }
+            m_XMLNodeStack.Pop();
+            pXMLNode = m_XMLNodeStack.GetTopElement();
+            if (pXMLNode == NULL) {
+              m_CurNode.iNodeNum = -1;
+              m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
+            } else {
+              m_CurNode = *pXMLNode;
+            }
+            m_iCurrentNodeNum = m_CurNode.iNodeNum;
+            m_BlockBuffer.Reset();
+            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+            m_dwMode = FDE_XMLSYNTAXMODE_Text;
+            dwStatus = FDE_XMLSYNTAXSTATUS_InstructionClose;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_BreakElement:
+          if (ch == L'>') {
+            m_dwMode = FDE_XMLSYNTAXMODE_Text;
+            dwStatus = FDE_XMLSYNTAXSTATUS_ElementBreak;
+          } else if (ch == L'/') {
+            m_dwMode = FDE_XMLSYNTAXMODE_CloseElement;
+          } else {
+            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+            return m_dwStatus;
+          }
+          m_pStart++;
+          break;
+        case FDE_XMLSYNTAXMODE_CloseElement:
+          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
+            if (ch == L'>') {
+              FDE_XMLNODE* pXMLNode = m_XMLNodeStack.GetTopElement();
+              if (pXMLNode == NULL) {
+                m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+                return m_dwStatus;
+              }
+              m_XMLNodeStack.Pop();
+              pXMLNode = m_XMLNodeStack.GetTopElement();
+              if (pXMLNode == NULL) {
+                m_CurNode.iNodeNum = -1;
+                m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
+              } else {
+                m_CurNode = *pXMLNode;
+              }
+              m_iCurrentNodeNum = m_CurNode.iNodeNum;
+              m_iTextDataLength = m_iDataLength;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_dwMode = FDE_XMLSYNTAXMODE_Text;
+              dwStatus = FDE_XMLSYNTAXSTATUS_ElementClose;
+            } else if (!FDE_IsXMLWhiteSpace(ch)) {
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            }
+          } else {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = ch;
+            m_iDataLength++;
+          }
+          m_pStart++;
+          break;
+        case FDE_XMLSYNTAXMODE_SkipCommentOrDecl:
+          if (ch == '-') {
+            m_dwMode = FDE_XMLSYNTAXMODE_SkipComment;
+          } else {
+            m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode;
+            m_SkipChar = L'>';
+            m_SkipStack.Push(L'>');
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_SkipDeclNode:
+          if (m_SkipChar == L'\'' || m_SkipChar == L'\"') {
+            m_pStart++;
+            if (ch != m_SkipChar) {
+              break;
+            }
+            m_SkipStack.Pop();
+            FX_DWORD* pDWord = m_SkipStack.GetTopElement();
+            if (pDWord == NULL) {
+              m_dwMode = FDE_XMLSYNTAXMODE_Text;
+            } else {
+              m_SkipChar = (FX_WCHAR)*pDWord;
+            }
+          } else {
+            switch (ch) {
+              case L'<':
+                m_SkipChar = L'>';
+                m_SkipStack.Push(L'>');
+                break;
+              case L'[':
+                m_SkipChar = L']';
+                m_SkipStack.Push(L']');
+                break;
+              case L'(':
+                m_SkipChar = L')';
+                m_SkipStack.Push(L')');
+                break;
+              case L'\'':
+                m_SkipChar = L'\'';
+                m_SkipStack.Push(L'\'');
+                break;
+              case L'\"':
+                m_SkipChar = L'\"';
+                m_SkipStack.Push(L'\"');
+                break;
+              default:
+                if (ch == m_SkipChar) {
+                  m_SkipStack.Pop();
+                  FX_DWORD* pDWord = m_SkipStack.GetTopElement();
+                  if (pDWord == NULL) {
+                    if (m_iDataLength >= 9) {
+                      CFX_WideString wsHeader;
+                      m_BlockBuffer.GetTextData(wsHeader, 0, 7);
+                      if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) {
+                        CFX_WideString wsTailer;
+                        m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2,
+                                                  2);
+                        if (wsTailer.Equal(FX_WSTRC(L"]]"))) {
+                          m_BlockBuffer.DeleteTextChars(7, TRUE);
+                          m_BlockBuffer.DeleteTextChars(2, FALSE);
+                          dwStatus = FDE_XMLSYNTAXSTATUS_CData;
+                        }
+                      }
+                    }
+                    m_iTextDataLength = m_iDataLength;
+                    m_BlockBuffer.Reset();
+                    m_pCurrentBlock =
+                        m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+                    m_dwMode = FDE_XMLSYNTAXMODE_Text;
+                  } else {
+                    m_SkipChar = (FX_WCHAR)*pDWord;
+                  }
+                }
+                break;
+            }
+            if (m_SkipStack.GetSize() > 0) {
+              if (m_iIndexInBlock == m_iAllocStep) {
+                m_pCurrentBlock =
+                    m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+                if (!m_pCurrentBlock) {
+                  return FDE_XMLSYNTAXSTATUS_Error;
+                }
+              }
+              m_pCurrentBlock[m_iIndexInBlock++] = ch;
+              m_iDataLength++;
+            }
+            m_pStart++;
+          }
+          break;
+        case FDE_XMLSYNTAXMODE_SkipComment:
+          if (ch == L'-') {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = L'-';
+            m_iDataLength++;
+          } else if (ch == L'>') {
+            if (m_iDataLength > 1) {
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_dwMode = FDE_XMLSYNTAXMODE_Text;
+            }
+          } else {
+            m_BlockBuffer.Reset();
+            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+          }
+          m_pStart++;
+          break;
+        case FDE_XMLSYNTAXMODE_TargetData:
+          if (FDE_IsXMLWhiteSpace(ch)) {
+            if (m_iDataLength < 1) {
+              m_pStart++;
+              break;
+            } else if (m_wQuotationMark == 0) {
+              m_iTextDataLength = m_iDataLength;
+              m_wQuotationMark = 0;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_pStart++;
+              dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
+              break;
+            }
+          }
+          if (ch == '?') {
+            m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction;
+            m_pStart++;
+          } else if (ch == '\"') {
+            if (m_wQuotationMark == 0) {
+              m_wQuotationMark = ch;
+              m_pStart++;
+            } else if (ch == m_wQuotationMark) {
+              m_iTextDataLength = m_iDataLength;
+              m_wQuotationMark = 0;
+              m_BlockBuffer.Reset();
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              m_pStart++;
+              dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
+            } else {
+              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+              return m_dwStatus;
+            }
+          } else {
+            if (m_iIndexInBlock == m_iAllocStep) {
+              m_pCurrentBlock =
+                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+              if (!m_pCurrentBlock) {
+                return FDE_XMLSYNTAXSTATUS_Error;
+              }
+            }
+            m_pCurrentBlock[m_iIndexInBlock++] = ch;
+            m_iDataLength++;
+            m_pStart++;
+          }
+          break;
+        default:
+          break;
+      }
+      if (dwStatus != FDE_XMLSYNTAXSTATUS_None) {
+        return dwStatus;
+      }
+    }
+  }
+  return 0;
+}
+
+CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() {
+  if (m_pCurrentBlock) {
+    m_pCurrentBlock = NULL;
+  }
+  FX_Free(m_pBuffer);
+}
+
+int32_t CFDE_XMLSyntaxParser::GetStatus() const {
+  if (m_pStream == NULL) {
+    return -1;
+  }
+  int32_t iStreamLength = m_pStream->GetLength();
+  if (iStreamLength < 1) {
+    return 100;
+  }
+  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) {
+    return -1;
+  }
+  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
+    return 100;
+  }
+  return m_iParsedBytes * 100 / iStreamLength;
+}
+static int32_t FX_GetUTF8EncodeLength(const FX_WCHAR* pSrc, int32_t iSrcLen) {
+  FX_DWORD unicode = 0;
+  int32_t iDstNum = 0;
+  while (iSrcLen-- > 0) {
+    unicode = *pSrc++;
+    int nbytes = 0;
+    if ((FX_DWORD)unicode < 0x80) {
+      nbytes = 1;
+    } else if ((FX_DWORD)unicode < 0x800) {
+      nbytes = 2;
+    } else if ((FX_DWORD)unicode < 0x10000) {
+      nbytes = 3;
+    } else if ((FX_DWORD)unicode < 0x200000) {
+      nbytes = 4;
+    } else if ((FX_DWORD)unicode < 0x4000000) {
+      nbytes = 5;
+    } else {
+      nbytes = 6;
+    }
+    iDstNum += nbytes;
+  }
+  return iDstNum;
+}
+FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const {
+  if (m_pStream == NULL) {
+    return 0;
+  }
+  int32_t nSrcLen = m_pStart - m_pBuffer;
+  int32_t nDstLen = FX_GetUTF8EncodeLength(m_pBuffer, nSrcLen);
+  return m_iParsedBytes + nDstLen;
+}
+
+void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) {
+  if (m_iIndexInBlock == m_iAllocStep) {
+    m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+    if (!m_pCurrentBlock) {
+      return;
+    }
+  }
+  m_pCurrentBlock[m_iIndexInBlock++] = ch;
+  m_iDataLength++;
+  if (m_iEntityStart > -1 && ch == L';') {
+    CFX_WideString csEntity;
+    m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1,
+                              (m_iDataLength - 1) - m_iEntityStart - 1);
+    int32_t iLen = csEntity.GetLength();
+    if (iLen > 0) {
+      if (csEntity[0] == L'#') {
+        ch = 0;
+        FX_WCHAR w;
+        if (iLen > 1 && csEntity[1] == L'x') {
+          for (int32_t i = 2; i < iLen; i++) {
+            w = csEntity[i];
+            if (w >= L'0' && w <= L'9') {
+              ch = (ch << 4) + w - L'0';
+            } else if (w >= L'A' && w <= L'F') {
+              ch = (ch << 4) + w - 55;
+            } else if (w >= L'a' && w <= L'f') {
+              ch = (ch << 4) + w - 87;
+            } else {
+              break;
+            }
+          }
+        } else {
+          for (int32_t i = 1; i < iLen; i++) {
+            w = csEntity[i];
+            if (w < L'0' || w > L'9') {
+              break;
+            }
+            ch = ch * 10 + w - L'0';
+          }
+        }
+        if (ch != 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, ch);
+          m_iEntityStart++;
+        }
+      } else {
+        if (csEntity.Compare(L"amp") == 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, L'&');
+          m_iEntityStart++;
+        } else if (csEntity.Compare(L"lt") == 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, L'<');
+          m_iEntityStart++;
+        } else if (csEntity.Compare(L"gt") == 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, L'>');
+          m_iEntityStart++;
+        } else if (csEntity.Compare(L"apos") == 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, L'\'');
+          m_iEntityStart++;
+        } else if (csEntity.Compare(L"quot") == 0) {
+          m_BlockBuffer.SetTextChar(m_iEntityStart, L'\"');
+          m_iEntityStart++;
+        }
+      }
+    }
+    m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE);
+    m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
+    m_iEntityStart = -1;
+  } else {
+    if (m_iEntityStart < 0 && ch == L'&') {
+      m_iEntityStart = m_iDataLength - 1;
+    }
+  }
+  m_pStart++;
+}
diff --git a/xfa/fde/xml/fde_xml_imp.h b/xfa/fde/xml/fde_xml_imp.h
new file mode 100644
index 0000000..79d77d9
--- /dev/null
+++ b/xfa/fde/xml/fde_xml_imp.h
@@ -0,0 +1,354 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FDE_XML_FDE_XML_IMP_H_
+#define XFA_FDE_XML_FDE_XML_IMP_H_
+
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fde/xml/fde_xml.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_stream.h"
+
+class CFDE_BlockBuffer;
+class CFDE_XMLInstruction;
+class CFDE_XMLElement;
+class CFDE_XMLText;
+class CFDE_XMLDoc;
+class IFDE_XMLParser;
+class CFDE_XMLDOMParser;
+class CFDE_XMLSAXParser;
+class CFDE_XMLSyntaxParser;
+
+class CFDE_XMLNode : public CFX_Target {
+ public:
+  CFDE_XMLNode();
+  virtual void Release() { delete this; }
+  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Unknown; }
+  virtual int32_t CountChildNodes() const;
+  virtual CFDE_XMLNode* GetChildNode(int32_t index) const;
+  virtual int32_t GetChildNodeIndex(CFDE_XMLNode* pNode) const;
+  virtual CFDE_XMLNode* GetPath(const FX_WCHAR* pPath,
+                                int32_t iLength = -1,
+                                FX_BOOL bQualifiedName = TRUE) const;
+  virtual int32_t InsertChildNode(CFDE_XMLNode* pNode, int32_t index = -1);
+  virtual void RemoveChildNode(CFDE_XMLNode* pNode);
+  virtual void DeleteChildren();
+  virtual CFDE_XMLNode* GetNodeItem(IFDE_XMLNode::NodeItem eItem) const;
+  virtual int32_t GetNodeLevel() const;
+  virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
+                                 CFDE_XMLNode* pNode);
+  virtual CFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem);
+  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
+  virtual void SaveXMLNode(IFX_Stream* pXMLStream);
+
+ public:
+  ~CFDE_XMLNode();
+  void CloneChildren(CFDE_XMLNode* pClone);
+  CFDE_XMLNode* m_pParent;
+  CFDE_XMLNode* m_pChild;
+  CFDE_XMLNode* m_pPrior;
+  CFDE_XMLNode* m_pNext;
+};
+class CFDE_XMLInstruction : public CFDE_XMLNode {
+ public:
+  CFDE_XMLInstruction(const CFX_WideString& wsTarget);
+  virtual void Release() { delete this; }
+  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Instruction; }
+  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
+  virtual void GetTargetName(CFX_WideString& wsTarget) const {
+    wsTarget = m_wsTarget;
+  }
+  virtual int32_t CountAttributes() const;
+  virtual FX_BOOL GetAttribute(int32_t index,
+                               CFX_WideString& wsAttriName,
+                               CFX_WideString& wsAttriValue) const;
+  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const;
+  virtual void GetString(const FX_WCHAR* pwsAttriName,
+                         CFX_WideString& wsAttriValue,
+                         const FX_WCHAR* pwsDefValue = NULL) const;
+  virtual void SetString(const CFX_WideString& wsAttriName,
+                         const CFX_WideString& wsAttriValue);
+  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
+                             int32_t iDefValue = 0) const;
+  virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue);
+  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
+                            FX_FLOAT fDefValue = 0) const;
+  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue);
+  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName);
+  virtual int32_t CountData() const;
+  virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const;
+  virtual void AppendData(const CFX_WideString& wsData);
+  virtual void RemoveData(int32_t index);
+
+ public:
+  ~CFDE_XMLInstruction() {}
+  CFX_WideString m_wsTarget;
+  CFX_WideStringArray m_Attributes;
+  CFX_WideStringArray m_TargetData;
+};
+class CFDE_XMLElement : public CFDE_XMLNode {
+ public:
+  CFDE_XMLElement(const CFX_WideString& wsTag);
+  virtual void Release() { delete this; }
+  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Element; }
+  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
+  virtual void GetTagName(CFX_WideString& wsTag) const;
+  virtual void GetLocalTagName(CFX_WideString& wsTag) const;
+  virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const;
+  virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const;
+  virtual int32_t CountAttributes() const;
+  virtual FX_BOOL GetAttribute(int32_t index,
+                               CFX_WideString& wsAttriName,
+                               CFX_WideString& wsAttriValue) const;
+  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const;
+  virtual void GetString(const FX_WCHAR* pwsAttriName,
+                         CFX_WideString& wsAttriValue,
+                         const FX_WCHAR* pwsDefValue = NULL) const;
+  virtual void SetString(const CFX_WideString& wsAttriName,
+                         const CFX_WideString& wsAttriValue);
+  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
+                             int32_t iDefValue = 0) const;
+  virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue);
+  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
+                            FX_FLOAT fDefValue = 0) const;
+  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue);
+  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName);
+  virtual void GetTextData(CFX_WideString& wsText) const;
+  virtual void SetTextData(const CFX_WideString& wsText);
+
+ public:
+  ~CFDE_XMLElement();
+  CFX_WideString m_wsTag;
+  CFX_WideStringArray m_Attributes;
+};
+class CFDE_XMLText : public CFDE_XMLNode {
+ public:
+  CFDE_XMLText(const CFX_WideString& wsText);
+  virtual void Release() { delete this; }
+  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Text; }
+  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
+  virtual void GetText(CFX_WideString& wsText) const { wsText = m_wsText; }
+  virtual void SetText(const CFX_WideString& wsText) { m_wsText = wsText; }
+
+ public:
+  ~CFDE_XMLText() {}
+  CFX_WideString m_wsText;
+};
+class CFDE_XMLDeclaration : public CFDE_XMLNode {
+ public:
+  CFDE_XMLDeclaration() : CFDE_XMLNode() {}
+};
+class CFDE_XMLCharData : public CFDE_XMLDeclaration {
+ public:
+  CFDE_XMLCharData(const CFX_WideString& wsCData);
+
+  virtual void Release() { delete this; }
+  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_CharData; }
+  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
+  virtual void GetCharData(CFX_WideString& wsCharData) const {
+    wsCharData = m_wsCharData;
+  }
+  virtual void SetCharData(const CFX_WideString& wsCData) {
+    m_wsCharData = wsCData;
+  }
+
+ public:
+  ~CFDE_XMLCharData() {}
+
+  CFX_WideString m_wsCharData;
+};
+class CFDE_XMLDoc : public CFX_Target {
+ public:
+  CFDE_XMLDoc();
+  ~CFDE_XMLDoc();
+  virtual void Release() { delete this; }
+  virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream,
+                          int32_t iXMLPlaneSize = 8192,
+                          int32_t iTextDataSize = 256,
+                          FDE_XMLREADERHANDLER* pHandler = NULL);
+  virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser);
+  virtual int32_t DoLoad(IFX_Pause* pPause = NULL);
+  virtual void CloseXML();
+  virtual CFDE_XMLNode* GetRoot() const { return m_pRoot; }
+  virtual void SaveXML(IFX_Stream* pXMLStream = NULL, FX_BOOL bSaveBOM = TRUE);
+  virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode);
+
+ protected:
+  IFX_Stream* m_pStream;
+  int32_t m_iStatus;
+  CFDE_XMLNode* m_pRoot;
+  IFDE_XMLSyntaxParser* m_pSyntaxParser;
+  IFDE_XMLParser* m_pXMLParser;
+  void Reset(FX_BOOL bInitRoot);
+  void ReleaseParser();
+};
+typedef CFX_StackTemplate<CFDE_XMLNode*> CFDE_XMLDOMNodeStack;
+class CFDE_XMLDOMParser : public IFDE_XMLParser, public CFX_Target {
+ public:
+  CFDE_XMLDOMParser(CFDE_XMLNode* pRoot, IFDE_XMLSyntaxParser* pParser);
+  ~CFDE_XMLDOMParser();
+
+  virtual void Release() { delete this; }
+  virtual int32_t DoParser(IFX_Pause* pPause);
+
+ private:
+  IFDE_XMLSyntaxParser* m_pParser;
+  CFDE_XMLNode* m_pParent;
+  CFDE_XMLNode* m_pChild;
+  CFDE_XMLDOMNodeStack m_NodeStack;
+  CFX_WideString m_ws1;
+  CFX_WideString m_ws2;
+};
+class CFDE_XMLTAG : public CFX_Target {
+ public:
+  CFDE_XMLTAG() : eType(FDE_XMLNODE_Unknown) {}
+  CFDE_XMLTAG(const CFDE_XMLTAG& src)
+      : wsTagName(src.wsTagName), eType(src.eType) {}
+  CFX_WideString wsTagName;
+  FDE_XMLNODETYPE eType;
+};
+typedef CFX_ObjectStackTemplate<CFDE_XMLTAG> CFDE_XMLTagStack;
+class CFDE_XMLSAXParser : public IFDE_XMLParser, public CFX_Target {
+ public:
+  CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler,
+                    IFDE_XMLSyntaxParser* pParser);
+  ~CFDE_XMLSAXParser();
+
+  virtual void Release() { delete this; }
+  virtual int32_t DoParser(IFX_Pause* pPause);
+
+ private:
+  void Push(const CFDE_XMLTAG& xmlTag);
+  void Pop();
+  FDE_XMLREADERHANDLER* m_pHandler;
+  IFDE_XMLSyntaxParser* m_pParser;
+  CFDE_XMLTagStack m_TagStack;
+  CFDE_XMLTAG* m_pTagTop;
+  CFX_WideString m_ws1;
+  CFX_WideString m_ws2;
+};
+
+class CFDE_BlockBuffer : public CFX_Target {
+ public:
+  CFDE_BlockBuffer(int32_t iAllocStep = 1024 * 1024);
+  ~CFDE_BlockBuffer();
+
+  FX_BOOL InitBuffer(int32_t iBufferSize = 1024 * 1024);
+  FX_BOOL IsInitialized() { return m_iBufferSize / m_iAllocStep >= 1; }
+  void ReleaseBuffer() { delete this; }
+  FX_WCHAR* GetAvailableBlock(int32_t& iIndexInBlock);
+  inline int32_t GetAllocStep() const { return m_iAllocStep; }
+  inline int32_t& GetDataLengthRef() { return m_iDataLength; }
+  inline void Reset(FX_BOOL bReserveData = TRUE) {
+    if (!bReserveData) {
+      m_iStartPosition = 0;
+    }
+    m_iDataLength = 0;
+  }
+  void SetTextChar(int32_t iIndex, FX_WCHAR ch);
+  int32_t DeleteTextChars(int32_t iCount, FX_BOOL bDirection = TRUE);
+  void GetTextData(CFX_WideString& wsTextData,
+                   int32_t iStart = 0,
+                   int32_t iLength = -1) const;
+
+ protected:
+  inline void TextDataIndex2BufIndex(const int32_t iIndex,
+                                     int32_t& iBlockIndex,
+                                     int32_t& iInnerIndex) const;
+  void ClearBuffer();
+  CFX_PtrArray m_BlockArray;
+  int32_t m_iDataLength;
+  int32_t m_iBufferSize;
+  int32_t m_iAllocStep;
+  int32_t m_iStartPosition;
+};
+
+#define FDE_XMLSYNTAXMODE_Text 0
+#define FDE_XMLSYNTAXMODE_Node 1
+#define FDE_XMLSYNTAXMODE_Target 2
+#define FDE_XMLSYNTAXMODE_Tag 3
+#define FDE_XMLSYNTAXMODE_AttriName 4
+#define FDE_XMLSYNTAXMODE_AttriEqualSign 5
+#define FDE_XMLSYNTAXMODE_AttriQuotation 6
+#define FDE_XMLSYNTAXMODE_AttriValue 7
+#define FDE_XMLSYNTAXMODE_Entity 8
+#define FDE_XMLSYNTAXMODE_EntityDecimal 9
+#define FDE_XMLSYNTAXMODE_EntityHex 10
+#define FDE_XMLSYNTAXMODE_CloseInstruction 11
+#define FDE_XMLSYNTAXMODE_BreakElement 12
+#define FDE_XMLSYNTAXMODE_CloseElement 13
+#define FDE_XMLSYNTAXMODE_SkipDeclNode 14
+#define FDE_XMLSYNTAXMODE_DeclCharData 15
+#define FDE_XMLSYNTAXMODE_SkipComment 16
+#define FDE_XMLSYNTAXMODE_SkipCommentOrDecl 17
+#define FDE_XMLSYNTAXMODE_TargetData 18
+class CFDE_XMLSyntaxParser : public IFDE_XMLSyntaxParser, public CFX_Target {
+ public:
+  CFDE_XMLSyntaxParser();
+  ~CFDE_XMLSyntaxParser();
+  virtual void Release() { delete this; }
+  virtual void Init(IFX_Stream* pStream,
+                    int32_t iXMLPlaneSize,
+                    int32_t iTextDataSize = 256);
+  virtual FX_DWORD DoSyntaxParse();
+  virtual int32_t GetStatus() const;
+  virtual int32_t GetCurrentPos() const {
+    return m_iParsedChars + (m_pStart - m_pBuffer);
+  }
+  virtual FX_FILESIZE GetCurrentBinaryPos() const;
+  virtual int32_t GetCurrentNodeNumber() const { return m_iCurrentNodeNum; }
+  virtual int32_t GetLastNodeNumber() const { return m_iLastNodeNum; }
+
+  virtual void GetTargetName(CFX_WideString& wsTarget) const {
+    m_BlockBuffer.GetTextData(wsTarget, 0, m_iTextDataLength);
+  }
+  virtual void GetTagName(CFX_WideString& wsTag) const {
+    m_BlockBuffer.GetTextData(wsTag, 0, m_iTextDataLength);
+  }
+  virtual void GetAttributeName(CFX_WideString& wsAttriName) const {
+    m_BlockBuffer.GetTextData(wsAttriName, 0, m_iTextDataLength);
+  }
+  virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const {
+    m_BlockBuffer.GetTextData(wsAttriValue, 0, m_iTextDataLength);
+  }
+  virtual void GetTextData(CFX_WideString& wsText) const {
+    m_BlockBuffer.GetTextData(wsText, 0, m_iTextDataLength);
+  }
+  virtual void GetTargetData(CFX_WideString& wsData) const {
+    m_BlockBuffer.GetTextData(wsData, 0, m_iTextDataLength);
+  }
+
+ protected:
+  IFX_Stream* m_pStream;
+  int32_t m_iXMLPlaneSize;
+  int32_t m_iCurrentPos;
+  int32_t m_iCurrentNodeNum;
+  int32_t m_iLastNodeNum;
+  int32_t m_iParsedChars;
+  int32_t m_iParsedBytes;
+  FX_WCHAR* m_pBuffer;
+  int32_t m_iBufferChars;
+  FX_BOOL m_bEOS;
+  FX_WCHAR* m_pStart;
+  FX_WCHAR* m_pEnd;
+  FDE_XMLNODE m_CurNode;
+  CFDE_XMLNodeStack m_XMLNodeStack;
+  CFDE_BlockBuffer m_BlockBuffer;
+  int32_t m_iAllocStep;
+  int32_t& m_iDataLength;
+  FX_WCHAR* m_pCurrentBlock;
+  int32_t m_iIndexInBlock;
+  int32_t m_iTextDataLength;
+  FX_DWORD m_dwStatus;
+  FX_DWORD m_dwMode;
+  FX_WCHAR m_wQuotationMark;
+  int32_t m_iEntityStart;
+  CFX_DWordStack m_SkipStack;
+  FX_WCHAR m_SkipChar;
+  inline void ParseTextChar(FX_WCHAR ch);
+};
+
+#endif  // XFA_FDE_XML_FDE_XML_IMP_H_
diff --git a/xfa/fee/fde_txtedtbuf.cpp b/xfa/fee/fde_txtedtbuf.cpp
new file mode 100644
index 0000000..6f638dd
--- /dev/null
+++ b/xfa/fee/fde_txtedtbuf.cpp
@@ -0,0 +1,403 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fde_txtedtbuf.h"
+
+#include <algorithm>
+
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+
+#define FDE_DEFCHUNKCOUNT 2
+#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
+#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
+#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
+
+CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias)
+    : m_pBuf(pBuf),
+      m_nCurChunk(0),
+      m_nCurIndex(0),
+      m_nIndex(0),
+      m_Alias(wcAlias) {
+  FXSYS_assert(m_pBuf);
+}
+CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() {}
+void CFDE_TxtEdtBufIter::Release() {
+  delete this;
+}
+FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev) {
+  if (bPrev) {
+    if (m_nIndex == 0) {
+      return FALSE;
+    }
+    FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
+    CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = NULL;
+    if (m_nCurIndex > 0) {
+      m_nCurIndex--;
+    } else {
+      while (m_nCurChunk > 0) {
+        --m_nCurChunk;
+        lpChunk =
+            (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+        if (lpChunk->nUsed > 0) {
+          m_nCurIndex = lpChunk->nUsed - 1;
+          break;
+        }
+      }
+    }
+    FXSYS_assert(m_nCurChunk >= 0);
+    m_nIndex--;
+    return TRUE;
+  } else {
+    if (m_nIndex >= (m_pBuf->m_nTotal - 1)) {
+      return FALSE;
+    }
+    FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
+    CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk =
+        (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+    if (lpChunk->nUsed != (m_nCurIndex + 1)) {
+      m_nCurIndex++;
+    } else {
+      int32_t nEnd = m_pBuf->m_Chunks.GetSize() - 1;
+      while (m_nCurChunk < nEnd) {
+        m_nCurChunk++;
+        CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunkTemp =
+            (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+        if (lpChunkTemp->nUsed > 0) {
+          m_nCurIndex = 0;
+          break;
+        }
+      }
+    }
+    m_nIndex++;
+    return TRUE;
+  }
+}
+void CFDE_TxtEdtBufIter::SetAt(int32_t nIndex) {
+  FXSYS_assert(nIndex >= 0 && nIndex < m_pBuf->m_nTotal);
+  CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp;
+  m_pBuf->Index2CP(nIndex, cp);
+  m_nIndex = nIndex;
+  m_nCurChunk = cp.nChunkIndex;
+  m_nCurIndex = cp.nCharIndex;
+}
+int32_t CFDE_TxtEdtBufIter::GetAt() const {
+  return m_nIndex;
+}
+FX_WCHAR CFDE_TxtEdtBufIter::GetChar() {
+  FXSYS_assert(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal);
+  if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1)) {
+    return ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])
+        ->wChars[m_nCurIndex];
+  }
+  return m_Alias;
+}
+FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail) const {
+  return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0;
+}
+IFX_CharIter* CFDE_TxtEdtBufIter::Clone() {
+  CFDE_TxtEdtBufIter* pIter = new CFDE_TxtEdtBufIter(m_pBuf);
+  pIter->m_nCurChunk = m_nCurChunk;
+  pIter->m_nCurIndex = m_nCurIndex;
+  pIter->m_nIndex = m_nIndex;
+  pIter->m_Alias = m_Alias;
+  return pIter;
+}
+CFDE_TxtEdtBuf::CFDE_TxtEdtBuf(int32_t nDefChunkSize)
+    : m_nChunkSize(nDefChunkSize),
+      m_nTotal(0),
+      m_bChanged(FALSE),
+      m_pAllocator(NULL) {
+  FXSYS_assert(m_nChunkSize);
+  ResetChunkBuffer(FDE_DEFCHUNKCOUNT, m_nChunkSize);
+}
+void CFDE_TxtEdtBuf::Release() {
+  delete this;
+}
+CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf() {
+  Clear(TRUE);
+  m_pAllocator->Release();
+  m_Chunks.RemoveAll();
+}
+FX_BOOL CFDE_TxtEdtBuf::SetChunkSize(int32_t nChunkSize) {
+  FXSYS_assert(nChunkSize);
+  ResetChunkBuffer(FDE_DEFCHUNKCOUNT, nChunkSize);
+  return TRUE;
+}
+int32_t CFDE_TxtEdtBuf::GetChunkSize() const {
+  return m_nChunkSize;
+}
+int32_t CFDE_TxtEdtBuf::GetTextLength() const {
+  return m_nTotal;
+}
+void CFDE_TxtEdtBuf::SetText(const CFX_WideString& wsText) {
+  FXSYS_assert(!wsText.IsEmpty());
+  Clear(FALSE);
+  int32_t nTextLength = wsText.GetLength();
+  int32_t nNeedCount =
+      ((nTextLength - 1) / m_nChunkSize + 1) - m_Chunks.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nNeedCount; i++) {
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
+        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+    lpChunk->nUsed = 0;
+    m_Chunks.Add(lpChunk);
+  }
+  int32_t nTotalCount = m_Chunks.GetSize();
+  const FX_WCHAR* lpSrcBuf = wsText.c_str();
+  int32_t nLeave = nTextLength;
+  int32_t nCopyedLength = m_nChunkSize;
+  for (i = 0; i < nTotalCount && nLeave > 0; i++) {
+    if (nLeave < nCopyedLength) {
+      nCopyedLength = nLeave;
+    }
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+    FXSYS_memcpy(lpChunk->wChars, lpSrcBuf, nCopyedLength * sizeof(FX_WCHAR));
+    nLeave -= nCopyedLength;
+    lpSrcBuf += nCopyedLength;
+    lpChunk->nUsed = nCopyedLength;
+  }
+  m_nTotal = nTextLength;
+  m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::GetText(CFX_WideString& wsText) const {
+  GetRange(wsText, 0, m_nTotal);
+}
+FX_WCHAR CFDE_TxtEdtBuf::GetCharByIndex(int32_t nIndex) const {
+  FXSYS_assert(nIndex >= 0 && nIndex < GetTextLength());
+  FDE_LPCHUNKHEADER pChunkHeader = NULL;
+  int32_t nTotal = 0;
+  int32_t nCount = m_Chunks.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    pChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[i];
+    nTotal += pChunkHeader->nUsed;
+    if (nTotal > nIndex) {
+      break;
+    }
+  }
+  FXSYS_assert(pChunkHeader);
+  return pChunkHeader->wChars[pChunkHeader->nUsed - (nTotal - nIndex)];
+}
+void CFDE_TxtEdtBuf::GetRange(CFX_WideString& wsText,
+                              int32_t nBegin,
+                              int32_t nLength) const {
+  FDE_CHUNKPLACE cp;
+  Index2CP(nBegin, cp);
+  int32_t nLeave = nLength;
+  int32_t nCount = m_Chunks.GetSize();
+  FX_WCHAR* lpDstBuf = wsText.GetBuffer(nLength);
+  int32_t nChunkIndex = cp.nChunkIndex;
+  FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
+  int32_t nCopyLength = lpChunkHeader->nUsed - cp.nCharIndex;
+  FX_WCHAR* lpSrcBuf = lpChunkHeader->wChars + cp.nCharIndex;
+  while (nLeave > 0) {
+    if (nLeave <= nCopyLength) {
+      nCopyLength = nLeave;
+    }
+    FXSYS_memcpy(lpDstBuf, lpSrcBuf, nCopyLength * sizeof(FX_WCHAR));
+    nChunkIndex++;
+    if (nChunkIndex >= nCount) {
+      break;
+    }
+    lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
+    lpSrcBuf = lpChunkHeader->wChars;
+    nLeave -= nCopyLength;
+    lpDstBuf += nCopyLength;
+    nCopyLength = lpChunkHeader->nUsed;
+  }
+  wsText.ReleaseBuffer();
+}
+void CFDE_TxtEdtBuf::Insert(int32_t nPos,
+                            const FX_WCHAR* lpText,
+                            int32_t nLength) {
+  FXSYS_assert(nPos >= 0 && nPos <= m_nTotal);
+  FDE_CHUNKPLACE cp;
+  Index2CP(nPos, cp);
+  int32_t nLengthTemp = nLength;
+  if (cp.nCharIndex != 0) {
+    FDE_LPCHUNKHEADER lpNewChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
+        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex];
+    int32_t nCopy = lpChunk->nUsed - cp.nCharIndex;
+    FXSYS_memcpy(lpNewChunk->wChars, lpChunk->wChars + cp.nCharIndex,
+                 nCopy * sizeof(FX_WCHAR));
+    lpChunk->nUsed -= nCopy;
+    cp.nChunkIndex++;
+    m_Chunks.InsertAt(cp.nChunkIndex, lpNewChunk);
+    lpNewChunk->nUsed = nCopy;
+    cp.nCharIndex = 0;
+  }
+  if (cp.nChunkIndex != 0) {
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex - 1];
+    if (lpChunk->nUsed != m_nChunkSize) {
+      cp.nChunkIndex--;
+      int32_t nFree = m_nChunkSize - lpChunk->nUsed;
+      int32_t nCopy = std::min(nLengthTemp, nFree);
+      FXSYS_memcpy(lpChunk->wChars + lpChunk->nUsed, lpText,
+                   nCopy * sizeof(FX_WCHAR));
+      lpText += nCopy;
+      nLengthTemp -= nCopy;
+      lpChunk->nUsed += nCopy;
+      cp.nChunkIndex++;
+    }
+  }
+  while (nLengthTemp > 0) {
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
+        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+    FXSYS_assert(lpChunk);
+    int32_t nCopy = std::min(nLengthTemp, m_nChunkSize);
+    FXSYS_memcpy(lpChunk->wChars, lpText, nCopy * sizeof(FX_WCHAR));
+    lpText += nCopy;
+    nLengthTemp -= nCopy;
+    lpChunk->nUsed = nCopy;
+    m_Chunks.InsertAt(cp.nChunkIndex, lpChunk);
+    cp.nChunkIndex++;
+  }
+  m_nTotal += nLength;
+  m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::Delete(int32_t nIndex, int32_t nLength) {
+  FXSYS_assert(nLength > 0 && nIndex >= 0 && nIndex + nLength <= m_nTotal);
+  FDE_CHUNKPLACE cpEnd;
+  Index2CP(nIndex + nLength - 1, cpEnd);
+  m_nTotal -= nLength;
+  FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
+  int32_t nFirstPart = cpEnd.nCharIndex + 1;
+  int32_t nMovePart = lpChunk->nUsed - nFirstPart;
+  if (nMovePart != 0) {
+    int32_t nDelete = std::min(nFirstPart, nLength);
+    FXSYS_memmove(lpChunk->wChars + nFirstPart - nDelete,
+                  lpChunk->wChars + nFirstPart, nMovePart * sizeof(FX_WCHAR));
+    lpChunk->nUsed -= nDelete;
+    nLength -= nDelete;
+    cpEnd.nChunkIndex--;
+  }
+  while (nLength > 0) {
+    lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
+    int32_t nDeleted = std::min(lpChunk->nUsed, nLength);
+    lpChunk->nUsed -= nDeleted;
+    if (lpChunk->nUsed == 0) {
+      m_pAllocator->Free(lpChunk);
+      m_Chunks.RemoveAt(cpEnd.nChunkIndex);
+      lpChunk = NULL;
+    }
+    nLength -= nDeleted;
+    cpEnd.nChunkIndex--;
+  }
+  m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::Clear(FX_BOOL bRelease) {
+  int32_t i = 0;
+  int32_t nCount = m_Chunks.GetSize();
+  if (bRelease) {
+    while (i < nCount) {
+      m_pAllocator->Free(m_Chunks[i++]);
+    }
+    m_Chunks.RemoveAll();
+  } else {
+    while (i < nCount) {
+      ((FDE_LPCHUNKHEADER)m_Chunks[i++])->nUsed = 0;
+    }
+  }
+  m_nTotal = 0;
+  m_bChanged = TRUE;
+}
+FX_BOOL CFDE_TxtEdtBuf::Optimize(IFX_Pause* pPause) {
+  if (m_bChanged == FALSE) {
+    return TRUE;
+  }
+  if (m_nTotal == 0) {
+    return TRUE;
+  }
+  int32_t nCount = m_Chunks.GetSize();
+  if (nCount == 0) {
+    return TRUE;
+  }
+  int32_t i = 0;
+  for (; i < nCount; i++) {
+    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+    if (lpChunk->nUsed == 0) {
+      m_pAllocator->Free(lpChunk);
+      m_Chunks.RemoveAt(i);
+      --i;
+      --nCount;
+    }
+  }
+  if (pPause != NULL && pPause->NeedToPauseNow()) {
+    return FALSE;
+  }
+  FDE_LPCHUNKHEADER lpPreChunk = (FDE_LPCHUNKHEADER)m_Chunks[0];
+  FDE_LPCHUNKHEADER lpCurChunk = NULL;
+  for (i = 1; i < nCount; i++) {
+    lpCurChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+    if (lpPreChunk->nUsed + lpCurChunk->nUsed <= m_nChunkSize) {
+      FXSYS_memcpy(lpPreChunk->wChars + lpPreChunk->nUsed, lpCurChunk->wChars,
+                   lpCurChunk->nUsed * sizeof(FX_WCHAR));
+      lpPreChunk->nUsed += lpCurChunk->nUsed;
+      m_pAllocator->Free(lpCurChunk);
+      m_Chunks.RemoveAt(i);
+      --i;
+      --nCount;
+    } else {
+      lpPreChunk = lpCurChunk;
+    }
+    if (pPause != NULL && pPause->NeedToPauseNow()) {
+      return FALSE;
+    }
+  }
+  m_bChanged = FALSE;
+  return TRUE;
+}
+void CFDE_TxtEdtBuf::ResetChunkBuffer(int32_t nDefChunkCount,
+                                      int32_t nChunkSize) {
+  FXSYS_assert(nChunkSize);
+  FXSYS_assert(nDefChunkCount);
+  if (m_pAllocator) {
+    m_pAllocator->Release();
+    m_pAllocator = NULL;
+  }
+  m_Chunks.RemoveAll();
+  m_nChunkSize = nChunkSize;
+  int32_t nChunkLength =
+      sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR);
+  m_pAllocator =
+      FX_CreateAllocator(FX_ALLOCTYPE_Fixed, nDefChunkCount, nChunkLength);
+  FXSYS_assert(m_pAllocator);
+  FDE_LPCHUNKHEADER lpChunkHeader =
+      (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(nChunkLength);
+  FXSYS_assert(lpChunkHeader);
+  lpChunkHeader->nUsed = 0;
+  m_Chunks.Add(lpChunkHeader);
+  m_nTotal = 0;
+}
+int32_t CFDE_TxtEdtBuf::CP2Index(const FDE_CHUNKPLACE& cp) const {
+  int32_t nTotal = cp.nCharIndex;
+  int32_t i = 0;
+  for (i = 0; i < cp.nChunkIndex; i++) {
+    nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
+  }
+  return nTotal;
+}
+void CFDE_TxtEdtBuf::Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const {
+  FXSYS_assert(nIndex <= GetTextLength());
+  if (nIndex == m_nTotal) {
+    cp.nChunkIndex = m_Chunks.GetSize() - 1;
+    cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex])->nUsed;
+    return;
+  }
+  int32_t i = 0;
+  int32_t nTotal = 0;
+  int32_t nCount = m_Chunks.GetSize();
+  for (; i < nCount; i++) {
+    nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
+    if (nTotal > nIndex) {
+      break;
+    }
+  }
+  cp.nChunkIndex = i;
+  cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed - (nTotal - nIndex);
+}
diff --git a/xfa/fee/fde_txtedtbuf.h b/xfa/fee/fde_txtedtbuf.h
new file mode 100644
index 0000000..e0598f5
--- /dev/null
+++ b/xfa/fee/fde_txtedtbuf.h
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FDE_TXTEDTBUF_H_
+#define XFA_FEE_FDE_TXTEDTBUF_H_
+
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class IFX_CharIter;
+class CFDE_TxtEdtBuf;
+
+class CFDE_TxtEdtBufIter : public IFX_CharIter {
+ public:
+  CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias = 0);
+
+  virtual void Release();
+  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
+  virtual FX_WCHAR GetChar();
+  virtual void SetAt(int32_t nIndex);
+  virtual int32_t GetAt() const;
+  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
+  virtual IFX_CharIter* Clone();
+
+ protected:
+  ~CFDE_TxtEdtBufIter();
+
+ private:
+  CFDE_TxtEdtBuf* m_pBuf;
+  int32_t m_nCurChunk;
+  int32_t m_nCurIndex;
+  int32_t m_nIndex;
+  FX_WCHAR m_Alias;
+};
+class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf {
+  friend class CFDE_TxtEdtBufIter;
+  struct _FDE_CHUNKHEADER {
+    int32_t nUsed;
+    FX_WCHAR wChars[1];
+  };
+  typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER;
+  typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER;
+  struct _FDE_CHUNKPLACE {
+    int32_t nChunkIndex;
+    int32_t nCharIndex;
+  };
+  typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE;
+  typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE;
+
+ public:
+  CFDE_TxtEdtBuf(int32_t nDefChunkSize = FDE_DEFCHUNKLENGTH);
+
+  virtual void Release();
+  virtual FX_BOOL SetChunkSize(int32_t nChunkSize);
+  virtual int32_t GetChunkSize() const;
+  virtual int32_t GetTextLength() const;
+  virtual void SetText(const CFX_WideString& wsText);
+  virtual void GetText(CFX_WideString& wsText) const;
+  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const;
+  virtual void GetRange(CFX_WideString& wsText,
+                        int32_t nBegine,
+                        int32_t nCount = -1) const;
+
+  virtual void Insert(int32_t nPos,
+                      const FX_WCHAR* lpText,
+                      int32_t nLength = 1);
+  virtual void Delete(int32_t nIndex, int32_t nLength = 1);
+  virtual void Clear(FX_BOOL bRelease = TRUE);
+
+  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);
+
+ protected:
+  virtual ~CFDE_TxtEdtBuf();
+
+ private:
+  void ResetChunkBuffer(int32_t nDefChunkCount, int32_t nChunkSize);
+  int32_t CP2Index(const FDE_CHUNKPLACE& cp) const;
+  void Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const;
+
+  int32_t m_nChunkSize;
+
+  int32_t m_nTotal;
+  FX_BOOL m_bChanged;
+  CFX_PtrArray m_Chunks;
+  IFX_MEMAllocator* m_pAllocator;
+};
+
+#endif  // XFA_FEE_FDE_TXTEDTBUF_H_
diff --git a/xfa/fee/fde_txtedtengine.cpp b/xfa/fee/fde_txtedtengine.cpp
new file mode 100644
index 0000000..3afd20c
--- /dev/null
+++ b/xfa/fee/fde_txtedtengine.cpp
@@ -0,0 +1,1783 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fde_txtedtengine.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fee/fde_txtedtbuf.h"
+#include "xfa/fee/fde_txtedtparag.h"
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+#include "xfa/fee/ifde_txtedtpage.h"
+
+#define FDE_PAGEWIDTH_MAX 0xFFFF
+#define FDE_TXTPLATESIZE (1024 * 12)
+#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029)
+#define FDE_TXTEDT_DORECORD_INS 0
+#define FDE_TXTEDT_DORECORD_DEL 1
+
+IFDE_TxtEdtEngine* IFDE_TxtEdtEngine::Create() {
+  return new CFDE_TxtEdtEngine();
+}
+CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
+    : m_pTextBreak(nullptr),
+      m_nPageLineCount(20),
+      m_nLineCount(0),
+      m_nAnchorPos(-1),
+      m_nLayoutPos(0),
+      m_fCaretPosReserve(0.0),
+      m_nCaret(0),
+      m_bBefore(TRUE),
+      m_nCaretPage(0),
+      m_dwFindFlags(0),
+      m_bLock(FALSE),
+      m_nLimit(0),
+      m_wcAliasChar(L'*'),
+      m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto),
+      m_bAutoLineEnd(TRUE),
+      m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR) {
+  FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
+  m_pTxtBuf = new CFDE_TxtEdtBuf();
+  m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+}
+CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
+  if (m_pTxtBuf) {
+    m_pTxtBuf->Release();
+    m_pTxtBuf = NULL;
+  }
+  if (m_pTextBreak) {
+    m_pTextBreak->Release();
+    m_pTextBreak = NULL;
+  }
+  RemoveAllParags();
+  RemoveAllPages();
+  m_Param.pEventSink = NULL;
+  ClearSelection();
+}
+void CFDE_TxtEdtEngine::Release() {
+  delete this;
+}
+void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
+  if (m_pTextBreak == NULL) {
+    m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
+  }
+  FXSYS_memcpy(&m_Param, &params, sizeof(FDE_TXTEDTPARAMS));
+  m_wLineEnd = params.wLineBreakChar;
+  m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+  UpdateTxtBreak();
+}
+const FDE_TXTEDTPARAMS* CFDE_TxtEdtEngine::GetEditParams() const {
+  return &m_Param;
+}
+int32_t CFDE_TxtEdtEngine::CountPages() const {
+  if (m_nLineCount == 0) {
+    return 0;
+  }
+  return ((m_nLineCount - 1) / m_nPageLineCount) + 1;
+}
+IFDE_TxtEdtPage* CFDE_TxtEdtEngine::GetPage(int32_t nIndex) {
+  if (m_PagePtrArray.GetSize() <= nIndex) {
+    return NULL;
+  }
+  return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex];
+}
+FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(int32_t nChunkSize) {
+  return m_pTxtBuf->SetChunkSize(nChunkSize);
+}
+void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream* pStream) {
+  ResetEngine();
+  int32_t nIndex = 0;
+  if (pStream != NULL && pStream->GetLength()) {
+    int32_t nStreamLength = pStream->GetLength();
+    FX_BOOL bValid = TRUE;
+    if (m_nLimit > 0 && nStreamLength > m_nLimit) {
+      bValid = FALSE;
+    }
+    FX_BOOL bPreIsCR = FALSE;
+    if (bValid) {
+      uint8_t bom[4];
+      int32_t nPos = pStream->GetBOM(bom);
+      pStream->Seek(FX_STREAMSEEK_Begin, nPos);
+      int32_t nPlateSize = std::min(nStreamLength, m_pTxtBuf->GetChunkSize());
+      FX_WCHAR* lpwstr = FX_Alloc(FX_WCHAR, nPlateSize);
+      FX_BOOL bEos = false;
+      while (!bEos) {
+        int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, bEos);
+        bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR);
+        m_pTxtBuf->Insert(nIndex, lpwstr, nRead);
+        nIndex += nRead;
+      }
+      FX_Free(lpwstr);
+    }
+  }
+  m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1);
+  RebuildParagraphs();
+}
+void CFDE_TxtEdtEngine::SetText(const CFX_WideString& wsText) {
+  ResetEngine();
+  int32_t nLength = wsText.GetLength();
+  if (nLength > 0) {
+    CFX_WideString wsTemp;
+    FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
+    FXSYS_memcpy(lpBuffer, wsText.c_str(), nLength * sizeof(FX_WCHAR));
+    ReplaceParagEnd(lpBuffer, nLength, FALSE);
+    wsTemp.ReleaseBuffer(nLength);
+    if (m_nLimit > 0 && nLength > m_nLimit) {
+      wsTemp.Delete(m_nLimit, nLength - m_nLimit);
+      nLength = m_nLimit;
+    }
+    m_pTxtBuf->SetText(wsTemp);
+  }
+  m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1);
+  RebuildParagraphs();
+}
+int32_t CFDE_TxtEdtEngine::GetTextLength() const {
+  return GetTextBufLength();
+}
+void CFDE_TxtEdtEngine::GetText(CFX_WideString& wsText,
+                                int32_t nStart,
+                                int32_t nCount) {
+  int32_t nTextBufLength = GetTextBufLength();
+  if (nCount == -1) {
+    nCount = nTextBufLength - nStart;
+  }
+  m_pTxtBuf->GetRange(wsText, nStart, nCount);
+  RecoverParagEnd(wsText);
+}
+
+void CFDE_TxtEdtEngine::ClearText() {
+  DeleteRange(0, -1);
+}
+int32_t CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret) const {
+  rtCaret = m_rtCaret;
+  return m_nCaret;
+}
+int32_t CFDE_TxtEdtEngine::GetCaretPos() const {
+  if (IsLocked()) {
+    return 0;
+  }
+  return m_nCaret + (m_bBefore ? 0 : 1);
+}
+int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
+  if (IsLocked()) {
+    return 0;
+  }
+  FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength());
+  if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
+    return 0;
+  }
+  m_bBefore = bBefore;
+  m_nCaret = nIndex;
+  MovePage2Char(m_nCaret);
+  GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
+  if (!m_bBefore) {
+    m_nCaret++;
+    m_bBefore = TRUE;
+  }
+  m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
+                           ? m_rtCaret.top
+                           : m_rtCaret.left;
+  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
+  m_nAnchorPos = -1;
+  return m_nCaret;
+}
+int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
+                                        FX_BOOL bShift,
+                                        FX_BOOL bCtrl) {
+  if (IsLocked()) {
+    return 0;
+  }
+  if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
+    return 0;
+  }
+  FX_BOOL bSelChange = FALSE;
+  if (IsSelect()) {
+    ClearSelection();
+    bSelChange = TRUE;
+  }
+  if (bShift) {
+    if (m_nAnchorPos == -1) {
+      m_nAnchorPos = m_nCaret;
+    }
+  } else {
+    m_nAnchorPos = -1;
+  }
+  FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
+  switch (eMoveCaret) {
+    case MC_Left: {
+      if (bVertical) {
+        CFX_PointF ptCaret;
+        if (MoveUp(ptCaret)) {
+          UpdateCaretIndex(ptCaret);
+        }
+      } else {
+        FX_BOOL bBefore = TRUE;
+        int32_t nIndex = MoveBackward(bBefore);
+        if (nIndex >= 0) {
+          UpdateCaretRect(nIndex, bBefore);
+        }
+      }
+    } break;
+    case MC_Right: {
+      if (bVertical) {
+        CFX_PointF ptCaret;
+        if (MoveDown(ptCaret)) {
+          UpdateCaretIndex(ptCaret);
+        }
+      } else {
+        FX_BOOL bBefore = TRUE;
+        int32_t nIndex = MoveForward(bBefore);
+        if (nIndex >= 0) {
+          UpdateCaretRect(nIndex, bBefore);
+        }
+      }
+    } break;
+    case MC_Up: {
+      if (bVertical) {
+        FX_BOOL bBefore = TRUE;
+        int32_t nIndex = MoveBackward(bBefore);
+        if (nIndex >= 0) {
+          UpdateCaretRect(nIndex, bBefore);
+        }
+      } else {
+        CFX_PointF ptCaret;
+        if (MoveUp(ptCaret)) {
+          UpdateCaretIndex(ptCaret);
+        }
+      }
+    } break;
+    case MC_Down: {
+      if (bVertical) {
+        FX_BOOL bBefore = TRUE;
+        int32_t nIndex = MoveForward(bBefore);
+        if (nIndex >= 0) {
+          UpdateCaretRect(nIndex, bBefore);
+        }
+      } else {
+        CFX_PointF ptCaret;
+        if (MoveDown(ptCaret)) {
+          UpdateCaretIndex(ptCaret);
+        }
+      }
+    } break;
+    case MC_WordBackward:
+      break;
+    case MC_WordForward:
+      break;
+    case MC_LineStart:
+      MoveLineStart();
+      break;
+    case MC_LineEnd:
+      MoveLineEnd();
+      break;
+    case MC_ParagStart:
+      MoveParagStart();
+      break;
+    case MC_ParagEnd:
+      MoveParagEnd();
+      break;
+    case MC_PageDown:
+      break;
+    case MC_PageUp:
+      break;
+    case MC_Home:
+      MoveHome();
+      break;
+    case MC_End:
+      MoveEnd();
+      break;
+    default:
+      break;
+  }
+  if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) {
+    AddSelRange(std::min(m_nAnchorPos, m_nCaret),
+                FXSYS_abs(m_nAnchorPos - m_nCaret));
+    m_Param.pEventSink->On_SelChanged(this);
+  }
+  if (bSelChange) {
+    m_Param.pEventSink->On_SelChanged(this);
+  }
+  return m_nCaret;
+}
+void CFDE_TxtEdtEngine::Lock() {
+  m_bLock = TRUE;
+}
+void CFDE_TxtEdtEngine::Unlock() {
+  m_bLock = FALSE;
+}
+FX_BOOL CFDE_TxtEdtEngine::IsLocked() const {
+  return m_bLock;
+}
+int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart,
+                                  const FX_WCHAR* lpText,
+                                  int32_t nLength) {
+  if (IsLocked()) {
+    return FDE_TXTEDT_MODIFY_RET_F_Locked;
+  }
+  CFX_WideString wsTemp;
+  FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
+  FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
+  ReplaceParagEnd(lpBuffer, nLength, FALSE);
+  wsTemp.ReleaseBuffer(nLength);
+  FX_BOOL bPart = FALSE;
+  if (m_nLimit > 0) {
+    int32_t nTotalLength = GetTextBufLength();
+    int32_t nCount = m_SelRangePtrArr.GetSize();
+    for (int32_t i = 0; i < nCount; i++) {
+      FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i);
+      nTotalLength -= lpSelRange->nCount;
+    }
+    int32_t nExpectLength = nTotalLength + nLength;
+    if (nTotalLength == m_nLimit) {
+      return FDE_TXTEDT_MODIFY_RET_F_Full;
+    }
+    if (nExpectLength > m_nLimit) {
+      nLength -= (nExpectLength - m_nLimit);
+      bPart = TRUE;
+    }
+  }
+  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) ||
+      (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
+    int32_t nTemp = nLength;
+    if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) {
+      CFX_WideString wsText;
+      while (nLength > 0) {
+        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+        int32_t nTotal = wsText.GetLength();
+        FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal);
+        for (int32_t i = 0; i < nTotal; i++) {
+          lpBuf[i] = m_wcAliasChar;
+        }
+        wsText.ReleaseBuffer(nTotal);
+        if (IsFitArea(wsText)) {
+          break;
+        }
+        nLength--;
+      }
+    } else {
+      CFX_WideString wsText;
+      while (nLength > 0) {
+        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+        if (IsFitArea(wsText)) {
+          break;
+        }
+        nLength--;
+      }
+    }
+    if (nLength == 0) {
+      return FDE_TXTEDT_MODIFY_RET_F_Full;
+    }
+    if (nLength < nTemp) {
+      bPart = TRUE;
+    }
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+    CFX_WideString wsText;
+    GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+    }
+  }
+  if (IsSelect()) {
+    DeleteSelect();
+  }
+  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+    IFDE_TxtEdtDoRecord* pRecord =
+        new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength);
+    CFX_ByteString bsDoRecord;
+    pRecord->Serialize(bsDoRecord);
+    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+    pRecord->Release();
+  }
+  GetText(m_ChangeInfo.wsPrevText, 0);
+  Inner_Insert(m_nCaret, lpBuffer, nLength);
+  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+  m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength);
+  nStart = m_nCaret;
+  nStart += nLength;
+  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
+  FX_BOOL bBefore = TRUE;
+  if (wChar != L'\n' && wChar != L'\r') {
+    nStart--;
+    bBefore = FALSE;
+  }
+  SetCaretPos(nStart, bBefore);
+  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+  return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, FX_BOOL bBackspace) {
+  if (IsLocked()) {
+    return FDE_TXTEDT_MODIFY_RET_F_Locked;
+  }
+  if (IsSelect()) {
+    DeleteSelect();
+    return FDE_TXTEDT_MODIFY_RET_S_Normal;
+  }
+
+  int32_t nCount = 1;
+  if (bBackspace) {
+    if (nStart == 0) {
+      return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+    }
+    if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' &&
+        m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') {
+      nStart--;
+      nCount++;
+    }
+    nStart--;
+  } else {
+    if (nStart == GetTextBufLength()) {
+      return FDE_TXTEDT_MODIFY_RET_F_Full;
+    }
+    if ((nStart + 1 < GetTextBufLength()) &&
+        (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') &&
+        (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) {
+      nCount++;
+    }
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+    CFX_WideString wsText;
+    GetPreDeleteText(wsText, nStart, nCount);
+    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+    }
+  }
+  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+    CFX_WideString wsRange;
+    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+    IFDE_TxtEdtDoRecord* pRecord =
+        new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange);
+    CFX_ByteString bsDoRecord;
+    pRecord->Serialize(bsDoRecord);
+    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+    pRecord->Release();
+  }
+  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+  Inner_DeleteRange(nStart, nCount);
+  SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0),
+              (bBackspace || nStart == 0));
+  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+  return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) {
+  if (IsLocked()) {
+    return FDE_TXTEDT_MODIFY_RET_F_Locked;
+  }
+  if (nCount == -1) {
+    nCount = GetTextBufLength();
+  }
+  if (nCount == 0) {
+    return FDE_TXTEDT_MODIFY_RET_S_Normal;
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+    CFX_WideString wsText;
+    GetPreDeleteText(wsText, nStart, nCount);
+    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+    }
+  }
+  DeleteRange_DoRecord(nStart, nCount);
+  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+  SetCaretPos(nStart, TRUE);
+  return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart,
+                                   int32_t nLength,
+                                   const CFX_WideString& wsReplace) {
+  if (IsLocked()) {
+    return FDE_TXTEDT_MODIFY_RET_F_Locked;
+  }
+  if (nStart < 0 || (nStart + nLength > GetTextBufLength())) {
+    return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+    CFX_WideString wsText;
+    GetPreReplaceText(wsText, nStart, nLength, wsReplace.c_str(),
+                      wsReplace.GetLength());
+    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+    }
+  }
+  if (IsSelect()) {
+    ClearSelection();
+  }
+  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace;
+  GetText(m_ChangeInfo.wsDelete, nStart, nLength);
+  if (nLength > 0) {
+    Inner_DeleteRange(nStart, nLength);
+  }
+  int32_t nTextLength = wsReplace.GetLength();
+  if (nTextLength > 0) {
+    Inner_Insert(nStart, wsReplace.c_str(), nTextLength);
+  }
+  m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength);
+  nStart += nTextLength;
+  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
+  FX_BOOL bBefore = TRUE;
+  if (wChar != L'\n' && wChar != L'\r') {
+    nStart--;
+    bBefore = FALSE;
+  }
+  SetCaretPos(nStart, bBefore);
+  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+  return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) {
+  m_nLimit = nLimit;
+}
+void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) {
+  m_wcAliasChar = wcAlias;
+}
+
+void CFDE_TxtEdtEngine::RemoveSelRange(int32_t nStart, int32_t nCount) {
+  FDE_LPTXTEDTSELRANGE lpTemp = NULL;
+  int32_t nRangeCount = m_SelRangePtrArr.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nRangeCount; i++) {
+    lpTemp = m_SelRangePtrArr[i];
+    if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) {
+      delete lpTemp;
+      m_SelRangePtrArr.RemoveAt(i);
+      return;
+    }
+  }
+}
+
+void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) {
+  if (nCount == -1) {
+    nCount = GetTextLength() - nStart;
+  }
+  int32_t nSize = m_SelRangePtrArr.GetSize();
+  if (nSize <= 0) {
+    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
+    lpSelRange->nStart = nStart;
+    lpSelRange->nCount = nCount;
+    m_SelRangePtrArr.Add(lpSelRange);
+    m_Param.pEventSink->On_SelChanged(this);
+    return;
+  }
+  FDE_LPTXTEDTSELRANGE lpTemp = NULL;
+  lpTemp = m_SelRangePtrArr[nSize - 1];
+  if (nStart >= lpTemp->nStart + lpTemp->nCount) {
+    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
+    lpSelRange->nStart = nStart;
+    lpSelRange->nCount = nCount;
+    m_SelRangePtrArr.Add(lpSelRange);
+    m_Param.pEventSink->On_SelChanged(this);
+    return;
+  }
+  int32_t nEnd = nStart + nCount - 1;
+  FX_BOOL bBegin = FALSE;
+  int32_t nRangeBgn = 0;
+  int32_t nRangeCnt = 0;
+  for (int32_t i = 0; i < nSize; i++) {
+    lpTemp = m_SelRangePtrArr[i];
+    int32_t nTempBgn = lpTemp->nStart;
+    int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1;
+    if (bBegin) {
+      if (nEnd < nTempBgn) {
+        break;
+      } else if (nStart >= nTempBgn && nStart <= nTempEnd) {
+        nRangeCnt++;
+        break;
+      }
+      nRangeCnt++;
+    } else {
+      if (nStart <= nTempEnd) {
+        nRangeBgn = i;
+        if (nEnd < nTempBgn) {
+          break;
+        }
+        nRangeCnt = 1;
+        bBegin = TRUE;
+      }
+    }
+  }
+  if (nRangeCnt == 0) {
+    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
+    lpSelRange->nStart = nStart;
+    lpSelRange->nCount = nCount;
+    m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange);
+  } else {
+    lpTemp = m_SelRangePtrArr[nRangeBgn];
+    lpTemp->nStart = nStart;
+    lpTemp->nCount = nCount;
+    nRangeCnt--;
+    nRangeBgn++;
+    while (nRangeCnt--) {
+      delete m_SelRangePtrArr[nRangeBgn];
+      m_SelRangePtrArr.RemoveAt(nRangeBgn);
+    }
+  }
+  m_Param.pEventSink->On_SelChanged(this);
+}
+
+int32_t CFDE_TxtEdtEngine::CountSelRanges() {
+  return m_SelRangePtrArr.GetSize();
+}
+int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t& nStart) {
+  nStart = m_SelRangePtrArr[nIndex]->nStart;
+  return m_SelRangePtrArr[nIndex]->nCount;
+}
+void CFDE_TxtEdtEngine::ClearSelection() {
+  int32_t nCount = m_SelRangePtrArr.GetSize();
+  FDE_LPTXTEDTSELRANGE lpRange = NULL;
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    lpRange = m_SelRangePtrArr[i];
+    if (lpRange != NULL) {
+      delete lpRange;
+      lpRange = NULL;
+    }
+  }
+  m_SelRangePtrArr.RemoveAll();
+  if (nCount && m_Param.pEventSink) {
+    m_Param.pEventSink->On_SelChanged(this);
+  }
+}
+FX_BOOL CFDE_TxtEdtEngine::Redo(const CFX_ByteStringC& bsRedo) {
+  if (IsLocked()) {
+    return FALSE;
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
+    return FALSE;
+  }
+  IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo);
+  FXSYS_assert(pDoRecord);
+  if (pDoRecord == NULL) {
+    return FALSE;
+  }
+  FX_BOOL bOK = pDoRecord->Redo();
+  pDoRecord->Release();
+  return bOK;
+}
+FX_BOOL CFDE_TxtEdtEngine::Undo(const CFX_ByteStringC& bsUndo) {
+  if (IsLocked()) {
+    return FALSE;
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
+    return FALSE;
+  }
+  IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo);
+  FXSYS_assert(pDoRecord);
+  if (pDoRecord == NULL) {
+    return FALSE;
+  }
+  FX_BOOL bOK = pDoRecord->Undo();
+  pDoRecord->Release();
+  return bOK;
+}
+int32_t CFDE_TxtEdtEngine::StartLayout() {
+  Lock();
+  RemoveAllPages();
+  m_nLayoutPos = 0;
+  m_nLineCount = 0;
+  return 0;
+}
+int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) {
+  int32_t nCount = m_ParagPtrArray.GetSize();
+  CFDE_TxtEdtParag* pParag = NULL;
+  int32_t nLineCount = 0;
+  for (; m_nLayoutPos < nCount; m_nLayoutPos++) {
+    pParag = m_ParagPtrArray[m_nLayoutPos];
+    pParag->CalcLines();
+    nLineCount += pParag->m_nLineCount;
+    if ((pPause != NULL) && (nLineCount > m_nPageLineCount) &&
+        pPause->NeedToPauseNow()) {
+      m_nLineCount += nLineCount;
+      return (++m_nLayoutPos * 100) / nCount;
+    }
+  }
+  m_nLineCount += nLineCount;
+  return 100;
+}
+void CFDE_TxtEdtEngine::EndLayout() {
+  UpdatePages();
+  int32_t nLength = GetTextLength();
+  if (m_nCaret > nLength) {
+    m_nCaret = nLength;
+  }
+  int32_t nIndex = m_nCaret;
+  if (!m_bBefore) {
+    nIndex--;
+  }
+  m_rtCaret.Set(0, 0, 1, m_Param.fFontSize);
+  Unlock();
+}
+FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause* pPause) {
+  return m_pTxtBuf->Optimize(pPause);
+}
+IFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const {
+  return (IFDE_TxtEdtBuf*)m_pTxtBuf;
+}
+int32_t CFDE_TxtEdtEngine::GetTextBufLength() const {
+  return m_pTxtBuf->GetTextLength() - 1;
+}
+IFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const {
+  return m_pTextBreak;
+}
+int32_t CFDE_TxtEdtEngine::GetLineCount() const {
+  return m_nLineCount;
+}
+int32_t CFDE_TxtEdtEngine::GetPageLineCount() const {
+  return m_nPageLineCount;
+}
+int32_t CFDE_TxtEdtEngine::CountParags() const {
+  return m_ParagPtrArray.GetSize();
+}
+IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(int32_t nParagIndex) const {
+  return m_ParagPtrArray[nParagIndex];
+}
+IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() {
+  if (!m_pTxtBuf) {
+    return NULL;
+  }
+  return new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
+}
+int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag,
+                                      int32_t nStartLineofParag,
+                                      int32_t nLineIndex,
+                                      int32_t& nStartLine) const {
+  int32_t nLineTotal = nStartLineofParag;
+  int32_t nCount = m_ParagPtrArray.GetSize();
+  CFDE_TxtEdtParag* pParag = NULL;
+  int32_t i = nStartParag;
+  for (; i < nCount; i++) {
+    pParag = m_ParagPtrArray[i];
+    nLineTotal += pParag->m_nLineCount;
+    if (nLineTotal > nLineIndex) {
+      break;
+    }
+  }
+  nStartLine = nLineTotal - pParag->m_nLineCount;
+  return i;
+}
+void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString& wsText,
+                                         int32_t nIndex,
+                                         int32_t nLength) {
+  GetText(wsText, 0, GetTextBufLength());
+  wsText.Delete(nIndex, nLength);
+}
+void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString& wsText,
+                                         int32_t nIndex,
+                                         const FX_WCHAR* lpText,
+                                         int32_t nLength) {
+  GetText(wsText, 0, GetTextBufLength());
+  int32_t nSelIndex = 0;
+  int32_t nSelLength = 0;
+  int32_t nSelCount = CountSelRanges();
+  while (nSelCount--) {
+    nSelLength = GetSelRange(nSelCount, nSelIndex);
+    wsText.Delete(nSelIndex, nSelLength);
+    nIndex = nSelIndex;
+  }
+  CFX_WideString wsTemp;
+  int32_t nOldLength = wsText.GetLength();
+  const FX_WCHAR* pOldBuffer = wsText.c_str();
+  FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength);
+  FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR));
+  FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR));
+  FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex,
+               (nOldLength - nIndex) * sizeof(FX_WCHAR));
+  wsTemp.ReleaseBuffer(nOldLength + nLength);
+  wsText = wsTemp;
+}
+void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString& wsText,
+                                          int32_t nIndex,
+                                          int32_t nOriginLength,
+                                          const FX_WCHAR* lpText,
+                                          int32_t nLength) {
+  GetText(wsText, 0, GetTextBufLength());
+  int32_t nSelIndex = 0;
+  int32_t nSelLength = 0;
+  int32_t nSelCount = CountSelRanges();
+  while (nSelCount--) {
+    nSelLength = GetSelRange(nSelCount, nSelIndex);
+    wsText.Delete(nSelIndex, nSelLength);
+  }
+  wsText.Delete(nIndex, nOriginLength);
+  int32_t i = 0;
+  for (i = 0; i < nLength; i++) {
+    wsText.Insert(nIndex++, lpText[i]);
+  }
+}
+void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart,
+                                     const FX_WCHAR* lpText,
+                                     int32_t nLength) {
+  FXSYS_assert(nLength > 0);
+  FDE_TXTEDTPARAGPOS ParagPos;
+  TextPos2ParagPos(nStart, ParagPos);
+  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+  int32_t nParagCount = m_ParagPtrArray.GetSize();
+  int32_t i = 0;
+  for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) {
+    m_ParagPtrArray[i]->m_nCharStart += nLength;
+  }
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+  int32_t nReserveLineCount = pParag->m_nLineCount;
+  int32_t nReserveCharStart = pParag->m_nCharStart;
+  int32_t nLeavePart = ParagPos.nCharIndex;
+  int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
+  int32_t nTextStart = 0;
+  FX_WCHAR wCurChar = L' ';
+  const FX_WCHAR* lpPos = lpText;
+  FX_BOOL bFirst = TRUE;
+  int32_t nParagIndex = ParagPos.nParagIndex;
+  for (i = 0; i < nLength; i++, lpPos++) {
+    wCurChar = *lpPos;
+    if (wCurChar == m_wLineEnd) {
+      if (bFirst) {
+        pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
+        pParag->m_nLineCount = -1;
+        nReserveCharStart += pParag->m_nCharCount;
+        bFirst = FALSE;
+      } else {
+        pParag = new CFDE_TxtEdtParag(this);
+        pParag->m_nLineCount = -1;
+        pParag->m_nCharCount = i - nTextStart + 1;
+        pParag->m_nCharStart = nReserveCharStart;
+        m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+        nReserveCharStart += pParag->m_nCharCount;
+      }
+      nTextStart = i + 1;
+    }
+  }
+  if (bFirst) {
+    pParag->m_nCharCount += nLength;
+    pParag->m_nLineCount = -1;
+    bFirst = FALSE;
+  } else {
+    pParag = new CFDE_TxtEdtParag(this);
+    pParag->m_nLineCount = -1;
+    pParag->m_nCharCount = nLength - nTextStart + nCutPart;
+    pParag->m_nCharStart = nReserveCharStart;
+    m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+  }
+  m_pTxtBuf->Insert(nStart, lpText, nLength);
+  int32_t nTotalLineCount = 0;
+  for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) {
+    pParag = m_ParagPtrArray[i];
+    pParag->CalcLines();
+    nTotalLineCount += pParag->m_nLineCount;
+  }
+  m_nLineCount += nTotalLineCount - nReserveLineCount;
+  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+  UpdatePages();
+}
+
+void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) {
+  if (nCount == -1) {
+    nCount = m_pTxtBuf->GetTextLength() - nStart;
+  }
+  int32_t nEnd = nStart + nCount - 1;
+  FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength());
+  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+  FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd;
+  TextPos2ParagPos(nStart, ParagPosBgn);
+  TextPos2ParagPos(nEnd, ParagPosEnd);
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex];
+  FX_BOOL bLastParag = FALSE;
+  if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) {
+    if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) {
+      ParagPosEnd.nParagIndex++;
+    } else {
+      bLastParag = TRUE;
+    }
+  }
+  int32_t nTotalLineCount = 0;
+  int32_t nTotalCharCount = 0;
+  int32_t i = 0;
+  for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
+    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
+    pParag->CalcLines();
+    nTotalLineCount += pParag->m_nLineCount;
+    nTotalCharCount += pParag->m_nCharCount;
+  }
+  m_pTxtBuf->Delete(nStart, nCount);
+  int32_t nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag)
+                                ? ParagPosBgn.nParagIndex
+                                : (ParagPosBgn.nParagIndex + 1);
+  for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
+    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nNextParagIndex];
+    delete pParag;
+    m_ParagPtrArray.RemoveAt(nNextParagIndex);
+  }
+  if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) {
+    pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex];
+    pParag->m_nCharCount = nTotalCharCount - nCount;
+    pParag->CalcLines();
+    nTotalLineCount -= pParag->m_nLineCount;
+  }
+  int32_t nParagCount = m_ParagPtrArray.GetSize();
+  for (i = nNextParagIndex; i < nParagCount; i++) {
+    m_ParagPtrArray[i]->m_nCharStart -= nCount;
+  }
+  m_nLineCount -= nTotalLineCount;
+  UpdatePages();
+  int32_t nPageCount = CountPages();
+  if (m_nCaretPage >= nPageCount) {
+    m_nCaretPage = nPageCount - 1;
+  }
+  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart,
+                                             int32_t nCount,
+                                             FX_BOOL bSel) {
+  FXSYS_assert(nStart >= 0);
+  if (nCount == -1) {
+    nCount = GetTextLength() - nStart;
+  }
+  FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength());
+
+  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+    CFX_WideString wsRange;
+    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+    IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_DeleteRange(
+        this, nStart, m_nCaret, wsRange, bSel);
+    CFX_ByteString bsDoRecord;
+    pRecord->Serialize(bsDoRecord);
+    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+    pRecord->Release();
+  }
+  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+  Inner_DeleteRange(nStart, nCount);
+}
+void CFDE_TxtEdtEngine::ResetEngine() {
+  RemoveAllPages();
+  RemoveAllParags();
+  ClearSelection();
+  m_nCaret = 0;
+  m_pTxtBuf->Clear(FALSE);
+  m_nCaret = 0;
+}
+void CFDE_TxtEdtEngine::RebuildParagraphs() {
+  RemoveAllParags();
+  FX_WCHAR wChar = L' ';
+  int32_t nParagStart = 0;
+  int32_t nIndex = 0;
+  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
+  pIter->SetAt(0);
+  do {
+    wChar = pIter->GetChar();
+    nIndex = pIter->GetAt();
+    if (wChar == m_wLineEnd) {
+      CFDE_TxtEdtParag* pParag = new CFDE_TxtEdtParag(this);
+      pParag->m_nCharStart = nParagStart;
+      pParag->m_nCharCount = nIndex - nParagStart + 1;
+      pParag->m_nLineCount = -1;
+      m_ParagPtrArray.Add(pParag);
+      nParagStart = nIndex + 1;
+    }
+  } while (pIter->Next());
+  pIter->Release();
+}
+void CFDE_TxtEdtEngine::RemoveAllParags() {
+  int32_t nCount = m_ParagPtrArray.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
+    if (pParag) {
+      delete pParag;
+    }
+  }
+  m_ParagPtrArray.RemoveAll();
+}
+void CFDE_TxtEdtEngine::RemoveAllPages() {
+  int32_t nCount = m_PagePtrArray.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    IFDE_TxtEdtPage* pPage = m_PagePtrArray[i];
+    if (pPage) {
+      pPage->Release();
+    }
+  }
+  m_PagePtrArray.RemoveAll();
+}
+void CFDE_TxtEdtEngine::UpdateParags() {
+  int32_t nCount = m_ParagPtrArray.GetSize();
+  if (nCount == 0) {
+    return;
+  }
+  CFDE_TxtEdtParag* pParag = NULL;
+  int32_t nLineCount = 0;
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    pParag = m_ParagPtrArray[i];
+    if (pParag->m_nLineCount == -1) {
+      pParag->CalcLines();
+    }
+    nLineCount += pParag->m_nLineCount;
+  }
+  m_nLineCount = nLineCount;
+}
+void CFDE_TxtEdtEngine::UpdatePages() {
+  if (m_nLineCount == 0) {
+    return;
+  }
+  int32_t nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1;
+  int32_t nSize = m_PagePtrArray.GetSize();
+  if (nSize == nPageCount) {
+    return;
+  }
+  if (nSize > nPageCount) {
+    IFDE_TxtEdtPage* pPage = NULL;
+    int32_t i = 0;
+    for (i = nSize - 1; i >= nPageCount; i--) {
+      pPage = m_PagePtrArray[i];
+      if (pPage) {
+        pPage->Release();
+      }
+      m_PagePtrArray.RemoveAt(i);
+    }
+    m_Param.pEventSink->On_PageCountChanged(this);
+    return;
+  }
+  if (nSize < nPageCount) {
+    IFDE_TxtEdtPage* pPage = NULL;
+    int32_t i = 0;
+    for (i = nSize; i < nPageCount; i++) {
+      pPage = IFDE_TxtEdtPage::Create(this, i);
+      m_PagePtrArray.Add(pPage);
+    }
+    m_Param.pEventSink->On_PageCountChanged(this);
+    return;
+  }
+}
+void CFDE_TxtEdtEngine::UpdateTxtBreak() {
+  FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles();
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine;
+  } else {
+    dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_CombText;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_ExpandTab;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext;
+  }
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) {
+    dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes;
+  } else {
+    dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes;
+  }
+  m_pTextBreak->SetLayoutStyles(dwStyle);
+  FX_DWORD dwAligment = 0;
+  if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) {
+    dwAligment |= FX_TXTLINEALIGNMENT_Justified;
+  } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) {
+    dwAligment |= FX_TXTLINEALIGNMENT_Distributed;
+  }
+  if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) {
+    dwAligment |= FX_TXTLINEALIGNMENT_Center;
+  } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) {
+    dwAligment |= FX_TXTLINEALIGNMENT_Right;
+  }
+  m_pTextBreak->SetAlignment(dwAligment);
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+    if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+      m_pTextBreak->SetLineWidth(m_Param.fPlateHeight);
+    } else {
+      m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
+    }
+  } else {
+    if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+      m_pTextBreak->SetLineWidth(m_Param.fPlateWidth);
+    } else {
+      m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
+    }
+  }
+  m_nPageLineCount = m_Param.nLineCount;
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
+    FX_FLOAT fCombWidth =
+        m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical
+            ? m_Param.fPlateHeight
+            : m_Param.fPlateWidth;
+    if (m_nLimit > 0) {
+      fCombWidth /= m_nLimit;
+    }
+    m_pTextBreak->SetCombWidth(fCombWidth);
+  }
+  m_pTextBreak->SetFont(m_Param.pFont);
+  m_pTextBreak->SetFontSize(m_Param.fFontSize);
+  m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant);
+  m_pTextBreak->SetDefaultChar(m_Param.wDefChar);
+  m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar);
+  m_pTextBreak->SetCharRotation(m_Param.nCharRotation);
+  m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f);
+  m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale);
+  m_pTextBreak->SetCharSpace(m_Param.fCharSpace);
+}
+FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_WCHAR*& lpText,
+                                           int32_t& nLength,
+                                           FX_BOOL bPreIsCR) {
+  for (int32_t i = 0; i < nLength; i++) {
+    FX_WCHAR wc = lpText[i];
+    switch (wc) {
+      case L'\r': {
+        lpText[i] = m_wLineEnd;
+        bPreIsCR = TRUE;
+      } break;
+      case L'\n': {
+        if (bPreIsCR == TRUE) {
+          int32_t nNext = i + 1;
+          if (nNext < nLength) {
+            FXSYS_memmove(lpText + i, lpText + nNext,
+                          (nLength - nNext) * sizeof(FX_WCHAR));
+          }
+          i--;
+          nLength--;
+          bPreIsCR = FALSE;
+          if (m_bAutoLineEnd) {
+            m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF;
+            m_bAutoLineEnd = FALSE;
+          }
+        } else {
+          lpText[i] = m_wLineEnd;
+          if (m_bAutoLineEnd) {
+            m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF;
+            m_bAutoLineEnd = FALSE;
+          }
+        }
+      } break;
+      default: {
+        if (bPreIsCR && m_bAutoLineEnd) {
+          m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR;
+          m_bAutoLineEnd = FALSE;
+        }
+        bPreIsCR = FALSE;
+      } break;
+    }
+  }
+  return bPreIsCR;
+}
+void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString& wsText) {
+  FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r';
+  if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) {
+    CFX_ArrayTemplate<int32_t> PosArr;
+    int32_t nLength = wsText.GetLength();
+    int32_t i = 0;
+    FX_WCHAR* lpPos = (FX_WCHAR*)(const FX_WCHAR*)wsText;
+    for (i = 0; i < nLength; i++, lpPos++) {
+      if (*lpPos == m_wLineEnd) {
+        *lpPos = wc;
+        PosArr.Add(i);
+      }
+    }
+    const FX_WCHAR* lpSrcBuf = wsText.c_str();
+    CFX_WideString wsTemp;
+    int32_t nCount = PosArr.GetSize();
+    FX_WCHAR* lpDstBuf = wsTemp.GetBuffer(nLength + nCount);
+    int32_t nDstPos = 0;
+    int32_t nSrcPos = 0;
+    for (i = 0; i < nCount; i++) {
+      int32_t nPos = PosArr[i];
+      int32_t nCopyLen = nPos - nSrcPos + 1;
+      FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
+                   nCopyLen * sizeof(FX_WCHAR));
+      nDstPos += nCopyLen;
+      nSrcPos += nCopyLen;
+      lpDstBuf[nDstPos] = L'\n';
+      nDstPos++;
+    }
+    if (nSrcPos < nLength) {
+      FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
+                   (nLength - nSrcPos) * sizeof(FX_WCHAR));
+    }
+    wsTemp.ReleaseBuffer(nLength + nCount);
+    wsText = wsTemp;
+  } else {
+    int32_t nLength = wsText.GetLength();
+    FX_WCHAR* lpBuf = (FX_WCHAR*)(const FX_WCHAR*)wsText;
+    for (int32_t i = 0; i < nLength; i++, lpBuf++) {
+      if (*lpBuf == m_wLineEnd) {
+        *lpBuf = wc;
+      }
+    }
+  }
+}
+int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) {
+  FXSYS_assert(nIndex >= 0);
+  FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength());
+  if (m_nCaretPage >= 0) {
+    IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
+    m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+    int32_t nPageCharStart = pPage->GetCharStart();
+    int32_t nPageCharCount = pPage->GetCharCount();
+    if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) {
+      m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+      return m_nCaretPage;
+    }
+    m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+  }
+  CFDE_TxtEdtParag* pParag = NULL;
+  int32_t nLineCount = 0;
+  int32_t nParagCount = m_ParagPtrArray.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < nParagCount; i++) {
+    pParag = m_ParagPtrArray[i];
+    if (pParag->m_nCharStart <= nIndex &&
+        nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) {
+      break;
+    }
+    nLineCount += pParag->m_nLineCount;
+  }
+  pParag->LoadParag();
+  int32_t nLineStart = -1;
+  int32_t nLineCharCount = -1;
+  for (i = 0; i < pParag->m_nLineCount; i++) {
+    pParag->GetLineRange(i, nLineStart, nLineCharCount);
+    if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) {
+      break;
+    }
+  }
+  FXSYS_assert(i < pParag->m_nLineCount);
+  nLineCount += (i + 1);
+  m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1;
+  m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+  pParag->UnloadParag();
+  return m_nCaretPage;
+}
+void CFDE_TxtEdtEngine::TextPos2ParagPos(int32_t nIndex,
+                                         FDE_TXTEDTPARAGPOS& ParagPos) const {
+  FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength());
+  int32_t nCount = m_ParagPtrArray.GetSize();
+  int32_t nBgn = 0;
+  int32_t nMid = 0;
+  int32_t nEnd = nCount - 1;
+  while (nEnd > nBgn) {
+    nMid = (nBgn + nEnd) / 2;
+    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nMid];
+    if (nIndex < pParag->m_nCharStart) {
+      nEnd = nMid - 1;
+    } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) {
+      nBgn = nMid + 1;
+    } else {
+      break;
+    }
+  }
+  if (nBgn == nEnd) {
+    nMid = nBgn;
+  }
+  FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart &&
+               (nIndex < m_ParagPtrArray[nMid]->m_nCharStart +
+                             m_ParagPtrArray[nMid]->m_nCharCount));
+  ParagPos.nParagIndex = nMid;
+  ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart;
+}
+int32_t CFDE_TxtEdtEngine::MoveForward(FX_BOOL& bBefore) {
+  if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) {
+    return -1;
+  }
+  int32_t nCaret = m_nCaret;
+  if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) &&
+      (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') &&
+      (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) {
+    nCaret++;
+  }
+  nCaret++;
+  bBefore = TRUE;
+  return nCaret;
+}
+int32_t CFDE_TxtEdtEngine::MoveBackward(FX_BOOL& bBefore) {
+  if (m_nCaret == 0) {
+    return FALSE;
+  }
+  int32_t nCaret = m_nCaret;
+  if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' &&
+      m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') {
+    nCaret--;
+  }
+  nCaret--;
+  bBefore = TRUE;
+  return nCaret;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF& ptCaret) {
+  IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
+  const CFX_RectF& rtContent = pPage->GetContentsBox();
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+    ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace;
+    ptCaret.y = m_fCaretPosReserve;
+    FX_BOOL bLineReserve =
+        m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+    if (ptCaret.x < rtContent.left) {
+      if (bLineReserve) {
+        if (m_nCaretPage == CountPages() - 1) {
+          return FALSE;
+        }
+      } else {
+        if (m_nCaretPage == 0) {
+          return FALSE;
+        }
+      }
+      if (bLineReserve) {
+        m_nCaretPage++;
+      } else {
+        m_nCaretPage--;
+      }
+      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+      ptCaret.x -= rtContent.left;
+      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
+      ptCaret.x += pCurPage->GetContentsBox().right();
+    }
+  } else {
+    ptCaret.x = m_fCaretPosReserve;
+    ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace;
+    if (ptCaret.y < rtContent.top) {
+      if (m_nCaretPage == 0) {
+        return FALSE;
+      }
+      ptCaret.y -= rtContent.top;
+      m_nCaretPage--;
+      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
+      ptCaret.y += pCurPage->GetContentsBox().bottom();
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF& ptCaret) {
+  IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
+  const CFX_RectF& rtContent = pPage->GetContentsBox();
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+    ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace;
+    ptCaret.y = m_fCaretPosReserve;
+    if (ptCaret.x >= rtContent.right()) {
+      FX_BOOL bLineReserve =
+          m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+      if (bLineReserve) {
+        if (m_nCaretPage == 0) {
+          return FALSE;
+        }
+      } else {
+        if (m_nCaretPage == CountPages() - 1) {
+          return FALSE;
+        }
+      }
+      if (bLineReserve) {
+        m_nCaretPage--;
+      } else {
+        m_nCaretPage++;
+      }
+      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+      ptCaret.x -= rtContent.right();
+      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
+      ptCaret.x += pCurPage->GetContentsBox().left;
+    }
+  } else {
+    ptCaret.x = m_fCaretPosReserve;
+    ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace;
+    if (ptCaret.y >= rtContent.bottom()) {
+      if (m_nCaretPage == CountPages() - 1) {
+        return FALSE;
+      }
+      ptCaret.y -= rtContent.bottom();
+      m_nCaretPage++;
+      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
+      ptCaret.y += pCurPage->GetContentsBox().top;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveLineStart() {
+  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+  FDE_TXTEDTPARAGPOS ParagPos;
+  TextPos2ParagPos(nIndex, ParagPos);
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+  pParag->LoadParag();
+  int32_t nLineCount = pParag->m_nLineCount;
+  int32_t i = 0;
+  int32_t nStart = 0;
+  int32_t nCount = 0;
+  for (; i < nLineCount; i++) {
+    pParag->GetLineRange(i, nStart, nCount);
+    if (nIndex >= nStart && nIndex < nStart + nCount) {
+      break;
+    }
+  }
+  UpdateCaretRect(nStart, TRUE);
+  pParag->UnloadParag();
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd() {
+  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+  FDE_TXTEDTPARAGPOS ParagPos;
+  TextPos2ParagPos(nIndex, ParagPos);
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+  pParag->LoadParag();
+  int32_t nLineCount = pParag->m_nLineCount;
+  int32_t i = 0;
+  int32_t nStart = 0;
+  int32_t nCount = 0;
+  for (; i < nLineCount; i++) {
+    pParag->GetLineRange(i, nStart, nCount);
+    if (nIndex >= nStart && nIndex < nStart + nCount) {
+      break;
+    }
+  }
+  nIndex = nStart + nCount - 1;
+  FXSYS_assert(nIndex <= GetTextBufLength());
+  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+  FX_BOOL bBefore = FALSE;
+  if (nIndex <= GetTextBufLength()) {
+    if (wChar == L'\r') {
+      bBefore = TRUE;
+    } else if (wChar == L'\n' && nIndex > nStart) {
+      bBefore = TRUE;
+      nIndex--;
+      wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+      if (wChar != L'\r') {
+        nIndex++;
+      }
+    }
+  }
+  UpdateCaretRect(nIndex, bBefore);
+  pParag->UnloadParag();
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveParagStart() {
+  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+  FDE_TXTEDTPARAGPOS ParagPos;
+  TextPos2ParagPos(nIndex, ParagPos);
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+  UpdateCaretRect(pParag->m_nCharStart, TRUE);
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd() {
+  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+  FDE_TXTEDTPARAGPOS ParagPos;
+  TextPos2ParagPos(nIndex, ParagPos);
+  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+  nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1;
+  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+  if (wChar == L'\n' && nIndex > 0) {
+    nIndex--;
+    wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+    if (wChar != L'\r') {
+      nIndex++;
+    }
+  }
+  UpdateCaretRect(nIndex, TRUE);
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveHome() {
+  UpdateCaretRect(0, TRUE);
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveEnd() {
+  UpdateCaretRect(GetTextBufLength(), TRUE);
+  return TRUE;
+}
+
+FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
+  IFDE_TextOut* pTextOut = IFDE_TextOut::Create();
+  pTextOut->SetLineSpace(m_Param.fLineSpace);
+  pTextOut->SetFont(m_Param.pFont);
+  pTextOut->SetFontSize(m_Param.fFontSize);
+  CFX_RectF rcText;
+  FXSYS_memset(&rcText, 0, sizeof(rcText));
+  FX_DWORD dwStyle = 0;
+  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) {
+    dwStyle |= FDE_TTOSTYLE_SingleLine;
+  }
+  if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+    dwStyle |= FDE_TTOSTYLE_LineWrap;
+    rcText.width = m_Param.fPlateWidth;
+  } else {
+    rcText.width = 65535;
+  }
+  pTextOut->SetStyles(dwStyle);
+  wsText += L"\n";
+  pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText);
+  pTextOut->Release();
+  wsText.Delete(wsText.GetLength() - 1);
+  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) &&
+      (rcText.width > m_Param.fPlateWidth)) {
+    return FALSE;
+  }
+  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) &&
+      (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) {
+    return FALSE;
+  }
+  return TRUE;
+}
+void CFDE_TxtEdtEngine::UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore) {
+  MovePage2Char(nIndex);
+  GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore);
+  m_nCaret = nIndex;
+  m_bBefore = bBefore;
+  if (!m_bBefore) {
+    m_nCaret++;
+    m_bBefore = TRUE;
+  }
+  m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
+                           ? m_rtCaret.top
+                           : m_rtCaret.left;
+  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret,
+                                     int32_t nPageIndex,
+                                     int32_t nCaret,
+                                     FX_BOOL bBefore) {
+  IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
+  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+  FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText;
+  int32_t nIndexInpage = nCaret - pPage->GetCharStart();
+  if (bBefore && bCombText && nIndexInpage > 0) {
+    nIndexInpage--;
+    bBefore = FALSE;
+  }
+  int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText);
+  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+    if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
+        (FX_IsOdd(nBIDILevel) && bBefore)) {
+      rtCaret.Offset(0, rtCaret.height - 1.0f);
+    }
+    if (rtCaret.height == 0 && rtCaret.top > 1.0f) {
+      rtCaret.top -= 1.0f;
+    }
+    rtCaret.height = 1.0f;
+  } else {
+    if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
+        (FX_IsOdd(nBIDILevel) && bBefore)) {
+      rtCaret.Offset(rtCaret.width - 1.0f, 0);
+    }
+    if (rtCaret.width == 0 && rtCaret.left > 1.0f) {
+      rtCaret.left -= 1.0f;
+    }
+    rtCaret.width = 1.0f;
+  }
+  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) {
+  IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
+  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+  m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore);
+  GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
+  if (!m_bBefore) {
+    m_nCaret++;
+    m_bBefore = TRUE;
+  }
+  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage);
+  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+}
+FX_BOOL CFDE_TxtEdtEngine::IsSelect() {
+  return m_SelRangePtrArr.GetSize() > 0;
+}
+void CFDE_TxtEdtEngine::DeleteSelect() {
+  int32_t nCountRange = CountSelRanges();
+  if (nCountRange > 0) {
+    int32_t nSelStart;
+    int32_t nSelCount;
+    while (nCountRange > 0) {
+      nSelCount = GetSelRange(--nCountRange, nSelStart);
+      FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange];
+      delete lpTemp;
+      m_SelRangePtrArr.RemoveAt(nCountRange);
+      DeleteRange_DoRecord(nSelStart, nSelCount, TRUE);
+    }
+    ClearSelection();
+    m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+    m_Param.pEventSink->On_SelChanged(this);
+    SetCaretPos(nSelStart, TRUE);
+    return;
+  }
+}
+IFDE_TxtEdtDoRecord* IFDE_TxtEdtDoRecord::Create(
+    const CFX_ByteStringC& bsDoRecord) {
+  const FX_CHAR* lpBuf = bsDoRecord.GetCStr();
+  int32_t nType = *((int32_t*)lpBuf);
+  switch (nType) {
+    case FDE_TXTEDT_DORECORD_INS:
+      return new CFDE_TxtEdtDoRecord_Insert(bsDoRecord);
+    case FDE_TXTEDT_DORECORD_DEL:
+      return new CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord);
+    default:
+      break;
+  }
+  return NULL;
+}
+CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
+    const CFX_ByteStringC& bsDoRecord) {
+  Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
+    CFDE_TxtEdtEngine* pEngine,
+    int32_t nCaret,
+    const FX_WCHAR* lpText,
+    int32_t nLength)
+    : m_pEngine(pEngine), m_nCaret(nCaret) {
+  FXSYS_assert(pEngine);
+  FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength);
+  FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
+  m_wsInsert.ReleaseBuffer();
+}
+CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {}
+void CFDE_TxtEdtDoRecord_Insert::Release() {
+  delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() {
+  if (m_pEngine->IsSelect()) {
+    m_pEngine->ClearSelection();
+  }
+  m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength());
+  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+  m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
+  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+  m_pEngine->SetCaretPos(m_nCaret, TRUE);
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() {
+  m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength());
+  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+  m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
+  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+  m_pEngine->SetCaretPos(m_nCaret, FALSE);
+  return TRUE;
+}
+void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString& bsDoRecord) const {
+  CFX_ArchiveSaver ArchiveSaver;
+  ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_INS);
+  ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
+  ArchiveSaver << m_nCaret;
+  ArchiveSaver << m_wsInsert;
+  int32_t nLength = ArchiveSaver.GetLength();
+  const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
+  FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
+  FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+  bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_Insert::Deserialize(
+    const CFX_ByteStringC& bsDoRecord) {
+  CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
+                                  bsDoRecord.GetLength());
+  int32_t nType = 0;
+  ArchiveLoader >> nType;
+  FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS);
+  int32_t nEngine = 0;
+  ArchiveLoader >> nEngine;
+  m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
+  ArchiveLoader >> m_nCaret;
+  ArchiveLoader >> m_wsInsert;
+}
+CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
+    const CFX_ByteStringC& bsDoRecord) {
+  Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
+    CFDE_TxtEdtEngine* pEngine,
+    int32_t nIndex,
+    int32_t nCaret,
+    const CFX_WideString& wsRange,
+    FX_BOOL bSel)
+    : m_pEngine(pEngine),
+      m_bSel(bSel),
+      m_nIndex(nIndex),
+      m_nCaret(nCaret),
+      m_wsRange(wsRange) {
+  FXSYS_assert(pEngine);
+}
+CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {}
+void CFDE_TxtEdtDoRecord_DeleteRange::Release() {
+  delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() {
+  if (m_pEngine->IsSelect()) {
+    m_pEngine->ClearSelection();
+  }
+  m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength());
+  if (m_bSel) {
+    m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength());
+  }
+  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+  m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
+  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+  m_pEngine->SetCaretPos(m_nCaret, TRUE);
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() {
+  m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength());
+  if (m_bSel) {
+    m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength());
+  }
+  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+  m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
+  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+  m_pEngine->SetCaretPos(m_nIndex, TRUE);
+  return TRUE;
+}
+void CFDE_TxtEdtDoRecord_DeleteRange::Serialize(
+    CFX_ByteString& bsDoRecord) const {
+  CFX_ArchiveSaver ArchiveSaver;
+  ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_DEL);
+  ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
+  ArchiveSaver << (int32_t)m_bSel;
+  ArchiveSaver << m_nIndex;
+  ArchiveSaver << m_nCaret;
+  ArchiveSaver << m_wsRange;
+  int32_t nLength = ArchiveSaver.GetLength();
+  const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
+  FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
+  FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+  bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize(
+    const CFX_ByteStringC& bsDoRecord) {
+  CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
+                                  bsDoRecord.GetLength());
+  int32_t nType = 0;
+  ArchiveLoader >> nType;
+  FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL);
+  int32_t nEngine = 0;
+  ArchiveLoader >> nEngine;
+  m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
+  int32_t iSel = 0;
+  ArchiveLoader >> iSel;
+  m_bSel = !!iSel;
+  ArchiveLoader >> m_nIndex;
+  ArchiveLoader >> m_nCaret;
+  ArchiveLoader >> m_wsRange;
+}
diff --git a/xfa/fee/fde_txtedtengine.h b/xfa/fee/fde_txtedtengine.h
new file mode 100644
index 0000000..9dc4c4e
--- /dev/null
+++ b/xfa/fee/fde_txtedtengine.h
@@ -0,0 +1,247 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FDE_TXTEDTENGINE_H_
+#define XFA_FEE_FDE_TXTEDTENGINE_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+
+class IFX_TxtBreak;
+class IFX_CharIter;
+class CFDE_TxtEdtParag;
+class CFDE_TxtEdtDoRecord_Insert;
+class CFDE_TxtEdtDoRecord_DeleteRange;
+
+class IFDE_TxtEdtDoRecord {
+ public:
+  static IFDE_TxtEdtDoRecord* Create(const CFX_ByteStringC& bsDoRecord);
+  virtual ~IFDE_TxtEdtDoRecord() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL Redo() = 0;
+  virtual FX_BOOL Undo() = 0;
+  virtual void Serialize(CFX_ByteString& bsDoRecord) const = 0;
+};
+
+class CFDE_TxtEdtEngine : public IFDE_TxtEdtEngine {
+  friend class CFDE_TxtEdtDoRecord_Insert;
+  friend class CFDE_TxtEdtDoRecord_DeleteRange;
+  friend class CFDE_TxtEdtPage;
+  struct _FDE_TXTEDTSELRANGE {
+    int32_t nStart;
+    int32_t nCount;
+  };
+  typedef _FDE_TXTEDTSELRANGE FDE_TXTEDTSELRANGE;
+  typedef _FDE_TXTEDTSELRANGE* FDE_LPTXTEDTSELRANGE;
+  struct _FDE_TXTEDTPARAGPOS {
+    int32_t nParagIndex;
+    int32_t nCharIndex;
+  };
+  typedef _FDE_TXTEDTPARAGPOS FDE_TXTEDTPARAGPOS;
+  typedef _FDE_TXTEDTPARAGPOS* FDE_LPTXTEDTPARAGPOS;
+
+ public:
+  CFDE_TxtEdtEngine();
+  virtual void Release();
+
+  virtual void SetEditParams(const FDE_TXTEDTPARAMS& params);
+  virtual const FDE_TXTEDTPARAMS* GetEditParams() const;
+
+  virtual int32_t CountPages() const;
+  virtual IFDE_TxtEdtPage* GetPage(int32_t nIndex);
+
+  virtual FX_BOOL SetBufChunkSize(int32_t nChunkSize);
+  virtual void SetTextByStream(IFX_Stream* pStream);
+  virtual void SetText(const CFX_WideString& wsText);
+  virtual int32_t GetTextLength() const;
+  virtual void GetText(CFX_WideString& wsText,
+                       int32_t nStart,
+                       int32_t nCount = -1);
+  virtual void ClearText();
+
+  virtual int32_t GetCaretRect(CFX_RectF& rtCaret) const;
+  virtual int32_t GetCaretPos() const;
+  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore);
+  virtual int32_t MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
+                               FX_BOOL bShift = FALSE,
+                               FX_BOOL bCtrl = FALSE);
+  virtual void Lock();
+  virtual void Unlock();
+  virtual FX_BOOL IsLocked() const;
+
+  virtual int32_t Insert(int32_t nStart,
+                         const FX_WCHAR* lpText,
+                         int32_t nLength);
+  virtual int32_t Delete(int32_t nStart, FX_BOOL bBackspace = FALSE);
+  virtual int32_t DeleteRange(int32_t nStart, int32_t nCount = -1);
+  virtual int32_t Replace(int32_t nStart,
+                          int32_t nLength,
+                          const CFX_WideString& wsReplace);
+
+  virtual void SetLimit(int32_t nLimit);
+  virtual void SetAliasChar(FX_WCHAR wcAlias);
+
+  void RemoveSelRange(int32_t nStart, int32_t nCount = -1);
+
+  virtual void AddSelRange(int32_t nStart, int32_t nCount = -1);
+  virtual int32_t CountSelRanges();
+  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
+  virtual void ClearSelection();
+
+  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRedo);
+  virtual FX_BOOL Undo(const CFX_ByteStringC& bsUndo);
+
+  virtual int32_t StartLayout();
+  virtual int32_t DoLayout(IFX_Pause* pPause);
+  virtual void EndLayout();
+
+  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);
+  virtual int32_t CountParags() const;
+  virtual IFDE_TxtEdtParag* GetParag(int32_t nParagIndex) const;
+  virtual IFX_CharIter* CreateCharIter();
+  IFDE_TxtEdtBuf* GetTextBuf() const;
+  int32_t GetTextBufLength() const;
+  IFX_TxtBreak* GetTextBreak() const;
+  int32_t GetLineCount() const;
+  int32_t GetPageLineCount() const;
+
+  int32_t Line2Parag(int32_t nStartParag,
+                     int32_t nStartLineofParag,
+                     int32_t nLineIndex,
+                     int32_t& nStartLine) const;
+  FX_WCHAR GetAliasChar() const { return m_wcAliasChar; }
+
+ protected:
+  virtual ~CFDE_TxtEdtEngine();
+
+ private:
+  void Inner_Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);
+  void GetPreDeleteText(CFX_WideString& wsText,
+                        int32_t nIndex,
+                        int32_t nLength);
+  void GetPreInsertText(CFX_WideString& wsText,
+                        int32_t nIndex,
+                        const FX_WCHAR* lpText,
+                        int32_t nLength);
+  void GetPreReplaceText(CFX_WideString& wsText,
+                         int32_t nIndex,
+                         int32_t nOriginLength,
+                         const FX_WCHAR* lpText,
+                         int32_t nLength);
+
+  void Inner_DeleteRange(int32_t nStart, int32_t nCount = -1);
+  void DeleteRange_DoRecord(int32_t nStart,
+                            int32_t nCount,
+                            FX_BOOL bSel = FALSE);
+  void ResetEngine();
+  void RebuildParagraphs();
+  void RemoveAllParags();
+  void RemoveAllPages();
+  void UpdateParags();
+  void UpdatePages();
+  void UpdateTxtBreak();
+
+  FX_BOOL ReplaceParagEnd(FX_WCHAR*& lpText,
+                          int32_t& nLength,
+                          FX_BOOL bPreIsCR = FALSE);
+  void RecoverParagEnd(CFX_WideString& wsText);
+  int32_t MovePage2Char(int32_t nIndex);
+  void TextPos2ParagPos(int32_t nIndex, FDE_TXTEDTPARAGPOS& ParagPos) const;
+  int32_t MoveForward(FX_BOOL& bBefore);
+  int32_t MoveBackward(FX_BOOL& bBefore);
+  FX_BOOL MoveUp(CFX_PointF& ptCaret);
+  FX_BOOL MoveDown(CFX_PointF& ptCaret);
+  FX_BOOL MoveLineStart();
+  FX_BOOL MoveLineEnd();
+  FX_BOOL MoveParagStart();
+  FX_BOOL MoveParagEnd();
+  FX_BOOL MoveHome();
+  FX_BOOL MoveEnd();
+  FX_BOOL IsFitArea(CFX_WideString& wsText);
+  void UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore = TRUE);
+  void GetCaretRect(CFX_RectF& rtCaret,
+                    int32_t nPageIndex,
+                    int32_t nCaret,
+                    FX_BOOL bBefore = TRUE);
+  void UpdateCaretIndex(const CFX_PointF& ptCaret);
+
+  FX_BOOL IsSelect();
+  void DeleteSelect();
+
+  IFDE_TxtEdtBuf* m_pTxtBuf;
+  IFX_TxtBreak* m_pTextBreak;
+  FDE_TXTEDTPARAMS m_Param;
+  CFX_ArrayTemplate<IFDE_TxtEdtPage*> m_PagePtrArray;
+  CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray;
+  CFX_ArrayTemplate<FDE_LPTXTEDTSELRANGE> m_SelRangePtrArr;
+  int32_t m_nPageLineCount;
+  int32_t m_nLineCount;
+  int32_t m_nAnchorPos;
+  int32_t m_nLayoutPos;
+  FX_FLOAT m_fCaretPosReserve;
+  int32_t m_nCaret;
+  FX_BOOL m_bBefore;
+  int32_t m_nCaretPage;
+  CFX_RectF m_rtCaret;
+  FX_DWORD m_dwFindFlags;
+  FX_BOOL m_bLock;
+  int32_t m_nLimit;
+  FX_WCHAR m_wcAliasChar;
+  int32_t m_nFirstLineEnd;
+  FX_BOOL m_bAutoLineEnd;
+  FX_WCHAR m_wLineEnd;
+  FDE_TXTEDT_TEXTCHANGE_INFO m_ChangeInfo;
+};
+
+class CFDE_TxtEdtDoRecord_Insert : public IFDE_TxtEdtDoRecord {
+ public:
+  CFDE_TxtEdtDoRecord_Insert(const CFX_ByteStringC& bsDoRecord);
+  CFDE_TxtEdtDoRecord_Insert(CFDE_TxtEdtEngine* pEngine,
+                             int32_t nCaret,
+                             const FX_WCHAR* lpText,
+                             int32_t nLength);
+  virtual void Release();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+  virtual void Serialize(CFX_ByteString& bsDoRecord) const;
+
+ protected:
+  ~CFDE_TxtEdtDoRecord_Insert();
+  void Deserialize(const CFX_ByteStringC& bsDoRecord);
+
+ private:
+  CFDE_TxtEdtEngine* m_pEngine;
+  int32_t m_nCaret;
+  CFX_WideString m_wsInsert;
+};
+
+class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord {
+ public:
+  CFDE_TxtEdtDoRecord_DeleteRange(const CFX_ByteStringC& bsDoRecord);
+  CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine* pEngine,
+                                  int32_t nIndex,
+                                  int32_t nCaret,
+                                  const CFX_WideString& wsRange,
+                                  FX_BOOL bSel = FALSE);
+  virtual void Release();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+  virtual void Serialize(CFX_ByteString& bsDoRecord) const;
+
+ protected:
+  ~CFDE_TxtEdtDoRecord_DeleteRange();
+  void Deserialize(const CFX_ByteStringC& bsDoRecord);
+
+ private:
+  CFDE_TxtEdtEngine* m_pEngine;
+  FX_BOOL m_bSel;
+  int32_t m_nIndex;
+  int32_t m_nCaret;
+  CFX_WideString m_wsRange;
+};
+
+#endif  // XFA_FEE_FDE_TXTEDTENGINE_H_
diff --git a/xfa/fee/fde_txtedtpage.cpp b/xfa/fee/fde_txtedtpage.cpp
new file mode 100644
index 0000000..5ecbcea
--- /dev/null
+++ b/xfa/fee/fde_txtedtpage.cpp
@@ -0,0 +1,650 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fde_txtedtpage.h"
+
+#include <algorithm>
+
+#include "xfa/fee/fde_txtedtbuf.h"
+#include "xfa/fee/fde_txtedtengine.h"
+#include "xfa/fee/fde_txtedtparag.h"
+#include "xfa/fee/fx_wordbreak/fx_wordbreak.h"
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+#include "xfa/fee/ifde_txtedtpage.h"
+
+#define FDE_TXTEDT_TOLERANCE 0.1f
+
+IFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(IFDE_TxtEdtEngine* pEngine,
+                                         int32_t nIndex) {
+  return (IFDE_TxtEdtPage*)new CFDE_TxtEdtPage(pEngine, nIndex);
+}
+CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage)
+    : m_pPage(pPage) {}
+CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {}
+FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
+  return FDE_VISUALOBJ_Text;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetBBox(FDE_HVISUALOBJ hVisualObj,
+                                    CFX_RectF& bbox) {
+  return FALSE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetMatrix(FDE_HVISUALOBJ hVisualObj,
+                                      CFX_Matrix& matrix) {
+  return FALSE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
+  rt = ((FDE_TEXTEDITPIECE*)(hVisualObj))->rtPiece;
+  return TRUE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
+  return FALSE;
+}
+int32_t CFDE_TxtEdtTextSet::GetString(FDE_HVISUALOBJ hText,
+                                      CFX_WideString& wsText) {
+  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
+  FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount);
+  for (int32_t i = 0; i < pPiece->nCount; i++) {
+    pBuffer[i] = m_pPage->GetChar((void*)hText, i);
+  }
+  wsText.ReleaseBuffer(pPiece->nCount);
+  return pPiece->nCount;
+}
+IFX_Font* CFDE_TxtEdtTextSet::GetFont(FDE_HVISUALOBJ hText) {
+  return m_pPage->GetEngine()->GetEditParams()->pFont;
+}
+FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize(FDE_HVISUALOBJ hText) {
+  return m_pPage->GetEngine()->GetEditParams()->fFontSize;
+}
+FX_ARGB CFDE_TxtEdtTextSet::GetFontColor(FDE_HVISUALOBJ hText) {
+  return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
+}
+int32_t CFDE_TxtEdtTextSet::GetDisplayPos(FDE_HVISUALOBJ hText,
+                                          FXTEXT_CHARPOS* pCharPos,
+                                          FX_BOOL bCharCode,
+                                          CFX_WideString* pWSForms) {
+  if (hText == NULL) {
+    return 0;
+  }
+  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
+  int32_t nLength = pPiece->nCount;
+  if (nLength < 1) {
+    return 0;
+  }
+  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
+  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
+  IFX_TxtBreak* pBreak = pEngine->GetTextBreak();
+  FX_DWORD dwLayoutStyle = pBreak->GetLayoutStyles();
+  FX_TXTRUN tr;
+  tr.pAccess = m_pPage;
+  tr.pIdentity = (void*)hText;
+  tr.pStr = NULL;
+  tr.pWidths = NULL;
+  tr.iLength = nLength;
+  tr.pFont = pTextParams->pFont;
+  tr.fFontSize = pTextParams->fFontSize;
+  tr.dwStyles = dwLayoutStyle;
+  tr.iCharRotation = pTextParams->nCharRotation;
+  tr.dwCharStyles = pPiece->dwCharStyles;
+  tr.pRect = &(pPiece->rtPiece);
+  tr.wLineBreakChar = pTextParams->wLineBreakChar;
+  return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
+}
+int32_t CFDE_TxtEdtTextSet::GetCharRects(FDE_HVISUALOBJ hText,
+                                         CFX_RectFArray& rtArray) {
+  return GetCharRects_Impl(hText, rtArray);
+}
+int32_t CFDE_TxtEdtTextSet::GetCharRects_Impl(FDE_HVISUALOBJ hText,
+                                              CFX_RectFArray& rtArray,
+                                              FX_BOOL bBBox) {
+  if (hText == NULL) {
+    return 0;
+  }
+  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
+  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
+  int32_t nLength = pPiece->nCount;
+  if (nLength < 1) {
+    return 0;
+  }
+  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
+  FX_DWORD dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
+  FX_TXTRUN tr;
+  tr.pAccess = m_pPage;
+  tr.pIdentity = (void*)hText;
+  tr.pStr = NULL;
+  tr.pWidths = NULL;
+  tr.iLength = nLength;
+  tr.pFont = pTextParams->pFont;
+  tr.fFontSize = pTextParams->fFontSize;
+  tr.dwStyles = dwLayoutStyle;
+  tr.iCharRotation = pTextParams->nCharRotation;
+  tr.dwCharStyles = pPiece->dwCharStyles;
+  tr.pRect = &(pPiece->rtPiece);
+  tr.wLineBreakChar = pTextParams->wLineBreakChar;
+  return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox);
+}
+CFDE_TxtEdtPage::CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
+    : m_pIter(nullptr),
+      m_pTextSet(nullptr),
+      m_pBgnParag(nullptr),
+      m_pEndParag(nullptr),
+      m_nRefCount(0),
+      m_nPageStart(-1),
+      m_nCharCount(0),
+      m_nPageIndex(nPageIndex),
+      m_bLoaded(FALSE),
+      m_pCharWidth(nullptr) {
+  FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
+  FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
+  FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
+  FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
+  m_pEditEngine = (CFDE_TxtEdtEngine*)pEngine;
+}
+CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
+  m_PieceMassArr.RemoveAll(TRUE);
+  if (m_pTextSet) {
+    delete m_pTextSet;
+    m_pTextSet = NULL;
+  }
+  if (m_pCharWidth) {
+    delete[] m_pCharWidth;
+    m_pCharWidth = NULL;
+  }
+  if (m_pIter != NULL) {
+    m_pIter->Release();
+    m_pIter = NULL;
+  }
+}
+void CFDE_TxtEdtPage::Release() {
+  delete this;
+}
+IFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
+  return (IFDE_TxtEdtEngine*)m_pEditEngine;
+}
+FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() {
+  return FDE_VISUALOBJ_Text;
+}
+FX_BOOL CFDE_TxtEdtPage::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) {
+  return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetMatrix(FDE_HVISUALOBJ hVisualObj,
+                                   CFX_Matrix& matrix) {
+  return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
+  return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
+  return FALSE;
+}
+int32_t CFDE_TxtEdtPage::GetCharRect(int32_t nIndex,
+                                     CFX_RectF& rect,
+                                     FX_BOOL bBBox) const {
+  FXSYS_assert(m_nRefCount > 0);
+  FXSYS_assert(nIndex >= 0 && nIndex < m_nCharCount);
+  if (m_nRefCount < 1) {
+    return 0;
+  }
+  int32_t nCount = m_PieceMassArr.GetSize();
+  for (int32_t i = 0; i < nCount; i++) {
+    const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
+    if (nIndex >= pPiece->nStart &&
+        nIndex < (pPiece->nStart + pPiece->nCount)) {
+      CFX_RectFArray rectArr;
+      if (bBBox) {
+        m_pTextSet->GetCharRects_Impl((FDE_HVISUALOBJ)pPiece, rectArr, bBBox);
+      } else {
+        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
+      }
+      rect = rectArr[nIndex - pPiece->nStart];
+      return pPiece->nBidiLevel;
+    }
+  }
+  FXSYS_assert(0);
+  return 0;
+}
+int32_t CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF& fPoint,
+                                      FX_BOOL& bBefore) {
+  FX_BOOL bVertical = m_pEditEngine->GetEditParams()->dwLayoutStyles &
+                      FDE_TEXTEDITLAYOUT_DocVertical;
+  CFX_PointF ptF = fPoint;
+  NormalizePt2Rect(ptF, m_rtPageContents, FDE_TXTEDT_TOLERANCE);
+  int32_t nCount = m_PieceMassArr.GetSize();
+  CFX_RectF rtLine;
+  int32_t nBgn = 0;
+  int32_t nEnd = 0;
+  FX_BOOL bInLine = FALSE;
+  int32_t i = 0;
+  for (i = 0; i < nCount; i++) {
+    const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
+    if (!bInLine && (bVertical ? (pPiece->rtPiece.left <= ptF.x &&
+                                  pPiece->rtPiece.right() > ptF.x)
+                               : (pPiece->rtPiece.top <= ptF.y &&
+                                  pPiece->rtPiece.bottom() > ptF.y))) {
+      nBgn = nEnd = i;
+      rtLine = pPiece->rtPiece;
+      bInLine = TRUE;
+    } else if (bInLine) {
+      if (bVertical ? (!(pPiece->rtPiece.left <= ptF.x &&
+                         pPiece->rtPiece.right() > ptF.x))
+                    : (pPiece->rtPiece.bottom() <= ptF.y ||
+                       pPiece->rtPiece.top > ptF.y)) {
+        nEnd = i - 1;
+        break;
+      } else {
+        rtLine.Union(pPiece->rtPiece);
+      }
+    }
+  }
+  NormalizePt2Rect(ptF, rtLine, FDE_TXTEDT_TOLERANCE);
+  int32_t nCaret = 0;
+  FDE_TEXTEDITPIECE* pPiece = NULL;
+  for (i = nBgn; i <= nEnd; i++) {
+    pPiece = m_PieceMassArr.GetPtrAt(i);
+    nCaret = m_nPageStart + pPiece->nStart;
+    if (pPiece->rtPiece.Contains(ptF)) {
+      CFX_RectFArray rectArr;
+      m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
+      int32_t nRtCount = rectArr.GetSize();
+      for (int32_t j = 0; j < nRtCount; j++) {
+        if (rectArr[j].Contains(ptF)) {
+          nCaret = m_nPageStart + pPiece->nStart + j;
+          if (nCaret >= m_pEditEngine->GetTextBufLength()) {
+            bBefore = TRUE;
+            return m_pEditEngine->GetTextBufLength();
+          }
+          FX_WCHAR wChar = m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret);
+          if (wChar == L'\n' || wChar == L'\r') {
+            if (wChar == L'\n') {
+              if (m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret - 1) ==
+                  L'\r') {
+                nCaret--;
+              }
+            }
+            bBefore = TRUE;
+            return nCaret;
+          }
+          if (bVertical
+                  ? (ptF.y > ((rectArr[j].top + rectArr[j].bottom()) / 2))
+                  : (ptF.x > ((rectArr[j].left + rectArr[j].right()) / 2))) {
+            bBefore = FX_IsOdd(pPiece->nBidiLevel);
+          } else {
+            bBefore = !FX_IsOdd(pPiece->nBidiLevel);
+          }
+          return nCaret;
+        }
+      }
+    }
+  }
+  bBefore = TRUE;
+  return nCaret;
+}
+int32_t CFDE_TxtEdtPage::GetCharStart() const {
+  return m_nPageStart;
+}
+int32_t CFDE_TxtEdtPage::GetCharCount() const {
+  return m_nCharCount;
+}
+int32_t CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF& rtClip,
+                                       FXTEXT_CHARPOS*& pCharPos,
+                                       CFX_RectF* pBBox) const {
+  pCharPos = FX_Alloc(FXTEXT_CHARPOS, m_nCharCount);
+  int32_t nCharPosCount = 0;
+  FDE_HVISUALOBJ hVisualObj = NULL;
+  int32_t nVisualObjCount = m_PieceMassArr.GetSize();
+  FXTEXT_CHARPOS* pos = pCharPos;
+  CFX_RectF rtObj;
+  for (int32_t i = 0; i < nVisualObjCount; i++) {
+    hVisualObj = (FDE_HVISUALOBJ)m_PieceMassArr.GetPtrAt(i);
+    m_pTextSet->GetRect(hVisualObj, rtObj);
+    if (!rtClip.IntersectWith(rtObj)) {
+      continue;
+    }
+    int32_t nCount = m_pTextSet->GetDisplayPos(hVisualObj, pos, FALSE);
+    nCharPosCount += nCount;
+    pos += nCount;
+  }
+  if ((nCharPosCount * 5) < (m_nCharCount << 2)) {
+    FXTEXT_CHARPOS* pTemp = FX_Alloc(FXTEXT_CHARPOS, nCharPosCount);
+    FXSYS_memcpy(pTemp, pCharPos, sizeof(FXTEXT_CHARPOS) * nCharPosCount);
+    FX_Free(pCharPos);
+    pCharPos = pTemp;
+  }
+  return nCharPosCount;
+}
+void CFDE_TxtEdtPage::CalcRangeRectArray(int32_t nStart,
+                                         int32_t nCount,
+                                         CFX_RectFArray& RectFArr) const {
+  int32_t nPieceCount = m_PieceMassArr.GetSize();
+  int32_t nEnd = nStart + nCount - 1;
+  FX_BOOL bInRange = FALSE;
+  for (int32_t i = 0; i < nPieceCount; i++) {
+    FDE_TEXTEDITPIECE* piece = m_PieceMassArr.GetPtrAt(i);
+    if (!bInRange) {
+      if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) {
+        int32_t nRangeEnd = piece->nCount - 1;
+        FX_BOOL bEnd = FALSE;
+        if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
+          nRangeEnd = nEnd - piece->nStart;
+          bEnd = TRUE;
+        }
+        CFX_RectFArray rcArr;
+        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
+        CFX_RectF rectPiece = rcArr[nStart - piece->nStart];
+        rectPiece.Union(rcArr[nRangeEnd]);
+        RectFArr.Add(rectPiece);
+        if (bEnd) {
+          return;
+        }
+        bInRange = TRUE;
+      }
+    } else {
+      if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
+        CFX_RectFArray rcArr;
+        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
+        CFX_RectF rectPiece = rcArr[0];
+        rectPiece.Union(rcArr[nEnd - piece->nStart]);
+        RectFArr.Add(rectPiece);
+        return;
+      }
+      RectFArr.Add(piece->rtPiece);
+    }
+  }
+}
+
+int32_t CFDE_TxtEdtPage::SelectWord(const CFX_PointF& fPoint, int32_t& nCount) {
+  if (m_nRefCount < 0) {
+    return -1;
+  }
+  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
+  FX_BOOL bBefore;
+  int32_t nIndex = GetCharIndex(fPoint, bBefore);
+  if (nIndex == m_pEditEngine->GetTextBufLength()) {
+    nIndex = m_pEditEngine->GetTextBufLength() - 1;
+  }
+  if (nIndex < 0) {
+    return -1;
+  }
+  IFX_WordBreak* pIter = FX_WordBreak_Create();
+  pIter->Attach(new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf));
+  pIter->SetAt(nIndex);
+  nCount = pIter->GetWordLength();
+  int32_t nRet = pIter->GetWordPos();
+  pIter->Release();
+  return nRet;
+}
+FX_BOOL CFDE_TxtEdtPage::IsLoaded(const CFX_RectF* pClipBox) {
+  return m_bLoaded;
+}
+int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox,
+                                  IFX_Pause* pPause) {
+  if (m_nRefCount > 0) {
+    m_nRefCount++;
+    return m_nRefCount;
+  }
+  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
+  const FDE_TXTEDTPARAMS* pParams = m_pEditEngine->GetEditParams();
+  if (m_pIter != NULL) {
+    m_pIter->Release();
+  }
+  FX_WCHAR wcAlias = 0;
+  if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
+    wcAlias = m_pEditEngine->GetAliasChar();
+  }
+  m_pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias);
+  IFX_TxtBreak* pBreak = m_pEditEngine->GetTextBreak();
+  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  pBreak->ClearBreakPieces();
+  int32_t nPageLineCount = m_pEditEngine->GetPageLineCount();
+  int32_t nStartLine = nPageLineCount * m_nPageIndex;
+  int32_t nEndLine = std::min((nStartLine + nPageLineCount - 1),
+                              (m_pEditEngine->GetLineCount() - 1));
+  int32_t nPageStart, nPageEnd, nTemp, nBgnParag, nStartLineInParag, nEndParag,
+      nEndLineInParag;
+  nBgnParag = m_pEditEngine->Line2Parag(0, 0, nStartLine, nStartLineInParag);
+  m_pBgnParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nBgnParag);
+  m_pBgnParag->LoadParag();
+  m_pBgnParag->GetLineRange(nStartLine - nStartLineInParag, nPageStart, nTemp);
+  nEndParag = m_pEditEngine->Line2Parag(nBgnParag, nStartLineInParag, nEndLine,
+                                        nEndLineInParag);
+  m_pEndParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nEndParag);
+  m_pEndParag->LoadParag();
+  m_pEndParag->GetLineRange(nEndLine - nEndLineInParag, nPageEnd, nTemp);
+  nPageEnd += (nTemp - 1);
+  FX_BOOL bVertial = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
+  FX_BOOL bLineReserve =
+      pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+  FX_FLOAT fLineStart =
+      bVertial
+          ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f)
+          : 0.0f;
+  FX_FLOAT fLineStep =
+      (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
+  FX_FLOAT fLinePos = fLineStart;
+  if (m_pTextSet == NULL) {
+    m_pTextSet = new CFDE_TxtEdtTextSet(this);
+  }
+  m_PieceMassArr.RemoveAll(TRUE);
+  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+  int32_t nPieceStart = 0;
+  if (m_pCharWidth != NULL) {
+    delete[] m_pCharWidth;
+  }
+  m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1];
+  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  pBreak->ClearBreakPieces();
+  m_nPageStart = nPageStart;
+  m_nCharCount = nPageEnd - nPageStart + 1;
+  FX_BOOL bReload = FALSE;
+  FX_FLOAT fDefCharWidth = 0;
+  IFX_CharIter* pIter = m_pIter->Clone();
+  pIter->SetAt(nPageStart);
+  m_pIter->SetAt(nPageStart);
+  FX_BOOL bFirstPiece = TRUE;
+  do {
+    if (bReload) {
+      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    } else {
+      FX_WCHAR wAppend = pIter->GetChar();
+      dwBreakStatus = pBreak->AppendChar(wAppend);
+    }
+    if (pIter->GetAt() == nPageEnd && dwBreakStatus < FX_TXTBREAK_LineBreak) {
+      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    }
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      int32_t nPieceCount = pBreak->CountBreakPieces();
+      for (int32_t j = 0; j < nPieceCount; j++) {
+        const CFX_TxtPiece* pPiece = pBreak->GetBreakPiece(j);
+        FDE_TEXTEDITPIECE TxtEdtPiece;
+        FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE));
+        TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel;
+        TxtEdtPiece.nCount = pPiece->GetLength();
+        TxtEdtPiece.nStart = nPieceStart;
+        TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles;
+        if (FX_IsOdd(pPiece->m_iBidiLevel)) {
+          TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
+        }
+        FX_FLOAT fParaBreakWidth = 0.0f;
+        if (pPiece->m_dwStatus > FX_TXTBREAK_PieceBreak) {
+          FX_WCHAR wRtChar = pParams->wLineBreakChar;
+          if (TxtEdtPiece.nCount >= 2) {
+            FX_WCHAR wChar = pBuf->GetCharByIndex(
+                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
+            FX_WCHAR wCharPre = pBuf->GetCharByIndex(
+                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 2);
+            if (wChar == wRtChar) {
+              fParaBreakWidth += fDefCharWidth;
+            }
+            if (wCharPre == wRtChar) {
+              fParaBreakWidth += fDefCharWidth;
+            }
+          } else if (TxtEdtPiece.nCount >= 1) {
+            FX_WCHAR wChar = pBuf->GetCharByIndex(
+                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
+            if (wChar == wRtChar) {
+              fParaBreakWidth += fDefCharWidth;
+            }
+          }
+        }
+        if (pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+          TxtEdtPiece.rtPiece.left = fLinePos;
+          TxtEdtPiece.rtPiece.top = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+          TxtEdtPiece.rtPiece.width = pParams->fLineSpace;
+          TxtEdtPiece.rtPiece.height =
+              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
+        } else {
+          TxtEdtPiece.rtPiece.left = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+          TxtEdtPiece.rtPiece.top = fLinePos;
+          TxtEdtPiece.rtPiece.width =
+              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
+          TxtEdtPiece.rtPiece.height = pParams->fLineSpace;
+        }
+        if (bFirstPiece) {
+          m_rtPageContents = TxtEdtPiece.rtPiece;
+          bFirstPiece = FALSE;
+        } else {
+          m_rtPageContents.Union(TxtEdtPiece.rtPiece);
+        }
+        nPieceStart += TxtEdtPiece.nCount;
+        m_PieceMassArr.Add(TxtEdtPiece);
+        for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
+          CFX_Char* ptc = pPiece->GetCharPtr(k);
+          m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
+        }
+      }
+      fLinePos += fLineStep;
+      pBreak->ClearBreakPieces();
+    }
+    if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) {
+      bReload = TRUE;
+      pIter->Next(TRUE);
+    }
+  } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd));
+  if (m_rtPageContents.left != 0) {
+    FX_FLOAT fDelta = 0.0f;
+    if (m_rtPageContents.width < pParams->fPlateWidth) {
+      if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Right) {
+        fDelta = pParams->fPlateWidth - m_rtPageContents.width;
+      } else if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Center) {
+        if ((pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) &&
+            m_nCharCount > 1) {
+          int32_t nCount = m_nCharCount - 1;
+          int32_t n = (m_pEditEngine->m_nLimit - nCount) / 2;
+          fDelta = (m_rtPageContents.width / nCount) * n;
+        } else {
+          fDelta = (pParams->fPlateWidth - m_rtPageContents.width) / 2;
+        }
+      }
+    }
+    FX_FLOAT fOffset = m_rtPageContents.left - fDelta;
+    int32_t nCount = m_PieceMassArr.GetSize();
+    for (int32_t i = 0; i < nCount; i++) {
+      FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
+      pPiece->rtPiece.Offset(-fOffset, 0.0f);
+    }
+    m_rtPageContents.Offset(-fOffset, 0.0f);
+  }
+  if (m_pEditEngine->GetEditParams()->dwLayoutStyles &
+      FDE_TEXTEDITLAYOUT_LastLineHeight) {
+    m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize;
+    int32_t nCount = m_PieceMassArr.GetSize();
+    FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
+    pPiece->rtPiece.height = pParams->fFontSize;
+  }
+  pIter->Release();
+  m_nRefCount = 1;
+  m_bLoaded = TRUE;
+  return 0;
+}
+void CFDE_TxtEdtPage::UnloadPage(const CFX_RectF* pClipBox) {
+  FXSYS_assert(m_nRefCount > 0);
+  m_nRefCount--;
+  if (m_nRefCount == 0) {
+    m_PieceMassArr.RemoveAll();
+    if (m_pTextSet) {
+      delete m_pTextSet;
+      m_pTextSet = NULL;
+    }
+    if (m_pCharWidth) {
+      delete[] m_pCharWidth;
+      m_pCharWidth = NULL;
+    }
+    if (m_pBgnParag) {
+      m_pBgnParag->UnloadParag();
+    }
+    if (m_pEndParag) {
+      m_pEndParag->UnloadParag();
+    }
+    if (m_pIter) {
+      m_pIter->Release();
+      m_pIter = NULL;
+    }
+    m_pBgnParag = NULL;
+    m_pEndParag = NULL;
+  }
+}
+
+const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() {
+  return m_rtPageContents;
+}
+FX_POSITION CFDE_TxtEdtPage::GetFirstPosition(FDE_HVISUALOBJ hCanvas) {
+  if (m_PieceMassArr.GetSize() < 1) {
+    return NULL;
+  }
+  return (FX_POSITION)1;
+}
+FDE_HVISUALOBJ CFDE_TxtEdtPage::GetNext(FDE_HVISUALOBJ hCanvas,
+                                        FX_POSITION& pos,
+                                        IFDE_VisualSet*& pVisualSet) {
+  if (m_pTextSet == NULL) {
+    pos = NULL;
+    return NULL;
+  }
+  int32_t nPos = (int32_t)(uintptr_t)pos;
+  pVisualSet = m_pTextSet;
+  if (nPos + 1 > m_PieceMassArr.GetSize()) {
+    pos = NULL;
+  } else {
+    pos = (FX_POSITION)(uintptr_t)(nPos + 1);
+  }
+  return (FDE_HVISUALOBJ)(m_PieceMassArr.GetPtrAt(nPos - 1));
+}
+FDE_HVISUALOBJ CFDE_TxtEdtPage::GetParentCanvas(FDE_HVISUALOBJ hCanvas,
+                                                IFDE_VisualSet*& pVisualSet) {
+  return NULL;
+}
+FX_WCHAR CFDE_TxtEdtPage::GetChar(void* pIdentity, int32_t index) const {
+  int32_t nIndex =
+      m_nPageStart + ((FDE_TEXTEDITPIECE*)pIdentity)->nStart + index;
+  if (nIndex != m_pIter->GetAt()) {
+    m_pIter->SetAt(nIndex);
+  }
+  FX_WCHAR wChar = m_pIter->GetChar();
+  m_pIter->Next();
+  return wChar;
+}
+int32_t CFDE_TxtEdtPage::GetWidth(void* pIdentity, int32_t index) const {
+  int32_t nWidth =
+      m_pCharWidth[((FDE_TEXTEDITPIECE*)pIdentity)->nStart + index];
+  return nWidth;
+}
+void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF& ptF,
+                                       const CFX_RectF& rtF,
+                                       FX_FLOAT fTolerance) const {
+  if (rtF.Contains(ptF.x, ptF.y)) {
+    return;
+  }
+  if (ptF.x < rtF.left) {
+    ptF.x = rtF.left;
+  } else if (ptF.x >= rtF.right()) {
+    ptF.x = rtF.right() - fTolerance;
+  }
+  if (ptF.y < rtF.top) {
+    ptF.y = rtF.top;
+  } else if (ptF.y >= rtF.bottom()) {
+    ptF.y = rtF.bottom() - fTolerance;
+  }
+}
diff --git a/xfa/fee/fde_txtedtpage.h b/xfa/fee/fde_txtedtpage.h
new file mode 100644
index 0000000..66c4c49
--- /dev/null
+++ b/xfa/fee/fde_txtedtpage.h
@@ -0,0 +1,168 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FDE_TXTEDTPAGE_H_
+#define XFA_FEE_FDE_TXTEDTPAGE_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fde/fde_visualset.h"
+#include "xfa/fee/ifde_txtedtpage.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+
+class IFX_CharIter;
+class CFDE_TxtEdtEngine;
+class CFDE_TxtEdtPage;
+class CFDE_TxtEdtParag;
+
+enum FDE_TXTEDT_CHARTYPE {
+  FDE_TXTEDT_CHARTYPE_Unknown = 0,
+  FDE_TXTEDT_CHARTYPE_Tab,
+  FDE_TXTEDT_CHARTYPE_Space,
+  FDE_TXTEDT_CHARTYPE_Punctuation,
+  FDE_TXTEDT_CHARTYPE_LineBreak,
+  FDE_TXTEDT_CHARTYPE_Number,
+  FDE_TXTEDT_CHARTYPE_Char,
+  FDE_TXTEDT_CHARTYPE_CJK,
+};
+
+inline FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar) {
+  if (wChar == 0x9) {
+    return FDE_TXTEDT_CHARTYPE_Tab;
+  } else if (wChar == 0x20 || wChar == 0xA0) {
+    return FDE_TXTEDT_CHARTYPE_Space;
+  } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 ||
+             (wChar >= L'!' && wChar <= L'/') ||
+             (wChar >= L':' && wChar <= L'@') ||
+             (wChar >= L'[' && wChar <= L'^') ||
+             (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) {
+    return FDE_TXTEDT_CHARTYPE_Punctuation;
+  } else if (wChar == 0x0a || wChar == 0x0d) {
+    return FDE_TXTEDT_CHARTYPE_LineBreak;
+  } else if (wChar >= '0' && wChar <= '9') {
+    return FDE_TXTEDT_CHARTYPE_Number;
+  } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) ||
+             (wChar >= 0x3000 && wChar <= 0x303f) ||
+             (wChar >= 0x31c0 && wChar <= 0x31ef) ||
+             (wChar >= 0x3200 && wChar <= 0x32ff) ||
+             (wChar >= 0x3300 && wChar <= 0x33ff) ||
+             (wChar >= 0x3400 && wChar <= 0x4dbf) ||
+             (wChar >= 0x4e00 && wChar <= 0x9fff) ||
+             (wChar >= 0xf900 && wChar <= 0xfaff) ||
+             (wChar >= 0xfe30 && wChar <= 0xfe4f)) {
+    return FDE_TXTEDT_CHARTYPE_CJK;
+  } else {
+    return FDE_TXTEDT_CHARTYPE_Char;
+  }
+}
+
+struct FDE_TEXTEDITPIECE {
+  int32_t nStart;
+  int32_t nCount;
+  int32_t nBidiLevel;
+  CFX_RectF rtPiece;
+  FX_DWORD dwCharStyles;
+};
+typedef CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> CFDE_TXTEDTPieceMassArray;
+
+class CFDE_TxtEdtTextSet : public IFDE_TextSet {
+ public:
+  CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage);
+  ~CFDE_TxtEdtTextSet();
+
+  virtual FDE_VISUALOBJTYPE GetType();
+  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox);
+  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix);
+  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
+  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
+  virtual int32_t GetString(FDE_HVISUALOBJ hText, CFX_WideString& wsText);
+  virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText);
+  virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText);
+  virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText);
+  virtual int32_t GetDisplayPos(FDE_HVISUALOBJ hText,
+                                FXTEXT_CHARPOS* pCharPos,
+                                FX_BOOL bCharCode = FALSE,
+                                CFX_WideString* pWSForms = NULL);
+  virtual int32_t GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray& rtArray);
+  virtual int32_t GetCharRects_Impl(FDE_HVISUALOBJ hText,
+                                    CFX_RectFArray& rtArray,
+                                    FX_BOOL bBBox = FALSE);
+
+ private:
+  CFDE_TxtEdtPage* m_pPage;
+};
+
+class CFDE_TxtEdtPage : public IFDE_TxtEdtPage {
+ public:
+  CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nLineIndex);
+
+  // IFDE_TxtEditPage:
+  void Release() override;
+  IFDE_TxtEdtEngine* GetEngine() const override;
+  int32_t GetCharRect(int32_t nIndex,
+                      CFX_RectF& rect,
+                      FX_BOOL bBBox = FALSE) const override;
+  int32_t GetCharIndex(const CFX_PointF& fPoint, FX_BOOL& bBefore) override;
+  void CalcRangeRectArray(int32_t nStart,
+                          int32_t nCount,
+                          CFX_RectFArray& RectFArr) const override;
+  int32_t SelectWord(const CFX_PointF& fPoint, int32_t& nCount) override;
+  int32_t GetCharStart() const override;
+  int32_t GetCharCount() const override;
+  int32_t GetDisplayPos(const CFX_RectF& rtClip,
+                        FXTEXT_CHARPOS*& pCharPos,
+                        CFX_RectF* pBBox) const override;
+  FX_BOOL IsLoaded(const CFX_RectF* pClipBox) override;
+  int32_t LoadPage(const CFX_RectF* pClipBox, IFX_Pause* pPause) override;
+  void UnloadPage(const CFX_RectF* pClipBox) override;
+  const CFX_RectF& GetContentsBox() override;
+
+  // IFDE_VisualSet:
+  FDE_VISUALOBJTYPE GetType() override;
+  FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) override;
+  FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix) override;
+  FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) override;
+  FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) override;
+
+  // IFDE_CanvasSet:
+  FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas) override;
+  FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas,
+                         FX_POSITION& pos,
+                         IFDE_VisualSet*& pVisualSet) override;
+  FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas,
+                                 IFDE_VisualSet*& pVisualSet) override;
+
+  // IFX_TxtAccess:
+  FX_WCHAR GetChar(void* pIdentity, int32_t index) const override;
+  int32_t GetWidth(void* pIdentity, int32_t index) const override;
+
+ protected:
+  virtual ~CFDE_TxtEdtPage();
+
+ private:
+  void NormalizePt2Rect(CFX_PointF& ptF,
+                        const CFX_RectF& rtF,
+                        FX_FLOAT fTolerance) const;
+
+  IFX_CharIter* m_pIter;
+  CFDE_TxtEdtTextSet* m_pTextSet;
+  CFDE_TxtEdtEngine* m_pEditEngine;
+  CFDE_TXTEDTPieceMassArray m_PieceMassArr;
+  CFDE_TxtEdtParag* m_pBgnParag;
+  CFDE_TxtEdtParag* m_pEndParag;
+  int32_t m_nRefCount;
+  int32_t m_nPageStart;
+  int32_t m_nCharCount;
+  int32_t m_nPageIndex;
+  FX_BOOL m_bLoaded;
+  CFX_RectF m_rtPage;
+  CFX_RectF m_rtPageMargin;
+  CFX_RectF m_rtPageContents;
+  CFX_RectF m_rtPageCanvas;
+  int32_t* m_pCharWidth;
+};
+
+#endif  // XFA_FEE_FDE_TXTEDTPAGE_H_
diff --git a/xfa/fee/fde_txtedtparag.cpp b/xfa/fee/fde_txtedtparag.cpp
new file mode 100644
index 0000000..427bbbc
--- /dev/null
+++ b/xfa/fee/fde_txtedtparag.cpp
@@ -0,0 +1,150 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fde_txtedtparag.h"
+
+#include "xfa/fee/fde_txtedtbuf.h"
+#include "xfa/fee/fde_txtedtengine.h"
+#include "xfa/fee/fx_wordbreak/fx_wordbreak.h"
+#include "xfa/fee/ifde_txtedtbuf.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+#include "xfa/fgas/layout/fgas_textbreak.h"
+
+CFDE_TxtEdtParag::CFDE_TxtEdtParag(CFDE_TxtEdtEngine* pEngine)
+    : m_nCharStart(0),
+      m_nCharCount(0),
+      m_nLineCount(0),
+      m_lpData(NULL),
+      m_pEngine(pEngine) {
+  FXSYS_assert(m_pEngine);
+}
+CFDE_TxtEdtParag::~CFDE_TxtEdtParag() {
+  if (m_lpData != NULL) {
+    FX_Free(m_lpData);
+  }
+}
+void CFDE_TxtEdtParag::LoadParag() {
+  if (m_lpData != NULL) {
+    ((int32_t*)m_lpData)[0]++;
+    return;
+  }
+  IFX_TxtBreak* pTxtBreak = m_pEngine->GetTextBreak();
+  IFDE_TxtEdtBuf* pTxtBuf = m_pEngine->GetTextBuf();
+  const FDE_TXTEDTPARAMS* pParam = m_pEngine->GetEditParams();
+  FX_WCHAR wcAlias = 0;
+  if (pParam->dwMode & FDE_TEXTEDITMODE_Password) {
+    wcAlias = m_pEngine->GetAliasChar();
+  }
+  IFX_CharIter* pIter =
+      new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf, wcAlias);
+  pIter->SetAt(m_nCharStart);
+  int32_t nEndIndex = m_nCharStart + m_nCharCount;
+  CFX_ArrayTemplate<int32_t> LineBaseArr;
+  FX_BOOL bReload = FALSE;
+  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+  do {
+    if (bReload) {
+      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    } else {
+      FX_WCHAR wAppend = pIter->GetChar();
+      dwBreakStatus = pTxtBreak->AppendChar(wAppend);
+    }
+    if (pIter->GetAt() + 1 == nEndIndex &&
+        dwBreakStatus < FX_TXTBREAK_LineBreak) {
+      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    }
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      int32_t nCount = pTxtBreak->CountBreakPieces();
+      int32_t nTotal = 0;
+      for (int32_t j = 0; j < nCount; j++) {
+        const CFX_TxtPiece* Piece = pTxtBreak->GetBreakPiece(j);
+        nTotal += Piece->GetLength();
+      }
+      LineBaseArr.Add(nTotal);
+      pTxtBreak->ClearBreakPieces();
+    }
+    if ((pIter->GetAt() + 1 == nEndIndex) &&
+        (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
+      bReload = TRUE;
+      pIter->Next(TRUE);
+    }
+  } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
+  pIter->Release();
+  pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  pTxtBreak->ClearBreakPieces();
+  int32_t nLineCount = LineBaseArr.GetSize();
+  m_nLineCount = nLineCount;
+  if (m_lpData == NULL) {
+    m_lpData = FX_Alloc(int32_t, nLineCount + 1);
+  } else {
+    m_lpData = FX_Realloc(int32_t, m_lpData, (nLineCount + 1));
+  }
+  int32_t* pIntArr = (int32_t*)m_lpData;
+  pIntArr[0] = 1;
+  m_nLineCount = nLineCount;
+  pIntArr++;
+  for (int32_t j = 0; j < nLineCount; j++, pIntArr++) {
+    *pIntArr = LineBaseArr[j];
+  }
+  LineBaseArr.RemoveAll();
+}
+void CFDE_TxtEdtParag::UnloadParag() {
+  FXSYS_assert(m_lpData != NULL);
+  ((int32_t*)m_lpData)[0]--;
+  FXSYS_assert(((int32_t*)m_lpData)[0] >= 0);
+  if (((int32_t*)m_lpData)[0] == 0) {
+    FX_Free(m_lpData);
+    m_lpData = NULL;
+  }
+}
+void CFDE_TxtEdtParag::CalcLines() {
+  IFX_TxtBreak* pTxtBreak = m_pEngine->GetTextBreak();
+  IFDE_TxtEdtBuf* pTxtBuf = m_pEngine->GetTextBuf();
+  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf);
+  int32_t nCount = 0;
+  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+  int32_t nEndIndex = m_nCharStart + m_nCharCount;
+  pIter->SetAt(m_nCharStart);
+  FX_BOOL bReload = FALSE;
+  do {
+    if (bReload) {
+      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    } else {
+      FX_WCHAR wAppend = pIter->GetChar();
+      dwBreakStatus = pTxtBreak->AppendChar(wAppend);
+    }
+    if (pIter->GetAt() + 1 == nEndIndex &&
+        dwBreakStatus < FX_TXTBREAK_LineBreak) {
+      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+    }
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+      nCount++;
+      pTxtBreak->ClearBreakPieces();
+    }
+    if ((pIter->GetAt() + 1 == nEndIndex) &&
+        (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
+      bReload = TRUE;
+      pIter->Next(TRUE);
+    }
+  } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
+  pIter->Release();
+  pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+  pTxtBreak->ClearBreakPieces();
+  m_nLineCount = nCount;
+}
+void CFDE_TxtEdtParag::GetLineRange(int32_t nLineIndex,
+                                    int32_t& nStart,
+                                    int32_t& nCount) const {
+  int32_t* pLineBaseArr = (int32_t*)m_lpData;
+  FXSYS_assert(nLineIndex < m_nLineCount);
+  nStart = m_nCharStart;
+  pLineBaseArr++;
+  for (int32_t i = 0; i < nLineIndex; i++) {
+    nStart += *pLineBaseArr;
+    pLineBaseArr++;
+  }
+  nCount = *pLineBaseArr;
+}
diff --git a/xfa/fee/fde_txtedtparag.h b/xfa/fee/fde_txtedtparag.h
new file mode 100644
index 0000000..39921d5
--- /dev/null
+++ b/xfa/fee/fde_txtedtparag.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FDE_TXTEDTPARAG_H_
+#define XFA_FEE_FDE_TXTEDTPARAG_H_
+
+#include "xfa/fee/ifde_txtedtengine.h"
+
+class CFDE_TxtEdtEngine;
+
+class CFDE_TxtEdtParag : public IFDE_TxtEdtParag {
+ public:
+  explicit CFDE_TxtEdtParag(CFDE_TxtEdtEngine* pEngine);
+  ~CFDE_TxtEdtParag();
+
+  virtual int32_t GetTextLength() const { return m_nCharCount; }
+  virtual int32_t GetStartIndex() const { return m_nCharStart; }
+  virtual int32_t CountLines() const { return m_nLineCount; }
+  virtual void GetLineRange(int32_t nLineIndex,
+                            int32_t& nStart,
+                            int32_t& nCount) const;
+  void LoadParag();
+  void UnloadParag();
+  void CalcLines();
+  int32_t m_nCharStart;
+  int32_t m_nCharCount;
+  int32_t m_nLineCount;
+
+ private:
+  void* m_lpData;
+  CFDE_TxtEdtEngine* m_pEngine;
+};
+
+#endif  // XFA_FEE_FDE_TXTEDTPARAG_H_
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreak.h b/xfa/fee/fx_wordbreak/fx_wordbreak.h
new file mode 100644
index 0000000..0288b59
--- /dev/null
+++ b/xfa/fee/fx_wordbreak/fx_wordbreak.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
+#define XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class IFX_CharIter;
+
+class IFX_WordBreak {
+ public:
+  virtual ~IFX_WordBreak() {}
+  virtual void Release() = 0;
+  virtual void Attach(IFX_CharIter* pIter) = 0;
+  virtual void Attach(const CFX_WideString& wsText) = 0;
+  virtual FX_BOOL Next(FX_BOOL bPrev) = 0;
+  virtual void SetAt(int32_t nIndex) = 0;
+  virtual int32_t GetWordPos() const = 0;
+  virtual int32_t GetWordLength() const = 0;
+  virtual void GetWord(CFX_WideString& wsWord) const = 0;
+  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
+};
+IFX_WordBreak* FX_WordBreak_Create();
+
+#endif  // XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp
new file mode 100644
index 0000000..d1b079e
--- /dev/null
+++ b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp
@@ -0,0 +1,238 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fx_wordbreak/fx_wordbreak_impl.h"
+
+FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint) {
+  FX_DWORD dwProperty =
+      (FX_DWORD)gs_FX_WordBreak_CodePointProperties[wcCodePoint >> 1];
+  return (FX_WordBreakProp)(((wcCodePoint)&1) ? (dwProperty & 0x0F)
+                                              : (dwProperty >> 4));
+}
+CFX_CharIter::CFX_CharIter(const CFX_WideString& wsText)
+    : m_wsText(wsText), m_nIndex(0) {
+  FXSYS_assert(!wsText.IsEmpty());
+}
+CFX_CharIter::~CFX_CharIter() {}
+void CFX_CharIter::Release() {
+  delete this;
+}
+FX_BOOL CFX_CharIter::Next(FX_BOOL bPrev) {
+  if (bPrev) {
+    if (m_nIndex <= 0) {
+      return FALSE;
+    }
+    m_nIndex--;
+  } else {
+    if (m_nIndex + 1 >= m_wsText.GetLength()) {
+      return FALSE;
+    }
+    m_nIndex++;
+  }
+  return TRUE;
+}
+FX_WCHAR CFX_CharIter::GetChar() {
+  return m_wsText.GetAt(m_nIndex);
+}
+void CFX_CharIter::SetAt(int32_t nIndex) {
+  if (nIndex < 0 || nIndex >= m_wsText.GetLength()) {
+    return;
+  }
+  m_nIndex = nIndex;
+}
+int32_t CFX_CharIter::GetAt() const {
+  return m_nIndex;
+}
+FX_BOOL CFX_CharIter::IsEOF(FX_BOOL bTail) const {
+  return bTail ? (m_nIndex + 1 == m_wsText.GetLength()) : (m_nIndex == 0);
+}
+IFX_CharIter* CFX_CharIter::Clone() {
+  CFX_CharIter* pIter = new CFX_CharIter(m_wsText);
+  pIter->m_nIndex = m_nIndex;
+  return pIter;
+}
+CFX_WordBreak::CFX_WordBreak() : m_pPreIter(NULL), m_pCurIter(NULL) {}
+CFX_WordBreak::~CFX_WordBreak() {
+  if (m_pPreIter) {
+    m_pPreIter->Release();
+    m_pPreIter = NULL;
+  }
+  if (m_pCurIter) {
+    m_pCurIter->Release();
+    m_pCurIter = NULL;
+  }
+}
+void CFX_WordBreak::Release() {
+  delete this;
+}
+void CFX_WordBreak::Attach(IFX_CharIter* pIter) {
+  FXSYS_assert(pIter);
+  m_pCurIter = pIter;
+}
+void CFX_WordBreak::Attach(const CFX_WideString& wsText) {
+  m_pCurIter = new CFX_CharIter(wsText);
+}
+FX_BOOL CFX_WordBreak::Next(FX_BOOL bPrev) {
+  IFX_CharIter* pIter = bPrev ? m_pPreIter->Clone() : m_pCurIter->Clone();
+  if (pIter->IsEOF(!bPrev)) {
+    return FALSE;
+  }
+  pIter->Next(bPrev);
+  if (!FindNextBreakPos(pIter, bPrev, TRUE)) {
+    pIter->Release();
+    return FALSE;
+  }
+  if (bPrev) {
+    m_pCurIter->Release();
+    m_pCurIter = m_pPreIter;
+    m_pCurIter->Next(TRUE);
+    m_pPreIter = pIter;
+  } else {
+    m_pPreIter->Release();
+    m_pPreIter = m_pCurIter;
+    m_pPreIter->Next();
+    m_pCurIter = pIter;
+  }
+  return TRUE;
+}
+void CFX_WordBreak::SetAt(int32_t nIndex) {
+  if (m_pPreIter) {
+    m_pPreIter->Release();
+    m_pPreIter = NULL;
+  }
+  m_pCurIter->SetAt(nIndex);
+  FindNextBreakPos(m_pCurIter, TRUE, FALSE);
+  m_pPreIter = m_pCurIter;
+  m_pCurIter = m_pPreIter->Clone();
+  FindNextBreakPos(m_pCurIter, FALSE, FALSE);
+}
+int32_t CFX_WordBreak::GetWordPos() const {
+  return m_pPreIter->GetAt();
+}
+int32_t CFX_WordBreak::GetWordLength() const {
+  return m_pCurIter->GetAt() - m_pPreIter->GetAt() + 1;
+}
+void CFX_WordBreak::GetWord(CFX_WideString& wsWord) const {
+  int32_t nWordLength = GetWordLength();
+  if (nWordLength <= 0) {
+    return;
+  }
+  FX_WCHAR* lpBuf = wsWord.GetBuffer(nWordLength);
+  IFX_CharIter* pTempIter = m_pPreIter->Clone();
+  int32_t i = 0;
+  while (pTempIter->GetAt() <= m_pCurIter->GetAt()) {
+    lpBuf[i++] = pTempIter->GetChar();
+    FX_BOOL bEnd = pTempIter->Next();
+    if (!bEnd) {
+      break;
+    }
+  }
+  pTempIter->Release();
+  wsWord.ReleaseBuffer(nWordLength);
+}
+FX_BOOL CFX_WordBreak::IsEOF(FX_BOOL bTail) const {
+  return m_pCurIter->IsEOF(bTail);
+}
+FX_BOOL CFX_WordBreak::FindNextBreakPos(IFX_CharIter* pIter,
+                                        FX_BOOL bPrev,
+                                        FX_BOOL bFromNext) {
+  FX_WordBreakProp ePreType = FX_WordBreakProp_None;
+  FX_WordBreakProp eCurType = FX_WordBreakProp_None;
+  FX_WordBreakProp eNextType = FX_WordBreakProp_None;
+  if (pIter->IsEOF(!bPrev)) {
+    return TRUE;
+  }
+  if (!(bFromNext || pIter->IsEOF(bPrev))) {
+    pIter->Next(!bPrev);
+    FX_WCHAR wcTemp = pIter->GetChar();
+    ePreType = FX_GetWordBreakProperty(wcTemp);
+    pIter->Next(bPrev);
+  }
+  FX_WCHAR wcTemp = pIter->GetChar();
+  eCurType = FX_GetWordBreakProperty(wcTemp);
+  FX_BOOL bFirst = TRUE;
+  do {
+    pIter->Next(bPrev);
+    FX_WCHAR wcTemp = pIter->GetChar();
+    eNextType = FX_GetWordBreakProperty(wcTemp);
+    FX_WORD wBreak =
+        gs_FX_WordBreak_Table[eCurType] & ((FX_WORD)(1 << eNextType));
+    if (wBreak) {
+      if (pIter->IsEOF(!bPrev)) {
+        pIter->Next(!bPrev);
+        return TRUE;
+      }
+      if (bFirst) {
+        int32_t nFlags = 0;
+        if (eCurType == FX_WordBreakProp_MidLetter) {
+          if (eNextType == FX_WordBreakProp_ALetter) {
+            nFlags = 1;
+          }
+        } else if (eCurType == FX_WordBreakProp_MidNum) {
+          if (eNextType == FX_WordBreakProp_Numberic) {
+            nFlags = 2;
+          }
+        } else if (eCurType == FX_WordBreakProp_MidNumLet) {
+          if (eNextType == FX_WordBreakProp_ALetter) {
+            nFlags = 1;
+          } else if (eNextType == FX_WordBreakProp_Numberic) {
+            nFlags = 2;
+          }
+        }
+        if (nFlags > 0) {
+          FXSYS_assert(nFlags <= 2);
+          if (!((nFlags == 1 && ePreType == FX_WordBreakProp_ALetter) ||
+                (nFlags == 2 && ePreType == FX_WordBreakProp_Numberic))) {
+            pIter->Next(!bPrev);
+            return TRUE;
+          }
+          pIter->Next(bPrev);
+          wBreak = FALSE;
+        }
+        bFirst = FALSE;
+      }
+      if (wBreak) {
+        int32_t nFlags = 0;
+        if (eNextType == FX_WordBreakProp_MidLetter) {
+          if (eCurType == FX_WordBreakProp_ALetter) {
+            nFlags = 1;
+          }
+        } else if (eNextType == FX_WordBreakProp_MidNum) {
+          if (eCurType == FX_WordBreakProp_Numberic) {
+            nFlags = 2;
+          }
+        } else if (eNextType == FX_WordBreakProp_MidNumLet) {
+          if (eCurType == FX_WordBreakProp_ALetter) {
+            nFlags = 1;
+          } else if (eCurType == FX_WordBreakProp_Numberic) {
+            nFlags = 2;
+          }
+        }
+        if (nFlags <= 0) {
+          pIter->Next(!bPrev);
+          return TRUE;
+        }
+        FXSYS_assert(nFlags <= 2);
+        pIter->Next(bPrev);
+        wcTemp = pIter->GetChar();
+        eNextType = (FX_WordBreakProp)FX_GetWordBreakProperty(wcTemp);
+        if (!((nFlags == 1 && eNextType == FX_WordBreakProp_ALetter) ||
+              (nFlags == 2 && eNextType == FX_WordBreakProp_Numberic))) {
+          pIter->Next(!bPrev);
+          pIter->Next(!bPrev);
+          return TRUE;
+        }
+      }
+    }
+    ePreType = eCurType;
+    eCurType = eNextType;
+    bFirst = FALSE;
+  } while (!pIter->IsEOF(!bPrev));
+  return TRUE;
+}
+IFX_WordBreak* FX_WordBreak_Create() {
+  return new CFX_WordBreak;
+}
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreak_impl.h b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.h
new file mode 100644
index 0000000..95f5a43
--- /dev/null
+++ b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.h
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
+#define XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
+
+#include <cstdint>
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fee/fx_wordbreak/fx_wordbreak.h"
+#include "xfa/fee/fx_wordbreak/fx_wordbreak_impl.h"
+#include "xfa/fee/ifde_txtedtengine.h"
+
+extern const FX_WORD gs_FX_WordBreak_Table[16];
+extern const uint8_t gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1];
+enum FX_WordBreakProp {
+  FX_WordBreakProp_None = 0,
+  FX_WordBreakProp_CR,
+  FX_WordBreakProp_LF,
+  FX_WordBreakProp_NewLine,
+  FX_WordBreakProp_Extend,
+  FX_WordBreakProp_Format,
+  FX_WordBreakProp_KataKana,
+  FX_WordBreakProp_ALetter,
+  FX_WordBreakProp_MidLetter,
+  FX_WordBreakProp_MidNum,
+  FX_WordBreakProp_MidNumLet,
+  FX_WordBreakProp_Numberic,
+  FX_WordBreakProp_ExtendNumLet,
+};
+FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint);
+class CFX_CharIter : public IFX_CharIter {
+ public:
+  CFX_CharIter(const CFX_WideString& wsText);
+  virtual void Release();
+  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
+  virtual FX_WCHAR GetChar();
+  virtual void SetAt(int32_t nIndex);
+  virtual int32_t GetAt() const;
+  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
+  virtual IFX_CharIter* Clone();
+
+ protected:
+  ~CFX_CharIter();
+
+ private:
+  const CFX_WideString& m_wsText;
+  int32_t m_nIndex;
+};
+class CFX_WordBreak : public IFX_WordBreak {
+ public:
+  CFX_WordBreak();
+  virtual void Release();
+  virtual void Attach(IFX_CharIter* pIter);
+  virtual void Attach(const CFX_WideString& wsText);
+  virtual FX_BOOL Next(FX_BOOL bPrev);
+  virtual void SetAt(int32_t nIndex);
+  virtual int32_t GetWordPos() const;
+  virtual int32_t GetWordLength() const;
+  virtual void GetWord(CFX_WideString& wsWord) const;
+  virtual FX_BOOL IsEOF(FX_BOOL bTail) const;
+
+ protected:
+  ~CFX_WordBreak();
+  FX_BOOL FindNextBreakPos(IFX_CharIter* pIter,
+                           FX_BOOL bPrev,
+                           FX_BOOL bFromNext = TRUE);
+
+ private:
+  IFX_CharIter* m_pPreIter;
+  IFX_CharIter* m_pCurIter;
+};
+
+#endif  // XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreakdata.cpp b/xfa/fee/fx_wordbreak/fx_wordbreakdata.cpp
new file mode 100644
index 0000000..ffb4889
--- /dev/null
+++ b/xfa/fee/fx_wordbreak/fx_wordbreakdata.cpp
@@ -0,0 +1,2748 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fee/fx_wordbreak/fx_wordbreak_impl.h"
+
+const FX_WORD gs_FX_WordBreak_Table[16] = {
+    0xFFFF, 0xFFF9, 0xFFFB, 0xFFFB, 0xFFFB, 0xFFFB, 0xEFBB, 0xE77B,
+    0xFFFB, 0xFFFB, 0xFFFB, 0xE77B, 0xE73B, 0xFFFB, 0xFFFB, 0xFFFB,
+};
+
+const uint8_t gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1] =
+    // NOLINTNEXTLINE
+    {
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x89, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C,
+        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x70, 0x05, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x70, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00,
+        0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x70, 0x77,
+        0x00, 0x77, 0x77, 0x90, 0x00, 0x00, 0x00, 0x78, 0x77, 0x70, 0x70, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x04, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+        0x07, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x09, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x04, 0x04, 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x40, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x0B, 0x90, 0x77, 0x47, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x44,
+        0x44, 0x44, 0x45, 0x44, 0x44, 0x44, 0x47, 0x74, 0x40, 0x44, 0x44, 0x77,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x05, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x07, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x77, 0x00,
+        0x90, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x44, 0x44, 0x74, 0x44, 0x44, 0x44, 0x44, 0x74, 0x44,
+        0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x47, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x40, 0x74, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x70, 0x00, 0x00,
+        0x07, 0x77, 0x77, 0x77, 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07,
+        0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x00, 0x47, 0x44,
+        0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x70, 0x00, 0x00, 0x00, 0x04,
+        0x00, 0x00, 0x77, 0x07, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
+        0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x07, 0x77,
+        0x77, 0x70, 0x00, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x70,
+        0x77, 0x00, 0x40, 0x44, 0x44, 0x40, 0x00, 0x04, 0x40, 0x04, 0x44, 0x00,
+        0x04, 0x00, 0x00, 0x00, 0x07, 0x77, 0x70, 0x70, 0x00, 0x00, 0x00, 0xBB,
+        0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x07, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44, 0x44, 0x44, 0x44, 0x04,
+        0x44, 0x04, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07,
+        0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
+        0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44,
+        0x00, 0x00, 0x77, 0x07, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
+        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x77,
+        0x77, 0x70, 0x00, 0x77, 0x70, 0x77, 0x77, 0x00, 0x07, 0x70, 0x70, 0x77,
+        0x00, 0x07, 0x70, 0x00, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x00, 0x00, 0x44, 0x44, 0x40, 0x00, 0x44, 0x40, 0x44, 0x44, 0x00,
+        0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB,
+        0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x07, 0x44, 0x44, 0x44, 0x40, 0x44,
+        0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x77, 0x00, 0x00, 0x00,
+        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77,
+        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
+        0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40,
+        0x00, 0x00, 0x00, 0x70, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07, 0x77,
+        0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x00, 0x07, 0x44, 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00,
+        0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x77, 0x44, 0x00, 0xBB,
+        0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77,
+        0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+        0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, 0x77, 0x77, 0x77, 0x70,
+        0x00, 0x40, 0x00, 0x04, 0x44, 0x44, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44,
+        0x44, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x44, 0x77, 0x77, 0x77, 0x77,
+        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x77, 0x77, 0x00, 0x00,
+        0x44, 0x44, 0x44, 0x44, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00,
+        0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x40, 0x44, 0x40, 0x04,
+        0x44, 0x44, 0x44, 0x00, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70, 0x70, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70,
+        0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77,
+        0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77,
+        0x70, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x74, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00,
+        0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
+        0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x77,
+        0x77, 0x77, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44,
+        0x44, 0x40, 0x00, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x07, 0x77,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x47, 0x77, 0x74, 0x77, 0x77, 0x40, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x07, 0x07, 0x07, 0x07, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x70, 0x77,
+        0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x70, 0x77,
+        0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x55,
+        0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x08,
+        0x33, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
+        0xC0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x50, 0x00, 0x00, 0x55, 0x55, 0x55,
+        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x70, 0x00, 0x07, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00,
+        0x07, 0x77, 0x77, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x77, 0x77, 0x07,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x07, 0x77,
+        0x77, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+        0x00, 0x07, 0x77, 0x74, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x70,
+        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
+        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
+        0x77, 0x77, 0x77, 0x70, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44,
+        0x06, 0x66, 0x66, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x04, 0x46, 0x60, 0x00, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x66, 0x66, 0x00, 0x00, 0x07, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x74, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77,
+        0x77, 0x47, 0x77, 0x47, 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x77, 0x77, 0x77, 0x00, 0x07, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44,
+        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+        0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x07, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
+        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x40, 0x04,
+        0x40, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x40, 0x44, 0x00,
+        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x07, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x07, 0x47, 0x77, 0x77, 0x77, 0x77,
+        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x70, 0x70,
+        0x77, 0x07, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+        0x90, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x40,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCC, 0x90, 0xA0, 0x98, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x05,
+        0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x89, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C, 0x07, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x44, 0x77, 0x77, 0x77, 0x77,
+        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+        0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
+        0x00, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x00, 0x00,
+};
diff --git a/xfa/fee/ifde_txtedtbuf.h b/xfa/fee/ifde_txtedtbuf.h
new file mode 100644
index 0000000..0459af4
--- /dev/null
+++ b/xfa/fee/ifde_txtedtbuf.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_IFDE_TXTEDTBUF_H_
+#define XFA_FEE_IFDE_TXTEDTBUF_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+#define FDE_DEFCHUNKLENGTH (1024)
+
+class IFDE_TxtEdtBuf {
+ public:
+  virtual ~IFDE_TxtEdtBuf() {}
+  virtual void Release() = 0;
+
+  virtual FX_BOOL SetChunkSize(int32_t nChunkSize) = 0;
+  virtual int32_t GetChunkSize() const = 0;
+  virtual int32_t GetTextLength() const = 0;
+  virtual void SetText(const CFX_WideString& wsText) = 0;
+  virtual void GetText(CFX_WideString& wsText) const = 0;
+  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const = 0;
+  virtual void GetRange(CFX_WideString& wsText,
+                        int32_t nBegin,
+                        int32_t nCount = -1) const = 0;
+
+  virtual void Insert(int32_t nPos,
+                      const FX_WCHAR* lpText,
+                      int32_t nLength = 1) = 0;
+  virtual void Delete(int32_t nIndex, int32_t nLength = 1) = 0;
+
+  virtual void Clear(FX_BOOL bRelease = TRUE) = 0;
+
+  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL) = 0;
+};
+
+#endif  // XFA_FEE_IFDE_TXTEDTBUF_H_
diff --git a/xfa/fee/ifde_txtedtengine.h b/xfa/fee/ifde_txtedtengine.h
new file mode 100644
index 0000000..47700b0
--- /dev/null
+++ b/xfa/fee/ifde_txtedtengine.h
@@ -0,0 +1,258 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_IFDE_TXTEDTENGINE_H_
+#define XFA_FEE_IFDE_TXTEDTENGINE_H_
+
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+class IFDE_TxtEdtPage;
+class IFDE_TxtEdtEngine;
+class IFDE_TxtEdtEventSink;
+class IFDE_TxtEdtParag;
+
+typedef struct FDE_HTXTEDTFIND_ { void* pData; } * FDE_HTXTEDTFIND;
+
+#define FDE_TXTEDT_FIND_FLAGS_Prev (0L << 0)
+#define FDE_TXTEDT_FIND_FLAGS_Next (1L << 0)
+#define FDE_TXTEDT_FIND_FLAGS_WholeWord (1L << 1)
+#define FDE_TXTEDT_FIND_FLAGS_NoCase (1L << 2)
+
+#define FDE_TEXTEDITMODE_MultiLines (1L << 0)
+#define FDE_TEXTEDITMODE_AutoLineWrap (1L << 1)
+#define FDE_TEXTEDITMODE_ReadOnly (1L << 2)
+#define FDE_TEXTEDITMODE_LimitArea_Vert (1L << 3)
+#define FDE_TEXTEDITMODE_LimitArea_Horz (1L << 4)
+#define FDE_TEXTEDITMODE_NoRedoUndo (1L << 5)
+#define FDE_TEXTEDITMODE_FIELD_TAB (1L << 6)
+#define FDE_TEXTEDITMODE_FIELD_AUTO (1L << 7)
+#define FDE_TEXTEDITMODE_Validate (1L << 8)
+#define FDE_TEXTEDITMODE_Password (1L << 9)
+
+#define FDE_TEXTEDITALIGN_Left (0L << 0)
+#define FDE_TEXTEDITALIGN_Center (1L << 0)
+#define FDE_TEXTEDITALIGN_Right (2L << 0)
+#define FDE_TEXTEDITALIGN_Normal (1L << 3)
+#define FDE_TEXTEDITALIGN_Justified (1L << 4)
+#define FDE_TEXTEDITALIGN_Distributed (1L << 5)
+
+#define FDE_TEXTEDITLAYOUT_DocVertical (1L << 0)
+#define FDE_TEXTEDITLAYOUT_CharVertial (1L << 1)
+#define FDE_TEXTEDITLAYOUT_LineReserve (1L << 2)
+#define FDE_TEXTEDITLAYOUT_RTL (1L << 3)
+#define FDE_TEXTEDITLAYOUT_CombText (1L << 4)
+#define FDE_TEXTEDITLAYOUT_ExpandTab (1L << 5)
+#define FDE_TEXTEDITLAYOUT_ArabicContext (1L << 6)
+#define FDE_TEXTEDITLAYOUT_ArabicShapes (1L << 7)
+#define FDE_TEXTEDITLAYOUT_LastLineHeight (1L << 8)
+
+enum FDE_TXTEDTMOVECARET {
+  MC_MoveNone = 0,
+  MC_Left,
+  MC_Right,
+  MC_Up,
+  MC_Down,
+  MC_WordBackward,
+  MC_WordForward,
+  MC_LineStart,
+  MC_LineEnd,
+  MC_ParagStart,
+  MC_ParagEnd,
+  MC_PageUp,
+  MC_PageDown,
+  MC_Home,
+  MC_End,
+};
+enum FDE_TXTEDT_MODIFY_RET {
+  FDE_TXTEDT_MODIFY_RET_F_Tab = -6,
+  FDE_TXTEDT_MODIFY_RET_F_Locked = -5,
+  FDE_TXTEDT_MODIFY_RET_F_Invalidate = -4,
+  FDE_TXTEDT_MODIFY_RET_F_Boundary = -3,
+  FDE_TXTEDT_MODIFY_RET_F_Full = -2,
+  FDE_TXTEDT_MODIFY_RET_F_Normal = -1,
+  FDE_TXTEDT_MODIFY_RET_S_Normal = 0,
+  FDE_TXTEDT_MODIFY_RET_S_Full = 1,
+  FDE_TXTEDT_MODIFY_RET_S_Part = 2,
+  FDE_TXTEDT_MODIFY_RET_S_Empty = 3,
+  FDE_TXTEDT_MODIFY_RET_T_Tab = 4,
+};
+enum FDE_TXTEDIT_LINEEND {
+  FDE_TXTEDIT_LINEEND_Auto,
+  FDE_TXTEDIT_LINEEND_CRLF,
+  FDE_TXTEDIT_LINEEND_CR,
+  FDE_TXTEDIT_LINEEND_LF,
+};
+struct _FDE_TXTEDTPARAMS {
+  _FDE_TXTEDTPARAMS()
+      : fPlateWidth(0),
+        fPlateHeight(0),
+        nLineCount(0),
+        dwLayoutStyles(0),
+        dwAlignment(0),
+        dwMode(0),
+        pFont(NULL),
+        fFontSize(10.0f),
+        dwFontColor(0xff000000),
+        fLineSpace(10.0f),
+        fTabWidth(36),
+        bTabEquidistant(FALSE),
+        wDefChar(0xFEFF),
+        wLineBreakChar('\n'),
+        nCharRotation(0),
+        nLineEnd(0),
+        nHorzScale(100),
+        fCharSpace(0),
+        pEventSink(NULL) {}
+  FX_FLOAT fPlateWidth;
+  FX_FLOAT fPlateHeight;
+  int32_t nLineCount;
+  FX_DWORD dwLayoutStyles;
+  FX_DWORD dwAlignment;
+  FX_DWORD dwMode;
+  IFX_Font* pFont;
+  FX_FLOAT fFontSize;
+  FX_ARGB dwFontColor;
+  FX_FLOAT fLineSpace;
+  FX_FLOAT fTabWidth;
+  FX_BOOL bTabEquidistant;
+  FX_WCHAR wDefChar;
+  FX_WCHAR wLineBreakChar;
+  int32_t nCharRotation;
+  int32_t nLineEnd;
+  int32_t nHorzScale;
+  FX_FLOAT fCharSpace;
+  IFDE_TxtEdtEventSink* pEventSink;
+};
+typedef _FDE_TXTEDTPARAMS FDE_TXTEDTPARAMS;
+typedef _FDE_TXTEDTPARAMS* FDE_LPTXTEDTPARAMS;
+enum FDE_TXTEDT_TEXTCHANGE_TYPE {
+  FDE_TXTEDT_TEXTCHANGE_TYPE_Insert = 0,
+  FDE_TXTEDT_TEXTCHANGE_TYPE_Delete,
+  FDE_TXTEDT_TEXTCHANGE_TYPE_Replace,
+};
+struct _FDE_TXTEDT_TEXTCHANGE_INFO {
+  int32_t nChangeType;
+  CFX_WideString wsInsert;
+  CFX_WideString wsDelete;
+  CFX_WideString wsPrevText;
+};
+typedef _FDE_TXTEDT_TEXTCHANGE_INFO FDE_TXTEDT_TEXTCHANGE_INFO;
+typedef _FDE_TXTEDT_TEXTCHANGE_INFO* FDE_LPTXTEDT_TEXTCHANGE_INFO;
+class IFDE_TxtEdtEventSink {
+ public:
+  virtual ~IFDE_TxtEdtEventSink() {}
+  virtual void On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
+                               int32_t nPage,
+                               FX_BOOL bVisible = TRUE) = 0;
+  virtual void On_TextChanged(IFDE_TxtEdtEngine* pEdit,
+                              FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) = 0;
+  virtual void On_PageCountChanged(IFDE_TxtEdtEngine* pEdit) = 0;
+  virtual void On_SelChanged(IFDE_TxtEdtEngine* pEdit) = 0;
+  virtual FX_BOOL On_PageLoad(IFDE_TxtEdtEngine* pEdit,
+                              int32_t nPageIndex,
+                              int32_t nPurpose) = 0;
+  virtual FX_BOOL On_PageUnload(IFDE_TxtEdtEngine* pEdit,
+                                int32_t nPageIndex,
+                                int32_t nPurpose) = 0;
+  virtual FX_BOOL On_PageChange(IFDE_TxtEdtEngine* pEdit,
+                                int32_t nPageIndex) = 0;
+  virtual void On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
+                              const CFX_ByteStringC& bsDoRecord) = 0;
+  virtual FX_BOOL On_ValidateField(IFDE_TxtEdtEngine* pEdit,
+                                   int32_t nBlockIndex,
+                                   int32_t nFieldIndex,
+                                   const CFX_WideString& wsFieldText,
+                                   int32_t nCharIndex) = 0;
+  virtual FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
+                                   int32_t nBlockIndex) = 0;
+  virtual FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
+                                        int32_t nBlockIndex,
+                                        CFX_WideString& wsBlockText) = 0;
+  virtual FX_BOOL On_Validate(IFDE_TxtEdtEngine* pEdit,
+                              CFX_WideString& wsText) = 0;
+};
+class IFX_CharIter {
+ public:
+  virtual ~IFX_CharIter() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE) = 0;
+  virtual FX_WCHAR GetChar() = 0;
+  virtual void SetAt(int32_t nIndex) = 0;
+  virtual int32_t GetAt() const = 0;
+  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
+  virtual IFX_CharIter* Clone() = 0;
+};
+class IFDE_TxtEdtEngine {
+ public:
+  static IFDE_TxtEdtEngine* Create();
+
+  virtual ~IFDE_TxtEdtEngine() {}
+  virtual void Release() = 0;
+  virtual void SetEditParams(const FDE_TXTEDTPARAMS& params) = 0;
+  virtual const FDE_TXTEDTPARAMS* GetEditParams() const = 0;
+
+  virtual int32_t CountPages() const = 0;
+  virtual IFDE_TxtEdtPage* GetPage(int32_t nIndex) = 0;
+  virtual FX_BOOL SetBufChunkSize(int32_t nChunkSize) = 0;
+  virtual void SetTextByStream(IFX_Stream* pStream) = 0;
+  virtual void SetText(const CFX_WideString& wsText) = 0;
+  virtual int32_t GetTextLength() const = 0;
+  virtual void GetText(CFX_WideString& wsText,
+                       int32_t nStart,
+                       int32_t nCount = -1) = 0;
+  virtual void ClearText() = 0;
+
+  virtual int32_t GetCaretRect(CFX_RectF& rtCaret) const = 0;
+  virtual int32_t GetCaretPos() const = 0;
+  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE) = 0;
+  virtual int32_t MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
+                               FX_BOOL bShift = FALSE,
+                               FX_BOOL bCtrl = FALSE) = 0;
+
+  virtual void Lock() = 0;
+  virtual void Unlock() = 0;
+  virtual FX_BOOL IsLocked() const = 0;
+
+  virtual int32_t Insert(int32_t nStart,
+                         const FX_WCHAR* lpText,
+                         int32_t nLength) = 0;
+  virtual int32_t Delete(int32_t nStart, FX_BOOL bBackspace = FALSE) = 0;
+  virtual int32_t DeleteRange(int32_t nStart, int32_t nCount = -1) = 0;
+  virtual int32_t Replace(int32_t nStart,
+                          int32_t nLength,
+                          const CFX_WideString& wsReplace) = 0;
+  virtual void SetLimit(int32_t nLimit) = 0;
+  virtual void SetAliasChar(FX_WCHAR wAlias) = 0;
+  virtual void AddSelRange(int32_t nStart, int32_t nCount = -1) = 0;
+  virtual int32_t CountSelRanges() = 0;
+  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart) = 0;
+  virtual void ClearSelection() = 0;
+
+  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRedo) = 0;
+  virtual FX_BOOL Undo(const CFX_ByteStringC& bsUndo) = 0;
+
+  virtual int32_t StartLayout() = 0;
+  virtual int32_t DoLayout(IFX_Pause* pPause) = 0;
+  virtual void EndLayout() = 0;
+
+  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL) = 0;
+  virtual int32_t CountParags() const = 0;
+  virtual IFDE_TxtEdtParag* GetParag(int32_t nParagIndex) const = 0;
+  virtual IFX_CharIter* CreateCharIter() = 0;
+};
+class IFDE_TxtEdtParag {
+ public:
+  virtual ~IFDE_TxtEdtParag() {}
+  virtual int32_t GetTextLength() const = 0;
+  virtual int32_t GetStartIndex() const = 0;
+  virtual int32_t CountLines() const = 0;
+  virtual void GetLineRange(int32_t nLineIndex,
+                            int32_t& nStart,
+                            int32_t& nCount) const = 0;
+};
+
+#endif  // XFA_FEE_IFDE_TXTEDTENGINE_H_
diff --git a/xfa/fee/ifde_txtedtpage.h b/xfa/fee/ifde_txtedtpage.h
new file mode 100644
index 0000000..ec5912d
--- /dev/null
+++ b/xfa/fee/ifde_txtedtpage.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FEE_IFDE_TXTEDTPAGE_H_
+#define XFA_FEE_IFDE_TXTEDTPAGE_H_
+
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fde/fde_visualset.h"
+#include "xfa/fgas/layout/fgas_textbreak.h"
+
+class IFDE_TxtEdtEngine;
+class IFDE_TxtEdtPage : public IFDE_CanvasSet, public IFX_TxtAccess {
+ public:
+  static IFDE_TxtEdtPage* Create(IFDE_TxtEdtEngine* pEngine, int32_t nIndex);
+
+  virtual void Release() = 0;
+
+  virtual IFDE_TxtEdtEngine* GetEngine() const = 0;
+  virtual int32_t GetCharRect(int32_t nIndex,
+                              CFX_RectF& rect,
+                              FX_BOOL bBBox = FALSE) const = 0;
+  virtual int32_t GetCharIndex(const CFX_PointF& fPoint, FX_BOOL& bBefore) = 0;
+  virtual void CalcRangeRectArray(int32_t nStart,
+                                  int32_t nCount,
+                                  CFX_RectFArray& RectFArr) const = 0;
+  virtual int32_t SelectWord(const CFX_PointF& fPoint, int32_t& nCount) = 0;
+  virtual int32_t GetCharStart() const = 0;
+  virtual int32_t GetCharCount() const = 0;
+
+  virtual int32_t GetDisplayPos(const CFX_RectF& rtClip,
+                                FXTEXT_CHARPOS*& pCharPos,
+                                CFX_RectF* pBBox) const = 0;
+  virtual FX_BOOL IsLoaded(const CFX_RectF* pClipBox) = 0;
+  virtual int32_t LoadPage(const CFX_RectF* pClipBox, IFX_Pause* pPause) = 0;
+  virtual void UnloadPage(const CFX_RectF* pClipBox) = 0;
+  virtual const CFX_RectF& GetContentsBox() = 0;
+};
+
+#endif  // XFA_FEE_IFDE_TXTEDTPAGE_H_
diff --git a/xfa/fgas/crt/fgas_algorithm.cpp b/xfa/fgas/crt/fgas_algorithm.cpp
new file mode 100644
index 0000000..b351292
--- /dev/null
+++ b/xfa/fgas/crt/fgas_algorithm.cpp
@@ -0,0 +1,306 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_algorithm.h"
+
+#include "core/include/fxcrt/fx_basic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const FX_CHAR g_FXBase64EncoderMap[64] = {
+    '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',
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
+};
+
+struct FX_BASE64DATA {
+  FX_DWORD data1 : 2;
+  FX_DWORD data2 : 6;
+  FX_DWORD data3 : 4;
+  FX_DWORD data4 : 4;
+  FX_DWORD data5 : 6;
+  FX_DWORD data6 : 2;
+  FX_DWORD data7 : 8;
+};
+
+static void FX_Base64EncodePiece(const FX_BASE64DATA& src,
+                                 int32_t iBytes,
+                                 FX_CHAR dst[4]) {
+  dst[0] = g_FXBase64EncoderMap[src.data2];
+  FX_DWORD b = src.data1 << 4;
+  if (iBytes > 1) {
+    b |= src.data4;
+  }
+  dst[1] = g_FXBase64EncoderMap[b];
+  if (iBytes > 1) {
+    b = src.data3 << 2;
+    if (iBytes > 2) {
+      b |= src.data6;
+    }
+    dst[2] = g_FXBase64EncoderMap[b];
+    if (iBytes > 2) {
+      dst[3] = g_FXBase64EncoderMap[src.data5];
+    } else {
+      dst[3] = '=';
+    }
+  } else {
+    dst[2] = dst[3] = '=';
+  }
+}
+int32_t FX_Base64EncodeA(const uint8_t* pSrc, int32_t iSrcLen, FX_CHAR* pDst) {
+  FXSYS_assert(pSrc != NULL);
+  if (iSrcLen < 1) {
+    return 0;
+  }
+  if (pDst == NULL) {
+    int32_t iDstLen = iSrcLen / 3 * 4;
+    if ((iSrcLen % 3) != 0) {
+      iDstLen += 4;
+    }
+    return iDstLen;
+  }
+  FX_BASE64DATA srcData;
+  int32_t iBytes = 3;
+  FX_CHAR* pDstEnd = pDst;
+  while (iSrcLen > 0) {
+    if (iSrcLen > 2) {
+      ((uint8_t*)&srcData)[0] = *pSrc++;
+      ((uint8_t*)&srcData)[1] = *pSrc++;
+      ((uint8_t*)&srcData)[2] = *pSrc++;
+      iSrcLen -= 3;
+    } else {
+      *((FX_DWORD*)&srcData) = 0;
+      ((uint8_t*)&srcData)[0] = *pSrc++;
+      if (iSrcLen > 1) {
+        ((uint8_t*)&srcData)[1] = *pSrc++;
+      }
+      iBytes = iSrcLen;
+      iSrcLen = 0;
+    }
+    FX_Base64EncodePiece(srcData, iBytes, pDstEnd);
+    pDstEnd += 4;
+  }
+  return pDstEnd - pDst;
+}
+
+static const uint8_t g_FXBase64DecoderMap[256] = {
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F,
+    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
+    0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,
+    0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
+    0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF,
+};
+static void FX_Base64DecodePiece(const FX_CHAR src[4],
+                                 int32_t iChars,
+                                 FX_BASE64DATA& dst,
+                                 int32_t& iBytes) {
+  FXSYS_assert(iChars > 0 && iChars < 5);
+  iBytes = 1;
+  dst.data2 = g_FXBase64DecoderMap[(uint8_t)src[0]];
+  if (iChars > 1) {
+    uint8_t b = g_FXBase64DecoderMap[(uint8_t)src[1]];
+    dst.data1 = b >> 4;
+    dst.data4 = b;
+    if (iChars > 2) {
+      iBytes = 2;
+      b = g_FXBase64DecoderMap[(uint8_t)src[2]];
+      dst.data3 = b >> 2;
+      dst.data6 = b;
+      if (iChars > 3) {
+        iBytes = 3;
+        dst.data5 = g_FXBase64DecoderMap[(uint8_t)src[3]];
+      } else {
+        dst.data5 = 0;
+      }
+    } else {
+      dst.data3 = 0;
+    }
+  } else {
+    dst.data1 = 0;
+  }
+}
+int32_t FX_Base64DecodeA(const FX_CHAR* pSrc, int32_t iSrcLen, uint8_t* pDst) {
+  FXSYS_assert(pSrc != NULL);
+  if (iSrcLen < 1) {
+    return 0;
+  }
+  while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') {
+    iSrcLen--;
+  }
+  if (iSrcLen < 1) {
+    return 0;
+  }
+  if (pDst == NULL) {
+    int32_t iDstLen = iSrcLen / 4 * 3;
+    iSrcLen %= 4;
+    if (iSrcLen == 1) {
+      iDstLen += 1;
+    } else if (iSrcLen == 2) {
+      iDstLen += 1;
+    } else if (iSrcLen == 3) {
+      iDstLen += 2;
+    }
+    return iDstLen;
+  }
+  FX_CHAR srcData[4];
+  FX_BASE64DATA dstData;
+  int32_t iChars = 4, iBytes;
+  uint8_t* pDstEnd = pDst;
+  while (iSrcLen > 0) {
+    if (iSrcLen > 3) {
+      *((FX_DWORD*)srcData) = *((FX_DWORD*)pSrc);
+      pSrc += 4;
+      iSrcLen -= 4;
+    } else {
+      *((FX_DWORD*)&dstData) = 0;
+      *((FX_DWORD*)srcData) = 0;
+      srcData[0] = *pSrc++;
+      if (iSrcLen > 1) {
+        srcData[1] = *pSrc++;
+      }
+      if (iSrcLen > 2) {
+        srcData[2] = *pSrc++;
+      }
+      iChars = iSrcLen;
+      iSrcLen = 0;
+    }
+    FX_Base64DecodePiece(srcData, iChars, dstData, iBytes);
+    *pDstEnd++ = ((uint8_t*)&dstData)[0];
+    if (iBytes > 1) {
+      *pDstEnd++ = ((uint8_t*)&dstData)[1];
+    }
+    if (iBytes > 2) {
+      *pDstEnd++ = ((uint8_t*)&dstData)[2];
+    }
+  }
+  return pDstEnd - pDst;
+}
+int32_t FX_Base64DecodeW(const FX_WCHAR* pSrc, int32_t iSrcLen, uint8_t* pDst) {
+  FXSYS_assert(pSrc != NULL);
+  if (iSrcLen < 1) {
+    return 0;
+  }
+  while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') {
+    iSrcLen--;
+  }
+  if (iSrcLen < 1) {
+    return 0;
+  }
+  if (pDst == NULL) {
+    int32_t iDstLen = iSrcLen / 4 * 3;
+    iSrcLen %= 4;
+    if (iSrcLen == 1) {
+      iDstLen += 1;
+    } else if (iSrcLen == 2) {
+      iDstLen += 1;
+    } else if (iSrcLen == 3) {
+      iDstLen += 2;
+    }
+    return iDstLen;
+  }
+  FX_CHAR srcData[4];
+  FX_BASE64DATA dstData;
+  int32_t iChars = 4, iBytes;
+  uint8_t* pDstEnd = pDst;
+  while (iSrcLen > 0) {
+    if (iSrcLen > 3) {
+      srcData[0] = (FX_CHAR)*pSrc++;
+      srcData[1] = (FX_CHAR)*pSrc++;
+      srcData[2] = (FX_CHAR)*pSrc++;
+      srcData[3] = (FX_CHAR)*pSrc++;
+      iSrcLen -= 4;
+    } else {
+      *((FX_DWORD*)&dstData) = 0;
+      *((FX_DWORD*)srcData) = 0;
+      srcData[0] = (FX_CHAR)*pSrc++;
+      if (iSrcLen > 1) {
+        srcData[1] = (FX_CHAR)*pSrc++;
+      }
+      if (iSrcLen > 2) {
+        srcData[2] = (FX_CHAR)*pSrc++;
+      }
+      iChars = iSrcLen;
+      iSrcLen = 0;
+    }
+    FX_Base64DecodePiece(srcData, iChars, dstData, iBytes);
+    *pDstEnd++ = ((uint8_t*)&dstData)[0];
+    if (iBytes > 1) {
+      *pDstEnd++ = ((uint8_t*)&dstData)[1];
+    }
+    if (iBytes > 2) {
+      *pDstEnd++ = ((uint8_t*)&dstData)[2];
+    }
+  }
+  return pDstEnd - pDst;
+}
+
+static const uint8_t g_FXHex2DecMap[256] = {
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  1,  2,  3, 4, 5, 6, 7, 8, 9,  0,  0,
+    0,  0,  0,  0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 10, 11, 12,
+    13, 14, 15, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
+    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0,
+};
+uint8_t FX_Hex2Dec(uint8_t hexHigh, uint8_t hexLow) {
+  return (g_FXHex2DecMap[hexHigh] << 4) + g_FXHex2DecMap[hexLow];
+}
+int32_t FX_SeparateStringW(const FX_WCHAR* pStr,
+                           int32_t iStrLen,
+                           FX_WCHAR delimiter,
+                           CFX_WideStringArray& pieces) {
+  if (pStr == NULL) {
+    return 0;
+  }
+  if (iStrLen < 0) {
+    iStrLen = FXSYS_wcslen(pStr);
+  }
+  const FX_WCHAR* pToken = pStr;
+  const FX_WCHAR* pEnd = pStr + iStrLen;
+  while (TRUE) {
+    if (pStr >= pEnd || delimiter == *pStr) {
+      CFX_WideString sub(pToken, pStr - pToken);
+      pieces.Add(sub);
+      pToken = pStr + 1;
+      if (pStr >= pEnd) {
+        break;
+      }
+    }
+    pStr++;
+  }
+  return pieces.GetSize();
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/xfa/fgas/crt/fgas_algorithm.h b/xfa/fgas/crt/fgas_algorithm.h
new file mode 100644
index 0000000..662b1b6
--- /dev/null
+++ b/xfa/fgas/crt/fgas_algorithm.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_ALGORITHM_H_
+#define XFA_FGAS_CRT_FGAS_ALGORITHM_H_
+
+#include <cstdint>
+
+#include "core/include/fxcrt/fx_basic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int32_t FX_Base64EncodeA(const uint8_t* pSrc, int32_t iSrcLen, FX_CHAR* pDst);
+int32_t FX_Base64DecodeA(const FX_CHAR* pSrc, int32_t iSrcLen, uint8_t* pDst);
+int32_t FX_Base64DecodeW(const FX_WCHAR* pSrc, int32_t iSrcLen, uint8_t* pDst);
+uint8_t FX_Hex2Dec(uint8_t hexHigh, uint8_t hexLow);
+int32_t FX_SeparateStringW(const FX_WCHAR* pStr,
+                           int32_t iStrLen,
+                           FX_WCHAR delimiter,
+                           CFX_WideStringArray& pieces);
+#ifdef __cplusplus
+};
+#endif
+
+template <class baseType>
+class CFX_DSPATemplate {
+ public:
+  int32_t Lookup(const baseType& find, const baseType* pArray, int32_t iCount) {
+    FXSYS_assert(pArray != NULL);
+    if (iCount < 1) {
+      return -1;
+    }
+    int32_t iStart = 0, iEnd = iCount - 1, iMid;
+    do {
+      iMid = (iStart + iEnd) / 2;
+      const baseType& v = pArray[iMid];
+      if (find == v) {
+        return iMid;
+      } else if (find < v) {
+        iEnd = iMid - 1;
+      } else {
+        iStart = iMid + 1;
+      }
+    } while (iStart <= iEnd);
+    return -1;
+  }
+};
+
+#endif  // XFA_FGAS_CRT_FGAS_ALGORITHM_H_
diff --git a/xfa/fgas/crt/fgas_codepage.cpp b/xfa/fgas/crt/fgas_codepage.cpp
new file mode 100644
index 0000000..e717873
--- /dev/null
+++ b/xfa/fgas/crt/fgas_codepage.cpp
@@ -0,0 +1,343 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_language.h"
+
+static const FX_CHARSET_MAP g_FXCharset2CodePageTable[] = {
+    {0, 1252},   {1, 0},      {2, 42},     {77, 10000}, {78, 10001},
+    {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005}, {84, 10004},
+    {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029}, {89, 10007},
+    {128, 932},  {129, 949},  {130, 1361}, {134, 936},  {136, 950},
+    {161, 1253}, {162, 1254}, {163, 1258}, {177, 1255}, {178, 1256},
+    {186, 1257}, {204, 1251}, {222, 874},  {238, 1250}, {254, 437},
+    {255, 850},
+};
+FX_WORD FX_GetCodePageFromCharset(uint8_t charset) {
+  int32_t iEnd = sizeof(g_FXCharset2CodePageTable) / sizeof(FX_CHARSET_MAP) - 1;
+  FXSYS_assert(iEnd >= 0);
+  int32_t iStart = 0, iMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    const FX_CHARSET_MAP& cp = g_FXCharset2CodePageTable[iMid];
+    if (charset == cp.charset) {
+      return cp.codepage;
+    } else if (charset < cp.charset) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return 0xFFFF;
+}
+static const FX_CHARSET_MAP g_FXCodepage2CharsetTable[] = {
+    {1, 0},      {2, 42},     {254, 437},  {255, 850},  {222, 874},
+    {128, 932},  {134, 936},  {129, 949},  {136, 950},  {238, 1250},
+    {204, 1251}, {0, 1252},   {161, 1253}, {162, 1254}, {177, 1255},
+    {178, 1256}, {186, 1257}, {163, 1258}, {130, 1361}, {77, 10000},
+    {78, 10001}, {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005},
+    {84, 10004}, {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029},
+    {89, 10007},
+};
+FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage) {
+  int32_t iEnd = sizeof(g_FXCodepage2CharsetTable) / sizeof(FX_CHARSET_MAP) - 1;
+  FXSYS_assert(iEnd >= 0);
+  int32_t iStart = 0, iMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    const FX_CHARSET_MAP& cp = g_FXCodepage2CharsetTable[iMid];
+    if (codepage == cp.codepage) {
+      return cp.charset;
+    } else if (codepage < cp.codepage) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return 0xFFFF;
+}
+const FX_LANG2CPMAP g_FXLang2CodepageTable[] = {
+    {FX_LANG_Arabic_SaudiArabia, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Bulgarian_Bulgaria, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Catalan_Catalan, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Chinese_Taiwan, FX_CODEPAGE_ChineseTraditional},
+    {FX_LANG_CzechRepublic, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Danish_Denmark, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_German_Germany, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Greek_Greece, FX_CODEPAGE_MSWin_Greek},
+    {FX_LANG_English_UnitedStates, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_TraditionalSort, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Finnish_Finland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_France, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Hebrew_Israel, FX_CODEPAGE_MSWin_Hebrew},
+    {FX_LANG_Hungarian_Hungary, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Icelandic_Iceland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Italian_Italy, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Japanese_Japan, FX_CODEPAGE_ShiftJIS},
+    {FX_LANG_Korean_Korea, FX_CODEPAGE_Korean},
+    {FX_LANG_Dutch_Netherlands, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Norwegian_Bokmal, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Polish_Poland, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Portuguese_Brazil, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Romanian_Romania, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Russian_Russia, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Croatian_Croatia, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Slovak_Slovakia, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Albanian_Albania, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Swedish_Sweden, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Thai_Thailand, FX_CODEPAGE_MSDOS_Thai},
+    {FX_LANG_Turkish_Turkey, FX_CODEPAGE_MSWin_Turkish},
+    {FX_LANG_Urdu_Pakistan, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Indonesian_Indonesia, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Ukrainian_Ukraine, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Belarusian_Belarus, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Slovenian_Slovenia, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Estonian_Estonia, FX_CODEPAGE_MSWin_Baltic},
+    {FX_LANG_Latvian_Latvia, FX_CODEPAGE_MSWin_Baltic},
+    {FX_LANG_Lithuanian_Lithuania, FX_CODEPAGE_MSWin_Baltic},
+    {FX_LANG_Persian, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Vietnamese_Vietnam, FX_CODEPAGE_MSWin_Vietnamese},
+    {FX_LANG_Armenian_Armenia, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Azerbaijan_Latin, FX_CODEPAGE_MSWin_Turkish},
+    {FX_LANG_Basque_Basque, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Macedonian, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Afrikaans_SouthAfrica, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Georgian_Georgia, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Faroese_FaroeIslands, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Hindi_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Malay_Malaysia, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Kazakh_Kazakhstan, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Kyrgyz_Kyrgyzstan, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Kiswahili_Kenya, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Uzbek_LatinUzbekistan, FX_CODEPAGE_MSWin_Turkish},
+    {FX_LANG_Tatar_Russia, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Punjabi_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Gujarati_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Tamil_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Telugu_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Kannada_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Marathi_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_SanskritIndia, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Mongolian_CyrillicMongolia, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Galician_Galician, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Konkani_India, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Syriac_Syria, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Divehi_Maldives, FX_CODEPAGE_DefANSI},
+    {FX_LANG_Arabic_Iraq, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Chinese_PRC, FX_CODEPAGE_ChineseSimplified},
+    {FX_LANG_German_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_English_UnitedKingdom, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Mexico, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_Belgium, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Italian_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Dutch_Belgium, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Norwegian_Nynorsk, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Portuguese_Portugal, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_SerbianLatin_Serbia, FX_CODEPAGE_MSWin_EasternEuropean},
+    {FX_LANG_Swedish_Finland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Azerbaijan_Cyrillic, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Malay_BruneiDarussalam, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Uzbek_CyrillicUzbekistan, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Arabic_Egypt, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Chinese_HongKong, FX_CODEPAGE_ChineseTraditional},
+    {FX_LANG_German_Austria, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_English_Australia, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_InternationalSort, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_Canada, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_SerbianCyrillic_Serbia, FX_CODEPAGE_MSWin_Cyrillic},
+    {FX_LANG_Arabic_Libya, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Chinese_Singapore, FX_CODEPAGE_ChineseSimplified},
+    {FX_LANG_German_Luxembourg, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_English_Canada, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Guatemala, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Algeria, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Chinese_Macao, FX_CODEPAGE_ChineseTraditional},
+    {FX_LANG_German_Liechtenstein, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_English_NewZealand, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_CostaRica, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_Luxembourg, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Morocco, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Ireland, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Panama, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_French_Monaco, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Tunisia, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_SouthAfrica, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_DominicanRepublic, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Oman, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Jamaica, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Venezuela, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Yemen, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Caribbean, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Colombia, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Syria, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Belize, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Peru, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Jordan, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_TrinidadTobago, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Argentina, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Lebanon, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Zimbabwe, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Ecuador, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Kuwait, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_English_Philippines, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Chile, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_UAE, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Spanish_Uruguay, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Bahrain, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Spanish_Paraguay, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Arabic_Qatar, FX_CODEPAGE_MSWin_Arabic},
+    {FX_LANG_Spanish_Bolivia, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_ElSalvador, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Honduras, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_Nicaragua, FX_CODEPAGE_MSWin_WesternEuropean},
+    {FX_LANG_Spanish_PuertoRico, FX_CODEPAGE_MSWin_WesternEuropean},
+};
+FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage) {
+  int32_t iEnd = sizeof(g_FXLang2CodepageTable) / sizeof(FX_LANG2CPMAP) - 1;
+  FXSYS_assert(iEnd >= 0);
+  int32_t iStart = 0, iMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    const FX_LANG2CPMAP& cp = g_FXLang2CodepageTable[iMid];
+    if (wLanguage == cp.wLanguage) {
+      return cp.wCodepage;
+    } else if (wLanguage < cp.wLanguage) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return 0xFFFF;
+}
+static const FX_STR2CPHASH g_FXCPHashTable[] = {
+    {0xd45, 0x6faf},      {0xd46, 0x6fb0},      {0xd47, 0x6fb1},
+    {0xd48, 0x6fb2},      {0xd49, 0x4e6},       {0xd4d, 0x6fbd},
+    {0xe9e, 0x4e4},       {0xc998, 0x1b5},      {0x18ef0, 0x3a8},
+    {0x19f85, 0x5182},    {0x2e2335, 0x3b6},    {0x325153, 0x5182},
+    {0x145bded, 0x2716},  {0x3c9a5f2, 0xc6f3},  {0x4c45f2d, 0x3a4},
+    {0x4c45f4e, 0xc431},  {0x58caf51, 0x4e4},   {0x5a5cd7d, 0x3a8},
+    {0x5a6c6a7, 0x4e4},   {0x5a6ca0b, 0x1b5},   {0x5a6cd68, 0x307},
+    {0x5a6d8d3, 0x4e4},   {0x5a6d948, 0x354},   {0x5a6d96b, 0x362},
+    {0x5a6d984, 0x366},   {0x5a90e35, 0x1b5},   {0x5e0cf00, 0x6fb5},
+    {0x609c324, 0x551},   {0x617d97f, 0x5182},  {0x6a6fd91, 0xfde8},
+    {0x6a6fd92, 0xfde9},  {0x6b102de, 0xcadc},  {0x6b10f48, 0x4e89},
+    {0x1020805f, 0x4e4},  {0x10f0524c, 0x6fb5}, {0x11d558fe, 0x6fb0},
+    {0x13898d19, 0xc42d}, {0x13898d3a, 0xc431}, {0x138a319e, 0x6fb1},
+    {0x14679c09, 0x96c6}, {0x153f0a3d, 0x6fb2}, {0x1576eeb3, 0x4e20},
+    {0x169a0ce6, 0xc6f9}, {0x16f3e2dc, 0x6fb3}, {0x18a8bb7a, 0x6fb4},
+    {0x1a5d9419, 0x6fb5}, {0x1a847b48, 0x3a8},  {0x1b762419, 0xcec8},
+    {0x1b9d7847, 0x475},  {0x1c126cb9, 0x6fb6}, {0x1ccdbc7d, 0x4f42},
+    {0x1d330f5f, 0x2714}, {0x1dc74559, 0x4e6},  {0x1edd80da, 0x4e4},
+    {0x23e4b03d, 0xfde8}, {0x24f28a16, 0x4f3d}, {0x286e7a32, 0x2715},
+    {0x2c7c18ed, 0x3a8},  {0x2e2103b7, 0x2713}, {0x304bf479, 0x6fb4},
+    {0x304bf47d, 0x6fb5}, {0x309bb869, 0xfde8}, {0x309bb86a, 0xfde9},
+    {0x33664357, 0x3b6},  {0x352d6b49, 0x3a4},  {0x36f5661c, 0x1b5},
+    {0x392e8f48, 0xcadc}, {0x3dc7c64c, 0x47c},  {0x3ed2e8e1, 0x4e4},
+    {0x3f0c2fea, 0xcaed}, {0x3f0fef8f, 0xc6f2}, {0x3f5e130f, 0x5182},
+    {0x47174d1f, 0x3a8},  {0x49686b7b, 0x6fb4}, {0x4b80b0d9, 0x3a4},
+    {0x4dcda97a, 0x4e4},  {0x4dcda9b6, 0x4e4},  {0x4e881e6a, 0x5221},
+    {0x4ffdf5a1, 0x36a},  {0x4ffdf5a5, 0x6fbd}, {0x5241ce16, 0x4e8b},
+    {0x546bab9d, 0x4e4},  {0x54a3d64e, 0x6fb6}, {0x562179bd, 0x5161},
+    {0x57c1df15, 0xc6f7}, {0x61ff6e62, 0x4f36}, {0x6359c7d8, 0x4f35},
+    {0x63f3c335, 0x3a8},  {0x645a0f78, 0x477},  {0x691ac2fd, 0x275f},
+    {0x6dc2eab0, 0x2d0},  {0x6dc2eeef, 0x35e},  {0x6dc2ef10, 0x36a},
+    {0x7103138a, 0x47d},  {0x710dfbd0, 0xc6f5}, {0x7319f6cb, 0x36a},
+    {0x745096ad, 0x3a8},  {0x74866229, 0x4e8c}, {0x77185fa5, 0x3a8},
+    {0x7953f002, 0x6faf}, {0x7953f003, 0x6fb0}, {0x7953f004, 0x6fb1},
+    {0x7953f005, 0x6fb2}, {0x7953f006, 0x6fb7}, {0x7953f00a, 0x6fbd},
+    {0x7c577571, 0x2761}, {0x7e8c8ff1, 0x479},  {0x8031f47f, 0x3b5},
+    {0x8031f481, 0x3b5},  {0x80c4a710, 0x5187}, {0x857c7e14, 0xfde8},
+    {0x857c7e15, 0xfde9}, {0x86b59c90, 0x4e4},  {0x86b59c91, 0x6fb0},
+    {0x86b59c92, 0x6fb1}, {0x86b59c93, 0x6fb2}, {0x86b59c94, 0x6fb3},
+    {0x86b59c95, 0x6fb4}, {0x86b59c96, 0x6fb5}, {0x86b59c97, 0x4e7},
+    {0x86b59c98, 0x4e6},  {0x8b4b24ec, 0x5190}, {0x8face362, 0x4e4},
+    {0x8ff9ec2a, 0xfde9}, {0x919d3989, 0xcadc}, {0x9967e5ad, 0x4e22},
+    {0x99f8b933, 0x6fbd}, {0x9bd2a380, 0x4fc7}, {0x9befad23, 0x4f38},
+    {0x9c7ac649, 0x4f3c}, {0xa02468db, 0xdeae}, {0xa02468ec, 0xdeab},
+    {0xa024692a, 0xdeaa}, {0xa0246997, 0xdeb2}, {0xa02469ff, 0xdeb0},
+    {0xa0246a3d, 0xdeb1}, {0xa0246a8c, 0xdeaf}, {0xa0246a9a, 0xdeb3},
+    {0xa0246b16, 0xdeac}, {0xa0246b1a, 0xdead}, {0xa071addc, 0x4b1},
+    {0xa38b62dc, 0x474},  {0xa4c09fed, 0x3a8},  {0xa51e86e5, 0x4e7},
+    {0xa67ab13e, 0x3a4},  {0xa7414244, 0x51a9}, {0xa9ddbead, 0xc6fb},
+    {0xab24ffab, 0x4e8a}, {0xabef8ac4, 0x2710}, {0xabfa20ac, 0x6fb4},
+    {0xad36895e, 0x4e2},  {0xad36895f, 0x4e3},  {0xaf310e90, 0x402},
+    {0xaf31166f, 0x4e8},  {0xaf7277a5, 0x3b6},  {0xafc0d8b3, 0x96c6},
+    {0xb0fd5dba, 0xcae0}, {0xb0fd5e95, 0xcadc}, {0xb1052893, 0x7149},
+    {0xb1e98745, 0x36a},  {0xb277e91c, 0x5166}, {0xb2f7eac5, 0xcae0},
+    {0xb2f7eba0, 0xcadc}, {0xb2f7ebc1, 0x3b5},  {0xb53fa77d, 0x3a8},
+    {0xb6391138, 0x6fb5}, {0xb7358b7f, 0x6fb6}, {0xb8c42b40, 0x4e4},
+    {0xb8c42ea4, 0x1b5},  {0xb8c439e7, 0x2e1},  {0xb8c43a61, 0x307},
+    {0xb8c43d6c, 0x4e4},  {0xb8c43ddf, 0x352},  {0xb8c43de1, 0x354},
+    {0xb8c43de6, 0x359},  {0xb8c43dff, 0x35d},  {0xb8c43e04, 0x362},
+    {0xb8c43e07, 0x365},  {0xbcd29a7f, 0x3a8},  {0xbce34e78, 0x5182},
+    {0xbce34e7b, 0x556a}, {0xbce81504, 0x3b5},  {0xbd8a4c95, 0x272d},
+    {0xbdd89dad, 0x4e4},  {0xbdd89dae, 0x6fb0}, {0xbdd89daf, 0x6fb1},
+    {0xbdd89db0, 0x6fb2}, {0xbdd89db1, 0x4e6},  {0xbdd89db5, 0x6fbd},
+    {0xc1756e9f, 0x36b},  {0xc7482444, 0x47a},  {0xc9281c18, 0x4e4},
+    {0xc9ef95df, 0x47b},  {0xccc9db0d, 0x4e4},  {0xccc9db0e, 0x6fb0},
+    {0xcd73425f, 0x3b6},  {0xce38b40b, 0x4b0},  {0xce99e549, 0x25},
+    {0xcf598740, 0x4e7},  {0xcf6d6f78, 0x4e4},  {0xcf758df6, 0x3a4},
+    {0xd1266e51, 0x6fb5}, {0xd2910213, 0x2718}, {0xd29196bb, 0x2712},
+    {0xd3eb2fc2, 0x476},  {0xd442dc2c, 0x4fc4}, {0xd9da4da4, 0x2711},
+    {0xdbad2f42, 0x4e4},  {0xdbad2f43, 0x6fb0}, {0xdbad2f44, 0x6fb1},
+    {0xdbad2f45, 0x6fb2}, {0xdbad2f46, 0x6fb3}, {0xdbad2f47, 0x6fb4},
+    {0xdbad2f48, 0x6fb5}, {0xdbad2f49, 0x6fb6}, {0xdbad2f4a, 0x4e6},
+    {0xdc438033, 0x4f31}, {0xdccb439b, 0x477},  {0xdccdc626, 0x3b5},
+    {0xdd80a595, 0x4e4},  {0xdd80a596, 0x6fb0}, {0xdd80a59e, 0x6fb1},
+    {0xdd80a5b4, 0x6fb2}, {0xdd80a5d9, 0x6fb5}, {0xdd80a5da, 0x6fb4},
+    {0xdd80a5fa, 0x6fb6}, {0xdd80a615, 0x6fb3}, {0xdd80a619, 0x4e6},
+    {0xdd80a61a, 0x3b5},  {0xdd80c0f8, 0x4e9f}, {0xdf7e46ff, 0x4fc8},
+    {0xdf8680fd, 0x556a}, {0xdfb0bd6e, 0xc42d}, {0xdff05486, 0x2c4},
+    {0xe3323399, 0x3a4},  {0xe60412dd, 0x3b5},  {0xeee47add, 0x4b0},
+    {0xf021a186, 0x4e2},  {0xf021a187, 0x4e3},  {0xf021a188, 0x4e4},
+    {0xf021a189, 0x4e5},  {0xf021a18a, 0x4e6},  {0xf021a18b, 0x4e7},
+    {0xf021a18c, 0x4e8},  {0xf021a18d, 0x4e9},  {0xf021a18e, 0x4ea},
+    {0xf0700456, 0x6fb3}, {0xf274f175, 0x3b5},  {0xf2a9730b, 0x3a8},
+    {0xf3d463c2, 0x3a4},  {0xf52a70a3, 0xc42e}, {0xf5693147, 0x6fb3},
+    {0xf637e157, 0x478},  {0xfc213f3a, 0x2717}, {0xff654d14, 0x3b5},
+};
+FX_WORD FX_GetCodePageFromStringA(const FX_CHAR* pStr, int32_t iLength) {
+  FXSYS_assert(pStr != NULL);
+  if (iLength < 0) {
+    iLength = FXSYS_strlen(pStr);
+  }
+  if (iLength == 0) {
+    return 0xFFFF;
+  }
+  uint32_t uHash = FX_HashCode_String_GetA(pStr, iLength, TRUE);
+  int32_t iStart = 0, iMid;
+  int32_t iEnd = sizeof(g_FXCPHashTable) / sizeof(FX_STR2CPHASH) - 1;
+  FXSYS_assert(iEnd >= 0);
+  do {
+    iMid = (iStart + iEnd) / 2;
+    const FX_STR2CPHASH& cp = g_FXCPHashTable[iMid];
+    if (uHash == cp.uHash) {
+      return (FX_WORD)cp.uCodePage;
+    } else if (uHash < cp.uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return 0xFFFF;
+}
+FX_WORD FX_GetCodePageFormStringW(const FX_WCHAR* pStr, int32_t iLength) {
+  if (iLength < 0) {
+    iLength = FXSYS_wcslen(pStr);
+  }
+  if (iLength == 0) {
+    return 0xFFFF;
+  }
+  CFX_ByteString csStr;
+  FX_CHAR* pBuf = csStr.GetBuffer(iLength + 1);
+  for (int32_t i = 0; i < iLength; ++i) {
+    *pBuf++ = (FX_CHAR)*pStr++;
+  }
+  csStr.ReleaseBuffer(iLength);
+  return FX_GetCodePageFromStringA(csStr, iLength);
+}
diff --git a/xfa/fgas/crt/fgas_codepage.h b/xfa/fgas/crt/fgas_codepage.h
new file mode 100644
index 0000000..479ad37
--- /dev/null
+++ b/xfa/fgas/crt/fgas_codepage.h
@@ -0,0 +1,179 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_CODEPAGE_H_
+#define XFA_FGAS_CRT_FGAS_CODEPAGE_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+#define FX_CODEPAGE_DefANSI 0
+#define FX_CODEPAGE_DefOEM 1
+#define FX_CODEPAGE_DefMAC 2
+#define FX_CODEPAGE_Thread 3
+#define FX_CODEPAGE_Symbol 42
+#define FX_CODEPAGE_MSDOS_US 437
+#define FX_CODEPAGE_Arabic_ASMO708 708
+#define FX_CODEPAGE_Arabic_ASMO449Plus 709
+#define FX_CODEPAGE_Arabic_Transparent 710
+#define FX_CODEPAGE_Arabic_NafithaEnhanced 711
+#define FX_CODEPAGE_Arabic_TransparentASMO 720
+#define FX_CODEPAGE_MSDOS_Greek1 737
+#define FX_CODEPAGE_MSDOS_Baltic 775
+#define FX_CODEPAGE_MSWin31_WesternEuropean 819
+#define FX_CODEPAGE_MSDOS_WesternEuropean 850
+#define FX_CODEPAGE_MSDOS_EasternEuropean 852
+#define FX_CODEPAGE_MSDOS_Latin3 853
+#define FX_CODEPAGE_MSDOS_Cyrillic 855
+#define FX_CODEPAGE_MSDOS_Turkish 857
+#define FX_CODEPAGE_MSDOS_Latin1Euro 858
+#define FX_CODEPAGE_MSDOS_Portuguese 860
+#define FX_CODEPAGE_MSDOS_Icelandic 861
+#define FX_CODEPAGE_MSDOS_Hebrew 862
+#define FX_CODEPAGE_MSDOS_FrenchCanadian 863
+#define FX_CODEPAGE_MSDOS_Arabic 864
+#define FX_CODEPAGE_MSDOS_Norwegian 865
+#define FX_CODEPAGE_MSDOS_Russian 866
+#define FX_CODEPAGE_MSDOS_Greek2 869
+#define FX_CODEPAGE_MSDOS_Thai 874
+#define FX_CODEPAGE_MSDOS_KamenickyCS 895
+#define FX_CODEPAGE_ShiftJIS 932
+#define FX_CODEPAGE_ChineseSimplified 936
+#define FX_CODEPAGE_Korean 949
+#define FX_CODEPAGE_ChineseTraditional 950
+#define FX_CODEPAGE_UTF16LE 1200
+#define FX_CODEPAGE_UTF16BE 1201
+#define FX_CODEPAGE_MSWin_EasternEuropean 1250
+#define FX_CODEPAGE_MSWin_Cyrillic 1251
+#define FX_CODEPAGE_MSWin_WesternEuropean 1252
+#define FX_CODEPAGE_MSWin_Greek 1253
+#define FX_CODEPAGE_MSWin_Turkish 1254
+#define FX_CODEPAGE_MSWin_Hebrew 1255
+#define FX_CODEPAGE_MSWin_Arabic 1256
+#define FX_CODEPAGE_MSWin_Baltic 1257
+#define FX_CODEPAGE_MSWin_Vietnamese 1258
+#define FX_CODEPAGE_Johab 1361
+#define FX_CODEPAGE_MAC_Roman 10000
+#define FX_CODEPAGE_MAC_ShiftJIS 10001
+#define FX_CODEPAGE_MAC_ChineseTraditional 10002
+#define FX_CODEPAGE_MAC_Korean 10003
+#define FX_CODEPAGE_MAC_Arabic 10004
+#define FX_CODEPAGE_MAC_Hebrew 10005
+#define FX_CODEPAGE_MAC_Greek 10006
+#define FX_CODEPAGE_MAC_Cyrillic 10007
+#define FX_CODEPAGE_MAC_ChineseSimplified 10008
+#define FX_CODEPAGE_MAC_Thai 10021
+#define FX_CODEPAGE_MAC_EasternEuropean 10029
+#define FX_CODEPAGE_MAC_Turkish 10081
+#define FX_CODEPAGE_UTF32LE 12000
+#define FX_CODEPAGE_UTF32BE 12001
+#define FX_CODEPAGE_ISO8859_1 28591
+#define FX_CODEPAGE_ISO8859_2 28592
+#define FX_CODEPAGE_ISO8859_3 28593
+#define FX_CODEPAGE_ISO8859_4 28594
+#define FX_CODEPAGE_ISO8859_5 28595
+#define FX_CODEPAGE_ISO8859_6 28596
+#define FX_CODEPAGE_ISO8859_7 28597
+#define FX_CODEPAGE_ISO8859_8 28598
+#define FX_CODEPAGE_ISO8859_9 28599
+#define FX_CODEPAGE_ISO8859_10 28600
+#define FX_CODEPAGE_ISO8859_11 28601
+#define FX_CODEPAGE_ISO8859_12 28602
+#define FX_CODEPAGE_ISO8859_13 28603
+#define FX_CODEPAGE_ISO8859_14 28604
+#define FX_CODEPAGE_ISO8859_15 28605
+#define FX_CODEPAGE_ISO8859_16 28606
+#define FX_CODEPAGE_ISCII_Devanagari 57002
+#define FX_CODEPAGE_ISCII_Bengali 57003
+#define FX_CODEPAGE_ISCII_Tamil 57004
+#define FX_CODEPAGE_ISCII_Telugu 57005
+#define FX_CODEPAGE_ISCII_Assamese 57006
+#define FX_CODEPAGE_ISCII_Oriya 57007
+#define FX_CODEPAGE_ISCII_Kannada 57008
+#define FX_CODEPAGE_ISCII_Malayalam 57009
+#define FX_CODEPAGE_ISCII_Gujarati 57010
+#define FX_CODEPAGE_ISCII_Punjabi 57011
+#define FX_CODEPAGE_UTF7 65000
+#define FX_CODEPAGE_UTF8 65001
+#define FX_CHARSET_ANSI 0
+#define FX_CHARSET_Default 1
+#define FX_CHARSET_Symbol 2
+#define FX_CHARSET_MAC_Roman 77
+#define FX_CHARSET_MAC_ShiftJIS 78
+#define FX_CHARSET_MAC_Korean 79
+#define FX_CHARSET_MAC_ChineseSimplified 80
+#define FX_CHARSET_MAC_ChineseTriditional 81
+#define FX_CHARSET_MAC_Johab 82
+#define FX_CHARSET_MAC_Hebrew 83
+#define FX_CHARSET_MAC_Arabic 84
+#define FX_CHARSET_MAC_Greek 85
+#define FX_CHARSET_MAC_Turkish 86
+#define FX_CHARSET_MAC_Thai 87
+#define FX_CHARSET_MAC_EasternEuropean 88
+#define FX_CHARSET_MAC_Cyrillic 89
+#define FX_CHARSET_ShiftJIS 128
+#define FX_CHARSET_Korean 129
+#define FX_CHARSET_Johab 130
+#define FX_CHARSET_ChineseSimplified 134
+#define FX_CHARSET_ChineseTriditional 136
+#define FX_CHARSET_MSWin_Greek 161
+#define FX_CHARSET_MSWin_Turkish 162
+#define FX_CHARSET_MSWin_Vietnamese 163
+#define FX_CHARSET_MSWin_Hebrew 177
+#define FX_CHARSET_MSWin_Arabic 178
+#define FX_CHARSET_ArabicTraditional 179
+#define FX_CHARSET_ArabicUser 180
+#define FX_CHARSET_HebrewUser 181
+#define FX_CHARSET_MSWin_Baltic 186
+#define FX_CHARSET_MSWin_Cyrillic 204
+#define FX_CHARSET_Thai 222
+#define FX_CHARSET_MSWin_EasterEuropean 238
+#define FX_CHARSET_US 254
+#define FX_CHARSET_OEM 255
+
+FX_WORD FX_GetCodePageFromCharset(uint8_t charset);
+FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage);
+FX_WORD FX_GetCodePageFromStringA(const FX_CHAR* pStr, int32_t iLength);
+FX_WORD FX_GetCodePageFormStringW(const FX_WCHAR* pStr, int32_t iLength);
+FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage);
+void FX_SwapByteOrder(FX_WCHAR* pStr, int32_t iLength);
+void FX_SwapByteOrderCopy(const FX_WCHAR* pSrc,
+                          FX_WCHAR* pDst,
+                          int32_t iLength);
+void FX_UTF16ToWChar(void* pBuffer, int32_t iLength);
+void FX_UTF16ToWCharCopy(const FX_WORD* pUTF16,
+                         FX_WCHAR* pWChar,
+                         int32_t iLength);
+void FX_WCharToUTF16(void* pBuffer, int32_t iLength);
+void FX_WCharToUTF16Copy(const FX_WCHAR* pWChar,
+                         FX_WORD* pUTF16,
+                         int32_t iLength);
+int32_t FX_DecodeString(FX_WORD wCodePage,
+                        const FX_CHAR* pSrc,
+                        int32_t* pSrcLen,
+                        FX_WCHAR* pDst,
+                        int32_t* pDstLen,
+                        FX_BOOL bErrBreak = FALSE);
+int32_t FX_UTF8Decode(const FX_CHAR* pSrc,
+                      int32_t* pSrcLen,
+                      FX_WCHAR* pDst,
+                      int32_t* pDstLen);
+
+struct FX_STR2CPHASH {
+  uint32_t uHash;
+  uint32_t uCodePage;
+};
+
+struct FX_CHARSET_MAP {
+  uint16_t charset;
+  uint16_t codepage;
+};
+
+struct FX_LANG2CPMAP {
+  FX_WORD wLanguage;
+  FX_WORD wCodepage;
+};
+
+#endif  // XFA_FGAS_CRT_FGAS_CODEPAGE_H_
diff --git a/xfa/fgas/crt/fgas_encode.cpp b/xfa/fgas/crt/fgas_encode.cpp
new file mode 100644
index 0000000..138b4b1
--- /dev/null
+++ b/xfa/fgas/crt/fgas_encode.cpp
@@ -0,0 +1,193 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+
+void FX_SwapByteOrder(FX_WCHAR* pStr, int32_t iLength) {
+  FXSYS_assert(pStr != NULL);
+  if (iLength < 0) {
+    iLength = FXSYS_wcslen(pStr);
+  }
+  FX_WORD wch;
+  if (sizeof(FX_WCHAR) > 2) {
+    while (iLength-- > 0) {
+      wch = (FX_WORD)*pStr;
+      wch = (wch >> 8) | (wch << 8);
+      wch &= 0x00FF;
+      *pStr++ = wch;
+    }
+  } else {
+    while (iLength-- > 0) {
+      wch = (FX_WORD)*pStr;
+      wch = (wch >> 8) | (wch << 8);
+      *pStr++ = wch;
+    }
+  }
+}
+void FX_SwapByteOrderCopy(const FX_WCHAR* pSrc,
+                          FX_WCHAR* pDst,
+                          int32_t iLength) {
+  FXSYS_assert(pSrc != NULL && pDst != NULL);
+  if (iLength < 0) {
+    iLength = FXSYS_wcslen(pSrc);
+  }
+  FX_WORD wch;
+  if (sizeof(FX_WCHAR) > 2) {
+    while (iLength-- > 0) {
+      wch = (FX_WORD)*pSrc++;
+      wch = (wch >> 8) | (wch << 8);
+      wch &= 0x00FF;
+      *pDst++ = wch;
+    }
+  } else {
+    while (iLength-- > 0) {
+      wch = (FX_WORD)*pSrc++;
+      wch = (wch >> 8) | (wch << 8);
+      *pDst++ = wch;
+    }
+  }
+}
+void FX_UTF16ToWChar(void* pBuffer, int32_t iLength) {
+  FXSYS_assert(pBuffer != NULL && iLength > 0);
+  if (sizeof(FX_WCHAR) == 2) {
+    return;
+  }
+  FX_WORD* pSrc = (FX_WORD*)pBuffer;
+  FX_WCHAR* pDst = (FX_WCHAR*)pBuffer;
+  while (--iLength >= 0) {
+    pDst[iLength] = (FX_WCHAR)pSrc[iLength];
+  }
+}
+void FX_UTF16ToWCharCopy(const FX_WORD* pUTF16,
+                         FX_WCHAR* pWChar,
+                         int32_t iLength) {
+  FXSYS_assert(pUTF16 != NULL && pWChar != NULL && iLength > 0);
+  if (sizeof(FX_WCHAR) == 2) {
+    FXSYS_memcpy(pWChar, pUTF16, iLength * sizeof(FX_WCHAR));
+  } else {
+    while (--iLength >= 0) {
+      pWChar[iLength] = (FX_WCHAR)pUTF16[iLength];
+    }
+  }
+}
+void FX_WCharToUTF16(void* pBuffer, int32_t iLength) {
+  FXSYS_assert(pBuffer != NULL && iLength > 0);
+  if (sizeof(FX_WCHAR) == 2) {
+    return;
+  }
+  const FX_WCHAR* pSrc = (const FX_WCHAR*)pBuffer;
+  FX_WORD* pDst = (FX_WORD*)pBuffer;
+  while (--iLength >= 0) {
+    *pDst++ = (FX_WORD)*pSrc++;
+  }
+}
+void FX_WCharToUTF16Copy(const FX_WCHAR* pWChar,
+                         FX_WORD* pUTF16,
+                         int32_t iLength) {
+  FXSYS_assert(pWChar != NULL && pUTF16 != NULL && iLength > 0);
+  if (sizeof(FX_WCHAR) == 2) {
+    FXSYS_memcpy(pUTF16, pWChar, iLength * sizeof(FX_WCHAR));
+  } else {
+    while (--iLength >= 0) {
+      *pUTF16++ = (FX_WORD)*pWChar++;
+    }
+  }
+}
+inline FX_DWORD FX_DWordFromBytes(const uint8_t* pStr) {
+  return FXBSTR_ID(pStr[3], pStr[2], pStr[1], pStr[0]);
+}
+inline FX_WORD FX_WordFromBytes(const uint8_t* pStr) {
+  return (pStr[1] << 8 | pStr[0]);
+}
+int32_t FX_DecodeString(FX_WORD wCodePage,
+                        const FX_CHAR* pSrc,
+                        int32_t* pSrcLen,
+                        FX_WCHAR* pDst,
+                        int32_t* pDstLen,
+                        FX_BOOL bErrBreak) {
+  if (wCodePage == FX_CODEPAGE_UTF8) {
+    return FX_UTF8Decode(pSrc, pSrcLen, pDst, pDstLen);
+  }
+  return -1;
+}
+int32_t FX_UTF8Decode(const FX_CHAR* pSrc,
+                      int32_t* pSrcLen,
+                      FX_WCHAR* pDst,
+                      int32_t* pDstLen) {
+  if (pSrcLen == NULL || pDstLen == NULL) {
+    return -1;
+  }
+  int32_t iSrcLen = *pSrcLen;
+  if (iSrcLen < 1) {
+    *pSrcLen = *pDstLen = 0;
+    return 1;
+  }
+  int32_t iDstLen = *pDstLen;
+  FX_BOOL bValidDst = (pDst != NULL && iDstLen > 0);
+  FX_DWORD dwCode = 0;
+  int32_t iPending = 0;
+  int32_t iSrcNum = 0, iDstNum = 0;
+  int32_t k = 0;
+  int32_t iIndex = 0;
+  k = 1;
+  while (iIndex < iSrcLen) {
+    uint8_t byte = (uint8_t) * (pSrc + iIndex);
+    if (byte < 0x80) {
+      iPending = 0;
+      k = 1;
+      iDstNum++;
+      iSrcNum += k;
+      if (bValidDst) {
+        *pDst++ = byte;
+        if (iDstNum >= iDstLen) {
+          break;
+        }
+      }
+    } else if (byte < 0xc0) {
+      if (iPending < 1) {
+        break;
+      }
+      iPending--;
+      dwCode |= (byte & 0x3f) << (iPending * 6);
+      if (iPending == 0) {
+        iDstNum++;
+        iSrcNum += k;
+        if (bValidDst) {
+          *pDst++ = dwCode;
+          if (iDstNum >= iDstLen) {
+            break;
+          }
+        }
+      }
+    } else if (byte < 0xe0) {
+      iPending = 1;
+      k = 2;
+      dwCode = (byte & 0x1f) << 6;
+    } else if (byte < 0xf0) {
+      iPending = 2;
+      k = 3;
+      dwCode = (byte & 0x0f) << 12;
+    } else if (byte < 0xf8) {
+      iPending = 3;
+      k = 4;
+      dwCode = (byte & 0x07) << 18;
+    } else if (byte < 0xfc) {
+      iPending = 4;
+      k = 5;
+      dwCode = (byte & 0x03) << 24;
+    } else if (byte < 0xfe) {
+      iPending = 5;
+      k = 6;
+      dwCode = (byte & 0x01) << 30;
+    } else {
+      break;
+    }
+    iIndex++;
+  }
+  *pSrcLen = iSrcNum;
+  *pDstLen = iDstNum;
+  return 1;
+}
diff --git a/xfa/fgas/crt/fgas_language.h b/xfa/fgas/crt/fgas_language.h
new file mode 100644
index 0000000..21d68e6
--- /dev/null
+++ b/xfa/fgas/crt/fgas_language.h
@@ -0,0 +1,269 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_LANGUAGE_H_
+#define XFA_FGAS_CRT_FGAS_LANGUAGE_H_
+
+#define FX_LANG_Neutral 0x0000
+#define FX_LANG_Invariant 0x007f
+#define FX_LANG_UserDefault 0x0400
+#define FX_LANG_SystemDefault 0x0800
+#define FX_LANG_Afrikaans_SouthAfrica 0x0436
+#define FX_LANG_Albanian_Albania 0x041c
+#define FX_LANG_Alsatian_France 0x0484
+#define FX_LANG_Amharic_Ethiopia 0x045e
+#define FX_LANG_Arabic_Algeria 0x1401
+#define FX_LANG_Arabic_Bahrain 0x3c01
+#define FX_LANG_Arabic_Egypt 0x0c01
+#define FX_LANG_Arabic_Iraq 0x0801
+#define FX_LANG_Arabic_Jordan 0x2c01
+#define FX_LANG_Arabic_Kuwait 0x3401
+#define FX_LANG_Arabic_Lebanon 0x3001
+#define FX_LANG_Arabic_Libya 0x1001
+#define FX_LANG_Arabic_Morocco 0x1801
+#define FX_LANG_Arabic_Oman 0x2001
+#define FX_LANG_Arabic_Qatar 0x4001
+#define FX_LANG_Arabic_SaudiArabia 0x0401
+#define FX_LANG_Arabic_Syria 0x2801
+#define FX_LANG_Arabic_Tunisia 0x1c01
+#define FX_LANG_Arabic_UAE 0x3801
+#define FX_LANG_Arabic_Yemen 0x2401
+#define FX_LANG_Armenian_Armenia 0x042b
+#define FX_LANG_Assamese_India 0x044d
+#define FX_LANG_Azerbaijan_Cyrillic 0x082c
+#define FX_LANG_Azerbaijan_Latin 0x042c
+#define FX_LANG_Bashkir_Russia 0x046d
+#define FX_LANG_Basque_Basque 0x042d
+#define FX_LANG_Belarusian_Belarus 0x0423
+#define FX_LANG_Bengali_Bangladesh 0x0845
+#define FX_LANG_Bengali_India 0x0445
+#define FX_LANG_Bosnia_Herzegovina 0x101a
+#define FX_LANG_Bosnian_Cyrillic 0x201a
+#define FX_LANG_Bosnian_Latin 0x141a
+#define FX_LANG_Breton_France 0x047e
+#define FX_LANG_Bulgarian_Bulgaria 0x0402
+#define FX_LANG_Burmese 0x0455
+#define FX_LANG_Catalan_Catalan 0x0403
+#define FX_LANG_Cherokee 0x045c
+#define FX_LANG_Chinese_HongKong 0x0c04
+#define FX_LANG_Chinese_Macao 0x1404
+#define FX_LANG_Chinese_PRC 0x0804
+#define FX_LANG_Chinese_Singapore 0x1004
+#define FX_LANG_Chinese_Taiwan 0x0404
+#define FX_LANG_Corsican_France 0x0483
+#define FX_LANG_Croatian_Croatia 0x041a
+#define FX_LANG_Croatian_Latin 0x101a
+#define FX_LANG_CustomCurrent 0x0c00
+#define FX_LANG_CzechRepublic 0x0405
+#define FX_LANG_Danish_Denmark 0x0406
+#define FX_LANG_Dari_Afghanistan 0x048c
+#define FX_LANG_Divehi_Maldives 0x0465
+#define FX_LANG_Dutch_Belgium 0x0813
+#define FX_LANG_Dutch_Netherlands 0x0413
+#define FX_LANG_Dutch_Preferred 0x0013
+#define FX_LANG_Dzongkha 0x0851
+#define FX_LANG_Edo 0x0466
+#define FX_LANG_English_Australia 0x0c09
+#define FX_LANG_English_Belize 0x2809
+#define FX_LANG_English_Canada 0x1009
+#define FX_LANG_English_Caribbean 0x2409
+#define FX_LANG_English_HongKong 0x3c09
+#define FX_LANG_English_India 0x4009
+#define FX_LANG_English_Indonesia 0x3809
+#define FX_LANG_English_Ireland 0x1809
+#define FX_LANG_English_Jamaica 0x2009
+#define FX_LANG_English_Malaysia 0x4409
+#define FX_LANG_English_NewZealand 0x1409
+#define FX_LANG_English_Philippines 0x3409
+#define FX_LANG_English_Singapore 0x4809
+#define FX_LANG_English_SouthAfrica 0x1c09
+#define FX_LANG_English_TrinidadTobago 0x2c09
+#define FX_LANG_English_UnitedKingdom 0x0809
+#define FX_LANG_English_UnitedStates 0x0409
+#define FX_LANG_English_Zimbabwe 0x3009
+#define FX_LANG_Estonian_Estonia 0x0425
+#define FX_LANG_Faroese_FaroeIslands 0x0438
+#define FX_LANG_Filipino_Philippines 0x0464
+#define FX_LANG_Finnish_Finland 0x040b
+#define FX_LANG_French_Belgium 0x080c
+#define FX_LANG_French_Cameroon 0x2c0c
+#define FX_LANG_French_Canada 0x0c0c
+#define FX_LANG_French_CongoDRC 0x240c
+#define FX_LANG_French_CotedIvoire 0x300c
+#define FX_LANG_French_France 0x040c
+#define FX_LANG_French_Haiti 0x3c0c
+#define FX_LANG_French_Luxembourg 0x140c
+#define FX_LANG_French_Mali 0x340c
+#define FX_LANG_French_Monaco 0x180c
+#define FX_LANG_French_Morocco 0x380c
+#define FX_LANG_French_Reunion 0x200c
+#define FX_LANG_French_Senegal 0x280c
+#define FX_LANG_French_Switzerland 0x100c
+#define FX_LANG_French_WestIndies 0x1c0c
+#define FX_LANG_Frisian_Netherlands 0x0462
+#define FX_LANG_Fulfulde 0x0467
+#define FX_LANG_Gaelic_Ireland 0x083c
+#define FX_LANG_Gaelic_Scotland 0x043c
+#define FX_LANG_Galician_Galician 0x0456
+#define FX_LANG_Georgian_Georgia 0x0437
+#define FX_LANG_German_Austria 0x0c07
+#define FX_LANG_German_Germany 0x0407
+#define FX_LANG_German_Liechtenstein 0x1407
+#define FX_LANG_German_Luxembourg 0x1007
+#define FX_LANG_German_Switzerland 0x0807
+#define FX_LANG_Greek_Greece 0x0408
+#define FX_LANG_Greenlandic_Greenland 0x046f
+#define FX_LANG_Guarani 0x0474
+#define FX_LANG_Gujarati_India 0x0447
+#define FX_LANG_Hausa_LatinNigeria 0x0468
+#define FX_LANG_Hawaiian 0x0475
+#define FX_LANG_Hebrew_Israel 0x040d
+#define FX_LANG_Hindi_India 0x0439
+#define FX_LANG_Hungarian_Hungary 0x040e
+#define FX_LANG_Ibibio_Nigeria 0x0469
+#define FX_LANG_Icelandic_Iceland 0x040f
+#define FX_LANG_Igbo_Nigeria 0x0470
+#define FX_LANG_Indonesian_Indonesia 0x0421
+#define FX_LANG_Inuktitut_LatinCanada 0x085d
+#define FX_LANG_Inuktitut_SyllabicsCanada 0x045d
+#define FX_LANG_IsiXhosa_SouthAfrica 0x0434
+#define FX_LANG_IsiZulu_SouthAfrica 0x0435
+#define FX_LANG_Italian_Italy 0x0410
+#define FX_LANG_Italian_Switzerland 0x0810
+#define FX_LANG_Japanese_Japan 0x0411
+#define FX_LANG_Kannada_India 0x044b
+#define FX_LANG_Kanuri 0x0471
+#define FX_LANG_Kashmiri 0x0860
+#define FX_LANG_Kashmiri_Arabic 0x0460
+#define FX_LANG_Kazakh_Kazakhstan 0x043f
+#define FX_LANG_Khmer_Cambodia 0x0453
+#define FX_LANG_Kiche_Guatemala 0x0486
+#define FX_LANG_Kinyarwanda_Rwanda 0x0487
+#define FX_LANG_Kiswahili_Kenya 0x0441
+#define FX_LANG_Konkani_India 0x0457
+#define FX_LANG_Korean_Korea 0x0412
+#define FX_LANG_Kyrgyz_Kyrgyzstan 0x0440
+#define FX_LANG_Lao_LaoPDR 0x0454
+#define FX_LANG_Latin 0x0476
+#define FX_LANG_Latvian_Latvia 0x0426
+#define FX_LANG_Lithuanian_Lithuania 0x0427
+#define FX_LANG_LithuanianTrad 0x0827
+#define FX_LANG_Lower Sorbian_Germany 0x082e
+#define FX_LANG_Luxembourgish_Luxembourg 0x046e
+#define FX_LANG_Macedonian 0x042f
+#define FX_LANG_Malay_BruneiDarussalam 0x083e
+#define FX_LANG_Malay_Malaysia 0x043e
+#define FX_LANG_Malayalam_India 0x044c
+#define FX_LANG_Maldivian 0x0465
+#define FX_LANG_Maltese_Malta 0x043a
+#define FX_LANG_Manipuri 0x0458
+#define FX_LANG_Maori_NewZealand 0x0481
+#define FX_LANG_Mapudungun_Chile 0x047a
+#define FX_LANG_Marathi_India 0x044e
+#define FX_LANG_Mohawk_Mohawk 0x047c
+#define FX_LANG_Mongolian_CyrillicMongolia 0x0450
+#define FX_LANG_Mongolian_TraditionalMongolian 0x0850
+#define FX_LANG_Nepali_India 0x0861
+#define FX_LANG_Nepali_Nepal 0x0461
+#define FX_LANG_Norwegian_Bokmal 0x0414
+#define FX_LANG_Norwegian_Nynorsk 0x0814
+#define FX_LANG_Occitan_France 0x0482
+#define FX_LANG_Oriya_India 0x0448
+#define FX_LANG_Oromo 0x0472
+#define FX_LANG_Papiamentu 0x0479
+#define FX_LANG_Pashto_Afghanistan 0x0463
+#define FX_LANG_Persian 0x0429
+#define FX_LANG_Polish_Poland 0x0415
+#define FX_LANG_Portuguese_Brazil 0x0416
+#define FX_LANG_Portuguese_Portugal 0x0816
+#define FX_LANG_Punjabi_India 0x0446
+#define FX_LANG_Punjabi_Pakistan 0x0846
+#define FX_LANG_Quechua_Bolivia 0x046b
+#define FX_LANG_Quechua_Ecuador 0x086b
+#define FX_LANG_Quechua_Peru 0x0c6b
+#define FX_LANG_Romanian_Moldova 0x0818
+#define FX_LANG_Romanian_Romania 0x0418
+#define FX_LANG_Romansh_Switzerland 0x0417
+#define FX_LANG_Russian_Moldova 0x0819
+#define FX_LANG_Russian_Russia 0x0419
+#define FX_LANG_Sami_InariFinland 0x243b
+#define FX_LANG_Sami_LuleNorway 0x103b
+#define FX_LANG_Sami_LuleSweden 0x143b
+#define FX_LANG_Sami_NorthernFinland 0x0c3b
+#define FX_LANG_Sami_NorthernNorway 0x043b
+#define FX_LANG_Sami_NorthernSweden 0x083b
+#define FX_LANG_Sami_SkoltFinland 0x203b
+#define FX_LANG_Sami_SouthernNorway 0x183b
+#define FX_LANG_Sami_SouthernSweden 0x1c3b
+#define FX_LANG_SanskritIndia 0x044f
+#define FX_LANG_SerbianCyrillic_BosniaHerzegovina 0x1c1a
+#define FX_LANG_SerbianCyrillic_Serbia 0x0c1a
+#define FX_LANG_SerbianLatin_BosniaHerzegovina 0x181a
+#define FX_LANG_SerbianLatin_Serbia 0x081a
+#define FX_LANG_SesothoSaLeboa 0x046c
+#define FX_LANG_Setswana_SouthAfrica 0x0432
+#define FX_LANG_Sindhi_Arabic 0x0859
+#define FX_LANG_Sindhi_Devanagari 0x0459
+#define FX_LANG_Sinhala_SriLanka 0x045b
+#define FX_LANG_Slovak_Slovakia 0x041b
+#define FX_LANG_Slovenian_Slovenia 0x0424
+#define FX_LANG_Somali 0x0477
+#define FX_LANG_Spanish_Argentina 0x2c0a
+#define FX_LANG_Spanish_Bolivia 0x400a
+#define FX_LANG_Spanish_Chile 0x340a
+#define FX_LANG_Spanish_Colombia 0x240a
+#define FX_LANG_Spanish_CostaRica 0x140a
+#define FX_LANG_Spanish_DominicanRepublic 0x1c0a
+#define FX_LANG_Spanish_Ecuador 0x300a
+#define FX_LANG_Spanish_ElSalvador 0x440a
+#define FX_LANG_Spanish_Guatemala 0x100a
+#define FX_LANG_Spanish_Honduras 0x480a
+#define FX_LANG_Spanish_Mexico 0x080a
+#define FX_LANG_Spanish_Nicaragua 0x4c0a
+#define FX_LANG_Spanish_Panama 0x180a
+#define FX_LANG_Spanish_Paraguay 0x3c0a
+#define FX_LANG_Spanish_Peru 0x280a
+#define FX_LANG_Spanish_PuertoRico 0x500a
+#define FX_LANG_Spanish_InternationalSort 0x0c0a
+#define FX_LANG_Spanish_TraditionalSort 0x040a
+#define FX_LANG_Spanish_UnitedStates 0x540a
+#define FX_LANG_Spanish_Uruguay 0x380a
+#define FX_LANG_Spanish_Venezuela 0x200a
+#define FX_LANG_Sutu_SouthAfrica 0x0430
+#define FX_LANG_Swedish_Finland 0x081d
+#define FX_LANG_Swedish_Sweden 0x041d
+#define FX_LANG_Syriac_Syria 0x045a
+#define FX_LANG_Tajik_CyrillicTajikistan 0x0428
+#define FX_LANG_Tamazight_ArabicMorocco 0x045f
+#define FX_LANG_Tamazight_LatinAlgeria 0x085f
+#define FX_LANG_Tamil_India 0x0449
+#define FX_LANG_Tatar_Russia 0x0444
+#define FX_LANG_Telugu_India 0x044a
+#define FX_LANG_Thai_Thailand 0x041e
+#define FX_LANG_TibetanPRC 0x0451
+#define FX_LANG_Tigrigna_Eritrea 0x0873
+#define FX_LANG_Tigrigna_Ethiopia 0x0473
+#define FX_LANG_Tsonga 0x0431
+#define FX_LANG_Turkish_Turkey 0x041f
+#define FX_LANG_Turkmen_Turkmenistan 0x0442
+#define FX_LANG_UighurPRC 0x0480
+#define FX_LANG_Ukrainian_Ukraine 0x0422
+#define FX_LANG_UpperSorbian_Germany 0x042e
+#define FX_LANG_Urdu_Pakistan 0x0420
+#define FX_LANG_Urdu_India 0x0820
+#define FX_LANG_Uzbek_CyrillicUzbekistan 0x0843
+#define FX_LANG_Uzbek_LatinUzbekistan 0x0443
+#define FX_LANG_Venda 0x0433
+#define FX_LANG_Vietnamese_Vietnam 0x042a
+#define FX_LANG_Welsh_UnitedKingdom 0x0452
+#define FX_LANG_Wolof_Senegal 0x0488
+#define FX_LANG_Xhosa 0x0434
+#define FX_LANG_Yakut_Russia 0x0485
+#define FX_LANG_YiPRC 0x0478
+#define FX_LANG_Yiddish 0x043d
+#define FX_LANG_Yoruba_Nigeria 0x046a
+
+#endif  // XFA_FGAS_CRT_FGAS_LANGUAGE_H_
diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp
new file mode 100644
index 0000000..7eda5b9
--- /dev/null
+++ b/xfa/fgas/crt/fgas_memory.cpp
@@ -0,0 +1,446 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_memory.h"
+
+#include <algorithm>
+
+namespace {
+
+class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target {
+ public:
+  CFX_DefStore() {}
+  ~CFX_DefStore() {}
+  virtual void Release() { delete this; }
+  virtual void* Alloc(size_t size) { return FX_Alloc(uint8_t, size); }
+  virtual void Free(void* pBlock) { FX_Free(pBlock); }
+  virtual size_t GetBlockSize() const { return 0; }
+  virtual size_t GetDefChunkSize() const { return 0; }
+  virtual size_t SetDefChunkSize(size_t size) { return 0; }
+  virtual size_t GetCurrentDataSize() const { return 0; }
+};
+
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(push, 1)
+#endif
+struct FX_STATICSTORECHUNK {
+  FX_STATICSTORECHUNK* pNextChunk;
+  size_t iChunkSize;
+  size_t iFreeSize;
+};
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(pop)
+#endif
+
+class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target {
+ public:
+  CFX_StaticStore(size_t iDefChunkSize = 4096);
+  ~CFX_StaticStore();
+  virtual void Release() { delete this; }
+  virtual void* Alloc(size_t size);
+  virtual void Free(void* pBlock) {}
+  virtual size_t GetBlockSize() const { return 0; }
+  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
+  virtual size_t SetDefChunkSize(size_t size);
+  virtual size_t GetCurrentDataSize() const { return m_iAllocatedSize; }
+
+ protected:
+  size_t m_iAllocatedSize;
+  size_t m_iDefChunkSize;
+  FX_STATICSTORECHUNK* m_pChunk;
+  FX_STATICSTORECHUNK* m_pLastChunk;
+  FX_STATICSTORECHUNK* AllocChunk(size_t size);
+  FX_STATICSTORECHUNK* FindChunk(size_t size);
+};
+
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(push, 1)
+#endif
+struct FX_FIXEDSTORECHUNK {
+  uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); }
+  uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; }
+
+  FX_FIXEDSTORECHUNK* pNextChunk;
+  size_t iChunkSize;
+  size_t iFreeNum;
+};
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(pop)
+#endif
+
+class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target {
+ public:
+  CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk);
+  virtual ~CFX_FixedStore();
+  virtual void Release() { delete this; }
+  virtual void* Alloc(size_t size);
+  virtual void Free(void* pBlock);
+  virtual size_t GetBlockSize() const { return m_iBlockSize; }
+  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
+  virtual size_t SetDefChunkSize(size_t iChunkSize);
+  virtual size_t GetCurrentDataSize() const { return 0; }
+
+ protected:
+  FX_FIXEDSTORECHUNK* AllocChunk();
+
+  size_t m_iBlockSize;
+  size_t m_iDefChunkSize;
+  FX_FIXEDSTORECHUNK* m_pChunk;
+};
+
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(push, 1)
+#endif
+struct FX_DYNAMICSTOREBLOCK {
+  uint8_t* Data() { return reinterpret_cast<uint8_t*>(this + 1); }
+  FX_DYNAMICSTOREBLOCK* NextBlock() {
+    return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(Data() + iBlockSize);
+  }
+  size_t iBlockSize;
+  FX_BOOL bUsed;
+};
+
+struct FX_DYNAMICSTORECHUNK {
+  FX_DYNAMICSTOREBLOCK* FirstBlock() {
+    return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(this + 1);
+  }
+  FX_DYNAMICSTORECHUNK* pNextChunk;
+  size_t iChunkSize;
+  size_t iFreeSize;
+};
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(pop)
+#endif
+
+class CFX_DynamicStore : public IFX_MEMAllocator, public CFX_Target {
+ public:
+  CFX_DynamicStore(size_t iDefChunkSize = 4096);
+  virtual ~CFX_DynamicStore();
+  virtual void Release() { delete this; }
+  virtual void* Alloc(size_t size);
+  virtual void Free(void* pBlock);
+  virtual size_t GetBlockSize() const { return 0; }
+  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
+  virtual size_t SetDefChunkSize(size_t size);
+  virtual size_t GetCurrentDataSize() const { return 0; }
+
+ protected:
+  FX_DYNAMICSTORECHUNK* AllocChunk(size_t size);
+
+  size_t m_iDefChunkSize;
+  FX_DYNAMICSTORECHUNK* m_pChunk;
+};
+
+}  // namespace
+
+#define FX_4BYTEALIGN(size) (((size) + 3) / 4 * 4)
+
+IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType,
+                                     size_t chunkSize,
+                                     size_t blockSize) {
+  switch (eType) {
+    case FX_ALLOCTYPE_Dynamic:
+      return new CFX_DynamicStore(chunkSize);
+    case FX_ALLOCTYPE_Default:
+      return new CFX_DefStore();
+    case FX_ALLOCTYPE_Static:
+      return new CFX_StaticStore(chunkSize);
+    case FX_ALLOCTYPE_Fixed:
+      return new CFX_FixedStore(blockSize, chunkSize);
+    default:
+      return NULL;
+  }
+}
+CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize)
+    : m_iAllocatedSize(0),
+      m_iDefChunkSize(iDefChunkSize),
+      m_pChunk(NULL),
+      m_pLastChunk(NULL) {
+  FXSYS_assert(m_iDefChunkSize != 0);
+}
+CFX_StaticStore::~CFX_StaticStore() {
+  FX_STATICSTORECHUNK* pChunk = m_pChunk;
+  while (pChunk) {
+    FX_STATICSTORECHUNK* pNext = pChunk->pNextChunk;
+    FX_Free(pChunk);
+    pChunk = pNext;
+  }
+}
+FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) {
+  FXSYS_assert(size != 0);
+  FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc(
+      uint8_t, sizeof(FX_STATICSTORECHUNK) + size);
+  pChunk->iChunkSize = size;
+  pChunk->iFreeSize = size;
+  pChunk->pNextChunk = NULL;
+  if (m_pLastChunk == NULL) {
+    m_pChunk = pChunk;
+  } else {
+    m_pLastChunk->pNextChunk = pChunk;
+  }
+  m_pLastChunk = pChunk;
+  return pChunk;
+}
+FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) {
+  FXSYS_assert(size != 0);
+  if (m_pLastChunk == NULL || m_pLastChunk->iFreeSize < size) {
+    return AllocChunk(std::max(m_iDefChunkSize, size));
+  }
+  return m_pLastChunk;
+}
+void* CFX_StaticStore::Alloc(size_t size) {
+  size = FX_4BYTEALIGN(size);
+  FXSYS_assert(size != 0);
+  FX_STATICSTORECHUNK* pChunk = FindChunk(size);
+  FXSYS_assert(pChunk->iFreeSize >= size);
+  uint8_t* p = (uint8_t*)pChunk;
+  p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize;
+  pChunk->iFreeSize -= size;
+  m_iAllocatedSize += size;
+  return p;
+}
+size_t CFX_StaticStore::SetDefChunkSize(size_t size) {
+  FXSYS_assert(size != 0);
+  size_t v = m_iDefChunkSize;
+  m_iDefChunkSize = size;
+  return v;
+}
+CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk)
+    : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)),
+      m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)),
+      m_pChunk(NULL) {
+  FXSYS_assert(m_iBlockSize != 0 && m_iDefChunkSize != 0);
+}
+CFX_FixedStore::~CFX_FixedStore() {
+  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
+  while (pChunk) {
+    FX_FIXEDSTORECHUNK* pNext = pChunk->pNextChunk;
+    FX_Free(pChunk);
+    pChunk = pNext;
+  }
+}
+FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() {
+  int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize +
+                       m_iBlockSize * m_iDefChunkSize;
+  FX_FIXEDSTORECHUNK* pChunk =
+      (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize);
+  if (pChunk == NULL) {
+    return NULL;
+  }
+  FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize);
+  pChunk->pNextChunk = m_pChunk;
+  pChunk->iChunkSize = m_iDefChunkSize;
+  pChunk->iFreeNum = m_iDefChunkSize;
+  m_pChunk = pChunk;
+  return pChunk;
+}
+void* CFX_FixedStore::Alloc(size_t size) {
+  if (size > m_iBlockSize) {
+    return NULL;
+  }
+  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
+  while (pChunk != NULL) {
+    if (pChunk->iFreeNum > 0) {
+      break;
+    }
+    pChunk = pChunk->pNextChunk;
+  }
+  if (pChunk == NULL) {
+    pChunk = AllocChunk();
+  }
+  FXSYS_assert(pChunk != NULL);
+  uint8_t* pFlags = pChunk->FirstFlag();
+  size_t i = 0;
+  for (; i < pChunk->iChunkSize; i++)
+    if (pFlags[i] == 0) {
+      break;
+    }
+  FXSYS_assert(i < pChunk->iChunkSize);
+  pFlags[i] = 1;
+  pChunk->iFreeNum--;
+  return pChunk->FirstBlock() + i * m_iBlockSize;
+}
+void CFX_FixedStore::Free(void* pBlock) {
+  FXSYS_assert(pBlock != NULL);
+  FX_FIXEDSTORECHUNK* pPrior = NULL;
+  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
+  uint8_t* pStart = NULL;
+  uint8_t* pEnd;
+  while (pChunk != NULL) {
+    pStart = pChunk->FirstBlock();
+    if (pBlock >= pStart) {
+      pEnd = pStart + m_iBlockSize * pChunk->iChunkSize;
+      if (pBlock < pEnd) {
+        break;
+      }
+    }
+    pPrior = pChunk, pChunk = pChunk->pNextChunk;
+  }
+  FXSYS_assert(pChunk != NULL);
+  size_t iPos = ((uint8_t*)pBlock - pStart) / m_iBlockSize;
+  FXSYS_assert(iPos < pChunk->iChunkSize);
+  uint8_t* pFlags = pChunk->FirstFlag();
+  if (pFlags[iPos] == 0) {
+    return;
+  }
+  pFlags[iPos] = 0;
+  pChunk->iFreeNum++;
+  if (pChunk->iFreeNum == pChunk->iChunkSize) {
+    if (pPrior == NULL) {
+      m_pChunk = pChunk->pNextChunk;
+    } else {
+      pPrior->pNextChunk = pChunk->pNextChunk;
+    }
+    FX_Free(pChunk);
+  }
+}
+size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) {
+  FXSYS_assert(iChunkSize != 0);
+  size_t v = m_iDefChunkSize;
+  m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize);
+  return v;
+}
+CFX_DynamicStore::CFX_DynamicStore(size_t iDefChunkSize)
+    : m_iDefChunkSize(iDefChunkSize), m_pChunk(NULL) {
+  FXSYS_assert(m_iDefChunkSize != 0);
+}
+CFX_DynamicStore::~CFX_DynamicStore() {
+  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
+  while (pChunk) {
+    FX_DYNAMICSTORECHUNK* pNext = pChunk->pNextChunk;
+    FX_Free(pChunk);
+    pChunk = pNext;
+  }
+}
+FX_DYNAMICSTORECHUNK* CFX_DynamicStore::AllocChunk(size_t size) {
+  FXSYS_assert(size != 0);
+  FX_DYNAMICSTORECHUNK* pChunk = (FX_DYNAMICSTORECHUNK*)FX_Alloc(
+      uint8_t,
+      sizeof(FX_DYNAMICSTORECHUNK) + sizeof(FX_DYNAMICSTOREBLOCK) * 2 + size);
+  if (pChunk == NULL) {
+    return NULL;
+  }
+  pChunk->iChunkSize = size;
+  pChunk->iFreeSize = size;
+  FX_DYNAMICSTOREBLOCK* pBlock = pChunk->FirstBlock();
+  pBlock->iBlockSize = size;
+  pBlock->bUsed = FALSE;
+  pBlock = pBlock->NextBlock();
+  pBlock->iBlockSize = 0;
+  pBlock->bUsed = TRUE;
+  if (m_pChunk != NULL && size >= m_iDefChunkSize) {
+    FX_DYNAMICSTORECHUNK* pLast = m_pChunk;
+    while (pLast->pNextChunk != NULL) {
+      pLast = pLast->pNextChunk;
+    }
+    pLast->pNextChunk = pChunk;
+    pChunk->pNextChunk = NULL;
+  } else {
+    pChunk->pNextChunk = m_pChunk;
+    m_pChunk = pChunk;
+  }
+  return pChunk;
+}
+void* CFX_DynamicStore::Alloc(size_t size) {
+  size = FX_4BYTEALIGN(size);
+  FXSYS_assert(size != 0);
+  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
+  FX_DYNAMICSTOREBLOCK* pBlock = NULL;
+  while (pChunk != NULL) {
+    if (pChunk->iFreeSize >= size) {
+      pBlock = pChunk->FirstBlock();
+      FX_BOOL bFind = FALSE;
+      while (pBlock->iBlockSize != 0) {
+        if (!pBlock->bUsed && pBlock->iBlockSize >= size) {
+          bFind = TRUE;
+          break;
+        }
+        pBlock = pBlock->NextBlock();
+      }
+      if (bFind) {
+        break;
+      }
+    }
+    pChunk = pChunk->pNextChunk;
+  }
+  if (pChunk == NULL) {
+    pChunk = AllocChunk(std::max(m_iDefChunkSize, size));
+    pBlock = pChunk->FirstBlock();
+  }
+  FXSYS_assert(pChunk != NULL && pBlock != NULL);
+  size_t m = size + sizeof(FX_DYNAMICSTOREBLOCK);
+  pBlock->bUsed = TRUE;
+  if (pBlock->iBlockSize > m) {
+    size_t n = pBlock->iBlockSize;
+    pBlock->iBlockSize = size;
+    FX_DYNAMICSTOREBLOCK* pNextBlock = pBlock->NextBlock();
+    pNextBlock->bUsed = FALSE;
+    pNextBlock->iBlockSize = n - size - sizeof(FX_DYNAMICSTOREBLOCK);
+    pChunk->iFreeSize -= size + sizeof(FX_DYNAMICSTOREBLOCK);
+  } else {
+    pChunk->iFreeSize -= pBlock->iBlockSize;
+  }
+  return pBlock->Data();
+}
+void CFX_DynamicStore::Free(void* pBlock) {
+  FXSYS_assert(pBlock != NULL);
+  FX_DYNAMICSTORECHUNK* pPriorChunk = NULL;
+  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
+  while (pChunk != NULL) {
+    if (pBlock > pChunk &&
+        pBlock <= ((uint8_t*)pChunk + sizeof(FX_DYNAMICSTORECHUNK) +
+                   pChunk->iChunkSize)) {
+      break;
+    }
+    pPriorChunk = pChunk, pChunk = pChunk->pNextChunk;
+  }
+  FXSYS_assert(pChunk != NULL);
+  FX_DYNAMICSTOREBLOCK* pPriorBlock = NULL;
+  FX_DYNAMICSTOREBLOCK* pFindBlock = pChunk->FirstBlock();
+  while (pFindBlock->iBlockSize != 0) {
+    if (pBlock == (void*)pFindBlock->Data()) {
+      break;
+    }
+    pPriorBlock = pFindBlock;
+    pFindBlock = pFindBlock->NextBlock();
+  }
+  FXSYS_assert(pFindBlock->iBlockSize != 0 && pFindBlock->bUsed &&
+               pBlock == (void*)pFindBlock->Data());
+  pFindBlock->bUsed = FALSE;
+  pChunk->iFreeSize += pFindBlock->iBlockSize;
+  if (pPriorBlock == NULL) {
+    pPriorBlock = pChunk->FirstBlock();
+  } else if (pPriorBlock->bUsed) {
+    pPriorBlock = pFindBlock;
+  }
+  pFindBlock = pPriorBlock;
+  size_t sizeFree = 0;
+  size_t sizeBlock = 0;
+  while (pFindBlock->iBlockSize != 0 && !pFindBlock->bUsed) {
+    if (pFindBlock != pPriorBlock) {
+      sizeFree += sizeof(FX_DYNAMICSTOREBLOCK);
+      sizeBlock += sizeof(FX_DYNAMICSTOREBLOCK);
+    }
+    sizeBlock += pFindBlock->iBlockSize;
+    pFindBlock = pFindBlock->NextBlock();
+  }
+  pPriorBlock->iBlockSize = sizeBlock;
+  pChunk->iFreeSize += sizeFree;
+  if (pChunk->iFreeSize == pChunk->iChunkSize) {
+    if (pPriorChunk == NULL) {
+      m_pChunk = pChunk->pNextChunk;
+    } else {
+      pPriorChunk->pNextChunk = pChunk->pNextChunk;
+    }
+    FX_Free(pChunk);
+  }
+}
+size_t CFX_DynamicStore::SetDefChunkSize(size_t size) {
+  FXSYS_assert(size != 0);
+  size_t v = m_iDefChunkSize;
+  m_iDefChunkSize = size;
+  return v;
+}
diff --git a/xfa/fgas/crt/fgas_memory.h b/xfa/fgas/crt/fgas_memory.h
new file mode 100644
index 0000000..a9c5cc9
--- /dev/null
+++ b/xfa/fgas/crt/fgas_memory.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_MEMORY_H_
+#define XFA_FGAS_CRT_FGAS_MEMORY_H_
+
+#include "core/include/fxcrt/fx_memory.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class IFX_MEMAllocator;
+class CFX_Target;
+enum FX_ALLOCTYPE {
+  FX_ALLOCTYPE_Default = 0,
+  FX_ALLOCTYPE_Static,
+  FX_ALLOCTYPE_Fixed,
+  FX_ALLOCTYPE_Dynamic,
+};
+
+class IFX_MEMAllocator {
+ public:
+  virtual ~IFX_MEMAllocator() {}
+  virtual void Release() = 0;
+  virtual void* Alloc(size_t size) = 0;
+  virtual void Free(void* pBlock) = 0;
+  virtual size_t GetBlockSize() const = 0;
+  virtual size_t GetDefChunkSize() const = 0;
+  virtual size_t SetDefChunkSize(size_t size) = 0;
+  virtual size_t GetCurrentDataSize() const = 0;
+};
+
+IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType,
+                                     size_t chunkSize,
+                                     size_t blockSize);
+class CFX_Target {
+ public:
+  virtual ~CFX_Target() {}
+  void* operator new(size_t size) { return FX_Alloc(uint8_t, size); }
+  void operator delete(void* p) { FX_Free(p); }
+  void* operator new(size_t size, IFX_MEMAllocator* pAllocator) {
+    return pAllocator->Alloc(size);
+  }
+  void operator delete(void* p, IFX_MEMAllocator* pAllocator) {
+    pAllocator->Free(p);
+  }
+  void* operator new(size_t size, void* place) { return place; }
+  void operator delete(void* p, void* place) {}
+};
+
+#define FXTARGET_NewWith(__allocator__) new (__allocator__)
+#define FXTARGET_DeleteWith(__class__, __allocator__, pointer) \
+  {                                                            \
+    (pointer)->~__class__();                                   \
+    (pointer)->operator delete((pointer), (__allocator__));    \
+  }
+
+#endif  // XFA_FGAS_CRT_FGAS_MEMORY_H_
diff --git a/xfa/fgas/crt/fgas_stream.cpp b/xfa/fgas/crt/fgas_stream.cpp
new file mode 100644
index 0000000..6f082dd
--- /dev/null
+++ b/xfa/fgas/crt/fgas_stream.cpp
@@ -0,0 +1,1626 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_stream.h"
+
+#include <algorithm>
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_system.h"
+
+namespace {
+
+class CFX_StreamImp {
+ public:
+  virtual void Release() { delete this; }
+  virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
+  virtual int32_t GetLength() const = 0;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0;
+  virtual int32_t GetPosition() = 0;
+  virtual FX_BOOL IsEOF() const = 0;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0;
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS) = 0;
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0;
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0;
+  virtual void Flush() = 0;
+  virtual FX_BOOL SetLength(int32_t iLength) = 0;
+
+ protected:
+  CFX_StreamImp();
+  virtual ~CFX_StreamImp() {}
+  FX_DWORD m_dwAccess;
+};
+
+class CFX_FileStreamImp : public CFX_StreamImp {
+ public:
+  CFX_FileStreamImp();
+  virtual ~CFX_FileStreamImp();
+  FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition();
+  virtual FX_BOOL IsEOF() const;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
+  virtual void Flush();
+  virtual FX_BOOL SetLength(int32_t iLength);
+
+ protected:
+  FXSYS_FILE* m_hFile;
+  int32_t m_iLength;
+};
+
+class CFX_BufferStreamImp : public CFX_StreamImp {
+ public:
+  CFX_BufferStreamImp();
+  virtual ~CFX_BufferStreamImp() {}
+  FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition();
+  virtual FX_BOOL IsEOF() const;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
+  virtual void Flush() {}
+  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+
+ protected:
+  uint8_t* m_pData;
+  int32_t m_iTotalSize;
+  int32_t m_iPosition;
+  int32_t m_iLength;
+};
+
+class CFX_FileReadStreamImp : public CFX_StreamImp {
+ public:
+  CFX_FileReadStreamImp();
+  virtual ~CFX_FileReadStreamImp() {}
+  FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition() { return m_iPosition; }
+  virtual FX_BOOL IsEOF() const;
+
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
+    return 0;
+  }
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+    return 0;
+  }
+  virtual void Flush() {}
+  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+
+ protected:
+  IFX_FileRead* m_pFileRead;
+  int32_t m_iPosition;
+  int32_t m_iLength;
+};
+
+class CFX_BufferReadStreamImp : public CFX_StreamImp {
+ public:
+  CFX_BufferReadStreamImp();
+  ~CFX_BufferReadStreamImp();
+  FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
+                         int32_t iFileSize,
+                         FX_DWORD dwAccess,
+                         FX_BOOL bReleaseBufferRead);
+
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition() { return m_iPosition; }
+  virtual FX_BOOL IsEOF() const;
+
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
+    return 0;
+  }
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+    return 0;
+  }
+  virtual void Flush() {}
+  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+
+ private:
+  IFX_BufferRead* m_pBufferRead;
+  FX_BOOL m_bReleaseBufferRead;
+  int32_t m_iPosition;
+  int32_t m_iBufferSize;
+};
+
+class CFX_FileWriteStreamImp : public CFX_StreamImp {
+ public:
+  CFX_FileWriteStreamImp();
+  virtual ~CFX_FileWriteStreamImp() {}
+  FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition() { return m_iPosition; }
+  virtual FX_BOOL IsEOF() const;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS) {
+    return 0;
+  }
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
+  virtual void Flush();
+  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+
+ protected:
+  IFX_FileWrite* m_pFileWrite;
+  int32_t m_iPosition;
+};
+
+enum FX_STREAMTYPE {
+  FX_SREAMTYPE_Unknown = 0,
+  FX_STREAMTYPE_File,
+  FX_STREAMTYPE_Buffer,
+  FX_STREAMTYPE_Stream,
+  FX_STREAMTYPE_BufferRead,
+};
+
+class CFX_Stream : public IFX_Stream {
+ public:
+  CFX_Stream();
+  ~CFX_Stream();
+  FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
+  FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
+  FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
+  FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
+  FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
+                         int32_t iFileSize,
+                         FX_DWORD dwAccess,
+                         FX_BOOL bReleaseBufferRead);
+  virtual void Release();
+  virtual IFX_Stream* Retain();
+  virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition();
+  virtual FX_BOOL IsEOF() const;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS,
+                             int32_t const* pByteSize = NULL);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
+  virtual void Flush();
+  virtual FX_BOOL SetLength(int32_t iLength);
+  virtual int32_t GetBOM(uint8_t bom[4]) const;
+  virtual FX_WORD GetCodePage() const;
+  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
+  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
+                                         int32_t iOffset,
+                                         int32_t iLength);
+
+ protected:
+  FX_STREAMTYPE m_eStreamType;
+  CFX_StreamImp* m_pStreamImp;
+  FX_DWORD m_dwAccess;
+  int32_t m_iTotalSize;
+  int32_t m_iPosition;
+  int32_t m_iStart;
+  int32_t m_iLength;
+  int32_t m_iRefCount;
+};
+
+class CFX_TextStream : public IFX_Stream {
+ public:
+  CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream);
+  ~CFX_TextStream();
+  virtual void Release();
+  virtual IFX_Stream* Retain();
+
+  virtual FX_DWORD GetAccessModes() const;
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition();
+  virtual FX_BOOL IsEOF() const;
+
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS,
+                             int32_t const* pByteSize = NULL);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
+  virtual void Flush();
+  virtual FX_BOOL SetLength(int32_t iLength);
+
+  virtual int32_t GetBOM(uint8_t bom[4]) const;
+  virtual FX_WORD GetCodePage() const;
+  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
+
+  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
+                                         int32_t iOffset,
+                                         int32_t iLength);
+
+ protected:
+  FX_WORD m_wCodePage;
+  int32_t m_wBOMLength;
+  FX_DWORD m_dwBOM;
+  uint8_t* m_pBuf;
+  int32_t m_iBufSize;
+  FX_BOOL m_bDelStream;
+  IFX_Stream* m_pStreamImp;
+  int32_t m_iRefCount;
+  void InitStream();
+};
+
+class CFGAS_FileRead : public IFX_FileRead {
+ public:
+  CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream);
+  virtual ~CFGAS_FileRead();
+  virtual void Release() { delete this; }
+  virtual FX_FILESIZE GetSize();
+  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ protected:
+  FX_BOOL m_bReleaseStream;
+  IFX_Stream* m_pStream;
+};
+
+class CFX_BufferAccImp : public IFX_FileRead {
+ public:
+  CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
+                   FX_FILESIZE iFileSize,
+                   FX_BOOL bReleaseStream);
+  virtual ~CFX_BufferAccImp();
+  virtual void Release() { delete this; }
+  virtual FX_FILESIZE GetSize();
+  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ protected:
+  IFX_BufferRead* m_pBufferRead;
+  FX_BOOL m_bReleaseStream;
+  FX_FILESIZE m_iBufSize;
+};
+
+class CFGAS_FileWrite : public IFX_FileWrite {
+ public:
+  CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream);
+  virtual ~CFGAS_FileWrite();
+  virtual void Release() { delete this; }
+  virtual FX_FILESIZE GetSize();
+  virtual FX_BOOL Flush();
+  virtual FX_BOOL WriteBlock(const void* pData, size_t size);
+  virtual FX_BOOL WriteBlock(const void* pData,
+                             FX_FILESIZE offset,
+                             size_t size);
+
+ protected:
+  IFX_Stream* m_pStream;
+  FX_BOOL m_bReleaseStream;
+};
+
+}  // namespace
+
+IFX_Stream* IFX_Stream::CreateStream(IFX_BufferRead* pBufferRead,
+                                     FX_DWORD dwAccess,
+                                     int32_t iFileSize,
+                                     FX_BOOL bReleaseBufferRead) {
+  CFX_Stream* pSR = new CFX_Stream;
+  if (!pSR->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
+                           bReleaseBufferRead)) {
+    pSR->Release();
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+IFX_Stream* IFX_Stream::CreateStream(IFX_FileRead* pFileRead,
+                                     FX_DWORD dwAccess) {
+  CFX_Stream* pSR = new CFX_Stream;
+  if (!pSR->LoadFileRead(pFileRead, dwAccess)) {
+    pSR->Release();
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+IFX_Stream* IFX_Stream::CreateStream(IFX_FileWrite* pFileWrite,
+                                     FX_DWORD dwAccess) {
+  CFX_Stream* pSR = new CFX_Stream;
+  if (!pSR->LoadFileWrite(pFileWrite, dwAccess)) {
+    pSR->Release();
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+IFX_Stream* IFX_Stream::CreateStream(const FX_WCHAR* pszFileName,
+                                     FX_DWORD dwAccess) {
+  CFX_Stream* pSR = new CFX_Stream;
+  if (!pSR->LoadFile(pszFileName, dwAccess)) {
+    pSR->Release();
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+IFX_Stream* IFX_Stream::CreateStream(uint8_t* pData,
+                                     int32_t length,
+                                     FX_DWORD dwAccess) {
+  CFX_Stream* pSR = new CFX_Stream;
+  if (!pSR->LoadBuffer(pData, length, dwAccess)) {
+    pSR->Release();
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+
+CFX_StreamImp::CFX_StreamImp() : m_dwAccess(0) {}
+CFX_FileStreamImp::CFX_FileStreamImp()
+    : CFX_StreamImp(), m_hFile(NULL), m_iLength(0) {}
+CFX_FileStreamImp::~CFX_FileStreamImp() {
+  if (m_hFile != NULL) {
+    FXSYS_fclose(m_hFile);
+  }
+}
+FX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
+                                    FX_DWORD dwAccess) {
+  FXSYS_assert(m_hFile == NULL);
+  FXSYS_assert(pszSrcFileName != NULL && FXSYS_wcslen(pszSrcFileName) > 0);
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
+    _FX_OS_ == _FX_WIN64_
+  CFX_WideString wsMode;
+  if (dwAccess & FX_STREAMACCESS_Write) {
+    if (dwAccess & FX_STREAMACCESS_Append) {
+      wsMode = L"a+b";
+    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
+      wsMode = L"w+b";
+    } else {
+      wsMode = L"r+b";
+    }
+  } else {
+    wsMode = L"rb";
+  }
+  m_hFile = FXSYS_wfopen(pszSrcFileName, wsMode);
+
+  if (!m_hFile) {
+    if (dwAccess & FX_STREAMACCESS_Write) {
+      if (dwAccess & FX_STREAMACCESS_Create)
+        m_hFile = FXSYS_wfopen(pszSrcFileName, L"w+b");
+
+      if (!m_hFile) {
+        m_hFile = FXSYS_wfopen(pszSrcFileName, L"r+b");
+        if (!m_hFile)
+          return FALSE;
+
+        if (dwAccess & FX_STREAMACCESS_Truncate)
+          FX_fsetsize(m_hFile, 0);
+      }
+    } else {
+      return FALSE;
+    }
+  }
+#else
+  CFX_ByteString wsMode;
+  if (dwAccess & FX_STREAMACCESS_Write) {
+    if (dwAccess & FX_STREAMACCESS_Append) {
+      wsMode = "a+b";
+    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
+      wsMode = "w+b";
+    } else {
+      wsMode = "r+b";
+    }
+  } else {
+    wsMode = "rb";
+  }
+  CFX_ByteString szFileName = CFX_ByteString::FromUnicode(pszSrcFileName);
+  m_hFile = FXSYS_fopen(szFileName, wsMode);
+  if (m_hFile == NULL) {
+    if (dwAccess & FX_STREAMACCESS_Write) {
+      if (dwAccess & FX_STREAMACCESS_Create) {
+        m_hFile = FXSYS_fopen(szFileName, "w+b");
+      }
+      if (m_hFile == NULL) {
+        m_hFile = FXSYS_fopen(szFileName, "r+b");
+        if (m_hFile == NULL) {
+          return FALSE;
+        }
+        if (dwAccess & FX_STREAMACCESS_Truncate) {
+          FX_fsetsize(m_hFile, 0);
+        }
+      }
+    } else {
+      return FALSE;
+    }
+  }
+#endif
+  m_dwAccess = dwAccess;
+  if ((dwAccess & (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) ==
+      (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) {
+    m_iLength = 0;
+  } else {
+    m_iLength = FX_filelength(m_hFile);
+  }
+  return TRUE;
+}
+int32_t CFX_FileStreamImp::GetLength() const {
+  FXSYS_assert(m_hFile != NULL);
+  return m_iLength;
+}
+int32_t CFX_FileStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  FXSYS_assert(m_hFile != NULL);
+  FXSYS_fseek(m_hFile, iOffset, eSeek);
+  return FXSYS_ftell(m_hFile);
+}
+int32_t CFX_FileStreamImp::GetPosition() {
+  FXSYS_assert(m_hFile != NULL);
+  return FXSYS_ftell(m_hFile);
+}
+FX_BOOL CFX_FileStreamImp::IsEOF() const {
+  FXSYS_assert(m_hFile != NULL);
+  return FXSYS_ftell(m_hFile) >= m_iLength;
+}
+int32_t CFX_FileStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  FXSYS_assert(m_hFile != NULL);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  return FXSYS_fread(pBuffer, 1, iBufferSize, m_hFile);
+}
+int32_t CFX_FileStreamImp::ReadString(FX_WCHAR* pStr,
+                                      int32_t iMaxLength,
+                                      FX_BOOL& bEOS) {
+  FXSYS_assert(m_hFile != NULL);
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  if (m_iLength <= 0) {
+    return 0;
+  }
+  int32_t iPosition = FXSYS_ftell(m_hFile);
+  int32_t iLen = std::min((m_iLength - iPosition) / 2, iMaxLength);
+  if (iLen <= 0) {
+    return 0;
+  }
+  iLen = FXSYS_fread(pStr, 2, iLen, m_hFile);
+  int32_t iCount = 0;
+  while (*pStr != L'\0' && iCount < iLen) {
+    pStr++, iCount++;
+  }
+  iPosition += iCount * 2;
+  if (FXSYS_ftell(m_hFile) != iPosition) {
+    FXSYS_fseek(m_hFile, iPosition, 0);
+  }
+  bEOS = (iPosition >= m_iLength);
+  return iCount;
+}
+int32_t CFX_FileStreamImp::WriteData(const uint8_t* pBuffer,
+                                     int32_t iBufferSize) {
+  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  int32_t iRet = FXSYS_fwrite(pBuffer, 1, iBufferSize, m_hFile);
+  if (iRet != 0) {
+    int32_t iPos = FXSYS_ftell(m_hFile);
+    if (iPos > m_iLength) {
+      m_iLength = iPos;
+    }
+  }
+  return iRet;
+}
+int32_t CFX_FileStreamImp::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FXSYS_assert(pStr != NULL && iLength > 0);
+  int32_t iRet = FXSYS_fwrite(pStr, 2, iLength, m_hFile);
+  if (iRet != 0) {
+    int32_t iPos = FXSYS_ftell(m_hFile);
+    if (iPos > m_iLength) {
+      m_iLength = iPos;
+    }
+  }
+  return iRet;
+}
+void CFX_FileStreamImp::Flush() {
+  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FXSYS_fflush(m_hFile);
+}
+FX_BOOL CFX_FileStreamImp::SetLength(int32_t iLength) {
+  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FX_BOOL bRet = FX_fsetsize(m_hFile, iLength);
+  m_iLength = FX_filelength(m_hFile);
+  return bRet;
+}
+CFX_FileReadStreamImp::CFX_FileReadStreamImp()
+    : m_pFileRead(NULL), m_iPosition(0), m_iLength(0) {}
+FX_BOOL CFX_FileReadStreamImp::LoadFileRead(IFX_FileRead* pFileRead,
+                                            FX_DWORD dwAccess) {
+  FXSYS_assert(m_pFileRead == NULL && pFileRead != NULL);
+  if (dwAccess & FX_STREAMACCESS_Write) {
+    return FALSE;
+  }
+  m_pFileRead = pFileRead;
+  m_iLength = m_pFileRead->GetSize();
+  return TRUE;
+}
+int32_t CFX_FileReadStreamImp::GetLength() const {
+  return m_iLength;
+}
+int32_t CFX_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  switch (eSeek) {
+    case FX_STREAMSEEK_Begin:
+      m_iPosition = iOffset;
+      break;
+    case FX_STREAMSEEK_Current:
+      m_iPosition += iOffset;
+      break;
+    case FX_STREAMSEEK_End:
+      m_iPosition = m_iLength + iOffset;
+      break;
+  }
+  if (m_iPosition < 0) {
+    m_iPosition = 0;
+  } else if (m_iPosition >= m_iLength) {
+    m_iPosition = m_iLength;
+  }
+  return m_iPosition;
+}
+FX_BOOL CFX_FileReadStreamImp::IsEOF() const {
+  return m_iPosition >= m_iLength;
+}
+int32_t CFX_FileReadStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  FXSYS_assert(m_pFileRead != NULL);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  if (iBufferSize > m_iLength - m_iPosition) {
+    iBufferSize = m_iLength - m_iPosition;
+  }
+  if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) {
+    m_iPosition += iBufferSize;
+    return iBufferSize;
+  }
+  return 0;
+}
+int32_t CFX_FileReadStreamImp::ReadString(FX_WCHAR* pStr,
+                                          int32_t iMaxLength,
+                                          FX_BOOL& bEOS) {
+  FXSYS_assert(m_pFileRead != NULL);
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
+  if (iMaxLength <= 0) {
+    return 0;
+  }
+  int32_t i = 0;
+  while (i < iMaxLength && pStr[i] != L'\0') {
+    ++i;
+  }
+  bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0';
+  return i;
+}
+CFX_BufferReadStreamImp::CFX_BufferReadStreamImp()
+    : m_pBufferRead(NULL),
+      m_bReleaseBufferRead(FALSE),
+      m_iPosition(0),
+      m_iBufferSize(0) {}
+CFX_BufferReadStreamImp::~CFX_BufferReadStreamImp() {
+  if (m_bReleaseBufferRead && m_pBufferRead != NULL) {
+    m_pBufferRead->Release();
+  }
+}
+FX_BOOL CFX_BufferReadStreamImp::LoadBufferRead(IFX_BufferRead* pBufferRead,
+                                                int32_t iFileSize,
+                                                FX_DWORD dwAccess,
+                                                FX_BOOL bReleaseBufferRead) {
+  FXSYS_assert(m_pBufferRead == NULL && pBufferRead != NULL);
+  if (dwAccess & FX_STREAMACCESS_Write) {
+    return FALSE;
+  }
+  m_bReleaseBufferRead = bReleaseBufferRead;
+  m_pBufferRead = pBufferRead;
+  m_iBufferSize = iFileSize;
+  if (m_iBufferSize >= 0) {
+    return TRUE;
+  }
+  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
+    return FALSE;
+  }
+  m_iBufferSize = m_pBufferRead->GetBlockSize();
+  while (!m_pBufferRead->IsEOF()) {
+    m_pBufferRead->ReadNextBlock(FALSE);
+    m_iBufferSize += m_pBufferRead->GetBlockSize();
+  }
+  return TRUE;
+}
+int32_t CFX_BufferReadStreamImp::GetLength() const {
+  return m_iBufferSize;
+}
+int32_t CFX_BufferReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  int32_t iLength = GetLength();
+  switch (eSeek) {
+    case FX_STREAMSEEK_Begin:
+      m_iPosition = iOffset;
+      break;
+    case FX_STREAMSEEK_Current:
+      m_iPosition += iOffset;
+      break;
+    case FX_STREAMSEEK_End:
+      m_iPosition = iLength + iOffset;
+      break;
+  }
+  if (m_iPosition < 0) {
+    m_iPosition = 0;
+  } else if (m_iPosition >= iLength) {
+    m_iPosition = iLength;
+  }
+  return m_iPosition;
+}
+FX_BOOL CFX_BufferReadStreamImp::IsEOF() const {
+  return m_pBufferRead ? m_pBufferRead->IsEOF() : TRUE;
+}
+int32_t CFX_BufferReadStreamImp::ReadData(uint8_t* pBuffer,
+                                          int32_t iBufferSize) {
+  FXSYS_assert(m_pBufferRead != NULL);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  int32_t iLength = GetLength();
+  if (m_iPosition >= iLength) {
+    return 0;
+  }
+  if (iBufferSize > iLength - m_iPosition) {
+    iBufferSize = iLength - m_iPosition;
+  }
+  FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset();
+  FX_DWORD dwBlockSize = m_pBufferRead->GetBlockSize();
+  if (m_iPosition < (int32_t)dwBlockOffset) {
+    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
+      return 0;
+    }
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+  }
+  while (m_iPosition < (int32_t)dwBlockOffset ||
+         m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
+    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
+      break;
+    }
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+  }
+  if (m_iPosition < (int32_t)dwBlockOffset ||
+      m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
+    return 0;
+  }
+  const uint8_t* pBufferTmp = m_pBufferRead->GetBlockBuffer();
+  FX_DWORD dwOffsetTmp = m_iPosition - dwBlockOffset;
+  FX_DWORD dwCopySize =
+      std::min(iBufferSize, (int32_t)(dwBlockSize - dwOffsetTmp));
+  FXSYS_memcpy(pBuffer, pBufferTmp + dwOffsetTmp, dwCopySize);
+  dwOffsetTmp = dwCopySize;
+  iBufferSize -= dwCopySize;
+  while (iBufferSize > 0) {
+    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
+      break;
+    }
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+    pBufferTmp = m_pBufferRead->GetBlockBuffer();
+    dwCopySize = std::min((FX_DWORD)iBufferSize, dwBlockSize);
+    FXSYS_memcpy(pBuffer + dwOffsetTmp, pBufferTmp, dwCopySize);
+    dwOffsetTmp += dwCopySize;
+    iBufferSize -= dwCopySize;
+  }
+  m_iPosition += dwOffsetTmp;
+  return dwOffsetTmp;
+}
+int32_t CFX_BufferReadStreamImp::ReadString(FX_WCHAR* pStr,
+                                            int32_t iMaxLength,
+                                            FX_BOOL& bEOS) {
+  FXSYS_assert(m_pBufferRead != NULL);
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
+  if (iMaxLength <= 0) {
+    return 0;
+  }
+  int32_t i = 0;
+  while (i < iMaxLength && pStr[i] != L'\0') {
+    ++i;
+  }
+  bEOS = (m_iPosition >= GetLength()) || pStr[i] == L'\0';
+  return i;
+}
+CFX_FileWriteStreamImp::CFX_FileWriteStreamImp()
+    : m_pFileWrite(NULL), m_iPosition(0) {}
+FX_BOOL CFX_FileWriteStreamImp::LoadFileWrite(IFX_FileWrite* pFileWrite,
+                                              FX_DWORD dwAccess) {
+  FXSYS_assert(m_pFileWrite == NULL && pFileWrite != NULL);
+  if (dwAccess & FX_STREAMACCESS_Read) {
+    return FALSE;
+  }
+  if (dwAccess & FX_STREAMACCESS_Append) {
+    m_iPosition = pFileWrite->GetSize();
+  }
+  m_pFileWrite = pFileWrite;
+  return TRUE;
+}
+int32_t CFX_FileWriteStreamImp::GetLength() const {
+  if (!m_pFileWrite) {
+    return 0;
+  }
+  return (int32_t)m_pFileWrite->GetSize();
+}
+int32_t CFX_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  int32_t iLength = GetLength();
+  switch (eSeek) {
+    case FX_STREAMSEEK_Begin:
+      m_iPosition = iOffset;
+      break;
+    case FX_STREAMSEEK_Current:
+      m_iPosition += iOffset;
+      break;
+    case FX_STREAMSEEK_End:
+      m_iPosition = iLength + iOffset;
+      break;
+  }
+  if (m_iPosition < 0) {
+    m_iPosition = 0;
+  } else if (m_iPosition >= iLength) {
+    m_iPosition = iLength;
+  }
+  return m_iPosition;
+}
+FX_BOOL CFX_FileWriteStreamImp::IsEOF() const {
+  return m_iPosition >= GetLength();
+}
+int32_t CFX_FileWriteStreamImp::WriteData(const uint8_t* pBuffer,
+                                          int32_t iBufferSize) {
+  if (!m_pFileWrite) {
+    return 0;
+  }
+  if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) {
+    m_iPosition += iBufferSize;
+  }
+  return iBufferSize;
+}
+int32_t CFX_FileWriteStreamImp::WriteString(const FX_WCHAR* pStr,
+                                            int32_t iLength) {
+  return WriteData((const uint8_t*)pStr, iLength * sizeof(FX_WCHAR));
+}
+void CFX_FileWriteStreamImp::Flush() {
+  if (m_pFileWrite) {
+    m_pFileWrite->Flush();
+  }
+}
+CFX_BufferStreamImp::CFX_BufferStreamImp()
+    : CFX_StreamImp(),
+      m_pData(NULL),
+      m_iTotalSize(0),
+      m_iPosition(0),
+      m_iLength(0) {}
+FX_BOOL CFX_BufferStreamImp::LoadBuffer(uint8_t* pData,
+                                        int32_t iTotalSize,
+                                        FX_DWORD dwAccess) {
+  FXSYS_assert(m_pData == NULL);
+  FXSYS_assert(pData != NULL && iTotalSize > 0);
+  m_dwAccess = dwAccess;
+  m_pData = pData;
+  m_iTotalSize = iTotalSize;
+  m_iPosition = 0;
+  m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iTotalSize;
+  return TRUE;
+}
+int32_t CFX_BufferStreamImp::GetLength() const {
+  FXSYS_assert(m_pData != NULL);
+  return m_iLength;
+}
+int32_t CFX_BufferStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  FXSYS_assert(m_pData != NULL);
+  if (eSeek == FX_STREAMSEEK_Begin) {
+    m_iPosition = iOffset;
+  } else if (eSeek == FX_STREAMSEEK_Current) {
+    m_iPosition += iOffset;
+  } else if (eSeek == FX_STREAMSEEK_End) {
+    m_iPosition = m_iLength + iOffset;
+  }
+  if (m_iPosition > m_iLength) {
+    m_iPosition = m_iLength;
+  }
+  if (m_iPosition < 0) {
+    m_iPosition = 0;
+  }
+  return m_iPosition;
+}
+int32_t CFX_BufferStreamImp::GetPosition() {
+  FXSYS_assert(m_pData != NULL);
+  return m_iPosition;
+}
+FX_BOOL CFX_BufferStreamImp::IsEOF() const {
+  FXSYS_assert(m_pData != NULL);
+  return m_iPosition >= m_iLength;
+}
+int32_t CFX_BufferStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  FXSYS_assert(m_pData != NULL);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  int32_t iLen = std::min(m_iLength - m_iPosition, iBufferSize);
+  if (iLen <= 0) {
+    return 0;
+  }
+  FXSYS_memcpy(pBuffer, m_pData + m_iPosition, iLen);
+  m_iPosition += iLen;
+  return iLen;
+}
+int32_t CFX_BufferStreamImp::ReadString(FX_WCHAR* pStr,
+                                        int32_t iMaxLength,
+                                        FX_BOOL& bEOS) {
+  FXSYS_assert(m_pData != NULL);
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  int32_t iLen = std::min((m_iLength - m_iPosition) / 2, iMaxLength);
+  if (iLen <= 0) {
+    return 0;
+  }
+  const FX_WCHAR* pSrc = (const FX_WCHAR*)(FX_CHAR*)(m_pData + m_iPosition);
+  int32_t iCount = 0;
+  while (*pSrc != L'\0' && iCount < iLen) {
+    *pStr++ = *pSrc++, iCount++;
+  }
+  m_iPosition += iCount * 2;
+  bEOS = (*pSrc == L'\0') || (m_iPosition >= m_iLength);
+  return iCount;
+}
+int32_t CFX_BufferStreamImp::WriteData(const uint8_t* pBuffer,
+                                       int32_t iBufferSize) {
+  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  int32_t iLen = std::min(m_iTotalSize - m_iPosition, iBufferSize);
+  if (iLen <= 0) {
+    return 0;
+  }
+  FXSYS_memcpy(m_pData + m_iPosition, pBuffer, iLen);
+  m_iPosition += iLen;
+  if (m_iPosition > m_iLength) {
+    m_iLength = m_iPosition;
+  }
+  return iLen;
+}
+int32_t CFX_BufferStreamImp::WriteString(const FX_WCHAR* pStr,
+                                         int32_t iLength) {
+  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
+  FXSYS_assert(pStr != NULL && iLength > 0);
+  int32_t iLen = std::min((m_iTotalSize - m_iPosition) / 2, iLength);
+  if (iLen <= 0) {
+    return 0;
+  }
+  FXSYS_memcpy(m_pData + m_iPosition, pStr, iLen * 2);
+  m_iPosition += iLen * 2;
+  if (m_iPosition > m_iLength) {
+    m_iLength = m_iPosition;
+  }
+  return iLen;
+}
+IFX_Stream* IFX_Stream::CreateTextStream(IFX_Stream* pBaseStream,
+                                         FX_BOOL bDeleteOnRelease) {
+  FXSYS_assert(pBaseStream != NULL);
+  return new CFX_TextStream(pBaseStream, bDeleteOnRelease);
+}
+CFX_TextStream::CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream)
+    : m_wCodePage(FX_CODEPAGE_DefANSI),
+      m_wBOMLength(0),
+      m_dwBOM(0),
+      m_pBuf(NULL),
+      m_iBufSize(0),
+      m_bDelStream(bDelStream),
+      m_pStreamImp(pStream),
+      m_iRefCount(1) {
+  FXSYS_assert(m_pStreamImp != NULL);
+  m_pStreamImp->Retain();
+  InitStream();
+}
+CFX_TextStream::~CFX_TextStream() {
+  m_pStreamImp->Release();
+  if (m_bDelStream) {
+    m_pStreamImp->Release();
+  }
+  if (m_pBuf != NULL) {
+    FX_Free(m_pBuf);
+  }
+}
+void CFX_TextStream::InitStream() {
+  int32_t iPosition = m_pStreamImp->GetPosition();
+  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0);
+  m_pStreamImp->ReadData((uint8_t*)&m_dwBOM, 3);
+#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
+  m_dwBOM &= 0x00FFFFFF;
+  if (m_dwBOM == 0x00BFBBEF) {
+    m_wBOMLength = 3;
+    m_wCodePage = FX_CODEPAGE_UTF8;
+  } else {
+    m_dwBOM &= 0x0000FFFF;
+    if (m_dwBOM == 0x0000FFFE) {
+      m_wBOMLength = 2;
+      m_wCodePage = FX_CODEPAGE_UTF16BE;
+    } else if (m_dwBOM == 0x0000FEFF) {
+      m_wBOMLength = 2;
+      m_wCodePage = FX_CODEPAGE_UTF16LE;
+    } else {
+      m_wBOMLength = 0;
+      m_dwBOM = 0;
+      m_wCodePage = FXSYS_GetACP();
+    }
+  }
+#else
+  m_dwBOM &= 0xFFFFFF00;
+  if (m_dwBOM == 0xEFBBBF00) {
+    m_wBOMLength = 3;
+    m_wCodePage = FX_CODEPAGE_UTF8;
+  } else {
+    m_dwBOM &= 0xFFFF0000;
+    if (m_dwBOM == 0xFEFF0000) {
+      m_wBOMLength = 2;
+      m_wCodePage = FX_CODEPAGE_UTF16BE;
+    } else if (m_dwBOM == 0xFFFE0000) {
+      m_wBOMLength = 2;
+      m_wCodePage = FX_CODEPAGE_UTF16LE;
+    } else {
+      m_wBOMLength = 0;
+      m_dwBOM = 0;
+      m_wCodePage = FXSYS_GetACP();
+    }
+  }
+#endif
+  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition));
+}
+void CFX_TextStream::Release() {
+  if (--m_iRefCount < 1) {
+    delete this;
+  }
+}
+IFX_Stream* CFX_TextStream::Retain() {
+  m_iRefCount++;
+  return this;
+}
+FX_DWORD CFX_TextStream::GetAccessModes() const {
+  return m_pStreamImp->GetAccessModes() | FX_STREAMACCESS_Text;
+}
+int32_t CFX_TextStream::GetLength() const {
+  return m_pStreamImp->GetLength();
+}
+int32_t CFX_TextStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  return m_pStreamImp->Seek(eSeek, iOffset);
+}
+int32_t CFX_TextStream::GetPosition() {
+  return m_pStreamImp->GetPosition();
+}
+FX_BOOL CFX_TextStream::IsEOF() const {
+  return m_pStreamImp->IsEOF();
+}
+int32_t CFX_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  return m_pStreamImp->ReadData(pBuffer, iBufferSize);
+}
+int32_t CFX_TextStream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
+  return m_pStreamImp->WriteData(pBuffer, iBufferSize);
+}
+void CFX_TextStream::Flush() {
+  m_pStreamImp->Flush();
+}
+FX_BOOL CFX_TextStream::SetLength(int32_t iLength) {
+  return m_pStreamImp->SetLength(iLength);
+}
+FX_WORD CFX_TextStream::GetCodePage() const {
+  return m_wCodePage;
+}
+IFX_Stream* CFX_TextStream::CreateSharedStream(FX_DWORD dwAccess,
+                                               int32_t iOffset,
+                                               int32_t iLength) {
+  IFX_Stream* pSR =
+      m_pStreamImp->CreateSharedStream(dwAccess, iOffset, iLength);
+  if (pSR == NULL) {
+    return NULL;
+  }
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return new CFX_TextStream(pSR, TRUE);
+  }
+  return pSR;
+}
+int32_t CFX_TextStream::GetBOM(uint8_t bom[4]) const {
+  if (m_wBOMLength < 1) {
+    return 0;
+  }
+  *(FX_DWORD*)bom = m_dwBOM;
+  return m_wBOMLength;
+}
+FX_WORD CFX_TextStream::SetCodePage(FX_WORD wCodePage) {
+  if (m_wBOMLength > 0) {
+    return m_wCodePage;
+  }
+  FX_WORD v = m_wCodePage;
+  m_wCodePage = wCodePage;
+  return v;
+}
+int32_t CFX_TextStream::ReadString(FX_WCHAR* pStr,
+                                   int32_t iMaxLength,
+                                   FX_BOOL& bEOS,
+                                   int32_t const* pByteSize) {
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  int32_t iLen;
+  if (m_wCodePage == FX_CODEPAGE_UTF16LE ||
+      m_wCodePage == FX_CODEPAGE_UTF16BE) {
+    int32_t iBytes = pByteSize == NULL ? iMaxLength * 2 : *pByteSize;
+    iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes);
+    iMaxLength = iLen / 2;
+    if (sizeof(FX_WCHAR) > 2) {
+      FX_UTF16ToWChar(pStr, iMaxLength);
+    }
+#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_
+    if (m_wCodePage == FX_CODEPAGE_UTF16LE) {
+      FX_SwapByteOrder(pStr, iMaxLength);
+    }
+#else
+    if (m_wCodePage == FX_CODEPAGE_UTF16BE) {
+      FX_SwapByteOrder(pStr, iMaxLength);
+    }
+#endif
+  } else {
+    int32_t pos = m_pStreamImp->GetPosition();
+    int32_t iBytes = pByteSize == NULL ? iMaxLength : *pByteSize;
+    iBytes = std::min(iBytes, m_pStreamImp->GetLength() - pos);
+    if (iBytes > 0) {
+      if (m_pBuf == NULL) {
+        m_pBuf = FX_Alloc(uint8_t, iBytes);
+        m_iBufSize = iBytes;
+      } else if (iBytes > m_iBufSize) {
+        m_pBuf = FX_Realloc(uint8_t, m_pBuf, iBytes);
+        m_iBufSize = iBytes;
+      }
+      iLen = m_pStreamImp->ReadData(m_pBuf, iBytes);
+      int32_t iSrc = iLen;
+      int32_t iDecode = FX_DecodeString(m_wCodePage, (const FX_CHAR*)m_pBuf,
+                                        &iSrc, pStr, &iMaxLength, TRUE);
+      m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen);
+      if (iDecode < 1) {
+        return -1;
+      }
+    } else {
+      iMaxLength = 0;
+    }
+  }
+  bEOS = m_pStreamImp->IsEOF();
+  return iMaxLength;
+}
+int32_t CFX_TextStream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+  FXSYS_assert(pStr != NULL && iLength > 0);
+  if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) {
+    return -1;
+  }
+  if (m_wCodePage == FX_CODEPAGE_UTF8) {
+    int32_t len = iLength;
+    CFX_UTF8Encoder encoder;
+    while (len-- > 0) {
+      encoder.Input(*pStr++);
+    }
+    CFX_ByteStringC bsResult = encoder.GetResult();
+    m_pStreamImp->WriteData((const uint8_t*)bsResult.GetCStr(),
+                            bsResult.GetLength());
+  }
+  return iLength;
+}
+CFX_Stream::CFX_Stream()
+    : m_eStreamType(FX_SREAMTYPE_Unknown),
+      m_pStreamImp(NULL),
+      m_dwAccess(0),
+      m_iTotalSize(0),
+      m_iPosition(0),
+      m_iStart(0),
+      m_iLength(0),
+      m_iRefCount(1) {}
+CFX_Stream::~CFX_Stream() {
+  if (m_eStreamType != FX_STREAMTYPE_Stream && m_pStreamImp != NULL) {
+    m_pStreamImp->Release();
+  }
+}
+FX_BOOL CFX_Stream::LoadFile(const FX_WCHAR* pszSrcFileName,
+                             FX_DWORD dwAccess) {
+  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
+    return FALSE;
+  }
+  if (pszSrcFileName == NULL || FXSYS_wcslen(pszSrcFileName) < 1) {
+    return FALSE;
+  }
+  m_pStreamImp = new CFX_FileStreamImp();
+  FX_BOOL bRet =
+      ((CFX_FileStreamImp*)m_pStreamImp)->LoadFile(pszSrcFileName, dwAccess);
+  if (!bRet) {
+    m_pStreamImp->Release();
+    m_pStreamImp = NULL;
+  } else {
+    m_eStreamType = FX_STREAMTYPE_File;
+    m_dwAccess = dwAccess;
+    m_iLength = m_pStreamImp->GetLength();
+  }
+  return bRet;
+}
+FX_BOOL CFX_Stream::LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess) {
+  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
+    return FALSE;
+  }
+  if (pFileRead == NULL) {
+    return FALSE;
+  }
+  m_pStreamImp = new CFX_FileReadStreamImp();
+  FX_BOOL bRet =
+      ((CFX_FileReadStreamImp*)m_pStreamImp)->LoadFileRead(pFileRead, dwAccess);
+  if (!bRet) {
+    m_pStreamImp->Release();
+    m_pStreamImp = NULL;
+  } else {
+    m_eStreamType = FX_STREAMTYPE_File;
+    m_dwAccess = dwAccess;
+    m_iLength = m_pStreamImp->GetLength();
+  }
+  return bRet;
+}
+FX_BOOL CFX_Stream::LoadFileWrite(IFX_FileWrite* pFileWrite,
+                                  FX_DWORD dwAccess) {
+  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
+    return FALSE;
+  }
+  if (pFileWrite == NULL) {
+    return FALSE;
+  }
+  m_pStreamImp = new CFX_FileWriteStreamImp();
+  FX_BOOL bRet = ((CFX_FileWriteStreamImp*)m_pStreamImp)
+                     ->LoadFileWrite(pFileWrite, dwAccess);
+  if (!bRet) {
+    m_pStreamImp->Release();
+    m_pStreamImp = NULL;
+  } else {
+    m_eStreamType = FX_STREAMTYPE_File;
+    m_dwAccess = dwAccess;
+    m_iLength = m_pStreamImp->GetLength();
+  }
+  return bRet;
+}
+FX_BOOL CFX_Stream::LoadBuffer(uint8_t* pData,
+                               int32_t iTotalSize,
+                               FX_DWORD dwAccess) {
+  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
+    return FALSE;
+  }
+  if (pData == NULL || iTotalSize < 1) {
+    return FALSE;
+  }
+  m_pStreamImp = new CFX_BufferStreamImp();
+  FX_BOOL bRet = ((CFX_BufferStreamImp*)m_pStreamImp)
+                     ->LoadBuffer(pData, iTotalSize, dwAccess);
+  if (!bRet) {
+    m_pStreamImp->Release();
+    m_pStreamImp = NULL;
+  } else {
+    m_eStreamType = FX_STREAMTYPE_Buffer;
+    m_dwAccess = dwAccess;
+    m_iLength = m_pStreamImp->GetLength();
+  }
+  return bRet;
+}
+FX_BOOL CFX_Stream::LoadBufferRead(IFX_BufferRead* pBufferRead,
+                                   int32_t iFileSize,
+                                   FX_DWORD dwAccess,
+                                   FX_BOOL bReleaseBufferRead) {
+  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
+    return FALSE;
+  }
+  if (!pBufferRead) {
+    return FALSE;
+  }
+  m_pStreamImp = new CFX_BufferReadStreamImp;
+  FX_BOOL bRet = ((CFX_BufferReadStreamImp*)m_pStreamImp)
+                     ->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
+                                      bReleaseBufferRead);
+  if (!bRet) {
+    m_pStreamImp->Release();
+    m_pStreamImp = NULL;
+  } else {
+    m_eStreamType = FX_STREAMTYPE_BufferRead;
+    m_dwAccess = dwAccess;
+    m_iLength = m_pStreamImp->GetLength();
+  }
+  return bRet;
+}
+void CFX_Stream::Release() {
+  if (--m_iRefCount < 1) {
+    delete this;
+  }
+}
+IFX_Stream* CFX_Stream::Retain() {
+  m_iRefCount++;
+  return this;
+}
+int32_t CFX_Stream::GetLength() const {
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  if (m_eStreamType == FX_STREAMTYPE_File ||
+      m_eStreamType == FX_STREAMTYPE_Buffer) {
+    return m_pStreamImp->GetLength();
+  }
+  return m_iLength;
+}
+int32_t CFX_Stream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  if (m_eStreamType == FX_STREAMTYPE_File ||
+      m_eStreamType == FX_STREAMTYPE_Buffer) {
+    return m_iPosition = m_pStreamImp->Seek(eSeek, iOffset);
+  }
+  int32_t iEnd = m_iStart + m_iLength;
+  int32_t iPosition = m_iStart + iOffset;
+  if (eSeek == FX_STREAMSEEK_Begin) {
+    m_iPosition = iPosition;
+  } else if (eSeek == FX_STREAMSEEK_Current) {
+    m_iPosition += iOffset;
+  } else if (eSeek == FX_STREAMSEEK_End) {
+    m_iPosition = iEnd + iOffset;
+  }
+  if (m_iPosition > iEnd) {
+    m_iPosition = iEnd;
+  }
+  if (m_iPosition < m_iStart) {
+    m_iPosition = m_iStart;
+  }
+  return m_iPosition - m_iStart;
+}
+int32_t CFX_Stream::GetPosition() {
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  if (m_eStreamType == FX_STREAMTYPE_File ||
+      m_eStreamType == FX_STREAMTYPE_Buffer) {
+    return m_iPosition = m_pStreamImp->GetPosition();
+  }
+  return m_iPosition - m_iStart;
+}
+FX_BOOL CFX_Stream::IsEOF() const {
+  if (m_pStreamImp == NULL) {
+    return TRUE;
+  }
+  if (m_eStreamType == FX_STREAMTYPE_File ||
+      m_eStreamType == FX_STREAMTYPE_Buffer) {
+    return m_pStreamImp->IsEOF();
+  }
+  return m_iPosition >= m_iStart + m_iLength;
+}
+int32_t CFX_Stream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  int32_t iLen = std::min(m_iStart + m_iLength - m_iPosition, iBufferSize);
+  if (iLen <= 0) {
+    return 0;
+  }
+  if (m_pStreamImp->GetPosition() != m_iPosition) {
+    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
+  }
+  iLen = m_pStreamImp->ReadData(pBuffer, iLen);
+  m_iPosition = m_pStreamImp->GetPosition();
+  return iLen;
+}
+int32_t CFX_Stream::ReadString(FX_WCHAR* pStr,
+                               int32_t iMaxLength,
+                               FX_BOOL& bEOS,
+                               int32_t const* pByteSize) {
+  FXSYS_assert(pStr != NULL && iMaxLength > 0);
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  int32_t iEnd = m_iStart + m_iLength;
+  int32_t iLen = iEnd - m_iPosition;
+  if (pByteSize != NULL) {
+    iLen = std::min(iLen, *pByteSize);
+  }
+  iLen = std::min(iEnd / 2, iMaxLength);
+  if (iLen <= 0) {
+    return 0;
+  }
+  if (m_pStreamImp->GetPosition() != m_iPosition) {
+    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
+  }
+  iLen = m_pStreamImp->ReadString(pStr, iLen, bEOS);
+  m_iPosition = m_pStreamImp->GetPosition();
+  if (iLen > 0 && m_iPosition >= iEnd) {
+    bEOS = TRUE;
+  }
+  return iLen;
+}
+int32_t CFX_Stream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
+  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
+    return -1;
+  }
+  int32_t iLen = iBufferSize;
+  if (m_eStreamType == FX_STREAMTYPE_Stream) {
+    iLen = std::min(m_iStart + m_iTotalSize - m_iPosition, iBufferSize);
+    if (iLen <= 0) {
+      return 0;
+    }
+  }
+  int32_t iEnd = m_iStart + m_iLength;
+  if (m_pStreamImp->GetPosition() != m_iPosition) {
+    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
+  }
+  iLen = m_pStreamImp->WriteData(pBuffer, iLen);
+  m_iPosition = m_pStreamImp->GetPosition();
+  if (m_iPosition > iEnd) {
+    m_iLength = m_iPosition - m_iStart;
+  }
+  return iLen;
+}
+int32_t CFX_Stream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+  FXSYS_assert(pStr != NULL && iLength > 0);
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
+    return -1;
+  }
+  int32_t iLen = iLength;
+  if (m_eStreamType == FX_STREAMTYPE_Stream) {
+    iLen = std::min((m_iStart + m_iTotalSize - m_iPosition) / 2, iLength);
+    if (iLen <= 0) {
+      return 0;
+    }
+  }
+  int32_t iEnd = m_iStart + m_iLength;
+  if (m_pStreamImp->GetPosition() != m_iPosition) {
+    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
+  }
+  iLen = m_pStreamImp->WriteString(pStr, iLen);
+  m_iPosition = m_pStreamImp->GetPosition();
+  if (m_iPosition > iEnd) {
+    m_iLength = m_iPosition - m_iStart;
+  }
+  return iLen;
+}
+void CFX_Stream::Flush() {
+  if (m_pStreamImp == NULL) {
+    return;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
+    return;
+  }
+  m_pStreamImp->Flush();
+}
+FX_BOOL CFX_Stream::SetLength(int32_t iLength) {
+  if (m_pStreamImp == NULL) {
+    return FALSE;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
+    return FALSE;
+  }
+  return m_pStreamImp->SetLength(iLength);
+}
+int32_t CFX_Stream::GetBOM(uint8_t bom[4]) const {
+  if (m_pStreamImp == NULL) {
+    return -1;
+  }
+  return 0;
+}
+FX_WORD CFX_Stream::GetCodePage() const {
+#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
+  return FX_CODEPAGE_UTF16LE;
+#else
+  return FX_CODEPAGE_UTF16BE;
+#endif
+}
+FX_WORD CFX_Stream::SetCodePage(FX_WORD wCodePage) {
+#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
+  return FX_CODEPAGE_UTF16LE;
+#else
+  return FX_CODEPAGE_UTF16BE;
+#endif
+}
+IFX_Stream* CFX_Stream::CreateSharedStream(FX_DWORD dwAccess,
+                                           int32_t iOffset,
+                                           int32_t iLength) {
+  FXSYS_assert(iLength > 0);
+  if (m_pStreamImp == NULL) {
+    return NULL;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Text) != 0 &&
+      (dwAccess & FX_STREAMACCESS_Text) == 0) {
+    return NULL;
+  }
+  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0 &&
+      (dwAccess & FX_STREAMACCESS_Write) != 0) {
+    return NULL;
+  }
+  int32_t iStart = m_iStart + iOffset;
+  int32_t iTotal = m_iStart + m_iLength;
+  if (iStart < m_iStart || iStart >= iTotal) {
+    return NULL;
+  }
+  int32_t iEnd = iStart + iLength;
+  if (iEnd < iStart || iEnd > iTotal) {
+    return NULL;
+  }
+  CFX_Stream* pShared = new CFX_Stream;
+  pShared->m_eStreamType = FX_STREAMTYPE_Stream;
+  pShared->m_pStreamImp = m_pStreamImp;
+  pShared->m_dwAccess = dwAccess;
+  pShared->m_iTotalSize = iLength;
+  pShared->m_iPosition = iStart;
+  pShared->m_iStart = iStart;
+  pShared->m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iLength;
+  if (dwAccess & FX_STREAMACCESS_Text) {
+    return IFX_Stream::CreateTextStream(pShared, TRUE);
+  }
+  return pShared;
+}
+IFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream,
+                                FX_BOOL bReleaseStream) {
+  FXSYS_assert(pBaseStream != NULL);
+  return new CFGAS_FileRead(pBaseStream, bReleaseStream);
+}
+CFGAS_FileRead::CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream)
+    : m_bReleaseStream(bReleaseStream), m_pStream(pStream) {
+  FXSYS_assert(m_pStream != NULL);
+}
+CFGAS_FileRead::~CFGAS_FileRead() {
+  if (m_bReleaseStream) {
+    m_pStream->Release();
+  }
+}
+FX_FILESIZE CFGAS_FileRead::GetSize() {
+  return (FX_FILESIZE)m_pStream->GetLength();
+}
+FX_BOOL CFGAS_FileRead::ReadBlock(void* buffer,
+                                  FX_FILESIZE offset,
+                                  size_t size) {
+  m_pStream->Seek(FX_STREAMSEEK_Begin, (int32_t)offset);
+  int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size);
+  return iLen == (int32_t)size;
+}
+
+IFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
+                                FX_FILESIZE iFileSize,
+                                FX_BOOL bReleaseStream) {
+  if (!pBufferRead) {
+    return NULL;
+  }
+  return new CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream);
+}
+CFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
+                                   FX_FILESIZE iFileSize,
+                                   FX_BOOL bReleaseStream)
+    : m_pBufferRead(pBufferRead),
+      m_bReleaseStream(bReleaseStream),
+      m_iBufSize(iFileSize) {
+  FXSYS_assert(m_pBufferRead);
+}
+CFX_BufferAccImp::~CFX_BufferAccImp() {
+  if (m_bReleaseStream && m_pBufferRead) {
+    m_pBufferRead->Release();
+  }
+}
+FX_FILESIZE CFX_BufferAccImp::GetSize() {
+  if (!m_pBufferRead) {
+    return 0;
+  }
+  if (m_iBufSize >= 0) {
+    return m_iBufSize;
+  }
+  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
+    return 0;
+  }
+  m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize();
+  while (!m_pBufferRead->IsEOF()) {
+    m_pBufferRead->ReadNextBlock(FALSE);
+    m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize();
+  }
+  return m_iBufSize;
+}
+FX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer,
+                                    FX_FILESIZE offset,
+                                    size_t size) {
+  if (!m_pBufferRead) {
+    return FALSE;
+  }
+  if (!buffer || !size) {
+    return TRUE;
+  }
+  FX_FILESIZE dwBufSize = GetSize();
+  if (offset >= dwBufSize) {
+    return FALSE;
+  }
+  size_t dwBlockSize = m_pBufferRead->GetBlockSize();
+  FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset();
+  if (offset < dwBlockOffset) {
+    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
+      return FALSE;
+    }
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+  }
+  while (offset < dwBlockOffset ||
+         offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
+    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
+      break;
+    }
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+  }
+  if (offset < dwBlockOffset ||
+      offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
+    return FALSE;
+  }
+  const uint8_t* pBuffer = m_pBufferRead->GetBlockBuffer();
+  const FX_FILESIZE dwOffset = offset - dwBlockOffset;
+  size_t dwCopySize =
+      std::min(size, static_cast<size_t>(dwBlockSize - dwOffset));
+  FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize);
+  offset = dwCopySize;
+  size -= dwCopySize;
+  while (size) {
+    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
+      break;
+    }
+    dwBlockOffset = m_pBufferRead->GetBlockOffset();
+    dwBlockSize = m_pBufferRead->GetBlockSize();
+    pBuffer = m_pBufferRead->GetBlockBuffer();
+    dwCopySize = std::min(size, dwBlockSize);
+    FXSYS_memcpy(((uint8_t*)buffer) + offset, pBuffer, dwCopySize);
+    offset += dwCopySize;
+    size -= dwCopySize;
+  }
+  return TRUE;
+}
+
+IFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
+                                  FX_BOOL bReleaseStream) {
+  FXSYS_assert(pBaseStream != NULL);
+  return new CFGAS_FileWrite(pBaseStream, bReleaseStream);
+}
+
+CFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream)
+    : m_pStream(pStream), m_bReleaseStream(bReleaseStream) {
+  FXSYS_assert(m_pStream != NULL);
+}
+CFGAS_FileWrite::~CFGAS_FileWrite() {
+  if (m_bReleaseStream) {
+    m_pStream->Release();
+  }
+}
+FX_FILESIZE CFGAS_FileWrite::GetSize() {
+  return m_pStream->GetLength();
+}
+FX_BOOL CFGAS_FileWrite::Flush() {
+  m_pStream->Flush();
+  return TRUE;
+}
+FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) {
+  return m_pStream->WriteData((const uint8_t*)pData, (int32_t)size) ==
+         (int32_t)size;
+}
+FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData,
+                                    FX_FILESIZE offset,
+                                    size_t size) {
+  m_pStream->Seek(FX_STREAMSEEK_Begin, offset);
+  int32_t iLen = m_pStream->WriteData((uint8_t*)pData, (int32_t)size);
+  return iLen == (int32_t)size;
+}
diff --git a/xfa/fgas/crt/fgas_stream.h b/xfa/fgas/crt/fgas_stream.h
new file mode 100644
index 0000000..e083886
--- /dev/null
+++ b/xfa/fgas/crt/fgas_stream.h
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_STREAM_H_
+#define XFA_FGAS_CRT_FGAS_STREAM_H_
+
+#include "core/include/fxcrt/fx_stream.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class IFX_Stream;
+
+IFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream,
+                                FX_BOOL bReleaseStream = FALSE);
+IFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
+                                FX_FILESIZE iFileSize = -1,
+                                FX_BOOL bReleaseStream = TRUE);
+IFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
+                                  FX_BOOL bReleaseStream = FALSE);
+enum FX_STREAMACCESS {
+  FX_STREAMACCESS_Binary = 0x00,
+  FX_STREAMACCESS_Text = 0x01,
+  FX_STREAMACCESS_Read = 0x02,
+  FX_STREAMACCESS_Write = 0x04,
+  FX_STREAMACCESS_Truncate = 0x10,
+  FX_STREAMACCESS_Append = 0x20,
+  FX_STREAMACCESS_Create = 0x80,
+};
+
+enum FX_STREAMSEEK {
+  FX_STREAMSEEK_Begin = 0,
+  FX_STREAMSEEK_Current,
+  FX_STREAMSEEK_End,
+};
+
+class IFX_Stream {
+ public:
+  static IFX_Stream* CreateStream(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
+  static IFX_Stream* CreateStream(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
+  static IFX_Stream* CreateStream(const FX_WCHAR* pszFileName,
+                                  FX_DWORD dwAccess);
+  static IFX_Stream* CreateStream(uint8_t* pData,
+                                  int32_t length,
+                                  FX_DWORD dwAccess);
+  static IFX_Stream* CreateStream(IFX_BufferRead* pBufferRead,
+                                  FX_DWORD dwAccess,
+                                  int32_t iFileSize = -1,
+                                  FX_BOOL bReleaseBufferRead = TRUE);
+  static IFX_Stream* CreateTextStream(IFX_Stream* pBaseStream,
+                                      FX_BOOL bDeleteOnRelease);
+  virtual ~IFX_Stream() {}
+  virtual void Release() = 0;
+  virtual IFX_Stream* Retain() = 0;
+  virtual FX_DWORD GetAccessModes() const = 0;
+  virtual int32_t GetLength() const = 0;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0;
+  virtual int32_t GetPosition() = 0;
+  virtual FX_BOOL IsEOF() const = 0;
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0;
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS,
+                             int32_t const* pByteSize = NULL) = 0;
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0;
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0;
+  virtual void Flush() = 0;
+  virtual FX_BOOL SetLength(int32_t iLength) = 0;
+  virtual int32_t GetBOM(uint8_t bom[4]) const = 0;
+  virtual FX_WORD GetCodePage() const = 0;
+  virtual FX_WORD SetCodePage(FX_WORD wCodePage) = 0;
+  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
+                                         int32_t iOffset,
+                                         int32_t iLength) = 0;
+};
+
+#endif  // XFA_FGAS_CRT_FGAS_STREAM_H_
diff --git a/xfa/fgas/crt/fgas_system.cpp b/xfa/fgas/crt/fgas_system.cpp
new file mode 100644
index 0000000..9d76a60
--- /dev/null
+++ b/xfa/fgas/crt/fgas_system.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_system.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_system.h"
+
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
+    _FX_OS_ == _FX_WIN64_
+#include <io.h>
+#elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_
+#include <sys/times.h>
+#endif
+
+namespace {
+
+inline FX_BOOL FX_isupper(int32_t ch) {
+  return ch >= 'A' && ch <= 'Z';
+}
+
+inline int32_t FX_tolower(int32_t ch) {
+  return FX_isupper(ch) ? (ch + 0x20) : ch;
+}
+
+}  // namespace
+
+int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count) {
+  FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
+  FX_WCHAR wch1 = 0, wch2 = 0;
+  while (count-- > 0) {
+    wch1 = (FX_WCHAR)FX_tolower(*s1++);
+    wch2 = (FX_WCHAR)FX_tolower(*s2++);
+    if (wch1 != wch2) {
+      break;
+    }
+  }
+  return wch1 - wch2;
+}
+
+int32_t FX_filelength(FXSYS_FILE* file) {
+  FXSYS_assert(file != NULL);
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+  return _filelength(_fileno(file));
+#else
+  int32_t iPos = FXSYS_ftell(file);
+  FXSYS_fseek(file, 0, FXSYS_SEEK_END);
+  int32_t iLen = FXSYS_ftell(file);
+  FXSYS_fseek(file, iPos, FXSYS_SEEK_SET);
+  return iLen;
+#endif
+}
+
+FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size) {
+  FXSYS_assert(file != NULL);
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+  return _chsize(_fileno(file), size) == 0;
+#elif _FX_OS_ == _FX_WIN32_MOBILE_
+  HANDLE hFile = _fileno(file);
+  FX_DWORD dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT);
+  ::SetFilePointer(hFile, size, 0, FILE_BEGIN);
+  FX_BOOL bRet = ::SetEndOfFile(hFile);
+  ::SetFilePointer(hFile, (int32_t)dwPos, 0, FILE_BEGIN);
+  return bRet;
+#else
+  return FALSE;
+#endif
+}
+
+FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr, int32_t iLength, int32_t* pUsedLen) {
+  FXSYS_assert(pwsStr != NULL);
+  if (iLength < 0) {
+    iLength = FXSYS_wcslen(pwsStr);
+  }
+  if (iLength == 0) {
+    return 0.0f;
+  }
+  int32_t iUsedLen = 0;
+  FX_BOOL bNegtive = FALSE;
+  switch (pwsStr[iUsedLen]) {
+    case '-':
+      bNegtive = TRUE;
+    case '+':
+      iUsedLen++;
+      break;
+  }
+  FX_FLOAT fValue = 0.0f;
+  while (iUsedLen < iLength) {
+    FX_WCHAR wch = pwsStr[iUsedLen];
+    if (wch >= L'0' && wch <= L'9') {
+      fValue = fValue * 10.0f + (wch - L'0');
+    } else {
+      break;
+    }
+    iUsedLen++;
+  }
+  if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
+    FX_FLOAT fPrecise = 0.1f;
+    while (++iUsedLen < iLength) {
+      FX_WCHAR wch = pwsStr[iUsedLen];
+      if (wch >= L'0' && wch <= L'9') {
+        fValue += (wch - L'0') * fPrecise;
+        fPrecise *= 0.1f;
+      } else {
+        break;
+      }
+    }
+  }
+  if (pUsedLen) {
+    *pUsedLen = iUsedLen;
+  }
+  return bNegtive ? -fValue : fValue;
+}
diff --git a/xfa/fgas/crt/fgas_system.h b/xfa/fgas/crt/fgas_system.h
new file mode 100644
index 0000000..4335c35
--- /dev/null
+++ b/xfa/fgas/crt/fgas_system.h
@@ -0,0 +1,23 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_SYSTEM_H_
+#define XFA_FGAS_CRT_FGAS_SYSTEM_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+#define FX_RAD2DEG(r) ((r)*180.0f / FX_PI)
+#define FX_DEG2RAD(a) ((a)*FX_PI / 180.0f)
+
+FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr,
+                   int32_t iLength = -1,
+                   int32_t* pUsedLen = NULL);
+int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count);
+
+int32_t FX_filelength(FXSYS_FILE* file);
+FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size);
+
+#endif  // XFA_FGAS_CRT_FGAS_SYSTEM_H_
diff --git a/xfa/fgas/crt/fgas_utils.cpp b/xfa/fgas/crt/fgas_utils.cpp
new file mode 100644
index 0000000..7a85fbb
--- /dev/null
+++ b/xfa/fgas/crt/fgas_utils.cpp
@@ -0,0 +1,434 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/crt/fgas_utils.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class FX_BASEARRAYDATA : public CFX_Target {
+ public:
+  FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize)
+      : iGrowSize(growsize),
+        iBlockSize(blocksize),
+        iTotalCount(0),
+        iBlockCount(0),
+        pBuffer(nullptr) {}
+
+  ~FX_BASEARRAYDATA() { FX_Free(pBuffer); }
+
+  int32_t iGrowSize;
+  int32_t iBlockSize;
+  int32_t iTotalCount;
+  int32_t iBlockCount;
+  uint8_t* pBuffer;
+};
+CFX_BaseArray::CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize) {
+  FXSYS_assert(iGrowSize > 0 && iBlockSize > 0);
+  m_pData = new FX_BASEARRAYDATA(iGrowSize, iBlockSize);
+}
+CFX_BaseArray::~CFX_BaseArray() {
+  RemoveAll();
+  delete m_pData;
+}
+int32_t CFX_BaseArray::GetSize() const {
+  return m_pData->iBlockCount;
+}
+int32_t CFX_BaseArray::GetBlockSize() const {
+  return m_pData->iBlockSize;
+}
+uint8_t* CFX_BaseArray::AddSpaceTo(int32_t index) {
+  FXSYS_assert(index > -1);
+  uint8_t*& pBuffer = m_pData->pBuffer;
+  int32_t& iTotalCount = m_pData->iTotalCount;
+  int32_t iBlockSize = m_pData->iBlockSize;
+  if (index >= iTotalCount) {
+    int32_t iGrowSize = m_pData->iGrowSize;
+    iTotalCount = (index / iGrowSize + 1) * iGrowSize;
+    int32_t iNewSize = iTotalCount * iBlockSize;
+    if (!pBuffer) {
+      pBuffer = FX_Alloc(uint8_t, iNewSize);
+    } else {
+      pBuffer = FX_Realloc(uint8_t, pBuffer, iNewSize);
+    }
+  }
+  int32_t& iBlockCount = m_pData->iBlockCount;
+  if (index >= iBlockCount) {
+    iBlockCount = index + 1;
+  }
+  return pBuffer + index * iBlockSize;
+}
+uint8_t* CFX_BaseArray::GetAt(int32_t index) const {
+  FXSYS_assert(index > -1 && index < m_pData->iBlockCount);
+  return m_pData->pBuffer + index * m_pData->iBlockSize;
+}
+uint8_t* CFX_BaseArray::GetBuffer() const {
+  return m_pData->pBuffer;
+}
+int32_t CFX_BaseArray::Append(const CFX_BaseArray& src,
+                              int32_t iStart,
+                              int32_t iCount) {
+  int32_t iBlockSize = m_pData->iBlockSize;
+  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);
+  int32_t& iBlockCount = m_pData->iBlockCount;
+  int32_t iAdded = src.GetSize();
+  FXSYS_assert(iStart > -1 && iStart < iAdded);
+  if (iCount < 0) {
+    iCount = iAdded;
+  }
+  if (iStart + iCount > iAdded) {
+    iCount = iAdded - iStart;
+  }
+  if (iCount < 1) {
+    return 0;
+  }
+  uint8_t* pDst = m_pData->pBuffer + iBlockCount * iBlockSize;
+  AddSpaceTo(iBlockCount + iCount - 1);
+  FXSYS_memcpy(pDst, src.m_pData->pBuffer + iStart * iBlockSize,
+               iCount * iBlockSize);
+  return iCount;
+}
+int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src,
+                            int32_t iStart,
+                            int32_t iCount) {
+  int32_t iBlockSize = m_pData->iBlockSize;
+  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);
+  int32_t iCopied = src.GetSize();
+  FXSYS_assert(iStart > -1 && iStart < iCopied);
+  if (iCount < 0) {
+    iCount = iCopied;
+  }
+  if (iStart + iCount > iCopied) {
+    iCount = iCopied - iStart;
+  }
+  if (iCount < 1) {
+    return 0;
+  }
+  RemoveAll(TRUE);
+  AddSpaceTo(iCount - 1);
+  FXSYS_memcpy(m_pData->pBuffer, src.m_pData->pBuffer + iStart * iBlockSize,
+               iCount * iBlockSize);
+  return iCount;
+}
+int32_t CFX_BaseArray::RemoveLast(int32_t iCount) {
+  int32_t& iBlockCount = m_pData->iBlockCount;
+  if (iCount < 0 || iCount > iBlockCount) {
+    iCount = iBlockCount;
+    iBlockCount = 0;
+  } else {
+    iBlockCount -= iCount;
+  }
+  return iCount;
+}
+void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) {
+  if (!bLeaveMemory) {
+    uint8_t*& pBuffer = m_pData->pBuffer;
+    if (pBuffer != NULL) {
+      FX_Free(pBuffer);
+      pBuffer = NULL;
+    }
+    m_pData->iTotalCount = 0;
+  }
+  m_pData->iBlockCount = 0;
+}
+
+CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(int32_t iChunkSize,
+                                           int32_t iBlockSize)
+    : m_iChunkSize(iChunkSize),
+      m_iBlockSize(iBlockSize),
+      m_iChunkCount(0),
+      m_iBlockCount(0) {
+  FXSYS_assert(m_iChunkSize > 0 && m_iBlockSize > 0);
+  m_pData = new CFX_PtrArray;
+  m_pData->SetSize(16);
+}
+CFX_BaseMassArrayImp::~CFX_BaseMassArrayImp() {
+  RemoveAll();
+  delete m_pData;
+}
+uint8_t* CFX_BaseMassArrayImp::AddSpaceTo(int32_t index) {
+  FXSYS_assert(index > -1);
+  uint8_t* pChunk;
+  if (index < m_iBlockCount) {
+    pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
+  } else {
+    int32_t iMemSize = m_iChunkSize * m_iBlockSize;
+    while (TRUE) {
+      if (index < m_iChunkCount * m_iChunkSize) {
+        pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
+        break;
+      } else {
+        pChunk = FX_Alloc(uint8_t, iMemSize);
+        if (m_iChunkCount < m_pData->GetSize()) {
+          m_pData->SetAt(m_iChunkCount, pChunk);
+        } else {
+          m_pData->Add(pChunk);
+        }
+        m_iChunkCount++;
+      }
+    }
+  }
+  FXSYS_assert(pChunk != NULL);
+  m_iBlockCount = index + 1;
+  return pChunk + (index % m_iChunkSize) * m_iBlockSize;
+}
+uint8_t* CFX_BaseMassArrayImp::GetAt(int32_t index) const {
+  FXSYS_assert(index > -1 && index < m_iBlockCount);
+  uint8_t* pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
+  FXSYS_assert(pChunk != NULL);
+  return pChunk + (index % m_iChunkSize) * m_iBlockSize;
+}
+int32_t CFX_BaseMassArrayImp::Append(const CFX_BaseMassArrayImp& src,
+                                     int32_t iStart,
+                                     int32_t iCount) {
+  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
+  int32_t iAdded = src.m_iBlockCount;
+  FXSYS_assert(iStart > -1 && iStart < iAdded);
+  if (iCount < 0) {
+    iCount = iAdded;
+  }
+  if (iStart + iCount > iAdded) {
+    iCount = iAdded - iStart;
+  }
+  if (iCount < 1) {
+    return m_iBlockCount;
+  }
+  int32_t iBlockCount = m_iBlockCount;
+  int32_t iTotal = m_iBlockCount + iCount;
+  AddSpaceTo(iTotal - 1);
+  Append(iBlockCount, src, iStart, iCount);
+  return m_iBlockCount;
+}
+int32_t CFX_BaseMassArrayImp::Copy(const CFX_BaseMassArrayImp& src,
+                                   int32_t iStart,
+                                   int32_t iCount) {
+  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
+  int32_t iCopied = src.m_iBlockCount;
+  FXSYS_assert(iStart > -1);
+  if (iStart >= iCopied) {
+    return 0;
+  }
+  RemoveAll(TRUE);
+  if (iCount < 0) {
+    iCount = iCopied;
+  }
+  if (iStart + iCount > iCopied) {
+    iCount = iCopied - iStart;
+  }
+  if (iCount < 1) {
+    return 0;
+  }
+  if (m_iBlockCount < iCount) {
+    AddSpaceTo(iCount - 1);
+  }
+  Append(0, src, iStart, iCount);
+  return m_iBlockCount;
+}
+
+void CFX_BaseMassArrayImp::Append(int32_t iDstStart,
+                                  const CFX_BaseMassArrayImp& src,
+                                  int32_t iSrcStart,
+                                  int32_t iSrcCount) {
+  FXSYS_assert(iDstStart > -1);
+  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
+  FXSYS_assert(src.m_iBlockCount > 0);
+  FXSYS_assert(m_iBlockCount >= iDstStart + iSrcCount);
+  FXSYS_assert(iSrcStart > -1);
+  FXSYS_assert(iSrcStart < src.m_iBlockCount);
+  FXSYS_assert(iSrcCount > 0);
+  FXSYS_assert(iSrcStart + iSrcCount <= src.m_iBlockCount);
+
+  int32_t iDstChunkIndex = iDstStart / m_iChunkSize;
+  int32_t iSrcChunkIndex = iSrcStart / src.m_iChunkSize;
+  uint8_t* pDstChunk = (uint8_t*)GetAt(iDstStart);
+  uint8_t* pSrcChunk = (uint8_t*)src.GetAt(iSrcStart);
+  int32_t iDstChunkSize = m_iChunkSize - (iDstStart % m_iChunkSize);
+  int32_t iSrcChunkSize = src.m_iChunkSize - (iSrcStart % src.m_iChunkSize);
+  int32_t iCopySize =
+      std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize));
+  int32_t iCopyBytes = iCopySize * m_iBlockSize;
+  while (iSrcCount > 0) {
+    FXSYS_assert(pDstChunk != NULL && pSrcChunk != NULL);
+    FXSYS_memcpy(pDstChunk, pSrcChunk, iCopyBytes);
+    iSrcCount -= iCopySize;
+    iSrcChunkSize -= iCopySize;
+    if (iSrcChunkSize < 1) {
+      iSrcChunkSize = src.m_iChunkSize;
+      iSrcChunkIndex++;
+      pSrcChunk = (uint8_t*)src.m_pData->GetAt(iSrcChunkIndex);
+    } else {
+      pSrcChunk += iCopyBytes;
+    }
+    iDstChunkSize -= iCopySize;
+    if (iDstChunkSize < 1) {
+      iDstChunkSize = m_iChunkSize;
+      iDstChunkIndex++;
+      pDstChunk = (uint8_t*)m_pData->GetAt(iDstChunkIndex);
+    } else {
+      pDstChunk += iCopyBytes;
+    }
+    iCopySize = std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize));
+    iCopyBytes = iCopySize * m_iBlockSize;
+  }
+}
+int32_t CFX_BaseMassArrayImp::RemoveLast(int32_t iCount) {
+  if (iCount < 0 || iCount >= m_iBlockCount) {
+    m_iBlockCount = 0;
+  } else {
+    m_iBlockCount -= iCount;
+  }
+  return m_iBlockCount;
+}
+void CFX_BaseMassArrayImp::RemoveAll(FX_BOOL bLeaveMemory) {
+  if (bLeaveMemory) {
+    m_iBlockCount = 0;
+    return;
+  }
+  for (int32_t i = 0; i < m_iChunkCount; i++) {
+    void* p = m_pData->GetAt(i);
+    if (p == NULL) {
+      continue;
+    }
+    FX_Free(p);
+  }
+  m_pData->RemoveAll();
+  m_iChunkCount = 0;
+  m_iBlockCount = 0;
+}
+CFX_BaseMassArray::CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize) {
+  m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize);
+}
+CFX_BaseMassArray::~CFX_BaseMassArray() {
+  delete m_pData;
+}
+int32_t CFX_BaseMassArray::GetSize() const {
+  return m_pData->m_iBlockCount;
+}
+uint8_t* CFX_BaseMassArray::AddSpaceTo(int32_t index) {
+  return m_pData->AddSpaceTo(index);
+}
+uint8_t* CFX_BaseMassArray::GetAt(int32_t index) const {
+  return m_pData->GetAt(index);
+}
+int32_t CFX_BaseMassArray::Append(const CFX_BaseMassArray& src,
+                                  int32_t iStart,
+                                  int32_t iCount) {
+  return m_pData->Append(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount);
+}
+int32_t CFX_BaseMassArray::Copy(const CFX_BaseMassArray& src,
+                                int32_t iStart,
+                                int32_t iCount) {
+  return m_pData->Copy(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount);
+}
+int32_t CFX_BaseMassArray::RemoveLast(int32_t iCount) {
+  return m_pData->RemoveLast(iCount);
+}
+void CFX_BaseMassArray::RemoveAll(FX_BOOL bLeaveMemory) {
+  m_pData->RemoveAll(bLeaveMemory);
+}
+
+struct FX_BASEDISCRETEARRAYDATA {
+  int32_t iBlockSize;
+  int32_t iChunkSize;
+  int32_t iChunkCount;
+  CFX_PtrArray ChunkBuffer;
+};
+
+CFX_BaseDiscreteArray::CFX_BaseDiscreteArray(int32_t iChunkSize,
+                                             int32_t iBlockSize) {
+  FXSYS_assert(iChunkSize > 0 && iBlockSize > 0);
+  FX_BASEDISCRETEARRAYDATA* pData = new FX_BASEDISCRETEARRAYDATA;
+  m_pData = pData;
+  pData->ChunkBuffer.SetSize(16);
+  pData->iChunkCount = 0;
+  pData->iChunkSize = iChunkSize;
+  pData->iBlockSize = iBlockSize;
+}
+CFX_BaseDiscreteArray::~CFX_BaseDiscreteArray() {
+  RemoveAll();
+  delete static_cast<FX_BASEDISCRETEARRAYDATA*>(m_pData);
+}
+uint8_t* CFX_BaseDiscreteArray::AddSpaceTo(int32_t index) {
+  FXSYS_assert(index > -1);
+  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
+  int32_t& iChunkCount = pData->iChunkCount;
+  int32_t iChunkSize = pData->iChunkSize;
+  uint8_t* pChunk = NULL;
+  int32_t iChunk = index / iChunkSize;
+  if (iChunk < iChunkCount) {
+    pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk);
+  }
+  if (!pChunk) {
+    pChunk = FX_Alloc2D(uint8_t, iChunkSize, pData->iBlockSize);
+    FXSYS_memset(pChunk, 0, iChunkSize * pData->iBlockSize);
+    pData->ChunkBuffer.SetAtGrow(iChunk, pChunk);
+    if (iChunkCount <= iChunk) {
+      iChunkCount = iChunk + 1;
+    }
+  }
+  return pChunk + (index % iChunkSize) * pData->iBlockSize;
+}
+uint8_t* CFX_BaseDiscreteArray::GetAt(int32_t index) const {
+  FXSYS_assert(index > -1);
+  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
+  int32_t iChunkSize = pData->iChunkSize;
+  int32_t iChunk = index / iChunkSize;
+  if (iChunk >= pData->iChunkCount) {
+    return NULL;
+  }
+  uint8_t* pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk);
+  if (pChunk == NULL) {
+    return NULL;
+  }
+  return pChunk + (index % iChunkSize) * pData->iBlockSize;
+}
+void CFX_BaseDiscreteArray::RemoveAll() {
+  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
+  CFX_PtrArray& ChunkBuffer = pData->ChunkBuffer;
+  int32_t& iChunkCount = pData->iChunkCount;
+  for (int32_t i = 0; i < iChunkCount; i++) {
+    void* p = ChunkBuffer.GetAt(i);
+    if (p == NULL) {
+      continue;
+    }
+    FX_Free(p);
+  }
+  ChunkBuffer.RemoveAll();
+  iChunkCount = 0;
+}
+CFX_BaseStack::CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize) {
+  m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize);
+}
+CFX_BaseStack::~CFX_BaseStack() {
+  delete (CFX_BaseMassArrayImp*)m_pData;
+}
+uint8_t* CFX_BaseStack::Push() {
+  return m_pData->AddSpace();
+}
+void CFX_BaseStack::Pop() {
+  int32_t& iBlockCount = m_pData->m_iBlockCount;
+  if (iBlockCount < 1) {
+    return;
+  }
+  iBlockCount--;
+}
+uint8_t* CFX_BaseStack::GetTopElement() const {
+  int32_t iSize = m_pData->m_iBlockCount;
+  if (iSize < 1) {
+    return NULL;
+  }
+  return m_pData->GetAt(iSize - 1);
+}
+int32_t CFX_BaseStack::GetSize() const {
+  return m_pData->m_iBlockCount;
+}
+uint8_t* CFX_BaseStack::GetAt(int32_t index) const {
+  return m_pData->GetAt(index);
+}
+void CFX_BaseStack::RemoveAll(FX_BOOL bLeaveMemory) {
+  m_pData->RemoveAll(bLeaveMemory);
+}
diff --git a/xfa/fgas/crt/fgas_utils.h b/xfa/fgas/crt/fgas_utils.h
new file mode 100644
index 0000000..f03e398
--- /dev/null
+++ b/xfa/fgas/crt/fgas_utils.h
@@ -0,0 +1,737 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_CRT_FGAS_UTILS_H_
+#define XFA_FGAS_CRT_FGAS_UTILS_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+
+class FX_BASEARRAYDATA;
+
+template <class baseType>
+class CFX_CPLTree;
+
+class CFX_BaseArray : public CFX_Target {
+ protected:
+  CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);
+  ~CFX_BaseArray();
+  int32_t GetSize() const;
+  int32_t GetBlockSize() const;
+  uint8_t* AddSpaceTo(int32_t index);
+  uint8_t* GetAt(int32_t index) const;
+  uint8_t* GetBuffer() const;
+  int32_t Append(const CFX_BaseArray& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1);
+  int32_t Copy(const CFX_BaseArray& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1);
+  int32_t RemoveLast(int32_t iCount = -1);
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
+
+  FX_BASEARRAYDATA* m_pData;
+};
+
+template <class baseType>
+class CFX_BaseArrayTemplate : public CFX_BaseArray {
+ public:
+  CFX_BaseArrayTemplate(int32_t iGrowSize = 100)
+      : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
+  CFX_BaseArrayTemplate(int32_t iGrowSize, int32_t iBlockSize)
+      : CFX_BaseArray(iGrowSize, iBlockSize) {}
+  int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
+  int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
+  baseType* AddSpace() {
+    return (baseType*)CFX_BaseArray::AddSpaceTo(CFX_BaseArray::GetSize());
+  }
+  int32_t Add(const baseType& element) {
+    int32_t index = CFX_BaseArray::GetSize();
+    *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
+    return index;
+  }
+  baseType* GetBuffer() const { return (baseType*)CFX_BaseArray::GetBuffer(); }
+  baseType& GetAt(int32_t index) const {
+    return *(baseType*)CFX_BaseArray::GetAt(index);
+  }
+  baseType* GetPtrAt(int32_t index) const {
+    return (baseType*)CFX_BaseArray::GetAt(index);
+  }
+  void SetAt(int32_t index, const baseType& element) {
+    *(baseType*)CFX_BaseArray::GetAt(index) = element;
+  }
+  void SetAtGrow(int32_t index, const baseType& element) {
+    *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
+  }
+  int32_t Append(const CFX_BaseArrayTemplate& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1) {
+    return CFX_BaseArray::Append(src, iStart, iCount);
+  }
+  int32_t Copy(const CFX_BaseArrayTemplate& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1) {
+    return CFX_BaseArray::Copy(src, iStart, iCount);
+  }
+  int32_t RemoveLast(int32_t iCount = -1) {
+    return CFX_BaseArray::RemoveLast(iCount);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    CFX_BaseArray::RemoveAll(bLeaveMemory);
+  }
+};
+typedef CFX_BaseArrayTemplate<void*> CFDE_PtrArray;
+typedef CFX_BaseArrayTemplate<FX_DWORD> CFDE_DWordArray;
+typedef CFX_BaseArrayTemplate<FX_WORD> CFDE_WordArray;
+
+template <class baseType>
+class CFX_ObjectBaseArrayTemplate : public CFX_BaseArray {
+ public:
+  CFX_ObjectBaseArrayTemplate(int32_t iGrowSize = 100)
+      : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
+  ~CFX_ObjectBaseArrayTemplate() { RemoveAll(FALSE); }
+  int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
+  int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
+  int32_t Add(const baseType& element) {
+    int32_t index = CFX_BaseArray::GetSize();
+    baseType* p = (baseType*)CFX_BaseArray::AddSpaceTo(index);
+    new ((void*)p) baseType(element);
+    return index;
+  }
+  baseType& GetAt(int32_t index) const {
+    return *(baseType*)CFX_BaseArray::GetAt(index);
+  }
+  baseType* GetPtrAt(int32_t index) const {
+    return (baseType*)CFX_BaseArray::GetAt(index);
+  }
+  int32_t Append(const CFX_ObjectBaseArrayTemplate& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1) {
+    FXSYS_assert(GetBlockSize() == src.GetBlockSize());
+    if (iCount == 0) {
+      return 0;
+    }
+    int32_t iSize = src.GetSize();
+    FXSYS_assert(iStart > -1 && iStart < iSize);
+    if (iCount < 0) {
+      iCount = iSize;
+    }
+    if (iStart + iCount > iSize) {
+      iCount = iSize - iStart;
+    }
+    if (iCount < 1) {
+      return 0;
+    }
+    iSize = CFX_BaseArray::GetSize();
+    CFX_BaseArray::AddSpaceTo(iSize + iCount - 1);
+    uint8_t** pStart = CFX_BaseArray::GetAt(iSize);
+    int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
+    iSize = iStart + iCount;
+    for (int32_t i = iStart; i < iSize; i++) {
+      FXTARGET_NewWith((void*)pStart) baseType(src.GetAt(i));
+      pStart += iBlockSize;
+    }
+    return iCount;
+  }
+  int32_t Copy(const CFX_ObjectBaseArrayTemplate& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1) {
+    FXSYS_assert(GetBlockSize() == src.GetBlockSize());
+    if (iCount == 0) {
+      return 0;
+    }
+    int32_t iSize = src.GetSize();
+    FXSYS_assert(iStart > -1 && iStart < iSize);
+    if (iCount < 0) {
+      iCount = iSize;
+    }
+    if (iStart + iCount > iSize) {
+      iCount = iSize - iStart;
+    }
+    if (iCount < 1) {
+      return 0;
+    }
+    RemoveAll(TRUE);
+    CFX_BaseArray::AddSpaceTo(iCount - 1);
+    uint8_t** pStart = CFX_BaseArray::GetAt(0);
+    int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
+    iSize = iStart + iCount;
+    for (int32_t i = iStart; i < iSize; i++) {
+      new ((void*)pStart) baseType(src.GetAt(i));
+      pStart += iBlockSize;
+    }
+    return iCount;
+  }
+  int32_t RemoveLast(int32_t iCount = -1) {
+    int32_t iSize = CFX_BaseArray::GetSize();
+    if (iCount < 0 || iCount > iSize) {
+      iCount = iSize;
+    }
+    if (iCount == 0) {
+      return iSize;
+    }
+    for (int32_t i = iSize - iCount; i < iSize; i++) {
+      ((baseType*)GetPtrAt(i))->~baseType();
+    }
+    return CFX_BaseArray::RemoveLast(iCount);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    int32_t iSize = CFX_BaseArray::GetSize();
+    for (int32_t i = 0; i < iSize; i++) {
+      ((baseType*)GetPtrAt(i))->~baseType();
+    }
+    CFX_BaseArray::RemoveAll(bLeaveMemory);
+  }
+};
+
+class CFX_BaseMassArrayImp : public CFX_Target {
+ public:
+  CFX_BaseMassArrayImp(int32_t iChunkSize, int32_t iBlockSize);
+  ~CFX_BaseMassArrayImp();
+  uint8_t* AddSpace() { return AddSpaceTo(m_iBlockCount); }
+  uint8_t* AddSpaceTo(int32_t index);
+  uint8_t* GetAt(int32_t index) const;
+  int32_t Append(const CFX_BaseMassArrayImp& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1);
+  int32_t Copy(const CFX_BaseMassArrayImp& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1);
+  int32_t RemoveLast(int32_t iCount = -1);
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
+  int32_t m_iChunkSize;
+  int32_t m_iBlockSize;
+  int32_t m_iChunkCount;
+  int32_t m_iBlockCount;
+  CFX_PtrArray* m_pData;
+
+ protected:
+  void Append(int32_t iDstStart,
+              const CFX_BaseMassArrayImp& src,
+              int32_t iSrcStart = 0,
+              int32_t iSrcCount = -1);
+};
+
+class CFX_BaseMassArray : public CFX_Target {
+ protected:
+  CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize);
+  ~CFX_BaseMassArray();
+  int32_t GetSize() const;
+  uint8_t* AddSpaceTo(int32_t index);
+  uint8_t* GetAt(int32_t index) const;
+  int32_t Append(const CFX_BaseMassArray& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1);
+  int32_t Copy(const CFX_BaseMassArray& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1);
+  int32_t RemoveLast(int32_t iCount = -1);
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
+  CFX_BaseMassArrayImp* m_pData;
+};
+
+template <class baseType>
+class CFX_MassArrayTemplate : public CFX_BaseMassArray {
+ public:
+  CFX_MassArrayTemplate(int32_t iChunkSize = 100)
+      : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
+  CFX_MassArrayTemplate(int32_t iChunkSize, int32_t iBlockSize)
+      : CFX_BaseMassArray(iChunkSize, iBlockSize) {}
+  int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
+  baseType* AddSpace() {
+    return (baseType*)CFX_BaseMassArray::AddSpaceTo(
+        CFX_BaseMassArray::GetSize());
+  }
+  int32_t Add(const baseType& element) {
+    int32_t index = CFX_BaseMassArray::GetSize();
+    *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
+    return index;
+  }
+  baseType& GetAt(int32_t index) const {
+    return *(baseType*)CFX_BaseMassArray::GetAt(index);
+  }
+  baseType* GetPtrAt(int32_t index) const {
+    return (baseType*)CFX_BaseMassArray::GetAt(index);
+  }
+  void SetAt(int32_t index, const baseType& element) {
+    *(baseType*)CFX_BaseMassArray::GetAt(index) = element;
+  }
+  void SetAtGrow(int32_t index, const baseType& element) {
+    *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
+  }
+  int32_t Append(const CFX_MassArrayTemplate& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1) {
+    return CFX_BaseMassArray::Append(src, iStart, iCount);
+  }
+  int32_t Copy(const CFX_MassArrayTemplate& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1) {
+    return CFX_BaseMassArray::Copy(src, iStart, iCount);
+  }
+  int32_t RemoveLast(int32_t iCount = -1) {
+    return CFX_BaseMassArray::RemoveLast(iCount);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    CFX_BaseMassArray::RemoveAll(bLeaveMemory);
+  }
+};
+typedef CFX_MassArrayTemplate<void*> CFX_PtrMassArray;
+typedef CFX_MassArrayTemplate<int32_t> CFX_Int32MassArray;
+typedef CFX_MassArrayTemplate<FX_DWORD> CFX_DWordMassArray;
+typedef CFX_MassArrayTemplate<FX_WORD> CFX_WordMassArray;
+typedef CFX_MassArrayTemplate<CFX_Rect> CFX_RectMassArray;
+typedef CFX_MassArrayTemplate<CFX_RectF> CFX_RectFMassArray;
+
+template <class baseType>
+class CFX_ObjectMassArrayTemplate : public CFX_BaseMassArray {
+ public:
+  CFX_ObjectMassArrayTemplate(int32_t iChunkSize = 100)
+      : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
+  ~CFX_ObjectMassArrayTemplate() { RemoveAll(FALSE); }
+  int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
+  int32_t Add(const baseType& element) {
+    int32_t index = CFX_BaseMassArray::GetSize();
+    baseType* p = (baseType*)CFX_BaseMassArray::AddSpaceTo(index);
+    new ((void*)p) baseType(element);
+    return index;
+  }
+  baseType& GetAt(int32_t index) const {
+    return *(baseType*)CFX_BaseMassArray::GetAt(index);
+  }
+  baseType* GetPtrAt(int32_t index) const {
+    return (baseType*)CFX_BaseMassArray::GetAt(index);
+  }
+  int32_t Append(const CFX_ObjectMassArrayTemplate& src,
+                 int32_t iStart = 0,
+                 int32_t iCount = -1) {
+    if (iCount == 0) {
+      return CFX_BaseMassArray::GetSize();
+    }
+    int32_t iSize = src.GetSize();
+    FXSYS_assert(iStart > -1 && iStart < iSize);
+    if (iCount < 0) {
+      iCount = iSize;
+    }
+    int32_t iEnd = iStart + iCount;
+    if (iEnd > iSize) {
+      iEnd = iSize;
+    }
+    for (int32_t i = iStart; i < iEnd; i++) {
+      Add(src.GetAt(i));
+    }
+    return CFX_BaseMassArray::GetSize();
+  }
+  int32_t Copy(const CFX_ObjectMassArrayTemplate& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1) {
+    if (iCount == 0) {
+      return CFX_BaseMassArray::GetSize();
+    }
+    int32_t iSize = src.GetSize();
+    FXSYS_assert(iStart > -1 && iStart < iSize);
+    if (iCount < 0) {
+      iCount = iSize;
+    }
+    int32_t iEnd = iStart + iCount;
+    if (iEnd > iSize) {
+      iEnd = iSize;
+    }
+    RemoveAll(TRUE);
+    for (int32_t i = iStart; i < iEnd; i++) {
+      Add(src.GetAt(i));
+    }
+    return CFX_BaseMassArray::GetSize();
+  }
+  int32_t RemoveLast(int32_t iCount = -1) {
+    int32_t iSize = CFX_BaseMassArray::GetSize();
+    if (iCount < 0 || iCount > iSize) {
+      iCount = iSize;
+    }
+    if (iCount == 0) {
+      return iSize;
+    }
+    for (int32_t i = iSize - iCount; i < iSize; i++) {
+      ((baseType*)GetPtrAt(i))->~baseType();
+    }
+    return CFX_BaseMassArray::RemoveLast(iCount);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    int32_t iSize = CFX_BaseMassArray::GetSize();
+    for (int32_t i = 0; i < iSize; i++) {
+      ((baseType*)GetPtrAt(i))->~baseType();
+    }
+    CFX_BaseMassArray::RemoveAll(bLeaveMemory);
+  }
+};
+
+class CFX_BaseDiscreteArray : public CFX_Target {
+ protected:
+  CFX_BaseDiscreteArray(int32_t iChunkSize, int32_t iBlockSize);
+  ~CFX_BaseDiscreteArray();
+  uint8_t* AddSpaceTo(int32_t index);
+  uint8_t* GetAt(int32_t index) const;
+  void RemoveAll();
+  void* m_pData;
+};
+
+template <class baseType>
+class CFX_DiscreteArrayTemplate : public CFX_BaseDiscreteArray {
+ public:
+  CFX_DiscreteArrayTemplate(int32_t iChunkSize = 100)
+      : CFX_BaseDiscreteArray(iChunkSize, sizeof(baseType)) {}
+  baseType& GetAt(int32_t index, const baseType& defValue) const {
+    baseType* p = (baseType*)CFX_BaseDiscreteArray::GetAt(index);
+    return p == NULL ? (baseType&)defValue : *p;
+  }
+  baseType* GetPtrAt(int32_t index) const {
+    return (baseType*)CFX_BaseDiscreteArray::GetAt(index);
+  }
+  void SetAtGrow(int32_t index, const baseType& element) {
+    *(baseType*)CFX_BaseDiscreteArray::AddSpaceTo(index) = element;
+  }
+  void RemoveAll() { CFX_BaseDiscreteArray::RemoveAll(); }
+};
+typedef CFX_DiscreteArrayTemplate<void*> CFX_PtrDiscreteArray;
+typedef CFX_DiscreteArrayTemplate<FX_DWORD> CFX_DWordDiscreteArray;
+typedef CFX_DiscreteArrayTemplate<FX_WORD> CFX_WordDiscreteArray;
+
+class CFX_BaseStack : public CFX_Target {
+ protected:
+  CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize);
+  ~CFX_BaseStack();
+  uint8_t* Push();
+  void Pop();
+  uint8_t* GetTopElement() const;
+  int32_t GetSize() const;
+  uint8_t* GetAt(int32_t index) const;
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
+  CFX_BaseMassArrayImp* m_pData;
+};
+
+template <class baseType>
+class CFX_StackTemplate : public CFX_BaseStack {
+ public:
+  CFX_StackTemplate(int32_t iChunkSize = 100)
+      : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
+  int32_t Push(const baseType& element) {
+    int32_t index = CFX_BaseStack::GetSize();
+    *(baseType*)CFX_BaseStack::Push() = element;
+    return index;
+  }
+  void Pop() { CFX_BaseStack::Pop(); }
+  baseType* GetTopElement() const {
+    return (baseType*)CFX_BaseStack::GetTopElement();
+  }
+  int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
+  baseType* GetAt(int32_t index) const {
+    return (baseType*)CFX_BaseStack::GetAt(index);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    CFX_BaseStack::RemoveAll(bLeaveMemory);
+  }
+};
+typedef CFX_StackTemplate<void*> CFX_PtrStack;
+typedef CFX_StackTemplate<FX_DWORD> CFX_DWordStack;
+typedef CFX_StackTemplate<FX_WORD> CFX_WordStack;
+typedef CFX_StackTemplate<int32_t> CFX_Int32Stack;
+
+template <class baseType>
+class CFX_ObjectStackTemplate : public CFX_BaseStack {
+ public:
+  CFX_ObjectStackTemplate(int32_t iChunkSize = 100)
+      : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
+  ~CFX_ObjectStackTemplate() { RemoveAll(); }
+  int32_t Push(const baseType& element) {
+    int32_t index = CFX_BaseStack::GetSize();
+    baseType* p = (baseType*)CFX_BaseStack::Push();
+    new ((void*)p) baseType(element);
+    return index;
+  }
+  void Pop() {
+    baseType* p = (baseType*)CFX_BaseStack::GetTopElement();
+    if (p != NULL) {
+      p->~baseType();
+    }
+    CFX_BaseStack::Pop();
+  }
+  baseType* GetTopElement() const {
+    return (baseType*)CFX_BaseStack::GetTopElement();
+  }
+  int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
+  baseType* GetAt(int32_t index) const {
+    return (baseType*)CFX_BaseStack::GetAt(index);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    int32_t iSize = CFX_BaseStack::GetSize();
+    for (int32_t i = 0; i < iSize; i++) {
+      ((baseType*)CFX_BaseStack::GetAt(i))->~baseType();
+    }
+    CFX_BaseStack::RemoveAll(bLeaveMemory);
+  }
+  int32_t Copy(const CFX_ObjectStackTemplate& src,
+               int32_t iStart = 0,
+               int32_t iCount = -1) {
+    if (iCount == 0) {
+      return CFX_BaseStack::GetSize();
+    }
+    int32_t iSize = src.GetSize();
+    FXSYS_assert(iStart > -1 && iStart < iSize);
+    if (iCount < 0) {
+      iCount = iSize;
+    }
+    int32_t iEnd = iStart + iCount;
+    if (iEnd > iSize) {
+      iEnd = iSize;
+    }
+    RemoveAll(TRUE);
+    for (int32_t i = iStart; i < iEnd; i++) {
+      Push(*src.GetAt(i));
+    }
+    return CFX_BaseStack::GetSize();
+  }
+};
+
+template <class baseType>
+class CFX_CPLTreeNode : public CFX_Target {
+ public:
+  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
+  CFX_CPLTreeNode()
+      : m_pParentNode(NULL),
+        m_pChildNode(NULL),
+        m_pPrevNode(NULL),
+        m_pNextNode(NULL),
+        m_Data() {}
+  enum TreeNode {
+    Root = 0,
+    Parent,
+    FirstSibling,
+    PreviousSibling,
+    NextSibling,
+    LastSibling,
+    FirstNeighbor,
+    PreviousNeighbor,
+    NextNeighbor,
+    LastNeighbor,
+    FirstChild,
+    LastChild
+  };
+  CPLTreeNode* GetNode(TreeNode eNode) const {
+    switch (eNode) {
+      case Root: {
+        CPLTreeNode* pParent = (CPLTreeNode*)this;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pParent->m_pParentNode) != NULL) {
+          pParent = pTemp;
+        }
+        return pParent;
+      }
+      case Parent:
+        return m_pParentNode;
+      case FirstSibling: {
+        CPLTreeNode* pNode = (CPLTreeNode*)this;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pNode->m_pPrevNode) != NULL) {
+          pNode = pTemp;
+        }
+        return pNode == (CPLTreeNode*)this ? NULL : pNode;
+      }
+      case PreviousSibling:
+        return m_pPrevNode;
+      case NextSibling:
+        return m_pNextNode;
+      case LastSibling: {
+        CPLTreeNode* pNode = (CPLTreeNode*)this;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pNode->m_pNextNode) != NULL) {
+          pNode = pTemp;
+        }
+        return pNode == (CPLTreeNode*)this ? NULL : pNode;
+      }
+      case FirstNeighbor: {
+        CPLTreeNode* pParent = (CPLTreeNode*)this;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pParent->m_pParentNode) != NULL) {
+          pParent = pTemp;
+        }
+        return pParent == (CPLTreeNode*)this ? NULL : pParent;
+      }
+      case PreviousNeighbor: {
+        if (m_pPrevNode == NULL) {
+          return m_pParentNode;
+        }
+        CPLTreeNode* pNode = m_pPrevNode;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pNode->m_pChildNode) != NULL) {
+          pNode = pTemp;
+          while ((pTemp = pNode->m_pNextNode) != NULL) {
+            pNode = pTemp;
+          }
+        }
+        return pNode;
+      }
+      case NextNeighbor: {
+        if (m_pChildNode != NULL) {
+          return m_pChildNode;
+        }
+        if (m_pNextNode != NULL) {
+          return m_pNextNode;
+        }
+        CPLTreeNode* pNode = m_pParentNode;
+        while (pNode != NULL) {
+          if (pNode->m_pNextNode != NULL) {
+            return pNode->m_pNextNode;
+          }
+          pNode = pNode->m_pParentNode;
+        }
+        return NULL;
+      }
+      case LastNeighbor: {
+        CPLTreeNode* pNode = (CPLTreeNode*)this;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pNode->m_pParentNode) != NULL) {
+          pNode = pTemp;
+        }
+        while (TRUE) {
+          CPLTreeNode* pTemp;
+          while ((pTemp = pNode->m_pNextNode) != NULL) {
+            pNode = pTemp;
+          }
+          if (pNode->m_pChildNode == NULL) {
+            break;
+          }
+          pNode = pNode->m_pChildNode;
+        }
+        return pNode == (CPLTreeNode*)this ? NULL : pNode;
+      }
+      case FirstChild:
+        return m_pChildNode;
+      case LastChild: {
+        if (m_pChildNode == NULL) {
+          return NULL;
+        }
+        CPLTreeNode* pChild = m_pChildNode;
+        CPLTreeNode* pTemp;
+        while ((pTemp = pChild->m_pNextNode) != NULL) {
+          pChild = pTemp;
+        }
+        return pChild;
+      }
+      default:
+        break;
+    }
+    return NULL;
+  }
+  void SetParentNode(CPLTreeNode* pNode) { m_pParentNode = pNode; }
+  int32_t CountChildNodes() const {
+    int32_t iCount = 0;
+    CPLTreeNode* pNode = m_pChildNode;
+    while (pNode) {
+      iCount++;
+      pNode = pNode->m_pNextNode;
+    }
+    return iCount;
+  }
+  CPLTreeNode* GetChildNode(int32_t iIndex) const {
+    int32_t iCount = 0;
+    CPLTreeNode* pNode = m_pChildNode;
+    while (pNode) {
+      if (iIndex == iCount) {
+        return pNode;
+      }
+      iCount++;
+      pNode = pNode->m_pNextNode;
+    }
+    return NULL;
+  }
+  int32_t GetNodeIndex() const {
+    int32_t index = 0;
+    CPLTreeNode* pNode = m_pPrevNode;
+    while (pNode != NULL) {
+      index++;
+      pNode = pNode->m_pPrevNode;
+    }
+    return index;
+  }
+  FX_BOOL IsParentNode(const CPLTreeNode* pNode) const {
+    CPLTreeNode* pParent = m_pParentNode;
+    while (pParent != NULL) {
+      if (pParent == pNode) {
+        return TRUE;
+      }
+      pParent = pParent->GetTreeNode(Parent);
+    }
+    return FALSE;
+  }
+  FX_BOOL IsChildNode(const CPLTreeNode* pNode) const {
+    if (pNode == NULL) {
+      return FALSE;
+    }
+    return pNode->IsParentNode((const CPLTreeNode*)this);
+  }
+  void SetChildNode(CPLTreeNode* pNode) { m_pChildNode = pNode; }
+  void SetPrevNode(CPLTreeNode* pNode) { m_pPrevNode = pNode; }
+  void SetNextNode(CPLTreeNode* pNode) { m_pNextNode = pNode; }
+  int32_t GetNodeLevel() const {
+    int32_t iLevel = 0;
+    CPLTreeNode* pNode = (CPLTreeNode*)this;
+    while ((pNode = pNode->m_pParentNode) != NULL) {
+      iLevel++;
+    }
+    return iLevel;
+  }
+  bool IsRootNode() const { return !m_pParentNode; }
+  baseType GetData() const { return m_Data; }
+  void SetData(baseType data) { m_Data = data; }
+
+ protected:
+  CPLTreeNode* m_pParentNode;
+  CPLTreeNode* m_pChildNode;
+  CPLTreeNode* m_pPrevNode;
+  CPLTreeNode* m_pNextNode;
+  baseType m_Data;
+  friend class CFX_CPLTree<baseType>;
+};
+
+template <class baseType>
+class CFX_CPLTree {
+ public:
+  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
+  CFX_CPLTree() : m_Root() {}
+  ~CFX_CPLTree() {
+    CPLTreeNode* pNode = m_Root.GetNode(CPLTreeNode::LastNeighbor);
+    while (pNode != NULL) {
+      if (pNode->IsRootNode()) {
+        break;
+      }
+      CPLTreeNode* pTemp = pNode->GetNode(CPLTreeNode::PreviousNeighbor);
+      delete pNode;
+      pNode = pTemp;
+    }
+  }
+  CPLTreeNode* GetRoot() { return &m_Root; }
+  CPLTreeNode* AddChild(baseType data, CPLTreeNode* pParent = NULL) {
+    if (pParent == NULL) {
+      pParent = &m_Root;
+    }
+    CPLTreeNode* pChild = new CPLTreeNode;
+    pChild->SetParentNode(pParent);
+    pChild->SetData(data);
+    if (pParent->m_pChildNode == NULL) {
+      pParent->m_pChildNode = pChild;
+    } else {
+      CPLTreeNode* pLast = pParent->GetNode(CPLTreeNode::LastChild);
+      pChild->SetPrevNode(pLast);
+      pLast->SetNextNode(pChild);
+    }
+    return pChild;
+  }
+
+ protected:
+  CPLTreeNode m_Root;
+};
+
+#endif  // XFA_FGAS_CRT_FGAS_UTILS_H_
diff --git a/xfa/fgas/font/fgas_font.h b/xfa/fgas/font/fgas_font.h
new file mode 100644
index 0000000..5c36212
--- /dev/null
+++ b/xfa/fgas/font/fgas_font.h
@@ -0,0 +1,285 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_FONT_FGAS_FONT_H_
+#define XFA_FGAS_FONT_FGAS_FONT_H_
+
+#include "core/include/fxge/fx_font.h"
+#include "xfa/fgas/crt/fgas_stream.h"
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+#endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+
+class IFX_Font;
+class IFX_FontMgr;
+
+#define FX_FONTSTYLE_Normal 0x00
+#define FX_FONTSTYLE_FixedPitch 0x01
+#define FX_FONTSTYLE_Serif 0x02
+#define FX_FONTSTYLE_Symbolic 0x04
+#define FX_FONTSTYLE_Script 0x08
+#define FX_FONTSTYLE_Italic 0x40
+#define FX_FONTSTYLE_Bold 0x40000
+#define FX_FONTSTYLE_BoldItalic (FX_FONTSTYLE_Bold | FX_FONTSTYLE_Italic)
+#define FX_FONTSTYLE_ExactMatch 0x80000000
+#define FX_FONTDECORATION_Underline 0x00000001
+#define FX_FONTDECORATION_Strikeout 0x00000002
+#define FX_FONTDECORATION_Overline 0x00000004
+#define FX_FONTDECORATION_Emphasis 0x00000008
+#define FX_FONTDECORATION_Superscript 0x00000010
+#define FX_FONTDECORATION_Subscript 0x00000020
+#define FX_FONTDECORATION_SmallCapital 0x00000040
+#define FX_FONTDECORATION_Capital 0x00000080
+#define FX_FONTDECORATION_Lowercase 0x000000C0
+#define FX_FONTDECORATION_Raised 0x00000100
+#define FX_FONTDECORATION_Sunken 0x00000200
+#define FX_FONTDECORATION_Shadow 0x00000400
+#define FX_FONTDECORATION_BoundingShape 0x20000000
+#define FX_FONTDECORATION_Hide 0x40000000
+#define FX_FONTDECORATION_StrokeFill 0x80000000
+#define FX_BOUNDINGSHAPE_None 0
+#define FX_BOUNDINGSHAPE_Circle 1
+#define FX_BOUNDINGSHAPE_Square 2
+#define FX_BOUNDINGSHAPE_Triangle 3
+#define FX_BOUNDINGSHAPE_Diamond 4
+
+class IFX_FontProvider {
+ public:
+  virtual ~IFX_FontProvider() {}
+  virtual FX_BOOL GetCharWidth(IFX_Font* pFont,
+                               FX_WCHAR wUnicode,
+                               int32_t& iWidth,
+                               FX_BOOL bCharCode = FALSE) = 0;
+};
+
+class IFX_Font {
+ public:
+  static IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
+                            FX_DWORD dwFontStyles,
+                            FX_WORD wCodePage,
+                            IFX_FontMgr* pFontMgr);
+  static IFX_Font* LoadFont(const uint8_t* pBuffer,
+                            int32_t iLength,
+                            IFX_FontMgr* pFontMgr);
+  static IFX_Font* LoadFont(const FX_WCHAR* pszFileName, IFX_FontMgr* pFontMgr);
+  static IFX_Font* LoadFont(IFX_Stream* pFontStream,
+                            IFX_FontMgr* pFontMgr,
+                            FX_BOOL bSaveStream = FALSE);
+  static IFX_Font* LoadFont(CFX_Font* pExtFont,
+                            IFX_FontMgr* pFontMgr,
+                            FX_BOOL bTakeOver = FALSE);
+  virtual ~IFX_Font() {}
+  virtual void Release() = 0;
+  virtual IFX_Font* Retain() = 0;
+  virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) = 0;
+  virtual void GetFamilyName(CFX_WideString& wsFamily) const = 0;
+  virtual void GetPsName(CFX_WideString& wsName) const = 0;
+  virtual FX_DWORD GetFontStyles() const = 0;
+  virtual uint8_t GetCharSet() const = 0;
+  virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
+                               int32_t& iWidth,
+                               FX_BOOL bCharCode = FALSE) = 0;
+  virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode,
+                                FX_BOOL bCharCode = FALSE) = 0;
+  virtual int32_t GetAscent() const = 0;
+  virtual int32_t GetDescent() const = 0;
+  virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
+                              CFX_Rect& bbox,
+                              FX_BOOL bCharCode = FALSE) = 0;
+  virtual FX_BOOL GetBBox(CFX_Rect& bbox) = 0;
+  virtual int32_t GetItalicAngle() const = 0;
+  virtual void Reset() = 0;
+  virtual IFX_Font* GetSubstFont(int32_t iGlyphIndex) const = 0;
+  virtual void* GetDevFont() const = 0;
+  virtual void SetFontProvider(IFX_FontProvider* pProvider) = 0;
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) = 0;
+#endif
+};
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+struct FX_FONTMATCHPARAMS {
+  const FX_WCHAR* pwsFamily;
+  FX_DWORD dwFontStyles;
+  FX_DWORD dwUSB;
+  FX_DWORD dwMatchFlags;
+  FX_WCHAR wUnicode;
+  FX_WORD wCodePage;
+};
+typedef FX_FONTMATCHPARAMS* FX_LPFONTMATCHPARAMS;
+typedef FX_FONTMATCHPARAMS const* FX_LPCFONTMATCHPARAMS;
+
+struct FX_FONTSIGNATURE {
+  FX_DWORD fsUsb[4];
+  FX_DWORD fsCsb[2];
+};
+inline bool operator==(const FX_FONTSIGNATURE& left,
+                       const FX_FONTSIGNATURE& right) {
+  return left.fsUsb[0] == right.fsUsb[0] && left.fsUsb[1] == right.fsUsb[1] &&
+         left.fsUsb[2] == right.fsUsb[2] && left.fsUsb[3] == right.fsUsb[3] &&
+         left.fsCsb[0] == right.fsCsb[0] && left.fsCsb[1] == right.fsCsb[1];
+}
+
+struct FX_FONTDESCRIPTOR {
+  FX_WCHAR wsFontFace[32];
+  FX_DWORD dwFontStyles;
+  uint8_t uCharSet;
+  FX_FONTSIGNATURE FontSignature;
+};
+typedef FX_FONTDESCRIPTOR* FX_LPFONTDESCRIPTOR;
+typedef FX_FONTDESCRIPTOR const* FX_LPCFONTDESCRIPTOR;
+typedef CFX_MassArrayTemplate<FX_FONTDESCRIPTOR> CFX_FontDescriptors;
+inline bool operator==(const FX_FONTDESCRIPTOR& left,
+                       const FX_FONTDESCRIPTOR& right) {
+  return left.uCharSet == right.uCharSet &&
+         left.dwFontStyles == right.dwFontStyles &&
+         left.FontSignature == right.FontSignature &&
+         FXSYS_wcscmp(left.wsFontFace, right.wsFontFace) == 0;
+}
+
+#define FX_FONTMATCHPARA_MacthStyle 0x01
+#define FX_FONTMATCHPARA_MacthFamily 0x02
+#define FX_FONTMATCHPARA_MacthUnicode 0x04
+typedef void (*FX_LPEnumAllFonts)(CFX_FontDescriptors& fonts,
+                                  void* pUserData,
+                                  const FX_WCHAR* pwsFaceName,
+                                  FX_WCHAR wUnicode);
+FX_LPEnumAllFonts FX_GetDefFontEnumerator();
+typedef FX_LPCFONTDESCRIPTOR (*FX_LPMatchFont)(FX_LPFONTMATCHPARAMS pParams,
+                                               const CFX_FontDescriptors& fonts,
+                                               void* pUserData);
+FX_LPMatchFont FX_GetDefFontMatchor();
+class IFX_FontMgr {
+ public:
+  static IFX_FontMgr* Create(FX_LPEnumAllFonts pEnumerator,
+                             FX_LPMatchFont pMatcher = NULL,
+                             void* pUserData = NULL);
+  virtual ~IFX_FontMgr() {}
+  virtual void Release() = 0;
+  virtual IFX_Font* GetDefFontByCodePage(
+      FX_WORD wCodePage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByCharset(
+      uint8_t nCharset,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByUnicode(
+      FX_WCHAR wUnicode,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByLanguage(
+      FX_WORD wLanguage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage = 0xFFFF) = 0;
+  virtual IFX_Font* LoadFont(const uint8_t* pBuffer, int32_t iLength) = 0;
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName) = 0;
+  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
+                             const FX_WCHAR* pszFontAlias = NULL,
+                             FX_DWORD dwFontStyles = 0,
+                             FX_WORD wCodePage = 0,
+                             FX_BOOL bSaveStream = FALSE) = 0;
+  virtual IFX_Font* LoadFont(IFX_Font* pSrcFont,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage = 0xFFFF) = 0;
+  virtual void ClearFontCache() = 0;
+  virtual void RemoveFont(IFX_Font* pFont) = 0;
+};
+#else
+class IFX_FontMgrDelegate {
+ public:
+  virtual ~IFX_FontMgrDelegate() {}
+  virtual IFX_Font* GetDefFontByCodePage(
+      IFX_FontMgr* pFontMgr,
+      FX_WORD wCodePage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByCharset(
+      IFX_FontMgr* pFontMgr,
+      uint8_t nCharset,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByUnicode(
+      IFX_FontMgr* pFontMgr,
+      FX_WCHAR wUnicode,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByLanguage(
+      IFX_FontMgr* pFontMgr,
+      FX_WORD wLanguage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+};
+class IFX_FontSourceEnum {
+ public:
+  virtual ~IFX_FontSourceEnum() {}
+  virtual void Release() = 0;
+  virtual FX_POSITION GetStartPosition(void* pUserData = NULL) = 0;
+  virtual IFX_FileAccess* GetNext(FX_POSITION& pos, void* pUserData = NULL) = 0;
+};
+IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum();
+class IFX_FontMgr {
+ public:
+  static IFX_FontMgr* Create(IFX_FontSourceEnum* pFontEnum,
+                             IFX_FontMgrDelegate* pDelegate = NULL,
+                             void* pUserData = NULL);
+  virtual ~IFX_FontMgr() {}
+  virtual void Release() = 0;
+  virtual IFX_Font* GetDefFontByCodePage(
+      FX_WORD wCodePage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByCharset(
+      uint8_t nCharset,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByUnicode(
+      FX_WCHAR wUnicode,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetDefFontByLanguage(
+      FX_WORD wLanguage,
+      FX_DWORD dwFontStyles,
+      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage,
+                                      FX_DWORD dwFontStyles,
+                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  inline IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
+                            FX_DWORD dwFontStyles,
+                            FX_WORD wCodePage) {
+    return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
+  }
+  virtual IFX_Font* GetFontByCharset(uint8_t nCharset,
+                                     FX_DWORD dwFontStyles,
+                                     const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode,
+                                     FX_DWORD dwFontStyles,
+                                     const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage,
+                                      FX_DWORD dwFontStyles,
+                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
+  virtual IFX_Font* LoadFont(const uint8_t* pBuffer,
+                             int32_t iLength,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount = NULL) = 0;
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount = NULL) = 0;
+  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount = NULL,
+                             FX_BOOL bSaveStream = FALSE) = 0;
+
+  virtual void ClearFontCache() = 0;
+  virtual void RemoveFont(IFX_Font* pFont) = 0;
+};
+#endif
+
+#endif  // XFA_FGAS_FONT_FGAS_FONT_H_
diff --git a/xfa/fgas/font/fgas_fontutils.cpp b/xfa/fgas/font/fgas_fontutils.cpp
new file mode 100644
index 0000000..51bba01
--- /dev/null
+++ b/xfa/fgas/font/fgas_fontutils.cpp
@@ -0,0 +1,153 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/font/fgas_fontutils.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles) {
+  FX_DWORD dwHash = wCodePage;
+  if (dwFontStyles & FX_FONTSTYLE_FixedPitch) {
+    dwHash |= 0x00010000;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Serif) {
+    dwHash |= 0x00020000;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Symbolic) {
+    dwHash |= 0x00040000;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Script) {
+    dwHash |= 0x00080000;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Italic) {
+    dwHash |= 0x00100000;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Bold) {
+    dwHash |= 0x00200000;
+  }
+  return dwHash;
+}
+FX_DWORD FGAS_GetFontFamilyHash(const FX_WCHAR* pszFontFamily,
+                                FX_DWORD dwFontStyles,
+                                FX_WORD wCodePage) {
+  CFX_WideString wsFont(pszFontFamily);
+  if (dwFontStyles & FX_FONTSTYLE_Bold) {
+    wsFont += L"Bold";
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Italic) {
+    wsFont += L"Italic";
+  }
+  wsFont += wCodePage;
+  return FX_HashCode_String_GetW((const FX_WCHAR*)wsFont, wsFont.GetLength());
+}
+static const FGAS_FONTUSB g_FXGdiFontUSBTable[] = {
+    {0x0000, 0x007F, 0, 1252},     {0x0080, 0x00FF, 1, 1252},
+    {0x0100, 0x017F, 2, 1250},     {0x0180, 0x024F, 3, 1250},
+    {0x0250, 0x02AF, 4, 0xFFFF},   {0x02B0, 0x02FF, 5, 0xFFFF},
+    {0x0300, 0x036F, 6, 0xFFFF},   {0x0370, 0x03FF, 7, 1253},
+    {0x0400, 0x04FF, 9, 1251},     {0x0500, 0x052F, 9, 0xFFFF},
+    {0x0530, 0x058F, 10, 0xFFFF},  {0x0590, 0x05FF, 11, 1255},
+    {0x0600, 0x06FF, 13, 1256},    {0x0700, 0x074F, 71, 0xFFFF},
+    {0x0750, 0x077F, 13, 0xFFFF},  {0x0780, 0x07BF, 72, 0xFFFF},
+    {0x07C0, 0x07FF, 14, 0xFFFF},  {0x0800, 0x08FF, 999, 0xFFFF},
+    {0x0900, 0x097F, 15, 0xFFFF},  {0x0980, 0x09FF, 16, 0xFFFF},
+    {0x0A00, 0x0A7F, 17, 0xFFFF},  {0x0A80, 0x0AFF, 18, 0xFFFF},
+    {0x0B00, 0x0B7F, 19, 0xFFFF},  {0x0B80, 0x0BFF, 20, 0xFFFF},
+    {0x0C00, 0x0C7F, 21, 0xFFFF},  {0x0C80, 0x0CFF, 22, 0xFFFF},
+    {0x0D00, 0x0D7F, 23, 0xFFFF},  {0x0D80, 0x0DFF, 73, 0xFFFF},
+    {0x0E00, 0x0E7F, 24, 874},     {0x0E80, 0x0EFF, 25, 0xFFFF},
+    {0x0F00, 0x0FFF, 70, 0xFFFF},  {0x1000, 0x109F, 74, 0xFFFF},
+    {0x10A0, 0x10FF, 26, 0xFFFF},  {0x1100, 0x11FF, 28, 0xFFFF},
+    {0x1200, 0x137F, 75, 0xFFFF},  {0x1380, 0x139F, 75, 0xFFFF},
+    {0x13A0, 0x13FF, 76, 0xFFFF},  {0x1400, 0x167F, 77, 0xFFFF},
+    {0x1680, 0x169F, 78, 0xFFFF},  {0x16A0, 0x16FF, 79, 0xFFFF},
+    {0x1700, 0x171F, 84, 0xFFFF},  {0x1720, 0x173F, 84, 0xFFFF},
+    {0x1740, 0x175F, 84, 0xFFFF},  {0x1760, 0x177F, 84, 0xFFFF},
+    {0x1780, 0x17FF, 80, 0xFFFF},  {0x1800, 0x18AF, 81, 0xFFFF},
+    {0x18B0, 0x18FF, 999, 0xFFFF}, {0x1900, 0x194F, 93, 0xFFFF},
+    {0x1950, 0x197F, 94, 0xFFFF},  {0x1980, 0x19DF, 95, 0xFFFF},
+    {0x19E0, 0x19FF, 80, 0xFFFF},  {0x1A00, 0x1A1F, 96, 0xFFFF},
+    {0x1A20, 0x1AFF, 999, 0xFFFF}, {0x1B00, 0x1B7F, 27, 0xFFFF},
+    {0x1B80, 0x1BBF, 112, 0xFFFF}, {0x1BC0, 0x1BFF, 999, 0xFFFF},
+    {0x1C00, 0x1C4F, 113, 0xFFFF}, {0x1C50, 0x1C7F, 114, 0xFFFF},
+    {0x1C80, 0x1CFF, 999, 0xFFFF}, {0x1D00, 0x1D7F, 4, 0xFFFF},
+    {0x1D80, 0x1DBF, 4, 0xFFFF},   {0x1DC0, 0x1DFF, 6, 0xFFFF},
+    {0x1E00, 0x1EFF, 29, 0xFFFF},  {0x1F00, 0x1FFF, 30, 0xFFFF},
+    {0x2000, 0x206F, 31, 0xFFFF},  {0x2070, 0x209F, 32, 0xFFFF},
+    {0x20A0, 0x20CF, 33, 0xFFFF},  {0x20D0, 0x20FF, 34, 0xFFFF},
+    {0x2100, 0x214F, 35, 0xFFFF},  {0x2150, 0x215F, 36, 0xFFFF},
+    {0x2160, 0x216B, 36, 936},     {0x216C, 0x216F, 36, 0xFFFF},
+    {0x2170, 0x2179, 36, 936},     {0x217A, 0x218F, 36, 0xFFFF},
+    {0x2190, 0x2199, 37, 949},     {0x219A, 0x21FF, 37, 0xFFFF},
+    {0x2200, 0x22FF, 38, 0xFFFF},  {0x2300, 0x23FF, 39, 0xFFFF},
+    {0x2400, 0x243F, 40, 0xFFFF},  {0x2440, 0x245F, 41, 0xFFFF},
+    {0x2460, 0x2473, 42, 932},     {0x2474, 0x249B, 42, 936},
+    {0x249C, 0x24E9, 42, 949},     {0x24EA, 0x24FF, 42, 0xFFFF},
+    {0x2500, 0x2573, 43, 936},     {0x2574, 0x257F, 43, 0xFFFF},
+    {0x2580, 0x2580, 44, 0xFFFF},  {0x2581, 0x258F, 44, 936},
+    {0x2590, 0x259F, 44, 0xFFFF},  {0x25A0, 0x25FF, 45, 0xFFFF},
+    {0x2600, 0x26FF, 46, 0xFFFF},  {0x2700, 0x27BF, 47, 0xFFFF},
+    {0x27C0, 0x27EF, 38, 0xFFFF},  {0x27F0, 0x27FF, 37, 0xFFFF},
+    {0x2800, 0x28FF, 82, 0xFFFF},  {0x2900, 0x297F, 37, 0xFFFF},
+    {0x2980, 0x29FF, 38, 0xFFFF},  {0x2A00, 0x2AFF, 38, 0xFFFF},
+    {0x2B00, 0x2BFF, 37, 0xFFFF},  {0x2C00, 0x2C5F, 97, 0xFFFF},
+    {0x2C60, 0x2C7F, 29, 0xFFFF},  {0x2C80, 0x2CFF, 8, 0xFFFF},
+    {0x2D00, 0x2D2F, 26, 0xFFFF},  {0x2D30, 0x2D7F, 98, 0xFFFF},
+    {0x2D80, 0x2DDF, 75, 0xFFFF},  {0x2DE0, 0x2DFF, 9, 0xFFFF},
+    {0x2E00, 0x2E7F, 31, 0xFFFF},  {0x2E80, 0x2EFF, 59, 0xFFFF},
+    {0x2F00, 0x2FDF, 59, 0xFFFF},  {0x2FE0, 0x2FEF, 999, 0xFFFF},
+    {0x2FF0, 0x2FFF, 59, 0xFFFF},  {0x3000, 0x303F, 48, 0xFFFF},
+    {0x3040, 0x309F, 49, 932},     {0x30A0, 0x30FF, 50, 932},
+    {0x3100, 0x3129, 51, 936},     {0x312A, 0x312F, 51, 0xFFFF},
+    {0x3130, 0x318F, 52, 949},     {0x3190, 0x319F, 59, 0xFFFF},
+    {0x31A0, 0x31BF, 51, 0xFFFF},  {0x31C0, 0x31EF, 61, 0xFFFF},
+    {0x31F0, 0x31FF, 50, 0xFFFF},  {0x3200, 0x321C, 54, 949},
+    {0x321D, 0x325F, 54, 0xFFFF},  {0x3260, 0x327F, 54, 949},
+    {0x3280, 0x32FF, 54, 0xFFFF},  {0x3300, 0x3387, 55, 0xFFFF},
+    {0x3388, 0x33D0, 55, 949},     {0x33D1, 0x33FF, 55, 0xFFFF},
+    {0x3400, 0x4DBF, 59, 0xFFFF},  {0x4DC0, 0x4DFF, 99, 0xFFFF},
+    {0x4E00, 0x9FA5, 59, 936},     {0x9FA6, 0x9FFF, 59, 0xFFFF},
+    {0xA000, 0xA48F, 83, 0xFFFF},  {0xA490, 0xA4CF, 83, 0xFFFF},
+    {0xA4D0, 0xA4FF, 999, 0xFFFF}, {0xA500, 0xA63F, 12, 0xFFFF},
+    {0xA640, 0xA69F, 9, 0xFFFF},   {0xA6A0, 0xA6FF, 999, 0xFFFF},
+    {0xA700, 0xA71F, 5, 0xFFFF},   {0xA720, 0xA7FF, 29, 0xFFFF},
+    {0xA800, 0xA82F, 100, 0xFFFF}, {0xA830, 0xA8FF, 999, 0xFFFF},
+    {0xA840, 0xA87F, 53, 0xFFFF},  {0xA880, 0xA8DF, 115, 0xFFFF},
+    {0xA8E0, 0xA8FF, 999, 0xFFFF}, {0xA900, 0xA92F, 116, 0xFFFF},
+    {0xA930, 0xA95F, 117, 0xFFFF}, {0xA960, 0xA9FF, 999, 0xFFFF},
+    {0xAA00, 0xAA5F, 118, 0xFFFF}, {0xAA60, 0xABFF, 999, 0xFFFF},
+    {0xAC00, 0xD7AF, 56, 949},     {0xD7B0, 0xD7FF, 999, 0xFFFF},
+    {0xD800, 0xDB7F, 57, 0xFFFF},  {0xDB80, 0xDBFF, 57, 0xFFFF},
+    {0xDC00, 0xDFFF, 57, 0xFFFF},  {0xE000, 0xE814, 60, 0xFFFF},
+    {0xE815, 0xE864, 60, 936},     {0xE865, 0xF8FF, 60, 0xFFFF},
+    {0xF900, 0xFA0B, 61, 949},     {0xFA0C, 0xFA0D, 61, 936},
+    {0xFA0E, 0xFA2D, 61, 932},     {0xFA2E, 0xFAFF, 61, 0xFFFF},
+    {0xFB00, 0xFB4F, 62, 0xFFFF},  {0xFB50, 0xFDFF, 63, 1256},
+    {0xFE00, 0xFE0F, 91, 0xFFFF},  {0xFE10, 0xFE1F, 65, 0xFFFF},
+    {0xFE20, 0xFE2F, 64, 0xFFFF},  {0xFE30, 0xFE4F, 65, 0xFFFF},
+    {0xFE50, 0xFE6F, 66, 0xFFFF},  {0xFE70, 0xFEFF, 67, 1256},
+    {0xFF00, 0xFF5F, 68, 936},     {0xFF60, 0xFF9F, 68, 932},
+    {0xFFA0, 0xFFEF, 68, 0xFFFF},
+};
+
+const FGAS_FONTUSB* FGAS_GetUnicodeBitField(FX_WCHAR wUnicode) {
+  int32_t iEnd = sizeof(g_FXGdiFontUSBTable) / sizeof(FGAS_FONTUSB) - 1;
+  FXSYS_assert(iEnd >= 0);
+  int32_t iStart = 0, iMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    const FGAS_FONTUSB& usb = g_FXGdiFontUSBTable[iMid];
+    if (wUnicode < usb.wStartUnicode) {
+      iEnd = iMid - 1;
+    } else if (wUnicode > usb.wEndUnicode) {
+      iStart = iMid + 1;
+    } else {
+      return &usb;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
diff --git a/xfa/fgas/font/fgas_fontutils.h b/xfa/fgas/font/fgas_fontutils.h
new file mode 100644
index 0000000..75c50c8
--- /dev/null
+++ b/xfa/fgas/font/fgas_fontutils.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_FONT_FGAS_FONTUTILS_H_
+#define XFA_FGAS_FONT_FGAS_FONTUTILS_H_
+
+#include "core/include/fxcrt/fx_string.h"
+
+struct FGAS_FONTUSB {
+  FX_WCHAR wStartUnicode;
+  FX_WCHAR wEndUnicode;
+  FX_WORD wBitField;
+  FX_WORD wCodePage;
+};
+
+FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles);
+FX_DWORD FGAS_GetFontFamilyHash(const FX_WCHAR* pszFontFamily,
+                                FX_DWORD dwFontStyles,
+                                FX_WORD wCodePage);
+const FGAS_FONTUSB* FGAS_GetUnicodeBitField(FX_WCHAR wUnicode);
+
+#endif  // XFA_FGAS_FONT_FGAS_FONTUTILS_H_
diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp
new file mode 100644
index 0000000..831da7e
--- /dev/null
+++ b/xfa/fgas/font/fgas_gefont.cpp
@@ -0,0 +1,572 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/font/fgas_gefont.h"
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/font/fgas_fontutils.h"
+
+IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFontFamily,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage,
+                             IFX_FontMgr* pFontMgr) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (NULL != pFontMgr) {
+    return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
+  }
+  return NULL;
+#else
+  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
+  if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) {
+    pFont->Release();
+    return NULL;
+  }
+  return pFont;
+#endif
+}
+IFX_Font* IFX_Font::LoadFont(const uint8_t* pBuffer,
+                             int32_t iLength,
+                             IFX_FontMgr* pFontMgr) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (NULL != pFontMgr) {
+    return pFontMgr->LoadFont(pBuffer, iLength, 0, NULL);
+  }
+  return NULL;
+#else
+  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
+  if (!pFont->LoadFont(pBuffer, iLength)) {
+    pFont->Release();
+    return NULL;
+  }
+  return pFont;
+#endif
+}
+IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFileName,
+                             IFX_FontMgr* pFontMgr) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (NULL != pFontMgr) {
+    return pFontMgr->LoadFont(pszFileName, 0, NULL);
+  }
+  return NULL;
+#else
+  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
+  if (!pFont->LoadFont(pszFileName)) {
+    pFont->Release();
+    return NULL;
+  }
+  return pFont;
+#endif
+}
+IFX_Font* IFX_Font::LoadFont(IFX_Stream* pFontStream,
+                             IFX_FontMgr* pFontMgr,
+                             FX_BOOL bSaveStream) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (NULL != pFontMgr) {
+    return pFontMgr->LoadFont(pFontStream, 0, NULL);
+  }
+  return NULL;
+#else
+  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
+  if (!pFont->LoadFont(pFontStream, bSaveStream)) {
+    pFont->Release();
+    return NULL;
+  }
+  return pFont;
+#endif
+}
+IFX_Font* IFX_Font::LoadFont(CFX_Font* pExtFont,
+                             IFX_FontMgr* pFontMgr,
+                             FX_BOOL bTakeOver) {
+  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
+  if (!pFont->LoadFont(pExtFont, bTakeOver)) {
+    pFont->Release();
+    return NULL;
+  }
+  return pFont;
+}
+CFX_GEFont::CFX_GEFont(IFX_FontMgr* pFontMgr)
+    :
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      m_bUseLogFontStyle(FALSE),
+      m_dwLogFontStyle(0),
+#endif
+      m_pFont(NULL),
+      m_pFontMgr(pFontMgr),
+      m_iRefCount(1),
+      m_bExtFont(FALSE),
+      m_pStream(NULL),
+      m_pFileRead(NULL),
+      m_pFontEncoding(NULL),
+      m_pCharWidthMap(NULL),
+      m_pRectArray(NULL),
+      m_pBBoxMap(NULL),
+      m_pProvider(NULL),
+      m_wCharSet(0xFFFF),
+      m_SubstFonts(),
+      m_FontMapper(16) {
+}
+
+CFX_GEFont::CFX_GEFont(const CFX_GEFont& src, FX_DWORD dwFontStyles)
+    :
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      m_bUseLogFontStyle(FALSE),
+      m_dwLogFontStyle(0),
+#endif
+      m_pFont(NULL),
+      m_pFontMgr(src.m_pFontMgr),
+      m_iRefCount(1),
+      m_bExtFont(FALSE),
+      m_pStream(NULL),
+      m_pFileRead(NULL),
+      m_pFontEncoding(NULL),
+      m_pCharWidthMap(NULL),
+      m_pRectArray(NULL),
+      m_pBBoxMap(NULL),
+      m_pProvider(NULL),
+      m_wCharSet(0xFFFF),
+      m_SubstFonts(),
+      m_FontMapper(16) {
+  m_pFont = new CFX_Font;
+  FXSYS_assert(m_pFont != NULL);
+  FXSYS_assert(src.m_pFont != NULL);
+  m_pFont->LoadClone(src.m_pFont);
+  CFX_SubstFont* pSubst = m_pFont->GetSubstFont();
+  if (!pSubst) {
+    pSubst = new CFX_SubstFont;
+    m_pFont->SetSubstFont(pSubst);
+  }
+  pSubst->m_Weight =
+      (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
+  if (dwFontStyles & FX_FONTSTYLE_Italic) {
+    pSubst->m_SubstFlags |= FXFONT_SUBST_ITALIC;
+  }
+  InitFont();
+}
+CFX_GEFont::~CFX_GEFont() {
+  int32_t iCount = m_SubstFonts.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    IFX_Font* pFont = (IFX_Font*)m_SubstFonts[i];
+    pFont->Release();
+  }
+  m_SubstFonts.RemoveAll();
+  m_FontMapper.RemoveAll();
+  if (m_pFileRead != NULL) {
+    m_pFileRead->Release();
+  }
+  if (m_pStream != NULL) {
+    m_pStream->Release();
+  }
+  if (m_pFontEncoding != NULL) {
+    delete m_pFontEncoding;
+  }
+  if (m_pCharWidthMap != NULL) {
+    delete m_pCharWidthMap;
+  }
+  if (m_pRectArray != NULL) {
+    delete m_pRectArray;
+  }
+  if (m_pBBoxMap != NULL) {
+    delete m_pBBoxMap;
+  }
+  if (m_pFont != NULL && !m_bExtFont) {
+    delete m_pFont;
+  }
+}
+void CFX_GEFont::Release() {
+  if (--m_iRefCount < 1) {
+    if (m_pFontMgr != NULL) {
+      m_pFontMgr->RemoveFont(this);
+    }
+    delete this;
+  }
+}
+IFX_Font* CFX_GEFont::Retain() {
+  ++m_iRefCount;
+  return this;
+}
+FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage) {
+  if (m_pFont) {
+    return FALSE;
+  }
+  CFX_ByteString csFontFamily;
+  if (pszFontFamily != NULL) {
+    csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily);
+  }
+  FX_DWORD dwFlags = 0;
+  if (dwFontStyles & FX_FONTSTYLE_FixedPitch) {
+    dwFlags |= FXFONT_FIXED_PITCH;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Serif) {
+    dwFlags |= FXFONT_SERIF;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Symbolic) {
+    dwFlags |= FXFONT_SYMBOLIC;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Script) {
+    dwFlags |= FXFONT_SCRIPT;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Italic) {
+    dwFlags |= FXFONT_ITALIC;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_Bold) {
+    dwFlags |= FXFONT_BOLD;
+  }
+  if (dwFontStyles & FX_FONTSTYLE_ExactMatch) {
+    dwFlags |= FXFONT_EXACTMATCH;
+  }
+  int32_t iWeight =
+      (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
+  FX_WORD wCharSet = FX_GetCharsetFromCodePage(wCodePage);
+  if (wCharSet == 0xFFFF) {
+    wCharSet = FXSYS_GetACP();
+  }
+  m_wCharSet = wCharSet;
+  m_pFont = new CFX_Font;
+  if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) {
+    csFontFamily += ",BoldItalic";
+  } else if (dwFlags & FXFONT_BOLD) {
+    csFontFamily += ",Bold";
+  } else if (dwFlags & FXFONT_ITALIC) {
+    csFontFamily += ",Italic";
+  }
+  m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage);
+  FX_BOOL bRet = m_pFont->GetFace() != nullptr;
+  if (bRet) {
+    bRet = InitFont();
+  }
+  return bRet;
+}
+FX_BOOL CFX_GEFont::LoadFont(const uint8_t* pBuffer, int32_t length) {
+  if (m_pFont) {
+    return FALSE;
+  }
+  m_pFont = new CFX_Font;
+  FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length);
+  if (bRet) {
+    bRet = InitFont();
+  }
+  m_wCharSet = 0xFFFF;
+  return bRet;
+}
+FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFileName) {
+  if (m_pFont || m_pStream || m_pFileRead) {
+    return FALSE;
+  }
+  m_pStream = IFX_Stream::CreateStream(
+      pszFileName, FX_STREAMACCESS_Binary | FX_STREAMACCESS_Read);
+  m_pFileRead = FX_CreateFileRead(m_pStream);
+  FX_BOOL bRet = FALSE;
+  if (m_pStream && m_pFileRead) {
+    m_pFont = new CFX_Font;
+    bRet = m_pFont->LoadFile(m_pFileRead);
+    if (bRet) {
+      bRet = InitFont();
+    } else {
+      m_pFileRead->Release();
+      m_pFileRead = nullptr;
+    }
+  }
+  m_wCharSet = 0xFFFF;
+  return bRet;
+}
+FX_BOOL CFX_GEFont::LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream) {
+  if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) {
+    return FALSE;
+  }
+  if (bSaveStream) {
+    m_pStream = pFontStream;
+  }
+  m_pFileRead = FX_CreateFileRead(pFontStream);
+  m_pFont = new CFX_Font;
+  FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead);
+  if (bRet) {
+    bRet = InitFont();
+  } else {
+    m_pFileRead->Release();
+    m_pFileRead = nullptr;
+  }
+  m_wCharSet = 0xFFFF;
+  return bRet;
+}
+FX_BOOL CFX_GEFont::LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver) {
+  if (m_pFont || !pExtFont) {
+    return FALSE;
+  }
+  m_pFont = pExtFont;
+  FX_BOOL bRet = !!m_pFont;
+  if (bRet) {
+    m_bExtFont = !bTakeOver;
+    bRet = InitFont();
+  } else {
+    m_bExtFont = TRUE;
+  }
+  m_wCharSet = 0xFFFF;
+  return bRet;
+}
+FX_BOOL CFX_GEFont::InitFont() {
+  if (!m_pFont) {
+    return FALSE;
+  }
+  if (!m_pFontEncoding) {
+    m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont);
+    if (!m_pFontEncoding) {
+      return FALSE;
+    }
+  }
+  if (!m_pCharWidthMap) {
+    m_pCharWidthMap = new CFX_WordDiscreteArray(1024);
+  }
+  if (!m_pRectArray) {
+    m_pRectArray = new CFX_RectMassArray(16);
+  }
+  if (!m_pBBoxMap) {
+    m_pBBoxMap = new CFX_MapPtrToPtr(16);
+  }
+  return TRUE;
+}
+IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage) {
+  if (GetFontStyles() == dwFontStyles) {
+    return Retain();
+  }
+  return new CFX_GEFont(*this, dwFontStyles);
+}
+uint8_t CFX_GEFont::GetCharSet() const {
+  if (m_wCharSet != 0xFFFF) {
+    return (uint8_t)m_wCharSet;
+  }
+  if (!m_pFont->GetSubstFont()) {
+    return FX_CHARSET_Default;
+  }
+  return m_pFont->GetSubstFont()->m_Charset;
+}
+void CFX_GEFont::GetFamilyName(CFX_WideString& wsFamily) const {
+  if (!m_pFont->GetSubstFont() ||
+      m_pFont->GetSubstFont()->m_Family.GetLength() == 0) {
+    wsFamily = CFX_WideString::FromLocal(m_pFont->GetFamilyName());
+  } else {
+    wsFamily = CFX_WideString::FromLocal(m_pFont->GetSubstFont()->m_Family);
+  }
+}
+void CFX_GEFont::GetPsName(CFX_WideString& wsName) const {
+  wsName = m_pFont->GetPsName();
+}
+FX_DWORD CFX_GEFont::GetFontStyles() const {
+  FXSYS_assert(m_pFont != NULL);
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (m_bUseLogFontStyle) {
+    return m_dwLogFontStyle;
+  }
+#endif
+  FX_DWORD dwStyles = 0;
+  if (!m_pFont->GetSubstFont()) {
+    if (m_pFont->IsBold()) {
+      dwStyles |= FX_FONTSTYLE_Bold;
+    }
+    if (m_pFont->IsItalic()) {
+      dwStyles |= FX_FONTSTYLE_Italic;
+    }
+  } else {
+    if (m_pFont->GetSubstFont()->m_Weight == FXFONT_FW_BOLD) {
+      dwStyles |= FX_FONTSTYLE_Bold;
+    }
+    if (m_pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_ITALIC) {
+      dwStyles |= FX_FONTSTYLE_Italic;
+    }
+  }
+  return dwStyles;
+}
+FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode,
+                                 int32_t& iWidth,
+                                 FX_BOOL bCharCode) {
+  return GetCharWidth(wUnicode, iWidth, TRUE, bCharCode);
+}
+FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode,
+                                 int32_t& iWidth,
+                                 FX_BOOL bRecursive,
+                                 FX_BOOL bCharCode) {
+  FXSYS_assert(m_pCharWidthMap != NULL);
+  iWidth = m_pCharWidthMap->GetAt(wUnicode, 0);
+  if (iWidth < 1) {
+    if (!m_pProvider ||
+        !m_pProvider->GetCharWidth(this, wUnicode, iWidth, bCharCode)) {
+      IFX_Font* pFont = NULL;
+      int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
+      if (iGlyph != 0xFFFF && pFont != NULL) {
+        if (pFont == (IFX_Font*)this) {
+          iWidth = m_pFont->GetGlyphWidth(iGlyph);
+          if (iWidth < 0) {
+            iWidth = -1;
+          }
+        } else if (((CFX_GEFont*)pFont)
+                       ->GetCharWidth(wUnicode, iWidth, FALSE, bCharCode)) {
+          return TRUE;
+        }
+      } else {
+        iWidth = -1;
+      }
+    }
+    m_pCharWidthMap->SetAtGrow(wUnicode, (int16_t)iWidth);
+  } else if (iWidth == 65535) {
+    iWidth = -1;
+  }
+  return iWidth > 0;
+}
+FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode,
+                                CFX_Rect& bbox,
+                                FX_BOOL bCharCode) {
+  return GetCharBBox(wUnicode, bbox, TRUE, bCharCode);
+}
+FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode,
+                                CFX_Rect& bbox,
+                                FX_BOOL bRecursive,
+                                FX_BOOL bCharCode) {
+  FXSYS_assert(m_pRectArray != NULL);
+  FXSYS_assert(m_pBBoxMap != NULL);
+  void* pRect = NULL;
+  if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) {
+    IFX_Font* pFont = NULL;
+    int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
+    if (iGlyph != 0xFFFF && pFont != NULL) {
+      if (pFont == (IFX_Font*)this) {
+        FX_RECT rtBBox;
+        if (m_pFont->GetGlyphBBox(iGlyph, rtBBox)) {
+          CFX_Rect rt;
+          rt.Set(rtBBox.left, rtBBox.top, rtBBox.Width(), rtBBox.Height());
+          int32_t index = m_pRectArray->Add(rt);
+          pRect = m_pRectArray->GetPtrAt(index);
+          m_pBBoxMap->SetAt((void*)(uintptr_t)wUnicode, pRect);
+        }
+      } else if (((CFX_GEFont*)pFont)
+                     ->GetCharBBox(wUnicode, bbox, FALSE, bCharCode)) {
+        return TRUE;
+      }
+    }
+  }
+  if (!pRect)
+    return FALSE;
+
+  bbox = *static_cast<const CFX_Rect*>(pRect);
+  return TRUE;
+}
+FX_BOOL CFX_GEFont::GetBBox(CFX_Rect& bbox) {
+  FX_RECT rt(0, 0, 0, 0);
+  FX_BOOL bRet = m_pFont->GetBBox(rt);
+  if (bRet) {
+    bbox.left = rt.left;
+    bbox.width = rt.Width();
+    bbox.top = rt.bottom;
+    bbox.height = -rt.Height();
+  }
+  return bRet;
+}
+int32_t CFX_GEFont::GetItalicAngle() const {
+  if (!m_pFont->GetSubstFont()) {
+    return 0;
+  }
+  return m_pFont->GetSubstFont()->m_ItalicAngle;
+}
+int32_t CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode) {
+  return GetGlyphIndex(wUnicode, TRUE, NULL, bCharCode);
+}
+int32_t CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode,
+                                  FX_BOOL bRecursive,
+                                  IFX_Font** ppFont,
+                                  FX_BOOL bCharCode) {
+  FXSYS_assert(m_pFontEncoding != NULL);
+  int32_t iGlyphIndex = m_pFontEncoding->GlyphFromCharCode(wUnicode);
+  if (iGlyphIndex > 0) {
+    if (ppFont != NULL) {
+      *ppFont = (IFX_Font*)this;
+    }
+    return iGlyphIndex;
+  }
+  const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode);
+  if (pFontUSB == NULL) {
+    return 0xFFFF;
+  }
+  FX_WORD wBitField = pFontUSB->wBitField;
+  if (wBitField >= 128) {
+    return 0xFFFF;
+  }
+  IFX_Font* pFont = NULL;
+  m_FontMapper.Lookup((void*)(uintptr_t)wUnicode, (void*&)pFont);
+  if (pFont != NULL && pFont != (IFX_Font*)this) {
+    iGlyphIndex =
+        ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
+    if (iGlyphIndex != 0xFFFF) {
+      int32_t i = m_SubstFonts.Find(pFont);
+      if (i > -1) {
+        iGlyphIndex |= ((i + 1) << 24);
+        if (ppFont != NULL) {
+          *ppFont = pFont;
+        }
+        return iGlyphIndex;
+      }
+    }
+  }
+  if (m_pFontMgr != NULL && bRecursive) {
+    CFX_WideString wsFamily;
+    GetFamilyName(wsFamily);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+    IFX_Font* pFont = m_pFontMgr->GetDefFontByUnicode(
+        wUnicode, GetFontStyles(), (const FX_WCHAR*)wsFamily);
+#else
+    IFX_Font* pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(),
+                                                   (const FX_WCHAR*)wsFamily);
+    if (NULL == pFont) {
+      pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), NULL);
+    }
+#endif
+    if (pFont != NULL) {
+      if (pFont == (IFX_Font*)this) {
+        pFont->Release();
+        return 0xFFFF;
+      }
+      m_FontMapper.SetAt((void*)(uintptr_t)wUnicode, (void*)pFont);
+      int32_t i = m_SubstFonts.GetSize();
+      m_SubstFonts.Add(pFont);
+      iGlyphIndex =
+          ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
+      if (iGlyphIndex != 0xFFFF) {
+        iGlyphIndex |= ((i + 1) << 24);
+        if (ppFont != NULL) {
+          *ppFont = pFont;
+        }
+        return iGlyphIndex;
+      }
+    }
+  }
+  return 0xFFFF;
+}
+int32_t CFX_GEFont::GetAscent() const {
+  return m_pFont->GetAscent();
+}
+int32_t CFX_GEFont::GetDescent() const {
+  return m_pFont->GetDescent();
+}
+void CFX_GEFont::Reset() {
+  int32_t iCount = m_SubstFonts.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    IFX_Font* pFont = (IFX_Font*)m_SubstFonts[i];
+    ((CFX_GEFont*)pFont)->Reset();
+  }
+  if (m_pCharWidthMap != NULL) {
+    m_pCharWidthMap->RemoveAll();
+  }
+  if (m_pBBoxMap != NULL) {
+    m_pBBoxMap->RemoveAll();
+  }
+  if (m_pRectArray != NULL) {
+    m_pRectArray->RemoveAll();
+  }
+}
+IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const {
+  iGlyphIndex = ((FX_DWORD)iGlyphIndex) >> 24;
+  return iGlyphIndex == 0 ? (IFX_Font*)this
+                          : (IFX_Font*)m_SubstFonts[iGlyphIndex - 1];
+}
diff --git a/xfa/fgas/font/fgas_gefont.h b/xfa/fgas/font/fgas_gefont.h
new file mode 100644
index 0000000..034220e
--- /dev/null
+++ b/xfa/fgas/font/fgas_gefont.h
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_FONT_FGAS_GEFONT_H_
+#define XFA_FGAS_FONT_FGAS_GEFONT_H_
+
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+#define FXFONT_SUBST_ITALIC 0x02
+
+class CFX_GEFont : public IFX_Font {
+ public:
+  CFX_GEFont(const CFX_GEFont& src, FX_DWORD dwFontStyles);
+  CFX_GEFont(IFX_FontMgr* pFontMgr);
+  ~CFX_GEFont();
+  virtual void Release();
+  virtual IFX_Font* Retain();
+  FX_BOOL LoadFont(const FX_WCHAR* pszFontFamily,
+                   FX_DWORD dwFontStyles,
+                   FX_WORD wCodePage);
+  FX_BOOL LoadFont(const uint8_t* pBuffer, int32_t length);
+  FX_BOOL LoadFont(const FX_WCHAR* pszFileName);
+  FX_BOOL LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream);
+  FX_BOOL LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver = FALSE);
+  virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0);
+  virtual void GetFamilyName(CFX_WideString& wsFamily) const;
+  virtual void GetPsName(CFX_WideString& wsName) const;
+  virtual FX_DWORD GetFontStyles() const;
+  virtual uint8_t GetCharSet() const;
+  virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
+                               int32_t& iWidth,
+                               FX_BOOL bCharCode = FALSE);
+  virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE);
+  virtual int32_t GetAscent() const;
+  virtual int32_t GetDescent() const;
+  virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
+                              CFX_Rect& bbox,
+                              FX_BOOL bCharCode = FALSE);
+  virtual FX_BOOL GetBBox(CFX_Rect& bbox);
+  virtual int32_t GetItalicAngle() const;
+  virtual void Reset();
+  virtual IFX_Font* GetSubstFont(int32_t iGlyphIndex) const;
+  virtual void* GetDevFont() const { return (void*)m_pFont; }
+  virtual void SetFontProvider(IFX_FontProvider* pProvider) {
+    m_pProvider = pProvider;
+  }
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) {
+    m_bUseLogFontStyle = TRUE;
+    m_dwLogFontStyle = dwLogFontStyle;
+  }
+#endif
+
+ protected:
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  FX_BOOL m_bUseLogFontStyle;
+  FX_DWORD m_dwLogFontStyle;
+#endif
+  CFX_Font* m_pFont;
+  IFX_FontMgr* m_pFontMgr;
+  int32_t m_iRefCount;
+  FX_BOOL m_bExtFont;
+  IFX_Stream* m_pStream;
+  IFX_FileRead* m_pFileRead;
+  CFX_UnicodeEncoding* m_pFontEncoding;
+  CFX_WordDiscreteArray* m_pCharWidthMap;
+  CFX_RectMassArray* m_pRectArray;
+  CFX_MapPtrToPtr* m_pBBoxMap;
+  IFX_FontProvider* m_pProvider;
+  FX_WORD m_wCharSet;
+  CFX_PtrArray m_SubstFonts;
+  CFX_MapPtrToPtr m_FontMapper;
+  FX_BOOL InitFont();
+  FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
+                      CFX_Rect& bbox,
+                      FX_BOOL bRecursive,
+                      FX_BOOL bCharCode = FALSE);
+  FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
+                       int32_t& iWidth,
+                       FX_BOOL bRecursive,
+                       FX_BOOL bCharCode = FALSE);
+  int32_t GetGlyphIndex(FX_WCHAR wUnicode,
+                        FX_BOOL bRecursive,
+                        IFX_Font** ppFont,
+                        FX_BOOL bCharCode = FALSE);
+};
+
+#endif  // XFA_FGAS_FONT_FGAS_GEFONT_H_
diff --git a/xfa/fgas/font/fgas_stdfontmgr.cpp b/xfa/fgas/font/fgas_stdfontmgr.cpp
new file mode 100644
index 0000000..ffe520d
--- /dev/null
+++ b/xfa/fgas/font/fgas_stdfontmgr.cpp
@@ -0,0 +1,1515 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/font/fgas_stdfontmgr.h"
+
+#include "core/include/fxcrt/fx_stream.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/font/fgas_fontutils.h"
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+IFX_FontMgr* IFX_FontMgr::Create(FX_LPEnumAllFonts pEnumerator,
+                                 FX_LPMatchFont pMatcher,
+                                 void* pUserData) {
+  return new CFX_StdFontMgrImp(pEnumerator, pMatcher, pUserData);
+}
+CFX_StdFontMgrImp::CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator,
+                                     FX_LPMatchFont pMatcher,
+                                     void* pUserData)
+    : m_pMatcher(pMatcher),
+      m_pEnumerator(pEnumerator),
+      m_FontFaces(),
+      m_Fonts(),
+      m_CPFonts(8),
+      m_FamilyFonts(16),
+      m_UnicodeFonts(16),
+      m_BufferFonts(4),
+      m_FileFonts(4),
+      m_StreamFonts(4),
+      m_DeriveFonts(4),
+      m_pUserData(pUserData) {
+  if (m_pEnumerator != NULL) {
+    m_pEnumerator(m_FontFaces, m_pUserData, NULL, 0xFEFF);
+  }
+  if (m_pMatcher == NULL) {
+    m_pMatcher = FX_DefFontMatcher;
+  }
+  FXSYS_assert(m_pMatcher != NULL);
+}
+CFX_StdFontMgrImp::~CFX_StdFontMgrImp() {
+  m_FontFaces.RemoveAll();
+  m_CPFonts.RemoveAll();
+  m_FamilyFonts.RemoveAll();
+  m_UnicodeFonts.RemoveAll();
+  m_BufferFonts.RemoveAll();
+  m_FileFonts.RemoveAll();
+  m_StreamFonts.RemoveAll();
+  m_DeriveFonts.RemoveAll();
+  for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) {
+    IFX_Font* pFont = (IFX_Font*)m_Fonts[i];
+    if (pFont != NULL) {
+      pFont->Release();
+    }
+  }
+  m_Fonts.RemoveAll();
+}
+IFX_Font* CFX_StdFontMgrImp::GetDefFontByCodePage(
+    FX_WORD wCodePage,
+    FX_DWORD dwFontStyles,
+    const FX_WCHAR* pszFontFamily) {
+  FX_DWORD dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
+  IFX_Font* pFont = NULL;
+  if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
+    return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL;
+  }
+  FX_LPCFONTDESCRIPTOR pFD;
+  if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) {
+    if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) {
+      if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL)
+        return NULL;
+    }
+  }
+  FXSYS_assert(pFD != NULL);
+  pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
+  if (pFont != NULL) {
+    m_Fonts.Add(pFont);
+    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage);
+    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    return LoadFont(pFont, dwFontStyles, wCodePage);
+  }
+  return NULL;
+}
+IFX_Font* CFX_StdFontMgrImp::GetDefFontByCharset(
+    uint8_t nCharset,
+    FX_DWORD dwFontStyles,
+    const FX_WCHAR* pszFontFamily) {
+  return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
+                              pszFontFamily);
+}
+
+IFX_Font* CFX_StdFontMgrImp::GetDefFontByUnicode(
+    FX_WCHAR wUnicode,
+    FX_DWORD dwFontStyles,
+    const FX_WCHAR* pszFontFamily) {
+  const FGAS_FONTUSB* pRet = FGAS_GetUnicodeBitField(wUnicode);
+  if (pRet->wBitField == 999)
+    return nullptr;
+
+  FX_DWORD dwHash =
+      FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField);
+  IFX_Font* pFont = nullptr;
+  if (m_UnicodeFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont))
+    return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : nullptr;
+
+  FX_LPCFONTDESCRIPTOR pFD =
+      FindFont(pszFontFamily, dwFontStyles, FALSE, pRet->wCodePage,
+               pRet->wBitField, wUnicode);
+  if (!pFD && pszFontFamily) {
+    pFD = FindFont(nullptr, dwFontStyles, FALSE, pRet->wCodePage,
+                   pRet->wBitField, wUnicode);
+  }
+  if (!pFD)
+    return nullptr;
+
+  FX_WORD wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
+  const FX_WCHAR* pFontFace = pFD->wsFontFace;
+  pFont = IFX_Font::LoadFont(pFontFace, dwFontStyles, wCodePage, this);
+  if (pFont) {
+    m_Fonts.Add(pFont);
+    m_UnicodeFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
+    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage);
+    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    return LoadFont(pFont, dwFontStyles, wCodePage);
+  }
+  return nullptr;
+}
+
+IFX_Font* CFX_StdFontMgrImp::GetDefFontByLanguage(
+    FX_WORD wLanguage,
+    FX_DWORD dwFontStyles,
+    const FX_WCHAR* pszFontFamily) {
+  return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage),
+                              dwFontStyles, pszFontFamily);
+}
+IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily,
+                                      FX_DWORD dwFontStyles,
+                                      FX_WORD wCodePage) {
+  FX_DWORD dwHash =
+      FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage);
+  IFX_Font* pFont = NULL;
+  if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
+    return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL;
+  }
+  FX_LPCFONTDESCRIPTOR pFD = NULL;
+  if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) {
+    if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) ==
+        NULL) {
+      return NULL;
+    }
+  }
+  FXSYS_assert(pFD != NULL);
+  if (wCodePage == 0xFFFF) {
+    wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
+  }
+  pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
+  if (pFont != NULL) {
+    m_Fonts.Add(pFont);
+    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
+    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    return LoadFont(pFont, dwFontStyles, wCodePage);
+  }
+  return NULL;
+}
+IFX_Font* CFX_StdFontMgrImp::LoadFont(const uint8_t* pBuffer, int32_t iLength) {
+  FXSYS_assert(pBuffer != NULL && iLength > 0);
+  IFX_Font* pFont = NULL;
+  if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) {
+    if (pFont != NULL) {
+      return pFont->Retain();
+    }
+  }
+  pFont = IFX_Font::LoadFont(pBuffer, iLength, this);
+  if (pFont != NULL) {
+    m_Fonts.Add(pFont);
+    m_BufferFonts.SetAt((void*)pBuffer, pFont);
+    return pFont->Retain();
+  }
+  return NULL;
+}
+IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) {
+  FXSYS_assert(pszFileName != NULL);
+  FX_DWORD dwHash = FX_HashCode_String_GetW(pszFileName, -1);
+  IFX_Font* pFont = NULL;
+  if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
+    if (pFont != NULL) {
+      return pFont->Retain();
+    }
+  }
+  pFont = IFX_Font::LoadFont(pszFileName, NULL);
+  if (pFont != NULL) {
+    m_Fonts.Add(pFont);
+    m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    return pFont->Retain();
+  }
+  return NULL;
+}
+IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream,
+                                      const FX_WCHAR* pszFontAlias,
+                                      FX_DWORD dwFontStyles,
+                                      FX_WORD wCodePage,
+                                      FX_BOOL bSaveStream) {
+  FXSYS_assert(pFontStream != NULL && pFontStream->GetLength() > 0);
+  IFX_Font* pFont = NULL;
+  if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) {
+    if (pFont != NULL) {
+      if (pszFontAlias != NULL) {
+        FX_DWORD dwHash =
+            FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
+        m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+      }
+      return LoadFont(pFont, dwFontStyles, wCodePage);
+    }
+  }
+  pFont = IFX_Font::LoadFont(pFontStream, this, bSaveStream);
+  if (pFont != NULL) {
+    m_Fonts.Add(pFont);
+    m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont);
+    if (pszFontAlias != NULL) {
+      FX_DWORD dwHash =
+          FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
+      m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    }
+    return LoadFont(pFont, dwFontStyles, wCodePage);
+  }
+  return NULL;
+}
+IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font* pSrcFont,
+                                      FX_DWORD dwFontStyles,
+                                      FX_WORD wCodePage) {
+  FXSYS_assert(pSrcFont != NULL);
+  if (pSrcFont->GetFontStyles() == dwFontStyles) {
+    return pSrcFont->Retain();
+  }
+  void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles,
+                     (void*)(uintptr_t)wCodePage};
+  FX_DWORD dwHash =
+      FX_HashCode_String_GetA((const FX_CHAR*)buffer, 3 * sizeof(void*));
+  IFX_Font* pFont = NULL;
+  if (m_DeriveFonts.GetCount() > 0) {
+    m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont);
+    if (pFont != NULL) {
+      return pFont->Retain();
+    }
+  }
+  pFont = pSrcFont->Derive(dwFontStyles, wCodePage);
+  if (pFont != NULL) {
+    m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
+    int32_t index = m_Fonts.Find(pFont);
+    if (index < 0) {
+      m_Fonts.Add(pFont);
+      pFont->Retain();
+    }
+    return pFont;
+  }
+  return NULL;
+}
+void CFX_StdFontMgrImp::ClearFontCache() {
+  int32_t iCount = m_Fonts.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    IFX_Font* pFont = (IFX_Font*)m_Fonts[i];
+    if (pFont != NULL) {
+      pFont->Reset();
+    }
+  }
+}
+void CFX_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap, IFX_Font* pFont) {
+  FX_POSITION pos = fontMap.GetStartPosition();
+  void* pKey;
+  void* pFind;
+  while (pos != NULL) {
+    pFind = NULL;
+    fontMap.GetNextAssoc(pos, pKey, pFind);
+    if (pFind != (void*)pFont) {
+      continue;
+    }
+    fontMap.RemoveKey(pKey);
+    break;
+  }
+}
+void CFX_StdFontMgrImp::RemoveFont(IFX_Font* pFont) {
+  RemoveFont(m_CPFonts, pFont);
+  RemoveFont(m_FamilyFonts, pFont);
+  RemoveFont(m_UnicodeFonts, pFont);
+  RemoveFont(m_BufferFonts, pFont);
+  RemoveFont(m_FileFonts, pFont);
+  RemoveFont(m_StreamFonts, pFont);
+  RemoveFont(m_DeriveFonts, pFont);
+  int32_t iFind = m_Fonts.Find(pFont);
+  if (iFind > -1) {
+    m_Fonts.RemoveAt(iFind, 1);
+  }
+}
+FX_LPCFONTDESCRIPTOR CFX_StdFontMgrImp::FindFont(const FX_WCHAR* pszFontFamily,
+                                                 FX_DWORD dwFontStyles,
+                                                 FX_DWORD dwMatchFlags,
+                                                 FX_WORD wCodePage,
+                                                 FX_DWORD dwUSB,
+                                                 FX_WCHAR wUnicode) {
+  if (m_pMatcher == NULL) {
+    return NULL;
+  }
+  FX_FONTMATCHPARAMS params;
+  FXSYS_memset(&params, 0, sizeof(params));
+  params.dwUSB = dwUSB;
+  params.wUnicode = wUnicode;
+  params.wCodePage = wCodePage;
+  params.pwsFamily = pszFontFamily;
+  params.dwFontStyles = dwFontStyles;
+  params.dwMatchFlags = dwMatchFlags;
+  FX_LPCFONTDESCRIPTOR pDesc = m_pMatcher(&params, m_FontFaces, m_pUserData);
+  if (pDesc) {
+    return pDesc;
+  }
+  if (pszFontFamily && m_pEnumerator) {
+    CFX_FontDescriptors namedFonts;
+    m_pEnumerator(namedFonts, m_pUserData, pszFontFamily, wUnicode);
+    params.pwsFamily = NULL;
+    pDesc = m_pMatcher(&params, namedFonts, m_pUserData);
+    if (pDesc == NULL) {
+      return NULL;
+    }
+    for (int32_t i = m_FontFaces.GetSize() - 1; i >= 0; i--) {
+      FX_LPCFONTDESCRIPTOR pMatch = m_FontFaces.GetPtrAt(i);
+      if (*pMatch == *pDesc) {
+        return pMatch;
+      }
+    }
+    int index = m_FontFaces.Add(*pDesc);
+    return m_FontFaces.GetPtrAt(index);
+  }
+  return NULL;
+}
+FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
+                                       const CFX_FontDescriptors& fonts,
+                                       void* pUserData) {
+  FX_LPCFONTDESCRIPTOR pBestFont = NULL;
+  int32_t iBestSimilar = 0;
+  FX_BOOL bMatchStyle =
+      (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0;
+  int32_t iCount = fonts.GetSize();
+  for (int32_t i = 0; i < iCount; ++i) {
+    FX_LPCFONTDESCRIPTOR pFont = fonts.GetPtrAt(i);
+    if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) ==
+        FX_FONTSTYLE_BoldItalic) {
+      continue;
+    }
+    if (pParams->pwsFamily) {
+      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace)) {
+        continue;
+      }
+      if (pFont->uCharSet == FX_CHARSET_Symbol) {
+        return pFont;
+      }
+    }
+    if (pFont->uCharSet == FX_CHARSET_Symbol) {
+      continue;
+    }
+    if (pParams->wCodePage != 0xFFFF) {
+      if (FX_GetCodePageFromCharset(pFont->uCharSet) != pParams->wCodePage) {
+        continue;
+      }
+    } else {
+      if (pParams->dwUSB < 128) {
+        FX_DWORD dwByte = pParams->dwUSB / 32;
+        FX_DWORD dwUSB = 1 << (pParams->dwUSB % 32);
+        if ((pFont->FontSignature.fsUsb[dwByte] & dwUSB) == 0) {
+          continue;
+        }
+      }
+    }
+    if (bMatchStyle) {
+      if ((pFont->dwFontStyles & 0x0F) == (pParams->dwFontStyles & 0x0F)) {
+        return pFont;
+      } else {
+        continue;
+      }
+    }
+    if (pParams->pwsFamily != NULL) {
+      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) {
+        return pFont;
+      }
+    }
+    int32_t iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles);
+    if (iBestSimilar < iSimilarValue) {
+      iBestSimilar = iSimilarValue;
+      pBestFont = pFont;
+    }
+  }
+  return iBestSimilar < 1 ? NULL : pBestFont;
+}
+int32_t FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles) {
+  int32_t iValue = 0;
+  if ((dwFontStyles & FX_FONTSTYLE_Symbolic) ==
+      (pFont->dwFontStyles & FX_FONTSTYLE_Symbolic)) {
+    iValue += 64;
+  }
+  if ((dwFontStyles & FX_FONTSTYLE_FixedPitch) ==
+      (pFont->dwFontStyles & FX_FONTSTYLE_FixedPitch)) {
+    iValue += 32;
+  }
+  if ((dwFontStyles & FX_FONTSTYLE_Serif) ==
+      (pFont->dwFontStyles & FX_FONTSTYLE_Serif)) {
+    iValue += 16;
+  }
+  if ((dwFontStyles & FX_FONTSTYLE_Script) ==
+      (pFont->dwFontStyles & FX_FONTSTYLE_Script)) {
+    iValue += 8;
+  }
+  return iValue;
+}
+FX_LPMatchFont FX_GetDefFontMatchor() {
+  return FX_DefFontMatcher;
+}
+FX_DWORD FX_GetGdiFontStyles(const LOGFONTW& lf) {
+  FX_DWORD dwStyles = 0;
+  if ((lf.lfPitchAndFamily & 0x03) == FIXED_PITCH) {
+    dwStyles |= FX_FONTSTYLE_FixedPitch;
+  }
+  uint8_t nFamilies = lf.lfPitchAndFamily & 0xF0;
+  if (nFamilies == FF_ROMAN) {
+    dwStyles |= FX_FONTSTYLE_Serif;
+  }
+  if (nFamilies == FF_SCRIPT) {
+    dwStyles |= FX_FONTSTYLE_Script;
+  }
+  if (lf.lfCharSet == SYMBOL_CHARSET) {
+    dwStyles |= FX_FONTSTYLE_Symbolic;
+  }
+  return dwStyles;
+}
+static int32_t CALLBACK FX_GdiFontEnumProc(ENUMLOGFONTEX* lpelfe,
+                                           NEWTEXTMETRICEX* lpntme,
+                                           DWORD dwFontType,
+                                           LPARAM lParam) {
+  if (dwFontType != TRUETYPE_FONTTYPE) {
+    return 1;
+  }
+  const LOGFONTW& lf = ((LPENUMLOGFONTEXW)lpelfe)->elfLogFont;
+  if (lf.lfFaceName[0] == L'@') {
+    return 1;
+  }
+  FX_LPFONTDESCRIPTOR pFont = FX_Alloc(FX_FONTDESCRIPTOR, 1);
+  FXSYS_memset(pFont, 0, sizeof(FX_FONTDESCRIPTOR));
+  pFont->uCharSet = lf.lfCharSet;
+  pFont->dwFontStyles = FX_GetGdiFontStyles(lf);
+  FXSYS_wcsncpy(pFont->wsFontFace, (const FX_WCHAR*)lf.lfFaceName, 31);
+  pFont->wsFontFace[31] = 0;
+  FXSYS_memcpy(&pFont->FontSignature, &lpntme->ntmFontSig,
+               sizeof(lpntme->ntmFontSig));
+  ((CFX_FontDescriptors*)lParam)->Add(*pFont);
+  FX_Free(pFont);
+  return 1;
+}
+static void FX_EnumGdiFonts(CFX_FontDescriptors& fonts,
+                            void* pUserData,
+                            const FX_WCHAR* pwsFaceName,
+                            FX_WCHAR wUnicode) {
+  HDC hDC = ::GetDC(NULL);
+  LOGFONTW lfFind;
+  FXSYS_memset(&lfFind, 0, sizeof(lfFind));
+  lfFind.lfCharSet = DEFAULT_CHARSET;
+  if (pwsFaceName) {
+    FXSYS_wcsncpy((FX_WCHAR*)lfFind.lfFaceName, pwsFaceName, 31);
+    lfFind.lfFaceName[31] = 0;
+  }
+  EnumFontFamiliesExW(hDC, (LPLOGFONTW)&lfFind,
+                      (FONTENUMPROCW)FX_GdiFontEnumProc, (LPARAM)&fonts, 0);
+  ::ReleaseDC(NULL, hDC);
+}
+FX_LPEnumAllFonts FX_GetDefFontEnumerator() {
+  return FX_EnumGdiFonts;
+}
+#else
+const FX_CHAR* g_FontFolders[] = {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+    "/usr/share/fonts", "/usr/share/X11/fonts/Type1",
+    "/usr/share/X11/fonts/TTF", "/usr/local/share/fonts",
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+    "~/Library/Fonts", "/Library/Fonts", "/System/Library/Fonts",
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+    "/system/fonts",
+#endif
+};
+
+CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() {
+  for (size_t i = 0; i < FX_ArraySize(g_FontFolders); ++i)
+    m_FolderPaths.Add(g_FontFolders[i]);
+}
+
+CFX_ByteString CFX_FontSourceEnum_File::GetNextFile() {
+Restart:
+  void* pCurHandle =
+      m_FolderQueue.GetSize() == 0
+          ? NULL
+          : m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle;
+  if (NULL == pCurHandle) {
+    if (m_FolderPaths.GetSize() < 1) {
+      return "";
+    }
+    pCurHandle = FX_OpenFolder(m_FolderPaths[m_FolderPaths.GetSize() - 1]);
+    FX_HandleParentPath hpp;
+    hpp.pFileHandle = pCurHandle;
+    hpp.bsParentPath = m_FolderPaths[m_FolderPaths.GetSize() - 1];
+    m_FolderQueue.Add(hpp);
+  }
+  CFX_ByteString bsName;
+  FX_BOOL bFolder;
+  CFX_ByteString bsFolderSpearator =
+      CFX_ByteString::FromUnicode(CFX_WideString(FX_GetFolderSeparator()));
+  while (TRUE) {
+    if (!FX_GetNextFile(pCurHandle, bsName, bFolder)) {
+      FX_CloseFolder(pCurHandle);
+      m_FolderQueue.RemoveAt(m_FolderQueue.GetSize() - 1);
+      if (m_FolderQueue.GetSize() == 0) {
+        m_FolderPaths.RemoveAt(m_FolderPaths.GetSize() - 1);
+        if (m_FolderPaths.GetSize() == 0) {
+          return "";
+        } else {
+          goto Restart;
+        }
+      }
+      pCurHandle =
+          m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle;
+      continue;
+    }
+    if (bsName == "." || bsName == "..") {
+      continue;
+    }
+    if (bFolder) {
+      FX_HandleParentPath hpp;
+      hpp.bsParentPath =
+          m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
+          bsFolderSpearator + bsName;
+      hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath);
+      if (hpp.pFileHandle == NULL) {
+        continue;
+      }
+      m_FolderQueue.Add(hpp);
+      pCurHandle = hpp.pFileHandle;
+      continue;
+    }
+    bsName =
+        m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
+        bsFolderSpearator + bsName;
+    break;
+  }
+  return bsName;
+}
+FX_POSITION CFX_FontSourceEnum_File::GetStartPosition(void* pUserData) {
+  m_wsNext = GetNextFile().UTF8Decode();
+  if (0 == m_wsNext.GetLength()) {
+    return (FX_POSITION)0;
+  }
+  return (FX_POSITION)-1;
+}
+IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos,
+                                                 void* pUserData) {
+  IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext);
+  m_wsNext = GetNextFile().UTF8Decode();
+  pos = 0 != m_wsNext.GetLength() ? pAccess : NULL;
+  return (IFX_FileAccess*)pAccess;
+}
+IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum() {
+  return (IFX_FontSourceEnum*)new CFX_FontSourceEnum_File;
+}
+IFX_FontMgr* IFX_FontMgr::Create(IFX_FontSourceEnum* pFontEnum,
+                                 IFX_FontMgrDelegate* pDelegate,
+                                 void* pUserData) {
+  if (NULL == pFontEnum) {
+    return NULL;
+  }
+  CFX_FontMgrImp* pFontMgr =
+      new CFX_FontMgrImp(pFontEnum, pDelegate, pUserData);
+  if (pFontMgr->EnumFonts()) {
+    return pFontMgr;
+  }
+  delete pFontMgr;
+  return NULL;
+}
+CFX_FontMgrImp::CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum,
+                               IFX_FontMgrDelegate* pDelegate,
+                               void* pUserData)
+    : m_pFontSource(pFontEnum),
+      m_pDelegate(pDelegate),
+      m_pUserData(pUserData) {}
+
+FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() {
+  CFX_FontMapper* pFontMapper =
+      CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper();
+  if (!pFontMapper)
+    return FALSE;
+  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
+  if (!pSystemFontInfo)
+    return FALSE;
+  pSystemFontInfo->EnumFontList(pFontMapper);
+  for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
+    IFX_FileRead* pFontStream =
+        CreateFontStream(pFontMapper, pSystemFontInfo, i);
+    if (!pFontStream)
+      continue;
+    CFX_WideString wsFaceName =
+        CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str());
+    RegisterFaces(pFontStream, &wsFaceName);
+    pFontStream->Release();
+  }
+  if (m_InstalledFonts.GetSize() == 0)
+    return FALSE;
+  return TRUE;
+}
+FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() {
+  CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary();
+  FX_POSITION pos = m_pFontSource->GetStartPosition();
+  IFX_FileAccess* pFontSource = nullptr;
+  IFX_FileRead* pFontStream = nullptr;
+  while (pos) {
+    pFontSource = m_pFontSource->GetNext(pos);
+    pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly);
+    if (!pFontStream) {
+      pFontSource->Release();
+      continue;
+    }
+    RegisterFaces(pFontStream, nullptr);
+    pFontStream->Release();
+    pFontSource->Release();
+  }
+  if (m_InstalledFonts.GetSize() == 0)
+    return FALSE;
+  return TRUE;
+}
+FX_BOOL CFX_FontMgrImp::EnumFonts() {
+  if (EnumFontsFromFontMapper())
+    return TRUE;
+  return EnumFontsFromFiles();
+}
+void CFX_FontMgrImp::Release() {
+  for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) {
+    delete m_InstalledFonts[i];
+  }
+  FX_POSITION pos = m_Hash2CandidateList.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    CFX_FontDescriptorInfos* pDescs;
+    m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs);
+    if (NULL != pDescs) {
+      delete pDescs;
+    }
+  }
+  pos = m_Hash2Fonts.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    CFX_ArrayTemplate<IFX_Font*>* pFonts;
+    m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
+    if (NULL != pFonts) {
+      delete pFonts;
+    }
+  }
+  m_Hash2Fonts.RemoveAll();
+  pos = m_Hash2FileAccess.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    IFX_FileAccess* pFileAccess;
+    m_Hash2FileAccess.GetNextAssoc(pos, dwHash, pFileAccess);
+    if (NULL != pFileAccess) {
+      pFileAccess->Release();
+    }
+  }
+  pos = m_FileAccess2IFXFont.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    IFX_Font* pFont;
+    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont);
+    if (NULL != pFont) {
+      pFont->Release();
+    }
+  }
+  pos = m_IFXFont2FileRead.GetStartPosition();
+  while (pos) {
+    IFX_Font* pFont;
+    IFX_FileRead* pFileRead;
+    m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead);
+    pFileRead->Release();
+  }
+  delete this;
+}
+IFX_Font* CFX_FontMgrImp::GetDefFontByCodePage(FX_WORD wCodePage,
+                                               FX_DWORD dwFontStyles,
+                                               const FX_WCHAR* pszFontFamily) {
+  return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByCodePage(
+                                          this, wCodePage, dwFontStyles,
+                                          pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::GetDefFontByCharset(uint8_t nCharset,
+                                              FX_DWORD dwFontStyles,
+                                              const FX_WCHAR* pszFontFamily) {
+  return NULL == m_pDelegate ? NULL
+                             : m_pDelegate->GetDefFontByCharset(
+                                   this, nCharset, dwFontStyles, pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::GetDefFontByUnicode(FX_WCHAR wUnicode,
+                                              FX_DWORD dwFontStyles,
+                                              const FX_WCHAR* pszFontFamily) {
+  return NULL == m_pDelegate ? NULL
+                             : m_pDelegate->GetDefFontByUnicode(
+                                   this, wUnicode, dwFontStyles, pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(FX_WORD wLanguage,
+                                               FX_DWORD dwFontStyles,
+                                               const FX_WCHAR* pszFontFamily) {
+  return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByLanguage(
+                                          this, wLanguage, dwFontStyles,
+                                          pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::GetFontByCodePage(FX_WORD wCodePage,
+                                            FX_DWORD dwFontStyles,
+                                            const FX_WCHAR* pszFontFamily) {
+  CFX_ByteString bsHash;
+  bsHash.Format("%d, %d", wCodePage, dwFontStyles);
+  bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
+  FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
+  CFX_ArrayTemplate<IFX_Font*>* pFonts = NULL;
+  IFX_Font* pFont = NULL;
+  if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
+    if (NULL == pFonts) {
+      return NULL;
+    }
+    if (0 != pFonts->GetSize()) {
+      return pFonts->GetAt(0)->Retain();
+    }
+  }
+  if (!pFonts)
+    pFonts = new CFX_ArrayTemplate<IFX_Font*>;
+  m_Hash2Fonts.SetAt(dwHash, pFonts);
+  CFX_FontDescriptorInfos* sortedFonts = NULL;
+  if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
+    sortedFonts = new CFX_FontDescriptorInfos;
+    MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
+               CFX_WideString(pszFontFamily), 0);
+    m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
+  }
+  if (sortedFonts->GetSize() == 0) {
+    return NULL;
+  }
+  CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont;
+  if (pDesc->m_pFileAccess)
+    pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr);
+  else
+    pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
+  if (NULL != pFont) {
+    pFont->SetLogicalFontStyle(dwFontStyles);
+  }
+  pFonts->Add(pFont);
+  return pFont;
+}
+IFX_Font* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset,
+                                           FX_DWORD dwFontStyles,
+                                           const FX_WCHAR* pszFontFamily) {
+  return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
+                           pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode,
+                                           FX_DWORD dwFontStyles,
+                                           const FX_WCHAR* pszFontFamily) {
+  IFX_Font* pFont = nullptr;
+  if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont))
+    return nullptr;
+  const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode);
+  FX_WORD wCodePage = x ? x->wCodePage : 0xFFFF;
+  FX_WORD wBitField = x ? x->wBitField : 0x03E7;
+  CFX_ByteString bsHash;
+  if (wCodePage == 0xFFFF)
+    bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles);
+  else
+    bsHash.Format("%d, %d", wCodePage, dwFontStyles);
+  bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
+  FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
+  CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr;
+  if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
+    if (!pFonts)
+      return nullptr;
+    for (int32_t i = 0; i < pFonts->GetSize(); ++i) {
+      if (VerifyUnicode(pFonts->GetAt(i), wUnicode))
+        return pFonts->GetAt(i)->Retain();
+    }
+  }
+  if (!pFonts)
+    pFonts = new CFX_ArrayTemplate<IFX_Font*>;
+  m_Hash2Fonts.SetAt(dwHash, pFonts);
+  CFX_FontDescriptorInfos* sortedFonts = nullptr;
+  if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
+    sortedFonts = new CFX_FontDescriptorInfos;
+    MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
+               CFX_WideString(pszFontFamily), wUnicode);
+    m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
+  }
+  for (int32_t i = 0; i < sortedFonts->GetSize(); ++i) {
+    CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont;
+    if (!VerifyUnicode(pDesc, wUnicode))
+      continue;
+    if (pDesc->m_pFileAccess)
+      pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr);
+    else
+      pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
+    if (!pFont)
+      continue;
+    pFont->SetLogicalFontStyle(dwFontStyles);
+    pFonts->Add(pFont);
+    return pFont;
+  }
+  if (!pszFontFamily)
+    m_FailedUnicodes2NULL.SetAt(wUnicode, nullptr);
+  return nullptr;
+}
+FX_BOOL CFX_FontMgrImp::VerifyUnicode(CFX_FontDescriptor* pDesc,
+                                      FX_WCHAR wcUnicode) {
+  IFX_FileRead* pFileRead = nullptr;
+  if (pDesc->m_pFileAccess)
+    pFileRead = pDesc->m_pFileAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
+  else
+    pFileRead = CreateFontStream(pDesc->m_wsFaceName.UTF8Encode());
+  if (!pFileRead)
+    return FALSE;
+  FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex);
+  FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE);
+  FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode);
+  pFileRead->Release();
+  if (!pFace)
+    return FALSE;
+  if (FXFT_Get_Face_External_Stream(pFace))
+    FXFT_Clear_Face_External_Stream(pFace);
+  FXFT_Done_Face(pFace);
+  return !retCharmap && retIndex;
+}
+FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) {
+  if (NULL == pFont) {
+    return FALSE;
+  }
+  FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace();
+  FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace);
+  if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) {
+    return FALSE;
+  }
+  if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) {
+    FXFT_Set_Charmap(pFace, charmap);
+    return FALSE;
+  }
+  return TRUE;
+}
+IFX_Font* CFX_FontMgrImp::GetFontByLanguage(FX_WORD wLanguage,
+                                            FX_DWORD dwFontStyles,
+                                            const FX_WCHAR* pszFontFamily) {
+  return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles,
+                           pszFontFamily);
+}
+IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer,
+                                   int32_t iLength,
+                                   int32_t iFaceIndex,
+                                   int32_t* pFaceCount) {
+  void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength};
+  FX_DWORD dwHash =
+      FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*));
+  IFX_FileAccess* pFontAccess = NULL;
+  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
+  }
+  if (NULL != pFontAccess) {
+    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
+  } else {
+    return NULL;
+  }
+}
+IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName,
+                                   int32_t iFaceIndex,
+                                   int32_t* pFaceCount) {
+  CFX_ByteString bsHash;
+  bsHash += CFX_WideString(pszFileName).UTF8Encode();
+  FX_DWORD dwHash =
+      FX_HashCode_String_GetA((const FX_CHAR*)bsHash, bsHash.GetLength());
+  IFX_FileAccess* pFontAccess = NULL;
+  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
+    pFontAccess = FX_CreateDefaultFileAccess(pszFileName);
+    m_Hash2FileAccess.SetAt(dwHash, pFontAccess);
+  }
+  if (NULL != pFontAccess) {
+    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
+  } else {
+    return NULL;
+  }
+}
+IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream,
+                                   int32_t iFaceIndex,
+                                   int32_t* pFaceCount,
+                                   FX_BOOL bSaveStream) {
+  void* Hash[1] = {(void*)(uintptr_t)pFontStream};
+  FX_DWORD dwHash =
+      FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*));
+  IFX_FileAccess* pFontAccess = NULL;
+  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
+  }
+  if (NULL != pFontAccess) {
+    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
+  } else {
+    return NULL;
+  }
+}
+IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess,
+                                   int32_t iFaceIndex,
+                                   int32_t* pFaceCount,
+                                   FX_BOOL bWantCache) {
+  FX_DWORD dwHash = 0;
+  IFX_Font* pFont = NULL;
+  if (bWantCache) {
+    CFX_ByteString bsHash;
+    bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex);
+    dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
+    if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) {
+      if (NULL != pFont) {
+        if (NULL != pFaceCount) {
+          *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
+        }
+        return pFont->Retain();
+      }
+    }
+  }
+  CFX_Font* pInternalFont = new CFX_Font;
+  IFX_FileRead* pFontStream =
+      pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
+  if (NULL == pFontStream) {
+    delete pInternalFont;
+    return NULL;
+  }
+  if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
+    delete pInternalFont;
+    pFontStream->Release();
+    return NULL;
+  }
+  pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE);
+  if (NULL == pFont) {
+    delete pInternalFont;
+    pFontStream->Release();
+    return NULL;
+  }
+  if (bWantCache) {
+    m_FileAccess2IFXFont.SetAt(dwHash, pFont);
+  }
+  m_IFXFont2FileRead.SetAt(pFont, pFontStream);
+  if (NULL != pFaceCount) {
+    *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
+  }
+  return pFont;
+}
+IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName,
+                                   int32_t iFaceIndex,
+                                   int32_t* pFaceCount) {
+  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
+  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
+  if (!pFontMapper)
+    return nullptr;
+  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
+  if (!pSystemFontInfo)
+    return nullptr;
+  IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode());
+  if (!pFontStream)
+    return nullptr;
+  if (!LoadFace(pFontStream, 0)) {
+    pFontStream->Release();
+    return nullptr;
+  }
+  CFX_Font* pInternalFont = new CFX_Font();
+  if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
+    pFontStream->Release();
+    return nullptr;
+  }
+  IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE);
+  if (!pFont) {
+    pFontStream->Release();
+    return nullptr;
+  }
+  m_IFXFont2FileRead.SetAt(pFont, pFontStream);
+  if (pFaceCount)
+    *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
+  return pFont;
+}
+extern "C" {
+unsigned long _ftStreamRead(FXFT_Stream stream,
+                            unsigned long offset,
+                            unsigned char* buffer,
+                            unsigned long count) {
+  if (count == 0) {
+    return 0;
+  }
+  IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
+  int res = pFile->ReadBlock(buffer, offset, count);
+  if (res) {
+    return count;
+  }
+  return 0;
+}
+void _ftStreamClose(FXFT_Stream stream) {}
+};
+
+FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
+                                   int32_t iFaceIndex) {
+  if (!pFontStream)
+    return nullptr;
+
+  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
+  pFontMgr->InitFTLibrary();
+  FXFT_Library library = pFontMgr->GetFTLibrary();
+  if (!library)
+    return nullptr;
+
+  FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1);
+  FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec));
+  ftStream->base = NULL;
+  ftStream->descriptor.pointer = pFontStream;
+  ftStream->pos = 0;
+  ftStream->size = (unsigned long)pFontStream->GetSize();
+  ftStream->read = _ftStreamRead;
+  ftStream->close = _ftStreamClose;
+
+  FXFT_Open_Args ftArgs;
+  FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args));
+  ftArgs.flags |= FT_OPEN_STREAM;
+  ftArgs.stream = ftStream;
+
+  FXFT_Face pFace = NULL;
+  if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) {
+    FX_Free(ftStream);
+    return nullptr;
+  }
+
+  FXFT_Set_Pixel_Sizes(pFace, 0, 64);
+  return pFace;
+}
+
+IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
+    CFX_FontMapper* pFontMapper,
+    IFX_SystemFontInfo* pSystemFontInfo,
+    FX_DWORD index) {
+  int iExact = 0;
+  void* hFont = pSystemFontInfo->MapFont(
+      0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact);
+  if (!hFont)
+    return nullptr;
+  FX_DWORD dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0);
+  if (dwFileSize == 0)
+    return nullptr;
+  uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1);
+  dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize);
+  return FX_CreateMemoryStream(pBuffer, dwFileSize, TRUE);
+}
+
+IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
+    const CFX_ByteString& bsFaceName) {
+  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
+  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
+  if (!pFontMapper)
+    return nullptr;
+  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
+  if (!pSystemFontInfo)
+    return nullptr;
+  pSystemFontInfo->EnumFontList(pFontMapper);
+  for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
+    if (pFontMapper->GetFaceName(i) == bsFaceName)
+      return CreateFontStream(pFontMapper, pSystemFontInfo, i);
+  }
+  return nullptr;
+}
+int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
+                                   FX_WORD wCodePage,
+                                   FX_DWORD dwFontStyles,
+                                   const CFX_WideString& FontName,
+                                   FX_WCHAR wcUnicode) {
+  MatchedFonts.RemoveAll();
+  CFX_WideString wsNormalizedFontName = FontName;
+  static const int32_t nMax = 0xffff;
+  CFX_FontDescriptor* pFont = NULL;
+  int32_t nCount = m_InstalledFonts.GetSize();
+  for (int32_t i = 0; i < nCount; i++) {
+    pFont = m_InstalledFonts[i];
+    int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles,
+                                   wsNormalizedFontName, wcUnicode);
+    if (nPenalty >= 0xFFFF) {
+      continue;
+    }
+    FX_FontDescriptorInfo FontInfo;
+    FontInfo.pFont = pFont;
+    FontInfo.nPenalty = nPenalty;
+    MatchedFonts.Add(FontInfo);
+    if (MatchedFonts.GetSize() == nMax) {
+      break;
+    }
+  }
+  if (MatchedFonts.GetSize() == 0) {
+    return 0;
+  }
+  CFX_SSortTemplate<FX_FontDescriptorInfo> ssort;
+  ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize());
+  return MatchedFonts.GetSize();
+}
+struct FX_BitCodePage {
+  FX_WORD wBit;
+  FX_WORD wCodePage;
+};
+static const FX_BitCodePage g_Bit2CodePage[] = {
+    {0, 1252}, {1, 1250}, {2, 1251}, {3, 1253},  {4, 1254}, {5, 1255},
+    {6, 1256}, {7, 1257}, {8, 1258}, {9, 0},     {10, 0},   {11, 0},
+    {12, 0},   {13, 0},   {14, 0},   {15, 0},    {16, 874}, {17, 932},
+    {18, 936}, {19, 949}, {20, 950}, {21, 1361}, {22, 0},   {23, 0},
+    {24, 0},   {25, 0},   {26, 0},   {27, 0},    {28, 0},   {29, 0},
+    {30, 0},   {31, 0},   {32, 0},   {33, 0},    {34, 0},   {35, 0},
+    {36, 0},   {37, 0},   {38, 0},   {39, 0},    {40, 0},   {41, 0},
+    {42, 0},   {43, 0},   {44, 0},   {45, 0},    {46, 0},   {47, 0},
+    {48, 869}, {49, 866}, {50, 865}, {51, 864},  {52, 863}, {53, 862},
+    {54, 861}, {55, 860}, {56, 857}, {57, 855},  {58, 852}, {59, 775},
+    {60, 737}, {61, 708}, {62, 850}, {63, 437},
+};
+
+FX_WORD FX_GetCodePageBit(FX_WORD wCodePage) {
+  for (size_t i = 0; i < FX_ArraySize(g_Bit2CodePage); ++i) {
+    if (g_Bit2CodePage[i].wCodePage == wCodePage)
+      return g_Bit2CodePage[i].wBit;
+  }
+  return (FX_WORD)-1;
+}
+
+FX_WORD FX_GetUnicodeBit(FX_WCHAR wcUnicode) {
+  const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wcUnicode);
+  return x ? x->wBitField : 999;
+}
+
+int32_t CFX_FontMgrImp::CalcPenalty(CFX_FontDescriptor* pInstalled,
+                                    FX_WORD wCodePage,
+                                    FX_DWORD dwFontStyles,
+                                    const CFX_WideString& FontName,
+                                    FX_WCHAR wcUnicode) {
+  int32_t nPenalty = 30000;
+  if (0 != FontName.GetLength()) {
+    if (FontName != pInstalled->m_wsFaceName) {
+      int32_t i;
+      for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) {
+        if (pInstalled->m_wsFamilyNames[i] == FontName) {
+          break;
+        }
+      }
+      if (i == pInstalled->m_wsFamilyNames.GetSize()) {
+        nPenalty += 0xFFFF;
+      } else {
+        nPenalty -= 28000;
+      }
+    } else {
+      nPenalty -= 30000;
+    }
+    if (30000 == nPenalty &&
+        0 == IsPartName(pInstalled->m_wsFaceName, FontName)) {
+      int32_t i;
+      for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) {
+        if (0 != IsPartName(pInstalled->m_wsFamilyNames[i], FontName)) {
+          break;
+        }
+      }
+      if (i == pInstalled->m_wsFamilyNames.GetSize()) {
+        nPenalty += 0xFFFF;
+      } else {
+        nPenalty -= 26000;
+      }
+    } else {
+      nPenalty -= 27000;
+    }
+  }
+  FX_DWORD dwStyleMask = pInstalled->m_dwFontStyles ^ dwFontStyles;
+  if (dwStyleMask & FX_FONTSTYLE_Bold) {
+    nPenalty += 4500;
+  }
+  if (dwStyleMask & FX_FONTSTYLE_FixedPitch) {
+    nPenalty += 10000;
+  }
+  if (dwStyleMask & FX_FONTSTYLE_Italic) {
+    nPenalty += 10000;
+  }
+  if (dwStyleMask & FX_FONTSTYLE_Serif) {
+    nPenalty += 500;
+  }
+  if (dwStyleMask & FX_FONTSTYLE_Symbolic) {
+    nPenalty += 0xFFFF;
+  }
+  if (nPenalty >= 0xFFFF) {
+    return 0xFFFF;
+  }
+  FX_WORD wBit =
+      ((0 == wCodePage || 0xFFFF == wCodePage) ? (FX_WORD)-1
+                                               : FX_GetCodePageBit(wCodePage));
+  if (wBit != (FX_WORD)-1) {
+    FXSYS_assert(wBit < 64);
+    if (0 == (pInstalled->m_dwCsb[wBit / 32] & (1 << (wBit % 32)))) {
+      nPenalty += 0xFFFF;
+    } else {
+      nPenalty -= 60000;
+    }
+  }
+  wBit =
+      ((0 == wcUnicode || 0xFFFE == wcUnicode) ? (FX_WORD)999
+                                               : FX_GetUnicodeBit(wcUnicode));
+  if (wBit != (FX_WORD)999) {
+    FXSYS_assert(wBit < 128);
+    if (0 == (pInstalled->m_dwUsb[wBit / 32] & (1 << (wBit % 32)))) {
+      nPenalty += 0xFFFF;
+    } else {
+      nPenalty -= 60000;
+    }
+  }
+  return nPenalty;
+}
+void CFX_FontMgrImp::ClearFontCache() {
+  FX_POSITION pos = m_Hash2CandidateList.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    CFX_FontDescriptorInfos* pDescs;
+    m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs);
+    if (NULL != pDescs) {
+      delete pDescs;
+    }
+  }
+  pos = m_FileAccess2IFXFont.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    IFX_Font* pFont;
+    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont);
+    if (NULL != pFont) {
+      pFont->Release();
+    }
+  }
+  pos = m_IFXFont2FileRead.GetStartPosition();
+  while (pos) {
+    IFX_Font* pFont;
+    IFX_FileRead* pFileRead;
+    m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead);
+    pFileRead->Release();
+  }
+}
+void CFX_FontMgrImp::RemoveFont(IFX_Font* pEFont) {
+  if (NULL == pEFont) {
+    return;
+  }
+  IFX_FileRead* pFileRead;
+  if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) {
+    pFileRead->Release();
+    m_IFXFont2FileRead.RemoveKey(pEFont);
+  }
+  FX_POSITION pos;
+  pos = m_FileAccess2IFXFont.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    IFX_Font* pCFont;
+    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pCFont);
+    if (pCFont == pEFont) {
+      m_FileAccess2IFXFont.RemoveKey(dwHash);
+      break;
+    }
+  }
+  pos = m_Hash2Fonts.GetStartPosition();
+  while (pos) {
+    FX_DWORD dwHash;
+    CFX_ArrayTemplate<IFX_Font*>* pFonts;
+    m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
+    if (NULL != pFonts) {
+      for (int32_t i = 0; i < pFonts->GetSize(); i++) {
+        if (pFonts->GetAt(i) == pEFont) {
+          pFonts->SetAt(i, NULL);
+        }
+      }
+    } else {
+      m_Hash2Fonts.RemoveKey(dwHash);
+    }
+  }
+}
+void CFX_FontMgrImp::RegisterFace(FXFT_Face pFace,
+                                  CFX_FontDescriptors& Fonts,
+                                  const CFX_WideString* pFaceName,
+                                  IFX_FileAccess* pFontAccess) {
+  if (0 == (pFace->face_flags & FT_FACE_FLAG_SCALABLE)) {
+    return;
+  }
+  CFX_FontDescriptor* pFont = new CFX_FontDescriptor;
+  pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0;
+  pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0;
+  pFont->m_dwFontStyles |= GetFlags(pFace);
+  CFX_WordArray Charsets;
+  GetCharsets(pFace, Charsets);
+  GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb);
+  unsigned long nLength = 0;
+  FT_ULong dwTag;
+  uint8_t* pTable = NULL;
+  FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e');
+  unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, NULL, &nLength);
+  if (0 == error && 0 != nLength) {
+    pTable = FX_Alloc(uint8_t, nLength);
+    error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, NULL);
+    if (0 != error) {
+      FX_Free(pTable);
+      pTable = NULL;
+    }
+  }
+  GetNames(pTable, pFont->m_wsFamilyNames);
+  if (NULL != pTable) {
+    FX_Free(pTable);
+  }
+  pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode());
+  if (pFaceName) {
+    pFont->m_wsFaceName = *pFaceName;
+  } else {
+    pFont->m_wsFaceName =
+        CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
+  }
+  pFont->m_nFaceIndex = pFace->face_index;
+  if (pFontAccess)
+    pFont->m_pFileAccess = pFontAccess->Retain();
+  else
+    pFont->m_pFileAccess = nullptr;
+  Fonts.Add(pFont);
+}
+void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream,
+                                   const CFX_WideString* pFaceName) {
+  int32_t index = 0;
+  int32_t num_faces = 0;
+  do {
+    FXFT_Face pFace = LoadFace(pFontStream, index++);
+    if (!pFace)
+      continue;
+    // All faces keep number of faces. It can be retrieved from any one face.
+    if (!num_faces)
+      num_faces = pFace->num_faces;
+    RegisterFace(pFace, m_InstalledFonts, pFaceName, nullptr);
+    if (FXFT_Get_Face_External_Stream(pFace))
+      FXFT_Clear_Face_External_Stream(pFace);
+    FXFT_Done_Face(pFace);
+  } while (index < num_faces);
+}
+FX_DWORD CFX_FontMgrImp::GetFlags(FXFT_Face pFace) {
+  FX_DWORD flag = 0;
+  if (FT_IS_FIXED_WIDTH(pFace)) {
+    flag |= FX_FONTSTYLE_FixedPitch;
+  }
+  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
+  if (!pOS2) {
+    return flag;
+  }
+  if (pOS2->ulCodePageRange1 & (1 << 31)) {
+    flag |= FX_FONTSTYLE_Symbolic;
+  }
+  if (pOS2->panose[0] == 2) {
+    uint8_t uSerif = pOS2->panose[1];
+    if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {
+      flag |= FX_FONTSTYLE_Serif;
+    }
+  }
+  return flag;
+}
+#define GetUInt8(p) ((uint8_t)((p)[0]))
+#define GetUInt16(p) ((uint16_t)((p)[0] << 8 | (p)[1]))
+#define GetUInt32(p) \
+  ((uint32_t)((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3]))
+void CFX_FontMgrImp::GetNames(const uint8_t* name_table,
+                              CFX_WideStringArray& Names) {
+  if (NULL == name_table) {
+    return;
+  }
+  uint8_t* lpTable = (uint8_t*)name_table;
+  CFX_WideString wsFamily;
+  uint8_t* sp = lpTable + 2;
+  uint8_t* lpNameRecord = lpTable + 6;
+  uint16_t nNameCount = GetUInt16(sp);
+  uint8_t* lpStr = lpTable + GetUInt16(sp + 2);
+  for (uint16_t j = 0; j < nNameCount; j++) {
+    uint16_t nNameID = GetUInt16(lpNameRecord + j * 12 + 6);
+    if (nNameID != 1) {
+      continue;
+    }
+    uint16_t nPlatformID = GetUInt16(lpNameRecord + j * 12 + 0);
+    uint16_t nNameLength = GetUInt16(lpNameRecord + j * 12 + 8);
+    uint16_t nNameOffset = GetUInt16(lpNameRecord + j * 12 + 10);
+    wsFamily.Empty();
+    if (nPlatformID != 1) {
+      for (uint16_t k = 0; k < nNameLength / 2; k++) {
+        FX_WCHAR wcTemp = GetUInt16(lpStr + nNameOffset + k * 2);
+        wsFamily += wcTemp;
+      }
+      Names.Add(wsFamily);
+    } else {
+      for (uint16_t k = 0; k < nNameLength; k++) {
+        FX_WCHAR wcTemp = GetUInt8(lpStr + nNameOffset + k);
+        wsFamily += wcTemp;
+      }
+      Names.Add(wsFamily);
+    }
+  }
+}
+#undef GetUInt8
+#undef GetUInt16
+#undef GetUInt32
+struct FX_BIT2CHARSET {
+  FX_WORD wBit;
+  FX_WORD wCharset;
+};
+FX_BIT2CHARSET g_FX_Bit2Charset1[16] = {
+    {1 << 0, FX_CHARSET_ANSI},
+    {1 << 1, FX_CHARSET_MSWin_EasterEuropean},
+    {1 << 2, FX_CHARSET_MSWin_Cyrillic},
+    {1 << 3, FX_CHARSET_MSWin_Greek},
+    {1 << 4, FX_CHARSET_MSWin_Turkish},
+    {1 << 5, FX_CHARSET_MSWin_Hebrew},
+    {1 << 6, FX_CHARSET_MSWin_Arabic},
+    {1 << 7, FX_CHARSET_MSWin_Baltic},
+    {1 << 8, FX_CHARSET_MSWin_Vietnamese},
+    {1 << 9, FX_CHARSET_Default},
+    {1 << 10, FX_CHARSET_Default},
+    {1 << 11, FX_CHARSET_Default},
+    {1 << 12, FX_CHARSET_Default},
+    {1 << 13, FX_CHARSET_Default},
+    {1 << 14, FX_CHARSET_Default},
+    {1 << 15, FX_CHARSET_Default},
+};
+FX_BIT2CHARSET g_FX_Bit2Charset2[16] = {
+    {1 << 0, FX_CHARSET_Thai},
+    {1 << 1, FX_CHARSET_ShiftJIS},
+    {1 << 2, FX_CHARSET_ChineseSimplified},
+    {1 << 3, FX_CHARSET_Korean},
+    {1 << 4, FX_CHARSET_ChineseTriditional},
+    {1 << 5, FX_CHARSET_Johab},
+    {1 << 6, FX_CHARSET_Default},
+    {1 << 7, FX_CHARSET_Default},
+    {1 << 8, FX_CHARSET_Default},
+    {1 << 9, FX_CHARSET_Default},
+    {1 << 10, FX_CHARSET_Default},
+    {1 << 11, FX_CHARSET_Default},
+    {1 << 12, FX_CHARSET_Default},
+    {1 << 13, FX_CHARSET_Default},
+    {1 << 14, FX_CHARSET_OEM},
+    {1 << 15, FX_CHARSET_Symbol},
+};
+FX_BIT2CHARSET g_FX_Bit2Charset3[16] = {
+    {1 << 0, FX_CHARSET_Default},  {1 << 1, FX_CHARSET_Default},
+    {1 << 2, FX_CHARSET_Default},  {1 << 3, FX_CHARSET_Default},
+    {1 << 4, FX_CHARSET_Default},  {1 << 5, FX_CHARSET_Default},
+    {1 << 6, FX_CHARSET_Default},  {1 << 7, FX_CHARSET_Default},
+    {1 << 8, FX_CHARSET_Default},  {1 << 9, FX_CHARSET_Default},
+    {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default},
+    {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default},
+    {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_Default},
+};
+FX_BIT2CHARSET g_FX_Bit2Charset4[16] = {
+    {1 << 0, FX_CHARSET_Default},  {1 << 1, FX_CHARSET_Default},
+    {1 << 2, FX_CHARSET_Default},  {1 << 3, FX_CHARSET_Default},
+    {1 << 4, FX_CHARSET_Default},  {1 << 5, FX_CHARSET_Default},
+    {1 << 6, FX_CHARSET_Default},  {1 << 7, FX_CHARSET_Default},
+    {1 << 8, FX_CHARSET_Default},  {1 << 9, FX_CHARSET_Default},
+    {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default},
+    {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default},
+    {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_US},
+};
+#define CODEPAGERANGE_IMPLEMENT(n)                   \
+  for (int32_t i = 0; i < 16; i++) {                 \
+    if ((a##n & g_FX_Bit2Charset##n[i].wBit) != 0) { \
+      Charsets.Add(g_FX_Bit2Charset##n[i].wCharset); \
+    }                                                \
+  }
+void CFX_FontMgrImp::GetCharsets(FXFT_Face pFace, CFX_WordArray& Charsets) {
+  Charsets.RemoveAll();
+  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
+  if (NULL != pOS2) {
+    FX_WORD a1, a2, a3, a4;
+    a1 = pOS2->ulCodePageRange1 & 0x0000ffff;
+    CODEPAGERANGE_IMPLEMENT(1);
+    a2 = (pOS2->ulCodePageRange1 >> 16) & 0x0000ffff;
+    CODEPAGERANGE_IMPLEMENT(2);
+    a3 = pOS2->ulCodePageRange2 & 0x0000ffff;
+    CODEPAGERANGE_IMPLEMENT(3);
+    a4 = (pOS2->ulCodePageRange2 >> 16) & 0x0000ffff;
+    CODEPAGERANGE_IMPLEMENT(4);
+  } else {
+    Charsets.Add(FX_CHARSET_Default);
+  }
+}
+#undef CODEPAGERANGE_IMPLEMENT
+void CFX_FontMgrImp::GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB) {
+  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
+  if (NULL != pOS2) {
+    USB[0] = pOS2->ulUnicodeRange1;
+    USB[1] = pOS2->ulUnicodeRange2;
+    USB[2] = pOS2->ulUnicodeRange3;
+    USB[3] = pOS2->ulUnicodeRange4;
+    CSB[0] = pOS2->ulCodePageRange1;
+    CSB[1] = pOS2->ulCodePageRange2;
+  } else {
+    USB[0] = 0;
+    USB[1] = 0;
+    USB[2] = 0;
+    USB[3] = 0;
+    CSB[0] = 0;
+    CSB[1] = 0;
+  }
+}
+int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1,
+                                   const CFX_WideString& Name2) {
+  if (Name1.Find((const FX_WCHAR*)Name2) != -1) {
+    return 1;
+  }
+  return 0;
+}
+#endif
diff --git a/xfa/fgas/font/fgas_stdfontmgr.h b/xfa/fgas/font/fgas_stdfontmgr.h
new file mode 100644
index 0000000..e646c28
--- /dev/null
+++ b/xfa/fgas/font/fgas_stdfontmgr.h
@@ -0,0 +1,252 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_FONT_FGAS_STDFONTMGR_H_
+#define XFA_FGAS_FONT_FGAS_STDFONTMGR_H_
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "core/include/fxge/fx_freetype.h"
+#include "core/include/fxge/fx_ge.h"
+#include "third_party/freetype/include/freetype/fttypes.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+int32_t FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles);
+FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
+                                       const CFX_FontDescriptors& fonts,
+                                       void* pUserData);
+
+class CFX_StdFontMgrImp : public IFX_FontMgr {
+ public:
+  CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator,
+                    FX_LPMatchFont pMatcher,
+                    void* pUserData);
+  ~CFX_StdFontMgrImp();
+  virtual void Release() { delete this; }
+  virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage,
+                                         FX_DWORD dwFontStyles,
+                                         const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByCharset(uint8_t nCharset,
+                                        FX_DWORD dwFontStyles,
+                                        const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode,
+                                        FX_DWORD dwFontStyles,
+                                        const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage,
+                                         FX_DWORD dwFontStyles,
+                                         const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage = 0xFFFF);
+  virtual IFX_Font* LoadFont(const uint8_t* pBuffer, int32_t iLength);
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName);
+  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
+                             const FX_WCHAR* pszFontAlias = NULL,
+                             FX_DWORD dwFontStyles = 0,
+                             FX_WORD wCodePage = 0,
+                             FX_BOOL bSaveStream = FALSE);
+  virtual IFX_Font* LoadFont(IFX_Font* pSrcFont,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage = 0xFFFF);
+  virtual void ClearFontCache();
+  virtual void RemoveFont(IFX_Font* pFont);
+
+ protected:
+  FX_LPMatchFont m_pMatcher;
+  FX_LPEnumAllFonts m_pEnumerator;
+  CFX_FontDescriptors m_FontFaces;
+  CFX_PtrArray m_Fonts;
+  CFX_MapPtrToPtr m_CPFonts;
+  CFX_MapPtrToPtr m_FamilyFonts;
+  CFX_MapPtrToPtr m_UnicodeFonts;
+  CFX_MapPtrToPtr m_BufferFonts;
+  CFX_MapPtrToPtr m_FileFonts;
+  CFX_MapPtrToPtr m_StreamFonts;
+  CFX_MapPtrToPtr m_DeriveFonts;
+  void* m_pUserData;
+  void RemoveFont(CFX_MapPtrToPtr& fontMap, IFX_Font* pFont);
+  FX_LPCFONTDESCRIPTOR FindFont(const FX_WCHAR* pszFontFamily,
+                                FX_DWORD dwFontStyles,
+                                FX_DWORD dwMatchFlags,
+                                FX_WORD wCodePage,
+                                FX_DWORD dwUSB = 999,
+                                FX_WCHAR wUnicode = 0);
+  IFX_Font* GetFont(FX_LPCFONTDESCRIPTOR pFD, FX_DWORD dwFontStyles);
+};
+FX_DWORD FX_GetGdiFontStyles(const LOGFONTW& lf);
+
+#else
+
+class CFX_FontDescriptor {
+ public:
+  CFX_FontDescriptor()
+      : m_pFileAccess(NULL), m_nFaceIndex(0), m_dwFontStyles(0) {
+    m_dwUsb[0] = m_dwUsb[1] = m_dwUsb[2] = m_dwUsb[3] = 0;
+    m_dwCsb[0] = m_dwCsb[1] = 0;
+  }
+  ~CFX_FontDescriptor() {
+    if (NULL != m_pFileAccess) {
+      m_pFileAccess->Release();
+    }
+  }
+  IFX_FileAccess* m_pFileAccess;
+  int32_t m_nFaceIndex;
+  CFX_WideString m_wsFaceName;
+  CFX_WideStringArray m_wsFamilyNames;
+  FX_DWORD m_dwFontStyles;
+  FX_DWORD m_dwUsb[4];
+  FX_DWORD m_dwCsb[2];
+};
+typedef CFX_ArrayTemplate<CFX_FontDescriptor*> CFX_FontDescriptors;
+
+struct FX_FontDescriptorInfo {
+ public:
+  CFX_FontDescriptor* pFont;
+  int32_t nPenalty;
+
+  bool operator>(const FX_FontDescriptorInfo& other) const {
+    return nPenalty > other.nPenalty;
+  }
+  bool operator<(const FX_FontDescriptorInfo& other) const {
+    return nPenalty < other.nPenalty;
+  }
+  bool operator==(const FX_FontDescriptorInfo& other) const {
+    return nPenalty == other.nPenalty;
+  }
+};
+typedef CFX_ArrayTemplate<FX_FontDescriptorInfo> CFX_FontDescriptorInfos;
+
+struct FX_HandleParentPath {
+  FX_HandleParentPath() {}
+  FX_HandleParentPath(const FX_HandleParentPath& x) {
+    pFileHandle = x.pFileHandle;
+    bsParentPath = x.bsParentPath;
+  }
+  void* pFileHandle;
+  CFX_ByteString bsParentPath;
+};
+
+class CFX_FontSourceEnum_File : public IFX_FontSourceEnum {
+ public:
+  CFX_FontSourceEnum_File();
+  virtual void Release() { delete this; }
+  virtual FX_POSITION GetStartPosition(void* pUserData = NULL);
+  virtual IFX_FileAccess* GetNext(FX_POSITION& pos, void* pUserData = NULL);
+
+ private:
+  CFX_ByteString GetNextFile();
+  CFX_WideString m_wsNext;
+  CFX_ObjectArray<FX_HandleParentPath> m_FolderQueue;
+  CFX_ByteStringArray m_FolderPaths;
+};
+typedef CFX_MapPtrTemplate<FX_DWORD, IFX_FileAccess*> CFX_HashFileMap;
+typedef CFX_MapPtrTemplate<FX_DWORD, IFX_Font*> CFX_HashFontMap;
+typedef CFX_MapPtrTemplate<FX_DWORD, CFX_FontDescriptorInfos*>
+    CFX_HashFontDescsMap;
+typedef CFX_MapPtrTemplate<FX_DWORD, CFX_ArrayTemplate<IFX_Font*>*>
+    CFX_HashFontsMap;
+typedef CFX_MapPtrTemplate<FX_WCHAR, IFX_Font*> CFX_UnicodeFontMap;
+typedef CFX_MapPtrTemplate<IFX_FileAccess*, CFX_ArrayTemplate<IFX_Font*>*>
+    CFX_FileFontMap;
+typedef CFX_MapPtrTemplate<IFX_Font*, IFX_FileRead*> CFX_FonStreamtMap;
+
+class CFX_FontMgrImp : public IFX_FontMgr {
+ public:
+  CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum,
+                 IFX_FontMgrDelegate* pDelegate = NULL,
+                 void* pUserData = NULL);
+  virtual void Release();
+  virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage,
+                                         FX_DWORD dwFontStyles,
+                                         const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByCharset(uint8_t nCharset,
+                                        FX_DWORD dwFontStyles,
+                                        const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode,
+                                        FX_DWORD dwFontStyles,
+                                        const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage,
+                                         FX_DWORD dwFontStyles,
+                                         const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage,
+                                      FX_DWORD dwFontStyles,
+                                      const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetFontByCharset(uint8_t nCharset,
+                                     FX_DWORD dwFontStyles,
+                                     const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode,
+                                     FX_DWORD dwFontStyles,
+                                     const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage,
+                                      FX_DWORD dwFontStyles,
+                                      const FX_WCHAR* pszFontFamily = NULL);
+  virtual IFX_Font* LoadFont(const uint8_t* pBuffer,
+                             int32_t iLength,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount);
+  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount);
+  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount,
+                             FX_BOOL bSaveStream = FALSE);
+  virtual IFX_Font* LoadFont(const CFX_WideString& wsFaceName,
+                             int32_t iFaceIndex,
+                             int32_t* pFaceCount);
+  virtual void ClearFontCache();
+  virtual void RemoveFont(IFX_Font* pFont);
+  FX_BOOL EnumFonts();
+  FX_BOOL EnumFontsFromFontMapper();
+  FX_BOOL EnumFontsFromFiles();
+
+ protected:
+  void RegisterFace(FXFT_Face pFace,
+                    CFX_FontDescriptors& Fonts,
+                    const CFX_WideString* pFaceName,
+                    IFX_FileAccess* pFontAccess);
+  void RegisterFaces(IFX_FileRead* pFontStream,
+                     const CFX_WideString* pFaceName);
+  void GetNames(const uint8_t* name_table, CFX_WideStringArray& Names);
+  void GetCharsets(FXFT_Face pFace, CFX_WordArray& Charsets);
+  void GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB);
+  FX_DWORD GetFlags(FXFT_Face pFace);
+  CFX_FontDescriptors m_InstalledFonts;
+  FX_BOOL VerifyUnicode(CFX_FontDescriptor* pDesc, FX_WCHAR wcUnicode);
+  FX_BOOL VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode);
+  int32_t IsPartName(const CFX_WideString& Name1, const CFX_WideString& Name2);
+  int32_t MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
+                     FX_WORD wCodePage,
+                     FX_DWORD dwFontStyles,
+                     const CFX_WideString& FontName,
+                     FX_WCHAR wcUnicode = 0xFFFE);
+  int32_t CalcPenalty(CFX_FontDescriptor* pInstalled,
+                      FX_WORD wCodePage,
+                      FX_DWORD dwFontStyles,
+                      const CFX_WideString& FontName,
+                      FX_WCHAR wcUnicode = 0xFFFE);
+  IFX_Font* LoadFont(IFX_FileAccess* pFontAccess,
+                     int32_t iFaceIndex,
+                     int32_t* pFaceCount,
+                     FX_BOOL bWantCache = FALSE);
+  FXFT_Face LoadFace(IFX_FileRead* pFontStream, int32_t iFaceIndex);
+  IFX_FileRead* CreateFontStream(CFX_FontMapper* pFontMapper,
+                                 IFX_SystemFontInfo* pSystemFontInfo,
+                                 FX_DWORD index);
+  IFX_FileRead* CreateFontStream(const CFX_ByteString& bsFaceName);
+  CFX_HashFontDescsMap m_Hash2CandidateList;
+  CFX_HashFontsMap m_Hash2Fonts;
+  CFX_HashFileMap m_Hash2FileAccess;
+  CFX_HashFontMap m_FileAccess2IFXFont;
+  CFX_FonStreamtMap m_IFXFont2FileRead;
+  CFX_UnicodeFontMap m_FailedUnicodes2NULL;
+  IFX_FontSourceEnum* m_pFontSource;
+  IFX_FontMgrDelegate* m_pDelegate;
+  void* m_pUserData;
+};
+#endif
+
+#endif  // XFA_FGAS_FONT_FGAS_STDFONTMGR_H_
diff --git a/xfa/fgas/layout/fgas_linebreak.cpp b/xfa/fgas/layout/fgas_linebreak.cpp
new file mode 100644
index 0000000..8155af8
--- /dev/null
+++ b/xfa/fgas/layout/fgas_linebreak.cpp
@@ -0,0 +1,320 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/layout/fgas_linebreak.h"
+
+#include "core/include/fxcrt/fx_ucd.h"
+
+const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32] = {
+    {FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBPB, FX_LBPB, FX_LBPB, FX_LBCP, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBPB, FX_LBPB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBPB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBIB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBPB,
+     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBPB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
+     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
+     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
+     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
+     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
+};
+
+void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
+                              FX_LINEBREAKTYPE* pBrkType,
+                              int32_t iLength) {
+  if (iLength < 2) {
+    return;
+  }
+  FX_DWORD dwCur, dwNext;
+  FX_WCHAR wch;
+  wch = *pwsText++;
+  dwCur = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
+  iLength--;
+  for (int32_t i = 0; i < iLength; i++) {
+    wch = *pwsText++;
+    dwNext = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
+    if (dwNext == FX_CBP_SP) {
+      pBrkType[i] = FX_LBT_PROHIBITED_BRK;
+    } else {
+      pBrkType[i] = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                      (dwCur << 5) + dwNext);
+    }
+    dwCur = dwNext;
+  }
+  pBrkType[iLength] = FX_LBT_INDIRECT_BRK;
+}
+void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
+                              int32_t iLength,
+                              CFX_Int32MassArray& bp) {
+  if (iLength < 2) {
+    return;
+  }
+  FX_LINEBREAKTYPE eType;
+  FX_DWORD dwCur, dwNext;
+  FX_WCHAR wch;
+  wch = *pwsText++;
+  dwCur = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
+  iLength--;
+  for (int32_t i = 0; i < iLength; i++) {
+    wch = *pwsText++;
+    dwNext = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
+    if (dwNext == FX_CBP_SP) {
+      eType = FX_LBT_PROHIBITED_BRK;
+    } else {
+      eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                (dwCur << 5) + dwNext);
+    }
+    if (eType == FX_LBT_DIRECT_BRK) {
+      bp.Add(i);
+    }
+    dwCur = dwNext;
+  }
+}
diff --git a/xfa/fgas/layout/fgas_linebreak.h b/xfa/fgas/layout/fgas_linebreak.h
new file mode 100644
index 0000000..dc80e0d
--- /dev/null
+++ b/xfa/fgas/layout/fgas_linebreak.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LAYOUT_FGAS_LINEBREAK_H_
+#define XFA_FGAS_LAYOUT_FGAS_LINEBREAK_H_
+
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+
+enum FX_LINEBREAKTYPE {
+  FX_LBT_UNKNOWN = 0x00,
+  FX_LBT_DIRECT_BRK = 0x1A,
+  FX_LBT_INDIRECT_BRK = 0x2B,
+  FX_LBT_COM_INDIRECT_BRK = 0x3C,
+  FX_LBT_COM_PROHIBITED_BRK = 0x4D,
+  FX_LBT_PROHIBITED_BRK = 0x5E,
+  FX_LBT_HANGUL_SPACE_BRK = 0x6F,
+};
+
+#define FX_LBUN FX_LBT_UNKNOWN
+#define FX_LBDB FX_LBT_DIRECT_BRK
+#define FX_LBIB FX_LBT_INDIRECT_BRK
+#define FX_LBCB FX_LBT_COM_INDIRECT_BRK
+#define FX_LBCP FX_LBT_COM_PROHIBITED_BRK
+#define FX_LBPB FX_LBT_PROHIBITED_BRK
+#define FX_LBHS FX_LBT_HANGUL_SPACE_BRK
+
+extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32];
+
+void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
+                              FX_LINEBREAKTYPE* pBrkType,
+                              int32_t iLength);
+void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
+                              int32_t iLength,
+                              CFX_Int32MassArray& bp);
+
+#endif  // XFA_FGAS_LAYOUT_FGAS_LINEBREAK_H_
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp
new file mode 100644
index 0000000..f57a133
--- /dev/null
+++ b/xfa/fgas/layout/fgas_rtfbreak.cpp
@@ -0,0 +1,1691 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/layout/fgas_rtfbreak.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_arb.h"
+#include "xfa/fgas/layout/fgas_linebreak.h"
+#include "xfa/fgas/layout/fgas_unicode.h"
+
+namespace {
+
+class CFX_RTFLine {
+ public:
+  CFX_RTFLine()
+      : m_LinePieces(16),
+        m_iStart(0),
+        m_iWidth(0),
+        m_iArabicChars(0),
+        m_iMBCSChars(0) {}
+  ~CFX_RTFLine() { RemoveAll(); }
+  int32_t CountChars() const { return m_LineChars.GetSize(); }
+  CFX_RTFChar& GetChar(int32_t index) {
+    FXSYS_assert(index > -1 && index < m_LineChars.GetSize());
+    return *m_LineChars.GetDataPtr(index);
+  }
+  CFX_RTFChar* GetCharPtr(int32_t index) {
+    FXSYS_assert(index > -1 && index < m_LineChars.GetSize());
+    return m_LineChars.GetDataPtr(index);
+  }
+  int32_t CountPieces() const { return m_LinePieces.GetSize(); }
+  CFX_RTFPiece& GetPiece(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());
+    return m_LinePieces.GetAt(index);
+  }
+  CFX_RTFPiece* GetPiecePtr(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());
+    return m_LinePieces.GetPtrAt(index);
+  }
+  int32_t GetLineEnd() const { return m_iStart + m_iWidth; }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    CFX_RTFChar* pChar;
+    IFX_Unknown* pUnknown;
+    int32_t iCount = m_LineChars.GetSize();
+    for (int32_t i = 0; i < iCount; i++) {
+      pChar = m_LineChars.GetDataPtr(i);
+      if ((pUnknown = pChar->m_pUserData) != NULL) {
+        pUnknown->Release();
+      }
+    }
+    m_LineChars.RemoveAll();
+    m_LinePieces.RemoveAll(bLeaveMemory);
+    m_iWidth = 0;
+    m_iArabicChars = 0;
+    m_iMBCSChars = 0;
+  }
+  CFX_RTFCharArray m_LineChars;
+  CFX_RTFPieceArray m_LinePieces;
+  int32_t m_iStart;
+  int32_t m_iWidth;
+  int32_t m_iArabicChars;
+  int32_t m_iMBCSChars;
+};
+
+class CFX_RTFBreak : public IFX_RTFBreak {
+ public:
+  CFX_RTFBreak(FX_DWORD dwPolicies);
+  ~CFX_RTFBreak();
+  void Release() override { delete this; }
+  void SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) override;
+  void SetLineStartPos(FX_FLOAT fLinePos) override;
+  FX_DWORD GetLayoutStyles() const override { return m_dwLayoutStyles; }
+  void SetLayoutStyles(FX_DWORD dwLayoutStyles) override;
+  void SetFont(IFX_Font* pFont) override;
+  void SetFontSize(FX_FLOAT fFontSize) override;
+  void SetTabWidth(FX_FLOAT fTabWidth) override;
+  void AddPositionedTab(FX_FLOAT fTabPos) override;
+  void SetPositionedTabs(const CFX_FloatArray& tabs) override;
+  void ClearPositionedTabs() override;
+  void SetDefaultChar(FX_WCHAR wch) override;
+  void SetLineBreakChar(FX_WCHAR wch) override;
+  void SetLineBreakTolerance(FX_FLOAT fTolerance) override;
+  void SetHorizontalScale(int32_t iScale) override;
+  void SetVerticalScale(int32_t iScale) override;
+  void SetCharRotation(int32_t iCharRotation) override;
+  void SetCharSpace(FX_FLOAT fCharSpace) override;
+  void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) override;
+  void SetReadingOrder(FX_BOOL bRTL = FALSE) override;
+  void SetAlignment(int32_t iAlignment = FX_RTFLINEALIGNMENT_Left) override;
+  void SetUserData(IFX_Unknown* pUserData) override;
+  FX_DWORD AppendChar(FX_WCHAR wch) override;
+  FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) override;
+  int32_t CountBreakPieces() const override;
+  const CFX_RTFPiece* GetBreakPiece(int32_t index) const override;
+  void GetLineRect(CFX_RectF& rect) const override;
+  void ClearBreakPieces() override;
+  void Reset() override;
+  int32_t GetDisplayPos(
+      const FX_RTFTEXTOBJ* pText,
+      FXTEXT_CHARPOS* pCharPos,
+      FX_BOOL bCharCode = FALSE,
+      CFX_WideString* pWSForms = NULL,
+      FX_AdjustCharDisplayPos pAdjustPos = NULL) const override;
+  int32_t GetCharRects(const FX_RTFTEXTOBJ* pText,
+                       CFX_RectFArray& rtArray,
+                       FX_BOOL bCharBBox = FALSE) const override;
+  FX_DWORD AppendChar_CharCode(FX_WCHAR wch);
+  FX_DWORD AppendChar_Combination(CFX_RTFChar* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Tab(CFX_RTFChar* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Control(CFX_RTFChar* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Arabic(CFX_RTFChar* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Others(CFX_RTFChar* pCurChar, int32_t iRotation);
+
+ protected:
+  FX_DWORD m_dwPolicies;
+  IFX_ArabicChar* m_pArabicChar;
+  int32_t m_iBoundaryStart;
+  int32_t m_iBoundaryEnd;
+  FX_DWORD m_dwLayoutStyles;
+  FX_BOOL m_bPagination;
+  FX_BOOL m_bVertical;
+  FX_BOOL m_bSingleLine;
+  FX_BOOL m_bCharCode;
+  IFX_Font* m_pFont;
+  int32_t m_iFontHeight;
+  int32_t m_iFontSize;
+  int32_t m_iTabWidth;
+  CFX_Int32Array m_PositionedTabs;
+  FX_BOOL m_bOrphanLine;
+  FX_WCHAR m_wDefChar;
+  int32_t m_iDefChar;
+  FX_WCHAR m_wLineBreakChar;
+  int32_t m_iHorizontalScale;
+  int32_t m_iVerticalScale;
+  int32_t m_iLineRotation;
+  int32_t m_iCharRotation;
+  int32_t m_iRotation;
+  int32_t m_iCharSpace;
+  FX_BOOL m_bWordSpace;
+  int32_t m_iWordSpace;
+  FX_BOOL m_bRTL;
+  int32_t m_iAlignment;
+  IFX_Unknown* m_pUserData;
+  FX_DWORD m_dwCharType;
+  FX_DWORD m_dwIdentity;
+  CFX_RTFLine m_RTFLine1;
+  CFX_RTFLine m_RTFLine2;
+  CFX_RTFLine* m_pCurLine;
+  int32_t m_iReady;
+  int32_t m_iTolerance;
+  int32_t GetLineRotation(FX_DWORD dwStyles) const;
+  void SetBreakStatus();
+  CFX_RTFChar* GetLastChar(int32_t index) const;
+  CFX_RTFLine* GetRTFLine(FX_BOOL bReady) const;
+  CFX_RTFPieceArray* GetRTFPieces(FX_BOOL bReady) const;
+  FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const;
+  int32_t GetLastPositionedTab() const;
+  FX_BOOL GetPositionedTab(int32_t& iTabPos) const;
+  int32_t GetBreakPos(CFX_RTFCharArray& tca,
+                      int32_t& iEndPos,
+                      FX_BOOL bAllChars = FALSE,
+                      FX_BOOL bOnlyBrk = FALSE);
+  void SplitTextLine(CFX_RTFLine* pCurLine,
+                     CFX_RTFLine* pNextLine,
+                     FX_BOOL bAllChars = FALSE);
+  FX_BOOL EndBreak_SplitLine(CFX_RTFLine* pNextLine,
+                             FX_BOOL bAllChars,
+                             FX_DWORD dwStatus);
+  void EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus);
+  void EndBreak_Alignment(CFX_TPOArray& tpos,
+                          FX_BOOL bAllChars,
+                          FX_DWORD dwStatus);
+};
+
+}  // namespace
+
+IFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) {
+  return new CFX_RTFBreak(dwPolicies);
+}
+CFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies)
+    : m_dwPolicies(dwPolicies),
+      m_pArabicChar(NULL),
+      m_iBoundaryStart(0),
+      m_iBoundaryEnd(2000000),
+      m_dwLayoutStyles(0),
+      m_bPagination(FALSE),
+      m_bVertical(FALSE),
+      m_bSingleLine(FALSE),
+      m_bCharCode(FALSE),
+      m_pFont(NULL),
+      m_iFontHeight(240),
+      m_iFontSize(240),
+      m_iTabWidth(720000),
+      m_PositionedTabs(),
+      m_bOrphanLine(FALSE),
+      m_wDefChar(0xFEFF),
+      m_iDefChar(0),
+      m_wLineBreakChar(L'\n'),
+      m_iHorizontalScale(100),
+      m_iVerticalScale(100),
+      m_iLineRotation(0),
+      m_iCharRotation(0),
+      m_iRotation(0),
+      m_iCharSpace(0),
+      m_bWordSpace(FALSE),
+      m_iWordSpace(0),
+      m_bRTL(FALSE),
+      m_iAlignment(FX_RTFLINEALIGNMENT_Left),
+      m_pUserData(NULL),
+      m_dwCharType(0),
+      m_dwIdentity(0),
+      m_RTFLine1(),
+      m_RTFLine2(),
+      m_pCurLine(NULL),
+      m_iReady(0),
+      m_iTolerance(0) {
+  m_pArabicChar = IFX_ArabicChar::Create();
+  m_pCurLine = &m_RTFLine1;
+}
+CFX_RTFBreak::~CFX_RTFBreak() {
+  Reset();
+  m_PositionedTabs.RemoveAll();
+  m_pArabicChar->Release();
+  if (m_pUserData != NULL) {
+    m_pUserData->Release();
+  }
+}
+void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) {
+  if (fLineStart > fLineEnd)
+    return;
+  m_iBoundaryStart = FXSYS_round(fLineStart * 20000.0f);
+  m_iBoundaryEnd = FXSYS_round(fLineEnd * 20000.0f);
+  m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iBoundaryEnd);
+  m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iBoundaryStart);
+}
+void CFX_RTFBreak::SetLineStartPos(FX_FLOAT fLinePos) {
+  int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
+  iLinePos = std::min(iLinePos, m_iBoundaryEnd);
+  iLinePos = std::max(iLinePos, m_iBoundaryStart);
+  m_pCurLine->m_iStart = iLinePos;
+}
+void CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) {
+  if (m_dwLayoutStyles == dwLayoutStyles) {
+    return;
+  }
+  SetBreakStatus();
+  m_dwLayoutStyles = dwLayoutStyles;
+  m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0;
+  m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
+  m_bSingleLine = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
+  m_bCharCode = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
+  m_iLineRotation = GetLineRotation(m_dwLayoutStyles);
+  m_iRotation = m_iLineRotation + m_iCharRotation;
+  m_iRotation %= 4;
+}
+void CFX_RTFBreak::SetFont(IFX_Font* pFont) {
+  if (pFont == NULL) {
+    return;
+  }
+  if (m_pFont == pFont) {
+    return;
+  }
+  SetBreakStatus();
+  m_pFont = pFont;
+  m_iDefChar = 0;
+  if (m_pFont != NULL) {
+    m_iFontHeight = m_iFontSize;
+    if (m_wDefChar != 0xFEFF) {
+      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+      m_iDefChar *= m_iFontSize;
+    }
+  }
+}
+void CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) {
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  if (m_iFontSize == iFontSize) {
+    return;
+  }
+  SetBreakStatus();
+  m_iFontSize = iFontSize;
+  m_iDefChar = 0;
+  if (m_pFont != NULL) {
+    m_iFontHeight = m_iFontSize;
+    if (m_wDefChar != 0xFEFF) {
+      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+      m_iDefChar *= m_iFontSize;
+    }
+  }
+}
+void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) {
+  m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
+}
+void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) {
+  int32_t iLineEnd = m_iBoundaryEnd;
+  int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart;
+  if (iTabPos > iLineEnd) {
+    iTabPos = iLineEnd;
+  }
+  if (m_PositionedTabs.Find(iTabPos, 0) > -1) {
+    return;
+  }
+  int32_t iCount = m_PositionedTabs.GetSize();
+  int32_t iFind = 0;
+  for (; iFind < iCount; iFind++) {
+    if (m_PositionedTabs[iFind] > iTabPos) {
+      break;
+    }
+  }
+  m_PositionedTabs.InsertAt(iFind, iTabPos);
+  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
+    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
+  } else {
+    m_bOrphanLine = FALSE;
+  }
+}
+void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) {
+  m_PositionedTabs.RemoveAll();
+  int32_t iCount = tabs.GetSize();
+  m_PositionedTabs.SetSize(iCount);
+  int32_t iLineEnd = m_iBoundaryEnd;
+  int32_t iTabPos;
+  for (int32_t i = 0; i < iCount; i++) {
+    iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart;
+    if (iTabPos > iLineEnd) {
+      iTabPos = iLineEnd;
+    }
+    m_PositionedTabs[i] = iTabPos;
+  }
+  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
+    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
+  } else {
+    m_bOrphanLine = FALSE;
+  }
+}
+void CFX_RTFBreak::ClearPositionedTabs() {
+  m_PositionedTabs.RemoveAll();
+  m_bOrphanLine = FALSE;
+}
+void CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) {
+  m_wDefChar = wch;
+  m_iDefChar = 0;
+  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
+    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+    if (m_iDefChar < 0) {
+      m_iDefChar = 0;
+    } else {
+      m_iDefChar *= m_iFontSize;
+    }
+  }
+}
+void CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) {
+  if (wch != L'\r' && wch != L'\n') {
+    return;
+  }
+  m_wLineBreakChar = wch;
+}
+void CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
+  m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
+}
+void CFX_RTFBreak::SetHorizontalScale(int32_t iScale) {
+  if (iScale < 0) {
+    iScale = 0;
+  }
+  if (m_iHorizontalScale == iScale) {
+    return;
+  }
+  SetBreakStatus();
+  m_iHorizontalScale = iScale;
+}
+void CFX_RTFBreak::SetVerticalScale(int32_t iScale) {
+  if (iScale < 0) {
+    iScale = 0;
+  }
+  if (m_iVerticalScale == iScale) {
+    return;
+  }
+  SetBreakStatus();
+  m_iVerticalScale = iScale;
+}
+void CFX_RTFBreak::SetCharRotation(int32_t iCharRotation) {
+  if (iCharRotation < 0) {
+    iCharRotation += (-iCharRotation / 4 + 1) * 4;
+  } else if (iCharRotation > 3) {
+    iCharRotation -= (iCharRotation / 4) * 4;
+  }
+  if (m_iCharRotation == iCharRotation) {
+    return;
+  }
+  SetBreakStatus();
+  m_iCharRotation = iCharRotation;
+  m_iRotation = m_iLineRotation + m_iCharRotation;
+  m_iRotation %= 4;
+}
+void CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) {
+  m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
+}
+void CFX_RTFBreak::SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) {
+  m_bWordSpace = !bDefault;
+  m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f);
+}
+void CFX_RTFBreak::SetReadingOrder(FX_BOOL bRTL) {
+  m_bRTL = bRTL;
+}
+void CFX_RTFBreak::SetAlignment(int32_t iAlignment) {
+  FXSYS_assert(iAlignment >= FX_RTFLINEALIGNMENT_Left &&
+               iAlignment <= FX_RTFLINEALIGNMENT_Distributed);
+  m_iAlignment = iAlignment;
+}
+void CFX_RTFBreak::SetUserData(IFX_Unknown* pUserData) {
+  if (m_pUserData == pUserData) {
+    return;
+  }
+  SetBreakStatus();
+  if (m_pUserData != NULL) {
+    m_pUserData->Release();
+  }
+  m_pUserData = pUserData;
+  if (m_pUserData != NULL) {
+    m_pUserData->AddRef();
+  }
+}
+static const int32_t gs_FX_RTFLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
+int32_t CFX_RTFBreak::GetLineRotation(FX_DWORD dwStyles) const {
+  return gs_FX_RTFLineRotations[(dwStyles & 0x0E) >> 1];
+}
+void CFX_RTFBreak::SetBreakStatus() {
+  m_dwIdentity++;
+  int32_t iCount = m_pCurLine->CountChars();
+  if (iCount < 1) {
+    return;
+  }
+  CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
+  if (tc.m_dwStatus == 0) {
+    tc.m_dwStatus = FX_RTFBREAK_PieceBreak;
+  }
+}
+CFX_RTFChar* CFX_RTFBreak::GetLastChar(int32_t index) const {
+  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
+  int32_t iCount = tca.GetSize();
+  if (index < 0 || index >= iCount) {
+    return NULL;
+  }
+  CFX_RTFChar* pTC;
+  int32_t iStart = iCount - 1;
+  while (iStart > -1) {
+    pTC = tca.GetDataPtr(iStart--);
+    if (pTC->m_iCharWidth >= 0 ||
+        pTC->GetCharType() != FX_CHARTYPE_Combination) {
+      if (--index < 0) {
+        return pTC;
+      }
+    }
+  }
+  return NULL;
+}
+CFX_RTFLine* CFX_RTFBreak::GetRTFLine(FX_BOOL bReady) const {
+  if (bReady) {
+    if (m_iReady == 1) {
+      return (CFX_RTFLine*)&m_RTFLine1;
+    } else if (m_iReady == 2) {
+      return (CFX_RTFLine*)&m_RTFLine2;
+    } else {
+      return NULL;
+    }
+  }
+  FXSYS_assert(m_pCurLine != NULL);
+  return m_pCurLine;
+}
+CFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(FX_BOOL bReady) const {
+  CFX_RTFLine* pRTFLine = GetRTFLine(bReady);
+  if (pRTFLine == NULL) {
+    return NULL;
+  }
+  return &pRTFLine->m_LinePieces;
+}
+inline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const {
+  return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType;
+}
+int32_t CFX_RTFBreak::GetLastPositionedTab() const {
+  int32_t iCount = m_PositionedTabs.GetSize();
+  if (iCount < 1) {
+    return m_iBoundaryStart;
+  }
+  return m_PositionedTabs[iCount - 1];
+}
+FX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const {
+  int32_t iCount = m_PositionedTabs.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    if (m_PositionedTabs[i] > iTabPos) {
+      iTabPos = m_PositionedTabs[i];
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+typedef FX_DWORD (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)(
+    CFX_RTFChar* pCurChar,
+    int32_t iRotation);
+static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = {
+    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Tab,
+    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Control,
+    &CFX_RTFBreak::AppendChar_Combination, &CFX_RTFBreak::AppendChar_Others,
+    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Arabic,
+    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
+    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
+    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Others,
+    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Others,
+};
+FX_DWORD CFX_RTFBreak::AppendChar(FX_WCHAR wch) {
+  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL && m_pArabicChar != NULL);
+  if (m_bCharCode) {
+    return AppendChar_CharCode(wch);
+  }
+  FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch];
+  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
+  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
+  CFX_RTFChar* pCurChar = tca.AddSpace();
+  pCurChar->m_dwStatus = 0;
+  pCurChar->m_wCharCode = wch;
+  pCurChar->m_dwCharProps = dwProps;
+  pCurChar->m_dwCharStyles = 0;
+  pCurChar->m_dwLayoutStyles = 0;
+  pCurChar->m_iFontSize = m_iFontSize;
+  pCurChar->m_iFontHeight = m_iFontHeight;
+  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
+  pCurChar->m_iVertialScale = m_iVerticalScale;
+  pCurChar->m_nRotation = m_iCharRotation;
+  pCurChar->m_iCharWidth = 0;
+  pCurChar->m_dwIdentity = m_dwIdentity;
+  if (m_pUserData != NULL) {
+    m_pUserData->AddRef();
+  }
+  pCurChar->m_pUserData = m_pUserData;
+  FX_DWORD dwRet1 = FX_RTFBREAK_None;
+  if (dwType != FX_CHARTYPE_Combination &&
+      GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) {
+    if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 &&
+        m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
+      if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) {
+        dwRet1 = EndBreak(FX_RTFBREAK_LineBreak);
+        int32_t iCount = m_pCurLine->CountChars();
+        if (iCount > 0) {
+          pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1);
+        }
+      }
+    }
+  }
+  int32_t iRotation = m_iRotation;
+  if (m_bVertical && (dwProps & 0x8000) != 0) {
+    iRotation = (iRotation + 1) % 4;
+  }
+  FX_DWORD dwRet2 =
+      (this->*g_FX_RTFBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(
+          pCurChar, iRotation);
+  m_dwCharType = dwType;
+  return std::max(dwRet1, dwRet2);
+}
+FX_DWORD CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) {
+  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL);
+  FXSYS_assert(m_bCharCode);
+  m_pCurLine->m_iMBCSChars++;
+  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
+  CFX_RTFChar* pCurChar = tca.AddSpace();
+  pCurChar->m_dwStatus = 0;
+  pCurChar->m_wCharCode = wch;
+  pCurChar->m_dwCharProps = 0;
+  pCurChar->m_dwCharStyles = 0;
+  pCurChar->m_dwLayoutStyles = m_dwLayoutStyles;
+  pCurChar->m_iFontSize = m_iFontSize;
+  pCurChar->m_iFontHeight = m_iFontHeight;
+  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
+  pCurChar->m_iVertialScale = m_iVerticalScale;
+  pCurChar->m_nRotation = m_iCharRotation;
+  pCurChar->m_iCharWidth = 0;
+  pCurChar->m_dwIdentity = m_dwIdentity;
+  if (m_pUserData != NULL) {
+    m_pUserData->AddRef();
+  }
+  pCurChar->m_pUserData = m_pUserData;
+  int32_t iCharWidth = 0;
+  if (m_bVertical != FX_IsOdd(m_iRotation)) {
+    iCharWidth = 1000;
+  } else {
+    if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) {
+      iCharWidth = m_iDefChar;
+    }
+  }
+  iCharWidth *= m_iFontSize;
+  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
+  iCharWidth += m_iCharSpace;
+  pCurChar->m_iCharWidth = iCharWidth;
+  m_pCurLine->m_iWidth += iCharWidth;
+  m_dwCharType = 0;
+  if (!m_bSingleLine &&
+      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
+    return EndBreak(FX_RTFBREAK_LineBreak);
+  }
+  return FX_RTFBREAK_None;
+}
+FX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar,
+                                              int32_t iRotation) {
+  int32_t iCharWidth = 0;
+  if (m_bVertical != FX_IsOdd(iRotation)) {
+    iCharWidth = 1000;
+  } else {
+    if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
+                               m_bCharCode)) {
+      iCharWidth = 0;
+    }
+  }
+  iCharWidth *= m_iFontSize;
+  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
+  CFX_RTFChar* pLastChar = GetLastChar(0);
+  if (pLastChar != NULL && pLastChar->GetCharType() > FX_CHARTYPE_Combination) {
+    iCharWidth = -iCharWidth;
+  } else {
+    m_dwCharType = FX_CHARTYPE_Combination;
+  }
+  pCurChar->m_iCharWidth = iCharWidth;
+  if (iCharWidth > 0) {
+    m_pCurLine->m_iWidth += iCharWidth;
+  }
+  return FX_RTFBREAK_None;
+}
+FX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar,
+                                      int32_t iRotation) {
+  if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) {
+    FX_BOOL bBreak = FALSE;
+    if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
+      bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance);
+    }
+    int32_t& iLineWidth = m_pCurLine->m_iWidth;
+    int32_t iCharWidth = iLineWidth;
+    if (GetPositionedTab(iCharWidth)) {
+      iCharWidth -= iLineWidth;
+    } else {
+      iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth;
+    }
+    pCurChar->m_iCharWidth = iCharWidth;
+    iLineWidth += iCharWidth;
+    if (!m_bSingleLine && !m_bOrphanLine && bBreak) {
+      return EndBreak(FX_RTFBREAK_LineBreak);
+    }
+  }
+  return FX_RTFBREAK_None;
+}
+FX_DWORD CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar,
+                                          int32_t iRotation) {
+  FX_DWORD dwRet2 = FX_RTFBREAK_None;
+  if (!m_bSingleLine) {
+    switch (pCurChar->m_wCharCode) {
+      case L'\v':
+      case 0x2028:
+        dwRet2 = FX_RTFBREAK_LineBreak;
+        break;
+      case L'\f':
+        dwRet2 = FX_RTFBREAK_PageBreak;
+        break;
+      case 0x2029:
+        dwRet2 = FX_RTFBREAK_ParagraphBreak;
+        break;
+      default:
+        if (pCurChar->m_wCharCode == m_wLineBreakChar) {
+          dwRet2 = FX_RTFBREAK_ParagraphBreak;
+        }
+        break;
+    }
+    if (dwRet2 != FX_RTFBREAK_None) {
+      dwRet2 = EndBreak(dwRet2);
+    }
+  }
+  return dwRet2;
+}
+FX_DWORD CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar,
+                                         int32_t iRotation) {
+  CFX_RTFChar* pLastChar = NULL;
+  int32_t& iLineWidth = m_pCurLine->m_iWidth;
+  int32_t iCharWidth = 0;
+  FX_WCHAR wForm;
+  FX_BOOL bAlef = FALSE;
+  if (m_dwCharType >= FX_CHARTYPE_ArabicAlef &&
+      m_dwCharType <= FX_CHARTYPE_ArabicDistortion) {
+    pLastChar = GetLastChar(1);
+    if (pLastChar != NULL) {
+      iLineWidth -= pLastChar->m_iCharWidth;
+      CFX_RTFChar* pPrevChar = GetLastChar(2);
+      wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar);
+      bAlef = (wForm == 0xFEFF &&
+               pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef);
+      int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation;
+      if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) {
+        iLastRotation++;
+      }
+      if (m_bVertical != FX_IsOdd(iLastRotation)) {
+        iCharWidth = 1000;
+      } else {
+        if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) {
+          if (!m_pFont->GetCharWidth(pLastChar->m_wCharCode, iCharWidth,
+                                     m_bCharCode)) {
+            iCharWidth = m_iDefChar;
+          }
+        }
+      }
+      iCharWidth *= m_iFontSize;
+      iCharWidth = iCharWidth * m_iHorizontalScale / 100;
+      pLastChar->m_iCharWidth = iCharWidth;
+      iLineWidth += iCharWidth;
+      iCharWidth = 0;
+    }
+  }
+  wForm =
+      m_pArabicChar->GetFormChar(pCurChar, (bAlef ? NULL : pLastChar), NULL);
+  if (m_bVertical != FX_IsOdd(iRotation)) {
+    iCharWidth = 1000;
+  } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode) &&
+             !m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
+                                    m_bCharCode)) {
+    iCharWidth = m_iDefChar;
+  }
+
+  iCharWidth *= m_iFontSize;
+  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
+  pCurChar->m_iCharWidth = iCharWidth;
+  iLineWidth += iCharWidth;
+  m_pCurLine->m_iArabicChars++;
+  if (!m_bSingleLine && !m_bOrphanLine &&
+      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
+    return EndBreak(FX_RTFBREAK_LineBreak);
+  }
+  return FX_RTFBREAK_None;
+}
+FX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar,
+                                         int32_t iRotation) {
+  FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK);
+  FX_WCHAR wForm;
+  if (dwType == FX_CHARTYPE_Numeric) {
+    if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) {
+      wForm = pCurChar->m_wCharCode + 0x0630;
+    } else {
+      wForm = pCurChar->m_wCharCode;
+    }
+  } else if (m_bRTL || m_bVertical) {
+    wForm = FX_GetMirrorChar(pCurChar->m_wCharCode, pCurChar->m_dwCharProps,
+                             m_bRTL, m_bVertical);
+  } else {
+    wForm = pCurChar->m_wCharCode;
+  }
+  int32_t iCharWidth = 0;
+  if (m_bVertical != FX_IsOdd(iRotation)) {
+    iCharWidth = 1000;
+  } else {
+    if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) {
+      iCharWidth = m_iDefChar;
+    }
+  }
+  iCharWidth *= m_iFontSize;
+  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
+  iCharWidth += m_iCharSpace;
+  if (dwType == FX_CHARTYPE_Space && m_bWordSpace) {
+    iCharWidth += m_iWordSpace;
+  }
+  pCurChar->m_iCharWidth = iCharWidth;
+  m_pCurLine->m_iWidth += iCharWidth;
+  FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space ||
+                    (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0);
+  if (!m_bSingleLine && !m_bOrphanLine && bBreak &&
+      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
+    return EndBreak(FX_RTFBREAK_LineBreak);
+  }
+  return FX_RTFBREAK_None;
+}
+FX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) {
+  FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak &&
+               dwStatus <= FX_RTFBREAK_PageBreak);
+  m_dwIdentity++;
+  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+  int32_t iCount = pCurPieces->GetSize();
+  if (iCount > 0) {
+    CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
+    if (dwStatus > FX_RTFBREAK_PieceBreak) {
+      pLastPiece->m_dwStatus = dwStatus;
+    } else {
+      dwStatus = pLastPiece->m_dwStatus;
+    }
+    return dwStatus;
+  } else {
+    CFX_RTFLine* pLastLine = GetRTFLine(TRUE);
+    if (pLastLine != NULL) {
+      pCurPieces = &pLastLine->m_LinePieces;
+      iCount = pCurPieces->GetSize();
+      if (iCount-- > 0) {
+        CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
+        if (dwStatus > FX_RTFBREAK_PieceBreak) {
+          pLastPiece->m_dwStatus = dwStatus;
+        } else {
+          dwStatus = pLastPiece->m_dwStatus;
+        }
+        return dwStatus;
+      }
+      return FX_RTFBREAK_None;
+    }
+    iCount = m_pCurLine->CountChars();
+    if (iCount < 1) {
+      return FX_RTFBREAK_None;
+    }
+    CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
+    tc.m_dwStatus = dwStatus;
+    if (dwStatus <= FX_RTFBREAK_PieceBreak) {
+      return dwStatus;
+    }
+  }
+  m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2;
+  CFX_RTFLine* pNextLine =
+      (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1;
+  FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right);
+  CFX_TPOArray tpos;
+  if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
+    goto EndBreak_Ret;
+  }
+  if (!m_bCharCode) {
+    EndBreak_BidiLine(tpos, dwStatus);
+  }
+  if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) {
+    EndBreak_Alignment(tpos, bAllChars, dwStatus);
+  }
+EndBreak_Ret:
+  m_pCurLine = pNextLine;
+  m_pCurLine->m_iStart = m_iBoundaryStart;
+  CFX_RTFChar* pTC = GetLastChar(0);
+  m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType();
+  return dwStatus;
+}
+FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine,
+                                         FX_BOOL bAllChars,
+                                         FX_DWORD dwStatus) {
+  FX_BOOL bDone = FALSE;
+  if (!m_bSingleLine && !m_bOrphanLine &&
+      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
+    CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1);
+    switch (tc.GetCharType()) {
+      case FX_CHARTYPE_Tab:
+        if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
+          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+          bDone = TRUE;
+        }
+        break;
+      case FX_CHARTYPE_Control:
+        break;
+      case FX_CHARTYPE_Space:
+        if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) {
+          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+          bDone = TRUE;
+        }
+        break;
+      default:
+        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+        bDone = TRUE;
+        break;
+    }
+  }
+  if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) {
+    const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.GetData();
+    const CFX_RTFChar* pTC;
+    CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+    CFX_RTFPiece tp;
+    tp.m_pChars = &m_pCurLine->m_LineChars;
+    FX_BOOL bNew = TRUE;
+    FX_DWORD dwIdentity = (FX_DWORD)-1;
+    int32_t iLast = m_pCurLine->CountChars() - 1, j = 0;
+    for (int32_t i = 0; i <= iLast;) {
+      pTC = pCurChars + i;
+      if (bNew) {
+        tp.m_iStartChar = i;
+        tp.m_iStartPos += tp.m_iWidth;
+        tp.m_iWidth = 0;
+        tp.m_dwStatus = pTC->m_dwStatus;
+        tp.m_iFontSize = pTC->m_iFontSize;
+        tp.m_iFontHeight = pTC->m_iFontHeight;
+        tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
+        tp.m_iVerticalScale = pTC->m_iVertialScale;
+        tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles;
+        dwIdentity = pTC->m_dwIdentity;
+        tp.m_dwIdentity = dwIdentity;
+        tp.m_pUserData = pTC->m_pUserData;
+        j = i;
+        bNew = FALSE;
+      }
+      if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None ||
+          pTC->m_dwIdentity != dwIdentity) {
+        tp.m_iChars = i - j;
+        if (pTC->m_dwIdentity == dwIdentity) {
+          tp.m_dwStatus = pTC->m_dwStatus;
+          tp.m_iWidth += pTC->m_iCharWidth;
+          tp.m_iChars += 1;
+          i++;
+        }
+        pCurPieces->Add(tp);
+        bNew = TRUE;
+      } else {
+        tp.m_iWidth += pTC->m_iCharWidth;
+        i++;
+      }
+    }
+    return TRUE;
+  }
+  if (bAllChars && !bDone) {
+    int32_t iEndPos = m_pCurLine->GetLineEnd();
+    GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, TRUE);
+  }
+  return FALSE;
+}
+void CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus) {
+  FX_TPO tpo;
+  CFX_RTFPiece tp;
+  CFX_RTFChar* pTC;
+  int32_t i, j;
+  CFX_RTFCharArray& chars = m_pCurLine->m_LineChars;
+  int32_t iCount = m_pCurLine->CountChars();
+  FX_BOOL bDone = (!m_bPagination && !m_bCharCode &&
+                   (m_pCurLine->m_iArabicChars > 0 || m_bRTL));
+  if (bDone) {
+    int32_t iBidiNum = 0;
+    for (i = 0; i < iCount; i++) {
+      pTC = chars.GetDataPtr(i);
+      pTC->m_iBidiPos = i;
+      if (pTC->GetCharType() != FX_CHARTYPE_Control) {
+        iBidiNum = i;
+      }
+      if (i == 0) {
+        pTC->m_iBidiLevel = 1;
+      }
+    }
+    FX_BidiLine(chars, iBidiNum + 1, m_bRTL ? 1 : 0);
+  } else {
+    for (i = 0; i < iCount; i++) {
+      pTC = chars.GetDataPtr(i);
+      pTC->m_iBidiLevel = 0;
+      pTC->m_iBidiPos = 0;
+      pTC->m_iBidiOrder = 0;
+    }
+  }
+  tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
+  tp.m_iStartPos = m_pCurLine->m_iStart;
+  tp.m_pChars = &chars;
+  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+  int32_t iBidiLevel = -1, iCharWidth;
+  FX_DWORD dwIdentity = (FX_DWORD)-1;
+  i = j = 0;
+  while (i < iCount) {
+    pTC = chars.GetDataPtr(i);
+    if (iBidiLevel < 0) {
+      iBidiLevel = pTC->m_iBidiLevel;
+      iCharWidth = pTC->m_iCharWidth;
+      if (iCharWidth < 1) {
+        tp.m_iWidth = 0;
+      } else {
+        tp.m_iWidth = iCharWidth;
+      }
+      tp.m_iBidiLevel = iBidiLevel;
+      tp.m_iBidiPos = pTC->m_iBidiOrder;
+      tp.m_iFontSize = pTC->m_iFontSize;
+      tp.m_iFontHeight = pTC->m_iFontHeight;
+      tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
+      tp.m_iVerticalScale = pTC->m_iVertialScale;
+      dwIdentity = pTC->m_dwIdentity;
+      tp.m_dwIdentity = dwIdentity;
+      tp.m_pUserData = pTC->m_pUserData;
+      tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
+      i++;
+    } else if (iBidiLevel != pTC->m_iBidiLevel ||
+               pTC->m_dwIdentity != dwIdentity) {
+      tp.m_iChars = i - tp.m_iStartChar;
+      pCurPieces->Add(tp);
+      tp.m_iStartPos += tp.m_iWidth;
+      tp.m_iStartChar = i;
+      tpo.index = j++;
+      tpo.pos = tp.m_iBidiPos;
+      tpos.Add(tpo);
+      iBidiLevel = -1;
+    } else {
+      iCharWidth = pTC->m_iCharWidth;
+      if (iCharWidth > 0) {
+        tp.m_iWidth += iCharWidth;
+      }
+      i++;
+    }
+  }
+  if (i > tp.m_iStartChar) {
+    tp.m_dwStatus = dwStatus;
+    tp.m_iChars = i - tp.m_iStartChar;
+    pCurPieces->Add(tp);
+    tpo.index = j;
+    tpo.pos = tp.m_iBidiPos;
+    tpos.Add(tpo);
+  }
+  if (!m_bCharCode) {
+    j = tpos.GetSize() - 1;
+    FX_TEXTLAYOUT_PieceSort(tpos, 0, j);
+    int32_t iStartPos = m_pCurLine->m_iStart;
+    for (i = 0; i <= j; i++) {
+      tpo = tpos.GetAt(i);
+      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
+      ttp.m_iStartPos = iStartPos;
+      iStartPos += ttp.m_iWidth;
+    }
+  }
+}
+void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
+                                      FX_BOOL bAllChars,
+                                      FX_DWORD dwStatus) {
+  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
+  int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
+  int32_t iCount = pCurPieces->GetSize();
+  FX_BOOL bFind = FALSE;
+  FX_DWORD dwCharType;
+  int32_t i, j;
+  FX_TPO tpo;
+  for (i = iCount - 1; i > -1; i--) {
+    tpo = tpos.GetAt(i);
+    CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
+    if (!bFind) {
+      iNetWidth = ttp.GetEndPos();
+    }
+    FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel);
+    j = bArabic ? 0 : ttp.m_iChars - 1;
+    while (j > -1 && j < ttp.m_iChars) {
+      const CFX_RTFChar& tc = ttp.GetChar(j);
+      if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) {
+        iGapChars++;
+      }
+      if (!bFind || !bAllChars) {
+        dwCharType = tc.GetCharType();
+        if (dwCharType == FX_CHARTYPE_Space ||
+            dwCharType == FX_CHARTYPE_Control) {
+          if (!bFind) {
+            iCharWidth = tc.m_iCharWidth;
+            if (bAllChars && iCharWidth > 0) {
+              iNetWidth -= iCharWidth;
+            }
+          }
+        } else {
+          bFind = TRUE;
+          if (!bAllChars) {
+            break;
+          }
+        }
+      }
+      j += bArabic ? 1 : -1;
+    }
+    if (!bAllChars && bFind) {
+      break;
+    }
+  }
+  int32_t iOffset = m_iBoundaryEnd - iNetWidth;
+  int32_t iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask);
+  int32_t iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask);
+  if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed ||
+                        (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified &&
+                         dwStatus != FX_RTFBREAK_ParagraphBreak))) {
+    int32_t iStart = -1;
+    for (i = 0; i < iCount; i++) {
+      tpo = tpos.GetAt(i);
+      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
+      if (iStart < 0) {
+        iStart = ttp.m_iStartPos;
+      } else {
+        ttp.m_iStartPos = iStart;
+      }
+      int32_t k;
+      for (j = 0; j < ttp.m_iChars; j++) {
+        CFX_RTFChar& tc = ttp.GetChar(j);
+        if (tc.m_nBreakType != FX_LBT_DIRECT_BRK || tc.m_iCharWidth < 0) {
+          continue;
+        }
+        k = iOffset / iGapChars;
+        tc.m_iCharWidth += k;
+        ttp.m_iWidth += k;
+        iOffset -= k;
+        iGapChars--;
+        if (iGapChars < 1) {
+          break;
+        }
+      }
+      iStart += ttp.m_iWidth;
+    }
+  } else if (iLowerAlignment > FX_RTFLINEALIGNMENT_Left) {
+    if (iLowerAlignment == FX_RTFLINEALIGNMENT_Center) {
+      iOffset /= 2;
+    }
+    if (iOffset > 0) {
+      for (i = 0; i < iCount; i++) {
+        CFX_RTFPiece& ttp = pCurPieces->GetAt(i);
+        ttp.m_iStartPos += iOffset;
+      }
+    }
+  }
+}
+int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca,
+                                  int32_t& iEndPos,
+                                  FX_BOOL bAllChars,
+                                  FX_BOOL bOnlyBrk) {
+  int32_t iLength = tca.GetSize() - 1;
+  if (iLength < 1) {
+    return iLength;
+  }
+  int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1,
+          iLast = -1, iLastPos = -1;
+  if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) {
+    if (!bAllChars || m_bCharCode) {
+      return iLength;
+    }
+    iBreak = iLength;
+    iBreakPos = iEndPos;
+  }
+  CFX_RTFChar* pCharArray = tca.GetData();
+  if (m_bCharCode) {
+    const CFX_RTFChar* pChar;
+    int32_t iCharWidth;
+    while (iLength > 0) {
+      if (iEndPos <= m_iBoundaryEnd) {
+        break;
+      }
+      pChar = pCharArray + iLength--;
+      iCharWidth = pChar->m_iCharWidth;
+      if (iCharWidth > 0) {
+        iEndPos -= iCharWidth;
+      }
+    }
+    return iLength;
+  }
+  FX_BOOL bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0;
+  FX_BOOL bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0;
+  FX_BOOL bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0;
+  FX_BOOL bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0;
+  FX_LINEBREAKTYPE eType;
+  FX_DWORD nCodeProp, nCur, nNext;
+  CFX_RTFChar* pCur = pCharArray + iLength--;
+  if (bAllChars) {
+    pCur->m_nBreakType = FX_LBT_UNKNOWN;
+  }
+  nCodeProp = pCur->m_dwCharProps;
+  nNext = nCodeProp & 0x003F;
+  int32_t iCharWidth = pCur->m_iCharWidth;
+  if (iCharWidth > 0) {
+    iEndPos -= iCharWidth;
+  }
+  while (iLength >= 0) {
+    pCur = pCharArray + iLength;
+    nCodeProp = pCur->m_dwCharProps;
+    nCur = nCodeProp & 0x003F;
+    FX_BOOL bNeedBreak = FALSE;
+    if (nCur == FX_CBP_SP) {
+      bNeedBreak = !bSpaceBreak;
+      if (nNext == FX_CBP_SP) {
+        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
+      } else {
+        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                  (nCur << 5) + nNext);
+      }
+    } else if (nCur == FX_CBP_TB) {
+      bNeedBreak = !bTabBreak;
+      if (nNext == FX_CBP_TB) {
+        eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
+      } else {
+        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                  (nCur << 5) + nNext);
+      }
+    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
+      eType = FX_LBT_DIRECT_BRK;
+    } else if (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS) {
+      eType = FX_LBT_DIRECT_BRK;
+    } else {
+      if (nNext == FX_CBP_SP) {
+        eType = FX_LBT_PROHIBITED_BRK;
+      } else {
+        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                  (nCur << 5) + nNext);
+      }
+    }
+    if (bAllChars) {
+      pCur->m_nBreakType = eType;
+    }
+    if (!bOnlyBrk) {
+      iCharWidth = pCur->m_iCharWidth;
+      FX_BOOL bBreak = FALSE;
+      if (nCur == FX_CBP_TB && bTabBreak) {
+        bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd;
+      } else {
+        bBreak = iEndPos <= m_iBoundaryEnd;
+      }
+      if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) {
+        if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
+          iBreak = iLength;
+          iBreakPos = iEndPos;
+          if (!bAllChars) {
+            return iLength;
+          }
+        } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) {
+          iIndirect = iLength;
+          iIndirectPos = iEndPos;
+        }
+        if (iLast < 0) {
+          iLast = iLength;
+          iLastPos = iEndPos;
+        }
+      }
+      if (iCharWidth > 0) {
+        iEndPos -= iCharWidth;
+      }
+    }
+    nNext = nCodeProp & 0x003F;
+    iLength--;
+  }
+  if (bOnlyBrk) {
+    return 0;
+  }
+  if (iBreak > -1) {
+    iEndPos = iBreakPos;
+    return iBreak;
+  }
+  if (iIndirect > -1) {
+    iEndPos = iIndirectPos;
+    return iIndirect;
+  }
+  if (iLast > -1) {
+    iEndPos = iLastPos;
+    return iLast;
+  }
+  return 0;
+}
+void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine,
+                                 CFX_RTFLine* pNextLine,
+                                 FX_BOOL bAllChars) {
+  FXSYS_assert(pCurLine != NULL && pNextLine != NULL);
+  int32_t iCount = pCurLine->CountChars();
+  if (iCount < 2) {
+    return;
+  }
+  int32_t iEndPos = pCurLine->GetLineEnd();
+  CFX_RTFCharArray& curChars = pCurLine->m_LineChars;
+  int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
+  if (iCharPos < 0) {
+    iCharPos = 0;
+  }
+  iCharPos++;
+  if (iCharPos >= iCount) {
+    pNextLine->RemoveAll(TRUE);
+    CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1);
+    pTC->m_nBreakType = FX_LBT_UNKNOWN;
+    return;
+  }
+  CFX_RTFCharArray& nextChars = pNextLine->m_LineChars;
+  int cur_size = curChars.GetSize();
+  nextChars.SetSize(cur_size - iCharPos);
+  FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
+               (cur_size - iCharPos) * sizeof(CFX_RTFChar));
+  iCount -= iCharPos;
+  cur_size = curChars.GetSize();
+  curChars.RemoveAt(cur_size - iCount, iCount);
+  pNextLine->m_iStart = pCurLine->m_iStart;
+  pNextLine->m_iWidth = pCurLine->GetLineEnd() - iEndPos;
+  pCurLine->m_iWidth = iEndPos;
+  CFX_RTFChar* tc = curChars.GetDataPtr(iCharPos - 1);
+  tc->m_nBreakType = FX_LBT_UNKNOWN;
+  iCount = nextChars.GetSize();
+  CFX_RTFChar* pNextChars = nextChars.GetData();
+  for (int32_t i = 0; i < iCount; i++) {
+    CFX_RTFChar* tc = pNextChars + i;
+    if (tc->GetCharType() >= FX_CHARTYPE_ArabicAlef) {
+      pCurLine->m_iArabicChars--;
+      pNextLine->m_iArabicChars++;
+    }
+    if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) {
+      pCurLine->m_iMBCSChars--;
+      pNextLine->m_iMBCSChars++;
+    }
+    tc->m_dwStatus = 0;
+  }
+}
+int32_t CFX_RTFBreak::CountBreakPieces() const {
+  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
+  if (pRTFPieces == NULL) {
+    return 0;
+  }
+  return pRTFPieces->GetSize();
+}
+const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const {
+  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
+  if (pRTFPieces == NULL) {
+    return NULL;
+  }
+  if (index < 0 || index >= pRTFPieces->GetSize()) {
+    return NULL;
+  }
+  return pRTFPieces->GetPtrAt(index);
+}
+void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const {
+  rect.top = 0;
+  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
+  if (pRTFLine == NULL) {
+    rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f;
+    rect.width = rect.height = 0;
+    return;
+  }
+  rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f;
+  rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f;
+  CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces;
+  int32_t iCount = rtfPieces.GetSize();
+  if (iCount < 1) {
+    rect.width = 0;
+    return;
+  }
+  CFX_RTFPiece* pBreakPiece;
+  int32_t iLineHeight = 0, iMax;
+  for (int32_t i = 0; i < iCount; i++) {
+    pBreakPiece = rtfPieces.GetPtrAt(i);
+    int32_t iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight *
+                                      pBreakPiece->m_iVerticalScale / 100.0f);
+    iMax = std::max(pBreakPiece->m_iFontSize, iFontHeight);
+    if (i == 0) {
+      iLineHeight = iMax;
+    } else if (iLineHeight < iMax) {
+      iLineHeight = iMax;
+    }
+  }
+  rect.height = ((FX_FLOAT)iLineHeight) / 20.0f;
+}
+void CFX_RTFBreak::ClearBreakPieces() {
+  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
+  if (pRTFLine != NULL) {
+    pRTFLine->RemoveAll(TRUE);
+  }
+  m_iReady = 0;
+}
+void CFX_RTFBreak::Reset() {
+  m_dwCharType = 0;
+  m_RTFLine1.RemoveAll(TRUE);
+  m_RTFLine2.RemoveAll(TRUE);
+}
+int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText,
+                                    FXTEXT_CHARPOS* pCharPos,
+                                    FX_BOOL bCharCode,
+                                    CFX_WideString* pWSForms,
+                                    FX_AdjustCharDisplayPos pAdjustPos) const {
+  if (pText == NULL || pText->iLength < 1) {
+    return 0;
+  }
+  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
+               pText->pFont != NULL && pText->pRect != NULL);
+  const FX_WCHAR* pStr = pText->pStr;
+  int32_t* pWidths = pText->pWidths;
+  int32_t iLength = pText->iLength - 1;
+  IFX_Font* pFont = pText->pFont;
+  FX_DWORD dwStyles = pText->dwLayoutStyles;
+  CFX_RectF rtText(*pText->pRect);
+  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
+  FX_FLOAT fFontSize = pText->fFontSize;
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  int32_t iAscent = pFont->GetAscent();
+  int32_t iDescent = pFont->GetDescent();
+  int32_t iMaxHeight = iAscent - iDescent;
+  FX_FLOAT fFontHeight = fFontSize;
+  FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight;
+  FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight;
+  FX_BOOL bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
+  FX_BOOL bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
+  FX_BOOL bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0;
+  FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
+  int32_t iRotation = GetLineRotation(dwStyles) + pText->iCharRotation;
+  int32_t iCharRotation;
+  FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm;
+  int32_t iWidth, iCharWidth, iCharHeight;
+  FX_FLOAT fX, fY, fCharWidth, fCharHeight;
+  int32_t iHorScale = pText->iHorizontalScale;
+  int32_t iVerScale = pText->iVerticalScale;
+  FX_BOOL bEmptyChar;
+  FX_DWORD dwProps, dwCharType;
+  fX = rtText.left;
+  fY = rtText.top;
+  if (bVerticalDoc) {
+    fX += (rtText.width - fFontSize) / 2.0f;
+    if (bRTLPiece) {
+      fY = rtText.bottom();
+    }
+  } else {
+    if (bRTLPiece) {
+      fX = rtText.right();
+    }
+    fY += fAscent;
+  }
+  int32_t iCount = 0;
+  for (int32_t i = 0; i <= iLength; i++) {
+    wch = *pStr++;
+    iWidth = *pWidths++;
+    if (!bMBCSCode) {
+      dwProps = FX_GetUnicodeProperties(wch);
+      dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
+      if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
+        wPrev = 0xFEFF;
+        continue;
+      }
+    } else {
+      dwProps = 0;
+      dwCharType = 0;
+    }
+    if (iWidth != 0) {
+      iCharWidth = iWidth;
+      if (iCharWidth < 0) {
+        iCharWidth = -iCharWidth;
+      }
+      if (!bMBCSCode) {
+        bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab &&
+                      dwCharType <= FX_CHARTYPE_Control);
+      } else {
+        bEmptyChar = FALSE;
+      }
+      if (!bEmptyChar) {
+        iCount++;
+      }
+      if (pCharPos != NULL) {
+        iCharWidth /= iFontSize;
+        wForm = wch;
+        if (!bMBCSCode) {
+          if (dwCharType >= FX_CHARTYPE_ArabicAlef) {
+            if (i < iLength) {
+              wNext = *pStr;
+              if (*pWidths < 0) {
+                if (i + 1 < iLength) {
+                  wNext = pStr[1];
+                }
+              }
+            } else {
+              wNext = 0xFEFF;
+            }
+            wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext);
+          } else if (bRTLPiece || bVerticalChar) {
+            wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar);
+          } else if (dwCharType == FX_CHARTYPE_Numeric && bArabicNumber) {
+            wForm = wch + 0x0630;
+          }
+          dwProps = FX_GetUnicodeProperties(wForm);
+        }
+        iCharRotation = iRotation;
+        if (!bMBCSCode && bVerticalChar && (dwProps & 0x8000) != 0) {
+          iCharRotation++;
+          iCharRotation %= 4;
+        }
+        if (!bEmptyChar) {
+          if (bCharCode) {
+            pCharPos->m_GlyphIndex = wch;
+          } else {
+            pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wForm, bMBCSCode);
+            if (pCharPos->m_GlyphIndex == 0xFFFF) {
+              pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wch, bMBCSCode);
+            }
+          }
+          pCharPos->m_ExtGID = pCharPos->m_GlyphIndex;
+          pCharPos->m_FontCharWidth = iCharWidth;
+          if (pWSForms) {
+            *pWSForms += wForm;
+          }
+        }
+        if (bVerticalDoc) {
+          iCharHeight = iCharWidth;
+          iCharWidth = 1000;
+        } else {
+          iCharHeight = 1000;
+        }
+        fCharWidth = fFontSize * iCharWidth / 1000.0f;
+        fCharHeight = fFontSize * iCharHeight / 1000.0f;
+        if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
+          if (bVerticalDoc) {
+            fY -= fCharHeight;
+          } else {
+            fX -= fCharWidth;
+          }
+        }
+        if (!bEmptyChar) {
+          CFX_PointF ptOffset;
+          FX_BOOL bAdjusted = FALSE;
+          if (pAdjustPos) {
+            bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize,
+                                   bVerticalChar, ptOffset);
+          }
+          if (!pAdjustPos && bVerticalChar && (dwProps & 0x00010000) != 0) {
+            CFX_Rect rtBBox;
+            rtBBox.Reset();
+            if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) {
+              ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f;
+              ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f;
+            }
+          }
+          pCharPos->m_OriginX = fX + ptOffset.x;
+          pCharPos->m_OriginY = fY - ptOffset.y;
+        }
+        if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
+          if (bVerticalDoc) {
+            fY += fCharHeight;
+          } else {
+            fX += fCharWidth;
+          }
+        }
+        if (!bEmptyChar) {
+          pCharPos->m_bGlyphAdjust = TRUE;
+          if (bVerticalDoc) {
+            if (iCharRotation == 0) {
+              pCharPos->m_AdjustMatrix[0] = -1;
+              pCharPos->m_AdjustMatrix[1] = 0;
+              pCharPos->m_AdjustMatrix[2] = 0;
+              pCharPos->m_AdjustMatrix[3] = 1;
+              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f;
+            } else if (iCharRotation == 1) {
+              pCharPos->m_AdjustMatrix[0] = 0;
+              pCharPos->m_AdjustMatrix[1] = -1;
+              pCharPos->m_AdjustMatrix[2] = -1;
+              pCharPos->m_AdjustMatrix[3] = 0;
+              pCharPos->m_OriginX -=
+                  fDescent + fAscent * iVerScale / 100.0f - fAscent;
+            } else if (iCharRotation == 2) {
+              pCharPos->m_AdjustMatrix[0] = 1;
+              pCharPos->m_AdjustMatrix[1] = 0;
+              pCharPos->m_AdjustMatrix[2] = 0;
+              pCharPos->m_AdjustMatrix[3] = -1;
+              pCharPos->m_OriginX += fCharWidth;
+              pCharPos->m_OriginY += fAscent;
+            } else {
+              pCharPos->m_AdjustMatrix[0] = 0;
+              pCharPos->m_AdjustMatrix[1] = 1;
+              pCharPos->m_AdjustMatrix[2] = 1;
+              pCharPos->m_AdjustMatrix[3] = 0;
+              pCharPos->m_OriginX += fAscent;
+              pCharPos->m_OriginY += fCharWidth;
+            }
+          } else {
+            if (iCharRotation == 0) {
+              pCharPos->m_AdjustMatrix[0] = -1;
+              pCharPos->m_AdjustMatrix[1] = 0;
+              pCharPos->m_AdjustMatrix[2] = 0;
+              pCharPos->m_AdjustMatrix[3] = 1;
+              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f - fAscent;
+            } else if (iCharRotation == 1) {
+              pCharPos->m_AdjustMatrix[0] = 0;
+              pCharPos->m_AdjustMatrix[1] = -1;
+              pCharPos->m_AdjustMatrix[2] = -1;
+              pCharPos->m_AdjustMatrix[3] = 0;
+              pCharPos->m_OriginX -= fDescent;
+              pCharPos->m_OriginY -= fAscent + fDescent;
+            } else if (iCharRotation == 2) {
+              pCharPos->m_AdjustMatrix[0] = 1;
+              pCharPos->m_AdjustMatrix[1] = 0;
+              pCharPos->m_AdjustMatrix[2] = 0;
+              pCharPos->m_AdjustMatrix[3] = -1;
+              pCharPos->m_OriginX += fCharWidth;
+              pCharPos->m_OriginY -= fAscent;
+            } else {
+              pCharPos->m_AdjustMatrix[0] = 0;
+              pCharPos->m_AdjustMatrix[1] = 1;
+              pCharPos->m_AdjustMatrix[2] = 1;
+              pCharPos->m_AdjustMatrix[3] = 0;
+              pCharPos->m_OriginX += fAscent * iVerScale / 100.0f;
+            }
+          }
+          if (iHorScale != 100 || iVerScale != 100) {
+            pCharPos->m_AdjustMatrix[0] =
+                pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f;
+            pCharPos->m_AdjustMatrix[1] =
+                pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f;
+            pCharPos->m_AdjustMatrix[2] =
+                pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f;
+            pCharPos->m_AdjustMatrix[3] =
+                pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
+          }
+          pCharPos++;
+        }
+      }
+    }
+    if (iWidth > 0) {
+      wPrev = wch;
+    }
+  }
+  return iCount;
+}
+int32_t CFX_RTFBreak::GetCharRects(const FX_RTFTEXTOBJ* pText,
+                                   CFX_RectFArray& rtArray,
+                                   FX_BOOL bCharBBox) const {
+  if (pText == NULL || pText->iLength < 1) {
+    return 0;
+  }
+  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
+               pText->pFont != NULL && pText->pRect != NULL);
+  const FX_WCHAR* pStr = pText->pStr;
+  int32_t* pWidths = pText->pWidths;
+  int32_t iLength = pText->iLength;
+  CFX_RectF rect(*pText->pRect);
+  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
+  FX_FLOAT fFontSize = pText->fFontSize;
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  FX_FLOAT fScale = fFontSize / 1000.0f;
+  IFX_Font* pFont = pText->pFont;
+  if (pFont == NULL) {
+    bCharBBox = FALSE;
+  }
+  CFX_Rect bbox;
+  bbox.Set(0, 0, 0, 0);
+  if (bCharBBox) {
+    bCharBBox = pFont->GetBBox(bbox);
+  }
+  FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
+  FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
+  rtArray.RemoveAll();
+  rtArray.SetSize(iLength);
+  FX_DWORD dwStyles = pText->dwLayoutStyles;
+  FX_BOOL bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
+  FX_BOOL bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
+  FX_BOOL bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
+  FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar;
+  int32_t iCharSize;
+  FX_FLOAT fCharSize, fStart;
+  if (bVertical) {
+    fStart = bRTLPiece ? rect.bottom() : rect.top;
+  } else {
+    fStart = bRTLPiece ? rect.right() : rect.left;
+  }
+  for (int32_t i = 0; i < iLength; i++) {
+    wch = *pStr++;
+    iCharSize = *pWidths++;
+    fCharSize = (FX_FLOAT)iCharSize / 20000.0f;
+    FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch));
+    if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 ||
+          (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) {
+      bRet = FALSE;
+    }
+    if (bRet) {
+      iCharSize = iFontSize * 500;
+      fCharSize = fFontSize / 2.0f;
+    }
+    if (bVertical) {
+      rect.top = fStart;
+      if (bRTLPiece) {
+        rect.top -= fCharSize;
+        fStart -= fCharSize;
+      } else {
+        fStart += fCharSize;
+      }
+      rect.height = fCharSize;
+    } else {
+      rect.left = fStart;
+      if (bRTLPiece) {
+        rect.left -= fCharSize;
+        fStart -= fCharSize;
+      } else {
+        fStart += fCharSize;
+      }
+      rect.width = fCharSize;
+    }
+    if (bCharBBox && !bRet) {
+      int32_t iCharWidth = 1000;
+      pFont->GetCharWidth(wch, iCharWidth);
+      FX_FLOAT fRTLeft = 0, fCharWidth = 0;
+      if (iCharWidth > 0) {
+        fCharWidth = iCharWidth * fScale;
+        fRTLeft = fLeft;
+        if (bCombText) {
+          fRTLeft = (rect.width - fCharWidth) / 2.0f;
+        }
+      }
+      CFX_RectF rtBBoxF;
+      if (bVertical) {
+        rtBBoxF.top = rect.left + fRTLeft;
+        rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f;
+        rtBBoxF.height = fCharWidth;
+        rtBBoxF.width = fHeight;
+        rtBBoxF.left = std::max(rtBBoxF.left, 0.0f);
+      } else {
+        rtBBoxF.left = rect.left + fRTLeft;
+        rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f;
+        rtBBoxF.width = fCharWidth;
+        rtBBoxF.height = fHeight;
+        rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
+      }
+      rtArray.SetAt(i, rtBBoxF);
+      continue;
+    }
+    rtArray.SetAt(i, rect);
+  }
+  return iLength;
+}
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
new file mode 100644
index 0000000..7e395f6
--- /dev/null
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -0,0 +1,237 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_
+#define XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_
+
+#include "core/include/fxcrt/fx_ucd.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fgas/crt/fgas_memory.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/layout/fgas_textbreak.h"
+#include "xfa/fgas/layout/fgas_unicode.h"
+
+class IFX_Unknown;
+class IFX_Font;
+
+#define FX_RTFBREAKPOLICY_None 0x00
+#define FX_RTFBREAKPOLICY_SpaceBreak 0x01
+#define FX_RTFBREAKPOLICY_NumberBreak 0x02
+#define FX_RTFBREAKPOLICY_InfixBreak 0x04
+#define FX_RTFBREAKPOLICY_TabBreak 0x08
+#define FX_RTFBREAKPOLICY_OrphanPositionedTab 0x10
+#define FX_RTFBREAK_None 0x00
+#define FX_RTFBREAK_PieceBreak 0x01
+#define FX_RTFBREAK_LineBreak 0x02
+#define FX_RTFBREAK_ParagraphBreak 0x03
+#define FX_RTFBREAK_PageBreak 0x04
+#define FX_RTFLAYOUTSTYLE_Pagination 0x01
+#define FX_RTFLAYOUTSTYLE_VerticalLayout 0x02
+#define FX_RTFLAYOUTSTYLE_VerticalChars 0x04
+#define FX_RTFLAYOUTSTYLE_LineDirection 0x08
+#define FX_RTFLAYOUTSTYLE_ExpandTab 0x10
+#define FX_RTFLAYOUTSTYLE_ArabicNumber 0x20
+#define FX_RTFLAYOUTSTYLE_SingleLine 0x40
+#define FX_RTFLAYOUTSTYLE_MBCSCode 0x80
+#define FX_RTFCHARSTYLE_Alignment 0x000F
+#define FX_RTFCHARSTYLE_ArabicNumber 0x0010
+#define FX_RTFCHARSTYLE_ArabicShadda 0x0020
+#define FX_RTFCHARSTYLE_OddBidiLevel 0x0040
+#define FX_RTFCHARSTYLE_RTLReadingOrder 0x0080
+#define FX_RTFCHARSTYLE_ArabicContext 0x0300
+#define FX_RTFCHARSTYLE_ArabicIndic 0x0400
+#define FX_RTFCHARSTYLE_ArabicComma 0x0800
+#define FX_RTFLINEALIGNMENT_Left 0
+#define FX_RTFLINEALIGNMENT_Center 1
+#define FX_RTFLINEALIGNMENT_Right 2
+#define FX_RTFLINEALIGNMENT_Justified (1 << 2)
+#define FX_RTFLINEALIGNMENT_Distributed (2 << 2)
+#define FX_RTFLINEALIGNMENT_JustifiedLeft \
+  (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Justified)
+#define FX_RTFLINEALIGNMENT_JustifiedCenter \
+  (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Justified)
+#define FX_RTFLINEALIGNMENT_JustifiedRight \
+  (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Justified)
+#define FX_RTFLINEALIGNMENT_DistributedLeft \
+  (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Distributed)
+#define FX_RTFLINEALIGNMENT_DistributedCenter \
+  (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Distributed)
+#define FX_RTFLINEALIGNMENT_DistributedRight \
+  (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Distributed)
+#define FX_RTFLINEALIGNMENT_LowerMask 0x03
+#define FX_RTFLINEALIGNMENT_HigherMask 0x0C
+
+struct FX_RTFTEXTOBJ {
+  FX_RTFTEXTOBJ() {
+    pStr = NULL;
+    pWidths = NULL;
+    iLength = 0;
+    pFont = NULL;
+    fFontSize = 12.0f;
+    dwLayoutStyles = 0;
+    iCharRotation = 0;
+    iBidiLevel = 0;
+    pRect = NULL;
+    wLineBreakChar = L'\n';
+    iHorizontalScale = 100;
+    iVerticalScale = 100;
+  }
+
+  const FX_WCHAR* pStr;
+  int32_t* pWidths;
+  int32_t iLength;
+  IFX_Font* pFont;
+  FX_FLOAT fFontSize;
+  FX_DWORD dwLayoutStyles;
+  int32_t iCharRotation;
+  int32_t iBidiLevel;
+  const CFX_RectF* pRect;
+  FX_WCHAR wLineBreakChar;
+  int32_t iHorizontalScale;
+  int32_t iVerticalScale;
+};
+
+class CFX_RTFPiece : public CFX_Target {
+ public:
+  CFX_RTFPiece()
+      : m_dwStatus(FX_RTFBREAK_PieceBreak),
+        m_iStartPos(0),
+        m_iWidth(-1),
+        m_iStartChar(0),
+        m_iChars(0),
+        m_iBidiLevel(0),
+        m_iBidiPos(0),
+        m_iFontSize(0),
+        m_iFontHeight(0),
+        m_iHorizontalScale(100),
+        m_iVerticalScale(100),
+        m_dwLayoutStyles(0),
+        m_dwIdentity(0),
+        m_pChars(NULL),
+        m_pUserData(NULL) {}
+  ~CFX_RTFPiece() { Reset(); }
+  void AppendChar(const CFX_RTFChar& tc) {
+    FXSYS_assert(m_pChars != NULL);
+    m_pChars->Add(tc);
+    if (m_iWidth < 0) {
+      m_iWidth = tc.m_iCharWidth;
+    } else {
+      m_iWidth += tc.m_iCharWidth;
+    }
+    m_iChars++;
+  }
+  int32_t GetEndPos() const {
+    return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
+  }
+  int32_t GetLength() const { return m_iChars; }
+  int32_t GetEndChar() const { return m_iStartChar + m_iChars; }
+  CFX_RTFChar& GetChar(int32_t index) {
+    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
+    return *m_pChars->GetDataPtr(m_iStartChar + index);
+  }
+  CFX_RTFChar* GetCharPtr(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
+    return m_pChars->GetDataPtr(m_iStartChar + index);
+  }
+  void GetString(FX_WCHAR* pText) const {
+    FXSYS_assert(pText != NULL);
+    int32_t iEndChar = m_iStartChar + m_iChars;
+    CFX_RTFChar* pChar;
+    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
+      pChar = m_pChars->GetDataPtr(i);
+      *pText++ = (FX_WCHAR)pChar->m_wCharCode;
+    }
+  }
+  void GetString(CFX_WideString& wsText) const {
+    FX_WCHAR* pText = wsText.GetBuffer(m_iChars);
+    GetString(pText);
+    wsText.ReleaseBuffer(m_iChars);
+  }
+  void GetWidths(int32_t* pWidths) const {
+    FXSYS_assert(pWidths != NULL);
+    int32_t iEndChar = m_iStartChar + m_iChars;
+    CFX_RTFChar* pChar;
+    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
+      pChar = m_pChars->GetDataPtr(i);
+      *pWidths++ = pChar->m_iCharWidth;
+    }
+  }
+  void Reset() {
+    m_dwStatus = FX_RTFBREAK_PieceBreak;
+    if (m_iWidth > -1) {
+      m_iStartPos += m_iWidth;
+    }
+    m_iWidth = -1;
+    m_iStartChar += m_iChars;
+    m_iChars = 0;
+    m_iBidiLevel = 0;
+    m_iBidiPos = 0;
+    m_iHorizontalScale = 100;
+    m_iVerticalScale = 100;
+  }
+  FX_DWORD m_dwStatus;
+  int32_t m_iStartPos;
+  int32_t m_iWidth;
+  int32_t m_iStartChar;
+  int32_t m_iChars;
+  int32_t m_iBidiLevel;
+  int32_t m_iBidiPos;
+  int32_t m_iFontSize;
+  int32_t m_iFontHeight;
+  int32_t m_iHorizontalScale;
+  int32_t m_iVerticalScale;
+  FX_DWORD m_dwLayoutStyles;
+  FX_DWORD m_dwIdentity;
+  CFX_RTFCharArray* m_pChars;
+  IFX_Unknown* m_pUserData;
+};
+typedef CFX_BaseArrayTemplate<CFX_RTFPiece> CFX_RTFPieceArray;
+
+class IFX_RTFBreak {
+ public:
+  static IFX_RTFBreak* Create(FX_DWORD dwPolicies);
+  virtual ~IFX_RTFBreak() {}
+  virtual void Release() = 0;
+  virtual void SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) = 0;
+  virtual void SetLineStartPos(FX_FLOAT fLinePos) = 0;
+  virtual FX_DWORD GetLayoutStyles() const = 0;
+  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;
+  virtual void SetFont(IFX_Font* pFont) = 0;
+  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+  virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0;
+  virtual void AddPositionedTab(FX_FLOAT fTabPos) = 0;
+  virtual void SetPositionedTabs(const CFX_FloatArray& tabs) = 0;
+  virtual void ClearPositionedTabs() = 0;
+  virtual void SetDefaultChar(FX_WCHAR wch) = 0;
+  virtual void SetLineBreakChar(FX_WCHAR wch) = 0;
+  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
+  virtual void SetHorizontalScale(int32_t iScale) = 0;
+  virtual void SetVerticalScale(int32_t iScale) = 0;
+  virtual void SetCharRotation(int32_t iCharRotation) = 0;
+  virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0;
+  virtual void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) = 0;
+  virtual void SetReadingOrder(FX_BOOL bRTL = FALSE) = 0;
+  virtual void SetAlignment(int32_t iAlignment = FX_RTFLINEALIGNMENT_Left) = 0;
+  virtual void SetUserData(IFX_Unknown* pUserData) = 0;
+  virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0;
+  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) = 0;
+  virtual int32_t CountBreakPieces() const = 0;
+  virtual const CFX_RTFPiece* GetBreakPiece(int32_t index) const = 0;
+  virtual void GetLineRect(CFX_RectF& rect) const = 0;
+  virtual void ClearBreakPieces() = 0;
+  virtual void Reset() = 0;
+  virtual int32_t GetDisplayPos(
+      const FX_RTFTEXTOBJ* pText,
+      FXTEXT_CHARPOS* pCharPos,
+      FX_BOOL bCharCode = FALSE,
+      CFX_WideString* pWSForms = NULL,
+      FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;
+  virtual int32_t GetCharRects(const FX_RTFTEXTOBJ* pText,
+                               CFX_RectFArray& rtArray,
+                               FX_BOOL bCharBBox = FALSE) const = 0;
+};
+
+#endif  // XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
new file mode 100644
index 0000000..0cc4198
--- /dev/null
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -0,0 +1,1824 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/layout/fgas_textbreak.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_arb.h"
+#include "core/include/fxcrt/fx_memory.h"
+#include "xfa/fgas/layout/fgas_linebreak.h"
+#include "xfa/fgas/layout/fgas_unicode.h"
+
+namespace {
+
+class CFX_TxtLine {
+ public:
+  CFX_TxtLine(int32_t iBlockSize)
+      : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {
+    m_pLineChars = new CFX_TxtCharArray;
+    m_pLinePieces = new CFX_TxtPieceArray(16);
+  }
+  ~CFX_TxtLine() {
+    RemoveAll();
+    delete m_pLineChars;
+    delete m_pLinePieces;
+  }
+  int32_t CountChars() const { return m_pLineChars->GetSize(); }
+  CFX_TxtChar* GetCharPtr(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_pLineChars->GetSize());
+    return m_pLineChars->GetDataPtr(index);
+  }
+  int32_t CountPieces() const { return m_pLinePieces->GetSize(); }
+  CFX_TxtPiece* GetPiecePtr(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_pLinePieces->GetSize());
+    return m_pLinePieces->GetPtrAt(index);
+  }
+  void GetString(CFX_WideString& wsStr) const {
+    int32_t iCount = m_pLineChars->GetSize();
+    FX_WCHAR* pBuf = wsStr.GetBuffer(iCount);
+    CFX_Char* pChar;
+    for (int32_t i = 0; i < iCount; i++) {
+      pChar = m_pLineChars->GetDataPtr(i);
+      *pBuf++ = (FX_WCHAR)pChar->m_wCharCode;
+    }
+    wsStr.ReleaseBuffer(iCount);
+  }
+  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
+    m_pLineChars->RemoveAll();
+    m_pLinePieces->RemoveAll(bLeaveMemory);
+    m_iWidth = 0;
+    m_iArabicChars = 0;
+  }
+  CFX_TxtCharArray* m_pLineChars;
+  CFX_TxtPieceArray* m_pLinePieces;
+  int32_t m_iStart;
+  int32_t m_iWidth;
+  int32_t m_iArabicChars;
+};
+
+class CFX_TxtBreak : public IFX_TxtBreak {
+ public:
+  CFX_TxtBreak(FX_DWORD dwPolicies);
+  ~CFX_TxtBreak();
+  virtual void Release() { delete this; }
+  virtual void SetLineWidth(FX_FLOAT fLineWidth);
+  virtual void SetLinePos(FX_FLOAT fLinePos);
+  virtual FX_DWORD GetLayoutStyles() const { return m_dwLayoutStyles; }
+  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles);
+  virtual void SetFont(IFX_Font* pFont);
+  virtual void SetFontSize(FX_FLOAT fFontSize);
+  virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
+  virtual void SetDefaultChar(FX_WCHAR wch);
+  virtual void SetParagraphBreakChar(FX_WCHAR wch);
+  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
+  virtual void SetHorizontalScale(int32_t iScale);
+  virtual void SetVerticalScale(int32_t iScale);
+  virtual void SetCharRotation(int32_t iCharRotation);
+  virtual void SetCharSpace(FX_FLOAT fCharSpace);
+  virtual void SetAlignment(int32_t iAlignment);
+  virtual FX_DWORD GetContextCharStyles() const;
+  virtual void SetContextCharStyles(FX_DWORD dwCharStyles);
+  virtual void SetCombWidth(FX_FLOAT fCombWidth);
+  virtual void SetUserData(void* pUserData);
+  virtual FX_DWORD AppendChar(FX_WCHAR wch);
+  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak);
+  virtual int32_t CountBreakChars() const;
+  virtual int32_t CountBreakPieces() const;
+  virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const;
+  virtual void ClearBreakPieces();
+  virtual void Reset();
+  virtual int32_t GetDisplayPos(
+      const FX_TXTRUN* pTxtRun,
+      FXTEXT_CHARPOS* pCharPos,
+      FX_BOOL bCharCode = FALSE,
+      CFX_WideString* pWSForms = NULL,
+      FX_AdjustCharDisplayPos pAdjustPos = NULL) const;
+  virtual int32_t GetCharRects(const FX_TXTRUN* pTxtRun,
+                               CFX_RectFArray& rtArray,
+                               FX_BOOL bCharBBox = FALSE) const;
+  void AppendChar_PageLoad(CFX_Char* pCurChar, FX_DWORD dwProps);
+  FX_DWORD AppendChar_Combination(CFX_Char* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Control(CFX_Char* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Arabic(CFX_Char* pCurChar, int32_t iRotation);
+  FX_DWORD AppendChar_Others(CFX_Char* pCurChar, int32_t iRotation);
+
+ protected:
+  FX_DWORD m_dwPolicies;
+  FX_BOOL m_bPagination;
+  IFX_ArabicChar* m_pArabicChar;
+  int32_t m_iLineWidth;
+  FX_DWORD m_dwLayoutStyles;
+  FX_BOOL m_bVertical;
+  FX_BOOL m_bArabicContext;
+  FX_BOOL m_bArabicShapes;
+  FX_BOOL m_bRTL;
+  FX_BOOL m_bSingleLine;
+  FX_BOOL m_bCombText;
+  int32_t m_iArabicContext;
+  int32_t m_iCurArabicContext;
+  IFX_Font* m_pFont;
+  int32_t m_iFontSize;
+  FX_BOOL m_bEquidistant;
+  int32_t m_iTabWidth;
+  FX_WCHAR m_wDefChar;
+  FX_WCHAR m_wParagBreakChar;
+  int32_t m_iDefChar;
+  int32_t m_iLineRotation;
+  int32_t m_iCharRotation;
+  int32_t m_iRotation;
+  int32_t m_iAlignment;
+  FX_DWORD m_dwContextCharStyles;
+  int32_t m_iCombWidth;
+  void* m_pUserData;
+  FX_DWORD m_dwCharType;
+  FX_BOOL m_bCurRTL;
+  int32_t m_iCurAlignment;
+  FX_BOOL m_bArabicNumber;
+  FX_BOOL m_bArabicComma;
+  CFX_TxtLine* m_pTxtLine1;
+  CFX_TxtLine* m_pTxtLine2;
+  CFX_TxtLine* m_pCurLine;
+  int32_t m_iReady;
+  int32_t m_iTolerance;
+  int32_t m_iHorScale;
+  int32_t m_iVerScale;
+  int32_t m_iCharSpace;
+  void SetBreakStatus();
+  int32_t GetLineRotation(FX_DWORD dwStyles) const;
+  CFX_TxtChar* GetLastChar(int32_t index, FX_BOOL bOmitChar = TRUE) const;
+  CFX_TxtLine* GetTxtLine(FX_BOOL bReady) const;
+  CFX_TxtPieceArray* GetTxtPieces(FX_BOOL bReady) const;
+  FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const;
+  void ResetArabicContext();
+  void ResetContextCharStyles();
+  void EndBreak_UpdateArabicShapes();
+  FX_BOOL EndBreak_SplitLine(CFX_TxtLine* pNextLine,
+                             FX_BOOL bAllChars,
+                             FX_DWORD dwStatus);
+  void EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus);
+  void EndBreak_Alignment(CFX_TPOArray& tpos,
+                          FX_BOOL bAllChars,
+                          FX_DWORD dwStatus);
+  int32_t GetBreakPos(CFX_TxtCharArray& ca,
+                      int32_t& iEndPos,
+                      FX_BOOL bAllChars = FALSE,
+                      FX_BOOL bOnlyBrk = FALSE);
+  void SplitTextLine(CFX_TxtLine* pCurLine,
+                     CFX_TxtLine* pNextLine,
+                     FX_BOOL bAllChars = FALSE);
+};
+
+}  // namespace
+
+extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32];
+IFX_TxtBreak* IFX_TxtBreak::Create(FX_DWORD dwPolicies) {
+  return new CFX_TxtBreak(dwPolicies);
+}
+CFX_TxtBreak::CFX_TxtBreak(FX_DWORD dwPolicies)
+    : m_dwPolicies(dwPolicies),
+      m_pArabicChar(NULL),
+      m_iLineWidth(2000000),
+      m_dwLayoutStyles(0),
+      m_bVertical(FALSE),
+      m_bArabicContext(FALSE),
+      m_bArabicShapes(FALSE),
+      m_bRTL(FALSE),
+      m_bSingleLine(FALSE),
+      m_bCombText(FALSE),
+      m_iArabicContext(1),
+      m_iCurArabicContext(1),
+      m_pFont(NULL),
+      m_iFontSize(240),
+      m_bEquidistant(TRUE),
+      m_iTabWidth(720000),
+      m_wDefChar(0xFEFF),
+      m_wParagBreakChar(L'\n'),
+      m_iDefChar(0),
+      m_iLineRotation(0),
+      m_iCharRotation(0),
+      m_iRotation(0),
+      m_iAlignment(FX_TXTLINEALIGNMENT_Left),
+      m_dwContextCharStyles(0),
+      m_iCombWidth(360000),
+      m_pUserData(NULL),
+      m_dwCharType(0),
+      m_bArabicNumber(FALSE),
+      m_bArabicComma(FALSE),
+      m_pCurLine(NULL),
+      m_iReady(0),
+      m_iTolerance(0),
+      m_iHorScale(100),
+      m_iVerScale(100),
+      m_iCharSpace(0) {
+  m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0;
+  m_pArabicChar = IFX_ArabicChar::Create();
+  if (m_bPagination) {
+    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_Char));
+    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_Char));
+  } else {
+    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_TxtChar));
+    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_TxtChar));
+  }
+  m_pCurLine = m_pTxtLine1;
+  ResetArabicContext();
+}
+CFX_TxtBreak::~CFX_TxtBreak() {
+  Reset();
+  delete m_pTxtLine1;
+  delete m_pTxtLine2;
+  m_pArabicChar->Release();
+}
+void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) {
+  m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f);
+  FXSYS_assert(m_iLineWidth >= 20000);
+}
+void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) {
+  int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
+  if (iLinePos < 0) {
+    iLinePos = 0;
+  }
+  if (iLinePos > m_iLineWidth) {
+    iLinePos = m_iLineWidth;
+  }
+  m_pCurLine->m_iStart = iLinePos;
+  m_pCurLine->m_iWidth += iLinePos;
+}
+void CFX_TxtBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) {
+  m_dwLayoutStyles = dwLayoutStyles;
+  m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0;
+  m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0;
+  m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0;
+  m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0;
+  m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0;
+  m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
+  ResetArabicContext();
+  m_iLineRotation = GetLineRotation(m_dwLayoutStyles);
+  m_iRotation = m_iLineRotation + m_iCharRotation;
+  m_iRotation %= 4;
+}
+void CFX_TxtBreak::SetFont(IFX_Font* pFont) {
+  if (pFont == NULL) {
+    return;
+  }
+  if (m_pFont == pFont) {
+    return;
+  }
+  SetBreakStatus();
+  m_pFont = pFont;
+  m_iDefChar = 0;
+  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
+    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+    m_iDefChar *= m_iFontSize;
+  }
+}
+void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) {
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  if (m_iFontSize == iFontSize) {
+    return;
+  }
+  SetBreakStatus();
+  m_iFontSize = iFontSize;
+  m_iDefChar = 0;
+  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
+    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+    m_iDefChar *= m_iFontSize;
+  }
+}
+void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
+  m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
+  if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) {
+    m_iTabWidth = FX_TXTBREAK_MinimumTabWidth;
+  }
+  m_bEquidistant = bEquidistant;
+}
+void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) {
+  m_wDefChar = wch;
+  m_iDefChar = 0;
+  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
+    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
+    if (m_iDefChar < 0) {
+      m_iDefChar = 0;
+    } else {
+      m_iDefChar *= m_iFontSize;
+    }
+  }
+}
+void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) {
+  if (wch != L'\r' && wch != L'\n') {
+    return;
+  }
+  m_wParagBreakChar = wch;
+}
+void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
+  m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
+}
+void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) {
+  if (iCharRotation < 0) {
+    iCharRotation += (-iCharRotation / 4 + 1) * 4;
+  } else if (iCharRotation > 3) {
+    iCharRotation -= (iCharRotation / 4) * 4;
+  }
+  if (m_iCharRotation == iCharRotation) {
+    return;
+  }
+  SetBreakStatus();
+  m_iCharRotation = iCharRotation;
+  m_iRotation = m_iLineRotation + m_iCharRotation;
+  m_iRotation %= 4;
+}
+void CFX_TxtBreak::SetAlignment(int32_t iAlignment) {
+  FXSYS_assert(iAlignment >= FX_TXTLINEALIGNMENT_Left &&
+               iAlignment <= FX_TXTLINEALIGNMENT_Distributed);
+  m_iAlignment = iAlignment;
+  ResetArabicContext();
+}
+void CFX_TxtBreak::ResetContextCharStyles() {
+  m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment;
+  if (m_bArabicNumber) {
+    m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber;
+  }
+  if (m_bArabicComma) {
+    m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma;
+  }
+  if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) {
+    m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder;
+  }
+  m_dwContextCharStyles |= (m_iArabicContext << 8);
+}
+FX_DWORD CFX_TxtBreak::GetContextCharStyles() const {
+  return m_dwContextCharStyles;
+}
+void CFX_TxtBreak::SetContextCharStyles(FX_DWORD dwCharStyles) {
+  m_iCurAlignment = dwCharStyles & 0x0F;
+  m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0;
+  m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0;
+  m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0;
+  m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8);
+  ResetContextCharStyles();
+}
+void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) {
+  m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f);
+}
+void CFX_TxtBreak::SetUserData(void* pUserData) {
+  if (m_pUserData == pUserData) {
+    return;
+  }
+  SetBreakStatus();
+  m_pUserData = pUserData;
+}
+void CFX_TxtBreak::SetBreakStatus() {
+  if (m_bPagination) {
+    return;
+  }
+  int32_t iCount = m_pCurLine->CountChars();
+  if (iCount < 1) {
+    return;
+  }
+  CFX_TxtChar* pTC = (CFX_TxtChar*)m_pCurLine->GetCharPtr(iCount - 1);
+  if (pTC->m_dwStatus == 0) {
+    pTC->m_dwStatus = FX_TXTBREAK_PieceBreak;
+  }
+}
+void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) {
+  if (iScale < 0) {
+    iScale = 0;
+  }
+  if (iScale == m_iHorScale) {
+    return;
+  }
+  SetBreakStatus();
+  m_iHorScale = iScale;
+}
+void CFX_TxtBreak::SetVerticalScale(int32_t iScale) {
+  if (iScale < 0) {
+    iScale = 0;
+  }
+  if (iScale == m_iHorScale) {
+    return;
+  }
+  SetBreakStatus();
+  m_iVerScale = iScale;
+}
+void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) {
+  m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
+}
+static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
+int32_t CFX_TxtBreak::GetLineRotation(FX_DWORD dwStyles) const {
+  return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1];
+}
+CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const {
+  CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars;
+  int32_t iCount = ca.GetSize();
+  if (index < 0 || index >= iCount) {
+    return NULL;
+  }
+  CFX_TxtChar* pTC;
+  int32_t iStart = iCount - 1;
+  while (iStart > -1) {
+    pTC = ca.GetDataPtr(iStart--);
+    if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) {
+      continue;
+    }
+    if (--index < 0) {
+      return pTC;
+    }
+  }
+  return NULL;
+}
+CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const {
+  if (!bReady) {
+    return m_pCurLine;
+  }
+  if (m_iReady == 1) {
+    return m_pTxtLine1;
+  } else if (m_iReady == 2) {
+    return m_pTxtLine2;
+  } else {
+    return NULL;
+  }
+}
+CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const {
+  CFX_TxtLine* pTxtLine = GetTxtLine(bReady);
+  if (pTxtLine == NULL) {
+    return NULL;
+  }
+  return pTxtLine->m_pLinePieces;
+}
+inline FX_DWORD CFX_TxtBreak::GetUnifiedCharType(FX_DWORD dwType) const {
+  return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType;
+}
+void CFX_TxtBreak::ResetArabicContext() {
+  if (m_bArabicContext) {
+    m_bCurRTL = m_iCurArabicContext > 1;
+    m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right
+                                              : FX_TXTLINEALIGNMENT_Left;
+    m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask);
+    m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes;
+  } else {
+    if (m_bPagination) {
+      m_bCurRTL = FALSE;
+      m_iCurAlignment = 0;
+    } else {
+      m_bCurRTL = m_bRTL;
+      m_iCurAlignment = m_iAlignment;
+    }
+    if (m_bRTL) {
+      m_bArabicNumber = m_iArabicContext >= 1;
+    } else {
+      m_bArabicNumber = m_iArabicContext > 1;
+    }
+    m_bArabicNumber = m_bArabicNumber && m_bArabicShapes;
+  }
+  m_bArabicComma = m_bArabicNumber;
+  ResetContextCharStyles();
+}
+void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, FX_DWORD dwProps) {
+  if (!m_bPagination) {
+    ((CFX_TxtChar*)pCurChar)->m_dwStatus = 0;
+    ((CFX_TxtChar*)pCurChar)->m_pUserData = m_pUserData;
+  }
+  if (m_bArabicContext || m_bArabicShapes) {
+    int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
+    int32_t iArabicContext =
+        (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL)
+            ? 2
+            : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0
+                                                                          : 1);
+    if (iArabicContext != m_iArabicContext && iArabicContext != 1) {
+      m_iArabicContext = iArabicContext;
+      if (m_iCurArabicContext == 1) {
+        m_iCurArabicContext = iArabicContext;
+      }
+      ResetArabicContext();
+      if (!m_bPagination) {
+        CFX_TxtChar* pLastChar = (CFX_TxtChar*)GetLastChar(1, FALSE);
+        if (pLastChar != NULL && pLastChar->m_dwStatus < 1) {
+          pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
+        }
+      }
+    }
+  }
+  pCurChar->m_dwCharStyles = m_dwContextCharStyles;
+}
+FX_DWORD CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar,
+                                              int32_t iRotation) {
+  FXSYS_assert(pCurChar != NULL);
+  FX_WCHAR wch = pCurChar->m_wCharCode;
+  FX_WCHAR wForm;
+  int32_t iCharWidth = 0;
+  CFX_Char* pLastChar;
+  pCurChar->m_iCharWidth = -1;
+  if (m_bCombText) {
+    iCharWidth = m_iCombWidth;
+  } else {
+    if (m_bVertical != FX_IsOdd(iRotation)) {
+      iCharWidth = 1000;
+    } else {
+      wForm = wch;
+      if (!m_bPagination) {
+        pLastChar = GetLastChar(0, FALSE);
+        if (pLastChar != NULL &&
+            (((CFX_TxtChar*)pLastChar)->m_dwCharStyles &
+             FX_TXTCHARSTYLE_ArabicShadda) == 0) {
+          FX_BOOL bShadda = FALSE;
+          if (wch == 0x0651) {
+            FX_WCHAR wLast = pLastChar->m_wCharCode;
+            if (wLast >= 0x064C && wLast <= 0x0650) {
+              wForm = FX_GetArabicFromShaddaTable(wLast);
+              bShadda = TRUE;
+            }
+          } else if (wch >= 0x064C && wch <= 0x0650) {
+            if (pLastChar->m_wCharCode == 0x0651) {
+              wForm = FX_GetArabicFromShaddaTable(wch);
+              bShadda = TRUE;
+            }
+          }
+          if (bShadda) {
+            ((CFX_TxtChar*)pLastChar)->m_dwCharStyles |=
+                FX_TXTCHARSTYLE_ArabicShadda;
+            ((CFX_TxtChar*)pLastChar)->m_iCharWidth = 0;
+            ((CFX_TxtChar*)pCurChar)->m_dwCharStyles |=
+                FX_TXTCHARSTYLE_ArabicShadda;
+          }
+        }
+      }
+      if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
+        iCharWidth = 0;
+      }
+    }
+    iCharWidth *= m_iFontSize;
+    iCharWidth = iCharWidth * m_iHorScale / 100;
+  }
+  pCurChar->m_iCharWidth = -iCharWidth;
+  return FX_TXTBREAK_None;
+}
+FX_DWORD CFX_TxtBreak::AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation) {
+  m_dwCharType = FX_CHARTYPE_Tab;
+  if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) {
+    return FX_TXTBREAK_None;
+  }
+  int32_t& iLineWidth = m_pCurLine->m_iWidth;
+  int32_t iCharWidth;
+  if (m_bCombText) {
+    iCharWidth = m_iCombWidth;
+  } else {
+    if (m_bEquidistant) {
+      iCharWidth = iLineWidth;
+      iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth;
+      if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) {
+        iCharWidth += m_iTabWidth;
+      }
+    } else {
+      iCharWidth = m_iTabWidth;
+    }
+  }
+  pCurChar->m_iCharWidth = iCharWidth;
+  iLineWidth += iCharWidth;
+  if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) {
+    return EndBreak(FX_TXTBREAK_LineBreak);
+  }
+  return FX_TXTBREAK_None;
+}
+FX_DWORD CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar,
+                                          int32_t iRotation) {
+  m_dwCharType = FX_CHARTYPE_Control;
+  FX_DWORD dwRet = FX_TXTBREAK_None;
+  if (!m_bSingleLine) {
+    FX_WCHAR wch = pCurChar->m_wCharCode;
+    switch (wch) {
+      case L'\v':
+      case 0x2028:
+        dwRet = FX_TXTBREAK_LineBreak;
+        break;
+      case L'\f':
+        dwRet = FX_TXTBREAK_PageBreak;
+        break;
+      case 0x2029:
+        dwRet = FX_TXTBREAK_ParagraphBreak;
+        break;
+      default:
+        if (wch == m_wParagBreakChar) {
+          dwRet = FX_TXTBREAK_ParagraphBreak;
+        }
+        break;
+    }
+    if (dwRet != FX_TXTBREAK_None) {
+      dwRet = EndBreak(dwRet);
+    }
+  }
+  return dwRet;
+}
+FX_DWORD CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar,
+                                         int32_t iRotation) {
+  FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK);
+  int32_t& iLineWidth = m_pCurLine->m_iWidth;
+  FX_WCHAR wForm;
+  int32_t iCharWidth = 0;
+  CFX_Char* pLastChar = NULL;
+  FX_BOOL bAlef = FALSE;
+  if (!m_bCombText && m_dwCharType >= FX_CHARTYPE_ArabicAlef &&
+      m_dwCharType <= FX_CHARTYPE_ArabicDistortion) {
+    pLastChar = GetLastChar(1);
+    if (pLastChar != NULL) {
+      iCharWidth = pLastChar->m_iCharWidth;
+      if (iCharWidth > 0) {
+        iLineWidth -= iCharWidth;
+      }
+      CFX_Char* pPrevChar = GetLastChar(2);
+      wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar);
+      bAlef = (wForm == 0xFEFF &&
+               pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef);
+      int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation;
+      if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) {
+        iLastRotation++;
+      }
+      if (m_bVertical != FX_IsOdd(iLastRotation)) {
+        iCharWidth = 1000;
+      } else {
+        m_pFont->GetCharWidth(wForm, iCharWidth, FALSE);
+      }
+      if (wForm == 0xFEFF) {
+        iCharWidth = m_iDefChar;
+      }
+      iCharWidth *= m_iFontSize;
+      iCharWidth = iCharWidth * m_iHorScale / 100;
+      pLastChar->m_iCharWidth = iCharWidth;
+      iLineWidth += iCharWidth;
+      iCharWidth = 0;
+    }
+  }
+  m_dwCharType = dwType;
+  wForm = m_pArabicChar->GetFormChar(pCurChar, bAlef ? NULL : pLastChar, NULL);
+  if (m_bCombText) {
+    iCharWidth = m_iCombWidth;
+  } else {
+    if (m_bVertical != FX_IsOdd(iRotation)) {
+      iCharWidth = 1000;
+    } else {
+      m_pFont->GetCharWidth(wForm, iCharWidth, FALSE);
+    }
+    if (wForm == 0xFEFF) {
+      iCharWidth = m_iDefChar;
+    }
+    iCharWidth *= m_iFontSize;
+    iCharWidth = iCharWidth * m_iHorScale / 100;
+  }
+  pCurChar->m_iCharWidth = iCharWidth;
+  iLineWidth += iCharWidth;
+  m_pCurLine->m_iArabicChars++;
+  if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) {
+    return EndBreak(FX_TXTBREAK_LineBreak);
+  }
+  return FX_TXTBREAK_None;
+}
+FX_DWORD CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar,
+                                         int32_t iRotation) {
+  FX_DWORD dwProps = pCurChar->m_dwCharProps;
+  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
+  int32_t& iLineWidth = m_pCurLine->m_iWidth;
+  int32_t iCharWidth = 0;
+  m_dwCharType = dwType;
+  FX_WCHAR wch = pCurChar->m_wCharCode;
+  FX_WCHAR wForm = wch;
+  if (dwType == FX_CHARTYPE_Numeric) {
+    if (m_bArabicNumber) {
+      wForm = wch + 0x0630;
+      pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicIndic;
+    }
+  } else if (wch == L',') {
+    if (m_bArabicShapes && m_iCurArabicContext > 0) {
+      wForm = 0x060C;
+      pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma;
+    }
+  } else if (m_bCurRTL || m_bVertical) {
+    wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical);
+  }
+  if (m_bCombText) {
+    iCharWidth = m_iCombWidth;
+  } else {
+    if (m_bVertical != FX_IsOdd(iRotation)) {
+      iCharWidth = 1000;
+    } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
+      iCharWidth = m_iDefChar;
+    }
+    iCharWidth *= m_iFontSize;
+    iCharWidth = iCharWidth * m_iHorScale / 100;
+  }
+  iCharWidth += m_iCharSpace;
+  pCurChar->m_iCharWidth = iCharWidth;
+  iLineWidth += iCharWidth;
+  FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space ||
+                    (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0);
+  if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) {
+    return EndBreak(FX_TXTBREAK_LineBreak);
+  }
+  return FX_TXTBREAK_None;
+}
+typedef FX_DWORD (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)(CFX_Char* pCurChar,
+                                                            int32_t iRotation);
+static const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = {
+    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Tab,
+    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Control,
+    &CFX_TxtBreak::AppendChar_Combination, &CFX_TxtBreak::AppendChar_Others,
+    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Arabic,
+    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Arabic,
+    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Arabic,
+    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Others,
+    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Others,
+};
+FX_DWORD CFX_TxtBreak::AppendChar(FX_WCHAR wch) {
+  FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch];
+  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
+  CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace();
+  pCurChar->m_wCharCode = (FX_WORD)wch;
+  pCurChar->m_nRotation = m_iCharRotation;
+  pCurChar->m_dwCharProps = dwProps;
+  pCurChar->m_dwCharStyles = 0;
+  pCurChar->m_iCharWidth = 0;
+  pCurChar->m_iHorizontalScale = m_iHorScale;
+  pCurChar->m_iVertialScale = m_iVerScale;
+  pCurChar->m_dwStatus = 0;
+  pCurChar->m_iBidiClass = 0;
+  pCurChar->m_iBidiLevel = 0;
+  pCurChar->m_iBidiPos = 0;
+  pCurChar->m_iBidiOrder = 0;
+  pCurChar->m_pUserData = NULL;
+  AppendChar_PageLoad(pCurChar, dwProps);
+  FX_DWORD dwRet1 = FX_TXTBREAK_None;
+  if (dwType != FX_CHARTYPE_Combination &&
+      GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) {
+    if (m_dwCharType > 0 &&
+        m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance && !m_bSingleLine) {
+      if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) {
+        dwRet1 = EndBreak(FX_TXTBREAK_LineBreak);
+        int32_t iCount = m_pCurLine->CountChars();
+        if (iCount > 0) {
+          pCurChar = m_pCurLine->m_pLineChars->GetDataPtr(iCount - 1);
+        }
+      }
+    }
+  }
+  int32_t iRotation = m_iRotation;
+  if (m_bVertical && (dwProps & 0x8000) != 0) {
+    iRotation = (iRotation + 1) % 4;
+  }
+  FX_DWORD dwRet2 =
+      (this->*g_FX_TxtBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(
+          pCurChar, iRotation);
+  return std::max(dwRet1, dwRet2);
+}
+void CFX_TxtBreak::EndBreak_UpdateArabicShapes() {
+  FXSYS_assert(m_bArabicShapes);
+  int32_t iCount = m_pCurLine->CountChars();
+  if (iCount < 2) {
+    return;
+  }
+  int32_t& iLineWidth = m_pCurLine->m_iWidth;
+  CFX_Char *pCur, *pNext;
+  pCur = m_pCurLine->GetCharPtr(0);
+  FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
+  pCur = m_pCurLine->GetCharPtr(1);
+  FX_WCHAR wch, wForm;
+  FX_BOOL bNextNum;
+  int32_t i = 1, iCharWidth, iRotation;
+  do {
+    i++;
+    if (i < iCount) {
+      pNext = m_pCurLine->GetCharPtr(i);
+      bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
+    } else {
+      pNext = NULL;
+      bNextNum = FALSE;
+    }
+    wch = pCur->m_wCharCode;
+    if (wch == L'.') {
+      if (bPrevNum && bNextNum) {
+        iRotation = m_iRotation;
+        if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) {
+          iRotation = ((iRotation + 1) & 0x03);
+        }
+        wForm = wch == L'.' ? 0x066B : 0x066C;
+        iLineWidth -= pCur->m_iCharWidth;
+        if (m_bCombText) {
+          iCharWidth = m_iCombWidth;
+        } else {
+          if (m_bVertical != FX_IsOdd(iRotation)) {
+            iCharWidth = 1000;
+          } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
+            iCharWidth = m_iDefChar;
+          }
+          iCharWidth *= m_iFontSize;
+          iCharWidth = iCharWidth * m_iHorScale / 100;
+        }
+        pCur->m_iCharWidth = iCharWidth;
+        iLineWidth += iCharWidth;
+      }
+    }
+    bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
+    pCur = pNext;
+  } while (i < iCount);
+}
+FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine,
+                                         FX_BOOL bAllChars,
+                                         FX_DWORD dwStatus) {
+  int32_t iCount = m_pCurLine->CountChars();
+  FX_BOOL bDone = FALSE;
+  CFX_Char* pTC;
+  if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) {
+    pTC = m_pCurLine->GetCharPtr(iCount - 1);
+    switch (pTC->GetCharType()) {
+      case FX_CHARTYPE_Tab:
+      case FX_CHARTYPE_Control:
+        break;
+      case FX_CHARTYPE_Space:
+        if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) {
+          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+          bDone = TRUE;
+        }
+        break;
+      default:
+        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
+        bDone = TRUE;
+        break;
+    }
+  }
+  iCount = m_pCurLine->CountChars();
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  CFX_TxtPiece tp;
+  if (m_bPagination) {
+    tp.m_dwStatus = dwStatus;
+    tp.m_iStartPos = m_pCurLine->m_iStart;
+    tp.m_iWidth = m_pCurLine->m_iWidth;
+    tp.m_iStartChar = 0;
+    tp.m_iChars = iCount;
+    tp.m_pChars = m_pCurLine->m_pLineChars;
+    tp.m_pUserData = m_pUserData;
+    pTC = m_pCurLine->GetCharPtr(0);
+    tp.m_dwCharStyles = pTC->m_dwCharStyles;
+    tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
+    tp.m_iVerticalScale = pTC->m_iVertialScale;
+    pCurPieces->Add(tp);
+    m_pCurLine = pNextLine;
+    m_dwCharType = 0;
+    return TRUE;
+  }
+  if (bAllChars && !bDone) {
+    int32_t iEndPos = m_pCurLine->m_iWidth;
+    GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE);
+  }
+  return FALSE;
+}
+void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus) {
+  CFX_TxtPiece tp;
+  FX_TPO tpo;
+  CFX_TxtChar* pTC;
+  int32_t i, j;
+  CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars;
+  int32_t iCount = m_pCurLine->CountChars();
+  FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL);
+  if (!m_bPagination && bDone) {
+    int32_t iBidiNum = 0;
+    for (i = 0; i < iCount; i++) {
+      pTC = chars.GetDataPtr(i);
+      pTC->m_iBidiPos = i;
+      if (pTC->GetCharType() != FX_CHARTYPE_Control) {
+        iBidiNum = i;
+      }
+      if (i == 0) {
+        pTC->m_iBidiLevel = 1;
+      }
+    }
+    FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0);
+  }
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  if (!m_bPagination &&
+      (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) {
+    tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
+    tp.m_iStartPos = m_pCurLine->m_iStart;
+    tp.m_pChars = m_pCurLine->m_pLineChars;
+    int32_t iBidiLevel = -1, iCharWidth;
+    i = 0, j = -1;
+    while (i < iCount) {
+      pTC = chars.GetDataPtr(i);
+      if (iBidiLevel < 0) {
+        iBidiLevel = pTC->m_iBidiLevel;
+        tp.m_iWidth = 0;
+        tp.m_iBidiLevel = iBidiLevel;
+        tp.m_iBidiPos = pTC->m_iBidiOrder;
+        tp.m_dwCharStyles = pTC->m_dwCharStyles;
+        tp.m_pUserData = pTC->m_pUserData;
+        tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
+        tp.m_iVerticalScale = pTC->m_iVertialScale;
+        tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
+      }
+      if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwStatus != 0) {
+        if (iBidiLevel == pTC->m_iBidiLevel) {
+          tp.m_dwStatus = pTC->m_dwStatus;
+          iCharWidth = pTC->m_iCharWidth;
+          if (iCharWidth > 0) {
+            tp.m_iWidth += iCharWidth;
+          }
+          i++;
+        }
+        tp.m_iChars = i - tp.m_iStartChar;
+        pCurPieces->Add(tp);
+        tp.m_iStartPos += tp.m_iWidth;
+        tp.m_iStartChar = i;
+        tpo.index = ++j;
+        tpo.pos = tp.m_iBidiPos;
+        tpos.Add(tpo);
+        iBidiLevel = -1;
+      } else {
+        iCharWidth = pTC->m_iCharWidth;
+        if (iCharWidth > 0) {
+          tp.m_iWidth += iCharWidth;
+        }
+        i++;
+      }
+    }
+    if (i > tp.m_iStartChar) {
+      tp.m_dwStatus = dwStatus;
+      tp.m_iChars = i - tp.m_iStartChar;
+      pCurPieces->Add(tp);
+      tpo.index = ++j;
+      tpo.pos = tp.m_iBidiPos;
+      tpos.Add(tpo);
+    }
+    if (j > -1) {
+      if (j > 0) {
+        FX_TEXTLAYOUT_PieceSort(tpos, 0, j);
+        int32_t iStartPos = 0;
+        for (i = 0; i <= j; i++) {
+          tpo = tpos.GetAt(i);
+          CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
+          ttp.m_iStartPos = iStartPos;
+          iStartPos += ttp.m_iWidth;
+        }
+      }
+      CFX_TxtPiece& ttp = pCurPieces->GetAt(j);
+      ttp.m_dwStatus = dwStatus;
+    }
+  } else {
+    tp.m_dwStatus = dwStatus;
+    tp.m_iStartPos = m_pCurLine->m_iStart;
+    tp.m_iWidth = m_pCurLine->m_iWidth;
+    tp.m_iStartChar = 0;
+    tp.m_iChars = iCount;
+    tp.m_pChars = m_pCurLine->m_pLineChars;
+    tp.m_pUserData = m_pUserData;
+    pTC = chars.GetDataPtr(0);
+    tp.m_dwCharStyles = pTC->m_dwCharStyles;
+    tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
+    tp.m_iVerticalScale = pTC->m_iVertialScale;
+    pCurPieces->Add(tp);
+    tpo.index = 0;
+    tpo.pos = 0;
+    tpos.Add(tpo);
+  }
+}
+void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
+                                      FX_BOOL bAllChars,
+                                      FX_DWORD dwStatus) {
+  int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  int32_t i, j, iCount = pCurPieces->GetSize();
+  FX_BOOL bFind = FALSE;
+  FX_TPO tpo;
+  CFX_TxtChar* pTC;
+  FX_DWORD dwCharType;
+  for (i = iCount - 1; i > -1; i--) {
+    tpo = tpos.GetAt(i);
+    CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
+    if (!bFind) {
+      iNetWidth = ttp.GetEndPos();
+    }
+    FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel);
+    j = bArabic ? 0 : ttp.m_iChars - 1;
+    while (j > -1 && j < ttp.m_iChars) {
+      pTC = ttp.GetCharPtr(j);
+      if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) {
+        iGapChars++;
+      }
+      if (!bFind || !bAllChars) {
+        dwCharType = pTC->GetCharType();
+        if (dwCharType == FX_CHARTYPE_Space ||
+            dwCharType == FX_CHARTYPE_Control) {
+          if (!bFind) {
+            iCharWidth = pTC->m_iCharWidth;
+            if (bAllChars && iCharWidth > 0) {
+              iNetWidth -= iCharWidth;
+            }
+          }
+        } else {
+          bFind = TRUE;
+          if (!bAllChars) {
+            break;
+          }
+        }
+      }
+      j += bArabic ? 1 : -1;
+    }
+    if (!bAllChars && bFind) {
+      break;
+    }
+  }
+  int32_t iOffset = m_iLineWidth - iNetWidth;
+  int32_t iLowerAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_LowerMask);
+  int32_t iHigherAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_HigherMask);
+  if (iGapChars > 0 && (iHigherAlignment == FX_TXTLINEALIGNMENT_Distributed ||
+                        (iHigherAlignment == FX_TXTLINEALIGNMENT_Justified &&
+                         dwStatus != FX_TXTBREAK_ParagraphBreak))) {
+    int32_t iStart = -1;
+    for (i = 0; i < iCount; i++) {
+      tpo = tpos.GetAt(i);
+      CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
+      if (iStart < -1) {
+        iStart = ttp.m_iStartPos;
+      } else {
+        ttp.m_iStartPos = iStart;
+      }
+      int32_t k;
+      for (j = 0; j < ttp.m_iChars; j++) {
+        pTC = ttp.GetCharPtr(j);
+        if (pTC->m_nBreakType != FX_LBT_DIRECT_BRK || pTC->m_iCharWidth < 0) {
+          continue;
+        }
+        k = iOffset / iGapChars;
+        pTC->m_iCharWidth += k;
+        ttp.m_iWidth += k;
+        iOffset -= k;
+        iGapChars--;
+        if (iGapChars < 1) {
+          break;
+        }
+      }
+      iStart += ttp.m_iWidth;
+    }
+  } else if (iLowerAlignment > FX_TXTLINEALIGNMENT_Left) {
+    if (iLowerAlignment == FX_TXTLINEALIGNMENT_Center) {
+      iOffset /= 2;
+    }
+    if (iOffset > 0) {
+      for (i = 0; i < iCount; i++) {
+        CFX_TxtPiece& ttp = pCurPieces->GetAt(i);
+        ttp.m_iStartPos += iOffset;
+      }
+    }
+  }
+}
+FX_DWORD CFX_TxtBreak::EndBreak(FX_DWORD dwStatus) {
+  FXSYS_assert(dwStatus >= FX_TXTBREAK_PieceBreak &&
+               dwStatus <= FX_TXTBREAK_PageBreak);
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  int32_t iCount = pCurPieces->GetSize();
+  if (iCount > 0) {
+    CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
+    if (dwStatus > FX_TXTBREAK_PieceBreak) {
+      pLastPiece->m_dwStatus = dwStatus;
+    } else {
+      dwStatus = pLastPiece->m_dwStatus;
+    }
+    return dwStatus;
+  } else {
+    CFX_TxtLine* pLastLine = GetTxtLine(TRUE);
+    if (pLastLine != NULL) {
+      pCurPieces = pLastLine->m_pLinePieces;
+      iCount = pCurPieces->GetSize();
+      if (iCount-- > 0) {
+        CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
+        if (dwStatus > FX_TXTBREAK_PieceBreak) {
+          pLastPiece->m_dwStatus = dwStatus;
+        } else {
+          dwStatus = pLastPiece->m_dwStatus;
+        }
+        return dwStatus;
+      }
+      return FX_TXTBREAK_None;
+    }
+    iCount = m_pCurLine->CountChars();
+    if (iCount < 1) {
+      return FX_TXTBREAK_None;
+    }
+    if (!m_bPagination) {
+      CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
+      pTC->m_dwStatus = dwStatus;
+    }
+    if (dwStatus <= FX_TXTBREAK_PieceBreak) {
+      return dwStatus;
+    }
+  }
+  m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2;
+  CFX_TxtLine* pNextLine =
+      (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1;
+  FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right);
+  CFX_TPOArray tpos;
+  CFX_Char* pTC;
+  if (m_bArabicShapes) {
+    EndBreak_UpdateArabicShapes();
+  }
+  if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
+    goto EndBreak_Ret;
+  }
+  EndBreak_BidiLine(tpos, dwStatus);
+  if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) {
+    EndBreak_Alignment(tpos, bAllChars, dwStatus);
+  }
+EndBreak_Ret:
+  m_pCurLine = pNextLine;
+  pTC = GetLastChar(0, FALSE);
+  m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType();
+  if (dwStatus == FX_TXTBREAK_ParagraphBreak) {
+    m_iArabicContext = m_iCurArabicContext = 1;
+    ResetArabicContext();
+  }
+  return dwStatus;
+}
+int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca,
+                                  int32_t& iEndPos,
+                                  FX_BOOL bAllChars,
+                                  FX_BOOL bOnlyBrk) {
+  int32_t iLength = ca.GetSize() - 1;
+  if (iLength < 1) {
+    return iLength;
+  }
+  int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1,
+          iLast = -1, iLastPos = -1;
+  if (m_bSingleLine || iEndPos <= m_iLineWidth) {
+    if (!bAllChars) {
+      return iLength;
+    }
+    iBreak = iLength;
+    iBreakPos = iEndPos;
+  }
+  FX_BOOL bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0;
+  FX_BOOL bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0;
+  FX_LINEBREAKTYPE eType;
+  FX_DWORD nCodeProp, nCur, nNext;
+  CFX_Char* pCur = ca.GetDataPtr(iLength--);
+  if (bAllChars) {
+    pCur->m_nBreakType = FX_LBT_UNKNOWN;
+  }
+  nCodeProp = pCur->m_dwCharProps;
+  nNext = nCodeProp & 0x003F;
+  int32_t iCharWidth = pCur->m_iCharWidth;
+  if (iCharWidth > 0) {
+    iEndPos -= iCharWidth;
+  }
+  while (iLength >= 0) {
+    pCur = ca.GetDataPtr(iLength);
+    nCodeProp = pCur->m_dwCharProps;
+    nCur = nCodeProp & 0x003F;
+    if (nCur == FX_CBP_SP) {
+      if (nNext == FX_CBP_SP) {
+        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
+      } else {
+        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                  (nCur << 5) + nNext);
+      }
+    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
+      eType = FX_LBT_DIRECT_BRK;
+    } else {
+      if (nNext == FX_CBP_SP) {
+        eType = FX_LBT_PROHIBITED_BRK;
+      } else {
+        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
+                  (nCur << 5) + nNext);
+      }
+    }
+    if (bAllChars) {
+      pCur->m_nBreakType = (uint8_t)eType;
+    }
+    if (!bOnlyBrk) {
+      if (m_bSingleLine || iEndPos <= m_iLineWidth ||
+          (nCur == FX_CBP_SP && !bSpaceBreak)) {
+        if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
+          iBreak = iLength;
+          iBreakPos = iEndPos;
+          if (!bAllChars) {
+            return iLength;
+          }
+        } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) {
+          iIndirect = iLength;
+          iIndirectPos = iEndPos;
+        }
+        if (iLast < 0) {
+          iLast = iLength;
+          iLastPos = iEndPos;
+        }
+      }
+      iCharWidth = pCur->m_iCharWidth;
+      if (iCharWidth > 0) {
+        iEndPos -= iCharWidth;
+      }
+    }
+    nNext = nCodeProp & 0x003F;
+    iLength--;
+  }
+  if (bOnlyBrk) {
+    return 0;
+  }
+  if (iBreak > -1) {
+    iEndPos = iBreakPos;
+    return iBreak;
+  }
+  if (iIndirect > -1) {
+    iEndPos = iIndirectPos;
+    return iIndirect;
+  }
+  if (iLast > -1) {
+    iEndPos = iLastPos;
+    return iLast;
+  }
+  return 0;
+}
+void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine,
+                                 CFX_TxtLine* pNextLine,
+                                 FX_BOOL bAllChars) {
+  FXSYS_assert(pCurLine != NULL && pNextLine != NULL);
+  int32_t iCount = pCurLine->CountChars();
+  if (iCount < 2) {
+    return;
+  }
+  int32_t iEndPos = pCurLine->m_iWidth;
+  CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars;
+  int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
+  if (iCharPos < 0) {
+    iCharPos = 0;
+  }
+  iCharPos++;
+  if (iCharPos >= iCount) {
+    pNextLine->RemoveAll(TRUE);
+    CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1);
+    pTC->m_nBreakType = FX_LBT_UNKNOWN;
+    return;
+  }
+  CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars;
+  int cur_size = curChars.GetSize();
+  nextChars.SetSize(cur_size - iCharPos);
+  FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
+               (cur_size - iCharPos) * sizeof(CFX_TxtChar));
+  iCount -= iCharPos;
+  cur_size = curChars.GetSize();
+  curChars.RemoveAt(cur_size - iCount, iCount);
+  pCurLine->m_iWidth = iEndPos;
+  CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1);
+  pTC->m_nBreakType = FX_LBT_UNKNOWN;
+  iCount = nextChars.GetSize();
+  int32_t iCharWidth, iWidth = 0;
+  for (int32_t i = 0; i < iCount; i++) {
+    pTC = nextChars.GetDataPtr(i);
+    if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) {
+      pCurLine->m_iArabicChars--;
+      pNextLine->m_iArabicChars++;
+    }
+    iCharWidth = pTC->m_iCharWidth;
+    if (iCharWidth > 0) {
+      iWidth += iCharWidth;
+    }
+    if (m_bPagination) {
+      continue;
+    }
+    pTC->m_dwStatus = 0;
+  }
+  pNextLine->m_iWidth = iWidth;
+}
+int32_t CFX_TxtBreak::CountBreakChars() const {
+  CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
+  return pTxtLine == NULL ? 0 : pTxtLine->CountChars();
+}
+int32_t CFX_TxtBreak::CountBreakPieces() const {
+  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
+  if (pTxtPieces == NULL) {
+    return 0;
+  }
+  return pTxtPieces->GetSize();
+}
+const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
+  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
+  if (pTxtPieces == NULL) {
+    return NULL;
+  }
+  if (index < 0 || index >= pTxtPieces->GetSize()) {
+    return NULL;
+  }
+  return pTxtPieces->GetPtrAt(index);
+}
+void CFX_TxtBreak::ClearBreakPieces() {
+  CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
+  if (pTxtLine != NULL) {
+    pTxtLine->RemoveAll(TRUE);
+  }
+  m_iReady = 0;
+}
+void CFX_TxtBreak::Reset() {
+  m_dwCharType = 0;
+  m_iArabicContext = m_iCurArabicContext = 1;
+  ResetArabicContext();
+  m_pTxtLine1->RemoveAll(TRUE);
+  m_pTxtLine2->RemoveAll(TRUE);
+}
+
+struct FX_FORMCHAR {
+  FX_WORD wch;
+  FX_WORD wForm;
+  int32_t iWidth;
+};
+
+int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
+                                    FXTEXT_CHARPOS* pCharPos,
+                                    FX_BOOL bCharCode,
+                                    CFX_WideString* pWSForms,
+                                    FX_AdjustCharDisplayPos pAdjustPos) const {
+  if (pTxtRun == NULL || pTxtRun->iLength < 1) {
+    return 0;
+  }
+  IFX_TxtAccess* pAccess = pTxtRun->pAccess;
+  void* pIdentity = pTxtRun->pIdentity;
+  const FX_WCHAR* pStr = pTxtRun->pStr;
+  int32_t* pWidths = pTxtRun->pWidths;
+  int32_t iLength = pTxtRun->iLength - 1;
+  IFX_Font* pFont = pTxtRun->pFont;
+  FX_DWORD dwStyles = pTxtRun->dwStyles;
+  CFX_RectF rtText(*pTxtRun->pRect);
+  FX_BOOL bRTLPiece =
+      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
+  FX_BOOL bArabicNumber =
+      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0;
+  FX_BOOL bArabicComma =
+      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0;
+  FX_FLOAT fFontSize = pTxtRun->fFontSize;
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  int32_t iAscent = pFont->GetAscent();
+  int32_t iDescent = pFont->GetDescent();
+  int32_t iMaxHeight = iAscent - iDescent;
+  FX_FLOAT fFontHeight = fFontSize;
+  FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight;
+  FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight;
+  FX_BOOL bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0;
+  FX_BOOL bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0;
+  int32_t iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation;
+  int32_t iCharRotation;
+  FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm, wLast = 0xFEFF;
+  int32_t iWidth, iCharWidth, iCharHeight;
+  FX_FLOAT fX, fY, fCharWidth, fCharHeight;
+  int32_t iHorScale = pTxtRun->iHorizontalScale;
+  int32_t iVerScale = pTxtRun->iVerticalScale;
+  FX_BOOL bSkipSpace = pTxtRun->bSkipSpace;
+  FX_BOOL bEmptyChar, bShadda = FALSE, bLam = FALSE;
+  FX_DWORD dwProps, dwCharType;
+  FX_FORMCHAR formChars[3];
+  FX_FLOAT fYBase;
+  fX = rtText.left;
+  if (bVerticalDoc) {
+    fX += (rtText.width - fFontSize) / 2.0f;
+    fYBase = bRTLPiece ? rtText.bottom() : rtText.top;
+    fY = fYBase;
+  } else {
+    if (bRTLPiece) {
+      fX = rtText.right();
+    }
+    fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f;
+    fY = fYBase + fAscent;
+  }
+  int32_t iCount = 0, iNext, iForms;
+  for (int32_t i = 0; i <= iLength; i++) {
+    if (pAccess != NULL) {
+      wch = pAccess->GetChar(pIdentity, i);
+      iWidth = pAccess->GetWidth(pIdentity, i);
+    } else {
+      wch = *pStr++;
+      iWidth = *pWidths++;
+    }
+    dwProps = FX_GetUnicodeProperties(wch);
+    dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
+    if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
+      wPrev = 0xFEFF;
+      wLast = wch;
+      continue;
+    }
+    if (dwCharType >= FX_CHARTYPE_ArabicAlef) {
+      if (i < iLength) {
+        if (pAccess != NULL) {
+          iNext = i + 1;
+          while (iNext <= iLength) {
+            wNext = pAccess->GetChar(pIdentity, iNext);
+            dwProps = FX_GetUnicodeProperties(wNext);
+            if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination) {
+              break;
+            }
+            iNext++;
+          }
+          if (iNext > iLength) {
+            wNext = 0xFEFF;
+          }
+        } else {
+          int32_t j = -1;
+          do {
+            j++;
+            if (i + j >= iLength) {
+              break;
+            }
+            wNext = pStr[j];
+            dwProps = FX_GetUnicodeProperties(wNext);
+          } while ((dwProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination);
+          if (i + j >= iLength) {
+            wNext = 0xFEFF;
+          }
+        }
+      } else {
+        wNext = 0xFEFF;
+      }
+      wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext);
+      bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647);
+    } else if (dwCharType == FX_CHARTYPE_Combination) {
+      wForm = wch;
+      if (wch >= 0x064C && wch <= 0x0651) {
+        if (bShadda) {
+          wForm = 0xFEFF;
+          bShadda = FALSE;
+        } else {
+          wNext = 0xFEFF;
+          if (pAccess != NULL) {
+            iNext = i + 1;
+            if (iNext <= iLength) {
+              wNext = pAccess->GetChar(pIdentity, iNext);
+            }
+          } else {
+            if (i < iLength) {
+              wNext = *pStr;
+            }
+          }
+          if (wch == 0x0651) {
+            if (wNext >= 0x064C && wNext <= 0x0650) {
+              wForm = FX_GetArabicFromShaddaTable(wNext);
+              bShadda = TRUE;
+            }
+          } else {
+            if (wNext == 0x0651) {
+              wForm = FX_GetArabicFromShaddaTable(wch);
+              bShadda = TRUE;
+            }
+          }
+        }
+      } else {
+        bShadda = FALSE;
+      }
+    } else if (dwCharType == FX_CHARTYPE_Numeric) {
+      wForm = wch;
+      if (bArabicNumber) {
+        wForm += 0x0630;
+      }
+    } else if (wch == L'.') {
+      wForm = wch;
+      if (bArabicNumber) {
+        wNext = 0xFEFF;
+        if (pAccess != NULL) {
+          iNext = i + 1;
+          if (iNext <= iLength) {
+            wNext = pAccess->GetChar(pIdentity, iNext);
+          }
+        } else {
+          if (i < iLength) {
+            wNext = *pStr;
+          }
+        }
+        if (wNext >= L'0' && wNext <= L'9') {
+          wForm = 0x066B;
+        }
+      }
+    } else if (wch == L',') {
+      wForm = wch;
+      if (bArabicComma) {
+        wForm = 0x060C;
+      }
+    } else if (bRTLPiece || bVerticalChar) {
+      wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar);
+    } else {
+      wForm = wch;
+    }
+    if (dwCharType != FX_CHARTYPE_Combination) {
+      bShadda = FALSE;
+    }
+    if (dwCharType < FX_CHARTYPE_ArabicAlef) {
+      bLam = FALSE;
+    }
+    dwProps = FX_GetUnicodeProperties(wForm);
+    iCharRotation = iRotation;
+    if (bVerticalChar && (dwProps & 0x8000) != 0) {
+      iCharRotation++;
+    }
+    iCharRotation %= 4;
+    bEmptyChar =
+        (dwCharType >= FX_CHARTYPE_Tab && dwCharType <= FX_CHARTYPE_Control);
+    if (wForm == 0xFEFF) {
+      bEmptyChar = TRUE;
+    }
+    iForms = bLam ? 3 : 1;
+    iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms;
+    if (pCharPos == NULL) {
+      if (iWidth > 0) {
+        wPrev = wch;
+      }
+      wLast = wch;
+      continue;
+    }
+    iCharWidth = iWidth;
+    if (iCharWidth < 0) {
+      iCharWidth = -iCharWidth;
+    }
+    iCharWidth /= iFontSize;
+    formChars[0].wch = wch;
+    formChars[0].wForm = wForm;
+    formChars[0].iWidth = iCharWidth;
+    if (bLam) {
+      formChars[1].wForm = 0x0651;
+      iCharWidth = 0;
+      pFont->GetCharWidth(0x0651, iCharWidth, FALSE);
+      formChars[1].iWidth = iCharWidth;
+      formChars[2].wForm = 0x0670;
+      iCharWidth = 0;
+      pFont->GetCharWidth(0x0670, iCharWidth, FALSE);
+      formChars[2].iWidth = iCharWidth;
+    }
+    for (int32_t j = 0; j < iForms; j++) {
+      wForm = (FX_WCHAR)formChars[j].wForm;
+      iCharWidth = formChars[j].iWidth;
+      if (j > 0) {
+        dwCharType = FX_CHARTYPE_Combination;
+        wch = wForm;
+        wLast = (FX_WCHAR)formChars[j - 1].wForm;
+      }
+      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
+        pCharPos->m_GlyphIndex =
+            bCharCode ? wch : pFont->GetGlyphIndex(wForm, FALSE);
+        pCharPos->m_ExtGID = pCharPos->m_GlyphIndex;
+        pCharPos->m_FontCharWidth = iCharWidth;
+        if (pWSForms) {
+          *pWSForms += wForm;
+        }
+      }
+      if (bVerticalDoc) {
+        iCharHeight = iCharWidth;
+        iCharWidth = 1000;
+      } else {
+        iCharHeight = 1000;
+      }
+      fCharWidth = fFontSize * iCharWidth / 1000.0f;
+      fCharHeight = fFontSize * iCharHeight / 1000.0f;
+      if (bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
+        if (bVerticalDoc) {
+          fY -= fCharHeight;
+        } else {
+          fX -= fCharWidth;
+        }
+      }
+      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
+        pCharPos->m_OriginX = fX;
+        pCharPos->m_OriginY = fY;
+        if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) {
+          int32_t iFormWidth = iCharWidth;
+          pFont->GetCharWidth(wForm, iFormWidth, FALSE);
+          FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f;
+          if (bVerticalDoc) {
+            pCharPos->m_OriginY += fOffset;
+          } else {
+            pCharPos->m_OriginX += fOffset;
+          }
+        }
+        if (dwCharType == FX_CHARTYPE_Combination) {
+          CFX_Rect rtBBox;
+          rtBBox.Reset();
+          if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) {
+            pCharPos->m_OriginY =
+                fYBase + fFontSize -
+                fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight;
+          }
+          if (wForm == wch && wLast != 0xFEFF) {
+            FX_DWORD dwLastProps = FX_GetUnicodeProperties(wLast);
+            if ((dwLastProps & FX_CHARTYPEBITSMASK) ==
+                FX_CHARTYPE_Combination) {
+              CFX_Rect rtBBox;
+              rtBBox.Reset();
+              if (pFont->GetCharBBox(wLast, rtBBox, FALSE)) {
+                pCharPos->m_OriginY -= fFontSize * rtBBox.height / iMaxHeight;
+              }
+            }
+          }
+        }
+        CFX_PointF ptOffset;
+        FX_BOOL bAdjusted = FALSE;
+        if (pAdjustPos) {
+          bAdjusted = pAdjustPos(wForm, bCharCode, pFont, fFontSize,
+                                 bVerticalChar, ptOffset);
+        }
+        if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) {
+          CFX_Rect rtBBox;
+          rtBBox.Reset();
+          if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) {
+            ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight;
+            ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight;
+          }
+        }
+        pCharPos->m_OriginX += ptOffset.x;
+        pCharPos->m_OriginY -= ptOffset.y;
+      }
+      if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
+        if (bVerticalDoc) {
+          fY += fCharHeight;
+        } else {
+          fX += fCharWidth;
+        }
+      }
+      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
+        pCharPos->m_bGlyphAdjust = TRUE;
+        if (bVerticalDoc) {
+          if (iCharRotation == 0) {
+            pCharPos->m_AdjustMatrix[0] = -1;
+            pCharPos->m_AdjustMatrix[1] = 0;
+            pCharPos->m_AdjustMatrix[2] = 0;
+            pCharPos->m_AdjustMatrix[3] = 1;
+            pCharPos->m_OriginY += fAscent;
+          } else if (iCharRotation == 1) {
+            pCharPos->m_AdjustMatrix[0] = 0;
+            pCharPos->m_AdjustMatrix[1] = -1;
+            pCharPos->m_AdjustMatrix[2] = -1;
+            pCharPos->m_AdjustMatrix[3] = 0;
+            pCharPos->m_OriginX -= fDescent;
+          } else if (iCharRotation == 2) {
+            pCharPos->m_AdjustMatrix[0] = 1;
+            pCharPos->m_AdjustMatrix[1] = 0;
+            pCharPos->m_AdjustMatrix[2] = 0;
+            pCharPos->m_AdjustMatrix[3] = -1;
+            pCharPos->m_OriginX += fCharWidth;
+            pCharPos->m_OriginY += fAscent;
+          } else {
+            pCharPos->m_AdjustMatrix[0] = 0;
+            pCharPos->m_AdjustMatrix[1] = 1;
+            pCharPos->m_AdjustMatrix[2] = 1;
+            pCharPos->m_AdjustMatrix[3] = 0;
+            pCharPos->m_OriginX += fAscent;
+          }
+        } else {
+          if (iCharRotation == 0) {
+            pCharPos->m_AdjustMatrix[0] = -1;
+            pCharPos->m_AdjustMatrix[1] = 0;
+            pCharPos->m_AdjustMatrix[2] = 0;
+            pCharPos->m_AdjustMatrix[3] = 1;
+          } else if (iCharRotation == 1) {
+            pCharPos->m_AdjustMatrix[0] = 0;
+            pCharPos->m_AdjustMatrix[1] = -1;
+            pCharPos->m_AdjustMatrix[2] = -1;
+            pCharPos->m_AdjustMatrix[3] = 0;
+            pCharPos->m_OriginX -= fDescent;
+            pCharPos->m_OriginY -= fAscent + fDescent;
+          } else if (iCharRotation == 2) {
+            pCharPos->m_AdjustMatrix[0] = 1;
+            pCharPos->m_AdjustMatrix[1] = 0;
+            pCharPos->m_AdjustMatrix[2] = 0;
+            pCharPos->m_AdjustMatrix[3] = -1;
+            pCharPos->m_OriginX += fCharWidth;
+            pCharPos->m_OriginY -= fAscent;
+          } else {
+            pCharPos->m_AdjustMatrix[0] = 0;
+            pCharPos->m_AdjustMatrix[1] = 1;
+            pCharPos->m_AdjustMatrix[2] = 1;
+            pCharPos->m_AdjustMatrix[3] = 0;
+            pCharPos->m_OriginX += fAscent;
+          }
+        }
+        if (iHorScale != 100 || iVerScale != 100) {
+          pCharPos->m_AdjustMatrix[0] =
+              pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f;
+          pCharPos->m_AdjustMatrix[1] =
+              pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f;
+          pCharPos->m_AdjustMatrix[2] =
+              pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f;
+          pCharPos->m_AdjustMatrix[3] =
+              pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
+        }
+        pCharPos++;
+      }
+    }
+    if (iWidth > 0) {
+      wPrev = (FX_WCHAR)formChars[0].wch;
+    }
+    wLast = wch;
+  }
+  return iCount;
+}
+int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
+                                   CFX_RectFArray& rtArray,
+                                   FX_BOOL bCharBBox) const {
+  if (pTxtRun == NULL || pTxtRun->iLength < 1) {
+    return 0;
+  }
+  IFX_TxtAccess* pAccess = pTxtRun->pAccess;
+  void* pIdentity = pTxtRun->pIdentity;
+  const FX_WCHAR* pStr = pTxtRun->pStr;
+  int32_t* pWidths = pTxtRun->pWidths;
+  int32_t iLength = pTxtRun->iLength;
+  CFX_RectF rect(*pTxtRun->pRect);
+  FX_BOOL bRTLPiece =
+      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
+  FX_FLOAT fFontSize = pTxtRun->fFontSize;
+  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
+  FX_FLOAT fScale = fFontSize / 1000.0f;
+  IFX_Font* pFont = pTxtRun->pFont;
+  if (pFont == NULL) {
+    bCharBBox = FALSE;
+  }
+  CFX_Rect bbox;
+  bbox.Set(0, 0, 0, 0);
+  if (bCharBBox) {
+    bCharBBox = pFont->GetBBox(bbox);
+  }
+  FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
+  FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
+  rtArray.RemoveAll();
+  rtArray.SetSize(iLength);
+  FX_BOOL bVertical =
+      (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0;
+  FX_BOOL bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0;
+  FX_BOOL bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
+  FX_WCHAR wch, wLineBreakChar = pTxtRun->wLineBreakChar;
+  int32_t iCharSize;
+  FX_FLOAT fCharSize, fStart;
+  if (bVertical) {
+    fStart = bRTLPiece ? rect.bottom() : rect.top;
+  } else {
+    fStart = bRTLPiece ? rect.right() : rect.left;
+  }
+  for (int32_t i = 0; i < iLength; i++) {
+    if (pAccess != NULL) {
+      wch = pAccess->GetChar(pIdentity, i);
+      iCharSize = pAccess->GetWidth(pIdentity, i);
+    } else {
+      wch = *pStr++;
+      iCharSize = *pWidths++;
+    }
+    fCharSize = (FX_FLOAT)iCharSize / 20000.0f;
+    FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch));
+    if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 ||
+          (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) {
+      bRet = FALSE;
+    }
+    if (bRet) {
+      iCharSize = iFontSize * 500;
+      fCharSize = fFontSize / 2.0f;
+    }
+    if (bVertical) {
+      rect.top = fStart;
+      if (bRTLPiece) {
+        rect.top -= fCharSize;
+        fStart -= fCharSize;
+      } else {
+        fStart += fCharSize;
+      }
+      rect.height = fCharSize;
+    } else {
+      rect.left = fStart;
+      if (bRTLPiece) {
+        rect.left -= fCharSize;
+        fStart -= fCharSize;
+      } else {
+        fStart += fCharSize;
+      }
+      rect.width = fCharSize;
+    }
+    if (bCharBBox && !bRet) {
+      int32_t iCharWidth = 1000;
+      pFont->GetCharWidth(wch, iCharWidth);
+      FX_FLOAT fRTLeft = 0, fCharWidth = 0;
+      if (iCharWidth > 0) {
+        fCharWidth = iCharWidth * fScale;
+        fRTLeft = fLeft;
+        if (bCombText) {
+          fRTLeft = (rect.width - fCharWidth) / 2.0f;
+        }
+      }
+      CFX_RectF rtBBoxF;
+      if (bVertical) {
+        rtBBoxF.top = rect.left + fRTLeft;
+        rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f;
+        rtBBoxF.height = fCharWidth;
+        rtBBoxF.width = fHeight;
+        rtBBoxF.left = std::max(rtBBoxF.left, 0.0f);
+      } else {
+        rtBBoxF.left = rect.left + fRTLeft;
+        rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f;
+        rtBBoxF.width = fCharWidth;
+        rtBBoxF.height = fHeight;
+        rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
+      }
+      rtArray.SetAt(i, rtBBoxF);
+      continue;
+    }
+    rtArray.SetAt(i, rect);
+  }
+  return iLength;
+}
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
new file mode 100644
index 0000000..28731d4
--- /dev/null
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -0,0 +1,222 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
+#define XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
+
+#include "core/include/fxcrt/fx_ucd.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/layout/fgas_unicode.h"
+
+class IFX_Font;
+class CFX_Char;
+class IFX_TxtAccess;
+class CFX_TxtChar;
+class CFX_TxtPiece;
+class IFX_TxtBreak;
+
+#define FX_TXTBREAKPOLICY_None 0x00
+#define FX_TXTBREAKPOLICY_Pagination 0x01
+#define FX_TXTBREAKPOLICY_SpaceBreak 0x02
+#define FX_TXTBREAKPOLICY_NumberBreak 0x04
+#define FX_TXTBREAK_None 0x00
+#define FX_TXTBREAK_PieceBreak 0x01
+#define FX_TXTBREAK_LineBreak 0x02
+#define FX_TXTBREAK_ParagraphBreak 0x03
+#define FX_TXTBREAK_PageBreak 0x04
+#define FX_TXTBREAK_ControlChar 0x10
+#define FX_TXTBREAK_BreakChar 0x20
+#define FX_TXTBREAK_UnknownChar 0x40
+#define FX_TXTBREAK_RemoveChar 0x80
+#define FX_TXTLAYOUTSTYLE_MutipleFormat 0x0001
+#define FX_TXTLAYOUTSTYLE_VerticalLayout 0x0002
+#define FX_TXTLAYOUTSTYLE_VerticalChars 0x0004
+#define FX_TXTLAYOUTSTYLE_ReverseLine 0x0008
+#define FX_TXTLAYOUTSTYLE_ArabicContext 0x0010
+#define FX_TXTLAYOUTSTYLE_ArabicShapes 0x0020
+#define FX_TXTLAYOUTSTYLE_RTLReadingOrder 0x0040
+#define FX_TXTLAYOUTSTYLE_ExpandTab 0x0100
+#define FX_TXTLAYOUTSTYLE_SingleLine 0x0200
+#define FX_TXTLAYOUTSTYLE_CombText 0x0400
+#define FX_TXTCHARSTYLE_Alignment 0x000F
+#define FX_TXTCHARSTYLE_ArabicNumber 0x0010
+#define FX_TXTCHARSTYLE_ArabicShadda 0x0020
+#define FX_TXTCHARSTYLE_OddBidiLevel 0x0040
+#define FX_TXTCHARSTYLE_RTLReadingOrder 0x0080
+#define FX_TXTCHARSTYLE_ArabicContext 0x0300
+#define FX_TXTCHARSTYLE_ArabicIndic 0x0400
+#define FX_TXTCHARSTYLE_ArabicComma 0x0800
+#define FX_TXTLINEALIGNMENT_Left 0
+#define FX_TXTLINEALIGNMENT_Center 1
+#define FX_TXTLINEALIGNMENT_Right 2
+#define FX_TXTLINEALIGNMENT_Justified (1 << 2)
+#define FX_TXTLINEALIGNMENT_Distributed (2 << 2)
+#define FX_TXTLINEALIGNMENT_JustifiedLeft \
+  (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Justified)
+#define FX_TXTLINEALIGNMENT_JustifiedCenter \
+  (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Justified)
+#define FX_TXTLINEALIGNMENT_JustifiedRight \
+  (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Justified)
+#define FX_TXTLINEALIGNMENT_DistributedLeft \
+  (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Distributed)
+#define FX_TXTLINEALIGNMENT_DistributedCenter \
+  (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Distributed)
+#define FX_TXTLINEALIGNMENT_DistributedRight \
+  (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Distributed)
+#define FX_TXTLINEALIGNMENT_LowerMask 0x03
+#define FX_TXTLINEALIGNMENT_HigherMask 0x0C
+#define FX_TXTBREAK_MinimumTabWidth 160000
+
+class IFX_TxtAccess {
+ public:
+  virtual ~IFX_TxtAccess() {}
+  virtual FX_WCHAR GetChar(void* pIdentity, int32_t index) const = 0;
+  virtual int32_t GetWidth(void* pIdentity, int32_t index) const = 0;
+};
+
+struct FX_TXTRUN {
+  FX_TXTRUN() {
+    pAccess = NULL;
+    pIdentity = NULL;
+    pStr = NULL;
+    pWidths = NULL;
+    iLength = 0;
+    pFont = NULL;
+    fFontSize = 12;
+    dwStyles = 0;
+    iHorizontalScale = 100;
+    iVerticalScale = 100;
+    iCharRotation = 0;
+    dwCharStyles = 0;
+    pRect = NULL;
+    wLineBreakChar = L'\n';
+    bSkipSpace = TRUE;
+  }
+
+  IFX_TxtAccess* pAccess;
+  void* pIdentity;
+  const FX_WCHAR* pStr;
+  int32_t* pWidths;
+  int32_t iLength;
+  IFX_Font* pFont;
+  FX_FLOAT fFontSize;
+  FX_DWORD dwStyles;
+  int32_t iHorizontalScale;
+  int32_t iVerticalScale;
+  int32_t iCharRotation;
+  FX_DWORD dwCharStyles;
+  const CFX_RectF* pRect;
+  FX_WCHAR wLineBreakChar;
+  FX_BOOL bSkipSpace;
+};
+
+class CFX_TxtPiece : public CFX_Target {
+ public:
+  CFX_TxtPiece()
+      : m_dwStatus(FX_TXTBREAK_PieceBreak),
+        m_iStartPos(0),
+        m_iWidth(-1),
+        m_iStartChar(0),
+        m_iChars(0),
+        m_iBidiLevel(0),
+        m_iBidiPos(0),
+        m_iHorizontalScale(100),
+        m_iVerticalScale(100),
+        m_dwCharStyles(0),
+        m_pChars(NULL),
+        m_pUserData(NULL) {}
+  int32_t GetEndPos() const {
+    return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
+  }
+  int32_t GetLength() const { return m_iChars; }
+  int32_t GetEndChar() const { return m_iStartChar + m_iChars; }
+  CFX_TxtChar* GetCharPtr(int32_t index) const {
+    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
+    return m_pChars->GetDataPtr(m_iStartChar + index);
+  }
+  void GetString(FX_WCHAR* pText) const {
+    FXSYS_assert(pText != NULL);
+    int32_t iEndChar = m_iStartChar + m_iChars;
+    CFX_Char* pChar;
+    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
+      pChar = m_pChars->GetDataPtr(i);
+      *pText++ = (FX_WCHAR)pChar->m_wCharCode;
+    }
+  }
+
+  void GetString(CFX_WideString& wsText) const {
+    FX_WCHAR* pText = wsText.GetBuffer(m_iChars);
+    GetString(pText);
+    wsText.ReleaseBuffer(m_iChars);
+  }
+  void GetWidths(int32_t* pWidths) const {
+    FXSYS_assert(pWidths != NULL);
+    int32_t iEndChar = m_iStartChar + m_iChars;
+    CFX_Char* pChar;
+    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
+      pChar = m_pChars->GetDataPtr(i);
+      *pWidths++ = pChar->m_iCharWidth;
+    }
+  }
+  FX_DWORD m_dwStatus;
+  int32_t m_iStartPos;
+  int32_t m_iWidth;
+  int32_t m_iStartChar;
+  int32_t m_iChars;
+  int32_t m_iBidiLevel;
+  int32_t m_iBidiPos;
+  int32_t m_iHorizontalScale;
+  int32_t m_iVerticalScale;
+  FX_DWORD m_dwCharStyles;
+  CFX_TxtCharArray* m_pChars;
+  void* m_pUserData;
+};
+typedef CFX_BaseArrayTemplate<CFX_TxtPiece> CFX_TxtPieceArray;
+
+class IFX_TxtBreak {
+ public:
+  static IFX_TxtBreak* Create(FX_DWORD dwPolicies);
+  virtual ~IFX_TxtBreak() {}
+  virtual void Release() = 0;
+  virtual void SetLineWidth(FX_FLOAT fLineWidth) = 0;
+  virtual void SetLinePos(FX_FLOAT fLinePos) = 0;
+  virtual FX_DWORD GetLayoutStyles() const = 0;
+  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;
+  virtual void SetFont(IFX_Font* pFont) = 0;
+  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+  virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) = 0;
+  virtual void SetDefaultChar(FX_WCHAR wch) = 0;
+  virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
+  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
+  virtual void SetHorizontalScale(int32_t iScale) = 0;
+  virtual void SetVerticalScale(int32_t iScale) = 0;
+  virtual void SetCharRotation(int32_t iCharRotation) = 0;
+  virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0;
+  virtual void SetAlignment(int32_t iAlignment) = 0;
+  virtual FX_DWORD GetContextCharStyles() const = 0;
+  virtual void SetContextCharStyles(FX_DWORD dwCharStyles) = 0;
+  virtual void SetCombWidth(FX_FLOAT fCombWidth) = 0;
+  virtual void SetUserData(void* pUserData) = 0;
+  virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0;
+  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak) = 0;
+  virtual int32_t CountBreakChars() const = 0;
+  virtual int32_t CountBreakPieces() const = 0;
+  virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const = 0;
+  virtual void ClearBreakPieces() = 0;
+  virtual void Reset() = 0;
+  virtual int32_t GetDisplayPos(
+      const FX_TXTRUN* pTxtRun,
+      FXTEXT_CHARPOS* pCharPos,
+      FX_BOOL bCharCode = FALSE,
+      CFX_WideString* pWSForms = NULL,
+      FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;
+  virtual int32_t GetCharRects(const FX_TXTRUN* pTxtRun,
+                               CFX_RectFArray& rtArray,
+                               FX_BOOL bCharBBox = FALSE) const = 0;
+};
+
+#endif  // XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
diff --git a/xfa/fgas/layout/fgas_unicode.cpp b/xfa/fgas/layout/fgas_unicode.cpp
new file mode 100644
index 0000000..a4cbee0
--- /dev/null
+++ b/xfa/fgas/layout/fgas_unicode.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/layout/fgas_unicode.h"
+
+void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray& tpos, int32_t iStart, int32_t iEnd) {
+  FXSYS_assert(iStart > -1 && iStart < tpos.GetSize());
+  FXSYS_assert(iEnd > -1 && iEnd < tpos.GetSize());
+  if (iStart >= iEnd) {
+    return;
+  }
+  int32_t i = iStart, j = iEnd;
+  FX_TPO *pCur = tpos.GetPtrAt(iStart), *pSort;
+  int32_t v = pCur->pos;
+  while (i < j) {
+    while (j > i) {
+      pSort = tpos.GetPtrAt(j);
+      if (pSort->pos < v) {
+        FX_TPO t = *pSort;
+        *pSort = *pCur;
+        *pCur = t;
+        pCur = pSort;
+        break;
+      }
+      j--;
+    }
+    while (i < j) {
+      pSort = tpos.GetPtrAt(i);
+      if (pSort->pos > v) {
+        FX_TPO t = *pSort;
+        *pSort = *pCur;
+        *pCur = t;
+        pCur = pSort;
+        break;
+      }
+      i++;
+    }
+  }
+  i--, j++;
+  if (iStart < i) {
+    FX_TEXTLAYOUT_PieceSort(tpos, iStart, i);
+  }
+  if (j < iEnd) {
+    FX_TEXTLAYOUT_PieceSort(tpos, j, iEnd);
+  }
+}
+static const FX_JAPCHARPROPERTYEX gs_FX_JapCharPropertysEx[] = {
+    {0x3001, 0x13}, {0x3002, 0x13}, {0x3041, 0x23}, {0x3043, 0x23},
+    {0x3045, 0x23}, {0x3047, 0x23}, {0x3049, 0x23}, {0x3063, 0x23},
+    {0x3083, 0x23}, {0x3085, 0x23}, {0x3087, 0x23}, {0x308E, 0x23},
+    {0x3095, 0x23}, {0x3096, 0x23}, {0x30A1, 0x23}, {0x30A3, 0x23},
+    {0x30A5, 0x23}, {0x30A7, 0x23}, {0x30A9, 0x23}, {0x30C3, 0x23},
+    {0x30E3, 0x23}, {0x30E5, 0x23}, {0x30E7, 0x23}, {0x30EE, 0x23},
+    {0x30F5, 0x23}, {0x30F6, 0x23}, {0x30FB, 0x22}, {0x31F0, 0x23},
+    {0x31F1, 0x23}, {0x31F2, 0x23}, {0x31F3, 0x23}, {0x31F4, 0x23},
+    {0x31F5, 0x23}, {0x31F6, 0x23}, {0x31F7, 0x23}, {0x31F8, 0x23},
+    {0x31F9, 0x23}, {0x31FA, 0x23}, {0x31FB, 0x23}, {0x31FC, 0x23},
+    {0x31FD, 0x23}, {0x31FE, 0x23}, {0x31FF, 0x23},
+};
+const FX_JAPCHARPROPERTYEX* FX_GetJapCharPropertyEx(FX_WCHAR wch) {
+  int32_t iStart = 0;
+  int32_t iEnd =
+      sizeof(gs_FX_JapCharPropertysEx) / sizeof(FX_JAPCHARPROPERTYEX);
+  while (iStart <= iEnd) {
+    int32_t iMid = (iStart + iEnd) / 2;
+    FX_WCHAR wJapChar = gs_FX_JapCharPropertysEx[iMid].wChar;
+    if (wch == wJapChar) {
+      return gs_FX_JapCharPropertysEx + iMid;
+    } else if (wch < wJapChar) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  }
+  return NULL;
+}
+FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch,
+                                   FX_BOOL bMBCSCode,
+                                   IFX_Font* pFont,
+                                   FX_FLOAT fFontSize,
+                                   FX_BOOL bVertical,
+                                   CFX_PointF& ptOffset) {
+  if (pFont == NULL || !bVertical) {
+    return FALSE;
+  }
+  if (wch < 0x3001 || wch > 0x31FF) {
+    return FALSE;
+  }
+  const FX_JAPCHARPROPERTYEX* pJapChar = FX_GetJapCharPropertyEx(wch);
+  if (pJapChar == NULL) {
+    return FALSE;
+  }
+  CFX_Rect rtBBox;
+  rtBBox.Reset();
+  if (pFont->GetCharBBox(wch, rtBBox, bMBCSCode)) {
+    switch (pJapChar->uAlign & 0xF0) {
+      case FX_JAPCHARPROPERTYEX_Top:
+        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 1200.0f;
+        break;
+      case FX_JAPCHARPROPERTYEX_Middle:
+        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 6000.0f;
+        break;
+    }
+    switch (pJapChar->uAlign & 0x0F) {
+      case FX_JAPCHARPROPERTYEX_Center:
+        ptOffset.x = fFontSize * (600 - rtBBox.right()) / 1000.0f;
+        break;
+      case FX_JAPCHARPROPERTYEX_Right:
+        ptOffset.x = fFontSize * (950 - rtBBox.right()) / 1000.0f;
+        break;
+    }
+  }
+  return TRUE;
+}
diff --git a/xfa/fgas/layout/fgas_unicode.h b/xfa/fgas/layout/fgas_unicode.h
new file mode 100644
index 0000000..536895d
--- /dev/null
+++ b/xfa/fgas/layout/fgas_unicode.h
@@ -0,0 +1,47 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LAYOUT_FGAS_UNICODE_H_
+#define XFA_FGAS_LAYOUT_FGAS_UNICODE_H_
+
+#include "xfa/fgas/crt/fgas_utils.h"
+#include "xfa/fgas/font/fgas_font.h"
+
+#define FX_JAPCHARPROPERTYEX_Left 0x01
+#define FX_JAPCHARPROPERTYEX_Center 0x02
+#define FX_JAPCHARPROPERTYEX_Right 0x03
+#define FX_JAPCHARPROPERTYEX_Top 0x10
+#define FX_JAPCHARPROPERTYEX_Middle 0x20
+#define FX_JAPCHARPROPERTYEX_Bottom 0x30
+
+struct FX_TPO {
+  int32_t index;
+  int32_t pos;
+};
+typedef CFX_MassArrayTemplate<FX_TPO> CFX_TPOArray;
+
+void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray& tpos, int32_t iStart, int32_t iEnd);
+
+struct FX_JAPCHARPROPERTYEX {
+  FX_WCHAR wChar;
+  uint8_t uAlign;
+};
+
+const FX_JAPCHARPROPERTYEX* FX_GetJapCharPropertyEx(FX_WCHAR wch);
+typedef FX_BOOL (*FX_AdjustCharDisplayPos)(FX_WCHAR wch,
+                                           FX_BOOL bMBCSCode,
+                                           IFX_Font* pFont,
+                                           FX_FLOAT fFontSize,
+                                           FX_BOOL bVertical,
+                                           CFX_PointF& ptOffset);
+FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch,
+                                   FX_BOOL bMBCSCode,
+                                   IFX_Font* pFont,
+                                   FX_FLOAT fFontSize,
+                                   FX_BOOL bVertical,
+                                   CFX_PointF& ptOffset);
+
+#endif  // XFA_FGAS_LAYOUT_FGAS_UNICODE_H_
diff --git a/xfa/fgas/localization/fgas_datetime.cpp b/xfa/fgas/localization/fgas_datetime.cpp
new file mode 100644
index 0000000..34b8210
--- /dev/null
+++ b/xfa/fgas/localization/fgas_datetime.cpp
@@ -0,0 +1,550 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fgas/localization/fgas_datetime.h"
+
+#if _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_ || \
+    _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
+#include <sys/time.h>
+#include <time.h>
+#endif
+
+const uint8_t g_FXDaysPerMonth[12] = {31, 28, 31, 30, 31, 30,
+                                      31, 31, 30, 31, 30, 31};
+const uint8_t g_FXDaysPerLeapMonth[12] = {31, 29, 31, 30, 31, 30,
+                                          31, 31, 30, 31, 30, 31};
+const int32_t g_FXDaysBeforeMonth[12] = {0,   31,  59,  90,  120, 151,
+                                         181, 212, 243, 273, 304, 334};
+const int32_t g_FXDaysBeforeLeapMonth[12] = {0,   31,  60,  91,  121, 152,
+                                             182, 213, 244, 274, 305, 335};
+const int32_t g_FXDaysPerYear = 365;
+const int32_t g_FXDaysPerLeapYear = 366;
+const int32_t g_FXDaysPer4Years = 1461;
+const int32_t g_FXDaysPer100Years = 36524;
+const int32_t g_FXDaysPer400Years = 146097;
+const int64_t g_FXMillisecondsPerSecond = 1000;
+const int64_t g_FXMillisecondsPerMinute = 60000;
+const int64_t g_FXMillisecondsPerHour = 3600000;
+const int64_t g_FXMillisecondsPerDay = 86400000;
+FX_BOOL FX_IsLeapYear(int32_t iYear) {
+  FXSYS_assert(iYear != 0);
+  return ((iYear % 4) == 0 && (iYear % 100) != 0) || (iYear % 400) == 0;
+}
+int32_t FX_DaysInYear(int32_t iYear) {
+  FXSYS_assert(iYear != 0);
+  return FX_IsLeapYear(iYear) ? g_FXDaysPerLeapYear : g_FXDaysPerYear;
+}
+uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth) {
+  FXSYS_assert(iYear != 0);
+  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
+  const uint8_t* p =
+      FX_IsLeapYear(iYear) ? g_FXDaysPerLeapMonth : g_FXDaysPerMonth;
+  return p[iMonth - 1];
+}
+static int32_t FX_DaysBeforeMonthInYear(int32_t iYear, uint8_t iMonth) {
+  FXSYS_assert(iYear != 0);
+  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
+  const int32_t* p =
+      FX_IsLeapYear(iYear) ? g_FXDaysBeforeLeapMonth : g_FXDaysBeforeMonth;
+  return p[iMonth - 1];
+}
+static int64_t FX_DateToDays(int32_t iYear,
+                             uint8_t iMonth,
+                             uint8_t iDay,
+                             FX_BOOL bIncludeThisDay = FALSE) {
+  FXSYS_assert(iYear != 0);
+  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
+  FXSYS_assert(iDay >= 1 && iDay <= FX_DaysInMonth(iYear, iMonth));
+  int64_t iDays = FX_DaysBeforeMonthInYear(iYear, iMonth);
+  iDays += iDay;
+  if (!bIncludeThisDay) {
+    iDays--;
+  }
+  if (iYear > 0) {
+    iYear--;
+  } else {
+    iDays -= FX_DaysInYear(iYear);
+    iYear++;
+  }
+  return iDays + (int64_t)iYear * 365 + iYear / 4 - iYear / 100 + iYear / 400;
+}
+static void FX_DaysToDate(int64_t iDays,
+                          int32_t& iYear,
+                          uint8_t& iMonth,
+                          uint8_t& iDay) {
+  FX_BOOL bBC = iDays < 0;
+  if (bBC) {
+    iDays = -iDays;
+  }
+  iYear = 1;
+  iMonth = 1;
+  iDay = 1;
+  if (iDays >= g_FXDaysPer400Years) {
+    iYear += (int32_t)(iDays / g_FXDaysPer400Years * 400);
+    iDays %= g_FXDaysPer400Years;
+  }
+  if (iDays >= g_FXDaysPer100Years) {
+    if (iDays == g_FXDaysPer100Years * 4) {
+      iYear += 300;
+      iDays -= g_FXDaysPer100Years * 3;
+    } else {
+      iYear += (int32_t)(iDays / g_FXDaysPer100Years * 100);
+      iDays %= g_FXDaysPer100Years;
+    }
+  }
+  if (iDays >= g_FXDaysPer4Years) {
+    iYear += (int32_t)(iDays / g_FXDaysPer4Years * 4);
+    iDays %= g_FXDaysPer4Years;
+  }
+  while (TRUE) {
+    int32_t iYearDays = FX_DaysInYear(iYear);
+    if (iDays < iYearDays) {
+      if (bBC) {
+        iYear = -iYear;
+        iDays = iYearDays - iDays;
+      }
+      break;
+    }
+    iYear++;
+    iDays -= iYearDays;
+  }
+  while (TRUE) {
+    int32_t iMonthDays = FX_DaysInMonth(iYear, iMonth);
+    if (iDays < iMonthDays) {
+      break;
+    }
+    iMonth++;
+    iDays -= iMonthDays;
+  }
+  iDay += (uint8_t)iDays;
+}
+
+struct FXUT_SYSTEMTIME {
+  FX_WORD wYear;
+  FX_WORD wMonth;
+  FX_WORD wDayOfWeek;
+  FX_WORD wDay;
+  FX_WORD wHour;
+  FX_WORD wMinute;
+  FX_WORD wSecond;
+  FX_WORD wMilliseconds;
+};
+
+void CFX_Unitime::Now() {
+  FXUT_SYSTEMTIME utLocal;
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
+    _FX_OS_ == _FX_WIN64_
+  ::GetLocalTime((LPSYSTEMTIME)&utLocal);
+#elif _FX_OS_ != _FX_EMBEDDED_
+#if 1
+  timeval curTime;
+  gettimeofday(&curTime, NULL);
+#else
+  struct timespec curTime;
+  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
+#endif
+  struct tm st;
+  localtime_r(&curTime.tv_sec, &st);
+  utLocal.wYear = st.tm_year + 1900;
+  utLocal.wMonth = st.tm_mon + 1;
+  utLocal.wDayOfWeek = st.tm_wday;
+  utLocal.wDay = st.tm_mday;
+  utLocal.wHour = st.tm_hour;
+  utLocal.wMinute = st.tm_min;
+  utLocal.wSecond = st.tm_sec;
+  utLocal.wMilliseconds = curTime.tv_usec / 1000;
+#endif
+  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
+      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
+      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
+}
+void CFX_Unitime::SetGMTime() {
+  FXUT_SYSTEMTIME utLocal;
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
+    _FX_OS_ == _FX_WIN64_
+  ::GetSystemTime((LPSYSTEMTIME)&utLocal);
+#elif _FX_OS_ != _FX_EMBEDDED_
+#if 1
+  timeval curTime;
+  gettimeofday(&curTime, NULL);
+#else
+  struct timespec curTime;
+  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
+#endif
+  struct tm st;
+  gmtime_r(&curTime.tv_sec, &st);
+  utLocal.wYear = st.tm_year + 1900;
+  utLocal.wMonth = st.tm_mon + 1;
+  utLocal.wDayOfWeek = st.tm_wday;
+  utLocal.wDay = st.tm_mday;
+  utLocal.wHour = st.tm_hour;
+  utLocal.wMinute = st.tm_min;
+  utLocal.wSecond = st.tm_sec;
+  utLocal.wMilliseconds = curTime.tv_usec / 1000;
+#endif
+  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
+      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
+      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
+}
+void CFX_Unitime::Set(int32_t year,
+                      uint8_t month,
+                      uint8_t day,
+                      uint8_t hour,
+                      uint8_t minute,
+                      uint8_t second,
+                      FX_WORD millisecond) {
+  FXSYS_assert(hour <= 23);
+  FXSYS_assert(minute <= 59);
+  FXSYS_assert(second <= 59);
+  FXSYS_assert(millisecond <= 999);
+  m_iUnitime = (int64_t)hour * g_FXMillisecondsPerHour +
+               (int64_t)minute * g_FXMillisecondsPerMinute +
+               (int64_t)second * g_FXMillisecondsPerSecond + millisecond;
+  if (year > 0) {
+    m_iUnitime =
+        m_iUnitime +
+        FX_DateToDays(year, month, day, FALSE) * g_FXMillisecondsPerDay;
+  }
+}
+void CFX_Unitime::Set(FX_UNITIME t) {
+  m_iUnitime = t;
+}
+int32_t CFX_Unitime::GetYear() const {
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  return iYear;
+}
+uint8_t CFX_Unitime::GetMonth() const {
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  return iMonth;
+}
+uint8_t CFX_Unitime::GetDay() const {
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  return iDay;
+}
+FX_WEEKDAY CFX_Unitime::GetDayOfWeek() const {
+  int32_t v = (int32_t)((m_iUnitime / g_FXMillisecondsPerDay + 1) % 7);
+  if (v < 0) {
+    v += 7;
+  }
+  return (FX_WEEKDAY)v;
+}
+FX_WORD CFX_Unitime::GetDayOfYear() const {
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  return FX_DaysBeforeMonthInYear(iYear, iMonth) + iDay;
+}
+int64_t CFX_Unitime::GetDayOfAD() const {
+  FX_BOOL bBC = m_iUnitime < 0;
+  int64_t iDays = m_iUnitime / g_FXMillisecondsPerDay;
+  iDays += bBC ? -1 : 0;
+  if (bBC && (m_iUnitime % g_FXMillisecondsPerDay) == 0) {
+    iDays++;
+  }
+  return iDays;
+}
+uint8_t CFX_Unitime::GetHour() const {
+  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerDay);
+  if (v < 0) {
+    v += g_FXMillisecondsPerDay;
+  }
+  return (uint8_t)(v / g_FXMillisecondsPerHour);
+}
+uint8_t CFX_Unitime::GetMinute() const {
+  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerHour);
+  if (v < 0) {
+    v += g_FXMillisecondsPerHour;
+  }
+  return (uint8_t)(v / g_FXMillisecondsPerMinute);
+}
+uint8_t CFX_Unitime::GetSecond() const {
+  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerMinute);
+  if (v < 0) {
+    v += g_FXMillisecondsPerMinute;
+  }
+  return (uint8_t)(v / g_FXMillisecondsPerSecond);
+}
+FX_WORD CFX_Unitime::GetMillisecond() const {
+  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerSecond);
+  if (v < 0) {
+    v += g_FXMillisecondsPerSecond;
+  }
+  return (FX_WORD)v;
+}
+FX_BOOL CFX_Unitime::AddYears(int32_t iYears) {
+  FX_UNITIME ut = m_iUnitime;
+  if (ut < 0) {
+    ut = -ut;
+  }
+  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  iYear += iYears;
+  if (iYear == 0) {
+    iYear = iYears > 0 ? 1 : -1;
+  }
+  m_iUnitime =
+      FX_DateToDays(iYear, iMonth, iDay, FALSE) * g_FXMillisecondsPerDay;
+  m_iUnitime += (iYear < 0) ? -r : r;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddMonths(int32_t iMonths) {
+  FX_BOOL b = iMonths > 0;
+  FX_UNITIME ut = m_iUnitime;
+  if (ut < 0) {
+    ut = -ut;
+  }
+  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
+  int32_t iYear;
+  uint8_t iMonth, iDay;
+  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
+  iMonths += iMonth;
+  while (iMonths < 1) {
+    iYear--, iMonths += 12;
+  }
+  while (iMonths > 12) {
+    iYear++, iMonths -= 12;
+  }
+  if (iYear == 0) {
+    iYear = b ? 1 : -1;
+  }
+  m_iUnitime = FX_DateToDays(iYear, (uint8_t)iMonths, iDay, FALSE) *
+               g_FXMillisecondsPerDay;
+  m_iUnitime += (iYear < 0) ? -r : r;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddDays(int32_t iDays) {
+  m_iUnitime += (int64_t)iDays * g_FXMillisecondsPerDay;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddHours(int32_t iHours) {
+  m_iUnitime += (int64_t)iHours * g_FXMillisecondsPerHour;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddMinutes(int32_t iMinutes) {
+  m_iUnitime += (int64_t)iMinutes * g_FXMillisecondsPerMinute;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddSeconds(int32_t iSeconds) {
+  m_iUnitime += ((int64_t)iSeconds) * g_FXMillisecondsPerSecond;
+  return TRUE;
+}
+FX_BOOL CFX_Unitime::AddMilliseconds(int32_t iMilliseconds) {
+  m_iUnitime += iMilliseconds;
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::Set(int32_t year,
+                          uint8_t month,
+                          uint8_t day,
+                          uint8_t hour,
+                          uint8_t minute,
+                          uint8_t second,
+                          FX_WORD millisecond) {
+  ASSERT(year != 0);
+  ASSERT(month >= 1 && month <= 12);
+  ASSERT(day >= 1 && day <= FX_DaysInMonth(year, month));
+  ASSERT(hour <= 23);
+  ASSERT(minute <= 59);
+  ASSERT(second <= 59);
+  ASSERT(millisecond <= 999);
+  m_DateTime.Date.sDate.year = year;
+  m_DateTime.Date.sDate.month = month;
+  m_DateTime.Date.sDate.day = day;
+  m_DateTime.Time.sTime.hour = hour;
+  m_DateTime.Time.sTime.minute = minute;
+  m_DateTime.Time.sTime.second = second;
+  m_DateTime.Time.sTime.millisecond = millisecond;
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::FromUnitime(FX_UNITIME t) {
+  CFX_Unitime ut(t);
+  FX_DaysToDate(ut.GetDayOfAD(), m_DateTime.Date.sDate.year,
+                m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day);
+  m_DateTime.Date.sDate.day = ut.GetHour();
+  m_DateTime.Time.sTime.minute = ut.GetMinute();
+  m_DateTime.Time.sTime.second = ut.GetSecond();
+  m_DateTime.Time.sTime.millisecond = ut.GetMillisecond();
+  return TRUE;
+}
+FX_UNITIME CFX_DateTime::ToUnitime() const {
+  FX_UNITIME v =
+      (int64_t)m_DateTime.Date.sDate.day * g_FXMillisecondsPerHour +
+      (int64_t)m_DateTime.Time.sTime.minute * g_FXMillisecondsPerMinute +
+      (int64_t)m_DateTime.Time.sTime.second * g_FXMillisecondsPerSecond +
+      m_DateTime.Time.sTime.millisecond;
+  v += FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
+                     m_DateTime.Date.sDate.day, FALSE) *
+       g_FXMillisecondsPerDay;
+  return v;
+}
+int32_t CFX_DateTime::GetYear() const {
+  return m_DateTime.Date.sDate.year;
+}
+uint8_t CFX_DateTime::GetMonth() const {
+  return m_DateTime.Date.sDate.month;
+}
+uint8_t CFX_DateTime::GetDay() const {
+  return m_DateTime.Date.sDate.day;
+}
+FX_WEEKDAY CFX_DateTime::GetDayOfWeek() const {
+  int32_t v = (int32_t)(FX_DateToDays(m_DateTime.Date.sDate.year,
+                                      m_DateTime.Date.sDate.month,
+                                      m_DateTime.Date.sDate.day, TRUE) %
+                        7);
+  if (v < 0) {
+    v += 7;
+  }
+  return (FX_WEEKDAY)v;
+}
+FX_WORD CFX_DateTime::GetDayOfYear() const {
+  return FX_DaysBeforeMonthInYear(m_DateTime.Date.sDate.year,
+                                  m_DateTime.Date.sDate.month) +
+         m_DateTime.Date.sDate.day;
+}
+int64_t CFX_DateTime::GetDayOfAD() const {
+  return FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
+                       m_DateTime.Date.sDate.day, TRUE);
+}
+uint8_t CFX_DateTime::GetHour() const {
+  return m_DateTime.Date.sDate.day;
+}
+uint8_t CFX_DateTime::GetMinute() const {
+  return m_DateTime.Time.sTime.minute;
+}
+uint8_t CFX_DateTime::GetSecond() const {
+  return m_DateTime.Time.sTime.second;
+}
+FX_WORD CFX_DateTime::GetMillisecond() const {
+  return m_DateTime.Time.sTime.millisecond;
+}
+FX_BOOL CFX_DateTime::AddYears(int32_t iYears) {
+  if (iYears == 0) {
+    return FALSE;
+  }
+  int32_t v = m_DateTime.Date.sDate.year + iYears;
+  if (v >= 0 && m_DateTime.Date.sDate.year < 0) {
+    v++;
+  } else if (v <= 0 && m_DateTime.Date.sDate.year > 0) {
+    v--;
+  }
+  m_DateTime.Date.sDate.year = v;
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddMonths(int32_t iMonths) {
+  if (iMonths == 0) {
+    return FALSE;
+  }
+  FX_BOOL b = iMonths > 0;
+  iMonths += m_DateTime.Date.sDate.month;
+  while (iMonths < 1) {
+    m_DateTime.Date.sDate.year--;
+    if (m_DateTime.Date.sDate.year == 0) {
+      m_DateTime.Date.sDate.year = -1;
+    }
+    iMonths += 12;
+  }
+  while (iMonths > 12) {
+    m_DateTime.Date.sDate.year++;
+    if (m_DateTime.Date.sDate.year == 0) {
+      m_DateTime.Date.sDate.year = 1;
+    }
+    iMonths -= 12;
+  }
+  if (m_DateTime.Date.sDate.year == 0) {
+    m_DateTime.Date.sDate.year = b ? 1 : -1;
+  }
+  m_DateTime.Date.sDate.month = (uint8_t)iMonths;
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddDays(int32_t iDays) {
+  if (iDays == 0) {
+    return FALSE;
+  }
+  int64_t v1 =
+      FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
+                    m_DateTime.Date.sDate.day, TRUE);
+  int64_t v2 = v1 + iDays;
+  if (v2 <= 0 && v1 > 0) {
+    v2--;
+  } else if (v2 >= 0 && v1 < 0) {
+    v2++;
+  }
+  FX_DaysToDate(v2, m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
+                m_DateTime.Date.sDate.day);
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddHours(int32_t iHours) {
+  if (iHours == 0) {
+    return FALSE;
+  }
+  iHours += m_DateTime.Date.sDate.day;
+  int32_t iDays = iHours / 24;
+  iHours %= 24;
+  if (iHours < 0) {
+    iDays--, iHours += 24;
+  }
+  m_DateTime.Date.sDate.day = (uint8_t)iHours;
+  if (iDays != 0) {
+    AddDays(iDays);
+  }
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddMinutes(int32_t iMinutes) {
+  if (iMinutes == 0) {
+    return FALSE;
+  }
+  iMinutes += m_DateTime.Time.sTime.minute;
+  int32_t iHours = iMinutes / 60;
+  iMinutes %= 60;
+  if (iMinutes < 0) {
+    iHours--, iMinutes += 60;
+  }
+  m_DateTime.Time.sTime.minute = (uint8_t)iMinutes;
+  if (iHours != 0) {
+    AddHours(iHours);
+  }
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddSeconds(int32_t iSeconds) {
+  if (iSeconds == 0) {
+    return FALSE;
+  }
+  iSeconds += m_DateTime.Time.sTime.second;
+  int32_t iMinutes = iSeconds / 60;
+  iSeconds %= 60;
+  if (iSeconds < 0) {
+    iMinutes--, iSeconds += 60;
+  }
+  m_DateTime.Time.sTime.second = (uint8_t)iSeconds;
+  if (iMinutes != 0) {
+    AddMinutes(iMinutes);
+  }
+  return TRUE;
+}
+FX_BOOL CFX_DateTime::AddMilliseconds(int32_t iMilliseconds) {
+  if (iMilliseconds == 0) {
+    return FALSE;
+  }
+  iMilliseconds += m_DateTime.Time.sTime.millisecond;
+  int32_t iSeconds = (int32_t)(iMilliseconds / g_FXMillisecondsPerSecond);
+  iMilliseconds %= g_FXMillisecondsPerSecond;
+  if (iMilliseconds < 0) {
+    iSeconds--, iMilliseconds += g_FXMillisecondsPerSecond;
+  }
+  m_DateTime.Time.sTime.millisecond = (FX_WORD)iMilliseconds;
+  if (iSeconds != 0) {
+    AddSeconds(iSeconds);
+  }
+  return TRUE;
+}
diff --git a/xfa/fgas/localization/fgas_datetime.h b/xfa/fgas/localization/fgas_datetime.h
new file mode 100644
index 0000000..4aa5093
--- /dev/null
+++ b/xfa/fgas/localization/fgas_datetime.h
@@ -0,0 +1,406 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LOCALIZATION_FGAS_DATETIME_H_
+#define XFA_FGAS_LOCALIZATION_FGAS_DATETIME_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CFX_Unitime;
+class CFX_DateTime;
+
+typedef int64_t FX_UNITIME;
+enum FX_WEEKDAY {
+  FX_Sunday = 0,
+  FX_Monday,
+  FX_Tuesday,
+  FX_Wednesday,
+  FX_Thursday,
+  FX_Friday,
+  FX_Saturday,
+};
+
+FX_BOOL FX_IsLeapYear(int32_t iYear);
+int32_t FX_DaysInYear(int32_t iYear);
+uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
+
+class CFX_Unitime {
+ public:
+  CFX_Unitime() { m_iUnitime = 0; }
+  CFX_Unitime(FX_UNITIME iUnitime) { m_iUnitime = iUnitime; }
+  CFX_Unitime(const CFX_Unitime& unitime) { m_iUnitime = unitime.m_iUnitime; }
+  operator FX_UNITIME*() { return &m_iUnitime; }
+  operator FX_UNITIME const*() const { return &m_iUnitime; }
+  operator FX_UNITIME&() { return m_iUnitime; }
+  operator const FX_UNITIME&() const { return m_iUnitime; }
+  CFX_Unitime& operator=(const CFX_Unitime& t) {
+    m_iUnitime = t.m_iUnitime;
+    return *this;
+  }
+  CFX_Unitime& operator=(FX_UNITIME t) {
+    m_iUnitime = t;
+    return *this;
+  }
+  CFX_Unitime& operator+=(const CFX_Unitime& t) {
+    m_iUnitime += t.m_iUnitime;
+    return *this;
+  }
+  CFX_Unitime& operator+=(FX_UNITIME t) {
+    m_iUnitime += t;
+    return *this;
+  }
+  CFX_Unitime& operator-=(const CFX_Unitime& t) {
+    m_iUnitime -= t.m_iUnitime;
+    return *this;
+  }
+  CFX_Unitime& operator-=(FX_UNITIME t) {
+    m_iUnitime -= t;
+    return *this;
+  }
+  void Now();
+  void SetGMTime();
+  void Set(int32_t year,
+           uint8_t month,
+           uint8_t day,
+           uint8_t hour = 0,
+           uint8_t minute = 0,
+           uint8_t second = 0,
+           FX_WORD millisecond = 0);
+  void Set(FX_UNITIME t);
+  int32_t GetYear() const;
+  uint8_t GetMonth() const;
+  uint8_t GetDay() const;
+  FX_WEEKDAY GetDayOfWeek() const;
+  FX_WORD GetDayOfYear() const;
+  int64_t GetDayOfAD() const;
+  uint8_t GetHour() const;
+  uint8_t GetMinute() const;
+  uint8_t GetSecond() const;
+  FX_WORD GetMillisecond() const;
+  FX_BOOL AddYears(int32_t iYears);
+  FX_BOOL AddMonths(int32_t iMonths);
+  FX_BOOL AddDays(int32_t iDays);
+  FX_BOOL AddHours(int32_t iHours);
+  FX_BOOL AddMinutes(int32_t iMinutes);
+  FX_BOOL AddSeconds(int32_t iSeconds);
+  FX_BOOL AddMilliseconds(int32_t iMilliseconds);
+  friend CFX_Unitime operator+(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
+  }
+  friend CFX_Unitime operator+(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return CFX_Unitime(t1.m_iUnitime + t2);
+  }
+  friend CFX_Unitime operator+(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return CFX_Unitime(t1 + t2.m_iUnitime);
+  }
+  friend CFX_Unitime operator-(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
+  }
+  friend CFX_Unitime operator-(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return CFX_Unitime(t1.m_iUnitime + t2);
+  }
+  friend CFX_Unitime operator-(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return CFX_Unitime(t1 + t2.m_iUnitime);
+  }
+  friend bool operator==(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime == t2.m_iUnitime;
+  }
+  friend bool operator==(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime == t2;
+  }
+  friend bool operator==(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 == t2.m_iUnitime;
+  }
+  friend bool operator!=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime != t2.m_iUnitime;
+  }
+  friend bool operator!=(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime != t2;
+  }
+  friend bool operator!=(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 != t2.m_iUnitime;
+  }
+  friend bool operator>(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime > t2.m_iUnitime;
+  }
+  friend bool operator>(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime > t2;
+  }
+  friend bool operator>(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 > t2.m_iUnitime;
+  }
+  friend bool operator>=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime >= t2.m_iUnitime;
+  }
+  friend bool operator>=(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime >= t2;
+  }
+  friend bool operator>=(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 >= t2.m_iUnitime;
+  }
+  friend bool operator<(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime < t2.m_iUnitime;
+  }
+  friend bool operator<(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime < t2;
+  }
+  friend bool operator<(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 < t2.m_iUnitime;
+  }
+  friend bool operator<=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
+    return t1.m_iUnitime <= t2.m_iUnitime;
+  }
+  friend bool operator<=(const CFX_Unitime& t1, FX_UNITIME t2) {
+    return t1.m_iUnitime <= t2;
+  }
+  friend bool operator<=(FX_UNITIME t1, const CFX_Unitime& t2) {
+    return t1 <= t2.m_iUnitime;
+  }
+
+ private:
+  FX_UNITIME m_iUnitime;
+};
+
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(push, 1)
+#endif
+struct FX_DATE {
+  int32_t year;
+  uint8_t month;
+  uint8_t day;
+};
+
+struct FX_TIME {
+  uint8_t hour;
+  uint8_t minute;
+  uint8_t second;
+  FX_WORD millisecond;
+};
+
+struct FX_TIMEZONE {
+  int8_t tzHour;
+  uint8_t tzMinute;
+};
+
+struct FX_DATETIME {
+  union {
+    struct {
+      int32_t year;
+      uint8_t month;
+      uint8_t day;
+    } sDate;
+    FX_DATE aDate;
+  } Date;
+  union {
+    struct {
+      uint8_t hour;
+      uint8_t minute;
+      uint8_t second;
+      FX_WORD millisecond;
+    } sTime;
+    FX_TIME aTime;
+  } Time;
+};
+
+struct FX_DATETIMEZONE {
+  union {
+    struct {
+      union {
+        struct {
+          int32_t year;
+          uint8_t month;
+          uint8_t day;
+        };
+        FX_DATE date;
+      };
+      union {
+        struct {
+          uint8_t hour;
+          uint8_t minute;
+          uint8_t second;
+          FX_WORD millisecond;
+        };
+        FX_TIME time;
+      };
+    };
+    FX_DATETIME dt;
+  };
+  union {
+    struct {
+      int8_t tzHour;
+      uint8_t tzMinute;
+    };
+    FX_TIMEZONE tz;
+  };
+};
+#if _FX_OS_ != _FX_ANDROID_
+#pragma pack(pop)
+#endif
+
+class CFX_DateTime {
+ public:
+  CFX_DateTime() {}
+  CFX_DateTime(const FX_DATETIME& dt) { m_DateTime = dt; }
+  CFX_DateTime(const CFX_DateTime& dt) { m_DateTime = dt.m_DateTime; }
+  virtual ~CFX_DateTime() {}
+  operator FX_DATETIME*() { return &m_DateTime; }
+  operator const FX_DATETIME*() const { return &m_DateTime; }
+  operator FX_DATETIME&() { return m_DateTime; }
+  operator const FX_DATETIME&() const { return m_DateTime; }
+  CFX_DateTime& operator=(const CFX_DateTime& dt) {
+    m_DateTime = dt.m_DateTime;
+    return *this;
+  }
+  CFX_DateTime& operator=(const FX_DATETIME& dt) {
+    m_DateTime = dt;
+    return *this;
+  }
+  CFX_DateTime& operator+=(const CFX_DateTime& dt) {
+    FromUnitime(ToUnitime() + dt.ToUnitime());
+    return *this;
+  }
+  CFX_DateTime& operator+=(const FX_DATETIME& dt) {
+    FromUnitime(ToUnitime() + ((const CFX_DateTime&)dt).ToUnitime());
+    return *this;
+  }
+  CFX_DateTime& operator-=(const CFX_DateTime& dt) {
+    FromUnitime(ToUnitime() - dt.ToUnitime());
+    return *this;
+  }
+  CFX_DateTime& operator-=(const FX_DATETIME& dt) {
+    FromUnitime(ToUnitime() - ((const CFX_DateTime&)dt).ToUnitime());
+    return *this;
+  }
+  virtual FX_BOOL Set(int32_t year,
+                      uint8_t month,
+                      uint8_t day,
+                      uint8_t hour = 0,
+                      uint8_t minute = 0,
+                      uint8_t second = 0,
+                      FX_WORD millisecond = 0);
+  virtual FX_BOOL FromUnitime(FX_UNITIME t);
+  virtual FX_UNITIME ToUnitime() const;
+  virtual int32_t GetYear() const;
+  virtual uint8_t GetMonth() const;
+  virtual uint8_t GetDay() const;
+  virtual FX_WEEKDAY GetDayOfWeek() const;
+  virtual FX_WORD GetDayOfYear() const;
+  virtual int64_t GetDayOfAD() const;
+  virtual uint8_t GetHour() const;
+  virtual uint8_t GetMinute() const;
+  virtual uint8_t GetSecond() const;
+  virtual FX_WORD GetMillisecond() const;
+  virtual FX_BOOL AddYears(int32_t iYears);
+  virtual FX_BOOL AddMonths(int32_t iMonths);
+  virtual FX_BOOL AddDays(int32_t iDays);
+  virtual FX_BOOL AddHours(int32_t iHours);
+  virtual FX_BOOL AddMinutes(int32_t iMinutes);
+  virtual FX_BOOL AddSeconds(int32_t iSeconds);
+  virtual FX_BOOL AddMilliseconds(int32_t iMilliseconds);
+  friend CFX_DateTime operator+(const CFX_DateTime& dt1,
+                                const CFX_DateTime& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(dt1.ToUnitime() + dt2.ToUnitime());
+    return dt;
+  }
+  friend CFX_DateTime operator+(const CFX_DateTime& dt1,
+                                const FX_DATETIME& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(dt1.ToUnitime() + ((const CFX_DateTime&)dt2).ToUnitime());
+    return dt;
+  }
+  friend CFX_DateTime operator+(const FX_DATETIME& dt1,
+                                const CFX_DateTime& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() + dt2.ToUnitime());
+    return dt;
+  }
+  friend CFX_DateTime operator-(const CFX_DateTime& dt1,
+                                const CFX_DateTime& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(dt1.ToUnitime() - dt2.ToUnitime());
+    return dt;
+  }
+  friend CFX_DateTime operator-(const CFX_DateTime& dt1,
+                                const FX_DATETIME& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(dt1.ToUnitime() - ((const CFX_DateTime&)dt2).ToUnitime());
+    return dt;
+  }
+  friend CFX_DateTime operator-(const FX_DATETIME& dt1,
+                                const CFX_DateTime& dt2) {
+    CFX_DateTime dt;
+    dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() - dt2.ToUnitime());
+    return dt;
+  }
+  friend FX_BOOL operator==(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1),
+                        static_cast<const FX_DATETIME*>(dt2),
+                        sizeof(FX_DATETIME)) == 0;
+  }
+  friend FX_BOOL operator==(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1), &dt2,
+                        sizeof(FX_DATETIME)) == 0;
+  }
+  friend FX_BOOL operator==(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return FXSYS_memcmp(&dt1, static_cast<const FX_DATETIME*>(dt2),
+                        sizeof(FX_DATETIME)) == 0;
+  }
+  friend FX_BOOL operator!=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1),
+                        static_cast<const FX_DATETIME*>(dt2),
+                        sizeof(FX_DATETIME)) != 0;
+  }
+  friend FX_BOOL operator!=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1), &dt2,
+                        sizeof(FX_DATETIME)) != 0;
+  }
+  friend FX_BOOL operator!=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return FXSYS_memcmp(&dt1, static_cast<const FX_DATETIME*>(dt2),
+                        sizeof(FX_DATETIME)) != 0;
+  }
+  friend FX_BOOL operator>(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return dt1.ToUnitime() > dt2.ToUnitime();
+  }
+  friend FX_BOOL operator>(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return dt1.ToUnitime() > ((const CFX_DateTime&)dt2).ToUnitime();
+  }
+  friend FX_BOOL operator>(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return ((const CFX_DateTime&)dt1).ToUnitime() > dt2.ToUnitime();
+  }
+  friend FX_BOOL operator>=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return dt1.ToUnitime() >= dt2.ToUnitime();
+  }
+  friend FX_BOOL operator>=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return dt1.ToUnitime() >= ((const CFX_DateTime&)dt2).ToUnitime();
+  }
+  friend FX_BOOL operator>=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return ((const CFX_DateTime&)dt1).ToUnitime() >= dt2.ToUnitime();
+  }
+  friend FX_BOOL operator<(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return dt1.ToUnitime() < dt2.ToUnitime();
+  }
+  friend FX_BOOL operator<(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return dt1.ToUnitime() < ((const CFX_DateTime&)dt2).ToUnitime();
+  }
+  friend FX_BOOL operator<(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return ((const CFX_DateTime&)dt1).ToUnitime() < dt2.ToUnitime();
+  }
+  friend FX_BOOL operator<=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
+    return dt1.ToUnitime() <= dt2.ToUnitime();
+  }
+  friend FX_BOOL operator<=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
+    return dt1.ToUnitime() <= ((const CFX_DateTime&)dt2).ToUnitime();
+  }
+  friend FX_BOOL operator<=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
+    return ((const CFX_DateTime&)dt1).ToUnitime() <= dt2.ToUnitime();
+  }
+
+ private:
+  FX_DATETIME m_DateTime;
+};
+
+#endif  // XFA_FGAS_LOCALIZATION_FGAS_DATETIME_H_
diff --git a/xfa/fgas/localization/fgas_locale.cpp b/xfa/fgas/localization/fgas_locale.cpp
new file mode 100644
index 0000000..6af9205
--- /dev/null
+++ b/xfa/fgas/localization/fgas_locale.cpp
@@ -0,0 +1,5030 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "core/include/fxcrt/fx_xml.h"
+#include "xfa/fgas/localization/fgas_localeimp.h"
+
+#define FX_LOCALECATEGORY_DateHash 0xbde9abde
+#define FX_LOCALECATEGORY_TimeHash 0x2d71b00f
+#define FX_LOCALECATEGORY_DateTimeHash 0x158c72ed
+#define FX_LOCALECATEGORY_NumHash 0x0b4ff870
+#define FX_LOCALECATEGORY_TextHash 0x2d08af85
+#define FX_LOCALECATEGORY_ZeroHash 0x568cb500
+#define FX_LOCALECATEGORY_NullHash 0x052931bb
+
+struct FX_LOCALESUBCATEGORYINFO {
+  uint32_t uHash;
+  const FX_WCHAR* pName;
+  int32_t eSubCategory;
+};
+
+static const FX_LOCALESUBCATEGORYINFO g_FXLocaleDateTimeSubCatData[] = {
+    {0x14da2125, L"default", FX_LOCALEDATETIMESUBCATEGORY_Default},
+    {0x9041d4b0, L"short", FX_LOCALEDATETIMESUBCATEGORY_Short},
+    {0xa084a381, L"medium", FX_LOCALEDATETIMESUBCATEGORY_Medium},
+    {0xcdce56b3, L"full", FX_LOCALEDATETIMESUBCATEGORY_Full},
+    {0xf6b4afb0, L"long", FX_LOCALEDATETIMESUBCATEGORY_Long},
+};
+static const int32_t g_iFXLocaleDateTimeSubCatCount =
+    sizeof(g_FXLocaleDateTimeSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO);
+
+static const FX_LOCALESUBCATEGORYINFO g_FXLocaleNumSubCatData[] = {
+    {0x46f95531, L"percent", FX_LOCALENUMPATTERN_Percent},
+    {0x4c4e8acb, L"currency", FX_LOCALENUMPATTERN_Currency},
+    {0x54034c2f, L"decimal", FX_LOCALENUMPATTERN_Decimal},
+    {0x7568e6ae, L"integer", FX_LOCALENUMPATTERN_Integer},
+};
+static const int32_t g_iFXLocaleNumSubCatCount =
+    sizeof(g_FXLocaleNumSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO);
+
+struct FX_LOCALETIMEZONEINFO {
+  FX_DWORD uHash;
+  int16_t iHour;
+  int16_t iMinute;
+};
+
+static const FX_LOCALETIMEZONEINFO g_FXLocaleTimeZoneData[] = {
+    {FXBSTR_ID(0, 'C', 'D', 'T'), -5, 0}, {FXBSTR_ID(0, 'C', 'S', 'T'), -6, 0},
+    {FXBSTR_ID(0, 'E', 'D', 'T'), -4, 0}, {FXBSTR_ID(0, 'E', 'S', 'T'), -5, 0},
+    {FXBSTR_ID(0, 'M', 'D', 'T'), -6, 0}, {FXBSTR_ID(0, 'M', 'S', 'T'), -7, 0},
+    {FXBSTR_ID(0, 'P', 'D', 'T'), -7, 0}, {FXBSTR_ID(0, 'P', 'S', 'T'), -8, 0},
+};
+
+static const CFX_WideStringC gs_wsTextSymbols = FX_WSTRC(L"AXO09");
+static const CFX_WideStringC gs_wsTimeSymbols = FX_WSTRC(L"hHkKMSFAzZ");
+static const CFX_WideStringC gs_wsDateSymbols = FX_WSTRC(L"DJMEeGgYwW");
+static const CFX_WideStringC gs_wsConstChars = FX_WSTRC(L",-:/. ");
+
+static FX_STRSIZE FX_Local_Find(const CFX_WideStringC& wsSymbols,
+                                FX_WCHAR ch,
+                                FX_STRSIZE nStart = 0) {
+  FX_STRSIZE nLength = wsSymbols.GetLength();
+  if (nLength < 1 || nStart > nLength) {
+    return -1;
+  }
+  const FX_WCHAR* lpsz =
+      (const FX_WCHAR*)FXSYS_wcschr(wsSymbols.GetPtr() + nStart, ch);
+  return (lpsz == NULL) ? -1 : (FX_STRSIZE)(lpsz - wsSymbols.GetPtr());
+}
+static const FX_WCHAR* const gs_LocalNumberSymbols[] = {
+    L"decimal", L"grouping",       L"percent",      L"minus",
+    L"zero",    L"currencySymbol", L"currencyName",
+};
+IFX_Locale* IFX_Locale::Create(CXML_Element* pLocaleData) {
+  return new CFX_Locale(pLocaleData);
+}
+CFX_Locale::CFX_Locale(CXML_Element* pLocaleData) {
+  m_pElement = pLocaleData;
+}
+CFX_Locale::~CFX_Locale() {}
+CFX_WideString CFX_Locale::GetName() {
+  return CFX_WideString();
+}
+static CFX_WideString FX_GetXMLContent(const CFX_ByteStringC& bsSpace,
+                                       CXML_Element* pxmlElement,
+                                       const CFX_ByteStringC& bsTag,
+                                       const CFX_WideStringC& wsName) {
+  CXML_Element* pDatePattern = NULL;
+  int32_t nCount = pxmlElement->CountElements(bsSpace, bsTag);
+  int32_t i = 0;
+  for (; i < nCount; i++) {
+    pDatePattern = pxmlElement->GetElement(bsSpace, bsTag, i);
+    if (pDatePattern->GetAttrValue("name") == wsName) {
+      break;
+    }
+  }
+  if (i < nCount && pDatePattern) {
+    return pDatePattern->GetContent(0);
+  }
+  return L"";
+}
+void CFX_Locale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                   CFX_WideString& wsNumSymbol) const {
+  if (!m_pElement) {
+    return;
+  }
+  CFX_ByteString bsSpace;
+  CFX_WideString wsName = gs_LocalNumberSymbols[eType];
+  CXML_Element* pNumberSymbols =
+      m_pElement->GetElement(bsSpace, "numberSymbols");
+  if (!pNumberSymbols) {
+    return;
+  }
+  wsNumSymbol =
+      FX_GetXMLContent(bsSpace, pNumberSymbols, "numberSymbol", wsName);
+}
+void CFX_Locale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
+  if (!m_pElement) {
+    return;
+  }
+  CFX_ByteString bsSpace;
+  CXML_Element* pNumberSymbols =
+      m_pElement->GetElement(bsSpace, "dateTimeSymbols");
+  if (!pNumberSymbols) {
+    return;
+  }
+  wsDtSymbol = pNumberSymbols->GetContent(0);
+}
+static void FX_GetCalendarSymbol(CXML_Element* pXmlElement,
+                                 const CFX_ByteString& symbol_type,
+                                 int32_t index,
+                                 FX_BOOL bAbbr,
+                                 CFX_WideString& wsName) {
+  CFX_ByteString bsSpace;
+  CFX_ByteString pstrSymbolNames = symbol_type + "Names";
+  CXML_Element* pChild = pXmlElement->GetElement(bsSpace, "calendarSymbols");
+  if (!pChild) {
+    return;
+  }
+  CXML_Element* pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames);
+  if (!pSymbolNames) {
+    return;
+  }
+  if (pSymbolNames->GetAttrInteger("abbr") != bAbbr) {
+    pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames, 1);
+  }
+  if (pSymbolNames && pSymbolNames->GetAttrInteger("abbr") == bAbbr) {
+    CXML_Element* pSymbolName =
+        pSymbolNames->GetElement(bsSpace, symbol_type, index);
+    if (pSymbolName) {
+      wsName = pSymbolName->GetContent(0);
+    }
+  }
+}
+void CFX_Locale::GetMonthName(int32_t nMonth,
+                              CFX_WideString& wsMonthName,
+                              FX_BOOL bAbbr) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetCalendarSymbol(m_pElement, "month", nMonth, bAbbr, wsMonthName);
+}
+void CFX_Locale::GetDayName(int32_t nWeek,
+                            CFX_WideString& wsDayName,
+                            FX_BOOL bAbbr) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetCalendarSymbol(m_pElement, "day", nWeek, bAbbr, wsDayName);
+}
+void CFX_Locale::GetMeridiemName(CFX_WideString& wsMeridiemName,
+                                 FX_BOOL bAM) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetCalendarSymbol(m_pElement, "meridiem", bAM ? 0 : 1, FALSE,
+                       wsMeridiemName);
+}
+static int32_t FX_ParseTimeZone(const FX_WCHAR* pStr,
+                                int32_t iLen,
+                                FX_TIMEZONE& tz) {
+  tz.tzHour = 0;
+  tz.tzMinute = 0;
+  if (iLen < 0) {
+    return 0;
+  }
+  int32_t iStart = 1;
+  int32_t iEnd = iStart + 2;
+  while (iStart < iLen && iStart < iEnd) {
+    tz.tzHour = tz.tzHour * 10 + pStr[iStart++] - '0';
+  }
+  if (iStart < iLen && pStr[iStart] == ':') {
+    iStart++;
+  }
+  iEnd = iStart + 2;
+  while (iStart < iLen && iStart < iEnd) {
+    tz.tzMinute = tz.tzMinute * 10 + pStr[iStart++] - '0';
+  }
+  if (pStr[0] == '-') {
+    tz.tzHour = -tz.tzHour;
+  }
+  return iStart;
+}
+void CFX_Locale::GetTimeZone(FX_TIMEZONE& tz) const {
+  tz.tzHour = 0;
+  tz.tzMinute = 0;
+  if (!m_pElement) {
+    return;
+  }
+  CXML_Element* pxmlTimeZone = m_pElement->GetElement("", "timeZone");
+  if (pxmlTimeZone) {
+    CFX_WideString wsTimeZone = pxmlTimeZone->GetContent(0);
+    FX_ParseTimeZone(wsTimeZone, wsTimeZone.GetLength(), tz);
+  }
+}
+void CFX_Locale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetCalendarSymbol(m_pElement, "era", bAD ? 0 : 1, FALSE, wsEraName);
+}
+static void FX_GetPattern(CXML_Element* pXmlElement,
+                          const CFX_ByteString& bsCategory,
+                          const CFX_WideString& wsSubCategory,
+                          CFX_WideString& wsPattern) {
+  CFX_ByteString bsSpace;
+  CXML_Element* pDatePatterns =
+      pXmlElement->GetElement(bsSpace, bsCategory + "s");
+  if (!pDatePatterns) {
+    return;
+  }
+  wsPattern =
+      FX_GetXMLContent(bsSpace, pDatePatterns, bsCategory, wsSubCategory);
+}
+static void FX_GetDateTimePattern(CXML_Element* pXmlElement,
+                                  const CFX_ByteString& bsCategory,
+                                  FX_LOCALEDATETIMESUBCATEGORY eType,
+                                  CFX_WideString& wsPattern) {
+  CFX_WideString wsType = g_FXLocaleDateTimeSubCatData[eType].pName;
+  FX_GetPattern(pXmlElement, bsCategory, wsType, wsPattern);
+}
+void CFX_Locale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                CFX_WideString& wsPattern) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetDateTimePattern(m_pElement, "datePattern", eType, wsPattern);
+}
+void CFX_Locale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                CFX_WideString& wsPattern) const {
+  if (!m_pElement) {
+    return;
+  }
+  FX_GetDateTimePattern(m_pElement, "timePattern", eType, wsPattern);
+}
+void CFX_Locale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                               CFX_WideString& wsPattern) const {
+  CFX_WideString wsType = g_FXLocaleNumSubCatData[eType].pName;
+  FX_GetPattern(m_pElement, "numberPattern", wsType, wsPattern);
+}
+static FX_BOOL FX_IsDigit(FX_WCHAR c) {
+  return c >= '0' && c <= '9';
+}
+static FX_BOOL FX_IsAlpha(FX_WCHAR c) {
+  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+}
+static FX_BOOL FX_IsSpace(FX_WCHAR c) {
+  return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09);
+}
+static const FX_FLOAT gs_fraction_scales[] = {
+    0.1f,         0.01f,         0.001f,        0.0001f,
+    0.00001f,     0.000001f,     0.0000001f,    0.00000001f,
+    0.000000001f, 0.0000000001f, 0.00000000001f};
+static const int32_t gs_fraction_count =
+    sizeof(gs_fraction_scales) / sizeof(FX_FLOAT);
+
+class CFX_LCNumeric {
+ public:
+  CFX_LCNumeric();
+  CFX_LCNumeric(int64_t integral,
+                uint32_t fractional = 0,
+                int32_t exponent = 0);
+  CFX_LCNumeric(FX_FLOAT dbRetValue);
+  CFX_LCNumeric(double dbvalue);
+  CFX_LCNumeric(CFX_WideString& wsNumeric);
+
+  FX_FLOAT GetFloat() const;
+  double GetDouble() const;
+  CFX_WideString ToString() const;
+  CFX_WideString ToString(int32_t nTreading, FX_BOOL bTrimTailZeros) const;
+
+  int64_t m_Integral;
+  uint32_t m_Fractional;
+  int32_t m_Exponent;
+};
+
+static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue,
+                                   CFX_LCNumeric& lcnum) {
+  lcnum.m_Integral = 0;
+  lcnum.m_Fractional = 0;
+  lcnum.m_Exponent = 0;
+
+  if (wsValue.IsEmpty())
+    return FALSE;
+
+  const int32_t nIntegralMaxLen = 17;
+  int32_t cc = 0;
+  bool bNegative = false;
+  bool bExpSign = false;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsValue;
+  int32_t len = wsValue.GetLength();
+  while (cc < len && FX_IsSpace(str[cc]))
+    cc++;
+
+  if (cc >= len)
+    return FALSE;
+
+  if (str[cc] == '+') {
+    cc++;
+  } else if (str[cc] == '-') {
+    bNegative = true;
+    cc++;
+  }
+  int32_t nIntegralLen = 0;
+  while (cc < len) {
+    if (str[cc] == '.')
+      break;
+
+    if (!FX_IsDigit(str[cc])) {
+      if ((str[cc] == 'E' || str[cc] == 'e'))
+        break;
+      else
+        return FALSE;
+    }
+    if (nIntegralLen < nIntegralMaxLen) {
+      lcnum.m_Integral = lcnum.m_Integral * 10 + str[cc] - '0';
+      nIntegralLen++;
+    }
+    cc++;
+  }
+
+  lcnum.m_Integral = bNegative ? -lcnum.m_Integral : lcnum.m_Integral;
+  if (cc < len && str[cc] == '.') {
+    int scale = 0;
+    double fraction = 0.0;
+    cc++;
+    while (cc < len) {
+      if (scale >= gs_fraction_count) {
+        while (cc < len) {
+          if (!FX_IsDigit(str[cc]))
+            break;
+          cc++;
+        }
+      }
+      if (!FX_IsDigit(str[cc])) {
+        if ((str[cc] == 'E' || str[cc] == 'e'))
+          break;
+        else
+          return FALSE;
+      }
+      fraction += gs_fraction_scales[scale] * (str[cc] - '0');
+      scale++;
+      cc++;
+    }
+    lcnum.m_Fractional = (FX_DWORD)(fraction * 4294967296.0);
+  }
+  if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
+    cc++;
+    if (cc < len) {
+      if (str[cc] == '+') {
+        cc++;
+      } else if (str[cc] == '-') {
+        bExpSign = true;
+        cc++;
+      }
+    }
+    while (cc < len) {
+      if (FX_IsDigit(str[cc]))
+        return FALSE;
+      lcnum.m_Exponent = lcnum.m_Exponent * 10 + str[cc] - '0';
+      cc++;
+    }
+    lcnum.m_Exponent = bExpSign ? -lcnum.m_Exponent : lcnum.m_Exponent;
+  }
+  return TRUE;
+}
+
+CFX_LCNumeric::CFX_LCNumeric() {
+  m_Integral = 0;
+  m_Fractional = 0;
+  m_Exponent = 0;
+}
+CFX_LCNumeric::CFX_LCNumeric(int64_t integral,
+                             FX_DWORD fractional,
+                             int32_t exponent) {
+  m_Integral = integral;
+  m_Fractional = fractional;
+  m_Exponent = exponent;
+}
+CFX_LCNumeric::CFX_LCNumeric(FX_FLOAT dbRetValue) {
+  m_Integral = (int64_t)dbRetValue;
+  m_Fractional = (FX_DWORD)(((dbRetValue > 0) ? (dbRetValue - m_Integral)
+                                              : (m_Integral - dbRetValue)) *
+                            4294967296);
+  m_Exponent = 0;
+}
+CFX_LCNumeric::CFX_LCNumeric(double dbvalue) {
+  m_Integral = (int64_t)dbvalue;
+  m_Fractional = (FX_DWORD)(
+      ((dbvalue > 0) ? (dbvalue - m_Integral) : (m_Integral - dbvalue)) *
+      4294967296);
+  m_Exponent = 0;
+}
+CFX_LCNumeric::CFX_LCNumeric(CFX_WideString& wsNumeric) {
+  FX_WStringToNumeric(wsNumeric, *this);
+}
+FX_FLOAT CFX_LCNumeric::GetFloat() const {
+  FX_FLOAT dbRetValue = m_Fractional / 4294967296.0f;
+  dbRetValue = m_Integral + (m_Integral >= 0 ? dbRetValue : -dbRetValue);
+  if (m_Exponent != 0) {
+    dbRetValue *= FXSYS_pow(10, (FX_FLOAT)m_Exponent);
+  }
+  return dbRetValue;
+}
+double CFX_LCNumeric::GetDouble() const {
+  double value = m_Fractional / 4294967296.0;
+  value = m_Integral + (m_Integral >= 0 ? value : -value);
+  if (m_Exponent != 0) {
+    value *= FXSYS_pow(10, (FX_FLOAT)m_Exponent);
+  }
+  return value;
+}
+
+CFX_WideString CFX_LCNumeric::ToString() const {
+  return ToString(8, TRUE);
+}
+
+CFX_WideString CFX_LCNumeric::ToString(int32_t nTreading,
+                                       FX_BOOL bTrimTailZeros) const {
+  CFX_WideString wsFormat;
+  wsFormat.Format(L"%%.%df", nTreading);
+  CFX_WideString wsResult;
+  wsResult.Format(wsFormat.c_str(), GetDouble());
+  if (bTrimTailZeros && nTreading > 0) {
+    wsResult.TrimRight(L"0");
+    wsResult.TrimRight(L".");
+  }
+  return wsResult;
+}
+
+IFX_FormatString* IFX_FormatString::Create(IFX_LocaleMgr* pLocaleMgr,
+                                           FX_BOOL bUseLCID) {
+  if (!pLocaleMgr) {
+    return NULL;
+  }
+  return new CFX_FormatString(pLocaleMgr, bUseLCID);
+}
+CFX_FormatString::CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID)
+    : m_pLocaleMgr(pLocaleMgr), m_bUseLCID(bUseLCID) {}
+CFX_FormatString::~CFX_FormatString() {}
+void CFX_FormatString::SplitFormatString(const CFX_WideString& wsFormatString,
+                                         CFX_WideStringArray& wsPatterns) {
+  int32_t iStrLen = wsFormatString.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsFormatString;
+  const FX_WCHAR* pToken = pStr;
+  const FX_WCHAR* pEnd = pStr + iStrLen;
+  FX_BOOL iQuote = FALSE;
+  while (TRUE) {
+    if (pStr >= pEnd) {
+      CFX_WideString sub(pToken, pStr - pToken);
+      wsPatterns.Add(sub);
+      return;
+    } else if (*pStr == '\'') {
+      iQuote = !iQuote;
+    } else if (*pStr == L'|' && !iQuote) {
+      CFX_WideString sub(pToken, pStr - pToken);
+      wsPatterns.Add(sub);
+      pToken = pStr + 1;
+    }
+    pStr++;
+  }
+}
+static CFX_WideString FX_GetLiteralText(const FX_WCHAR* pStrPattern,
+                                        int32_t& iPattern,
+                                        int32_t iLenPattern) {
+  CFX_WideString wsOutput;
+  if (pStrPattern[iPattern] != '\'') {
+    return wsOutput;
+  }
+  iPattern++;
+  int32_t iQuote = 1;
+  while (iPattern < iLenPattern) {
+    if (pStrPattern[iPattern] == '\'') {
+      iQuote++;
+      if ((iPattern + 1 >= iLenPattern) ||
+          ((pStrPattern[iPattern + 1] != '\'') && (iQuote % 2 == 0))) {
+        break;
+      } else {
+        iQuote++;
+      }
+      iPattern++;
+    } else if (pStrPattern[iPattern] == '\\' && (iPattern + 1 < iLenPattern) &&
+               pStrPattern[iPattern + 1] == 'u') {
+      int32_t iKeyValue = 0;
+      iPattern += 2;
+      int32_t i = 0;
+      while (iPattern < iLenPattern && i++ < 4) {
+        FX_WCHAR ch = pStrPattern[iPattern++];
+        if ((ch >= '0' && ch <= '9')) {
+          iKeyValue = iKeyValue * 16 + ch - '0';
+        } else if ((ch >= 'a' && ch <= 'f')) {
+          iKeyValue = iKeyValue * 16 + ch - 'a' + 10;
+        } else if ((ch >= 'A' && ch <= 'F')) {
+          iKeyValue = iKeyValue * 16 + ch - 'A' + 10;
+        }
+      }
+      if (iKeyValue != 0) {
+        wsOutput += (FX_WCHAR)(iKeyValue & 0x0000FFFF);
+      }
+      continue;
+    }
+    wsOutput += pStrPattern[iPattern++];
+  }
+  return wsOutput;
+}
+static CFX_WideString FX_GetLiteralTextReverse(const FX_WCHAR* pStrPattern,
+                                               int32_t& iPattern) {
+  CFX_WideString wsOutput;
+  if (pStrPattern[iPattern] != '\'') {
+    return wsOutput;
+  }
+  iPattern--;
+  int32_t iQuote = 1;
+  while (iPattern >= 0) {
+    if (pStrPattern[iPattern] == '\'') {
+      iQuote++;
+      if (iPattern - 1 >= 0 ||
+          ((pStrPattern[iPattern - 1] != '\'') && (iQuote % 2 == 0))) {
+        break;
+      } else {
+        iQuote++;
+      }
+      iPattern--;
+    } else if (pStrPattern[iPattern] == '\\' &&
+               pStrPattern[iPattern + 1] == 'u') {
+      iPattern--;
+      int32_t iKeyValue = 0;
+      int32_t iLen = wsOutput.GetLength();
+      int32_t i = 1;
+      for (; i < iLen && i < 5; i++) {
+        FX_WCHAR ch = wsOutput[i];
+        if ((ch >= '0' && ch <= '9')) {
+          iKeyValue = iKeyValue * 16 + ch - '0';
+        } else if ((ch >= 'a' && ch <= 'f')) {
+          iKeyValue = iKeyValue * 16 + ch - 'a' + 10;
+        } else if ((ch >= 'A' && ch <= 'F')) {
+          iKeyValue = iKeyValue * 16 + ch - 'A' + 10;
+        }
+      }
+      if (iKeyValue != 0) {
+        wsOutput.Delete(0, i);
+        wsOutput = (FX_WCHAR)(iKeyValue & 0x0000FFFF) + wsOutput;
+      }
+      continue;
+    }
+    wsOutput = pStrPattern[iPattern--] + wsOutput;
+  }
+  return wsOutput;
+}
+FX_LOCALECATEGORY CFX_FormatString::GetCategory(
+    const CFX_WideString& wsPattern) {
+  FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown;
+  int32_t ccf = 0;
+  int32_t iLenf = wsPattern.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
+  FX_BOOL bBraceOpen = FALSE;
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      FX_GetLiteralText(pStr, ccf, iLenf);
+    } else if (!bBraceOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
+      CFX_WideString wsCategory(pStr[ccf]);
+      ccf++;
+      while (TRUE) {
+        if (ccf == iLenf) {
+          return eCategory;
+        }
+        if (pStr[ccf] == '.' || pStr[ccf] == '(') {
+          break;
+        }
+        if (pStr[ccf] == '{') {
+          bBraceOpen = TRUE;
+          break;
+        }
+        wsCategory += pStr[ccf];
+        ccf++;
+      }
+      FX_DWORD dwHash =
+          FX_HashCode_String_GetW(wsCategory, wsCategory.GetLength());
+      if (dwHash == FX_LOCALECATEGORY_DateHash) {
+        if (eCategory == FX_LOCALECATEGORY_Time) {
+          return FX_LOCALECATEGORY_DateTime;
+        }
+        eCategory = FX_LOCALECATEGORY_Date;
+      } else if (dwHash == FX_LOCALECATEGORY_TimeHash) {
+        if (eCategory == FX_LOCALECATEGORY_Date) {
+          return FX_LOCALECATEGORY_DateTime;
+        }
+        eCategory = FX_LOCALECATEGORY_Time;
+      } else if (dwHash == FX_LOCALECATEGORY_DateTimeHash) {
+        return FX_LOCALECATEGORY_DateTime;
+      } else if (dwHash == FX_LOCALECATEGORY_TextHash) {
+        return FX_LOCALECATEGORY_Text;
+      } else if (dwHash == FX_LOCALECATEGORY_NumHash) {
+        return FX_LOCALECATEGORY_Num;
+      } else if (dwHash == FX_LOCALECATEGORY_ZeroHash) {
+        return FX_LOCALECATEGORY_Zero;
+      } else if (dwHash == FX_LOCALECATEGORY_NullHash) {
+        return FX_LOCALECATEGORY_Null;
+      }
+    } else if (pStr[ccf] == '}') {
+      bBraceOpen = FALSE;
+    }
+    ccf++;
+  }
+  return eCategory;
+}
+static FX_WORD FX_WStringToLCID(const FX_WCHAR* pstrLCID) {
+  if (!pstrLCID) {
+    return 0;
+  }
+  wchar_t* pEnd;
+  return (FX_WORD)wcstol((wchar_t*)pstrLCID, &pEnd, 16);
+}
+FX_WORD CFX_FormatString::GetLCID(const CFX_WideString& wsPattern) {
+  return FX_WStringToLCID(GetLocaleName(wsPattern));
+}
+CFX_WideString CFX_FormatString::GetLocaleName(
+    const CFX_WideString& wsPattern) {
+  int32_t ccf = 0;
+  int32_t iLenf = wsPattern.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      FX_GetLiteralText(pStr, ccf, iLenf);
+    } else if (pStr[ccf] == '(') {
+      ccf++;
+      CFX_WideString wsLCID;
+      while (ccf < iLenf && pStr[ccf] != ')') {
+        wsLCID += pStr[ccf++];
+      }
+      return wsLCID;
+    }
+    ccf++;
+  }
+  return CFX_WideString();
+}
+IFX_Locale* CFX_FormatString::GetTextFormat(const CFX_WideString& wsPattern,
+                                            const CFX_WideStringC& wsCategory,
+                                            CFX_WideString& wsPurgePattern) {
+  IFX_Locale* pLocale = NULL;
+  int32_t ccf = 0;
+  int32_t iLenf = wsPattern.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
+  FX_BOOL bBrackOpen = FALSE;
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      int32_t iCurChar = ccf;
+      FX_GetLiteralText(pStr, ccf, iLenf);
+      wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
+    } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
+      CFX_WideString wsSearchCategory(pStr[ccf]);
+      ccf++;
+      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
+             pStr[ccf] != '(') {
+        wsSearchCategory += pStr[ccf];
+        ccf++;
+      }
+      if (wsSearchCategory != wsCategory) {
+        continue;
+      }
+      while (ccf < iLenf) {
+        if (pStr[ccf] == '(') {
+          ccf++;
+          CFX_WideString wsLCID;
+          while (ccf < iLenf && pStr[ccf] != ')') {
+            wsLCID += pStr[ccf++];
+          }
+          pLocale = GetPatternLocale(wsLCID);
+        } else if (pStr[ccf] == '{') {
+          bBrackOpen = TRUE;
+          break;
+        }
+        ccf++;
+      }
+    } else if (pStr[ccf] != '}') {
+      wsPurgePattern += pStr[ccf];
+    }
+    ccf++;
+  }
+  if (!bBrackOpen) {
+    wsPurgePattern = wsPattern;
+  }
+  if (!pLocale) {
+    pLocale = m_pLocaleMgr->GetDefLocale();
+  }
+  return pLocale;
+}
+#define FX_NUMSTYLE_Percent 0x01
+#define FX_NUMSTYLE_Exponent 0x02
+#define FX_NUMSTYLE_DotVorv 0x04
+IFX_Locale* CFX_FormatString::GetNumericFormat(const CFX_WideString& wsPattern,
+                                               int32_t& iDotIndex,
+                                               FX_DWORD& dwStyle,
+                                               CFX_WideString& wsPurgePattern) {
+  dwStyle = 0;
+  IFX_Locale* pLocale = NULL;
+  int32_t ccf = 0;
+  int32_t iLenf = wsPattern.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
+  FX_BOOL bFindDot = FALSE;
+  FX_BOOL bBrackOpen = FALSE;
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      int32_t iCurChar = ccf;
+      FX_GetLiteralText(pStr, ccf, iLenf);
+      wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
+    } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
+      CFX_WideString wsCategory(pStr[ccf]);
+      ccf++;
+      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
+             pStr[ccf] != '(') {
+        wsCategory += pStr[ccf];
+        ccf++;
+      }
+      if (wsCategory != FX_WSTRC(L"num")) {
+        bBrackOpen = TRUE;
+        ccf = 0;
+        continue;
+      }
+      while (ccf < iLenf) {
+        if (pStr[ccf] == '(') {
+          ccf++;
+          CFX_WideString wsLCID;
+          while (ccf < iLenf && pStr[ccf] != ')') {
+            wsLCID += pStr[ccf++];
+          }
+          pLocale = GetPatternLocale(wsLCID);
+        } else if (pStr[ccf] == '{') {
+          bBrackOpen = TRUE;
+          break;
+        } else if (pStr[ccf] == '.') {
+          CFX_WideString wsSubCategory;
+          ccf++;
+          while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') {
+            wsSubCategory += pStr[ccf++];
+          }
+          FX_DWORD dwSubHash =
+              FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength());
+          FX_LOCALENUMSUBCATEGORY eSubCategory = FX_LOCALENUMPATTERN_Decimal;
+          for (int32_t i = 0; i < g_iFXLocaleNumSubCatCount; i++) {
+            if (g_FXLocaleNumSubCatData[i].uHash == dwSubHash) {
+              eSubCategory = (FX_LOCALENUMSUBCATEGORY)g_FXLocaleNumSubCatData[i]
+                                 .eSubCategory;
+              break;
+            }
+          }
+          wsSubCategory.Empty();
+          if (!pLocale) {
+            pLocale = m_pLocaleMgr->GetDefLocale();
+          }
+          FXSYS_assert(pLocale != NULL);
+          pLocale->GetNumPattern(eSubCategory, wsSubCategory);
+          iDotIndex = wsSubCategory.Find('.');
+          if (iDotIndex > 0) {
+            iDotIndex += wsPurgePattern.GetLength();
+            bFindDot = TRUE;
+            dwStyle |= FX_NUMSTYLE_DotVorv;
+          }
+          wsPurgePattern += wsSubCategory;
+          if (eSubCategory == FX_LOCALENUMPATTERN_Percent) {
+            dwStyle |= FX_NUMSTYLE_Percent;
+          }
+          continue;
+        }
+        ccf++;
+      }
+    } else if (pStr[ccf] == 'E') {
+      dwStyle |= FX_NUMSTYLE_Exponent;
+      wsPurgePattern += pStr[ccf];
+    } else if (pStr[ccf] == '%') {
+      dwStyle |= FX_NUMSTYLE_Percent;
+      wsPurgePattern += pStr[ccf];
+    } else if (pStr[ccf] != '}') {
+      wsPurgePattern += pStr[ccf];
+    }
+    if (!bFindDot) {
+      if (pStr[ccf] == '.' || pStr[ccf] == 'V' || pStr[ccf] == 'v') {
+        bFindDot = TRUE;
+        iDotIndex = wsPurgePattern.GetLength() - 1;
+        dwStyle |= FX_NUMSTYLE_DotVorv;
+      }
+    }
+    ccf++;
+  }
+  if (!bFindDot) {
+    iDotIndex = wsPurgePattern.GetLength();
+  }
+  if (!pLocale) {
+    pLocale = m_pLocaleMgr->GetDefLocale();
+  }
+  return pLocale;
+}
+static FX_BOOL FX_GetNumericDotIndex(const CFX_WideString& wsNum,
+                                     const CFX_WideString& wsDotSymbol,
+                                     int32_t& iDotIndex) {
+  int32_t ccf = 0;
+  int32_t iLenf = wsNum.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsNum;
+  int32_t iLenDot = wsDotSymbol.GetLength();
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      FX_GetLiteralText(pStr, ccf, iLenf);
+    } else if (ccf + iLenDot <= iLenf &&
+               !FXSYS_wcsncmp(pStr + ccf, (const FX_WCHAR*)wsDotSymbol,
+                              iLenDot)) {
+      iDotIndex = ccf;
+      return TRUE;
+    }
+    ccf++;
+  }
+  iDotIndex = wsNum.Find('.');
+  if (iDotIndex < 0) {
+    iDotIndex = iLenf;
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_BOOL CFX_FormatString::ParseText(const CFX_WideString& wsSrcText,
+                                    const CFX_WideString& wsPattern,
+                                    CFX_WideString& wsValue) {
+  wsValue.Empty();
+  if (wsSrcText.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat);
+  if (wsTextFormat.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t iText = 0, iPattern = 0;
+  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
+  int32_t iLenText = wsSrcText.GetLength();
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern && iText < iLenText) {
+    switch (pStrPattern[iPattern]) {
+      case '\'': {
+        CFX_WideString wsLiteral =
+            FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+        int32_t iLiteralLen = wsLiteral.GetLength();
+        if (iText + iLiteralLen > iLenText ||
+            FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
+                          iLiteralLen)) {
+          wsValue = wsSrcText;
+          return FALSE;
+        }
+        iText += iLiteralLen;
+        iPattern++;
+        break;
+      }
+      case 'A':
+        if (FX_IsAlpha(pStrText[iText])) {
+          wsValue += pStrText[iText];
+          iText++;
+        }
+        iPattern++;
+        break;
+      case 'X':
+        wsValue += pStrText[iText];
+        iText++;
+        iPattern++;
+        break;
+      case 'O':
+      case '0':
+        if (FX_IsDigit(pStrText[iText]) || FX_IsAlpha(pStrText[iText])) {
+          wsValue += pStrText[iText];
+          iText++;
+        }
+        iPattern++;
+        break;
+      case '9':
+        if (FX_IsDigit(pStrText[iText])) {
+          wsValue += pStrText[iText];
+          iText++;
+        }
+        iPattern++;
+        break;
+      default:
+        if (pStrPattern[iPattern] != pStrText[iText]) {
+          wsValue = wsSrcText;
+          return FALSE;
+        }
+        iPattern++;
+        iText++;
+        break;
+    }
+  }
+  return iPattern == iLenPattern && iText == iLenText;
+}
+FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum,
+                                   const CFX_WideString& wsPattern,
+                                   FX_FLOAT& fValue) {
+  fValue = 0.0f;
+  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t dot_index_f = -1;
+  FX_DWORD dwFormatStyle = 0;
+  CFX_WideString wsNumFormat;
+  IFX_Locale* pLocale =
+      GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
+  if (!pLocale || wsNumFormat.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t iExponent = 0;
+  CFX_WideString wsDotSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  int32_t iGroupLen = wsGroupSymbol.GetLength();
+  CFX_WideString wsMinus;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus);
+  int32_t iMinusLen = wsMinus.GetLength();
+  int cc = 0, ccf = 0;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
+  int len = wsSrcNum.GetLength();
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
+  int lenf = wsNumFormat.GetLength();
+  double dbRetValue = 0;
+  double coeff = 1;
+  FX_BOOL bHavePercentSymbol = FALSE;
+  FX_BOOL bNeg = FALSE;
+  FX_BOOL bReverseParse = FALSE;
+  int32_t dot_index = 0;
+  if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) &&
+      (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
+    bReverseParse = TRUE;
+  }
+  bReverseParse = FALSE;
+  if (bReverseParse) {
+    ccf = lenf - 1;
+    cc = len - 1;
+    while (ccf > dot_index_f && cc >= 0) {
+      switch (strf[ccf]) {
+        case '\'': {
+          CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
+          int32_t iLiteralLen = wsLiteral.GetLength();
+          cc -= iLiteralLen - 1;
+          if (cc < 0 || FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
+                                      iLiteralLen)) {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+          break;
+        }
+        case '9':
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
+          coeff *= 0.1;
+          cc--;
+          ccf--;
+          break;
+        case 'z':
+          if (cc >= 0) {
+            dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
+            coeff *= 0.1;
+            cc--;
+          }
+          ccf--;
+          break;
+        case 'Z':
+          if (str[cc] != ' ') {
+            dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
+            coeff *= 0.1;
+          }
+          cc--;
+          ccf--;
+          break;
+        case 'S':
+          if (str[cc] == '+' || str[cc] == ' ') {
+            cc--;
+          } else {
+            cc -= iMinusLen - 1;
+            if (cc < 0 ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            cc--;
+            bNeg = TRUE;
+          }
+          ccf--;
+          break;
+        case 's':
+          if (str[cc] == '+') {
+            cc--;
+          } else {
+            cc -= iMinusLen - 1;
+            if (cc < 0 ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            cc--;
+            bNeg = TRUE;
+          }
+          ccf--;
+          break;
+        case 'E': {
+          if (cc >= dot_index) {
+            return FALSE;
+          }
+          FX_BOOL bExpSign = FALSE;
+          while (cc >= 0) {
+            if (str[cc] == 'E' || str[cc] == 'e') {
+              break;
+            }
+            if (FX_IsDigit(str[cc])) {
+              iExponent = iExponent + (str[cc] - '0') * 10;
+              cc--;
+              continue;
+            } else if (str[cc] == '+') {
+              cc--;
+              continue;
+            } else if (cc - iMinusLen + 1 > 0 &&
+                       !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
+                                      (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              bExpSign = TRUE;
+              cc -= iMinusLen;
+            } else {
+              return FALSE;
+            }
+          }
+          cc--;
+          iExponent = bExpSign ? -iExponent : iExponent;
+          ccf--;
+        } break;
+        case '$': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
+                                     wsSymbol);
+          int32_t iSymbolLen = wsSymbol.GetLength();
+          cc -= iSymbolLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+        } break;
+        case 'r':
+          if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
+            if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+              bNeg = TRUE;
+              cc -= 2;
+            }
+            ccf -= 2;
+          } else {
+            ccf--;
+          }
+          break;
+        case 'R':
+          if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+              bNeg = TRUE;
+              cc -= 2;
+            }
+            ccf -= 2;
+          } else {
+            ccf--;
+          }
+          break;
+        case 'b':
+          if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
+            if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+              bNeg = TRUE;
+              cc -= 2;
+            }
+            ccf -= 2;
+          } else {
+            ccf--;
+          }
+          break;
+        case 'B':
+          if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+              bNeg = TRUE;
+              cc -= 2;
+            }
+            ccf -= 2;
+          } else {
+            ccf--;
+          }
+          break;
+        case '.':
+        case 'V':
+        case 'v':
+          return FALSE;
+        case '%': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+          int32_t iSysmbolLen = wsSymbol.GetLength();
+          cc -= iSysmbolLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+          bHavePercentSymbol = TRUE;
+        } break;
+        case '8':
+          while (ccf < lenf && strf[ccf] == '8') {
+            ccf++;
+          }
+          while (cc < len && FX_IsDigit(str[cc])) {
+            dbRetValue = (str[cc] - '0') * coeff + dbRetValue;
+            coeff *= 0.1;
+            cc++;
+          }
+          break;
+        case ',': {
+          if (cc >= 0) {
+            cc -= iGroupLen - 1;
+            if (cc >= 0 &&
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
+                              iGroupLen) == 0) {
+              cc--;
+            } else {
+              cc += iGroupLen - 1;
+            }
+          }
+          ccf--;
+        } break;
+        case '(':
+          if (str[cc] == L'(') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+          break;
+        case ')':
+          if (str[cc] == L')') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+          break;
+        default:
+          if (strf[ccf] != str[cc]) {
+            return FALSE;
+          }
+          cc--;
+          ccf--;
+      }
+    }
+    dot_index = cc + 1;
+  }
+  ccf = dot_index_f - 1;
+  cc = dot_index - 1;
+  coeff = 1;
+  while (ccf >= 0 && cc >= 0) {
+    switch (strf[ccf]) {
+      case '\'': {
+        CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
+        int32_t iLiteralLen = wsLiteral.GetLength();
+        cc -= iLiteralLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      }
+      case '9':
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+        coeff *= 10;
+        cc--;
+        ccf--;
+        break;
+      case 'z':
+        if (FX_IsDigit(str[cc])) {
+          dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+          coeff *= 10;
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'Z':
+        if (str[cc] != ' ') {
+          if (FX_IsDigit(str[cc])) {
+            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+            coeff *= 10;
+            cc--;
+          }
+        } else {
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'S':
+        if (str[cc] == '+' || str[cc] == ' ') {
+          cc--;
+        } else {
+          cc -= iMinusLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            return FALSE;
+          }
+          cc--;
+          bNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 's':
+        if (str[cc] == '+') {
+          cc--;
+        } else {
+          cc -= iMinusLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            return FALSE;
+          }
+          cc--;
+          bNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 'E': {
+        if (cc >= dot_index) {
+          return FALSE;
+        }
+        FX_BOOL bExpSign = FALSE;
+        while (cc >= 0) {
+          if (str[cc] == 'E' || str[cc] == 'e') {
+            break;
+          }
+          if (FX_IsDigit(str[cc])) {
+            iExponent = iExponent + (str[cc] - '0') * 10;
+            cc--;
+            continue;
+          } else if (str[cc] == '+') {
+            cc--;
+            continue;
+          } else if (cc - iMinusLen + 1 > 0 &&
+                     !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
+                                    (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            bExpSign = TRUE;
+            cc -= iMinusLen;
+          } else {
+            return FALSE;
+          }
+        }
+        cc--;
+        iExponent = bExpSign ? -iExponent : iExponent;
+        ccf--;
+      } break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        int32_t iSymbolLen = wsSymbol.GetLength();
+        cc -= iSymbolLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+      } break;
+      case 'r':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
+          if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'R':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
+          if (str[cc] == ' ') {
+            cc++;
+          } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'b':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
+          if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'B':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
+          if (str[cc] == ' ') {
+            cc++;
+          } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case '.':
+      case 'V':
+      case 'v':
+        return FALSE;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        int32_t iSysmbolLen = wsSymbol.GetLength();
+        cc -= iSysmbolLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        bHavePercentSymbol = TRUE;
+      } break;
+      case '8':
+        return FALSE;
+      case ',': {
+        if (cc >= 0) {
+          cc -= iGroupLen - 1;
+          if (cc >= 0 &&
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
+                            iGroupLen) == 0) {
+            cc--;
+          } else {
+            cc += iGroupLen - 1;
+          }
+        }
+        ccf--;
+      } break;
+      case '(':
+        if (str[cc] == L'(') {
+          bNeg = TRUE;
+        } else if (str[cc] != L' ') {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      case ')':
+        if (str[cc] == L')') {
+          bNeg = TRUE;
+        } else if (str[cc] != L' ') {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      default:
+        if (strf[ccf] != str[cc]) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+    }
+  }
+  if (cc >= 0) {
+    return FALSE;
+  }
+  if (!bReverseParse) {
+    ccf = dot_index_f + 1;
+    cc = (dot_index == len) ? len : dot_index + 1;
+    coeff = 0.1;
+    while (cc < len && ccf < lenf) {
+      switch (strf[ccf]) {
+        case '\'': {
+          CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
+          int32_t iLiteralLen = wsLiteral.GetLength();
+          if (cc + iLiteralLen > len ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
+                            iLiteralLen)) {
+            return FALSE;
+          }
+          cc += iLiteralLen;
+          ccf++;
+          break;
+        }
+        case '9':
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          {
+            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+            coeff *= 0.1;
+          }
+          cc++;
+          ccf++;
+          break;
+        case 'z':
+          if (FX_IsDigit(str[cc])) {
+            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+            coeff *= 0.1;
+            cc++;
+          }
+          ccf++;
+          break;
+        case 'Z':
+          if (str[cc] != ' ') {
+            if (FX_IsDigit(str[cc])) {
+              dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
+              coeff *= 0.1;
+              cc++;
+            }
+          } else {
+            cc++;
+          }
+          ccf++;
+          break;
+        case 'S':
+          if (str[cc] == '+' || str[cc] == ' ') {
+            cc++;
+          } else {
+            if (cc + iMinusLen > len ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            bNeg = TRUE;
+            cc += iMinusLen;
+          }
+          ccf++;
+          break;
+        case 's':
+          if (str[cc] == '+') {
+            cc++;
+          } else {
+            if (cc + iMinusLen > len ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            bNeg = TRUE;
+            cc += iMinusLen;
+          }
+          ccf++;
+          break;
+        case 'E': {
+          if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) {
+            return FALSE;
+          }
+          FX_BOOL bExpSign = FALSE;
+          cc++;
+          if (cc < len) {
+            if (str[cc] == '+') {
+              cc++;
+            } else if (str[cc] == '-') {
+              bExpSign = TRUE;
+              cc++;
+            }
+          }
+          while (cc < len) {
+            if (!FX_IsDigit(str[cc])) {
+              break;
+            }
+            iExponent = iExponent * 10 + str[cc] - '0';
+            cc++;
+          }
+          iExponent = bExpSign ? -iExponent : iExponent;
+          ccf++;
+        } break;
+        case '$': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
+                                     wsSymbol);
+          int32_t iSymbolLen = wsSymbol.GetLength();
+          if (cc + iSymbolLen > len ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
+            return FALSE;
+          }
+          cc += iSymbolLen;
+          ccf++;
+        } break;
+        case 'c':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
+            if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'C':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'd':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
+            if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'D':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case '.':
+        case 'V':
+        case 'v':
+          return FALSE;
+        case '%': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+          int32_t iSysmbolLen = wsSymbol.GetLength();
+          if (cc + iSysmbolLen <= len &&
+              !FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol,
+                             iSysmbolLen)) {
+            cc += iSysmbolLen;
+          }
+          ccf++;
+          bHavePercentSymbol = TRUE;
+        } break;
+        case '8': {
+          while (ccf < lenf && strf[ccf] == '8') {
+            ccf++;
+          }
+          while (cc < len && FX_IsDigit(str[cc])) {
+            dbRetValue = (str[cc] - '0') * coeff + dbRetValue;
+            coeff *= 0.1;
+            cc++;
+          }
+        } break;
+        case ',': {
+          if (cc + iGroupLen <= len &&
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
+                            iGroupLen) == 0) {
+            cc += iGroupLen;
+          }
+          ccf++;
+        } break;
+        case '(':
+          if (str[cc] == L'(') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+          break;
+        case ')':
+          if (str[cc] == L')') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+          break;
+        default:
+          if (strf[ccf] != str[cc]) {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+      }
+    }
+    if (cc != len) {
+      return FALSE;
+    }
+  }
+  if (iExponent) {
+    dbRetValue *= FXSYS_pow(10, (FX_FLOAT)iExponent);
+  }
+  if (bHavePercentSymbol) {
+    dbRetValue /= 100.0;
+  }
+  if (bNeg) {
+    dbRetValue = -dbRetValue;
+  }
+  fValue = (FX_FLOAT)dbRetValue;
+  return TRUE;
+}
+void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult) {
+  int32_t iCount = wsNum.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsNum;
+  FX_WCHAR* pDst = wsResult.GetBuffer(iCount);
+  int32_t nIndex = 0;
+  FX_BOOL bMinus = FALSE;
+  int32_t i = 0;
+  for (i = 0; i < iCount; i++) {
+    FX_WCHAR wc = pStr[i];
+    if (wc == '.') {
+      break;
+    }
+    if ((wc == L'0' || wc == L' ' || wc == '+') && nIndex == 0) {
+      continue;
+    }
+    if (wc == '-') {
+      pDst[nIndex++] = wc;
+      bMinus = TRUE;
+      continue;
+    }
+    if (wc == L'0' && nIndex == 1 && bMinus) {
+      continue;
+    }
+    pDst[nIndex++] = wc;
+  }
+  if (bMinus && nIndex == 1) {
+    pDst[nIndex++] = '0';
+  }
+  if (nIndex == 0) {
+    wsResult.ReleaseBuffer(0);
+    pDst = wsResult.GetBuffer(iCount + 1);
+    pDst[nIndex++] = '0';
+  }
+  int32_t j = 0;
+  for (j = iCount - 1; j > i; j--) {
+    FX_WCHAR wc = pStr[j];
+    if (wc != L'0' && wc != L' ') {
+      break;
+    }
+  }
+  if (j > i) {
+    pDst[nIndex++] = '.';
+    FXSYS_wcsncpy(pDst + nIndex, pStr + i + 1, j - i);
+    nIndex += j - i;
+  }
+  wsResult.ReleaseBuffer(nIndex);
+}
+FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum,
+                                   const CFX_WideString& wsPattern,
+                                   CFX_WideString& wsValue) {
+  wsValue.Empty();
+  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t dot_index_f = -1;
+  FX_DWORD dwFormatStyle = 0;
+  CFX_WideString wsNumFormat;
+  IFX_Locale* pLocale =
+      GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
+  if (!pLocale || wsNumFormat.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t iExponent = 0;
+  CFX_WideString wsDotSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  int32_t iGroupLen = wsGroupSymbol.GetLength();
+  CFX_WideString wsMinus;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus);
+  int32_t iMinusLen = wsMinus.GetLength();
+  int cc = 0, ccf = 0;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
+  int len = wsSrcNum.GetLength();
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
+  int lenf = wsNumFormat.GetLength();
+  FX_BOOL bHavePercentSymbol = FALSE;
+  FX_BOOL bNeg = FALSE;
+  FX_BOOL bReverseParse = FALSE;
+  int32_t dot_index = 0;
+  if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) &&
+      (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
+    bReverseParse = TRUE;
+  }
+  bReverseParse = FALSE;
+  ccf = dot_index_f - 1;
+  cc = dot_index - 1;
+  while (ccf >= 0 && cc >= 0) {
+    switch (strf[ccf]) {
+      case '\'': {
+        CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
+        int32_t iLiteralLen = wsLiteral.GetLength();
+        cc -= iLiteralLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      }
+      case '9':
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        wsValue = CFX_WideStringC(str[cc]) + wsValue;
+        cc--;
+        ccf--;
+        break;
+      case 'z':
+        if (FX_IsDigit(str[cc])) {
+          wsValue = CFX_WideStringC(str[cc]) + wsValue;
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'Z':
+        if (str[cc] != ' ') {
+          if (FX_IsDigit(str[cc])) {
+            wsValue = CFX_WideStringC(str[cc]) + wsValue;
+            cc--;
+          }
+        } else {
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'S':
+        if (str[cc] == '+' || str[cc] == ' ') {
+          cc--;
+        } else {
+          cc -= iMinusLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            return FALSE;
+          }
+          cc--;
+          bNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 's':
+        if (str[cc] == '+') {
+          cc--;
+        } else {
+          cc -= iMinusLen - 1;
+          if (cc < 0 ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            return FALSE;
+          }
+          cc--;
+          bNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 'E': {
+        if (cc >= dot_index) {
+          return FALSE;
+        }
+        FX_BOOL bExpSign = FALSE;
+        while (cc >= 0) {
+          if (str[cc] == 'E' || str[cc] == 'e') {
+            break;
+          }
+          if (FX_IsDigit(str[cc])) {
+            iExponent = iExponent + (str[cc] - '0') * 10;
+            cc--;
+            continue;
+          } else if (str[cc] == '+') {
+            cc--;
+            continue;
+          } else if (cc - iMinusLen + 1 > 0 &&
+                     !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
+                                    (const FX_WCHAR*)wsMinus, iMinusLen)) {
+            bExpSign = TRUE;
+            cc -= iMinusLen;
+          } else {
+            return FALSE;
+          }
+        }
+        cc--;
+        iExponent = bExpSign ? -iExponent : iExponent;
+        ccf--;
+      } break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        int32_t iSymbolLen = wsSymbol.GetLength();
+        cc -= iSymbolLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+      } break;
+      case 'r':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
+          if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'R':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
+          if (str[cc] == ' ') {
+            cc++;
+          } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'b':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
+          if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case 'B':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
+          if (str[cc] == ' ') {
+            cc++;
+          } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
+            bNeg = TRUE;
+            cc -= 2;
+          }
+          ccf -= 2;
+        } else {
+          ccf--;
+        }
+        break;
+      case '.':
+      case 'V':
+      case 'v':
+        return FALSE;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        int32_t iSysmbolLen = wsSymbol.GetLength();
+        cc -= iSysmbolLen - 1;
+        if (cc < 0 ||
+            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        bHavePercentSymbol = TRUE;
+      } break;
+      case '8':
+        return FALSE;
+      case ',': {
+        if (cc >= 0) {
+          cc -= iGroupLen - 1;
+          if (cc >= 0 &&
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
+                            iGroupLen) == 0) {
+            cc--;
+          } else {
+            cc += iGroupLen - 1;
+          }
+        }
+        ccf--;
+      } break;
+      case '(':
+        if (str[cc] == L'(') {
+          bNeg = TRUE;
+        } else if (str[cc] != L' ') {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      case ')':
+        if (str[cc] == L')') {
+          bNeg = TRUE;
+        } else if (str[cc] != L' ') {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+        break;
+      default:
+        if (strf[ccf] != str[cc]) {
+          return FALSE;
+        }
+        cc--;
+        ccf--;
+    }
+  }
+  if (cc >= 0) {
+    if (str[cc] == '-') {
+      bNeg = TRUE;
+      cc--;
+    }
+    if (cc >= 0) {
+      return FALSE;
+    }
+  }
+  if (dot_index < len && (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
+    wsValue += '.';
+  }
+  if (!bReverseParse) {
+    ccf = dot_index_f + 1;
+    cc = (dot_index == len) ? len : dot_index + 1;
+    while (cc < len && ccf < lenf) {
+      switch (strf[ccf]) {
+        case '\'': {
+          CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
+          int32_t iLiteralLen = wsLiteral.GetLength();
+          if (cc + iLiteralLen > len ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
+                            iLiteralLen)) {
+            return FALSE;
+          }
+          cc += iLiteralLen;
+          ccf++;
+          break;
+        }
+        case '9':
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          { wsValue += str[cc]; }
+          cc++;
+          ccf++;
+          break;
+        case 'z':
+          if (FX_IsDigit(str[cc])) {
+            wsValue += str[cc];
+            cc++;
+          }
+          ccf++;
+          break;
+        case 'Z':
+          if (str[cc] != ' ') {
+            if (FX_IsDigit(str[cc])) {
+              wsValue += str[cc];
+              cc++;
+            }
+          } else {
+            cc++;
+          }
+          ccf++;
+          break;
+        case 'S':
+          if (str[cc] == '+' || str[cc] == ' ') {
+            cc++;
+          } else {
+            if (cc + iMinusLen > len ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            bNeg = TRUE;
+            cc += iMinusLen;
+          }
+          ccf++;
+          break;
+        case 's':
+          if (str[cc] == '+') {
+            cc++;
+          } else {
+            if (cc + iMinusLen > len ||
+                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
+              return FALSE;
+            }
+            bNeg = TRUE;
+            cc += iMinusLen;
+          }
+          ccf++;
+          break;
+        case 'E': {
+          if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) {
+            return FALSE;
+          }
+          FX_BOOL bExpSign = FALSE;
+          cc++;
+          if (cc < len) {
+            if (str[cc] == '+') {
+              cc++;
+            } else if (str[cc] == '-') {
+              bExpSign = TRUE;
+              cc++;
+            }
+          }
+          while (cc < len) {
+            if (!FX_IsDigit(str[cc])) {
+              break;
+            }
+            iExponent = iExponent * 10 + str[cc] - '0';
+            cc++;
+          }
+          iExponent = bExpSign ? -iExponent : iExponent;
+          ccf++;
+        } break;
+        case '$': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
+                                     wsSymbol);
+          int32_t iSymbolLen = wsSymbol.GetLength();
+          if (cc + iSymbolLen > len ||
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
+            return FALSE;
+          }
+          cc += iSymbolLen;
+          ccf++;
+        } break;
+        case 'c':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
+            if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'C':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'd':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
+            if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case 'D':
+          if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
+            if (str[cc] == ' ') {
+              cc++;
+            } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
+              bNeg = TRUE;
+              cc += 2;
+            }
+            ccf += 2;
+          }
+          break;
+        case '.':
+        case 'V':
+        case 'v':
+          return FALSE;
+        case '%': {
+          CFX_WideString wsSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+          int32_t iSysmbolLen = wsSymbol.GetLength();
+          if (cc + iSysmbolLen <= len &&
+              !FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol,
+                             iSysmbolLen)) {
+            cc += iSysmbolLen;
+          }
+          ccf++;
+          bHavePercentSymbol = TRUE;
+        } break;
+        case '8': {
+          while (ccf < lenf && strf[ccf] == '8') {
+            ccf++;
+          }
+          while (cc < len && FX_IsDigit(str[cc])) {
+            wsValue += str[cc];
+            cc++;
+          }
+        } break;
+        case ',': {
+          if (cc + iGroupLen <= len &&
+              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
+                            iGroupLen) == 0) {
+            cc += iGroupLen;
+          }
+          ccf++;
+        } break;
+        case '(':
+          if (str[cc] == L'(') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+          break;
+        case ')':
+          if (str[cc] == L')') {
+            bNeg = TRUE;
+          } else if (str[cc] != L' ') {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+          break;
+        default:
+          if (strf[ccf] != str[cc]) {
+            return FALSE;
+          }
+          cc++;
+          ccf++;
+      }
+    }
+    if (cc != len) {
+      return FALSE;
+    }
+  }
+  if (iExponent || bHavePercentSymbol) {
+    CFX_Decimal decimal = CFX_Decimal(wsValue);
+    if (iExponent) {
+      decimal = decimal * CFX_Decimal(FXSYS_pow(10, (FX_FLOAT)iExponent));
+    }
+    if (bHavePercentSymbol) {
+      decimal = decimal / CFX_Decimal(100);
+    }
+    wsValue = decimal;
+  }
+  if (bNeg) {
+    wsValue = CFX_WideStringC('-') + wsValue;
+  }
+  return TRUE;
+}
+FX_DATETIMETYPE CFX_FormatString::GetDateTimeFormat(
+    const CFX_WideString& wsPattern,
+    IFX_Locale*& pLocale,
+    CFX_WideString& wsDatePattern,
+    CFX_WideString& wsTimePattern) {
+  pLocale = NULL;
+  CFX_WideString wsTempPattern;
+  FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown;
+  int32_t ccf = 0;
+  int32_t iLenf = wsPattern.GetLength();
+  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
+  int32_t iFindCategory = 0;
+  FX_BOOL bBraceOpen = FALSE;
+  while (ccf < iLenf) {
+    if (pStr[ccf] == '\'') {
+      int32_t iCurChar = ccf;
+      FX_GetLiteralText(pStr, ccf, iLenf);
+      wsTempPattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
+    } else if (!bBraceOpen && iFindCategory != 3 &&
+               FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
+      CFX_WideString wsCategory(pStr[ccf]);
+      ccf++;
+      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
+             pStr[ccf] != '(') {
+        if (pStr[ccf] == 'T') {
+          wsDatePattern = wsPattern.Left(ccf);
+          wsTimePattern = wsPattern.Right(wsPattern.GetLength() - ccf);
+          wsTimePattern.SetAt(0, ' ');
+          if (!pLocale) {
+            pLocale = m_pLocaleMgr->GetDefLocale();
+          }
+          return FX_DATETIMETYPE_DateTime;
+        }
+        wsCategory += pStr[ccf];
+        ccf++;
+      }
+      if (!(iFindCategory & 1) && wsCategory == FX_WSTRC(L"date")) {
+        iFindCategory |= 1;
+        eCategory = FX_LOCALECATEGORY_Date;
+        if (iFindCategory & 2) {
+          iFindCategory = 4;
+        }
+      } else if (!(iFindCategory & 2) && wsCategory == FX_WSTRC(L"time")) {
+        iFindCategory |= 2;
+        eCategory = FX_LOCALECATEGORY_Time;
+      } else if (wsCategory == FX_WSTRC(L"datetime")) {
+        iFindCategory = 3;
+        eCategory = FX_LOCALECATEGORY_DateTime;
+      } else {
+        continue;
+      }
+      while (ccf < iLenf) {
+        if (pStr[ccf] == '(') {
+          ccf++;
+          CFX_WideString wsLCID;
+          while (ccf < iLenf && pStr[ccf] != ')') {
+            wsLCID += pStr[ccf++];
+          }
+          pLocale = GetPatternLocale(wsLCID);
+        } else if (pStr[ccf] == '{') {
+          bBraceOpen = TRUE;
+          break;
+        } else if (pStr[ccf] == '.') {
+          CFX_WideString wsSubCategory;
+          ccf++;
+          while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') {
+            wsSubCategory += pStr[ccf++];
+          }
+          FX_DWORD dwSubHash =
+              FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength());
+          FX_LOCALEDATETIMESUBCATEGORY eSubCategory =
+              FX_LOCALEDATETIMESUBCATEGORY_Medium;
+          for (int32_t i = 0; i < g_iFXLocaleDateTimeSubCatCount; i++) {
+            if (g_FXLocaleDateTimeSubCatData[i].uHash == dwSubHash) {
+              eSubCategory =
+                  (FX_LOCALEDATETIMESUBCATEGORY)g_FXLocaleDateTimeSubCatData[i]
+                      .eSubCategory;
+              break;
+            }
+          }
+          if (!pLocale) {
+            pLocale = m_pLocaleMgr->GetDefLocale();
+          }
+          FXSYS_assert(pLocale != NULL);
+          switch (eCategory) {
+            case FX_LOCALECATEGORY_Date:
+              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
+              wsDatePattern = wsTempPattern + wsDatePattern;
+              break;
+            case FX_LOCALECATEGORY_Time:
+              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
+              wsTimePattern = wsTempPattern + wsTimePattern;
+              break;
+            case FX_LOCALECATEGORY_DateTime:
+              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
+              wsDatePattern = wsTempPattern + wsDatePattern;
+              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
+              break;
+            default:
+              break;
+          }
+          wsTempPattern.Empty();
+          continue;
+        }
+        ccf++;
+      }
+    } else if (pStr[ccf] == '}') {
+      bBraceOpen = FALSE;
+      if (!wsTempPattern.IsEmpty()) {
+        if (eCategory == FX_LOCALECATEGORY_Time) {
+          wsTimePattern = wsTempPattern;
+        } else if (eCategory == FX_LOCALECATEGORY_Date) {
+          wsDatePattern = wsTempPattern;
+        }
+        wsTempPattern.Empty();
+      }
+    } else {
+      wsTempPattern += pStr[ccf];
+    }
+    ccf++;
+  }
+  if (!wsTempPattern.IsEmpty()) {
+    if (eCategory == FX_LOCALECATEGORY_Date) {
+      wsDatePattern += wsTempPattern;
+    } else {
+      wsTimePattern += wsTempPattern;
+    }
+  }
+  if (!pLocale) {
+    pLocale = m_pLocaleMgr->GetDefLocale();
+  }
+  if (!iFindCategory) {
+    wsTimePattern.Empty();
+    wsDatePattern = wsPattern;
+  }
+  return (FX_DATETIMETYPE)iFindCategory;
+}
+static FX_BOOL FX_ParseLocaleDate(const CFX_WideString& wsDate,
+                                  const CFX_WideString& wsDatePattern,
+                                  IFX_Locale* pLocale,
+                                  CFX_Unitime& datetime,
+                                  int32_t& cc) {
+  int32_t year = 1900;
+  int32_t month = 1;
+  int32_t day = 1;
+  int32_t ccf = 0;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsDate;
+  int32_t len = wsDate.GetLength();
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsDatePattern;
+  int32_t lenf = wsDatePattern.GetLength();
+  while (cc < len && ccf < lenf) {
+    if (strf[ccf] == '\'') {
+      CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
+      int32_t iLiteralLen = wsLiteral.GetLength();
+      if (cc + iLiteralLen > len ||
+          FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
+        return FALSE;
+      }
+      cc += iLiteralLen;
+      ccf++;
+      continue;
+    } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) {
+      if (strf[ccf] != str[cc]) {
+        return FALSE;
+      }
+      cc++;
+      ccf++;
+      continue;
+    }
+    FX_DWORD dwSymbolNum = 1;
+    FX_DWORD dwSymbol = strf[ccf++];
+    while (ccf < lenf && strf[ccf] == dwSymbol) {
+      ccf++;
+      dwSymbolNum++;
+    }
+    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
+    if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      day = str[cc++] - '0';
+      if (cc < len && FX_IsDigit(str[cc])) {
+        day = day * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      day = str[cc++] - '0';
+      if (cc < len) {
+        day = day * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) {
+      int i = 0;
+      while (cc < len && i < 3 && FX_IsDigit(str[cc])) {
+        cc++;
+        i++;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) {
+      cc += 3;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      month = str[cc++] - '0';
+      if (cc < len && FX_IsDigit(str[cc])) {
+        month = month * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      month = str[cc++] - '0';
+      if (cc < len) {
+        month = month * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
+      CFX_WideString wsMonthNameAbbr;
+      FX_WORD i = 0;
+      for (; i < 12; i++) {
+        pLocale->GetMonthName(i, wsMonthNameAbbr, TRUE);
+        if (wsMonthNameAbbr.IsEmpty()) {
+          continue;
+        }
+        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsMonthNameAbbr, str + cc,
+                           wsMonthNameAbbr.GetLength())) {
+          break;
+        }
+      }
+      if (i < 12) {
+        cc += wsMonthNameAbbr.GetLength();
+        month = i + 1;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
+      CFX_WideString wsMonthName;
+      FX_WORD i = 0;
+      for (; i < 12; i++) {
+        pLocale->GetMonthName(i, wsMonthName, FALSE);
+        if (wsMonthName.IsEmpty()) {
+          continue;
+        }
+        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsMonthName, str + cc,
+                           wsMonthName.GetLength())) {
+          break;
+        }
+      }
+      if (i < 12) {
+        cc += wsMonthName.GetLength();
+        month = i + 1;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
+      cc += 1;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
+      CFX_WideString wsDayNameAbbr;
+      FX_WORD i = 0;
+      for (; i < 7; i++) {
+        pLocale->GetDayName(i, wsDayNameAbbr, TRUE);
+        if (wsDayNameAbbr.IsEmpty()) {
+          continue;
+        }
+        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsDayNameAbbr, str + cc,
+                           wsDayNameAbbr.GetLength())) {
+          break;
+        }
+      }
+      if (i < 12) {
+        cc += wsDayNameAbbr.GetLength();
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
+      CFX_WideString wsDayName;
+      int32_t i = 0;
+      for (; i < 7; i++) {
+        pLocale->GetDayName(i, wsDayName, FALSE);
+        if (wsDayName == L"") {
+          continue;
+        }
+        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsDayName, str + cc,
+                           wsDayName.GetLength())) {
+          break;
+        }
+      }
+      if (i < 12) {
+        cc += wsDayName.GetLength();
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
+      cc += 1;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
+      cc += 2;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
+      if (cc + 2 > len) {
+        return FALSE;
+      }
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      year = str[cc++] - '0';
+      if (cc >= len || !FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      year = year * 10 + str[cc++] - '0';
+      if (year <= 29) {
+        year += 2000;
+      } else {
+        year += 1900;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) {
+      int i = 0;
+      year = 0;
+      if (cc + 4 > len) {
+        return FALSE;
+      }
+      while (i < 4) {
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        year = year * 10 + str[cc] - '0';
+        cc++;
+        i++;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) {
+      cc += 1;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) {
+      cc += 2;
+    }
+  }
+  if (cc < len) {
+    return FALSE;
+  }
+  CFX_Unitime ut;
+  ut.Set(year, month, day);
+  datetime = datetime + ut;
+  return cc;
+}
+static void FX_ResolveZone(uint8_t& wHour,
+                           uint8_t& wMinute,
+                           FX_TIMEZONE tzDiff,
+                           IFX_Locale* pLocale) {
+  int32_t iMinuteDiff = wHour * 60 + wMinute;
+  FX_TIMEZONE tzLocale;
+  pLocale->GetTimeZone(tzLocale);
+  iMinuteDiff += tzLocale.tzHour * 60 +
+                 (tzLocale.tzHour < 0 ? -tzLocale.tzMinute : tzLocale.tzMinute);
+  iMinuteDiff -= tzDiff.tzHour * 60 +
+                 (tzDiff.tzHour < 0 ? -tzDiff.tzMinute : tzDiff.tzMinute);
+  while (iMinuteDiff > 1440) {
+    iMinuteDiff -= 1440;
+  }
+  while (iMinuteDiff < 0) {
+    iMinuteDiff += 1440;
+  }
+  wHour = iMinuteDiff / 60;
+  wMinute = iMinuteDiff % 60;
+}
+static FX_BOOL FX_ParseLocaleTime(const CFX_WideString& wsTime,
+                                  const CFX_WideString& wsTimePattern,
+                                  IFX_Locale* pLocale,
+                                  CFX_Unitime& datetime,
+                                  int32_t& cc) {
+  uint8_t hour = 0;
+  uint8_t minute = 0;
+  uint8_t second = 0;
+  FX_WORD millisecond = 0;
+  int32_t ccf = 0;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsTime;
+  int len = wsTime.GetLength();
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsTimePattern;
+  int lenf = wsTimePattern.GetLength();
+  FX_BOOL bHasA = FALSE;
+  FX_BOOL bPM = FALSE;
+  while (cc < len && ccf < lenf) {
+    if (strf[ccf] == '\'') {
+      CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
+      int32_t iLiteralLen = wsLiteral.GetLength();
+      if (cc + iLiteralLen > len ||
+          FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
+        return FALSE;
+      }
+      cc += iLiteralLen;
+      ccf++;
+      continue;
+    } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) == -1) {
+      if (strf[ccf] != str[cc]) {
+        return FALSE;
+      }
+      cc++;
+      ccf++;
+      continue;
+    }
+    FX_DWORD dwSymbolNum = 1;
+    FX_DWORD dwSymbol = strf[ccf++];
+    while (ccf < lenf && strf[ccf] == dwSymbol) {
+      ccf++;
+      dwSymbolNum++;
+    }
+    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
+    if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1') ||
+        dwSymbol == FXBSTR_ID(0, 0, 'H', '1') ||
+        dwSymbol == FXBSTR_ID(0, 0, 'h', '1') ||
+        dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      hour = str[cc++] - '0';
+      if (cc < len && FX_IsDigit(str[cc])) {
+        hour = hour * 10 + str[cc++] - '0';
+      }
+      if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1') && hour == 24) {
+        hour = 0;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2') ||
+               dwSymbol == FXBSTR_ID(0, 0, 'H', '2') ||
+               dwSymbol == FXBSTR_ID(0, 0, 'h', '2') ||
+               dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      hour = str[cc++] - '0';
+      if (cc >= len) {
+        return FALSE;
+      }
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      hour = hour * 10 + str[cc++] - '0';
+      if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2') && hour == 24) {
+        hour = 0;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      minute = str[cc++] - '0';
+      if (cc < len && FX_IsDigit(str[cc])) {
+        minute = minute * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      minute = str[cc++] - '0';
+      if (cc >= len) {
+        return FALSE;
+      }
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      minute = minute * 10 + str[cc++] - '0';
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      second = str[cc++] - '0';
+      if (cc < len && FX_IsDigit(str[cc])) {
+        second = second * 10 + str[cc++] - '0';
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      second = str[cc++] - '0';
+      if (cc >= len) {
+        return FALSE;
+      }
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      second = second * 10 + str[cc++] - '0';
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) {
+      if (cc + 3 >= len) {
+        return FALSE;
+      }
+      int i = 0;
+      while (i < 3) {
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        millisecond = millisecond * 10 + str[cc++] - '0';
+        i++;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
+      CFX_WideString wsAM;
+      pLocale->GetMeridiemName(wsAM, TRUE);
+      CFX_WideString wsPM;
+      pLocale->GetMeridiemName(wsPM, FALSE);
+      if ((cc + wsAM.GetLength() <= len) &&
+          (CFX_WideStringC(str + cc, wsAM.GetLength()) == wsAM)) {
+        cc += wsAM.GetLength();
+        bHasA = TRUE;
+      } else if ((cc + wsPM.GetLength() <= len) &&
+                 (CFX_WideStringC(str + cc, wsPM.GetLength()) == wsPM)) {
+        cc += wsPM.GetLength();
+        bHasA = TRUE;
+        bPM = TRUE;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
+      if (cc + 3 > len) {
+        continue;
+      }
+      FX_DWORD dwHash = str[cc++];
+      dwHash = (dwHash << 8) | str[cc++];
+      dwHash = (dwHash << 8) | str[cc++];
+      if (dwHash == FXBSTR_ID(0, 'G', 'M', 'T')) {
+        FX_TIMEZONE tzDiff;
+        tzDiff.tzHour = 0;
+        tzDiff.tzMinute = 0;
+        if (cc < len && (str[cc] == '-' || str[cc] == '+')) {
+          cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
+        }
+        FX_ResolveZone(hour, minute, tzDiff, pLocale);
+      } else {
+        const FX_LOCALETIMEZONEINFO* pEnd =
+            g_FXLocaleTimeZoneData + FX_ArraySize(g_FXLocaleTimeZoneData);
+        const FX_LOCALETIMEZONEINFO* pTimeZoneInfo =
+            std::lower_bound(g_FXLocaleTimeZoneData, pEnd, dwHash,
+                             [](const FX_LOCALETIMEZONEINFO& info,
+                                FX_DWORD hash) { return info.uHash < hash; });
+        if (pTimeZoneInfo < pEnd && dwHash == pTimeZoneInfo->uHash) {
+          hour += pTimeZoneInfo->iHour;
+          minute += pTimeZoneInfo->iHour > 0 ? pTimeZoneInfo->iMinute
+                                             : -pTimeZoneInfo->iMinute;
+        }
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
+      if (str[cc] != 'Z') {
+        FX_TIMEZONE tzDiff;
+        cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
+        FX_ResolveZone(hour, minute, tzDiff, pLocale);
+      } else {
+        cc++;
+      }
+    }
+  }
+  if (bHasA) {
+    if (bPM) {
+      hour += 12;
+      if (hour == 24) {
+        hour = 12;
+      }
+    } else {
+      if (hour == 12) {
+        hour = 0;
+      }
+    }
+  }
+  CFX_Unitime ut;
+  ut.Set(0, 0, 0, hour, minute, second, millisecond);
+  datetime = datetime + ut;
+  return cc;
+}
+FX_BOOL CFX_FormatString::ParseDateTime(const CFX_WideString& wsSrcDateTime,
+                                        const CFX_WideString& wsPattern,
+                                        FX_DATETIMETYPE eDateTimeType,
+                                        CFX_Unitime& dtValue) {
+  dtValue.Set(0);
+  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsDatePattern, wsTimePattern;
+  IFX_Locale* pLocale = NULL;
+  FX_DATETIMETYPE eCategory =
+      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+  if (!pLocale) {
+    return FALSE;
+  }
+  if (eCategory == FX_DATETIMETYPE_Unknown) {
+    eCategory = eDateTimeType;
+  }
+  if (eCategory == FX_DATETIMETYPE_Unknown) {
+    return FALSE;
+  }
+  if (eCategory == FX_DATETIMETYPE_TimeDate) {
+    int32_t iStart = 0;
+    if (!FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
+                            iStart)) {
+      return FALSE;
+    }
+    if (!FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
+                            iStart)) {
+      return FALSE;
+    }
+  } else {
+    int32_t iStart = 0;
+    if ((eCategory & FX_DATETIMETYPE_Date) &&
+        !FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
+                            iStart)) {
+      return FALSE;
+    }
+    if ((eCategory & FX_DATETIMETYPE_Time) &&
+        !FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
+                            iStart)) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CFX_FormatString::ParseZero(const CFX_WideString& wsSrcText,
+                                    const CFX_WideString& wsPattern) {
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat);
+  int32_t iText = 0, iPattern = 0;
+  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
+  int32_t iLenText = wsSrcText.GetLength();
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern && iText < iLenText) {
+    if (pStrPattern[iPattern] == '\'') {
+      CFX_WideString wsLiteral =
+          FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      int32_t iLiteralLen = wsLiteral.GetLength();
+      if (iText + iLiteralLen > iLenText ||
+          FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
+                        iLiteralLen)) {
+        return FALSE;
+      }
+      iText += iLiteralLen;
+      iPattern++;
+      continue;
+    } else if (pStrPattern[iPattern] != pStrText[iText]) {
+      return FALSE;
+    } else {
+      iText++;
+      iPattern++;
+    }
+  }
+  return iPattern == iLenPattern && iText == iLenText;
+}
+FX_BOOL CFX_FormatString::ParseNull(const CFX_WideString& wsSrcText,
+                                    const CFX_WideString& wsPattern) {
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat);
+  int32_t iText = 0, iPattern = 0;
+  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
+  int32_t iLenText = wsSrcText.GetLength();
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern && iText < iLenText) {
+    if (pStrPattern[iPattern] == '\'') {
+      CFX_WideString wsLiteral =
+          FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      int32_t iLiteralLen = wsLiteral.GetLength();
+      if (iText + iLiteralLen > iLenText ||
+          FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
+                        iLiteralLen)) {
+        return FALSE;
+      }
+      iText += iLiteralLen;
+      iPattern++;
+      continue;
+    } else if (pStrPattern[iPattern] != pStrText[iText]) {
+      return FALSE;
+    } else {
+      iText++;
+      iPattern++;
+    }
+  }
+  return iPattern == iLenPattern && iText == iLenText;
+}
+FX_BOOL CFX_FormatString::FormatText(const CFX_WideString& wsSrcText,
+                                     const CFX_WideString& wsPattern,
+                                     CFX_WideString& wsOutput) {
+  if (wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t iLenText = wsSrcText.GetLength();
+  if (iLenText == 0) {
+    return FALSE;
+  }
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat);
+  int32_t iText = 0, iPattern = 0;
+  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern) {
+    switch (pStrPattern[iPattern]) {
+      case '\'': {
+        wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+        iPattern++;
+        break;
+      }
+      case 'A':
+        if (iText >= iLenText || !FX_IsAlpha(pStrText[iText])) {
+          return FALSE;
+        }
+        wsOutput += pStrText[iText++];
+        iPattern++;
+        break;
+      case 'X':
+        if (iText >= iLenText) {
+          return FALSE;
+        }
+        wsOutput += pStrText[iText++];
+        iPattern++;
+        break;
+      case 'O':
+      case '0':
+        if (iText >= iLenText ||
+            (!FX_IsDigit(pStrText[iText]) && !FX_IsAlpha(pStrText[iText]))) {
+          return FALSE;
+        }
+        wsOutput += pStrText[iText++];
+        iPattern++;
+        break;
+      case '9':
+        if (iText >= iLenText || !FX_IsDigit(pStrText[iText])) {
+          return FALSE;
+        }
+        wsOutput += pStrText[iText++];
+        iPattern++;
+        break;
+      default:
+        wsOutput += pStrPattern[iPattern++];
+        break;
+    }
+  }
+  return iText == iLenText;
+}
+static int32_t FX_GetNumTrailingLimit(const CFX_WideString& wsFormat,
+                                      int iDotPos,
+                                      FX_BOOL& bTrimTailZeros) {
+  if (iDotPos < 0) {
+    return 0;
+  }
+  int32_t iCount = wsFormat.GetLength();
+  int32_t iTreading = 0;
+  for (iDotPos++; iDotPos < iCount; iDotPos++) {
+    FX_WCHAR wc = wsFormat[iDotPos];
+    if (wc == L'z' || wc == L'9' || wc == 'Z') {
+      iTreading++;
+      bTrimTailZeros = (wc == L'9' ? FALSE : TRUE);
+    }
+  }
+  return iTreading;
+}
+FX_BOOL CFX_FormatString::FormatStrNum(const CFX_WideStringC& wsInputNum,
+                                       const CFX_WideString& wsPattern,
+                                       CFX_WideString& wsOutput) {
+  if (wsInputNum.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t dot_index_f = -1;
+  FX_DWORD dwNumStyle = 0;
+  CFX_WideString wsNumFormat;
+  IFX_Locale* pLocale =
+      GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat);
+  if (!pLocale || wsNumFormat.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t cc = 0, ccf = 0;
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
+  int lenf = wsNumFormat.GetLength();
+  CFX_WideString wsSrcNum = wsInputNum;
+  wsSrcNum.TrimLeft('0');
+  if (wsSrcNum.IsEmpty() || wsSrcNum[0] == '.') {
+    wsSrcNum.Insert(0, '0');
+  }
+  CFX_Decimal decimal = CFX_Decimal(wsSrcNum);
+  if (dwNumStyle & FX_NUMSTYLE_Percent) {
+    decimal = decimal * CFX_Decimal(100);
+    wsSrcNum = decimal;
+  }
+  int32_t exponent = 0;
+  if (dwNumStyle & FX_NUMSTYLE_Exponent) {
+    int fixed_count = 0;
+    while (ccf < dot_index_f) {
+      switch (strf[ccf]) {
+        case '\'':
+          FX_GetLiteralText(strf, ccf, dot_index_f);
+          break;
+        case '9':
+        case 'z':
+        case 'Z':
+          fixed_count++;
+          break;
+      }
+      ccf++;
+    }
+    int threshold = 1;
+    while (fixed_count > 1) {
+      threshold *= 10;
+      fixed_count--;
+    }
+    if (decimal != CFX_Decimal(0)) {
+      if (decimal < CFX_Decimal(threshold)) {
+        decimal = decimal * CFX_Decimal(10);
+        exponent = -1;
+        while (decimal < CFX_Decimal(threshold)) {
+          decimal = decimal * CFX_Decimal(10);
+          exponent -= 1;
+        }
+      } else if (decimal > CFX_Decimal(threshold)) {
+        threshold *= 10;
+        while (decimal > CFX_Decimal(threshold)) {
+          decimal = decimal / CFX_Decimal(10);
+          exponent += 1;
+        }
+      }
+    }
+  }
+  FX_BOOL bTrimTailZeros = FALSE;
+  int32_t iTreading =
+      FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros);
+  int32_t scale = decimal.GetScale();
+  if (iTreading < scale) {
+    decimal.SetScale(iTreading);
+    wsSrcNum = decimal;
+  }
+  if (bTrimTailZeros && scale > 0 && iTreading > 0) {
+    wsSrcNum.TrimRight(L"0");
+    wsSrcNum.TrimRight(L".");
+  }
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  FX_BOOL bNeg = FALSE;
+  if (wsSrcNum[0] == '-') {
+    bNeg = TRUE;
+    wsSrcNum.Delete(0, 1);
+  }
+  FX_BOOL bAddNeg = FALSE;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
+  int len = wsSrcNum.GetLength();
+  int dot_index = wsSrcNum.Find('.');
+  if (dot_index == -1) {
+    dot_index = len;
+  }
+  ccf = dot_index_f - 1;
+  cc = dot_index - 1;
+  while (ccf >= 0) {
+    switch (strf[ccf]) {
+      case '9':
+        if (cc >= 0) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          cc--;
+        } else {
+          wsOutput = CFX_WideStringC(L'0') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 'z':
+        if (cc >= 0) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          if (str[0] != '0') {
+            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          }
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'Z':
+        if (cc >= 0) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          if (str[0] == '0') {
+            wsOutput = CFX_WideStringC(L' ') + wsOutput;
+          } else {
+            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          }
+          cc--;
+        } else {
+          wsOutput = CFX_WideStringC(L' ') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 'S':
+        if (bNeg) {
+          CFX_WideString wsMinusSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
+          wsOutput = wsMinusSymbol + wsOutput;
+          bAddNeg = TRUE;
+        } else {
+          wsOutput = CFX_WideStringC(L' ') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 's':
+        if (bNeg) {
+          CFX_WideString wsMinusSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
+          wsOutput = wsMinusSymbol + wsOutput;
+          bAddNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 'E': {
+        CFX_WideString wsExp;
+        wsExp.Format(L"E%+d", exponent);
+        wsOutput = wsExp + wsOutput;
+      }
+        ccf--;
+        break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        wsOutput = wsSymbol + wsOutput;
+      }
+        ccf--;
+        break;
+      case 'r':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
+          if (bNeg) {
+            wsOutput = L"CR" + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'R':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
+          if (bNeg) {
+            wsOutput = L"CR" + wsOutput;
+          } else {
+            wsOutput = L"  " + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'b':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
+          if (bNeg) {
+            wsOutput = L"db" + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'B':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
+          if (bNeg) {
+            wsOutput = L"DB" + wsOutput;
+          } else {
+            wsOutput = L"  " + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        wsOutput = wsSymbol + wsOutput;
+      }
+        ccf--;
+        break;
+      case ',':
+        if (cc >= 0) {
+          wsOutput = wsGroupSymbol + wsOutput;
+        }
+        ccf--;
+        break;
+      case '(':
+        if (bNeg) {
+          wsOutput = L"(" + wsOutput;
+        } else {
+          wsOutput = L" " + wsOutput;
+        }
+        bAddNeg = TRUE;
+        ccf--;
+        break;
+      case ')':
+        if (bNeg) {
+          wsOutput = L")" + wsOutput;
+        } else {
+          wsOutput = L" " + wsOutput;
+        }
+        ccf--;
+        break;
+      case '\'':
+        wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput;
+        ccf--;
+        break;
+      default:
+        wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput;
+        ccf--;
+    }
+  }
+  if (cc >= 0) {
+    int nPos = dot_index % 3;
+    wsOutput.Empty();
+    for (int32_t i = 0; i < dot_index; i++) {
+      if (i % 3 == nPos && i != 0) {
+        wsOutput += wsGroupSymbol;
+      }
+      wsOutput += wsSrcNum[i];
+    }
+    if (dot_index < len) {
+      CFX_WideString wsSymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
+      wsOutput += wsSymbol;
+      wsOutput += wsSrcNum.Right(len - dot_index - 1);
+    }
+    if (bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+    return FALSE;
+  }
+  if (dot_index_f == wsNumFormat.GetLength()) {
+    if (!bAddNeg && bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+    return TRUE;
+  }
+  CFX_WideString wsDotSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
+  if (strf[dot_index_f] == 'V') {
+    wsOutput += wsDotSymbol;
+  } else if (strf[dot_index_f] == '.') {
+    if (dot_index < len) {
+      wsOutput += wsDotSymbol;
+    } else {
+      if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') {
+        wsOutput += wsDotSymbol;
+      }
+    }
+  }
+  ccf = dot_index_f + 1;
+  cc = dot_index + 1;
+  while (ccf < lenf) {
+    switch (strf[ccf]) {
+      case '\'':
+        wsOutput += FX_GetLiteralText(strf, ccf, lenf);
+        ccf++;
+        break;
+      case '9':
+        if (cc < len) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          wsOutput += str[cc];
+          cc++;
+        } else {
+          wsOutput += L'0';
+        }
+        ccf++;
+        break;
+      case 'z':
+        if (cc < len) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          wsOutput += str[cc];
+          cc++;
+        }
+        ccf++;
+        break;
+      case 'Z':
+        if (cc < len) {
+          if (!FX_IsDigit(str[cc])) {
+            return FALSE;
+          }
+          wsOutput += str[cc];
+          cc++;
+        } else {
+          wsOutput += L'0';
+        }
+        ccf++;
+        break;
+      case 'E': {
+        CFX_WideString wsExp;
+        wsExp.Format(L"E%+d", exponent);
+        wsOutput += wsExp;
+      }
+        ccf++;
+        break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        wsOutput += wsSymbol;
+      }
+        ccf++;
+        break;
+      case 'c':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
+          if (bNeg) {
+            wsOutput += L"CR";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'C':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
+          if (bNeg) {
+            wsOutput += L"CR";
+          } else {
+            wsOutput += L"  ";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'd':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
+          if (bNeg) {
+            wsOutput += L"db";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'D':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
+          if (bNeg) {
+            wsOutput += L"DB";
+          } else {
+            wsOutput += L"  ";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        wsOutput += wsSymbol;
+      }
+        ccf++;
+        break;
+      case '8': {
+        while (ccf < lenf && strf[ccf] == '8') {
+          ccf++;
+        }
+        while (cc < len && FX_IsDigit(str[cc])) {
+          wsOutput += str[cc];
+          cc++;
+        }
+      } break;
+      case ',':
+        wsOutput += wsGroupSymbol;
+        ccf++;
+        break;
+      case '(':
+        if (bNeg) {
+          wsOutput += '(';
+        } else {
+          wsOutput += ' ';
+        }
+        bAddNeg = TRUE;
+        ccf++;
+        break;
+      case ')':
+        if (bNeg) {
+          wsOutput += ')';
+        } else {
+          wsOutput += ' ';
+        }
+        ccf++;
+        break;
+      default:
+        ccf++;
+    }
+  }
+  if (!bAddNeg && bNeg) {
+    CFX_WideString wsMinusymbol;
+    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+    wsOutput =
+        wsMinusymbol + wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1);
+  }
+  return TRUE;
+}
+FX_BOOL CFX_FormatString::FormatLCNumeric(CFX_LCNumeric& lcNum,
+                                          const CFX_WideString& wsPattern,
+                                          CFX_WideString& wsOutput) {
+  int32_t dot_index_f = -1;
+  FX_DWORD dwNumStyle = 0;
+  CFX_WideString wsNumFormat;
+  IFX_Locale* pLocale =
+      GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat);
+  if (!pLocale || wsNumFormat.IsEmpty()) {
+    return FALSE;
+  }
+  int32_t cc = 0, ccf = 0;
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
+  int lenf = wsNumFormat.GetLength();
+  double dbOrgRaw = lcNum.GetDouble();
+  double dbRetValue = dbOrgRaw;
+  if (dwNumStyle & FX_NUMSTYLE_Percent) {
+    dbRetValue *= 100;
+  }
+  int32_t exponent = 0;
+  if (dwNumStyle & FX_NUMSTYLE_Exponent) {
+    int fixed_count = 0;
+    while (ccf < dot_index_f) {
+      switch (strf[ccf]) {
+        case '\'':
+          FX_GetLiteralText(strf, ccf, dot_index_f);
+          break;
+        case '9':
+        case 'z':
+        case 'Z':
+          fixed_count++;
+          break;
+      }
+      ccf++;
+    }
+    int threshold = 1;
+    while (fixed_count > 1) {
+      threshold *= 10;
+      fixed_count--;
+    }
+    if (dbRetValue != 0) {
+      if (dbRetValue < threshold) {
+        dbRetValue *= 10;
+        exponent = -1;
+        while (dbRetValue < threshold) {
+          dbRetValue *= 10;
+          exponent -= 1;
+        }
+      } else if (dbRetValue > threshold) {
+        threshold *= 10;
+        while (dbRetValue > threshold) {
+          dbRetValue /= 10;
+          exponent += 1;
+        }
+      }
+    }
+  }
+  if (dwNumStyle & (FX_NUMSTYLE_Percent | FX_NUMSTYLE_Exponent)) {
+    lcNum = CFX_LCNumeric(dbRetValue);
+  }
+  FX_BOOL bTrimTailZeros = FALSE;
+  int32_t iTreading =
+      FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros);
+  CFX_WideString wsNumeric = lcNum.ToString(iTreading, bTrimTailZeros);
+  if (wsNumeric.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  FX_BOOL bNeg = FALSE;
+  if (wsNumeric[0] == '-') {
+    bNeg = TRUE;
+    wsNumeric.Delete(0, 1);
+  }
+  FX_BOOL bAddNeg = FALSE;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsNumeric;
+  int len = wsNumeric.GetLength();
+  int dot_index = wsNumeric.Find('.');
+  if (dot_index == -1) {
+    dot_index = len;
+  }
+  ccf = dot_index_f - 1;
+  cc = dot_index - 1;
+  while (ccf >= 0) {
+    switch (strf[ccf]) {
+      case '9':
+        if (cc >= 0) {
+          wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          cc--;
+        } else {
+          wsOutput = CFX_WideStringC(L'0') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 'z':
+        if (cc >= 0) {
+          if (lcNum.m_Integral != 0) {
+            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          }
+          cc--;
+        }
+        ccf--;
+        break;
+      case 'Z':
+        if (cc >= 0) {
+          if (lcNum.m_Integral == 0) {
+            wsOutput = CFX_WideStringC(L' ') + wsOutput;
+          } else {
+            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
+          }
+          cc--;
+        } else {
+          wsOutput = CFX_WideStringC(L' ') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 'S':
+        if (bNeg) {
+          CFX_WideString wsMinusSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
+          wsOutput = wsMinusSymbol + wsOutput;
+          bAddNeg = TRUE;
+        } else {
+          wsOutput = CFX_WideStringC(L' ') + wsOutput;
+        }
+        ccf--;
+        break;
+      case 's':
+        if (bNeg) {
+          CFX_WideString wsMinusSymbol;
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
+          wsOutput = wsMinusSymbol + wsOutput;
+          bAddNeg = TRUE;
+        }
+        ccf--;
+        break;
+      case 'E': {
+        CFX_WideString wsExp;
+        wsExp.Format(L"E%+d", exponent);
+        wsOutput = wsExp + wsOutput;
+      }
+        ccf--;
+        break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        wsOutput = wsSymbol + wsOutput;
+      }
+        ccf--;
+        break;
+      case 'r':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
+          if (bNeg) {
+            wsOutput = L"CR" + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'R':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
+          if (bNeg) {
+            wsOutput = L"CR" + wsOutput;
+          } else {
+            wsOutput = L"  " + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'b':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
+          if (bNeg) {
+            wsOutput = L"db" + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'B':
+        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
+          if (bNeg) {
+            wsOutput = L"DB" + wsOutput;
+          } else {
+            wsOutput = L"  " + wsOutput;
+          }
+          ccf -= 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        wsOutput = wsSymbol + wsOutput;
+      }
+        ccf--;
+        break;
+      case ',':
+        if (cc >= 0) {
+          wsOutput = wsGroupSymbol + wsOutput;
+        }
+        ccf--;
+        break;
+      case '(':
+        if (bNeg) {
+          wsOutput = L"(" + wsOutput;
+        } else {
+          wsOutput = L" " + wsOutput;
+        }
+        bAddNeg = TRUE;
+        ccf--;
+        break;
+      case ')':
+        if (bNeg) {
+          wsOutput = L")" + wsOutput;
+        } else {
+          wsOutput = L" " + wsOutput;
+        }
+        ccf--;
+        break;
+      case '\'':
+        wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput;
+        ccf--;
+        break;
+      default:
+        wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput;
+        ccf--;
+    }
+  }
+  if (cc >= 0) {
+    int nPos = dot_index % 3;
+    wsOutput.Empty();
+    for (int32_t i = 0; i < dot_index; i++) {
+      if (i % 3 == nPos && i != 0) {
+        wsOutput += wsGroupSymbol;
+      }
+      wsOutput += wsNumeric[i];
+    }
+    if (dot_index < len) {
+      CFX_WideString wsSymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
+      wsOutput += wsSymbol;
+      wsOutput += wsNumeric.Right(len - dot_index - 1);
+    }
+    if (bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+    return FALSE;
+  }
+  if (dot_index_f == wsNumFormat.GetLength()) {
+    if (!bAddNeg && bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+    return TRUE;
+  }
+  CFX_WideString wsDotSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
+  if (strf[dot_index_f] == 'V') {
+    wsOutput += wsDotSymbol;
+  } else if (strf[dot_index_f] == '.') {
+    if (dot_index < len) {
+      wsOutput += wsDotSymbol;
+    } else {
+      if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') {
+        wsOutput += wsDotSymbol;
+      }
+    }
+  }
+  ccf = dot_index_f + 1;
+  cc = dot_index + 1;
+  while (ccf < lenf) {
+    switch (strf[ccf]) {
+      case '\'':
+        wsOutput += FX_GetLiteralText(strf, ccf, lenf);
+        ccf++;
+        break;
+      case '9':
+        if (cc < len) {
+          wsOutput += str[cc];
+          cc++;
+        } else {
+          wsOutput += L'0';
+        }
+        ccf++;
+        break;
+      case 'z':
+        if (cc < len) {
+          wsOutput += str[cc];
+          cc++;
+        }
+        ccf++;
+        break;
+      case 'Z':
+        if (cc < len) {
+          wsOutput += str[cc];
+          cc++;
+        } else {
+          wsOutput += L'0';
+        }
+        ccf++;
+        break;
+      case 'E': {
+        CFX_WideString wsExp;
+        wsExp.Format(L"E%+d", exponent);
+        wsOutput += wsExp;
+      }
+        ccf++;
+        break;
+      case '$': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        wsOutput += wsSymbol;
+      }
+        ccf++;
+        break;
+      case 'c':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
+          if (bNeg) {
+            wsOutput += L"CR";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'C':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
+          if (bNeg) {
+            wsOutput += L"CR";
+          } else {
+            wsOutput += L"  ";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'd':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
+          if (bNeg) {
+            wsOutput += L"db";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case 'D':
+        if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
+          if (bNeg) {
+            wsOutput += L"DB";
+          } else {
+            wsOutput += L"  ";
+          }
+          ccf += 2;
+          bAddNeg = TRUE;
+        }
+        break;
+      case '%': {
+        CFX_WideString wsSymbol;
+        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        wsOutput += wsSymbol;
+      }
+        ccf++;
+        break;
+      case '8': {
+        while (ccf < lenf && strf[ccf] == '8') {
+          ccf++;
+        }
+        while (cc < len && FX_IsDigit(str[cc])) {
+          wsOutput += str[cc];
+          cc++;
+        }
+      } break;
+      case ',':
+        wsOutput += wsGroupSymbol;
+        ccf++;
+        break;
+      case '(':
+        if (bNeg) {
+          wsOutput += '(';
+        } else {
+          wsOutput += ' ';
+        }
+        bAddNeg = TRUE;
+        ccf++;
+        break;
+      case ')':
+        if (bNeg) {
+          wsOutput += ')';
+        } else {
+          wsOutput += ' ';
+        }
+        ccf++;
+        break;
+      default:
+        ccf++;
+    }
+  }
+  if (!bAddNeg && bNeg) {
+    CFX_WideString wsMinusymbol;
+    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+    wsOutput =
+        wsOutput[0] + wsMinusymbol + wsOutput.Mid(1, wsOutput.GetLength() - 1);
+  }
+  return TRUE;
+}
+FX_BOOL CFX_FormatString::FormatNum(const CFX_WideString& wsSrcNum,
+                                    const CFX_WideString& wsPattern,
+                                    CFX_WideString& wsOutput) {
+  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  return FormatStrNum(wsSrcNum, wsPattern, wsOutput);
+}
+FX_BOOL CFX_FormatString::FormatNum(FX_FLOAT fNum,
+                                    const CFX_WideString& wsPattern,
+                                    CFX_WideString& wsOutput) {
+  if (wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_LCNumeric lcNum(fNum);
+  return FormatLCNumeric(lcNum, wsPattern, wsOutput);
+}
+FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate,
+                             CFX_Unitime& datetime) {
+  int32_t year = 1900;
+  int32_t month = 1;
+  int32_t day = 1;
+  FX_WORD wYear = 0;
+  int cc_start = 0, cc = 0;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsDate;
+  int len = wsDate.GetLength();
+  if (len > 10) {
+    return FALSE;
+  }
+  while (cc < len && cc < 4) {
+    if (!FX_IsDigit(str[cc])) {
+      return FALSE;
+    }
+    wYear = wYear * 10 + str[cc++] - '0';
+  }
+  year = wYear;
+  if (cc < 4 || wYear < 1900) {
+    return FALSE;
+  }
+  if (cc < len) {
+    if (str[cc] == '-') {
+      cc++;
+    }
+    cc_start = cc;
+    uint8_t tmpM = 0;
+    while (cc < len && cc < cc_start + 2) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      tmpM = tmpM * 10 + str[cc++] - '0';
+    }
+    month = tmpM;
+    if (cc == cc_start + 1 || tmpM > 12 || tmpM < 1) {
+      return FALSE;
+    }
+    if (cc < len) {
+      if (str[cc] == '-') {
+        cc++;
+      }
+      uint8_t tmpD = 0;
+      cc_start = cc;
+      while (cc < len && cc < cc_start + 2) {
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        tmpD = tmpD * 10 + str[cc++] - '0';
+      }
+      day = tmpD;
+      if (tmpD < 1) {
+        return FALSE;
+      }
+      if ((tmpM == 1 || tmpM == 3 || tmpM == 5 || tmpM == 7 || tmpM == 8 ||
+           tmpM == 10 || tmpM == 12) &&
+          tmpD > 31) {
+        return FALSE;
+      }
+      if ((tmpM == 4 || tmpM == 6 || tmpM == 9 || tmpM == 11) && tmpD > 30) {
+        return FALSE;
+      }
+      FX_BOOL iLeapYear;
+      if ((wYear % 4 == 0 && wYear % 100 != 0) || wYear % 400 == 0) {
+        iLeapYear = TRUE;
+      } else {
+        iLeapYear = FALSE;
+      }
+      if ((iLeapYear && tmpM == 2 && tmpD > 29) ||
+          (!iLeapYear && tmpM == 2 && tmpD > 28)) {
+        return FALSE;
+      }
+    }
+  }
+  CFX_Unitime ut;
+  ut.Set(year, month, day);
+  datetime = datetime + ut;
+  return TRUE;
+}
+FX_BOOL FX_TimeFromCanonical(const CFX_WideStringC& wsTime,
+                             CFX_Unitime& datetime,
+                             IFX_Locale* pLocale) {
+  if (wsTime.GetLength() == 0) {
+    return FALSE;
+  }
+  uint8_t hour = 0;
+  uint8_t minute = 0;
+  uint8_t second = 0;
+  FX_WORD millisecond = 0;
+  int cc_start = 0, cc = cc_start;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsTime.GetPtr();
+  int len = wsTime.GetLength();
+  while (cc < len && cc < 2) {
+    if (!FX_IsDigit(str[cc])) {
+      return FALSE;
+    }
+    hour = hour * 10 + str[cc++] - '0';
+  }
+  if (cc < 2 || hour >= 24) {
+    return FALSE;
+  }
+  if (cc < len) {
+    if (str[cc] == ':') {
+      cc++;
+    }
+    cc_start = cc;
+    while (cc < len && cc < cc_start + 2) {
+      if (!FX_IsDigit(str[cc])) {
+        return FALSE;
+      }
+      minute = minute * 10 + str[cc++] - '0';
+    }
+    if (cc == cc_start + 1 || minute >= 60) {
+      return FALSE;
+    }
+    if (cc < len) {
+      if (str[cc] == ':') {
+        cc++;
+      }
+      cc_start = cc;
+      while (cc < len && cc < cc_start + 2) {
+        if (!FX_IsDigit(str[cc])) {
+          return FALSE;
+        }
+        second = second * 10 + str[cc++] - '0';
+      }
+      if (cc == cc_start + 1 || second >= 60) {
+        return FALSE;
+      }
+      if (cc < len) {
+        if (str[cc] == '.') {
+          cc++;
+          cc_start = cc;
+          while (cc < len && cc < cc_start + 3) {
+            if (!FX_IsDigit(str[cc])) {
+              return FALSE;
+            }
+            millisecond = millisecond * 10 + str[cc++] - '0';
+          }
+          if (cc < cc_start + 3 || millisecond >= 1000) {
+            return FALSE;
+          }
+        }
+        if (cc < len) {
+          FX_TIMEZONE tzDiff;
+          tzDiff.tzHour = 0;
+          tzDiff.tzMinute = 0;
+          if (str[cc] != 'Z') {
+            cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
+          }
+          FX_ResolveZone(hour, minute, tzDiff, pLocale);
+        }
+      }
+    }
+  }
+  CFX_Unitime ut;
+  ut.Set(0, 0, 0, hour, minute, second, millisecond);
+  datetime = datetime + ut;
+  return TRUE;
+}
+static FX_WORD FX_GetSolarMonthDays(FX_WORD year, FX_WORD month) {
+  if (month % 2) {
+    return 31;
+  } else if (month == 2) {
+    return FX_IsLeapYear(year) ? 29 : 28;
+  }
+  return 30;
+}
+static FX_WORD FX_GetWeekDay(FX_WORD year, FX_WORD month, FX_WORD day) {
+  FX_WORD g_month_day[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
+  FX_WORD nDays =
+      (year - 1) % 7 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
+  nDays += g_month_day[month - 1] + day;
+  if (FX_IsLeapYear(year) && month > 2) {
+    nDays++;
+  }
+  return nDays % 7;
+}
+static FX_WORD FX_GetWeekOfMonth(FX_WORD year, FX_WORD month, FX_WORD day) {
+  FX_WORD week_day = FX_GetWeekDay(year, month, 1);
+  FX_WORD week_index = 0;
+  week_index += day / 7;
+  day = day % 7;
+  if (week_day + day > 7) {
+    week_index++;
+  }
+  return week_index;
+}
+static FX_WORD FX_GetWeekOfYear(FX_WORD year, FX_WORD month, FX_WORD day) {
+  FX_WORD nDays = 0;
+  for (FX_WORD i = 1; i < month; i++) {
+    nDays += FX_GetSolarMonthDays(year, i);
+  }
+  nDays += day;
+  FX_WORD week_day = FX_GetWeekDay(year, 1, 1);
+  FX_WORD week_index = 1;
+  week_index += nDays / 7;
+  nDays = nDays % 7;
+  if (week_day + nDays > 7) {
+    week_index++;
+  }
+  return week_index;
+}
+static FX_BOOL FX_DateFormat(const CFX_WideString& wsDatePattern,
+                             IFX_Locale* pLocale,
+                             const CFX_Unitime& datetime,
+                             CFX_WideString& wsResult) {
+  FX_BOOL bRet = TRUE;
+  int32_t year = datetime.GetYear();
+  uint8_t month = datetime.GetMonth();
+  uint8_t day = datetime.GetDay();
+  int32_t ccf = 0;
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsDatePattern;
+  int32_t lenf = wsDatePattern.GetLength();
+  while (ccf < lenf) {
+    if (strf[ccf] == '\'') {
+      wsResult += FX_GetLiteralText(strf, ccf, lenf);
+      ccf++;
+      continue;
+    } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) {
+      wsResult += strf[ccf++];
+      continue;
+    }
+    FX_DWORD dwSymbolNum = 1;
+    FX_DWORD dwSymbol = strf[ccf++];
+    while (ccf < lenf && strf[ccf] == dwSymbol) {
+      ccf++;
+      dwSymbolNum++;
+    }
+    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
+    if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) {
+      CFX_WideString wsDay;
+      wsDay.Format(L"%d", day);
+      wsResult += wsDay;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) {
+      CFX_WideString wsDay;
+      wsDay.Format(L"%02d", day);
+      wsResult += wsDay;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) {
+      FX_WORD nDays = 0;
+      for (int i = 1; i < month; i++) {
+        nDays += FX_GetSolarMonthDays(year, i);
+      }
+      nDays += day;
+      CFX_WideString wsDays;
+      wsDays.Format(L"%d", nDays);
+      wsResult += wsDays;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) {
+      FX_WORD nDays = 0;
+      for (int i = 1; i < month; i++) {
+        nDays += FX_GetSolarMonthDays(year, i);
+      }
+      nDays += day;
+      CFX_WideString wsDays;
+      wsDays.Format(L"%03d", nDays);
+      wsResult += wsDays;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
+      CFX_WideString wsMonth;
+      wsMonth.Format(L"%d", month);
+      wsResult += wsMonth;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
+      CFX_WideString wsMonth;
+      wsMonth.Format(L"%02d", month);
+      wsResult += wsMonth;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
+      CFX_WideString wsTemp;
+      pLocale->GetMonthName(month - 1, wsTemp, TRUE);
+      wsResult += wsTemp;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
+      CFX_WideString wsTemp;
+      pLocale->GetMonthName(month - 1, wsTemp, FALSE);
+      wsResult += wsTemp;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
+      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
+      CFX_WideString wsWeekDay;
+      wsWeekDay.Format(L"%d", wWeekDay + 1);
+      wsResult += wsWeekDay;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
+      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
+      CFX_WideString wsTemp;
+      pLocale->GetDayName(wWeekDay, wsTemp, TRUE);
+      wsResult += wsTemp;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
+      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
+      if (pLocale) {
+        CFX_WideString wsTemp;
+        pLocale->GetDayName(wWeekDay, wsTemp, FALSE);
+        wsResult += wsTemp;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
+      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
+      CFX_WideString wsWeekDay;
+      wsWeekDay.Format(L"%d", wWeekDay ? wWeekDay : 7);
+      wsResult += wsWeekDay;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
+      CFX_WideString wsTemp;
+      pLocale->GetEraName(wsTemp, year < 0);
+      wsResult += wsTemp;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
+      CFX_WideString wsYear;
+      wsYear.Format(L"%02d", year % 100);
+      wsResult += wsYear;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) {
+      CFX_WideString wsYear;
+      wsYear.Format(L"%d", year);
+      wsResult += wsYear;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) {
+      FX_WORD week_index = FX_GetWeekOfMonth(year, month, day);
+      CFX_WideString wsWeekInMonth;
+      wsWeekInMonth.Format(L"%d", week_index);
+      wsResult += wsWeekInMonth;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) {
+      FX_WORD week_index = FX_GetWeekOfYear(year, month, day);
+      CFX_WideString wsWeekInYear;
+      wsWeekInYear.Format(L"%02d", week_index);
+      wsResult += wsWeekInYear;
+    }
+  }
+  return bRet;
+}
+static FX_BOOL FX_TimeFormat(const CFX_WideString& wsTimePattern,
+                             IFX_Locale* pLocale,
+                             const CFX_Unitime& datetime,
+                             CFX_WideString& wsResult) {
+  FX_BOOL bGMT = FALSE;
+  FX_BOOL bRet = TRUE;
+  uint8_t hour = datetime.GetHour();
+  uint8_t minute = datetime.GetMinute();
+  uint8_t second = datetime.GetSecond();
+  FX_WORD millisecond = datetime.GetMillisecond();
+  int32_t ccf = 0;
+  const FX_WCHAR* strf = (const FX_WCHAR*)wsTimePattern;
+  int32_t lenf = wsTimePattern.GetLength();
+  FX_WORD wHour = hour;
+  FX_BOOL bPM = FALSE;
+  if (wsTimePattern.Find('A') != -1) {
+    if (wHour >= 12) {
+      bPM = TRUE;
+    }
+  }
+  while (ccf < lenf) {
+    if (strf[ccf] == '\'') {
+      wsResult += FX_GetLiteralText(strf, ccf, lenf);
+      ccf++;
+      continue;
+    } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) < 0) {
+      wsResult += strf[ccf++];
+      continue;
+    }
+    FX_DWORD dwSymbolNum = 1;
+    FX_DWORD dwSymbol = strf[ccf++];
+    while (ccf < lenf && strf[ccf] == dwSymbol) {
+      ccf++;
+      dwSymbolNum++;
+    }
+    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
+    if (dwSymbol == FXBSTR_ID(0, 0, 'h', '1')) {
+      if (wHour > 12) {
+        wHour -= 12;
+      }
+      CFX_WideString wsHour;
+      wsHour.Format(L"%d", wHour == 0 ? 12 : wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'h', '2')) {
+      if (wHour > 12) {
+        wHour -= 12;
+      }
+      CFX_WideString wsHour;
+      wsHour.Format(L"%02d", wHour == 0 ? 12 : wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) {
+      CFX_WideString wsHour;
+      wsHour.Format(L"%d", wHour == 0 ? 24 : wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) {
+      CFX_WideString wsHour;
+      wsHour.Format(L"%02d", wHour == 0 ? 24 : wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1')) {
+      if (wHour > 12) {
+        wHour -= 12;
+      }
+      CFX_WideString wsHour;
+      wsHour.Format(L"%d", wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '1')) {
+      CFX_WideString wsHour;
+      wsHour.Format(L"%d", wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2')) {
+      if (wHour > 12) {
+        wHour -= 12;
+      }
+      CFX_WideString wsHour;
+      wsHour.Format(L"%02d", wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '2')) {
+      CFX_WideString wsHour;
+      wsHour.Format(L"%02d", wHour);
+      wsResult += wsHour;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
+      CFX_WideString wsMinute;
+      wsMinute.Format(L"%d", minute);
+      wsResult += wsMinute;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
+      CFX_WideString wsMinute;
+      wsMinute.Format(L"%02d", minute);
+      wsResult += wsMinute;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) {
+      CFX_WideString wsSecond;
+      wsSecond.Format(L"%d", second);
+      wsResult += wsSecond;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) {
+      CFX_WideString wsSecond;
+      wsSecond.Format(L"%02d", second);
+      wsResult += wsSecond;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) {
+      CFX_WideString wsMilliseconds;
+      wsMilliseconds.Format(L"%03d", millisecond);
+      wsResult += wsMilliseconds;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
+      CFX_WideString wsMeridiem;
+      pLocale->GetMeridiemName(wsMeridiem, !bPM);
+      wsResult += wsMeridiem;
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
+      wsResult += FX_WSTRC(L"GMT");
+      FX_TIMEZONE tz;
+      pLocale->GetTimeZone(tz);
+      if (!bGMT && (tz.tzHour != 0 || tz.tzMinute != 0)) {
+        if (tz.tzHour < 0) {
+          wsResult += FX_WSTRC(L"-");
+        } else {
+          wsResult += FX_WSTRC(L"+");
+        }
+        CFX_WideString wsTimezone;
+        wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
+        wsResult += wsTimezone;
+      }
+    } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
+      FX_TIMEZONE tz;
+      pLocale->GetTimeZone(tz);
+      if (!bGMT && tz.tzHour != 0 && tz.tzMinute != 0) {
+        if (tz.tzHour < 0) {
+          wsResult += FX_WSTRC(L"-");
+        } else {
+          wsResult += FX_WSTRC(L"+");
+        }
+        CFX_WideString wsTimezone;
+        wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
+        wsResult += wsTimezone;
+      }
+    }
+  }
+  return bRet;
+}
+static FX_BOOL FX_FormatDateTime(const CFX_Unitime& dt,
+                                 const CFX_WideString& wsDatePattern,
+                                 const CFX_WideString& wsTimePattern,
+                                 FX_BOOL bDateFirst,
+                                 IFX_Locale* pLocale,
+                                 CFX_WideString& wsOutput) {
+  FX_BOOL bRet = TRUE;
+  CFX_WideString wsDateOut, wsTimeOut;
+  if (!wsDatePattern.IsEmpty()) {
+    bRet &= FX_DateFormat(wsDatePattern, pLocale, dt, wsDateOut);
+  }
+  if (!wsTimePattern.IsEmpty()) {
+    bRet &= FX_TimeFormat(wsTimePattern, pLocale, dt, wsTimeOut);
+  }
+  wsOutput = bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut;
+  return bRet;
+}
+FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                         const CFX_WideString& wsPattern,
+                                         CFX_WideString& wsOutput) {
+  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsDatePattern, wsTimePattern;
+  IFX_Locale* pLocale = NULL;
+  FX_DATETIMETYPE eCategory =
+      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+  if (pLocale == NULL || eCategory == FX_DATETIMETYPE_Unknown) {
+    return FALSE;
+  }
+  CFX_Unitime dt(0);
+  int32_t iT = wsSrcDateTime.Find(L"T");
+  if (iT < 0) {
+    if (eCategory == FX_DATETIMETYPE_Date) {
+      FX_DateFromCanonical(wsSrcDateTime, dt);
+    } else if (eCategory == FX_DATETIMETYPE_Time) {
+      FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale);
+    }
+  } else {
+    FX_DateFromCanonical(wsSrcDateTime.Left(iT), dt);
+    FX_TimeFromCanonical(
+        wsSrcDateTime.Right(wsSrcDateTime.GetLength() - iT - 1), dt, pLocale);
+  }
+  return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern,
+                           eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
+                           wsOutput);
+}
+FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                         const CFX_WideString& wsPattern,
+                                         CFX_WideString& wsOutput,
+                                         FX_DATETIMETYPE eDateTimeType) {
+  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsDatePattern, wsTimePattern;
+  IFX_Locale* pLocale = NULL;
+  FX_DATETIMETYPE eCategory =
+      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+  if (!pLocale) {
+    return FALSE;
+  }
+  if (eCategory == FX_DATETIMETYPE_Unknown) {
+    if (eDateTimeType == FX_DATETIMETYPE_Time) {
+      wsTimePattern = wsDatePattern;
+      wsDatePattern.Empty();
+    }
+    eCategory = eDateTimeType;
+  }
+  if (eCategory == FX_DATETIMETYPE_Unknown) {
+    return FALSE;
+  }
+  CFX_Unitime dt(0);
+  int32_t iT = wsSrcDateTime.Find(L"T");
+  if (iT < 0) {
+    if (eCategory == FX_DATETIMETYPE_Date &&
+        FX_DateFromCanonical(wsSrcDateTime, dt)) {
+      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale,
+                               wsOutput);
+    } else if (eCategory == FX_DATETIMETYPE_Time &&
+               FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale)) {
+      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale,
+                               wsOutput);
+    }
+  } else {
+    CFX_WideStringC wsSrcDate((const FX_WCHAR*)wsSrcDateTime, iT);
+    CFX_WideStringC wsSrcTime((const FX_WCHAR*)wsSrcDateTime + iT + 1,
+                              wsSrcDateTime.GetLength() - iT - 1);
+    if (wsSrcDate.IsEmpty() || wsSrcTime.IsEmpty()) {
+      return FALSE;
+    }
+    if (FX_DateFromCanonical(wsSrcDate, dt) &&
+        FX_TimeFromCanonical(wsSrcTime, dt, pLocale)) {
+      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern,
+                               eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
+                               wsOutput);
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFX_FormatString::FormatDateTime(const CFX_Unitime& dt,
+                                         const CFX_WideString& wsPattern,
+                                         CFX_WideString& wsOutput) {
+  if (wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsDatePattern, wsTimePattern;
+  IFX_Locale* pLocale = NULL;
+  FX_DATETIMETYPE eCategory =
+      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+  if (!pLocale) {
+    return FALSE;
+  }
+  return FX_FormatDateTime(dt, wsPattern, wsTimePattern,
+                           eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
+                           wsOutput);
+}
+FX_BOOL CFX_FormatString::FormatZero(const CFX_WideString& wsPattern,
+                                     CFX_WideString& wsOutput) {
+  if (wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat);
+  int32_t iPattern = 0;
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern) {
+    if (pStrPattern[iPattern] == '\'') {
+      wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      iPattern++;
+      continue;
+    } else {
+      wsOutput += pStrPattern[iPattern++];
+      continue;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CFX_FormatString::FormatNull(const CFX_WideString& wsPattern,
+                                     CFX_WideString& wsOutput) {
+  if (wsPattern.IsEmpty()) {
+    return FALSE;
+  }
+  CFX_WideString wsTextFormat;
+  GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat);
+  int32_t iPattern = 0;
+  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
+  int32_t iLenPattern = wsTextFormat.GetLength();
+  while (iPattern < iLenPattern) {
+    if (pStrPattern[iPattern] == '\'') {
+      wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      iPattern++;
+      continue;
+    } else {
+      wsOutput += pStrPattern[iPattern++];
+      continue;
+    }
+  }
+  return TRUE;
+}
+IFX_Locale* CFX_FormatString::GetPatternLocale(
+    const CFX_WideStringC& wsLocale) {
+  if (m_bUseLCID) {
+  }
+  return m_pLocaleMgr->GetLocaleByName(wsLocale);
+}
+#define FXMATH_DECIMAL_SCALELIMIT 0x1c
+#define FXMATH_DECIMAL_NEGMASK (0x80000000L)
+#define FXMATH_DECIMAL_FORCEBOOL(x) (!(!(x)))
+#define FXMATH_DECIMAL_MAKEFLAGS(NEG, SCALE) \
+  (((SCALE) << 0x10) | ((NEG) ? FXMATH_DECIMAL_NEGMASK : 0))
+#define FXMATH_DECIMAL_FLAGS2NEG(FLAGS) \
+  FXMATH_DECIMAL_FORCEBOOL((FLAGS)&FXMATH_DECIMAL_NEGMASK)
+#define FXMATH_DECIMAL_FLAGS2SCALE(FLAGS) \
+  ((uint8_t)(((FLAGS) & ~FXMATH_DECIMAL_NEGMASK) >> 0x10))
+#define FXMATH_DECIMAL_RSHIFT32BIT(x) ((x) >> 0x10 >> 0x10)
+#define FXMATH_DECIMAL_LSHIFT32BIT(x) ((x) << 0x10 << 0x10)
+static inline uint8_t fxmath_decimal_helper_div10(uint64_t& phi,
+                                                  uint64_t& pmid,
+                                                  uint64_t& plo) {
+  uint8_t retVal;
+  pmid += FXMATH_DECIMAL_LSHIFT32BIT(phi % 0xA);
+  phi /= 0xA;
+  plo += FXMATH_DECIMAL_LSHIFT32BIT(pmid % 0xA);
+  pmid /= 0xA;
+  retVal = plo % 0xA;
+  plo /= 0xA;
+  return retVal;
+}
+static inline uint8_t fxmath_decimal_helper_div10_any(uint64_t nums[],
+                                                      uint8_t numcount) {
+  uint8_t retVal = 0;
+  for (int i = numcount - 1; i > 0; i--) {
+    nums[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(nums[i] % 0xA);
+    nums[i] /= 0xA;
+  }
+  if (numcount) {
+    retVal = nums[0] % 0xA;
+    nums[0] /= 0xA;
+  }
+  return retVal;
+}
+static inline void fxmath_decimal_helper_mul10(uint64_t& phi,
+                                               uint64_t& pmid,
+                                               uint64_t& plo) {
+  plo *= 0xA;
+  pmid = pmid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(plo);
+  plo = (uint32_t)plo;
+  phi = phi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(pmid);
+  pmid = (uint32_t)pmid;
+}
+static inline void fxmath_decimal_helper_mul10_any(uint64_t nums[],
+                                                   uint8_t numcount) {
+  nums[0] *= 0xA;
+  for (int i = 1; i < numcount; i++) {
+    nums[i] = nums[i] * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(nums[i - 1]);
+    nums[i - 1] = (uint32_t)nums[i - 1];
+  }
+}
+static inline void fxmath_decimal_helper_normalize(uint64_t& phi,
+                                                   uint64_t& pmid,
+                                                   uint64_t& plo) {
+  phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid);
+  pmid = (uint32_t)pmid;
+  pmid += FXMATH_DECIMAL_RSHIFT32BIT(plo);
+  plo = (uint32_t)plo;
+  phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid);
+  pmid = (uint32_t)pmid;
+}
+static inline void fxmath_decimal_helper_normalize_any(uint64_t nums[],
+                                                       uint8_t len) {
+  {
+    for (int i = len - 2; i > 0; i--) {
+      nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]);
+      nums[i] = (uint32_t)nums[i];
+    }
+  }
+  {
+    for (int i = 0; i < len - 1; i++) {
+      nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]);
+      nums[i] = (uint32_t)nums[i];
+    }
+  }
+}
+static inline int8_t fxmath_decimal_helper_raw_compare(uint32_t hi1,
+                                                       uint32_t mid1,
+                                                       uint32_t lo1,
+                                                       uint32_t hi2,
+                                                       uint32_t mid2,
+                                                       uint32_t lo2) {
+  int8_t retVal = 0;
+  if (!retVal) {
+    retVal += (hi1 > hi2 ? 1 : (hi1 < hi2 ? -1 : 0));
+  }
+  if (!retVal) {
+    retVal += (mid1 > mid2 ? 1 : (mid1 < mid2 ? -1 : 0));
+  }
+  if (!retVal) {
+    retVal += (lo1 > lo2 ? 1 : (lo1 < lo2 ? -1 : 0));
+  }
+  return retVal;
+}
+static inline int8_t fxmath_decimal_helper_raw_compare_any(uint64_t a[],
+                                                           uint8_t al,
+                                                           uint64_t b[],
+                                                           uint8_t bl) {
+  int8_t retVal = 0;
+  for (int i = std::max(al - 1, bl - 1); i >= 0; i--) {
+    uint64_t l = (i >= al ? 0 : a[i]), r = (i >= bl ? 0 : b[i]);
+    retVal += (l > r ? 1 : (l < r ? -1 : 0));
+    if (retVal) {
+      return retVal;
+    }
+  }
+  return retVal;
+}
+static inline void fxmath_decimal_helper_dec_any(uint64_t a[], uint8_t al) {
+  for (int i = 0; i < al; i++) {
+    if (a[i]--) {
+      return;
+    }
+  }
+}
+static inline void fxmath_decimal_helper_inc_any(uint64_t a[], uint8_t al) {
+  for (int i = 0; i < al; i++) {
+    a[i]++;
+    if ((uint32_t)a[i] == a[i]) {
+      return;
+    }
+    a[i] = 0;
+  }
+}
+static inline void fxmath_decimal_helper_raw_mul(uint64_t a[],
+                                                 uint8_t al,
+                                                 uint64_t b[],
+                                                 uint8_t bl,
+                                                 uint64_t c[],
+                                                 uint8_t cl) {
+  assert(al + bl <= cl);
+  {
+    for (int i = 0; i < cl; i++) {
+      c[i] = 0;
+    }
+  }
+  {
+    for (int i = 0; i < al; i++) {
+      for (int j = 0; j < bl; j++) {
+        uint64_t m = (uint64_t)a[i] * b[j];
+        c[i + j] += (uint32_t)m;
+        c[i + j + 1] += FXMATH_DECIMAL_RSHIFT32BIT(m);
+      }
+    }
+  }
+  {
+    for (int i = 0; i < cl - 1; i++) {
+      c[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(c[i]);
+      c[i] = (uint32_t)c[i];
+    }
+  }
+  {
+    for (int i = 0; i < cl; i++) {
+      c[i] = (uint32_t)c[i];
+    }
+  }
+}
+static inline void fxmath_decimal_helper_raw_div(uint64_t a[],
+                                                 uint8_t al,
+                                                 uint64_t b[],
+                                                 uint8_t bl,
+                                                 uint64_t c[],
+                                                 uint8_t cl) {
+  int i;
+  for (i = 0; i < cl; i++) {
+    c[i] = 0;
+  }
+  uint64_t left[16] = {0}, right[16] = {0};
+  left[0] = 0;
+  for (i = 0; i < al; i++) {
+    right[i] = a[i];
+  }
+  uint64_t tmp[16];
+  while (fxmath_decimal_helper_raw_compare_any(left, al, right, al) <= 0) {
+    uint64_t cur[16];
+    for (i = 0; i < al; i++) {
+      cur[i] = left[i] + right[i];
+    }
+    for (i = al - 1; i >= 0; i--) {
+      if (i) {
+        cur[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(cur[i] % 2);
+      }
+      cur[i] /= 2;
+    }
+    fxmath_decimal_helper_raw_mul(cur, al, b, bl, tmp, 16);
+    switch (fxmath_decimal_helper_raw_compare_any(tmp, 16, a, al)) {
+      case -1:
+        for (i = 0; i < 16; i++) {
+          left[i] = cur[i];
+        }
+        left[0]++;
+        fxmath_decimal_helper_normalize_any(left, al);
+        break;
+      case 1:
+        for (i = 0; i < 16; i++) {
+          right[i] = cur[i];
+        }
+        fxmath_decimal_helper_dec_any(right, al);
+        break;
+      case 0:
+        for (i = 0; i < std::min(al, cl); i++) {
+          c[i] = cur[i];
+        }
+        return;
+    }
+  }
+  for (i = 0; i < std::min(al, cl); i++) {
+    c[i] = left[i];
+  }
+}
+static inline FX_BOOL fxmath_decimal_helper_outofrange(uint64_t a[],
+                                                       uint8_t al,
+                                                       uint8_t goal) {
+  for (int i = goal; i < al; i++) {
+    if (a[i]) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+static inline void fxmath_decimal_helper_shrinkintorange(uint64_t a[],
+                                                         uint8_t al,
+                                                         uint8_t goal,
+                                                         uint8_t& scale) {
+  FX_BOOL bRoundUp = FALSE;
+  while (scale != 0 && (scale > FXMATH_DECIMAL_SCALELIMIT ||
+                        fxmath_decimal_helper_outofrange(a, al, goal))) {
+    bRoundUp = fxmath_decimal_helper_div10_any(a, al) >= 5;
+    scale--;
+  }
+  if (bRoundUp) {
+    fxmath_decimal_helper_normalize_any(a, goal);
+    fxmath_decimal_helper_inc_any(a, goal);
+  }
+}
+static inline void fxmath_decimal_helper_truncate(uint64_t& phi,
+                                                  uint64_t& pmid,
+                                                  uint64_t& plo,
+                                                  uint8_t& scale,
+                                                  uint8_t minscale = 0) {
+  while (scale > minscale) {
+    uint64_t thi = phi, tmid = pmid, tlo = plo;
+    if (fxmath_decimal_helper_div10(thi, tmid, tlo) != 0) {
+      break;
+    }
+    phi = thi, pmid = tmid, plo = tlo;
+    scale--;
+  }
+}
+CFX_Decimal::CFX_Decimal() {
+  m_uLo = m_uMid = m_uHi = m_uFlags = 0;
+}
+CFX_Decimal::CFX_Decimal(uint64_t val) {
+  m_uLo = (uint32_t)val;
+  m_uMid = (uint32_t)FXMATH_DECIMAL_RSHIFT32BIT(val);
+  m_uHi = 0;
+  m_uFlags = 0;
+}
+CFX_Decimal::CFX_Decimal(uint32_t val) {
+  m_uLo = (uint32_t)val;
+  m_uMid = m_uHi = 0;
+  m_uFlags = 0;
+}
+CFX_Decimal::CFX_Decimal(uint32_t lo,
+                         uint32_t mid,
+                         uint32_t hi,
+                         FX_BOOL neg,
+                         uint8_t scale) {
+  scale = (scale > FXMATH_DECIMAL_SCALELIMIT ? 0 : scale);
+  m_uLo = lo;
+  m_uMid = mid;
+  m_uHi = hi;
+  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(neg && IsNotZero(), scale);
+}
+CFX_Decimal::CFX_Decimal(int32_t val) {
+  if (val >= 0) {
+    *this = CFX_Decimal((uint32_t)val);
+  } else {
+    *this = CFX_Decimal((uint32_t)-val);
+    SetNegate();
+  }
+}
+CFX_Decimal::CFX_Decimal(int64_t val) {
+  if (val >= 0) {
+    *this = CFX_Decimal((uint64_t)val);
+  } else {
+    *this = CFX_Decimal((uint64_t)-val);
+    SetNegate();
+  }
+}
+CFX_Decimal::CFX_Decimal(FX_FLOAT val, uint8_t scale) {
+  FX_FLOAT newval = fabs(val);
+  uint64_t phi, pmid, plo;
+  plo = (uint64_t)newval;
+  pmid = (uint64_t)(newval / 1e32);
+  phi = (uint64_t)(newval / 1e64);
+  newval = FXSYS_fmod(newval, 1.0f);
+  for (uint8_t iter = 0; iter < scale; iter++) {
+    fxmath_decimal_helper_mul10(phi, pmid, plo);
+    newval *= 10;
+    plo += (uint64_t)newval;
+    newval = FXSYS_fmod(newval, 1.0f);
+  }
+  plo += FXSYS_round(newval);
+  fxmath_decimal_helper_normalize(phi, pmid, plo);
+  m_uHi = (uint32_t)phi;
+  m_uMid = (uint32_t)pmid;
+  m_uLo = (uint32_t)plo;
+  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(val < 0 && IsNotZero(), scale);
+}
+CFX_Decimal::CFX_Decimal(const CFX_WideStringC& strObj) {
+  const FX_WCHAR* str = strObj.GetPtr();
+  const FX_WCHAR* strBound = str + strObj.GetLength();
+  FX_BOOL pointmet = 0;
+  FX_BOOL negmet = 0;
+  uint8_t scale = 0;
+  m_uHi = m_uMid = m_uLo = 0;
+  while (str != strBound && *str == ' ') {
+    str++;
+  }
+  if (str != strBound && *str == '-') {
+    negmet = 1;
+    str++;
+  } else if (str != strBound && *str == '+') {
+    str++;
+  }
+  while (str != strBound && ((*str >= '0' && *str <= '9') || *str == '.') &&
+         scale < FXMATH_DECIMAL_SCALELIMIT) {
+    if (*str == '.') {
+      if (pointmet) {
+        goto cont;
+      }
+      pointmet = 1;
+    } else {
+      m_uHi = m_uHi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((uint64_t)m_uMid * 0xA);
+      m_uMid = m_uMid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((uint64_t)m_uLo * 0xA);
+      m_uLo = m_uLo * 0xA + (*str - '0');
+      if (pointmet) {
+        scale++;
+      }
+    }
+  cont:
+    str++;
+  }
+  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(negmet && IsNotZero(), scale);
+}
+
+CFX_Decimal::CFX_Decimal(const CFX_ByteStringC& strObj) {
+  *this = CFX_Decimal(CFX_WideString::FromLocal(strObj));
+}
+
+CFX_Decimal::operator CFX_WideString() const {
+  CFX_WideString retString;
+  CFX_WideString tmpbuf;
+  uint64_t phi = m_uHi, pmid = m_uMid, plo = m_uLo;
+  while (phi || pmid || plo) {
+    tmpbuf += fxmath_decimal_helper_div10(phi, pmid, plo) + '0';
+  }
+  uint8_t outputlen = (uint8_t)tmpbuf.GetLength();
+  uint8_t scale = (uint8_t)FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
+  while (scale >= outputlen) {
+    tmpbuf += '0';
+    outputlen++;
+  }
+  if (FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero()) {
+    retString += '-';
+  }
+  for (uint8_t idx = 0; idx < outputlen; idx++) {
+    if (idx == (outputlen - scale) && scale != 0) {
+      retString += '.';
+    }
+    retString += tmpbuf[outputlen - 1 - idx];
+  }
+  return retString;
+}
+CFX_Decimal::operator double() const {
+  double pow = (double)(1 << 16) * (1 << 16);
+  double base =
+      ((double)m_uHi) * pow * pow + ((double)m_uMid) * pow + ((double)m_uLo);
+  int8_t scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
+  FX_BOOL bNeg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags);
+  return (bNeg ? -1 : 1) * base * ::pow(10.0, -scale);
+}
+void CFX_Decimal::SetScale(uint8_t newscale) {
+  uint8_t oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
+  if (newscale > oldscale) {
+    uint64_t phi = m_uHi, pmid = m_uMid, plo = m_uLo;
+    for (uint8_t iter = 0; iter < newscale - oldscale; iter++) {
+      fxmath_decimal_helper_mul10(phi, pmid, plo);
+    }
+    m_uHi = (uint32_t)phi;
+    m_uMid = (uint32_t)pmid;
+    m_uLo = (uint32_t)plo;
+    m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
+        FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale);
+  } else if (newscale < oldscale) {
+    uint64_t phi, pmid, plo;
+    phi = 0, pmid = 0, plo = 5;
+    {
+      for (uint8_t iter = 0; iter < oldscale - newscale - 1; iter++) {
+        fxmath_decimal_helper_mul10(phi, pmid, plo);
+      }
+    }
+    phi += m_uHi;
+    pmid += m_uMid;
+    plo += m_uLo;
+    fxmath_decimal_helper_normalize(phi, pmid, plo);
+    {
+      for (uint8_t iter = 0; iter < oldscale - newscale; iter++) {
+        fxmath_decimal_helper_div10(phi, pmid, plo);
+      }
+    }
+    m_uHi = (uint32_t)phi;
+    m_uMid = (uint32_t)pmid;
+    m_uLo = (uint32_t)plo;
+    m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
+        FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale);
+  }
+}
+uint8_t CFX_Decimal::GetScale() {
+  uint8_t oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
+  return oldscale;
+}
+void CFX_Decimal::SetAbs() {
+  m_uFlags &= ~FXMATH_DECIMAL_NEGMASK;
+}
+void CFX_Decimal::SetNegate() {
+  if (IsNotZero()) {
+    m_uFlags ^= FXMATH_DECIMAL_NEGMASK;
+  }
+}
+void CFX_Decimal::FloorOrCeil(FX_BOOL bFloor) {
+  uint64_t nums[3] = {m_uLo, m_uMid, m_uHi};
+  FX_BOOL bDataLoss = FALSE;
+  for (int i = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); i > 0; i--) {
+    bDataLoss = fxmath_decimal_helper_div10_any(nums, 3) || bDataLoss;
+  }
+  if (bDataLoss && (bFloor ? FXMATH_DECIMAL_FLAGS2NEG(m_uFlags)
+                           : !FXMATH_DECIMAL_FLAGS2NEG(m_uFlags))) {
+    fxmath_decimal_helper_inc_any(nums, 3);
+  }
+  m_uHi = (uint32_t)nums[2];
+  m_uMid = (uint32_t)nums[1];
+  m_uLo = (uint32_t)nums[0];
+  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
+      FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), 0);
+}
+void CFX_Decimal::SetFloor() {
+  FloorOrCeil(TRUE);
+}
+void CFX_Decimal::SetCeiling() {
+  FloorOrCeil(FALSE);
+}
+void CFX_Decimal::SetTruncate() {
+  FloorOrCeil(!FXMATH_DECIMAL_FLAGS2NEG(m_uFlags));
+}
+void CFX_Decimal::Swap(CFX_Decimal& val) {
+  uint32_t tmp;
+  tmp = m_uHi;
+  m_uHi = val.m_uHi;
+  val.m_uHi = tmp;
+  tmp = m_uMid;
+  m_uMid = val.m_uMid;
+  val.m_uMid = tmp;
+  tmp = m_uLo;
+  m_uLo = val.m_uLo;
+  val.m_uLo = tmp;
+  tmp = m_uFlags;
+  m_uFlags = val.m_uFlags;
+  val.m_uFlags = tmp;
+}
+int8_t CFX_Decimal::Compare(const CFX_Decimal& val) const {
+  CFX_Decimal lhs = *this, rhs = val;
+  int8_t retVal = 0;
+  if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) !=
+      FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) {
+    uint8_t scale = std::min(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags),
+                             FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags));
+    lhs.SetScale(scale);
+    rhs.SetScale(scale);
+  }
+  retVal = -(FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) -
+             FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags));
+  if (retVal) {
+    return retVal;
+  }
+  retVal = fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo,
+                                             rhs.m_uHi, rhs.m_uMid, rhs.m_uLo);
+  return (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) ? -retVal : retVal);
+}
+CFX_Decimal CFX_Decimal::AddOrMinus(const CFX_Decimal& val,
+                                    FX_BOOL isAdding) const {
+  CFX_Decimal lhs = *this, rhs = val;
+  if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) !=
+      FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) {
+    uint8_t scale = std::max(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags),
+                             FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags));
+    lhs.SetScale(scale);
+    rhs.SetScale(scale);
+  }
+  if (!isAdding) {
+    rhs.SetNegate();
+  }
+  if (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) ==
+      FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags)) {
+    uint64_t phi = lhs.m_uHi, pmid = lhs.m_uMid, plo = lhs.m_uLo;
+    phi += rhs.m_uHi;
+    pmid += rhs.m_uMid;
+    plo += rhs.m_uLo;
+    fxmath_decimal_helper_normalize(phi, pmid, plo);
+    if (FXMATH_DECIMAL_RSHIFT32BIT(phi) &&
+        FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) != 0) {
+      fxmath_decimal_helper_div10(phi, pmid, plo);
+      lhs.m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
+          FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags),
+          FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) - 1);
+    }
+    lhs.m_uHi = (uint32_t)phi;
+    lhs.m_uMid = (uint32_t)pmid;
+    lhs.m_uLo = (uint32_t)plo;
+    return lhs;
+  } else {
+    if (fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo,
+                                          rhs.m_uHi, rhs.m_uMid,
+                                          rhs.m_uLo) < 0) {
+      lhs.Swap(rhs);
+    }
+    lhs.m_uHi -= rhs.m_uHi;
+    if (lhs.m_uMid < rhs.m_uMid) {
+      lhs.m_uHi--;
+    }
+    lhs.m_uMid -= rhs.m_uMid;
+    if (lhs.m_uLo < rhs.m_uLo) {
+      if (!lhs.m_uMid) {
+        lhs.m_uHi--;
+      }
+      lhs.m_uMid--;
+    }
+    lhs.m_uLo -= rhs.m_uLo;
+    return lhs;
+  }
+}
+CFX_Decimal CFX_Decimal::Multiply(const CFX_Decimal& val) const {
+  uint64_t a[3] = {m_uLo, m_uMid, m_uHi},
+           b[3] = {val.m_uLo, val.m_uMid, val.m_uHi};
+  uint64_t c[6];
+  fxmath_decimal_helper_raw_mul(a, 3, b, 3, c, 6);
+  FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^
+                FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags);
+  uint8_t scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) +
+                  FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags);
+  fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale);
+  return CFX_Decimal((uint32_t)c[0], (uint32_t)c[1], (uint32_t)c[2], neg,
+                     scale);
+}
+CFX_Decimal CFX_Decimal::Divide(const CFX_Decimal& val) const {
+  if (!val.IsNotZero()) {
+    return CFX_Decimal();
+  }
+  FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^
+                FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags);
+  uint64_t a[7] = {m_uLo, m_uMid, m_uHi},
+           b[3] = {val.m_uLo, val.m_uMid, val.m_uHi}, c[7] = {0};
+  uint8_t scale = 0;
+  if (FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) <
+      FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags)) {
+    for (int i = FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags) -
+                 FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
+         i > 0; i--) {
+      fxmath_decimal_helper_mul10_any(a, 7);
+    }
+  } else {
+    scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) -
+            FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags);
+  }
+  uint8_t minscale = scale;
+  if (!IsNotZero()) {
+    return CFX_Decimal(0, 0, 0, 0, minscale);
+  }
+  while (!a[6]) {
+    fxmath_decimal_helper_mul10_any(a, 7);
+    scale++;
+  }
+  fxmath_decimal_helper_div10_any(a, 7);
+  scale--;
+  fxmath_decimal_helper_raw_div(a, 6, b, 3, c, 7);
+  fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale);
+  fxmath_decimal_helper_truncate(c[2], c[1], c[0], scale, minscale);
+  return CFX_Decimal((uint32_t)c[0], (uint32_t)c[1], (uint32_t)c[2], neg,
+                     scale);
+}
+CFX_Decimal CFX_Decimal::Modulus(const CFX_Decimal& val) const {
+  CFX_Decimal lhs = *this, rhs_abs = val;
+  rhs_abs.SetAbs();
+  if (!rhs_abs.IsNotZero()) {
+    return *this;
+  }
+  while (TRUE) {
+    CFX_Decimal lhs_abs = lhs;
+    lhs_abs.SetAbs();
+    if (lhs_abs < rhs_abs) {
+      break;
+    }
+    CFX_Decimal quot = lhs / rhs_abs;
+    quot.SetTruncate();
+    lhs = lhs - quot * rhs_abs;
+  }
+  return lhs;
+}
+bool CFX_Decimal::operator==(const CFX_Decimal& val) const {
+  return Compare(val) == 0;
+}
+bool CFX_Decimal::operator<=(const CFX_Decimal& val) const {
+  return Compare(val) <= 0;
+}
+bool CFX_Decimal::operator>=(const CFX_Decimal& val) const {
+  return Compare(val) >= 0;
+}
+bool CFX_Decimal::operator!=(const CFX_Decimal& val) const {
+  return Compare(val) != 0;
+}
+bool CFX_Decimal::operator<(const CFX_Decimal& val) const {
+  return Compare(val) < 0;
+}
+bool CFX_Decimal::operator>(const CFX_Decimal& val) const {
+  return Compare(val) > 0;
+}
+CFX_Decimal CFX_Decimal::operator+(const CFX_Decimal& val) const {
+  return AddOrMinus(val, TRUE);
+}
+CFX_Decimal CFX_Decimal::operator-(const CFX_Decimal& val) const {
+  return AddOrMinus(val, FALSE);
+}
+CFX_Decimal CFX_Decimal::operator*(const CFX_Decimal& val) const {
+  return Multiply(val);
+}
+CFX_Decimal CFX_Decimal::operator/(const CFX_Decimal& val) const {
+  return Divide(val);
+}
+CFX_Decimal CFX_Decimal::operator%(const CFX_Decimal& val) const {
+  return Modulus(val);
+}
diff --git a/xfa/fgas/localization/fgas_locale.h b/xfa/fgas/localization/fgas_locale.h
new file mode 100644
index 0000000..a7e14b3
--- /dev/null
+++ b/xfa/fgas/localization/fgas_locale.h
@@ -0,0 +1,206 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
+#define XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
+
+#include "core/include/fxcrt/fx_xml.h"
+#include "xfa/fgas/localization/fgas_datetime.h"
+
+class CFX_Unitime;
+
+enum FX_LOCALENUMSYMBOL {
+  FX_LOCALENUMSYMBOL_Decimal,
+  FX_LOCALENUMSYMBOL_Grouping,
+  FX_LOCALENUMSYMBOL_Percent,
+  FX_LOCALENUMSYMBOL_Minus,
+  FX_LOCALENUMSYMBOL_Zero,
+  FX_LOCALENUMSYMBOL_CurrencySymbol,
+  FX_LOCALENUMSYMBOL_CurrencyName,
+};
+enum FX_LOCALEDATETIMESUBCATEGORY {
+  FX_LOCALEDATETIMESUBCATEGORY_Default,
+  FX_LOCALEDATETIMESUBCATEGORY_Short,
+  FX_LOCALEDATETIMESUBCATEGORY_Medium,
+  FX_LOCALEDATETIMESUBCATEGORY_Full,
+  FX_LOCALEDATETIMESUBCATEGORY_Long,
+};
+enum FX_LOCALENUMSUBCATEGORY {
+  FX_LOCALENUMPATTERN_Percent,
+  FX_LOCALENUMPATTERN_Currency,
+  FX_LOCALENUMPATTERN_Decimal,
+  FX_LOCALENUMPATTERN_Integer,
+};
+enum FX_LOCALECATEGORY {
+  FX_LOCALECATEGORY_Unknown,
+  FX_LOCALECATEGORY_Date,
+  FX_LOCALECATEGORY_Time,
+  FX_LOCALECATEGORY_DateTime,
+  FX_LOCALECATEGORY_Num,
+  FX_LOCALECATEGORY_Text,
+  FX_LOCALECATEGORY_Zero,
+  FX_LOCALECATEGORY_Null,
+};
+enum FX_DATETIMETYPE {
+  FX_DATETIMETYPE_Unknown,
+  FX_DATETIMETYPE_Date,
+  FX_DATETIMETYPE_Time,
+  FX_DATETIMETYPE_DateTime,
+  FX_DATETIMETYPE_TimeDate,
+};
+
+class IFX_Locale {
+ public:
+  static IFX_Locale* Create(CXML_Element* pLocaleData);
+
+  virtual ~IFX_Locale() {}
+  virtual void Release() = 0;
+
+  virtual CFX_WideString GetName() = 0;
+
+  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                 CFX_WideString& wsNumSymbol) const = 0;
+  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0;
+  virtual void GetMonthName(int32_t nMonth,
+                            CFX_WideString& wsMonthName,
+                            FX_BOOL bAbbr = TRUE) const = 0;
+  virtual void GetDayName(int32_t nWeek,
+                          CFX_WideString& wsDayName,
+                          FX_BOOL bAbbr = TRUE) const = 0;
+  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                               FX_BOOL bAM = TRUE) const = 0;
+  virtual void GetTimeZone(FX_TIMEZONE& tz) const = 0;
+  virtual void GetEraName(CFX_WideString& wsEraName,
+                          FX_BOOL bAD = TRUE) const = 0;
+  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const = 0;
+  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const = 0;
+  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                             CFX_WideString& wsPattern) const = 0;
+};
+
+class IFX_LocaleMgr {
+ public:
+  virtual ~IFX_LocaleMgr() {}
+  virtual void Release() = 0;
+  virtual FX_WORD GetDefLocaleID() = 0;
+  virtual IFX_Locale* GetDefLocale() = 0;
+  virtual IFX_Locale* GetLocale(FX_WORD lcid) = 0;
+  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName) = 0;
+};
+IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath,
+                                   FX_WORD wDefaultLCID);
+void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult);
+FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate,
+                             CFX_Unitime& datetime);
+FX_BOOL FX_TimeFromCanonical(const CFX_WideStringC& wsTime,
+                             CFX_Unitime& datetime,
+                             IFX_Locale* pLocale);
+class IFX_FormatString {
+ public:
+  static IFX_FormatString* Create(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID);
+
+  virtual ~IFX_FormatString() {}
+  virtual void Release() = 0;
+  virtual void SplitFormatString(const CFX_WideString& wsFormatString,
+                                 CFX_WideStringArray& wsPatterns) = 0;
+  virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern) = 0;
+  virtual FX_WORD GetLCID(const CFX_WideString& wsPattern) = 0;
+  virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern) = 0;
+  virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsValue) = 0;
+  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
+                           const CFX_WideString& wsPattern,
+                           FX_FLOAT& fValue) = 0;
+  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
+                           const CFX_WideString& wsPattern,
+                           CFX_WideString& wsValue) = 0;
+  virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime,
+                                const CFX_WideString& wsPattern,
+                                FX_DATETIMETYPE eDateTimeType,
+                                CFX_Unitime& dtValue) = 0;
+  virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern) = 0;
+  virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern) = 0;
+  virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText,
+                             const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatNum(FX_FLOAT fNum,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput,
+                                 FX_DATETIMETYPE eDateTimeType) = 0;
+  virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput) = 0;
+  virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput) = 0;
+};
+class CFX_Decimal {
+ public:
+  CFX_Decimal();
+  CFX_Decimal(uint32_t val);
+  CFX_Decimal(uint64_t val);
+  CFX_Decimal(int32_t val);
+  CFX_Decimal(int64_t val);
+  CFX_Decimal(FX_FLOAT val, uint8_t scale = 3);
+  CFX_Decimal(const CFX_WideStringC& str);
+  CFX_Decimal(const CFX_ByteStringC& str);
+  operator CFX_WideString() const;
+  operator double() const;
+  bool operator==(const CFX_Decimal& val) const;
+  bool operator<=(const CFX_Decimal& val) const;
+  bool operator>=(const CFX_Decimal& val) const;
+  bool operator!=(const CFX_Decimal& val) const;
+  bool operator<(const CFX_Decimal& val) const;
+  bool operator>(const CFX_Decimal& val) const;
+  CFX_Decimal operator+(const CFX_Decimal& val) const;
+  CFX_Decimal operator-(const CFX_Decimal& val) const;
+  CFX_Decimal operator*(const CFX_Decimal& val) const;
+  CFX_Decimal operator/(const CFX_Decimal& val) const;
+  CFX_Decimal operator%(const CFX_Decimal& val) const;
+  void SetScale(uint8_t newScale);
+  uint8_t GetScale();
+  void SetAbs();
+  void SetNegate();
+  void SetFloor();
+  void SetCeiling();
+  void SetTruncate();
+
+ protected:
+  CFX_Decimal(uint32_t hi,
+              uint32_t mid,
+              uint32_t lo,
+              FX_BOOL neg,
+              uint8_t scale);
+  inline FX_BOOL IsNotZero() const { return m_uHi || m_uMid || m_uLo; }
+  inline int8_t Compare(const CFX_Decimal& val) const;
+  inline void Swap(CFX_Decimal& val);
+  inline void FloorOrCeil(FX_BOOL bFloor);
+  CFX_Decimal AddOrMinus(const CFX_Decimal& val, FX_BOOL isAdding) const;
+  CFX_Decimal Multiply(const CFX_Decimal& val) const;
+  CFX_Decimal Divide(const CFX_Decimal& val) const;
+  CFX_Decimal Modulus(const CFX_Decimal& val) const;
+  uint32_t m_uFlags;
+  uint32_t m_uHi;
+  uint32_t m_uLo;
+  uint32_t m_uMid;
+};
+
+#endif  // XFA_FGAS_LOCALIZATION_FGAS_LOCALE_H_
diff --git a/xfa/fgas/localization/fgas_localeimp.h b/xfa/fgas/localization/fgas_localeimp.h
new file mode 100644
index 0000000..f4b2b0e
--- /dev/null
+++ b/xfa/fgas/localization/fgas_localeimp.h
@@ -0,0 +1,122 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
+#define XFA_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
+
+#include "xfa/fgas/localization/fgas_locale.h"
+
+class CFX_LCNumeric;
+
+class CFX_Locale : public IFX_Locale {
+ public:
+  CFX_Locale(CXML_Element* pLocaleData);
+  virtual void Release() { delete this; }
+
+  virtual CFX_WideString GetName();
+  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                 CFX_WideString& wsNumSymbol) const;
+
+  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
+  virtual void GetMonthName(int32_t nMonth,
+                            CFX_WideString& wsMonthName,
+                            FX_BOOL bAbbr = TRUE) const;
+  virtual void GetDayName(int32_t nWeek,
+                          CFX_WideString& wsDayName,
+                          FX_BOOL bAbbr = TRUE) const;
+  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                               FX_BOOL bAM = TRUE) const;
+  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
+  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
+
+  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                             CFX_WideString& wsPattern) const;
+
+ protected:
+  virtual ~CFX_Locale();
+  CXML_Element* m_pElement;
+};
+
+class CFX_FormatString : public IFX_FormatString {
+ public:
+  CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID);
+  virtual void Release() { delete this; }
+
+  virtual void SplitFormatString(const CFX_WideString& wsFormatString,
+                                 CFX_WideStringArray& wsPatterns);
+  virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern);
+  virtual FX_WORD GetLCID(const CFX_WideString& wsPattern);
+  virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern);
+  virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsValue);
+  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
+                           const CFX_WideString& wsPattern,
+                           FX_FLOAT& fValue);
+  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
+                           const CFX_WideString& wsPattern,
+                           CFX_WideString& wsValue);
+  virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime,
+                                const CFX_WideString& wsPattern,
+                                FX_DATETIMETYPE eDateTimeType,
+                                CFX_Unitime& dtValue);
+  virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern);
+  virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText,
+                            const CFX_WideString& wsPattern);
+  virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText,
+                             const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatNum(FX_FLOAT fNum,
+                            const CFX_WideString& wsPattern,
+                            CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput,
+                                 FX_DATETIMETYPE eDateTimeType);
+  virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt,
+                                 const CFX_WideString& wsPattern,
+                                 CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput);
+  virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern,
+                             CFX_WideString& wsOutput);
+
+ protected:
+  virtual ~CFX_FormatString();
+  IFX_Locale* GetTextFormat(const CFX_WideString& wsPattern,
+                            const CFX_WideStringC& wsCategory,
+                            CFX_WideString& wsPurgePattern);
+  IFX_Locale* GetNumericFormat(const CFX_WideString& wsPattern,
+                               int32_t& iDotIndex,
+                               FX_DWORD& dwStyle,
+                               CFX_WideString& wsPurgePattern);
+  FX_BOOL FormatStrNum(const CFX_WideStringC& wsInputNum,
+                       const CFX_WideString& wsPattern,
+                       CFX_WideString& wsOutput);
+  FX_BOOL FormatLCNumeric(CFX_LCNumeric& lcNum,
+                          const CFX_WideString& wsPattern,
+                          CFX_WideString& wsOutput);
+  FX_DATETIMETYPE GetDateTimeFormat(const CFX_WideString& wsPattern,
+                                    IFX_Locale*& pLocale,
+                                    CFX_WideString& wsDatePattern,
+                                    CFX_WideString& wsTimePattern);
+  IFX_Locale* GetPatternLocale(const CFX_WideStringC& wsLocale);
+  IFX_LocaleMgr* m_pLocaleMgr;
+  FX_BOOL m_bUseLCID;
+};
+
+#endif  // XFA_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
diff --git a/xfa/fgas/localization/fgas_localemgr.cpp b/xfa/fgas/localization/fgas_localemgr.cpp
new file mode 100644
index 0000000..4ed8ddb
--- /dev/null
+++ b/xfa/fgas/localization/fgas_localemgr.cpp
@@ -0,0 +1,97 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/localization/fgas_localemgr.h"
+
+#include "core/include/fxcrt/fx_xml.h"
+
+IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath,
+                                   FX_WORD wDefaultLCID) {
+  void* pPathHandle = FX_OpenFolder(pszLocalPath);
+  if (!pPathHandle) {
+    return NULL;
+  }
+  CFX_LocaleMgr* pLocaleMgr = new CFX_LocaleMgr(wDefaultLCID);
+  CFX_WideString wsFileName;
+  FX_BOOL bFolder = FALSE;
+  while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) {
+    if (!bFolder) {
+      if (wsFileName.GetLength() < 4) {
+        continue;
+      }
+      CFX_WideString wsExt = wsFileName.Right(4);
+      wsExt.MakeLower();
+      if (wsExt != L".xml") {
+        continue;
+      }
+      CFX_WideString wsFullPath(pszLocalPath);
+      wsFullPath += L"\\" + wsFileName;
+      IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath);
+      if (!pRead) {
+        continue;
+      }
+      CXML_Element* pXmlLocale = CXML_Element::Parse(pRead);
+      pRead->Release();
+      CFX_ByteString bssp = pXmlLocale->GetNamespace();
+      if (bssp == "http://www.foxitsoftware.com/localization") {
+        CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid");
+        wchar_t* pEnd = NULL;
+        FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16);
+        if (pLocaleMgr->m_lcid2xml.GetValueAt((void*)(uintptr_t)dwLCID)) {
+          delete pXmlLocale;
+        } else {
+          pLocaleMgr->m_lcid2xml.SetAt((void*)(uintptr_t)dwLCID, pXmlLocale);
+        }
+      } else {
+        delete pXmlLocale;
+      }
+    }
+  }
+  FX_CloseFolder(pPathHandle);
+  return pLocaleMgr;
+}
+CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID) : m_wDefLCID(wDefLCID) {}
+CFX_LocaleMgr::~CFX_LocaleMgr() {
+  FX_POSITION ps = m_lcid2locale.GetStartPosition();
+  while (ps) {
+    void* plcid;
+    IFX_Locale* pLocale = NULL;
+    m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale);
+    pLocale->Release();
+  }
+  m_lcid2locale.RemoveAll();
+  ps = m_lcid2xml.GetStartPosition();
+  while (ps) {
+    void* plcid;
+    CXML_Element* pxml = NULL;
+    m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml);
+    delete pxml;
+  }
+  m_lcid2xml.RemoveAll();
+}
+FX_WORD CFX_LocaleMgr::GetDefLocaleID() {
+  return m_wDefLCID;
+}
+IFX_Locale* CFX_LocaleMgr::GetDefLocale() {
+  return GetLocale(m_wDefLCID);
+}
+IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid) {
+  IFX_Locale* pLocale =
+      (IFX_Locale*)m_lcid2locale.GetValueAt((void*)(uintptr_t)lcid);
+  if (!pLocale) {
+    CXML_Element* pxml =
+        (CXML_Element*)m_lcid2xml.GetValueAt((void*)(uintptr_t)lcid);
+    if (pxml) {
+      pLocale = IFX_Locale::Create(pxml);
+      m_lcid2locale.SetAt((void*)(uintptr_t)lcid, pLocale);
+    }
+  }
+  return pLocale;
+}
+IFX_Locale* CFX_LocaleMgr::GetLocaleByName(
+    const CFX_WideStringC& wsLocaleName) {
+  return NULL;
+}
diff --git a/xfa/fgas/localization/fgas_localemgr.h b/xfa/fgas/localization/fgas_localemgr.h
new file mode 100644
index 0000000..5ae0d73
--- /dev/null
+++ b/xfa/fgas/localization/fgas_localemgr.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
+#define XFA_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
+
+#include "xfa/fgas/localization/fgas_locale.h"
+
+class CFX_LocaleMgr : public IFX_LocaleMgr {
+ public:
+  CFX_LocaleMgr(FX_WORD wDefLCID);
+  virtual void Release() { delete this; }
+  virtual FX_WORD GetDefLocaleID();
+  virtual IFX_Locale* GetDefLocale();
+  virtual IFX_Locale* GetLocale(FX_WORD lcid);
+  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName);
+  CFX_MapPtrToPtr m_lcid2xml;
+
+ protected:
+  ~CFX_LocaleMgr();
+  CFX_MapPtrToPtr m_lcid2locale;
+  FX_WORD m_wDefLCID;
+};
+
+#endif  // XFA_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
diff --git a/xfa/fgas/xml/fgas_sax.h b/xfa/fgas/xml/fgas_sax.h
new file mode 100644
index 0000000..222b109
--- /dev/null
+++ b/xfa/fgas/xml/fgas_sax.h
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_XML_FGAS_SAX_H_
+#define XFA_FGAS_XML_FGAS_SAX_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+#define FX_SAXPARSEMODE_NotConvert_amp 0x0001
+#define FX_SAXPARSEMODE_NotConvert_lt 0x0002
+#define FX_SAXPARSEMODE_NotConvert_gt 0x0004
+#define FX_SAXPARSEMODE_NotConvert_apos 0x0008
+#define FX_SAXPARSEMODE_NotConvert_quot 0x0010
+#define FX_SAXPARSEMODE_NotConvert_sharp 0x0020
+#define FX_SAXPARSEMODE_NotSkipSpace 0x0100
+
+enum FX_SAXNODE {
+  FX_SAXNODE_Unknown = 0,
+  FX_SAXNODE_Instruction,
+  FX_SAXNODE_Declaration,
+  FX_SAXNODE_Comment,
+  FX_SAXNODE_Tag,
+  FX_SAXNODE_Text,
+  FX_SAXNODE_CharData,
+};
+
+class IFX_SAXReaderHandler {
+ public:
+  virtual ~IFX_SAXReaderHandler() {}
+  virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName,
+                           FX_SAXNODE eType,
+                           FX_DWORD dwStartPos) = 0;
+  virtual void OnTagAttribute(void* pTag,
+                              const CFX_ByteStringC& bsAttri,
+                              const CFX_ByteStringC& bsValue) = 0;
+  virtual void OnTagBreak(void* pTag) = 0;
+  virtual void OnTagData(void* pTag,
+                         FX_SAXNODE eType,
+                         const CFX_ByteStringC& bsData,
+                         FX_DWORD dwStartPos) = 0;
+  virtual void OnTagClose(void* pTag, FX_DWORD dwEndPos) = 0;
+  virtual void OnTagEnd(void* pTag,
+                        const CFX_ByteStringC& bsTagName,
+                        FX_DWORD dwEndPos) = 0;
+  virtual void OnTargetData(void* pTag,
+                            FX_SAXNODE eType,
+                            const CFX_ByteStringC& bsData,
+                            FX_DWORD dwStartPos) = 0;
+};
+
+class IFX_SAXReader {
+ public:
+  virtual ~IFX_SAXReader() {}
+  virtual void Release() = 0;
+  virtual int32_t StartParse(IFX_FileRead* pFile,
+                             FX_DWORD dwStart = 0,
+                             FX_DWORD dwLen = -1,
+                             FX_DWORD dwParseMode = 0) = 0;
+  virtual int32_t ContinueParse(IFX_Pause* pPause = NULL) = 0;
+  virtual void SkipCurrentNode() = 0;
+  virtual void SetHandler(IFX_SAXReaderHandler* pHandler) = 0;
+};
+IFX_SAXReader* FX_SAXReader_Create();
+
+#endif  // XFA_FGAS_XML_FGAS_SAX_H_
diff --git a/xfa/fgas/xml/fgas_sax_imp.cpp b/xfa/fgas/xml/fgas_sax_imp.cpp
new file mode 100644
index 0000000..f45d764
--- /dev/null
+++ b/xfa/fgas/xml/fgas_sax_imp.cpp
@@ -0,0 +1,688 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/xml/fgas_sax_imp.h"
+
+#include <algorithm>
+
+namespace {
+
+const FX_DWORD kSaxFileBufSize = 32768;
+
+}  // namespace
+
+IFX_SAXReader* FX_SAXReader_Create() {
+  return new CFX_SAXReader;
+}
+CFX_SAXFile::CFX_SAXFile()
+    : m_pFile(NULL),
+      m_dwStart(0),
+      m_dwEnd(0),
+      m_dwCur(0),
+      m_pBuf(NULL),
+      m_dwBufSize(0),
+      m_dwBufIndex(0) {}
+FX_BOOL CFX_SAXFile::StartFile(IFX_FileRead* pFile,
+                               FX_DWORD dwStart,
+                               FX_DWORD dwLen) {
+  FXSYS_assert(m_pFile == NULL && pFile != NULL);
+  FX_DWORD dwSize = pFile->GetSize();
+  if (dwStart >= dwSize) {
+    return FALSE;
+  }
+  if (dwLen == -1 || dwStart + dwLen > dwSize) {
+    dwLen = dwSize - dwStart;
+  }
+  if (dwLen == 0) {
+    return FALSE;
+  }
+  m_dwBufSize = std::min(dwLen, kSaxFileBufSize);
+  m_pBuf = FX_Alloc(uint8_t, m_dwBufSize);
+  if (!pFile->ReadBlock(m_pBuf, dwStart, m_dwBufSize)) {
+    return FALSE;
+  }
+  m_dwStart = dwStart;
+  m_dwEnd = dwStart + dwLen;
+  m_dwCur = dwStart;
+  m_pFile = pFile;
+  m_dwBufIndex = 0;
+  return TRUE;
+}
+FX_BOOL CFX_SAXFile::ReadNextBlock() {
+  FXSYS_assert(m_pFile != NULL);
+  FX_DWORD dwSize = m_dwEnd - m_dwCur;
+  if (dwSize == 0) {
+    return FALSE;
+  }
+  m_dwBufSize = std::min(dwSize, kSaxFileBufSize);
+  if (!m_pFile->ReadBlock(m_pBuf, m_dwCur, m_dwBufSize)) {
+    return FALSE;
+  }
+  m_dwBufIndex = 0;
+  return TRUE;
+}
+void CFX_SAXFile::Reset() {
+  if (m_pBuf) {
+    FX_Free(m_pBuf);
+    m_pBuf = NULL;
+  }
+  m_pFile = NULL;
+}
+CFX_SAXReader::CFX_SAXReader()
+    : m_File(),
+      m_pHandler(nullptr),
+      m_iState(-1),
+      m_pRoot(nullptr),
+      m_pCurItem(nullptr),
+      m_dwItemID(0),
+      m_iDataSize(256),
+      m_iNameSize(256),
+      m_dwParseMode(0),
+      m_pCommentContext(nullptr) {
+  m_pszData = FX_Alloc(uint8_t, m_iDataSize);
+  m_pszName = FX_Alloc(uint8_t, m_iNameSize);
+}
+CFX_SAXReader::~CFX_SAXReader() {
+  Reset();
+  if (m_pszData) {
+    FX_Free(m_pszData);
+    m_pszData = NULL;
+  }
+  if (m_pszName) {
+    FX_Free(m_pszName);
+    m_pszName = NULL;
+  }
+}
+void CFX_SAXReader::Reset() {
+  m_File.Reset();
+  CFX_SAXItem* pItem = m_pRoot;
+  while (pItem) {
+    CFX_SAXItem* pNext = pItem->m_pNext;
+    delete pItem;
+    pItem = pNext;
+  }
+  m_pRoot = NULL;
+  m_pCurItem = NULL;
+  m_dwItemID = 0;
+  m_SkipStack.RemoveAll();
+  m_SkipChar = 0;
+  m_iDataLength = 0;
+  m_iEntityStart = -1;
+  m_iNameLength = 0;
+  m_iDataPos = 0;
+  if (m_pCommentContext) {
+    delete m_pCommentContext;
+    m_pCommentContext = NULL;
+  }
+}
+inline void CFX_SAXReader::Push() {
+  CFX_SAXItem* pNew = new CFX_SAXItem;
+  pNew->m_dwID = ++m_dwItemID;
+  pNew->m_bSkip = m_pCurItem->m_bSkip;
+  pNew->m_pPrev = m_pCurItem;
+  m_pCurItem->m_pNext = pNew;
+  m_pCurItem = pNew;
+}
+inline void CFX_SAXReader::Pop() {
+  if (!m_pCurItem) {
+    return;
+  }
+  CFX_SAXItem* pPrev = m_pCurItem->m_pPrev;
+  pPrev->m_pNext = NULL;
+  delete m_pCurItem;
+  m_pCurItem = pPrev;
+}
+inline void CFX_SAXReader::AppendData(uint8_t ch) {
+  ReallocDataBuffer();
+  m_pszData[m_iDataPos++] = ch;
+}
+inline void CFX_SAXReader::AppendName(uint8_t ch) {
+  ReallocNameBuffer();
+  m_pszName[m_iDataPos++] = ch;
+}
+void CFX_SAXReader::ReallocDataBuffer() {
+  if (m_iDataPos < m_iDataSize) {
+    return;
+  }
+  if (m_iDataSize <= 1024 * 1024) {
+    m_iDataSize *= 2;
+  } else {
+    m_iDataSize += 1024 * 1024;
+  }
+  m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize);
+}
+void CFX_SAXReader::ReallocNameBuffer() {
+  if (m_iDataPos < m_iNameSize) {
+    return;
+  }
+  if (m_iNameSize <= 1024 * 1024) {
+    m_iNameSize *= 2;
+  } else {
+    m_iNameSize += 1024 * 1024;
+  }
+  m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize);
+}
+inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) {
+  return (m_dwParseMode & FX_SAXPARSEMODE_NotSkipSpace) == 0 && ch < 0x21;
+}
+int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile,
+                                  FX_DWORD dwStart,
+                                  FX_DWORD dwLen,
+                                  FX_DWORD dwParseMode) {
+  m_iState = -1;
+  Reset();
+  if (!m_File.StartFile(pFile, dwStart, dwLen)) {
+    return -1;
+  }
+  m_iState = 0;
+  m_eMode = FX_SAXMODE_Text;
+  m_ePrevMode = FX_SAXMODE_Text;
+  m_bCharData = FALSE;
+  m_dwDataOffset = 0;
+  m_pRoot = m_pCurItem = new CFX_SAXItem;
+  m_pCurItem->m_dwID = ++m_dwItemID;
+  m_dwParseMode = dwParseMode;
+  return 0;
+}
+typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)();
+static const FX_SAXReader_LPFParse g_FX_SAXReader_LPFParse[FX_SAXMODE_MAX] = {
+    &CFX_SAXReader::ParseText,
+    &CFX_SAXReader::ParseNodeStart,
+    &CFX_SAXReader::ParseDeclOrComment,
+    &CFX_SAXReader::ParseDeclNode,
+    &CFX_SAXReader::ParseComment,
+    &CFX_SAXReader::ParseCommentContent,
+    &CFX_SAXReader::ParseTagName,
+    &CFX_SAXReader::ParseTagAttributeName,
+    &CFX_SAXReader::ParseTagAttributeEqual,
+    &CFX_SAXReader::ParseTagAttributeValue,
+    &CFX_SAXReader::ParseMaybeClose,
+    &CFX_SAXReader::ParseTagClose,
+    &CFX_SAXReader::ParseTagEnd,
+    &CFX_SAXReader::ParseTargetData,
+};
+int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) {
+  if (m_iState < 0 || m_iState > 99) {
+    return m_iState;
+  }
+  while (m_File.m_dwCur < m_File.m_dwEnd) {
+    FX_DWORD& index = m_File.m_dwBufIndex;
+    FX_DWORD size = m_File.m_dwBufSize;
+    const uint8_t* pBuf = m_File.m_pBuf;
+    while (index < size) {
+      m_CurByte = pBuf[index];
+      (this->*g_FX_SAXReader_LPFParse[m_eMode])();
+      index++;
+    }
+    m_File.m_dwCur += index;
+    m_iState = (m_File.m_dwCur - m_File.m_dwStart) * 100 /
+               (m_File.m_dwEnd - m_File.m_dwStart);
+    if (m_File.m_dwCur >= m_File.m_dwEnd) {
+      break;
+    }
+    if (!m_File.ReadNextBlock()) {
+      m_iState = -2;
+      break;
+    }
+    m_dwDataOffset = 0;
+    if (pPause && pPause->NeedToPauseNow()) {
+      break;
+    }
+  }
+  return m_iState;
+}
+void CFX_SAXReader::ParseChar(uint8_t ch) {
+  ReallocDataBuffer();
+  m_pszData[m_iDataPos] = ch;
+  if (m_iEntityStart > -1 && ch == ';') {
+    int32_t iSaveEntityStart = m_iEntityStart;
+    CFX_ByteString csEntity(m_pszData + m_iEntityStart + 1,
+                            m_iDataPos - m_iEntityStart - 1);
+    int32_t iLen = csEntity.GetLength();
+    if (iLen > 0) {
+      if (csEntity[0] == '#') {
+        if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_sharp) == 0) {
+          ch = 0;
+          uint8_t w;
+          if (iLen > 1 && csEntity[1] == 'x') {
+            for (int32_t i = 2; i < iLen; i++) {
+              w = csEntity[i];
+              if (w >= '0' && w <= '9') {
+                ch = (ch << 4) + w - '0';
+              } else if (w >= 'A' && w <= 'F') {
+                ch = (ch << 4) + w - 55;
+              } else if (w >= 'a' && w <= 'f') {
+                ch = (ch << 4) + w - 87;
+              } else {
+                break;
+              }
+            }
+          } else {
+            for (int32_t i = 1; i < iLen; i++) {
+              w = csEntity[i];
+              if (w < '0' || w > '9') {
+                break;
+              }
+              ch = ch * 10 + w - '0';
+            }
+          }
+          if (ch != 0) {
+            m_pszData[m_iEntityStart++] = ch;
+          }
+        }
+      } else {
+        if (csEntity.Compare("amp") == 0) {
+          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_amp) == 0) {
+            m_pszData[m_iEntityStart++] = '&';
+          }
+        } else if (csEntity.Compare("lt") == 0) {
+          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_lt) == 0) {
+            m_pszData[m_iEntityStart++] = '<';
+          }
+        } else if (csEntity.Compare("gt") == 0) {
+          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_gt) == 0) {
+            m_pszData[m_iEntityStart++] = '>';
+          }
+        } else if (csEntity.Compare("apos") == 0) {
+          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_apos) == 0) {
+            m_pszData[m_iEntityStart++] = '\'';
+          }
+        } else if (csEntity.Compare("quot") == 0) {
+          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_quot) == 0) {
+            m_pszData[m_iEntityStart++] = '\"';
+          }
+        }
+      }
+    }
+    if (iSaveEntityStart != m_iEntityStart) {
+      m_iDataPos = m_iEntityStart;
+      m_iEntityStart = -1;
+    } else {
+      m_iDataPos++;
+      m_iEntityStart = -1;
+    }
+  } else {
+    if (m_iEntityStart < 0 && ch == '&') {
+      m_iEntityStart = m_iDataPos;
+    }
+    m_iDataPos++;
+  }
+}
+void CFX_SAXReader::ParseText() {
+  if (m_CurByte == '<') {
+    if (m_iDataPos > 0) {
+      m_iDataLength = m_iDataPos;
+      m_iDataPos = 0;
+      if (m_pHandler) {
+        NotifyData();
+      }
+    }
+    Push();
+    m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
+    m_eMode = FX_SAXMODE_NodeStart;
+    return;
+  }
+  if (m_iDataPos < 1 && SkipSpace(m_CurByte)) {
+    return;
+  }
+  ParseChar(m_CurByte);
+}
+void CFX_SAXReader::ParseNodeStart() {
+  if (m_CurByte == '?') {
+    m_pCurItem->m_eNode = FX_SAXNODE_Instruction;
+    m_eMode = FX_SAXMODE_TagName;
+    return;
+  }
+  if (m_CurByte == '!') {
+    m_eMode = FX_SAXMODE_DeclOrComment;
+    return;
+  }
+  if (m_CurByte == '/') {
+    m_eMode = FX_SAXMODE_TagEnd;
+    return;
+  }
+  if (m_CurByte == '>') {
+    Pop();
+    m_eMode = FX_SAXMODE_Text;
+    return;
+  }
+  if (m_CurByte > 0x20) {
+    m_dwDataOffset = m_File.m_dwBufIndex;
+    m_pCurItem->m_eNode = FX_SAXNODE_Tag;
+    m_eMode = FX_SAXMODE_TagName;
+    AppendData(m_CurByte);
+  }
+}
+void CFX_SAXReader::ParseDeclOrComment() {
+  if (m_CurByte == '-') {
+    m_eMode = FX_SAXMODE_Comment;
+    m_pCurItem->m_eNode = FX_SAXNODE_Comment;
+    if (m_pCommentContext == NULL) {
+      m_pCommentContext = new CFX_SAXCommentContext;
+    }
+    m_pCommentContext->m_iHeaderCount = 1;
+    m_pCommentContext->m_iTailCount = 0;
+  } else {
+    m_eMode = FX_SAXMODE_DeclNode;
+    m_dwDataOffset = m_File.m_dwBufIndex;
+    m_SkipChar = '>';
+    m_SkipStack.Add('>');
+    SkipNode();
+  }
+}
+void CFX_SAXReader::ParseComment() {
+  m_pCommentContext->m_iHeaderCount = 2;
+  m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
+  m_eMode = FX_SAXMODE_CommentContent;
+}
+void CFX_SAXReader::ParseCommentContent() {
+  if (m_CurByte == '-') {
+    m_pCommentContext->m_iTailCount++;
+  } else if (m_CurByte == '>' && m_pCommentContext->m_iTailCount == 2) {
+    m_iDataLength = m_iDataPos;
+    m_iDataPos = 0;
+    if (m_pHandler) {
+      NotifyTargetData();
+    }
+    Pop();
+    m_eMode = FX_SAXMODE_Text;
+  } else {
+    while (m_pCommentContext->m_iTailCount > 0) {
+      AppendData('-');
+      m_pCommentContext->m_iTailCount--;
+    }
+    AppendData(m_CurByte);
+  }
+}
+void CFX_SAXReader::ParseDeclNode() {
+  SkipNode();
+}
+void CFX_SAXReader::ParseTagName() {
+  if (m_CurByte < 0x21 || m_CurByte == '/' || m_CurByte == '>' ||
+      m_CurByte == '?') {
+    m_iDataLength = m_iDataPos;
+    m_iDataPos = 0;
+    if (m_pHandler) {
+      NotifyEnter();
+    }
+    if (m_CurByte < 0x21) {
+      m_eMode = FX_SAXMODE_TagAttributeName;
+    } else if (m_CurByte == '/' || m_CurByte == '?') {
+      m_ePrevMode = m_eMode;
+      m_eMode = FX_SAXMODE_TagMaybeClose;
+    } else {
+      if (m_pHandler) {
+        NotifyBreak();
+      }
+      m_eMode = FX_SAXMODE_Text;
+    }
+  } else {
+    AppendData(m_CurByte);
+  }
+}
+void CFX_SAXReader::ParseTagAttributeName() {
+  if (m_CurByte < 0x21 || m_CurByte == '=') {
+    if (m_iDataPos < 1 && m_CurByte < 0x21) {
+      return;
+    }
+    m_iNameLength = m_iDataPos;
+    m_iDataPos = 0;
+    m_SkipChar = 0;
+    m_eMode = m_CurByte == '=' ? FX_SAXMODE_TagAttributeValue
+                               : FX_SAXMODE_TagAttributeEqual;
+    return;
+  }
+  if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') {
+    if (m_CurByte == '/' || m_CurByte == '?') {
+      m_ePrevMode = m_eMode;
+      m_eMode = FX_SAXMODE_TagMaybeClose;
+    } else {
+      if (m_pHandler) {
+        NotifyBreak();
+      }
+      m_eMode = FX_SAXMODE_Text;
+    }
+    return;
+  }
+  if (m_iDataPos < 1) {
+    m_dwDataOffset = m_File.m_dwBufIndex;
+  }
+  AppendName(m_CurByte);
+}
+void CFX_SAXReader::ParseTagAttributeEqual() {
+  if (m_CurByte == '=') {
+    m_SkipChar = 0;
+    m_eMode = FX_SAXMODE_TagAttributeValue;
+    return;
+  } else if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+    m_iDataPos = m_iNameLength;
+    AppendName(0x20);
+    m_eMode = FX_SAXMODE_TargetData;
+    ParseTargetData();
+  }
+}
+void CFX_SAXReader::ParseTagAttributeValue() {
+  if (m_SkipChar) {
+    if (m_SkipChar == m_CurByte) {
+      {
+        m_iDataLength = m_iDataPos;
+        m_iDataPos = 0;
+        if (m_pHandler) {
+          NotifyAttribute();
+        }
+      }
+      m_SkipChar = 0;
+      m_eMode = FX_SAXMODE_TagAttributeName;
+      return;
+    }
+    ParseChar(m_CurByte);
+    return;
+  }
+  if (m_CurByte < 0x21) {
+    return;
+  }
+  if (m_iDataPos < 1) {
+    if (m_CurByte == '\'' || m_CurByte == '\"') {
+      m_SkipChar = m_CurByte;
+    }
+  }
+}
+void CFX_SAXReader::ParseMaybeClose() {
+  if (m_CurByte == '>') {
+    if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+      m_iNameLength = m_iDataPos;
+      m_iDataPos = 0;
+      if (m_pHandler) {
+        NotifyTargetData();
+      }
+    }
+    ParseTagClose();
+    m_eMode = FX_SAXMODE_Text;
+  } else if (m_ePrevMode == FX_SAXMODE_TagName) {
+    AppendData('/');
+    m_eMode = FX_SAXMODE_TagName;
+    m_ePrevMode = FX_SAXMODE_Text;
+    ParseTagName();
+  } else if (m_ePrevMode == FX_SAXMODE_TagAttributeName) {
+    AppendName('/');
+    m_eMode = FX_SAXMODE_TagAttributeName;
+    m_ePrevMode = FX_SAXMODE_Text;
+    ParseTagAttributeName();
+  } else if (m_ePrevMode == FX_SAXMODE_TargetData) {
+    AppendName('?');
+    m_eMode = FX_SAXMODE_TargetData;
+    m_ePrevMode = FX_SAXMODE_Text;
+    ParseTargetData();
+  }
+}
+void CFX_SAXReader::ParseTagClose() {
+  m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
+  if (m_pHandler) {
+    NotifyClose();
+  }
+  Pop();
+}
+void CFX_SAXReader::ParseTagEnd() {
+  if (m_CurByte < 0x21) {
+    return;
+  }
+  if (m_CurByte == '>') {
+    Pop();
+    m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
+    m_iDataLength = m_iDataPos;
+    m_iDataPos = 0;
+    if (m_pHandler) {
+      NotifyEnd();
+    }
+    Pop();
+    m_eMode = FX_SAXMODE_Text;
+  } else {
+    ParseChar(m_CurByte);
+  }
+}
+void CFX_SAXReader::ParseTargetData() {
+  if (m_CurByte == '?') {
+    m_ePrevMode = m_eMode;
+    m_eMode = FX_SAXMODE_TagMaybeClose;
+  } else {
+    AppendName(m_CurByte);
+  }
+}
+void CFX_SAXReader::SkipNode() {
+  int32_t iLen = m_SkipStack.GetSize();
+  if (m_SkipChar == '\'' || m_SkipChar == '\"') {
+    if (m_CurByte != m_SkipChar) {
+      return;
+    }
+    iLen--;
+    FXSYS_assert(iLen > -1);
+    m_SkipStack.RemoveAt(iLen, 1);
+    m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
+    return;
+  }
+  switch (m_CurByte) {
+    case '<':
+      m_SkipChar = '>';
+      m_SkipStack.Add('>');
+      break;
+    case '[':
+      m_SkipChar = ']';
+      m_SkipStack.Add(']');
+      break;
+    case '(':
+      m_SkipChar = ')';
+      m_SkipStack.Add(')');
+      break;
+    case '\'':
+      m_SkipChar = '\'';
+      m_SkipStack.Add('\'');
+      break;
+    case '\"':
+      m_SkipChar = '\"';
+      m_SkipStack.Add('\"');
+      break;
+    default:
+      if (m_CurByte == m_SkipChar) {
+        iLen--;
+        m_SkipStack.RemoveAt(iLen, 1);
+        m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
+        if (iLen == 0 && m_CurByte == '>') {
+          m_iDataLength = m_iDataPos;
+          m_iDataPos = 0;
+          if (m_iDataLength >= 9 &&
+              FXSYS_memcmp(m_pszData, "[CDATA[", 7 * sizeof(uint8_t)) == 0 &&
+              FXSYS_memcmp(m_pszData + m_iDataLength - 2, "]]",
+                           2 * sizeof(uint8_t)) == 0) {
+            Pop();
+            m_iDataLength -= 9;
+            m_dwDataOffset += 7;
+            FXSYS_memmove(m_pszData, m_pszData + 7,
+                          m_iDataLength * sizeof(uint8_t));
+            m_bCharData = TRUE;
+            if (m_pHandler) {
+              NotifyData();
+            }
+            m_bCharData = FALSE;
+          } else {
+            Pop();
+          }
+          m_eMode = FX_SAXMODE_Text;
+        }
+      }
+      break;
+  }
+  if (iLen > 0) {
+    ParseChar(m_CurByte);
+  }
+}
+void CFX_SAXReader::NotifyData() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag)
+    m_pHandler->OnTagData(m_pCurItem->m_pNode,
+                          m_bCharData ? FX_SAXNODE_CharData : FX_SAXNODE_Text,
+                          CFX_ByteStringC(m_pszData, m_iDataLength),
+                          m_File.m_dwCur + m_dwDataOffset);
+}
+void CFX_SAXReader::NotifyEnter() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
+      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+    m_pCurItem->m_pNode =
+        m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength),
+                               m_pCurItem->m_eNode, m_dwNodePos);
+  }
+}
+void CFX_SAXReader::NotifyAttribute() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
+      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+    m_pHandler->OnTagAttribute(m_pCurItem->m_pNode,
+                               CFX_ByteStringC(m_pszName, m_iNameLength),
+                               CFX_ByteStringC(m_pszData, m_iDataLength));
+  }
+}
+void CFX_SAXReader::NotifyBreak() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) {
+    m_pHandler->OnTagBreak(m_pCurItem->m_pNode);
+  }
+}
+void CFX_SAXReader::NotifyClose() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
+      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+    m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos);
+  }
+}
+void CFX_SAXReader::NotifyEnd() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) {
+    m_pHandler->OnTagEnd(m_pCurItem->m_pNode,
+                         CFX_ByteStringC(m_pszData, m_iDataLength),
+                         m_dwNodePos);
+  }
+}
+void CFX_SAXReader::NotifyTargetData() {
+  FXSYS_assert(m_pHandler != NULL);
+  if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
+    m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode,
+                             CFX_ByteStringC(m_pszName, m_iNameLength),
+                             m_dwNodePos);
+  } else if (m_pCurItem->m_eNode == FX_SAXNODE_Comment) {
+    m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode,
+                             CFX_ByteStringC(m_pszData, m_iDataLength),
+                             m_dwNodePos);
+  }
+}
+void CFX_SAXReader::SkipCurrentNode() {
+  if (!m_pCurItem) {
+    return;
+  }
+  m_pCurItem->m_bSkip = TRUE;
+}
+void CFX_SAXReader::SetHandler(IFX_SAXReaderHandler* pHandler) {
+  m_pHandler = pHandler;
+}
diff --git a/xfa/fgas/xml/fgas_sax_imp.h b/xfa/fgas/xml/fgas_sax_imp.h
new file mode 100644
index 0000000..1d21617
--- /dev/null
+++ b/xfa/fgas/xml/fgas_sax_imp.h
@@ -0,0 +1,141 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_XML_FGAS_SAX_IMP_H_
+#define XFA_FGAS_XML_FGAS_SAX_IMP_H_
+
+#include "xfa/fgas/xml/fgas_sax.h"
+
+class CFX_SAXFile {
+ public:
+  CFX_SAXFile();
+  FX_BOOL StartFile(IFX_FileRead* pFile, FX_DWORD dwStart, FX_DWORD dwLen);
+  FX_BOOL ReadNextBlock();
+  void Reset();
+  IFX_FileRead* m_pFile;
+  FX_DWORD m_dwStart;
+  FX_DWORD m_dwEnd;
+  FX_DWORD m_dwCur;
+  uint8_t* m_pBuf;
+  FX_DWORD m_dwBufSize;
+  FX_DWORD m_dwBufIndex;
+};
+
+enum FX_SAXMODE {
+  FX_SAXMODE_Text = 0,
+  FX_SAXMODE_NodeStart,
+  FX_SAXMODE_DeclOrComment,
+  FX_SAXMODE_DeclNode,
+  FX_SAXMODE_Comment,
+  FX_SAXMODE_CommentContent,
+  FX_SAXMODE_TagName,
+  FX_SAXMODE_TagAttributeName,
+  FX_SAXMODE_TagAttributeEqual,
+  FX_SAXMODE_TagAttributeValue,
+  FX_SAXMODE_TagMaybeClose,
+  FX_SAXMODE_TagClose,
+  FX_SAXMODE_TagEnd,
+  FX_SAXMODE_TargetData,
+  FX_SAXMODE_MAX,
+};
+
+class CFX_SAXItem {
+ public:
+  CFX_SAXItem()
+      : m_pNode(NULL),
+        m_eNode(FX_SAXNODE_Unknown),
+        m_dwID(0),
+        m_bSkip(FALSE),
+        m_pPrev(NULL),
+        m_pNext(NULL) {}
+  void* m_pNode;
+  FX_SAXNODE m_eNode;
+  FX_DWORD m_dwID;
+  FX_BOOL m_bSkip;
+  CFX_SAXItem* m_pPrev;
+  CFX_SAXItem* m_pNext;
+};
+
+class CFX_SAXCommentContext {
+ public:
+  CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {}
+  int32_t m_iHeaderCount;
+  int32_t m_iTailCount;
+};
+
+class CFX_SAXReader : public IFX_SAXReader {
+ public:
+  CFX_SAXReader();
+  ~CFX_SAXReader();
+  virtual void Release() { delete this; }
+  virtual int32_t StartParse(IFX_FileRead* pFile,
+                             FX_DWORD dwStart = 0,
+                             FX_DWORD dwLen = -1,
+                             FX_DWORD dwParseMode = 0);
+  virtual int32_t ContinueParse(IFX_Pause* pPause = NULL);
+  virtual void SkipCurrentNode();
+  virtual void SetHandler(IFX_SAXReaderHandler* pHandler);
+  void AppendData(uint8_t ch);
+  void AppendName(uint8_t ch);
+  void ParseText();
+  void ParseNodeStart();
+  void ParseInstruction();
+  void ParseDeclOrComment();
+  void ParseDeclNode();
+  void ParseComment();
+  void ParseCommentContent();
+  void ParseTagName();
+  void ParseTagAttributeName();
+  void ParseTagAttributeEqual();
+  void ParseTagAttributeValue();
+  void ParseMaybeClose();
+  void ParseTagClose();
+  void ParseTagEnd();
+  void ParseTargetData();
+
+ protected:
+  CFX_SAXFile m_File;
+  IFX_SAXReaderHandler* m_pHandler;
+  int32_t m_iState;
+  CFX_SAXItem* m_pRoot;
+  CFX_SAXItem* m_pCurItem;
+  FX_DWORD m_dwItemID;
+  FX_SAXMODE m_eMode;
+  FX_SAXMODE m_ePrevMode;
+  FX_BOOL m_bCharData;
+  uint8_t m_CurByte;
+  FX_DWORD m_dwDataOffset;
+  CFX_ByteArray m_SkipStack;
+  uint8_t m_SkipChar;
+  FX_DWORD m_dwNodePos;
+  uint8_t* m_pszData;
+  int32_t m_iDataSize;
+  int32_t m_iDataLength;
+  int32_t m_iEntityStart;
+  int32_t m_iDataPos;
+  uint8_t* m_pszName;
+  int32_t m_iNameSize;
+  int32_t m_iNameLength;
+  FX_DWORD m_dwParseMode;
+  CFX_SAXCommentContext* m_pCommentContext;
+  void Reset();
+  void Push();
+  void Pop();
+  FX_BOOL SkipSpace(uint8_t ch);
+  void SkipNode();
+  void NotifyData();
+  void NotifyEnter();
+  void NotifyAttribute();
+  void NotifyBreak();
+  void NotifyClose();
+  void NotifyEnd();
+  void NotifyTargetData();
+  void ReallocDataBuffer();
+  void ReallocNameBuffer();
+  void ParseChar(uint8_t ch);
+};
+
+#endif  // XFA_FGAS_XML_FGAS_SAX_IMP_H_
diff --git a/xfa/fwl/basewidget/fwl_barcodeimp.cpp b/xfa/fwl/basewidget/fwl_barcodeimp.cpp
new file mode 100644
index 0000000..97ac8e4
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_barcodeimp.cpp
@@ -0,0 +1,221 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_barcodeimp.h"
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+// static
+IFWL_Barcode* IFWL_Barcode::Create(const CFWL_WidgetImpProperties& properties) {
+  IFWL_Barcode* pBarcode = new IFWL_Barcode;
+  CFWL_BarcodeImp* pBarcodeImpl = new CFWL_BarcodeImp(properties, nullptr);
+  pBarcode->SetImpl(pBarcodeImpl);
+  pBarcodeImpl->SetInterface(pBarcode);
+  return pBarcode;
+}
+IFWL_Barcode::IFWL_Barcode() {}
+void IFWL_Barcode::SetType(BC_TYPE type) {
+  static_cast<CFWL_BarcodeImp*>(GetImpl())->SetType(type);
+}
+FX_BOOL IFWL_Barcode::IsProtectedType() {
+  return static_cast<CFWL_BarcodeImp*>(GetImpl())->IsProtectedType();
+}
+
+CFWL_BarcodeImp::CFWL_BarcodeImp(const CFWL_WidgetImpProperties& properties,
+                                 IFWL_Widget* pOuter)
+    : CFWL_EditImp(properties, pOuter),
+      m_pBarcodeEngine(NULL),
+      m_dwStatus(0),
+      m_type(BC_UNKNOWN) {}
+CFWL_BarcodeImp::~CFWL_BarcodeImp() {
+  ReleaseBarcodeEngine();
+}
+FWL_ERR CFWL_BarcodeImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Barcode;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_BarcodeImp::GetClassID() const {
+  return FWL_CLASSHASH_Barcode;
+}
+FWL_ERR CFWL_BarcodeImp::Initialize() {
+  if (!m_pDelegate) {
+    m_pDelegate = new CFWL_BarcodeImpDelegate(this);
+  }
+  if (CFWL_EditImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_BarcodeImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  ReleaseBarcodeEngine();
+  return CFWL_EditImp::Finalize();
+}
+FWL_ERR CFWL_BarcodeImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  FWL_ERR ret = CFWL_EditImp::Update();
+  GenerateBarcodeImageCache();
+  return ret;
+}
+FWL_ERR CFWL_BarcodeImp::DrawWidget(CFX_Graphics* pGraphics,
+                                    const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    GenerateBarcodeImageCache();
+    if (!m_pBarcodeEngine || (m_dwStatus & XFA_BCS_EncodeSuccess) == 0) {
+      return FWL_ERR_Succeeded;
+    }
+    CFX_Matrix mt;
+    mt.e = m_rtClient.left;
+    mt.f = m_rtClient.top;
+    if (pMatrix) {
+      mt.Concat(*pMatrix);
+    }
+    int32_t errorCode = 0;
+    if (!m_pBarcodeEngine->RenderDevice(pGraphics->GetRenderDevice(), pMatrix,
+                                        errorCode)) {
+      return FWL_ERR_Indefinite;
+    }
+    return FWL_ERR_Succeeded;
+  }
+  return CFWL_EditImp::DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_BarcodeImp::GenerateBarcodeImageCache() {
+  if ((m_dwStatus & XFA_BCS_NeedUpdate) == 0)
+    return;
+  m_dwStatus = 0;
+  CreateBarcodeEngine();
+  IFWL_BarcodeDP* pData =
+      static_cast<IFWL_BarcodeDP*>(m_pProperties->m_pDataProvider);
+  if (!pData)
+    return;
+  if (!m_pBarcodeEngine)
+    return;
+  CFX_WideString wsText;
+  if (GetText(wsText) != FWL_ERR_Succeeded)
+    return;
+  CFWL_ThemePart part;
+  part.m_pWidget = m_pInterface;
+  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
+  IFX_Font* pFont =
+      static_cast<IFX_Font*>(pTheme->GetCapacity(&part, FWL_WGTCAPACITY_Font));
+  CFX_Font* pCXFont =
+      pFont ? static_cast<CFX_Font*>(pFont->GetDevFont()) : nullptr;
+  if (pCXFont) {
+    m_pBarcodeEngine->SetFont(pCXFont);
+  }
+  FX_FLOAT* pFontSize = static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FontSize));
+  if (pFontSize) {
+    m_pBarcodeEngine->SetFontSize(*pFontSize);
+  }
+  FX_ARGB* pFontColor = static_cast<FX_ARGB*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_TextColor));
+  if (pFontColor) {
+    m_pBarcodeEngine->SetFontColor(*pFontColor);
+  }
+  m_pBarcodeEngine->SetHeight(int32_t(m_rtClient.height));
+  m_pBarcodeEngine->SetWidth(int32_t(m_rtClient.width));
+  FX_DWORD dwAttributeMask = pData->GetBarcodeAttributeMask();
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_CHARENCODING) {
+    m_pBarcodeEngine->SetCharEncoding(pData->GetCharEncoding());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEHEIGHT) {
+    m_pBarcodeEngine->SetModuleHeight(pData->GetModuleHeight());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEWIDTH) {
+    m_pBarcodeEngine->SetModuleWidth(pData->GetModuleWidth());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_DATALENGTH) {
+    m_pBarcodeEngine->SetDataLength(pData->GetDataLength());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_CALCHECKSUM) {
+    m_pBarcodeEngine->SetCalChecksum(pData->GetCalChecksum());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_PRINTCHECKSUM) {
+    m_pBarcodeEngine->SetPrintChecksum(pData->GetPrintChecksum());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_TEXTLOCATION) {
+    m_pBarcodeEngine->SetTextLocation(pData->GetTextLocation());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_WIDENARROWRATIO) {
+    m_pBarcodeEngine->SetWideNarrowRatio(pData->GetWideNarrowRatio());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_STARTCHAR) {
+    m_pBarcodeEngine->SetStartChar(pData->GetStartChar());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_ENDCHAR) {
+    m_pBarcodeEngine->SetEndChar(pData->GetEndChar());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_VERSION) {
+    m_pBarcodeEngine->SetVersion(pData->GetVersion());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_ECLEVEL) {
+    m_pBarcodeEngine->SetErrorCorrectionLevel(pData->GetErrorCorrectionLevel());
+  }
+  if (dwAttributeMask & FWL_BCDATTRIBUTE_TRUNCATED) {
+    m_pBarcodeEngine->SetTruncated(pData->GetTruncated());
+  }
+  int32_t errorCode = 0;
+  m_dwStatus = m_pBarcodeEngine->Encode(wsText, TRUE, errorCode)
+                   ? XFA_BCS_EncodeSuccess
+                   : 0;
+}
+void CFWL_BarcodeImp::CreateBarcodeEngine() {
+  if ((m_pBarcodeEngine == NULL) && (m_type != BC_UNKNOWN)) {
+    m_pBarcodeEngine = FX_Barcode_Create(m_type);
+  }
+}
+void CFWL_BarcodeImp::ReleaseBarcodeEngine() {
+  if (m_pBarcodeEngine) {
+    m_pBarcodeEngine->Release();
+    m_pBarcodeEngine = NULL;
+  }
+}
+void CFWL_BarcodeImp::SetType(BC_TYPE type) {
+  if (m_type == type) {
+    return;
+  }
+  ReleaseBarcodeEngine();
+  m_type = type;
+  m_dwStatus = XFA_BCS_NeedUpdate;
+}
+FWL_ERR CFWL_BarcodeImp::SetText(const CFX_WideString& wsText) {
+  ReleaseBarcodeEngine();
+  m_dwStatus = XFA_BCS_NeedUpdate;
+  return CFWL_EditImp::SetText(wsText);
+}
+FX_BOOL CFWL_BarcodeImp::IsProtectedType() {
+  if (!m_pBarcodeEngine) {
+    return TRUE;
+  }
+  BC_TYPE tEngineType = m_pBarcodeEngine->GetType();
+  if (tEngineType == BC_QR_CODE || tEngineType == BC_PDF417 ||
+      tEngineType == BC_DATAMATRIX) {
+    return TRUE;
+  }
+  return FALSE;
+}
+CFWL_BarcodeImpDelegate::CFWL_BarcodeImpDelegate(CFWL_BarcodeImp* pOwner)
+    : CFWL_EditImpDelegate(pOwner) {}
+FWL_ERR CFWL_BarcodeImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  FX_DWORD dwFlag = pEvent->GetClassID();
+  if (dwFlag == FWL_EVTHASH_EDT_TextChanged) {
+    CFWL_BarcodeImp* pOwner = static_cast<CFWL_BarcodeImp*>(m_pOwner);
+    pOwner->ReleaseBarcodeEngine();
+    pOwner->m_dwStatus = XFA_BCS_NeedUpdate;
+  }
+  return CFWL_EditImpDelegate::OnProcessEvent(pEvent);
+}
diff --git a/xfa/fwl/basewidget/fwl_barcodeimp.h b/xfa/fwl/basewidget/fwl_barcodeimp.h
new file mode 100644
index 0000000..bf7ad91
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_barcodeimp.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/include/fwl/basewidget/fwl_barcode.h"
+#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
+#include "xfa/include/fwl/basewidget/fxmath_barcode.h"
+
+class CFWL_WidgetImpProperties;
+class CFWL_BarcodeImpDelegate;
+class IFWL_Widget;
+
+#define XFA_BCS_NeedUpdate 0x0001
+#define XFA_BCS_EncodeSuccess 0x0002
+
+class CFWL_BarcodeImp : public CFWL_EditImp {
+ public:
+  CFWL_BarcodeImp(const CFWL_WidgetImpProperties& properties,
+                  IFWL_Widget* pOuter);
+  virtual ~CFWL_BarcodeImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_ERR SetText(const CFX_WideString& wsText);
+  virtual void SetType(BC_TYPE type);
+  FX_BOOL IsProtectedType();
+
+ protected:
+  void GenerateBarcodeImageCache();
+  void CreateBarcodeEngine();
+  void ReleaseBarcodeEngine();
+  IFX_Barcode* m_pBarcodeEngine;
+  FX_DWORD m_dwStatus;
+  BC_TYPE m_type;
+  friend class CFWL_BarcodeImpDelegate;
+};
+
+class CFWL_BarcodeImpDelegate : public CFWL_EditImpDelegate {
+ public:
+  CFWL_BarcodeImpDelegate(CFWL_BarcodeImp* pOwner);
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_caretimp.cpp b/xfa/fwl/basewidget/fwl_caretimp.cpp
new file mode 100644
index 0000000..ea7402e
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_caretimp.cpp
@@ -0,0 +1,157 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_caretimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_caret.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+// static
+IFWL_Caret* IFWL_Caret::Create(const CFWL_WidgetImpProperties& properties,
+                               IFWL_Widget* pOuter) {
+  IFWL_Caret* pCaret = new IFWL_Caret;
+  CFWL_CaretImp* pCaretImpl = new CFWL_CaretImp(properties, pOuter);
+  pCaret->SetImpl(pCaretImpl);
+  pCaretImpl->SetInterface(pCaret);
+  return pCaret;
+}
+IFWL_Caret::IFWL_Caret() {}
+FWL_ERR IFWL_Caret::ShowCaret(FX_BOOL bFlag) {
+  return static_cast<CFWL_CaretImp*>(GetImpl())->ShowCaret(bFlag);
+}
+FWL_ERR IFWL_Caret::GetFrequency(FX_DWORD& elapse) {
+  return static_cast<CFWL_CaretImp*>(GetImpl())->GetFrequency(elapse);
+}
+FWL_ERR IFWL_Caret::SetFrequency(FX_DWORD elapse) {
+  return static_cast<CFWL_CaretImp*>(GetImpl())->SetFrequency(elapse);
+}
+FWL_ERR IFWL_Caret::SetColor(CFX_Color crFill) {
+  return static_cast<CFWL_CaretImp*>(GetImpl())->SetColor(crFill);
+}
+
+CFWL_CaretImp::CFWL_CaretImp(const CFWL_WidgetImpProperties& properties,
+                             IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_hTimer(nullptr),
+      m_dwElapse(400),
+      m_bSetColor(FALSE) {
+  m_pTimer = new CFWL_CaretTimer(this);
+  SetStates(FWL_STATE_CAT_HightLight);
+}
+CFWL_CaretImp::~CFWL_CaretImp() {
+  if (m_pTimer) {
+    delete m_pTimer;
+    m_pTimer = NULL;
+  }
+}
+FWL_ERR CFWL_CaretImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Caret;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_CaretImp::GetClassID() const {
+  return FWL_CLASSHASH_Caret;
+}
+FWL_ERR CFWL_CaretImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_CaretImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CaretImp::Finalize() {
+  if (m_hTimer) {
+    FWL_StopTimer(m_hTimer);
+    m_hTimer = NULL;
+  }
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_CaretImp::DrawWidget(CFX_Graphics* pGraphics,
+                                  const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CaretImp::ShowCaret(FX_BOOL bFlag) {
+  if (m_hTimer) {
+    FWL_StopTimer(m_hTimer);
+    m_hTimer = NULL;
+  }
+  if (bFlag) {
+    m_hTimer = FWL_StartTimer(m_pTimer, m_dwElapse);
+  }
+  return SetStates(FWL_WGTSTATE_Invisible, !bFlag);
+}
+FWL_ERR CFWL_CaretImp::GetFrequency(FX_DWORD& elapse) {
+  elapse = m_dwElapse;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CaretImp::SetFrequency(FX_DWORD elapse) {
+  m_dwElapse = elapse;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CaretImp::SetColor(CFX_Color crFill) {
+  m_bSetColor = TRUE;
+  m_crFill = crFill;
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_CaretImp::DrawCaretBK(CFX_Graphics* pGraphics,
+                                   IFWL_ThemeProvider* pTheme,
+                                   const CFX_Matrix* pMatrix) {
+  CFX_RectF rect;
+  GetWidgetRect(rect);
+  rect.Set(0, 0, rect.width, rect.height);
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_pGraphics = pGraphics;
+  param.m_rtPart = rect;
+  if (m_bSetColor) {
+    param.m_pData = &m_crFill;
+  }
+  if (!(m_pProperties->m_dwStates & FWL_STATE_CAT_HightLight)) {
+    return FWL_ERR_Succeeded;
+  }
+  param.m_iPart = FWL_PART_CAT_Background;
+  param.m_dwStates = FWL_PARTSTATE_CAT_HightLight;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&param);
+  return FWL_ERR_Succeeded;
+}
+
+CFWL_CaretImp::CFWL_CaretTimer::CFWL_CaretTimer(CFWL_CaretImp* pCaret)
+    : m_pCaret(pCaret) {}
+
+int32_t CFWL_CaretImp::CFWL_CaretTimer::Run(FWL_HTIMER hTimer) {
+  if (m_pCaret->GetStates() & FWL_STATE_CAT_HightLight) {
+    m_pCaret->SetStates(FWL_STATE_CAT_HightLight, FALSE);
+  } else {
+    m_pCaret->SetStates(FWL_STATE_CAT_HightLight);
+  }
+  CFX_RectF rt;
+  m_pCaret->GetWidgetRect(rt);
+  rt.Set(0, 0, rt.width + 1, rt.height);
+  m_pCaret->Repaint(&rt);
+  return 1;
+}
+CFWL_CaretImpDelegate::CFWL_CaretImpDelegate(CFWL_CaretImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_CaretImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  return 1;
+}
+FWL_ERR CFWL_CaretImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                            const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fwl/basewidget/fwl_caretimp.h b/xfa/fwl/basewidget/fwl_caretimp.h
new file mode 100644
index 0000000..d123e15
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_caretimp.h
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_CARETIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_CARETIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_CaretImpDelegate;
+
+class CFWL_CaretImp : public CFWL_WidgetImp {
+ public:
+  CFWL_CaretImp(const CFWL_WidgetImpProperties& properties,
+                IFWL_Widget* pOuter);
+  virtual ~CFWL_CaretImp();
+
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+  virtual FWL_ERR ShowCaret(FX_BOOL bFlag = TRUE);
+  virtual FWL_ERR GetFrequency(FX_DWORD& elapse);
+  virtual FWL_ERR SetFrequency(FX_DWORD elapse);
+  virtual FWL_ERR SetColor(CFX_Color crFill);
+
+ protected:
+  FX_BOOL DrawCaretBK(CFX_Graphics* pGraphics,
+                      IFWL_ThemeProvider* pTheme,
+                      const CFX_Matrix* pMatrix);
+  class CFWL_CaretTimer : public IFWL_Timer {
+   public:
+    explicit CFWL_CaretTimer(CFWL_CaretImp* pCaret);
+    ~CFWL_CaretTimer() override {}
+    int32_t Run(FWL_HTIMER hTimer) override;
+    CFWL_CaretImp* const m_pCaret;
+  };
+  CFWL_CaretTimer* m_pTimer;
+  FWL_HTIMER m_hTimer;
+  FX_DWORD m_dwElapse;
+  CFX_Color m_crFill;
+  FX_BOOL m_bSetColor;
+  friend class CFWL_CaretImpDelegate;
+  friend class CFWL_CaretTimer;
+};
+class CFWL_CaretImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_CaretImpDelegate(CFWL_CaretImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  CFWL_CaretImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_CARETIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_checkboximp.cpp b/xfa/fwl/basewidget/fwl_checkboximp.cpp
new file mode 100644
index 0000000..5912d0e
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_checkboximp.cpp
@@ -0,0 +1,555 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_checkboximp.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+#define FWL_CKB_CaptionMargin 5
+
+// static
+IFWL_CheckBox* IFWL_CheckBox::Create(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter) {
+  IFWL_CheckBox* pCheckBox = new IFWL_CheckBox;
+  CFWL_CheckBoxImp* pCheckBoxImpl = new CFWL_CheckBoxImp(properties, pOuter);
+  pCheckBox->SetImpl(pCheckBoxImpl);
+  pCheckBoxImpl->SetInterface(pCheckBox);
+  return pCheckBox;
+}
+IFWL_CheckBox::IFWL_CheckBox() {}
+int32_t IFWL_CheckBox::GetCheckState() {
+  return static_cast<CFWL_CheckBoxImp*>(GetImpl())->GetCheckState();
+}
+FWL_ERR IFWL_CheckBox::SetCheckState(int32_t iCheck) {
+  return static_cast<CFWL_CheckBoxImp*>(GetImpl())->SetCheckState(iCheck);
+}
+
+CFWL_CheckBoxImp::CFWL_CheckBoxImp(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
+      m_iTTOAlign(FDE_TTOALIGNMENT_Center),
+      m_bBtnDown(FALSE) {
+  m_rtClient.Reset();
+  m_rtBox.Reset();
+  m_rtCaption.Reset();
+  m_rtFocus.Reset();
+}
+CFWL_CheckBoxImp::~CFWL_CheckBoxImp() {}
+FWL_ERR CFWL_CheckBoxImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_CheckBox;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_CheckBoxImp::GetClassID() const {
+  return FWL_CLASSHASH_CheckBox;
+}
+FWL_ERR CFWL_CheckBoxImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_CheckBoxImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CheckBoxImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_CheckBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (!m_pProperties->m_pThemeProvider)
+      m_pProperties->m_pThemeProvider = GetAvailableTheme();
+    if (!m_pProperties->m_pThemeProvider)
+      return FWL_ERR_Indefinite;
+    if (!m_pProperties->m_pDataProvider)
+      return FWL_ERR_Indefinite;
+    CFX_WideString wsCaption;
+    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
+    if (wsCaption.GetLength() > 0) {
+      CFX_SizeF sz = CalcTextSize(
+          wsCaption, m_pProperties->m_pThemeProvider,
+          m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine);
+      rect.Set(0, 0, sz.x, sz.y);
+    }
+    rect.Inflate(FWL_CKB_CaptionMargin, FWL_CKB_CaptionMargin);
+    IFWL_CheckBoxDP* pData =
+        static_cast<IFWL_CheckBoxDP*>(m_pProperties->m_pDataProvider);
+    FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface);
+    rect.width += fCheckBox;
+    if (rect.height < fCheckBox) {
+      rect.height = fCheckBox;
+    }
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CheckBoxImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  UpdateTextOutStyles();
+  Layout();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_CheckBoxImp::DrawWidget(CFX_Graphics* pGraphics,
+                                     const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_CKB_Border, m_pProperties->m_pThemeProvider,
+               pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_CKB_Edge, pTheme, pMatrix);
+  }
+  int32_t dwStates = GetPartStates();
+  {
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_CKB_Background;
+    param.m_dwStates = dwStates;
+    param.m_pGraphics = pGraphics;
+    if (pMatrix) {
+      param.m_matrix.Concat(*pMatrix);
+    }
+    param.m_rtPart = m_rtClient;
+    if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+      param.m_pData = &m_rtFocus;
+    }
+    pTheme->DrawBackground(&param);
+    param.m_iPart = FWL_PART_CKB_CheckBox;
+    param.m_rtPart = m_rtBox;
+    pTheme->DrawBackground(&param);
+  }
+  if (!m_pProperties->m_pDataProvider)
+    return FWL_ERR_Indefinite;
+  {
+    CFX_WideString wsCaption;
+    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
+    int32_t iLen = wsCaption.GetLength();
+    if (iLen <= 0)
+      return FWL_ERR_Indefinite;
+    CFWL_ThemeText textParam;
+    textParam.m_pWidget = m_pInterface;
+    textParam.m_iPart = FWL_PART_CKB_Caption;
+    textParam.m_dwStates = dwStates;
+    textParam.m_pGraphics = pGraphics;
+    if (pMatrix) {
+      textParam.m_matrix.Concat(*pMatrix);
+    }
+    textParam.m_rtPart = m_rtCaption;
+    textParam.m_wsText = wsCaption;
+    textParam.m_dwTTOStyles = m_dwTTOStyles;
+    textParam.m_iTTOAlign = m_iTTOAlign;
+    pTheme->DrawText(&textParam);
+  }
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_CheckBoxImp::GetCheckState() {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) &&
+      ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+       FWL_STATE_CKB_Neutral)) {
+    return 2;
+  }
+  if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+      FWL_STATE_CKB_Checked) {
+    return 1;
+  }
+  return 0;
+}
+FWL_ERR CFWL_CheckBoxImp::SetCheckState(int32_t iCheck) {
+  m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
+  switch (iCheck) {
+    case 0: {
+      break;
+    }
+    case 1: {
+      m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
+      break;
+    }
+    case 2: {
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral;
+      }
+      break;
+    }
+    default: {}
+  }
+  Repaint(&m_rtClient);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_CheckBoxImp::Layout() {
+  int32_t width = int32_t(m_pProperties->m_rtWidget.width + 0.5f);
+  int32_t height = int32_t(m_pProperties->m_rtWidget.height + 0.5f);
+  m_pProperties->m_rtWidget.width = (FX_FLOAT)width;
+  m_pProperties->m_rtWidget.height = (FX_FLOAT)height;
+  GetClientRect(m_rtClient);
+  FX_FLOAT fBoxTop = m_rtClient.top;
+  FX_FLOAT fBoxLeft = m_rtClient.left;
+  FX_FLOAT fTextLeft = 0.0, fTextRight = 0.0;
+  FX_FLOAT fClientRight = m_rtClient.right();
+  FX_FLOAT fClientBottom = m_rtClient.bottom();
+  if (!m_pProperties->m_pDataProvider)
+    return;
+  IFWL_CheckBoxDP* pData =
+      static_cast<IFWL_CheckBoxDP*>(m_pProperties->m_pDataProvider);
+  FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface);
+  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) {
+    case FWL_STYLEEXT_CKB_Top: {
+      fBoxTop = m_rtClient.top;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Bottom: {
+      fBoxTop = fClientBottom - fCheckBox;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_VCenter:
+    default: {
+      fBoxTop = m_rtClient.top + (m_rtClient.height - fCheckBox) / 2;
+      fBoxTop = FXSYS_floor(fBoxTop);
+    }
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_LeftText) {
+    fBoxLeft = fClientRight - fCheckBox;
+    fTextLeft = m_rtClient.left;
+    fTextRight = fBoxLeft;
+  } else {
+    fTextLeft = fBoxLeft + fCheckBox;
+    fTextRight = fClientRight;
+  }
+  m_rtBox.Set(fBoxLeft, fBoxTop, fCheckBox, fCheckBox);
+  m_rtCaption.Set(fTextLeft, m_rtClient.top, fTextRight - fTextLeft,
+                  m_rtClient.height);
+  m_rtCaption.Inflate(-FWL_CKB_CaptionMargin, -FWL_CKB_CaptionMargin);
+  CFX_RectF rtFocus;
+  rtFocus.Set(m_rtCaption.left, m_rtCaption.top, m_rtCaption.width,
+              m_rtCaption.height);
+  CFX_WideString wsCaption;
+  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
+  if (wsCaption.IsEmpty()) {
+    m_rtFocus.Set(0, 0, 0, 0);
+  } else {
+    CalcTextRect(wsCaption, m_pProperties->m_pThemeProvider, m_dwTTOStyles,
+                 m_iTTOAlign, rtFocus);
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) == 0) {
+      FX_FLOAT fWidth = std::max(m_rtCaption.width, rtFocus.width);
+      FX_FLOAT fHeight = std::min(m_rtCaption.height, rtFocus.height);
+      FX_FLOAT fLeft = m_rtCaption.left;
+      FX_FLOAT fTop = m_rtCaption.top;
+      if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_HLayoutMask) ==
+          FWL_STYLEEXT_CKB_Center) {
+        fLeft = m_rtCaption.left + (m_rtCaption.width - fWidth) / 2;
+      } else if ((m_pProperties->m_dwStyleExes &
+                  FWL_STYLEEXT_CKB_HLayoutMask) == FWL_STYLEEXT_CKB_Right) {
+        fLeft = m_rtCaption.right() - fWidth;
+      }
+      if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) ==
+          FWL_STYLEEXT_CKB_VCenter) {
+        fTop = m_rtCaption.top + (m_rtCaption.height - fHeight) / 2;
+      } else if ((m_pProperties->m_dwStyleExes &
+                  FWL_STYLEEXT_CKB_VLayoutMask) == FWL_STYLEEXT_CKB_Bottom) {
+        fTop = m_rtCaption.bottom() - fHeight;
+      }
+      m_rtFocus.Set(fLeft, fTop, fWidth, fHeight);
+    } else {
+      m_rtFocus.Set(rtFocus.left, rtFocus.top, rtFocus.width, rtFocus.height);
+    }
+    m_rtFocus.Inflate(1, 1);
+  }
+}
+FX_DWORD CFWL_CheckBoxImp::GetPartStates() {
+  int32_t dwStates = FWL_PARTSTATE_CKB_UnChecked;
+  if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+      FWL_STATE_CKB_Neutral) {
+    dwStates = FWL_PARTSTATE_CKB_Neutral;
+  } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+             FWL_STATE_CKB_Checked) {
+    dwStates = FWL_PARTSTATE_CKB_Checked;
+  }
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    dwStates |= FWL_PARTSTATE_CKB_Disabled;
+  } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) {
+    dwStates |= FWL_PARTSTATE_CKB_Hovered;
+  } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
+    dwStates |= FWL_PARTSTATE_CKB_Pressed;
+  } else {
+    dwStates |= FWL_PARTSTATE_CKB_Normal;
+  }
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    dwStates |= FWL_PARTSTATE_CKB_Focused;
+  }
+  return dwStates;
+}
+void CFWL_CheckBoxImp::UpdateTextOutStyles() {
+  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  switch (m_pProperties->m_dwStyleExes &
+          (FWL_STYLEEXT_CKB_HLayoutMask | FWL_STYLEEXT_CKB_VLayoutMask)) {
+    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopRight;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter;
+      break;
+    }
+    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight;
+      break;
+    }
+    default: {}
+  }
+  m_dwTTOStyles = 0;
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) {
+    m_dwTTOStyles |= FDE_TTOSTYLE_LineWrap;
+  } else {
+    m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine;
+  }
+}
+void CFWL_CheckBoxImp::NextStates() {
+  FX_DWORD dwFirststate = m_pProperties->m_dwStates;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_RadioButton) {
+    if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+        FWL_STATE_CKB_Unchecked) {
+      CFWL_WidgetMgr* pWidgetMgr =
+          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+      if (!pWidgetMgr->IsFormDisabled()) {
+        CFX_PtrArray radioarr;
+        pWidgetMgr->GetSameGroupRadioButton(m_pInterface, radioarr);
+        IFWL_CheckBox* pCheckBox = NULL;
+        int32_t iCount = radioarr.GetSize();
+        for (int32_t i = 0; i < iCount; i++) {
+          pCheckBox = static_cast<IFWL_CheckBox*>(radioarr[i]);
+          if (pCheckBox != m_pInterface &&
+              pCheckBox->GetStates() & FWL_STATE_CKB_Checked) {
+            pCheckBox->SetCheckState(0);
+            CFX_RectF rt;
+            pCheckBox->GetWidgetRect(rt);
+            rt.left = rt.top = 0;
+            m_pWidgetMgr->RepaintWidget(pCheckBox, &rt);
+            break;
+          }
+        }
+      }
+      m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
+    }
+  } else {
+    if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+        FWL_STATE_CKB_Neutral) {
+      m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
+      }
+    } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
+               FWL_STATE_CKB_Checked) {
+      m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
+    } else {
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral;
+      } else {
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
+      }
+    }
+  }
+  Repaint(&m_rtClient);
+  FX_DWORD dwLaststate = m_pProperties->m_dwStates;
+  if (dwFirststate != dwLaststate) {
+    CFWL_EvtCkbCheckStateChanged wmCheckBoxState;
+    wmCheckBoxState.m_pSrcTarget = m_pInterface;
+    DispatchEvent(&wmCheckBoxState);
+  }
+}
+CFWL_CheckBoxImpDelegate::CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_CheckBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  int32_t iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_Activate: {
+      OnActivate(pMessage);
+      break;
+    }
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
+      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
+        OnKeyDown(pKey);
+      }
+      break;
+    }
+    default: { iRet = 0; }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_CheckBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                               const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_CheckBoxImpDelegate::OnActivate(CFWL_Message* pMsg) {
+  m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+}
+void CFWL_CheckBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                              FX_BOOL bSet) {
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+  }
+  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+}
+void CFWL_CheckBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    return;
+  }
+  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    m_pOwner->SetFocus(TRUE);
+  }
+  m_pOwner->m_bBtnDown = TRUE;
+  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
+  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+}
+void CFWL_CheckBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (!m_pOwner->m_bBtnDown) {
+    return;
+  }
+  m_pOwner->m_bBtnDown = FALSE;
+  if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    return;
+  }
+  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
+  m_pOwner->NextStates();
+}
+void CFWL_CheckBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    return;
+  }
+  FX_BOOL bRepaint = FALSE;
+  if (m_pOwner->m_bBtnDown) {
+    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) == 0) {
+        bRepaint = TRUE;
+        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
+      }
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered)) {
+        bRepaint = TRUE;
+        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+      }
+    } else {
+      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
+        bRepaint = TRUE;
+        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
+      }
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
+        bRepaint = TRUE;
+        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+      }
+    }
+  } else {
+    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
+        bRepaint = TRUE;
+        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+      }
+    }
+  }
+  if (bRepaint) {
+    m_pOwner->Repaint(&(m_pOwner->m_rtBox));
+  }
+}
+void CFWL_CheckBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_bBtnDown) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+  }
+  m_pOwner->Repaint(&(m_pOwner->m_rtBox));
+}
+void CFWL_CheckBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
+    m_pOwner->DispatchKeyEvent(pMsg);
+    return;
+  }
+  if (pMsg->m_dwKeyCode == FWL_VKEY_Return ||
+      pMsg->m_dwKeyCode == FWL_VKEY_Space) {
+    m_pOwner->NextStates();
+  }
+}
diff --git a/xfa/fwl/basewidget/fwl_checkboximp.h b/xfa/fwl/basewidget/fwl_checkboximp.h
new file mode 100644
index 0000000..1f6f5f3
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_checkboximp.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_CheckBoxImpDelegate;
+
+class CFWL_CheckBoxImp : public CFWL_WidgetImp {
+ public:
+  CFWL_CheckBoxImp(const CFWL_WidgetImpProperties& properties,
+                   IFWL_Widget* pOuter);
+  ~CFWL_CheckBoxImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual int32_t GetCheckState();
+  virtual FWL_ERR SetCheckState(int32_t iCheck);
+
+ protected:
+  void Layout();
+  FX_DWORD GetPartStates();
+  void UpdateTextOutStyles();
+  void NextStates();
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtBox;
+  CFX_RectF m_rtCaption;
+  CFX_RectF m_rtFocus;
+  FX_DWORD m_dwTTOStyles;
+  int32_t m_iTTOAlign;
+  FX_BOOL m_bBtnDown;
+  friend class CFWL_CheckBoxImpDelegate;
+};
+class CFWL_CheckBoxImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnActivate(CFWL_Message* pMsg);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  CFWL_CheckBoxImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_comboboximp.cpp b/xfa/fwl/basewidget/fwl_comboboximp.cpp
new file mode 100644
index 0000000..7aae6d5
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_comboboximp.cpp
@@ -0,0 +1,1819 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_comboboximp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/fwl/basewidget/fwl_formproxyimp.h"
+#include "xfa/fwl/basewidget/fwl_listboximp.h"
+#include "xfa/fwl/basewidget/fwl_scrollbarimp.h"
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+// static
+IFWL_ComboBox* IFWL_ComboBox::Create(
+    const CFWL_WidgetImpProperties& properties) {
+  IFWL_ComboBox* pComboBox = new IFWL_ComboBox;
+  CFWL_ComboBoxImp* pComboBoxImpl = new CFWL_ComboBoxImp(properties, nullptr);
+  pComboBox->SetImpl(pComboBoxImpl);
+  pComboBoxImpl->SetInterface(pComboBox);
+  return pComboBox;
+}
+IFWL_ComboBox::IFWL_ComboBox() {}
+int32_t IFWL_ComboBox::GetCurSel() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetCurSel();
+}
+FWL_ERR IFWL_ComboBox::SetCurSel(int32_t iSel) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetCurSel(iSel);
+}
+FWL_ERR IFWL_ComboBox::SetEditText(const CFX_WideString& wsText) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetEditText(wsText);
+}
+int32_t IFWL_ComboBox::GetEditTextLength() const {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetEditTextLength();
+}
+FWL_ERR IFWL_ComboBox::GetEditText(CFX_WideString& wsText,
+                                   int32_t nStart,
+                                   int32_t nCount) const {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
+      ->GetEditText(wsText, nStart, nCount);
+}
+FWL_ERR IFWL_ComboBox::SetEditSelRange(int32_t nStart, int32_t nCount) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
+      ->SetEditSelRange(nStart, nCount);
+}
+int32_t IFWL_ComboBox::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
+      ->GetEditSelRange(nIndex, nStart);
+}
+int32_t IFWL_ComboBox::GetEditLimit() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetEditLimit();
+}
+FWL_ERR IFWL_ComboBox::SetEditLimit(int32_t nLimit) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetEditLimit(nLimit);
+}
+FWL_ERR IFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDoClipboard(iCmd);
+}
+FX_BOOL IFWL_ComboBox::EditRedo(const CFX_ByteStringC& bsRecord) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditRedo(bsRecord);
+}
+FX_BOOL IFWL_ComboBox::EditUndo(const CFX_ByteStringC& bsRecord) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditUndo(bsRecord);
+}
+IFWL_ListBox* IFWL_ComboBox::GetListBoxt() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetListBoxt();
+}
+FX_BOOL IFWL_ComboBox::AfterFocusShowDropList() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->AfterFocusShowDropList();
+}
+FX_ERR IFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->OpenDropDownList(bActivate);
+}
+FX_BOOL IFWL_ComboBox::EditCanUndo() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanUndo();
+}
+FX_BOOL IFWL_ComboBox::EditCanRedo() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanRedo();
+}
+FX_BOOL IFWL_ComboBox::EditUndo() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditUndo();
+}
+FX_BOOL IFWL_ComboBox::EditRedo() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditRedo();
+}
+FX_BOOL IFWL_ComboBox::EditCanCopy() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanCopy();
+}
+FX_BOOL IFWL_ComboBox::EditCanCut() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanCut();
+}
+FX_BOOL IFWL_ComboBox::EditCanSelectAll() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanSelectAll();
+}
+FX_BOOL IFWL_ComboBox::EditCopy(CFX_WideString& wsCopy) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCopy(wsCopy);
+}
+FX_BOOL IFWL_ComboBox::EditCut(CFX_WideString& wsCut) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCut(wsCut);
+}
+FX_BOOL IFWL_ComboBox::EditPaste(const CFX_WideString& wsPaste) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditPaste(wsPaste);
+}
+FX_BOOL IFWL_ComboBox::EditSelectAll() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditSelectAll();
+}
+FX_BOOL IFWL_ComboBox::EditDelete() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDelete();
+}
+FX_BOOL IFWL_ComboBox::EditDeSelect() {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDeSelect();
+}
+FWL_ERR IFWL_ComboBox::GetBBox(CFX_RectF& rect) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetBBox(rect);
+}
+FWL_ERR IFWL_ComboBox::EditModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                          FX_DWORD dwStylesExRemoved) {
+  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
+      ->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+
+CFWL_ComboEditImp::CFWL_ComboEditImp(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter)
+    : CFWL_EditImp(properties, pOuter) {
+  m_pOuter = static_cast<CFWL_ComboBoxImp*>(pOuter->GetImpl());
+}
+
+CFWL_ComboEditImpDelegate::CFWL_ComboEditImpDelegate(CFWL_ComboEditImp* pOwner)
+    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
+int32_t CFWL_ComboEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  FX_BOOL backDefault = TRUE;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      if (dwMsgCode == FWL_MSGHASH_SetFocus) {
+        m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+      } else {
+        m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+      }
+      backDefault = FALSE;
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      if ((pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) &&
+          ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)) {
+        m_pOwner->SetSelected();
+        m_pOwner->SetComboBoxFocus(TRUE);
+      }
+      break;
+    }
+    default: {}
+  }
+  if (!backDefault) {
+    return 1;
+  }
+  return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
+}
+void CFWL_ComboEditImp::ClearSelected() {
+  ClearSelections();
+  Repaint(&m_rtClient);
+}
+void CFWL_ComboEditImp::SetSelected() {
+  FlagFocus(TRUE);
+  EndCaret();
+  AddSelRange(0);
+}
+void CFWL_ComboEditImp::EndCaret() {
+  m_pEdtEngine->MoveCaretPos(MC_End);
+}
+void CFWL_ComboEditImp::FlagFocus(FX_BOOL bSet) {
+  if (bSet) {
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  } else {
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    ShowCaret(FALSE);
+  }
+}
+void CFWL_ComboEditImp::SetComboBoxFocus(FX_BOOL bSet) {
+  m_pOuter->SetFocus(bSet);
+}
+CFWL_ComboListImp::CFWL_ComboListImp(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter)
+    : CFWL_ListBoxImp(properties, pOuter), m_bNotifyOwner(TRUE) {
+  FXSYS_assert(pOuter != NULL);
+}
+FWL_ERR CFWL_ComboListImp::Initialize() {
+  if (CFWL_ListBoxImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  delete m_pDelegate;
+  m_pDelegate = new CFWL_ComboListImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboListImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_ListBoxImp::Finalize();
+}
+int32_t CFWL_ComboListImp::MatchItem(const CFX_WideString& wsMatch) {
+  if (wsMatch.IsEmpty()) {
+    return -1;
+  }
+  if (!m_pProperties->m_pDataProvider)
+    return -1;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    CFX_WideString wsText;
+    pData->GetItemText(m_pInterface, hItem, wsText);
+    FX_STRSIZE pos = wsText.Find(wsMatch.c_str());
+    if (!pos) {
+      return i;
+    }
+  }
+  return -1;
+}
+void CFWL_ComboListImp::ChangeSelected(int32_t iSel) {
+  if (!m_pProperties->m_pDataProvider)
+    return;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel);
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Reset();
+  FWL_HLISTITEM hOld = GetSelItem(0);
+  int32_t iOld = pData->GetItemIndex(m_pInterface, hOld);
+  if (iOld == iSel) {
+    return;
+  } else if (iOld > -1) {
+    GetItemRect(iOld, rtInvalidate);
+    SetSelItem(hOld, FALSE);
+  }
+  if (hItem) {
+    CFX_RectF rect;
+    GetItemRect(iSel, rect);
+    rtInvalidate.Union(rect);
+    FWL_HLISTITEM hSel = pData->GetItem(m_pInterface, iSel);
+    SetSelItem(hSel, TRUE);
+  }
+  if (!rtInvalidate.IsEmpty()) {
+    Repaint(&rtInvalidate);
+  }
+}
+int32_t CFWL_ComboListImp::CountItems() {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  return pData ? pData->CountItems(m_pInterface) : 0;
+}
+void CFWL_ComboListImp::GetItemRect(int32_t nIndex, CFX_RectF& rtItem) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, nIndex);
+  pData->GetItemRect(m_pInterface, hItem, rtItem);
+}
+void CFWL_ComboListImp::ClientToOuter(FX_FLOAT& fx, FX_FLOAT& fy) {
+  fx += m_pProperties->m_rtWidget.left, fy += m_pProperties->m_rtWidget.top;
+  IFWL_Widget* pOwner = GetOwner();
+  if (!pOwner)
+    return;
+  pOwner->TransformTo(m_pOuter, fx, fy);
+}
+void CFWL_ComboListImp::SetFocus(FX_BOOL bSet) {
+  CFWL_WidgetImp::SetFocus(bSet);
+}
+CFWL_ComboListImpDelegate::CFWL_ComboListImpDelegate(CFWL_ComboListImp* pOwner)
+    : CFWL_ListBoxImpDelegate(pOwner), m_pOwner(pOwner) {}
+int32_t CFWL_ComboListImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwHashCode = pMessage->GetClassID();
+  FX_BOOL backDefault = TRUE;
+  if (dwHashCode == FWL_MSGHASH_SetFocus ||
+      dwHashCode == FWL_MSGHASH_KillFocus) {
+    OnDropListFocusChanged(pMessage, dwHashCode == FWL_MSGHASH_SetFocus);
+  } else if (dwHashCode == FWL_MSGHASH_Mouse) {
+    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+      CFX_RectF rect;
+      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
+        pMsg->m_fx -= rect.left;
+        pMsg->m_fy -= rect.top;
+        IFWL_WidgetDelegate* pDelegate =
+            m_pOwner->m_pVertScrollBar->SetDelegate(NULL);
+        return pDelegate->OnProcessMessage(pMsg);
+      }
+    }
+    FX_DWORD dwCmd = pMsg->m_dwCmd;
+    switch (dwCmd) {
+      case FWL_MSGMOUSECMD_MouseMove: {
+        backDefault = FALSE;
+        OnDropListMouseMove(pMsg);
+        break;
+      }
+      case FWL_MSGMOUSECMD_LButtonDown: {
+        backDefault = FALSE;
+        OnDropListLButtonDown(pMsg);
+        break;
+      }
+      case FWL_MSGMOUSECMD_LButtonUp: {
+        backDefault = FALSE;
+        OnDropListLButtonUp(pMsg);
+        break;
+      }
+      default: {}
+    }
+  } else if (dwHashCode == FWL_MSGHASH_Key) {
+    backDefault = !OnDropListKey(static_cast<CFWL_MsgKey*>(pMessage));
+  }
+  if (!backDefault) {
+    return 1;
+  }
+  return CFWL_ListBoxImpDelegate::OnProcessMessage(pMessage);
+}
+void CFWL_ComboListImpDelegate::OnDropListFocusChanged(CFWL_Message* pMsg,
+                                                       FX_BOOL bSet) {
+  if (!bSet) {
+    CFWL_MsgKillFocus* pKill = static_cast<CFWL_MsgKillFocus*>(pMsg);
+    CFWL_ComboBoxImp* pOuter =
+        static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+    if (pKill->m_pSetFocus == m_pOwner->m_pOuter ||
+        pKill->m_pSetFocus == pOuter->m_pEdit.get()) {
+      pOuter->ShowDropList(FALSE);
+    }
+  }
+}
+int32_t CFWL_ComboListImpDelegate::OnDropListMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (m_pOwner->m_bNotifyOwner) {
+      m_pOwner->m_bNotifyOwner = FALSE;
+    }
+    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+      CFX_RectF rect;
+      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
+        return 1;
+      }
+    }
+    FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+    if (hItem) {
+      if (!m_pOwner->m_pProperties->m_pDataProvider)
+        return 0;
+      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
+          m_pOwner->m_pProperties->m_pDataProvider);
+      int32_t iSel = pData->GetItemIndex(m_pOwner->m_pInterface, hItem);
+      CFWL_EvtCmbHoverChanged event;
+      event.m_pSrcTarget = m_pOwner->m_pOuter;
+      event.m_iCurHover = iSel;
+      m_pOwner->DispatchEvent(&event);
+      m_pOwner->ChangeSelected(iSel);
+    }
+  } else if (m_pOwner->m_bNotifyOwner) {
+    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
+    CFWL_ComboBoxImp* pOuter =
+        static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+    pOuter->m_pDelegate->OnProcessMessage(pMsg);
+  }
+  return 1;
+}
+int32_t CFWL_ComboListImpDelegate::OnDropListLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    return 0;
+  }
+  CFWL_ComboBoxImp* pOuter =
+      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+  pOuter->ShowDropList(FALSE);
+  return 1;
+}
+int32_t CFWL_ComboListImpDelegate::OnDropListLButtonUp(CFWL_MsgMouse* pMsg) {
+  CFWL_ComboBoxImp* pOuter =
+      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+  if (m_pOwner->m_bNotifyOwner) {
+    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
+    pOuter->m_pDelegate->OnProcessMessage(pMsg);
+  } else {
+    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+      CFX_RectF rect;
+      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
+        return 1;
+      }
+    }
+    pOuter->ShowDropList(FALSE);
+    FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+    if (hItem) {
+      pOuter->ProcessSelChanged(TRUE);
+    }
+  }
+  return 1;
+}
+int32_t CFWL_ComboListImpDelegate::OnDropListKey(CFWL_MsgKey* pKey) {
+  CFWL_ComboBoxImp* pOuter =
+      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+  FX_BOOL bPropagate = FALSE;
+  if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
+    FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
+    switch (dwKeyCode) {
+      case FWL_VKEY_Return:
+      case FWL_VKEY_Escape: {
+        pOuter->ShowDropList(FALSE);
+        return 1;
+      }
+      case FWL_VKEY_Up:
+      case FWL_VKEY_Down: {
+        OnDropListKeyDown(pKey);
+        pOuter->SetDelegate(nullptr);
+        pOuter->ProcessSelChanged(FALSE);
+        return 1;
+      }
+      default: { bPropagate = TRUE; }
+    }
+  } else if (pKey->m_dwCmd == FWL_MSGKEYCMD_Char) {
+    bPropagate = TRUE;
+  }
+  if (bPropagate) {
+    pKey->m_pDstTarget = m_pOwner->m_pOuter;
+    pOuter->m_pDelegate->OnProcessMessage(pKey);
+    return 1;
+  }
+  return 0;
+}
+void CFWL_ComboListImpDelegate::OnDropListKeyDown(CFWL_MsgKey* pKey) {
+  FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
+  switch (dwKeyCode) {
+    case FWL_VKEY_Up:
+    case FWL_VKEY_Down:
+    case FWL_VKEY_Home:
+    case FWL_VKEY_End: {
+      CFWL_ComboBoxImp* pOuter =
+          static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
+      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
+          m_pOwner->m_pProperties->m_pDataProvider);
+      FWL_HLISTITEM hItem =
+          pData->GetItem(m_pOwner->m_pInterface, pOuter->m_iCurSel);
+      hItem = m_pOwner->GetItem(hItem, dwKeyCode);
+      if (!hItem) {
+        break;
+      }
+      m_pOwner->SetSelection(hItem, hItem, TRUE);
+      m_pOwner->ScrollToVisible(hItem);
+      CFX_RectF rtInvalidate;
+      rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
+                       m_pOwner->m_pProperties->m_rtWidget.height);
+      m_pOwner->Repaint(&rtInvalidate);
+      break;
+    }
+    default: {}
+  }
+}
+CFWL_ComboBoxImp::CFWL_ComboBoxImp(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_pForm(NULL),
+      m_bLButtonDown(FALSE),
+      m_iCurSel(-1),
+      m_iBtnState(FWL_PARTSTATE_CMB_Normal),
+      m_fComboFormHandler(0),
+      m_bNeedShowList(FALSE) {
+  m_rtClient.Reset();
+  m_rtBtn.Reset();
+  m_rtHandler.Reset();
+}
+CFWL_ComboBoxImp::~CFWL_ComboBoxImp() {}
+FWL_ERR CFWL_ComboBoxImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_ComboBox;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ComboBoxImp::GetClassID() const {
+  return FWL_CLASSHASH_ComboBox;
+}
+FWL_ERR CFWL_ComboBoxImp::Initialize() {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_Initialize();
+  }
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_WGTSTATE_Invisible;  // Probably a bug; not a FWL_ERR_ value.
+  m_pDelegate = new CFWL_ComboBoxImpDelegate(this);
+  CFWL_WidgetImpProperties prop;
+  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  prop.m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemIconText) {
+    prop.m_dwStyleExes |= FWL_STYLEEXT_LTB_Icon;
+  }
+  prop.m_pDataProvider = m_pProperties->m_pDataProvider;
+  m_pListBox.reset(IFWL_ListBox::CreateComboList(prop, m_pInterface));
+  m_pListBox->Initialize();
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) {
+    CFWL_WidgetImpProperties prop2;
+    m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop2, m_pInterface));
+    m_pEdit->Initialize();
+    static_cast<CFWL_EditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
+  }
+  if (m_pEdit) {
+    m_pEdit->SetParent(m_pInterface);
+  }
+  SetStates(m_pProperties->m_dwStates);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::Finalize() {
+  if (m_pEdit) {
+    m_pEdit->Finalize();
+  }
+  m_pListBox->Finalize();
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_ComboBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Reset();
+    FX_BOOL bIsDropDown = IsDropDownStyle();
+    if (bIsDropDown && m_pEdit) {
+      m_pEdit->GetWidgetRect(rect, TRUE);
+    } else {
+      rect.width = 100;
+      rect.height = 16;
+    }
+    if (!m_pProperties->m_pThemeProvider) {
+      ReSetTheme();
+    }
+    FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
+        GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+    if (!pFWidth)
+      return FWL_ERR_Indefinite;
+    rect.Inflate(0, 0, *pFWidth, 0);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                         FX_DWORD dwStylesExRemoved) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+  }
+  FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown;
+  FX_BOOL bRemoveDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown;
+  if (bAddDropDown && !m_pEdit) {
+    CFWL_WidgetImpProperties prop;
+    m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop, nullptr));
+    m_pEdit->Initialize();
+    static_cast<CFWL_EditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
+    m_pEdit->SetParent(m_pInterface);
+  } else if (bRemoveDropDown && m_pEdit) {
+    m_pEdit->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+FWL_ERR CFWL_ComboBoxImp::Update() {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_Update();
+  }
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  ReSetTheme();
+  FX_BOOL bDropDown = IsDropDownStyle();
+  if (bDropDown && m_pEdit) {
+    ReSetEditAlignment();
+  }
+  if (m_pProperties->m_pThemeProvider == NULL) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  Layout();
+  CFWL_ThemePart part;
+  part.m_pWidget = m_pInterface;
+  m_fComboFormHandler =
+      *static_cast<FX_FLOAT*>(m_pProperties->m_pThemeProvider->GetCapacity(
+          &part, FWL_WGTCAPACITY_CMB_ComboFormHandler));
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ComboBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_HitTest(fx, fy);
+  }
+  return CFWL_WidgetImp::HitTest(fx, fy);
+}
+FWL_ERR CFWL_ComboBoxImp::DrawWidget(CFX_Graphics* pGraphics,
+                                     const CFX_Matrix* pMatrix) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_DrawWidget(pGraphics, pMatrix);
+  }
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  FX_BOOL bIsDropDown = IsDropDownStyle();
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_CMB_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_CMB_Edge, pTheme, pMatrix);
+  }
+  if (!bIsDropDown) {
+    CFX_RectF rtTextBk(m_rtClient);
+    rtTextBk.width -= m_rtBtn.width;
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_CMB_Background;
+    param.m_pGraphics = pGraphics;
+    if (pMatrix) {
+      param.m_matrix.Concat(*pMatrix);
+    }
+    param.m_rtPart = rtTextBk;
+    if (m_iCurSel >= 0) {
+      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
+          static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+              ->m_pProperties->m_pDataProvider);
+      void* p = pData->GetItemData(m_pListBox.get(),
+                                   pData->GetItem(m_pListBox.get(), m_iCurSel));
+      if (p != NULL) {
+        param.m_pData = p;
+      }
+    }
+    if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+      param.m_dwStates = FWL_PARTSTATE_CMB_Disabled;
+    } else if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
+               (m_iCurSel >= 0)) {
+      param.m_dwStates = FWL_PARTSTATE_CMB_Selected;
+    } else {
+      param.m_dwStates = FWL_PARTSTATE_CMB_Normal;
+    }
+    pTheme->DrawBackground(&param);
+    if (m_iCurSel >= 0) {
+      if (!m_pListBox)
+        return FWL_ERR_Indefinite;
+      CFX_WideString wsText;
+      IFWL_ComboBoxDP* pData =
+          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+          ->GetItemText(hItem, wsText);
+      CFWL_ThemeText param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_CMB_Caption;
+      param.m_dwStates = m_iBtnState;
+      param.m_pGraphics = pGraphics;
+      param.m_matrix.Concat(*pMatrix);
+      param.m_rtPart = rtTextBk;
+      param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
+                             ? FWL_PARTSTATE_CMB_Selected
+                             : FWL_PARTSTATE_CMB_Normal;
+      param.m_wsText = wsText;
+      param.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+      param.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+      pTheme->DrawText(&param);
+    }
+  }
+  {
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_CMB_DropDownButton;
+    param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                           ? FWL_PARTSTATE_CMB_Disabled
+                           : m_iBtnState;
+    param.m_pGraphics = pGraphics;
+    param.m_matrix.Concat(*pMatrix);
+    param.m_rtPart = m_rtBtn;
+    pTheme->DrawBackground(&param);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  if (!pThemeProvider)
+    return FWL_ERR_Indefinite;
+  m_pProperties->m_pThemeProvider = pThemeProvider;
+  if (m_pListBox && pThemeProvider->IsValidWidget(m_pListBox.get())) {
+    m_pListBox->SetThemeProvider(pThemeProvider);
+  }
+  if (m_pEdit && pThemeProvider->IsValidWidget(m_pEdit.get())) {
+    m_pEdit->SetThemeProvider(pThemeProvider);
+  }
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ComboBoxImp::GetCurSel() {
+  return m_iCurSel;
+}
+FWL_ERR CFWL_ComboBoxImp::SetCurSel(int32_t iSel) {
+  int32_t iCount =
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->CountItems();
+  FX_BOOL bClearSel = iSel < 0 || iSel >= iCount;
+  FX_BOOL bDropDown = IsDropDownStyle();
+  if (bDropDown && m_pEdit) {
+    if (bClearSel) {
+      m_pEdit->SetText(CFX_WideString());
+    } else {
+      CFX_WideString wsText;
+      IFWL_ComboBoxDP* pData =
+          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel);
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+          ->GetItemText(hItem, wsText);
+      m_pEdit->SetText(wsText);
+    }
+    m_pEdit->Update();
+  }
+  m_iCurSel = bClearSel ? -1 : iSel;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  FX_BOOL bIsDropDown = IsDropDownStyle();
+  if (bIsDropDown && m_pEdit) {
+    m_pEdit->SetStates(dwStates, bSet);
+  }
+  if (m_pListBox) {
+    m_pListBox->SetStates(dwStates, bSet);
+  }
+  return CFWL_WidgetImp::SetStates(dwStates, bSet);
+}
+FWL_ERR CFWL_ComboBoxImp::SetEditText(const CFX_WideString& wsText) {
+  if (!m_pEdit)
+    return FWL_ERR_Indefinite;
+  m_pEdit->SetText(wsText);
+  return m_pEdit->Update();
+}
+int32_t CFWL_ComboBoxImp::GetEditTextLength() const {
+  if (!m_pEdit)
+    return -1;
+  return m_pEdit->GetTextLength();
+}
+FWL_ERR CFWL_ComboBoxImp::GetEditText(CFX_WideString& wsText,
+                                      int32_t nStart,
+                                      int32_t nCount) const {
+  if (m_pEdit) {
+    return m_pEdit->GetText(wsText, nStart, nCount);
+  } else if (m_pListBox) {
+    IFWL_ComboBoxDP* pData =
+        static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
+    return m_pListBox->GetItemText(hItem, wsText);
+  }
+  return FWL_ERR_Indefinite;
+}
+FWL_ERR CFWL_ComboBoxImp::SetEditSelRange(int32_t nStart, int32_t nCount) {
+  if (!m_pEdit)
+    return FWL_ERR_Indefinite;
+  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->ClearSelected();
+  m_pEdit->AddSelRange(nStart, nCount);
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ComboBoxImp::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
+  if (!m_pEdit)
+    return -1;
+  return m_pEdit->GetSelRange(nIndex, nStart);
+}
+int32_t CFWL_ComboBoxImp::GetEditLimit() {
+  if (!m_pEdit)
+    return -1;
+  return m_pEdit->GetLimit();
+}
+FWL_ERR CFWL_ComboBoxImp::SetEditLimit(int32_t nLimit) {
+  if (!m_pEdit)
+    return FWL_ERR_Indefinite;
+  return m_pEdit->SetLimit(nLimit);
+}
+FWL_ERR CFWL_ComboBoxImp::EditDoClipboard(int32_t iCmd) {
+  if (!m_pEdit)
+    return FWL_ERR_Indefinite;
+  return m_pEdit->DoClipboard(iCmd);
+}
+FX_BOOL CFWL_ComboBoxImp::EditRedo(const CFX_ByteStringC& bsRecord) {
+  if (!m_pEdit)
+    return FALSE;
+  return m_pEdit->Redo(bsRecord);
+}
+FX_BOOL CFWL_ComboBoxImp::EditUndo(const CFX_ByteStringC& bsRecord) {
+  if (!m_pEdit)
+    return FALSE;
+  return m_pEdit->Undo(bsRecord);
+}
+IFWL_ListBox* CFWL_ComboBoxImp::GetListBoxt() {
+  return m_pListBox.get();
+}
+FX_BOOL CFWL_ComboBoxImp::AfterFocusShowDropList() {
+  if (!m_bNeedShowList) {
+    return FALSE;
+  }
+  if (m_pEdit) {
+    MatchEditText();
+  }
+  ShowDropList(TRUE);
+  m_bNeedShowList = FALSE;
+  return TRUE;
+}
+FX_ERR CFWL_ComboBoxImp::OpenDropDownList(FX_BOOL bActivate) {
+  ShowDropList(bActivate);
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_ComboBoxImp::EditCanUndo() {
+  return m_pEdit->CanUndo();
+}
+FX_BOOL CFWL_ComboBoxImp::EditCanRedo() {
+  return m_pEdit->CanRedo();
+}
+FX_BOOL CFWL_ComboBoxImp::EditUndo() {
+  return m_pEdit->Undo();
+}
+FX_BOOL CFWL_ComboBoxImp::EditRedo() {
+  return m_pEdit->Redo();
+}
+FX_BOOL CFWL_ComboBoxImp::EditCanCopy() {
+  return m_pEdit->CountSelRanges() > 0;
+}
+FX_BOOL CFWL_ComboBoxImp::EditCanCut() {
+  if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
+    return FALSE;
+  }
+  return m_pEdit->CountSelRanges() > 0;
+}
+FX_BOOL CFWL_ComboBoxImp::EditCanSelectAll() {
+  return m_pEdit->GetTextLength() > 0;
+}
+FX_BOOL CFWL_ComboBoxImp::EditCopy(CFX_WideString& wsCopy) {
+  return m_pEdit->Copy(wsCopy);
+}
+FX_BOOL CFWL_ComboBoxImp::EditCut(CFX_WideString& wsCut) {
+  return m_pEdit->Cut(wsCut);
+}
+FX_BOOL CFWL_ComboBoxImp::EditPaste(const CFX_WideString& wsPaste) {
+  return m_pEdit->Paste(wsPaste);
+}
+FX_BOOL CFWL_ComboBoxImp::EditSelectAll() {
+  return m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_ComboBoxImp::EditDelete() {
+  return m_pEdit->ClearText() == FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_ComboBoxImp::EditDeSelect() {
+  return m_pEdit->ClearSelections() == FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::GetBBox(CFX_RectF& rect) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_GetBBox(rect);
+  }
+  rect = m_pProperties->m_rtWidget;
+  if (m_pListBox && IsDropListShowed()) {
+    CFX_RectF rtList;
+    m_pListBox->GetWidgetRect(rtList);
+    rtList.Offset(rect.left, rect.top);
+    rect.Union(rtList);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::EditModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                             FX_DWORD dwStylesExRemoved) {
+  if (m_pEdit != NULL) {
+    return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+  } else {
+    return FWL_ERR_Parameter_Invalid;
+  }
+}
+FX_FLOAT CFWL_ComboBoxImp::GetListHeight() {
+  return static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider)
+      ->GetListHeight(m_pInterface);
+}
+void CFWL_ComboBoxImp::DrawStretchHandler(CFX_Graphics* pGraphics,
+                                          const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pGraphics = pGraphics;
+  param.m_iPart = FWL_PART_CMB_StretcgHandler;
+  param.m_dwStates = FWL_PARTSTATE_CMB_Normal;
+  param.m_pWidget = m_pInterface;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  param.m_rtPart = m_rtHandler;
+  m_pProperties->m_pThemeProvider->DrawBackground(&param);
+}
+void CFWL_ComboBoxImp::ShowDropList(FX_BOOL bActivate) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_ShowDropList(bActivate);
+  }
+  FX_BOOL bDropList = IsDropListShowed();
+  if (bDropList == bActivate) {
+    return;
+  }
+  if (!m_pForm) {
+    InitProxyForm();
+  }
+  m_pListProxyDelegate->Reset();
+  if (bActivate) {
+    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+        ->ChangeSelected(m_iCurSel);
+    ReSetListItemAlignment();
+    FX_DWORD dwStyleAdd = m_pProperties->m_dwStyleExes &
+                          (FWL_STYLEEXT_CMB_Sort | FWL_STYLEEXT_CMB_OwnerDraw);
+    m_pListBox->ModifyStylesEx(dwStyleAdd, 0);
+    m_pListBox->GetWidgetRect(m_rtList, TRUE);
+    FX_FLOAT fHeight = GetListHeight();
+    if (fHeight > 0) {
+      if (m_rtList.height > GetListHeight()) {
+        m_rtList.height = GetListHeight();
+        m_pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll, 0);
+      }
+    }
+    CFX_RectF rtAnchor;
+    rtAnchor.Set(0, 0, m_pProperties->m_rtWidget.width,
+                 m_pProperties->m_rtWidget.height);
+    FX_FLOAT fMinHeight = 0;
+    if (m_rtList.width < m_rtClient.width) {
+      m_rtList.width = m_rtClient.width;
+    }
+    m_rtProxy = m_rtList;
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) {
+      m_rtProxy.height += m_fComboFormHandler;
+    }
+    GetPopupPos(fMinHeight, m_rtProxy.height, rtAnchor, m_rtProxy);
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) {
+      FX_FLOAT fx = 0;
+      FX_FLOAT fy = m_rtClient.top + m_rtClient.height / 2;
+      TransformTo(NULL, fx, fy);
+      m_bUpFormHandler = fy > m_rtProxy.top;
+      if (m_bUpFormHandler) {
+        m_rtHandler.Set(0, 0, m_rtList.width, m_fComboFormHandler);
+        m_rtList.top = m_fComboFormHandler;
+      } else {
+        m_rtHandler.Set(0, m_rtList.height, m_rtList.width,
+                        m_fComboFormHandler);
+      }
+    }
+    m_pForm->SetWidgetRect(m_rtProxy);
+    m_pForm->Update();
+    m_pListBox->SetWidgetRect(m_rtList);
+    m_pListBox->Update();
+    CFWL_EvtCmbPreDropDown ev;
+    ev.m_pSrcTarget = m_pInterface;
+    DispatchEvent(&ev);
+    m_fItemHeight =
+        static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->m_fItemHeight;
+    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->SetFocus(TRUE);
+    m_pForm->DoModal();
+    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->SetFocus(FALSE);
+  } else {
+    m_pForm->EndDoModal();
+    CFWL_EvtCmbCloseUp ev;
+    ev.m_pSrcTarget = m_pInterface;
+    DispatchEvent(&ev);
+    m_bLButtonDown = FALSE;
+    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->m_bNotifyOwner =
+        TRUE;
+    SetFocus(TRUE);
+  }
+}
+FX_BOOL CFWL_ComboBoxImp::IsDropListShowed() {
+  return m_pForm && !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
+}
+FX_BOOL CFWL_ComboBoxImp::IsDropDownStyle() const {
+  return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown;
+}
+void CFWL_ComboBoxImp::MatchEditText() {
+  CFX_WideString wsText;
+  m_pEdit->GetText(wsText);
+  int32_t iMatch =
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->MatchItem(wsText);
+  if (iMatch != m_iCurSel) {
+    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+        ->ChangeSelected(iMatch);
+    if (iMatch >= 0) {
+      SynchrEditText(iMatch);
+    }
+  } else if (iMatch >= 0) {
+    static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
+  }
+  m_iCurSel = iMatch;
+}
+void CFWL_ComboBoxImp::SynchrEditText(int32_t iListItem) {
+  CFX_WideString wsText;
+  IFWL_ComboBoxDP* pData =
+      static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iListItem);
+  static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+      ->GetItemText(hItem, wsText);
+  m_pEdit->SetText(wsText);
+  m_pEdit->Update();
+  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
+}
+void CFWL_ComboBoxImp::Layout() {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_Layout();
+  }
+  GetClientRect(m_rtClient);
+  FX_FLOAT* pFWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pFWidth)
+    return;
+  FX_FLOAT fBtn = *pFWidth;
+  m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn,
+              m_rtClient.height);
+  FX_BOOL bIsDropDown = IsDropDownStyle();
+  if (bIsDropDown && m_pEdit) {
+    CFX_RectF rtEdit;
+    rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
+               m_rtClient.height);
+    m_pEdit->SetWidgetRect(rtEdit);
+    if (m_iCurSel >= 0) {
+      CFX_WideString wsText;
+      IFWL_ComboBoxDP* pData =
+          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+          ->GetItemText(hItem, wsText);
+      m_pEdit->LockUpdate();
+      m_pEdit->SetText(wsText);
+      m_pEdit->UnlockUpdate();
+    }
+    m_pEdit->Update();
+  }
+}
+void CFWL_ComboBoxImp::ReSetTheme() {
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (!pTheme) {
+    pTheme = GetAvailableTheme();
+    m_pProperties->m_pThemeProvider = pTheme;
+  }
+  if (m_pListBox) {
+    if (!m_pListBox->GetThemeProvider() &&
+        pTheme->IsValidWidget(m_pListBox.get())) {
+      m_pListBox->SetThemeProvider(pTheme);
+    }
+  }
+  if (m_pEdit) {
+    if (!m_pEdit->GetThemeProvider() && pTheme->IsValidWidget(m_pEdit.get())) {
+      m_pEdit->SetThemeProvider(pTheme);
+    }
+  }
+}
+void CFWL_ComboBoxImp::ReSetEditAlignment() {
+  if (!m_pEdit)
+    return;
+  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
+  FX_DWORD dwAdd = 0;
+  switch (dwStylExes & FWL_STYLEEXT_CMB_EditHAlignMask) {
+    case FWL_STYLEEXT_CMB_EditHCenter: {
+      dwAdd |= FWL_STYLEEXT_EDT_HCenter;
+      break;
+    }
+    case FWL_STYLEEXT_CMB_EditHFar: {
+      dwAdd |= FWL_STYLEEXT_EDT_HFar;
+      break;
+    }
+    default: { dwAdd |= FWL_STYLEEXT_EDT_HNear; }
+  }
+  switch (dwStylExes & FWL_STYLEEXT_CMB_EditVAlignMask) {
+    case FWL_STYLEEXT_CMB_EditVCenter: {
+      dwAdd |= FWL_STYLEEXT_EDT_VCenter;
+      break;
+    }
+    case FWL_STYLEEXT_CMB_EditVFar: {
+      dwAdd |= FWL_STYLEEXT_EDT_VFar;
+      break;
+    }
+    default: { dwAdd |= FWL_STYLEEXT_EDT_VNear; }
+  }
+  if (dwStylExes & FWL_STYLEEXT_CMB_EditJustified) {
+    dwAdd |= FWL_STYLEEXT_EDT_Justified;
+  }
+  if (dwStylExes & FWL_STYLEEXT_CMB_EditDistributed) {
+    dwAdd |= FWL_STYLEEXT_EDT_Distributed;
+  }
+  m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
+                                     FWL_STYLEEXT_EDT_HAlignModeMask |
+                                     FWL_STYLEEXT_EDT_VAlignMask);
+}
+void CFWL_ComboBoxImp::ReSetListItemAlignment() {
+  if (!m_pListBox)
+    return;
+  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
+  FX_DWORD dwAdd = 0;
+  switch (dwStylExes & FWL_STYLEEXT_CMB_ListItemAlignMask) {
+    case FWL_STYLEEXT_CMB_ListItemCenterAlign: {
+      dwAdd |= FWL_STYLEEXT_LTB_CenterAlign;
+    }
+    case FWL_STYLEEXT_CMB_ListItemRightAlign: {
+      dwAdd |= FWL_STYLEEXT_LTB_RightAlign;
+    }
+    default: { dwAdd |= FWL_STYLEEXT_LTB_LeftAlign; }
+  }
+  m_pListBox->ModifyStylesEx(dwAdd, FWL_STYLEEXT_CMB_ListItemAlignMask);
+}
+void CFWL_ComboBoxImp::ProcessSelChanged(FX_BOOL bLButtonUp) {
+  IFWL_ComboBoxDP* pDatas =
+      static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+  m_iCurSel = pDatas->GetItemIndex(m_pInterface, m_pListBox->GetSelItem(0));
+  FX_BOOL bDropDown = IsDropDownStyle();
+  if (bDropDown) {
+    IFWL_ComboBoxDP* pData =
+        static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
+    if (hItem) {
+      CFX_WideString wsText;
+      pData->GetItemText(m_pInterface, hItem, wsText);
+      if (m_pEdit) {
+        m_pEdit->SetText(wsText);
+        m_pEdit->Update();
+        static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
+      }
+      CFWL_EvtCmbSelChanged ev;
+      ev.bLButtonUp = bLButtonUp;
+      ev.m_pSrcTarget = m_pInterface;
+      ev.iArraySels.Add(m_iCurSel);
+      DispatchEvent(&ev);
+    }
+  } else {
+    Repaint(&m_rtClient);
+  }
+}
+void CFWL_ComboBoxImp::InitProxyForm() {
+  if (m_pForm)
+    return;
+  if (!m_pListBox)
+    return;
+  CFWL_WidgetImpProperties propForm;
+  propForm.m_pOwner = m_pInterface;
+  propForm.m_dwStyles = FWL_WGTSTYLE_Popup;
+  propForm.m_dwStates = FWL_WGTSTATE_Invisible;
+  CFX_WideString className;
+  m_pForm = IFWL_Form::CreateFormProxy(propForm, &className, m_pListBox.get());
+  m_pForm->Initialize();
+  m_pProxy = static_cast<CFWL_FormProxyImp*>(m_pForm->GetImpl());
+  m_pListBox->SetParent(m_pForm);
+  m_pListProxyDelegate = new CFWL_ComboProxyImpDelegate(m_pForm, this);
+  m_pProxy->SetDelegate(m_pListProxyDelegate);
+}
+FWL_ERR CFWL_ComboBoxImp::DisForm_Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_WGTSTATE_Invisible;  // Ditto.
+  m_pDelegate = new CFWL_ComboBoxImpDelegate(this);
+  DisForm_InitComboList();
+  DisForm_InitComboEdit();
+  return FWL_ERR_Succeeded;
+}
+void CFWL_ComboBoxImp::DisForm_InitComboList() {
+  if (m_pListBox) {
+    return;
+  }
+  CFWL_WidgetImpProperties prop;
+  prop.m_pParent = m_pInterface;
+  prop.m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
+  prop.m_dwStates = FWL_WGTSTATE_Invisible;
+  prop.m_pDataProvider = m_pProperties->m_pDataProvider;
+  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pListBox.reset(IFWL_ListBox::CreateComboList(prop, m_pInterface));
+  m_pListBox->Initialize();
+}
+void CFWL_ComboBoxImp::DisForm_InitComboEdit() {
+  if (m_pEdit) {
+    return;
+  }
+  CFWL_WidgetImpProperties prop;
+  prop.m_pParent = m_pInterface;
+  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop, m_pInterface));
+  m_pEdit->Initialize();
+  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
+}
+void CFWL_ComboBoxImp::DisForm_ShowDropList(FX_BOOL bActivate) {
+  FX_BOOL bDropList = DisForm_IsDropListShowed();
+  if (bDropList == bActivate) {
+    return;
+  }
+  if (bActivate) {
+    CFWL_EvtCmbPreDropDown preEvent;
+    preEvent.m_pSrcTarget = m_pInterface;
+    DispatchEvent(&preEvent);
+    CFWL_ComboListImp* pComboList =
+        static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl());
+    int32_t iItems = pComboList->CountItems();
+    if (iItems < 1) {
+      return;
+    }
+    ReSetListItemAlignment();
+    pComboList->ChangeSelected(m_iCurSel);
+    FX_FLOAT fItemHeight = pComboList->GetItemHeigt();
+    FX_FLOAT fBorder = GetBorderSize();
+    FX_FLOAT fPopupMin = 0.0f;
+    if (iItems > 3) {
+      fPopupMin = fItemHeight * 3 + fBorder * 2;
+    }
+    FX_FLOAT fPopupMax = fItemHeight * iItems + fBorder * 2;
+    CFX_RectF rtList;
+    rtList.left = m_rtClient.left;
+    rtList.width = m_pProperties->m_rtWidget.width;
+    rtList.top = 0;
+    rtList.height = 0;
+    GetPopupPos(fPopupMin, fPopupMax, m_pProperties->m_rtWidget, rtList);
+    m_pListBox->SetWidgetRect(rtList);
+    m_pListBox->Update();
+  } else {
+    SetFocus(TRUE);
+  }
+  m_pListBox->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
+  if (bActivate) {
+    CFWL_EvtCmbPostDropDown postEvent;
+    postEvent.m_pSrcTarget = m_pInterface;
+    DispatchEvent(&postEvent);
+  }
+  CFX_RectF rect;
+  m_pListBox->GetWidgetRect(rect);
+  rect.Inflate(2, 2);
+  Repaint(&rect);
+}
+FX_BOOL CFWL_ComboBoxImp::DisForm_IsDropListShowed() {
+  return !(m_pListBox->GetStates() & FWL_WGTSTATE_Invisible);
+}
+FWL_ERR CFWL_ComboBoxImp::DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                                 FX_DWORD dwStylesExRemoved) {
+  if (!m_pEdit) {
+    DisForm_InitComboEdit();
+  }
+  FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown;
+  FX_BOOL bDelDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown;
+  dwStylesExRemoved &= ~FWL_STYLEEXT_CMB_DropDown;
+  m_pProperties->m_dwStyleExes |= FWL_STYLEEXT_CMB_DropDown;
+  if (bAddDropDown) {
+    m_pEdit->ModifyStylesEx(0, FWL_STYLEEXT_EDT_ReadOnly);
+  } else if (bDelDropDown) {
+    m_pEdit->ModifyStylesEx(FWL_STYLEEXT_EDT_ReadOnly, 0);
+  }
+  return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+FWL_ERR CFWL_ComboBoxImp::DisForm_Update() {
+  if (m_iLock) {
+    return FWL_ERR_Indefinite;
+  }
+  if (m_pEdit) {
+    ReSetEditAlignment();
+  }
+  ReSetTheme();
+  Layout();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ComboBoxImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rect;
+  rect.Set(0, 0, m_pProperties->m_rtWidget.width - m_rtBtn.width,
+           m_pProperties->m_rtWidget.height);
+  if (rect.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Edit;
+  }
+  if (m_rtBtn.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  if (DisForm_IsDropListShowed()) {
+    m_pListBox->GetWidgetRect(rect);
+    if (rect.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Client;
+    }
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FWL_ERR CFWL_ComboBoxImp::DisForm_DrawWidget(CFX_Graphics* pGraphics,
+                                             const CFX_Matrix* pMatrix) {
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  CFX_Matrix mtOrg;
+  mtOrg.Set(1, 0, 0, 1, 0, 0);
+  if (pMatrix) {
+    mtOrg = *pMatrix;
+  }
+  FX_BOOL bListShowed = m_pListBox && DisForm_IsDropListShowed();
+  pGraphics->SaveGraphState();
+  pGraphics->ConcatMatrix(&mtOrg);
+  if (!m_rtBtn.IsEmpty(0.1f)) {
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_CMB_DropDownButton;
+    param.m_dwStates = m_iBtnState;
+    param.m_pGraphics = pGraphics;
+    param.m_rtPart = m_rtBtn;
+    pTheme->DrawBackground(&param);
+  }
+  pGraphics->RestoreGraphState();
+  if (m_pEdit) {
+    CFX_RectF rtEdit;
+    m_pEdit->GetWidgetRect(rtEdit);
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top);
+    mt.Concat(mtOrg);
+    m_pEdit->DrawWidget(pGraphics, &mt);
+  }
+  if (bListShowed) {
+    CFX_RectF rtList;
+    m_pListBox->GetWidgetRect(rtList);
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, rtList.left, rtList.top);
+    mt.Concat(mtOrg);
+    m_pListBox->DrawWidget(pGraphics, &mt);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImp::DisForm_GetBBox(CFX_RectF& rect) {
+  rect = m_pProperties->m_rtWidget;
+  if (m_pListBox && DisForm_IsDropListShowed()) {
+    CFX_RectF rtList;
+    m_pListBox->GetWidgetRect(rtList);
+    rtList.Offset(rect.left, rect.top);
+    rect.Union(rtList);
+  }
+  return FWL_ERR_Succeeded;
+}
+void CFWL_ComboBoxImp::DisForm_Layout() {
+  GetClientRect(m_rtClient);
+  m_rtContent = m_rtClient;
+  FX_FLOAT* pFWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pFWidth)
+    return;
+  FX_FLOAT borderWidth = 0;
+  { borderWidth = FWL_PART_CMB_Border; }
+  FX_FLOAT fBtn = *pFWidth;
+  if (!(GetStylesEx() & FWL_STYLEEXT_CMB_ReadOnly)) {
+    m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top + borderWidth,
+                fBtn - borderWidth, m_rtClient.height - 2 * borderWidth);
+  }
+  CFX_RectF* pUIMargin =
+      static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
+  if (pUIMargin) {
+    m_rtContent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
+                        pUIMargin->height);
+  }
+  FX_BOOL bIsDropDown = IsDropDownStyle();
+  if (bIsDropDown && m_pEdit) {
+    CFX_RectF rtEdit;
+    rtEdit.Set(m_rtContent.left, m_rtContent.top, m_rtContent.width - fBtn,
+               m_rtContent.height);
+    m_pEdit->SetWidgetRect(rtEdit);
+    if (m_iCurSel >= 0) {
+      CFX_WideString wsText;
+      IFWL_ComboBoxDP* pData =
+          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
+      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
+          ->GetItemText(hItem, wsText);
+      m_pEdit->LockUpdate();
+      m_pEdit->SetText(wsText);
+      m_pEdit->UnlockUpdate();
+    }
+    m_pEdit->Update();
+  }
+}
+CFWL_ComboBoxImpDelegate::CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_ComboBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_OnProcessMessage(pMessage);
+  }
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  FX_BOOL iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      OnKey(static_cast<CFWL_MsgKey*>(pMessage));
+      break;
+    }
+    default: { iRet = 0; }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_ComboBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  FX_DWORD dwFlag = pEvent->GetClassID();
+  if (dwFlag == FWL_EVTHASH_LTB_DrawItem) {
+    CFWL_EvtLtbDrawItem* pDrawItemEvent =
+        static_cast<CFWL_EvtLtbDrawItem*>(pEvent);
+    CFWL_EvtCmbDrawItem pTemp;
+    pTemp.m_pSrcTarget = m_pOwner->m_pInterface;
+    pTemp.m_pGraphics = pDrawItemEvent->m_pGraphics;
+    pTemp.m_index = pDrawItemEvent->m_index;
+    pTemp.m_rtItem = pDrawItemEvent->m_rect;
+    m_pOwner->DispatchEvent(&pTemp);
+  } else if (dwFlag == FWL_EVTHASH_Scroll) {
+    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
+    CFWL_EvtScroll pScrollEv;
+    pScrollEv.m_pSrcTarget = m_pOwner->m_pInterface;
+    pScrollEv.m_iScrollCode = pScrollEvent->m_iScrollCode;
+    pScrollEv.m_fPos = pScrollEvent->m_fPos;
+    m_pOwner->DispatchEvent(&pScrollEv);
+  } else if (dwFlag == FWL_EVTHASH_EDT_TextChanged) {
+    CFWL_EvtEdtTextChanged* pTextChangedEvent =
+        static_cast<CFWL_EvtEdtTextChanged*>(pEvent);
+    CFWL_EvtCmbEditChanged pTemp;
+    pTemp.m_pSrcTarget = m_pOwner->m_pInterface;
+    pTemp.wsInsert = pTextChangedEvent->wsInsert;
+    pTemp.wsDelete = pTextChangedEvent->wsDelete;
+    pTemp.nChangeType = pTextChangedEvent->nChangeType;
+    m_pOwner->DispatchEvent(&pTemp);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ComboBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                               const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_ComboBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                              FX_BOOL bSet) {
+  IFWL_Target* pDstTarget = pMsg->m_pDstTarget;
+  IFWL_Target* pSrcTarget = pMsg->m_pSrcTarget;
+  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (bDropDown && pSrcTarget != m_pOwner->m_pListBox.get()) {
+      if (!m_pOwner->m_pEdit)
+        return;
+      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
+          ->SetSelected();
+    } else {
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    if (bDropDown && pDstTarget != m_pOwner->m_pListBox.get()) {
+      if (!m_pOwner->m_pEdit)
+        return;
+      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
+          ->FlagFocus(FALSE);
+      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
+          ->ClearSelected();
+    } else {
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+  }
+}
+void CFWL_ComboBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    return;
+  }
+  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
+  FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
+  if (bClickBtn) {
+    if (bDropDown && m_pOwner->m_pEdit) {
+      m_pOwner->MatchEditText();
+    }
+    m_pOwner->m_bLButtonDown = TRUE;
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Pressed;
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    m_pOwner->ShowDropList(TRUE);
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  }
+}
+void CFWL_ComboBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_pOwner->m_bLButtonDown = FALSE;
+  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Hovered;
+  } else {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+}
+void CFWL_ComboBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  int32_t iOldState = m_pOwner->m_iBtnState;
+  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iBtnState = m_pOwner->m_bLButtonDown
+                                ? FWL_PARTSTATE_CMB_Pressed
+                                : FWL_PARTSTATE_CMB_Hovered;
+  } else {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
+  }
+  if ((iOldState != m_pOwner->m_iBtnState) &&
+      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
+        FWL_WGTSTATE_Disabled)) {
+    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+  }
+}
+void CFWL_ComboBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (!m_pOwner->IsDropListShowed() &&
+      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
+        FWL_WGTSTATE_Disabled)) {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
+    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+  }
+}
+void CFWL_ComboBoxImpDelegate::OnKey(CFWL_MsgKey* pMsg) {
+  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
+  if (dwKeyCode == FWL_VKEY_Tab) {
+    m_pOwner->DispatchKeyEvent(pMsg);
+    return;
+  }
+  if (pMsg->m_pDstTarget == m_pOwner->m_pInterface)
+    DoSubCtrlKey(pMsg);
+}
+void CFWL_ComboBoxImpDelegate::DoSubCtrlKey(CFWL_MsgKey* pMsg) {
+  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
+  const bool bUp = dwKeyCode == FWL_VKEY_Up;
+  const bool bDown = dwKeyCode == FWL_VKEY_Down;
+  if (bUp || bDown) {
+    int32_t iCount =
+        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
+            ->CountItems();
+    if (iCount < 1) {
+      return;
+    }
+    FX_BOOL bMatchEqual = FALSE;
+    int32_t iCurSel = m_pOwner->m_iCurSel;
+    FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+    if (bDropDown && m_pOwner->m_pEdit) {
+      CFX_WideString wsText;
+      m_pOwner->m_pEdit->GetText(wsText);
+      iCurSel = static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
+                    ->MatchItem(wsText);
+      if (iCurSel >= 0) {
+        CFX_WideString wsTemp;
+        IFWL_ComboBoxDP* pData = static_cast<IFWL_ComboBoxDP*>(
+            m_pOwner->m_pProperties->m_pDataProvider);
+        FWL_HLISTITEM hItem = pData->GetItem(m_pOwner->m_pInterface, iCurSel);
+        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
+            ->GetItemText(hItem, wsTemp);
+        bMatchEqual = wsText.Equal(wsTemp);
+      }
+    }
+    if (iCurSel < 0) {
+      iCurSel = 0;
+    } else if (!bDropDown || bMatchEqual) {
+      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
+        return;
+      }
+      if (bUp) {
+        iCurSel--;
+      } else {
+        iCurSel++;
+      }
+    }
+    m_pOwner->m_iCurSel = iCurSel;
+    if (bDropDown && m_pOwner->m_pEdit) {
+      m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
+    } else {
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+    return;
+  }
+  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+  if (bDropDown) {
+    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(pMsg);
+  }
+}
+int32_t CFWL_ComboBoxImpDelegate::DisForm_OnProcessMessage(
+    CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  FX_BOOL backDefault = TRUE;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      backDefault = FALSE;
+      DisForm_OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      backDefault = FALSE;
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          DisForm_OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      backDefault = FALSE;
+      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
+      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyUp) {
+        break;
+      }
+      if (m_pOwner->DisForm_IsDropListShowed() &&
+          pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
+        FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
+        FX_BOOL bListKey =
+            dwKeyCode == FWL_VKEY_Up || dwKeyCode == FWL_VKEY_Down ||
+            dwKeyCode == FWL_VKEY_Return || dwKeyCode == FWL_VKEY_Escape;
+        if (bListKey) {
+          IFWL_WidgetDelegate* pDelegate =
+              m_pOwner->m_pListBox->SetDelegate(NULL);
+          pDelegate->OnProcessMessage(pMessage);
+          break;
+        }
+      }
+      DisForm_OnKey(pKey);
+      break;
+    }
+    default: {}
+  }
+  if (!backDefault) {
+    return 1;
+  }
+  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+}
+void CFWL_ComboBoxImpDelegate::DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  FX_BOOL bDropDown = m_pOwner->DisForm_IsDropListShowed();
+  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
+  FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
+  if (bClickBtn) {
+    if (m_pOwner->DisForm_IsDropListShowed()) {
+      m_pOwner->DisForm_ShowDropList(FALSE);
+      return;
+    }
+    {
+      if (m_pOwner->m_pEdit) {
+        m_pOwner->MatchEditText();
+      }
+      m_pOwner->DisForm_ShowDropList(TRUE);
+    }
+  }
+}
+void CFWL_ComboBoxImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
+                                                      FX_BOOL bSet) {
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if ((m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) {
+      CFWL_MsgSetFocus msg;
+      msg.m_pDstTarget = m_pOwner->m_pEdit.get();
+      msg.m_pSrcTarget = NULL;
+      IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+      pDelegate->OnProcessMessage(&msg);
+    }
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    m_pOwner->DisForm_ShowDropList(FALSE);
+    CFWL_MsgKillFocus msg;
+    msg.m_pDstTarget = NULL;
+    msg.m_pSrcTarget = m_pOwner->m_pEdit.get();
+    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(&msg);
+  }
+}
+void CFWL_ComboBoxImpDelegate::DisForm_OnKey(CFWL_MsgKey* pMsg) {
+  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
+  const bool bUp = dwKeyCode == FWL_VKEY_Up;
+  const bool bDown = dwKeyCode == FWL_VKEY_Down;
+  if (bUp || bDown) {
+    CFWL_ComboListImp* pComboList =
+        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl());
+    int32_t iCount = pComboList->CountItems();
+    if (iCount < 1) {
+      return;
+    }
+    FX_BOOL bMatchEqual = FALSE;
+    int32_t iCurSel = m_pOwner->m_iCurSel;
+    if (m_pOwner->m_pEdit) {
+      CFX_WideString wsText;
+      m_pOwner->m_pEdit->GetText(wsText);
+      iCurSel = pComboList->MatchItem(wsText);
+      if (iCurSel >= 0) {
+        CFX_WideString wsTemp;
+        FWL_HLISTITEM item = m_pOwner->m_pListBox->GetSelItem(iCurSel);
+        m_pOwner->m_pListBox->GetItemText(item, wsTemp);
+        bMatchEqual = wsText.Equal(wsTemp);
+      }
+    }
+    if (iCurSel < 0) {
+      iCurSel = 0;
+    } else if (bMatchEqual) {
+      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
+        return;
+      }
+      if (bUp) {
+        iCurSel--;
+      } else {
+        iCurSel++;
+      }
+    }
+    m_pOwner->m_iCurSel = iCurSel;
+    m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
+    return;
+  }
+  if (m_pOwner->m_pEdit) {
+    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(pMsg);
+  }
+}
+CFWL_ComboProxyImpDelegate::CFWL_ComboProxyImpDelegate(
+    IFWL_Form* pForm,
+    CFWL_ComboBoxImp* pComboBox)
+    : m_bLButtonDown(FALSE),
+      m_bLButtonUpSelf(FALSE),
+      m_fStartPos(0),
+      m_pForm(pForm),
+      m_pComboBox(pComboBox) {}
+int32_t CFWL_ComboProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  if (dwMsgCode == FWL_MSGHASH_Mouse) {
+    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+    FX_DWORD dwCmd = pMsg->m_dwCmd;
+    switch (dwCmd) {
+      case FWL_MSGMOUSECMD_LButtonDown: {
+        OnLButtonDown(pMsg);
+        break;
+      }
+      case FWL_MSGMOUSECMD_LButtonUp: {
+        OnLButtonUp(pMsg);
+        break;
+      }
+      case FWL_MSGMOUSECMD_MouseMove: {
+        OnMouseMove(pMsg);
+        break;
+      }
+      default: {}
+    }
+  }
+  if (dwMsgCode == FWL_MSGHASH_Deactivate) {
+    OnDeactive(static_cast<CFWL_MsgDeactivate*>(pMessage));
+  }
+  if (dwMsgCode == FWL_MSGHASH_KillFocus || dwMsgCode == FWL_MSGHASH_SetFocus) {
+    OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage),
+                   dwMsgCode == FWL_MSGHASH_SetFocus);
+  }
+  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+}
+FWL_ERR CFWL_ComboProxyImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                 const CFX_Matrix* pMatrix) {
+  m_pComboBox->DrawStretchHandler(pGraphics, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_ComboProxyImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  CFX_RectF rtWidget;
+  m_pForm->GetWidgetRect(rtWidget);
+  rtWidget.left = rtWidget.top = 0;
+  if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_bLButtonDown = TRUE;
+    pDriver->SetGrab(m_pForm, TRUE);
+  } else {
+    m_bLButtonDown = FALSE;
+    pDriver->SetGrab(m_pForm, FALSE);
+    m_pComboBox->ShowDropList(FALSE);
+  }
+}
+void CFWL_ComboProxyImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDown = FALSE;
+  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  pDriver->SetGrab(m_pForm, FALSE);
+  if (m_bLButtonUpSelf) {
+    CFX_RectF rect;
+    m_pForm->GetWidgetRect(rect);
+    rect.left = rect.top = 0;
+    if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) &&
+        m_pComboBox->IsDropListShowed()) {
+      m_pComboBox->ShowDropList(FALSE);
+    }
+  } else {
+    m_bLButtonUpSelf = TRUE;
+  }
+}
+void CFWL_ComboProxyImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {}
+void CFWL_ComboProxyImpDelegate::OnDeactive(CFWL_MsgDeactivate* pMsg) {
+  m_pComboBox->ShowDropList(FALSE);
+}
+void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus* pMsg,
+                                                FX_BOOL bSet) {
+  if (!bSet) {
+    if (pMsg->m_pSetFocus == NULL) {
+      m_pComboBox->ShowDropList(FALSE);
+    }
+  }
+}
diff --git a/xfa/fwl/basewidget/fwl_comboboximp.h b/xfa/fwl/basewidget/fwl_comboboximp.h
new file mode 100644
index 0000000..74f6c63
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_comboboximp.h
@@ -0,0 +1,237 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
+
+#include <memory>
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/fwl/basewidget/fwl_listboximp.h"
+
+class CFWL_WidgetImp;
+class CFWL_WidgetImpProperties;
+class CFWL_WidgetImpDelegate;
+class CFWL_ListBoxImp;
+class CFWL_ListBoxImpDelegate;
+class CFWL_FormProxyImp;
+class IFWL_Widget;
+class CFWL_ComboEditImp;
+class CFWL_ComboEditImpDelegate;
+class CFWL_ComboListImp;
+class CFWL_ComboListImpDelegate;
+class CFWL_ComboBoxImp;
+class CFWL_ComboBoxImpDelegate;
+class CFWL_ComboProxyImpDelegate;
+class CFWL_ComboEditImp : public CFWL_EditImp {
+ public:
+  CFWL_ComboEditImp(const CFWL_WidgetImpProperties& properties,
+                    IFWL_Widget* pOuter);
+
+  void ClearSelected();
+  void SetSelected();
+  void EndCaret();
+  void FlagFocus(FX_BOOL bSet);
+
+ protected:
+  void SetComboBoxFocus(FX_BOOL bSet);
+  CFWL_ComboBoxImp* m_pOuter;
+  friend class CFWL_ComboEditImpDelegate;
+};
+class CFWL_ComboEditImpDelegate : public CFWL_EditImpDelegate {
+ public:
+  CFWL_ComboEditImpDelegate(CFWL_ComboEditImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+
+ protected:
+  CFWL_ComboEditImp* m_pOwner;
+};
+class CFWL_ComboListImp : public CFWL_ListBoxImp {
+ public:
+  CFWL_ComboListImp(const CFWL_WidgetImpProperties& properties,
+                    IFWL_Widget* pOuter);
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  int32_t MatchItem(const CFX_WideString& wsMatch);
+  void ChangeSelected(int32_t iSel);
+  int32_t CountItems();
+  void GetItemRect(int32_t nIndex, CFX_RectF& rtItem);
+  void ClientToOuter(FX_FLOAT& fx, FX_FLOAT& fy);
+  void SetFocus(FX_BOOL bSet);
+  FX_BOOL m_bNotifyOwner;
+  friend class CFWL_ComboListImpDelegate;
+  friend class CFWL_ComboBoxImp;
+};
+class CFWL_ComboListImpDelegate : public CFWL_ListBoxImpDelegate {
+ public:
+  CFWL_ComboListImpDelegate(CFWL_ComboListImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+
+ protected:
+  void OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  int32_t OnDropListMouseMove(CFWL_MsgMouse* pMsg);
+  int32_t OnDropListLButtonDown(CFWL_MsgMouse* pMsg);
+  int32_t OnDropListLButtonUp(CFWL_MsgMouse* pMsg);
+  int32_t OnDropListKey(CFWL_MsgKey* pKey);
+  void OnDropListKeyDown(CFWL_MsgKey* pKey);
+  CFWL_ComboListImp* m_pOwner;
+};
+class CFWL_ComboBoxImp : public CFWL_WidgetImp {
+ public:
+  CFWL_ComboBoxImp(const CFWL_WidgetImpProperties& properties,
+                   IFWL_Widget* pOuter);
+  virtual ~CFWL_ComboBoxImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                 FX_DWORD dwStylesExRemoved);
+  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
+  virtual FWL_ERR Update();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
+  virtual int32_t GetCurSel();
+  virtual FWL_ERR SetCurSel(int32_t iSel);
+  virtual FWL_ERR SetEditText(const CFX_WideString& wsText);
+  virtual int32_t GetEditTextLength() const;
+  virtual FWL_ERR GetEditText(CFX_WideString& wsText,
+                              int32_t nStart = 0,
+                              int32_t nCount = -1) const;
+  virtual FWL_ERR SetEditSelRange(int32_t nStart, int32_t nCount = -1);
+  virtual int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart);
+  virtual int32_t GetEditLimit();
+  virtual FWL_ERR SetEditLimit(int32_t nLimit);
+  virtual FWL_ERR EditDoClipboard(int32_t iCmd);
+  virtual FX_BOOL EditRedo(const CFX_ByteStringC& bsRecord);
+  virtual FX_BOOL EditUndo(const CFX_ByteStringC& bsRecord);
+  virtual IFWL_ListBox* GetListBoxt();
+  virtual FX_BOOL AfterFocusShowDropList();
+  virtual FX_ERR OpenDropDownList(FX_BOOL bActivate);
+  virtual FX_BOOL EditCanUndo();
+  virtual FX_BOOL EditCanRedo();
+  virtual FX_BOOL EditUndo();
+  virtual FX_BOOL EditRedo();
+  virtual FX_BOOL EditCanCopy();
+  virtual FX_BOOL EditCanCut();
+  virtual FX_BOOL EditCanSelectAll();
+  virtual FX_BOOL EditCopy(CFX_WideString& wsCopy);
+  virtual FX_BOOL EditCut(CFX_WideString& wsCut);
+  virtual FX_BOOL EditPaste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL EditSelectAll();
+  virtual FX_BOOL EditDelete();
+  virtual FX_BOOL EditDeSelect();
+  virtual FWL_ERR GetBBox(CFX_RectF& rect);
+  virtual FWL_ERR EditModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                     FX_DWORD dwStylesExRemoved);
+
+ protected:
+  void DrawStretchHandler(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix);
+  FX_FLOAT GetListHeight();
+  void ShowDropList(FX_BOOL bActivate);
+  FX_BOOL IsDropListShowed();
+  FX_BOOL IsDropDownStyle() const;
+  void MatchEditText();
+  void SynchrEditText(int32_t iListItem);
+  void Layout();
+  void ReSetTheme();
+  void ReSetEditAlignment();
+  void ReSetListItemAlignment();
+  void ProcessSelChanged(FX_BOOL bLButtonUp);
+  void InitProxyForm();
+  FWL_ERR DisForm_Initialize();
+  void DisForm_InitComboList();
+  void DisForm_InitComboEdit();
+  void DisForm_ShowDropList(FX_BOOL bActivate);
+  FX_BOOL DisForm_IsDropListShowed();
+  FWL_ERR DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                 FX_DWORD dwStylesExRemoved);
+  FWL_ERR DisForm_Update();
+  FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  FWL_ERR DisForm_DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  FWL_ERR DisForm_GetBBox(CFX_RectF& rect);
+  void DisForm_Layout();
+
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtContent;
+  CFX_RectF m_rtBtn;
+  CFX_RectF m_rtList;
+  CFX_RectF m_rtProxy;
+  CFX_RectF m_rtHandler;
+  std::unique_ptr<IFWL_Edit> m_pEdit;
+  std::unique_ptr<IFWL_ListBox> m_pListBox;
+  IFWL_Form* m_pForm;
+  FX_BOOL m_bLButtonDown;
+  FX_BOOL m_bUpFormHandler;
+  int32_t m_iCurSel;
+  int32_t m_iBtnState;
+  FX_FLOAT m_fComboFormHandler;
+  FX_FLOAT m_fItemHeight;
+  FX_BOOL m_bNeedShowList;
+  CFWL_FormProxyImp* m_pProxy;
+  CFWL_ComboProxyImpDelegate* m_pListProxyDelegate;
+
+  friend class CFWL_ComboListImp;
+  friend class CFWL_ComboEditImp;
+  friend class CFWL_ComboEditImpDelegate;
+  friend class CFWL_ComboListImpDelegate;
+  friend class CFWL_ComboBoxImpDelegate;
+  friend class CFWL_ComboProxyImpDelegate;
+};
+class CFWL_ComboBoxImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnKey(CFWL_MsgKey* pMsg);
+  void DoSubCtrlKey(CFWL_MsgKey* pMsg);
+
+ protected:
+  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
+  void DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void DisForm_OnKey(CFWL_MsgKey* pMsg);
+
+ protected:
+  CFWL_ComboBoxImp* m_pOwner;
+  friend class CFWL_ComboEditImpDelegate;
+  friend class CFWL_ComboListImpDelegate;
+};
+class CFWL_ComboProxyImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_ComboProxyImpDelegate(IFWL_Form* pForm, CFWL_ComboBoxImp* pComboBox);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+  void Reset() { m_bLButtonUpSelf = FALSE; }
+
+ protected:
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnDeactive(CFWL_MsgDeactivate* pMsg);
+  void OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet);
+  FX_BOOL m_bLButtonDown;
+  FX_BOOL m_bLButtonUpSelf;
+  FX_FLOAT m_fStartPos;
+  IFWL_Form* m_pForm;
+  CFWL_ComboBoxImp* m_pComboBox;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_datetimepickerimp.cpp b/xfa/fwl/basewidget/fwl_datetimepickerimp.cpp
new file mode 100644
index 0000000..cd82dde
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_datetimepickerimp.cpp
@@ -0,0 +1,1161 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_datetimepickerimp.h"
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/fwl/basewidget/fwl_formproxyimp.h"
+#include "xfa/fwl/basewidget/fwl_monthcalendarimp.h"
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/basewidget/fwl_spinbutton.h"
+
+#define FWL_DTP_WIDTH 100
+#define FWL_DTP_HEIGHT 20
+
+// static
+IFWL_DateTimePicker* IFWL_DateTimePicker::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_DateTimePicker* pDateTimePicker = new IFWL_DateTimePicker;
+  CFWL_DateTimePickerImp* pDateTimePickerImpl =
+      new CFWL_DateTimePickerImp(properties, pOuter);
+  pDateTimePicker->SetImpl(pDateTimePickerImpl);
+  pDateTimePickerImpl->SetInterface(pDateTimePicker);
+  return pDateTimePicker;
+}
+
+// Static
+IFWL_DateTimeForm* IFWL_DateTimeForm::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_DateTimeForm* pDateTimeForm = new IFWL_DateTimeForm;
+  CFWL_FormProxyImp* pFormProxyImpl = new CFWL_FormProxyImp(properties, pOuter);
+  pDateTimeForm->SetImpl(pFormProxyImpl);
+  pFormProxyImpl->SetInterface(pDateTimeForm);
+  return pDateTimeForm;
+}
+
+// static
+IFWL_DateTimeCalender* IFWL_DateTimeCalender::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_DateTimeCalender* pDateTimeCalendar = new IFWL_DateTimeCalender;
+  CFWL_DateTimeCalendar* pDateTimeCalendarImpl =
+      new CFWL_DateTimeCalendar(properties, pOuter);
+  pDateTimeCalendar->SetImpl(pDateTimeCalendarImpl);
+  pDateTimeCalendarImpl->SetInterface(pDateTimeCalendar);
+  return pDateTimeCalendar;
+}
+
+// static
+IFWL_DateTimeEdit* IFWL_DateTimeEdit::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_DateTimeEdit* pDateTimeEdit = new IFWL_DateTimeEdit;
+  CFWL_DateTimeEdit* pDateTimeEditImpl =
+      new CFWL_DateTimeEdit(properties, pOuter);
+  pDateTimeEdit->SetImpl(pDateTimeEditImpl);
+  pDateTimeEditImpl->SetInterface(pDateTimeEdit);
+  return pDateTimeEdit;
+}
+
+IFWL_DateTimePicker::IFWL_DateTimePicker() {}
+int32_t IFWL_DateTimePicker::CountSelRanges() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->GetDataTimeEdit()
+      ->CountSelRanges();
+}
+int32_t IFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->GetDataTimeEdit()
+      ->GetSelRange(nIndex, nStart);
+}
+FWL_ERR IFWL_DateTimePicker::GetCurSel(int32_t& iYear,
+                                       int32_t& iMonth,
+                                       int32_t& iDay) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->GetCurSel(iYear, iMonth, iDay);
+}
+FWL_ERR IFWL_DateTimePicker::SetCurSel(int32_t iYear,
+                                       int32_t iMonth,
+                                       int32_t iDay) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->SetCurSel(iYear, iMonth, iDay);
+}
+FWL_ERR IFWL_DateTimePicker::SetEditText(const CFX_WideString& wsText) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SetEditText(wsText);
+}
+FWL_ERR IFWL_DateTimePicker::GetEditText(CFX_WideString& wsText,
+                                         int32_t nStart,
+                                         int32_t nCount) const {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->GetEditText(wsText, nStart, nCount);
+}
+FX_BOOL IFWL_DateTimePicker::CanUndo() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanUndo();
+}
+FX_BOOL IFWL_DateTimePicker::CanRedo() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanRedo();
+}
+FX_BOOL IFWL_DateTimePicker::Undo() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Undo();
+}
+FX_BOOL IFWL_DateTimePicker::Redo() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Redo();
+}
+FX_BOOL IFWL_DateTimePicker::CanCopy() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanCopy();
+}
+FX_BOOL IFWL_DateTimePicker::CanCut() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanCut();
+}
+FX_BOOL IFWL_DateTimePicker::CanSelectAll() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanSelectAll();
+}
+FX_BOOL IFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Copy(wsCopy);
+}
+FX_BOOL IFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Cut(wsCut);
+}
+FX_BOOL IFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Paste(wsPaste);
+}
+FX_BOOL IFWL_DateTimePicker::SelectAll() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SelectAll();
+}
+FX_BOOL IFWL_DateTimePicker::Delete() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Delete();
+}
+FX_BOOL IFWL_DateTimePicker::DeSelect() {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->DeSelect();
+}
+FWL_ERR IFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->GetBBox(rect);
+}
+FWL_ERR IFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SetEditLimit(nLimit);
+}
+FWL_ERR IFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
+                                                FX_DWORD dwStylesExRemoved) {
+  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
+      ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+CFWL_DateTimeEdit::CFWL_DateTimeEdit(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter)
+    : CFWL_EditImp(properties, pOuter) {}
+FWL_ERR CFWL_DateTimeEdit::Initialize() {
+  m_pDelegate = new CFWL_DateTimeEditImpDelegate(this);
+  if (CFWL_EditImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimeEdit::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_EditImp::Finalize();
+}
+CFWL_DateTimeEditImpDelegate::CFWL_DateTimeEditImpDelegate(
+    CFWL_DateTimeEdit* pOwner)
+    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
+int32_t CFWL_DateTimeEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_OnProcessMessage(pMessage);
+  }
+  FX_DWORD dwHashCode = pMessage->GetClassID();
+  if (dwHashCode == FWL_MSGHASH_SetFocus ||
+      dwHashCode == FWL_MSGHASH_KillFocus) {
+    IFWL_Widget* pOuter = m_pOwner->GetOuter();
+    IFWL_WidgetDelegate* pDelegate = pOuter->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(pMessage);
+  }
+  return 1;
+}
+int32_t CFWL_DateTimeEditImpDelegate::DisForm_OnProcessMessage(
+    CFWL_Message* pMessage) {
+  FX_DWORD dwHashCode = pMessage->GetClassID();
+  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+    if (dwHashCode == FWL_MSGHASH_Mouse) {
+      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
+      if (pMouse->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown ||
+          pMouse->m_dwCmd == FWL_MSGMOUSECMD_RButtonDown) {
+        if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+          m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+        }
+        CFWL_DateTimePickerImp* pDateTime =
+            static_cast<CFWL_DateTimePickerImp*>(m_pOwner->m_pOuter->GetImpl());
+        if (pDateTime->IsMonthCalendarShowed()) {
+          CFX_RectF rtInvalidate;
+          pDateTime->GetWidgetRect(rtInvalidate);
+          pDateTime->ShowMonthCalendar(FALSE);
+          rtInvalidate.Offset(-rtInvalidate.left, -rtInvalidate.top);
+          pDateTime->Repaint(&rtInvalidate);
+        }
+      }
+    } else if (dwHashCode == FWL_MSGHASH_Key) {
+      return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
+    }
+  }
+  return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
+}
+CFWL_DateTimeCalendar::CFWL_DateTimeCalendar(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_MonthCalendarImp(properties, pOuter) {}
+FWL_ERR CFWL_DateTimeCalendar::Initialize() {
+  if (CFWL_MonthCalendarImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  delete m_pDelegate;
+  m_pDelegate = new CFWL_DateTimeCalendarImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimeCalendar::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_MonthCalendarImp::Finalize();
+}
+CFWL_DateTimeCalendarImpDelegate::CFWL_DateTimeCalendarImpDelegate(
+    CFWL_DateTimeCalendar* pOwner)
+    : CFWL_MonthCalendarImpDelegate(pOwner), m_pOwner(pOwner) {
+  m_bFlag = FALSE;
+}
+int32_t CFWL_DateTimeCalendarImpDelegate::OnProcessMessage(
+    CFWL_Message* pMessage) {
+  FX_DWORD dwCode = pMessage->GetClassID();
+  if (dwCode == FWL_MSGHASH_SetFocus || dwCode == FWL_MSGHASH_KillFocus) {
+    IFWL_Widget* pOuter = m_pOwner->GetOuter();
+    IFWL_WidgetDelegate* pDelegate = pOuter->SetDelegate(NULL);
+    return pDelegate->OnProcessMessage(pMessage);
+  } else if (dwCode == FWL_MSGHASH_Mouse) {
+    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+    if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) {
+      OnLButtonDownEx(pMsg);
+      return 1;
+    } else if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
+      OnLButtonUpEx(pMsg);
+      return 1;
+    }
+  }
+  return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
+}
+void CFWL_DateTimeCalendarImpDelegate::OnLButtonDownEx(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed;
+    m_pOwner->PrevMonth();
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed;
+    m_pOwner->NextMonth();
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
+        0) {
+      m_pOwner->JumpToToday();
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+  } else {
+    IFWL_DateTimePicker* pIPicker =
+        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
+    CFWL_DateTimePickerImp* pPicker =
+        static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
+    if (pPicker->IsMonthCalendarShowed()) {
+      m_bFlag = 1;
+    }
+  }
+}
+void CFWL_DateTimeCalendarImpDelegate::OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_OnLButtonUpEx(pMsg);
+  }
+  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iLBtnPartStates = 0;
+    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
+    return;
+  }
+  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iRBtnPartStates = 0;
+    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
+    return;
+  }
+  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    return;
+  }
+  int32_t iOldSel = 0;
+  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
+    iOldSel = m_pOwner->m_arrSelDays[0];
+  }
+  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+  CFX_RectF rt;
+  IFWL_DateTimePicker* pIPicker =
+      static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
+  CFWL_DateTimePickerImp* pPicker =
+      static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
+  pPicker->m_pForm->GetWidgetRect(rt);
+  rt.Set(0, 0, rt.width, rt.height);
+  if (iCurSel > 0) {
+    FWL_DATEINFO* lpDatesInfo =
+        (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+    CFX_RectF rtInvalidate(lpDatesInfo->rect);
+    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
+      lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+      rtInvalidate.Union(lpDatesInfo->rect);
+    }
+    m_pOwner->AddSelDay(iCurSel);
+    if (!m_pOwner->m_pOuter)
+      return;
+    pPicker->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
+                               iCurSel);
+    pPicker->ShowMonthCalendar(FALSE);
+  } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) {
+    IFWL_DateTimePicker* pIPicker =
+        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
+    CFWL_DateTimePickerImp* pPicker =
+        static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
+    pPicker->ShowMonthCalendar(FALSE);
+  }
+  m_bFlag = 0;
+}
+void CFWL_DateTimeCalendarImpDelegate::OnMouseMoveEx(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+    return;
+  }
+  FX_BOOL bRepaint = FALSE;
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, 0, 0);
+  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    bRepaint = m_pOwner->m_iHovered != iHover;
+    if (bRepaint) {
+      if (m_pOwner->m_iHovered > 0) {
+        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
+      }
+      if (iHover > 0) {
+        CFX_RectF rtDay;
+        m_pOwner->GetDayRect(iHover, rtDay);
+        if (rtInvalidate.IsEmpty()) {
+          rtInvalidate = rtDay;
+        } else {
+          rtInvalidate.Union(rtDay);
+        }
+      }
+    }
+    m_pOwner->m_iHovered = iHover;
+    CFWL_Event_DtpHoverChanged ev;
+    ev.hoverday = iHover;
+    m_pOwner->DispatchEvent(&ev);
+  } else {
+    bRepaint = m_pOwner->m_iHovered > 0;
+    if (bRepaint) {
+      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
+    }
+    m_pOwner->m_iHovered = -1;
+  }
+  if (bRepaint && !rtInvalidate.IsEmpty()) {
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+int32_t CFWL_DateTimeCalendarImpDelegate::DisForm_OnProcessMessage(
+    CFWL_Message* pMessage) {
+  if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) {
+    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+    if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
+      DisForm_OnLButtonUpEx(pMsg);
+      return 1;
+    }
+  }
+  return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
+}
+void CFWL_DateTimeCalendarImpDelegate::DisForm_OnLButtonUpEx(
+    CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iLBtnPartStates = 0;
+    m_pOwner->Repaint(&(m_pOwner->m_rtLBtn));
+    return;
+  }
+  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iRBtnPartStates = 0;
+    m_pOwner->Repaint(&(m_pOwner->m_rtRBtn));
+    return;
+  }
+  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    return;
+  }
+  int32_t iOldSel = 0;
+  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
+    iOldSel = m_pOwner->m_arrSelDays[0];
+  }
+  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (iCurSel > 0) {
+    FWL_DATEINFO* lpDatesInfo =
+        (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+    CFX_RectF rtInvalidate(lpDatesInfo->rect);
+    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
+      lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+      rtInvalidate.Union(lpDatesInfo->rect);
+    }
+    m_pOwner->AddSelDay(iCurSel);
+    CFWL_DateTimePickerImp* pDateTime =
+        static_cast<CFWL_DateTimePickerImp*>(m_pOwner->m_pOuter->GetImpl());
+    pDateTime->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
+                                 iCurSel);
+    pDateTime->ShowMonthCalendar(FALSE);
+  }
+}
+CFWL_DateTimePickerImp::CFWL_DateTimePickerImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_iBtnState(1),
+      m_iYear(-1),
+      m_iMonth(-1),
+      m_iDay(-1),
+      m_bLBtnDown(FALSE),
+      m_pEdit(nullptr),
+      m_pMonthCal(nullptr),
+      m_pForm(nullptr) {
+  m_rtBtn.Set(0, 0, 0, 0);
+}
+CFWL_DateTimePickerImp::~CFWL_DateTimePickerImp() {}
+FWL_ERR CFWL_DateTimePickerImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_DateTimePicker;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_DateTimePickerImp::GetClassID() const {
+  return FWL_CLASSHASH_DateTimePicker;
+}
+FWL_ERR CFWL_DateTimePickerImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_DateTimePickerImpDelegate(this);
+  m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
+  CFWL_WidgetImpProperties propMonth;
+  propMonth.m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
+  propMonth.m_dwStates = FWL_WGTSTATE_Invisible;
+  propMonth.m_pDataProvider = &m_MonthCalendarDP;
+  propMonth.m_pParent = m_pInterface;
+  propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pMonthCal.reset(IFWL_DateTimeCalender::Create(propMonth, m_pInterface));
+  m_pMonthCal->Initialize();
+  CFX_RectF rtMonthCal;
+  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
+  rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height);
+  m_pMonthCal->SetWidgetRect(rtMonthCal);
+  CFWL_WidgetImpProperties propEdit;
+  propEdit.m_pParent = m_pInterface;
+  propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pEdit.reset(IFWL_DateTimeEdit::Create(propEdit, m_pInterface));
+  m_pEdit->Initialize();
+  RegisterEventTarget(m_pMonthCal.get());
+  RegisterEventTarget(m_pEdit.get());
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::Finalize() {
+  if (m_pEdit) {
+    m_pEdit->Finalize();
+  }
+  if (m_pMonthCal) {
+    m_pMonthCal->Finalize();
+  }
+  if (m_pForm) {
+    m_pForm->Finalize();
+  }
+  UnregisterEventTarget();
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_DateTimePickerImp::GetWidgetRect(CFX_RectF& rect,
+                                              FX_BOOL bAutoSize) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_GetWidgetRect(rect, bAutoSize);
+  }
+  if (bAutoSize) {
+    rect.Set(0, 0, FWL_DTP_WIDTH, FWL_DTP_HEIGHT);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::Update() {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_Update();
+  }
+  if (m_iLock) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
+  GetClientRect(m_rtClient);
+  FX_FLOAT* pFWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pFWidth)
+    return FWL_ERR_Indefinite;
+  FX_FLOAT fBtn = *pFWidth;
+  m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn - 1,
+              m_rtClient.height - 1);
+  CFX_RectF rtEdit;
+  rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
+             m_rtClient.height);
+  m_pEdit->SetWidgetRect(rtEdit);
+  ReSetEditAlignment();
+  m_pEdit->Update();
+  if (!(m_pMonthCal->GetThemeProvider())) {
+    m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
+  }
+  if (m_pProperties->m_pDataProvider) {
+    IFWL_DateTimePickerDP* pData =
+        static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
+    pData->GetToday(m_pInterface, m_MonthCalendarDP.m_iCurYear,
+                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+  }
+  CFX_RectF rtMonthCal;
+  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
+  CFX_RectF rtPopUp;
+  rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT,
+              rtMonthCal.width, rtMonthCal.height);
+  m_pMonthCal->SetWidgetRect(rtPopUp);
+  m_pMonthCal->Update();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_DateTimePickerImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_HitTest(fx, fy);
+  }
+  if (m_rtClient.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  if (IsMonthCalendarShowed()) {
+    CFX_RectF rect;
+    m_pMonthCal->GetWidgetRect(rect);
+    if (rect.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Client;
+    }
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FWL_ERR CFWL_DateTimePickerImp::DrawWidget(CFX_Graphics* pGraphics,
+                                           const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_DTP_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_DTP_Edge, pTheme, pMatrix);
+  }
+  if (!m_rtBtn.IsEmpty()) {
+    DrawDropDownButton(pGraphics, pTheme, pMatrix);
+  }
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_DrawWidget(pGraphics, pMatrix);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::SetThemeProvider(IFWL_ThemeProvider* pTP) {
+  m_pProperties->m_pThemeProvider = pTP;
+  m_pMonthCal->SetThemeProvider(pTP);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::GetCurSel(int32_t& iYear,
+                                          int32_t& iMonth,
+                                          int32_t& iDay) {
+  iYear = m_iYear;
+  iMonth = m_iMonth;
+  iDay = m_iDay;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::SetCurSel(int32_t iYear,
+                                          int32_t iMonth,
+                                          int32_t iDay) {
+  if (iYear <= 0 || iYear >= 3000)
+    return FWL_ERR_Indefinite;
+  if (iMonth <= 0 || iMonth >= 13)
+    return FWL_ERR_Indefinite;
+  if (iDay <= 0 || iDay >= 32)
+    return FWL_ERR_Indefinite;
+  m_iYear = iYear;
+  m_iMonth = iMonth;
+  m_iDay = iDay;
+  m_pMonthCal->SetSelect(iYear, iMonth, iDay);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::SetEditText(const CFX_WideString& wsText) {
+  if (!m_pEdit)
+    return FWL_ERR_Indefinite;
+  int32_t iRet = m_pEdit->SetText(wsText);
+  Repaint(&m_rtClient);
+  CFWL_Event_DtpEditChanged ev;
+  ev.m_wsText = wsText;
+  DispatchEvent(&ev);
+  return iRet;
+}
+FWL_ERR CFWL_DateTimePickerImp::GetEditText(CFX_WideString& wsText,
+                                            int32_t nStart,
+                                            int32_t nCount) const {
+  if (m_pEdit) {
+    return m_pEdit->GetText(wsText, nStart, nCount);
+  }
+  return FWL_ERR_Indefinite;
+}
+FX_BOOL CFWL_DateTimePickerImp::CanUndo() {
+  return m_pEdit->CanUndo();
+}
+FX_BOOL CFWL_DateTimePickerImp::CanRedo() {
+  return m_pEdit->CanRedo();
+}
+FX_BOOL CFWL_DateTimePickerImp::Undo() {
+  return m_pEdit->Undo();
+}
+FX_BOOL CFWL_DateTimePickerImp::Redo() {
+  return m_pEdit->Redo();
+}
+FX_BOOL CFWL_DateTimePickerImp::CanCopy() {
+  int32_t nCount = m_pEdit->CountSelRanges();
+  return nCount > 0;
+}
+FX_BOOL CFWL_DateTimePickerImp::CanCut() {
+  if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
+    return FALSE;
+  }
+  int32_t nCount = m_pEdit->CountSelRanges();
+  return nCount > 0;
+}
+FX_BOOL CFWL_DateTimePickerImp::CanSelectAll() {
+  return m_pEdit->GetTextLength() > 0;
+}
+FX_BOOL CFWL_DateTimePickerImp::Copy(CFX_WideString& wsCopy) {
+  return m_pEdit->Copy(wsCopy);
+}
+FX_BOOL CFWL_DateTimePickerImp::Cut(CFX_WideString& wsCut) {
+  return m_pEdit->Cut(wsCut);
+}
+FX_BOOL CFWL_DateTimePickerImp::Paste(const CFX_WideString& wsPaste) {
+  return m_pEdit->Paste(wsPaste);
+}
+FX_BOOL CFWL_DateTimePickerImp::SelectAll() {
+  return m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_DateTimePickerImp::Delete() {
+  return m_pEdit->ClearText() == FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_DateTimePickerImp::DeSelect() {
+  return m_pEdit->ClearSelections() == FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::GetBBox(CFX_RectF& rect) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_GetBBox(rect);
+  }
+  rect = m_pProperties->m_rtWidget;
+  if (IsMonthCalendarShowed()) {
+    CFX_RectF rtMonth;
+    m_pMonthCal->GetWidgetRect(rtMonth);
+    rtMonth.Offset(m_pProperties->m_rtWidget.left,
+                   m_pProperties->m_rtWidget.top);
+    rect.Union(rtMonth);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::SetEditLimit(int32_t nLimit) {
+  return m_pEdit->SetLimit(nLimit);
+}
+FWL_ERR CFWL_DateTimePickerImp::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
+                                                   FX_DWORD dwStylesExRemoved) {
+  return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+void CFWL_DateTimePickerImp::DrawDropDownButton(CFX_Graphics* pGraphics,
+                                                IFWL_ThemeProvider* pTheme,
+                                                const CFX_Matrix* pMatrix) {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_Spin) ==
+      FWL_STYLEEXT_DTP_Spin) {
+    CFWL_WidgetImpProperties prop;
+    prop.m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert;
+    prop.m_pParent = m_pInterface;
+    prop.m_rtWidget = m_rtBtn;
+    IFWL_SpinButton* pSpin = IFWL_SpinButton::Create(prop, m_pInterface);
+    pSpin->Initialize();
+  } else {
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_DTP_DropDownButton;
+    param.m_dwStates = m_iBtnState;
+    param.m_pGraphics = pGraphics;
+    param.m_rtPart = m_rtBtn;
+    if (pMatrix) {
+      param.m_matrix.Concat(*pMatrix);
+    }
+    pTheme->DrawBackground(&param);
+  }
+}
+void CFWL_DateTimePickerImp::FormatDateString(int32_t iYear,
+                                              int32_t iMonth,
+                                              int32_t iDay,
+                                              CFX_WideString& wsText) {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_ShortDateFormat) ==
+      FWL_STYLEEXT_DTP_ShortDateFormat) {
+    wsText.Format(L"%d-%d-%d", iYear, iMonth, iDay);
+  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_LongDateFormat) ==
+             FWL_STYLEEXT_DTP_LongDateFormat) {
+    wsText.Format(L"%d Year %d Month %d Day", iYear, iMonth, iDay);
+  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat) ==
+             FWL_STYLEEXT_DTP_TimeFormat) {
+  }
+}
+void CFWL_DateTimePickerImp::ShowMonthCalendar(FX_BOOL bActivate) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_ShowMonthCalendar(bActivate);
+  }
+  if (IsMonthCalendarShowed() == bActivate) {
+    return;
+  }
+  if (!m_pForm) {
+    InitProxyForm();
+  }
+  if (bActivate) {
+    CFX_RectF rtMonth;
+    m_pMonthCal->GetWidgetRect(rtMonth);
+    CFX_RectF rtAnchor;
+    rtAnchor.Set(0, 0, m_pProperties->m_rtWidget.width,
+                 m_pProperties->m_rtWidget.height);
+    GetPopupPos(0, rtMonth.height, rtAnchor, rtMonth);
+    m_pForm->SetWidgetRect(rtMonth);
+    rtMonth.left = rtMonth.top = 0;
+    m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
+    m_pMonthCal->SetWidgetRect(rtMonth);
+    m_pMonthCal->Update();
+    m_pForm->DoModal();
+  } else {
+    m_pForm->EndDoModal();
+  }
+}
+FX_BOOL CFWL_DateTimePickerImp::IsMonthCalendarShowed() {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_IsMonthCalendarShowed();
+  }
+  if (!m_pForm)
+    return FALSE;
+  return !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
+}
+void CFWL_DateTimePickerImp::ReSetEditAlignment() {
+  if (!m_pEdit)
+    return;
+  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
+  FX_DWORD dwAdd = 0;
+  switch (dwStylExes & FWL_STYLEEXT_DTP_EditHAlignMask) {
+    case FWL_STYLEEXT_DTP_EditHCenter: {
+      dwAdd |= FWL_STYLEEXT_EDT_HCenter;
+      break;
+    }
+    case FWL_STYLEEXT_DTP_EditHFar: {
+      dwAdd |= FWL_STYLEEXT_EDT_HFar;
+      break;
+    }
+    default: { dwAdd |= FWL_STYLEEXT_EDT_HNear; }
+  }
+  switch (dwStylExes & FWL_STYLEEXT_DTP_EditVAlignMask) {
+    case FWL_STYLEEXT_DTP_EditVCenter: {
+      dwAdd |= FWL_STYLEEXT_EDT_VCenter;
+      break;
+    }
+    case FWL_STYLEEXT_DTP_EditVFar: {
+      dwAdd |= FWL_STYLEEXT_EDT_VFar;
+      break;
+    }
+    default: { dwAdd |= FWL_STYLEEXT_EDT_VNear; }
+  }
+  if (dwStylExes & FWL_STYLEEXT_DTP_EditJustified) {
+    dwAdd |= FWL_STYLEEXT_EDT_Justified;
+  }
+  if (dwStylExes & FWL_STYLEEXT_DTP_EditDistributed) {
+    dwAdd |= FWL_STYLEEXT_EDT_Distributed;
+  }
+  m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
+                                     FWL_STYLEEXT_EDT_HAlignModeMask |
+                                     FWL_STYLEEXT_EDT_VAlignMask);
+}
+void CFWL_DateTimePickerImp::ProcessSelChanged(int32_t iYear,
+                                               int32_t iMonth,
+                                               int32_t iDay) {
+  m_iYear = iYear;
+  m_iMonth = iMonth;
+  m_iDay = iDay;
+  CFX_WideString wsText;
+  FormatDateString(m_iYear, m_iMonth, m_iDay, wsText);
+  m_pEdit->SetText(wsText);
+  m_pEdit->Update();
+  Repaint(&m_rtClient);
+  CFWL_Event_DtpSelectChanged ev;
+  ev.m_pSrcTarget = m_pInterface;
+  ev.iYear = m_iYear;
+  ev.iMonth = m_iMonth;
+  ev.iDay = m_iDay;
+  DispatchEvent(&ev);
+}
+void CFWL_DateTimePickerImp::InitProxyForm() {
+  if (m_pForm)
+    return;
+  if (!m_pMonthCal)
+    return;
+  CFWL_WidgetImpProperties propForm;
+  propForm.m_dwStyles = FWL_WGTSTYLE_Popup;
+  propForm.m_dwStates = FWL_WGTSTATE_Invisible;
+  propForm.m_pOwner = m_pInterface;
+  m_pForm.reset(IFWL_DateTimeForm::Create(propForm, m_pMonthCal.get()));
+  m_pForm->Initialize();
+  m_pMonthCal->SetParent(m_pForm.get());
+}
+IFWL_DateTimeEdit* CFWL_DateTimePickerImp::GetDataTimeEdit() {
+  return m_pEdit.get();
+}
+FWL_ERR CFWL_DateTimePickerImp::DisForm_Initialize() {
+  m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
+  DisForm_InitDateTimeCalendar();
+  DisForm_InitDateTimeEdit();
+  RegisterEventTarget(m_pMonthCal.get());
+  RegisterEventTarget(m_pEdit.get());
+  return FWL_ERR_Succeeded;
+}
+void CFWL_DateTimePickerImp::DisForm_InitDateTimeCalendar() {
+  if (m_pMonthCal) {
+    return;
+  }
+  CFWL_WidgetImpProperties propMonth;
+  propMonth.m_dwStyles =
+      FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border | FWL_WGTSTYLE_EdgeSunken;
+  propMonth.m_dwStates = FWL_WGTSTATE_Invisible;
+  propMonth.m_pParent = m_pInterface;
+  propMonth.m_pDataProvider = &m_MonthCalendarDP;
+  propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pMonthCal.reset(IFWL_DateTimeCalender::Create(propMonth, m_pInterface));
+  m_pMonthCal->Initialize();
+  CFX_RectF rtMonthCal;
+  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
+  rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height);
+  m_pMonthCal->SetWidgetRect(rtMonthCal);
+}
+void CFWL_DateTimePickerImp::DisForm_InitDateTimeEdit() {
+  if (m_pEdit) {
+    return;
+  }
+  CFWL_WidgetImpProperties propEdit;
+  propEdit.m_pParent = m_pInterface;
+  propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  m_pEdit.reset(IFWL_DateTimeEdit::Create(propEdit, m_pInterface));
+  m_pEdit->Initialize();
+}
+FX_BOOL CFWL_DateTimePickerImp::DisForm_IsMonthCalendarShowed() {
+  if (!m_pMonthCal)
+    return FALSE;
+  return !(m_pMonthCal->GetStates() & FWL_WGTSTATE_Invisible);
+}
+void CFWL_DateTimePickerImp::DisForm_ShowMonthCalendar(FX_BOOL bActivate) {
+  FX_BOOL bShowed = IsMonthCalendarShowed();
+  if (bShowed == bActivate) {
+    return;
+  }
+  if (bActivate) {
+    CFX_RectF rtMonthCal;
+    m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
+    FX_FLOAT fPopupMin = rtMonthCal.height;
+    FX_FLOAT fPopupMax = rtMonthCal.height;
+    CFX_RectF rtAnchor(m_pProperties->m_rtWidget);
+    rtAnchor.width = rtMonthCal.width;
+    rtMonthCal.left = m_rtClient.left;
+    rtMonthCal.top = rtAnchor.Height();
+    GetPopupPos(fPopupMin, fPopupMax, rtAnchor, rtMonthCal);
+    m_pMonthCal->SetWidgetRect(rtMonthCal);
+    if (m_iYear > 0 && m_iMonth > 0 && m_iDay > 0) {
+      m_pMonthCal->SetSelect(m_iYear, m_iMonth, m_iDay);
+    }
+    m_pMonthCal->Update();
+  }
+  m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
+  if (bActivate) {
+    CFWL_MsgSetFocus msg;
+    msg.m_pDstTarget = m_pMonthCal.get();
+    msg.m_pSrcTarget = m_pEdit.get();
+    IFWL_WidgetDelegate* pDelegate = m_pEdit->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(&msg);
+  }
+  CFX_RectF rtInvalidate, rtCal;
+  rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
+                   m_pProperties->m_rtWidget.height);
+  m_pMonthCal->GetWidgetRect(rtCal);
+  rtInvalidate.Union(rtCal);
+  rtInvalidate.Inflate(2, 2);
+  Repaint(&rtInvalidate);
+}
+FX_DWORD CFWL_DateTimePickerImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rect;
+  rect.Set(0, 0, m_pProperties->m_rtWidget.width,
+           m_pProperties->m_rtWidget.height);
+  if (rect.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Edit;
+  }
+  if (DisForm_IsNeedShowButton()) {
+    rect.width += m_fBtn;
+  }
+  if (rect.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  if (IsMonthCalendarShowed()) {
+    m_pMonthCal->GetWidgetRect(rect);
+    if (rect.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Client;
+    }
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FX_BOOL CFWL_DateTimePickerImp::DisForm_IsNeedShowButton() {
+  FX_BOOL bFocus = m_pProperties->m_dwStates & FWL_WGTSTATE_Focused ||
+                   m_pMonthCal->GetStates() & FWL_WGTSTATE_Focused ||
+                   m_pEdit->GetStates() & FWL_WGTSTATE_Focused;
+  return bFocus;
+}
+FWL_ERR CFWL_DateTimePickerImp::DisForm_Update() {
+  if (m_iLock) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
+  GetClientRect(m_rtClient);
+  m_pEdit->SetWidgetRect(m_rtClient);
+  ReSetEditAlignment();
+  m_pEdit->Update();
+  if (m_pMonthCal->GetThemeProvider() == NULL) {
+    m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
+  }
+  if (m_pProperties->m_pDataProvider) {
+    IFWL_DateTimePickerDP* pData =
+        static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
+    pData->GetToday(m_pInterface, m_MonthCalendarDP.m_iCurYear,
+                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+  }
+  FX_FLOAT* pWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pWidth)
+    return 0;
+  m_fBtn = *pWidth;
+  CFX_RectF rtMonthCal;
+  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
+  CFX_RectF rtPopUp;
+  rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT,
+              rtMonthCal.width, rtMonthCal.height);
+  m_pMonthCal->SetWidgetRect(rtPopUp);
+  m_pMonthCal->Update();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::DisForm_GetWidgetRect(CFX_RectF& rect,
+                                                      FX_BOOL bAutoSize) {
+  rect = m_pProperties->m_rtWidget;
+  if (DisForm_IsNeedShowButton()) {
+    rect.width += m_fBtn;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::DisForm_GetBBox(CFX_RectF& rect) {
+  rect = m_pProperties->m_rtWidget;
+  if (DisForm_IsNeedShowButton()) {
+    rect.width += m_fBtn;
+  }
+  if (IsMonthCalendarShowed()) {
+    CFX_RectF rtMonth;
+    m_pMonthCal->GetWidgetRect(rtMonth);
+    rtMonth.Offset(m_pProperties->m_rtWidget.left,
+                   m_pProperties->m_rtWidget.top);
+    rect.Union(rtMonth);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePickerImp::DisForm_DrawWidget(CFX_Graphics* pGraphics,
+                                                   const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (m_pEdit) {
+    CFX_RectF rtEdit;
+    m_pEdit->GetWidgetRect(rtEdit);
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top);
+    if (pMatrix) {
+      mt.Concat(*pMatrix);
+    }
+    m_pEdit->DrawWidget(pGraphics, &mt);
+  }
+  if (IsMonthCalendarShowed()) {
+    CFX_RectF rtMonth;
+    m_pMonthCal->GetWidgetRect(rtMonth);
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, rtMonth.left, rtMonth.top);
+    if (pMatrix) {
+      mt.Concat(*pMatrix);
+    }
+    m_pMonthCal->DrawWidget(pGraphics, &mt);
+  }
+  return FWL_ERR_Succeeded;
+}
+CFWL_DateTimePickerImpDelegate::CFWL_DateTimePickerImpDelegate(
+    CFWL_DateTimePickerImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_DateTimePickerImpDelegate::OnProcessMessage(
+    CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMouse->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMouse);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    default:
+      break;
+  }
+  if (dwMsgCode == FWL_MSGHASH_Key &&
+      m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
+    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+    return pDelegate->OnProcessMessage(pMessage);
+  }
+  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+}
+FWL_ERR CFWL_DateTimePickerImpDelegate::OnDrawWidget(
+    CFX_Graphics* pGraphics,
+    const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_DateTimePickerImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                                    FX_BOOL bSet) {
+  if (!pMsg)
+    return;
+  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+    return DisForm_OnFocusChanged(pMsg, bSet);
+  }
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  }
+  if (pMsg->m_pSrcTarget == m_pOwner->m_pMonthCal.get() &&
+      m_pOwner->IsMonthCalendarShowed()) {
+    m_pOwner->ShowMonthCalendar(FALSE);
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_DateTimePickerImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (!pMsg)
+    return;
+  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    m_pOwner->SetFocus(TRUE);
+  }
+  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (m_pOwner->IsMonthCalendarShowed()) {
+      m_pOwner->ShowMonthCalendar(FALSE);
+      CFWL_Event_DtpCloseUp ev;
+      m_pOwner->DispatchEvent(&ev);
+    } else {
+      if (!(m_pOwner->m_pProperties->m_dwStyleExes &
+            FWL_STYLEEXT_DTP_TimeFormat)) {
+        m_pOwner->ShowMonthCalendar(TRUE);
+        CFWL_Event_DtpDropDown ev;
+        m_pOwner->DispatchEvent(&ev);
+      } else {
+      }
+      m_pOwner->m_bLBtnDown = TRUE;
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+  }
+}
+void CFWL_DateTimePickerImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (!pMsg)
+    return;
+  m_pOwner->m_bLBtnDown = FALSE;
+  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Hovered;
+  } else {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+}
+void CFWL_DateTimePickerImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+  } else {
+    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+}
+void CFWL_DateTimePickerImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (!pMsg)
+    return;
+  m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
+  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+}
+void CFWL_DateTimePickerImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
+                                                            FX_BOOL bSet) {
+  CFX_RectF rtInvalidate(m_pOwner->m_rtBtn);
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (m_pOwner->m_pEdit &&
+        !(m_pOwner->m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) {
+      m_pOwner->m_rtBtn.Set(m_pOwner->m_pProperties->m_rtWidget.width, 0,
+                            m_pOwner->m_fBtn,
+                            m_pOwner->m_pProperties->m_rtWidget.height - 1);
+    }
+    rtInvalidate = m_pOwner->m_rtBtn;
+    pMsg->m_pDstTarget = m_pOwner->m_pEdit.get();
+    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+    pDelegate->OnProcessMessage(pMsg);
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    m_pOwner->m_rtBtn.Set(0, 0, 0, 0);
+    if (m_pOwner->DisForm_IsMonthCalendarShowed()) {
+      m_pOwner->ShowMonthCalendar(FALSE);
+    }
+    if (m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
+      pMsg->m_pSrcTarget = m_pOwner->m_pEdit.get();
+      IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
+      pDelegate->OnProcessMessage(pMsg);
+    }
+  }
+  rtInvalidate.Inflate(2, 2);
+  m_pOwner->Repaint(&rtInvalidate);
+}
diff --git a/xfa/fwl/basewidget/fwl_datetimepickerimp.h b/xfa/fwl/basewidget/fwl_datetimepickerimp.h
new file mode 100644
index 0000000..4c0ebc5
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_datetimepickerimp.h
@@ -0,0 +1,235 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
+
+#include <memory>
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+#include "xfa/fwl/basewidget/fwl_monthcalendarimp.h"
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
+#include "xfa/include/fwl/core/fwl_form.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+class CFWL_WidgetImp;
+class CFWL_WidgetImpProperties;
+class CFWL_WidgetImpDelegate;
+class CFWL_DateTimeEdit;
+class CFWL_DateTimeEditImpDelegate;
+class CFWL_DateTimeCalendar;
+class CFWL_DateTimeCalendarImpDelegate;
+class CFWL_DateTimePickerImp;
+class CFWL_DateTimePickerImpDelegate;
+
+class IFWL_DateTimeForm : public IFWL_Form {
+ public:
+  static IFWL_DateTimeForm* Create(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter);
+
+ protected:
+  IFWL_DateTimeForm() {}
+};
+
+class IFWL_DateTimeCalender : public IFWL_MonthCalendar {
+ public:
+  static IFWL_DateTimeCalender* Create(
+      const CFWL_WidgetImpProperties& properties,
+      IFWL_Widget* pOuter);
+
+ protected:
+  IFWL_DateTimeCalender() {}
+};
+
+class IFWL_DateTimeEdit : public IFWL_Edit {
+ public:
+  static IFWL_DateTimeEdit* Create(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter);
+
+ protected:
+  IFWL_DateTimeEdit() {}
+};
+
+class CFWL_DateTimeEdit : public CFWL_EditImp {
+ public:
+  CFWL_DateTimeEdit(const CFWL_WidgetImpProperties& properties,
+                    IFWL_Widget* pOuter);
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+ protected:
+  friend class CFWL_DateTimeEditImpDelegate;
+};
+class CFWL_DateTimeEditImpDelegate : public CFWL_EditImpDelegate {
+ public:
+  CFWL_DateTimeEditImpDelegate(CFWL_DateTimeEdit* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+
+ private:
+  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
+
+ protected:
+  CFWL_DateTimeEdit* m_pOwner;
+};
+class CFWL_DateTimeCalendar : public CFWL_MonthCalendarImp {
+ public:
+  CFWL_DateTimeCalendar(const CFWL_WidgetImpProperties& properties,
+                        IFWL_Widget* pOuter);
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+ protected:
+  friend class CFWL_DateTimeCalendarImpDelegate;
+};
+class CFWL_DateTimeCalendarImpDelegate : public CFWL_MonthCalendarImpDelegate {
+ public:
+  CFWL_DateTimeCalendarImpDelegate(CFWL_DateTimeCalendar* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+
+  void OnLButtonDownEx(CFWL_MsgMouse* pMsg);
+  void OnLButtonUpEx(CFWL_MsgMouse* pMsg);
+  void OnMouseMoveEx(CFWL_MsgMouse* pMsg);
+
+ private:
+  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
+  void DisForm_OnLButtonUpEx(CFWL_MsgMouse* pMsg);
+
+ protected:
+  CFWL_DateTimeCalendar* m_pOwner;
+  FX_BOOL m_bFlag;
+};
+class CFWL_DateTimePickerImp : public CFWL_WidgetImp {
+ public:
+  CFWL_DateTimePickerImp(const CFWL_WidgetImpProperties& properties,
+                         IFWL_Widget* pOuter);
+  virtual ~CFWL_DateTimePickerImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pTP);
+  virtual FWL_ERR GetCurSel(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
+  virtual FWL_ERR SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
+  virtual FWL_ERR SetEditText(const CFX_WideString& wsText);
+  virtual FWL_ERR GetEditText(CFX_WideString& wsText,
+                              int32_t nStart = 0,
+                              int32_t nCount = -1) const;
+
+ public:
+  virtual FX_BOOL CanUndo();
+  virtual FX_BOOL CanRedo();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+  virtual FX_BOOL CanCopy();
+  virtual FX_BOOL CanCut();
+  virtual FX_BOOL CanSelectAll();
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
+  virtual FX_BOOL Cut(CFX_WideString& wsCut);
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL SelectAll();
+  virtual FX_BOOL Delete();
+  virtual FX_BOOL DeSelect();
+  virtual FWL_ERR GetBBox(CFX_RectF& rect);
+  virtual FWL_ERR SetEditLimit(int32_t nLimit);
+  virtual FWL_ERR ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
+                                     FX_DWORD dwStylesExRemoved);
+
+ public:
+  IFWL_DateTimeEdit* GetDataTimeEdit();
+
+ protected:
+  void DrawDropDownButton(CFX_Graphics* pGraphics,
+                          IFWL_ThemeProvider* pTheme,
+                          const CFX_Matrix* pMatrix);
+  void FormatDateString(int32_t iYear,
+                        int32_t iMonth,
+                        int32_t iDay,
+                        CFX_WideString& wsText);
+  void ShowMonthCalendar(FX_BOOL bActivate);
+  FX_BOOL IsMonthCalendarShowed();
+  void ReSetEditAlignment();
+  void InitProxyForm();
+  void ProcessSelChanged(int32_t iYear, int32_t iMonth, int32_t iDay);
+
+ private:
+  FWL_ERR DisForm_Initialize();
+  void DisForm_InitDateTimeCalendar();
+  void DisForm_InitDateTimeEdit();
+  FX_BOOL DisForm_IsMonthCalendarShowed();
+  void DisForm_ShowMonthCalendar(FX_BOOL bActivate);
+  FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  FX_BOOL DisForm_IsNeedShowButton();
+  FWL_ERR DisForm_Update();
+  FWL_ERR DisForm_GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  FWL_ERR DisForm_GetBBox(CFX_RectF& rect);
+  FWL_ERR DisForm_DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  CFX_RectF m_rtBtn;
+  CFX_RectF m_rtClient;
+  int32_t m_iBtnState;
+  int32_t m_iYear;
+  int32_t m_iMonth;
+  int32_t m_iDay;
+  FX_BOOL m_bLBtnDown;
+  std::unique_ptr<IFWL_DateTimeEdit> m_pEdit;
+  std::unique_ptr<IFWL_DateTimeCalender> m_pMonthCal;
+  std::unique_ptr<IFWL_DateTimeForm> m_pForm;
+  FX_FLOAT m_fBtn;
+  class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP {
+   public:
+    CFWL_MonthCalendarImpDP() {
+      m_iCurYear = 2010;
+      m_iCurMonth = 3;
+      m_iCurDay = 29;
+    }
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget,
+                               CFX_WideString& wsCaption) {
+      return FWL_ERR_Succeeded;
+    }
+    virtual int32_t GetCurDay(IFWL_Widget* pWidget) { return m_iCurDay; }
+    virtual int32_t GetCurMonth(IFWL_Widget* pWidget) { return m_iCurMonth; }
+    virtual int32_t GetCurYear(IFWL_Widget* pWidget) { return m_iCurYear; }
+    int32_t m_iCurDay;
+    int32_t m_iCurYear;
+    int32_t m_iCurMonth;
+  };
+
+  CFWL_MonthCalendarImpDP m_MonthCalendarDP;
+  friend class CFWL_DateTimeEditImpDelegate;
+  friend class CFWL_DateTimeCalendar;
+  friend class CFWL_DateTimeCalendarImpDelegate;
+  friend class CFWL_DateTimePickerImpDelegate;
+};
+class CFWL_DateTimePickerImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_DateTimePickerImpDelegate(CFWL_DateTimePickerImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+
+  CFWL_DateTimePickerImp* m_pOwner;
+
+ private:
+  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_editimp.cpp b/xfa/fwl/basewidget/fwl_editimp.cpp
new file mode 100644
index 0000000..6975f50
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_editimp.cpp
@@ -0,0 +1,2152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_editimp.h"
+
+#include <algorithm>
+#include <vector>
+
+#include "xfa/fde/fde_render.h"
+#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fee/ifde_txtedtpage.h"
+#include "xfa/fwl/basewidget/fwl_caretimp.h"
+#include "xfa/fwl/basewidget/fwl_comboboximp.h"
+#include "xfa/fwl/basewidget/fwl_scrollbarimp.h"
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/basewidget/fwl_caret.h"
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+// static
+IFWL_Edit* IFWL_Edit::Create(const CFWL_WidgetImpProperties& properties,
+                             IFWL_Widget* pOuter) {
+  IFWL_Edit* pEdit = new IFWL_Edit;
+  CFWL_EditImp* pEditImpl = new CFWL_EditImp(properties, pOuter);
+  pEdit->SetImpl(pEditImpl);
+  pEditImpl->SetInterface(pEdit);
+  return pEdit;
+}
+// static
+IFWL_Edit* IFWL_Edit::CreateComboEdit(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_Edit* pEdit = new IFWL_Edit;
+  CFWL_EditImp* pComboEditImpl = new CFWL_ComboEditImp(properties, pOuter);
+  pEdit->SetImpl(pComboEditImpl);
+  pComboEditImpl->SetInterface(pEdit);
+  return pEdit;
+}
+IFWL_Edit::IFWL_Edit() {}
+FWL_ERR IFWL_Edit::SetText(const CFX_WideString& wsText) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetText(wsText);
+}
+int32_t IFWL_Edit::GetTextLength() const {
+  return static_cast<CFWL_EditImp*>(GetImpl())->GetTextLength();
+}
+FWL_ERR IFWL_Edit::GetText(CFX_WideString& wsText,
+                           int32_t nStart,
+                           int32_t nCount) const {
+  return static_cast<CFWL_EditImp*>(GetImpl())->GetText(wsText, nStart, nCount);
+}
+FWL_ERR IFWL_Edit::ClearText() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->ClearText();
+}
+int32_t IFWL_Edit::GetCaretPos() const {
+  return static_cast<CFWL_EditImp*>(GetImpl())->GetCaretPos();
+}
+int32_t IFWL_Edit::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetCaretPos(nIndex, bBefore);
+}
+FWL_ERR IFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->AddSelRange(nStart, nCount);
+}
+int32_t IFWL_Edit::CountSelRanges() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->CountSelRanges();
+}
+int32_t IFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->GetSelRange(nIndex, nStart);
+}
+FWL_ERR IFWL_Edit::ClearSelections() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->ClearSelections();
+}
+int32_t IFWL_Edit::GetLimit() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->GetLimit();
+}
+FWL_ERR IFWL_Edit::SetLimit(int32_t nLimit) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetLimit(nLimit);
+}
+FWL_ERR IFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetAliasChar(wAlias);
+}
+FWL_ERR IFWL_Edit::Insert(int32_t nStart,
+                          const FX_WCHAR* lpText,
+                          int32_t nLen) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Insert(nStart, lpText, nLen);
+}
+FWL_ERR IFWL_Edit::DeleteSelections() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->DeleteSelections();
+}
+FWL_ERR IFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->DeleteRange(nStart, nCount);
+}
+FWL_ERR IFWL_Edit::ReplaceSelections(const CFX_WideStringC& wsReplace) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->ReplaceSelections(wsReplace);
+}
+FWL_ERR IFWL_Edit::Replace(int32_t nStart,
+                           int32_t nLen,
+                           const CFX_WideStringC& wsReplace) {
+  return static_cast<CFWL_EditImp*>(GetImpl())
+      ->Replace(nStart, nLen, wsReplace);
+}
+FWL_ERR IFWL_Edit::DoClipboard(int32_t iCmd) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->DoClipboard(iCmd);
+}
+FX_BOOL IFWL_Edit::Copy(CFX_WideString& wsCopy) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Copy(wsCopy);
+}
+FX_BOOL IFWL_Edit::Cut(CFX_WideString& wsCut) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Cut(wsCut);
+}
+FX_BOOL IFWL_Edit::Paste(const CFX_WideString& wsPaste) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Paste(wsPaste);
+}
+FX_BOOL IFWL_Edit::Delete() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Delete();
+}
+FX_BOOL IFWL_Edit::Redo(const CFX_ByteStringC& bsRecord) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Redo(bsRecord);
+}
+FX_BOOL IFWL_Edit::Undo(const CFX_ByteStringC& bsRecord) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Undo(bsRecord);
+}
+FX_BOOL IFWL_Edit::Undo() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Undo();
+}
+FX_BOOL IFWL_Edit::Redo() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->Redo();
+}
+FX_BOOL IFWL_Edit::CanUndo() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->CanUndo();
+}
+FX_BOOL IFWL_Edit::CanRedo() {
+  return static_cast<CFWL_EditImp*>(GetImpl())->CanRedo();
+}
+FWL_ERR IFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
+  return static_cast<CFWL_EditImp*>(GetImpl())
+      ->SetTabWidth(fTabWidth, bEquidistant);
+}
+FWL_ERR IFWL_Edit::SetOuter(IFWL_Widget* pOuter) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetOuter(pOuter);
+}
+FWL_ERR IFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetNumberRange(iMin, iMax);
+}
+FWL_ERR IFWL_Edit::SetBackColor(FX_DWORD dwColor) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetBackgroundColor(dwColor);
+}
+FWL_ERR IFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetFont(wsFont, fSize);
+}
+void IFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
+  return static_cast<CFWL_EditImp*>(GetImpl())->SetScrollOffset(fScrollOffset);
+}
+FX_BOOL IFWL_Edit::GetSuggestWords(CFX_PointF pointf,
+                                   std::vector<CFX_ByteString>& sSuggest) {
+  return static_cast<CFWL_EditImp*>(GetImpl())
+      ->GetSuggestWords(pointf, sSuggest);
+}
+FX_BOOL IFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
+                                         const CFX_ByteStringC& bsReplace) {
+  return static_cast<CFWL_EditImp*>(GetImpl())
+      ->ReplaceSpellCheckWord(pointf, bsReplace);
+}
+#define FWL_EDIT_Margin 3
+CFWL_EditImp::CFWL_EditImp(const CFWL_WidgetImpProperties& properties,
+                           IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_fVAlignOffset(0.0f),
+      m_fScrollOffsetX(0.0f),
+      m_fScrollOffsetY(0.0f),
+      m_pEdtEngine(NULL),
+      m_bLButtonDown(FALSE),
+      m_nSelStart(0),
+      m_nLimit(-1),
+      m_fSpaceAbove(0),
+      m_fSpaceBelow(0),
+      m_fFontSize(0),
+      m_bSetRange(FALSE),
+      m_iMin(-1),
+      m_iMax(0xFFFFFFF),
+      m_backColor(0),
+      m_updateBackColor(FALSE),
+      m_iCurRecord(-1),
+      m_iMaxRecord(128) {
+  m_rtClient.Reset();
+  m_rtEngine.Reset();
+  m_rtStatic.Reset();
+}
+CFWL_EditImp::~CFWL_EditImp() {
+  if (m_pEdtEngine) {
+    m_pEdtEngine->Release();
+    m_pEdtEngine = NULL;
+  }
+  ClearRecord();
+}
+FWL_ERR CFWL_EditImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Edit;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_EditImp::GetClassID() const {
+  return FWL_CLASSHASH_Edit;
+}
+FWL_ERR CFWL_EditImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  if (!m_pDelegate) {
+    m_pDelegate = new CFWL_EditImpDelegate(this);
+  }
+  InitCaret();
+  if (!m_pEdtEngine) {
+    InitEngine();
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::Finalize() {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    ShowCaret(FALSE);
+  }
+  if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->Finalize();
+  }
+  if (m_pVertScrollBar) {
+    m_pVertScrollBar->Finalize();
+  }
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_EditImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (m_pEdtEngine) {
+      int32_t iTextLen = m_pEdtEngine->GetTextLength();
+      if (iTextLen > 0) {
+        CFX_WideString wsText;
+        m_pEdtEngine->GetText(wsText, 0);
+        CFX_SizeF sz = CalcTextSize(
+            wsText, m_pProperties->m_pThemeProvider,
+            m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
+        rect.Set(0, 0, sz.x, sz.y);
+      }
+    }
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+      if (IsShowScrollBar(TRUE)) {
+        FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
+            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+        rect.width += *pfWidth;
+        rect.width += FWL_EDIT_Margin;
+      }
+      if (IsShowScrollBar(FALSE)) {
+        FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
+            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+        rect.height += *pfWidth;
+        rect.height += FWL_EDIT_Margin;
+      }
+    }
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+    ShowCaret(FALSE);
+  }
+  return CFWL_WidgetImp::SetStates(dwStates, bSet);
+}
+FWL_ERR CFWL_EditImp::SetWidgetRect(const CFX_RectF& rect) {
+  return CFWL_WidgetImp::SetWidgetRect(rect);
+}
+FWL_ERR CFWL_EditImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  Layout();
+  if (m_rtClient.IsEmpty()) {
+    return FWL_ERR_Indefinite;
+  }
+  UpdateEditEngine();
+  UpdateVAlignment();
+  UpdateScroll();
+  InitCaret();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_EditImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+    if (IsShowScrollBar(TRUE)) {
+      CFX_RectF rect;
+      m_pVertScrollBar->GetWidgetRect(rect);
+      if (rect.Contains(fx, fy)) {
+        return FWL_WGTHITTEST_VScrollBar;
+      }
+    }
+    if (IsShowScrollBar(FALSE)) {
+      CFX_RectF rect;
+      m_pHorzScrollBar->GetWidgetRect(rect);
+      if (rect.Contains(fx, fy)) {
+        return FWL_WGTHITTEST_HScrollBar;
+      }
+    }
+  }
+  if (m_rtClient.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Edit;
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+#define FX_EDIT_ISLATINWORD(u)                                     \
+  (u == 0x2D || (u <= 0x005A && u >= 0x0041) ||                    \
+   (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0) || \
+   u == 0x0027)
+static void AddSquigglyPath(CFX_Path& PathData,
+                            FX_FLOAT fStartX,
+                            FX_FLOAT fEndX,
+                            FX_FLOAT fY,
+                            FX_FLOAT fStep) {
+  PathData.MoveTo(fStartX, fY);
+  FX_FLOAT fx;
+  int32_t i;
+  for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) {
+    PathData.LineTo(fx, fY + (i & 1) * fStep);
+  }
+}
+void CFWL_EditImp::AddSpellCheckObj(CFX_Path& PathData,
+                                    int32_t nStart,
+                                    int32_t nCount,
+                                    FX_FLOAT fOffSetX,
+                                    FX_FLOAT fOffSetY) {
+  FX_FLOAT fStartX = 0.0f;
+  FX_FLOAT fEndX = 0.0f;
+  FX_FLOAT fY = 0.0f;
+  FX_FLOAT fStep = 0.0f;
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  CFX_RectFArray rectArray;
+  CFX_RectF rectText;
+  const FDE_TXTEDTPARAMS* txtEdtParams = m_pEdtEngine->GetEditParams();
+  FX_FLOAT fAsent = (FX_FLOAT)txtEdtParams->pFont->GetAscent() *
+                    txtEdtParams->fFontSize / 1000;
+  pPage->CalcRangeRectArray(nStart, nCount, rectArray);
+  for (int i = 0; i < rectArray.GetSize(); i++) {
+    rectText = rectArray.GetAt(i);
+    fY = rectText.top + fAsent + fOffSetY;
+    fStep = txtEdtParams->fFontSize / 16.0f;
+    fStartX = rectText.left + fOffSetX;
+    fEndX = fStartX + rectText.Width();
+    AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
+  }
+}
+int32_t CFWL_EditImp::GetWordAtPoint(CFX_PointF pointf, int32_t& nCount) {
+  return 0;
+}
+FX_BOOL CFWL_EditImp::GetSuggestWords(CFX_PointF pointf,
+                                      std::vector<CFX_ByteString>& sSuggest) {
+  int32_t nWordCount = 0;
+  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
+  if (nWordCount < 1) {
+    return FALSE;
+  }
+  CFX_WideString wsSpell;
+  GetText(wsSpell, nWordStart, nWordCount);
+  CFX_ByteString sLatinWord;
+  for (int i = 0; i < nWordCount; i++) {
+    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
+      break;
+    }
+    sLatinWord += (FX_CHAR)wsSpell[i];
+  }
+  if (sLatinWord.IsEmpty()) {
+    return FALSE;
+  }
+  CFWL_EvtEdtCheckWord checkWordEvent;
+  checkWordEvent.m_pSrcTarget = m_pInterface;
+  checkWordEvent.bsWord = sLatinWord;
+  checkWordEvent.bCheckWord = TRUE;
+  DispatchEvent(&checkWordEvent);
+  if (checkWordEvent.bCheckWord) {
+    return FALSE;
+  }
+  CFWL_EvtEdtGetSuggestWords suggestWordsEvent;
+  suggestWordsEvent.m_pSrcTarget = m_pInterface;
+  suggestWordsEvent.bsWord = sLatinWord;
+  suggestWordsEvent.bsArraySuggestWords = sSuggest;
+  suggestWordsEvent.bSuggestWords = FALSE;
+  DispatchEvent(&checkWordEvent);
+  return suggestWordsEvent.bSuggestWords;
+}
+FX_BOOL CFWL_EditImp::ReplaceSpellCheckWord(CFX_PointF pointf,
+                                            const CFX_ByteStringC& bsReplace) {
+  int32_t nWordCount = 0;
+  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
+  if (nWordCount < 1) {
+    return FALSE;
+  }
+  CFX_WideString wsSpell;
+  GetText(wsSpell, nWordStart, nWordCount);
+  for (int i = 0; i < nWordCount; i++) {
+    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
+      nWordCount = i;
+      break;
+    }
+  }
+  int32_t nDestLen = bsReplace.GetLength();
+  CFX_WideString wsDest;
+  FX_WCHAR* pBuffer = wsDest.GetBuffer(nDestLen);
+  for (int32_t i = 0; i < nDestLen; i++) {
+    pBuffer[i] = bsReplace[i];
+  }
+  wsDest.ReleaseBuffer(nDestLen);
+  Replace(nWordStart, nWordCount, wsDest);
+  return TRUE;
+}
+void CFWL_EditImp::DrawSpellCheck(CFX_Graphics* pGraphics,
+                                  const CFX_Matrix* pMatrix) {
+  pGraphics->SaveGraphState();
+  if (pMatrix) {
+    pGraphics->ConcatMatrix(const_cast<CFX_Matrix*>(pMatrix));
+  }
+  FX_ARGB cr = 0xFFFF0000;
+  CFX_Color crLine(cr);
+  CFWL_EvtEdtCheckWord checkWordEvent;
+  checkWordEvent.m_pSrcTarget = m_pInterface;
+  CFX_ByteString sLatinWord;
+  CFX_Path pathSpell;
+  pathSpell.Create();
+  int32_t nStart = 0;
+  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
+  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
+  CFX_WideString wsSpell;
+  GetText(wsSpell);
+  int32_t nContentLen = wsSpell.GetLength();
+  for (int i = 0; i < nContentLen; i++) {
+    if (FX_EDIT_ISLATINWORD(wsSpell[i])) {
+      if (sLatinWord.IsEmpty()) {
+        nStart = i;
+      }
+      sLatinWord += (FX_CHAR)wsSpell[i];
+    } else {
+      checkWordEvent.bsWord = sLatinWord;
+      checkWordEvent.bCheckWord = TRUE;
+      DispatchEvent(&checkWordEvent);
+      if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
+        AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
+                         fOffSetY);
+      }
+      sLatinWord.Empty();
+    }
+  }
+  checkWordEvent.bsWord = sLatinWord;
+  checkWordEvent.bCheckWord = TRUE;
+  DispatchEvent(&checkWordEvent);
+  if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
+    AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
+                     fOffSetY);
+  }
+  if (!pathSpell.IsEmpty()) {
+    CFX_RectF rtClip = m_rtEngine;
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY);
+    if (pMatrix) {
+      pMatrix->TransformRect(rtClip);
+      mt.Concat(*pMatrix);
+    }
+    pGraphics->SetClipRect(rtClip);
+    pGraphics->SetStrokeColor(&crLine);
+    pGraphics->SetLineWidth(0);
+    pGraphics->StrokePath(&pathSpell, NULL);
+  }
+  pGraphics->RestoreGraphState();
+}
+FWL_ERR CFWL_EditImp::DrawWidget(CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  if (m_rtClient.IsEmpty()) {
+    return FWL_ERR_Indefinite;
+  }
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (!m_pWidgetMgr->IsFormDisabled()) {
+    DrawTextBk(pGraphics, pTheme, pMatrix);
+  }
+  if (m_pEdtEngine) {
+    DrawContent(pGraphics, pTheme, pMatrix);
+  }
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
+      !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly)) {
+    DrawSpellCheck(pGraphics, pMatrix);
+  }
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_EDT_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_EDT_Edge, pTheme, pMatrix);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  if (!pThemeProvider)
+    return FWL_ERR_Indefinite;
+  if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->SetThemeProvider(pThemeProvider);
+  }
+  if (m_pVertScrollBar) {
+    m_pVertScrollBar->SetThemeProvider(pThemeProvider);
+  }
+  if (m_pCaret) {
+    m_pCaret->SetThemeProvider(pThemeProvider);
+  }
+  m_pProperties->m_pThemeProvider = pThemeProvider;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetText(const CFX_WideString& wsText) {
+  m_pEdtEngine->SetText(wsText);
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_EditImp::GetTextLength() const {
+  if (!m_pEdtEngine)
+    return -1;
+  return m_pEdtEngine->GetTextLength();
+}
+FWL_ERR CFWL_EditImp::GetText(CFX_WideString& wsText,
+                              int32_t nStart,
+                              int32_t nCount) const {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->GetText(wsText, nStart, nCount);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::ClearText() {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->ClearText();
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_EditImp::GetCaretPos() const {
+  if (!m_pEdtEngine)
+    return -1;
+  return m_pEdtEngine->GetCaretPos();
+}
+int32_t CFWL_EditImp::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
+  if (!m_pEdtEngine)
+    return -1;
+  return m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+}
+FWL_ERR CFWL_EditImp::AddSelRange(int32_t nStart, int32_t nCount) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->AddSelRange(nStart, nCount);
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_EditImp::CountSelRanges() {
+  if (!m_pEdtEngine)
+    return 0;
+  return m_pEdtEngine->CountSelRanges();
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_EditImp::GetSelRange(int32_t nIndex, int32_t& nStart) {
+  if (!m_pEdtEngine)
+    return -1;
+  return m_pEdtEngine->GetSelRange(nIndex, nStart);
+}
+FWL_ERR CFWL_EditImp::ClearSelections() {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->ClearSelection();
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_EditImp::GetLimit() {
+  return m_nLimit;
+}
+FWL_ERR CFWL_EditImp::SetLimit(int32_t nLimit) {
+  m_nLimit = nLimit;
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->SetLimit(nLimit);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetAliasChar(FX_WCHAR wAlias) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Indefinite;
+  m_pEdtEngine->SetAliasChar(wAlias);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::Insert(int32_t nStart,
+                             const FX_WCHAR* lpText,
+                             int32_t nLen) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+    return FWL_ERR_Indefinite;
+  }
+  m_pEdtEngine->Insert(nStart, lpText, nLen);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::DeleteSelections() {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  int32_t iCount = m_pEdtEngine->CountSelRanges();
+  if (iCount > 0) {
+    m_pEdtEngine->Delete(-1);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::DeleteRange(int32_t nStart, int32_t nCount) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->DeleteRange(nStart, nCount);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::ReplaceSelections(const CFX_WideStringC& wsReplace) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  int32_t iCount = m_pEdtEngine->CountSelRanges();
+  for (int i = 0; i < iCount; i++) {
+    int32_t nStart;
+    int32_t nCount = m_pEdtEngine->GetSelRange(i, nStart);
+    m_pEdtEngine->Replace(nStart, nCount, wsReplace);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::Replace(int32_t nStart,
+                              int32_t nLen,
+                              const CFX_WideStringC& wsReplace) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  m_pEdtEngine->Replace(nStart, nLen, wsReplace);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::DoClipboard(int32_t iCmd) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+    return FWL_ERR_Succeeded;
+  }
+  return FWL_ERR_Indefinite;
+}
+FX_BOOL CFWL_EditImp::Copy(CFX_WideString& wsCopy) {
+  if (!m_pEdtEngine)
+    return FALSE;
+  int32_t nCount = m_pEdtEngine->CountSelRanges();
+  if (nCount == 0) {
+    return FALSE;
+  }
+  wsCopy.Empty();
+  CFX_WideString wsTemp;
+  int32_t nStart, nLength;
+  for (int32_t i = 0; i < nCount; i++) {
+    nLength = m_pEdtEngine->GetSelRange(i, nStart);
+    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
+    wsCopy += wsTemp;
+    wsTemp.Empty();
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::Cut(CFX_WideString& wsCut) {
+  if (!m_pEdtEngine)
+    return FALSE;
+  int32_t nCount = m_pEdtEngine->CountSelRanges();
+  if (nCount == 0) {
+    return FALSE;
+  }
+  wsCut.Empty();
+  CFX_WideString wsTemp;
+  int32_t nStart, nLength;
+  for (int32_t i = 0; i < nCount; i++) {
+    nLength = m_pEdtEngine->GetSelRange(i, nStart);
+    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
+    wsCut += wsTemp;
+    wsTemp.Empty();
+  }
+  m_pEdtEngine->Delete(0);
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::Paste(const CFX_WideString& wsPaste) {
+  if (!m_pEdtEngine)
+    return FALSE;
+  int32_t nCaret = m_pEdtEngine->GetCaretPos();
+  int32_t iError =
+      m_pEdtEngine->Insert(nCaret, wsPaste.c_str(), wsPaste.GetLength());
+  if (iError < 0) {
+    ProcessInsertError(iError);
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::Delete() {
+  if (!m_pEdtEngine)
+    return FALSE;
+  int32_t nCount = m_pEdtEngine->CountSelRanges();
+  if (nCount < 1) {
+    return FALSE;
+  }
+  m_pEdtEngine->Delete(0);
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::Redo(const CFX_ByteStringC& bsRecord) {
+  if (!m_pEdtEngine)
+    return FALSE;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) {
+    return TRUE;
+  }
+  return m_pEdtEngine->Redo(bsRecord);
+}
+FX_BOOL CFWL_EditImp::Undo(const CFX_ByteStringC& bsRecord) {
+  if (!m_pEdtEngine)
+    return FALSE;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) {
+    return TRUE;
+  }
+  return m_pEdtEngine->Undo(bsRecord);
+}
+FX_BOOL CFWL_EditImp::Undo() {
+  if (!CanUndo()) {
+    return FALSE;
+  }
+  CFX_ByteString bsRecord = m_RecordArr[m_iCurRecord--];
+  return Undo(bsRecord);
+}
+FX_BOOL CFWL_EditImp::Redo() {
+  if (!CanRedo()) {
+    return FALSE;
+  }
+  CFX_ByteString bsRecord = m_RecordArr[++m_iCurRecord];
+  return Redo(bsRecord);
+}
+FX_BOOL CFWL_EditImp::CanUndo() {
+  return m_iCurRecord >= 0;
+}
+FX_BOOL CFWL_EditImp::CanRedo() {
+  return m_iCurRecord < m_RecordArr.GetSize() - 1;
+}
+FWL_ERR CFWL_EditImp::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
+  if (!m_pEdtEngine)
+    return FWL_ERR_Succeeded;
+  FDE_LPTXTEDTPARAMS pParams =
+      (FDE_LPTXTEDTPARAMS)m_pEdtEngine->GetEditParams();
+  pParams->fTabWidth = fTabWidth;
+  pParams->bTabEquidistant = bEquidistant;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetOuter(IFWL_Widget* pOuter) {
+  m_pOuter = pOuter;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetNumberRange(int32_t iMin, int32_t iMax) {
+  m_iMin = iMin;
+  m_iMax = iMax;
+  m_bSetRange = TRUE;
+  return FWL_ERR_Succeeded;
+}
+void CFWL_EditImp::On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
+                                   int32_t nPage,
+                                   FX_BOOL bVisible) {
+  if (m_rtEngine.IsEmpty()) {
+    return;
+  }
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    return;
+  }
+  FX_BOOL bRepaintContent = UpdateOffset();
+  UpdateCaret();
+  CFX_RectF rtInvalid;
+  rtInvalid.Set(0, 0, 0, 0);
+  FX_BOOL bRepaintScroll = FALSE;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) {
+    IFWL_ScrollBar* pScroll = UpdateScroll();
+    if (pScroll) {
+      pScroll->GetWidgetRect(rtInvalid);
+      bRepaintScroll = TRUE;
+    }
+  }
+  if (bRepaintContent || bRepaintScroll) {
+    if (bRepaintContent) {
+      rtInvalid.Union(m_rtEngine);
+    }
+    Repaint(&rtInvalid);
+  }
+}
+void CFWL_EditImp::On_TextChanged(IFDE_TxtEdtEngine* pEdit,
+                                  FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) {
+  FX_DWORD dwStyleEx = m_pProperties->m_dwStyleExes;
+  if (dwStyleEx & FWL_STYLEEXT_EDT_VAlignMask) {
+    UpdateVAlignment();
+  }
+  IFDE_TxtEdtPage* page = m_pEdtEngine->GetPage(0);
+  FX_FLOAT fContentWidth = page->GetContentsBox().width;
+  FX_FLOAT fContentHeight = page->GetContentsBox().height;
+  CFX_RectF rtTemp;
+  GetClientRect(rtTemp);
+  FX_BOOL bHSelfAdaption =
+      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption;
+  FX_BOOL bVSelfAdaption =
+      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption;
+  FX_BOOL bNeedUpdate = FALSE;
+  if (bHSelfAdaption || bVSelfAdaption) {
+    CFWL_EvtEdtPreSelfAdaption evt;
+    evt.m_pSrcTarget = m_pInterface;
+    evt.bHSelfAdaption = TRUE;
+    evt.bVSelfAdaption = TRUE;
+    FX_FLOAT fWidth;
+    FX_FLOAT fHight;
+    fWidth = bHSelfAdaption ? fContentWidth : m_pProperties->m_rtWidget.width;
+    fHight = bVSelfAdaption ? fContentHeight : m_pProperties->m_rtWidget.height;
+    evt.rtAfterChange.Set(0, 0, fWidth, fHight);
+    DispatchEvent(&evt);
+    if (!evt.bHSelfAdaption) {
+      ModifyStylesEx(
+          0, FWL_STYLEEXT_EDT_HSelfAdaption | FWL_STYLEEXT_EDT_AutoHScroll);
+    }
+    if (!evt.bVSelfAdaption) {
+      ModifyStylesEx(
+          0, FWL_STYLEEXT_EDT_VSelfAdaption | FWL_STYLEEXT_EDT_AutoVScroll);
+    }
+    bNeedUpdate = (bHSelfAdaption && !evt.bHSelfAdaption) ||
+                  (bVSelfAdaption && !evt.bVSelfAdaption);
+  }
+  FX_FLOAT fContentWidth1 = fContentWidth;
+  FX_FLOAT fContentHeight1 = fContentHeight;
+  if (bNeedUpdate) {
+    UpdateEditParams();
+    UpdateEditLayout();
+    IFDE_TxtEdtPage* page1 = m_pEdtEngine->GetPage(0);
+    fContentWidth1 = page1->GetContentsBox().width;
+    fContentHeight1 = page1->GetContentsBox().height;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption) {
+    rtTemp.width = std::max(m_pProperties->m_rtWidget.width, fContentWidth1);
+    m_pProperties->m_rtWidget.width = fContentWidth1;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption) {
+    rtTemp.height = std::max(m_pProperties->m_rtWidget.height, fContentHeight1);
+    m_pProperties->m_rtWidget.height = fContentHeight1;
+  }
+  CFWL_EvtEdtTextChanged event;
+  event.m_pSrcTarget = m_pInterface;
+  event.nChangeType = ChangeInfo.nChangeType;
+  event.wsInsert = ChangeInfo.wsInsert;
+  event.wsDelete = ChangeInfo.wsDelete;
+  event.wsPrevText = ChangeInfo.wsPrevText;
+  DispatchEvent(&event);
+  LayoutScrollBar();
+  Repaint(&rtTemp);
+}
+void CFWL_EditImp::On_SelChanged(IFDE_TxtEdtEngine* pEdit) {
+  CFX_RectF rtTemp;
+  GetClientRect(rtTemp);
+  Repaint(&rtTemp);
+}
+FX_BOOL CFWL_EditImp::On_PageLoad(IFDE_TxtEdtEngine* pEdit,
+                                  int32_t nPageIndex,
+                                  int32_t nPurpose) {
+  IFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
+  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
+  if (!pPage)
+    return FALSE;
+  pPage->LoadPage(nullptr, nullptr);
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::On_PageUnload(IFDE_TxtEdtEngine* pEdit,
+                                    int32_t nPageIndex,
+                                    int32_t nPurpose) {
+  IFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
+  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
+  if (!pPage)
+    return FALSE;
+  pPage->UnloadPage(nullptr);
+  return TRUE;
+}
+
+void CFWL_EditImp::On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
+                                  const CFX_ByteStringC& bsDoRecord) {
+  AddDoRecord(bsDoRecord);
+}
+
+FX_BOOL CFWL_EditImp::On_ValidateField(IFDE_TxtEdtEngine* pEdit,
+                                       int32_t nBlockIndex,
+                                       int32_t nFieldIndex,
+                                       const CFX_WideString& wsFieldText,
+                                       int32_t nCharIndex) {
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
+                                       int32_t nBlockIndex) {
+  return TRUE;
+}
+FX_BOOL CFWL_EditImp::On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
+                                            int32_t nBlockIndex,
+                                            CFX_WideString& wsBlockText) {
+  return FALSE;
+}
+FX_BOOL CFWL_EditImp::On_Validate(IFDE_TxtEdtEngine* pEdit,
+                                  CFX_WideString& wsText) {
+  IFWL_Widget* pDst = GetOuter();
+  if (!pDst) {
+    pDst = m_pInterface;
+  }
+  CFWL_EvtEdtValidate event;
+  event.pDstWidget = pDst;
+  event.m_pSrcTarget = m_pInterface;
+  event.wsInsert = wsText;
+  event.bValidate = TRUE;
+  DispatchEvent(&event);
+  return event.bValidate;
+}
+FWL_ERR CFWL_EditImp::SetBackgroundColor(FX_DWORD color) {
+  m_backColor = color;
+  m_updateBackColor = TRUE;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImp::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
+  m_wsFont = wsFont;
+  m_fFontSize = fSize;
+  return FWL_ERR_Succeeded;
+}
+void CFWL_EditImp::SetScrollOffset(FX_FLOAT fScrollOffset) {
+  m_fScrollOffsetY = fScrollOffset;
+}
+void CFWL_EditImp::DrawTextBk(CFX_Graphics* pGraphics,
+                              IFWL_ThemeProvider* pTheme,
+                              const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_EDT_Background;
+  param.m_dwData = FWL_PARTDATA_EDT_Background;
+  param.m_dwStates = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly
+                         ? FWL_PARTSTATE_EDT_ReadOnly
+                         : FWL_PARTSTATE_EDT_Normal;
+  FX_DWORD dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled);
+  if (dwStates) {
+    param.m_dwStates = FWL_PARTSTATE_EDT_Disable;
+  }
+  param.m_pGraphics = pGraphics;
+  param.m_matrix = *pMatrix;
+  param.m_rtPart = m_rtClient;
+  pTheme->DrawBackground(&param);
+  if (!IsShowScrollBar(TRUE) || !IsShowScrollBar(FALSE)) {
+    return;
+  }
+  CFX_RectF rtScorll;
+  m_pHorzScrollBar->GetWidgetRect(rtScorll);
+  CFX_RectF rtStatic;
+  rtStatic.Set(m_rtClient.right() - rtScorll.height,
+               m_rtClient.bottom() - rtScorll.height, rtScorll.height,
+               rtScorll.height);
+  param.m_dwData = FWL_PARTDATA_EDT_StaticBackground;
+  param.m_rtPart = rtStatic;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_EditImp::DrawContent(CFX_Graphics* pGraphics,
+                               IFWL_ThemeProvider* pTheme,
+                               const CFX_Matrix* pMatrix) {
+  if (!m_pEdtEngine)
+    return;
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return;
+  pGraphics->SaveGraphState();
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
+    pGraphics->SaveGraphState();
+  }
+  CFX_RectF rtClip = m_rtEngine;
+  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
+  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
+  CFX_Matrix mt;
+  mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY);
+  if (pMatrix) {
+    pMatrix->TransformRect(rtClip);
+    mt.Concat(*pMatrix);
+  }
+  FX_BOOL bShowSel =
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoHideSel) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
+  if (bShowSel) {
+    IFWL_Widget* pForm =
+        m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
+    if (pForm) {
+      bShowSel = (pForm->GetStates() & FWL_WGTSTATE_Deactivated) !=
+                 FWL_WGTSTATE_Deactivated;
+    }
+  }
+  int32_t nSelCount = m_pEdtEngine->CountSelRanges();
+  if (bShowSel && nSelCount > 0) {
+    int32_t nPageCharStart = pPage->GetCharStart();
+    int32_t nPageCharCount = pPage->GetCharCount();
+    int32_t nPageCharEnd = nPageCharStart + nPageCharCount - 1;
+    int32_t nCharCount;
+    int32_t nCharStart;
+    CFX_RectFArray rectArr;
+    int32_t i = 0;
+    for (i = 0; i < nSelCount; i++) {
+      nCharCount = m_pEdtEngine->GetSelRange(i, nCharStart);
+      int32_t nCharEnd = nCharStart + nCharCount - 1;
+      if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd) {
+        continue;
+      }
+      int32_t nBgn = std::max(nCharStart, nPageCharStart);
+      int32_t nEnd = std::min(nCharEnd, nPageCharEnd);
+      pPage->CalcRangeRectArray(nBgn - nPageCharStart, nEnd - nBgn + 1,
+                                rectArr);
+    }
+    int32_t nCount = rectArr.GetSize();
+    CFX_Path path;
+    path.Create();
+    for (i = 0; i < nCount; i++) {
+      rectArr[i].left += fOffSetX;
+      rectArr[i].top += fOffSetY;
+      path.AddRectangle(rectArr[i].left, rectArr[i].top, rectArr[i].width,
+                        rectArr[i].height);
+    }
+    pGraphics->SetClipRect(rtClip);
+    CFWL_ThemeBackground param;
+    param.m_pGraphics = pGraphics;
+    param.m_matrix = *pMatrix;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_EDT_Background;
+    param.m_pPath = &path;
+    pTheme->DrawBackground(&param);
+  }
+  CFX_RenderDevice* pRenderDev = pGraphics->GetRenderDevice();
+  if (!pRenderDev)
+    return;
+  IFDE_RenderDevice* pRenderDevice = IFDE_RenderDevice::Create(pRenderDev);
+  if (!pRenderDevice)
+    return;
+  IFDE_RenderContext* pRenderContext = IFDE_RenderContext::Create();
+  if (!pRenderContext)
+    return;
+  pRenderDevice->SetClipRect(rtClip);
+  pRenderContext->StartRender(pRenderDevice, pPage, mt);
+  pRenderContext->DoRender(NULL);
+  pRenderContext->Release();
+  pRenderDevice->Release();
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
+    pGraphics->RestoreGraphState();
+    CFX_Path path;
+    path.Create();
+    int32_t iLimit = m_nLimit > 0 ? m_nLimit : 1;
+    FX_FLOAT fStep = m_rtEngine.width / iLimit;
+    FX_FLOAT fLeft = m_rtEngine.left + 1;
+    for (int32_t i = 1; i < iLimit; i++) {
+      fLeft += fStep;
+      path.AddLine(fLeft, m_rtClient.top, fLeft, m_rtClient.bottom());
+    }
+    CFWL_ThemeBackground param;
+    param.m_pGraphics = pGraphics;
+    param.m_matrix = *pMatrix;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_EDT_CombTextLine;
+    param.m_pPath = &path;
+    pTheme->DrawBackground(&param);
+  }
+  pGraphics->RestoreGraphState();
+}
+void CFWL_EditImp::UpdateEditEngine() {
+  UpdateEditParams();
+  UpdateEditLayout();
+  if (m_nLimit > -1) {
+    m_pEdtEngine->SetLimit(m_nLimit);
+  }
+}
+void CFWL_EditImp::UpdateEditParams() {
+  FDE_TXTEDTPARAMS params;
+  params.nHorzScale = 100;
+  params.fPlateWidth = m_rtEngine.width;
+  params.fPlateHeight = m_rtEngine.height;
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_RTLLayout) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_RTL;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalLayout) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_DocVertical;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalChars) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CharVertial;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReverseLine) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LineReserve;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ArabicShapes) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ArabicShapes;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ExpandTab) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ExpandTab;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CombText;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_LastLineHeight) {
+    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LastLineHeight;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Validate) {
+    params.dwMode |= FDE_TEXTEDITMODE_Validate;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Password) {
+    params.dwMode |= FDE_TEXTEDITMODE_Password;
+  }
+  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignMask) {
+    case FWL_STYLEEXT_EDT_HNear: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Left;
+      break;
+    }
+    case FWL_STYLEEXT_EDT_HCenter: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Center;
+      break;
+    }
+    case FWL_STYLEEXT_EDT_HFar: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Right;
+      break;
+    }
+    default: {}
+  }
+  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignModeMask) {
+    case FWL_STYLEEXT_EDT_Justified: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Justified;
+      break;
+    }
+    case FWL_STYLEEXT_EDT_Distributed: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Distributed;
+      break;
+    }
+    default: { params.dwAlignment |= FDE_TEXTEDITALIGN_Normal; }
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) {
+    params.dwMode |= FDE_TEXTEDITMODE_MultiLines;
+    if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) == 0 &&
+        (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) {
+      params.dwMode |=
+          FDE_TEXTEDITMODE_AutoLineWrap | FDE_TEXTEDITMODE_LimitArea_Horz;
+    }
+    if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) == 0 &&
+        (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoVScroll) == 0) {
+      params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Vert;
+    } else {
+      params.fPlateHeight = 0x00FFFFFF;
+    }
+  } else {
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) {
+      params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Horz;
+    }
+  }
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+    params.dwMode |= FDE_TEXTEDITMODE_ReadOnly;
+  }
+  FX_FLOAT* pFontSize =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FontSize));
+  if (!pFontSize)
+    return;
+  m_fFontSize = *pFontSize;
+  FX_DWORD* pFontColor =
+      static_cast<FX_DWORD*>(GetThemeCapacity(FWL_WGTCAPACITY_TextColor));
+  if (!pFontColor)
+    return;
+  params.dwFontColor = *pFontColor;
+  FX_FLOAT* pLineHeight =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_LineHeight));
+  if (!pLineHeight)
+    return;
+  params.fLineSpace = *pLineHeight;
+  IFX_Font* pFont =
+      static_cast<IFX_Font*>(GetThemeCapacity(FWL_WGTCAPACITY_Font));
+  if (!pFont)
+    return;
+  params.pFont = pFont;
+  params.fFontSize = m_fFontSize;
+  params.nLineCount = (int32_t)(params.fPlateHeight / params.fLineSpace);
+  if (params.nLineCount <= 0) {
+    params.nLineCount = 1;
+  }
+  params.fTabWidth = params.fFontSize * 1;
+  params.bTabEquidistant = TRUE;
+  params.wLineBreakChar = L'\n';
+  params.nCharRotation = 0;
+  params.pEventSink = this;
+  m_pEdtEngine->SetEditParams(params);
+}
+
+void CFWL_EditImp::UpdateEditLayout() {
+  if (m_pEdtEngine->GetTextLength() <= 0)
+    m_pEdtEngine->SetTextByStream(nullptr);
+
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  if (pPage)
+    pPage->UnloadPage(nullptr);
+
+  m_pEdtEngine->StartLayout();
+  m_pEdtEngine->DoLayout(nullptr);
+  m_pEdtEngine->EndLayout();
+  pPage = m_pEdtEngine->GetPage(0);
+  if (pPage)
+    pPage->LoadPage(nullptr, nullptr);
+}
+
+FX_BOOL CFWL_EditImp::UpdateOffset() {
+  CFX_RectF rtCaret;
+  m_pEdtEngine->GetCaretRect(rtCaret);
+  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
+  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
+  rtCaret.Offset(fOffSetX, fOffSetY);
+  const CFX_RectF& rtEidt = m_rtEngine;
+  if (rtEidt.Contains(rtCaret)) {
+    IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+    if (!pPage)
+      return FALSE;
+    CFX_RectF rtFDE = pPage->GetContentsBox();
+    rtFDE.Offset(fOffSetX, fOffSetY);
+    if (rtFDE.right() < rtEidt.right() && m_fScrollOffsetX > 0) {
+      m_fScrollOffsetX += rtFDE.right() - rtEidt.right();
+      if (m_fScrollOffsetX < 0) {
+        m_fScrollOffsetX = 0;
+      }
+    }
+    if (rtFDE.bottom() < rtEidt.bottom() && m_fScrollOffsetY > 0) {
+      m_fScrollOffsetY += rtFDE.bottom() - rtEidt.bottom();
+      if (m_fScrollOffsetY < 0) {
+        m_fScrollOffsetY = 0;
+      }
+    }
+    return FALSE;
+  } else {
+    FX_FLOAT offsetX = 0.0;
+    FX_FLOAT offsetY = 0.0;
+    if (rtCaret.left < rtEidt.left) {
+      offsetX = rtCaret.left - rtEidt.left;
+    }
+    if (rtCaret.right() > rtEidt.right()) {
+      offsetX = rtCaret.right() - rtEidt.right();
+    }
+    if (rtCaret.top < rtEidt.top) {
+      offsetY = rtCaret.top - rtEidt.top;
+    }
+    if (rtCaret.bottom() > rtEidt.bottom()) {
+      offsetY = rtCaret.bottom() - rtEidt.bottom();
+    }
+    if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption)) {
+      m_fScrollOffsetX += offsetX;
+    }
+    if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption)) {
+      m_fScrollOffsetY += offsetY;
+    }
+    if (m_fFontSize > m_rtEngine.height) {
+      m_fScrollOffsetY = 0;
+    }
+    return TRUE;
+  }
+}
+FX_BOOL CFWL_EditImp::UpdateOffset(IFWL_ScrollBar* pScrollBar,
+                                   FX_FLOAT fPosChanged) {
+  if (pScrollBar == m_pHorzScrollBar.get()) {
+    m_fScrollOffsetX += fPosChanged;
+  } else {
+    m_fScrollOffsetY += fPosChanged;
+  }
+  return TRUE;
+}
+void CFWL_EditImp::UpdateVAlignment() {
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return;
+  const CFX_RectF& rtFDE = pPage->GetContentsBox();
+  FX_FLOAT fOffsetY = 0.0f;
+  FX_FLOAT fSpaceAbove = 0.0f;
+  FX_FLOAT fSpaceBelow = 0.0f;
+  CFX_SizeF* pSpace = static_cast<CFX_SizeF*>(
+      GetThemeCapacity(FWL_WGTCAPACITY_SpaceAboveBelow));
+  if (pSpace) {
+    fSpaceAbove = pSpace->x;
+    fSpaceBelow = pSpace->y;
+  }
+  if (fSpaceAbove < 0.1f) {
+    fSpaceAbove = 0;
+  }
+  if (fSpaceBelow < 0.1f) {
+    fSpaceBelow = 0;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VCenter) {
+    fOffsetY = (m_rtEngine.height - rtFDE.height) / 2;
+    if (fOffsetY < (fSpaceAbove + fSpaceBelow) / 2 &&
+        fSpaceAbove < fSpaceBelow) {
+      return;
+    }
+    fOffsetY += (fSpaceAbove - fSpaceBelow) / 2;
+  } else if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VFar) {
+    fOffsetY = (m_rtEngine.height - rtFDE.height);
+    fOffsetY -= fSpaceBelow;
+  } else {
+    fOffsetY += fSpaceAbove;
+  }
+  m_fVAlignOffset = fOffsetY;
+  if (m_fVAlignOffset < 0) {
+    m_fVAlignOffset = 0;
+  }
+}
+void CFWL_EditImp::UpdateCaret() {
+  CFX_RectF rtFDE;
+  m_pEdtEngine->GetCaretRect(rtFDE);
+  rtFDE.Offset(m_rtEngine.left - m_fScrollOffsetX,
+               m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset);
+  CFX_RectF rtCaret;
+  rtCaret.Set(rtFDE.left, rtFDE.top, rtFDE.width, rtFDE.height);
+  CFX_RectF temp = rtCaret;
+  CFX_RectF rtClient;
+  GetClientRect(rtClient);
+  rtCaret.Intersect(rtClient);
+  if (rtCaret.left > rtClient.right()) {
+    FX_FLOAT right = rtCaret.right();
+    rtCaret.left = rtClient.right() - 1;
+    rtCaret.width = right - rtCaret.left;
+  }
+  FX_BOOL bIntersect = !rtCaret.IsEmpty();
+  FX_BOOL bShow = TRUE;
+  FX_BOOL bShowWhole = FALSE;
+  if (!(m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) || !bIntersect) {
+    bShow = FALSE;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption &&
+      temp.right() > m_rtEngine.right()) {
+    bShowWhole = TRUE;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption &&
+      temp.bottom() > m_rtEngine.bottom()) {
+    bShowWhole = TRUE;
+  } else {
+    bShow = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && bIntersect);
+  }
+  if (bShowWhole) {
+    rtCaret = temp;
+  }
+  ShowCaret(bShow, &rtCaret);
+}
+IFWL_ScrollBar* CFWL_EditImp::UpdateScroll() {
+  FX_BOOL bShowHorz =
+      m_pHorzScrollBar &&
+      ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0);
+  FX_BOOL bShowVert =
+      m_pVertScrollBar &&
+      ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0);
+  if (!bShowHorz && !bShowVert) {
+    return NULL;
+  }
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return NULL;
+  const CFX_RectF& rtFDE = pPage->GetContentsBox();
+  IFWL_ScrollBar* pRepaint = NULL;
+  if (bShowHorz) {
+    CFX_RectF rtScroll;
+    m_pHorzScrollBar->GetWidgetRect(rtScroll);
+    if (rtScroll.width < rtFDE.width) {
+      m_pHorzScrollBar->LockUpdate();
+      FX_FLOAT fRange = rtFDE.width - rtScroll.width;
+      m_pHorzScrollBar->SetRange(0.0f, fRange);
+      FX_FLOAT fPos = m_fScrollOffsetX;
+      if (fPos < 0.0f) {
+        fPos = 0.0f;
+      }
+      if (fPos > fRange) {
+        fPos = fRange;
+      }
+      m_pHorzScrollBar->SetPos(fPos);
+      m_pHorzScrollBar->SetTrackPos(fPos);
+      m_pHorzScrollBar->SetPageSize(rtScroll.width);
+      m_pHorzScrollBar->SetStepSize(rtScroll.width / 10);
+      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE);
+      m_pHorzScrollBar->UnlockUpdate();
+      m_pHorzScrollBar->Update();
+      pRepaint = m_pHorzScrollBar.get();
+    } else if ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) {
+      m_pHorzScrollBar->LockUpdate();
+      m_pHorzScrollBar->SetRange(0, -1);
+      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE);
+      m_pHorzScrollBar->UnlockUpdate();
+      m_pHorzScrollBar->Update();
+      pRepaint = m_pHorzScrollBar.get();
+    }
+  }
+  if (bShowVert) {
+    CFX_RectF rtScroll;
+    m_pVertScrollBar->GetWidgetRect(rtScroll);
+    if (rtScroll.height < rtFDE.height) {
+      m_pVertScrollBar->LockUpdate();
+      FX_FLOAT fStep = m_pEdtEngine->GetEditParams()->fLineSpace;
+      FX_FLOAT fRange = rtFDE.height - m_rtEngine.height;
+      if (fRange < fStep) {
+        fRange = fStep;
+      }
+      m_pVertScrollBar->SetRange(0.0f, fRange);
+      FX_FLOAT fPos = m_fScrollOffsetY;
+      if (fPos < 0.0f) {
+        fPos = 0.0f;
+      }
+      if (fPos > fRange) {
+        fPos = fRange;
+      }
+      m_pVertScrollBar->SetPos(fPos);
+      m_pVertScrollBar->SetTrackPos(fPos);
+      m_pVertScrollBar->SetPageSize(rtScroll.height);
+      m_pVertScrollBar->SetStepSize(fStep);
+      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE);
+      m_pVertScrollBar->UnlockUpdate();
+      m_pVertScrollBar->Update();
+      pRepaint = m_pVertScrollBar.get();
+    } else if ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) {
+      m_pVertScrollBar->LockUpdate();
+      m_pVertScrollBar->SetRange(0, -1);
+      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE);
+      m_pVertScrollBar->UnlockUpdate();
+      m_pVertScrollBar->Update();
+      pRepaint = m_pVertScrollBar.get();
+    }
+  }
+  return pRepaint;
+}
+FX_BOOL CFWL_EditImp::IsShowScrollBar(FX_BOOL bVert) {
+  FX_BOOL bShow =
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus)
+          ? (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) ==
+                FWL_WGTSTATE_Focused
+          : TRUE;
+  if (bVert) {
+    return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) &&
+           (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) &&
+           IsContentHeightOverflow();
+  }
+  return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) &&
+         (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
+}
+FX_BOOL CFWL_EditImp::IsContentHeightOverflow() {
+  if (!m_pEdtEngine)
+    return FALSE;
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return FALSE;
+  return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f;
+}
+int32_t CFWL_EditImp::AddDoRecord(const CFX_ByteStringC& bsDoRecord) {
+  int32_t nCount = m_RecordArr.GetSize();
+  if (m_iCurRecord == nCount - 1) {
+    if (nCount == m_iMaxRecord) {
+      m_RecordArr.RemoveAt(0);
+      m_iCurRecord--;
+    }
+  } else {
+    for (int32_t i = nCount - 1; i > m_iCurRecord; i--) {
+      m_RecordArr.RemoveAt(i);
+    }
+  }
+  m_RecordArr.Add(bsDoRecord);
+  return m_iCurRecord = m_RecordArr.GetSize() - 1;
+}
+void CFWL_EditImp::Layout() {
+  GetClientRect(m_rtClient);
+  m_rtEngine = m_rtClient;
+  FX_FLOAT* pfWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pfWidth)
+    return;
+  FX_FLOAT fWidth = *pfWidth;
+  if (!m_pOuter) {
+    CFX_RectF* pUIMargin =
+        static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
+    if (pUIMargin) {
+      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
+                         pUIMargin->height);
+    }
+  } else if (m_pOuter->GetClassID() == FWL_CLASSHASH_DateTimePicker) {
+    CFWL_ThemePart part;
+    part.m_pWidget = m_pOuter;
+    CFX_RectF* pUIMargin =
+        static_cast<CFX_RectF*>(m_pOuter->GetThemeProvider()->GetCapacity(
+            &part, FWL_WGTCAPACITY_UIMargin));
+    if (pUIMargin) {
+      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
+                         pUIMargin->height);
+    }
+  }
+  FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE);
+  FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE);
+  if (bShowVertScrollbar) {
+    InitScrollBar();
+    CFX_RectF rtVertScr;
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+      rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, m_rtClient.top,
+                    fWidth, m_rtClient.height);
+    } else {
+      rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
+                    m_rtClient.height);
+      if (bShowHorzScrollbar) {
+        rtVertScr.height -= fWidth;
+      }
+      m_rtEngine.width -= fWidth;
+    }
+    m_pVertScrollBar->SetWidgetRect(rtVertScr);
+    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+    m_pVertScrollBar->Update();
+  } else if (m_pVertScrollBar) {
+    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  if (bShowHorzScrollbar) {
+    InitScrollBar(FALSE);
+    CFX_RectF rtHoriScr;
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+      rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin,
+                    m_rtClient.width, fWidth);
+    } else {
+      rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
+                    m_rtClient.width, fWidth);
+      if (bShowVertScrollbar) {
+        rtHoriScr.width -= fWidth;
+      }
+      m_rtEngine.height -= fWidth;
+    }
+    m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
+    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+    m_pHorzScrollBar->Update();
+  } else if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+}
+void CFWL_EditImp::LayoutScrollBar() {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus) ==
+      0) {
+    return;
+  }
+  FX_FLOAT* pfWidth = NULL;
+  FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE);
+  FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE);
+  if (bShowVertScrollbar) {
+    if (!m_pVertScrollBar) {
+      pfWidth = static_cast<FX_FLOAT*>(
+          GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
+      InitScrollBar();
+      CFX_RectF rtVertScr;
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+        rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, m_rtClient.top,
+                      fWidth, m_rtClient.height);
+      } else {
+        rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
+                      m_rtClient.height);
+        if (bShowHorzScrollbar) {
+          rtVertScr.height -= fWidth;
+        }
+      }
+      m_pVertScrollBar->SetWidgetRect(rtVertScr);
+      m_pVertScrollBar->Update();
+    }
+    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+  } else if (m_pVertScrollBar) {
+    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  if (bShowHorzScrollbar) {
+    if (!m_pHorzScrollBar) {
+      if (!pfWidth) {
+        pfWidth = static_cast<FX_FLOAT*>(
+            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+      }
+      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
+      InitScrollBar(FALSE);
+      CFX_RectF rtHoriScr;
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
+        rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin,
+                      m_rtClient.width, fWidth);
+      } else {
+        rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
+                      m_rtClient.width, fWidth);
+        if (bShowVertScrollbar) {
+          rtHoriScr.width -= (fWidth);
+        }
+      }
+      m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
+      m_pHorzScrollBar->Update();
+    }
+    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+  } else if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  if (bShowVertScrollbar || bShowHorzScrollbar) {
+    UpdateScroll();
+  }
+}
+void CFWL_EditImp::DeviceToEngine(CFX_PointF& pt) {
+  pt.x += -m_rtEngine.left + m_fScrollOffsetX;
+  pt.y += -m_rtEngine.top - m_fVAlignOffset + m_fScrollOffsetY;
+}
+void CFWL_EditImp::InitScrollBar(FX_BOOL bVert) {
+  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
+    return;
+  }
+  CFWL_WidgetImpProperties prop;
+  prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
+  prop.m_dwStates = FWL_WGTSTATE_Disabled | FWL_WGTSTATE_Invisible;
+  prop.m_pParent = m_pInterface;
+  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
+  IFWL_ScrollBar* pScrollBar = IFWL_ScrollBar::Create(prop, m_pInterface);
+  pScrollBar->Initialize();
+  (bVert ? &m_pVertScrollBar : &m_pHorzScrollBar)->reset(pScrollBar);
+}
+void CFWL_EditImp::InitEngine() {
+  if (m_pEdtEngine) {
+    return;
+  }
+  m_pEdtEngine = IFDE_TxtEdtEngine::Create();
+}
+extern FX_BOOL FWL_ShowCaret(IFWL_Widget* pWidget,
+                             FX_BOOL bVisible,
+                             const CFX_RectF* pRtAnchor);
+void CFWL_EditImp::ShowCaret(FX_BOOL bVisible, CFX_RectF* pRect) {
+  if (m_pCaret) {
+    m_pCaret->ShowCaret(bVisible);
+    if (bVisible && !pRect->IsEmpty()) {
+      m_pCaret->SetWidgetRect(*pRect);
+    }
+    Repaint(&m_rtEngine);
+  } else {
+    IFWL_Widget* pOuter = m_pInterface;
+    if (bVisible) {
+      pRect->Offset(m_pProperties->m_rtWidget.left,
+                    m_pProperties->m_rtWidget.top);
+    }
+    while (pOuter->GetOuter()) {
+      pOuter = pOuter->GetOuter();
+      if (bVisible) {
+        CFX_RectF rtOuter;
+        pOuter->GetWidgetRect(rtOuter);
+        pRect->Offset(rtOuter.left, rtOuter.top);
+      }
+    }
+    FWL_ShowCaret(pOuter, bVisible, pRect);
+  }
+}
+FX_BOOL CFWL_EditImp::ValidateNumberChar(FX_WCHAR cNum) {
+  if (!m_pEdtEngine) {
+    return FALSE;
+  }
+  if (!m_bSetRange) {
+    return TRUE;
+  }
+  CFX_WideString wsOld, wsText;
+  m_pEdtEngine->GetText(wsText, 0);
+  if (wsText.IsEmpty()) {
+    if (cNum == L'0') {
+      return FALSE;
+    }
+    return TRUE;
+  }
+  int32_t caretPos = m_pEdtEngine->GetCaretPos();
+  int32_t iSel = CountSelRanges();
+  if (iSel == 0) {
+    if (cNum == L'0' && caretPos == 0) {
+      return FALSE;
+    }
+    int32_t nLen = wsText.GetLength();
+    CFX_WideString l = wsText.Mid(0, caretPos);
+    CFX_WideString r = wsText.Mid(caretPos, nLen - caretPos);
+    CFX_WideString wsNew = l + cNum + r;
+    if (wsNew.GetInteger() <= m_iMax) {
+      return TRUE;
+    }
+  } else {
+    if (wsText.GetInteger() <= m_iMax) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CFWL_EditImp::InitCaret() {
+  if (!m_pCaret) {
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret)) {
+      CFWL_WidgetImpProperties prop;
+      m_pCaret.reset(IFWL_Caret::Create(prop, m_pInterface));
+      m_pCaret->Initialize();
+      m_pCaret->SetParent(m_pInterface);
+      m_pCaret->SetStates(m_pProperties->m_dwStates);
+    }
+  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret) ==
+             0) {
+    m_pCaret.reset();
+  }
+}
+void CFWL_EditImp::ClearRecord() {
+  m_iCurRecord = -1;
+  m_RecordArr.RemoveAll();
+}
+void CFWL_EditImp::ProcessInsertError(int32_t iError) {
+  switch (iError) {
+    case -2: {
+      CFWL_EvtEdtTextFull textFullEvent;
+      textFullEvent.m_pSrcTarget = m_pInterface;
+      DispatchEvent(&textFullEvent);
+      break;
+    }
+    default: {}
+  }
+}
+CFWL_EditImpDelegate::CFWL_EditImpDelegate(CFWL_EditImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_EditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  int32_t iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_Activate: {
+      DoActivate(static_cast<CFWL_MsgActivate*>(pMessage));
+      break;
+    }
+    case FWL_MSGHASH_Deactivate: {
+      DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage));
+      break;
+    }
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonDblClk: {
+          OnButtonDblClk(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_RButtonDown: {
+          DoButtonDown(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
+      FX_DWORD dwCmd = pKey->m_dwCmd;
+      if (dwCmd == FWL_MSGKEYCMD_KeyDown) {
+        OnKeyDown(pKey);
+      } else if (dwCmd == FWL_MSGKEYCMD_Char) {
+        OnChar(pKey);
+      }
+      break;
+    }
+    default: { iRet = 0; }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_EditImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  if (!pEvent)
+    return FWL_ERR_Indefinite;
+  FX_DWORD dwHashCode = pEvent->GetClassID();
+  if (dwHashCode != FWL_EVTHASH_Scroll) {
+    return FWL_ERR_Succeeded;
+  }
+  IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
+  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
+       m_pOwner->m_pVertScrollBar) ||
+      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
+       m_pOwner->m_pHorzScrollBar)) {
+    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
+    OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
+             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_EditImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                           const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_EditImpDelegate::DoActivate(CFWL_MsgActivate* pMsg) {
+  m_pOwner->m_pProperties->m_dwStates |= ~FWL_WGTSTATE_Deactivated;
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_EditImpDelegate::DoDeactivate(CFWL_MsgDeactivate* pMsg) {
+  m_pOwner->m_pProperties->m_dwStates &= FWL_WGTSTATE_Deactivated;
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_EditImpDelegate::DoButtonDown(CFWL_MsgMouse* pMsg) {
+  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    m_pOwner->SetFocus(TRUE);
+  }
+  if (!m_pOwner->m_pEdtEngine) {
+    m_pOwner->UpdateEditEngine();
+  }
+  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return;
+  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
+  m_pOwner->DeviceToEngine(pt);
+  FX_BOOL bBefore = TRUE;
+  int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
+  if (nIndex < 0) {
+    nIndex = 0;
+  }
+  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+}
+void CFWL_EditImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  FX_DWORD dwStyleEx = m_pOwner->GetStylesEx();
+  FX_BOOL bRepaint = dwStyleEx & FWL_STYLEEXT_EDT_InnerCaret;
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (!m_pOwner->m_pEdtEngine) {
+      m_pOwner->UpdateEditEngine();
+    }
+    m_pOwner->UpdateVAlignment();
+    m_pOwner->UpdateOffset();
+    m_pOwner->UpdateCaret();
+  } else if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    m_pOwner->ShowCaret(FALSE);
+    if (m_pOwner->m_pEdtEngine &&
+        (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
+      int32_t nSel = m_pOwner->CountSelRanges();
+      if (nSel > 0) {
+        m_pOwner->ClearSelections();
+        bRepaint = TRUE;
+      }
+      m_pOwner->SetCaretPos(0);
+      m_pOwner->UpdateOffset();
+    }
+    m_pOwner->ClearRecord();
+  }
+  m_pOwner->LayoutScrollBar();
+  if (bRepaint) {
+    CFX_RectF rtInvalidate;
+    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
+                     m_pOwner->m_pProperties->m_rtWidget.height);
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+void CFWL_EditImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  DoCursor(pMsg);
+  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    return;
+  }
+  m_pOwner->m_bLButtonDown = TRUE;
+  m_pOwner->SetGrab(TRUE);
+  DoButtonDown(pMsg);
+  int32_t nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
+  FX_BOOL bRepaint = FALSE;
+  int32_t iCount = m_pOwner->m_pEdtEngine->CountSelRanges();
+  if (iCount > 0) {
+    m_pOwner->m_pEdtEngine->ClearSelection();
+    bRepaint = TRUE;
+  }
+  FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
+  if (bShift && m_pOwner->m_nSelStart != nIndex) {
+    int32_t iStart = std::min(m_pOwner->m_nSelStart, nIndex);
+    int32_t iEnd = std::max(m_pOwner->m_nSelStart, nIndex);
+    m_pOwner->m_pEdtEngine->AddSelRange(iStart, iEnd - iStart);
+    bRepaint = TRUE;
+  } else {
+    m_pOwner->m_nSelStart = nIndex;
+  }
+  if (bRepaint) {
+    m_pOwner->Repaint(&m_pOwner->m_rtEngine);
+  }
+}
+void CFWL_EditImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  DoCursor(pMsg);
+  m_pOwner->m_bLButtonDown = FALSE;
+  m_pOwner->SetGrab(FALSE);
+}
+void CFWL_EditImpDelegate::OnButtonDblClk(CFWL_MsgMouse* pMsg) {
+  if (!m_pOwner->m_pEdtEngine)
+    return;
+  DoCursor(pMsg);
+  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return;
+  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
+  m_pOwner->DeviceToEngine(pt);
+  int32_t nCount = 0;
+  int32_t nIndex = pPage->SelectWord(pt, nCount);
+  if (nIndex < 0) {
+    return;
+  }
+  m_pOwner->m_pEdtEngine->AddSelRange(nIndex, nCount);
+  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, FALSE);
+  m_pOwner->Repaint(&m_pOwner->m_rtEngine);
+}
+void CFWL_EditImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (!m_pOwner->m_pEdtEngine)
+    return;
+  DoCursor(pMsg);
+  if (m_pOwner->m_nSelStart == -1 || !m_pOwner->m_bLButtonDown) {
+    return;
+  }
+  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+  if (!pPage)
+    return;
+  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
+  m_pOwner->DeviceToEngine(pt);
+  FX_BOOL bBefore = TRUE;
+  int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
+  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+  nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
+  m_pOwner->m_pEdtEngine->ClearSelection();
+  if (nIndex != m_pOwner->m_nSelStart) {
+    int32_t nLen = m_pOwner->m_pEdtEngine->GetTextLength();
+    if (m_pOwner->m_nSelStart >= nLen) {
+      m_pOwner->m_nSelStart = nLen;
+    }
+    m_pOwner->m_pEdtEngine->AddSelRange(
+        std::min(m_pOwner->m_nSelStart, nIndex),
+        FXSYS_abs(nIndex - m_pOwner->m_nSelStart));
+  }
+}
+void CFWL_EditImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (!m_pOwner->m_pEdtEngine)
+    return;
+  FDE_TXTEDTMOVECARET MoveCaret = MC_MoveNone;
+  FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
+  FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl;
+  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
+  switch (dwKeyCode) {
+    case FWL_VKEY_Left: {
+      MoveCaret = MC_Left;
+      break;
+    }
+    case FWL_VKEY_Right: {
+      MoveCaret = MC_Right;
+      break;
+    }
+    case FWL_VKEY_Up: {
+      MoveCaret = MC_Up;
+      break;
+    }
+    case FWL_VKEY_Down: {
+      MoveCaret = MC_Down;
+      break;
+    }
+    case FWL_VKEY_Home: {
+      if (bCtrl) {
+        MoveCaret = MC_Home;
+      } else {
+        MoveCaret = MC_LineStart;
+      }
+      break;
+    }
+    case FWL_VKEY_End: {
+      if (bCtrl) {
+        MoveCaret = MC_End;
+      } else {
+        MoveCaret = MC_LineEnd;
+      }
+      break;
+    }
+    case FWL_VKEY_Insert: {
+      break;
+    }
+    case FWL_VKEY_Delete: {
+      if ((m_pOwner->m_pProperties->m_dwStyleExes &
+           FWL_STYLEEXT_EDT_ReadOnly) ||
+          (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+        break;
+      }
+      int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
+#if (_FX_OS_ == _FX_MACOSX_)
+      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
+#else
+      m_pOwner->m_pEdtEngine->Delete(nCaret);
+#endif
+      break;
+    }
+    case FWL_VKEY_F2: {
+      break;
+    }
+    case FWL_VKEY_Tab: {
+      m_pOwner->DispatchKeyEvent(pMsg);
+      break;
+    }
+    default: {
+#if (_FX_OS_ == _FX_MACOSX_)
+      if (pMsg->m_dwFlags & FWL_KEYFLAG_Command) {
+#else
+      if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
+#endif
+        if (dwKeyCode == 0x43 || dwKeyCode == 0x63) {
+          m_pOwner->DoClipboard(1);
+          return;
+        }
+        if (dwKeyCode == 0x58 || dwKeyCode == 0x78) {
+          m_pOwner->DoClipboard(2);
+          return;
+        }
+        if (dwKeyCode == 0x56 || dwKeyCode == 0x76) {
+          m_pOwner->DoClipboard(3);
+          return;
+        }
+      }
+    }
+  }
+  if (MoveCaret != MC_MoveNone) {
+    m_pOwner->m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl);
+  }
+}
+void CFWL_EditImpDelegate::OnChar(CFWL_MsgKey* pMsg) {
+  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+      (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+    return;
+  }
+  if (!m_pOwner->m_pEdtEngine)
+    return;
+  int32_t iError = 0;
+  FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode;
+  int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
+  switch (c) {
+    case FWL_VKEY_Back: {
+      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
+      break;
+    }
+    case 0x0A: {
+      break;
+    }
+    case FWL_VKEY_Escape: {
+      break;
+    }
+    case FWL_VKEY_Tab: {
+      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\t", 1);
+      break;
+    }
+    case FWL_VKEY_Return: {
+      if (m_pOwner->m_pProperties->m_dwStyleExes &
+          FWL_STYLEEXT_EDT_WantReturn) {
+        iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\n", 1);
+      }
+      break;
+    }
+    default: {
+      if (!m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+        if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Number) {
+          if (((pMsg->m_dwKeyCode < FWL_VKEY_0) &&
+               (pMsg->m_dwKeyCode != 0x2E && pMsg->m_dwKeyCode != 0x2D)) ||
+              pMsg->m_dwKeyCode > FWL_VKEY_9) {
+            break;
+          }
+          if (!m_pOwner->ValidateNumberChar(c)) {
+            break;
+          }
+        }
+      }
+#if (_FX_OS_ == _FX_MACOSX_)
+      if (pMsg->m_dwFlags & FWL_KEYFLAG_Command)
+#else
+      if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl)
+#endif
+      {
+        break;
+      }
+      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, &c, 1);
+      break;
+    }
+  }
+  if (iError < 0) {
+    m_pOwner->ProcessInsertError(iError);
+  }
+}
+FX_BOOL CFWL_EditImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
+                                       FX_DWORD dwCode,
+                                       FX_FLOAT fPos) {
+  CFX_SizeF fs;
+  pScrollBar->GetRange(fs.x, fs.y);
+  FX_FLOAT iCurPos = pScrollBar->GetPos();
+  FX_FLOAT fStep = pScrollBar->GetStepSize();
+  switch (dwCode) {
+    case FWL_SCBCODE_Min: {
+      fPos = fs.x;
+      break;
+    }
+    case FWL_SCBCODE_Max: {
+      fPos = fs.y;
+      break;
+    }
+    case FWL_SCBCODE_StepBackward: {
+      fPos -= fStep;
+      if (fPos < fs.x + fStep / 2) {
+        fPos = fs.x;
+      }
+      break;
+    }
+    case FWL_SCBCODE_StepForward: {
+      fPos += fStep;
+      if (fPos > fs.y - fStep / 2) {
+        fPos = fs.y;
+      }
+      break;
+    }
+    case FWL_SCBCODE_PageBackward: {
+      fPos -= pScrollBar->GetPageSize();
+      if (fPos < fs.x) {
+        fPos = fs.x;
+      }
+      break;
+    }
+    case FWL_SCBCODE_PageForward: {
+      fPos += pScrollBar->GetPageSize();
+      if (fPos > fs.y) {
+        fPos = fs.y;
+      }
+      break;
+    }
+    case FWL_SCBCODE_Pos:
+    case FWL_SCBCODE_TrackPos: {
+      break;
+    }
+    case FWL_SCBCODE_EndScroll: {
+      return FALSE;
+    }
+    default: {}
+  }
+  if (iCurPos != fPos) {
+    pScrollBar->SetPos(fPos);
+    pScrollBar->SetTrackPos(fPos);
+    m_pOwner->UpdateOffset(pScrollBar, fPos - iCurPos);
+    if (m_pOwner->m_pEdtEngine) {
+      m_pOwner->UpdateCaret();
+    }
+    CFX_RectF rect;
+    m_pOwner->GetWidgetRect(rect);
+    CFX_RectF rtInvalidate;
+    rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2);
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+  return TRUE;
+}
+void CFWL_EditImpDelegate::DoCursor(CFWL_MsgMouse* pMsg) {}
diff --git a/xfa/fwl/basewidget/fwl_editimp.h b/xfa/fwl/basewidget/fwl_editimp.h
new file mode 100644
index 0000000..6693b8d
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_editimp.h
@@ -0,0 +1,208 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_EDITIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_EDITIMP_H_
+
+#include <memory>
+#include <vector>
+
+#include "xfa/fee/ifde_txtedtengine.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
+
+class CFWL_WidgetImpProperties;
+class CFWL_WidgetImpDelegate;
+class IFWL_Caret;
+class CFWL_EditImp;
+class CFWL_EditImpDelegate;
+
+class CFWL_EditImp : public CFWL_WidgetImp, public IFDE_TxtEdtEventSink {
+ public:
+  CFWL_EditImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
+  ~CFWL_EditImp() override;
+
+  // CFWL_WidgetImp:
+  FWL_ERR GetClassName(CFX_WideString& wsClass) const override;
+  FX_DWORD GetClassID() const override;
+  FWL_ERR Initialize() override;
+  FWL_ERR Finalize() override;
+  FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE) override;
+  FWL_ERR SetWidgetRect(const CFX_RectF& rect) override;
+  FWL_ERR Update() override;
+  FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy) override;
+  FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE) override;
+  FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                     const CFX_Matrix* pMatrix = NULL) override;
+  FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
+
+  virtual FWL_ERR SetText(const CFX_WideString& wsText);
+  virtual int32_t GetTextLength() const;
+  virtual FWL_ERR GetText(CFX_WideString& wsText,
+                          int32_t nStart = 0,
+                          int32_t nCount = -1) const;
+  virtual FWL_ERR ClearText();
+  virtual int32_t GetCaretPos() const;
+  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE);
+  virtual FWL_ERR AddSelRange(int32_t nStart, int32_t nCount = -1);
+  virtual int32_t CountSelRanges();
+  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
+  virtual FWL_ERR ClearSelections();
+  virtual int32_t GetLimit();
+  virtual FWL_ERR SetLimit(int32_t nLimit);
+  virtual FWL_ERR SetAliasChar(FX_WCHAR wAlias);
+  virtual FWL_ERR Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLen);
+  virtual FWL_ERR DeleteSelections();
+  virtual FWL_ERR DeleteRange(int32_t nStart, int32_t nCount = -1);
+  virtual FWL_ERR ReplaceSelections(const CFX_WideStringC& wsReplace);
+  virtual FWL_ERR Replace(int32_t nStart,
+                          int32_t nLen,
+                          const CFX_WideStringC& wsReplace);
+  virtual FWL_ERR DoClipboard(int32_t iCmd);
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
+  virtual FX_BOOL Cut(CFX_WideString& wsCut);
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL Delete();
+  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRecord);
+  virtual FX_BOOL Undo(const CFX_ByteStringC& bsRecord);
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+  virtual FX_BOOL CanUndo();
+  virtual FX_BOOL CanRedo();
+  virtual FWL_ERR SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
+  virtual FWL_ERR SetOuter(IFWL_Widget* pOuter);
+  virtual FWL_ERR SetNumberRange(int32_t iMin, int32_t iMax);
+  void On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
+                       int32_t nPage,
+                       FX_BOOL bVisible = true) override;
+  void On_TextChanged(IFDE_TxtEdtEngine* pEdit,
+                      FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) override;
+  void On_PageCountChanged(IFDE_TxtEdtEngine* pEdit) override {}
+  void On_SelChanged(IFDE_TxtEdtEngine* pEdit) override;
+  FX_BOOL On_PageLoad(IFDE_TxtEdtEngine* pEdit,
+                      int32_t nPageIndex,
+                      int32_t nPurpose) override;
+  FX_BOOL On_PageUnload(IFDE_TxtEdtEngine* pEdit,
+                        int32_t nPageIndex,
+                        int32_t nPurpose) override;
+  FX_BOOL On_PageChange(IFDE_TxtEdtEngine* pEdit, int32_t nPageIndex) override {
+    return TRUE;
+  }
+  void On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
+                      const CFX_ByteStringC& bsDoRecord) override;
+  FX_BOOL On_ValidateField(IFDE_TxtEdtEngine* pEdit,
+                           int32_t nBlockIndex,
+                           int32_t nFieldIndex,
+                           const CFX_WideString& wsFieldText,
+                           int32_t nCharIndex) override;
+  FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
+                           int32_t nBlockIndex) override;
+  FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
+                                int32_t nBlockIndex,
+                                CFX_WideString& wsBlockText) override;
+  FX_BOOL On_Validate(IFDE_TxtEdtEngine* pEdit,
+                      CFX_WideString& wsText) override;
+  virtual FWL_ERR SetBackgroundColor(FX_DWORD color);
+  virtual FWL_ERR SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
+  void SetScrollOffset(FX_FLOAT fScrollOffset);
+  FX_BOOL GetSuggestWords(CFX_PointF pointf,
+                          std::vector<CFX_ByteString>& sSuggest);
+  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
+                                const CFX_ByteStringC& bsReplace);
+
+ protected:
+  void DrawTextBk(CFX_Graphics* pGraphics,
+                  IFWL_ThemeProvider* pTheme,
+                  const CFX_Matrix* pMatrix = NULL);
+  void DrawContent(CFX_Graphics* pGraphics,
+                   IFWL_ThemeProvider* pTheme,
+                   const CFX_Matrix* pMatrix = NULL);
+  void UpdateEditEngine();
+  void UpdateEditParams();
+  void UpdateEditLayout();
+  FX_BOOL UpdateOffset();
+  FX_BOOL UpdateOffset(IFWL_ScrollBar* pScrollBar, FX_FLOAT fPosChanged);
+  void UpdateVAlignment();
+  void UpdateCaret();
+  IFWL_ScrollBar* UpdateScroll();
+  void Layout();
+  void LayoutScrollBar();
+  void DeviceToEngine(CFX_PointF& pt);
+  void InitScrollBar(FX_BOOL bVert = TRUE);
+  void InitEngine();
+  virtual void ShowCaret(FX_BOOL bVisible, CFX_RectF* pRect = NULL);
+  FX_BOOL ValidateNumberChar(FX_WCHAR cNum);
+  void InitCaret();
+  void ClearRecord();
+  FX_BOOL IsShowScrollBar(FX_BOOL bVert);
+  FX_BOOL IsContentHeightOverflow();
+  int32_t AddDoRecord(const CFX_ByteStringC& bsDoRecord);
+  void ProcessInsertError(int32_t iError);
+
+  void DrawSpellCheck(CFX_Graphics* pGraphics,
+                      const CFX_Matrix* pMatrix = NULL);
+  void AddSpellCheckObj(CFX_Path& PathData,
+                        int32_t nStart,
+                        int32_t nCount,
+                        FX_FLOAT fOffSetX,
+                        FX_FLOAT fOffSetY);
+  int32_t GetWordAtPoint(CFX_PointF pointf, int32_t& nCount);
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtEngine;
+  CFX_RectF m_rtStatic;
+  FX_FLOAT m_fVAlignOffset;
+  FX_FLOAT m_fScrollOffsetX;
+  FX_FLOAT m_fScrollOffsetY;
+  IFDE_TxtEdtEngine* m_pEdtEngine;
+  FX_BOOL m_bLButtonDown;
+  int32_t m_nSelStart;
+  int32_t m_nLimit;
+  FX_FLOAT m_fSpaceAbove;
+  FX_FLOAT m_fSpaceBelow;
+  FX_FLOAT m_fFontSize;
+  FX_ARGB m_argbSel;
+  FX_BOOL m_bSetRange;
+  int32_t m_iMin;
+  int32_t m_iMax;
+  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
+  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
+  std::unique_ptr<IFWL_Caret> m_pCaret;
+  CFX_WideString m_wsCache;
+  friend class CFWL_TxtEdtEventSink;
+  friend class CFWL_EditImpDelegate;
+  FX_DWORD m_backColor;
+  FX_BOOL m_updateBackColor;
+  CFX_WideString m_wsFont;
+  CFX_ByteStringArray m_RecordArr;
+  int32_t m_iCurRecord;
+  int32_t m_iMaxRecord;
+};
+
+class CFWL_EditImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_EditImpDelegate(CFWL_EditImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void DoActivate(CFWL_MsgActivate* pMsg);
+  void DoDeactivate(CFWL_MsgDeactivate* pMsg);
+  void DoButtonDown(CFWL_MsgMouse* pMsg);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnButtonDblClk(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  void OnChar(CFWL_MsgKey* pMsg);
+  FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos);
+  void DoCursor(CFWL_MsgMouse* pMsg);
+  CFWL_EditImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_EDITIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_formproxyimp.cpp b/xfa/fwl/basewidget/fwl_formproxyimp.cpp
new file mode 100644
index 0000000..51f3507
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_formproxyimp.cpp
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_formproxyimp.h"
+
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+CFWL_FormProxyImp::CFWL_FormProxyImp(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter)
+    : CFWL_FormImp(properties, pOuter) {}
+CFWL_FormProxyImp::~CFWL_FormProxyImp() {}
+FWL_ERR CFWL_FormProxyImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_FormProxy;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_FormProxyImp::GetClassID() const {
+  return FWL_CLASSHASH_FormProxy;
+}
+FX_BOOL CFWL_FormProxyImp::IsInstance(const CFX_WideStringC& wsClass) const {
+  if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy)) {
+    return TRUE;
+  }
+  return CFWL_FormImp::IsInstance(wsClass);
+}
+FWL_ERR CFWL_FormProxyImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_FormProxyImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_FormProxyImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_FormProxyImp::Update() {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_FormProxyImp::DrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  return FWL_ERR_Succeeded;
+}
+CFWL_FormProxyImpDelegate::CFWL_FormProxyImpDelegate(CFWL_FormProxyImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_FormProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pOuter->SetDelegate(NULL);
+  return pDelegate->OnProcessMessage(pMessage);
+}
diff --git a/xfa/fwl/basewidget/fwl_formproxyimp.h b/xfa/fwl/basewidget/fwl_formproxyimp.h
new file mode 100644
index 0000000..c26f21a
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_formproxyimp.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
+
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class CFWL_FormProxyImpDelegate;
+
+class CFWL_FormProxyImp : public CFWL_FormImp {
+ public:
+  CFWL_FormProxyImp(const CFWL_WidgetImpProperties& properties,
+                    IFWL_Widget* pOuter);
+  ~CFWL_FormProxyImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  friend class CFWL_FormProxyImpDelegate;
+};
+class CFWL_FormProxyImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_FormProxyImpDelegate(CFWL_FormProxyImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+
+ protected:
+  CFWL_FormProxyImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_listboximp.cpp b/xfa/fwl/basewidget/fwl_listboximp.cpp
new file mode 100644
index 0000000..a748116
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_listboximp.cpp
@@ -0,0 +1,1241 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_listboximp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/basewidget/fwl_comboboximp.h"
+#include "xfa/fwl/basewidget/fwl_scrollbarimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+#define FWL_LISTBOX_ItemTextMargin 2
+
+// static
+IFWL_ListBox* IFWL_ListBox::Create(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter) {
+  IFWL_ListBox* pListBox = new IFWL_ListBox;
+  CFWL_ListBoxImp* pListBoxImpl = new CFWL_ListBoxImp(properties, pOuter);
+  pListBox->SetImpl(pListBoxImpl);
+  pListBoxImpl->SetInterface(pListBox);
+  return pListBox;
+}
+// static
+IFWL_ListBox* IFWL_ListBox::CreateComboList(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_ListBox* pListBox = new IFWL_ListBox;
+  CFWL_ListBoxImp* pComboListImpl = new CFWL_ComboListImp(properties, pOuter);
+  pListBox->SetImpl(pComboListImpl);
+  pComboListImpl->SetInterface(pListBox);
+  return pListBox;
+}
+IFWL_ListBox::IFWL_ListBox() {}
+int32_t IFWL_ListBox::CountSelItems() {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->CountSelItems();
+}
+FWL_HLISTITEM IFWL_ListBox::GetSelItem(int32_t nIndexSel) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetSelItem(nIndexSel);
+}
+int32_t IFWL_ListBox::GetSelIndex(int32_t nIndex) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetSelIndex(nIndex);
+}
+FWL_ERR IFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->SetSelItem(hItem, bSelect);
+}
+FWL_ERR IFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetItemText(hItem, wsText);
+}
+FWL_ERR IFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetScrollPos(fPos, bVert);
+}
+FWL_ERR* IFWL_ListBox::Sort(IFWL_ListBoxCompare* pCom) {
+  return static_cast<CFWL_ListBoxImp*>(GetImpl())->Sort(pCom);
+}
+
+CFWL_ListBoxImp::CFWL_ListBoxImp(const CFWL_WidgetImpProperties& properties,
+                                 IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_dwTTOStyles(0),
+      m_iTTOAligns(0),
+      m_hAnchor(NULL),
+      m_fScorllBarWidth(0),
+      m_bLButtonDown(FALSE),
+      m_pScrollBarTP(NULL) {
+  m_rtClient.Reset();
+  m_rtConent.Reset();
+  m_rtStatic.Reset();
+}
+CFWL_ListBoxImp::~CFWL_ListBoxImp() {}
+FWL_ERR CFWL_ListBoxImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_ListBox;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ListBoxImp::GetClassID() const {
+  return FWL_CLASSHASH_ListBox;
+}
+FWL_ERR CFWL_ListBoxImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_ListBoxImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImp::Finalize() {
+  if (m_pVertScrollBar) {
+    m_pVertScrollBar->Finalize();
+  }
+  if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->Finalize();
+  }
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_ListBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (!m_pProperties->m_pThemeProvider) {
+      m_pProperties->m_pThemeProvider = GetAvailableTheme();
+    }
+    CFX_SizeF fs = CalcSize(TRUE);
+    rect.Set(0, 0, fs.x, fs.y);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  m_iTTOAligns = FDE_TTOALIGNMENT_Center;
+  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_AlignMask) {
+    case FWL_STYLEEXT_LTB_LeftAlign: {
+      m_iTTOAligns = FDE_TTOALIGNMENT_CenterLeft;
+      break;
+    }
+    case FWL_STYLEEXT_LTB_RightAlign: {
+      m_iTTOAligns = FDE_TTOALIGNMENT_CenterRight;
+      break;
+    }
+    case FWL_STYLEEXT_LTB_CenterAlign:
+    default: { m_iTTOAligns = FDE_TTOALIGNMENT_Center; }
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
+  }
+  m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine;
+  m_fScorllBarWidth = GetScrollWidth();
+  SortItem();
+  CalcSize();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ListBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (IsShowScrollBar(FALSE)) {
+    CFX_RectF rect;
+    m_pHorzScrollBar->GetWidgetRect(rect);
+    if (rect.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_HScrollBar;
+    }
+  }
+  if (IsShowScrollBar(TRUE)) {
+    CFX_RectF rect;
+    m_pVertScrollBar->GetWidgetRect(rect);
+    if (rect.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_VScrollBar;
+    }
+  }
+  if (m_rtClient.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FWL_ERR CFWL_ListBoxImp::DrawWidget(CFX_Graphics* pGraphics,
+                                    const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  pGraphics->SaveGraphState();
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_LTB_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_LTB_Edge, pTheme, pMatrix);
+  }
+  CFX_RectF rtClip(m_rtConent);
+  if (IsShowScrollBar(FALSE)) {
+    rtClip.height -= m_fScorllBarWidth;
+  }
+  if (IsShowScrollBar(TRUE)) {
+    rtClip.width -= m_fScorllBarWidth;
+  }
+  if (pMatrix) {
+    pMatrix->TransformRect(rtClip);
+  }
+  pGraphics->SetClipRect(rtClip);
+  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_NoBackground) == 0) {
+    DrawBkground(pGraphics, pTheme, pMatrix);
+  }
+  DrawItems(pGraphics, pTheme, pMatrix);
+  pGraphics->RestoreGraphState();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  if (!pThemeProvider)
+    return FWL_ERR_Indefinite;
+  if (!pThemeProvider->IsValidWidget(m_pInterface)) {
+    m_pScrollBarTP = pThemeProvider;
+    return FWL_ERR_Succeeded;
+  }
+  m_pProperties->m_pThemeProvider = pThemeProvider;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ListBoxImp::CountSelItems() {
+  if (!m_pProperties->m_pDataProvider)
+    return 0;
+  int32_t iRet = 0;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      continue;
+    }
+    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
+    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
+      iRet++;
+    }
+  }
+  return iRet;
+}
+FWL_HLISTITEM CFWL_ListBoxImp::GetSelItem(int32_t nIndexSel) {
+  if (!m_pProperties->m_pDataProvider)
+    return NULL;
+  int32_t index = 0;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      return NULL;
+    }
+    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
+    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
+      if (index == nIndexSel) {
+        return hItem;
+      } else {
+        index++;
+      }
+    }
+  }
+  return NULL;
+}
+int32_t CFWL_ListBoxImp::GetSelIndex(int32_t nIndex) {
+  if (!m_pProperties->m_pDataProvider)
+    return -1;
+  int32_t index = 0;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      return -1;
+    }
+    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
+    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
+      if (index == nIndex) {
+        return i;
+      } else {
+        index++;
+      }
+    }
+  }
+  return -1;
+}
+FWL_ERR CFWL_ListBoxImp::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
+  if (!m_pProperties->m_pDataProvider)
+    return FWL_ERR_Indefinite;
+  if (!hItem) {
+    if (bSelect) {
+      SelectAll();
+    } else {
+      ClearSelection();
+      SetFocusItem(NULL);
+    }
+    return FWL_ERR_Indefinite;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
+    SetSelectionDirect(hItem, bSelect);
+  } else {
+    SetSelection(hItem, hItem, bSelect);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImp::GetItemText(FWL_HLISTITEM hItem,
+                                     CFX_WideString& wsText) {
+  if (!m_pProperties->m_pDataProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  if (!hItem)
+    return FWL_ERR_Indefinite;
+  pData->GetItemText(m_pInterface, hItem, wsText);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImp::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
+  if ((bVert && IsShowScrollBar(TRUE)) || (!bVert && IsShowScrollBar(FALSE))) {
+    IFWL_ScrollBar* pScrollBar =
+        bVert ? m_pVertScrollBar.get() : m_pHorzScrollBar.get();
+    fPos = pScrollBar->GetPos();
+    return FWL_ERR_Succeeded;
+  }
+  return FWL_ERR_Indefinite;
+}
+FWL_ERR* CFWL_ListBoxImp::Sort(IFWL_ListBoxCompare* pCom) {
+  FWL_HLISTITEM hTemp;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t sz = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < sz - 1; i++) {
+    for (int32_t j = i + 1; j < sz; j++) {
+      if (pCom->Compare(pData->GetItem(m_pInterface, i),
+                        pData->GetItem(m_pInterface, j)) > 0) {
+        hTemp = pData->GetItem(m_pInterface, i);
+        pData->SetItemIndex(m_pInterface, pData->GetItem(m_pInterface, j), i);
+        pData->SetItemIndex(m_pInterface, hTemp, j);
+      }
+    }
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_HLISTITEM CFWL_ListBoxImp::GetItem(FWL_HLISTITEM hItem,
+                                       FX_DWORD dwKeyCode) {
+  FWL_HLISTITEM hRet = NULL;
+  switch (dwKeyCode) {
+    case FWL_VKEY_Up:
+    case FWL_VKEY_Down:
+    case FWL_VKEY_Home:
+    case FWL_VKEY_End: {
+      const bool bUp = dwKeyCode == FWL_VKEY_Up;
+      const bool bDown = dwKeyCode == FWL_VKEY_Down;
+      const bool bHome = dwKeyCode == FWL_VKEY_Home;
+      IFWL_ListBoxDP* pData =
+          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+      int32_t iDstItem = -1;
+      if (bUp || bDown) {
+        int32_t index = pData->GetItemIndex(m_pInterface, hItem);
+        iDstItem = dwKeyCode == FWL_VKEY_Up ? index - 1 : index + 1;
+      } else if (bHome) {
+        iDstItem = 0;
+      } else {
+        int32_t iCount = pData->CountItems(m_pInterface);
+        iDstItem = iCount - 1;
+      }
+      hRet = pData->GetItem(m_pInterface, iDstItem);
+      break;
+    }
+    default: {}
+  }
+  return hRet;
+}
+void CFWL_ListBoxImp::SetSelection(FWL_HLISTITEM hStart,
+                                   FWL_HLISTITEM hEnd,
+                                   FX_BOOL bSelected) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iStart = pData->GetItemIndex(m_pInterface, hStart);
+  int32_t iEnd = pData->GetItemIndex(m_pInterface, hEnd);
+  if (iStart > iEnd) {
+    int32_t iTemp = iStart;
+    iStart = iEnd;
+    iEnd = iTemp;
+  }
+  if (bSelected) {
+    int32_t iCount = pData->CountItems(m_pInterface);
+    for (int32_t i = 0; i < iCount; i++) {
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+      SetSelectionDirect(hItem, FALSE);
+    }
+  }
+  for (; iStart <= iEnd; iStart++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iStart);
+    SetSelectionDirect(hItem, bSelected);
+  }
+}
+void CFWL_ListBoxImp::SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FX_DWORD dwOldStyle = pData->GetItemStyles(m_pInterface, hItem);
+  bSelect ? dwOldStyle |= FWL_ITEMSTATE_LTB_Selected
+          : dwOldStyle &= ~FWL_ITEMSTATE_LTB_Selected;
+  pData->SetItemStyles(m_pInterface, hItem, dwOldStyle);
+}
+FX_BOOL CFWL_ListBoxImp::IsItemSelected(FWL_HLISTITEM hItem) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem);
+  return (dwState & FWL_ITEMSTATE_LTB_Selected) != 0;
+}
+void CFWL_ListBoxImp::ClearSelection() {
+  FX_BOOL bMulti =
+      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem);
+    FX_BOOL bFindSel = dwState & FWL_ITEMSTATE_LTB_Selected;
+    if (!bFindSel) {
+      continue;
+    }
+    SetSelectionDirect(hItem, FALSE);
+    if (!bMulti) {
+      return;
+    }
+  }
+}
+void CFWL_ListBoxImp::SelectAll() {
+  FX_BOOL bMulti =
+      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
+  if (!bMulti) {
+    return;
+  }
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  if (iCount > 0) {
+    FWL_HLISTITEM hItemStart = pData->GetItem(m_pInterface, 0);
+    FWL_HLISTITEM hItemEnd = pData->GetItem(m_pInterface, iCount - 1);
+    SetSelection(hItemStart, hItemEnd, FALSE);
+  }
+}
+FWL_HLISTITEM CFWL_ListBoxImp::GetFocusedItem() {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem)
+      return NULL;
+    if (pData->GetItemStyles(m_pInterface, hItem) & FWL_ITEMSTATE_LTB_Focused) {
+      return hItem;
+    }
+  }
+  return NULL;
+}
+void CFWL_ListBoxImp::SetFocusItem(FWL_HLISTITEM hItem) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FWL_HLISTITEM hFocus = GetFocusedItem();
+  if (hItem != hFocus) {
+    if (hFocus) {
+      FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hFocus);
+      dwStyle &= ~FWL_ITEMSTATE_LTB_Focused;
+      pData->SetItemStyles(m_pInterface, hFocus, dwStyle);
+    }
+    if (hItem) {
+      FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
+      dwStyle |= FWL_ITEMSTATE_LTB_Focused;
+      pData->SetItemStyles(m_pInterface, hItem, dwStyle);
+    }
+  }
+}
+FWL_HLISTITEM CFWL_ListBoxImp::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
+  fx -= m_rtConent.left, fy -= m_rtConent.top;
+  FX_FLOAT fPosX = 0.0f;
+  if (m_pHorzScrollBar) {
+    fPosX = m_pHorzScrollBar->GetPos();
+  }
+  FX_FLOAT fPosY = 0.0;
+  if (m_pVertScrollBar) {
+    fPosY = m_pVertScrollBar->GetPos();
+  }
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t nCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < nCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      continue;
+    }
+    CFX_RectF rtItem;
+    pData->GetItemRect(m_pInterface, hItem, rtItem);
+    rtItem.Offset(-fPosX, -fPosY);
+    if (rtItem.Contains(fx, fy)) {
+      return hItem;
+    }
+  }
+  return NULL;
+}
+FX_BOOL CFWL_ListBoxImp::GetItemCheckRect(FWL_HLISTITEM hItem,
+                                          CFX_RectF& rtCheck) {
+  if (!m_pProperties->m_pDataProvider)
+    return FALSE;
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+    return FALSE;
+  }
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  pData->GetItemCheckRect(m_pInterface, hItem, rtCheck);
+  return TRUE;
+}
+FX_BOOL CFWL_ListBoxImp::GetItemChecked(FWL_HLISTITEM hItem) {
+  if (!m_pProperties->m_pDataProvider)
+    return FALSE;
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+    return FALSE;
+  }
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  return (pData->GetItemCheckState(m_pInterface, hItem) &
+          FWL_ITEMSTATE_LTB_Checked);
+}
+FX_BOOL CFWL_ListBoxImp::SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked) {
+  if (!m_pProperties->m_pDataProvider)
+    return FALSE;
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+    return FALSE;
+  }
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  pData->SetItemCheckState(m_pInterface, hItem,
+                           bChecked ? FWL_ITEMSTATE_LTB_Checked : 0);
+  return TRUE;
+}
+FX_BOOL CFWL_ListBoxImp::ScrollToVisible(FWL_HLISTITEM hItem) {
+  if (!m_pVertScrollBar)
+    return FALSE;
+  CFX_RectF rtItem;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  pData->GetItemRect(m_pInterface, hItem, rtItem);
+  FX_BOOL bScroll = FALSE;
+  FX_FLOAT fPosY = m_pVertScrollBar->GetPos();
+  rtItem.Offset(0, -fPosY + m_rtConent.top);
+  if (rtItem.top < m_rtConent.top) {
+    fPosY += rtItem.top - m_rtConent.top;
+    bScroll = TRUE;
+  } else if (rtItem.bottom() > m_rtConent.bottom()) {
+    fPosY += rtItem.bottom() - m_rtConent.bottom();
+    bScroll = TRUE;
+  }
+  if (!bScroll) {
+    return FALSE;
+  }
+  m_pVertScrollBar->SetPos(fPosY);
+  m_pVertScrollBar->SetTrackPos(fPosY);
+  Repaint(&m_rtClient);
+  return TRUE;
+}
+void CFWL_ListBoxImp::DrawBkground(CFX_Graphics* pGraphics,
+                                   IFWL_ThemeProvider* pTheme,
+                                   const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pTheme)
+    return;
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_LTB_Background;
+  param.m_dwStates = 0;
+  param.m_pGraphics = pGraphics;
+  param.m_matrix.Concat(*pMatrix);
+  param.m_rtPart = m_rtClient;
+  if (IsShowScrollBar(FALSE) && IsShowScrollBar(TRUE)) {
+    param.m_pData = &m_rtStatic;
+  }
+  if (!IsEnabled()) {
+    param.m_dwStates = FWL_PARTSTATE_LTB_Disabled;
+  }
+  pTheme->DrawBackground(&param);
+}
+void CFWL_ListBoxImp::DrawItems(CFX_Graphics* pGraphics,
+                                IFWL_ThemeProvider* pTheme,
+                                const CFX_Matrix* pMatrix) {
+  FX_FLOAT fPosX = 0.0f;
+  if (m_pHorzScrollBar) {
+    fPosX = m_pHorzScrollBar->GetPos();
+  }
+  FX_FLOAT fPosY = 0.0f;
+  if (m_pVertScrollBar) {
+    fPosY = m_pVertScrollBar->GetPos();
+  }
+  CFX_RectF rtView(m_rtConent);
+  if (m_pHorzScrollBar) {
+    rtView.height -= m_fScorllBarWidth;
+  }
+  if (m_pVertScrollBar) {
+    rtView.width -= m_fScorllBarWidth;
+  }
+  FX_BOOL bMultiCol =
+      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      continue;
+    }
+    CFX_RectF rtItem;
+    pData->GetItemRect(m_pInterface, hItem, rtItem);
+    rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY);
+    if (rtItem.bottom() < m_rtConent.top) {
+      continue;
+    }
+    if (rtItem.top >= m_rtConent.bottom()) {
+      break;
+    }
+    if (bMultiCol && rtItem.left > m_rtConent.right()) {
+      break;
+    }
+    if (GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw) {
+      CFWL_EvtLtbDrawItem ev;
+      ev.m_pSrcTarget = m_pInterface;
+      ev.m_pGraphics = pGraphics;
+      ev.m_matrix = *pMatrix;
+      ev.m_index = i;
+      ev.m_rect = rtItem;
+      DispatchEvent(&ev);
+    } else {
+      DrawItem(pGraphics, pTheme, hItem, i, rtItem, pMatrix);
+    }
+  }
+}
+void CFWL_ListBoxImp::DrawItem(CFX_Graphics* pGraphics,
+                               IFWL_ThemeProvider* pTheme,
+                               FWL_HLISTITEM hItem,
+                               int32_t Index,
+                               const CFX_RectF& rtItem,
+                               const CFX_Matrix* pMatrix) {
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  FX_DWORD dwItemStyles = pData->GetItemStyles(m_pInterface, hItem);
+  FX_DWORD dwPartStates = FWL_PARTSTATE_LTB_Normal;
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    dwPartStates = FWL_PARTSTATE_LTB_Disabled;
+  } else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected) {
+    dwPartStates = FWL_PARTSTATE_LTB_Selected;
+  }
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused &&
+      dwItemStyles & FWL_ITEMSTATE_LTB_Focused) {
+    dwPartStates |= FWL_PARTSTATE_LTB_Focused;
+  }
+  FWL_ListBoxItemData itemData;
+  itemData.pDataProvider = pData;
+  itemData.iIndex = Index;
+  {
+    CFWL_ThemeBackground param;
+    param.m_pWidget = m_pInterface;
+    param.m_iPart = FWL_PART_LTB_ListItem;
+    param.m_dwStates = dwPartStates;
+    param.m_pGraphics = pGraphics;
+    param.m_matrix.Concat(*pMatrix);
+    param.m_rtPart = rtItem;
+    param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
+    CFX_RectF rtFocus(rtItem);
+    param.m_pData = &rtFocus;
+    if (m_pVertScrollBar && !m_pHorzScrollBar &&
+        (dwPartStates & FWL_PARTSTATE_LTB_Focused)) {
+      param.m_rtPart.left += 1;
+      param.m_rtPart.width -= (m_fScorllBarWidth + 1);
+      rtFocus.Deflate(0.5, 0.5, 1 + m_fScorllBarWidth, 1);
+    }
+    pTheme->DrawBackground(&param);
+  }
+  {
+    FX_BOOL bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon;
+    if (bHasIcon) {
+      CFX_RectF rtDIB;
+      CFX_DIBitmap* pDib = pData->GetItemIcon(m_pInterface, hItem);
+      rtDIB.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
+      if (pDib) {
+        CFWL_ThemeBackground param;
+        param.m_pWidget = m_pInterface;
+        param.m_iPart = FWL_PART_LTB_Icon;
+        param.m_pGraphics = pGraphics;
+        param.m_matrix.Concat(*pMatrix);
+        param.m_rtPart = rtDIB;
+        param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
+        param.m_pImage = pDib;
+        pTheme->DrawBackground(&param);
+      }
+    }
+    FX_BOOL bHasCheck = GetStylesEx() & FWL_STYLEEXT_LTB_Check;
+    if (bHasCheck) {
+      CFX_RectF rtCheck;
+      rtCheck.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
+      rtCheck.Deflate(2, 2, 2, 2);
+      pData->SetItemCheckRect(m_pInterface, hItem, rtCheck);
+      CFWL_ThemeBackground param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_LTB_Check;
+      param.m_pGraphics = pGraphics;
+      if (GetItemChecked(hItem)) {
+        param.m_dwStates = FWL_PARTSTATE_LTB_Checked;
+      } else {
+        param.m_dwStates = FWL_PARTSTATE_LTB_UnChecked;
+      }
+      param.m_matrix.Concat(*pMatrix);
+      param.m_rtPart = rtCheck;
+      param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
+      pTheme->DrawBackground(&param);
+    }
+    CFX_WideString wsText;
+    pData->GetItemText(m_pInterface, hItem, wsText);
+    if (wsText.GetLength() <= 0) {
+      return;
+    }
+    CFX_RectF rtText(rtItem);
+    rtText.Deflate(FWL_LISTBOX_ItemTextMargin, FWL_LISTBOX_ItemTextMargin);
+    if (bHasIcon || bHasCheck) {
+      rtText.Deflate(rtItem.height, 0, 0, 0);
+    }
+    CFWL_ThemeText textParam;
+    textParam.m_pWidget = m_pInterface;
+    textParam.m_iPart = FWL_PART_LTB_ListItem;
+    textParam.m_dwStates = dwPartStates;
+    textParam.m_pGraphics = pGraphics;
+    textParam.m_matrix.Concat(*pMatrix);
+    textParam.m_rtPart = rtText;
+    textParam.m_wsText = wsText;
+    textParam.m_dwTTOStyles = m_dwTTOStyles;
+    textParam.m_iTTOAlign = m_iTTOAligns;
+    textParam.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
+    pTheme->DrawText(&textParam);
+  }
+}
+CFX_SizeF CFWL_ListBoxImp::CalcSize(FX_BOOL bAutoSize) {
+  CFX_SizeF fs;
+  if (!m_pProperties->m_pThemeProvider)
+    return fs;
+
+  GetClientRect(m_rtClient);
+  m_rtConent = m_rtClient;
+  CFX_RectF rtUIMargin;
+  rtUIMargin.Set(0, 0, 0, 0);
+  if (!m_pOuter) {
+    CFX_RectF* pUIMargin =
+        static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
+    if (pUIMargin) {
+      m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
+                         pUIMargin->height);
+    }
+  }
+  FX_FLOAT fWidth = 0;
+  if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(m_pInterface)) {
+    IFWL_ListBoxDP* pData =
+        static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+    if (!bAutoSize) {
+    }
+    int32_t iCount = pData->CountItems(m_pInterface);
+    for (int32_t i = 0; i < iCount; i++) {
+      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+      CFWL_ThemePart itemPart;
+      itemPart.m_pWidget = m_pInterface;
+      itemPart.m_iPart = FWL_PART_LTB_ListItem;
+      itemPart.m_pData = m_pProperties->m_pDataProvider;
+      itemPart.m_dwData = i;
+      CFX_RectF r;
+      m_pProperties->m_pThemeProvider->GetPartRect(&itemPart, r);
+      if (!bAutoSize) {
+        CFX_RectF rtItem;
+        rtItem.Set(m_rtClient.left, m_rtClient.top + fs.y, r.width, r.height);
+        IFWL_ListBoxDP* pData =
+            static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+        pData->SetItemRect(m_pInterface, hItem, rtItem);
+      }
+      fs.y += r.height;
+      if (fs.x < r.width) {
+        fs.x = r.width;
+        fWidth = r.width;
+      }
+    }
+  } else {
+    fWidth = GetMaxTextWidth();
+    fWidth += 2 * FWL_LISTBOX_ItemTextMargin;
+    if (!bAutoSize) {
+      FX_FLOAT fActualWidth =
+          m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
+      if (fWidth < fActualWidth) {
+        fWidth = fActualWidth;
+      }
+    }
+    IFWL_ListBoxDP* pData =
+        static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+    m_fItemHeight = GetItemHeigt();
+    FX_BOOL bHasIcon;
+    bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon;
+    if (bHasIcon) {
+      fWidth += m_fItemHeight;
+    }
+    int32_t iCount = pData->CountItems(m_pInterface);
+    for (int32_t i = 0; i < iCount; i++) {
+      FWL_HLISTITEM htem = pData->GetItem(m_pInterface, i);
+      GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize);
+    }
+  }
+  if (bAutoSize) {
+    return fs;
+  }
+  FX_FLOAT iWidth = m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
+  FX_FLOAT iHeight = m_rtClient.height;
+  FX_BOOL bShowVertScr =
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) &&
+      (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll);
+  FX_BOOL bShowHorzScr =
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) &&
+      (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll);
+  if (!bShowVertScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll &&
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) == 0) {
+    bShowVertScr = (fs.y > iHeight);
+  }
+  if (!bShowHorzScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) {
+    bShowHorzScr = (fs.x > iWidth);
+  }
+  CFX_SizeF szRange;
+  if (bShowVertScr) {
+    if (!m_pVertScrollBar) {
+      InitScrollBar();
+    }
+    CFX_RectF rtScrollBar;
+    rtScrollBar.Set(m_rtClient.right() - m_fScorllBarWidth, m_rtClient.top,
+                    m_fScorllBarWidth, m_rtClient.height - 1);
+    if (bShowHorzScr) {
+      rtScrollBar.height -= m_fScorllBarWidth;
+    }
+    m_pVertScrollBar->SetWidgetRect(rtScrollBar);
+    szRange.x = 0, szRange.y = fs.y - m_rtConent.height;
+    if (szRange.y < m_fItemHeight) {
+      szRange.y = m_fItemHeight;
+    }
+    m_pVertScrollBar->SetRange(szRange.x, szRange.y);
+    m_pVertScrollBar->SetPageSize(rtScrollBar.height * 9 / 10);
+    m_pVertScrollBar->SetStepSize(m_fItemHeight);
+    FX_FLOAT fPos = m_pVertScrollBar->GetPos();
+    if (fPos < 0) {
+      fPos = 0;
+    }
+    if (fPos > szRange.y) {
+      fPos = szRange.y;
+    }
+    m_pVertScrollBar->SetPos(fPos);
+    m_pVertScrollBar->SetTrackPos(fPos);
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
+            0 ||
+        (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) {
+      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+    }
+    m_pVertScrollBar->Update();
+  } else if (m_pVertScrollBar) {
+    m_pVertScrollBar->SetPos(0);
+    m_pVertScrollBar->SetTrackPos(0);
+    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  if (bShowHorzScr) {
+    if (!m_pHorzScrollBar) {
+      InitScrollBar(FALSE);
+    }
+    CFX_RectF rtScrollBar;
+    rtScrollBar.Set(m_rtClient.left, m_rtClient.bottom() - m_fScorllBarWidth,
+                    m_rtClient.width, m_fScorllBarWidth);
+    if (bShowVertScr) {
+      rtScrollBar.width -= m_fScorllBarWidth;
+    }
+    m_pHorzScrollBar->SetWidgetRect(rtScrollBar);
+    szRange.x = 0, szRange.y = fs.x - rtScrollBar.width;
+    m_pHorzScrollBar->SetRange(szRange.x, szRange.y);
+    m_pHorzScrollBar->SetPageSize(fWidth * 9 / 10);
+    m_pHorzScrollBar->SetStepSize(fWidth / 10);
+    FX_FLOAT fPos = m_pHorzScrollBar->GetPos();
+    if (fPos < 0) {
+      fPos = 0;
+    }
+    if (fPos > szRange.y) {
+      fPos = szRange.y;
+    }
+    m_pHorzScrollBar->SetPos(fPos);
+    m_pHorzScrollBar->SetTrackPos(fPos);
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
+            0 ||
+        (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) {
+      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+    }
+    m_pHorzScrollBar->Update();
+  } else if (m_pHorzScrollBar) {
+    m_pHorzScrollBar->SetPos(0);
+    m_pHorzScrollBar->SetTrackPos(0);
+    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  }
+  if (bShowVertScr && bShowHorzScr) {
+    m_rtStatic.Set(m_rtClient.right() - m_fScorllBarWidth,
+                   m_rtClient.bottom() - m_fScorllBarWidth, m_fScorllBarWidth,
+                   m_fScorllBarWidth);
+  }
+  return fs;
+}
+void CFWL_ListBoxImp::GetItemSize(CFX_SizeF& size,
+                                  FWL_HLISTITEM hItem,
+                                  FX_FLOAT fWidth,
+                                  FX_FLOAT m_fItemHeight,
+                                  FX_BOOL bAutoSize) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) {
+  } else {
+    if (!bAutoSize) {
+      CFX_RectF rtItem;
+      rtItem.Set(0, size.y, fWidth, m_fItemHeight);
+      IFWL_ListBoxDP* pData =
+          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+      pData->SetItemRect(m_pInterface, hItem, rtItem);
+    }
+    size.x = fWidth;
+    size.y += m_fItemHeight;
+  }
+}
+FX_FLOAT CFWL_ListBoxImp::GetMaxTextWidth() {
+  FX_FLOAT fRet = 0.0f;
+  IFWL_ListBoxDP* pData =
+      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+  int32_t iCount = pData->CountItems(m_pInterface);
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
+    if (!hItem) {
+      continue;
+    }
+    CFX_WideString wsText;
+    pData->GetItemText(m_pInterface, hItem, wsText);
+    CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider);
+    if (sz.x > fRet) {
+      fRet = sz.x;
+    }
+  }
+  return fRet;
+}
+FX_FLOAT CFWL_ListBoxImp::GetScrollWidth() {
+  FX_FLOAT* pfWidth =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+  if (!pfWidth)
+    return 0;
+  return *pfWidth;
+}
+FX_FLOAT CFWL_ListBoxImp::GetItemHeigt() {
+  FX_FLOAT* pfFont =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FontSize));
+  if (!pfFont)
+    return 20;
+  return *pfFont + 2 * FWL_LISTBOX_ItemTextMargin;
+}
+void CFWL_ListBoxImp::InitScrollBar(FX_BOOL bVert) {
+  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
+    return;
+  }
+  CFWL_WidgetImpProperties prop;
+  prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
+  prop.m_dwStates = FWL_WGTSTATE_Invisible;
+  prop.m_pParent = m_pInterface;
+  prop.m_pThemeProvider = m_pScrollBarTP;
+  IFWL_ScrollBar* pScrollBar = IFWL_ScrollBar::Create(prop, m_pInterface);
+  pScrollBar->Initialize();
+  (bVert ? &m_pVertScrollBar : &m_pHorzScrollBar)->reset(pScrollBar);
+}
+void CFWL_ListBoxImp::SortItem() {}
+FX_BOOL CFWL_ListBoxImp::IsShowScrollBar(FX_BOOL bVert) {
+  IFWL_ScrollBar* pScrollbar =
+      bVert ? m_pVertScrollBar.get() : m_pHorzScrollBar.get();
+  if (!pScrollbar || (pScrollbar->GetStates() & FWL_WGTSTATE_Invisible)) {
+    return FALSE;
+  }
+  return !(m_pProperties->m_dwStyleExes &
+           FWL_STYLEEXT_LTB_ShowScrollBarFocus) ||
+         (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
+}
+void CFWL_ListBoxImp::ProcessSelChanged() {
+  CFWL_EvtLtbSelChanged selEvent;
+  selEvent.m_pSrcTarget = m_pInterface;
+  CFX_Int32Array arrSels;
+  int32_t iCount = CountSelItems();
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_HLISTITEM item = GetSelItem(i);
+    if (item == NULL) {
+      continue;
+    }
+    selEvent.iarraySels.Add(i);
+  }
+  DispatchEvent(&selEvent);
+}
+CFWL_ListBoxImpDelegate::CFWL_ListBoxImpDelegate(CFWL_ListBoxImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_ListBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  if (!m_pOwner->IsEnabled()) {
+    return 1;
+  }
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  int32_t iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_MouseWheel: {
+      OnMouseWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage));
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pMsg = static_cast<CFWL_MsgKey*>(pMessage);
+      if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown)
+        OnKeyDown(pMsg);
+      break;
+    }
+    default: { iRet = 0; }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_ListBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  if (!pEvent)
+    return FWL_ERR_Indefinite;
+  if (pEvent->GetClassID() != FWL_EVTHASH_Scroll) {
+    return FWL_ERR_Succeeded;
+  }
+  IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
+  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
+       m_pOwner->m_pVertScrollBar) ||
+      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
+       m_pOwner->m_pHorzScrollBar)) {
+    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
+    OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
+             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ListBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                              const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_ListBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (m_pOwner->GetStylesEx() & FWL_STYLEEXT_LTB_ShowScrollBarFocus) {
+    if (m_pOwner->m_pVertScrollBar) {
+      m_pOwner->m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
+    }
+    if (m_pOwner->m_pHorzScrollBar) {
+      m_pOwner->m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
+    }
+  }
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_ListBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  m_pOwner->m_bLButtonDown = TRUE;
+  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    m_pOwner->SetFocus(TRUE);
+  }
+  FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (!hItem) {
+    return;
+  }
+  if (m_pOwner->m_pProperties->m_dwStyleExes &
+      FWL_STYLEEXT_LTB_MultiSelection) {
+    if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
+      FX_BOOL bSelected = m_pOwner->IsItemSelected(hItem);
+      m_pOwner->SetSelectionDirect(hItem, !bSelected);
+      m_pOwner->m_hAnchor = hItem;
+    } else if (pMsg->m_dwFlags & FWL_KEYFLAG_Shift) {
+      if (m_pOwner->m_hAnchor) {
+        m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE);
+      } else {
+        m_pOwner->SetSelectionDirect(hItem, TRUE);
+      }
+    } else {
+      m_pOwner->SetSelection(hItem, hItem, TRUE);
+      m_pOwner->m_hAnchor = hItem;
+    }
+  } else {
+    m_pOwner->SetSelection(hItem, hItem, TRUE);
+  }
+  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check) {
+    FWL_HLISTITEM hSelectedItem =
+        m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+    CFX_RectF rtCheck;
+    m_pOwner->GetItemCheckRect(hSelectedItem, rtCheck);
+    FX_BOOL bChecked = m_pOwner->GetItemChecked(hItem);
+    if (rtCheck.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if (bChecked) {
+        m_pOwner->SetItemChecked(hItem, FALSE);
+      } else {
+        m_pOwner->SetItemChecked(hItem, TRUE);
+      }
+      m_pOwner->Update();
+    }
+  }
+  m_pOwner->SetFocusItem(hItem);
+  m_pOwner->ScrollToVisible(hItem);
+  m_pOwner->SetGrab(TRUE);
+  m_pOwner->ProcessSelChanged();
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_ListBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_bLButtonDown) {
+    m_pOwner->m_bLButtonDown = FALSE;
+    m_pOwner->SetGrab(FALSE);
+    DispatchSelChangedEv();
+  }
+}
+void CFWL_ListBoxImpDelegate::OnMouseWheel(CFWL_MsgMouseWheel* pMsg) {
+  if (!m_pOwner->IsShowScrollBar(TRUE)) {
+    return;
+  }
+  IFWL_WidgetDelegate* pDelegate =
+      m_pOwner->m_pVertScrollBar->SetDelegate(NULL);
+  pDelegate->OnProcessMessage(pMsg);
+}
+void CFWL_ListBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
+  switch (dwKeyCode) {
+    case FWL_VKEY_Tab:
+    case FWL_VKEY_Up:
+    case FWL_VKEY_Down:
+    case FWL_VKEY_Home:
+    case FWL_VKEY_End: {
+      FWL_HLISTITEM hItem = m_pOwner->GetFocusedItem();
+      hItem = m_pOwner->GetItem(hItem, dwKeyCode);
+      FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
+      FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl;
+      OnVK(hItem, bShift, bCtrl);
+      DispatchSelChangedEv();
+      m_pOwner->ProcessSelChanged();
+      break;
+    }
+    default: {}
+  }
+}
+void CFWL_ListBoxImpDelegate::OnVK(FWL_HLISTITEM hItem,
+                                   FX_BOOL bShift,
+                                   FX_BOOL bCtrl) {
+  if (!hItem) {
+    return;
+  }
+  if (m_pOwner->m_pProperties->m_dwStyleExes &
+      FWL_STYLEEXT_LTB_MultiSelection) {
+    if (bCtrl) {
+    } else if (bShift) {
+      if (m_pOwner->m_hAnchor) {
+        m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE);
+      } else {
+        m_pOwner->SetSelectionDirect(hItem, TRUE);
+      }
+    } else {
+      m_pOwner->SetSelection(hItem, hItem, TRUE);
+      m_pOwner->m_hAnchor = hItem;
+    }
+  } else {
+    m_pOwner->SetSelection(hItem, hItem, TRUE);
+  }
+  m_pOwner->SetFocusItem(hItem);
+  m_pOwner->ScrollToVisible(hItem);
+  {
+    CFX_RectF rtInvalidate;
+    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
+                     m_pOwner->m_pProperties->m_rtWidget.height);
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+FX_BOOL CFWL_ListBoxImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
+                                          FX_DWORD dwCode,
+                                          FX_FLOAT fPos) {
+  CFX_SizeF fs;
+  pScrollBar->GetRange(fs.x, fs.y);
+  FX_FLOAT iCurPos = pScrollBar->GetPos();
+  FX_FLOAT fStep = pScrollBar->GetStepSize();
+  switch (dwCode) {
+    case FWL_SCBCODE_Min: {
+      fPos = fs.x;
+      break;
+    }
+    case FWL_SCBCODE_Max: {
+      fPos = fs.y;
+      break;
+    }
+    case FWL_SCBCODE_StepBackward: {
+      fPos -= fStep;
+      if (fPos < fs.x + fStep / 2) {
+        fPos = fs.x;
+      }
+      break;
+    }
+    case FWL_SCBCODE_StepForward: {
+      fPos += fStep;
+      if (fPos > fs.y - fStep / 2) {
+        fPos = fs.y;
+      }
+      break;
+    }
+    case FWL_SCBCODE_PageBackward: {
+      fPos -= pScrollBar->GetPageSize();
+      if (fPos < fs.x) {
+        fPos = fs.x;
+      }
+      break;
+    }
+    case FWL_SCBCODE_PageForward: {
+      fPos += pScrollBar->GetPageSize();
+      if (fPos > fs.y) {
+        fPos = fs.y;
+      }
+      break;
+    }
+    case FWL_SCBCODE_Pos:
+    case FWL_SCBCODE_TrackPos:
+      break;
+    case FWL_SCBCODE_EndScroll:
+      return FALSE;
+  }
+  if (iCurPos != fPos) {
+    pScrollBar->SetPos(fPos);
+    pScrollBar->SetTrackPos(fPos);
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  }
+  return TRUE;
+}
+void CFWL_ListBoxImpDelegate::DispatchSelChangedEv() {
+  CFWL_EvtLtbSelChanged ev;
+  ev.m_pSrcTarget = m_pOwner->m_pInterface;
+  m_pOwner->DispatchEvent(&ev);
+}
diff --git a/xfa/fwl/basewidget/fwl_listboximp.h b/xfa/fwl/basewidget/fwl_listboximp.h
new file mode 100644
index 0000000..a78faf3
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_listboximp.h
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
+
+#include <memory>
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_combobox.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/basewidget/fwl_listbox.h"
+#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
+
+class CFWL_ListBoxImpDelegate;
+
+class CFWL_ListBoxImp : public CFWL_WidgetImp {
+ public:
+  CFWL_ListBoxImp(const CFWL_WidgetImpProperties& properties,
+                  IFWL_Widget* pOuter);
+  ~CFWL_ListBoxImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
+  virtual int32_t CountSelItems();
+  virtual FWL_HLISTITEM GetSelItem(int32_t nIndexSel);
+  virtual int32_t GetSelIndex(int32_t nIndex);
+  virtual FWL_ERR SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect = TRUE);
+  virtual FWL_ERR GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText);
+  virtual FWL_ERR GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert = TRUE);
+  virtual FWL_ERR* Sort(IFWL_ListBoxCompare* pCom);
+
+ protected:
+  FWL_HLISTITEM GetItem(FWL_HLISTITEM hItem, FX_DWORD dwKeyCode);
+  void SetSelection(FWL_HLISTITEM hStart,
+                    FWL_HLISTITEM hEnd,
+                    FX_BOOL bSelected);
+  void SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect);
+  FX_BOOL IsItemSelected(FWL_HLISTITEM hItem);
+  void ClearSelection();
+  void SelectAll();
+  FWL_HLISTITEM GetFocusedItem();
+  void SetFocusItem(FWL_HLISTITEM hItem);
+  FWL_HLISTITEM GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy);
+  FX_BOOL GetItemCheckRect(FWL_HLISTITEM hItem, CFX_RectF& rtCheck);
+  FX_BOOL SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked);
+  FX_BOOL GetItemChecked(FWL_HLISTITEM hItem);
+  FX_BOOL ScrollToVisible(FWL_HLISTITEM hItem);
+  void DrawBkground(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix = NULL);
+  void DrawItems(CFX_Graphics* pGraphics,
+                 IFWL_ThemeProvider* pTheme,
+                 const CFX_Matrix* pMatrix = NULL);
+  void DrawItem(CFX_Graphics* pGraphics,
+                IFWL_ThemeProvider* pTheme,
+                FWL_HLISTITEM hItem,
+                int32_t Index,
+                const CFX_RectF& rtItem,
+                const CFX_Matrix* pMatrix = NULL);
+  void DrawStatic(CFX_Graphics* pGraphics, IFWL_ThemeProvider* pTheme);
+  CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE);
+  void GetItemSize(CFX_SizeF& size,
+                   FWL_HLISTITEM hItem,
+                   FX_FLOAT fWidth,
+                   FX_FLOAT fHeight,
+                   FX_BOOL bAutoSize = FALSE);
+  FX_FLOAT GetMaxTextWidth();
+  FX_FLOAT GetScrollWidth();
+  FX_FLOAT GetItemHeigt();
+  void InitScrollBar(FX_BOOL bVert = TRUE);
+  void SortItem();
+  FX_BOOL IsShowScrollBar(FX_BOOL bVert);
+  void ProcessSelChanged();
+
+ protected:
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtStatic;
+  CFX_RectF m_rtConent;
+  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
+  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
+  FX_DWORD m_dwTTOStyles;
+  int32_t m_iTTOAligns;
+  FWL_HLISTITEM m_hAnchor;
+  FX_FLOAT m_fItemHeight;
+  FX_FLOAT m_fScorllBarWidth;
+  FX_BOOL m_bLButtonDown;
+  IFWL_ThemeProvider* m_pScrollBarTP;
+  friend class CFWL_ListBoxImpDelegate;
+};
+class CFWL_ListBoxImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_ListBoxImpDelegate(CFWL_ListBoxImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseWheel(CFWL_MsgMouseWheel* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  void OnVK(FWL_HLISTITEM hItem, FX_BOOL bShift, FX_BOOL bCtrl);
+  FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos);
+  void DispatchSelChangedEv();
+  CFWL_ListBoxImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp b/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp
new file mode 100644
index 0000000..e6dad35
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp
@@ -0,0 +1,1098 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_monthcalendarimp.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+#define MONTHCAL_HSEP_HEIGHT 1
+#define MONTHCAL_VSEP_WIDTH 1
+#define MONTHCAL_HMARGIN 3
+#define MONTHCAL_VMARGIN 2
+#define MONTHCAL_ROWS 9
+#define MONTHCAL_COLUMNS 7
+#define MONTHCAL_HEADER_BTN_VMARGIN 7
+#define MONTHCAL_HEADER_BTN_HMARGIN 5
+
+// static
+IFWL_MonthCalendar* IFWL_MonthCalendar::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_MonthCalendar* pMonthCalendar = new IFWL_MonthCalendar;
+  CFWL_MonthCalendarImp* pMonthCalendarImpl =
+      new CFWL_MonthCalendarImp(properties, pOuter);
+  pMonthCalendar->SetImpl(pMonthCalendarImpl);
+  pMonthCalendarImpl->SetInterface(pMonthCalendar);
+  return pMonthCalendar;
+}
+IFWL_MonthCalendar::IFWL_MonthCalendar() {}
+int32_t IFWL_MonthCalendar::CountSelect() {
+  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())->CountSelect();
+}
+FX_BOOL IFWL_MonthCalendar::GetSelect(int32_t& iYear,
+                                      int32_t& iMonth,
+                                      int32_t& iDay,
+                                      int32_t nIndex) {
+  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())
+      ->GetSelect(iYear, iMonth, iDay, nIndex);
+}
+FX_BOOL IFWL_MonthCalendar::SetSelect(int32_t iYear,
+                                      int32_t iMonth,
+                                      int32_t iDay) {
+  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())
+      ->SetSelect(iYear, iMonth, iDay);
+}
+
+CFWL_MonthCalendarImp::CFWL_MonthCalendarImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_iCurYear(2011),
+      m_iCurMonth(1),
+      m_iYear(2011),
+      m_iMonth(1),
+      m_iDay(1),
+      m_iHovered(-1),
+      m_iLBtnPartStates(FWL_PARTSTATE_MCD_Normal),
+      m_iRBtnPartStates(FWL_PARTSTATE_MCD_Normal) {
+  m_rtHead.Reset();
+  m_rtWeek.Reset();
+  m_rtLBtn.Reset();
+  m_rtRBtn.Reset();
+  m_rtDates.Reset();
+  m_rtHSep.Reset();
+  m_rtHeadText.Reset();
+  m_rtToday.Reset();
+  m_rtTodayFlag.Reset();
+  m_rtClient.Reset();
+  m_rtWeekNum.Reset();
+  m_rtWeekNumSep.Reset();
+  m_pDateTime = new CFX_DateTime;
+  m_bInit = FALSE;
+  m_iMaxSel = 1;
+}
+CFWL_MonthCalendarImp::~CFWL_MonthCalendarImp() {
+  ClearDateItem();
+  delete m_pDateTime;
+  m_arrSelDays.RemoveAll();
+}
+FWL_ERR CFWL_MonthCalendarImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_MonthCalendar;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_MonthCalendarImp::GetClassID() const {
+  return FWL_CLASSHASH_MonthCalendar;
+}
+FWL_ERR CFWL_MonthCalendarImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_MonthCalendarImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_MonthCalendarImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_MonthCalendarImp::GetWidgetRect(CFX_RectF& rect,
+                                             FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    CFX_SizeF fs = CalcSize(TRUE);
+    rect.Set(0, 0, fs.x, fs.y);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_MonthCalendarImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  GetCapValue();
+  if (!m_bInit) {
+    m_bInit = InitDate();
+  }
+  ClearDateItem();
+  ReSetDateItem();
+  LayOut();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_MonthCalendarImp::DrawWidget(CFX_Graphics* pGraphics,
+                                          const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (m_pProperties->m_pThemeProvider == NULL) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_MCD_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_MCD_Edge, pTheme, pMatrix);
+  }
+  DrawBkground(pGraphics, pTheme, pMatrix);
+  DrawHeadBK(pGraphics, pTheme, pMatrix);
+  DrawLButton(pGraphics, pTheme, pMatrix);
+  DrawRButton(pGraphics, pTheme, pMatrix);
+  DrawSeperator(pGraphics, pTheme, pMatrix);
+  DrawDatesInBK(pGraphics, pTheme, pMatrix);
+  DrawDatesInCircle(pGraphics, pTheme, pMatrix);
+  DrawCaption(pGraphics, pTheme, pMatrix);
+  DrawWeek(pGraphics, pTheme, pMatrix);
+  DrawDatesIn(pGraphics, pTheme, pMatrix);
+  DrawDatesOut(pGraphics, pTheme, pMatrix);
+  DrawToday(pGraphics, pTheme, pMatrix);
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
+    DrawWeekNumberSep(pGraphics, pTheme, pMatrix);
+    DrawWeekNumber(pGraphics, pTheme, pMatrix);
+  }
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_MonthCalendarImp::CountSelect() {
+  return m_arrSelDays.GetSize();
+}
+FX_BOOL CFWL_MonthCalendarImp::GetSelect(int32_t& iYear,
+                                         int32_t& iMonth,
+                                         int32_t& iDay,
+                                         int32_t nIndex) {
+  if (nIndex >= m_arrSelDays.GetSize()) {
+    return FALSE;
+  }
+  iYear = m_iCurYear;
+  iMonth = m_iCurMonth;
+  iDay = m_arrSelDays[nIndex];
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::SetSelect(int32_t iYear,
+                                         int32_t iMonth,
+                                         int32_t iDay) {
+  ChangeToMonth(iYear, iMonth);
+  return AddSelDay(iDay);
+}
+void CFWL_MonthCalendarImp::DrawBkground(CFX_Graphics* pGraphics,
+                                         IFWL_ThemeProvider* pTheme,
+                                         const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_Background;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_rtPart = m_rtClient;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawHeadBK(CFX_Graphics* pGraphics,
+                                       IFWL_ThemeProvider* pTheme,
+                                       const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_Header;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_rtPart = m_rtHead;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawLButton(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_LBtn;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = m_iLBtnPartStates;
+  params.m_rtPart = m_rtLBtn;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawRButton(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_RBtn;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = m_iRBtnPartStates;
+  params.m_rtPart = m_rtRBtn;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawCaption(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
+  CFWL_ThemeText textParam;
+  textParam.m_pWidget = m_pInterface;
+  textParam.m_iPart = FWL_PART_MCD_Caption;
+  textParam.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  textParam.m_pGraphics = pGraphics;
+  int32_t iYear;
+  int32_t iMonth;
+  iYear = m_iCurYear;
+  iMonth = m_iCurMonth;
+  CFX_WideString wsCation;
+  GetHeadText(iYear, iMonth, wsCation);
+  textParam.m_wsText = wsCation;
+  m_szHead = CalcTextSize(textParam.m_wsText, m_pProperties->m_pThemeProvider);
+  CalcHeadSize();
+  textParam.m_rtPart = m_rtHeadText;
+  textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+  textParam.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  if (pMatrix) {
+    textParam.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawText(&textParam);
+}
+void CFWL_MonthCalendarImp::DrawSeperator(CFX_Graphics* pGraphics,
+                                          IFWL_ThemeProvider* pTheme,
+                                          const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_HSeparator;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_rtPart = m_rtHSep;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawDatesInBK(CFX_Graphics* pGraphics,
+                                          IFWL_ThemeProvider* pTheme,
+                                          const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_DateInBK;
+  params.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  int32_t iCount = m_arrDates.GetSize();
+  for (int32_t j = 0; j < iCount; j++) {
+    FWL_DATEINFO* pDataInfo = (FWL_DATEINFO*)m_arrDates.GetAt(j);
+    if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Selected) {
+      params.m_dwStates |= FWL_PARTSTATE_MCD_Selected;
+      if (((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) ==
+           0) &&
+          pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
+        params.m_dwStates |= FWL_PARTSTATE_MCD_Flagged;
+      }
+      if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Focused) {
+        params.m_dwStates |= FWL_PARTSTATE_MCD_Focused;
+      }
+    } else if (j == m_iHovered - 1) {
+      params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered;
+    } else if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
+      params.m_dwStates = FWL_PARTSTATE_MCD_Flagged;
+      pTheme->DrawBackground(&params);
+    }
+    params.m_rtPart = pDataInfo->rect;
+    pTheme->DrawBackground(&params);
+    params.m_dwStates = 0;
+  }
+}
+void CFWL_MonthCalendarImp::DrawWeek(CFX_Graphics* pGraphics,
+                                     IFWL_ThemeProvider* pTheme,
+                                     const CFX_Matrix* pMatrix) {
+  CFWL_ThemeText params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_Week;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  CFX_RectF rtDayOfWeek;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  for (int32_t i = 0; i < 7; i++) {
+    rtDayOfWeek.Set(m_rtWeek.left + i * (m_szCell.x + MONTHCAL_HMARGIN * 2),
+                    m_rtWeek.top, m_szCell.x, m_szCell.y);
+    CFX_WideString* wsWeekDay = static_cast<CFX_WideString*>(
+        pTheme->GetCapacity(&params, i + FWL_MCCAPACITY_Sun));
+    params.m_rtPart = rtDayOfWeek;
+    params.m_wsText = *wsWeekDay;
+    params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+    pTheme->DrawText(&params);
+  }
+}
+void CFWL_MonthCalendarImp::DrawWeekNumber(CFX_Graphics* pGraphics,
+                                           IFWL_ThemeProvider* pTheme,
+                                           const CFX_Matrix* pMatrix) {
+  CFWL_ThemeText params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_WeekNum;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+  CFX_WideString wsWeekNum;
+  params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  int32_t iWeekNum = 0;
+  int32_t iMonthNum = m_pDateTime->GetMonth();
+  int32_t iDayNum = FX_DaysInMonth(m_iCurYear, iMonthNum);
+  int32_t iTemp = 0;
+  FX_FLOAT fVStartPos = m_rtClient.top + m_fHeadHei + m_fHSepHei;
+  FX_FLOAT fHStartPos = m_rtClient.left;
+  for (int32_t i = 1; i <= iDayNum; i += 7) {
+    iTemp++;
+    iWeekNum = CalWeekNumber(m_iCurYear, iMonthNum, i);
+    m_rtWeekNum.Set(fHStartPos, fVStartPos + m_fDateCellHei * iTemp,
+                    m_fWeekNumWid, m_fDateCellHei);
+    wsWeekNum.Format(L"%d", iWeekNum);
+    params.m_wsText = wsWeekNum;
+    params.m_rtPart = m_rtWeekNum;
+    pTheme->DrawText(&params);
+  }
+}
+void CFWL_MonthCalendarImp::DrawWeekNumberSep(CFX_Graphics* pGraphics,
+                                              IFWL_ThemeProvider* pTheme,
+                                              const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_WeekNumSep;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_rtPart = m_rtWeekNumSep;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawToday(CFX_Graphics* pGraphics,
+                                      IFWL_ThemeProvider* pTheme,
+                                      const CFX_Matrix* pMatrix) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) {
+    return;
+  }
+  CFWL_ThemeText params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_Today;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+  CFX_WideString* wsDay = static_cast<CFX_WideString*>(
+      pTheme->GetCapacity(&params, FWL_MCCAPACITY_Today));
+  CFX_WideString wsText;
+  GetTodayText(m_iYear, m_iMonth, m_iDay, wsText);
+  params.m_wsText = *wsDay + wsText;
+  m_szToday = CalcTextSize(params.m_wsText, m_pProperties->m_pThemeProvider);
+  CalcTodaySize();
+  params.m_rtPart = m_rtToday;
+  params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawText(&params);
+}
+void CFWL_MonthCalendarImp::DrawDatesIn(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
+  CFWL_ThemeText params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_DatesIn;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  int32_t iCount = m_arrDates.GetSize();
+  for (int32_t j = 0; j < iCount; j++) {
+    FWL_DATEINFO* pDataInfo = (FWL_DATEINFO*)m_arrDates.GetAt(j);
+    params.m_wsText = pDataInfo->wsDay;
+    params.m_rtPart = pDataInfo->rect;
+    params.m_dwStates = pDataInfo->dwStates;
+    if (j + 1 == m_iHovered) {
+      params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered;
+    }
+    params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+    pTheme->DrawText(&params);
+  }
+}
+void CFWL_MonthCalendarImp::DrawDatesOut(CFX_Graphics* pGraphics,
+                                         IFWL_ThemeProvider* pTheme,
+                                         const CFX_Matrix* pMatrix) {
+  CFWL_ThemeText params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_DatesOut;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawText(&params);
+}
+void CFWL_MonthCalendarImp::DrawDatesInCircle(CFX_Graphics* pGraphics,
+                                              IFWL_ThemeProvider* pTheme,
+                                              const CFX_Matrix* pMatrix) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) {
+    return;
+  }
+  if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear) {
+    return;
+  }
+  if (m_iDay < 1 || m_iDay > m_arrDates.GetSize()) {
+    return;
+  }
+  FWL_DATEINFO* pDate = (FWL_DATEINFO*)m_arrDates[m_iDay - 1];
+  if (!pDate)
+    return;
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_DateInCircle;
+  params.m_pGraphics = pGraphics;
+  params.m_rtPart = pDate->rect;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+void CFWL_MonthCalendarImp::DrawTodayCircle(CFX_Graphics* pGraphics,
+                                            IFWL_ThemeProvider* pTheme,
+                                            const CFX_Matrix* pMatrix) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) {
+    return;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) {
+    return;
+  }
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_MCD_TodayCircle;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
+  params.m_rtPart = m_rtTodayFlag;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&params);
+}
+CFX_SizeF CFWL_MonthCalendarImp::CalcSize(FX_BOOL bAutoSize) {
+  if (!m_pProperties->m_pThemeProvider)
+    return CFX_SizeF();
+
+  if (!bAutoSize) {
+    GetClientRect(m_rtClient);
+    return CFX_SizeF(m_rtClient.width, m_rtClient.height);
+  }
+
+  CFX_SizeF fs;
+  CFWL_ThemePart params;
+  params.m_pWidget = m_pInterface;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  CFX_WideString* wsText = NULL;
+  FX_FLOAT fMaxWeekW = 0.0f;
+  FX_FLOAT fMaxWeekH = 0.0f;
+  for (FX_DWORD week = FWL_MCCAPACITY_Sun; week <= FWL_MCCAPACITY_Sat; week++) {
+    wsText = static_cast<CFX_WideString*>(pTheme->GetCapacity(&params, week));
+    CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider);
+    fMaxWeekW = (fMaxWeekW >= sz.x) ? fMaxWeekW : sz.x;
+    fMaxWeekH = (fMaxWeekH >= sz.y) ? fMaxWeekH : sz.y;
+  }
+  FX_FLOAT fDayMaxW = 0.0f;
+  FX_FLOAT fDayMaxH = 0.0f;
+  for (int day = 10; day <= 31; day++) {
+    CFX_WideString wsDay;
+    wsDay.Format(L"%d", day);
+    CFX_SizeF sz = CalcTextSize(wsDay, m_pProperties->m_pThemeProvider);
+    fDayMaxW = (fDayMaxW >= sz.x) ? fDayMaxW : sz.x;
+    fDayMaxH = (fDayMaxH >= sz.y) ? fDayMaxH : sz.y;
+  }
+  m_szCell.x = FX_FLOAT((fMaxWeekW >= fDayMaxW) ? (int)(fMaxWeekW + 0.5)
+                                                : (int)(fDayMaxW + 0.5));
+  m_szCell.y = (fMaxWeekH >= fDayMaxH) ? fMaxWeekH : fDayMaxH;
+  fs.x = m_szCell.x * MONTHCAL_COLUMNS +
+         MONTHCAL_HMARGIN * MONTHCAL_COLUMNS * 2 +
+         MONTHCAL_HEADER_BTN_HMARGIN * 2;
+  FX_FLOAT fMonthMaxW = 0.0f;
+  FX_FLOAT fMonthMaxH = 0.0f;
+  for (FX_DWORD month = FWL_MCCAPACITY_January;
+       month <= FWL_MCCAPACITY_December; month++) {
+    wsText = static_cast<CFX_WideString*>(pTheme->GetCapacity(&params, month));
+    CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider);
+    fMonthMaxW = (fMonthMaxW >= sz.x) ? fMonthMaxW : sz.x;
+    fMonthMaxH = (fMonthMaxH >= sz.y) ? fMonthMaxH : sz.y;
+  }
+  CFX_WideString wsYear;
+  GetHeadText(m_iYear, m_iMonth, wsYear);
+  CFX_SizeF szYear = CalcTextSize(wsYear, m_pProperties->m_pThemeProvider);
+  fMonthMaxH = std::max(fMonthMaxH, szYear.y);
+  m_szHead = CFX_SizeF(fMonthMaxW + szYear.x, fMonthMaxH);
+  fMonthMaxW = m_szHead.x + MONTHCAL_HEADER_BTN_HMARGIN * 2 + m_szCell.x * 2;
+  fs.x = std::max(fs.x, fMonthMaxW);
+  CFX_WideString wsToday;
+  GetTodayText(m_iYear, m_iMonth, m_iDay, wsToday);
+  wsText = static_cast<CFX_WideString*>(
+      pTheme->GetCapacity(&params, FWL_MCCAPACITY_Today));
+  m_wsToday = *wsText + wsToday;
+  m_szToday = CalcTextSize(wsToday, m_pProperties->m_pThemeProvider);
+  m_szToday.y = (m_szToday.y >= m_szCell.y) ? m_szToday.y : m_szCell.y;
+  fs.y = m_szCell.x + m_szCell.y * (MONTHCAL_ROWS - 2) + m_szToday.y +
+         MONTHCAL_VMARGIN * MONTHCAL_ROWS * 2 + MONTHCAL_HEADER_BTN_VMARGIN * 4;
+  return fs;
+}
+
+void CFWL_MonthCalendarImp::CalcHeadSize() {
+  FX_FLOAT fHeadHMargin = (m_rtClient.width - m_szHead.x) / 2;
+  FX_FLOAT fHeadVMargin = (m_szCell.x - m_szHead.y) / 2;
+  m_rtHeadText.Set(m_rtClient.left + fHeadHMargin,
+                   m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN +
+                       MONTHCAL_VMARGIN + fHeadVMargin,
+                   m_szHead.x, m_szHead.y);
+}
+void CFWL_MonthCalendarImp::CalcTodaySize() {
+  m_rtTodayFlag.Set(
+      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
+      m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN,
+      m_szCell.x, m_szToday.y);
+  m_rtToday.Set(
+      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + m_szCell.x +
+          MONTHCAL_HMARGIN * 2,
+      m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN,
+      m_szToday.x, m_szToday.y);
+}
+void CFWL_MonthCalendarImp::LayOut() {
+  GetClientRect(m_rtClient);
+  {
+    m_rtHead.Set(
+        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, m_rtClient.top,
+        m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+        m_szCell.x + (MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN) * 2);
+    m_rtWeek.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
+                 m_rtHead.bottom(),
+                 m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+                 m_szCell.y + MONTHCAL_VMARGIN * 2);
+    m_rtLBtn.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
+                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
+                 m_szCell.x);
+    m_rtRBtn.Set(m_rtClient.left + m_rtClient.width -
+                     MONTHCAL_HEADER_BTN_HMARGIN - m_szCell.x,
+                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
+                 m_szCell.x);
+    m_rtHSep.Set(
+        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
+        m_rtWeek.bottom() - MONTHCAL_VMARGIN,
+        m_rtClient.width - (MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN) * 2,
+        MONTHCAL_HSEP_HEIGHT);
+    m_rtDates.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
+                  m_rtWeek.bottom(),
+                  m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+                  m_szCell.y * (MONTHCAL_ROWS - 3) +
+                      MONTHCAL_VMARGIN * (MONTHCAL_ROWS - 3) * 2);
+  }
+  CalDateItem();
+}
+void CFWL_MonthCalendarImp::CalDateItem() {
+  FX_BOOL bNewWeek = FALSE;
+  int32_t iWeekOfMonth = 0;
+  FX_FLOAT fLeft = m_rtDates.left;
+  FX_FLOAT fTop = m_rtDates.top;
+  int32_t iCount = m_arrDates.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(i);
+    if (bNewWeek) {
+      iWeekOfMonth++;
+      bNewWeek = FALSE;
+    }
+    pDateInfo->rect.Set(
+        fLeft + pDateInfo->iDayOfWeek * (m_szCell.x + (MONTHCAL_HMARGIN * 2)),
+        fTop + iWeekOfMonth * (m_szCell.y + (MONTHCAL_VMARGIN * 2)),
+        m_szCell.x + (MONTHCAL_HMARGIN * 2),
+        m_szCell.y + (MONTHCAL_VMARGIN * 2));
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
+      pDateInfo->rect.Offset(m_fWeekNumWid, 0);
+    }
+    if (pDateInfo->iDayOfWeek >= 6) {
+      bNewWeek = TRUE;
+    }
+  }
+}
+void CFWL_MonthCalendarImp::GetCapValue() {
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  CFWL_ThemePart part;
+  part.m_pWidget = m_pInterface;
+  m_fHeadWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_WIDTH));
+  m_fHeadHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_Height));
+  m_fHeadBtnWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH));
+  m_fHeadBtnHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT));
+  m_fHeadBtnHMargin = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN));
+  m_fHeadBtnVMargin = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN));
+  m_fHeadTextWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT));
+  m_fHeadTextHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT));
+  m_fHeadTextHMargin = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN));
+  m_fHeadTextVMargin = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN));
+  m_fHSepWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_WIDTH));
+  m_fHSepHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_HEIGHT));
+  m_fWeekNumWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH));
+  m_fSepDOffset = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_DOFFSET));
+  m_fSepX = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_X));
+  m_fSepY = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_Y));
+  m_fWeekNumHeigh = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT));
+  m_fWeekWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_WIDTH));
+  m_fWeekHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_HEIGHT));
+  m_fDateCellWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH));
+  m_fDateCellHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT));
+  m_fTodayWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_WIDHT));
+  m_fTodayHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_HEIGHT));
+  m_fTodayFlagWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT));
+  m_fMCWid = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WIDTH));
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
+    m_fMCWid += m_fWeekNumWid;
+  }
+  m_fMCHei = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEIGHT));
+}
+int32_t CFWL_MonthCalendarImp::CalWeekNumber(int32_t iYear,
+                                             int32_t iMonth,
+                                             int32_t iDay) {
+  return 0;
+}
+FX_BOOL CFWL_MonthCalendarImp::GetMinDate(int32_t& iYear,
+                                          int32_t& iMonth,
+                                          int32_t& iDay) {
+  iYear = m_dtMin.iYear;
+  iMonth = m_dtMin.iMonth;
+  iDay = m_dtMin.iDay;
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::SetMinDate(int32_t iYear,
+                                          int32_t iMonth,
+                                          int32_t iDay) {
+  m_dtMin = DATE(iYear, iMonth, iDay);
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::GetMaxDate(int32_t& iYear,
+                                          int32_t& iMonth,
+                                          int32_t& iDay) {
+  iYear = m_dtMax.iYear;
+  iMonth = m_dtMax.iMonth;
+  iDay = m_dtMax.iDay;
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::SetMaxDate(int32_t iYear,
+                                          int32_t iMonth,
+                                          int32_t iDay) {
+  m_dtMax = DATE(iYear, iMonth, iDay);
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::InitDate() {
+  if (m_pProperties->m_pDataProvider) {
+    IFWL_MonthCalendarDP* pDateProv =
+        static_cast<IFWL_MonthCalendarDP*>(m_pProperties->m_pDataProvider);
+    m_iYear = pDateProv->GetCurYear(m_pInterface);
+    m_iMonth = pDateProv->GetCurMonth(m_pInterface);
+    m_iDay = pDateProv->GetCurDay(m_pInterface);
+    m_iCurYear = m_iYear;
+    m_iCurMonth = m_iMonth;
+  } else {
+    m_iDay = 1;
+    m_iMonth = 1;
+    m_iYear = 1;
+    m_iCurYear = m_iYear;
+    m_iCurMonth = m_iMonth;
+  }
+  GetTodayText(m_iYear, m_iMonth, m_iDay, m_wsToday);
+  GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead);
+  m_dtMin = DATE(1500, 12, 1);
+  m_dtMax = DATE(2200, 1, 1);
+  return TRUE;
+}
+void CFWL_MonthCalendarImp::ClearDateItem() {
+  int32_t iCount = m_arrDates.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_DATEINFO* pData = (FWL_DATEINFO*)m_arrDates.GetAt(i);
+    delete pData;
+  }
+  m_arrDates.RemoveAll();
+}
+void CFWL_MonthCalendarImp::ReSetDateItem() {
+  m_pDateTime->Set(m_iCurYear, m_iCurMonth, 1);
+  int32_t iDays = FX_DaysInMonth(m_iCurYear, m_iCurMonth);
+  int32_t iDayOfWeek = m_pDateTime->GetDayOfWeek();
+  for (int32_t i = 0; i < iDays; i++) {
+    if (iDayOfWeek >= 7) {
+      iDayOfWeek = 0;
+    }
+    CFX_WideString wsDay;
+    wsDay.Format(L"%d", i + 1);
+    FX_DWORD dwStates = 0;
+    if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1)) {
+      dwStates |= FWL_ITEMSTATE_MCD_Flag;
+    }
+    if (m_arrSelDays.Find(i + 1) != -1) {
+      dwStates |= FWL_ITEMSTATE_MCD_Selected;
+    }
+    CFX_RectF rtDate;
+    rtDate.Set(0, 0, 0, 0);
+    m_arrDates.Add(
+        new FWL_DATEINFO(i + 1, iDayOfWeek, dwStates, rtDate, wsDay));
+    iDayOfWeek++;
+  }
+}
+FX_BOOL CFWL_MonthCalendarImp::NextMonth() {
+  int32_t iYear = m_iCurYear, iMonth = m_iCurMonth;
+  if (iMonth >= 12) {
+    iMonth = 1;
+    iYear++;
+  } else {
+    iMonth++;
+  }
+  DATE dt(m_iCurYear, m_iCurMonth, 1);
+  if (!(dt < m_dtMax)) {
+    return FALSE;
+  }
+  m_iCurYear = iYear, m_iCurMonth = iMonth;
+  ChangeToMonth(m_iCurYear, m_iCurMonth);
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::PrevMonth() {
+  int32_t iYear = m_iCurYear, iMonth = m_iCurMonth;
+  if (iMonth <= 1) {
+    iMonth = 12;
+    iYear--;
+  } else {
+    iMonth--;
+  }
+  DATE dt(m_iCurYear, m_iCurMonth, 1);
+  if (!(dt > m_dtMin)) {
+    return FALSE;
+  }
+  m_iCurYear = iYear, m_iCurMonth = iMonth;
+  ChangeToMonth(m_iCurYear, m_iCurMonth);
+  return TRUE;
+}
+void CFWL_MonthCalendarImp::ChangeToMonth(int32_t iYear, int32_t iMonth) {
+  m_iCurYear = iYear;
+  m_iCurMonth = iMonth;
+  m_iHovered = -1;
+  ClearDateItem();
+  ReSetDateItem();
+  CalDateItem();
+  GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead);
+}
+FX_BOOL CFWL_MonthCalendarImp::RemoveSelDay(int32_t iDay, FX_BOOL bAll) {
+  if (iDay == -1 && !bAll) {
+    return FALSE;
+  }
+  if (bAll) {
+    int32_t iCount = m_arrSelDays.GetSize();
+    int32_t iDatesCount = m_arrDates.GetSize();
+    for (int32_t i = 0; i < iCount; i++) {
+      int32_t iSelDay = m_arrSelDays.GetAt(i);
+      if (iSelDay <= iDatesCount) {
+        FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iSelDay - 1);
+        pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
+      }
+    }
+    m_arrSelDays.RemoveAll();
+  } else {
+    int32_t index = m_arrSelDays.Find(iDay);
+    if (index == -1) {
+      return FALSE;
+    }
+    int32_t iSelDay = m_arrSelDays.GetAt(iDay);
+    int32_t iDatesCount = m_arrDates.GetSize();
+    if (iSelDay <= iDatesCount) {
+      FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iSelDay - 1);
+      pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
+    }
+    m_arrSelDays.RemoveAt(index);
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::AddSelDay(int32_t iDay) {
+  FXSYS_assert(iDay > 0);
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+  } else {
+    if (m_arrSelDays.Find(iDay) == -1) {
+      RemoveSelDay(-1, TRUE);
+      if (iDay <= m_arrDates.GetSize()) {
+        FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iDay - 1);
+        pDateInfo->dwStates |= FWL_ITEMSTATE_MCD_Selected;
+      }
+      m_arrSelDays.Add(iDay);
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarImp::JumpToToday() {
+  if (m_iYear != m_iCurYear || m_iMonth != m_iCurMonth) {
+    m_iCurYear = m_iYear;
+    m_iCurMonth = m_iMonth;
+    ChangeToMonth(m_iYear, m_iMonth);
+    AddSelDay(m_iDay);
+  } else {
+    if (m_arrSelDays.Find(m_iDay) == -1) {
+      AddSelDay(m_iDay);
+    }
+  }
+  return TRUE;
+}
+void CFWL_MonthCalendarImp::GetHeadText(int32_t iYear,
+                                        int32_t iMonth,
+                                        CFX_WideString& wsHead) {
+  FXSYS_assert(iMonth > 0 && iMonth < 13);
+  static const FX_WCHAR* const pMonth[] = {
+      L"January",   L"February", L"March",    L"April",
+      L"May",       L"June",     L"July",     L"August",
+      L"September", L"October",  L"November", L"December"};
+  wsHead.Format(L"%s, %d", pMonth[iMonth - 1], iYear);
+}
+void CFWL_MonthCalendarImp::GetTodayText(int32_t iYear,
+                                         int32_t iMonth,
+                                         int32_t iDay,
+                                         CFX_WideString& wsToday) {
+  wsToday.Format(L", %d/%d/%d", iDay, iMonth, iYear);
+}
+int32_t CFWL_MonthCalendarImp::GetDayAtPoint(FX_FLOAT x, FX_FLOAT y) {
+  int32_t iCount = m_arrDates.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(i);
+    if (pDateInfo->rect.Contains(x, y)) {
+      return ++i;
+    }
+  }
+  return -1;
+}
+FX_BOOL CFWL_MonthCalendarImp::GetDayRect(int32_t iDay, CFX_RectF& rtDay) {
+  if (iDay <= 0 || iDay > m_arrDates.GetSize()) {
+    return FALSE;
+  }
+  FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates[iDay - 1];
+  if (!pDateInfo)
+    return FALSE;
+  rtDay = pDateInfo->rect;
+  return TRUE;
+}
+CFWL_MonthCalendarImpDelegate::CFWL_MonthCalendarImpDelegate(
+    CFWL_MonthCalendarImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_MonthCalendarImpDelegate::OnProcessMessage(
+    CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  int32_t iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMouse->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMouse);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMouse);
+          break;
+        }
+        default: { break; }
+      }
+      break;
+    }
+    default: {
+      iRet = 0;
+      break;
+    }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_MonthCalendarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                    const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+
+void CFWL_MonthCalendarImpDelegate::OnActivate(CFWL_Message* pMsg) {}
+
+void CFWL_MonthCalendarImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                                   FX_BOOL bSet) {
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_MonthCalendarImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed;
+    m_pOwner->PrevMonth();
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed;
+    m_pOwner->NextMonth();
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
+        0) {
+      m_pOwner->JumpToToday();
+      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    }
+  } else {
+    if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+    } else {
+      int32_t iOldSel = 0;
+      if (m_pOwner->m_arrSelDays.GetSize() > 0) {
+        iOldSel = m_pOwner->m_arrSelDays[0];
+      } else {
+        return;
+      }
+      int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+      FX_BOOL bSelChanged = iCurSel > 0 && iCurSel != iOldSel;
+      if (bSelChanged) {
+        FWL_DATEINFO* lpDatesInfo =
+            (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+        CFX_RectF rtInvalidate(lpDatesInfo->rect);
+        if (iOldSel > 0) {
+          lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+          rtInvalidate.Union(lpDatesInfo->rect);
+        }
+        m_pOwner->AddSelDay(iCurSel);
+        CFWL_EvtClick wmClick;
+        wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
+        m_pOwner->DispatchEvent(&wmClick);
+        CFWL_EventMcdDateChanged wmDateSelected;
+        wmDateSelected.m_iStartDay = iCurSel;
+        wmDateSelected.m_iEndDay = iCurSel;
+        wmDateSelected.m_iOldMonth = m_pOwner->m_iCurMonth;
+        wmDateSelected.m_iOldYear = m_pOwner->m_iCurYear;
+        wmDateSelected.m_pSrcTarget = m_pOwner->m_pInterface;
+        m_pOwner->DispatchEvent(&wmDateSelected);
+        m_pOwner->Repaint(&rtInvalidate);
+      }
+    }
+  }
+}
+void CFWL_MonthCalendarImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iLBtnPartStates = 0;
+    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
+  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_iRBtnPartStates = 0;
+    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
+  } else if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iDay = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    if (iDay != -1) {
+      m_pOwner->AddSelDay(iDay);
+    }
+  }
+}
+void CFWL_MonthCalendarImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+    return;
+  }
+  FX_BOOL bRepaint = FALSE;
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, 0, 0);
+  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    bRepaint = m_pOwner->m_iHovered != iHover;
+    if (bRepaint) {
+      if (m_pOwner->m_iHovered > 0) {
+        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
+      }
+      if (iHover > 0) {
+        CFX_RectF rtDay;
+        m_pOwner->GetDayRect(iHover, rtDay);
+        if (rtInvalidate.IsEmpty()) {
+          rtInvalidate = rtDay;
+        } else {
+          rtInvalidate.Union(rtDay);
+        }
+      }
+    }
+    m_pOwner->m_iHovered = iHover;
+  } else {
+    bRepaint = m_pOwner->m_iHovered > 0;
+    if (bRepaint) {
+      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
+    }
+    m_pOwner->m_iHovered = -1;
+  }
+  if (bRepaint && !rtInvalidate.IsEmpty()) {
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+void CFWL_MonthCalendarImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_iHovered > 0) {
+    CFX_RectF rtInvalidate;
+    rtInvalidate.Set(0, 0, 0, 0);
+    m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
+    m_pOwner->m_iHovered = -1;
+    if (!rtInvalidate.IsEmpty()) {
+      m_pOwner->Repaint(&rtInvalidate);
+    }
+  }
+}
diff --git a/xfa/fwl/basewidget/fwl_monthcalendarimp.h b/xfa/fwl/basewidget/fwl_monthcalendarimp.h
new file mode 100644
index 0000000..c9542cb
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_monthcalendarimp.h
@@ -0,0 +1,243 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
+
+#include "xfa/fgas/localization/fgas_datetime.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_MonthCalendarImpDelegate;
+
+extern uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
+
+class CFWL_MonthCalendarImp : public CFWL_WidgetImp {
+ public:
+  CFWL_MonthCalendarImp(const CFWL_WidgetImpProperties& properties,
+                        IFWL_Widget* pOuter);
+  ~CFWL_MonthCalendarImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual int32_t CountSelect();
+  virtual FX_BOOL GetSelect(int32_t& iYear,
+                            int32_t& iMonth,
+                            int32_t& iDay,
+                            int32_t nIndex = 0);
+  virtual FX_BOOL SetSelect(int32_t iYear, int32_t iMonth, int32_t iDay);
+
+ protected:
+  struct DATE {
+    DATE() : iYear(0), iMonth(0), iDay(0) {}
+    DATE(int32_t year, int32_t month, int32_t day)
+        : iYear(year), iMonth(month), iDay(day) {}
+    FX_BOOL operator<(const DATE& right) {
+      if (iYear < right.iYear) {
+        return TRUE;
+      } else if (iYear == right.iYear) {
+        if (iMonth < right.iMonth) {
+          return TRUE;
+        } else if (iMonth == right.iMonth) {
+          return iDay < right.iDay;
+        }
+      }
+      return FALSE;
+    }
+    FX_BOOL operator>(const DATE& right) {
+      if (iYear > right.iYear) {
+        return TRUE;
+      } else if (iYear == right.iYear) {
+        if (iMonth > right.iMonth) {
+          return TRUE;
+        } else if (iMonth == right.iMonth) {
+          return iDay > right.iDay;
+        }
+      }
+      return FALSE;
+    }
+    int32_t iYear;
+    int32_t iMonth;
+    int32_t iDay;
+  };
+
+  void DrawBkground(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix);
+  void DrawHeadBK(CFX_Graphics* pGraphics,
+                  IFWL_ThemeProvider* pTheme,
+                  const CFX_Matrix* pMatrix);
+  void DrawLButton(CFX_Graphics* pGraphics,
+                   IFWL_ThemeProvider* pTheme,
+                   const CFX_Matrix* pMatrix);
+  void DrawRButton(CFX_Graphics* pGraphics,
+                   IFWL_ThemeProvider* pTheme,
+                   const CFX_Matrix* pMatrix);
+  void DrawCaption(CFX_Graphics* pGraphics,
+                   IFWL_ThemeProvider* pTheme,
+                   const CFX_Matrix* pMatrix);
+  void DrawSeperator(CFX_Graphics* pGraphics,
+                     IFWL_ThemeProvider* pTheme,
+                     const CFX_Matrix* pMatrix);
+  void DrawDatesInBK(CFX_Graphics* pGraphics,
+                     IFWL_ThemeProvider* pTheme,
+                     const CFX_Matrix* pMatrix);
+  void DrawWeek(CFX_Graphics* pGraphics,
+                IFWL_ThemeProvider* pTheme,
+                const CFX_Matrix* pMatrix);
+  void DrawWeekNumber(CFX_Graphics* pGraphics,
+                      IFWL_ThemeProvider* pTheme,
+                      const CFX_Matrix* pMatrix);
+  void DrawWeekNumberSep(CFX_Graphics* pGraphics,
+                         IFWL_ThemeProvider* pTheme,
+                         const CFX_Matrix* pMatrix);
+  void DrawToday(CFX_Graphics* pGraphics,
+                 IFWL_ThemeProvider* pTheme,
+                 const CFX_Matrix* pMatrix);
+  void DrawDatesIn(CFX_Graphics* pGraphics,
+                   IFWL_ThemeProvider* pTheme,
+                   const CFX_Matrix* pMatrix);
+  void DrawDatesOut(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix);
+  void DrawDatesInCircle(CFX_Graphics* pGraphics,
+                         IFWL_ThemeProvider* pTheme,
+                         const CFX_Matrix* pMatrix);
+  void DrawTodayCircle(CFX_Graphics* pGraphics,
+                       IFWL_ThemeProvider* pTheme,
+                       const CFX_Matrix* pMatrix);
+  CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE);
+  void LayOut();
+  void CalcHeadSize();
+  void CalcTodaySize();
+  void CalDateItem();
+  void GetCapValue();
+  int32_t CalWeekNumber(int32_t iYear, int32_t iMonth, int32_t iDay);
+  FX_BOOL GetMinDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
+  FX_BOOL SetMinDate(int32_t iYear, int32_t iMonth, int32_t iDay);
+  FX_BOOL GetMaxDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
+  FX_BOOL SetMaxDate(int32_t iYear, int32_t iMonth, int32_t iDay);
+  FX_BOOL InitDate();
+  void ClearDateItem();
+  void ReSetDateItem();
+  FX_BOOL NextMonth();
+  FX_BOOL PrevMonth();
+  void ChangeToMonth(int32_t iYear, int32_t iMonth);
+  FX_BOOL RemoveSelDay(int32_t iDay, FX_BOOL bAll = FALSE);
+  FX_BOOL AddSelDay(int32_t iDay);
+  FX_BOOL JumpToToday();
+  void GetHeadText(int32_t iYear, int32_t iMonth, CFX_WideString& wsHead);
+  void GetTodayText(int32_t iYear,
+                    int32_t iMonth,
+                    int32_t iDay,
+                    CFX_WideString& wsToday);
+  int32_t GetDayAtPoint(FX_FLOAT x, FX_FLOAT y);
+  FX_BOOL GetDayRect(int32_t iDay, CFX_RectF& rtDay);
+
+  FX_BOOL m_bInit;
+  CFX_RectF m_rtHead;
+  CFX_RectF m_rtWeek;
+  CFX_RectF m_rtLBtn;
+  CFX_RectF m_rtRBtn;
+  CFX_RectF m_rtDates;
+  CFX_RectF m_rtHSep;
+  CFX_RectF m_rtHeadText;
+  CFX_RectF m_rtToday;
+  CFX_RectF m_rtTodayFlag;
+  CFX_RectF m_rtWeekNum;
+  CFX_RectF m_rtWeekNumSep;
+  CFX_RectF m_rtTemp;
+  CFX_WideString m_wsHead;
+  CFX_WideString m_wsToday;
+  CFX_DateTime* m_pDateTime;
+  CFX_PtrArray m_arrDates;
+  int32_t m_iCurYear;
+  int32_t m_iCurMonth;
+  int32_t m_iYear;
+  int32_t m_iMonth;
+  int32_t m_iDay;
+  int32_t m_iHovered;
+  int32_t m_iLBtnPartStates;
+  int32_t m_iRBtnPartStates;
+  DATE m_dtMin;
+  DATE m_dtMax;
+  CFX_SizeF m_szHead;
+  CFX_SizeF m_szCell;
+  CFX_SizeF m_szToday;
+  CFX_ArrayTemplate<int32_t> m_arrSelDays;
+  int32_t m_iMaxSel;
+  CFX_RectF m_rtClient;
+  FX_FLOAT m_fHeadWid;
+  FX_FLOAT m_fHeadHei;
+  FX_FLOAT m_fHeadBtnWid;
+  FX_FLOAT m_fHeadBtnHei;
+  FX_FLOAT m_fHeadBtnHMargin;
+  FX_FLOAT m_fHeadBtnVMargin;
+  FX_FLOAT m_fHeadTextWid;
+  FX_FLOAT m_fHeadTextHei;
+  FX_FLOAT m_fHeadTextHMargin;
+  FX_FLOAT m_fHeadTextVMargin;
+  FX_FLOAT m_fHSepWid;
+  FX_FLOAT m_fHSepHei;
+  FX_FLOAT m_fWeekNumWid;
+  FX_FLOAT m_fSepDOffset;
+  FX_FLOAT m_fSepX;
+  FX_FLOAT m_fSepY;
+  FX_FLOAT m_fWeekNumHeigh;
+  FX_FLOAT m_fWeekWid;
+  FX_FLOAT m_fWeekHei;
+  FX_FLOAT m_fDateCellWid;
+  FX_FLOAT m_fDateCellHei;
+  FX_FLOAT m_fTodayWid;
+  FX_FLOAT m_fTodayHei;
+  FX_FLOAT m_fTodayFlagWid;
+  FX_FLOAT m_fMCWid;
+  FX_FLOAT m_fMCHei;
+  friend class CFWL_MonthCalendarImpDelegate;
+};
+
+struct FWL_DATEINFO {
+  FWL_DATEINFO(int32_t day,
+               int32_t dayofweek,
+               FX_DWORD dwSt,
+               CFX_RectF rc,
+               CFX_WideString& wsday)
+      : iDay(day),
+        iDayOfWeek(dayofweek),
+        dwStates(dwSt),
+        rect(rc),
+        wsDay(wsday) {}
+  int32_t iDay;
+  int32_t iDayOfWeek;
+  FX_DWORD dwStates;
+  CFX_RectF rect;
+  CFX_WideString wsDay;
+};
+
+class CFWL_MonthCalendarImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_MonthCalendarImpDelegate(CFWL_MonthCalendarImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnActivate(CFWL_Message* pMsg);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  CFWL_MonthCalendarImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_pictureboximp.cpp b/xfa/fwl/basewidget/fwl_pictureboximp.cpp
new file mode 100644
index 0000000..a9dd440
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_pictureboximp.cpp
@@ -0,0 +1,151 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_pictureboximp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/lightwidget/picturebox.h"
+
+// static
+IFWL_PictureBox* IFWL_PictureBox::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_PictureBox* pPictureBox = new IFWL_PictureBox;
+  CFWL_PictureBoxImp* pPictureBoxImpl =
+      new CFWL_PictureBoxImp(properties, pOuter);
+  pPictureBox->SetImpl(pPictureBoxImpl);
+  pPictureBoxImpl->SetInterface(pPictureBox);
+  return pPictureBox;
+}
+IFWL_PictureBox::IFWL_PictureBox() {}
+
+CFWL_PictureBoxImp::CFWL_PictureBoxImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_bTop(FALSE),
+      m_bVCenter(FALSE),
+      m_bButton(FALSE) {
+  m_rtClient.Reset();
+  m_rtImage.Reset();
+  m_matrix.SetIdentity();
+}
+CFWL_PictureBoxImp::~CFWL_PictureBoxImp() {}
+FWL_ERR CFWL_PictureBoxImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_PictureBox;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_PictureBoxImp::GetClassID() const {
+  return FWL_CLASSHASH_PictureBox;
+}
+FWL_ERR CFWL_PictureBoxImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_PictureBoxImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PictureBoxImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_PictureBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (!m_pProperties->m_pDataProvider)
+      return FWL_ERR_Indefinite;
+    CFX_DIBitmap* pBitmap =
+        static_cast<IFWL_PictureBoxDP*>(m_pProperties->m_pDataProvider)
+            ->GetPicture(m_pInterface);
+    if (pBitmap) {
+      rect.Set(0, 0, (FX_FLOAT)pBitmap->GetWidth(),
+               (FX_FLOAT)pBitmap->GetHeight());
+    }
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PictureBoxImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Succeeded;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  GetClientRect(m_rtClient);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PictureBoxImp::DrawWidget(CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_PTB_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_PTB_Edge, pTheme, pMatrix);
+  }
+  DrawBkground(pGraphics, pTheme, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_PictureBoxImp::DrawBkground(CFX_Graphics* pGraphics,
+                                      IFWL_ThemeProvider* pTheme,
+                                      const CFX_Matrix* pMatrix) {
+  IFWL_PictureBoxDP* pPictureDP =
+      static_cast<IFWL_PictureBoxDP*>(m_pProperties->m_pDataProvider);
+  if (!pPictureDP)
+    return;
+
+  CFX_DIBitmap* pPicture = pPictureDP->GetPicture(m_pInterface);
+  CFX_Matrix matrix;
+  pPictureDP->GetMatrix(m_pInterface, matrix);
+  if (!pPicture)
+    return;
+
+  matrix.Concat(*pMatrix);
+  FX_FLOAT fx = (FX_FLOAT)pPicture->GetWidth();
+  FX_FLOAT fy = (FX_FLOAT)pPicture->GetHeight();
+  if (fx > m_rtClient.width) {
+    fx = m_rtClient.width;
+  }
+  if (fy > m_rtClient.height) {
+    fy = m_rtClient.height;
+  }
+  pGraphics->DrawImage(pPicture, CFX_PointF((m_rtClient.width - fx) / 2,
+                                            (m_rtClient.height - fy) / 2),
+                       &matrix);
+}
+FX_BOOL CFWL_PictureBoxImp::VStyle(FX_BOOL dwStyle) {
+  switch (dwStyle & FWL_STYLEEXT_PTB_VAlignMask) {
+    case FWL_STYLEEXT_PTB_Top: {
+      return m_bTop = TRUE;
+      break;
+    }
+    case FWL_STYLEEXT_PTB_Vcenter: {
+      return m_bVCenter = TRUE;
+      break;
+    }
+    case FWL_STYLEEXT_PTB_Bottom: {
+      return m_bButton = TRUE;
+      break;
+    }
+  }
+  return FALSE;
+}
+CFWL_PictureBoxImpDelegate::CFWL_PictureBoxImpDelegate(
+    CFWL_PictureBoxImp* pOwner)
+    : m_pOwner(pOwner) {}
+FWL_ERR CFWL_PictureBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                 const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fwl/basewidget/fwl_pictureboximp.h b/xfa/fwl/basewidget/fwl_pictureboximp.h
new file mode 100644
index 0000000..c848e98
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_pictureboximp.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_PictureBoxImpDelegate;
+
+class CFWL_PictureBoxImp : public CFWL_WidgetImp {
+ public:
+  CFWL_PictureBoxImp(const CFWL_WidgetImpProperties& properties,
+                     IFWL_Widget* pOuter);
+  ~CFWL_PictureBoxImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  void DrawBkground(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix = NULL);
+  FX_BOOL VStyle(FX_BOOL dwStyle);
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtImage;
+  CFX_Matrix m_matrix;
+  FX_BOOL m_bTop;
+  FX_BOOL m_bVCenter;
+  FX_BOOL m_bButton;
+  friend class CFWL_PictureBoxImpDelegate;
+};
+class CFWL_PictureBoxImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_PictureBoxImpDelegate(CFWL_PictureBoxImp* pOwner);
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  CFWL_PictureBoxImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_pushbuttonimp.cpp b/xfa/fwl/basewidget/fwl_pushbuttonimp.cpp
new file mode 100644
index 0000000..ac0055b
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_pushbuttonimp.cpp
@@ -0,0 +1,550 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_pushbuttonimp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_pushbutton.h"
+
+// static
+IFWL_PushButton* IFWL_PushButton::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_PushButton* pPushButton = new IFWL_PushButton;
+  CFWL_PushButtonImp* pPushButtonImpl =
+      new CFWL_PushButtonImp(properties, pOuter);
+  pPushButton->SetImpl(pPushButtonImpl);
+  pPushButtonImpl->SetInterface(pPushButton);
+  return pPushButton;
+}
+IFWL_PushButton::IFWL_PushButton() {}
+
+CFWL_PushButtonImp::CFWL_PushButtonImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_bBtnDown(FALSE),
+      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
+      m_iTTOAlign(FDE_TTOALIGNMENT_Center) {
+  m_rtClient.Set(0, 0, 0, 0);
+  m_rtCaption.Set(0, 0, 0, 0);
+}
+CFWL_PushButtonImp::~CFWL_PushButtonImp() {}
+FWL_ERR CFWL_PushButtonImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_PushButton;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_PushButtonImp::GetClassID() const {
+  return FWL_CLASSHASH_PushButton;
+}
+FWL_ERR CFWL_PushButtonImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_PushButtonImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PushButtonImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_PushButtonImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (m_pProperties->m_pThemeProvider == NULL) {
+      m_pProperties->m_pThemeProvider = GetAvailableTheme();
+    }
+    CFX_WideString wsCaption;
+    IFWL_PushButtonDP* pData =
+        static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
+    if (pData) {
+      pData->GetCaption(m_pInterface, wsCaption);
+    }
+    int32_t iLen = wsCaption.GetLength();
+    if (iLen > 0) {
+      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
+      rect.Set(0, 0, sz.x, sz.y);
+    }
+    FX_FLOAT* fcaption =
+        static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin));
+    rect.Inflate(*fcaption, *fcaption);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PushButtonImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  if ((dwStates & FWL_WGTSTATE_Disabled) && bSet) {
+    m_pProperties->m_dwStates = FWL_WGTSTATE_Disabled;
+    return FWL_ERR_Succeeded;
+  }
+  return CFWL_WidgetImp::SetStates(dwStates, bSet);
+}
+FWL_ERR CFWL_PushButtonImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  UpdateTextOutStyles();
+  GetClientRect(m_rtClient);
+  m_rtCaption = m_rtClient;
+  FX_FLOAT* fcaption =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin));
+  m_rtCaption.Inflate(-*fcaption, -*fcaption);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PushButtonImp::DrawWidget(CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_PushButtonDP* pData =
+      static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
+  CFX_DIBitmap* pPicture = NULL;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_PSB_Border, m_pProperties->m_pThemeProvider,
+               pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_PSB_Edge, m_pProperties->m_pThemeProvider,
+             pMatrix);
+  }
+  DrawBkground(pGraphics, m_pProperties->m_pThemeProvider, pMatrix);
+  CFX_Matrix matrix;
+  matrix.Concat(*pMatrix);
+  FX_FLOAT iPicwidth = 0;
+  FX_FLOAT ipicheight = 0;
+  CFX_WideString wsCaption;
+  if (pData) {
+    pData->GetCaption(m_pInterface, wsCaption);
+  }
+  CFX_RectF rtText;
+  rtText.Set(0, 0, 0, 0);
+  if (!wsCaption.IsEmpty()) {
+    CalcTextRect(wsCaption, pTheme, 0, m_iTTOAlign, rtText);
+  }
+  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_PSB_ModeMask) {
+    case FWL_STYLEEXT_PSB_TextOnly:
+      DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix);
+      break;
+    case FWL_STYLEEXT_PSB_IconOnly:
+      if (pData) {
+        pPicture = pData->GetPicture(m_pInterface);
+      }
+      if (pPicture) {
+        CFX_PointF point;
+        switch (m_iTTOAlign) {
+          case 0: {
+            point.x = m_rtClient.left;
+            point.y = m_rtClient.top;
+            break;
+          }
+          case 1: {
+            point.x = m_rtClient.left +
+                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
+            point.y = m_rtClient.top;
+            break;
+          }
+          case 2:
+            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
+            point.y = m_rtClient.top;
+            break;
+          case 4:
+            point.x = m_rtClient.left;
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            break;
+          case 5:
+            point.x = m_rtClient.left +
+                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            break;
+          case 6:
+            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            break;
+          case 8:
+            point.x = m_rtClient.left;
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            break;
+          case 9:
+            point.x = m_rtClient.left +
+                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            break;
+          case 10:
+            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            break;
+        }
+        pGraphics->DrawImage(pPicture, point, &matrix);
+      }
+      break;
+    case FWL_STYLEEXT_PSB_TextIcon:
+      if (pPicture) {
+        CFX_PointF point;
+        switch (m_iTTOAlign) {
+          case 0: {
+            point.x = m_rtClient.left;
+            point.y = m_rtClient.top;
+            iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7);
+            ipicheight =
+                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
+            break;
+          }
+          case 1: {
+            point.x =
+                m_rtClient.left + (m_rtClient.width / 2 -
+                                   (pPicture->GetWidth() + rtText.width) / 2);
+            point.y = m_rtClient.top;
+            iPicwidth = pPicture->GetWidth() -
+                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
+                        rtText.width / 2 - 7;
+            ipicheight =
+                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
+            break;
+          }
+          case 2:
+            point.x = m_rtClient.left + m_rtClient.width -
+                      pPicture->GetWidth() - rtText.width;
+            point.y = m_rtClient.top;
+            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
+                        pPicture->GetWidth() - rtText.width + 7;
+            ipicheight =
+                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
+            break;
+          case 4:
+            point.x = m_rtClient.left;
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            iPicwidth = m_rtClient.left + pPicture->GetWidth() - 7;
+            break;
+          case 5:
+            point.x =
+                m_rtClient.left + (m_rtClient.width / 2 -
+                                   (pPicture->GetWidth() + rtText.width) / 2);
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            iPicwidth = pPicture->GetWidth() -
+                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
+                        rtText.width / 2 - 7;
+            break;
+          case 6:
+            point.x = m_rtClient.left + m_rtClient.width -
+                      pPicture->GetWidth() - rtText.width;
+            point.y = m_rtClient.top + m_rtClient.height / 2 -
+                      pPicture->GetHeight() / 2;
+            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
+                        pPicture->GetWidth() - rtText.width + 7;
+            break;
+          case 8:
+            point.x = m_rtClient.left;
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7);
+            ipicheight -= rtText.height / 2;
+            break;
+          case 9:
+            point.x =
+                m_rtClient.left + (m_rtClient.width / 2 -
+                                   (pPicture->GetWidth() + rtText.width) / 2);
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            iPicwidth = pPicture->GetWidth() -
+                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
+                        rtText.width / 2 - 7;
+            ipicheight -= rtText.height / 2;
+            break;
+          case 10:
+            point.x = m_rtClient.left + m_rtClient.width -
+                      pPicture->GetWidth() - rtText.width;
+            point.y =
+                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
+            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
+                        pPicture->GetWidth() - rtText.width + 7;
+            ipicheight -= rtText.height / 2;
+            break;
+        }
+        pGraphics->DrawImage(pPicture, point, &matrix);
+      }
+      matrix.e += m_rtClient.left + iPicwidth;
+      matrix.f += m_rtClient.top + ipicheight;
+      DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix);
+      break;
+  }
+  return FWL_ERR_Succeeded;
+}
+void CFWL_PushButtonImp::DrawBkground(CFX_Graphics* pGraphics,
+                                      IFWL_ThemeProvider* pTheme,
+                                      const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_PSB_Background;
+  param.m_dwStates = GetPartStates();
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  param.m_rtPart = m_rtClient;
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    param.m_pData = &m_rtCaption;
+  }
+  pTheme->DrawBackground(&param);
+}
+void CFWL_PushButtonImp::DrawText(CFX_Graphics* pGraphics,
+                                  IFWL_ThemeProvider* pTheme,
+                                  const CFX_Matrix* pMatrix) {
+  if (!m_pProperties->m_pDataProvider)
+    return;
+  CFX_WideString wsCaption;
+  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
+  if (wsCaption.IsEmpty()) {
+    return;
+  }
+  CFWL_ThemeText param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_PSB_Caption;
+  param.m_dwStates = GetPartStates();
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  param.m_rtPart = m_rtCaption;
+  param.m_wsText = wsCaption;
+  param.m_dwTTOStyles = m_dwTTOStyles;
+  param.m_iTTOAlign = m_iTTOAlign;
+  pTheme->DrawText(&param);
+}
+FX_DWORD CFWL_PushButtonImp::GetPartStates() {
+  FX_DWORD dwStates = FWL_PARTSTATE_PSB_Normal;
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    dwStates |= FWL_PARTSTATE_PSB_Focused;
+  }
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+    dwStates = FWL_PARTSTATE_PSB_Disabled;
+  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
+    dwStates |= FWL_PARTSTATE_PSB_Pressed;
+  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
+    dwStates |= FWL_PARTSTATE_PSB_Hovered;
+  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Default) {
+    dwStates |= FWL_PARTSTATE_PSB_Default;
+  }
+  return dwStates;
+}
+void CFWL_PushButtonImp::UpdateTextOutStyles() {
+  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  switch (m_pProperties->m_dwStyleExes &
+          (FWL_STYLEEXT_PSB_HLayoutMask | FWL_STYLEEXT_PSB_VLayoutMask)) {
+    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Top: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_TopRight;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_VCenter: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter;
+      break;
+    }
+    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Bottom: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight;
+      break;
+    }
+    default: {}
+  }
+  m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
+  }
+}
+CFWL_PushButtonImpDelegate::CFWL_PushButtonImpDelegate(
+    CFWL_PushButtonImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_PushButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  if (!m_pOwner->IsEnabled()) {
+    return 1;
+  }
+  int32_t iRet = 1;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
+      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
+        OnKeyDown(pKey);
+      }
+      break;
+    }
+    default: {
+      iRet = 0;
+      break;
+    }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_PushButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PushButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                 const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_PushButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                                FX_BOOL bSet) {
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_PushButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
+    m_pOwner->SetFocus(TRUE);
+  }
+  m_pOwner->m_bBtnDown = TRUE;
+  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_PushButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_pOwner->m_bBtnDown = FALSE;
+  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+  }
+  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    CFWL_EvtClick wmClick;
+    wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
+    m_pOwner->DispatchEvent(&wmClick);
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_PushButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  FX_BOOL bRepaint = FALSE;
+  if (m_pOwner->m_bBtnDown) {
+    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) == 0) {
+        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
+        bRepaint = TRUE;
+      }
+      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
+        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+        bRepaint = TRUE;
+      }
+    } else {
+      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
+        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+        bRepaint = TRUE;
+      }
+      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
+        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+        bRepaint = TRUE;
+      }
+    }
+  } else {
+    if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      return;
+    }
+    if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
+      m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+      bRepaint = TRUE;
+    }
+  }
+  if (bRepaint) {
+    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  }
+}
+void CFWL_PushButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  m_pOwner->m_bBtnDown = FALSE;
+  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_PushButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (pMsg->m_dwKeyCode == FWL_VKEY_Return) {
+    CFWL_EvtMouse wmMouse;
+    wmMouse.m_pSrcTarget = m_pOwner->m_pInterface;
+    wmMouse.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
+    m_pOwner->DispatchEvent(&wmMouse);
+    CFWL_EvtClick wmClick;
+    wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
+    m_pOwner->DispatchEvent(&wmClick);
+    return;
+  }
+  if (pMsg->m_dwKeyCode != FWL_VKEY_Tab) {
+    return;
+  }
+  m_pOwner->DispatchKeyEvent(pMsg);
+}
diff --git a/xfa/fwl/basewidget/fwl_pushbuttonimp.h b/xfa/fwl/basewidget/fwl_pushbuttonimp.h
new file mode 100644
index 0000000..32d8f6c
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_pushbuttonimp.h
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_PushButtonImpDelegate;
+
+class CFWL_PushButtonImp : public CFWL_WidgetImp {
+ public:
+  CFWL_PushButtonImp(const CFWL_WidgetImpProperties& properties,
+                     IFWL_Widget* pOuter);
+  virtual ~CFWL_PushButtonImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  void DrawBkground(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix);
+  void DrawText(CFX_Graphics* pGraphics,
+                IFWL_ThemeProvider* pTheme,
+                const CFX_Matrix* pMatrix);
+  FX_DWORD GetPartStates();
+  void UpdateTextOutStyles();
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtCaption;
+  FX_BOOL m_bBtnDown;
+  FX_DWORD m_dwTTOStyles;
+  int32_t m_iTTOAlign;
+  friend class CFWL_PushButtonImpDelegate;
+};
+class CFWL_PushButtonImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_PushButtonImpDelegate(CFWL_PushButtonImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  CFWL_PushButtonImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_scrollbarimp.cpp b/xfa/fwl/basewidget/fwl_scrollbarimp.cpp
new file mode 100644
index 0000000..86c7889
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_scrollbarimp.cpp
@@ -0,0 +1,805 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_scrollbarimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+#define FWL_SCROLLBAR_Elapse 500
+#define FWL_SCROLLBAR_MinThumb 5
+
+// static
+IFWL_ScrollBar* IFWL_ScrollBar::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_ScrollBar* pScrollBar = new IFWL_ScrollBar;
+  CFWL_ScrollBarImp* pScrollBarImpl = new CFWL_ScrollBarImp(properties, pOuter);
+  pScrollBar->SetImpl(pScrollBarImpl);
+  pScrollBarImpl->SetInterface(pScrollBar);
+  return pScrollBar;
+}
+IFWL_ScrollBar::IFWL_ScrollBar() {}
+FX_BOOL IFWL_ScrollBar::IsVertical() {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->IsVertical();
+}
+FWL_ERR IFWL_ScrollBar::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetRange(fMin, fMax);
+}
+FWL_ERR IFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetRange(fMin, fMax);
+}
+FX_FLOAT IFWL_ScrollBar::GetPageSize() {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetPageSize();
+}
+FWL_ERR IFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetPageSize(fPageSize);
+}
+FX_FLOAT IFWL_ScrollBar::GetStepSize() {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetStepSize();
+}
+FWL_ERR IFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetStepSize(fStepSize);
+}
+FX_FLOAT IFWL_ScrollBar::GetPos() {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetPos();
+}
+FWL_ERR IFWL_ScrollBar::SetPos(FX_FLOAT fPos) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetPos(fPos);
+}
+FX_FLOAT IFWL_ScrollBar::GetTrackPos() {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetTrackPos();
+}
+FWL_ERR IFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetTrackPos(fTrackPos);
+}
+FX_BOOL IFWL_ScrollBar::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
+  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->DoScroll(dwCode, fPos);
+}
+CFWL_ScrollBarImp::CFWL_ScrollBarImp(const CFWL_WidgetImpProperties& properties,
+                                     IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_hTimer(nullptr),
+      m_fRangeMin(0),
+      m_fRangeMax(-1),
+      m_fPageSize(0),
+      m_fStepSize(0),
+      m_fPos(0),
+      m_fTrackPos(0),
+      m_iMinButtonState(FWL_PARTSTATE_SCB_Normal),
+      m_iMaxButtonState(FWL_PARTSTATE_SCB_Normal),
+      m_iThumbButtonState(FWL_PARTSTATE_SCB_Normal),
+      m_iMinTrackState(FWL_PARTSTATE_SCB_Normal),
+      m_iMaxTrackState(FWL_PARTSTATE_SCB_Normal),
+      m_fLastTrackPos(0),
+      m_cpTrackPointX(0),
+      m_cpTrackPointY(0),
+      m_iMouseWheel(0),
+      m_bTrackMouseLeave(FALSE),
+      m_bMouseHover(FALSE),
+      m_bMouseDown(FALSE),
+      m_bRepaintThumb(FALSE),
+      m_fButtonLen(0),
+      m_bMinSize(FALSE),
+      m_bCustomLayout(FALSE),
+      m_fMinThumb(FWL_SCROLLBAR_MinThumb) {
+  m_rtClient.Reset();
+  m_rtThumb.Reset();
+  m_rtMinBtn.Reset();
+  m_rtMaxBtn.Reset();
+  m_rtMinTrack.Reset();
+  m_rtMaxTrack.Reset();
+}
+CFWL_ScrollBarImp::~CFWL_ScrollBarImp() {}
+FWL_ERR CFWL_ScrollBarImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_ScrollBar;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ScrollBarImp::GetClassID() const {
+  return FWL_CLASSHASH_ScrollBar;
+}
+FWL_ERR CFWL_ScrollBarImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_ScrollBarImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ScrollBarImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_ScrollBarImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
+        GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
+    if (!pfMinWidth)
+      return FWL_ERR_Indefinite;
+    if (IsVertical()) {
+      rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
+    } else {
+      rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
+    }
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ScrollBarImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  Layout();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ScrollBarImp::DrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_SCB_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_SCB_Edge, pTheme, pMatrix);
+  }
+  DrawTrack(pGraphics, pTheme, TRUE, pMatrix);
+  DrawTrack(pGraphics, pTheme, FALSE, pMatrix);
+  DrawArrowBtn(pGraphics, pTheme, TRUE, pMatrix);
+  DrawArrowBtn(pGraphics, pTheme, FALSE, pMatrix);
+  DrawThumb(pGraphics, pTheme, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+inline FX_BOOL CFWL_ScrollBarImp::IsVertical() {
+  return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_SCB_Vert;
+}
+FWL_ERR CFWL_ScrollBarImp::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
+  fMin = m_fRangeMin;
+  fMax = m_fRangeMax;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ScrollBarImp::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
+  m_fRangeMin = fMin;
+  m_fRangeMax = fMax;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_ScrollBarImp::GetPageSize() {
+  return m_fPageSize;
+}
+FWL_ERR CFWL_ScrollBarImp::SetPageSize(FX_FLOAT fPageSize) {
+  m_fPageSize = fPageSize;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_ScrollBarImp::GetStepSize() {
+  return m_fStepSize;
+}
+FWL_ERR CFWL_ScrollBarImp::SetStepSize(FX_FLOAT fStepSize) {
+  m_fStepSize = fStepSize;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_ScrollBarImp::GetPos() {
+  return m_fPos;
+}
+FWL_ERR CFWL_ScrollBarImp::SetPos(FX_FLOAT fPos) {
+  m_fPos = fPos;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_ScrollBarImp::GetTrackPos() {
+  return m_fTrackPos;
+}
+FWL_ERR CFWL_ScrollBarImp::SetTrackPos(FX_FLOAT fTrackPos) {
+  m_fTrackPos = fTrackPos;
+  CalcThumbButtonRect(m_rtThumb);
+  CalcMinTrackRect(m_rtMinTrack);
+  CalcMaxTrackRect(m_rtMaxTrack);
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_ScrollBarImp::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
+  switch (dwCode) {
+    case FWL_SCBCODE_Min:
+    case FWL_SCBCODE_Max:
+    case FWL_SCBCODE_PageBackward:
+    case FWL_SCBCODE_PageForward:
+    case FWL_SCBCODE_StepBackward:
+      break;
+    case FWL_SCBCODE_StepForward:
+      break;
+    case FWL_SCBCODE_Pos:
+    case FWL_SCBCODE_TrackPos:
+    case FWL_SCBCODE_EndScroll:
+      break;
+    default: { return FALSE; }
+  }
+  return OnScroll(dwCode, fPos);
+}
+int32_t CFWL_ScrollBarImp::Run(FWL_HTIMER hTimer) {
+  if (m_hTimer) {
+    FWL_StopTimer(m_hTimer);
+  }
+  if (!SendEvent()) {
+    m_hTimer = FWL_StartTimer(this, 0);
+  }
+  return 1;
+}
+FWL_ERR CFWL_ScrollBarImp::SetOuter(IFWL_Widget* pOuter) {
+  m_pOuter = pOuter;
+  return FWL_ERR_Succeeded;
+}
+void CFWL_ScrollBarImp::DrawTrack(CFX_Graphics* pGraphics,
+                                  IFWL_ThemeProvider* pTheme,
+                                  FX_BOOL bLower,
+                                  const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = bLower ? FWL_PART_SCB_LowerTrack : FWL_PART_SCB_UpperTrack;
+  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                         ? FWL_PARTSTATE_SCB_Disabled
+                         : (bLower ? m_iMinTrackState : m_iMaxTrackState);
+  param.m_pGraphics = pGraphics;
+  param.m_matrix.Concat(*pMatrix);
+  param.m_rtPart = bLower ? m_rtMinTrack : m_rtMaxTrack;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_ScrollBarImp::DrawArrowBtn(CFX_Graphics* pGraphics,
+                                     IFWL_ThemeProvider* pTheme,
+                                     FX_BOOL bMinBtn,
+                                     const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = bMinBtn ? FWL_PART_SCB_ForeArrow : FWL_PART_SCB_BackArrow;
+  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                         ? FWL_PARTSTATE_SCB_Disabled
+                         : (bMinBtn ? m_iMinButtonState : m_iMaxButtonState);
+  param.m_pGraphics = pGraphics;
+  param.m_matrix.Concat(*pMatrix);
+  param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn;
+  if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) {
+    pTheme->DrawBackground(&param);
+  }
+}
+void CFWL_ScrollBarImp::DrawThumb(CFX_Graphics* pGraphics,
+                                  IFWL_ThemeProvider* pTheme,
+                                  const CFX_Matrix* pMatrix) {
+  if (!IsEnabled()) {
+  }
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_SCB_Thumb;
+  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                         ? FWL_PARTSTATE_SCB_Disabled
+                         : m_iThumbButtonState;
+  param.m_pGraphics = pGraphics;
+  param.m_matrix.Concat(*pMatrix);
+  param.m_rtPart = m_rtThumb;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_ScrollBarImp::Layout() {
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  CFWL_ThemePart part;
+  part.m_pWidget = m_pInterface;
+  m_fMinThumb = *static_cast<FX_FLOAT*>(
+      pTheme->GetCapacity(&part, FWL_CAPACITY_SCB_Size));
+  m_bCustomLayout = pTheme->IsCustomizedLayout(m_pInterface);
+  GetClientRect(m_rtClient);
+  CalcButtonLen();
+  CalcMinButtonRect(m_rtMinBtn);
+  CalcMaxButtonRect(m_rtMaxBtn);
+  CalcThumbButtonRect(m_rtThumb);
+  CalcMinTrackRect(m_rtMinTrack);
+  CalcMaxTrackRect(m_rtMaxTrack);
+}
+void CFWL_ScrollBarImp::CalcButtonLen() {
+  m_fButtonLen = IsVertical() ? m_rtClient.width : m_rtClient.height;
+  FX_FLOAT fLength = IsVertical() ? m_rtClient.height : m_rtClient.width;
+  if (fLength < m_fButtonLen * 2) {
+    m_fButtonLen = fLength / 2;
+    m_bMinSize = TRUE;
+  } else {
+    m_bMinSize = FALSE;
+  }
+}
+void CFWL_ScrollBarImp::CalcMinButtonRect(CFX_RectF& rect) {
+  if (m_bCustomLayout) {
+    IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+    CFWL_ThemePart pPart;
+    pPart.m_rtPart = m_rtMinBtn;
+    pPart.m_pWidget = m_pInterface;
+    pPart.m_iPart = FWL_PART_SCB_ForeArrow;
+    pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                           ? FWL_PARTSTATE_SCB_Disabled
+                           : m_iMinButtonState;
+    pTheme->GetPartRect(&pPart, rect);
+  } else {
+    rect.left = m_rtClient.left;
+    rect.top = m_rtClient.top;
+    rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen;
+    rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height;
+  }
+}
+void CFWL_ScrollBarImp::CalcMaxButtonRect(CFX_RectF& rect) {
+  if (m_bCustomLayout) {
+    IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+    CFWL_ThemePart pPart;
+    pPart.m_rtPart = m_rtMaxBtn;
+    pPart.m_pWidget = m_pInterface;
+    pPart.m_iPart = FWL_PART_SCB_BackArrow;
+    pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
+                           ? FWL_PARTSTATE_SCB_Disabled
+                           : m_iMaxButtonState;
+    pTheme->GetPartRect(&pPart, rect);
+  } else {
+    rect.left =
+        IsVertical() ? m_rtClient.left : m_rtClient.right() - m_fButtonLen;
+    rect.top =
+        IsVertical() ? m_rtClient.bottom() - m_fButtonLen : m_rtClient.top;
+    rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen;
+    rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height;
+  }
+}
+void CFWL_ScrollBarImp::CalcThumbButtonRect(CFX_RectF& rect) {
+  if (!IsEnabled()) {
+    m_rtThumb.Reset();
+    return;
+  }
+  if (m_bMinSize) {
+    m_rtThumb.Empty();
+    return;
+  }
+  FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
+  memset(&rect, 0, sizeof(CFX_Rect));
+  if (fRange < 0) {
+    if (IsVertical()) {
+      rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0);
+    } else {
+      rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height);
+    }
+    return;
+  }
+  CFX_RectF rtClient = m_rtClient;
+  FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width;
+  FX_FLOAT fSize = m_fButtonLen;
+  if (m_bCustomLayout) {
+    if (IsVertical()) {
+      fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height;
+      if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) {
+        fLength = 0.0f;
+      }
+    } else {
+      fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width;
+      if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) {
+        fLength = 0.0f;
+      }
+    }
+  } else {
+    fLength -= fSize * 2.0f;
+    if (fLength < fSize) {
+      fLength = 0.0f;
+    }
+  }
+  FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength);
+  if (fThumbSize < m_fMinThumb) {
+    fThumbSize = m_fMinThumb;
+  }
+  FX_FLOAT fDiff = fLength - fThumbSize;
+  if (fDiff < 0.0f) {
+    fDiff = 0.0f;
+  }
+  FX_FLOAT fTrackPos = m_fTrackPos;
+  if (fTrackPos > m_fRangeMax) {
+    fTrackPos = m_fRangeMax;
+  }
+  if (fTrackPos < m_fRangeMin) {
+    fTrackPos = m_fRangeMin;
+  }
+  if (!fRange)
+    return;
+  if (m_bCustomLayout) {
+    FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange;
+    rect.left = rtClient.left;
+    if (!IsVertical()) {
+      if ((m_rtMinBtn.right() == m_rtMaxBtn.left && m_rtMinBtn.width > 0 &&
+           m_rtMaxBtn.width > 0) ||
+          (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width)) {
+        rect.left += iPos;
+      } else {
+        rect.left += m_rtMinBtn.right() + iPos;
+      }
+    }
+    rect.top = rtClient.top;
+    if (IsVertical()) {
+      if ((m_rtMinBtn.bottom() == m_rtMaxBtn.top && m_rtMinBtn.height > 0 &&
+           m_rtMaxBtn.height > 0) ||
+          (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height)) {
+        rect.top += iPos;
+      } else {
+        rect.top += m_rtMinBtn.bottom() + iPos;
+      }
+    }
+    rect.width = IsVertical() ? rtClient.width : fThumbSize;
+    rect.height = IsVertical() ? fThumbSize : rtClient.height;
+  } else {
+    FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
+    rect.left = rtClient.left;
+    if (!IsVertical()) {
+      rect.left += iPos;
+    }
+    rect.top = rtClient.top;
+    if (IsVertical()) {
+      rect.top += iPos;
+    }
+    rect.width = IsVertical() ? rtClient.width : fThumbSize;
+    rect.height = IsVertical() ? fThumbSize : rtClient.height;
+  }
+}
+void CFWL_ScrollBarImp::CalcMinTrackRect(CFX_RectF& rect) {
+  if (m_bMinSize) {
+    rect.Empty();
+    return;
+  }
+  FX_FLOAT fBottom = m_rtThumb.bottom();
+  FX_FLOAT fRight = m_rtThumb.right();
+  FX_FLOAT ix = (m_rtThumb.left + fRight) / 2;
+  FX_FLOAT iy = (m_rtThumb.top + fBottom) / 2;
+  rect.left = m_rtClient.left;
+  rect.top = m_rtClient.top;
+  FX_BOOL bVertical = IsVertical();
+  rect.width = bVertical ? m_rtClient.width : ix;
+  rect.height = bVertical ? iy : m_rtClient.height;
+  if (m_bCustomLayout) {
+    if (bVertical) {
+      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
+        rect.top = m_rtClient.top;
+      } else if (m_rtMinBtn.top < m_rtThumb.top) {
+        rect.top = m_rtMinBtn.bottom();
+        rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
+      }
+    } else {
+      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
+        rect.left = m_rtClient.left;
+      } else if (m_rtMinBtn.left < m_rtThumb.left) {
+        rect.left = m_rtMinBtn.right();
+        rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
+      }
+    }
+  }
+}
+void CFWL_ScrollBarImp::CalcMaxTrackRect(CFX_RectF& rect) {
+  if (m_bMinSize) {
+    rect.Empty();
+    return;
+  }
+  FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2;
+  FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
+  FX_BOOL bVertical = IsVertical();
+  rect.left = bVertical ? m_rtClient.left : ix;
+  rect.top = bVertical ? iy : m_rtClient.top;
+  rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix;
+  rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height;
+  if (m_bCustomLayout) {
+    if (bVertical) {
+      if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
+          m_rtMaxBtn.height > 0) {
+        rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
+      } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
+        rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
+      }
+    } else {
+      if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
+          m_rtMaxBtn.width > 0) {
+        rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
+      } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
+        rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
+      }
+    }
+  }
+}
+FX_FLOAT CFWL_ScrollBarImp::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) {
+  FX_FLOAT fDiffX = fx - m_cpTrackPointX;
+  FX_FLOAT fDiffY = fy - m_cpTrackPointY;
+  FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
+  FX_FLOAT fPos;
+  if (m_bCustomLayout) {
+    if (IsVertical()) {
+      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
+        fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height);
+      } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) {
+        fPos = fRange * fDiffY /
+               (m_rtMinBtn.top - m_rtClient.top - m_rtThumb.height);
+      } else {
+        fPos = fRange * fDiffY /
+               (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
+      }
+    } else {
+      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
+        fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width);
+      } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) {
+        fPos = fRange * fDiffX /
+               (m_rtMinBtn.left - m_rtClient.left - m_rtThumb.width);
+      } else {
+        fPos = fRange * fDiffX /
+               (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width);
+      }
+    }
+  } else {
+    if (IsVertical()) {
+      fPos = fRange * fDiffY /
+             (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
+    } else {
+      fPos = fRange * fDiffX /
+             (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width);
+    }
+  }
+  fPos += m_fLastTrackPos;
+  if (fPos < m_fRangeMin) {
+    fPos = m_fRangeMin;
+  }
+  if (fPos > m_fRangeMax) {
+    fPos = m_fRangeMax;
+  }
+  return fPos;
+}
+void CFWL_ScrollBarImp::GetTrackRect(CFX_RectF& rect, FX_BOOL bLower) {
+  FX_BOOL bDisabled = m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled;
+  if (bDisabled || m_bCustomLayout) {
+    rect = bLower ? m_rtMinTrack : m_rtMaxTrack;
+  } else {
+    FX_FLOAT fW = m_rtThumb.width / 2;
+    FX_FLOAT fH = m_rtThumb.height / 2;
+    FX_BOOL bVert = IsVertical();
+    if (bLower) {
+      if (bVert) {
+        FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
+        fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
+        rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
+                 m_rtMinTrack.width, fMinTrackHeight);
+      } else {
+        FX_FLOAT fMinTrackWidth =
+            m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
+        fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
+        rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
+                 fMinTrackWidth, m_rtMinTrack.height);
+      }
+    } else {
+      if (bVert) {
+        FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
+        fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
+        rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
+                 fMaxTrackHeight);
+      } else {
+        FX_FLOAT fMaxTrackWidth =
+            m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
+        fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
+        rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
+                 m_rtMaxTrack.height);
+      }
+    }
+  }
+}
+FX_BOOL CFWL_ScrollBarImp::SendEvent() {
+  if (m_iMinButtonState == FWL_PARTSTATE_SCB_Pressed) {
+    DoScroll(FWL_SCBCODE_StepBackward, m_fTrackPos);
+    return FALSE;
+  }
+  if (m_iMaxButtonState == FWL_PARTSTATE_SCB_Pressed) {
+    DoScroll(FWL_SCBCODE_StepForward, m_fTrackPos);
+    return FALSE;
+  }
+  if (m_iMinTrackState == FWL_PARTSTATE_SCB_Pressed) {
+    DoScroll(FWL_SCBCODE_PageBackward, m_fTrackPos);
+    return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY);
+  }
+  if (m_iMaxTrackState == FWL_PARTSTATE_SCB_Pressed) {
+    DoScroll(FWL_SCBCODE_PageForward, m_fTrackPos);
+    return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY);
+  }
+  if (m_iMouseWheel) {
+    FX_WORD dwCode =
+        m_iMouseWheel < 0 ? FWL_SCBCODE_StepForward : FWL_SCBCODE_StepBackward;
+    DoScroll(dwCode, m_fTrackPos);
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_ScrollBarImp::OnScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
+  FX_BOOL bRet = TRUE;
+  CFWL_EvtScroll ev;
+  ev.m_iScrollCode = dwCode;
+  ev.m_pSrcTarget = m_pInterface;
+  ev.m_fPos = fPos;
+  ev.m_pRet = &bRet;
+  DispatchEvent(&ev);
+  return bRet;
+}
+CFWL_ScrollBarImpDelegate::CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_ScrollBarImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  int32_t iRet = 1;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  if (dwMsgCode == FWL_MSGHASH_Mouse) {
+    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+    FX_DWORD dwCmd = pMsg->m_dwCmd;
+    switch (dwCmd) {
+      case FWL_MSGMOUSECMD_LButtonDown: {
+        OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
+        break;
+      }
+      case FWL_MSGMOUSECMD_LButtonUp: {
+        OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
+        break;
+      }
+      case FWL_MSGMOUSECMD_MouseMove: {
+        OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
+        break;
+      }
+      case FWL_MSGMOUSECMD_MouseLeave: {
+        OnMouseLeave();
+        break;
+      }
+      default: { iRet = 0; }
+    }
+  } else if (dwMsgCode == FWL_MSGHASH_MouseWheel) {
+    CFWL_MsgMouseWheel* pMsg = static_cast<CFWL_MsgMouseWheel*>(pMessage);
+    OnMouseWheel(pMsg->m_fx, pMsg->m_fy, pMsg->m_dwFlags, pMsg->m_fDeltaX,
+                 pMsg->m_fDeltaY);
+  } else {
+    iRet = 0;
+  }
+  return iRet;
+}
+FWL_ERR CFWL_ScrollBarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_ScrollBarImpDelegate::OnLButtonDown(FX_DWORD dwFlags,
+                                              FX_FLOAT fx,
+                                              FX_FLOAT fy) {
+  if (!m_pOwner->IsEnabled()) {
+    return;
+  }
+  m_pOwner->m_bMouseDown = TRUE;
+  m_pOwner->SetGrab(TRUE);
+  m_pOwner->m_cpTrackPointX = fx;
+  m_pOwner->m_cpTrackPointY = fy;
+  m_pOwner->m_fLastTrackPos = m_pOwner->m_fTrackPos;
+  if (m_pOwner->m_rtMinBtn.Contains(fx, fy)) {
+    DoMouseDown(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
+  } else {
+    if (m_pOwner->m_rtThumb.Contains(fx, fy)) {
+      DoMouseDown(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx,
+                  fy);
+    } else {
+      if (m_pOwner->m_rtMaxBtn.Contains(fx, fy)) {
+        DoMouseDown(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx,
+                    fy);
+      } else {
+        if (m_pOwner->m_rtMinTrack.Contains(fx, fy)) {
+          DoMouseDown(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx,
+                      fy);
+        } else {
+          DoMouseDown(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx,
+                      fy);
+        }
+      }
+    }
+  }
+  if (!m_pOwner->SendEvent()) {
+    m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SCROLLBAR_Elapse);
+  }
+}
+void CFWL_ScrollBarImpDelegate::OnLButtonUp(FX_DWORD dwFlags,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  FWL_StopTimer(m_pOwner->m_hTimer);
+  m_pOwner->m_bMouseDown = FALSE;
+  DoMouseUp(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
+  DoMouseUp(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
+  DoMouseUp(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
+  DoMouseUp(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
+  DoMouseUp(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
+  m_pOwner->SetGrab(FALSE);
+}
+void CFWL_ScrollBarImpDelegate::OnMouseMove(FX_DWORD dwFlags,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  DoMouseMove(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
+  DoMouseMove(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
+  DoMouseMove(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
+  DoMouseMove(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
+  DoMouseMove(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
+}
+void CFWL_ScrollBarImpDelegate::OnMouseLeave() {
+  DoMouseLeave(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState);
+  DoMouseLeave(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState);
+  DoMouseLeave(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState);
+  DoMouseLeave(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState);
+  DoMouseLeave(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState);
+}
+void CFWL_ScrollBarImpDelegate::OnMouseWheel(FX_FLOAT fx,
+                                             FX_FLOAT fy,
+                                             FX_DWORD dwFlags,
+                                             FX_FLOAT fDeltaX,
+                                             FX_FLOAT fDeltaY) {
+  m_pOwner->m_iMouseWheel = (int32_t)fDeltaX;
+  m_pOwner->SendEvent();
+  m_pOwner->m_iMouseWheel = 0;
+}
+void CFWL_ScrollBarImpDelegate::DoMouseDown(int32_t iItem,
+                                            const CFX_RectF& rtItem,
+                                            int32_t& iState,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  if (!rtItem.Contains(fx, fy)) {
+    return;
+  }
+  if (iState == FWL_PARTSTATE_SCB_Pressed) {
+    return;
+  }
+  iState = FWL_PARTSTATE_SCB_Pressed;
+  m_pOwner->Repaint(&rtItem);
+}
+void CFWL_ScrollBarImpDelegate::DoMouseUp(int32_t iItem,
+                                          const CFX_RectF& rtItem,
+                                          int32_t& iState,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  int32_t iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered
+                                              : FWL_PARTSTATE_SCB_Normal;
+  if (iState == iNewState) {
+    return;
+  }
+  iState = iNewState;
+  m_pOwner->Repaint(&rtItem);
+  m_pOwner->OnScroll(FWL_SCBCODE_EndScroll, m_pOwner->m_fTrackPos);
+}
+void CFWL_ScrollBarImpDelegate::DoMouseMove(int32_t iItem,
+                                            const CFX_RectF& rtItem,
+                                            int32_t& iState,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  if (!m_pOwner->m_bMouseDown) {
+    int32_t iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered
+                                                : FWL_PARTSTATE_SCB_Normal;
+    if (iState == iNewState) {
+      return;
+    }
+    iState = iNewState;
+    m_pOwner->Repaint(&rtItem);
+  } else if ((2 == iItem) &&
+             (m_pOwner->m_iThumbButtonState == FWL_PARTSTATE_SCB_Pressed)) {
+    FX_FLOAT fPos = m_pOwner->GetTrackPointPos(fx, fy);
+    m_pOwner->m_fTrackPos = fPos;
+    m_pOwner->OnScroll(FWL_SCBCODE_TrackPos, fPos);
+  }
+}
+void CFWL_ScrollBarImpDelegate::DoMouseLeave(int32_t iItem,
+                                             const CFX_RectF& rtItem,
+                                             int32_t& iState) {
+  if (iState == FWL_PARTSTATE_SCB_Normal) {
+    return;
+  }
+  iState = FWL_PARTSTATE_SCB_Normal;
+  m_pOwner->Repaint(&rtItem);
+}
+void CFWL_ScrollBarImpDelegate::DoMouseHover(int32_t iItem,
+                                             const CFX_RectF& rtItem,
+                                             int32_t& iState) {
+  if (iState == FWL_PARTSTATE_SCB_Hovered) {
+    return;
+  }
+  iState = FWL_PARTSTATE_SCB_Hovered;
+  m_pOwner->Repaint(&rtItem);
+}
diff --git a/xfa/fwl/basewidget/fwl_scrollbarimp.h b/xfa/fwl/basewidget/fwl_scrollbarimp.h
new file mode 100644
index 0000000..2e378a6
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_scrollbarimp.h
@@ -0,0 +1,139 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_ScrollBarImpDelegate;
+
+class CFWL_ScrollBarImp : public CFWL_WidgetImp, public IFWL_Timer {
+ public:
+  CFWL_ScrollBarImp(const CFWL_WidgetImpProperties& properties,
+                    IFWL_Widget* pOuter);
+  ~CFWL_ScrollBarImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FX_BOOL IsVertical();
+  virtual FWL_ERR GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
+  virtual FWL_ERR SetRange(FX_FLOAT fMin, FX_FLOAT fMax);
+  virtual FX_FLOAT GetPageSize();
+  virtual FWL_ERR SetPageSize(FX_FLOAT fPageSize);
+  virtual FX_FLOAT GetStepSize();
+  virtual FWL_ERR SetStepSize(FX_FLOAT fStepSize);
+  virtual FX_FLOAT GetPos();
+  virtual FWL_ERR SetPos(FX_FLOAT fPos);
+  virtual FX_FLOAT GetTrackPos();
+  virtual FWL_ERR SetTrackPos(FX_FLOAT fTrackPos);
+  virtual FX_BOOL DoScroll(FX_DWORD dwCode, FX_FLOAT fPos = 0.0f);
+  virtual FWL_ERR SetOuter(IFWL_Widget* pOuter);
+  virtual int32_t Run(FWL_HTIMER hTimer);
+
+ protected:
+  void DrawTrack(CFX_Graphics* pGraphics,
+                 IFWL_ThemeProvider* pTheme,
+                 FX_BOOL bLower = TRUE,
+                 const CFX_Matrix* pMatrix = NULL);
+  void DrawArrowBtn(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    FX_BOOL bMinBtn = TRUE,
+                    const CFX_Matrix* pMatrix = NULL);
+  void DrawThumb(CFX_Graphics* pGraphics,
+                 IFWL_ThemeProvider* pTheme,
+                 const CFX_Matrix* pMatrix = NULL);
+  void Layout();
+  void CalcButtonLen();
+  void CalcMinButtonRect(CFX_RectF& rect);
+  void CalcMaxButtonRect(CFX_RectF& rect);
+  void CalcThumbButtonRect(CFX_RectF& rect);
+  void CalcMinTrackRect(CFX_RectF& rect);
+  void CalcMaxTrackRect(CFX_RectF& rect);
+  FX_FLOAT GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy);
+  void GetTrackRect(CFX_RectF& rect, FX_BOOL bLower = TRUE);
+  FX_BOOL SendEvent();
+  FX_BOOL OnScroll(FX_DWORD dwCode, FX_FLOAT fPos);
+
+  FWL_HTIMER m_hTimer;
+  FX_FLOAT m_fRangeMin;
+  FX_FLOAT m_fRangeMax;
+  FX_FLOAT m_fPageSize;
+  FX_FLOAT m_fStepSize;
+  FX_FLOAT m_fPos;
+  FX_FLOAT m_fTrackPos;
+  int32_t m_iMinButtonState;
+  int32_t m_iMaxButtonState;
+  int32_t m_iThumbButtonState;
+  int32_t m_iMinTrackState;
+  int32_t m_iMaxTrackState;
+  FX_FLOAT m_fLastTrackPos;
+  FX_FLOAT m_cpTrackPointX;
+  FX_FLOAT m_cpTrackPointY;
+  int32_t m_iMouseWheel;
+  FX_BOOL m_bTrackMouseLeave;
+  FX_BOOL m_bMouseHover;
+  FX_BOOL m_bMouseDown;
+  FX_BOOL m_bRepaintThumb;
+  FX_FLOAT m_fButtonLen;
+  FX_BOOL m_bMinSize;
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtThumb;
+  CFX_RectF m_rtMinBtn;
+  CFX_RectF m_rtMaxBtn;
+  CFX_RectF m_rtMinTrack;
+  CFX_RectF m_rtMaxTrack;
+  FX_BOOL m_bCustomLayout;
+  FX_FLOAT m_fMinThumb;
+  friend class CFWL_ScrollBarImpDelegate;
+};
+class CFWL_ScrollBarImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  void OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  void OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  void OnMouseLeave();
+  void OnMouseWheel(FX_FLOAT fx,
+                    FX_FLOAT fy,
+                    FX_DWORD dwFlags,
+                    FX_FLOAT fDeltaX,
+                    FX_FLOAT fDeltaY);
+  void DoMouseDown(int32_t iItem,
+                   const CFX_RectF& rtItem,
+                   int32_t& iState,
+                   FX_FLOAT fx,
+                   FX_FLOAT fy);
+  void DoMouseUp(int32_t iItem,
+                 const CFX_RectF& rtItem,
+                 int32_t& iState,
+                 FX_FLOAT fx,
+                 FX_FLOAT fy);
+  void DoMouseMove(int32_t iItem,
+                   const CFX_RectF& rtItem,
+                   int32_t& iState,
+                   FX_FLOAT fx,
+                   FX_FLOAT fy);
+  void DoMouseLeave(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
+  void DoMouseHover(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
+
+  CFWL_ScrollBarImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_spinbuttonimp.cpp b/xfa/fwl/basewidget/fwl_spinbuttonimp.cpp
new file mode 100644
index 0000000..9493cbb
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_spinbuttonimp.cpp
@@ -0,0 +1,429 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_spinbuttonimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_spinbutton.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+#define FWL_SPN_MinWidth 18
+#define FWL_SPN_MinHeight 32
+#define FWL_SPIN_Elapse 200
+
+// static
+IFWL_SpinButton* IFWL_SpinButton::Create(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter) {
+  IFWL_SpinButton* pSpinButton = new IFWL_SpinButton;
+  CFWL_SpinButtonImp* pSpinButtonImpl =
+      new CFWL_SpinButtonImp(properties, nullptr);
+  pSpinButton->SetImpl(pSpinButtonImpl);
+  pSpinButtonImpl->SetInterface(pSpinButton);
+  return pSpinButton;
+}
+IFWL_SpinButton::IFWL_SpinButton() {}
+FWL_ERR IFWL_SpinButton::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) {
+  return static_cast<CFWL_SpinButtonImp*>(GetImpl())
+      ->EnableButton(bEnable, bUp);
+}
+FX_BOOL IFWL_SpinButton::IsButtonEnable(FX_BOOL bUp) {
+  return static_cast<CFWL_SpinButtonImp*>(GetImpl())->IsButtonEnable(bUp);
+}
+
+CFWL_SpinButtonImp::CFWL_SpinButtonImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_dwUpState(FWL_PARTSTATE_SPB_Normal),
+      m_dwDnState(FWL_PARTSTATE_SPB_Normal),
+      m_iButtonIndex(0),
+      m_bLButtonDwn(FALSE),
+      m_hTimer(NULL) {
+  m_rtClient.Reset();
+  m_rtUpButton.Reset();
+  m_rtDnButton.Reset();
+  m_pProperties->m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert;
+}
+CFWL_SpinButtonImp::~CFWL_SpinButtonImp() {}
+FWL_ERR CFWL_SpinButtonImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_SpinButton;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_SpinButtonImp::GetClassID() const {
+  return FWL_CLASSHASH_SpinButton;
+}
+FWL_ERR CFWL_SpinButtonImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_SpinButtonImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SpinButtonImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_SpinButtonImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, FWL_SPN_MinWidth, FWL_SPN_MinHeight);
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SpinButtonImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  GetClientRect(m_rtClient);
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXE_SPB_Vert) {
+    m_rtUpButton.Set(m_rtClient.top, m_rtClient.left, m_rtClient.width,
+                     m_rtClient.height / 2);
+    m_rtDnButton.Set(m_rtClient.left, m_rtClient.top + m_rtClient.height / 2,
+                     m_rtClient.width, m_rtClient.height / 2);
+  } else {
+    m_rtUpButton.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width / 2,
+                     m_rtClient.height);
+    m_rtDnButton.Set(m_rtClient.left + m_rtClient.width / 2, m_rtClient.top,
+                     m_rtClient.width / 2, m_rtClient.height);
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_SpinButtonImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_rtClient.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  if (HasBorder() && (m_rtClient.Contains(fx, fy))) {
+    return FWL_WGTHITTEST_Border;
+  }
+  if (HasEdge()) {
+    CFX_RectF rtEdge;
+    GetEdgeRect(rtEdge);
+    if (rtEdge.Contains(fx, fy)) {
+      return FWL_PART_SPB_Edge;
+    }
+  }
+  if (m_rtUpButton.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_SPB_UpButton;
+  }
+  if (m_rtDnButton.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_SPB_DownButton;
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FWL_ERR CFWL_SpinButtonImp::DrawWidget(CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  CFX_RectF rtClip(m_rtClient);
+  if (pMatrix != NULL) {
+    pMatrix->TransformRect(rtClip);
+  }
+  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
+  if (HasBorder()) {
+    DrawBorder(pGraphics, FWL_PART_SPB_Border, pTheme, pMatrix);
+  }
+  if (HasEdge()) {
+    DrawEdge(pGraphics, FWL_PART_SPB_Edge, pTheme, pMatrix);
+  }
+  DrawUpButton(pGraphics, pTheme, pMatrix);
+  DrawDownButton(pGraphics, pTheme, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_SpinButtonImp::Run(FWL_HTIMER hTimer) {
+  if (m_hTimer) {
+    CFWL_EvtSpbClick wmPosChanged;
+    wmPosChanged.m_pSrcTarget = m_pInterface;
+    wmPosChanged.m_bUp = m_iButtonIndex == 0;
+    DispatchEvent(&wmPosChanged);
+  }
+  return 1;
+}
+FWL_ERR CFWL_SpinButtonImp::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) {
+  if (bUp) {
+    if (bEnable) {
+      m_dwUpState = FWL_PARTSTATE_SPB_Normal;
+    } else {
+      m_dwUpState = FWL_PARTSTATE_SPB_Disabled;
+    }
+  } else {
+    if (bEnable) {
+      m_dwDnState = FWL_PARTSTATE_SPB_Normal;
+    } else {
+      m_dwDnState = FWL_PARTSTATE_SPB_Disabled;
+    }
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_SpinButtonImp::IsButtonEnable(FX_BOOL bUp) {
+  if (bUp) {
+    return (m_dwUpState != FWL_PARTSTATE_SPB_Disabled);
+  }
+  return (m_dwDnState != FWL_PARTSTATE_SPB_Disabled);
+}
+void CFWL_SpinButtonImp::DrawUpButton(CFX_Graphics* pGraphics,
+                                      IFWL_ThemeProvider* pTheme,
+                                      const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_SPB_UpButton;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = m_dwUpState + 1;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  params.m_rtPart = m_rtUpButton;
+  pTheme->DrawBackground(&params);
+}
+void CFWL_SpinButtonImp::DrawDownButton(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground params;
+  params.m_pWidget = m_pInterface;
+  params.m_iPart = FWL_PART_SPB_DownButton;
+  params.m_pGraphics = pGraphics;
+  params.m_dwStates = m_dwDnState + 1;
+  if (pMatrix) {
+    params.m_matrix.Concat(*pMatrix);
+  }
+  params.m_rtPart = m_rtDnButton;
+  pTheme->DrawBackground(&params);
+}
+CFWL_SpinButtonImpDelegate::CFWL_SpinButtonImpDelegate(
+    CFWL_SpinButtonImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_SpinButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  int32_t iRet = 1;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_SetFocus:
+    case FWL_MSGHASH_KillFocus: {
+      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      FX_DWORD dwCmd = pMsg->m_dwCmd;
+      switch (dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMsg);
+          break;
+        }
+        default: {}
+      }
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
+      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
+        OnKeyDown(pKey);
+      }
+      break;
+    }
+    default: {
+      iRet = 0;
+      break;
+    }
+  }
+  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  return iRet;
+}
+FWL_ERR CFWL_SpinButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SpinButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                                 const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_SpinButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
+                                                FX_BOOL bSet) {
+  if (bSet) {
+    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+  } else {
+    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_SpinButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  m_pOwner->m_bLButtonDwn = TRUE;
+  m_pOwner->SetGrab(TRUE);
+  m_pOwner->SetFocus(TRUE);
+  if (!m_pOwner->m_pProperties->m_pDataProvider)
+    return;
+  FX_BOOL bUpPress = (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
+                      m_pOwner->IsButtonEnable(TRUE));
+  FX_BOOL bDnPress = (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
+                      m_pOwner->IsButtonEnable(FALSE));
+  if (!bUpPress && !bDnPress) {
+    return;
+  }
+  if (bUpPress) {
+    m_pOwner->m_iButtonIndex = 0;
+    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Pressed;
+  }
+  if (bDnPress) {
+    m_pOwner->m_iButtonIndex = 1;
+    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Pressed;
+  }
+  CFWL_EvtSpbClick wmPosChanged;
+  wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface;
+  wmPosChanged.m_bUp = bUpPress;
+  m_pOwner->DispatchEvent(&wmPosChanged);
+  m_pOwner->Repaint(bUpPress ? &m_pOwner->m_rtUpButton
+                             : &m_pOwner->m_rtDnButton);
+  m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SPIN_Elapse);
+}
+void CFWL_SpinButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_pProperties->m_dwStates & FWL_PARTSTATE_SPB_Disabled) {
+    return;
+  }
+  m_pOwner->m_bLButtonDwn = FALSE;
+  m_pOwner->SetGrab(FALSE);
+  m_pOwner->SetFocus(FALSE);
+  if (m_pOwner->m_hTimer) {
+    FWL_StopTimer(m_pOwner->m_hTimer);
+    m_pOwner->m_hTimer = NULL;
+  }
+  FX_BOOL bRepaint = FALSE;
+  CFX_RectF rtInvalidate;
+  if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Pressed &&
+      m_pOwner->IsButtonEnable(TRUE)) {
+    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
+    bRepaint = TRUE;
+    rtInvalidate = m_pOwner->m_rtUpButton;
+  } else if (m_pOwner->m_dwDnState == FWL_PARTSTATE_SPB_Pressed &&
+             m_pOwner->IsButtonEnable(FALSE)) {
+    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
+    bRepaint = TRUE;
+    rtInvalidate = m_pOwner->m_rtDnButton;
+  }
+  if (bRepaint) {
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+void CFWL_SpinButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (!m_pOwner->m_pProperties->m_pDataProvider)
+    return;
+  if (m_pOwner->m_bLButtonDwn) {
+    return;
+  }
+  FX_BOOL bRepaint = FALSE;
+  CFX_RectF rtInvlidate;
+  rtInvlidate.Reset();
+  if (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (m_pOwner->IsButtonEnable(TRUE)) {
+      if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Hovered) {
+        m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Hovered;
+        bRepaint = TRUE;
+        rtInvlidate = m_pOwner->m_rtUpButton;
+      }
+      if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal &&
+          m_pOwner->IsButtonEnable(FALSE)) {
+        m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
+        if (bRepaint) {
+          rtInvlidate.Union(m_pOwner->m_rtDnButton);
+        } else {
+          rtInvlidate = m_pOwner->m_rtDnButton;
+        }
+        bRepaint = TRUE;
+      }
+    }
+    if (!m_pOwner->IsButtonEnable(FALSE)) {
+      m_pOwner->EnableButton(FALSE, FALSE);
+    }
+  } else if (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (m_pOwner->IsButtonEnable(FALSE)) {
+      if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Hovered) {
+        m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Hovered;
+        bRepaint = TRUE;
+        rtInvlidate = m_pOwner->m_rtDnButton;
+      }
+      if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal &&
+          m_pOwner->IsButtonEnable(TRUE)) {
+        m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
+        if (bRepaint) {
+          rtInvlidate.Union(m_pOwner->m_rtUpButton);
+        } else {
+          rtInvlidate = m_pOwner->m_rtUpButton;
+        }
+        bRepaint = TRUE;
+      }
+    }
+  } else if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal ||
+             m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) {
+    if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal) {
+      m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
+      bRepaint = TRUE;
+      rtInvlidate = m_pOwner->m_rtUpButton;
+    }
+    if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) {
+      m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
+      if (bRepaint) {
+        rtInvlidate.Union(m_pOwner->m_rtDnButton);
+      } else {
+        rtInvlidate = m_pOwner->m_rtDnButton;
+      }
+      bRepaint = TRUE;
+    }
+  }
+  if (bRepaint) {
+    m_pOwner->Repaint(&rtInvlidate);
+  }
+}
+void CFWL_SpinButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (!pMsg)
+    return;
+  if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal &&
+      m_pOwner->IsButtonEnable(TRUE)) {
+    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
+  }
+  if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal &&
+      m_pOwner->IsButtonEnable(FALSE)) {
+    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
+  }
+  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+}
+void CFWL_SpinButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (!m_pOwner->m_pProperties->m_pDataProvider)
+    return;
+  FX_BOOL bUp =
+      pMsg->m_dwKeyCode == FWL_VKEY_Up || pMsg->m_dwKeyCode == FWL_VKEY_Left;
+  FX_BOOL bDown =
+      pMsg->m_dwKeyCode == FWL_VKEY_Down || pMsg->m_dwKeyCode == FWL_VKEY_Right;
+  if (!bUp && !bDown) {
+    return;
+  }
+  FX_BOOL bUpEnable = m_pOwner->IsButtonEnable(TRUE);
+  FX_BOOL bDownEnable = m_pOwner->IsButtonEnable(FALSE);
+  if (!bUpEnable && !bDownEnable) {
+    return;
+  }
+  CFWL_EvtSpbClick wmPosChanged;
+  wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface;
+  wmPosChanged.m_bUp = bUpEnable;
+  m_pOwner->DispatchEvent(&wmPosChanged);
+  m_pOwner->Repaint(bUpEnable ? &m_pOwner->m_rtUpButton
+                              : &m_pOwner->m_rtDnButton);
+}
diff --git a/xfa/fwl/basewidget/fwl_spinbuttonimp.h b/xfa/fwl/basewidget/fwl_spinbuttonimp.h
new file mode 100644
index 0000000..d8eb596
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_spinbuttonimp.h
@@ -0,0 +1,69 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+class CFWL_WidgetImpProperties;
+class CFWL_SpinButtonImpDelegate;
+
+class CFWL_SpinButtonImp : public CFWL_WidgetImp, public IFWL_Timer {
+ public:
+  CFWL_SpinButtonImp(const CFWL_WidgetImpProperties& properties,
+                     IFWL_Widget* pOuter);
+  ~CFWL_SpinButtonImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual int32_t Run(FWL_HTIMER hTimer);
+  FWL_ERR EnableButton(FX_BOOL bEnable, FX_BOOL bUp = TRUE);
+  FX_BOOL IsButtonEnable(FX_BOOL bUp = TRUE);
+
+ protected:
+  void DrawUpButton(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix);
+  void DrawDownButton(CFX_Graphics* pGraphics,
+                      IFWL_ThemeProvider* pTheme,
+                      const CFX_Matrix* pMatrix);
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtUpButton;
+  CFX_RectF m_rtDnButton;
+  FX_DWORD m_dwUpState;
+  FX_DWORD m_dwDnState;
+  int32_t m_iButtonIndex;
+  FX_BOOL m_bLButtonDwn;
+  FWL_HTIMER m_hTimer;
+  friend class CFWL_SpinButtonImpDelegate;
+};
+class CFWL_SpinButtonImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_SpinButtonImpDelegate(CFWL_SpinButtonImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  CFWL_SpinButtonImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
diff --git a/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
new file mode 100644
index 0000000..3d545e6
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
@@ -0,0 +1,293 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fwl_tooltipctrlimp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+// static
+IFWL_ToolTip* IFWL_ToolTip::Create(const CFWL_WidgetImpProperties& properties,
+                                   IFWL_Widget* pOuter) {
+  IFWL_ToolTip* pToolTip = new IFWL_ToolTip;
+  CFWL_ToolTipImp* pToolTipImpl = new CFWL_ToolTipImp(properties, pOuter);
+  pToolTip->SetImpl(pToolTipImpl);
+  pToolTipImpl->SetInterface(pToolTip);
+  return pToolTip;
+}
+FWL_ERR IFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
+  return static_cast<CFWL_ToolTipImp*>(GetImpl())->SetAnchor(rtAnchor);
+}
+FWL_ERR IFWL_ToolTip::Show() {
+  return static_cast<CFWL_ToolTipImp*>(GetImpl())->Show();
+}
+FWL_ERR IFWL_ToolTip::Hide() {
+  return static_cast<CFWL_ToolTipImp*>(GetImpl())->Hide();
+}
+IFWL_ToolTip::IFWL_ToolTip() {}
+CFWL_ToolTipImp::CFWL_ToolTipImp(const CFWL_WidgetImpProperties& properties,
+                                 IFWL_Widget* pOuter)
+    : CFWL_FormImp(properties, pOuter),
+      m_bBtnDown(FALSE),
+      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
+      m_iTTOAlign(FDE_TTOALIGNMENT_Center),
+      m_hTimerShow(NULL),
+      m_hTimerHide(NULL),
+      m_pTimer(NULL) {
+  m_rtClient.Set(0, 0, 0, 0);
+  m_rtCaption.Set(0, 0, 0, 0);
+  m_rtAnchor.Set(0, 0, 0, 0);
+  m_TimerShow.m_pToolTip = this;
+  m_TimerHide.m_pToolTip = this;
+}
+CFWL_ToolTipImp::~CFWL_ToolTipImp() {
+  if (m_pTimer) {
+    delete m_pTimer;
+    m_pTimer = NULL;
+  }
+}
+FWL_ERR CFWL_ToolTipImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_ToolTip;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_ToolTipImp::GetClassID() const {
+  return FWL_CLASSHASH_ToolTip;
+}
+FWL_ERR CFWL_ToolTipImp::Initialize() {
+  m_pProperties->m_dwStyles |= FWL_WGTSTYLE_Popup;
+  m_pProperties->m_dwStyles &= ~FWL_WGTSTYLE_Child;
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_ToolTipImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTipImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_ToolTipImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Set(0, 0, 0, 0);
+    if (m_pProperties->m_pThemeProvider == NULL) {
+      m_pProperties->m_pThemeProvider = GetAvailableTheme();
+    }
+    CFX_WideString wsCaption;
+    IFWL_ToolTipDP* pData =
+        static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
+    if (pData) {
+      pData->GetCaption(m_pInterface, wsCaption);
+    }
+    int32_t iLen = wsCaption.GetLength();
+    if (iLen > 0) {
+      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
+      rect.Set(0, 0, sz.x, sz.y);
+      rect.width += FWL_WGTCAPACITY_CXBorder * 25;
+      rect.height += FWL_WGTCAPACITY_CYBorder * 8;
+    }
+    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTipImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+  UpdateTextOutStyles();
+  GetClientRect(m_rtClient);
+  m_rtCaption = m_rtClient;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTipImp::GetClientRect(CFX_RectF& rect) {
+  FX_FLOAT x = 0;
+  FX_FLOAT y = 0;
+  FX_FLOAT t = 0;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (pTheme) {
+    CFWL_ThemePart part;
+    part.m_pWidget = m_pInterface;
+    x = *static_cast<FX_FLOAT*>(
+        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder));
+    y = *static_cast<FX_FLOAT*>(
+        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder));
+  }
+  rect = m_pProperties->m_rtWidget;
+  rect.Offset(-rect.left, -rect.top);
+  rect.Deflate(x, t, x, y);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTipImp::DrawWidget(CFX_Graphics* pGraphics,
+                                    const CFX_Matrix* pMatrix) {
+  IFWL_ToolTipTarget* toolTipTarget =
+      CFWL_ToolTipContainer::getInstance()->GetCurrentToolTipTarget();
+  if (toolTipTarget && !toolTipTarget->UseDefaultTheme()) {
+    return toolTipTarget->DrawToolTip(pGraphics, pMatrix, m_pInterface);
+  }
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  DrawBkground(pGraphics, pTheme, pMatrix);
+  DrawText(pGraphics, pTheme, pMatrix);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_ToolTipImp::DrawBkground(CFX_Graphics* pGraphics,
+                                   IFWL_ThemeProvider* pTheme,
+                                   const CFX_Matrix* pMatrix) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_TTP_Background;
+  param.m_dwStates = m_pProperties->m_dwStates;
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  param.m_rtPart = m_rtClient;
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    param.m_pData = &m_rtCaption;
+  }
+  pTheme->DrawBackground(&param);
+}
+void CFWL_ToolTipImp::DrawText(CFX_Graphics* pGraphics,
+                               IFWL_ThemeProvider* pTheme,
+                               const CFX_Matrix* pMatrix) {
+  if (!m_pProperties->m_pDataProvider)
+    return;
+  CFX_WideString wsCaption;
+  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
+  if (wsCaption.IsEmpty()) {
+    return;
+  }
+  CFWL_ThemeText param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_TTP_Caption;
+  param.m_dwStates = m_pProperties->m_dwStates;
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  param.m_rtPart = m_rtCaption;
+  param.m_wsText = wsCaption;
+  param.m_dwTTOStyles = m_dwTTOStyles;
+  param.m_iTTOAlign = m_iTTOAlign;
+  pTheme->DrawText(&param);
+}
+void CFWL_ToolTipImp::UpdateTextOutStyles() {
+  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
+  m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
+  }
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_Multiline) {
+    m_dwTTOStyles &= ~FDE_TTOSTYLE_SingleLine;
+  }
+}
+FWL_ERR CFWL_ToolTipImp::SetAnchor(const CFX_RectF& rtAnchor) {
+  m_rtAnchor = rtAnchor;
+  return TRUE;
+}
+FWL_ERR CFWL_ToolTipImp::Show() {
+  IFWL_ToolTipDP* pData =
+      static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
+  int32_t nInitDelay = pData->GetInitialDelay(m_pInterface);
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible)) {
+    m_hTimerShow = FWL_StartTimer(&m_TimerShow, nInitDelay, FALSE);
+  }
+  return TRUE;
+}
+FWL_ERR CFWL_ToolTipImp::Hide() {
+  SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  if (m_hTimerHide) {
+    FWL_StopTimer(m_hTimerHide);
+    m_hTimerHide = NULL;
+  }
+  if (m_hTimerShow) {
+    FWL_StopTimer(m_hTimerShow);
+    m_hTimerShow = NULL;
+  }
+  return TRUE;
+}
+FWL_ERR CFWL_ToolTipImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  if ((dwStates & FWL_WGTSTATE_Invisible) && !bSet) {
+    IFWL_ToolTipDP* pData =
+        static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
+    int32_t nAutoPopDelay = pData->GetAutoPopDelay(m_pInterface);
+    m_hTimerHide = FWL_StartTimer(&m_TimerHide, nAutoPopDelay, FALSE);
+  }
+  return CFWL_WidgetImp::SetStates(dwStates, bSet);
+}
+void CFWL_ToolTipImp::RefreshToolTipPos() {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_NoAnchor) == 0) {
+    CFX_RectF rtPopup;
+    CFX_RectF rtWidget(m_pProperties->m_rtWidget);
+    CFX_RectF rtAnchor(m_rtAnchor);
+    rtPopup.Set(0, 0, 0, 0);
+    FX_FLOAT fx = rtAnchor.Center().x + 20;
+    FX_FLOAT fy = rtAnchor.Center().y + 20;
+    rtPopup.Set(fx, fy, rtWidget.Width(), rtWidget.Height());
+    FX_FLOAT fScreenWidth = 0;
+    FX_FLOAT fScreenHeight = 0;
+    GetScreenSize(fScreenWidth, fScreenHeight);
+    if (rtPopup.bottom() > fScreenHeight) {
+      rtPopup.Offset(0, fScreenHeight - rtPopup.bottom());
+    }
+    if (rtPopup.right() > fScreenWidth) {
+      rtPopup.Offset(fScreenWidth - rtPopup.right(), 0);
+    }
+    if (rtPopup.left < 0) {
+      rtPopup.Offset(0 - rtPopup.left, 0);
+    }
+    if (rtPopup.top < 0) {
+      rtPopup.Offset(0, 0 - rtPopup.top);
+    }
+    SetWidgetRect(rtPopup);
+    Update();
+  }
+}
+CFWL_ToolTipImp::CFWL_ToolTipTimer::CFWL_ToolTipTimer(CFWL_ToolTipImp* pToolTip)
+    : m_pToolTip(pToolTip) {}
+int32_t CFWL_ToolTipImp::CFWL_ToolTipTimer::Run(FWL_HTIMER hTimer) {
+  if (m_pToolTip->m_hTimerShow == hTimer && m_pToolTip->m_hTimerShow) {
+    if (m_pToolTip->GetStates() & FWL_WGTSTATE_Invisible) {
+      m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, FALSE);
+      m_pToolTip->RefreshToolTipPos();
+      FWL_StopTimer(m_pToolTip->m_hTimerShow);
+      m_pToolTip->m_hTimerShow = NULL;
+      return TRUE;
+    }
+  }
+  if (m_pToolTip->m_hTimerHide == hTimer && m_pToolTip->m_hTimerHide) {
+    m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+    FWL_StopTimer(m_pToolTip->m_hTimerHide);
+    m_pToolTip->m_hTimerHide = NULL;
+    return TRUE;
+  }
+  return TRUE;
+}
+CFWL_ToolTipImpDelegate::CFWL_ToolTipImpDelegate(CFWL_ToolTipImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_ToolTipImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+}
+FWL_ERR CFWL_ToolTipImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTipImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                              const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fwl/basewidget/fwl_tooltipctrlimp.h b/xfa/fwl/basewidget/fwl_tooltipctrlimp.h
new file mode 100644
index 0000000..42fe276
--- /dev/null
+++ b/xfa/fwl/basewidget/fwl_tooltipctrlimp.h
@@ -0,0 +1,86 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
+#define XFA_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
+
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class CFWL_ToolTipImpDelegate;
+
+class CFWL_ToolTipImp : public CFWL_FormImp {
+ public:
+  CFWL_ToolTipImp(const CFWL_WidgetImpProperties& properties,
+                  IFWL_Widget* pOuter);
+  virtual ~CFWL_ToolTipImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet);
+  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
+  FWL_ERR SetAnchor(const CFX_RectF& rtAnchor);
+  FWL_ERR Show();
+  FWL_ERR Hide();
+
+ protected:
+  void DrawBkground(CFX_Graphics* pGraphics,
+                    IFWL_ThemeProvider* pTheme,
+                    const CFX_Matrix* pMatrix);
+  void DrawText(CFX_Graphics* pGraphics,
+                IFWL_ThemeProvider* pTheme,
+                const CFX_Matrix* pMatrix);
+  void UpdateTextOutStyles();
+  void RefreshToolTipPos();
+  class CFWL_ToolTipTimer : public IFWL_Timer {
+   public:
+    CFWL_ToolTipTimer() {}
+    ~CFWL_ToolTipTimer() {}
+    CFWL_ToolTipTimer(CFWL_ToolTipImp* pToolTip);
+    virtual int32_t Run(FWL_HTIMER hTimer);
+    CFWL_ToolTipImp* m_pToolTip;
+  };
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtCaption;
+  FX_BOOL m_bBtnDown;
+  FX_DWORD m_dwTTOStyles;
+  int32_t m_iTTOAlign;
+  CFX_RectF m_rtAnchor;
+  FWL_HTIMER m_hTimerShow;
+  FWL_HTIMER m_hTimerHide;
+  CFWL_ToolTipTimer* m_pTimer;
+  CFWL_ToolTipTimer m_TimerShow;
+  CFWL_ToolTipTimer m_TimerHide;
+  friend class CFWL_ToolTipImpDelegate;
+  friend class CFWL_ToolTipTimer;
+};
+class CFWL_ToolTipImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_ToolTipImpDelegate(CFWL_ToolTipImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnKeyDown(CFWL_MsgKey* pMsg);
+  CFWL_ToolTipImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
diff --git a/xfa/fwl/basewidget/fxmath_barcodeimp.cpp b/xfa/fwl/basewidget/fxmath_barcodeimp.cpp
new file mode 100644
index 0000000..c27805e
--- /dev/null
+++ b/xfa/fwl/basewidget/fxmath_barcodeimp.cpp
@@ -0,0 +1,385 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/basewidget/fxmath_barcodeimp.h"
+
+static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type) {
+  switch (type) {
+    case BC_CODE39:
+      return new CBC_Code39();
+    case BC_CODABAR:
+      return new CBC_Codabar();
+    case BC_CODE128:
+      return new CBC_Code128(BC_CODE128_B);
+    case BC_CODE128_B:
+      return new CBC_Code128(BC_CODE128_B);
+    case BC_CODE128_C:
+      return new CBC_Code128(BC_CODE128_C);
+    case BC_EAN8:
+      return new CBC_EAN8();
+    case BC_UPCA:
+      return new CBC_UPCA();
+    case BC_EAN13:
+      return new CBC_EAN13();
+    case BC_QR_CODE:
+      return new CBC_QRCode();
+    case BC_PDF417:
+      return new CBC_PDF417I();
+    case BC_DATAMATRIX:
+      return new CBC_DataMatrix();
+    case BC_UNKNOWN:
+    default:
+      return NULL;
+  }
+}
+CFX_Barcode::CFX_Barcode() {}
+CFX_Barcode::~CFX_Barcode() {
+  if (m_pBCEngine) {
+    delete m_pBCEngine;
+    m_pBCEngine = NULL;
+  }
+}
+FX_BOOL CFX_Barcode::Crreate(BC_TYPE type) {
+  m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type);
+  return m_pBCEngine != NULL;
+}
+void CFX_Barcode::Release() {
+  delete this;
+}
+BC_TYPE CFX_Barcode::GetType() {
+  return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN;
+}
+FX_BOOL CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) {
+  return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetModuleHeight(int32_t moduleHeight) {
+  return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetModuleWidth(int32_t moduleWidth) {
+  return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetHeight(int32_t height) {
+  return m_pBCEngine ? m_pBCEngine->SetHeight(height) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetWidth(int32_t width) {
+  return m_pBCEngine ? m_pBCEngine->SetWidth(width) : FALSE;
+}
+FX_BOOL CFX_Barcode::CheckContentValidity(const CFX_WideStringC& contents) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine
+                 ? static_cast<CBC_OneCode*>(m_pBCEngine)
+                       ->CheckContentValidity(contents)
+                 : TRUE;
+    default:
+      return TRUE;
+  }
+}
+FX_BOOL CFX_Barcode::SetPrintChecksum(FX_BOOL checksum) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+                                ->SetPrintChecksum(checksum),
+                            TRUE)
+                         : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetDataLength(int32_t length) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+                                ->SetDataLength(length),
+                            TRUE)
+                         : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetCalChecksum(int32_t state) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+                                ->SetCalChecksum(state),
+                            TRUE)
+                         : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetFont(CFX_Font* pFont) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine
+                 ? static_cast<CBC_OneCode*>(m_pBCEngine)->SetFont(pFont)
+                 : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetFontSize(FX_FLOAT size) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine
+                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontSize(size),
+                    TRUE)
+                 : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetFontStyle(int32_t style) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine
+                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontStyle(style),
+                    TRUE)
+                 : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetFontColor(FX_ARGB color) {
+  switch (GetType()) {
+    case BC_CODE39:
+    case BC_CODABAR:
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+    case BC_EAN8:
+    case BC_EAN13:
+    case BC_UPCA:
+      return m_pBCEngine
+                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontColor(color),
+                    TRUE)
+                 : FALSE;
+    default:
+      return FALSE;
+  }
+}
+FX_BOOL CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_CODE39:
+      memptr = (memptrtype)&CBC_Code39::SetTextLocation;
+      break;
+    case BC_CODABAR:
+      memptr = (memptrtype)&CBC_Codabar::SetTextLocation;
+      break;
+    case BC_CODE128:
+    case BC_CODE128_B:
+    case BC_CODE128_C:
+      memptr = (memptrtype)&CBC_Code128::SetTextLocation;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetWideNarrowRatio(int32_t ratio) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_CODE39:
+      memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio;
+      break;
+    case BC_CODABAR:
+      memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_CODABAR:
+      memptr = (memptrtype)&CBC_Codabar::SetStartChar;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_CODABAR:
+      memptr = (memptrtype)&CBC_Codabar::SetEndChar;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetVersion(int32_t version) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_QR_CODE:
+      memptr = (memptrtype)&CBC_QRCode::SetVersion;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(int32_t level) {
+  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_QR_CODE:
+      memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel;
+      break;
+    case BC_PDF417:
+      memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel;
+      break;
+    default:
+      return FALSE;
+  }
+  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level) : FALSE;
+}
+FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated) {
+  typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL);
+  memptrtype memptr = NULL;
+  switch (GetType()) {
+    case BC_PDF417:
+      memptr = (memptrtype)&CBC_PDF417I::SetTruncated;
+      break;
+    default:
+      break;
+  }
+  return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE)
+                               : FALSE;
+}
+#ifndef BCExceptionNO
+#define BCExceptionNO 0
+#endif
+#ifndef BCExceptionFormatException
+#define BCExceptionFormatException 8
+#endif
+#ifndef BCExceptionUnSupportedBarcode
+#define BCExceptionUnSupportedBarcode 18
+#endif
+FX_BOOL CFX_Barcode::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  if (!m_pBCEngine) {
+    return FALSE;
+  }
+  return m_pBCEngine->Encode(contents, isDevice, e);
+}
+FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  if (!m_pBCEngine) {
+    return FALSE;
+  }
+  return m_pBCEngine->RenderDevice(device, matirx, e);
+}
+FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  if (!m_pBCEngine) {
+    return FALSE;
+  }
+  return m_pBCEngine->RenderBitmap(pOutBitmap, e);
+}
+#define BC_TYPE_MIN BC_CODE39
+#define BC_TYPE_MAX BC_DATAMATRIX
+CFX_WideString CFX_Barcode::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t height,
+                                   int32_t& errorCode) {
+  for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX;
+       t = (BC_TYPE)((int32_t)t + 1)) {
+    CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);
+    if (!pTmpEngine) {
+      continue;
+    }
+    CFX_WideString ret = pTmpEngine->Decode(buf, width, height, errorCode);
+    if (errorCode == BCExceptionNO) {
+      return ret;
+    }
+  }
+  errorCode = BCExceptionUnSupportedBarcode;
+  return CFX_WideString();
+}
+CFX_WideString CFX_Barcode::Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode) {
+  for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX;
+       t = (BC_TYPE)((int32_t)t + 1)) {
+    CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);
+    if (!pTmpEngine) {
+      continue;
+    }
+    CFX_WideString ret = pTmpEngine->Decode(pBitmap, errorCode);
+    if (errorCode == BCExceptionNO) {
+      return ret;
+    }
+  }
+  errorCode = BCExceptionUnSupportedBarcode;
+  return CFX_WideString();
+}
+IFX_Barcode* FX_Barcode_Create(BC_TYPE type) {
+  CFX_Barcode* pBarcode = new CFX_Barcode;
+  if (pBarcode->Crreate(type)) {
+    return pBarcode;
+  }
+  pBarcode->Release();
+  return NULL;
+}
diff --git a/xfa/fwl/basewidget/fxmath_barcodeimp.h b/xfa/fwl/basewidget/fxmath_barcodeimp.h
new file mode 100644
index 0000000..a26761e
--- /dev/null
+++ b/xfa/fwl/basewidget/fxmath_barcodeimp.h
@@ -0,0 +1,56 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
+#define XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
+
+#include "xfa/include/fwl/basewidget/fxmath_barcode.h"
+
+class CFX_Barcode : public IFX_Barcode {
+ public:
+  CFX_Barcode();
+  ~CFX_Barcode();
+  FX_BOOL Crreate(BC_TYPE type);
+  virtual void Release();
+  virtual BC_TYPE GetType();
+  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e);
+  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e);
+  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+  virtual CFX_WideString Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t height,
+                                int32_t& errorCode);
+  virtual CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode);
+  virtual FX_BOOL SetCharEncoding(BC_CHAR_ENCODING encoding);
+  virtual FX_BOOL SetModuleHeight(int32_t moduleHeight);
+  virtual FX_BOOL SetModuleWidth(int32_t moduleWidth);
+  virtual FX_BOOL SetHeight(int32_t height);
+  virtual FX_BOOL SetWidth(int32_t width);
+  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  virtual FX_BOOL SetPrintChecksum(FX_BOOL checksum);
+  virtual FX_BOOL SetDataLength(int32_t length);
+  virtual FX_BOOL SetCalChecksum(int32_t state);
+  virtual FX_BOOL SetFont(CFX_Font* pFont);
+  virtual FX_BOOL SetFontSize(FX_FLOAT size);
+  virtual FX_BOOL SetFontStyle(int32_t style);
+  virtual FX_BOOL SetFontColor(FX_ARGB color);
+  virtual FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  virtual FX_BOOL SetWideNarrowRatio(int32_t ratio);
+  virtual FX_BOOL SetStartChar(FX_CHAR start);
+  virtual FX_BOOL SetEndChar(FX_CHAR end);
+  virtual FX_BOOL SetVersion(int32_t version);
+  virtual FX_BOOL SetErrorCorrectionLevel(int32_t level);
+  virtual FX_BOOL SetTruncated(FX_BOOL truncated);
+
+ protected:
+  CBC_CodeBase* m_pBCEngine;
+};
+
+#endif  // XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
diff --git a/xfa/fwl/core/fwl_appimp.cpp b/xfa/fwl/core/fwl_appimp.cpp
new file mode 100644
index 0000000..3163486
--- /dev/null
+++ b/xfa/fwl/core/fwl_appimp.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_appimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+IFWL_App* IFWL_App::Create(IFWL_AdapterNative* pAdapter) {
+  IFWL_App* pApp = new IFWL_App;
+  pApp->SetImpl(new CFWL_AppImp(pApp, pAdapter));
+  return pApp;
+}
+FWL_ERR IFWL_App::Initialize() {
+  return static_cast<CFWL_AppImp*>(GetImpl())->Initialize();
+}
+FWL_ERR IFWL_App::Finalize() {
+  return static_cast<CFWL_AppImp*>(GetImpl())->Finalize();
+}
+IFWL_AdapterNative* IFWL_App::GetAdapterNative() {
+  return static_cast<CFWL_AppImp*>(GetImpl())->GetAdapterNative();
+}
+IFWL_WidgetMgr* IFWL_App::GetWidgetMgr() {
+  return static_cast<CFWL_AppImp*>(GetImpl())->GetWidgetMgr();
+}
+IFWL_ThemeProvider* IFWL_App::GetThemeProvider() {
+  return static_cast<CFWL_AppImp*>(GetImpl())->GetThemeProvider();
+}
+FWL_ERR IFWL_App::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  return static_cast<CFWL_AppImp*>(GetImpl())->SetThemeProvider(pThemeProvider);
+}
+FWL_ERR IFWL_App::Exit(int32_t iExitCode) {
+  return static_cast<CFWL_AppImp*>(GetImpl())->Exit(iExitCode);
+}
+
+CFWL_AppImp::CFWL_AppImp(IFWL_App* pIface, IFWL_AdapterNative* pAdapter)
+    : CFWL_NoteThreadImp(pIface),
+      m_pAdapterNative(pAdapter),
+      m_pThemeProvider(nullptr) {}
+
+CFWL_AppImp::~CFWL_AppImp() {
+  CFWL_ToolTipContainer::DeleteInstance();
+}
+
+FWL_ERR CFWL_AppImp::Initialize() {
+  if (!m_pWidgetMgr) {
+    m_pWidgetMgr.reset(new CFWL_WidgetMgr(m_pAdapterNative));
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_AppImp::Finalize() {
+  m_pWidgetMgr.reset();
+  return FWL_ERR_Succeeded;
+}
+IFWL_AdapterNative* CFWL_AppImp::GetAdapterNative() const {
+  return m_pAdapterNative;
+}
+IFWL_AdapterWidgetMgr* FWL_GetAdapterWidgetMgr() {
+  return static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr())
+      ->GetAdapterWidgetMgr();
+}
+IFWL_WidgetMgr* CFWL_AppImp::GetWidgetMgr() const {
+  return m_pWidgetMgr.get();
+}
+FWL_ERR CFWL_AppImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  m_pThemeProvider = pThemeProvider;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_AppImp::Exit(int32_t iExitCode) {
+  while (m_pNoteDriver->PopNoteLoop()) {
+    continue;
+  }
+  return m_pWidgetMgr->GetAdapterWidgetMgr()->Exit(0);
+}
+IFWL_ThemeProvider* CFWL_AppImp::GetThemeProvider() const {
+  return m_pThemeProvider;
+}
+IFWL_AdapterNative* FWL_GetAdapterNative() {
+  IFWL_App* pApp = FWL_GetApp();
+  if (!pApp)
+    return NULL;
+  return pApp->GetAdapterNative();
+}
+IFWL_ThemeProvider* FWL_GetThemeProvider() {
+  return NULL;
+}
+static IFWL_App* _theApp = NULL;
+IFWL_App* FWL_GetApp() {
+  return _theApp;
+}
+void FWL_SetApp(IFWL_App* pApp) {
+  _theApp = pApp;
+}
+FWL_ERR FWL_SetFullScreen(IFWL_Widget* pWidget, FX_BOOL bFullScreen) {
+  if (!pWidget)
+    return FWL_ERR_Succeeded;
+  IFWL_NoteThread* pNoteTread = pWidget->GetOwnerThread();
+  if (!pNoteTread)
+    return FWL_ERR_Succeeded;
+  CFWL_NoteDriver* pNoteDriver =
+      static_cast<CFWL_NoteDriver*>(pNoteTread->GetNoteDriver());
+  if (!pNoteTread)
+    return FWL_ERR_Succeeded;
+  pNoteDriver->NotifyFullScreenMode(pWidget, bFullScreen);
+  return FWL_GetAdapterWidgetMgr()->SetFullScreen(pWidget, bFullScreen);
+}
diff --git a/xfa/fwl/core/fwl_appimp.h b/xfa/fwl/core/fwl_appimp.h
new file mode 100644
index 0000000..f9ccabf
--- /dev/null
+++ b/xfa/fwl/core/fwl_appimp.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_APPIMP_H_
+#define XFA_FWL_CORE_FWL_APPIMP_H_
+
+#include <memory>
+
+#include "xfa/fwl/core/fwl_threadimp.h"
+
+class CFWL_WidgetMgr;
+class IFWL_AdapterNative;
+class IFWL_WidgetMgr;
+class IFWL_ThemeProvider;
+class IFWL_App;
+
+class CFWL_AppImp : public CFWL_NoteThreadImp {
+ public:
+  CFWL_AppImp(IFWL_App* pIface, IFWL_AdapterNative* pAdapter);
+  virtual ~CFWL_AppImp();
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual IFWL_AdapterNative* GetAdapterNative() const;
+  virtual IFWL_WidgetMgr* GetWidgetMgr() const;
+  virtual IFWL_ThemeProvider* GetThemeProvider() const;
+  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
+  virtual FWL_ERR Exit(int32_t iExitCode = 0);
+
+ protected:
+  IFWL_AdapterNative* const m_pAdapterNative;
+  std::unique_ptr<CFWL_WidgetMgr> m_pWidgetMgr;
+  IFWL_ThemeProvider* m_pThemeProvider;
+};
+
+#endif  // XFA_FWL_CORE_FWL_APPIMP_H_
diff --git a/xfa/fwl/core/fwl_contentimp.cpp b/xfa/fwl/core/fwl_contentimp.cpp
new file mode 100644
index 0000000..a38998f
--- /dev/null
+++ b/xfa/fwl/core/fwl_contentimp.cpp
@@ -0,0 +1,94 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_contentimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/core/fwl_content.h"
+
+FWL_ERR IFWL_Content::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->InsertWidget(pChild, nIndex);
+}
+FWL_ERR IFWL_Content::RemoveWidget(IFWL_Widget* pWidget) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->RemoveWidget(pWidget);
+}
+FWL_ERR IFWL_Content::RemoveAllWidgets() {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->RemoveAllWidgets();
+}
+FWL_ERR IFWL_Content::GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->GetMinSize(fWidth, fHeight);
+}
+FWL_ERR IFWL_Content::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->SetMinSize(fWidth, fHeight);
+}
+FWL_ERR IFWL_Content::GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->GetMaxSize(fWidth, fHeight);
+}
+FWL_ERR IFWL_Content::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
+  return static_cast<CFWL_ContentImp*>(GetImpl())->SetMaxSize(fWidth, fHeight);
+}
+IFWL_Content::IFWL_Content() {}
+CFWL_ContentImp::CFWL_ContentImp(const CFWL_WidgetImpProperties& properties,
+                                 IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_fWidthMin(0),
+      m_fWidthMax(10000),
+      m_fHeightMin(0),
+      m_fHeightMax(10000) {}
+CFWL_ContentImp::~CFWL_ContentImp() {}
+FWL_ERR CFWL_ContentImp::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
+  if (!pChild)
+    return FWL_ERR_Indefinite;
+  pChild->SetParent(m_pInterface);
+  if (nIndex == -1) {
+    return FWL_ERR_Succeeded;
+  }
+  CFWL_WidgetMgr* pMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pMgr)
+    return FWL_ERR_Indefinite;
+  pMgr->SetWidgetIndex(pChild, nIndex);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::RemoveWidget(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FWL_ERR_Indefinite;
+  pWidget->SetParent(NULL);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::RemoveAllWidgets() {
+  CFWL_WidgetMgr* pMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pMgr)
+    return FWL_ERR_Indefinite;
+  while (IFWL_Widget* widget =
+             pMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild)) {
+    pMgr->SetParent(NULL, widget);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
+  fWidth = m_fWidthMin;
+  fHeight = m_fHeightMin;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
+  m_fWidthMin = fWidth;
+  m_fHeightMin = fHeight;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
+  fWidth = m_fWidthMax;
+  fHeight = m_fHeightMax;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ContentImp::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
+  m_fWidthMax = fWidth;
+  m_fHeightMax = fHeight;
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/core/fwl_contentimp.h b/xfa/fwl/core/fwl_contentimp.h
new file mode 100644
index 0000000..b7a44d3
--- /dev/null
+++ b/xfa/fwl/core/fwl_contentimp.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_CONTENTIMP_H_
+#define XFA_FWL_CORE_FWL_CONTENTIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class IFWL_Widget;
+
+class CFWL_ContentImp : public CFWL_WidgetImp {
+ public:
+  CFWL_ContentImp(const CFWL_WidgetImpProperties& properties,
+                  IFWL_Widget* pOuter);
+
+  virtual ~CFWL_ContentImp();
+  virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
+  virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
+  virtual FWL_ERR RemoveAllWidgets();
+  FWL_ERR GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
+  FWL_ERR SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
+  FWL_ERR GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
+  FWL_ERR SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
+
+ protected:
+  FX_FLOAT m_fWidthMin;
+  FX_FLOAT m_fWidthMax;
+  FX_FLOAT m_fHeightMin;
+  FX_FLOAT m_fHeightMax;
+};
+
+#endif  // XFA_FWL_CORE_FWL_CONTENTIMP_H_
diff --git a/xfa/fwl/core/fwl_formimp.cpp b/xfa/fwl/core/fwl_formimp.cpp
new file mode 100644
index 0000000..a321431
--- /dev/null
+++ b/xfa/fwl/core/fwl_formimp.cpp
@@ -0,0 +1,1175 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_formimp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/basewidget/fwl_formproxyimp.h"
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_content.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+#define FWL_SYSBTNSIZE 21
+#define FWL_SYSBTNMARGIN 5
+#define FWL_SYSBTNSPAN 2
+#define FWL_CornerEnlarge 10
+
+// static
+IFWL_Form* IFWL_Form::CreateFormProxy(CFWL_WidgetImpProperties& properties,
+                                      CFX_WideString* classname,
+                                      IFWL_Widget* pOuter) {
+  IFWL_Form* pForm = new IFWL_Form;
+  CFWL_FormProxyImp* pFormProxyImpl = new CFWL_FormProxyImp(properties, pOuter);
+  pForm->SetImpl(pFormProxyImpl);
+  pFormProxyImpl->SetInterface(pForm);
+  return pForm;
+}
+IFWL_Form::IFWL_Form() {}
+FWL_FORMSIZE IFWL_Form::GetFormSize() {
+  return static_cast<CFWL_FormImp*>(GetImpl())->GetFormSize();
+}
+FWL_ERR IFWL_Form::SetFormSize(FWL_FORMSIZE eFormSize) {
+  return static_cast<CFWL_FormImp*>(GetImpl())->SetFormSize(eFormSize);
+}
+IFWL_Widget* IFWL_Form::DoModal() {
+  return static_cast<CFWL_FormImp*>(GetImpl())->DoModal();
+}
+IFWL_Widget* IFWL_Form::DoModal(FX_DWORD& dwCommandID) {
+  return static_cast<CFWL_FormImp*>(GetImpl())->DoModal(dwCommandID);
+}
+FWL_ERR IFWL_Form::EndDoModal() {
+  return static_cast<CFWL_FormImp*>(GetImpl())->EndDoModal();
+}
+FWL_ERR IFWL_Form::SetBorderRegion(CFX_Path* pPath) {
+  return static_cast<CFWL_FormImp*>(GetImpl())->SetBorderRegion(pPath);
+}
+
+CFWL_FormImp::CFWL_FormImp(const CFWL_WidgetImpProperties& properties,
+                           IFWL_Widget* pOuter)
+    : CFWL_PanelImp(properties, pOuter),
+      m_pCloseBox(NULL),
+      m_pMinBox(NULL),
+      m_pMaxBox(NULL),
+      m_pCaptionBox(NULL),
+      m_pNoteLoop(NULL),
+      m_pSubFocus(NULL),
+      m_fCXBorder(0),
+      m_fCYBorder(0),
+      m_iCaptureBtn(-1),
+      m_iSysBox(0),
+      m_eResizeType(FORM_RESIZETYPE_None),
+      m_bLButtonDown(FALSE),
+      m_bMaximized(FALSE),
+      m_bSetMaximize(FALSE),
+      m_bCustomizeLayout(FALSE),
+      m_eFormSize(FWL_FORMSIZE_Manual),
+      m_bDoModalFlag(FALSE),
+      m_pBigIcon(NULL),
+      m_pSmallIcon(NULL),
+      m_bMouseIn(FALSE) {
+  m_rtRelative.Reset();
+  m_rtCaption.Reset();
+  m_rtRestore.Reset();
+  m_rtCaptionText.Reset();
+  m_rtIcon.Reset();
+}
+CFWL_FormImp::~CFWL_FormImp() {
+  RemoveSysButtons();
+  delete m_pNoteLoop;
+}
+FWL_ERR CFWL_FormImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Form;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_FormImp::GetClassID() const {
+  return FWL_CLASSHASH_Form;
+}
+FX_BOOL CFWL_FormImp::IsInstance(const CFX_WideStringC& wsClass) const {
+  if (wsClass == CFX_WideStringC(FWL_CLASS_Form)) {
+    return TRUE;
+  }
+  return CFWL_PanelImp::IsInstance(wsClass);
+}
+FWL_ERR CFWL_FormImp::Initialize() {
+  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  RegisterForm();
+  RegisterEventTarget();
+  m_pDelegate = new CFWL_FormImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_FormImp::Finalize() {
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  UnregisterEventTarget();
+  UnRegisterForm();
+  return CFWL_WidgetImp::Finalize();
+}
+FWL_ERR CFWL_FormImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.Reset();
+    FX_FLOAT fCapHeight = GetCaptionHeight();
+    FX_FLOAT fCXBorder = GetBorderSize(TRUE);
+    FX_FLOAT fCYBorder = GetBorderSize(FALSE);
+    FX_FLOAT fEdge = GetEdgeWidth();
+    if (m_pContent) {
+      m_pContent->GetWidgetRect(rect, TRUE);
+    }
+    rect.height += fCapHeight + fCYBorder + fEdge + fEdge;
+    rect.width += fCXBorder + fCXBorder + fEdge + fEdge;
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_FormImp::GetClientRect(CFX_RectF& rect) {
+  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) == 0) {
+    rect = m_pProperties->m_rtWidget;
+    rect.Offset(-rect.left, -rect.top);
+    return FWL_ERR_Succeeded;
+  }
+#ifdef FWL_UseMacSystemBorder
+  rect = m_rtRelative;
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return FWL_ERR_Indefinite;
+  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
+  FX_FLOAT l, t, r, b;
+  l = t = r = b = 0;
+  adapterWidgetMgr->GetSystemBorder(l, t, r, b);
+  rect.Deflate(l, t, r, b);
+  rect.left = rect.top = 0;
+  return FWL_ERR_Succeeded;
+#else
+  FX_FLOAT x = 0;
+  FX_FLOAT y = 0;
+  FX_FLOAT t = 0;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (pTheme) {
+    CFWL_ThemePart part;
+    part.m_pWidget = m_pInterface;
+    x = *static_cast<FX_FLOAT*>(
+        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder));
+    y = *static_cast<FX_FLOAT*>(
+        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder));
+    t = *static_cast<FX_FLOAT*>(
+        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FRM_CYCaption));
+  }
+  rect = m_pProperties->m_rtWidget;
+  rect.Offset(-rect.left, -rect.top);
+  rect.Deflate(x, t, x, y);
+  return FWL_ERR_Succeeded;
+#endif
+}
+FWL_ERR CFWL_FormImp::Update() {
+  if (m_iLock > 0) {
+    return FWL_ERR_Succeeded;
+  }
+  if (!m_pProperties->m_pThemeProvider) {
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+  }
+#ifdef FWL_UseMacSystemBorder
+#else
+  SetThemeData();
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
+    UpdateIcon();
+  }
+#endif
+  UpdateCaption();
+  Layout();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_FormImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  (void)GetAvailableTheme();
+  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_CloseBox;
+  }
+  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_MaxBox;
+  }
+  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_MinBox;
+  }
+  CFX_RectF rtCap;
+  rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
+            m_rtCaption.width - FWL_SYSBTNSIZE * m_iSysBox - 2 * m_fCYBorder,
+            m_rtCaption.height - m_fCXBorder);
+  if (rtCap.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Titlebar;
+  }
+  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize)) {
+    FX_FLOAT fWidth =
+        m_rtRelative.width - 2 * (m_fCYBorder + FWL_CornerEnlarge);
+    FX_FLOAT fHeight =
+        m_rtRelative.height - 2 * (m_fCXBorder + FWL_CornerEnlarge);
+    CFX_RectF rt;
+    rt.Set(0, m_fCXBorder + FWL_CornerEnlarge, m_fCYBorder, fHeight);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Left;
+    }
+    rt.Set(m_rtRelative.width - m_fCYBorder, m_fCXBorder + FWL_CornerEnlarge,
+           m_fCYBorder, fHeight);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Right;
+    }
+    rt.Set(m_fCYBorder + FWL_CornerEnlarge, 0, fWidth, m_fCXBorder);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Top;
+    }
+    rt.Set(m_fCYBorder + FWL_CornerEnlarge, m_rtRelative.height - m_fCXBorder,
+           fWidth, m_fCXBorder);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Bottom;
+    }
+    rt.Set(0, 0, m_fCYBorder + FWL_CornerEnlarge,
+           m_fCXBorder + FWL_CornerEnlarge);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_LeftTop;
+    }
+    rt.Set(0, m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge,
+           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_LeftBottom;
+    }
+    rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge, 0,
+           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_RightTop;
+    }
+    rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge,
+           m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge,
+           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
+    if (rt.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_RightBottom;
+    }
+  }
+  return FWL_WGTHITTEST_Client;
+}
+FWL_ERR CFWL_FormImp::DrawWidget(CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if (!m_pProperties->m_pThemeProvider)
+    return FWL_ERR_Indefinite;
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  FX_BOOL bInactive = !IsActive();
+  int32_t iState =
+      bInactive ? FWL_PARTSTATE_FRM_Inactive : FWL_PARTSTATE_FRM_Normal;
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0) {
+    DrawBackground(pGraphics, pTheme);
+  }
+#ifdef FWL_UseMacSystemBorder
+  return FWL_ERR_Succeeded;
+#endif
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_dwStates = iState;
+  param.m_pGraphics = pGraphics;
+  param.m_rtPart = m_rtRelative;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
+    param.m_iPart = FWL_PART_FRM_Border;
+    pTheme->DrawBackground(&param);
+  }
+  if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) !=
+      FWL_WGTSTYLE_EdgeNone) {
+    CFX_RectF rtEdge;
+    GetEdgeRect(rtEdge);
+    param.m_iPart = FWL_PART_FRM_Edge;
+    param.m_rtPart = rtEdge;
+    param.m_dwStates = iState;
+    pTheme->DrawBackground(&param);
+  }
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
+    param.m_iPart = FWL_PART_FRM_Caption;
+    param.m_dwStates = iState;
+    param.m_rtPart = m_rtCaption;
+    pTheme->DrawBackground(&param);
+    DrawCaptionText(pGraphics, pTheme, pMatrix);
+  } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
+    param.m_iPart = FWL_PART_FRM_NarrowCaption;
+    param.m_dwStates = iState;
+    param.m_rtPart = m_rtCaption;
+    pTheme->DrawBackground(&param);
+    DrawCaptionText(pGraphics, pTheme, pMatrix);
+  }
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
+    param.m_iPart = FWL_PART_FRM_Icon;
+    if (HasIcon()) {
+      DrawIconImage(pGraphics, pTheme, pMatrix);
+    }
+  }
+#if (_FX_OS_ == _FX_MACOSX_)
+  {
+    if (m_pCloseBox) {
+      param.m_iPart = FWL_PART_FRM_CloseBox;
+      param.m_dwStates = m_pCloseBox->GetPartState();
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
+      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
+      }
+      param.m_rtPart = m_pCloseBox->m_rtBtn;
+      pTheme->DrawBackground(&param);
+    }
+    if (m_pMaxBox) {
+      param.m_iPart = FWL_PART_FRM_MaximizeBox;
+      param.m_dwStates = m_pMaxBox->GetPartState();
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
+      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
+      }
+      param.m_rtPart = m_pMaxBox->m_rtBtn;
+      param.m_dwData = m_bMaximized;
+      pTheme->DrawBackground(&param);
+    }
+    if (m_pMinBox) {
+      param.m_iPart = FWL_PART_FRM_MinimizeBox;
+      param.m_dwStates = m_pMinBox->GetPartState();
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
+      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
+        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
+      }
+      param.m_rtPart = m_pMinBox->m_rtBtn;
+      pTheme->DrawBackground(&param);
+    }
+    m_bMouseIn = FALSE;
+  }
+#else
+  {
+    if (m_pCloseBox) {
+      param.m_iPart = FWL_PART_FRM_CloseBox;
+      param.m_dwStates = m_pCloseBox->GetPartState();
+      param.m_rtPart = m_pCloseBox->m_rtBtn;
+      pTheme->DrawBackground(&param);
+    }
+    if (m_pMaxBox) {
+      param.m_iPart = FWL_PART_FRM_MaximizeBox;
+      param.m_dwStates = m_pMaxBox->GetPartState();
+      param.m_rtPart = m_pMaxBox->m_rtBtn;
+      param.m_dwData = m_bMaximized;
+      pTheme->DrawBackground(&param);
+    }
+    if (m_pMinBox) {
+      param.m_iPart = FWL_PART_FRM_MinimizeBox;
+      param.m_dwStates = m_pMinBox->GetPartState();
+      param.m_rtPart = m_pMinBox->m_rtBtn;
+      pTheme->DrawBackground(&param);
+    }
+  }
+#endif
+  return FWL_ERR_Succeeded;
+}
+FWL_FORMSIZE CFWL_FormImp::GetFormSize() {
+  return m_eFormSize;
+}
+FWL_ERR CFWL_FormImp::SetFormSize(FWL_FORMSIZE eFormSize) {
+  m_eFormSize = eFormSize;
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_FormImp::DoModal() {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return NULL;
+  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
+  if (!pDriver)
+    return NULL;
+  m_pNoteLoop = new CFWL_NoteLoop(this);
+  pDriver->PushNoteLoop(m_pNoteLoop);
+  m_bDoModalFlag = TRUE;
+  SetStates(FWL_WGTSTATE_Invisible, FALSE);
+  pDriver->Run();
+#if (_FX_OS_ == _FX_MACOSX_)
+#else
+  pDriver->PopNoteLoop();
+#endif
+  delete m_pNoteLoop;
+  m_pNoteLoop = NULL;
+  return NULL;
+}
+IFWL_Widget* CFWL_FormImp::DoModal(FX_DWORD& dwCommandID) {
+  return DoModal();
+}
+FWL_ERR CFWL_FormImp::EndDoModal() {
+  if (!m_pNoteLoop)
+    return FWL_ERR_Indefinite;
+  m_bDoModalFlag = FALSE;
+#if (_FX_OS_ == _FX_MACOSX_)
+  m_pNoteLoop->EndModalLoop();
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return FWL_ERR_Indefinite;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  if (!pDriver)
+    return FWL_ERR_Indefinite;
+  pDriver->PopNoteLoop();
+  SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  return FWL_ERR_Succeeded;
+#else
+  SetStates(FWL_WGTSTATE_Invisible, TRUE);
+  return m_pNoteLoop->EndModalLoop();
+#endif
+}
+FWL_ERR CFWL_FormImp::SetBorderRegion(CFX_Path* pPath) {
+  return FWL_ERR_Succeeded;
+}
+void CFWL_FormImp::DrawBackground(CFX_Graphics* pGraphics,
+                                  IFWL_ThemeProvider* pTheme) {
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_FRM_Background;
+  param.m_pGraphics = pGraphics;
+  param.m_rtPart = m_rtRelative;
+  param.m_rtPart.Deflate(m_fCYBorder, m_rtCaption.height, m_fCYBorder,
+                         m_fCXBorder);
+  pTheme->DrawBackground(&param);
+}
+CFWL_WidgetImp* CFWL_FormImp::GetSubFocus() {
+  return m_pSubFocus;
+}
+void CFWL_FormImp::SetSubFocus(CFWL_WidgetImp* pWidget) {
+  m_pSubFocus = pWidget;
+}
+CFX_MapAccelerators& CFWL_FormImp::GetAccelerator() {
+  return m_mapAccelerators;
+}
+void CFWL_FormImp::SetAccelerator(CFX_MapAccelerators* pAccelerators) {
+  if (!pAccelerators)
+    return;
+  m_mapAccelerators.RemoveAll();
+  FX_DWORD vrKey, rValue;
+  FX_POSITION pos = pAccelerators->GetStartPosition();
+  while (pos) {
+    pAccelerators->GetNextAssoc(pos, vrKey, rValue);
+    m_mapAccelerators.SetAt(vrKey, rValue);
+  }
+}
+void CFWL_FormImp::ShowChildWidget(IFWL_Widget* pParent) {
+  IFWL_App* pApp = FWL_GetApp();
+  if (!pApp)
+    return;
+  CFWL_WidgetMgr* pWidgetMgr =
+      static_cast<CFWL_WidgetMgr*>(pApp->GetWidgetMgr());
+  if (!pWidgetMgr)
+    return;
+  IFWL_Widget* pChild =
+      pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
+  while (pChild) {
+    pWidgetMgr->ShowWidget_Native(pChild);
+    ShowChildWidget(pChild);
+    pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
+  }
+}
+void CFWL_FormImp::RemoveSysButtons() {
+  m_rtCaption.Reset();
+  if (m_pCloseBox) {
+    delete m_pCloseBox;
+    m_pCloseBox = NULL;
+  }
+  if (m_pMinBox) {
+    delete m_pMinBox;
+    m_pMinBox = NULL;
+  }
+  if (m_pMaxBox) {
+    delete m_pMaxBox;
+    m_pMaxBox = NULL;
+  }
+  if (m_pCaptionBox) {
+    delete m_pCaptionBox;
+    m_pCaptionBox = NULL;
+  }
+}
+void CFWL_FormImp::CalcContentRect(CFX_RectF& rtContent) {
+#ifdef FWL_UseMacSystemBorder
+  rtContent = m_rtRelative;
+#else
+  GetEdgeRect(rtContent);
+  if (HasEdge()) {
+    FX_FLOAT fEdge = GetEdgeWidth();
+    rtContent.Deflate(fEdge, fEdge);
+  }
+#endif
+}
+CFWL_SysBtn* CFWL_FormImp::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
+    return m_pCloseBox;
+  }
+  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
+    return m_pMaxBox;
+  }
+  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
+    return m_pMinBox;
+  }
+  if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy)) {
+    return m_pCaptionBox;
+  }
+  return NULL;
+}
+CFWL_SysBtn* CFWL_FormImp::GetSysBtnByState(FX_DWORD dwState) {
+  if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) {
+    return m_pCloseBox;
+  }
+  if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) {
+    return m_pMaxBox;
+  }
+  if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) {
+    return m_pMinBox;
+  }
+  if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState)) {
+    return m_pCaptionBox;
+  }
+  return NULL;
+}
+CFWL_SysBtn* CFWL_FormImp::GetSysBtnByIndex(int32_t nIndex) {
+  if (nIndex < 0) {
+    return NULL;
+  }
+  CFX_PtrArray arrBtn;
+  if (m_pMinBox) {
+    arrBtn.Add(m_pMinBox);
+  }
+  if (m_pMaxBox) {
+    arrBtn.Add(m_pMaxBox);
+  }
+  if (m_pCloseBox) {
+    arrBtn.Add(m_pCloseBox);
+  }
+  return static_cast<CFWL_SysBtn*>(arrBtn[nIndex]);
+}
+int32_t CFWL_FormImp::GetSysBtnIndex(CFWL_SysBtn* pBtn) {
+  CFX_PtrArray arrBtn;
+  if (m_pMinBox) {
+    arrBtn.Add(m_pMinBox);
+  }
+  if (m_pMaxBox) {
+    arrBtn.Add(m_pMaxBox);
+  }
+  if (m_pCloseBox) {
+    arrBtn.Add(m_pCloseBox);
+  }
+  return arrBtn.Find(pBtn);
+}
+FX_FLOAT CFWL_FormImp::GetCaptionHeight() {
+  FX_DWORD dwCapacity = 0;
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
+    dwCapacity = FWL_WGTCAPACITY_FRM_CYCaption;
+  } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
+    dwCapacity = FWL_WGTCAPACITY_FRM_CYNarrowCaption;
+  }
+  if (dwCapacity > 0) {
+    FX_FLOAT* pfCapHeight =
+        static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
+    return pfCapHeight ? *pfCapHeight : 0;
+  }
+  return 0;
+}
+void CFWL_FormImp::DrawCaptionText(CFX_Graphics* pGs,
+                                   IFWL_ThemeProvider* pTheme,
+                                   const CFX_Matrix* pMatrix) {
+  CFX_WideString wsText;
+  IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
+  pData->GetCaption(m_pInterface, wsText);
+  if (wsText.IsEmpty()) {
+    return;
+  }
+  CFWL_ThemeText textParam;
+  textParam.m_pWidget = m_pInterface;
+  textParam.m_iPart = FWL_PART_FRM_Caption;
+  textParam.m_dwStates = FWL_PARTSTATE_FRM_Normal;
+  textParam.m_pGraphics = pGs;
+  if (pMatrix) {
+    textParam.m_matrix.Concat(*pMatrix);
+  }
+  CFX_RectF rtText;
+  if (m_bCustomizeLayout) {
+    rtText = m_rtCaptionText;
+    rtText.top -= 5;
+  } else {
+    rtText = m_rtCaption;
+    FX_FLOAT fpos;
+    fpos = HasIcon() ? 29.0f : 13.0f;
+    rtText.left += fpos;
+  }
+  textParam.m_rtPart = rtText;
+  textParam.m_wsText = wsText;
+  textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine | FDE_TTOSTYLE_Ellipsis;
+  textParam.m_iTTOAlign = m_bCustomizeLayout ? FDE_TTOALIGNMENT_Center
+                                             : FDE_TTOALIGNMENT_CenterLeft;
+  pTheme->DrawText(&textParam);
+}
+void CFWL_FormImp::DrawIconImage(CFX_Graphics* pGs,
+                                 IFWL_ThemeProvider* pTheme,
+                                 const CFX_Matrix* pMatrix) {
+  IFWL_FormDP* pData =
+      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = FWL_PART_FRM_Icon;
+  param.m_pGraphics = pGs;
+  param.m_pImage = pData->GetIcon(m_pInterface, FALSE);
+  param.m_rtPart = m_rtIcon;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix);
+  }
+  pTheme->DrawBackground(&param);
+}
+void CFWL_FormImp::GetEdgeRect(CFX_RectF& rtEdge) {
+  rtEdge = m_rtRelative;
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
+    FX_FLOAT fCX = GetBorderSize();
+    FX_FLOAT fCY = GetBorderSize(FALSE);
+    rtEdge.Deflate(fCX, m_rtCaption.Height(), fCX, fCY);
+  }
+}
+void CFWL_FormImp::SetWorkAreaRect() {
+  m_rtRestore = m_pProperties->m_rtWidget;
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return;
+  m_bSetMaximize = TRUE;
+  pWidgetMgr->SetMaximize_Native(m_pInterface);
+  Repaint(&m_rtRelative);
+}
+void CFWL_FormImp::SetCursor(FX_FLOAT fx, FX_FLOAT fy) {}
+void CFWL_FormImp::Layout() {
+  GetRelativeRect(m_rtRelative);
+#ifndef FWL_UseMacSystemBorder
+  ReSetSysBtn();
+#endif
+  if (m_pContent) {
+    CFX_RectF rtClient;
+    GetClientRect(rtClient);
+    m_pContent->SetWidgetRect(rtClient);
+    m_pContent->Update();
+  }
+}
+void CFWL_FormImp::ReSetSysBtn() {
+  m_fCXBorder =
+      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_CXBorder));
+  m_fCYBorder =
+      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_CYBorder));
+  RemoveSysButtons();
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  m_bCustomizeLayout = pTheme->IsCustomizedLayout(m_pInterface);
+  FX_FLOAT fCapHeight = GetCaptionHeight();
+  if (fCapHeight > 0) {
+    m_rtCaption = m_rtRelative;
+    m_rtCaption.height = fCapHeight;
+  }
+  m_iSysBox = 0;
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) {
+    m_pCloseBox = new CFWL_SysBtn;
+    if (m_bCustomizeLayout) {
+      CFWL_ThemeBackground param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_FRM_CloseBox;
+      pTheme->GetPartRect(&param, m_pCloseBox->m_rtBtn);
+    } else {
+      m_pCloseBox->m_rtBtn.Set(
+          m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
+          FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+    }
+    m_iSysBox++;
+  }
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MaximizeBox) {
+    m_pMaxBox = new CFWL_SysBtn;
+    if (m_bCustomizeLayout) {
+      CFWL_ThemeBackground param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_FRM_MaximizeBox;
+      pTheme->GetPartRect(&param, m_pMaxBox->m_rtBtn);
+    } else {
+      if (m_pCloseBox) {
+        m_pMaxBox->m_rtBtn.Set(
+            m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
+            m_pCloseBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+      } else {
+        m_pMaxBox->m_rtBtn.Set(
+            m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
+            FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+      }
+    }
+    m_iSysBox++;
+  }
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MinimizeBox) {
+    m_pMinBox = new CFWL_SysBtn;
+    if (m_bCustomizeLayout) {
+      CFWL_ThemeBackground param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_FRM_MinimizeBox;
+      pTheme->GetPartRect(&param, m_pMinBox->m_rtBtn);
+    } else {
+      if (m_pMaxBox) {
+        m_pMinBox->m_rtBtn.Set(
+            m_pMaxBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
+            m_pMaxBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+      } else if (m_pCloseBox) {
+        m_pMinBox->m_rtBtn.Set(
+            m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
+            m_pCloseBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+      } else {
+        m_pMinBox->m_rtBtn.Set(
+            m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
+            FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
+      }
+    }
+    m_iSysBox++;
+  }
+  IFWL_FormDP* pData =
+      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon &&
+      pData->GetIcon(m_pInterface, FALSE)) {
+    if (m_bCustomizeLayout) {
+      CFWL_ThemeBackground param;
+      param.m_pWidget = m_pInterface;
+      param.m_iPart = FWL_PART_FRM_Icon;
+      CFX_WideString wsText;
+      m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsText);
+      param.m_pData = &wsText;
+      pTheme->GetPartRect(&param, m_rtIcon);
+    } else {
+      m_rtIcon.Set(5, (m_rtCaption.height - m_fSmallIconSz) / 2, m_fSmallIconSz,
+                   m_fSmallIconSz);
+    }
+  }
+  if (m_bCustomizeLayout) {
+    CFWL_ThemeText parma;
+    parma.m_pWidget = m_pInterface;
+    parma.m_iPart = FWL_PART_FRM_HeadText;
+    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, parma.m_wsText);
+    pTheme->GetPartRect(&parma, m_rtCaptionText);
+  }
+}
+void CFWL_FormImp::RegisterForm() {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  if (!pDriver)
+    return;
+  pDriver->RegisterForm(this);
+}
+void CFWL_FormImp::UnRegisterForm() {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  if (!pDriver)
+    return;
+  pDriver->UnRegisterForm(this);
+}
+FX_BOOL CFWL_FormImp::IsDoModal() {
+  return m_bDoModalFlag;
+}
+void CFWL_FormImp::SetThemeData() {
+  m_fSmallIconSz =
+      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FRM_SmallIcon));
+  m_fBigIconSz =
+      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FRM_BigIcon));
+}
+FX_BOOL CFWL_FormImp::HasIcon() {
+  IFWL_FormDP* pData =
+      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
+  return !!pData->GetIcon(m_pInterface, FALSE);
+}
+void CFWL_FormImp::UpdateIcon() {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return;
+  IFWL_FormDP* pData =
+      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
+  CFX_DIBitmap* pBigIcon = pData->GetIcon(m_pInterface, TRUE);
+  CFX_DIBitmap* pSmallIcon = pData->GetIcon(m_pInterface, FALSE);
+  if (pBigIcon && pBigIcon != m_pBigIcon) {
+    m_pBigIcon = pBigIcon;
+    pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, TRUE);
+  }
+  if (pSmallIcon && pSmallIcon != m_pSmallIcon) {
+    m_pSmallIcon = pSmallIcon;
+    pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, FALSE);
+  }
+}
+void CFWL_FormImp::UpdateCaption() {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return;
+  IFWL_FormDP* pData =
+      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
+  if (!pData)
+    return;
+  CFX_WideString text;
+  pData->GetCaption(m_pInterface, text);
+  pWidgetMgr->SetWidgetCaption_Native(m_pInterface, text);
+}
+void CFWL_FormImp::DoWidthLimit(FX_FLOAT& fLeft,
+                                FX_FLOAT& fWidth,
+                                FX_FLOAT fCurX,
+                                FX_FLOAT fSpace,
+                                FX_FLOAT fLimitMin,
+                                FX_FLOAT fLimitMax,
+                                FX_BOOL bLeft) {
+  FX_FLOAT fx = fCurX;
+  FX_FLOAT fy = 0;
+  TransformTo(NULL, fx, fy);
+  FX_FLOAT fTemp =
+      bLeft ? (fWidth - fx + fLeft + fSpace) : (fx - fLeft + fSpace);
+  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
+    fWidth = fTemp;
+    fLeft += bLeft ? (fx - fLeft - fSpace) : 0;
+  } else {
+    if (fTemp < fLimitMin && fWidth > fLimitMin) {
+      fLeft += bLeft ? (fWidth - fLimitMin) : 0;
+      fWidth = fLimitMin;
+    } else if (fTemp > fLimitMax && fWidth < fLimitMax) {
+      fLeft -= bLeft ? (fLimitMax - fWidth) : 0;
+      fWidth = fLimitMax;
+    }
+  }
+}
+void CFWL_FormImp::DoHeightLimit(FX_FLOAT& fTop,
+                                 FX_FLOAT& fHeight,
+                                 FX_FLOAT fCurY,
+                                 FX_FLOAT fSpace,
+                                 FX_FLOAT fLimitMin,
+                                 FX_FLOAT fLimitMax,
+                                 FX_BOOL bTop) {
+  FX_FLOAT fx = 0;
+  FX_FLOAT fy = fCurY;
+  TransformTo(NULL, fx, fy);
+  FX_FLOAT fTemp = bTop ? (fHeight - fy + fTop + fSpace) : (fy - fTop + fSpace);
+  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
+    fHeight = fTemp;
+    fTop += bTop ? (fy - fTop - fSpace) : 0;
+  } else {
+    if (fTemp < fLimitMin && fHeight > fLimitMin) {
+      fTop += bTop ? (fHeight - fLimitMin) : 0;
+      fHeight = fLimitMin;
+    } else if (fTemp > fLimitMax && fHeight < fLimitMax) {
+      fTop -= bTop ? (fLimitMax - fHeight) : 0;
+      fHeight = fLimitMax;
+    }
+  }
+}
+CFWL_FormImpDelegate::CFWL_FormImpDelegate(CFWL_FormImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+#ifdef FWL_UseMacSystemBorder
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_Activate: {
+      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      break;
+    }
+    case FWL_MSGHASH_Deactivate: {
+      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
+      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      break;
+    }
+  }
+  return FWL_ERR_Succeeded;
+#else
+  if (!pMessage)
+    return 0;
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  int32_t iRet = 1;
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_Activate: {
+      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+      IFWL_NoteThread* pThread = m_pOwner->GetOwnerThread();
+      CFWL_NoteDriver* pDriver =
+          static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+      CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
+      IFWL_Widget* pSubFocus =
+          pSubFocusImp ? pSubFocusImp->GetInterface() : NULL;
+      if (pSubFocus && pSubFocus != pDriver->GetFocus()) {
+        pDriver->SetFocus(pSubFocus);
+      }
+      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      break;
+    }
+    case FWL_MSGHASH_Deactivate: {
+      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
+      IFWL_NoteThread* pThread = m_pOwner->GetOwnerThread();
+      CFWL_NoteDriver* pDriver =
+          static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+      CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
+      IFWL_Widget* pSubFocus =
+          pSubFocusImp ? pSubFocusImp->GetInterface() : NULL;
+      if (pSubFocus) {
+        if (pSubFocus == pDriver->GetFocus()) {
+          pDriver->SetFocus(NULL);
+        } else if (pSubFocus->GetStates() & FWL_WGTSTATE_Focused) {
+          CFWL_MsgKillFocus ms;
+          IFWL_WidgetDelegate* pDelegate = pSubFocus->SetDelegate(NULL);
+          if (pDelegate) {
+            pDelegate->OnProcessMessage(&ms);
+          }
+        }
+      }
+      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      switch (pMsg->m_dwCmd) {
+        case FWL_MSGMOUSECMD_LButtonDown: {
+          OnLButtonDown(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonUp: {
+          OnLButtonUp(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseMove: {
+          OnMouseMove(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseHover: {
+          OnMouseHover(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_MouseLeave: {
+          OnMouseLeave(pMsg);
+          break;
+        }
+        case FWL_MSGMOUSECMD_LButtonDblClk: {
+          OnLButtonDblClk(pMsg);
+          break;
+        }
+      }
+      break;
+    }
+    case FWL_MSGHASH_Size: {
+      CFWL_WidgetMgr* pWidgetMgr =
+          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+      if (!pWidgetMgr)
+        return 0;
+      pWidgetMgr->AddRedrawCounts(m_pOwner->m_pInterface);
+      if (!m_pOwner->m_bSetMaximize) {
+        break;
+      }
+      m_pOwner->m_bSetMaximize = FALSE;
+      CFWL_MsgSize* pMsg = static_cast<CFWL_MsgSize*>(pMessage);
+      CFX_RectF rt;
+      pWidgetMgr->GetWidgetRect_Native(m_pOwner->m_pInterface, rt);
+      m_pOwner->m_pProperties->m_rtWidget.left = rt.left;
+      m_pOwner->m_pProperties->m_rtWidget.top = rt.top;
+      m_pOwner->m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth;
+      m_pOwner->m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight;
+      m_pOwner->Update();
+      break;
+    }
+    case FWL_MSGHASH_WindowMove: {
+      OnWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage));
+      break;
+    }
+    case FWL_MSGHASH_Close: {
+      OnClose(static_cast<CFWL_MsgClose*>(pMessage));
+      break;
+    }
+    default: { iRet = 0; }
+  }
+  return iRet;
+#endif
+}
+FWL_ERR CFWL_FormImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  if (!pEvent)
+    return FWL_ERR_Indefinite;
+  if (pEvent->GetClassID() == FWL_EVTHASH_Close &&
+      pEvent->m_pSrcTarget == m_pOwner->m_pInterface) {
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_FormImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                           const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
+void CFWL_FormImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  m_pOwner->SetGrab(TRUE);
+  m_pOwner->m_bLButtonDown = TRUE;
+  m_pOwner->m_eResizeType = FORM_RESIZETYPE_None;
+  CFWL_SysBtn* pPressBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  m_pOwner->m_iCaptureBtn = m_pOwner->GetSysBtnIndex(pPressBtn);
+  CFX_RectF rtCap;
+  rtCap.Set(m_pOwner->m_rtCaption.left + m_pOwner->m_fCYBorder,
+            m_pOwner->m_rtCaption.top + m_pOwner->m_fCXBorder,
+            m_pOwner->m_rtCaption.width - FWL_SYSBTNSIZE * m_pOwner->m_iSysBox -
+                2 * m_pOwner->m_fCYBorder,
+            m_pOwner->m_rtCaption.height - m_pOwner->m_fCXBorder);
+  if (pPressBtn) {
+    pPressBtn->SetPressed();
+    m_pOwner->Repaint(&pPressBtn->m_rtBtn);
+  } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pOwner->m_eResizeType = FORM_RESIZETYPE_Cap;
+  } else if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
+             (m_pOwner->m_pProperties->m_dwStyleExes &
+              FWL_STYLEEXT_FRM_Resize) &&
+             !m_pOwner->m_bMaximized) {
+    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+  }
+  m_pOwner->m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
+  m_pOwner->m_InfoStart.m_szStart =
+      CFX_SizeF(m_pOwner->m_pProperties->m_rtWidget.width,
+                m_pOwner->m_pProperties->m_rtWidget.height);
+}
+void CFWL_FormImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_pOwner->SetGrab(FALSE);
+  m_pOwner->m_bLButtonDown = FALSE;
+  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  CFWL_SysBtn* pPressedBtn =
+      m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn);
+  if (!pPressedBtn || pPointBtn != pPressedBtn) {
+    return;
+  }
+  if (pPressedBtn == m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) {
+    pPressedBtn->SetNormal();
+  }
+  if (pPressedBtn == m_pOwner->m_pMaxBox) {
+    if (m_pOwner->m_bMaximized) {
+      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
+      m_pOwner->Update();
+      m_pOwner->Repaint();
+    } else {
+      m_pOwner->SetWorkAreaRect();
+      m_pOwner->Update();
+    }
+    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
+  } else if (pPressedBtn == m_pOwner->m_pMinBox) {
+    CFWL_WidgetMgr* pWidgetMgr =
+        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+    if (!pWidgetMgr)
+      return;
+    pWidgetMgr->SetMinimize_Native(m_pOwner->m_pInterface);
+  } else {
+    CFWL_EvtClose eClose;
+    eClose.m_pSrcTarget = m_pOwner->m_pInterface;
+    m_pOwner->DispatchEvent(&eClose);
+  }
+}
+void CFWL_FormImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pOwner->m_bLButtonDown) {
+    return;
+  }
+  if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
+      (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
+      !m_pOwner->m_bMaximized) {
+    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+  }
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Reset();
+  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  CFWL_SysBtn* pOldHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
+#if (_FX_OS_ == _FX_MACOSX_)
+  {
+    if (pOldHover && pPointBtn != pOldHover) {
+      pOldHover->SetNormal();
+    }
+    if (pPointBtn && pPointBtn != pOldHover) {
+      pPointBtn->SetHover();
+    }
+    if (m_pOwner->m_pCloseBox) {
+      rtInvalidate = m_pOwner->m_pCloseBox->m_rtBtn;
+    }
+    if (m_pOwner->m_pMaxBox) {
+      if (rtInvalidate.IsEmpty()) {
+        rtInvalidate = m_pOwner->m_pMaxBox->m_rtBtn;
+      } else {
+        rtInvalidate.Union(m_pOwner->m_pMaxBox->m_rtBtn);
+      }
+    }
+    if (m_pOwner->m_pMinBox) {
+      if (rtInvalidate.IsEmpty()) {
+        rtInvalidate = m_pOwner->m_pMinBox->m_rtBtn;
+      } else {
+        rtInvalidate.Union(m_pOwner->m_pMinBox->m_rtBtn);
+      }
+    }
+    if (!rtInvalidate.IsEmpty() &&
+        rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      m_pOwner->m_bMouseIn = TRUE;
+    }
+  }
+#else
+  {
+    if (pOldHover && pPointBtn != pOldHover) {
+      pOldHover->SetNormal();
+      rtInvalidate = pOldHover->m_rtBtn;
+    }
+    if (pPointBtn && pPointBtn != pOldHover) {
+      pPointBtn->SetHover();
+      if (rtInvalidate.IsEmpty()) {
+        rtInvalidate = pPointBtn->m_rtBtn;
+      } else {
+        rtInvalidate.Union(pPointBtn->m_rtBtn);
+      }
+    }
+  }
+#endif
+  if (!rtInvalidate.IsEmpty()) {
+    m_pOwner->Repaint(&rtInvalidate);
+  }
+}
+void CFWL_FormImpDelegate::OnMouseHover(CFWL_MsgMouse* pMsg) {
+  m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+}
+void CFWL_FormImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  CFWL_SysBtn* pHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
+  if (pHover) {
+    pHover->SetNormal();
+    m_pOwner->Repaint(&pHover->m_rtBtn);
+  }
+  if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave &&
+      !m_pOwner->m_bLButtonDown) {
+    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+  }
+}
+void CFWL_FormImpDelegate::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
+  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
+      m_pOwner->HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WGTHITTEST_Titlebar) {
+    if (m_pOwner->m_bMaximized) {
+      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
+    } else {
+      m_pOwner->SetWorkAreaRect();
+    }
+    m_pOwner->Update();
+    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
+  }
+}
+void CFWL_FormImpDelegate::OnWindowMove(CFWL_MsgWindowMove* pMsg) {
+  m_pOwner->m_pProperties->m_rtWidget.left = pMsg->m_fx;
+  m_pOwner->m_pProperties->m_rtWidget.top = pMsg->m_fy;
+}
+void CFWL_FormImpDelegate::OnClose(CFWL_MsgClose* pMsg) {
+  CFWL_EvtClose eClose;
+  eClose.m_pSrcTarget = m_pOwner->m_pInterface;
+  m_pOwner->DispatchEvent(&eClose);
+}
+FWL_ERR FWL_Accelerator_SetForm(IFWL_Form* pFrom,
+                                CFX_MapAccelerators* pMapAccel) {
+  CFWL_FormImp* pImp = static_cast<CFWL_FormImp*>(pFrom->GetImpl());
+  if (!pImp)
+    return FWL_ERR_Indefinite;
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/core/fwl_formimp.h b/xfa/fwl/core/fwl_formimp.h
new file mode 100644
index 0000000..eddc1d6
--- /dev/null
+++ b/xfa/fwl/core/fwl_formimp.h
@@ -0,0 +1,193 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_FORMIMP_H_
+#define XFA_FWL_CORE_FWL_FORMIMP_H_
+
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/core/fwl_form.h"
+
+class CFWL_NoteLoop;
+class CFWL_WidgetImpProperties;
+class CFWL_MsgMouse;
+class IFWL_Widget;
+class IFWL_ThemeProvider;
+class CFWL_SysBtn;
+class CFWL_FormImp;
+class CFWL_FormImpDelegate;
+
+#define FWL_SYSBUTTONSTATE_Hover 0x0001
+#define FWL_SYSBUTTONSTATE_Pressed 0x0002
+#define FWL_SYSBUTTONSTATE_Disabled 0x0010
+class CFWL_SysBtn {
+ public:
+  CFWL_SysBtn() {
+    m_rtBtn.Set(0, 0, 0, 0);
+    m_dwState = 0;
+  }
+
+  FX_BOOL IsHover() { return m_dwState & FWL_SYSBUTTONSTATE_Hover; }
+  FX_BOOL IsPressed() { return m_dwState & FWL_SYSBUTTONSTATE_Pressed; }
+  FX_BOOL IsDisabled() { return m_dwState & FWL_SYSBUTTONSTATE_Disabled; }
+  void SetNormal() { m_dwState &= 0xFFF0; }
+  void SetPressed() {
+    SetNormal();
+    m_dwState |= FWL_SYSBUTTONSTATE_Pressed;
+  }
+  void SetHover() {
+    SetNormal();
+    m_dwState |= FWL_SYSBUTTONSTATE_Hover;
+  }
+  void SetDisabled(FX_BOOL bDisabled) {
+    bDisabled ? m_dwState |= FWL_SYSBUTTONSTATE_Disabled
+              : m_dwState &= ~FWL_SYSBUTTONSTATE_Disabled;
+  }
+  int32_t GetPartState() {
+    return (IsDisabled() ? FWL_PARTSTATE_FRM_Disabled : (m_dwState + 1));
+  }
+
+  CFX_RectF m_rtBtn;
+  FX_DWORD m_dwState;
+};
+enum FORM_RESIZETYPE {
+  FORM_RESIZETYPE_None = 0,
+  FORM_RESIZETYPE_Cap,
+  FORM_RESIZETYPE_Left,
+  FORM_RESIZETYPE_Top,
+  FORM_RESIZETYPE_Right,
+  FORM_RESIZETYPE_Bottom,
+  FORM_RESIZETYPE_LeftTop,
+  FORM_RESIZETYPE_LeftBottom,
+  FORM_RESIZETYPE_RightTop,
+  FORM_RESIZETYPE_RightBottom
+};
+typedef struct RestoreResizeInfo {
+  CFX_PointF m_ptStart;
+  CFX_SizeF m_szStart;
+} RestoreInfo;
+class CFWL_FormImp : public CFWL_PanelImp {
+ public:
+  CFWL_FormImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
+  virtual ~CFWL_FormImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
+  virtual FWL_ERR Update();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual FWL_FORMSIZE GetFormSize();
+  virtual FWL_ERR SetFormSize(FWL_FORMSIZE eFormSize);
+  virtual IFWL_Widget* DoModal();
+  virtual IFWL_Widget* DoModal(FX_DWORD& dwCommandID);
+  virtual FWL_ERR EndDoModal();
+  virtual FWL_ERR SetBorderRegion(CFX_Path* pPath);
+  virtual void DrawBackground(CFX_Graphics* pGraphics,
+                              IFWL_ThemeProvider* pTheme);
+  CFWL_WidgetImp* GetSubFocus();
+  void SetSubFocus(CFWL_WidgetImp* pWidget);
+  CFX_MapAccelerators& GetAccelerator();
+  void SetAccelerator(CFX_MapAccelerators* pAccelerators);
+
+ protected:
+  void ShowChildWidget(IFWL_Widget* pParent);
+  void RemoveSysButtons();
+  void CalcContentRect(CFX_RectF& rtContent);
+  CFWL_SysBtn* GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy);
+  CFWL_SysBtn* GetSysBtnByState(FX_DWORD dwState);
+  CFWL_SysBtn* GetSysBtnByIndex(int32_t nIndex);
+  int32_t GetSysBtnIndex(CFWL_SysBtn* pBtn);
+  FX_FLOAT GetCaptionHeight();
+  void DrawCaptionText(CFX_Graphics* pGs,
+                       IFWL_ThemeProvider* pTheme,
+                       const CFX_Matrix* pMatrix = NULL);
+  void DrawIconImage(CFX_Graphics* pGs,
+                     IFWL_ThemeProvider* pTheme,
+                     const CFX_Matrix* pMatrix = NULL);
+  void GetEdgeRect(CFX_RectF& rtEdge);
+  void SetWorkAreaRect();
+  void SetCursor(FX_FLOAT fx, FX_FLOAT fy);
+  void Layout();
+  void ReSetSysBtn();
+  void RegisterForm();
+  void UnRegisterForm();
+  FX_BOOL IsDoModal();
+  void SetThemeData();
+  FX_BOOL HasIcon();
+  void UpdateIcon();
+  void UpdateCaption();
+  void DoWidthLimit(FX_FLOAT& fLeft,
+                    FX_FLOAT& fWidth,
+                    FX_FLOAT fCurX,
+                    FX_FLOAT fSpace,
+                    FX_FLOAT fLimitMin,
+                    FX_FLOAT fLimitMax,
+                    FX_BOOL bLeft);
+  void DoHeightLimit(FX_FLOAT& fTop,
+                     FX_FLOAT& fHeight,
+                     FX_FLOAT fCurY,
+                     FX_FLOAT fSpace,
+                     FX_FLOAT fLimitMin,
+                     FX_FLOAT fLimitMax,
+                     FX_BOOL bTop);
+  CFX_MapAccelerators m_mapAccelerators;
+  CFX_RectF m_rtRestore;
+  CFX_RectF m_rtCaptionText;
+  CFX_RectF m_rtRelative;
+  CFX_RectF m_rtCaption;
+  CFX_RectF m_rtIcon;
+  CFWL_SysBtn* m_pCloseBox;
+  CFWL_SysBtn* m_pMinBox;
+  CFWL_SysBtn* m_pMaxBox;
+  CFWL_SysBtn* m_pCaptionBox;
+  CFWL_NoteLoop* m_pNoteLoop;
+  CFWL_WidgetImp* m_pSubFocus;
+  RestoreInfo m_InfoStart;
+  FX_FLOAT m_fCXBorder;
+  FX_FLOAT m_fCYBorder;
+  int32_t m_iCaptureBtn;
+  int32_t m_iSysBox;
+  int32_t m_eResizeType;
+  FX_BOOL m_bLButtonDown;
+  FX_BOOL m_bMaximized;
+  FX_BOOL m_bSetMaximize;
+  FX_BOOL m_bCustomizeLayout;
+  FWL_FORMSIZE m_eFormSize;
+  FX_BOOL m_bDoModalFlag;
+  FX_FLOAT m_fSmallIconSz;
+  FX_FLOAT m_fBigIconSz;
+  CFX_DIBitmap* m_pBigIcon;
+  CFX_DIBitmap* m_pSmallIcon;
+  FX_BOOL m_bMouseIn;
+  friend class CFWL_FormImpDelegate;
+};
+class CFWL_FormImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_FormImpDelegate(CFWL_FormImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseHover(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnLButtonDblClk(CFWL_MsgMouse* pMsg);
+  void OnWindowMove(CFWL_MsgWindowMove* pMsg);
+  void OnClose(CFWL_MsgClose* pMsg);
+  CFWL_FormImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_CORE_FWL_FORMIMP_H_
diff --git a/xfa/fwl/core/fwl_gridimp.cpp b/xfa/fwl/core/fwl_gridimp.cpp
new file mode 100644
index 0000000..b3b8d5a
--- /dev/null
+++ b/xfa/fwl/core/fwl_gridimp.cpp
@@ -0,0 +1,1378 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_gridimp.h"
+
+#include "xfa/fwl/core/fwl_contentimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+// static
+IFWL_Grid* IFWL_Grid::Create(const CFWL_WidgetImpProperties& properties) {
+  IFWL_Grid* pGrid = new IFWL_Grid;
+  CFWL_GridImp* pGridImpl = new CFWL_GridImp(properties, nullptr);
+  pGrid->SetImpl(pGridImpl);
+  pGridImpl->SetInterface(pGrid);
+  return pGrid;
+}
+IFWL_Grid::IFWL_Grid() {}
+FWL_HGRIDCOLROW IFWL_Grid::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->InsertColRow(bColumn, nIndex);
+}
+int32_t IFWL_Grid::CountColRows(FX_BOOL bColumn) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->CountColRows(bColumn);
+}
+FWL_HGRIDCOLROW IFWL_Grid::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetColRow(bColumn, nIndex);
+}
+int32_t IFWL_Grid::GetIndex(FWL_HGRIDCOLROW hColRow) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetIndex(hColRow);
+}
+FX_FLOAT IFWL_Grid::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetSize(hColRow, eUnit);
+}
+FWL_ERR IFWL_Grid::SetSize(FWL_HGRIDCOLROW hColRow,
+                           FX_FLOAT fSize,
+                           FWL_GRIDUNIT eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->SetSize(hColRow, fSize, eUnit);
+}
+FX_FLOAT IFWL_Grid::GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetMinSize(hColRow, eUnit);
+}
+FWL_ERR IFWL_Grid::SetMinSize(FWL_HGRIDCOLROW hColRow,
+                              FX_FLOAT fSize,
+                              FWL_GRIDUNIT eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetMinSize(hColRow, fSize, eUnit);
+}
+FX_FLOAT IFWL_Grid::GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetMaxSize(hColRow, eUnit);
+}
+FWL_ERR IFWL_Grid::SetMaxSize(FWL_HGRIDCOLROW hColRow,
+                              FX_FLOAT fSize,
+                              FWL_GRIDUNIT eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetMaxSize(hColRow, fSize, eUnit);
+}
+FX_BOOL IFWL_Grid::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->DeleteColRow(hColRow);
+}
+FX_BOOL IFWL_Grid::IsColumn(FWL_HGRIDCOLROW hColRow) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->IsColumn(hColRow);
+}
+int32_t IFWL_Grid::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetPos(pWidget, bColumn);
+}
+FWL_ERR IFWL_Grid::SetWidgetPos(IFWL_Widget* pWidget,
+                                int32_t iPos,
+                                FX_BOOL bColumn) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetWidgetPos(pWidget, iPos, bColumn);
+}
+int32_t IFWL_Grid::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetSpan(pWidget, bColumn);
+}
+FWL_ERR IFWL_Grid::SetWidgetSpan(IFWL_Widget* pWidget,
+                                 int32_t iSpan,
+                                 FX_BOOL bColumn) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetWidgetSpan(pWidget, iSpan, bColumn);
+}
+FX_FLOAT IFWL_Grid::GetWidgetSize(IFWL_Widget* pWidget,
+                                  FWL_GRIDSIZE eSize,
+                                  FWL_GRIDUNIT& eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->GetWidgetSize(pWidget, eSize, eUnit);
+}
+FWL_ERR IFWL_Grid::SetWidgetSize(IFWL_Widget* pWidget,
+                                 FWL_GRIDSIZE eSize,
+                                 FX_FLOAT fSize,
+                                 FWL_GRIDUNIT eUit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetWidgetSize(pWidget, eSize, fSize, eUit);
+}
+FX_BOOL IFWL_Grid::GetWidgetMargin(IFWL_Widget* pWidget,
+                                   FWL_GRIDMARGIN eMargin,
+                                   FX_FLOAT& fMargin) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->GetWidgetMargin(pWidget, eMargin, fMargin);
+}
+FWL_ERR IFWL_Grid::SetWidgetMargin(IFWL_Widget* pWidget,
+                                   FWL_GRIDMARGIN eMargin,
+                                   FX_FLOAT fMargin) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->SetWidgetMargin(pWidget, eMargin, fMargin);
+}
+FWL_ERR IFWL_Grid::RemoveWidgetMargin(IFWL_Widget* pWidget,
+                                      FWL_GRIDMARGIN eMargin) {
+  return static_cast<CFWL_GridImp*>(GetImpl())
+      ->RemoveWidgetMargin(pWidget, eMargin);
+}
+FX_FLOAT IFWL_Grid::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->GetGridSize(eSize, eUnit);
+}
+FWL_ERR IFWL_Grid::SetGridSize(FWL_GRIDSIZE eSize,
+                               FX_FLOAT fSize,
+                               FWL_GRIDUNIT eUit) {
+  return static_cast<CFWL_GridImp*>(GetImpl())->SetGridSize(eSize, fSize, eUit);
+}
+
+CFWL_GridImp::CFWL_GridImp(const CFWL_WidgetImpProperties& properties,
+                           IFWL_Widget* pOuter)
+    : CFWL_ContentImp(properties, pOuter) {
+  m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
+  m_Size[FWL_GRIDSIZE_Width].fLength = 0;
+  m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
+  m_Size[FWL_GRIDSIZE_Height].fLength = 0;
+  m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
+  m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
+  m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
+  m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
+  m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
+  m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
+  m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
+  m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
+}
+CFWL_GridImp::~CFWL_GridImp() {
+  int32_t iCount = m_Columns.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    delete static_cast<CFWL_GridColRow*>(m_Columns[i]);
+  }
+  m_Columns.RemoveAll();
+  iCount = m_Rows.GetSize();
+  for (int32_t j = 0; j < iCount; j++) {
+    delete static_cast<CFWL_GridColRow*>(m_Rows[j]);
+  }
+  m_Rows.RemoveAll();
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget;
+    CFWL_GridWidgetInfo* pInfo;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    delete pInfo;
+  }
+  m_mapWidgetInfo.RemoveAll();
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+}
+FWL_ERR CFWL_GridImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Grid;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_GridImp::GetClassID() const {
+  return FWL_CLASSHASH_Grid;
+}
+FWL_ERR CFWL_GridImp::Initialize() {
+  if (CFWL_ContentImp::Initialize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  m_pDelegate = new CFWL_GridImpDelegate(this);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::Finalize() {
+  if (CFWL_ContentImp::Finalize() != FWL_ERR_Succeeded)
+    return FWL_ERR_Indefinite;
+  delete m_pDelegate;
+  m_pDelegate = nullptr;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    rect.left = 0;
+    rect.top = 0;
+    rect.width = ProcessUnCertainColumns();
+    rect.height = ProcessUnCertainRows();
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::SetWidgetRect(const CFX_RectF& rect) {
+  CFWL_WidgetImp::SetWidgetRect(rect);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::Update() {
+  if (IsLocked()) {
+    return FWL_ERR_Indefinite;
+  }
+  ProcessColumns(m_pProperties->m_rtWidget.width);
+  ProcessRows(m_pProperties->m_rtWidget.height);
+  SetAllWidgetsRect();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::DrawWidget(CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  if ((m_pProperties->m_dwStyleExes & FWL_GRIDSTYLEEXT_ShowGridLines) == 0) {
+    return FWL_ERR_Succeeded;
+  }
+  pGraphics->SaveGraphState();
+  if (pMatrix) {
+    pGraphics->ConcatMatrix(pMatrix);
+  }
+  {
+    FX_BOOL bDrawLine = FALSE;
+    CFX_Path path;
+    path.Create();
+    int32_t iColumns = m_Columns.GetSize();
+    for (int32_t i = 1; i < iColumns; i++) {
+      CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
+      if (!pColRow) {
+        continue;
+      }
+      bDrawLine = TRUE;
+      path.AddLine(pColRow->m_fActualPos, 0, pColRow->m_fActualPos,
+                   m_pProperties->m_rtWidget.height);
+    }
+    int32_t iRows = m_Rows.GetSize();
+    for (int32_t j = 1; j < iRows; j++) {
+      CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
+      if (!pColRow) {
+        continue;
+      }
+      bDrawLine = TRUE;
+      path.AddLine(0, pColRow->m_fActualPos, m_pProperties->m_rtWidget.width,
+                   pColRow->m_fActualPos);
+    }
+    if (bDrawLine) {
+      CFX_Color cr(0xFFFF0000);
+      pGraphics->SetStrokeColor(&cr);
+      pGraphics->StrokePath(&path);
+    }
+  }
+  pGraphics->RestoreGraphState();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
+  if (!pChild)
+    return FWL_ERR_Indefinite;
+  CFWL_ContentImp::InsertWidget(pChild, nIndex);
+  if (!m_mapWidgetInfo.GetValueAt(pChild)) {
+    CFWL_GridWidgetInfo* pInfo = new CFWL_GridWidgetInfo;
+    m_mapWidgetInfo.SetAt(pChild, pInfo);
+    m_Widgets.Add(pChild);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::RemoveWidget(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FWL_ERR_Indefinite;
+  CFWL_ContentImp::RemoveWidget(pWidget);
+  if (CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(
+          m_mapWidgetInfo.GetValueAt(pWidget))) {
+    m_mapWidgetInfo.RemoveKey(pWidget);
+    delete pInfo;
+    int32_t nIndex = m_Widgets.Find(pWidget);
+    m_Widgets.RemoveAt(nIndex, 1);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_HGRIDCOLROW CFWL_GridImp::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
+  if (bColumn) {
+    if (nIndex < 0 || nIndex > m_Columns.GetSize()) {
+      nIndex = m_Columns.GetSize();
+    }
+    CFWL_GridColRow* pColumn = new CFWL_GridColRow;
+    m_Columns.InsertAt(nIndex, pColumn, 1);
+    return (FWL_HGRIDCOLROW)pColumn;
+  }
+  if (nIndex < 0 || nIndex > m_Rows.GetSize()) {
+    nIndex = m_Rows.GetSize();
+  }
+  CFWL_GridColRow* pRow = new CFWL_GridColRow;
+  m_Rows.InsertAt(nIndex, pRow, 1);
+  return (FWL_HGRIDCOLROW)pRow;
+}
+int32_t CFWL_GridImp::CountColRows(FX_BOOL bColumn) {
+  if (bColumn) {
+    return m_Columns.GetSize();
+  }
+  return m_Rows.GetSize();
+}
+FWL_HGRIDCOLROW CFWL_GridImp::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
+  if (bColumn) {
+    if (nIndex < 0 || nIndex >= m_Columns.GetSize()) {
+      return NULL;
+    }
+    return (FWL_HGRIDCOLROW)m_Columns[nIndex];
+  }
+  if (nIndex < 0 || nIndex >= m_Rows.GetSize()) {
+    return NULL;
+  }
+  return (FWL_HGRIDCOLROW)m_Rows[nIndex];
+}
+int32_t CFWL_GridImp::GetIndex(FWL_HGRIDCOLROW hColRow) {
+  if (IsColumn(hColRow)) {
+    return m_Columns.Find(hColRow);
+  }
+  return m_Rows.Find(hColRow);
+}
+FX_FLOAT CFWL_GridImp::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
+  if (!hColRow)
+    return -1;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  eUnit = pColRow->m_Size.eUnit;
+  return pColRow->m_Size.fLength;
+}
+FWL_ERR CFWL_GridImp::SetSize(FWL_HGRIDCOLROW hColRow,
+                              FX_FLOAT fSize,
+                              FWL_GRIDUNIT eUnit) {
+  if (!hColRow)
+    return FWL_ERR_Indefinite;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  pColRow->m_Size.eUnit = eUnit;
+  pColRow->m_Size.fLength = fSize;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_GridImp::GetMinSize(FWL_HGRIDCOLROW hColRow,
+                                  FWL_GRIDUNIT& eUnit) {
+  if (!hColRow)
+    return -1;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  eUnit = pColRow->m_MinSize.eUnit;
+  return pColRow->m_MinSize.fLength;
+}
+FWL_ERR CFWL_GridImp::SetMinSize(FWL_HGRIDCOLROW hColRow,
+                                 FX_FLOAT fSize,
+                                 FWL_GRIDUNIT eUnit) {
+  if (!hColRow)
+    return FWL_ERR_Indefinite;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  pColRow->m_MinSize.eUnit = eUnit;
+  pColRow->m_MinSize.fLength = fSize;
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_GridImp::GetMaxSize(FWL_HGRIDCOLROW hColRow,
+                                  FWL_GRIDUNIT& eUnit) {
+  if (!hColRow)
+    return -1;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  eUnit = pColRow->m_MaxSize.eUnit;
+  return pColRow->m_MaxSize.fLength;
+}
+FWL_ERR CFWL_GridImp::SetMaxSize(FWL_HGRIDCOLROW hColRow,
+                                 FX_FLOAT fSize,
+                                 FWL_GRIDUNIT eUnit) {
+  if (!hColRow)
+    return FWL_ERR_Indefinite;
+  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
+  pColRow->m_MaxSize.eUnit = eUnit;
+  pColRow->m_MaxSize.fLength = fSize;
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_GridImp::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
+  int32_t nIndex = m_Columns.Find(hColRow);
+  if (nIndex >= 0) {
+    m_Columns.RemoveAt(nIndex);
+    delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
+    return TRUE;
+  }
+  nIndex = m_Rows.Find(hColRow);
+  if (nIndex >= 0) {
+    delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
+    m_Rows.RemoveAt(nIndex);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_GridImp::IsColumn(FWL_HGRIDCOLROW hColRow) {
+  return m_Columns.Find(hColRow) != -1;
+}
+int32_t CFWL_GridImp::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    return bColumn ? pInfo->m_iColumn : pInfo->m_iRow;
+  }
+  return -1;
+}
+FWL_ERR CFWL_GridImp::SetWidgetPos(IFWL_Widget* pWidget,
+                                   int32_t iPos,
+                                   FX_BOOL bColumn) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    bColumn ? pInfo->m_iColumn = iPos : pInfo->m_iRow = iPos;
+  }
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_GridImp::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    return bColumn ? pInfo->m_iColumnSpan : pInfo->m_iRowSpan;
+  }
+  return 0;
+}
+FWL_ERR CFWL_GridImp::SetWidgetSpan(IFWL_Widget* pWidget,
+                                    int32_t iSpan,
+                                    FX_BOOL bColumn) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    bColumn ? pInfo->m_iColumnSpan = iSpan : pInfo->m_iRowSpan = iSpan;
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_GridImp::GetWidgetSize(IFWL_Widget* pWidget,
+                                     FWL_GRIDSIZE eSize,
+                                     FWL_GRIDUNIT& eUnit) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    eUnit = pInfo->m_Size[eSize].eUnit;
+    return pInfo->m_Size[eSize].fLength;
+  }
+  return 0;
+}
+FWL_ERR CFWL_GridImp::SetWidgetSize(IFWL_Widget* pWidget,
+                                    FWL_GRIDSIZE eSize,
+                                    FX_FLOAT fSize,
+                                    FWL_GRIDUNIT eUit) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    pInfo->m_Size[eSize].fLength = fSize;
+    pInfo->m_Size[eSize].eUnit = eUit;
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_GridImp::GetWidgetMargin(IFWL_Widget* pWidget,
+                                      FWL_GRIDMARGIN eMargin,
+                                      FX_FLOAT& fMargin) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    fMargin = pInfo->m_Margin[eMargin];
+    return (pInfo->m_dwMarginFlag & (1 << eMargin)) != 0;
+  }
+  return FALSE;
+}
+FWL_ERR CFWL_GridImp::SetWidgetMargin(IFWL_Widget* pWidget,
+                                      FWL_GRIDMARGIN eMargin,
+                                      FX_FLOAT fMargin) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    pInfo->m_Margin[eMargin] = fMargin;
+    pInfo->m_dwMarginFlag |= (1 << eMargin);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_GridImp::RemoveWidgetMargin(IFWL_Widget* pWidget,
+                                         FWL_GRIDMARGIN eMargin) {
+  CFWL_GridWidgetInfo* pInfo =
+      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
+  if (pInfo) {
+    pInfo->m_dwMarginFlag &= ~(1 << eMargin);
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_FLOAT CFWL_GridImp::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
+  eUnit = m_Size[eSize].eUnit;
+  return m_Size[eSize].fLength;
+}
+FWL_ERR CFWL_GridImp::SetGridSize(FWL_GRIDSIZE eSize,
+                                  FX_FLOAT fSize,
+                                  FWL_GRIDUNIT eUit) {
+  m_Size[eSize].fLength = fSize;
+  m_Size[eSize].eUnit = eUit;
+  return FWL_ERR_Succeeded;
+}
+CFWL_GridWidgetInfo* CFWL_GridImp::GetWidgetInfo(IFWL_Widget* pWidget) {
+  return static_cast<CFWL_GridWidgetInfo*>(m_mapWidgetInfo.GetValueAt(pWidget));
+}
+void CFWL_GridImp::ProcFixedColRow(CFWL_GridColRow* pColRow,
+                                   int32_t nIndex,
+                                   FX_FLOAT fColRowSize,
+                                   FX_BOOL bColumn) {
+  pColRow->m_fActualSize = fColRowSize;
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    void* key = nullptr;
+    void* value = nullptr;
+    m_mapWidgetInfo.GetNextAssoc(ps, key, value);
+    IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
+    CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
+    if (bColumn) {
+      if (pInfo->m_iColumn == nIndex && pInfo->m_iColumnSpan == 1) {
+        CalcWidgetWidth(pWidget, pInfo, pColRow->m_fActualSize);
+      }
+    } else {
+      if (pInfo->m_iRow == nIndex && pInfo->m_iRowSpan == 1) {
+        CalcWidgetHeigt(pWidget, pInfo, pColRow->m_fActualSize);
+      }
+    }
+  }
+}
+void CFWL_GridImp::ProcAutoColRow(CFWL_GridColRow* pColRow,
+                                  int32_t nIndex,
+                                  FX_BOOL bColumn) {
+  if (!pColRow)
+    return;
+  FX_FLOAT fMaxSize = 0, fWidgetSize = 0;
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget = NULL;
+    CFWL_GridWidgetInfo* pInfo = NULL;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    if (!pWidget || !pInfo) {
+      continue;
+    }
+    if (bColumn) {
+      if (pInfo->m_iColumn != nIndex || pInfo->m_iColumnSpan != 1) {
+        continue;
+      }
+      fWidgetSize = CalcAutoColumnWidgetWidth(pWidget, pInfo);
+      if (fMaxSize < fWidgetSize) {
+        fMaxSize = fWidgetSize;
+      }
+    } else {
+      if (pInfo->m_iRow != nIndex || pInfo->m_iRowSpan != 1) {
+        continue;
+      }
+      fWidgetSize = CalcAutoColumnWidgetHeight(pWidget, pInfo);
+      if (fMaxSize < fWidgetSize) {
+        fMaxSize = fWidgetSize;
+      }
+    }
+  }
+  SetColRowActualSize(pColRow, fMaxSize);
+}
+void CFWL_GridImp::ProcScaledColRow(CFWL_GridColRow* pColRow,
+                                    int32_t nIndex,
+                                    FX_FLOAT fColRowSize,
+                                    FX_BOOL bColumn) {
+  if (fColRowSize > 0) {
+    ProcFixedColRow(pColRow, nIndex, fColRowSize, bColumn);
+  }
+}
+void CFWL_GridImp::CalcWidgetWidth(IFWL_Widget* pWidget,
+                                   CFWL_GridWidgetInfo* pInfo,
+                                   FX_FLOAT fColunmWidth) {
+  if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
+    SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
+  } else {
+    FX_FLOAT fWidth = 0;
+    FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
+    FX_BOOL bLeftMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
+    FX_BOOL bRightMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
+    if (bLeftMargin && bRightMargin) {
+      fWidth = fColunmWidth - fLeftMargin - fRightMargin;
+    } else {
+      CFX_RectF rtAuto;
+      pWidget->GetWidgetRect(rtAuto, TRUE);
+      fWidth = rtAuto.Width();
+    }
+    SetWidgetActualWidth(pInfo, fWidth);
+  }
+}
+void CFWL_GridImp::CalcWidgetHeigt(IFWL_Widget* pWidget,
+                                   CFWL_GridWidgetInfo* pInfo,
+                                   FX_FLOAT fRowHeigt) {
+  if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
+    SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
+  } else {
+    FX_FLOAT fHeight = 0;
+    FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
+    FX_BOOL bTopMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
+    FX_BOOL bBottomMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
+    if (bTopMargin && bBottomMargin) {
+      fHeight = fRowHeigt - fTopMargin - fBottomMargin;
+    } else {
+      CFX_RectF rtAuto;
+      pWidget->GetWidgetRect(rtAuto, TRUE);
+      fHeight = rtAuto.Height();
+    }
+    SetWidgetActualHeight(pInfo, fHeight);
+  }
+}
+FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
+                                                 CFWL_GridWidgetInfo* pInfo) {
+  FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
+  FX_BOOL bLeftMargin =
+      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
+  FX_BOOL bRightMargin =
+      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
+  if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
+    SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
+  } else {
+    CFX_RectF rtAuto;
+    pWidget->GetWidgetRect(rtAuto, TRUE);
+    FX_FLOAT fWidth = rtAuto.width;
+    SetWidgetActualWidth(pInfo, fWidth);
+  }
+  FX_FLOAT fTotal = pInfo->m_fActualWidth;
+  if (bLeftMargin) {
+    fTotal += fLeftMargin;
+  }
+  if (bRightMargin) {
+    fTotal += fRightMargin;
+  }
+  return fTotal;
+}
+FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
+                                                  CFWL_GridWidgetInfo* pInfo) {
+  FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
+  FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
+  FX_BOOL bBottomMargin =
+      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
+  if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
+    SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
+  } else {
+    CFX_RectF rtAuto;
+    pWidget->GetWidgetRect(rtAuto, TRUE);
+    FX_FLOAT fHeight = rtAuto.height;
+    SetWidgetActualHeight(pInfo, fHeight);
+  }
+  FX_FLOAT fTotal = pInfo->m_fActualHeight;
+  if (bTopMargin) {
+    fTotal += fTopMargin;
+  }
+  if (bBottomMargin) {
+    fTotal += fBottomMargin;
+  }
+  return fTotal;
+}
+FX_FLOAT CFWL_GridImp::ProcessColumns(FX_FLOAT fWidth) {
+  if (fWidth <= 0) {
+    return ProcessUnCertainColumns();
+  }
+  int32_t iColumns = m_Columns.GetSize();
+  if (iColumns < 1) {
+    return fWidth;
+  }
+  FX_FLOAT fFixedWidth = 0;
+  FX_FLOAT fAutoWidth = 0;
+  CFX_PtrArray autoColumns;
+  CFX_PtrArray scaledColumns;
+  FX_FLOAT fScaledColumnNum = 0;
+  for (int32_t i = 0; i < iColumns; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
+    if (!pColRow) {
+      continue;
+    }
+    switch (pColRow->m_Size.eUnit) {
+      case FWL_GRIDUNIT_Fixed: {
+        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
+        fFixedWidth += pColRow->m_fActualSize;
+        break;
+      }
+      case FWL_GRIDUNIT_Auto: {
+        ProcAutoColRow(pColRow, i, TRUE);
+        autoColumns.Add(pColRow);
+        break;
+      }
+      case FWL_GRIDUNIT_Scaled:
+      default: {
+        fScaledColumnNum += pColRow->m_Size.fLength;
+        scaledColumns.Add(pColRow);
+        SetColRowActualSize(pColRow, 0);
+      }
+    }
+  }
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget = NULL;
+    CFWL_GridWidgetInfo* pInfo = NULL;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    if (!pInfo || pInfo->m_iColumnSpan < 2) {
+      continue;
+    }
+    CFX_PtrArray spanAutoColumns;
+    FX_FLOAT fSpanSize = 0;
+    int32_t iAutoColRows = 0;
+    int32_t iScaledColRows = 0;
+    for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
+      CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
+          GetColRow(TRUE, pInfo->m_iColumn + i));
+      if (!pColumn) {
+        break;
+      }
+      fSpanSize += pColumn->m_fActualSize;
+      if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
+        iAutoColRows++;
+        spanAutoColumns.Add(pColumn);
+      } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
+        iScaledColRows++;
+      }
+    }
+    if (iAutoColRows < 1) {
+      continue;
+    }
+    FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
+    if (fWidgetWidth > fSpanSize) {
+      if (iScaledColRows > 0) {
+      } else {
+        SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
+      }
+    }
+  }
+  int32_t iAutoCols = autoColumns.GetSize();
+  for (int32_t k = 0; k < iAutoCols; k++) {
+    fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[k])->m_fActualSize;
+  }
+  FX_FLOAT fScaledWidth = fWidth - fFixedWidth - fAutoWidth;
+  if (fScaledWidth > 0 && fScaledColumnNum > 0) {
+    SetScaledColRowsSize(scaledColumns, fScaledWidth, fScaledColumnNum);
+  }
+  return fWidth;
+}
+FX_FLOAT CFWL_GridImp::ProcessRows(FX_FLOAT fHeight) {
+  if (fHeight <= 0) {
+    return ProcessUnCertainRows();
+  }
+  int32_t iRows = m_Rows.GetSize();
+  if (iRows < 1) {
+    return fHeight;
+  }
+  FX_FLOAT fFixedHeight = 0;
+  FX_FLOAT fAutoHeigt = 0;
+  CFX_PtrArray autoRows;
+  CFX_PtrArray scaledRows;
+  FX_FLOAT fScaledRowNum = 0;
+  for (int32_t i = 0; i < iRows; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
+    if (!pColRow) {
+      continue;
+    }
+    switch (pColRow->m_Size.eUnit) {
+      case FWL_GRIDUNIT_Fixed: {
+        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
+        fFixedHeight += pColRow->m_fActualSize;
+        break;
+      }
+      case FWL_GRIDUNIT_Auto: {
+        ProcAutoColRow(pColRow, i, FALSE);
+        autoRows.Add(pColRow);
+        break;
+      }
+      case FWL_GRIDUNIT_Scaled:
+      default: {
+        fScaledRowNum += pColRow->m_Size.fLength;
+        scaledRows.Add(pColRow);
+        SetColRowActualSize(pColRow, 0);
+        break;
+      }
+    }
+  }
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget = NULL;
+    CFWL_GridWidgetInfo* pInfo = NULL;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    if (!pInfo || pInfo->m_iRowSpan < 2) {
+      continue;
+    }
+    CFX_PtrArray spanAutoRows;
+    FX_FLOAT fSpanSize = 0;
+    int32_t iAutoColRows = 0;
+    int32_t iScaledColRows = 0;
+    for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
+      CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
+          GetColRow(FALSE, pInfo->m_iRow + i));
+      if (!pRow) {
+        break;
+      }
+      fSpanSize += pRow->m_fActualSize;
+      if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
+        iAutoColRows++;
+        spanAutoRows.Add(pRow);
+      } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
+        iScaledColRows++;
+      }
+    }
+    if (iAutoColRows < 1) {
+      continue;
+    }
+    FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
+    if (fWidgetHeight > fSpanSize) {
+      if (iScaledColRows > 0) {
+      } else {
+        SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
+      }
+    }
+  }
+  int32_t iAutoRows = autoRows.GetSize();
+  for (int32_t k = 0; k < iAutoRows; k++) {
+    fAutoHeigt +=
+        reinterpret_cast<CFWL_GridColRow*>(autoRows[k])->m_fActualSize;
+  }
+  FX_FLOAT fScaledHeight = fHeight - fFixedHeight - fAutoHeigt;
+  if (fScaledHeight > 0 && fScaledRowNum > 0) {
+    SetScaledColRowsSize(scaledRows, fScaledHeight, fScaledRowNum);
+  }
+  return fHeight;
+}
+FX_FLOAT CFWL_GridImp::ProcessUnCertainColumns() {
+  int32_t iColumns = m_Columns.GetSize();
+  if (iColumns < 1) {
+    CFWL_GridColRow* pColRow = new CFWL_GridColRow;
+    pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
+    ProcAutoColRow(pColRow, 0, TRUE);
+    FX_FLOAT fWidth = pColRow->m_fActualSize;
+    delete pColRow;
+    return fWidth;
+  }
+  FX_FLOAT fFixedWidth = 0;
+  CFX_PtrArray autoColumns;
+  CFX_PtrArray scaledColumns;
+  FX_FLOAT fScaledColumnNum = 0;
+  FX_FLOAT fScaledMaxPerWidth = 0;
+  for (int32_t i = 0; i < iColumns; i++) {
+    CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(m_Columns[i]);
+    if (!pColRow) {
+      continue;
+    }
+    switch (pColRow->m_Size.eUnit) {
+      case FWL_GRIDUNIT_Fixed: {
+        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
+        fFixedWidth += pColRow->m_fActualSize;
+        break;
+      }
+      case FWL_GRIDUNIT_Auto: {
+        ProcAutoColRow(pColRow, i, TRUE);
+        autoColumns.Add(pColRow);
+        break;
+      }
+      case FWL_GRIDUNIT_Scaled:
+      default: {
+        ProcAutoColRow(pColRow, i, TRUE);
+        fScaledColumnNum += pColRow->m_Size.fLength;
+        scaledColumns.Add(pColRow);
+        if (pColRow->m_Size.fLength <= 0) {
+          break;
+        }
+        FX_FLOAT fPerWidth = pColRow->m_fActualSize / pColRow->m_Size.fLength;
+        if (fPerWidth > fScaledMaxPerWidth) {
+          fScaledMaxPerWidth = fPerWidth;
+        }
+      }
+    }
+  }
+  iColumns = scaledColumns.GetSize();
+  for (int32_t j = 0; j < iColumns; j++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledColumns[j]);
+    if (!pColRow) {
+      continue;
+    }
+    SetColRowActualSize(pColRow, fScaledMaxPerWidth * pColRow->m_Size.fLength);
+  }
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget = NULL;
+    CFWL_GridWidgetInfo* pInfo = NULL;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    if (!pInfo || pInfo->m_iColumnSpan < 2) {
+      continue;
+    }
+    CFX_PtrArray spanAutoColumns;
+    CFX_PtrArray spanScaledColumns;
+    FX_FLOAT fSpanSize = 0;
+    FX_FLOAT fScaledSum = 0;
+    int32_t iAutoColRows = 0;
+    int32_t iScaledColRows = 0;
+    for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
+      CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
+          GetColRow(TRUE, pInfo->m_iColumn + i));
+      if (!pColumn) {
+        break;
+      }
+      fSpanSize += pColumn->m_fActualSize;
+      if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
+        iAutoColRows++;
+        spanAutoColumns.Add(pColumn);
+      } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
+        iScaledColRows++;
+        fScaledSum += pColumn->m_Size.fLength;
+        spanScaledColumns.Add(pColumn);
+      }
+    }
+    if (iAutoColRows < 1 && iScaledColRows < 1) {
+      continue;
+    }
+    FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
+    if (fWidgetWidth > fSpanSize) {
+      if (iScaledColRows > 0) {
+        if (fScaledSum <= 0) {
+          continue;
+        }
+        SetSpanScaledColRowSize(spanScaledColumns, fWidgetWidth - fSpanSize,
+                                fScaledSum);
+      } else {
+        SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
+      }
+    }
+  }
+  FX_FLOAT fAutoWidth = 0;
+  int32_t iAutoCols = autoColumns.GetSize();
+  for (int32_t m = 0; m < iAutoCols; m++) {
+    fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[m])->m_fActualSize;
+  }
+  FX_FLOAT fScaledWidth = 0;
+  iColumns = scaledColumns.GetSize();
+  for (int32_t n = 0; n < iColumns; n++) {
+    fScaledWidth +=
+        static_cast<CFWL_GridColRow*>(scaledColumns[n])->m_fActualSize;
+  }
+  return fFixedWidth + fAutoWidth + fScaledWidth;
+}
+FX_FLOAT CFWL_GridImp::ProcessUnCertainRows() {
+  int32_t iRows = m_Rows.GetSize();
+  if (iRows < 1) {
+    CFWL_GridColRow* pColRow = new CFWL_GridColRow;
+    pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
+    ProcAutoColRow(pColRow, 0, FALSE);
+    FX_FLOAT fWidth = pColRow->m_fActualSize;
+    delete pColRow;
+    return fWidth;
+  }
+  FX_FLOAT fFixedHeight = 0;
+  CFX_PtrArray autoRows;
+  CFX_PtrArray scaledRows;
+  FX_FLOAT fScaledRowNum = 0;
+  FX_FLOAT fScaledMaxPerHeight = 0;
+  for (int32_t i = 0; i < iRows; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
+    if (!pColRow) {
+      continue;
+    }
+    switch (pColRow->m_Size.eUnit) {
+      case FWL_GRIDUNIT_Fixed: {
+        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
+        fFixedHeight += pColRow->m_fActualSize;
+        break;
+      }
+      case FWL_GRIDUNIT_Auto: {
+        ProcAutoColRow(pColRow, i, FALSE);
+        autoRows.Add(pColRow);
+        break;
+      }
+      case FWL_GRIDUNIT_Scaled:
+      default: {
+        ProcAutoColRow(pColRow, i, FALSE);
+        fScaledRowNum += pColRow->m_Size.fLength;
+        scaledRows.Add(pColRow);
+        if (pColRow->m_Size.fLength > 0) {
+          FX_FLOAT fPerHeight =
+              pColRow->m_fActualSize / pColRow->m_Size.fLength;
+          if (fPerHeight > fScaledMaxPerHeight) {
+            fScaledMaxPerHeight = fPerHeight;
+          }
+        }
+        break;
+      }
+    }
+  }
+  iRows = scaledRows.GetSize();
+  for (int32_t j = 0; j < iRows; j++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledRows[j]);
+    if (!pColRow) {
+      continue;
+    }
+    SetColRowActualSize(pColRow, fScaledMaxPerHeight * pColRow->m_Size.fLength);
+  }
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    void* key = nullptr;
+    void* value = nullptr;
+    m_mapWidgetInfo.GetNextAssoc(ps, key, value);
+    IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
+    CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
+    if (pInfo->m_iRowSpan < 2) {
+      continue;
+    }
+    CFX_PtrArray spanAutoRows;
+    CFX_PtrArray spanScaledRows;
+    FX_FLOAT fSpanSize = 0;
+    FX_FLOAT fScaledSum = 0;
+    int32_t iAutoColRows = 0;
+    int32_t iScaledColRows = 0;
+    for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
+      CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
+          GetColRow(FALSE, pInfo->m_iRow + i));
+      if (!pRow) {
+        break;
+      }
+      fSpanSize += pRow->m_fActualSize;
+      if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
+        iAutoColRows++;
+        spanAutoRows.Add(pRow);
+      } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
+        iScaledColRows++;
+        fScaledSum += pRow->m_Size.fLength;
+        spanScaledRows.Add(pRow);
+      }
+    }
+    if (iAutoColRows < 1 && iScaledColRows < 1) {
+      continue;
+    }
+    FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
+    if (fWidgetHeight > fSpanSize) {
+      if (iScaledColRows > 0) {
+        if (fScaledSum <= 0) {
+          continue;
+        }
+        SetSpanScaledColRowSize(spanScaledRows, fWidgetHeight - fSpanSize,
+                                fScaledSum);
+      } else {
+        SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
+      }
+    }
+  }
+  FX_FLOAT fAutoHeigt = 0;
+  int32_t iAutoRows = autoRows.GetSize();
+  for (int32_t m = 0; m < iAutoRows; m++) {
+    fAutoHeigt += static_cast<CFWL_GridColRow*>(autoRows[m])->m_fActualSize;
+  }
+  FX_FLOAT fScaledHeight = 0;
+  iRows = scaledRows.GetSize();
+  for (int32_t n = 0; n < iRows; n++) {
+    fScaledHeight +=
+        static_cast<CFWL_GridColRow*>(scaledRows[n])->m_fActualSize;
+  }
+  return fFixedHeight + fAutoHeigt + fScaledHeight;
+}
+FX_BOOL CFWL_GridImp::SetColRowActualSize(CFWL_GridColRow* pColRow,
+                                          FX_FLOAT fSize,
+                                          FX_BOOL bSetBeyond) {
+  if (pColRow->m_MinSize.eUnit == FWL_GRIDUNIT_Fixed &&
+      fSize < pColRow->m_MinSize.fLength) {
+    pColRow->m_fActualSize = pColRow->m_MinSize.fLength;
+    return FALSE;
+  }
+  if (pColRow->m_MaxSize.eUnit == FWL_GRIDUNIT_Fixed &&
+      fSize > pColRow->m_MaxSize.fLength) {
+    pColRow->m_fActualSize = pColRow->m_MaxSize.fLength;
+    return FALSE;
+  }
+  if (bSetBeyond) {
+    return TRUE;
+  }
+  pColRow->m_fActualSize = fSize;
+  return TRUE;
+}
+FX_FLOAT CFWL_GridImp::SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo,
+                                            FX_FLOAT fWidth) {
+  if (pInfo->m_Size[FWL_GRIDSIZE_MinWidth].eUnit == FWL_GRIDUNIT_Fixed &&
+      fWidth < pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength) {
+    fWidth = pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength;
+  }
+  if (pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].eUnit == FWL_GRIDUNIT_Fixed &&
+      fWidth > pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength) {
+    fWidth = pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength;
+  }
+  pInfo->m_fActualWidth = fWidth;
+  return fWidth;
+}
+FX_FLOAT CFWL_GridImp::SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo,
+                                             FX_FLOAT fHeight) {
+  if (pInfo->m_Size[FWL_GRIDSIZE_MinHeight].eUnit == FWL_GRIDUNIT_Fixed &&
+      fHeight < pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength) {
+    fHeight = pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength;
+  }
+  if (pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].eUnit == FWL_GRIDUNIT_Fixed &&
+      fHeight > pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength) {
+    fHeight = pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength;
+  }
+  pInfo->m_fActualHeight = fHeight;
+  return fHeight;
+}
+void CFWL_GridImp::SetAllWidgetsRect() {
+  FX_FLOAT fStartLeft = 0;
+  int32_t iColumns = m_Columns.GetSize();
+  for (int32_t i = 0; i < iColumns; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
+    if (!pColRow) {
+      continue;
+    }
+    pColRow->m_fActualPos = fStartLeft;
+    fStartLeft += pColRow->m_fActualSize;
+  }
+  FX_FLOAT fStartTop = 0;
+  int32_t iRows = m_Rows.GetSize();
+  for (int32_t j = 0; j < iRows; j++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
+    if (!pColRow) {
+      continue;
+    }
+    pColRow->m_fActualPos = fStartTop;
+    fStartTop += pColRow->m_fActualSize;
+  }
+  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
+  while (ps) {
+    IFWL_Widget* pWidget = NULL;
+    CFWL_GridWidgetInfo* pInfo = NULL;
+    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
+    if (!pWidget || !pInfo) {
+      continue;
+    }
+    FX_FLOAT fColumnStart = 0;
+    CFWL_GridColRow* pColumn =
+        reinterpret_cast<CFWL_GridColRow*>(GetColRow(TRUE, pInfo->m_iColumn));
+    if (pColumn) {
+      fColumnStart = pColumn->m_fActualPos;
+    }
+    FX_FLOAT fRowStart = 0;
+    CFWL_GridColRow* pRow =
+        reinterpret_cast<CFWL_GridColRow*>(GetColRow(FALSE, pInfo->m_iRow));
+    if (pRow) {
+      fRowStart = pRow->m_fActualPos;
+    }
+    FX_FLOAT fColumnWidth = 0;
+    if (iColumns > 0) {
+      for (int32_t j = 0; j < pInfo->m_iColumnSpan; j++) {
+        CFWL_GridColRow* pCol = reinterpret_cast<CFWL_GridColRow*>(
+            GetColRow(TRUE, pInfo->m_iColumn + j));
+        if (!pCol) {
+          break;
+        }
+        fColumnWidth += pCol->m_fActualSize;
+      }
+    } else {
+      fColumnWidth = m_pProperties->m_rtWidget.width;
+    }
+    FX_FLOAT fRowHeight = 0;
+    if (iRows > 0) {
+      for (int32_t k = 0; k < pInfo->m_iRowSpan; k++) {
+        CFWL_GridColRow* pR = reinterpret_cast<CFWL_GridColRow*>(
+            GetColRow(FALSE, pInfo->m_iRow + k));
+        if (!pR) {
+          break;
+        }
+        fRowHeight += pR->m_fActualSize;
+      }
+    } else {
+      fRowHeight = m_pProperties->m_rtWidget.height;
+    }
+    FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
+    FX_BOOL bLeftMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
+    FX_BOOL bRightMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
+    FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
+    FX_BOOL bTopMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
+    FX_BOOL bBottomMargin =
+        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
+    if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
+      SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
+    } else {
+      if (bLeftMargin && bRightMargin) {
+        SetWidgetActualWidth(pInfo, fColumnWidth - fLeftMargin - fRightMargin);
+      } else {
+        CFX_RectF rtAuto;
+        pWidget->GetWidgetRect(rtAuto, TRUE);
+        SetWidgetActualWidth(pInfo, rtAuto.width);
+      }
+    }
+    if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
+      SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
+    } else {
+      if (bTopMargin && bBottomMargin) {
+        SetWidgetActualHeight(pInfo, fRowHeight - fTopMargin - fBottomMargin);
+      } else {
+        CFX_RectF rtAuto;
+        pWidget->GetWidgetRect(rtAuto, TRUE);
+        SetWidgetActualHeight(pInfo, rtAuto.height);
+      }
+    }
+    if (bLeftMargin && bRightMargin &&
+        pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
+      fLeftMargin =
+          fColumnStart + fLeftMargin +
+          (fColumnWidth - fLeftMargin - fRightMargin - pInfo->m_fActualWidth) /
+              2;
+    } else if (bLeftMargin) {
+      fLeftMargin = fColumnStart + fLeftMargin;
+    } else if (bRightMargin) {
+      fLeftMargin =
+          fColumnStart + fColumnWidth - fRightMargin - pInfo->m_fActualWidth;
+    } else {
+      fLeftMargin = fColumnStart;
+    }
+    if (bTopMargin && bBottomMargin &&
+        pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
+      fTopMargin =
+          fRowStart + fTopMargin +
+          (fRowHeight - fTopMargin - fBottomMargin - pInfo->m_fActualHeight) /
+              2;
+    } else if (bTopMargin) {
+      fTopMargin = fRowStart + fTopMargin;
+    } else if (bBottomMargin) {
+      fTopMargin =
+          fRowStart + fRowHeight - fBottomMargin - pInfo->m_fActualHeight;
+    } else {
+      fTopMargin = fRowStart;
+    }
+    CFX_RectF rtWidget, rtOld;
+    rtWidget.Set(fLeftMargin, fTopMargin, pInfo->m_fActualWidth,
+                 pInfo->m_fActualHeight);
+    pWidget->GetWidgetRect(rtOld);
+    if (rtWidget == rtOld) {
+      continue;
+    }
+    pWidget->SetWidgetRect(rtWidget);
+    if (rtWidget.width == rtOld.width && rtWidget.height == rtOld.height) {
+      continue;
+    }
+    pWidget->Update();
+  }
+}
+FX_BOOL CFWL_GridImp::IsGrid(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FALSE;
+  return pWidget->GetClassID() == FWL_CLASSHASH_Grid;
+}
+void CFWL_GridImp::SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
+                                         FX_FLOAT fTotalSize) {
+  int32_t iAutoColRows = spanAutos.GetSize();
+  if (iAutoColRows < 1) {
+    return;
+  }
+  CFX_PtrArray autoNoMinMaxs;
+  FX_FLOAT fAutoPer = fTotalSize / iAutoColRows;
+  for (int32_t j = 0; j < iAutoColRows; j++) {
+    CFWL_GridColRow* pColumn = static_cast<CFWL_GridColRow*>(spanAutos[j]);
+    FX_FLOAT fOrgSize = pColumn->m_fActualSize;
+    if (SetColRowActualSize(pColumn, pColumn->m_fActualSize + fAutoPer, TRUE)) {
+      autoNoMinMaxs.Add(pColumn);
+    } else {
+      fTotalSize -= pColumn->m_fActualSize - fOrgSize;
+      int32_t iNoMinMax = iAutoColRows - (j + 1 - autoNoMinMaxs.GetSize());
+      if (iNoMinMax > 0 && fTotalSize > 0) {
+        fAutoPer = fTotalSize / iNoMinMax;
+      } else {
+        break;
+      }
+    }
+  }
+  int32_t iNormals = autoNoMinMaxs.GetSize();
+  if (fTotalSize > 0) {
+    if (iNormals == iAutoColRows) {
+      fAutoPer = fTotalSize / iNormals;
+      for (int32_t k = 0; k < iNormals; k++) {
+        CFWL_GridColRow* pColumn =
+            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[k]);
+        pColumn->m_fActualSize += fAutoPer;
+      }
+    } else {
+      SetSpanAutoColRowSize(autoNoMinMaxs, fTotalSize);
+    }
+  } else {
+  }
+}
+void CFWL_GridImp::SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
+                                           FX_FLOAT fTotalSize,
+                                           FX_FLOAT fTotalScaledNum) {
+  int32_t iScaledColRows = spanScaleds.GetSize();
+  if (iScaledColRows < 1) {
+    return;
+  }
+  CFX_PtrArray autoNoMinMaxs;
+  FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
+  for (int32_t i = 0; i < iScaledColRows; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
+    if (SetColRowActualSize(pColRow, pColRow->m_fActualSize +
+                                         fPerSize * pColRow->m_Size.fLength,
+                            TRUE)) {
+      autoNoMinMaxs.Add(pColRow);
+    } else {
+      fTotalSize -= pColRow->m_fActualSize;
+      fTotalScaledNum -= pColRow->m_Size.fLength;
+      int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
+      if (iNoMinMax > 0 && fTotalSize > 0) {
+        fPerSize = fTotalSize / fTotalScaledNum;
+      } else {
+        break;
+      }
+    }
+  }
+  int32_t iNormals = autoNoMinMaxs.GetSize();
+  if (fTotalSize > 0) {
+    if (iNormals == iScaledColRows) {
+      fPerSize = fTotalSize / fTotalScaledNum;
+      for (int32_t j = 0; j < iNormals; j++) {
+        CFWL_GridColRow* pColumn =
+            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[j]);
+        pColumn->m_fActualSize += fPerSize * pColumn->m_Size.fLength;
+      }
+    } else {
+      SetSpanScaledColRowSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
+    }
+  } else {
+  }
+}
+void CFWL_GridImp::SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
+                                        FX_FLOAT fTotalSize,
+                                        FX_FLOAT fTotalScaledNum) {
+  int32_t iScaledColRows = spanScaleds.GetSize();
+  if (iScaledColRows < 1) {
+    return;
+  }
+  CFX_PtrArray autoNoMinMaxs;
+  FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
+  for (int32_t i = 0; i < iScaledColRows; i++) {
+    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
+    if (!pColRow) {
+      continue;
+    }
+    FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
+    FX_FLOAT fOrgSize = pColRow->m_fActualSize;
+    if (SetColRowActualSize(pColRow, fSize, TRUE)) {
+      autoNoMinMaxs.Add(pColRow);
+    } else {
+      fTotalSize -= pColRow->m_fActualSize - fOrgSize;
+      fTotalScaledNum -= pColRow->m_Size.fLength;
+      int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
+      if (iNoMinMax > 0 && fTotalSize > 0) {
+        fPerSize = fTotalSize / fTotalScaledNum;
+      } else {
+        break;
+      }
+    }
+  }
+  int32_t iNormals = autoNoMinMaxs.GetSize();
+  if (fTotalSize > 0) {
+    if (iNormals == iScaledColRows) {
+      fPerSize = fTotalSize / fTotalScaledNum;
+      for (int32_t i = 0; i < iNormals; i++) {
+        CFWL_GridColRow* pColRow =
+            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[i]);
+        if (!pColRow) {
+          continue;
+        }
+        FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
+        pColRow->m_fActualSize = fSize;
+      }
+    } else {
+      SetScaledColRowsSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
+    }
+  } else {
+  }
+}
+CFWL_GridImpDelegate::CFWL_GridImpDelegate(CFWL_GridImp* pOwner)
+    : m_pOwner(pOwner) {}
+int32_t CFWL_GridImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (pMessage->GetClassID() != FWL_MSGHASH_Mouse) {
+    return 0;
+  }
+  CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+  if (pMsg->m_dwCmd != FWL_MSGMOUSECMD_LButtonDown) {
+    return 0;
+  }
+  return 1;
+}
+FWL_ERR CFWL_GridImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                           const CFX_Matrix* pMatrix) {
+  return m_pOwner->DrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fwl/core/fwl_gridimp.h b/xfa/fwl/core/fwl_gridimp.h
new file mode 100644
index 0000000..fda283f
--- /dev/null
+++ b/xfa/fwl/core/fwl_gridimp.h
@@ -0,0 +1,197 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_GRIDIMP_H_
+#define XFA_FWL_CORE_FWL_GRIDIMP_H_
+
+#include "xfa/fwl/core/fwl_contentimp.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_content.h"
+#include "xfa/include/fwl/core/fwl_grid.h"
+
+class CFWL_GridLength {
+ public:
+  CFWL_GridLength() : fLength(0), eUnit(FWL_GRIDUNIT_Fixed) {}
+  CFWL_GridLength(FX_FLOAT fValue, FWL_GRIDUNIT e)
+      : fLength(fValue), eUnit(e) {}
+  FX_FLOAT fLength;
+  FWL_GRIDUNIT eUnit;
+};
+
+class CFWL_GridColRow {
+ public:
+  CFWL_GridColRow()
+      : m_Size(1, FWL_GRIDUNIT_Scaled),
+        m_MinSize(0, FWL_GRIDUNIT_Fixed),
+        m_MaxSize(0, FWL_GRIDUNIT_Infinity),
+        m_fActualSize(0),
+        m_fActualPos(0) {}
+  CFWL_GridLength m_Size;
+  CFWL_GridLength m_MinSize;
+  CFWL_GridLength m_MaxSize;
+  FX_FLOAT m_fActualSize;
+  FX_FLOAT m_fActualPos;
+};
+
+class CFWL_GridWidgetInfo {
+ public:
+  CFWL_GridWidgetInfo()
+      : m_iColumn(0),
+        m_iColumnSpan(1),
+        m_iRow(0),
+        m_iRowSpan(1),
+        m_dwMarginFlag(0),
+        m_fActualWidth(0),
+        m_fActualHeight(0) {
+    m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
+    m_Size[FWL_GRIDSIZE_Width].fLength = 0;
+    m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
+    m_Size[FWL_GRIDSIZE_Height].fLength = 0;
+    m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
+    m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
+    m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
+    m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
+    m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
+    m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
+    m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
+    m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
+    m_Margin[0] = m_Margin[1] = m_Margin[2] = m_Margin[3] = 0;
+  }
+  int32_t m_iColumn;
+  int32_t m_iColumnSpan;
+  int32_t m_iRow;
+  int32_t m_iRowSpan;
+  CFWL_GridLength m_Size[6];
+  FX_DWORD m_dwMarginFlag;
+  FX_FLOAT m_Margin[4];
+  FX_FLOAT m_fActualWidth;
+  FX_FLOAT m_fActualHeight;
+};
+
+class CFWL_GridImp : public CFWL_ContentImp {
+ public:
+  CFWL_GridImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
+  virtual ~CFWL_GridImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+
+  virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
+  virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
+  virtual FWL_HGRIDCOLROW InsertColRow(FX_BOOL bColumn, int32_t nIndex = -1);
+  virtual int32_t CountColRows(FX_BOOL bColumn);
+  virtual FWL_HGRIDCOLROW GetColRow(FX_BOOL bColumn, int32_t nIndex);
+  virtual int32_t GetIndex(FWL_HGRIDCOLROW hColRow);
+  virtual FX_FLOAT GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
+  virtual FWL_ERR SetSize(FWL_HGRIDCOLROW hColRow,
+                          FX_FLOAT fSize,
+                          FWL_GRIDUNIT eUnit);
+  FX_FLOAT GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
+  FWL_ERR SetMinSize(FWL_HGRIDCOLROW hColRow,
+                     FX_FLOAT fSize,
+                     FWL_GRIDUNIT eUnit);
+  FX_FLOAT GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
+  FWL_ERR SetMaxSize(FWL_HGRIDCOLROW hColRow,
+                     FX_FLOAT fSize,
+                     FWL_GRIDUNIT eUnit);
+  virtual FX_BOOL DeleteColRow(FWL_HGRIDCOLROW hColRow);
+  virtual FX_BOOL IsColumn(FWL_HGRIDCOLROW hColRow);
+  virtual int32_t GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn);
+  virtual FWL_ERR SetWidgetPos(IFWL_Widget* pWidget,
+                               int32_t iPos,
+                               FX_BOOL bColumn);
+  virtual int32_t GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn);
+  virtual FWL_ERR SetWidgetSpan(IFWL_Widget* pWidget,
+                                int32_t iSpan,
+                                FX_BOOL bColumn);
+  virtual FX_FLOAT GetWidgetSize(IFWL_Widget* pWidget,
+                                 FWL_GRIDSIZE eSize,
+                                 FWL_GRIDUNIT& eUnit);
+  virtual FWL_ERR SetWidgetSize(IFWL_Widget* pWidget,
+                                FWL_GRIDSIZE eSize,
+                                FX_FLOAT fSize,
+                                FWL_GRIDUNIT eUit);
+  virtual FX_BOOL GetWidgetMargin(IFWL_Widget* pWidget,
+                                  FWL_GRIDMARGIN eMargin,
+                                  FX_FLOAT& fMargin);
+  virtual FWL_ERR SetWidgetMargin(IFWL_Widget* pWidget,
+                                  FWL_GRIDMARGIN eMargin,
+                                  FX_FLOAT fMargin);
+  virtual FWL_ERR RemoveWidgetMargin(IFWL_Widget* pWidget,
+                                     FWL_GRIDMARGIN eMargin);
+  virtual FX_FLOAT GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit);
+  virtual FWL_ERR SetGridSize(FWL_GRIDSIZE eSize,
+                              FX_FLOAT fSize,
+                              FWL_GRIDUNIT eUit);
+
+ protected:
+  CFWL_GridWidgetInfo* GetWidgetInfo(IFWL_Widget* pWidget);
+  void ProcFixedColRow(CFWL_GridColRow* pColRow,
+                       int32_t nIndex,
+                       FX_FLOAT fColRowSize,
+                       FX_BOOL bColumn);
+  void ProcAutoColRow(CFWL_GridColRow* pColRow,
+                      int32_t nIndex,
+                      FX_BOOL bColumn);
+  void ProcScaledColRow(CFWL_GridColRow* pColRow,
+                        int32_t nIndex,
+                        FX_FLOAT fColRowSize,
+                        FX_BOOL bColumn);
+  void CalcWidgetWidth(IFWL_Widget* pWidget,
+                       CFWL_GridWidgetInfo* pInfo,
+                       FX_FLOAT fColunmWidth);
+  void CalcWidgetHeigt(IFWL_Widget* pWidget,
+                       CFWL_GridWidgetInfo* pInfo,
+                       FX_FLOAT fRowHeigt);
+  FX_FLOAT CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
+                                     CFWL_GridWidgetInfo* pInfo);
+  FX_FLOAT CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
+                                      CFWL_GridWidgetInfo* pInfo);
+  FX_FLOAT ProcessColumns(FX_FLOAT fWidth);
+  FX_FLOAT ProcessRows(FX_FLOAT fHeight);
+  FX_FLOAT ProcessUnCertainColumns();
+  FX_FLOAT ProcessUnCertainRows();
+  FX_BOOL SetColRowActualSize(CFWL_GridColRow* pColRow,
+                              FX_FLOAT fSize,
+                              FX_BOOL bSetBeyond = FALSE);
+  FX_FLOAT SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fWidth);
+  FX_FLOAT SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fHeight);
+  void SetAllWidgetsRect();
+  FX_BOOL IsGrid(IFWL_Widget* pWidget);
+  void SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
+                             FX_FLOAT fTotalSize);
+  void SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
+                               FX_FLOAT fTotalSize,
+                               FX_FLOAT fTotalScaledNum);
+  void SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
+                            FX_FLOAT fTotalSize,
+                            FX_FLOAT fTotalScaledNum);
+  CFX_PtrArray m_Rows;
+  CFX_PtrArray m_Columns;
+  CFX_PtrArray m_Widgets;
+  CFX_MapPtrToPtr m_mapWidgetInfo;
+  CFWL_GridLength m_Size[6];
+  friend class CFWL_GridImpDelegate;
+};
+
+class CFWL_GridImpDelegate : public CFWL_WidgetImpDelegate {
+ public:
+  CFWL_GridImpDelegate(CFWL_GridImp* pOwner);
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+ protected:
+  CFWL_GridImp* m_pOwner;
+};
+
+#endif  // XFA_FWL_CORE_FWL_GRIDIMP_H_
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
new file mode 100644
index 0000000..cadace4
--- /dev/null
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -0,0 +1,1097 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fwl/basewidget/fwl_tooltipctrlimp.h"
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_grid.h"
+
+CFWL_NoteLoop::CFWL_NoteLoop(CFWL_WidgetImp* pForm)
+    : m_pForm(pForm), m_bContinueModal(TRUE) {}
+FX_BOOL CFWL_NoteLoop::PreProcessMessage(CFWL_Message* pMessage) {
+  if (!m_pForm) {
+    return FALSE;
+  }
+  return TranslateAccelerator(pMessage);
+}
+FWL_ERR CFWL_NoteLoop::Idle(int32_t count) {
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_)
+  if (count <= 0) {
+#endif
+    CFWL_EvtIdle ev;
+    IFWL_App* pApp = FWL_GetApp();
+    if (!pApp)
+      return FWL_ERR_Indefinite;
+    IFWL_NoteDriver* pDriver = pApp->GetNoteDriver();
+    if (!pDriver)
+      return FWL_ERR_Indefinite;
+    pDriver->SendNote(&ev);
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_)
+  }
+#endif
+  return FWL_ERR_Indefinite;
+}
+CFWL_WidgetImp* CFWL_NoteLoop::GetForm() {
+  return m_pForm;
+}
+FX_BOOL CFWL_NoteLoop::ContinueModal() {
+  return m_bContinueModal;
+}
+FWL_ERR CFWL_NoteLoop::EndModalLoop() {
+  m_bContinueModal = FALSE;
+#if (_FX_OS_ == _FX_MACOSX_)
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
+  adapterWidgetMgr->EndLoop();
+#endif
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_NoteLoop::TranslateAccelerator(CFWL_Message* pMessage) {
+  if (pMessage->GetClassID() != FWL_MSGHASH_Key) {
+    return FALSE;
+  }
+  CFWL_MsgKey* pMsgKey = static_cast<CFWL_MsgKey*>(pMessage);
+  if (pMsgKey->m_dwCmd != FWL_MSGKEYCMD_KeyDown) {
+    return FALSE;
+  }
+  CFX_MapAccelerators& accel =
+      static_cast<CFWL_FormImp*>(m_pForm)->GetAccelerator();
+  FX_POSITION pos = accel.GetStartPosition();
+  if (!pos) {
+    return FALSE;
+  }
+  FX_DWORD vrKey, rValue;
+  while (pos) {
+    accel.GetNextAssoc(pos, vrKey, rValue);
+    FX_DWORD dwFlags = (vrKey & 0xFF00) >> 8;
+    FX_DWORD m_dwKeyCode = vrKey & 0x00FF;
+    if (pMsgKey->m_dwFlags == dwFlags && pMsgKey->m_dwKeyCode == m_dwKeyCode) {
+      GenerateCommondEvent(rValue);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FWL_ERR CFWL_NoteLoop::SetMainForm(CFWL_WidgetImp* pForm) {
+  m_pForm = pForm;
+  return FWL_ERR_Succeeded;
+}
+void CFWL_NoteLoop::GenerateCommondEvent(FX_DWORD dwCommand) {
+  CFWL_EvtMenuCommand ev;
+  ev.m_iCommand = dwCommand;
+  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
+  if (!pDriver)
+    return;
+  pDriver->SendNote(&ev);
+}
+CFWL_NoteDriver::CFWL_NoteDriver()
+    : m_sendEventCalled(0),
+      m_maxSize(500),
+      m_bFullScreen(FALSE),
+      m_pHover(nullptr),
+      m_pFocus(nullptr),
+      m_pGrab(nullptr),
+      m_hook(nullptr) {
+  m_pNoteLoop = new CFWL_NoteLoop;
+  PushNoteLoop(m_pNoteLoop);
+}
+CFWL_NoteDriver::~CFWL_NoteDriver() {
+  delete m_pNoteLoop;
+  ClearInvalidEventTargets(TRUE);
+}
+FX_BOOL CFWL_NoteDriver::SendNote(CFWL_Note* pNote) {
+  if (pNote->IsEvent()) {
+    int32_t iCount = m_eventTargets.GetCount();
+    if (iCount < 1) {
+      return TRUE;
+    }
+    if (FWL_EVTHASH_Mouse == static_cast<CFWL_Event*>(pNote)->GetClassID()) {
+      CFWL_EvtMouse* pMouse = static_cast<CFWL_EvtMouse*>(pNote);
+      if (FWL_MSGMOUSECMD_MouseHover == pMouse->m_dwCmd) {
+        if (m_pNoteLoop->GetForm() &&
+            CFWL_ToolTipContainer::getInstance()->ProcessEnter(
+                pMouse, m_pNoteLoop->GetForm()->GetInterface())) {
+        }
+      } else if (FWL_MSGMOUSECMD_MouseLeave == pMouse->m_dwCmd) {
+        if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
+        }
+      } else if ((FWL_MSGMOUSECMD_LButtonDown <= pMouse->m_dwCmd) &&
+                 (FWL_MSGMOUSECMD_MButtonDblClk >= pMouse->m_dwCmd)) {
+        if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
+        }
+      }
+    }
+    m_sendEventCalled++;
+    FX_POSITION pos = m_eventTargets.GetStartPosition();
+    while (pos) {
+      void* key = NULL;
+      CFWL_EventTarget* pEventTarget;
+      m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
+      if (pEventTarget && !pEventTarget->IsInvalid()) {
+        pEventTarget->ProcessEvent(static_cast<CFWL_Event*>(pNote));
+      }
+    }
+    m_sendEventCalled--;
+  } else {
+    if (!pNote->m_pDstTarget)
+      return FALSE;
+    IFWL_WidgetDelegate* pDelegate = pNote->m_pDstTarget->SetDelegate(NULL);
+    if (pDelegate) {
+      pDelegate->OnProcessMessage(static_cast<CFWL_Message*>(pNote));
+    }
+  }
+  return TRUE;
+}
+extern void FWL_PostMessageToMainRoop(CFWL_Message* pMessage);
+FX_BOOL CFWL_NoteDriver::PostMessage(CFWL_Message* pMessage) {
+  FWL_PostMessageToMainRoop(pMessage);
+  return TRUE;
+}
+#define FWL_NoteDriver_EventKey 1100
+FWL_ERR CFWL_NoteDriver::RegisterEventTarget(IFWL_Widget* pListener,
+                                             IFWL_Widget* pEventSource,
+                                             FX_DWORD dwFilter) {
+  FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
+      (void*)(uintptr_t)FWL_NoteDriver_EventKey);
+  if (dwkey == 0) {
+    void* random = FX_Random_MT_Start(0);
+    dwkey = rand();
+    FX_Random_MT_Close(random);
+    pListener->SetPrivateData((void*)(uintptr_t)FWL_NoteDriver_EventKey,
+                              (void*)(uintptr_t)dwkey, NULL);
+  }
+  CFWL_EventTarget* value = NULL;
+  if (!m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
+    value = new CFWL_EventTarget(this, pListener);
+    m_eventTargets.SetAt((void*)(uintptr_t)dwkey, value);
+  }
+  value->SetEventSource(pEventSource, dwFilter);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_NoteDriver::UnregisterEventTarget(IFWL_Widget* pListener) {
+  FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
+      (void*)(uintptr_t)FWL_NoteDriver_EventKey);
+  if (dwkey == 0) {
+    return FWL_ERR_Indefinite;
+  }
+  CFWL_EventTarget* value = NULL;
+  if (m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
+    value->FlagInvalid();
+  }
+  return FWL_ERR_Succeeded;
+}
+void CFWL_NoteDriver::ClearEventTargets(FX_BOOL bRemoveAll) {
+  ClearInvalidEventTargets(bRemoveAll);
+}
+int32_t CFWL_NoteDriver::GetQueueMaxSize() const {
+  return m_maxSize;
+}
+FWL_ERR CFWL_NoteDriver::SetQueueMaxSize(const int32_t size) {
+  m_maxSize = size;
+  return FWL_ERR_Succeeded;
+}
+IFWL_NoteThread* CFWL_NoteDriver::GetOwnerThread() const {
+  return FWL_GetApp();
+}
+FWL_ERR CFWL_NoteDriver::PushNoteLoop(IFWL_NoteLoop* pNoteLoop) {
+  m_noteLoopQueue.Add(pNoteLoop);
+  return FWL_ERR_Succeeded;
+}
+IFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() {
+  int32_t pos = m_noteLoopQueue.GetSize();
+  if (pos <= 0)
+    return NULL;
+  IFWL_NoteLoop* p =
+      static_cast<IFWL_NoteLoop*>(m_noteLoopQueue.GetAt(pos - 1));
+  m_noteLoopQueue.RemoveAt(pos - 1);
+  return p;
+}
+FX_BOOL CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify) {
+  if (m_pFocus == pFocus) {
+    return TRUE;
+  }
+  IFWL_Widget* pPrev = m_pFocus;
+  m_pFocus = pFocus;
+  if (pPrev) {
+    CFWL_MsgKillFocus ms;
+    ms.m_pDstTarget = pPrev;
+    ms.m_pSrcTarget = pPrev;
+    if (bNotify) {
+      ms.m_dwExtend = 1;
+    }
+    IFWL_WidgetDelegate* pDelegate = pPrev->SetDelegate(NULL);
+    if (pDelegate) {
+      pDelegate->OnProcessMessage(&ms);
+    }
+  }
+  if (pFocus) {
+    IFWL_Widget* pWidget =
+        FWL_GetWidgetMgr()->GetWidget(pFocus, FWL_WGTRELATION_SystemForm);
+    CFWL_FormImp* pForm =
+        pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
+    if (pForm) {
+      CFWL_WidgetImp* pNewFocus =
+          static_cast<CFWL_WidgetImp*>(pFocus->GetImpl());
+      pForm->SetSubFocus(pNewFocus);
+    }
+    CFWL_MsgSetFocus ms;
+    ms.m_pDstTarget = pFocus;
+    if (bNotify) {
+      ms.m_dwExtend = 1;
+    }
+    IFWL_WidgetDelegate* pDelegate = pFocus->SetDelegate(NULL);
+    if (pDelegate) {
+      pDelegate->OnProcessMessage(&ms);
+    }
+  }
+  return TRUE;
+}
+FWL_ERR CFWL_NoteDriver::Run() {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return FWL_ERR_Indefinite;
+#if (_FX_OS_ == _FX_MACOSX_)
+  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
+  CFWL_NoteLoop* pTopLoop = GetTopLoop();
+  if (pTopLoop) {
+    CFWL_WidgetImp* formImp = pTopLoop->GetForm();
+    if (formImp) {
+      IFWL_Widget* pForm = formImp->GetInterface();
+      adapterWidgetMgr->RunLoop(pForm);
+    }
+  }
+#elif(_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
+    FX_BOOL bIdle = TRUE;
+    int32_t iIdleCount = 0;
+    CFWL_NoteLoop* pTopLoop = NULL;
+    for (;;) {
+      pTopLoop = GetTopLoop();
+      if (!pTopLoop || !pTopLoop->ContinueModal()) {
+        break;
+      }
+      if (UnqueueMessage(pTopLoop)) {
+        continue;
+      }
+      while (bIdle && !(pWidgetMgr->CheckMessage_Native())) {
+        if (FWL_ERR_Indefinite == pTopLoop->Idle(iIdleCount++)) {
+          bIdle = FALSE;
+        }
+      }
+      do {
+        if (FWL_ERR_Indefinite == pWidgetMgr->DispatchMessage_Native()) {
+          break;
+        }
+        if (pWidgetMgr->IsIdleMessage_Native()) {
+          bIdle = TRUE;
+          iIdleCount = 0;
+        }
+      } while (pWidgetMgr->CheckMessage_Native());
+    }
+#elif(_FX_OS_ == _FX_LINUX_DESKTOP_)
+    CFWL_NoteLoop* pTopLoop = NULL;
+    for (;;) {
+      pTopLoop = GetTopLoop();
+      if (!pTopLoop || !pTopLoop->ContinueModal()) {
+        break;
+      }
+      if (UnqueueMessage(pTopLoop)) {
+        continue;
+      }
+      if (pWidgetMgr->CheckMessage_Native()) {
+        pWidgetMgr->DispatchMessage_Native();
+      }
+    }
+#endif
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_NoteDriver::GetFocus() {
+  return m_pFocus;
+}
+IFWL_Widget* CFWL_NoteDriver::GetHover() {
+  return m_pHover;
+}
+void CFWL_NoteDriver::SetHover(IFWL_Widget* pHover) {
+  m_pHover = pHover;
+}
+void CFWL_NoteDriver::SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) {
+  m_pGrab = bSet ? pGrab : NULL;
+}
+void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget* pNoteTarget) {
+  if (m_pFocus == pNoteTarget) {
+    m_pFocus = NULL;
+  }
+  if (m_pHover == pNoteTarget) {
+    m_pHover = NULL;
+  }
+  if (m_pGrab == pNoteTarget) {
+    m_pGrab = NULL;
+  }
+}
+void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget* pNoteTarget) {
+  if (m_pFocus == pNoteTarget) {
+    m_pFocus = NULL;
+  }
+  if (m_pHover == pNoteTarget) {
+    m_pHover = NULL;
+  }
+  if (m_pGrab == pNoteTarget) {
+    m_pGrab = NULL;
+  }
+  UnregisterEventTarget(pNoteTarget);
+  int32_t count = m_forms.GetSize();
+  for (int32_t nIndex = 0; nIndex < count; nIndex++) {
+    CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[nIndex]);
+    if (!pForm) {
+      continue;
+    }
+    CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
+    if (!pSubFocus)
+      return;
+    if (pSubFocus && pSubFocus->GetInterface() == pNoteTarget) {
+      pForm->SetSubFocus(NULL);
+    }
+  }
+}
+void CFWL_NoteDriver::NotifyFullScreenMode(IFWL_Widget* pNoteTarget,
+                                           FX_BOOL bFullScreen) {
+  m_bFullScreen = bFullScreen;
+}
+FWL_ERR CFWL_NoteDriver::RegisterForm(CFWL_WidgetImp* pForm) {
+  if (!pForm)
+    return FWL_ERR_Indefinite;
+  if (m_forms.Find(pForm) >= 0) {
+    return FWL_ERR_Indefinite;
+  }
+  m_forms.Add(pForm);
+  if (m_forms.GetSize() == 1) {
+    CFWL_NoteLoop* pLoop =
+        static_cast<CFWL_NoteLoop*>(m_noteLoopQueue.GetAt(0));
+    if (!pLoop)
+      return FWL_ERR_Indefinite;
+    pLoop->SetMainForm(pForm);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_NoteDriver::UnRegisterForm(CFWL_WidgetImp* pForm) {
+  if (!pForm)
+    return FWL_ERR_Indefinite;
+  int32_t nIndex = m_forms.Find(pForm);
+  if (nIndex < 0) {
+    return FWL_ERR_Indefinite;
+  }
+  m_forms.RemoveAt(nIndex);
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_NoteDriver::QueueMessage(CFWL_Message* pMessage) {
+  pMessage->Retain();
+  m_noteQueue.Add(pMessage);
+  return TRUE;
+}
+FX_BOOL CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop* pNoteLoop) {
+  if (m_noteQueue.GetSize() < 1) {
+    return FALSE;
+  }
+  CFWL_Message* pMessage = static_cast<CFWL_Message*>(m_noteQueue[0]);
+  m_noteQueue.RemoveAt(0);
+  if (!IsValidMessage(pMessage)) {
+    pMessage->Release();
+    return TRUE;
+  }
+  FX_BOOL bHookMessage = FALSE;
+  if (m_hook) {
+    bHookMessage = (*m_hook)(pMessage, m_hookInfo);
+  }
+  if (!bHookMessage && !pNoteLoop->PreProcessMessage(pMessage)) {
+    ProcessMessage(pMessage);
+  }
+  pMessage->Release();
+  return TRUE;
+}
+CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() {
+  int32_t size = m_noteLoopQueue.GetSize();
+  if (size <= 0)
+    return NULL;
+  return static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[size - 1]);
+}
+int32_t CFWL_NoteDriver::CountLoop() {
+  return m_noteLoopQueue.GetSize();
+}
+void CFWL_NoteDriver::SetHook(FWLMessageHookCallback callback, void* info) {
+  m_hook = callback;
+  m_hookInfo = info;
+}
+FX_BOOL CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  IFWL_Widget* pMessageForm = pWidgetMgr->IsFormDisabled()
+                                  ? pMessage->m_pDstTarget
+                                  : GetMessageForm(pMessage->m_pDstTarget);
+  if (!pMessageForm)
+    return FALSE;
+  if (DispatchMessage(pMessage, pMessageForm)) {
+    if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) {
+      MouseSecondary(static_cast<CFWL_MsgMouse*>(pMessage));
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage,
+                                         IFWL_Widget* pMessageForm) {
+  FX_BOOL bRet = FALSE;
+  switch (pMessage->GetClassID()) {
+    case FWL_MSGHASH_Activate: {
+      bRet = DoActivate(static_cast<CFWL_MsgActivate*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_Deactivate: {
+      bRet = DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage),
+                          pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_SetFocus: {
+      bRet = DoSetFocus(static_cast<CFWL_MsgSetFocus*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_KillFocus: {
+      bRet =
+          DoKillFocus(static_cast<CFWL_MsgKillFocus*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      bRet = DoKey(static_cast<CFWL_MsgKey*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_Mouse: {
+      bRet = DoMouse(static_cast<CFWL_MsgMouse*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_MouseWheel: {
+      bRet = DoWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage), pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_Size: {
+      bRet = DoSize(static_cast<CFWL_MsgSize*>(pMessage));
+      break;
+    }
+    case FWL_MSGHASH_Cursor: {
+      bRet = TRUE;
+      break;
+    }
+    case FWL_MSGHASH_WindowMove: {
+      bRet = DoWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage),
+                          pMessageForm);
+      break;
+    }
+    case FWL_MSGHASH_DropFiles: {
+      bRet =
+          DoDragFiles(static_cast<CFWL_MsgDropFiles*>(pMessage), pMessageForm);
+      break;
+    }
+    default: {
+      bRet = TRUE;
+      break;
+    }
+  }
+  if (bRet) {
+    IFWL_WidgetDelegate* pDelegate = pMessage->m_pDstTarget->SetDelegate(NULL);
+    if (pDelegate) {
+      pDelegate->OnProcessMessage(pMessage);
+    }
+  }
+  return bRet;
+}
+FX_BOOL CFWL_NoteDriver::DoActivate(CFWL_MsgActivate* pMsg,
+                                    IFWL_Widget* pMessageForm) {
+  if (m_bFullScreen) {
+    return FALSE;
+  }
+  pMsg->m_pDstTarget = pMessageForm;
+  return (pMsg->m_pDstTarget)->GetStates() & FWL_WGTSTATE_Deactivated;
+}
+FX_BOOL CFWL_NoteDriver::DoDeactivate(CFWL_MsgDeactivate* pMsg,
+                                      IFWL_Widget* pMessageForm) {
+  if (m_bFullScreen) {
+    return FALSE;
+  }
+  int32_t iTrackLoop = m_noteLoopQueue.GetSize();
+  if (iTrackLoop <= 0)
+    return FALSE;
+  if (iTrackLoop == 1) {
+    if (pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
+      return FALSE;
+    }
+    if (pMsg->m_pSrcTarget &&
+        pMsg->m_pSrcTarget->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
+      return FALSE;
+    }
+    if (pMsg->m_pSrcTarget && pMsg->m_pSrcTarget->GetClassID() == 1111984755) {
+      return FALSE;
+    }
+    return TRUE;
+  }
+  IFWL_Widget* pDst = pMsg->m_pDstTarget;
+  if (!pDst)
+    return FALSE;
+#if (_FX_OS_ == _FX_MACOSX_)
+  if (pDst == pMessageForm && pDst->IsInstance(L"FWL_FORMPROXY")) {
+    return TRUE;
+  }
+#endif
+  return pDst != pMessageForm &&
+         !pDst->IsInstance(FX_WSTRC(L"FWL_FORMPROXY")) &&
+         !pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"));
+}
+FX_BOOL CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus* pMsg,
+                                    IFWL_Widget* pMessageForm) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (pWidgetMgr->IsFormDisabled()) {
+    m_pFocus = pMsg->m_pDstTarget;
+    return TRUE;
+  } else {
+    IFWL_Widget* pWidget = pMsg->m_pDstTarget;
+    CFWL_FormImp* pForm =
+        pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
+    if (pForm) {
+      CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
+      if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) {
+        pMsg->m_pDstTarget = pSubFocus->GetInterface();
+        if (m_pFocus != pMsg->m_pDstTarget) {
+          m_pFocus = pMsg->m_pDstTarget;
+          return TRUE;
+        }
+      }
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_NoteDriver::DoKillFocus(CFWL_MsgKillFocus* pMsg,
+                                     IFWL_Widget* pMessageForm) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (pWidgetMgr->IsFormDisabled()) {
+    if (m_pFocus == pMsg->m_pDstTarget) {
+      m_pFocus = NULL;
+    }
+    return TRUE;
+  }
+  IFWL_Widget* pWidget = pMsg->m_pDstTarget;
+  CFWL_FormImp* pForm =
+      pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
+  if (pForm) {
+    CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
+    if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) {
+      pMsg->m_pDstTarget = pSubFocus->GetInterface();
+      if (m_pFocus == pMsg->m_pDstTarget) {
+        m_pFocus = NULL;
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_NoteDriver::DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm) {
+#if (_FX_OS_ != _FX_MACOSX_)
+  if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
+      pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
+    CFWL_WidgetMgr* pWidgetMgr =
+        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+    IFWL_Widget* pForm = GetMessageForm(pMsg->m_pDstTarget);
+    IFWL_Widget* pFocus = m_pFocus;
+    if (m_pFocus) {
+      if (pWidgetMgr->GetWidget(m_pFocus, FWL_WGTRELATION_SystemForm) !=
+          pForm) {
+        pFocus = NULL;
+      }
+    }
+    FX_BOOL bFind = FALSE;
+    IFWL_Widget* pNextTabStop = pWidgetMgr->nextTab(pForm, pFocus, bFind);
+    if (!pNextTabStop) {
+      bFind = FALSE;
+      pNextTabStop = pWidgetMgr->nextTab(pForm, NULL, bFind);
+    }
+    if (pNextTabStop == pFocus) {
+      return TRUE;
+    }
+    if (pNextTabStop) {
+      SetFocus(pNextTabStop);
+    }
+    return TRUE;
+  }
+#endif
+  if (!m_pFocus) {
+    if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
+        pMsg->m_dwKeyCode == FWL_VKEY_Return) {
+      CFWL_WidgetMgr* pWidgetMgr =
+          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+      IFWL_Widget* defButton = pWidgetMgr->GetDefaultButton(pMessageForm);
+      if (defButton) {
+        pMsg->m_pDstTarget = defButton;
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+  pMsg->m_pDstTarget = m_pFocus;
+  return TRUE;
+}
+FX_BOOL CFWL_NoteDriver::DoMouse(CFWL_MsgMouse* pMsg,
+                                 IFWL_Widget* pMessageForm) {
+  if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave ||
+      pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseHover ||
+      pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) {
+    return pMsg->m_pDstTarget != NULL;
+  }
+  if (pMsg->m_pDstTarget != pMessageForm) {
+    pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy);
+  }
+  if (!DoMouseEx(pMsg, pMessageForm)) {
+    pMsg->m_pDstTarget = pMessageForm;
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_NoteDriver::DoWheel(CFWL_MsgMouseWheel* pMsg,
+                                 IFWL_Widget* pMessageForm) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return FALSE;
+  IFWL_Widget* pDst =
+      pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
+  if (!pDst)
+    return FALSE;
+  while (pDst && pDst->GetClassID() == FWL_CLASSHASH_Grid) {
+    pDst = pDst->GetParent();
+  }
+  pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy);
+  pMsg->m_pDstTarget = pDst;
+  return TRUE;
+}
+FX_BOOL CFWL_NoteDriver::DoSize(CFWL_MsgSize* pMsg) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return FALSE;
+  pWidgetMgr->NotifySizeChanged(pMsg->m_pDstTarget, (FX_FLOAT)pMsg->m_iWidth,
+                                (FX_FLOAT)pMsg->m_iHeight);
+  return TRUE;
+}
+FX_BOOL CFWL_NoteDriver::DoWindowMove(CFWL_MsgWindowMove* pMsg,
+                                      IFWL_Widget* pMessageForm) {
+  return pMsg->m_pDstTarget == pMessageForm;
+}
+FX_BOOL CFWL_NoteDriver::DoDragFiles(CFWL_MsgDropFiles* pMsg,
+                                     IFWL_Widget* pMessageForm) {
+  return pMsg->m_pDstTarget == pMessageForm;
+}
+FX_BOOL CFWL_NoteDriver::DoMouseEx(CFWL_MsgMouse* pMsg,
+                                   IFWL_Widget* pMessageForm) {
+  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  if (!pWidgetMgr)
+    return FALSE;
+  IFWL_Widget* pTarget = NULL;
+  if (m_pGrab)
+    pTarget = m_pGrab;
+  if (!pTarget) {
+    pTarget =
+        pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
+    while (pTarget && pTarget->GetClassID() == FWL_CLASSHASH_Grid) {
+      pTarget = pTarget->GetParent();
+    }
+  }
+  if (pTarget) {
+    if (pMessageForm != pTarget) {
+      pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy);
+    }
+  }
+  if (!pTarget)
+    return FALSE;
+  pMsg->m_pDstTarget = pTarget;
+  return TRUE;
+}
+void CFWL_NoteDriver::MouseSecondary(CFWL_MsgMouse* pMsg) {
+  IFWL_Widget* pTarget = pMsg->m_pDstTarget;
+  if (pTarget == m_pHover) {
+    return;
+  }
+  if (m_pHover) {
+    CFWL_MsgMouse msLeave;
+    msLeave.m_pDstTarget = m_pHover;
+    msLeave.m_fx = pMsg->m_fx;
+    msLeave.m_fy = pMsg->m_fy;
+    pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy);
+    msLeave.m_dwFlags = 0;
+    msLeave.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave;
+    DispatchMessage(&msLeave, NULL);
+  }
+  if (pTarget->GetClassID() == FWL_CLASSHASH_Form) {
+    m_pHover = NULL;
+    return;
+  }
+  m_pHover = pTarget;
+  CFWL_MsgMouse msHover;
+  msHover.m_pDstTarget = pTarget;
+  msHover.m_fx = pMsg->m_fx;
+  msHover.m_fy = pMsg->m_fy;
+  msHover.m_dwFlags = 0;
+  msHover.m_dwCmd = FWL_MSGMOUSECMD_MouseHover;
+  DispatchMessage(&msHover, NULL);
+}
+FX_BOOL CFWL_NoteDriver::IsValidMessage(CFWL_Message* pMessage) {
+  if (pMessage->GetClassID() == FWL_MSGHASH_Post) {
+    return TRUE;
+  }
+  int32_t iCount = m_noteLoopQueue.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CFWL_NoteLoop* pNoteLoop = static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[i]);
+    CFWL_WidgetImp* pForm = pNoteLoop->GetForm();
+    if (pForm && (pForm->GetInterface() == pMessage->m_pDstTarget)) {
+      return TRUE;
+    }
+  }
+  iCount = m_forms.GetSize();
+  for (int32_t j = 0; j < iCount; j++) {
+    CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[j]);
+    if (pForm->GetInterface() == pMessage->m_pDstTarget) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) {
+  int32_t iTrackLoop = m_noteLoopQueue.GetSize();
+  if (iTrackLoop <= 0)
+    return NULL;
+  IFWL_Widget* pMessageForm = NULL;
+  if (iTrackLoop > 1) {
+    CFWL_NoteLoop* pNootLoop =
+        static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[iTrackLoop - 1]);
+    pMessageForm = pNootLoop->GetForm()->GetInterface();
+  } else {
+    pMessageForm = (m_forms.Find(pDstTarget) < 0) ? NULL : pDstTarget;
+  }
+  if (!pMessageForm && pDstTarget) {
+    CFWL_WidgetMgr* pWidgetMgr =
+        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+    if (!pWidgetMgr)
+      return NULL;
+    pMessageForm =
+        pWidgetMgr->GetWidget(pDstTarget, FWL_WGTRELATION_SystemForm);
+  }
+  return pMessageForm;
+}
+void CFWL_NoteDriver::ClearInvalidEventTargets(FX_BOOL bRemoveAll) {
+  FX_POSITION pos = m_eventTargets.GetStartPosition();
+  while (pos) {
+    void* key = NULL;
+    CFWL_EventTarget* pEventTarget = NULL;
+    m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
+    if (pEventTarget && (bRemoveAll || pEventTarget->IsInvalid())) {
+      m_eventTargets.RemoveKey(key);
+      delete pEventTarget;
+    }
+  }
+}
+class CFWL_CoreToopTipDP : public IFWL_ToolTipDP {
+ public:
+  FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+  int32_t GetInitialDelay(IFWL_Widget* pWidget);
+  int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
+  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
+  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
+  CFX_RectF GetAnchor();
+  CFWL_CoreToopTipDP();
+
+  CFX_WideString m_wsCaption;
+  int32_t m_nInitDelayTime;
+  int32_t m_nAutoPopDelayTime;
+  CFX_RectF m_fAnchor;
+};
+CFWL_CoreToopTipDP::CFWL_CoreToopTipDP() {
+  m_nInitDelayTime = 500;
+  m_nAutoPopDelayTime = 50000;
+  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
+}
+FWL_ERR CFWL_CoreToopTipDP::GetCaption(IFWL_Widget* pWidget,
+                                       CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_CoreToopTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
+  return m_nInitDelayTime;
+}
+int32_t CFWL_CoreToopTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
+  return m_nAutoPopDelayTime;
+}
+CFX_DIBitmap* CFWL_CoreToopTipDP::GetToolTipIcon(IFWL_Widget* pWidget) {
+  return NULL;
+}
+CFX_SizeF CFWL_CoreToopTipDP::GetToolTipIconSize(IFWL_Widget* pWidget) {
+  return CFX_SizeF();
+}
+CFX_RectF CFWL_CoreToopTipDP::GetAnchor() {
+  return m_fAnchor;
+}
+CFWL_EventTarget::~CFWL_EventTarget() {
+  m_eventSources.RemoveAll();
+}
+int32_t CFWL_EventTarget::SetEventSource(IFWL_Widget* pSource,
+                                         FX_DWORD dwFilter) {
+  if (pSource) {
+    m_eventSources.SetAt(pSource, dwFilter);
+    return m_eventSources.GetCount();
+  }
+  return 1;
+}
+FX_BOOL CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) {
+  IFWL_WidgetDelegate* pDelegate = m_pListener->SetDelegate(NULL);
+  if (!pDelegate)
+    return FALSE;
+  if (m_eventSources.GetCount() == 0) {
+    pDelegate->OnProcessEvent(pEvent);
+    return TRUE;
+  }
+  FX_POSITION pos = m_eventSources.GetStartPosition();
+  while (pos) {
+    IFWL_Widget* pSource = NULL;
+    FX_DWORD dwFilter = 0;
+    m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter);
+    if (pSource == pEvent->m_pSrcTarget ||
+        pEvent->GetClassID() == FWL_EVTHASH_Idle) {
+      if (IsFilterEvent(pEvent, dwFilter)) {
+        pDelegate->OnProcessEvent(pEvent);
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_EventTarget::IsFilterEvent(CFWL_Event* pEvent, FX_DWORD dwFilter) {
+  if (dwFilter == FWL_EVENT_ALL_MASK) {
+    return TRUE;
+  }
+  FX_BOOL bRet = FALSE;
+  switch (pEvent->GetClassID()) {
+    case FWL_EVTHASH_Mouse: {
+      bRet = dwFilter & FWL_EVENT_MOUSE_MASK;
+      break;
+    }
+    case FWL_EVTHASH_MouseWheel: {
+      bRet = dwFilter & FWL_EVENT_MOUSEWHEEL_MASK;
+      break;
+    }
+    case FWL_EVTHASH_Key: {
+      bRet = dwFilter & FWL_EVENT_KEY_MASK;
+      break;
+    }
+    case FWL_EVTHASH_SetFocus:
+    case FWL_EVTHASH_KillFocus: {
+      bRet = dwFilter & FWL_EVENT_FOCUSCHANGED_MASK;
+      break;
+    }
+    case FWL_EVTHASH_Draw: {
+      bRet = dwFilter & FWL_EVENT_DRAW_MASK;
+      break;
+    }
+    case FWL_EVTHASH_Close: {
+      bRet = dwFilter & FWL_EVENT_CLOSE_MASK;
+      break;
+    }
+    case FWL_EVTHASH_SizeChanged: {
+      bRet = dwFilter & FWL_EVENT_SIZECHANGED_MASK;
+      break;
+    }
+    case FWL_EVTHASH_Idle: {
+      bRet = dwFilter & FWL_EVENT_IDLE_MASK;
+      break;
+    }
+    default: {
+      bRet = dwFilter & FWL_EVENT_CONTROL_MASK;
+      break;
+    }
+  }
+  return bRet;
+}
+
+CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = NULL;
+
+CFWL_ToolTipContainer::CFWL_ToolTipContainer()
+    : pCurTarget(NULL), m_pToolTipImp(NULL) {
+  m_ToolTipDp = new CFWL_CoreToopTipDP;
+  m_ToolTipDp->m_nInitDelayTime = 0;
+  m_ToolTipDp->m_nAutoPopDelayTime = 2000;
+}
+CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {
+  if (m_pToolTipImp) {
+    IFWL_ToolTip* pToolTip =
+        static_cast<IFWL_ToolTip*>(m_pToolTipImp->GetInterface());
+    pToolTip->Finalize();
+    delete pToolTip;
+  }
+  delete m_ToolTipDp;
+}
+// static
+CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() {
+  if (!s_pInstance) {
+    s_pInstance = new CFWL_ToolTipContainer;
+  }
+  return s_pInstance;
+}
+// static
+void CFWL_ToolTipContainer::DeleteInstance() {
+  if (s_pInstance) {
+    delete s_pInstance;
+    s_pInstance = NULL;
+  }
+}
+FX_ERR CFWL_ToolTipContainer::AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
+  if (m_arrWidget.Find((void*)pTarget) < 0) {
+    m_arrWidget.Add((void*)pTarget);
+    return FWL_ERR_Succeeded;
+  }
+  return FWL_ERR_Indefinite;
+}
+FX_ERR CFWL_ToolTipContainer::RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
+  int index = m_arrWidget.Find((void*)pTarget);
+  if (index >= 0) {
+    m_arrWidget.RemoveAt(index);
+    return FWL_ERR_Succeeded;
+  }
+  return FWL_ERR_Indefinite;
+}
+FX_BOOL CFWL_ToolTipContainer::HasToolTip(IFWL_Widget* pWedget) {
+  int32_t iCount = m_arrWidget.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    IFWL_ToolTipTarget* p = static_cast<IFWL_ToolTipTarget*>(m_arrWidget[i]);
+    if (p->GetWidget() == pWedget) {
+      pCurTarget = p;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_ToolTipContainer::ProcessEnter(CFWL_EvtMouse* pEvt,
+                                            IFWL_Widget* pOwner) {
+  if (HasToolTip(pEvt->m_pDstTarget)) {
+    if (NULL == m_pToolTipImp) {
+      CFWL_WidgetImpProperties prop;
+      prop.m_pDataProvider = m_ToolTipDp;
+      prop.m_pOwner = pOwner;
+      CFX_RectF rtTooltip;
+      rtTooltip.Set(150, 150, 100, 50);
+      prop.m_rtWidget = rtTooltip;
+      IFWL_ToolTip* pToolTip = IFWL_ToolTip::Create(prop, nullptr);
+      pToolTip->Initialize();
+      m_pToolTipImp = static_cast<CFWL_ToolTipImp*>(pToolTip->GetImpl());
+      m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_Multiline, 0);
+      m_pToolTipImp->SetStates(FWL_WGTSTATE_Invisible, TRUE);
+    }
+    if (pCurTarget->IsShowed()) {
+      CFX_WideString wsCaption;
+      pCurTarget->GetCaption(wsCaption);
+      if (!wsCaption.IsEmpty()) {
+        m_ToolTipDp->m_wsCaption = wsCaption;
+      }
+      CFX_RectF rt;
+      CFX_SizeF sz;
+      pCurTarget->GetToolTipSize(sz);
+      if (sz.x > 0 && sz.y > 0) {
+        rt.width = sz.x;
+        rt.height = sz.y;
+      } else {
+        CFX_RectF r;
+        m_pToolTipImp->GetWidgetRect(r, TRUE);
+        rt.width = r.width;
+        rt.height = r.height;
+      }
+      CFX_PointF pt(pEvt->m_fx, pEvt->m_fy);
+      if (pCurTarget->GetToolTipPos(pt) == FWL_ERR_Succeeded) {
+        rt.left = pt.x;
+        rt.top = pt.y;
+        m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_NoAnchor, 0);
+      } else {
+        CFX_RectF rtAnchor;
+        pCurTarget->GetWidget()->GetClientRect(rtAnchor);
+        pCurTarget->GetWidget()->TransformTo(NULL, rtAnchor.left, rtAnchor.top);
+        m_pToolTipImp->SetAnchor(rtAnchor);
+        m_pToolTipImp->ModifyStylesEx(0, FWL_STYLEEXT_TTP_NoAnchor);
+      }
+      m_pToolTipImp->SetWidgetRect(rt);
+      m_pToolTipImp->Update();
+      m_pToolTipImp->Show();
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_ToolTipContainer::ProcessLeave(CFWL_EvtMouse* pEvt) {
+  if (HasToolTip(pEvt->m_pDstTarget) && NULL != m_pToolTipImp) {
+    m_pToolTipImp->Hide();
+    pCurTarget = NULL;
+    return TRUE;
+  }
+  return FALSE;
+}
+IFWL_ToolTipTarget* CFWL_ToolTipContainer::GetCurrentToolTipTarget() {
+  return pCurTarget;
+}
+FX_ERR CFWL_ToolTipContainer::SetToolTipInitialDelay(int32_t nDelayTime) {
+  m_ToolTipDp->m_nInitDelayTime = nDelayTime;
+  return FWL_ERR_Succeeded;
+}
+FX_ERR CFWL_ToolTipContainer::SetToolTipAutoPopDelay(int32_t nDelayTime) {
+  m_ToolTipDp->m_nAutoPopDelayTime = nDelayTime;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR FWL_AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
+  return CFWL_ToolTipContainer::getInstance()->AddToolTipTarget(pTarget);
+}
+FWL_ERR FWL_RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
+  return CFWL_ToolTipContainer::getInstance()->RemoveToolTipTarget(pTarget);
+}
+FWL_ERR FWL_SetToolTipInitialDelay(int32_t nDelayTime) {
+  return CFWL_ToolTipContainer::getInstance()->SetToolTipInitialDelay(
+      nDelayTime);
+}
+FWL_ERR FWL_SetToolTipAutoPopDelay(int32_t nDelayTime) {
+  return CFWL_ToolTipContainer::getInstance()->SetToolTipAutoPopDelay(
+      nDelayTime);
+}
+IFWL_Widget* FWL_GetCurrentThreadModalWidget(IFWL_NoteThread* pNoteThread) {
+  if (!pNoteThread)
+    return NULL;
+  CFWL_NoteDriver* noteDriver =
+      static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
+  if (!noteDriver)
+    return NULL;
+  if (noteDriver->CountLoop() == 1) {
+    return NULL;
+  }
+  CFWL_NoteLoop* topLoop = noteDriver->GetTopLoop();
+  if (!topLoop)
+    return NULL;
+  CFWL_WidgetImp* widget = topLoop->GetForm();
+  if (!widget)
+    return NULL;
+  return widget->GetInterface();
+}
+FWL_ERR FWL_SetHook(IFWL_NoteDriver* driver,
+                    FWLMessageHookCallback callback,
+                    void* info) {
+  CFWL_NoteDriver* noteDriver = static_cast<CFWL_NoteDriver*>(driver);
+  noteDriver->SetHook(callback, info);
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
new file mode 100644
index 0000000..e0f17bb
--- /dev/null
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -0,0 +1,157 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_NOTEIMP_H_
+#define XFA_FWL_CORE_FWL_NOTEIMP_H_
+
+#include "xfa/include/fwl/core/fwl_note.h"
+
+class CFWL_WidgetImp;
+class CFWL_ToolTipImp;
+class CFWL_CoreToopTipDP;
+class CFWL_NoteDriver;
+class CFWL_EventTarget;
+class CFWL_ToolTipContainer;
+
+class CFWL_NoteLoop : public IFWL_NoteLoop {
+ public:
+  CFWL_NoteLoop(CFWL_WidgetImp* pForm = NULL);
+
+  // IFWL_NoteLoop:
+  ~CFWL_NoteLoop() override {}
+  FX_BOOL PreProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR Idle(int32_t count) override;
+
+  CFWL_WidgetImp* GetForm();
+  FX_BOOL ContinueModal();
+  FWL_ERR EndModalLoop();
+  FX_BOOL TranslateAccelerator(CFWL_Message* pMessage);
+  FWL_ERR SetMainForm(CFWL_WidgetImp* pForm);
+
+ protected:
+  void GenerateCommondEvent(FX_DWORD dwCommand);
+
+  CFWL_WidgetImp* m_pForm;
+  FX_BOOL m_bContinueModal;
+};
+class CFWL_NoteDriver : public IFWL_NoteDriver {
+ public:
+  CFWL_NoteDriver();
+  ~CFWL_NoteDriver() override;
+
+  // IFWL_NoteDriver:
+  FX_BOOL SendNote(CFWL_Note* pNote) override;
+  FX_BOOL PostMessage(CFWL_Message* pMessage) override;
+  FWL_ERR RegisterEventTarget(IFWL_Widget* pListener,
+                              IFWL_Widget* pEventSource = NULL,
+                              FX_DWORD dwFilter = FWL_EVENT_ALL_MASK) override;
+  FWL_ERR UnregisterEventTarget(IFWL_Widget* pListener) override;
+  void ClearEventTargets(FX_BOOL bRemoveAll) override;
+  int32_t GetQueueMaxSize() const override;
+  FWL_ERR SetQueueMaxSize(const int32_t size) override;
+  IFWL_NoteThread* GetOwnerThread() const override;
+  FWL_ERR PushNoteLoop(IFWL_NoteLoop* pNoteLoop) override;
+  IFWL_NoteLoop* PopNoteLoop() override;
+  IFWL_Widget* GetFocus() override;
+  FX_BOOL SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify = FALSE) override;
+  void SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) override;
+  FWL_ERR Run() override;
+
+  IFWL_Widget* GetHover();
+  void SetHover(IFWL_Widget* pHover);
+  void NotifyTargetHide(IFWL_Widget* pNoteTarget);
+  void NotifyTargetDestroy(IFWL_Widget* pNoteTarget);
+  void NotifyFullScreenMode(IFWL_Widget* pNoteTarget, FX_BOOL bFullScreen);
+  FWL_ERR RegisterForm(CFWL_WidgetImp* pForm);
+  FWL_ERR UnRegisterForm(CFWL_WidgetImp* pForm);
+  FX_BOOL QueueMessage(CFWL_Message* pMessage);
+  FX_BOOL UnqueueMessage(CFWL_NoteLoop* pNoteLoop);
+  CFWL_NoteLoop* GetTopLoop();
+  int32_t CountLoop();
+  void SetHook(FWLMessageHookCallback callback, void* info);
+  FX_BOOL ProcessMessage(CFWL_Message* pMessage);
+
+ protected:
+  FX_BOOL DispatchMessage(CFWL_Message* pMessage, IFWL_Widget* pMessageForm);
+  FX_BOOL DoActivate(CFWL_MsgActivate* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoDeactivate(CFWL_MsgDeactivate* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoSetFocus(CFWL_MsgSetFocus* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoKillFocus(CFWL_MsgKillFocus* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoMouse(CFWL_MsgMouse* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoWheel(CFWL_MsgMouseWheel* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoSize(CFWL_MsgSize* pMsg);
+  FX_BOOL DoWindowMove(CFWL_MsgWindowMove* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoDragFiles(CFWL_MsgDropFiles* pMsg, IFWL_Widget* pMessageForm);
+  FX_BOOL DoMouseEx(CFWL_MsgMouse* pMsg, IFWL_Widget* pMessageForm);
+  void MouseSecondary(CFWL_MsgMouse* pMsg);
+  FX_BOOL IsValidMessage(CFWL_Message* pMessage);
+  IFWL_Widget* GetMessageForm(IFWL_Widget* pDstTarget);
+  void ClearInvalidEventTargets(FX_BOOL bRemoveAll);
+  CFX_PtrArray m_forms;
+  CFX_PtrArray m_noteQueue;
+  CFX_PtrArray m_noteLoopQueue;
+  CFX_MapPtrToPtr m_eventTargets;
+  int32_t m_sendEventCalled;
+  int32_t m_maxSize;
+  FX_BOOL m_bFullScreen;
+  IFWL_Widget* m_pHover;
+  IFWL_Widget* m_pFocus;
+  IFWL_Widget* m_pGrab;
+  CFWL_NoteLoop* m_pNoteLoop;
+  FWLMessageHookCallback m_hook;
+  void* m_hookInfo;
+};
+typedef CFX_MapPtrTemplate<void*, FX_DWORD> CFWL_EventSource;
+class CFWL_EventTarget {
+ public:
+  CFWL_EventTarget(CFWL_NoteDriver* pNoteDriver, IFWL_Widget* pListener)
+      : m_pListener(pListener), m_pNoteDriver(pNoteDriver), m_bInvalid(FALSE) {}
+  ~CFWL_EventTarget();
+  int32_t SetEventSource(IFWL_Widget* pSource,
+                         FX_DWORD dwFilter = FWL_EVENT_ALL_MASK);
+  FX_BOOL ProcessEvent(CFWL_Event* pEvent);
+  FX_BOOL IsFilterEvent(CFWL_Event* pEvent, FX_DWORD dwFilter);
+  FX_BOOL IsInvalid() { return m_bInvalid; }
+  void FlagInvalid() { m_bInvalid = TRUE; }
+
+ protected:
+  CFWL_EventSource m_eventSources;
+  IFWL_Widget* m_pListener;
+  CFWL_NoteDriver* m_pNoteDriver;
+  FX_BOOL m_bInvalid;
+};
+class CFWL_ToolTipContainer {
+ public:
+  static CFWL_ToolTipContainer* getInstance();
+  static void DeleteInstance();
+
+  FX_ERR AddToolTipTarget(IFWL_ToolTipTarget* pTarget);
+  FX_ERR RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget);
+  IFWL_ToolTipTarget* GetCurrentToolTipTarget();
+
+  FX_BOOL HasToolTip(IFWL_Widget* pWidget);
+
+  FX_BOOL ProcessEnter(CFWL_EvtMouse* pEvt, IFWL_Widget* pOwner);
+  FX_BOOL ProcessLeave(CFWL_EvtMouse* pEvt);
+
+  FX_ERR SetToolTipInitialDelay(int32_t iDelayTime);
+  FX_ERR SetToolTipAutoPopDelay(int32_t iDelayTime);
+
+ protected:
+  CFWL_ToolTipContainer();
+  virtual ~CFWL_ToolTipContainer();
+
+  IFWL_ToolTipTarget* pCurTarget;
+  CFWL_ToolTipImp* m_pToolTipImp;
+  CFWL_CoreToopTipDP* m_ToolTipDp;
+  CFX_PtrArray m_arrWidget;
+
+ private:
+  static CFWL_ToolTipContainer* s_pInstance;
+};
+
+#endif  // XFA_FWL_CORE_FWL_NOTEIMP_H_
diff --git a/xfa/fwl/core/fwl_panelimp.cpp b/xfa/fwl/core/fwl_panelimp.cpp
new file mode 100644
index 0000000..e244133
--- /dev/null
+++ b/xfa/fwl/core/fwl_panelimp.cpp
@@ -0,0 +1,152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_panelimp.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/core/fwl_content.h"
+#include "xfa/include/fwl/core/fwl_grid.h"
+#include "xfa/include/fwl/core/fwl_panel.h"
+
+// static
+IFWL_Panel* IFWL_Panel::Create(CFWL_WidgetImpProperties& properties,
+                               IFWL_Widget* pOuter) {
+  IFWL_Panel* pPanel = new IFWL_Panel;
+  CFWL_PanelImp* pPanelImpl = new CFWL_PanelImp(properties, pOuter);
+  pPanel->SetImpl(pPanelImpl);
+  pPanelImpl->SetInterface(pPanel);
+  return pPanel;
+}
+IFWL_Panel::IFWL_Panel() {}
+IFWL_Content* IFWL_Panel::GetContent() {
+  return static_cast<CFWL_PanelImp*>(GetImpl())->GetContent();
+}
+FWL_ERR IFWL_Panel::SetContent(IFWL_Content* pContent) {
+  return static_cast<CFWL_PanelImp*>(GetImpl())->SetContent(pContent);
+}
+
+CFWL_PanelImp::CFWL_PanelImp(const CFWL_WidgetImpProperties& properties,
+                             IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter), m_pContent(nullptr) {}
+CFWL_PanelImp::~CFWL_PanelImp() {}
+FWL_ERR CFWL_PanelImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass = FWL_CLASS_Panel;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_PanelImp::GetClassID() const {
+  return FWL_CLASSHASH_Panel;
+}
+FWL_ERR CFWL_PanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    if (m_pContent) {
+      m_pContent->GetWidgetRect(rect, TRUE);
+    }
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_PanelImp::Update() {
+  if (m_pContent) {
+    CFX_RectF rtClient;
+    GetClientRect(rtClient);
+    FWL_GRIDUNIT eWidth = FWL_GRIDUNIT_Fixed, eHeight = FWL_GRIDUNIT_Fixed;
+    IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
+    if (!pWidgetMgr)
+      return FWL_ERR_Indefinite;
+    IFWL_Widget* pParent =
+        pWidgetMgr->GetWidget(GetInterface(), FWL_WGTRELATION_Parent);
+    if (pParent && pParent->GetClassID() == FWL_CLASSHASH_Grid) {
+      IFWL_Grid* pGrid = static_cast<IFWL_Grid*>(pParent);
+      pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Width, eWidth);
+      pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Height, eHeight);
+    }
+    m_pContent->SetWidgetRect(rtClient);
+    m_pContent->Update();
+  }
+  return FWL_ERR_Succeeded;
+}
+IFWL_Content* CFWL_PanelImp::GetContent() {
+  return m_pContent;
+}
+FWL_ERR CFWL_PanelImp::SetContent(IFWL_Content* pContent) {
+  if (!pContent)
+    return FWL_ERR_Indefinite;
+  m_pContent = pContent;
+  return pContent->SetParent(m_pInterface);
+}
+class CFWL_CustomPanelImp : public CFWL_WidgetImp {
+ public:
+  CFWL_CustomPanelImp(const CFWL_WidgetImpProperties& properties,
+                      IFWL_Widget* pOuter);
+  virtual ~CFWL_CustomPanelImp();
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual IFWL_Content* GetContent();
+  virtual FWL_ERR SetContent(IFWL_Content* pContent);
+  FWL_ERR SetProxy(IFWL_Proxy* pProxy);
+
+ protected:
+  IFWL_Content* m_pContent;
+  IFWL_Proxy* m_pProxy;
+};
+CFWL_CustomPanelImp::CFWL_CustomPanelImp(
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter),
+      m_pContent(nullptr),
+      m_pProxy(nullptr) {}
+CFWL_CustomPanelImp::~CFWL_CustomPanelImp() {}
+FWL_ERR CFWL_CustomPanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize && m_pProxy &&
+      (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) {
+    return FWL_ERR_Succeeded;
+  }
+  return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize);
+}
+FWL_ERR CFWL_CustomPanelImp::Update() {
+  if (m_pProxy) {
+    return m_pProxy->Update();
+  }
+  return CFWL_WidgetImp::Update();
+}
+IFWL_Content* CFWL_CustomPanelImp::GetContent() {
+  return m_pContent;
+}
+FWL_ERR CFWL_CustomPanelImp::SetContent(IFWL_Content* pContent) {
+  if (!pContent)
+    return FWL_ERR_Indefinite;
+  m_pContent = pContent;
+  return pContent->SetParent(m_pInterface);
+}
+FWL_ERR CFWL_CustomPanelImp::SetProxy(IFWL_Proxy* pProxy) {
+  m_pProxy = pProxy;
+  return FWL_ERR_Succeeded;
+}
+
+// statuc
+IFWL_CustomPanel* IFWL_CustomPanel::Create(CFWL_WidgetImpProperties& properties,
+                                           IFWL_Widget* pOuter) {
+  IFWL_CustomPanel* pCustomPanel = new IFWL_CustomPanel;
+  CFWL_CustomPanelImp* pCustomPanelImpl =
+      new CFWL_CustomPanelImp(properties, pOuter);
+  pCustomPanel->SetImpl(pCustomPanelImpl);
+  pCustomPanelImpl->SetInterface(pCustomPanel);
+  return pCustomPanel;
+}
+IFWL_CustomPanel::IFWL_CustomPanel() {}
+IFWL_Content* IFWL_CustomPanel::GetContent() {
+  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->GetContent();
+}
+FWL_ERR IFWL_CustomPanel::SetContent(IFWL_Content* pContent) {
+  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetContent(pContent);
+}
+FWL_ERR IFWL_CustomPanel::SetProxy(IFWL_Proxy* pProxy) {
+  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetProxy(pProxy);
+}
diff --git a/xfa/fwl/core/fwl_panelimp.h b/xfa/fwl/core/fwl_panelimp.h
new file mode 100644
index 0000000..9462a38
--- /dev/null
+++ b/xfa/fwl/core/fwl_panelimp.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_PANELIMP_H_
+#define XFA_FWL_CORE_FWL_PANELIMP_H_
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+class CFWL_WidgetImpProperties;
+class IFWL_Widget;
+class IFWL_Content;
+
+class CFWL_PanelImp : public CFWL_WidgetImp {
+ public:
+  CFWL_PanelImp(const CFWL_WidgetImpProperties& properties,
+                IFWL_Widget* pOuter);
+  virtual ~CFWL_PanelImp();
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual IFWL_Content* GetContent();
+  virtual FWL_ERR SetContent(IFWL_Content* pContent);
+
+ protected:
+  IFWL_Content* m_pContent;
+};
+
+#endif  // XFA_FWL_CORE_FWL_PANELIMP_H_
diff --git a/xfa/fwl/core/fwl_sdadapterimp.cpp b/xfa/fwl/core/fwl_sdadapterimp.cpp
new file mode 100644
index 0000000..88df9bc
--- /dev/null
+++ b/xfa/fwl/core/fwl_sdadapterimp.cpp
@@ -0,0 +1,175 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
+
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+
+CFWL_SDAdapterWidgetMgr::CFWL_SDAdapterWidgetMgr() {}
+CFWL_SDAdapterWidgetMgr::~CFWL_SDAdapterWidgetMgr() {}
+
+FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidget(IFWL_Widget* pWidget,
+                                              IFWL_Widget* pParent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::DestroyWidget(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetRect(IFWL_Widget* pWidget,
+                                               const CFX_RectF& rect) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetPosition(IFWL_Widget* pWidget,
+                                                   FX_FLOAT fx,
+                                                   FX_FLOAT fy) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetParentWidget(IFWL_Widget* pWidget,
+                                                 IFWL_Widget* pParent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::ShowWidget(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::HideWidget(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetNormal(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetMaximize(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetMinimize(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::RunWidget(IFWL_Widget* pWidget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
+                                               const CFX_RectF* pRect) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::Exit(int32_t iExitCode) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidgetWithNativeId(IFWL_Widget* pWidget,
+                                                          void* vp) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetRect(IFWL_Widget* pWidget,
+                                               CFX_RectF& rect) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetIcon(IFWL_Widget* pWidget,
+                                               const CFX_DIBitmap* pIcon,
+                                               FX_BOOL bBig) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetCaption(
+    IFWL_Widget* pWidget,
+    const CFX_WideStringC& wsCaption) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetBorderRegion(IFWL_Widget* pWidget,
+                                                 CFX_Path* pPath) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetTransparent(IFWL_Widget* pWidget,
+                                                FX_DWORD dwAlpha) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetFullScreen(IFWL_Widget* pWidget,
+                                               FX_BOOL bFullScreen) {
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_SDAdapterWidgetMgr::CheckMessage() {
+  return TRUE;
+}
+FX_BOOL CFWL_SDAdapterWidgetMgr::IsIdleMessage() {
+  return TRUE;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::DispatchMessage() {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetDC(IFWL_Widget* pWidget, void*& pDC) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::ReleaseWidgetDC(IFWL_Widget* pWidget,
+                                                 void* pDC,
+                                                 CFX_RectF* pClip) {
+  return FWL_ERR_Succeeded;
+}
+void* CFWL_SDAdapterWidgetMgr::GetWindow(IFWL_Widget* pWidget) {
+  return NULL;
+}
+FX_DWORD CFWL_SDAdapterWidgetMgr::GetKeyState(FX_DWORD dwVirtKey) {
+  return 0;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::RunLoop(IFWL_Widget* widget) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::EndLoop() {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::InitMenu(IFWL_Menu* pMenu,
+                                          IFWL_MenuDP* pMenuData) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::UpdateMenu(IFWL_Menu* pMenu,
+                                            const void* hItem,
+                                            int32_t iType) {
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_SDAdapterWidgetMgr::TrackPopupMenu(IFWL_Menu* pMenu,
+                                                IFWL_MenuDP* pMenuData) {
+  return 0;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::SetMessageHook(IFWL_AdapterMessageHook* hook) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterWidgetMgr::GetSystemBorder(FX_FLOAT& l,
+                                                 FX_FLOAT& t,
+                                                 FX_FLOAT& r,
+                                                 FX_FLOAT& b) {
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_SDAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget,
+                                             FX_FLOAT fMinHeight,
+                                             FX_FLOAT fMaxHeight,
+                                             const CFX_RectF& rtAnchor,
+                                             CFX_RectF& rtPopup) {
+  return FWL_ERR_Succeeded;
+}
+CFWL_SDAdapterThreadMgr::CFWL_SDAdapterThreadMgr() {}
+CFWL_SDAdapterThreadMgr::~CFWL_SDAdapterThreadMgr() {}
+FWL_ERR CFWL_SDAdapterThreadMgr::Start(IFWL_Thread* pThread,
+                                       FWL_HTHREAD& hThread,
+                                       FX_BOOL bSuspended) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterThreadMgr::Resume(FWL_HTHREAD hThread) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterThreadMgr::Suspend(FWL_HTHREAD hThread) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterThreadMgr::Kill(FWL_HTHREAD hThread, int32_t iExitCode) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_SDAdapterThreadMgr::Stop(FWL_HTHREAD hThread, int32_t iExitCode) {
+  return FWL_ERR_Succeeded;
+}
+IFWL_Thread* CFWL_SDAdapterThreadMgr::GetCurrentThread() {
+  return FWL_GetApp();
+}
diff --git a/xfa/fwl/core/fwl_targetimp.cpp b/xfa/fwl/core/fwl_targetimp.cpp
new file mode 100644
index 0000000..d1f92d0
--- /dev/null
+++ b/xfa/fwl/core/fwl_targetimp.cpp
@@ -0,0 +1,44 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_targetimp.h"
+
+FWL_ERR IFWL_Target::GetClassName(CFX_WideString& wsClass) const {
+  return m_pImpl->GetClassName(wsClass);
+}
+FX_DWORD IFWL_Target::GetClassID() const {
+  return m_pImpl->GetClassID();
+}
+FX_BOOL IFWL_Target::IsInstance(const CFX_WideStringC& wsClass) const {
+  return m_pImpl->IsInstance(wsClass);
+}
+FWL_ERR IFWL_Target::Initialize() {
+  return m_pImpl->Initialize();
+}
+FWL_ERR IFWL_Target::Finalize() {
+  return m_pImpl->Finalize();
+}
+IFWL_Target::~IFWL_Target() {
+  delete m_pImpl;
+}
+CFWL_TargetImp::CFWL_TargetImp() {}
+CFWL_TargetImp::~CFWL_TargetImp() {}
+FWL_ERR CFWL_TargetImp::GetClassName(CFX_WideString& wsClass) const {
+  wsClass.Empty();
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_TargetImp::GetClassID() const {
+  return 0;
+}
+FX_BOOL CFWL_TargetImp::IsInstance(const CFX_WideStringC& wsClass) const {
+  return FALSE;
+}
+FWL_ERR CFWL_TargetImp::Initialize() {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_TargetImp::Finalize() {
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/core/fwl_targetimp.h b/xfa/fwl/core/fwl_targetimp.h
new file mode 100644
index 0000000..8aeca79
--- /dev/null
+++ b/xfa/fwl/core/fwl_targetimp.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_TARGETIMP_H_
+#define XFA_FWL_CORE_FWL_TARGETIMP_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/include/fwl/core/fwl_target.h"
+
+class CFWL_TargetImp {
+ public:
+  virtual ~CFWL_TargetImp();
+
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  virtual FX_DWORD GetClassID() const;
+  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+ protected:
+  CFWL_TargetImp();
+};
+
+#endif  // XFA_FWL_CORE_FWL_TARGETIMP_H_
diff --git a/xfa/fwl/core/fwl_threadimp.cpp b/xfa/fwl/core/fwl_threadimp.cpp
new file mode 100644
index 0000000..e0ec0b0
--- /dev/null
+++ b/xfa/fwl/core/fwl_threadimp.cpp
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_threadimp.h"
+
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+
+void IFWL_Thread::Release() {
+  delete m_pImpl;
+}
+FWL_ERR IFWL_Thread::Run(FWL_HTHREAD hThread) {
+  return m_pImpl->Run(hThread);
+}
+IFWL_NoteDriver* IFWL_NoteThread::GetNoteDriver() {
+  return static_cast<CFWL_NoteThreadImp*>(GetImpl())->GetNoteDriver();
+}
+
+FWL_ERR CFWL_ThreadImp::Run(FWL_HTHREAD hThread) {
+  return FWL_ERR_Succeeded;
+}
+CFWL_NoteThreadImp::CFWL_NoteThreadImp(IFWL_NoteThread* pIface)
+    : CFWL_ThreadImp(pIface), m_pNoteDriver(new CFWL_NoteDriver) {}
+CFWL_NoteThreadImp::~CFWL_NoteThreadImp() {
+  delete m_pNoteDriver;
+}
+FWL_ERR CFWL_NoteThreadImp::Run(FWL_HTHREAD hThread) {
+  if (!m_pNoteDriver)
+    return FWL_ERR_Indefinite;
+  return m_pNoteDriver->Run();
+}
+IFWL_NoteDriver* CFWL_NoteThreadImp::GetNoteDriver() {
+  return m_pNoteDriver;
+}
diff --git a/xfa/fwl/core/fwl_threadimp.h b/xfa/fwl/core/fwl_threadimp.h
new file mode 100644
index 0000000..591849b
--- /dev/null
+++ b/xfa/fwl/core/fwl_threadimp.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_THREADIMP_H_
+#define XFA_FWL_CORE_FWL_THREADIMP_H_
+
+#include "xfa/include/fwl/core/fwl_thread.h"  // For FWL_HTHREAD.
+
+class CFWL_NoteDriver;
+class IFWL_NoteDriver;
+
+class CFWL_ThreadImp {
+ public:
+  virtual ~CFWL_ThreadImp() {}
+  IFWL_Thread* GetInterface() const { return m_pIface; }
+  virtual FWL_ERR Run(FWL_HTHREAD hThread);
+
+ protected:
+  CFWL_ThreadImp(IFWL_Thread* pIface) : m_pIface(pIface) {}
+
+ private:
+  IFWL_Thread* const m_pIface;
+};
+
+class CFWL_NoteThreadImp : public CFWL_ThreadImp {
+ public:
+  CFWL_NoteThreadImp(IFWL_NoteThread* pIface);
+  virtual ~CFWL_NoteThreadImp();
+
+  FWL_ERR Run(FWL_HTHREAD hThread) override;
+  virtual IFWL_NoteDriver* GetNoteDriver();
+
+ protected:
+  CFWL_NoteDriver* const m_pNoteDriver;
+};
+
+#endif  // XFA_FWL_CORE_FWL_THREADIMP_H_
diff --git a/xfa/fwl/core/fwl_timerimp.cpp b/xfa/fwl/core/fwl_timerimp.cpp
new file mode 100644
index 0000000..d9741f6
--- /dev/null
+++ b/xfa/fwl/core/fwl_timerimp.cpp
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapternative.h"
+#include "xfa/include/fwl/adapter/fwl_adaptertimermgr.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_timer.h"
+
+FWL_HTIMER FWL_StartTimer(IFWL_Timer* pTimer,
+                          FX_DWORD dwElapse,
+                          FX_BOOL bImmediately) {
+  IFWL_AdapterNative* pAdapterNative = FWL_GetAdapterNative();
+  if (!pAdapterNative)
+    return NULL;
+  IFWL_AdapterTimerMgr* pAdapterTimerMgr = pAdapterNative->GetTimerMgr();
+  if (!pAdapterTimerMgr)
+    return NULL;
+  FWL_HTIMER hTimer = NULL;
+  pAdapterTimerMgr->Start(pTimer, dwElapse, hTimer, bImmediately);
+  return hTimer;
+}
+int32_t FWL_StopTimer(FWL_HTIMER hTimer) {
+  IFWL_AdapterNative* pAdapterNative = FWL_GetAdapterNative();
+  if (!pAdapterNative)
+    return FWL_ERR_Indefinite;
+  IFWL_AdapterTimerMgr* pAdapterTimerMgr = pAdapterNative->GetTimerMgr();
+  if (!pAdapterTimerMgr)
+    return FWL_ERR_Indefinite;
+  return pAdapterTimerMgr->Stop(hTimer);
+}
diff --git a/xfa/fwl/core/fwl_widgetimp.cpp b/xfa/fwl/core/fwl_widgetimp.cpp
new file mode 100644
index 0000000..1842968
--- /dev/null
+++ b/xfa/fwl/core/fwl_widgetimp.cpp
@@ -0,0 +1,1101 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapternative.h"
+#include "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/basewidget/fwl_combobox.h"
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/basewidget/fwl_menu.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_content.h"
+#include "xfa/include/fwl/core/fwl_form.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+
+FWL_ERR IFWL_Widget::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->GetWidgetRect(rect, bAutoSize);
+}
+FWL_ERR IFWL_Widget::GetGlobalRect(CFX_RectF& rect) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetGlobalRect(rect);
+}
+FWL_ERR IFWL_Widget::SetWidgetRect(const CFX_RectF& rect) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetWidgetRect(rect);
+}
+FWL_ERR IFWL_Widget::GetClientRect(CFX_RectF& rect) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetClientRect(rect);
+}
+IFWL_Widget* IFWL_Widget::GetParent() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetParent();
+}
+FWL_ERR IFWL_Widget::SetParent(IFWL_Widget* pParent) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetParent(pParent);
+}
+IFWL_Widget* IFWL_Widget::GetOwner() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOwner();
+}
+FWL_ERR IFWL_Widget::SetOwner(IFWL_Widget* pOwner) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetOwner(pOwner);
+}
+IFWL_Widget* IFWL_Widget::GetOuter() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOuter();
+}
+FX_DWORD IFWL_Widget::GetStyles() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStyles();
+}
+FWL_ERR IFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded,
+                                  FX_DWORD dwStylesRemoved) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->ModifyStyles(dwStylesAdded, dwStylesRemoved);
+}
+FX_DWORD IFWL_Widget::GetStylesEx() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStylesEx();
+}
+FWL_ERR IFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                    FX_DWORD dwStylesExRemoved) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+FX_DWORD IFWL_Widget::GetStates() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStates();
+}
+FWL_ERR IFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetStates(dwStates, bSet);
+}
+FWL_ERR IFWL_Widget::SetPrivateData(void* module_id,
+                                    void* pData,
+                                    PD_CALLBACK_FREEDATA callback) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->SetPrivateData(module_id, pData, callback);
+}
+void* IFWL_Widget::GetPrivateData(void* module_id) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetPrivateData(module_id);
+}
+FWL_ERR IFWL_Widget::Update() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->Update();
+}
+FWL_ERR IFWL_Widget::LockUpdate() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->LockUpdate();
+}
+FWL_ERR IFWL_Widget::UnlockUpdate() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->UnlockUpdate();
+}
+FX_DWORD IFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->HitTest(fx, fy);
+}
+FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget* pWidget,
+                                 FX_FLOAT& fx,
+                                 FX_FLOAT& fy) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->TransformTo(pWidget, fx, fy);
+}
+FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->TransformTo(pWidget, rt);
+}
+FWL_ERR IFWL_Widget::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetMatrix(matrix, bGlobal);
+}
+FWL_ERR IFWL_Widget::SetMatrix(const CFX_Matrix& matrix) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetMatrix(matrix);
+}
+FWL_ERR IFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
+                                const CFX_Matrix* pMatrix) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->DrawWidget(pGraphics, pMatrix);
+}
+IFWL_ThemeProvider* IFWL_Widget::GetThemeProvider() {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetThemeProvider();
+}
+FWL_ERR IFWL_Widget::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->SetThemeProvider(pThemeProvider);
+}
+FWL_ERR IFWL_Widget::SetDataProvider(IFWL_DataProvider* pDataProvider) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())
+      ->SetDataProvider(pDataProvider);
+}
+IFWL_WidgetDelegate* IFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetDelegate(pDelegate);
+}
+IFWL_NoteThread* IFWL_Widget::GetOwnerThread() const {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOwnerThread();
+}
+CFX_SizeF IFWL_Widget::GetOffsetFromParent(IFWL_Widget* pParent) {
+  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOffsetFromParent(pParent);
+}
+FWL_ERR CFWL_WidgetImp::Initialize() {
+  IFWL_App* pApp = FWL_GetApp();
+  if (!pApp)
+    return FWL_ERR_Indefinite;
+  IFWL_AdapterNative* pAdapter = pApp->GetAdapterNative();
+  if (!pAdapter)
+    return FWL_ERR_Indefinite;
+  IFWL_AdapterThreadMgr* pAdapterThread = pAdapter->GetThreadMgr();
+  if (!pAdapterThread)
+    return FWL_ERR_Indefinite;
+  SetOwnerThread(static_cast<CFWL_NoteThreadImp*>(
+      pAdapterThread->GetCurrentThread()->GetImpl()));
+  IFWL_Widget* pParent = m_pProperties->m_pParent;
+  m_pWidgetMgr->InsertWidget(pParent, m_pInterface);
+  if (!IsChild()) {
+    {
+      IFWL_Widget* pOwner = m_pProperties->m_pOwner;
+      if (pOwner) {
+        m_pWidgetMgr->SetOwner(pOwner, m_pInterface);
+      }
+    }
+    m_pWidgetMgr->CreateWidget_Native(m_pInterface);
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::Finalize() {
+  NotifyDriver();
+  IFWL_Form* pForm = static_cast<IFWL_Form*>(
+      FWL_GetWidgetMgr()->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm));
+  if (pForm && pForm != m_pInterface) {
+    IFWL_Content* pContent = pForm->GetContent();
+    if (pContent) {
+      pContent->RemoveWidget(m_pInterface);
+    }
+  }
+  if (!IsChild()) {
+    m_pWidgetMgr->DestroyWidget_Native(m_pInterface);
+  }
+  m_pWidgetMgr->RemoveWidget(m_pInterface);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (bAutoSize) {
+    if (HasEdge()) {
+      FX_FLOAT fEdge = GetEdgeWidth();
+      rect.Inflate(fEdge, fEdge);
+    }
+    if (HasBorder()) {
+      FX_FLOAT fBorder = GetBorderSize();
+      rect.Inflate(fBorder, fBorder);
+    }
+  } else {
+    rect = m_pProperties->m_rtWidget;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::GetGlobalRect(CFX_RectF& rect) {
+  IFWL_Widget* pForm =
+      m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
+  if (!pForm)
+    return FWL_ERR_Indefinite;
+  rect.Set(0, 0, m_pProperties->m_rtWidget.width,
+           m_pProperties->m_rtWidget.height);
+  if (pForm == m_pInterface) {
+    return FWL_ERR_Succeeded;
+  }
+  return TransformTo(pForm, rect);
+}
+FWL_ERR CFWL_WidgetImp::SetWidgetRect(const CFX_RectF& rect) {
+  CFX_RectF rtOld = m_pProperties->m_rtWidget;
+  m_pProperties->m_rtWidget = rect;
+  if (IsChild()) {
+    if (FXSYS_fabs(rtOld.width - rect.width) > 0.5f ||
+        FXSYS_fabs(rtOld.height - rect.height) > 0.5f) {
+      CFWL_EvtSizeChanged ev;
+      ev.m_pSrcTarget = m_pInterface;
+      ev.m_rtOld = rtOld;
+      ev.m_rtNew = rect;
+      IFWL_WidgetDelegate* pDelegate = SetDelegate(NULL);
+      if (pDelegate) {
+        pDelegate->OnProcessEvent(&ev);
+      }
+    }
+    return FWL_ERR_Succeeded;
+  }
+  m_pWidgetMgr->SetWidgetRect_Native(m_pInterface, rect);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::GetClientRect(CFX_RectF& rect) {
+  GetEdgeRect(rect);
+  if (HasEdge()) {
+    FX_FLOAT fEdge = GetEdgeWidth();
+    rect.Deflate(fEdge, fEdge);
+  }
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_WidgetImp::GetParent() {
+  return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Parent);
+}
+FWL_ERR CFWL_WidgetImp::SetParent(IFWL_Widget* pParent) {
+  m_pProperties->m_pParent = pParent;
+  m_pWidgetMgr->SetParent(pParent, m_pInterface);
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_WidgetImp::GetOwner() {
+  return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Owner);
+}
+FWL_ERR CFWL_WidgetImp::SetOwner(IFWL_Widget* pOwner) {
+  m_pProperties->m_pOwner = pOwner;
+  m_pWidgetMgr->SetOwner(pOwner, m_pInterface);
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_WidgetImp::GetOuter() {
+  return m_pOuter;
+}
+FX_DWORD CFWL_WidgetImp::GetStyles() {
+  return m_pProperties->m_dwStyles;
+}
+FWL_ERR CFWL_WidgetImp::ModifyStyles(FX_DWORD dwStylesAdded,
+                                     FX_DWORD dwStylesRemoved) {
+  m_pProperties->m_dwStyles =
+      (m_pProperties->m_dwStyles & ~dwStylesRemoved) | dwStylesAdded;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_WidgetImp::GetStylesEx() {
+  return m_pProperties->m_dwStyleExes;
+}
+FWL_ERR CFWL_WidgetImp::ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                       FX_DWORD dwStylesExRemoved) {
+  m_pProperties->m_dwStyleExes =
+      (m_pProperties->m_dwStyleExes & ~dwStylesExRemoved) | dwStylesExAdded;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_WidgetImp::GetStates() {
+  return m_pProperties->m_dwStates;
+}
+static void NotifyHideChildWidget(IFWL_WidgetMgr* widgetMgr,
+                                  IFWL_Widget* widget,
+                                  CFWL_NoteDriver* noteDriver) {
+  IFWL_Widget* child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild);
+  while (child) {
+    noteDriver->NotifyTargetHide(child);
+    NotifyHideChildWidget(widgetMgr, child, noteDriver);
+    child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+}
+FWL_ERR CFWL_WidgetImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  bSet ? (m_pProperties->m_dwStates |= dwStates)
+       : (m_pProperties->m_dwStates &= ~dwStates);
+  FWL_ERR ret = FWL_ERR_Succeeded;
+  if (dwStates & FWL_WGTSTATE_Invisible) {
+    if (bSet) {
+      ret = m_pWidgetMgr->HideWidget_Native(m_pInterface);
+      CFWL_NoteDriver* noteDriver =
+          static_cast<CFWL_NoteDriver*>(GetOwnerThread()->GetNoteDriver());
+      IFWL_WidgetMgr* widgetMgr = FWL_GetWidgetMgr();
+      noteDriver->NotifyTargetHide(m_pInterface);
+      IFWL_Widget* child =
+          widgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild);
+      while (child) {
+        noteDriver->NotifyTargetHide(child);
+        NotifyHideChildWidget(widgetMgr, child, noteDriver);
+        child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+      }
+    } else {
+      ret = m_pWidgetMgr->ShowWidget_Native(m_pInterface);
+    }
+  }
+  return ret;
+}
+FWL_ERR CFWL_WidgetImp::SetPrivateData(void* module_id,
+                                       void* pData,
+                                       PD_CALLBACK_FREEDATA callback) {
+  if (!m_pPrivateData) {
+    m_pPrivateData = new CFX_PrivateData;
+  }
+  m_pPrivateData->SetPrivateData(module_id, pData, callback);
+  return FWL_ERR_Succeeded;
+}
+void* CFWL_WidgetImp::GetPrivateData(void* module_id) {
+  if (!m_pPrivateData)
+    return NULL;
+  return m_pPrivateData->GetPrivateData(module_id);
+}
+FWL_ERR CFWL_WidgetImp::Update() {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::LockUpdate() {
+  m_iLock++;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::UnlockUpdate() {
+  if (IsLocked()) {
+    m_iLock--;
+  }
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_WidgetImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rtClient;
+  GetClientRect(rtClient);
+  if (rtClient.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Client;
+  }
+  if (HasEdge()) {
+    CFX_RectF rtEdge;
+    GetEdgeRect(rtEdge);
+    if (rtEdge.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Edge;
+    }
+  }
+  if (HasBorder()) {
+    CFX_RectF rtRelative;
+    GetRelativeRect(rtRelative);
+    if (rtRelative.Contains(fx, fy)) {
+      return FWL_WGTHITTEST_Border;
+    }
+  }
+  return FWL_WGTHITTEST_Unknown;
+}
+FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget* pWidget,
+                                    FX_FLOAT& fx,
+                                    FX_FLOAT& fy) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    CFX_SizeF szOffset;
+    if (IsParent(pWidget)) {
+      szOffset = GetOffsetFromParent(pWidget);
+    } else {
+      szOffset = pWidget->GetOffsetFromParent(m_pInterface);
+      szOffset.x = -szOffset.x;
+      szOffset.y = -szOffset.y;
+    }
+    fx += szOffset.x;
+    fy += szOffset.y;
+    return FWL_ERR_Succeeded;
+  }
+  CFX_RectF r;
+  CFX_Matrix m;
+  IFWL_Widget* parent = GetParent();
+  if (parent) {
+    GetWidgetRect(r);
+    fx += r.left;
+    fy += r.top;
+    GetMatrix(m, TRUE);
+    m.TransformPoint(fx, fy);
+  }
+  IFWL_Widget* form1 =
+      m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
+  if (!form1)
+    return FWL_ERR_Indefinite;
+  if (!pWidget) {
+    form1->GetWidgetRect(r);
+    fx += r.left;
+    fy += r.top;
+#ifdef FWL_UseMacSystemBorder
+    if (form1->GetStyles() & FWL_WGTSTYLE_Caption) {
+      FX_FLOAT l, t, r, b;
+      l = t = r = b = 0;
+      FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b);
+      fy += t;
+    }
+#endif
+    return FWL_ERR_Succeeded;
+  }
+  IFWL_Widget* form2 =
+      m_pWidgetMgr->GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
+  if (!form2)
+    return FWL_ERR_Indefinite;
+  if (form1 != form2) {
+    form1->GetWidgetRect(r);
+    fx += r.left;
+    fy += r.top;
+    form2->GetWidgetRect(r);
+    fx -= r.left;
+    fy -= r.top;
+#ifdef FWL_UseMacSystemBorder
+    if ((form1->GetStyles() & FWL_WGTSTYLE_Caption) !=
+        (form2->GetStyles() & FWL_WGTSTYLE_Caption)) {
+      FX_FLOAT l, t, r, b;
+      l = t = r = b = 0;
+      FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b);
+      (form1->GetStyles() & FWL_WGTSTYLE_Caption) ? (fy += t) : (fy -= t);
+    }
+#endif
+  }
+  parent = pWidget->GetParent();
+  if (parent) {
+    pWidget->GetMatrix(m, TRUE);
+    CFX_Matrix m1;
+    m1.SetIdentity();
+    m1.SetReverse(m);
+    m1.TransformPoint(fx, fy);
+    pWidget->GetWidgetRect(r);
+    fx -= r.left;
+    fy -= r.top;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt) {
+  return TransformTo(pWidget, rt.left, rt.top);
+}
+FWL_ERR CFWL_WidgetImp::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
+  if (!m_pProperties)
+    return FWL_ERR_Indefinite;
+  if (bGlobal) {
+    IFWL_Widget* parent = GetParent();
+    CFX_PtrArray parents;
+    while (parent) {
+      parents.Add(parent);
+      parent = parent->GetParent();
+    }
+    matrix.SetIdentity();
+    CFX_Matrix ctmOnParent;
+    CFX_RectF rect;
+    int32_t count = parents.GetSize();
+    for (int32_t i = count - 2; i >= 0; i--) {
+      parent = static_cast<IFWL_Widget*>(parents.GetAt(i));
+      parent->GetMatrix(ctmOnParent, FALSE);
+      parent->GetWidgetRect(rect);
+      matrix.Concat(ctmOnParent, TRUE);
+      matrix.Translate(rect.left, rect.top, TRUE);
+    }
+    matrix.Concat(m_pProperties->m_ctmOnParent, TRUE);
+    parents.RemoveAll();
+  } else {
+    matrix = m_pProperties->m_ctmOnParent;
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::SetMatrix(const CFX_Matrix& matrix) {
+  if (!m_pProperties)
+    return FWL_ERR_Indefinite;
+  IFWL_Widget* parent = GetParent();
+  if (!parent) {
+    return FWL_ERR_Indefinite;
+  }
+  m_pProperties->m_ctmOnParent = matrix;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::DrawWidget(CFX_Graphics* pGraphics,
+                                   const CFX_Matrix* pMatrix) {
+  return FWL_ERR_Indefinite;
+}
+IFWL_ThemeProvider* CFWL_WidgetImp::GetThemeProvider() {
+  return m_pProperties->m_pThemeProvider;
+}
+FWL_ERR CFWL_WidgetImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
+  m_pProperties->m_pThemeProvider = pThemeProvider;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImp::SetDataProvider(IFWL_DataProvider* pDataProvider) {
+  m_pProperties->m_pDataProvider = pDataProvider;
+  return FWL_ERR_Succeeded;
+}
+IFWL_WidgetDelegate* CFWL_WidgetImp::SetDelegate(
+    IFWL_WidgetDelegate* pDelegate) {
+  if (!m_pCurDelegate) {
+    m_pCurDelegate = m_pDelegate;
+  }
+  if (!pDelegate) {
+    return m_pCurDelegate;
+  }
+  IFWL_WidgetDelegate* pOldDelegate = m_pCurDelegate;
+  m_pCurDelegate = pDelegate;
+  return pOldDelegate;
+}
+IFWL_NoteThread* CFWL_WidgetImp::GetOwnerThread() const {
+  return static_cast<IFWL_NoteThread*>(m_pOwnerThread->GetInterface());
+}
+FWL_ERR CFWL_WidgetImp::SetOwnerThread(CFWL_NoteThreadImp* pOwnerThread) {
+  m_pOwnerThread = pOwnerThread;
+  return FWL_ERR_Succeeded;
+}
+IFWL_Widget* CFWL_WidgetImp::GetInterface() const {
+  return m_pInterface;
+}
+void CFWL_WidgetImp::SetInterface(IFWL_Widget* pInterface) {
+  m_pInterface = pInterface;
+}
+CFWL_WidgetImp::CFWL_WidgetImp(const CFWL_WidgetImpProperties& properties,
+                               IFWL_Widget* pOuter)
+    : m_pProperties(new CFWL_WidgetImpProperties),
+      m_pPrivateData(NULL),
+      m_pDelegate(NULL),
+      m_pCurDelegate(NULL),
+      m_pOuter(pOuter),
+      m_pInterface(NULL),
+      m_iLock(0) {
+  *m_pProperties = properties;
+  m_pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  FXSYS_assert(m_pWidgetMgr != NULL);
+}
+CFWL_WidgetImp::~CFWL_WidgetImp() {
+  if (m_pPrivateData) {
+    delete m_pPrivateData;
+    m_pPrivateData = NULL;
+  }
+  if (m_pProperties) {
+    delete m_pProperties;
+    m_pProperties = NULL;
+  }
+}
+FX_BOOL CFWL_WidgetImp::IsEnabled() const {
+  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == 0;
+}
+FX_BOOL CFWL_WidgetImp::IsVisible() const {
+  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) == 0;
+}
+FX_BOOL CFWL_WidgetImp::IsActive() const {
+  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) == 0;
+}
+FX_BOOL CFWL_WidgetImp::IsOverLapper() const {
+  return (m_pProperties->m_dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
+         FWL_WGTSTYLE_OverLapper;
+}
+FX_BOOL CFWL_WidgetImp::IsPopup() const {
+  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Popup);
+}
+FX_BOOL CFWL_WidgetImp::IsChild() const {
+  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Child);
+}
+FX_BOOL CFWL_WidgetImp::IsLocked() const {
+  return m_iLock > 0;
+}
+FX_BOOL CFWL_WidgetImp::IsOffscreen() const {
+  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Offscreen);
+}
+FX_BOOL CFWL_WidgetImp::HasBorder() const {
+  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border);
+}
+FX_BOOL CFWL_WidgetImp::HasEdge() const {
+  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask);
+}
+void CFWL_WidgetImp::GetEdgeRect(CFX_RectF& rtEdge) {
+  rtEdge = m_pProperties->m_rtWidget;
+  rtEdge.left = rtEdge.top = 0;
+  if (HasBorder()) {
+    FX_FLOAT fCX = GetBorderSize();
+    FX_FLOAT fCY = GetBorderSize(FALSE);
+    rtEdge.Deflate(fCX, fCY);
+  }
+}
+FX_FLOAT CFWL_WidgetImp::GetBorderSize(FX_BOOL bCX) {
+  FX_FLOAT* pfBorder = static_cast<FX_FLOAT*>(GetThemeCapacity(
+      bCX ? FWL_WGTCAPACITY_CXBorder : FWL_WGTCAPACITY_CYBorder));
+  if (!pfBorder)
+    return 0;
+  return *pfBorder;
+}
+FX_FLOAT CFWL_WidgetImp::GetEdgeWidth() {
+  FX_DWORD dwCapacity = 0;
+  switch (m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask) {
+    case FWL_WGTSTYLE_EdgeFlat: {
+      dwCapacity = FWL_WGTCAPACITY_EdgeFlat;
+      break;
+    }
+    case FWL_WGTSTYLE_EdgeRaised: {
+      dwCapacity = FWL_WGTCAPACITY_EdgeRaised;
+      break;
+    }
+    case FWL_WGTSTYLE_EdgeSunken: {
+      dwCapacity = FWL_WGTCAPACITY_EdgeSunken;
+      break;
+    }
+  }
+  if (dwCapacity > 0) {
+    FX_FLOAT* fRet = static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
+    return fRet ? *fRet : 0;
+  }
+  return 0;
+}
+void CFWL_WidgetImp::GetRelativeRect(CFX_RectF& rect) {
+  rect = m_pProperties->m_rtWidget;
+  rect.left = rect.top = 0;
+}
+void* CFWL_WidgetImp::GetThemeCapacity(FX_DWORD dwCapacity) {
+  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
+  if (!pTheme)
+    return NULL;
+  CFWL_ThemePart part;
+  part.m_pWidget = m_pInterface;
+  return pTheme->GetCapacity(&part, dwCapacity);
+}
+IFWL_ThemeProvider* CFWL_WidgetImp::GetAvailableTheme() {
+  if (m_pProperties->m_pThemeProvider) {
+    return m_pProperties->m_pThemeProvider;
+  }
+  IFWL_Widget* pUp = m_pInterface;
+  do {
+    FWL_WGTRELATION relation = (pUp->GetStyles() & FWL_WGTSTYLE_Popup)
+                                   ? FWL_WGTRELATION_Owner
+                                   : FWL_WGTRELATION_Parent;
+    pUp = m_pWidgetMgr->GetWidget(pUp, relation);
+    if (pUp) {
+      IFWL_ThemeProvider* pRet = pUp->GetThemeProvider();
+      if (pRet && pRet->IsValidWidget(m_pInterface)) {
+        return pRet;
+      }
+    }
+  } while (pUp);
+  return FWL_GetApp()->GetThemeProvider();
+}
+CFWL_WidgetImp* CFWL_WidgetImp::GetRootOuter() {
+  IFWL_Widget* pRet = m_pOuter;
+  if (!pRet)
+    return nullptr;
+  while (IFWL_Widget* pOuter = pRet->GetOuter()) {
+    pRet = pOuter;
+  }
+  return static_cast<CFWL_WidgetImp*>(pRet->GetImpl());
+}
+#define FWL_WGT_CalcHeight 2048
+#define FWL_WGT_CalcWidth 2048
+#define FWL_WGT_CalcMultiLineDefWidth 120.0f
+CFX_SizeF CFWL_WidgetImp::CalcTextSize(const CFX_WideString& wsText,
+                                       IFWL_ThemeProvider* pTheme,
+                                       FX_BOOL bMultiLine,
+                                       int32_t iLineWidth) {
+  if (!pTheme)
+    return CFX_SizeF();
+
+  CFWL_ThemeText calPart;
+  calPart.m_pWidget = m_pInterface;
+  calPart.m_wsText = wsText;
+  calPart.m_dwTTOStyles =
+      bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;
+  calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
+  CFX_RectF rect;
+  FX_FLOAT fWidth = bMultiLine
+                        ? (iLineWidth > 0 ? (FX_FLOAT)iLineWidth
+                                          : FWL_WGT_CalcMultiLineDefWidth)
+                        : FWL_WGT_CalcWidth;
+  rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight);
+  pTheme->CalcTextRect(&calPart, rect);
+  return CFX_SizeF(rect.width, rect.height);
+}
+void CFWL_WidgetImp::CalcTextRect(const CFX_WideString& wsText,
+                                  IFWL_ThemeProvider* pTheme,
+                                  FX_DWORD dwTTOStyles,
+                                  int32_t iTTOAlign,
+                                  CFX_RectF& rect) {
+  CFWL_ThemeText calPart;
+  calPart.m_pWidget = m_pInterface;
+  calPart.m_wsText = wsText;
+  calPart.m_dwTTOStyles = dwTTOStyles;
+  calPart.m_iTTOAlign = iTTOAlign;
+  pTheme->CalcTextRect(&calPart, rect);
+}
+void CFWL_WidgetImp::SetFocus(FX_BOOL bFocus) {
+  if (m_pWidgetMgr->IsFormDisabled())
+    return;
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  if (!pDriver)
+    return;
+  IFWL_Widget* curFocus = pDriver->GetFocus();
+  if (bFocus && curFocus != m_pInterface) {
+    pDriver->SetFocus(m_pInterface);
+  } else if (!bFocus && curFocus == m_pInterface) {
+    pDriver->SetFocus(NULL);
+  }
+}
+void CFWL_WidgetImp::SetGrab(FX_BOOL bSet) {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  pDriver->SetGrab(m_pInterface, bSet);
+}
+FX_BOOL CFWL_WidgetImp::GetPopupPos(FX_FLOAT fMinHeight,
+                                    FX_FLOAT fMaxHeight,
+                                    const CFX_RectF& rtAnchor,
+                                    CFX_RectF& rtPopup) {
+  if (GetClassID() == FWL_CLASSHASH_Menu) {
+    return GetPopupPosMenu(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
+  } else {
+    if (GetClassID() == FWL_CLASSHASH_ComboBox) {
+      if (m_pWidgetMgr->IsFormDisabled()) {
+        return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight,
+                                                fMaxHeight, rtAnchor, rtPopup);
+      } else {
+        return GetPopupPosComboBox(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
+      }
+    } else if (GetClassID() == FWL_CLASSHASH_DateTimePicker &&
+               m_pWidgetMgr->IsFormDisabled()) {
+      return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight,
+                                              fMaxHeight, rtAnchor, rtPopup);
+    } else {
+      return GetPopupPosGeneral(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CFWL_WidgetImp::GetPopupPosMenu(FX_FLOAT fMinHeight,
+                                        FX_FLOAT fMaxHeight,
+                                        const CFX_RectF& rtAnchor,
+                                        CFX_RectF& rtPopup) {
+  FX_FLOAT fx = 0;
+  FX_FLOAT fy = 0;
+  FX_FLOAT fScreenWidth = 0;
+  FX_FLOAT fScreenHeight = 0;
+  GetScreenSize(fScreenWidth, fScreenHeight);
+  if (GetStylesEx() & FWL_STYLEEXT_MNU_Vert) {
+    FX_BOOL bLeft = m_pProperties->m_rtWidget.left < 0;
+    FX_FLOAT fRight = rtAnchor.right() + rtPopup.width;
+    TransformTo(NULL, fx, fy);
+    if (fRight + fx > fScreenWidth || bLeft) {
+      rtPopup.Set(rtAnchor.left - rtPopup.width, rtAnchor.top, rtPopup.width,
+                  rtPopup.height);
+    } else {
+      rtPopup.Set(rtAnchor.right(), rtAnchor.top, rtPopup.width,
+                  rtPopup.height);
+    }
+  } else {
+    FX_FLOAT fBottom = rtAnchor.bottom() + rtPopup.height;
+    TransformTo(NULL, fx, fy);
+    if (fBottom + fy > fScreenHeight) {
+      rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width,
+                  rtPopup.height);
+    } else {
+      rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width,
+                  rtPopup.height);
+    }
+  }
+  rtPopup.Offset(fx, fy);
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetImp::GetPopupPosComboBox(FX_FLOAT fMinHeight,
+                                            FX_FLOAT fMaxHeight,
+                                            const CFX_RectF& rtAnchor,
+                                            CFX_RectF& rtPopup) {
+  FX_FLOAT fx = 0;
+  FX_FLOAT fy = 0;
+  FX_FLOAT fScreenWidth = 0;
+  FX_FLOAT fScreenHeight = 0;
+  GetScreenSize(fScreenWidth, fScreenHeight);
+  FX_FLOAT fPopHeight = rtPopup.height;
+  if (rtPopup.height > fMaxHeight) {
+    fPopHeight = fMaxHeight;
+  } else if (rtPopup.height < fMinHeight) {
+    fPopHeight = fMinHeight;
+  }
+  FX_FLOAT fWidth = std::max(rtAnchor.width, rtPopup.width);
+  FX_FLOAT fBottom = rtAnchor.bottom() + fPopHeight;
+  TransformTo(NULL, fx, fy);
+  if (fBottom + fy > fScreenHeight) {
+    rtPopup.Set(rtAnchor.left, rtAnchor.top - fPopHeight, fWidth, fPopHeight);
+  } else {
+    rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), fWidth, fPopHeight);
+  }
+  rtPopup.Offset(fx, fy);
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetImp::GetPopupPosGeneral(FX_FLOAT fMinHeight,
+                                           FX_FLOAT fMaxHeight,
+                                           const CFX_RectF& rtAnchor,
+                                           CFX_RectF& rtPopup) {
+  FX_FLOAT fx = 0;
+  FX_FLOAT fy = 0;
+  FX_FLOAT fScreenWidth = 0;
+  FX_FLOAT fScreenHeight = 0;
+  GetScreenSize(fScreenWidth, fScreenHeight);
+  TransformTo(NULL, fx, fy);
+  if (rtAnchor.bottom() + fy > fScreenHeight) {
+    rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width,
+                rtPopup.height);
+  } else {
+    rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width,
+                rtPopup.height);
+  }
+  rtPopup.Offset(fx, fy);
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetImp::GetScreenSize(FX_FLOAT& fx, FX_FLOAT& fy) {
+  return FALSE;
+}
+void CFWL_WidgetImp::RegisterEventTarget(IFWL_Widget* pEventSource,
+                                         FX_DWORD dwFilter) {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
+  if (!pNoteDriver)
+    return;
+  pNoteDriver->RegisterEventTarget(m_pInterface, pEventSource, dwFilter);
+}
+void CFWL_WidgetImp::UnregisterEventTarget() {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
+  if (!pNoteDriver)
+    return;
+  pNoteDriver->UnregisterEventTarget(m_pInterface);
+}
+void CFWL_WidgetImp::DispatchKeyEvent(CFWL_MsgKey* pNote) {
+  if (!pNote)
+    return;
+  CFWL_EvtKey* pEvent = new CFWL_EvtKey;
+  pEvent->m_pSrcTarget = m_pInterface;
+  pEvent->m_dwCmd = pNote->m_dwCmd;
+  pEvent->m_dwKeyCode = pNote->m_dwKeyCode;
+  pEvent->m_dwFlags = pNote->m_dwFlags;
+  DispatchEvent(pEvent);
+  pEvent->Release();
+}
+void CFWL_WidgetImp::DispatchEvent(CFWL_Event* pEvent) {
+  if (m_pOuter) {
+    IFWL_WidgetDelegate* pDelegate = m_pOuter->SetDelegate(NULL);
+    pDelegate->OnProcessEvent(pEvent);
+    return;
+  }
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
+  if (!pNoteDriver)
+    return;
+  pNoteDriver->SendNote(pEvent);
+}
+void CFWL_WidgetImp::Repaint(const CFX_RectF* pRect) {
+  if (pRect) {
+    m_pWidgetMgr->RepaintWidget(m_pInterface, pRect);
+    return;
+  }
+  CFX_RectF rect;
+  rect = m_pProperties->m_rtWidget;
+  rect.left = rect.top = 0;
+  m_pWidgetMgr->RepaintWidget(m_pInterface, &rect);
+}
+void CFWL_WidgetImp::DrawBackground(CFX_Graphics* pGraphics,
+                                    int32_t iPartBk,
+                                    IFWL_ThemeProvider* pTheme,
+                                    const CFX_Matrix* pMatrix) {
+  CFX_RectF rtRelative;
+  GetRelativeRect(rtRelative);
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = iPartBk;
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix, TRUE);
+  }
+  param.m_rtPart = rtRelative;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_WidgetImp::DrawBorder(CFX_Graphics* pGraphics,
+                                int32_t iPartBorder,
+                                IFWL_ThemeProvider* pTheme,
+                                const CFX_Matrix* pMatrix) {
+  CFX_RectF rtRelative;
+  GetRelativeRect(rtRelative);
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = iPartBorder;
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix, TRUE);
+  }
+  param.m_rtPart = rtRelative;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_WidgetImp::DrawEdge(CFX_Graphics* pGraphics,
+                              int32_t iPartEdge,
+                              IFWL_ThemeProvider* pTheme,
+                              const CFX_Matrix* pMatrix) {
+  CFX_RectF rtEdge;
+  GetEdgeRect(rtEdge);
+  CFWL_ThemeBackground param;
+  param.m_pWidget = m_pInterface;
+  param.m_iPart = iPartEdge;
+  param.m_pGraphics = pGraphics;
+  if (pMatrix) {
+    param.m_matrix.Concat(*pMatrix, TRUE);
+  }
+  param.m_rtPart = rtEdge;
+  pTheme->DrawBackground(&param);
+}
+void CFWL_WidgetImp::NotifyDriver() {
+  IFWL_NoteThread* pThread = GetOwnerThread();
+  if (!pThread)
+    return;
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
+  if (!pDriver)
+    return;
+  pDriver->NotifyTargetDestroy(m_pInterface);
+}
+CFX_SizeF CFWL_WidgetImp::GetOffsetFromParent(IFWL_Widget* pParent) {
+  if (pParent == GetInterface())
+    return CFX_SizeF();
+
+  IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
+  if (!pWidgetMgr)
+    return CFX_SizeF();
+
+  CFX_SizeF szRet(m_pProperties->m_rtWidget.left,
+                  m_pProperties->m_rtWidget.top);
+
+  IFWL_Widget* pDstWidget = GetParent();
+  while (pDstWidget && pDstWidget != pParent) {
+    CFX_RectF rtDst;
+    pDstWidget->GetWidgetRect(rtDst);
+    szRet += CFX_SizeF(rtDst.left, rtDst.top);
+    pDstWidget = pWidgetMgr->GetWidget(pDstWidget, FWL_WGTRELATION_Parent);
+  }
+  return szRet;
+}
+FX_BOOL CFWL_WidgetImp::IsParent(IFWL_Widget* pParent) {
+  IFWL_Widget* pUpWidget = GetParent();
+  while (pUpWidget) {
+    if (pUpWidget == pParent)
+      return TRUE;
+    pUpWidget = pUpWidget->GetParent();
+  }
+  return FALSE;
+}
+CFWL_WidgetImpDelegate::CFWL_WidgetImpDelegate() {}
+int32_t CFWL_WidgetImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage->m_pDstTarget)
+    return 0;
+  CFWL_WidgetImp* pWidget =
+      static_cast<CFWL_WidgetImp*>(pMessage->m_pDstTarget->GetImpl());
+  FX_DWORD dwMsgCode = pMessage->GetClassID();
+  switch (dwMsgCode) {
+    case FWL_MSGHASH_Mouse: {
+      CFWL_MsgMouse* pMsgMouse = static_cast<CFWL_MsgMouse*>(pMessage);
+      CFWL_EvtMouse evt;
+      evt.m_pSrcTarget = pWidget->m_pInterface;
+      evt.m_pDstTarget = pWidget->m_pInterface;
+      evt.m_dwCmd = pMsgMouse->m_dwCmd;
+      evt.m_dwFlags = pMsgMouse->m_dwFlags;
+      evt.m_fx = pMsgMouse->m_fx;
+      evt.m_fy = pMsgMouse->m_fy;
+      pWidget->DispatchEvent(&evt);
+      break;
+    }
+    case FWL_MSGHASH_MouseWheel: {
+      CFWL_MsgMouseWheel* pMsgMouseWheel =
+          static_cast<CFWL_MsgMouseWheel*>(pMessage);
+      CFWL_EvtMouseWheel evt;
+      evt.m_pSrcTarget = pWidget->m_pInterface;
+      evt.m_pDstTarget = pWidget->m_pInterface;
+      evt.m_dwFlags = pMsgMouseWheel->m_dwFlags;
+      evt.m_fDeltaX = pMsgMouseWheel->m_fDeltaX;
+      evt.m_fDeltaY = pMsgMouseWheel->m_fDeltaY;
+      evt.m_fx = pMsgMouseWheel->m_fx;
+      evt.m_fy = pMsgMouseWheel->m_fy;
+      pWidget->DispatchEvent(&evt);
+      break;
+    }
+    case FWL_MSGHASH_Key: {
+      CFWL_MsgKey* pMsgKey = static_cast<CFWL_MsgKey*>(pMessage);
+      CFWL_EvtKey evt;
+      evt.m_pSrcTarget = pWidget->m_pInterface;
+      evt.m_pDstTarget = pWidget->m_pInterface;
+      evt.m_dwKeyCode = pMsgKey->m_dwKeyCode;
+      evt.m_dwFlags = pMsgKey->m_dwFlags;
+      evt.m_dwCmd = pMsgKey->m_dwCmd;
+      pWidget->DispatchEvent(&evt);
+      break;
+    }
+    case FWL_MSGHASH_SetFocus: {
+      CFWL_MsgSetFocus* pMsgSetFocus = static_cast<CFWL_MsgSetFocus*>(pMessage);
+      CFWL_EvtSetFocus evt;
+      evt.m_pSrcTarget = pMsgSetFocus->m_pDstTarget;
+      evt.m_pDstTarget = pMsgSetFocus->m_pDstTarget;
+      evt.m_pSetFocus = pWidget->m_pInterface;
+      pWidget->DispatchEvent(&evt);
+      break;
+    }
+    case FWL_MSGHASH_KillFocus: {
+      CFWL_MsgKillFocus* pMsgKillFocus =
+          static_cast<CFWL_MsgKillFocus*>(pMessage);
+      CFWL_EvtKillFocus evt;
+      evt.m_pSrcTarget = pMsgKillFocus->m_pDstTarget;
+      evt.m_pDstTarget = pMsgKillFocus->m_pDstTarget;
+      evt.m_pKillFocus = pWidget->m_pInterface;
+      pWidget->DispatchEvent(&evt);
+      break;
+    }
+    default: {}
+  }
+  return 1;
+}
+FWL_ERR CFWL_WidgetImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                             const CFX_Matrix* pMatrix) {
+  CFWL_EvtDraw evt;
+  evt.m_pGraphics = pGraphics;
+  return FWL_ERR_Succeeded;
+}
+class CFWL_CustomImp : public CFWL_WidgetImp {
+ public:
+  CFWL_CustomImp(const CFWL_WidgetImpProperties& properties,
+                 IFWL_Widget* pOuter);
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR SetProxy(IFWL_Proxy* pProxy);
+
+ protected:
+  IFWL_Proxy* m_pProxy;
+};
+CFWL_CustomImp::CFWL_CustomImp(const CFWL_WidgetImpProperties& properties,
+                               IFWL_Widget* pOuter)
+    : CFWL_WidgetImp(properties, pOuter), m_pProxy(NULL) {}
+FWL_ERR CFWL_CustomImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (m_pProxy &&
+      (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) {
+    return FWL_ERR_Succeeded;
+  }
+  return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize);
+}
+FWL_ERR CFWL_CustomImp::Update() {
+  if (m_pProxy) {
+    return m_pProxy->Update();
+  }
+  return CFWL_WidgetImp::Update();
+}
+FWL_ERR CFWL_CustomImp::SetProxy(IFWL_Proxy* pProxy) {
+  m_pProxy = pProxy;
+  return FWL_ERR_Succeeded;
+}
+
+// static
+IFWL_Custom* IFWL_Custom::Create(const CFWL_WidgetImpProperties& properties,
+                                 IFWL_Widget* pOuter) {
+  IFWL_Custom* pCustom = new IFWL_Custom;
+  CFWL_CustomImp* pCustomImpl = new CFWL_CustomImp(properties, pOuter);
+  pCustom->SetImpl(pCustomImpl);
+  pCustomImpl->SetInterface(pCustom);
+  return pCustom;
+}
+IFWL_Custom::IFWL_Custom() {}
+FWL_ERR IFWL_Custom::SetProxy(IFWL_Proxy* pProxy) {
+  return static_cast<CFWL_CustomImp*>(GetImpl())->SetProxy(pProxy);
+}
+void FWL_SetWidgetRect(IFWL_Widget* widget, const CFX_RectF& rect) {
+  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_rtWidget =
+      rect;
+}
+void FWL_SetWidgetStates(IFWL_Widget* widget, FX_DWORD dwStates) {
+  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_dwStates =
+      dwStates;
+}
+void FWL_SetWidgetStyles(IFWL_Widget* widget, FX_DWORD dwStyles) {
+  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_dwStyles =
+      dwStyles;
+}
+FWL_ERR FWL_EnabelWidget(IFWL_Widget* widget, FX_BOOL bEnable) {
+  widget->SetStates(FWL_WGTSTATE_Disabled, !bEnable);
+  IFWL_WidgetMgr* widgetMgr = FWL_GetWidgetMgr();
+  IFWL_Widget* child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild);
+  while (child) {
+    FWL_EnabelWidget(child, bEnable);
+    child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/core/fwl_widgetimp.h b/xfa/fwl/core/fwl_widgetimp.h
new file mode 100644
index 0000000..0aa7beb
--- /dev/null
+++ b/xfa/fwl/core/fwl_widgetimp.h
@@ -0,0 +1,162 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_WIDGETIMP_H_
+#define XFA_FWL_CORE_FWL_WIDGETIMP_H_
+
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+class CFWL_NoteThreadImp;
+class CFWL_WidgetImpProperties;
+class CFWL_WidgetMgr;
+class IFWL_DataProvider;
+class IFWL_ThemeProvider;
+class IFWL_Widget;
+class IFWL_WidgetDelegate;
+
+class CFWL_WidgetImp : public CFWL_TargetImp {
+ public:
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+
+  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  virtual FWL_ERR GetGlobalRect(CFX_RectF& rect);
+  virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
+  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
+  virtual IFWL_Widget* GetParent();
+  virtual FWL_ERR SetParent(IFWL_Widget* pParent);
+  virtual IFWL_Widget* GetOwner();
+  virtual FWL_ERR SetOwner(IFWL_Widget* pOwner);
+  virtual IFWL_Widget* GetOuter();
+  virtual FX_DWORD GetStyles();
+  virtual FWL_ERR ModifyStyles(FX_DWORD dwStylesAdded,
+                               FX_DWORD dwStylesRemoved);
+  virtual FX_DWORD GetStylesEx();
+  virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                 FX_DWORD dwStylesExRemoved);
+  virtual FX_DWORD GetStates();
+  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
+  virtual FWL_ERR SetPrivateData(void* module_id,
+                                 void* pData,
+                                 PD_CALLBACK_FREEDATA callback);
+  virtual void* GetPrivateData(void* module_id);
+  virtual FWL_ERR Update();
+  virtual FWL_ERR LockUpdate();
+  virtual FWL_ERR UnlockUpdate();
+  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FWL_ERR TransformTo(IFWL_Widget* pWidget, FX_FLOAT& fx, FX_FLOAT& fy);
+  virtual FWL_ERR TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt);
+  virtual FWL_ERR GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal = FALSE);
+  virtual FWL_ERR SetMatrix(const CFX_Matrix& matrix);
+  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix = NULL);
+  virtual IFWL_ThemeProvider* GetThemeProvider();
+  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
+  virtual FWL_ERR SetDataProvider(IFWL_DataProvider* pDataProvider);
+  virtual IFWL_WidgetDelegate* SetDelegate(IFWL_WidgetDelegate* pDelegate);
+  virtual IFWL_NoteThread* GetOwnerThread() const;
+  FWL_ERR SetOwnerThread(CFWL_NoteThreadImp* pOwnerThread);
+  IFWL_Widget* GetInterface() const;
+  void SetInterface(IFWL_Widget* pInterface);
+  CFX_SizeF GetOffsetFromParent(IFWL_Widget* pParent);
+
+ protected:
+  CFWL_WidgetImp(const CFWL_WidgetImpProperties& properties,
+                 IFWL_Widget* pOuter);
+  virtual ~CFWL_WidgetImp();
+  FX_BOOL IsEnabled() const;
+  FX_BOOL IsVisible() const;
+  FX_BOOL IsActive() const;
+  FX_BOOL IsOverLapper() const;
+  FX_BOOL IsPopup() const;
+  FX_BOOL IsChild() const;
+  FX_BOOL IsLocked() const;
+  FX_BOOL IsOffscreen() const;
+  FX_BOOL HasBorder() const;
+  FX_BOOL HasEdge() const;
+  void GetEdgeRect(CFX_RectF& rtEdge);
+  FX_FLOAT GetBorderSize(FX_BOOL bCX = TRUE);
+  FX_FLOAT GetEdgeWidth();
+  void GetRelativeRect(CFX_RectF& rect);
+  void* GetThemeCapacity(FX_DWORD dwCapacity);
+  IFWL_ThemeProvider* GetAvailableTheme();
+  CFWL_WidgetImp* GetRootOuter();
+  CFX_SizeF CalcTextSize(const CFX_WideString& wsText,
+                         IFWL_ThemeProvider* pTheme,
+                         FX_BOOL bMultiLine = FALSE,
+                         int32_t iLineWidth = -1);
+  void CalcTextRect(const CFX_WideString& wsText,
+                    IFWL_ThemeProvider* pTheme,
+                    FX_DWORD dwTTOStyles,
+                    int32_t iTTOAlign,
+                    CFX_RectF& rect);
+  void SetFocus(FX_BOOL bFocus);
+  void SetGrab(FX_BOOL bSet);
+  FX_BOOL GetPopupPos(FX_FLOAT fMinHeight,
+                      FX_FLOAT fMaxHeight,
+                      const CFX_RectF& rtAnchor,
+                      CFX_RectF& rtPopup);
+  FX_BOOL GetPopupPosMenu(FX_FLOAT fMinHeight,
+                          FX_FLOAT fMaxHeight,
+                          const CFX_RectF& rtAnchor,
+                          CFX_RectF& rtPopup);
+  FX_BOOL GetPopupPosComboBox(FX_FLOAT fMinHeight,
+                              FX_FLOAT fMaxHeight,
+                              const CFX_RectF& rtAnchor,
+                              CFX_RectF& rtPopup);
+  FX_BOOL GetPopupPosGeneral(FX_FLOAT fMinHeight,
+                             FX_FLOAT fMaxHeight,
+                             const CFX_RectF& rtAnchor,
+                             CFX_RectF& rtPopup);
+  FX_BOOL GetScreenSize(FX_FLOAT& fx, FX_FLOAT& fy);
+  void RegisterEventTarget(IFWL_Widget* pEventSource = NULL,
+                           FX_DWORD dwFilter = FWL_EVENT_ALL_MASK);
+  void UnregisterEventTarget();
+  void DispatchKeyEvent(CFWL_MsgKey* pNote);
+  void DispatchEvent(CFWL_Event* pEvent);
+  void Repaint(const CFX_RectF* pRect = NULL);
+  void DrawBackground(CFX_Graphics* pGraphics,
+                      int32_t iPartBk,
+                      IFWL_ThemeProvider* pTheme,
+                      const CFX_Matrix* pMatrix = NULL);
+  void DrawBorder(CFX_Graphics* pGraphics,
+                  int32_t iPartBorder,
+                  IFWL_ThemeProvider* pTheme,
+                  const CFX_Matrix* pMatrix = NULL);
+  void DrawEdge(CFX_Graphics* pGraphics,
+                int32_t iPartEdge,
+                IFWL_ThemeProvider* pTheme,
+                const CFX_Matrix* pMatrix = NULL);
+  void NotifyDriver();
+
+  FX_BOOL IsParent(IFWL_Widget* pParent);
+  CFWL_WidgetMgr* m_pWidgetMgr;
+  CFWL_NoteThreadImp* m_pOwnerThread;
+  CFWL_WidgetImpProperties* m_pProperties;
+  CFX_PrivateData* m_pPrivateData;
+  IFWL_WidgetDelegate* m_pDelegate;
+  IFWL_WidgetDelegate* m_pCurDelegate;
+  IFWL_Widget* m_pOuter;
+  IFWL_Widget* m_pInterface;
+  int32_t m_iLock;
+  friend class CFWL_WidgetImpDelegate;
+  friend void FWL_SetWidgetRect(IFWL_Widget* widget, const CFX_RectF& rect);
+  friend void FWL_SetWidgetStates(IFWL_Widget* widget, FX_DWORD dwStates);
+  friend void FWL_SetWidgetStyles(IFWL_Widget* widget, FX_DWORD dwStyles);
+};
+
+class CFWL_WidgetImpDelegate : public IFWL_WidgetDelegate {
+ public:
+  CFWL_WidgetImpDelegate();
+  ~CFWL_WidgetImpDelegate() override {}
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+};
+
+#endif  // XFA_FWL_CORE_FWL_WIDGETIMP_H_
diff --git a/xfa/fwl/core/fwl_widgetmgrimp.cpp b/xfa/fwl/core/fwl_widgetmgrimp.cpp
new file mode 100644
index 0000000..ab507c2
--- /dev/null
+++ b/xfa/fwl/core/fwl_widgetmgrimp.cpp
@@ -0,0 +1,1075 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+
+#include "xfa/fwl/core/fwl_appimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/include/fwl/adapter/fwl_adapternative.h"
+#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/core/fwl_form.h"
+
+FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
+#if (_FX_OS_ == _FX_MACOSX_)
+  return FALSE;
+#else
+  return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen;
+#endif
+}
+IFWL_WidgetMgr* FWL_GetWidgetMgr() {
+  IFWL_App* pApp = FWL_GetApp();
+  if (!pApp)
+    return NULL;
+  return pApp->GetWidgetMgr();
+}
+CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
+    : m_dwCapability(0) {
+  m_pDelegate = new CFWL_WidgetMgrDelegate(this);
+  m_pAdapter = pAdapterNative->GetWidgetMgr(m_pDelegate);
+  FXSYS_assert(m_pAdapter);
+  CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
+  m_mapWidgetItem.SetAt(NULL, pRoot);
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+  m_rtScreen.Reset();
+#endif
+}
+CFWL_WidgetMgr::~CFWL_WidgetMgr() {
+  FX_POSITION ps = m_mapWidgetItem.GetStartPosition();
+  while (ps) {
+    void* pWidget;
+    CFWL_WidgetMgrItem* pItem;
+    m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem);
+    delete pItem;
+  }
+  m_mapWidgetItem.RemoveAll();
+  if (m_pDelegate) {
+    delete m_pDelegate;
+    m_pDelegate = NULL;
+  }
+}
+int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+  return TravelWidgetMgr(pParentItem, NULL, NULL);
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidget(int32_t nIndex, IFWL_Widget* pParent) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+  IFWL_Widget* pWidget = NULL;
+  TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget);
+  return pWidget;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget* pWidget,
+                                       FWL_WGTRELATION eRelation) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  if (!pItem) {
+    return NULL;
+  }
+  IFWL_Widget* pRet = NULL;
+  switch (eRelation) {
+    case FWL_WGTRELATION_Parent: {
+      pRet = pItem->pParent ? pItem->pParent->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_Owner: {
+      pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_FirstSibling: {
+      pItem = pItem->pPrevious;
+      while (pItem && pItem->pPrevious) {
+        pItem = pItem->pPrevious;
+      }
+      pRet = pItem ? pItem->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_PriorSibling: {
+      pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_NextSibling: {
+      pRet = pItem->pNext ? pItem->pNext->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_LastSibling: {
+      pItem = pItem->pNext;
+      while (pItem && pItem->pNext) {
+        pItem = pItem->pNext;
+      }
+      pRet = pItem ? pItem->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_FirstChild: {
+      pRet = pItem->pChild ? pItem->pChild->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_LastChild: {
+      pItem = pItem->pChild;
+      while (pItem && pItem->pNext) {
+        pItem = pItem->pNext;
+      }
+      pRet = pItem ? pItem->pWidget : NULL;
+      break;
+    }
+    case FWL_WGTRELATION_SystemForm: {
+      while (pItem) {
+        if (IsAbleNative(pItem->pWidget)) {
+          pRet = pItem->pWidget;
+          break;
+        }
+        pItem = pItem->pParent;
+      }
+      break;
+    }
+    default: {}
+  }
+  return pRet;
+}
+int32_t CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  if (!pItem)
+    return -1;
+  return TravelWidgetMgr(pItem->pParent, NULL, pItem);
+}
+FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  if (!pItem)
+    return FALSE;
+  if (!pItem->pParent)
+    return FALSE;
+  CFWL_WidgetMgrItem* pChild = pItem->pParent->pChild;
+  int32_t i = 0;
+  while (pChild) {
+    if (pChild == pItem) {
+      if (i == nIndex) {
+        return TRUE;
+      }
+      if (pChild->pPrevious) {
+        pChild->pPrevious->pNext = pChild->pNext;
+      }
+      if (pChild->pNext) {
+        pChild->pNext->pPrevious = pChild->pPrevious;
+      }
+      if (pItem->pParent->pChild == pItem) {
+        pItem->pParent->pChild = pItem->pNext;
+      }
+      pItem->pNext = NULL;
+      pItem->pPrevious = NULL;
+      break;
+    }
+    if (!pChild->pNext) {
+      break;
+    }
+    pChild = pChild->pNext;
+    ++i;
+  }
+  pChild = pItem->pParent->pChild;
+  if (pChild) {
+    if (nIndex < 0) {
+      while (pChild->pNext) {
+        pChild = pChild->pNext;
+      }
+      pChild->pNext = pItem;
+      pItem->pPrevious = pChild;
+      pItem->pNext = NULL;
+      return TRUE;
+    }
+    i = 0;
+    while (i < nIndex && pChild->pNext) {
+      pChild = pChild->pNext;
+      ++i;
+    }
+    if (!pChild->pNext) {
+      pChild->pNext = pItem;
+      pItem->pPrevious = pChild;
+      pItem->pNext = NULL;
+      return TRUE;
+    }
+    if (pChild->pPrevious) {
+      pItem->pPrevious = pChild->pPrevious;
+      pChild->pPrevious->pNext = pItem;
+    }
+    pChild->pPrevious = pItem;
+    pItem->pNext = pChild;
+    if (pItem->pParent->pChild == pChild) {
+      pItem->pParent->pChild = pItem;
+    }
+  } else {
+    pItem->pParent->pChild = pItem;
+    pItem->pPrevious = NULL;
+    pItem->pNext = NULL;
+  }
+  return TRUE;
+}
+FWL_ERR CFWL_WidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
+                                      const CFX_RectF* pRect) {
+  if (!m_pAdapter)
+    return FWL_ERR_Indefinite;
+  IFWL_Widget* pNative = pWidget;
+  CFX_RectF rect(*pRect);
+  if (IsFormDisabled()) {
+    IFWL_Widget* pOuter = pWidget->GetOuter();
+    while (pOuter) {
+      CFX_RectF rtTemp;
+      pNative->GetWidgetRect(rtTemp);
+      rect.left += rtTemp.left;
+      rect.top += rtTemp.top;
+      pNative = pOuter;
+      pOuter = pOuter->GetOuter();
+    }
+  } else if (!IsAbleNative(pWidget)) {
+    pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
+    if (!pNative)
+      return FWL_ERR_Indefinite;
+    pWidget->TransformTo(pNative, rect.left, rect.top);
+  }
+  AddRedrawCounts(pNative);
+  return m_pAdapter->RepaintWidget(pNative, &rect);
+}
+void CFWL_WidgetMgr::AddWidget(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(NULL);
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  if (!pItem) {
+    pItem = new CFWL_WidgetMgrItem;
+    pItem->pWidget = pWidget;
+    m_mapWidgetItem.SetAt(pWidget, pItem);
+  }
+  if (pItem->pParent && pItem->pParent != pParentItem) {
+    if (pItem->pPrevious) {
+      pItem->pPrevious->pNext = pItem->pNext;
+    }
+    if (pItem->pNext) {
+      pItem->pNext->pPrevious = pItem->pPrevious;
+    }
+    if (pItem->pParent->pChild == pItem) {
+      pItem->pParent->pChild = pItem->pNext;
+    }
+  }
+  pItem->pParent = pParentItem;
+  SetWidgetIndex(pWidget, -1);
+}
+void CFWL_WidgetMgr::InsertWidget(IFWL_Widget* pParent,
+                                  IFWL_Widget* pChild,
+                                  int32_t nIndex) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+  if (!pParentItem) {
+    pParentItem = new CFWL_WidgetMgrItem;
+    pParentItem->pWidget = pParent;
+    m_mapWidgetItem.SetAt(pParent, pParentItem);
+    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
+    pParentItem->pParent = pRoot;
+    SetWidgetIndex(pParent, -1);
+  }
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
+  if (!pItem) {
+    pItem = new CFWL_WidgetMgrItem;
+    pItem->pWidget = pChild;
+    m_mapWidgetItem.SetAt(pChild, pItem);
+  }
+  if (pItem->pParent && pItem->pParent != pParentItem) {
+    if (pItem->pPrevious) {
+      pItem->pPrevious->pNext = pItem->pNext;
+    }
+    if (pItem->pNext) {
+      pItem->pNext->pPrevious = pItem->pPrevious;
+    }
+    if (pItem->pParent->pChild == pItem) {
+      pItem->pParent->pChild = pItem->pNext;
+    }
+  }
+  pItem->pParent = pParentItem;
+  SetWidgetIndex(pChild, nIndex);
+}
+void CFWL_WidgetMgr::RemoveWidget(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  if (!pItem) {
+    return;
+  }
+  if (pItem->pPrevious) {
+    pItem->pPrevious->pNext = pItem->pNext;
+  }
+  if (pItem->pNext) {
+    pItem->pNext->pPrevious = pItem->pPrevious;
+  }
+  if (pItem->pParent && pItem->pParent->pChild == pItem) {
+    pItem->pParent->pChild = pItem->pNext;
+  }
+  CFWL_WidgetMgrItem* pChild = pItem->pChild;
+  while (pChild) {
+    CFWL_WidgetMgrItem* pNext = pChild->pNext;
+    RemoveWidget(pChild->pWidget);
+    pChild = pNext;
+  }
+  m_mapWidgetItem.RemoveKey(pWidget);
+  delete pItem;
+}
+void CFWL_WidgetMgr::SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pOwner);
+  if (!pParentItem) {
+    pParentItem = new CFWL_WidgetMgrItem;
+    pParentItem->pWidget = pOwner;
+    m_mapWidgetItem.SetAt(pOwner, pParentItem);
+    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
+    pParentItem->pParent = pRoot;
+    SetWidgetIndex(pOwner, -1);
+  }
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pOwned);
+  if (!pItem) {
+    pItem = new CFWL_WidgetMgrItem;
+    pItem->pWidget = pOwned;
+    m_mapWidgetItem.SetAt(pOwned, pItem);
+  }
+  pItem->pOwner = pParentItem;
+}
+void CFWL_WidgetMgr::SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild) {
+  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
+  if (!pItem)
+    return;
+  if (pItem->pParent && pItem->pParent != pParentItem) {
+    if (pItem->pPrevious) {
+      pItem->pPrevious->pNext = pItem->pNext;
+    }
+    if (pItem->pNext) {
+      pItem->pNext->pPrevious = pItem->pPrevious;
+    }
+    if (pItem->pParent->pChild == pItem) {
+      pItem->pParent->pChild = pItem->pNext;
+    }
+    pItem->pNext = NULL;
+    pItem->pPrevious = NULL;
+  }
+  pItem->pParent = pParentItem;
+  SetWidgetIndex(pChild, -1);
+  if (!m_pAdapter)
+    return;
+  m_pAdapter->SetParentWidget(pChild, pParent);
+}
+FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent) {
+  IFWL_Widget* pTemp = pChild;
+  do {
+    if (pTemp == pParent) {
+      return TRUE;
+    }
+    pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent);
+  } while (pTemp);
+  return FALSE;
+}
+FWL_ERR CFWL_WidgetMgr::CreateWidget_Native(IFWL_Widget* pWidget) {
+  if (!IsAbleNative(pWidget)) {
+    return FWL_ERR_Succeeded;
+  }
+  return m_pAdapter->CreateWidget(pWidget, pWidget->GetOwner());
+}
+FWL_ERR CFWL_WidgetMgr::DestroyWidget_Native(IFWL_Widget* pWidget) {
+  if (!IsAbleNative(pWidget)) {
+    return FWL_ERR_Succeeded;
+  }
+  return m_pAdapter->DestroyWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::GetWidgetRect_Native(IFWL_Widget* pWidget,
+                                             CFX_RectF& rect) {
+  if (!IsAbleNative(pWidget)) {
+    return FWL_ERR_Succeeded;
+  }
+  return m_pAdapter->GetWidgetRect(pWidget, rect);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetRect_Native(IFWL_Widget* pWidget,
+                                             const CFX_RectF& rect) {
+  if (FWL_UseOffscreen(pWidget)) {
+    CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+    pItem->iRedrawCounter++;
+    if (pItem->pOffscreen) {
+      CFX_RenderDevice* pDevice = pItem->pOffscreen->GetRenderDevice();
+      if (pDevice && pDevice->GetBitmap()) {
+        CFX_DIBitmap* pBitmap = pDevice->GetBitmap();
+        if (pBitmap->GetWidth() - rect.width > 1 ||
+            pBitmap->GetHeight() - rect.height > 1) {
+          delete pItem->pOffscreen;
+          pItem->pOffscreen = NULL;
+        }
+      }
+    }
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+    pItem->bOutsideChanged = !m_rtScreen.Contains(rect);
+#endif
+  }
+  return m_pAdapter->SetWidgetRect(pWidget, rect);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetPosition_Native(IFWL_Widget* pWidget,
+                                                 FX_FLOAT fx,
+                                                 FX_FLOAT fy) {
+  return m_pAdapter->SetWidgetPosition(pWidget, fx, fy);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetIcon_Native(IFWL_Widget* pWidget,
+                                             const CFX_DIBitmap* pIcon,
+                                             FX_BOOL bBig) {
+  return m_pAdapter->SetWidgetIcon(pWidget, pIcon, bBig);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetCaption_Native(
+    IFWL_Widget* pWidget,
+    const CFX_WideStringC& wsCaption) {
+  return m_pAdapter->SetWidgetCaption(pWidget, wsCaption);
+}
+FWL_ERR CFWL_WidgetMgr::SetBorderRegion_Native(IFWL_Widget* pWidget,
+                                               CFX_Path* pPath) {
+  return m_pAdapter->SetBorderRegion(pWidget, pPath);
+}
+FWL_ERR CFWL_WidgetMgr::ShowWidget_Native(IFWL_Widget* pWidget) {
+  return m_pAdapter->ShowWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::HideWidget_Native(IFWL_Widget* pWidget) {
+  return m_pAdapter->HideWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetNormal_Native(IFWL_Widget* pWidget) {
+  return m_pAdapter->SetNormal(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetMaximize_Native(IFWL_Widget* pWidget) {
+  return m_pAdapter->SetMaximize(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetMinimize_Native(IFWL_Widget* pWidget) {
+  return m_pAdapter->SetMinimize(pWidget);
+}
+FX_BOOL CFWL_WidgetMgr::CheckMessage_Native() {
+  return m_pAdapter->CheckMessage();
+}
+FWL_ERR CFWL_WidgetMgr::DispatchMessage_Native() {
+  return m_pAdapter->DispatchMessage();
+}
+FX_BOOL CFWL_WidgetMgr::IsIdleMessage_Native() {
+  return m_pAdapter->IsIdleMessage();
+}
+FWL_ERR CFWL_WidgetMgr::Exit_Native(int32_t iExitCode) {
+  return m_pAdapter->Exit(iExitCode);
+}
+FWL_ERR CFWL_WidgetMgr::CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget,
+                                                        void* vp) {
+  return m_pAdapter->CreateWidgetWithNativeId(pWidget, vp);
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
+                                              FX_FLOAT x,
+                                              FX_FLOAT y) {
+  if (!parent)
+    return NULL;
+  FX_FLOAT x1;
+  FX_FLOAT y1;
+  IFWL_Widget* child = GetWidget(parent, FWL_WGTRELATION_LastChild);
+  while (child) {
+    if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
+      x1 = x;
+      y1 = y;
+      CFX_Matrix matrixOnParent;
+      child->GetMatrix(matrixOnParent);
+      CFX_Matrix m;
+      m.SetIdentity();
+      m.SetReverse(matrixOnParent);
+      m.TransformPoint(x1, y1);
+      CFX_RectF bounds;
+      child->GetWidgetRect(bounds);
+      if (bounds.Contains(x1, y1)) {
+        x1 -= bounds.left;
+        y1 -= bounds.top;
+        return GetWidgetAtPoint(child, x1, y1);
+      }
+    }
+    child = GetWidget(child, FWL_WGTRELATION_PriorSibling);
+  }
+  return parent;
+}
+void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  if (!FWL_UseOffscreen(pForm)) {
+    return;
+  }
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pForm);
+  if (pItem->pOffscreen) {
+    delete pItem->pOffscreen;
+    pItem->pOffscreen = NULL;
+  }
+}
+IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
+                                     IFWL_Widget* focus,
+                                     FX_BOOL& bFind) {
+  IFWL_Widget* child =
+      FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+  while (child) {
+    if (focus == child) {
+      bFind = TRUE;
+    }
+    if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) &&
+        (!focus || (focus != child && bFind))) {
+      return child;
+    }
+    IFWL_Widget* bRet = nextTab(child, focus, bFind);
+    if (bRet) {
+      return bRet;
+    }
+    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+  return NULL;
+}
+int32_t CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget* pFirst) {
+  int32_t iRet = 0;
+  IFWL_Widget* pChild = pFirst;
+  while (pChild) {
+    if ((pChild->GetStyles() & FWL_WGTSTYLE_Group) &&
+        pChild->GetClassID() == 3811304691) {
+      iRet++;
+    }
+    pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling);
+  }
+  return iRet;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget* pWidget,
+                                                   FX_BOOL bNext) {
+  while ((pWidget = GetWidget(pWidget, bNext ? FWL_WGTRELATION_NextSibling
+                                             : FWL_WGTRELATION_PriorSibling)) !=
+         NULL) {
+    if (pWidget->GetClassID() == 3811304691) {
+      return pWidget;
+    }
+  }
+  return NULL;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(
+    IFWL_Widget* pRadioButton) {
+  if (pRadioButton->GetStyles() & FWL_WGTSTYLE_Group) {
+    return pRadioButton;
+  }
+  IFWL_Widget* pNext = pRadioButton;
+  while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != NULL) {
+    if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
+      return pNext;
+    }
+  }
+  pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling);
+  if ((pNext->GetStyles() & FWL_WGTSTYLE_Group) &&
+      pNext->GetClassID() == 3811304691) {
+    return pNext;
+  }
+  while ((pNext = GetSiblingRadioButton(pNext, FALSE)) && pNext &&
+         pNext != pRadioButton) {
+    if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
+      return pNext;
+    }
+  }
+  pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
+  if (pNext && (pNext->GetStyles() == FWL_WGTSTYLE_Group) &&
+      pNext->GetClassID() == 3811304691) {
+    return pNext;
+  }
+  return GetSiblingRadioButton(pNext, TRUE);
+}
+void CFWL_WidgetMgr::GetSameGroupRadioButton(IFWL_Widget* pRadioButton,
+                                             CFX_PtrArray& group) {
+  IFWL_Widget* pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
+  if (!pFirst) {
+    pFirst = pRadioButton;
+  }
+  int32_t iGroup = CountRadioButtonGroup(pFirst);
+  if (iGroup < 2) {
+    if (pFirst->GetClassID() == 3811304691) {
+      group.Add(pFirst);
+    }
+    IFWL_Widget* pNext = pFirst;
+    while ((pNext = GetSiblingRadioButton(pNext, TRUE)) != NULL) {
+      group.Add(pNext);
+    }
+    return;
+  }
+  IFWL_Widget* pNext = GetRadioButtonGroupHeader(pRadioButton);
+  do {
+    group.Add(pNext);
+    pNext = GetSiblingRadioButton(pNext, TRUE);
+    if (!pNext) {
+      if (pFirst->GetClassID() == 3811304691) {
+        pNext = pFirst;
+      } else {
+        pNext = GetSiblingRadioButton(pFirst, TRUE);
+      }
+    }
+  } while (pNext && ((pNext->GetStyles() & FWL_WGTSTYLE_Group) == 0));
+}
+IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
+  if ((pParent->GetClassID() == 3521614244) &&
+      (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
+    return pParent;
+  }
+  IFWL_Widget* child =
+      FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
+  while (child) {
+    if ((child->GetClassID() == 3521614244) &&
+        (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
+      return child;
+    }
+    IFWL_Widget* find = GetDefaultButton(child);
+    if (find) {
+      return find;
+    }
+    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+  return NULL;
+}
+void CFWL_WidgetMgr::AddRedrawCounts(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  (pItem->iRedrawCounter)++;
+}
+void CFWL_WidgetMgr::ResetRedrawCounts(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+  pItem->iRedrawCounter = 0;
+}
+CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget* pWidget) {
+  return static_cast<CFWL_WidgetMgrItem*>(m_mapWidgetItem.GetValueAt(pWidget));
+}
+int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
+                                        int32_t* pIndex,
+                                        CFWL_WidgetMgrItem* pItem,
+                                        IFWL_Widget** pWidget) {
+  if (!pParent) {
+    return 0;
+  }
+  int32_t iCount = 0;
+  CFWL_WidgetMgrItem* pChild = pParent->pChild;
+  while (pChild) {
+    iCount++;
+    if (pIndex) {
+      if (*pIndex == 0) {
+        *pWidget = pChild->pWidget;
+        return iCount;
+      }
+      pIndex--;
+    }
+    if (pItem && pItem == pChild) {
+      return iCount - 1;
+    }
+    pChild = pChild->pNext;
+  }
+  if (pIndex) {
+    return 0;
+  } else if (pItem) {
+    return -1;
+  }
+  return iCount - 1;
+}
+FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FALSE;
+  if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) {
+    return FALSE;
+  }
+  FX_DWORD dwStyles = pWidget->GetStyles();
+  return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
+          FWL_WGTSTYLE_OverLapper) ||
+         (dwStyles & FWL_WGTSTYLE_Popup);
+}
+FX_BOOL CFWL_WidgetMgr::IsThreadEnabled() {
+  return !(m_dwCapability & FWL_WGTMGR_DisableThread);
+}
+FX_BOOL CFWL_WidgetMgr::IsFormDisabled() {
+  return m_dwCapability & FWL_WGTMGR_DisableForm;
+}
+FX_BOOL CFWL_WidgetMgr::GetAdapterPopupPos(IFWL_Widget* pWidget,
+                                           FX_FLOAT fMinHeight,
+                                           FX_FLOAT fMaxHeight,
+                                           const CFX_RectF& rtAnchor,
+                                           CFX_RectF& rtPopup) {
+  IFWL_AdapterWidgetMgr* pSDApapter = GetAdapterWidgetMgr();
+  return pSDApapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor,
+                                 rtPopup);
+}
+CFWL_WidgetMgrDelegate::CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr)
+    : m_pWidgetMgr(pWidgetMgr) {}
+FWL_ERR CFWL_WidgetMgrDelegate::OnSetCapability(FX_DWORD dwCapability) {
+  m_pWidgetMgr->m_dwCapability = dwCapability;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return 0;
+  if (!pMessage->m_pDstTarget)
+    return 0;
+  IFWL_Widget* pDstWidget = pMessage->m_pDstTarget;
+  IFWL_NoteThread* pNoteThread = pDstWidget->GetOwnerThread();
+  if (!pNoteThread)
+    return 0;
+  CFWL_NoteDriver* pNoteDriver =
+      static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
+  if (!pNoteDriver)
+    return 0;
+  if (m_pWidgetMgr->IsThreadEnabled()) {
+    pMessage = static_cast<CFWL_Message*>(pMessage->Clone());
+  }
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    pNoteDriver->ProcessMessage(pMessage);
+  } else {
+    pNoteDriver->QueueMessage(pMessage);
+  }
+#if (_FX_OS_ == _FX_MACOSX_)
+  CFWL_NoteLoop* pTopLoop = pNoteDriver->GetTopLoop();
+  if (pTopLoop) {
+    pNoteDriver->UnqueueMessage(pTopLoop);
+  }
+#endif
+  if (m_pWidgetMgr->IsThreadEnabled()) {
+    pMessage->Release();
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
+                                             CFX_Graphics* pGraphics,
+                                             const CFX_Matrix* pMatrix) {
+  if (!pWidget)
+    return FWL_ERR_Indefinite;
+  if (!pGraphics)
+    return FWL_ERR_Indefinite;
+  CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix);
+  CFX_RectF clipCopy;
+  pWidget->GetWidgetRect(clipCopy);
+  clipCopy.left = clipCopy.top = 0;
+  if (bUseOffscreenDirect(pWidget)) {
+    DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
+    return FWL_ERR_Succeeded;
+  }
+  CFX_RectF clipBounds;
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) || \
+    (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_ANDROID_)
+  IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+  pDelegate->OnDrawWidget(pTemp, pMatrix);
+  pGraphics->GetClipRect(clipBounds);
+  clipCopy = clipBounds;
+#elif(_FX_OS_ == _FX_MACOSX_)
+  if (m_pWidgetMgr->IsFormDisabled()) {
+    IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+    pDelegate->OnDrawWidget(pTemp, pMatrix);
+    pGraphics->GetClipRect(clipBounds);
+    clipCopy = clipBounds;
+  } else {
+    clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
+    const_cast<CFX_Matrix*>(pMatrix)->SetIdentity();  // FIXME: const cast.
+#ifdef FWL_UseMacSystemBorder
+#else
+#endif
+    {
+      IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+      pDelegate->OnDrawWidget(pTemp, pMatrix);
+    }
+  }
+#endif
+  if (!m_pWidgetMgr->IsFormDisabled()) {
+    CFX_RectF rtClient;
+    pWidget->GetClientRect(rtClient);
+    clipBounds.Intersect(rtClient);
+  }
+  if (!clipBounds.IsEmpty()) {
+    DrawChild(pWidget, clipBounds, pTemp, pMatrix);
+  }
+  DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
+  m_pWidgetMgr->ResetRedrawCounts(pWidget);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
+                                       const CFX_RectF& rtClip,
+                                       CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  if (!parent)
+    return;
+  FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
+  IFWL_Widget* pNextChild =
+      m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+  while (pNextChild) {
+    IFWL_Widget* child = pNextChild;
+    pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+    if (child->GetStates() & FWL_WGTSTATE_Invisible) {
+      continue;
+    }
+    CFX_RectF rtWidget;
+    child->GetWidgetRect(rtWidget);
+    if (rtWidget.IsEmpty()) {
+      continue;
+    }
+    CFX_Matrix widgetMatrix;
+    CFX_RectF clipBounds(rtWidget);
+    if (!bFormDisable) {
+      child->GetMatrix(widgetMatrix, TRUE);
+    }
+    if (pMatrix) {
+      widgetMatrix.Concat(*pMatrix);
+    }
+    if (!bFormDisable) {
+      widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top);
+      clipBounds.Intersect(rtClip);
+      if (clipBounds.IsEmpty()) {
+        continue;
+      }
+      pGraphics->SaveGraphState();
+      pGraphics->SetClipRect(clipBounds);
+    }
+    widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE);
+    IFWL_WidgetDelegate* pDelegate = child->SetDelegate(NULL);
+    if (pDelegate) {
+      if (m_pWidgetMgr->IsFormDisabled() ||
+          IsNeedRepaint(child, &widgetMatrix, rtClip)) {
+        pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
+      }
+    }
+    if (!bFormDisable) {
+      pGraphics->RestoreGraphState();
+    }
+    DrawChild(child, clipBounds, pGraphics,
+              bFormDisable ? &widgetMatrix : pMatrix);
+    child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+}
+CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
+    IFWL_Widget* pWidget,
+    CFX_Graphics* pGraphics,
+    const CFX_Matrix* pMatrix) {
+  if (!FWL_UseOffscreen(pWidget)) {
+    return pGraphics;
+  }
+  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+  if (!pItem->pOffscreen) {
+    pItem->pOffscreen = new CFX_Graphics;
+    CFX_RectF rect;
+    pWidget->GetWidgetRect(rect);
+    pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height,
+                              FXDIB_Argb);
+  }
+  CFX_RectF rect;
+  pGraphics->GetClipRect(rect);
+  pItem->pOffscreen->SetClipRect(rect);
+  return pItem->pOffscreen;
+}
+void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
+                                             CFX_Graphics* pGraphics,
+                                             CFX_RectF& rtClip,
+                                             const CFX_Matrix* pMatrix) {
+  if (FWL_UseOffscreen(pWidget)) {
+    CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+    pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip,
+                        pMatrix);
+#ifdef _WIN32
+    pItem->pOffscreen->ClearClip();
+#endif
+  }
+  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+  pItem->iRedrawCounter = 0;
+}
+
+#define FWL_NEEDREPAINTHIT_Point 12
+#define FWL_NEEDREPAINTHIT_Piece 3
+struct FWL_NEEDREPAINTHITDATA {
+  CFX_PointF hitPoint;
+  FX_BOOL bNotNeedRepaint;
+  FX_BOOL bNotContainByDirty;
+};
+
+FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
+                                              CFX_Matrix* pMatrix,
+                                              const CFX_RectF& rtDirty) {
+  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+  if (pItem && pItem->iRedrawCounter > 0) {
+    pItem->iRedrawCounter = 0;
+    return TRUE;
+  }
+  CFX_RectF rtWidget;
+  pWidget->GetWidgetRect(rtWidget);
+  rtWidget.left = rtWidget.top = 0;
+  pMatrix->TransformRect(rtWidget);
+  if (!rtWidget.IntersectWith(rtDirty)) {
+    return FALSE;
+  }
+  IFWL_Widget* pChild =
+      FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
+  if (!pChild) {
+    return TRUE;
+  }
+  if (pChild->GetClassID() == 3150298670) {
+    CFX_RectF rtTemp;
+    pChild->GetWidgetRect(rtTemp);
+    if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) {
+      pChild =
+          FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild);
+      if (!pChild) {
+        return TRUE;
+      }
+    }
+  }
+  CFX_RectF rtChilds;
+  rtChilds.Empty();
+  FX_BOOL bChildIntersectWithDirty = FALSE;
+  FX_BOOL bOrginPtIntersectWidthChild = FALSE;
+  FX_BOOL bOrginPtIntersectWidthDirty =
+      rtDirty.Contains(rtWidget.left, rtWidget.top);
+  static FWL_NEEDREPAINTHITDATA hitPoint[FWL_NEEDREPAINTHIT_Point];
+  int32_t iSize = sizeof(FWL_NEEDREPAINTHITDATA);
+  FXSYS_memset(hitPoint, 0, iSize);
+  FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece;
+  FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece;
+  hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left;
+  hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x =
+      hitPoint[10].hitPoint.x = fxPiece + rtWidget.left;
+  hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x =
+      hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left;
+  hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x =
+      rtWidget.width + rtWidget.left;
+  hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top;
+  hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y =
+      hitPoint[5].hitPoint.y = fyPiece + rtWidget.top;
+  hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y =
+      hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top;
+  hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y =
+      rtWidget.height + rtWidget.top;
+  do {
+    CFX_RectF rect;
+    pChild->GetWidgetRect(rect);
+    CFX_RectF r = rect;
+    r.left += rtWidget.left;
+    r.top += rtWidget.top;
+    if (r.IsEmpty()) {
+      continue;
+    }
+    if (r.Contains(rtDirty)) {
+      return FALSE;
+    }
+    if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) {
+      bChildIntersectWithDirty = TRUE;
+    }
+    if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
+      bOrginPtIntersectWidthChild = rect.Contains(0, 0);
+    }
+    if (rtChilds.IsEmpty()) {
+      rtChilds = rect;
+    } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) {
+      rtChilds.Union(rect);
+    }
+    for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
+      if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) {
+        continue;
+      }
+      if (!rtDirty.Contains(hitPoint[i].hitPoint)) {
+        hitPoint[i].bNotContainByDirty = TRUE;
+        continue;
+      }
+      if (r.Contains(hitPoint[i].hitPoint)) {
+        hitPoint[i].bNotNeedRepaint = TRUE;
+      }
+    }
+  } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
+                pChild, FWL_WGTRELATION_NextSibling)) != NULL);
+  if (!bChildIntersectWithDirty) {
+    return TRUE;
+  }
+  if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
+    return TRUE;
+  }
+  if (rtChilds.IsEmpty()) {
+    return TRUE;
+  }
+  int32_t repaintPoint = FWL_NEEDREPAINTHIT_Point;
+  for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
+    if (hitPoint[i].bNotNeedRepaint) {
+      repaintPoint--;
+    }
+  }
+  if (repaintPoint > 0) {
+    return TRUE;
+  }
+  pMatrix->TransformRect(rtChilds);
+  if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) {
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget* pWidget) {
+  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+  if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) {
+    return FALSE;
+  }
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+  if (pItem->bOutsideChanged) {
+    CFX_RectF r;
+    pWidget->GetWidgetRect(r);
+    CFX_RectF temp(m_pWidgetMgr->m_rtScreen);
+    temp.Deflate(50, 50);
+    if (!temp.Contains(r)) {
+      return FALSE;
+    }
+    pItem->bOutsideChanged = FALSE;
+  }
+#endif
+  return pItem->iRedrawCounter == 0;
+}
+static void FWL_WriteBMP(CFX_DIBitmap* pBitmap, const FX_CHAR* filename) {
+  FILE* file = fopen(filename, "wb");
+  if (file == NULL) {
+    return;
+  }
+  int size = 14 + 40 + pBitmap->GetPitch() * pBitmap->GetHeight();
+  unsigned char buffer[40];
+  buffer[0] = 'B';
+  buffer[1] = 'M';
+  buffer[2] = (unsigned char)size;
+  buffer[3] = (unsigned char)(size >> 8);
+  buffer[4] = (unsigned char)(size >> 16);
+  buffer[5] = (unsigned char)(size >> 24);
+  buffer[6] = buffer[7] = buffer[8] = buffer[9] = 0;
+  buffer[10] = 54;
+  buffer[11] = buffer[12] = buffer[13] = 0;
+  fwrite(buffer, 14, 1, file);
+  memset(buffer, 0, 40);
+  buffer[0] = 40;
+  buffer[4] = (unsigned char)pBitmap->GetWidth();
+  buffer[5] = (unsigned char)(pBitmap->GetWidth() >> 8);
+  buffer[6] = (unsigned char)(pBitmap->GetWidth() >> 16);
+  buffer[7] = (unsigned char)(pBitmap->GetWidth() >> 24);
+  buffer[8] = (unsigned char)(-pBitmap->GetHeight());
+  buffer[9] = (unsigned char)((-pBitmap->GetHeight()) >> 8);
+  buffer[10] = (unsigned char)((-pBitmap->GetHeight()) >> 16);
+  buffer[11] = (unsigned char)((-pBitmap->GetHeight()) >> 24);
+  buffer[12] = 1;
+  buffer[14] = pBitmap->GetBPP();
+  fwrite(buffer, 40, 1, file);
+  for (int row = 0; row < pBitmap->GetHeight(); row++) {
+    uint8_t* scan_line = pBitmap->GetBuffer() + row * pBitmap->GetPitch();
+    fwrite(scan_line, pBitmap->GetPitch(), 1, file);
+  }
+  fclose(file);
+}
+FWL_ERR FWL_WidgetMgrSnapshot(IFWL_Widget* pWidget,
+                              const CFX_WideString* saveFile,
+                              const CFX_Matrix* pMatrix) {
+  CFX_RectF r;
+  pWidget->GetWidgetRect(r);
+  CFX_Graphics gs;
+  gs.Create((int32_t)r.width, (int32_t)r.height, FXDIB_Argb);
+  CFWL_WidgetMgr* widgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  CFWL_WidgetMgrDelegate* delegate = widgetMgr->GetDelegate();
+  delegate->OnDrawWidget(pWidget, &gs, pMatrix);
+  CFX_DIBitmap* dib = gs.GetRenderDevice()->GetBitmap();
+  FWL_WriteBMP(dib, saveFile->UTF8Encode());
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL FWL_WidgetIsChild(IFWL_Widget* parent, IFWL_Widget* find) {
+  if (!find) {
+    return FALSE;
+  }
+  IFWL_Widget* child =
+      FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+  while (child) {
+    if (child == find) {
+      return TRUE;
+    }
+    if (FWL_WidgetIsChild(child, find)) {
+      return TRUE;
+    }
+    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+  }
+  return FALSE;
+}
diff --git a/xfa/fwl/core/fwl_widgetmgrimp.h b/xfa/fwl/core/fwl_widgetmgrimp.h
new file mode 100644
index 0000000..c29045d
--- /dev/null
+++ b/xfa/fwl/core/fwl_widgetmgrimp.h
@@ -0,0 +1,170 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_FWL_WIDGETMGRIMP_H_
+#define XFA_FWL_CORE_FWL_WIDGETMGRIMP_H_
+
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+
+class IFWL_Widget;
+class IFWL_AdapterWidgetMgr;
+class CFWL_WidgetMgrDelegate;
+class IFWL_AdapterNative;
+
+class CFWL_WidgetMgrItem {
+ public:
+  CFWL_WidgetMgrItem()
+      : pParent(NULL),
+        pOwner(NULL),
+        pChild(NULL),
+        pPrevious(NULL),
+        pNext(NULL),
+        pWidget(NULL),
+        pOffscreen(NULL),
+        iRedrawCounter(0)
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+        ,
+        bOutsideChanged(FALSE)
+#endif
+  {
+  }
+  ~CFWL_WidgetMgrItem() {
+    if (pOffscreen) {
+      delete pOffscreen;
+      pOffscreen = NULL;
+    }
+  }
+  CFWL_WidgetMgrItem* pParent;
+  CFWL_WidgetMgrItem* pOwner;
+  CFWL_WidgetMgrItem* pChild;
+  CFWL_WidgetMgrItem* pPrevious;
+  CFWL_WidgetMgrItem* pNext;
+  IFWL_Widget* pWidget;
+  CFX_Graphics* pOffscreen;
+  int32_t iRedrawCounter;
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+  FX_BOOL bOutsideChanged;
+#endif
+};
+
+class CFWL_WidgetMgr : public IFWL_WidgetMgr {
+ public:
+  CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative);
+  ~CFWL_WidgetMgr() override;
+
+  // IFWL_WidgetMgr:
+  int32_t CountWidgets(IFWL_Widget* pParent = NULL) override;
+  IFWL_Widget* GetWidget(int32_t nIndex, IFWL_Widget* pParent = NULL) override;
+  IFWL_Widget* GetWidget(IFWL_Widget* pWidget,
+                         FWL_WGTRELATION eRelation) override;
+  int32_t GetWidgetIndex(IFWL_Widget* pWidget) override;
+  FX_BOOL SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) override;
+  FWL_ERR RepaintWidget(IFWL_Widget* pWidget,
+                        const CFX_RectF* pRect = NULL) override;
+  FX_DWORD GetCapability() override { return m_dwCapability; }
+
+  void AddWidget(IFWL_Widget* pWidget);
+  void InsertWidget(IFWL_Widget* pParent,
+                    IFWL_Widget* pChild,
+                    int32_t nIndex = -1);
+  void RemoveWidget(IFWL_Widget* pWidget);
+  void SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned);
+  void SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild);
+  FX_BOOL IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent);
+  FWL_ERR CreateWidget_Native(IFWL_Widget* pWidget);
+  FWL_ERR DestroyWidget_Native(IFWL_Widget* pWidget);
+  FWL_ERR GetWidgetRect_Native(IFWL_Widget* pWidget, CFX_RectF& rect);
+  FWL_ERR SetWidgetRect_Native(IFWL_Widget* pWidget, const CFX_RectF& rect);
+  FWL_ERR SetWidgetPosition_Native(IFWL_Widget* pWidget,
+                                   FX_FLOAT fx,
+                                   FX_FLOAT fy);
+  FWL_ERR SetWidgetIcon_Native(IFWL_Widget* pWidget,
+                               const CFX_DIBitmap* pIcon,
+                               FX_BOOL bBig);
+  FWL_ERR SetWidgetCaption_Native(IFWL_Widget* pWidget,
+                                  const CFX_WideStringC& wsCaption);
+  FWL_ERR SetBorderRegion_Native(IFWL_Widget* pWidget, CFX_Path* pPath);
+  FWL_ERR ShowWidget_Native(IFWL_Widget* pWidget);
+  FWL_ERR HideWidget_Native(IFWL_Widget* pWidget);
+  FWL_ERR SetNormal_Native(IFWL_Widget* pWidget);
+  FWL_ERR SetMaximize_Native(IFWL_Widget* pWidget);
+  FWL_ERR SetMinimize_Native(IFWL_Widget* pWidget);
+  FX_BOOL CheckMessage_Native();
+  FWL_ERR DispatchMessage_Native();
+  FX_BOOL IsIdleMessage_Native();
+  FWL_ERR Exit_Native(int32_t iExitCode);
+  FWL_ERR CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget, void* vp);
+  IFWL_Widget* GetWidgetAtPoint(IFWL_Widget* pParent, FX_FLOAT fx, FX_FLOAT fy);
+  void NotifySizeChanged(IFWL_Widget* pForm, FX_FLOAT fx, FX_FLOAT fy);
+  IFWL_Widget* nextTab(IFWL_Widget* parent, IFWL_Widget* focus, FX_BOOL& bFind);
+  int32_t CountRadioButtonGroup(IFWL_Widget* pFirst);
+  IFWL_Widget* GetSiblingRadioButton(IFWL_Widget* pWidget, FX_BOOL bNext);
+  IFWL_Widget* GetRadioButtonGroupHeader(IFWL_Widget* pRadioButton);
+  void GetSameGroupRadioButton(IFWL_Widget* pRadioButton, CFX_PtrArray& group);
+  IFWL_Widget* GetDefaultButton(IFWL_Widget* pParent);
+  void AddRedrawCounts(IFWL_Widget* pWidget);
+  void ResetRedrawCounts(IFWL_Widget* pWidget);
+  IFWL_AdapterWidgetMgr* GetAdapterWidgetMgr() { return m_pAdapter; }
+  CFWL_WidgetMgrDelegate* GetDelegate() { return m_pDelegate; }
+  CFWL_WidgetMgrItem* GetWidgetMgrItem(IFWL_Widget* pWidget);
+  FX_BOOL IsThreadEnabled();
+  FX_BOOL IsFormDisabled();
+  FX_BOOL GetAdapterPopupPos(IFWL_Widget* pWidget,
+                             FX_FLOAT fMinHeight,
+                             FX_FLOAT fMaxHeight,
+                             const CFX_RectF& rtAnchor,
+                             CFX_RectF& rtPopup);
+
+ protected:
+  int32_t TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
+                          int32_t* pIndex,
+                          CFWL_WidgetMgrItem* pItem,
+                          IFWL_Widget** pWidget = NULL);
+  FX_BOOL IsAbleNative(IFWL_Widget* pWidget);
+  CFX_MapPtrToPtr m_mapWidgetItem;
+  IFWL_AdapterWidgetMgr* m_pAdapter;
+  CFWL_WidgetMgrDelegate* m_pDelegate;
+  friend class CFWL_WidgetMgrDelegate;
+  FX_DWORD m_dwCapability;
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+  CFX_RectF m_rtScreen;
+#endif
+};
+
+class CFWL_WidgetMgrDelegate : public IFWL_WidgetMgrDelegate {
+ public:
+  CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr);
+  ~CFWL_WidgetMgrDelegate() override {}
+
+  // IFWL_WidgetMgrDelegate:
+  FWL_ERR OnSetCapability(
+      FX_DWORD dwCapability = FWL_WGTMGR_DisableThread) override;
+  int32_t OnProcessMessageToForm(CFWL_Message* pMessage) override;
+  FWL_ERR OnDrawWidget(IFWL_Widget* pWidget,
+                       CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix) override;
+
+ protected:
+  void DrawChild(IFWL_Widget* pParent,
+                 const CFX_RectF& rtClip,
+                 CFX_Graphics* pGraphics,
+                 const CFX_Matrix* pMatrix);
+  CFX_Graphics* DrawWidgetBefore(IFWL_Widget* pWidget,
+                                 CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix);
+  void DrawWidgetAfter(IFWL_Widget* pWidget,
+                       CFX_Graphics* pGraphics,
+                       CFX_RectF& rtClip,
+                       const CFX_Matrix* pMatrix);
+  FX_BOOL IsNeedRepaint(IFWL_Widget* pWidget,
+                        CFX_Matrix* pMatrix,
+                        const CFX_RectF& rtDirty);
+  FX_BOOL bUseOffscreenDirect(IFWL_Widget* pWidget);
+
+  CFWL_WidgetMgr* m_pWidgetMgr;
+};
+
+#endif  // XFA_FWL_CORE_FWL_WIDGETMGRIMP_H_
diff --git a/xfa/src/fwl/lightwidget/app.cpp b/xfa/fwl/lightwidget/app.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/app.cpp
rename to xfa/fwl/lightwidget/app.cpp
diff --git a/xfa/src/fwl/lightwidget/barcode.cpp b/xfa/fwl/lightwidget/barcode.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/barcode.cpp
rename to xfa/fwl/lightwidget/barcode.cpp
diff --git a/xfa/fwl/lightwidget/caret.cpp b/xfa/fwl/lightwidget/caret.cpp
new file mode 100644
index 0000000..279ea2d
--- /dev/null
+++ b/xfa/fwl/lightwidget/caret.cpp
@@ -0,0 +1,47 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/lightwidget/caret.h"
+
+#include <memory>
+
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/include/fwl/basewidget/fwl_caret.h"
+#include "xfa/include/fwl/lightwidget/edit.h"
+
+CFWL_Caret* CFWL_Caret::Create() {
+  return new CFWL_Caret;
+}
+FWL_ERR CFWL_Caret::Initialize(const CFWL_WidgetProperties* pProperties) {
+  if (m_pIface)
+    return FWL_ERR_Indefinite;
+  if (pProperties) {
+    *m_pProperties = *pProperties;
+  }
+  std::unique_ptr<IFWL_Caret> pCaret(IFWL_Caret::Create(
+      m_pProperties->MakeWidgetImpProperties(nullptr), nullptr));
+  FWL_ERR ret = pCaret->Initialize();
+  if (ret != FWL_ERR_Succeeded) {
+    return ret;
+  }
+  m_pIface = pCaret.release();
+  CFWL_Widget::Initialize();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_Caret::ShowCaret(FX_BOOL bFlag) {
+  return static_cast<IFWL_Caret*>(m_pIface)->ShowCaret(bFlag);
+}
+FWL_ERR CFWL_Caret::GetFrequency(FX_DWORD& elapse) {
+  return static_cast<IFWL_Caret*>(m_pIface)->GetFrequency(elapse);
+}
+FWL_ERR CFWL_Caret::SetFrequency(FX_DWORD elapse) {
+  return static_cast<IFWL_Caret*>(m_pIface)->SetFrequency(elapse);
+}
+FWL_ERR CFWL_Caret::SetColor(CFX_Color crFill) {
+  return static_cast<IFWL_Caret*>(m_pIface)->SetColor(crFill);
+}
+CFWL_Caret::CFWL_Caret() {}
+CFWL_Caret::~CFWL_Caret() {}
diff --git a/xfa/src/fwl/lightwidget/checkbox.cpp b/xfa/fwl/lightwidget/checkbox.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/checkbox.cpp
rename to xfa/fwl/lightwidget/checkbox.cpp
diff --git a/xfa/src/fwl/lightwidget/combobox.cpp b/xfa/fwl/lightwidget/combobox.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/combobox.cpp
rename to xfa/fwl/lightwidget/combobox.cpp
diff --git a/xfa/fwl/lightwidget/datetimepicker.cpp b/xfa/fwl/lightwidget/datetimepicker.cpp
new file mode 100644
index 0000000..bf1d976
--- /dev/null
+++ b/xfa/fwl/lightwidget/datetimepicker.cpp
@@ -0,0 +1,144 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/lightwidget/datetimepicker.h"
+
+#include <memory>
+
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/core/fwl_error.h"
+#include "xfa/include/fwl/core/fwl_note.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+CFWL_DateTimePicker* CFWL_DateTimePicker::Create() {
+  return new CFWL_DateTimePicker;
+}
+FWL_ERR CFWL_DateTimePicker::Initialize(
+    const CFWL_WidgetProperties* pProperties) {
+  if (m_pIface)
+    return FWL_ERR_Indefinite;
+  if (pProperties) {
+    *m_pProperties = *pProperties;
+  }
+  std::unique_ptr<IFWL_DateTimePicker> pDateTimePicker(
+      IFWL_DateTimePicker::Create(
+          m_pProperties->MakeWidgetImpProperties(&m_DateTimePickerDP),
+          nullptr));
+  FWL_ERR ret = pDateTimePicker->Initialize();
+  if (ret != FWL_ERR_Succeeded) {
+    return ret;
+  }
+  m_pIface = pDateTimePicker.release();
+  CFWL_Widget::Initialize();
+  return FWL_ERR_Succeeded;
+}
+
+FWL_ERR CFWL_DateTimePicker::SetToday(int32_t iYear,
+                                      int32_t iMonth,
+                                      int32_t iDay) {
+  m_DateTimePickerDP.m_iYear = iYear;
+  m_DateTimePickerDP.m_iMonth = iMonth;
+  m_DateTimePickerDP.m_iDay = iDay;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_DateTimePicker::CountSelRanges() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CountSelRanges();
+}
+int32_t CFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)
+      ->GetSelRange(nIndex, nStart);
+}
+FWL_ERR CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetEditText(wsText);
+}
+FWL_ERR CFWL_DateTimePicker::SetEditText(const CFX_WideStringC& wsText) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditText(wsText);
+}
+FWL_ERR CFWL_DateTimePicker::GetCurSel(int32_t& iYear,
+                                       int32_t& iMonth,
+                                       int32_t& iDay) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)
+      ->GetCurSel(iYear, iMonth, iDay);
+}
+FWL_ERR CFWL_DateTimePicker::SetCurSel(int32_t iYear,
+                                       int32_t iMonth,
+                                       int32_t iDay) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)
+      ->SetCurSel(iYear, iMonth, iDay);
+}
+CFWL_DateTimePicker::CFWL_DateTimePicker() {}
+CFWL_DateTimePicker::~CFWL_DateTimePicker() {}
+CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() {
+  m_iYear = 2011;
+  m_iMonth = 1;
+  m_iDay = 1;
+}
+FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(
+    IFWL_Widget* pWidget,
+    CFX_WideString& wsCaption) {
+  wsCaption = m_wsData;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(
+    IFWL_Widget* pWidget,
+    int32_t& iYear,
+    int32_t& iMonth,
+    int32_t& iDay) {
+  iYear = m_iYear;
+  iMonth = m_iMonth;
+  iDay = m_iDay;
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_DateTimePicker::CanUndo() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanUndo();
+}
+FX_BOOL CFWL_DateTimePicker::CanRedo() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanRedo();
+}
+FX_BOOL CFWL_DateTimePicker::Undo() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Undo();
+}
+FX_BOOL CFWL_DateTimePicker::Redo() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Redo();
+}
+FX_BOOL CFWL_DateTimePicker::CanCopy() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCopy();
+}
+FX_BOOL CFWL_DateTimePicker::CanCut() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCut();
+}
+FX_BOOL CFWL_DateTimePicker::CanSelectAll() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanSelectAll();
+}
+FX_BOOL CFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCopy);
+}
+FX_BOOL CFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCut);
+}
+FX_BOOL CFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Paste(wsPaste);
+}
+FX_BOOL CFWL_DateTimePicker::SelectAll() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SelectAll();
+}
+FX_BOOL CFWL_DateTimePicker::Delete() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Delete();
+}
+FX_BOOL CFWL_DateTimePicker::DeSelect() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->DeSelect();
+}
+FWL_ERR CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetBBox(rect);
+}
+FWL_ERR CFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditLimit(nLimit);
+}
+FWL_ERR CFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
+                                                FX_DWORD dwStylesExRemoved) {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface)
+      ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
diff --git a/xfa/src/fwl/lightwidget/edit.cpp b/xfa/fwl/lightwidget/edit.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/edit.cpp
rename to xfa/fwl/lightwidget/edit.cpp
diff --git a/xfa/src/fwl/lightwidget/listbox.cpp b/xfa/fwl/lightwidget/listbox.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/listbox.cpp
rename to xfa/fwl/lightwidget/listbox.cpp
diff --git a/xfa/src/fwl/lightwidget/picturebox.cpp b/xfa/fwl/lightwidget/picturebox.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/picturebox.cpp
rename to xfa/fwl/lightwidget/picturebox.cpp
diff --git a/xfa/src/fwl/lightwidget/pushbutton.cpp b/xfa/fwl/lightwidget/pushbutton.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/pushbutton.cpp
rename to xfa/fwl/lightwidget/pushbutton.cpp
diff --git a/xfa/src/fwl/lightwidget/scrollbar.cpp b/xfa/fwl/lightwidget/scrollbar.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/scrollbar.cpp
rename to xfa/fwl/lightwidget/scrollbar.cpp
diff --git a/xfa/src/fwl/lightwidget/theme.cpp b/xfa/fwl/lightwidget/theme.cpp
similarity index 100%
rename from xfa/src/fwl/lightwidget/theme.cpp
rename to xfa/fwl/lightwidget/theme.cpp
diff --git a/xfa/fwl/lightwidget/tooltipctrl.cpp b/xfa/fwl/lightwidget/tooltipctrl.cpp
new file mode 100644
index 0000000..323eed0
--- /dev/null
+++ b/xfa/fwl/lightwidget/tooltipctrl.cpp
@@ -0,0 +1,111 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/lightwidget/tooltipctrl.h"
+
+#include <memory>
+
+#include "xfa/fwl/core/fwl_formimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_panelimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_threadimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+
+CFWL_ToolTip* CFWL_ToolTip::Create() {
+  return new CFWL_ToolTip;
+}
+FWL_ERR CFWL_ToolTip::Initialize(const CFWL_WidgetProperties* pProperties) {
+  if (m_pIface)
+    return FWL_ERR_Indefinite;
+  if (pProperties) {
+    *m_pProperties = *pProperties;
+  }
+  std::unique_ptr<IFWL_ToolTip> pToolTip(IFWL_ToolTip::Create(
+      m_pProperties->MakeWidgetImpProperties(&m_tooltipData), nullptr));
+  FWL_ERR ret = pToolTip->Initialize();
+  if (ret != FWL_ERR_Succeeded) {
+    return ret;
+  }
+  m_pIface = pToolTip.release();
+  CFWL_Widget::Initialize();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTip::GetCaption(CFX_WideString& wsCaption) {
+  wsCaption = m_tooltipData.m_wsCaption;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTip::SetCaption(const CFX_WideStringC& wsCaption) {
+  m_tooltipData.m_wsCaption = wsCaption;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ToolTip::GetInitialDelay() {
+  return m_tooltipData.m_nInitDelayTime;
+}
+int32_t CFWL_ToolTip::SetInitialDelay(int32_t nDelayTime) {
+  m_tooltipData.m_nInitDelayTime = nDelayTime;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ToolTip::GetAutoPopDelay() {
+  return m_tooltipData.m_nAutoPopDelayTime;
+}
+int32_t CFWL_ToolTip::SetAutoPopDelay(int32_t nDelayTime) {
+  m_tooltipData.m_nAutoPopDelayTime = nDelayTime;
+  return FWL_ERR_Succeeded;
+}
+CFX_DIBitmap* CFWL_ToolTip::GetToolTipIcon() {
+  return m_tooltipData.m_pBitmap;
+}
+FWL_ERR CFWL_ToolTip::SetToolTipIcon(CFX_DIBitmap* pBitmap) {
+  m_tooltipData.m_pBitmap = pBitmap;
+  return FWL_ERR_Succeeded;
+}
+CFX_SizeF CFWL_ToolTip::GetToolTipIconSize() {
+  return m_tooltipData.m_fIconSize;
+}
+FWL_ERR CFWL_ToolTip::SetToolTipIconSize(CFX_SizeF fSize) {
+  m_tooltipData.m_fIconSize = fSize;
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
+  return static_cast<IFWL_ToolTip*>(m_pIface)->SetAnchor(rtAnchor);
+}
+FWL_ERR CFWL_ToolTip::Show() {
+  return static_cast<IFWL_ToolTip*>(m_pIface)->Show();
+}
+FWL_ERR CFWL_ToolTip::Hide() {
+  return static_cast<IFWL_ToolTip*>(m_pIface)->Hide();
+}
+CFWL_ToolTip::CFWL_ToolTip() {}
+CFWL_ToolTip::~CFWL_ToolTip() {}
+CFWL_ToolTip::CFWL_ToolTipDP::CFWL_ToolTipDP() : m_pBitmap(NULL) {
+  m_wsCaption = L"";
+  m_nInitDelayTime = 500;
+  m_nAutoPopDelayTime = 50000;
+  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
+}
+FWL_ERR CFWL_ToolTip::CFWL_ToolTipDP::GetCaption(IFWL_Widget* pWidget,
+                                                 CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_ERR_Succeeded;
+}
+int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
+  return m_nInitDelayTime;
+}
+int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
+  return m_nAutoPopDelayTime;
+}
+CFX_DIBitmap* CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIcon(
+    IFWL_Widget* pWidget) {
+  return m_pBitmap;
+}
+CFX_SizeF CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIconSize(
+    IFWL_Widget* pWidget) {
+  return m_fIconSize;
+}
+CFX_RectF CFWL_ToolTip::CFWL_ToolTipDP::GetAnchor() {
+  return m_fAnchor;
+}
diff --git a/xfa/fwl/lightwidget/widget.cpp b/xfa/fwl/lightwidget/widget.cpp
new file mode 100644
index 0000000..daaab3c
--- /dev/null
+++ b/xfa/fwl/lightwidget/widget.cpp
@@ -0,0 +1,318 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/lightwidget/widget.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/fwl_targetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetmgrimp.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+#include "xfa/include/fwl/core/fwl_thread.h"
+
+CFWL_WidgetImpProperties CFWL_WidgetProperties::MakeWidgetImpProperties(
+    IFWL_DataProvider* pDataProvider) const {
+  CFWL_WidgetImpProperties result;
+  result.m_ctmOnParent = m_ctmOnParent;
+  result.m_rtWidget = m_rtWidget;
+  result.m_dwStyles = m_dwStyles;
+  result.m_dwStyleExes = m_dwStyleExes;
+  result.m_dwStates = m_dwStates;
+  if (m_pParent)
+    result.m_pParent = m_pParent->GetWidget();
+  if (m_pOwner)
+    result.m_pOwner = m_pOwner->GetWidget();
+  result.m_pDataProvider = pDataProvider;
+  return result;
+}
+IFWL_Widget* CFWL_Widget::GetWidget() {
+  return m_pIface;
+}
+FWL_ERR CFWL_Widget::GetClassName(CFX_WideString& wsClass) const {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetClassName(wsClass);
+}
+FX_DWORD CFWL_Widget::GetClassID() const {
+  if (!m_pIface)
+    return 0;
+  return m_pIface->GetClassID();
+}
+FX_BOOL CFWL_Widget::IsInstance(const CFX_WideStringC& wsClass) const {
+  if (!m_pIface)
+    return FALSE;
+  return m_pIface->IsInstance(wsClass);
+}
+static void* gs_pFWLWidget = (void*)FXBSTR_ID('l', 'i', 'g', 't');
+FWL_ERR CFWL_Widget::Initialize(const CFWL_WidgetProperties* pProperties) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetPrivateData(gs_pFWLWidget, this, NULL);
+}
+FWL_ERR CFWL_Widget::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetWidgetRect(rect, bAutoSize);
+}
+FWL_ERR CFWL_Widget::GetGlobalRect(CFX_RectF& rect) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetGlobalRect(rect);
+}
+FWL_ERR CFWL_Widget::SetWidgetRect(const CFX_RectF& rect) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetWidgetRect(rect);
+}
+FWL_ERR CFWL_Widget::GetClientRect(CFX_RectF& rect) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetClientRect(rect);
+}
+CFWL_Widget* CFWL_Widget::GetParent() {
+  if (!m_pIface)
+    return NULL;
+  IFWL_Widget* parent = m_pIface->GetParent();
+  if (parent) {
+    return static_cast<CFWL_Widget*>(parent->GetPrivateData(gs_pFWLWidget));
+  }
+  return NULL;
+}
+FWL_ERR CFWL_Widget::SetParent(CFWL_Widget* pParent) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetParent(pParent ? pParent->GetWidget() : NULL);
+}
+CFWL_Widget* CFWL_Widget::GetOwner() {
+  if (!m_pIface)
+    return NULL;
+  return NULL;
+}
+FWL_ERR CFWL_Widget::SetOwner(CFWL_Widget* pOwner) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return FWL_ERR_Succeeded;
+}
+FX_DWORD CFWL_Widget::GetStyles() {
+  if (!m_pIface)
+    return 0;
+  return m_pIface->GetStyles();
+}
+FWL_ERR CFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded,
+                                  FX_DWORD dwStylesRemoved) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->ModifyStyles(dwStylesAdded, dwStylesRemoved);
+}
+FX_DWORD CFWL_Widget::GetStylesEx() {
+  if (!m_pIface)
+    return 0;
+  return m_pIface->GetStylesEx();
+}
+FWL_ERR CFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded,
+                                    FX_DWORD dwStylesExRemoved) {
+  return m_pIface->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+}
+FX_DWORD CFWL_Widget::GetStates() {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetStates();
+}
+FWL_ERR CFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetStates(dwStates, bSet);
+}
+FWL_ERR CFWL_Widget::SetPrivateData(void* module_id,
+                                    void* pData,
+                                    PD_CALLBACK_FREEDATA callback) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetPrivateData(module_id, pData, callback);
+}
+void* CFWL_Widget::GetPrivateData(void* module_id) {
+  if (!m_pIface)
+    return NULL;
+  return m_pIface->GetPrivateData(module_id);
+}
+FWL_ERR CFWL_Widget::Update() {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->Update();
+}
+FWL_ERR CFWL_Widget::LockUpdate() {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->LockUpdate();
+}
+FWL_ERR CFWL_Widget::UnlockUpdate() {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->UnlockUpdate();
+}
+FX_DWORD CFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pIface)
+    return 0;
+  return m_pIface->HitTest(fx, fy);
+}
+FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget,
+                                 FX_FLOAT& fx,
+                                 FX_FLOAT& fy) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, fx, fy);
+}
+FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget, CFX_RectF& rt) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, rt);
+}
+FWL_ERR CFWL_Widget::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->GetMatrix(matrix, bGlobal);
+}
+FWL_ERR CFWL_Widget::SetMatrix(const CFX_Matrix& matrix) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->SetMatrix(matrix);
+}
+FWL_ERR CFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
+                                const CFX_Matrix* pMatrix) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  return m_pIface->DrawWidget(pGraphics, pMatrix);
+}
+IFWL_WidgetDelegate* CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
+  if (!m_pIface)
+    return NULL;
+  m_pDelegate = m_pIface->SetDelegate(pDelegate);
+  return m_pDelegate;
+}
+CFWL_Widget::CFWL_Widget()
+    : m_pIface(NULL), m_pDelegate(NULL), m_pProperties(NULL) {
+  m_pProperties = new CFWL_WidgetProperties;
+  m_pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+  FXSYS_assert(m_pWidgetMgr != NULL);
+}
+CFWL_Widget::~CFWL_Widget() {
+  delete m_pProperties;
+  if (m_pIface) {
+    m_pIface->Finalize();
+    delete m_pIface;
+  }
+}
+FWL_ERR CFWL_Widget::Repaint(const CFX_RectF* pRect) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  CFX_RectF rect;
+  if (pRect) {
+    rect = *pRect;
+  } else {
+    m_pIface->GetWidgetRect(rect);
+    rect.left = rect.top = 0;
+  }
+  return m_pWidgetMgr->RepaintWidget(m_pIface, &rect);
+}
+FWL_ERR CFWL_Widget::SetFocus(FX_BOOL bFocus) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
+  if (!pThread)
+    return FWL_ERR_Indefinite;
+  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
+  if (!pDriver)
+    return FWL_ERR_Indefinite;
+  if (bFocus) {
+    pDriver->SetFocus(m_pIface);
+  } else {
+    if (pDriver->GetFocus() == m_pIface) {
+      pDriver->SetFocus(NULL);
+    }
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_Widget::SetGrab(FX_BOOL bSet) {
+  if (!m_pIface)
+    return FWL_ERR_Indefinite;
+  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
+  if (!pThread)
+    return FWL_ERR_Indefinite;
+  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
+  if (!pDriver)
+    return FWL_ERR_Indefinite;
+  pDriver->SetGrab(m_pIface, bSet);
+  return FWL_ERR_Succeeded;
+}
+void CFWL_Widget::RegisterEventTarget(CFWL_Widget* pEventSource,
+                                      FX_DWORD dwFilter) {
+  if (!m_pIface)
+    return;
+  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
+  if (!pNoteDriver)
+    return;
+  IFWL_Widget* pEventSourceImp =
+      !pEventSource ? NULL : pEventSource->GetWidget();
+  pNoteDriver->RegisterEventTarget(GetWidget(), pEventSourceImp, dwFilter);
+}
+void CFWL_Widget::DispatchEvent(CFWL_Event* pEvent) {
+  if (!m_pIface)
+    return;
+  if (m_pIface->GetOuter()) {
+    return;
+  }
+  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
+  if (!pThread)
+    return;
+  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
+  if (!pNoteDriver)
+    return;
+  pNoteDriver->SendNote(pEvent);
+}
+#define FWL_WGT_CalcHeight 2048
+#define FWL_WGT_CalcWidth 2048
+#define FWL_WGT_CalcMultiLineDefWidth 120.0f
+CFX_SizeF CFWL_Widget::CalcTextSize(const CFX_WideString& wsText,
+                                    FX_BOOL bMultiLine,
+                                    int32_t iLineWidth) {
+  if (!m_pIface)
+    return CFX_SizeF();
+  IFWL_ThemeProvider* pTheme = m_pIface->GetThemeProvider();
+  if (!pTheme)
+    return CFX_SizeF();
+
+  CFWL_ThemeText calPart;
+  calPart.m_pWidget = m_pIface;
+  calPart.m_wsText = wsText;
+  calPart.m_dwTTOStyles =
+      bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;
+  calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
+  CFX_RectF rect;
+  FX_FLOAT fWidth = bMultiLine
+                        ? (iLineWidth > 0 ? (FX_FLOAT)iLineWidth
+                                          : FWL_WGT_CalcMultiLineDefWidth)
+                        : FWL_WGT_CalcWidth;
+  rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight);
+  pTheme->CalcTextRect(&calPart, rect);
+  return CFX_SizeF(rect.width, rect.height);
+}
+CFWL_WidgetDelegate::CFWL_WidgetDelegate() {}
+CFWL_WidgetDelegate::~CFWL_WidgetDelegate() {}
+int32_t CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  return 1;
+}
+FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                          const CFX_Matrix* pMatrix) {
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/src/fwl/theme/barcodetp.cpp b/xfa/fwl/theme/barcodetp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/barcodetp.cpp
rename to xfa/fwl/theme/barcodetp.cpp
diff --git a/xfa/src/fwl/theme/carettp.cpp b/xfa/fwl/theme/carettp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/carettp.cpp
rename to xfa/fwl/theme/carettp.cpp
diff --git a/xfa/fwl/theme/checkboxtp.cpp b/xfa/fwl/theme/checkboxtp.cpp
new file mode 100644
index 0000000..b65a550
--- /dev/null
+++ b/xfa/fwl/theme/checkboxtp.cpp
@@ -0,0 +1,532 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/theme/checkboxtp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+#define CHECKBOX_SIZE_SIGNMARGIN 3
+#define CHECKBOX_SIZE_SIGNBORDER 2
+#define CHECKBOX_SIZE_SIGNPATH 100
+#define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153))
+#define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100))
+#define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226))
+#define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255))
+#define CHECKBOX_FXGE_CoordinatesAdjust
+
+CFWL_CheckBoxTP::CFWL_CheckBoxTP() : m_pCheckPath(NULL) {
+  m_pThemeData = new CKBThemeData;
+  SetThemeData(0);
+}
+CFWL_CheckBoxTP::~CFWL_CheckBoxTP() {
+  if (m_pThemeData) {
+    delete m_pThemeData;
+    m_pThemeData = NULL;
+  }
+  if (m_pCheckPath) {
+    m_pCheckPath->Clear();
+    delete m_pCheckPath;
+    m_pCheckPath = NULL;
+  }
+}
+FX_BOOL CFWL_CheckBoxTP::IsValidWidget(IFWL_Widget* pWidget) {
+  return pWidget && pWidget->GetClassID() == FWL_CLASSHASH_CheckBox;
+}
+FX_DWORD CFWL_CheckBoxTP::SetThemeID(IFWL_Widget* pWidget,
+                                     FX_DWORD dwThemeID,
+                                     FX_BOOL bChildren) {
+  if (m_pThemeData) {
+    SetThemeData(FWL_GetThemeColor(dwThemeID));
+  }
+  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
+}
+FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText* pParams) {
+  if (!m_pTextOut)
+    return FALSE;
+  m_pTextOut->SetTextColor((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) ==
+                                   FWL_PARTSTATE_CKB_Disabled
+                               ? FWLTHEME_CAPACITY_TextDisColor
+                               : FWLTHEME_CAPACITY_TextColor);
+  return CFWL_WidgetTP::DrawText(pParams);
+}
+FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  if (!pParams)
+    return FALSE;
+  switch (pParams->m_iPart) {
+    case FWL_PART_CKB_Border: {
+      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_CKB_Edge: {
+      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
+               &pParams->m_rtPart, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_CKB_Background: {
+      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
+                     &pParams->m_matrix);
+      if (pParams->m_dwStates & FWL_PARTSTATE_CKB_Focused) {
+        pParams->m_rtPart = *(CFX_RectF*)pParams->m_pData;
+        DrawFocus(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
+      }
+      break;
+    }
+    case FWL_PART_CKB_CheckBox: {
+      DrawBoxBk(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
+                pParams->m_dwStates, &pParams->m_matrix);
+      if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+           FWL_PARTSTATE_CKB_Checked) |
+          ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+           FWL_PARTSTATE_CKB_Neutral)) {
+        DrawSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
+                 pParams->m_dwStates, &pParams->m_matrix);
+      }
+      FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) ==
+                         FWL_PARTSTATE_CKB_Disabled;
+      DrawSignBorder(pParams->m_pWidget, pParams->m_pGraphics,
+                     &pParams->m_rtPart, bDisable, &pParams->m_matrix);
+      break;
+    }
+    default: { return FALSE; }
+  }
+  return TRUE;
+}
+FWL_ERR CFWL_CheckBoxTP::Initialize() {
+  InitTTO();
+  return CFWL_WidgetTP::Initialize();
+}
+FWL_ERR CFWL_CheckBoxTP::Finalize() {
+  FinalizeTTO();
+  return CFWL_WidgetTP::Finalize();
+}
+void CFWL_CheckBoxTP::DrawBoxBk(IFWL_Widget* pWidget,
+                                CFX_Graphics* pGraphics,
+                                const CFX_RectF* pRect,
+                                FX_DWORD dwStates,
+                                CFX_Matrix* pMatrix) {
+  dwStates &= 0x03;
+  int32_t fillMode = FXFILL_WINDING;
+  FX_DWORD dwStyleEx = pWidget->GetStylesEx();
+  dwStyleEx &= FWL_STYLEEXT_CKB_ShapeMask;
+  CFX_Path path;
+  path.Create();
+  FX_FLOAT fRight = pRect->right();
+  FX_FLOAT fBottom = pRect->bottom();
+  FX_BOOL bClipSign =
+      (dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered;
+  if ((dwStyleEx == FWL_STYLEEXT_CKB_ShapeSolidSquare) ||
+      (dwStyleEx == FWL_STYLEEXT_CKB_ShapeSunkenSquare)) {
+    path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+    if (bClipSign) {
+      fillMode = FXFILL_ALTERNATE;
+      path.AddRectangle(pRect->left + CHECKBOX_SIZE_SIGNMARGIN,
+                        pRect->top + CHECKBOX_SIZE_SIGNMARGIN,
+                        pRect->width - CHECKBOX_SIZE_SIGNMARGIN * 2,
+                        pRect->height - CHECKBOX_SIZE_SIGNMARGIN * 2);
+    }
+  } else {
+#ifdef CHECKBOX_FXGE_CoordinatesAdjust
+    CFX_RectF rect(*pRect);
+    rect.Deflate(0, 0, 1, 1);
+    path.AddEllipse(rect);
+#else
+    path.AddEllipse(*pRect);
+#endif
+    if (bClipSign) {
+      fillMode = FXFILL_ALTERNATE;
+#ifdef CHECKBOX_FXGE_CoordinatesAdjust
+      CFX_RectF rtClip(rect);
+#else
+      CFX_RectF rtClip(*pRect);
+#endif
+      rtClip.Deflate(CHECKBOX_SIZE_SIGNMARGIN - 1,
+                     CHECKBOX_SIZE_SIGNMARGIN - 1);
+      path.AddEllipse(rtClip);
+    }
+  }
+  int32_t iTheme = 1;
+  if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered) {
+    iTheme = 2;
+  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) ==
+             FWL_PARTSTATE_CKB_Pressed) {
+    iTheme = 3;
+  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) ==
+             FWL_PARTSTATE_CKB_Disabled) {
+    iTheme = 4;
+  }
+  if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) {
+    iTheme += 4;
+  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+             FWL_PARTSTATE_CKB_Neutral) {
+    iTheme += 8;
+  }
+  DrawAxialShading(pGraphics, pRect->left - 1, pRect->top - 1, fRight, fBottom,
+                   m_pThemeData->clrBoxBk[iTheme][0],
+                   m_pThemeData->clrBoxBk[iTheme][1], &path, fillMode, pMatrix);
+}
+void CFWL_CheckBoxTP::DrawSign(IFWL_Widget* pWidget,
+                               CFX_Graphics* pGraphics,
+                               const CFX_RectF* pRtBox,
+                               FX_DWORD dwStates,
+                               CFX_Matrix* pMatrix) {
+  CFX_RectF rtSign(*pRtBox);
+  rtSign.Deflate(CHECKBOX_SIZE_SIGNMARGIN, CHECKBOX_SIZE_SIGNMARGIN);
+  FX_DWORD dwColor = m_pThemeData->clrSignCheck;
+  FX_BOOL bCheck = TRUE;
+  if (((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled) &&
+      ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked)) {
+    dwColor = m_pThemeData->clrSignBorderDisable;
+  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+             FWL_PARTSTATE_CKB_Neutral) {
+    switch (dwStates & FWL_PARTSTATE_CKB_Mask1) {
+      case FWL_PARTSTATE_CKB_Normal: {
+        bCheck = FALSE;
+        dwColor = m_pThemeData->clrSignNeutralNormal;
+        break;
+      }
+      case FWL_PARTSTATE_CKB_Hovered: {
+        bCheck = FALSE;
+        dwColor = m_pThemeData->clrSignNeutralHover;
+        break;
+      }
+      case FWL_PARTSTATE_CKB_Pressed: {
+        bCheck = FALSE, dwColor = m_pThemeData->clrSignNeutralPressed;
+        break;
+      }
+      case FWL_PARTSTATE_CKB_Disabled: {
+        bCheck = FALSE, dwColor = m_pThemeData->clrSignBorderDisable;
+        break;
+      }
+    }
+  }
+  if (bCheck) {
+    FX_DWORD dwStyle = pWidget->GetStylesEx();
+    switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) {
+      case FWL_STYLEEXT_CKB_SignShapeCheck: {
+        DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+      case FWL_STYLEEXT_CKB_SignShapeCircle: {
+        rtSign.Deflate(1, 1);
+        DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+      case FWL_STYLEEXT_CKB_SignShapeCross: {
+        DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+      case FWL_STYLEEXT_CKB_SignShapeDiamond: {
+        DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+      case FWL_STYLEEXT_CKB_SignShapeSquare: {
+        DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+      case FWL_STYLEEXT_CKB_SignShapeStar: {
+        DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      }
+    }
+  } else {
+    FillSoildRect(pGraphics, ArgbEncode(255, 33, 161, 33), &rtSign, pMatrix);
+  }
+}
+void CFWL_CheckBoxTP::DrawSignNeutral(CFX_Graphics* pGraphics,
+                                      const CFX_RectF* pRtSign,
+                                      CFX_Matrix* pMatrix) {
+  ((CFX_RectF*)pRtSign)->Inflate(-3, -3);
+  FillSoildRect(pGraphics, m_pThemeData->clrSignNeutral, pRtSign, pMatrix);
+}
+void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics* pGraphics,
+                                    const CFX_RectF* pRtSign,
+                                    FX_ARGB argbFill,
+                                    CFX_Matrix* pMatrix) {
+  if (!m_pCheckPath) {
+    initCheckPath(pRtSign->width);
+  }
+  CFX_Matrix mt;
+  mt.SetIdentity();
+  mt.Translate(pRtSign->left, pRtSign->top);
+  mt.Concat(*pMatrix);
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(m_pCheckPath, FXFILL_WINDING, &mt);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignCircle(CFX_Graphics* pGraphics,
+                                     const CFX_RectF* pRtSign,
+                                     FX_ARGB argbFill,
+                                     CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  path.AddEllipse(*pRtSign);
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignCross(CFX_Graphics* pGraphics,
+                                    const CFX_RectF* pRtSign,
+                                    FX_ARGB argbFill,
+                                    CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  FX_FLOAT fRight = pRtSign->right();
+  FX_FLOAT fBottom = pRtSign->bottom();
+  path.AddLine(pRtSign->left, pRtSign->top, fRight, fBottom);
+  path.AddLine(pRtSign->left, fBottom, fRight, pRtSign->top);
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetStrokeColor(&crFill);
+  pGraphics->SetLineWidth(1.0f);
+  pGraphics->StrokePath(&path, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignDiamond(CFX_Graphics* pGraphics,
+                                      const CFX_RectF* pRtSign,
+                                      FX_ARGB argbFill,
+                                      CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  FX_FLOAT fWidth = pRtSign->width;
+  FX_FLOAT fHeight = pRtSign->height;
+  FX_FLOAT fBottom = pRtSign->bottom();
+  path.MoveTo(pRtSign->left + fWidth / 2, pRtSign->top);
+  path.LineTo(pRtSign->left, pRtSign->top + fHeight / 2);
+  path.LineTo(pRtSign->left + fWidth / 2, fBottom);
+  path.LineTo(pRtSign->right(), pRtSign->top + fHeight / 2);
+  path.LineTo(pRtSign->left + fWidth / 2, pRtSign->top);
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignSquare(CFX_Graphics* pGraphics,
+                                     const CFX_RectF* pRtSign,
+                                     FX_ARGB argbFill,
+                                     CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(pRtSign->left, pRtSign->top, pRtSign->width,
+                    pRtSign->height);
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignStar(CFX_Graphics* pGraphics,
+                                   const CFX_RectF* pRtSign,
+                                   FX_ARGB argbFill,
+                                   CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  FX_FLOAT fBottom = pRtSign->bottom();
+  FX_FLOAT fRadius =
+      (pRtSign->top - fBottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f));
+  CFX_PointF ptCenter((pRtSign->left + pRtSign->right()) / 2.0f,
+                      (pRtSign->top + fBottom) / 2.0f);
+  FX_FLOAT px[5], py[5];
+  FX_FLOAT fAngel = FX_PI / 10.0f;
+  for (int32_t i = 0; i < 5; i++) {
+    px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
+    py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
+    fAngel += FX_PI * 2 / 5.0f;
+  }
+  path.MoveTo(px[0], py[0]);
+  int32_t nNext = 0;
+  for (int32_t j = 0; j < 5; j++) {
+    nNext += 2;
+    if (nNext >= 5) {
+      nNext -= 5;
+    }
+    path.LineTo(px[nNext], py[nNext]);
+  }
+  CFX_Color crFill(argbFill);
+  pGraphics->SaveGraphState();
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_CheckBoxTP::DrawSignBorder(IFWL_Widget* pWidget,
+                                     CFX_Graphics* pGraphics,
+                                     const CFX_RectF* pRtBox,
+                                     FX_BOOL bDisable,
+                                     CFX_Matrix* pMatrix) {
+  switch (pWidget->GetStylesEx() & FWL_STYLEEXT_CKB_ShapeMask) {
+    case FWL_STYLEEXT_CKB_ShapeSolidSquare: {
+      DrawAnnulusRect(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable
+                                          : m_pThemeData->clrSignBorderNormal,
+                      pRtBox, 1, pMatrix);
+      break;
+    }
+    case FWL_STYLEEXT_CKB_ShapeSunkenSquare: {
+      Draw3DRect(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER,
+                 pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2,
+                 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix);
+      break;
+    }
+    case FWL_STYLEEXT_CKB_ShapeSolidCircle: {
+      DrawAnnulusCircle(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable
+                                            : m_pThemeData->clrSignBorderNormal,
+                        pRtBox, 1, pMatrix);
+      break;
+    }
+    case FWL_STYLEEXT_CKB_ShapeSunkenCircle: {
+      Draw3DCircle(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER,
+                   pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2,
+                   CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix);
+      break;
+    }
+  }
+}
+void CFWL_CheckBoxTP::SetThemeData(FX_DWORD dwID) {
+  FX_DWORD* pData = (FX_DWORD*)&m_pThemeData->clrBoxBk;
+  if (dwID) {
+    *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255);
+    m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 154, 167, 114);
+    m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187);
+    m_pThemeData->clrSignCheck = ArgbEncode(255, 164, 180, 138);
+    m_pThemeData->clrSignNeutral = ArgbEncode(2255, 28, 134, 26);
+    m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113);
+    m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33);
+    m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26);
+  } else {
+    *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 220, 220, 215),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 240, 207),
+    *pData++ = ArgbEncode(255, 248, 179, 48),
+    *pData++ = ArgbEncode(255, 176, 176, 167),
+    *pData++ = ArgbEncode(255, 241, 239, 239),
+    *pData++ = ArgbEncode(255, 255, 255, 255),
+    *pData++ = ArgbEncode(255, 255, 255, 255);
+    m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 28, 81, 128);
+    m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187);
+    m_pThemeData->clrSignCheck = ArgbEncode(255, 28, 81, 128);
+    m_pThemeData->clrSignNeutral = ArgbEncode(255, 28, 134, 26);
+    m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113);
+    m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33);
+    m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26);
+  }
+}
+void CFWL_CheckBoxTP::initCheckPath(FX_FLOAT fCheckLen) {
+  if (!m_pCheckPath) {
+    m_pCheckPath = new CFX_Path;
+    m_pCheckPath->Create();
+    FX_FLOAT fWidth = CHECKBOX_SIZE_SIGNPATH;
+    FX_FLOAT fHeight = -CHECKBOX_SIZE_SIGNPATH;
+    FX_FLOAT fBottom = CHECKBOX_SIZE_SIGNPATH;
+    CFX_PointF pt1(fWidth / 15.0f, fBottom + fHeight * 2 / 5.0f);
+    CFX_PointF pt2(fWidth / 4.5f, fBottom + fHeight / 16.0f);
+    CFX_PointF pt3(fWidth / 3.0f, fBottom);
+    CFX_PointF pt4(fWidth * 14 / 15.0f, fBottom + fHeight * 15 / 16.0f);
+    CFX_PointF pt5(fWidth / 3.6f, fBottom + fHeight / 3.5f);
+    CFX_PointF pt12(fWidth / 7.0f, fBottom + fHeight * 2 / 7.0f);
+    CFX_PointF pt21(fWidth / 5.0f, fBottom + fHeight / 5.0f);
+    CFX_PointF pt23(fWidth / 4.4f, fBottom + fHeight * 0 / 16.0f);
+    CFX_PointF pt32(fWidth / 4.0f, fBottom);
+    CFX_PointF pt34(fWidth * (1 / 7.0f + 7 / 15.0f),
+                    fBottom + fHeight * 4 / 5.0f);
+    CFX_PointF pt43(fWidth * (1 / 7.0f + 7 / 15.0f),
+                    fBottom + fHeight * 4 / 5.0f);
+    CFX_PointF pt45(fWidth * 7 / 15.0f, fBottom + fHeight * 8 / 7.0f);
+    CFX_PointF pt54(fWidth / 3.4f, fBottom + fHeight / 3.5f);
+    CFX_PointF pt51(fWidth / 3.6f, fBottom + fHeight / 4.0f);
+    CFX_PointF pt15(fWidth / 3.5f, fBottom + fHeight * 3.5f / 5.0f);
+    m_pCheckPath->MoveTo(pt1.x, pt1.y);
+    FX_FLOAT px1 = pt12.x - pt1.x;
+    FX_FLOAT py1 = pt12.y - pt1.y;
+    FX_FLOAT px2 = pt21.x - pt2.x;
+    FX_FLOAT py2 = pt21.y - pt2.y;
+    m_pCheckPath->BezierTo(pt1.x + px1 * FWLTHEME_BEZIER,
+                           pt1.y + py1 * FWLTHEME_BEZIER,
+                           pt2.x + px2 * FWLTHEME_BEZIER,
+                           pt2.y + py2 * FWLTHEME_BEZIER, pt2.x, pt2.y);
+    px1 = pt23.x - pt2.x;
+    py1 = pt23.y - pt2.y;
+    px2 = pt32.x - pt3.x;
+    py2 = pt32.y - pt3.y;
+    m_pCheckPath->BezierTo(pt2.x + px1 * FWLTHEME_BEZIER,
+                           pt2.y + py1 * FWLTHEME_BEZIER,
+                           pt3.x + px2 * FWLTHEME_BEZIER,
+                           pt3.y + py2 * FWLTHEME_BEZIER, pt3.x, pt3.y);
+    px1 = pt34.x - pt3.x;
+    py1 = pt34.y - pt3.y;
+    px2 = pt43.x - pt4.x;
+    py2 = pt43.y - pt4.y;
+    m_pCheckPath->BezierTo(pt3.x + px1 * FWLTHEME_BEZIER,
+                           pt3.y + py1 * FWLTHEME_BEZIER,
+                           pt4.x + px2 * FWLTHEME_BEZIER,
+                           pt4.y + py2 * FWLTHEME_BEZIER, pt4.x, pt4.y);
+    px1 = pt45.x - pt4.x;
+    py1 = pt45.y - pt4.y;
+    px2 = pt54.x - pt5.x;
+    py2 = pt54.y - pt5.y;
+    m_pCheckPath->BezierTo(pt4.x + px1 * FWLTHEME_BEZIER,
+                           pt4.y + py1 * FWLTHEME_BEZIER,
+                           pt5.x + px2 * FWLTHEME_BEZIER,
+                           pt5.y + py2 * FWLTHEME_BEZIER, pt5.x, pt5.y);
+    px1 = pt51.x - pt5.x;
+    py1 = pt51.y - pt5.y;
+    px2 = pt15.x - pt1.x;
+    py2 = pt15.y - pt1.y;
+    m_pCheckPath->BezierTo(pt5.x + px1 * FWLTHEME_BEZIER,
+                           pt5.y + py1 * FWLTHEME_BEZIER,
+                           pt1.x + px2 * FWLTHEME_BEZIER,
+                           pt1.y + py2 * FWLTHEME_BEZIER, pt1.x, pt1.y);
+    FX_FLOAT fScale = fCheckLen / CHECKBOX_SIZE_SIGNPATH;
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, 0, 0);
+    mt.Scale(fScale, fScale);
+    CFX_PathData* pData = m_pCheckPath->GetPathData();
+    pData->Transform(&mt);
+  }
+}
diff --git a/xfa/src/fwl/theme/comboboxtp.cpp b/xfa/fwl/theme/comboboxtp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/comboboxtp.cpp
rename to xfa/fwl/theme/comboboxtp.cpp
diff --git a/xfa/src/fwl/theme/datetimepickertp.cpp b/xfa/fwl/theme/datetimepickertp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/datetimepickertp.cpp
rename to xfa/fwl/theme/datetimepickertp.cpp
diff --git a/xfa/src/fwl/theme/edittp.cpp b/xfa/fwl/theme/edittp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/edittp.cpp
rename to xfa/fwl/theme/edittp.cpp
diff --git a/xfa/fwl/theme/formtp.cpp b/xfa/fwl/theme/formtp.cpp
new file mode 100644
index 0000000..5f75535
--- /dev/null
+++ b/xfa/fwl/theme/formtp.cpp
@@ -0,0 +1,893 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/theme/formtp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/include/fwl/core/fwl_form.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+#define FWLTHEME_CAPACITY_CXFormBorder 3
+#define FWLTHEME_CAPACITY_CYFormBorder 3
+#define FWLTHEME_CAPACITY_CYNarrowCaption 18
+#define FWLTHEME_CAPACITY_CYCaption 29
+#define FWLTHEME_CAPACITY_BigIconSize 32
+#define FWLTHEME_CAPACITY_SmallIconSize 16
+#define FWLTHEME_CAPACITY_FormTextColor 0xFFFFFFFF
+#define FWLTHEME_FORMBTN_Margin 5
+#define FWLTHEME_FORMBTN_Span 2
+#define FWLTHEME_FORMBTN_Size 21
+
+CFWL_FormTP::CFWL_FormTP() : m_pActiveBitmap(NULL), m_pDeactivebitmap(NULL) {
+  m_pThemeData = new SBThemeData;
+  SetThemeData(0);
+  m_rtDisLBorder.Reset();
+  m_rtDisRBorder.Reset();
+  m_rtDisBBorder.Reset();
+  m_rtDisCaption.Reset();
+}
+CFWL_FormTP::~CFWL_FormTP() {
+  if (m_pThemeData) {
+    delete m_pThemeData;
+    m_pThemeData = NULL;
+  }
+}
+FWL_ERR CFWL_FormTP::Initialize() {
+  InitTTO();
+  InitCaption(TRUE);
+  InitCaption(FALSE);
+  return CFWL_WidgetTP::Initialize();
+}
+FWL_ERR CFWL_FormTP::Finalize() {
+  FinalizeTTO();
+  if (m_pActiveBitmap) {
+    delete m_pActiveBitmap;
+    m_pActiveBitmap = NULL;
+  }
+  if (m_pDeactivebitmap) {
+    delete m_pDeactivebitmap;
+    m_pDeactivebitmap = NULL;
+  }
+  return CFWL_WidgetTP::Finalize();
+}
+FX_BOOL CFWL_FormTP::IsValidWidget(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FALSE;
+  FX_DWORD dwHash = pWidget->GetClassID();
+  return dwHash == FWL_CLASSHASH_Form;
+}
+FX_DWORD CFWL_FormTP::SetThemeID(IFWL_Widget* pWidget,
+                                 FX_DWORD dwThemeID,
+                                 FX_BOOL bChildren) {
+  if (m_pThemeData) {
+    SetThemeData(FWL_GetThemeColor(dwThemeID));
+  }
+  InitCaption(TRUE);
+  InitCaption(FALSE);
+  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
+}
+FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  if (!pParams)
+    return FALSE;
+  int32_t iActive = 0;
+  if (pParams->m_dwStates & FWL_PARTSTATE_FRM_Inactive) {
+    iActive = 1;
+  }
+  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
+  switch (pParams->m_dwStates & 0x03) {
+    case FWL_PARTSTATE_FRM_Hover: {
+      eState = FWLTHEME_STATE_Hover;
+      break;
+    }
+    case FWL_PARTSTATE_FRM_Pressed: {
+      eState = FWLTHEME_STATE_Pressed;
+      break;
+    }
+    case FWL_PARTSTATE_FRM_Disabled: {
+      eState = FWLTHEME_STATE_Disabale;
+      break;
+    }
+    default: {}
+  }
+  switch (pParams->m_iPart) {
+    case FWL_PART_FRM_Border: {
+      DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                     &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_Edge: {
+      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
+               &pParams->m_rtPart, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_FRM_Background: {
+      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
+                     &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_FRM_Caption: {
+      DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                  &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_NarrowCaption: {
+      DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                        &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_CloseBox: {
+      DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                   &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_MinimizeBox: {
+      DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                      &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_MaximizeBox: {
+      DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
+                      pParams->m_dwData, &pParams->m_matrix, iActive);
+      break;
+    }
+    case FWL_PART_FRM_Icon: {
+      DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart,
+                    eState, &pParams->m_matrix, iActive);
+      break;
+    }
+    default: {}
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText* pParams) {
+  if (!m_pTextOut)
+    return FALSE;
+  if (pParams->m_iPart == FWL_PART_FRM_Caption) {
+    m_pTextOut->SetTextColor(0xFFFFFFFF);
+  } else {
+    m_pTextOut->SetTextColor(0xFF000000);
+  }
+  return CFWL_WidgetTP::DrawText(pParams);
+}
+void* CFWL_FormTP::GetCapacity(CFWL_ThemePart* pThemePart,
+                               FX_DWORD dwCapacity) {
+  FX_BOOL bDefPro = FALSE;
+  FX_BOOL bDwordVal = FALSE;
+  switch (dwCapacity) {
+    case FWL_WGTCAPACITY_CXBorder: {
+      m_fValue = FWLTHEME_CAPACITY_CXFormBorder;
+      break;
+    }
+    case FWL_WGTCAPACITY_CYBorder: {
+      m_fValue = FWLTHEME_CAPACITY_CYFormBorder;
+      break;
+    }
+    case FWL_WGTCAPACITY_FRM_CYCaption: {
+      m_fValue = FWLTHEME_CAPACITY_CYCaption;
+      break;
+    }
+    case FWL_WGTCAPACITY_FRM_CYNarrowCaption: {
+      m_fValue = FWLTHEME_CAPACITY_CYCaption;
+      break;
+    }
+    case FWL_WGTCAPACITY_TextColor: {
+      bDwordVal = TRUE;
+      m_dwValue = FWLTHEME_CAPACITY_FormTextColor;
+      break;
+    }
+    case FWL_WGTCAPACITY_FRM_BigIcon: {
+      m_fValue = FWLTHEME_CAPACITY_BigIconSize;
+      break;
+    }
+    case FWL_WGTCAPACITY_FRM_SmallIcon: {
+      m_fValue = FWLTHEME_CAPACITY_SmallIconSize;
+      break;
+    }
+    default: { bDefPro = TRUE; }
+  }
+  if (!bDefPro) {
+    if (bDwordVal) {
+      return &m_dwValue;
+    }
+    return &m_fValue;
+  }
+  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
+}
+FWL_ERR CFWL_FormTP::GetPartRect(CFWL_ThemePart* pThemePart,
+                                 CFX_RectF& rtPart) {
+  switch (pThemePart->m_iPart) {
+    case FWL_PART_FRM_CloseBox: {
+      CalCloseBox(pThemePart->m_pWidget, rtPart);
+      break;
+    }
+    case FWL_PART_FRM_MaximizeBox: {
+      CalMaxBox(pThemePart->m_pWidget, rtPart);
+      break;
+    }
+    case FWL_PART_FRM_MinimizeBox: {
+      CalMinBox(pThemePart->m_pWidget, rtPart);
+      break;
+    }
+    case FWL_PART_FRM_HeadText: {
+      CalCaption(pThemePart->m_pWidget, rtPart);
+      break;
+    }
+    case FWL_PART_FRM_Icon: {
+      CalIcon(pThemePart->m_pWidget, rtPart);
+      break;
+    }
+    default: {}
+  }
+  return FWL_ERR_Succeeded;
+}
+void CFWL_FormTP::CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
+  FX_DWORD dwStyles = pWidget->GetStyles();
+  CFX_RectF rtWidget;
+  pWidget->GetWidgetRect(rtWidget);
+  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
+  if (dwStyles & FWL_WGTSTYLE_CloseBox) {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
+             FWLTHEME_FORMBTN_Size);
+  } else {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
+  }
+}
+void CFWL_FormTP::CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
+  FX_DWORD dwStyles = pWidget->GetStyles();
+  CFX_RectF rtWidget;
+  pWidget->GetWidgetRect(rtWidget);
+  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
+  if (dwStyles & FWL_WGTSTYLE_MaximizeBox) {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
+                 FWLTHEME_FORMBTN_Span * 2,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
+             FWLTHEME_FORMBTN_Size);
+  } else {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
+                 FWLTHEME_FORMBTN_Span * 2,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
+  }
+}
+void CFWL_FormTP::CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
+  FX_DWORD dwStyles = pWidget->GetStyles();
+  CFX_RectF rtWidget;
+  pWidget->GetWidgetRect(rtWidget);
+  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
+  if (dwStyles & FWL_WGTSTYLE_MinimizeBox) {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
+                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
+             FWLTHEME_FORMBTN_Size);
+  } else {
+    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
+                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
+             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
+  }
+}
+void CFWL_FormTP::CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect) {
+  CFX_RectF rtWidget;
+  pWidget->GetWidgetRect(rtWidget);
+  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
+  rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin,
+           rtWidget.top + FWLTHEME_FORMBTN_Margin - 2,
+           rtWidget.width - FWLTHEME_FORMBTN_Margin * 2,
+           FWLTHEME_FORMBTN_Size + 2 * FWLTHEME_FORMBTN_Margin + 4);
+}
+void CFWL_FormTP::CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect) {}
+void CFWL_FormTP::DrawFormBorder(CFX_Graphics* pGraphics,
+                                 const CFX_RectF* pRect,
+                                 FWLTHEME_STATE eState,
+                                 CFX_Matrix* pMatrix,
+                                 int32_t iActive) {
+  CFX_RectF rt;
+  rt.Set(pRect->left, pRect->top, 1, pRect->height);
+  FX_FLOAT fBottom, fRight;
+  fBottom = pRect->bottom();
+  fRight = pRect->right();
+  CFX_Path path;
+  path.Create();
+  CFX_Color clrLine;
+  path.Clear();
+  path.MoveTo(pRect->left, pRect->top);
+  path.LineTo(pRect->left, fBottom - 1);
+  path.LineTo(fRight - 1, fBottom - 1);
+  path.LineTo(fRight - 1, pRect->top);
+  clrLine = m_pThemeData->clrFormBorder[iActive][2];
+  pGraphics->SetStrokeColor(&clrLine);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.Clear();
+  path.MoveTo(pRect->left + 1, pRect->top);
+  path.LineTo(pRect->left + 1, fBottom - 2);
+  path.LineTo(fRight - 2, fBottom - 2);
+  path.LineTo(fRight - 2, pRect->top);
+  clrLine = m_pThemeData->clrFormBorder[iActive][1];
+  pGraphics->SetStrokeColor(&clrLine);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.Clear();
+  path.MoveTo(pRect->left + 2, pRect->top);
+  path.LineTo(pRect->left + 2, fBottom - 3);
+  path.LineTo(fRight - 3, fBottom - 3);
+  path.LineTo(fRight - 3, pRect->top);
+  clrLine = m_pThemeData->clrFormBorder[iActive][0];
+  pGraphics->SetStrokeColor(&clrLine);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.Clear();
+  path.MoveTo(pRect->left + 3, pRect->top);
+  path.LineTo(pRect->left + 3, fBottom - 4);
+  path.LineTo(fRight - 4, fBottom - 4);
+  path.LineTo(fRight - 4, pRect->top);
+  clrLine = m_pThemeData->clrFormBorder[iActive][4];
+  pGraphics->SetStrokeColor(&clrLine);
+  pGraphics->StrokePath(&path, pMatrix);
+  m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29);
+  m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4,
+                     pRect->height - 29);
+  m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4);
+  m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29);
+}
+void CFWL_FormTP::DrawCaption(CFX_Graphics* pGraphics,
+                              const CFX_RectF* pRect,
+                              FWLTHEME_STATE eState,
+                              CFX_Matrix* pMatrix,
+                              int32_t iActive) {
+  CFX_RectF rt;
+  FX_FLOAT fBottom, fRight;
+  fBottom = pRect->bottom();
+  fRight = pRect->right();
+  rt.Set(pRect->left, pRect->top, pRect->width, 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt,
+                pMatrix);
+  rt.Offset(0, 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt,
+                pMatrix);
+  rt.Offset(0, 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt,
+                pMatrix);
+  rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt,
+                pMatrix);
+  rt.Offset(0, -1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt,
+                pMatrix);
+  rt.Set(pRect->left, pRect->top, 1, pRect->height);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt,
+                pMatrix);
+  rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt,
+                pMatrix);
+  rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt,
+                pMatrix);
+  rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt,
+                pMatrix);
+  rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt,
+                pMatrix);
+  rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2);
+  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt,
+                pMatrix);
+  CFX_RectF rect(*pRect);
+  rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5);
+  if (iActive == 0) {
+    pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix);
+  } else {
+    pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix);
+  }
+}
+void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics* pGraphics,
+                                    const CFX_RectF* pRect,
+                                    FWLTHEME_STATE eState,
+                                    CFX_Matrix* pMatrix,
+                                    int32_t iActive) {}
+void CFWL_FormTP::DrawCloseBox(CFX_Graphics* pGraphics,
+                               const CFX_RectF* pRect,
+                               FWLTHEME_STATE eState,
+                               CFX_Matrix* pMatrix,
+                               int32_t iActive) {
+  FX_FLOAT fRight = pRect->right();
+  FX_FLOAT fBottom = pRect->bottom();
+  FX_FLOAT fWidth = pRect->width;
+  FX_FLOAT fHeight = pRect->height;
+  pGraphics->SaveGraphState();
+  CFX_RectF rt(*pRect);
+  pGraphics->SetLineWidth(1.0f);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
+  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
+  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
+  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
+  CFX_Color crFill;
+  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
+  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
+  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
+  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
+  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
+  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
+  crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
+  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
+  crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
+  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
+                   fBottom - 2,
+                   m_pThemeData->clrCloseBtBKStart[iActive][eState - 1],
+                   m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], &path,
+                   FXFILL_WINDING, pMatrix);
+  CFX_RectF rtX(*pRect);
+  rtX.Inflate(-5, -5);
+  path.Clear();
+  FX_FLOAT frtXRight = rtX.right();
+  FX_FLOAT frtXBottom = rtX.bottom();
+  path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom);
+  path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom);
+  path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1);
+  path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top);
+  path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top);
+  path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1);
+  CFX_Color clrLine(0xffffffff);
+  pGraphics->SetLineWidth(1.0f);
+  pGraphics->SetStrokeColor(&clrLine);
+  pGraphics->StrokePath(&path, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
+                                      const CFX_RectF* pRect,
+                                      FWLTHEME_STATE eState,
+                                      CFX_Matrix* pMatrix,
+                                      int32_t iActive) {
+  pGraphics->SaveGraphState();
+  FX_FLOAT fRight = pRect->right();
+  FX_FLOAT fBottom = pRect->bottom();
+  FX_FLOAT fWidth = pRect->width;
+  FX_FLOAT fHeight = pRect->height;
+  CFX_RectF rt(*pRect);
+  pGraphics->SetLineWidth(1.0f);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
+  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
+  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
+  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
+  CFX_Color crFill;
+  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
+  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
+  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
+  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
+  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
+  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
+  crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  path.Clear();
+  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
+  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
+  crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1];
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+  path.Clear();
+  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
+  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
+                   fBottom - 2,
+                   m_pThemeData->clrNormalBtBKStart[iActive][eState - 1],
+                   m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], &path,
+                   FXFILL_WINDING, pMatrix);
+}
+void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics* pGraphics,
+                                  const CFX_RectF* pRect,
+                                  FWLTHEME_STATE eState,
+                                  CFX_Matrix* pMatrix,
+                                  int32_t iActive) {
+  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
+  CFX_RectF rtMin;
+  rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14,
+            pRect->height - 18);
+  FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix);
+}
+void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics* pGraphics,
+                                  const CFX_RectF* pRect,
+                                  FWLTHEME_STATE eState,
+                                  FX_BOOL bMax,
+                                  CFX_Matrix* pMatrix,
+                                  int32_t iActive) {
+  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
+  FX_FLOAT fWidth = pRect->width;
+  FX_FLOAT fHeight = pRect->height;
+  if (bMax) {
+    CFX_Path path;
+    path.Create();
+    path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14,
+                 pRect->top + 6);
+    path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11,
+                 pRect->top + 9);
+    pGraphics->SaveGraphState();
+    pGraphics->SetLineWidth(2);
+    CFX_Color crStroke(0xFFFFFFFF);
+    pGraphics->SetStrokeColor(&crStroke);
+    pGraphics->StrokePath(&path, pMatrix);
+    pGraphics->SetLineWidth(1);
+    path.Clear();
+    path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4,
+                 pRect->top + 14);
+    path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10,
+                 pRect->top + 14);
+    path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13,
+                 pRect->top + 11);
+    path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10,
+                 pRect->top + 14);
+    path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12,
+                 pRect->top + 11);
+    pGraphics->StrokePath(&path, pMatrix);
+    pGraphics->RestoreGraphState();
+  } else {
+    CFX_RectF rtMax(*pRect);
+    rtMax.Inflate(-5, -5);
+    CFX_Path path;
+    path.Create();
+    path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10,
+                      fHeight - 10);
+    path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12,
+                      fHeight - 14);
+    pGraphics->SaveGraphState();
+    CFX_Color crFill(0xFFFFFFFF);
+    pGraphics->SetFillColor(&crFill);
+    pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+    pGraphics->RestoreGraphState();
+  }
+}
+void CFWL_FormTP::DrawIconImage(CFX_Graphics* pGraphics,
+                                CFX_DIBitmap* pDIBitmap,
+                                const CFX_RectF* pRect,
+                                FWLTHEME_STATE eState,
+                                CFX_Matrix* pMatrix,
+                                int32_t iActive) {
+  pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix);
+}
+void CFWL_FormTP::SetThemeData(FX_DWORD dwID) {
+  m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255);
+  m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148);
+  m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5);
+  m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176);
+  m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71);
+  m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20);
+  m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33);
+  m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107);
+  m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54);
+  m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74);
+  m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51);
+  m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28);
+  m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13);
+  if (dwID) {
+    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149);
+    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131);
+    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128);
+    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149);
+    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94);
+    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105);
+    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133);
+    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125);
+    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103);
+    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79);
+    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105);
+    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201);
+    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149);
+    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133);
+    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121);
+    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103);
+    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162);
+    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84);
+    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208);
+    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112);
+    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190);
+    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88);
+    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137);
+    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83);
+    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105);
+    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105);
+    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123);
+    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105);
+    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
+    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
+    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94);
+    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105);
+    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133);
+    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127);
+    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133);
+  } else {
+    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255);
+    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226);
+    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226);
+    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255);
+    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200);
+    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220);
+    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210);
+    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234);
+    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193);
+    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139);
+    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238);
+    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255);
+    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255);
+    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252);
+    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255);
+    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207);
+    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112);
+    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188);
+    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250);
+    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248);
+    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255);
+    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255);
+    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245);
+    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187);
+    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245);
+    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195);
+    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244);
+    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185);
+    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
+    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
+    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241);
+    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220);
+    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160);
+    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140);
+    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
+    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239);
+  }
+  m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0];
+  m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0];
+  m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1];
+  m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1];
+  m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2];
+  m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2];
+  m_pThemeData->clrCloseBtEdgeLight[1][0] =
+      m_pThemeData->clrCloseBtEdgeLight[0][0];
+  m_pThemeData->clrCloseBtEdgeDark[1][0] =
+      m_pThemeData->clrCloseBtEdgeDark[0][0];
+  m_pThemeData->clrCloseBtEdgeLight[1][1] =
+      m_pThemeData->clrCloseBtEdgeLight[0][1];
+  m_pThemeData->clrCloseBtEdgeDark[1][1] =
+      m_pThemeData->clrCloseBtEdgeDark[0][1];
+  m_pThemeData->clrCloseBtEdgeLight[1][2] =
+      m_pThemeData->clrCloseBtEdgeLight[0][2];
+  m_pThemeData->clrCloseBtEdgeDark[1][2] =
+      m_pThemeData->clrCloseBtEdgeDark[0][2];
+  m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0];
+  m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1];
+  m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2];
+  m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3];
+  m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2];
+  m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1];
+  m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0];
+  m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0];
+  m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1];
+  m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2];
+  m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0];
+  m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1];
+  m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2];
+  m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0];
+  m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1];
+  m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2];
+  m_pThemeData->clrNormalBtBKStart[1][2] =
+      m_pThemeData->clrNormalBtBKStart[0][2];
+  m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2];
+  m_pThemeData->clrNormalBtBKStart[1][0] =
+      m_pThemeData->clrNormalBtBKStart[0][0];
+  m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0];
+  m_pThemeData->clrNormalBtBKStart[1][1] =
+      m_pThemeData->clrNormalBtBKStart[0][1];
+  m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1];
+  m_pThemeData->clrNormalBtEdgeLight[1][0] =
+      m_pThemeData->clrNormalBtEdgeLight[0][0];
+  m_pThemeData->clrNormalBtEdgeDark[1][0] =
+      m_pThemeData->clrNormalBtEdgeDark[0][0];
+  m_pThemeData->clrNormalBtEdgeLight[1][1] =
+      m_pThemeData->clrNormalBtEdgeLight[0][1];
+  m_pThemeData->clrNormalBtEdgeDark[1][1] =
+      m_pThemeData->clrNormalBtEdgeDark[0][1];
+  m_pThemeData->clrNormalBtEdgeLight[1][2] =
+      m_pThemeData->clrNormalBtEdgeLight[0][2];
+  m_pThemeData->clrNormalBtEdgeDark[1][2] =
+      m_pThemeData->clrNormalBtEdgeDark[0][2];
+  m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0];
+  m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1];
+  m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2];
+  m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0];
+  m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0];
+  m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1];
+  m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2];
+  m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3];
+  m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4];
+  m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0];
+  DeactiveForm();
+}
+void CFWL_FormTP::DeactiveForm() {
+  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeLeft[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeLeft[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeLeft[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeRight[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeRight[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeRight[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeTop[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeTop[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeTop[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeBottom[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeBottom[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrHeadEdgeBottom[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKStart[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKStart[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKStart[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKEnd[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKEnd[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtBKEnd[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeLight[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeLight[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeLight[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeDark[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeDark[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrNormalBtEdgeDark[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrBtnCornerLight[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrBtnCornerLight[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrBtnCornerLight[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorder[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorder[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorder[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorder[1][3]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorder[1][4]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrFormBorderLight[1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKStart[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKStart[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKStart[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKEnd[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKEnd[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtBKEnd[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeLight[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeLight[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeLight[1][2]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeDark[1][0]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeDark[1][1]);
+  TransModeColor(m_pThemeData->clrTransWhite,
+                 m_pThemeData->clrCloseBtEdgeDark[1][2]);
+}
+void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack) {
+  int32_t iAlfaF, iRF, iGF, iBF;
+  int32_t iAlfaB, iRB, iGB, iBB;
+  ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF);
+  ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB);
+  clrBack = ArgbEncode(0xff, iRB + (iRF - iRB) * iAlfaF / 255,
+                       iGB + (iGF - iGB) * iAlfaF / 255,
+                       iBB + (iBF - iBB) * iAlfaF / 255);
+}
+void CFWL_FormTP::InitCaption(FX_BOOL bActive) {
+  if (bActive) {
+    CFX_FxgeDevice dev;
+    CFX_Graphics gs;
+    CFX_Path path;
+    path.Create();
+    if (m_pActiveBitmap) {
+      delete m_pActiveBitmap;
+      m_pActiveBitmap = NULL;
+    }
+    m_pActiveBitmap = new CFX_DIBitmap;
+    m_pActiveBitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
+    dev.Attach(m_pActiveBitmap);
+    gs.Create(&dev);
+    path.AddRectangle(0, 0, 1, 5);
+    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0],
+                     m_pThemeData->clrHeadBK[0][1], &path);
+    path.Clear();
+    path.AddRectangle(0, 5, 1, 15);
+    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1],
+                     m_pThemeData->clrHeadBK[0][2], &path);
+    path.Clear();
+    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
+    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
+                     m_pThemeData->clrHeadBK[0][2],
+                     m_pThemeData->clrHeadBK[0][3], &path);
+  } else {
+    CFX_FxgeDevice dev;
+    CFX_Graphics gs;
+    CFX_Path path;
+    path.Create();
+    if (m_pDeactivebitmap) {
+      delete m_pDeactivebitmap;
+      m_pDeactivebitmap = NULL;
+    }
+    m_pDeactivebitmap = new CFX_DIBitmap;
+    m_pDeactivebitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
+    dev.Attach(m_pDeactivebitmap);
+    gs.Create(&dev);
+    path.AddRectangle(0, 0, 1, 5);
+    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0],
+                     m_pThemeData->clrHeadBK[1][1], &path);
+    path.Clear();
+    path.AddRectangle(0, 5, 1, 15);
+    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1],
+                     m_pThemeData->clrHeadBK[1][2], &path);
+    path.Clear();
+    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
+    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
+                     m_pThemeData->clrHeadBK[1][2],
+                     m_pThemeData->clrHeadBK[1][3], &path);
+  }
+}
diff --git a/xfa/src/fwl/theme/listboxtp.cpp b/xfa/fwl/theme/listboxtp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/listboxtp.cpp
rename to xfa/fwl/theme/listboxtp.cpp
diff --git a/xfa/fwl/theme/monthcalendartp.cpp b/xfa/fwl/theme/monthcalendartp.cpp
new file mode 100644
index 0000000..6ab99ae
--- /dev/null
+++ b/xfa/fwl/theme/monthcalendartp.cpp
@@ -0,0 +1,582 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/theme/monthcalendartp.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+
+#define FWL_THEMECAPACITY_MC_HEADER_WIDTH 200
+#define FWL_THEMECAPACITY_MC_HEADER_HEIGHT 30
+#define FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH 18
+#define FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT 16
+#define FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN 5
+#define FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN \
+  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -         \
+   FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT) /    \
+      2
+#define FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT 100
+#define FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT 20
+#define FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN \
+  (FWL_THEMECAPACITY_MC_HEADER_WIDTH -           \
+   FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT) /      \
+      2
+#define FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN \
+  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -          \
+   FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT) /     \
+      2
+#define FWL_THEMECAPACITY_MC_HSEP_WIDTH (FWL_THEMECAPACITY_MC_WEEK_WIDTH - 10)
+#define FWL_THEMECAPACITY_MC_HSEP_HEIGHT 1
+#define FWL_THEMECAPACITY_MC_VSEP_WIDTH 1
+#define FWL_THEMECAPACITY_MC_VSEP_HEIGHT FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT
+#define FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH 26
+#define FWL_THEMECAPACITY_MC_SEP_DOFFSET -4
+#define FWL_THEMECAPACITY_MC_SEP_X 3
+#define FWL_THEMECAPACITY_MC_SEP_Y                                         \
+  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT + FWL_THEMECAPACITY_MC_WEEK_HEIGHT + \
+   FWL_THEMECAPACITY_MC_SEP_DOFFSET)
+#define FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT \
+  (6 * FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT)
+#define FWL_THEMECAPACITY_MC_WEEK_WIDTH \
+  (FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH * 7)
+#define FWL_THEMECAPACITY_MC_WEEK_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
+#define FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH \
+  (FWL_THEMECAPACITY_MC_HEADER_WIDTH / 7)
+#define FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT 16
+#define FWL_THEMECAPACITY_MC_TODAY_WIDHT FWL_THEMECAPACITY_MC_HEADER_WIDTH
+#define FWL_THEMECAPACITY_MC_TODAY_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
+#define FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT \
+  FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH
+#define FWL_MC_WIDTH 200
+#define FWL_MC_HEIGHT 160
+
+CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() {
+  m_pThemeData = new MCThemeData;
+  SetThemeData(0);
+}
+CFWL_MonthCalendarTP::~CFWL_MonthCalendarTP() {
+  delete m_pThemeData;
+}
+FX_BOOL CFWL_MonthCalendarTP::IsValidWidget(IFWL_Widget* pWidget) {
+  if (!pWidget)
+    return FALSE;
+  return pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar;
+}
+FX_DWORD CFWL_MonthCalendarTP::SetThemeID(IFWL_Widget* pWidget,
+                                          FX_DWORD dwThemeID,
+                                          FX_BOOL bChildren) {
+  if (m_pThemeData) {
+    SetThemeData(FWL_GetThemeColor(dwThemeID));
+  }
+  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  if (!pParams)
+    return FALSE;
+  switch (pParams->m_iPart) {
+    case FWL_PART_MCD_Border: {
+      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_Edge: {
+      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
+               &pParams->m_rtPart, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_Background: {
+      DrawTotalBK(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_Header: {
+      DrawHeadBk(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_LBtn: {
+#ifdef THEME_XPSimilar
+      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
+      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
+                   FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix);
+#else
+      DrawLButton(pParams, &pParams->m_matrix);
+#endif
+      break;
+    }
+    case FWL_PART_MCD_RBtn: {
+#ifdef THEME_XPSimilar
+      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
+      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
+                   FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix);
+#else
+      DrawRButton(pParams, &pParams->m_matrix);
+#endif
+      break;
+    }
+    case FWL_PART_MCD_HSeparator: {
+      DrawHSeperator(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_DatesIn: {
+      DrawDatesInBK(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_TodayCircle: {
+      DrawTodayCircle(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_DateInCircle: {
+      DrawDatesInCircle(pParams, &pParams->m_matrix);
+      break;
+    }
+    case FWL_PART_MCD_WeekNumSep: {
+      DrawWeekNumSep(pParams, &pParams->m_matrix);
+      break;
+    }
+    default: {}
+  }
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawText(CFWL_ThemeText* pParams) {
+  if (!m_pTextOut)
+    return FALSE;
+  if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) &&
+      !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
+      (pParams->m_dwStates &
+       (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) {
+    m_pTextOut->SetTextColor(0xFFFFFFFF);
+  } else if (pParams->m_iPart == FWL_PART_MCD_Caption) {
+    m_pTextOut->SetTextColor(m_pThemeData->clrCaption);
+  } else {
+    m_pTextOut->SetTextColor(0xFF000000);
+  }
+  return CFWL_WidgetTP::DrawText(pParams);
+}
+void* CFWL_MonthCalendarTP::GetCapacity(CFWL_ThemePart* pThemePart,
+                                        FX_DWORD dwCapacity) {
+  FX_BOOL bDefPro = FALSE;
+  FX_BOOL bDwordVal = FALSE;
+  switch (dwCapacity) {
+    case FWL_WGTCAPACITY_MC_HEADER_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_Height: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN: {
+      bDwordVal = TRUE;
+      m_dwValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN: {
+      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HSEP_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_HSEP_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HSEP_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_HSEP_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_VSEP_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_VSEP_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_VSEP_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_VSEP_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_WEEK_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_WEEK_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_WEEK_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_WEEK_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_SEP_DOFFSET: {
+      m_fValue = FWL_THEMECAPACITY_MC_SEP_DOFFSET;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_SEP_X: {
+      m_fValue = FWL_THEMECAPACITY_MC_SEP_X;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_SEP_Y: {
+      m_fValue = FWL_THEMECAPACITY_MC_SEP_Y;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH: {
+      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_TODAY_WIDHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_TODAY_WIDHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_TODAY_HEIGHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_TODAY_HEIGHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT: {
+      m_fValue = FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_WIDTH: {
+      m_fValue = FWL_MC_WIDTH;
+      break;
+    }
+    case FWL_WGTCAPACITY_MC_HEIGHT: {
+      m_fValue = FWL_MC_HEIGHT;
+      break;
+    }
+    case FWL_MCCAPACITY_Sun: {
+      wsResource = L"Sun";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Mon: {
+      wsResource = L"Mon";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Tue: {
+      wsResource = L"Tue";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Wed: {
+      wsResource = L"Wed";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Thu: {
+      wsResource = L"Thu";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Fri: {
+      wsResource = L"Fri";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Sat: {
+      wsResource = L"Sat";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_January: {
+      wsResource = L"January";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_February: {
+      wsResource = L"February";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_March: {
+      wsResource = L"March";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_April: {
+      wsResource = L"April";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_May: {
+      wsResource = L"May";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_June: {
+      wsResource = L"June";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_July: {
+      wsResource = L"July";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_August: {
+      wsResource = L"August";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_September: {
+      wsResource = L"September";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_October: {
+      wsResource = L"October";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_November: {
+      wsResource = L"November";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_December: {
+      wsResource = L"December";
+      return &wsResource;
+    }
+    case FWL_MCCAPACITY_Today: {
+      wsResource = L"Today";
+      return &wsResource;
+    }
+    default: { bDefPro = TRUE; }
+  }
+  if (!bDefPro) {
+    if (bDwordVal) {
+      return &m_dwValue;
+    }
+    return &m_fValue;
+  }
+  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
+}
+FWL_ERR CFWL_MonthCalendarTP::Initialize() {
+  InitTTO();
+  return CFWL_WidgetTP::Initialize();
+}
+FWL_ERR CFWL_MonthCalendarTP::Finalize() {
+  FinalizeTTO();
+  return CFWL_WidgetTP::Finalize();
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground* pParams,
+                                          CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtTotal(pParams->m_rtPart);
+  path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrBK(m_pThemeData->clrBK);
+  pParams->m_pGraphics->SetFillColor(&clrBK);
+  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground* pParams,
+                                         CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtHead = pParams->m_rtPart;
+  path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrHeadBK(m_pThemeData->clrBK);
+  pParams->m_pGraphics->SetFillColor(&clrHeadBK);
+  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground* pParams,
+                                          CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtLBtn;
+  rtLBtn = pParams->m_rtPart;
+  path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrLBtnEdge(ArgbEncode(0xff, 205, 219, 243));
+  pParams->m_pGraphics->SetStrokeColor(&clrLBtnEdge);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
+      FWL_PARTSTATE_MCD_Pressed) {
+    CFX_Color clrLBtnFill(ArgbEncode(0xff, 174, 198, 242));
+    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  } else {
+    CFX_Color clrLBtnFill(ArgbEncode(0xff, 227, 235, 249));
+    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  }
+  path.Clear();
+  path.MoveTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
+              rtLBtn.top + rtLBtn.height / 4);
+  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3, rtLBtn.top + rtLBtn.height / 2);
+  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
+              rtLBtn.bottom() - rtLBtn.height / 4);
+  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
+  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground* pParams,
+                                          CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtRBtn;
+  rtRBtn = pParams->m_rtPart;
+  path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrRBtnEdge(ArgbEncode(0xff, 205, 219, 243));
+  pParams->m_pGraphics->SetStrokeColor(&clrRBtnEdge);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
+      FWL_PARTSTATE_MCD_Pressed) {
+    CFX_Color clrRBtnFill(ArgbEncode(0xff, 174, 198, 242));
+    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  } else {
+    CFX_Color clrRBtnFill(ArgbEncode(0xff, 227, 235, 249));
+    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  }
+  path.Clear();
+  path.MoveTo(rtRBtn.left + rtRBtn.Width() / 3, rtRBtn.top + rtRBtn.height / 4);
+  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3 * 2,
+              rtRBtn.top + rtRBtn.height / 2);
+  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3,
+              rtRBtn.bottom() - rtRBtn.height / 4);
+  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
+  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground* pParams,
+                                             CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtHSep;
+  rtHSep = pParams->m_rtPart;
+  path.MoveTo(rtHSep.left, rtHSep.top + rtHSep.height / 2);
+  path.LineTo(rtHSep.right(), rtHSep.top + rtHSep.height / 2);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrHSep(m_pThemeData->clrSeperator);
+  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground* pParams,
+                                             CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtWeekSep;
+  rtWeekSep = pParams->m_rtPart;
+  path.MoveTo(rtWeekSep.left, rtWeekSep.top);
+  path.LineTo(rtWeekSep.left, rtWeekSep.bottom());
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrHSep(m_pThemeData->clrSeperator);
+  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawDatesInBK(CFWL_ThemeBackground* pParams,
+                                            CFX_Matrix* pMatrix) {
+  pParams->m_pGraphics->SaveGraphState();
+  if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Selected) {
+    CFX_Path path;
+    path.Create();
+    CFX_RectF rtSelDay;
+    rtSelDay = pParams->m_rtPart;
+    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
+                      rtSelDay.height);
+    CFX_Color clrSelDayBK;
+    clrSelDayBK = m_pThemeData->clrDatesSelectedBK;
+    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  } else if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Hovered) {
+    CFX_Path path;
+    path.Create();
+    CFX_RectF rtSelDay;
+    rtSelDay = pParams->m_rtPart;
+    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
+                      rtSelDay.height);
+    CFX_Color clrSelDayBK;
+    clrSelDayBK = m_pThemeData->clrDatesHoverBK;
+    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
+    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  }
+  pParams->m_pGraphics->RestoreGraphState();
+  return FALSE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground* pParams,
+                                                CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtSelDay;
+  rtSelDay = pParams->m_rtPart;
+  path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
+                    rtSelDay.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrSelDayBK;
+  clrSelDayBK = m_pThemeData->clrDatesCircle;
+  pParams->m_pGraphics->SetStrokeColor(&clrSelDayBK);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FX_BOOL CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground* pParams,
+                                              CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtTodayCircle;
+  rtTodayCircle = pParams->m_rtPart;
+  path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width,
+                    rtTodayCircle.height);
+  pParams->m_pGraphics->SaveGraphState();
+  CFX_Color clrTodayCircle;
+  clrTodayCircle = m_pThemeData->clrDatesCircle;
+  pParams->m_pGraphics->SetStrokeColor(&clrTodayCircle);
+  pParams->m_pGraphics->StrokePath(&path, pMatrix);
+  pParams->m_pGraphics->RestoreGraphState();
+  return TRUE;
+}
+FWLTHEME_STATE CFWL_MonthCalendarTP::GetState(FX_DWORD dwFWLStates) {
+  if (dwFWLStates & FWL_PARTSTATE_MCD_Hovered) {
+    return FWLTHEME_STATE_Hover;
+  } else if (dwFWLStates & FWL_PARTSTATE_MCD_Pressed) {
+    return FWLTHEME_STATE_Pressed;
+  }
+  return FWLTHEME_STATE_Normal;
+}
+void CFWL_MonthCalendarTP::SetThemeData(FX_DWORD dwThemeID) {
+  if (dwThemeID == 0) {
+    m_pThemeData->clrCaption = ArgbEncode(0xff, 0, 153, 255);
+    m_pThemeData->clrSeperator = ArgbEncode(0xff, 141, 161, 239);
+    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 193, 211, 251);
+    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 173, 188, 239);
+    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 103, 144, 209);
+    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
+    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
+  } else {
+    m_pThemeData->clrCaption = ArgbEncode(0xff, 128, 128, 0);
+    m_pThemeData->clrSeperator = ArgbEncode(0xff, 128, 128, 64);
+    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 217, 220, 191);
+    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 204, 208, 183);
+    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 128, 128, 0);
+    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
+    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
+  }
+}
diff --git a/xfa/src/fwl/theme/pictureboxtp.cpp b/xfa/fwl/theme/pictureboxtp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/pictureboxtp.cpp
rename to xfa/fwl/theme/pictureboxtp.cpp
diff --git a/xfa/src/fwl/theme/pushbuttontp.cpp b/xfa/fwl/theme/pushbuttontp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/pushbuttontp.cpp
rename to xfa/fwl/theme/pushbuttontp.cpp
diff --git a/xfa/src/fwl/theme/scrollbartp.cpp b/xfa/fwl/theme/scrollbartp.cpp
similarity index 100%
rename from xfa/src/fwl/theme/scrollbartp.cpp
rename to xfa/fwl/theme/scrollbartp.cpp
diff --git a/xfa/fwl/theme/widgettp.cpp b/xfa/fwl/theme/widgettp.cpp
new file mode 100644
index 0000000..04b67b3
--- /dev/null
+++ b/xfa/fwl/theme/widgettp.cpp
@@ -0,0 +1,840 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fwl/theme/widgettp.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+
+static void FWL_SetChildThemeID(IFWL_Widget* pParent, FX_DWORD dwThemeID) {
+  IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
+  IFWL_Widget* pChild =
+      pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
+  while (pChild) {
+    IFWL_ThemeProvider* pTheme = pChild->GetThemeProvider();
+    if (pTheme) {
+      pTheme->SetThemeID(pChild, dwThemeID, FALSE);
+    }
+    FWL_SetChildThemeID(pChild, dwThemeID);
+    pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
+  }
+}
+FX_BOOL CFWL_WidgetTP::IsValidWidget(IFWL_Widget* pWidget) {
+  return FALSE;
+}
+FX_DWORD CFWL_WidgetTP::GetThemeID(IFWL_Widget* pWidget) {
+  return m_dwThemeID;
+}
+FX_DWORD CFWL_WidgetTP::SetThemeID(IFWL_Widget* pWidget,
+                                   FX_DWORD dwThemeID,
+                                   FX_BOOL bChildren) {
+  FX_DWORD dwOld = m_dwThemeID;
+  m_dwThemeID = dwThemeID;
+  if (CFWL_ArrowData::IsInstance()) {
+    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(dwThemeID));
+  }
+  if (bChildren) {
+    FWL_SetChildThemeID(pWidget, dwThemeID);
+  }
+  return dwOld;
+}
+FWL_ERR CFWL_WidgetTP::GetThemeMatrix(IFWL_Widget* pWidget,
+                                      CFX_Matrix& matrix) {
+  matrix.Set(_ctm.a, _ctm.b, _ctm.c, _ctm.d, _ctm.e, _ctm.f);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetTP::SetThemeMatrix(IFWL_Widget* pWidget,
+                                      const CFX_Matrix& matrix) {
+  _ctm.Set(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_WidgetTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetTP::DrawText(CFWL_ThemeText* pParams) {
+  if (!m_pTextOut) {
+    InitTTO();
+  }
+  int32_t iLen = pParams->m_wsText.GetLength();
+  if (iLen <= 0)
+    return FALSE;
+  CFX_Graphics* pGraphics = pParams->m_pGraphics;
+  m_pTextOut->SetRenderDevice(pGraphics->GetRenderDevice());
+  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
+  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+  CFX_Matrix* pMatrix = &pParams->m_matrix;
+  pMatrix->Concat(*pGraphics->GetMatrix());
+  m_pTextOut->SetMatrix(*pMatrix);
+  m_pTextOut->DrawLogicText(pParams->m_wsText, iLen, pParams->m_rtPart);
+  return TRUE;
+}
+void* CFWL_WidgetTP::GetCapacity(CFWL_ThemePart* pThemePart,
+                                 FX_DWORD dwCapacity) {
+  switch (dwCapacity) {
+    case FWL_WGTCAPACITY_CXBorder: {
+      m_fValue = FWLTHEME_CAPACITY_CXBorder;
+      break;
+    }
+    case FWL_WGTCAPACITY_CYBorder: {
+      m_fValue = FWLTHEME_CAPACITY_CYBorder;
+      break;
+    }
+    case FWL_WGTCAPACITY_EdgeFlat: {
+      m_fValue = FWLTHEME_CAPACITY_EdgeFlat;
+      break;
+    }
+    case FWL_WGTCAPACITY_EdgeRaised: {
+      m_fValue = FWLTHEME_CAPACITY_EdgeRaised;
+      break;
+    }
+    case FWL_WGTCAPACITY_EdgeSunken: {
+      m_fValue = FWLTHEME_CAPACITY_EdgeSunken;
+      break;
+    }
+    case FWL_WGTCAPACITY_FontSize: {
+      m_fValue = FWLTHEME_CAPACITY_FontSize;
+      break;
+    }
+    case FWL_WGTCAPACITY_TextColor: {
+      m_dwValue = FWLTHEME_CAPACITY_TextColor;
+      return &m_dwValue;
+    }
+    case FWL_WGTCAPACITY_ScrollBarWidth: {
+      m_fValue = FWLTHEME_CAPACITY_ScrollBarWidth;
+      break;
+    }
+    case FWL_WGTCAPACITY_Font: {
+      return m_pFDEFont;
+    }
+    case FWL_WGTCAPACITY_TextSelColor: {
+      m_dwValue = (m_dwThemeID == 0) ? FWLTHEME_CAPACITY_TextSelColor
+                                     : FWLTHEME_COLOR_Green_BKSelected;
+      return &m_dwValue;
+    }
+    case FWL_WGTCAPACITY_LineHeight: {
+      m_fValue = FWLTHEME_CAPACITY_LineHeight;
+      break;
+    }
+    case FWL_WGTCAPACITY_UIMargin: {
+      m_rtMargin.Set(0, 0, 0, 0);
+      return &m_rtMargin;
+    }
+    default: { return NULL; }
+  }
+  return &m_fValue;
+}
+FX_BOOL CFWL_WidgetTP::IsCustomizedLayout(IFWL_Widget* pWidget) {
+  return FWL_GetThemeLayout(m_dwThemeID);
+}
+FWL_ERR CFWL_WidgetTP::GetPartRect(CFWL_ThemePart* pThemePart,
+                                   CFX_RectF& rect) {
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CFWL_WidgetTP::IsInPart(CFWL_ThemePart* pThemePart,
+                                FX_FLOAT fx,
+                                FX_FLOAT fy) {
+  return TRUE;
+}
+FX_BOOL CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
+  if (!pParams)
+    return FALSE;
+  if (!m_pTextOut)
+    return FALSE;
+  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+  m_pTextOut->SetStyles(pParams->m_dwTTOStyles | FDE_TTOSTYLE_ArabicContext);
+  m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
+                            rect);
+  return TRUE;
+}
+FWL_ERR CFWL_WidgetTP::Initialize() {
+  m_dwThemeID = 0;
+  _ctm.SetIdentity();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetTP::Finalize() {
+  if (!m_pTextOut) {
+    FinalizeTTO();
+  }
+  return FWL_ERR_Succeeded;
+}
+CFWL_WidgetTP::~CFWL_WidgetTP() {}
+FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
+                               const FX_WCHAR* strFont,
+                               FX_FLOAT fFontSize,
+                               FX_ARGB rgbFont) {
+  if (!m_pTextOut) {
+    return FWL_ERR_Succeeded;
+  }
+  m_pFDEFont = CFWL_FontManager::GetInstance()->FindFont(strFont, 0, 0);
+  m_pTextOut->SetFont(m_pFDEFont);
+  m_pTextOut->SetFontSize(fFontSize);
+  m_pTextOut->SetTextColor(rgbFont);
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
+                               IFX_Font* pFont,
+                               FX_FLOAT fFontSize,
+                               FX_ARGB rgbFont) {
+  if (!m_pTextOut) {
+    return FWL_ERR_Succeeded;
+  }
+  m_pTextOut->SetFont(pFont);
+  m_pTextOut->SetFontSize(fFontSize);
+  m_pTextOut->SetTextColor(rgbFont);
+  return FWL_ERR_Succeeded;
+}
+IFX_Font* CFWL_WidgetTP::GetFont(IFWL_Widget* pWidget) {
+  return m_pFDEFont;
+}
+CFWL_WidgetTP::CFWL_WidgetTP()
+    : m_dwRefCount(1), m_pTextOut(NULL), m_pFDEFont(NULL), m_dwThemeID(0) {}
+FX_ERR CFWL_WidgetTP::InitTTO() {
+  if (m_pTextOut) {
+    return FWL_ERR_Succeeded;
+  }
+  m_pFDEFont =
+      CFWL_FontManager::GetInstance()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0);
+  m_pTextOut = IFDE_TextOut::Create();
+  m_pTextOut->SetFont(m_pFDEFont);
+  m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
+  m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
+  m_pTextOut->SetEllipsisString(L"...");
+  return FWL_ERR_Succeeded;
+}
+FX_ERR CFWL_WidgetTP::FinalizeTTO() {
+  if (m_pTextOut) {
+    m_pTextOut->Release();
+    m_pTextOut = NULL;
+  }
+  return FWL_ERR_Succeeded;
+}
+#ifdef THEME_XPSimilar
+void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
+                             FX_DWORD dwStyles,
+                             const CFX_RectF* pRect,
+                             CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  CFX_Color crStroke(FWL_GetThemeColor(m_dwThemeID) == 0
+                         ? ArgbEncode(255, 127, 157, 185)
+                         : FWLTHEME_COLOR_Green_BKSelected);
+  pGraphics->SetStrokeColor(&crStroke);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(pRect->left, pRect->top, pRect->width - 1,
+                    pRect->height - 1);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.Clear();
+  crStroke = ArgbEncode(255, 255, 255, 255);
+  pGraphics->SetStrokeColor(&crStroke);
+  path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 3,
+                    pRect->height - 3);
+  pGraphics->StrokePath(&path, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+#else
+void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
+                             FX_DWORD dwStyles,
+                             const CFX_RectF* pRect,
+                             CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  FWLTHEME_EDGE eType;
+  FX_FLOAT fWidth;
+  switch (dwStyles & FWL_WGTSTYLE_EdgeMask) {
+    case FWL_WGTSTYLE_EdgeRaised: {
+      eType = FWLTHEME_EDGE_Raised, fWidth = FWLTHEME_CAPACITY_EdgeRaised;
+      break;
+    }
+    case FWL_WGTSTYLE_EdgeSunken: {
+      eType = FWLTHEME_EDGE_Sunken, fWidth = FWLTHEME_CAPACITY_EdgeSunken;
+      break;
+    }
+    case FWL_WGTSTYLE_EdgeFlat:
+    default: { return; }
+  }
+  Draw3DRect(pGraphics, eType, fWidth, pRect, FWLTHEME_COLOR_EDGELT1,
+             FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1,
+             FWLTHEME_COLOR_EDGERB2, pMatrix);
+}
+#endif
+void CFWL_WidgetTP::Draw3DRect(CFX_Graphics* pGraphics,
+                               FWLTHEME_EDGE eType,
+                               FX_FLOAT fWidth,
+                               const CFX_RectF* pRect,
+                               FX_ARGB cr1,
+                               FX_ARGB cr2,
+                               FX_ARGB cr3,
+                               FX_ARGB cr4,
+                               CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  if (eType == FWLTHEME_EDGE_Flat) {
+    CFX_Path path;
+    path.Create();
+    path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+    path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
+                      pRect->height - 2);
+    CFX_Color cr(ArgbEncode(255, 100, 100, 100));
+    pGraphics->SetFillColor(&cr);
+    pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+    path.Clear();
+    path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
+                      pRect->height - 2);
+    path.AddRectangle(pRect->left + 2, pRect->top + 2, pRect->width - 4,
+                      pRect->height - 4);
+    cr.Set(0xFFFFFFFF);
+    pGraphics->SetFillColor(&cr);
+    pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  } else {
+    FX_FLOAT fLeft = pRect->left;
+    FX_FLOAT fRight = pRect->right();
+    FX_FLOAT fTop = pRect->top;
+    FX_FLOAT fBottom = pRect->bottom();
+    FX_FLOAT fHalfWidth = fWidth / 2.0f;
+    CFX_Color crLT(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
+    pGraphics->SetFillColor(&crLT);
+    CFX_Path pathLT;
+    pathLT.Create();
+    pathLT.MoveTo(fLeft, fBottom - fHalfWidth);
+    pathLT.LineTo(fLeft, fTop);
+    pathLT.LineTo(fRight - fHalfWidth, fTop);
+    pathLT.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
+    pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
+    pathLT.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
+    pathLT.LineTo(fLeft, fBottom - fHalfWidth);
+    pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
+    crLT = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
+    pGraphics->SetFillColor(&crLT);
+    pathLT.Clear();
+    pathLT.MoveTo(fLeft + fHalfWidth, fBottom - fWidth);
+    pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
+    pathLT.LineTo(fRight - fWidth, fTop + fHalfWidth);
+    pathLT.LineTo(fRight - fWidth, fTop + fWidth);
+    pathLT.LineTo(fLeft + fWidth, fTop + fWidth);
+    pathLT.LineTo(fLeft + fWidth, fBottom - fWidth);
+    pathLT.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
+    pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
+    CFX_Color crRB(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
+    pGraphics->SetFillColor(&crRB);
+    CFX_Path pathRB;
+    pathRB.Create();
+    pathRB.MoveTo(fRight - fHalfWidth, fTop + fHalfWidth);
+    pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
+    pathRB.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
+    pathRB.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
+    pathRB.LineTo(fRight - fWidth, fBottom - fWidth);
+    pathRB.LineTo(fRight - fWidth, fTop + fHalfWidth);
+    pathRB.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
+    pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
+    crRB = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
+    pGraphics->SetFillColor(&crRB);
+    pathRB.Clear();
+    pathRB.MoveTo(fRight, fTop);
+    pathRB.LineTo(fRight, fBottom);
+    pathRB.LineTo(fLeft, fBottom);
+    pathRB.LineTo(fLeft, fBottom - fHalfWidth);
+    pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
+    pathRB.LineTo(fRight - fHalfWidth, fTop);
+    pathRB.LineTo(fRight, fTop);
+    pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
+  }
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::Draw3DCircle(CFX_Graphics* pGraphics,
+                                 FWLTHEME_EDGE eType,
+                                 FX_FLOAT fWidth,
+                                 const CFX_RectF* pRect,
+                                 FX_ARGB cr1,
+                                 FX_ARGB cr2,
+                                 FX_ARGB cr3,
+                                 FX_ARGB cr4,
+                                 CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  CFX_Path path;
+  path.Create();
+  path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
+              FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
+  CFX_Color crFill1(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
+  pGraphics->SetStrokeColor(&crFill1);
+  pGraphics->StrokePath(&path, pMatrix);
+  CFX_RectF rtInner(*pRect);
+  rtInner.Deflate(pRect->width / 4, pRect->height / 4);
+  path.Clear();
+  path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
+              FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
+  CFX_Color crFill2(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
+  pGraphics->SetStrokeColor(&crFill2);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.Clear();
+  path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
+              FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
+  CFX_Color crFill3(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
+  pGraphics->SetStrokeColor(&crFill3);
+  pGraphics->StrokePath(&path, pMatrix);
+  path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
+              FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
+  CFX_Color crFill4(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
+  pGraphics->SetStrokeColor(&crFill4);
+  pGraphics->StrokePath(&path, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawBorder(CFX_Graphics* pGraphics,
+                               const CFX_RectF* pRect,
+                               CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+  path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
+                    pRect->height - 2);
+  pGraphics->SaveGraphState();
+  CFX_Color crFill(ArgbEncode(255, 0, 0, 0));
+  pGraphics->SetFillColor(&crFill);
+  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::FillBackground(CFX_Graphics* pGraphics,
+                                   const CFX_RectF* pRect,
+                                   CFX_Matrix* pMatrix) {
+  FillSoildRect(pGraphics, FWLTHEME_COLOR_Background, pRect, pMatrix);
+}
+void CFWL_WidgetTP::FillSoildRect(CFX_Graphics* pGraphics,
+                                  FX_ARGB fillColor,
+                                  const CFX_RectF* pRect,
+                                  CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  CFX_Color crFill(fillColor);
+  pGraphics->SetFillColor(&crFill);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawAxialShading(CFX_Graphics* pGraphics,
+                                     FX_FLOAT fx1,
+                                     FX_FLOAT fy1,
+                                     FX_FLOAT fx2,
+                                     FX_FLOAT fy2,
+                                     FX_ARGB beginColor,
+                                     FX_ARGB endColor,
+                                     CFX_Path* path,
+                                     int32_t fillMode,
+                                     CFX_Matrix* pMatrix) {
+  if (!pGraphics || !path)
+    return;
+
+  CFX_PointF begPoint(fx1, fy1);
+  CFX_PointF endPoint(fx2, fy2);
+  CFX_Shading shading;
+  shading.CreateAxial(begPoint, endPoint, FALSE, FALSE, beginColor, endColor);
+  pGraphics->SaveGraphState();
+  CFX_Color color1(&shading);
+  pGraphics->SetFillColor(&color1);
+  pGraphics->FillPath(path, fillMode, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawAnnulusRect(CFX_Graphics* pGraphics,
+                                    FX_ARGB fillColor,
+                                    const CFX_RectF* pRect,
+                                    FX_FLOAT fRingWidth,
+                                    CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  CFX_Color cr(fillColor);
+  pGraphics->SetFillColor(&cr);
+  CFX_Path path;
+  path.Create();
+  CFX_RectF rtInner(*pRect);
+  rtInner.Deflate(fRingWidth, fRingWidth);
+  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
+  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawAnnulusCircle(CFX_Graphics* pGraphics,
+                                      FX_ARGB fillColor,
+                                      const CFX_RectF* pRect,
+                                      FX_FLOAT fWidth,
+                                      CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  if (fWidth > pRect->width / 2) {
+    return;
+  }
+  pGraphics->SaveGraphState();
+  CFX_Color cr(fillColor);
+  pGraphics->SetFillColor(&cr);
+  CFX_Path path;
+  path.Create();
+  path.AddEllipse(*pRect);
+  CFX_RectF rtIn(*pRect);
+  rtIn.Inflate(-fWidth, -fWidth);
+  path.AddEllipse(rtIn);
+  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawFocus(CFX_Graphics* pGraphics,
+                              const CFX_RectF* pRect,
+                              CFX_Matrix* pMatrix) {
+  if (!pGraphics)
+    return;
+  if (!pRect)
+    return;
+  pGraphics->SaveGraphState();
+  CFX_Color cr(0xFF000000);
+  pGraphics->SetStrokeColor(&cr);
+  FX_FLOAT DashPattern[2] = {1, 1};
+  pGraphics->SetLineDash(0.0f, DashPattern, 2);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+  pGraphics->StrokePath(&path, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+#define FWLTHEME_ARROW_Denominator 3
+void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
+                              const CFX_RectF* pRect,
+                              FWLTHEME_DIRECTION eDict,
+                              FX_ARGB argbFill,
+                              FX_BOOL bPressed,
+                              CFX_Matrix* pMatrix) {
+  CFX_RectF rtArrow(*pRect);
+  CFX_Path path;
+  path.Create();
+  FX_FLOAT fBtn =
+      std::min(pRect->width, pRect->height) / FWLTHEME_ARROW_Denominator;
+  rtArrow.left = pRect->left + (pRect->width - fBtn) / 2;
+  rtArrow.top = pRect->top + (pRect->height - fBtn) / 2;
+  rtArrow.width = fBtn;
+  rtArrow.height = fBtn;
+  if (bPressed) {
+    rtArrow.Offset(1, 1);
+  }
+  switch (eDict) {
+    case FWLTHEME_DIRECTION_Up: {
+      path.MoveTo(rtArrow.left, rtArrow.bottom());
+      path.LineTo(rtArrow.right(), rtArrow.bottom());
+      path.LineTo(rtArrow.left + fBtn / 2, rtArrow.top);
+      path.LineTo(rtArrow.left, rtArrow.bottom());
+      break;
+    }
+    case FWLTHEME_DIRECTION_Left: {
+      path.MoveTo(rtArrow.right(), rtArrow.top);
+      path.LineTo(rtArrow.right(), rtArrow.bottom());
+      path.LineTo(rtArrow.left, rtArrow.top + fBtn / 2);
+      path.LineTo(rtArrow.right(), rtArrow.top);
+      break;
+    }
+    case FWLTHEME_DIRECTION_Right: {
+      path.MoveTo(rtArrow.left, rtArrow.top);
+      path.LineTo(rtArrow.left, rtArrow.bottom());
+      path.LineTo(rtArrow.right(), rtArrow.top + fBtn / 2);
+      path.LineTo(rtArrow.left, rtArrow.top);
+      break;
+    }
+    case FWLTHEME_DIRECTION_Down:
+    default: {
+      path.MoveTo(rtArrow.left, rtArrow.top);
+      path.LineTo(rtArrow.right(), rtArrow.top);
+      path.LineTo(rtArrow.left + fBtn / 2, rtArrow.bottom());
+      path.LineTo(rtArrow.left, rtArrow.top);
+    }
+  }
+  pGraphics->SaveGraphState();
+  CFX_Color cr(argbFill);
+  pGraphics->SetFillColor(&cr);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+  pGraphics->RestoreGraphState();
+}
+void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
+                              const CFX_RectF* pRect,
+                              FWLTHEME_DIRECTION eDict,
+                              FX_ARGB argSign,
+                              CFX_Matrix* pMatrix) {
+  FX_BOOL bVert =
+      (eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down);
+  FX_FLOAT fLeft =
+      (FX_FLOAT)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5);
+  FX_FLOAT fTop =
+      (FX_FLOAT)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5);
+  CFX_Path path;
+  path.Create();
+  switch (eDict) {
+    case FWLTHEME_DIRECTION_Down: {
+      path.MoveTo(fLeft, fTop + 1);
+      path.LineTo(fLeft + 4, fTop + 5);
+      path.LineTo(fLeft + 8, fTop + 1);
+      path.LineTo(fLeft + 7, fTop);
+      path.LineTo(fLeft + 4, fTop + 3);
+      path.LineTo(fLeft + 1, fTop);
+      break;
+    }
+    case FWLTHEME_DIRECTION_Up: {
+      path.MoveTo(fLeft, fTop + 4);
+      path.LineTo(fLeft + 4, fTop);
+      path.LineTo(fLeft + 8, fTop + 4);
+      path.LineTo(fLeft + 7, fTop + 5);
+      path.LineTo(fLeft + 4, fTop + 2);
+      path.LineTo(fLeft + 1, fTop + 5);
+      break;
+    }
+    case FWLTHEME_DIRECTION_Right: {
+      path.MoveTo(fLeft + 1, fTop);
+      path.LineTo(fLeft + 5, fTop + 4);
+      path.LineTo(fLeft + 1, fTop + 8);
+      path.LineTo(fLeft, fTop + 7);
+      path.LineTo(fLeft + 3, fTop + 4);
+      path.LineTo(fLeft, fTop + 1);
+      break;
+    }
+    case FWLTHEME_DIRECTION_Left: {
+      path.MoveTo(fLeft, fTop + 4);
+      path.LineTo(fLeft + 4, fTop);
+      path.LineTo(fLeft + 5, fTop + 1);
+      path.LineTo(fLeft + 2, fTop + 4);
+      path.LineTo(fLeft + 5, fTop + 7);
+      path.LineTo(fLeft + 4, fTop + 8);
+      break;
+    }
+  }
+  CFX_Color cr(argSign);
+  pGraphics->SetFillColor(&cr);
+  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
+}
+void CFWL_WidgetTP::DrawBtn(CFX_Graphics* pGraphics,
+                            const CFX_RectF* pRect,
+                            FWLTHEME_STATE eState,
+                            CFX_Matrix* pMatrix) {
+  CFX_Path path;
+  path.Create();
+  if (!CFWL_ArrowData::IsInstance()) {
+    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
+  }
+  CFWL_ArrowData::CColorData* pColorData =
+      CFWL_ArrowData::GetInstance()->m_pColorData;
+  FX_FLOAT fRight = pRect->right();
+  FX_FLOAT fBottom = pRect->bottom();
+  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
+  DrawAxialShading(pGraphics, pRect->left, pRect->top, fRight, fBottom,
+                   pColorData->clrStart[eState - 1],
+                   pColorData->clrEnd[eState - 1], &path, FXFILL_WINDING,
+                   pMatrix);
+  CFX_Color rcStroke;
+  rcStroke.Set(pColorData->clrBorder[eState - 1]);
+  pGraphics->SetStrokeColor(&rcStroke);
+  pGraphics->StrokePath(&path, pMatrix);
+}
+void CFWL_WidgetTP::DrawArrowBtn(CFX_Graphics* pGraphics,
+                                 const CFX_RectF* pRect,
+                                 FWLTHEME_DIRECTION eDict,
+                                 FWLTHEME_STATE eState,
+                                 CFX_Matrix* pMatrix) {
+  DrawBtn(pGraphics, pRect, eState, pMatrix);
+  if (!CFWL_ArrowData::IsInstance()) {
+    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
+  }
+  CFWL_ArrowData::CColorData* pColorData =
+      CFWL_ArrowData::GetInstance()->m_pColorData;
+  DrawArrow(pGraphics, pRect, eDict, pColorData->clrSign[eState - 1], pMatrix);
+}
+FWLCOLOR CFWL_WidgetTP::BlendColor(FWLCOLOR srcColor,
+                                   FWLCOLOR renderColor,
+                                   uint8_t scale) {
+  FWLCOLOR dstColor;
+  uint8_t n = 255 - scale;
+  dstColor.a = (uint8_t)(
+      ((FX_WORD)srcColor.a * n + (FX_WORD)renderColor.a * scale) >> 8);
+  dstColor.r = (uint8_t)(
+      ((FX_WORD)srcColor.r * n + (FX_WORD)renderColor.r * scale) >> 8);
+  dstColor.g = (uint8_t)(
+      ((FX_WORD)srcColor.g * n + (FX_WORD)renderColor.g * scale) >> 8);
+  dstColor.b = (uint8_t)(
+      ((FX_WORD)srcColor.b * n + (FX_WORD)renderColor.b * scale) >> 8);
+  return dstColor;
+}
+CFWL_ArrowData::CFWL_ArrowData() : m_pColorData(NULL) {
+  SetColorData(0);
+}
+CFWL_FontData::CFWL_FontData()
+    : m_dwStyles(0),
+      m_dwCodePage(0),
+      m_pFont(0),
+      m_pFontMgr(NULL)
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      ,
+      m_pFontSource(NULL)
+#endif
+{
+}
+CFWL_FontData::~CFWL_FontData() {
+  if (m_pFont) {
+    m_pFont->Release();
+  }
+  if (m_pFontMgr) {
+    m_pFontMgr->Release();
+  }
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (m_pFontSource != NULL) {
+    m_pFontSource->Release();
+  }
+#endif
+}
+FX_BOOL CFWL_FontData::Equal(const CFX_WideStringC& wsFontFamily,
+                             FX_DWORD dwFontStyles,
+                             FX_WORD wCodePage) {
+  return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
+         m_dwCodePage == wCodePage;
+}
+FX_BOOL CFWL_FontData::LoadFont(const CFX_WideStringC& wsFontFamily,
+                                FX_DWORD dwFontStyles,
+                                FX_WORD dwCodePage) {
+  m_wsFamily = wsFontFamily;
+  m_dwStyles = dwFontStyles;
+  m_dwCodePage = dwCodePage;
+  if (!m_pFontMgr) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+    m_pFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
+#else
+    m_pFontSource = FX_CreateDefaultFontSourceEnum();
+    m_pFontMgr = IFX_FontMgr::Create(m_pFontSource);
+#endif
+  }
+  m_pFont = IFX_Font::LoadFont(wsFontFamily.GetPtr(), dwFontStyles, dwCodePage,
+                               m_pFontMgr);
+  return m_pFont != NULL;
+}
+
+CFWL_FontManager* CFWL_FontManager::s_FontManager = nullptr;
+CFWL_FontManager* CFWL_FontManager::GetInstance() {
+  if (!s_FontManager)
+    s_FontManager = new CFWL_FontManager;
+  return s_FontManager;
+}
+void CFWL_FontManager::DestroyInstance() {
+  delete s_FontManager;
+  s_FontManager = nullptr;
+}
+CFWL_FontManager::CFWL_FontManager() {}
+CFWL_FontManager::~CFWL_FontManager() {}
+IFX_Font* CFWL_FontManager::FindFont(const CFX_WideStringC& wsFontFamily,
+                                     FX_DWORD dwFontStyles,
+                                     FX_WORD wCodePage) {
+  for (const auto& pData : m_FontsArray) {
+    if (pData->Equal(wsFontFamily, dwFontStyles, wCodePage))
+      return pData->GetFont();
+  }
+  std::unique_ptr<CFWL_FontData> pFontData(new CFWL_FontData);
+  if (!pFontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage))
+    return nullptr;
+  m_FontsArray.push_back(std::move(pFontData));
+  return m_FontsArray.back()->GetFont();
+}
+FX_BOOL FWLTHEME_Init() {
+  return TRUE;
+}
+void FWLTHEME_Release() {
+  CFWL_ArrowData::DestroyInstance();
+  CFWL_FontManager::DestroyInstance();
+}
+FX_DWORD FWL_GetThemeLayout(FX_DWORD dwThemeID) {
+  return 0xffff0000 & dwThemeID;
+}
+FX_DWORD FWL_GetThemeColor(FX_DWORD dwThemeID) {
+  return 0x0000ffff & dwThemeID;
+}
+FX_DWORD FWL_MakeThemeID(FX_DWORD dwLayout, FX_DWORD dwColor) {
+  return (dwLayout << 16) | (0x0000FFFF & dwColor);
+}
+CFWL_ArrowData* CFWL_ArrowData::m_pInstance = NULL;
+CFWL_ArrowData* CFWL_ArrowData::GetInstance() {
+  if (!m_pInstance) {
+    m_pInstance = new CFWL_ArrowData;
+  }
+  return m_pInstance;
+}
+FX_BOOL CFWL_ArrowData::IsInstance() {
+  return (m_pInstance != NULL);
+}
+void CFWL_ArrowData::DestroyInstance() {
+  if (m_pInstance) {
+    delete m_pInstance;
+    m_pInstance = NULL;
+  }
+}
+CFWL_ArrowData::~CFWL_ArrowData() {
+  if (m_pColorData) {
+    delete m_pColorData;
+    m_pColorData = NULL;
+  }
+}
+void CFWL_ArrowData::SetColorData(FX_DWORD dwID) {
+  if (!m_pColorData) {
+    m_pColorData = new CColorData;
+  }
+  if (dwID) {
+    m_pColorData->clrBorder[0] = ArgbEncode(255, 142, 153, 125);
+    m_pColorData->clrBorder[1] = ArgbEncode(255, 157, 171, 119);
+    m_pColorData->clrBorder[2] = ArgbEncode(255, 118, 131, 97);
+    m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
+    m_pColorData->clrStart[0] = ArgbEncode(255, 203, 215, 186);
+    m_pColorData->clrStart[1] = ArgbEncode(255, 218, 232, 185);
+    m_pColorData->clrStart[2] = ArgbEncode(255, 203, 215, 186);
+    m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
+    m_pColorData->clrEnd[0] = ArgbEncode(255, 149, 167, 117);
+    m_pColorData->clrEnd[1] = ArgbEncode(255, 198, 211, 155);
+    m_pColorData->clrEnd[2] = ArgbEncode(255, 149, 167, 117);
+    m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
+    m_pColorData->clrSign[0] = ArgbEncode(255, 255, 255, 255);
+    m_pColorData->clrSign[1] = ArgbEncode(255, 255, 255, 255);
+    m_pColorData->clrSign[2] = ArgbEncode(255, 255, 255, 255);
+    m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
+  } else {
+    m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249);
+    m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233);
+    m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219);
+    m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
+    m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254);
+    m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255);
+    m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241);
+    m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
+    m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251);
+    m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251);
+    m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235);
+    m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
+    m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133);
+    m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133);
+    m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133);
+    m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
+  }
+}
diff --git a/xfa/fxbarcode/BC_BarCode.cpp b/xfa/fxbarcode/BC_BarCode.cpp
new file mode 100644
index 0000000..11f47b5
--- /dev/null
+++ b/xfa/fxbarcode/BC_BarCode.cpp
@@ -0,0 +1,877 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/BC_DecoderResult.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Writer.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
+
+CBC_CodeBase::CBC_CodeBase() {}
+CBC_CodeBase::~CBC_CodeBase() {}
+FX_BOOL CBC_CodeBase::SetCharEncoding(int32_t encoding) {
+  if (m_pBCWriter) {
+    return m_pBCWriter->SetCharEncoding(encoding);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_CodeBase::SetModuleHeight(int32_t moduleHeight) {
+  if (m_pBCWriter) {
+    return m_pBCWriter->SetModuleHeight(moduleHeight);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_CodeBase::SetModuleWidth(int32_t moduleWidth) {
+  if (m_pBCWriter) {
+    return m_pBCWriter->SetModuleWidth(moduleWidth);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_CodeBase::SetHeight(int32_t height) {
+  if (m_pBCWriter) {
+    return m_pBCWriter->SetHeight(height);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_CodeBase::SetWidth(int32_t width) {
+  if (m_pBCWriter) {
+    return m_pBCWriter->SetWidth(width);
+  }
+  return FALSE;
+}
+void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) {
+  if (m_pBCWriter) {
+    m_pBCWriter->SetBackgroundColor(backgroundColor);
+  }
+}
+void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) {
+  if (m_pBCWriter) {
+    m_pBCWriter->SetBarcodeColor(foregroundColor);
+  }
+}
+CBC_OneCode::CBC_OneCode() {}
+CBC_OneCode::~CBC_OneCode() {}
+FX_BOOL CBC_OneCode::CheckContentValidity(const CFX_WideStringC& contents) {
+  if (m_pBCWriter) {
+    return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents);
+  }
+  return FALSE;
+}
+CFX_WideString CBC_OneCode::FilterContents(const CFX_WideStringC& contents) {
+  CFX_WideString tmp;
+  if (m_pBCWriter == NULL) {
+    return tmp;
+  }
+  return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+}
+void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum);
+  }
+}
+void CBC_OneCode::SetDataLength(int32_t length) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length);
+  }
+}
+void CBC_OneCode::SetCalChecksum(FX_BOOL calc) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc);
+  }
+}
+FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) {
+  if (m_pBCWriter) {
+    return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont);
+  }
+  return FALSE;
+}
+void CBC_OneCode::SetFontSize(FX_FLOAT size) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size);
+  }
+}
+void CBC_OneCode::SetFontStyle(int32_t style) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style);
+  }
+}
+void CBC_OneCode::SetFontColor(FX_ARGB color) {
+  if (m_pBCWriter) {
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color);
+  }
+}
+CBC_Code39::CBC_Code39() {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode39Reader);
+  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCode39Writer);
+}
+CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) {
+  m_pBCReader = (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit);
+  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer;
+}
+CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) {
+  m_pBCReader =
+      (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit, extendedMode);
+  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer(extendedMode);
+}
+CBC_Code39::~CBC_Code39() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_Code39::Encode(const CFX_WideStringC& contents,
+                           FX_BOOL isDevice,
+                           int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODE_39;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString filtercontents =
+      ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents);
+  CFX_WideString renderContents =
+      ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents);
+  m_renderContents = renderContents;
+  CFX_ByteString byteString = filtercontents.UTF8Encode();
+  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(renderContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device,
+                                 const CFX_Matrix* matirx,
+                                 int32_t& e) {
+  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
+                                 ->encodedContents(m_renderContents, e);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
+                                 ->encodedContents(m_renderContents, e);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_Code39::Decode(uint8_t* buf,
+                                  int32_t width,
+                                  int32_t hight,
+                                  int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_Code39::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_Code39::SetWideNarrowRatio(int32_t ratio) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+  }
+  return FALSE;
+}
+CBC_Codabar::CBC_Codabar() {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedCodaBarReader);
+  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCodaBarWriter);
+}
+CBC_Codabar::~CBC_Codabar() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
+  return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetTextLocation(location);
+}
+FX_BOOL CBC_Codabar::SetWideNarrowRatio(int32_t ratio) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_Codabar::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODABAR;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString filtercontents =
+      ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+  CFX_ByteString byteString = filtercontents.UTF8Encode();
+  m_renderContents = filtercontents;
+  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(filtercontents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  CFX_WideString renderCon =
+      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  CFX_WideString renderCon =
+      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_Codabar::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+CBC_Code128::CBC_Code128(BC_TYPE type) {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode128Reader);
+  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode128Writer(type);
+}
+CBC_Code128::~CBC_Code128() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) {
+  if (m_pBCWriter) {
+    return ((CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location);
+  }
+  return FALSE;
+}
+FX_BOOL CBC_Code128::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODE_128;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString content = contents;
+  if (contents.GetLength() % 2 &&
+      ((CBC_OnedCode128Writer*)m_pBCWriter)->GetType() == BC_CODE128_C) {
+    content += '0';
+  }
+  CFX_WideString encodeContents =
+      ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content);
+  m_renderContents = encodeContents;
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_Code128::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_Code128::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+CBC_EAN8::CBC_EAN8() {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN8Reader);
+  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN8Writer);
+}
+CBC_EAN8::~CBC_EAN8() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+CFX_WideString CBC_EAN8::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
+  int32_t length = encodeContents.GetLength();
+  if (length <= 7) {
+    for (int32_t i = 0; i < 7 - length; i++) {
+      encodeContents = FX_WCHAR('0') + encodeContents;
+    }
+    CFX_ByteString byteString = encodeContents.UTF8Encode();
+    int32_t checksum =
+        ((CBC_OnedEAN8Writer*)m_pBCWriter)->CalcChecksum(byteString);
+    encodeContents += FX_WCHAR(checksum - 0 + '0');
+  }
+  if (length > 8) {
+    encodeContents = encodeContents.Mid(0, 8);
+  }
+  return encodeContents;
+}
+FX_BOOL CBC_EAN8::Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_EAN_8;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString encodeContents = Preprocess(contents);
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  m_renderContents = encodeContents;
+  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_EAN8::Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+CBC_EAN13::CBC_EAN13() {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN13Reader);
+  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN13Writer);
+}
+CBC_EAN13::~CBC_EAN13() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+CFX_WideString CBC_EAN13::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
+  int32_t length = encodeContents.GetLength();
+  if (length <= 12) {
+    for (int32_t i = 0; i < 12 - length; i++) {
+      encodeContents = FX_WCHAR('0') + encodeContents;
+    }
+    CFX_ByteString byteString = encodeContents.UTF8Encode();
+    int32_t checksum =
+        ((CBC_OnedEAN13Writer*)m_pBCWriter)->CalcChecksum(byteString);
+    byteString += checksum - 0 + '0';
+    encodeContents = byteString.UTF8Decode();
+  }
+  if (length > 13) {
+    encodeContents = encodeContents.Mid(0, 13);
+  }
+  return encodeContents;
+}
+FX_BOOL CBC_EAN13::Encode(const CFX_WideStringC& contents,
+                          FX_BOOL isDevice,
+                          int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_EAN_13;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString encodeContents = Preprocess(contents);
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  m_renderContents = encodeContents;
+  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
+                                const CFX_Matrix* matirx,
+                                int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_EAN13::Decode(uint8_t* buf,
+                                 int32_t width,
+                                 int32_t hight,
+                                 int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+CBC_UPCA::CBC_UPCA() {
+  m_pBCReader = (CBC_Reader*)new (CBC_OnedUPCAReader);
+  ((CBC_OnedUPCAReader*)m_pBCReader)->Init();
+  m_pBCWriter = (CBC_Writer*)new (CBC_OnedUPCAWriter);
+}
+CBC_UPCA::~CBC_UPCA() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+CFX_WideString CBC_UPCA::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
+  int32_t length = encodeContents.GetLength();
+  if (length <= 11) {
+    for (int32_t i = 0; i < 11 - length; i++) {
+      encodeContents = FX_WCHAR('0') + encodeContents;
+    }
+    CFX_ByteString byteString = encodeContents.UTF8Encode();
+    int32_t checksum =
+        ((CBC_OnedUPCAWriter*)m_pBCWriter)->CalcChecksum(byteString);
+    byteString += checksum - 0 + '0';
+    encodeContents = byteString.UTF8Decode();
+  }
+  if (length > 12) {
+    encodeContents = encodeContents.Mid(0, 12);
+  }
+  return encodeContents;
+}
+FX_BOOL CBC_UPCA::Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_UPC_A;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString encodeContents = Preprocess(contents);
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  m_renderContents = encodeContents;
+  ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init();
+  uint8_t* data = static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_UPCA::Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+CBC_QRCode::CBC_QRCode() {
+  m_pBCReader = (CBC_Reader*)new (CBC_QRCodeReader);
+  ((CBC_QRCodeReader*)m_pBCReader)->Init();
+  m_pBCWriter = (CBC_Writer*)new (CBC_QRCodeWriter);
+}
+CBC_QRCode::~CBC_QRCode() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_QRCode::SetVersion(int32_t version) {
+  if (version < 0 || version > 40) {
+    return FALSE;
+  }
+  if (m_pBCWriter == NULL) {
+    return FALSE;
+  }
+  return ((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version);
+}
+FX_BOOL CBC_QRCode::SetErrorCorrectionLevel(int32_t level) {
+  if (level < 0 || level > 3) {
+    return FALSE;
+  }
+  if (m_pBCWriter == NULL) {
+    return FALSE;
+  }
+  return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level);
+}
+FX_BOOL CBC_QRCode::Encode(const CFX_WideStringC& contents,
+                           FX_BOOL isDevice,
+                           int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_QRCodeWriter*)m_pBCWriter)
+                      ->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)
+                                             ->GetErrorCorrectionLevel(),
+                               outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device,
+                                 const CFX_Matrix* matirx,
+                                 int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_QRCode::Decode(uint8_t* buf,
+                                  int32_t width,
+                                  int32_t hight,
+                                  int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
+}
+CBC_PDF417I::CBC_PDF417I() {
+  m_pBCReader = (CBC_Reader*)new (CBC_PDF417Reader);
+  m_pBCWriter = (CBC_Writer*)new (CBC_PDF417Writer);
+}
+CBC_PDF417I::~CBC_PDF417I() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel(int32_t level) {
+  ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level);
+  return TRUE;
+}
+void CBC_PDF417I::SetTruncated(FX_BOOL truncated) {
+  ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated);
+}
+FX_BOOL CBC_PDF417I::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_PDF417Writer*)m_pBCWriter)
+                      ->Encode(contents, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_PDF417I::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength());
+}
+CBC_DataMatrix::CBC_DataMatrix() {
+  m_pBCReader = (CBC_Reader*)new (CBC_DataMatrixReader);
+  ((CBC_DataMatrixReader*)m_pBCReader)->Init();
+  m_pBCWriter = (CBC_Writer*)new (CBC_DataMatrixWriter);
+}
+CBC_DataMatrix::~CBC_DataMatrix() {
+  if (m_pBCReader) {
+    delete (m_pBCReader);
+    m_pBCReader = NULL;
+  }
+  if (m_pBCWriter) {
+    delete (m_pBCWriter);
+    m_pBCWriter = NULL;
+  }
+}
+FX_BOOL CBC_DataMatrix::Encode(const CFX_WideStringC& contents,
+                               FX_BOOL isDevice,
+                               int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_DataMatrixWriter*)m_pBCWriter)
+                      ->Encode(contents, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device,
+                                     const CFX_Matrix* matirx,
+                                     int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+CFX_WideString CBC_DataMatrix::Decode(uint8_t* buf,
+                                      int32_t width,
+                                      int32_t hight,
+                                      int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
+}
diff --git a/xfa/fxbarcode/BC_Binarizer.cpp b/xfa/fxbarcode/BC_Binarizer.cpp
new file mode 100644
index 0000000..d36d8fc
--- /dev/null
+++ b/xfa/fxbarcode/BC_Binarizer.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+
+CBC_Binarizer::CBC_Binarizer(CBC_LuminanceSource* source) {
+  m_source = source;
+}
+CBC_Binarizer::~CBC_Binarizer() {}
+CBC_LuminanceSource* CBC_Binarizer::GetLuminanceSource() {
+  return m_source;
+}
diff --git a/xfa/fxbarcode/BC_Binarizer.h b/xfa/fxbarcode/BC_Binarizer.h
new file mode 100644
index 0000000..20be039
--- /dev/null
+++ b/xfa/fxbarcode/BC_Binarizer.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_BINARIZER_H_
+#define XFA_FXBARCODE_BC_BINARIZER_H_
+
+#include <cstdint>
+
+class CBC_LuminanceSource;
+class CBC_CommonBitMatrix;
+class CBC_CommonBitArray;
+
+class CBC_Binarizer {
+ public:
+  CBC_Binarizer(CBC_LuminanceSource* source);
+  virtual ~CBC_Binarizer();
+  CBC_LuminanceSource* GetLuminanceSource();
+  virtual CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e) = 0;
+  virtual CBC_CommonBitArray* GetBlackRow(int32_t y,
+                                          CBC_CommonBitArray* row,
+                                          int32_t& e) = 0;
+
+ private:
+  CBC_LuminanceSource* m_source;
+};
+
+#endif  // XFA_FXBARCODE_BC_BINARIZER_H_
diff --git a/xfa/fxbarcode/BC_BinaryBitmap.cpp b/xfa/fxbarcode/BC_BinaryBitmap.cpp
new file mode 100644
index 0000000..ba08824e
--- /dev/null
+++ b/xfa/fxbarcode/BC_BinaryBitmap.cpp
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_BinaryBitmap::CBC_BinaryBitmap(CBC_Binarizer* binarizer)
+    : m_binarizer(binarizer), m_matrix(NULL) {}
+CBC_BinaryBitmap::~CBC_BinaryBitmap() {
+  delete m_matrix;
+}
+int32_t CBC_BinaryBitmap::GetHeight() {
+  return m_binarizer->GetLuminanceSource()->GetHeight();
+}
+int32_t CBC_BinaryBitmap::GetWidth() {
+  return m_binarizer->GetLuminanceSource()->GetWidth();
+}
+CBC_CommonBitMatrix* CBC_BinaryBitmap::GetMatrix(int32_t& e) {
+  if (m_matrix == NULL) {
+    m_matrix = m_binarizer->GetBlackMatrix(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return m_matrix;
+}
+CBC_CommonBitArray* CBC_BinaryBitmap::GetBlackRow(int32_t y,
+                                                  CBC_CommonBitArray* row,
+                                                  int32_t& e) {
+  CBC_CommonBitArray* temp = m_binarizer->GetBlackRow(y, row, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CBC_CommonBitMatrix* CBC_BinaryBitmap::GetBlackMatrix(int32_t& e) {
+  if (m_matrix == NULL) {
+    m_matrix = m_binarizer->GetBlackMatrix(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return m_matrix;
+}
diff --git a/xfa/fxbarcode/BC_BinaryBitmap.h b/xfa/fxbarcode/BC_BinaryBitmap.h
new file mode 100644
index 0000000..5f4dd87
--- /dev/null
+++ b/xfa/fxbarcode/BC_BinaryBitmap.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_BINARYBITMAP_H_
+#define XFA_FXBARCODE_BC_BINARYBITMAP_H_
+
+#include <cstdint>
+
+class CBC_Binarizer;
+class CBC_CommonBitMatrix;
+class CBC_CommonBitArray;
+
+class CBC_BinaryBitmap {
+ public:
+  CBC_BinaryBitmap(CBC_Binarizer* binarizer);
+  virtual ~CBC_BinaryBitmap();
+  int32_t GetWidth();
+  int32_t GetHeight();
+  CBC_CommonBitMatrix* GetMatrix(int32_t& e);
+  CBC_CommonBitArray* GetBlackRow(int32_t y,
+                                  CBC_CommonBitArray* row,
+                                  int32_t& e);
+  CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e);
+
+ private:
+  CBC_Binarizer* m_binarizer;
+  CBC_CommonBitMatrix* m_matrix;
+};
+
+#endif  // XFA_FXBARCODE_BC_BINARYBITMAP_H_
diff --git a/xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp b/xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp
new file mode 100644
index 0000000..86b19c1
--- /dev/null
+++ b/xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp
@@ -0,0 +1,171 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcodec/fx_codec.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_Pause : public IFX_Pause {
+ public:
+  virtual FX_BOOL NeedToPauseNow() { return TRUE; }
+};
+static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread) {
+  CFX_DIBitmap* bitmap = NULL;
+  CCodec_ModuleMgr* pCodecMgr = NULL;
+  ICodec_ProgressiveDecoder* pImageCodec = NULL;
+  pCodecMgr = new CCodec_ModuleMgr();
+  pImageCodec = pCodecMgr->CreateProgressiveDecoder();
+  FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH;
+  status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN, nullptr);
+  if (status != FXCODEC_STATUS_FRAME_READY) {
+    return NULL;
+  }
+  bitmap = new CFX_DIBitmap;
+  bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb);
+  bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF));
+  CBC_Pause pause;
+  int32_t frames;
+  status = pImageCodec->GetFrames(frames, &pause);
+  while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) {
+    status = pImageCodec->GetFrames(frames, &pause);
+  }
+  if (status != FXCODEC_STATUS_DECODE_READY) {
+    goto except;
+  }
+  status = pImageCodec->StartDecode(bitmap, 0, 0, bitmap->GetWidth(),
+                                    bitmap->GetHeight(), 0, FALSE);
+  if (status == FXCODEC_STATUS_ERR_PARAMS) {
+    goto except;
+  }
+  if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+    goto except;
+  }
+  while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+    status = pImageCodec->ContinueDecode(&pause);
+  }
+  if (status != FXCODEC_STATUS_DECODE_FINISH) {
+    goto except;
+  }
+  if (pImageCodec) {
+    delete pImageCodec;
+    pImageCodec = NULL;
+  }
+  delete pCodecMgr;
+  pCodecMgr = NULL;
+  return bitmap;
+except:
+  if (pImageCodec) {
+    delete pImageCodec;
+    pImageCodec = NULL;
+  }
+  delete pCodecMgr;
+  pCodecMgr = NULL;
+  if (bitmap) {
+    delete bitmap;
+  }
+  return NULL;
+}
+CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(
+    const CFX_WideString& filename)
+    : CBC_LuminanceSource(0, 0), m_filename(filename) {
+  m_height = 0;
+  m_width = 0;
+  m_bytesPerLine = 0;
+  m_top = 0;
+  m_left = 0;
+}
+void CBC_BufferedImageLuminanceSource::Init(int32_t& e) {
+  IFX_FileRead* fileread = FX_CreateFileRead(m_filename);
+  m_pBitmap = CreateDIBSource(fileread);
+  if (m_pBitmap == NULL) {
+    e = BCExceptionLoadFile;
+    return;
+  }
+  m_pBitmap->ConvertFormat(FXDIB_Argb);
+  m_height = m_pBitmap->GetHeight();
+  m_width = m_pBitmap->GetWidth();
+  m_rgbData.SetSize(m_height * m_width);
+  m_bytesPerLine = m_width * 4;
+  m_top = 0;
+  m_left = 0;
+}
+CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(
+    CFX_DIBitmap* pBitmap)
+    : CBC_LuminanceSource(0, 0) {
+  m_pBitmap = pBitmap->Clone();
+  m_pBitmap->ConvertFormat(FXDIB_Argb);
+  m_height = m_pBitmap->GetHeight();
+  m_width = m_pBitmap->GetWidth();
+  m_rgbData.SetSize(m_height * m_width);
+  m_bytesPerLine = m_width * 4;
+  m_top = 0;
+  m_left = 0;
+}
+CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource() {
+  delete m_pBitmap;
+  m_pBitmap = NULL;
+}
+CFX_ByteArray* CBC_BufferedImageLuminanceSource::GetRow(int32_t y,
+                                                        CFX_ByteArray& row,
+                                                        int32_t& e) {
+  if (y < 0 || y >= m_height) {
+    e = BCExceptionRequestedRowIsOutSizeTheImage;
+    return NULL;
+  }
+  int32_t width = m_width;
+  if (row.GetSize() == 0 || row.GetSize() < width) {
+    row.SetSize(width);
+  }
+  if (m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) {
+    m_rgbData.SetSize(width);
+  }
+  int32_t* rowLine = (int32_t*)m_pBitmap->GetScanline(y);
+  int32_t x;
+  for (x = 0; x < width; x++) {
+    int32_t pixel = rowLine[x];
+    int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +
+                         601 * ((pixel >> 8) & 0xFF) + 117 * (pixel & 0xFF)) >>
+                        10;
+    row[x] = (uint8_t)luminance;
+  }
+  return &row;
+}
+CFX_ByteArray* CBC_BufferedImageLuminanceSource::GetMatrix() {
+  CFX_ByteArray* matirx = new CFX_ByteArray();
+  matirx->SetSize(m_bytesPerLine * m_height);
+  int32_t* rgb = (int32_t*)m_pBitmap->GetBuffer();
+  int32_t y;
+  for (y = 0; y < m_height; y++) {
+    int32_t offset = y * m_width;
+    int32_t x;
+    for (x = 0; x < m_width; x++) {
+      int32_t pixel = rgb[offset + x];
+      int32_t luminance =
+          (306 * ((pixel >> 16) & 0xFF) + 601 * ((pixel >> 8) & 0xFF) +
+           117 * (pixel & 0xFF)) >>
+          10;
+      (*matirx)[offset + x] = (uint8_t)luminance;
+    }
+  }
+  return matirx;
+}
diff --git a/xfa/fxbarcode/BC_BufferedImageLuminanceSource.h b/xfa/fxbarcode/BC_BufferedImageLuminanceSource.h
new file mode 100644
index 0000000..e39f4d6
--- /dev/null
+++ b/xfa/fxbarcode/BC_BufferedImageLuminanceSource.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
+#define XFA_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+
+class CBC_BufferedImageLuminanceSource : public CBC_LuminanceSource {
+ public:
+  explicit CBC_BufferedImageLuminanceSource(const CFX_WideString& filename);
+  explicit CBC_BufferedImageLuminanceSource(CFX_DIBitmap* pBitmap);
+  virtual ~CBC_BufferedImageLuminanceSource();
+
+  CFX_ByteArray* GetRow(int32_t y, CFX_ByteArray& row, int32_t& e);
+  CFX_ByteArray* GetMatrix();
+  virtual void Init(int32_t& e);
+
+ private:
+  int32_t m_bytesPerLine;
+  int32_t m_left;
+  int32_t m_top;
+  CFX_Int32Array m_rgbData;
+  CFX_DIBitmap* m_pBitmap;
+  const CFX_WideString m_filename;
+};
+
+#endif  // XFA_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
diff --git a/xfa/fxbarcode/BC_DecoderResult.h b/xfa/fxbarcode/BC_DecoderResult.h
new file mode 100644
index 0000000..c3008c5
--- /dev/null
+++ b/xfa/fxbarcode/BC_DecoderResult.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_DECODERRESULT_H_
+#define XFA_FXBARCODE_BC_DECODERRESULT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_DecoderResult {
+ public:
+  CBC_DecoderResult(CFX_ByteArray* rawBytes,
+                    CFX_ByteString text,
+                    CFX_ByteString ecLevel);
+  virtual ~CBC_DecoderResult();
+  CFX_ByteArray* getRawBytes();
+  CFX_ByteString getText();
+  CFX_ByteString getECLevel();
+  int32_t getErrorsCorrected();
+  void setErrorsCorrected(int32_t errorsCorrected);
+  int32_t getErasures();
+  void setErasures(int32_t erasures);
+  void* getOther();
+  void setOther(void* other);
+
+ private:
+  CFX_ByteArray* m_rawBytes;
+  CFX_ByteString m_text;
+  CFX_ByteString m_ecLevel;
+  int32_t m_errorsCorrected;
+  int32_t m_erasures;
+  void* m_other;
+};
+
+#endif  // XFA_FXBARCODE_BC_DECODERRESULT_H_
diff --git a/xfa/fxbarcode/BC_Dimension.cpp b/xfa/fxbarcode/BC_Dimension.cpp
new file mode 100644
index 0000000..0cb076c
--- /dev/null
+++ b/xfa/fxbarcode/BC_Dimension.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+CBC_Dimension::CBC_Dimension() {}
+CBC_Dimension::CBC_Dimension(int32_t width, int32_t height, int32_t& e) {
+  if (width < 0 || height < 0) {
+    e = BCExceptionHeightAndWidthMustBeAtLeast1;
+  }
+  m_width = width;
+  m_height = height;
+}
+CBC_Dimension::~CBC_Dimension() {}
+int32_t CBC_Dimension::getWidth() {
+  return m_width;
+}
+int32_t CBC_Dimension::getHeight() {
+  return m_height;
+}
+int32_t CBC_Dimension::hashCode() {
+  return m_width * 32713 + m_height;
+}
+CFX_WideString CBC_Dimension::toString() {
+  return (FX_WCHAR)(m_width + (FX_WCHAR)'x' + m_height);
+}
diff --git a/xfa/fxbarcode/BC_Dimension.h b/xfa/fxbarcode/BC_Dimension.h
new file mode 100644
index 0000000..e3253b3
--- /dev/null
+++ b/xfa/fxbarcode/BC_Dimension.h
@@ -0,0 +1,29 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_DIMENSION_H_
+#define XFA_FXBARCODE_BC_DIMENSION_H_
+
+#include <cstdint>
+
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_Dimension {
+ public:
+  CBC_Dimension();
+  CBC_Dimension(int32_t width, int32_t height, int32_t& e);
+  virtual ~CBC_Dimension();
+  int32_t getWidth();
+  int32_t getHeight();
+  int32_t hashCode();
+  CFX_WideString toString();
+
+ private:
+  int32_t m_width;
+  int32_t m_height;
+};
+
+#endif  // XFA_FXBARCODE_BC_DIMENSION_H_
diff --git a/xfa/fxbarcode/BC_Library.cpp b/xfa/fxbarcode/BC_Library.cpp
new file mode 100644
index 0000000..d6da15c
--- /dev/null
+++ b/xfa/fxbarcode/BC_Library.cpp
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/BC_DecoderResult.h"
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
+#include "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h"
+#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
+
+void BC_Library_Init() {
+  CBC_QRCoderErrorCorrectionLevel::Initialize();
+  CBC_QRCoderMode::Initialize();
+  CBC_QRCoderVersion::Initialize();
+  CBC_QRDataMask::Initialize();
+  CBC_ReedSolomonGF256::Initialize();
+  CBC_DataMatrixVersion::Initialize();
+  CBC_SymbolInfo::Initialize();
+  CBC_ErrorCorrection::Initialize();
+  CBC_PDF417HighLevelEncoder::Initialize();
+  int32_t e = 0;
+  CBC_PDF417ECModulusGF::Initialize(e);
+  CBC_DecodedBitStreamPaser::Initialize();
+  CBC_PDF417CodewordDecoder::Initialize();
+  CBC_PDF417ECErrorCorrection::Initialize(e);
+  CBC_PDF417ScanningDecoder::Initialize();
+}
+void BC_Library_Destory() {
+  CBC_QRCoderErrorCorrectionLevel::Finalize();
+  CBC_QRCoderMode::Finalize();
+  CBC_QRCoderVersion::Finalize();
+  CBC_QRDataMask::Finalize();
+  CBC_ReedSolomonGF256::Finalize();
+  CBC_DataMatrixVersion::Finalize();
+  CBC_SymbolInfo::Finalize();
+  CBC_ErrorCorrection::Finalize();
+  CBC_PDF417HighLevelEncoder::Finalize();
+  CBC_DecodedBitStreamPaser::Finalize();
+  CBC_PDF417CodewordDecoder::Finalize();
+  CBC_PDF417ECErrorCorrection::Finalize();
+  CBC_PDF417ECModulusGF::Finalize();
+  CBC_PDF417ScanningDecoder::Finalize();
+}
diff --git a/xfa/fxbarcode/BC_LuminanceSource.cpp b/xfa/fxbarcode/BC_LuminanceSource.cpp
new file mode 100644
index 0000000..0aaa096
--- /dev/null
+++ b/xfa/fxbarcode/BC_LuminanceSource.cpp
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+
+CBC_LuminanceSource::CBC_LuminanceSource(int32_t width, int32_t height)
+    : m_width(width), m_height(height) {}
+CBC_LuminanceSource::~CBC_LuminanceSource() {}
+int32_t CBC_LuminanceSource::GetWidth() {
+  return m_width;
+}
+int32_t CBC_LuminanceSource::GetHeight() {
+  return m_height;
+}
diff --git a/xfa/fxbarcode/BC_LuminanceSource.h b/xfa/fxbarcode/BC_LuminanceSource.h
new file mode 100644
index 0000000..b4b3ebc
--- /dev/null
+++ b/xfa/fxbarcode/BC_LuminanceSource.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_LUMINANCESOURCE_H_
+#define XFA_FXBARCODE_BC_LUMINANCESOURCE_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_LuminanceSource {
+ public:
+  CBC_LuminanceSource(int32_t width, int32_t height);
+  virtual ~CBC_LuminanceSource();
+  int32_t GetWidth();
+  int32_t GetHeight();
+
+  virtual CFX_ByteArray* GetRow(int32_t y, CFX_ByteArray& row, int32_t& e) = 0;
+  virtual CFX_ByteArray* GetMatrix() = 0;
+
+ protected:
+  int32_t m_width;
+  int32_t m_height;
+};
+
+#endif  // XFA_FXBARCODE_BC_LUMINANCESOURCE_H_
diff --git a/xfa/fxbarcode/BC_Reader.cpp b/xfa/fxbarcode/BC_Reader.cpp
new file mode 100644
index 0000000..9391da1
--- /dev/null
+++ b/xfa/fxbarcode/BC_Reader.cpp
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxbarcode/BC_Reader.h"
+
+CBC_Reader::CBC_Reader() {}
+CBC_Reader::~CBC_Reader() {}
diff --git a/xfa/fxbarcode/BC_Reader.h b/xfa/fxbarcode/BC_Reader.h
new file mode 100644
index 0000000..12cfd24
--- /dev/null
+++ b/xfa/fxbarcode/BC_Reader.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_READER_H_
+#define XFA_FXBARCODE_BC_READER_H_
+
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_BinaryBitmap;
+
+class CBC_Reader {
+ public:
+  CBC_Reader();
+  virtual ~CBC_Reader();
+  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e) = 0;
+  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image,
+                                int32_t hints,
+                                int32_t& e) = 0;
+};
+
+#endif  // XFA_FXBARCODE_BC_READER_H_
diff --git a/xfa/fxbarcode/BC_ResultPoint.cpp b/xfa/fxbarcode/BC_ResultPoint.cpp
new file mode 100644
index 0000000..9726ea4
--- /dev/null
+++ b/xfa/fxbarcode/BC_ResultPoint.cpp
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+
+CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y) : m_x(x), m_y(y) {}
+FX_FLOAT CBC_ResultPoint::GetX() {
+  return m_x;
+}
+FX_FLOAT CBC_ResultPoint::GetY() {
+  return m_y;
+}
diff --git a/xfa/fxbarcode/BC_ResultPoint.h b/xfa/fxbarcode/BC_ResultPoint.h
new file mode 100644
index 0000000..721adb1
--- /dev/null
+++ b/xfa/fxbarcode/BC_ResultPoint.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_RESULTPOINT_H_
+#define XFA_FXBARCODE_BC_RESULTPOINT_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CBC_ResultPoint {
+ public:
+  CBC_ResultPoint();
+  CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y);
+  virtual ~CBC_ResultPoint() {}
+  virtual FX_FLOAT GetX();
+  virtual FX_FLOAT GetY();
+
+ protected:
+  FX_FLOAT m_x;
+  FX_FLOAT m_y;
+};
+
+#endif  // XFA_FXBARCODE_BC_RESULTPOINT_H_
diff --git a/xfa/fxbarcode/BC_TwoDimWriter.cpp b/xfa/fxbarcode/BC_TwoDimWriter.cpp
new file mode 100644
index 0000000..f0065a0
--- /dev/null
+++ b/xfa/fxbarcode/BC_TwoDimWriter.cpp
@@ -0,0 +1,148 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <algorithm>
+
+#include "third_party/base/numerics/safe_math.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+
+CBC_TwoDimWriter::CBC_TwoDimWriter() {
+  m_iCorrectLevel = 1;
+  m_bFixedSize = TRUE;
+  m_output = NULL;
+}
+CBC_TwoDimWriter::~CBC_TwoDimWriter() {
+  delete m_output;
+}
+void CBC_TwoDimWriter::RenderDeviceResult(CFX_RenderDevice* device,
+                                          const CFX_Matrix* matrix) {
+  CFX_GraphStateData stateData;
+  CFX_PathData path;
+  path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height);
+  device->DrawPath(&path, matrix, &stateData, m_backgroundColor,
+                   m_backgroundColor, FXFILL_ALTERNATE);
+  int32_t leftPos = 0;
+  int32_t topPos = 0;
+  if (m_bFixedSize) {
+    leftPos = (m_Width - m_output->GetWidth()) / 2;
+    topPos = (m_Height - m_output->GetHeight()) / 2;
+  }
+  CFX_Matrix matri = *matrix;
+  if (m_Width < m_output->GetWidth() && m_Height < m_output->GetHeight()) {
+    CFX_Matrix matriScale(
+        (FX_FLOAT)m_Width / (FX_FLOAT)m_output->GetWidth(), 0.0, 0.0,
+        (FX_FLOAT)m_Height / (FX_FLOAT)m_output->GetHeight(), 0.0, 0.0);
+    matriScale.Concat(*matrix);
+    matri = matriScale;
+  }
+  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
+    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
+      CFX_PathData rect;
+      rect.AppendRect((FX_FLOAT)leftPos + x, (FX_FLOAT)topPos + y,
+                      (FX_FLOAT)(leftPos + x + 1), (FX_FLOAT)(topPos + y + 1));
+      CFX_GraphStateData stateData;
+      if (m_output->Get(x, y)) {
+        device->DrawPath(&rect, &matri, &stateData, m_barColor, 0,
+                         FXFILL_WINDING);
+      }
+    }
+  }
+}
+void CBC_TwoDimWriter::RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
+                                          int32_t& e) {
+  if (m_bFixedSize) {
+    pOutBitmap = CreateDIBitmap(m_Width, m_Height);
+  } else {
+    pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight());
+  }
+  if (!pOutBitmap) {
+    e = BCExceptionFailToCreateBitmap;
+    return;
+  }
+  pOutBitmap->Clear(m_backgroundColor);
+  int32_t leftPos = 0;
+  int32_t topPos = 0;
+  if (m_bFixedSize) {
+    leftPos = (m_Width - m_output->GetWidth()) / 2;
+    topPos = (m_Height - m_output->GetHeight()) / 2;
+  }
+  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
+    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
+      if (m_output->Get(x, y)) {
+        pOutBitmap->SetPixel(leftPos + x, topPos + y, m_barColor);
+      }
+    }
+  }
+  if (!m_bFixedSize) {
+    CFX_DIBitmap* pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height);
+    if (pOutBitmap) {
+      delete pOutBitmap;
+    }
+    pOutBitmap = pStretchBitmap;
+  }
+}
+void CBC_TwoDimWriter::RenderResult(uint8_t* code,
+                                    int32_t codeWidth,
+                                    int32_t codeHeight,
+                                    int32_t& e) {
+  int32_t inputWidth = codeWidth;
+  int32_t inputHeight = codeHeight;
+  int32_t tempWidth = inputWidth + 2;
+  int32_t tempHeight = inputHeight + 2;
+  FX_FLOAT moduleHSize = std::min(m_ModuleWidth, m_ModuleHeight);
+  moduleHSize = std::min(moduleHSize, 8.0f);
+  moduleHSize = std::max(moduleHSize, 1.0f);
+  pdfium::base::CheckedNumeric<int32_t> scaledWidth = tempWidth;
+  pdfium::base::CheckedNumeric<int32_t> scaledHeight = tempHeight;
+  scaledWidth *= moduleHSize;
+  scaledHeight *= moduleHSize;
+
+  int32_t outputWidth = scaledWidth.ValueOrDie();
+  int32_t outputHeight = scaledHeight.ValueOrDie();
+  if (m_bFixedSize) {
+    if (m_Width < outputWidth || m_Height < outputHeight) {
+      e = BCExceptionBitmapSizeError;
+      return;
+    }
+  } else {
+    if (m_Width > outputWidth || m_Height > outputHeight) {
+      outputWidth = (int32_t)(outputWidth *
+                              ceil((FX_FLOAT)m_Width / (FX_FLOAT)outputWidth));
+      outputHeight = (int32_t)(
+          outputHeight * ceil((FX_FLOAT)m_Height / (FX_FLOAT)outputHeight));
+    }
+  }
+  int32_t multiX = (int32_t)ceil((FX_FLOAT)outputWidth / (FX_FLOAT)tempWidth);
+  int32_t multiY = (int32_t)ceil((FX_FLOAT)outputHeight / (FX_FLOAT)tempHeight);
+  if (m_bFixedSize) {
+    multiX = std::min(multiX, multiY);
+    multiY = multiX;
+  }
+  int32_t leftPadding = (outputWidth - (inputWidth * multiX)) / 2;
+  int32_t topPadding = (outputHeight - (inputHeight * multiY)) / 2;
+  if (leftPadding < 0) {
+    leftPadding = 0;
+  }
+  if (topPadding < 0) {
+    topPadding = 0;
+  }
+  m_output = new CBC_CommonBitMatrix;
+  m_output->Init(outputWidth, outputHeight);
+  for (int32_t inputY = 0, outputY = topPadding;
+       (inputY < inputHeight) && (outputY < outputHeight - multiY);
+       inputY++, outputY += multiY) {
+    for (int32_t inputX = 0, outputX = leftPadding;
+         (inputX < inputWidth) && (outputX < outputWidth - multiX);
+         inputX++, outputX += multiX) {
+      if (code[inputX + inputY * inputWidth] == 1) {
+        m_output->SetRegion(outputX, outputY, multiX, multiY, e);
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+    }
+  }
+}
diff --git a/xfa/fxbarcode/BC_TwoDimWriter.h b/xfa/fxbarcode/BC_TwoDimWriter.h
new file mode 100644
index 0000000..f5dcd61
--- /dev/null
+++ b/xfa/fxbarcode/BC_TwoDimWriter.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_TWODIMWRITER_H_
+#define XFA_FXBARCODE_BC_TWODIMWRITER_H_
+
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+
+class CBC_CommonBitMatrix;
+
+class CBC_TwoDimWriter : public CBC_Writer {
+ public:
+  CBC_TwoDimWriter();
+  virtual ~CBC_TwoDimWriter();
+  virtual void RenderResult(uint8_t* code,
+                            int32_t codeWidth,
+                            int32_t codeHeight,
+                            int32_t& e);
+  virtual void RenderBitmapResult(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+  virtual void RenderDeviceResult(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matrix);
+  virtual FX_BOOL SetErrorCorrectionLevel(int32_t level) = 0;
+  virtual int32_t GetErrorCorrectionLevel() { return m_iCorrectLevel; }
+
+ protected:
+  int32_t m_iCorrectLevel;
+  FX_BOOL m_bFixedSize;
+  CBC_CommonBitMatrix* m_output;
+};
+
+#endif  // XFA_FXBARCODE_BC_TWODIMWRITER_H_
diff --git a/xfa/fxbarcode/BC_UtilCodingConvert.cpp b/xfa/fxbarcode/BC_UtilCodingConvert.cpp
new file mode 100644
index 0000000..8421e28
--- /dev/null
+++ b/xfa/fxbarcode/BC_UtilCodingConvert.cpp
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+
+CBC_UtilCodingConvert::CBC_UtilCodingConvert() {}
+
+CBC_UtilCodingConvert::~CBC_UtilCodingConvert() {}
+
+void CBC_UtilCodingConvert::UnicodeToLocale(const CFX_WideString& src,
+                                            CFX_ByteString& dst) {
+  dst = CFX_ByteString::FromUnicode(src);
+}
+
+void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString& src,
+                                         CFX_ByteString& dst) {
+  CFX_WideString unicode = CFX_WideString::FromLocal(src);
+  dst = unicode.UTF8Encode();
+}
+
+void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString& src,
+                                         CFX_ByteArray& dst) {
+  CFX_WideString unicode = CFX_WideString::FromLocal(src);
+  CFX_ByteString utf8 = unicode.UTF8Encode();
+  for (int32_t i = 0; i < utf8.GetLength(); i++) {
+    dst.Add(utf8[i]);
+  }
+}
+
+void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray& src,
+                                         CFX_ByteString& dst) {
+  CFX_ByteString utf8;
+  for (int32_t i = 0; i < src.GetSize(); i++) {
+    utf8 += src[i];
+  }
+  CFX_WideString unicode = CFX_WideString::FromUTF8(utf8, utf8.GetLength());
+  dst = CFX_ByteString::FromUnicode(unicode);
+}
+
+void CBC_UtilCodingConvert::Utf8ToLocale(const uint8_t* src,
+                                         int32_t count,
+                                         CFX_ByteString& dst) {
+  CFX_WideString unicode = CFX_WideString::FromUTF8((const char*)src, count);
+  dst = CFX_ByteString::FromUnicode(unicode);
+}
+
+void CBC_UtilCodingConvert::UnicodeToUTF8(const CFX_WideString& src,
+                                          CFX_ByteString& dst) {
+  dst = src.UTF8Encode();
+}
diff --git a/xfa/fxbarcode/BC_UtilCodingConvert.h b/xfa/fxbarcode/BC_UtilCodingConvert.h
new file mode 100644
index 0000000..2d5c9f3
--- /dev/null
+++ b/xfa/fxbarcode/BC_UtilCodingConvert.h
@@ -0,0 +1,29 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_UTILCODINGCONVERT_H_
+#define XFA_FXBARCODE_BC_UTILCODINGCONVERT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_UtilCodingConvert {
+ public:
+  CBC_UtilCodingConvert();
+  virtual ~CBC_UtilCodingConvert();
+  static void UnicodeToLocale(const CFX_WideString& source,
+                              CFX_ByteString& result);
+  static void LocaleToUtf8(const CFX_ByteString& source,
+                           CFX_ByteString& result);
+  static void LocaleToUtf8(const CFX_ByteString& source, CFX_ByteArray& result);
+  static void Utf8ToLocale(const CFX_ByteArray& source, CFX_ByteString& result);
+  static void Utf8ToLocale(const uint8_t* source,
+                           int32_t count,
+                           CFX_ByteString& result);
+  static void UnicodeToUTF8(const CFX_WideString& source,
+                            CFX_ByteString& result);
+};
+
+#endif  // XFA_FXBARCODE_BC_UTILCODINGCONVERT_H_
diff --git a/xfa/fxbarcode/BC_UtilRSS.cpp b/xfa/fxbarcode/BC_UtilRSS.cpp
new file mode 100644
index 0000000..0d6133c
--- /dev/null
+++ b/xfa/fxbarcode/BC_UtilRSS.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_UtilRSS.h"
+
+#include <memory>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_UtilRSS::CBC_UtilRSS() {}
+CBC_UtilRSS::~CBC_UtilRSS() {}
+CFX_Int32Array* CBC_UtilRSS::GetRssWidths(int32_t val,
+                                          int32_t n,
+                                          int32_t elements,
+                                          int32_t maxWidth,
+                                          FX_BOOL noNarrow) {
+  std::unique_ptr<CFX_Int32Array> widths(new CFX_Int32Array);
+  widths->SetSize(elements);
+  int32_t bar;
+  int32_t narrowMask = 0;
+  for (bar = 0; bar < elements - 1; bar++) {
+    narrowMask |= (1 << bar);
+    int32_t elmWidth = 1;
+    int32_t subVal;
+    while (TRUE) {
+      subVal = Combins(n - elmWidth - 1, elements - bar - 2);
+      if (noNarrow && (narrowMask == 0) &&
+          (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
+        subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2);
+      }
+      if (elements - bar - 1 > 1) {
+        int32_t lessVal = 0;
+        for (int32_t mxwElement = n - elmWidth - (elements - bar - 2);
+             mxwElement > maxWidth; mxwElement--) {
+          lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
+        }
+        subVal -= lessVal * (elements - 1 - bar);
+      } else if (n - elmWidth > maxWidth) {
+        subVal--;
+      }
+      val -= subVal;
+      if (val < 0) {
+        break;
+      }
+      elmWidth++;
+      narrowMask &= ~(1 << bar);
+    }
+    val += subVal;
+    n -= elmWidth;
+    (*widths)[bar] = elmWidth;
+  }
+  (*widths)[bar] = n;
+  return widths.release();
+}
+int32_t CBC_UtilRSS::GetRSSvalue(CFX_Int32Array& widths,
+                                 int32_t maxWidth,
+                                 FX_BOOL noNarrow) {
+  int32_t elements = widths.GetSize();
+  int32_t n = 0;
+  for (int32_t i = 0; i < elements; i++) {
+    n += widths[i];
+  }
+  int32_t val = 0;
+  int32_t narrowMask = 0;
+  for (int32_t bar = 0; bar < elements - 1; bar++) {
+    int32_t elmWidth;
+    for (elmWidth = 1, narrowMask |= (1 << bar); elmWidth < widths[bar];
+         elmWidth++, narrowMask &= ~(1 << bar)) {
+      int32_t subVal = Combins(n - elmWidth - 1, elements - bar - 2);
+      if (noNarrow && (narrowMask == 0) &&
+          (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
+        subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2);
+      }
+      if (elements - bar - 1 > 1) {
+        int32_t lessVal = 0;
+        for (int32_t mxwElement = n - elmWidth - (elements - bar - 2);
+             mxwElement > maxWidth; mxwElement--) {
+          lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
+        }
+        subVal -= lessVal * (elements - 1 - bar);
+      } else if (n - elmWidth > maxWidth) {
+        subVal--;
+      }
+      val += subVal;
+    }
+    n -= elmWidth;
+  }
+  return val;
+}
+int32_t CBC_UtilRSS::Combins(int32_t n, int32_t r) {
+  int32_t maxDenom;
+  int32_t minDenom;
+  if (n - r > r) {
+    minDenom = r;
+    maxDenom = n - r;
+  } else {
+    minDenom = n - r;
+    maxDenom = r;
+  }
+  int32_t val = 1;
+  int32_t j = 1;
+  for (int32_t i = n; i > maxDenom; i--) {
+    val *= i;
+    if (j <= minDenom) {
+      val /= j;
+      j++;
+    }
+  }
+  while (j <= minDenom) {
+    val /= j;
+    j++;
+  }
+  return val;
+}
+CFX_Int32Array* CBC_UtilRSS::Elements(CFX_Int32Array& eDist,
+                                      int32_t N,
+                                      int32_t K) {
+  CFX_Int32Array* widths = new CFX_Int32Array;
+  widths->SetSize(eDist.GetSize() + 2);
+  int32_t twoK = K << 1;
+  (*widths)[0] = 1;
+  int32_t i;
+  int32_t minEven = 10;
+  int32_t barSum = 1;
+  for (i = 1; i < twoK - 2; i += 2) {
+    (*widths)[i] = eDist[i - 1] - (*widths)[i - 1];
+    (*widths)[i + 1] = eDist[i] - (*widths)[i];
+    barSum += (*widths)[i] + (*widths)[i + 1];
+    if ((*widths)[i] < minEven) {
+      minEven = (*widths)[i];
+    }
+  }
+  (*widths)[twoK - 1] = N - barSum;
+  if ((*widths)[twoK - 1] < minEven) {
+    minEven = (*widths)[twoK - 1];
+  }
+  if (minEven > 1) {
+    for (i = 0; i < twoK; i += 2) {
+      (*widths)[i] += minEven - 1;
+      (*widths)[i + 1] -= minEven - 1;
+    }
+  }
+  return widths;
+}
diff --git a/xfa/fxbarcode/BC_UtilRSS.h b/xfa/fxbarcode/BC_UtilRSS.h
new file mode 100644
index 0000000..b81804e
--- /dev/null
+++ b/xfa/fxbarcode/BC_UtilRSS.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_UTILRSS_H_
+#define XFA_FXBARCODE_BC_UTILRSS_H_
+
+#include <cstdint>
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_UtilRSS {
+ public:
+  virtual ~CBC_UtilRSS();
+  static int32_t GetRSSvalue(CFX_Int32Array& widths,
+                             int32_t maxWidth,
+                             FX_BOOL noNarrow);
+
+ protected:
+  static CFX_Int32Array* GetRssWidths(int32_t val,
+                                      int32_t n,
+                                      int32_t elements,
+                                      int32_t maxWidth,
+                                      FX_BOOL noNarrow);
+  static int32_t Combins(int32_t n, int32_t r);
+  static CFX_Int32Array* Elements(CFX_Int32Array& eDist, int32_t N, int32_t K);
+
+ private:
+  CBC_UtilRSS();
+};
+
+#endif  // XFA_FXBARCODE_BC_UTILRSS_H_
diff --git a/xfa/fxbarcode/BC_Utils.cpp b/xfa/fxbarcode/BC_Utils.cpp
new file mode 100644
index 0000000..0271968
--- /dev/null
+++ b/xfa/fxbarcode/BC_Utils.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString& dst,
+                                 FX_DWORD first,
+                                 FX_DWORD last,
+                                 int32_t count,
+                                 FX_CHAR c) {
+  if (first > last || count <= 0) {
+    return FALSE;
+  }
+  dst.Delete(first, last - first);
+  for (int32_t i = 0; i < count; i++) {
+    dst.Insert(0, c);
+  }
+  return TRUE;
+}
+void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c) {
+  for (int32_t i = 0; i < count; i++) {
+    dst += c;
+  }
+}
+void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba) {
+  for (int32_t i = 0; i < ba.GetSize(); i++) {
+    dst += ba[i];
+  }
+}
+void BC_FX_PtrArray_Sort(CFX_PtrArray& src, BC_PtrArrayCompareCallback fun) {
+  int32_t nLength = src.GetSize();
+  FX_BOOL changed = true;
+  do {
+    changed = false;
+    for (int32_t i = 0; i < nLength - 1; i++) {
+      if (fun(src[i + 1], src[i])) {
+        void* temp = src[i];
+        src.SetAt(i, src[i + 1]);
+        src.SetAt(i + 1, temp);
+        changed = true;
+      }
+    }
+  } while (changed);
+}
diff --git a/xfa/fxbarcode/BC_Writer.cpp b/xfa/fxbarcode/BC_Writer.cpp
new file mode 100644
index 0000000..835a2f0
--- /dev/null
+++ b/xfa/fxbarcode/BC_Writer.cpp
@@ -0,0 +1,56 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxbarcode/BC_Writer.h"
+
+CBC_Writer::CBC_Writer() {
+  m_CharEncoding = 0;
+  m_ModuleHeight = 1;
+  m_ModuleWidth = 1;
+  m_Height = 320;
+  m_Width = 640;
+  m_colorSpace = FXDIB_Argb;
+  m_barColor = 0xff000000;
+  m_backgroundColor = 0xffffffff;
+}
+CBC_Writer::~CBC_Writer() {}
+FX_BOOL CBC_Writer::SetCharEncoding(int32_t encoding) {
+  m_CharEncoding = encoding;
+  return TRUE;
+}
+FX_BOOL CBC_Writer::SetModuleHeight(int32_t moduleHeight) {
+  if (moduleHeight > 10 || moduleHeight < 1) {
+    return FALSE;
+  }
+  m_ModuleHeight = moduleHeight;
+  return TRUE;
+}
+FX_BOOL CBC_Writer::SetModuleWidth(int32_t moduleWidth) {
+  if (moduleWidth > 10 || moduleWidth < 1) {
+    return FALSE;
+  }
+  m_ModuleWidth = moduleWidth;
+  return TRUE;
+}
+FX_BOOL CBC_Writer::SetHeight(int32_t height) {
+  m_Height = height;
+  return TRUE;
+}
+FX_BOOL CBC_Writer::SetWidth(int32_t width) {
+  m_Width = width;
+  return TRUE;
+}
+void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) {
+  m_backgroundColor = backgroundColor;
+}
+void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) {
+  m_barColor = foregroundColor;
+}
+CFX_DIBitmap* CBC_Writer::CreateDIBitmap(int32_t width, int32_t height) {
+  CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
+  pDIBitmap->Create(width, height, m_colorSpace);
+  return pDIBitmap;
+}
diff --git a/xfa/fxbarcode/BC_Writer.h b/xfa/fxbarcode/BC_Writer.h
new file mode 100644
index 0000000..bff3642
--- /dev/null
+++ b/xfa/fxbarcode/BC_Writer.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_BC_WRITER_H_
+#define XFA_FXBARCODE_BC_WRITER_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_Writer {
+ public:
+  CBC_Writer();
+  virtual ~CBC_Writer();
+  virtual FX_BOOL SetCharEncoding(int32_t encoding);
+  virtual FX_BOOL SetModuleHeight(int32_t moduleHeight);
+  virtual FX_BOOL SetModuleWidth(int32_t moduleWidth);
+  virtual FX_BOOL SetHeight(int32_t height);
+  virtual FX_BOOL SetWidth(int32_t width);
+  virtual void SetBackgroundColor(FX_ARGB backgroundColor);
+  virtual void SetBarcodeColor(FX_ARGB foregroundColor);
+
+ protected:
+  CFX_DIBitmap* CreateDIBitmap(int32_t width, int32_t height);
+  int32_t m_CharEncoding;
+  int32_t m_ModuleHeight;
+  int32_t m_ModuleWidth;
+  int32_t m_Height;
+  int32_t m_Width;
+  FXDIB_Format m_colorSpace;
+  FX_ARGB m_barColor;
+  FX_ARGB m_backgroundColor;
+};
+
+#endif  // XFA_FXBARCODE_BC_WRITER_H_
diff --git a/xfa/fxbarcode/common/BC_CommonBitArray.cpp b/xfa/fxbarcode/common/BC_CommonBitArray.cpp
new file mode 100644
index 0000000..b39e4ac
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitArray.cpp
@@ -0,0 +1,113 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array) {
+  m_size = array->GetSize();
+  m_bits.Copy(array->GetBits());
+}
+CBC_CommonBitArray::CBC_CommonBitArray() {
+  m_bits.SetSize(1);
+  m_size = 0;
+}
+CBC_CommonBitArray::CBC_CommonBitArray(int32_t size) {
+  m_bits.SetSize((size + 31) >> 5);
+  m_size = size;
+}
+CBC_CommonBitArray::~CBC_CommonBitArray() {
+  m_size = 0;
+}
+int32_t CBC_CommonBitArray::GetSize() {
+  return m_size;
+}
+CFX_Int32Array& CBC_CommonBitArray::GetBits() {
+  return m_bits;
+}
+int32_t CBC_CommonBitArray::GetSizeInBytes() {
+  return (m_size + 7) >> 3;
+}
+FX_BOOL CBC_CommonBitArray::Get(int32_t i) {
+  return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0;
+}
+void CBC_CommonBitArray::Set(int32_t i) {
+  m_bits[i >> 5] |= 1 << (i & 0x1F);
+}
+void CBC_CommonBitArray::Flip(int32_t i) {
+  m_bits[i >> 5] ^= 1 << (i & 0x1F);
+}
+void CBC_CommonBitArray::SetBulk(int32_t i, int32_t newBits) {
+  m_bits[i >> 5] = newBits;
+}
+void CBC_CommonBitArray::Clear() {
+  FXSYS_memset(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(int32_t));
+}
+FX_BOOL CBC_CommonBitArray::IsRange(int32_t start,
+                                    int32_t end,
+                                    FX_BOOL value,
+                                    int32_t& e) {
+  if (end < start) {
+    e = BCExceptionEndLessThanStart;
+    return FALSE;
+  }
+  if (end == start) {
+    return TRUE;
+  }
+  end--;
+  int32_t firstInt = start >> 5;
+  int32_t lastInt = end >> 5;
+  int32_t i;
+  for (i = firstInt; i <= lastInt; i++) {
+    int32_t firstBit = i > firstInt ? 0 : start & 0x1F;
+    int32_t lastBit = i < lastInt ? 31 : end & 0x1F;
+    int32_t mask;
+    if (firstBit == 0 && lastBit == 31) {
+      mask = -1;
+    } else {
+      mask = 0;
+      for (int32_t j = firstBit; j <= lastBit; j++) {
+        mask |= 1 << j;
+      }
+    }
+    if ((m_bits[i] & mask) != (value ? mask : 0)) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+int32_t* CBC_CommonBitArray::GetBitArray() {
+  return &m_bits[0];
+}
+void CBC_CommonBitArray::Reverse() {
+  int32_t* newBits = FX_Alloc(int32_t, m_bits.GetSize());
+  FXSYS_memset(newBits, 0x00, m_bits.GetSize() * sizeof(int32_t));
+  int32_t size = m_size;
+  int32_t i;
+  for (i = 0; i < size; i++) {
+    if (Get(size - i - 1)) {
+      newBits[i >> 5] |= 1 << (i & 0x1F);
+    }
+  }
+  FXSYS_memcpy(&m_bits[0], newBits, m_bits.GetSize() * sizeof(int32_t));
+  FX_Free(newBits);
+}
diff --git a/xfa/fxbarcode/common/BC_CommonBitArray.h b/xfa/fxbarcode/common/BC_CommonBitArray.h
new file mode 100644
index 0000000..6ddd789
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitArray.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitArray {
+ public:
+  CBC_CommonBitArray(CBC_CommonBitArray* array);
+  CBC_CommonBitArray(int32_t size);
+  CBC_CommonBitArray();
+  virtual ~CBC_CommonBitArray();
+  int32_t GetSize();
+  CFX_Int32Array& GetBits();
+  int32_t GetSizeInBytes();
+  FX_BOOL Get(int32_t i);
+  void Set(int32_t i);
+  void Flip(int32_t i);
+  void SetBulk(int32_t i, int32_t newBits);
+  FX_BOOL IsRange(int32_t start, int32_t end, FX_BOOL value, int32_t& e);
+  int32_t* GetBitArray();
+  void Reverse();
+  void Clear();
+
+ private:
+  int32_t m_size;
+  CFX_Int32Array m_bits;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
diff --git a/xfa/fxbarcode/common/BC_CommonBitMatrix.cpp b/xfa/fxbarcode/common/BC_CommonBitMatrix.cpp
new file mode 100644
index 0000000..a8f87e7
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitMatrix.cpp
@@ -0,0 +1,146 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_CommonBitMatrix::CBC_CommonBitMatrix() {
+  m_width = 0;
+  m_height = 0;
+  m_rowSize = 0;
+  m_bits = NULL;
+}
+void CBC_CommonBitMatrix::Init(int32_t dimension) {
+  m_width = dimension;
+  m_height = dimension;
+  int32_t rowSize = (m_height + 31) >> 5;
+  m_rowSize = rowSize;
+  m_bits = FX_Alloc2D(int32_t, m_rowSize, m_height);
+  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
+}
+void CBC_CommonBitMatrix::Init(int32_t width, int32_t height) {
+  m_width = width;
+  m_height = height;
+  int32_t rowSize = (width + 31) >> 5;
+  m_rowSize = rowSize;
+  m_bits = FX_Alloc2D(int32_t, m_rowSize, m_height);
+  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
+}
+CBC_CommonBitMatrix::~CBC_CommonBitMatrix() {
+  FX_Free(m_bits);
+}
+FX_BOOL CBC_CommonBitMatrix::Get(int32_t x, int32_t y) {
+  int32_t offset = y * m_rowSize + (x >> 5);
+  if (offset >= m_rowSize * m_height || offset < 0) {
+    return false;
+  }
+  return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0;
+}
+int32_t* CBC_CommonBitMatrix::GetBits() {
+  return m_bits;
+}
+void CBC_CommonBitMatrix::Set(int32_t x, int32_t y) {
+  int32_t offset = y * m_rowSize + (x >> 5);
+  if (offset >= m_rowSize * m_height || offset < 0) {
+    return;
+  }
+  m_bits[offset] |= 1 << (x & 0x1f);
+}
+void CBC_CommonBitMatrix::Flip(int32_t x, int32_t y) {
+  int32_t offset = y * m_rowSize + (x >> 5);
+  m_bits[offset] ^= 1 << (x & 0x1f);
+}
+void CBC_CommonBitMatrix::Clear() {
+  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
+}
+void CBC_CommonBitMatrix::SetRegion(int32_t left,
+                                    int32_t top,
+                                    int32_t width,
+                                    int32_t height,
+                                    int32_t& e) {
+  if (top < 0 || left < 0) {
+    e = BCExceptionLeftAndTopMustBeNonnegative;
+    return;
+  }
+  if (height < 1 || width < 1) {
+    e = BCExceptionHeightAndWidthMustBeAtLeast1;
+    return;
+  }
+  int32_t right = left + width;
+  int32_t bottom = top + height;
+  if (m_height < bottom || m_width < right) {
+    e = BCExceptionRegionMustFitInsideMatrix;
+    return;
+  }
+  int32_t y;
+  for (y = top; y < bottom; y++) {
+    int32_t offset = y * m_rowSize;
+    int32_t x;
+    for (x = left; x < right; x++) {
+      m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f);
+    }
+  }
+}
+CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(int32_t y,
+                                                CBC_CommonBitArray* row) {
+  CBC_CommonBitArray* rowArray = NULL;
+  if (row == NULL || row->GetSize() < m_width) {
+    rowArray = new CBC_CommonBitArray(m_width);
+  } else {
+    rowArray = new CBC_CommonBitArray(row);
+  }
+  int32_t offset = y * m_rowSize;
+  int32_t x;
+  for (x = 0; x < m_rowSize; x++) {
+    rowArray->SetBulk(x << 5, m_bits[offset + x]);
+  }
+  return rowArray;
+}
+void CBC_CommonBitMatrix::SetRow(int32_t y, CBC_CommonBitArray* row) {
+  int32_t l = y * m_rowSize;
+  for (int32_t i = 0; i < m_rowSize; i++) {
+    m_bits[l] = row->GetBitArray()[i];
+    l++;
+  }
+}
+void CBC_CommonBitMatrix::SetCol(int32_t y, CBC_CommonBitArray* col) {
+  for (int32_t i = 0; i < col->GetBits().GetSize(); i++) {
+    m_bits[i * m_rowSize + y] = col->GetBitArray()[i];
+  }
+}
+int32_t CBC_CommonBitMatrix::GetWidth() {
+  return m_width;
+}
+int32_t CBC_CommonBitMatrix::GetHeight() {
+  return m_height;
+}
+int32_t CBC_CommonBitMatrix::GetRowSize() {
+  return m_rowSize;
+}
+int32_t CBC_CommonBitMatrix::GetDimension(int32_t& e) {
+  if (m_width != m_height) {
+    e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;
+    return 0;
+  }
+  return m_width;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonBitMatrix.h b/xfa/fxbarcode/common/BC_CommonBitMatrix.h
new file mode 100644
index 0000000..78b4264
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitMatrix.h
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CBC_CommonBitArray;
+
+class CBC_CommonBitMatrix {
+ public:
+  CBC_CommonBitMatrix();
+  virtual ~CBC_CommonBitMatrix();
+  FX_BOOL Get(int32_t x, int32_t y);
+  void Set(int32_t x, int32_t y);
+  void Flip(int32_t x, int32_t y);
+  void Clear();
+  void SetRegion(int32_t left,
+                 int32_t top,
+                 int32_t width,
+                 int32_t height,
+                 int32_t& e);
+  CBC_CommonBitArray* GetRow(int32_t y, CBC_CommonBitArray* row);
+  void SetRow(int32_t y, CBC_CommonBitArray* row);
+  CBC_CommonBitArray* GetCol(int32_t y, CBC_CommonBitArray* row);
+  void SetCol(int32_t y, CBC_CommonBitArray* col);
+  int32_t GetWidth();
+  int32_t GetHeight();
+  int32_t GetRowSize();
+  int32_t GetDimension(int32_t& e);
+  virtual void Init(int32_t dimension);
+  virtual void Init(int32_t width, int32_t height);
+  int32_t* GetBits();
+
+ private:
+  int32_t m_width;
+  int32_t m_height;
+  int32_t m_rowSize;
+  int32_t* m_bits;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
diff --git a/xfa/fxbarcode/common/BC_CommonBitSource.cpp b/xfa/fxbarcode/common/BC_CommonBitSource.cpp
new file mode 100644
index 0000000..af91d5e
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitSource.cpp
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitSource.h"
+
+CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) {
+  m_bytes.Copy((*bytes));
+  m_bitOffset = 0;
+  m_byteOffset = 0;
+}
+CBC_CommonBitSource::~CBC_CommonBitSource() {}
+int32_t CBC_CommonBitSource::ReadBits(int32_t numBits, int32_t& e) {
+  if (numBits < 1 || numBits > 32) {
+    e = BCExceptionIllegalArgument;
+    return 0;
+  }
+  int32_t result = 0;
+  if (m_bitOffset > 0) {
+    int32_t bitsLeft = 8 - m_bitOffset;
+    int32_t toRead = numBits < bitsLeft ? numBits : bitsLeft;
+    int32_t bitsToNotRead = bitsLeft - toRead;
+    int32_t mask = (0xff >> (8 - toRead)) << bitsToNotRead;
+    result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead;
+    numBits -= toRead;
+    m_bitOffset += toRead;
+    if (m_bitOffset == 8) {
+      m_bitOffset = 0;
+      m_byteOffset++;
+    }
+  }
+  if (numBits > 0) {
+    while (numBits >= 8) {
+      result = (result << 8) | (m_bytes[m_byteOffset] & 0xff);
+      m_byteOffset++;
+      numBits -= 8;
+    }
+    if (numBits > 0) {
+      int32_t bitsToNotRead = 8 - numBits;
+      int32_t mask = (0xff >> bitsToNotRead) << bitsToNotRead;
+      result = (result << numBits) |
+               ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead);
+      m_bitOffset += numBits;
+    }
+  }
+  return result;
+}
+int32_t CBC_CommonBitSource::Available() {
+  return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset;
+}
+int32_t CBC_CommonBitSource::getByteOffset() {
+  return m_byteOffset;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonBitSource.h b/xfa/fxbarcode/common/BC_CommonBitSource.h
new file mode 100644
index 0000000..7617a6f
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonBitSource.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_CommonBitSource {
+ public:
+  CBC_CommonBitSource(CFX_ByteArray* bytes);
+  virtual ~CBC_CommonBitSource();
+  int32_t ReadBits(int32_t numBits, int32_t& e);
+  int32_t Available();
+  int32_t getByteOffset();
+
+ private:
+  CFX_ByteArray m_bytes;
+  int32_t m_byteOffset;
+  int32_t m_bitOffset;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
diff --git a/xfa/fxbarcode/common/BC_CommonByteArray.cpp b/xfa/fxbarcode/common/BC_CommonByteArray.cpp
new file mode 100644
index 0000000..1fd6e46
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonByteArray.cpp
@@ -0,0 +1,99 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+
+#include "xfa/fxbarcode/common/BC_CommonByteArray.h"
+
+CBC_CommonByteArray::CBC_CommonByteArray() {
+  m_bytes = NULL;
+  m_size = 0;
+  m_index = 0;
+}
+CBC_CommonByteArray::CBC_CommonByteArray(int32_t size) {
+  m_size = size;
+  m_bytes = FX_Alloc(uint8_t, size);
+  FXSYS_memset(m_bytes, 0, size);
+  m_index = 0;
+}
+CBC_CommonByteArray::CBC_CommonByteArray(uint8_t* byteArray, int32_t size) {
+  m_size = size;
+  m_bytes = FX_Alloc(uint8_t, size);
+  FXSYS_memcpy(m_bytes, byteArray, size);
+  m_index = size;
+}
+CBC_CommonByteArray::~CBC_CommonByteArray() {
+  FX_Free(m_bytes);
+}
+int32_t CBC_CommonByteArray::At(int32_t index) {
+  return m_bytes[index] & 0xff;
+}
+void CBC_CommonByteArray::Set(int32_t index, int32_t value) {
+  m_bytes[index] = (uint8_t)value;
+}
+int32_t CBC_CommonByteArray::Size() {
+  return m_size;
+}
+FX_BOOL CBC_CommonByteArray::IsEmpty() {
+  return m_size == 0;
+}
+void CBC_CommonByteArray::AppendByte(int32_t value) {
+  if (m_size == 0 || m_index >= m_size) {
+    int32_t newSize = std::max(32, m_size << 1);
+    Reserve(newSize);
+  }
+  m_bytes[m_index] = (uint8_t)value;
+  m_index++;
+}
+void CBC_CommonByteArray::Reserve(int32_t capacity) {
+  if (m_bytes == NULL || m_size < capacity) {
+    uint8_t* newArray = FX_Alloc(uint8_t, capacity);
+    if (m_bytes) {
+      FXSYS_memcpy(newArray, m_bytes, m_size);
+      FXSYS_memset(newArray + m_size, 0, capacity - m_size);
+    } else {
+      FXSYS_memset(newArray, 0, capacity);
+    }
+    FX_Free(m_bytes);
+    m_bytes = newArray;
+    m_size = capacity;
+  }
+}
+void CBC_CommonByteArray::Set(uint8_t* source, int32_t offset, int32_t count) {
+  FX_Free(m_bytes);
+  m_bytes = FX_Alloc(uint8_t, count);
+  m_size = count;
+  FXSYS_memcpy(m_bytes, source + offset, count);
+  m_index = count;
+}
+void CBC_CommonByteArray::Set(CFX_ByteArray* source,
+                              int32_t offset,
+                              int32_t count) {
+  FX_Free(m_bytes);
+  m_bytes = FX_Alloc(uint8_t, count);
+  m_size = count;
+  int32_t i;
+  for (i = 0; i < count; i++) {
+    m_bytes[i] = source->operator[](i + offset);
+  }
+  m_index = m_size;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonByteArray.h b/xfa/fxbarcode/common/BC_CommonByteArray.h
new file mode 100644
index 0000000..69d470b
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonByteArray.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonByteArray {
+ private:
+  int32_t m_size;
+  int32_t m_index;
+  uint8_t* m_bytes;
+
+ public:
+  CBC_CommonByteArray();
+  CBC_CommonByteArray(int32_t size);
+  CBC_CommonByteArray(uint8_t* byteArray, int32_t size);
+  virtual ~CBC_CommonByteArray();
+  int32_t At(int32_t index);
+  void Set(int32_t index, int32_t value);
+  int32_t Size();
+  FX_BOOL IsEmpty();
+  void AppendByte(int32_t value);
+  void Reserve(int32_t capacity);
+  void Set(uint8_t* source, int32_t offset, int32_t count);
+  void Set(CFX_ByteArray* source, int32_t offset, int32_t count);
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
diff --git a/xfa/fxbarcode/common/BC_CommonByteMatrix.cpp b/xfa/fxbarcode/common/BC_CommonByteMatrix.cpp
new file mode 100644
index 0000000..c9ed749
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonByteMatrix.cpp
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcrt/fx_memory.h"
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+
+CBC_CommonByteMatrix::CBC_CommonByteMatrix(int32_t width, int32_t height) {
+  m_height = height;
+  m_width = width;
+  m_bytes = NULL;
+}
+void CBC_CommonByteMatrix::Init() {
+  m_bytes = FX_Alloc2D(uint8_t, m_height, m_width);
+  FXSYS_memset(m_bytes, 0xff, m_height * m_width);
+}
+CBC_CommonByteMatrix::~CBC_CommonByteMatrix() {
+  FX_Free(m_bytes);
+}
+int32_t CBC_CommonByteMatrix::GetHeight() {
+  return m_height;
+}
+int32_t CBC_CommonByteMatrix::GetWidth() {
+  return m_width;
+}
+uint8_t CBC_CommonByteMatrix::Get(int32_t x, int32_t y) {
+  return m_bytes[y * m_width + x];
+}
+void CBC_CommonByteMatrix::Set(int32_t x, int32_t y, int32_t value) {
+  m_bytes[y * m_width + x] = (uint8_t)value;
+}
+void CBC_CommonByteMatrix::Set(int32_t x, int32_t y, uint8_t value) {
+  m_bytes[y * m_width + x] = value;
+}
+void CBC_CommonByteMatrix::clear(uint8_t value) {
+  int32_t y;
+  for (y = 0; y < m_height; y++) {
+    int32_t x;
+    for (x = 0; x < m_width; x++) {
+      m_bytes[y * m_width + x] = value;
+    }
+  }
+}
+uint8_t* CBC_CommonByteMatrix::GetArray() {
+  return m_bytes;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonByteMatrix.h b/xfa/fxbarcode/common/BC_CommonByteMatrix.h
new file mode 100644
index 0000000..271feef
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonByteMatrix.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
+
+#include <stdint.h>
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CBC_CommonByteMatrix {
+ public:
+  CBC_CommonByteMatrix(int32_t width, int32_t height);
+  virtual ~CBC_CommonByteMatrix();
+  int32_t GetHeight();
+  int32_t GetWidth();
+  uint8_t Get(int32_t x, int32_t y);
+  uint8_t* GetArray();
+
+  void Set(int32_t x, int32_t y, int32_t value);
+  void Set(int32_t x, int32_t y, uint8_t value);
+  void clear(uint8_t value);
+  virtual void Init();
+
+ private:
+  uint8_t* m_bytes;
+  int32_t m_width;
+  int32_t m_height;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
diff --git a/xfa/fxbarcode/common/BC_CommonCharacterSetECI.cpp b/xfa/fxbarcode/common/BC_CommonCharacterSetECI.cpp
new file mode 100644
index 0000000..d6fa9e4
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonCharacterSetECI.cpp
@@ -0,0 +1,44 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonCharacterSetECI.h"
+#include "xfa/fxbarcode/common/BC_CommonECI.h"
+
+void CBC_CommonCharacterSetECI::initialize() {}
+CBC_CommonCharacterSetECI::CBC_CommonCharacterSetECI(
+    int32_t value,
+    CFX_ByteString encodingName)
+    : CBC_CommonECI(value), m_encodingName(encodingName) {}
+CBC_CommonCharacterSetECI::~CBC_CommonCharacterSetECI() {}
+CFX_ByteString CBC_CommonCharacterSetECI::GetEncodingName() {
+  return m_encodingName;
+}
+void CBC_CommonCharacterSetECI::AddCharacterSet(int32_t value,
+                                                CFX_ByteString encodingName) {}
+CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(
+    int32_t value) {
+  return NULL;
+}
+CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByName(
+    const CFX_ByteString& name) {
+  return NULL;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonCharacterSetECI.h b/xfa/fxbarcode/common/BC_CommonCharacterSetECI.h
new file mode 100644
index 0000000..18a676a
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonCharacterSetECI.h
@@ -0,0 +1,29 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fxbarcode/common/BC_CommonECI.h"
+
+class CBC_CommonCharacterSetECI : public CBC_CommonECI {
+ public:
+  CBC_CommonCharacterSetECI(int32_t value, CFX_ByteString encodingName);
+  virtual ~CBC_CommonCharacterSetECI();
+  CFX_ByteString GetEncodingName();
+  static void AddCharacterSet(int32_t value, CFX_ByteString encodingName);
+  int32_t GetValue();
+  static CBC_CommonCharacterSetECI* GetCharacterSetECIByValue(int32_t value);
+  static CBC_CommonCharacterSetECI* GetCharacterSetECIByName(
+      const CFX_ByteString& name);
+
+ private:
+  CFX_ByteString m_encodingName;
+  static void initialize();
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
diff --git a/xfa/fxbarcode/common/BC_CommonDecoderResult.cpp b/xfa/fxbarcode/common/BC_CommonDecoderResult.cpp
new file mode 100644
index 0000000..0c545c4
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonDecoderResult.cpp
@@ -0,0 +1,77 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_CommonDecoderResult::CBC_CommonDecoderResult() {}
+void CBC_CommonDecoderResult::Init(const CFX_ByteArray& rawBytes,
+                                   const CFX_ByteString& text,
+                                   const CFX_Int32Array& byteSegments,
+                                   CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                   int32_t& e) {
+  if (text.IsEmpty()) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  m_rawBytes.Copy(rawBytes);
+  m_text = text;
+  m_byteSegments.Copy(byteSegments);
+  m_ecLevel = ecLevel;
+  m_other = NULL;
+}
+void CBC_CommonDecoderResult::Init(const CFX_ByteArray& rawBytes,
+                                   const CFX_ByteString& text,
+                                   const CFX_PtrArray& byteSegments,
+                                   const CFX_ByteString& ecLevel,
+                                   int32_t& e) {
+  if (text.IsEmpty()) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  m_rawBytes.Copy(rawBytes);
+  m_text = text;
+  m_pdf417byteSegments.Copy(byteSegments);
+  m_pdf417ecLevel = ecLevel;
+  m_other = NULL;
+}
+void CBC_CommonDecoderResult::setOther(CBC_PDF417ResultMetadata* other) {
+  m_other = other;
+}
+CBC_CommonDecoderResult::~CBC_CommonDecoderResult() {
+  delete m_other;
+}
+const CFX_ByteArray& CBC_CommonDecoderResult::GetRawBytes() {
+  return m_rawBytes;
+}
+const CFX_Int32Array& CBC_CommonDecoderResult::GetByteSegments() {
+  return m_byteSegments;
+}
+const CFX_ByteString& CBC_CommonDecoderResult::GetText() {
+  return m_text;
+}
+CBC_QRCoderErrorCorrectionLevel* CBC_CommonDecoderResult::GetECLevel() {
+  return m_ecLevel;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonDecoderResult.h b/xfa/fxbarcode/common/BC_CommonDecoderResult.h
new file mode 100644
index 0000000..dbdb9d3
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonDecoderResult.h
@@ -0,0 +1,45 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_PDF417ResultMetadata;
+
+class CBC_CommonDecoderResult {
+ public:
+  CBC_CommonDecoderResult();
+  virtual ~CBC_CommonDecoderResult();
+  const CFX_ByteArray& GetRawBytes();
+  const CFX_ByteString& GetText();
+  const CFX_Int32Array& GetByteSegments();
+  CBC_QRCoderErrorCorrectionLevel* GetECLevel();
+  virtual void Init(const CFX_ByteArray& rawBytes,
+                    const CFX_ByteString& text,
+                    const CFX_Int32Array& byteSegments,
+                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                    int32_t& e);
+  virtual void Init(const CFX_ByteArray& rawBytes,
+                    const CFX_ByteString& text,
+                    const CFX_PtrArray& byteSegments,
+                    const CFX_ByteString& ecLevel,
+                    int32_t& e);
+  void setOther(CBC_PDF417ResultMetadata* other);
+
+ private:
+  CFX_ByteArray m_rawBytes;
+  CFX_ByteString m_text;
+  CFX_Int32Array m_byteSegments;
+  CFX_PtrArray m_pdf417byteSegments;
+  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
+  CFX_ByteString m_pdf417ecLevel;
+  CBC_PDF417ResultMetadata* m_other;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
diff --git a/xfa/fxbarcode/common/BC_CommonECI.cpp b/xfa/fxbarcode/common/BC_CommonECI.cpp
new file mode 100644
index 0000000..4e37aec
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonECI.cpp
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonCharacterSetECI.h"
+#include "xfa/fxbarcode/common/BC_CommonECI.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_CommonECI::CBC_CommonECI(int32_t value) {
+  m_value = value;
+}
+CBC_CommonECI::~CBC_CommonECI() {}
+int32_t CBC_CommonECI::GetValue() {
+  return m_value;
+}
+CBC_CommonECI* CBC_CommonECI::GetEICByValue(int32_t value, int32_t& e) {
+  if (value < 0 || value > 999999) {
+    e = BCExceptionBadECI;
+    return NULL;
+  }
+  if (value < 900) {
+  }
+  return NULL;
+}
diff --git a/xfa/fxbarcode/common/BC_CommonECI.h b/xfa/fxbarcode/common/BC_CommonECI.h
new file mode 100644
index 0000000..20b3e76
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonECI.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONECI_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONECI_H_
+
+#include <stdint.h>
+
+class CBC_CommonECI {
+ public:
+  CBC_CommonECI(int32_t value);
+  virtual ~CBC_CommonECI();
+
+  int32_t GetValue();
+  static CBC_CommonECI* GetEICByValue(int32_t value, int32_t& e);
+
+ private:
+  int32_t m_value;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONECI_H_
diff --git a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
new file mode 100644
index 0000000..daa6189
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
@@ -0,0 +1,152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h"
+
+#include <memory>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11,
+                                                               FX_FLOAT a21,
+                                                               FX_FLOAT a31,
+                                                               FX_FLOAT a12,
+                                                               FX_FLOAT a22,
+                                                               FX_FLOAT a32,
+                                                               FX_FLOAT a13,
+                                                               FX_FLOAT a23,
+                                                               FX_FLOAT a33)
+    : m_a11(a11),
+      m_a12(a12),
+      m_a13(a13),
+      m_a21(a21),
+      m_a22(a22),
+      m_a23(a23),
+      m_a31(a31),
+      m_a32(a32),
+      m_a33(a33) {}
+CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() {}
+CBC_CommonPerspectiveTransform*
+CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0,
+                                                             FX_FLOAT y0,
+                                                             FX_FLOAT x1,
+                                                             FX_FLOAT y1,
+                                                             FX_FLOAT x2,
+                                                             FX_FLOAT y2,
+                                                             FX_FLOAT x3,
+                                                             FX_FLOAT y3,
+                                                             FX_FLOAT x0p,
+                                                             FX_FLOAT y0p,
+                                                             FX_FLOAT x1p,
+                                                             FX_FLOAT y1p,
+                                                             FX_FLOAT x2p,
+                                                             FX_FLOAT y2p,
+                                                             FX_FLOAT x3p,
+                                                             FX_FLOAT y3p) {
+  std::unique_ptr<CBC_CommonPerspectiveTransform> qToS(
+      QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3));
+  std::unique_ptr<CBC_CommonPerspectiveTransform> sToQ(
+      SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p));
+  return sToQ->Times(*(qToS.get()));
+}
+void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray* points) {
+  int32_t max = points->GetSize();
+  FX_FLOAT a11 = m_a11;
+  FX_FLOAT a12 = m_a12;
+  FX_FLOAT a13 = m_a13;
+  FX_FLOAT a21 = m_a21;
+  FX_FLOAT a22 = m_a22;
+  FX_FLOAT a23 = m_a23;
+  FX_FLOAT a31 = m_a31;
+  FX_FLOAT a32 = m_a32;
+  FX_FLOAT a33 = m_a33;
+  int32_t i;
+  for (i = 0; i < max; i += 2) {
+    FX_FLOAT x = (*points)[i];
+    FX_FLOAT y = (*points)[i + 1];
+    FX_FLOAT denominator = a13 * x + a23 * y + a33;
+    (*points)[i] = (a11 * x + a21 * y + a31) / denominator;
+    (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator;
+  }
+}
+CBC_CommonPerspectiveTransform*
+CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0,
+                                                      FX_FLOAT y0,
+                                                      FX_FLOAT x1,
+                                                      FX_FLOAT y1,
+                                                      FX_FLOAT x2,
+                                                      FX_FLOAT y2,
+                                                      FX_FLOAT x3,
+                                                      FX_FLOAT y3) {
+  FX_FLOAT dy2 = y3 - y2;
+  FX_FLOAT dy3 = y0 - y1 + y2 - y3;
+  if ((dy2 == 0.0f) && (dy3 == 0.0f)) {
+    return new CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0,
+                                              y2 - y1, y0, 0.0f, 0.0f, 1.0f);
+  } else {
+    FX_FLOAT dx1 = x1 - x2;
+    FX_FLOAT dx2 = x3 - x2;
+    FX_FLOAT dx3 = x0 - x1 + x2 - x3;
+    FX_FLOAT dy1 = y1 - y2;
+    FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1;
+    FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator;
+    FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator;
+    return new CBC_CommonPerspectiveTransform(
+        x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1,
+        y3 - y0 + a23 * y3, y0, a13, a23, 1.0f);
+  }
+}
+CBC_CommonPerspectiveTransform*
+CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0,
+                                                      FX_FLOAT y0,
+                                                      FX_FLOAT x1,
+                                                      FX_FLOAT y1,
+                                                      FX_FLOAT x2,
+                                                      FX_FLOAT y2,
+                                                      FX_FLOAT x3,
+                                                      FX_FLOAT y3) {
+  std::unique_ptr<CBC_CommonPerspectiveTransform> temp1(
+      SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3));
+  return temp1->BuildAdjoint();
+}
+CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::BuildAdjoint() {
+  return new CBC_CommonPerspectiveTransform(
+      m_a22 * m_a33 - m_a23 * m_a32, m_a23 * m_a31 - m_a21 * m_a33,
+      m_a21 * m_a32 - m_a22 * m_a31, m_a13 * m_a32 - m_a12 * m_a33,
+      m_a11 * m_a33 - m_a13 * m_a31, m_a12 * m_a31 - m_a11 * m_a32,
+      m_a12 * m_a23 - m_a13 * m_a22, m_a13 * m_a21 - m_a11 * m_a23,
+      m_a11 * m_a22 - m_a12 * m_a21);
+}
+CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::Times(
+    CBC_CommonPerspectiveTransform& other) {
+  return new CBC_CommonPerspectiveTransform(
+      m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13,
+      m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23,
+      m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33,
+      m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13,
+      m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23,
+      m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33,
+      m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13,
+      m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23,
+      m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33);
+}
diff --git a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h
new file mode 100644
index 0000000..36defd8
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
+#define XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonPerspectiveTransform {
+ public:
+  CBC_CommonPerspectiveTransform(FX_FLOAT a11,
+                                 FX_FLOAT a21,
+                                 FX_FLOAT a31,
+                                 FX_FLOAT a12,
+                                 FX_FLOAT a22,
+                                 FX_FLOAT a32,
+                                 FX_FLOAT a13,
+                                 FX_FLOAT a23,
+                                 FX_FLOAT a33);
+  virtual ~CBC_CommonPerspectiveTransform();
+  static CBC_CommonPerspectiveTransform* QuadrilateralToQuadrilateral(
+      FX_FLOAT x0,
+      FX_FLOAT y0,
+      FX_FLOAT x1,
+      FX_FLOAT y1,
+      FX_FLOAT x2,
+      FX_FLOAT y2,
+      FX_FLOAT x3,
+      FX_FLOAT y3,
+      FX_FLOAT x0p,
+      FX_FLOAT y0p,
+      FX_FLOAT x1p,
+      FX_FLOAT y1p,
+      FX_FLOAT x2p,
+      FX_FLOAT y2p,
+      FX_FLOAT x3p,
+      FX_FLOAT y3p);
+  static CBC_CommonPerspectiveTransform* SquareToQuadrilateral(FX_FLOAT x0,
+                                                               FX_FLOAT y0,
+                                                               FX_FLOAT x1,
+                                                               FX_FLOAT y1,
+                                                               FX_FLOAT x2,
+                                                               FX_FLOAT y2,
+                                                               FX_FLOAT x3,
+                                                               FX_FLOAT y3);
+  static CBC_CommonPerspectiveTransform* QuadrilateralToSquare(FX_FLOAT x0,
+                                                               FX_FLOAT y0,
+                                                               FX_FLOAT x1,
+                                                               FX_FLOAT y1,
+                                                               FX_FLOAT x2,
+                                                               FX_FLOAT y2,
+                                                               FX_FLOAT x3,
+                                                               FX_FLOAT y3);
+  CBC_CommonPerspectiveTransform* BuildAdjoint();
+  CBC_CommonPerspectiveTransform* Times(CBC_CommonPerspectiveTransform& other);
+  void TransformPoints(CFX_FloatArray* points);
+
+ private:
+  FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
diff --git a/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp b/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp
new file mode 100644
index 0000000..d4a3322
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t LUMINANCE_BITS = 5;
+const int32_t LUMINANCE_SHIFT = 8 - LUMINANCE_BITS;
+const int32_t LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS;
+
+CBC_GlobalHistogramBinarizer::CBC_GlobalHistogramBinarizer(
+    CBC_LuminanceSource* source)
+    : CBC_Binarizer(source) {}
+CBC_GlobalHistogramBinarizer::~CBC_GlobalHistogramBinarizer() {}
+CBC_CommonBitArray* CBC_GlobalHistogramBinarizer::GetBlackRow(
+    int32_t y,
+    CBC_CommonBitArray* row,
+    int32_t& e) {
+  CBC_LuminanceSource* source = GetLuminanceSource();
+  int32_t width = source->GetWidth();
+  std::unique_ptr<CBC_CommonBitArray> result(new CBC_CommonBitArray(width));
+  InitArrays(width);
+  CFX_ByteArray* localLuminances = source->GetRow(y, m_luminance, e);
+  if (e != BCExceptionNO) {
+    return result.release();
+  }
+  CFX_Int32Array localBuckets;
+  localBuckets.Copy(m_buckets);
+  int32_t x;
+  for (x = 0; x < width; x++) {
+    int32_t pixel = (*localLuminances)[x] & 0xff;
+    localBuckets[pixel >> LUMINANCE_SHIFT]++;
+  }
+  int32_t blackPoint = EstimateBlackPoint(localBuckets, e);
+  if (e != BCExceptionNO) {
+    return result.release();
+  }
+  int32_t left = (*localLuminances)[0] & 0xff;
+  int32_t center = (*localLuminances)[1] & 0xff;
+  for (x = 1; x < width - 1; x++) {
+    int32_t right = (*localLuminances)[x + 1] & 0xff;
+    int32_t luminance = ((center << 2) - left - right) >> 1;
+    if (luminance < blackPoint) {
+      result->Set(x);
+    }
+    left = center;
+    center = right;
+  }
+  return result.release();
+}
+CBC_CommonBitMatrix* CBC_GlobalHistogramBinarizer::GetBlackMatrix(int32_t& e) {
+  CBC_LuminanceSource* source = GetLuminanceSource();
+  int32_t width = source->GetWidth();
+  int32_t height = source->GetHeight();
+  std::unique_ptr<CBC_CommonBitMatrix> matrix(new CBC_CommonBitMatrix());
+  matrix->Init(width, height);
+  InitArrays(width);
+  CFX_Int32Array localBuckets;
+  localBuckets.Copy(m_buckets);
+  int32_t y;
+  for (y = 1; y < 5; y++) {
+    int32_t row = height * y / 5;
+    CFX_ByteArray* localLuminances = source->GetRow(row, m_luminance, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    int32_t right = (width << 2) / 5;
+    int32_t x;
+    for (x = width / 5; x < right; x++) {
+      int32_t pixel = (*localLuminances)[x] & 0xff;
+      localBuckets[pixel >> LUMINANCE_SHIFT]++;
+    }
+  }
+  int32_t blackPoint = EstimateBlackPoint(localBuckets, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CFX_ByteArray> localLuminances(source->GetMatrix());
+  for (y = 0; y < height; y++) {
+    int32_t offset = y * width;
+    for (int32_t x = 0; x < width; x++) {
+      int32_t pixel = (*localLuminances)[offset + x] & 0xff;
+      if (pixel < blackPoint) {
+        matrix->Set(x, y);
+      }
+    }
+  }
+  return matrix.release();
+}
+void CBC_GlobalHistogramBinarizer::InitArrays(int32_t luminanceSize) {
+  if (m_luminance.GetSize() < luminanceSize) {
+    m_luminance.SetSize(luminanceSize);
+  }
+  if (m_buckets.GetSize() <= 0) {
+    m_buckets.SetSize(LUMINANCE_BUCKETS);
+  } else {
+    int32_t x;
+    for (x = 0; x < LUMINANCE_BUCKETS; x++) {
+      m_buckets[x] = 0;
+    }
+  }
+}
+int32_t CBC_GlobalHistogramBinarizer::EstimateBlackPoint(
+    CFX_Int32Array& buckets,
+    int32_t& e) {
+  int32_t numBuckets = buckets.GetSize();
+  int32_t maxBucketCount = 0;
+  int32_t firstPeak = 0;
+  int32_t firstPeakSize = 0;
+  int32_t x;
+  for (x = 0; x < numBuckets; x++) {
+    if (buckets[x] > firstPeakSize) {
+      firstPeak = x;
+      firstPeakSize = buckets[x];
+    }
+    if (buckets[x] > maxBucketCount) {
+      maxBucketCount = buckets[x];
+    }
+  }
+  int32_t secondPeak = 0;
+  int32_t secondPeakScore = 0;
+  for (x = 0; x < numBuckets; x++) {
+    int32_t distanceToBiggest = x - firstPeak;
+    int32_t score = buckets[x] * distanceToBiggest * distanceToBiggest;
+    if (score > secondPeakScore) {
+      secondPeak = x;
+      secondPeakScore = score;
+    }
+  }
+  if (firstPeak > secondPeak) {
+    int32_t temp = firstPeak;
+    firstPeak = secondPeak;
+    secondPeak = temp;
+  }
+  if (secondPeak - firstPeak <= numBuckets >> 4) {
+    e = BCExceptionRead;
+    return 0;
+  }
+  int32_t bestValley = secondPeak - 1;
+  int32_t bestValleyScore = -1;
+  for (x = secondPeak - 1; x > firstPeak; x--) {
+    int32_t fromFirst = x - firstPeak;
+    int32_t score = fromFirst * fromFirst * (secondPeak - x) *
+                    (maxBucketCount - buckets[x]);
+    if (score > bestValleyScore) {
+      bestValley = x;
+      bestValleyScore = score;
+    }
+  }
+  return bestValley << LUMINANCE_SHIFT;
+}
diff --git a/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h b/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h
new file mode 100644
index 0000000..da13cac
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
+#define XFA_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/BC_Binarizer.h"
+
+class CBC_CommonBitArray;
+class CBC_CommonBitMatrix;
+class CBC_LuminanceSource;
+
+class CBC_GlobalHistogramBinarizer : public CBC_Binarizer {
+ public:
+  CBC_GlobalHistogramBinarizer(CBC_LuminanceSource* source);
+  virtual ~CBC_GlobalHistogramBinarizer();
+
+  void InitArrays(int32_t luminanceSize);
+  CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e);
+  CBC_CommonBitArray* GetBlackRow(int32_t y,
+                                  CBC_CommonBitArray* row,
+                                  int32_t& e);
+  static int32_t EstimateBlackPoint(CFX_Int32Array& buckets, int32_t& e);
+
+ private:
+  CFX_ByteArray m_luminance;
+  CFX_Int32Array m_buckets;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
diff --git a/xfa/fxbarcode/common/BC_WhiteRectangleDetector.cpp b/xfa/fxbarcode/common/BC_WhiteRectangleDetector.cpp
new file mode 100644
index 0000000..2aeacd1
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_WhiteRectangleDetector.cpp
@@ -0,0 +1,254 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2010 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_WhiteRectangleDetector.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(
+    CBC_CommonBitMatrix* image) {
+  m_image = image;
+  m_height = image->GetHeight();
+  m_width = image->GetWidth();
+  m_leftInit = (m_width - INIT_SIZE) >> 1;
+  m_rightInit = (m_width + INIT_SIZE) >> 1;
+  m_upInit = (m_height - INIT_SIZE) >> 1;
+  m_downInit = (m_height + INIT_SIZE) >> 1;
+}
+void CBC_WhiteRectangleDetector::Init(int32_t& e) {
+  if (m_upInit < 0 || m_leftInit < 0 || m_downInit >= m_height ||
+      m_rightInit >= m_width) {
+    e = BCExceptionNotFound;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(
+    CBC_CommonBitMatrix* image,
+    int32_t initSize,
+    int32_t x,
+    int32_t y) {
+  m_image = image;
+  m_height = image->GetHeight();
+  m_width = image->GetWidth();
+  int32_t halfsize = initSize >> 1;
+  m_leftInit = x - halfsize;
+  m_rightInit = x + halfsize;
+  m_upInit = y - halfsize;
+  m_downInit = y + halfsize;
+}
+CBC_WhiteRectangleDetector::~CBC_WhiteRectangleDetector() {}
+CFX_PtrArray* CBC_WhiteRectangleDetector::Detect(int32_t& e) {
+  int32_t left = m_leftInit;
+  int32_t right = m_rightInit;
+  int32_t up = m_upInit;
+  int32_t down = m_downInit;
+  FX_BOOL sizeExceeded = FALSE;
+  FX_BOOL aBlackPointFoundOnBorder = TRUE;
+  FX_BOOL atLeastOneBlackPointFoundOnBorder = FALSE;
+  while (aBlackPointFoundOnBorder) {
+    aBlackPointFoundOnBorder = FALSE;
+    FX_BOOL rightBorderNotWhite = TRUE;
+    while (rightBorderNotWhite && right < m_width) {
+      rightBorderNotWhite = ContainsBlackPoint(up, down, right, FALSE);
+      if (rightBorderNotWhite) {
+        right++;
+        aBlackPointFoundOnBorder = TRUE;
+      }
+    }
+    if (right >= m_width) {
+      sizeExceeded = TRUE;
+      break;
+    }
+    FX_BOOL bottomBorderNotWhite = TRUE;
+    while (bottomBorderNotWhite && down < m_height) {
+      bottomBorderNotWhite = ContainsBlackPoint(left, right, down, TRUE);
+      if (bottomBorderNotWhite) {
+        down++;
+        aBlackPointFoundOnBorder = TRUE;
+      }
+    }
+    if (down >= m_height) {
+      sizeExceeded = TRUE;
+      break;
+    }
+    FX_BOOL leftBorderNotWhite = TRUE;
+    while (leftBorderNotWhite && left >= 0) {
+      leftBorderNotWhite = ContainsBlackPoint(up, down, left, FALSE);
+      if (leftBorderNotWhite) {
+        left--;
+        aBlackPointFoundOnBorder = TRUE;
+      }
+    }
+    if (left < 0) {
+      sizeExceeded = TRUE;
+      break;
+    }
+    FX_BOOL topBorderNotWhite = TRUE;
+    while (topBorderNotWhite && up >= 0) {
+      topBorderNotWhite = ContainsBlackPoint(left, right, up, TRUE);
+      if (topBorderNotWhite) {
+        up--;
+        aBlackPointFoundOnBorder = TRUE;
+      }
+    }
+    if (up < 0) {
+      sizeExceeded = TRUE;
+      break;
+    }
+    if (aBlackPointFoundOnBorder) {
+      atLeastOneBlackPointFoundOnBorder = TRUE;
+    }
+  }
+  if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) {
+    int32_t maxSize = right - left;
+    std::unique_ptr<CBC_ResultPoint> z;
+    for (int32_t i = 1; i < maxSize; i++) {
+      z.reset(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(down - i),
+                                     (FX_FLOAT)(left + i), (FX_FLOAT)(down)));
+      if (z)
+        break;
+    }
+    if (z.get() == NULL) {
+      e = BCExceptionNotFound;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    std::unique_ptr<CBC_ResultPoint> t;
+    for (int32_t j = 1; j < maxSize; j++) {
+      t.reset(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(up + j),
+                                     (FX_FLOAT)(left + j), (FX_FLOAT)up));
+      if (t)
+        break;
+    }
+    if (t.get() == NULL) {
+      e = BCExceptionNotFound;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    std::unique_ptr<CBC_ResultPoint> x;
+    for (int32_t k = 1; k < maxSize; k++) {
+      x.reset(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(up + k),
+                                     (FX_FLOAT)(right - k), (FX_FLOAT)up));
+      if (x)
+        break;
+    }
+    if (x.get() == NULL) {
+      e = BCExceptionNotFound;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    std::unique_ptr<CBC_ResultPoint> y;
+    for (int32_t m = 1; m < maxSize; m++) {
+      y.reset(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(down - m),
+                                     (FX_FLOAT)(right - m), (FX_FLOAT)down));
+      if (y)
+        break;
+    }
+    if (y.get() == NULL) {
+      e = BCExceptionNotFound;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    return CenterEdges(y.get(), z.get(), x.get(), t.get());
+  } else {
+    e = BCExceptionNotFound;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return NULL;
+}
+int32_t CBC_WhiteRectangleDetector::Round(FX_FLOAT d) {
+  return (int32_t)(d + 0.5f);
+}
+CBC_ResultPoint* CBC_WhiteRectangleDetector::GetBlackPointOnSegment(
+    FX_FLOAT aX,
+    FX_FLOAT aY,
+    FX_FLOAT bX,
+    FX_FLOAT bY) {
+  int32_t dist = DistanceL2(aX, aY, bX, bY);
+  float xStep = (bX - aX) / dist;
+  float yStep = (bY - aY) / dist;
+  for (int32_t i = 0; i < dist; i++) {
+    int32_t x = Round(aX + i * xStep);
+    int32_t y = Round(aY + i * yStep);
+    if (m_image->Get(x, y)) {
+      return new CBC_ResultPoint((FX_FLOAT)x, (FX_FLOAT)y);
+    }
+  }
+  return NULL;
+}
+int32_t CBC_WhiteRectangleDetector::DistanceL2(FX_FLOAT aX,
+                                               FX_FLOAT aY,
+                                               FX_FLOAT bX,
+                                               FX_FLOAT bY) {
+  float xDiff = aX - bX;
+  float yDiff = aY - bY;
+  return Round((float)sqrt(xDiff * xDiff + yDiff * yDiff));
+}
+CFX_PtrArray* CBC_WhiteRectangleDetector::CenterEdges(CBC_ResultPoint* y,
+                                                      CBC_ResultPoint* z,
+                                                      CBC_ResultPoint* x,
+                                                      CBC_ResultPoint* t) {
+  float yi = y->GetX();
+  float yj = y->GetY();
+  float zi = z->GetX();
+  float zj = z->GetY();
+  float xi = x->GetX();
+  float xj = x->GetY();
+  float ti = t->GetX();
+  float tj = t->GetY();
+  if (yi < m_width / 2) {
+    CFX_PtrArray* result = new CFX_PtrArray;
+    result->SetSize(4);
+    (*result)[0] = new CBC_ResultPoint(ti - CORR, tj + CORR);
+    (*result)[1] = new CBC_ResultPoint(zi + CORR, zj + CORR);
+    (*result)[2] = new CBC_ResultPoint(xi - CORR, xj - CORR);
+    (*result)[3] = new CBC_ResultPoint(yi + CORR, yj - CORR);
+    return result;
+  } else {
+    CFX_PtrArray* result = new CFX_PtrArray;
+    result->SetSize(4);
+    (*result)[0] = new CBC_ResultPoint(ti + CORR, tj + CORR);
+    (*result)[1] = new CBC_ResultPoint(zi + CORR, zj - CORR);
+    (*result)[2] = new CBC_ResultPoint(xi - CORR, xj + CORR);
+    (*result)[3] = new CBC_ResultPoint(yi - CORR, yj - CORR);
+    return result;
+  }
+}
+FX_BOOL CBC_WhiteRectangleDetector::ContainsBlackPoint(int32_t a,
+                                                       int32_t b,
+                                                       int32_t fixed,
+                                                       FX_BOOL horizontal) {
+  if (horizontal) {
+    for (int32_t x = a; x <= b; x++) {
+      if (m_image->Get(x, fixed)) {
+        return TRUE;
+      }
+    }
+  } else {
+    for (int32_t y = a; y <= b; y++) {
+      if (m_image->Get(fixed, y)) {
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
diff --git a/xfa/fxbarcode/common/BC_WhiteRectangleDetector.h b/xfa/fxbarcode/common/BC_WhiteRectangleDetector.h
new file mode 100644
index 0000000..3d6c01c
--- /dev/null
+++ b/xfa/fxbarcode/common/BC_WhiteRectangleDetector.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
+#define XFA_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_ResultPoint;
+
+class CBC_WhiteRectangleDetector {
+ public:
+  CBC_WhiteRectangleDetector(CBC_CommonBitMatrix* image);
+  CBC_WhiteRectangleDetector(CBC_CommonBitMatrix* image,
+                             int32_t initSize,
+                             int32_t x,
+                             int32_t y);
+  virtual ~CBC_WhiteRectangleDetector();
+  CFX_PtrArray* Detect(int32_t& e);
+  virtual void Init(int32_t& e);
+
+ private:
+  int32_t Round(float d);
+  CBC_ResultPoint* GetBlackPointOnSegment(FX_FLOAT aX,
+                                          FX_FLOAT aY,
+                                          FX_FLOAT bX,
+                                          FX_FLOAT bY);
+  int32_t DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY);
+  CFX_PtrArray* CenterEdges(CBC_ResultPoint* y,
+                            CBC_ResultPoint* z,
+                            CBC_ResultPoint* x,
+                            CBC_ResultPoint* t);
+  FX_BOOL ContainsBlackPoint(int32_t a,
+                             int32_t b,
+                             int32_t fixed,
+                             FX_BOOL horizontal);
+
+  static const int32_t INIT_SIZE = 30;
+  static const int32_t CORR = 1;
+
+  CBC_CommonBitMatrix* m_image;
+  int32_t m_height;
+  int32_t m_width;
+  int32_t m_leftInit;
+  int32_t m_rightInit;
+  int32_t m_downInit;
+  int32_t m_upInit;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
new file mode 100644
index 0000000..4d986cc
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
@@ -0,0 +1,104 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
+
+CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) {
+  m_field = field;
+}
+void CBC_ReedSolomonEncoder::Init() {
+  m_cachedGenerators.Add(new CBC_ReedSolomonGF256Poly(m_field, 1));
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(int32_t degree,
+                                                                 int32_t& e) {
+  if (degree >= m_cachedGenerators.GetSize()) {
+    CBC_ReedSolomonGF256Poly* lastGenerator =
+        (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators
+                                        [m_cachedGenerators.GetSize() - 1]);
+    for (int32_t d = m_cachedGenerators.GetSize(); d <= degree; d++) {
+      CFX_Int32Array temp;
+      temp.Add(1);
+      temp.Add(m_field->Exp(d - 1));
+      CBC_ReedSolomonGF256Poly temp_poly;
+      temp_poly.Init(m_field, &temp, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      CBC_ReedSolomonGF256Poly* nextGenerator =
+          lastGenerator->Multiply(&temp_poly, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      m_cachedGenerators.Add(nextGenerator);
+      lastGenerator = nextGenerator;
+    }
+  }
+  return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]);
+}
+void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array* toEncode,
+                                    int32_t ecBytes,
+                                    int32_t& e) {
+  if (ecBytes == 0) {
+    e = BCExceptionNoCorrectionBytes;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t dataBytes = toEncode->GetSize() - ecBytes;
+  if (dataBytes <= 0) {
+    e = BCExceptionNoDataBytesProvided;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CFX_Int32Array infoCoefficients;
+  infoCoefficients.SetSize(dataBytes);
+  for (int32_t x = 0; x < dataBytes; x++) {
+    infoCoefficients[x] = toEncode->operator[](x);
+  }
+  CBC_ReedSolomonGF256Poly info;
+  info.Init(m_field, &infoCoefficients, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> infoTemp(
+      info.MultiplyByMonomial(ecBytes, 1, e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CFX_PtrArray> temp(infoTemp->Divide(generator, e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CBC_ReedSolomonGF256Poly* remainder =
+      (CBC_ReedSolomonGF256Poly*)(temp->operator[](1));
+  CFX_Int32Array* coefficients = remainder->GetCoefficients();
+  int32_t numZeroCoefficients = ecBytes - coefficients->GetSize();
+  for (int32_t i = 0; i < numZeroCoefficients; i++) {
+    (*toEncode)[dataBytes + i] = 0;
+  }
+  for (int32_t y = 0; y < coefficients->GetSize(); y++) {
+    (*toEncode)[dataBytes + numZeroCoefficients + y] =
+        coefficients->operator[](y);
+  }
+  for (int32_t k = 0; k < temp->GetSize(); k++) {
+    delete (CBC_ReedSolomonGF256Poly*)(*temp)[k];
+  }
+}
+CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() {
+  for (int32_t i = 0; i < m_cachedGenerators.GetSize(); i++) {
+    delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i];
+  }
+}
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
new file mode 100644
index 0000000..6f6aef7
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
@@ -0,0 +1,29 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
+#define XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_ReedSolomonGF256;
+class CBC_ReedSolomonGF256Poly;
+
+class CBC_ReedSolomonEncoder {
+ private:
+  CBC_ReedSolomonGF256* m_field;
+  CFX_PtrArray m_cachedGenerators;
+  CBC_ReedSolomonGF256Poly* BuildGenerator(int32_t degree, int32_t& e);
+
+ public:
+  CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field);
+  virtual ~CBC_ReedSolomonEncoder();
+
+  void Encode(CFX_Int32Array* toEncode, int32_t ecBytes, int32_t& e);
+  virtual void Init();
+};
+
+#endif  // XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp
new file mode 100644
index 0000000..ff91c9d
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp
@@ -0,0 +1,221 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
+
+#include <memory>
+#include <utility>
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
+
+CBC_ReedSolomonDecoder::CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field) {
+  m_field = field;
+}
+CBC_ReedSolomonDecoder::~CBC_ReedSolomonDecoder() {}
+void CBC_ReedSolomonDecoder::Decode(CFX_Int32Array* received,
+                                    int32_t twoS,
+                                    int32_t& e) {
+  CBC_ReedSolomonGF256Poly poly;
+  poly.Init(m_field, received, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CFX_Int32Array syndromeCoefficients;
+  syndromeCoefficients.SetSize(twoS);
+  FX_BOOL dataMatrix = FALSE;
+  FX_BOOL noError = TRUE;
+  for (int32_t i = 0; i < twoS; i++) {
+    int32_t eval = poly.EvaluateAt(m_field->Exp(dataMatrix ? i + 1 : i));
+    syndromeCoefficients[twoS - 1 - i] = eval;
+    if (eval != 0) {
+      noError = FALSE;
+    }
+  }
+  if (noError) {
+    return;
+  }
+  CBC_ReedSolomonGF256Poly syndrome;
+  syndrome.Init(m_field, &syndromeCoefficients, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> temp(
+      m_field->BuildMonomial(twoS, 1, e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CFX_PtrArray> sigmaOmega(
+      RunEuclideanAlgorithm(temp.get(), &syndrome, twoS, e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> sigma(
+      (CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[0]);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> omega(
+      (CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[1]);
+  std::unique_ptr<CFX_Int32Array> errorLocations(
+      FindErrorLocations(sigma.get(), e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CFX_Int32Array> errorMagnitudes(
+      FindErrorMagnitudes(omega.get(), errorLocations.get(), dataMatrix, e));
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  for (int32_t k = 0; k < errorLocations->GetSize(); k++) {
+    int32_t position =
+        received->GetSize() - 1 - m_field->Log((*errorLocations)[k], e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (position < 0) {
+      e = BCExceptionBadErrorLocation;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    (*received)[position] = CBC_ReedSolomonGF256::AddOrSubtract(
+        (*received)[position], (*errorMagnitudes)[k]);
+  }
+}
+CFX_PtrArray* CBC_ReedSolomonDecoder::RunEuclideanAlgorithm(
+    CBC_ReedSolomonGF256Poly* a,
+    CBC_ReedSolomonGF256Poly* b,
+    int32_t R,
+    int32_t& e) {
+  if (a->GetDegree() < b->GetDegree()) {
+    CBC_ReedSolomonGF256Poly* temp = a;
+    a = b;
+    b = temp;
+  }
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> rLast(a->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> r(b->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> sLast(m_field->GetOne()->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> s(m_field->GetZero()->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> tLast(m_field->GetZero()->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> t(m_field->GetOne()->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  while (r->GetDegree() >= R / 2) {
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> rLastLast = std::move(rLast);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> sLastLast = std::move(sLast);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> tLastlast = std::move(tLast);
+    rLast = std::move(r);
+    sLast = std::move(s);
+    tLast = std::move(t);
+    if (rLast->IsZero()) {
+      e = BCExceptionR_I_1IsZero;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    r.reset(rLastLast->Clone(e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> q(m_field->GetZero()->Clone(e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    int32_t denominatorLeadingTerm = rLast->GetCoefficients(rLast->GetDegree());
+    int32_t dltInverse = m_field->Inverse(denominatorLeadingTerm, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    while (r->GetDegree() >= rLast->GetDegree() && !(r->IsZero())) {
+      int32_t degreeDiff = r->GetDegree() - rLast->GetDegree();
+      int32_t scale =
+          m_field->Multiply(r->GetCoefficients(r->GetDegree()), dltInverse);
+      std::unique_ptr<CBC_ReedSolomonGF256Poly> build(
+          m_field->BuildMonomial(degreeDiff, scale, e));
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      q.reset(q->AddOrSubtract(build.get(), e));
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      std::unique_ptr<CBC_ReedSolomonGF256Poly> multiply(
+          rLast->MultiplyByMonomial(degreeDiff, scale, e));
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      r.reset(r->AddOrSubtract(multiply.get(), e));
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> temp1(
+        q->Multiply(sLast.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    s.reset(temp1->AddOrSubtract(sLastLast.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> temp5(
+        q->Multiply(tLast.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    t.reset(temp5->AddOrSubtract(tLastlast.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  int32_t sigmaTildeAtZero = t->GetCoefficients(0);
+  if (sigmaTildeAtZero == 0) {
+    e = BCExceptionIsZero;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  int32_t inverse = m_field->Inverse(sigmaTildeAtZero, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> sigma(t->Multiply(inverse, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> omega(r->Multiply(inverse, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* temp = new CFX_PtrArray;
+  temp->Add(sigma.release());
+  temp->Add(omega.release());
+  return temp;
+}
+CFX_Int32Array* CBC_ReedSolomonDecoder::FindErrorLocations(
+    CBC_ReedSolomonGF256Poly* errorLocator,
+    int32_t& e) {
+  int32_t numErrors = errorLocator->GetDegree();
+  if (numErrors == 1) {
+    std::unique_ptr<CFX_Int32Array> temp(new CFX_Int32Array);
+    temp->Add(errorLocator->GetCoefficients(1));
+    return temp.release();
+  }
+  CFX_Int32Array* tempT = new CFX_Int32Array;
+  tempT->SetSize(numErrors);
+  std::unique_ptr<CFX_Int32Array> result(tempT);
+  int32_t ie = 0;
+  for (int32_t i = 1; i < 256 && ie < numErrors; i++) {
+    if (errorLocator->EvaluateAt(i) == 0) {
+      (*result)[ie] = m_field->Inverse(i, ie);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      ie++;
+    }
+  }
+  if (ie != numErrors) {
+    e = BCExceptionDegreeNotMatchRoots;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return result.release();
+}
+CFX_Int32Array* CBC_ReedSolomonDecoder::FindErrorMagnitudes(
+    CBC_ReedSolomonGF256Poly* errorEvaluator,
+    CFX_Int32Array* errorLocations,
+    FX_BOOL dataMatrix,
+    int32_t& e) {
+  int32_t s = errorLocations->GetSize();
+  CFX_Int32Array* temp = new CFX_Int32Array;
+  temp->SetSize(s);
+  std::unique_ptr<CFX_Int32Array> result(temp);
+  for (int32_t i = 0; i < s; i++) {
+    int32_t xiInverse = m_field->Inverse(errorLocations->operator[](i), e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    int32_t denominator = 1;
+    for (int32_t j = 0; j < s; j++) {
+      if (i != j) {
+        denominator = m_field->Multiply(
+            denominator, CBC_ReedSolomonGF256::AddOrSubtract(
+                             1, m_field->Multiply(errorLocations->operator[](j),
+                                                  xiInverse)));
+      }
+    }
+    int32_t temp = m_field->Inverse(denominator, temp);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    (*result)[i] =
+        m_field->Multiply(errorEvaluator->EvaluateAt(xiInverse), temp);
+  }
+  return result.release();
+}
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h
new file mode 100644
index 0000000..ec14344
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
+#define XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_ReedSolomonGF256;
+class CBC_ReedSolomonGF256Poly;
+
+class CBC_ReedSolomonDecoder {
+ private:
+  CBC_ReedSolomonGF256* m_field;
+
+ public:
+  CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field);
+  virtual ~CBC_ReedSolomonDecoder();
+  void Decode(CFX_Int32Array* received, int32_t twoS, int32_t& e);
+  CFX_PtrArray* RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a,
+                                      CBC_ReedSolomonGF256Poly* b,
+                                      int32_t R,
+                                      int32_t& e);
+  CFX_Int32Array* FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator,
+                                     int32_t& e);
+  CFX_Int32Array* FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator,
+                                      CFX_Int32Array* errorLocations,
+                                      FX_BOOL dataMatrix,
+                                      int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
new file mode 100644
index 0000000..5e9fd33
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
@@ -0,0 +1,124 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
+
+CBC_ReedSolomonGF256* CBC_ReedSolomonGF256::QRCodeFild = NULL;
+CBC_ReedSolomonGF256* CBC_ReedSolomonGF256::DataMatrixField = NULL;
+void CBC_ReedSolomonGF256::Initialize() {
+  QRCodeFild = new CBC_ReedSolomonGF256(0x011D);
+  QRCodeFild->Init();
+  DataMatrixField = new CBC_ReedSolomonGF256(0x012D);
+  DataMatrixField->Init();
+}
+void CBC_ReedSolomonGF256::Finalize() {
+  if (QRCodeFild) {
+    delete QRCodeFild;
+  }
+  QRCodeFild = NULL;
+  if (DataMatrixField) {
+    delete DataMatrixField;
+  }
+  DataMatrixField = NULL;
+}
+CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(int32_t primitive) {
+  int32_t x = 1;
+  for (int32_t j = 0; j < 256; j++) {
+    m_expTable[j] = x;
+    x <<= 1;
+    if (x >= 0x100) {
+      x ^= primitive;
+    }
+  }
+  for (int32_t i = 0; i < 255; i++) {
+    m_logTable[m_expTable[i]] = i;
+  }
+  m_logTable[0] = 0;
+}
+void CBC_ReedSolomonGF256::Init() {
+  m_zero = new CBC_ReedSolomonGF256Poly(this, 0);
+  m_one = new CBC_ReedSolomonGF256Poly(this, 1);
+}
+CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() {
+  delete m_zero;
+  delete m_one;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero() {
+  return m_zero;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne() {
+  return m_one;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(
+    int32_t degree,
+    int32_t coefficient,
+    int32_t& e) {
+  if (degree < 0) {
+    e = BCExceptionDegreeIsNegative;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  if (coefficient == 0) {
+    CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return temp;
+  }
+  CFX_Int32Array coefficients;
+  coefficients.SetSize(degree + 1);
+  coefficients[0] = coefficient;
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(this, &coefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+int32_t CBC_ReedSolomonGF256::AddOrSubtract(int32_t a, int32_t b) {
+  return a ^ b;
+}
+int32_t CBC_ReedSolomonGF256::Exp(int32_t a) {
+  return m_expTable[a];
+}
+int32_t CBC_ReedSolomonGF256::Log(int32_t a, int32_t& e) {
+  if (a == 0) {
+    e = BCExceptionAIsZero;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  return m_logTable[a];
+}
+int32_t CBC_ReedSolomonGF256::Inverse(int32_t a, int32_t& e) {
+  if (a == 0) {
+    e = BCExceptionAIsZero;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  return m_expTable[255 - m_logTable[a]];
+}
+int32_t CBC_ReedSolomonGF256::Multiply(int32_t a, int32_t b) {
+  if (a == 0 || b == 0) {
+    return 0;
+  }
+  if (a == 1) {
+    return b;
+  }
+  if (b == 1) {
+    return a;
+  }
+  return m_expTable[(m_logTable[a] + m_logTable[b]) % 255];
+}
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h
new file mode 100644
index 0000000..099cab5
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h
@@ -0,0 +1,41 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
+#define XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_ReedSolomonGF256Poly;
+class CBC_ReedSolomonGF256 {
+ public:
+  static void Initialize();
+  static void Finalize();
+  static CBC_ReedSolomonGF256* QRCodeFild;
+  static CBC_ReedSolomonGF256* DataMatrixField;
+  CBC_ReedSolomonGF256(int32_t primitive);
+  virtual ~CBC_ReedSolomonGF256();
+  CBC_ReedSolomonGF256Poly* GetZero();
+  CBC_ReedSolomonGF256Poly* GetOne();
+  CBC_ReedSolomonGF256Poly* BuildMonomial(int32_t degree,
+                                          int32_t coefficient,
+                                          int32_t& e);
+  static int32_t AddOrSubtract(int32_t a, int32_t b);
+  int32_t Exp(int32_t a);
+  int32_t Log(int32_t a, int32_t& e);
+  int32_t Inverse(int32_t a, int32_t& e);
+  int32_t Multiply(int32_t a, int32_t b);
+  virtual void Init();
+
+ private:
+  int32_t m_expTable[256];
+  int32_t m_logTable[256];
+  CBC_ReedSolomonGF256Poly* m_zero;
+  CBC_ReedSolomonGF256Poly* m_one;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
new file mode 100644
index 0000000..ee22390
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
@@ -0,0 +1,254 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+
+CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field,
+                                                   int32_t coefficients) {
+  if (field == NULL) {
+    return;
+  }
+  m_field = field;
+  m_coefficients.Add(coefficients);
+}
+CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() {
+  m_field = NULL;
+}
+void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
+                                    CFX_Int32Array* coefficients,
+                                    int32_t& e) {
+  if (coefficients == NULL || coefficients->GetSize() == 0) {
+    e = BCExceptionCoefficientsSizeIsNull;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  m_field = field;
+  int32_t coefficientsLength = coefficients->GetSize();
+  if ((coefficientsLength > 1 && (*coefficients)[0] == 0)) {
+    int32_t firstNonZero = 1;
+    while ((firstNonZero < coefficientsLength) &&
+           ((*coefficients)[firstNonZero] == 0)) {
+      firstNonZero++;
+    }
+    if (firstNonZero == coefficientsLength) {
+      m_coefficients.Copy(*(m_field->GetZero()->GetCoefficients()));
+    } else {
+      m_coefficients.SetSize(coefficientsLength - firstNonZero);
+      for (int32_t i = firstNonZero, j = 0; i < coefficientsLength; i++, j++) {
+        m_coefficients[j] = coefficients->operator[](i);
+      }
+    }
+  } else {
+    m_coefficients.Copy(*coefficients);
+  }
+}
+CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() {
+  return &m_coefficients;
+}
+int32_t CBC_ReedSolomonGF256Poly::GetDegree() {
+  return m_coefficients.GetSize() - 1;
+}
+FX_BOOL CBC_ReedSolomonGF256Poly::IsZero() {
+  return m_coefficients[0] == 0;
+}
+int32_t CBC_ReedSolomonGF256Poly::GetCoefficients(int32_t degree) {
+  return m_coefficients[m_coefficients.GetSize() - 1 - degree];
+}
+int32_t CBC_ReedSolomonGF256Poly::EvaluateAt(int32_t a) {
+  if (a == 0) {
+    return GetCoefficients(0);
+  }
+  int32_t size = m_coefficients.GetSize();
+  if (a == 1) {
+    int32_t result = 0;
+    for (int32_t i = 0; i < size; i++) {
+      result = CBC_ReedSolomonGF256::AddOrSubtract(result, m_coefficients[i]);
+    }
+    return result;
+  }
+  int32_t result = m_coefficients[0];
+  for (int32_t j = 1; j < size; j++) {
+    result = CBC_ReedSolomonGF256::AddOrSubtract(m_field->Multiply(a, result),
+                                                 m_coefficients[j]);
+  }
+  return result;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Clone(int32_t& e) {
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(m_field, &m_coefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::AddOrSubtract(
+    CBC_ReedSolomonGF256Poly* other,
+    int32_t& e) {
+  if (IsZero()) {
+    return other->Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  if (other->IsZero()) {
+    return Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CFX_Int32Array smallerCoefficients;
+  smallerCoefficients.Copy(m_coefficients);
+  CFX_Int32Array largerCoefficients;
+  largerCoefficients.Copy(*(other->GetCoefficients()));
+  if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) {
+    CFX_Int32Array temp;
+    temp.Copy(smallerCoefficients);
+    smallerCoefficients.Copy(largerCoefficients);
+    largerCoefficients.Copy(temp);
+  }
+  CFX_Int32Array sumDiff;
+  sumDiff.SetSize(largerCoefficients.GetSize());
+  int32_t lengthDiff =
+      largerCoefficients.GetSize() - smallerCoefficients.GetSize();
+  for (int32_t i = 0; i < lengthDiff; i++) {
+    sumDiff[i] = largerCoefficients[i];
+  }
+  for (int32_t j = lengthDiff; j < largerCoefficients.GetSize(); j++) {
+    sumDiff[j] = (CBC_ReedSolomonGF256::AddOrSubtract(
+        smallerCoefficients[j - lengthDiff], largerCoefficients[j]));
+  }
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(m_field, &sumDiff, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(
+    CBC_ReedSolomonGF256Poly* other,
+    int32_t& e) {
+  if (IsZero() || other->IsZero()) {
+    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return temp;
+  }
+  CFX_Int32Array aCoefficients;
+  aCoefficients.Copy(m_coefficients);
+  int32_t aLength = m_coefficients.GetSize();
+  CFX_Int32Array bCoefficients;
+  bCoefficients.Copy(*(other->GetCoefficients()));
+  int32_t bLength = other->GetCoefficients()->GetSize();
+  CFX_Int32Array product;
+  product.SetSize(aLength + bLength - 1);
+  for (int32_t i = 0; i < aLength; i++) {
+    int32_t aCoeff = m_coefficients[i];
+    for (int32_t j = 0; j < bLength; j++) {
+      product[i + j] = CBC_ReedSolomonGF256::AddOrSubtract(
+          product[i + j],
+          m_field->Multiply(aCoeff, other->GetCoefficients()->operator[](j)));
+    }
+  }
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(m_field, &product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(int32_t scalar,
+                                                             int32_t& e) {
+  if (scalar == 0) {
+    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return temp;
+  }
+  if (scalar == 1) {
+    return Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  int32_t size = m_coefficients.GetSize();
+  CFX_Int32Array product;
+  product.SetSize(size);
+  for (int32_t i = 0; i < size; i++) {
+    product[i] = m_field->Multiply(m_coefficients[i], scalar);
+  }
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(m_field, &product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::MultiplyByMonomial(
+    int32_t degree,
+    int32_t coefficient,
+    int32_t& e) {
+  if (degree < 0) {
+    e = BCExceptionDegreeIsNegative;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  if (coefficient == 0) {
+    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return temp;
+  }
+  int32_t size = m_coefficients.GetSize();
+  CFX_Int32Array product;
+  product.SetSize(size + degree);
+  for (int32_t i = 0; i < size; i++) {
+    product[i] = (m_field->Multiply(m_coefficients[i], coefficient));
+  }
+  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
+  temp->Init(m_field, &product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CFX_PtrArray* CBC_ReedSolomonGF256Poly::Divide(CBC_ReedSolomonGF256Poly* other,
+                                               int32_t& e) {
+  if (other->IsZero()) {
+    e = BCExceptionDivideByZero;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> quotient(
+      m_field->GetZero()->Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  std::unique_ptr<CBC_ReedSolomonGF256Poly> remainder(Clone(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t denominatorLeadingTerm = other->GetCoefficients(other->GetDegree());
+  int32_t inverseDenominatorLeadingTeam =
+      m_field->Inverse(denominatorLeadingTerm, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  while (remainder->GetDegree() >= other->GetDegree() && !remainder->IsZero()) {
+    int32_t degreeDifference = remainder->GetDegree() - other->GetDegree();
+    int32_t scale =
+        m_field->Multiply(remainder->GetCoefficients((remainder->GetDegree())),
+                          inverseDenominatorLeadingTeam);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> term(
+        other->MultiplyByMonomial(degreeDifference, scale, e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    std::unique_ptr<CBC_ReedSolomonGF256Poly> iteratorQuotient(
+        m_field->BuildMonomial(degreeDifference, scale, e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    quotient.reset(quotient->AddOrSubtract(iteratorQuotient.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    remainder.reset(remainder->AddOrSubtract(term.get(), e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CFX_PtrArray* tempPtrA = new CFX_PtrArray;
+  tempPtrA->Add(quotient.release());
+  tempPtrA->Add(remainder.release());
+  return tempPtrA;
+}
+CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() {
+  m_coefficients.RemoveAll();
+}
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
new file mode 100644
index 0000000..16a1f90
--- /dev/null
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
+#define XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_ReedSolomonGF256;
+
+class CBC_ReedSolomonGF256Poly {
+ public:
+  CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, int32_t coefficients);
+  CBC_ReedSolomonGF256Poly();
+  virtual ~CBC_ReedSolomonGF256Poly();
+  int32_t GetCoefficients(int32_t degree);
+  CFX_Int32Array* GetCoefficients();
+  int32_t GetDegree();
+  FX_BOOL IsZero();
+  int32_t EvaluateAt(int32_t a);
+  CBC_ReedSolomonGF256Poly* AddOrSubtract(CBC_ReedSolomonGF256Poly* other,
+                                          int32_t& e);
+  CBC_ReedSolomonGF256Poly* Multiply(CBC_ReedSolomonGF256Poly* other,
+                                     int32_t& e);
+  CBC_ReedSolomonGF256Poly* Multiply(int32_t scalar, int32_t& e);
+  CBC_ReedSolomonGF256Poly* MultiplyByMonomial(int32_t degree,
+                                               int32_t coefficient,
+                                               int32_t& e);
+  CFX_PtrArray* Divide(CBC_ReedSolomonGF256Poly* other, int32_t& e);
+  CBC_ReedSolomonGF256Poly* Clone(int32_t& e);
+  virtual void Init(CBC_ReedSolomonGF256* field,
+                    CFX_Int32Array* coefficients,
+                    int32_t& e);
+
+ private:
+  CBC_ReedSolomonGF256* m_field;
+  CFX_Int32Array m_coefficients;
+};
+
+#endif  // XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
new file mode 100644
index 0000000..00d8fc1
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
@@ -0,0 +1,98 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_ASCIIEncoder::CBC_ASCIIEncoder() {}
+CBC_ASCIIEncoder::~CBC_ASCIIEncoder() {}
+int32_t CBC_ASCIIEncoder::getEncodingMode() {
+  return ASCII_ENCODATION;
+}
+void CBC_ASCIIEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
+  int32_t n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(
+      context.m_msg, context.m_pos);
+  if (n >= 2) {
+    FX_WCHAR code =
+        encodeASCIIDigits(context.m_msg.GetAt(context.m_pos),
+                          context.m_msg.GetAt(context.m_pos + 1), e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    context.writeCodeword(code);
+    context.m_pos += 2;
+  } else {
+    FX_WCHAR c = context.getCurrentChar();
+    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+        context.m_msg, context.m_pos, getEncodingMode());
+    if (newMode != getEncodingMode()) {
+      switch (newMode) {
+        case BASE256_ENCODATION:
+          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
+          context.signalEncoderChange(BASE256_ENCODATION);
+          return;
+        case C40_ENCODATION:
+          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
+          context.signalEncoderChange(C40_ENCODATION);
+          return;
+        case X12_ENCODATION:
+          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
+          context.signalEncoderChange(X12_ENCODATION);
+          break;
+        case TEXT_ENCODATION:
+          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
+          context.signalEncoderChange(TEXT_ENCODATION);
+          break;
+        case EDIFACT_ENCODATION:
+          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
+          context.signalEncoderChange(EDIFACT_ENCODATION);
+          break;
+        default:
+          e = BCExceptionIllegalStateIllegalMode;
+          return;
+      }
+    } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
+      context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
+      context.writeCodeword((FX_WCHAR)(c - 128 + 1));
+      context.m_pos++;
+    } else {
+      context.writeCodeword((FX_WCHAR)(c + 1));
+      context.m_pos++;
+    }
+  }
+}
+FX_WCHAR CBC_ASCIIEncoder::encodeASCIIDigits(FX_WCHAR digit1,
+                                             FX_WCHAR digit2,
+                                             int32_t& e) {
+  if (CBC_HighLevelEncoder::isDigit(digit1) &&
+      CBC_HighLevelEncoder::isDigit(digit2)) {
+    int32_t num = (digit1 - 48) * 10 + (digit2 - 48);
+    return (FX_WCHAR)(num + 130);
+  }
+  e = BCExceptionIllegalArgumentNotGigits;
+  return 0;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h b/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h
new file mode 100644
index 0000000..11be5e0
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+class CBC_EncoderContext;
+
+class CBC_ASCIIEncoder : public CBC_Encoder {
+ public:
+  CBC_ASCIIEncoder();
+  virtual ~CBC_ASCIIEncoder();
+  int32_t getEncodingMode();
+  void Encode(CBC_EncoderContext& context, int32_t& e);
+
+ private:
+  static FX_WCHAR encodeASCIIDigits(FX_WCHAR digit1,
+                                    FX_WCHAR digit2,
+                                    int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp b/xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp
new file mode 100644
index 0000000..98e7848
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp
@@ -0,0 +1,87 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_Base256Encoder::CBC_Base256Encoder() {}
+CBC_Base256Encoder::~CBC_Base256Encoder() {}
+int32_t CBC_Base256Encoder::getEncodingMode() {
+  return BASE256_ENCODATION;
+}
+void CBC_Base256Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
+  CFX_WideString buffer;
+  buffer += (FX_WCHAR)'\0';
+  while (context.hasMoreCharacters()) {
+    FX_WCHAR c = context.getCurrentChar();
+    buffer += c;
+    context.m_pos++;
+    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+        context.m_msg, context.m_pos, getEncodingMode());
+    if (newMode != getEncodingMode()) {
+      context.signalEncoderChange(newMode);
+      break;
+    }
+  }
+  int32_t dataCount = buffer.GetLength() - 1;
+  FX_CHAR buf[128];
+  FXSYS_itoa(dataCount, buf, 10);
+  buffer.SetAt(0, FX_WCHAR(*buf) - '0');
+  int32_t lengthFieldSize = 1;
+  int32_t currentSize =
+      context.getCodewordCount() + dataCount + lengthFieldSize;
+  context.updateSymbolInfo(currentSize, e);
+  if (e != BCExceptionNO) {
+    return;
+  }
+  FX_BOOL mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0;
+  if (context.hasMoreCharacters() || mustPad) {
+    if (dataCount <= 249) {
+      buffer.SetAt(0, (FX_WCHAR)dataCount);
+    } else if (dataCount > 249 && dataCount <= 1555) {
+      buffer.SetAt(0, (FX_WCHAR)((dataCount / 250) + 249));
+      buffer.Insert(1, (FX_WCHAR)(dataCount % 250));
+    } else {
+      e = BCExceptionIllegalStateMessageLengthInvalid;
+      return;
+    }
+  }
+  for (int32_t i = 0, c = buffer.GetLength(); i < c; i++) {
+    context.writeCodeword(
+        randomize255State(buffer.GetAt(i), context.getCodewordCount() + 1));
+  }
+}
+FX_WCHAR CBC_Base256Encoder::randomize255State(FX_WCHAR ch,
+                                               int32_t codewordPosition) {
+  int32_t pseudoRandom = ((149 * codewordPosition) % 255) + 1;
+  int32_t tempVariable = ch + pseudoRandom;
+  if (tempVariable <= 255) {
+    return (FX_WCHAR)tempVariable;
+  } else {
+    return (FX_WCHAR)(tempVariable - 256);
+  }
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_Base256Encoder.h b/xfa/fxbarcode/datamatrix/BC_Base256Encoder.h
new file mode 100644
index 0000000..64dbdc7
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_Base256Encoder.h
@@ -0,0 +1,23 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+class CBC_Base256Encoder : public CBC_Encoder {
+ public:
+  CBC_Base256Encoder();
+  virtual ~CBC_Base256Encoder();
+  int32_t getEncodingMode();
+  void Encode(CBC_EncoderContext& context, int32_t& e);
+
+ private:
+  static FX_WCHAR randomize255State(FX_WCHAR ch, int32_t codewordPosition);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp b/xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp
new file mode 100644
index 0000000..8858f60
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp
@@ -0,0 +1,198 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_C40Encoder::CBC_C40Encoder() {}
+CBC_C40Encoder::~CBC_C40Encoder() {}
+int32_t CBC_C40Encoder::getEncodingMode() {
+  return C40_ENCODATION;
+}
+void CBC_C40Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
+  CFX_WideString buffer;
+  while (context.hasMoreCharacters()) {
+    FX_WCHAR c = context.getCurrentChar();
+    context.m_pos++;
+    int32_t lastCharSize = encodeChar(c, buffer, e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    int32_t unwritten = (buffer.GetLength() / 3) * 2;
+    int32_t curCodewordCount = context.getCodewordCount() + unwritten;
+    context.updateSymbolInfo(curCodewordCount, e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
+    if (!context.hasMoreCharacters()) {
+      CFX_WideString removed;
+      if ((buffer.GetLength() % 3) == 2) {
+        if (available < 2 || available > 2) {
+          lastCharSize =
+              backtrackOneCharacter(context, buffer, removed, lastCharSize, e);
+          if (e != BCExceptionNO) {
+            return;
+          }
+        }
+      }
+      while ((buffer.GetLength() % 3) == 1 &&
+             ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) {
+        lastCharSize =
+            backtrackOneCharacter(context, buffer, removed, lastCharSize, e);
+        if (e != BCExceptionNO) {
+          return;
+        }
+      }
+      break;
+    }
+    int32_t count = buffer.GetLength();
+    if ((count % 3) == 0) {
+      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+          context.m_msg, context.m_pos, getEncodingMode());
+      if (newMode != getEncodingMode()) {
+        context.signalEncoderChange(newMode);
+        break;
+      }
+    }
+  }
+  handleEOD(context, buffer, e);
+}
+void CBC_C40Encoder::writeNextTriplet(CBC_EncoderContext& context,
+                                      CFX_WideString& buffer) {
+  context.writeCodewords(encodeToCodewords(buffer, 0));
+  buffer.Delete(0, 3);
+}
+void CBC_C40Encoder::handleEOD(CBC_EncoderContext& context,
+                               CFX_WideString& buffer,
+                               int32_t& e) {
+  int32_t unwritten = (buffer.GetLength() / 3) * 2;
+  int32_t rest = buffer.GetLength() % 3;
+  int32_t curCodewordCount = context.getCodewordCount() + unwritten;
+  context.updateSymbolInfo(curCodewordCount, e);
+  if (e != BCExceptionNO) {
+    return;
+  }
+  int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
+  if (rest == 2) {
+    buffer += (FX_WCHAR)'\0';
+    while (buffer.GetLength() >= 3) {
+      writeNextTriplet(context, buffer);
+    }
+    if (context.hasMoreCharacters()) {
+      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
+    }
+  } else if (available == 1 && rest == 1) {
+    while (buffer.GetLength() >= 3) {
+      writeNextTriplet(context, buffer);
+    }
+    if (context.hasMoreCharacters()) {
+      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
+    }
+    context.m_pos--;
+  } else if (rest == 0) {
+    while (buffer.GetLength() >= 3) {
+      writeNextTriplet(context, buffer);
+    }
+    if (available > 0 || context.hasMoreCharacters()) {
+      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
+    }
+  } else {
+    e = BCExceptionIllegalStateUnexpectedCase;
+    return;
+  }
+  context.signalEncoderChange(ASCII_ENCODATION);
+}
+int32_t CBC_C40Encoder::encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e) {
+  if (c == ' ') {
+    sb += (FX_WCHAR)'\3';
+    return 1;
+  } else if ((c >= '0') && (c <= '9')) {
+    sb += (FX_WCHAR)(c - 48 + 4);
+    return 1;
+  } else if ((c >= 'A') && (c <= 'Z')) {
+    sb += (FX_WCHAR)(c - 65 + 14);
+    return 1;
+  } else if (c <= 0x1f) {
+    sb += (FX_WCHAR)'\0';
+    sb += c;
+    return 2;
+  } else if ((c >= '!') && (c <= '/')) {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 33);
+    return 2;
+  } else if ((c >= ':') && (c <= '@')) {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 58 + 15);
+    return 2;
+  } else if ((c >= '[') && (c <= '_')) {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 91 + 22);
+    return 2;
+  } else if ((c >= 60) && (c <= 0x7f)) {
+    sb += (FX_WCHAR)'\2';
+    sb += (FX_WCHAR)(c - 96);
+    return 2;
+  } else if (c >= 80) {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)0x001e;
+    int32_t len = 2;
+    len += encodeChar((c - 128), sb, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    return len;
+  } else {
+    e = BCExceptionIllegalArgument;
+    return 0;
+  }
+}
+int32_t CBC_C40Encoder::backtrackOneCharacter(CBC_EncoderContext& context,
+                                              CFX_WideString& buffer,
+                                              CFX_WideString& removed,
+                                              int32_t lastCharSize,
+                                              int32_t& e) {
+  int32_t count = buffer.GetLength();
+  buffer.Delete(count - lastCharSize, count);
+  context.m_pos--;
+  FX_WCHAR c = context.getCurrentChar();
+  lastCharSize = encodeChar(c, removed, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  context.resetSymbolInfo();
+  return lastCharSize;
+}
+CFX_WideString CBC_C40Encoder::encodeToCodewords(CFX_WideString sb,
+                                                 int32_t startPos) {
+  FX_WCHAR c1 = sb.GetAt(startPos);
+  FX_WCHAR c2 = sb.GetAt(startPos + 1);
+  FX_WCHAR c3 = sb.GetAt(startPos + 2);
+  int32_t v = (1600 * c1) + (40 * c2) + c3 + 1;
+  FX_WCHAR cw1 = (FX_WCHAR)(v / 256);
+  FX_WCHAR cw2 = (FX_WCHAR)(v % 256);
+  CFX_WideString b1(cw1);
+  CFX_WideString b2(cw2);
+  return b1 + b2;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_C40Encoder.h b/xfa/fxbarcode/datamatrix/BC_C40Encoder.h
new file mode 100644
index 0000000..9dcb1e5
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_C40Encoder.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+class CBC_C40Encoder : public CBC_Encoder {
+ public:
+  CBC_C40Encoder();
+  virtual ~CBC_C40Encoder();
+  virtual int32_t getEncodingMode();
+  virtual void Encode(CBC_EncoderContext& context, int32_t& e);
+  static void writeNextTriplet(CBC_EncoderContext& context,
+                               CFX_WideString& buffer);
+  virtual void handleEOD(CBC_EncoderContext& context,
+                         CFX_WideString& buffer,
+                         int32_t& e);
+  virtual int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
+
+ private:
+  int32_t backtrackOneCharacter(CBC_EncoderContext& context,
+                                CFX_WideString& buffer,
+                                CFX_WideString& removed,
+                                int32_t lastCharSize,
+                                int32_t& e);
+  static CFX_WideString encodeToCodewords(CFX_WideString sb, int32_t startPos);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp
new file mode 100644
index 0000000..a0c00e9
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp
@@ -0,0 +1,378 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_DataMatrixBitMatrixParser::CBC_DataMatrixBitMatrixParser() {
+  m_mappingBitMatrix = NULL;
+  m_version = NULL;
+  m_readMappingMatrix = NULL;
+}
+void CBC_DataMatrixBitMatrixParser::Init(CBC_CommonBitMatrix* bitMatrix,
+                                         int32_t& e) {
+  int32_t dimension = bitMatrix->GetHeight();
+  if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) {
+    e = BCExceptionFormatException;
+    return;
+  }
+  m_version = ReadVersion(bitMatrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  m_mappingBitMatrix = ExtractDataRegion(bitMatrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  m_readMappingMatrix = new CBC_CommonBitMatrix();
+  m_readMappingMatrix->Init(m_mappingBitMatrix->GetWidth(),
+                            m_mappingBitMatrix->GetHeight());
+}
+CBC_DataMatrixBitMatrixParser::~CBC_DataMatrixBitMatrixParser() {
+  delete m_mappingBitMatrix;
+  delete m_readMappingMatrix;
+}
+CBC_DataMatrixVersion* CBC_DataMatrixBitMatrixParser::GetVersion() {
+  return m_version;
+}
+CBC_DataMatrixVersion* CBC_DataMatrixBitMatrixParser::ReadVersion(
+    CBC_CommonBitMatrix* bitMatrix,
+    int32_t& e) {
+  int32_t rows = bitMatrix->GetHeight();
+  int32_t columns = bitMatrix->GetWidth();
+  CBC_DataMatrixVersion* temp =
+      CBC_DataMatrixVersion::GetVersionForDimensions(rows, columns, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return temp;
+}
+CFX_ByteArray* CBC_DataMatrixBitMatrixParser::ReadCodewords(int32_t& e) {
+  std::unique_ptr<CFX_ByteArray> result(new CFX_ByteArray());
+  result->SetSize(m_version->GetTotalCodewords());
+  int32_t resultOffset = 0;
+  int32_t row = 4;
+  int32_t column = 0;
+  int32_t numRows = m_mappingBitMatrix->GetHeight();
+  int32_t numColumns = m_mappingBitMatrix->GetWidth();
+  FX_BOOL corner1Read = FALSE;
+  FX_BOOL corner2Read = FALSE;
+  FX_BOOL corner3Read = FALSE;
+  FX_BOOL corner4Read = FALSE;
+  do {
+    if ((row == numRows) && (column == 0) && !corner1Read) {
+      (*result)[resultOffset++] = (uint8_t)ReadCorner1(numRows, numColumns);
+      row -= 2;
+      column += 2;
+      corner1Read = TRUE;
+    } else if ((row == numRows - 2) && (column == 0) &&
+               ((numColumns & 0x03) != 0) && !corner2Read) {
+      (*result)[resultOffset++] = (uint8_t)ReadCorner2(numRows, numColumns);
+      row -= 2;
+      column += 2;
+      corner2Read = TRUE;
+    } else if ((row == numRows + 4) && (column == 2) &&
+               ((numColumns & 0x07) == 0) && !corner3Read) {
+      (*result)[resultOffset++] = (uint8_t)ReadCorner3(numRows, numColumns);
+      row -= 2;
+      column += 2;
+      corner3Read = TRUE;
+    } else if ((row == numRows - 2) && (column == 0) &&
+               ((numColumns & 0x07) == 4) && !corner4Read) {
+      (*result)[resultOffset++] = (uint8_t)ReadCorner4(numRows, numColumns);
+      row -= 2;
+      column += 2;
+      corner4Read = TRUE;
+    } else {
+      do {
+        if ((row < numRows) && (column >= 0) &&
+            !m_readMappingMatrix->Get(column, row)) {
+          if (resultOffset < (*result).GetSize()) {
+            (*result)[resultOffset++] =
+                (uint8_t)ReadUtah(row, column, numRows, numColumns);
+          }
+        }
+        row -= 2;
+        column += 2;
+      } while ((row >= 0) && (column < numColumns));
+      row += 1;
+      column += 3;
+      do {
+        if ((row >= 0) && (column < numColumns) &&
+            !m_readMappingMatrix->Get(column, row)) {
+          if (resultOffset < (*result).GetSize()) {
+            (*result)[resultOffset++] =
+                (uint8_t)ReadUtah(row, column, numRows, numColumns);
+          }
+        }
+        row += 2;
+        column -= 2;
+      } while ((row < numRows) && (column >= 0));
+      row += 3;
+      column += 1;
+    }
+  } while ((row < numRows) || (column < numColumns));
+  if (resultOffset != m_version->GetTotalCodewords()) {
+    e = BCExceptionFormatException;
+    return NULL;
+  }
+  return result.release();
+}
+FX_BOOL CBC_DataMatrixBitMatrixParser::ReadModule(int32_t row,
+                                                  int32_t column,
+                                                  int32_t numRows,
+                                                  int32_t numColumns) {
+  if (row < 0) {
+    row += numRows;
+    column += 4 - ((numRows + 4) & 0x07);
+  }
+  if (column < 0) {
+    column += numColumns;
+    row += 4 - ((numColumns + 4) & 0x07);
+  }
+  m_readMappingMatrix->Set(column, row);
+  return m_mappingBitMatrix->Get(column, row);
+}
+int32_t CBC_DataMatrixBitMatrixParser::ReadUtah(int32_t row,
+                                                int32_t column,
+                                                int32_t numRows,
+                                                int32_t numColumns) {
+  int32_t currentByte = 0;
+  if (ReadModule(row - 2, column - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row - 2, column - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row - 1, column - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row - 1, column - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row - 1, column, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row, column - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row, column - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(row, column, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  return currentByte;
+}
+int32_t CBC_DataMatrixBitMatrixParser::ReadCorner1(int32_t numRows,
+                                                   int32_t numColumns) {
+  int32_t currentByte = 0;
+  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 1, 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 1, 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(2, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(3, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  return currentByte;
+}
+int32_t CBC_DataMatrixBitMatrixParser::ReadCorner2(int32_t numRows,
+                                                   int32_t numColumns) {
+  int32_t currentByte = 0;
+  if (ReadModule(numRows - 3, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 2, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 4, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 3, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  return currentByte;
+}
+int32_t CBC_DataMatrixBitMatrixParser::ReadCorner3(int32_t numRows,
+                                                   int32_t numColumns) {
+  int32_t currentByte = 0;
+  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 1, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 3, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 3, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  return currentByte;
+}
+int32_t CBC_DataMatrixBitMatrixParser::ReadCorner4(int32_t numRows,
+                                                   int32_t numColumns) {
+  int32_t currentByte = 0;
+  if (ReadModule(numRows - 3, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 2, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(2, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  currentByte <<= 1;
+  if (ReadModule(3, numColumns - 1, numRows, numColumns)) {
+    currentByte |= 1;
+  }
+  return currentByte;
+}
+CBC_CommonBitMatrix* CBC_DataMatrixBitMatrixParser::ExtractDataRegion(
+    CBC_CommonBitMatrix* bitMatrix,
+    int32_t& e) {
+  int32_t symbolSizeRows = m_version->GetSymbolSizeRows();
+  int32_t symbolSizeColumns = m_version->GetSymbolSizeColumns();
+  if (bitMatrix->GetHeight() != symbolSizeRows) {
+    e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;
+    return NULL;
+  }
+  int32_t dataRegionSizeRows = m_version->GetDataRegionSizeRows();
+  int32_t dataRegionSizeColumns = m_version->GetDataRegionSizeColumns();
+  int32_t numDataRegionsRow = symbolSizeRows / dataRegionSizeRows;
+  int32_t numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns;
+  int32_t sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows;
+  int32_t sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns;
+  CBC_CommonBitMatrix* bitMatrixWithoutAlignment = new CBC_CommonBitMatrix();
+  bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow);
+  int32_t dataRegionRow;
+  for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) {
+    int32_t dataRegionRowOffset = dataRegionRow * dataRegionSizeRows;
+    int32_t dataRegionColumn;
+    for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn;
+         ++dataRegionColumn) {
+      int32_t dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns;
+      int32_t i;
+      for (i = 0; i < dataRegionSizeRows; ++i) {
+        int32_t readRowOffset =
+            dataRegionRow * (dataRegionSizeRows + 2) + 1 + i;
+        int32_t writeRowOffset = dataRegionRowOffset + i;
+        int32_t j;
+        for (j = 0; j < dataRegionSizeColumns; ++j) {
+          int32_t readColumnOffset =
+              dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j;
+          if (bitMatrix->Get(readColumnOffset, readRowOffset)) {
+            int32_t writeColumnOffset = dataRegionColumnOffset + j;
+            bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset);
+          }
+        }
+      }
+    }
+  }
+  return bitMatrixWithoutAlignment;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h
new file mode 100644
index 0000000..4c54d61
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h
@@ -0,0 +1,45 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_DataMatrixVersion;
+
+class CBC_DataMatrixBitMatrixParser {
+ public:
+  CBC_DataMatrixBitMatrixParser();
+  virtual ~CBC_DataMatrixBitMatrixParser();
+  CBC_DataMatrixVersion* GetVersion();
+  CFX_ByteArray* ReadCodewords(int32_t& e);
+  FX_BOOL ReadModule(int32_t row,
+                     int32_t column,
+                     int32_t numRows,
+                     int32_t numColumns);
+  int32_t ReadUtah(int32_t row,
+                   int32_t column,
+                   int32_t numRows,
+                   int32_t numColumns);
+  int32_t ReadCorner1(int32_t numRows, int32_t numColumns);
+  int32_t ReadCorner2(int32_t numRows, int32_t numColumns);
+  int32_t ReadCorner3(int32_t numRows, int32_t numColumns);
+  int32_t ReadCorner4(int32_t numRows, int32_t numColumns);
+  CBC_CommonBitMatrix* ExtractDataRegion(CBC_CommonBitMatrix* bitMatrix,
+                                         int32_t& e);
+  virtual void Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e);
+
+ private:
+  static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix* bitMatrix,
+                                            int32_t& e);
+  CBC_CommonBitMatrix* m_mappingBitMatrix;
+  CBC_CommonBitMatrix* m_readMappingMatrix;
+  CBC_DataMatrixVersion* m_version;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp
new file mode 100644
index 0000000..89c09c2
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp
@@ -0,0 +1,115 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock() {}
+CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(int32_t numDataCodewords,
+                                                 CFX_ByteArray* codewords) {
+  m_codewords.Copy(*codewords);
+  m_numDataCodewords = numDataCodewords;
+}
+CFX_PtrArray* CBC_DataMatrixDataBlock::GetDataBlocks(
+    CFX_ByteArray* rawCodewords,
+    CBC_DataMatrixVersion* version,
+    int32_t& e) {
+  ECBlocks* ecBlocks = version->GetECBlocks();
+  int32_t totalBlocks = 0;
+  const CFX_PtrArray& ecBlockArray = ecBlocks->GetECBlocks();
+  int32_t i;
+  for (i = 0; i < ecBlockArray.GetSize(); i++) {
+    totalBlocks += ((ECB*)ecBlockArray[i])->GetCount();
+  }
+  std::unique_ptr<CFX_PtrArray> result(new CFX_PtrArray());
+  result->SetSize(totalBlocks);
+  int32_t numResultBlocks = 0;
+  int32_t j;
+  for (j = 0; j < ecBlockArray.GetSize(); j++) {
+    for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) {
+      int32_t numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords();
+      int32_t numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords;
+      CFX_ByteArray codewords;
+      codewords.SetSize(numBlockCodewords);
+      (*result)[numResultBlocks++] =
+          new CBC_DataMatrixDataBlock(numDataCodewords, &codewords);
+      codewords.SetSize(0);
+    }
+  }
+  int32_t longerBlocksTotalCodewords =
+      ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();
+  int32_t longerBlocksNumDataCodewords =
+      longerBlocksTotalCodewords - ecBlocks->GetECCodewords();
+  int32_t shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1;
+  int32_t rawCodewordsOffset = 0;
+  for (i = 0; i < shorterBlocksNumDataCodewords; i++) {
+    int32_t j;
+    for (j = 0; j < numResultBlocks; j++) {
+      if (rawCodewordsOffset < rawCodewords->GetSize()) {
+        ((CBC_DataMatrixDataBlock*)(*result)[j])
+            ->GetCodewords()
+            ->
+            operator[](i) = (*rawCodewords)[rawCodewordsOffset++];
+      }
+    }
+  }
+  const bool specialVersion = version->GetVersionNumber() == 24;
+  int32_t numLongerBlocks = specialVersion ? 8 : numResultBlocks;
+  for (j = 0; j < numLongerBlocks; j++) {
+    if (rawCodewordsOffset < rawCodewords->GetSize()) {
+      ((CBC_DataMatrixDataBlock*)(*result)[j])
+          ->GetCodewords()
+          ->
+          operator[](longerBlocksNumDataCodewords - 1) =
+          (*rawCodewords)[rawCodewordsOffset++];
+    }
+  }
+  int32_t max =
+      ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();
+  for (i = longerBlocksNumDataCodewords; i < max; i++) {
+    int32_t j;
+    for (j = 0; j < numResultBlocks; j++) {
+      int32_t iOffset = specialVersion && j > 7 ? i - 1 : i;
+      if (rawCodewordsOffset < rawCodewords->GetSize()) {
+        ((CBC_DataMatrixDataBlock*)(*result)[j])
+            ->GetCodewords()
+            ->
+            operator[](iOffset) = (*rawCodewords)[rawCodewordsOffset++];
+      }
+    }
+  }
+  if (rawCodewordsOffset != rawCodewords->GetSize()) {
+    e = BCExceptionIllegalArgument;
+    return NULL;
+  }
+  return result.release();
+}
+int32_t CBC_DataMatrixDataBlock::GetNumDataCodewords() {
+  return m_numDataCodewords;
+}
+CFX_ByteArray* CBC_DataMatrixDataBlock::GetCodewords() {
+  return &m_codewords;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h
new file mode 100644
index 0000000..218bb0b
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_DataMatrixVersion;
+
+class CBC_DataMatrixDataBlock {
+ public:
+  virtual ~CBC_DataMatrixDataBlock();
+
+  int32_t GetNumDataCodewords();
+  CFX_ByteArray* GetCodewords();
+
+  static CFX_PtrArray* GetDataBlocks(CFX_ByteArray* rawCodewords,
+                                     CBC_DataMatrixVersion* version,
+                                     int32_t& e);
+
+ private:
+  int32_t m_numDataCodewords;
+  CFX_ByteArray m_codewords;
+
+  CBC_DataMatrixDataBlock(int32_t numDataCodewords, CFX_ByteArray* codewords);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp
new file mode 100644
index 0000000..693b6b9
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp
@@ -0,0 +1,473 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitSource.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h"
+
+const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_BASIC_SET_CHARS[] = {
+    '*', '*', '*', ' ', '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'};
+const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = {
+    '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*',  '+', ',', '-', '.',
+    '/', ':', ';', '<', '=', '>', '?',  '@', '[', '\\', ']', '^', '_'};
+const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = {
+    '*', '*', '*', ' ', '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'};
+const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = {
+    '\'', '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', '{', '|', '}', '~', (FX_CHAR)127};
+const int32_t CBC_DataMatrixDecodedBitStreamParser::PAD_ENCODE = 0;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::ASCII_ENCODE = 1;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::C40_ENCODE = 2;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::TEXT_ENCODE = 3;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::ANSIX12_ENCODE = 4;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::EDIFACT_ENCODE = 5;
+const int32_t CBC_DataMatrixDecodedBitStreamParser::BASE256_ENCODE = 6;
+CBC_DataMatrixDecodedBitStreamParser::CBC_DataMatrixDecodedBitStreamParser() {}
+CBC_DataMatrixDecodedBitStreamParser::~CBC_DataMatrixDecodedBitStreamParser() {}
+CBC_CommonDecoderResult* CBC_DataMatrixDecodedBitStreamParser::Decode(
+    CFX_ByteArray& bytes,
+    int32_t& e) {
+  CBC_CommonBitSource bits(&bytes);
+  CFX_ByteString result;
+  CFX_ByteString resultTrailer;
+  CFX_Int32Array byteSegments;
+  int32_t mode = ASCII_ENCODE;
+  do {
+    if (mode == 1) {
+      mode = DecodeAsciiSegment(&bits, result, resultTrailer, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    } else {
+      switch (mode) {
+        case 2:
+          DecodeC40Segment(&bits, result, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          break;
+        case 3:
+          DecodeTextSegment(&bits, result, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          break;
+        case 4:
+          DecodeAnsiX12Segment(&bits, result, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          break;
+        case 5:
+          DecodeEdifactSegment(&bits, result, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          break;
+        case 6:
+          DecodeBase256Segment(&bits, result, byteSegments, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          break;
+        default:
+          e = BCExceptionFormatException;
+          return NULL;
+      }
+      mode = ASCII_ENCODE;
+    }
+  } while (mode != PAD_ENCODE && bits.Available() > 0);
+  if (resultTrailer.GetLength() > 0) {
+    result += resultTrailer;
+  }
+  CBC_CommonDecoderResult* tempCp = new CBC_CommonDecoderResult();
+  tempCp->Init(bytes, result,
+               (byteSegments.GetSize() <= 0) ? CFX_Int32Array() : byteSegments,
+               NULL, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return tempCp;
+}
+int32_t CBC_DataMatrixDecodedBitStreamParser::DecodeAsciiSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    CFX_ByteString& resultTrailer,
+    int32_t& e) {
+  FX_CHAR buffer[128];
+  FX_BOOL upperShift = FALSE;
+  do {
+    int32_t oneByte = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    if (oneByte == 0) {
+      e = BCExceptionFormatException;
+      return 0;
+    } else if (oneByte <= 128) {
+      oneByte = upperShift ? oneByte + 128 : oneByte;
+      upperShift = FALSE;
+      result += ((FX_CHAR)(oneByte - 1));
+      return ASCII_ENCODE;
+    } else if (oneByte == 129) {
+      return PAD_ENCODE;
+    } else if (oneByte <= 229) {
+      int32_t value = oneByte - 130;
+      FXSYS_itoa(value, buffer, 10);
+      if (value < 10) {
+        result += '0';
+        buffer[1] = '\0';
+      } else {
+        buffer[2] = '\0';
+      }
+      result += buffer;
+    } else if (oneByte == 230) {
+      return C40_ENCODE;
+    } else if (oneByte == 231) {
+      return BASE256_ENCODE;
+    } else if (oneByte == 232 || oneByte == 233 || oneByte == 234) {
+    } else if (oneByte == 235) {
+      upperShift = TRUE;
+    } else if (oneByte == 236) {
+      result += "[)>";
+      result += 0x1E;
+      result += "05";
+      result += 0x1D;
+      resultTrailer.Insert(0, 0x1E);
+      resultTrailer.Insert(0 + 1, 0x04);
+    } else if (oneByte == 237) {
+      result += "[)>";
+      result += 0x1E;
+      result += "06";
+      result += 0x1D;
+      resultTrailer.Insert(0, 0x1E);
+      resultTrailer.Insert(0 + 1, 0x04);
+    } else if (oneByte == 238) {
+      return ANSIX12_ENCODE;
+    } else if (oneByte == 239) {
+      return TEXT_ENCODE;
+    } else if (oneByte == 240) {
+      return EDIFACT_ENCODE;
+    } else if (oneByte == 241) {
+    } else if (oneByte >= 242) {
+      if (oneByte == 254 && bits->Available() == 0) {
+      } else {
+        e = BCExceptionFormatException;
+        return 0;
+      }
+    }
+  } while (bits->Available() > 0);
+  return ASCII_ENCODE;
+}
+void CBC_DataMatrixDecodedBitStreamParser::DecodeC40Segment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t& e) {
+  FX_BOOL upperShift = FALSE;
+  CFX_Int32Array cValues;
+  cValues.SetSize(3);
+  do {
+    if (bits->Available() == 8) {
+      return;
+    }
+    int32_t firstByte = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (firstByte == 254) {
+      return;
+    }
+    int32_t tempp = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    ParseTwoBytes(firstByte, tempp, cValues);
+    int32_t shift = 0;
+    int32_t i;
+    for (i = 0; i < 3; i++) {
+      int32_t cValue = cValues[i];
+      switch (shift) {
+        case 0:
+          if (cValue < 3) {
+            shift = cValue + 1;
+          } else if (cValue < 27) {
+            FX_CHAR c40char = C40_BASIC_SET_CHARS[cValue];
+            if (upperShift) {
+              result += (FX_CHAR)(c40char + 128);
+              upperShift = FALSE;
+            } else {
+              result += c40char;
+            }
+          } else {
+            e = BCExceptionFormatException;
+            return;
+          }
+          break;
+        case 1:
+          if (upperShift) {
+            result += (FX_CHAR)(cValue + 128);
+            upperShift = FALSE;
+          } else {
+            result += cValue;
+          }
+          shift = 0;
+          break;
+        case 2:
+          if (cValue < 27) {
+            FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue];
+            if (upperShift) {
+              result += (FX_CHAR)(c40char + 128);
+              upperShift = FALSE;
+            } else {
+              result += c40char;
+            }
+          } else if (cValue == 27) {
+            e = BCExceptionFormatException;
+            return;
+          } else if (cValue == 30) {
+            upperShift = TRUE;
+          } else {
+            e = BCExceptionFormatException;
+            return;
+          }
+          shift = 0;
+          break;
+        case 3:
+          if (upperShift) {
+            result += (FX_CHAR)(cValue + 224);
+            upperShift = FALSE;
+          } else {
+            result += (FX_CHAR)(cValue + 96);
+          }
+          shift = 0;
+          break;
+        default:
+          break;
+          e = BCExceptionFormatException;
+          return;
+      }
+    }
+  } while (bits->Available() > 0);
+}
+void CBC_DataMatrixDecodedBitStreamParser::DecodeTextSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t& e) {
+  FX_BOOL upperShift = FALSE;
+  CFX_Int32Array cValues;
+  cValues.SetSize(3);
+  int32_t shift = 0;
+  do {
+    if (bits->Available() == 8) {
+      return;
+    }
+    int32_t firstByte = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (firstByte == 254) {
+      return;
+    }
+    int32_t inTp = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    ParseTwoBytes(firstByte, inTp, cValues);
+    for (int32_t i = 0; i < 3; i++) {
+      int32_t cValue = cValues[i];
+      switch (shift) {
+        case 0:
+          if (cValue < 3) {
+            shift = cValue + 1;
+          } else if (cValue < 40) {
+            FX_CHAR textChar = TEXT_BASIC_SET_CHARS[cValue];
+            if (upperShift) {
+              result += (FX_CHAR)(textChar + 128);
+              upperShift = FALSE;
+            } else {
+              result += textChar;
+            }
+          } else {
+            e = BCExceptionFormatException;
+            return;
+          }
+          break;
+        case 1:
+          if (upperShift) {
+            result += (FX_CHAR)(cValue + 128);
+            upperShift = FALSE;
+          } else {
+            result += cValue;
+          }
+          shift = 0;
+          break;
+        case 2:
+          if (cValue < 27) {
+            FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue];
+            if (upperShift) {
+              result += (FX_CHAR)(c40char + 128);
+              upperShift = FALSE;
+            } else {
+              result += c40char;
+            }
+          } else if (cValue == 27) {
+            e = BCExceptionFormatException;
+            return;
+          } else if (cValue == 30) {
+            upperShift = TRUE;
+          } else {
+            e = BCExceptionFormatException;
+            return;
+          }
+          shift = 0;
+          break;
+        case 3:
+          if (cValue < 19) {
+            FX_CHAR textChar = TEXT_SHIFT3_SET_CHARS[cValue];
+            if (upperShift) {
+              result += (FX_CHAR)(textChar + 128);
+              upperShift = FALSE;
+            } else {
+              result += textChar;
+            }
+            shift = 0;
+          } else {
+            e = BCExceptionFormatException;
+            return;
+          }
+          break;
+        default:
+          break;
+          e = BCExceptionFormatException;
+          return;
+      }
+    }
+  } while (bits->Available() > 0);
+}
+void CBC_DataMatrixDecodedBitStreamParser::DecodeAnsiX12Segment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t& e) {
+  CFX_Int32Array cValues;
+  cValues.SetSize(3);
+  do {
+    if (bits->Available() == 8) {
+      return;
+    }
+    int32_t firstByte = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (firstByte == 254) {
+      return;
+    }
+    int32_t iTemp1 = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    ParseTwoBytes(firstByte, iTemp1, cValues);
+    int32_t i;
+    for (i = 0; i < 3; i++) {
+      int32_t cValue = cValues[i];
+      if (cValue == 0) {
+        BC_FX_ByteString_Append(result, 1, '\r');
+      } else if (cValue == 1) {
+        BC_FX_ByteString_Append(result, 1, '*');
+      } else if (cValue == 2) {
+        BC_FX_ByteString_Append(result, 1, '>');
+      } else if (cValue == 3) {
+        BC_FX_ByteString_Append(result, 1, ' ');
+      } else if (cValue < 14) {
+        BC_FX_ByteString_Append(result, 1, (FX_CHAR)(cValue + 44));
+      } else if (cValue < 40) {
+        BC_FX_ByteString_Append(result, 1, (FX_CHAR)(cValue + 51));
+      } else {
+        e = BCExceptionFormatException;
+        return;
+      }
+    }
+  } while (bits->Available() > 0);
+}
+void CBC_DataMatrixDecodedBitStreamParser::ParseTwoBytes(
+    int32_t firstByte,
+    int32_t secondByte,
+    CFX_Int32Array& result) {
+  int32_t fullBitValue = (firstByte << 8) + secondByte - 1;
+  int32_t temp = fullBitValue / 1600;
+  result[0] = temp;
+  fullBitValue -= temp * 1600;
+  temp = fullBitValue / 40;
+  result[1] = temp;
+  result[2] = fullBitValue - temp * 40;
+}
+
+void CBC_DataMatrixDecodedBitStreamParser::DecodeEdifactSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t& e) {
+  FX_CHAR buffer[128];
+  FX_BOOL unlatch = FALSE;
+  do {
+    if (bits->Available() <= 16)
+      return;
+
+    for (int32_t i = 0; i < 4; i++) {
+      int32_t edifactValue = bits->ReadBits(6, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      if (edifactValue == 0x1F)
+        unlatch = TRUE;
+
+      if (!unlatch) {
+        if ((edifactValue & 32) == 0)
+          edifactValue |= 64;
+        result += FXSYS_itoa(edifactValue, buffer, 10);
+      }
+    }
+  } while (!unlatch && bits->Available() > 0);
+}
+
+void CBC_DataMatrixDecodedBitStreamParser::DecodeBase256Segment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    CFX_Int32Array& byteSegments,
+    int32_t& e) {
+  int32_t codewordPosition = 1 + bits->getByteOffset();
+  int32_t iTmp = bits->ReadBits(8, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t d1 = Unrandomize255State(iTmp, codewordPosition++);
+  int32_t count;
+  if (d1 == 0) {
+    count = bits->Available() / 8;
+  } else if (d1 < 250) {
+    count = d1;
+  } else {
+    int32_t iTmp3 = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    count = 250 * (d1 - 249) + Unrandomize255State(iTmp3, codewordPosition++);
+  }
+  if (count < 0) {
+    e = BCExceptionFormatException;
+    return;
+  }
+  CFX_ByteArray* bytes = new CFX_ByteArray();
+  bytes->SetSize(count);
+  int32_t i;
+  for (i = 0; i < count; i++) {
+    if (bits->Available() < 8) {
+      e = BCExceptionFormatException;
+      delete bytes;
+      return;
+    }
+    int32_t iTemp5 = bits->ReadBits(8, e);
+    if (e != BCExceptionNO) {
+      delete bytes;
+      return;
+    }
+    bytes->SetAt(i, Unrandomize255State(iTemp5, codewordPosition++));
+  }
+  BC_FX_ByteString_Append(result, *bytes);
+  delete bytes;
+}
+uint8_t CBC_DataMatrixDecodedBitStreamParser::Unrandomize255State(
+    int32_t randomizedBase256Codeword,
+    int32_t base256CodewordPosition) {
+  int32_t pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1;
+  int32_t tempVariable = randomizedBase256Codeword - pseudoRandomNumber;
+  return (uint8_t)(tempVariable >= 0 ? tempVariable : tempVariable + 256);
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h
new file mode 100644
index 0000000..415e27b
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h
@@ -0,0 +1,58 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
+class CBC_CommonDecoderResult;
+class CBC_CommonBitSource;
+class CBC_DataMatrixDecodedBitStreamParser {
+ public:
+  CBC_DataMatrixDecodedBitStreamParser();
+  virtual ~CBC_DataMatrixDecodedBitStreamParser();
+  static CBC_CommonDecoderResult* Decode(CFX_ByteArray& bytes, int32_t& e);
+
+ private:
+  static int32_t DecodeAsciiSegment(CBC_CommonBitSource* bits,
+                                    CFX_ByteString& result,
+                                    CFX_ByteString& resultTrailer,
+                                    int32_t& e);
+  static void DecodeC40Segment(CBC_CommonBitSource* bits,
+                               CFX_ByteString& result,
+                               int32_t& e);
+  static void DecodeTextSegment(CBC_CommonBitSource* bits,
+                                CFX_ByteString& result,
+                                int32_t& e);
+  static void DecodeAnsiX12Segment(CBC_CommonBitSource* bits,
+                                   CFX_ByteString& result,
+                                   int32_t& e);
+  static void ParseTwoBytes(int32_t firstByte,
+                            int32_t secondByte,
+                            CFX_Int32Array& result);
+  static void DecodeEdifactSegment(CBC_CommonBitSource* bits,
+                                   CFX_ByteString& result,
+                                   int32_t& e);
+  static void DecodeBase256Segment(CBC_CommonBitSource* bits,
+                                   CFX_ByteString& result,
+                                   CFX_Int32Array& byteSegments,
+                                   int32_t& e);
+  static uint8_t Unrandomize255State(int32_t randomizedBase256Codeword,
+                                     int32_t base256CodewordPosition);
+
+  static const FX_CHAR C40_BASIC_SET_CHARS[];
+  static const FX_CHAR C40_SHIFT2_SET_CHARS[];
+
+  static const FX_CHAR TEXT_BASIC_SET_CHARS[];
+  static const FX_CHAR TEXT_SHIFT3_SET_CHARS[];
+  static const int32_t PAD_ENCODE;
+  static const int32_t ASCII_ENCODE;
+  static const int32_t C40_ENCODE;
+  static const int32_t TEXT_ENCODE;
+  static const int32_t ANSIX12_ENCODE;
+  static const int32_t EDIFACT_ENCODE;
+  static const int32_t BASE256_ENCODE;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp
new file mode 100644
index 0000000..3f765aa
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
+
+CBC_DataMatrixDecoder::CBC_DataMatrixDecoder() {
+  m_rsDecoder = NULL;
+}
+void CBC_DataMatrixDecoder::Init() {
+  m_rsDecoder =
+      new CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField);
+}
+CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder() {
+  delete m_rsDecoder;
+}
+CBC_CommonDecoderResult* CBC_DataMatrixDecoder::Decode(
+    CBC_CommonBitMatrix* bits,
+    int32_t& e) {
+  CBC_DataMatrixBitMatrixParser parser;
+  parser.Init(bits, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_DataMatrixVersion* version = parser.GetVersion();
+  std::unique_ptr<CFX_ByteArray> codewords(parser.ReadCodewords(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* dataBlocks =
+      CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t dataBlocksCount = dataBlocks->GetSize();
+  int32_t totalBytes = 0;
+  int32_t i, j;
+  for (i = 0; i < dataBlocksCount; i++) {
+    totalBytes +=
+        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords();
+  }
+  CFX_ByteArray resultBytes;
+  resultBytes.SetSize(totalBytes);
+  for (j = 0; j < dataBlocksCount; j++) {
+    CFX_ByteArray* codewordBytes =
+        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords();
+    int32_t numDataCodewords =
+        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords();
+    CorrectErrors(*codewordBytes, numDataCodewords, e);
+    if (e != BCExceptionNO) {
+      for (int32_t i = 0; i < dataBlocks->GetSize(); i++) {
+        delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];
+      }
+      delete dataBlocks;
+      dataBlocks = NULL;
+      return NULL;
+    }
+    int32_t i;
+    for (i = 0; i < numDataCodewords; i++) {
+      resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i];
+    }
+  }
+  for (i = 0; i < (dataBlocks->GetSize()); i++) {
+    delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];
+  }
+  delete dataBlocks;
+  dataBlocks = NULL;
+  CBC_CommonDecoderResult* resultR =
+      CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return resultR;
+}
+void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray& codewordBytes,
+                                          int32_t numDataCodewords,
+                                          int32_t& e) {
+  int32_t numCodewords = codewordBytes.GetSize();
+  CFX_Int32Array codewordsInts;
+  codewordsInts.SetSize(numCodewords);
+  int32_t i;
+  for (i = 0; i < numCodewords; i++) {
+    codewordsInts[i] = codewordBytes[i] & 0xFF;
+  }
+  int32_t numECCodewords = codewordBytes.GetSize() - numDataCodewords;
+  m_rsDecoder->Decode(&codewordsInts, numECCodewords, e);
+  if (e != BCExceptionNO) {
+    e = BCExceptionChecksumException;
+    return;
+  }
+  for (i = 0; i < numDataCodewords; i++) {
+    codewordBytes[i] = (uint8_t)codewordsInts[i];
+  }
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h
new file mode 100644
index 0000000..2f70282
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_ReedSolomonDecoder;
+class CBC_CommonDecoderResult;
+class CBC_CommonBitMatrix;
+
+class CBC_DataMatrixDecoder {
+ public:
+  CBC_DataMatrixDecoder();
+  virtual ~CBC_DataMatrixDecoder();
+  CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits, int32_t& e);
+  virtual void Init();
+
+ private:
+  void CorrectErrors(CFX_ByteArray& codewordBytes,
+                     int32_t numDataCodewords,
+                     int32_t& e);
+  CBC_ReedSolomonDecoder* m_rsDecoder;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp
new file mode 100644
index 0000000..fd41009
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp
@@ -0,0 +1,406 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_WhiteRectangleDetector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRGridSampler.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_DataMatrixDetector::INTEGERS[5] = {0, 1, 2, 3, 4};
+CBC_DataMatrixDetector::CBC_DataMatrixDetector(CBC_CommonBitMatrix* image)
+    : m_image(image), m_rectangleDetector(NULL) {}
+void CBC_DataMatrixDetector::Init(int32_t& e) {
+  m_rectangleDetector = new CBC_WhiteRectangleDetector(m_image);
+  m_rectangleDetector->Init(e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+CBC_DataMatrixDetector::~CBC_DataMatrixDetector() {
+  delete m_rectangleDetector;
+}
+inline FX_BOOL ResultPointsAndTransitionsComparator(void* a, void* b) {
+  return ((CBC_ResultPointsAndTransitions*)b)->GetTransitions() >
+         ((CBC_ResultPointsAndTransitions*)a)->GetTransitions();
+}
+CBC_QRDetectorResult* CBC_DataMatrixDetector::Detect(int32_t& e) {
+  CFX_PtrArray* cornerPoints = m_rectangleDetector->Detect(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_ResultPoint* pointA = (CBC_ResultPoint*)(*cornerPoints)[0];
+  CBC_ResultPoint* pointB = (CBC_ResultPoint*)(*cornerPoints)[1];
+  CBC_ResultPoint* pointC = (CBC_ResultPoint*)(*cornerPoints)[2];
+  CBC_ResultPoint* pointD = (CBC_ResultPoint*)(*cornerPoints)[3];
+  delete cornerPoints;
+  cornerPoints = NULL;
+  CFX_PtrArray transitions;
+  transitions.Add(TransitionsBetween(pointA, pointB));
+  transitions.Add(TransitionsBetween(pointA, pointC));
+  transitions.Add(TransitionsBetween(pointB, pointD));
+  transitions.Add(TransitionsBetween(pointC, pointD));
+  BC_FX_PtrArray_Sort(transitions, &ResultPointsAndTransitionsComparator);
+  delete ((CBC_ResultPointsAndTransitions*)transitions[2]);
+  delete ((CBC_ResultPointsAndTransitions*)transitions[3]);
+  CBC_ResultPointsAndTransitions* lSideOne =
+      (CBC_ResultPointsAndTransitions*)transitions[0];
+  CBC_ResultPointsAndTransitions* lSideTwo =
+      (CBC_ResultPointsAndTransitions*)transitions[1];
+  CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t> pointCount;
+  Increment(pointCount, lSideOne->GetFrom());
+  Increment(pointCount, lSideOne->GetTo());
+  Increment(pointCount, lSideTwo->GetFrom());
+  Increment(pointCount, lSideTwo->GetTo());
+  delete ((CBC_ResultPointsAndTransitions*)transitions[1]);
+  delete ((CBC_ResultPointsAndTransitions*)transitions[0]);
+  transitions.RemoveAll();
+  CBC_ResultPoint* maybeTopLeft = NULL;
+  CBC_ResultPoint* bottomLeft = NULL;
+  CBC_ResultPoint* maybeBottomRight = NULL;
+  FX_POSITION itBegin = pointCount.GetStartPosition();
+  while (itBegin) {
+    CBC_ResultPoint* key = 0;
+    int32_t value = 0;
+    pointCount.GetNextAssoc(itBegin, key, value);
+    if (value == 2) {
+      bottomLeft = key;
+    } else {
+      if (maybeBottomRight == NULL) {
+        maybeBottomRight = key;
+      } else {
+        maybeTopLeft = key;
+      }
+    }
+  }
+  if (maybeTopLeft == NULL || bottomLeft == NULL || maybeBottomRight == NULL) {
+    delete pointA;
+    delete pointB;
+    delete pointC;
+    delete pointD;
+    e = BCExceptionNotFound;
+    return NULL;
+  }
+  CFX_PtrArray corners;
+  corners.SetSize(3);
+  corners[0] = maybeTopLeft;
+  corners[1] = bottomLeft;
+  corners[2] = maybeBottomRight;
+  OrderBestPatterns(&corners);
+  CBC_ResultPoint* bottomRight = (CBC_ResultPoint*)corners[0];
+  bottomLeft = (CBC_ResultPoint*)corners[1];
+  CBC_ResultPoint* topLeft = (CBC_ResultPoint*)corners[2];
+  CBC_ResultPoint* topRight = NULL;
+  int32_t value;
+  if (!pointCount.Lookup(pointA, value)) {
+    topRight = pointA;
+  } else if (!pointCount.Lookup(pointB, value)) {
+    topRight = pointB;
+  } else if (!pointCount.Lookup(pointC, value)) {
+    topRight = pointC;
+  } else {
+    topRight = pointD;
+  }
+  int32_t dimensionTop = std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(topLeft, topRight))
+                             ->GetTransitions();
+  int32_t dimensionRight = std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                               TransitionsBetween(bottomRight, topRight))
+                               ->GetTransitions();
+  if ((dimensionTop & 0x01) == 1) {
+    dimensionTop++;
+  }
+  dimensionTop += 2;
+  if ((dimensionRight & 0x01) == 1) {
+    dimensionRight++;
+  }
+  dimensionRight += 2;
+  std::unique_ptr<CBC_CommonBitMatrix> bits;
+  std::unique_ptr<CBC_ResultPoint> correctedTopRight;
+  if (4 * dimensionTop >= 7 * dimensionRight ||
+      4 * dimensionRight >= 7 * dimensionTop) {
+    correctedTopRight.reset(
+        CorrectTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight,
+                                   dimensionTop, dimensionRight));
+    if (correctedTopRight.get() == NULL) {
+      correctedTopRight.reset(topRight);
+    } else {
+      delete topRight;
+      topRight = NULL;
+    }
+    dimensionTop = std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                       TransitionsBetween(topLeft, correctedTopRight.get()))
+                       ->GetTransitions();
+    dimensionRight =
+        std::unique_ptr<CBC_ResultPointsAndTransitions>(
+            TransitionsBetween(bottomRight, correctedTopRight.get()))
+            ->GetTransitions();
+    if ((dimensionTop & 0x01) == 1) {
+      dimensionTop++;
+    }
+    if ((dimensionRight & 0x01) == 1) {
+      dimensionRight++;
+    }
+    bits.reset(SampleGrid(m_image, topLeft, bottomLeft, bottomRight,
+                          correctedTopRight.get(), dimensionTop, dimensionRight,
+                          e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  } else {
+    int32_t dimension = std::min(dimensionRight, dimensionTop);
+    correctedTopRight.reset(
+        CorrectTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension));
+    if (correctedTopRight.get() == NULL) {
+      correctedTopRight.reset(topRight);
+    } else {
+      delete topRight;
+      topRight = NULL;
+    }
+    int32_t dimensionCorrected =
+        std::max(std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                     TransitionsBetween(topLeft, correctedTopRight.get()))
+                     ->GetTransitions(),
+                 std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                     TransitionsBetween(bottomRight, correctedTopRight.get()))
+                     ->GetTransitions());
+    dimensionCorrected++;
+    if ((dimensionCorrected & 0x01) == 1) {
+      dimensionCorrected++;
+    }
+    bits.reset(SampleGrid(m_image, topLeft, bottomLeft, bottomRight,
+                          correctedTopRight.get(), dimensionCorrected,
+                          dimensionCorrected, e));
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CFX_PtrArray* result = new CFX_PtrArray;
+  result->SetSize(4);
+  result->Add(topLeft);
+  result->Add(bottomLeft);
+  result->Add(bottomRight);
+  result->Add(correctedTopRight.release());
+  return new CBC_QRDetectorResult(bits.release(), result);
+}
+CBC_ResultPoint* CBC_DataMatrixDetector::CorrectTopRightRectangular(
+    CBC_ResultPoint* bottomLeft,
+    CBC_ResultPoint* bottomRight,
+    CBC_ResultPoint* topLeft,
+    CBC_ResultPoint* topRight,
+    int32_t dimensionTop,
+    int32_t dimensionRight) {
+  FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimensionTop;
+  int32_t norm = Distance(topLeft, topRight);
+  FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm;
+  FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm;
+  std::unique_ptr<CBC_ResultPoint> c1(new CBC_ResultPoint(
+      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
+  corr = Distance(bottomLeft, topLeft) / (FX_FLOAT)dimensionRight;
+  norm = Distance(bottomRight, topRight);
+  cos = (topRight->GetX() - bottomRight->GetX()) / norm;
+  sin = (topRight->GetY() - bottomRight->GetY()) / norm;
+  std::unique_ptr<CBC_ResultPoint> c2(new CBC_ResultPoint(
+      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
+  if (!IsValid(c1.get())) {
+    if (IsValid(c2.get())) {
+      return c2.release();
+    }
+    return NULL;
+  } else if (!IsValid(c2.get())) {
+    return c1.release();
+  }
+  int32_t l1 = FXSYS_abs(dimensionTop -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(topLeft, c1.get()))
+                             ->GetTransitions()) +
+               FXSYS_abs(dimensionRight -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(bottomRight, c1.get()))
+                             ->GetTransitions());
+  int32_t l2 = FXSYS_abs(dimensionTop -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(topLeft, c2.get()))
+                             ->GetTransitions()) +
+               FXSYS_abs(dimensionRight -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(bottomRight, c2.get()))
+                             ->GetTransitions());
+  if (l1 <= l2) {
+    return c1.release();
+  }
+  return c2.release();
+}
+CBC_ResultPoint* CBC_DataMatrixDetector::CorrectTopRight(
+    CBC_ResultPoint* bottomLeft,
+    CBC_ResultPoint* bottomRight,
+    CBC_ResultPoint* topLeft,
+    CBC_ResultPoint* topRight,
+    int32_t dimension) {
+  FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimension;
+  int32_t norm = Distance(topLeft, topRight);
+  FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm;
+  FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm;
+  std::unique_ptr<CBC_ResultPoint> c1(new CBC_ResultPoint(
+      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
+  corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimension;
+  norm = Distance(bottomRight, topRight);
+  cos = (topRight->GetX() - bottomRight->GetX()) / norm;
+  sin = (topRight->GetY() - bottomRight->GetY()) / norm;
+  std::unique_ptr<CBC_ResultPoint> c2(new CBC_ResultPoint(
+      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
+  if (!IsValid(c1.get())) {
+    if (IsValid(c2.get())) {
+      return c2.release();
+    }
+    return NULL;
+  } else if (!IsValid(c2.get())) {
+    return c1.release();
+  }
+  int32_t l1 = FXSYS_abs(std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(topLeft, c1.get()))
+                             ->GetTransitions() -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(bottomRight, c1.get()))
+                             ->GetTransitions());
+  int32_t l2 = FXSYS_abs(std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(topLeft, c2.get()))
+                             ->GetTransitions() -
+                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
+                             TransitionsBetween(bottomRight, c2.get()))
+                             ->GetTransitions());
+  return l1 <= l2 ? c1.release() : c2.release();
+}
+FX_BOOL CBC_DataMatrixDetector::IsValid(CBC_ResultPoint* p) {
+  return p->GetX() >= 0 && p->GetX() < m_image->GetWidth() && p->GetY() > 0 &&
+         p->GetY() < m_image->GetHeight();
+}
+int32_t CBC_DataMatrixDetector::Round(FX_FLOAT d) {
+  return (int32_t)(d + 0.5f);
+}
+int32_t CBC_DataMatrixDetector::Distance(CBC_ResultPoint* a,
+                                         CBC_ResultPoint* b) {
+  return Round(
+      (FX_FLOAT)sqrt((a->GetX() - b->GetX()) * (a->GetX() - b->GetX()) +
+                     (a->GetY() - b->GetY()) * (a->GetY() - b->GetY())));
+}
+void CBC_DataMatrixDetector::Increment(
+    CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t>& table,
+    CBC_ResultPoint* key) {
+  int32_t value;
+  if (table.Lookup(key, value)) {
+    table.SetAt(key, INTEGERS[value + 1]);
+  } else {
+    table.SetAt(key, INTEGERS[1]);
+  }
+}
+CBC_CommonBitMatrix* CBC_DataMatrixDetector::SampleGrid(
+    CBC_CommonBitMatrix* image,
+    CBC_ResultPoint* topLeft,
+    CBC_ResultPoint* bottomLeft,
+    CBC_ResultPoint* bottomRight,
+    CBC_ResultPoint* topRight,
+    int32_t dimensionX,
+    int32_t dimensionY,
+    int32_t& e) {
+  CBC_QRGridSampler& sampler = CBC_QRGridSampler::GetInstance();
+  CBC_CommonBitMatrix* cbm = sampler.SampleGrid(
+      image, dimensionX, dimensionY, 0.5f, 0.5f, dimensionX - 0.5f, 0.5f,
+      dimensionX - 0.5f, dimensionY - 0.5f, 0.5f, dimensionY - 0.5f,
+      topLeft->GetX(), topLeft->GetY(), topRight->GetX(), topRight->GetY(),
+      bottomRight->GetX(), bottomRight->GetY(), bottomLeft->GetX(),
+      bottomLeft->GetY(), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return cbm;
+}
+CBC_ResultPointsAndTransitions* CBC_DataMatrixDetector::TransitionsBetween(
+    CBC_ResultPoint* from,
+    CBC_ResultPoint* to) {
+  int32_t fromX = (int32_t)from->GetX();
+  int32_t fromY = (int32_t)from->GetY();
+  int32_t toX = (int32_t)to->GetX();
+  int32_t toY = (int32_t)to->GetY();
+  FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX);
+  if (steep) {
+    int32_t temp = fromX;
+    fromX = fromY;
+    fromY = temp;
+    temp = toX;
+    toX = toY;
+    toY = temp;
+  }
+  int32_t dx = FXSYS_abs(toX - fromX);
+  int32_t dy = FXSYS_abs(toY - fromY);
+  int32_t error = -dx >> 1;
+  int32_t ystep = fromY < toY ? 1 : -1;
+  int32_t xstep = fromX < toX ? 1 : -1;
+  int32_t transitions = 0;
+  FX_BOOL inBlack = m_image->Get(steep ? fromY : fromX, steep ? fromX : fromY);
+  for (int32_t x = fromX, y = fromY; x != toX; x += xstep) {
+    FX_BOOL isBlack = m_image->Get(steep ? y : x, steep ? x : y);
+    if (isBlack != inBlack) {
+      transitions++;
+      inBlack = isBlack;
+    }
+    error += dy;
+    if (error > 0) {
+      if (y == toY) {
+        break;
+      }
+      y += ystep;
+      error -= dx;
+    }
+  }
+  return new CBC_ResultPointsAndTransitions(from, to, transitions);
+}
+void CBC_DataMatrixDetector::OrderBestPatterns(CFX_PtrArray* patterns) {
+  FX_FLOAT abDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0],
+                                           (CBC_ResultPoint*)(*patterns)[1]);
+  FX_FLOAT bcDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[1],
+                                           (CBC_ResultPoint*)(*patterns)[2]);
+  FX_FLOAT acDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0],
+                                           (CBC_ResultPoint*)(*patterns)[2]);
+  CBC_ResultPoint *topLeft, *topRight, *bottomLeft;
+  if (bcDistance >= abDistance && bcDistance >= acDistance) {
+    topLeft = (CBC_ResultPoint*)(*patterns)[0];
+    topRight = (CBC_ResultPoint*)(*patterns)[1];
+    bottomLeft = (CBC_ResultPoint*)(*patterns)[2];
+  } else if (acDistance >= bcDistance && acDistance >= abDistance) {
+    topLeft = (CBC_ResultPoint*)(*patterns)[1];
+    topRight = (CBC_ResultPoint*)(*patterns)[0];
+    bottomLeft = (CBC_ResultPoint*)(*patterns)[2];
+  } else {
+    topLeft = (CBC_ResultPoint*)(*patterns)[2];
+    topRight = (CBC_ResultPoint*)(*patterns)[0];
+    bottomLeft = (CBC_ResultPoint*)(*patterns)[1];
+  }
+  if ((bottomLeft->GetY() - topLeft->GetY()) *
+          (topRight->GetX() - topLeft->GetX()) <
+      (bottomLeft->GetX() - topLeft->GetX()) *
+          (topRight->GetY() - topLeft->GetY())) {
+    CBC_ResultPoint* temp = topRight;
+    topRight = bottomLeft;
+    bottomLeft = temp;
+  }
+  (*patterns)[0] = bottomLeft;
+  (*patterns)[1] = topLeft;
+  (*patterns)[2] = topRight;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h
new file mode 100644
index 0000000..62d1699
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_WhiteRectangleDetector;
+class CBC_ResultPoint;
+class CBC_QRDetectorResult;
+class CBC_DataMatrixDetector;
+class ResultPointsAndTransitions;
+class CBC_ResultPointsAndTransitions {
+ public:
+  CBC_ResultPointsAndTransitions(CBC_ResultPoint* from,
+                                 CBC_ResultPoint* to,
+                                 int32_t transitions) {
+    m_from = from;
+    m_to = to;
+    m_transitions = transitions;
+  }
+  ~CBC_ResultPointsAndTransitions() {}
+  CBC_ResultPoint* GetFrom() { return m_from; }
+  CBC_ResultPoint* GetTo() { return m_to; }
+  int32_t GetTransitions() { return m_transitions; }
+
+ private:
+  CBC_ResultPoint* m_from;
+  CBC_ResultPoint* m_to;
+  int32_t m_transitions;
+};
+class CBC_DataMatrixDetector {
+ public:
+  CBC_DataMatrixDetector(CBC_CommonBitMatrix* image);
+  virtual ~CBC_DataMatrixDetector();
+  CBC_QRDetectorResult* Detect(int32_t& e);
+  CBC_ResultPoint* CorrectTopRightRectangular(CBC_ResultPoint* bottomLeft,
+                                              CBC_ResultPoint* bottomRight,
+                                              CBC_ResultPoint* topLeft,
+                                              CBC_ResultPoint* topRight,
+                                              int32_t dimensionTop,
+                                              int32_t dimensionRight);
+  CBC_ResultPoint* CorrectTopRight(CBC_ResultPoint* bottomLeft,
+                                   CBC_ResultPoint* bottomRight,
+                                   CBC_ResultPoint* topLeft,
+                                   CBC_ResultPoint* topRight,
+                                   int32_t dimension);
+  CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
+                                  CBC_ResultPoint* topLeft,
+                                  CBC_ResultPoint* bottomLeft,
+                                  CBC_ResultPoint* bottomRight,
+                                  CBC_ResultPoint* topRight,
+                                  int32_t dimensionX,
+                                  int32_t dimensionY,
+                                  int32_t& e);
+  CBC_ResultPointsAndTransitions* TransitionsBetween(CBC_ResultPoint* from,
+                                                     CBC_ResultPoint* to);
+  FX_BOOL IsValid(CBC_ResultPoint* p);
+  int32_t Distance(CBC_ResultPoint* a, CBC_ResultPoint* b);
+  void Increment(CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t>& table,
+                 CBC_ResultPoint* key);
+  int32_t Round(FX_FLOAT d);
+  void OrderBestPatterns(CFX_PtrArray* patterns);
+  virtual void Init(int32_t& e);
+
+ private:
+  static const int32_t INTEGERS[5];
+
+  CBC_CommonBitMatrix* m_image;
+  CBC_WhiteRectangleDetector* m_rectangleDetector;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.cpp
new file mode 100644
index 0000000..9a22d4d
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDecoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixDetector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_DataMatrixReader::CBC_DataMatrixReader() {
+  m_decoder = NULL;
+}
+void CBC_DataMatrixReader::Init() {
+  m_decoder = new CBC_DataMatrixDecoder;
+  m_decoder->Init();
+}
+CBC_DataMatrixReader::~CBC_DataMatrixReader() {
+  delete m_decoder;
+}
+CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap* image,
+                                            int32_t hints,
+                                            int32_t& e) {
+  CBC_CommonBitMatrix* cdr = image->GetBlackMatrix(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CBC_DataMatrixDetector detector(cdr);
+  detector.Init(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  std::unique_ptr<CBC_QRDetectorResult> detectorResult(detector.Detect(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  std::unique_ptr<CBC_CommonDecoderResult> decodeResult(
+      m_decoder->Decode(detectorResult->GetBits(), e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return decodeResult->GetText();
+}
+CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap* image,
+                                            int32_t& e) {
+  CFX_ByteString bs = Decode(image, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return bs;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h
new file mode 100644
index 0000000..21fc54e
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
+
+#include "xfa/fxbarcode/BC_Reader.h"
+
+class CBC_BinaryBitmap;
+class CBC_DataMatrixDecoder;
+
+class CBC_DataMatrixReader : public CBC_Reader {
+ public:
+  CBC_DataMatrixReader();
+  virtual ~CBC_DataMatrixReader();
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int hints, int32_t& e);
+
+  virtual void Init();
+
+ private:
+  CBC_DataMatrixDecoder* m_decoder;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
new file mode 100644
index 0000000..16c253f
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144()
+    : CBC_SymbolInfo(FALSE, 1558, 620, 22, 22, 36) {
+  m_rsBlockData = -1;
+  m_rsBlockError = 62;
+}
+CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() {}
+int32_t CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() {
+  return 10;
+}
+int32_t CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(
+    int32_t index) {
+  return (index <= 8) ? 156 : 155;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h
new file mode 100644
index 0000000..4d6cdc1
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+
+class CBC_DataMatrixSymbolInfo144 : public CBC_SymbolInfo {
+ public:
+  CBC_DataMatrixSymbolInfo144();
+  virtual ~CBC_DataMatrixSymbolInfo144();
+  int32_t getInterleavedBlockCount();
+  int32_t getDataLengthForInterleavedBlock(int32_t index);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp
new file mode 100644
index 0000000..50131f3
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdint.h>
+
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL;
+
+void CBC_DataMatrixVersion::Initialize() {
+  VERSIONS = new CFX_PtrArray();
+}
+void CBC_DataMatrixVersion::Finalize() {
+  for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
+    delete ((CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)));
+  }
+  VERSIONS->RemoveAll();
+  delete VERSIONS;
+}
+CBC_DataMatrixVersion::CBC_DataMatrixVersion(int32_t versionNumber,
+                                             int32_t symbolSizeRows,
+                                             int32_t symbolSizeColumns,
+                                             int32_t dataRegionSizeRows,
+                                             int32_t dataRegionSizeColumns,
+                                             ECBlocks* ecBlocks) {
+  m_versionNumber = versionNumber;
+  m_symbolSizeRows = symbolSizeRows;
+  m_symbolSizeColumns = symbolSizeColumns;
+  m_dataRegionSizeRows = dataRegionSizeRows;
+  m_dataRegionSizeColumns = dataRegionSizeColumns;
+  m_ecBlocks = ecBlocks;
+  int32_t total = 0;
+  int32_t ecCodewords = ecBlocks->GetECCodewords();
+  const CFX_PtrArray& ecbArray = ecBlocks->GetECBlocks();
+  for (int32_t i = 0; i < ecbArray.GetSize(); i++) {
+    total += ((ECB*)ecbArray[i])->GetCount() *
+             (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords);
+  }
+  m_totalCodewords = total;
+}
+CBC_DataMatrixVersion::~CBC_DataMatrixVersion() {
+  delete m_ecBlocks;
+}
+int32_t CBC_DataMatrixVersion::GetVersionNumber() {
+  return m_versionNumber;
+}
+int32_t CBC_DataMatrixVersion::GetSymbolSizeRows() {
+  return m_symbolSizeRows;
+}
+int32_t CBC_DataMatrixVersion::GetSymbolSizeColumns() {
+  return m_symbolSizeColumns;
+}
+int32_t CBC_DataMatrixVersion::GetDataRegionSizeRows() {
+  return m_dataRegionSizeRows;
+}
+int32_t CBC_DataMatrixVersion::GetDataRegionSizeColumns() {
+  return m_dataRegionSizeColumns;
+}
+int32_t CBC_DataMatrixVersion::GetTotalCodewords() {
+  return m_totalCodewords;
+}
+ECBlocks* CBC_DataMatrixVersion::GetECBlocks() {
+  return m_ecBlocks;
+}
+void CBC_DataMatrixVersion::ReleaseAll() {
+  for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
+    delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i);
+  }
+  VERSIONS->RemoveAll();
+}
+CBC_DataMatrixVersion* CBC_DataMatrixVersion::GetVersionForDimensions(
+    int32_t numRows,
+    int32_t numColumns,
+    int32_t& e) {
+  if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
+    e = BCExceptionNotFound;
+    return NULL;
+  }
+  if (VERSIONS->GetSize() == 0) {
+    VERSIONS->Add(new CBC_DataMatrixVersion(1, 10, 10, 8, 8,
+                                            new ECBlocks(5, new ECB(1, 3))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(2, 12, 12, 10, 10,
+                                            new ECBlocks(7, new ECB(1, 5))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(3, 14, 14, 12, 12,
+                                            new ECBlocks(10, new ECB(1, 8))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(4, 16, 16, 14, 14,
+                                            new ECBlocks(12, new ECB(1, 12))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(5, 18, 18, 16, 16,
+                                            new ECBlocks(14, new ECB(1, 18))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(6, 20, 20, 18, 18,
+                                            new ECBlocks(18, new ECB(1, 22))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(7, 22, 22, 20, 20,
+                                            new ECBlocks(20, new ECB(1, 30))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(8, 24, 24, 22, 22,
+                                            new ECBlocks(24, new ECB(1, 36))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(9, 26, 26, 24, 24,
+                                            new ECBlocks(28, new ECB(1, 44))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(10, 32, 32, 14, 14,
+                                            new ECBlocks(36, new ECB(1, 62))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(11, 36, 36, 16, 16,
+                                            new ECBlocks(42, new ECB(1, 86))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(12, 40, 40, 18, 18,
+                                            new ECBlocks(48, new ECB(1, 114))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(13, 44, 44, 20, 20,
+                                            new ECBlocks(56, new ECB(1, 144))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(14, 48, 48, 22, 22,
+                                            new ECBlocks(68, new ECB(1, 174))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(15, 52, 52, 24, 24,
+                                            new ECBlocks(42, new ECB(2, 102))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(16, 64, 64, 14, 14,
+                                            new ECBlocks(56, new ECB(2, 140))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(17, 72, 72, 16, 16,
+                                            new ECBlocks(36, new ECB(4, 92))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(18, 80, 80, 18, 18,
+                                            new ECBlocks(48, new ECB(4, 114))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(19, 88, 88, 20, 20,
+                                            new ECBlocks(56, new ECB(4, 144))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(20, 96, 96, 22, 22,
+                                            new ECBlocks(68, new ECB(4, 174))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(21, 104, 104, 24, 24,
+                                            new ECBlocks(56, new ECB(6, 136))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(22, 120, 120, 18, 18,
+                                            new ECBlocks(68, new ECB(6, 175))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(23, 132, 132, 20, 20,
+                                            new ECBlocks(62, new ECB(8, 163))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(
+        24, 144, 144, 22, 22,
+        new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(25, 8, 18, 6, 16,
+                                            new ECBlocks(7, new ECB(1, 5))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(26, 8, 32, 6, 14,
+                                            new ECBlocks(11, new ECB(1, 10))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(27, 12, 26, 10, 24,
+                                            new ECBlocks(14, new ECB(1, 16))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(28, 12, 36, 10, 16,
+                                            new ECBlocks(18, new ECB(1, 22))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(29, 16, 36, 14, 16,
+                                            new ECBlocks(24, new ECB(1, 32))));
+    VERSIONS->Add(new CBC_DataMatrixVersion(30, 16, 48, 14, 22,
+                                            new ECBlocks(28, new ECB(1, 49))));
+  }
+  int32_t numVersions = VERSIONS->GetSize();
+  for (int32_t i = 0; i < numVersions; ++i) {
+    if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows ==
+            numRows &&
+        ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns ==
+            numColumns) {
+      return (CBC_DataMatrixVersion*)(*VERSIONS)[i];
+    }
+  }
+  e = BCExceptionNotFound;
+  return NULL;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h
new file mode 100644
index 0000000..8a79355
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_DataMatrixVersion;
+
+class ECB {
+ public:
+  ECB(int32_t count, int32_t dataCodewords) {
+    m_count = count;
+    m_dataCodewords = dataCodewords;
+  }
+
+  int32_t GetCount() { return m_count; }
+
+  int32_t GetDataCodewords() { return m_dataCodewords; }
+
+ private:
+  int32_t m_count;
+  int32_t m_dataCodewords;
+};
+
+class ECBlocks {
+ public:
+  ECBlocks(int32_t ecCodewords, ECB* ecBlocks) {
+    m_ecCodewords = ecCodewords;
+    m_ecBlocks.Add(ecBlocks);
+  }
+
+  ECBlocks(int32_t ecCodewords, ECB* ecBlocks1, ECB* ecBlocks2) {
+    m_ecCodewords = ecCodewords;
+    m_ecBlocks.Add(ecBlocks1);
+    m_ecBlocks.Add(ecBlocks2);
+  }
+  ~ECBlocks() {
+    for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
+      delete (ECB*)m_ecBlocks[i];
+    }
+    m_ecBlocks.RemoveAll();
+  }
+
+  int32_t GetECCodewords() { return m_ecCodewords; }
+
+  const CFX_PtrArray& GetECBlocks() { return m_ecBlocks; }
+
+ private:
+  int32_t m_ecCodewords;
+  CFX_PtrArray m_ecBlocks;
+};
+
+class CBC_DataMatrixVersion {
+ public:
+  CBC_DataMatrixVersion(int32_t versionNumber,
+                        int32_t symbolSizeRows,
+                        int32_t symbolSizeColumns,
+                        int32_t dataRegionSizeRows,
+                        int32_t dataRegionSizeColumns,
+                        ECBlocks* ecBlocks);
+  virtual ~CBC_DataMatrixVersion();
+  static void Initialize();
+  static void Finalize();
+  int32_t GetVersionNumber();
+  int32_t GetSymbolSizeRows();
+  int32_t GetSymbolSizeColumns();
+  int32_t GetDataRegionSizeRows();
+  int32_t GetDataRegionSizeColumns();
+  int32_t GetTotalCodewords();
+  ECBlocks* GetECBlocks();
+  static CBC_DataMatrixVersion* GetVersionForDimensions(int32_t numRows,
+                                                        int32_t numColumns,
+                                                        int32_t& e);
+  static void ReleaseAll();
+
+ private:
+  int32_t m_versionNumber;
+  int32_t m_symbolSizeRows;
+  int32_t m_symbolSizeColumns;
+  int32_t m_dataRegionSizeRows;
+  int32_t m_dataRegionSizeColumns;
+  ECBlocks* m_ecBlocks;
+  int32_t m_totalCodewords;
+  static CFX_PtrArray* VERSIONS;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp b/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
new file mode 100644
index 0000000..03cd5fb
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
@@ -0,0 +1,136 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
+#include "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h"
+#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
+
+CBC_DataMatrixWriter::CBC_DataMatrixWriter() {}
+CBC_DataMatrixWriter::~CBC_DataMatrixWriter() {}
+FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel(int32_t level) {
+  m_iCorrectLevel = level;
+  return TRUE;
+}
+uint8_t* CBC_DataMatrixWriter::Encode(const CFX_WideString& contents,
+                                      int32_t& outWidth,
+                                      int32_t& outHeight,
+                                      int32_t& e) {
+  if (outWidth < 0 || outHeight < 0) {
+    e = BCExceptionHeightAndWidthMustBeAtLeast1;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CBC_SymbolShapeHint::SymbolShapeHint shape =
+      CBC_SymbolShapeHint::FORCE_SQUARE;
+  CBC_Dimension* minSize = NULL;
+  CBC_Dimension* maxSize = NULL;
+  CFX_WideString ecLevel;
+  CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(
+      contents, ecLevel, shape, minSize, maxSize, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(
+      encoded.GetLength(), shape, minSize, maxSize, TRUE, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_WideString codewords =
+      CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_DefaultPlacement* placement =
+      new CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e),
+                               symbolInfo->getSymbolDataHeight(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  placement->place();
+  CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  outWidth = bytematrix->GetWidth();
+  outHeight = bytematrix->GetHeight();
+  uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight);
+  FXSYS_memcpy(result, bytematrix->GetArray(), outWidth * outHeight);
+  delete bytematrix;
+  delete placement;
+  return result;
+}
+CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(
+    CBC_DefaultPlacement* placement,
+    CBC_SymbolInfo* symbolInfo,
+    int32_t& e) {
+  int32_t symbolWidth = symbolInfo->getSymbolDataWidth(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t symbolHeight = symbolInfo->getSymbolDataHeight(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_CommonByteMatrix* matrix = new CBC_CommonByteMatrix(
+      symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  matrix->Init();
+  int32_t matrixY = 0;
+  for (int32_t y = 0; y < symbolHeight; y++) {
+    int32_t matrixX;
+    if ((y % symbolInfo->m_matrixHeight) == 0) {
+      matrixX = 0;
+      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
+        matrix->Set(matrixX, matrixY, (x % 2) == 0);
+        matrixX++;
+      }
+      matrixY++;
+    }
+    matrixX = 0;
+    for (int32_t x = 0; x < symbolWidth; x++) {
+      if ((x % symbolInfo->m_matrixWidth) == 0) {
+        matrix->Set(matrixX, matrixY, TRUE);
+        matrixX++;
+      }
+      matrix->Set(matrixX, matrixY, placement->getBit(x, y));
+      matrixX++;
+      if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) {
+        matrix->Set(matrixX, matrixY, (y % 2) == 0);
+        matrixX++;
+      }
+    }
+    matrixY++;
+    if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) {
+      matrixX = 0;
+      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
+        matrix->Set(matrixX, matrixY, TRUE);
+        matrixX++;
+      }
+      matrixY++;
+    }
+  }
+  return matrix;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h b/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h
new file mode 100644
index 0000000..7c19a07
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
+
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+
+class CBC_CommonByteMatrix;
+class CBC_DefaultPlacement;
+class CBC_SymbolInfo;
+
+class CBC_DataMatrixWriter : public CBC_TwoDimWriter {
+ public:
+  CBC_DataMatrixWriter();
+  virtual ~CBC_DataMatrixWriter();
+  uint8_t* Encode(const CFX_WideString& contents,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  FX_BOOL SetErrorCorrectionLevel(int32_t level);
+
+ private:
+  static CBC_CommonByteMatrix* encodeLowLevel(CBC_DefaultPlacement* placement,
+                                              CBC_SymbolInfo* symbolInfo,
+                                              int32_t& e);
+  int32_t m_iCorrectLevel;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
new file mode 100644
index 0000000..830df22
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords,
+                                           int32_t numcols,
+                                           int32_t numrows) {
+  m_codewords = codewords;
+  m_numcols = numcols;
+  m_numrows = numrows;
+  m_bits.SetSize(numcols * numrows);
+  for (int32_t i = 0; i < numcols * numrows; i++) {
+    m_bits[i] = (uint8_t)2;
+  }
+}
+CBC_DefaultPlacement::~CBC_DefaultPlacement() {
+  m_bits.RemoveAll();
+}
+int32_t CBC_DefaultPlacement::getNumrows() {
+  return m_numrows;
+}
+int32_t CBC_DefaultPlacement::getNumcols() {
+  return m_numcols;
+}
+CFX_ByteArray& CBC_DefaultPlacement::getBits() {
+  return m_bits;
+}
+FX_BOOL CBC_DefaultPlacement::getBit(int32_t col, int32_t row) {
+  return m_bits[row * m_numcols + col] == 1;
+}
+void CBC_DefaultPlacement::setBit(int32_t col, int32_t row, FX_BOOL bit) {
+  m_bits[row * m_numcols + col] = bit ? (uint8_t)1 : (uint8_t)0;
+}
+FX_BOOL CBC_DefaultPlacement::hasBit(int32_t col, int32_t row) {
+  return m_bits[row * m_numcols + col] != 2;
+}
+void CBC_DefaultPlacement::place() {
+  int32_t pos = 0;
+  int32_t row = 4;
+  int32_t col = 0;
+  do {
+    if ((row == m_numrows) && (col == 0)) {
+      corner1(pos++);
+    }
+    if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) {
+      corner2(pos++);
+    }
+    if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) {
+      corner3(pos++);
+    }
+    if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) {
+      corner4(pos++);
+    }
+    do {
+      if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) {
+        utah(row, col, pos++);
+      }
+      row -= 2;
+      col += 2;
+    } while (row >= 0 && (col < m_numcols));
+    row++;
+    col += 3;
+    do {
+      if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) {
+        utah(row, col, pos++);
+      }
+      row += 2;
+      col -= 2;
+    } while ((row < m_numrows) && (col >= 0));
+    row += 3;
+    col++;
+  } while ((row < m_numrows) || (col < m_numcols));
+  if (!hasBit(m_numcols - 1, m_numrows - 1)) {
+    setBit(m_numcols - 1, m_numrows - 1, TRUE);
+    setBit(m_numcols - 2, m_numrows - 2, TRUE);
+  }
+}
+void CBC_DefaultPlacement::module(int32_t row,
+                                  int32_t col,
+                                  int32_t pos,
+                                  int32_t bit) {
+  if (row < 0) {
+    row += m_numrows;
+    col += 4 - ((m_numrows + 4) % 8);
+  }
+  if (col < 0) {
+    col += m_numcols;
+    row += 4 - ((m_numcols + 4) % 8);
+  }
+  int32_t v = m_codewords.GetAt(pos);
+  v &= 1 << (8 - bit);
+  setBit(col, row, v != 0);
+}
+void CBC_DefaultPlacement::utah(int32_t row, int32_t col, int32_t pos) {
+  module(row - 2, col - 2, pos, 1);
+  module(row - 2, col - 1, pos, 2);
+  module(row - 1, col - 2, pos, 3);
+  module(row - 1, col - 1, pos, 4);
+  module(row - 1, col, pos, 5);
+  module(row, col - 2, pos, 6);
+  module(row, col - 1, pos, 7);
+  module(row, col, pos, 8);
+}
+void CBC_DefaultPlacement::corner1(int32_t pos) {
+  module(m_numrows - 1, 0, pos, 1);
+  module(m_numrows - 1, 1, pos, 2);
+  module(m_numrows - 1, 2, pos, 3);
+  module(0, m_numcols - 2, pos, 4);
+  module(0, m_numcols - 1, pos, 5);
+  module(1, m_numcols - 1, pos, 6);
+  module(2, m_numcols - 1, pos, 7);
+  module(3, m_numcols - 1, pos, 8);
+}
+void CBC_DefaultPlacement::corner2(int32_t pos) {
+  module(m_numrows - 3, 0, pos, 1);
+  module(m_numrows - 2, 0, pos, 2);
+  module(m_numrows - 1, 0, pos, 3);
+  module(0, m_numcols - 4, pos, 4);
+  module(0, m_numcols - 3, pos, 5);
+  module(0, m_numcols - 2, pos, 6);
+  module(0, m_numcols - 1, pos, 7);
+  module(1, m_numcols - 1, pos, 8);
+}
+void CBC_DefaultPlacement::corner3(int32_t pos) {
+  module(m_numrows - 3, 0, pos, 1);
+  module(m_numrows - 2, 0, pos, 2);
+  module(m_numrows - 1, 0, pos, 3);
+  module(0, m_numcols - 2, pos, 4);
+  module(0, m_numcols - 1, pos, 5);
+  module(1, m_numcols - 1, pos, 6);
+  module(2, m_numcols - 1, pos, 7);
+  module(3, m_numcols - 1, pos, 8);
+}
+void CBC_DefaultPlacement::corner4(int32_t pos) {
+  module(m_numrows - 1, 0, pos, 1);
+  module(m_numrows - 1, m_numcols - 1, pos, 2);
+  module(0, m_numcols - 3, pos, 3);
+  module(0, m_numcols - 2, pos, 4);
+  module(0, m_numcols - 1, pos, 5);
+  module(1, m_numcols - 3, pos, 6);
+  module(1, m_numcols - 2, pos, 7);
+  module(1, m_numcols - 1, pos, 8);
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h
new file mode 100644
index 0000000..49008f3
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_DefaultPlacement {
+ public:
+  CBC_DefaultPlacement(CFX_WideString codewords,
+                       int32_t numcols,
+                       int32_t numrows);
+  virtual ~CBC_DefaultPlacement();
+
+  int32_t getNumrows();
+  int32_t getNumcols();
+  CFX_ByteArray& getBits();
+  FX_BOOL getBit(int32_t col, int32_t row);
+  void setBit(int32_t col, int32_t row, FX_BOOL bit);
+  FX_BOOL hasBit(int32_t col, int32_t row);
+  void place();
+
+ private:
+  CFX_WideString m_codewords;
+  int32_t m_numrows;
+  int32_t m_numcols;
+  CFX_ByteArray m_bits;
+  void module(int32_t row, int32_t col, int32_t pos, int32_t bit);
+  void utah(int32_t row, int32_t col, int32_t pos);
+  void corner1(int32_t pos);
+  void corner2(int32_t pos);
+  void corner3(int32_t pos);
+  void corner4(int32_t pos);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp b/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
new file mode 100644
index 0000000..d1f5b97
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
@@ -0,0 +1,154 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_EdifactEncoder::CBC_EdifactEncoder() {}
+CBC_EdifactEncoder::~CBC_EdifactEncoder() {}
+int32_t CBC_EdifactEncoder::getEncodingMode() {
+  return EDIFACT_ENCODATION;
+}
+void CBC_EdifactEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
+  CFX_WideString buffer;
+  while (context.hasMoreCharacters()) {
+    FX_WCHAR c = context.getCurrentChar();
+    encodeChar(c, buffer, e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    context.m_pos++;
+    int32_t count = buffer.GetLength();
+    if (count >= 4) {
+      context.writeCodewords(encodeToCodewords(buffer, 0, e));
+      if (e != BCExceptionNO) {
+        return;
+      }
+      buffer.Delete(0, 4);
+      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+          context.m_msg, context.m_pos, getEncodingMode());
+      if (newMode != getEncodingMode()) {
+        context.signalEncoderChange(ASCII_ENCODATION);
+        break;
+      }
+    }
+  }
+  buffer += (FX_WCHAR)31;
+  handleEOD(context, buffer, e);
+}
+void CBC_EdifactEncoder::handleEOD(CBC_EncoderContext& context,
+                                   CFX_WideString buffer,
+                                   int32_t& e) {
+  int32_t count = buffer.GetLength();
+  if (count == 0) {
+    return;
+  }
+  if (count == 1) {
+    context.updateSymbolInfo(e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    int32_t available =
+        context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
+    int32_t remaining = context.getRemainingCharacters();
+    if (remaining == 0 && available <= 2) {
+      return;
+    }
+  }
+  if (count > 4) {
+    e = BCExceptionIllegalStateCountMustNotExceed4;
+    return;
+  }
+  int32_t restChars = count - 1;
+  CFX_WideString encoded = encodeToCodewords(buffer, 0, e);
+  if (e != BCExceptionNO) {
+    return;
+  }
+  FX_BOOL endOfSymbolReached = !context.hasMoreCharacters();
+  FX_BOOL restInAscii = endOfSymbolReached && restChars <= 2;
+  if (restChars <= 2) {
+    context.updateSymbolInfo(context.getCodewordCount() + restChars, e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    int32_t available =
+        context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
+    if (available >= 3) {
+      restInAscii = FALSE;
+      context.updateSymbolInfo(context.getCodewordCount() + encoded.GetLength(),
+                               e);
+      if (e != BCExceptionNO) {
+        return;
+      }
+    }
+  }
+  if (restInAscii) {
+    context.resetSymbolInfo();
+    context.m_pos -= restChars;
+  } else {
+    context.writeCodewords(encoded);
+  }
+  context.signalEncoderChange(ASCII_ENCODATION);
+}
+void CBC_EdifactEncoder::encodeChar(FX_WCHAR c,
+                                    CFX_WideString& sb,
+                                    int32_t& e) {
+  if (c >= ' ' && c <= '?') {
+    sb += c;
+  } else if (c >= '@' && c <= '^') {
+    sb += (FX_WCHAR)(c - 64);
+  } else {
+    CBC_HighLevelEncoder::illegalCharacter(c, e);
+  }
+}
+CFX_WideString CBC_EdifactEncoder::encodeToCodewords(CFX_WideString sb,
+                                                     int32_t startPos,
+                                                     int32_t& e) {
+  int32_t len = sb.GetLength() - startPos;
+  if (len == 0) {
+    e = BCExceptionNoContents;
+    return (FX_WCHAR*)"";
+  }
+  FX_WCHAR c1 = sb.GetAt(startPos);
+  FX_WCHAR c2 = len >= 2 ? sb.GetAt(startPos + 1) : 0;
+  FX_WCHAR c3 = len >= 3 ? sb.GetAt(startPos + 2) : 0;
+  FX_WCHAR c4 = len >= 4 ? sb.GetAt(startPos + 3) : 0;
+  int32_t v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4;
+  FX_WCHAR cw1 = (FX_WCHAR)((v >> 16) & 255);
+  FX_WCHAR cw2 = (FX_WCHAR)((v >> 8) & 255);
+  FX_WCHAR cw3 = (FX_WCHAR)(v & 255);
+  CFX_WideString res;
+  res += cw1;
+  if (len >= 2) {
+    res += cw2;
+  }
+  if (len >= 3) {
+    res += cw3;
+  }
+  return res;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h b/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h
new file mode 100644
index 0000000..fd37ffb
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h
@@ -0,0 +1,29 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+class CBC_EdifactEncoder : public CBC_Encoder {
+ public:
+  CBC_EdifactEncoder();
+  virtual ~CBC_EdifactEncoder();
+  int32_t getEncodingMode();
+  void Encode(CBC_EncoderContext& context, int32_t& e);
+
+ private:
+  static void handleEOD(CBC_EncoderContext& context,
+                        CFX_WideString buffer,
+                        int32_t& e);
+  static void encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
+  static CFX_WideString encodeToCodewords(CFX_WideString sb,
+                                          int32_t startPos,
+                                          int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_Encoder.cpp b/xfa/fxbarcode/datamatrix/BC_Encoder.cpp
new file mode 100644
index 0000000..bf815bd
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_Encoder.cpp
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+
+CBC_Encoder::CBC_Encoder() {}
+CBC_Encoder::~CBC_Encoder() {}
diff --git a/xfa/fxbarcode/datamatrix/BC_Encoder.h b/xfa/fxbarcode/datamatrix/BC_Encoder.h
new file mode 100644
index 0000000..78dc6ac
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_Encoder.h
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
+
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_EncoderContext;
+class CBC_Encoder {
+ public:
+  CBC_Encoder();
+  virtual ~CBC_Encoder();
+  virtual int32_t getEncodingMode() = 0;
+  virtual void Encode(CBC_EncoderContext& context, int32_t& e) = 0;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp b/xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp
new file mode 100644
index 0000000..c99dcb7
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp
@@ -0,0 +1,111 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg,
+                                       CFX_WideString ecLevel,
+                                       int32_t& e) {
+  CFX_ByteString dststr;
+  CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr);
+  CFX_WideString sb;
+  int32_t c = dststr.GetLength();
+  for (int32_t i = 0; i < c; i++) {
+    FX_WCHAR ch = (FX_WCHAR)(dststr.GetAt(i) & 0xff);
+    if (ch == '?' && dststr.GetAt(i) != '?') {
+      e = BCExceptionCharactersOutsideISO88591Encoding;
+    }
+    sb += ch;
+  }
+  m_msg = sb;
+  m_shape = FORCE_NONE;
+  m_newEncoding = -1;
+  m_pos = 0;
+  m_symbolInfo = NULL;
+  m_skipAtEnd = 0;
+  m_maxSize = NULL;
+  m_minSize = NULL;
+}
+CBC_EncoderContext::~CBC_EncoderContext() {}
+void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape) {
+  m_shape = shape;
+}
+void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize,
+                                            CBC_Dimension* maxSize) {
+  m_maxSize = maxSize;
+  m_minSize = minSize;
+}
+CFX_WideString CBC_EncoderContext::getMessage() {
+  return m_msg;
+}
+void CBC_EncoderContext::setSkipAtEnd(int32_t count) {
+  m_skipAtEnd = count;
+}
+FX_WCHAR CBC_EncoderContext::getCurrentChar() {
+  return m_msg.GetAt(m_pos);
+}
+FX_WCHAR CBC_EncoderContext::getCurrent() {
+  return m_msg.GetAt(m_pos);
+}
+void CBC_EncoderContext::writeCodewords(CFX_WideString codewords) {
+  m_codewords += codewords;
+}
+void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword) {
+  m_codewords += codeword;
+}
+int32_t CBC_EncoderContext::getCodewordCount() {
+  return m_codewords.GetLength();
+}
+void CBC_EncoderContext::signalEncoderChange(int32_t encoding) {
+  m_newEncoding = encoding;
+}
+void CBC_EncoderContext::resetEncoderSignal() {
+  m_newEncoding = -1;
+}
+FX_BOOL CBC_EncoderContext::hasMoreCharacters() {
+  return m_pos < getTotalMessageCharCount();
+}
+int32_t CBC_EncoderContext::getRemainingCharacters() {
+  return getTotalMessageCharCount() - m_pos;
+}
+void CBC_EncoderContext::updateSymbolInfo(int32_t& e) {
+  updateSymbolInfo(getCodewordCount(), e);
+}
+void CBC_EncoderContext::updateSymbolInfo(int32_t len, int32_t& e) {
+  if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) {
+    m_symbolInfo =
+        CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_EncoderContext::resetSymbolInfo() {
+  m_shape = FORCE_NONE;
+}
+int32_t CBC_EncoderContext::getTotalMessageCharCount() {
+  return m_msg.GetLength() - m_skipAtEnd;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_EncoderContext.h b/xfa/fxbarcode/datamatrix/BC_EncoderContext.h
new file mode 100644
index 0000000..ddc6988
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_EncoderContext.h
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+class CBC_SymbolInfo;
+class CBC_Dimension;
+
+class CBC_EncoderContext : public CBC_SymbolShapeHint {
+ public:
+  CBC_EncoderContext(const CFX_WideString msg,
+                     CFX_WideString ecLevel,
+                     int32_t& e);
+  virtual ~CBC_EncoderContext();
+  void setSymbolShape(SymbolShapeHint shape);
+  void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize);
+  CFX_WideString getMessage();
+  void setSkipAtEnd(int32_t count);
+  FX_WCHAR getCurrentChar();
+  FX_WCHAR getCurrent();
+  void writeCodewords(CFX_WideString codewords);
+  void writeCodeword(FX_WCHAR codeword);
+  int32_t getCodewordCount();
+  void signalEncoderChange(int32_t encoding);
+  void resetEncoderSignal();
+  FX_BOOL hasMoreCharacters();
+  int32_t getRemainingCharacters();
+  void updateSymbolInfo(int32_t& e);
+  void updateSymbolInfo(int32_t len, int32_t& e);
+  void resetSymbolInfo();
+
+ public:
+  CFX_WideString m_msg;
+  CFX_WideString m_codewords;
+  int32_t m_pos;
+  int32_t m_newEncoding;
+  CBC_SymbolInfo* m_symbolInfo;
+
+ private:
+  int32_t getTotalMessageCharCount();
+
+ private:
+  SymbolShapeHint m_shape;
+  CBC_Dimension* m_minSize;
+  CBC_Dimension* m_maxSize;
+  int32_t m_skipAtEnd;
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
new file mode 100644
index 0000000..98c0599
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
@@ -0,0 +1,175 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+int32_t CBC_ErrorCorrection::FACTOR_SETS[] = {5,  7,  10, 11, 12, 14, 18, 20,
+                                              24, 28, 36, 42, 48, 56, 62, 68};
+int32_t CBC_ErrorCorrection::FACTORS[][100] = {
+    {228, 48, 15, 111, 62},
+    {23, 68, 144, 134, 240, 92, 254},
+    {28, 24, 185, 166, 223, 248, 116, 255, 110, 61},
+    {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120},
+    {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242},
+    {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185},
+    {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48,
+     90, 188},
+    {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27,
+     174, 186, 172},
+    {52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172,
+     254, 124, 12, 181, 184, 96, 50, 193},
+    {211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, 17,
+     138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255},
+    {245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80,
+     182, 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25,
+     225, 98, 81, 112},
+    {77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, 175,
+     95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, 248, 202,
+     69, 50, 150, 177, 226, 5, 9, 5},
+    {245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87,
+     191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138,
+     186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19},
+    {175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235,
+     150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232,
+     144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28,
+     155, 43, 203, 107, 233, 53, 143, 46},
+    {242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37,
+     185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114,
+     71, 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31,
+     176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204},
+    {220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127,
+     213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227,
+     236, 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136,
+     223, 239, 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153,
+     132, 63, 96, 103, 82, 186}};
+int32_t CBC_ErrorCorrection::MODULO_VALUE = 0x12D;
+int32_t CBC_ErrorCorrection::LOG[256] = {0};
+int32_t CBC_ErrorCorrection::ALOG[256] = {0};
+void CBC_ErrorCorrection::Initialize() {
+  int32_t p = 1;
+  for (int32_t i = 0; i < 255; i++) {
+    ALOG[i] = p;
+    LOG[p] = i;
+    p <<= 1;
+    if (p >= 256) {
+      p ^= MODULO_VALUE;
+    }
+  }
+}
+void CBC_ErrorCorrection::Finalize() {}
+CBC_ErrorCorrection::CBC_ErrorCorrection() {}
+CBC_ErrorCorrection::~CBC_ErrorCorrection() {}
+CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords,
+                                                 CBC_SymbolInfo* symbolInfo,
+                                                 int32_t& e) {
+  if (codewords.GetLength() != symbolInfo->m_dataCapacity) {
+    e = BCExceptionIllegalArgument;
+    return (FX_WCHAR*)"";
+  }
+  CFX_WideString sb;
+  sb += codewords;
+  int32_t blockCount = symbolInfo->getInterleavedBlockCount();
+  if (blockCount == 1) {
+    CFX_WideString ecc =
+        createECCBlock(codewords, symbolInfo->m_errorCodewords, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+    sb += ecc;
+  } else {
+    CFX_Int32Array dataSizes;
+    dataSizes.SetSize(blockCount);
+    CFX_Int32Array errorSizes;
+    errorSizes.SetSize(blockCount);
+    CFX_Int32Array startPos;
+    startPos.SetSize(blockCount);
+    for (int32_t i = 0; i < blockCount; i++) {
+      dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1);
+      errorSizes[i] = symbolInfo->getErrorLengthForInterleavedBlock(i + 1);
+      startPos[i] = 0;
+      if (i > 0) {
+        startPos[i] = startPos[i - 1] + dataSizes[i];
+      }
+    }
+    for (int32_t block = 0; block < blockCount; block++) {
+      CFX_WideString temp;
+      for (int32_t d = block; d < symbolInfo->m_dataCapacity; d += blockCount) {
+        temp += (FX_WCHAR)codewords.GetAt(d);
+      }
+      CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+      int32_t pos = 0;
+      for (int32_t l = block; l < errorSizes[block] * blockCount;
+           l += blockCount) {
+        sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++));
+      }
+    }
+  }
+  return sb;
+}
+CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords,
+                                                   int32_t numECWords,
+                                                   int32_t& e) {
+  return createECCBlock(codewords, 0, codewords.GetLength(), numECWords, e);
+}
+CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords,
+                                                   int32_t start,
+                                                   int32_t len,
+                                                   int32_t numECWords,
+                                                   int32_t& e) {
+  int32_t table = -1;
+  for (int32_t i = 0; i < sizeof(FACTOR_SETS) / sizeof(int32_t); i++) {
+    if (FACTOR_SETS[i] == numECWords) {
+      table = i;
+      break;
+    }
+  }
+  if (table < 0) {
+    e = BCExceptionIllegalArgument;
+    return (FX_WCHAR*)"";
+  }
+  FX_WORD* ecc = FX_Alloc(FX_WORD, numECWords);
+  FXSYS_memset(ecc, 0, numECWords * sizeof(FX_WORD));
+  for (int32_t l = start; l < start + len; l++) {
+    FX_WORD m = ecc[numECWords - 1] ^ codewords.GetAt(l);
+    for (int32_t k = numECWords - 1; k > 0; k--) {
+      if (m != 0 && FACTORS[table][k] != 0) {
+        ecc[k] = (FX_WORD)(ecc[k - 1] ^
+                           ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]);
+      } else {
+        ecc[k] = ecc[k - 1];
+      }
+    }
+    if (m != 0 && FACTORS[table][0] != 0) {
+      ecc[0] = (FX_WORD)ALOG[(LOG[m] + LOG[FACTORS[table][0]]) % 255];
+    } else {
+      ecc[0] = 0;
+    }
+  }
+  CFX_WideString strecc;
+  for (int32_t j = 0; j < numECWords; j++) {
+    strecc += (FX_WCHAR)ecc[numECWords - j - 1];
+  }
+  FX_Free(ecc);
+  return strecc;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h
new file mode 100644
index 0000000..a4264b6
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
+
+class CBC_SymbolInfo;
+class CBC_ErrorCorrection {
+ public:
+  CBC_ErrorCorrection();
+  virtual ~CBC_ErrorCorrection();
+  static void Initialize();
+  static void Finalize();
+  static CFX_WideString encodeECC200(CFX_WideString codewords,
+                                     CBC_SymbolInfo* symbolInfo,
+                                     int32_t& e);
+
+ private:
+  static int32_t FACTOR_SETS[];
+  static int32_t FACTORS[][100];
+  static int32_t MODULO_VALUE;
+  static int32_t LOG[256];
+  static int32_t ALOG[256];
+
+ private:
+  static CFX_WideString createECCBlock(CFX_WideString codewords,
+                                       int32_t numECWords,
+                                       int32_t& e);
+  static CFX_WideString createECCBlock(CFX_WideString codewords,
+                                       int32_t start,
+                                       int32_t len,
+                                       int32_t numECWords,
+                                       int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
new file mode 100644
index 0000000..d8e7bb1
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -0,0 +1,375 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <limits>
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
+#include "xfa/fxbarcode/utils.h"
+
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230;
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231;
+FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235;
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238;
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239;
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240;
+FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254;
+FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254;
+FX_WCHAR CBC_HighLevelEncoder::PAD = 129;
+FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236;
+FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237;
+const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05";
+const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06";
+const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004;
+
+CBC_HighLevelEncoder::CBC_HighLevelEncoder() {}
+CBC_HighLevelEncoder::~CBC_HighLevelEncoder() {}
+CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) {
+  CFX_ByteString bytestr;
+  CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr);
+  for (int32_t i = 0; i < bytestr.GetLength(); i++) {
+    m_bytearray.Add(bytestr.GetAt(i));
+  }
+  return m_bytearray;
+}
+CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
+                                                     CFX_WideString ecLevel,
+                                                     int32_t& e) {
+  return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e);
+}
+CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
+                                                     CFX_WideString ecLevel,
+                                                     SymbolShapeHint shape,
+                                                     CBC_Dimension* minSize,
+                                                     CBC_Dimension* maxSize,
+                                                     int32_t& e) {
+  CBC_EncoderContext context(msg, ecLevel, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+  context.setSymbolShape(shape);
+  context.setSizeConstraints(minSize, maxSize);
+  if ((msg.Mid(0, 6) == MACRO_05_HEADER) &&
+      (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
+    context.writeCodeword(MACRO_05);
+    context.setSkipAtEnd(2);
+    context.m_pos += 6;
+  } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) &&
+             (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
+    context.writeCodeword(MACRO_06);
+    context.setSkipAtEnd(2);
+    context.m_pos += 6;
+  }
+  CFX_PtrArray encoders;
+  encoders.Add(new CBC_ASCIIEncoder());
+  encoders.Add(new CBC_C40Encoder());
+  encoders.Add(new CBC_TextEncoder());
+  encoders.Add(new CBC_X12Encoder());
+  encoders.Add(new CBC_EdifactEncoder());
+  encoders.Add(new CBC_Base256Encoder());
+  int32_t encodingMode = ASCII_ENCODATION;
+  while (context.hasMoreCharacters()) {
+    ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e);
+    if (e != BCExceptionNO) {
+      for (int32_t i = 0; i < encoders.GetSize(); i++) {
+        delete (CBC_Encoder*)encoders.GetAt(i);
+      }
+      encoders.RemoveAll();
+      return (FX_WCHAR*)"";
+    }
+    if (context.m_newEncoding >= 0) {
+      encodingMode = context.m_newEncoding;
+      context.resetEncoderSignal();
+    }
+  }
+  int32_t len = context.m_codewords.GetLength();
+  context.updateSymbolInfo(e);
+  if (e != BCExceptionNO) {
+    for (int32_t i = 0; i < encoders.GetSize(); i++) {
+      delete (CBC_Encoder*)encoders.GetAt(i);
+    }
+    encoders.RemoveAll();
+    return (FX_WCHAR*)"";
+  }
+  int32_t capacity = context.m_symbolInfo->m_dataCapacity;
+  if (len < capacity) {
+    if (encodingMode != ASCII_ENCODATION &&
+        encodingMode != BASE256_ENCODATION) {
+      context.writeCodeword(0x00fe);
+    }
+  }
+  CFX_WideString codewords = context.m_codewords;
+  if (codewords.GetLength() < capacity) {
+    codewords += PAD;
+  }
+  while (codewords.GetLength() < capacity) {
+    codewords += (randomize253State(PAD, codewords.GetLength() + 1));
+  }
+  for (int32_t i = 0; i < encoders.GetSize(); i++) {
+    delete (CBC_Encoder*)encoders.GetAt(i);
+  }
+  encoders.RemoveAll();
+  return codewords;
+}
+int32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg,
+                                            int32_t startpos,
+                                            int32_t currentMode) {
+  if (startpos >= msg.GetLength()) {
+    return currentMode;
+  }
+  CFX_FloatArray charCounts;
+  if (currentMode == ASCII_ENCODATION) {
+    charCounts.Add(0);
+    charCounts.Add(1);
+    charCounts.Add(1);
+    charCounts.Add(1);
+    charCounts.Add(1);
+    charCounts.Add(1.25f);
+  } else {
+    charCounts.Add(1);
+    charCounts.Add(2);
+    charCounts.Add(2);
+    charCounts.Add(2);
+    charCounts.Add(2);
+    charCounts.Add(2.25f);
+    charCounts[currentMode] = 0;
+  }
+  int32_t charsProcessed = 0;
+  while (TRUE) {
+    if ((startpos + charsProcessed) == msg.GetLength()) {
+      FX_DWORD min = std::numeric_limits<int32_t>::max();
+      CFX_ByteArray mins;
+      mins.SetSize(6);
+      CFX_Int32Array intCharCounts;
+      intCharCounts.SetSize(6);
+      min = findMinimums(charCounts, intCharCounts, min, mins);
+      int32_t minCount = getMinimumCount(mins);
+      if (intCharCounts[ASCII_ENCODATION] == min) {
+        return ASCII_ENCODATION;
+      }
+      if (minCount == 1 && mins[BASE256_ENCODATION] > 0) {
+        return BASE256_ENCODATION;
+      }
+      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
+        return EDIFACT_ENCODATION;
+      }
+      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
+        return TEXT_ENCODATION;
+      }
+      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
+        return X12_ENCODATION;
+      }
+      return C40_ENCODATION;
+    }
+    FX_WCHAR c = msg.GetAt(startpos + charsProcessed);
+    charsProcessed++;
+    if (isDigit(c)) {
+      charCounts[ASCII_ENCODATION] += 0.5;
+    } else if (isExtendedASCII(c)) {
+      charCounts[ASCII_ENCODATION] =
+          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
+      charCounts[ASCII_ENCODATION] += 2;
+    } else {
+      charCounts[ASCII_ENCODATION] =
+          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
+      charCounts[ASCII_ENCODATION]++;
+    }
+    if (isNativeC40(c)) {
+      charCounts[C40_ENCODATION] += 2.0f / 3.0f;
+    } else if (isExtendedASCII(c)) {
+      charCounts[C40_ENCODATION] += 8.0f / 3.0f;
+    } else {
+      charCounts[C40_ENCODATION] += 4.0f / 3.0f;
+    }
+    if (isNativeText(c)) {
+      charCounts[TEXT_ENCODATION] += 2.0f / 3.0f;
+    } else if (isExtendedASCII(c)) {
+      charCounts[TEXT_ENCODATION] += 8.0f / 3.0f;
+    } else {
+      charCounts[TEXT_ENCODATION] += 4.0f / 3.0f;
+    }
+    if (isNativeX12(c)) {
+      charCounts[X12_ENCODATION] += 2.0f / 3.0f;
+    } else if (isExtendedASCII(c)) {
+      charCounts[X12_ENCODATION] += 13.0f / 3.0f;
+    } else {
+      charCounts[X12_ENCODATION] += 10.0f / 3.0f;
+    }
+    if (isNativeEDIFACT(c)) {
+      charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f;
+    } else if (isExtendedASCII(c)) {
+      charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f;
+    } else {
+      charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f;
+    }
+    if (isSpecialB256(c)) {
+      charCounts[BASE256_ENCODATION] += 4;
+    } else {
+      charCounts[BASE256_ENCODATION]++;
+    }
+    if (charsProcessed >= 4) {
+      CFX_Int32Array intCharCounts;
+      intCharCounts.SetSize(6);
+      CFX_ByteArray mins;
+      mins.SetSize(6);
+      findMinimums(charCounts, intCharCounts,
+                   std::numeric_limits<int32_t>::max(), mins);
+      int32_t minCount = getMinimumCount(mins);
+      if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] &&
+          intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] &&
+          intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] &&
+          intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] &&
+          intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) {
+        return ASCII_ENCODATION;
+      }
+      if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] ||
+          (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] +
+           mins[EDIFACT_ENCODATION]) == 0) {
+        return BASE256_ENCODATION;
+      }
+      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
+        return EDIFACT_ENCODATION;
+      }
+      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
+        return TEXT_ENCODATION;
+      }
+      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
+        return X12_ENCODATION;
+      }
+      if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] &&
+          intCharCounts[C40_ENCODATION] + 1 <
+              intCharCounts[BASE256_ENCODATION] &&
+          intCharCounts[C40_ENCODATION] + 1 <
+              intCharCounts[EDIFACT_ENCODATION] &&
+          intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) {
+        if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) {
+          return C40_ENCODATION;
+        }
+        if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) {
+          int32_t p = startpos + charsProcessed + 1;
+          while (p < msg.GetLength()) {
+            FX_WCHAR tc = msg.GetAt(p);
+            if (isX12TermSep(tc)) {
+              return X12_ENCODATION;
+            }
+            if (!isNativeX12(tc)) {
+              break;
+            }
+            p++;
+          }
+          return C40_ENCODATION;
+        }
+      }
+    }
+  }
+}
+FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) {
+  return ch >= '0' && ch <= '9';
+}
+FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) {
+  return ch >= 128 && ch <= 255;
+}
+int32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg,
+                                                             int32_t startpos) {
+  int32_t count = 0;
+  int32_t len = msg.GetLength();
+  int32_t idx = startpos;
+  if (idx < len) {
+    FX_WCHAR ch = msg.GetAt(idx);
+    while (isDigit(ch) && idx < len) {
+      count++;
+      idx++;
+      if (idx < len) {
+        ch = msg.GetAt(idx);
+      }
+    }
+  }
+  return count;
+}
+void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) {
+  e = BCExceptionIllegalArgument;
+}
+FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch,
+                                                 int32_t codewordPosition) {
+  int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1;
+  int32_t tempVariable = ch + pseudoRandom;
+  return tempVariable <= 254 ? (FX_WCHAR)tempVariable
+                             : (FX_WCHAR)(tempVariable - 254);
+}
+int32_t CBC_HighLevelEncoder::findMinimums(CFX_FloatArray& charCounts,
+                                           CFX_Int32Array& intCharCounts,
+                                           int32_t min,
+                                           CFX_ByteArray& mins) {
+  for (int32_t l = 0; l < mins.GetSize(); l++) {
+    mins[l] = (uint8_t)0;
+  }
+  for (int32_t i = 0; i < 6; i++) {
+    intCharCounts[i] = (int32_t)ceil(charCounts[i]);
+    int32_t current = intCharCounts[i];
+    if (min > current) {
+      min = current;
+      for (int32_t j = 0; j < mins.GetSize(); j++) {
+        mins[j] = (uint8_t)0;
+      }
+    }
+    if (min == current) {
+      mins[i]++;
+    }
+  }
+  return min;
+}
+int32_t CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray& mins) {
+  int32_t minCount = 0;
+  for (int32_t i = 0; i < 6; i++) {
+    minCount += mins[i];
+  }
+  return minCount;
+}
+FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) {
+  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z');
+}
+FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) {
+  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z');
+}
+FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) {
+  return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') ||
+         (ch >= 'A' && ch <= 'Z');
+}
+FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) {
+  return (ch == '\r') || (ch == '*') || (ch == '>');
+}
+FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) {
+  return ch >= ' ' && ch <= '^';
+}
+FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) {
+  return FALSE;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h
new file mode 100644
index 0000000..0aad4d4
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h
@@ -0,0 +1,76 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
+
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+#define ASCII_ENCODATION 0
+#define C40_ENCODATION 1
+#define TEXT_ENCODATION 2
+#define X12_ENCODATION 3
+#define EDIFACT_ENCODATION 4
+#define BASE256_ENCODATION 5
+
+class CBC_HighLevelEncoder : public CBC_SymbolShapeHint {
+ public:
+  CBC_HighLevelEncoder();
+  virtual ~CBC_HighLevelEncoder();
+  CFX_ByteArray& getBytesForMessage(CFX_WideString msg);
+  static CFX_WideString encodeHighLevel(CFX_WideString msg,
+                                        CFX_WideString ecLevel,
+                                        int32_t& e);
+  static CFX_WideString encodeHighLevel(CFX_WideString msg,
+                                        CFX_WideString ecLevel,
+                                        SymbolShapeHint shape,
+                                        CBC_Dimension* minSize,
+                                        CBC_Dimension* maxSize,
+                                        int32_t& e);
+  static int32_t lookAheadTest(CFX_WideString msg,
+                               int32_t startpos,
+                               int32_t currentMode);
+  static FX_BOOL isDigit(FX_WCHAR ch);
+  static FX_BOOL isExtendedASCII(FX_WCHAR ch);
+  static int32_t determineConsecutiveDigitCount(CFX_WideString msg,
+                                                int32_t startpos);
+  static void illegalCharacter(FX_WCHAR c, int32_t& e);
+
+ public:
+  static FX_WCHAR LATCH_TO_C40;
+  static FX_WCHAR LATCH_TO_BASE256;
+  static FX_WCHAR UPPER_SHIFT;
+  static FX_WCHAR LATCH_TO_ANSIX12;
+  static FX_WCHAR LATCH_TO_TEXT;
+  static FX_WCHAR LATCH_TO_EDIFACT;
+  static FX_WCHAR C40_UNLATCH;
+  static FX_WCHAR X12_UNLATCH;
+
+ private:
+  static FX_WCHAR PAD;
+  static FX_WCHAR MACRO_05;
+  static FX_WCHAR MACRO_06;
+  static const wchar_t* MACRO_05_HEADER;
+  static const wchar_t* MACRO_06_HEADER;
+  static const wchar_t MACRO_TRAILER;
+  CFX_ByteArray m_bytearray;
+
+ private:
+  static FX_WCHAR randomize253State(FX_WCHAR ch, int32_t codewordPosition);
+  static int32_t findMinimums(CFX_FloatArray& charCounts,
+                              CFX_Int32Array& intCharCounts,
+                              int32_t min,
+                              CFX_ByteArray& mins);
+  static int32_t getMinimumCount(CFX_ByteArray& mins);
+  static FX_BOOL isNativeC40(FX_WCHAR ch);
+  static FX_BOOL isNativeText(FX_WCHAR ch);
+  static FX_BOOL isNativeX12(FX_WCHAR ch);
+  static FX_BOOL isX12TermSep(FX_WCHAR ch);
+  static FX_BOOL isNativeEDIFACT(FX_WCHAR ch);
+  static FX_BOOL isSpecialB256(FX_WCHAR ch);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp b/xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp
new file mode 100644
index 0000000..593f4cb
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp
@@ -0,0 +1,255 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+#define SYMBOLS_COUNT 30
+
+CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+void CBC_SymbolInfo::Initialize() {
+  m_PROD_SYMBOLS[0] = new CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1);
+  m_PROD_SYMBOLS[1] = new CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1);
+  m_PROD_SYMBOLS[2] = new CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1);
+  m_PROD_SYMBOLS[3] = new CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1);
+  m_PROD_SYMBOLS[4] = new CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2);
+  m_PROD_SYMBOLS[5] = new CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1);
+  m_PROD_SYMBOLS[6] = new CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1);
+  m_PROD_SYMBOLS[7] = new CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1);
+  m_PROD_SYMBOLS[8] = new CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1);
+  m_PROD_SYMBOLS[9] = new CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2);
+  m_PROD_SYMBOLS[10] = new CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1);
+  m_PROD_SYMBOLS[11] = new CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2);
+  m_PROD_SYMBOLS[12] = new CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1);
+  m_PROD_SYMBOLS[13] = new CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1);
+  m_PROD_SYMBOLS[14] = new CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2);
+  m_PROD_SYMBOLS[15] = new CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4);
+  m_PROD_SYMBOLS[16] = new CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4);
+  m_PROD_SYMBOLS[17] = new CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4);
+  m_PROD_SYMBOLS[18] = new CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4);
+  m_PROD_SYMBOLS[19] = new CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4);
+  m_PROD_SYMBOLS[20] = new CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42);
+  m_PROD_SYMBOLS[21] = new CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56);
+  m_PROD_SYMBOLS[22] = new CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36);
+  m_PROD_SYMBOLS[23] = new CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48);
+  m_PROD_SYMBOLS[24] = new CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56);
+  m_PROD_SYMBOLS[25] = new CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68);
+  m_PROD_SYMBOLS[26] = new CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56);
+  m_PROD_SYMBOLS[27] =
+      new CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68);
+  m_PROD_SYMBOLS[28] =
+      new CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62);
+  m_PROD_SYMBOLS[29] = new CBC_DataMatrixSymbolInfo144();
+  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
+    m_symbols[i] = m_PROD_SYMBOLS[i];
+  }
+}
+void CBC_SymbolInfo::Finalize() {
+  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
+    delete m_PROD_SYMBOLS[i];
+    m_PROD_SYMBOLS[i] = NULL;
+    m_symbols[i] = NULL;
+  }
+}
+CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular,
+                               int32_t dataCapacity,
+                               int32_t errorCodewords,
+                               int32_t matrixWidth,
+                               int32_t matrixHeight,
+                               int32_t dataRegions) {
+  m_rectangular = rectangular;
+  m_dataCapacity = dataCapacity;
+  m_errorCodewords = errorCodewords;
+  m_matrixWidth = matrixWidth;
+  m_matrixHeight = matrixHeight;
+  m_dataRegions = dataRegions;
+  m_rsBlockData = dataCapacity;
+  m_rsBlockError = errorCodewords;
+}
+CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular,
+                               int32_t dataCapacity,
+                               int32_t errorCodewords,
+                               int32_t matrixWidth,
+                               int32_t matrixHeight,
+                               int32_t dataRegions,
+                               int32_t rsBlockData,
+                               int32_t rsBlockError) {
+  m_rectangular = rectangular;
+  m_dataCapacity = dataCapacity;
+  m_errorCodewords = errorCodewords;
+  m_matrixWidth = matrixWidth;
+  m_matrixHeight = matrixHeight;
+  m_dataRegions = dataRegions;
+  m_rsBlockData = rsBlockData;
+  m_rsBlockError = rsBlockError;
+}
+CBC_SymbolInfo::~CBC_SymbolInfo() {}
+
+CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, int32_t& e) {
+  return lookup(dataCodewords, FORCE_NONE, TRUE, e);
+}
+CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
+                                       SymbolShapeHint shape,
+                                       int32_t& e) {
+  return lookup(dataCodewords, shape, TRUE, e);
+}
+CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
+                                       FX_BOOL allowRectangular,
+                                       FX_BOOL fail,
+                                       int32_t& e) {
+  SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE;
+  return lookup(dataCodewords, shape, fail, e);
+}
+CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
+                                       SymbolShapeHint shape,
+                                       FX_BOOL fail,
+                                       int32_t& e) {
+  return lookup(dataCodewords, shape, NULL, NULL, fail, e);
+}
+CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
+                                       SymbolShapeHint shape,
+                                       CBC_Dimension* minSize,
+                                       CBC_Dimension* maxSize,
+                                       FX_BOOL fail,
+                                       int32_t& e) {
+  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
+    CBC_SymbolInfo* symbol = m_symbols[i];
+    if (shape == FORCE_SQUARE && symbol->m_rectangular) {
+      continue;
+    }
+    if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) {
+      continue;
+    }
+    if (minSize && (symbol->getSymbolWidth(e) < minSize->getWidth() ||
+                    symbol->getSymbolHeight(e) < minSize->getHeight())) {
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      continue;
+    }
+    if (maxSize && (symbol->getSymbolWidth(e) > maxSize->getWidth() ||
+                    symbol->getSymbolHeight(e) > maxSize->getHeight())) {
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      continue;
+    }
+    if (dataCodewords <= symbol->m_dataCapacity) {
+      return symbol;
+    }
+  }
+  if (fail) {
+    e = BCExceptionIllegalDataCodewords;
+    return NULL;
+  }
+  return NULL;
+}
+int32_t CBC_SymbolInfo::getHorizontalDataRegions(int32_t& e) {
+  switch (m_dataRegions) {
+    case 1:
+      return 1;
+    case 2:
+      return 2;
+    case 4:
+      return 2;
+    case 16:
+      return 4;
+    case 36:
+      return 6;
+    default:
+      e = BCExceptionCannotHandleThisNumberOfDataRegions;
+      return 0;
+  }
+}
+int32_t CBC_SymbolInfo::getVerticalDataRegions(int32_t& e) {
+  switch (m_dataRegions) {
+    case 1:
+      return 1;
+    case 2:
+      return 1;
+    case 4:
+      return 2;
+    case 16:
+      return 4;
+    case 36:
+      return 6;
+    default:
+      e = BCExceptionCannotHandleThisNumberOfDataRegions;
+      return 0;
+  }
+}
+int32_t CBC_SymbolInfo::getSymbolDataWidth(int32_t& e) {
+  return getHorizontalDataRegions(e) * m_matrixWidth;
+}
+int32_t CBC_SymbolInfo::getSymbolDataHeight(int32_t& e) {
+  return getVerticalDataRegions(e) * m_matrixHeight;
+}
+int32_t CBC_SymbolInfo::getSymbolWidth(int32_t& e) {
+  return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2);
+}
+int32_t CBC_SymbolInfo::getSymbolHeight(int32_t& e) {
+  return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2);
+}
+int32_t CBC_SymbolInfo::getCodewordCount() {
+  return m_dataCapacity + m_errorCodewords;
+}
+int32_t CBC_SymbolInfo::getInterleavedBlockCount() {
+  return m_dataCapacity / m_rsBlockData;
+}
+int32_t CBC_SymbolInfo::getDataLengthForInterleavedBlock(int32_t index) {
+  return m_rsBlockData;
+}
+int32_t CBC_SymbolInfo::getErrorLengthForInterleavedBlock(int32_t index) {
+  return m_rsBlockError;
+}
+CFX_WideString CBC_SymbolInfo::toString(int32_t& e) {
+  CFX_WideString sb;
+  sb += (FX_WCHAR*)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:");
+  sb += (FX_WCHAR*)" data region ";
+  sb += m_matrixWidth;
+  sb += (FX_WCHAR)'x';
+  sb += m_matrixHeight;
+  sb += (FX_WCHAR*)", symbol size ";
+  sb += getSymbolWidth(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+  sb += (FX_WCHAR)'x';
+  sb += getSymbolHeight(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+  sb += (FX_WCHAR*)", symbol data size ";
+  sb += getSymbolDataWidth(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+  sb += (FX_WCHAR)'x';
+  sb += getSymbolDataHeight(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
+  sb += (FX_WCHAR*)", codewords ";
+  sb += m_dataCapacity;
+  sb += (FX_WCHAR)'+';
+  sb += m_errorCodewords;
+  return sb;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_SymbolInfo.h b/xfa/fxbarcode/datamatrix/BC_SymbolInfo.h
new file mode 100644
index 0000000..8f7ed28
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_SymbolInfo.h
@@ -0,0 +1,83 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+class CBC_Dimension;
+
+class CBC_SymbolInfo : public CBC_SymbolShapeHint {
+ public:
+  CBC_SymbolInfo(FX_BOOL rectangular,
+                 int32_t dataCapacity,
+                 int32_t errorCodewords,
+                 int32_t matrixWidth,
+                 int32_t matrixHeight,
+                 int32_t dataRegions);
+  virtual ~CBC_SymbolInfo();
+  static void Initialize();
+  static void Finalize();
+  static void overrideSymbolSet(CBC_SymbolInfo* override);
+  static CBC_SymbolInfo* lookup(int32_t dataCodewords, int32_t& e);
+  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
+                                SymbolShapeHint shape,
+                                int32_t& e);
+  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
+                                FX_BOOL allowRectangular,
+                                FX_BOOL fail,
+                                int32_t& e);
+  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
+                                SymbolShapeHint shape,
+                                FX_BOOL fail,
+                                int32_t& e);
+  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
+                                SymbolShapeHint shape,
+                                CBC_Dimension* minSize,
+                                CBC_Dimension* maxSize,
+                                FX_BOOL fail,
+                                int32_t& e);
+  int32_t getHorizontalDataRegions(int32_t& e);
+  int32_t getVerticalDataRegions(int32_t& e);
+  int32_t getSymbolDataWidth(int32_t& e);
+  int32_t getSymbolDataHeight(int32_t& e);
+  int32_t getSymbolWidth(int32_t& e);
+  int32_t getSymbolHeight(int32_t& e);
+  int32_t getCodewordCount();
+  int32_t getInterleavedBlockCount();
+  int32_t getDataLengthForInterleavedBlock(int32_t index);
+  int32_t getErrorLengthForInterleavedBlock(int32_t index);
+  CFX_WideString toString(int32_t& e);
+
+ public:
+  int32_t m_dataCapacity;
+  int32_t m_errorCodewords;
+  int32_t m_matrixWidth;
+  int32_t m_matrixHeight;
+  int32_t m_rsBlockData;
+  int32_t m_rsBlockError;
+  static CBC_SymbolInfo* m_PROD_SYMBOLS[30];
+
+ private:
+  static CBC_SymbolInfo* m_symbols[30];
+  FX_BOOL m_rectangular;
+  int32_t m_dataRegions;
+
+ private:
+  CBC_SymbolInfo(FX_BOOL rectangular,
+                 int32_t dataCapacity,
+                 int32_t errorCodewords,
+                 int32_t matrixWidth,
+                 int32_t matrixHeight,
+                 int32_t dataRegions,
+                 int32_t rsBlockData,
+                 int32_t rsBlockError);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp b/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp
new file mode 100644
index 0000000..8f91dd8
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+
+CBC_SymbolShapeHint::CBC_SymbolShapeHint() {}
+CBC_SymbolShapeHint::~CBC_SymbolShapeHint() {}
diff --git a/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h b/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h
new file mode 100644
index 0000000..5dfac05
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
+
+class CBC_SymbolShapeHint {
+ public:
+  CBC_SymbolShapeHint();
+  virtual ~CBC_SymbolShapeHint();
+  enum SymbolShapeHint {
+    FORCE_NONE,
+    FORCE_SQUARE,
+    FORCE_RECTANGLE,
+  };
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp b/xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp
new file mode 100644
index 0000000..c8b37e9
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp
@@ -0,0 +1,98 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
+
+CBC_TextEncoder::CBC_TextEncoder() {}
+CBC_TextEncoder::~CBC_TextEncoder() {}
+int32_t CBC_TextEncoder::getEncodingMode() {
+  return TEXT_ENCODATION;
+}
+int32_t CBC_TextEncoder::encodeChar(FX_WCHAR c,
+                                    CFX_WideString& sb,
+                                    int32_t& e) {
+  if (c == ' ') {
+    sb += (FX_WCHAR)'\3';
+    return 1;
+  }
+  if (c >= '0' && c <= '9') {
+    sb += (FX_WCHAR)(c - 48 + 4);
+    return 1;
+  }
+  if (c >= 'a' && c <= 'z') {
+    sb += (FX_WCHAR)(c - 97 + 14);
+    return 1;
+  }
+  if (c <= 0x1f) {
+    sb += (FX_WCHAR)'\0';
+    sb += c;
+    return 2;
+  }
+  if (c >= '!' && c <= '/') {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 33);
+    return 2;
+  }
+  if (c >= ':' && c <= '@') {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 58 + 15);
+    return 2;
+  }
+  if (c >= '[' && c <= '_') {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)(c - 91 + 22);
+    return 2;
+  }
+  if (c == 0x0060) {
+    sb += (FX_WCHAR)'\2';
+    sb += (FX_WCHAR)(c - 96);
+    return 2;
+  }
+  if (c >= 'A' && c <= 'Z') {
+    sb += (FX_WCHAR)'\2';
+    sb += (FX_WCHAR)(c - 65 + 1);
+    return 2;
+  }
+  if (c >= '{' && c <= 0x007f) {
+    sb += (FX_WCHAR)'\2';
+    sb += (FX_WCHAR)(c - 123 + 27);
+    return 2;
+  }
+  if (c >= 0x0080) {
+    sb += (FX_WCHAR)'\1';
+    sb += (FX_WCHAR)0x001e;
+    int32_t len = 2;
+    len += encodeChar((FX_WCHAR)(c - 128), sb, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+    return len;
+  }
+  CBC_HighLevelEncoder::illegalCharacter(c, e);
+  return -1;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_TextEncoder.h b/xfa/fxbarcode/datamatrix/BC_TextEncoder.h
new file mode 100644
index 0000000..1f97f3f
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_TextEncoder.h
@@ -0,0 +1,19 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
+
+class CBC_TextEncoder;
+class CBC_TextEncoder : public CBC_C40Encoder {
+ public:
+  CBC_TextEncoder();
+  virtual ~CBC_TextEncoder();
+  int32_t getEncodingMode();
+  int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp b/xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp
new file mode 100644
index 0000000..9ebfc46
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006-2007 Jeremias Maerki.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Dimension.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
+#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
+#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
+#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
+
+CBC_X12Encoder::CBC_X12Encoder() {}
+CBC_X12Encoder::~CBC_X12Encoder() {}
+int32_t CBC_X12Encoder::getEncodingMode() {
+  return X12_ENCODATION;
+}
+void CBC_X12Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
+  CFX_WideString buffer;
+  while (context.hasMoreCharacters()) {
+    FX_WCHAR c = context.getCurrentChar();
+    context.m_pos++;
+    encodeChar(c, buffer, e);
+    if (e != BCExceptionNO) {
+      return;
+    }
+    int32_t count = buffer.GetLength();
+    if ((count % 3) == 0) {
+      writeNextTriplet(context, buffer);
+      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+          context.m_msg, context.m_pos, getEncodingMode());
+      if (newMode != getEncodingMode()) {
+        context.signalEncoderChange(newMode);
+        break;
+      }
+    }
+  }
+  handleEOD(context, buffer, e);
+}
+void CBC_X12Encoder::handleEOD(CBC_EncoderContext& context,
+                               CFX_WideString& buffer,
+                               int32_t& e) {
+  context.updateSymbolInfo(e);
+  if (e != BCExceptionNO) {
+    return;
+  }
+  int32_t available =
+      context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
+  int32_t count = buffer.GetLength();
+  if (count == 2) {
+    context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);
+    context.m_pos -= 2;
+    context.signalEncoderChange(ASCII_ENCODATION);
+  } else if (count == 1) {
+    context.m_pos--;
+    if (available > 1) {
+      context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);
+    }
+    context.signalEncoderChange(ASCII_ENCODATION);
+  }
+}
+int32_t CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e) {
+  if (c == '\r') {
+    sb += (FX_WCHAR)'\0';
+  } else if (c == '*') {
+    sb += (FX_WCHAR)'\1';
+  } else if (c == '>') {
+    sb += (FX_WCHAR)'\2';
+  } else if (c == ' ') {
+    sb += (FX_WCHAR)'\3';
+  } else if (c >= '0' && c <= '9') {
+    sb += (FX_WCHAR)(c - 48 + 4);
+  } else if (c >= 'A' && c <= 'Z') {
+    sb += (FX_WCHAR)(c - 65 + 14);
+  } else {
+    CBC_HighLevelEncoder::illegalCharacter(c, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  }
+  return 1;
+}
diff --git a/xfa/fxbarcode/datamatrix/BC_X12Encoder.h b/xfa/fxbarcode/datamatrix/BC_X12Encoder.h
new file mode 100644
index 0000000..5dccbb1
--- /dev/null
+++ b/xfa/fxbarcode/datamatrix/BC_X12Encoder.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
+#define XFA_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
+
+class CBC_C40Encoder;
+class CBC_X12Encoder;
+class CBC_X12Encoder : public CBC_C40Encoder {
+ public:
+  CBC_X12Encoder();
+  virtual ~CBC_X12Encoder();
+  int32_t getEncodingMode();
+  void Encode(CBC_EncoderContext& context, int32_t& e);
+  void handleEOD(CBC_EncoderContext& context,
+                 CFX_WideString& buffer,
+                 int32_t& e);
+  int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
diff --git a/xfa/fxbarcode/oned/BC_OneDReader.cpp b/xfa/fxbarcode/oned/BC_OneDReader.cpp
new file mode 100644
index 0000000..c66ec0b
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDReader.cpp
@@ -0,0 +1,175 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_OneDReader::CBC_OneDReader() {}
+CBC_OneDReader::~CBC_OneDReader() {}
+CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
+  CFX_ByteString strtemp = Decode(image, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return strtemp;
+}
+CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap* image,
+                                      int32_t hints,
+                                      int32_t& e) {
+  CFX_ByteString strtemp = DeDecode(image, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return strtemp;
+}
+CFX_ByteString CBC_OneDReader::DeDecode(CBC_BinaryBitmap* image,
+                                        int32_t hints,
+                                        int32_t& e) {
+  int32_t height = image->GetHeight();
+  int32_t middle = height >> 1;
+  FX_BOOL tryHarder = FALSE;
+  int32_t rowStep = std::max(1, height >> (tryHarder ? 8 : 5));
+  int32_t maxLines;
+  if (tryHarder) {
+    maxLines = height;
+  } else {
+    maxLines = 15;
+  }
+  for (int32_t x = 0; x < maxLines; x++) {
+    int32_t rowStepsAboveOrBelow = (x + 1) >> 1;
+    const bool isAbove = (x & 0x01) == 0;
+    int32_t rowNumber =
+        middle +
+        rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow);
+    if (rowNumber < 0 || rowNumber >= height) {
+      break;
+    }
+    std::unique_ptr<CBC_CommonBitArray> row(
+        image->GetBlackRow(rowNumber, nullptr, e));
+    if (e != BCExceptionNO) {
+      e = BCExceptionNO;
+      continue;
+    }
+    for (int32_t attempt = 0; attempt < 2; attempt++) {
+      if (attempt == 1) {
+        row->Reverse();
+      }
+      CFX_ByteString result = DecodeRow(rowNumber, row.get(), hints, e);
+      if (e != BCExceptionNO) {
+        e = BCExceptionNO;
+        continue;
+      }
+      return result;
+    }
+  }
+  e = BCExceptionNotFound;
+  return "";
+}
+void CBC_OneDReader::RecordPattern(CBC_CommonBitArray* row,
+                                   int32_t start,
+                                   CFX_Int32Array* counters,
+                                   int32_t& e) {
+  int32_t numCounters = counters->GetSize();
+  for (int32_t i = 0; i < numCounters; i++) {
+    (*counters)[i] = 0;
+  }
+  int32_t end = row->GetSize();
+  if (start >= end) {
+    e = BCExceptionNotFound;
+    return;
+  }
+  FX_BOOL isWhite = !row->Get(start);
+  int32_t counterPosition = 0;
+  int32_t j = start;
+  while (j < end) {
+    FX_BOOL pixel = row->Get(j);
+    if (pixel ^ isWhite) {
+      (*counters)[counterPosition]++;
+    } else {
+      counterPosition++;
+      if (counterPosition == numCounters) {
+        break;
+      } else {
+        (*counters)[counterPosition] = 1;
+        isWhite = !isWhite;
+      }
+    }
+    j++;
+  }
+  if (!(counterPosition == numCounters ||
+        (counterPosition == numCounters - 1 && j == end))) {
+    e = BCExceptionNotFound;
+    return;
+  }
+}
+void CBC_OneDReader::RecordPatternInReverse(CBC_CommonBitArray* row,
+                                            int32_t start,
+                                            CFX_Int32Array* counters,
+                                            int32_t& e) {
+  int32_t numTransitionsLeft = counters->GetSize();
+  FX_BOOL last = row->Get(start);
+  while (start > 0 && numTransitionsLeft >= 0) {
+    if (row->Get(--start) != last) {
+      numTransitionsLeft--;
+      last = !last;
+    }
+  }
+  if (numTransitionsLeft >= 0) {
+    e = BCExceptionNotFound;
+    return;
+  }
+  RecordPattern(row, start + 1, counters, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+int32_t CBC_OneDReader::PatternMatchVariance(CFX_Int32Array* counters,
+                                             const int32_t* pattern,
+                                             int32_t maxIndividualVariance) {
+  int32_t numCounters = counters->GetSize();
+  int32_t total = 0;
+  int32_t patternLength = 0;
+  for (int32_t i = 0; i < numCounters; i++) {
+    total += (*counters)[i];
+    patternLength += pattern[i];
+  }
+  if (total < patternLength) {
+#undef max
+    return FXSYS_IntMax;
+  }
+  int32_t unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength;
+  maxIndividualVariance =
+      (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT;
+  int32_t totalVariance = 0;
+  for (int32_t x = 0; x < numCounters; x++) {
+    int32_t counter = (*counters)[x] << INTEGER_MATH_SHIFT;
+    int32_t scaledPattern = pattern[x] * unitBarWidth;
+    int32_t variance = counter > scaledPattern ? counter - scaledPattern
+                                               : scaledPattern - counter;
+    if (variance > maxIndividualVariance) {
+#undef max
+      return FXSYS_IntMax;
+    }
+    totalVariance += variance;
+  }
+  return totalVariance / total;
+}
diff --git a/xfa/fxbarcode/oned/BC_OneDReader.h b/xfa/fxbarcode/oned/BC_OneDReader.h
new file mode 100644
index 0000000..2bab06e
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDReader.h
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDREADER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDREADER_H_
+
+#include "xfa/fxbarcode/BC_Reader.h"
+
+class CBC_BinaryBitmap;
+class CBC_CommonBitArray;
+
+class CBC_OneDReader : public CBC_Reader {
+ public:
+  CBC_OneDReader();
+  virtual ~CBC_OneDReader();
+  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
+  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image,
+                                int32_t hints,
+                                int32_t& e);
+  virtual CFX_ByteString DecodeRow(int32_t rowNumber,
+                                   CBC_CommonBitArray* row,
+                                   int32_t hints,
+                                   int32_t& e) {
+    return "";
+  }
+
+ private:
+  CFX_ByteString DeDecode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
+
+ protected:
+  static const int32_t INTEGER_MATH_SHIFT = 8;
+  static const int32_t PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << 8;
+
+  void RecordPattern(CBC_CommonBitArray* row,
+                     int32_t start,
+                     CFX_Int32Array* counters,
+                     int32_t& e);
+  void RecordPatternInReverse(CBC_CommonBitArray* row,
+                              int32_t start,
+                              CFX_Int32Array* counters,
+                              int32_t& e);
+  int32_t PatternMatchVariance(CFX_Int32Array* counters,
+                               const int32_t* pattern,
+                               int32_t maxIndividualVariance);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDREADER_H_
diff --git a/xfa/fxbarcode/oned/BC_OneDimReader.cpp b/xfa/fxbarcode/oned/BC_OneDimReader.cpp
new file mode 100644
index 0000000..5187c34
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDimReader.cpp
@@ -0,0 +1,219 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_OneDimReader::START_END_PATTERN[3] = {1, 1, 1};
+const int32_t CBC_OneDimReader::MIDDLE_PATTERN[5] = {1, 1, 1, 1, 1};
+const int32_t CBC_OneDimReader::L_PATTERNS[10][4] = {
+    {3, 2, 1, 1}, {2, 2, 2, 1}, {2, 1, 2, 2}, {1, 4, 1, 1}, {1, 1, 3, 2},
+    {1, 2, 3, 1}, {1, 1, 1, 4}, {1, 3, 1, 2}, {1, 2, 1, 3}, {3, 1, 1, 2}};
+const int32_t CBC_OneDimReader::L_AND_G_PATTERNS[20][4] = {
+    {3, 2, 1, 1}, {2, 2, 2, 1}, {2, 1, 2, 2}, {1, 4, 1, 1}, {1, 1, 3, 2},
+    {1, 2, 3, 1}, {1, 1, 1, 4}, {1, 3, 1, 2}, {1, 2, 1, 3}, {3, 1, 1, 2},
+    {1, 1, 2, 3}, {1, 2, 2, 2}, {2, 2, 1, 2}, {1, 1, 4, 1}, {2, 3, 1, 1},
+    {1, 3, 2, 1}, {4, 1, 1, 1}, {2, 1, 3, 1}, {3, 1, 2, 1}, {2, 1, 1, 3}};
+
+CBC_OneDimReader::CBC_OneDimReader() {}
+CBC_OneDimReader::~CBC_OneDimReader() {}
+CFX_Int32Array* CBC_OneDimReader::FindStartGuardPattern(CBC_CommonBitArray* row,
+                                                        int32_t& e) {
+  FX_BOOL foundStart = FALSE;
+  CFX_Int32Array* startRange = NULL;
+  CFX_Int32Array startEndPattern;
+  startEndPattern.SetSize(3);
+  startEndPattern[0] = START_END_PATTERN[0];
+  startEndPattern[1] = START_END_PATTERN[1];
+  startEndPattern[2] = START_END_PATTERN[2];
+  int32_t nextStart = 0;
+  while (!foundStart) {
+    delete startRange;
+    startRange = FindGuardPattern(row, nextStart, FALSE, &startEndPattern, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    int32_t start = (*startRange)[0];
+    nextStart = (*startRange)[1];
+    if (start <= 1) {
+      break;
+    }
+    int32_t quietStart = start - (nextStart - start);
+    if (quietStart >= 0) {
+      FX_BOOL booT = row->IsRange(quietStart, start, FALSE, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      foundStart = booT;
+    }
+  }
+  return startRange;
+}
+CFX_ByteString CBC_OneDimReader::DecodeRow(int32_t rowNumber,
+                                           CBC_CommonBitArray* row,
+                                           int32_t hints,
+                                           int32_t& e) {
+  std::unique_ptr<CFX_Int32Array> result(FindStartGuardPattern(row, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CFX_ByteString temp = DecodeRow(rowNumber, row, result.get(), hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return temp;
+}
+CFX_ByteString CBC_OneDimReader::DecodeRow(int32_t rowNumber,
+                                           CBC_CommonBitArray* row,
+                                           CFX_Int32Array* startGuardRange,
+                                           int32_t hints,
+                                           int32_t& e) {
+  CFX_ByteString result;
+  DecodeMiddle(row, startGuardRange, result, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  FX_BOOL b = CheckChecksum(result, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  if (!b) {
+    e = BCExceptionChecksumException;
+    return "";
+  }
+  return result;
+}
+FX_BOOL CBC_OneDimReader::CheckChecksum(CFX_ByteString& s, int32_t& e) {
+  FX_BOOL temp = CheckStandardUPCEANChecksum(s, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return temp;
+}
+FX_BOOL CBC_OneDimReader::CheckStandardUPCEANChecksum(CFX_ByteString& s,
+                                                      int32_t& e) {
+  int32_t length = s.GetLength();
+  if (length == 0) {
+    return FALSE;
+  }
+  int32_t sum = 0;
+  for (int32_t i = length - 2; i >= 0; i -= 2) {
+    int32_t digit = (int32_t)s[i] - (int32_t)'0';
+    if (digit < 0 || digit > 9) {
+      e = BCExceptionFormatException;
+      return FALSE;
+    }
+    sum += digit;
+  }
+  sum *= 3;
+  for (int32_t j = length - 1; j >= 0; j -= 2) {
+    int32_t digit = (int32_t)s[j] - (int32_t)'0';
+    if (digit < 0 || digit > 9) {
+      e = BCExceptionFormatException;
+      return FALSE;
+    }
+    sum += digit;
+  }
+  return sum % 10 == 0;
+}
+CFX_Int32Array* CBC_OneDimReader::DecodeEnd(CBC_CommonBitArray* row,
+                                            int32_t endStart,
+                                            int32_t& e) {
+  CFX_Int32Array startEndPattern;
+  startEndPattern.Add(START_END_PATTERN[0]);
+  startEndPattern.Add(START_END_PATTERN[1]);
+  startEndPattern.Add(START_END_PATTERN[2]);
+  CFX_Int32Array* FindGuard =
+      FindGuardPattern(row, endStart, FALSE, &startEndPattern, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return FindGuard;
+}
+CFX_Int32Array* CBC_OneDimReader::FindGuardPattern(CBC_CommonBitArray* row,
+                                                   int32_t rowOffset,
+                                                   FX_BOOL whiteFirst,
+                                                   CFX_Int32Array* pattern,
+                                                   int32_t& e) {
+  int32_t patternLength = pattern->GetSize();
+  CFX_Int32Array counters;
+  counters.SetSize(patternLength);
+  int32_t width = row->GetSize();
+  FX_BOOL isWhite = FALSE;
+  while (rowOffset < width) {
+    isWhite = !row->Get(rowOffset);
+    if (whiteFirst == isWhite) {
+      break;
+    }
+    rowOffset++;
+  }
+  int32_t counterPosition = 0;
+  int32_t patternStart = rowOffset;
+  for (int32_t x = rowOffset; x < width; x++) {
+    FX_BOOL pixel = row->Get(x);
+    if (pixel ^ isWhite) {
+      counters[counterPosition]++;
+    } else {
+      if (counterPosition == patternLength - 1) {
+        if (PatternMatchVariance(&counters, &(*pattern)[0],
+                                 MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
+          CFX_Int32Array* result = new CFX_Int32Array();
+          result->SetSize(2);
+          (*result)[0] = patternStart;
+          (*result)[1] = x;
+          return result;
+        }
+        patternStart += counters[0] + counters[1];
+        for (int32_t y = 2; y < patternLength; y++) {
+          counters[y - 2] = counters[y];
+        }
+        counters[patternLength - 2] = 0;
+        counters[patternLength - 1] = 0;
+        counterPosition--;
+      } else {
+        counterPosition++;
+      }
+      counters[counterPosition] = 1;
+      isWhite = !isWhite;
+    }
+  }
+  e = BCExceptionNotFound;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return NULL;
+}
+int32_t CBC_OneDimReader::DecodeDigit(CBC_CommonBitArray* row,
+                                      CFX_Int32Array* counters,
+                                      int32_t rowOffset,
+                                      const int32_t* patterns,
+                                      int32_t patternLength,
+                                      int32_t& e) {
+  RecordPattern(row, rowOffset, counters, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  int32_t bestVariance = MAX_AVG_VARIANCE;
+  int32_t bestMatch = -1;
+  int32_t max = patternLength;
+  for (int32_t i = 0; i < max; i++) {
+    int32_t variance = PatternMatchVariance(counters, &patterns[i * 4],
+                                            MAX_INDIVIDUAL_VARIANCE);
+    if (variance < bestVariance) {
+      bestVariance = variance;
+      bestMatch = i;
+    }
+  }
+  if (bestMatch >= 0) {
+    return bestMatch;
+  } else {
+    e = BCExceptionNotFound;
+    return 0;
+  }
+  return 0;
+}
diff --git a/xfa/fxbarcode/oned/BC_OneDimReader.h b/xfa/fxbarcode/oned/BC_OneDimReader.h
new file mode 100644
index 0000000..cc84ffd
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDimReader.h
@@ -0,0 +1,66 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDIMREADER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDIMREADER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+
+class CBC_CommonBitArray;
+
+class CBC_OneDimReader : public CBC_OneDReader {
+ private:
+  static const int32_t MAX_AVG_VARIANCE = (int32_t)(256 * 0.48f);
+  static const int32_t MAX_INDIVIDUAL_VARIANCE = (int32_t)(256 * 0.7f);
+
+  FX_BOOL CheckStandardUPCEANChecksum(CFX_ByteString& s, int32_t& e);
+
+ public:
+  static const int32_t START_END_PATTERN[3];
+  static const int32_t MIDDLE_PATTERN[5];
+  static const int32_t L_PATTERNS[10][4];
+  static const int32_t L_AND_G_PATTERNS[20][4];
+
+  CBC_OneDimReader();
+  virtual ~CBC_OneDimReader();
+
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           int32_t hints,
+                           int32_t& e);
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           CFX_Int32Array* startGuardRange,
+                           int32_t hints,
+                           int32_t& e);
+
+ protected:
+  CFX_Int32Array* FindStartGuardPattern(CBC_CommonBitArray* row, int32_t& e);
+  virtual FX_BOOL CheckChecksum(CFX_ByteString& s, int32_t& e);
+  CFX_Int32Array* FindGuardPattern(CBC_CommonBitArray* row,
+                                   int32_t rowOffset,
+                                   FX_BOOL whiteFirst,
+                                   CFX_Int32Array* pattern,
+                                   int32_t& e);
+  int32_t DecodeDigit(CBC_CommonBitArray* row,
+                      CFX_Int32Array* counters,
+                      int32_t rowOffset,
+                      const int32_t* patterns,
+                      int32_t patternLength,
+                      int32_t& e);
+  virtual int32_t DecodeMiddle(CBC_CommonBitArray* row,
+                               CFX_Int32Array* startRange,
+                               CFX_ByteString& resultResult,
+                               int32_t& e) {
+    return 0;
+  }
+  virtual CFX_Int32Array* DecodeEnd(CBC_CommonBitArray* row,
+                                    int32_t endStart,
+                                    int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDIMREADER_H_
diff --git a/xfa/fxbarcode/oned/BC_OneDimWriter.cpp b/xfa/fxbarcode/oned/BC_OneDimWriter.cpp
new file mode 100644
index 0000000..62ca97f
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDimWriter.cpp
@@ -0,0 +1,437 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+
+CBC_OneDimWriter::CBC_OneDimWriter() {
+  m_locTextLoc = BC_TEXT_LOC_BELOWEMBED;
+  m_bPrintChecksum = TRUE;
+  m_iDataLenth = 0;
+  m_bCalcChecksum = FALSE;
+  m_pFont = NULL;
+  m_fFontSize = 10;
+  m_iFontStyle = 0;
+  m_fontColor = 0xff000000;
+  m_iContentLen = 0;
+  m_bLeftPadding = FALSE;
+  m_bRightPadding = FALSE;
+  m_output = NULL;
+}
+CBC_OneDimWriter::~CBC_OneDimWriter() {
+  delete m_output;
+}
+void CBC_OneDimWriter::SetPrintChecksum(FX_BOOL checksum) {
+  m_bPrintChecksum = checksum;
+}
+void CBC_OneDimWriter::SetDataLength(int32_t length) {
+  m_iDataLenth = length;
+}
+void CBC_OneDimWriter::SetCalcChecksum(int32_t state) {
+  m_bCalcChecksum = state;
+}
+FX_BOOL CBC_OneDimWriter::SetFont(CFX_Font* cFont) {
+  if (cFont == NULL) {
+    return FALSE;
+  }
+  m_pFont = cFont;
+  return TRUE;
+}
+void CBC_OneDimWriter::SetFontSize(FX_FLOAT size) {
+  m_fFontSize = size;
+}
+void CBC_OneDimWriter::SetFontStyle(int32_t style) {
+  m_iFontStyle = style;
+}
+void CBC_OneDimWriter::SetFontColor(FX_ARGB color) {
+  m_fontColor = color;
+}
+FX_WCHAR CBC_OneDimWriter::Upper(FX_WCHAR ch) {
+  if (ch >= 'a' && ch <= 'z') {
+    ch = ch - ('a' - 'A');
+  }
+  return ch;
+}
+uint8_t* CBC_OneDimWriter::Encode(const CFX_ByteString& contents,
+                                  BCFORMAT format,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t hints,
+                                  int32_t& e) {
+  uint8_t* ret = NULL;
+  outHeight = 1;
+  if (m_Width >= 20) {
+    ret = Encode(contents, outWidth, e);
+  } else {
+    ret = Encode(contents, outWidth, e);
+  }
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OneDimWriter::Encode(const CFX_ByteString& contents,
+                                  BCFORMAT format,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+int32_t CBC_OneDimWriter::AppendPattern(uint8_t* target,
+                                        int32_t pos,
+                                        const int32_t* pattern,
+                                        int32_t patternLength,
+                                        int32_t startColor,
+                                        int32_t& e) {
+  if (startColor != 0 && startColor != 1) {
+    e = BCExceptionValueMustBeEither0or1;
+    return 0;
+  }
+  uint8_t color = (uint8_t)startColor;
+  int32_t numAdded = 0;
+  for (int32_t i = 0; i < patternLength; i++) {
+    for (int32_t j = 0; j < pattern[i]; j++) {
+      target[pos] = color;
+      pos += 1;
+      numAdded += 1;
+    }
+    color ^= 1;
+  }
+  return numAdded;
+}
+void CBC_OneDimWriter::CalcTextInfo(const CFX_ByteString& text,
+                                    FXTEXT_CHARPOS* charPos,
+                                    CFX_Font* cFont,
+                                    FX_FLOAT geWidth,
+                                    int32_t fontSize,
+                                    FX_FLOAT& charsLen) {
+  std::unique_ptr<CFX_UnicodeEncodingEx> encoding(
+      FX_CreateFontEncodingEx(cFont));
+
+  int32_t length = text.GetLength();
+  FX_DWORD* pCharCode = FX_Alloc(FX_DWORD, text.GetLength());
+  FX_FLOAT charWidth = 0;
+  for (int32_t j = 0; j < text.GetLength(); j++) {
+    pCharCode[j] = encoding->CharCodeFromUnicode(text[j]);
+    int32_t glyp_code = encoding->GlyphFromCharCode(pCharCode[j]);
+    int32_t glyp_value = cFont->GetGlyphWidth(glyp_code);
+    FX_FLOAT temp = (FX_FLOAT)((glyp_value)*fontSize / 1000.0);
+    charWidth += temp;
+  }
+  charsLen = charWidth;
+  FX_FLOAT leftPositon = (FX_FLOAT)(geWidth - charsLen) / 2.0f;
+  if (leftPositon < 0 && geWidth == 0) {
+    leftPositon = 0;
+  }
+  FX_FLOAT penX = 0.0;
+  FX_FLOAT penY =
+      (FX_FLOAT)FXSYS_abs(cFont->GetDescent()) * (FX_FLOAT)fontSize / 1000.0f;
+  FX_FLOAT left = leftPositon;
+  FX_FLOAT top = 0.0;
+  charPos[0].m_OriginX = penX + left;
+  charPos[0].m_OriginY = penY + top;
+  charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[0]);
+  charPos[0].m_FontCharWidth = cFont->GetGlyphWidth(charPos[0].m_GlyphIndex);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+  charPos[0].m_ExtGID = charPos[0].m_GlyphIndex;
+#endif
+  penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f;
+  for (int32_t i = 1; i < length; i++) {
+    charPos[i].m_OriginX = penX + left;
+    charPos[i].m_OriginY = penY + top;
+    charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[i]);
+    charPos[i].m_FontCharWidth = cFont->GetGlyphWidth(charPos[i].m_GlyphIndex);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+    charPos[i].m_ExtGID = charPos[i].m_GlyphIndex;
+#endif
+    penX +=
+        (FX_FLOAT)(charPos[i].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f;
+  }
+  FX_Free(pCharCode);
+}
+void CBC_OneDimWriter::ShowDeviceChars(CFX_RenderDevice* device,
+                                       const CFX_Matrix* matrix,
+                                       const CFX_ByteString str,
+                                       FX_FLOAT geWidth,
+                                       FXTEXT_CHARPOS* pCharPos,
+                                       FX_FLOAT locX,
+                                       FX_FLOAT locY,
+                                       int32_t barWidth) {
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  CFX_FloatRect rect((FX_FLOAT)locX, (FX_FLOAT)locY, (FX_FLOAT)(locX + geWidth),
+                     (FX_FLOAT)(locY + iTextHeight));
+  if (geWidth != m_Width) {
+    rect.right -= 1;
+  }
+  matrix->TransformRect(rect);
+  FX_RECT re = rect.GetOutterRect();
+  device->FillRect(&re, m_backgroundColor);
+  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)locX,
+                           (FX_FLOAT)(locY + iFontSize));
+  if (matrix) {
+    affine_matrix.Concat(*matrix);
+  }
+  device->DrawNormalText(str.GetLength(), pCharPos, m_pFont,
+                         CFX_GEModule::Get()->GetFontCache(),
+                         (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix,
+                         m_fontColor, FXTEXT_CLEARTYPE);
+}
+void CBC_OneDimWriter::ShowBitmapChars(CFX_DIBitmap* pOutBitmap,
+                                       const CFX_ByteString str,
+                                       FX_FLOAT geWidth,
+                                       FXTEXT_CHARPOS* pCharPos,
+                                       FX_FLOAT locX,
+                                       FX_FLOAT locY,
+                                       int32_t barWidth) {
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  CFX_FxgeDevice ge;
+  ge.Create((int)geWidth, iTextHeight, m_colorSpace);
+  FX_RECT geRect(0, 0, (int)geWidth, iTextHeight);
+  ge.FillRect(&geRect, m_backgroundColor);
+  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
+  ge.DrawNormalText(str.GetLength(), pCharPos, m_pFont,
+                    CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                    (CFX_Matrix*)&affine_matrix, m_fontColor, FXTEXT_CLEARTYPE);
+  CFX_FxgeDevice geBitmap;
+  geBitmap.Attach(pOutBitmap);
+  geBitmap.SetDIBits(ge.GetBitmap(), (int)locX, (int)locY);
+}
+void CBC_OneDimWriter::ShowChars(const CFX_WideStringC& contents,
+                                 CFX_DIBitmap* pOutBitmap,
+                                 CFX_RenderDevice* device,
+                                 const CFX_Matrix* matrix,
+                                 int32_t barWidth,
+                                 int32_t multiple,
+                                 int32_t& e) {
+  if (device == NULL && pOutBitmap == NULL) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  if (m_pFont == NULL) {
+    e = BCExceptionNullPointer;
+    return;
+  }
+  CFX_ByteString str = FX_UTF8Encode(contents);
+  int32_t iLen = str.GetLength();
+  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
+  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
+  FX_FLOAT charsLen = 0;
+  FX_FLOAT geWidth = 0;
+  if (m_locTextLoc == BC_TEXT_LOC_ABOVEEMBED ||
+      m_locTextLoc == BC_TEXT_LOC_BELOWEMBED) {
+    geWidth = 0;
+  } else if (m_locTextLoc == BC_TEXT_LOC_ABOVE ||
+             m_locTextLoc == BC_TEXT_LOC_BELOW) {
+    geWidth = (FX_FLOAT)barWidth;
+  }
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  CalcTextInfo(str, pCharPos, m_pFont, geWidth, iFontSize, charsLen);
+  if (charsLen < 1) {
+    return;
+  }
+  int32_t locX = 0;
+  int32_t locY = 0;
+  switch (m_locTextLoc) {
+    case BC_TEXT_LOC_ABOVEEMBED:
+      locX = (int32_t)(barWidth - charsLen) / 2;
+      locY = 0;
+      geWidth = charsLen;
+      break;
+    case BC_TEXT_LOC_ABOVE:
+      locX = 0;
+      locY = 0;
+      geWidth = (FX_FLOAT)barWidth;
+      break;
+    case BC_TEXT_LOC_BELOWEMBED:
+      locX = (int32_t)(barWidth - charsLen) / 2;
+      locY = m_Height - iTextHeight;
+      geWidth = charsLen;
+      break;
+    case BC_TEXT_LOC_BELOW:
+    default:
+      locX = 0;
+      locY = m_Height - iTextHeight;
+      geWidth = (FX_FLOAT)barWidth;
+      break;
+  }
+  if (device) {
+    ShowDeviceChars(device, matrix, str, geWidth, pCharPos, (FX_FLOAT)locX,
+                    (FX_FLOAT)locY, barWidth);
+  } else {
+    ShowBitmapChars(pOutBitmap, str, geWidth, pCharPos, (FX_FLOAT)locX,
+                    (FX_FLOAT)locY, barWidth);
+  }
+  FX_Free(pCharPos);
+}
+void CBC_OneDimWriter::RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
+                                          const CFX_WideStringC& contents,
+                                          int32_t& e) {
+  if (m_output == NULL) {
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight());
+  pOutBitmap->Clear(m_backgroundColor);
+  if (!pOutBitmap) {
+    e = BCExceptionFailToCreateBitmap;
+    return;
+  }
+  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
+    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
+      if (m_output->Get(x, y)) {
+        pOutBitmap->SetPixel(x, y, m_barColor);
+      }
+    }
+  }
+  int32_t i = 0;
+  for (; i < contents.GetLength(); i++)
+    if (contents.GetAt(i) != ' ') {
+      break;
+    }
+  if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) {
+    ShowChars(contents, pOutBitmap, NULL, NULL, m_barWidth, m_multiple, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  CFX_DIBitmap* pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height);
+  if (pOutBitmap) {
+    delete pOutBitmap;
+  }
+  pOutBitmap = pStretchBitmap;
+}
+void CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device,
+                                          const CFX_Matrix* matrix,
+                                          const CFX_WideStringC& contents,
+                                          int32_t& e) {
+  if (m_output == NULL) {
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  CFX_GraphStateData stateData;
+  CFX_PathData path;
+  path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height);
+  device->DrawPath(&path, matrix, &stateData, m_backgroundColor,
+                   m_backgroundColor, FXFILL_ALTERNATE);
+  CFX_Matrix matri(m_outputHScale, 0.0, 0.0, (FX_FLOAT)m_Height, 0.0, 0.0);
+  matri.Concat(*matrix);
+  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
+    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
+      CFX_PathData rect;
+      rect.AppendRect((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)(x + 1),
+                      (FX_FLOAT)(y + 1));
+      CFX_GraphStateData stateData;
+      if (m_output->Get(x, y)) {
+        device->DrawPath(&rect, &matri, &stateData, m_barColor, 0,
+                         FXFILL_WINDING);
+      }
+    }
+  }
+  int32_t i = 0;
+  for (; i < contents.GetLength(); i++)
+    if (contents.GetAt(i) != ' ') {
+      break;
+    }
+  if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) {
+    ShowChars(contents, NULL, device, matrix, m_barWidth, m_multiple, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_OneDimWriter::RenderResult(const CFX_WideStringC& contents,
+                                    uint8_t* code,
+                                    int32_t codeLength,
+                                    FX_BOOL isDevice,
+                                    int32_t& e) {
+  if (codeLength < 1) {
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if (m_ModuleHeight < 20.0) {
+    m_ModuleHeight = 20;
+  }
+  int32_t codeOldLength = codeLength;
+  int32_t leftPadding = 0;
+  int32_t rightPadding = 0;
+  if (m_bLeftPadding) {
+    leftPadding = 7;
+  }
+  if (m_bRightPadding) {
+    rightPadding = 7;
+  }
+  codeLength += leftPadding;
+  codeLength += rightPadding;
+  m_outputHScale = 1.0;
+  if (m_Width > 0) {
+    m_outputHScale = (FX_FLOAT)m_Width / (FX_FLOAT)codeLength;
+  }
+  if (!isDevice) {
+    m_outputHScale =
+        std::max(m_outputHScale, static_cast<FX_FLOAT>(m_ModuleWidth));
+  }
+  FX_FLOAT dataLengthScale = 1.0;
+  if (m_iDataLenth > 0 && contents.GetLength() != 0) {
+    dataLengthScale = FX_FLOAT(contents.GetLength()) / FX_FLOAT(m_iDataLenth);
+  }
+  if (m_iDataLenth > 0 && contents.GetLength() == 0) {
+    dataLengthScale = FX_FLOAT(1) / FX_FLOAT(m_iDataLenth);
+  }
+  m_multiple = 1;
+  if (!isDevice) {
+    m_multiple = (int32_t)ceil(m_outputHScale * dataLengthScale);
+  }
+  int32_t outputHeight = 1;
+  if (!isDevice) {
+    if (m_Height == 0) {
+      outputHeight = std::max(20, m_ModuleHeight);
+    } else {
+      outputHeight = m_Height;
+    }
+  }
+  int32_t outputWidth = codeLength;
+  if (!isDevice) {
+    outputWidth = (int32_t)(codeLength * m_multiple / dataLengthScale);
+  }
+  m_barWidth = m_Width;
+  if (!isDevice) {
+    m_barWidth = codeLength * m_multiple;
+  }
+  m_output = new CBC_CommonBitMatrix;
+  m_output->Init(outputWidth, outputHeight);
+  int32_t outputX = leftPadding * m_multiple;
+  for (int32_t inputX = 0; inputX < codeOldLength; inputX++) {
+    if (code[inputX] == 1) {
+      if (outputX >= outputWidth) {
+        break;
+      }
+      if (outputX + m_multiple > outputWidth && outputWidth - outputX > 0) {
+        m_output->SetRegion(outputX, 0, outputWidth - outputX, outputHeight, e);
+        break;
+      }
+      m_output->SetRegion(outputX, 0, m_multiple, outputHeight, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    outputX += m_multiple;
+  }
+}
diff --git a/xfa/fxbarcode/oned/BC_OneDimWriter.h b/xfa/fxbarcode/oned/BC_OneDimWriter.h
new file mode 100644
index 0000000..e91a929
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OneDimWriter.h
@@ -0,0 +1,120 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
+
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/include/fxbarcode/BC_BarCode.h"
+
+class CBC_CommonBitMatrix;
+class CFX_Font;
+class CFX_RenderDevice;
+
+class CBC_OneDimWriter : public CBC_Writer {
+ public:
+  CBC_OneDimWriter();
+  virtual ~CBC_OneDimWriter();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  virtual uint8_t* Encode(const CFX_ByteString& contents,
+                          int32_t& outLength,
+                          int32_t& e) {
+    return NULL;
+  }
+  virtual void RenderResult(const CFX_WideStringC& contents,
+                            uint8_t* code,
+                            int32_t codeLength,
+                            FX_BOOL isDevice,
+                            int32_t& e);
+  virtual void RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
+                                  const CFX_WideStringC& contents,
+                                  int32_t& e);
+  virtual void RenderDeviceResult(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matrix,
+                                  const CFX_WideStringC& contents,
+                                  int32_t& e);
+  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents) {
+    return TRUE;
+  }
+  virtual CFX_WideString FilterContents(const CFX_WideStringC& contents) {
+    return CFX_WideString();
+  }
+  virtual CFX_WideString RenderTextContents(const CFX_WideStringC& contents) {
+    return CFX_WideString();
+  }
+  virtual void SetPrintChecksum(FX_BOOL checksum);
+  virtual void SetDataLength(int32_t length);
+  virtual void SetCalcChecksum(int32_t state);
+  virtual void SetFontSize(FX_FLOAT size);
+  virtual void SetFontStyle(int32_t style);
+  virtual void SetFontColor(FX_ARGB color);
+  virtual FX_BOOL SetFont(CFX_Font* cFont);
+
+ protected:
+  FX_BOOL m_bPrintChecksum;
+  int32_t m_iDataLenth;
+  FX_BOOL m_bCalcChecksum;
+  CFX_Font* m_pFont;
+  FX_FLOAT m_fFontSize;
+  int32_t m_iFontStyle;
+  FX_DWORD m_fontColor;
+  BC_TEXT_LOC m_locTextLoc;
+  int32_t m_iContentLen;
+  FX_BOOL m_bLeftPadding;
+  FX_BOOL m_bRightPadding;
+  CBC_CommonBitMatrix* m_output;
+  int32_t m_barWidth;
+  int32_t m_multiple;
+  FX_FLOAT m_outputHScale;
+  void CalcTextInfo(const CFX_ByteString& text,
+                    FXTEXT_CHARPOS* charPos,
+                    CFX_Font* cFont,
+                    FX_FLOAT geWidth,
+                    int32_t fontSize,
+                    FX_FLOAT& charsLen);
+  virtual void ShowChars(const CFX_WideStringC& contents,
+                         CFX_DIBitmap* pOutBitmap,
+                         CFX_RenderDevice* device,
+                         const CFX_Matrix* matrix,
+                         int32_t barWidth,
+                         int32_t multiple,
+                         int32_t& e);
+  virtual void ShowBitmapChars(CFX_DIBitmap* pOutBitmap,
+                               const CFX_ByteString str,
+                               FX_FLOAT geWidth,
+                               FXTEXT_CHARPOS* pCharPos,
+                               FX_FLOAT locX,
+                               FX_FLOAT locY,
+                               int32_t barWidth);
+  virtual void ShowDeviceChars(CFX_RenderDevice* device,
+                               const CFX_Matrix* matrix,
+                               const CFX_ByteString str,
+                               FX_FLOAT geWidth,
+                               FXTEXT_CHARPOS* pCharPos,
+                               FX_FLOAT locX,
+                               FX_FLOAT locY,
+                               int32_t barWidth);
+  int32_t AppendPattern(uint8_t* target,
+                        int32_t pos,
+                        const int32_t* pattern,
+                        int32_t patternLength,
+                        int32_t startColor,
+                        int32_t& e);
+  FX_WCHAR Upper(FX_WCHAR ch);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp b/xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp
new file mode 100644
index 0000000..27f2191
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp
@@ -0,0 +1,212 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
+#include "xfa/fxbarcode/utils.h"
+
+const FX_CHAR* CBC_OnedCodaBarReader::ALPHABET_STRING =
+    "0123456789-$:/.+ABCDTN";
+const int32_t CBC_OnedCodaBarReader::CHARACTER_ENCODINGS[22] = {
+    0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024,
+    0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015,
+    0x01A, 0x029, 0x00B, 0x00E, 0x01A, 0x029};
+const FX_CHAR CBC_OnedCodaBarReader::STARTEND_ENCODING[8] = {
+    'E', '*', 'A', 'B', 'C', 'D', 'T', 'N'};
+
+CBC_OnedCodaBarReader::CBC_OnedCodaBarReader() {}
+CBC_OnedCodaBarReader::~CBC_OnedCodaBarReader() {}
+CFX_ByteString CBC_OnedCodaBarReader::DecodeRow(int32_t rowNumber,
+                                                CBC_CommonBitArray* row,
+                                                int32_t hints,
+                                                int32_t& e) {
+  std::unique_ptr<CFX_Int32Array> start(FindAsteriskPattern(row, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  (*start)[1] = 0;
+  int32_t nextStart = (*start)[1];
+  int32_t end = row->GetSize();
+  while (nextStart < end && !row->Get(nextStart)) {
+    nextStart++;
+  }
+  CFX_ByteString result;
+  CFX_Int32Array counters;
+  counters.SetSize(7);
+  FX_CHAR decodedChar;
+  int32_t lastStart;
+  do {
+    RecordPattern(row, nextStart, &counters, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, "");
+    decodedChar = ToNarrowWidePattern(&counters);
+    if (decodedChar == '!') {
+      e = BCExceptionNotFound;
+      return "";
+    }
+    result += decodedChar;
+    lastStart = nextStart;
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      nextStart += counters[i];
+    }
+    while (nextStart < end && !row->Get(nextStart)) {
+      nextStart++;
+    }
+  } while (nextStart < end);
+  int32_t lastPatternSize = 0;
+  for (int32_t j = 0; j < counters.GetSize(); j++) {
+    lastPatternSize += counters[j];
+  }
+  int32_t whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
+  if (nextStart != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  if (result.GetLength() < 2) {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  FX_CHAR startchar = result[0];
+  if (!ArrayContains(STARTEND_ENCODING, startchar)) {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  int32_t len = result.GetLength();
+  CFX_ByteString temp = result;
+  for (int32_t k = 1; k < result.GetLength(); k++) {
+    if (ArrayContains(STARTEND_ENCODING, result[k])) {
+      if ((k + 1) != result.GetLength()) {
+        result.Delete(1, k);
+        k = 1;
+      }
+    }
+  }
+  if (result.GetLength() < 5) {
+    int32_t index = temp.Find(result.Mid(1, result.GetLength() - 1));
+    if (index == len - (result.GetLength() - 1)) {
+      e = BCExceptionNotFound;
+      return "";
+    }
+  }
+  if (result.GetLength() > minCharacterLength) {
+    result = result.Mid(1, result.GetLength() - 2);
+  } else {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  return result;
+}
+CFX_Int32Array* CBC_OnedCodaBarReader::FindAsteriskPattern(
+    CBC_CommonBitArray* row,
+    int32_t& e) {
+  int32_t width = row->GetSize();
+  int32_t rowOffset = 0;
+  while (rowOffset < width) {
+    if (row->Get(rowOffset)) {
+      break;
+    }
+    rowOffset++;
+  }
+  int32_t counterPosition = 0;
+  CFX_Int32Array counters;
+  counters.SetSize(7);
+  int32_t patternStart = rowOffset;
+  FX_BOOL isWhite = FALSE;
+  int32_t patternLength = counters.GetSize();
+  for (int32_t i = rowOffset; i < width; i++) {
+    FX_BOOL pixel = row->Get(i);
+    if (pixel ^ isWhite) {
+      counters[counterPosition]++;
+    } else {
+      if (counterPosition == patternLength - 1) {
+        if (ArrayContains(STARTEND_ENCODING, ToNarrowWidePattern(&counters))) {
+          FX_BOOL btemp3 =
+              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
+                           patternStart, FALSE, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          if (btemp3) {
+            CFX_Int32Array* result = new CFX_Int32Array();
+            result->SetSize(2);
+            (*result)[0] = patternStart;
+            (*result)[1] = i;
+            return result;
+          }
+        }
+        patternStart += counters[0] + counters[1];
+        for (int32_t y = 2; y < patternLength; y++) {
+          counters[y - 2] = counters[y];
+        }
+        counters[patternLength - 2] = 0;
+        counters[patternLength - 1] = 0;
+        counterPosition--;
+      } else {
+        counterPosition++;
+      }
+      counters[counterPosition] = 1;
+      isWhite = !isWhite;
+    }
+  }
+  e = BCExceptionNotFound;
+  return NULL;
+}
+FX_BOOL CBC_OnedCodaBarReader::ArrayContains(const FX_CHAR array[],
+                                             FX_CHAR key) {
+  for (int32_t i = 0; i < 8; i++) {
+    if (array[i] == key) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_CHAR CBC_OnedCodaBarReader::ToNarrowWidePattern(CFX_Int32Array* counter) {
+  int32_t numCounters = counter->GetSize();
+  if (numCounters < 1) {
+    return '!';
+  }
+  int32_t averageCounter = 0;
+  int32_t totalCounters = 0;
+  for (int32_t i = 0; i < numCounters; i++) {
+    totalCounters += (*counter)[i];
+  }
+  averageCounter = totalCounters / numCounters;
+  int32_t pattern = 0;
+  int32_t wideCounters = 0;
+  for (int32_t j = 0; j < numCounters; j++) {
+    if ((*counter)[j] > averageCounter) {
+      pattern |= 1 << (numCounters - 1 - j);
+      wideCounters++;
+    }
+  }
+  if ((wideCounters == 2) || (wideCounters == 3)) {
+    for (int32_t k = 0; k < 22; k++) {
+      if (CHARACTER_ENCODINGS[k] == pattern) {
+        return (ALPHABET_STRING)[k];
+      }
+    }
+  }
+  return '!';
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCodaBarReader.h b/xfa/fxbarcode/oned/BC_OnedCodaBarReader.h
new file mode 100644
index 0000000..678795d
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCodaBarReader.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+
+class CBC_CommonBitArray;
+class CBC_OneDReader;
+
+class CBC_OnedCodaBarReader : public CBC_OneDReader {
+ public:
+  CBC_OnedCodaBarReader();
+  virtual ~CBC_OnedCodaBarReader();
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           int32_t hints,
+                           int32_t& e);
+  CFX_Int32Array* FindAsteriskPattern(CBC_CommonBitArray* row, int32_t& e);
+  FX_BOOL ArrayContains(const FX_CHAR array[], FX_CHAR key);
+  FX_CHAR ToNarrowWidePattern(CFX_Int32Array* counter);
+
+  static const FX_CHAR* ALPHABET_STRING;
+  static const int32_t CHARACTER_ENCODINGS[22];
+
+ private:
+  static const int32_t minCharacterLength = 3;
+  static const FX_CHAR STARTEND_ENCODING[8];
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
new file mode 100644
index 0000000..81f0339
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
@@ -0,0 +1,231 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h"
+
+const FX_CHAR CBC_OnedCodaBarWriter::START_END_CHARS[] = {
+    'A', 'B', 'C', 'D', 'T', 'N', '*', 'E', 'a', 'b', 'c', 'd', 't', 'n', 'e'};
+const FX_CHAR CBC_OnedCodaBarWriter::CONTENT_CHARS[] = {
+    '0', '1', '2', '3', '4', '5', '6', '7',
+    '8', '9', '-', '$', '/', ':', '+', '.'};
+
+CBC_OnedCodaBarWriter::CBC_OnedCodaBarWriter() {
+  m_chStart = 'A';
+  m_chEnd = 'B';
+  m_iWideNarrRatio = 2;
+}
+CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() {}
+FX_BOOL CBC_OnedCodaBarWriter::SetStartChar(FX_CHAR start) {
+  for (size_t i = 0; i < FX_ArraySize(START_END_CHARS); ++i) {
+    if (START_END_CHARS[i] == start) {
+      m_chStart = start;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+FX_BOOL CBC_OnedCodaBarWriter::SetEndChar(FX_CHAR end) {
+  for (size_t i = 0; i < FX_ArraySize(START_END_CHARS); ++i) {
+    if (START_END_CHARS[i] == end) {
+      m_chEnd = end;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CBC_OnedCodaBarWriter::SetDataLength(int32_t length) {
+  m_iDataLenth = length + 2;
+}
+FX_BOOL CBC_OnedCodaBarWriter::SetTextLocation(BC_TEXT_LOC location) {
+  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
+    return FALSE;
+  }
+  m_locTextLoc = location;
+  return TRUE;
+}
+FX_BOOL CBC_OnedCodaBarWriter::SetWideNarrowRatio(int32_t ratio) {
+  if (ratio < 2 || ratio > 3) {
+    return FALSE;
+  }
+  m_iWideNarrRatio = ratio;
+  return TRUE;
+}
+FX_BOOL CBC_OnedCodaBarWriter::FindChar(FX_WCHAR ch, FX_BOOL isContent) {
+  if (isContent) {
+    for (size_t i = 0; i < FX_ArraySize(CONTENT_CHARS); ++i) {
+      if (ch == (FX_WCHAR)CONTENT_CHARS[i]) {
+        return TRUE;
+      }
+    }
+    for (size_t j = 0; j < FX_ArraySize(START_END_CHARS); ++j) {
+      if (ch == (FX_WCHAR)START_END_CHARS[j]) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  } else {
+    for (size_t i = 0; i < FX_ArraySize(CONTENT_CHARS); ++i) {
+      if (ch == (FX_WCHAR)CONTENT_CHARS[i]) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+}
+FX_BOOL CBC_OnedCodaBarWriter::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  FX_WCHAR ch;
+  int32_t index = 0;
+  for (index = 0; index < contents.GetLength(); index++) {
+    ch = contents.GetAt(index);
+    if (FindChar(ch, FALSE)) {
+      continue;
+    } else {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+CFX_WideString CBC_OnedCodaBarWriter::FilterContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filtercontents;
+  FX_WCHAR ch;
+  for (int32_t index = 0; index < contents.GetLength(); index++) {
+    ch = contents.GetAt(index);
+    if (ch > 175) {
+      index++;
+      continue;
+    }
+    if (FindChar(ch, TRUE)) {
+      filtercontents += ch;
+    } else {
+      continue;
+    }
+  }
+  return filtercontents;
+}
+uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
+                                       BCFORMAT format,
+                                       int32_t& outWidth,
+                                       int32_t& outHeight,
+                                       int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
+                                       BCFORMAT format,
+                                       int32_t& outWidth,
+                                       int32_t& outHeight,
+                                       int32_t hints,
+                                       int32_t& e) {
+  if (format != BCFORMAT_CODABAR) {
+    e = BCExceptionOnlyEncodeCODEBAR;
+    return NULL;
+  }
+  uint8_t* ret =
+      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
+                                       int32_t& outLength,
+                                       int32_t& e) {
+  CBC_OnedCodaBarReader CodaBarR;
+  CFX_ByteString data = m_chStart + contents + m_chEnd;
+  m_iContentLen = data.GetLength();
+  uint8_t* result = FX_Alloc2D(uint8_t, m_iWideNarrRatio * 7, data.GetLength());
+  FX_CHAR ch;
+  int32_t position = 0;
+  for (int32_t index = 0; index < data.GetLength(); index++) {
+    ch = data.GetAt(index);
+    if (((ch >= 'a') && (ch <= 'z'))) {
+      ch = ch - 32;
+    }
+    switch (ch) {
+      case 'T':
+        ch = 'A';
+        break;
+      case 'N':
+        ch = 'B';
+        break;
+      case '*':
+        ch = 'C';
+        break;
+      case 'E':
+        ch = 'D';
+        break;
+      default:
+        break;
+    }
+    int32_t code = 0;
+    int32_t len = (int32_t)strlen(CodaBarR.ALPHABET_STRING);
+    for (int32_t i = 0; i < len; i++) {
+      if (ch == CodaBarR.ALPHABET_STRING[i]) {
+        code = CodaBarR.CHARACTER_ENCODINGS[i];
+        break;
+      }
+    }
+    uint8_t color = 1;
+    int32_t counter = 0;
+    int32_t bit = 0;
+    while (bit < 7) {
+      result[position] = color;
+      position++;
+      if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) {
+        color = !color;
+        bit++;
+        counter = 0;
+      } else {
+        counter++;
+      }
+    }
+    if (index < data.GetLength() - 1) {
+      result[position] = 0;
+      position++;
+    }
+  }
+  outLength = position;
+  return result;
+}
+CFX_WideString CBC_OnedCodaBarWriter::encodedContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString strStart(m_chStart);
+  CFX_WideString strEnd(m_chEnd);
+  return strStart + contents + strEnd;
+}
+void CBC_OnedCodaBarWriter::RenderResult(const CFX_WideStringC& contents,
+                                         uint8_t* code,
+                                         int32_t codeLength,
+                                         FX_BOOL isDevice,
+                                         int32_t& e) {
+  CBC_OneDimWriter::RenderResult(encodedContents(contents), code, codeLength,
+                                 isDevice, e);
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h
new file mode 100644
index 0000000..92a31bd
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
+
+enum BC_TEXT_LOC;
+class CBC_OneDimWriter;
+class CBC_OnedCodaBarWriter;
+class CBC_OnedCodaBarWriter : public CBC_OneDimWriter {
+ public:
+  CBC_OnedCodaBarWriter();
+  virtual ~CBC_OnedCodaBarWriter();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  CFX_WideString encodedContents(const CFX_WideStringC& contents);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  FX_BOOL SetStartChar(FX_CHAR start);
+  FX_BOOL SetEndChar(FX_CHAR end);
+  void SetDataLength(int32_t length);
+  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  FX_BOOL SetWideNarrowRatio(int32_t ratio);
+  FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent);
+
+ private:
+  void RenderResult(const CFX_WideStringC& contents,
+                    uint8_t* code,
+                    int32_t codeLength,
+                    FX_BOOL isDevice,
+                    int32_t& e);
+  static const FX_CHAR START_END_CHARS[];
+  static const FX_CHAR CONTENT_CHARS[];
+  FX_CHAR m_chStart;
+  FX_CHAR m_chEnd;
+  int32_t m_iWideNarrRatio;
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp b/xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp
new file mode 100644
index 0000000..b5f5aa5
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp
@@ -0,0 +1,351 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_OnedCode128Reader::CODE_PATTERNS[107][7] = {
+    {2, 1, 2, 2, 2, 2, 0}, {2, 2, 2, 1, 2, 2, 0}, {2, 2, 2, 2, 2, 1, 0},
+    {1, 2, 1, 2, 2, 3, 0}, {1, 2, 1, 3, 2, 2, 0}, {1, 3, 1, 2, 2, 2, 0},
+    {1, 2, 2, 2, 1, 3, 0}, {1, 2, 2, 3, 1, 2, 0}, {1, 3, 2, 2, 1, 2, 0},
+    {2, 2, 1, 2, 1, 3, 0}, {2, 2, 1, 3, 1, 2, 0}, {2, 3, 1, 2, 1, 2, 0},
+    {1, 1, 2, 2, 3, 2, 0}, {1, 2, 2, 1, 3, 2, 0}, {1, 2, 2, 2, 3, 1, 0},
+    {1, 1, 3, 2, 2, 2, 0}, {1, 2, 3, 1, 2, 2, 0}, {1, 2, 3, 2, 2, 1, 0},
+    {2, 2, 3, 2, 1, 1, 0}, {2, 2, 1, 1, 3, 2, 0}, {2, 2, 1, 2, 3, 1, 0},
+    {2, 1, 3, 2, 1, 2, 0}, {2, 2, 3, 1, 1, 2, 0}, {3, 1, 2, 1, 3, 1, 0},
+    {3, 1, 1, 2, 2, 2, 0}, {3, 2, 1, 1, 2, 2, 0}, {3, 2, 1, 2, 2, 1, 0},
+    {3, 1, 2, 2, 1, 2, 0}, {3, 2, 2, 1, 1, 2, 0}, {3, 2, 2, 2, 1, 1, 0},
+    {2, 1, 2, 1, 2, 3, 0}, {2, 1, 2, 3, 2, 1, 0}, {2, 3, 2, 1, 2, 1, 0},
+    {1, 1, 1, 3, 2, 3, 0}, {1, 3, 1, 1, 2, 3, 0}, {1, 3, 1, 3, 2, 1, 0},
+    {1, 1, 2, 3, 1, 3, 0}, {1, 3, 2, 1, 1, 3, 0}, {1, 3, 2, 3, 1, 1, 0},
+    {2, 1, 1, 3, 1, 3, 0}, {2, 3, 1, 1, 1, 3, 0}, {2, 3, 1, 3, 1, 1, 0},
+    {1, 1, 2, 1, 3, 3, 0}, {1, 1, 2, 3, 3, 1, 0}, {1, 3, 2, 1, 3, 1, 0},
+    {1, 1, 3, 1, 2, 3, 0}, {1, 1, 3, 3, 2, 1, 0}, {1, 3, 3, 1, 2, 1, 0},
+    {3, 1, 3, 1, 2, 1, 0}, {2, 1, 1, 3, 3, 1, 0}, {2, 3, 1, 1, 3, 1, 0},
+    {2, 1, 3, 1, 1, 3, 0}, {2, 1, 3, 3, 1, 1, 0}, {2, 1, 3, 1, 3, 1, 0},
+    {3, 1, 1, 1, 2, 3, 0}, {3, 1, 1, 3, 2, 1, 0}, {3, 3, 1, 1, 2, 1, 0},
+    {3, 1, 2, 1, 1, 3, 0}, {3, 1, 2, 3, 1, 1, 0}, {3, 3, 2, 1, 1, 1, 0},
+    {3, 1, 4, 1, 1, 1, 0}, {2, 2, 1, 4, 1, 1, 0}, {4, 3, 1, 1, 1, 1, 0},
+    {1, 1, 1, 2, 2, 4, 0}, {1, 1, 1, 4, 2, 2, 0}, {1, 2, 1, 1, 2, 4, 0},
+    {1, 2, 1, 4, 2, 1, 0}, {1, 4, 1, 1, 2, 2, 0}, {1, 4, 1, 2, 2, 1, 0},
+    {1, 1, 2, 2, 1, 4, 0}, {1, 1, 2, 4, 1, 2, 0}, {1, 2, 2, 1, 1, 4, 0},
+    {1, 2, 2, 4, 1, 1, 0}, {1, 4, 2, 1, 1, 2, 0}, {1, 4, 2, 2, 1, 1, 0},
+    {2, 4, 1, 2, 1, 1, 0}, {2, 2, 1, 1, 1, 4, 0}, {4, 1, 3, 1, 1, 1, 0},
+    {2, 4, 1, 1, 1, 2, 0}, {1, 3, 4, 1, 1, 1, 0}, {1, 1, 1, 2, 4, 2, 0},
+    {1, 2, 1, 1, 4, 2, 0}, {1, 2, 1, 2, 4, 1, 0}, {1, 1, 4, 2, 1, 2, 0},
+    {1, 2, 4, 1, 1, 2, 0}, {1, 2, 4, 2, 1, 1, 0}, {4, 1, 1, 2, 1, 2, 0},
+    {4, 2, 1, 1, 1, 2, 0}, {4, 2, 1, 2, 1, 1, 0}, {2, 1, 2, 1, 4, 1, 0},
+    {2, 1, 4, 1, 2, 1, 0}, {4, 1, 2, 1, 2, 1, 0}, {1, 1, 1, 1, 4, 3, 0},
+    {1, 1, 1, 3, 4, 1, 0}, {1, 3, 1, 1, 4, 1, 0}, {1, 1, 4, 1, 1, 3, 0},
+    {1, 1, 4, 3, 1, 1, 0}, {4, 1, 1, 1, 1, 3, 0}, {4, 1, 1, 3, 1, 1, 0},
+    {1, 1, 3, 1, 4, 1, 0}, {1, 1, 4, 1, 3, 1, 0}, {3, 1, 1, 1, 4, 1, 0},
+    {4, 1, 1, 1, 3, 1, 0}, {2, 1, 1, 4, 1, 2, 0}, {2, 1, 1, 2, 1, 4, 0},
+    {2, 1, 1, 2, 3, 2, 0}, {2, 3, 3, 1, 1, 1, 2}};
+
+CBC_OnedCode128Reader::CBC_OnedCode128Reader() {}
+CBC_OnedCode128Reader::~CBC_OnedCode128Reader() {}
+CFX_Int32Array* CBC_OnedCode128Reader::FindStartPattern(CBC_CommonBitArray* row,
+                                                        int32_t& e) {
+  int32_t width = row->GetSize();
+  int32_t rowOffset = 0;
+  while (rowOffset < width) {
+    if (row->Get(rowOffset)) {
+      break;
+    }
+    rowOffset++;
+  }
+  int32_t counterPosition = 0;
+  CFX_Int32Array counters;
+  counters.SetSize(6);
+  int32_t patternStart = rowOffset;
+  FX_BOOL isWhite = FALSE;
+  int32_t patternLength = counters.GetSize();
+  for (int32_t i = rowOffset; i < width; i++) {
+    FX_BOOL pixel = row->Get(i);
+    if (pixel ^ isWhite) {
+      counters[counterPosition]++;
+    } else {
+      if (counterPosition == patternLength - 1) {
+        int32_t bestVariance = MAX_AVG_VARIANCE;
+        int32_t bestMatch = -1;
+        for (int32_t startCode = CODE_START_A; startCode <= CODE_START_C;
+             startCode++) {
+          int32_t variance = PatternMatchVariance(
+              &counters, &CODE_PATTERNS[startCode][0], MAX_INDIVIDUAL_VARIANCE);
+          if (variance < bestVariance) {
+            bestVariance = variance;
+            bestMatch = startCode;
+          }
+        }
+        if (bestMatch >= 0) {
+          FX_BOOL btemp2 =
+              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
+                           patternStart, FALSE, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          if (btemp2) {
+            CFX_Int32Array* result = new CFX_Int32Array;
+            result->SetSize(3);
+            (*result)[0] = patternStart;
+            (*result)[1] = i;
+            (*result)[2] = bestMatch;
+            return result;
+          }
+        }
+        patternStart += counters[0] + counters[1];
+        for (int32_t y = 2; y < patternLength; y++) {
+          counters[y - 2] = counters[y];
+        }
+        counters[patternLength - 2] = 0;
+        counters[patternLength - 1] = 0;
+        counterPosition--;
+      } else {
+        counterPosition++;
+      }
+      counters[counterPosition] = 1;
+      isWhite = !isWhite;
+    }
+  }
+  e = BCExceptionNotFound;
+  return NULL;
+}
+int32_t CBC_OnedCode128Reader::DecodeCode(CBC_CommonBitArray* row,
+                                          CFX_Int32Array* counters,
+                                          int32_t rowOffset,
+                                          int32_t& e) {
+  RecordPattern(row, rowOffset, counters, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  int32_t bestVariance = MAX_AVG_VARIANCE;
+  int32_t bestMatch = -1;
+  for (int32_t d = 0; d < 107; d++) {
+    int32_t variance = PatternMatchVariance(counters, &CODE_PATTERNS[d][0],
+                                            MAX_INDIVIDUAL_VARIANCE);
+    if (variance < bestVariance) {
+      bestVariance = variance;
+      bestMatch = d;
+    }
+  }
+  if (bestMatch >= 0) {
+    return bestMatch;
+  } else {
+    e = BCExceptionNotFound;
+    return 0;
+  }
+  return 0;
+}
+CFX_ByteString CBC_OnedCode128Reader::DecodeRow(int32_t rowNumber,
+                                                CBC_CommonBitArray* row,
+                                                int32_t hints,
+                                                int32_t& e) {
+  CFX_Int32Array* startPatternInfo = FindStartPattern(row, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  int32_t startCode = (*startPatternInfo)[2];
+  int32_t codeSet;
+  switch (startCode) {
+    case 103:
+      codeSet = CODE_CODE_A;
+      break;
+    case 104:
+      codeSet = CODE_CODE_B;
+      break;
+    case 105:
+      codeSet = CODE_CODE_C;
+      break;
+    default:
+      if (startPatternInfo) {
+        startPatternInfo->RemoveAll();
+        delete startPatternInfo;
+        startPatternInfo = NULL;
+      }
+      e = BCExceptionFormatException;
+      return "";
+  }
+  FX_BOOL done = FALSE;
+  FX_BOOL isNextShifted = FALSE;
+  CFX_ByteString result;
+  int32_t lastStart = (*startPatternInfo)[0];
+  int32_t nextStart = (*startPatternInfo)[1];
+  if (startPatternInfo) {
+    startPatternInfo->RemoveAll();
+    delete startPatternInfo;
+    startPatternInfo = NULL;
+  }
+  CFX_Int32Array counters;
+  counters.SetSize(6);
+  int32_t lastCode = 0;
+  int32_t code = 0;
+  int32_t checksumTotal = startCode;
+  int32_t multiplier = 0;
+  FX_BOOL lastCharacterWasPrintable = TRUE;
+  while (!done) {
+    FX_BOOL unshift = isNextShifted;
+    isNextShifted = FALSE;
+    lastCode = code;
+    code = DecodeCode(row, &counters, nextStart, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, "");
+    if (code != CODE_STOP) {
+      lastCharacterWasPrintable = TRUE;
+    }
+    if (code != CODE_STOP) {
+      multiplier++;
+      checksumTotal += multiplier * code;
+    }
+    lastStart = nextStart;
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      nextStart += counters[i];
+    }
+    switch (code) {
+      case 103:
+      case 104:
+      case 105:
+        e = BCExceptionFormatException;
+        return "";
+    }
+    switch (codeSet) {
+      case 101:
+        if (code < 64) {
+          result += (FX_CHAR)(' ' + code);
+        } else if (code < 96) {
+          result += (FX_CHAR)(code - 64);
+        } else {
+          if (code != CODE_STOP) {
+            lastCharacterWasPrintable = FALSE;
+          }
+          switch (code) {
+            case 102:
+            case 97:
+            case 96:
+            case 101:
+              break;
+            case 98:
+              isNextShifted = TRUE;
+              codeSet = CODE_CODE_B;
+              break;
+            case 100:
+              codeSet = CODE_CODE_B;
+              break;
+            case 99:
+              codeSet = CODE_CODE_C;
+              break;
+            case 106:
+              done = TRUE;
+              break;
+          }
+        }
+        break;
+      case 100:
+        if (code < 96) {
+          result += (FX_CHAR)(' ' + code);
+        } else {
+          if (code != CODE_STOP) {
+            lastCharacterWasPrintable = FALSE;
+          }
+          switch (code) {
+            case 102:
+            case 97:
+            case 96:
+            case 100:
+              break;
+            case 98:
+              isNextShifted = TRUE;
+              codeSet = CODE_CODE_A;
+              break;
+            case 101:
+              codeSet = CODE_CODE_A;
+              break;
+            case 99:
+              codeSet = CODE_CODE_C;
+              break;
+            case 106:
+              done = TRUE;
+              break;
+          }
+        }
+        break;
+      case 99:
+        if (code < 100) {
+          if (code < 10) {
+            result += '0';
+          }
+          FX_CHAR temp[128];
+          // TODO(dsinclair): Should this be snprintf?
+          sprintf(temp, "%d", code);
+          result += temp;
+        } else {
+          if (code != CODE_STOP) {
+            lastCharacterWasPrintable = FALSE;
+          }
+          switch (code) {
+            case 102:
+              break;
+            case 101:
+              codeSet = CODE_CODE_A;
+              break;
+            case 100:
+              codeSet = CODE_CODE_B;
+              break;
+            case 106:
+              done = TRUE;
+              break;
+          }
+        }
+        break;
+    }
+    if (unshift) {
+      codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A;
+    }
+  }
+  int32_t width = row->GetSize();
+  while (nextStart < width && row->Get(nextStart)) {
+    nextStart++;
+  }
+  FX_BOOL boolT1 = row->IsRange(
+      nextStart, std::min(width, nextStart + (nextStart - lastStart) / 2),
+      FALSE, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  if (!boolT1) {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  checksumTotal -= multiplier * lastCode;
+  if (checksumTotal % 103 != lastCode) {
+    e = BCExceptionChecksumException;
+    return "";
+  }
+  int32_t resultLength = result.GetLength();
+  if (resultLength > 0 && lastCharacterWasPrintable) {
+    if (codeSet == CODE_CODE_C) {
+      result = result.Mid(0, result.GetLength() - 2);
+    } else {
+      result = result.Mid(0, result.GetLength() - 1);
+    }
+  }
+  if (result.GetLength() == 0) {
+    e = BCExceptionFormatException;
+    return "";
+  }
+  return result;
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Reader.h b/xfa/fxbarcode/oned/BC_OnedCode128Reader.h
new file mode 100644
index 0000000..d9ac485
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Reader.h
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
+
+class CBC_OneDReader;
+class CBC_CommonBitArray;
+class CBC_OnedCode128Reader : public CBC_OneDReader {
+ public:
+  CBC_OnedCode128Reader();
+  virtual ~CBC_OnedCode128Reader();
+  virtual CFX_ByteString DecodeRow(int32_t rowNumber,
+                                   CBC_CommonBitArray* row,
+                                   int32_t hints,
+                                   int32_t& e);
+
+  static const int32_t CODE_PATTERNS[107][7];
+
+ private:
+  static const int32_t MAX_AVG_VARIANCE = (int32_t)(256 * 0.25f);
+  static const int32_t MAX_INDIVIDUAL_VARIANCE = (int32_t)(256 * 0.7f);
+
+  static const int32_t CODE_SHIFT = 98;
+  static const int32_t CODE_CODE_C = 99;
+  static const int32_t CODE_CODE_B = 100;
+  static const int32_t CODE_CODE_A = 101;
+  static const int32_t CODE_FNC_1 = 102;
+  static const int32_t CODE_FNC_2 = 97;
+  static const int32_t CODE_FNC_3 = 96;
+  static const int32_t CODE_FNC_4_A = 101;
+  static const int32_t CODE_FNC_4_B = 100;
+
+  static const int32_t CODE_START_A = 103;
+  static const int32_t CODE_START_B = 104;
+  static const int32_t CODE_START_C = 105;
+  static const int32_t CODE_STOP = 106;
+
+  CFX_Int32Array* FindStartPattern(CBC_CommonBitArray* row, int32_t& e);
+  int32_t DecodeCode(CBC_CommonBitArray* row,
+                     CFX_Int32Array* counters,
+                     int32_t rowOffset,
+                     int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp b/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp
new file mode 100644
index 0000000..4d759b4
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp
@@ -0,0 +1,235 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2010 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
+
+const int32_t CBC_OnedCode128Writer::CODE_CODE_B = 100;
+const int32_t CBC_OnedCode128Writer::CODE_CODE_C = 99;
+const int32_t CBC_OnedCode128Writer::CODE_START_B = 104;
+const int32_t CBC_OnedCode128Writer::CODE_START_C = 105;
+const int32_t CBC_OnedCode128Writer::CODE_STOP = 106;
+
+CBC_OnedCode128Writer::CBC_OnedCode128Writer() {
+  m_codeFormat = BC_CODE128_B;
+}
+CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) {
+  m_codeFormat = type;
+}
+CBC_OnedCode128Writer::~CBC_OnedCode128Writer() {}
+BC_TYPE CBC_OnedCode128Writer::GetType() {
+  return m_codeFormat;
+}
+FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  FX_BOOL ret = TRUE;
+  int32_t position = 0;
+  int32_t patternIndex = -1;
+  if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) {
+    while (position < contents.GetLength()) {
+      patternIndex = (int32_t)contents.GetAt(position);
+      if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) {
+        position++;
+        continue;
+      } else {
+        ret = FALSE;
+        break;
+      }
+      position++;
+    }
+  } else {
+    ret = FALSE;
+  }
+  return ret;
+}
+CFX_WideString CBC_OnedCode128Writer::FilterContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filterChineseChar;
+  FX_WCHAR ch;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    ch = contents.GetAt(i);
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    filterChineseChar += ch;
+  }
+  CFX_WideString filtercontents;
+  if (m_codeFormat == BC_CODE128_B) {
+    for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
+      ch = filterChineseChar.GetAt(i);
+      if (ch >= 32 && ch <= 126) {
+        filtercontents += ch;
+      } else {
+        continue;
+      }
+    }
+  } else if (m_codeFormat == BC_CODE128_C) {
+    for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
+      ch = filterChineseChar.GetAt(i);
+      if (ch >= 32 && ch <= 106) {
+        filtercontents += ch;
+      } else {
+        continue;
+      }
+    }
+  } else {
+    filtercontents = contents;
+  }
+  return filtercontents;
+}
+FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) {
+  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
+    return FALSE;
+  }
+  m_locTextLoc = location;
+  return TRUE;
+}
+uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
+                                       BCFORMAT format,
+                                       int32_t& outWidth,
+                                       int32_t& outHeight,
+                                       int32_t hints,
+                                       int32_t& e) {
+  if (format != BCFORMAT_CODE_128) {
+    e = BCExceptionOnlyEncodeCODE_128;
+    return NULL;
+  }
+  uint8_t* ret =
+      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
+                                       BCFORMAT format,
+                                       int32_t& outWidth,
+                                       int32_t& outHeight,
+                                       int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString& contents,
+                                        int32_t start,
+                                        int32_t length) {
+  int32_t end = start + length;
+  for (int32_t i = start; i < end; i++) {
+    if (contents[i] < '0' || contents[i] > '9') {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
+                                       int32_t& outLength,
+                                       int32_t& e) {
+  if (contents.GetLength() < 1 || contents.GetLength() > 80) {
+    e = BCExceptionContentsLengthShouldBetween1and80;
+    return NULL;
+  }
+  CFX_PtrArray patterns;
+  int32_t checkSum = 0;
+  if (m_codeFormat == BC_CODE128_B) {
+    checkSum = Encode128B(contents, patterns);
+  } else if (m_codeFormat == BC_CODE128_C) {
+    checkSum = Encode128C(contents, patterns);
+  } else {
+    e = BCExceptionFormatException;
+    return NULL;
+  }
+  checkSum %= 103;
+  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]);
+  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]);
+  m_iContentLen = contents.GetLength() + 3;
+  int32_t codeWidth = 0;
+  for (int32_t k = 0; k < patterns.GetSize(); k++) {
+    int32_t* pattern = (int32_t*)patterns[k];
+    for (int32_t j = 0; j < 7; j++) {
+      codeWidth += pattern[j];
+    }
+  }
+  outLength = codeWidth;
+  uint8_t* result = FX_Alloc(uint8_t, outLength);
+  int32_t pos = 0;
+  for (int32_t j = 0; j < patterns.GetSize(); j++) {
+    int32_t* pattern = (int32_t*)patterns[j];
+    pos += AppendPattern(result, pos, pattern, 7, 1, e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  return result;
+}
+int32_t CBC_OnedCode128Writer::Encode128B(const CFX_ByteString& contents,
+                                          CFX_PtrArray& patterns) {
+  int32_t checkSum = 0;
+  int32_t checkWeight = 1;
+  int32_t position = 0;
+  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]);
+  checkSum += CODE_START_B * checkWeight;
+  while (position < contents.GetLength()) {
+    int32_t patternIndex = 0;
+    patternIndex = contents[position] - ' ';
+    position += 1;
+    patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
+    checkSum += patternIndex * checkWeight;
+    if (position != 0) {
+      checkWeight++;
+    }
+  }
+  return checkSum;
+}
+int32_t CBC_OnedCode128Writer::Encode128C(const CFX_ByteString& contents,
+                                          CFX_PtrArray& patterns) {
+  int32_t checkSum = 0;
+  int32_t checkWeight = 1;
+  int32_t position = 0;
+  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]);
+  checkSum += CODE_START_C * checkWeight;
+  while (position < contents.GetLength()) {
+    int32_t patternIndex = 0;
+    FX_CHAR ch = contents.GetAt(position);
+    if (ch < '0' || ch > '9') {
+      patternIndex = (int32_t)ch;
+      position++;
+    } else {
+      patternIndex = FXSYS_atoi(contents.Mid(position, 2));
+      if (contents.GetAt(position + 1) < '0' ||
+          contents.GetAt(position + 1) > '9') {
+        position += 1;
+      } else {
+        position += 2;
+      }
+    }
+    patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
+    checkSum += patternIndex * checkWeight;
+    if (position != 0) {
+      checkWeight++;
+    }
+  }
+  return checkSum;
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Writer.h b/xfa/fxbarcode/oned/BC_OnedCode128Writer.h
new file mode 100644
index 0000000..9be05a1
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Writer.h
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
+
+class CBC_OneDimWriter;
+class CBC_OnedCode128Writer : public CBC_OneDimWriter {
+ public:
+  CBC_OnedCode128Writer();
+  CBC_OnedCode128Writer(BC_TYPE type);
+  virtual ~CBC_OnedCode128Writer();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  BC_TYPE GetType();
+
+ private:
+  FX_BOOL IsDigits(const CFX_ByteString& contents,
+                   int32_t start,
+                   int32_t length);
+  int32_t Encode128B(const CFX_ByteString& contents, CFX_PtrArray& patterns);
+  int32_t Encode128C(const CFX_ByteString& contents, CFX_PtrArray& patterns);
+  BC_TYPE m_codeFormat;
+  static const int32_t CODE_START_B;
+  static const int32_t CODE_START_C;
+  static const int32_t CODE_CODE_B;
+  static const int32_t CODE_CODE_C;
+  static const int32_t CODE_STOP;
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp b/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp
new file mode 100644
index 0000000..e2f88e7
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp
@@ -0,0 +1,287 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
+#include "xfa/fxbarcode/utils.h"
+
+const FX_CHAR* CBC_OnedCode39Reader::ALPHABET_STRING =
+    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";
+const FX_CHAR* CBC_OnedCode39Reader::CHECKSUM_STRING =
+    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";
+const int32_t CBC_OnedCode39Reader::CHARACTER_ENCODINGS[44] = {
+    0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124,
+    0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C,
+    0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007,
+    0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0,
+    0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A};
+const int32_t CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094;
+
+CBC_OnedCode39Reader::CBC_OnedCode39Reader()
+    : m_usingCheckDigit(FALSE), m_extendedMode(FALSE) {}
+CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit)
+    : m_usingCheckDigit(usingCheckDigit), m_extendedMode(FALSE) {}
+CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit,
+                                           FX_BOOL extendedMode)
+    : m_usingCheckDigit(usingCheckDigit), m_extendedMode(extendedMode) {}
+CBC_OnedCode39Reader::~CBC_OnedCode39Reader() {}
+CFX_ByteString CBC_OnedCode39Reader::DecodeRow(int32_t rowNumber,
+                                               CBC_CommonBitArray* row,
+                                               int32_t hints,
+                                               int32_t& e) {
+  CFX_Int32Array* start = FindAsteriskPattern(row, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  int32_t nextStart = (*start)[1];
+  delete start;
+  int32_t end = row->GetSize();
+  while (nextStart < end && !row->Get(nextStart)) {
+    nextStart++;
+  }
+  CFX_ByteString result;
+  CFX_Int32Array counters;
+  counters.SetSize(9);
+  FX_CHAR decodedChar;
+  do {
+    RecordPattern(row, nextStart, &counters, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, "");
+    int32_t pattern = ToNarrowWidePattern(&counters);
+    if (pattern < 0) {
+      e = BCExceptionNotFound;
+      return "";
+    }
+    decodedChar = PatternToChar(pattern, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, "");
+    result += decodedChar;
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      nextStart += counters[i];
+    }
+    while (nextStart < end && !row->Get(nextStart)) {
+      nextStart++;
+    }
+  } while (decodedChar != '*');
+  result = result.Mid(0, result.GetLength() - 1);
+  int32_t lastPatternSize = 0;
+  for (int32_t j = 0; j < counters.GetSize(); j++) {
+    lastPatternSize += counters[j];
+  }
+  if (m_usingCheckDigit) {
+    int32_t max = result.GetLength() - 1;
+    int32_t total = 0;
+    int32_t len = (int32_t)strlen(ALPHABET_STRING);
+    for (int32_t k = 0; k < max; k++) {
+      for (int32_t j = 0; j < len; j++)
+        if (ALPHABET_STRING[j] == result[k]) {
+          total += j;
+        }
+    }
+    if (result[max] != (ALPHABET_STRING)[total % 43]) {
+      e = BCExceptionChecksumException;
+      return "";
+    }
+    result = result.Mid(0, result.GetLength() - 1);
+  }
+  if (result.GetLength() == 0) {
+    e = BCExceptionNotFound;
+    return "";
+  }
+  if (m_extendedMode) {
+    CFX_ByteString bytestr = DecodeExtended(result, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, "");
+    return bytestr;
+  } else {
+    return result;
+  }
+}
+CFX_Int32Array* CBC_OnedCode39Reader::FindAsteriskPattern(
+    CBC_CommonBitArray* row,
+    int32_t& e) {
+  int32_t width = row->GetSize();
+  int32_t rowOffset = 0;
+  while (rowOffset < width) {
+    if (row->Get(rowOffset)) {
+      break;
+    }
+    rowOffset++;
+  }
+  int32_t counterPosition = 0;
+  CFX_Int32Array counters;
+  counters.SetSize(9);
+  int32_t patternStart = rowOffset;
+  FX_BOOL isWhite = FALSE;
+  int32_t patternLength = counters.GetSize();
+  for (int32_t i = rowOffset; i < width; i++) {
+    FX_BOOL pixel = row->Get(i);
+    if (pixel ^ isWhite) {
+      counters[counterPosition]++;
+    } else {
+      if (counterPosition == patternLength - 1) {
+        if (ToNarrowWidePattern(&counters) == ASTERISK_ENCODING) {
+          FX_BOOL bT1 =
+              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
+                           patternStart, FALSE, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+          if (bT1) {
+            CFX_Int32Array* result = new CFX_Int32Array;
+            result->SetSize(2);
+            (*result)[0] = patternStart;
+            (*result)[1] = i;
+            return result;
+          }
+        }
+        patternStart += counters[0] + counters[1];
+        for (int32_t y = 2; y < patternLength; y++) {
+          counters[y - 2] = counters[y];
+        }
+        counters[patternLength - 2] = 0;
+        counters[patternLength - 1] = 0;
+        counterPosition--;
+      } else {
+        counterPosition++;
+      }
+      counters[counterPosition] = 1;
+      isWhite = !isWhite;
+    }
+  }
+  e = BCExceptionNotFound;
+  return NULL;
+}
+int32_t CBC_OnedCode39Reader::ToNarrowWidePattern(CFX_Int32Array* counters) {
+  int32_t numCounters = counters->GetSize();
+  int32_t maxNarrowCounter = 0;
+  int32_t wideCounters;
+  do {
+#undef max
+    int32_t minCounter = FXSYS_IntMax;
+    for (int32_t i = 0; i < numCounters; i++) {
+      int32_t counter = (*counters)[i];
+      if (counter < minCounter && counter > maxNarrowCounter) {
+        minCounter = counter;
+      }
+    }
+    maxNarrowCounter = minCounter;
+    wideCounters = 0;
+    int32_t totalWideCountersWidth = 0;
+    int32_t pattern = 0;
+    for (int32_t j = 0; j < numCounters; j++) {
+      int32_t counter = (*counters)[j];
+      if ((*counters)[j] > maxNarrowCounter) {
+        pattern |= 1 << (numCounters - 1 - j);
+        wideCounters++;
+        totalWideCountersWidth += counter;
+      }
+    }
+    if (wideCounters == 3) {
+      for (int32_t k = 0; k < numCounters && wideCounters > 0; k++) {
+        int32_t counter = (*counters)[k];
+        if ((*counters)[k] > maxNarrowCounter) {
+          wideCounters--;
+          if ((counter << 1) >= totalWideCountersWidth) {
+            return -1;
+          }
+        }
+      }
+      return pattern;
+    }
+  } while (wideCounters > 3);
+  return -1;
+}
+FX_CHAR CBC_OnedCode39Reader::PatternToChar(int32_t pattern, int32_t& e) {
+  for (int32_t i = 0; i < 44; i++) {
+    if (CHARACTER_ENCODINGS[i] == pattern) {
+      return (ALPHABET_STRING)[i];
+    }
+  }
+  e = BCExceptionNotFound;
+  return 0;
+}
+CFX_ByteString CBC_OnedCode39Reader::DecodeExtended(CFX_ByteString& encoded,
+                                                    int32_t& e) {
+  int32_t length = encoded.GetLength();
+  CFX_ByteString decoded;
+  FX_CHAR c, next;
+  for (int32_t i = 0; i < length; i++) {
+    c = encoded[i];
+    if (c == '+' || c == '$' || c == '%' || c == '/') {
+      next = encoded[i + 1];
+      FX_CHAR decodedChar = '\0';
+      switch (c) {
+        case '+':
+          if (next >= 'A' && next <= 'Z') {
+            decodedChar = (FX_CHAR)(next + 32);
+          } else {
+            e = BCExceptionFormatException;
+            return "";
+          }
+          break;
+        case '$':
+          if (next >= 'A' && next <= 'Z') {
+            decodedChar = (FX_CHAR)(next - 64);
+          } else {
+            e = BCExceptionFormatException;
+            return "";
+          }
+          break;
+        case '%':
+          if (next >= 'A' && next <= 'E') {
+            decodedChar = (FX_CHAR)(next - 38);
+          } else if (next >= 'F' && next <= 'J') {
+            decodedChar = (FX_CHAR)(next - 11);
+          } else if (next >= 'K' && next <= 'O' && next != 'M' && next != 'N') {
+            decodedChar = (FX_CHAR)(next + 16);
+          } else if (next >= 'P' && next <= 'S') {
+            decodedChar = (FX_CHAR)(next + 43);
+          } else if (next == 'U') {
+            decodedChar = (FX_CHAR)0;
+          } else if (next == 'V') {
+            decodedChar = (FX_CHAR)64;
+          } else if (next == 'W') {
+            decodedChar = (FX_CHAR)96;
+          } else if (next == 'T' || next == 'X' || next == 'Y' || next == 'Z') {
+            decodedChar = (FX_CHAR)127;
+          } else {
+            e = BCExceptionFormatException;
+            return "";
+          }
+          break;
+        case '/':
+          if (next >= 'A' && next <= 'O') {
+            decodedChar = (FX_CHAR)(next - 32);
+          } else if (next == 'Z') {
+            decodedChar = ':';
+          } else {
+            e = BCExceptionFormatException;
+            return "";
+          }
+          break;
+      }
+      decoded += decodedChar;
+      i++;
+    } else {
+      decoded += c;
+    }
+  }
+  return decoded;
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Reader.h b/xfa/fxbarcode/oned/BC_OnedCode39Reader.h
new file mode 100644
index 0000000..f1551e4
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Reader.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
+
+class CBC_OneDReader;
+class CBC_CommonBitArray;
+class CBC_OnedCode39Reader : public CBC_OneDReader {
+ public:
+  static const FX_CHAR* ALPHABET_STRING;
+  static const FX_CHAR* CHECKSUM_STRING;
+  static const int32_t CHARACTER_ENCODINGS[44];
+  static const int32_t ASTERISK_ENCODING;
+  CBC_OnedCode39Reader();
+  CBC_OnedCode39Reader(FX_BOOL usingCheckDigit);
+  CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode);
+  virtual ~CBC_OnedCode39Reader();
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           int32_t hints,
+                           int32_t& e);
+
+ private:
+  FX_BOOL m_usingCheckDigit;
+  FX_BOOL m_extendedMode;
+  CFX_Int32Array* FindAsteriskPattern(CBC_CommonBitArray* row, int32_t& e);
+  int32_t ToNarrowWidePattern(CFX_Int32Array* counters);
+  FX_CHAR PatternToChar(int32_t pattern, int32_t& e);
+  CFX_ByteString DecodeExtended(CFX_ByteString& encoded, int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp b/xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp
new file mode 100644
index 0000000..31e75ca
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp
@@ -0,0 +1,364 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2010 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
+
+CBC_OnedCode39Writer::CBC_OnedCode39Writer() {
+  m_extendedMode = FALSE;
+  m_iWideNarrRatio = 3;
+}
+CBC_OnedCode39Writer::CBC_OnedCode39Writer(FX_BOOL extendedMode) {
+  m_iWideNarrRatio = 3;
+  m_extendedMode = extendedMode;
+}
+CBC_OnedCode39Writer::~CBC_OnedCode39Writer() {}
+FX_BOOL CBC_OnedCode39Writer::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  if (m_extendedMode) {
+    return CheckExtendedContentValidity(contents);
+  }
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
+        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') || ch == (FX_WCHAR)'-' ||
+        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
+        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
+        ch == (FX_WCHAR)'%') {
+      continue;
+    }
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_BOOL CBC_OnedCode39Writer::CheckExtendedContentValidity(
+    const CFX_WideStringC& contents) {
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if (ch > 127) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+CFX_WideString CBC_OnedCode39Writer::FilterContents(
+    const CFX_WideStringC& contents) {
+  if (m_extendedMode) {
+    return FilterExtendedContents(contents);
+  }
+  CFX_WideString filtercontents;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
+      continue;
+    }
+    if (ch > 175) {
+      i++;
+      continue;
+    } else {
+      ch = Upper(ch);
+    }
+    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
+        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') || ch == (FX_WCHAR)'-' ||
+        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
+        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
+        ch == (FX_WCHAR)'%') {
+      filtercontents += ch;
+    }
+  }
+  return filtercontents;
+}
+CFX_WideString CBC_OnedCode39Writer::FilterExtendedContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filtercontents;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
+      continue;
+    }
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if (ch > 127 && ch < 176) {
+      continue;
+    }
+    if (ch == 0) {
+      filtercontents += '%';
+      filtercontents += 'U';
+    } else if (ch >= 1 && ch <= 26) {
+      filtercontents += '$';
+      filtercontents += (ch + 64);
+    } else if (ch >= 27 && ch <= 31) {
+      filtercontents += '%';
+      filtercontents += (ch + 38);
+    } else if (ch >= 33 && ch <= 47 && ch != 45 && ch != 46) {
+      filtercontents += '/';
+      filtercontents += (ch + 32);
+    } else if (ch == 58) {
+      filtercontents += '/';
+      filtercontents += 'Z';
+    } else if (ch >= 59 && ch <= 63) {
+      filtercontents += '%';
+      filtercontents += ch + 11;
+    } else if (ch == 64) {
+      filtercontents += '%';
+      filtercontents += 'V';
+    } else if (ch >= 91 && ch <= 95) {
+      filtercontents += '%';
+      filtercontents += ch - 16;
+    } else if (ch == 96) {
+      filtercontents += '%';
+      filtercontents += 'W';
+    } else if (ch >= 97 && ch <= 122) {
+      filtercontents += '+';
+      filtercontents += ch - 32;
+    } else if (ch >= 123 && ch <= 126) {
+      filtercontents += '%';
+      filtercontents += ch - 43;
+    } else if (ch == 127) {
+      filtercontents += '%';
+      filtercontents += 'T';
+    } else {
+      filtercontents += ch;
+    }
+  }
+  return filtercontents;
+}
+CFX_WideString CBC_OnedCode39Writer::RenderTextContents(
+    const CFX_WideStringC& contents) {
+  if (m_extendedMode) {
+    return RenderExtendedTextContents(contents);
+  }
+  CFX_WideString renderContents;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
+      continue;
+    }
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
+        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') ||
+        (ch >= (FX_WCHAR)'a' && ch <= (FX_WCHAR)'z') || ch == (FX_WCHAR)'-' ||
+        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
+        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
+        ch == (FX_WCHAR)'%') {
+      renderContents += ch;
+    }
+  }
+  return renderContents;
+}
+CFX_WideString CBC_OnedCode39Writer::RenderExtendedTextContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString renderContents;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    FX_WCHAR ch = contents.GetAt(i);
+    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
+      continue;
+    }
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if (ch > 127 && ch < 176) {
+      continue;
+    }
+    renderContents += ch;
+  }
+  return renderContents;
+}
+FX_BOOL CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) {
+  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
+    return FALSE;
+  }
+  m_locTextLoc = location;
+  return TRUE;
+}
+FX_BOOL CBC_OnedCode39Writer::SetWideNarrowRatio(int32_t ratio) {
+  if (ratio < 2 || ratio > 3) {
+    return FALSE;
+  }
+  m_iWideNarrRatio = ratio;
+  return TRUE;
+}
+uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
+                                      BCFORMAT format,
+                                      int32_t& outWidth,
+                                      int32_t& outHeight,
+                                      int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
+                                      BCFORMAT format,
+                                      int32_t& outWidth,
+                                      int32_t& outHeight,
+                                      int32_t hints,
+                                      int32_t& e) {
+  if (format != BCFORMAT_CODE_39) {
+    e = BCExceptionOnlyEncodeCODE_39;
+    return NULL;
+  }
+  uint8_t* ret =
+      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+void CBC_OnedCode39Writer::ToIntArray(int32_t a, int32_t* toReturn) {
+  for (int32_t i = 0; i < 9; i++) {
+    toReturn[i] = (a & (1 << i)) == 0 ? 1 : m_iWideNarrRatio;
+  }
+}
+FX_CHAR CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString& contents,
+                                           int32_t& e) {
+  int32_t length = contents.GetLength();
+  if (length > 80) {
+    e = BCExceptionContentsLengthShouldBetween1and80;
+    return '*';
+  }
+  int32_t checksum = 0;
+  int32_t len = (int32_t)strlen(CBC_OnedCode39Reader::ALPHABET_STRING);
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    int32_t j = 0;
+    for (; j < len; j++) {
+      if (CBC_OnedCode39Reader::ALPHABET_STRING[j] == contents[i]) {
+        if (contents[i] != '*') {
+          checksum += j;
+          break;
+        } else {
+          break;
+        }
+      }
+    }
+    if (j >= len) {
+      e = BCExceptionUnSupportedString;
+      return '*';
+    }
+  }
+  checksum = checksum % 43;
+  return CBC_OnedCode39Reader::CHECKSUM_STRING[checksum];
+}
+uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
+                                      int32_t& outlength,
+                                      int32_t& e) {
+  FX_CHAR checksum = CalcCheckSum(contents, e);
+  if (checksum == '*') {
+    return NULL;
+  }
+  int32_t widths[9] = {0};
+  int32_t wideStrideNum = 3;
+  int32_t narrStrideNum = 9 - wideStrideNum;
+  CFX_ByteString encodedContents = contents;
+  if (m_bCalcChecksum) {
+    encodedContents += checksum;
+  }
+  m_iContentLen = encodedContents.GetLength();
+  int32_t codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 +
+                      1 + m_iContentLen;
+  int32_t len = (int32_t)strlen(CBC_OnedCode39Reader::ALPHABET_STRING);
+  for (int32_t j = 0; j < m_iContentLen; j++) {
+    for (int32_t i = 0; i < len; i++) {
+      if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[j]) {
+        ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths);
+        for (int32_t k = 0; k < 9; k++) {
+          codeWidth += widths[k];
+        }
+      }
+    }
+  }
+  outlength = codeWidth;
+  uint8_t* result = FX_Alloc(uint8_t, codeWidth);
+  ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths);
+  int32_t pos = AppendPattern(result, 0, widths, 9, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  int32_t narrowWhite[] = {1};
+  pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  for (int32_t l = m_iContentLen - 1; l >= 0; l--) {
+    for (int32_t i = 0; i < len; i++) {
+      if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[l]) {
+        ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths);
+        pos += AppendPattern(result, pos, widths, 9, 1, e);
+        if (e != BCExceptionNO) {
+          FX_Free(result);
+          return NULL;
+        }
+      }
+    }
+    pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths);
+  pos += AppendPattern(result, pos, widths, 9, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  for (int32_t i = 0; i < codeWidth / 2; i++) {
+    result[i] ^= result[codeWidth - 1 - i];
+    result[codeWidth - 1 - i] ^= result[i];
+    result[i] ^= result[codeWidth - 1 - i];
+  }
+  return result;
+}
+CFX_WideString CBC_OnedCode39Writer::encodedContents(
+    const CFX_WideStringC& contents,
+    int32_t& e) {
+  CFX_WideString encodedContents = contents;
+  if (m_bCalcChecksum && m_bPrintChecksum) {
+    CFX_WideString checksumContent = FilterContents(contents);
+    CFX_ByteString str = checksumContent.UTF8Encode();
+    FX_CHAR checksum;
+    checksum = CalcCheckSum(str, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+    str += checksum;
+    encodedContents += checksum;
+  }
+  return encodedContents;
+}
+void CBC_OnedCode39Writer::RenderResult(const CFX_WideStringC& contents,
+                                        uint8_t* code,
+                                        int32_t codeLength,
+                                        FX_BOOL isDevice,
+                                        int32_t& e) {
+  CFX_WideString encodedCon = encodedContents(contents, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CBC_OneDimWriter::RenderResult(encodedCon, code, codeLength, isDevice, e);
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Writer.h b/xfa/fxbarcode/oned/BC_OnedCode39Writer.h
new file mode 100644
index 0000000..b438727
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Writer.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
+
+enum BC_TEXT_LOC;
+class CBC_OneDimWriter;
+class CBC_OnedCode39Writer : public CBC_OneDimWriter {
+ public:
+  CBC_OnedCode39Writer();
+  CBC_OnedCode39Writer(FX_BOOL extendedMode);
+  virtual ~CBC_OnedCode39Writer();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e);
+  void RenderResult(const CFX_WideStringC& contents,
+                    uint8_t* code,
+                    int32_t codeLength,
+                    FX_BOOL isDevice,
+                    int32_t& e);
+  CFX_WideString encodedContents(const CFX_WideStringC& contents, int32_t& e);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  FX_BOOL CheckExtendedContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  CFX_WideString FilterExtendedContents(const CFX_WideStringC& contents);
+  CFX_WideString RenderTextContents(const CFX_WideStringC& contents);
+  CFX_WideString RenderExtendedTextContents(const CFX_WideStringC& contents);
+  FX_BOOL SetTextLocation(BC_TEXT_LOC loction);
+  FX_BOOL SetWideNarrowRatio(int32_t ratio);
+
+ private:
+  void ToIntArray(int32_t a, int32_t* toReturn);
+  FX_CHAR CalcCheckSum(const CFX_ByteString& contents, int32_t& e);
+  int32_t m_iWideNarrRatio;
+  FX_BOOL m_extendedMode;
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Reader.cpp b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.cpp
new file mode 100644
index 0000000..83fea7d
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.cpp
@@ -0,0 +1,96 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = {
+    0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A};
+
+CBC_OnedEAN13Reader::CBC_OnedEAN13Reader() {}
+CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader() {}
+void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString& result,
+                                              int32_t lgPatternFound,
+                                              int32_t& e) {
+  for (int32_t d = 0; d < 10; d++) {
+    if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
+      result.Insert(0, (FX_CHAR)('0' + d));
+      return;
+    }
+  }
+  e = BCExceptionNotFound;
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+int32_t CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray* row,
+                                          CFX_Int32Array* startRange,
+                                          CFX_ByteString& resultString,
+                                          int32_t& e) {
+  CFX_Int32Array counters;
+  counters.Add(0);
+  counters.Add(0);
+  counters.Add(0);
+  counters.Add(0);
+  int32_t end = row->GetSize();
+  int32_t rowOffset = (*startRange)[1];
+  int32_t lgPatternFound = 0;
+  for (int32_t x = 0; x < 6 && rowOffset < end; x++) {
+    int32_t bestMatch =
+        DecodeDigit(row, &counters, rowOffset,
+                    &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    resultString += (FX_CHAR)('0' + bestMatch % 10);
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      rowOffset += counters[i];
+    }
+    if (bestMatch >= 10) {
+      lgPatternFound |= 1 << (5 - x);
+    }
+  }
+  DetermineFirstDigit(resultString, lgPatternFound, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  CFX_Int32Array result;
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);
+  CFX_Int32Array* middleRange =
+      FindGuardPattern(row, rowOffset, TRUE, &result, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  rowOffset = (*middleRange)[1];
+  delete middleRange;
+  for (int32_t Y = 0; Y < 6 && rowOffset < end; Y++) {
+    int32_t bestMatch =
+        DecodeDigit(row, &counters, rowOffset,
+                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    resultString += (FX_CHAR)('0' + bestMatch);
+    for (int32_t k = 0; k < counters.GetSize(); k++) {
+      rowOffset += counters[k];
+    }
+  }
+  return rowOffset;
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h
new file mode 100644
index 0000000..0d9d614
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
+class CBC_OneDimReader;
+class CBC_CommonBitArray;
+class CBC_OnedEAN13Reader;
+class CBC_OnedEAN13Reader : public CBC_OneDimReader {
+ public:
+  static const int32_t FIRST_DIGIT_ENCODINGS[10];
+  CBC_OnedEAN13Reader();
+  virtual ~CBC_OnedEAN13Reader();
+
+ private:
+  void DetermineFirstDigit(CFX_ByteString& result,
+                           int32_t lgPatternFound,
+                           int32_t& e);
+
+ protected:
+  int32_t DecodeMiddle(CBC_CommonBitArray* row,
+                       CFX_Int32Array* startRange,
+                       CFX_ByteString& resultString,
+                       int32_t& e);
+  friend class CBC_OnedUPCAReader;
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp
new file mode 100644
index 0000000..b534602
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp
@@ -0,0 +1,301 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
+
+CBC_OnedEAN13Writer::CBC_OnedEAN13Writer() {
+  m_bLeftPadding = TRUE;
+  m_codeWidth = 3 + (7 * 6) + 5 + (7 * 6) + 3;
+}
+CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() {}
+FX_BOOL CBC_OnedEAN13Writer::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
+      continue;
+    } else {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+CFX_WideString CBC_OnedEAN13Writer::FilterContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filtercontents;
+  FX_WCHAR ch;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    ch = contents.GetAt(i);
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if (ch >= '0' && ch <= '9') {
+      filtercontents += ch;
+    }
+  }
+  return filtercontents;
+}
+int32_t CBC_OnedEAN13Writer::CalcChecksum(const CFX_ByteString& contents) {
+  int32_t odd = 0;
+  int32_t even = 0;
+  int32_t j = 1;
+  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
+    if (j % 2) {
+      odd += FXSYS_atoi(contents.Mid(i, 1));
+    } else {
+      even += FXSYS_atoi(contents.Mid(i, 1));
+    }
+    j++;
+  }
+  int32_t checksum = (odd * 3 + even) % 10;
+  checksum = (10 - checksum) % 10;
+  return (checksum);
+}
+uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
+                                     BCFORMAT format,
+                                     int32_t& outWidth,
+                                     int32_t& outHeight,
+                                     int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
+                                     BCFORMAT format,
+                                     int32_t& outWidth,
+                                     int32_t& outHeight,
+                                     int32_t hints,
+                                     int32_t& e) {
+  if (format != BCFORMAT_EAN_13) {
+    e = BCExceptionOnlyEncodeEAN_13;
+  }
+  uint8_t* ret =
+      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
+                                     int32_t& outLength,
+                                     int32_t& e) {
+  if (contents.GetLength() != 13) {
+    e = BCExceptionDigitLengthShould13;
+    return NULL;
+  }
+  m_iDataLenth = 13;
+  int32_t firstDigit = FXSYS_atoi(contents.Mid(0, 1));
+  int32_t parities = CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[firstDigit];
+  outLength = m_codeWidth;
+  uint8_t* result = FX_Alloc(uint8_t, m_codeWidth);
+  int32_t pos = 0;
+  pos +=
+      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  int32_t i = 0;
+  for (i = 1; i <= 6; i++) {
+    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
+    if ((parities >> (6 - i) & 1) == 1) {
+      digit += 10;
+    }
+    pos += AppendPattern(result, pos, CBC_OneDimReader::L_AND_G_PATTERNS[digit],
+                         4, 0, e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  for (i = 7; i <= 12; i++) {
+    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
+    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1,
+                         e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  pos +=
+      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  return result;
+}
+void CBC_OnedEAN13Writer::ShowChars(const CFX_WideStringC& contents,
+                                    CFX_DIBitmap* pOutBitmap,
+                                    CFX_RenderDevice* device,
+                                    const CFX_Matrix* matrix,
+                                    int32_t barWidth,
+                                    int32_t multiple,
+                                    int32_t& e) {
+  if (device == NULL && pOutBitmap == NULL) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  int32_t leftPadding = 7 * multiple;
+  int32_t leftPosition = 3 * multiple + leftPadding;
+  CFX_ByteString str = FX_UTF8Encode(contents);
+  int32_t iLen = str.GetLength();
+  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
+  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
+  CFX_FxgeDevice geBitmap;
+  if (pOutBitmap) {
+    geBitmap.Attach(pOutBitmap);
+  }
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  CFX_ByteString tempStr = str.Mid(1, 6);
+  int32_t strWidth = multiple * 42;
+  if (pOutBitmap == NULL) {
+    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect(
+        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
+    matr.Concat(*matrix);
+    matr.TransformRect(rect);
+    FX_RECT re = rect.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    CFX_FloatRect rect1(
+        (FX_FLOAT)(leftPosition + 47 * multiple),
+        (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)(leftPosition + 47 * multiple + strWidth - 0.5),
+        (FX_FLOAT)m_Height);
+    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    matr1.Concat(*matrix);
+    matr1.TransformRect(rect1);
+    re = rect1.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    int32_t strWidth1 = multiple * 7;
+    CFX_Matrix matr2(m_outputHScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
+    CFX_FloatRect rect2(0.0f, (FX_FLOAT)(m_Height - iTextHeight),
+                        (FX_FLOAT)strWidth1 - 0.5f, (FX_FLOAT)m_Height);
+    matr2.Concat(*matrix);
+    matr2.TransformRect(rect2);
+    re = rect2.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+  }
+  FX_FLOAT blank = 0.0;
+  iLen = tempStr.GetLength();
+  if (pOutBitmap == NULL) {
+    strWidth = (int32_t)(strWidth * m_outputHScale);
+  }
+  CalcTextInfo(tempStr, pCharPos + 1, m_pFont, (FX_FLOAT)strWidth, iFontSize,
+               blank);
+  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
+  CFX_FxgeDevice ge;
+  if (pOutBitmap) {
+    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
+    FX_RECT rect(0, 0, strWidth, iTextHeight);
+    ge.FillRect(&rect, m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 1, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
+                              (FX_FLOAT)leftPosition * m_outputHScale,
+                              (FX_FLOAT)(m_Height - iTextHeight) + iFontSize);
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 1, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(7, 6);
+  iLen = tempStr.GetLength();
+  CalcTextInfo(tempStr, pCharPos + 7, m_pFont, (FX_FLOAT)strWidth, iFontSize,
+               blank);
+  if (pOutBitmap) {
+    FX_RECT rect1(0, 0, strWidth, iTextHeight);
+    ge.FillRect(&rect1, m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 7, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 47 * multiple,
+                       m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(
+        1.0, 0.0, 0.0, -1.0,
+        (FX_FLOAT)(leftPosition + 47 * multiple) * m_outputHScale,
+        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 7, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(0, 1);
+  iLen = tempStr.GetLength();
+  strWidth = multiple * 7;
+  if (pOutBitmap == NULL) {
+    strWidth = (int32_t)(strWidth * m_outputHScale);
+  }
+  CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize,
+               blank);
+  if (pOutBitmap) {
+    delete ge.GetBitmap();
+    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0.0,
+                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  FX_Free(pCharPos);
+}
+void CBC_OnedEAN13Writer::RenderResult(const CFX_WideStringC& contents,
+                                       uint8_t* code,
+                                       int32_t codeLength,
+                                       FX_BOOL isDevice,
+                                       int32_t& e) {
+  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h
new file mode 100644
index 0000000..fd23129
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
+
+class CBC_OneDimWriter;
+class CBC_OnedEAN13Writer;
+class CBC_OnedEAN13Writer : public CBC_OneDimWriter {
+ private:
+  int32_t m_codeWidth;
+
+ public:
+  CBC_OnedEAN13Writer();
+  virtual ~CBC_OnedEAN13Writer();
+
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e);
+  void RenderResult(const CFX_WideStringC& contents,
+                    uint8_t* code,
+                    int32_t codeLength,
+                    FX_BOOL isDevice,
+                    int32_t& e);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  int32_t CalcChecksum(const CFX_ByteString& contents);
+
+ protected:
+  void ShowChars(const CFX_WideStringC& contents,
+                 CFX_DIBitmap* pOutBitmap,
+                 CFX_RenderDevice* device,
+                 const CFX_Matrix* matrix,
+                 int32_t barWidth,
+                 int32_t multiple,
+                 int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Reader.cpp b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.cpp
new file mode 100644
index 0000000..f3b21fd
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.cpp
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() {}
+CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() {}
+int32_t CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray* row,
+                                         CFX_Int32Array* startRange,
+                                         CFX_ByteString& resultResult,
+                                         int32_t& e) {
+  CFX_Int32Array counters;
+  counters.Add(0);
+  counters.Add(0);
+  counters.Add(0);
+  counters.Add(0);
+  int32_t end = row->GetSize();
+  int32_t rowOffset = (*startRange)[1];
+  int32_t rowOffsetLeft = rowOffset;
+  for (int32_t x = 0; x < 4 && rowOffset < end; x++) {
+    int32_t bestMatch =
+        DecodeDigit(row, &counters, rowOffset,
+                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    resultResult += (FX_CHAR)('0' + bestMatch);
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      rowOffset += counters[i];
+    }
+  }
+  int32_t RowOffsetLen = (rowOffset - rowOffsetLeft) / 4;
+  CFX_Int32Array result;
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);
+  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);
+  CFX_Int32Array* middleRange =
+      FindGuardPattern(row, rowOffset, TRUE, &result, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  int32_t rowOffsetMid = rowOffset;
+  rowOffset = (*middleRange)[1];
+  if ((rowOffset - rowOffsetMid) > RowOffsetLen) {
+    e = BCExceptionNotFound;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  delete middleRange;
+  for (int32_t y = 0; y < 4 && rowOffset < end; y++) {
+    int32_t bestMatch =
+        DecodeDigit(row, &counters, rowOffset,
+                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    resultResult += (FX_CHAR)('0' + bestMatch);
+    for (int32_t i = 0; i < counters.GetSize(); i++) {
+      rowOffset += counters[i];
+    }
+  }
+  return rowOffset;
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h
new file mode 100644
index 0000000..fe2d33d
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
+
+class CBC_OneDimReader;
+class CBC_CommonBitArray;
+class CBC_OnedEAN8Reader;
+class CBC_OnedEAN8Reader : public CBC_OneDimReader {
+ public:
+  CBC_OnedEAN8Reader();
+  virtual ~CBC_OnedEAN8Reader();
+
+ protected:
+  int32_t DecodeMiddle(CBC_CommonBitArray*,
+                       CFX_Int32Array* startRange,
+                       CFX_ByteString& result,
+                       int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp
new file mode 100644
index 0000000..5336867
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp
@@ -0,0 +1,268 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
+
+CBC_OnedEAN8Writer::CBC_OnedEAN8Writer() {
+  m_iDataLenth = 8;
+  m_codeWidth = 3 + (7 * 4) + 5 + (7 * 4) + 3;
+}
+CBC_OnedEAN8Writer::~CBC_OnedEAN8Writer() {}
+void CBC_OnedEAN8Writer::SetDataLength(int32_t length) {
+  m_iDataLenth = 8;
+}
+FX_BOOL CBC_OnedEAN8Writer::SetTextLocation(BC_TEXT_LOC location) {
+  if (location == BC_TEXT_LOC_BELOWEMBED) {
+    m_locTextLoc = location;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CBC_OnedEAN8Writer::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
+      continue;
+    } else {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+CFX_WideString CBC_OnedEAN8Writer::FilterContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filtercontents;
+  FX_WCHAR ch;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    ch = contents.GetAt(i);
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if (ch >= '0' && ch <= '9') {
+      filtercontents += ch;
+    }
+  }
+  return filtercontents;
+}
+int32_t CBC_OnedEAN8Writer::CalcChecksum(const CFX_ByteString& contents) {
+  int32_t odd = 0;
+  int32_t even = 0;
+  int32_t j = 1;
+  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
+    if (j % 2) {
+      odd += FXSYS_atoi(contents.Mid(i, 1));
+    } else {
+      even += FXSYS_atoi(contents.Mid(i, 1));
+    }
+    j++;
+  }
+  int32_t checksum = (odd * 3 + even) % 10;
+  checksum = (10 - checksum) % 10;
+  return (checksum);
+}
+uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
+                                    BCFORMAT format,
+                                    int32_t& outWidth,
+                                    int32_t& outHeight,
+                                    int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
+                                    BCFORMAT format,
+                                    int32_t& outWidth,
+                                    int32_t& outHeight,
+                                    int32_t hints,
+                                    int32_t& e) {
+  if (format != BCFORMAT_EAN_8) {
+    e = BCExceptionOnlyEncodeEAN_8;
+    return NULL;
+  }
+  uint8_t* ret =
+      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
+                                    int32_t& outLength,
+                                    int32_t& e) {
+  if (contents.GetLength() != 8) {
+    e = BCExceptionDigitLengthMustBe8;
+    return NULL;
+  }
+  outLength = m_codeWidth;
+  uint8_t* result = FX_Alloc(uint8_t, m_codeWidth);
+  int32_t pos = 0;
+  pos +=
+      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  int32_t i = 0;
+  for (i = 0; i <= 3; i++) {
+    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
+    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 0,
+                         e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  for (i = 4; i <= 7; i++) {
+    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
+    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1,
+                         e);
+    if (e != BCExceptionNO) {
+      FX_Free(result);
+      return NULL;
+    }
+  }
+  pos +=
+      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
+  if (e != BCExceptionNO) {
+    FX_Free(result);
+    return NULL;
+  }
+  return result;
+}
+void CBC_OnedEAN8Writer::ShowChars(const CFX_WideStringC& contents,
+                                   CFX_DIBitmap* pOutBitmap,
+                                   CFX_RenderDevice* device,
+                                   const CFX_Matrix* matrix,
+                                   int32_t barWidth,
+                                   int32_t multiple,
+                                   int32_t& e) {
+  if (device == NULL && pOutBitmap == NULL) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  int32_t leftPosition = 3 * multiple;
+  CFX_ByteString str = FX_UTF8Encode(contents);
+  int32_t iLength = str.GetLength();
+  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLength);
+  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLength);
+  CFX_ByteString tempStr = str.Mid(0, 4);
+  int32_t iLen = tempStr.GetLength();
+  int32_t strWidth = 7 * multiple * 4;
+  FX_FLOAT blank = 0.0;
+  CFX_FxgeDevice geBitmap;
+  if (pOutBitmap) {
+    geBitmap.Attach(pOutBitmap);
+  }
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  if (pOutBitmap == NULL) {
+    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect(
+        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
+    matr.Concat(*matrix);
+    matr.TransformRect(rect);
+    FX_RECT re = rect.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect1(
+        (FX_FLOAT)(leftPosition + 33 * multiple),
+        (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)(leftPosition + 33 * multiple + strWidth - 0.5),
+        (FX_FLOAT)m_Height);
+    matr1.Concat(*matrix);
+    matr1.TransformRect(rect1);
+    re = rect1.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+  }
+  if (pOutBitmap == NULL) {
+    strWidth = (int32_t)(strWidth * m_outputHScale);
+  }
+  CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize,
+               blank);
+  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
+  CFX_FxgeDevice ge;
+  if (pOutBitmap) {
+    delete ge.GetBitmap();
+    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
+                              (FX_FLOAT)leftPosition * m_outputHScale,
+                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    affine_matrix1.Concat(*matrix);
+    device->DrawNormalText(iLen, pCharPos, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(4, 4);
+  iLen = tempStr.GetLength();
+  CalcTextInfo(tempStr, pCharPos + 4, m_pFont, (FX_FLOAT)strWidth, iFontSize,
+               blank);
+  if (pOutBitmap) {
+    delete ge.GetBitmap();
+    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 4, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 33 * multiple,
+                       m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(
+        1.0, 0.0, 0.0, -1.0,
+        (FX_FLOAT)(leftPosition + 33 * multiple) * m_outputHScale,
+        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 4, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  FX_Free(pCharPos);
+}
+void CBC_OnedEAN8Writer::RenderResult(const CFX_WideStringC& contents,
+                                      uint8_t* code,
+                                      int32_t codeLength,
+                                      FX_BOOL isDevice,
+                                      int32_t& e) {
+  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h
new file mode 100644
index 0000000..fc033ff
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
+
+enum BC_TEXT_LOC;
+class CBC_OneDimWriter;
+class CBC_OnedEAN8Writer;
+class CBC_OnedEAN8Writer : public CBC_OneDimWriter {
+ private:
+  int32_t m_codeWidth;
+
+ public:
+  CBC_OnedEAN8Writer();
+  virtual ~CBC_OnedEAN8Writer();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e);
+  void RenderResult(const CFX_WideStringC& contents,
+                    uint8_t* code,
+                    int32_t codeLength,
+                    FX_BOOL isDevice,
+                    int32_t& e);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  void SetDataLength(int32_t length);
+  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  int32_t CalcChecksum(const CFX_ByteString& contents);
+
+ protected:
+  void ShowChars(const CFX_WideStringC& contents,
+                 CFX_DIBitmap* pOutBitmap,
+                 CFX_RenderDevice* device,
+                 const CFX_Matrix* matrix,
+                 int32_t barWidth,
+                 int32_t multiple,
+                 int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAReader.cpp b/xfa/fxbarcode/oned/BC_OnedUPCAReader.cpp
new file mode 100644
index 0000000..95b0f24
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAReader.cpp
@@ -0,0 +1,97 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_OnedUPCAReader::CBC_OnedUPCAReader() {
+  m_ean13Reader = NULL;
+}
+void CBC_OnedUPCAReader::Init() {
+  m_ean13Reader = new CBC_OnedEAN13Reader;
+}
+CBC_OnedUPCAReader::~CBC_OnedUPCAReader() {
+  delete m_ean13Reader;
+}
+CFX_ByteString CBC_OnedUPCAReader::DecodeRow(int32_t rowNumber,
+                                             CBC_CommonBitArray* row,
+                                             int32_t hints,
+                                             int32_t& e) {
+  CFX_ByteString bytestring =
+      m_ean13Reader->DecodeRow(rowNumber, row, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return temp;
+}
+CFX_ByteString CBC_OnedUPCAReader::DecodeRow(int32_t rowNumber,
+                                             CBC_CommonBitArray* row,
+                                             CFX_Int32Array* startGuardRange,
+                                             int32_t hints,
+                                             int32_t& e) {
+  CFX_ByteString bytestring =
+      m_ean13Reader->DecodeRow(rowNumber, row, startGuardRange, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return temp;
+}
+CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
+  CFX_ByteString bytestring = m_ean13Reader->Decode(image, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return temp;
+}
+CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap* image,
+                                          int32_t hints,
+                                          int32_t& e) {
+  CFX_ByteString bytestring = m_ean13Reader->Decode(image, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return temp;
+}
+int32_t CBC_OnedUPCAReader::DecodeMiddle(CBC_CommonBitArray* row,
+                                         CFX_Int32Array* startRange,
+                                         CFX_ByteString& resultString,
+                                         int32_t& e) {
+  int32_t temp = m_ean13Reader->DecodeMiddle(row, startRange, resultString, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  return temp;
+}
+CFX_ByteString CBC_OnedUPCAReader::MaybeReturnResult(CFX_ByteString& result,
+                                                     int32_t& e) {
+  if (result[0] == '0') {
+    result.Delete(0);
+    return result;
+  } else {
+    e = BCExceptionFormatException;
+    return "";
+  }
+  return "";
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAReader.h b/xfa/fxbarcode/oned/BC_OnedUPCAReader.h
new file mode 100644
index 0000000..306683e1
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAReader.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
+
+class CBC_BinaryBitmap;
+class CBC_CommonBitArray;
+class CBC_OneDimReader;
+class CBC_OnedEAN13Reader;
+class CBC_OnedUPCAReader;
+class CBC_OnedUPCAReader : public CBC_OneDimReader {
+ private:
+  CBC_OnedEAN13Reader* m_ean13Reader;
+
+ public:
+  CBC_OnedUPCAReader();
+  virtual ~CBC_OnedUPCAReader();
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           int32_t hints,
+                           int32_t& e);
+  CFX_ByteString DecodeRow(int32_t rowNumber,
+                           CBC_CommonBitArray* row,
+                           CFX_Int32Array* startGuardRange,
+                           int32_t hints,
+                           int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
+  virtual void Init();
+
+ protected:
+  int32_t DecodeMiddle(CBC_CommonBitArray* row,
+                       CFX_Int32Array* startRange,
+                       CFX_ByteString& resultString,
+                       int32_t& e);
+  CFX_ByteString MaybeReturnResult(CFX_ByteString& result, int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp
new file mode 100644
index 0000000..21ccafc
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -0,0 +1,286 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2010 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Writer.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
+#include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
+
+CBC_OnedUPCAWriter::CBC_OnedUPCAWriter() {
+  m_subWriter = NULL;
+  m_bLeftPadding = TRUE;
+  m_bRightPadding = TRUE;
+}
+void CBC_OnedUPCAWriter::Init() {
+  m_subWriter = new CBC_OnedEAN13Writer;
+}
+CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {
+  delete m_subWriter;
+}
+FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(
+    const CFX_WideStringC& contents) {
+  int32_t i = 0;
+  for (i = 0; i < contents.GetLength(); i++) {
+    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
+      continue;
+    } else {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+CFX_WideString CBC_OnedUPCAWriter::FilterContents(
+    const CFX_WideStringC& contents) {
+  CFX_WideString filtercontents;
+  FX_WCHAR ch;
+  for (int32_t i = 0; i < contents.GetLength(); i++) {
+    ch = contents.GetAt(i);
+    if (ch > 175) {
+      i++;
+      continue;
+    }
+    if (ch >= '0' && ch <= '9') {
+      filtercontents += ch;
+    }
+  }
+  return filtercontents;
+}
+int32_t CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString& contents) {
+  int32_t odd = 0;
+  int32_t even = 0;
+  int32_t j = 1;
+  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
+    if (j % 2) {
+      odd += FXSYS_atoi(contents.Mid(i, 1));
+    } else {
+      even += FXSYS_atoi(contents.Mid(i, 1));
+    }
+    j++;
+  }
+  int32_t checksum = (odd * 3 + even) % 10;
+  checksum = (10 - checksum) % 10;
+  return (checksum);
+}
+uint8_t* CBC_OnedUPCAWriter::Encode(const CFX_ByteString& contents,
+                                    BCFORMAT format,
+                                    int32_t& outWidth,
+                                    int32_t& outHeight,
+                                    int32_t& e) {
+  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+uint8_t* CBC_OnedUPCAWriter::Encode(const CFX_ByteString& contents,
+                                    BCFORMAT format,
+                                    int32_t& outWidth,
+                                    int32_t& outHeight,
+                                    int32_t hints,
+                                    int32_t& e) {
+  if (format != BCFORMAT_UPC_A) {
+    e = BCExceptionOnlyEncodeUPC_A;
+    return NULL;
+  }
+  CFX_ByteString toEAN13String = '0' + contents;
+  m_iDataLenth = 13;
+  uint8_t* ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth,
+                                     outHeight, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return ret;
+}
+void CBC_OnedUPCAWriter::ShowChars(const CFX_WideStringC& contents,
+                                   CFX_DIBitmap* pOutBitmap,
+                                   CFX_RenderDevice* device,
+                                   const CFX_Matrix* matrix,
+                                   int32_t barWidth,
+                                   int32_t multiple,
+                                   int32_t& e) {
+  if (device == NULL && pOutBitmap == NULL) {
+    e = BCExceptionIllegalArgument;
+    return;
+  }
+  int32_t leftPadding = 7 * multiple;
+  int32_t leftPosition = 10 * multiple + leftPadding;
+  CFX_ByteString str = FX_UTF8Encode(contents);
+  int32_t iLen = str.GetLength();
+  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
+  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
+  CFX_ByteString tempStr = str.Mid(1, 5);
+  FX_FLOAT strWidth = (FX_FLOAT)35 * multiple;
+  FX_FLOAT blank = 0.0;
+  CFX_FxgeDevice geBitmap;
+  if (pOutBitmap) {
+    geBitmap.Attach(pOutBitmap);
+  }
+  iLen = tempStr.GetLength();
+  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
+  int32_t iTextHeight = iFontSize + 1;
+  if (pOutBitmap == NULL) {
+    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect(
+        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
+    matr.Concat(*matrix);
+    matr.TransformRect(rect);
+    FX_RECT re = rect.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect1(
+        (FX_FLOAT)(leftPosition + 40 * multiple),
+        (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5),
+        (FX_FLOAT)m_Height);
+    matr1.Concat(*matrix);
+    matr1.TransformRect(rect1);
+    re = rect1.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7;
+    CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight),
+                        (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height);
+    matr2.Concat(*matrix);
+    matr2.TransformRect(rect2);
+    re = rect2.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+    CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
+    CFX_FloatRect rect3(
+        (FX_FLOAT)(leftPosition + 85 * multiple),
+        (FX_FLOAT)(m_Height - iTextHeight),
+        (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5),
+        (FX_FLOAT)m_Height);
+    matr3.Concat(*matrix);
+    matr3.TransformRect(rect3);
+    re = rect3.GetOutterRect();
+    device->FillRect(&re, m_backgroundColor);
+  }
+  if (pOutBitmap == NULL) {
+    strWidth = strWidth * m_outputHScale;
+  }
+  CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank);
+  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
+  CFX_FxgeDevice ge;
+  if (pOutBitmap) {
+    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 1, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
+                              (FX_FLOAT)leftPosition * m_outputHScale,
+                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 1, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(6, 5);
+  iLen = tempStr.GetLength();
+  CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank);
+  if (pOutBitmap) {
+    FX_RECT rect2(0, 0, (int)strWidth, iTextHeight);
+    ge.FillRect(&rect2, m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 6, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple,
+                       m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(
+        1.0, 0.0, 0.0, -1.0,
+        (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale,
+        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 6, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(0, 1);
+  iLen = tempStr.GetLength();
+  strWidth = (FX_FLOAT)multiple * 7;
+  if (pOutBitmap == NULL) {
+    strWidth = strWidth * m_outputHScale;
+  }
+  CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank);
+  if (pOutBitmap) {
+    delete ge.GetBitmap();
+    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0,
+                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  tempStr = str.Mid(11, 1);
+  iLen = tempStr.GetLength();
+  CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank);
+  if (pOutBitmap) {
+    delete ge.GetBitmap();
+    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
+    ge.GetBitmap()->Clear(m_backgroundColor);
+    ge.DrawNormalText(iLen, pCharPos + 11, m_pFont,
+                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
+                      (CFX_Matrix*)&affine_matrix, m_fontColor,
+                      FXTEXT_CLEARTYPE);
+    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple,
+                       m_Height - iTextHeight);
+  } else {
+    CFX_Matrix affine_matrix1(
+        1.0, 0.0, 0.0, -1.0,
+        (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale,
+        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
+    if (matrix) {
+      affine_matrix1.Concat(*matrix);
+    }
+    device->DrawNormalText(iLen, pCharPos + 11, m_pFont,
+                           CFX_GEModule::Get()->GetFontCache(),
+                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
+                           m_fontColor, FXTEXT_CLEARTYPE);
+  }
+  FX_Free(pCharPos);
+}
+void CBC_OnedUPCAWriter::RenderResult(const CFX_WideStringC& contents,
+                                      uint8_t* code,
+                                      int32_t codeLength,
+                                      FX_BOOL isDevice,
+                                      int32_t& e) {
+  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
+}
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h
new file mode 100644
index 0000000..f376929
--- /dev/null
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
+#define XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
+
+class CBC_OnedEAN13Writer;
+class CBC_OnedUPCAWriter;
+class CBC_OnedUPCAWriter : public CBC_OneDimWriter {
+ private:
+  CBC_OnedEAN13Writer* m_subWriter;
+
+ public:
+  CBC_OnedUPCAWriter();
+  virtual ~CBC_OnedUPCAWriter();
+  virtual void Init();
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  int32_t& outLength,
+                  int32_t& e) {
+    return nullptr;
+  }
+  void RenderResult(const CFX_WideStringC& contents,
+                    uint8_t* code,
+                    int32_t codeLength,
+                    FX_BOOL isDevice,
+                    int32_t& e);
+  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  CFX_WideString FilterContents(const CFX_WideStringC& contents);
+  int32_t CalcChecksum(const CFX_ByteString& contents);
+
+ protected:
+  void ShowChars(const CFX_WideStringC& contents,
+                 CFX_DIBitmap* pOutBitmap,
+                 CFX_RenderDevice* device,
+                 const CFX_Matrix* matrix,
+                 int32_t barWidth,
+                 int32_t multiple,
+                 int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417.cpp b/xfa/fxbarcode/pdf417/BC_PDF417.cpp
new file mode 100644
index 0000000..e57a79e
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417.cpp
@@ -0,0 +1,586 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
+#include "xfa/fxbarcode/utils.h"
+
+int32_t CBC_PDF417::START_PATTERN = 0x1fea8;
+int32_t CBC_PDF417::STOP_PATTERN = 0x3fa29;
+int32_t CBC_PDF417::CODEWORD_TABLE[][1000] = {
+    {0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, 0x1a8c0, 0x1d470,
+     0x1a860, 0x15040, 0x1a830, 0x15020, 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0,
+     0x1d678, 0x1eb3e, 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c,
+     0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, 0x1af7c, 0x15e78,
+     0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270,
+     0x1e93c, 0x1a460, 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418,
+     0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, 0x1d33c, 0x14c60,
+     0x1a638, 0x1d31e, 0x14c30, 0x1a61c, 0x14ee0, 0x1a778, 0x1d3be, 0x14e70,
+     0x1a73c, 0x14e38, 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0,
+     0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, 0x1a230, 0x1d11c,
+     0x14420, 0x1a218, 0x14410, 0x14408, 0x146c0, 0x1a370, 0x1d1bc, 0x14660,
+     0x1a338, 0x1d19e, 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc,
+     0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, 0x1e85e, 0x14240,
+     0x1a130, 0x1d09c, 0x14220, 0x1a118, 0x1d08e, 0x14210, 0x1a10c, 0x14208,
+     0x1a106, 0x14360, 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e,
+     0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, 0x1d05c, 0x14120,
+     0x1a098, 0x1d04e, 0x14110, 0x1a08c, 0x14108, 0x1a086, 0x14104, 0x141b0,
+     0x14198, 0x1418c, 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0,
+     0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, 0x1ca38, 0x1e51e,
+     0x12840, 0x19430, 0x12820, 0x196e0, 0x1cb78, 0x1e5be, 0x12cc0, 0x19670,
+     0x1cb3c, 0x12c60, 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe,
+     0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, 0x12f3c, 0x12fbe,
+     0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, 0x1ed38, 0x1f69e, 0x1b440, 0x1da30,
+     0x1ed1c, 0x1b420, 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970,
+     0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, 0x1db38, 0x1ed9e,
+     0x16c40, 0x12420, 0x19218, 0x1c90e, 0x16c20, 0x1b618, 0x16c10, 0x126c0,
+     0x19370, 0x1c9bc, 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738,
+     0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, 0x16f70, 0x12738,
+     0x1939e, 0x16f38, 0x1b79e, 0x16f1c, 0x127bc, 0x16fbc, 0x1279e, 0x16f9e,
+     0x1d960, 0x1ecb8, 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918,
+     0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, 0x1c8b8, 0x1e45e,
+     0x1b360, 0x19130, 0x1c89c, 0x16640, 0x12220, 0x1d99c, 0x1c88e, 0x16620,
+     0x12210, 0x1910c, 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8,
+     0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, 0x1918e, 0x16718,
+     0x1230c, 0x12306, 0x123b8, 0x191de, 0x167b8, 0x1239c, 0x1679c, 0x1238e,
+     0x1678e, 0x167de, 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e,
+     0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, 0x12140, 0x190b0,
+     0x1c85c, 0x16340, 0x12120, 0x19098, 0x1c84e, 0x16320, 0x1b198, 0x1d8ce,
+     0x16310, 0x12108, 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc,
+     0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, 0x12186, 0x16386,
+     0x163dc, 0x163ce, 0x1b0a0, 0x1d858, 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088,
+     0x1d846, 0x1b084, 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090,
+     0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, 0x16184, 0x12082,
+     0x120d8, 0x161d8, 0x161cc, 0x161c6, 0x1d82c, 0x1d826, 0x1b042, 0x1902c,
+     0x12048, 0x160c8, 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60,
+     0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, 0x11410, 0x11408,
+     0x116c0, 0x18b70, 0x1c5bc, 0x11660, 0x18b38, 0x1c59e, 0x11630, 0x18b1c,
+     0x11618, 0x1160c, 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc,
+     0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, 0x1e69c, 0x19a20,
+     0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, 0x19a08, 0x1cd06, 0x18960, 0x1c4b8,
+     0x1e25e, 0x19b60, 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e,
+     0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, 0x11360, 0x189b8,
+     0x1c4de, 0x13760, 0x11330, 0x1cdde, 0x13730, 0x19b9c, 0x1898e, 0x13718,
+     0x1130c, 0x1370c, 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e,
+     0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, 0x1ee98, 0x1f74e,
+     0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c,
+     0x1bb40, 0x19920, 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10,
+     0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, 0x188b0, 0x1c45c,
+     0x13340, 0x11120, 0x18898, 0x1c44e, 0x17740, 0x13320, 0x19998, 0x1ccce,
+     0x17720, 0x1bb98, 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708,
+     0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, 0x177b0, 0x13398,
+     0x199ce, 0x17798, 0x1bbce, 0x11186, 0x13386, 0x111dc, 0x133dc, 0x111ce,
+     0x177dc, 0x133ce, 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88,
+     0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, 0x1b9a0, 0x19890,
+     0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, 0x1b988, 0x19884, 0x1b984, 0x19882,
+     0x1b982, 0x110a0, 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0,
+     0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, 0x17388, 0x13184,
+     0x11082, 0x13182, 0x110d8, 0x1886e, 0x131d8, 0x110cc, 0x173d8, 0x131cc,
+     0x110c6, 0x173cc, 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48,
+     0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, 0x19848, 0x1cc26,
+     0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, 0x1b8c2, 0x11050, 0x1882c, 0x130d0,
+     0x11048, 0x18826, 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042,
+     0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, 0x1ee16, 0x1dc22,
+     0x1cc16, 0x19824, 0x19822, 0x11028, 0x13068, 0x170e8, 0x11022, 0x13062,
+     0x18560, 0x10a40, 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c,
+     0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, 0x1859c, 0x10b18,
+     0x1858e, 0x10b0c, 0x10b06, 0x10bb8, 0x185de, 0x10b9c, 0x10b8e, 0x10bde,
+     0x18d40, 0x1c6b0, 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08,
+     0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, 0x10920, 0x1c6dc,
+     0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, 0x11b10, 0x10908, 0x18486, 0x11b08,
+     0x18d86, 0x10902, 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98,
+     0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, 0x11bce, 0x1cea0,
+     0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82,
+     0x18ca0, 0x1c658, 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646,
+     0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, 0x18458, 0x119a0,
+     0x10890, 0x1c66e, 0x13ba0, 0x11990, 0x18ccc, 0x18446, 0x13b90, 0x19dcc,
+     0x10884, 0x13b88, 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8,
+     0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, 0x108ee, 0x119ee,
+     0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50,
+     0x1e72c, 0x1ded0, 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42,
+     0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, 0x1bdd0, 0x19cc8,
+     0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850,
+     0x1842c, 0x118d0, 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0,
+     0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, 0x17bc4, 0x1086c,
+     0x118ec, 0x10866, 0x139ec, 0x118e6, 0x17bec, 0x139e6, 0x17be6, 0x1ef28,
+     0x1f796, 0x1ef24, 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64,
+     0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, 0x1bce8, 0x19c64,
+     0x18c22, 0x1bce4, 0x19c62, 0x1bce2, 0x10828, 0x18416, 0x11868, 0x18c36,
+     0x138e8, 0x11864, 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2,
+     0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, 0x19c34, 0x1bc74,
+     0x1bc72, 0x11834, 0x13874, 0x178f4, 0x178f2, 0x10540, 0x10520, 0x18298,
+     0x10510, 0x10508, 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc,
+     0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, 0x18684, 0x18682,
+     0x104a0, 0x18258, 0x10da0, 0x186d8, 0x1824c, 0x10d90, 0x186cc, 0x10d88,
+     0x186c6, 0x10d84, 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee,
+     0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, 0x1c748, 0x1c744,
+     0x1c742, 0x18650, 0x18ed0, 0x1c76c, 0x1c326, 0x18ec8, 0x1c766, 0x18ec4,
+     0x18642, 0x18ec2, 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8,
+     0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, 0x1046c, 0x10cec,
+     0x10466, 0x11dec, 0x10ce6, 0x11de6, 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728,
+     0x1cf68, 0x1e7b6, 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68,
+     0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, 0x19ee2, 0x10428,
+     0x18216, 0x10c68, 0x18636, 0x11ce8, 0x10c64, 0x10422, 0x13de8, 0x11ce4,
+     0x10c62, 0x13de4, 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4,
+     0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, 0x1cf34, 0x1c712,
+     0x1df74, 0x1cf32, 0x1df72, 0x18614, 0x18e34, 0x18612, 0x19e74, 0x18e32,
+     0x1bef4},
+    {0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, 0x1f518, 0x1fa8e,
+     0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade,
+     0x1d640, 0x1eb30, 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c,
+     0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, 0x1ae40, 0x1d730,
+     0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706,
+     0x1ae04, 0x1af60, 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20,
+     0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, 0x15f60, 0x1afb8,
+     0x1d7de, 0x15f30, 0x1af9c, 0x15f18, 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde,
+     0x15f9c, 0x15f8e, 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e,
+     0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, 0x1d340, 0x1e9b0,
+     0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, 0x1d310, 0x1e98c, 0x1d308, 0x1e986,
+     0x1d304, 0x1d302, 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce,
+     0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, 0x14f40, 0x1a7b0,
+     0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, 0x14f10, 0x1a78c, 0x14f08, 0x1a786,
+     0x14f04, 0x14fb0, 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc,
+     0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, 0x1e888, 0x1f446,
+     0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188,
+     0x1e8c6, 0x1d184, 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc,
+     0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, 0x1d1ee, 0x14790,
+     0x1a3cc, 0x14788, 0x1a3c6, 0x14784, 0x14782, 0x147d8, 0x1a3ee, 0x147cc,
+     0x147c6, 0x147ee, 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842,
+     0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, 0x1a1d0, 0x1d0ec,
+     0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6,
+     0x143c4, 0x143c2, 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822,
+     0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, 0x1a0e4, 0x1a0e2,
+     0x141e8, 0x1a0f6, 0x141e4, 0x141e2, 0x1e814, 0x1e812, 0x1d034, 0x1d032,
+     0x1a074, 0x1a072, 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e,
+     0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, 0x1cb40, 0x1e5b0,
+     0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586,
+     0x1cb04, 0x1cb02, 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce,
+     0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, 0x12f40, 0x197b0,
+     0x1cbdc, 0x12f20, 0x19798, 0x1cbce, 0x12f10, 0x1978c, 0x12f08, 0x19786,
+     0x12f04, 0x12fb0, 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc,
+     0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, 0x169f8, 0x1f688,
+     0x1fb46, 0x168fc, 0x1f684, 0x1f682, 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0,
+     0x1e490, 0x1fb6e, 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84,
+     0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, 0x1c990, 0x1e4cc,
+     0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, 0x1c984, 0x1db84, 0x1c982, 0x1db82,
+     0x193a0, 0x1c9d8, 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc,
+     0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, 0x127a0, 0x193d8,
+     0x1c9ee, 0x16fa0, 0x12790, 0x193cc, 0x16f90, 0x1b7cc, 0x193c6, 0x16f88,
+     0x12784, 0x16f84, 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc,
+     0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, 0x1f648, 0x1fb26,
+     0x164fc, 0x1f644, 0x1647e, 0x1f642, 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448,
+     0x1f226, 0x1ecc8, 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c,
+     0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, 0x1c8c2, 0x1d9c2,
+     0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4,
+     0x191c2, 0x1b3c2, 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8,
+     0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, 0x123e6, 0x167e6,
+     0x1f628, 0x1fb16, 0x162fc, 0x1f624, 0x1627e, 0x1f622, 0x1e428, 0x1f216,
+     0x1ec68, 0x1f636, 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8,
+     0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, 0x1b1e8, 0x1d8f6,
+     0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, 0x190f6, 0x163e8, 0x121e4, 0x163e4,
+     0x121e2, 0x163e2, 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414,
+     0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, 0x1d872, 0x19074,
+     0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, 0x161f4, 0x120f2, 0x161f2, 0x1f60a,
+     0x1e40a, 0x1ec1a, 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158,
+     0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, 0x1e282, 0x1c5a0,
+     0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, 0x1c588, 0x1e2c6, 0x1c584, 0x1c582,
+     0x18ba0, 0x1c5d8, 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84,
+     0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, 0x11788, 0x18bc6,
+     0x11784, 0x11782, 0x117d8, 0x18bee, 0x117cc, 0x117c6, 0x117ee, 0x1f350,
+     0x1f9ac, 0x135f8, 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342,
+     0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, 0x1f366, 0x1e6c4,
+     0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8,
+     0x1e6e6, 0x1cdc4, 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8,
+     0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, 0x113d0, 0x189ec,
+     0x137d0, 0x113c8, 0x189e6, 0x137c8, 0x19be6, 0x137c4, 0x113c2, 0x137c2,
+     0x113ec, 0x137ec, 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4,
+     0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, 0x1f996, 0x132fc,
+     0x1f768, 0x1fbb6, 0x176fc, 0x1327e, 0x1f764, 0x1f322, 0x1767e, 0x1f762,
+     0x1e228, 0x1f116, 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4,
+     0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, 0x1dde8, 0x1cce4,
+     0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, 0x188e8, 0x1c476, 0x199e8, 0x188e4,
+     0x1bbe8, 0x199e4, 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6,
+     0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, 0x133e2, 0x177e2,
+     0x111f6, 0x133f6, 0x1fb94, 0x172f8, 0x1b97e, 0x1fb92, 0x1727c, 0x1723e,
+     0x1f314, 0x1317e, 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634,
+     0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, 0x1c432, 0x1dcf4,
+     0x1cc72, 0x1dcf2, 0x18874, 0x198f4, 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2,
+     0x110f4, 0x131f4, 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c,
+     0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, 0x1c41a, 0x1cc3a,
+     0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, 0x1107a, 0x130fa, 0x171fa, 0x170be,
+     0x1e150, 0x1f0ac, 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c,
+     0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, 0x185c8, 0x1c2e6,
+     0x185c4, 0x185c2, 0x10bd0, 0x185ec, 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2,
+     0x10bec, 0x10be6, 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2,
+     0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, 0x1e362, 0x1c268,
+     0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, 0x1c262, 0x1c6e2, 0x184e8, 0x1c276,
+     0x18de8, 0x184e4, 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8,
+     0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, 0x1f9d4, 0x13af8,
+     0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, 0x1f194, 0x1197e, 0x1f3b4, 0x1f192,
+     0x13b7e, 0x1f3b2, 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772,
+     0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, 0x18474, 0x18cf4,
+     0x18472, 0x19df4, 0x18cf2, 0x19df2, 0x108f4, 0x119f4, 0x108f2, 0x13bf4,
+     0x119f2, 0x13bf2, 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e,
+     0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, 0x1f18a, 0x1f39a,
+     0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a,
+     0x1defa, 0x1843a, 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa,
+     0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, 0x178bc, 0x1789e,
+     0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, 0x1c168, 0x1e0b6, 0x1c164, 0x1c162,
+     0x182e8, 0x1c176, 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2,
+     0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, 0x1e092, 0x1e1b2,
+     0x1c134, 0x1c374, 0x1c132, 0x1c372, 0x18274, 0x186f4, 0x18272, 0x186f2,
+     0x104f4, 0x10df4, 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca,
+     0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, 0x1c77a, 0x1823a,
+     0x1867a, 0x18efa, 0x1047a, 0x10cfa, 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c,
+     0x13d1e, 0x11cbe, 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c,
+     0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, 0x1be5e, 0x17c9c,
+     0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2,
+     0x18174, 0x18172, 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a,
+     0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, 0x13eb8, 0x19f5e,
+     0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e,
+     0x17e8c, 0x17e86, 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e,
+     0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, 0x10f5e, 0x11f5c,
+     0x11f4e, 0x13f58, 0x19fae, 0x13f4c, 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c,
+     0x13f26},
+    {0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, 0x1a8f8, 0x1d47e,
+     0x150f0, 0x1a87c, 0x15078, 0x1fad0, 0x15be0, 0x1adf8, 0x1fac8, 0x159f0,
+     0x1acfc, 0x1fac4, 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec,
+     0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, 0x1f5c2, 0x1ebd0,
+     0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8,
+     0x1ebe6, 0x1d7c4, 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4,
+     0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, 0x148f0, 0x1a47c,
+     0x14878, 0x1a43e, 0x1483c, 0x1fa68, 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8,
+     0x1a67e, 0x1fa62, 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4,
+     0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, 0x1d3e8, 0x1e9f6,
+     0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8,
+     0x1d17e, 0x144f0, 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34,
+     0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, 0x1477e, 0x1f472,
+     0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c,
+     0x14278, 0x1a13e, 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a,
+     0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, 0x141be, 0x140bc,
+     0x1409e, 0x12bc0, 0x195f0, 0x1cafc, 0x129e0, 0x194f8, 0x1ca7e, 0x128f0,
+     0x1947c, 0x12878, 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964,
+     0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, 0x1f976, 0x12efc,
+     0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8,
+     0x1e5f6, 0x1cbe4, 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0,
+     0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, 0x1b478, 0x1da3e,
+     0x16870, 0x1b43c, 0x16838, 0x1b41e, 0x1681c, 0x125e0, 0x192f8, 0x1c97e,
+     0x16de0, 0x124f0, 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c,
+     0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, 0x1fb74, 0x1f932,
+     0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, 0x1263e, 0x16e3e, 0x1f274, 0x1277e,
+     0x1f6f4, 0x1f272, 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2,
+     0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, 0x165c0, 0x1b2f0,
+     0x1d97c, 0x164e0, 0x1b278, 0x1d93e, 0x16470, 0x1b23c, 0x16438, 0x1b21e,
+     0x1641c, 0x1640e, 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678,
+     0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, 0x1fb3a, 0x1677c,
+     0x1233e, 0x1673e, 0x1f23a, 0x1f67a, 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa,
+     0x191fa, 0x162e0, 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e,
+     0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, 0x1633c, 0x1211e,
+     0x1631e, 0x121be, 0x163be, 0x16170, 0x1b0bc, 0x16138, 0x1b09e, 0x1611c,
+     0x1610e, 0x120bc, 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c,
+     0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, 0x18af8, 0x1c57e,
+     0x114f0, 0x18a7c, 0x11478, 0x18a3e, 0x1143c, 0x1141e, 0x1f8b4, 0x116f8,
+     0x18b7e, 0x1f8b2, 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4,
+     0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, 0x19af0, 0x1cd7c,
+     0x134e0, 0x19a78, 0x1cd3e, 0x13470, 0x19a3c, 0x13438, 0x19a1e, 0x1341c,
+     0x1340e, 0x112f0, 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e,
+     0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, 0x1377c, 0x1133e,
+     0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa,
+     0x1bae0, 0x1dd78, 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38,
+     0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, 0x132e0, 0x19978,
+     0x1ccbe, 0x176e0, 0x13270, 0x1993c, 0x17670, 0x1bb3c, 0x1991e, 0x17638,
+     0x1321c, 0x1761c, 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c,
+     0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, 0x111be, 0x133be,
+     0x177be, 0x172c0, 0x1b970, 0x1dcbc, 0x17260, 0x1b938, 0x1dc9e, 0x17230,
+     0x1b91c, 0x17218, 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370,
+     0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, 0x1730e, 0x110bc,
+     0x131bc, 0x1109e, 0x173bc, 0x1319e, 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e,
+     0x17130, 0x1b89c, 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e,
+     0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, 0x130de, 0x171de,
+     0x170b0, 0x1b85c, 0x17098, 0x1b84e, 0x1708c, 0x17086, 0x1305c, 0x170dc,
+     0x1304e, 0x170ce, 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e,
+     0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, 0x10a3c, 0x10a1e,
+     0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78,
+     0x1c6be, 0x11a70, 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978,
+     0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, 0x109be, 0x11bbe,
+     0x13ac0, 0x19d70, 0x1cebc, 0x13a60, 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c,
+     0x13a18, 0x19d0e, 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938,
+     0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, 0x108bc, 0x119bc,
+     0x1089e, 0x13bbc, 0x1199e, 0x13b9e, 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40,
+     0x1bd30, 0x1de9c, 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08,
+     0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, 0x13930, 0x19c9c,
+     0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, 0x1390c, 0x17b0c, 0x13906, 0x17b06,
+     0x118b8, 0x18c5e, 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c,
+     0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, 0x17940, 0x1bcb0,
+     0x1de5c, 0x17920, 0x1bc98, 0x1de4e, 0x17910, 0x1bc8c, 0x17908, 0x1bc86,
+     0x17904, 0x17902, 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998,
+     0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, 0x1184e, 0x179dc,
+     0x138ce, 0x179ce, 0x178a0, 0x1bc58, 0x1de2e, 0x17890, 0x1bc4c, 0x17888,
+     0x1bc46, 0x17884, 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc,
+     0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, 0x1bc2c, 0x17848,
+     0x1bc26, 0x17844, 0x17842, 0x1382c, 0x1786c, 0x13826, 0x17866, 0x17828,
+     0x1bc16, 0x17824, 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c,
+     0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, 0x10d1c, 0x10d0e,
+     0x104bc, 0x10dbc, 0x1049e, 0x10d9e, 0x11d60, 0x18eb8, 0x1c75e, 0x11d30,
+     0x18e9c, 0x11d18, 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8,
+     0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, 0x11dde, 0x13d40,
+     0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08,
+     0x19e86, 0x13d04, 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e,
+     0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, 0x11cdc, 0x10c4e,
+     0x13ddc, 0x11cce, 0x13dce, 0x1bea0, 0x1df58, 0x1efae, 0x1be90, 0x1df4c,
+     0x1be88, 0x1df46, 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0,
+     0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, 0x13c84, 0x17d84,
+     0x13c82, 0x17d82, 0x11c58, 0x18e2e, 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc,
+     0x11c46, 0x17dcc, 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee,
+     0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, 0x13c50, 0x19e2c,
+     0x17cd0, 0x13c48, 0x19e26, 0x17cc8, 0x1be66, 0x17cc4, 0x13c42, 0x17cc2,
+     0x11c2c, 0x13c6c, 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16,
+     0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, 0x17c64, 0x13c22,
+     0x17c62, 0x11c16, 0x13c36, 0x17c76, 0x1be14, 0x1be12, 0x13c14, 0x17c34,
+     0x13c12, 0x17c32, 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e,
+     0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, 0x10e8c, 0x10e86,
+     0x1065c, 0x10edc, 0x1064e, 0x10ece, 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90,
+     0x18f4c, 0x11e88, 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8,
+     0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, 0x11eee, 0x19f50,
+     0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, 0x19f42, 0x11e50, 0x18f2c, 0x13ed0,
+     0x19f6c, 0x18f26, 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c,
+     0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, 0x1efd6, 0x1dfa4,
+     0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, 0x19f24, 0x1bf64, 0x19f22, 0x1bf62,
+     0x11e28, 0x18f16, 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4,
+     0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, 0x1df94, 0x1df92,
+     0x19f14, 0x1bf34, 0x19f12, 0x1bf32, 0x11e14, 0x13e34, 0x11e12, 0x17e74,
+     0x13e32, 0x17e72, 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a,
+     0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, 0x1032e, 0x1076e,
+     0x10f50, 0x187ac, 0x10f48, 0x187a6, 0x10f44, 0x10f42, 0x1072c, 0x10f6c,
+     0x10726, 0x10f66, 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796,
+     0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, 0x10f36, 0x11f76,
+     0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, 0x18f92, 0x19fb2, 0x10f14, 0x11f34,
+     0x10f12, 0x13f74, 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a,
+     0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, 0x107a4, 0x107a2,
+     0x10396, 0x107b6, 0x187d4, 0x187d2, 0x10794, 0x10fb4, 0x10792, 0x10fb2,
+     0x1c7ea}};
+FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f;
+FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f;
+FX_FLOAT CBC_PDF417::HEIGHT = 2.0f;
+CBC_PDF417::CBC_PDF417() {
+  m_compact = FALSE;
+  m_compaction = AUTO;
+  m_minCols = 1;
+  m_maxCols = 30;
+  m_maxRows = 90;
+  m_minRows = 3;
+  m_barcodeMatrix = NULL;
+}
+CBC_PDF417::CBC_PDF417(FX_BOOL compact) {
+  m_compact = compact;
+  m_compaction = AUTO;
+  m_minCols = 1;
+  m_maxCols = 30;
+  m_maxRows = 90;
+  m_minRows = 3;
+  m_barcodeMatrix = NULL;
+}
+CBC_PDF417::~CBC_PDF417() {
+  if (m_barcodeMatrix) {
+    delete m_barcodeMatrix;
+  }
+}
+CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() {
+  return m_barcodeMatrix;
+}
+void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg,
+                                      int32_t errorCorrectionLevel,
+                                      int32_t& e) {
+  int32_t errorCorrectionCodeWords =
+      CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
+          errorCorrectionLevel, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CFX_WideString highLevel =
+      CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t sourceCodeWords = highLevel.GetLength();
+  CFX_Int32Array* dimension =
+      determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t cols = dimension->GetAt(0);
+  int32_t rows = dimension->GetAt(1);
+  delete dimension;
+  int32_t pad = getNumberOfPadCodewords(sourceCodeWords,
+                                        errorCorrectionCodeWords, cols, rows);
+  if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) {
+    e = BCExceptionEncodedMessageContainsTooManyCodeWords;
+    return;
+  }
+  int32_t n = sourceCodeWords + pad + 1;
+  CFX_WideString sb;
+  sb += (FX_WCHAR)n;
+  sb += highLevel;
+  for (int32_t i = 0; i < pad; i++) {
+    sb += (FX_WCHAR)900;
+  }
+  CFX_WideString dataCodewords(sb);
+  CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(
+      dataCodewords, errorCorrectionLevel, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CFX_WideString fullCodewords = dataCodewords + ec;
+  m_barcodeMatrix = new CBC_BarcodeMatrix(rows, cols);
+  encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel,
+                 m_barcodeMatrix);
+}
+void CBC_PDF417::setDimensions(int32_t maxCols,
+                               int32_t minCols,
+                               int32_t maxRows,
+                               int32_t minRows) {
+  m_maxCols = maxCols;
+  m_minCols = minCols;
+  m_maxRows = maxRows;
+  m_minRows = minRows;
+}
+void CBC_PDF417::setCompaction(Compaction compaction) {
+  m_compaction = compaction;
+}
+void CBC_PDF417::setCompact(FX_BOOL compact) {
+  m_compact = compact;
+}
+int32_t CBC_PDF417::calculateNumberOfRows(int32_t m, int32_t k, int32_t c) {
+  int32_t r = ((m + 1 + k) / c) + 1;
+  if (c * r >= (m + 1 + k + c)) {
+    r--;
+  }
+  return r;
+}
+int32_t CBC_PDF417::getNumberOfPadCodewords(int32_t m,
+                                            int32_t k,
+                                            int32_t c,
+                                            int32_t r) {
+  int32_t n = c * r - k;
+  return n > m + 1 ? n - m - 1 : 0;
+}
+void CBC_PDF417::encodeChar(int32_t pattern,
+                            int32_t len,
+                            CBC_BarcodeRow* logic) {
+  int32_t map = 1 << (len - 1);
+  FX_BOOL last = ((pattern & map) != 0);
+  int32_t width = 0;
+  for (int32_t i = 0; i < len; i++) {
+    FX_BOOL black = ((pattern & map) != 0);
+    if (last == black) {
+      width++;
+    } else {
+      logic->addBar(last, width);
+      last = black;
+      width = 1;
+    }
+    map >>= 1;
+  }
+  logic->addBar(last, width);
+}
+void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords,
+                                int32_t c,
+                                int32_t r,
+                                int32_t errorCorrectionLevel,
+                                CBC_BarcodeMatrix* logic) {
+  int32_t idx = 0;
+  for (int32_t y = 0; y < r; y++) {
+    int32_t cluster = y % 3;
+    logic->startRow();
+    encodeChar(START_PATTERN, 17, logic->getCurrentRow());
+    int32_t left;
+    int32_t right;
+    if (cluster == 0) {
+      left = (30 * (y / 3)) + ((r - 1) / 3);
+      right = (30 * (y / 3)) + (c - 1);
+    } else if (cluster == 1) {
+      left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);
+      right = (30 * (y / 3)) + ((r - 1) / 3);
+    } else {
+      left = (30 * (y / 3)) + (c - 1);
+      right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);
+    }
+    int32_t pattern = CODEWORD_TABLE[cluster][left];
+    encodeChar(pattern, 17, logic->getCurrentRow());
+    for (int32_t x = 0; x < c; x++) {
+      pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)];
+      encodeChar(pattern, 17, logic->getCurrentRow());
+      idx++;
+    }
+    if (m_compact) {
+      encodeChar(STOP_PATTERN, 1, logic->getCurrentRow());
+    } else {
+      pattern = CODEWORD_TABLE[cluster][right];
+      encodeChar(pattern, 17, logic->getCurrentRow());
+      encodeChar(STOP_PATTERN, 18, logic->getCurrentRow());
+    }
+  }
+}
+CFX_Int32Array* CBC_PDF417::determineDimensions(
+    int32_t sourceCodeWords,
+    int32_t errorCorrectionCodeWords,
+    int32_t& e) {
+  FX_FLOAT ratio = 0.0f;
+  CFX_Int32Array* dimension = NULL;
+  for (int32_t cols = m_minCols; cols <= m_maxCols; cols++) {
+    int32_t rows =
+        calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);
+    if (rows < m_minRows) {
+      break;
+    }
+    if (rows > m_maxRows) {
+      continue;
+    }
+    FX_FLOAT newRatio =
+        ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT);
+    if (dimension &&
+        fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) {
+      continue;
+    }
+    ratio = newRatio;
+    if (dimension) {
+      delete dimension;
+    }
+    dimension = new CFX_Int32Array;
+    dimension->Add(cols);
+    dimension->Add(rows);
+  }
+  if (dimension == NULL) {
+    int32_t rows = calculateNumberOfRows(sourceCodeWords,
+                                         errorCorrectionCodeWords, m_minCols);
+    if (rows < m_minRows) {
+      dimension = new CFX_Int32Array;
+      dimension->Add(m_minCols);
+      dimension->Add(m_minRows);
+    } else if (rows >= 3 && rows <= 90) {
+      dimension = new CFX_Int32Array;
+      dimension->Add(m_minCols);
+      dimension->Add(rows);
+    }
+  }
+  if (dimension == NULL) {
+    e = BCExceptionUnableToFitMessageInColumns;
+    return NULL;
+  }
+  return dimension;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417.h b/xfa/fxbarcode/pdf417/BC_PDF417.h
new file mode 100644
index 0000000..fe279db
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+
+class CBC_BarcodeRow;
+class CBC_BarcodeMatrix;
+
+class CBC_PDF417 {
+ public:
+  CBC_PDF417();
+  CBC_PDF417(FX_BOOL compact);
+  virtual ~CBC_PDF417();
+  CBC_BarcodeMatrix* getBarcodeMatrix();
+  void generateBarcodeLogic(CFX_WideString msg,
+                            int32_t errorCorrectionLevel,
+                            int32_t& e);
+  void setDimensions(int32_t maxCols,
+                     int32_t minCols,
+                     int32_t maxRows,
+                     int32_t minRows);
+  void setCompaction(Compaction compaction);
+  void setCompact(FX_BOOL compact);
+
+ private:
+  static int32_t START_PATTERN;
+  static int32_t STOP_PATTERN;
+  static int32_t CODEWORD_TABLE[][1000];
+  static FX_FLOAT PREFERRED_RATIO;
+  static FX_FLOAT DEFAULT_MODULE_WIDTH;
+  static FX_FLOAT HEIGHT;
+  CBC_BarcodeMatrix* m_barcodeMatrix;
+  FX_BOOL m_compact;
+  Compaction m_compaction;
+  int32_t m_minCols;
+  int32_t m_maxCols;
+  int32_t m_maxRows;
+  int32_t m_minRows;
+
+ private:
+  static int32_t calculateNumberOfRows(int32_t m, int32_t k, int32_t c);
+  static int32_t getNumberOfPadCodewords(int32_t m,
+                                         int32_t k,
+                                         int32_t c,
+                                         int32_t r);
+  static void encodeChar(int32_t pattern, int32_t len, CBC_BarcodeRow* logic);
+  void encodeLowLevel(CFX_WideString fullCodewords,
+                      int32_t c,
+                      int32_t r,
+                      int32_t errorCorrectionLevel,
+                      CBC_BarcodeMatrix* logic);
+  CFX_Int32Array* determineDimensions(int32_t sourceCodeWords,
+                                      int32_t errorCorrectionCodeWords,
+                                      int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
new file mode 100644
index 0000000..47255fa
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
@@ -0,0 +1,90 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
+
+CBC_BarcodeMatrix::CBC_BarcodeMatrix(int32_t height, int32_t width) {
+  m_matrix.SetSize(height + 2);
+  for (int32_t i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength;
+       i++) {
+    m_matrix[i] = new CBC_BarcodeRow((width + 4) * 17 + 1);
+  }
+  m_width = width * 17;
+  m_height = height + 2;
+  m_currentRow = 0;
+  m_outHeight = 0;
+  m_outWidth = 0;
+}
+CBC_BarcodeMatrix::~CBC_BarcodeMatrix() {
+  for (int32_t i = 0; i < m_matrix.GetSize(); i++) {
+    delete (CBC_BarcodeRow*)m_matrix.GetAt(i);
+  }
+  m_matrix.RemoveAll();
+  m_matrixOut.RemoveAll();
+}
+void CBC_BarcodeMatrix::set(int32_t x, int32_t y, uint8_t value) {
+  ((CBC_BarcodeRow*)m_matrix[y])->set(x, value);
+}
+void CBC_BarcodeMatrix::setMatrix(int32_t x, int32_t y, FX_BOOL black) {
+  set(x, y, (uint8_t)(black ? 1 : 0));
+}
+void CBC_BarcodeMatrix::startRow() {
+  ++m_currentRow;
+}
+CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow() {
+  return (CBC_BarcodeRow*)m_matrix[m_currentRow];
+}
+int32_t CBC_BarcodeMatrix::getWidth() {
+  return m_outWidth;
+}
+int32_t CBC_BarcodeMatrix::getHeight() {
+  return m_outHeight;
+}
+CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() {
+  return getScaledMatrix(1, 1);
+}
+CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t scale) {
+  return getScaledMatrix(scale, scale);
+}
+CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t xScale,
+                                                  int32_t yScale) {
+  int32_t yMax = m_height * yScale;
+  CFX_ByteArray bytearray;
+  bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale));
+  int32_t xMax = bytearray.GetSize();
+  m_matrixOut.SetSize(xMax * yMax);
+  m_outWidth = xMax;
+  m_outHeight = yMax;
+  int32_t k = 0;
+  for (int32_t i = 0; i < yMax; i++) {
+    if (i != 0) {
+      bytearray.Copy(
+          ((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale));
+    }
+    k = i * xMax;
+    for (int32_t l = 0; l < xMax; l++) {
+      m_matrixOut[k + l] = bytearray.GetAt(l);
+    }
+  }
+  return m_matrixOut;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
new file mode 100644
index 0000000..21ee44b
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_BarcodeRow;
+class CBC_BarcodeMatrix {
+ public:
+  CBC_BarcodeMatrix();
+  CBC_BarcodeMatrix(int32_t height, int32_t width);
+  virtual ~CBC_BarcodeMatrix();
+  void set(int32_t x, int32_t y, uint8_t value);
+  void setMatrix(int32_t x, int32_t y, FX_BOOL black);
+  void startRow();
+  CBC_BarcodeRow* getCurrentRow();
+  CFX_ByteArray& getMatrix();
+  CFX_ByteArray& getScaledMatrix(int32_t scale);
+  CFX_ByteArray& getScaledMatrix(int32_t xScale, int32_t yScale);
+  int32_t getWidth();
+  int32_t getHeight();
+
+ private:
+  CFX_PtrArray m_matrix;
+  CFX_ByteArray m_matrixOut;
+  int32_t m_currentRow;
+  int32_t m_height;
+  int32_t m_width;
+  int32_t m_outWidth;
+  int32_t m_outHeight;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp
new file mode 100644
index 0000000..ac59c6e
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+
+CBC_BarcodeMetadata::CBC_BarcodeMetadata(int32_t columnCount,
+                                         int32_t rowCountUpperPart,
+                                         int32_t rowCountLowerPart,
+                                         int32_t errorCorrectionLevel) {
+  m_columnCount = columnCount;
+  m_rowCountUpperPart = rowCountUpperPart;
+  m_rowCountLowerPart = rowCountLowerPart;
+  m_errorCorrectionLevel = errorCorrectionLevel;
+  m_rowCount = m_rowCountUpperPart + m_rowCountLowerPart;
+}
+CBC_BarcodeMetadata::~CBC_BarcodeMetadata() {}
+int32_t CBC_BarcodeMetadata::getColumnCount() {
+  return m_columnCount;
+}
+int32_t CBC_BarcodeMetadata::getErrorCorrectionLevel() {
+  return m_errorCorrectionLevel;
+}
+int32_t CBC_BarcodeMetadata::getRowCount() {
+  return m_rowCount;
+}
+int32_t CBC_BarcodeMetadata::getRowCountUpperPart() {
+  return m_rowCountUpperPart;
+}
+int32_t CBC_BarcodeMetadata::getRowCountLowerPart() {
+  return m_rowCountLowerPart;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h
new file mode 100644
index 0000000..2b398f1
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
+
+#include <stdint.h>
+
+class CBC_BarcodeMetadata {
+ public:
+  CBC_BarcodeMetadata(int32_t columnCount,
+                      int32_t rowCountUpperPart,
+                      int32_t rowCountLowerPart,
+                      int32_t errorCorrectionLevel);
+  virtual ~CBC_BarcodeMetadata();
+  int32_t getColumnCount();
+  int32_t getErrorCorrectionLevel();
+  int32_t getRowCount();
+  int32_t getRowCountUpperPart();
+  int32_t getRowCountLowerPart();
+
+ private:
+  int32_t m_columnCount;
+  int32_t m_errorCorrectionLevel;
+  int32_t m_rowCountUpperPart;
+  int32_t m_rowCountLowerPart;
+  int32_t m_rowCount;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
new file mode 100644
index 0000000..6f88b33
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
+
+CBC_BarcodeRow::CBC_BarcodeRow(int32_t width) {
+  m_row.SetSize(width);
+  m_currentLocation = 0;
+}
+CBC_BarcodeRow::~CBC_BarcodeRow() {
+  m_output.RemoveAll();
+  m_row.RemoveAll();
+}
+void CBC_BarcodeRow::set(int32_t x, uint8_t value) {
+  m_row.SetAt(x, value);
+}
+void CBC_BarcodeRow::set(int32_t x, FX_BOOL black) {
+  m_row.SetAt(x, (uint8_t)(black ? 1 : 0));
+}
+void CBC_BarcodeRow::addBar(FX_BOOL black, int32_t width) {
+  for (int32_t ii = 0; ii < width; ii++) {
+    set(m_currentLocation++, black);
+  }
+}
+CFX_ByteArray& CBC_BarcodeRow::getRow() {
+  return m_row;
+}
+CFX_ByteArray& CBC_BarcodeRow::getScaledRow(int32_t scale) {
+  m_output.SetSize(m_row.GetSize() * scale);
+  for (int32_t i = 0; i < m_output.GetSize(); i++) {
+    m_output[i] = (m_row[i / scale]);
+  }
+  return m_output;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
new file mode 100644
index 0000000..007876a
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_BarcodeRow {
+ public:
+  CBC_BarcodeRow(int32_t width);
+  virtual ~CBC_BarcodeRow();
+  void set(int32_t x, uint8_t value);
+  void set(int32_t x, FX_BOOL black);
+  void addBar(FX_BOOL black, int32_t width);
+  CFX_ByteArray& getRow();
+  CFX_ByteArray& getScaledRow(int32_t scale);
+
+ private:
+  CFX_ByteArray m_row;
+  CFX_ByteArray m_output;
+  int32_t m_currentLocation;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp
new file mode 100644
index 0000000..eb89546
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+
+CBC_BarcodeValue::CBC_BarcodeValue() {}
+CBC_BarcodeValue::~CBC_BarcodeValue() {}
+void CBC_BarcodeValue::setValue(int32_t value) {
+  int32_t confidence = 0;
+  for (int32_t i = 0; i < m_keys.GetSize(); i++) {
+    if (m_keys.GetAt(i) == value) {
+      confidence = m_values.GetAt(i);
+      m_values.SetAt(i, confidence + 1);
+      return;
+    }
+  }
+  confidence = 1;
+  m_keys.Add(value);
+  m_values.Add(confidence);
+}
+CFX_Int32Array* CBC_BarcodeValue::getValue() {
+  int32_t maxConfidence = -1;
+  CFX_Int32Array* result = new CFX_Int32Array;
+  for (int32_t i = 0; i < m_keys.GetSize(); i++) {
+    if (m_values.GetAt(i) > maxConfidence) {
+      maxConfidence = m_values.GetAt(i);
+      result->RemoveAll();
+      result->Add(m_keys.GetAt(i));
+    } else if (m_values.GetAt(i) == maxConfidence) {
+      result->Add(m_keys.GetAt(i));
+    }
+  }
+  return result;
+}
+int32_t CBC_BarcodeValue::getConfidence(int32_t value) {
+  for (int32_t i = 0; i < m_keys.GetSize(); i++)
+    if (m_keys.GetAt(i) == value) {
+      return m_values.GetAt(i);
+    }
+  return -1;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
new file mode 100644
index 0000000..e99fb84
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_BarcodeValue {
+ public:
+  CBC_BarcodeValue();
+  virtual ~CBC_BarcodeValue();
+  void setValue(int32_t value);
+  CFX_Int32Array* getValue();
+  int32_t getConfidence(int32_t value);
+
+ private:
+  CFX_Int32Array m_keys;
+  CFX_Int32Array m_values;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp
new file mode 100644
index 0000000..c8328ab
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp
@@ -0,0 +1,207 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image,
+                                 CBC_ResultPoint* topLeft,
+                                 CBC_ResultPoint* bottomLeft,
+                                 CBC_ResultPoint* topRight,
+                                 CBC_ResultPoint* bottomRight,
+                                 int32_t& e) {
+  if ((topLeft == NULL && topRight == NULL) ||
+      (bottomLeft == NULL && bottomRight == NULL) ||
+      (topLeft && bottomLeft == NULL) || (topRight && bottomRight == NULL)) {
+    e = BCExceptionNotFoundInstance;
+  }
+  init(image, topLeft, bottomLeft, topRight, bottomRight);
+}
+CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) {
+  init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft,
+       boundingBox->m_topRight, boundingBox->m_bottomRight);
+}
+CBC_BoundingBox::~CBC_BoundingBox() {
+  if (m_topLeft) {
+    delete m_topLeft;
+  }
+  if (m_bottomLeft) {
+    delete m_bottomLeft;
+  }
+  if (m_topRight) {
+    delete m_topRight;
+  }
+  if (m_bottomRight) {
+    delete m_bottomRight;
+  }
+}
+CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox,
+                                        CBC_BoundingBox* rightBox,
+                                        int32_t& e) {
+  CBC_BoundingBox* boundingBox = NULL;
+  if (leftBox == NULL) {
+    boundingBox = new CBC_BoundingBox(rightBox);
+    return boundingBox;
+  }
+  if (rightBox == NULL) {
+    boundingBox = new CBC_BoundingBox(leftBox);
+    return boundingBox;
+  }
+  boundingBox = new CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft,
+                                    leftBox->m_bottomLeft, rightBox->m_topRight,
+                                    rightBox->m_bottomRight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return boundingBox;
+}
+CBC_BoundingBox* CBC_BoundingBox::addMissingRows(int32_t missingStartRows,
+                                                 int32_t missingEndRows,
+                                                 FX_BOOL isLeft,
+                                                 int32_t& e) {
+  CBC_ResultPoint* newTopLeft = m_topLeft;
+  CBC_ResultPoint* newBottomLeft = m_bottomLeft;
+  CBC_ResultPoint* newTopRight = m_topRight;
+  CBC_ResultPoint* newBottomRight = m_bottomRight;
+  CBC_ResultPoint* newTop = NULL;
+  CBC_ResultPoint* newBottom = NULL;
+  if (missingStartRows > 0) {
+    CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight;
+    int32_t newMinY = (int32_t)top->GetY() - missingStartRows;
+    if (newMinY < 0) {
+      newMinY = 0;
+    }
+    newTop = new CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY);
+    if (isLeft) {
+      newTopLeft = newTop;
+    } else {
+      newTopRight = newTop;
+    }
+  }
+  if (missingEndRows > 0) {
+    CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight;
+    int32_t newMaxY = (int32_t)bottom->GetY() + missingEndRows;
+    if (newMaxY >= m_image->GetHeight()) {
+      newMaxY = m_image->GetHeight() - 1;
+    }
+    newBottom =
+        new CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY);
+    if (isLeft) {
+      newBottomLeft = newBottom;
+    } else {
+      newBottomRight = newBottom;
+    }
+  }
+  calculateMinMaxValues();
+  CBC_BoundingBox* boundingBox = new CBC_BoundingBox(
+      m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e);
+  delete newTop;
+  delete newBottom;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return boundingBox;
+}
+void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) {
+  if (m_topRight) {
+    delete m_topRight;
+  }
+  m_topRight = new CBC_ResultPoint(topRight.GetX(), topRight.GetY());
+  calculateMinMaxValues();
+}
+void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) {
+  if (m_bottomRight) {
+    delete m_bottomRight;
+  }
+  m_bottomRight = new CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY());
+  calculateMinMaxValues();
+}
+int32_t CBC_BoundingBox::getMinX() {
+  return m_minX;
+}
+int32_t CBC_BoundingBox::getMaxX() {
+  return m_maxX;
+}
+int32_t CBC_BoundingBox::getMinY() {
+  return m_minY;
+}
+int32_t CBC_BoundingBox::getMaxY() {
+  return m_maxY;
+}
+CBC_ResultPoint* CBC_BoundingBox::getTopLeft() {
+  return m_topLeft;
+}
+CBC_ResultPoint* CBC_BoundingBox::getTopRight() {
+  return m_topRight;
+}
+CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() {
+  return m_bottomLeft;
+}
+CBC_ResultPoint* CBC_BoundingBox::getBottomRight() {
+  return m_bottomRight;
+}
+void CBC_BoundingBox::init(CBC_CommonBitMatrix* image,
+                           CBC_ResultPoint* topLeft,
+                           CBC_ResultPoint* bottomLeft,
+                           CBC_ResultPoint* topRight,
+                           CBC_ResultPoint* bottomRight) {
+  m_topLeft = NULL;
+  m_bottomLeft = NULL;
+  m_topRight = NULL;
+  m_bottomRight = NULL;
+  m_image = image;
+  if (topLeft) {
+    m_topLeft = new CBC_ResultPoint(topLeft->GetX(), topLeft->GetY());
+  }
+  if (bottomLeft) {
+    m_bottomLeft = new CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY());
+  }
+  if (topRight) {
+    m_topRight = new CBC_ResultPoint(topRight->GetX(), topRight->GetY());
+  }
+  if (bottomRight) {
+    m_bottomRight =
+        new CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY());
+  }
+  calculateMinMaxValues();
+}
+void CBC_BoundingBox::calculateMinMaxValues() {
+  if (m_topLeft == NULL) {
+    m_topLeft = new CBC_ResultPoint(0, m_topRight->GetY());
+    m_bottomLeft = new CBC_ResultPoint(0, m_bottomRight->GetY());
+  } else if (m_topRight == NULL) {
+    m_topRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1,
+                                     (FX_FLOAT)m_topLeft->GetY());
+    m_bottomRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1,
+                                        (FX_FLOAT)m_bottomLeft->GetY());
+  }
+  m_minX = (int32_t)(m_topLeft->GetX() < m_bottomLeft->GetX()
+                         ? m_topLeft->GetX()
+                         : m_bottomLeft->GetX());
+  m_maxX = (int32_t)(m_topRight->GetX() > m_bottomRight->GetX()
+                         ? m_topRight->GetX()
+                         : m_bottomRight->GetX());
+  m_minY =
+      (int32_t)(m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY()
+                                                       : m_topRight->GetY());
+  m_maxY = (int32_t)(m_bottomLeft->GetY() > m_bottomRight->GetY()
+                         ? m_bottomLeft->GetY()
+                         : m_bottomRight->GetY());
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h b/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h
new file mode 100644
index 0000000..8b95635
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CBC_CommonBitMatrix;
+class CBC_ResultPoint;
+
+class CBC_BoundingBox {
+ public:
+  CBC_BoundingBox(CBC_CommonBitMatrix* image,
+                  CBC_ResultPoint* topLeft,
+                  CBC_ResultPoint* bottomLeft,
+                  CBC_ResultPoint* topRight,
+                  CBC_ResultPoint* bottomRight,
+                  int32_t& e);
+  CBC_BoundingBox(CBC_BoundingBox* boundingBox);
+  virtual ~CBC_BoundingBox();
+  static CBC_BoundingBox* merge(CBC_BoundingBox* leftBox,
+                                CBC_BoundingBox* rightBox,
+                                int32_t& e);
+  CBC_BoundingBox* addMissingRows(int32_t missingStartRows,
+                                  int32_t missingEndRows,
+                                  FX_BOOL isLeft,
+                                  int32_t& e);
+  void setTopRight(CBC_ResultPoint topRight);
+  void setBottomRight(CBC_ResultPoint bottomRight);
+  int32_t getMinX();
+  int32_t getMaxX();
+  int32_t getMinY();
+  int32_t getMaxY();
+  CBC_ResultPoint* getTopLeft();
+  CBC_ResultPoint* getTopRight();
+  CBC_ResultPoint* getBottomLeft();
+  CBC_ResultPoint* getBottomRight();
+
+ private:
+  CBC_CommonBitMatrix* m_image;
+  CBC_ResultPoint* m_topLeft;
+  CBC_ResultPoint* m_bottomLeft;
+  CBC_ResultPoint* m_topRight;
+  CBC_ResultPoint* m_bottomRight;
+  int32_t m_minX;
+  int32_t m_maxX;
+  int32_t m_minY;
+  int32_t m_maxY;
+  void init(CBC_CommonBitMatrix* image,
+            CBC_ResultPoint* topLeft,
+            CBC_ResultPoint* bottomLeft,
+            CBC_ResultPoint* topRight,
+            CBC_ResultPoint* bottomRight);
+  void calculateMinMaxValues();
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp
new file mode 100644
index 0000000..0280ea0
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+
+int32_t CBC_Codeword::BARCODE_ROW_UNKNOWN = -1;
+CBC_Codeword::CBC_Codeword(int32_t startX,
+                           int32_t endX,
+                           int32_t bucket,
+                           int32_t cvalue) {
+  m_startX = startX;
+  m_endX = endX;
+  m_bucket = bucket;
+  m_value = cvalue;
+  m_rowNumber = BARCODE_ROW_UNKNOWN;
+}
+CBC_Codeword::~CBC_Codeword() {}
+FX_BOOL CBC_Codeword::hasValidRowNumber() {
+  return isValidRowNumber(m_rowNumber);
+}
+FX_BOOL CBC_Codeword::isValidRowNumber(int32_t rowNumber) {
+  return m_rowNumber != BARCODE_ROW_UNKNOWN &&
+         m_bucket == (m_rowNumber % 3) * 3;
+}
+void CBC_Codeword::setRowNumberAsRowIndicatorColumn() {
+  m_rowNumber = (m_value / 30) * 3 + m_bucket / 3;
+}
+int32_t CBC_Codeword::getWidth() {
+  return m_endX - m_startX;
+}
+int32_t CBC_Codeword::getStartX() {
+  return m_startX;
+}
+int32_t CBC_Codeword::getEndX() {
+  return m_endX;
+}
+int32_t CBC_Codeword::getBucket() {
+  return m_bucket;
+}
+int32_t CBC_Codeword::getValue() {
+  return m_value;
+}
+int32_t CBC_Codeword::getRowNumber() {
+  return m_rowNumber;
+}
+void CBC_Codeword::setRowNumber(int32_t rowNumber) {
+  m_rowNumber = rowNumber;
+}
+CFX_ByteString CBC_Codeword::toString() {
+  return m_rowNumber + (FX_CHAR)'|' + m_value;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h
new file mode 100644
index 0000000..e1ca60f
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_Codeword {
+ public:
+  CBC_Codeword(int32_t startX, int32_t endX, int32_t bucket, int32_t value);
+  virtual ~CBC_Codeword();
+  FX_BOOL hasValidRowNumber();
+  FX_BOOL isValidRowNumber(int32_t rowNumber);
+  void setRowNumberAsRowIndicatorColumn();
+  int32_t getWidth();
+  int32_t getStartX();
+  int32_t getEndX();
+  int32_t getBucket();
+  int32_t getValue();
+  int32_t getRowNumber();
+  void setRowNumber(int32_t rowNumber);
+  CFX_ByteString toString();
+
+ private:
+  static int32_t BARCODE_ROW_UNKNOWN;
+  int32_t m_startX;
+  int32_t m_endX;
+  int32_t m_bucket;
+  int32_t m_value;
+  int32_t m_rowNumber;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp b/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp
new file mode 100644
index 0000000..dfbbc70
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <limits>
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+
+#define SYMBOL_TABLE_Length 2787
+
+FX_FLOAT CBC_PDF417CodewordDecoder::RATIOS_TABLE[2787][8] = {{0}};
+
+CBC_PDF417CodewordDecoder::CBC_PDF417CodewordDecoder() {}
+CBC_PDF417CodewordDecoder::~CBC_PDF417CodewordDecoder() {}
+void CBC_PDF417CodewordDecoder::Initialize() {
+  for (int32_t i = 0; i < SYMBOL_TABLE_Length; i++) {
+    int32_t currentSymbol = CBC_PDF417Common::SYMBOL_TABLE[i];
+    int32_t currentBit = currentSymbol & 0x1;
+    for (int32_t j = 0; j < CBC_PDF417Common::BARS_IN_MODULE; j++) {
+      FX_FLOAT size = 0.0f;
+      while ((currentSymbol & 0x1) == currentBit) {
+        size += 1.0f;
+        currentSymbol >>= 1;
+      }
+      currentBit = currentSymbol & 0x1;
+      RATIOS_TABLE[i][CBC_PDF417Common::BARS_IN_MODULE - j - 1] =
+          size / CBC_PDF417Common::MODULES_IN_CODEWORD;
+    }
+  }
+}
+void CBC_PDF417CodewordDecoder::Finalize() {}
+int32_t CBC_PDF417CodewordDecoder::getDecodedValue(
+    CFX_Int32Array& moduleBitCount) {
+  CFX_Int32Array* array = sampleBitCounts(moduleBitCount);
+  int32_t decodedValue = getDecodedCodewordValue(*array);
+  delete array;
+  if (decodedValue != -1) {
+    return decodedValue;
+  }
+  return getClosestDecodedValue(moduleBitCount);
+}
+CFX_Int32Array* CBC_PDF417CodewordDecoder::sampleBitCounts(
+    CFX_Int32Array& moduleBitCount) {
+  FX_FLOAT bitCountSum =
+      (FX_FLOAT)CBC_PDF417Common::getBitCountSum(moduleBitCount);
+  CFX_Int32Array* bitCount = new CFX_Int32Array();
+  bitCount->SetSize(CBC_PDF417Common::BARS_IN_MODULE);
+  int32_t bitCountIndex = 0;
+  int32_t sumPreviousBits = 0;
+  for (int32_t i = 0; i < CBC_PDF417Common::MODULES_IN_CODEWORD; i++) {
+    FX_FLOAT sampleIndex =
+        bitCountSum / (2 * CBC_PDF417Common::MODULES_IN_CODEWORD) +
+        (i * bitCountSum) / CBC_PDF417Common::MODULES_IN_CODEWORD;
+    if (sumPreviousBits + moduleBitCount.GetAt(bitCountIndex) <= sampleIndex) {
+      sumPreviousBits += moduleBitCount.GetAt(bitCountIndex);
+      bitCountIndex++;
+    }
+    bitCount->SetAt(bitCountIndex, bitCount->GetAt(bitCountIndex) + 1);
+  }
+  return bitCount;
+}
+int32_t CBC_PDF417CodewordDecoder::getDecodedCodewordValue(
+    CFX_Int32Array& moduleBitCount) {
+  int32_t decodedValue = getBitValue(moduleBitCount);
+  return CBC_PDF417Common::getCodeword(decodedValue) == -1 ? -1 : decodedValue;
+}
+int32_t CBC_PDF417CodewordDecoder::getBitValue(CFX_Int32Array& moduleBitCount) {
+  int64_t result = 0;
+  for (int32_t i = 0; i < moduleBitCount.GetSize(); i++) {
+    for (int32_t bit = 0; bit < moduleBitCount.GetAt(i); bit++) {
+      result = (result << 1) | (i % 2 == 0 ? 1 : 0);
+    }
+  }
+  return (int32_t)result;
+}
+int32_t CBC_PDF417CodewordDecoder::getClosestDecodedValue(
+    CFX_Int32Array& moduleBitCount) {
+  int32_t bitCountSum = CBC_PDF417Common::getBitCountSum(moduleBitCount);
+  CFX_FloatArray bitCountRatios;
+  bitCountRatios.SetSize(CBC_PDF417Common::BARS_IN_MODULE);
+  for (int32_t i = 0; i < bitCountRatios.GetSize(); i++) {
+    bitCountRatios[i] = moduleBitCount.GetAt(i) / (FX_FLOAT)bitCountSum;
+  }
+  FX_FLOAT bestMatchError = std::numeric_limits<int32_t>::max();
+  int32_t bestMatch = -1;
+  for (int32_t j = 0; j < SYMBOL_TABLE_Length; j++) {
+    FX_FLOAT error = 0.0f;
+    for (int32_t k = 0; k < CBC_PDF417Common::BARS_IN_MODULE; k++) {
+      FX_FLOAT diff = RATIOS_TABLE[j][k] - bitCountRatios[k];
+      error += diff * diff;
+    }
+    if (error < bestMatchError) {
+      bestMatchError = error;
+      bestMatch = CBC_PDF417Common::SYMBOL_TABLE[j];
+    }
+  }
+  return bestMatch;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h b/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h
new file mode 100644
index 0000000..920409d
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_PDF417CodewordDecoder {
+ public:
+  CBC_PDF417CodewordDecoder();
+  virtual ~CBC_PDF417CodewordDecoder();
+  static void Initialize();
+  static void Finalize();
+  static int32_t getDecodedValue(CFX_Int32Array& moduleBitCount);
+
+ private:
+  static FX_FLOAT RATIOS_TABLE[][8];
+  static CFX_Int32Array* sampleBitCounts(CFX_Int32Array& moduleBitCount);
+  static int32_t getDecodedCodewordValue(CFX_Int32Array& moduleBitCount);
+  static int32_t getBitValue(CFX_Int32Array& moduleBitCount);
+  static int32_t getClosestDecodedValue(CFX_Int32Array& moduleBitCount);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Common.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Common.cpp
new file mode 100644
index 0000000..fa4647d
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Common.cpp
@@ -0,0 +1,651 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+
+int32_t CBC_PDF417Common::NUMBER_OF_CODEWORDS = 929;
+int32_t CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1;
+int32_t CBC_PDF417Common::MIN_ROWS_IN_BARCODE = 3;
+int32_t CBC_PDF417Common::MAX_ROWS_IN_BARCODE = 90;
+int32_t CBC_PDF417Common::MAX_CODEWORDS_IN_ROW = 32;
+int32_t CBC_PDF417Common::MODULES_IN_CODEWORD = 17;
+int32_t CBC_PDF417Common::MODULES_IN_STOP_PATTERN = 18;
+int32_t CBC_PDF417Common::BARS_IN_MODULE = 8;
+CFX_Int32Array* CBC_PDF417Common::EMPTY_INT_ARRAY = NULL;
+int32_t CBC_PDF417Common::SYMBOL_TABLE[] = {
+    0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e,
+    0x1035c, 0x10396, 0x103a6, 0x103ac, 0x10422, 0x10428, 0x10436, 0x10442,
+    0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482,
+    0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4,
+    0x10504, 0x10508, 0x10510, 0x1051e, 0x10520, 0x1053c, 0x10540, 0x10578,
+    0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2,
+    0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c,
+    0x106b8, 0x106de, 0x106fa, 0x10716, 0x10726, 0x1072c, 0x10746, 0x1074c,
+    0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6,
+    0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c,
+    0x1087a, 0x10882, 0x10884, 0x10890, 0x1089e, 0x108a0, 0x108bc, 0x108c6,
+    0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e,
+    0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be,
+    0x109ce, 0x109dc, 0x109e2, 0x109e4, 0x109e8, 0x109f6, 0x10a08, 0x10a10,
+    0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c,
+    0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8,
+    0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, 0x10bde, 0x10be6, 0x10bec, 0x10c2e,
+    0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c,
+    0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec,
+    0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, 0x10d70, 0x10d7e, 0x10d82, 0x10d84,
+    0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8,
+    0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58,
+    0x10e6e, 0x10e86, 0x10e8c, 0x10e98, 0x10eb0, 0x10ebe, 0x10ece, 0x10edc,
+    0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44,
+    0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022,
+    0x11028, 0x11042, 0x11048, 0x11050, 0x1105e, 0x1107a, 0x11082, 0x11084,
+    0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee,
+    0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178,
+    0x11186, 0x11198, 0x111b0, 0x111be, 0x111ce, 0x111dc, 0x111e2, 0x111e4,
+    0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c,
+    0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2,
+    0x113c8, 0x113d0, 0x113de, 0x113e6, 0x113ec, 0x11408, 0x11410, 0x1141e,
+    0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618,
+    0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738,
+    0x11770, 0x1177e, 0x11782, 0x11784, 0x11788, 0x11790, 0x1179e, 0x117a0,
+    0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e,
+    0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8,
+    0x118c2, 0x118c8, 0x118d0, 0x118de, 0x118e6, 0x118ec, 0x118fa, 0x1190e,
+    0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e,
+    0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4,
+    0x11a0e, 0x11a1c, 0x11a38, 0x11a70, 0x11a7e, 0x11ae0, 0x11afc, 0x11b08,
+    0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98,
+    0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6,
+    0x11c16, 0x11c26, 0x11c2c, 0x11c46, 0x11c4c, 0x11c58, 0x11c6e, 0x11c86,
+    0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8,
+    0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c,
+    0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, 0x11dc8, 0x11dd0, 0x11dde, 0x11de6,
+    0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28,
+    0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82,
+    0x11e84, 0x11e88, 0x11e90, 0x11e9e, 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc,
+    0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c,
+    0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084,
+    0x12090, 0x1209e, 0x120a0, 0x120bc, 0x120d8, 0x120f2, 0x120f4, 0x12108,
+    0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0,
+    0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e,
+    0x12220, 0x12278, 0x122f0, 0x12306, 0x1230c, 0x12330, 0x1233e, 0x12360,
+    0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6,
+    0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e,
+    0x12660, 0x1267c, 0x126c0, 0x126f8, 0x12738, 0x12770, 0x1277e, 0x12782,
+    0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8,
+    0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0,
+    0x12c18, 0x12c30, 0x12c3e, 0x12c60, 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0,
+    0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08,
+    0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98,
+    0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, 0x1302e, 0x1304e, 0x1305c, 0x13062,
+    0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de,
+    0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184,
+    0x13190, 0x1319e, 0x131a0, 0x131bc, 0x131c6, 0x131cc, 0x131d8, 0x131f2,
+    0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308,
+    0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0,
+    0x133be, 0x133ce, 0x133dc, 0x133e2, 0x133e4, 0x133e8, 0x133f6, 0x1340e,
+    0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8,
+    0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0,
+    0x1370c, 0x13718, 0x13730, 0x1373e, 0x13760, 0x1377c, 0x1379c, 0x137b8,
+    0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816,
+    0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886,
+    0x13898, 0x138b0, 0x138be, 0x138ce, 0x138dc, 0x138e2, 0x138e4, 0x138e8,
+    0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c,
+    0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06,
+    0x13a0c, 0x13a18, 0x13a30, 0x13a3e, 0x13a60, 0x13a7c, 0x13ac0, 0x13af8,
+    0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e,
+    0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12,
+    0x13c14, 0x13c22, 0x13c24, 0x13c28, 0x13c36, 0x13c42, 0x13c48, 0x13c50,
+    0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0,
+    0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08,
+    0x13d10, 0x13d1e, 0x13d20, 0x13d3c, 0x13d40, 0x13d78, 0x13d86, 0x13d8c,
+    0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6,
+    0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64,
+    0x13e68, 0x13e76, 0x13e8e, 0x13e9c, 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8,
+    0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46,
+    0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0,
+    0x140bc, 0x14104, 0x14108, 0x14110, 0x1411e, 0x14120, 0x1413c, 0x14140,
+    0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8,
+    0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0,
+    0x14306, 0x1430c, 0x14318, 0x14330, 0x1433e, 0x14360, 0x1437c, 0x1438e,
+    0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410,
+    0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c,
+    0x14618, 0x14630, 0x1463e, 0x14660, 0x1467c, 0x146c0, 0x146f8, 0x1471c,
+    0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0,
+    0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c,
+    0x14840, 0x14878, 0x148f0, 0x149e0, 0x14bc0, 0x14c30, 0x14c3e, 0x14c60,
+    0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0,
+    0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40,
+    0x14f78, 0x14f86, 0x14f8c, 0x14f98, 0x14fb0, 0x14fce, 0x14fdc, 0x15020,
+    0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0,
+    0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0,
+    0x15df8, 0x15e08, 0x15e10, 0x15e20, 0x15e40, 0x15e78, 0x15ef0, 0x15f0c,
+    0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e,
+    0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de,
+    0x1610e, 0x1611c, 0x16138, 0x16170, 0x1617e, 0x16184, 0x16188, 0x16190,
+    0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4,
+    0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304,
+    0x16308, 0x16310, 0x1631e, 0x16320, 0x1633c, 0x16340, 0x16378, 0x16386,
+    0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4,
+    0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0,
+    0x164fc, 0x165c0, 0x165f8, 0x16610, 0x1661e, 0x16620, 0x1663c, 0x16640,
+    0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e,
+    0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6,
+    0x167ec, 0x1681c, 0x16838, 0x16870, 0x168e0, 0x168fc, 0x169c0, 0x169f8,
+    0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0,
+    0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8,
+    0x16f1c, 0x16f38, 0x16f70, 0x16f7e, 0x16f84, 0x16f88, 0x16f90, 0x16f9e,
+    0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046,
+    0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be,
+    0x170ce, 0x170dc, 0x170e8, 0x17106, 0x1710c, 0x17118, 0x17130, 0x1713e,
+    0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8,
+    0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218,
+    0x17230, 0x1723e, 0x17260, 0x1727c, 0x172c0, 0x172f8, 0x1730e, 0x1731c,
+    0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc,
+    0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430,
+    0x1743e, 0x17460, 0x1747c, 0x174c0, 0x174f8, 0x175f0, 0x1760e, 0x1761c,
+    0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e,
+    0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc,
+    0x177e2, 0x177e4, 0x177e8, 0x17822, 0x17824, 0x17828, 0x17836, 0x17842,
+    0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884,
+    0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8,
+    0x178ee, 0x178f2, 0x178f4, 0x17902, 0x17904, 0x17908, 0x17910, 0x1791e,
+    0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0,
+    0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04,
+    0x17a08, 0x17a10, 0x17a1e, 0x17a20, 0x17a3c, 0x17a40, 0x17a78, 0x17af0,
+    0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e,
+    0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec,
+    0x17c2e, 0x17c32, 0x17c34, 0x17c4e, 0x17c5c, 0x17c62, 0x17c64, 0x17c68,
+    0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0,
+    0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82,
+    0x17d84, 0x17d88, 0x17d90, 0x17d9e, 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc,
+    0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58,
+    0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece,
+    0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, 0x17ef6, 0x1813a, 0x18172, 0x18174,
+    0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274,
+    0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a,
+    0x183ae, 0x183d6, 0x18416, 0x18426, 0x1842c, 0x1843a, 0x18446, 0x18458,
+    0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc,
+    0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530,
+    0x1853e, 0x18560, 0x1857c, 0x1858e, 0x1859c, 0x185b8, 0x185c2, 0x185c4,
+    0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614,
+    0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682,
+    0x18684, 0x18688, 0x18690, 0x1869e, 0x186a0, 0x186bc, 0x186c6, 0x186cc,
+    0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796,
+    0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846,
+    0x1884c, 0x18858, 0x1886e, 0x18872, 0x18874, 0x18886, 0x18898, 0x188b0,
+    0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c,
+    0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8,
+    0x189d0, 0x189de, 0x189e6, 0x189ec, 0x189fa, 0x18a18, 0x18a30, 0x18a3e,
+    0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e,
+    0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6,
+    0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, 0x18bf4, 0x18c22, 0x18c24, 0x18c28,
+    0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82,
+    0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4,
+    0x18d04, 0x18d08, 0x18d10, 0x18d1e, 0x18d20, 0x18d3c, 0x18d40, 0x18d78,
+    0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32,
+    0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c,
+    0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, 0x18ed0, 0x18efa, 0x18f16, 0x18f26,
+    0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94,
+    0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c,
+    0x19058, 0x19072, 0x19074, 0x19086, 0x19098, 0x190b0, 0x190be, 0x190ce,
+    0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e,
+    0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0,
+    0x191de, 0x191e6, 0x191ec, 0x191fa, 0x19218, 0x1923e, 0x19260, 0x1927c,
+    0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390,
+    0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2,
+    0x193f4, 0x19430, 0x1943e, 0x19460, 0x1947c, 0x194c0, 0x194f8, 0x195f0,
+    0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708,
+    0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798,
+    0x197b0, 0x197be, 0x197ce, 0x197dc, 0x197e2, 0x197e4, 0x197e8, 0x19822,
+    0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882,
+    0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4,
+    0x19902, 0x19908, 0x1991e, 0x19920, 0x1993c, 0x19940, 0x19978, 0x19986,
+    0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e,
+    0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60,
+    0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, 0x19bd0, 0x19be6, 0x19c2e, 0x19c34,
+    0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8,
+    0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38,
+    0x19d70, 0x19d7e, 0x19d82, 0x19d84, 0x19d88, 0x19d90, 0x19da0, 0x19dcc,
+    0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58,
+    0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2,
+    0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, 0x19f14, 0x19f22, 0x19f24, 0x19f28,
+    0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae,
+    0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c,
+    0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106,
+    0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c,
+    0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec,
+    0x1a218, 0x1a230, 0x1a23e, 0x1a260, 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c,
+    0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e,
+    0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4,
+    0x1a418, 0x1a430, 0x1a43e, 0x1a460, 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0,
+    0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704,
+    0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786,
+    0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4,
+    0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0,
+    0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08,
+    0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c,
+    0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8,
+    0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082,
+    0x1b084, 0x1b088, 0x1b090, 0x1b09e, 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2,
+    0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c,
+    0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8,
+    0x1b204, 0x1b208, 0x1b210, 0x1b21e, 0x1b220, 0x1b23c, 0x1b240, 0x1b278,
+    0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8,
+    0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478,
+    0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782,
+    0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e,
+    0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0,
+    0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, 0x1b938, 0x1b970, 0x1b97e, 0x1b982,
+    0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4,
+    0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08,
+    0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4,
+    0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72,
+    0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2,
+    0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60,
+    0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa,
+    0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48,
+    0x1be50, 0x1be5e, 0x1be66, 0x1be82, 0x1be84, 0x1be88, 0x1be90, 0x1be9e,
+    0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34,
+    0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4,
+    0x1c11a, 0x1c132, 0x1c134, 0x1c162, 0x1c164, 0x1c168, 0x1c176, 0x1c1ba,
+    0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268,
+    0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6,
+    0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, 0x1c33a, 0x1c346, 0x1c34c, 0x1c372,
+    0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462,
+    0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8,
+    0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570,
+    0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc,
+    0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626,
+    0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, 0x1c658, 0x1c66e, 0x1c672, 0x1c674,
+    0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2,
+    0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742,
+    0x1c744, 0x1c748, 0x1c750, 0x1c75e, 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae,
+    0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c,
+    0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2,
+    0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938,
+    0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc,
+    0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70,
+    0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20,
+    0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe,
+    0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26,
+    0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0,
+    0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18,
+    0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8,
+    0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50,
+    0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e,
+    0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34,
+    0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac,
+    0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c,
+    0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2,
+    0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c,
+    0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e,
+    0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4,
+    0x1d21c, 0x1d238, 0x1d270, 0x1d27e, 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304,
+    0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386,
+    0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4,
+    0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8,
+    0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706,
+    0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c,
+    0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec,
+    0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874,
+    0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4,
+    0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, 0x1d930, 0x1d93e, 0x1d960, 0x1d97c,
+    0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c,
+    0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38,
+    0x1db82, 0x1db84, 0x1db88, 0x1db90, 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2,
+    0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66,
+    0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc,
+    0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20,
+    0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4,
+    0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64,
+    0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0,
+    0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58,
+    0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8,
+    0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da,
+    0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142,
+    0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2,
+    0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, 0x1e222, 0x1e224, 0x1e228, 0x1e236,
+    0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282,
+    0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8,
+    0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, 0x1e332, 0x1e334, 0x1e35c, 0x1e362,
+    0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428,
+    0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a,
+    0x1e482, 0x1e484, 0x1e490, 0x1e49e, 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc,
+    0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510,
+    0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598,
+    0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6,
+    0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668,
+    0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6,
+    0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, 0x1e73a, 0x1e746, 0x1e74c, 0x1e758,
+    0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6,
+    0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844,
+    0x1e848, 0x1e850, 0x1e85e, 0x1e866, 0x1e86c, 0x1e87a, 0x1e882, 0x1e884,
+    0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8,
+    0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920,
+    0x1e93c, 0x1e940, 0x1e978, 0x1e986, 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be,
+    0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08,
+    0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18,
+    0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2,
+    0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e,
+    0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e,
+    0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa,
+    0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88,
+    0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26,
+    0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74,
+    0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2,
+    0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42,
+    0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae,
+    0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca,
+    0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c,
+    0x1f158, 0x1f16e, 0x1f172, 0x1f174, 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2,
+    0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246,
+    0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0,
+    0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a,
+    0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350,
+    0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416,
+    0x1f426, 0x1f42c, 0x1f43a, 0x1f446, 0x1f44c, 0x1f458, 0x1f46e, 0x1f472,
+    0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc,
+    0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530,
+    0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4,
+    0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612,
+    0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648,
+    0x1f650, 0x1f65e, 0x1f666, 0x1f67a, 0x1f682, 0x1f684, 0x1f688, 0x1f690,
+    0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e,
+    0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776,
+    0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae,
+    0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934,
+    0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6,
+    0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32,
+    0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e,
+    0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6,
+    0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58,
+    0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4,
+    0x1fba8, 0x1fbb6, 0x1fbda};
+int32_t CBC_PDF417Common::CODEWORD_TABLE[] = {
+    2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773,
+    902,  896,  908,  868,  865,  861,  859,  2511, 873,  871,  1780, 835,
+    2493, 825,  2491, 842,  837,  844,  1764, 1762, 811,  810,  809,  2483,
+    807,  2482, 806,  2480, 815,  814,  813,  812,  2484, 817,  816,  1745,
+    1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752,
+    2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780,
+    787,  781,  747,  739,  736,  2413, 754,  752,  1719, 692,  689,  681,
+    2371, 678,  2369, 700,  697,  694,  703,  1688, 1686, 642,  638,  2343,
+    631,  2341, 627,  2338, 651,  646,  643,  2345, 654,  652,  1652, 1650,
+    1647, 1654, 601,  599,  2322, 596,  2321, 594,  2319, 2317, 611,  610,
+    608,  606,  2324, 603,  2323, 615,  614,  612,  1617, 1616, 1614, 1612,
+    616,  1619, 1618, 2575, 2538, 2536, 905,  901,  898,  909,  2509, 2507,
+    2504, 870,  867,  864,  860,  2512, 875,  872,  1781, 2490, 2489, 2487,
+    2485, 1748, 836,  834,  832,  830,  2494, 827,  2492, 843,  841,  839,
+    845,  1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631,
+    2629, 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735,
+    2733, 2731, 1848, 2740, 2738, 2786, 2784, 591,  588,  576,  569,  566,
+    2296, 1590, 537,  534,  526,  2276, 522,  2274, 545,  542,  539,  548,
+    1572, 1570, 481,  2245, 466,  2242, 462,  2239, 492,  485,  482,  2249,
+    496,  494,  1534, 1531, 1528, 1538, 413,  2196, 406,  2191, 2188, 425,
+    419,  2202, 415,  2199, 432,  430,  427,  1472, 1467, 1464, 433,  1476,
+    1474, 368,  367,  2160, 365,  2159, 362,  2157, 2155, 2152, 378,  377,
+    375,  2166, 372,  2165, 369,  2162, 383,  381,  379,  2168, 1419, 1418,
+    1416, 1414, 385,  1411, 384,  1423, 1422, 1420, 1424, 2461, 802,  2441,
+    2439, 790,  786,  783,  794,  2409, 2406, 2403, 750,  742,  738,  2414,
+    756,  753,  1720, 2367, 2365, 2362, 2359, 1663, 693,  691,  684,  2373,
+    680,  2370, 702,  699,  696,  704,  1690, 1687, 2337, 2336, 2334, 2332,
+    1624, 2329, 1622, 640,  637,  2344, 634,  2342, 630,  2340, 650,  648,
+    645,  2346, 655,  653,  1653, 1651, 1649, 1655, 2612, 2597, 2595, 2571,
+    2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907,  904,  900,
+    910,  2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869,
+    866,  863,  2513, 876,  874,  1782, 2720, 2713, 2711, 2697, 2694, 2691,
+    2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823,
+    2639, 1822, 2654, 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849,
+    2751, 2749, 2747, 2754, 353,  2148, 344,  342,  336,  2142, 332,  2140,
+    345,  1375, 1373, 306,  2130, 299,  2128, 295,  2125, 319,  314,  311,
+    2132, 1354, 1352, 1349, 1356, 262,  257,  2101, 253,  2096, 2093, 274,
+    273,  267,  2107, 263,  2104, 280,  278,  275,  1316, 1311, 1308, 1320,
+    1318, 2052, 202,  2050, 2044, 2040, 219,  2063, 212,  2060, 208,  2055,
+    224,  221,  2066, 1260, 1258, 1252, 231,  1248, 229,  1266, 1264, 1261,
+    1268, 155,  1998, 153,  1996, 1994, 1991, 1988, 165,  164,  2007, 162,
+    2006, 159,  2003, 2000, 172,  171,  169,  2012, 166,  2010, 1186, 1184,
+    1182, 1179, 175,  1176, 173,  1192, 1191, 1189, 1187, 176,  1194, 1193,
+    2313, 2307, 2305, 592,  589,  2294, 2292, 2289, 578,  572,  568,  2297,
+    580,  1591, 2272, 2267, 2264, 1547, 538,  536,  529,  2278, 525,  2275,
+    547,  544,  541,  1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478,
+    2247, 470,  2244, 465,  2241, 493,  488,  484,  2250, 498,  495,  1536,
+    1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427,
+    414,  412,  2197, 409,  2195, 405,  2193, 2190, 426,  424,  421,  2203,
+    418,  2201, 431,  429,  1473, 1471, 1469, 1466, 434,  1477, 1475, 2478,
+    2472, 2470, 2459, 2457, 2454, 2462, 803,  2437, 2432, 2429, 1726, 2443,
+    2440, 792,  789,  785,  2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408,
+    2405, 745,  741,  2415, 758,  755,  1721, 2358, 2357, 2355, 2353, 1661,
+    2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690,  687,  2374,
+    683,  2372, 701,  698,  705,  1691, 1689, 2619, 2617, 2610, 2608, 2605,
+    2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551,
+    1795, 2573, 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785,
+    2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, 906,  903,  911,
+    2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826,
+    1824, 2673, 2671, 2669, 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854,
+    1853, 1851, 1856, 2766, 2764, 143,  1987, 139,  1986, 135,  133,  131,
+    1984, 128,  1983, 125,  1981, 138,  137,  136,  1985, 1133, 1132, 1130,
+    112,  110,  1974, 107,  1973, 104,  1971, 1969, 122,  121,  119,  117,
+    1977, 114,  1976, 124,  1115, 1114, 1112, 1110, 1117, 1116, 84,   83,
+    1953, 81,   1952, 78,   1950, 1948, 1945, 94,   93,   91,   1959, 88,
+    1958, 85,   1955, 99,   97,   95,   1961, 1086, 1085, 1083, 1081, 1078,
+    100,  1090, 1089, 1087, 1091, 49,   47,   1917, 44,   1915, 1913, 1910,
+    1907, 59,   1926, 56,   1925, 53,   1922, 1919, 66,   64,   1931, 61,
+    1929, 1042, 1040, 1038, 71,   1035, 70,   1032, 68,   1048, 1047, 1045,
+    1043, 1050, 1049, 12,   10,   1869, 1867, 1864, 1861, 21,   1880, 19,
+    1877, 1874, 1871, 28,   1888, 25,   1886, 22,   1883, 982,  980,  977,
+    974,  32,   30,   991,  989,  987,  984,  34,   995,  994,  992,  2151,
+    2150, 2147, 2146, 2144, 356,  355,  354,  2149, 2139, 2138, 2136, 2134,
+    1359, 343,  341,  338,  2143, 335,  2141, 348,  347,  346,  1376, 1374,
+    2124, 2123, 2121, 2119, 1326, 2116, 1324, 310,  308,  305,  2131, 302,
+    2129, 298,  2127, 320,  318,  316,  313,  2133, 322,  321,  1355, 1353,
+    1351, 1357, 2092, 2091, 2089, 2087, 1276, 2084, 1274, 2081, 1271, 259,
+    2102, 256,  2100, 252,  2098, 2095, 272,  269,  2108, 266,  2106, 281,
+    279,  277,  1317, 1315, 1313, 1310, 282,  1321, 1319, 2039, 2037, 2035,
+    2032, 1203, 2029, 1200, 1197, 207,  2053, 205,  2051, 201,  2049, 2046,
+    2043, 220,  218,  2064, 215,  2062, 211,  2059, 228,  226,  223,  2069,
+    1259, 1257, 1254, 232,  1251, 230,  1267, 1265, 1263, 2316, 2315, 2312,
+    2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590,  2288,
+    2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579,  577,  574,
+    571,  2298, 582,  581,  1592, 2263, 2262, 2260, 2258, 1545, 2255, 1544,
+    2252, 1541, 2273, 2271, 2269, 2266, 1550, 535,  532,  2279, 528,  2277,
+    546,  543,  549,  1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214,
+    1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480,  477,  2248,
+    473,  2246, 469,  2243, 490,  487,  2251, 497,  1537, 1535, 1532, 2477,
+    2476, 2474, 2479, 2469, 2468, 2466, 2464, 1730, 2473, 2471, 2453, 2452,
+    2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805,  804,  2428,
+    2427, 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431,
+    1727, 2444, 2442, 793,  791,  788,  795,  2388, 2386, 2384, 1697, 2381,
+    1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412,
+    2410, 2407, 751,  748,  744,  2416, 759,  757,  1807, 2620, 2618, 1806,
+    1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, 2590, 2587,
+    1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798,
+    2554, 1796, 2574, 2572, 2569, 2578, 1847, 1846, 2722, 1843, 1842, 1840,
+    1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695,
+    2704, 1817, 1811, 1810, 897,  862,  1777, 829,  826,  838,  1760, 1758,
+    808,  2481, 1741, 1740, 1738, 1743, 2624, 1818, 2726, 2776, 782,  740,
+    737,  1715, 686,  679,  695,  1682, 1680, 639,  628,  2339, 647,  644,
+    1645, 1643, 1640, 1648, 602,  600,  597,  595,  2320, 593,  2318, 609,
+    607,  604,  1611, 1610, 1608, 1606, 613,  1615, 1613, 2328, 926,  924,
+    892,  886,  899,  857,  850,  2505, 1778, 824,  823,  821,  819,  2488,
+    818,  2486, 833,  831,  828,  840,  1761, 1759, 2649, 2632, 2630, 2746,
+    2734, 2732, 2782, 2781, 570,  567,  1587, 531,  527,  523,  540,  1566,
+    1564, 476,  467,  463,  2240, 486,  483,  1524, 1521, 1518, 1529, 411,
+    403,  2192, 399,  2189, 423,  416,  1462, 1457, 1454, 428,  1468, 1465,
+    2210, 366,  363,  2158, 360,  2156, 357,  2153, 376,  373,  370,  2163,
+    1410, 1409, 1407, 1405, 382,  1402, 380,  1417, 1415, 1412, 1421, 2175,
+    2174, 777,  774,  771,  784,  732,  725,  722,  2404, 743,  1716, 676,
+    674,  668,  2363, 665,  2360, 685,  1684, 1681, 626,  624,  622,  2335,
+    620,  2333, 617,  2330, 641,  635,  649,  1646, 1644, 1642, 2566, 928,
+    925,  2530, 2527, 894,  891,  888,  2501, 2499, 2496, 858,  856,  854,
+    851,  1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, 2757,
+    2744, 2743, 2741, 2748, 352,  1382, 340,  337,  333,  1371, 1369, 307,
+    300,  296,  2126, 315,  312,  1347, 1342, 1350, 261,  258,  250,  2097,
+    246,  2094, 271,  268,  264,  1306, 1301, 1298, 276,  1312, 1309, 2115,
+    203,  2048, 195,  2045, 191,  2041, 213,  209,  2056, 1246, 1244, 1238,
+    225,  1234, 222,  1256, 1253, 1249, 1262, 2080, 2079, 154,  1997, 150,
+    1995, 147,  1992, 1989, 163,  160,  2004, 156,  2001, 1175, 1174, 1172,
+    1170, 1167, 170,  1164, 167,  1185, 1183, 1180, 1177, 174,  1190, 1188,
+    2025, 2024, 2022, 587,  586,  564,  559,  556,  2290, 573,  1588, 520,
+    518,  512,  2268, 508,  2265, 530,  1568, 1565, 461,  457,  2233, 450,
+    2230, 446,  2226, 479,  471,  489,  1526, 1523, 1520, 397,  395,  2185,
+    392,  2183, 389,  2180, 2177, 410,  2194, 402,  422,  1463, 1461, 1459,
+    1456, 1470, 2455, 799,  2433, 2430, 779,  776,  773,  2397, 2394, 2390,
+    734,  728,  724,  746,  1717, 2356, 2354, 2351, 2348, 1658, 677,  675,
+    673,  670,  667,  688,  1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552,
+    927,  2523, 2521, 2518, 2515, 1784, 2532, 895,  893,  890,  2718, 2709,
+    2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852,
+    2760, 2758, 142,  141,  1139, 1138, 134,  132,  129,  126,  1982, 1129,
+    1128, 1126, 1131, 113,  111,  108,  105,  1972, 101,  1970, 120,  118,
+    115,  1109, 1108, 1106, 1104, 123,  1113, 1111, 82,   79,   1951, 75,
+    1949, 72,   1946, 92,   89,   86,   1956, 1077, 1076, 1074, 1072, 98,
+    1069, 96,   1084, 1082, 1079, 1088, 1968, 1967, 48,   45,   1916, 42,
+    1914, 39,   1911, 1908, 60,   57,   54,   1923, 50,   1920, 1031, 1030,
+    1028, 1026, 67,   1023, 65,   1020, 62,   1041, 1039, 1036, 1033, 69,
+    1046, 1044, 1944, 1943, 1941, 11,   9,    1868, 7,    1865, 1862, 1859,
+    20,   1878, 16,   1875, 13,   1872, 970,  968,  966,  963,  29,   960,
+    26,   23,   983,  981,  978,  975,  33,   971,  31,   990,  988,  985,
+    1906, 1904, 1902, 993,  351,  2145, 1383, 331,  330,  328,  326,  2137,
+    323,  2135, 339,  1372, 1370, 294,  293,  291,  289,  2122, 286,  2120,
+    283,  2117, 309,  303,  317,  1348, 1346, 1344, 245,  244,  242,  2090,
+    239,  2088, 236,  2085, 2082, 260,  2099, 249,  270,  1307, 1305, 1303,
+    1300, 1314, 189,  2038, 186,  2036, 183,  2033, 2030, 2026, 206,  198,
+    2047, 194,  216,  1247, 1245, 1243, 1240, 227,  1237, 1255, 2310, 2302,
+    2300, 2286, 2284, 2281, 565,  563,  561,  558,  575,  1589, 2261, 2259,
+    2256, 2253, 1542, 521,  519,  517,  514,  2270, 511,  533,  1569, 1567,
+    2223, 2221, 2218, 2215, 1483, 2211, 1480, 459,  456,  453,  2232, 449,
+    474,  491,  1527, 1525, 1522, 2475, 2467, 2465, 2451, 2449, 2446, 801,
+    800,  2426, 2424, 2421, 2418, 1723, 2435, 780,  778,  775,  2387, 2385,
+    2382, 2379, 1695, 2375, 1693, 2396, 735,  733,  730,  727,  749,  1718,
+    2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, 1800, 2591, 2550,
+    2549, 2547, 2545, 1792, 2542, 1790, 2558, 929,  2719, 1841, 2710, 2708,
+    1833, 1831, 2690, 2688, 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737,
+    1736, 1734, 1739, 1816, 1711, 1676, 1674, 633,  629,  1638, 1636, 1633,
+    1641, 598,  1605, 1604, 1602, 1600, 605,  1609, 1607, 2327, 887,  853,
+    1775, 822,  820,  1757, 1755, 1584, 524,  1560, 1558, 468,  464,  1514,
+    1511, 1508, 1519, 408,  404,  400,  1452, 1447, 1444, 417,  1458, 1455,
+    2208, 364,  361,  358,  2154, 1401, 1400, 1398, 1396, 374,  1393, 371,
+    1408, 1406, 1403, 1413, 2173, 2172, 772,  726,  723,  1712, 672,  669,
+    666,  682,  1678, 1675, 625,  623,  621,  618,  2331, 636,  632,  1639,
+    1637, 1635, 920,  918,  884,  880,  889,  849,  848,  847,  846,  2497,
+    855,  852,  1776, 2641, 2742, 2787, 1380, 334,  1367, 1365, 301,  297,
+    1340, 1338, 1335, 1343, 255,  251,  247,  1296, 1291, 1288, 265,  1302,
+    1299, 2113, 204,  196,  192,  2042, 1232, 1230, 1224, 214,  1220, 210,
+    1242, 1239, 1235, 1250, 2077, 2075, 151,  148,  1993, 144,  1990, 1163,
+    1162, 1160, 1158, 1155, 161,  1152, 157,  1173, 1171, 1168, 1165, 168,
+    1181, 1178, 2021, 2020, 2018, 2023, 585,  560,  557,  1585, 516,  509,
+    1562, 1559, 458,  447,  2227, 472,  1516, 1513, 1510, 398,  396,  393,
+    390,  2181, 386,  2178, 407,  1453, 1451, 1449, 1446, 420,  1460, 2209,
+    769,  764,  720,  712,  2391, 729,  1713, 664,  663,  661,  659,  2352,
+    656,  2349, 671,  1679, 1677, 2553, 922,  919,  2519, 2516, 885,  883,
+    881,  2685, 2661, 2659, 2767, 2756, 2755, 140,  1137, 1136, 130,  127,
+    1125, 1124, 1122, 1127, 109,  106,  102,  1103, 1102, 1100, 1098, 116,
+    1107, 1105, 1980, 80,   76,   73,   1947, 1068, 1067, 1065, 1063, 90,
+    1060, 87,   1075, 1073, 1070, 1080, 1966, 1965, 46,   43,   40,   1912,
+    36,   1909, 1019, 1018, 1016, 1014, 58,   1011, 55,   1008, 51,   1029,
+    1027, 1024, 1021, 63,   1037, 1034, 1940, 1939, 1937, 1942, 8,    1866,
+    4,    1863, 1,    1860, 956,  954,  952,  949,  946,  17,   14,   969,
+    967,  964,  961,  27,   957,  24,   979,  976,  972,  1901, 1900, 1898,
+    1896, 986,  1905, 1903, 350,  349,  1381, 329,  327,  324,  1368, 1366,
+    292,  290,  287,  284,  2118, 304,  1341, 1339, 1337, 1345, 243,  240,
+    237,  2086, 233,  2083, 254,  1297, 1295, 1293, 1290, 1304, 2114, 190,
+    187,  184,  2034, 180,  2031, 177,  2027, 199,  1233, 1231, 1229, 1226,
+    217,  1223, 1241, 2078, 2076, 584,  555,  554,  552,  550,  2282, 562,
+    1586, 507,  506,  504,  502,  2257, 499,  2254, 515,  1563, 1561, 445,
+    443,  441,  2219, 438,  2216, 435,  2212, 460,  454,  475,  1517, 1515,
+    1512, 2447, 798,  797,  2422, 2419, 770,  768,  766,  2383, 2380, 2376,
+    721,  719,  717,  714,  731,  1714, 2602, 2582, 2580, 2548, 2546, 2543,
+    923,  921,  2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733,
+    1732, 1731, 1735, 1814, 1707, 1670, 1668, 1631, 1629, 1626, 1634, 1599,
+    1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552,
+    1504, 1501, 1498, 1509, 1442, 1437, 1434, 401,  1448, 1445, 2206, 1392,
+    1391, 1389, 1387, 1384, 359,  1399, 1397, 1394, 1404, 2171, 2170, 1708,
+    1672, 1669, 619,  1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328,
+    1336, 1286, 1281, 1278, 248,  1292, 1289, 2111, 1218, 1216, 1210, 197,
+    1206, 193,  1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, 1148, 1146,
+    152,  1143, 149,  1140, 145,  1161, 1159, 1156, 1153, 158,  1169, 1166,
+    2017, 2016, 2014, 2019, 1582, 510,  1556, 1553, 452,  448,  1506, 1500,
+    394,  391,  387,  1443, 1441, 1439, 1436, 1450, 2207, 765,  716,  713,
+    1709, 662,  660,  657,  1673, 1671, 916,  914,  879,  878,  877,  882,
+    1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, 1092, 103,  1101,
+    1099, 1979, 1059, 1058, 1056, 1054, 77,   1051, 74,   1066, 1064, 1061,
+    1071, 1964, 1963, 1007, 1006, 1004, 1002, 999,  41,   996,  37,   1017,
+    1015, 1012, 1009, 52,   1025, 1022, 1936, 1935, 1933, 1938, 942,  940,
+    938,  935,  932,  5,    2,    955,  953,  950,  947,  18,   943,  15,
+    965,  962,  958,  1895, 1894, 1892, 1890, 973,  1899, 1897, 1379, 325,
+    1364, 1362, 288,  285,  1334, 1332, 1330, 241,  238,  234,  1287, 1285,
+    1283, 1280, 1294, 2112, 188,  185,  181,  178,  2028, 1219, 1217, 1215,
+    1212, 200,  1209, 1227, 2074, 2072, 583,  553,  551,  1583, 505,  503,
+    500,  513,  1557, 1555, 444,  442,  439,  436,  2213, 455,  451,  1507,
+    1505, 1502, 796,  763,  762,  760,  767,  711,  710,  708,  706,  2377,
+    718,  715,  1710, 2544, 917,  915,  2681, 1627, 1597, 1595, 2325, 1769,
+    1749, 1747, 1499, 1438, 1435, 2204, 1390, 1388, 1385, 1395, 2169, 2167,
+    1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214,
+    1207, 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146,  1157, 1154, 2013,
+    2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, 1433, 1431, 1428, 1425,
+    388,  1440, 2205, 1705, 658,  1667, 1664, 1119, 1095, 1093, 1978, 1057,
+    1055, 1052, 1062, 1962, 1960, 1005, 1003, 1000, 997,  38,   1013, 1010,
+    1932, 1930, 1927, 1934, 941,  939,  936,  933,  6,    930,  3,    951,
+    948,  944,  1889, 1887, 1884, 1881, 959,  1893, 1891, 35,   1377, 1360,
+    1358, 1327, 1325, 1322, 1331, 1277, 1275, 1272, 1269, 235,  1284, 2110,
+    1205, 1204, 1201, 1198, 182,  1195, 179,  1213, 2070, 2067, 1580, 501,
+    1551, 1548, 440,  437,  1497, 1494, 1490, 1503, 761,  709,  707,  1706,
+    913,  912,  2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, 2058, 2054,
+    1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659,
+    1656, 1975, 1053, 1957, 1954, 1001, 998,  1924, 1921, 1918, 1928, 937,
+    934,  931,  1879, 1876, 1873, 1870, 945,  1885, 1882, 1323, 1273, 1270,
+    2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481,
+    1478, 1491, 1700};
+
+CBC_PDF417Common::CBC_PDF417Common() {}
+CBC_PDF417Common::~CBC_PDF417Common() {}
+int32_t CBC_PDF417Common::getBitCountSum(CFX_Int32Array& moduleBitCount) {
+  int32_t bitCountSum = 0;
+  for (int32_t i = 0; i < moduleBitCount.GetSize(); i++) {
+    int32_t count = moduleBitCount.GetAt(i);
+    bitCountSum += count;
+  }
+  return bitCountSum;
+}
+int32_t CBC_PDF417Common::getCodeword(FX_DWORD symbol) {
+  FX_DWORD sym = symbol & 0x3FFFF;
+  int32_t i = findCodewordIndex(sym);
+  if (i == -1) {
+    return -1;
+  }
+  return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS;
+}
+int32_t CBC_PDF417Common::findCodewordIndex(FX_DWORD symbol) {
+  int32_t first = 0;
+  int32_t upto = sizeof(SYMBOL_TABLE) / sizeof(SYMBOL_TABLE[0]);
+  while (first < upto) {
+    int32_t mid = ((FX_DWORD)(first + upto)) >> 1;
+    if (symbol < (FX_DWORD)SYMBOL_TABLE[mid]) {
+      upto = mid;
+    } else if (symbol > (FX_DWORD)SYMBOL_TABLE[mid]) {
+      first = mid + 1;
+    } else {
+      return mid;
+    }
+  }
+  return -1;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Common.h b/xfa/fxbarcode/pdf417/BC_PDF417Common.h
new file mode 100644
index 0000000..61e93ab
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Common.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417COMMON_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417COMMON_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_PDF417Common {
+ public:
+  CBC_PDF417Common();
+  virtual ~CBC_PDF417Common();
+  static int32_t getBitCountSum(CFX_Int32Array& moduleBitCount);
+  static int32_t getCodeword(FX_DWORD symbol);
+  static int32_t NUMBER_OF_CODEWORDS;
+  static int32_t MAX_CODEWORDS_IN_BARCODE;
+  static int32_t MIN_ROWS_IN_BARCODE;
+  static int32_t MAX_ROWS_IN_BARCODE;
+  static int32_t MAX_CODEWORDS_IN_ROW;
+  static int32_t MODULES_IN_CODEWORD;
+  static int32_t MODULES_IN_STOP_PATTERN;
+  static int32_t BARS_IN_MODULE;
+  static int32_t SYMBOL_TABLE[];
+  static int32_t CODEWORD_TABLE[];
+
+ private:
+  static CFX_Int32Array* EMPTY_INT_ARRAY;
+  static int32_t findCodewordIndex(FX_DWORD symbol);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417COMMON_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp
new file mode 100644
index 0000000..d3a1663
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+
+CBC_Compaction::CBC_Compaction() {}
+CBC_Compaction::~CBC_Compaction() {}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Compaction.h b/xfa/fxbarcode/pdf417/BC_PDF417Compaction.h
new file mode 100644
index 0000000..2df0fce
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Compaction.h
@@ -0,0 +1,18 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
+
+class CBC_Compaction;
+enum Compaction { AUTO, TEXT, BYTES, NUMERIC };
+class CBC_Compaction {
+ public:
+  CBC_Compaction();
+  virtual ~CBC_Compaction();
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp b/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp
new file mode 100644
index 0000000..d52648c6
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp
@@ -0,0 +1,493 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+
+#include <stdlib.h>
+
+#include "third_party/bigint/BigIntegerLibrary.hh"
+#include "xfa/fxbarcode/BC_DecoderResult.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
+#include "xfa/fxbarcode/utils.h"
+
+#define TEXT_COMPACTION_MODE_LATCH 900
+#define BYTE_COMPACTION_MODE_LATCH 901
+#define NUMERIC_COMPACTION_MODE_LATCH 902
+#define BYTE_COMPACTION_MODE_LATCH_6 924
+#define BEGIN_MACRO_PDF417_CONTROL_BLOCK 928
+#define BEGIN_MACRO_PDF417_OPTIONAL_FIELD 923
+#define MACRO_PDF417_TERMINATOR 922
+#define MODE_SHIFT_TO_BYTE_COMPACTION_MODE 913
+
+int32_t CBC_DecodedBitStreamPaser::MAX_NUMERIC_CODEWORDS = 15;
+int32_t CBC_DecodedBitStreamPaser::NUMBER_OF_SEQUENCE_CODEWORDS = 2;
+int32_t CBC_DecodedBitStreamPaser::PL = 25;
+int32_t CBC_DecodedBitStreamPaser::LL = 27;
+int32_t CBC_DecodedBitStreamPaser::AS = 27;
+int32_t CBC_DecodedBitStreamPaser::ML = 28;
+int32_t CBC_DecodedBitStreamPaser::AL = 28;
+int32_t CBC_DecodedBitStreamPaser::PS = 29;
+int32_t CBC_DecodedBitStreamPaser::PAL = 29;
+FX_CHAR CBC_DecodedBitStreamPaser::PUNCT_CHARS[29] = {
+    ';', '<',  '>',  '@', '[', '\\', '}', '_', '`', '~',
+    '!', '\r', '\t', ',', ':', '\n', '-', '.', '$', '/',
+    '"', '|',  '*',  '(', ')', '?',  '{', '}', '\''};
+FX_CHAR CBC_DecodedBitStreamPaser::MIXED_CHARS[30] = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', '\r', '\t',
+    ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', '=', '^'};
+
+void CBC_DecodedBitStreamPaser::Initialize() {}
+void CBC_DecodedBitStreamPaser::Finalize() {}
+CBC_DecodedBitStreamPaser::CBC_DecodedBitStreamPaser() {}
+CBC_DecodedBitStreamPaser::~CBC_DecodedBitStreamPaser() {}
+CBC_CommonDecoderResult* CBC_DecodedBitStreamPaser::decode(
+    CFX_Int32Array& codewords,
+    CFX_ByteString ecLevel,
+    int32_t& e) {
+  CFX_ByteString result;
+  int32_t codeIndex = 1;
+  int32_t code = codewords.GetAt(codeIndex);
+  codeIndex++;
+  CBC_PDF417ResultMetadata* resultMetadata = new CBC_PDF417ResultMetadata;
+  while (codeIndex < codewords[0]) {
+    switch (code) {
+      case TEXT_COMPACTION_MODE_LATCH:
+        codeIndex = textCompaction(codewords, codeIndex, result);
+        break;
+      case BYTE_COMPACTION_MODE_LATCH:
+        codeIndex = byteCompaction(code, codewords, codeIndex, result);
+        break;
+      case NUMERIC_COMPACTION_MODE_LATCH:
+        codeIndex = numericCompaction(codewords, codeIndex, result, e);
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        break;
+      case MODE_SHIFT_TO_BYTE_COMPACTION_MODE:
+        codeIndex = byteCompaction(code, codewords, codeIndex, result);
+        break;
+      case BYTE_COMPACTION_MODE_LATCH_6:
+        codeIndex = byteCompaction(code, codewords, codeIndex, result);
+        break;
+      case BEGIN_MACRO_PDF417_CONTROL_BLOCK:
+        codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata, e);
+        if (e != BCExceptionNO) {
+          delete resultMetadata;
+          return NULL;
+        }
+        break;
+      default:
+        codeIndex--;
+        codeIndex = textCompaction(codewords, codeIndex, result);
+        break;
+    }
+    if (codeIndex < codewords.GetSize()) {
+      code = codewords[codeIndex++];
+    } else {
+      e = BCExceptionFormatInstance;
+      delete resultMetadata;
+      return NULL;
+    }
+  }
+  if (result.GetLength() == 0) {
+    e = BCExceptionFormatInstance;
+    delete resultMetadata;
+    return NULL;
+  }
+  CFX_ByteArray rawBytes;
+  CFX_PtrArray byteSegments;
+  CBC_CommonDecoderResult* tempCd = new CBC_CommonDecoderResult();
+  tempCd->Init(rawBytes, result, byteSegments, ecLevel, e);
+  if (e != BCExceptionNO) {
+    delete resultMetadata;
+    return NULL;
+  }
+  tempCd->setOther(resultMetadata);
+  return tempCd;
+}
+int32_t CBC_DecodedBitStreamPaser::decodeMacroBlock(
+    CFX_Int32Array& codewords,
+    int32_t codeIndex,
+    CBC_PDF417ResultMetadata* resultMetadata,
+    int32_t& e) {
+  if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) {
+    e = BCExceptionFormatInstance;
+    return -1;
+  }
+  CFX_Int32Array segmentIndexArray;
+  segmentIndexArray.SetSize(NUMBER_OF_SEQUENCE_CODEWORDS);
+  for (int32_t i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) {
+    segmentIndexArray.SetAt(i, codewords[codeIndex]);
+  }
+  CFX_ByteString str =
+      decodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  resultMetadata->setSegmentIndex(atoi(str.GetBuffer(str.GetLength())));
+  CFX_ByteString fileId;
+  codeIndex = textCompaction(codewords, codeIndex, fileId);
+  resultMetadata->setFileId(fileId);
+  if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) {
+    codeIndex++;
+    CFX_Int32Array additionalOptionCodeWords;
+    additionalOptionCodeWords.SetSize(codewords[0] - codeIndex);
+    int32_t additionalOptionCodeWordsIndex = 0;
+    FX_BOOL end = FALSE;
+    while ((codeIndex < codewords[0]) && !end) {
+      int32_t code = codewords[codeIndex++];
+      if (code < TEXT_COMPACTION_MODE_LATCH) {
+        additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code;
+      } else {
+        switch (code) {
+          case MACRO_PDF417_TERMINATOR:
+            resultMetadata->setLastSegment(TRUE);
+            codeIndex++;
+            end = TRUE;
+            break;
+          default:
+            e = BCExceptionFormatInstance;
+            return -1;
+        }
+      }
+    }
+    CFX_Int32Array array;
+    array.SetSize(additionalOptionCodeWordsIndex);
+    array.Copy(additionalOptionCodeWords);
+    resultMetadata->setOptionalData(array);
+  } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) {
+    resultMetadata->setLastSegment(TRUE);
+    codeIndex++;
+  }
+  return codeIndex;
+}
+int32_t CBC_DecodedBitStreamPaser::textCompaction(CFX_Int32Array& codewords,
+                                                  int32_t codeIndex,
+                                                  CFX_ByteString& result) {
+  CFX_Int32Array textCompactionData;
+  textCompactionData.SetSize((codewords[0] - codeIndex) << 1);
+  CFX_Int32Array byteCompactionData;
+  byteCompactionData.SetSize((codewords[0] - codeIndex) << 1);
+  int32_t index = 0;
+  FX_BOOL end = FALSE;
+  while ((codeIndex < codewords[0]) && !end) {
+    int32_t code = codewords[codeIndex++];
+    if (code < TEXT_COMPACTION_MODE_LATCH) {
+      textCompactionData[index] = code / 30;
+      textCompactionData[index + 1] = code % 30;
+      index += 2;
+    } else {
+      switch (code) {
+        case TEXT_COMPACTION_MODE_LATCH:
+          textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH;
+          break;
+        case BYTE_COMPACTION_MODE_LATCH:
+          codeIndex--;
+          end = TRUE;
+          break;
+        case NUMERIC_COMPACTION_MODE_LATCH:
+          codeIndex--;
+          end = TRUE;
+          break;
+        case BEGIN_MACRO_PDF417_CONTROL_BLOCK:
+          codeIndex--;
+          end = TRUE;
+          break;
+        case BEGIN_MACRO_PDF417_OPTIONAL_FIELD:
+          codeIndex--;
+          end = TRUE;
+          break;
+        case MACRO_PDF417_TERMINATOR:
+          codeIndex--;
+          end = TRUE;
+          break;
+        case MODE_SHIFT_TO_BYTE_COMPACTION_MODE:
+          textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE;
+          code = codewords[codeIndex++];
+          byteCompactionData[index] = code;
+          index++;
+          break;
+        case BYTE_COMPACTION_MODE_LATCH_6:
+          codeIndex--;
+          end = TRUE;
+          break;
+      }
+    }
+  }
+  decodeTextCompaction(textCompactionData, byteCompactionData, index, result);
+  return codeIndex;
+}
+void CBC_DecodedBitStreamPaser::decodeTextCompaction(
+    CFX_Int32Array& textCompactionData,
+    CFX_Int32Array& byteCompactionData,
+    int32_t length,
+    CFX_ByteString& result) {
+  Mode subMode = ALPHA;
+  Mode priorToShiftMode = ALPHA;
+  int32_t i = 0;
+  while (i < length) {
+    int32_t subModeCh = textCompactionData[i];
+    FX_CHAR ch = 0;
+    switch (subMode) {
+      case ALPHA:
+        if (subModeCh < 26) {
+          ch = (FX_CHAR)('A' + subModeCh);
+        } else {
+          if (subModeCh == 26) {
+            ch = ' ';
+          } else if (subModeCh == LL) {
+            subMode = LOWER;
+          } else if (subModeCh == ML) {
+            subMode = MIXED;
+          } else if (subModeCh == PS) {
+            priorToShiftMode = subMode;
+            subMode = PUNCT_SHIFT;
+          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
+            result += (FX_CHAR)byteCompactionData[i];
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+      case LOWER:
+        if (subModeCh < 26) {
+          ch = (FX_CHAR)('a' + subModeCh);
+        } else {
+          if (subModeCh == 26) {
+            ch = ' ';
+          } else if (subModeCh == AS) {
+            priorToShiftMode = subMode;
+            subMode = ALPHA_SHIFT;
+          } else if (subModeCh == ML) {
+            subMode = MIXED;
+          } else if (subModeCh == PS) {
+            priorToShiftMode = subMode;
+            subMode = PUNCT_SHIFT;
+          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
+            result += (FX_CHAR)byteCompactionData[i];
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+      case MIXED:
+        if (subModeCh < PL) {
+          ch = MIXED_CHARS[subModeCh];
+        } else {
+          if (subModeCh == PL) {
+            subMode = PUNCT;
+          } else if (subModeCh == 26) {
+            ch = ' ';
+          } else if (subModeCh == LL) {
+            subMode = LOWER;
+          } else if (subModeCh == AL) {
+            subMode = ALPHA;
+          } else if (subModeCh == PS) {
+            priorToShiftMode = subMode;
+            subMode = PUNCT_SHIFT;
+          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
+            result += (FX_CHAR)byteCompactionData[i];
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+      case PUNCT:
+        if (subModeCh < PAL) {
+          ch = PUNCT_CHARS[subModeCh];
+        } else {
+          if (subModeCh == PAL) {
+            subMode = ALPHA;
+          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
+            result += (FX_CHAR)byteCompactionData[i];
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+      case ALPHA_SHIFT:
+        subMode = priorToShiftMode;
+        if (subModeCh < 26) {
+          ch = (FX_CHAR)('A' + subModeCh);
+        } else {
+          if (subModeCh == 26) {
+            ch = ' ';
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+      case PUNCT_SHIFT:
+        subMode = priorToShiftMode;
+        if (subModeCh < PAL) {
+          ch = PUNCT_CHARS[subModeCh];
+        } else {
+          if (subModeCh == PAL) {
+            subMode = ALPHA;
+          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
+            result += (FX_CHAR)byteCompactionData[i];
+          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
+            subMode = ALPHA;
+          }
+        }
+        break;
+    }
+    if (ch != 0) {
+      result += ch;
+    }
+    i++;
+  }
+}
+int32_t CBC_DecodedBitStreamPaser::byteCompaction(int32_t mode,
+                                                  CFX_Int32Array& codewords,
+                                                  int32_t codeIndex,
+                                                  CFX_ByteString& result) {
+  if (mode == BYTE_COMPACTION_MODE_LATCH) {
+    int32_t count = 0;
+    int64_t value = 0;
+    FX_WORD* decodedData = FX_Alloc(FX_WORD, 6);
+    CFX_Int32Array byteCompactedCodewords;
+    byteCompactedCodewords.SetSize(6);
+    FX_BOOL end = FALSE;
+    int32_t nextCode = codewords[codeIndex++];
+    while ((codeIndex < codewords[0]) && !end) {
+      byteCompactedCodewords[count++] = nextCode;
+      value = 900 * value + nextCode;
+      nextCode = codewords[codeIndex++];
+      if (nextCode == TEXT_COMPACTION_MODE_LATCH ||
+          nextCode == BYTE_COMPACTION_MODE_LATCH ||
+          nextCode == NUMERIC_COMPACTION_MODE_LATCH ||
+          nextCode == BYTE_COMPACTION_MODE_LATCH_6 ||
+          nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
+          nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
+          nextCode == MACRO_PDF417_TERMINATOR) {
+        codeIndex--;
+        end = TRUE;
+      } else {
+        if ((count % 5 == 0) && (count > 0)) {
+          int32_t j = 0;
+          for (; j < 6; ++j) {
+            decodedData[5 - j] = (FX_WORD)(value % 256);
+            value >>= 8;
+          }
+          for (j = 0; j < 6; ++j) {
+            result += (FX_CHAR)decodedData[j];
+          }
+          count = 0;
+        }
+      }
+    }
+    FX_Free(decodedData);
+    if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) {
+      byteCompactedCodewords[count++] = nextCode;
+    }
+    for (int32_t i = 0; i < count; i++) {
+      result += (FX_CHAR)(FX_WORD)byteCompactedCodewords[i];
+    }
+  } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) {
+    int32_t count = 0;
+    int64_t value = 0;
+    FX_BOOL end = FALSE;
+    while (codeIndex < codewords[0] && !end) {
+      int32_t code = codewords[codeIndex++];
+      if (code < TEXT_COMPACTION_MODE_LATCH) {
+        count++;
+        value = 900 * value + code;
+      } else {
+        if (code == TEXT_COMPACTION_MODE_LATCH ||
+            code == BYTE_COMPACTION_MODE_LATCH ||
+            code == NUMERIC_COMPACTION_MODE_LATCH ||
+            code == BYTE_COMPACTION_MODE_LATCH_6 ||
+            code == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
+            code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
+            code == MACRO_PDF417_TERMINATOR) {
+          codeIndex--;
+          end = TRUE;
+        }
+      }
+      if ((count % 5 == 0) && (count > 0)) {
+        FX_WORD* decodedData = FX_Alloc(FX_WORD, 6);
+        int32_t j = 0;
+        for (; j < 6; ++j) {
+          decodedData[5 - j] = (FX_WORD)(value & 0xFF);
+          value >>= 8;
+        }
+        for (j = 0; j < 6; ++j) {
+          result += (FX_CHAR)decodedData[j];
+        }
+        count = 0;
+        FX_Free(decodedData);
+      }
+    }
+  }
+  return codeIndex;
+}
+int32_t CBC_DecodedBitStreamPaser::numericCompaction(CFX_Int32Array& codewords,
+                                                     int32_t codeIndex,
+                                                     CFX_ByteString& result,
+                                                     int32_t& e) {
+  int32_t count = 0;
+  FX_BOOL end = FALSE;
+  CFX_Int32Array numericCodewords;
+  numericCodewords.SetSize(MAX_NUMERIC_CODEWORDS);
+  while (codeIndex < codewords[0] && !end) {
+    int32_t code = codewords[codeIndex++];
+    if (codeIndex == codewords[0]) {
+      end = TRUE;
+    }
+    if (code < TEXT_COMPACTION_MODE_LATCH) {
+      numericCodewords[count] = code;
+      count++;
+    } else {
+      if (code == TEXT_COMPACTION_MODE_LATCH ||
+          code == BYTE_COMPACTION_MODE_LATCH ||
+          code == BYTE_COMPACTION_MODE_LATCH_6 ||
+          code == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
+          code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
+          code == MACRO_PDF417_TERMINATOR) {
+        codeIndex--;
+        end = TRUE;
+      }
+    }
+    if (count % MAX_NUMERIC_CODEWORDS == 0 ||
+        code == NUMERIC_COMPACTION_MODE_LATCH || end) {
+      CFX_ByteString s = decodeBase900toBase10(numericCodewords, count, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+      result += s;
+      count = 0;
+    }
+  }
+  return codeIndex;
+}
+CFX_ByteString CBC_DecodedBitStreamPaser::decodeBase900toBase10(
+    CFX_Int32Array& codewords,
+    int32_t count,
+    int32_t& e) {
+  BigInteger result = 0;
+  BigInteger nineHundred(900);
+  for (int32_t i = 0; i < count; i++) {
+    result = result * nineHundred + BigInteger(codewords[i]);
+  }
+  CFX_ByteString resultString(bigIntegerToString(result).c_str());
+  if (resultString.GetAt(0) != '1') {
+    e = BCExceptionFormatInstance;
+    return ' ';
+  }
+  return resultString.Mid(1, resultString.GetLength() - 1);
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h b/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h
new file mode 100644
index 0000000..747a4ce
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h
@@ -0,0 +1,63 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_CommonDecoderResult;
+class CBC_PDF417ResultMetadata;
+
+class CBC_DecodedBitStreamPaser {
+ public:
+  CBC_DecodedBitStreamPaser();
+  virtual ~CBC_DecodedBitStreamPaser();
+  static void Initialize();
+  static void Finalize();
+  static CBC_CommonDecoderResult* decode(CFX_Int32Array& codewords,
+                                         CFX_ByteString ecLevel,
+                                         int32_t& e);
+
+ private:
+  enum Mode { ALPHA, LOWER, MIXED, PUNCT, ALPHA_SHIFT, PUNCT_SHIFT };
+  static int32_t MAX_NUMERIC_CODEWORDS;
+  static int32_t PL;
+  static int32_t LL;
+  static int32_t AS;
+  static int32_t ML;
+  static int32_t AL;
+  static int32_t PS;
+  static int32_t PAL;
+  static FX_CHAR PUNCT_CHARS[29];
+  static FX_CHAR MIXED_CHARS[30];
+  static int32_t NUMBER_OF_SEQUENCE_CODEWORDS;
+  static int32_t decodeMacroBlock(CFX_Int32Array& codewords,
+                                  int32_t codeIndex,
+                                  CBC_PDF417ResultMetadata* resultMetadata,
+                                  int32_t& e);
+  static int32_t textCompaction(CFX_Int32Array& codewords,
+                                int32_t codeIndex,
+                                CFX_ByteString& result);
+  static void decodeTextCompaction(CFX_Int32Array& textCompactionData,
+                                   CFX_Int32Array& byteCompactionData,
+                                   int32_t length,
+                                   CFX_ByteString& result);
+  static int32_t byteCompaction(int32_t mode,
+                                CFX_Int32Array& codewords,
+                                int32_t codeIndex,
+                                CFX_ByteString& result);
+  static int32_t numericCompaction(CFX_Int32Array& codewords,
+                                   int32_t codeIndex,
+                                   CFX_ByteString& result,
+                                   int32_t& e);
+  static CFX_ByteString decodeBase900toBase10(CFX_Int32Array& codewords,
+                                              int32_t count,
+                                              int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp
new file mode 100644
index 0000000..fa278bd
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp
@@ -0,0 +1,339 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+
+int32_t CBC_DetectionResult::ADJUST_ROW_NUMBER_SKIP = 2;
+
+CBC_DetectionResult::CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata,
+                                         CBC_BoundingBox* boundingBox) {
+  m_barcodeMetadata = barcodeMetadata;
+  m_barcodeColumnCount = barcodeMetadata->getColumnCount();
+  m_boundingBox = boundingBox;
+  m_detectionResultColumns.SetSize(m_barcodeColumnCount + 2);
+  for (int32_t i = 0; i < m_barcodeColumnCount + 2; i++) {
+    m_detectionResultColumns[i] = NULL;
+  }
+}
+CBC_DetectionResult::~CBC_DetectionResult() {
+  delete m_boundingBox;
+  delete m_barcodeMetadata;
+  m_detectionResultColumns.RemoveAll();
+}
+CFX_PtrArray& CBC_DetectionResult::getDetectionResultColumns() {
+  adjustIndicatorColumnRowNumbers(
+      (CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0));
+  adjustIndicatorColumnRowNumbers(
+      (CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
+          m_barcodeColumnCount + 1));
+  int32_t unadjustedCodewordCount = CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE;
+  int32_t previousUnadjustedCount;
+  do {
+    previousUnadjustedCount = unadjustedCodewordCount;
+    unadjustedCodewordCount = adjustRowNumbers();
+  } while (unadjustedCodewordCount > 0 &&
+           unadjustedCodewordCount < previousUnadjustedCount);
+  return m_detectionResultColumns;
+}
+void CBC_DetectionResult::setBoundingBox(CBC_BoundingBox* boundingBox) {
+  m_boundingBox = boundingBox;
+}
+CBC_BoundingBox* CBC_DetectionResult::getBoundingBox() {
+  return m_boundingBox;
+}
+void CBC_DetectionResult::setDetectionResultColumn(
+    int32_t barcodeColumn,
+    CBC_DetectionResultColumn* detectionResultColumn) {
+  m_detectionResultColumns[barcodeColumn] = detectionResultColumn;
+}
+CBC_DetectionResultColumn* CBC_DetectionResult::getDetectionResultColumn(
+    int32_t barcodeColumn) {
+  return (CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn];
+}
+CFX_ByteString CBC_DetectionResult::toString() {
+  CBC_DetectionResultColumn* rowIndicatorColumn =
+      (CBC_DetectionResultColumn*)m_detectionResultColumns[0];
+  if (rowIndicatorColumn == NULL) {
+    rowIndicatorColumn = (CBC_DetectionResultColumn*)
+        m_detectionResultColumns[m_barcodeColumnCount + 1];
+  }
+  CFX_ByteString result;
+  for (int32_t codewordsRow = 0;
+       codewordsRow < rowIndicatorColumn->getCodewords()->GetSize();
+       codewordsRow++) {
+    result += (FX_CHAR)codewordsRow;
+    for (int32_t barcodeColumn = 0; barcodeColumn < m_barcodeColumnCount + 2;
+         barcodeColumn++) {
+      if (m_detectionResultColumns[barcodeColumn] == NULL) {
+        result += "    |   ";
+        continue;
+      }
+      CBC_Codeword* codeword =
+          (CBC_Codeword*)((CBC_DetectionResultColumn*)
+                              m_detectionResultColumns[barcodeColumn])
+              ->getCodewords()
+              ->GetAt(codewordsRow);
+      if (codeword == NULL) {
+        result += "    |   ";
+        continue;
+      }
+      result += codeword->getRowNumber();
+      result += codeword->getValue();
+    }
+  }
+  return result;
+}
+void CBC_DetectionResult::adjustIndicatorColumnRowNumbers(
+    CBC_DetectionResultColumn* detectionResultColumn) {
+  if (detectionResultColumn) {
+    ((CBC_DetectionResultRowIndicatorColumn*)detectionResultColumn)
+        ->adjustCompleteIndicatorColumnRowNumbers(*m_barcodeMetadata);
+  }
+}
+int32_t CBC_DetectionResult::adjustRowNumbers() {
+  int32_t unadjustedCount = adjustRowNumbersByRow();
+  if (unadjustedCount == 0) {
+    return 0;
+  }
+  for (int32_t barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1;
+       barcodeColumn++) {
+    CFX_PtrArray* codewords =
+        ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])
+            ->getCodewords();
+    for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
+         codewordsRow++) {
+      if (codewords->GetAt(codewordsRow) == NULL) {
+        continue;
+      }
+      if (!((CBC_Codeword*)codewords->GetAt(codewordsRow))
+               ->hasValidRowNumber()) {
+        adjustRowNumbers(barcodeColumn, codewordsRow, codewords);
+      }
+    }
+  }
+  return unadjustedCount;
+}
+int32_t CBC_DetectionResult::adjustRowNumbersByRow() {
+  adjustRowNumbersFromBothRI();
+  int32_t unadjustedCount = adjustRowNumbersFromLRI();
+  return unadjustedCount + adjustRowNumbersFromRRI();
+}
+int32_t CBC_DetectionResult::adjustRowNumbersFromBothRI() {
+  if (m_detectionResultColumns[0] == NULL ||
+      m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) {
+    return 0;
+  }
+  CFX_PtrArray* LRIcodewords =
+      ((CBC_DetectionResultColumn*)m_detectionResultColumns[0])->getCodewords();
+  CFX_PtrArray* RRIcodewords =
+      ((CBC_DetectionResultColumn*)
+           m_detectionResultColumns[m_barcodeColumnCount + 1])
+          ->getCodewords();
+  for (int32_t codewordsRow = 0; codewordsRow < LRIcodewords->GetSize();
+       codewordsRow++) {
+    if (LRIcodewords->GetAt(codewordsRow) &&
+        RRIcodewords->GetAt(codewordsRow) &&
+        ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber() ==
+            ((CBC_Codeword*)RRIcodewords->GetAt(codewordsRow))
+                ->getRowNumber()) {
+      for (int32_t barcodeColumn = 1; barcodeColumn <= m_barcodeColumnCount;
+           barcodeColumn++) {
+        CBC_Codeword* codeword =
+            (CBC_Codeword*)((CBC_DetectionResultColumn*)
+                                m_detectionResultColumns[barcodeColumn])
+                ->getCodewords()
+                ->GetAt(codewordsRow);
+        if (codeword == NULL) {
+          continue;
+        }
+        codeword->setRowNumber(
+            ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber());
+        if (!codeword->hasValidRowNumber()) {
+          ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])
+              ->getCodewords()
+              ->SetAt(codewordsRow, NULL);
+        }
+      }
+    }
+  }
+  return 0;
+}
+int32_t CBC_DetectionResult::adjustRowNumbersFromRRI() {
+  if (m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) {
+    return 0;
+  }
+  int32_t unadjustedCount = 0;
+  CFX_PtrArray* codewords =
+      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
+           m_barcodeColumnCount + 1))
+          ->getCodewords();
+  for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
+       codewordsRow++) {
+    if (codewords->GetAt(codewordsRow) == NULL) {
+      continue;
+    }
+    int32_t rowIndicatorRowNumber =
+        ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber();
+    int32_t invalidRowCounts = 0;
+    for (int32_t barcodeColumn = m_barcodeColumnCount + 1;
+         barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP;
+         barcodeColumn--) {
+      CBC_Codeword* codeword =
+          (CBC_Codeword*)((CBC_DetectionResultColumn*)
+                              m_detectionResultColumns.GetAt(barcodeColumn))
+              ->getCodewords()
+              ->GetAt(codewordsRow);
+      if (codeword) {
+        invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber,
+                                                  invalidRowCounts, codeword);
+        if (!codeword->hasValidRowNumber()) {
+          unadjustedCount++;
+        }
+      }
+    }
+  }
+  return unadjustedCount;
+}
+int32_t CBC_DetectionResult::adjustRowNumbersFromLRI() {
+  if (m_detectionResultColumns[0] == NULL) {
+    return 0;
+  }
+  int32_t unadjustedCount = 0;
+  CFX_PtrArray* codewords =
+      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0))
+          ->getCodewords();
+  for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
+       codewordsRow++) {
+    if (codewords->GetAt(codewordsRow) == NULL) {
+      continue;
+    }
+    int32_t rowIndicatorRowNumber =
+        ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber();
+    int32_t invalidRowCounts = 0;
+    for (int32_t barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1 &&
+                                    invalidRowCounts < ADJUST_ROW_NUMBER_SKIP;
+         barcodeColumn++) {
+      CBC_Codeword* codeword =
+          (CBC_Codeword*)((CBC_DetectionResultColumn*)
+                              m_detectionResultColumns[barcodeColumn])
+              ->getCodewords()
+              ->GetAt(codewordsRow);
+      if (codeword) {
+        invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber,
+                                                  invalidRowCounts, codeword);
+        if (!codeword->hasValidRowNumber()) {
+          unadjustedCount++;
+        }
+      }
+    }
+  }
+  return unadjustedCount;
+}
+int32_t CBC_DetectionResult::adjustRowNumberIfValid(
+    int32_t rowIndicatorRowNumber,
+    int32_t invalidRowCounts,
+    CBC_Codeword* codeword) {
+  if (codeword == NULL) {
+    return invalidRowCounts;
+  }
+  if (!codeword->hasValidRowNumber()) {
+    if (codeword->isValidRowNumber(rowIndicatorRowNumber)) {
+      codeword->setRowNumber(rowIndicatorRowNumber);
+      invalidRowCounts = 0;
+    } else {
+      ++invalidRowCounts;
+    }
+  }
+  return invalidRowCounts;
+}
+void CBC_DetectionResult::adjustRowNumbers(int32_t barcodeColumn,
+                                           int32_t codewordsRow,
+                                           CFX_PtrArray* codewords) {
+  CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
+  CFX_PtrArray* previousColumnCodewords =
+      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
+           barcodeColumn - 1))
+          ->getCodewords();
+  CFX_PtrArray* nextColumnCodewords = previousColumnCodewords;
+  if (m_detectionResultColumns[barcodeColumn + 1]) {
+    nextColumnCodewords = ((CBC_DetectionResultColumn*)
+                               m_detectionResultColumns[barcodeColumn + 1])
+                              ->getCodewords();
+  }
+  CFX_PtrArray otherCodewords;
+  otherCodewords.SetSize(14);
+  otherCodewords[2] = previousColumnCodewords->GetAt(codewordsRow);
+  otherCodewords[3] = nextColumnCodewords->GetAt(codewordsRow);
+  if (codewordsRow > 0) {
+    otherCodewords[0] = codewords->GetAt(codewordsRow - 1);
+    otherCodewords[4] = previousColumnCodewords->GetAt(codewordsRow - 1);
+    otherCodewords[5] = nextColumnCodewords->GetAt(codewordsRow - 1);
+  }
+  if (codewordsRow > 1) {
+    otherCodewords[8] = codewords->GetAt(codewordsRow - 2);
+    otherCodewords[10] = previousColumnCodewords->GetAt(codewordsRow - 2);
+    otherCodewords[11] = nextColumnCodewords->GetAt(codewordsRow - 2);
+  }
+  if (codewordsRow < codewords->GetSize() - 1) {
+    otherCodewords[1] = codewords->GetAt(codewordsRow + 1);
+    otherCodewords[6] = previousColumnCodewords->GetAt(codewordsRow + 1);
+    otherCodewords[7] = nextColumnCodewords->GetAt(codewordsRow + 1);
+  }
+  if (codewordsRow < codewords->GetSize() - 2) {
+    otherCodewords[9] = codewords->GetAt(codewordsRow + 2);
+    otherCodewords[12] = previousColumnCodewords->GetAt(codewordsRow + 2);
+    otherCodewords[13] = nextColumnCodewords->GetAt(codewordsRow + 2);
+  }
+  for (int32_t i = 0; i < otherCodewords.GetSize(); i++) {
+    CBC_Codeword* otherCodeword = (CBC_Codeword*)otherCodewords.GetAt(i);
+    if (adjustRowNumber(codeword, otherCodeword)) {
+      return;
+    }
+  }
+}
+FX_BOOL CBC_DetectionResult::adjustRowNumber(CBC_Codeword* codeword,
+                                             CBC_Codeword* otherCodeword) {
+  if (otherCodeword == NULL) {
+    return FALSE;
+  }
+  if (otherCodeword->hasValidRowNumber() &&
+      otherCodeword->getBucket() == codeword->getBucket()) {
+    codeword->setRowNumber(otherCodeword->getRowNumber());
+    return TRUE;
+  }
+  return FALSE;
+}
+int32_t CBC_DetectionResult::getBarcodeColumnCount() {
+  return m_barcodeColumnCount;
+}
+int32_t CBC_DetectionResult::getBarcodeRowCount() {
+  return m_barcodeMetadata->getRowCount();
+}
+int32_t CBC_DetectionResult::getBarcodeECLevel() {
+  return m_barcodeMetadata->getErrorCorrectionLevel();
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h
new file mode 100644
index 0000000..8b7f91b
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
+
+class CBC_BarcodeMetadata;
+class CBC_BoundingBox;
+class CBC_Codeword;
+class CBC_DetectionResultColumn;
+class CBC_DetectionResult {
+ public:
+  CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata,
+                      CBC_BoundingBox* boundingBox);
+  virtual ~CBC_DetectionResult();
+  CFX_PtrArray& getDetectionResultColumns();
+  void setBoundingBox(CBC_BoundingBox* boundingBox);
+  CBC_BoundingBox* getBoundingBox();
+  void setDetectionResultColumn(
+      int32_t barcodeColumn,
+      CBC_DetectionResultColumn* detectionResultColumn);
+  CBC_DetectionResultColumn* getDetectionResultColumn(int32_t barcodeColumn);
+  CFX_ByteString toString();
+
+  int32_t getBarcodeColumnCount();
+  int32_t getBarcodeRowCount();
+  int32_t getBarcodeECLevel();
+
+ private:
+  static int32_t ADJUST_ROW_NUMBER_SKIP;
+  CBC_BarcodeMetadata* m_barcodeMetadata;
+  CFX_PtrArray m_detectionResultColumns;
+  CBC_BoundingBox* m_boundingBox;
+  int32_t m_barcodeColumnCount;
+
+ private:
+  void adjustIndicatorColumnRowNumbers(
+      CBC_DetectionResultColumn* detectionResultColumn);
+  int32_t adjustRowNumbers();
+  int32_t adjustRowNumbersByRow();
+  int32_t adjustRowNumbersFromBothRI();
+  int32_t adjustRowNumbersFromRRI();
+  int32_t adjustRowNumbersFromLRI();
+  static int32_t adjustRowNumberIfValid(int32_t rowIndicatorRowNumber,
+                                        int32_t invalidRowCounts,
+                                        CBC_Codeword* codeword);
+  void adjustRowNumbers(int32_t barcodeColumn,
+                        int32_t codewordsRow,
+                        CFX_PtrArray* codewords);
+  static FX_BOOL adjustRowNumber(CBC_Codeword* codeword,
+                                 CBC_Codeword* otherCodeword);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp
new file mode 100644
index 0000000..24d8107
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp
@@ -0,0 +1,101 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+
+int32_t CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5;
+
+CBC_DetectionResultColumn::CBC_DetectionResultColumn(
+    CBC_BoundingBox* boundingBox) {
+  m_boundingBox = boundingBox;
+  m_codewords = new CFX_PtrArray;
+  m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1);
+}
+CBC_DetectionResultColumn::~CBC_DetectionResultColumn() {
+  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
+    delete (CBC_Codeword*)m_codewords->GetAt(i);
+  }
+  m_codewords->RemoveAll();
+  delete m_codewords;
+}
+CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(int32_t imageRow) {
+  CBC_Codeword* codeword = getCodeword(imageRow);
+  if (codeword) {
+    return codeword;
+  }
+  for (int32_t i = 1; i < MAX_NEARBY_DISTANCE; i++) {
+    int32_t nearImageRow = imageRowToCodewordIndex(imageRow) - i;
+    if (nearImageRow >= 0) {
+      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
+      if (codeword) {
+        return codeword;
+      }
+    }
+    nearImageRow = imageRowToCodewordIndex(imageRow) + i;
+    if (nearImageRow < m_codewords->GetSize()) {
+      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
+      if (codeword) {
+        return codeword;
+      }
+    }
+  }
+  return NULL;
+}
+int32_t CBC_DetectionResultColumn::imageRowToCodewordIndex(int32_t imageRow) {
+  return imageRow - m_boundingBox->getMinY();
+}
+int32_t CBC_DetectionResultColumn::codewordIndexToImageRow(
+    int32_t codewordIndex) {
+  return m_boundingBox->getMinY() + codewordIndex;
+}
+void CBC_DetectionResultColumn::setCodeword(int32_t imageRow,
+                                            CBC_Codeword* codeword) {
+  m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword);
+}
+CBC_Codeword* CBC_DetectionResultColumn::getCodeword(int32_t imageRow) {
+  return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow));
+}
+CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() {
+  return m_boundingBox;
+}
+CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() {
+  return m_codewords;
+}
+CFX_ByteString CBC_DetectionResultColumn::toString() {
+  CFX_ByteString result;
+  int32_t row = 0;
+  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
+    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
+    if (codeword == NULL) {
+      result += (FX_CHAR)row;
+      row++;
+      continue;
+    }
+    result += (FX_CHAR)row;
+    result += codeword->getRowNumber();
+    result += codeword->getValue();
+    row++;
+  }
+  return result;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h
new file mode 100644
index 0000000..ebe01a2
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
+
+class CBC_Codeword;
+class CBC_BoundingBox;
+class CBC_DetectionResultColumn {
+ public:
+  CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox);
+  virtual ~CBC_DetectionResultColumn();
+  CBC_Codeword* getCodewordNearby(int32_t imageRow);
+  int32_t imageRowToCodewordIndex(int32_t imageRow);
+  int32_t codewordIndexToImageRow(int32_t codewordIndex);
+  void setCodeword(int32_t imageRow, CBC_Codeword* codeword);
+  CBC_Codeword* getCodeword(int32_t imageRow);
+  CBC_BoundingBox* getBoundingBox();
+  CFX_PtrArray* getCodewords();
+  CFX_ByteString toString();
+
+ public:
+  CBC_BoundingBox* m_boundingBox;
+  CFX_PtrArray* m_codewords;
+
+ private:
+  static int32_t MAX_NEARBY_DISTANCE;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp
new file mode 100644
index 0000000..22fd25d
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp
@@ -0,0 +1,267 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn(
+    CBC_BoundingBox* boundingBox,
+    FX_BOOL isLeft)
+    : CBC_DetectionResultColumn(boundingBox) {
+  m_isLeft = isLeft;
+}
+CBC_DetectionResultRowIndicatorColumn::
+    ~CBC_DetectionResultRowIndicatorColumn() {}
+void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() {
+  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
+    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
+    if (codeword) {
+      codeword->setRowNumberAsRowIndicatorColumn();
+    }
+  }
+}
+int32_t
+CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers(
+    CBC_BarcodeMetadata barcodeMetadata) {
+  CFX_PtrArray* codewords = getCodewords();
+  setRowNumbers();
+  removeIncorrectCodewords(codewords, barcodeMetadata);
+  CBC_BoundingBox* boundingBox = getBoundingBox();
+  CBC_ResultPoint* top =
+      m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight();
+  CBC_ResultPoint* bottom =
+      m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight();
+  int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY());
+  int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY());
+  FX_FLOAT averageRowHeight =
+      (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount();
+  int32_t barcodeRow = -1;
+  int32_t maxRowHeight = 1;
+  int32_t currentRowHeight = 0;
+  for (int32_t codewordsRow = firstRow; codewordsRow < lastRow;
+       codewordsRow++) {
+    if (codewords->GetAt(codewordsRow) == NULL) {
+      continue;
+    }
+    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
+    int32_t rowDifference = codeword->getRowNumber() - barcodeRow;
+    if (rowDifference == 0) {
+      currentRowHeight++;
+    } else if (rowDifference == 1) {
+      maxRowHeight =
+          maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight;
+      currentRowHeight = 1;
+      barcodeRow = codeword->getRowNumber();
+    } else if (rowDifference < 0) {
+      codewords->SetAt(codewordsRow, NULL);
+    } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) {
+      codewords->SetAt(codewordsRow, NULL);
+    } else if (rowDifference > codewordsRow) {
+      codewords->SetAt(codewordsRow, NULL);
+    } else {
+      int32_t checkedRows;
+      if (maxRowHeight > 2) {
+        checkedRows = (maxRowHeight - 2) * rowDifference;
+      } else {
+        checkedRows = rowDifference;
+      }
+      FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow;
+      for (int32_t i = 1; i <= checkedRows && !closePreviousCodewordFound;
+           i++) {
+        closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL;
+      }
+      if (closePreviousCodewordFound) {
+        codewords->SetAt(codewordsRow, NULL);
+      } else {
+        barcodeRow = codeword->getRowNumber();
+        currentRowHeight = 1;
+      }
+    }
+  }
+  return (int32_t)(averageRowHeight + 0.5);
+}
+CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights(
+    int32_t& e) {
+  CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata();
+  if (barcodeMetadata == NULL) {
+    e = BCExceptionCannotMetadata;
+    return NULL;
+  }
+  adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata);
+  CFX_Int32Array* result = new CFX_Int32Array;
+  result->SetSize(barcodeMetadata->getRowCount());
+  for (int32_t i = 0; i < getCodewords()->GetSize(); i++) {
+    CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i);
+    if (codeword) {
+      result->SetAt(codeword->getRowNumber(),
+                    result->GetAt(codeword->getRowNumber()) + 1);
+    }
+  }
+  return result;
+}
+int32_t CBC_DetectionResultRowIndicatorColumn::
+    adjustIncompleteIndicatorColumnRowNumbers(
+        CBC_BarcodeMetadata barcodeMetadata) {
+  CBC_BoundingBox* boundingBox = getBoundingBox();
+  CBC_ResultPoint* top =
+      m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight();
+  CBC_ResultPoint* bottom =
+      m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight();
+  int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY());
+  int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY());
+  FX_FLOAT averageRowHeight =
+      (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount();
+  CFX_PtrArray* codewords = getCodewords();
+  int32_t barcodeRow = -1;
+  int32_t maxRowHeight = 1;
+  int32_t currentRowHeight = 0;
+  for (int32_t codewordsRow = firstRow; codewordsRow < lastRow;
+       codewordsRow++) {
+    if (codewords->GetAt(codewordsRow) == NULL) {
+      continue;
+    }
+    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
+    codeword->setRowNumberAsRowIndicatorColumn();
+    int32_t rowDifference = codeword->getRowNumber() - barcodeRow;
+    if (rowDifference == 0) {
+      currentRowHeight++;
+    } else if (rowDifference == 1) {
+      maxRowHeight =
+          maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight;
+      currentRowHeight = 1;
+      barcodeRow = codeword->getRowNumber();
+    } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) {
+      codewords->SetAt(codewordsRow, NULL);
+    } else {
+      barcodeRow = codeword->getRowNumber();
+      currentRowHeight = 1;
+    }
+  }
+  return (int32_t)(averageRowHeight + 0.5);
+}
+CBC_BarcodeMetadata*
+CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() {
+  CFX_PtrArray* codewords = getCodewords();
+  CBC_BarcodeValue barcodeColumnCount;
+  CBC_BarcodeValue barcodeRowCountUpperPart;
+  CBC_BarcodeValue barcodeRowCountLowerPart;
+  CBC_BarcodeValue barcodeECLevel;
+  for (int32_t i = 0; i < codewords->GetSize(); i++) {
+    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i);
+    if (codeword == NULL) {
+      continue;
+    }
+    codeword->setRowNumberAsRowIndicatorColumn();
+    int32_t rowIndicatorValue = codeword->getValue() % 30;
+    int32_t codewordRowNumber = codeword->getRowNumber();
+    if (!m_isLeft) {
+      codewordRowNumber += 2;
+    }
+    switch (codewordRowNumber % 3) {
+      case 0:
+        barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1);
+        break;
+      case 1:
+        barcodeECLevel.setValue(rowIndicatorValue / 3);
+        barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3);
+        break;
+      case 2:
+        barcodeColumnCount.setValue(rowIndicatorValue + 1);
+        break;
+    }
+  }
+  if ((barcodeColumnCount.getValue()->GetSize() == 0) ||
+      (barcodeRowCountUpperPart.getValue()->GetSize() == 0) ||
+      (barcodeRowCountLowerPart.getValue()->GetSize() == 0) ||
+      (barcodeECLevel.getValue()->GetSize() == 0) ||
+      barcodeColumnCount.getValue()->GetAt(0) < 1 ||
+      barcodeRowCountUpperPart.getValue()->GetAt(0) +
+              barcodeRowCountLowerPart.getValue()->GetAt(0) <
+          CBC_PDF417Common::MIN_ROWS_IN_BARCODE ||
+      barcodeRowCountUpperPart.getValue()->GetAt(0) +
+              barcodeRowCountLowerPart.getValue()->GetAt(0) >
+          CBC_PDF417Common::MAX_ROWS_IN_BARCODE) {
+    return NULL;
+  }
+  CBC_BarcodeMetadata* barcodeMetadata =
+      new CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0),
+                              barcodeRowCountUpperPart.getValue()->GetAt(0),
+                              barcodeRowCountLowerPart.getValue()->GetAt(0),
+                              barcodeECLevel.getValue()->GetAt(0));
+  removeIncorrectCodewords(codewords, *barcodeMetadata);
+  return barcodeMetadata;
+}
+FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() {
+  return m_isLeft;
+}
+CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() {
+  return (CFX_ByteString) "IsLeft: " + (CFX_ByteString)m_isLeft + '\n' +
+         CBC_DetectionResultColumn::toString();
+}
+void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords(
+    CFX_PtrArray* codewords,
+    CBC_BarcodeMetadata barcodeMetadata) {
+  for (int32_t codewordRow = 0; codewordRow < codewords->GetSize();
+       codewordRow++) {
+    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow);
+    if (codeword == NULL) {
+      continue;
+    }
+    int32_t rowIndicatorValue = codeword->getValue() % 30;
+    int32_t codewordRowNumber = codeword->getRowNumber();
+    if (codewordRowNumber > barcodeMetadata.getRowCount()) {
+      codewords->SetAt(codewordRow, NULL);
+      continue;
+    }
+    if (!m_isLeft) {
+      codewordRowNumber += 2;
+    }
+    switch (codewordRowNumber % 3) {
+      case 0:
+        if (rowIndicatorValue * 3 + 1 !=
+            barcodeMetadata.getRowCountUpperPart()) {
+          codewords->SetAt(codewordRow, NULL);
+        }
+        break;
+      case 1:
+        if (rowIndicatorValue / 3 !=
+                barcodeMetadata.getErrorCorrectionLevel() ||
+            rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) {
+          codewords->SetAt(codewordRow, NULL);
+        }
+        break;
+      case 2:
+        if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) {
+          codewords->SetAt(codewordRow, NULL);
+        }
+        break;
+    }
+  }
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h
new file mode 100644
index 0000000..dfe6a06
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
+
+class CBC_BarcodeMetadata;
+class CBC_BoundingBox;
+class CBC_DetectionResultRowIndicatorColumn;
+class CBC_DetectionResultRowIndicatorColumn : public CBC_DetectionResultColumn {
+ public:
+  CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox,
+                                        FX_BOOL isLeft);
+  virtual ~CBC_DetectionResultRowIndicatorColumn();
+  void setRowNumbers();
+  int32_t adjustCompleteIndicatorColumnRowNumbers(
+      CBC_BarcodeMetadata barcodeMetadata);
+  CFX_Int32Array* getRowHeights(int32_t& e);
+  int32_t adjustIncompleteIndicatorColumnRowNumbers(
+      CBC_BarcodeMetadata barcodeMetadata);
+  CBC_BarcodeMetadata* getBarcodeMetadata();
+  FX_BOOL isLeft();
+  CFX_ByteString toString();
+
+ private:
+  FX_BOOL m_isLeft;
+  void removeIncorrectCodewords(CFX_PtrArray* codewords,
+                                CBC_BarcodeMetadata barcodeMetadata);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Detector.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Detector.cpp
new file mode 100644
index 0000000..cfd52e5
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Detector.cpp
@@ -0,0 +1,352 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/utils.h"
+
+#define INTEGER_MAX 2147483647
+
+int32_t CBC_Detector::INDEXES_START_PATTERN[] = {0, 4, 1, 5};
+int32_t CBC_Detector::INDEXES_STOP_PATTERN[] = {6, 2, 7, 3};
+int32_t CBC_Detector::INTEGER_MATH_SHIFT = 8;
+int32_t CBC_Detector::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1
+                                                          << INTEGER_MATH_SHIFT;
+int32_t CBC_Detector::MAX_AVG_VARIANCE =
+    (int32_t)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f);
+int32_t CBC_Detector::MAX_INDIVIDUAL_VARIANCE =
+    (int32_t)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f);
+int32_t CBC_Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3};
+int32_t CBC_Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1};
+int32_t CBC_Detector::MAX_PIXEL_DRIFT = 3;
+int32_t CBC_Detector::MAX_PATTERN_DRIFT = 5;
+int32_t CBC_Detector::SKIPPED_ROW_COUNT_MAX = 25;
+int32_t CBC_Detector::ROW_STEP = 5;
+int32_t CBC_Detector::BARCODE_MIN_HEIGHT = 10;
+
+CBC_Detector::CBC_Detector() {}
+CBC_Detector::~CBC_Detector() {}
+CBC_PDF417DetectorResult* CBC_Detector::detect(CBC_BinaryBitmap* image,
+                                               int32_t hints,
+                                               FX_BOOL multiple,
+                                               int32_t& e) {
+  CBC_CommonBitMatrix* bitMatrix = image->GetBlackMatrix(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* barcodeCoordinates = detect(multiple, bitMatrix);
+  if (barcodeCoordinates->GetSize() == 0) {
+    rotate180(bitMatrix);
+    barcodeCoordinates = detect(multiple, bitMatrix);
+  }
+  if (barcodeCoordinates->GetSize() == 0) {
+    e = BCExceptionUnSupportedBarcode;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CBC_PDF417DetectorResult* detectorResult =
+      new CBC_PDF417DetectorResult(bitMatrix, barcodeCoordinates);
+  return detectorResult;
+}
+void CBC_Detector::rotate180(CBC_CommonBitMatrix* bitMatrix) {
+  int32_t width = bitMatrix->GetWidth();
+  int32_t height = bitMatrix->GetHeight();
+  CBC_CommonBitArray* firstRowBitArray = new CBC_CommonBitArray(width);
+  CBC_CommonBitArray* secondRowBitArray = new CBC_CommonBitArray(width);
+  CBC_CommonBitArray* tmpBitArray = new CBC_CommonBitArray(width);
+  for (int32_t y = 0; y<(height + 1)>> 1; y++) {
+    CBC_CommonBitArray* temp =
+        bitMatrix->GetRow(height - 1 - y, secondRowBitArray);
+    CBC_CommonBitArray* tempfirstRow = firstRowBitArray;
+    firstRowBitArray = bitMatrix->GetRow(y, tempfirstRow);
+    delete tempfirstRow;
+    CBC_CommonBitArray* row = mirror(temp, tmpBitArray);
+    delete temp;
+    bitMatrix->SetRow(y, row);
+    delete row;
+    CBC_CommonBitArray* rowfirstRow = mirror(firstRowBitArray, tmpBitArray);
+    bitMatrix->SetRow(height - 1 - y, rowfirstRow);
+    delete rowfirstRow;
+  }
+  delete tmpBitArray;
+  delete firstRowBitArray;
+  delete secondRowBitArray;
+}
+CBC_CommonBitArray* CBC_Detector::mirror(CBC_CommonBitArray* input,
+                                         CBC_CommonBitArray* result) {
+  CBC_CommonBitArray* array = new CBC_CommonBitArray(result->GetSize());
+  array->Clear();
+  int32_t size = input->GetSize();
+  for (int32_t i = 0; i < size; i++) {
+    if (input->Get(i)) {
+      array->Set(size - 1 - i);
+    }
+  }
+  return array;
+}
+CFX_PtrArray* CBC_Detector::detect(FX_BOOL multiple,
+                                   CBC_CommonBitMatrix* bitMatrix) {
+  CFX_PtrArray* barcodeCoordinates = new CFX_PtrArray;
+  int32_t row = 0;
+  int32_t column = 0;
+  FX_BOOL foundBarcodeInRow = FALSE;
+  while (row < bitMatrix->GetHeight()) {
+    CFX_PtrArray* vertices = findVertices(bitMatrix, row, column);
+    if (vertices->GetAt(0) == NULL && vertices->GetAt(3) == NULL) {
+      if (!foundBarcodeInRow) {
+        if (vertices) {
+          delete (vertices);
+        }
+        break;
+      }
+      foundBarcodeInRow = FALSE;
+      column = 0;
+      for (int32_t i = 0; i < barcodeCoordinates->GetSize(); i++) {
+        CFX_PtrArray* barcodeCoordinate =
+            (CFX_PtrArray*)barcodeCoordinates->GetAt(i);
+        if (barcodeCoordinate->GetAt(1)) {
+          row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY();
+        }
+        if (barcodeCoordinate->GetAt(3)) {
+          row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY();
+        }
+      }
+      row += ROW_STEP;
+      if (vertices) {
+        delete (vertices);
+      }
+      continue;
+    }
+    foundBarcodeInRow = TRUE;
+    barcodeCoordinates->Add(vertices);
+    if (!multiple) {
+      break;
+    }
+    if (vertices->GetAt(2)) {
+      column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetX();
+      row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetY();
+    } else {
+      column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetX();
+      row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetY();
+    }
+  }
+  return barcodeCoordinates;
+}
+CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix,
+                                         int32_t startRow,
+                                         int32_t startColumn) {
+  int32_t height = matrix->GetHeight();
+  int32_t width = matrix->GetWidth();
+  CFX_PtrArray* result = new CFX_PtrArray;
+  result->SetSize(8);
+  CFX_PtrArray* startptr = findRowsWithPattern(
+      matrix, height, width, startRow, startColumn, START_PATTERN,
+      sizeof(START_PATTERN) / sizeof(START_PATTERN[0]));
+  copyToResult(
+      result, startptr, INDEXES_START_PATTERN,
+      sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0]));
+  startptr->RemoveAll();
+  delete startptr;
+  if (result->GetAt(4)) {
+    startColumn = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetX();
+    startRow = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetY();
+  }
+  CFX_PtrArray* stopptr = findRowsWithPattern(
+      matrix, height, width, startRow, startColumn, STOP_PATTERN,
+      sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0]));
+  copyToResult(result, stopptr, INDEXES_STOP_PATTERN,
+               sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0]));
+  stopptr->RemoveAll();
+  delete stopptr;
+  return result;
+}
+void CBC_Detector::copyToResult(CFX_PtrArray* result,
+                                CFX_PtrArray* tmpResult,
+                                int32_t* destinationIndexes,
+                                int32_t destinationLength) {
+  for (int32_t i = 0; i < destinationLength; i++) {
+    result->SetAt(destinationIndexes[i], tmpResult->GetAt(i));
+  }
+}
+CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix,
+                                                int32_t height,
+                                                int32_t width,
+                                                int32_t startRow,
+                                                int32_t startColumn,
+                                                int32_t* pattern,
+                                                int32_t patternLength) {
+  CFX_PtrArray* result = new CFX_PtrArray;
+  result->SetSize(4);
+  FX_BOOL found = FALSE;
+  CFX_Int32Array counters;
+  counters.SetSize(patternLength);
+  for (; startRow < height; startRow += ROW_STEP) {
+    CFX_Int32Array* loc =
+        findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern,
+                         patternLength, counters);
+    if (loc) {
+      while (startRow > 0) {
+        CFX_Int32Array* previousRowLoc =
+            findGuardPattern(matrix, startColumn, --startRow, width, FALSE,
+                             pattern, patternLength, counters);
+        if (previousRowLoc) {
+          delete loc;
+          loc = previousRowLoc;
+        } else {
+          startRow++;
+          break;
+        }
+      }
+      result->SetAt(
+          0, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow));
+      result->SetAt(
+          1, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow));
+      found = TRUE;
+      delete loc;
+      break;
+    }
+  }
+  int32_t stopRow = startRow + 1;
+  if (found) {
+    int32_t skippedRowCount = 0;
+    CFX_Int32Array previousRowLoc;
+    previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(0))->GetX());
+    previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(1))->GetX());
+    for (; stopRow < height; stopRow++) {
+      CFX_Int32Array* loc =
+          findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE,
+                           pattern, patternLength, counters);
+      if (loc && abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT &&
+          abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) {
+        previousRowLoc.Copy(*loc);
+        skippedRowCount = 0;
+      } else {
+        if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) {
+          delete loc;
+          break;
+        } else {
+          skippedRowCount++;
+        }
+      }
+      delete loc;
+    }
+    stopRow -= skippedRowCount + 1;
+    result->SetAt(2, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0),
+                                         (FX_FLOAT)stopRow));
+    result->SetAt(3, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1),
+                                         (FX_FLOAT)stopRow));
+  }
+  if (stopRow - startRow < BARCODE_MIN_HEIGHT) {
+    for (int32_t i = 0; i < result->GetSize(); i++) {
+      result->SetAt(i, NULL);
+    }
+  }
+  return result;
+}
+CFX_Int32Array* CBC_Detector::findGuardPattern(CBC_CommonBitMatrix* matrix,
+                                               int32_t column,
+                                               int32_t row,
+                                               int32_t width,
+                                               FX_BOOL whiteFirst,
+                                               int32_t* pattern,
+                                               int32_t patternLength,
+                                               CFX_Int32Array& counters) {
+  for (int32_t i = 0; i < counters.GetSize(); i++) {
+    counters.SetAt(i, 0);
+  }
+  FX_BOOL isWhite = whiteFirst;
+  int32_t patternStart = column;
+  int32_t pixelDrift = 0;
+  CFX_Int32Array* intarray = new CFX_Int32Array;
+  while (matrix->Get(patternStart, row) && patternStart > 0 &&
+         pixelDrift++ < MAX_PIXEL_DRIFT) {
+    patternStart--;
+  }
+  int32_t x = patternStart;
+  int32_t counterPosition = 0;
+  for (; x < width; x++) {
+    FX_BOOL pixel = matrix->Get(x, row);
+    if (pixel ^ isWhite) {
+      counters[counterPosition]++;
+    } else {
+      if (counterPosition == patternLength - 1) {
+        if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) <
+            MAX_AVG_VARIANCE) {
+          intarray->Add(patternStart);
+          intarray->Add(x);
+          return intarray;
+        }
+        patternStart += counters[0] + counters[1];
+        for (int32_t l = 2, k = 0; l < patternLength; l++, k++) {
+          counters.SetAt(k, counters.GetAt(l));
+        }
+        counters.SetAt(patternLength - 2, 0);
+        counters.SetAt(patternLength - 1, 0);
+        counterPosition--;
+      } else {
+        counterPosition++;
+      }
+      counters[counterPosition] = 1;
+      isWhite = !isWhite;
+    }
+  }
+  if (counterPosition == patternLength - 1) {
+    if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) <
+        MAX_AVG_VARIANCE) {
+      intarray->Add(patternStart);
+      intarray->Add(x - 1);
+      return intarray;
+    }
+  }
+  delete intarray;
+  return NULL;
+}
+int32_t CBC_Detector::patternMatchVariance(CFX_Int32Array& counters,
+                                           int32_t* pattern,
+                                           int32_t maxIndividualVariance) {
+  int32_t numCounters = counters.GetSize();
+  int32_t total = 0;
+  int32_t patternLength = 0;
+  for (int32_t i = 0; i < numCounters; i++) {
+    total += counters[i];
+    patternLength += pattern[i];
+  }
+  if (total < patternLength) {
+    return INTEGER_MAX;
+  }
+  int32_t unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength;
+  maxIndividualVariance =
+      (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT;
+  int32_t totalVariance = 0;
+  for (int32_t x = 0; x < numCounters; x++) {
+    int32_t counter = counters[x] << INTEGER_MATH_SHIFT;
+    int32_t scaledPattern = pattern[x] * unitBarWidth;
+    int32_t variance = counter > scaledPattern ? counter - scaledPattern
+                                               : scaledPattern - counter;
+    if (variance > maxIndividualVariance) {
+      return INTEGER_MAX;
+    }
+    totalVariance += variance;
+  }
+  return totalVariance / total;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Detector.h b/xfa/fxbarcode/pdf417/BC_PDF417Detector.h
new file mode 100644
index 0000000..dda039d
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Detector.h
@@ -0,0 +1,69 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
+
+class CBC_PDF417DetectorResult;
+class CBC_BinaryBitmap;
+class CBC_CommonBitMatrix;
+class CBC_CommonBitArray;
+
+class CBC_Detector {
+ public:
+  CBC_Detector();
+  virtual ~CBC_Detector();
+  static CBC_PDF417DetectorResult* detect(CBC_BinaryBitmap* image,
+                                          int32_t hints,
+                                          FX_BOOL multiple,
+                                          int32_t& e);
+  static void rotate180(CBC_CommonBitMatrix* bitMatrix);
+  static CBC_CommonBitArray* mirror(CBC_CommonBitArray* input,
+                                    CBC_CommonBitArray* result);
+
+ private:
+  static int32_t INDEXES_START_PATTERN[];
+  static int32_t INDEXES_STOP_PATTERN[];
+  static int32_t INTEGER_MATH_SHIFT;
+  static int32_t PATTERN_MATCH_RESULT_SCALE_FACTOR;
+  static int32_t MAX_AVG_VARIANCE;
+  static int32_t MAX_INDIVIDUAL_VARIANCE;
+  static int32_t START_PATTERN[];
+  static int32_t STOP_PATTERN[];
+  static int32_t MAX_PIXEL_DRIFT;
+  static int32_t MAX_PATTERN_DRIFT;
+  static int32_t SKIPPED_ROW_COUNT_MAX;
+  static int32_t ROW_STEP;
+  static int32_t BARCODE_MIN_HEIGHT;
+  static CFX_PtrArray* detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix);
+  static CFX_PtrArray* findVertices(CBC_CommonBitMatrix* matrix,
+                                    int32_t startRow,
+                                    int32_t startColumn);
+  static void copyToResult(CFX_PtrArray* result,
+                           CFX_PtrArray* tmpResult,
+                           int32_t* destinationIndexes,
+                           int32_t destinationLength);
+  static CFX_PtrArray* findRowsWithPattern(CBC_CommonBitMatrix* matrix,
+                                           int32_t height,
+                                           int32_t width,
+                                           int32_t startRow,
+                                           int32_t startColumn,
+                                           int32_t* pattern,
+                                           int32_t patternLength);
+  static CFX_Int32Array* findGuardPattern(CBC_CommonBitMatrix* matrix,
+                                          int32_t column,
+                                          int32_t row,
+                                          int32_t width,
+                                          FX_BOOL whiteFirst,
+                                          int32_t* pattern,
+                                          int32_t patternLength,
+                                          CFX_Int32Array& counters);
+  static int32_t patternMatchVariance(CFX_Int32Array& counters,
+                                      int32_t* pattern,
+                                      int32_t maxIndividualVariance);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp b/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp
new file mode 100644
index 0000000..557d50d
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+
+CBC_PDF417DetectorResult::CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits,
+                                                   CFX_PtrArray* points) {
+  m_bits = bits;
+  m_points = points;
+}
+CBC_PDF417DetectorResult::~CBC_PDF417DetectorResult() {
+  for (int32_t i = 0; i < m_points->GetSize(); i++) {
+    CFX_PtrArray* temp = (CFX_PtrArray*)m_points->GetAt(i);
+    for (int32_t j = 0; j < temp->GetSize(); j++) {
+      delete (CBC_ResultPoint*)temp->GetAt(j);
+    }
+    temp->RemoveAll();
+    delete temp;
+  }
+  m_points->RemoveAll();
+  delete m_points;
+}
+CBC_CommonBitMatrix* CBC_PDF417DetectorResult::getBits() {
+  return m_bits;
+}
+
+CFX_PtrArray* CBC_PDF417DetectorResult::getPoints() {
+  return m_points;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h b/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h
new file mode 100644
index 0000000..0eea685
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+
+class CBC_PDF417DetectorResult {
+ public:
+  CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points);
+  virtual ~CBC_PDF417DetectorResult();
+  CBC_CommonBitMatrix* getBits();
+  CFX_PtrArray* getPoints();
+
+ private:
+  CBC_CommonBitMatrix* m_bits;
+  CFX_PtrArray* m_points;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.cpp
new file mode 100644
index 0000000..3f0b314
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h"
+
+CBC_Dimensions::CBC_Dimensions(int32_t minCols,
+                               int32_t maxCols,
+                               int32_t minRows,
+                               int32_t maxRows) {
+  m_minCols = minCols;
+  m_maxCols = maxCols;
+  m_minRows = minRows;
+  m_maxRows = maxRows;
+}
+CBC_Dimensions::~CBC_Dimensions() {}
+int32_t CBC_Dimensions::getMinCols() {
+  return m_minCols;
+}
+int32_t CBC_Dimensions::getMaxCols() {
+  return m_maxCols;
+}
+int32_t CBC_Dimensions::getMinRows() {
+  return m_minRows;
+}
+int32_t CBC_Dimensions::getMaxRows() {
+  return m_maxRows;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h b/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h
new file mode 100644
index 0000000..622ad23
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Dimensions.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
+
+#include <stdint.h>
+
+class CBC_Dimensions {
+ public:
+  CBC_Dimensions(int32_t minCols,
+                 int32_t maxCols,
+                 int32_t minRows,
+                 int32_t maxRows);
+  virtual ~CBC_Dimensions();
+  int32_t getMinCols();
+  int32_t getMaxCols();
+  int32_t getMinRows();
+  int32_t getMaxRows();
+
+ private:
+  int32_t m_minCols;
+  int32_t m_maxCols;
+  int32_t m_minRows;
+  int32_t m_maxRows;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
new file mode 100644
index 0000000..830b65e
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
@@ -0,0 +1,389 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL;
+
+void CBC_PDF417ECErrorCorrection::Initialize(int32_t& e) {
+  m_field =
+      new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
+}
+void CBC_PDF417ECErrorCorrection::Finalize() {
+  delete m_field;
+}
+CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() {}
+CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() {}
+int32_t CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array& received,
+                                            int32_t numECCodewords,
+                                            CFX_Int32Array& erasures,
+                                            int32_t& e) {
+  CBC_PDF417ECModulusPoly poly(m_field, received, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  CFX_Int32Array S;
+  S.SetSize(numECCodewords);
+  FX_BOOL error = FALSE;
+  for (int32_t l = numECCodewords; l > 0; l--) {
+    int32_t eval = poly.evaluateAt(m_field->exp(l));
+    S[numECCodewords - l] = eval;
+    if (eval != 0) {
+      error = TRUE;
+    }
+  }
+  if (!error) {
+    return 0;
+  }
+  CBC_PDF417ECModulusPoly* syndrome =
+      new CBC_PDF417ECModulusPoly(m_field, S, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  CBC_PDF417ECModulusPoly* buildmonomial =
+      m_field->buildMonomial(numECCodewords, 1, e);
+  if (e != BCExceptionNO) {
+    delete syndrome;
+    return -1;
+  }
+  CFX_PtrArray* sigmaOmega =
+      runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e);
+  delete buildmonomial;
+  delete syndrome;
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  CBC_PDF417ECModulusPoly* sigma =
+      (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0);
+  CBC_PDF417ECModulusPoly* omega =
+      (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1);
+  CFX_Int32Array* errorLocations = findErrorLocations(sigma, e);
+  if (e != BCExceptionNO) {
+    for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
+      delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
+    }
+    sigmaOmega->RemoveAll();
+    delete sigmaOmega;
+    return -1;
+  }
+  CFX_Int32Array* errorMagnitudes =
+      findErrorMagnitudes(omega, sigma, *errorLocations, e);
+  if (e != BCExceptionNO) {
+    delete errorLocations;
+    for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
+      delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
+    }
+    sigmaOmega->RemoveAll();
+    delete sigmaOmega;
+    return -1;
+  }
+  for (int32_t i = 0; i < errorLocations->GetSize(); i++) {
+    int32_t log = m_field->log(errorLocations->GetAt(i), e);
+
+    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+    int32_t position = received.GetSize() - 1 - log;
+    if (position < 0) {
+      e = BCExceptionChecksumException;
+      delete errorLocations;
+      delete errorMagnitudes;
+      for (int32_t j = 0; j < sigmaOmega->GetSize(); j++) {
+        delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j);
+      }
+      sigmaOmega->RemoveAll();
+      delete sigmaOmega;
+      return -1;
+    }
+    received[position] =
+        m_field->subtract(received[position], errorMagnitudes->GetAt(i));
+  }
+  int32_t result = errorLocations->GetSize();
+  delete errorLocations;
+  delete errorMagnitudes;
+  for (int32_t k = 0; k < sigmaOmega->GetSize(); k++) {
+    delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k);
+  }
+  sigmaOmega->RemoveAll();
+  delete sigmaOmega;
+  return result;
+}
+CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(
+    CBC_PDF417ECModulusPoly* a,
+    CBC_PDF417ECModulusPoly* b,
+    int32_t R,
+    int32_t& e) {
+  if (a->getDegree() < b->getDegree()) {
+    CBC_PDF417ECModulusPoly* temp = a;
+    a = b;
+    b = temp;
+  }
+  CBC_PDF417ECModulusPoly* rLast = a;
+  CBC_PDF417ECModulusPoly* r = b;
+  CBC_PDF417ECModulusPoly* tLast = m_field->getZero();
+  CBC_PDF417ECModulusPoly* t = m_field->getOne();
+  CBC_PDF417ECModulusPoly* qtemp = NULL;
+  CBC_PDF417ECModulusPoly* rtemp = NULL;
+  CBC_PDF417ECModulusPoly* ttemp = NULL;
+  int32_t i = 0;
+  int32_t j = 0;
+  int32_t m = 0;
+  int32_t n = 0;
+  while (r->getDegree() >= R / 2) {
+    CBC_PDF417ECModulusPoly* rLastLast = rLast;
+    CBC_PDF417ECModulusPoly* tLastLast = tLast;
+    rLast = r;
+    tLast = t;
+    m = i;
+    n = j;
+    if (rLast->isZero()) {
+      e = BCExceptionChecksumException;
+      if (qtemp) {
+        delete qtemp;
+      }
+      if (rtemp) {
+        delete rtemp;
+      }
+      if (ttemp) {
+        delete ttemp;
+      }
+      return NULL;
+    }
+    r = rLastLast;
+    CBC_PDF417ECModulusPoly* q = m_field->getZero();
+    int32_t denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree());
+    int32_t dltInverse = m_field->inverse(denominatorLeadingTerm, e);
+    if (e != BCExceptionNO) {
+      if (qtemp) {
+        delete qtemp;
+      }
+      if (rtemp) {
+        delete rtemp;
+      }
+      if (ttemp) {
+        delete ttemp;
+      }
+      return NULL;
+    }
+    while (r->getDegree() >= rLast->getDegree() && !r->isZero()) {
+      int32_t degreeDiff = r->getDegree() - rLast->getDegree();
+      int32_t scale =
+          m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse);
+      CBC_PDF417ECModulusPoly* buildmonomial =
+          m_field->buildMonomial(degreeDiff, scale, e);
+      if (e != BCExceptionNO) {
+        if (qtemp) {
+          delete qtemp;
+        }
+        if (rtemp) {
+          delete rtemp;
+        }
+        if (ttemp) {
+          delete ttemp;
+        }
+        return NULL;
+      }
+      q = q->add(buildmonomial, e);
+      delete buildmonomial;
+      if (qtemp) {
+        delete qtemp;
+      }
+      if (e != BCExceptionNO) {
+        if (rtemp) {
+          delete rtemp;
+        }
+        if (ttemp) {
+          delete ttemp;
+        }
+        return NULL;
+      }
+      qtemp = q;
+      CBC_PDF417ECModulusPoly* multiply =
+          rLast->multiplyByMonomial(degreeDiff, scale, e);
+      if (e != BCExceptionNO) {
+        if (qtemp) {
+          delete qtemp;
+        }
+        if (rtemp) {
+          delete rtemp;
+        }
+        if (ttemp) {
+          delete ttemp;
+        }
+        return NULL;
+      }
+      CBC_PDF417ECModulusPoly* temp = r;
+      r = temp->subtract(multiply, e);
+      delete multiply;
+      if (m > 1 && i > m) {
+        delete temp;
+        temp = NULL;
+      }
+      if (e != BCExceptionNO) {
+        if (qtemp) {
+          delete qtemp;
+        }
+        if (rtemp) {
+          delete rtemp;
+        }
+        if (ttemp) {
+          delete ttemp;
+        }
+        return NULL;
+      }
+      rtemp = r;
+      i = m + 1;
+    }
+    ttemp = q->multiply(tLast, e);
+    if (qtemp) {
+      delete qtemp;
+      qtemp = NULL;
+    }
+    if (e != BCExceptionNO) {
+      if (rtemp) {
+        delete rtemp;
+      }
+      if (ttemp) {
+        delete ttemp;
+      }
+      return NULL;
+    }
+    t = ttemp->subtract(tLastLast, e);
+    if (n > 1 && j > n) {
+      delete tLastLast;
+    }
+    delete ttemp;
+    if (e != BCExceptionNO) {
+      if (rtemp) {
+        delete rtemp;
+      }
+      return NULL;
+    }
+    ttemp = t;
+    t = ttemp->negative(e);
+    delete ttemp;
+    if (e != BCExceptionNO) {
+      if (rtemp) {
+        delete rtemp;
+      }
+      return NULL;
+    }
+    ttemp = t;
+    j++;
+  }
+  int32_t sigmaTildeAtZero = t->getCoefficient(0);
+  if (sigmaTildeAtZero == 0) {
+    e = BCExceptionChecksumException;
+    if (rtemp) {
+      delete rtemp;
+    }
+    if (ttemp) {
+      delete ttemp;
+    }
+    return NULL;
+  }
+  int32_t inverse = m_field->inverse(sigmaTildeAtZero, e);
+  if (e != BCExceptionNO) {
+    if (rtemp) {
+      delete rtemp;
+    }
+    if (ttemp) {
+      delete ttemp;
+    }
+    return NULL;
+  }
+  CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e);
+  if (ttemp) {
+    delete ttemp;
+  }
+  if (e != BCExceptionNO) {
+    if (rtemp) {
+      delete rtemp;
+    }
+    return NULL;
+  }
+  CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e);
+  if (rtemp) {
+    delete rtemp;
+  }
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* modulusPoly = new CFX_PtrArray;
+  modulusPoly->Add(sigma);
+  modulusPoly->Add(omega);
+  return modulusPoly;
+}
+CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(
+    CBC_PDF417ECModulusPoly* errorLocator,
+    int32_t& e) {
+  int32_t numErrors = errorLocator->getDegree();
+  CFX_Int32Array* result = new CFX_Int32Array;
+  result->SetSize(numErrors);
+  int32_t ee = 0;
+  for (int32_t i = 1; i < m_field->getSize() && ee < numErrors; i++) {
+    if (errorLocator->evaluateAt(i) == 0) {
+      result->SetAt(ee, m_field->inverse(i, e));
+      if (e != BCExceptionNO) {
+        delete result;
+        return NULL;
+      }
+      ee++;
+    }
+  }
+  if (ee != numErrors) {
+    e = BCExceptionChecksumException;
+    delete result;
+    return NULL;
+  }
+  return result;
+}
+CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(
+    CBC_PDF417ECModulusPoly* errorEvaluator,
+    CBC_PDF417ECModulusPoly* errorLocator,
+    CFX_Int32Array& errorLocations,
+    int32_t& e) {
+  int32_t errorLocatorDegree = errorLocator->getDegree();
+  CFX_Int32Array formalDerivativeCoefficients;
+  formalDerivativeCoefficients.SetSize(errorLocatorDegree);
+  for (int32_t l = 1; l <= errorLocatorDegree; l++) {
+    formalDerivativeCoefficients[errorLocatorDegree - l] =
+        m_field->multiply(l, errorLocator->getCoefficient(l));
+  }
+  CBC_PDF417ECModulusPoly formalDerivative(m_field,
+                                           formalDerivativeCoefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t s = errorLocations.GetSize();
+  CFX_Int32Array* result = new CFX_Int32Array;
+  result->SetSize(s);
+  for (int32_t i = 0; i < s; i++) {
+    int32_t xiInverse = m_field->inverse(errorLocations[i], e);
+    if (e != BCExceptionNO) {
+      delete result;
+      return NULL;
+    }
+    int32_t numerator =
+        m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse));
+    int32_t denominator =
+        m_field->inverse(formalDerivative.evaluateAt(xiInverse), e);
+    if (e != BCExceptionNO) {
+      delete result;
+      return NULL;
+    }
+    result->SetAt(i, m_field->multiply(numerator, denominator));
+  }
+  return result;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
new file mode 100644
index 0000000..d7b56de
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
+
+class CBC_PDF417ECModulusGF;
+class CBC_PDF417ECModulusPoly;
+class CBC_PDF417ECErrorCorrection {
+ public:
+  CBC_PDF417ECErrorCorrection();
+  virtual ~CBC_PDF417ECErrorCorrection();
+  static void Initialize(int32_t& e);
+  static void Finalize();
+  static int32_t decode(CFX_Int32Array& received,
+                        int32_t numECCodewords,
+                        CFX_Int32Array& erasures,
+                        int32_t& e);
+
+ private:
+  static CBC_PDF417ECModulusGF* m_field;
+  static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a,
+                                             CBC_PDF417ECModulusPoly* b,
+                                             int32_t R,
+                                             int32_t& e);
+  static CFX_Int32Array* findErrorLocations(
+      CBC_PDF417ECModulusPoly* errorLocator,
+      int32_t& e);
+  static CFX_Int32Array* findErrorMagnitudes(
+      CBC_PDF417ECModulusPoly* errorEvaluator,
+      CBC_PDF417ECModulusPoly* errorLocator,
+      CFX_Int32Array& errorLocations,
+      int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp
new file mode 100644
index 0000000..4779d80
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp
@@ -0,0 +1,120 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL;
+void CBC_PDF417ECModulusGF::Initialize(int32_t& e) {
+  PDF417_GF =
+      new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
+}
+void CBC_PDF417ECModulusGF::Finalize() {
+  delete PDF417_GF;
+}
+CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(int32_t modulus,
+                                             int32_t generator,
+                                             int32_t& e) {
+  m_modulus = modulus;
+  m_expTable.SetSize(modulus);
+  m_logTable.SetSize(modulus);
+  int32_t x = 1;
+  for (int32_t i = 0; i < modulus; i++) {
+    m_expTable[i] = x;
+    x = (x * generator) % modulus;
+  }
+  for (int32_t j = 0; j < modulus - 1; j++) {
+    m_logTable[m_expTable[j]] = j;
+  }
+  CFX_Int32Array zero;
+  zero.Add(0);
+  m_zero = new CBC_PDF417ECModulusPoly(this, zero, e);
+  CFX_Int32Array one;
+  one.Add(1);
+  m_one = new CBC_PDF417ECModulusPoly(this, one, e);
+}
+CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() {
+  delete m_zero;
+  delete m_one;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() {
+  return m_zero;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() {
+  return m_one;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(
+    int32_t degree,
+    int32_t coefficient,
+    int32_t& e) {
+  if (degree < 0) {
+    e = BCExceptionIllegalArgument;
+    return NULL;
+  }
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (coefficient == 0) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(m_zero->getField(),
+                                              m_zero->getCoefficients(), e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  CFX_Int32Array coefficients;
+  coefficients.SetSize(degree + 1);
+  coefficients[0] = coefficient;
+  modulusPoly = new CBC_PDF417ECModulusPoly(this, coefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+int32_t CBC_PDF417ECModulusGF::add(int32_t a, int32_t b) {
+  return (a + b) % m_modulus;
+}
+int32_t CBC_PDF417ECModulusGF::subtract(int32_t a, int32_t b) {
+  return (m_modulus + a - b) % m_modulus;
+}
+int32_t CBC_PDF417ECModulusGF::exp(int32_t a) {
+  return m_expTable[a];
+}
+int32_t CBC_PDF417ECModulusGF::log(int32_t a, int32_t& e) {
+  if (a == 0) {
+    e = BCExceptionIllegalArgument;
+    return -1;
+  }
+  return m_logTable[a];
+}
+int32_t CBC_PDF417ECModulusGF::inverse(int32_t a, int32_t& e) {
+  if (a == 0) {
+    e = BCExceptionIllegalArgument;
+    return -1;
+  }
+  return m_expTable[m_modulus - m_logTable[a] - 1];
+}
+int32_t CBC_PDF417ECModulusGF::multiply(int32_t a, int32_t b) {
+  if (a == 0 || b == 0) {
+    return 0;
+  }
+  return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)];
+}
+int32_t CBC_PDF417ECModulusGF::getSize() {
+  return m_modulus;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h
new file mode 100644
index 0000000..094e001
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
+
+class CBC_PDF417ECModulusPoly;
+class CBC_PDF417ECModulusGF {
+ public:
+  CBC_PDF417ECModulusGF(int32_t modulus, int32_t generator, int32_t& e);
+  virtual ~CBC_PDF417ECModulusGF();
+  static void Initialize(int32_t& e);
+  static void Finalize();
+  CBC_PDF417ECModulusPoly* getZero();
+  CBC_PDF417ECModulusPoly* getOne();
+  CBC_PDF417ECModulusPoly* buildMonomial(int32_t degree,
+                                         int32_t coefficient,
+                                         int32_t& e);
+  int32_t add(int32_t a, int32_t b);
+  int32_t subtract(int32_t a, int32_t b);
+  int32_t exp(int32_t a);
+  int32_t log(int32_t a, int32_t& e);
+  int32_t inverse(int32_t a, int32_t& e);
+  int32_t multiply(int32_t a, int32_t b);
+  int32_t getSize();
+  static CBC_PDF417ECModulusGF* PDF417_GF;
+
+ private:
+  CFX_Int32Array m_expTable;
+  CFX_Int32Array m_logTable;
+  CBC_PDF417ECModulusPoly* m_zero;
+  CBC_PDF417ECModulusPoly* m_one;
+  int32_t m_modulus;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp
new file mode 100644
index 0000000..d0bbe5a
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp
@@ -0,0 +1,332 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_PDF417ECModulusPoly::CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field,
+                                                 CFX_Int32Array& coefficients,
+                                                 int32_t& e) {
+  if (coefficients.GetSize() == 0) {
+    e = BCExceptionIllegalArgument;
+  }
+  m_field = field;
+  int32_t coefficientsLength = coefficients.GetSize();
+  if (coefficientsLength > 1 && coefficients[0] == 0) {
+    int32_t firstNonZero = 1;
+    while (firstNonZero < coefficientsLength &&
+           coefficients[firstNonZero] == 0) {
+      firstNonZero++;
+    }
+    if (firstNonZero == coefficientsLength) {
+      m_coefficients = field->getZero()->m_coefficients;
+    } else {
+      m_coefficients.SetSize(coefficientsLength - firstNonZero);
+      int32_t l = 0;
+      for (int32_t i = firstNonZero;
+           i < firstNonZero + m_coefficients.GetSize(); i++) {
+        m_coefficients.SetAt(l, coefficients.GetAt(i));
+        l++;
+      }
+    }
+  } else {
+    m_coefficients.Copy(coefficients);
+  }
+}
+CBC_PDF417ECModulusPoly::~CBC_PDF417ECModulusPoly() {}
+CFX_Int32Array& CBC_PDF417ECModulusPoly::getCoefficients() {
+  return m_coefficients;
+}
+CBC_PDF417ECModulusGF* CBC_PDF417ECModulusPoly::getField() {
+  return m_field;
+}
+int32_t CBC_PDF417ECModulusPoly::getDegree() {
+  return m_coefficients.GetSize() - 1;
+}
+FX_BOOL CBC_PDF417ECModulusPoly::isZero() {
+  return m_coefficients[0] == 0;
+}
+int32_t CBC_PDF417ECModulusPoly::getCoefficient(int32_t degree) {
+  return m_coefficients[m_coefficients.GetSize() - 1 - degree];
+}
+int32_t CBC_PDF417ECModulusPoly::evaluateAt(int32_t a) {
+  if (a == 0) {
+    return getCoefficient(0);
+  }
+  int32_t size = m_coefficients.GetSize();
+  if (a == 1) {
+    int32_t result = 0;
+    for (int32_t l = 0; l < m_coefficients.GetSize(); l++) {
+      int32_t coefficient = m_coefficients.GetAt(l);
+      result = m_field->add(result, coefficient);
+    }
+    return result;
+  }
+  int32_t result = m_coefficients[0];
+  for (int32_t i = 1; i < size; i++) {
+    result = m_field->add(m_field->multiply(a, result), m_coefficients[i]);
+  }
+  return result;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::add(
+    CBC_PDF417ECModulusPoly* other,
+    int32_t& e) {
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (isZero()) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(other->getField(),
+                                              other->getCoefficients(), e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  if (other->isZero()) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  CFX_Int32Array smallerCoefficients;
+  smallerCoefficients.Copy(m_coefficients);
+  CFX_Int32Array largerCoefficients;
+  largerCoefficients.Copy(other->m_coefficients);
+  if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) {
+    CFX_Int32Array temp;
+    temp.Copy(smallerCoefficients);
+    smallerCoefficients.Copy(largerCoefficients);
+    largerCoefficients.Copy(temp);
+  }
+  CFX_Int32Array sumDiff;
+  sumDiff.SetSize(largerCoefficients.GetSize());
+  int32_t lengthDiff =
+      largerCoefficients.GetSize() - smallerCoefficients.GetSize();
+  for (int32_t l = 0; l < lengthDiff; l++) {
+    sumDiff.SetAt(l, largerCoefficients.GetAt(l));
+  }
+  for (int32_t i = lengthDiff; i < largerCoefficients.GetSize(); i++) {
+    sumDiff[i] = m_field->add(smallerCoefficients[i - lengthDiff],
+                              largerCoefficients[i]);
+  }
+  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, sumDiff, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::subtract(
+    CBC_PDF417ECModulusPoly* other,
+    int32_t& e) {
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (other->isZero()) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  CBC_PDF417ECModulusPoly* poly = other->negative(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  modulusPoly = add(poly, e);
+  delete poly;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(
+    CBC_PDF417ECModulusPoly* other,
+    int32_t& e) {
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (isZero() || other->isZero()) {
+    modulusPoly =
+        new CBC_PDF417ECModulusPoly(m_field->getZero()->getField(),
+                                    m_field->getZero()->getCoefficients(), e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  CFX_Int32Array aCoefficients;
+  aCoefficients.Copy(m_coefficients);
+  int32_t aLength = aCoefficients.GetSize();
+  CFX_Int32Array bCoefficients;
+  bCoefficients.Copy(other->m_coefficients);
+  int32_t bLength = bCoefficients.GetSize();
+  CFX_Int32Array product;
+  product.SetSize(aLength + bLength - 1);
+  for (int32_t i = 0; i < aLength; i++) {
+    int32_t aCoeff = aCoefficients[i];
+    for (int32_t j = 0; j < bLength; j++) {
+      product[i + j] = m_field->add(
+          product[i + j], m_field->multiply(aCoeff, bCoefficients[j]));
+    }
+  }
+  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::negative(int32_t& e) {
+  int32_t size = m_coefficients.GetSize();
+  CFX_Int32Array negativeCoefficients;
+  negativeCoefficients.SetSize(size);
+  for (int32_t i = 0; i < size; i++) {
+    negativeCoefficients[i] = m_field->subtract(0, m_coefficients[i]);
+  }
+  CBC_PDF417ECModulusPoly* modulusPoly =
+      new CBC_PDF417ECModulusPoly(m_field, negativeCoefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(int32_t scalar,
+                                                           int32_t& e) {
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (scalar == 0) {
+    modulusPoly =
+        new CBC_PDF417ECModulusPoly(m_field->getZero()->getField(),
+                                    m_field->getZero()->getCoefficients(), e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  if (scalar == 1) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  int32_t size = m_coefficients.GetSize();
+  CFX_Int32Array product;
+  product.SetSize(size);
+  for (int32_t i = 0; i < size; i++) {
+    product[i] = m_field->multiply(m_coefficients[i], scalar);
+  }
+  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiplyByMonomial(
+    int32_t degree,
+    int32_t coefficient,
+    int32_t& e) {
+  if (degree < 0) {
+    e = BCExceptionIllegalArgument;
+    return NULL;
+  }
+  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
+  if (coefficient == 0) {
+    modulusPoly = new CBC_PDF417ECModulusPoly(
+        m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return modulusPoly;
+  }
+  int32_t size = m_coefficients.GetSize();
+  CFX_Int32Array product;
+  product.SetSize(size + degree);
+  for (int32_t i = 0; i < size; i++) {
+    product[i] = m_field->multiply(m_coefficients[i], coefficient);
+  }
+  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return modulusPoly;
+}
+CFX_PtrArray* CBC_PDF417ECModulusPoly::divide(CBC_PDF417ECModulusPoly* other,
+                                              int32_t& e) {
+  if (other->isZero()) {
+    e = BCExceptionDivideByZero;
+    return NULL;
+  }
+  CBC_PDF417ECModulusPoly* quotient = new CBC_PDF417ECModulusPoly(
+      m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_PDF417ECModulusPoly* remainder =
+      new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
+  if (e != BCExceptionNO) {
+    delete quotient;
+    return NULL;
+  }
+  int32_t denominatorLeadingTerm = other->getCoefficient(other->getDegree());
+  int32_t inverseDenominatorLeadingTerm =
+      m_field->inverse(denominatorLeadingTerm, e);
+  if (e != BCExceptionNO) {
+    delete quotient;
+    delete remainder;
+    return NULL;
+  }
+  while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) {
+    int32_t degreeDifference = remainder->getDegree() - other->getDegree();
+    int32_t scale =
+        m_field->multiply(remainder->getCoefficient(remainder->getDegree()),
+                          inverseDenominatorLeadingTerm);
+    CBC_PDF417ECModulusPoly* term =
+        other->multiplyByMonomial(degreeDifference, scale, e);
+    if (e != BCExceptionNO) {
+      delete quotient;
+      delete remainder;
+      return NULL;
+    }
+    CBC_PDF417ECModulusPoly* iterationQuotient =
+        m_field->buildMonomial(degreeDifference, scale, e);
+    if (e != BCExceptionNO) {
+      delete quotient;
+      delete remainder;
+      delete term;
+      return NULL;
+    }
+    CBC_PDF417ECModulusPoly* temp = quotient;
+    quotient = temp->add(iterationQuotient, e);
+    delete iterationQuotient;
+    delete temp;
+    if (e != BCExceptionNO) {
+      delete remainder;
+      return NULL;
+    }
+    temp = remainder;
+    remainder = temp->subtract(term, e);
+    delete term;
+    delete temp;
+    if (e != BCExceptionNO) {
+      delete quotient;
+      return NULL;
+    }
+  }
+  CFX_PtrArray* modulusPoly = new CFX_PtrArray;
+  modulusPoly->Add(quotient);
+  modulusPoly->Add(remainder);
+  return modulusPoly;
+}
+CFX_ByteString CBC_PDF417ECModulusPoly::toString() {
+  CFX_ByteString result;
+  for (int32_t degree = getDegree(); degree >= 0; degree--) {
+    int32_t coefficient = getCoefficient(degree);
+    if (coefficient != 0) {
+      if (coefficient < 0) {
+        result += " - ";
+        coefficient = -coefficient;
+      } else {
+        if (result.GetLength() > 0) {
+          result += " + ";
+        }
+      }
+      if (degree == 0 || coefficient != 1) {
+        result += coefficient;
+      }
+      if (degree != 0) {
+        if (degree == 1) {
+          result += 'x';
+        } else {
+          result += "x^";
+          result += degree;
+        }
+      }
+    }
+  }
+  return result;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h
new file mode 100644
index 0000000..2eff3ef
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
+
+class CBC_PDF417ECModulusGF;
+class CBC_PDF417ECModulusPoly {
+ public:
+  CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field,
+                          CFX_Int32Array& coefficients,
+                          int32_t& e);
+  virtual ~CBC_PDF417ECModulusPoly();
+  CFX_Int32Array& getCoefficients();
+  CBC_PDF417ECModulusGF* getField();
+  int32_t getDegree();
+  FX_BOOL isZero();
+  int32_t getCoefficient(int32_t degree);
+  int32_t evaluateAt(int32_t a);
+  CBC_PDF417ECModulusPoly* add(CBC_PDF417ECModulusPoly* other, int32_t& e);
+  CBC_PDF417ECModulusPoly* subtract(CBC_PDF417ECModulusPoly* other, int32_t& e);
+  CBC_PDF417ECModulusPoly* multiply(CBC_PDF417ECModulusPoly* other, int32_t& e);
+  CBC_PDF417ECModulusPoly* negative(int32_t& e);
+  CBC_PDF417ECModulusPoly* multiply(int32_t scalar, int32_t& e);
+  CBC_PDF417ECModulusPoly* multiplyByMonomial(int32_t degree,
+                                              int32_t coefficient,
+                                              int32_t& e);
+  CFX_PtrArray* divide(CBC_PDF417ECModulusPoly* other, int32_t& e);
+  CFX_ByteString toString();
+
+ private:
+  CBC_PDF417ECModulusGF* m_field;
+  CFX_Int32Array m_coefficients;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
new file mode 100644
index 0000000..0d4f2ff
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
@@ -0,0 +1,165 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
+#include "xfa/fxbarcode/utils.h"
+
+int32_t CBC_PDF417ErrorCorrection::EC_COEFFICIENTS[][2500] = {
+    {27, 917},
+    {522, 568, 723, 809},
+    {237, 308, 436, 284, 646, 653, 428, 379},
+    {274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176,
+     65},
+    {361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193,
+     517, 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330,
+     63, 410},
+    {539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381,
+     612, 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762,
+     283, 184, 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651,
+     201, 488, 502, 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843,
+     623, 264, 543},
+    {521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749,
+     415, 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908,
+     490, 704, 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686,
+     606, 860, 569, 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379,
+     712, 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507,
+     48, 228, 821, 808, 898, 784, 663, 627, 378, 382, 262, 380, 602, 754, 336,
+     89, 614, 87, 432, 670, 616, 157, 374, 242, 726, 600, 269, 375, 898, 845,
+     454, 354, 130, 814, 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517,
+     834, 315, 550, 86, 801, 4, 108, 539},
+    {524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138,
+     720, 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280,
+     828, 757, 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801,
+     700, 799, 137, 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257,
+     284, 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684,
+     461, 334, 376, 849, 521, 307, 291, 803, 712, 19, 358, 399, 908, 103, 511,
+     51, 8, 517, 225, 289, 470, 637, 731, 66, 255, 917, 269, 463, 830, 730, 433,
+     848, 585, 136, 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, 580,
+     355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, 71, 263, 318, 374,
+     601, 192, 605, 142, 673, 687, 234, 722, 384, 177, 752, 607, 640, 455, 193,
+     689, 707, 805, 641, 48, 60, 732, 621, 895, 544, 261, 852, 655, 309, 697,
+     755, 756, 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, 144,
+     500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, 914, 342, 126, 32, 681,
+     331, 792, 620, 60, 609, 441, 180, 791, 893, 754, 605, 383, 228, 749, 760,
+     213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20,
+     167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, 251, 688, 95,
+     497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10},
+    {352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350,
+     492, 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193,
+     352, 781, 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640,
+     268, 794, 534, 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37,
+     858, 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761,
+     107, 784, 860, 658, 741, 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20,
+     297, 451, 593, 913, 142, 808, 684, 287, 536, 561, 76, 653, 899, 729, 567,
+     744, 390, 513, 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384,
+     168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, 237, 151, 429,
+     531, 207, 676, 710, 89, 168, 304, 402, 40, 708, 575, 162, 864, 229, 65,
+     861, 841, 512, 164, 477, 221, 92, 358, 785, 288, 357, 850, 836, 827, 736,
+     707, 94, 8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, 361,
+     578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, 45, 902, 452, 167,
+     342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, 37, 124, 298, 332,
+     552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, 283, 711, 472,
+     420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, 383,
+     721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729, 624,
+     59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
+     677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35,
+     777, 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247,
+     184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519,
+     644, 905, 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513,
+     56, 252, 341, 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310,
+     756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590,
+     731, 425, 216, 548, 249, 321, 881, 699, 535, 673, 782, 210, 815, 905, 303,
+     843, 922, 281, 73, 469, 791, 660, 162, 498, 308, 155, 422, 907, 817, 187,
+     62, 16, 425, 535, 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667,
+     751, 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, 5, 39, 923,
+     311, 424, 242, 749, 321, 54, 669, 316, 342, 299, 534, 105, 667, 488, 640,
+     672, 576, 540, 316, 486, 721, 610, 46, 656, 447, 171, 616, 464, 190, 531,
+     297, 321, 762, 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596,
+     284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, 164, 332, 899,
+     165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, 63, 310, 863,
+     251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263}};
+
+CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() {}
+CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() {}
+int32_t CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
+    int32_t errorCorrectionLevel,
+    int32_t& e) {
+  if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {
+    e = BCExceptionErrorCorrectionLevelMustBeBetween0And8;
+    return -1;
+  }
+  return 1 << (errorCorrectionLevel + 1);
+}
+int32_t CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(
+    int32_t n,
+    int32_t& e) {
+  if (n <= 0) {
+    e = BCExceptionIllegalArgumentnMustBeAbove0;
+    return -1;
+  }
+  if (n <= 40) {
+    return 2;
+  }
+  if (n <= 160) {
+    return 3;
+  }
+  if (n <= 320) {
+    return 4;
+  }
+  if (n <= 863) {
+    return 5;
+  }
+  e = BCExceptionNoRecommendationPossible;
+  return -1;
+}
+CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(
+    CFX_WideString dataCodewords,
+    int32_t errorCorrectionLevel,
+    int32_t& e) {
+  int32_t k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' ');
+  FX_WCHAR* ech = FX_Alloc(FX_WCHAR, k);
+  FXSYS_memset(ech, 0, k * sizeof(FX_WCHAR));
+  int32_t sld = dataCodewords.GetLength();
+  for (int32_t i = 0; i < sld; i++) {
+    int32_t t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929;
+    int32_t t2;
+    int32_t t3;
+    for (int32_t j = k - 1; j >= 1; j--) {
+      t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929;
+      t3 = 929 - t2;
+      ech[j] = (FX_WCHAR)((ech[j - 1] + t3) % 929);
+    }
+    t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929;
+    t3 = 929 - t2;
+    ech[0] = (FX_WCHAR)(t3 % 929);
+  }
+  CFX_WideString sb;
+  for (int32_t j = k - 1; j >= 0; j--) {
+    if (ech[j] != 0) {
+      ech[j] = (FX_WCHAR)(929 - ech[j]);
+    }
+    sb += (FX_WCHAR)ech[j];
+  }
+  FX_Free(ech);
+  return sb;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h b/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
new file mode 100644
index 0000000..9a2a0c6
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
+
+#include <stdint.h>
+
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_PDF417ErrorCorrection {
+ public:
+  CBC_PDF417ErrorCorrection();
+  virtual ~CBC_PDF417ErrorCorrection();
+  static int32_t getErrorCorrectionCodewordCount(int32_t errorCorrectionLevel,
+                                                 int32_t& e);
+  static int32_t getRecommendedMinimumErrorCorrectionLevel(int32_t n,
+                                                           int32_t& e);
+  static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords,
+                                                int32_t errorCorrectionLevel,
+                                                int32_t& e);
+
+ private:
+  static int32_t EC_COEFFICIENTS[][2500];
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
new file mode 100644
index 0000000..27c6651
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
@@ -0,0 +1,427 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
+
+#include "third_party/bigint/BigIntegerLibrary.hh"
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+#include "xfa/fxbarcode/utils.h"
+
+#define SUBMODE_ALPHA 0
+#define SUBMODE_LOWER 1
+#define SUBMODE_MIXED 2
+
+int32_t CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0;
+int32_t CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1;
+int32_t CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2;
+int32_t CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3;
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900;
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901;
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902;
+int32_t CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913;
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924;
+uint8_t CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = {
+    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58,
+    35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0,  32, 0, 0,  0};
+uint8_t CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = {
+    59, 60, 62, 64, 91, 92, 93,  95, 96, 126, 33, 13,  9,   44, 58,
+    10, 45, 46, 36, 47, 34, 124, 42, 40, 41,  63, 123, 125, 39, 0};
+int32_t CBC_PDF417HighLevelEncoder::MIXED[128] = {0};
+int32_t CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0};
+
+void CBC_PDF417HighLevelEncoder::Initialize() {
+  Inverse();
+}
+void CBC_PDF417HighLevelEncoder::Finalize() {}
+CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel(
+    CFX_WideString wideMsg,
+    Compaction compaction,
+    int32_t& e) {
+  CFX_ByteString bytes;
+  CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes);
+  CFX_WideString msg;
+  int32_t len = bytes.GetLength();
+  for (int32_t i = 0; i < len; i++) {
+    FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff);
+    if (ch == '?' && bytes.GetAt(i) != '?') {
+      e = BCExceptionCharactersOutsideISO88591Encoding;
+      return (FX_WCHAR*)"";
+    }
+    msg += ch;
+  }
+  CFX_ByteArray byteArr;
+  for (int32_t k = 0; k < bytes.GetLength(); k++) {
+    byteArr.Add(bytes.GetAt(k));
+  }
+  CFX_WideString sb;
+  len = msg.GetLength();
+  int32_t p = 0;
+  int32_t textSubMode = SUBMODE_ALPHA;
+  if (compaction == TEXT) {
+    encodeText(msg, p, len, sb, textSubMode);
+  } else if (compaction == BYTES) {
+    encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb);
+  } else if (compaction == NUMERIC) {
+    sb += (FX_WCHAR)LATCH_TO_NUMERIC;
+    encodeNumeric(msg, p, len, sb);
+  } else {
+    int32_t encodingMode = LATCH_TO_TEXT;
+    while (p < len) {
+      int32_t n = determineConsecutiveDigitCount(msg, p);
+      if (n >= 13) {
+        sb += (FX_WCHAR)LATCH_TO_NUMERIC;
+        encodingMode = NUMERIC_COMPACTION;
+        textSubMode = SUBMODE_ALPHA;
+        encodeNumeric(msg, p, n, sb);
+        p += n;
+      } else {
+        int32_t t = determineConsecutiveTextCount(msg, p);
+        if (t >= 5 || n == len) {
+          if (encodingMode != TEXT_COMPACTION) {
+            sb += (FX_WCHAR)LATCH_TO_TEXT;
+            encodingMode = TEXT_COMPACTION;
+            textSubMode = SUBMODE_ALPHA;
+          }
+          textSubMode = encodeText(msg, p, t, sb, textSubMode);
+          p += t;
+        } else {
+          int32_t b = determineConsecutiveBinaryCount(msg, &byteArr, p, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' ');
+          if (b == 0) {
+            b = 1;
+          }
+          if (b == 1 && encodingMode == TEXT_COMPACTION) {
+            encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb);
+          } else {
+            encodeBinary(&byteArr, p, b, encodingMode, sb);
+            encodingMode = BYTE_COMPACTION;
+            textSubMode = SUBMODE_ALPHA;
+          }
+          p += b;
+        }
+      }
+    }
+  }
+  return sb;
+}
+
+void CBC_PDF417HighLevelEncoder::Inverse() {
+  for (size_t l = 0; l < FX_ArraySize(MIXED); ++l)
+    MIXED[l] = -1;
+
+  for (uint8_t i = 0; i < FX_ArraySize(TEXT_MIXED_RAW); ++i) {
+    uint8_t b = TEXT_MIXED_RAW[i];
+    if (b != 0)
+      MIXED[b] = i;
+  }
+
+  for (size_t l = 0; l < FX_ArraySize(PUNCTUATION); ++l)
+    PUNCTUATION[l] = -1;
+
+  for (uint8_t i = 0; i < FX_ArraySize(TEXT_PUNCTUATION_RAW); ++i) {
+    uint8_t b = TEXT_PUNCTUATION_RAW[i];
+    if (b != 0)
+      PUNCTUATION[b] = i;
+  }
+}
+
+int32_t CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg,
+                                               int32_t startpos,
+                                               int32_t count,
+                                               CFX_WideString& sb,
+                                               int32_t initialSubmode) {
+  CFX_WideString tmp;
+  int32_t submode = initialSubmode;
+  int32_t idx = 0;
+  while (TRUE) {
+    FX_WCHAR ch = msg.GetAt(startpos + idx);
+    switch (submode) {
+      case SUBMODE_ALPHA:
+        if (isAlphaUpper(ch)) {
+          if (ch == ' ') {
+            tmp += (FX_WCHAR)26;
+          } else {
+            tmp += (FX_WCHAR)(ch - 65);
+          }
+        } else {
+          if (isAlphaLower(ch)) {
+            submode = SUBMODE_LOWER;
+            tmp += (FX_WCHAR)27;
+            continue;
+          } else if (isMixed(ch)) {
+            submode = SUBMODE_MIXED;
+            tmp += (FX_WCHAR)28;
+            continue;
+          } else {
+            tmp += (FX_WCHAR)29;
+            tmp += PUNCTUATION[ch];
+            break;
+          }
+        }
+        break;
+      case SUBMODE_LOWER:
+        if (isAlphaLower(ch)) {
+          if (ch == ' ') {
+            tmp += (FX_WCHAR)26;
+          } else {
+            tmp += (FX_WCHAR)(ch - 97);
+          }
+        } else {
+          if (isAlphaUpper(ch)) {
+            tmp += (FX_WCHAR)27;
+            tmp += (FX_WCHAR)(ch - 65);
+            break;
+          } else if (isMixed(ch)) {
+            submode = SUBMODE_MIXED;
+            tmp += (FX_WCHAR)28;
+            continue;
+          } else {
+            tmp += (FX_WCHAR)29;
+            tmp += PUNCTUATION[ch];
+            break;
+          }
+        }
+        break;
+      case SUBMODE_MIXED:
+        if (isMixed(ch)) {
+          tmp += MIXED[ch];
+        } else {
+          if (isAlphaUpper(ch)) {
+            submode = SUBMODE_ALPHA;
+            tmp += (FX_WCHAR)28;
+            continue;
+          } else if (isAlphaLower(ch)) {
+            submode = SUBMODE_LOWER;
+            tmp += (FX_WCHAR)27;
+            continue;
+          } else {
+            if (startpos + idx + 1 < count) {
+              FX_WCHAR next = msg.GetAt(startpos + idx + 1);
+              if (isPunctuation(next)) {
+                submode = SUBMODE_PUNCTUATION;
+                tmp += (FX_WCHAR)25;
+                continue;
+              }
+            }
+            tmp += (FX_WCHAR)29;
+            tmp += PUNCTUATION[ch];
+          }
+        }
+        break;
+      default:
+        if (isPunctuation(ch)) {
+          tmp += PUNCTUATION[ch];
+        } else {
+          submode = SUBMODE_ALPHA;
+          tmp += (FX_WCHAR)29;
+          continue;
+        }
+    }
+    idx++;
+    if (idx >= count) {
+      break;
+    }
+  }
+  FX_WCHAR h = 0;
+  int32_t len = tmp.GetLength();
+  for (int32_t i = 0; i < len; i++) {
+    FX_BOOL odd = (i % 2) != 0;
+    if (odd) {
+      h = (FX_WCHAR)((h * 30) + tmp.GetAt(i));
+      sb += h;
+    } else {
+      h = tmp.GetAt(i);
+    }
+  }
+  if ((len % 2) != 0) {
+    sb += (FX_WCHAR)((h * 30) + 29);
+  }
+  return submode;
+}
+void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes,
+                                              int32_t startpos,
+                                              int32_t count,
+                                              int32_t startmode,
+                                              CFX_WideString& sb) {
+  if (count == 1 && startmode == TEXT_COMPACTION) {
+    sb += (FX_WCHAR)SHIFT_TO_BYTE;
+  }
+  int32_t idx = startpos;
+  int32_t i = 0;
+  if (count >= 6) {
+    sb += (FX_WCHAR)LATCH_TO_BYTE;
+    FX_WCHAR chars[5];
+    while ((startpos + count - idx) >= 6) {
+      int64_t t = 0;
+      for (i = 0; i < 6; i++) {
+        t <<= 8;
+        t += bytes->GetAt(idx + i) & 0xff;
+      }
+      for (i = 0; i < 5; i++) {
+        chars[i] = (FX_WCHAR)(t % 900);
+        t /= 900;
+      }
+      for (i = 4; i >= 0; i--) {
+        sb += (chars[i]);
+      }
+      idx += 6;
+    }
+  }
+  if (idx < startpos + count) {
+    sb += (FX_WCHAR)LATCH_TO_BYTE_PADDED;
+  }
+  for (i = idx; i < startpos + count; i++) {
+    int32_t ch = bytes->GetAt(i) & 0xff;
+    sb += (FX_WCHAR)ch;
+  }
+}
+void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg,
+                                               int32_t startpos,
+                                               int32_t count,
+                                               CFX_WideString& sb) {
+  int32_t idx = 0;
+  BigInteger num900 = 900;
+  while (idx < count) {
+    CFX_WideString tmp;
+    int32_t len = 44 < count - idx ? 44 : count - idx;
+    CFX_ByteString part =
+        ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode();
+    BigInteger bigint = stringToBigInteger(part.c_str());
+    do {
+      int32_t c = (bigint % num900).toInt();
+      tmp += (FX_WCHAR)(c);
+      bigint = bigint / num900;
+    } while (!bigint.isZero());
+    for (int32_t i = tmp.GetLength() - 1; i >= 0; i--) {
+      sb += tmp.GetAt(i);
+    }
+    idx += len;
+  }
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) {
+  return ch >= '0' && ch <= '9';
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) {
+  return ch == ' ' || (ch >= 'A' && ch <= 'Z');
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) {
+  return ch == ' ' || (ch >= 'a' && ch <= 'z');
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) {
+  return MIXED[ch] != -1;
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) {
+  return PUNCTUATION[ch] != -1;
+}
+FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) {
+  return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126);
+}
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(
+    CFX_WideString msg,
+    int32_t startpos) {
+  int32_t count = 0;
+  int32_t len = msg.GetLength();
+  int32_t idx = startpos;
+  if (idx < len) {
+    FX_WCHAR ch = msg.GetAt(idx);
+    while (isDigit(ch) && idx < len) {
+      count++;
+      idx++;
+      if (idx < len) {
+        ch = msg.GetAt(idx);
+      }
+    }
+  }
+  return count;
+}
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(
+    CFX_WideString msg,
+    int32_t startpos) {
+  int32_t len = msg.GetLength();
+  int32_t idx = startpos;
+  while (idx < len) {
+    FX_WCHAR ch = msg.GetAt(idx);
+    int32_t numericCount = 0;
+    while (numericCount < 13 && isDigit(ch) && idx < len) {
+      numericCount++;
+      idx++;
+      if (idx < len) {
+        ch = msg.GetAt(idx);
+      }
+    }
+    if (numericCount >= 13) {
+      return idx - startpos - numericCount;
+    }
+    if (numericCount > 0) {
+      continue;
+    }
+    ch = msg.GetAt(idx);
+    if (!isText(ch)) {
+      break;
+    }
+    idx++;
+  }
+  return idx - startpos;
+}
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(
+    CFX_WideString msg,
+    CFX_ByteArray* bytes,
+    int32_t startpos,
+    int32_t& e) {
+  int32_t len = msg.GetLength();
+  int32_t idx = startpos;
+  while (idx < len) {
+    FX_WCHAR ch = msg.GetAt(idx);
+    int32_t numericCount = 0;
+    while (numericCount < 13 && isDigit(ch)) {
+      numericCount++;
+      int32_t i = idx + numericCount;
+      if (i >= len) {
+        break;
+      }
+      ch = msg.GetAt(i);
+    }
+    if (numericCount >= 13) {
+      return idx - startpos;
+    }
+    int32_t textCount = 0;
+    while (textCount < 5 && isText(ch)) {
+      textCount++;
+      int32_t i = idx + textCount;
+      if (i >= len) {
+        break;
+      }
+      ch = msg.GetAt(i);
+    }
+    if (textCount >= 5) {
+      return idx - startpos;
+    }
+    ch = msg.GetAt(idx);
+    if (bytes->GetAt(idx) == 63 && ch != '?') {
+      e = BCExceptionNonEncodableCharacterDetected;
+      return -1;
+    }
+    idx++;
+  }
+  return idx - startpos;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
new file mode 100644
index 0000000..0ba0126
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
@@ -0,0 +1,74 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+
+class CBC_PDF417HighLevelEncoder {
+ public:
+  static CFX_WideString encodeHighLevel(CFX_WideString msg,
+                                        Compaction compaction,
+                                        int32_t& e);
+  static void Inverse();
+  static void Initialize();
+  static void Finalize();
+
+ private:
+  static int32_t TEXT_COMPACTION;
+  static int32_t BYTE_COMPACTION;
+  static int32_t NUMERIC_COMPACTION;
+  static int32_t SUBMODE_PUNCTUATION;
+  static int32_t LATCH_TO_TEXT;
+  static int32_t LATCH_TO_BYTE_PADDED;
+  static int32_t LATCH_TO_NUMERIC;
+  static int32_t SHIFT_TO_BYTE;
+  static int32_t LATCH_TO_BYTE;
+  static uint8_t TEXT_MIXED_RAW[];
+  static uint8_t TEXT_PUNCTUATION_RAW[];
+  static int32_t MIXED[128];
+  static int32_t PUNCTUATION[128];
+  static int32_t encodeText(CFX_WideString msg,
+                            int32_t startpos,
+                            int32_t count,
+                            CFX_WideString& sb,
+                            int32_t initialSubmode);
+  static void encodeBinary(CFX_ByteArray* bytes,
+                           int32_t startpos,
+                           int32_t count,
+                           int32_t startmode,
+                           CFX_WideString& sb);
+  static void encodeNumeric(CFX_WideString msg,
+                            int32_t startpos,
+                            int32_t count,
+                            CFX_WideString& sb);
+  static FX_BOOL isDigit(FX_WCHAR ch);
+  static FX_BOOL isAlphaUpper(FX_WCHAR ch);
+  static FX_BOOL isAlphaLower(FX_WCHAR ch);
+  static FX_BOOL isMixed(FX_WCHAR ch);
+  static FX_BOOL isPunctuation(FX_WCHAR ch);
+  static FX_BOOL isText(FX_WCHAR ch);
+  static int32_t determineConsecutiveDigitCount(CFX_WideString msg,
+                                                int32_t startpos);
+  static int32_t determineConsecutiveTextCount(CFX_WideString msg,
+                                               int32_t startpos);
+  static int32_t determineConsecutiveBinaryCount(CFX_WideString msg,
+                                                 CFX_ByteArray* bytes,
+                                                 int32_t startpos,
+                                                 int32_t& e);
+
+  friend class PDF417HighLevelEncoder_EncodeNumeric_Test;
+  friend class PDF417HighLevelEncoder_EncodeBinary_Test;
+  friend class PDF417HighLevelEncoder_EncodeText_Test;
+  friend class PDF417HighLevelEncoder_ConsecutiveDigitCount_Test;
+  friend class PDF417HighLevelEncoder_ConsecutiveTextCount_Test;
+  friend class PDF417HighLevelEncoder_ConsecutiveBinaryCount_Test;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
new file mode 100644
index 0000000..8e18370
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
@@ -0,0 +1,231 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "testing/fx_string_testhelpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
+
+TEST(PDF417HighLevelEncoder, EncodeHighLevel) {
+  // TODO(tsepez): implement test cases.
+}
+
+TEST(PDF417HighLevelEncoder, EncodeText) {
+  // TODO(tsepez): implement test cases.
+}
+
+TEST(PDF417HighLevelEncoder, EncodeBinary) {
+  struct EncodeBinaryCase {
+    const char* input;
+    int offset;
+    int count;
+    int startmode;
+    const wchar_t* expected;
+    int expected_length;
+  } encode_binary_cases[] = {
+      // Empty string encodes as empty string.
+      {"", 0, 0, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"", 0},
+
+      // Fewer than 6 characters encodes as prefix without compaction.
+      {"xxxxx", 0, 5, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION,
+       L"\x0385xxxxx", 6},
+
+      // 6 charcters triggerst text encoding compaction.
+      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION,
+       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
+
+      // Same result if initially in numeric compaction mode.
+      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION,
+       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
+  };
+
+  CBC_PDF417HighLevelEncoder::Initialize();
+  for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) {
+    EncodeBinaryCase* ptr = &encode_binary_cases[i];
+    CFX_ByteArray input_array;
+    size_t input_length = strlen(ptr->input);
+    input_array.SetSize(input_length);
+    for (size_t j = 0; j < input_length; ++j) {
+      input_array.SetAt(j, ptr->input[j]);
+    }
+    CFX_WideString expected(ptr->expected, ptr->expected_length);
+    CFX_WideString result;
+    CBC_PDF417HighLevelEncoder::encodeBinary(
+        &input_array, ptr->offset, ptr->count, ptr->startmode, result);
+    EXPECT_EQ(expected, result) << " for case number " << i;
+  }
+  CBC_PDF417HighLevelEncoder::Finalize();
+}
+
+TEST(PDF417HighLevelEncoder, EncodeNumeric) {
+  struct EncodeNumericCase {
+    const wchar_t* input;
+    int offset;
+    int count;
+    const wchar_t* expected;
+    int expected_length;
+  } encode_numeric_cases[] = {
+      // Empty string encodes as empty string.
+      {L"", 0, 0, L"", 0},
+
+      // Single 0 should encode as 10 base-900 == a.
+      {L"0", 0, 1, L"\x000a", 1},
+
+      // 800 should encode as 1800 base-900 == 2,0.
+      {L"800", 0, 3, L"\x0002\x0000", 2},
+
+      // Test longer strings and sub-strings.
+      {L"123456", 0, 6, L"\x0001\x015c\x0100", 3},
+      {L"123456", 0, 5, L"\x007c\x02e9", 2},
+      {L"123456", 1, 5, L"\x0089\x009c", 2},
+      {L"123456", 2, 2, L"\x0086", 1},
+
+      // Up to 44 characters encodes as 15 base-900 words.
+      {L"00000000000000000000000000000000000000000000", 0, 44,
+       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
+       L"\x0090\x020b\x019b\x0064",
+       15},
+
+      // 45 characters should encode as same 15 words followed by one additional
+      // word.
+      {L"000000000000000000000000000000000000000000000", 0, 45,
+       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
+       L"\x0090\x020b\x019b\x0064\x000a",
+       16},
+
+      // 44 characters followed by 800 should encode as 15 words followed by
+      // 1800 base-900 == 2,0.
+      {L"00000000000000000000000000000000000000000000800", 0, 47,
+       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
+       L"\x0090\x020b\x019b\x0064\x0002\x0000",
+       17},
+
+      // Even longer input.
+      {L"10000000000000000000000000000000000000000000000000", 0, 50,
+       L"\x01e0\x02f0\x036d\x02ad\x029c\x01ea\x0011\x000b\x02d6\x023c\x0108"
+       L"\x02bb\x0023\x02d2\x00c8\x0001\x00d3\x0064",
+       18},
+  };
+
+  CBC_PDF417HighLevelEncoder::Initialize();
+  for (size_t i = 0; i < FX_ArraySize(encode_numeric_cases); ++i) {
+    EncodeNumericCase* ptr = &encode_numeric_cases[i];
+    CFX_WideString input(ptr->input);
+    CFX_WideString expected(ptr->expected, ptr->expected_length);
+    CFX_WideString result;
+    CBC_PDF417HighLevelEncoder::encodeNumeric(input, ptr->offset, ptr->count,
+                                              result);
+    EXPECT_EQ(expected, result) << " for case number " << i;
+  }
+  CBC_PDF417HighLevelEncoder::Finalize();
+}
+
+TEST(PDF417HighLevelEncoder, ConsecutiveDigitCount) {
+  struct ConsecutiveDigitCase {
+    const wchar_t* input;
+    int offset;
+    int expected_count;
+  } consecutive_digit_cases[] = {
+      // Empty string contains 0 consecuitve digits.
+      {L"", 0, 0},
+
+      // Single non-digit character contains 0 consecutive digits.
+      {L"X", 0, 0},
+
+      // Leading non-digit followed by digits contains 0 consecutive.
+      {L"X123", 0, 0},
+
+      // Single digit contains 1 consecutive digit.
+      {L"1", 0, 1},
+
+      // Single digit followe by non-digit contains 1 consecutive digit.
+      {L"1Z", 0, 1},
+
+      // Test longer strings.
+      {L"123FOO45678", 0, 3},
+
+      // Test subtring starting in digits field.
+      {L"123FOO45678", 3, 0},
+
+      // Test subtring starting in non-digits field.
+      {L"123FOO45678", 3, 0},
+
+      // Test substring starting in digits field following non-digit field.
+      {L"123FOO45678", 6, 5},
+  };
+
+  CBC_PDF417HighLevelEncoder::Initialize();
+  for (size_t i = 0; i < FX_ArraySize(consecutive_digit_cases); ++i) {
+    ConsecutiveDigitCase* ptr = &consecutive_digit_cases[i];
+    CFX_WideString input(ptr->input);
+    int actual_count =
+        CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(input,
+                                                                   ptr->offset);
+    EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
+  }
+  CBC_PDF417HighLevelEncoder::Finalize();
+}
+
+TEST(PDF417HighLevelEncoder, ConsecutiveTextCount) {
+  struct ConsecutiveTextCase {
+    const wchar_t* input;
+    int offset;
+    int expected_count;
+  } consecutive_text_cases[] = {
+      // Empty string contains 0 consecutive text characters.
+      {L"", 0, 0},
+
+      // Single text character is 1 consecutive text characters.
+      {L"X", 0, 1},
+
+      // Trailing numbers count as text characters.
+      {L"X123", 0, 4},
+
+      // Leading numbers count as text characters.
+      {L"123X", 0, 4},
+
+      // Embedded lo-value binary characters terminate text runs.
+      {L"ABC\x0001XXXX", 0, 3},
+
+      // Embedded hi-value binary characters terminate text runs.
+      {L"ABC\x0100XXXX", 0, 3},
+
+      // Text run still found after indexing past lo-value character.
+      {L"ABC\x0001XXXX", 4, 4},
+
+      // Text run still found after indexing past hi-value character.
+      {L"ABC\x0100XXXX", 4, 4},
+
+      // Leading hi-value character results in 0 consecutive characters.
+      {L"\x0100XXX", 0, 0},
+
+      // Up to 12 numbers count as text.
+      {L"123456789012", 0, 12},
+
+      // 13 or more numbers are compresssed using numeric compression, not text.
+      {L"1234567890123", 0, 0},
+
+      // Leading Text character doesn't affect the 12 character case.
+      {L"X123456789012", 0, 13},
+
+      // Leading Text character doesn't affect the 13 character case.
+      {L"X1234567890123", 0, 1},
+
+      // Jumping between numbers and letters works properly.
+      {L"XXX121XXX12345678901234", 0, 9},
+  };
+
+  CBC_PDF417HighLevelEncoder::Initialize();
+  for (size_t i = 0; i < FX_ArraySize(consecutive_text_cases); ++i) {
+    ConsecutiveTextCase* ptr = &consecutive_text_cases[i];
+    CFX_WideString input(ptr->input);
+    int actual_count =
+        CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(input,
+                                                                  ptr->offset);
+    EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
+  }
+  CBC_PDF417HighLevelEncoder::Finalize();
+}
+
+TEST(PDF417HighLevelEncoder, ConsecutiveBinaryCount) {}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp
new file mode 100644
index 0000000..4d953e0
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp
@@ -0,0 +1,149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <limits>
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_DecoderResult.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_PDF417Reader::CBC_PDF417Reader() {}
+CBC_PDF417Reader::~CBC_PDF417Reader() {}
+
+CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
+  return Decode(image, 0, e);
+}
+CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image,
+                                        FX_BOOL multiple,
+                                        int32_t hints,
+                                        int32_t& e) {
+  CFX_ByteString results;
+  CBC_PDF417DetectorResult* detectorResult =
+      CBC_Detector::detect(image, hints, multiple, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  for (int32_t i = 0; i < detectorResult->getPoints()->GetSize(); i++) {
+    CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i);
+    CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(
+        detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4),
+        (CBC_ResultPoint*)points->GetAt(5), (CBC_ResultPoint*)points->GetAt(6),
+        (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points),
+        getMaxCodewordWidth(*points), e);
+    if (ResultTemp == NULL) {
+      delete detectorResult;
+      e = BCExceptiontNotFoundInstance;
+      return "";
+    }
+    results += ResultTemp->GetText();
+    delete ResultTemp;
+  }
+  delete detectorResult;
+  return results;
+}
+CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image,
+                                        int32_t hints,
+                                        int32_t& e) {
+  CFX_ByteString bs = Decode(image, FALSE, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return bs;
+}
+int32_t CBC_PDF417Reader::getMaxWidth(CBC_ResultPoint* p1,
+                                      CBC_ResultPoint* p2) {
+  if (p1 == NULL || p2 == NULL) {
+    return 0;
+  }
+  return (int32_t)FXSYS_fabs(p1->GetX() - p2->GetX());
+}
+int32_t CBC_PDF417Reader::getMinWidth(CBC_ResultPoint* p1,
+                                      CBC_ResultPoint* p2) {
+  if (!p1 || !p2)
+    return std::numeric_limits<int32_t>::max();
+  return (int32_t)FXSYS_fabs(p1->GetX() - p2->GetX());
+}
+int32_t CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) {
+  int32_t a =
+      getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
+      CBC_PDF417Common::MODULES_IN_CODEWORD /
+      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t b =
+      getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
+      CBC_PDF417Common::MODULES_IN_CODEWORD /
+      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
+                          (CBC_ResultPoint*)p.GetAt(4)) < a
+                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
+                                (CBC_ResultPoint*)p.GetAt(4))
+                  : a;
+  int32_t d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
+                          (CBC_ResultPoint*)p.GetAt(5)) < b
+                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
+                                (CBC_ResultPoint*)p.GetAt(5))
+                  : b;
+  return c < d ? c : d;
+}
+int32_t CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) {
+  int32_t a =
+      getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
+      CBC_PDF417Common::MODULES_IN_CODEWORD /
+      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t b =
+      getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
+      CBC_PDF417Common::MODULES_IN_CODEWORD /
+      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t c = getMinWidth((CBC_ResultPoint*)p.GetAt(0),
+                          (CBC_ResultPoint*)p.GetAt(4)) < a
+                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(0),
+                                (CBC_ResultPoint*)p.GetAt(4))
+                  : a;
+  int32_t d = getMinWidth((CBC_ResultPoint*)p.GetAt(1),
+                          (CBC_ResultPoint*)p.GetAt(5)) < b
+                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(1),
+                                (CBC_ResultPoint*)p.GetAt(5))
+                  : b;
+  return c < d ? c : d;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Reader.h b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
new file mode 100644
index 0000000..2a5c39b
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
+
+class CBC_BinaryBitmap;
+class CBC_ResultPoint;
+class CBC_PDF417Reader;
+class CBC_PDF417Reader : public CBC_Reader {
+ public:
+  CBC_PDF417Reader();
+  virtual ~CBC_PDF417Reader();
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image,
+                        FX_BOOL multiple,
+                        int32_t hints,
+                        int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
+
+ private:
+  static int32_t getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
+  static int32_t getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
+  static int32_t getMaxCodewordWidth(CFX_PtrArray& p);
+  static int32_t getMinCodewordWidth(CFX_PtrArray& p);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp
new file mode 100644
index 0000000..083d63e
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
+
+CBC_PDF417ResultMetadata::CBC_PDF417ResultMetadata() {}
+CBC_PDF417ResultMetadata::~CBC_PDF417ResultMetadata() {}
+int32_t CBC_PDF417ResultMetadata::getSegmentIndex() {
+  return m_segmentIndex;
+}
+void CBC_PDF417ResultMetadata::setSegmentIndex(int32_t segmentIndex) {
+  m_segmentIndex = segmentIndex;
+}
+CFX_ByteString CBC_PDF417ResultMetadata::getFileId() {
+  return m_fileId;
+}
+void CBC_PDF417ResultMetadata::setFileId(CFX_ByteString fileId) {
+  m_fileId = fileId;
+}
+CFX_Int32Array& CBC_PDF417ResultMetadata::getOptionalData() {
+  return m_optionalData;
+}
+void CBC_PDF417ResultMetadata::setOptionalData(CFX_Int32Array& optionalData) {
+  m_optionalData.Copy(optionalData);
+}
+FX_BOOL CBC_PDF417ResultMetadata::isLastSegment() {
+  return m_lastSegment;
+}
+void CBC_PDF417ResultMetadata::setLastSegment(FX_BOOL lastSegment) {
+  m_lastSegment = lastSegment;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h b/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h
new file mode 100644
index 0000000..8e25bdb
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ResultMetadata.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_PDF417ResultMetadata {
+ public:
+  CBC_PDF417ResultMetadata();
+  virtual ~CBC_PDF417ResultMetadata();
+  int32_t getSegmentIndex();
+  void setSegmentIndex(int32_t segmentIndex);
+  CFX_ByteString getFileId();
+  void setFileId(CFX_ByteString fileId);
+  CFX_Int32Array& getOptionalData();
+  void setOptionalData(CFX_Int32Array& optionalData);
+  FX_BOOL isLastSegment();
+  void setLastSegment(FX_BOOL lastSegment);
+
+ private:
+  int32_t m_segmentIndex;
+  CFX_ByteString m_fileId;
+  CFX_Int32Array m_optionalData;
+  FX_BOOL m_lastSegment;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
new file mode 100644
index 0000000..6ae68d7
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
@@ -0,0 +1,752 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2013 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_DecoderResult.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
+#include "xfa/fxbarcode/utils.h"
+
+int32_t CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2;
+int32_t CBC_PDF417ScanningDecoder::MAX_ERRORS = 3;
+int32_t CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512;
+CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL;
+
+CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() {}
+CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() {}
+void CBC_PDF417ScanningDecoder::Initialize() {
+  errorCorrection = new CBC_PDF417ECErrorCorrection;
+}
+void CBC_PDF417ScanningDecoder::Finalize() {
+  delete errorCorrection;
+}
+CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(
+    CBC_CommonBitMatrix* image,
+    CBC_ResultPoint* imageTopLeft,
+    CBC_ResultPoint* imageBottomLeft,
+    CBC_ResultPoint* imageTopRight,
+    CBC_ResultPoint* imageBottomRight,
+    int32_t minCodewordWidth,
+    int32_t maxCodewordWidth,
+    int32_t& e) {
+  CBC_BoundingBox* boundingBox = new CBC_BoundingBox(
+      image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL;
+  CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL;
+  CBC_DetectionResult* detectionResult = NULL;
+  for (int32_t i = 0; i < 2; i++) {
+    if (imageTopLeft) {
+      leftRowIndicatorColumn =
+          getRowIndicatorColumn(image, boundingBox, *imageTopLeft, TRUE,
+                                minCodewordWidth, maxCodewordWidth);
+    }
+    if (imageTopRight) {
+      rightRowIndicatorColumn =
+          getRowIndicatorColumn(image, boundingBox, *imageTopRight, FALSE,
+                                minCodewordWidth, maxCodewordWidth);
+    }
+    detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn, e);
+    if (e != BCExceptionNO) {
+      e = BCExceptiontNotFoundInstance;
+      delete leftRowIndicatorColumn;
+      delete rightRowIndicatorColumn;
+      delete boundingBox;
+      return NULL;
+    }
+    if (i == 0 && (detectionResult->getBoundingBox()->getMinY() <
+                       boundingBox->getMinY() ||
+                   detectionResult->getBoundingBox()->getMaxY() >
+                       boundingBox->getMaxY())) {
+      delete boundingBox;
+      boundingBox = detectionResult->getBoundingBox();
+    } else {
+      detectionResult->setBoundingBox(boundingBox);
+      break;
+    }
+  }
+  int32_t maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1;
+  detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn);
+  detectionResult->setDetectionResultColumn(maxBarcodeColumn,
+                                            rightRowIndicatorColumn);
+  FX_BOOL leftToRight = leftRowIndicatorColumn != NULL;
+  for (int32_t barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn;
+       barcodeColumnCount++) {
+    int32_t barcodeColumn = leftToRight ? barcodeColumnCount
+                                        : maxBarcodeColumn - barcodeColumnCount;
+    if (detectionResult->getDetectionResultColumn(barcodeColumn)) {
+      continue;
+    }
+    CBC_DetectionResultColumn* detectionResultColumn = NULL;
+    if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) {
+      detectionResultColumn = new CBC_DetectionResultRowIndicatorColumn(
+          boundingBox, barcodeColumn == 0);
+    } else {
+      detectionResultColumn = new CBC_DetectionResultColumn(boundingBox);
+    }
+    detectionResult->setDetectionResultColumn(barcodeColumn,
+                                              detectionResultColumn);
+    int32_t startColumn = -1;
+    int32_t previousStartColumn = startColumn;
+    for (int32_t imageRow = boundingBox->getMinY();
+         imageRow <= boundingBox->getMaxY(); imageRow++) {
+      startColumn =
+          getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight);
+      if (startColumn < 0 || startColumn > boundingBox->getMaxX()) {
+        if (previousStartColumn == -1) {
+          continue;
+        }
+        startColumn = previousStartColumn;
+      }
+      CBC_Codeword* codeword = detectCodeword(
+          image, boundingBox->getMinX(), boundingBox->getMaxX(), leftToRight,
+          startColumn, imageRow, minCodewordWidth, maxCodewordWidth);
+      if (codeword) {
+        detectionResultColumn->setCodeword(imageRow, codeword);
+        previousStartColumn = startColumn;
+        minCodewordWidth = minCodewordWidth < codeword->getWidth()
+                               ? minCodewordWidth
+                               : codeword->getWidth();
+        maxCodewordWidth = maxCodewordWidth > codeword->getWidth()
+                               ? maxCodewordWidth
+                               : codeword->getWidth();
+      }
+    }
+  }
+  CBC_CommonDecoderResult* decoderresult =
+      createDecoderResult(detectionResult, e);
+  if (e != BCExceptionNO) {
+    delete detectionResult;
+    return NULL;
+  }
+  return decoderresult;
+}
+CFX_ByteString CBC_PDF417ScanningDecoder::toString(
+    CFX_PtrArray* barcodeMatrix) {
+  CFX_ByteString result;
+  for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
+    result += row;
+    int32_t l = 0;
+    for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) {
+      CBC_BarcodeValue* barcodeValue =
+          (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
+              ->GetAt(l);
+      if (barcodeValue->getValue()->GetSize() == 0) {
+        result += "";
+      } else {
+        result += barcodeValue->getValue()->GetAt(0);
+        result +=
+            barcodeValue->getConfidence(barcodeValue->getValue()->GetAt(0));
+      }
+    }
+  }
+  return result;
+}
+CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(
+    CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
+    CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
+    int32_t& e) {
+  if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) {
+    e = BCExceptionIllegalArgument;
+    return NULL;
+  }
+  CBC_BarcodeMetadata* barcodeMetadata =
+      getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn);
+  if (barcodeMetadata == NULL) {
+    e = BCExceptionCannotMetadata;
+    return NULL;
+  }
+  CBC_BoundingBox* leftboundingBox =
+      adjustBoundingBox(leftRowIndicatorColumn, e);
+  if (e != BCExceptionNO) {
+    delete barcodeMetadata;
+    return NULL;
+  }
+  CBC_BoundingBox* rightboundingBox =
+      adjustBoundingBox(rightRowIndicatorColumn, e);
+  if (e != BCExceptionNO) {
+    delete barcodeMetadata;
+    return NULL;
+  }
+  CBC_BoundingBox* boundingBox =
+      CBC_BoundingBox::merge(leftboundingBox, rightboundingBox, e);
+  if (e != BCExceptionNO) {
+    delete barcodeMetadata;
+    return NULL;
+  }
+  CBC_DetectionResult* detectionresult =
+      new CBC_DetectionResult(barcodeMetadata, boundingBox);
+  return detectionresult;
+}
+CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(
+    CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
+    int32_t& e) {
+  if (rowIndicatorColumn == NULL) {
+    return NULL;
+  }
+  CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t maxRowHeight = getMax(*rowHeights);
+  int32_t missingStartRows = 0;
+  for (int32_t i = 0; i < rowHeights->GetSize(); i++) {
+    int32_t rowHeight = rowHeights->GetAt(i);
+    missingStartRows += maxRowHeight - rowHeight;
+    if (rowHeight > 0) {
+      break;
+    }
+  }
+  CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords();
+  for (int32_t row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL;
+       row++) {
+    missingStartRows--;
+  }
+  int32_t missingEndRows = 0;
+  for (int32_t row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) {
+    missingEndRows += maxRowHeight - rowHeights->GetAt(row1);
+    if (rowHeights->GetAt(row1) > 0) {
+      break;
+    }
+  }
+  for (int32_t row2 = codewords->GetSize() - 1;
+       missingEndRows > 0 && codewords->GetAt(row2) == NULL; row2--) {
+    missingEndRows--;
+  }
+  CBC_BoundingBox* boundingBox =
+      rowIndicatorColumn->getBoundingBox()->addMissingRows(
+          missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return boundingBox;
+}
+int32_t CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) {
+  int32_t maxValue = -1;
+  for (int32_t i = 0; i < values.GetSize(); i++) {
+    int32_t value = values.GetAt(i);
+    maxValue = maxValue > value ? maxValue : value;
+  }
+  return maxValue;
+}
+CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(
+    CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
+    CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) {
+  CBC_BarcodeMetadata* leftBarcodeMetadata = NULL;
+  CBC_BarcodeMetadata* rightBarcodeMetadata = NULL;
+  if (leftRowIndicatorColumn == NULL ||
+      (leftBarcodeMetadata = leftRowIndicatorColumn->getBarcodeMetadata()) ==
+          NULL) {
+    return rightRowIndicatorColumn == NULL
+               ? NULL
+               : rightRowIndicatorColumn->getBarcodeMetadata();
+  }
+  if (rightRowIndicatorColumn == NULL ||
+      (rightBarcodeMetadata = rightRowIndicatorColumn->getBarcodeMetadata()) ==
+          NULL) {
+    return leftRowIndicatorColumn == NULL
+               ? NULL
+               : leftRowIndicatorColumn->getBarcodeMetadata();
+  }
+  if (leftBarcodeMetadata->getColumnCount() !=
+          rightBarcodeMetadata->getColumnCount() &&
+      leftBarcodeMetadata->getErrorCorrectionLevel() !=
+          rightBarcodeMetadata->getErrorCorrectionLevel() &&
+      leftBarcodeMetadata->getRowCount() !=
+          rightBarcodeMetadata->getRowCount()) {
+    delete leftBarcodeMetadata;
+    delete rightBarcodeMetadata;
+    return NULL;
+  }
+  delete rightBarcodeMetadata;
+  return leftBarcodeMetadata;
+}
+CBC_DetectionResultRowIndicatorColumn*
+CBC_PDF417ScanningDecoder::getRowIndicatorColumn(CBC_CommonBitMatrix* image,
+                                                 CBC_BoundingBox* boundingBox,
+                                                 CBC_ResultPoint startPoint,
+                                                 FX_BOOL leftToRight,
+                                                 int32_t minCodewordWidth,
+                                                 int32_t maxCodewordWidth) {
+  CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn =
+      new CBC_DetectionResultRowIndicatorColumn(boundingBox, leftToRight);
+  for (int32_t i = 0; i < 2; i++) {
+    int32_t increment = i == 0 ? 1 : -1;
+    int32_t startColumn = (int32_t)startPoint.GetX();
+    for (int32_t imageRow = (int32_t)startPoint.GetY();
+         imageRow <= boundingBox->getMaxY() &&
+         imageRow >= boundingBox->getMinY();
+         imageRow += increment) {
+      CBC_Codeword* codeword =
+          detectCodeword(image, 0, image->GetWidth(), leftToRight, startColumn,
+                         imageRow, minCodewordWidth, maxCodewordWidth);
+      if (codeword) {
+        rowIndicatorColumn->setCodeword(imageRow, codeword);
+        if (leftToRight) {
+          startColumn = codeword->getStartX();
+        } else {
+          startColumn = codeword->getEndX();
+        }
+      }
+    }
+  }
+  return rowIndicatorColumn;
+}
+void CBC_PDF417ScanningDecoder::adjustCodewordCount(
+    CBC_DetectionResult* detectionResult,
+    CFX_PtrArray* barcodeMatrix,
+    int32_t& e) {
+  CFX_Int32Array* numberOfCodewords =
+      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
+          ->getValue();
+  int32_t calculatedNumberOfCodewords =
+      detectionResult->getBarcodeColumnCount() *
+          detectionResult->getBarcodeRowCount() -
+      getNumberOfECCodeWords(detectionResult->getBarcodeECLevel());
+  if (numberOfCodewords->GetSize() == 0) {
+    if (calculatedNumberOfCodewords < 1 ||
+        calculatedNumberOfCodewords >
+            CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) {
+      e = BCExceptiontNotFoundInstance;
+      delete numberOfCodewords;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
+        ->setValue(calculatedNumberOfCodewords);
+  } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) {
+    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
+        ->setValue(calculatedNumberOfCodewords);
+  }
+  delete numberOfCodewords;
+}
+CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(
+    CBC_DetectionResult* detectionResult,
+    int32_t& e) {
+  CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult);
+  adjustCodewordCount(detectionResult, barcodeMatrix, e);
+  if (e != BCExceptionNO) {
+    for (int32_t i = 0; i < barcodeMatrix->GetSize(); i++) {
+      CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i);
+      for (int32_t j = 0; j < temp->GetSize(); j++) {
+        delete (CBC_BarcodeValue*)temp->GetAt(j);
+      }
+      temp->RemoveAll();
+      delete temp;
+    }
+    barcodeMatrix->RemoveAll();
+    delete barcodeMatrix;
+    return NULL;
+  }
+  CFX_Int32Array erasures;
+  CFX_Int32Array codewords;
+  codewords.SetSize(detectionResult->getBarcodeRowCount() *
+                    detectionResult->getBarcodeColumnCount());
+  CFX_PtrArray ambiguousIndexValuesList;
+  CFX_Int32Array ambiguousIndexesList;
+  for (int32_t row = 0; row < detectionResult->getBarcodeRowCount(); row++) {
+    for (int32_t l = 0; l < detectionResult->getBarcodeColumnCount(); l++) {
+      CFX_Int32Array* values =
+          ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
+               ->GetAt(l + 1))
+              ->getValue();
+      int32_t codewordIndex =
+          row * detectionResult->getBarcodeColumnCount() + l;
+      if (values->GetSize() == 0) {
+        erasures.Add(codewordIndex);
+      } else if (values->GetSize() == 1) {
+        codewords[codewordIndex] = values->GetAt(0);
+      } else {
+        ambiguousIndexesList.Add(codewordIndex);
+        ambiguousIndexValuesList.Add(values);
+      }
+    }
+  }
+  CFX_PtrArray ambiguousIndexValues;
+  ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize());
+  for (int32_t i = 0; i < ambiguousIndexValues.GetSize(); i++) {
+    ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i));
+  }
+  for (int32_t l = 0; l < barcodeMatrix->GetSize(); l++) {
+    CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l);
+    for (int32_t j = 0; j < temp->GetSize(); j++) {
+      delete (CBC_BarcodeValue*)temp->GetAt(j);
+    }
+    temp->RemoveAll();
+    delete temp;
+  }
+  barcodeMatrix->RemoveAll();
+  delete barcodeMatrix;
+  CBC_CommonDecoderResult* decoderResult =
+      createDecoderResultFromAmbiguousValues(
+          detectionResult->getBarcodeECLevel(), codewords, erasures,
+          ambiguousIndexesList, ambiguousIndexValues, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return decoderResult;
+}
+CBC_CommonDecoderResult*
+CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(
+    int32_t ecLevel,
+    CFX_Int32Array& codewords,
+    CFX_Int32Array& erasureArray,
+    CFX_Int32Array& ambiguousIndexes,
+    CFX_PtrArray& ambiguousIndexValues,
+    int32_t& e) {
+  CFX_Int32Array ambiguousIndexCount;
+  ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize());
+  int32_t tries = 100;
+  while (tries-- > 0) {
+    for (int32_t l = 0; l < ambiguousIndexCount.GetSize(); l++) {
+      codewords[ambiguousIndexes[l]] =
+          ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))
+              ->GetAt(ambiguousIndexCount[l]);
+    }
+    CBC_CommonDecoderResult* decoderResult =
+        decodeCodewords(codewords, ecLevel, erasureArray, e);
+    if (e != BCExceptionNO) {
+      e = BCExceptionNO;
+      continue;
+    } else {
+      return decoderResult;
+    }
+    if (ambiguousIndexCount.GetSize() == 0) {
+      e = BCExceptionChecksumInstance;
+      return NULL;
+    }
+    for (int32_t i = 0; i < ambiguousIndexCount.GetSize(); i++) {
+      if (ambiguousIndexCount[i] <
+          ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) {
+        ambiguousIndexCount[i]++;
+        break;
+      } else {
+        ambiguousIndexCount[i] = 0;
+        if (i == ambiguousIndexCount.GetSize() - 1) {
+          e = BCExceptionChecksumInstance;
+          return NULL;
+        }
+      }
+    }
+  }
+  e = BCExceptionChecksumInstance;
+  return NULL;
+}
+CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(
+    CBC_DetectionResult* detectionResult) {
+  CFX_PtrArray* barcodeMatrix = new CFX_PtrArray;
+  barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount());
+  CFX_PtrArray* temp = NULL;
+  int32_t colume = 0;
+  for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
+    temp = new CFX_PtrArray;
+    temp->SetSize(detectionResult->getBarcodeColumnCount() + 2);
+    for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2;
+         colume++) {
+      temp->SetAt(colume, new CBC_BarcodeValue());
+    }
+    barcodeMatrix->SetAt(row, temp);
+  }
+  colume = -1;
+  for (int32_t i = 0;
+       i < detectionResult->getDetectionResultColumns().GetSize(); i++) {
+    CBC_DetectionResultColumn* detectionResultColumn =
+        (CBC_DetectionResultColumn*)detectionResult->getDetectionResultColumns()
+            .GetAt(i);
+    colume++;
+    if (detectionResultColumn == NULL) {
+      continue;
+    }
+    CFX_PtrArray* temp = detectionResultColumn->getCodewords();
+    for (int32_t l = 0; l < temp->GetSize(); l++) {
+      CBC_Codeword* codeword = (CBC_Codeword*)temp->GetAt(l);
+      if (codeword == NULL || codeword->getRowNumber() == -1) {
+        continue;
+      }
+      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(
+                               codeword->getRowNumber()))
+           ->GetAt(colume))
+          ->setValue(codeword->getValue());
+    }
+  }
+  return barcodeMatrix;
+}
+FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(
+    CBC_DetectionResult* detectionResult,
+    int32_t barcodeColumn) {
+  return barcodeColumn >= 0 &&
+         barcodeColumn <= detectionResult->getBarcodeColumnCount() + 1;
+}
+int32_t CBC_PDF417ScanningDecoder::getStartColumn(
+    CBC_DetectionResult* detectionResult,
+    int32_t barcodeColumn,
+    int32_t imageRow,
+    FX_BOOL leftToRight) {
+  int32_t offset = leftToRight ? 1 : -1;
+  CBC_Codeword* codeword = NULL;
+  if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
+    codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)
+                   ->getCodeword(imageRow);
+  }
+  if (codeword) {
+    return leftToRight ? codeword->getEndX() : codeword->getStartX();
+  }
+  codeword = detectionResult->getDetectionResultColumn(barcodeColumn)
+                 ->getCodewordNearby(imageRow);
+  if (codeword) {
+    return leftToRight ? codeword->getStartX() : codeword->getEndX();
+  }
+  if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
+    codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)
+                   ->getCodewordNearby(imageRow);
+  }
+  if (codeword) {
+    return leftToRight ? codeword->getEndX() : codeword->getStartX();
+  }
+  int32_t skippedColumns = 0;
+  while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
+    barcodeColumn -= offset;
+    for (int32_t i = 0;
+         i < detectionResult->getDetectionResultColumn(barcodeColumn)
+                 ->getCodewords()
+                 ->GetSize();
+         i++) {
+      CBC_Codeword* previousRowCodeword =
+          (CBC_Codeword*)detectionResult->getDetectionResultColumn(
+                                            barcodeColumn)
+              ->getCodewords()
+              ->GetAt(i);
+      if (previousRowCodeword) {
+        return (leftToRight ? previousRowCodeword->getEndX()
+                            : previousRowCodeword->getStartX()) +
+               offset * skippedColumns * (previousRowCodeword->getEndX() -
+                                          previousRowCodeword->getStartX());
+      }
+    }
+    skippedColumns++;
+  }
+  return leftToRight ? detectionResult->getBoundingBox()->getMinX()
+                     : detectionResult->getBoundingBox()->getMaxX();
+}
+CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(
+    CBC_CommonBitMatrix* image,
+    int32_t minColumn,
+    int32_t maxColumn,
+    FX_BOOL leftToRight,
+    int32_t startColumn,
+    int32_t imageRow,
+    int32_t minCodewordWidth,
+    int32_t maxCodewordWidth) {
+  startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn,
+                                          leftToRight, startColumn, imageRow);
+  CFX_Int32Array* moduleBitCount = getModuleBitCount(
+      image, minColumn, maxColumn, leftToRight, startColumn, imageRow);
+  if (moduleBitCount == NULL) {
+    return NULL;
+  }
+  int32_t endColumn;
+  int32_t codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount);
+  if (leftToRight) {
+    endColumn = startColumn + codewordBitCount;
+  } else {
+    for (int32_t i = 0; i<moduleBitCount->GetSize()>> 1; i++) {
+      int32_t tmpCount = moduleBitCount->GetAt(i);
+      moduleBitCount->SetAt(
+          i, moduleBitCount->GetAt(moduleBitCount->GetSize() - 1 - i));
+      moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount);
+    }
+    endColumn = startColumn;
+    startColumn = endColumn - codewordBitCount;
+  }
+  int32_t decodedValue =
+      CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBitCount);
+  int32_t codeword = CBC_PDF417Common::getCodeword(decodedValue);
+  delete moduleBitCount;
+  if (codeword == -1) {
+    return NULL;
+  }
+  return new CBC_Codeword(startColumn, endColumn,
+                          getCodewordBucketNumber(decodedValue), codeword);
+}
+CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(
+    CBC_CommonBitMatrix* image,
+    int32_t minColumn,
+    int32_t maxColumn,
+    FX_BOOL leftToRight,
+    int32_t startColumn,
+    int32_t imageRow) {
+  int32_t imageColumn = startColumn;
+  CFX_Int32Array* moduleBitCount = new CFX_Int32Array;
+  moduleBitCount->SetSize(8);
+  int32_t moduleNumber = 0;
+  int32_t increment = leftToRight ? 1 : -1;
+  FX_BOOL previousPixelValue = leftToRight;
+  while (((leftToRight && imageColumn < maxColumn) ||
+          (!leftToRight && imageColumn >= minColumn)) &&
+         moduleNumber < moduleBitCount->GetSize()) {
+    if (image->Get(imageColumn, imageRow) == previousPixelValue) {
+      moduleBitCount->SetAt(moduleNumber,
+                            moduleBitCount->GetAt(moduleNumber) + 1);
+      imageColumn += increment;
+    } else {
+      moduleNumber++;
+      previousPixelValue = !previousPixelValue;
+    }
+  }
+  if (moduleNumber == moduleBitCount->GetSize() ||
+      (((leftToRight && imageColumn == maxColumn) ||
+        (!leftToRight && imageColumn == minColumn)) &&
+       moduleNumber == moduleBitCount->GetSize() - 1)) {
+    return moduleBitCount;
+  }
+  delete moduleBitCount;
+  return NULL;
+}
+int32_t CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(
+    int32_t barcodeECLevel) {
+  return 2 << barcodeECLevel;
+}
+int32_t CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(
+    CBC_CommonBitMatrix* image,
+    int32_t minColumn,
+    int32_t maxColumn,
+    FX_BOOL leftToRight,
+    int32_t codewordStartColumn,
+    int32_t imageRow) {
+  int32_t correctedStartColumn = codewordStartColumn;
+  int32_t increment = leftToRight ? -1 : 1;
+  for (int32_t i = 0; i < 2; i++) {
+    while (((leftToRight && correctedStartColumn >= minColumn) ||
+            (!leftToRight && correctedStartColumn < maxColumn)) &&
+           leftToRight == image->Get(correctedStartColumn, imageRow)) {
+      if (abs(codewordStartColumn - correctedStartColumn) >
+          CODEWORD_SKEW_SIZE) {
+        return codewordStartColumn;
+      }
+      correctedStartColumn += increment;
+    }
+    increment = -increment;
+    leftToRight = !leftToRight;
+  }
+  return correctedStartColumn;
+}
+FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(int32_t codewordSize,
+                                                     int32_t minCodewordWidth,
+                                                     int32_t maxCodewordWidth) {
+  return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize &&
+         codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE;
+}
+CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(
+    CFX_Int32Array& codewords,
+    int32_t ecLevel,
+    CFX_Int32Array& erasures,
+    int32_t& e) {
+  if (codewords.GetSize() == 0) {
+    e = BCExceptionFormatInstance;
+    return NULL;
+  }
+  int32_t numECCodewords = 1 << (ecLevel + 1);
+  correctErrors(codewords, erasures, numECCodewords, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  verifyCodewordCount(codewords, numECCodewords, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_ByteString bytestring;
+  CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(
+      codewords, bytestring.FormatInteger(ecLevel), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return decoderResult;
+}
+int32_t CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array& codewords,
+                                                 CFX_Int32Array& erasures,
+                                                 int32_t numECCodewords,
+                                                 int32_t& e) {
+  if ((erasures.GetSize() != 0 &&
+       erasures.GetSize() > (numECCodewords / 2 + MAX_ERRORS)) ||
+      numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) {
+    e = BCExceptionChecksumInstance;
+    return -1;
+  }
+  int32_t result = CBC_PDF417ECErrorCorrection::decode(
+      codewords, numECCodewords, erasures, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
+  return result;
+}
+void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array& codewords,
+                                                    int32_t numECCodewords,
+                                                    int32_t& e) {
+  if (codewords.GetSize() < 4) {
+    e = BCExceptionFormatInstance;
+    return;
+  }
+  int32_t numberOfCodewords = codewords.GetAt(0);
+  if (numberOfCodewords > codewords.GetSize()) {
+    e = BCExceptionFormatInstance;
+    return;
+  }
+  if (numberOfCodewords == 0) {
+    if (numECCodewords < codewords.GetSize()) {
+      codewords[0] = codewords.GetSize() - numECCodewords;
+    } else {
+      e = BCExceptionFormatInstance;
+      return;
+    }
+  }
+}
+CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(
+    int32_t codeword) {
+  CFX_Int32Array* result = new CFX_Int32Array;
+  result->SetSize(8);
+  int32_t previousValue = 0;
+  int32_t i = result->GetSize() - 1;
+  while (TRUE) {
+    if ((codeword & 0x1) != previousValue) {
+      previousValue = codeword & 0x1;
+      i--;
+      if (i < 0) {
+        break;
+      }
+    }
+    result->SetAt(i, result->GetAt(i) + 1);
+    codeword >>= 1;
+  }
+  return result;
+}
+int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(int32_t codeword) {
+  CFX_Int32Array* array = getBitCountForCodeword(codeword);
+  int32_t result = getCodewordBucketNumber(*array);
+  delete array;
+  return result;
+}
+int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(
+    CFX_Int32Array& moduleBitCount) {
+  return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) +
+          moduleBitCount.GetAt(4) - moduleBitCount.GetAt(6) + 9) %
+         9;
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
new file mode 100644
index 0000000..6dbc125
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
@@ -0,0 +1,119 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
+
+class CBC_CommonDecoderResult;
+class CBC_CommonBitMatrix;
+class CBC_Codeword;
+class CBC_BoundingBox;
+class CBC_ResultPoint;
+class CBC_BarcodeMetadata;
+class CBC_DetectionResult;
+class CBC_DetectionResultRowIndicatorColumn;
+
+class CBC_PDF417ScanningDecoder {
+ public:
+  CBC_PDF417ScanningDecoder();
+  virtual ~CBC_PDF417ScanningDecoder();
+  static void Initialize();
+  static void Finalize();
+  static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image,
+                                         CBC_ResultPoint* imageTopLeft,
+                                         CBC_ResultPoint* imageBottomLeft,
+                                         CBC_ResultPoint* imageTopRight,
+                                         CBC_ResultPoint* imageBottomRight,
+                                         int32_t minCodewordWidth,
+                                         int32_t maxCodewordWidth,
+                                         int32_t& e);
+  static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix);
+
+ private:
+  static int32_t CODEWORD_SKEW_SIZE;
+  static int32_t MAX_ERRORS;
+  static int32_t MAX_EC_CODEWORDS;
+  static CBC_PDF417ECErrorCorrection* errorCorrection;
+  static CBC_DetectionResult* merge(
+      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
+      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
+      int32_t& e);
+  static CBC_BoundingBox* adjustBoundingBox(
+      CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
+      int32_t& e);
+  static int32_t getMax(CFX_Int32Array& values);
+  static CBC_BarcodeMetadata* getBarcodeMetadata(
+      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
+      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn);
+  static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(
+      CBC_CommonBitMatrix* image,
+      CBC_BoundingBox* boundingBox,
+      CBC_ResultPoint startPoint,
+      FX_BOOL leftToRight,
+      int32_t minCodewordWidth,
+      int32_t maxCodewordWidth);
+  static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
+                                  CFX_PtrArray* barcodeMatrix,
+                                  int32_t& e);
+  static CBC_CommonDecoderResult* createDecoderResult(
+      CBC_DetectionResult* detectionResult,
+      int32_t& e);
+  static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(
+      int32_t ecLevel,
+      CFX_Int32Array& codewords,
+      CFX_Int32Array& erasureArray,
+      CFX_Int32Array& ambiguousIndexes,
+      CFX_PtrArray& ambiguousIndexValues,
+      int32_t& e);
+  static CFX_PtrArray* createBarcodeMatrix(
+      CBC_DetectionResult* detectionResult);
+  static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
+                                      int32_t barcodeColumn);
+  static int32_t getStartColumn(CBC_DetectionResult* detectionResult,
+                                int32_t barcodeColumn,
+                                int32_t imageRow,
+                                FX_BOOL leftToRight);
+  static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image,
+                                      int32_t minColumn,
+                                      int32_t maxColumn,
+                                      FX_BOOL leftToRight,
+                                      int32_t startColumn,
+                                      int32_t imageRow,
+                                      int32_t minCodewordWidth,
+                                      int32_t maxCodewordWidth);
+  static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image,
+                                           int32_t minColumn,
+                                           int32_t maxColumn,
+                                           FX_BOOL leftToRight,
+                                           int32_t startColumn,
+                                           int32_t imageRow);
+  static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel);
+  static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image,
+                                           int32_t minColumn,
+                                           int32_t maxColumn,
+                                           FX_BOOL leftToRight,
+                                           int32_t codewordStartColumn,
+                                           int32_t imageRow);
+  static FX_BOOL checkCodewordSkew(int32_t codewordSize,
+                                   int32_t minCodewordWidth,
+                                   int32_t maxCodewordWidth);
+  static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords,
+                                                  int32_t ecLevel,
+                                                  CFX_Int32Array& erasures,
+                                                  int32_t& e);
+  static int32_t correctErrors(CFX_Int32Array& codewords,
+                               CFX_Int32Array& erasures,
+                               int32_t numECCodewords,
+                               int32_t& e);
+  static void verifyCodewordCount(CFX_Int32Array& codewords,
+                                  int32_t numECCodewords,
+                                  int32_t& e);
+  static CFX_Int32Array* getBitCountForCodeword(int32_t codeword);
+  static int32_t getCodewordBucketNumber(int32_t codeword);
+  static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount);
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp
new file mode 100644
index 0000000..765c1d6
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp
@@ -0,0 +1,115 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
+#include "xfa/fxbarcode/pdf417/BC_PDF417Writer.h"
+
+CBC_PDF417Writer::CBC_PDF417Writer() {
+  m_bFixedSize = FALSE;
+}
+CBC_PDF417Writer::~CBC_PDF417Writer() {
+  m_bTruncated = TRUE;
+}
+FX_BOOL CBC_PDF417Writer::SetErrorCorrectionLevel(int32_t level) {
+  if (level < 0 || level > 8) {
+    return FALSE;
+  }
+  m_iCorrectLevel = level;
+  return TRUE;
+}
+void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) {
+  m_bTruncated = truncated;
+}
+uint8_t* CBC_PDF417Writer::Encode(const CFX_WideString& contents,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t& e) {
+  CBC_PDF417 encoder;
+  int32_t col = (m_Width / m_ModuleWidth - 69) / 17;
+  int32_t row = m_Height / (m_ModuleWidth * 20);
+  if (row >= 3 && row <= 90 && col >= 1 && col <= 30) {
+    encoder.setDimensions(col, col, row, row);
+  } else if (col >= 1 && col <= 30) {
+    encoder.setDimensions(col, col, 90, 3);
+  } else if (row >= 3 && row <= 90) {
+    encoder.setDimensions(30, 1, row, row);
+  }
+  encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t lineThickness = 2;
+  int32_t aspectRatio = 4;
+  CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix();
+  CFX_ByteArray originalScale;
+  originalScale.Copy(barcodeMatrix->getScaledMatrix(
+      lineThickness, aspectRatio * lineThickness));
+  int32_t width = outWidth;
+  int32_t height = outHeight;
+  outWidth = barcodeMatrix->getWidth();
+  outHeight = barcodeMatrix->getHeight();
+  FX_BOOL rotated = FALSE;
+  if ((height > width) ^ (outWidth < outHeight)) {
+    rotateArray(originalScale, outHeight, outWidth);
+    rotated = TRUE;
+    int32_t temp = outHeight;
+    outHeight = outWidth;
+    outWidth = temp;
+  }
+  int32_t scaleX = width / outWidth;
+  int32_t scaleY = height / outHeight;
+  int32_t scale;
+  if (scaleX < scaleY) {
+    scale = scaleX;
+  } else {
+    scale = scaleY;
+  }
+  if (scale > 1) {
+    originalScale.RemoveAll();
+    originalScale.Copy(barcodeMatrix->getScaledMatrix(
+        scale * lineThickness, scale * aspectRatio * lineThickness));
+    if (rotated) {
+      rotateArray(originalScale, outHeight, outWidth);
+      int32_t temp = outHeight;
+      outHeight = outWidth;
+      outWidth = temp;
+    }
+  }
+  uint8_t* result = FX_Alloc2D(uint8_t, outHeight, outWidth);
+  FXSYS_memcpy(result, originalScale.GetData(), outHeight * outWidth);
+  return result;
+}
+void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray,
+                                   int32_t height,
+                                   int32_t width) {
+  CFX_ByteArray temp;
+  temp.Copy(bitarray);
+  for (int32_t ii = 0; ii < height; ii++) {
+    int32_t inverseii = height - ii - 1;
+    for (int32_t jj = 0; jj < width; jj++) {
+      bitarray[jj * height + inverseii] = temp[ii * width + jj];
+    }
+  }
+}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Writer.h b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
new file mode 100644
index 0000000..f92f57b
--- /dev/null
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_PDF417_BC_PDF417WRITER_H_
+#define XFA_FXBARCODE_PDF417_BC_PDF417WRITER_H_
+
+class CBC_TwoDimWriter;
+class CBC_PDF417Writer;
+class CBC_PDF417Writer : public CBC_TwoDimWriter {
+ public:
+  CBC_PDF417Writer();
+  virtual ~CBC_PDF417Writer();
+  uint8_t* Encode(const CFX_WideString& contents,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  FX_BOOL SetErrorCorrectionLevel(int32_t level);
+  void SetTruncated(FX_BOOL truncated);
+
+ private:
+  void rotateArray(CFX_ByteArray& bitarray, int32_t width, int32_t height);
+  FX_BOOL m_bTruncated;
+};
+
+#endif  // XFA_FXBARCODE_PDF417_BC_PDF417WRITER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp b/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp
new file mode 100644
index 0000000..25dc28b
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp
@@ -0,0 +1,41 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h"
+
+CBC_QRFinderPatternInfo::CBC_QRFinderPatternInfo(CFX_PtrArray* patternCenters) {
+  m_bottomLeft = (CBC_QRFinderPattern*)(*patternCenters)[0];
+  m_topLeft = (CBC_QRFinderPattern*)(*patternCenters)[1];
+  m_topRight = (CBC_QRFinderPattern*)(*patternCenters)[2];
+}
+CBC_QRFinderPatternInfo::~CBC_QRFinderPatternInfo() {}
+CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetBottomLeft() {
+  return m_bottomLeft;
+}
+CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopLeft() {
+  return m_topLeft;
+}
+CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopRight() {
+  return m_topRight;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h b/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h
new file mode 100644
index 0000000..0acb106
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
+#define XFA_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_QRFinderPattern;
+
+class CBC_QRFinderPatternInfo {
+ private:
+  CBC_QRFinderPattern* m_bottomLeft;
+  CBC_QRFinderPattern* m_topLeft;
+  CBC_QRFinderPattern* m_topRight;
+
+ public:
+  CBC_QRFinderPatternInfo(CFX_PtrArray* patternCenters);
+  virtual ~CBC_QRFinderPatternInfo();
+  CBC_QRFinderPattern* GetBottomLeft();
+  CBC_QRFinderPattern* GetTopLeft();
+  CBC_QRFinderPattern* GetTopRight();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp b/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp
new file mode 100644
index 0000000..4d5a36e
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h"
+
+CBC_QRAlignmentPattern::CBC_QRAlignmentPattern(FX_FLOAT posX,
+                                               FX_FLOAT posY,
+                                               FX_FLOAT estimateModuleSize)
+    : CBC_ResultPoint(posX, posY), m_moduleSize(estimateModuleSize) {}
+CBC_QRAlignmentPattern::~CBC_QRAlignmentPattern() {}
+FX_FLOAT CBC_QRAlignmentPattern::GetX() {
+  return m_x;
+}
+FX_FLOAT CBC_QRAlignmentPattern::GetY() {
+  return m_y;
+}
+FX_BOOL CBC_QRAlignmentPattern::AboutEquals(FX_FLOAT moduleSize,
+                                            FX_FLOAT i,
+                                            FX_FLOAT j) {
+  if ((FXSYS_fabs(i - GetY()) <= moduleSize) &&
+      (FXSYS_fabs(j - GetX()) <= moduleSize)) {
+    FX_FLOAT moduleSizeDiff = FXSYS_fabs(moduleSize - m_moduleSize);
+    return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_moduleSize <= 1.0f);
+  }
+  return FALSE;
+}
+CBC_QRAlignmentPattern* CBC_QRAlignmentPattern::Clone() {
+  return new CBC_QRAlignmentPattern(m_x, m_y, m_moduleSize);
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h b/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h
new file mode 100644
index 0000000..9a4e80c
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
+class CBC_ResultPoint;
+class CBC_QRAlignmentPattern : public CBC_ResultPoint {
+ private:
+  FX_FLOAT m_moduleSize;
+
+ public:
+  CBC_QRAlignmentPattern(FX_FLOAT posX,
+                         FX_FLOAT posY,
+                         FX_FLOAT estimateModuleSize);
+  virtual ~CBC_QRAlignmentPattern();
+  FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j);
+  FX_FLOAT GetX();
+  FX_FLOAT GetY();
+  CBC_QRAlignmentPattern* Clone();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp b/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp
new file mode 100644
index 0000000..8c462bf
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp
@@ -0,0 +1,200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRAlignmentPattern.h"
+#include "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h"
+
+CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(
+    CBC_CommonBitMatrix* image,
+    int32_t startX,
+    int32_t startY,
+    int32_t width,
+    int32_t height,
+    FX_FLOAT moduleSize)
+    : m_image(image),
+      m_startX(startX),
+      m_startY(startY),
+      m_width(width),
+      m_height(height),
+      m_moduleSize(moduleSize) {
+  m_crossCheckStateCount.SetSize(3);
+}
+CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() {
+  for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) {
+    delete (CBC_QRAlignmentPattern*)m_possibleCenters[i];
+  }
+  m_possibleCenters.RemoveAll();
+}
+CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::Find(int32_t& e) {
+  int32_t startX = m_startX;
+  int32_t height = m_height;
+  int32_t maxJ = startX + m_width;
+  int32_t middleI = m_startY + (height >> 1);
+  CFX_Int32Array stateCount;
+  stateCount.SetSize(3);
+  for (int32_t iGen = 0; iGen < height; iGen++) {
+    int32_t i =
+        middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));
+    stateCount[0] = 0;
+    stateCount[1] = 0;
+    stateCount[2] = 0;
+    int32_t j = startX;
+    while (j < maxJ && !m_image->Get(j, i)) {
+      j++;
+    }
+    int32_t currentState = 0;
+    while (j < maxJ) {
+      if (m_image->Get(j, i)) {
+        if (currentState == 1) {
+          stateCount[currentState]++;
+        } else {
+          if (currentState == 2) {
+            if (FoundPatternCross(stateCount)) {
+              CBC_QRAlignmentPattern* confirmed =
+                  HandlePossibleCenter(stateCount, i, j);
+              if (confirmed) {
+                return confirmed;
+              }
+            }
+            stateCount[0] = stateCount[2];
+            stateCount[1] = 1;
+            stateCount[2] = 0;
+            currentState = 1;
+          } else {
+            stateCount[++currentState]++;
+          }
+        }
+      } else {
+        if (currentState == 1) {
+          currentState++;
+        }
+        stateCount[currentState]++;
+      }
+      j++;
+    }
+    if (FoundPatternCross(stateCount)) {
+      CBC_QRAlignmentPattern* confirmed =
+          HandlePossibleCenter(stateCount, i, maxJ);
+      if (confirmed) {
+        return confirmed;
+      }
+    }
+  }
+  if (m_possibleCenters.GetSize() != 0) {
+    return ((CBC_QRAlignmentPattern*)(m_possibleCenters[0]))->Clone();
+  }
+  e = BCExceptionRead;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return NULL;
+}
+FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(
+    const CFX_Int32Array& stateCount,
+    int32_t end) {
+  return (FX_FLOAT)(end - stateCount[2]) - stateCount[1] / 2.0f;
+}
+FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(
+    const CFX_Int32Array& stateCount) {
+  FX_FLOAT moduleSize = m_moduleSize;
+  FX_FLOAT maxVariance = moduleSize / 2.0f;
+  for (int32_t i = 0; i < 3; i++) {
+    if (fabs(moduleSize - stateCount[i]) >= maxVariance) {
+      return false;
+    }
+  }
+  return TRUE;
+}
+FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(
+    int32_t startI,
+    int32_t centerJ,
+    int32_t maxCount,
+    int32_t originalStateCountTotal) {
+  int32_t maxI = m_image->GetHeight();
+  CFX_Int32Array stateCount;
+  stateCount.Copy(m_crossCheckStateCount);
+  stateCount[0] = 0;
+  stateCount[1] = 0;
+  stateCount[2] = 0;
+  int32_t i = startI;
+  while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
+    stateCount[1]++;
+    i--;
+  }
+  if (i < 0 || stateCount[1] > maxCount) {
+    return FXSYS_nan();
+  }
+  while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) {
+    stateCount[0]++;
+    i--;
+  }
+  if (stateCount[0] > maxCount) {
+    return FXSYS_nan();
+  }
+  i = startI + 1;
+  while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
+    stateCount[1]++;
+    i++;
+  }
+  if (i == maxI || stateCount[1] > maxCount) {
+    return FXSYS_nan();
+  }
+  while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) {
+    stateCount[2]++;
+    i++;
+  }
+  if (stateCount[2] > maxCount) {
+    return FXSYS_nan();
+  }
+  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
+  if (5 * abs(stateCountTotal - originalStateCountTotal) >=
+      originalStateCountTotal) {
+    return FXSYS_nan();
+  }
+  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i)
+                                       : FXSYS_nan();
+}
+CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::HandlePossibleCenter(
+    const CFX_Int32Array& stateCount,
+    int32_t i,
+    int32_t j) {
+  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
+  FX_FLOAT centerJ = CenterFromEnd(stateCount, j);
+  FX_FLOAT centerI = CrossCheckVertical(i, (int32_t)centerJ, 2 * stateCount[1],
+                                        stateCountTotal);
+  if (!FXSYS_isnan(centerI)) {
+    FX_FLOAT estimatedModuleSize =
+        (FX_FLOAT)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f;
+    int32_t max = m_possibleCenters.GetSize();
+    for (int32_t index = 0; index < max; index++) {
+      CBC_QRAlignmentPattern* center =
+          (CBC_QRAlignmentPattern*)(m_possibleCenters[index]);
+      if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) {
+        return new CBC_QRAlignmentPattern(centerJ, centerI,
+                                          estimatedModuleSize);
+      }
+    }
+    m_possibleCenters.Add(
+        new CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize));
+  }
+  return NULL;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h b/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h
new file mode 100644
index 0000000..0b1a2a7
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h
@@ -0,0 +1,47 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/utils.h"
+
+class CBC_CommonBitMatrix;
+class CBC_QRAlignmentPattern;
+
+class CBC_QRAlignmentPatternFinder {
+ private:
+  CBC_CommonBitMatrix* m_image;
+  CFX_PtrArray m_possibleCenters;
+  int32_t m_startX;
+  int32_t m_startY;
+  int32_t m_width;
+  int32_t m_height;
+  FX_FLOAT m_moduleSize;
+  CFX_Int32Array m_crossCheckStateCount;
+
+ public:
+  CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix* image,
+                               int32_t startX,
+                               int32_t startY,
+                               int32_t width,
+                               int32_t height,
+                               FX_FLOAT moduleSize);
+  virtual ~CBC_QRAlignmentPatternFinder();
+  FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
+  FX_FLOAT CrossCheckVertical(int32_t startI,
+                              int32_t startJ,
+                              int32_t maxCount,
+                              int32_t originalStateCountTotal);
+  CBC_QRAlignmentPattern* Find(int32_t& e);
+  CBC_QRAlignmentPattern* HandlePossibleCenter(const CFX_Int32Array& stateCount,
+                                               int32_t i,
+                                               int32_t j);
+  static FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp b/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp
new file mode 100644
index 0000000..5380358
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp
@@ -0,0 +1,183 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRBitMatrixParser::CBC_QRBitMatrixParser() {}
+void CBC_QRBitMatrixParser::Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e) {
+  m_dimension = bitMatrix->GetDimension(e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  m_tempBitMatrix = bitMatrix;
+  if (m_dimension < 21 || (m_dimension & 0x03) != 1) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  m_bitMatrix = m_tempBitMatrix;
+  m_parsedFormatInfo = NULL;
+  m_version = NULL;
+}
+CBC_QRBitMatrixParser::~CBC_QRBitMatrixParser() {
+  delete m_parsedFormatInfo;
+}
+CBC_QRCoderFormatInformation* CBC_QRBitMatrixParser::ReadFormatInformation(
+    int32_t& e) {
+  if (m_parsedFormatInfo) {
+    return m_parsedFormatInfo;
+  }
+  int32_t formatInfoBits = 0;
+  int32_t j;
+  for (j = 0; j < 6; j++) {
+    formatInfoBits = CopyBit(8, j, formatInfoBits);
+  }
+  formatInfoBits = CopyBit(8, 7, formatInfoBits);
+  formatInfoBits = CopyBit(8, 8, formatInfoBits);
+  formatInfoBits = CopyBit(7, 8, formatInfoBits);
+  for (int32_t i = 5; i >= 0; i--) {
+    formatInfoBits = CopyBit(i, 8, formatInfoBits);
+  }
+  m_parsedFormatInfo =
+      CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits);
+  if (m_parsedFormatInfo) {
+    return m_parsedFormatInfo;
+  }
+  int32_t dimension = m_bitMatrix->GetDimension(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  formatInfoBits = 0;
+  int32_t iMin = dimension - 8;
+  for (j = dimension - 1; j >= iMin; j--) {
+    formatInfoBits = CopyBit(j, 8, formatInfoBits);
+  }
+  for (int32_t k = dimension - 7; k < dimension; k++) {
+    formatInfoBits = CopyBit(8, k, formatInfoBits);
+  }
+  m_parsedFormatInfo =
+      CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits);
+  if (m_parsedFormatInfo) {
+    return m_parsedFormatInfo;
+  }
+  e = BCExceptionRead;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return NULL;
+}
+CBC_QRCoderVersion* CBC_QRBitMatrixParser::ReadVersion(int32_t& e) {
+  if (m_version) {
+    return m_version;
+  }
+  int32_t dimension = m_bitMatrix->GetDimension(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t provisionVersion = (dimension - 17) >> 2;
+  if (provisionVersion <= 6) {
+    CBC_QRCoderVersion* qrv =
+        CBC_QRCoderVersion::GetVersionForNumber(provisionVersion, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return qrv;
+  }
+  int32_t versionBits = 0;
+  for (int32_t i = 5; i >= 0; i--) {
+    int32_t jMin = dimension - 11;
+    for (int32_t j = dimension - 9; j >= jMin; j--) {
+      versionBits = CopyBit(i, j, versionBits);
+    }
+  }
+  m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  if (m_version && m_version->GetDimensionForVersion() == dimension) {
+    return m_version;
+  }
+  versionBits = 0;
+  for (int32_t j = 5; j >= 0; j--) {
+    int32_t iMin = dimension - 11;
+    for (int32_t i = dimension - 9; i >= iMin; i--) {
+      versionBits = CopyBit(i, j, versionBits);
+    }
+  }
+  m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  if (m_version && m_version->GetDimensionForVersion() == dimension) {
+    return m_version;
+  }
+  e = BCExceptionRead;
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return NULL;
+}
+int32_t CBC_QRBitMatrixParser::CopyBit(int32_t i,
+                                       int32_t j,
+                                       int32_t versionBits) {
+  return m_bitMatrix->Get(j, i) ? (versionBits << 1) | 0x1 : versionBits << 1;
+}
+CFX_ByteArray* CBC_QRBitMatrixParser::ReadCodewords(int32_t& e) {
+  CBC_QRCoderFormatInformation* formatInfo = ReadFormatInformation(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL) CBC_QRCoderVersion* version =
+      ReadVersion(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRDataMask* dataMask =
+      CBC_QRDataMask::ForReference((int32_t)(formatInfo->GetDataMask()), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t dimension = m_bitMatrix->GetDimension(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  dataMask->UnmaskBitMatirx(m_bitMatrix, dimension);
+  std::unique_ptr<CBC_CommonBitMatrix> functionPattern(
+      version->BuildFunctionPattern(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  FX_BOOL readingUp = TRUE;
+  std::unique_ptr<CFX_ByteArray> result(new CFX_ByteArray);
+  result->SetSize(version->GetTotalCodeWords());
+  int32_t resultOffset = 0;
+  int32_t currentByte = 0;
+  int32_t bitsRead = 0;
+  for (int32_t j = dimension - 1; j > 0; j -= 2) {
+    if (j == 6) {
+      j--;
+    }
+    for (int32_t count = 0; count < dimension; count++) {
+      int32_t i = readingUp ? dimension - 1 - count : count;
+      for (int32_t col = 0; col < 2; col++) {
+        if (!functionPattern->Get(j - col, i)) {
+          bitsRead++;
+          currentByte <<= 1;
+          if (m_bitMatrix->Get(j - col, i)) {
+            currentByte |= 1;
+          }
+          if (bitsRead == 8) {
+            (*result)[resultOffset++] = (uint8_t)currentByte;
+            bitsRead = 0;
+            currentByte = 0;
+          }
+        }
+      }
+    }
+    readingUp ^= TRUE;
+  }
+  if (resultOffset != version->GetTotalCodeWords()) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return result.release();
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h b/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h
new file mode 100644
index 0000000..6bb1064
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_QRCoderVersion;
+class CBC_QRCoderFormatInformation;
+
+class CBC_QRBitMatrixParser {
+ private:
+  CBC_CommonBitMatrix* m_bitMatrix;
+  CBC_CommonBitMatrix* m_tempBitMatrix;
+  CBC_QRCoderVersion* m_version;
+  CBC_QRCoderFormatInformation* m_parsedFormatInfo;
+  int32_t m_dimension;
+
+ public:
+  CBC_QRBitMatrixParser();
+  virtual ~CBC_QRBitMatrixParser();
+  CBC_QRCoderFormatInformation* ReadFormatInformation(int32_t& e);
+  CBC_QRCoderVersion* ReadVersion(int32_t& e);
+  int32_t CopyBit(int32_t i, int32_t j, int32_t versionBits);
+  CFX_ByteArray* ReadCodewords(int32_t& e);
+  virtual void Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCodeReader.cpp b/xfa/fxbarcode/qrcode/BC_QRCodeReader.cpp
new file mode 100644
index 0000000..716b6c1
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCodeReader.cpp
@@ -0,0 +1,108 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/BC_Binarizer.h"
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/BC_LuminanceSource.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h"
+
+CBC_QRCodeReader::CBC_QRCodeReader() : m_decoder(NULL) {}
+void CBC_QRCodeReader::Init() {
+  m_decoder = new CBC_QRCoderDecoder;
+  m_decoder->Init();
+}
+CBC_QRCodeReader::~CBC_QRCodeReader() {
+  delete m_decoder;
+}
+CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image,
+                                        int32_t hints,
+                                        int32_t& e) {
+  CBC_CommonBitMatrix* matrix = image->GetMatrix(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CBC_QRDetector detector(matrix);
+  std::unique_ptr<CBC_QRDetectorResult> detectorResult(
+      detector.Detect(hints, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  std::unique_ptr<CBC_CommonDecoderResult> decodeResult(
+      m_decoder->Decode(detectorResult->GetBits(), 0, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return (decodeResult->GetText());
+}
+CFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString& filename,
+                                        int32_t hints,
+                                        int32_t byteModeDecode,
+                                        int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(filename);
+  source.Init(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString bs = Decode(&bitmap, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return bs;
+}
+CFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap* pBitmap,
+                                        int32_t hints,
+                                        int32_t byteModeDecode,
+                                        int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString bs = Decode(&bitmap, hints, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return bs;
+}
+CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
+  CFX_ByteString bs = Decode(image, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, "");
+  return bs;
+}
+void CBC_QRCodeReader::ReleaseAll() {
+  if (CBC_ReedSolomonGF256::QRCodeFild) {
+    delete CBC_ReedSolomonGF256::QRCodeFild;
+    CBC_ReedSolomonGF256::QRCodeFild = NULL;
+  }
+  if (CBC_ReedSolomonGF256::DataMatrixField) {
+    delete CBC_ReedSolomonGF256::DataMatrixField;
+    CBC_ReedSolomonGF256::DataMatrixField = NULL;
+  }
+  CBC_QRCoderMode::Destroy();
+  CBC_QRCoderErrorCorrectionLevel::Destroy();
+  CBC_QRDataMask::Destroy();
+  CBC_QRCoderVersion::Destroy();
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCodeReader.h b/xfa/fxbarcode/qrcode/BC_QRCodeReader.h
new file mode 100644
index 0000000..72dd453
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCodeReader.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
+
+#include <stdint.h>
+
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+
+class CBC_BinaryBitmap;
+class CBC_QRCoderDecoder;
+class CFX_DIBitmap;
+
+class CBC_QRCodeReader : public CBC_Reader {
+ private:
+  CBC_QRCoderDecoder* m_decoder;
+
+ public:
+  CBC_QRCodeReader();
+  virtual ~CBC_QRCodeReader();
+  CFX_ByteString Decode(CFX_DIBitmap* pBitmap,
+                        int32_t hints,
+                        int32_t byteModeDecode,
+                        int32_t& e);
+  CFX_ByteString Decode(const CFX_WideString& filename,
+                        int32_t hints,
+                        int32_t byteModeDecode,
+                        int32_t& e);
+  static void ReleaseAll();
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
+  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
+  virtual void Init();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp b/xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp
new file mode 100644
index 0000000..cd4340e
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp
@@ -0,0 +1,107 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_Reader.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+
+CBC_QRCodeWriter::CBC_QRCodeWriter() {
+  m_bFixedSize = TRUE;
+  m_iCorrectLevel = 1;
+  m_iVersion = 0;
+}
+CBC_QRCodeWriter::~CBC_QRCodeWriter() {}
+void CBC_QRCodeWriter::ReleaseAll() {
+  CBC_QRCodeReader::ReleaseAll();
+}
+FX_BOOL CBC_QRCodeWriter::SetVersion(int32_t version) {
+  if (version < 0 || version > 40) {
+    return FALSE;
+  }
+  m_iVersion = version;
+  return TRUE;
+}
+FX_BOOL CBC_QRCodeWriter::SetErrorCorrectionLevel(int32_t level) {
+  if (level < 0 || level > 3) {
+    return FALSE;
+  }
+  m_iCorrectLevel = level;
+  return TRUE;
+}
+uint8_t* CBC_QRCodeWriter::Encode(const CFX_WideString& contents,
+                                  int32_t ecLevel,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t& e) {
+  CBC_QRCoderErrorCorrectionLevel* ec = NULL;
+  switch (ecLevel) {
+    case 0:
+      ec = CBC_QRCoderErrorCorrectionLevel::L;
+      break;
+    case 1:
+      ec = CBC_QRCoderErrorCorrectionLevel::M;
+      break;
+    case 2:
+      ec = CBC_QRCoderErrorCorrectionLevel::Q;
+      break;
+    case 3:
+      ec = CBC_QRCoderErrorCorrectionLevel::H;
+      break;
+    default: {
+      e = BCExceptionUnSupportEclevel;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+  }
+  CBC_QRCoder qr;
+  if (m_iVersion > 0 && m_iVersion < 41) {
+    CFX_ByteString byteStr = contents.UTF8Encode();
+    CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion);
+  } else {
+    CBC_QRCoderEncoder::Encode(contents, ec, &qr, e);
+  }
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  outWidth = qr.GetMatrixWidth();
+  outHeight = qr.GetMatrixWidth();
+  uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight);
+  FXSYS_memcpy(result, qr.GetMatrix()->GetArray(), outWidth * outHeight);
+  return result;
+}
+uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents,
+                                  BCFORMAT format,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t hints,
+                                  int32_t& e) {
+  return NULL;
+}
+uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents,
+                                  BCFORMAT format,
+                                  int32_t& outWidth,
+                                  int32_t& outHeight,
+                                  int32_t& e) {
+  return NULL;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCodeWriter.h b/xfa/fxbarcode/qrcode/BC_QRCodeWriter.h
new file mode 100644
index 0000000..c68c6c0
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCodeWriter.h
@@ -0,0 +1,41 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
+
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+
+class CBC_TwoDimWriter;
+class CBC_QRCodeWriter : public CBC_TwoDimWriter {
+ public:
+  CBC_QRCodeWriter();
+  virtual ~CBC_QRCodeWriter();
+  uint8_t* Encode(const CFX_WideString& contents,
+                  int32_t ecLevel,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t hints,
+                  int32_t& e);
+  uint8_t* Encode(const CFX_ByteString& contents,
+                  BCFORMAT format,
+                  int32_t& outWidth,
+                  int32_t& outHeight,
+                  int32_t& e);
+  FX_BOOL SetVersion(int32_t version);
+  FX_BOOL SetErrorCorrectionLevel(int32_t level);
+  static void ReleaseAll();
+
+ private:
+  int32_t m_iVersion;
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoder.cpp b/xfa/fxbarcode/qrcode/BC_QRCoder.cpp
new file mode 100644
index 0000000..9e9ad06
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoder.cpp
@@ -0,0 +1,124 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRCoder::CBC_QRCoder() {
+  m_mode = NULL;
+  m_ecLevel = NULL;
+  m_version = -1;
+  m_matrixWidth = -1;
+  m_maskPattern = -1;
+  m_numTotalBytes = -1;
+  m_numDataBytes = -1;
+  m_numECBytes = -1;
+  m_numRSBlocks = -1;
+  m_matrix = NULL;
+}
+CBC_QRCoder::~CBC_QRCoder() {
+  delete m_matrix;
+}
+CBC_QRCoderMode* CBC_QRCoder::GetMode() {
+  return m_mode;
+}
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoder::GetECLevel() {
+  return m_ecLevel;
+}
+int32_t CBC_QRCoder::GetVersion() {
+  return m_version;
+}
+int32_t CBC_QRCoder::GetMatrixWidth() {
+  return m_matrixWidth;
+}
+int32_t CBC_QRCoder::GetMaskPattern() {
+  return m_maskPattern;
+}
+int32_t CBC_QRCoder::GetNumTotalBytes() {
+  return m_numTotalBytes;
+}
+int32_t CBC_QRCoder::GetNumDataBytes() {
+  return m_numDataBytes;
+}
+int32_t CBC_QRCoder::GetNumECBytes() {
+  return m_numECBytes;
+}
+int32_t CBC_QRCoder::GetNumRSBlocks() {
+  return m_numRSBlocks;
+}
+CBC_CommonByteMatrix* CBC_QRCoder::GetMatrix() {
+  return m_matrix;
+}
+int32_t CBC_QRCoder::At(int32_t x, int32_t y, int32_t& e) {
+  int32_t value = m_matrix->Get(x, y);
+  if (!(value == 0 || value == 1)) {
+    e = BCExceptionValueMustBeEither0or1;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  return value;
+}
+FX_BOOL CBC_QRCoder::IsValid() {
+  return m_mode && m_ecLevel && m_version != -1 && m_matrixWidth != -1 &&
+         m_maskPattern != -1 && m_numTotalBytes != -1 && m_numDataBytes != -1 &&
+         m_numECBytes != -1 && m_numRSBlocks != -1 &&
+         IsValidMaskPattern(m_maskPattern) &&
+         m_numTotalBytes == m_numDataBytes + m_numECBytes && m_matrix &&
+         m_matrixWidth == m_matrix->GetWidth() &&
+         m_matrix->GetWidth() == m_matrix->GetHeight();
+}
+void CBC_QRCoder::SetMode(CBC_QRCoderMode* value) {
+  m_mode = value;
+}
+void CBC_QRCoder::SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel) {
+  m_ecLevel = ecLevel;
+}
+void CBC_QRCoder::SetVersion(int32_t version) {
+  m_version = version;
+}
+void CBC_QRCoder::SetMatrixWidth(int32_t width) {
+  m_matrixWidth = width;
+}
+void CBC_QRCoder::SetMaskPattern(int32_t pattern) {
+  m_maskPattern = pattern;
+}
+void CBC_QRCoder::SetNumDataBytes(int32_t bytes) {
+  m_numDataBytes = bytes;
+}
+void CBC_QRCoder::SetNumTotalBytes(int32_t value) {
+  m_numTotalBytes = value;
+}
+void CBC_QRCoder::SetNumRSBlocks(int32_t block) {
+  m_numRSBlocks = block;
+}
+void CBC_QRCoder::SetNumECBytes(int32_t value) {
+  m_numECBytes = value;
+}
+FX_BOOL CBC_QRCoder::IsValidMaskPattern(int32_t maskPattern) {
+  return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS;
+}
+void CBC_QRCoder::SetMatrix(CBC_CommonByteMatrix* value) {
+  m_matrix = value;
+}
+const int32_t CBC_QRCoder::NUM_MASK_PATTERNS = 8;
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoder.h b/xfa/fxbarcode/qrcode/BC_QRCoder.h
new file mode 100644
index 0000000..bbf7bd4
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoder.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODER_H_
+
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_QRCoderMode;
+class CBC_CommonByteMatrix;
+
+class CBC_QRCoder {
+ private:
+  CBC_QRCoderMode* m_mode;
+  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
+  int32_t m_version;
+  int32_t m_matrixWidth;
+  int32_t m_maskPattern;
+  int32_t m_numTotalBytes;
+  int32_t m_numDataBytes;
+  int32_t m_numECBytes;
+  int32_t m_numRSBlocks;
+  CBC_CommonByteMatrix* m_matrix;
+
+ public:
+  static const int32_t NUM_MASK_PATTERNS;
+  CBC_QRCoder();
+  virtual ~CBC_QRCoder();
+  CBC_QRCoderMode* GetMode();
+  CBC_QRCoderErrorCorrectionLevel* GetECLevel();
+  int32_t GetVersion();
+  int32_t GetMatrixWidth();
+  int32_t GetMaskPattern();
+  int32_t GetNumTotalBytes();
+  int32_t GetNumDataBytes();
+  int32_t GetNumECBytes();
+  int32_t GetNumRSBlocks();
+  CBC_CommonByteMatrix* GetMatrix();
+  int32_t At(int32_t x, int32_t y, int32_t& e);
+  FX_BOOL IsValid();
+
+  void SetMode(CBC_QRCoderMode* value);
+  void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel);
+  void SetVersion(int32_t version);
+  void SetMatrixWidth(int32_t width);
+  void SetMaskPattern(int32_t pattern);
+  void SetNumDataBytes(int32_t bytes);
+  void SetNumTotalBytes(int32_t value);
+  void SetNumECBytes(int32_t value);
+  void SetNumRSBlocks(int32_t block);
+  void SetMatrix(CBC_CommonByteMatrix* value);
+  static FX_BOOL IsValidMaskPattern(int32_t maskPattern);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp
new file mode 100644
index 0000000..a225f61
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp
@@ -0,0 +1,124 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "core/include/fxcrt/fx_memory.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRCoderBitVector::CBC_QRCoderBitVector() {
+  m_sizeInBits = 0;
+  m_size = 32;
+}
+void CBC_QRCoderBitVector::Init() {
+  m_array = FX_Alloc(uint8_t, m_size);
+}
+CBC_QRCoderBitVector::~CBC_QRCoderBitVector() {
+  FX_Free(m_array);
+}
+void CBC_QRCoderBitVector::Clear() {
+  FX_Free(m_array);
+  m_sizeInBits = 0;
+  m_size = 32;
+  m_array = FX_Alloc(uint8_t, m_size);
+}
+int32_t CBC_QRCoderBitVector::At(int32_t index, int32_t& e) {
+  if (index < 0 || index >= m_sizeInBits) {
+    e = BCExceptionBadIndexException;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  int32_t value = m_array[index >> 3] & 0xff;
+  return (value >> (7 - (index & 0x7))) & 1;
+}
+int32_t CBC_QRCoderBitVector::sizeInBytes() {
+  return (m_sizeInBits + 7) >> 3;
+}
+int32_t CBC_QRCoderBitVector::Size() {
+  return m_sizeInBits;
+}
+void CBC_QRCoderBitVector::AppendBit(int32_t bit, int32_t& e) {
+  if (!(bit == 0 || bit == 1)) {
+    e = BCExceptionBadValueException;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t numBitsInLastByte = m_sizeInBits & 0x7;
+  if (numBitsInLastByte == 0) {
+    AppendByte(0);
+    m_sizeInBits -= 8;
+  }
+  m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte));
+  ++m_sizeInBits;
+}
+void CBC_QRCoderBitVector::AppendBits(int32_t value,
+                                      int32_t numBits,
+                                      int32_t& e) {
+  if (numBits < 0 || numBits > 32) {
+    e = BCExceptionBadNumBitsException;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t numBitsLeft = numBits;
+  while (numBitsLeft > 0) {
+    if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) {
+      int32_t newByte = (value >> (numBitsLeft - 8)) & 0xff;
+      AppendByte(newByte);
+      numBitsLeft -= 8;
+    } else {
+      int32_t bit = (value >> (numBitsLeft - 1)) & 1;
+      AppendBit(bit, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      --numBitsLeft;
+    }
+  }
+}
+void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector* bits,
+                                           int32_t& e) {
+  int32_t size = bits->Size();
+  for (int32_t i = 0; i < size; i++) {
+    int32_t num = bits->At(i, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    AppendBit(num, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e)
+  }
+}
+void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector* other, int32_t& e) {
+  if (m_sizeInBits != other->Size()) {
+    e = BCExceptioncanNotOperatexorOperator;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t sizeInBytes = (m_sizeInBits + 7) >> 3;
+  for (int32_t i = 0; i < sizeInBytes; ++i) {
+    m_array[i] ^= (other->GetArray())[i];
+  }
+}
+uint8_t* CBC_QRCoderBitVector::GetArray() {
+  return m_array;
+}
+void CBC_QRCoderBitVector::AppendByte(int32_t value) {
+  if ((m_sizeInBits >> 3) == m_size) {
+    uint8_t* newArray = FX_Alloc(uint8_t, m_size << 1);
+    FXSYS_memcpy(newArray, m_array, m_size);
+    FX_Free(m_array);
+    m_array = newArray;
+    m_size = m_size << 1;
+  }
+  m_array[m_sizeInBits >> 3] = (uint8_t)value;
+  m_sizeInBits += 8;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h b/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h
new file mode 100644
index 0000000..7742541
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
+
+#include <stdint.h>
+
+class CBC_QRCoderBitVector {
+ private:
+  int32_t m_sizeInBits;
+  uint8_t* m_array;
+  int32_t m_size;
+
+  void AppendByte(int32_t value);
+
+ public:
+  CBC_QRCoderBitVector();
+  virtual ~CBC_QRCoderBitVector();
+  int32_t At(int32_t index, int32_t& e);
+  int32_t Size();
+  int32_t sizeInBytes();
+  void AppendBit(int32_t bit, int32_t& e);
+  void AppendBits(int32_t value, int32_t numBits, int32_t& e);
+  void AppendBitVector(CBC_QRCoderBitVector* bits, int32_t& e);
+  void XOR(CBC_QRCoderBitVector* other, int32_t& e);
+  uint8_t* GetArray();
+  void Clear();
+  virtual void Init();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp
new file mode 100644
index 0000000..b8a032a
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp
@@ -0,0 +1,41 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonByteArray.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h"
+
+CBC_QRCoderBlockPair::CBC_QRCoderBlockPair(
+    CBC_CommonByteArray* data,
+    CBC_CommonByteArray* errorCorrection) {
+  m_dataBytes = data;
+  m_errorCorrectionBytes = errorCorrection;
+}
+CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() {
+  delete m_dataBytes;
+  delete m_errorCorrectionBytes;
+}
+CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() {
+  return m_dataBytes;
+}
+CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() {
+  return m_errorCorrectionBytes;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h b/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h
new file mode 100644
index 0000000..5427436
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
+
+class CBC_CommonByteArray;
+class CBC_QRCoderBlockPair {
+ private:
+  CBC_CommonByteArray* m_dataBytes;
+  CBC_CommonByteArray* m_errorCorrectionBytes;
+
+ public:
+  CBC_QRCoderBlockPair(CBC_CommonByteArray* data,
+                       CBC_CommonByteArray* errorCorrection);
+  virtual ~CBC_QRCoderBlockPair();
+
+  CBC_CommonByteArray* GetDataBytes();
+  CBC_CommonByteArray* GetErrorCorrectionBytes();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.cpp
new file mode 100644
index 0000000..1966146
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.cpp
@@ -0,0 +1,129 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/qrcode/BC_QRBitMatrixParser.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDataBlock.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
+
+CBC_QRCoderDecoder::CBC_QRCoderDecoder() {
+  m_rsDecoder = NULL;
+}
+
+void CBC_QRCoderDecoder::Init() {
+  m_rsDecoder = new CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::QRCodeFild);
+}
+CBC_QRCoderDecoder::~CBC_QRCoderDecoder() {
+  delete m_rsDecoder;
+}
+CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image,
+                                                    int32_t width,
+                                                    int32_t height,
+                                                    int32_t& e) {
+  CBC_CommonBitMatrix bits;
+  bits.Init(width);
+  for (int32_t i = 0; i < width; i++) {
+    for (int32_t j = 0; j < height; j++) {
+      if (image[i * width + j]) {
+        bits.Set(j, i);
+      }
+    }
+  }
+  CBC_CommonDecoderResult* cdr = Decode(&bits, height, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return cdr;
+}
+CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits,
+                                                    int32_t byteModeDecode,
+                                                    int32_t& e) {
+  CBC_QRBitMatrixParser parser;
+  parser.Init(bits, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRCoderVersion* version = parser.ReadVersion(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel();
+  std::unique_ptr<CFX_ByteArray> codewords(parser.ReadCodewords(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* dataBlocks =
+      CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t totalBytes = 0;
+  for (int32_t i = 0; i < dataBlocks->GetSize(); i++) {
+    totalBytes += ((CBC_QRDataBlock*)((*dataBlocks)[i]))->GetNumDataCodewords();
+  }
+  CFX_ByteArray resultBytes;
+  for (int32_t j = 0; j < dataBlocks->GetSize(); j++) {
+    CBC_QRDataBlock* dataBlock = (CBC_QRDataBlock*)((*dataBlocks)[j]);
+    CFX_ByteArray* codewordBytes = dataBlock->GetCodewords();
+    int32_t numDataCodewords = dataBlock->GetNumDataCodewords();
+    CorrectErrors(codewordBytes, numDataCodewords, e);
+    if (e != BCExceptionNO) {
+      for (int32_t k = 0; k < dataBlocks->GetSize(); k++) {
+        delete (CBC_QRDataBlock*)(*dataBlocks)[k];
+      }
+      dataBlocks->RemoveAll();
+      delete dataBlocks;
+      dataBlocks = NULL;
+      return NULL;
+    }
+    for (int32_t i = 0; i < numDataCodewords; i++) {
+      resultBytes.Add((*codewordBytes)[i]);
+    }
+  }
+  for (int32_t k = 0; k < dataBlocks->GetSize(); k++) {
+    delete (CBC_QRDataBlock*)(*dataBlocks)[k];
+  }
+  dataBlocks->RemoveAll();
+  delete dataBlocks;
+  dataBlocks = NULL;
+  CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode(
+      &resultBytes, version, ecLevel, byteModeDecode, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return cdr;
+}
+void CBC_QRCoderDecoder::CorrectErrors(CFX_ByteArray* codewordBytes,
+                                       int32_t numDataCodewords,
+                                       int32_t& e) {
+  int32_t numCodewords = codewordBytes->GetSize();
+  CFX_Int32Array codewordsInts;
+  codewordsInts.SetSize(numCodewords);
+  for (int32_t i = 0; i < numCodewords; i++) {
+    codewordsInts[i] = (int32_t)((*codewordBytes)[i] & 0xff);
+  }
+  int32_t numECCodewords = codewordBytes->GetSize() - numDataCodewords;
+  m_rsDecoder->Decode(&codewordsInts, numECCodewords, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  for (int32_t k = 0; k < numDataCodewords; k++) {
+    (*codewordBytes)[k] = (uint8_t)codewordsInts[k];
+  }
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h b/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h
new file mode 100644
index 0000000..b6c381c
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderDecoder.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_ReedSolomonDecoder;
+class CBC_CommonDecoderResult;
+
+class CBC_QRCoderDecoder {
+ private:
+  CBC_ReedSolomonDecoder* m_rsDecoder;
+
+ public:
+  CBC_QRCoderDecoder();
+  virtual ~CBC_QRCoderDecoder();
+
+  CBC_CommonDecoderResult* Decode(FX_BOOL* image,
+                                  int32_t width,
+                                  int32_t height,
+                                  int32_t& e);
+  CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits,
+                                  int32_t byteModeDecode,
+                                  int32_t& e);
+  void CorrectErrors(CFX_ByteArray* codewordBytes,
+                     int32_t numDataCodewords,
+                     int32_t& e);
+  virtual void Init();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp
new file mode 100644
index 0000000..2b5a2a6
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECB.h"
+
+CBC_QRCoderECB::CBC_QRCoderECB(int32_t count, int32_t dataCodeWords) {
+  m_dataCodeWords = dataCodeWords;
+  m_count = count;
+}
+CBC_QRCoderECB::~CBC_QRCoderECB() {}
+int32_t CBC_QRCoderECB::GetCount() {
+  return m_count;
+}
+int32_t CBC_QRCoderECB::GetDataCodeWords() {
+  return m_dataCodeWords;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderECB.h b/xfa/fxbarcode/qrcode/BC_QRCoderECB.h
new file mode 100644
index 0000000..25b0b20
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderECB.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERECB_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERECB_H_
+
+#include <stdint.h>
+
+class CBC_QRCoderECB {
+ private:
+  int32_t m_count;
+  int32_t m_dataCodeWords;
+
+ public:
+  CBC_QRCoderECB(int32_t count, int32_t dataCodeWords);
+  virtual ~CBC_QRCoderECB();
+  int32_t GetCount();
+  int32_t GetDataCodeWords();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERECB_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp
new file mode 100644
index 0000000..eb6d194
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECB.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
+
+CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
+                                         CBC_QRCoderECB* ecBlocks) {
+  m_ecCodeWordsPerBlock = ecCodeWordsPerBlock;
+  m_ecBlocks.Add(ecBlocks);
+}
+CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
+                                         CBC_QRCoderECB* ecBlocks1,
+                                         CBC_QRCoderECB* ecBlocks2) {
+  m_ecCodeWordsPerBlock = ecCodeWordsPerBlock;
+  m_ecBlocks.Add(ecBlocks1);
+  m_ecBlocks.Add(ecBlocks2);
+}
+CBC_QRCoderECBlocks::~CBC_QRCoderECBlocks() {
+  for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
+    delete ((CBC_QRCoderECB*)(m_ecBlocks[i]));
+  }
+  m_ecBlocks.RemoveAll();
+}
+int32_t CBC_QRCoderECBlocks::GetECCodeWordsPerBlock() {
+  return m_ecCodeWordsPerBlock;
+}
+int32_t CBC_QRCoderECBlocks::GetNumBlocks() {
+  int32_t total = 0;
+  for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
+    total += ((CBC_QRCoderECB*)(m_ecBlocks[i]))->GetCount();
+  }
+  return total;
+}
+int32_t CBC_QRCoderECBlocks::GetTotalECCodeWords() {
+  return m_ecCodeWordsPerBlock * GetNumBlocks();
+}
+CFX_PtrArray* CBC_QRCoderECBlocks::GetECBlocks() {
+  return &m_ecBlocks;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h b/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h
new file mode 100644
index 0000000..c1a5b34
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_QRCoderECB;
+
+class CBC_QRCoderECBlocks {
+ private:
+  int32_t m_ecCodeWordsPerBlock;
+  CFX_PtrArray m_ecBlocks;
+
+ public:
+  CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks);
+  CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
+                      CBC_QRCoderECB* ecBlocks1,
+                      CBC_QRCoderECB* ecBlocks2);
+  virtual ~CBC_QRCoderECBlocks();
+  int32_t GetECCodeWordsPerBlock();
+  int32_t GetNumBlocks();
+  int32_t GetTotalECCodeWords();
+  CFX_PtrArray* GetECBlocks();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
new file mode 100644
index 0000000..0360ef0
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -0,0 +1,961 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/common/BC_CommonByteArray.h"
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h"
+#include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+
+const int32_t CBC_QRCoderEncoder::m_alphaNumbericTable[] = {
+    -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,
+    36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  44, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1};
+
+CBC_QRCoderEncoder::CBC_QRCoderEncoder() {}
+CBC_QRCoderEncoder::~CBC_QRCoderEncoder() {}
+class Make_Pair {
+ public:
+  CBC_QRCoderMode* m_mode;
+  CFX_ByteString m_string;
+
+ private:
+  Make_Pair(const Make_Pair& mode_string) {}
+  Make_Pair& operator=(Make_Pair& mode_string) {
+    if (this == &mode_string) {
+      return *this;
+    }
+    m_mode = mode_string.m_mode;
+    m_string = mode_string.m_string;
+    return *this;
+  }
+
+ public:
+  Make_Pair(CBC_QRCoderMode* mode, const CFX_ByteString& str)
+      : m_mode(mode), m_string(str) {}
+  ~Make_Pair() {}
+};
+void CBC_QRCoderEncoder::Encode(const CFX_ByteString& content,
+                                CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                CBC_QRCoder* qrCode,
+                                int32_t& e,
+                                int32_t versionSpecify) {
+  if (versionSpecify == 0) {
+    EncodeWithAutoVersion(content, ecLevel, qrCode, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e)
+  } else if (versionSpecify > 0 && versionSpecify <= 40) {
+    EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else {
+    e = BCExceptionVersionMust1_40;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) {}
+void CBC_QRCoderEncoder::AppendDataModeLenghInfo(
+    CFX_PtrArray& splitResult,
+    CBC_QRCoderBitVector& headerAndDataBits,
+    CBC_QRCoderMode* tempMode,
+    CBC_QRCoder* qrCode,
+    CFX_ByteString& encoding,
+    int32_t& e) {
+  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
+    tempMode = ((Make_Pair*)splitResult[i])->m_mode;
+    if (tempMode == CBC_QRCoderMode::sGBK) {
+      AppendModeInfo(tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
+                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
+                  &headerAndDataBits, encoding, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    } else if (tempMode == CBC_QRCoderMode::sBYTE) {
+      CFX_ByteArray bytes;
+      CBC_UtilCodingConvert::LocaleToUtf8(
+          ((Make_Pair*)splitResult[i])->m_string, bytes);
+      AppendModeInfo(tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode,
+                       &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      Append8BitBytes(bytes, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    } else if (tempMode == CBC_QRCoderMode::sALPHANUMERIC) {
+      AppendModeInfo(tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
+                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
+                  &headerAndDataBits, encoding, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    } else if (tempMode == CBC_QRCoderMode::sNUMERIC) {
+      AppendModeInfo(tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
+                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
+                  &headerAndDataBits, encoding, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    } else {
+      e = BCExceptionUnknown;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+  }
+}
+void CBC_QRCoderEncoder::SplitString(const CFX_ByteString& content,
+                                     CFX_PtrArray& result) {
+  int32_t index = 0, flag = 0;
+  while (
+      (((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
+       ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
+      (index < content.GetLength())) {
+    index += 2;
+  }
+  if (index != flag) {
+    result.Add(
+        new Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag)));
+  }
+  flag = index;
+  if (index >= content.GetLength()) {
+    return;
+  }
+  while (
+      GetAlphaNumericCode((uint8_t)content[index]) == -1 &&
+      !(((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
+        ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
+      (index < content.GetLength())) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+    if (IsDBCSLeadByte((uint8_t)content[index]))
+#else
+    if ((uint8_t)content[index] > 127)
+#endif
+    {
+      index += 2;
+    } else {
+      index++;
+    }
+  }
+  if (index != flag) {
+    result.Add(
+        new Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag)));
+  }
+  flag = index;
+  if (index >= content.GetLength()) {
+    return;
+  }
+  while (FXSYS_Isdigit((uint8_t)content[index]) &&
+         (index < content.GetLength())) {
+    index++;
+  }
+  if (index != flag) {
+    result.Add(new Make_Pair(CBC_QRCoderMode::sNUMERIC,
+                             content.Mid(flag, index - flag)));
+  }
+  flag = index;
+  if (index >= content.GetLength()) {
+    return;
+  }
+  while (GetAlphaNumericCode((uint8_t)content[index]) != -1 &&
+         (index < content.GetLength())) {
+    index++;
+  }
+  if (index != flag) {
+    result.Add(new Make_Pair(CBC_QRCoderMode::sALPHANUMERIC,
+                             content.Mid(flag, index - flag)));
+  }
+  flag = index;
+  if (index >= content.GetLength()) {
+    return;
+  }
+  SplitString(content.Mid(index, content.GetLength() - index), result);
+}
+int32_t CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode* modeFirst,
+                                             CBC_QRCoderMode* modeSecond,
+                                             int32_t versionNum,
+                                             int32_t& e) {
+  if (versionNum == 0) {
+    return 0;
+  }
+  if ((modeFirst == CBC_QRCoderMode::sALPHANUMERIC) &&
+      (modeSecond == CBC_QRCoderMode::sBYTE)) {
+    if (versionNum >= 1 && versionNum <= 9) {
+      return 11;
+    } else if (versionNum >= 10 && versionNum <= 26) {
+      return 15;
+    } else if (versionNum >= 27 && versionNum <= 40) {
+      return 16;
+    } else {
+      e = BCExceptionNoSuchVersion;
+      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    }
+  } else if ((modeSecond == CBC_QRCoderMode::sALPHANUMERIC) &&
+             (modeFirst == CBC_QRCoderMode::sNUMERIC)) {
+    if (versionNum >= 1 && versionNum <= 9) {
+      return 13;
+    } else if (versionNum >= 10 && versionNum <= 26) {
+      return 15;
+    } else if (versionNum >= 27 && versionNum <= 40) {
+      return 17;
+    } else {
+      e = BCExceptionNoSuchVersion;
+      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    }
+  } else if ((modeSecond == CBC_QRCoderMode::sBYTE) &&
+             (modeFirst == CBC_QRCoderMode::sNUMERIC)) {
+    if (versionNum >= 1 && versionNum <= 9) {
+      return 6;
+    } else if (versionNum >= 10 && versionNum <= 26) {
+      return 8;
+    } else if (versionNum >= 27 && versionNum <= 40) {
+      return 9;
+    } else {
+      e = BCExceptionNoSuchVersion;
+      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    }
+  }
+  return -1;
+}
+void CBC_QRCoderEncoder::MergeString(CFX_PtrArray& result,
+                                     int32_t versionNum,
+                                     int32_t& e) {
+  Make_Pair* first = NULL;
+  Make_Pair* second = NULL;
+  size_t mergeNum = 0;
+  int32_t i;
+  for (i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) {
+    first = (Make_Pair*)result[i];
+    second = (Make_Pair*)result[i + 1];
+    if (first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) {
+      int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC,
+                                     CBC_QRCoderMode::sBYTE, versionNum, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      if ((second->m_mode == CBC_QRCoderMode::sBYTE) &&
+          (first->m_string.GetLength() < tmp)) {
+        CFX_ByteString str = first->m_string + second->m_string;
+        second->m_string = str;
+        delete first;
+        result.RemoveAt(i);
+        i--;
+        mergeNum++;
+      }
+    } else if (first->m_mode == CBC_QRCoderMode::sBYTE) {
+      if (second->m_mode == CBC_QRCoderMode::sBYTE) {
+        first->m_string += second->m_string;
+        delete second;
+        result.RemoveAt(i + 1);
+        i--;
+        mergeNum++;
+      }
+    } else if (first->m_mode == CBC_QRCoderMode::sNUMERIC) {
+      int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
+                                     CBC_QRCoderMode::sBYTE, versionNum, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      if ((second->m_mode == CBC_QRCoderMode::sBYTE) &&
+          (first->m_string.GetLength() < tmp)) {
+        CFX_ByteString str = first->m_string + second->m_string;
+        second->m_string = str;
+        delete first;
+        result.RemoveAt(i);
+        i--;
+        mergeNum++;
+      }
+      tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
+                             CBC_QRCoderMode::sALPHANUMERIC, versionNum, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      if ((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) &&
+          (first->m_string.GetLength() < tmp)) {
+        CFX_ByteString str = first->m_string + second->m_string;
+        second->m_string = str;
+        delete first;
+        result.RemoveAt(i);
+        i--;
+        mergeNum++;
+      }
+    }
+  }
+  if (mergeNum == 0) {
+    return;
+  }
+  MergeString(result, versionNum, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderEncoder::InitQRCode(int32_t numInputBytes,
+                                    int32_t versionNumber,
+                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                    CBC_QRCoderMode* mode,
+                                    CBC_QRCoder* qrCode,
+                                    int32_t& e) {
+  qrCode->SetECLevel(ecLevel);
+  qrCode->SetMode(mode);
+  CBC_QRCoderVersion* version =
+      CBC_QRCoderVersion::GetVersionForNumber(versionNumber, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t numBytes = version->GetTotalCodeWords();
+  CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
+  int32_t numEcBytes = ecBlocks->GetTotalECCodeWords();
+  int32_t numRSBlocks = ecBlocks->GetNumBlocks();
+  int32_t numDataBytes = numBytes - numEcBytes;
+  if (numDataBytes >= numInputBytes + 3) {
+    qrCode->SetVersion(versionNumber);
+    qrCode->SetNumTotalBytes(numBytes);
+    qrCode->SetNumDataBytes(numDataBytes);
+    qrCode->SetNumRSBlocks(numRSBlocks);
+    qrCode->SetNumECBytes(numEcBytes);
+    qrCode->SetMatrixWidth(version->GetDimensionForVersion());
+    return;
+  }
+  e = BCExceptionCannotFindBlockInfo;
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(
+    const CFX_ByteString& content,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    CBC_QRCoder* qrCode,
+    int32_t versionSpecify,
+    int32_t& e) {
+  CFX_ByteString encoding = "utf8";
+  CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
+  CFX_PtrArray splitResult;
+  CBC_QRCoderBitVector dataBits;
+  dataBits.Init();
+  SplitString(content, splitResult);
+  MergeString(splitResult, versionSpecify, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderMode* tempMode = NULL;
+  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
+    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
+                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
+    if (e != BCExceptionNO) {
+      for (int32_t y = 0; y < splitResult.GetSize(); y++) {
+        delete (Make_Pair*)splitResult[y];
+      }
+      splitResult.RemoveAll();
+      return;
+    }
+  }
+  int32_t numInputBytes = dataBits.sizeInBytes();
+  CBC_QRCoderBitVector headerAndDataBits;
+  headerAndDataBits.Init();
+  InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e);
+  if (e != BCExceptionNO) {
+    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
+      delete (Make_Pair*)splitResult[k];
+    }
+    splitResult.RemoveAll();
+    return;
+  }
+  AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
+                          encoding, e);
+  if (e != BCExceptionNO) {
+    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
+      delete (Make_Pair*)splitResult[k];
+    }
+    splitResult.RemoveAll();
+    return;
+  }
+  numInputBytes = headerAndDataBits.sizeInBytes();
+  TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
+  if (e != BCExceptionNO) {
+    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
+      delete (Make_Pair*)splitResult[k];
+    }
+    splitResult.RemoveAll();
+    return;
+  }
+  for (int32_t j = 0; j < splitResult.GetSize(); j++) {
+    delete (Make_Pair*)splitResult[j];
+  }
+  splitResult.RemoveAll();
+  CBC_QRCoderBitVector finalBits;
+  finalBits.Init();
+  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
+                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
+                        &finalBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  matrix->Init();
+  int32_t maskPattern = ChooseMaskPattern(
+      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  qrCode->SetMaskPattern(maskPattern);
+  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
+                                     qrCode->GetVersion(),
+                                     qrCode->GetMaskPattern(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  qrCode->SetMatrix(matrix.release());
+  if (!qrCode->IsValid()) {
+    e = BCExceptionInvalidQRCode;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::EncodeWithAutoVersion(
+    const CFX_ByteString& content,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    CBC_QRCoder* qrCode,
+    int32_t& e) {
+  CFX_ByteString encoding = "utf8";
+  CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
+  CFX_PtrArray splitResult;
+  CBC_QRCoderBitVector dataBits;
+  dataBits.Init();
+  SplitString(content, splitResult);
+  MergeString(splitResult, 8, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CBC_QRCoderMode* tempMode = NULL;
+  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
+    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
+                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
+    if (e != BCExceptionNO) {
+      for (int32_t l = 0; l < splitResult.GetSize(); l++) {
+        delete (Make_Pair*)splitResult[l];
+      }
+      splitResult.RemoveAll();
+      return;
+    }
+  }
+  int32_t numInputBytes = dataBits.sizeInBytes();
+  InitQRCode(numInputBytes, ecLevel, mode, qrCode, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderBitVector headerAndDataBits;
+  headerAndDataBits.Init();
+  tempMode = NULL;
+  int32_t versionNum = qrCode->GetVersion();
+sign:
+  AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
+                          encoding, e);
+  if (e != BCExceptionNO) {
+    goto catchException;
+  }
+  numInputBytes = headerAndDataBits.sizeInBytes();
+  TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
+  if (e != BCExceptionNO) {
+    goto catchException;
+  }
+catchException:
+  if (e != BCExceptionNO) {
+    int32_t e1 = BCExceptionNO;
+    InitQRCode(numInputBytes, ecLevel, mode, qrCode, e1);
+    if (e1 != BCExceptionNO) {
+      e = e1;
+      return;
+    }
+    versionNum++;
+    if (versionNum <= 40) {
+      headerAndDataBits.Clear();
+      e = BCExceptionNO;
+      goto sign;
+    } else {
+      for (int32_t j = 0; j < splitResult.GetSize(); j++) {
+        delete (Make_Pair*)splitResult[j];
+      }
+      splitResult.RemoveAll();
+      return;
+    }
+  }
+  for (int32_t k = 0; k < splitResult.GetSize(); k++) {
+    delete (Make_Pair*)splitResult[k];
+  }
+  splitResult.RemoveAll();
+  CBC_QRCoderBitVector finalBits;
+  finalBits.Init();
+  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
+                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
+                        &finalBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  matrix->Init();
+  int32_t maskPattern = ChooseMaskPattern(
+      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  qrCode->SetMaskPattern(maskPattern);
+  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
+                                     qrCode->GetVersion(),
+                                     qrCode->GetMaskPattern(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release());
+  if (!qrCode->IsValid()) {
+    e = BCExceptionInvalidQRCode;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::Encode(const CFX_WideString& content,
+                                CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                CBC_QRCoder* qrCode,
+                                int32_t& e) {
+  CFX_ByteString encoding = "utf8";
+  CFX_ByteString utf8Data;
+  CBC_UtilCodingConvert::UnicodeToUTF8(content, utf8Data);
+  CBC_QRCoderMode* mode = ChooseMode(utf8Data, encoding);
+  CBC_QRCoderBitVector dataBits;
+  dataBits.Init();
+  AppendBytes(utf8Data, mode, &dataBits, encoding, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t numInputBytes = dataBits.sizeInBytes();
+  InitQRCode(numInputBytes, ecLevel, mode, qrCode, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CBC_QRCoderBitVector headerAndDataBits;
+  headerAndDataBits.Init();
+  AppendModeInfo(mode, &headerAndDataBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t numLetters = mode == CBC_QRCoderMode::sBYTE ? dataBits.sizeInBytes()
+                                                      : content.GetLength();
+  AppendLengthInfo(numLetters, qrCode->GetVersion(), mode, &headerAndDataBits,
+                   e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  headerAndDataBits.AppendBitVector(&dataBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e)
+      TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  CBC_QRCoderBitVector finalBits;
+  finalBits.Init();
+  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
+                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
+                        &finalBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
+      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
+  matrix->Init();
+  int32_t maskPattern = ChooseMaskPattern(
+      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  qrCode->SetMaskPattern(maskPattern);
+  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
+                                     qrCode->GetVersion(),
+                                     qrCode->GetMaskPattern(), matrix.get(), e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release());
+  if (!qrCode->IsValid()) {
+    e = BCExceptionInvalidQRCode;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::TerminateBits(int32_t numDataBytes,
+                                       CBC_QRCoderBitVector* bits,
+                                       int32_t& e) {
+  int32_t capacity = numDataBytes << 3;
+  if (bits->Size() > capacity) {
+    e = BCExceptionDataTooMany;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t i = 0; i < 4 && bits->Size() < capacity; ++i) {
+    bits->AppendBit(0, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t numBitsInLastByte = bits->Size() % 8;
+  if (numBitsInLastByte > 0) {
+    int32_t numPaddingBits = 8 - numBitsInLastByte;
+    for (int32_t j = 0; j < numPaddingBits; ++j) {
+      bits->AppendBit(0, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e)
+    }
+  }
+  if (bits->Size() % 8 != 0) {
+    e = BCExceptionDigitLengthMustBe8;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t numPaddingBytes = numDataBytes - bits->sizeInBytes();
+  for (int32_t k = 0; k < numPaddingBytes; ++k) {
+    if (k % 2 == 0) {
+      bits->AppendBits(0xec, 8, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    } else {
+      bits->AppendBits(0x11, 8, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+  }
+  if (bits->Size() != capacity) {
+    e = BCExceptionBitsNotEqualCacity;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+int32_t CBC_QRCoderEncoder::ChooseMaskPattern(
+    CBC_QRCoderBitVector* bits,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t version,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  int32_t minPenalty = 65535;
+  int32_t bestMaskPattern = -1;
+  for (int32_t maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS;
+       maskPattern++) {
+    CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern,
+                                       matrix, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    int32_t penalty = CalculateMaskPenalty(matrix);
+    if (penalty < minPenalty) {
+      minPenalty = penalty;
+      bestMaskPattern = maskPattern;
+    }
+  }
+  return bestMaskPattern;
+}
+int32_t CBC_QRCoderEncoder::CalculateMaskPenalty(CBC_CommonByteMatrix* matrix) {
+  int32_t penalty = 0;
+  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(matrix);
+  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(matrix);
+  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(matrix);
+  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(matrix);
+  return penalty;
+}
+CBC_QRCoderMode* CBC_QRCoderEncoder::ChooseMode(const CFX_ByteString& content,
+                                                CFX_ByteString encoding) {
+  if (encoding.Compare("SHIFT_JIS") == 0) {
+    return CBC_QRCoderMode::sKANJI;
+  }
+  FX_BOOL hasNumeric = FALSE;
+  FX_BOOL hasAlphaNumeric = FALSE;
+  for (int32_t i = 0; i < content.GetLength(); i++) {
+    if (isdigit((uint8_t)content[i])) {
+      hasNumeric = TRUE;
+    } else if (GetAlphaNumericCode((uint8_t)content[i]) != -1) {
+      hasAlphaNumeric = TRUE;
+    } else {
+      return CBC_QRCoderMode::sBYTE;
+    }
+  }
+  if (hasAlphaNumeric) {
+    return CBC_QRCoderMode::sALPHANUMERIC;
+  } else if (hasNumeric) {
+    return CBC_QRCoderMode::sNUMERIC;
+  }
+  return CBC_QRCoderMode::sBYTE;
+}
+int32_t CBC_QRCoderEncoder::GetAlphaNumericCode(int32_t code) {
+  if (code < 96 && code >= 0) {
+    return m_alphaNumbericTable[code];
+  }
+  return -1;
+}
+void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString& content,
+                                     CBC_QRCoderMode* mode,
+                                     CBC_QRCoderBitVector* bits,
+                                     CFX_ByteString encoding,
+                                     int32_t& e) {
+  if (mode == CBC_QRCoderMode::sNUMERIC) {
+    AppendNumericBytes(content, bits, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else if (mode == CBC_QRCoderMode::sALPHANUMERIC) {
+    AppendAlphaNumericBytes(content, bits, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else if (mode == CBC_QRCoderMode::sBYTE) {
+    Append8BitBytes(content, bits, encoding, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else if (mode == CBC_QRCoderMode::sKANJI) {
+    AppendKanjiBytes(content, bits, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else if (mode == CBC_QRCoderMode::sGBK) {
+    AppendGBKBytes(content, bits, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  } else {
+    e = BCExceptionUnsupportedMode;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::AppendNumericBytes(const CFX_ByteString& content,
+                                            CBC_QRCoderBitVector* bits,
+                                            int32_t& e) {
+  int32_t length = content.GetLength();
+  int32_t i = 0;
+  while (i < length) {
+    int32_t num1 = content[i] - '0';
+    if (i + 2 < length) {
+      int32_t num2 = content[i + 1] - '0';
+      int32_t num3 = content[i + 2] - '0';
+      bits->AppendBits(num1 * 100 + num2 * 10 + num3, 10, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e) i += 3;
+    } else if (i + 1 < length) {
+      int32_t num2 = content[i + 1] - '0';
+      bits->AppendBits(num1 * 10 + num2, 7, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e) i += 2;
+    } else {
+      bits->AppendBits(num1, 4, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      i++;
+    }
+  }
+}
+void CBC_QRCoderEncoder::AppendAlphaNumericBytes(const CFX_ByteString& content,
+                                                 CBC_QRCoderBitVector* bits,
+                                                 int32_t& e) {
+  int32_t length = content.GetLength();
+  int32_t i = 0;
+  while (i < length) {
+    int32_t code1 = GetAlphaNumericCode(content[i]);
+    if (code1 == -1) {
+      e = BCExceptionInvalidateCharacter;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    if (i + 1 < length) {
+      int32_t code2 = GetAlphaNumericCode(content[i + 1]);
+      if (code2 == -1) {
+        e = BCExceptionInvalidateCharacter;
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+      bits->AppendBits(code1 * 45 + code2, 11, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      i += 2;
+    } else {
+      bits->AppendBits(code1, 6, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e) i++;
+    }
+  }
+}
+void CBC_QRCoderEncoder::AppendGBKBytes(const CFX_ByteString& content,
+                                        CBC_QRCoderBitVector* bits,
+                                        int32_t& e) {
+  int32_t length = content.GetLength();
+  FX_DWORD value = 0;
+  for (int32_t i = 0; i < length; i += 2) {
+    value = (FX_DWORD)((uint8_t)content[i] << 8 | (uint8_t)content[i + 1]);
+    if (value <= 0xAAFE && value >= 0xA1A1) {
+      value -= 0xA1A1;
+    } else if (value <= 0xFAFE && value >= 0xB0A1) {
+      value -= 0xA6A1;
+    } else {
+      e = BCExceptionInvalidateCharacter;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    value = (FX_DWORD)((value >> 8) * 0x60) + (FX_DWORD)(value & 0xff);
+    bits->AppendBits(value, 13, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::Append8BitBytes(const CFX_ByteString& content,
+                                         CBC_QRCoderBitVector* bits,
+                                         CFX_ByteString encoding,
+                                         int32_t& e) {
+  for (int32_t i = 0; i < content.GetLength(); i++) {
+    bits->AppendBits(content[i], 8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray& bytes,
+                                         CBC_QRCoderBitVector* bits,
+                                         int32_t& e) {
+  for (int32_t i = 0; i < bytes.GetSize(); i++) {
+    bits->AppendBits(bytes[i], 8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString& content,
+                                          CBC_QRCoderBitVector* bits,
+                                          int32_t& e) {
+  CFX_ByteArray bytes;
+  FX_DWORD value = 0;
+  for (int32_t i = 0; i < bytes.GetSize(); i += 2) {
+    value = (FX_DWORD)((uint8_t)(content[i] << 8) | (uint8_t)content[i + 1]);
+    if (value <= 0x9ffc && value >= 0x8140) {
+      value -= 0x8140;
+    } else if (value <= 0xebbf && value >= 0xe040) {
+      value -= 0xc140;
+    } else {
+      e = BCExceptionInvalidateCharacter;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    value = (FX_DWORD)((value >> 8) * 0xc0) + (FX_DWORD)(value & 0xff);
+    bits->AppendBits(value, 13, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::InitQRCode(int32_t numInputBytes,
+                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                    CBC_QRCoderMode* mode,
+                                    CBC_QRCoder* qrCode,
+                                    int32_t& e) {
+  qrCode->SetECLevel(ecLevel);
+  qrCode->SetMode(mode);
+  for (int32_t versionNum = 1; versionNum <= 40; versionNum++) {
+    CBC_QRCoderVersion* version =
+        CBC_QRCoderVersion::GetVersionForNumber(versionNum, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    int32_t numBytes = version->GetTotalCodeWords();
+    CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
+    int32_t numEcBytes = ecBlocks->GetTotalECCodeWords();
+    int32_t numRSBlocks = ecBlocks->GetNumBlocks();
+    int32_t numDataBytes = numBytes - numEcBytes;
+    if (numDataBytes >= numInputBytes + 3) {
+      qrCode->SetVersion(versionNum);
+      qrCode->SetNumTotalBytes(numBytes);
+      qrCode->SetNumDataBytes(numDataBytes);
+      qrCode->SetNumRSBlocks(numRSBlocks);
+      qrCode->SetNumECBytes(numEcBytes);
+      qrCode->SetMatrixWidth(version->GetDimensionForVersion());
+      return;
+    }
+  }
+  e = BCExceptionCannotFindBlockInfo;
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderEncoder::AppendModeInfo(CBC_QRCoderMode* mode,
+                                        CBC_QRCoderBitVector* bits,
+                                        int32_t& e) {
+  bits->AppendBits(mode->GetBits(), 4, e);
+  if (mode == CBC_QRCoderMode::sGBK) {
+    bits->AppendBits(1, 4, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::AppendLengthInfo(int32_t numLetters,
+                                          int32_t version,
+                                          CBC_QRCoderMode* mode,
+                                          CBC_QRCoderBitVector* bits,
+                                          int32_t& e) {
+  CBC_QRCoderVersion* qcv = CBC_QRCoderVersion::GetVersionForNumber(version, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t numBits = mode->GetCharacterCountBits(qcv, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  if (numBits > ((1 << numBits) - 1)) {
+    return;
+  }
+  if (mode == CBC_QRCoderMode::sGBK) {
+    bits->AppendBits(numLetters / 2, numBits, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  bits->AppendBits(numLetters, numBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderEncoder::InterleaveWithECBytes(CBC_QRCoderBitVector* bits,
+                                               int32_t numTotalBytes,
+                                               int32_t numDataBytes,
+                                               int32_t numRSBlocks,
+                                               CBC_QRCoderBitVector* result,
+                                               int32_t& e) {
+  if (bits->sizeInBytes() != numDataBytes) {
+    e = BCExceptionBitsBytesNotMatch;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t dataBytesOffset = 0;
+  int32_t maxNumDataBytes = 0;
+  int32_t maxNumEcBytes = 0;
+  CFX_PtrArray blocks;
+  int32_t i;
+  for (i = 0; i < numRSBlocks; i++) {
+    int32_t numDataBytesInBlock;
+    int32_t numEcBytesInBlosk;
+    GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes,
+                                           numRSBlocks, i, numDataBytesInBlock,
+                                           numEcBytesInBlosk);
+    CBC_CommonByteArray* dataBytes = new CBC_CommonByteArray;
+    dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock);
+    CBC_CommonByteArray* ecBytes =
+        GenerateECBytes(dataBytes, numEcBytesInBlosk, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    blocks.Add(new CBC_QRCoderBlockPair(dataBytes, ecBytes));
+    maxNumDataBytes = std::max(maxNumDataBytes, dataBytes->Size());
+    maxNumEcBytes = std::max(maxNumEcBytes, ecBytes->Size());
+    dataBytesOffset += numDataBytesInBlock;
+  }
+  if (numDataBytes != dataBytesOffset) {
+    e = BCExceptionBytesNotMatchOffset;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t x = 0; x < maxNumDataBytes; x++) {
+    for (int32_t j = 0; j < blocks.GetSize(); j++) {
+      CBC_CommonByteArray* dataBytes =
+          ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes();
+      if (x < dataBytes->Size()) {
+        result->AppendBits(dataBytes->At(x), 8, e);
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+    }
+  }
+  for (int32_t y = 0; y < maxNumEcBytes; y++) {
+    for (int32_t l = 0; l < blocks.GetSize(); l++) {
+      CBC_CommonByteArray* ecBytes =
+          ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes();
+      if (y < ecBytes->Size()) {
+        result->AppendBits(ecBytes->At(y), 8, e);
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+    }
+  }
+  for (int32_t k = 0; k < blocks.GetSize(); k++) {
+    delete (CBC_QRCoderBlockPair*)blocks[k];
+  }
+  if (numTotalBytes != result->sizeInBytes()) {
+    e = BCExceptionSizeInBytesDiffer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderEncoder::GetNumDataBytesAndNumECBytesForBlockID(
+    int32_t numTotalBytes,
+    int32_t numDataBytes,
+    int32_t numRSBlocks,
+    int32_t blockID,
+    int32_t& numDataBytesInBlock,
+    int32_t& numECBytesInBlock) {
+  if (blockID >= numRSBlocks) {
+    return;
+  }
+  int32_t numRsBlocksInGroup2 = numTotalBytes % numRSBlocks;
+  int32_t numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2;
+  int32_t numTotalBytesInGroup1 = numTotalBytes / numRSBlocks;
+  int32_t numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1;
+  int32_t numDataBytesInGroup1 = numDataBytes / numRSBlocks;
+  int32_t numDataBytesInGroup2 = numDataBytesInGroup1 + 1;
+  int32_t numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1;
+  int32_t numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2;
+  if (blockID < numRsBlocksInGroup1) {
+    numDataBytesInBlock = numDataBytesInGroup1;
+    numECBytesInBlock = numEcBytesInGroup1;
+  } else {
+    numDataBytesInBlock = numDataBytesInGroup2;
+    numECBytesInBlock = numEcBytesInGroup2;
+  }
+}
+CBC_CommonByteArray* CBC_QRCoderEncoder::GenerateECBytes(
+    CBC_CommonByteArray* dataBytes,
+    int32_t numEcBytesInBlock,
+    int32_t& e) {
+  int32_t numDataBytes = dataBytes->Size();
+  CFX_Int32Array toEncode;
+  toEncode.SetSize(numDataBytes + numEcBytesInBlock);
+  for (int32_t i = 0; i < numDataBytes; i++) {
+    toEncode[i] = (dataBytes->At(i));
+  }
+  CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild);
+  encode.Init();
+  encode.Encode(&toEncode, numEcBytesInBlock, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock);
+  for (int32_t j = 0; j < numEcBytesInBlock; j++) {
+    ecBytes->Set(j, toEncode[numDataBytes + j]);
+  }
+  return ecBytes;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
new file mode 100644
index 0000000..8330dc2
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
@@ -0,0 +1,133 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_QRCoder;
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_QRCoderMode;
+class CBC_QRCoderBitVector;
+class CBC_CommonByteArray;
+class CBC_CommonByteMatrix;
+
+class CBC_QRCoderEncoder {
+ private:
+  static const int32_t m_alphaNumbericTable[96];
+
+ public:
+  CBC_QRCoderEncoder();
+  virtual ~CBC_QRCoderEncoder();
+
+  static void Encode(const CFX_ByteString& content,
+                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                     CBC_QRCoder* qrCode,
+                     int32_t& e,
+                     int32_t versionSpecify = 0);
+  static void Encode(const CFX_WideString& content,
+                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                     CBC_QRCoder* qrCode,
+                     int32_t& e);
+  static void EncodeWithSpecifyVersion(const CFX_ByteString& content,
+                                       CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                       CBC_QRCoder* qrCode,
+                                       int32_t versionSpecify,
+                                       int32_t& e);
+  static void EncodeWithAutoVersion(const CFX_ByteString& content,
+                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                    CBC_QRCoder* qrCode,
+                                    int32_t& e);
+  static CBC_QRCoderMode* ChooseMode(const CFX_ByteString& content,
+                                     CFX_ByteString encoding);
+  static int32_t GetAlphaNumericCode(int32_t code);
+  static void AppendECI(CBC_QRCoderBitVector* bits);
+  static void AppendBytes(const CFX_ByteString& content,
+                          CBC_QRCoderMode* mode,
+                          CBC_QRCoderBitVector* bits,
+                          CFX_ByteString encoding,
+                          int32_t& e);
+  static void AppendNumericBytes(const CFX_ByteString& content,
+                                 CBC_QRCoderBitVector* bits,
+                                 int32_t& e);
+  static void AppendAlphaNumericBytes(const CFX_ByteString& content,
+                                      CBC_QRCoderBitVector* bits,
+                                      int32_t& e);
+  static void Append8BitBytes(const CFX_ByteString& content,
+                              CBC_QRCoderBitVector* bits,
+                              CFX_ByteString encoding,
+                              int32_t& e);
+  static void Append8BitBytes(CFX_ByteArray& bytes,
+                              CBC_QRCoderBitVector* bits,
+                              int32_t& e);
+  static void AppendKanjiBytes(const CFX_ByteString& content,
+                               CBC_QRCoderBitVector* bits,
+                               int32_t& e);
+  static void AppendGBKBytes(const CFX_ByteString& content,
+                             CBC_QRCoderBitVector* bits,
+                             int32_t& e);
+  static void InitQRCode(int32_t numInputBytes,
+                         int32_t versionNumber,
+                         CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                         CBC_QRCoderMode* mode,
+                         CBC_QRCoder* qrCode,
+                         int32_t& e);
+  static void InitQRCode(int32_t numInputBytes,
+                         CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                         CBC_QRCoderMode* mode,
+                         CBC_QRCoder* qrCode,
+                         int32_t& e);
+  static void AppendModeInfo(CBC_QRCoderMode* mode,
+                             CBC_QRCoderBitVector* bits,
+                             int32_t& e);
+  static void AppendLengthInfo(int32_t numLetters,
+                               int32_t version,
+                               CBC_QRCoderMode* mode,
+                               CBC_QRCoderBitVector* bits,
+                               int32_t& e);
+
+  static void InterleaveWithECBytes(CBC_QRCoderBitVector* bits,
+                                    int32_t numTotalBytes,
+                                    int32_t numDataBytes,
+                                    int32_t numRSBlocks,
+                                    CBC_QRCoderBitVector* result,
+                                    int32_t& e);
+  static void GetNumDataBytesAndNumECBytesForBlockID(
+      int32_t numTotalBytes,
+      int32_t numDataBytes,
+      int32_t numRSBlocks,
+      int32_t blockID,
+      int32_t& numDataBytesInBlock,
+      int32_t& numECBytesInBlocks);
+  static CBC_CommonByteArray* GenerateECBytes(CBC_CommonByteArray* dataBytes,
+                                              int32_t numEcBytesInBlock,
+                                              int32_t& e);
+  static int32_t ChooseMaskPattern(CBC_QRCoderBitVector* bits,
+                                   CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                   int32_t version,
+                                   CBC_CommonByteMatrix* matrix,
+                                   int32_t& e);
+  static int32_t CalculateMaskPenalty(CBC_CommonByteMatrix* matrix);
+  static void TerminateBits(int32_t numDataBytes,
+                            CBC_QRCoderBitVector* bits,
+                            int32_t& e);
+  static int32_t GetSpanByVersion(CBC_QRCoderMode* modeFirst,
+                                  CBC_QRCoderMode* modeSecond,
+                                  int32_t versionNum,
+                                  int32_t& e);
+  static void MergeString(CFX_PtrArray& result, int32_t versionNum, int32_t& e);
+  static void SplitString(const CFX_ByteString& content, CFX_PtrArray& result);
+  static void AppendDataModeLenghInfo(CFX_PtrArray& splitResult,
+                                      CBC_QRCoderBitVector& headerAndDataBits,
+                                      CBC_QRCoderMode* tempMode,
+                                      CBC_QRCoder* qrCode,
+                                      CFX_ByteString& encoding,
+                                      int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp
new file mode 100644
index 0000000..a1ce747
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::L = NULL;
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::M = NULL;
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::Q = NULL;
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::H = NULL;
+
+CBC_QRCoderErrorCorrectionLevel::CBC_QRCoderErrorCorrectionLevel(
+    int32_t ordinal,
+    int32_t bits,
+    FX_CHAR* name) {
+  m_name += name;
+  m_ordinal = ordinal;
+  m_bits = bits;
+}
+CBC_QRCoderErrorCorrectionLevel::~CBC_QRCoderErrorCorrectionLevel() {}
+void CBC_QRCoderErrorCorrectionLevel::Initialize() {
+  L = new CBC_QRCoderErrorCorrectionLevel(0, 0x01, (FX_CHAR*)"L");
+  M = new CBC_QRCoderErrorCorrectionLevel(1, 0x00, (FX_CHAR*)"M");
+  Q = new CBC_QRCoderErrorCorrectionLevel(2, 0x03, (FX_CHAR*)"Q");
+  H = new CBC_QRCoderErrorCorrectionLevel(3, 0x02, (FX_CHAR*)"H");
+}
+void CBC_QRCoderErrorCorrectionLevel::Finalize() {
+  delete L;
+  delete M;
+  delete Q;
+  delete H;
+}
+int32_t CBC_QRCoderErrorCorrectionLevel::Ordinal() {
+  return m_ordinal;
+}
+int32_t CBC_QRCoderErrorCorrectionLevel::GetBits() {
+  return m_bits;
+}
+CFX_ByteString CBC_QRCoderErrorCorrectionLevel::GetName() {
+  return m_name;
+}
+CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::ForBits(
+    int32_t bits) {
+  switch (bits) {
+    case 0x00:
+      return M;
+    case 0x01:
+      return L;
+    case 0x02:
+      return H;
+    case 0x03:
+      return Q;
+    default:
+      return NULL;
+  }
+}
+void CBC_QRCoderErrorCorrectionLevel::Destroy() {
+  if (L) {
+    delete CBC_QRCoderErrorCorrectionLevel::L;
+    L = NULL;
+  }
+  if (M) {
+    delete CBC_QRCoderErrorCorrectionLevel::M;
+    M = NULL;
+  }
+  if (H) {
+    delete CBC_QRCoderErrorCorrectionLevel::H;
+    H = NULL;
+  }
+  if (Q) {
+    delete CBC_QRCoderErrorCorrectionLevel::Q;
+    Q = NULL;
+  }
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h b/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h
new file mode 100644
index 0000000..377137a
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
+
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_QRCoderErrorCorrectionLevel {
+ private:
+  int32_t m_ordinal;
+  int32_t m_bits;
+  CFX_ByteString m_name;
+  CBC_QRCoderErrorCorrectionLevel(int32_t ordinal, int32_t bits, FX_CHAR* name);
+  CBC_QRCoderErrorCorrectionLevel();
+
+ public:
+  static CBC_QRCoderErrorCorrectionLevel* L;
+  static CBC_QRCoderErrorCorrectionLevel* M;
+  static CBC_QRCoderErrorCorrectionLevel* Q;
+  static CBC_QRCoderErrorCorrectionLevel* H;
+  virtual ~CBC_QRCoderErrorCorrectionLevel();
+  static void Initialize();
+  static void Finalize();
+  int32_t Ordinal();
+  int32_t GetBits();
+  CFX_ByteString GetName();
+  static void Destroy();
+  static CBC_QRCoderErrorCorrectionLevel* ForBits(int32_t bits);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp
new file mode 100644
index 0000000..da647a9
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp
@@ -0,0 +1,95 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_QRCoderFormatInformation::FORMAT_INFO_MASK_QR = 0X5412;
+const int32_t CBC_QRCoderFormatInformation::FORMAT_INFO_DECODE_LOOKUP[32][2] = {
+    {0x5412, 0x00}, {0x5125, 0x01}, {0x5E7C, 0x02}, {0x5B4B, 0x03},
+    {0x45F9, 0x04}, {0x40CE, 0x05}, {0x4F97, 0x06}, {0x4AA0, 0x07},
+    {0x77C4, 0x08}, {0x72F3, 0x09}, {0x7DAA, 0x0A}, {0x789D, 0x0B},
+    {0x662F, 0x0C}, {0x6318, 0x0D}, {0x6C41, 0x0E}, {0x6976, 0x0F},
+    {0x1689, 0x10}, {0x13BE, 0x11}, {0x1CE7, 0x12}, {0x19D0, 0x13},
+    {0x0762, 0x14}, {0x0255, 0x15}, {0x0D0C, 0x16}, {0x083B, 0x17},
+    {0x355F, 0x18}, {0x3068, 0x19}, {0x3F31, 0x1A}, {0x3A06, 0x1B},
+    {0x24B4, 0x1C}, {0x2183, 0x1D}, {0x2EDA, 0x1E}, {0x2BED, 0x1F},
+};
+const int32_t CBC_QRCoderFormatInformation::BITS_SET_IN_HALF_BYTE[] = {
+    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
+
+CBC_QRCoderFormatInformation::CBC_QRCoderFormatInformation(int32_t formatInfo) {
+  m_errorCorrectLevl =
+      CBC_QRCoderErrorCorrectionLevel::ForBits((formatInfo >> 3) & 0x03);
+  m_dataMask = (uint8_t)(formatInfo & 0x07);
+}
+CBC_QRCoderFormatInformation::~CBC_QRCoderFormatInformation() {}
+int32_t CBC_QRCoderFormatInformation::NumBitsDiffering(int32_t a, int32_t b) {
+  a ^= b;
+  return BITS_SET_IN_HALF_BYTE[a & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] +
+         BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F];
+}
+uint8_t CBC_QRCoderFormatInformation::GetDataMask() {
+  return m_dataMask;
+}
+CBC_QRCoderErrorCorrectionLevel*
+CBC_QRCoderFormatInformation::GetErrorCorrectionLevel() {
+  return m_errorCorrectLevl;
+}
+CBC_QRCoderFormatInformation*
+CBC_QRCoderFormatInformation::DecodeFormatInformation(
+    int32_t maskedFormatInfo) {
+  CBC_QRCoderFormatInformation* formatInfo =
+      DoDecodeFormatInformation(maskedFormatInfo);
+  if (formatInfo)
+    return formatInfo;
+  return DoDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR);
+}
+CBC_QRCoderFormatInformation*
+CBC_QRCoderFormatInformation::DoDecodeFormatInformation(
+    int32_t maskedFormatInfo) {
+  int32_t bestDifference = (int32_t)FXSYS_nan();
+  int32_t bestFormatInfo = 0;
+  for (int32_t i = 0; i < 32; i++) {
+    int32_t const* decodeInfo = &FORMAT_INFO_DECODE_LOOKUP[i][0];
+    int32_t targetInfo = decodeInfo[0];
+    if (targetInfo == maskedFormatInfo) {
+      return new CBC_QRCoderFormatInformation(decodeInfo[1]);
+    }
+    int32_t bitsDifference = NumBitsDiffering(maskedFormatInfo, targetInfo);
+    if (bitsDifference < bestDifference) {
+      bestFormatInfo = decodeInfo[1];
+      bestDifference = bitsDifference;
+    }
+  }
+  if (bestDifference <= 3) {
+    return new CBC_QRCoderFormatInformation(bestFormatInfo);
+  }
+  return NULL;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h b/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h
new file mode 100644
index 0000000..8f15901
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
+
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_QRCoderFormatInformation {
+ private:
+  static const int32_t FORMAT_INFO_MASK_QR;
+  static const int32_t FORMAT_INFO_DECODE_LOOKUP[32][2];
+  static const int32_t BITS_SET_IN_HALF_BYTE[16];
+  CBC_QRCoderErrorCorrectionLevel* m_errorCorrectLevl;
+  uint8_t m_dataMask;
+
+ public:
+  CBC_QRCoderFormatInformation(int32_t formatInfo);
+  virtual ~CBC_QRCoderFormatInformation();
+  uint8_t GetDataMask();
+  CBC_QRCoderErrorCorrectionLevel* GetErrorCorrectionLevel();
+
+  static int32_t NumBitsDiffering(int32_t a, int32_t b);
+  static CBC_QRCoderFormatInformation* DecodeFormatInformation(
+      int32_t maskedFormatInfo);
+  static CBC_QRCoderFormatInformation* DoDecodeFormatInformation(
+      int32_t maskedFormatInfo);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp
new file mode 100644
index 0000000..4d845c4
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp
@@ -0,0 +1,198 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRCoderMaskUtil::CBC_QRCoderMaskUtil() {}
+CBC_QRCoderMaskUtil::~CBC_QRCoderMaskUtil() {}
+int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(
+    CBC_CommonByteMatrix* matrix) {
+  return ApplyMaskPenaltyRule1Internal(matrix, TRUE) +
+         ApplyMaskPenaltyRule1Internal(matrix, FALSE);
+}
+
+int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(
+    CBC_CommonByteMatrix* matrix) {
+  int32_t penalty = 0;
+  uint8_t* array = matrix->GetArray();
+  int32_t width = matrix->GetWidth();
+  int32_t height = matrix->GetHeight();
+  for (int32_t y = 0; y < height - 1; y++) {
+    for (int32_t x = 0; x < width - 1; x++) {
+      int32_t value = array[y * width + x];
+      if (value == array[y * width + x + 1] &&
+          value == array[(y + 1) * width + x] &&
+          value == array[(y + 1) * width + x + 1]) {
+        penalty++;
+      }
+    }
+  }
+  return 3 * penalty;
+}
+
+int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(
+    CBC_CommonByteMatrix* matrix) {
+  int32_t penalty = 0;
+  uint8_t* array = matrix->GetArray();
+  int32_t width = matrix->GetWidth();
+  int32_t height = matrix->GetHeight();
+  for (int32_t y = 0; y < height; ++y) {
+    for (int32_t x = 0; x < width; ++x) {
+      if (x == 0 &&
+          ((y >= 0 && y <= 6) || (y >= height - 7 && y <= height - 1))) {
+        continue;
+      }
+      if (x == width - 7 && (y >= 0 && y <= 6)) {
+        continue;
+      }
+      if (y == 0 &&
+          ((x >= 0 && x <= 6) || (x >= width - 7 && x <= width - 1))) {
+        continue;
+      }
+      if (y == height - 7 && (x >= 0 && x <= 6)) {
+        continue;
+      }
+      if (x + 6 < width && array[y * width + x] == 1 &&
+          array[y * width + x + 1] == 0 && array[y * width + x + 2] == 1 &&
+          array[y * width + x + 3] == 1 && array[y * width + x + 4] == 1 &&
+          array[y * width + x + 5] == 0 && array[y * width + x + 6] == 1 &&
+          ((x + 10 < width && array[y * width + x + 7] == 0 &&
+            array[y * width + x + 8] == 0 && array[y * width + x + 9] == 0 &&
+            array[y * width + x + 10] == 0) ||
+           (x - 4 >= 0 && array[y * width + x - 1] == 0 &&
+            array[y * width + x - 2] == 0 && array[y * width + x - 3] == 0 &&
+            array[y * width + x - 4] == 0))) {
+        penalty += 40;
+      }
+      if (y + 6 < height && array[y * width + x] == 1 &&
+          array[(y + 1) * width + x] == 0 && array[(y + 2) * width + x] == 1 &&
+          array[(y + 3) * width + x] == 1 && array[(y + 4) * width + x] == 1 &&
+          array[(y + 5) * width + x] == 0 && array[(y + 6) * width + x] == 1 &&
+          ((y + 10 < height && array[(y + 7) * width + x] == 0 &&
+            array[(y + 8) * width + x] == 0 &&
+            array[(y + 9) * width + x] == 0 &&
+            array[(y + 10) * width + x] == 0) ||
+           (y - 4 >= 0 && array[(y - 1) * width + x] == 0 &&
+            array[(y - 2) * width + x] == 0 &&
+            array[(y - 3) * width + x] == 0 &&
+            array[(y - 4) * width + x] == 0))) {
+        penalty += 40;
+      }
+    }
+  }
+  return penalty;
+}
+int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(
+    CBC_CommonByteMatrix* matrix) {
+  int32_t numDarkCells = 0;
+  uint8_t* array = matrix->GetArray();
+  int32_t width = matrix->GetWidth();
+  int32_t height = matrix->GetHeight();
+  for (int32_t y = 0; y < height; ++y) {
+    for (int32_t x = 0; x < width; ++x) {
+      if (array[y * width + x] == 1) {
+        numDarkCells += 1;
+      }
+    }
+  }
+  int32_t numTotalCells = matrix->GetHeight() * matrix->GetWidth();
+  double darkRatio = (double)numDarkCells / numTotalCells;
+  return abs((int32_t)(darkRatio * 100 - 50) / 5) * 5 * 10;
+}
+FX_BOOL CBC_QRCoderMaskUtil::GetDataMaskBit(int32_t maskPattern,
+                                            int32_t x,
+                                            int32_t y,
+                                            int32_t& e) {
+  if (!CBC_QRCoder::IsValidMaskPattern(maskPattern)) {
+    e = (BCExceptionInvalidateMaskPattern);
+    BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  }
+  int32_t intermediate = 0, temp = 0;
+  switch (maskPattern) {
+    case 0:
+      intermediate = (y + x) & 0x1;
+      break;
+    case 1:
+      intermediate = y & 0x1;
+      break;
+    case 2:
+      intermediate = x % 3;
+      break;
+    case 3:
+      intermediate = (y + x) % 3;
+      break;
+    case 4:
+      intermediate = ((y >> 1) + (x / 3)) & 0x1;
+      break;
+    case 5:
+      temp = y * x;
+      intermediate = (temp & 0x1) + (temp % 3);
+      break;
+    case 6:
+      temp = y * x;
+      intermediate = (((temp & 0x1) + (temp % 3)) & 0x1);
+      break;
+    case 7:
+      temp = y * x;
+      intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1);
+      break;
+    default: {
+      e = BCExceptionInvalidateMaskPattern;
+      BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+    }
+  }
+  return intermediate == 0;
+}
+int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1Internal(
+    CBC_CommonByteMatrix* matrix,
+    FX_BOOL isHorizontal) {
+  int32_t penalty = 0;
+  int32_t numSameBitCells = 0;
+  int32_t prevBit = -1;
+  int32_t width = matrix->GetWidth();
+  int32_t height = matrix->GetHeight();
+  int32_t iLimit = isHorizontal ? height : width;
+  int32_t jLimit = isHorizontal ? width : height;
+  uint8_t* array = matrix->GetArray();
+  for (int32_t i = 0; i < iLimit; ++i) {
+    for (int32_t j = 0; j < jLimit; ++j) {
+      int32_t bit = isHorizontal ? array[i * width + j] : array[j * width + i];
+      if (bit == prevBit) {
+        numSameBitCells += 1;
+        if (numSameBitCells == 5) {
+          penalty += 3;
+        } else if (numSameBitCells > 5) {
+          penalty += 1;
+        }
+      } else {
+        numSameBitCells = 1;
+        prevBit = bit;
+      }
+    }
+    numSameBitCells = 0;
+  }
+  return penalty;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h b/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h
new file mode 100644
index 0000000..35032a3
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
+class CBC_CommonByteMatrix;
+class CBC_QRCoderMaskUtil {
+ public:
+  CBC_QRCoderMaskUtil();
+  virtual ~CBC_QRCoderMaskUtil();
+  static FX_BOOL GetDataMaskBit(int32_t maskPattern,
+                                int32_t x,
+                                int32_t y,
+                                int32_t& e);
+
+  static int32_t ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix);
+  static int32_t ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix);
+  static int32_t ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix);
+  static int32_t ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix);
+  static int32_t ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix,
+                                               FX_BOOL isHorizontal);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp
new file mode 100644
index 0000000..65cf036
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp
@@ -0,0 +1,474 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2008 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_QRCoderMatrixUtil::POSITION_DETECTION_PATTERN[7][7] = {
+    {1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1},
+    {1, 0, 1, 1, 1, 0, 1}, {1, 0, 1, 1, 1, 0, 1}, {1, 0, 0, 0, 0, 0, 1},
+    {1, 1, 1, 1, 1, 1, 1}};
+const int32_t CBC_QRCoderMatrixUtil::HORIZONTAL_SEPARATION_PATTERN[1][8] = {
+    {0, 0, 0, 0, 0, 0, 0, 0}};
+const int32_t CBC_QRCoderMatrixUtil::VERTICAL_SEPARATION_PATTERN[7][1] = {
+    {0}, {0}, {0}, {0}, {0}, {0}, {0}};
+const int32_t CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN[5][5] = {
+    {1, 1, 1, 1, 1},
+    {1, 0, 0, 0, 1},
+    {1, 0, 1, 0, 1},
+    {1, 0, 0, 0, 1},
+    {1, 1, 1, 1, 1}};
+const int32_t
+    CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7] =
+        // NOLINTNEXTLINE
+    {
+        {-1, -1, -1, -1, -1, -1, -1},   {6, 18, -1, -1, -1, -1, -1},
+        {6, 22, -1, -1, -1, -1, -1},    {6, 26, -1, -1, -1, -1, -1},
+        {6, 30, -1, -1, -1, -1, -1},    {6, 34, -1, -1, -1, -1, -1},
+        {6, 22, 38, -1, -1, -1, -1},    {6, 24, 42, -1, -1, -1, -1},
+        {6, 26, 46, -1, -1, -1, -1},    {6, 28, 50, -1, -1, -1, -1},
+        {6, 30, 54, -1, -1, -1, -1},    {6, 32, 58, -1, -1, -1, -1},
+        {6, 34, 62, -1, -1, -1, -1},    {6, 26, 46, 66, -1, -1, -1},
+        {6, 26, 48, 70, -1, -1, -1},    {6, 26, 50, 74, -1, -1, -1},
+        {6, 30, 54, 78, -1, -1, -1},    {6, 30, 56, 82, -1, -1, -1},
+        {6, 30, 58, 86, -1, -1, -1},    {6, 34, 62, 90, -1, -1, -1},
+        {6, 28, 50, 72, 94, -1, -1},    {6, 26, 50, 74, 98, -1, -1},
+        {6, 30, 54, 78, 102, -1, -1},   {6, 28, 54, 80, 106, -1, -1},
+        {6, 32, 58, 84, 110, -1, -1},   {6, 30, 58, 86, 114, -1, -1},
+        {6, 34, 62, 90, 118, -1, -1},   {6, 26, 50, 74, 98, 122, -1},
+        {6, 30, 54, 78, 102, 126, -1},  {6, 26, 52, 78, 104, 130, -1},
+        {6, 30, 56, 82, 108, 134, -1},  {6, 34, 60, 86, 112, 138, -1},
+        {6, 30, 58, 86, 114, 142, -1},  {6, 34, 62, 90, 118, 146, -1},
+        {6, 30, 54, 78, 102, 126, 150}, {6, 24, 50, 76, 102, 128, 154},
+        {6, 28, 54, 80, 106, 132, 158}, {6, 32, 58, 84, 110, 136, 162},
+        {6, 26, 54, 82, 110, 138, 166}, {6, 30, 58, 86, 114, 142, 170},
+};
+const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_COORDINATES[15][2] = {
+    {8, 0}, {8, 1}, {8, 2}, {8, 3}, {8, 4}, {8, 5}, {8, 7}, {8, 8},
+    {7, 8}, {5, 8}, {4, 8}, {3, 8}, {2, 8}, {1, 8}, {0, 8},
+};
+const int32_t CBC_QRCoderMatrixUtil::VERSION_INFO_POLY = 0x1f25;
+const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_POLY = 0x0537;
+const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_MASK_PATTERN = 0x5412;
+
+void CBC_QRCoderMatrixUtil::ClearMatrix(CBC_CommonByteMatrix* matrix,
+                                        int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  matrix->clear((uint8_t)-1);
+}
+void CBC_QRCoderMatrixUtil::BuildMatrix(
+    CBC_QRCoderBitVector* dataBits,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t version,
+    int32_t maskPattern,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  ClearMatrix(matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedBasicPatterns(version, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedTypeInfo(ecLevel, maskPattern, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  MaybeEmbedVersionInfo(version, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedDataBits(dataBits, maskPattern, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderMatrixUtil::EmbedBasicPatterns(int32_t version,
+                                               CBC_CommonByteMatrix* matrix,
+                                               int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  EmbedPositionDetectionPatternsAndSeparators(matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedDarkDotAtLeftBottomCorner(matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  MaybeEmbedPositionAdjustmentPatterns(version, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedTimingPatterns(matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderMatrixUtil::EmbedTypeInfo(
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t maskPattern,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  CBC_QRCoderBitVector typeInfoBits;
+  typeInfoBits.Init();
+  MakeTypeInfoBits(ecLevel, maskPattern, &typeInfoBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  for (int32_t i = 0; i < typeInfoBits.Size(); i++) {
+    int32_t bit = typeInfoBits.At(typeInfoBits.Size() - 1 - i, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    int32_t x1 = TYPE_INFO_COORDINATES[i][0];
+    int32_t y1 = TYPE_INFO_COORDINATES[i][1];
+    matrix->Set(x1, y1, bit);
+    if (i < 8) {
+      int32_t x2 = matrix->GetWidth() - i - 1;
+      int32_t y2 = 8;
+      matrix->Set(x2, y2, bit);
+    } else {
+      int32_t x2 = 8;
+      int32_t y2 = matrix->GetHeight() - 7 + (i - 8);
+      matrix->Set(x2, y2, bit);
+    }
+  }
+}
+void CBC_QRCoderMatrixUtil::MaybeEmbedVersionInfo(int32_t version,
+                                                  CBC_CommonByteMatrix* matrix,
+                                                  int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if (version < 7) {
+    return;
+  }
+  CBC_QRCoderBitVector versionInfoBits;
+  versionInfoBits.Init();
+  MakeVersionInfoBits(version, &versionInfoBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t bitIndex = 6 * 3 - 1;
+  for (int32_t i = 0; i < 6; i++) {
+    for (int32_t j = 0; j < 3; j++) {
+      int32_t bit = versionInfoBits.At(bitIndex, e);
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+      bitIndex--;
+      matrix->Set(i, matrix->GetHeight() - 11 + j, bit);
+      matrix->Set(matrix->GetHeight() - 11 + j, i, bit);
+    }
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedDataBits(CBC_QRCoderBitVector* dataBits,
+                                          int32_t maskPattern,
+                                          CBC_CommonByteMatrix* matrix,
+                                          int32_t& e) {
+  if (matrix == NULL || dataBits == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t bitIndex = 0;
+  int32_t direction = -1;
+  int32_t x = matrix->GetWidth() - 1;
+  int32_t y = matrix->GetHeight() - 1;
+  while (x > 0) {
+    if (x == 6) {
+      x -= 1;
+    }
+    while (y >= 0 && y < matrix->GetHeight()) {
+      if (y == 6) {
+        y += direction;
+        continue;
+      }
+      for (int32_t i = 0; i < 2; i++) {
+        int32_t xx = x - i;
+        if (!IsEmpty(matrix->Get(xx, y))) {
+          continue;
+        }
+        int32_t bit;
+        if (bitIndex < dataBits->Size()) {
+          bit = dataBits->At(bitIndex, e);
+          BC_EXCEPTION_CHECK_ReturnVoid(e);
+          bitIndex++;
+        } else {
+          bit = 0;
+        }
+        if (maskPattern != -1) {
+          FX_BOOL bol =
+              CBC_QRCoderMaskUtil::GetDataMaskBit(maskPattern, xx, y, e);
+          BC_EXCEPTION_CHECK_ReturnVoid(e);
+          if (bol) {
+            bit ^= 0x01;
+          }
+        }
+        matrix->Set(xx, y, bit);
+      }
+      y += direction;
+    }
+    direction = -direction;
+    y += direction;
+    x -= 2;
+  }
+  if (bitIndex != dataBits->Size()) {
+    return;
+  }
+}
+int32_t CBC_QRCoderMatrixUtil::CalculateBCHCode(int32_t value, int32_t poly) {
+  int32_t msbSetInPoly = FindMSBSet(poly);
+  value <<= msbSetInPoly - 1;
+  while (FindMSBSet(value) >= msbSetInPoly) {
+    value ^= poly << (FindMSBSet(value) - msbSetInPoly);
+  }
+  return value;
+}
+void CBC_QRCoderMatrixUtil::MakeTypeInfoBits(
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t maskPattern,
+    CBC_QRCoderBitVector* bits,
+    int32_t& e) {
+  if (bits == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if (!CBC_QRCoder::IsValidMaskPattern(maskPattern)) {
+    e = BCExceptionBadMask;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t typeInfo = (ecLevel->GetBits() << 3) | maskPattern;
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  bits->AppendBits(typeInfo, 5, e);
+  int32_t bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  bits->AppendBits(bchCode, 10, e);
+  CBC_QRCoderBitVector maskBits;
+  maskBits.Init();
+  maskBits.AppendBits(TYPE_INFO_MASK_PATTERN, 15, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  bits->XOR(&maskBits, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  if (bits->Size() != 15) {
+    e = BCExceptionBitSizeNot15;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+void CBC_QRCoderMatrixUtil::MakeVersionInfoBits(int32_t version,
+                                                CBC_QRCoderBitVector* bits,
+                                                int32_t& e) {
+  if (bits == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  bits->AppendBits(version, 6, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t bchCode = CalculateBCHCode(version, VERSION_INFO_POLY);
+  bits->AppendBits(bchCode, 12, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  if (bits->Size() != 18) {
+    e = BCExceptionBitSizeNot18;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+}
+FX_BOOL CBC_QRCoderMatrixUtil::IsEmpty(int32_t value) {
+  return (uint8_t)value == 0xff;
+}
+FX_BOOL CBC_QRCoderMatrixUtil::IsValidValue(int32_t value) {
+  return ((uint8_t)value == 0xff || (uint8_t)value == 0x00 ||
+          (uint8_t)value == 0x01);
+}
+void CBC_QRCoderMatrixUtil::EmbedTimingPatterns(CBC_CommonByteMatrix* matrix,
+                                                int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t i = 8; i < matrix->GetWidth() - 8; i++) {
+    int32_t bit = (i + 1) % 2;
+    if (!IsValidValue(matrix->Get(i, 6))) {
+      e = BCExceptionInvalidateImageData;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    if (IsEmpty(matrix->Get(i, 6))) {
+      matrix->Set(i, 6, bit);
+    }
+    if (!IsValidValue(matrix->Get(6, i))) {
+      e = BCExceptionInvalidateImageData;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    if (IsEmpty(matrix->Get(6, i))) {
+      matrix->Set(6, i, bit);
+    }
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedDarkDotAtLeftBottomCorner(
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if (matrix->Get(8, matrix->GetHeight() - 8) == 0) {
+    e = BCExceptionHeight_8BeZero;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  matrix->Set(8, matrix->GetHeight() - 8, 1);
+}
+void CBC_QRCoderMatrixUtil::EmbedHorizontalSeparationPattern(
+    int32_t xStart,
+    int32_t yStart,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t x = 0; x < 8; x++) {
+    if (!IsEmpty(matrix->Get(xStart + x, yStart))) {
+      e = BCExceptionInvalidateData;
+      BC_EXCEPTION_CHECK_ReturnVoid(e)
+    }
+    matrix->Set(xStart + x, yStart, HORIZONTAL_SEPARATION_PATTERN[0][x]);
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedVerticalSeparationPattern(
+    int32_t xStart,
+    int32_t yStart,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t y = 0; y < 7; y++) {
+    if (!IsEmpty(matrix->Get(xStart, yStart + y))) {
+      e = BCExceptionInvalidateData;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    matrix->Set(xStart, yStart + y, VERTICAL_SEPARATION_PATTERN[y][0]);
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedPositionAdjustmentPattern(
+    int32_t xStart,
+    int32_t yStart,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t y = 0; y < 5; y++) {
+    for (int32_t x = 0; x < 5; x++) {
+      if (!IsEmpty(matrix->Get(xStart + x, y + yStart))) {
+        e = BCExceptionInvalidateData;
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+      matrix->Set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]);
+    }
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPattern(
+    int32_t xStart,
+    int32_t yStart,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  for (int32_t y = 0; y < 7; y++) {
+    for (int32_t x = 0; x < 7; x++) {
+      if (!IsEmpty(matrix->Get(xStart + x, yStart + y))) {
+        e = BCExceptionInvalidateData;
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+      matrix->Set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]);
+    }
+  }
+}
+void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPatternsAndSeparators(
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  int32_t pdpWidth = 7;
+  EmbedPositionDetectionPattern(0, 0, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedPositionDetectionPattern(matrix->GetWidth() - pdpWidth, 0, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedPositionDetectionPattern(0, matrix->GetWidth() - pdpWidth, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t hspWidth = 8;
+  EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedHorizontalSeparationPattern(matrix->GetWidth() - hspWidth, hspWidth - 1,
+                                   matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedHorizontalSeparationPattern(0, matrix->GetWidth() - hspWidth, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  int32_t vspSize = 7;
+  EmbedVerticalSeparationPattern(vspSize, 0, matrix, e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedVerticalSeparationPattern(matrix->GetHeight() - vspSize - 1, 0, matrix,
+                                 e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+  EmbedVerticalSeparationPattern(vspSize, matrix->GetHeight() - vspSize, matrix,
+                                 e);
+  BC_EXCEPTION_CHECK_ReturnVoid(e);
+}
+void CBC_QRCoderMatrixUtil::MaybeEmbedPositionAdjustmentPatterns(
+    int32_t version,
+    CBC_CommonByteMatrix* matrix,
+    int32_t& e) {
+  if (matrix == NULL) {
+    e = BCExceptionNullPointer;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if (version < 2) {
+    return;
+  }
+  int32_t index = version - 1;
+  int32_t const* coordinates =
+      &(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][0]);
+  int32_t numCoordinate = 7;
+  for (int32_t i = 0; i < numCoordinate; i++) {
+    for (int32_t j = 0; j < numCoordinate; j++) {
+      int32_t y = coordinates[i];
+      int32_t x = coordinates[j];
+      if (x == -1 || y == -1) {
+        continue;
+      }
+      if (IsEmpty(matrix->Get(x, y))) {
+        EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix, e);
+        BC_EXCEPTION_CHECK_ReturnVoid(e);
+      }
+    }
+  }
+}
+int32_t CBC_QRCoderMatrixUtil::FindMSBSet(int32_t value) {
+  int32_t numDigits = 0;
+  while (value != 0) {
+    value >>= 1;
+    ++numDigits;
+  }
+  return numDigits;
+}
+CBC_QRCoderMatrixUtil::CBC_QRCoderMatrixUtil() {}
+CBC_QRCoderMatrixUtil::~CBC_QRCoderMatrixUtil() {}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h b/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h
new file mode 100644
index 0000000..feb0bb4
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h
@@ -0,0 +1,87 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
+
+class CBC_CommonByteMatrix;
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_QRCoderBitVector;
+class CBC_QRCoderMatrixUtil {
+ private:
+  static const int32_t POSITION_DETECTION_PATTERN[7][7];
+  static const int32_t VERTICAL_SEPARATION_PATTERN[7][1];
+  static const int32_t HORIZONTAL_SEPARATION_PATTERN[1][8];
+  static const int32_t POSITION_ADJUSTMENT_PATTERN[5][5];
+  static const int32_t POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7];
+  static const int32_t TYPE_INFO_COORDINATES[15][2];
+  static const int32_t VERSION_INFO_POLY;
+  static const int32_t TYPE_INFO_POLY;
+  static const int32_t TYPE_INFO_MASK_PATTERN;
+
+ public:
+  CBC_QRCoderMatrixUtil();
+  virtual ~CBC_QRCoderMatrixUtil();
+  static void ClearMatrix(CBC_CommonByteMatrix* matrix, int32_t& e);
+  static void BuildMatrix(CBC_QRCoderBitVector* dataBits,
+                          CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                          int32_t version,
+                          int32_t maskPattern,
+                          CBC_CommonByteMatrix* matrix,
+                          int32_t& e);
+  static void EmbedBasicPatterns(int32_t version,
+                                 CBC_CommonByteMatrix* matrix,
+                                 int32_t& e);
+  static void EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                            int32_t maskPattern,
+                            CBC_CommonByteMatrix* matrix,
+                            int32_t& e);
+  static void EmbedDataBits(CBC_QRCoderBitVector* dataBits,
+                            int32_t maskPattern,
+                            CBC_CommonByteMatrix* matrix,
+                            int32_t& e);
+  static void MaybeEmbedVersionInfo(int32_t version,
+                                    CBC_CommonByteMatrix* matrix,
+                                    int32_t& e);
+  static int32_t FindMSBSet(int32_t value);
+  static int32_t CalculateBCHCode(int32_t code, int32_t poly);
+  static void MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                               int32_t maskPattern,
+                               CBC_QRCoderBitVector* bits,
+                               int32_t& e);
+  static void MakeVersionInfoBits(int32_t version,
+                                  CBC_QRCoderBitVector* bits,
+                                  int32_t& e);
+  static FX_BOOL IsEmpty(int32_t value);
+  static FX_BOOL IsValidValue(int32_t value);
+  static void EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, int32_t& e);
+  static void EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix,
+                                             int32_t& e);
+  static void EmbedHorizontalSeparationPattern(int32_t xStart,
+                                               int32_t yStart,
+                                               CBC_CommonByteMatrix* matrix,
+                                               int32_t& e);
+  static void EmbedVerticalSeparationPattern(int32_t xStart,
+                                             int32_t yStart,
+                                             CBC_CommonByteMatrix* matrix,
+                                             int32_t& e);
+  static void EmbedPositionAdjustmentPattern(int32_t xStart,
+                                             int32_t yStart,
+                                             CBC_CommonByteMatrix* matrix,
+                                             int32_t& e);
+  static void EmbedPositionDetectionPattern(int32_t xStart,
+                                            int32_t yStart,
+                                            CBC_CommonByteMatrix* matrix,
+                                            int32_t& e);
+  static void EmbedPositionDetectionPatternsAndSeparators(
+      CBC_CommonByteMatrix* matrix,
+      int32_t& e);
+  static void MaybeEmbedPositionAdjustmentPatterns(int32_t version,
+                                                   CBC_CommonByteMatrix* matrix,
+                                                   int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp
new file mode 100644
index 0000000..2abdab5
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp
@@ -0,0 +1,179 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL;
+CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL;
+
+CBC_QRCoderMode::CBC_QRCoderMode(int32_t* characterCountBitsForVersions,
+                                 int32_t x1,
+                                 int32_t x2,
+                                 int32_t x3,
+                                 int32_t bits,
+                                 CFX_ByteString name) {
+  m_characterCountBitsForVersions = characterCountBitsForVersions;
+  if (m_characterCountBitsForVersions) {
+    m_characterCountBitsForVersions[0] = x1;
+    m_characterCountBitsForVersions[1] = x2;
+    m_characterCountBitsForVersions[2] = x3;
+  }
+  m_name += name;
+  m_bits = bits;
+}
+CBC_QRCoderMode::~CBC_QRCoderMode() {
+  FX_Free(m_characterCountBitsForVersions);
+}
+void CBC_QRCoderMode::Initialize() {
+  sBYTE = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 16, 16, 0x4, "BYTE");
+  sALPHANUMERIC =
+      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 9, 11, 13, 0x2, "ALPHANUMERIC");
+  sECI = new CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI");
+  sKANJI = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x8, "KANJI");
+  sNUMERIC =
+      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 10, 12, 14, 0x1, "NUMERIC");
+  sGBK = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x0D, "GBK");
+  sTERMINATOR =
+      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x00, "TERMINATOR");
+  sFNC1_FIRST_POSITION =
+      new CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION");
+  sFNC1_SECOND_POSITION =
+      new CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION");
+  sSTRUCTURED_APPEND = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x03,
+                                           "STRUCTURED_APPEND");
+}
+void CBC_QRCoderMode::Finalize() {
+  delete sBYTE;
+  delete sALPHANUMERIC;
+  delete sECI;
+  delete sKANJI;
+  delete sNUMERIC;
+  delete sGBK;
+  delete sTERMINATOR;
+  delete sFNC1_FIRST_POSITION;
+  delete sFNC1_SECOND_POSITION;
+  delete sSTRUCTURED_APPEND;
+}
+CBC_QRCoderMode* CBC_QRCoderMode::ForBits(int32_t bits, int32_t& e) {
+  switch (bits) {
+    case 0x0:
+      return sTERMINATOR;
+    case 0x1:
+      return sNUMERIC;
+    case 0x2:
+      return sALPHANUMERIC;
+    case 0x3:
+      return sSTRUCTURED_APPEND;
+    case 0x4:
+      return sBYTE;
+    case 0x5:
+      return sFNC1_FIRST_POSITION;
+    case 0x7:
+      return sECI;
+    case 0x8:
+      return sKANJI;
+    case 0x9:
+      return sFNC1_SECOND_POSITION;
+    case 0x0D:
+      return sGBK;
+    default: {
+      e = BCExceptionUnsupportedMode;
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+  }
+  return NULL;
+}
+int32_t CBC_QRCoderMode::GetBits() {
+  return m_bits;
+}
+CFX_ByteString CBC_QRCoderMode::GetName() {
+  return m_name;
+}
+int32_t CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version,
+                                               int32_t& e) {
+  if (m_characterCountBitsForVersions == NULL) {
+    e = BCExceptionCharacterNotThisMode;
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  }
+  int32_t number = version->GetVersionNumber();
+  int32_t offset;
+  if (number <= 9) {
+    offset = 0;
+  } else if (number <= 26) {
+    offset = 1;
+  } else {
+    offset = 2;
+  }
+  return m_characterCountBitsForVersions[offset];
+}
+void CBC_QRCoderMode::Destroy() {
+  if (sBYTE) {
+    delete CBC_QRCoderMode::sBYTE;
+    sBYTE = NULL;
+  }
+  if (sNUMERIC) {
+    delete CBC_QRCoderMode::sNUMERIC;
+    sNUMERIC = NULL;
+  }
+  if (sALPHANUMERIC) {
+    delete CBC_QRCoderMode::sALPHANUMERIC;
+    sALPHANUMERIC = NULL;
+  }
+  if (sKANJI) {
+    delete CBC_QRCoderMode::sKANJI;
+    sKANJI = NULL;
+  }
+  if (sECI) {
+    delete CBC_QRCoderMode::sECI;
+    sECI = NULL;
+  }
+  if (sGBK) {
+    delete CBC_QRCoderMode::sGBK;
+    sGBK = NULL;
+  }
+  if (sTERMINATOR) {
+    delete CBC_QRCoderMode::sTERMINATOR;
+    sTERMINATOR = NULL;
+  }
+  if (sFNC1_FIRST_POSITION) {
+    delete CBC_QRCoderMode::sFNC1_FIRST_POSITION;
+    sFNC1_FIRST_POSITION = NULL;
+  }
+  if (sFNC1_SECOND_POSITION) {
+    delete CBC_QRCoderMode::sFNC1_SECOND_POSITION;
+    sFNC1_SECOND_POSITION = NULL;
+  }
+  if (sSTRUCTURED_APPEND) {
+    delete CBC_QRCoderMode::sSTRUCTURED_APPEND;
+    sSTRUCTURED_APPEND = NULL;
+  }
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderMode.h b/xfa/fxbarcode/qrcode/BC_QRCoderMode.h
new file mode 100644
index 0000000..e36f7a1
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderMode.h
@@ -0,0 +1,51 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
+
+#include <stdint.h>
+
+#include "core/include/fxcrt/fx_string.h"
+
+class CBC_QRCoderVersion;
+
+class CBC_QRCoderMode {
+ private:
+  int32_t* m_characterCountBitsForVersions;
+  int32_t m_bits;
+  CFX_ByteString m_name;
+  CBC_QRCoderMode(int32_t* characterCountBitsForVersions,
+                  int32_t x1,
+                  int32_t x2,
+                  int32_t x3,
+                  int32_t bits,
+                  CFX_ByteString name);
+  CBC_QRCoderMode();
+
+ public:
+  static CBC_QRCoderMode* sBYTE;
+  static CBC_QRCoderMode* sNUMERIC;
+  static CBC_QRCoderMode* sALPHANUMERIC;
+  static CBC_QRCoderMode* sKANJI;
+  static CBC_QRCoderMode* sECI;
+  static CBC_QRCoderMode* sGBK;
+  static CBC_QRCoderMode* sTERMINATOR;
+  static CBC_QRCoderMode* sFNC1_FIRST_POSITION;
+  static CBC_QRCoderMode* sFNC1_SECOND_POSITION;
+  static CBC_QRCoderMode* sSTRUCTURED_APPEND;
+  virtual ~CBC_QRCoderMode();
+
+  static void Initialize();
+  static void Finalize();
+  static CBC_QRCoderMode* ForBits(int32_t bits, int32_t& e);
+  int32_t GetCharacterCountBits(CBC_QRCoderVersion* version, int32_t& e);
+  int32_t GetBits();
+  CFX_ByteString GetName();
+  static void Destroy();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
new file mode 100644
index 0000000..1ff557e
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
@@ -0,0 +1,769 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECB.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_QRCoderVersion::VERSION_DECODE_INFO[] = {
+    0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847,
+    0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6,
+    0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E,
+    0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA,
+    0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69};
+CFX_PtrArray* CBC_QRCoderVersion::VERSION = NULL;
+
+void CBC_QRCoderVersion::Initialize() {
+  VERSION = new CFX_PtrArray();
+}
+void CBC_QRCoderVersion::Finalize() {
+  for (int32_t i = 0; i < VERSION->GetSize(); i++) {
+    CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i));
+    delete v;
+  }
+  delete VERSION;
+}
+CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber,
+                                       CBC_QRCoderECBlocks* ecBlocks1,
+                                       CBC_QRCoderECBlocks* ecBlocks2,
+                                       CBC_QRCoderECBlocks* ecBlocks3,
+                                       CBC_QRCoderECBlocks* ecBlocks4) {
+  m_versionNumber = versionNumber;
+  m_ecBlocks.Add(ecBlocks1);
+  m_ecBlocks.Add(ecBlocks2);
+  m_ecBlocks.Add(ecBlocks3);
+  m_ecBlocks.Add(ecBlocks4);
+  int32_t total = 0;
+  int32_t ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock();
+  CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks();
+  for (int32_t i = 0; i < ecbArray->GetSize(); i++) {
+    CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]);
+    total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords);
+  }
+  m_totalCodeWords = total;
+  switch (versionNumber) {
+    case 1:
+      break;
+    case 2:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(18);
+      break;
+    case 3:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(22);
+      break;
+    case 4:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      break;
+    case 5:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      break;
+    case 6:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      break;
+    case 7:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(22);
+      m_alignmentPatternCenters.Add(38);
+      break;
+    case 8:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(24);
+      m_alignmentPatternCenters.Add(42);
+      break;
+    case 9:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(46);
+      break;
+    case 10:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(28);
+      m_alignmentPatternCenters.Add(50);
+      break;
+    case 11:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(54);
+      break;
+    case 12:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(32);
+      m_alignmentPatternCenters.Add(58);
+      break;
+    case 13:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      m_alignmentPatternCenters.Add(62);
+      break;
+    case 14:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(46);
+      m_alignmentPatternCenters.Add(66);
+      break;
+    case 15:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(48);
+      m_alignmentPatternCenters.Add(70);
+      break;
+    case 16:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(50);
+      m_alignmentPatternCenters.Add(74);
+      break;
+    case 17:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(78);
+      break;
+    case 18:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(56);
+      m_alignmentPatternCenters.Add(82);
+      break;
+    case 19:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(86);
+      break;
+    case 20:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      m_alignmentPatternCenters.Add(62);
+      m_alignmentPatternCenters.Add(90);
+      break;
+    case 21:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(28);
+      m_alignmentPatternCenters.Add(50);
+      m_alignmentPatternCenters.Add(72);
+      m_alignmentPatternCenters.Add(94);
+      break;
+    case 22:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(50);
+      m_alignmentPatternCenters.Add(74);
+      m_alignmentPatternCenters.Add(98);
+      break;
+    case 23:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(74);
+      m_alignmentPatternCenters.Add(102);
+      break;
+    case 24:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(28);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(80);
+      m_alignmentPatternCenters.Add(106);
+      break;
+    case 25:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(32);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(84);
+      m_alignmentPatternCenters.Add(110);
+      break;
+    case 26:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(86);
+      m_alignmentPatternCenters.Add(114);
+      break;
+    case 27:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      m_alignmentPatternCenters.Add(62);
+      m_alignmentPatternCenters.Add(90);
+      m_alignmentPatternCenters.Add(118);
+      break;
+    case 28:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(50);
+      m_alignmentPatternCenters.Add(74);
+      m_alignmentPatternCenters.Add(98);
+      m_alignmentPatternCenters.Add(122);
+      break;
+    case 29:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(78);
+      m_alignmentPatternCenters.Add(102);
+      m_alignmentPatternCenters.Add(126);
+      break;
+    case 30:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(52);
+      m_alignmentPatternCenters.Add(78);
+      m_alignmentPatternCenters.Add(104);
+      m_alignmentPatternCenters.Add(130);
+      break;
+    case 31:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(56);
+      m_alignmentPatternCenters.Add(82);
+      m_alignmentPatternCenters.Add(108);
+      m_alignmentPatternCenters.Add(134);
+      break;
+    case 32:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      m_alignmentPatternCenters.Add(60);
+      m_alignmentPatternCenters.Add(86);
+      m_alignmentPatternCenters.Add(112);
+      m_alignmentPatternCenters.Add(138);
+      break;
+    case 33:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(86);
+      m_alignmentPatternCenters.Add(114);
+      m_alignmentPatternCenters.Add(142);
+      break;
+    case 34:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(34);
+      m_alignmentPatternCenters.Add(62);
+      m_alignmentPatternCenters.Add(90);
+      m_alignmentPatternCenters.Add(118);
+      m_alignmentPatternCenters.Add(146);
+      break;
+    case 35:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(78);
+      m_alignmentPatternCenters.Add(102);
+      m_alignmentPatternCenters.Add(126);
+      m_alignmentPatternCenters.Add(150);
+      break;
+    case 36:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(24);
+      m_alignmentPatternCenters.Add(50);
+      m_alignmentPatternCenters.Add(76);
+      m_alignmentPatternCenters.Add(102);
+      m_alignmentPatternCenters.Add(128);
+      m_alignmentPatternCenters.Add(154);
+      break;
+    case 37:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(28);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(80);
+      m_alignmentPatternCenters.Add(106);
+      m_alignmentPatternCenters.Add(132);
+      m_alignmentPatternCenters.Add(158);
+      break;
+    case 38:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(32);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(84);
+      m_alignmentPatternCenters.Add(110);
+      m_alignmentPatternCenters.Add(136);
+      m_alignmentPatternCenters.Add(162);
+      break;
+    case 39:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(26);
+      m_alignmentPatternCenters.Add(54);
+      m_alignmentPatternCenters.Add(82);
+      m_alignmentPatternCenters.Add(110);
+      m_alignmentPatternCenters.Add(138);
+      m_alignmentPatternCenters.Add(166);
+      break;
+    case 40:
+      m_alignmentPatternCenters.Add(6);
+      m_alignmentPatternCenters.Add(30);
+      m_alignmentPatternCenters.Add(58);
+      m_alignmentPatternCenters.Add(86);
+      m_alignmentPatternCenters.Add(114);
+      m_alignmentPatternCenters.Add(142);
+      m_alignmentPatternCenters.Add(170);
+      break;
+  }
+}
+CBC_QRCoderVersion::~CBC_QRCoderVersion() {
+  if (m_ecBlocks.GetSize() != 0) {
+    int32_t itBeg = 0;
+    int32_t itEnd = m_ecBlocks.GetSize();
+    while (itBeg != itEnd) {
+      delete ((CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg]));
+      itBeg++;
+    }
+  }
+}
+int32_t CBC_QRCoderVersion::GetVersionNumber() {
+  return m_versionNumber;
+}
+CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
+  return &m_alignmentPatternCenters;
+}
+int32_t CBC_QRCoderVersion::GetTotalCodeWords() {
+  return m_totalCodeWords;
+}
+int32_t CBC_QRCoderVersion::GetDimensionForVersion() {
+  return 17 + 4 * m_versionNumber;
+}
+CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(
+    CBC_QRCoderErrorCorrectionLevel* ecLevel) {
+  return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()];
+}
+CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(
+    int32_t dimension,
+    int32_t& e) {
+  if ((dimension % 4) != 1) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return qcv;
+}
+CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(
+    int32_t versionBits,
+    int32_t& e) {
+  int32_t bestDifference = FXSYS_IntMax;
+  int32_t bestVersion = 0;
+  for (int32_t i = 0; i < 34; i++) {
+    int32_t targetVersion = VERSION_DECODE_INFO[i];
+    if (targetVersion == versionBits) {
+      CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      return qcv;
+    }
+    int32_t bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(
+        versionBits, targetVersion);
+    if (bitsDifference < bestDifference) {
+      bestVersion = i + 7;
+      bestDifference = bitsDifference;
+    }
+  }
+  if (bestDifference <= 3) {
+    CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    return qcv;
+  }
+  return NULL;
+}
+CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(int32_t& e) {
+  int32_t dimension = GetDimensionForVersion();
+  CBC_CommonBitMatrix* bitMatrix = new CBC_CommonBitMatrix();
+  bitMatrix->Init(dimension);
+  bitMatrix->SetRegion(0, 0, 9, 9, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  bitMatrix->SetRegion(0, dimension - 8, 9, 8, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t max = m_alignmentPatternCenters.GetSize();
+  for (int32_t x = 0; x < max; x++) {
+    int32_t i = m_alignmentPatternCenters[x] - 2;
+    for (int32_t y = 0; y < max; y++) {
+      if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) {
+        continue;
+      }
+      bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    }
+  }
+  bitMatrix->SetRegion(6, 9, 1, dimension - 17, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  bitMatrix->SetRegion(9, 6, dimension - 17, 1, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  if (m_versionNumber > 6) {
+    bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    bitMatrix->SetRegion(0, dimension - 11, 6, 3, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return bitMatrix;
+}
+CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(
+    int32_t versionNumber,
+    int32_t& e) {
+  if (VERSION->GetSize() == 0) {
+    VERSION->Add(new CBC_QRCoderVersion(
+        1, new CBC_QRCoderECBlocks(7, new CBC_QRCoderECB(1, 19)),
+        new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 16)),
+        new CBC_QRCoderECBlocks(13, new CBC_QRCoderECB(1, 13)),
+        new CBC_QRCoderECBlocks(17, new CBC_QRCoderECB(1, 9))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        2, new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 34)),
+        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(1, 28)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(1, 22)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        3, new CBC_QRCoderECBlocks(15, new CBC_QRCoderECB(1, 55)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 44)),
+        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 17)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        4, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(1, 80)),
+        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 32)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(2, 24)),
+        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 9))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        5, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 108)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 43)),
+        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 15),
+                                new CBC_QRCoderECB(2, 16)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 11),
+                                new CBC_QRCoderECB(2, 12))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        6, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68)),
+        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 27)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 19)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 15))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        7, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(2, 78)),
+        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(4, 31)),
+        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 14),
+                                new CBC_QRCoderECB(4, 15)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 13),
+                                new CBC_QRCoderECB(1, 14))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        8, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 97)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 38),
+                                new CBC_QRCoderECB(2, 39)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(4, 18),
+                                new CBC_QRCoderECB(2, 19)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 14),
+                                new CBC_QRCoderECB(2, 15))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        9, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 116)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(3, 36),
+                                new CBC_QRCoderECB(2, 37)),
+        new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 16),
+                                new CBC_QRCoderECB(4, 17)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 12),
+                                new CBC_QRCoderECB(4, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        10, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68),
+                                    new CBC_QRCoderECB(2, 69)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 43),
+                                new CBC_QRCoderECB(1, 44)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(6, 19),
+                                new CBC_QRCoderECB(2, 20)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 15),
+                                new CBC_QRCoderECB(2, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        11, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 81)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 50),
+                                new CBC_QRCoderECB(4, 51)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 22),
+                                new CBC_QRCoderECB(4, 23)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(3, 12),
+                                new CBC_QRCoderECB(8, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        12, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 92),
+                                    new CBC_QRCoderECB(2, 93)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(6, 36),
+                                new CBC_QRCoderECB(2, 37)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 20),
+                                new CBC_QRCoderECB(6, 21)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 14),
+                                new CBC_QRCoderECB(4, 15))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        13, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 107)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(8, 37),
+                                new CBC_QRCoderECB(1, 38)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(8, 20),
+                                new CBC_QRCoderECB(4, 21)),
+        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(12, 11),
+                                new CBC_QRCoderECB(4, 12))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        14, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 115),
+                                    new CBC_QRCoderECB(1, 116)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 40),
+                                new CBC_QRCoderECB(5, 41)),
+        new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(11, 16),
+                                new CBC_QRCoderECB(5, 17)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
+                                new CBC_QRCoderECB(5, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        15, new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(5, 87),
+                                    new CBC_QRCoderECB(1, 88)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 41),
+                                new CBC_QRCoderECB(5, 42)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 24),
+                                new CBC_QRCoderECB(7, 25)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
+                                new CBC_QRCoderECB(7, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        16, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 98),
+                                    new CBC_QRCoderECB(1, 99)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 45),
+                                new CBC_QRCoderECB(3, 46)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(15, 19),
+                                new CBC_QRCoderECB(2, 20)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 15),
+                                new CBC_QRCoderECB(13, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        17, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 107),
+                                    new CBC_QRCoderECB(5, 108)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
+                                new CBC_QRCoderECB(1, 47)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 22),
+                                new CBC_QRCoderECB(15, 23)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
+                                new CBC_QRCoderECB(17, 15))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        18, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 120),
+                                    new CBC_QRCoderECB(1, 121)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 43),
+                                new CBC_QRCoderECB(4, 44)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
+                                new CBC_QRCoderECB(1, 23)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
+                                new CBC_QRCoderECB(19, 15))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        19, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 113),
+                                    new CBC_QRCoderECB(4, 114)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 44),
+                                new CBC_QRCoderECB(11, 45)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 21),
+                                new CBC_QRCoderECB(4, 22)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 13),
+                                new CBC_QRCoderECB(16, 14))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        20, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 107),
+                                    new CBC_QRCoderECB(5, 108)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 41),
+                                new CBC_QRCoderECB(13, 42)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
+                                new CBC_QRCoderECB(5, 25)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(15, 15),
+                                new CBC_QRCoderECB(10, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        21, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 116),
+                                    new CBC_QRCoderECB(4, 117)),
+        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 42)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
+                                new CBC_QRCoderECB(6, 23)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 16),
+                                new CBC_QRCoderECB(6, 17))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        22, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 111),
+                                    new CBC_QRCoderECB(7, 112)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 46)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
+                                new CBC_QRCoderECB(16, 25)),
+        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(34, 13))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        23, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 121),
+                                    new CBC_QRCoderECB(5, 122)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 47),
+                                new CBC_QRCoderECB(14, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
+                                new CBC_QRCoderECB(14, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(16, 15),
+                                new CBC_QRCoderECB(14, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        24, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 117),
+                                    new CBC_QRCoderECB(4, 118)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 45),
+                                new CBC_QRCoderECB(14, 46)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
+                                new CBC_QRCoderECB(16, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(30, 16),
+                                new CBC_QRCoderECB(2, 17))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        25, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(8, 106),
+                                    new CBC_QRCoderECB(4, 107)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(8, 47),
+                                new CBC_QRCoderECB(13, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
+                                new CBC_QRCoderECB(22, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
+                                new CBC_QRCoderECB(13, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        26, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 114),
+                                    new CBC_QRCoderECB(2, 115)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 46),
+                                new CBC_QRCoderECB(4, 47)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(28, 22),
+                                new CBC_QRCoderECB(6, 23)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(33, 16),
+                                new CBC_QRCoderECB(4, 17))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        27, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 122),
+                                    new CBC_QRCoderECB(4, 123)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(22, 45),
+                                new CBC_QRCoderECB(3, 46)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 23),
+                                new CBC_QRCoderECB(26, 24)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 15),
+                                new CBC_QRCoderECB(28, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        28, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 117),
+                                    new CBC_QRCoderECB(10, 118)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 45),
+                                new CBC_QRCoderECB(23, 46)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 24),
+                                new CBC_QRCoderECB(31, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
+                                new CBC_QRCoderECB(31, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        29, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 116),
+                                    new CBC_QRCoderECB(7, 117)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(21, 45),
+                                new CBC_QRCoderECB(7, 46)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 23),
+                                new CBC_QRCoderECB(37, 24)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
+                                new CBC_QRCoderECB(26, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        30, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 115),
+                                    new CBC_QRCoderECB(10, 116)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 47),
+                                new CBC_QRCoderECB(10, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
+                                new CBC_QRCoderECB(25, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
+                                new CBC_QRCoderECB(25, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        31, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
+                                    new CBC_QRCoderECB(3, 116)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 46),
+                                new CBC_QRCoderECB(29, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 24),
+                                new CBC_QRCoderECB(1, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
+                                new CBC_QRCoderECB(28, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        32, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
+                                new CBC_QRCoderECB(23, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 24),
+                                new CBC_QRCoderECB(35, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
+                                new CBC_QRCoderECB(35, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        33, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115),
+                                    new CBC_QRCoderECB(1, 116)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
+                                new CBC_QRCoderECB(21, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(29, 24),
+                                new CBC_QRCoderECB(19, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
+                                new CBC_QRCoderECB(46, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        34, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
+                                    new CBC_QRCoderECB(6, 116)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
+                                new CBC_QRCoderECB(23, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(44, 24),
+                                new CBC_QRCoderECB(7, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(59, 16),
+                                new CBC_QRCoderECB(1, 17))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        35, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 121),
+                                    new CBC_QRCoderECB(7, 122)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(12, 47),
+                                new CBC_QRCoderECB(26, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(39, 24),
+                                new CBC_QRCoderECB(14, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
+                                new CBC_QRCoderECB(41, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        36, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 121),
+                                    new CBC_QRCoderECB(14, 122)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 47),
+                                new CBC_QRCoderECB(34, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(46, 24),
+                                new CBC_QRCoderECB(10, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 15),
+                                new CBC_QRCoderECB(64, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        37, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 122),
+                                    new CBC_QRCoderECB(4, 123)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(29, 46),
+                                new CBC_QRCoderECB(14, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(49, 24),
+                                new CBC_QRCoderECB(10, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(24, 15),
+                                new CBC_QRCoderECB(46, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        38, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 122),
+                                    new CBC_QRCoderECB(18, 123)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(13, 46),
+                                new CBC_QRCoderECB(32, 47)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(48, 24),
+                                new CBC_QRCoderECB(14, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 15),
+                                new CBC_QRCoderECB(32, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        39, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 117),
+                                    new CBC_QRCoderECB(4, 118)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(40, 47),
+                                new CBC_QRCoderECB(7, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(43, 24),
+                                new CBC_QRCoderECB(22, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 15),
+                                new CBC_QRCoderECB(67, 16))));
+    VERSION->Add(new CBC_QRCoderVersion(
+        40, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 118),
+                                    new CBC_QRCoderECB(6, 119)),
+        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(18, 47),
+                                new CBC_QRCoderECB(31, 48)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(34, 24),
+                                new CBC_QRCoderECB(34, 25)),
+        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 15),
+                                new CBC_QRCoderECB(61, 16))));
+  }
+  if (versionNumber < 1 || versionNumber > 40) {
+    e = BCExceptionIllegalArgument;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1];
+}
+void CBC_QRCoderVersion::Destroy() {
+  int32_t i;
+  for (i = 0; i < VERSION->GetSize(); i++) {
+    delete ((CBC_QRCoderVersion*)(*VERSION)[i]);
+  }
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
new file mode 100644
index 0000000..dd2b0c6
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_QRCoderECBlocks;
+class CBC_CommonBitMatrix;
+class CBC_QRCoderErrorCorrectionLevel;
+
+class CBC_QRCoderVersion {
+ private:
+  static const int32_t VERSION_DECODE_INFO[34];
+  static CFX_PtrArray* VERSION;
+  int32_t m_versionNumber;
+  int32_t m_totalCodeWords;
+  CFX_Int32Array m_alignmentPatternCenters;
+  CFX_PtrArray m_ecBlocks;
+
+  CBC_QRCoderVersion();
+  CBC_QRCoderVersion(int32_t versionNumber,
+                     CBC_QRCoderECBlocks* ecBlocks1,
+                     CBC_QRCoderECBlocks* ecBlocks2,
+                     CBC_QRCoderECBlocks* ecBlocks3,
+                     CBC_QRCoderECBlocks* ecBlocks4);
+
+ public:
+  virtual ~CBC_QRCoderVersion();
+  static void Initialize();
+  static void Finalize();
+
+  int32_t GetVersionNumber();
+  int32_t GetTotalCodeWords();
+  int32_t GetDimensionForVersion();
+  CBC_CommonBitMatrix* BuildFunctionPattern(int32_t& e);
+  CFX_Int32Array* GetAlignmentPatternCenters();
+  CBC_QRCoderECBlocks* GetECBlocksForLevel(
+      CBC_QRCoderErrorCorrectionLevel* ecLevel);
+  static CBC_QRCoderVersion* GetVersionForNumber(int32_t versionNumber,
+                                                 int32_t& e);
+  static CBC_QRCoderVersion* GetProvisionalVersionForDimension(
+      int32_t dimension,
+      int32_t& e);
+  static CBC_QRCoderVersion* DecodeVersionInformation(int32_t versionBits,
+                                                      int32_t& e);
+  static void Destroy();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRDataBlock.cpp b/xfa/fxbarcode/qrcode/BC_QRDataBlock.cpp
new file mode 100644
index 0000000..9805ac9
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDataBlock.cpp
@@ -0,0 +1,111 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRDataBlock.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECB.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRDataBlock::CBC_QRDataBlock(int32_t numDataCodewords,
+                                 CFX_ByteArray* codewords)
+    : m_numDataCodewords(numDataCodewords), m_codewords(codewords) {}
+CBC_QRDataBlock::~CBC_QRDataBlock() {
+  delete m_codewords;
+}
+int32_t CBC_QRDataBlock::GetNumDataCodewords() {
+  return m_numDataCodewords;
+}
+CFX_ByteArray* CBC_QRDataBlock::GetCodewords() {
+  return m_codewords;
+}
+CFX_PtrArray* CBC_QRDataBlock::GetDataBlocks(
+    CFX_ByteArray* rawCodewords,
+    CBC_QRCoderVersion* version,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t& e) {
+  if (rawCodewords->GetSize() != version->GetTotalCodeWords()) {
+    e = BCExceptionIllegalArgument;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
+  int32_t totalBlocks = 0;
+  CFX_PtrArray* ecBlockArray = ecBlocks->GetECBlocks();
+  int32_t i = 0;
+  for (i = 0; i < ecBlockArray->GetSize(); i++) {
+    totalBlocks += ((CBC_QRCoderECB*)(*ecBlockArray)[i])->GetCount();
+  }
+  std::unique_ptr<CFX_PtrArray> result(new CFX_PtrArray());
+  result->SetSize(totalBlocks);
+  int32_t numResultBlocks = 0;
+  for (int32_t j = 0; j < ecBlockArray->GetSize(); j++) {
+    CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)(*ecBlockArray)[j];
+    for (int32_t k = 0; k < ecBlock->GetCount(); k++) {
+      int32_t numDataCodewords = ecBlock->GetDataCodeWords();
+      int32_t numBlockCodewords =
+          ecBlocks->GetECCodeWordsPerBlock() + numDataCodewords;
+      CFX_ByteArray* bytearray = new CFX_ByteArray();
+      bytearray->SetSize(numBlockCodewords);
+      (*result)[numResultBlocks++] =
+          new CBC_QRDataBlock(numDataCodewords, bytearray);
+    }
+  }
+  int32_t shorterBlocksTotalCodewords =
+      ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize();
+  int32_t longerBlocksStartAt = result->GetSize() - 1;
+  while (longerBlocksStartAt >= 0) {
+    int32_t numCodewords = ((CBC_QRDataBlock*)(*result)[longerBlocksStartAt])
+                               ->m_codewords->GetSize();
+    if (numCodewords == shorterBlocksTotalCodewords) {
+      break;
+    }
+    longerBlocksStartAt--;
+  }
+  longerBlocksStartAt++;
+  int32_t shorterBlocksNumDataCodewords =
+      shorterBlocksTotalCodewords - ecBlocks->GetECCodeWordsPerBlock();
+  int32_t rawCodewordsOffset = 0;
+  int32_t x = 0;
+  for (int32_t k = 0; k < shorterBlocksNumDataCodewords; k++) {
+    for (x = 0; x < numResultBlocks; x++) {
+      (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[k] =
+          (*rawCodewords)[rawCodewordsOffset++];
+    }
+  }
+  for (x = longerBlocksStartAt; x < numResultBlocks; x++) {
+    (*(((CBC_QRDataBlock*)(*result)[x])
+           ->m_codewords))[shorterBlocksNumDataCodewords] =
+        (*rawCodewords)[rawCodewordsOffset++];
+  }
+  int32_t max = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize();
+  for (i = shorterBlocksNumDataCodewords; i < max; i++) {
+    for (int32_t y = 0; y < numResultBlocks; y++) {
+      int32_t iOffset = y < longerBlocksStartAt ? i : i + 1;
+      (*(((CBC_QRDataBlock*)(*result)[y])->m_codewords))[iOffset] =
+          (*rawCodewords)[rawCodewordsOffset++];
+    }
+  }
+  return result.release();
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRDataBlock.h b/xfa/fxbarcode/qrcode/BC_QRDataBlock.h
new file mode 100644
index 0000000..8e11ab8
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDataBlock.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_QRCoderVersion;
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_QRDataBlock {
+ private:
+  int32_t m_numDataCodewords;
+  CFX_ByteArray* m_codewords;
+  CBC_QRDataBlock(int32_t numDataCodewords, CFX_ByteArray* codewords);
+
+ public:
+  virtual ~CBC_QRDataBlock();
+  int32_t GetNumDataCodewords();
+  CFX_ByteArray* GetCodewords();
+  static CFX_PtrArray* GetDataBlocks(CFX_ByteArray* rawCodewords,
+                                     CBC_QRCoderVersion* version,
+                                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
+                                     int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRDataMask.cpp b/xfa/fxbarcode/qrcode/BC_QRDataMask.cpp
new file mode 100644
index 0000000..20f9406
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDataMask.cpp
@@ -0,0 +1,118 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
+#include "xfa/fxbarcode/utils.h"
+
+static int32_t N_DATA_MASKS = 0;
+CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL;
+
+void CBC_QRDataMask::Initialize() {
+  DATA_MASKS = new CFX_PtrArray();
+  N_DATA_MASKS = BuildDataMasks();
+}
+void CBC_QRDataMask::Finalize() {
+  Destroy();
+  delete DATA_MASKS;
+}
+void CBC_QRDataMask::Destroy() {
+  int32_t i;
+  for (i = 0; i < N_DATA_MASKS; i++) {
+    CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i];
+    if (p) {
+      delete p;
+    }
+  }
+}
+void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix* bits,
+                                     int32_t dimension) {
+  for (int32_t i = 0; i < dimension; i++) {
+    for (int32_t j = 0; j < dimension; j++) {
+      if (IsMasked(i, j)) {
+        bits->Flip(j, i);
+      }
+    }
+  }
+}
+CBC_QRDataMask* CBC_QRDataMask::ForReference(int32_t reference, int32_t& e) {
+  if (reference < 0 || reference > 7) {
+    e = BCExceptionReferenceMustBeBetween0And7;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  return (CBC_QRDataMask*)(*DATA_MASKS)[reference];
+}
+class DataMask000 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) { return ((x + y) % 2) == 0; }
+};
+class DataMask001 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x % 2) == 0; }
+};
+class DataMask010 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) { return y % 3 == 0; }
+};
+class DataMask011 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x + y) % 3 == 0; }
+};
+class DataMask100 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) {
+    return (((x >> 1) + (y / 3)) % 2) == 0;
+  }
+};
+class DataMask101 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) {
+    size_t temp = x * y;
+    return (temp % 2) + (temp % 3) == 0;
+  }
+};
+class DataMask110 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) {
+    size_t temp = x * y;
+    return (((temp % 2) + (temp % 3)) % 2) == 0;
+  }
+};
+class DataMask111 : public CBC_QRDataMask {
+ public:
+  FX_BOOL IsMasked(int32_t x, int32_t y) {
+    return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
+  }
+};
+int32_t CBC_QRDataMask::BuildDataMasks() {
+  DATA_MASKS->Add(new DataMask000);
+  DATA_MASKS->Add(new DataMask001);
+  DATA_MASKS->Add(new DataMask010);
+  DATA_MASKS->Add(new DataMask011);
+  DATA_MASKS->Add(new DataMask100);
+  DATA_MASKS->Add(new DataMask101);
+  DATA_MASKS->Add(new DataMask110);
+  DATA_MASKS->Add(new DataMask111);
+  return DATA_MASKS->GetSize();
+}
+CBC_QRDataMask::CBC_QRDataMask() {}
+CBC_QRDataMask::~CBC_QRDataMask() {}
diff --git a/xfa/fxbarcode/qrcode/BC_QRDataMask.h b/xfa/fxbarcode/qrcode/BC_QRDataMask.h
new file mode 100644
index 0000000..5893149
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDataMask.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+
+class CBC_QRDataMask {
+ public:
+  static CFX_PtrArray* DATA_MASKS;
+  CBC_QRDataMask();
+  virtual ~CBC_QRDataMask();
+  static void Initialize();
+  static void Finalize();
+  virtual FX_BOOL IsMasked(int32_t i, int32_t j) = 0;
+  void UnmaskBitMatirx(CBC_CommonBitMatrix* bits, int32_t dimension);
+  static CBC_QRDataMask* ForReference(int32_t reference, int32_t& e);
+  static int32_t BuildDataMasks();
+  static void Destroy();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp b/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp
new file mode 100644
index 0000000..8919c3a
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp
@@ -0,0 +1,273 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
+#include "xfa/fxbarcode/common/BC_CommonBitSource.h"
+#include "xfa/fxbarcode/common/BC_CommonCharacterSetECI.h"
+#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
+#include "xfa/fxbarcode/common/BC_CommonECI.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
+
+const FX_CHAR* CBC_QRDecodedBitStreamParser::UTF_8 = "utf8";
+const FX_CHAR CBC_QRDecodedBitStreamParser::ALPHANUMERIC_CHARS[45] = {
+    '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', ' ', '$', '%', '*', '+', '-', '.', '/', ':'};
+
+CBC_QRDecodedBitStreamParser::CBC_QRDecodedBitStreamParser() {}
+CBC_QRDecodedBitStreamParser::~CBC_QRDecodedBitStreamParser() {}
+CBC_CommonDecoderResult* CBC_QRDecodedBitStreamParser::Decode(
+    CFX_ByteArray* bytes,
+    CBC_QRCoderVersion* version,
+    CBC_QRCoderErrorCorrectionLevel* ecLevel,
+    int32_t byteModeDecode,
+    int32_t& e) {
+  CBC_CommonBitSource bits(bytes);
+  CFX_ByteString result;
+  CBC_CommonCharacterSetECI* currentCharacterSetECI = NULL;
+  FX_BOOL fc1Infact = FALSE;
+  CFX_Int32Array byteSegments;
+  CBC_QRCoderMode* mode = NULL;
+  do {
+    if (bits.Available() < 4) {
+      mode = CBC_QRCoderMode::sTERMINATOR;
+    } else {
+      int32_t iTemp1 = bits.ReadBits(4, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      mode = CBC_QRCoderMode::ForBits(iTemp1, e);
+      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      if (mode == NULL) {
+        e = BCExceptionUnSupportMode;
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      }
+    }
+    if (!(mode == CBC_QRCoderMode::sTERMINATOR)) {
+      if (mode == CBC_QRCoderMode::sFNC1_FIRST_POSITION ||
+          mode == CBC_QRCoderMode::sFNC1_SECOND_POSITION) {
+        fc1Infact = TRUE;
+      } else if (mode == CBC_QRCoderMode::sSTRUCTURED_APPEND) {
+        bits.ReadBits(16, e);
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+      } else if (mode == CBC_QRCoderMode::sECI) {
+        int32_t value = ParseECIValue(&bits, e);
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        currentCharacterSetECI =
+            CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(value);
+      } else {
+        if (mode == CBC_QRCoderMode::sGBK) {
+          bits.ReadBits(4, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        }
+        int32_t numBits = mode->GetCharacterCountBits(version, e);
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        int32_t count = bits.ReadBits(numBits, e);
+        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        if (mode == CBC_QRCoderMode::sNUMERIC) {
+          DecodeNumericSegment(&bits, result, count, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        } else if (mode == CBC_QRCoderMode::sALPHANUMERIC) {
+          DecodeAlphanumericSegment(&bits, result, count, fc1Infact, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        } else if (mode == CBC_QRCoderMode::sBYTE) {
+          DecodeByteSegment(&bits, result, count, currentCharacterSetECI,
+                            &byteSegments, byteModeDecode, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        } else if (mode == CBC_QRCoderMode::sGBK) {
+          DecodeGBKSegment(&bits, result, count, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        } else if (mode == CBC_QRCoderMode::sKANJI) {
+          DecodeKanjiSegment(&bits, result, count, e);
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        } else {
+          e = BCExceptionUnSupportMode;
+          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+        }
+      }
+    }
+  } while (!(mode == CBC_QRCoderMode::sTERMINATOR));
+  CBC_CommonDecoderResult* tempCd = new CBC_CommonDecoderResult();
+  tempCd->Init(*bytes, result, byteSegments, ecLevel, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return tempCd;
+}
+void CBC_QRDecodedBitStreamParser::DecodeGBKSegment(CBC_CommonBitSource* bits,
+                                                    CFX_ByteString& result,
+                                                    int32_t count,
+                                                    int32_t& e) {
+  CFX_ByteString buffer;
+  while (count > 0) {
+    int32_t twoBytes = bits->ReadBits(13, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    int32_t assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060);
+    if (assembledTwoBytes <= 0x0095d) {
+      assembledTwoBytes += 0x0a1a1;
+    } else {
+      assembledTwoBytes += 0x0a6a1;
+    }
+    buffer += (uint8_t)(assembledTwoBytes >> 8);
+    buffer += (uint8_t)assembledTwoBytes;
+    count--;
+  }
+  CBC_UtilCodingConvert::LocaleToUtf8(buffer, result);
+}
+void CBC_QRDecodedBitStreamParser::DecodeKanjiSegment(CBC_CommonBitSource* bits,
+                                                      CFX_ByteString& result,
+                                                      int32_t count,
+                                                      int32_t& e) {
+  CFX_ByteString buffer;
+  while (count > 0) {
+    int32_t twoBytes = bits->ReadBits(13, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    int32_t assembledTwoBytes = ((twoBytes / 0x0c0) << 8) | (twoBytes % 0x0c0);
+    if (assembledTwoBytes <= 0x01f00) {
+      assembledTwoBytes += 0x08140;
+    } else {
+      assembledTwoBytes += 0x0c140;
+    }
+    buffer += (uint8_t)(assembledTwoBytes >> 8);
+    buffer += (uint8_t)assembledTwoBytes;
+    count--;
+  }
+  CBC_UtilCodingConvert::LocaleToUtf8(buffer, result);
+}
+void CBC_QRDecodedBitStreamParser::DecodeByteSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t count,
+    CBC_CommonCharacterSetECI* currentCharacterSetECI,
+    CFX_Int32Array* byteSegments,
+    int32_t byteModeDecode,
+    int32_t& e) {
+  if (count < 0) {
+    e = BCExceptionNotFound;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  if ((count << 3) > bits->Available()) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  uint8_t* readBytes = FX_Alloc(uint8_t, count);
+  FXSYS_memset(readBytes, 0x00, count);
+  for (int32_t i = 0; i < count; i++) {
+    readBytes[i] = (uint8_t)bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+  }
+  CFX_ByteString bs(readBytes, count);
+  result += bs;
+  FX_Free(readBytes);
+}
+void CBC_QRDecodedBitStreamParser::DecodeAlphanumericSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t count,
+    FX_BOOL fac1InEffect,
+    int32_t& e) {
+  int32_t start = result.GetLength();
+  while (count > 1) {
+    int32_t nextTwoCharsBits = bits->ReadBits(11, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    BC_FX_ByteString_Append(result, 1,
+                            ALPHANUMERIC_CHARS[nextTwoCharsBits / 45]);
+    BC_FX_ByteString_Append(result, 1,
+                            ALPHANUMERIC_CHARS[nextTwoCharsBits % 45]);
+    count -= 2;
+  }
+  if (count == 1) {
+    int32_t itemp = bits->ReadBits(6, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[itemp]);
+  }
+  if (fac1InEffect) {
+    for (int32_t i = start; i < result.GetLength(); i++) {
+      if (result[i] == '%') {
+        if ((i < result.GetLength() - 1) && result[i + 1] == '%') {
+          result.Delete(i + 1, 1);
+        } else {
+          result.SetAt(i, (FX_CHAR)0x1d);
+        }
+      }
+    }
+  }
+}
+void CBC_QRDecodedBitStreamParser::DecodeNumericSegment(
+    CBC_CommonBitSource* bits,
+    CFX_ByteString& result,
+    int32_t count,
+    int32_t& e) {
+  while (count >= 3) {
+    int32_t threeDigitsBits = bits->ReadBits(10, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (threeDigitsBits >= 1000) {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    BC_FX_ByteString_Append(result, 1,
+                            ALPHANUMERIC_CHARS[threeDigitsBits / 100]);
+    BC_FX_ByteString_Append(result, 1,
+                            ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]);
+    BC_FX_ByteString_Append(result, 1,
+                            ALPHANUMERIC_CHARS[threeDigitsBits % 10]);
+    count -= 3;
+  }
+  if (count == 2) {
+    int32_t twoDigitBits = bits->ReadBits(7, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (twoDigitBits >= 100) {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits / 10]);
+    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits % 10]);
+  } else if (count == 1) {
+    int32_t digitBits = bits->ReadBits(4, e);
+    BC_EXCEPTION_CHECK_ReturnVoid(e);
+    if (digitBits >= 10) {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[digitBits]);
+  }
+}
+const CFX_ByteString CBC_QRDecodedBitStreamParser::GuessEncoding(
+    CFX_ByteArray* bytes) {
+  return *UTF_8;
+}
+int32_t CBC_QRDecodedBitStreamParser::ParseECIValue(CBC_CommonBitSource* bits,
+                                                    int32_t& e) {
+  int32_t firstByte = bits->ReadBits(8, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  if ((firstByte & 0x80) == 0) {
+    return firstByte & 0x7f;
+  } else if ((firstByte & 0xc0) == 0x80) {
+    int32_t secondByte = bits->ReadBits(8, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    return ((firstByte & 0x3f) << 8) | secondByte;
+  } else if ((firstByte & 0xe0) == 0xc0) {
+    int32_t secondThirdByte = bits->ReadBits(16, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    return ((firstByte & 0x1f) << 16) | secondThirdByte;
+  }
+  e = BCExceptionBadECI;
+  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+  return 0;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h b/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h
new file mode 100644
index 0000000..0943bc0
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
+
+class CBC_CommonDecoderResult;
+class CBC_QRCoderErrorCorrectionLevel;
+class CBC_CommonBitSource;
+class CBC_QRCoderVersion;
+class CBC_CommonCharacterSetECI;
+class CBC_QRDecodedBitStreamParser {
+ private:
+  static const FX_CHAR ALPHANUMERIC_CHARS[45];
+  static const FX_CHAR* UTF_8;
+  CBC_QRDecodedBitStreamParser();
+
+ public:
+  virtual ~CBC_QRDecodedBitStreamParser();
+  static CBC_CommonDecoderResult* Decode(
+      CFX_ByteArray* bytes,
+      CBC_QRCoderVersion* version,
+      CBC_QRCoderErrorCorrectionLevel* ecLevel,
+      int32_t byteModeDecode,
+      int32_t& e);
+
+  static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes);
+  static int32_t ParseECIValue(CBC_CommonBitSource* bits, int32_t& e);
+  static void DecodeGBKSegment(CBC_CommonBitSource* bits,
+                               CFX_ByteString& result,
+                               int32_t count,
+                               int32_t& e);
+  static void DecodeKanjiSegment(CBC_CommonBitSource* bits,
+                                 CFX_ByteString& result,
+                                 int32_t count,
+                                 int32_t& e);
+  static void DecodeNumericSegment(CBC_CommonBitSource* bits,
+                                   CFX_ByteString& result,
+                                   int32_t count,
+                                   int32_t& e);
+  static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits,
+                                        CFX_ByteString& result,
+                                        int32_t count,
+                                        FX_BOOL fac1InEffect,
+                                        int32_t& e);
+  static void DecodeByteSegment(
+      CBC_CommonBitSource* bits,
+      CFX_ByteString& result,
+      int32_t count,
+      CBC_CommonCharacterSetECI* currentCharacterSetECI,
+      CFX_Int32Array* byteSegments,
+      int32_t byteModeDecode,
+      int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRDetector.cpp b/xfa/fxbarcode/qrcode/BC_QRDetector.cpp
new file mode 100644
index 0000000..030ee43
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDetector.cpp
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRDetector.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h"
+#include "xfa/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
+#include "xfa/fxbarcode/qrcode/BC_QRGridSampler.h"
+
+CBC_QRDetector::CBC_QRDetector(CBC_CommonBitMatrix* image) : m_image(image) {}
+CBC_QRDetector::~CBC_QRDetector() {}
+CBC_QRDetectorResult* CBC_QRDetector::Detect(int32_t hints, int32_t& e) {
+  CBC_QRFinderPatternFinder finder(m_image);
+  std::unique_ptr<CBC_QRFinderPatternInfo> info(finder.Find(hints, e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRDetectorResult* qdr = ProcessFinderPatternInfo(info.get(), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return qdr;
+}
+CBC_QRDetectorResult* CBC_QRDetector::ProcessFinderPatternInfo(
+    CBC_QRFinderPatternInfo* info,
+    int32_t& e) {
+  std::unique_ptr<CBC_QRFinderPattern> topLeft(info->GetTopLeft());
+  std::unique_ptr<CBC_QRFinderPattern> topRight(info->GetTopRight());
+  std::unique_ptr<CBC_QRFinderPattern> bottomLeft(info->GetBottomLeft());
+  FX_FLOAT moduleSize =
+      CalculateModuleSize(topLeft.get(), topRight.get(), bottomLeft.get());
+  if (moduleSize < 1.0f) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  int32_t dimension = ComputeDimension(topLeft.get(), topRight.get(),
+                                       bottomLeft.get(), moduleSize, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CBC_QRCoderVersion* provisionalVersion =
+      CBC_QRCoderVersion::GetProvisionalVersionForDimension(dimension, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  int32_t modulesBetweenFPCenters =
+      provisionalVersion->GetDimensionForVersion() - 7;
+  CBC_QRAlignmentPattern* alignmentPattern = NULL;
+  if (provisionalVersion->GetAlignmentPatternCenters()->GetSize() > 0) {
+    FX_FLOAT bottomRightX =
+        topRight->GetX() - topLeft->GetX() + bottomLeft->GetX();
+    FX_FLOAT bottomRightY =
+        topRight->GetY() - topLeft->GetY() + bottomLeft->GetY();
+    FX_FLOAT correctionToTopLeft =
+        1.0f - 3.0f / (FX_FLOAT)modulesBetweenFPCenters;
+    FX_FLOAT xtemp = (topLeft->GetX() +
+                      correctionToTopLeft * (bottomRightX - topLeft->GetX()));
+    int32_t estAlignmentX = (int32_t)xtemp;
+    FX_FLOAT ytemp = (topLeft->GetY() +
+                      correctionToTopLeft * (bottomRightY - topLeft->GetY()));
+    int32_t estAlignmentY = (int32_t)ytemp;
+    for (int32_t i = 4; i <= 16; i <<= 1) {
+      CBC_QRAlignmentPattern* temp = FindAlignmentInRegion(
+          moduleSize, estAlignmentX, estAlignmentY, (FX_FLOAT)i, e);
+      alignmentPattern = temp;
+      break;
+    }
+  }
+  CBC_CommonBitMatrix* bits =
+      SampleGrid(m_image, topLeft.get(), topRight.get(), bottomLeft.get(),
+                 (CBC_ResultPoint*)(alignmentPattern), dimension, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  CFX_PtrArray* points = new CFX_PtrArray;
+  if (alignmentPattern == NULL) {
+    points->Add(bottomLeft.release());
+    points->Add(topLeft.release());
+    points->Add(topRight.release());
+  } else {
+    points->Add(bottomLeft.release());
+    points->Add(topLeft.release());
+    points->Add(topRight.release());
+    points->Add(alignmentPattern);
+  }
+  return new CBC_QRDetectorResult(bits, points);
+}
+CBC_CommonBitMatrix* CBC_QRDetector::SampleGrid(
+    CBC_CommonBitMatrix* image,
+    CBC_ResultPoint* topLeft,
+    CBC_ResultPoint* topRight,
+    CBC_ResultPoint* bottomLeft,
+    CBC_ResultPoint* alignmentPattern,
+    int32_t dimension,
+    int32_t& e) {
+  FX_FLOAT dimMinusThree = (FX_FLOAT)dimension - 3.5f;
+  FX_FLOAT bottomRightX;
+  FX_FLOAT bottomRightY;
+  FX_FLOAT sourceBottomRightX;
+  FX_FLOAT sourceBottomRightY;
+  if (alignmentPattern) {
+    bottomRightX = alignmentPattern->GetX();
+    bottomRightY = alignmentPattern->GetY();
+    sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f;
+  } else {
+    bottomRightX = (topRight->GetX() - topLeft->GetX()) + bottomLeft->GetX();
+    bottomRightY = (topRight->GetY() - topLeft->GetY()) + bottomLeft->GetY();
+    sourceBottomRightX = sourceBottomRightY = dimMinusThree;
+  }
+  CBC_QRGridSampler& sampler = CBC_QRGridSampler::GetInstance();
+  CBC_CommonBitMatrix* cbm = sampler.SampleGrid(
+      image, dimension, dimension, 3.5f, 3.5f, dimMinusThree, 3.5f,
+      sourceBottomRightX, sourceBottomRightY, 3.5f, dimMinusThree,
+      topLeft->GetX(), topLeft->GetY(), topRight->GetX(), topRight->GetY(),
+      bottomRightX, bottomRightY, bottomLeft->GetX(), bottomLeft->GetY(), e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return cbm;
+}
+int32_t CBC_QRDetector::ComputeDimension(CBC_ResultPoint* topLeft,
+                                         CBC_ResultPoint* topRight,
+                                         CBC_ResultPoint* bottomLeft,
+                                         FX_FLOAT moduleSize,
+                                         int32_t& e) {
+  int32_t tltrCentersDimension = Round(
+      CBC_QRFinderPatternFinder::Distance(topLeft, topRight) / moduleSize);
+  int32_t tlblCentersDimension = Round(
+      CBC_QRFinderPatternFinder::Distance(topLeft, bottomLeft) / moduleSize);
+  int32_t dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;
+  switch (dimension & 0x03) {
+    case 0:
+      dimension++;
+      break;
+    case 2:
+      dimension--;
+      break;
+    case 3: {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
+    }
+  }
+  return dimension;
+}
+FX_FLOAT CBC_QRDetector::CalculateModuleSize(CBC_ResultPoint* topLeft,
+                                             CBC_ResultPoint* topRight,
+                                             CBC_ResultPoint* bottomLeft) {
+  return (CalculateModuleSizeOneWay(topLeft, topRight) +
+          CalculateModuleSizeOneWay(topLeft, bottomLeft)) /
+         2.0f;
+}
+FX_FLOAT CBC_QRDetector::CalculateModuleSizeOneWay(
+    CBC_ResultPoint* pattern,
+    CBC_ResultPoint* otherPattern) {
+  FX_FLOAT moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays(
+      (int32_t)pattern->GetX(), (int32_t)pattern->GetY(),
+      (int32_t)otherPattern->GetX(), (int32_t)otherPattern->GetY());
+  FX_FLOAT moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays(
+      (int32_t)otherPattern->GetX(), (int32_t)otherPattern->GetY(),
+      (int32_t)pattern->GetX(), (int32_t)pattern->GetY());
+  if (FXSYS_isnan(moduleSizeEst1)) {
+    return moduleSizeEst2;
+  }
+  if (FXSYS_isnan(moduleSizeEst2)) {
+    return moduleSizeEst1;
+  }
+  return (moduleSizeEst1 + moduleSizeEst2) / 14.0f;
+}
+int32_t CBC_QRDetector::Round(FX_FLOAT d) {
+  return (int32_t)(d + 0.5f);
+}
+FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRunBothWays(int32_t fromX,
+                                                          int32_t fromY,
+                                                          int32_t toX,
+                                                          int32_t toY) {
+  FX_FLOAT result = SizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY);
+  int32_t otherToX = fromX - (toX - fromX);
+  if (otherToX < 0) {
+    otherToX = -1;
+  } else if (otherToX >= m_image->GetWidth()) {
+    otherToX = m_image->GetWidth();
+  }
+  int32_t otherToY = fromY - (toY - fromY);
+  if (otherToY < 0) {
+    otherToY = -1;
+  } else if (otherToY >= m_image->GetHeight()) {
+    otherToY = m_image->GetHeight();
+  }
+  result += SizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY);
+  return result - 1.0f;
+}
+FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRun(int32_t fromX,
+                                                  int32_t fromY,
+                                                  int32_t toX,
+                                                  int32_t toY) {
+  FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX);
+  if (steep) {
+    int32_t temp = fromX;
+    fromX = fromY;
+    fromY = temp;
+    temp = toX;
+    toX = toY;
+    toY = temp;
+  }
+  int32_t dx = FXSYS_abs(toX - fromX);
+  int32_t dy = FXSYS_abs(toY - fromY);
+  int32_t error = -dx >> 1;
+  int32_t ystep = fromY < toY ? 1 : -1;
+  int32_t xstep = fromX < toX ? 1 : -1;
+  int32_t state = 0;
+  for (int32_t x = fromX, y = fromY; x != toX; x += xstep) {
+    int32_t realX = steep ? y : x;
+    int32_t realY = steep ? x : y;
+    if (state == 1) {
+      if (m_image->Get(realX, realY)) {
+        state++;
+      }
+    } else {
+      if (!m_image->Get(realX, realY)) {
+        state++;
+      }
+    }
+    if (state == 3) {
+      int32_t diffX = x - fromX;
+      int32_t diffY = y - fromY;
+      return (FX_FLOAT)sqrt((double)(diffX * diffX + diffY * diffY));
+    }
+    error += dy;
+    if (error > 0) {
+      y += ystep;
+      error -= dx;
+    }
+  }
+  int32_t diffX = toX - fromX;
+  int32_t diffY = toY - fromY;
+  return (FX_FLOAT)sqrt((double)(diffX * diffX + diffY * diffY));
+}
+CBC_QRAlignmentPattern* CBC_QRDetector::FindAlignmentInRegion(
+    FX_FLOAT overallEstModuleSize,
+    int32_t estAlignmentX,
+    int32_t estAlignmentY,
+    FX_FLOAT allowanceFactor,
+    int32_t& e) {
+  int32_t allowance = (int32_t)(allowanceFactor * overallEstModuleSize);
+  int32_t alignmentAreaLeftX = std::max(0, estAlignmentX - allowance);
+  int32_t alignmentAreaRightX =
+      std::min(m_image->GetWidth() - 1, estAlignmentX + allowance);
+  if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  int32_t alignmentAreaTopY = std::max(0, estAlignmentY - allowance);
+  int32_t alignmentAreaBottomY =
+      std::min(m_image->GetHeight() - 1, estAlignmentY + allowance);
+  CBC_QRAlignmentPatternFinder alignmentFinder(
+      m_image, alignmentAreaLeftX, alignmentAreaTopY,
+      alignmentAreaRightX - alignmentAreaLeftX,
+      alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize);
+  CBC_QRAlignmentPattern* qap = alignmentFinder.Find(e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  return qap;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRDetector.h b/xfa/fxbarcode/qrcode/BC_QRDetector.h
new file mode 100644
index 0000000..4c17184
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDetector.h
@@ -0,0 +1,63 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_ResultPoint;
+class CBC_CommonBitMatrix;
+class CBC_QRDetectorResult;
+class CBC_QRFinderPatternInfo;
+class CBC_QRAlignmentPattern;
+
+class CBC_QRDetector {
+ private:
+  CBC_CommonBitMatrix* m_image;
+
+ public:
+  CBC_QRDetector(CBC_CommonBitMatrix* image);
+  virtual ~CBC_QRDetector();
+
+  CBC_CommonBitMatrix* GetImage();
+  CBC_QRDetectorResult* Detect(int32_t hints, int32_t& e);
+  CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo* info,
+                                                 int32_t& e);
+  FX_FLOAT CalculateModuleSize(CBC_ResultPoint* topLeft,
+                               CBC_ResultPoint* topRight,
+                               CBC_ResultPoint* bottomLeft);
+  FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint* pattern,
+                                     CBC_ResultPoint* otherPattern);
+  FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(int32_t fromX,
+                                            int32_t fromY,
+                                            int32_t toX,
+                                            int32_t toY);
+  FX_FLOAT SizeOfBlackWhiteBlackRun(int32_t fromX,
+                                    int32_t fromY,
+                                    int32_t toX,
+                                    int32_t toY);
+  CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize,
+                                                int32_t estAlignmentX,
+                                                int32_t estAlignmentY,
+                                                FX_FLOAT allowanceFactor,
+                                                int32_t& e);
+  static int32_t Round(FX_FLOAT d);
+  static int32_t ComputeDimension(CBC_ResultPoint* topLeft,
+                                  CBC_ResultPoint* topRight,
+                                  CBC_ResultPoint* bottomLeft,
+                                  FX_FLOAT moduleSize,
+                                  int32_t& e);
+  static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
+                                         CBC_ResultPoint* topLeft,
+                                         CBC_ResultPoint* topRight,
+                                         CBC_ResultPoint* bottomLeft,
+                                         CBC_ResultPoint* alignmentPattern,
+                                         int32_t dimension,
+                                         int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRDetectorResult.cpp b/xfa/fxbarcode/qrcode/BC_QRDetectorResult.cpp
new file mode 100644
index 0000000..18e5d9a
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDetectorResult.cpp
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_QRDetectorResult.h"
+
+CBC_QRDetectorResult::CBC_QRDetectorResult(CBC_CommonBitMatrix* bits,
+                                           CFX_PtrArray* points)
+    : m_bits(bits), m_points(points) {}
+CBC_QRDetectorResult::~CBC_QRDetectorResult() {
+  for (int32_t i = 0; i < m_points->GetSize(); i++) {
+    delete (CBC_ResultPoint*)(*m_points)[i];
+  }
+  m_points->RemoveAll();
+  delete m_points;
+  delete m_bits;
+}
+CBC_CommonBitMatrix* CBC_QRDetectorResult::GetBits() {
+  return m_bits;
+}
+CFX_PtrArray* CBC_QRDetectorResult::GetPoints() {
+  return m_points;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRDetectorResult.h b/xfa/fxbarcode/qrcode/BC_QRDetectorResult.h
new file mode 100644
index 0000000..c6145ec
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRDetectorResult.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+
+class CBC_QRDetectorResult {
+ private:
+  CBC_CommonBitMatrix* m_bits;
+  CFX_PtrArray* m_points;
+
+ public:
+  CBC_QRDetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points);
+  virtual ~CBC_QRDetectorResult();
+  CBC_CommonBitMatrix* GetBits();
+  CFX_PtrArray* GetPoints();
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRFinderPattern.cpp b/xfa/fxbarcode/qrcode/BC_QRFinderPattern.cpp
new file mode 100644
index 0000000..5039920
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRFinderPattern.cpp
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h"
+
+CBC_QRFinderPattern::CBC_QRFinderPattern(FX_FLOAT x,
+                                         FX_FLOAT posY,
+                                         FX_FLOAT estimatedModuleSize)
+    : CBC_ResultPoint(x, posY),
+      m_estimatedModuleSize(estimatedModuleSize),
+      m_count(1) {}
+CBC_QRFinderPattern::~CBC_QRFinderPattern() {
+  m_count = 0;
+  m_x = 0.0f;
+  m_y = 0.0f;
+  m_estimatedModuleSize = 0.0f;
+}
+CBC_QRFinderPattern* CBC_QRFinderPattern::Clone() {
+  CBC_QRFinderPattern* temp =
+      new CBC_QRFinderPattern(m_x, m_y, m_estimatedModuleSize);
+  temp->m_count = m_count;
+  return temp;
+}
+FX_FLOAT CBC_QRFinderPattern::GetEstimatedModuleSize() {
+  return m_estimatedModuleSize;
+}
+int32_t CBC_QRFinderPattern::GetCount() {
+  return m_count;
+}
+void CBC_QRFinderPattern::IncrementCount() {
+  m_count++;
+}
+FX_BOOL CBC_QRFinderPattern::AboutEquals(FX_FLOAT moduleSize,
+                                         FX_FLOAT i,
+                                         FX_FLOAT j) {
+  if ((fabs(i - GetY()) <= moduleSize) && (fabs(j - GetX()) <= moduleSize)) {
+    FX_FLOAT moduleSizeDiff = fabs(moduleSize - m_estimatedModuleSize);
+    return (moduleSizeDiff <= 1.0f) ||
+           (moduleSizeDiff / m_estimatedModuleSize <= 1.0f);
+  }
+  return false;
+}
+FX_FLOAT CBC_QRFinderPattern::GetX() {
+  return m_x;
+}
+FX_FLOAT CBC_QRFinderPattern::GetY() {
+  return m_y;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRFinderPattern.h b/xfa/fxbarcode/qrcode/BC_QRFinderPattern.h
new file mode 100644
index 0000000..bf3adff
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRFinderPattern.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
+
+class CBC_ResultPoint;
+class CBC_QRFinderPattern;
+class CBC_QRFinderPattern : public CBC_ResultPoint {
+ private:
+  FX_FLOAT m_estimatedModuleSize;
+  int32_t m_count;
+
+ public:
+  CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize);
+  virtual ~CBC_QRFinderPattern();
+
+  int32_t GetCount();
+  FX_FLOAT GetX();
+  FX_FLOAT GetY();
+  FX_FLOAT GetEstimatedModuleSize();
+  void IncrementCount();
+  FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j);
+  CBC_QRFinderPattern* Clone();
+};
+typedef CBC_QRFinderPattern FinderPattern;
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp b/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp
new file mode 100644
index 0000000..5ccbd98
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp
@@ -0,0 +1,477 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
+
+#include <memory>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxbarcode/BC_ResultPoint.h"
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h"
+#include "xfa/fxbarcode/qrcode/BC_QRFinderPattern.h"
+#include "xfa/fxbarcode/utils.h"
+
+const int32_t CBC_QRFinderPatternFinder::CENTER_QUORUM = 2;
+const int32_t CBC_QRFinderPatternFinder::MIN_SKIP = 3;
+const int32_t CBC_QRFinderPatternFinder::MAX_MODULES = 57;
+const int32_t CBC_QRFinderPatternFinder::INTEGER_MATH_SHIFT = 8;
+
+CBC_QRFinderPatternFinder::CBC_QRFinderPatternFinder(
+    CBC_CommonBitMatrix* image) {
+  m_image = image;
+  m_crossCheckStateCount.SetSize(5);
+  m_hasSkipped = FALSE;
+}
+CBC_QRFinderPatternFinder::~CBC_QRFinderPatternFinder() {
+  for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) {
+    delete (CBC_QRFinderPattern*)m_possibleCenters[i];
+  }
+  m_possibleCenters.RemoveAll();
+}
+class ClosestToAverageComparator {
+ private:
+  FX_FLOAT m_averageModuleSize;
+
+ public:
+  ClosestToAverageComparator(FX_FLOAT averageModuleSize)
+      : m_averageModuleSize(averageModuleSize) {}
+  int32_t operator()(FinderPattern* a, FinderPattern* b) {
+    FX_FLOAT dA =
+        (FX_FLOAT)fabs(a->GetEstimatedModuleSize() - m_averageModuleSize);
+    FX_FLOAT dB =
+        (FX_FLOAT)fabs(b->GetEstimatedModuleSize() - m_averageModuleSize);
+    return dA < dB ? -1 : dA > dB ? 1 : 0;
+  }
+};
+class CenterComparator {
+ public:
+  int32_t operator()(FinderPattern* a, FinderPattern* b) {
+    return b->GetCount() - a->GetCount();
+  }
+};
+CBC_CommonBitMatrix* CBC_QRFinderPatternFinder::GetImage() {
+  return m_image;
+}
+CFX_Int32Array& CBC_QRFinderPatternFinder::GetCrossCheckStateCount() {
+  m_crossCheckStateCount[0] = 0;
+  m_crossCheckStateCount[1] = 0;
+  m_crossCheckStateCount[2] = 0;
+  m_crossCheckStateCount[3] = 0;
+  m_crossCheckStateCount[4] = 0;
+  return m_crossCheckStateCount;
+}
+CFX_PtrArray* CBC_QRFinderPatternFinder::GetPossibleCenters() {
+  return &m_possibleCenters;
+}
+CBC_QRFinderPatternInfo* CBC_QRFinderPatternFinder::Find(int32_t hint,
+                                                         int32_t& e) {
+  int32_t maxI = m_image->GetHeight();
+  int32_t maxJ = m_image->GetWidth();
+  int32_t iSkip = (3 * maxI) / (4 * MAX_MODULES);
+  if (iSkip < MIN_SKIP || 0) {
+    iSkip = MIN_SKIP;
+  }
+  FX_BOOL done = FALSE;
+  CFX_Int32Array stateCount;
+  stateCount.SetSize(5);
+  for (int32_t i = iSkip - 1; i < maxI && !done; i += iSkip) {
+    stateCount[0] = 0;
+    stateCount[1] = 0;
+    stateCount[2] = 0;
+    stateCount[3] = 0;
+    stateCount[4] = 0;
+    int32_t currentState = 0;
+    for (int32_t j = 0; j < maxJ; j++) {
+      if (m_image->Get(j, i)) {
+        if ((currentState & 1) == 1) {
+          currentState++;
+        }
+        stateCount[currentState]++;
+      } else {
+        if ((currentState & 1) == 0) {
+          if (currentState == 4) {
+            if (FoundPatternCross(stateCount)) {
+              FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, j);
+              if (confirmed) {
+                iSkip = 2;
+                if (m_hasSkipped) {
+                  done = HaveMultiplyConfirmedCenters();
+                } else {
+                  int32_t rowSkip = FindRowSkip();
+                  if (rowSkip > stateCount[2]) {
+                    i += rowSkip - stateCount[2] - iSkip;
+                    j = maxJ - 1;
+                  }
+                }
+              } else {
+                do {
+                  j++;
+                } while (j < maxJ && !m_image->Get(j, i));
+                j--;
+              }
+              currentState = 0;
+              stateCount[0] = 0;
+              stateCount[1] = 0;
+              stateCount[2] = 0;
+              stateCount[3] = 0;
+              stateCount[4] = 0;
+            } else {
+              stateCount[0] = stateCount[2];
+              stateCount[1] = stateCount[3];
+              stateCount[2] = stateCount[4];
+              stateCount[3] = 1;
+              stateCount[4] = 0;
+              currentState = 3;
+            }
+          } else {
+            stateCount[++currentState]++;
+          }
+        } else {
+          stateCount[currentState]++;
+        }
+      }
+    }
+    if (FoundPatternCross(stateCount)) {
+      FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, maxJ);
+      if (confirmed) {
+        iSkip = stateCount[0];
+        if (m_hasSkipped) {
+          done = HaveMultiplyConfirmedCenters();
+        }
+      }
+    }
+  }
+  std::unique_ptr<CFX_PtrArray> patternInfo(SelectBestpatterns(e));
+  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  OrderBestPatterns(patternInfo.get());
+  return new CBC_QRFinderPatternInfo(patternInfo.get());
+}
+void CBC_QRFinderPatternFinder::OrderBestPatterns(CFX_PtrArray* patterns) {
+  FX_FLOAT abDistance = Distance((CBC_ResultPoint*)(*patterns)[0],
+                                 (CBC_ResultPoint*)(*patterns)[1]);
+  FX_FLOAT bcDistance = Distance((CBC_ResultPoint*)(*patterns)[1],
+                                 (CBC_ResultPoint*)(*patterns)[2]);
+  FX_FLOAT acDistance = Distance((CBC_ResultPoint*)(*patterns)[0],
+                                 (CBC_ResultPoint*)(*patterns)[2]);
+  CBC_QRFinderPattern *topLeft, *topRight, *bottomLeft;
+  if (bcDistance >= abDistance && bcDistance >= acDistance) {
+    topLeft = (CBC_QRFinderPattern*)(*patterns)[0];
+    topRight = (CBC_QRFinderPattern*)(*patterns)[1];
+    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[2];
+  } else if (acDistance >= bcDistance && acDistance >= abDistance) {
+    topLeft = (CBC_QRFinderPattern*)(*patterns)[1];
+    topRight = (CBC_QRFinderPattern*)(*patterns)[0];
+    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[2];
+  } else {
+    topLeft = (CBC_QRFinderPattern*)(*patterns)[2];
+    topRight = (CBC_QRFinderPattern*)(*patterns)[0];
+    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[1];
+  }
+  if ((bottomLeft->GetY() - topLeft->GetY()) *
+          (topRight->GetX() - topLeft->GetX()) <
+      (bottomLeft->GetX() - topLeft->GetX()) *
+          (topRight->GetY() - topLeft->GetY())) {
+    CBC_QRFinderPattern* temp = topRight;
+    topRight = bottomLeft;
+    bottomLeft = temp;
+  }
+  (*patterns)[0] = bottomLeft;
+  (*patterns)[1] = topLeft;
+  (*patterns)[2] = topRight;
+}
+FX_FLOAT CBC_QRFinderPatternFinder::Distance(CBC_ResultPoint* point1,
+                                             CBC_ResultPoint* point2) {
+  FX_FLOAT dx = point1->GetX() - point2->GetX();
+  FX_FLOAT dy = point1->GetY() - point2->GetY();
+  return (FX_FLOAT)FXSYS_sqrt(dx * dx + dy * dy);
+}
+FX_FLOAT CBC_QRFinderPatternFinder::CenterFromEnd(
+    const CFX_Int32Array& stateCount,
+    int32_t end) {
+  return (FX_FLOAT)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f;
+}
+FX_BOOL CBC_QRFinderPatternFinder::FoundPatternCross(
+    const CFX_Int32Array& stateCount) {
+  int32_t totalModuleSize = 0;
+  for (int32_t i = 0; i < 5; i++) {
+    int32_t count = stateCount[i];
+    if (count == 0) {
+      return FALSE;
+    }
+    totalModuleSize += count;
+  }
+  if (totalModuleSize < 7) {
+    return FALSE;
+  }
+  int32_t moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7;
+  int32_t maxVariance = moduleSize / 2;
+  return FXSYS_abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) <
+             maxVariance &&
+         FXSYS_abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) <
+             maxVariance &&
+         FXSYS_abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) <
+             3 * maxVariance &&
+         FXSYS_abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) <
+             maxVariance &&
+         FXSYS_abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) <
+             maxVariance;
+}
+FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckVertical(
+    int32_t startI,
+    int32_t centerJ,
+    int32_t maxCount,
+    int32_t originalStateCountTotal) {
+  CBC_CommonBitMatrix* image = m_image;
+  int32_t maxI = image->GetHeight();
+  CFX_Int32Array& stateCount = GetCrossCheckStateCount();
+  int32_t i = startI;
+  while (i >= 0 && image->Get(centerJ, i)) {
+    stateCount[2]++;
+    i--;
+  }
+  if (i < 0) {
+    return FXSYS_nan();
+  }
+  while (i >= 0 && !image->Get(centerJ, i) && stateCount[1] <= maxCount) {
+    stateCount[1]++;
+    i--;
+  }
+  if (i < 0 || stateCount[1] > maxCount) {
+    return FXSYS_nan();
+  }
+  while (i >= 0 && image->Get(centerJ, i) && stateCount[0] <= maxCount) {
+    stateCount[0]++;
+    i--;
+  }
+  if (stateCount[0] > maxCount) {
+    return FXSYS_nan();
+  }
+  i = startI + 1;
+  while (i < maxI && image->Get(centerJ, i)) {
+    stateCount[2]++;
+    i++;
+  }
+  if (i == maxI) {
+    return FXSYS_nan();
+  }
+  while (i < maxI && !image->Get(centerJ, i) && stateCount[3] < maxCount) {
+    stateCount[3]++;
+    i++;
+  }
+  if (i == maxI || stateCount[3] >= maxCount) {
+    return FXSYS_nan();
+  }
+  while (i < maxI && image->Get(centerJ, i) && stateCount[4] < maxCount) {
+    stateCount[4]++;
+    i++;
+  }
+  if (stateCount[4] >= maxCount) {
+    return FXSYS_nan();
+  }
+  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
+                            stateCount[3] + stateCount[4];
+  if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >=
+      originalStateCountTotal) {
+    return FXSYS_nan();
+  }
+  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i)
+                                       : FXSYS_nan();
+}
+FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckHorizontal(
+    int32_t startJ,
+    int32_t centerI,
+    int32_t maxCount,
+    int32_t originalStateCountTotal) {
+  CBC_CommonBitMatrix* image = m_image;
+  int32_t maxJ = image->GetWidth();
+  CFX_Int32Array& stateCount = GetCrossCheckStateCount();
+  int32_t j = startJ;
+  while (j >= 0 && image->Get(j, centerI)) {
+    stateCount[2]++;
+    j--;
+  }
+  if (j < 0) {
+    return FXSYS_nan();
+  }
+  while (j >= 0 && !image->Get(j, centerI) && stateCount[1] <= maxCount) {
+    stateCount[1]++;
+    j--;
+  }
+  if (j < 0 || stateCount[1] > maxCount) {
+    return FXSYS_nan();
+  }
+  while (j >= 0 && image->Get(j, centerI) && stateCount[0] <= maxCount) {
+    stateCount[0]++;
+    j--;
+  }
+  if (stateCount[0] > maxCount) {
+    return FXSYS_nan();
+  }
+  j = startJ + 1;
+  while (j < maxJ && image->Get(j, centerI)) {
+    stateCount[2]++;
+    j++;
+  }
+  if (j == maxJ) {
+    return FXSYS_nan();
+  }
+  while (j < maxJ && !image->Get(j, centerI) && stateCount[3] < maxCount) {
+    stateCount[3]++;
+    j++;
+  }
+  if (j == maxJ || stateCount[3] >= maxCount) {
+    return FXSYS_nan();
+  }
+  while (j < maxJ && image->Get(j, centerI) && stateCount[4] < maxCount) {
+    stateCount[4]++;
+    j++;
+  }
+  if (stateCount[4] >= maxCount) {
+    return FXSYS_nan();
+  }
+  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
+                            stateCount[3] + stateCount[4];
+  if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >=
+      originalStateCountTotal) {
+    return FXSYS_nan();
+  }
+  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j)
+                                       : FXSYS_nan();
+}
+FX_BOOL CBC_QRFinderPatternFinder::HandlePossibleCenter(
+    const CFX_Int32Array& stateCount,
+    int32_t i,
+    int32_t j) {
+  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
+                            stateCount[3] + stateCount[4];
+  FX_FLOAT centerJ = CenterFromEnd(stateCount, j);
+  FX_FLOAT centerI =
+      CrossCheckVertical(i, (int32_t)centerJ, stateCount[2], stateCountTotal);
+  if (!FXSYS_isnan(centerI)) {
+    centerJ = CrossCheckHorizontal((int32_t)centerJ, (int32_t)centerI,
+                                   stateCount[2], stateCountTotal);
+    if (!FXSYS_isnan(centerJ)) {
+      FX_FLOAT estimatedModuleSize = (FX_FLOAT)stateCountTotal / 7.0f;
+      FX_BOOL found = FALSE;
+      int32_t max = m_possibleCenters.GetSize();
+      for (int32_t index = 0; index < max; index++) {
+        CBC_QRFinderPattern* center =
+            (CBC_QRFinderPattern*)(m_possibleCenters[index]);
+        if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) {
+          center->IncrementCount();
+          found = TRUE;
+          break;
+        }
+      }
+      if (!found) {
+        m_possibleCenters.Add(
+            new CBC_QRFinderPattern(centerJ, centerI, estimatedModuleSize));
+      }
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+int32_t CBC_QRFinderPatternFinder::FindRowSkip() {
+  int32_t max = m_possibleCenters.GetSize();
+  if (max <= 1) {
+    return 0;
+  }
+  FinderPattern* firstConfirmedCenter = NULL;
+  for (int32_t i = 0; i < max; i++) {
+    CBC_QRFinderPattern* center = (CBC_QRFinderPattern*)m_possibleCenters[i];
+    if (center->GetCount() >= CENTER_QUORUM) {
+      if (firstConfirmedCenter == NULL) {
+        firstConfirmedCenter = center;
+      } else {
+        m_hasSkipped = TRUE;
+        return (int32_t)((fabs(firstConfirmedCenter->GetX() - center->GetX()) -
+                          fabs(firstConfirmedCenter->GetY() - center->GetY())) /
+                         2);
+      }
+    }
+  }
+  return 0;
+}
+FX_BOOL CBC_QRFinderPatternFinder::HaveMultiplyConfirmedCenters() {
+  int32_t confirmedCount = 0;
+  FX_FLOAT totalModuleSize = 0.0f;
+  int32_t max = m_possibleCenters.GetSize();
+  int32_t i;
+  for (i = 0; i < max; i++) {
+    CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[i];
+    if (pattern->GetCount() >= CENTER_QUORUM) {
+      confirmedCount++;
+      totalModuleSize += pattern->GetEstimatedModuleSize();
+    }
+  }
+  if (confirmedCount < 3) {
+    return FALSE;
+  }
+  FX_FLOAT average = totalModuleSize / (FX_FLOAT)max;
+  FX_FLOAT totalDeviation = 0.0f;
+  for (i = 0; i < max; i++) {
+    CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[i];
+    totalDeviation += fabs(pattern->GetEstimatedModuleSize() - average);
+  }
+  return totalDeviation <= 0.05f * totalModuleSize;
+}
+inline FX_BOOL centerComparator(void* a, void* b) {
+  return ((CBC_QRFinderPattern*)b)->GetCount() <
+         ((CBC_QRFinderPattern*)a)->GetCount();
+}
+CFX_PtrArray* CBC_QRFinderPatternFinder::SelectBestpatterns(int32_t& e) {
+  int32_t startSize = m_possibleCenters.GetSize();
+  if (m_possibleCenters.GetSize() < 3) {
+    e = BCExceptionRead;
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  }
+  FX_FLOAT average = 0.0f;
+  if (startSize > 3) {
+    FX_FLOAT totalModuleSize = 0.0f;
+    for (int32_t i = 0; i < startSize; i++) {
+      totalModuleSize += ((CBC_QRFinderPattern*)m_possibleCenters[i])
+                             ->GetEstimatedModuleSize();
+    }
+    average = totalModuleSize / (FX_FLOAT)startSize;
+    for (int32_t j = 0;
+         j < m_possibleCenters.GetSize() && m_possibleCenters.GetSize() > 3;
+         j++) {
+      CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[j];
+      if (fabs(pattern->GetEstimatedModuleSize() - average) > 0.2f * average) {
+        delete pattern;
+        m_possibleCenters.RemoveAt(j);
+        j--;
+      }
+    }
+  }
+  if (m_possibleCenters.GetSize() > 3) {
+    BC_FX_PtrArray_Sort(m_possibleCenters, centerComparator);
+  }
+  CFX_PtrArray* vec = new CFX_PtrArray();
+  vec->SetSize(3);
+  (*vec)[0] = ((CBC_QRFinderPattern*)m_possibleCenters[0])->Clone();
+  (*vec)[1] = ((CBC_QRFinderPattern*)m_possibleCenters[1])->Clone();
+  (*vec)[2] = ((CBC_QRFinderPattern*)m_possibleCenters[2])->Clone();
+  return vec;
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h b/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h
new file mode 100644
index 0000000..058f65d
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRFinderPatternFinder.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+class CBC_QRFinderPattern;
+class CBC_ResultPoint;
+class CBC_QRFinderPatternInfo;
+
+class CBC_QRFinderPatternFinder {
+ private:
+  static const int32_t CENTER_QUORUM;
+  static const int32_t MIN_SKIP;
+  static const int32_t MAX_MODULES;
+  static const int32_t INTEGER_MATH_SHIFT;
+  FX_BOOL m_hasSkipped;
+  CBC_CommonBitMatrix* m_image;
+  CFX_Int32Array m_crossCheckStateCount;
+  CFX_PtrArray m_possibleCenters;
+
+ public:
+  CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image);
+  virtual ~CBC_QRFinderPatternFinder();
+  int32_t FindRowSkip();
+  CBC_CommonBitMatrix* GetImage();
+  CBC_QRFinderPatternInfo* Find(int32_t hint, int32_t& e);
+
+  CFX_Int32Array& GetCrossCheckStateCount();
+  CFX_PtrArray* GetPossibleCenters();
+  CFX_PtrArray* SelectBestpatterns(int32_t& e);
+
+  FX_BOOL HandlePossibleCenter(const CFX_Int32Array& stateCount,
+                               int32_t i,
+                               int32_t j);
+  FX_BOOL HaveMultiplyConfirmedCenters();
+  FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);
+  FX_FLOAT CrossCheckVertical(int32_t startI,
+                              int32_t centerJ,
+                              int32_t maxCount,
+                              int32_t originalStateCountTotal);
+  FX_FLOAT CrossCheckHorizontal(int32_t startJ,
+                                int32_t CenterI,
+                                int32_t maxCOunt,
+                                int32_t originalStateCountTotal);
+  static void OrderBestPatterns(CFX_PtrArray* patterns);
+  static FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
+  static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRGridSampler.cpp b/xfa/fxbarcode/qrcode/BC_QRGridSampler.cpp
new file mode 100644
index 0000000..881e74a
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRGridSampler.cpp
@@ -0,0 +1,139 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+// Original code is licensed as follows:
+/*
+ * Copyright 2007 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/qrcode/BC_QRGridSampler.h"
+
+#include <memory>
+
+#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
+#include "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h"
+#include "xfa/fxbarcode/utils.h"
+
+CBC_QRGridSampler CBC_QRGridSampler::m_gridSampler;
+
+CBC_QRGridSampler::CBC_QRGridSampler() {}
+CBC_QRGridSampler::~CBC_QRGridSampler() {}
+CBC_QRGridSampler& CBC_QRGridSampler::GetInstance() {
+  return m_gridSampler;
+}
+void CBC_QRGridSampler::CheckAndNudgePoints(CBC_CommonBitMatrix* image,
+                                            CFX_FloatArray* points,
+                                            int32_t& e) {
+  int32_t width = image->GetWidth();
+  int32_t height = image->GetHeight();
+  FX_BOOL nudged = TRUE;
+  int32_t offset;
+  for (offset = 0; offset < points->GetSize() && nudged; offset += 2) {
+    int32_t x = (int32_t)(*points)[offset];
+    int32_t y = (int32_t)(*points)[offset + 1];
+    if (x < -1 || x > width || y < -1 || y > height) {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    nudged = FALSE;
+    if (x == -1) {
+      (*points)[offset] = 0.0f;
+      nudged = TRUE;
+    } else if (x == width) {
+      (*points)[offset] = (FX_FLOAT)(width - 1);
+      nudged = TRUE;
+    }
+    if (y == -1) {
+      (*points)[offset + 1] = 0.0f;
+      nudged = TRUE;
+    } else if (y == height) {
+      (*points)[offset + 1] = (FX_FLOAT)(height - 1);
+      nudged = TRUE;
+    }
+  }
+  nudged = TRUE;
+  for (offset = (*points).GetSize() - 2; offset >= 0 && nudged; offset -= 2) {
+    int32_t x = (int32_t)(*points)[offset];
+    int32_t y = (int32_t)(*points)[offset + 1];
+    if (x < -1 || x > width || y < -1 || y > height) {
+      e = BCExceptionRead;
+      BC_EXCEPTION_CHECK_ReturnVoid(e);
+    }
+    nudged = FALSE;
+    if (x == -1) {
+      (*points)[offset] = 0.0f;
+      nudged = TRUE;
+    } else if (x == width) {
+      (*points)[offset] = (FX_FLOAT)(width - 1);
+      nudged = TRUE;
+    }
+    if (y == -1) {
+      (*points)[offset + 1] = 0.0f;
+      nudged = TRUE;
+    } else if (y == height) {
+      (*points)[offset + 1] = (FX_FLOAT)(height - 1);
+      nudged = TRUE;
+    }
+  }
+}
+CBC_CommonBitMatrix* CBC_QRGridSampler::SampleGrid(CBC_CommonBitMatrix* image,
+                                                   int32_t dimensionX,
+                                                   int32_t dimensionY,
+                                                   FX_FLOAT p1ToX,
+                                                   FX_FLOAT p1ToY,
+                                                   FX_FLOAT p2ToX,
+                                                   FX_FLOAT p2ToY,
+                                                   FX_FLOAT p3ToX,
+                                                   FX_FLOAT p3ToY,
+                                                   FX_FLOAT p4ToX,
+                                                   FX_FLOAT p4ToY,
+                                                   FX_FLOAT p1FromX,
+                                                   FX_FLOAT p1FromY,
+                                                   FX_FLOAT p2FromX,
+                                                   FX_FLOAT p2FromY,
+                                                   FX_FLOAT p3FromX,
+                                                   FX_FLOAT p3FromY,
+                                                   FX_FLOAT p4FromX,
+                                                   FX_FLOAT p4FromY,
+                                                   int32_t& e) {
+  std::unique_ptr<CBC_CommonPerspectiveTransform> transform(
+      CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(
+          p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX,
+          p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY));
+  std::unique_ptr<CBC_CommonBitMatrix> bits(new CBC_CommonBitMatrix());
+  bits->Init(dimensionX, dimensionY);
+  CFX_FloatArray points;
+  points.SetSize(dimensionX << 1);
+  for (int32_t y = 0; y < dimensionY; y++) {
+    int32_t max = points.GetSize();
+    FX_FLOAT iValue = (FX_FLOAT)(y + 0.5f);
+    int32_t x;
+    for (x = 0; x < max; x += 2) {
+      points[x] = (FX_FLOAT)((x >> 1) + 0.5f);
+      points[x + 1] = iValue;
+    }
+    transform->TransformPoints(&points);
+    CheckAndNudgePoints(image, &points, e);
+    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+    for (x = 0; x < max; x += 2) {
+      if (image->Get((int32_t)points[x], (int32_t)points[x + 1])) {
+        bits->Set(x >> 1, y);
+      }
+    }
+  }
+  return bits.release();
+}
diff --git a/xfa/fxbarcode/qrcode/BC_QRGridSampler.h b/xfa/fxbarcode/qrcode/BC_QRGridSampler.h
new file mode 100644
index 0000000..4e10c56
--- /dev/null
+++ b/xfa/fxbarcode/qrcode/BC_QRGridSampler.h
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
+#define XFA_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+class CBC_CommonBitMatrix;
+
+class CBC_QRGridSampler {
+ private:
+  static CBC_QRGridSampler m_gridSampler;
+
+ public:
+  CBC_QRGridSampler();
+  virtual ~CBC_QRGridSampler();
+  virtual CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
+                                          int32_t dimensionX,
+                                          int32_t dimensionY,
+                                          FX_FLOAT p1ToX,
+                                          FX_FLOAT p1ToY,
+                                          FX_FLOAT p2ToX,
+                                          FX_FLOAT p2ToY,
+                                          FX_FLOAT p3ToX,
+                                          FX_FLOAT p3ToY,
+                                          FX_FLOAT p4ToX,
+                                          FX_FLOAT p4ToY,
+                                          FX_FLOAT p1FromX,
+                                          FX_FLOAT p1FromY,
+                                          FX_FLOAT p2FromX,
+                                          FX_FLOAT p2FromY,
+                                          FX_FLOAT p3FromX,
+                                          FX_FLOAT p3FromY,
+                                          FX_FLOAT p4FromX,
+                                          FX_FLOAT p4FromY,
+                                          int32_t& e);
+
+  static CBC_QRGridSampler& GetInstance();
+  static void CheckAndNudgePoints(CBC_CommonBitMatrix* image,
+                                  CFX_FloatArray* points,
+                                  int32_t& e);
+};
+
+#endif  // XFA_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
diff --git a/xfa/fxbarcode/utils.h b/xfa/fxbarcode/utils.h
new file mode 100644
index 0000000..f6186e6
--- /dev/null
+++ b/xfa/fxbarcode/utils.h
@@ -0,0 +1,183 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXBARCODE_UTILS_H_
+#define XFA_FXBARCODE_UTILS_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+
+typedef CFX_MapPtrTemplate<void*, int32_t> CFX_PtrToInt32;
+FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString& dst,
+                                 FX_DWORD first,
+                                 FX_DWORD last,
+                                 int32_t count,
+                                 FX_CHAR c);
+void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c);
+void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba);
+typedef FX_BOOL (*BC_PtrArrayCompareCallback)(void* l, void* r);
+void BC_FX_PtrArray_Sort(CFX_PtrArray& src, BC_PtrArrayCompareCallback fun);
+
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
+#include <limits>
+#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
+      _FX_OS_ == _FX_IOS_)
+#include <limits.h>
+#endif
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
+#define FXSYS_isnan(x) _isnan(x)
+#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_)
+#include <cmath>
+#define FXSYS_isnan(x) std::isnan(x)
+#elif(_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_)
+#include <math.h>
+#define FXSYS_isnan(x) isnan(x)
+#endif
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
+#define FXSYS_nan() (std::numeric_limits<float>::quiet_NaN())
+#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
+      _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_)
+#define FXSYS_nan() NAN
+#endif
+enum BCFORMAT {
+  BCFORMAT_UNSPECIFY = -1,
+  BCFORMAT_CODABAR,
+  BCFORMAT_CODE_39,
+  BCFORMAT_CODE_128,
+  BCFORMAT_CODE_128B,
+  BCFORMAT_CODE_128C,
+  BCFORMAT_EAN_8,
+  BCFORMAT_UPC_A,
+  BCFORMAT_EAN_13,
+  BCFORMAT_PDF_417,
+  BCFORMAT_DATAMATRIX,
+  BCFORMAT_QR_CODE
+};
+#define BCFORMAT_ECLEVEL_L 0
+#define BCFORMAT_ECLEVEL_M 1
+#define BCFORMAT_ECLEVEL_Q 2
+#define BCFORMAT_ECLEVEL_H 3
+#include <ctype.h>
+#define FXSYS_IntMax INT_MAX
+#define FXSYS_Isdigit isdigit
+#define BCExceptionNO 0
+#define BCExceptionNotFound 1
+#define BCExceptionEndLessThanStart 2
+#define BCExceptionUnknownDecoder 3
+#define BCExceptionRotateNotSupported 4
+#define BCExceptionHeightAndWidthMustBeAtLeast1 5
+#define BCExceptionRegionMustFitInsideMatrix 6
+#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7
+#define BCExceptionFormatException 8
+#define BCExceptionIllegalArgumentMustMatchVersionSize 9
+#define BCExceptionChecksumException 10
+#define BCExceptionIllegalArgumentInvalidFirstDigit 11
+#define BCExceptionIllegalArgumentInvalidSecondDigit 12
+#define BCExceptionRuntimeDecodingInvalidISO_IEC 13
+#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14
+#define BCExceptionLeftAndTopMustBeNonnegative 15
+#define BCExceptionIllegalArgument 16
+#define BCExceptionBadECI 17
+#define BCExceptionUnSupportedBarcode 18
+#define BCExceptionUnSupportedString 19
+#define BCExceptionDigitLengthMustBe8 20
+#define BCExceptionDataCheckException 21
+#define BCExceptionExtractNumberValueFromBitArray 22
+#define BCExceptionRead 23
+#define BCExceptionRequestedRowIsOutSizeTheImage 24
+#define BCExceptionNoContents 26
+#define BCExceptionUnSupportEclevel 27
+#define BCExceptionUnSupportMode 28
+#define BCExceptionReferenceMustBeBetween0And7 29
+#define BCExceptionBadErrorLocation 30
+#define BCExceptionDegreeIsNegative 31
+#define BCExceptionDivideByZero 32
+#define BCExceptionCoefficientsSizeIsNull 33
+#define BCExceptionNoCorrectionBytes 34
+#define BCExceptionNoDataBytesProvided 35
+#define BCExceptionR_I_1IsZero 36
+#define BCExceptionAIsZero 37
+#define BCExceptionIsZero 38
+#define BCExceptionDegreeNotMatchRoots 39
+#define BCExceptionContentsLengthShouldBetween1and80 40
+#define BCExceptionOnlyEncodeCODE_128 41
+#define BCExceptionOnlyEncodeCODE_39 42
+#define BCExceptionOnlyEncodeEAN_13 43
+#define BCExceptionOnlyEncodeEAN_8 44
+#define BCExceptionOnlyEncodeITF 45
+#define BCExceptionDigitLengthShould13 46
+#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47
+#define BCExceptionOnlyEncodeUPC_A 48
+#define BCExceptionDigitLengthShouldBe12 49
+#define BCExceptionValueMustBeEither0or1 50
+#define BCExceptionReedsolomnDecodeException 51
+#define BCExceptionBadIndexException 52
+#define BCExceptionBadValueException 53
+#define BCExceptionBadNumBitsException 54
+#define BCExceptioncanNotOperatexorOperator 55
+#define BCExceptionVersionMust1_40 56
+#define BCExceptionUnknown 57
+#define BCExceptionNoSuchVersion 58
+#define BCExceptionCannotFindBlockInfo 59
+#define BCExceptionDataTooBig 60
+#define BCExceptionInvalidQRCode 61
+#define BCExceptionDataTooMany 62
+#define BCExceptionBitsNotEqualCacity 63
+#define BCExceptionUnsupportedMode 64
+#define BCExceptionInvalidateCharacter 65
+#define BCExceptionBytesNotMatchOffset 66
+#define BCExceptionSizeInBytesDiffer 67
+#define BCExceptionInvalidateMaskPattern 68
+#define BCExceptionNullPointer 69
+#define BCExceptionBadMask 70
+#define BCExceptionBitSizeNot15 71
+#define BCExceptionBitSizeNot18 72
+#define BCExceptionInvalidateImageData 73
+#define BCExceptionHeight_8BeZero 74
+#define BCExceptionCharacterNotThisMode 75
+#define BCExceptionBitsBytesNotMatch 76
+#define BCExceptionInvalidateData 77
+#define BCExceptionLoadFile 78
+#define BCExceptionPDF417EncodeFail 79
+#define BCExceptionFailToCreateBitmap 80
+#define BCExceptionLoadFontFail 81
+#define BCExceptionOnlyEncodeCODEBAR 82
+#define BCExceptionCodabarShouldStartWithOneOfABCD 83
+#define BCExceptionCodabarShouldEndWithOneOfTNE 84
+#define BCExceptionCodabarEncodeCharsInvalid 85
+#define BCExceptionOnlyEncodeDATAMATRIX 86
+#define BCExceptionCharactersOutsideISO88591Encoding 87
+#define BCExceptionIllegalDataCodewords 88
+#define BCExceptionCannotHandleThisNumberOfDataRegions 89
+#define BCExceptionIllegalStateUnexpectedCase 90
+#define BCExceptionIllegalStateCountMustNotExceed4 91
+#define BCExceptionIllegalStateMessageLengthInvalid 92
+#define BCExceptionIllegalArgumentNotGigits 93
+#define BCExceptionIllegalStateIllegalMode 94
+#define BCExceptionOnlyEncodePDF417 95
+#define BCExceptionNonEncodableCharacterDetected 96
+#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97
+#define BCExceptionNoRecommendationPossible 98
+#define BCExceptionIllegalArgumentnMustBeAbove0 99
+#define BCExceptionUnableToFitMessageInColumns 100
+#define BCExceptionEncodedMessageContainsTooManyCodeWords 101
+#define BCExceptionBitmapSizeError 102
+#define BCExceptionFormatInstance 102
+#define BCExceptionChecksumInstance 103
+#define BCExceptiontNotFoundInstance 104
+#define BCExceptionNotFoundInstance 105
+#define BCExceptionCannotMetadata 106
+#define TWO_DIGIT_DATA_LENGTH_SIZE 24
+#define THREE_DIGIT_DATA_LENGTH_SIZE 23
+#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57
+#define FOUR_DIGIT_DATA_LENGTH_SIZE 17
+#define BC_EXCEPTION_CHECK_ReturnVoid(e) \
+  if (e != BCExceptionNO)                \
+    return;
+#define BC_EXCEPTION_CHECK_ReturnValue(e, v) \
+  if (e != BCExceptionNO)                    \
+    return v;
+
+#endif  // XFA_FXBARCODE_UTILS_H_
diff --git a/xfa/fxfa/app/xfa_checksum.cpp b/xfa/fxfa/app/xfa_checksum.cpp
new file mode 100644
index 0000000..1639c0d
--- /dev/null
+++ b/xfa/fxfa/app/xfa_checksum.cpp
@@ -0,0 +1,190 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_checksum.h"
+
+#include "core/include/fdrm/fx_crypt.h"
+#include "xfa/fgas/crt/fgas_algorithm.h"
+
+CXFA_SAXReaderHandler::CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext)
+    : m_pContext(pContext) {
+  FXSYS_assert(m_pContext);
+}
+CXFA_SAXReaderHandler::~CXFA_SAXReaderHandler() {}
+void* CXFA_SAXReaderHandler::OnTagEnter(const CFX_ByteStringC& bsTagName,
+                                        FX_SAXNODE eType,
+                                        FX_DWORD dwStartPos) {
+  UpdateChecksum(TRUE);
+  if (eType != FX_SAXNODE_Tag && eType != FX_SAXNODE_Instruction) {
+    return NULL;
+  }
+  m_SAXContext.m_eNode = eType;
+  CFX_ByteTextBuf& textBuf = m_SAXContext.m_TextBuf;
+  textBuf << "<";
+  if (eType == FX_SAXNODE_Instruction) {
+    textBuf << "?";
+  }
+  textBuf << bsTagName;
+  m_SAXContext.m_bsTagName = bsTagName;
+  return &m_SAXContext;
+}
+void CXFA_SAXReaderHandler::OnTagAttribute(void* pTag,
+                                           const CFX_ByteStringC& bsAttri,
+                                           const CFX_ByteStringC& bsValue) {
+  if (pTag == NULL) {
+    return;
+  }
+  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
+  textBuf << " " << bsAttri << "=\"" << bsValue << "\"";
+}
+void CXFA_SAXReaderHandler::OnTagBreak(void* pTag) {
+  if (pTag == NULL) {
+    return;
+  }
+  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
+  textBuf << ">";
+  UpdateChecksum(FALSE);
+}
+void CXFA_SAXReaderHandler::OnTagData(void* pTag,
+                                      FX_SAXNODE eType,
+                                      const CFX_ByteStringC& bsData,
+                                      FX_DWORD dwStartPos) {
+  if (pTag == NULL) {
+    return;
+  }
+  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
+  if (eType == FX_SAXNODE_CharData) {
+    textBuf << "<![CDATA[";
+  }
+  textBuf << bsData;
+  if (eType == FX_SAXNODE_CharData) {
+    textBuf << "]]>";
+  }
+}
+void CXFA_SAXReaderHandler::OnTagClose(void* pTag, FX_DWORD dwEndPos) {
+  if (pTag == NULL) {
+    return;
+  }
+  CXFA_SAXContext* pSAXContext = (CXFA_SAXContext*)pTag;
+  CFX_ByteTextBuf& textBuf = pSAXContext->m_TextBuf;
+  if (pSAXContext->m_eNode == FX_SAXNODE_Instruction) {
+    textBuf << "?>";
+  } else if (pSAXContext->m_eNode == FX_SAXNODE_Tag) {
+    textBuf << "></" << pSAXContext->m_bsTagName << ">";
+  }
+  UpdateChecksum(FALSE);
+}
+void CXFA_SAXReaderHandler::OnTagEnd(void* pTag,
+                                     const CFX_ByteStringC& bsTagName,
+                                     FX_DWORD dwEndPos) {
+  if (pTag == NULL) {
+    return;
+  }
+  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
+  textBuf << "</" << bsTagName << ">";
+  UpdateChecksum(FALSE);
+}
+void CXFA_SAXReaderHandler::OnTargetData(void* pTag,
+                                         FX_SAXNODE eType,
+                                         const CFX_ByteStringC& bsData,
+                                         FX_DWORD dwStartPos) {
+  if (pTag == NULL && eType != FX_SAXNODE_Comment) {
+    return;
+  }
+  if (eType == FX_SAXNODE_Comment) {
+    CFX_ByteTextBuf& textBuf = m_SAXContext.m_TextBuf;
+    textBuf << "<!--" << bsData << "-->";
+    UpdateChecksum(FALSE);
+  } else {
+    CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
+    textBuf << " " << bsData;
+  }
+}
+void CXFA_SAXReaderHandler::UpdateChecksum(FX_BOOL bCheckSpace) {
+  int32_t iLength = m_SAXContext.m_TextBuf.GetLength();
+  if (iLength < 1) {
+    return;
+  }
+  uint8_t* pBuffer = m_SAXContext.m_TextBuf.GetBuffer();
+  FX_BOOL bUpdata = TRUE;
+  if (bCheckSpace) {
+    bUpdata = FALSE;
+    for (int32_t i = 0; i < iLength; i++) {
+      bUpdata = (pBuffer[i] > 0x20);
+      if (bUpdata) {
+        break;
+      }
+    }
+  }
+  if (bUpdata) {
+    m_pContext->Update(CFX_ByteStringC(pBuffer, iLength));
+  }
+  m_SAXContext.m_TextBuf.Clear();
+}
+IXFA_ChecksumContext* XFA_Checksum_Create() {
+  return new CXFA_ChecksumContext;
+}
+CXFA_ChecksumContext::CXFA_ChecksumContext()
+    : m_pSAXReader(NULL), m_pByteContext(NULL) {}
+CXFA_ChecksumContext::~CXFA_ChecksumContext() {
+  FinishChecksum();
+}
+FX_BOOL CXFA_ChecksumContext::StartChecksum() {
+  FinishChecksum();
+  m_pByteContext = FX_Alloc(uint8_t, 128);
+  CRYPT_SHA1Start(m_pByteContext);
+  m_bsChecksum.Empty();
+  m_pSAXReader = FX_SAXReader_Create();
+  return m_pSAXReader != NULL;
+}
+FX_BOOL CXFA_ChecksumContext::UpdateChecksum(IFX_FileRead* pSrcFile,
+                                             FX_FILESIZE offset,
+                                             size_t size) {
+  if (m_pSAXReader == NULL) {
+    return FALSE;
+  }
+  if (pSrcFile == NULL) {
+    return FALSE;
+  }
+  if (size < 1) {
+    size = pSrcFile->GetSize();
+  }
+  CXFA_SAXReaderHandler handler(this);
+  m_pSAXReader->SetHandler(&handler);
+  if (m_pSAXReader->StartParse(
+          pSrcFile, (FX_DWORD)offset, (FX_DWORD)size,
+          FX_SAXPARSEMODE_NotSkipSpace | FX_SAXPARSEMODE_NotConvert_amp |
+              FX_SAXPARSEMODE_NotConvert_lt | FX_SAXPARSEMODE_NotConvert_gt |
+              FX_SAXPARSEMODE_NotConvert_sharp) < 0) {
+    return FALSE;
+  }
+  return m_pSAXReader->ContinueParse(NULL) > 99;
+}
+void CXFA_ChecksumContext::FinishChecksum() {
+  if (m_pSAXReader) {
+    m_pSAXReader->Release();
+    m_pSAXReader = NULL;
+  }
+  if (m_pByteContext) {
+    uint8_t digest[20];
+    FXSYS_memset(digest, 0, 20);
+    CRYPT_SHA1Finish(m_pByteContext, digest);
+    int32_t nLen = FX_Base64EncodeA(digest, 20, NULL);
+    FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen);
+    FX_Base64EncodeA(digest, 20, pBuffer);
+    m_bsChecksum.ReleaseBuffer(nLen);
+    FX_Free(m_pByteContext);
+    m_pByteContext = NULL;
+  }
+}
+void CXFA_ChecksumContext::GetChecksum(CFX_ByteString& bsChecksum) {
+  bsChecksum = m_bsChecksum;
+}
+void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) {
+  if (m_pByteContext) {
+    CRYPT_SHA1Update(m_pByteContext, bsText.GetPtr(), bsText.GetLength());
+  }
+}
diff --git a/xfa/fxfa/app/xfa_checksum.h b/xfa/fxfa/app/xfa_checksum.h
new file mode 100644
index 0000000..5331800
--- /dev/null
+++ b/xfa/fxfa/app/xfa_checksum.h
@@ -0,0 +1,73 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_CHECKSUM_H_
+#define XFA_FXFA_APP_XFA_CHECKSUM_H_
+
+#include "xfa/fgas/xml/fgas_sax.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_SAXReaderHandler;
+class CXFA_ChecksumContext;
+
+class CXFA_SAXContext {
+ public:
+  CXFA_SAXContext() : m_eNode(FX_SAXNODE_Unknown) {}
+  CFX_ByteTextBuf m_TextBuf;
+  CFX_ByteString m_bsTagName;
+  FX_SAXNODE m_eNode;
+};
+class CXFA_SAXReaderHandler : public IFX_SAXReaderHandler {
+ public:
+  CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext);
+  virtual ~CXFA_SAXReaderHandler();
+  virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName,
+                           FX_SAXNODE eType,
+                           FX_DWORD dwStartPos);
+  virtual void OnTagAttribute(void* pTag,
+                              const CFX_ByteStringC& bsAttri,
+                              const CFX_ByteStringC& bsValue);
+  virtual void OnTagBreak(void* pTag);
+  virtual void OnTagData(void* pTag,
+                         FX_SAXNODE eType,
+                         const CFX_ByteStringC& bsData,
+                         FX_DWORD dwStartPos);
+  virtual void OnTagClose(void* pTag, FX_DWORD dwEndPos);
+  virtual void OnTagEnd(void* pTag,
+                        const CFX_ByteStringC& bsTagName,
+                        FX_DWORD dwEndPos);
+
+  virtual void OnTargetData(void* pTag,
+                            FX_SAXNODE eType,
+                            const CFX_ByteStringC& bsData,
+                            FX_DWORD dwStartPos);
+
+ protected:
+  void UpdateChecksum(FX_BOOL bCheckSpace);
+  CXFA_ChecksumContext* m_pContext;
+  CXFA_SAXContext m_SAXContext;
+};
+
+class CXFA_ChecksumContext : public IXFA_ChecksumContext {
+ public:
+  CXFA_ChecksumContext();
+  virtual ~CXFA_ChecksumContext();
+  virtual void Release() { delete this; }
+  virtual FX_BOOL StartChecksum();
+  virtual FX_BOOL UpdateChecksum(IFX_FileRead* pSrcFile,
+                                 FX_FILESIZE offset = 0,
+                                 size_t size = 0);
+  virtual void FinishChecksum();
+  virtual void GetChecksum(CFX_ByteString& bsChecksum);
+  void Update(const CFX_ByteStringC& bsText);
+
+ protected:
+  IFX_SAXReader* m_pSAXReader;
+  uint8_t* m_pByteContext;
+  CFX_ByteString m_bsChecksum;
+};
+
+#endif  // XFA_FXFA_APP_XFA_CHECKSUM_H_
diff --git a/xfa/fxfa/app/xfa_ffapp.cpp b/xfa/fxfa/app/xfa_ffapp.cpp
new file mode 100644
index 0000000..8327d1b
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffapp.cpp
@@ -0,0 +1,190 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+
+#include <algorithm>
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdochandler.h"
+#include "xfa/fxfa/app/xfa_ffwidgethandler.h"
+#include "xfa/fxfa/app/xfa_fontmgr.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/app/xfa_fwltheme.h"
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+
+CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams) {
+  int32_t iCount = streams.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CPDF_StreamAcc& acc = m_Data.Add();
+    acc.LoadAllData(streams[i]);
+  }
+}
+FX_FILESIZE CXFA_FileRead::GetSize() {
+  FX_DWORD dwSize = 0;
+  int32_t iCount = m_Data.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CPDF_StreamAcc& acc = m_Data[i];
+    dwSize += acc.GetSize();
+  }
+  return dwSize;
+}
+FX_BOOL CXFA_FileRead::ReadBlock(void* buffer,
+                                 FX_FILESIZE offset,
+                                 size_t size) {
+  int32_t iCount = m_Data.GetSize();
+  int32_t index = 0;
+  while (index < iCount) {
+    CPDF_StreamAcc& acc = m_Data[index];
+    FX_FILESIZE dwSize = acc.GetSize();
+    if (offset < dwSize) {
+      break;
+    }
+    offset -= dwSize;
+    index++;
+  }
+  while (index < iCount) {
+    CPDF_StreamAcc& acc = m_Data[index];
+    FX_DWORD dwSize = acc.GetSize();
+    size_t dwRead = std::min(size, static_cast<size_t>(dwSize - offset));
+    FXSYS_memcpy(buffer, acc.GetData() + offset, dwRead);
+    size -= dwRead;
+    if (size == 0) {
+      return TRUE;
+    }
+    buffer = (uint8_t*)buffer + dwRead;
+    offset = 0;
+    index++;
+  }
+  return FALSE;
+}
+// static
+IXFA_App* IXFA_App::Create(IXFA_AppProvider* pProvider) {
+  return new CXFA_FFApp(pProvider);
+}
+// virtual
+IXFA_App::~IXFA_App() {}
+CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider)
+    : m_pDocHandler(nullptr),
+      m_pFWLTheme(nullptr),
+      m_pProvider(pProvider),
+      m_pFontMgr(nullptr),
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+      m_pFontSource(nullptr),
+#endif
+      m_pAdapterWidgetMgr(nullptr),
+      m_pWidgetMgrDelegate(nullptr),
+      m_pFDEFontMgr(nullptr),
+      m_pMenuHandler(nullptr),
+      m_pAdapterThreadMgr(nullptr) {
+  m_pFWLApp = IFWL_App::Create(this);
+  FWL_SetApp(m_pFWLApp);
+  m_pFWLApp->Initialize();
+  IXFA_TimeZoneProvider::Create();
+}
+CXFA_FFApp::~CXFA_FFApp() {
+  delete m_pDocHandler;
+  if (m_pFWLApp) {
+    m_pFWLApp->Finalize();
+    m_pFWLApp->Release();
+    delete m_pFWLApp;
+  }
+  if (m_pFWLTheme)
+    m_pFWLTheme->Release();
+  delete m_pAdapterWidgetMgr;
+  delete m_pAdapterThreadMgr;
+  delete m_pMenuHandler;
+  IXFA_TimeZoneProvider::Destroy();
+  delete m_pFontMgr;
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  if (m_pFontSource)
+    m_pFontSource->Release();
+#endif
+  if (m_pFDEFontMgr)
+    m_pFDEFontMgr->Release();
+}
+IXFA_MenuHandler* CXFA_FFApp::GetMenuHandler() {
+  if (!m_pMenuHandler) {
+    m_pMenuHandler = new CXFA_FFMenuHandler;
+  }
+  return m_pMenuHandler;
+}
+IXFA_DocHandler* CXFA_FFApp::GetDocHandler() {
+  if (!m_pDocHandler) {
+    m_pDocHandler = new CXFA_FFDocHandler;
+  }
+  return m_pDocHandler;
+}
+IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider,
+                                IFX_FileRead* pStream,
+                                FX_BOOL bTakeOverFile) {
+  CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider);
+  FX_BOOL bSuccess = pDoc->OpenDoc(pStream, bTakeOverFile);
+  if (!bSuccess) {
+    delete pDoc;
+    pDoc = NULL;
+  }
+  return pDoc;
+}
+IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider,
+                                CPDF_Document* pPDFDoc) {
+  if (pPDFDoc == NULL) {
+    return NULL;
+  }
+  CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider);
+  FX_BOOL bSuccess = pDoc->OpenDoc(pPDFDoc);
+  if (!bSuccess) {
+    delete pDoc;
+    pDoc = NULL;
+  }
+  return pDoc;
+}
+
+void CXFA_FFApp::SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) {
+  if (!m_pFontMgr) {
+    m_pFontMgr = new CXFA_FontMgr();
+  }
+  m_pFontMgr->SetDefFontMgr(pFontMgr);
+}
+CXFA_FontMgr* CXFA_FFApp::GetXFAFontMgr() {
+  return m_pFontMgr;
+}
+IFX_FontMgr* CXFA_FFApp::GetFDEFontMgr() {
+  if (!m_pFDEFontMgr) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+    m_pFDEFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
+#else
+    m_pFontSource = FX_CreateDefaultFontSourceEnum();
+    m_pFDEFontMgr = IFX_FontMgr::Create(m_pFontSource);
+#endif
+  }
+  return m_pFDEFontMgr;
+}
+CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme() {
+  if (!m_pFWLTheme) {
+    m_pFWLTheme = new CXFA_FWLTheme(this);
+  }
+  return m_pFWLTheme;
+}
+IFWL_AdapterWidgetMgr* CXFA_FFApp::GetWidgetMgr(
+    IFWL_WidgetMgrDelegate* pDelegate) {
+  if (!m_pAdapterWidgetMgr) {
+    m_pAdapterWidgetMgr = new CXFA_FWLAdapterWidgetMgr;
+    pDelegate->OnSetCapability(FWL_WGTMGR_DisableThread |
+                               FWL_WGTMGR_DisableForm);
+    m_pWidgetMgrDelegate = pDelegate;
+  }
+  return m_pAdapterWidgetMgr;
+}
+IFWL_AdapterThreadMgr* CXFA_FFApp::GetThreadMgr() {
+  if (!m_pAdapterThreadMgr) {
+    m_pAdapterThreadMgr = new CFWL_SDAdapterThreadMgr;
+  }
+  return m_pAdapterThreadMgr;
+}
+IFWL_AdapterTimerMgr* CXFA_FFApp::GetTimerMgr() {
+  return m_pProvider->GetTimerMgr();
+}
diff --git a/xfa/fxfa/app/xfa_ffapp.h b/xfa/fxfa/app/xfa_ffapp.h
new file mode 100644
index 0000000..0374d4a
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffapp.h
@@ -0,0 +1,81 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFAPP_H_
+#define XFA_FXFA_APP_XFA_FFAPP_H_
+
+#include "core/include/fpdfapi/cpdf_stream.h"
+#include "xfa/fgas/font/fgas_font.h"
+#include "xfa/include/fwl/adapter/fwl_adapternative.h"
+#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FWLAdapterWidgetMgr;
+class CXFA_FWLTheme;
+class CXFA_FFDocHandler;
+class CXFA_FFMenuHandler;
+class CXFA_FontMgr;
+
+class CXFA_FileRead : public IFX_FileRead {
+ public:
+  explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);
+
+  virtual FX_FILESIZE GetSize();
+  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+  virtual void Release() { delete this; }
+
+ protected:
+  CFX_ObjectArray<CPDF_StreamAcc> m_Data;
+};
+
+class CXFA_FFApp : public IXFA_App, public IFWL_AdapterNative {
+ public:
+  CXFA_FFApp(IXFA_AppProvider* pProvider);
+  ~CXFA_FFApp() override;
+
+  // IFXFA_App:
+  IXFA_DocHandler* GetDocHandler() override;
+  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
+                      IFX_FileRead* pStream,
+                      FX_BOOL bTakeOverFile) override;
+  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
+                      CPDF_Document* pPDFDoc) override;
+  IXFA_AppProvider* GetAppProvider() override { return m_pProvider; }
+  void SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) override;
+  IXFA_MenuHandler* GetMenuHandler() override;
+
+  // IFWL_AdapterNative:
+  IFWL_AdapterWidgetMgr* GetWidgetMgr(
+      IFWL_WidgetMgrDelegate* pDelegate) override;
+  IFWL_AdapterThreadMgr* GetThreadMgr() override;
+  IFWL_AdapterTimerMgr* GetTimerMgr() override;
+
+  CXFA_FontMgr* GetXFAFontMgr();
+  IFX_FontMgr* GetFDEFontMgr();
+  CXFA_FWLTheme* GetFWLTheme();
+  IFWL_WidgetMgrDelegate* GetWidgetMgrDelegate() {
+    return m_pWidgetMgrDelegate;
+  }
+
+ protected:
+  CXFA_FFDocHandler* m_pDocHandler;
+  IFWL_App* m_pFWLApp;
+  CXFA_FWLTheme* m_pFWLTheme;
+  IXFA_AppProvider* m_pProvider;
+  CXFA_FontMgr* m_pFontMgr;
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+  IFX_FontSourceEnum* m_pFontSource;
+#endif
+  CXFA_FWLAdapterWidgetMgr* m_pAdapterWidgetMgr;
+  IFWL_WidgetMgrDelegate* m_pWidgetMgrDelegate;
+  IFX_FontMgr* m_pFDEFontMgr;
+  CXFA_FFMenuHandler* m_pMenuHandler;
+  CFWL_SDAdapterThreadMgr* m_pAdapterThreadMgr;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFAPP_H_
diff --git a/xfa/fxfa/app/xfa_ffbarcode.cpp b/xfa/fxfa/app/xfa_ffbarcode.cpp
new file mode 100644
index 0000000..2062ca1
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffbarcode.cpp
@@ -0,0 +1,235 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffbarcode.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/lightwidget/barcode.h"
+
+static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(
+    const CFX_WideStringC& wsName);
+CXFA_FFBarcode::CXFA_FFBarcode(CXFA_FFPageView* pPageView,
+                               CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
+CXFA_FFBarcode::~CXFA_FFBarcode() {}
+FX_BOOL CXFA_FFBarcode::LoadWidget() {
+  CFWL_Barcode* pFWLBarcode = CFWL_Barcode::Create();
+  if (pFWLBarcode) {
+    pFWLBarcode->Initialize();
+  }
+  m_pNormalWidget = pFWLBarcode;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
+  pFWLBarcode->SetText(wsText);
+  UpdateWidgetProperty();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFBarcode::RenderWidget(CFX_Graphics* pGS,
+                                  CFX_Matrix* pMatrix,
+                                  FX_DWORD dwStatus,
+                                  int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
+  RenderCaption(pGS, &mtRotate);
+  CFX_RectF rtWidget;
+  m_pNormalWidget->GetWidgetRect(rtWidget);
+  CFX_Matrix mt;
+  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
+  mt.Concat(mtRotate);
+  m_pNormalWidget->DrawWidget(pGS, &mt);
+}
+void CXFA_FFBarcode::UpdateWidgetProperty() {
+  CXFA_FFTextEdit::UpdateWidgetProperty();
+  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
+  CFX_WideString wsType = GetDataAcc()->GetBarcodeType();
+  XFA_LPCBARCODETYPEENUMINFO pBarcodeTypeInfo =
+      XFA_GetBarcodeTypeByName(wsType);
+  pBarCodeWidget->SetType(pBarcodeTypeInfo->eBCType);
+  CXFA_WidgetAcc* pAcc = GetDataAcc();
+  int32_t intVal;
+  FX_CHAR charVal;
+  FX_BOOL boolVal;
+  FX_FLOAT floatVal;
+  if (pAcc->GetBarcodeAttribute_CharEncoding(intVal)) {
+    pBarCodeWidget->SetCharEncoding((BC_CHAR_ENCODING)intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_Checksum(intVal)) {
+    pBarCodeWidget->SetCalChecksum(intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_DataLength(intVal)) {
+    pBarCodeWidget->SetDataLength(intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_StartChar(charVal)) {
+    pBarCodeWidget->SetStartChar(charVal);
+  }
+  if (pAcc->GetBarcodeAttribute_EndChar(charVal)) {
+    pBarCodeWidget->SetEndChar(charVal);
+  }
+  if (pAcc->GetBarcodeAttribute_ECLevel(intVal)) {
+    pBarCodeWidget->SetErrorCorrectionLevel(intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_ModuleWidth(intVal)) {
+    pBarCodeWidget->SetModuleWidth(intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_ModuleHeight(intVal)) {
+    pBarCodeWidget->SetModuleHeight(intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_PrintChecksum(boolVal)) {
+    pBarCodeWidget->SetPrintChecksum(boolVal);
+  }
+  if (pAcc->GetBarcodeAttribute_TextLocation(intVal)) {
+    pBarCodeWidget->SetTextLocation((BC_TEXT_LOC)intVal);
+  }
+  if (pAcc->GetBarcodeAttribute_Truncate(boolVal)) {
+    pBarCodeWidget->SetTruncated(boolVal);
+  }
+  if (pAcc->GetBarcodeAttribute_WideNarrowRatio(floatVal)) {
+    pBarCodeWidget->SetWideNarrowRatio((int32_t)floatVal);
+  }
+  if (pBarcodeTypeInfo->eName == XFA_BARCODETYPE_code3Of9 ||
+      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean8 ||
+      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean13 ||
+      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_upcA) {
+    pBarCodeWidget->SetPrintChecksum(TRUE);
+  }
+}
+FX_BOOL CXFA_FFBarcode::OnLButtonDown(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
+  if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) {
+    return FALSE;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  return CXFA_FFTextEdit::OnLButtonDown(dwFlags, fx, fy);
+}
+FX_BOOL CXFA_FFBarcode::OnRButtonDown(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
+  if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) {
+    return FALSE;
+  }
+  return CXFA_FFTextEdit::OnRButtonDown(dwFlags, fx, fy);
+}
+extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[] = {
+    {0x7fb4a18, L"ean13", XFA_BARCODETYPE_ean13, BC_EAN13},
+    {0x8d13a3d, L"code11", XFA_BARCODETYPE_code11, BC_UNKNOWN},
+    {0x8d149a8, L"code49", XFA_BARCODETYPE_code49, BC_UNKNOWN},
+    {0x8d16347, L"code93", XFA_BARCODETYPE_code93, BC_UNKNOWN},
+    {0x91a92e2, L"upsMaxicode", XFA_BARCODETYPE_upsMaxicode, BC_UNKNOWN},
+    {0xa7d48dc, L"fim", XFA_BARCODETYPE_fim, BC_UNKNOWN},
+    {0xb359fe9, L"msi", XFA_BARCODETYPE_msi, BC_UNKNOWN},
+    {0x121f738c, L"code2Of5Matrix", XFA_BARCODETYPE_code2Of5Matrix, BC_UNKNOWN},
+    {0x15358616, L"ucc128", XFA_BARCODETYPE_ucc128, BC_UNKNOWN},
+    {0x1f4bfa05, L"rfid", XFA_BARCODETYPE_rfid, BC_UNKNOWN},
+    {0x1fda71bc, L"rss14Stacked", XFA_BARCODETYPE_rss14Stacked, BC_UNKNOWN},
+    {0x22065087, L"ean8add2", XFA_BARCODETYPE_ean8add2, BC_UNKNOWN},
+    {0x2206508a, L"ean8add5", XFA_BARCODETYPE_ean8add5, BC_UNKNOWN},
+    {0x2278366c, L"codabar", XFA_BARCODETYPE_codabar, BC_CODABAR},
+    {0x2a039a8d, L"telepen", XFA_BARCODETYPE_telepen, BC_UNKNOWN},
+    {0x323ed337, L"upcApwcd", XFA_BARCODETYPE_upcApwcd, BC_UNKNOWN},
+    {0x347a1846, L"postUSIMB", XFA_BARCODETYPE_postUSIMB, BC_UNKNOWN},
+    {0x391bb836, L"code128", XFA_BARCODETYPE_code128, BC_CODE128},
+    {0x398eddaf, L"dataMatrix", XFA_BARCODETYPE_dataMatrix, BC_DATAMATRIX},
+    {0x3cff60a8, L"upcEadd2", XFA_BARCODETYPE_upcEadd2, BC_UNKNOWN},
+    {0x3cff60ab, L"upcEadd5", XFA_BARCODETYPE_upcEadd5, BC_UNKNOWN},
+    {0x402cb188, L"code2Of5Standard", XFA_BARCODETYPE_code2Of5Standard,
+     BC_UNKNOWN},
+    {0x411764f7, L"aztec", XFA_BARCODETYPE_aztec, BC_UNKNOWN},
+    {0x44d4e84c, L"ean8", XFA_BARCODETYPE_ean8, BC_EAN8},
+    {0x48468902, L"ucc128sscc", XFA_BARCODETYPE_ucc128sscc, BC_UNKNOWN},
+    {0x4880aea4, L"upcAadd2", XFA_BARCODETYPE_upcAadd2, BC_UNKNOWN},
+    {0x4880aea7, L"upcAadd5", XFA_BARCODETYPE_upcAadd5, BC_UNKNOWN},
+    {0x54f18256, L"code2Of5Industrial", XFA_BARCODETYPE_code2Of5Industrial,
+     BC_UNKNOWN},
+    {0x58e15f25, L"rss14Limited", XFA_BARCODETYPE_rss14Limited, BC_UNKNOWN},
+    {0x5c08d1b9, L"postAUSReplyPaid", XFA_BARCODETYPE_postAUSReplyPaid,
+     BC_UNKNOWN},
+    {0x5fa700bd, L"rss14", XFA_BARCODETYPE_rss14, BC_UNKNOWN},
+    {0x631a7e35, L"logmars", XFA_BARCODETYPE_logmars, BC_UNKNOWN},
+    {0x6a236236, L"pdf417", XFA_BARCODETYPE_pdf417, BC_PDF417},
+    {0x6d098ece, L"upcean2", XFA_BARCODETYPE_upcean2, BC_UNKNOWN},
+    {0x6d098ed1, L"upcean5", XFA_BARCODETYPE_upcean5, BC_UNKNOWN},
+    {0x76b04eed, L"code3Of9extended", XFA_BARCODETYPE_code3Of9extended,
+     BC_UNKNOWN},
+    {0x7c7db84a, L"maxicode", XFA_BARCODETYPE_maxicode, BC_UNKNOWN},
+    {0x8266f7f7, L"ucc128random", XFA_BARCODETYPE_ucc128random, BC_UNKNOWN},
+    {0x83eca147, L"postUSDPBC", XFA_BARCODETYPE_postUSDPBC, BC_UNKNOWN},
+    {0x8dd71de0, L"postAUSStandard", XFA_BARCODETYPE_postAUSStandard,
+     BC_UNKNOWN},
+    {0x98adad85, L"plessey", XFA_BARCODETYPE_plessey, BC_UNKNOWN},
+    {0x9f84cce6, L"ean13pwcd", XFA_BARCODETYPE_ean13pwcd, BC_UNKNOWN},
+    {0xb514fbe9, L"upcA", XFA_BARCODETYPE_upcA, BC_UPCA},
+    {0xb514fbed, L"upcE", XFA_BARCODETYPE_upcE, BC_UNKNOWN},
+    {0xb5c6a853, L"ean13add2", XFA_BARCODETYPE_ean13add2, BC_UNKNOWN},
+    {0xb5c6a856, L"ean13add5", XFA_BARCODETYPE_ean13add5, BC_UNKNOWN},
+    {0xb81fc512, L"postUKRM4SCC", XFA_BARCODETYPE_postUKRM4SCC, BC_UNKNOWN},
+    {0xbad34b22, L"code128SSCC", XFA_BARCODETYPE_code128SSCC, BC_UNKNOWN},
+    {0xbfbe0cf6, L"postUS5Zip", XFA_BARCODETYPE_postUS5Zip, BC_UNKNOWN},
+    {0xc56618e8, L"pdf417macro", XFA_BARCODETYPE_pdf417macro, BC_UNKNOWN},
+    {0xca730f8a, L"code2Of5Interleaved", XFA_BARCODETYPE_code2Of5Interleaved,
+     BC_UNKNOWN},
+    {0xd0097ac6, L"rss14Expanded", XFA_BARCODETYPE_rss14Expanded, BC_UNKNOWN},
+    {0xd25a0240, L"postAUSCust2", XFA_BARCODETYPE_postAUSCust2, BC_UNKNOWN},
+    {0xd25a0241, L"postAUSCust3", XFA_BARCODETYPE_postAUSCust3, BC_UNKNOWN},
+    {0xd53ed3e7, L"rss14Truncated", XFA_BARCODETYPE_rss14Truncated, BC_UNKNOWN},
+    {0xe72bcd57, L"code128A", XFA_BARCODETYPE_code128A, BC_UNKNOWN},
+    {0xe72bcd58, L"code128B", XFA_BARCODETYPE_code128B, BC_CODE128_B},
+    {0xe72bcd59, L"code128C", XFA_BARCODETYPE_code128C, BC_CODE128_C},
+    {0xee83c50f, L"rss14StackedOmni", XFA_BARCODETYPE_rss14StackedOmni,
+     BC_UNKNOWN},
+    {0xf2a18f7e, L"QRCode", XFA_BARCODETYPE_QRCode, BC_QR_CODE},
+    {0xfaeaf37f, L"postUSStandard", XFA_BARCODETYPE_postUSStandard, BC_UNKNOWN},
+    {0xfb48155c, L"code3Of9", XFA_BARCODETYPE_code3Of9, BC_CODE39},
+};
+extern const int32_t g_iXFABarcodeTypeCount =
+    sizeof(g_XFABarCodeTypeEnumData) / sizeof(XFA_BARCODETYPEENUMINFO);
+static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(
+    const CFX_WideStringC& wsName) {
+  int32_t iLength = wsName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength, TRUE);
+  int32_t iStart = 0, iEnd = g_iXFABarcodeTypeCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    XFA_LPCBARCODETYPEENUMINFO pInfo = g_XFABarCodeTypeEnumData + iMid;
+    if (uHash == pInfo->uHash) {
+      return pInfo;
+    } else if (uHash < pInfo->uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
diff --git a/xfa/fxfa/app/xfa_ffbarcode.h b/xfa/fxfa/app/xfa_ffbarcode.h
new file mode 100644
index 0000000..114a492
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffbarcode.h
@@ -0,0 +1,101 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFBARCODE_H_
+#define XFA_FXFA_APP_XFA_FFBARCODE_H_
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+#include "xfa/include/fxbarcode/BC_BarCode.h"
+
+class CXFA_FFBarcode : public CXFA_FFTextEdit {
+ public:
+  CXFA_FFBarcode(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFBarcode();
+  virtual FX_BOOL LoadWidget();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual void UpdateWidgetProperty();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+};
+
+enum XFA_BARCODETYPEENUM {
+  XFA_BARCODETYPE_aztec,
+  XFA_BARCODETYPE_codabar,
+  XFA_BARCODETYPE_code11,
+  XFA_BARCODETYPE_code128,
+  XFA_BARCODETYPE_code128A,
+  XFA_BARCODETYPE_code128B,
+  XFA_BARCODETYPE_code128C,
+  XFA_BARCODETYPE_code128SSCC,
+  XFA_BARCODETYPE_code2Of5Industrial,
+  XFA_BARCODETYPE_code2Of5Interleaved,
+  XFA_BARCODETYPE_code2Of5Matrix,
+  XFA_BARCODETYPE_code2Of5Standard,
+  XFA_BARCODETYPE_code3Of9,
+  XFA_BARCODETYPE_code3Of9extended,
+  XFA_BARCODETYPE_code49,
+  XFA_BARCODETYPE_code93,
+  XFA_BARCODETYPE_dataMatrix,
+  XFA_BARCODETYPE_ean13,
+  XFA_BARCODETYPE_ean13add2,
+  XFA_BARCODETYPE_ean13add5,
+  XFA_BARCODETYPE_ean13pwcd,
+  XFA_BARCODETYPE_ean8,
+  XFA_BARCODETYPE_ean8add2,
+  XFA_BARCODETYPE_ean8add5,
+  XFA_BARCODETYPE_fim,
+  XFA_BARCODETYPE_logmars,
+  XFA_BARCODETYPE_maxicode,
+  XFA_BARCODETYPE_msi,
+  XFA_BARCODETYPE_pdf417,
+  XFA_BARCODETYPE_pdf417macro,
+  XFA_BARCODETYPE_plessey,
+  XFA_BARCODETYPE_postAUSCust2,
+  XFA_BARCODETYPE_postAUSCust3,
+  XFA_BARCODETYPE_postAUSReplyPaid,
+  XFA_BARCODETYPE_postAUSStandard,
+  XFA_BARCODETYPE_postUKRM4SCC,
+  XFA_BARCODETYPE_postUS5Zip,
+  XFA_BARCODETYPE_postUSDPBC,
+  XFA_BARCODETYPE_postUSIMB,
+  XFA_BARCODETYPE_postUSStandard,
+  XFA_BARCODETYPE_QRCode,
+  XFA_BARCODETYPE_rfid,
+  XFA_BARCODETYPE_rss14,
+  XFA_BARCODETYPE_rss14Expanded,
+  XFA_BARCODETYPE_rss14Limited,
+  XFA_BARCODETYPE_rss14Stacked,
+  XFA_BARCODETYPE_rss14StackedOmni,
+  XFA_BARCODETYPE_rss14Truncated,
+  XFA_BARCODETYPE_telepen,
+  XFA_BARCODETYPE_ucc128,
+  XFA_BARCODETYPE_ucc128random,
+  XFA_BARCODETYPE_ucc128sscc,
+  XFA_BARCODETYPE_upcA,
+  XFA_BARCODETYPE_upcAadd2,
+  XFA_BARCODETYPE_upcAadd5,
+  XFA_BARCODETYPE_upcApwcd,
+  XFA_BARCODETYPE_upcE,
+  XFA_BARCODETYPE_upcEadd2,
+  XFA_BARCODETYPE_upcEadd5,
+  XFA_BARCODETYPE_upcean2,
+  XFA_BARCODETYPE_upcean5,
+  XFA_BARCODETYPE_upsMaxicode
+};
+struct XFA_BARCODETYPEENUMINFO {
+  uint32_t uHash;
+  const FX_WCHAR* pName;
+  XFA_BARCODETYPEENUM eName;
+  BC_TYPE eBCType;
+};
+typedef XFA_BARCODETYPEENUMINFO const* XFA_LPCBARCODETYPEENUMINFO;
+extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[];
+
+#endif  // XFA_FXFA_APP_XFA_FFBARCODE_H_
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.cpp b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
new file mode 100644
index 0000000..862a2cd
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
@@ -0,0 +1,335 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_ffexclgroup.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+#include "xfa/include/fwl/lightwidget/checkbox.h"
+
+CXFA_FFCheckButton::CXFA_FFCheckButton(CXFA_FFPageView* pPageView,
+                                       CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {
+  m_rtCheckBox.Set(0, 0, 0, 0);
+}
+CXFA_FFCheckButton::~CXFA_FFCheckButton() {}
+FX_BOOL CXFA_FFCheckButton::LoadWidget() {
+  CFWL_CheckBox* pCheckBox = CFWL_CheckBox::Create();
+  pCheckBox->Initialize();
+  m_pNormalWidget = pCheckBox;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  if (m_pDataAcc->IsRadioButton()) {
+    pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF);
+  }
+  m_pNormalWidget = (CFWL_Widget*)pCheckBox;
+  m_pNormalWidget->SetPrivateData(m_pNormalWidget->GetWidget(), this, NULL);
+  m_pNormalWidget->LockUpdate();
+  UpdateWidgetProperty();
+  XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState();
+  SetFWLCheckState(eState);
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFCheckButton::UpdateWidgetProperty() {
+  CFWL_CheckBox* pCheckBox = (CFWL_CheckBox*)m_pNormalWidget;
+  if (!m_pNormalWidget) {
+    return;
+  }
+  FX_FLOAT fSize = m_pDataAcc->GetCheckButtonSize();
+  pCheckBox->SetBoxSize(fSize);
+  FX_DWORD dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCross;
+  int32_t iCheckMark = m_pDataAcc->GetCheckButtonMark();
+  switch (iCheckMark) {
+    case XFA_ATTRIBUTEENUM_Check:
+      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCheck;
+      break;
+    case XFA_ATTRIBUTEENUM_Circle:
+      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
+      break;
+    case XFA_ATTRIBUTEENUM_Cross:
+      break;
+    case XFA_ATTRIBUTEENUM_Diamond:
+      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeDiamond;
+      break;
+    case XFA_ATTRIBUTEENUM_Square:
+      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeSquare;
+      break;
+    case XFA_ATTRIBUTEENUM_Star:
+      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeStar;
+      break;
+    default: {
+      int32_t iShape = m_pDataAcc->GetCheckButtonShape();
+      if (iShape == XFA_ATTRIBUTEENUM_Round) {
+        dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
+      }
+    } break;
+  }
+  if (m_pDataAcc->IsAllowNeutral()) {
+    dwStyleEx |= FWL_STYLEEXT_CKB_3State;
+  }
+  pCheckBox->ModifyStylesEx(
+      dwStyleEx, FWL_STYLEEXT_CKB_SignShapeMask | FWL_STYLEEXT_CKB_3State);
+}
+FX_BOOL CXFA_FFCheckButton::PerformLayout() {
+  CXFA_FFWidget::PerformLayout();
+  FX_FLOAT fCheckSize = m_pDataAcc->GetCheckButtonSize();
+  CXFA_Margin mgWidget = m_pDataAcc->GetMargin();
+  CFX_RectF rtWidget;
+  GetRectWithoutRotate(rtWidget);
+  if (mgWidget) {
+    XFA_RectWidthoutMargin(rtWidget, mgWidget);
+  }
+  int32_t iCapPlacement = -1;
+  FX_FLOAT fCapReserve = 0;
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  if (caption && caption.GetPresence()) {
+    m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width,
+                    rtWidget.height);
+    iCapPlacement = caption.GetPlacementType();
+    fCapReserve = caption.GetReserve();
+    if (fCapReserve <= 0) {
+      if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
+          iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
+        fCapReserve = rtWidget.height - fCheckSize;
+      } else {
+        fCapReserve = rtWidget.width - fCheckSize;
+      }
+    }
+  }
+  int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
+  int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
+  if (CXFA_Para para = m_pDataAcc->GetPara()) {
+    iHorzAlign = para.GetHorizontalAlign();
+    iVertAlign = para.GetVerticalAlign();
+  }
+  m_rtUI = rtWidget;
+  CXFA_Margin mgCap = caption.GetMargin();
+  switch (iCapPlacement) {
+    case XFA_ATTRIBUTEENUM_Left: {
+      m_rtCaption.width = fCapReserve;
+      CapLeftRightPlacement(mgCap);
+      m_rtUI.width -= fCapReserve;
+      m_rtUI.left += fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Top: {
+      m_rtCaption.height = fCapReserve;
+      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+      m_rtUI.height -= fCapReserve;
+      m_rtUI.top += fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Right: {
+      m_rtCaption.left = m_rtCaption.right() - fCapReserve;
+      m_rtCaption.width = fCapReserve;
+      CapLeftRightPlacement(mgCap);
+      m_rtUI.width -= fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Bottom: {
+      m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
+      m_rtCaption.height = fCapReserve;
+      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+      m_rtUI.height -= fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Inline:
+      break;
+    default:
+      iHorzAlign = XFA_ATTRIBUTEENUM_Right;
+      break;
+  }
+  if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) {
+    m_rtUI.left += (m_rtUI.width - fCheckSize) / 2;
+  } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) {
+    m_rtUI.left = m_rtUI.right() - fCheckSize;
+  }
+  if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) {
+    m_rtUI.top += (m_rtUI.height - fCheckSize) / 2;
+  } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) {
+    m_rtUI.top = m_rtUI.bottom() - fCheckSize;
+  }
+  m_rtUI.width = fCheckSize;
+  m_rtUI.height = fCheckSize;
+  AddUIMargin(iCapPlacement);
+  m_rtCheckBox = m_rtUI;
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  if (borderUI) {
+    CXFA_Margin margin = borderUI.GetMargin();
+    if (margin) {
+      XFA_RectWidthoutMargin(m_rtUI, margin);
+    }
+  }
+  m_rtUI.Normalize();
+  LayoutCaption();
+  SetFWLRect();
+  if (m_pNormalWidget) {
+    m_pNormalWidget->Update();
+  }
+  return TRUE;
+}
+void CXFA_FFCheckButton::CapLeftRightPlacement(CXFA_Margin mgCap) {
+  XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+  if (m_rtCaption.height < 0) {
+    m_rtCaption.top += m_rtCaption.height;
+  }
+  if (m_rtCaption.width < 0) {
+    m_rtCaption.left += m_rtCaption.width;
+    m_rtCaption.width = -m_rtCaption.width;
+  }
+}
+void CXFA_FFCheckButton::AddUIMargin(int32_t iCapPlacement) {
+  CFX_RectF rtUIMargin;
+  m_pDataAcc->GetUIMargin(rtUIMargin);
+  m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2;
+  FX_FLOAT fLeftAddRight = rtUIMargin.left + rtUIMargin.width;
+  FX_FLOAT fTopAddBottom = rtUIMargin.top + rtUIMargin.height;
+  if (m_rtUI.width < fLeftAddRight) {
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right ||
+        iCapPlacement == XFA_ATTRIBUTEENUM_Left) {
+      m_rtUI.left -= fLeftAddRight - m_rtUI.width;
+    } else {
+      m_rtUI.left -= 2 * (fLeftAddRight - m_rtUI.width);
+    }
+    m_rtUI.width += 2 * (fLeftAddRight - m_rtUI.width);
+  }
+  if (m_rtUI.height < fTopAddBottom) {
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) {
+      m_rtUI.left -= fTopAddBottom - m_rtUI.height;
+    }
+    m_rtUI.top -= fTopAddBottom - m_rtUI.height;
+    m_rtUI.height += 2 * (fTopAddBottom - m_rtUI.height);
+  }
+}
+void CXFA_FFCheckButton::RenderWidget(CFX_Graphics* pGS,
+                                      CFX_Matrix* pMatrix,
+                                      FX_DWORD dwStatus,
+                                      int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate,
+             m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round
+                 ? XFA_DRAWBOX_ForceRound
+                 : 0);
+  RenderCaption(pGS, &mtRotate);
+  DrawHighlight(pGS, &mtRotate, dwStatus,
+                m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round);
+  CFX_Matrix mt;
+  mt.Set(1, 0, 0, 1, m_rtCheckBox.left, m_rtCheckBox.top);
+  mt.Concat(mtRotate);
+  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
+                                                 pGS, &mt);
+}
+FX_BOOL CXFA_FFCheckButton::OnLButtonUp(FX_DWORD dwFlags,
+                                        FX_FLOAT fx,
+                                        FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (!IsButtonDown()) {
+    return FALSE;
+  }
+  SetButtonDown(FALSE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+XFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() {
+  XFA_CHECKSTATE eCheckState = XFA_CHECKSTATE_Off;
+  FX_DWORD dwState = m_pNormalWidget->GetStates();
+  if (dwState & FWL_STATE_CKB_Checked) {
+    eCheckState = XFA_CHECKSTATE_On;
+  } else if (dwState & FWL_STATE_CKB_Neutral) {
+    eCheckState = XFA_CHECKSTATE_Neutral;
+  }
+  return eCheckState;
+}
+FX_BOOL CXFA_FFCheckButton::CommitData() {
+  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
+  m_pDataAcc->SetCheckState(eCheckState, TRUE);
+  return TRUE;
+}
+FX_BOOL CXFA_FFCheckButton::IsDataChanged() {
+  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
+  return m_pDataAcc->GetCheckState() != eCheckState;
+}
+void CXFA_FFCheckButton::SetFWLCheckState(XFA_CHECKSTATE eCheckState) {
+  if (eCheckState == XFA_CHECKSTATE_Neutral) {
+    m_pNormalWidget->SetStates(FWL_STATE_CKB_Neutral, TRUE);
+  } else {
+    m_pNormalWidget->SetStates(FWL_STATE_CKB_Checked,
+                               eCheckState == XFA_CHECKSTATE_On);
+  }
+}
+FX_BOOL CXFA_FFCheckButton::UpdateFWLData() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState();
+  SetFWLCheckState(eState);
+  m_pNormalWidget->Update();
+  return TRUE;
+}
+int32_t CXFA_FFCheckButton::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFCheckButton::OnProcessEvent(CFWL_Event* pEvent) {
+  CXFA_FFField::OnProcessEvent(pEvent);
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  switch (dwEventID) {
+    case FWL_EVTHASH_CKB_CheckStateChanged: {
+      CXFA_EventParam eParam;
+      eParam.m_eType = XFA_EVENT_Change;
+      m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
+      CXFA_WidgetAcc* pFFExclGroup = m_pDataAcc->GetExclGroup();
+      if (ProcessCommittedData()) {
+        eParam.m_pTarget = pFFExclGroup;
+        if (pFFExclGroup) {
+          m_pDocView->AddValidateWidget(pFFExclGroup);
+          m_pDocView->AddCalculateWidgetAcc(pFFExclGroup);
+          pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
+        }
+        eParam.m_pTarget = m_pDataAcc;
+        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
+      } else {
+        SetFWLCheckState(m_pDataAcc->GetCheckState());
+      }
+      if (pFFExclGroup) {
+        eParam.m_pTarget = pFFExclGroup;
+        pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
+      }
+      eParam.m_pTarget = m_pDataAcc;
+      m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
+      break;
+    }
+    default: {}
+  }
+  return m_pOldDelegate->OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFCheckButton::OnDrawWidget(CFX_Graphics* pGraphics,
+                                         const CFX_Matrix* pMatrix) {
+  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.h b/xfa/fxfa/app/xfa_ffcheckbutton.h
new file mode 100644
index 0000000..8527365
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFCHECKBUTTON_H_
+#define XFA_FXFA_APP_XFA_FFCHECKBUTTON_H_
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+
+class CXFA_FFCheckButton : public CXFA_FFField {
+ public:
+  CXFA_FFCheckButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFCheckButton();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+
+  virtual FX_BOOL LoadWidget();
+  virtual FX_BOOL PerformLayout();
+  virtual FX_BOOL UpdateFWLData();
+  virtual void UpdateWidgetProperty();
+  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  void SetFWLCheckState(XFA_CHECKSTATE eCheckState);
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  virtual FX_BOOL CommitData();
+  virtual FX_BOOL IsDataChanged();
+  void CapLeftRightPlacement(CXFA_Margin mgCap);
+  void AddUIMargin(int32_t iCapPlacement);
+  XFA_CHECKSTATE FWLState2XFAState();
+  IFWL_WidgetDelegate* m_pOldDelegate;
+  CFX_RectF m_rtCheckBox;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFCHECKBUTTON_H_
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.cpp b/xfa/fxfa/app/xfa_ffchoicelist.cpp
new file mode 100644
index 0000000..2789e07
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffchoicelist.cpp
@@ -0,0 +1,530 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/lightwidget/combobox.h"
+#include "xfa/include/fwl/lightwidget/listbox.h"
+
+CXFA_FFListBox::CXFA_FFListBox(CXFA_FFPageView* pPageView,
+                               CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
+CXFA_FFListBox::~CXFA_FFListBox() {
+  if (m_pNormalWidget) {
+    IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+    IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+    pNoteDriver->UnregisterEventTarget(pWidget);
+  }
+}
+FX_BOOL CXFA_FFListBox::LoadWidget() {
+  CFWL_ListBox* pListBox = CFWL_ListBox::Create();
+  pListBox->Initialize();
+  pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll | FWL_WGTSTYLE_NoBackground,
+                         0xFFFFFFFF);
+  m_pNormalWidget = (CFWL_Widget*)pListBox;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideStringArray wsLabelArray;
+  m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE);
+  int32_t iItems = wsLabelArray.GetSize();
+  for (int32_t i = 0; i < iItems; i++) {
+    pListBox->AddString(wsLabelArray[i]);
+  }
+  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus;
+  if (m_pDataAcc->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection;
+  }
+  dwExtendedStyle |= GetAlignment();
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+  CFX_Int32Array iSelArray;
+  m_pDataAcc->GetSelectedItems(iSelArray);
+  int32_t iSelCount = iSelArray.GetSize();
+  for (int32_t j = 0; j < iSelCount; j++) {
+    FWL_HLISTITEM item = pListBox->GetItem(iSelArray[j]);
+    pListBox->SetSelItem(item, TRUE);
+  }
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+FX_BOOL CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
+  FX_BOOL flag = ProcessCommittedData();
+  if (!flag) {
+    UpdateFWLData();
+  }
+  CXFA_FFField::OnKillFocus(pNewFocus);
+  return TRUE;
+}
+FX_BOOL CXFA_FFListBox::CommitData() {
+  CFWL_ListBox* pListBox = static_cast<CFWL_ListBox*>(m_pNormalWidget);
+  int32_t iSels = pListBox->CountSelItems();
+  CFX_Int32Array iSelArray;
+  for (int32_t i = 0; i < iSels; i++) {
+    iSelArray.Add(pListBox->GetSelIndex(i));
+  }
+  m_pDataAcc->SetSelectdItems(iSelArray, TRUE);
+  return TRUE;
+}
+FX_BOOL CXFA_FFListBox::IsDataChanged() {
+  CFX_Int32Array iSelArray;
+  m_pDataAcc->GetSelectedItems(iSelArray);
+  int32_t iOldSels = iSelArray.GetSize();
+  CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
+  int32_t iSels = pListBox->CountSelItems();
+  if (iOldSels == iSels) {
+    int32_t iIndex = 0;
+    for (; iIndex < iSels; iIndex++) {
+      FWL_HLISTITEM hlistItem = pListBox->GetItem(iSelArray[iIndex]);
+      if (!(pListBox->GetItemStates(hlistItem) && FWL_ITEMSTATE_LTB_Selected)) {
+        break;
+      }
+    }
+    if (iIndex == iSels) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+FX_DWORD CXFA_FFListBox::GetAlignment() {
+  FX_DWORD dwExtendedStyle = 0;
+  if (CXFA_Para para = m_pDataAcc->GetPara()) {
+    int32_t iHorz = para.GetHorizontalAlign();
+    switch (iHorz) {
+      case XFA_ATTRIBUTEENUM_Center:
+        dwExtendedStyle |= FWL_STYLEEXT_LTB_CenterAlign;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        break;
+      case XFA_ATTRIBUTEENUM_Radix:
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        dwExtendedStyle |= FWL_STYLEEXT_LTB_RightAlign;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_LTB_LeftAlign;
+        break;
+    }
+  }
+  return dwExtendedStyle;
+}
+FX_BOOL CXFA_FFListBox::UpdateFWLData() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_ListBox* pListBox = ((CFWL_ListBox*)m_pNormalWidget);
+  CFX_ArrayTemplate<FWL_HLISTITEM> selItemArray;
+  CFX_Int32Array iSelArray;
+  m_pDataAcc->GetSelectedItems(iSelArray);
+  int32_t iSelCount = iSelArray.GetSize();
+  for (int32_t j = 0; j < iSelCount; j++) {
+    FWL_HLISTITEM lpItemSel = pListBox->GetSelItem(iSelArray[j]);
+    selItemArray.Add(lpItemSel);
+  }
+  pListBox->SetSelItem(pListBox->GetSelItem(-1), FALSE);
+  for (int32_t i = 0; i < iSelCount; i++) {
+    ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(selItemArray[i], TRUE);
+  }
+  m_pNormalWidget->Update();
+  return TRUE;
+}
+void CXFA_FFListBox::OnSelectChanged(IFWL_Widget* pWidget,
+                                     const CFX_Int32Array& arrSels) {
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Change;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
+  CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
+  int32_t iSels = pListBox->CountSelItems();
+  if (iSels > 0) {
+    pListBox->GetItemText(pListBox->GetSelItem(0), eParam.m_wsNewText);
+  }
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
+}
+void CXFA_FFListBox::SetItemState(int32_t nIndex, FX_BOOL bSelected) {
+  FWL_HLISTITEM item = ((CFWL_ListBox*)m_pNormalWidget)->GetSelItem(nIndex);
+  ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(item, bSelected);
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+void CXFA_FFListBox::InsertItem(const CFX_WideStringC& wsLabel,
+                                int32_t nIndex) {
+  CFX_WideString wsTemp(wsLabel);
+  ((CFWL_ListBox*)m_pNormalWidget)->AddString(wsTemp);
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+void CXFA_FFListBox::DeleteItem(int32_t nIndex) {
+  if (nIndex < 0) {
+    ((CFWL_ListBox*)m_pNormalWidget)->DeleteAll();
+  } else {
+    ((CFWL_ListBox*)m_pNormalWidget)
+        ->DeleteString(((CFWL_ListBox*)m_pNormalWidget)->GetItem(nIndex));
+  }
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+int32_t CXFA_FFListBox::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFListBox::OnProcessEvent(CFWL_Event* pEvent) {
+  CXFA_FFField::OnProcessEvent(pEvent);
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  switch (dwEventID) {
+    case FWL_EVTHASH_LTB_SelChanged: {
+      CFX_Int32Array arrSels;
+      OnSelectChanged(m_pNormalWidget->GetWidget(), arrSels);
+      break;
+    }
+    default: {}
+  }
+  return m_pOldDelegate->OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFListBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                     const CFX_Matrix* pMatrix) {
+  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
+}
+
+CXFA_FFComboBox::CXFA_FFComboBox(CXFA_FFPageView* pPageView,
+                                 CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
+
+CXFA_FFComboBox::~CXFA_FFComboBox() {}
+
+FX_BOOL CXFA_FFComboBox::GetBBox(CFX_RectF& rtBox,
+                                 FX_DWORD dwStatus,
+                                 FX_BOOL bDrawFocus) {
+  if (bDrawFocus)
+    return FALSE;
+  return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
+}
+
+FX_BOOL CXFA_FFComboBox::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFX_RectF rtWidget;
+  ((CFWL_ComboBox*)m_pNormalWidget)->GetBBox(rtWidget);
+  if (rtWidget.Contains(fx, fy)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_FFComboBox::LoadWidget() {
+  CFWL_ComboBox* pComboBox = CFWL_ComboBox::Create();
+  pComboBox->Initialize();
+  m_pNormalWidget = (CFWL_Widget*)pComboBox;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideStringArray wsLabelArray;
+  m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE);
+  int32_t iItems = wsLabelArray.GetSize();
+  for (int32_t i = 0; i < iItems; i++) {
+    pComboBox->AddString(wsLabelArray[i]);
+  }
+  CFX_Int32Array iSelArray;
+  m_pDataAcc->GetSelectedItems(iSelArray);
+  int32_t iSelCount = iSelArray.GetSize();
+  if (iSelCount > 0) {
+    pComboBox->SetCurSel(iSelArray[0]);
+  } else {
+    CFX_WideString wsText;
+    m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
+    pComboBox->SetEditText(wsText);
+  }
+  UpdateWidgetProperty();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFComboBox::UpdateWidgetProperty() {
+  CFWL_ComboBox* pComboBox = (CFWL_ComboBox*)m_pNormalWidget;
+  if (!pComboBox) {
+    return;
+  }
+  FX_DWORD dwExtendedStyle = 0;
+  FX_DWORD dwEditStyles =
+      FWL_STYLEEXT_EDT_ReadOnly | FWL_STYLEEXT_EDT_LastLineHeight;
+  dwExtendedStyle |= UpdateUIProperty();
+  if (m_pDataAcc->IsChoiceListAllowTextEntry()) {
+    dwEditStyles &= ~FWL_STYLEEXT_EDT_ReadOnly;
+    dwExtendedStyle |= FWL_STYLEEXT_CMB_DropDown;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
+    dwExtendedStyle |= FWL_STYLEEXT_CMB_ReadOnly;
+  }
+  dwExtendedStyle |= GetAlignment();
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+    dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
+  }
+  pComboBox->EditModifyStylesEx(dwEditStyles, 0xFFFFFFFF);
+}
+FX_BOOL CXFA_FFComboBox::OnRButtonUp(FX_DWORD dwFlags,
+                                     FX_FLOAT fx,
+                                     FX_FLOAT fy) {
+  if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy))
+    return FALSE;
+
+  GetDoc()->GetDocProvider()->PopupMenu(this, CFX_PointF(fx, fy), nullptr);
+  return TRUE;
+}
+FX_BOOL CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+  FX_BOOL flag = ProcessCommittedData();
+  if (!flag) {
+    UpdateFWLData();
+  }
+  CXFA_FFField::OnKillFocus(pNewWidget);
+  return TRUE;
+}
+void CXFA_FFComboBox::OpenDropDownList() {
+  ((CFWL_ComboBox*)m_pNormalWidget)->OpenDropDownList(TRUE);
+}
+FX_BOOL CXFA_FFComboBox::CommitData() {
+  return m_pDataAcc->SetValue(m_wsNewValue, XFA_VALUEPICTURE_Raw);
+}
+FX_BOOL CXFA_FFComboBox::IsDataChanged() {
+  CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
+  CFX_WideString wsText;
+  pFWLcombobox->GetEditText(wsText);
+  int32_t iCursel = pFWLcombobox->GetCurSel();
+  if (iCursel >= 0) {
+    CFX_WideString wsSel;
+    pFWLcombobox->GetTextByIndex(iCursel, wsSel);
+    if (wsSel == wsText) {
+      m_pDataAcc->GetChoiceListItem(wsText, iCursel, TRUE);
+    }
+  }
+  CFX_WideString wsOldValue;
+  m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Raw);
+  if (wsOldValue != wsText) {
+    m_wsNewValue = wsText;
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_FFComboBox::FWLEventSelChange(CXFA_EventParam* pParam) {
+  pParam->m_eType = XFA_EVENT_Change;
+  pParam->m_pTarget = m_pDataAcc;
+  CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
+  pFWLcombobox->GetEditText(pParam->m_wsNewText);
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, pParam);
+}
+FX_DWORD CXFA_FFComboBox::GetAlignment() {
+  FX_DWORD dwExtendedStyle = 0;
+  if (CXFA_Para para = m_pDataAcc->GetPara()) {
+    int32_t iHorz = para.GetHorizontalAlign();
+    switch (iHorz) {
+      case XFA_ATTRIBUTEENUM_Center:
+        dwExtendedStyle |=
+            FWL_STYLEEXT_CMB_EditHCenter | FWL_STYLEEXT_CMB_ListItemCenterAlign;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditJustified;
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        break;
+      case XFA_ATTRIBUTEENUM_Radix:
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        break;
+      default:
+        dwExtendedStyle |=
+            FWL_STYLEEXT_CMB_EditHNear | FWL_STYLEEXT_CMB_ListItemLeftAlign;
+        break;
+    }
+    int32_t iVert = para.GetVerticalAlign();
+    switch (iVert) {
+      case XFA_ATTRIBUTEENUM_Middle:
+        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVCenter;
+        break;
+      case XFA_ATTRIBUTEENUM_Bottom:
+        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVFar;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVNear;
+        break;
+    }
+  }
+  return dwExtendedStyle;
+}
+FX_BOOL CXFA_FFComboBox::UpdateFWLData() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFX_Int32Array iSelArray;
+  m_pDataAcc->GetSelectedItems(iSelArray);
+  int32_t iSelCount = iSelArray.GetSize();
+  if (iSelCount > 0) {
+    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(iSelArray[0]);
+  } else {
+    CFX_WideString wsText;
+    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
+    m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
+    ((CFWL_ComboBox*)m_pNormalWidget)->SetEditText(wsText);
+  }
+  m_pNormalWidget->Update();
+  return TRUE;
+}
+FX_BOOL CXFA_FFComboBox::CanUndo() {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanUndo();
+}
+FX_BOOL CXFA_FFComboBox::CanRedo() {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanRedo();
+}
+FX_BOOL CXFA_FFComboBox::Undo() {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditUndo();
+}
+FX_BOOL CXFA_FFComboBox::Redo() {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditRedo();
+}
+FX_BOOL CXFA_FFComboBox::CanCopy() {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCopy();
+}
+FX_BOOL CXFA_FFComboBox::CanCut() {
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCut();
+}
+FX_BOOL CXFA_FFComboBox::CanPaste() {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         (m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open);
+}
+FX_BOOL CXFA_FFComboBox::CanSelectAll() {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanSelectAll();
+}
+FX_BOOL CXFA_FFComboBox::Copy(CFX_WideString& wsCopy) {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCopy(wsCopy);
+}
+FX_BOOL CXFA_FFComboBox::Cut(CFX_WideString& wsCut) {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditCut(wsCut);
+}
+FX_BOOL CXFA_FFComboBox::Paste(const CFX_WideString& wsPaste) {
+  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
+         ((CFWL_ComboBox*)m_pNormalWidget)->EditPaste(wsPaste);
+}
+FX_BOOL CXFA_FFComboBox::SelectAll() {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditSelectAll();
+}
+FX_BOOL CXFA_FFComboBox::Delete() {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditDelete();
+}
+FX_BOOL CXFA_FFComboBox::DeSelect() {
+  return ((CFWL_ComboBox*)m_pNormalWidget)->EditDeSelect();
+}
+void CXFA_FFComboBox::SetItemState(int32_t nIndex, FX_BOOL bSelected) {
+  if (bSelected) {
+    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(nIndex);
+  } else {
+    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
+  }
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+void CXFA_FFComboBox::InsertItem(const CFX_WideStringC& wsLabel,
+                                 int32_t nIndex) {
+  ((CFWL_ComboBox*)m_pNormalWidget)->AddString(wsLabel);
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+void CXFA_FFComboBox::DeleteItem(int32_t nIndex) {
+  if (nIndex < 0) {
+    ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAll();
+  } else {
+    ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAt(nIndex);
+  }
+  m_pNormalWidget->Update();
+  AddInvalidateRect();
+}
+void CXFA_FFComboBox::OnTextChanged(IFWL_Widget* pWidget,
+                                    const CFX_WideString& wsChanged) {
+  CXFA_EventParam eParam;
+  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
+  eParam.m_wsChange = wsChanged;
+  FWLEventSelChange(&eParam);
+}
+void CXFA_FFComboBox::OnSelectChanged(IFWL_Widget* pWidget,
+                                      const CFX_Int32Array& arrSels,
+                                      FX_BOOL bLButtonUp) {
+  CXFA_EventParam eParam;
+  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
+  FWLEventSelChange(&eParam);
+  if (m_pDataAcc->GetChoiceListCommitOn() == XFA_ATTRIBUTEENUM_Select &&
+      bLButtonUp) {
+    m_pDocView->SetFocusWidgetAcc(NULL);
+  }
+}
+void CXFA_FFComboBox::OnPreOpen(IFWL_Widget* pWidget) {
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_PreOpen;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PreOpen, &eParam);
+}
+void CXFA_FFComboBox::OnPostOpen(IFWL_Widget* pWidget) {
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_PostOpen;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PostOpen, &eParam);
+}
+
+int32_t CXFA_FFComboBox::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFComboBox::OnProcessEvent(CFWL_Event* pEvent) {
+  CXFA_FFField::OnProcessEvent(pEvent);
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  switch (dwEventID) {
+    case FWL_EVTHASH_CMB_SelChanged: {
+      CFWL_EvtCmbSelChanged* postEvent = (CFWL_EvtCmbSelChanged*)pEvent;
+      OnSelectChanged(m_pNormalWidget->GetWidget(), postEvent->iArraySels,
+                      postEvent->bLButtonUp);
+      break;
+    }
+    case FWL_EVTHASH_CMB_EditChanged: {
+      CFX_WideString wsChanged;
+      OnTextChanged(m_pNormalWidget->GetWidget(), wsChanged);
+      break;
+    }
+    case FWL_EVTHASH_CMB_PreDropDown: {
+      OnPreOpen(m_pNormalWidget->GetWidget());
+      break;
+    }
+    case FWL_EVTHASH_CMB_PostDropDown: {
+      OnPostOpen(m_pNormalWidget->GetWidget());
+      break;
+    }
+    default: {}
+  }
+  return m_pOldDelegate->OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFComboBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.h b/xfa/fxfa/app/xfa_ffchoicelist.h
new file mode 100644
index 0000000..1699b18
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffchoicelist.h
@@ -0,0 +1,96 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFCHOICELIST_H_
+#define XFA_FXFA_APP_XFA_FFCHOICELIST_H_
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+
+class CXFA_FFListBox : public CXFA_FFField {
+ public:
+  CXFA_FFListBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFListBox();
+  virtual FX_BOOL LoadWidget();
+  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
+
+ protected:
+  virtual FX_BOOL CommitData();
+  virtual FX_BOOL UpdateFWLData();
+  virtual FX_BOOL IsDataChanged();
+  FX_DWORD GetAlignment();
+
+ public:
+  void OnSelectChanged(IFWL_Widget* pWidget, const CFX_Int32Array& arrSels);
+  void SetItemState(int32_t nIndex, FX_BOOL bSelected);
+  void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
+  void DeleteItem(int32_t nIndex);
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  IFWL_WidgetDelegate* m_pOldDelegate;
+};
+class CXFA_FFComboBox : public CXFA_FFField {
+ public:
+  CXFA_FFComboBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFComboBox();
+  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
+                          FX_DWORD dwStatus,
+                          FX_BOOL bDrawFocus = FALSE);
+  virtual FX_BOOL LoadWidget();
+  virtual void UpdateWidgetProperty();
+  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
+  virtual FX_BOOL CanUndo();
+  virtual FX_BOOL CanRedo();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+
+  virtual FX_BOOL CanCopy();
+  virtual FX_BOOL CanCut();
+  virtual FX_BOOL CanPaste();
+  virtual FX_BOOL CanSelectAll();
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
+  virtual FX_BOOL Cut(CFX_WideString& wsCut);
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL SelectAll();
+  virtual FX_BOOL Delete();
+  virtual FX_BOOL DeSelect();
+  void OpenDropDownList();
+
+ protected:
+  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL CommitData();
+  virtual FX_BOOL UpdateFWLData();
+  virtual FX_BOOL IsDataChanged();
+  FX_DWORD GetAlignment();
+  void FWLEventSelChange(CXFA_EventParam* pParam);
+
+  CFX_WideString m_wsNewValue;
+
+ public:
+  void OnTextChanged(IFWL_Widget* pWidget, const CFX_WideString& wsChanged);
+  void OnSelectChanged(IFWL_Widget* pWidget,
+                       const CFX_Int32Array& arrSels,
+                       FX_BOOL bLButtonUp);
+  void OnPreOpen(IFWL_Widget* pWidget);
+  void OnPostOpen(IFWL_Widget* pWidget);
+  void SetItemState(int32_t nIndex, FX_BOOL bSelected);
+  void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
+  void DeleteItem(int32_t nIndex);
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  IFWL_WidgetDelegate* m_pOldDelegate;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFCHOICELIST_H_
diff --git a/xfa/fxfa/app/xfa_ffdoc.cpp b/xfa/fxfa/app/xfa_ffdoc.cpp
new file mode 100644
index 0000000..e33dd4f
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdoc.cpp
@@ -0,0 +1,431 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+
+#include "core/include/fpdfapi/cpdf_array.h"
+#include "core/include/fpdfapi/cpdf_document.h"
+#include "core/include/fpdfdoc/fpdf_doc.h"
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_algorithm.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_ffnotify.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fontmgr.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/include/fwl/core/fwl_note.h"
+
+CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider)
+    : m_pDocProvider(pDocProvider),
+      m_pDocument(nullptr),
+      m_pStream(nullptr),
+      m_pApp(pApp),
+      m_pNotify(nullptr),
+      m_pPDFDoc(nullptr),
+      m_dwDocType(XFA_DOCTYPE_Static),
+      m_bOwnStream(TRUE) {}
+CXFA_FFDoc::~CXFA_FFDoc() {
+  CloseDoc();
+}
+FX_DWORD CXFA_FFDoc::GetDocType() {
+  return m_dwDocType;
+}
+int32_t CXFA_FFDoc::StartLoad() {
+  m_pNotify = new CXFA_FFNotify(this);
+  IXFA_DocParser* pDocParser = IXFA_DocParser::Create(m_pNotify);
+  int32_t iStatus = pDocParser->StartParse(m_pStream);
+  m_pDocument = pDocParser->GetDocument();
+  return iStatus;
+}
+FX_BOOL XFA_GetPDFContentsFromPDFXML(IFDE_XMLNode* pPDFElement,
+                                     uint8_t*& pByteBuffer,
+                                     int32_t& iBufferSize) {
+  IFDE_XMLElement* pDocumentElement = NULL;
+  for (IFDE_XMLNode* pXMLNode =
+           pPDFElement->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      CFX_WideString wsTagName;
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      pXMLElement->GetTagName(wsTagName);
+      if (wsTagName.Equal(FX_WSTRC(L"document"))) {
+        pDocumentElement = pXMLElement;
+        break;
+      }
+    }
+  }
+  if (!pDocumentElement) {
+    return FALSE;
+  }
+  IFDE_XMLElement* pChunkElement = NULL;
+  for (IFDE_XMLNode* pXMLNode =
+           pDocumentElement->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      CFX_WideString wsTagName;
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      pXMLElement->GetTagName(wsTagName);
+      if (wsTagName.Equal(FX_WSTRC(L"chunk"))) {
+        pChunkElement = pXMLElement;
+        break;
+      }
+    }
+  }
+  if (!pChunkElement) {
+    return FALSE;
+  }
+  CFX_WideString wsPDFContent;
+  pChunkElement->GetTextData(wsPDFContent);
+  iBufferSize = FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), NULL);
+  pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1);
+  pByteBuffer[iBufferSize] = '0';  // FIXME: I bet this is wrong.
+  FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), pByteBuffer);
+  return TRUE;
+}
+void XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) {
+  CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChildNode) {
+    CXFA_Node* pOriginChild =
+        pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash());
+    if (pOriginChild) {
+      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    } else {
+      CXFA_Node* pNextSibling =
+          pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      pNewRoot->RemoveChild(pChildNode);
+      pOriginRoot->InsertChild(pChildNode);
+      pChildNode = pNextSibling;
+      pNextSibling = NULL;
+    }
+  }
+}
+int32_t CXFA_FFDoc::DoLoad(IFX_Pause* pPause) {
+  int32_t iStatus = m_pDocument->GetParser()->DoParse(pPause);
+  if (iStatus == XFA_PARSESTATUS_Done && !m_pPDFDoc) {
+    CXFA_Node* pPDFNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Pdf));
+    if (!pPDFNode) {
+      return XFA_PARSESTATUS_SyntaxErr;
+    }
+    IFDE_XMLNode* pPDFXML = pPDFNode->GetXMLMappingNode();
+    if (pPDFXML->GetType() != FDE_XMLNODE_Element) {
+      return XFA_PARSESTATUS_SyntaxErr;
+    }
+    int32_t iBufferSize = 0;
+    uint8_t* pByteBuffer = NULL;
+    IFX_FileRead* pXFAReader = NULL;
+    if (XFA_GetPDFContentsFromPDFXML(pPDFXML, pByteBuffer, iBufferSize)) {
+      pXFAReader = FX_CreateMemoryStream(pByteBuffer, iBufferSize, TRUE);
+    } else {
+      CFX_WideString wsHref;
+      ((IFDE_XMLElement*)pPDFXML)->GetString(L"href", wsHref);
+      if (!wsHref.IsEmpty()) {
+        pXFAReader = GetDocProvider()->OpenLinkedFile(this, wsHref);
+      }
+    }
+    if (!pXFAReader) {
+      return XFA_PARSESTATUS_SyntaxErr;
+    }
+    CPDF_Document* pPDFDocument =
+        GetDocProvider()->OpenPDF(this, pXFAReader, TRUE);
+    FXSYS_assert(!m_pPDFDoc);
+    if (!OpenDoc(pPDFDocument)) {
+      return XFA_PARSESTATUS_SyntaxErr;
+    }
+    IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument, TRUE);
+    if (!pParser) {
+      return XFA_PARSESTATUS_SyntaxErr;
+    }
+    CXFA_Node* pRootNode = NULL;
+    if (pParser->StartParse(m_pStream) == XFA_PARSESTATUS_Ready &&
+        pParser->DoParse(NULL) == XFA_PARSESTATUS_Done) {
+      pRootNode = pParser->GetRootNode();
+    }
+    if (pRootNode && m_pDocument->GetRoot()) {
+      XFA_XPDPacket_MergeRootNode(m_pDocument->GetRoot(), pRootNode);
+      iStatus = XFA_PARSESTATUS_Done;
+    } else {
+      iStatus = XFA_PARSESTATUS_StatusErr;
+    }
+    pParser->Release();
+    pParser = NULL;
+  }
+  return iStatus;
+}
+void CXFA_FFDoc::StopLoad() {
+  m_pApp->GetXFAFontMgr()->LoadDocFonts(this);
+  m_dwDocType = XFA_DOCTYPE_Static;
+  CXFA_Node* pConfig = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
+  if (!pConfig) {
+    return;
+  }
+  CXFA_Node* pAcrobat = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
+  if (!pAcrobat) {
+    return;
+  }
+  CXFA_Node* pAcrobat7 = pAcrobat->GetFirstChildByClass(XFA_ELEMENT_Acrobat7);
+  if (!pAcrobat7) {
+    return;
+  }
+  CXFA_Node* pDynamicRender =
+      pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender);
+  if (!pDynamicRender) {
+    return;
+  }
+  CFX_WideString wsType;
+  if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) {
+    m_dwDocType = XFA_DOCTYPE_Dynamic;
+  }
+}
+IXFA_DocView* CXFA_FFDoc::CreateDocView(FX_DWORD dwView) {
+  CXFA_FFDocView* pDocView =
+      (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView);
+  if (!pDocView) {
+    pDocView = new CXFA_FFDocView(this);
+    m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView);
+  }
+  return pDocView;
+}
+CXFA_FFDocView* CXFA_FFDoc::GetDocView(IXFA_DocLayout* pLayout) {
+  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
+  while (ps) {
+    void* pType;
+    CXFA_FFDocView* pDocView;
+    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
+    if (pDocView->GetXFALayout() == pLayout) {
+      return pDocView;
+    }
+  }
+  return NULL;
+}
+CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
+  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
+  if (ps) {
+    void* pType;
+    CXFA_FFDocView* pDocView;
+    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
+    return pDocView;
+  }
+  return NULL;
+}
+FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
+  m_bOwnStream = bTakeOverFile;
+  m_pStream = pStream;
+  return TRUE;
+}
+FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) {
+  if (pPDFDoc == NULL) {
+    return FALSE;
+  }
+  CPDF_Dictionary* pRoot = pPDFDoc->GetRoot();
+  if (pRoot == NULL) {
+    return FALSE;
+  }
+  CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
+  if (pAcroForm == NULL) {
+    return FALSE;
+  }
+  CPDF_Object* pElementXFA = pAcroForm->GetElementValue("XFA");
+  if (pElementXFA == NULL) {
+    return FALSE;
+  }
+  CFX_ArrayTemplate<CPDF_Stream*> xfaStreams;
+  if (pElementXFA->IsArray()) {
+    CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA;
+    FX_DWORD count = pXFAArray->GetCount() / 2;
+    for (FX_DWORD i = 0; i < count; i++) {
+      if (CPDF_Stream* pStream = pXFAArray->GetStreamAt(i * 2 + 1))
+        xfaStreams.Add(pStream);
+    }
+  } else if (pElementXFA->IsStream()) {
+    xfaStreams.Add((CPDF_Stream*)pElementXFA);
+  }
+  if (xfaStreams.GetSize() < 1) {
+    return FALSE;
+  }
+  IFX_FileRead* pFileRead = new CXFA_FileRead(xfaStreams);
+  m_pPDFDoc = pPDFDoc;
+  if (m_pStream) {
+    m_pStream->Release();
+    m_pStream = NULL;
+  }
+  m_pStream = pFileRead;
+  m_bOwnStream = TRUE;
+  return TRUE;
+}
+FX_BOOL CXFA_FFDoc::CloseDoc() {
+  FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition();
+  while (psClose) {
+    void* pType;
+    CXFA_FFDocView* pDocView;
+    m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView);
+    pDocView->RunDocClose();
+  }
+  if (m_pDocument) {
+    m_pDocument->ClearLayoutData();
+  }
+  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
+  while (ps) {
+    void* pType;
+    CXFA_FFDocView* pDocView;
+    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
+    delete pDocView;
+  }
+  m_mapTypeToDocView.RemoveAll();
+  if (m_pDocument) {
+    IXFA_Parser* pParser = m_pDocument->GetParser();
+    pParser->Release();
+    m_pDocument = NULL;
+  }
+  if (m_pNotify) {
+    delete m_pNotify;
+    m_pNotify = NULL;
+  }
+  m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
+  if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
+    m_pStream->Release();
+    m_pStream = NULL;
+  }
+  ps = m_mapNamedImages.GetStartPosition();
+  while (ps) {
+    void* pName;
+    FX_IMAGEDIB_AND_DPI* pImage = NULL;
+    m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage);
+    if (pImage) {
+      delete pImage->pDibSource;
+      pImage->pDibSource = NULL;
+      FX_Free(pImage);
+      pImage = NULL;
+    }
+  }
+  m_mapNamedImages.RemoveAll();
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->ClearEventTargets(FALSE);
+  return TRUE;
+}
+void CXFA_FFDoc::SetDocType(FX_DWORD dwType) {
+  m_dwDocType = dwType;
+}
+CPDF_Document* CXFA_FFDoc::GetPDFDoc() {
+  return m_pPDFDoc;
+}
+
+CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName,
+                                           int32_t& iImageXDpi,
+                                           int32_t& iImageYDpi) {
+  if (!m_pPDFDoc)
+    return nullptr;
+
+  FX_DWORD dwHash =
+      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), FALSE);
+  FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr;
+  if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) {
+    iImageXDpi = imageDIBDpi->iImageXDpi;
+    iImageYDpi = imageDIBDpi->iImageYDpi;
+    return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource);
+  }
+
+  CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
+  if (!pRoot)
+    return nullptr;
+
+  CPDF_Dictionary* pNames = pRoot->GetDictBy("Names");
+  if (!pNames)
+    return nullptr;
+
+  CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages");
+  if (!pXFAImages)
+    return nullptr;
+
+  CPDF_NameTree nametree(pXFAImages);
+  CFX_ByteString bsName = PDF_EncodeText(wsName.GetPtr(), wsName.GetLength());
+  CPDF_Object* pObject = nametree.LookupValue(bsName);
+  if (!pObject) {
+    int32_t iCount = nametree.GetCount();
+    for (int32_t i = 0; i < iCount; i++) {
+      CFX_ByteString bsTemp;
+      CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp);
+      if (bsTemp == bsName) {
+        pObject = pTempObject;
+        break;
+      }
+    }
+  }
+
+  if (!pObject || !pObject->IsStream())
+    return nullptr;
+
+  if (!imageDIBDpi) {
+    imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1);
+    imageDIBDpi->pDibSource = nullptr;
+    imageDIBDpi->iImageXDpi = 0;
+    imageDIBDpi->iImageYDpi = 0;
+    CPDF_StreamAcc streamAcc;
+    streamAcc.LoadAllData((CPDF_Stream*)pObject);
+    IFX_FileRead* pImageFileRead = FX_CreateMemoryStream(
+        (uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
+    imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(
+        pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
+    imageDIBDpi->iImageXDpi = iImageXDpi;
+    imageDIBDpi->iImageYDpi = iImageYDpi;
+    pImageFileRead->Release();
+  }
+  m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
+  return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
+}
+
+IFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
+  FX_DWORD packetHash =
+      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
+  CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
+  if (!pNode) {
+    return NULL;
+  }
+  IFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode();
+  return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element)
+             ? (IFDE_XMLElement*)pXMLNode
+             : NULL;
+}
+FX_BOOL CXFA_FFDoc::SavePackage(const CFX_WideStringC& wsPackage,
+                                IFX_FileWrite* pFile,
+                                IXFA_ChecksumContext* pCSContext) {
+  IXFA_PacketExport* pExport = IXFA_PacketExport::Create(m_pDocument);
+  if (!pExport) {
+    return FALSE;
+  }
+  FX_DWORD packetHash =
+      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
+  CXFA_Node* pNode = NULL;
+  if (packetHash == XFA_HASHCODE_Xfa) {
+    pNode = m_pDocument->GetRoot();
+  } else {
+    pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
+  }
+  FX_BOOL bFlags = FALSE;
+  if (pNode) {
+    CFX_ByteString bsChecksum;
+    if (pCSContext) {
+      pCSContext->GetChecksum(bsChecksum);
+    }
+    bFlags = pExport->Export(pFile, pNode, 0, bsChecksum.GetLength()
+                                                  ? (const FX_CHAR*)bsChecksum
+                                                  : NULL);
+  } else {
+    bFlags = pExport->Export(pFile);
+  }
+  pExport->Release();
+  return bFlags;
+}
+FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) {
+  FX_BOOL bRet = FALSE;
+  IXFA_PacketImport* pImport = IXFA_PacketImport::Create(m_pDocument);
+  if (pImport) {
+    bRet = pImport->ImportData(pStream);
+    pImport->Release();
+  }
+  return bRet;
+}
diff --git a/xfa/fxfa/app/xfa_ffdoc.h b/xfa/fxfa/app/xfa_ffdoc.h
new file mode 100644
index 0000000..d656d30
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdoc.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFDOC_H_
+#define XFA_FXFA_APP_XFA_FFDOC_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FFApp;
+class CXFA_FFNotify;
+class CXFA_FFDocView;
+
+struct FX_IMAGEDIB_AND_DPI {
+  CFX_DIBSource* pDibSource;
+  int32_t iImageXDpi;
+  int32_t iImageYDpi;
+};
+
+class CXFA_FFDoc : public IXFA_Doc {
+ public:
+  CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider);
+  ~CXFA_FFDoc();
+  IXFA_DocProvider* GetDocProvider() { return m_pDocProvider; }
+  FX_DWORD GetDocType();
+  int32_t StartLoad();
+  int32_t DoLoad(IFX_Pause* pPause = NULL);
+  void StopLoad();
+  IXFA_DocView* CreateDocView(FX_DWORD dwView = 0);
+  FX_BOOL OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile);
+  FX_BOOL OpenDoc(CPDF_Document* pPDFDoc);
+  FX_BOOL CloseDoc();
+  void SetDocType(FX_DWORD dwType);
+  CXFA_Document* GetXFADoc() { return m_pDocument; }
+  CXFA_FFApp* GetApp() { return m_pApp; }
+  CXFA_FFDocView* GetDocView(IXFA_DocLayout* pLayout);
+  CXFA_FFDocView* GetDocView();
+  CPDF_Document* GetPDFDoc();
+  CFX_DIBitmap* GetPDFNamedImage(const CFX_WideStringC& wsName,
+                                 int32_t& iImageXDpi,
+                                 int32_t& iImageYDpi);
+  IFDE_XMLElement* GetPackageData(const CFX_WideStringC& wsPackage);
+  FX_BOOL SavePackage(const CFX_WideStringC& wsPackage,
+                      IFX_FileWrite* pFile,
+                      IXFA_ChecksumContext* pCSContext = NULL);
+  FX_BOOL ImportData(IFX_FileRead* pStream, FX_BOOL bXDP = TRUE);
+
+ protected:
+  IXFA_DocProvider* m_pDocProvider;
+  CXFA_Document* m_pDocument;
+  IFX_FileRead* m_pStream;
+  CXFA_FFApp* m_pApp;
+  CXFA_FFNotify* m_pNotify;
+  CPDF_Document* m_pPDFDoc;
+  CFX_MapPtrToPtr m_mapNamedImages;
+  CFX_MapPtrToPtr m_mapTypeToDocView;
+  FX_DWORD m_dwDocType;
+  FX_BOOL m_bOwnStream;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFDOC_H_
diff --git a/xfa/fxfa/app/xfa_ffdochandler.cpp b/xfa/fxfa/app/xfa_ffdochandler.cpp
new file mode 100644
index 0000000..5ea7884
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdochandler.cpp
@@ -0,0 +1,110 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffdochandler.h"
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+CXFA_FFDocHandler::CXFA_FFDocHandler() {}
+CXFA_FFDocHandler::~CXFA_FFDocHandler() {}
+void CXFA_FFDocHandler::ReleaseDoc(IXFA_Doc* hDoc) {
+  delete hDoc;  // virtual dtor.
+}
+IXFA_DocProvider* CXFA_FFDocHandler::GetDocProvider(IXFA_Doc* hDoc) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocProvider();
+}
+FX_DWORD CXFA_FFDocHandler::GetDocType(IXFA_Doc* hDoc) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocType();
+}
+int32_t CXFA_FFDocHandler::StartLoad(IXFA_Doc* hDoc) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->StartLoad();
+}
+int32_t CXFA_FFDocHandler::DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->DoLoad(pPause);
+}
+void CXFA_FFDocHandler::StopLoad(IXFA_Doc* hDoc) {
+  static_cast<CXFA_FFDoc*>(hDoc)->StopLoad();
+}
+
+IXFA_DocView* CXFA_FFDocHandler::CreateDocView(IXFA_Doc* hDoc,
+                                               FX_DWORD dwView) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->CreateDocView(dwView);
+}
+int32_t CXFA_FFDocHandler::CountPackages(IXFA_Doc* hDoc) {
+  return 0;
+}
+void CXFA_FFDocHandler::GetPackageName(IXFA_Doc* hDoc,
+                                       int32_t iPackage,
+                                       CFX_WideStringC& wsPackage) {}
+IFDE_XMLElement* CXFA_FFDocHandler::GetPackageData(
+    IXFA_Doc* hDoc,
+    const CFX_WideStringC& wsPackage) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->GetPackageData(wsPackage);
+}
+FX_BOOL CXFA_FFDocHandler::SavePackage(IXFA_Doc* hDoc,
+                                       const CFX_WideStringC& wsPackage,
+                                       IFX_FileWrite* pFile,
+                                       IXFA_ChecksumContext* pCSContext) {
+  return static_cast<CXFA_FFDoc*>(hDoc)
+      ->SavePackage(wsPackage, pFile, pCSContext);
+}
+FX_BOOL CXFA_FFDocHandler::CloseDoc(IXFA_Doc* hDoc) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->CloseDoc();
+}
+
+FX_BOOL CXFA_FFDocHandler::ImportData(IXFA_Doc* hDoc,
+                                      IFX_FileRead* pStream,
+                                      FX_BOOL bXDP) {
+  return static_cast<CXFA_FFDoc*>(hDoc)->ImportData(pStream, bXDP);
+}
+void CXFA_FFDocHandler::SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime) {
+  static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc()->InitScriptContext(hRuntime);
+}
+FXJSE_HVALUE CXFA_FFDocHandler::GetXFAScriptObject(IXFA_Doc* hDoc) {
+  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
+  if (!pXFADoc) {
+    return NULL;
+  }
+  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
+  if (!pScriptContext) {
+    return NULL;
+  }
+  return pScriptContext->GetJSValueFromMap(pXFADoc->GetRoot());
+}
+XFA_ATTRIBUTEENUM CXFA_FFDocHandler::GetRestoreState(IXFA_Doc* hDoc) {
+  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
+  if (!pXFADoc) {
+    return XFA_ATTRIBUTEENUM_Unknown;
+  }
+  CXFA_Node* pForm = ToNode(pXFADoc->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pForm) {
+    return XFA_ATTRIBUTEENUM_Unknown;
+  }
+  CXFA_Node* pSubForm = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
+  if (!pSubForm) {
+    return XFA_ATTRIBUTEENUM_Unknown;
+  }
+  return pSubForm->GetEnum(XFA_ATTRIBUTE_RestoreState);
+}
+FX_BOOL CXFA_FFDocHandler::RunDocScript(IXFA_Doc* hDoc,
+                                        XFA_SCRIPTTYPE eScriptType,
+                                        const CFX_WideStringC& wsScript,
+                                        FXJSE_HVALUE hRetValue,
+                                        FXJSE_HVALUE hThisObject) {
+  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
+  if (!pXFADoc) {
+    return FALSE;
+  }
+  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
+  if (!pScriptContext) {
+    return FALSE;
+  }
+  return pScriptContext->RunScript(
+      (XFA_SCRIPTLANGTYPE)eScriptType, wsScript, hRetValue,
+      hThisObject ? (CXFA_Object*)FXJSE_Value_ToObject(hThisObject, NULL)
+                  : NULL);
+}
diff --git a/xfa/fxfa/app/xfa_ffdochandler.h b/xfa/fxfa/app/xfa_ffdochandler.h
new file mode 100644
index 0000000..47dd85f
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdochandler.h
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFDOCHANDLER_H_
+#define XFA_FXFA_APP_XFA_FFDOCHANDLER_H_
+
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FFDocHandler : public IXFA_DocHandler {
+ public:
+  CXFA_FFDocHandler();
+  ~CXFA_FFDocHandler();
+  virtual void ReleaseDoc(IXFA_Doc* hDoc);
+  virtual IXFA_DocProvider* GetDocProvider(IXFA_Doc* hDoc);
+  virtual FX_DWORD GetDocType(IXFA_Doc* hDoc);
+  virtual int32_t StartLoad(IXFA_Doc* hDoc);
+  virtual int32_t DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause = NULL);
+  virtual void StopLoad(IXFA_Doc* hDoc);
+
+  virtual IXFA_DocView* CreateDocView(IXFA_Doc* hDoc, FX_DWORD dwView = 0);
+  virtual int32_t CountPackages(IXFA_Doc* hDoc);
+  virtual void GetPackageName(IXFA_Doc* hDoc,
+                              int32_t iPackage,
+                              CFX_WideStringC& wsPackage);
+  virtual IFDE_XMLElement* GetPackageData(IXFA_Doc* hDoc,
+                                          const CFX_WideStringC& wsPackage);
+  virtual FX_BOOL SavePackage(IXFA_Doc* hDoc,
+                              const CFX_WideStringC& wsPackage,
+                              IFX_FileWrite* pFile,
+                              IXFA_ChecksumContext* pCSContext = NULL);
+  virtual FX_BOOL CloseDoc(IXFA_Doc* hDoc);
+  virtual FX_BOOL ImportData(IXFA_Doc* hDoc,
+                             IFX_FileRead* pStream,
+                             FX_BOOL bXDP = TRUE);
+  virtual void SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime);
+  virtual FXJSE_HVALUE GetXFAScriptObject(IXFA_Doc* hDoc);
+  virtual XFA_ATTRIBUTEENUM GetRestoreState(IXFA_Doc* hDoc);
+  virtual FX_BOOL RunDocScript(IXFA_Doc* hDoc,
+                               XFA_SCRIPTTYPE eScriptType,
+                               const CFX_WideStringC& wsScript,
+                               FXJSE_HVALUE hRetValue,
+                               FXJSE_HVALUE hThisObject);
+
+ protected:
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFDOCHANDLER_H_
diff --git a/xfa/fxfa/app/xfa_ffdocview.cpp b/xfa/fxfa/app/xfa_ffdocview.cpp
new file mode 100644
index 0000000..082ca2b
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdocview.cpp
@@ -0,0 +1,932 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffbarcode.h"
+#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+#include "xfa/fxfa/app/xfa_ffexclgroup.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffimage.h"
+#include "xfa/fxfa/app/xfa_ffimageedit.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffpath.h"
+#include "xfa/fxfa/app/xfa_ffpushbutton.h"
+#include "xfa/fxfa/app/xfa_ffsignature.h"
+#include "xfa/fxfa/app/xfa_ffsubform.h"
+#include "xfa/fxfa/app/xfa_fftext.h"
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_ffwidgetacc.h"
+#include "xfa/fxfa/app/xfa_ffwidgethandler.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = {
+    XFA_ATTRIBUTEENUM_Click,      XFA_ATTRIBUTEENUM_Change,
+    XFA_ATTRIBUTEENUM_DocClose,   XFA_ATTRIBUTEENUM_DocReady,
+    XFA_ATTRIBUTEENUM_Enter,      XFA_ATTRIBUTEENUM_Exit,
+    XFA_ATTRIBUTEENUM_Full,       XFA_ATTRIBUTEENUM_IndexChange,
+    XFA_ATTRIBUTEENUM_Initialize, XFA_ATTRIBUTEENUM_MouseDown,
+    XFA_ATTRIBUTEENUM_MouseEnter, XFA_ATTRIBUTEENUM_MouseExit,
+    XFA_ATTRIBUTEENUM_MouseUp,    XFA_ATTRIBUTEENUM_PostExecute,
+    XFA_ATTRIBUTEENUM_PostOpen,   XFA_ATTRIBUTEENUM_PostPrint,
+    XFA_ATTRIBUTEENUM_PostSave,   XFA_ATTRIBUTEENUM_PostSign,
+    XFA_ATTRIBUTEENUM_PostSubmit, XFA_ATTRIBUTEENUM_PreExecute,
+    XFA_ATTRIBUTEENUM_PreOpen,    XFA_ATTRIBUTEENUM_PrePrint,
+    XFA_ATTRIBUTEENUM_PreSave,    XFA_ATTRIBUTEENUM_PreSign,
+    XFA_ATTRIBUTEENUM_PreSubmit,  XFA_ATTRIBUTEENUM_Ready,
+    XFA_ATTRIBUTEENUM_Unknown,
+};
+CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc)
+    : m_bLayoutEvent(FALSE),
+      m_pListFocusWidget(nullptr),
+      m_bInLayoutStatus(FALSE),
+      m_pDoc(pDoc),
+      m_pWidgetHandler(nullptr),
+      m_pXFADocLayout(nullptr),
+      m_pFocusAcc(nullptr),
+      m_pFocusWidget(nullptr),
+      m_pOldFocusWidget(nullptr),
+      m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None),
+      m_iLock(0) {}
+CXFA_FFDocView::~CXFA_FFDocView() {
+  DestroyDocView();
+  if (m_pWidgetHandler) {
+    delete m_pWidgetHandler;
+  }
+  m_pWidgetHandler = NULL;
+}
+void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
+  RunBindItems();
+  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize);
+  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange);
+}
+int32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) {
+  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
+  m_pDoc->GetXFADoc()->DoProtoMerge();
+  m_pDoc->GetXFADoc()->DoDataMerge();
+  m_pXFADocLayout = GetXFALayout();
+  int32_t iStatus = m_pXFADocLayout->StartLayout();
+  if (iStatus < 0) {
+    return iStatus;
+  }
+  CXFA_Node* pRootItem =
+      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pRootItem) {
+    return iStatus;
+  }
+  InitLayout(pRootItem);
+  InitCalculate(pRootItem);
+  InitValidate(pRootItem);
+  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE);
+  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
+  return iStatus;
+}
+int32_t CXFA_FFDocView::DoLayout(IFX_Pause* pPause) {
+  int32_t iStatus = 100;
+  iStatus = m_pXFADocLayout->DoLayout(pPause);
+  if (iStatus != 100) {
+    return iStatus;
+  }
+  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing;
+  return iStatus;
+}
+void CXFA_FFDocView::StopLayout() {
+  CXFA_Node* pRootItem =
+      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pRootItem) {
+    return;
+  }
+  CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
+  if (!pSubformNode) {
+    return;
+  }
+  CXFA_Node* pPageSetNode =
+      pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet);
+  if (!pPageSetNode) {
+    return;
+  }
+  RunCalculateWidgets();
+  RunValidate();
+  InitLayout(pPageSetNode);
+  InitCalculate(pPageSetNode);
+  InitValidate(pPageSetNode);
+  ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE);
+  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
+  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady);
+  RunCalculateWidgets();
+  RunValidate();
+  if (RunLayout()) {
+    ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
+  }
+  m_CalculateAccs.RemoveAll();
+  if (m_pFocusAcc && !m_pFocusWidget) {
+    SetFocusWidgetAcc(m_pFocusAcc);
+  }
+  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End;
+}
+int32_t CXFA_FFDocView::GetLayoutStatus() {
+  return m_iStatus;
+}
+void CXFA_FFDocView::ShowNullTestMsg() {
+  int32_t iCount = m_arrNullTestMsg.GetSize();
+  CXFA_FFApp* pApp = m_pDoc->GetApp();
+  IXFA_AppProvider* pAppProvider = pApp->GetAppProvider();
+  if (pAppProvider && iCount) {
+    int32_t iRemain = iCount > 7 ? iCount - 7 : 0;
+    iCount -= iRemain;
+    CFX_WideString wsMsg;
+    for (int32_t i = 0; i < iCount; i++) {
+      wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n");
+    }
+    if (iRemain > 0) {
+      CFX_WideString wsLimit;
+      pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit);
+      if (!wsLimit.IsEmpty()) {
+        CFX_WideString wsTemp;
+        wsTemp.Format((const FX_WCHAR*)wsLimit, iRemain);
+        wsMsg += FX_WSTRC(L"\n") + wsTemp;
+      }
+    }
+    CFX_WideString wsTitle;
+    pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
+    pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
+  }
+  m_arrNullTestMsg.RemoveAll();
+}
+void CXFA_FFDocView::UpdateDocView() {
+  if (IsUpdateLocked()) {
+    return;
+  }
+  LockUpdate();
+  int32_t iNewAdds = m_NewAddedNodes.GetSize();
+  for (int32_t i = 0; i < iNewAdds; i++) {
+    CXFA_Node* pNode = reinterpret_cast<CXFA_Node*>(m_NewAddedNodes[i]);
+    InitCalculate(pNode);
+    InitValidate(pNode);
+    ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE);
+  }
+  m_NewAddedNodes.RemoveAll();
+  RunSubformIndexChange();
+  RunCalculateWidgets();
+  RunValidate();
+  ShowNullTestMsg();
+  if (RunLayout() && m_bLayoutEvent) {
+    RunEventLayoutReady();
+  }
+  m_bLayoutEvent = FALSE;
+  m_CalculateAccs.RemoveAll();
+  RunInvalidate();
+  UnlockUpdate();
+}
+int32_t CXFA_FFDocView::CountPageViews() {
+  if (!m_pXFADocLayout) {
+    return 0;
+  }
+  return m_pXFADocLayout->CountPages();
+}
+IXFA_PageView* CXFA_FFDocView::GetPageView(int32_t nIndex) {
+  if (!m_pXFADocLayout) {
+    return NULL;
+  }
+  return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex));
+}
+IXFA_Widget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName) {
+  return GetWidgetByName(wsName, NULL);
+}
+CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
+    const CFX_WideStringC& wsName) {
+  return GetWidgetAccByName(wsName, NULL);
+}
+IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const {
+  return m_pDoc->GetXFADoc()->GetDocLayout();
+}
+FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) {
+  CXFA_Node* pNode = pWidgetAcc->GetNode();
+  XFA_ELEMENT eType = pNode->GetClassID();
+  if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) {
+    return FALSE;
+  }
+  FX_BOOL bNotify = IsStaticNotify();
+  pWidgetAcc->ResetData();
+  pWidgetAcc->UpdateUIDisplay();
+  if (bNotify) {
+    pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL,
+                            NULL);
+  }
+  if (CXFA_Validate validate = pWidgetAcc->GetValidate()) {
+    AddValidateWidget(pWidgetAcc);
+    validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
+  }
+  return TRUE;
+}
+void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) {
+  m_bLayoutEvent = TRUE;
+  FX_BOOL bChanged = FALSE;
+  CXFA_Node* pFormNode = NULL;
+  if (pWidgetAcc) {
+    bChanged = ResetSingleWidgetAccData(pWidgetAcc);
+    pFormNode = pWidgetAcc->GetNode();
+  } else {
+    pFormNode = GetRootSubform();
+  }
+  if (!pFormNode) {
+    return;
+  }
+  if (pFormNode->GetClassID() != XFA_ELEMENT_Field &&
+      pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) {
+    CXFA_WidgetAccIterator Iterator(this, pFormNode);
+    while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) {
+      bChanged |= ResetSingleWidgetAccData(pAcc);
+      if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) {
+        Iterator.SkipTree();
+      }
+    }
+  }
+  if (bChanged) {
+    m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
+  }
+}
+int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam,
+                                           CXFA_WidgetAcc* pWidgetAcc) {
+  if (pParam == NULL) {
+    return XFA_EVENTERROR_Error;
+  }
+  if (pParam->m_eType == XFA_EVENT_Validate) {
+    CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit");
+    CXFA_Node* pConfigItem =
+        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Config));
+    if (pConfigItem) {
+      CXFA_Node* pValidateNode = NULL;
+      CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat);
+      pValidateNode =
+          pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL;
+      if (!pValidateNode) {
+        CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present);
+        pValidateNode = pPresentNode
+                            ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate)
+                            : NULL;
+      }
+      if (pValidateNode) {
+        wsValidateStr = pValidateNode->GetContent();
+      }
+    }
+    FX_BOOL bValidate = FALSE;
+    switch (pParam->m_iValidateActivities) {
+      case XFA_VALIDATE_preSubmit:
+        bValidate = wsValidateStr.Find(L"preSubmit") != -1;
+        break;
+      case XFA_VALIDATE_prePrint:
+        bValidate = wsValidateStr.Find(L"prePrint") != -1;
+        break;
+      case XFA_VALIDATE_preExecute:
+        bValidate = wsValidateStr.Find(L"preExecute") != -1;
+        break;
+      case XFA_VALIDATE_preSave:
+        bValidate = wsValidateStr.Find(L"preSave") != -1;
+        break;
+    }
+    if (!bValidate) {
+      return XFA_EVENTERROR_Sucess;
+    }
+  }
+  CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL;
+  if (!pNode) {
+    CXFA_Node* pRootItem =
+        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+    if (!pRootItem) {
+      return XFA_EVENTERROR_Error;
+    }
+    pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
+  }
+  ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady);
+  return XFA_EVENTERROR_Sucess;
+}
+IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() {
+  if (!m_pWidgetHandler) {
+    m_pWidgetHandler = new CXFA_FFWidgetHandler(this);
+  }
+  return m_pWidgetHandler;
+}
+IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() {
+  CXFA_Node* pFormRoot = GetRootSubform();
+  if (!pFormRoot) {
+    return NULL;
+  }
+  return new CXFA_FFDocWidgetIterator(this, pFormRoot);
+}
+IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator(
+    XFA_WIDGETORDER eOrder) {
+  CXFA_Node* pFormRoot = GetRootSubform();
+  if (!pFormRoot) {
+    return NULL;
+  }
+  return new CXFA_WidgetAccIterator(this, pFormRoot);
+}
+IXFA_Widget* CXFA_FFDocView::GetFocusWidget() {
+  return m_pFocusWidget;
+}
+void CXFA_FFDocView::KillFocus() {
+  if (m_pFocusWidget &&
+      (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
+    (m_pFocusWidget)->OnKillFocus(NULL);
+  }
+  m_pFocusAcc = NULL;
+  m_pFocusWidget = NULL;
+  m_pOldFocusWidget = NULL;
+}
+FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) {
+  CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget;
+  if (m_pOldFocusWidget == pNewFocus) {
+    return FALSE;
+  }
+  CXFA_FFWidget* pOldFocus = m_pOldFocusWidget;
+  m_pOldFocusWidget = pNewFocus;
+  if (pOldFocus) {
+    if (m_pFocusWidget != m_pOldFocusWidget &&
+        (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
+      m_pFocusWidget = pOldFocus;
+      pOldFocus->OnKillFocus(pNewFocus);
+    } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
+      if (!pOldFocus->IsLoaded()) {
+        pOldFocus->LoadWidget();
+      }
+      pOldFocus->OnSetFocus(m_pFocusWidget);
+      m_pFocusWidget = pOldFocus;
+      pOldFocus->OnKillFocus(pNewFocus);
+    }
+  }
+  if (m_pFocusWidget == m_pOldFocusWidget) {
+    return FALSE;
+  }
+  pNewFocus = m_pOldFocusWidget;
+  if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) {
+    m_pFocusAcc = NULL;
+    m_pFocusWidget = NULL;
+    m_pListFocusWidget = NULL;
+    m_pOldFocusWidget = NULL;
+    return FALSE;
+  }
+  if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
+    if (!pNewFocus->IsLoaded()) {
+      pNewFocus->LoadWidget();
+    }
+    pNewFocus->OnSetFocus(m_pFocusWidget);
+  }
+  m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL;
+  m_pFocusWidget = pNewFocus;
+  m_pOldFocusWidget = m_pFocusWidget;
+  return TRUE;
+}
+CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() {
+  return m_pFocusAcc;
+}
+void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
+  CXFA_FFWidget* pNewFocus =
+      pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL;
+  if (SetFocus(pNewFocus)) {
+    m_pFocusAcc = pWidgetAcc;
+    if (m_iStatus == XFA_DOCVIEW_LAYOUTSTATUS_End) {
+      m_pDoc->GetDocProvider()->SetFocusWidget(m_pDoc, m_pFocusWidget);
+    }
+  }
+}
+void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) {
+  if (m_pFocusAcc == pWidget->GetDataAcc()) {
+    m_pFocusAcc = NULL;
+    m_pFocusWidget = NULL;
+    m_pOldFocusWidget = NULL;
+  }
+}
+static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView,
+                                CXFA_WidgetAcc* pWidgetAcc,
+                                CXFA_EventParam* pParam) {
+  if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  switch (pParam->m_eType) {
+    case XFA_EVENT_Calculate:
+      return pWidgetAcc->ProcessCalculate();
+    case XFA_EVENT_Validate:
+      if (((CXFA_FFDoc*)pDocView->GetDoc())
+              ->GetDocProvider()
+              ->IsValidationsEnabled(pDocView->GetDoc())) {
+        return pWidgetAcc->ProcessValidate(0x01);
+      }
+      return XFA_EVENTERROR_Disabled;
+    case XFA_EVENT_InitCalculate: {
+      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
+      if (!calc) {
+        return XFA_EVENTERROR_NotExist;
+      }
+      if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+        return XFA_EVENTERROR_Disabled;
+      }
+      CXFA_Script script = calc.GetScript();
+      return pWidgetAcc->ExecuteScript(script, pParam);
+    }
+    default:
+      break;
+  }
+  int32_t iRet =
+      pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
+  return iRet;
+}
+int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
+                                                     XFA_EVENTTYPE eEventType,
+                                                     FX_BOOL bIsFormReady,
+                                                     FX_BOOL bRecursive,
+                                                     CXFA_Node* pExclude) {
+  int32_t iRet = XFA_EVENTERROR_NotExist;
+  if (pFormNode == pExclude) {
+    return iRet;
+  }
+  XFA_ELEMENT elementType = pFormNode->GetClassID();
+  if (elementType == XFA_ELEMENT_Field) {
+    if (eEventType == XFA_EVENT_IndexChange) {
+      return iRet;
+    }
+    CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
+    if (pWidgetAcc == NULL) {
+      return iRet;
+    }
+    CXFA_EventParam eParam;
+    eParam.m_eType = eEventType;
+    eParam.m_pTarget = pWidgetAcc;
+    eParam.m_bIsFormReady = bIsFormReady;
+    return XFA_ProcessEvent(this, pWidgetAcc, &eParam);
+  }
+  if (bRecursive) {
+    for (CXFA_Node* pNode = pFormNode->GetNodeItem(
+             XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
+         pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling,
+                                           XFA_OBJECTTYPE_ContainerNode)) {
+      elementType = pNode->GetClassID();
+      if (elementType != XFA_ELEMENT_Variables &&
+          elementType != XFA_ELEMENT_Draw) {
+        iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady,
+                                             bRecursive, pExclude);
+      }
+    }
+  }
+  CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
+  if (pWidgetAcc == NULL) {
+    return iRet;
+  }
+  CXFA_EventParam eParam;
+  eParam.m_eType = eEventType;
+  eParam.m_pTarget = pWidgetAcc;
+  eParam.m_bIsFormReady = bIsFormReady;
+  iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam);
+  return iRet;
+}
+CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName,
+                                               CXFA_FFWidget* pRefWidget) {
+  CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL;
+  if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) {
+    return pAcc->GetNextWidget(NULL);
+  }
+  return NULL;
+}
+CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
+    const CFX_WideStringC& wsName,
+    CXFA_WidgetAcc* pRefWidgetAcc) {
+  CFX_WideString wsExpression;
+  FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
+  IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext();
+  if (!pScriptContext) {
+    return NULL;
+  }
+  CXFA_Node* refNode = NULL;
+  if (pRefWidgetAcc) {
+    refNode = pRefWidgetAcc->GetNode();
+    wsExpression = wsName;
+  } else {
+    wsExpression = L"$form." + wsName;
+  }
+  XFA_RESOLVENODE_RS resoveNodeRS;
+  int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
+                                                resoveNodeRS, dwStyle);
+  if (iRet < 1) {
+    return NULL;
+  }
+  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    CXFA_Node* pNode = resoveNodeRS.nodes[0]->AsNode();
+    if (pNode) {
+      return (CXFA_WidgetAcc*)pNode->GetWidgetData();
+    }
+  }
+  return NULL;
+}
+void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage* pSender,
+                                 XFA_PAGEEVENT eEvent,
+                                 int32_t iPageIndex) {
+  CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender);
+  if (eEvent == XFA_PAGEEVENT_PageRemoved) {
+    m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
+                                            XFA_PAGEVIEWEVENT_PostRemoved);
+    return;
+  }
+  m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
+                                          XFA_PAGEVIEWEVENT_PostAdded);
+  pFFPageView->LoadPageView();
+}
+void CXFA_FFDocView::LockUpdate() {
+  m_iLock++;
+}
+void CXFA_FFDocView::UnlockUpdate() {
+  m_iLock--;
+}
+FX_BOOL CXFA_FFDocView::IsUpdateLocked() {
+  return m_iLock;
+}
+void CXFA_FFDocView::ClearInvalidateList() {
+  FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
+  while (ps) {
+    void* pPageView = NULL;
+    CFX_RectF* pRect = NULL;
+    m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect);
+    delete pRect;
+  }
+  m_mapPageInvalidate.RemoveAll();
+}
+void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget,
+                                       const CFX_RectF& rtInvalidate) {
+  AddInvalidateRect(pWidget->GetPageView(), rtInvalidate);
+}
+void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView,
+                                       const CFX_RectF& rtInvalidate) {
+  CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView);
+  if (!pRect) {
+    pRect = new CFX_RectF;
+    pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width,
+               rtInvalidate.height);
+    m_mapPageInvalidate.SetAt(pPageView, pRect);
+  } else {
+    pRect->Union(rtInvalidate);
+  }
+}
+void CXFA_FFDocView::RunInvalidate() {
+  FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
+  while (ps) {
+    IXFA_PageView* pPageView = NULL;
+    CFX_RectF* pRect = NULL;
+    m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect);
+    m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect);
+    delete pRect;
+  }
+  m_mapPageInvalidate.RemoveAll();
+}
+FX_BOOL CXFA_FFDocView::RunLayout() {
+  LockUpdate();
+  m_bInLayoutStatus = TRUE;
+  if (!m_pXFADocLayout->IncrementLayout() &&
+      m_pXFADocLayout->StartLayout() < 100) {
+    m_pXFADocLayout->DoLayout();
+    UnlockUpdate();
+    m_bInLayoutStatus = FALSE;
+    return TRUE;
+  }
+  m_bInLayoutStatus = FALSE;
+  UnlockUpdate();
+  return FALSE;
+}
+void CXFA_FFDocView::RunSubformIndexChange() {
+  int32_t iSubforms = m_IndexChangedSubforms.GetSize();
+  for (int32_t i = 0; i < iSubforms; i++) {
+    CXFA_Node* pSubformNode =
+        reinterpret_cast<CXFA_Node*>(m_IndexChangedSubforms[i]);
+    CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData();
+    if (!pWidgetAcc) {
+      continue;
+    }
+    CXFA_EventParam eParam;
+    eParam.m_eType = XFA_EVENT_IndexChange;
+    eParam.m_pTarget = pWidgetAcc;
+    pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam);
+  }
+  m_IndexChangedSubforms.RemoveAll();
+}
+void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) {
+  m_NewAddedNodes.Add(pNode);
+  InitLayout(pNode);
+}
+void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) {
+  FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform);
+  m_IndexChangedSubforms.Add(pNode);
+}
+void CXFA_FFDocView::RunDocClose() {
+  CXFA_Node* pRootItem =
+      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pRootItem) {
+    return;
+  }
+  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose);
+}
+void CXFA_FFDocView::DestroyDocView() {
+  ClearInvalidateList();
+  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
+  m_iLock = 0;
+  m_ValidateAccs.RemoveAll();
+  m_bindItems.RemoveAll();
+  m_CalculateAccs.RemoveAll();
+}
+FX_BOOL CXFA_FFDocView::IsStaticNotify() {
+  return m_pDoc->GetDocType() == XFA_DOCTYPE_Static;
+}
+void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
+  int32_t iAccs = m_CalculateAccs.GetSize();
+  CXFA_WidgetAcc* pCurrentAcc =
+      (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
+                  : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
+  if (pCurrentAcc != pWidgetAcc) {
+    m_CalculateAccs.Add(pWidgetAcc);
+  }
+}
+void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) {
+  CXFA_CalcData* pGlobalData =
+      (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData);
+  int32_t iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0;
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i];
+    if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+      continue;
+    }
+    int32_t iAccs = m_CalculateAccs.GetSize();
+    CXFA_WidgetAcc* pCurrentAcc =
+        (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
+                    : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
+    if (pCurrentAcc != pResultAcc) {
+      m_CalculateAccs.Add(pResultAcc);
+    }
+  }
+}
+void CXFA_FFDocView::RunCalculateRecursive(int32_t& iIndex) {
+  while (iIndex < m_CalculateAccs.GetSize()) {
+    CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex];
+    AddCalculateNodeNotify(pCurAcc->GetNode());
+    int32_t iRefCount =
+        (int32_t)(uintptr_t)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount);
+    iRefCount++;
+    pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount,
+                                    (void*)(uintptr_t)iRefCount);
+    if (iRefCount > 11) {
+      break;
+    }
+    if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) {
+      AddValidateWidget(pCurAcc);
+    }
+    iIndex++;
+    RunCalculateRecursive(iIndex);
+  }
+}
+int32_t CXFA_FFDocView::RunCalculateWidgets() {
+  if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled(m_pDoc)) {
+    return XFA_EVENTERROR_Disabled;
+  }
+  int32_t iCounts = m_CalculateAccs.GetSize();
+  int32_t iIndex = 0;
+  if (iCounts > 0) {
+    RunCalculateRecursive(iIndex);
+  }
+  for (int32_t i = 0; i < m_CalculateAccs.GetSize(); i++) {
+    CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i];
+    pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (void*)(uintptr_t)0);
+  }
+  m_CalculateAccs.RemoveAll();
+  return XFA_EVENTERROR_Sucess;
+}
+void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) {
+  if (m_ValidateAccs.Find(pWidget) < 0) {
+    m_ValidateAccs.Add(pWidget);
+  }
+}
+FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) {
+  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate);
+  return TRUE;
+}
+FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) {
+  if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
+    return FALSE;
+  }
+  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate);
+  m_ValidateAccs.RemoveAll();
+  return TRUE;
+}
+FX_BOOL CXFA_FFDocView::RunValidate() {
+  if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
+    return FALSE;
+  }
+  int32_t iCounts = m_ValidateAccs.GetSize();
+  for (int32_t i = 0; i < iCounts; i++) {
+    CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i];
+    if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+      continue;
+    }
+    pAcc->ProcessValidate();
+  }
+  m_ValidateAccs.RemoveAll();
+  return TRUE;
+}
+FX_BOOL CXFA_FFDocView::RunEventLayoutReady() {
+  CXFA_Node* pRootItem =
+      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pRootItem) {
+    return FALSE;
+  }
+  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
+  RunLayout();
+  return TRUE;
+}
+void CXFA_FFDocView::RunBindItems() {
+  int32_t iCount = m_bindItems.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    if (reinterpret_cast<CXFA_Node*>(m_bindItems[i])
+            ->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+      continue;
+    }
+    CXFA_Node* pWidgetNode = reinterpret_cast<CXFA_Node*>(m_bindItems[i])
+                                 ->GetNodeItem(XFA_NODEITEM_Parent);
+    CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData();
+    if (!pAcc) {
+      continue;
+    }
+    CXFA_BindItems binditems(reinterpret_cast<CXFA_Node*>(m_bindItems[i]));
+    IXFA_ScriptContext* pScriptContext =
+        pWidgetNode->GetDocument()->GetScriptContext();
+    CFX_WideStringC wsRef;
+    binditems.GetRef(wsRef);
+    FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                       XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
+                       XFA_RESOLVENODE_ALL;
+    XFA_RESOLVENODE_RS rs;
+    pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle);
+    int32_t iCount = rs.nodes.GetSize();
+    pAcc->DeleteItem(-1);
+    if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) {
+      continue;
+    }
+    CFX_WideStringC wsValueRef, wsLabelRef;
+    binditems.GetValueRef(wsValueRef);
+    binditems.GetLabelRef(wsLabelRef);
+    const bool bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef;
+    const bool bLabelUseContent =
+        wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$");
+    const bool bValueUseContent =
+        wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$");
+    CFX_WideString wsValue, wsLabel;
+    FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef),
+                                                  wsValueRef.GetLength());
+    for (int32_t i = 0; i < iCount; i++) {
+      CXFA_Object* refObj = rs.nodes[i];
+      if (!refObj->IsNode()) {
+        continue;
+      }
+      CXFA_Node* refNode = refObj->AsNode();
+      if (bValueUseContent) {
+        wsValue = refNode->GetContent();
+      } else {
+        CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash);
+        if (nodeValue == NULL) {
+          wsValue = refNode->GetContent();
+        } else {
+          wsValue = nodeValue->GetContent();
+        }
+      }
+      if (!bUseValue) {
+        if (bLabelUseContent) {
+          wsLabel = refNode->GetContent();
+        } else {
+          CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef);
+          if (nodeLabel)
+            wsLabel = nodeLabel->GetContent();
+        }
+      } else {
+        wsLabel = wsValue;
+      }
+      pAcc->InsertItem(wsLabel, wsValue);
+    }
+  }
+  m_bindItems.RemoveAll();
+}
+void CXFA_FFDocView::SetChangeMark() {
+  if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) {
+    return;
+  }
+  m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
+}
+CXFA_Node* CXFA_FFDocView::GetRootSubform() {
+  CXFA_Node* pFormPacketNode =
+      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pFormPacketNode) {
+    return NULL;
+  }
+  return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform);
+}
+CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView,
+                                                   CXFA_Node* pTravelRoot)
+    : m_ContentIterator(pTravelRoot) {
+  m_pDocView = pDocView;
+  m_pCurWidget = NULL;
+}
+CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() {}
+void CXFA_FFDocWidgetIterator::Reset() {
+  m_ContentIterator.Reset();
+  m_pCurWidget = NULL;
+}
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToFirst() {
+  return NULL;
+}
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToLast() {
+  return NULL;
+}
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToNext() {
+  CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext()
+                                  : m_ContentIterator.GetCurrent();
+  while (pItem) {
+    if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) {
+      while ((m_pCurWidget = pAcc->GetNextWidget(NULL))) {
+        if (!m_pCurWidget->IsLoaded() &&
+            (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
+          m_pCurWidget->LoadWidget();
+        }
+        return m_pCurWidget;
+      }
+    }
+    pItem = m_ContentIterator.MoveToNext();
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToPrevious() {
+  return NULL;
+}
+IXFA_Widget* CXFA_FFDocWidgetIterator::GetCurrentWidget() {
+  return NULL;
+}
+FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
+  return FALSE;
+}
+IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(
+    CXFA_WidgetAcc* pTravelRoot,
+    XFA_WIDGETORDER eOrder) {
+  if (!pTravelRoot) {
+    return NULL;
+  }
+  return new CXFA_WidgetAccIterator(pTravelRoot->GetDocView(),
+                                    pTravelRoot->GetNode());
+}
+CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView,
+                                               CXFA_Node* pTravelRoot)
+    : m_ContentIterator(pTravelRoot) {
+  m_pDocView = pDocView;
+  m_pCurWidgetAcc = NULL;
+}
+CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() {}
+void CXFA_WidgetAccIterator::Reset() {
+  m_pCurWidgetAcc = NULL;
+  m_ContentIterator.Reset();
+}
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() {
+  return NULL;
+}
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() {
+  return NULL;
+}
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() {
+  CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext()
+                                     : m_ContentIterator.GetCurrent();
+  while (pItem) {
+    if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData())) {
+      return m_pCurWidgetAcc;
+    }
+    pItem = m_ContentIterator.MoveToNext();
+  }
+  return NULL;
+}
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() {
+  return NULL;
+}
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() {
+  return NULL;
+}
+FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) {
+  return FALSE;
+}
+void CXFA_WidgetAccIterator::SkipTree() {
+  m_ContentIterator.SkipChildrenAndMoveToNext();
+  m_pCurWidgetAcc = NULL;
+}
diff --git a/xfa/fxfa/app/xfa_ffdocview.h b/xfa/fxfa/app/xfa_ffdocview.h
new file mode 100644
index 0000000..284a32f
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdocview.h
@@ -0,0 +1,170 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFDOCVIEW_H_
+#define XFA_FXFA_APP_XFA_FFDOCVIEW_H_
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+
+class CXFA_FFWidgetHandler;
+class CXFA_FFDoc;
+class CXFA_FFWidget;
+extern const XFA_ATTRIBUTEENUM gs_EventActivity[];
+enum XFA_DOCVIEW_LAYOUTSTATUS {
+  XFA_DOCVIEW_LAYOUTSTATUS_None,
+  XFA_DOCVIEW_LAYOUTSTATUS_Start,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitialize,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitCalculate,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormInitValidate,
+  XFA_DOCVIEW_LAYOUTSTATUS_FormFormReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_Doing,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitialize,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitCalculate,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitValidate,
+  XFA_DOCVIEW_LAYOUTSTATUS_PagesetFormReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_LayoutReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_DocReady,
+  XFA_DOCVIEW_LAYOUTSTATUS_End
+};
+class CXFA_FFDocView : public IXFA_DocView {
+ public:
+  CXFA_FFDocView(CXFA_FFDoc* pDoc);
+  ~CXFA_FFDocView();
+
+  virtual IXFA_Doc* GetDoc() { return m_pDoc; }
+  virtual int32_t StartLayout(int32_t iStartPage = 0);
+  virtual int32_t DoLayout(IFX_Pause* pPause = NULL);
+  virtual void StopLayout();
+  virtual int32_t GetLayoutStatus();
+  virtual void UpdateDocView();
+  virtual int32_t CountPageViews();
+  virtual IXFA_PageView* GetPageView(int32_t nIndex);
+  virtual IXFA_Widget* GetWidgetByName(const CFX_WideStringC& wsName);
+  virtual CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName);
+  virtual void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL);
+  virtual int32_t ProcessWidgetEvent(CXFA_EventParam* pParam,
+                                     CXFA_WidgetAcc* pWidgetAcc = NULL);
+  virtual IXFA_WidgetHandler* GetWidgetHandler();
+  virtual IXFA_WidgetIterator* CreateWidgetIterator();
+  virtual IXFA_WidgetAccIterator* CreateWidgetAccIterator(
+      XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder);
+  virtual IXFA_Widget* GetFocusWidget();
+  virtual void KillFocus();
+  virtual FX_BOOL SetFocus(IXFA_Widget* hWidget);
+  CXFA_FFWidget* GetWidgetByName(const CFX_WideStringC& wsName,
+                                 CXFA_FFWidget* pRefWidget = NULL);
+  CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName,
+                                     CXFA_WidgetAcc* pRefWidgetAcc = NULL);
+  IXFA_DocLayout* GetXFALayout() const;
+  void OnPageEvent(IXFA_LayoutPage* pSender,
+                   XFA_PAGEEVENT eEvent,
+                   int32_t iPageIndex);
+  void LockUpdate();
+  void UnlockUpdate();
+  FX_BOOL IsUpdateLocked();
+  void ClearInvalidateList();
+  void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate);
+  void AddInvalidateRect(IXFA_PageView* pPageView,
+                         const CFX_RectF& rtInvalidate);
+  void RunInvalidate();
+  void RunDocClose();
+  void DestroyDocView();
+
+  FX_BOOL InitValidate(CXFA_Node* pNode);
+  FX_BOOL RunValidate();
+
+  void SetChangeMark();
+
+  void AddValidateWidget(CXFA_WidgetAcc* pWidget);
+  void AddCalculateNodeNotify(CXFA_Node* pNodeChange);
+  void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
+  int32_t RunCalculateWidgets();
+  FX_BOOL IsStaticNotify();
+  FX_BOOL RunLayout();
+  void RunSubformIndexChange();
+  void AddNewFormNode(CXFA_Node* pNode);
+  void AddIndexChangedSubform(CXFA_Node* pNode);
+  CXFA_WidgetAcc* GetFocusWidgetAcc();
+  void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
+  void DeleteLayoutItem(CXFA_FFWidget* pWidget);
+  int32_t ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
+                                       XFA_EVENTTYPE eEventType,
+                                       FX_BOOL bIsFormReady = FALSE,
+                                       FX_BOOL bRecursive = TRUE,
+                                       CXFA_Node* pExclude = NULL);
+  FX_BOOL m_bLayoutEvent;
+  CFX_WideStringArray m_arrNullTestMsg;
+  CXFA_FFWidget* m_pListFocusWidget;
+  FX_BOOL m_bInLayoutStatus;
+
+ protected:
+  FX_BOOL RunEventLayoutReady();
+  void RunBindItems();
+  FX_BOOL InitCalculate(CXFA_Node* pNode);
+  void InitLayout(CXFA_Node* pNode);
+  void RunCalculateRecursive(int32_t& iIndex);
+  void ShowNullTestMsg();
+  FX_BOOL ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc);
+  CXFA_Node* GetRootSubform();
+
+  CXFA_FFDoc* m_pDoc;
+  CXFA_FFWidgetHandler* m_pWidgetHandler;
+  IXFA_DocLayout* m_pXFADocLayout;
+  CXFA_WidgetAcc* m_pFocusAcc;
+  CXFA_FFWidget* m_pFocusWidget;
+  CXFA_FFWidget* m_pOldFocusWidget;
+  CFX_MapPtrToPtr m_mapPageInvalidate;
+  CFX_PtrArray m_ValidateAccs;
+  CFX_PtrArray m_bindItems;
+  CFX_PtrArray m_CalculateAccs;
+
+  CFX_PtrArray m_NewAddedNodes;
+  CFX_PtrArray m_IndexChangedSubforms;
+  XFA_DOCVIEW_LAYOUTSTATUS m_iStatus;
+  int32_t m_iLock;
+  friend class CXFA_FFNotify;
+};
+class CXFA_FFDocWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
+  virtual ~CXFA_FFDocWidgetIterator();
+
+  virtual void Release() { delete this; }
+
+  virtual void Reset();
+  virtual IXFA_Widget* MoveToFirst();
+  virtual IXFA_Widget* MoveToLast();
+  virtual IXFA_Widget* MoveToNext();
+  virtual IXFA_Widget* MoveToPrevious();
+  virtual IXFA_Widget* GetCurrentWidget();
+  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
+
+ protected:
+  CXFA_ContainerIterator m_ContentIterator;
+  CXFA_FFDocView* m_pDocView;
+  CXFA_FFWidget* m_pCurWidget;
+};
+class CXFA_WidgetAccIterator : public IXFA_WidgetAccIterator {
+ public:
+  CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
+  virtual ~CXFA_WidgetAccIterator();
+  virtual void Release() { delete this; }
+  virtual void Reset();
+  virtual CXFA_WidgetAcc* MoveToFirst();
+  virtual CXFA_WidgetAcc* MoveToLast();
+  virtual CXFA_WidgetAcc* MoveToNext();
+  virtual CXFA_WidgetAcc* MoveToPrevious();
+  virtual CXFA_WidgetAcc* GetCurrentWidgetAcc();
+  virtual FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget);
+  virtual void SkipTree();
+
+ protected:
+  CXFA_ContainerIterator m_ContentIterator;
+  CXFA_FFDocView* m_pDocView;
+  CXFA_WidgetAcc* m_pCurWidgetAcc;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFDOCVIEW_H_
diff --git a/xfa/fxfa/app/xfa_ffdraw.cpp b/xfa/fxfa/app/xfa_ffdraw.cpp
new file mode 100644
index 0000000..06cfdfe
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdraw.cpp
@@ -0,0 +1,16 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+CXFA_FFDraw::CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFWidget(pPageView, pDataAcc) {}
+CXFA_FFDraw::~CXFA_FFDraw() {}
diff --git a/xfa/fxfa/app/xfa_ffdraw.h b/xfa/fxfa/app/xfa_ffdraw.h
new file mode 100644
index 0000000..a5db598
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffdraw.h
@@ -0,0 +1,19 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFDRAW_H_
+#define XFA_FXFA_APP_XFA_FFDRAW_H_
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+class CXFA_FFDraw : public CXFA_FFWidget {
+ public:
+  CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFDraw();
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFDRAW_H_
diff --git a/xfa/fxfa/app/xfa_ffexclgroup.cpp b/xfa/fxfa/app/xfa_ffexclgroup.cpp
new file mode 100644
index 0000000..4e24218
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffexclgroup.cpp
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffexclgroup.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+CXFA_FFExclGroup::CXFA_FFExclGroup(CXFA_FFPageView* pPageView,
+                                   CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFWidget(pPageView, pDataAcc) {}
+CXFA_FFExclGroup::~CXFA_FFExclGroup() {}
+void CXFA_FFExclGroup::RenderWidget(CFX_Graphics* pGS,
+                                    CFX_Matrix* pMatrix,
+                                    FX_DWORD dwStatus,
+                                    int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+}
diff --git a/xfa/fxfa/app/xfa_ffexclgroup.h b/xfa/fxfa/app/xfa_ffexclgroup.h
new file mode 100644
index 0000000..fd3f4d8
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffexclgroup.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFEXCLGROUP_H_
+#define XFA_FXFA_APP_XFA_FFEXCLGROUP_H_
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+class CXFA_FFExclGroup : public CXFA_FFWidget {
+ public:
+  CXFA_FFExclGroup(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFExclGroup();
+
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFEXCLGROUP_H_
diff --git a/xfa/fxfa/app/xfa_fffield.cpp b/xfa/fxfa/app/xfa_fffield.cpp
new file mode 100644
index 0000000..39e7ee5
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fffield.cpp
@@ -0,0 +1,835 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwltheme.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+#include "xfa/include/fwl/lightwidget/edit.h"
+#include "xfa/include/fwl/lightwidget/picturebox.h"
+
+CXFA_FFField::CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFWidget(pPageView, pDataAcc), m_pNormalWidget(NULL) {
+  m_rtUI.Set(0, 0, 0, 0);
+  m_rtCaption.Set(0, 0, 0, 0);
+}
+CXFA_FFField::~CXFA_FFField() {
+  CXFA_FFField::UnloadWidget();
+}
+
+FX_BOOL CXFA_FFField::GetBBox(CFX_RectF& rtBox,
+                              FX_DWORD dwStatus,
+                              FX_BOOL bDrawFocus) {
+  if (!bDrawFocus)
+    return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
+
+  XFA_ELEMENT type = (XFA_ELEMENT)m_pDataAcc->GetUIType();
+  if (type == XFA_ELEMENT_Button || type == XFA_ELEMENT_CheckButton ||
+      type == XFA_ELEMENT_ImageEdit || type == XFA_ELEMENT_Signature ||
+      type == XFA_ELEMENT_ChoiceList) {
+    rtBox = m_rtUI;
+    CFX_Matrix mt;
+    GetRotateMatrix(mt);
+    mt.TransformRect(rtBox);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+void CXFA_FFField::RenderWidget(CFX_Graphics* pGS,
+                                CFX_Matrix* pMatrix,
+                                FX_DWORD dwStatus,
+                                int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
+  RenderCaption(pGS, &mtRotate);
+  DrawHighlight(pGS, &mtRotate, dwStatus, FALSE);
+  CFX_RectF rtWidget;
+  m_pNormalWidget->GetWidgetRect(rtWidget);
+  CFX_Matrix mt;
+  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
+  mt.Concat(mtRotate);
+  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
+                                                 pGS, &mt);
+}
+void CXFA_FFField::DrawHighlight(CFX_Graphics* pGS,
+                                 CFX_Matrix* pMatrix,
+                                 FX_DWORD dwStatus,
+                                 FX_BOOL bEllipse) {
+  if (m_rtUI.IsEmpty() || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return;
+  }
+  if ((dwStatus & XFA_WIDGETSTATUS_Highlight) &&
+      m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open) {
+    CXFA_FFDoc* pDoc = GetDoc();
+    CFX_Color crHighlight(pDoc->GetDocProvider()->GetHighlightColor(pDoc));
+    pGS->SetFillColor(&crHighlight);
+    CFX_Path path;
+    path.Create();
+    if (bEllipse) {
+      path.AddEllipse(m_rtUI);
+    } else {
+      path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height);
+    }
+    pGS->FillPath(&path, FXFILL_WINDING, pMatrix);
+  }
+}
+void CXFA_FFField::DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix) {
+  if (m_dwStatus & XFA_WIDGETSTATUS_Focused) {
+    CFX_Color cr(0xFF000000);
+    pGS->SetStrokeColor(&cr);
+    FX_FLOAT DashPattern[2] = {1, 1};
+    pGS->SetLineDash(0.0f, DashPattern, 2);
+    pGS->SetLineWidth(0, FALSE);
+    CFX_Path path;
+    path.Create();
+    path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height);
+    pGS->StrokePath(&path, pMatrix);
+  }
+}
+void CXFA_FFField::SetFWLThemeProvider() {
+  if (m_pNormalWidget) {
+    m_pNormalWidget->m_pIface->SetThemeProvider(GetApp()->GetFWLTheme());
+  }
+}
+FX_BOOL CXFA_FFField::IsLoaded() {
+  return m_pNormalWidget && CXFA_FFWidget::IsLoaded();
+}
+FX_BOOL CXFA_FFField::LoadWidget() {
+  SetFWLThemeProvider();
+  m_pDataAcc->LoadCaption();
+  PerformLayout();
+  return TRUE;
+}
+void CXFA_FFField::UnloadWidget() {
+  delete m_pNormalWidget;
+  m_pNormalWidget = nullptr;
+}
+void CXFA_FFField::SetEditScrollOffset() {
+  XFA_ELEMENT eType = m_pDataAcc->GetUIType();
+  if (eType == XFA_ELEMENT_TextEdit || eType == XFA_ELEMENT_NumericEdit ||
+      eType == XFA_ELEMENT_PasswordEdit) {
+    FX_FLOAT fScrollOffset = 0;
+    CXFA_FFField* pPrev = static_cast<CXFA_FFField*>(GetPrev());
+    if (pPrev) {
+      CFX_RectF rtMargin;
+      m_pDataAcc->GetUIMargin(rtMargin);
+      fScrollOffset = -rtMargin.top;
+    }
+    while (pPrev) {
+      fScrollOffset += pPrev->m_rtUI.height;
+      pPrev = static_cast<CXFA_FFField*>(pPrev->GetPrev());
+    }
+    ((CFWL_Edit*)m_pNormalWidget)->SetScrollOffset(fScrollOffset);
+  }
+}
+FX_BOOL CXFA_FFField::PerformLayout() {
+  CXFA_FFWidget::PerformLayout();
+  CapPlacement();
+  LayoutCaption();
+  SetFWLRect();
+  SetEditScrollOffset();
+  if (m_pNormalWidget) {
+    m_pNormalWidget->Update();
+  }
+  return TRUE;
+}
+void CXFA_FFField::CapPlacement() {
+  CFX_RectF rtWidget;
+  GetRectWithoutRotate(rtWidget);
+  CXFA_Margin mgWidget = m_pDataAcc->GetMargin();
+  if (mgWidget) {
+    CXFA_LayoutItem* pItem = this;
+    FX_FLOAT fLeftInset = 0, fRightInset = 0, fTopInset = 0, fBottomInset = 0;
+    mgWidget.GetLeftInset(fLeftInset);
+    mgWidget.GetRightInset(fRightInset);
+    mgWidget.GetTopInset(fTopInset);
+    mgWidget.GetBottomInset(fBottomInset);
+    if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
+      rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
+    } else {
+      if (pItem->GetPrev() == NULL) {
+        rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, 0);
+      } else if (pItem->GetNext() == NULL) {
+        rtWidget.Deflate(fLeftInset, 0, fRightInset, fBottomInset);
+      } else {
+        rtWidget.Deflate(fLeftInset, 0, fRightInset, 0);
+      }
+    }
+  }
+  XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
+  FX_FLOAT fCapReserve = 0;
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
+    iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType();
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Top && GetPrev()) {
+      m_rtCaption.Set(0, 0, 0, 0);
+    } else if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom && GetNext()) {
+      m_rtCaption.Set(0, 0, 0, 0);
+    } else {
+      fCapReserve = caption.GetReserve();
+      CXFA_LayoutItem* pItem = this;
+      if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
+        m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width,
+                        rtWidget.height);
+      } else {
+        pItem = pItem->GetFirst();
+        pItem->GetRect(m_rtCaption);
+        pItem = pItem->GetNext();
+        while (pItem) {
+          CFX_RectF rtRect;
+          pItem->GetRect(rtRect);
+          m_rtCaption.height += rtRect.Height();
+          pItem = pItem->GetNext();
+        }
+        XFA_RectWidthoutMargin(m_rtCaption, mgWidget);
+      }
+      CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
+      if (fCapReserve <= 0 && pCapTextLayout) {
+        CFX_SizeF size;
+        CFX_SizeF minSize;
+        CFX_SizeF maxSize;
+        pCapTextLayout->CalcSize(minSize, maxSize, size);
+        if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
+            iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
+          fCapReserve = size.y;
+        } else {
+          fCapReserve = size.x;
+        }
+      }
+    }
+  }
+  m_rtUI = rtWidget;
+  switch (iCapPlacement) {
+    case XFA_ATTRIBUTEENUM_Left: {
+      m_rtCaption.width = fCapReserve;
+      CapLeftRightPlacement(caption, rtWidget, iCapPlacement);
+      m_rtUI.width -= fCapReserve;
+      m_rtUI.left += fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Top: {
+      m_rtCaption.height = fCapReserve;
+      CapTopBottomPlacement(caption, rtWidget, iCapPlacement);
+      m_rtUI.top += fCapReserve;
+      m_rtUI.height -= fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Right: {
+      m_rtCaption.left = m_rtCaption.right() - fCapReserve;
+      m_rtCaption.width = fCapReserve;
+      CapLeftRightPlacement(caption, rtWidget, iCapPlacement);
+      m_rtUI.width -= fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Bottom: {
+      m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
+      m_rtCaption.height = fCapReserve;
+      CapTopBottomPlacement(caption, rtWidget, iCapPlacement);
+      m_rtUI.height -= fCapReserve;
+    } break;
+    case XFA_ATTRIBUTEENUM_Inline:
+      break;
+    default:
+      break;
+  }
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  if (borderUI) {
+    CXFA_Margin margin = borderUI.GetMargin();
+    if (margin) {
+      XFA_RectWidthoutMargin(m_rtUI, margin);
+    }
+  }
+  m_rtUI.Normalize();
+}
+void CXFA_FFField::CapTopBottomPlacement(CXFA_Caption caption,
+                                         const CFX_RectF& rtWidget,
+                                         int32_t iCapPlacement) {
+  CFX_RectF rtUIMargin;
+  m_pDataAcc->GetUIMargin(rtUIMargin);
+  m_rtCaption.left += rtUIMargin.left;
+  if (CXFA_Margin mgCap = caption.GetMargin()) {
+    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+    if (m_rtCaption.height < 0) {
+      m_rtCaption.top += m_rtCaption.height;
+    }
+  }
+  FX_FLOAT fWidth = rtUIMargin.left + rtUIMargin.width;
+  FX_FLOAT fHeight = m_rtCaption.height + rtUIMargin.top + rtUIMargin.height;
+  if (fWidth > rtWidget.width) {
+    m_rtUI.width += fWidth - rtWidget.width;
+  }
+  if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) {
+    m_rtUI.height = XFA_MINUI_HEIGHT;
+    m_rtCaption.top += rtUIMargin.top + rtUIMargin.height;
+  } else if (fHeight > rtWidget.height) {
+    m_rtUI.height += fHeight - rtWidget.height;
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
+      m_rtCaption.top += fHeight - rtWidget.height;
+    }
+  }
+}
+void CXFA_FFField::CapLeftRightPlacement(CXFA_Caption caption,
+                                         const CFX_RectF& rtWidget,
+                                         int32_t iCapPlacement) {
+  CFX_RectF rtUIMargin;
+  m_pDataAcc->GetUIMargin(rtUIMargin);
+  m_rtCaption.top += rtUIMargin.top;
+  m_rtCaption.height -= rtUIMargin.top;
+  if (CXFA_Margin mgCap = caption.GetMargin()) {
+    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+    if (m_rtCaption.height < 0) {
+      m_rtCaption.top += m_rtCaption.height;
+    }
+  }
+  FX_FLOAT fWidth = m_rtCaption.width + rtUIMargin.left + rtUIMargin.width;
+  FX_FLOAT fHeight = rtUIMargin.top + rtUIMargin.height;
+  if (fWidth > rtWidget.width) {
+    m_rtUI.width += fWidth - rtWidget.width;
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) {
+      m_rtCaption.left += fWidth - rtWidget.width;
+    }
+  }
+  if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) {
+    m_rtUI.height = XFA_MINUI_HEIGHT;
+    m_rtCaption.top += rtUIMargin.top + rtUIMargin.height;
+  } else if (fHeight > rtWidget.height) {
+    m_rtUI.height += fHeight - rtWidget.height;
+  }
+}
+void CXFA_FFField::UpdateFWL() {
+  if (m_pNormalWidget) {
+    m_pNormalWidget->Update();
+  }
+}
+FX_DWORD CXFA_FFField::UpdateUIProperty() {
+  CXFA_Node* pUiNode = m_pDataAcc->GetUIChild();
+  FX_DWORD dwStyle = 0;
+  if (pUiNode && pUiNode->GetClassID() == XFA_ELEMENT_DefaultUi) {
+    dwStyle = FWL_STYLEEXT_EDT_ReadOnly;
+  }
+  return dwStyle;
+}
+void CXFA_FFField::SetFWLRect() {
+  if (!m_pNormalWidget) {
+    return;
+  }
+  CFX_RectF rtUi = m_rtUI;
+  if (rtUi.width < 1.0) {
+    FXSYS_assert(rtUi.width < 1.0);
+    rtUi.width = 1.0;
+  }
+  if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    FX_FLOAT fFontSize = m_pDataAcc->GetFontSize();
+    if (rtUi.height < fFontSize) {
+      rtUi.height = fFontSize;
+    }
+  }
+  m_pNormalWidget->SetWidgetRect(rtUi);
+}
+FX_BOOL CXFA_FFField::OnMouseEnter() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseEnter;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnMouseExit() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+void CXFA_FFField::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
+  if (!m_pNormalWidget) {
+    return;
+  }
+  CFX_RectF rtWidget;
+  m_pNormalWidget->GetWidgetRect(rtWidget);
+  fx -= rtWidget.left;
+  fy -= rtWidget.top;
+}
+FX_BOOL CXFA_FFField::OnLButtonDown(FX_DWORD dwFlags,
+                                    FX_FLOAT fx,
+                                    FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return FALSE;
+  }
+  if (!PtInActiveRect(fx, fy)) {
+    return FALSE;
+  }
+  SetButtonDown(TRUE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (!IsButtonDown()) {
+    return FALSE;
+  }
+  SetButtonDown(FALSE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnLButtonDblClk(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDblClk;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseMove;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnMouseWheel(FX_DWORD dwFlags,
+                                   int16_t zDelta,
+                                   FX_FLOAT fx,
+                                   FX_FLOAT fy) {
+  return FALSE;
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouseWheel ms;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_fDeltaX = zDelta;
+  ms.m_fDeltaY = 0;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnRButtonDown(FX_DWORD dwFlags,
+                                    FX_FLOAT fx,
+                                    FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return FALSE;
+  }
+  if (!PtInActiveRect(fx, fy)) {
+    return FALSE;
+  }
+  SetButtonDown(TRUE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (!IsButtonDown()) {
+    return FALSE;
+  }
+  SetButtonDown(FALSE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonUp;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnRButtonDblClk(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDblClk;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+
+FX_BOOL CXFA_FFField::OnSetFocus(CXFA_FFWidget* pOldWidget) {
+  CXFA_FFWidget::OnSetFocus(pOldWidget);
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFWL_MsgSetFocus ms;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  m_dwStatus |= XFA_WIDGETSTATUS_Focused;
+  AddInvalidateRect();
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+  if (!m_pNormalWidget) {
+    return CXFA_FFWidget::OnKillFocus(pNewWidget);
+  }
+  CFWL_MsgKillFocus ms;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
+  AddInvalidateRect();
+  CXFA_FFWidget::OnKillFocus(pNewWidget);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return FALSE;
+  }
+  CFWL_MsgKey ms;
+  ms.m_dwCmd = FWL_MSGKEYCMD_KeyDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_dwKeyCode = dwKeyCode;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return FALSE;
+  }
+  CFWL_MsgKey ms;
+  ms.m_dwCmd = FWL_MSGKEYCMD_KeyUp;
+  ms.m_dwFlags = dwFlags;
+  ms.m_dwKeyCode = dwKeyCode;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
+  if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    return FALSE;
+  }
+  if (dwChar == FWL_VKEY_Tab) {
+    return TRUE;
+  }
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  CFWL_MsgKey ms;
+  ms.m_dwCmd = FWL_MSGKEYCMD_Char;
+  ms.m_dwFlags = dwFlags;
+  ms.m_dwKeyCode = dwChar;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_DWORD CXFA_FFField::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pNormalWidget) {
+    FX_FLOAT ffx = fx, ffy = fy;
+    FWLToClient(ffx, ffy);
+    FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy);
+    if (dwWidgetHit != FWL_WGTHITTEST_Unknown) {
+      return FWL_WGTHITTEST_Client;
+    }
+  }
+  CFX_RectF rtBox;
+  GetRectWithoutRotate(rtBox);
+  if (!rtBox.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Unknown;
+  }
+  if (m_rtCaption.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Titlebar;
+  }
+  return FWL_WGTHITTEST_Border;
+}
+FX_BOOL CXFA_FFField::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
+  return TRUE;
+}
+FX_BOOL CXFA_FFField::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFX_RectF rtWidget;
+  m_pNormalWidget->GetWidgetRect(rtWidget);
+  if (rtWidget.Contains(fx, fy)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_FFField::LayoutCaption() {
+  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
+  if (!pCapTextLayout)
+    return;
+
+  FX_FLOAT fHeight = 0;
+  pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height),
+                         &fHeight);
+  if (m_rtCaption.height < fHeight)
+    m_rtCaption.height = fHeight;
+}
+void CXFA_FFField::RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix) {
+  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
+  if (!pCapTextLayout) {
+    return;
+  }
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  if (caption && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
+    if (!pCapTextLayout->IsLoaded()) {
+      pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height));
+    }
+    CFX_RectF rtWidget;
+    GetRectWithoutRotate(rtWidget);
+    CFX_RectF rtClip = m_rtCaption;
+    rtClip.Intersect(rtWidget);
+    CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top);
+    if (pMatrix) {
+      pMatrix->TransformRect(rtClip);
+      mt.Concat(*pMatrix);
+    }
+    pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
+  }
+}
+FX_BOOL CXFA_FFField::ProcessCommittedData() {
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  if (!IsDataChanged()) {
+    return FALSE;
+  }
+  if (CalculateOverride() != 1) {
+    return FALSE;
+  }
+  if (!CommitData()) {
+    return FALSE;
+  }
+  m_pDocView->SetChangeMark();
+  m_pDocView->AddValidateWidget(m_pDataAcc);
+  return TRUE;
+}
+int32_t CXFA_FFField::CalculateOverride() {
+  CXFA_WidgetAcc* pAcc = m_pDataAcc->GetExclGroup();
+  if (!pAcc) {
+    return CalculateWidgetAcc(m_pDataAcc);
+  }
+  if (CalculateWidgetAcc(pAcc) == 0) {
+    return 0;
+  }
+  CXFA_Node* pNode = pAcc->GetExclGroupFirstMember();
+  if (!pNode) {
+    return 1;
+  }
+  CXFA_WidgetAcc* pWidgetAcc = NULL;
+  while (pNode) {
+    pWidgetAcc = (CXFA_WidgetAcc*)pNode->GetWidgetData();
+    if (!pWidgetAcc) {
+      return 1;
+    }
+    if (CalculateWidgetAcc(pWidgetAcc) == 0) {
+      return 0;
+    }
+    pNode = pWidgetAcc->GetExclGroupNextMember(pNode);
+  }
+  return 1;
+}
+int32_t CXFA_FFField::CalculateWidgetAcc(CXFA_WidgetAcc* pAcc) {
+  CXFA_Calculate calc = pAcc->GetCalculate();
+  if (!calc) {
+    return 1;
+  }
+  XFA_VERSION version = pAcc->GetDoc()->GetXFADoc()->GetCurVersionMode();
+  if (calc) {
+    int32_t iOverride = calc.GetOverride();
+    switch (iOverride) {
+      case XFA_ATTRIBUTEENUM_Error: {
+        if (version <= XFA_VERSION_204) {
+          return 1;
+        }
+        IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
+        if (pAppProvider) {
+          CFX_WideString wsMessage;
+          CFX_WideString wsWarning;
+          pAppProvider->LoadString(XFA_IDS_NotModifyField, wsWarning);
+          wsMessage += wsWarning;
+          CFX_WideString wsTitle;
+          pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle);
+          pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning,
+                               XFA_MB_OK);
+        }
+      }
+        return 0;
+      case XFA_ATTRIBUTEENUM_Warning: {
+        if (version <= XFA_VERSION_204) {
+          CXFA_Script script = calc.GetScript();
+          if (!script) {
+            return 1;
+          }
+          CFX_WideString wsExpression;
+          script.GetExpression(wsExpression);
+          if (wsExpression.IsEmpty()) {
+            return 1;
+          }
+        }
+        if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+          return 1;
+        }
+        IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
+        if (pAppProvider) {
+          CFX_WideString wsMessage;
+          calc.GetMessageText(wsMessage);
+          if (!wsMessage.IsEmpty()) {
+            wsMessage += L"\r\n";
+          }
+          CFX_WideString wsWarning;
+          pAppProvider->LoadString(XFA_IDS_ModifyField, wsWarning);
+          wsMessage += wsWarning;
+          CFX_WideString wsTitle;
+          pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle);
+          if (pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning,
+                                   XFA_MB_YesNo) == XFA_IDYes) {
+            pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
+            return 1;
+          }
+        }
+        return 0;
+      }
+      case XFA_ATTRIBUTEENUM_Ignore:
+        return 0;
+      case XFA_ATTRIBUTEENUM_Disabled:
+        pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
+      default:
+        return 1;
+    }
+  }
+  return 1;
+}
+FX_BOOL CXFA_FFField::CommitData() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFField::IsDataChanged() {
+  return FALSE;
+}
+void CXFA_FFField::TranslateFWLMessage(CFWL_Message* pMessage) {
+  GetApp()->GetWidgetMgrDelegate()->OnProcessMessageToForm(pMessage);
+}
+int32_t CXFA_FFField::OnProcessMessage(CFWL_Message* pMessage) {
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CXFA_FFField::OnProcessEvent(CFWL_Event* pEvent) {
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  switch (dwEventID) {
+    case FWL_EVTHASH_Mouse: {
+      CFWL_EvtMouse* event = (CFWL_EvtMouse*)pEvent;
+      if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) {
+        CXFA_EventParam eParam;
+        eParam.m_eType = XFA_EVENT_MouseEnter;
+        eParam.m_pTarget = m_pDataAcc;
+        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseEnter, &eParam);
+      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave) {
+        CXFA_EventParam eParam;
+        eParam.m_eType = XFA_EVENT_MouseExit;
+        eParam.m_pTarget = m_pDataAcc;
+        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseExit, &eParam);
+      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) {
+        CXFA_EventParam eParam;
+        eParam.m_eType = XFA_EVENT_MouseDown;
+        eParam.m_pTarget = m_pDataAcc;
+        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseDown, &eParam);
+      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
+        CXFA_EventParam eParam;
+        eParam.m_eType = XFA_EVENT_MouseUp;
+        eParam.m_pTarget = m_pDataAcc;
+        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseUp, &eParam);
+      }
+      break;
+    }
+    case FWL_EVTHASH_Click: {
+      CXFA_EventParam eParam;
+      eParam.m_eType = XFA_EVENT_Click;
+      eParam.m_pTarget = m_pDataAcc;
+      m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
+      break;
+    }
+    default: {}
+  }
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CXFA_FFField::OnDrawWidget(CFX_Graphics* pGraphics,
+                                   const CFX_Matrix* pMatrix) {
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fxfa/app/xfa_fffield.h b/xfa/fxfa/app/xfa_fffield.h
new file mode 100644
index 0000000..4f816ce
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fffield.h
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFFIELD_H_
+#define XFA_FXFA_APP_XFA_FFFIELD_H_
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
+#include "xfa/include/fwl/core/fwl_widget.h"
+#include "xfa/include/fwl/lightwidget/widget.h"
+
+#define XFA_MINUI_HEIGHT 4.32f
+#define XFA_DEFAULTUI_HEIGHT 2.0f
+
+class CXFA_FFField : public CXFA_FFWidget, public IFWL_WidgetDelegate {
+ public:
+  CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFField();
+
+  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
+                          FX_DWORD dwStatus,
+                          FX_BOOL bDrawFocus = FALSE);
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL IsLoaded();
+  virtual FX_BOOL LoadWidget();
+  virtual void UnloadWidget();
+  virtual FX_BOOL PerformLayout();
+  virtual void UpdateFWL();
+  FX_DWORD UpdateUIProperty();
+  virtual FX_BOOL OnMouseEnter();
+  virtual FX_BOOL OnMouseExit();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
+                               int16_t zDelta,
+                               FX_FLOAT fx,
+                               FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+
+  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
+  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
+  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
+  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
+
+ protected:
+  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+  virtual void SetFWLRect();
+  void SetFWLThemeProvider();
+  CFWL_Widget* GetNormalWidget() { return m_pNormalWidget; }
+  void FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy);
+  void LayoutCaption();
+  void RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL);
+
+  int32_t CalculateOverride();
+  int32_t CalculateWidgetAcc(CXFA_WidgetAcc* pAcc);
+  FX_BOOL ProcessCommittedData();
+  virtual FX_BOOL CommitData();
+  virtual FX_BOOL IsDataChanged();
+  void DrawHighlight(CFX_Graphics* pGS,
+                     CFX_Matrix* pMatrix,
+                     FX_DWORD dwStatus,
+                     FX_BOOL bEllipse = FALSE);
+  void DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix);
+  void TranslateFWLMessage(CFWL_Message* pMessage);
+  void CapPlacement();
+  void CapTopBottomPlacement(CXFA_Caption caption,
+                             const CFX_RectF& rtWidget,
+                             int32_t iCapPlacement);
+  void CapLeftRightPlacement(CXFA_Caption caption,
+                             const CFX_RectF& rtWidget,
+                             int32_t iCapPlacement);
+  void SetEditScrollOffset();
+
+ public:
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  CFWL_Widget* m_pNormalWidget;
+  CFX_RectF m_rtUI;
+  CFX_RectF m_rtCaption;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFFIELD_H_
diff --git a/xfa/fxfa/app/xfa_ffimage.cpp b/xfa/fxfa/app/xfa_ffimage.cpp
new file mode 100644
index 0000000..c17273d
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffimage.cpp
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffimage.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+CXFA_FFImage::CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFDraw(pPageView, pDataAcc) {}
+CXFA_FFImage::~CXFA_FFImage() {
+  CXFA_FFImage::UnloadWidget();
+}
+FX_BOOL CXFA_FFImage::IsLoaded() {
+  return GetDataAcc()->GetImageImage() != NULL;
+}
+FX_BOOL CXFA_FFImage::LoadWidget() {
+  if (GetDataAcc()->GetImageImage()) {
+    return TRUE;
+  }
+  GetDataAcc()->LoadImageImage();
+  return CXFA_FFDraw::LoadWidget();
+}
+void CXFA_FFImage::UnloadWidget() {
+  GetDataAcc()->SetImageImage(NULL);
+}
+void CXFA_FFImage::RenderWidget(CFX_Graphics* pGS,
+                                CFX_Matrix* pMatrix,
+                                FX_DWORD dwStatus,
+                                int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  if (CFX_DIBitmap* pDIBitmap = GetDataAcc()->GetImageImage()) {
+    CFX_RectF rtImage;
+    GetRectWithoutRotate(rtImage);
+    if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+      XFA_RectWidthoutMargin(rtImage, mgWidget);
+    }
+    int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
+    int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
+    if (CXFA_Para para = m_pDataAcc->GetPara()) {
+      iHorzAlign = para.GetHorizontalAlign();
+      iVertAlign = para.GetVerticalAlign();
+    }
+    CXFA_Value value = m_pDataAcc->GetFormValue();
+    CXFA_Image imageObj = value.GetImage();
+    int32_t iAspect = imageObj.GetAspect();
+    int32_t iImageXDpi = 0;
+    int32_t iImageYDpi = 0;
+    m_pDataAcc->GetImageDpi(iImageXDpi, iImageYDpi);
+    XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi,
+                  iImageYDpi, iHorzAlign, iVertAlign);
+  }
+}
diff --git a/xfa/fxfa/app/xfa_ffimage.h b/xfa/fxfa/app/xfa_ffimage.h
new file mode 100644
index 0000000..71bb495
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffimage.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFIMAGE_H_
+#define XFA_FXFA_APP_XFA_FFIMAGE_H_
+
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+
+class CXFA_FFImage : public CXFA_FFDraw {
+ public:
+  CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFImage();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL IsLoaded();
+  virtual FX_BOOL LoadWidget();
+  virtual void UnloadWidget();
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFIMAGE_H_
diff --git a/xfa/fxfa/app/xfa_ffimageedit.cpp b/xfa/fxfa/app/xfa_ffimageedit.cpp
new file mode 100644
index 0000000..4f9f6c6
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffimageedit.cpp
@@ -0,0 +1,183 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffimageedit.h"
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fwl/core/fwl_app.h"
+#include "xfa/include/fwl/lightwidget/picturebox.h"
+
+CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_FFPageView* pPageView,
+                                   CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
+CXFA_FFImageEdit::~CXFA_FFImageEdit() {
+  CXFA_FFImageEdit::UnloadWidget();
+}
+FX_BOOL CXFA_FFImageEdit::LoadWidget() {
+  CFWL_PictureBox* pPictureBox = new CFWL_PictureBox;
+  if (pPictureBox) {
+    pPictureBox->Initialize();
+  }
+  m_pNormalWidget = (CFWL_Widget*)pPictureBox;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = pPictureBox->SetDelegate(this);
+  CXFA_FFField::LoadWidget();
+  if (m_pDataAcc->GetImageEditImage()) {
+    return TRUE;
+  }
+  UpdateFWLData();
+  return TRUE;
+}
+void CXFA_FFImageEdit::UnloadWidget() {
+  m_pDataAcc->SetImageEditImage(NULL);
+  CXFA_FFField::UnloadWidget();
+}
+void CXFA_FFImageEdit::RenderWidget(CFX_Graphics* pGS,
+                                    CFX_Matrix* pMatrix,
+                                    FX_DWORD dwStatus,
+                                    int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
+  RenderCaption(pGS, &mtRotate);
+  if (CFX_DIBitmap* pDIBitmap = m_pDataAcc->GetImageEditImage()) {
+    CFX_RectF rtImage;
+    m_pNormalWidget->GetWidgetRect(rtImage);
+    int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
+    int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
+    if (CXFA_Para para = m_pDataAcc->GetPara()) {
+      iHorzAlign = para.GetHorizontalAlign();
+      iVertAlign = para.GetVerticalAlign();
+    }
+    int32_t iAspect = XFA_ATTRIBUTEENUM_Fit;
+    if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
+      if (CXFA_Image imageObj = value.GetImage()) {
+        iAspect = imageObj.GetAspect();
+      }
+    }
+    int32_t iImageXDpi = 0;
+    int32_t iImageYDpi = 0;
+    m_pDataAcc->GetImageEditDpi(iImageXDpi, iImageYDpi);
+    XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi,
+                  iImageYDpi, iHorzAlign, iVertAlign);
+  }
+}
+FX_BOOL CXFA_FFImageEdit::OnLButtonDown(FX_DWORD dwFlags,
+                                        FX_FLOAT fx,
+                                        FX_FLOAT fy) {
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  if (!PtInActiveRect(fx, fy)) {
+    return FALSE;
+  }
+  SetButtonDown(TRUE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  TranslateFWLMessage(&ms);
+  IXFA_AppProvider* pAppProvider = GetAppProvider();
+  if (!pAppProvider) {
+    return TRUE;
+  }
+  CFX_WideString wsTitle;
+  CFX_WideString wsFilter;
+  pAppProvider->LoadString(XFA_IDS_ImageFilter, wsFilter);
+  CFX_WideStringArray wsPathArray;
+  pAppProvider->ShowFileDialog(wsTitle, wsFilter, wsPathArray);
+  int32_t iSize = wsPathArray.GetSize();
+  if (iSize < 1) {
+    return TRUE;
+  }
+  CFX_WideString wsFilePath = wsPathArray[0];
+  FX_STRSIZE nLen = wsFilePath.GetLength();
+  FX_STRSIZE nIndex = nLen - 1;
+  while (nIndex > 0 && wsFilePath[nIndex] != '.') {
+    nIndex--;
+  }
+  if (nIndex <= 0) {
+    return TRUE;
+  }
+  CFX_WideString wsContentType(L"image/");
+  wsContentType += wsFilePath.Right(nLen - nIndex - 1);
+  wsContentType.MakeLower();
+  FXCODEC_IMAGE_TYPE eImageType = XFA_GetImageType(wsContentType);
+  if (eImageType == FXCODEC_IMAGE_UNKNOWN) {
+    return TRUE;
+  }
+  CFX_WideString wsImage;
+  IFX_FileRead* pFileRead = FX_CreateFileRead(wsFilePath);
+  if (pFileRead) {
+    int32_t nDataSize = pFileRead->GetSize();
+    if (nDataSize > 0) {
+      CFX_ByteString bsBuf;
+      FX_CHAR* pImageBuffer = bsBuf.GetBuffer(nDataSize);
+      pFileRead->ReadBlock(pImageBuffer, 0, nDataSize);
+      bsBuf.ReleaseBuffer();
+      if (!bsBuf.IsEmpty()) {
+        FX_CHAR* pData = XFA_Base64Encode(bsBuf, nDataSize);
+        wsImage = CFX_WideString::FromLocal(pData);
+        FX_Free(pData);
+      }
+    }
+    m_pDataAcc->SetImageEditImage(NULL);
+    pFileRead->Release();
+  }
+  m_pDataAcc->SetImageEdit(wsContentType, CFX_WideStringC(), wsImage);
+  m_pDataAcc->LoadImageEditImage();
+  AddInvalidateRect();
+  m_pDocView->SetChangeMark();
+  return TRUE;
+}
+void CXFA_FFImageEdit::SetFWLRect() {
+  if (!m_pNormalWidget) {
+    return;
+  }
+  CFX_RectF rtUIMargin;
+  m_pDataAcc->GetUIMargin(rtUIMargin);
+  CFX_RectF rtImage(m_rtUI);
+  rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width,
+                  rtUIMargin.height);
+  m_pNormalWidget->SetWidgetRect(rtImage);
+}
+FX_BOOL CXFA_FFImageEdit::CommitData() {
+  return TRUE;
+}
+FX_BOOL CXFA_FFImageEdit::UpdateFWLData() {
+  m_pDataAcc->SetImageEditImage(NULL);
+  m_pDataAcc->LoadImageEditImage();
+  return TRUE;
+}
+int32_t CXFA_FFImageEdit::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFImageEdit::OnProcessEvent(CFWL_Event* pEvent) {
+  CXFA_FFField::OnProcessEvent(pEvent);
+  return m_pOldDelegate->OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFImageEdit::OnDrawWidget(CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
+}
diff --git a/xfa/fxfa/app/xfa_ffimageedit.h b/xfa/fxfa/app/xfa_ffimageedit.h
new file mode 100644
index 0000000..7ecd18a
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffimageedit.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFIMAGEEDIT_H_
+#define XFA_FXFA_APP_XFA_FFIMAGEEDIT_H_
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+
+class CXFA_FFImageEdit : public CXFA_FFField {
+ public:
+  CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFImageEdit();
+
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL LoadWidget();
+  virtual void UnloadWidget();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  virtual void SetFWLRect();
+  virtual FX_BOOL UpdateFWLData();
+  virtual FX_BOOL CommitData();
+  IFWL_WidgetDelegate* m_pOldDelegate;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFIMAGEEDIT_H_
diff --git a/xfa/fxfa/app/xfa_ffnotify.cpp b/xfa/fxfa/app/xfa_ffnotify.cpp
new file mode 100644
index 0000000..845f7b8
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffnotify.cpp
@@ -0,0 +1,648 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffnotify.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffbarcode.h"
+#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+#include "xfa/fxfa/app/xfa_ffexclgroup.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffimage.h"
+#include "xfa/fxfa/app/xfa_ffimageedit.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffpath.h"
+#include "xfa/fxfa/app/xfa_ffpushbutton.h"
+#include "xfa/fxfa/app/xfa_ffsignature.h"
+#include "xfa/fxfa/app/xfa_ffsubform.h"
+#include "xfa/fxfa/app/xfa_fftext.h"
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_ffwidgetacc.h"
+#include "xfa/fxfa/app/xfa_ffwidgethandler.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+
+static void XFA_FFDeleteWidgetAcc(void* pData) {
+  delete static_cast<CXFA_WidgetAcc*>(pData);
+}
+static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteWidgetAcc = {
+    XFA_FFDeleteWidgetAcc, NULL};
+CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
+CXFA_FFNotify::~CXFA_FFNotify() {}
+void CXFA_FFNotify::OnPageEvent(IXFA_LayoutPage* pSender,
+                                XFA_PAGEEVENT eEvent,
+                                void* pParam) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout());
+  if (!pDocView) {
+    return;
+  }
+  pDocView->OnPageEvent(pSender, eEvent, (int32_t)(uintptr_t)pParam);
+}
+void CXFA_FFNotify::OnNodeEvent(CXFA_Node* pSender,
+                                XFA_NODEEVENT eEvent,
+                                void* pParam,
+                                void* pParam2,
+                                void* pParam3,
+                                void* pParam4) {
+  switch (eEvent) {
+    case XFA_NODEEVENT_Ready:
+      OnNodeReady(pSender);
+      break;
+    case XFA_NODEEVENT_ValueChanging:
+      OnValueChanging(pSender, pParam, pParam2);
+      break;
+    case XFA_NODEEVENT_ValueChanged:
+      OnValueChanged(pSender, pParam, pParam2, pParam3, pParam4);
+      break;
+    case XFA_NODEEVENT_ChildAdded:
+      OnChildAdded(pSender, pParam, pParam2);
+      break;
+    case XFA_NODEEVENT_ChildRemoved:
+      OnChildRemoved(pSender, pParam, pParam2);
+      break;
+  }
+}
+void CXFA_FFNotify::OnWidgetDataEvent(CXFA_WidgetData* pSender,
+                                      FX_DWORD dwEvent,
+                                      void* pParam,
+                                      void* pAdditional,
+                                      void* pAdditional2) {
+  CXFA_WidgetAcc* pWidgetAcc = static_cast<CXFA_WidgetAcc*>(pSender);
+  switch (dwEvent) {
+    case XFA_WIDGETEVENT_ListItemAdded: {
+      if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
+        return;
+      }
+      FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify();
+      CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
+      if (!pWidget) {
+        if (bStaticNotify) {
+          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
+              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
+              pAdditional);
+        }
+        return;
+      }
+      while (pWidget) {
+        if (pWidget->IsLoaded()) {
+          if (pWidgetAcc->IsListBox()) {
+            static_cast<CXFA_FFListBox*>(pWidget)
+                ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
+                             (int32_t)(uintptr_t)pAdditional2);
+          } else {
+            static_cast<CXFA_FFComboBox*>(pWidget)
+                ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
+                             (int32_t)(uintptr_t)pAdditional2);
+          }
+        }
+        if (bStaticNotify) {
+          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
+              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
+              pAdditional);
+        }
+        pWidget = pWidgetAcc->GetNextWidget(pWidget);
+      }
+    } break;
+    case XFA_WIDGETEVENT_ListItemRemoved: {
+      if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
+        return;
+      }
+      FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify();
+      CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
+      if (!pWidget) {
+        if (bStaticNotify) {
+          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
+              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
+              pAdditional);
+        }
+        return;
+      }
+      while (pWidget) {
+        if (pWidget->IsLoaded()) {
+          if (pWidgetAcc->IsListBox()) {
+            static_cast<CXFA_FFListBox*>(pWidget)
+                ->DeleteItem((int32_t)(uintptr_t)pParam);
+          } else {
+            static_cast<CXFA_FFComboBox*>(pWidget)
+                ->DeleteItem((int32_t)(uintptr_t)pParam);
+          }
+        }
+        if (bStaticNotify) {
+          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
+              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
+              pAdditional);
+        }
+        pWidget = pWidgetAcc->GetNextWidget(pWidget);
+      }
+    } break;
+  }
+}
+CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) {
+  IXFA_DocLayout* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
+  XFA_ELEMENT eType = pNode->GetClassID();
+  if (eType == XFA_ELEMENT_PageArea) {
+    return new CXFA_FFPageView(pDocView, pNode);
+  }
+  if (eType == XFA_ELEMENT_ContentArea) {
+    return new CXFA_ContainerLayoutItem(pNode);
+  }
+  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData());
+  if (!pAcc) {
+    return new CXFA_ContentLayoutItem(pNode);
+  }
+  CXFA_FFPageView* pPageView = NULL;
+  CXFA_FFWidget* pWidget = NULL;
+  switch (pAcc->GetUIType()) {
+    case XFA_ELEMENT_Barcode:
+      pWidget = new CXFA_FFBarcode(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Button:
+      pWidget = new CXFA_FFPushButton(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_CheckButton:
+      pWidget = new CXFA_FFCheckButton(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_ChoiceList: {
+      if (pAcc->IsListBox()) {
+        pWidget = new CXFA_FFListBox(pPageView, pAcc);
+      } else {
+        pWidget = new CXFA_FFComboBox(pPageView, pAcc);
+      }
+    } break;
+    case XFA_ELEMENT_DateTimeEdit:
+      pWidget = new CXFA_FFDateTimeEdit(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_ImageEdit:
+      pWidget = new CXFA_FFImageEdit(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_NumericEdit:
+      pWidget = new CXFA_FFNumericEdit(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_PasswordEdit:
+      pWidget = new CXFA_FFPasswordEdit(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Signature:
+      pWidget = new CXFA_FFSignature(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_TextEdit:
+      pWidget = new CXFA_FFTextEdit(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Arc:
+      pWidget = new CXFA_FFArc(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Line:
+      pWidget = new CXFA_FFLine(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Rectangle:
+      pWidget = new CXFA_FFRectangle(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Text:
+      pWidget = new CXFA_FFText(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Image:
+      pWidget = new CXFA_FFImage(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Draw:
+      pWidget = new CXFA_FFDraw(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_Subform:
+      pWidget = new CXFA_FFSubForm(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_ExclGroup:
+      pWidget = new CXFA_FFExclGroup(pPageView, pAcc);
+      break;
+    case XFA_ELEMENT_DefaultUi:
+    default:
+      pWidget = NULL;
+      break;
+  }
+  if (!pWidget) {
+    return NULL;
+  }
+  pWidget->SetDocView(pDocView);
+  return pWidget;
+}
+void CXFA_FFNotify::OnLayoutEvent(IXFA_DocLayout* pLayout,
+                                  CXFA_LayoutItem* pSender,
+                                  XFA_LAYOUTEVENT eEvent,
+                                  void* pParam,
+                                  void* pParam2) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
+  if (!pDocView || !XFA_GetWidgetFromLayoutItem(pSender)) {
+    return;
+  }
+  switch (eEvent) {
+    case XFA_LAYOUTEVENT_ItemAdded:
+      OnLayoutItemAdd(pDocView, pLayout, pSender, pParam, pParam2);
+      break;
+    case XFA_LAYOUTEVENT_ItemRemoving:
+      OnLayoutItemRemoving(pDocView, pLayout, pSender, pParam, pParam2);
+      break;
+    case XFA_LAYOUTEVENT_RectChanged:
+      OnLayoutItemRectChanged(pDocView, pLayout, pSender, pParam, pParam2);
+      break;
+    case XFA_LAYOUTEVENT_StatusChanged:
+      OnLayoutItemStatustChanged(pDocView, pLayout, pSender, pParam, pParam2);
+      break;
+  }
+}
+void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node* pItem,
+                                         FX_FLOAT& fCalcWidth,
+                                         FX_FLOAT& fCalcHeight) {
+  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData());
+  if (!pAcc) {
+    return;
+  }
+  pAcc->StartWidgetLayout(fCalcWidth, fCalcHeight);
+}
+FX_BOOL CXFA_FFNotify::FindSplitPos(CXFA_Node* pItem,
+                                    int32_t iBlockIndex,
+                                    FX_FLOAT& fCalcHeightPos) {
+  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData());
+  if (!pAcc) {
+    return FALSE;
+  }
+  return (XFA_LAYOUTRESULT)pAcc->FindSplitPos(iBlockIndex, fCalcHeightPos);
+}
+FX_BOOL CXFA_FFNotify::RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) {
+  FX_BOOL bRet = FALSE;
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return bRet;
+  }
+  CXFA_WidgetAcc* pWidgetAcc =
+      static_cast<CXFA_WidgetAcc*>(pFormItem->GetWidgetData());
+  if (!pWidgetAcc) {
+    return bRet;
+  }
+  CXFA_EventParam EventParam;
+  EventParam.m_eType = XFA_EVENT_Unknown;
+  FXJSE_HVALUE pRetValue = NULL;
+  int32_t iRet =
+      pWidgetAcc->ExecuteScript(CXFA_Script(pScript), &EventParam, &pRetValue);
+  if (iRet == XFA_EVENTERROR_Sucess && pRetValue) {
+    bRet = FXJSE_Value_ToBoolean(pRetValue);
+    FXJSE_Value_Release(pRetValue);
+  }
+  return bRet;
+}
+int32_t CXFA_FFNotify::ExecEventByDeepFirst(CXFA_Node* pFormNode,
+                                            XFA_EVENTTYPE eEventType,
+                                            FX_BOOL bIsFormReady,
+                                            FX_BOOL bRecursive,
+                                            CXFA_WidgetAcc* pExclude) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  return pDocView->ExecEventActivityByDeepFirst(
+      pFormNode, eEventType, bIsFormReady, bRecursive,
+      pExclude ? pExclude->GetNode() : NULL);
+}
+void CXFA_FFNotify::AddCalcValidate(CXFA_Node* pNode) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  CXFA_WidgetAcc* pWidgetAcc =
+      static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData());
+  if (!pWidgetAcc) {
+    return;
+  }
+  pDocView->AddCalculateWidgetAcc(pWidgetAcc);
+  pDocView->AddValidateWidget(pWidgetAcc);
+}
+IXFA_Doc* CXFA_FFNotify::GetHDOC() {
+  return m_pDoc;
+}
+IXFA_DocProvider* CXFA_FFNotify::GetDocProvider() {
+  return m_pDoc->GetDocProvider();
+}
+IXFA_AppProvider* CXFA_FFNotify::GetAppProvider() {
+  return m_pDoc->GetApp()->GetAppProvider();
+}
+IXFA_WidgetHandler* CXFA_FFNotify::GetWidgetHandler() {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  return pDocView ? pDocView->GetWidgetHandler() : NULL;
+}
+IXFA_Widget* CXFA_FFNotify::GetHWidget(CXFA_LayoutItem* pLayoutItem) {
+  return XFA_GetWidgetFromLayoutItem(pLayoutItem);
+}
+void CXFA_FFNotify::OpenDropDownList(IXFA_Widget* hWidget) {
+  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
+  if (pWidget->GetDataAcc()->GetUIType() != XFA_ELEMENT_ChoiceList) {
+    return;
+  }
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  pDocView->LockUpdate();
+  static_cast<CXFA_FFComboBox*>(pWidget)->OpenDropDownList();
+  pDocView->UnlockUpdate();
+  pDocView->UpdateDocView();
+}
+CFX_WideString CXFA_FFNotify::GetCurrentDateTime() {
+  CFX_Unitime dataTime;
+  dataTime.Now();
+  CFX_WideString wsDateTime;
+  wsDateTime.Format(L"%d%02d%02dT%02d%02d%02d", dataTime.GetYear(),
+                    dataTime.GetMonth(), dataTime.GetDay(), dataTime.GetHour(),
+                    dataTime.GetMinute(), dataTime.GetSecond());
+  return wsDateTime;
+}
+void CXFA_FFNotify::ResetData(CXFA_WidgetData* pWidgetData) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  pDocView->ResetWidgetData(static_cast<CXFA_WidgetAcc*>(pWidgetData));
+}
+int32_t CXFA_FFNotify::GetLayoutStatus() {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  return pDocView ? pDocView->GetLayoutStatus() : 0;
+}
+void CXFA_FFNotify::RunNodeInitialize(CXFA_Node* pNode) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  pDocView->AddNewFormNode(pNode);
+}
+void CXFA_FFNotify::RunSubformIndexChange(CXFA_Node* pSubformNode) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  pDocView->AddIndexChangedSubform(pSubformNode);
+}
+CXFA_Node* CXFA_FFNotify::GetFocusWidgetNode() {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return NULL;
+  }
+  CXFA_WidgetAcc* pAcc = pDocView->GetFocusWidgetAcc();
+  return pAcc ? pAcc->GetNode() : NULL;
+}
+void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  CXFA_WidgetAcc* pAcc =
+      pNode ? static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData()) : nullptr;
+  pDocView->SetFocusWidgetAcc(pAcc);
+}
+void CXFA_FFNotify::OnNodeReady(CXFA_Node* pNode) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  XFA_ELEMENT iType = pNode->GetClassID();
+  if (XFA_IsCreateWidget(iType)) {
+    CXFA_WidgetAcc* pAcc =
+        new CXFA_WidgetAcc(pDocView, static_cast<CXFA_Node*>(pNode));
+    pNode->SetObject(XFA_ATTRIBUTE_WidgetData, pAcc, &gs_XFADeleteWidgetAcc);
+    return;
+  }
+  switch (iType) {
+    case XFA_ELEMENT_BindItems:
+      pDocView->m_bindItems.Add(pNode);
+      break;
+    case XFA_ELEMENT_Validate: {
+      pNode->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
+    } break;
+    default:
+      break;
+  }
+}
+void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender,
+                                    void* pParam,
+                                    void* pParam2) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End) {
+    return;
+  }
+  FX_DWORD dwPacket = pSender->GetPacketID();
+  if (dwPacket & XFA_XDPPACKET_Datasets) {
+  } else if (pSender->IsFormContainer()) {
+    XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam;
+    if (eAttr == XFA_ATTRIBUTE_Presence) {
+      CXFA_WidgetAcc* pWidgetAcc =
+          static_cast<CXFA_WidgetAcc*>(pSender->GetWidgetData());
+      if (!pWidgetAcc) {
+        return;
+      }
+      CXFA_FFWidget* pWidget = NULL;
+      while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
+        if (pWidget->IsLoaded()) {
+          pWidget->AddInvalidateRect();
+        }
+      }
+    }
+  }
+}
+void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender,
+                                   void* pParam,
+                                   void* pParam2,
+                                   void* pParam3,
+                                   void* pParam4) {
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  FX_DWORD dwPacket = pSender->GetPacketID();
+  XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam;
+  if (dwPacket & XFA_XDPPACKET_Form) {
+    CXFA_Node* pParentNode = static_cast<CXFA_Node*>(pParam3);
+    CXFA_Node* pWidgetNode = static_cast<CXFA_Node*>(pParam4);
+    XFA_ELEMENT ePType = pParentNode->GetClassID();
+    FX_BOOL bIsContainerNode = pParentNode->IsContainerNode();
+    CXFA_WidgetAcc* pWidgetAcc =
+        static_cast<CXFA_WidgetAcc*>(pWidgetNode->GetWidgetData());
+    if (!pWidgetAcc) {
+      return;
+    }
+    FX_BOOL bUpdateProperty = FALSE;
+    pDocView->SetChangeMark();
+    switch (ePType) {
+      case XFA_ELEMENT_Caption: {
+        CXFA_TextLayout* pCapOut = pWidgetAcc->GetCaptionTextLayout();
+        if (!pCapOut) {
+          return;
+        }
+        pCapOut->Unload();
+      } break;
+      case XFA_ELEMENT_Ui:
+      case XFA_ELEMENT_Para:
+        bUpdateProperty = TRUE;
+        break;
+      case XFA_ELEMENT_Font:
+      case XFA_ELEMENT_Margin:
+      case XFA_ELEMENT_Value:
+      case XFA_ELEMENT_Items:
+        break;
+      default:
+        break;
+    }
+    if (bIsContainerNode && eAttr == XFA_ATTRIBUTE_Access) {
+      bUpdateProperty = TRUE;
+      FX_BOOL bNotify = pDocView->IsStaticNotify();
+      if (bNotify) {
+        pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_AccessChanged, NULL, pParam2,
+                                NULL);
+      }
+    }
+    if (eAttr == XFA_ATTRIBUTE_Value) {
+      pDocView->AddCalculateNodeNotify(pSender);
+      if (ePType == XFA_ELEMENT_Value || bIsContainerNode) {
+        FX_BOOL bNotify = pDocView->IsStaticNotify();
+        if (bIsContainerNode) {
+          pWidgetAcc->UpdateUIDisplay();
+          pDocView->AddCalculateWidgetAcc(pWidgetAcc);
+          pDocView->AddValidateWidget(pWidgetAcc);
+        } else if (pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent)
+                       ->GetClassID() == XFA_ELEMENT_ExclGroup) {
+          pWidgetAcc->UpdateUIDisplay();
+        }
+        if (bNotify) {
+          pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL,
+                                  NULL, NULL);
+        }
+        return;
+      }
+    }
+    CXFA_FFWidget* pWidget = NULL;
+    while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
+      if (!pWidget->IsLoaded()) {
+        continue;
+      }
+      if (bUpdateProperty) {
+        pWidget->UpdateWidgetProperty();
+      }
+      pWidget->PerformLayout();
+      pWidget->AddInvalidateRect();
+    }
+  } else {
+    if (eAttr == XFA_ATTRIBUTE_Value) {
+      pDocView->AddCalculateNodeNotify(pSender);
+    }
+  }
+}
+void CXFA_FFNotify::OnChildAdded(CXFA_Node* pSender,
+                                 void* pParam,
+                                 void* pParam2) {
+  if (!pSender->IsFormContainer()) {
+    return;
+  }
+  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
+  if (!pDocView) {
+    return;
+  }
+  FX_BOOL bLayoutReady =
+      !(pDocView->m_bInLayoutStatus) &&
+      (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
+  if (bLayoutReady) {
+    m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
+  }
+}
+void CXFA_FFNotify::OnChildRemoved(CXFA_Node* pSender,
+                                   void* pParam,
+                                   void* pParam2) {
+  if (CXFA_FFDocView* pDocView = m_pDoc->GetDocView()) {
+    FX_BOOL bLayoutReady =
+        !(pDocView->m_bInLayoutStatus) &&
+        (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
+    if (bLayoutReady) {
+      m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
+    }
+  }
+}
+void CXFA_FFNotify::OnLayoutItemAdd(CXFA_FFDocView* pDocView,
+                                    IXFA_DocLayout* pLayout,
+                                    CXFA_LayoutItem* pSender,
+                                    void* pParam,
+                                    void* pParam2) {
+  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
+  int32_t iPageIdx = (int32_t)(uintptr_t)pParam;
+  IXFA_PageView* pNewPageView = pDocView->GetPageView(iPageIdx);
+  FX_DWORD dwStatus = (FX_DWORD)(uintptr_t)pParam2;
+  FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
+                      XFA_WIDGETSTATUS_Printable;
+  pWidget->ModifyStatus(dwStatus, dwFilter);
+  IXFA_PageView* pPrePageView = pWidget->GetPageView();
+  if (pPrePageView != pNewPageView ||
+      (dwStatus & (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) ==
+          (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) {
+    pWidget->SetPageView(pNewPageView);
+    m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
+                                          XFA_WIDGETEVENT_PostAdded,
+                                          pNewPageView, pPrePageView);
+  }
+  if (pDocView->GetLayoutStatus() != XFA_DOCVIEW_LAYOUTSTATUS_End ||
+      !(dwStatus & XFA_WIDGETSTATUS_Visible)) {
+    return;
+  }
+  if (pWidget->IsLoaded()) {
+    CFX_RectF rtOld;
+    pWidget->GetWidgetRect(rtOld);
+    if (rtOld != pWidget->ReCacheWidgetRect())
+      pWidget->PerformLayout();
+  } else {
+    pWidget->LoadWidget();
+  }
+  pWidget->AddInvalidateRect(nullptr);
+}
+void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_FFDocView* pDocView,
+                                         IXFA_DocLayout* pLayout,
+                                         CXFA_LayoutItem* pSender,
+                                         void* pParam,
+                                         void* pParam2) {
+  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
+  pDocView->DeleteLayoutItem(pWidget);
+  m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
+                                        XFA_WIDGETEVENT_PreRemoved, nullptr,
+                                        pWidget->GetPageView());
+  pWidget->AddInvalidateRect(nullptr);
+}
+void CXFA_FFNotify::OnLayoutItemRectChanged(CXFA_FFDocView* pDocView,
+                                            IXFA_DocLayout* pLayout,
+                                            CXFA_LayoutItem* pSender,
+                                            void* pParam,
+                                            void* pParam2) {}
+void CXFA_FFNotify::OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView,
+                                               IXFA_DocLayout* pLayout,
+                                               CXFA_LayoutItem* pSender,
+                                               void* pParam,
+                                               void* pParam2) {
+  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
+  if (!pWidget) {
+    return;
+  }
+  FX_DWORD dwStatus = (FX_DWORD)(uintptr_t)pParam;
+  if (dwStatus == 0) {
+    CXFA_LayoutItem* pPreItem = pSender->GetPrev();
+    if (pPreItem) {
+      CXFA_FFWidget* pPreWidget = static_cast<CXFA_FFWidget*>(pPreItem);
+      if (pPreWidget) {
+        dwStatus = pPreWidget->GetStatus();
+      }
+    }
+  }
+  FX_DWORD dwOldStatus = pWidget->GetStatus();
+  FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
+                      XFA_WIDGETSTATUS_Printable;
+  if ((dwOldStatus & dwFilter) == dwStatus) {
+    return;
+  }
+  pWidget->ModifyStatus(dwStatus, dwFilter);
+}
diff --git a/xfa/fxfa/app/xfa_ffnotify.h b/xfa/fxfa/app/xfa_ffnotify.h
new file mode 100644
index 0000000..e61c079
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffnotify.h
@@ -0,0 +1,99 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFNOTIFY_H_
+#define XFA_FXFA_APP_XFA_FFNOTIFY_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+
+class CXFA_FFNotify : public IXFA_Notify {
+ public:
+  CXFA_FFNotify(CXFA_FFDoc* pDoc);
+  ~CXFA_FFNotify();
+
+  virtual void OnPageEvent(IXFA_LayoutPage* pSender,
+                           XFA_PAGEEVENT eEvent,
+                           void* pParam = NULL);
+
+  virtual void OnNodeEvent(CXFA_Node* pSender,
+                           XFA_NODEEVENT eEvent,
+                           void* pParam = NULL,
+                           void* pParam2 = NULL,
+                           void* pParam3 = NULL,
+                           void* pParam4 = NULL);
+  virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
+                                 FX_DWORD dwEvent,
+                                 void* pParam = NULL,
+                                 void* pAdditional = NULL,
+                                 void* pAdditional2 = NULL);
+  virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode);
+  virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
+                             CXFA_LayoutItem* pSender,
+                             XFA_LAYOUTEVENT eEvent,
+                             void* pParam = NULL,
+                             void* pParam2 = NULL);
+
+  virtual void StartFieldDrawLayout(CXFA_Node* pItem,
+                                    FX_FLOAT& fCalcWidth,
+                                    FX_FLOAT& fCalcHeight);
+  virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
+                               int32_t iBlockIndex,
+                               FX_FLOAT& fCalcHeightPos);
+  virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem);
+  virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
+                                       XFA_EVENTTYPE eEventType,
+                                       FX_BOOL bIsFormReady = FALSE,
+                                       FX_BOOL bRecursive = TRUE,
+                                       CXFA_WidgetAcc* pExclude = NULL);
+  virtual void AddCalcValidate(CXFA_Node* pNode);
+  virtual IXFA_Doc* GetHDOC();
+  virtual IXFA_DocProvider* GetDocProvider();
+  virtual IXFA_AppProvider* GetAppProvider();
+  virtual IXFA_WidgetHandler* GetWidgetHandler();
+  virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem);
+  virtual void OpenDropDownList(IXFA_Widget* hWidget);
+  virtual CFX_WideString GetCurrentDateTime();
+  virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL);
+  virtual int32_t GetLayoutStatus();
+  virtual void RunNodeInitialize(CXFA_Node* pNode);
+  virtual void RunSubformIndexChange(CXFA_Node* pSubformNode);
+  virtual CXFA_Node* GetFocusWidgetNode();
+  virtual void SetFocusWidgetNode(CXFA_Node* pNode);
+
+ protected:
+  void OnNodeReady(CXFA_Node* pNode);
+  void OnValueChanging(CXFA_Node* pSender, void* pParam, void* pParam2);
+  void OnValueChanged(CXFA_Node* pSender,
+                      void* pParam,
+                      void* pParam2,
+                      void* pParam3,
+                      void* pParam4);
+  void OnChildAdded(CXFA_Node* pSender, void* pParam, void* pParam2);
+  void OnChildRemoved(CXFA_Node* pSender, void* pParam, void* pParam2);
+  void OnLayoutItemAdd(CXFA_FFDocView* pDocView,
+                       IXFA_DocLayout* pLayout,
+                       CXFA_LayoutItem* pSender,
+                       void* pParam,
+                       void* pParam2);
+  void OnLayoutItemRemoving(CXFA_FFDocView* pDocView,
+                            IXFA_DocLayout* pLayout,
+                            CXFA_LayoutItem* pSender,
+                            void* pParam,
+                            void* pParam2);
+  void OnLayoutItemRectChanged(CXFA_FFDocView* pDocView,
+                               IXFA_DocLayout* pLayout,
+                               CXFA_LayoutItem* pSender,
+                               void* pParam,
+                               void* pParam2);
+  void OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView,
+                                  IXFA_DocLayout* pLayout,
+                                  CXFA_LayoutItem* pSender,
+                                  void* pParam,
+                                  void* pParam2);
+  CXFA_FFDoc* m_pDoc;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFNOTIFY_H_
diff --git a/xfa/fxfa/app/xfa_ffpageview.cpp b/xfa/fxfa/app/xfa_ffpageview.cpp
new file mode 100644
index 0000000..1bc1681
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpageview.cpp
@@ -0,0 +1,424 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+
+#include "xfa/fde/fde_render.h"
+#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffimageedit.h"
+#include "xfa/fxfa/app/xfa_ffpushbutton.h"
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+
+CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
+    : CXFA_ContainerLayoutItem(pPageArea),
+      m_pDocView(pDocView),
+      m_bLoaded(FALSE) {}
+CXFA_FFPageView::~CXFA_FFPageView() {}
+IXFA_DocView* CXFA_FFPageView::GetDocView() {
+  return m_pDocView;
+}
+int32_t CXFA_FFPageView::GetPageViewIndex() {
+  return GetPageIndex();
+}
+void CXFA_FFPageView::GetPageViewRect(CFX_RectF& rtPage) {
+  CFX_SizeF sz;
+  GetPageSize(sz);
+  rtPage.Set(0, 0, sz);
+}
+void CXFA_FFPageView::GetDisplayMatrix(CFX_Matrix& mt,
+                                       const CFX_Rect& rtDisp,
+                                       int32_t iRotate) {
+  CFX_SizeF sz;
+  GetPageSize(sz);
+  CFX_RectF fdePage;
+  fdePage.Set(0, 0, sz.x, sz.y);
+  FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
+}
+int32_t CXFA_FFPageView::LoadPageView(IFX_Pause* pPause) {
+  if (m_bLoaded) {
+    return 100;
+  }
+  m_bLoaded = TRUE;
+  return 100;
+}
+void CXFA_FFPageView::UnloadPageView() {
+  if (!m_bLoaded) {
+    return;
+  }
+}
+FX_BOOL CXFA_FFPageView::IsPageViewLoaded() {
+  return m_bLoaded;
+}
+IXFA_Widget* CXFA_FFPageView::GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_bLoaded) {
+    return nullptr;
+  }
+  IXFA_WidgetIterator* pIterator = CreateWidgetIterator();
+  CXFA_FFWidget* pWidget = nullptr;
+  while ((pWidget = static_cast<CXFA_FFWidget*>(pIterator->MoveToNext()))) {
+    if (!(pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
+      continue;
+    }
+    CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
+    int32_t type = pAcc->GetClassID();
+    if (type != XFA_ELEMENT_Field && type != XFA_ELEMENT_Draw) {
+      continue;
+    }
+    FX_FLOAT fWidgetx = fx;
+    FX_FLOAT fWidgety = fy;
+    pWidget->Rotate2Normal(fWidgetx, fWidgety);
+    FX_DWORD dwFlag = pWidget->OnHitTest(fWidgetx, fWidgety);
+    if ((FWL_WGTHITTEST_Client == dwFlag ||
+         FWL_WGTHITTEST_HyperLink == dwFlag)) {
+      break;
+    }
+  }
+  pIterator->Release();
+  return pWidget;
+}
+IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(
+    FX_DWORD dwTraverseWay,
+    FX_DWORD dwWidgetFilter) {
+  switch (dwTraverseWay) {
+    case XFA_TRAVERSEWAY_Tranvalse:
+      return new CXFA_FFTabOrderPageWidgetIterator(this, dwWidgetFilter);
+    case XFA_TRAVERSEWAY_Form:
+      return new CXFA_FFPageWidgetIterator(this, dwWidgetFilter);
+  }
+  return NULL;
+}
+static FX_BOOL XFA_PageWidgetFilter(CXFA_FFWidget* pWidget,
+                                    FX_DWORD dwFilter,
+                                    FX_BOOL bTraversal,
+                                    FX_BOOL bIgnorerelevant) {
+  CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
+  FX_DWORD dwType = dwFilter & XFA_WIDGETFILTER_AllType;
+  if ((dwType == XFA_WIDGETFILTER_Field) &&
+      (pWidgetAcc->GetClassID() != XFA_ELEMENT_Field)) {
+    return FALSE;
+  }
+  FX_DWORD dwStatus = pWidget->GetStatus();
+  if (bTraversal && (dwStatus & XFA_WIDGETSTATUS_Disabled)) {
+    return FALSE;
+  }
+  if (bIgnorerelevant) {
+    return (dwStatus & XFA_WIDGETFILTER_Visible) != 0;
+  }
+  dwFilter &= (XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable |
+               XFA_WIDGETFILTER_Printable);
+  return (dwFilter & dwStatus) == dwFilter;
+}
+CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
+                                                     FX_DWORD dwFilter) {
+  m_pPageView = pPageView;
+  m_dwFilter = dwFilter;
+  m_sIterator.Init(pPageView);
+  m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
+                          ->GetXFADoc()
+                          ->GetCurVersionMode() < XFA_VERSION_205;
+}
+CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() {}
+void CXFA_FFPageWidgetIterator::Reset() {
+  m_sIterator.Reset();
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToFirst() {
+  m_sIterator.Reset();
+  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
+       pLayoutItem = m_sIterator.MoveToNext()) {
+    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
+      return hWidget;
+    }
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToLast() {
+  m_sIterator.SetCurrent(NULL);
+  return MoveToPrevious();
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToNext() {
+  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
+       pLayoutItem = m_sIterator.MoveToNext()) {
+    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
+      return hWidget;
+    }
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
+  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
+       pLayoutItem = m_sIterator.MoveToPrev()) {
+    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
+      return hWidget;
+    }
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::GetCurrentWidget() {
+  CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent();
+  return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : NULL;
+}
+FX_BOOL CXFA_FFPageWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
+  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
+  return pWidget && m_sIterator.SetCurrent(pWidget);
+}
+IXFA_Widget* CXFA_FFPageWidgetIterator::GetWidget(
+    CXFA_LayoutItem* pLayoutItem) {
+  if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
+    if (!XFA_PageWidgetFilter(pWidget, m_dwFilter, FALSE, m_bIgnorerelevant)) {
+      return NULL;
+    }
+    if (!pWidget->IsLoaded() &&
+        (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible) != 0) {
+      pWidget->LoadWidget();
+    }
+    return pWidget;
+  }
+  return NULL;
+}
+CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
+    CXFA_FFPageView* pPageView,
+    FX_DWORD dwFilter)
+    : m_pPageView(pPageView), m_dwFilter(dwFilter), m_iCurWidget(-1) {
+  m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
+                          ->GetXFADoc()
+                          ->GetCurVersionMode() < XFA_VERSION_205;
+  Reset();
+}
+CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {}
+void CXFA_FFTabOrderPageWidgetIterator::Release() {
+  delete this;
+}
+void CXFA_FFTabOrderPageWidgetIterator::Reset() {
+  CreateTabOrderWidgetArray();
+  m_iCurWidget = -1;
+}
+IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
+  if (m_TabOrderWidgetArray.GetSize() > 0) {
+    for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) {
+      if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
+                               m_bIgnorerelevant)) {
+        m_iCurWidget = i;
+        return m_TabOrderWidgetArray[m_iCurWidget];
+      }
+    }
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
+  if (m_TabOrderWidgetArray.GetSize() > 0) {
+    for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) {
+      if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
+                               m_bIgnorerelevant)) {
+        m_iCurWidget = i;
+        return m_TabOrderWidgetArray[m_iCurWidget];
+      }
+    }
+  }
+  return NULL;
+}
+IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
+  for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) {
+    if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
+                             m_bIgnorerelevant)) {
+      m_iCurWidget = i;
+      return m_TabOrderWidgetArray[m_iCurWidget];
+    }
+  }
+  m_iCurWidget = -1;
+  return NULL;
+}
+IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
+  for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
+    if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
+                             m_bIgnorerelevant)) {
+      m_iCurWidget = i;
+      return m_TabOrderWidgetArray[m_iCurWidget];
+    }
+  }
+  m_iCurWidget = -1;
+  return NULL;
+}
+IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
+  if (m_iCurWidget >= 0) {
+    return m_TabOrderWidgetArray[m_iCurWidget];
+  }
+  return NULL;
+}
+FX_BOOL CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
+    IXFA_Widget* hWidget) {
+  int32_t iWidgetIndex =
+      m_TabOrderWidgetArray.Find(static_cast<CXFA_FFWidget*>(hWidget));
+  if (iWidgetIndex >= 0) {
+    m_iCurWidget = iWidgetIndex;
+    return TRUE;
+  }
+  return FALSE;
+}
+CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
+    CXFA_FFWidget* pWidget) {
+  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
+  CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_ELEMENT_Traversal);
+  if (pTraversal) {
+    CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_ELEMENT_Traverse);
+    if (pTraverse) {
+      CFX_WideString wsTraverseWidgetName;
+      if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) {
+        return FindWidgetByName(wsTraverseWidgetName, pWidget);
+      }
+    }
+  }
+  return NULL;
+}
+CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
+    const CFX_WideStringC& wsWidgetName,
+    CXFA_FFWidget* pRefWidget) {
+  return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
+}
+void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
+  m_TabOrderWidgetArray.RemoveAll();
+  CXFA_WidgetArray SpaceOrderWidgetArray;
+  CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray);
+  int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize();
+  if (nWidgetCount < 1) {
+    return;
+  }
+  CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
+  for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) {
+    if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
+      m_TabOrderWidgetArray.Add(hWidget);
+      CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
+      if (pWidgetAcc->GetUIType() == XFA_ELEMENT_ExclGroup) {
+        int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1;
+        while (TRUE) {
+          CXFA_FFWidget* pRadio =
+              SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount];
+          if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
+            break;
+          }
+          if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
+            m_TabOrderWidgetArray.Add(pRadio);
+          }
+          iWidgetIndex++;
+        }
+      }
+      if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) {
+        hWidget = hTraverseWidget;
+        continue;
+      }
+    }
+    int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget);
+    hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount];
+  }
+}
+static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
+                                            const void* phWidget2) {
+  CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
+  CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget;
+  CFX_RectF rt1, rt2;
+  pWidget1->GetWidgetRect(rt1);
+  pWidget2->GetWidgetRect(rt2);
+  FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top;
+  if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) {
+    return -1;
+  }
+  return 1;
+}
+void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(
+    CXFA_LayoutItemIterator* sIterator,
+    CXFA_LayoutItem* pContainerItem,
+    CXFA_TabParam* pContainer,
+    FX_BOOL& bCurrentItem,
+    FX_BOOL& bContentArea,
+    FX_BOOL bMarsterPage) {
+  CFX_PtrArray tabParams;
+  CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
+  while (pSearchItem) {
+    if (!pSearchItem->IsContentLayoutItem()) {
+      bContentArea = TRUE;
+      pSearchItem = sIterator->MoveToNext();
+      continue;
+    }
+    if (bMarsterPage && bContentArea) {
+      break;
+    }
+    if (bMarsterPage || bContentArea) {
+      CXFA_FFWidget* hWidget = GetWidget(pSearchItem);
+      if (!hWidget) {
+        pSearchItem = sIterator->MoveToNext();
+        continue;
+      }
+      if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) {
+        bCurrentItem = TRUE;
+        break;
+      }
+      CXFA_TabParam* pParam = new CXFA_TabParam;
+      pParam->m_pWidget = hWidget;
+      tabParams.Add(pParam);
+      if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetClassID(), TRUE)) {
+        OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem,
+                       bContentArea, bMarsterPage);
+      }
+    }
+    if (bCurrentItem) {
+      pSearchItem = sIterator->GetCurrent();
+      bCurrentItem = FALSE;
+    } else {
+      pSearchItem = sIterator->MoveToNext();
+    }
+  }
+  int32_t iChildren = tabParams.GetSize();
+  if (iChildren > 1) {
+    FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*),
+                XFA_TabOrderWidgetComparator);
+  }
+  for (int32_t iStart = 0; iStart < iChildren; iStart++) {
+    CXFA_TabParam* pParam = (CXFA_TabParam*)tabParams[iStart];
+    pContainer->m_Children.Add(pParam->m_pWidget);
+    if (pParam->m_Children.GetSize() > 0) {
+      pContainer->m_Children.Append(pParam->m_Children);
+    }
+    delete pParam;
+  }
+  tabParams.RemoveAll();
+}
+void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
+    CXFA_WidgetArray& WidgetArray) {
+  CXFA_LayoutItemIterator sIterator;
+  sIterator.Init(m_pPageView);
+  CXFA_TabParam* pParam = new CXFA_TabParam;
+  FX_BOOL bCurrentItem = FALSE;
+  FX_BOOL bContentArea = FALSE;
+  OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea);
+  if (pParam->m_Children.GetSize() > 0) {
+    WidgetArray.Append(pParam->m_Children);
+  }
+  sIterator.Reset();
+  bCurrentItem = FALSE;
+  bContentArea = FALSE;
+  pParam->m_Children.RemoveAll();
+  OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea, TRUE);
+  if (pParam->m_Children.GetSize() > 0) {
+    WidgetArray.Append(pParam->m_Children);
+  }
+  delete pParam;
+}
+CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
+    CXFA_LayoutItem* pLayoutItem) {
+  if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
+    if (!pWidget->IsLoaded() &&
+        (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
+      pWidget->LoadWidget();
+    }
+    return pWidget;
+  }
+  return NULL;
+}
diff --git a/xfa/fxfa/app/xfa_ffpageview.h b/xfa/fxfa/app/xfa_ffpageview.h
new file mode 100644
index 0000000..b68e828
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpageview.h
@@ -0,0 +1,111 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFPAGEVIEW_H_
+#define XFA_FXFA_APP_XFA_FFPAGEVIEW_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+
+class CXFA_FFWidget;
+class CXFA_FFDocView;
+class CXFA_FFPageView : public CXFA_ContainerLayoutItem, public IXFA_PageView {
+ public:
+  CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
+  ~CXFA_FFPageView() override;
+
+  // IFXA_PageView:
+  IXFA_DocView* GetDocView() override;
+  int32_t GetPageViewIndex() override;
+  void GetPageViewRect(CFX_RectF& rtPage) override;
+  void GetDisplayMatrix(CFX_Matrix& mt,
+                        const CFX_Rect& rtDisp,
+                        int32_t iRotate) override;
+  int32_t LoadPageView(IFX_Pause* pPause = NULL) override;
+  void UnloadPageView() override;
+  IXFA_Widget* GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) override;
+  IXFA_WidgetIterator* CreateWidgetIterator(
+      FX_DWORD dwTraverseWay = XFA_TRAVERSEWAY_Form,
+      FX_DWORD dwWidgetFilter = XFA_WIDGETFILTER_Visible |
+                                XFA_WIDGETFILTER_Viewable |
+                                XFA_WIDGETFILTER_AllType) override;
+
+  FX_BOOL IsPageViewLoaded();
+
+ protected:
+  CXFA_FFDocView* m_pDocView;
+  FX_BOOL m_bLoaded;
+};
+typedef CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+                                  CXFA_TraverseStrategy_LayoutItem>
+    CXFA_LayoutItemIterator;
+class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter);
+  virtual ~CXFA_FFPageWidgetIterator();
+  virtual void Release() { delete this; }
+
+  virtual void Reset();
+  virtual IXFA_Widget* MoveToFirst();
+  virtual IXFA_Widget* MoveToLast();
+  virtual IXFA_Widget* MoveToNext();
+  virtual IXFA_Widget* MoveToPrevious();
+  virtual IXFA_Widget* GetCurrentWidget();
+  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
+
+ protected:
+  IXFA_Widget* GetWidget(CXFA_LayoutItem* pLayoutItem);
+  CXFA_FFPageView* m_pPageView;
+  IXFA_Widget* m_hCurWidget;
+  FX_DWORD m_dwFilter;
+  FX_BOOL m_bIgnorerelevant;
+  CXFA_LayoutItemIterator m_sIterator;
+};
+typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
+class CXFA_TabParam {
+ public:
+  CXFA_TabParam() : m_pWidget(NULL) {}
+  ~CXFA_TabParam() {}
+
+  CXFA_FFWidget* m_pWidget;
+  CXFA_WidgetArray m_Children;
+};
+class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
+ public:
+  CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
+                                    FX_DWORD dwFilter);
+  virtual ~CXFA_FFTabOrderPageWidgetIterator();
+
+  virtual void Release();
+
+  virtual void Reset();
+  virtual IXFA_Widget* MoveToFirst();
+  virtual IXFA_Widget* MoveToLast();
+  virtual IXFA_Widget* MoveToNext();
+  virtual IXFA_Widget* MoveToPrevious();
+  virtual IXFA_Widget* GetCurrentWidget();
+  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
+
+ protected:
+  CXFA_WidgetArray m_TabOrderWidgetArray;
+  CXFA_FFPageView* m_pPageView;
+  FX_DWORD m_dwFilter;
+  int32_t m_iCurWidget;
+  FX_BOOL m_bIgnorerelevant;
+  CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
+  CXFA_FFWidget* FindWidgetByName(const CFX_WideStringC& wsWidgetName,
+                                  CXFA_FFWidget* pRefWidget);
+  void CreateTabOrderWidgetArray();
+  void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
+  CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
+  void OrderContainer(CXFA_LayoutItemIterator* sIterator,
+                      CXFA_LayoutItem* pContainerItem,
+                      CXFA_TabParam* pContainer,
+                      FX_BOOL& bCurrentItem,
+                      FX_BOOL& bContentArea,
+                      FX_BOOL bMarsterPage = FALSE);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFPAGEVIEW_H_
diff --git a/xfa/fxfa/app/xfa_ffpath.cpp b/xfa/fxfa/app/xfa_ffpath.cpp
new file mode 100644
index 0000000..f082232
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpath.cpp
@@ -0,0 +1,159 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffpath.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fxgraphics/fx_graphics.h"
+
+CXFA_FFLine::CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFDraw(pPageView, pDataAcc) {}
+CXFA_FFLine::~CXFA_FFLine() {}
+void CXFA_FFLine::GetRectFromHand(CFX_RectF& rect,
+                                  int32_t iHand,
+                                  FX_FLOAT fLineWidth) {
+  FX_FLOAT fHalfWidth = fLineWidth / 2.0f;
+  if (rect.height < 1.0f) {
+    switch (iHand) {
+      case XFA_ATTRIBUTEENUM_Left:
+        rect.top -= fHalfWidth;
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        rect.top += fHalfWidth;
+    }
+  } else if (rect.width < 1.0f) {
+    switch (iHand) {
+      case XFA_ATTRIBUTEENUM_Left:
+        rect.left += fHalfWidth;
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        rect.left += fHalfWidth;
+        break;
+    }
+  } else {
+    switch (iHand) {
+      case XFA_ATTRIBUTEENUM_Left:
+        rect.Inflate(fHalfWidth, fHalfWidth);
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        rect.Deflate(fHalfWidth, fHalfWidth);
+        break;
+    }
+  }
+}
+void CXFA_FFLine::RenderWidget(CFX_Graphics* pGS,
+                               CFX_Matrix* pMatrix,
+                               FX_DWORD dwStatus,
+                               int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CXFA_Value value = m_pDataAcc->GetFormValue();
+  if (!value) {
+    return;
+  }
+  CXFA_Line lineObj = value.GetLine();
+  FX_ARGB lineColor = 0xFF000000;
+  int32_t iStrokeType = 0;
+  FX_FLOAT fLineWidth = 1.0f;
+  FX_BOOL bSlope = lineObj.GetSlop();
+  int32_t iCap = 0;
+  CXFA_Edge edge = lineObj.GetEdge();
+  if (edge) {
+    if (edge.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
+      return;
+    }
+    lineColor = edge.GetColor();
+    iStrokeType = edge.GetStrokeType();
+    fLineWidth = edge.GetThickness();
+    iCap = edge.GetCapType();
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CFX_RectF rtLine;
+  GetRectWithoutRotate(rtLine);
+  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+    XFA_RectWidthoutMargin(rtLine, mgWidget);
+  }
+  GetRectFromHand(rtLine, lineObj.GetHand(), fLineWidth);
+  CFX_Path linePath;
+  linePath.Create();
+  if (bSlope && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f) {
+    linePath.AddLine(rtLine.right(), rtLine.top, rtLine.left, rtLine.bottom());
+  } else {
+    linePath.AddLine(rtLine.left, rtLine.top, rtLine.right(), rtLine.bottom());
+  }
+  CFX_Color color(lineColor);
+  pGS->SaveGraphState();
+  pGS->SetLineWidth(fLineWidth, TRUE);
+  XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap);
+  pGS->SetStrokeColor(&color);
+  pGS->SetLineCap(XFA_LineCapToFXGE(iCap));
+  pGS->StrokePath(&linePath, &mtRotate);
+  pGS->RestoreGraphState();
+}
+CXFA_FFArc::CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFDraw(pPageView, pDataAcc) {}
+CXFA_FFArc::~CXFA_FFArc() {}
+void CXFA_FFArc::RenderWidget(CFX_Graphics* pGS,
+                              CFX_Matrix* pMatrix,
+                              FX_DWORD dwStatus,
+                              int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CXFA_Value value = m_pDataAcc->GetFormValue();
+  if (!value) {
+    return;
+  }
+  CXFA_Arc arcObj = value.GetArc();
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CFX_RectF rtArc;
+  GetRectWithoutRotate(rtArc);
+  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+    XFA_RectWidthoutMargin(rtArc, mgWidget);
+  }
+  DrawBorder(pGS, arcObj, rtArc, &mtRotate);
+}
+CXFA_FFRectangle::CXFA_FFRectangle(CXFA_FFPageView* pPageView,
+                                   CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFDraw(pPageView, pDataAcc) {}
+CXFA_FFRectangle::~CXFA_FFRectangle() {}
+void CXFA_FFRectangle::RenderWidget(CFX_Graphics* pGS,
+                                    CFX_Matrix* pMatrix,
+                                    FX_DWORD dwStatus,
+                                    int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CXFA_Value value = m_pDataAcc->GetFormValue();
+  if (!value) {
+    return;
+  }
+  CXFA_Rectangle rtObj = value.GetRectangle();
+  CFX_RectF rect;
+  GetRectWithoutRotate(rect);
+  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+    XFA_RectWidthoutMargin(rect, mgWidget);
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  DrawBorder(pGS, rtObj, rect, &mtRotate);
+}
diff --git a/xfa/fxfa/app/xfa_ffpath.h b/xfa/fxfa/app/xfa_ffpath.h
new file mode 100644
index 0000000..2b2c40d
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpath.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFPATH_H_
+#define XFA_FXFA_APP_XFA_FFPATH_H_
+
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+
+class CXFA_FFLine : public CXFA_FFDraw {
+ public:
+  CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFLine();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+
+ private:
+  void GetRectFromHand(CFX_RectF& rect, int32_t iHand, FX_FLOAT fLineWidth);
+};
+class CXFA_FFArc : public CXFA_FFDraw {
+ public:
+  CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFArc();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+};
+class CXFA_FFRectangle : public CXFA_FFDraw {
+ public:
+  CXFA_FFRectangle(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFRectangle();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFPATH_H_
diff --git a/xfa/fxfa/app/xfa_ffpushbutton.cpp b/xfa/fxfa/app/xfa_ffpushbutton.cpp
new file mode 100644
index 0000000..718853e
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpushbutton.cpp
@@ -0,0 +1,249 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffpushbutton.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_ffwidgetacc.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/include/fwl/core/fwl_widgetmgr.h"
+#include "xfa/include/fwl/lightwidget/pushbutton.h"
+
+CXFA_FFPushButton::CXFA_FFPushButton(CXFA_FFPageView* pPageView,
+                                     CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc),
+      m_pRolloverTextLayout(NULL),
+      m_pDownTextLayout(NULL),
+      m_pDownProvider(NULL),
+      m_pRollProvider(NULL),
+      m_pOldDelegate(NULL) {}
+CXFA_FFPushButton::~CXFA_FFPushButton() {
+  CXFA_FFPushButton::UnloadWidget();
+}
+void CXFA_FFPushButton::RenderWidget(CFX_Graphics* pGS,
+                                     CFX_Matrix* pMatrix,
+                                     FX_DWORD dwStatus,
+                                     int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  RenderHighlightCaption(pGS, &mtRotate);
+  CFX_RectF rtWidget;
+  GetRectWithoutRotate(rtWidget);
+  CFX_Matrix mt;
+  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
+  mt.Concat(mtRotate);
+  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
+                                                 pGS, &mt);
+}
+FX_BOOL CXFA_FFPushButton::LoadWidget() {
+  FXSYS_assert(m_pNormalWidget == NULL);
+  CFWL_PushButton* pPushButton = CFWL_PushButton::Create();
+  if (pPushButton) {
+    pPushButton->Initialize();
+  }
+  m_pOldDelegate = pPushButton->SetDelegate(this);
+  m_pNormalWidget = (CFWL_Widget*)pPushButton;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pNormalWidget->LockUpdate();
+  UpdateWidgetProperty();
+  LoadHighlightCaption();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFPushButton::UpdateWidgetProperty() {
+  FX_DWORD dwStyleEx = 0;
+  switch (m_pDataAcc->GetButtonHighlight()) {
+    case XFA_ATTRIBUTEENUM_Inverted:
+      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteInverted;
+      break;
+    case XFA_ATTRIBUTEENUM_Outline:
+      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteOutLine;
+      break;
+    case XFA_ATTRIBUTEENUM_Push:
+      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HilitePush;
+      break;
+    default:
+      break;
+  }
+  m_pNormalWidget->ModifyStylesEx(dwStyleEx, 0xFFFFFFFF);
+}
+void CXFA_FFPushButton::UnloadWidget() {
+  if (m_pRolloverTextLayout) {
+    delete m_pRolloverTextLayout;
+    m_pRolloverTextLayout = NULL;
+  }
+  if (m_pDownTextLayout) {
+    delete m_pDownTextLayout;
+    m_pDownTextLayout = NULL;
+  }
+  if (m_pDownProvider) {
+    delete m_pDownProvider;
+    m_pDownProvider = NULL;
+  }
+  if (m_pRollProvider) {
+    delete m_pRollProvider;
+    m_pRollProvider = NULL;
+  }
+  CXFA_FFField::UnloadWidget();
+}
+FX_BOOL CXFA_FFPushButton::PerformLayout() {
+  CXFA_FFWidget::PerformLayout();
+  CFX_RectF rtWidget;
+  GetRectWithoutRotate(rtWidget);
+  m_rtUI = rtWidget;
+  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+    XFA_RectWidthoutMargin(rtWidget, mgWidget);
+  }
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height);
+  if (CXFA_Margin mgCap = caption.GetMargin()) {
+    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
+  }
+  LayoutHighlightCaption();
+  SetFWLRect();
+  if (m_pNormalWidget) {
+    m_pNormalWidget->Update();
+  }
+  return TRUE;
+}
+FX_FLOAT CXFA_FFPushButton::GetLineWidth() {
+  CXFA_Border border = m_pDataAcc->GetBorder();
+  if (border && border.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
+    CXFA_Edge edge = border.GetEdge(0);
+    return edge.GetThickness();
+  }
+  return 0;
+}
+FX_ARGB CXFA_FFPushButton::GetLineColor() {
+  return 0xFF000000;
+}
+FX_ARGB CXFA_FFPushButton::GetFillColor() {
+  return 0xFFFFFFFF;
+}
+void CXFA_FFPushButton::LoadHighlightCaption() {
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
+    {
+      CFX_WideString wsRollover;
+      FX_BOOL bRichText;
+      if (m_pDataAcc->GetButtonRollover(wsRollover, bRichText)) {
+        if (m_pRollProvider == NULL) {
+          m_pRollProvider =
+              new CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Rollover);
+        }
+        m_pRolloverTextLayout = new CXFA_TextLayout(m_pRollProvider);
+      }
+      CFX_WideString wsDown;
+      if (m_pDataAcc->GetButtonDown(wsDown, bRichText)) {
+        if (m_pDownProvider == NULL) {
+          m_pDownProvider =
+              new CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Down);
+        }
+        m_pDownTextLayout = new CXFA_TextLayout(m_pDownProvider);
+      }
+    }
+  }
+}
+void CXFA_FFPushButton::LayoutHighlightCaption() {
+  CFX_SizeF sz(m_rtCaption.width, m_rtCaption.height);
+  LayoutCaption();
+  if (m_pRolloverTextLayout) {
+    m_pRolloverTextLayout->Layout(sz);
+  }
+  if (m_pDownTextLayout) {
+    m_pDownTextLayout->Layout(sz);
+  }
+}
+void CXFA_FFPushButton::RenderHighlightCaption(CFX_Graphics* pGS,
+                                               CFX_Matrix* pMatrix) {
+  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
+  CXFA_Caption caption = m_pDataAcc->GetCaption();
+  if (caption && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
+    CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
+    CFX_RectF rtWidget;
+    GetRectWithoutRotate(rtWidget);
+    CFX_RectF rtClip = m_rtCaption;
+    rtClip.Intersect(rtWidget);
+    CFX_Matrix mt;
+    mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top);
+    if (pMatrix) {
+      pMatrix->TransformRect(rtClip);
+      mt.Concat(*pMatrix);
+    }
+    {
+      FX_DWORD dwState = m_pNormalWidget->GetStates();
+      if (m_pDownTextLayout && (dwState & FWL_STATE_PSB_Pressed) &&
+          (dwState & FWL_STATE_PSB_Hovered)) {
+        if (m_pDownTextLayout->DrawString(pRenderDevice, mt, rtClip)) {
+          return;
+        }
+      } else if (m_pRolloverTextLayout && (dwState & FWL_STATE_PSB_Hovered)) {
+        if (m_pRolloverTextLayout->DrawString(pRenderDevice, mt, rtClip)) {
+          return;
+        }
+      }
+    }
+    if (pCapTextLayout) {
+      pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
+    }
+  }
+}
+int32_t CXFA_FFPushButton::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFPushButton::OnProcessEvent(CFWL_Event* pEvent) {
+  m_pOldDelegate->OnProcessEvent(pEvent);
+  return CXFA_FFField::OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFPushButton::OnDrawWidget(CFX_Graphics* pGraphics,
+                                        const CFX_Matrix* pMatrix) {
+  if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HiliteInverted) {
+    if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
+        (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) {
+      CFX_RectF rtFill;
+      m_pNormalWidget->GetWidgetRect(rtFill);
+      rtFill.left = rtFill.top = 0;
+      FX_FLOAT fLineWith = GetLineWidth();
+      rtFill.Deflate(fLineWith, fLineWith);
+      CFX_Color cr(FXARGB_MAKE(128, 128, 255, 255));
+      pGraphics->SetFillColor(&cr);
+      CFX_Path path;
+      path.Create();
+      path.AddRectangle(rtFill.left, rtFill.top, rtFill.width, rtFill.height);
+      pGraphics->FillPath(&path, FXFILL_WINDING, (CFX_Matrix*)pMatrix);
+    }
+  } else if (m_pNormalWidget->GetStylesEx() &
+             XFA_FWL_PSBSTYLEEXT_HiliteOutLine) {
+    if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
+        (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) {
+      FX_FLOAT fLineWidth = GetLineWidth();
+      CFX_Color cr(FXARGB_MAKE(255, 128, 255, 255));
+      pGraphics->SetStrokeColor(&cr);
+      pGraphics->SetLineWidth(fLineWidth);
+      CFX_Path path;
+      path.Create();
+      CFX_RectF rect;
+      m_pNormalWidget->GetWidgetRect(rect);
+      path.AddRectangle(0, 0, rect.width, rect.height);
+      pGraphics->StrokePath(&path, (CFX_Matrix*)pMatrix);
+    }
+  } else if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HilitePush) {
+  }
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fxfa/app/xfa_ffpushbutton.h b/xfa/fxfa/app/xfa_ffpushbutton.h
new file mode 100644
index 0000000..39f6bd4
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffpushbutton.h
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFPUSHBUTTON_H_
+#define XFA_FXFA_APP_XFA_FFPUSHBUTTON_H_
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+
+#define XFA_FWL_PSBSTYLEEXT_HiliteNone (0L << 0)
+#define XFA_FWL_PSBSTYLEEXT_HiliteInverted (1L << 0)
+#define XFA_FWL_PSBSTYLEEXT_HilitePush (2L << 0)
+#define XFA_FWL_PSBSTYLEEXT_HiliteOutLine (4L << 0)
+
+class CXFA_TextProvider;
+
+class CXFA_FFPushButton : public CXFA_FFField {
+ public:
+  CXFA_FFPushButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFPushButton();
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL LoadWidget();
+  virtual void UnloadWidget();
+  virtual FX_BOOL PerformLayout();
+  virtual void UpdateWidgetProperty();
+  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix = NULL);
+
+ protected:
+  void LoadHighlightCaption();
+  void LayoutHighlightCaption();
+  void RenderHighlightCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL);
+  FX_FLOAT GetLineWidth();
+  FX_ARGB GetLineColor();
+  FX_ARGB GetFillColor();
+  CXFA_TextLayout* m_pRolloverTextLayout;
+  CXFA_TextLayout* m_pDownTextLayout;
+  CXFA_TextProvider* m_pDownProvider;
+  CXFA_TextProvider* m_pRollProvider;
+  IFWL_WidgetDelegate* m_pOldDelegate;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFPUSHBUTTON_H_
diff --git a/xfa/fxfa/app/xfa_ffsignature.cpp b/xfa/fxfa/app/xfa_ffsignature.cpp
new file mode 100644
index 0000000..96907c5
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffsignature.cpp
@@ -0,0 +1,120 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffsignature.h"
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+CXFA_FFSignature::CXFA_FFSignature(CXFA_FFPageView* pPageView,
+                                   CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc) {}
+CXFA_FFSignature::~CXFA_FFSignature() {}
+FX_BOOL CXFA_FFSignature::LoadWidget() {
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFSignature::RenderWidget(CFX_Graphics* pGS,
+                                    CFX_Matrix* pMatrix,
+                                    FX_DWORD dwStatus,
+                                    int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CFX_Matrix mtRotate;
+  GetRotateMatrix(mtRotate);
+  if (pMatrix) {
+    mtRotate.Concat(*pMatrix);
+  }
+  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
+  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
+  RenderCaption(pGS, &mtRotate);
+  DrawHighlight(pGS, &mtRotate, dwStatus, FALSE);
+  CFX_RectF rtWidget = m_rtUI;
+  IXFA_DocProvider* pDocProvider = m_pDataAcc->GetDoc()->GetDocProvider();
+  FXSYS_assert(pDocProvider);
+  pDocProvider->RenderCustomWidget(this, pGS, &mtRotate, rtWidget);
+}
+FX_BOOL CXFA_FFSignature::OnMouseEnter() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnMouseExit() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnLButtonDown(FX_DWORD dwFlags,
+                                        FX_FLOAT fx,
+                                        FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnLButtonUp(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnLButtonDblClk(FX_DWORD dwFlags,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnMouseMove(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnMouseWheel(FX_DWORD dwFlags,
+                                       int16_t zDelta,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnRButtonDown(FX_DWORD dwFlags,
+                                        FX_FLOAT fx,
+                                        FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnRButtonUp(FX_DWORD dwFlags,
+                                      FX_FLOAT fx,
+                                      FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnRButtonDblClk(FX_DWORD dwFlags,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFSignature::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_DWORD CXFA_FFSignature::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  if (m_pNormalWidget) {
+    FX_FLOAT ffx = fx, ffy = fy;
+    FWLToClient(ffx, ffy);
+    FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy);
+    if (dwWidgetHit != FWL_WGTHITTEST_Unknown) {
+      return FWL_WGTHITTEST_Client;
+    }
+  }
+  CFX_RectF rtBox;
+  GetRectWithoutRotate(rtBox);
+  if (!rtBox.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Unknown;
+  }
+  if (m_rtCaption.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Titlebar;
+  }
+  return FWL_WGTHITTEST_Client;
+}
+FX_BOOL CXFA_FFSignature::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
diff --git a/xfa/fxfa/app/xfa_ffsignature.h b/xfa/fxfa/app/xfa_ffsignature.h
new file mode 100644
index 0000000..f976fed
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffsignature.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFSIGNATURE_H_
+#define XFA_FXFA_APP_XFA_FFSIGNATURE_H_
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+
+class CXFA_FFSignature final : public CXFA_FFField {
+ public:
+  CXFA_FFSignature(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFSignature();
+
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL LoadWidget();
+  virtual FX_BOOL OnMouseEnter();
+  virtual FX_BOOL OnMouseExit();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
+                               int16_t zDelta,
+                               FX_FLOAT fx,
+                               FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+
+  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
+  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFSIGNATURE_H_
diff --git a/xfa/fxfa/app/xfa_ffsubform.cpp b/xfa/fxfa/app/xfa_ffsubform.cpp
new file mode 100644
index 0000000..aebbb08
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffsubform.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffsubform.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+CXFA_FFSubForm::CXFA_FFSubForm(CXFA_FFPageView* pPageView,
+                               CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFWidget(pPageView, pDataAcc) {}
+CXFA_FFSubForm::~CXFA_FFSubForm() {}
diff --git a/xfa/fxfa/app/xfa_ffsubform.h b/xfa/fxfa/app/xfa_ffsubform.h
new file mode 100644
index 0000000..e436911
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffsubform.h
@@ -0,0 +1,19 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFSUBFORM_H_
+#define XFA_FXFA_APP_XFA_FFSUBFORM_H_
+
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+class CXFA_FFSubForm : public CXFA_FFWidget {
+ public:
+  CXFA_FFSubForm(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFSubForm();
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFSUBFORM_H_
diff --git a/xfa/fxfa/app/xfa_fftext.cpp b/xfa/fxfa/app/xfa_fftext.cpp
new file mode 100644
index 0000000..aba8d16
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fftext.cpp
@@ -0,0 +1,179 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fftext.h"
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/include/fwl/core/fwl_widgetdef.h"
+#include "xfa/include/fxgraphics/fx_graphics.h"
+
+CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFDraw(pPageView, pDataAcc) {}
+CXFA_FFText::~CXFA_FFText() {}
+void CXFA_FFText::RenderWidget(CFX_Graphics* pGS,
+                               CFX_Matrix* pMatrix,
+                               FX_DWORD dwStatus,
+                               int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  {
+    CFX_Matrix mtRotate;
+    GetRotateMatrix(mtRotate);
+    if (pMatrix) {
+      mtRotate.Concat(*pMatrix);
+    }
+    CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
+    CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
+    if (pTextLayout) {
+      CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
+      CFX_RectF rtText;
+      GetRectWithoutRotate(rtText);
+      if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+        CXFA_LayoutItem* pItem = this;
+        if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
+          XFA_RectWidthoutMargin(rtText, mgWidget);
+        } else {
+          FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0;
+          mgWidget.GetLeftInset(fLeftInset);
+          mgWidget.GetRightInset(fRightInset);
+          if (pItem->GetPrev() == NULL) {
+            mgWidget.GetTopInset(fTopInset);
+          } else if (pItem->GetNext() == NULL) {
+            mgWidget.GetBottomInset(fBottomInset);
+          }
+          rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
+        }
+      }
+      CFX_Matrix mt;
+      mt.Set(1, 0, 0, 1, rtText.left, rtText.top);
+      CFX_RectF rtClip = rtText;
+      mtRotate.TransformRect(rtClip);
+      mt.Concat(mtRotate);
+      pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex());
+    }
+  }
+}
+FX_BOOL CXFA_FFText::IsLoaded() {
+  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
+  return pTextLayout && !pTextLayout->m_bHasBlock;
+}
+FX_BOOL CXFA_FFText::PerformLayout() {
+  CXFA_FFDraw::PerformLayout();
+  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
+  if (!pTextLayout) {
+    return FALSE;
+  }
+  if (!pTextLayout->m_bHasBlock) {
+    return TRUE;
+  }
+  pTextLayout->m_Blocks.RemoveAll();
+  CXFA_LayoutItem* pItem = this;
+  if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
+    return TRUE;
+  }
+  pItem = pItem->GetFirst();
+  while (pItem) {
+    CFX_RectF rtText;
+    pItem->GetRect(rtText);
+    if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
+      if (pItem->GetPrev() == NULL) {
+        FX_FLOAT fTopInset;
+        mgWidget.GetTopInset(fTopInset);
+        rtText.height -= fTopInset;
+      } else if (pItem->GetNext() == NULL) {
+        FX_FLOAT fBottomInset;
+        mgWidget.GetBottomInset(fBottomInset);
+        rtText.height -= fBottomInset;
+      }
+    }
+    pTextLayout->ItemBlocks(rtText, pItem->GetIndex());
+    pItem = pItem->GetNext();
+  }
+  pTextLayout->m_bHasBlock = FALSE;
+  return TRUE;
+}
+FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rtBox;
+  GetRectWithoutRotate(rtBox);
+  if (!rtBox.Contains(fx, fy)) {
+    return FALSE;
+  }
+  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
+  if (NULL == wsURLContent) {
+    return FALSE;
+  }
+  SetButtonDown(TRUE);
+  return TRUE;
+}
+FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rtBox;
+  GetRectWithoutRotate(rtBox);
+  if (!rtBox.Contains(fx, fy)) {
+    return FALSE;
+  }
+  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
+  if (NULL == wsURLContent) {
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  if (!IsButtonDown()) {
+    return FALSE;
+  }
+  SetButtonDown(FALSE);
+  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
+  if (NULL == wsURLContent) {
+    return FALSE;
+  }
+  CXFA_FFDoc* pDoc = GetDoc();
+  pDoc->GetDocProvider()->GotoURL(pDoc, CFX_WideStringC(wsURLContent), FALSE);
+  return TRUE;
+}
+FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rtBox;
+  GetRectWithoutRotate(rtBox);
+  if (!rtBox.Contains(fx, fy)) {
+    return FWL_WGTHITTEST_Unknown;
+  }
+  if (!GetLinkURLAtPoint(fx, fy)) {
+    return FWL_WGTHITTEST_Unknown;
+  }
+  return FWL_WGTHITTEST_HyperLink;
+}
+const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
+  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
+  if (NULL == pTextLayout) {
+    return NULL;
+  }
+  FX_FLOAT x(fx), y(fy);
+  FWLToClient(x, y);
+  const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines();
+  int32_t iCount = pPieceLines->GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i);
+    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
+    for (int32_t j = 0; j < iPieces; j++) {
+      XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
+      if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) {
+        return pPiece->pLinkData->GetLinkURL();
+      }
+    }
+  }
+  return NULL;
+}
+void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
+  CFX_RectF rtWidget;
+  GetRectWithoutRotate(rtWidget);
+  fx -= rtWidget.left;
+  fy -= rtWidget.top;
+}
diff --git a/xfa/fxfa/app/xfa_fftext.h b/xfa/fxfa/app/xfa_fftext.h
new file mode 100644
index 0000000..edf12f5
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fftext.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFTEXT_H_
+#define XFA_FXFA_APP_XFA_FFTEXT_H_
+
+#include "xfa/fxfa/app/xfa_ffdraw.h"
+
+class CXFA_FFText : public CXFA_FFDraw {
+ public:
+  CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFText();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+  virtual FX_BOOL IsLoaded();
+  virtual FX_BOOL PerformLayout();
+
+ private:
+  virtual const FX_WCHAR* GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy);
+  void FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFTEXT_H_
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
new file mode 100644
index 0000000..c35fe58
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -0,0 +1,796 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fftextedit.h"
+
+#include <vector>
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/lightwidget/datetimepicker.h"
+#include "xfa/include/fwl/lightwidget/edit.h"
+
+CXFA_FFTextEdit::CXFA_FFTextEdit(CXFA_FFPageView* pPageView,
+                                 CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
+CXFA_FFTextEdit::~CXFA_FFTextEdit() {
+  if (m_pNormalWidget) {
+    IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+    IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+    pNoteDriver->UnregisterEventTarget(pWidget);
+  }
+}
+FX_BOOL CXFA_FFTextEdit::LoadWidget() {
+  CFWL_Edit* pFWLEdit = CFWL_Edit::Create();
+  pFWLEdit->Initialize();
+  m_pNormalWidget = pFWLEdit;
+  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  UpdateWidgetProperty();
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
+  pFWLEdit->SetText(wsText);
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFTextEdit::UpdateWidgetProperty() {
+  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
+  if (!pWidget) {
+    return;
+  }
+  FX_DWORD dwStyle = 0;
+  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus |
+                             FWL_STYLEEXT_EDT_OuterScrollbar |
+                             FWL_STYLEEXT_EDT_LastLineHeight;
+  dwExtendedStyle |= UpdateUIProperty();
+  if (m_pDataAcc->IsMultiLine()) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine | FWL_STYLEEXT_EDT_WantReturn;
+    if (m_pDataAcc->GetVerticalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+      dwStyle |= FWL_WGTSTYLE_VScroll;
+      dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoVScroll;
+    }
+  } else if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine;
+  }
+  XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
+  int32_t iMaxChars = m_pDataAcc->GetMaxChars(eType);
+  if (eType == XFA_ELEMENT_ExData) {
+    iMaxChars = 0;
+  }
+  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
+  if (iNumCells == 0) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
+    pWidget->SetLimit(iMaxChars > 0 ? iMaxChars : 1);
+  } else if (iNumCells > 0) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
+    pWidget->SetLimit(iNumCells);
+  } else {
+    pWidget->SetLimit(iMaxChars);
+  }
+  dwExtendedStyle |= GetAlignment();
+  m_pNormalWidget->ModifyStyles(dwStyle, 0xFFFFFFFF);
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+}
+FX_BOOL CXFA_FFTextEdit::OnLButtonDown(FX_DWORD dwFlags,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  if (!PtInActiveRect(fx, fy)) {
+    return FALSE;
+  }
+  if (!IsFocused()) {
+    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
+    UpdateFWLData();
+    AddInvalidateRect();
+  }
+  SetButtonDown(TRUE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::OnRButtonDown(FX_DWORD dwFlags,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  if (!PtInActiveRect(fx, fy)) {
+    return FALSE;
+  }
+  if (!IsFocused()) {
+    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
+    UpdateFWLData();
+    AddInvalidateRect();
+  }
+  SetButtonDown(TRUE);
+  CFWL_MsgMouse ms;
+  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown;
+  ms.m_dwFlags = dwFlags;
+  ms.m_fx = fx;
+  ms.m_fy = fy;
+  FWLToClient(ms.m_fx, ms.m_fy);
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::OnRButtonUp(FX_DWORD dwFlags,
+                                     FX_FLOAT fx,
+                                     FX_FLOAT fy) {
+  if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy))
+    return FALSE;
+
+  GetDoc()->GetDocProvider()->PopupMenu(this, CFX_PointF(fx, fy), nullptr);
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
+  m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
+  if (!IsFocused()) {
+    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
+    UpdateFWLData();
+    AddInvalidateRect();
+  }
+  CXFA_FFWidget::OnSetFocus(pOldWidget);
+  CFWL_MsgSetFocus ms;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+  CFWL_MsgKillFocus ms;
+  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pSrcTarget = NULL;
+  TranslateFWLMessage(&ms);
+  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
+  SetEditScrollOffset();
+  ProcessCommittedData();
+  UpdateFWLData();
+  AddInvalidateRect();
+  CXFA_FFWidget::OnKillFocus(pNewWidget);
+  m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::CommitData() {
+  CFX_WideString wsText;
+  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsText);
+  if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
+    m_pDataAcc->UpdateUIDisplay(this);
+    return TRUE;
+  }
+  ValidateNumberField(wsText);
+  return FALSE;
+}
+void CXFA_FFTextEdit::ValidateNumberField(const CFX_WideString& wsText) {
+  CXFA_WidgetAcc* pAcc = GetDataAcc();
+  if (pAcc && pAcc->GetUIType() == XFA_ELEMENT_NumericEdit) {
+    IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
+    if (pAppProvider) {
+      CFX_WideString wsTitle;
+      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
+      CFX_WideString wsMessage;
+      CFX_WideString wsError;
+      pAppProvider->LoadString(XFA_IDS_ValidateNumberError, wsError);
+      CFX_WideString wsSomField;
+      pAcc->GetNode()->GetSOMExpression(wsSomField);
+      wsMessage.Format(wsError, (const FX_WCHAR*)wsText,
+                       (const FX_WCHAR*)wsSomField);
+      pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
+    }
+  }
+}
+FX_BOOL CXFA_FFTextEdit::IsDataChanged() {
+  return (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) != 0;
+}
+FX_DWORD CXFA_FFTextEdit::GetAlignment() {
+  FX_DWORD dwExtendedStyle = 0;
+  if (CXFA_Para para = m_pDataAcc->GetPara()) {
+    int32_t iHorz = para.GetHorizontalAlign();
+    switch (iHorz) {
+      case XFA_ATTRIBUTEENUM_Center:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_HCenter;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_Justified;
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        break;
+      case XFA_ATTRIBUTEENUM_Radix:
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_HFar;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_HNear;
+        break;
+    }
+    int32_t iVert = para.GetVerticalAlign();
+    switch (iVert) {
+      case XFA_ATTRIBUTEENUM_Middle:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_VCenter;
+        break;
+      case XFA_ATTRIBUTEENUM_Bottom:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_VFar;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_EDT_VNear;
+        break;
+    }
+  }
+  return dwExtendedStyle;
+}
+FX_BOOL CXFA_FFTextEdit::UpdateFWLData() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
+  if (IsFocused()) {
+    eType = XFA_VALUEPICTURE_Edit;
+  }
+  FX_BOOL bUpdate = FALSE;
+  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_TextEdit &&
+      m_pDataAcc->GetNumberOfCells() < 0) {
+    XFA_ELEMENT elementType = XFA_ELEMENT_UNKNOWN;
+    int32_t iMaxChars = m_pDataAcc->GetMaxChars(elementType);
+    if (elementType == XFA_ELEMENT_ExData) {
+      iMaxChars = eType == XFA_VALUEPICTURE_Edit ? iMaxChars : 0;
+    }
+    if (((CFWL_Edit*)m_pNormalWidget)->GetLimit() != iMaxChars) {
+      ((CFWL_Edit*)m_pNormalWidget)->SetLimit(iMaxChars);
+      bUpdate = TRUE;
+    }
+  }
+  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_Barcode) {
+    int32_t nDataLen = 0;
+    if (eType == XFA_VALUEPICTURE_Edit)
+      m_pDataAcc->GetBarcodeAttribute_DataLength(nDataLen);
+    static_cast<CFWL_Edit*>(m_pNormalWidget)->SetLimit(nDataLen);
+    bUpdate = TRUE;
+  }
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, eType);
+  CFX_WideString wsOldText;
+  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsOldText);
+  if (wsText != wsOldText || (eType == XFA_VALUEPICTURE_Edit && bUpdate)) {
+    ((CFWL_Edit*)m_pNormalWidget)->SetText(wsText);
+    bUpdate = TRUE;
+  }
+  if (bUpdate) {
+    m_pNormalWidget->Update();
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_FFTextEdit::CanUndo() {
+  return ((CFWL_Edit*)m_pNormalWidget)->CanUndo();
+}
+FX_BOOL CXFA_FFTextEdit::CanRedo() {
+  return ((CFWL_Edit*)m_pNormalWidget)->CanRedo();
+}
+FX_BOOL CXFA_FFTextEdit::Undo() {
+  return ((CFWL_Edit*)m_pNormalWidget)->Undo();
+}
+FX_BOOL CXFA_FFTextEdit::Redo() {
+  return ((CFWL_Edit*)m_pNormalWidget)->Redo();
+}
+FX_BOOL CXFA_FFTextEdit::CanCopy() {
+  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
+  return nCount > 0;
+}
+FX_BOOL CXFA_FFTextEdit::CanCut() {
+  if (m_pNormalWidget->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
+    return FALSE;
+  }
+  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
+  return nCount > 0;
+}
+FX_BOOL CXFA_FFTextEdit::CanPaste() {
+  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
+}
+FX_BOOL CXFA_FFTextEdit::CanSelectAll() {
+  return ((CFWL_Edit*)m_pNormalWidget)->GetTextLength() > 0;
+}
+FX_BOOL CXFA_FFTextEdit::Copy(CFX_WideString& wsCopy) {
+  return ((CFWL_Edit*)m_pNormalWidget)->Copy(wsCopy);
+}
+FX_BOOL CXFA_FFTextEdit::Cut(CFX_WideString& wsCut) {
+  return ((CFWL_Edit*)m_pNormalWidget)->Cut(wsCut);
+}
+FX_BOOL CXFA_FFTextEdit::Paste(const CFX_WideString& wsPaste) {
+  return ((CFWL_Edit*)m_pNormalWidget)->Paste(wsPaste);
+}
+FX_BOOL CXFA_FFTextEdit::SelectAll() {
+  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->GetTextLength();
+  return ((CFWL_Edit*)m_pNormalWidget)->AddSelRange(0, nCount);
+}
+FX_BOOL CXFA_FFTextEdit::Delete() {
+  return ((CFWL_Edit*)m_pNormalWidget)->Delete();
+}
+FX_BOOL CXFA_FFTextEdit::DeSelect() {
+  return ((CFWL_Edit*)m_pNormalWidget)->ClearSelections();
+}
+FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
+    CFX_PointF pointf,
+    std::vector<CFX_ByteString>& sSuggest) {
+  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
+    return FALSE;
+  }
+  FWLToClient(pointf.x, pointf.y);
+  return ((CFWL_Edit*)m_pNormalWidget)->GetSuggestWords(pointf, sSuggest);
+}
+FX_BOOL CXFA_FFTextEdit::ReplaceSpellCheckWord(
+    CFX_PointF pointf,
+    const CFX_ByteStringC& bsReplace) {
+  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
+    return FALSE;
+  }
+  FWLToClient(pointf.x, pointf.y);
+  return ((CFWL_Edit*)m_pNormalWidget)
+      ->ReplaceSpellCheckWord(pointf, bsReplace);
+}
+void CXFA_FFTextEdit::OnTextChanged(IFWL_Widget* pWidget,
+                                    const CFX_WideString& wsChanged,
+                                    const CFX_WideString& wsPrevText) {
+  m_dwStatus |= XFA_WIDGETSTATUS_TextEditValueChanged;
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Change;
+  eParam.m_wsChange = wsChanged;
+  eParam.m_pTarget = m_pDataAcc;
+  eParam.m_wsPrevText = wsPrevText;
+  CFWL_Edit* pEdit = ((CFWL_Edit*)m_pNormalWidget);
+  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_DateTimeEdit) {
+    CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit;
+    pDateTime->GetEditText(eParam.m_wsNewText);
+    int32_t iSels = pDateTime->CountSelRanges();
+    if (iSels) {
+      eParam.m_iSelEnd = pDateTime->GetSelRange(0, eParam.m_iSelStart);
+    }
+  } else {
+    pEdit->GetText(eParam.m_wsNewText);
+    int32_t iSels = pEdit->CountSelRanges();
+    if (iSels) {
+      eParam.m_iSelEnd = pEdit->GetSelRange(0, eParam.m_iSelStart);
+    }
+  }
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
+}
+void CXFA_FFTextEdit::OnTextFull(IFWL_Widget* pWidget) {
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Full;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Full, &eParam);
+}
+
+FX_BOOL CXFA_FFTextEdit::CheckWord(const CFX_ByteStringC& sWord) {
+  if (sWord.IsEmpty() || m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
+    return TRUE;
+  }
+  return GetDoc()->GetDocProvider()->CheckWord(GetDoc(), sWord);
+}
+FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
+    const CFX_ByteStringC& sWord,
+    std::vector<CFX_ByteString>& sSuggest) {
+  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
+    return FALSE;
+  }
+  return GetDoc()->GetDocProvider()->GetSuggestWords(GetDoc(), sWord, sSuggest);
+}
+int32_t CXFA_FFTextEdit::OnProcessMessage(CFWL_Message* pMessage) {
+  return m_pOldDelegate->OnProcessMessage(pMessage);
+}
+FWL_ERR CXFA_FFTextEdit::OnProcessEvent(CFWL_Event* pEvent) {
+  CXFA_FFField::OnProcessEvent(pEvent);
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  switch (dwEventID) {
+    case FWL_EVTHASH_EDT_TextChanged: {
+      CFWL_EvtEdtTextChanged* event = (CFWL_EvtEdtTextChanged*)pEvent;
+      CFX_WideString wsChange;
+      OnTextChanged(m_pNormalWidget->GetWidget(), wsChange, event->wsPrevText);
+      break;
+    }
+    case FWL_EVTHASH_EDT_TextFull: {
+      OnTextFull(m_pNormalWidget->GetWidget());
+      break;
+    }
+    case FWL_EVTHASH_EDT_CheckWord: {
+      CFX_WideString wstr(L"FWL_EVENT_DTP_SelectChanged");
+      CFWL_EvtEdtCheckWord* event = (CFWL_EvtEdtCheckWord*)pEvent;
+      event->bCheckWord = CheckWord(event->bsWord);
+      break;
+    }
+    case FWL_EVTHASH_EDT_GetSuggestWords: {
+      CFWL_EvtEdtGetSuggestWords* event = (CFWL_EvtEdtGetSuggestWords*)pEvent;
+      event->bSuggestWords =
+          GetSuggestWords(event->bsWord, event->bsArraySuggestWords);
+      break;
+    }
+    default: {}
+  }
+  return m_pOldDelegate->OnProcessEvent(pEvent);
+}
+FWL_ERR CXFA_FFTextEdit::OnDrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
+}
+CXFA_FFNumericEdit::CXFA_FFNumericEdit(CXFA_FFPageView* pPageView,
+                                       CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
+CXFA_FFNumericEdit::~CXFA_FFNumericEdit() {}
+FX_BOOL CXFA_FFNumericEdit::LoadWidget() {
+  CFWL_Edit* pWidget = CFWL_Edit::Create();
+  pWidget->Initialize();
+  m_pNormalWidget = (CFWL_Widget*)pWidget;
+  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
+  pWidget->SetText(wsText);
+  UpdateWidgetProperty();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFNumericEdit::UpdateWidgetProperty() {
+  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
+  if (!pWidget) {
+    return;
+  }
+  FX_DWORD dwExtendedStyle =
+      FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
+      FWL_STYLEEXT_EDT_Validate | FWL_STYLEEXT_EDT_Number |
+      FWL_STYLEEXT_EDT_LastLineHeight;
+  dwExtendedStyle |= UpdateUIProperty();
+  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
+  }
+  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
+  if (iNumCells > 0) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
+    pWidget->SetLimit(iNumCells);
+  }
+  dwExtendedStyle |= GetAlignment();
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
+  }
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+}
+FWL_ERR CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event* pEvent) {
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  if (dwEventID == FWL_EVTHASH_EDT_Validate) {
+    CFWL_EvtEdtValidate* event = (CFWL_EvtEdtValidate*)pEvent;
+    CFX_WideString wsChange = event->wsInsert;
+    event->bValidate = OnValidate(m_pNormalWidget->GetWidget(), wsChange);
+    return event->bValidate;
+  } else {
+    return CXFA_FFTextEdit::OnProcessEvent(pEvent);
+  }
+}
+FX_BOOL CXFA_FFNumericEdit::OnValidate(IFWL_Widget* pWidget,
+                                       CFX_WideString& wsText) {
+  CFX_WideString wsPattern;
+  m_pDataAcc->GetPictureContent(wsPattern, XFA_VALUEPICTURE_Edit);
+  if (!wsPattern.IsEmpty()) {
+    return TRUE;
+  }
+  int32_t iLeads = 0;
+  m_pDataAcc->GetLeadDigits(iLeads);
+  int32_t iFracs = 0;
+  m_pDataAcc->GetFracDigits(iFracs);
+  CFX_WideString wsFormat;
+  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(m_pDataAcc);
+  widgetValue.GetNumbericFormat(wsFormat, iLeads, iFracs);
+  return widgetValue.ValidateNumericTemp(wsText, wsFormat,
+                                         m_pDataAcc->GetLocal());
+}
+CXFA_FFPasswordEdit::CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView,
+                                         CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
+CXFA_FFPasswordEdit::~CXFA_FFPasswordEdit() {}
+FX_BOOL CXFA_FFPasswordEdit::LoadWidget() {
+  CFWL_Edit* pWidget = CFWL_Edit::Create();
+  pWidget->Initialize();
+  m_pNormalWidget = (CFWL_Widget*)pWidget;
+  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
+  pWidget->SetText(wsText);
+  UpdateWidgetProperty();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFPasswordEdit::UpdateWidgetProperty() {
+  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
+  if (!pWidget) {
+    return;
+  }
+  FX_DWORD dwExtendedStyle =
+      FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
+      FWL_STYLEEXT_EDT_Password | FWL_STYLEEXT_EDT_LastLineHeight;
+  dwExtendedStyle |= UpdateUIProperty();
+  CFX_WideString wsPassWord;
+  m_pDataAcc->GetPasswordChar(wsPassWord);
+  if (!wsPassWord.IsEmpty()) {
+    pWidget->SetAliasChar(wsPassWord.GetAt(0));
+  }
+  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
+  }
+  dwExtendedStyle |= GetAlignment();
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+}
+CXFA_FFDateTimeEdit::CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView,
+                                         CXFA_WidgetAcc* pDataAcc)
+    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
+
+CXFA_FFDateTimeEdit::~CXFA_FFDateTimeEdit() {}
+
+FX_BOOL CXFA_FFDateTimeEdit::GetBBox(CFX_RectF& rtBox,
+                                     FX_DWORD dwStatus,
+                                     FX_BOOL bDrawFocus) {
+  if (bDrawFocus)
+    return FALSE;
+  return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
+}
+
+FX_BOOL CXFA_FFDateTimeEdit::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  CFX_RectF rtWidget;
+  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetBBox(rtWidget);
+  if (rtWidget.Contains(fx, fy)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_FFDateTimeEdit::LoadWidget() {
+  CFWL_DateTimePicker* pWidget = CFWL_DateTimePicker::Create();
+  pWidget->Initialize();
+  m_pNormalWidget = (CFWL_Widget*)pWidget;
+  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
+  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
+  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
+  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
+  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
+  m_pNormalWidget->LockUpdate();
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
+  pWidget->SetEditText(wsText);
+  if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
+    switch (value.GetChildValueClassID()) {
+      case XFA_ELEMENT_Date: {
+        if (!wsText.IsEmpty()) {
+          CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
+          CFX_Unitime date = lcValue.GetDate();
+          if ((FX_UNITIME)date != 0) {
+            pWidget->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
+          }
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  UpdateWidgetProperty();
+  m_pNormalWidget->UnlockUpdate();
+  return CXFA_FFField::LoadWidget();
+}
+void CXFA_FFDateTimeEdit::UpdateWidgetProperty() {
+  CFWL_DateTimePicker* pWidget = (CFWL_DateTimePicker*)m_pNormalWidget;
+  if (!pWidget) {
+    return;
+  }
+  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_DTP_ShortDateFormat;
+  dwExtendedStyle |= UpdateUIProperty();
+  dwExtendedStyle |= GetAlignment();
+  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
+  FX_DWORD dwEditStyles = FWL_STYLEEXT_EDT_LastLineHeight;
+  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
+  if (iNumCells > 0) {
+    dwEditStyles |= FWL_STYLEEXT_EDT_CombText;
+    pWidget->SetEditLimit(iNumCells);
+  }
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
+      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
+    dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
+  }
+  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
+    dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
+  }
+  pWidget->ModifyEditStylesEx(dwEditStyles, 0xFFFFFFFF);
+}
+FX_DWORD CXFA_FFDateTimeEdit::GetAlignment() {
+  FX_DWORD dwExtendedStyle = 0;
+  if (CXFA_Para para = m_pDataAcc->GetPara()) {
+    int32_t iHorz = para.GetHorizontalAlign();
+    switch (iHorz) {
+      case XFA_ATTRIBUTEENUM_Center:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHCenter;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditJustified;
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        break;
+      case XFA_ATTRIBUTEENUM_Radix:
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHFar;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHNear;
+        break;
+    }
+    int32_t iVert = para.GetVerticalAlign();
+    switch (iVert) {
+      case XFA_ATTRIBUTEENUM_Middle:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVCenter;
+        break;
+      case XFA_ATTRIBUTEENUM_Bottom:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVFar;
+        break;
+      default:
+        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVNear;
+        break;
+    }
+  }
+  return dwExtendedStyle;
+}
+FX_BOOL CXFA_FFDateTimeEdit::CommitData() {
+  CFX_WideString wsText;
+  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
+  if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
+    m_pDataAcc->UpdateUIDisplay(this);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_FFDateTimeEdit::UpdateFWLData() {
+  if (!m_pNormalWidget) {
+    return FALSE;
+  }
+  XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
+  if (IsFocused()) {
+    eType = XFA_VALUEPICTURE_Edit;
+  }
+  CFX_WideString wsText;
+  m_pDataAcc->GetValue(wsText, eType);
+  ((CFWL_DateTimePicker*)m_pNormalWidget)->SetEditText(wsText);
+  if (IsFocused() && !wsText.IsEmpty()) {
+    CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
+    CFX_Unitime date = lcValue.GetDate();
+    if (lcValue.IsValid()) {
+      if ((FX_UNITIME)date != 0) {
+        ((CFWL_DateTimePicker*)m_pNormalWidget)
+            ->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
+      }
+    }
+  }
+  m_pNormalWidget->Update();
+  return TRUE;
+}
+FX_BOOL CXFA_FFDateTimeEdit::IsDataChanged() {
+  if (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) {
+    return TRUE;
+  }
+  CFX_WideString wsText;
+  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
+  CFX_WideString wsOldValue;
+  m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit);
+  return wsOldValue != wsText;
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanUndo() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanUndo();
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanRedo() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanRedo();
+}
+FX_BOOL CXFA_FFDateTimeEdit::Undo() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Undo();
+}
+FX_BOOL CXFA_FFDateTimeEdit::Redo() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Redo();
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanCopy() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCopy();
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanCut() {
+  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
+    return FALSE;
+  }
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCut();
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanPaste() {
+  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
+}
+FX_BOOL CXFA_FFDateTimeEdit::CanSelectAll() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanSelectAll();
+}
+FX_BOOL CXFA_FFDateTimeEdit::Copy(CFX_WideString& wsCopy) {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Copy(wsCopy);
+}
+FX_BOOL CXFA_FFDateTimeEdit::Cut(CFX_WideString& wsCut) {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Cut(wsCut);
+}
+FX_BOOL CXFA_FFDateTimeEdit::Paste(const CFX_WideString& wsPaste) {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Paste(wsPaste);
+}
+FX_BOOL CXFA_FFDateTimeEdit::SelectAll() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->SelectAll();
+}
+FX_BOOL CXFA_FFDateTimeEdit::Delete() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Delete();
+}
+FX_BOOL CXFA_FFDateTimeEdit::DeSelect() {
+  return ((CFWL_DateTimePicker*)m_pNormalWidget)->DeSelect();
+}
+void CXFA_FFDateTimeEdit::OnSelectChanged(IFWL_Widget* pWidget,
+                                          int32_t iYear,
+                                          int32_t iMonth,
+                                          int32_t iDay) {
+  CFX_WideString wsPicture;
+  m_pDataAcc->GetPictureContent(wsPicture, XFA_VALUEPICTURE_Edit);
+  CXFA_LocaleValue date(XFA_VT_DATE, GetDoc()->GetXFADoc()->GetLocalMgr());
+  CFX_Unitime dt;
+  dt.Set(iYear, iMonth, iDay);
+  date.SetDate(dt);
+  CFX_WideString wsDate;
+  date.FormatPatterns(wsDate, wsPicture, m_pDataAcc->GetLocal(),
+                      XFA_VALUEPICTURE_Edit);
+  CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)m_pNormalWidget;
+  pDateTime->SetEditText(wsDate);
+  pDateTime->Update();
+  GetDoc()->GetDocProvider()->SetFocusWidget(GetDoc(), NULL);
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Change;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
+}
+FWL_ERR CXFA_FFDateTimeEdit::OnProcessEvent(CFWL_Event* pEvent) {
+  FX_DWORD dwEventID = pEvent->GetClassID();
+  if (dwEventID == FWL_EVTHASH_DTP_SelectChanged) {
+    CFWL_Event_DtpSelectChanged* event = (CFWL_Event_DtpSelectChanged*)pEvent;
+    OnSelectChanged(m_pNormalWidget->GetWidget(), event->iYear, event->iMonth,
+                    event->iDay);
+    return TRUE;
+  } else {
+    return CXFA_FFTextEdit::OnProcessEvent(pEvent);
+  }
+}
diff --git a/xfa/fxfa/app/xfa_fftextedit.h b/xfa/fxfa/app/xfa_fftextedit.h
new file mode 100644
index 0000000..d379ab1
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fftextedit.h
@@ -0,0 +1,138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFTEXTEDIT_H_
+#define XFA_FXFA_APP_XFA_FFTEXTEDIT_H_
+
+#include <vector>
+
+#include "xfa/fxfa/app/xfa_fffield.h"
+
+class CXFA_FFTextEdit : public CXFA_FFField {
+ public:
+  CXFA_FFTextEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  ~CXFA_FFTextEdit() override;
+
+  // CXFA_FFField:
+  FX_BOOL LoadWidget() override;
+  void UpdateWidgetProperty() override;
+  FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget) override;
+  FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget) override;
+  FX_BOOL CanUndo() override;
+  FX_BOOL CanRedo() override;
+  FX_BOOL Undo() override;
+  FX_BOOL Redo() override;
+  FX_BOOL CanCopy() override;
+  FX_BOOL CanCut() override;
+  FX_BOOL CanPaste() override;
+  FX_BOOL CanSelectAll() override;
+  FX_BOOL Copy(CFX_WideString& wsCopy) override;
+  FX_BOOL Cut(CFX_WideString& wsCut) override;
+  FX_BOOL Paste(const CFX_WideString& wsPaste) override;
+  FX_BOOL SelectAll() override;
+  FX_BOOL Delete() override;
+  FX_BOOL DeSelect() override;
+  FX_BOOL GetSuggestWords(CFX_PointF pointf,
+                          std::vector<CFX_ByteString>& sSuggest) override;
+  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
+                                const CFX_ByteStringC& bsReplace) override;
+
+  // IFWL_WidgetDelegate:
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = NULL) override;
+
+  void OnTextChanged(IFWL_Widget* pWidget,
+                     const CFX_WideString& wsChanged,
+                     const CFX_WideString& wsPrevText);
+  void OnTextFull(IFWL_Widget* pWidget);
+  FX_BOOL CheckWord(const CFX_ByteStringC& sWord);
+  FX_BOOL GetSuggestWords(const CFX_ByteStringC& sWord,
+                          std::vector<CFX_ByteString>& sSuggest);
+
+ protected:
+  FX_DWORD GetAlignment();
+  FX_BOOL CommitData() override;
+  FX_BOOL UpdateFWLData() override;
+  FX_BOOL IsDataChanged() override;
+  void ValidateNumberField(const CFX_WideString& wsText);
+
+  IFWL_WidgetDelegate* m_pOldDelegate;
+};
+
+class CXFA_FFNumericEdit : public CXFA_FFTextEdit {
+ public:
+  CXFA_FFNumericEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFNumericEdit();
+  virtual FX_BOOL LoadWidget();
+  virtual void UpdateWidgetProperty();
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+
+ public:
+  FX_BOOL OnValidate(IFWL_Widget* pWidget, CFX_WideString& wsText);
+};
+class CXFA_FFPasswordEdit : public CXFA_FFTextEdit {
+ public:
+  CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFPasswordEdit();
+  virtual FX_BOOL LoadWidget();
+  virtual void UpdateWidgetProperty();
+
+ protected:
+};
+enum XFA_DATETIMETYPE {
+  XFA_DATETIMETYPE_Date = 0,
+  XFA_DATETIMETYPE_Time,
+  XFA_DATETIMETYPE_DateAndTime
+};
+class CXFA_FFDateTimeEdit : public CXFA_FFTextEdit {
+ public:
+  CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFDateTimeEdit();
+
+  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
+                          FX_DWORD dwStatus,
+                          FX_BOOL bDrawFocus = FALSE);
+  virtual FX_BOOL LoadWidget();
+  virtual void UpdateWidgetProperty();
+
+  virtual FX_BOOL CanUndo();
+  virtual FX_BOOL CanRedo();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+
+  virtual FX_BOOL CanCopy();
+  virtual FX_BOOL CanCut();
+  virtual FX_BOOL CanPaste();
+  virtual FX_BOOL CanSelectAll();
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
+  virtual FX_BOOL Cut(CFX_WideString& wsCut);
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL SelectAll();
+  virtual FX_BOOL Delete();
+  virtual FX_BOOL DeSelect();
+
+ protected:
+  FX_DWORD GetAlignment();
+
+  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL CommitData();
+  virtual FX_BOOL UpdateFWLData();
+  virtual FX_BOOL IsDataChanged();
+
+ public:
+  void OnSelectChanged(IFWL_Widget* pWidget,
+                       int32_t iYear,
+                       int32_t iMonth,
+                       int32_t iDay);
+  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFTEXTEDIT_H_
diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
new file mode 100644
index 0000000..3153946
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidget.cpp
@@ -0,0 +1,1961 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+#include <algorithm>
+
+#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/include/fxcodec/fx_codec.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/include/fxgraphics/fx_graphics.h"
+
+CXFA_FFWidget::CXFA_FFWidget(CXFA_FFPageView* pPageView,
+                             CXFA_WidgetAcc* pDataAcc)
+    : CXFA_ContentLayoutItem(pDataAcc->GetNode()),
+      m_pPageView(pPageView),
+      m_pDataAcc(pDataAcc) {
+  m_rtWidget.Set(0, 0, 0, 0);
+}
+CXFA_FFWidget::~CXFA_FFWidget() {}
+IXFA_PageView* CXFA_FFWidget::GetPageView() {
+  return m_pPageView;
+}
+void CXFA_FFWidget::SetPageView(IXFA_PageView* pPageView) {
+  m_pPageView = static_cast<CXFA_FFPageView*>(pPageView);
+}
+void CXFA_FFWidget::GetWidgetRect(CFX_RectF& rtWidget) {
+  if ((m_dwStatus & XFA_WIDGETSTATUS_RectCached) == 0) {
+    m_dwStatus |= XFA_WIDGETSTATUS_RectCached;
+    GetRect(m_rtWidget);
+  }
+  rtWidget = m_rtWidget;
+}
+CFX_RectF CXFA_FFWidget::ReCacheWidgetRect() {
+  m_dwStatus |= XFA_WIDGETSTATUS_RectCached;
+  GetRect(m_rtWidget);
+  return m_rtWidget;
+}
+void CXFA_FFWidget::GetRectWithoutRotate(CFX_RectF& rtWidget) {
+  GetWidgetRect(rtWidget);
+  FX_FLOAT fValue = 0;
+  switch (m_pDataAcc->GetRotate()) {
+    case 90:
+      rtWidget.top = rtWidget.bottom();
+      fValue = rtWidget.width;
+      rtWidget.width = rtWidget.height;
+      rtWidget.height = fValue;
+      break;
+    case 180:
+      rtWidget.left = rtWidget.right();
+      rtWidget.top = rtWidget.bottom();
+      break;
+    case 270:
+      rtWidget.left = rtWidget.right();
+      fValue = rtWidget.width;
+      rtWidget.width = rtWidget.height;
+      rtWidget.height = fValue;
+      break;
+  }
+}
+FX_DWORD CXFA_FFWidget::GetStatus() {
+  return m_dwStatus;
+}
+
+void CXFA_FFWidget::ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved) {
+  m_dwStatus = (m_dwStatus & ~dwRemoved) | dwAdded;
+}
+
+FX_BOOL CXFA_FFWidget::GetBBox(CFX_RectF& rtBox,
+                               FX_DWORD dwStatus,
+                               FX_BOOL bDrawFocus) {
+  if (bDrawFocus)
+    return FALSE;
+  if (m_pPageView)
+    m_pPageView->GetPageViewRect(rtBox);
+  return TRUE;
+}
+
+CXFA_WidgetAcc* CXFA_FFWidget::GetDataAcc() {
+  return m_pDataAcc;
+}
+FX_BOOL CXFA_FFWidget::GetToolTip(CFX_WideString& wsToolTip) {
+  if (CXFA_Assist assist = m_pDataAcc->GetAssist()) {
+    if (CXFA_ToolTip toolTip = assist.GetToolTip()) {
+      return toolTip.GetTip(wsToolTip);
+    }
+  }
+  return GetCaptionText(wsToolTip);
+}
+void CXFA_FFWidget::RenderWidget(CFX_Graphics* pGS,
+                                 CFX_Matrix* pMatrix,
+                                 FX_DWORD dwStatus,
+                                 int32_t iRotate) {
+  if (!IsMatchVisibleStatus(dwStatus)) {
+    return;
+  }
+  CXFA_Border border = m_pDataAcc->GetBorder();
+  if (border) {
+    CFX_RectF rtBorder;
+    GetRectWithoutRotate(rtBorder);
+    CXFA_Margin margin = border.GetMargin();
+    if (margin) {
+      XFA_RectWidthoutMargin(rtBorder, margin);
+    }
+    rtBorder.Normalize();
+    DrawBorder(pGS, border, rtBorder, pMatrix);
+  }
+}
+FX_BOOL CXFA_FFWidget::IsLoaded() {
+  return m_pPageView != NULL;
+}
+FX_BOOL CXFA_FFWidget::LoadWidget() {
+  PerformLayout();
+  return TRUE;
+}
+void CXFA_FFWidget::UnloadWidget() {}
+FX_BOOL CXFA_FFWidget::PerformLayout() {
+  ReCacheWidgetRect();
+  return TRUE;
+}
+FX_BOOL CXFA_FFWidget::UpdateFWLData() {
+  return FALSE;
+}
+void CXFA_FFWidget::UpdateWidgetProperty() {}
+void CXFA_FFWidget::DrawBorder(CFX_Graphics* pGS,
+                               CXFA_Box box,
+                               const CFX_RectF& rtBorder,
+                               CFX_Matrix* pMatrix,
+                               FX_DWORD dwFlags) {
+  XFA_DrawBox(box, pGS, rtBorder, pMatrix, dwFlags);
+}
+void CXFA_FFWidget::InvalidateWidget(const CFX_RectF* pRect) {
+  if (!pRect) {
+    CFX_RectF rtWidget;
+    GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused);
+    rtWidget.Inflate(2, 2);
+    GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, rtWidget,
+                                               XFA_INVALIDATE_CurrentPage);
+  } else {
+    GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, *pRect,
+                                               XFA_INVALIDATE_CurrentPage);
+  }
+}
+void CXFA_FFWidget::AddInvalidateRect(const CFX_RectF* pRect) {
+  CFX_RectF rtWidget;
+  if (pRect) {
+    rtWidget = *pRect;
+  } else {
+    GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused);
+    rtWidget.Inflate(2, 2);
+  }
+  m_pDocView->AddInvalidateRect(m_pPageView, rtWidget);
+}
+FX_BOOL CXFA_FFWidget::GetCaptionText(CFX_WideString& wsCap) {
+  CXFA_TextLayout* pCapTextlayout = m_pDataAcc->GetCaptionTextLayout();
+  if (!pCapTextlayout) {
+    return FALSE;
+  }
+  pCapTextlayout->GetText(wsCap);
+  return TRUE;
+}
+FX_BOOL CXFA_FFWidget::IsFocused() {
+  return m_dwStatus & XFA_WIDGETSTATUS_Focused;
+}
+FX_BOOL CXFA_FFWidget::OnMouseEnter() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnMouseExit() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnLButtonDown(FX_DWORD dwFlags,
+                                     FX_FLOAT fx,
+                                     FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnLButtonDblClk(FX_DWORD dwFlags,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnMouseWheel(FX_DWORD dwFlags,
+                                    int16_t zDelta,
+                                    FX_FLOAT fx,
+                                    FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnRButtonDown(FX_DWORD dwFlags,
+                                     FX_FLOAT fx,
+                                     FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnRButtonDblClk(FX_DWORD dwFlags,
+                                       FX_FLOAT fx,
+                                       FX_FLOAT fy) {
+  return FALSE;
+}
+
+FX_BOOL CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) {
+  CXFA_FFWidget* pParent = GetParent();
+  if (pParent && !pParent->IsAncestorOf(pOldWidget)) {
+    pParent->OnSetFocus(pOldWidget);
+  }
+  m_dwStatus |= XFA_WIDGETSTATUS_Focused;
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Enter;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Enter, &eParam);
+  return TRUE;
+}
+FX_BOOL CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
+  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
+  EventKillFocus();
+  if (pNewWidget) {
+    CXFA_FFWidget* pParent = GetParent();
+    if (pParent && !pParent->IsAncestorOf(pNewWidget)) {
+      pParent->OnKillFocus(pNewWidget);
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_FFWidget::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
+  return FALSE;
+}
+FX_DWORD CXFA_FFWidget::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
+  return FALSE;
+}
+void CXFA_FFWidget::Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy) {
+  CFX_Matrix mt;
+  GetRotateMatrix(mt);
+  if (mt.IsIdentity()) {
+    return;
+  }
+  CFX_Matrix mtReverse;
+  mtReverse.SetReverse(mt);
+  mtReverse.TransformPoint(fx, fy);
+}
+static void XFA_GetMatrix(CFX_Matrix& m,
+                          int32_t iRotate,
+                          int32_t at,
+                          const CFX_RectF& rt) {
+  if (!iRotate) {
+    return;
+  }
+  FX_FLOAT fAnchorX, fAnchorY;
+  switch (at) {
+    case XFA_ATTRIBUTEENUM_TopLeft:
+      fAnchorX = rt.left, fAnchorY = rt.top;
+      break;
+    case XFA_ATTRIBUTEENUM_TopCenter:
+      fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.top;
+      break;
+    case XFA_ATTRIBUTEENUM_TopRight:
+      fAnchorX = rt.right(), fAnchorY = rt.top;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleLeft:
+      fAnchorX = rt.left, fAnchorY = (rt.top + rt.bottom()) / 2;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleCenter:
+      fAnchorX = (rt.left + rt.right()) / 2,
+      fAnchorY = (rt.top + rt.bottom()) / 2;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleRight:
+      fAnchorX = rt.right(), fAnchorY = (rt.top + rt.bottom()) / 2;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomLeft:
+      fAnchorX = rt.left, fAnchorY = rt.bottom();
+      break;
+    case XFA_ATTRIBUTEENUM_BottomCenter:
+      fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.bottom();
+      break;
+    case XFA_ATTRIBUTEENUM_BottomRight:
+      fAnchorX = rt.right(), fAnchorY = rt.bottom();
+      break;
+  }
+  switch (iRotate) {
+    case 90:
+      m.a = 0, m.b = -1, m.c = 1, m.d = 0, m.e = fAnchorX - fAnchorY,
+      m.f = fAnchorX + fAnchorY;
+      break;
+    case 180:
+      m.a = -1, m.b = 0, m.c = 0, m.d = -1, m.e = fAnchorX * 2,
+      m.f = fAnchorY * 2;
+      break;
+    case 270:
+      m.a = 0, m.b = 1, m.c = -1, m.d = 0, m.e = fAnchorX + fAnchorY,
+      m.f = fAnchorY - fAnchorX;
+      break;
+  }
+}
+void CXFA_FFWidget::GetRotateMatrix(CFX_Matrix& mt) {
+  mt.Set(1, 0, 0, 1, 0, 0);
+  int32_t iRotate = m_pDataAcc->GetRotate();
+  if (!iRotate) {
+    return;
+  }
+  CFX_RectF rcWidget;
+  GetRectWithoutRotate(rcWidget);
+  XFA_ATTRIBUTEENUM at = XFA_ATTRIBUTEENUM_TopLeft;
+  XFA_GetMatrix(mt, iRotate, at, rcWidget);
+}
+FX_BOOL CXFA_FFWidget::IsLayoutRectEmpty() {
+  CFX_RectF rtLayout;
+  GetRectWithoutRotate(rtLayout);
+  return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
+}
+CXFA_FFWidget* CXFA_FFWidget::GetParent() {
+  CXFA_Node* pParentNode =
+      m_pDataAcc->GetNode()->GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParentNode) {
+    CXFA_WidgetAcc* pParentWidgetAcc =
+        (CXFA_WidgetAcc*)pParentNode->GetWidgetData();
+    if (pParentWidgetAcc) {
+      return pParentWidgetAcc->GetNextWidget(NULL);
+    }
+  }
+  return NULL;
+}
+FX_BOOL CXFA_FFWidget::IsAncestorOf(CXFA_FFWidget* pWidget) {
+  if (!pWidget) {
+    return FALSE;
+  }
+  CXFA_Node* pNode = m_pDataAcc->GetNode();
+  CXFA_Node* pChildNode = pWidget->GetDataAcc()->GetNode();
+  while (pChildNode) {
+    if (pChildNode == pNode) {
+      return TRUE;
+    }
+    pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
+  CFX_RectF rtWidget;
+  GetWidgetRect(rtWidget);
+  if (rtWidget.Contains(fx, fy)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+CXFA_FFDocView* CXFA_FFWidget::GetDocView() {
+  return m_pDocView;
+}
+CXFA_FFDoc* CXFA_FFWidget::GetDoc() {
+  return (CXFA_FFDoc*)m_pDocView->GetDoc();
+}
+CXFA_FFApp* CXFA_FFWidget::GetApp() {
+  return GetDoc()->GetApp();
+}
+IXFA_AppProvider* CXFA_FFWidget::GetAppProvider() {
+  return GetApp()->GetAppProvider();
+}
+void CXFA_FFWidget::GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth) {
+  fMinWidth = fMaxWidth = 0;
+  FX_FLOAT fWidth = 0;
+  if (m_pDataAcc->GetWidth(fWidth)) {
+    fMinWidth = fMaxWidth = fWidth;
+  } else {
+    m_pDataAcc->GetMinWidth(fMinWidth);
+    m_pDataAcc->GetMaxWidth(fMaxWidth);
+  }
+}
+void CXFA_FFWidget::GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight) {
+  fMinHeight = fMaxHeight = 0;
+  FX_FLOAT fHeight = 0;
+  if (m_pDataAcc->GetHeight(fHeight)) {
+    fMinHeight = fMaxHeight = fHeight;
+  } else {
+    m_pDataAcc->GetMinHeight(fMinHeight);
+    m_pDataAcc->GetMaxHeight(fMaxHeight);
+  }
+}
+FX_BOOL CXFA_FFWidget::IsMatchVisibleStatus(FX_DWORD dwStatus) {
+  return m_dwStatus & XFA_WIDGETSTATUS_Visible;
+}
+void CXFA_FFWidget::EventKillFocus() {
+  if (m_dwStatus & XFA_WIDGETSTATUS_Access) {
+    m_dwStatus &= ~XFA_WIDGETSTATUS_Access;
+    return;
+  }
+  CXFA_EventParam eParam;
+  eParam.m_eType = XFA_EVENT_Exit;
+  eParam.m_pTarget = m_pDataAcc;
+  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Exit, &eParam);
+}
+FX_BOOL CXFA_FFWidget::IsButtonDown() {
+  return (m_dwStatus & XFA_WIDGETSTATUS_ButtonDown) != 0;
+}
+void CXFA_FFWidget::SetButtonDown(FX_BOOL bSet) {
+  bSet ? m_dwStatus |= XFA_WIDGETSTATUS_ButtonDown
+       : m_dwStatus &= ~XFA_WIDGETSTATUS_ButtonDown;
+}
+int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
+                                  int32_t iStrokeType,
+                                  int32_t iCapType) {
+  switch (iStrokeType) {
+    case XFA_ATTRIBUTEENUM_DashDot: {
+      FX_FLOAT dashArray[] = {4, 1, 2, 1};
+      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
+        dashArray[1] = 2;
+        dashArray[3] = 2;
+      }
+      pGraphics->SetLineDash(0, dashArray, 4);
+      return FX_DASHSTYLE_DashDot;
+    }
+    case XFA_ATTRIBUTEENUM_DashDotDot: {
+      FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1};
+      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
+        dashArray[1] = 2;
+        dashArray[3] = 2;
+        dashArray[5] = 2;
+      }
+      pGraphics->SetLineDash(0, dashArray, 6);
+      return FX_DASHSTYLE_DashDotDot;
+    }
+    case XFA_ATTRIBUTEENUM_Dashed: {
+      FX_FLOAT dashArray[] = {5, 1};
+      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
+        dashArray[1] = 2;
+      }
+      pGraphics->SetLineDash(0, dashArray, 2);
+      return FX_DASHSTYLE_Dash;
+    }
+    case XFA_ATTRIBUTEENUM_Dotted: {
+      FX_FLOAT dashArray[] = {2, 1};
+      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
+        dashArray[1] = 2;
+      }
+      pGraphics->SetLineDash(0, dashArray, 2);
+      return FX_DASHSTYLE_Dot;
+    }
+    default:
+      break;
+  }
+  pGraphics->SetLineDash(FX_DASHSTYLE_Solid);
+  return FX_DASHSTYLE_Solid;
+}
+CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap) {
+  switch (iLineCap) {
+    case XFA_ATTRIBUTEENUM_Round:
+      return CFX_GraphStateData::LineCapRound;
+    case XFA_ATTRIBUTEENUM_Butt:
+      return CFX_GraphStateData::LineCapButt;
+    default:
+      break;
+  }
+  return CFX_GraphStateData::LineCapSquare;
+}
+class CXFA_ImageRenderer {
+ public:
+  CXFA_ImageRenderer();
+  ~CXFA_ImageRenderer();
+  FX_BOOL Start(CFX_RenderDevice* pDevice,
+                CFX_DIBSource* pDIBSource,
+                FX_ARGB bitmap_argb,
+                int bitmap_alpha,
+                const CFX_Matrix* pImage2Device,
+                FX_DWORD flags,
+                int blendType = FXDIB_BLEND_NORMAL);
+  FX_BOOL Continue(IFX_Pause* pPause);
+
+ protected:
+  CFX_RenderDevice* m_pDevice;
+  int m_Status;
+  CFX_Matrix m_ImageMatrix;
+  CFX_DIBSource* m_pDIBSource;
+  CFX_DIBitmap* m_pCloneConvert;
+  int m_BitmapAlpha;
+  FX_ARGB m_FillArgb;
+  FX_DWORD m_Flags;
+  CFX_ImageTransformer* m_pTransformer;
+  void* m_DeviceHandle;
+  int32_t m_BlendType;
+  FX_BOOL m_Result;
+  FX_BOOL m_bPrint;
+  FX_BOOL StartDIBSource();
+  void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
+                         int left,
+                         int top,
+                         FX_ARGB mask_argb,
+                         int bitmap_alpha,
+                         int blend_mode,
+                         int Transparency);
+};
+CXFA_ImageRenderer::CXFA_ImageRenderer() {
+  m_pDevice = NULL;
+  m_Status = 0;
+  m_pDIBSource = NULL;
+  m_pCloneConvert = NULL;
+  m_BitmapAlpha = 255;
+  m_FillArgb = 0;
+  m_Flags = 0;
+  m_pTransformer = NULL;
+  m_DeviceHandle = NULL;
+  m_BlendType = FXDIB_BLEND_NORMAL;
+  m_Result = TRUE;
+  m_bPrint = FALSE;
+}
+CXFA_ImageRenderer::~CXFA_ImageRenderer() {
+  if (m_pCloneConvert) {
+    delete m_pCloneConvert;
+  }
+  if (m_pTransformer) {
+    delete m_pTransformer;
+  }
+  if (m_DeviceHandle) {
+    m_pDevice->CancelDIBits(m_DeviceHandle);
+  }
+}
+FX_BOOL CXFA_ImageRenderer::Start(CFX_RenderDevice* pDevice,
+                                  CFX_DIBSource* pDIBSource,
+                                  FX_ARGB bitmap_argb,
+                                  int bitmap_alpha,
+                                  const CFX_Matrix* pImage2Device,
+                                  FX_DWORD flags,
+                                  int blendType) {
+  m_pDevice = pDevice;
+  m_pDIBSource = pDIBSource;
+  m_FillArgb = bitmap_argb;
+  m_BitmapAlpha = bitmap_alpha;
+  m_ImageMatrix = *pImage2Device;
+  m_Flags = flags;
+  m_BlendType = blendType;
+  return StartDIBSource();
+}
+FX_BOOL CXFA_ImageRenderer::StartDIBSource() {
+  if (m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
+                             &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL,
+                             m_BlendType)) {
+    if (m_DeviceHandle) {
+      m_Status = 3;
+      return TRUE;
+    }
+    return FALSE;
+  }
+  CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+  FX_RECT image_rect = image_rect_f.GetOutterRect();
+  int dest_width = image_rect.Width();
+  int dest_height = image_rect.Height();
+  if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
+      (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) {
+    if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+      m_Result = FALSE;
+      return FALSE;
+    }
+    CFX_DIBSource* pDib = m_pDIBSource;
+    if (m_pDIBSource->HasAlpha() &&
+        !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) &&
+        !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
+      m_pCloneConvert = m_pDIBSource->CloneConvert(FXDIB_Rgb);
+      if (!m_pCloneConvert) {
+        m_Result = FALSE;
+        return FALSE;
+      }
+      pDib = m_pCloneConvert;
+    }
+    FX_RECT clip_box = m_pDevice->GetClipBox();
+    clip_box.Intersect(image_rect);
+    m_Status = 2;
+    m_pTransformer = new CFX_ImageTransformer;
+    m_pTransformer->Start(pDib, &m_ImageMatrix, m_Flags, &clip_box);
+    return TRUE;
+  }
+  if (m_ImageMatrix.a < 0) {
+    dest_width = -dest_width;
+  }
+  if (m_ImageMatrix.d > 0) {
+    dest_height = -dest_height;
+  }
+  int dest_left, dest_top;
+  dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
+  dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
+  if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
+    if (m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top, dest_width,
+                                 dest_height, m_Flags, NULL, m_BlendType)) {
+      return FALSE;
+    }
+  }
+  if (m_pDIBSource->IsAlphaMask()) {
+    if (m_BitmapAlpha != 255) {
+      m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+    }
+    if (m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width,
+                                  dest_height, m_FillArgb, m_Flags)) {
+      return FALSE;
+    }
+  }
+  if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+    m_Result = FALSE;
+    return TRUE;
+  }
+  FX_RECT clip_box = m_pDevice->GetClipBox();
+  FX_RECT dest_rect = clip_box;
+  dest_rect.Intersect(image_rect);
+  FX_RECT dest_clip(
+      dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
+      dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
+  CFX_DIBitmap* pStretched =
+      m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
+  if (pStretched) {
+    CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,
+                      m_BitmapAlpha, m_BlendType, FALSE);
+    delete pStretched;
+    pStretched = NULL;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_ImageRenderer::Continue(IFX_Pause* pPause) {
+  if (m_Status == 2) {
+    if (m_pTransformer->Continue(pPause)) {
+      return TRUE;
+    }
+    CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+    if (pBitmap == NULL) {
+      return FALSE;
+    }
+    if (pBitmap->IsAlphaMask()) {
+      if (m_BitmapAlpha != 255) {
+        m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+      }
+      m_Result = m_pDevice->SetBitMask(pBitmap, m_pTransformer->m_ResultLeft,
+                                       m_pTransformer->m_ResultTop, m_FillArgb);
+    } else {
+      if (m_BitmapAlpha != 255) {
+        pBitmap->MultiplyAlpha(m_BitmapAlpha);
+      }
+      m_Result = m_pDevice->SetDIBits(pBitmap, m_pTransformer->m_ResultLeft,
+                                      m_pTransformer->m_ResultTop, m_BlendType);
+    }
+    delete pBitmap;
+    return FALSE;
+  } else if (m_Status == 3) {
+    return m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
+  }
+  return FALSE;
+}
+void CXFA_ImageRenderer::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
+                                           int left,
+                                           int top,
+                                           FX_ARGB mask_argb,
+                                           int bitmap_alpha,
+                                           int blend_mode,
+                                           int Transparency) {
+  if (pDIBitmap == NULL) {
+    return;
+  }
+  FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;
+  FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;
+  if (blend_mode == FXDIB_BLEND_NORMAL) {
+    if (!pDIBitmap->IsAlphaMask()) {
+      if (bitmap_alpha < 255) {
+        pDIBitmap->MultiplyAlpha(bitmap_alpha);
+      }
+      if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
+        return;
+      }
+    } else {
+      FX_DWORD fill_argb = (mask_argb);
+      if (bitmap_alpha < 255) {
+        ((uint8_t*)&fill_argb)[3] =
+            ((uint8_t*)&fill_argb)[3] * bitmap_alpha / 255;
+      }
+      if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {
+        return;
+      }
+    }
+  }
+  FX_BOOL bBackAlphaRequired = blend_mode && bIsolated;
+  FX_BOOL bGetBackGround =
+      ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||
+      (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) &&
+       (m_pDevice->GetRenderCaps() & FXRC_GET_BITS) && !bBackAlphaRequired);
+  if (bGetBackGround) {
+    if (bIsolated || !bGroup) {
+      if (pDIBitmap->IsAlphaMask()) {
+        return;
+      }
+      m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);
+    } else {
+      FX_RECT rect(left, top, left + pDIBitmap->GetWidth(),
+                   top + pDIBitmap->GetHeight());
+      rect.Intersect(m_pDevice->GetClipBox());
+      CFX_DIBitmap* pClone = NULL;
+      FX_BOOL bClone = FALSE;
+      if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
+        bClone = TRUE;
+        pClone = m_pDevice->GetBackDrop()->Clone(&rect);
+        CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap();
+        pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(),
+                                pForeBitmap, rect.left, rect.top);
+        left = left >= 0 ? 0 : left;
+        top = top >= 0 ? 0 : top;
+        if (!pDIBitmap->IsAlphaMask())
+          pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(),
+                                  pDIBitmap, left, top, blend_mode);
+        else
+          pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(),
+                                pDIBitmap, mask_argb, left, top, blend_mode);
+      } else {
+        pClone = pDIBitmap;
+      }
+      if (m_pDevice->GetBackDrop()) {
+        m_pDevice->SetDIBits(pClone, rect.left, rect.top);
+      } else {
+        if (pDIBitmap->IsAlphaMask()) {
+          return;
+        }
+        m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);
+      }
+      if (bClone) {
+        delete pClone;
+      }
+    }
+    return;
+  }
+  if (pDIBitmap->HasAlpha() &&
+      !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) {
+    CFX_DIBitmap* pCloneConvert = pDIBitmap->CloneConvert(FXDIB_Rgb);
+    if (!pCloneConvert) {
+      return;
+    }
+    CXFA_ImageRenderer imageRender;
+    FX_BOOL bRet = imageRender.Start(m_pDevice, pCloneConvert, m_FillArgb,
+                                     m_BitmapAlpha, &m_ImageMatrix, m_Flags);
+    while (bRet) {
+      bRet = imageRender.Continue(NULL);
+    }
+    delete pCloneConvert;
+    return;
+  }
+}
+void XFA_DrawImage(CFX_Graphics* pGS,
+                   const CFX_RectF& rtImage,
+                   CFX_Matrix* pMatrix,
+                   CFX_DIBitmap* pDIBitmap,
+                   int32_t iAspect,
+                   int32_t iImageXDpi,
+                   int32_t iImageYDpi,
+                   int32_t iHorzAlign,
+                   int32_t iVertAlign) {
+  if (rtImage.IsEmpty()) {
+    return;
+  }
+  if (!pDIBitmap || !pDIBitmap->GetBuffer()) {
+    return;
+  }
+  FX_FLOAT fWidth =
+      XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
+  FX_FLOAT fHeight =
+      XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
+  CFX_RectF rtFit;
+  rtFit.Set(rtImage.left, rtImage.top, fWidth, fHeight);
+  switch (iAspect) {
+    case XFA_ATTRIBUTEENUM_Fit: {
+      FX_FLOAT f1 = rtImage.height / rtFit.height;
+      FX_FLOAT f2 = rtImage.width / rtFit.width;
+      f1 = std::min(f1, f2);
+      rtFit.height = rtFit.height * f1;
+      rtFit.width = rtFit.width * f1;
+    } break;
+    case XFA_ATTRIBUTEENUM_Actual:
+      break;
+    case XFA_ATTRIBUTEENUM_Height: {
+      FX_FLOAT f1 = rtImage.height / rtFit.height;
+      rtFit.height = rtImage.height;
+      rtFit.width = f1 * rtFit.width;
+    } break;
+    case XFA_ATTRIBUTEENUM_None:
+      rtFit.height = rtImage.height;
+      rtFit.width = rtImage.width;
+      break;
+    case XFA_ATTRIBUTEENUM_Width: {
+      FX_FLOAT f1 = rtImage.width / rtFit.width;
+      rtFit.width = rtImage.width;
+      rtFit.height = rtFit.height * f1;
+    } break;
+  }
+  if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) {
+    rtFit.left += (rtImage.width - rtFit.width) / 2;
+  } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) {
+    rtFit.left = rtImage.right() - rtFit.width;
+  }
+  if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) {
+    rtFit.top += (rtImage.height - rtFit.height) / 2;
+  } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) {
+    rtFit.top = rtImage.bottom() - rtImage.height;
+  }
+  CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
+  pRenderDevice->SaveState();
+  CFX_PathData path;
+  path.AppendRect(rtImage.left, rtImage.bottom(), rtImage.right(), rtImage.top);
+  pRenderDevice->SetClip_PathFill(&path, pMatrix, FXFILL_WINDING);
+  CFX_Matrix mtImage(1, 0, 0, -1, 0, 1);
+  mtImage.Concat(rtFit.width, 0, 0, rtFit.height, rtFit.left, rtFit.top);
+  mtImage.Concat(*pMatrix);
+  CXFA_ImageRenderer imageRender;
+  FX_BOOL bRet = imageRender.Start(pRenderDevice, pDIBitmap, 0, 255, &mtImage,
+                                   FXDIB_INTERPOL);
+  while (bRet) {
+    bRet = imageRender.Continue(NULL);
+  }
+  pRenderDevice->RestoreState();
+}
+
+static const uint8_t g_inv_base64[128] = {
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62,  255,
+    255, 255, 63,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  255, 255,
+    255, 255, 255, 255, 255, 0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
+    10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
+    25,  255, 255, 255, 255, 255, 255, 26,  27,  28,  29,  30,  31,  32,  33,
+    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
+    49,  50,  51,  255, 255, 255, 255, 255,
+};
+
+static uint8_t* XFA_RemoveBase64Whitespace(const uint8_t* pStr, int32_t iLen) {
+  uint8_t* pCP;
+  int32_t i = 0, j = 0;
+  if (iLen == 0) {
+    iLen = FXSYS_strlen((FX_CHAR*)pStr);
+  }
+  pCP = FX_Alloc(uint8_t, iLen + 1);
+  for (; i < iLen; i++) {
+    if ((pStr[i] & 128) == 0) {
+      if (g_inv_base64[pStr[i]] != 0xFF || pStr[i] == '=') {
+        pCP[j++] = pStr[i];
+      }
+    }
+  }
+  pCP[j] = '\0';
+  return pCP;
+}
+static int32_t XFA_Base64Decode(const FX_CHAR* pStr, uint8_t* pOutBuffer) {
+  if (pStr == NULL) {
+    return 0;
+  }
+  uint8_t* pBuffer =
+      XFA_RemoveBase64Whitespace((uint8_t*)pStr, FXSYS_strlen((FX_CHAR*)pStr));
+  if (pBuffer == NULL) {
+    return 0;
+  }
+  int32_t iLen = FXSYS_strlen((FX_CHAR*)pBuffer);
+  int32_t i = 0, j = 0;
+  FX_DWORD dwLimb = 0;
+  for (; i + 3 < iLen; i += 4) {
+    if (pBuffer[i] == '=' || pBuffer[i + 1] == '=' || pBuffer[i + 2] == '=' ||
+        pBuffer[i + 3] == '=') {
+      if (pBuffer[i] == '=' || pBuffer[i + 1] == '=') {
+        break;
+      }
+      if (pBuffer[i + 2] == '=') {
+        dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 6) |
+                 ((FX_DWORD)g_inv_base64[pBuffer[i + 1]]);
+        pOutBuffer[j] = (uint8_t)(dwLimb >> 4) & 0xFF;
+        j++;
+      } else {
+        dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 12) |
+                 ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 6) |
+                 ((FX_DWORD)g_inv_base64[pBuffer[i + 2]]);
+        pOutBuffer[j] = (uint8_t)(dwLimb >> 10) & 0xFF;
+        pOutBuffer[j + 1] = (uint8_t)(dwLimb >> 2) & 0xFF;
+        j += 2;
+      }
+    } else {
+      dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 18) |
+               ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 12) |
+               ((FX_DWORD)g_inv_base64[pBuffer[i + 2]] << 6) |
+               ((FX_DWORD)g_inv_base64[pBuffer[i + 3]]);
+      pOutBuffer[j] = (uint8_t)(dwLimb >> 16) & 0xff;
+      pOutBuffer[j + 1] = (uint8_t)(dwLimb >> 8) & 0xff;
+      pOutBuffer[j + 2] = (uint8_t)(dwLimb)&0xff;
+      j += 3;
+    }
+  }
+  FX_Free(pBuffer);
+  return j;
+}
+static FX_CHAR g_base64_chars[] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len) {
+  FX_CHAR* out = NULL;
+  int i, j;
+  FX_DWORD limb;
+  out = FX_Alloc(FX_CHAR, ((buf_len * 8 + 5) / 6) + 5);
+  for (i = 0, j = 0, limb = 0; i + 2 < buf_len; i += 3, j += 4) {
+    limb = ((FX_DWORD)buf[i] << 16) | ((FX_DWORD)buf[i + 1] << 8) |
+           ((FX_DWORD)buf[i + 2]);
+    out[j] = g_base64_chars[(limb >> 18) & 63];
+    out[j + 1] = g_base64_chars[(limb >> 12) & 63];
+    out[j + 2] = g_base64_chars[(limb >> 6) & 63];
+    out[j + 3] = g_base64_chars[(limb)&63];
+  }
+  switch (buf_len - i) {
+    case 0:
+      break;
+    case 1:
+      limb = ((FX_DWORD)buf[i]);
+      out[j++] = g_base64_chars[(limb >> 2) & 63];
+      out[j++] = g_base64_chars[(limb << 4) & 63];
+      out[j++] = '=';
+      out[j++] = '=';
+      break;
+    case 2:
+      limb = ((FX_DWORD)buf[i] << 8) | ((FX_DWORD)buf[i + 1]);
+      out[j++] = g_base64_chars[(limb >> 10) & 63];
+      out[j++] = g_base64_chars[(limb >> 4) & 63];
+      out[j++] = g_base64_chars[(limb << 2) & 63];
+      out[j++] = '=';
+      break;
+    default:
+      break;
+  }
+  out[j] = '\0';
+  return out;
+}
+FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType) {
+  CFX_WideString wsContentType(wsType);
+  wsContentType.MakeLower();
+  if (wsContentType == FX_WSTRC(L"image/jpg")) {
+    return FXCODEC_IMAGE_JPG;
+  }
+  if (wsContentType == FX_WSTRC(L"image/png")) {
+    return FXCODEC_IMAGE_PNG;
+  }
+  if (wsContentType == FX_WSTRC(L"image/gif")) {
+    return FXCODEC_IMAGE_GIF;
+  }
+  if (wsContentType == FX_WSTRC(L"image/bmp")) {
+    return FXCODEC_IMAGE_BMP;
+  }
+  if (wsContentType == FX_WSTRC(L"image/tif")) {
+    return FXCODEC_IMAGE_TIF;
+  }
+  return FXCODEC_IMAGE_UNKNOWN;
+}
+CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc,
+                                CXFA_Image* pImage,
+                                FX_BOOL& bNameImage,
+                                int32_t& iImageXDpi,
+                                int32_t& iImageYDpi) {
+  CFX_WideString wsHref;
+  pImage->GetHref(wsHref);
+  CFX_WideString wsImage;
+  pImage->GetContent(wsImage);
+  if (wsHref.IsEmpty() && wsImage.IsEmpty()) {
+    return NULL;
+  }
+  CFX_WideString wsContentType;
+  pImage->GetContentType(wsContentType);
+  FXCODEC_IMAGE_TYPE type = XFA_GetImageType(wsContentType);
+  CFX_ByteString bsContent;
+  uint8_t* pImageBuffer = NULL;
+  IFX_FileRead* pImageFileRead = NULL;
+  if (wsImage.GetLength() > 0) {
+    XFA_ATTRIBUTEENUM iEncoding =
+        (XFA_ATTRIBUTEENUM)pImage->GetTransferEncoding();
+    if (iEncoding == XFA_ATTRIBUTEENUM_Base64) {
+      CFX_ByteString bsData = wsImage.UTF8Encode();
+      int32_t iLength = bsData.GetLength();
+      pImageBuffer = FX_Alloc(uint8_t, iLength);
+      int32_t iRead = XFA_Base64Decode((const FX_CHAR*)bsData, pImageBuffer);
+      if (iRead > 0) {
+        pImageFileRead = FX_CreateMemoryStream(pImageBuffer, iRead);
+      }
+    } else {
+      bsContent = CFX_ByteString::FromUnicode(wsImage);
+      pImageFileRead = FX_CreateMemoryStream(
+          (uint8_t*)(const uint8_t*)bsContent, bsContent.GetLength());
+    }
+  } else {
+    CFX_WideString wsURL = wsHref;
+    if (wsURL.Left(7) != FX_WSTRC(L"http://") &&
+        wsURL.Left(6) != FX_WSTRC(L"ftp://")) {
+      CFX_DIBitmap* pBitmap =
+          pDoc->GetPDFNamedImage(wsURL, iImageXDpi, iImageYDpi);
+      if (pBitmap) {
+        bNameImage = TRUE;
+        return pBitmap;
+      }
+    }
+    pImageFileRead = pDoc->GetDocProvider()->OpenLinkedFile(pDoc, wsURL);
+  }
+  if (!pImageFileRead) {
+    FX_Free(pImageBuffer);
+    return NULL;
+  }
+  bNameImage = FALSE;
+  CFX_DIBitmap* pBitmap =
+      XFA_LoadImageFromBuffer(pImageFileRead, type, iImageXDpi, iImageYDpi);
+  FX_Free(pImageBuffer);
+  pImageFileRead->Release();
+  return pBitmap;
+}
+static FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type,
+                                     int32_t iComponents,
+                                     int32_t iBitsPerComponent) {
+  FXDIB_Format dibFormat = FXDIB_Argb;
+  switch (type) {
+    case FXCODEC_IMAGE_BMP:
+    case FXCODEC_IMAGE_JPG:
+    case FXCODEC_IMAGE_TIF: {
+      dibFormat = FXDIB_Rgb32;
+      int32_t bpp = iComponents * iBitsPerComponent;
+      if (bpp <= 24) {
+        dibFormat = FXDIB_Rgb;
+      }
+    } break;
+    case FXCODEC_IMAGE_PNG:
+    default:
+      break;
+  }
+  return dibFormat;
+}
+CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead,
+                                      FXCODEC_IMAGE_TYPE type,
+                                      int32_t& iImageXDpi,
+                                      int32_t& iImageYDpi) {
+  CFX_GEModule* pGeModule = CFX_GEModule::Get();
+  if (!pGeModule) {
+    return NULL;
+  }
+  CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule();
+  if (!pCodecMgr) {
+    return NULL;
+  }
+  CFX_DIBAttribute dibAttr;
+  CFX_DIBitmap* pBitmap = NULL;
+  ICodec_ProgressiveDecoder* pProgressiveDecoder =
+      pCodecMgr->CreateProgressiveDecoder();
+  pProgressiveDecoder->LoadImageInfo(pImageFileRead, type, &dibAttr);
+  switch (dibAttr.m_wDPIUnit) {
+    case FXCODEC_RESUNIT_CENTIMETER:
+      dibAttr.m_nXDPI = (int32_t)(dibAttr.m_nXDPI * 2.54f);
+      dibAttr.m_nYDPI = (int32_t)(dibAttr.m_nYDPI * 2.54f);
+      break;
+    case FXCODEC_RESUNIT_METER:
+      dibAttr.m_nXDPI = (int32_t)(dibAttr.m_nXDPI / (FX_FLOAT)100 * 2.54f);
+      dibAttr.m_nYDPI = (int32_t)(dibAttr.m_nYDPI / (FX_FLOAT)100 * 2.54f);
+      break;
+    default:
+      break;
+  }
+  iImageXDpi = dibAttr.m_nXDPI > 1 ? dibAttr.m_nXDPI : (96);
+  iImageYDpi = dibAttr.m_nYDPI > 1 ? dibAttr.m_nYDPI : (96);
+  if (pProgressiveDecoder->GetWidth() > 0 &&
+      pProgressiveDecoder->GetHeight() > 0) {
+    type = pProgressiveDecoder->GetType();
+    int32_t iComponents = pProgressiveDecoder->GetNumComponents();
+    int32_t iBpc = pProgressiveDecoder->GetBPC();
+    FXDIB_Format dibFormat = XFA_GetDIBFormat(type, iComponents, iBpc);
+    pBitmap = new CFX_DIBitmap();
+    pBitmap->Create(pProgressiveDecoder->GetWidth(),
+                    pProgressiveDecoder->GetHeight(), dibFormat);
+    pBitmap->Clear(0xffffffff);
+    int32_t nFrames;
+    if ((pProgressiveDecoder->GetFrames(nFrames) ==
+         FXCODEC_STATUS_DECODE_READY) &&
+        (nFrames > 0)) {
+      pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(),
+                                       pBitmap->GetHeight());
+      pProgressiveDecoder->ContinueDecode();
+    }
+  }
+  delete pProgressiveDecoder;
+  return pBitmap;
+}
+void XFA_RectWidthoutMargin(CFX_RectF& rt, const CXFA_Margin& mg, FX_BOOL bUI) {
+  if (!mg) {
+    return;
+  }
+  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
+  mg.GetLeftInset(fLeftInset);
+  mg.GetTopInset(fTopInset);
+  mg.GetRightInset(fRightInset);
+  mg.GetBottomInset(fBottomInset);
+  rt.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
+}
+CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
+  XFA_ELEMENT iType = pLayoutItem->GetFormNode()->GetClassID();
+  if (XFA_IsCreateWidget(iType)) {
+    return static_cast<CXFA_FFWidget*>(pLayoutItem);
+  }
+  return nullptr;
+}
+FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType) {
+  return iType == XFA_ELEMENT_Field || iType == XFA_ELEMENT_Draw ||
+         iType == XFA_ELEMENT_Subform || iType == XFA_ELEMENT_ExclGroup;
+}
+static void XFA_BOX_GetPath_Arc(CXFA_Box box,
+                                CFX_RectF rtDraw,
+                                CFX_Path& fillPath,
+                                FX_DWORD dwFlags) {
+  FX_FLOAT a, b;
+  a = rtDraw.width / 2.0f;
+  b = rtDraw.height / 2.0f;
+  if (box.IsCircular() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
+    a = b = std::min(a, b);
+  }
+  CFX_PointF center = rtDraw.Center();
+  rtDraw.left = center.x - a;
+  rtDraw.top = center.y - b;
+  rtDraw.width = a + a;
+  rtDraw.height = b + b;
+  FX_FLOAT startAngle = 0, sweepAngle = 360;
+  FX_BOOL bStart = box.GetStartAngle(startAngle);
+  FX_BOOL bEnd = box.GetSweepAngle(sweepAngle);
+  if (!bStart && !bEnd) {
+    fillPath.AddEllipse(rtDraw);
+    return;
+  }
+  startAngle = -startAngle * FX_PI / 180.0f;
+  sweepAngle = -sweepAngle * FX_PI / 180.0f;
+  fillPath.AddArc(rtDraw.left, rtDraw.top, rtDraw.width, rtDraw.height,
+                  startAngle, sweepAngle);
+}
+static void XFA_BOX_GetPath(CXFA_Box box,
+                            const CXFA_StrokeArray& strokes,
+                            CFX_RectF rtWidget,
+                            CFX_Path& path,
+                            int32_t nIndex,
+                            FX_BOOL bStart,
+                            FX_BOOL bCorner) {
+  FXSYS_assert(nIndex >= 0 && nIndex < 8);
+  FX_BOOL bInverted, bRound;
+  FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny, offsetY, offsetX,
+      offsetEX, offsetEY;
+  CFX_PointF cpStart, cp, cp1, cp2;
+  CFX_RectF rtRadius;
+  int32_t n = (nIndex & 1) ? nIndex - 1 : nIndex;
+  CXFA_Corner corner1(strokes[n].GetNode());
+  CXFA_Corner corner2(strokes[(n + 2) % 8].GetNode());
+  fRadius1 = bCorner ? corner1.GetRadius() : 0;
+  fRadius2 = bCorner ? corner2.GetRadius() : 0;
+  bInverted = corner1.IsInverted();
+  offsetY = 0.0f;
+  offsetX = 0.0f;
+  bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round;
+  FX_FLOAT halfAfter = 0.0f;
+  FX_FLOAT halfBefore = 0.0f;
+  CXFA_Stroke stroke = strokes[nIndex];
+  if (stroke.IsCorner()) {
+    CXFA_Stroke edgeBefore = strokes[(nIndex + 1 * 8 - 1) % 8];
+    CXFA_Stroke edgeAfter = strokes[nIndex + 1];
+    if (stroke.IsInverted()) {
+      if (!stroke.SameStyles(edgeBefore)) {
+        halfBefore = edgeBefore.GetThickness() / 2;
+      }
+      if (!stroke.SameStyles(edgeAfter)) {
+        halfAfter = edgeAfter.GetThickness() / 2;
+      }
+    }
+  } else {
+    CXFA_Stroke edgeBefore = strokes[(nIndex + 8 - 2) % 8];
+    CXFA_Stroke edgeAfter = strokes[(nIndex + 2) % 8];
+    if (!bRound && !bInverted) {
+      { halfBefore = edgeBefore.GetThickness() / 2; }
+      { halfAfter = edgeAfter.GetThickness() / 2; }
+    }
+  }
+  offsetEX = 0.0f;
+  offsetEY = 0.0f;
+  if (bRound) {
+    sy = FX_PI / 2;
+  }
+  switch (nIndex) {
+    case 0:
+    case 1:
+      cp1 = rtWidget.TopLeft();
+      cp2 = rtWidget.TopRight();
+      if (nIndex == 0) {
+        cpStart.x = cp1.x - halfBefore;
+        cpStart.y = cp1.y + fRadius1, offsetY = -halfAfter;
+      } else {
+        cpStart.x = cp1.x + fRadius1 - halfBefore, cpStart.y = cp1.y,
+        offsetEX = halfAfter;
+      }
+      vx = 1, vy = 1;
+      nx = -1, ny = 0;
+      if (bRound) {
+        sx = bInverted ? FX_PI / 2 : FX_PI;
+      } else {
+        sx = 1, sy = 0;
+      }
+      break;
+    case 2:
+    case 3:
+      cp1 = rtWidget.TopRight();
+      cp2 = rtWidget.BottomRight();
+      if (nIndex == 2) {
+        cpStart.x = cp1.x - fRadius1, cpStart.y = cp1.y - halfBefore,
+        offsetX = halfAfter;
+      } else {
+        cpStart.x = cp1.x, cpStart.y = cp1.y + fRadius1 - halfBefore,
+        offsetEY = halfAfter;
+      }
+      vx = -1, vy = 1;
+      nx = 0, ny = -1;
+      if (bRound) {
+        sx = bInverted ? FX_PI : FX_PI * 3 / 2;
+      } else {
+        sx = 0, sy = 1;
+      }
+      break;
+    case 4:
+    case 5:
+      cp1 = rtWidget.BottomRight();
+      cp2 = rtWidget.BottomLeft();
+      if (nIndex == 4) {
+        cpStart.x = cp1.x + halfBefore, cpStart.y = cp1.y - fRadius1,
+        offsetY = halfAfter;
+      } else {
+        cpStart.x = cp1.x - fRadius1 + halfBefore, cpStart.y = cp1.y,
+        offsetEX = -halfAfter;
+      }
+      vx = -1, vy = -1;
+      nx = 1, ny = 0;
+      if (bRound) {
+        sx = bInverted ? FX_PI * 3 / 2 : 0;
+      } else {
+        sx = -1, sy = 0;
+      }
+      break;
+    case 6:
+    case 7:
+      cp1 = rtWidget.BottomLeft();
+      cp2 = rtWidget.TopLeft();
+      if (nIndex == 6) {
+        cpStart.x = cp1.x + fRadius1, cpStart.y = cp1.y + halfBefore,
+        offsetX = -halfAfter;
+      } else {
+        cpStart.x = cp1.x, cpStart.y = cp1.y - fRadius1 + halfBefore,
+        offsetEY = -halfAfter;
+      }
+      vx = 1, vy = -1;
+      nx = 0, ny = 1;
+      if (bRound) {
+        sx = bInverted ? 0 : FX_PI / 2;
+      } else {
+        sx = 0, sy = -1;
+      }
+      break;
+  }
+  if (bStart) {
+    path.MoveTo(cpStart.x, cpStart.y);
+  }
+  if (nIndex & 1) {
+    path.LineTo(cp2.x + fRadius2 * nx + offsetEX,
+                cp2.y + fRadius2 * ny + offsetEY);
+    return;
+  }
+  if (bRound) {
+    if (fRadius1 < 0) {
+      sx -= FX_PI;
+    }
+    if (bInverted) {
+      sy *= -1;
+    }
+    rtRadius.Set(cp1.x + offsetX * 2, cp1.y + offsetY * 2,
+                 fRadius1 * 2 * vx - offsetX * 2,
+                 fRadius1 * 2 * vy - offsetY * 2);
+    rtRadius.Normalize();
+    if (bInverted) {
+      rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy);
+    }
+    path.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width, rtRadius.height, sx,
+               sy);
+  } else {
+    if (bInverted) {
+      cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy;
+    } else {
+      cp = cp1;
+    }
+    path.LineTo(cp.x, cp.y);
+    path.LineTo(cp1.x + fRadius1 * sx + offsetX,
+                cp1.y + fRadius1 * sy + offsetY);
+  }
+}
+static void XFA_BOX_GetFillPath(CXFA_Box box,
+                                const CXFA_StrokeArray& strokes,
+                                CFX_RectF rtWidget,
+                                CFX_Path& fillPath,
+                                FX_WORD dwFlags) {
+  if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
+    CXFA_Edge edge = box.GetEdge(0);
+    FX_FLOAT fThickness = edge.GetThickness();
+    if (fThickness < 0) {
+      fThickness = 0;
+    }
+    FX_FLOAT fHalf = fThickness / 2;
+    int32_t iHand = box.GetHand();
+    if (iHand == XFA_ATTRIBUTEENUM_Left) {
+      rtWidget.Inflate(fHalf, fHalf);
+    } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+      rtWidget.Deflate(fHalf, fHalf);
+    }
+    XFA_BOX_GetPath_Arc(box, rtWidget, fillPath, dwFlags);
+    return;
+  }
+  FX_BOOL bSameStyles = TRUE;
+  int32_t i;
+  CXFA_Stroke stroke1 = strokes[0];
+  for (i = 1; i < 8; i++) {
+    CXFA_Stroke stroke2 = strokes[i];
+    if (!stroke1.SameStyles(stroke2)) {
+      bSameStyles = FALSE;
+      break;
+    }
+    stroke1 = stroke2;
+  }
+  if (bSameStyles) {
+    stroke1 = strokes[0];
+    for (i = 2; i < 8; i += 2) {
+      CXFA_Stroke stroke2 = strokes[i];
+      if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence |
+                                           XFA_STROKE_SAMESTYLE_Corner)) {
+        bSameStyles = FALSE;
+        break;
+      }
+      stroke1 = stroke2;
+    }
+    if (bSameStyles) {
+      stroke1 = strokes[0];
+      if (stroke1.IsInverted()) {
+        bSameStyles = FALSE;
+      }
+      if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) {
+        bSameStyles = FALSE;
+      }
+    }
+  }
+  if (bSameStyles) {
+    fillPath.AddRectangle(rtWidget.left, rtWidget.top, rtWidget.width,
+                          rtWidget.height);
+    return;
+  }
+  FX_BOOL bInverted, bRound;
+  FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny;
+  CFX_PointF cp, cp1, cp2;
+  CFX_RectF rtRadius;
+  for (int32_t i = 0; i < 8; i += 2) {
+    CXFA_Corner corner1(strokes[i].GetNode());
+    CXFA_Corner corner2(strokes[(i + 2) % 8].GetNode());
+    fRadius1 = corner1.GetRadius();
+    fRadius2 = corner2.GetRadius();
+    bInverted = corner1.IsInverted();
+    bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round;
+    if (bRound) {
+      sy = FX_PI / 2;
+    }
+    switch (i) {
+      case 0:
+        cp1 = rtWidget.TopLeft();
+        cp2 = rtWidget.TopRight();
+        vx = 1, vy = 1;
+        nx = -1, ny = 0;
+        if (bRound) {
+          sx = bInverted ? FX_PI / 2 : FX_PI;
+        } else {
+          sx = 1, sy = 0;
+        }
+        break;
+      case 2:
+        cp1 = rtWidget.TopRight();
+        cp2 = rtWidget.BottomRight();
+        vx = -1, vy = 1;
+        nx = 0, ny = -1;
+        if (bRound) {
+          sx = bInverted ? FX_PI : FX_PI * 3 / 2;
+        } else {
+          sx = 0, sy = 1;
+        }
+        break;
+      case 4:
+        cp1 = rtWidget.BottomRight();
+        cp2 = rtWidget.BottomLeft();
+        vx = -1, vy = -1;
+        nx = 1, ny = 0;
+        if (bRound) {
+          sx = bInverted ? FX_PI * 3 / 2 : 0;
+        } else {
+          sx = -1, sy = 0;
+        }
+        break;
+      case 6:
+        cp1 = rtWidget.BottomLeft();
+        cp2 = rtWidget.TopLeft();
+        vx = 1, vy = -1;
+        nx = 0, ny = 1;
+        if (bRound) {
+          sx = bInverted ? 0 : FX_PI / 2;
+        } else {
+          sx = 0, sy = -1;
+        }
+        break;
+    }
+    if (i == 0) {
+      fillPath.MoveTo(cp1.x, cp1.y + fRadius1);
+    }
+    if (bRound) {
+      if (fRadius1 < 0) {
+        sx -= FX_PI;
+      }
+      if (bInverted) {
+        sy *= -1;
+      }
+      rtRadius.Set(cp1.x, cp1.y, fRadius1 * 2 * vx, fRadius1 * 2 * vy);
+      rtRadius.Normalize();
+      if (bInverted) {
+        rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy);
+      }
+      fillPath.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width,
+                     rtRadius.height, sx, sy);
+    } else {
+      if (bInverted) {
+        cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy;
+      } else {
+        cp = cp1;
+      }
+      fillPath.LineTo(cp.x, cp.y);
+      fillPath.LineTo(cp1.x + fRadius1 * sx, cp1.y + fRadius1 * sy);
+    }
+    fillPath.LineTo(cp2.x + fRadius2 * nx, cp2.y + fRadius2 * ny);
+  }
+}
+static void XFA_BOX_Fill_Radial(CXFA_Box box,
+                                CFX_Graphics* pGS,
+                                CFX_Path& fillPath,
+                                CFX_RectF rtFill,
+                                CFX_Matrix* pMatrix) {
+  CXFA_Fill fill = box.GetFill();
+  FX_ARGB crStart, crEnd;
+  crStart = fill.GetColor();
+  int32_t iType = fill.GetRadial(crEnd);
+  CFX_Shading shading;
+  if (iType != XFA_ATTRIBUTEENUM_ToEdge) {
+    FX_ARGB temp = crEnd;
+    crEnd = crStart;
+    crStart = temp;
+  }
+  shading.CreateRadial(rtFill.Center(), rtFill.Center(), 0,
+                       FXSYS_sqrt(rtFill.Width() * rtFill.Width() +
+                                  rtFill.Height() * rtFill.Height()) /
+                           2,
+                       TRUE, TRUE, crStart, crEnd);
+  CFX_Color cr(&shading);
+  pGS->SetFillColor(&cr);
+  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
+}
+static void XFA_BOX_Fill_Pattern(CXFA_Box box,
+                                 CFX_Graphics* pGS,
+                                 CFX_Path& fillPath,
+                                 CFX_RectF rtFill,
+                                 CFX_Matrix* pMatrix) {
+  CXFA_Fill fill = box.GetFill();
+  FX_ARGB crStart, crEnd;
+  crStart = fill.GetColor();
+  int32_t iType = fill.GetPattern(crEnd);
+  int32_t iHatch = FX_HATCHSTYLE_Cross;
+  switch (iType) {
+    case XFA_ATTRIBUTEENUM_CrossDiagonal:
+      iHatch = FX_HATCHSTYLE_DiagonalCross;
+      break;
+    case XFA_ATTRIBUTEENUM_DiagonalLeft:
+      iHatch = FX_HATCHSTYLE_ForwardDiagonal;
+      break;
+    case XFA_ATTRIBUTEENUM_DiagonalRight:
+      iHatch = FX_HATCHSTYLE_BackwardDiagonal;
+      break;
+    case XFA_ATTRIBUTEENUM_Horizontal:
+      iHatch = FX_HATCHSTYLE_Horizontal;
+      break;
+    case XFA_ATTRIBUTEENUM_Vertical:
+      iHatch = FX_HATCHSTYLE_Vertical;
+      break;
+    default:
+      break;
+  }
+  CFX_Pattern pattern;
+  pattern.Create(iHatch, crEnd, crStart);
+  CFX_Color cr(&pattern);
+  pGS->SetFillColor(&cr);
+  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
+}
+static void XFA_BOX_Fill_Linear(CXFA_Box box,
+                                CFX_Graphics* pGS,
+                                CFX_Path& fillPath,
+                                CFX_RectF rtFill,
+                                CFX_Matrix* pMatrix) {
+  CXFA_Fill fill = box.GetFill();
+  FX_ARGB crStart = fill.GetColor();
+  FX_ARGB crEnd;
+  int32_t iType = fill.GetLinear(crEnd);
+  CFX_PointF ptStart;
+  CFX_PointF ptEnd;
+  switch (iType) {
+    case XFA_ATTRIBUTEENUM_ToRight:
+      ptStart = CFX_PointF(rtFill.left, rtFill.top);
+      ptEnd = CFX_PointF(rtFill.right(), rtFill.top);
+      break;
+    case XFA_ATTRIBUTEENUM_ToBottom:
+      ptStart = CFX_PointF(rtFill.left, rtFill.top);
+      ptEnd = CFX_PointF(rtFill.left, rtFill.bottom());
+      break;
+    case XFA_ATTRIBUTEENUM_ToLeft:
+      ptStart = CFX_PointF(rtFill.right(), rtFill.top);
+      ptEnd = CFX_PointF(rtFill.left, rtFill.top);
+      break;
+    case XFA_ATTRIBUTEENUM_ToTop:
+      ptStart = CFX_PointF(rtFill.left, rtFill.bottom());
+      ptEnd = CFX_PointF(rtFill.left, rtFill.top);
+      break;
+    default:
+      break;
+  }
+  CFX_Shading shading;
+  shading.CreateAxial(ptStart, ptEnd, FALSE, FALSE, crStart, crEnd);
+  CFX_Color cr(&shading);
+  pGS->SetFillColor(&cr);
+  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
+}
+static void XFA_BOX_Fill(CXFA_Box box,
+                         const CXFA_StrokeArray& strokes,
+                         CFX_Graphics* pGS,
+                         const CFX_RectF& rtWidget,
+                         CFX_Matrix* pMatrix,
+                         FX_DWORD dwFlags) {
+  CXFA_Fill fill = box.GetFill();
+  if (!fill || fill.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
+    return;
+  }
+  pGS->SaveGraphState();
+  CFX_Path fillPath;
+  fillPath.Create();
+  XFA_BOX_GetFillPath(box, strokes, rtWidget, fillPath,
+                      (dwFlags & XFA_DRAWBOX_ForceRound) != 0);
+  fillPath.Close();
+  int32_t eType = fill.GetFillType();
+  switch (eType) {
+    case XFA_ELEMENT_Radial:
+      XFA_BOX_Fill_Radial(box, pGS, fillPath, rtWidget, pMatrix);
+      break;
+    case XFA_ELEMENT_Pattern:
+      XFA_BOX_Fill_Pattern(box, pGS, fillPath, rtWidget, pMatrix);
+      break;
+    case XFA_ELEMENT_Linear:
+      XFA_BOX_Fill_Linear(box, pGS, fillPath, rtWidget, pMatrix);
+      break;
+    default: {
+      FX_ARGB cr;
+      if (eType == XFA_ELEMENT_Stipple) {
+        int32_t iRate = fill.GetStipple(cr);
+        if (iRate == 0) {
+          iRate = 100;
+        }
+        int32_t a = 0;
+        FX_COLORREF rgb;
+        ArgbDecode(cr, a, rgb);
+        cr = ArgbEncode(iRate * a / 100, rgb);
+      } else {
+        cr = fill.GetColor();
+      }
+      CFX_Color fillColor(cr);
+      pGS->SetFillColor(&fillColor);
+      pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
+    } break;
+  }
+  pGS->RestoreGraphState();
+}
+static void XFA_BOX_StrokePath(CXFA_Stroke stroke,
+                               CFX_Path* pPath,
+                               CFX_Graphics* pGS,
+                               CFX_Matrix* pMatrix) {
+  if (!stroke || !stroke.IsVisible()) {
+    return;
+  }
+  FX_FLOAT fThickness = stroke.GetThickness();
+  if (fThickness < 0.001f) {
+    return;
+  }
+  pGS->SaveGraphState();
+  if (stroke.IsCorner() && fThickness > 2 * stroke.GetRadius()) {
+    fThickness = 2 * stroke.GetRadius();
+  }
+  pGS->SetLineWidth(fThickness, TRUE);
+  pGS->SetLineCap(CFX_GraphStateData::LineCapButt);
+  XFA_StrokeTypeSetLineDash(pGS, stroke.GetStrokeType(),
+                            XFA_ATTRIBUTEENUM_Butt);
+  CFX_Color fxColor(stroke.GetColor());
+  pGS->SetStrokeColor(&fxColor);
+  pGS->StrokePath(pPath, pMatrix);
+  pGS->RestoreGraphState();
+}
+static void XFA_BOX_StrokeArc(CXFA_Box box,
+                              CFX_Graphics* pGS,
+                              CFX_RectF rtWidget,
+                              CFX_Matrix* pMatrix,
+                              FX_DWORD dwFlags) {
+  CXFA_Edge edge = box.GetEdge(0);
+  if (!edge || !edge.IsVisible()) {
+    return;
+  }
+  FX_BOOL bVisible = FALSE;
+  FX_FLOAT fThickness = 0;
+  int32_t i3DType = box.Get3DStyle(bVisible, fThickness);
+  if (i3DType) {
+    if (bVisible && fThickness >= 0.001f) {
+      dwFlags |= XFA_DRAWBOX_Lowered3D;
+    }
+  }
+  FX_FLOAT fHalf = edge.GetThickness() / 2;
+  if (fHalf < 0) {
+    fHalf = 0;
+  }
+  int32_t iHand = box.GetHand();
+  if (iHand == XFA_ATTRIBUTEENUM_Left) {
+    rtWidget.Inflate(fHalf, fHalf);
+  } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+    rtWidget.Deflate(fHalf, fHalf);
+  }
+  if ((dwFlags & XFA_DRAWBOX_ForceRound) == 0 ||
+      (dwFlags & XFA_DRAWBOX_Lowered3D) == 0) {
+    if (fHalf < 0.001f) {
+      return;
+    }
+    CFX_Path arcPath;
+    arcPath.Create();
+    XFA_BOX_GetPath_Arc(box, rtWidget, arcPath, dwFlags);
+    XFA_BOX_StrokePath(edge, &arcPath, pGS, pMatrix);
+    return;
+  }
+  pGS->SaveGraphState();
+  pGS->SetLineWidth(fHalf);
+  FX_FLOAT a, b;
+  a = rtWidget.width / 2.0f;
+  b = rtWidget.height / 2.0f;
+  if (dwFlags & XFA_DRAWBOX_ForceRound) {
+    a = b = std::min(a, b);
+  }
+  CFX_PointF center = rtWidget.Center();
+  rtWidget.left = center.x - a;
+  rtWidget.top = center.y - b;
+  rtWidget.width = a + a;
+  rtWidget.height = b + b;
+  FX_FLOAT startAngle = 0, sweepAngle = 360;
+  startAngle = startAngle * FX_PI / 180.0f;
+  sweepAngle = -sweepAngle * FX_PI / 180.0f;
+  CFX_Path arcPath;
+  arcPath.Create();
+  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
+                 3.0f * FX_PI / 4.0f, FX_PI);
+  CFX_Color cr(0xFF808080);
+  pGS->SetStrokeColor(&cr);
+  pGS->StrokePath(&arcPath, pMatrix);
+  arcPath.Clear();
+  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
+                 -1.0f * FX_PI / 4.0f, FX_PI);
+  cr.Set(0xFFFFFFFF);
+  pGS->SetStrokeColor(&cr);
+  pGS->StrokePath(&arcPath, pMatrix);
+  rtWidget.Deflate(fHalf, fHalf);
+  arcPath.Clear();
+  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
+                 3.0f * FX_PI / 4.0f, FX_PI);
+  cr.Set(0xFF404040);
+  pGS->SetStrokeColor(&cr);
+  pGS->StrokePath(&arcPath, pMatrix);
+  arcPath.Clear();
+  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
+                 -1.0f * FX_PI / 4.0f, FX_PI);
+  cr.Set(0xFFC0C0C0);
+  pGS->SetStrokeColor(&cr);
+  pGS->StrokePath(&arcPath, pMatrix);
+  pGS->RestoreGraphState();
+}
+static void XFA_Draw3DRect(CFX_Graphics* pGraphic,
+                           const CFX_RectF& rt,
+                           FX_FLOAT fLineWidth,
+                           CFX_Matrix* pMatrix,
+                           FX_ARGB argbTopLeft,
+                           FX_ARGB argbBottomRight) {
+  CFX_Color crLT(argbTopLeft);
+  pGraphic->SetFillColor(&crLT);
+  FX_FLOAT fBottom = rt.bottom();
+  FX_FLOAT fRight = rt.right();
+  CFX_Path pathLT;
+  pathLT.Create();
+  pathLT.MoveTo(rt.left, fBottom);
+  pathLT.LineTo(rt.left, rt.top);
+  pathLT.LineTo(fRight, rt.top);
+  pathLT.LineTo(fRight - fLineWidth, rt.top + fLineWidth);
+  pathLT.LineTo(rt.left + fLineWidth, rt.top + fLineWidth);
+  pathLT.LineTo(rt.left + fLineWidth, fBottom - fLineWidth);
+  pathLT.LineTo(rt.left, fBottom);
+  pGraphic->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
+  CFX_Color crRB(argbBottomRight);
+  pGraphic->SetFillColor(&crRB);
+  CFX_Path pathRB;
+  pathRB.Create();
+  pathRB.MoveTo(fRight, rt.top);
+  pathRB.LineTo(fRight, fBottom);
+  pathRB.LineTo(rt.left, fBottom);
+  pathRB.LineTo(rt.left + fLineWidth, fBottom - fLineWidth);
+  pathRB.LineTo(fRight - fLineWidth, fBottom - fLineWidth);
+  pathRB.LineTo(fRight - fLineWidth, rt.top + fLineWidth);
+  pathRB.LineTo(fRight, rt.top);
+  pGraphic->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
+}
+static void XFA_BOX_Stroke_3DRect_Lowered(CFX_Graphics* pGS,
+                                          CFX_RectF rt,
+                                          FX_FLOAT fThickness,
+                                          CFX_Matrix* pMatrix) {
+  FX_FLOAT fHalfWidth = fThickness / 2.0f;
+  CFX_RectF rtInner(rt);
+  rtInner.Deflate(fHalfWidth, fHalfWidth);
+  CFX_Color cr(0xFF000000);
+  pGS->SetFillColor(&cr);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
+  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
+  pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF808080, 0xFFC0C0C0);
+}
+static void XFA_BOX_Stroke_3DRect_Raised(CFX_Graphics* pGS,
+                                         CFX_RectF rt,
+                                         FX_FLOAT fThickness,
+                                         CFX_Matrix* pMatrix) {
+  FX_FLOAT fHalfWidth = fThickness / 2.0f;
+  CFX_RectF rtInner(rt);
+  rtInner.Deflate(fHalfWidth, fHalfWidth);
+  CFX_Color cr(0xFF000000);
+  pGS->SetFillColor(&cr);
+  CFX_Path path;
+  path.Create();
+  path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
+  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
+  pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
+  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080);
+}
+static void XFA_BOX_Stroke_3DRect_Etched(CFX_Graphics* pGS,
+                                         CFX_RectF rt,
+                                         FX_FLOAT fThickness,
+                                         CFX_Matrix* pMatrix) {
+  FX_FLOAT fHalfWidth = fThickness / 2.0f;
+  XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFFFFFFFF);
+  CFX_RectF rtInner(rt);
+  rtInner.Deflate(fHalfWidth, fHalfWidth);
+  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080);
+}
+static void XFA_BOX_Stroke_3DRect_Embossed(CFX_Graphics* pGS,
+                                           CFX_RectF rt,
+                                           FX_FLOAT fThickness,
+                                           CFX_Matrix* pMatrix) {
+  FX_FLOAT fHalfWidth = fThickness / 2.0f;
+  XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFF000000);
+  CFX_RectF rtInner(rt);
+  rtInner.Deflate(fHalfWidth, fHalfWidth);
+  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF000000, 0xFF808080);
+}
+static void XFA_BOX_Stroke_Rect(CXFA_Box box,
+                                const CXFA_StrokeArray& strokes,
+                                CFX_Graphics* pGS,
+                                CFX_RectF rtWidget,
+                                CFX_Matrix* pMatrix) {
+  FX_BOOL bVisible = FALSE;
+  FX_FLOAT fThickness = 0;
+  int32_t i3DType = box.Get3DStyle(bVisible, fThickness);
+  if (i3DType) {
+    if (!bVisible || fThickness < 0.001f) {
+      return;
+    }
+    switch (i3DType) {
+      case XFA_ATTRIBUTEENUM_Lowered:
+        XFA_BOX_Stroke_3DRect_Lowered(pGS, rtWidget, fThickness, pMatrix);
+        break;
+      case XFA_ATTRIBUTEENUM_Raised:
+        XFA_BOX_Stroke_3DRect_Raised(pGS, rtWidget, fThickness, pMatrix);
+        break;
+      case XFA_ATTRIBUTEENUM_Etched:
+        XFA_BOX_Stroke_3DRect_Etched(pGS, rtWidget, fThickness, pMatrix);
+        break;
+      case XFA_ATTRIBUTEENUM_Embossed:
+        XFA_BOX_Stroke_3DRect_Embossed(pGS, rtWidget, fThickness, pMatrix);
+        break;
+    }
+    return;
+  }
+  FX_BOOL bClose = FALSE;
+  FX_BOOL bSameStyles = TRUE;
+  int32_t i;
+  CXFA_Stroke stroke1 = strokes[0];
+  for (i = 1; i < 8; i++) {
+    CXFA_Stroke stroke2 = strokes[i];
+    if (!stroke1.SameStyles(stroke2)) {
+      bSameStyles = FALSE;
+      break;
+    }
+    stroke1 = stroke2;
+  }
+  if (bSameStyles) {
+    stroke1 = strokes[0];
+    bClose = TRUE;
+    for (i = 2; i < 8; i += 2) {
+      CXFA_Stroke stroke2 = strokes[i];
+      if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence |
+                                           XFA_STROKE_SAMESTYLE_Corner)) {
+        bSameStyles = FALSE;
+        break;
+      }
+      stroke1 = stroke2;
+    }
+    if (bSameStyles) {
+      stroke1 = strokes[0];
+      if (stroke1.IsInverted()) {
+        bSameStyles = FALSE;
+      }
+      if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) {
+        bSameStyles = FALSE;
+      }
+    }
+  }
+  FX_BOOL bStart = TRUE;
+  CFX_Path path;
+  path.Create();
+  for (i = 0; i < 8; i++) {
+    CXFA_Stroke stroke1 = strokes[i];
+    if ((i % 1) == 0 && stroke1.GetRadius() < 0) {
+      FX_BOOL bEmpty = path.IsEmpty();
+      if (!bEmpty) {
+        XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix);
+        path.Clear();
+      }
+      bStart = TRUE;
+      continue;
+    }
+    XFA_BOX_GetPath(box, strokes, rtWidget, path, i, bStart, !bSameStyles);
+    CXFA_Stroke stroke2 = strokes[(i + 1) % 8];
+    bStart = !stroke1.SameStyles(stroke2);
+    if (bStart) {
+      XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix);
+      path.Clear();
+    }
+  }
+  FX_BOOL bEmpty = path.IsEmpty();
+  if (!bEmpty) {
+    if (bClose) {
+      path.Close();
+    }
+    XFA_BOX_StrokePath(strokes[7], &path, pGS, pMatrix);
+  }
+}
+static void XFA_BOX_Stroke(CXFA_Box box,
+                           const CXFA_StrokeArray& strokes,
+                           CFX_Graphics* pGS,
+                           CFX_RectF rtWidget,
+                           CFX_Matrix* pMatrix,
+                           FX_DWORD dwFlags) {
+  if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
+    XFA_BOX_StrokeArc(box, pGS, rtWidget, pMatrix, dwFlags);
+    return;
+  }
+  bool bVisible = false;
+  for (int32_t j = 0; j < 4; j++) {
+    if (strokes[j * 2 + 1].IsVisible()) {
+      bVisible = true;
+      break;
+    }
+  }
+  if (!bVisible) {
+    return;
+  }
+  for (int32_t i = 1; i < 8; i += 2) {
+    CXFA_Edge edge(strokes[i].GetNode());
+    FX_FLOAT fThickness = edge.GetThickness();
+    if (fThickness < 0) {
+      fThickness = 0;
+    }
+    FX_FLOAT fHalf = fThickness / 2;
+    int32_t iHand = box.GetHand();
+    switch (i) {
+      case 1:
+        if (iHand == XFA_ATTRIBUTEENUM_Left) {
+          rtWidget.top -= fHalf;
+          rtWidget.height += fHalf;
+        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+          rtWidget.top += fHalf;
+          rtWidget.height -= fHalf;
+        }
+        break;
+      case 3:
+        if (iHand == XFA_ATTRIBUTEENUM_Left) {
+          rtWidget.width += fHalf;
+        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+          rtWidget.width -= fHalf;
+        }
+        break;
+      case 5:
+        if (iHand == XFA_ATTRIBUTEENUM_Left) {
+          rtWidget.height += fHalf;
+        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+          rtWidget.height -= fHalf;
+        }
+        break;
+      case 7:
+        if (iHand == XFA_ATTRIBUTEENUM_Left) {
+          rtWidget.left -= fHalf;
+          rtWidget.width += fHalf;
+        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
+          rtWidget.left += fHalf;
+          rtWidget.width -= fHalf;
+        }
+        break;
+    }
+  }
+  XFA_BOX_Stroke_Rect(box, strokes, pGS, rtWidget, pMatrix);
+}
+void XFA_DrawBox(CXFA_Box box,
+                 CFX_Graphics* pGS,
+                 const CFX_RectF& rtWidget,
+                 CFX_Matrix* pMatrix,
+                 FX_DWORD dwFlags) {
+  if (!box || box.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
+    return;
+  }
+  int32_t iType = box.GetClassID();
+  if (iType != XFA_ELEMENT_Arc && iType != XFA_ELEMENT_Border &&
+      iType != XFA_ELEMENT_Rectangle) {
+    return;
+  }
+  CXFA_StrokeArray strokes;
+  if (!(dwFlags & XFA_DRAWBOX_ForceRound) && iType != XFA_ELEMENT_Arc) {
+    box.GetStrokes(strokes);
+  }
+  XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
+  XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
+}
diff --git a/xfa/fxfa/app/xfa_ffwidget.h b/xfa/fxfa/app/xfa_ffwidget.h
new file mode 100644
index 0000000..3782e3b
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidget.h
@@ -0,0 +1,187 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFWIDGET_H_
+#define XFA_FXFA_APP_XFA_FFWIDGET_H_
+
+#include <vector>
+
+#include "core/include/fxcodec/fx_codec_def.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FFPageView;
+class CXFA_FFDocView;
+class CXFA_FFDoc;
+class CXFA_FFApp;
+
+inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) {
+  return fPx * 72.0f / fDpi;
+}
+#define XFA_FLOAT_PERCISION 0.001f
+enum XFA_WIDGETITEM {
+  XFA_WIDGETITEM_Parent,
+  XFA_WIDGETITEM_FirstChild,
+  XFA_WIDGETITEM_NextSibling,
+  XFA_WIDGETITEM_PrevSibling,
+};
+class CXFA_CalcData {
+ public:
+  CXFA_CalcData() : m_iRefCount(0) {}
+  ~CXFA_CalcData() { m_Globals.RemoveAll(); }
+  CFX_PtrArray m_Globals;
+  int32_t m_iRefCount;
+};
+class CXFA_FFWidget : public IXFA_Widget,
+                      public CFX_PrivateData,
+                      public CXFA_ContentLayoutItem {
+ public:
+  CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
+  virtual ~CXFA_FFWidget();
+  IXFA_PageView* GetPageView();
+  void SetPageView(IXFA_PageView* pPageView);
+  void GetWidgetRect(CFX_RectF& rtWidget);
+  CFX_RectF ReCacheWidgetRect();
+  FX_DWORD GetStatus();
+  void ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved);
+  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
+                          FX_DWORD dwStatus,
+                          FX_BOOL bDrawFocus = FALSE);
+  CXFA_WidgetAcc* GetDataAcc();
+  FX_BOOL GetToolTip(CFX_WideString& wsToolTip);
+  virtual void RenderWidget(CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_DWORD dwStatus = 0,
+                            int32_t iRotate = 0);
+
+  virtual FX_BOOL IsLoaded();
+  virtual FX_BOOL LoadWidget();
+  virtual void UnloadWidget();
+  virtual FX_BOOL PerformLayout();
+  virtual FX_BOOL UpdateFWLData();
+  virtual void UpdateWidgetProperty();
+  virtual FX_BOOL OnMouseEnter();
+  virtual FX_BOOL OnMouseExit();
+  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
+                               int16_t zDelta,
+                               FX_FLOAT fx,
+                               FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+
+  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
+  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
+  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
+  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
+  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL CanUndo() { return FALSE; }
+  virtual FX_BOOL CanRedo() { return FALSE; }
+  virtual FX_BOOL Undo() { return FALSE; }
+  virtual FX_BOOL Redo() { return FALSE; }
+  virtual FX_BOOL CanCopy() { return FALSE; }
+  virtual FX_BOOL CanCut() { return FALSE; }
+  virtual FX_BOOL CanPaste() { return FALSE; }
+  virtual FX_BOOL CanSelectAll() { return FALSE; }
+  virtual FX_BOOL CanDelete() { return CanCut(); }
+  virtual FX_BOOL CanDeSelect() { return CanCopy(); }
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy) { return FALSE; }
+  virtual FX_BOOL Cut(CFX_WideString& wsCut) { return FALSE; }
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste) { return FALSE; }
+  virtual FX_BOOL SelectAll() { return FALSE; }
+  virtual FX_BOOL Delete() { return FALSE; }
+  virtual FX_BOOL DeSelect() { return FALSE; }
+  virtual FX_BOOL GetSuggestWords(CFX_PointF pointf,
+                                  std::vector<CFX_ByteString>& sSuggest) {
+    return FALSE;
+  }
+  virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
+                                        const CFX_ByteStringC& bsReplace) {
+    return FALSE;
+  }
+  CXFA_FFDocView* GetDocView();
+  void SetDocView(CXFA_FFDocView* pDocView) { m_pDocView = pDocView; }
+  CXFA_FFDoc* GetDoc();
+  CXFA_FFApp* GetApp();
+  IXFA_AppProvider* GetAppProvider();
+  void InvalidateWidget(const CFX_RectF* pRect = NULL);
+  void AddInvalidateRect(const CFX_RectF* pRect = NULL);
+  FX_BOOL GetCaptionText(CFX_WideString& wsCap);
+  FX_BOOL IsFocused();
+  void Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy);
+  void GetRotateMatrix(CFX_Matrix& mt);
+  FX_BOOL IsLayoutRectEmpty();
+  CXFA_FFWidget* GetParent();
+  FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget);
+
+ protected:
+  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+  void DrawBorder(CFX_Graphics* pGS,
+                  CXFA_Box box,
+                  const CFX_RectF& rtBorder,
+                  CFX_Matrix* pMatrix,
+                  FX_DWORD dwFlags = 0);
+  void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth);
+  void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight);
+  void GetRectWithoutRotate(CFX_RectF& rtWidget);
+  FX_BOOL IsMatchVisibleStatus(FX_DWORD dwStatus);
+
+  void EventKillFocus();
+  FX_BOOL IsButtonDown();
+  void SetButtonDown(FX_BOOL bSet);
+  CXFA_FFDocView* m_pDocView;
+  CXFA_FFPageView* m_pPageView;
+  CXFA_WidgetAcc* m_pDataAcc;
+  CFX_RectF m_rtWidget;
+};
+int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
+                                  int32_t iStrokeType,
+                                  int32_t iCapType);
+CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap);
+void XFA_DrawImage(CFX_Graphics* pGS,
+                   const CFX_RectF& rtImage,
+                   CFX_Matrix* pMatrix,
+                   CFX_DIBitmap* pDIBitmap,
+                   int32_t iAspect,
+                   int32_t iImageXDpi,
+                   int32_t iImageYDpi,
+                   int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left,
+                   int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top);
+CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc,
+                                CXFA_Image* pImage,
+                                FX_BOOL& bNameImage,
+                                int32_t& iImageXDpi,
+                                int32_t& iImageYDpi);
+CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead,
+                                      FXCODEC_IMAGE_TYPE type,
+                                      int32_t& iImageXDpi,
+                                      int32_t& iImageYDpi);
+FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType);
+FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len);
+void XFA_RectWidthoutMargin(CFX_RectF& rt,
+                            const CXFA_Margin& mg,
+                            FX_BOOL bUI = FALSE);
+FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
+                              FX_BOOL b3DStyle,
+                              int32_t nIndex);
+CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem);
+FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType);
+#define XFA_DRAWBOX_ForceRound 1
+#define XFA_DRAWBOX_Lowered3D 2
+void XFA_DrawBox(CXFA_Box box,
+                 CFX_Graphics* pGS,
+                 const CFX_RectF& rtWidget,
+                 CFX_Matrix* pMatrix,
+                 FX_DWORD dwFlags = 0);
+
+#endif  // XFA_FXFA_APP_XFA_FFWIDGET_H_
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.cpp b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
new file mode 100644
index 0000000..500235d
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.cpp
@@ -0,0 +1,1714 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffwidgetacc.h"
+
+#include <algorithm>
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffpageview.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fontmgr.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/app/xfa_textlayout.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+static void XFA_FFDeleteCalcData(void* pData) {
+  if (pData) {
+    delete ((CXFA_CalcData*)pData);
+  }
+}
+static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteCalcData = {
+    XFA_FFDeleteCalcData, NULL};
+class CXFA_WidgetLayoutData {
+ public:
+  CXFA_WidgetLayoutData() : m_fWidgetHeight(-1) {}
+  virtual ~CXFA_WidgetLayoutData() {}
+  virtual void Release() { delete this; }
+  FX_FLOAT m_fWidgetHeight;
+};
+class CXFA_TextLayoutData : public CXFA_WidgetLayoutData {
+ public:
+  CXFA_TextLayoutData() : m_pTextLayout(NULL), m_pTextProvider(NULL) {}
+  ~CXFA_TextLayoutData() {
+    if (m_pTextLayout) {
+      delete m_pTextLayout;
+    }
+    m_pTextLayout = NULL;
+    if (m_pTextProvider) {
+      delete m_pTextProvider;
+    }
+    m_pTextProvider = NULL;
+  }
+  void LoadText(CXFA_WidgetAcc* pAcc) {
+    if (m_pTextLayout)
+      return;
+
+    m_pTextProvider = new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Text);
+    m_pTextLayout = new CXFA_TextLayout(m_pTextProvider);
+  }
+  CXFA_TextLayout* m_pTextLayout;
+  CXFA_TextProvider* m_pTextProvider;
+};
+class CXFA_ImageLayoutData : public CXFA_WidgetLayoutData {
+ public:
+  CXFA_ImageLayoutData()
+      : m_pDIBitmap(NULL),
+        m_bNamedImage(FALSE),
+        m_iImageXDpi(0),
+        m_iImageYDpi(0) {}
+
+  ~CXFA_ImageLayoutData() {
+    if (m_pDIBitmap && !m_bNamedImage) {
+      delete m_pDIBitmap;
+    }
+    m_pDIBitmap = NULL;
+  }
+
+  FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
+    if (m_pDIBitmap) {
+      return TRUE;
+    }
+    CXFA_Value value = pAcc->GetFormValue();
+    if (!value) {
+      return FALSE;
+    }
+    CXFA_Image imageObj = value.GetImage();
+    if (!imageObj) {
+      return FALSE;
+    }
+    CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
+    pAcc->SetImageImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
+                                          m_iImageXDpi, m_iImageYDpi));
+    return m_pDIBitmap != NULL;
+  }
+
+  CFX_DIBitmap* m_pDIBitmap;
+  FX_BOOL m_bNamedImage;
+  int32_t m_iImageXDpi;
+  int32_t m_iImageYDpi;
+};
+class CXFA_FieldLayoutData : public CXFA_WidgetLayoutData {
+ public:
+  CXFA_FieldLayoutData()
+      : m_pCapTextLayout(NULL),
+        m_pCapTextProvider(NULL),
+        m_pTextOut(NULL),
+        m_pFieldSplitArray(NULL) {}
+  ~CXFA_FieldLayoutData() {
+    if (m_pCapTextLayout) {
+      delete m_pCapTextLayout;
+    }
+    m_pCapTextLayout = NULL;
+    if (m_pCapTextProvider) {
+      delete m_pCapTextProvider;
+    }
+    m_pCapTextProvider = NULL;
+    if (m_pTextOut) {
+      m_pTextOut->Release();
+    }
+    m_pTextOut = NULL;
+    if (m_pFieldSplitArray) {
+      m_pFieldSplitArray->RemoveAll();
+      delete m_pFieldSplitArray;
+      m_pFieldSplitArray = NULL;
+    }
+  }
+  FX_BOOL LoadCaption(CXFA_WidgetAcc* pAcc) {
+    if (m_pCapTextLayout) {
+      return TRUE;
+    }
+    CXFA_Caption caption = pAcc->GetCaption();
+    if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
+      m_pCapTextProvider =
+          new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Caption);
+      m_pCapTextLayout = new CXFA_TextLayout(m_pCapTextProvider);
+      return TRUE;
+    }
+    return FALSE;
+  }
+  CXFA_TextLayout* m_pCapTextLayout;
+  CXFA_TextProvider* m_pCapTextProvider;
+  IFDE_TextOut* m_pTextOut;
+  CFX_FloatArray* m_pFieldSplitArray;
+};
+class CXFA_TextEditData : public CXFA_FieldLayoutData {
+ public:
+};
+class CXFA_ImageEditData : public CXFA_FieldLayoutData {
+ public:
+  CXFA_ImageEditData()
+      : m_pDIBitmap(NULL),
+        m_bNamedImage(FALSE),
+        m_iImageXDpi(0),
+        m_iImageYDpi(0) {}
+
+  ~CXFA_ImageEditData() {
+    if (m_pDIBitmap && !m_bNamedImage) {
+      delete m_pDIBitmap;
+    }
+    m_pDIBitmap = NULL;
+  }
+  FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
+    if (m_pDIBitmap) {
+      return TRUE;
+    }
+    CXFA_Value value = pAcc->GetFormValue();
+    if (!value) {
+      return FALSE;
+    }
+    CXFA_Image imageObj = value.GetImage();
+    CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
+    pAcc->SetImageEditImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
+                                              m_iImageXDpi, m_iImageYDpi));
+    return m_pDIBitmap != NULL;
+  }
+  CFX_DIBitmap* m_pDIBitmap;
+  FX_BOOL m_bNamedImage;
+  int32_t m_iImageXDpi;
+  int32_t m_iImageYDpi;
+};
+CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode)
+    : CXFA_WidgetData(pNode),
+      m_pDocView(pDocView),
+      m_pLayoutData(NULL),
+      m_nRecursionDepth(0) {}
+CXFA_WidgetAcc::~CXFA_WidgetAcc() {
+  if (m_pLayoutData) {
+    m_pLayoutData->Release();
+    m_pLayoutData = NULL;
+  }
+}
+FX_BOOL CXFA_WidgetAcc::GetName(CFX_WideString& wsName, int32_t iNameType) {
+  if (iNameType == 0) {
+    m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+    return !wsName.IsEmpty();
+  }
+  m_pNode->GetSOMExpression(wsName);
+  if (iNameType == 2 && wsName.GetLength() >= 15) {
+    CFX_WideStringC wsPre = FX_WSTRC(L"xfa[0].form[0].");
+    if (wsPre == CFX_WideStringC(wsName, wsPre.GetLength())) {
+      wsName.Delete(0, wsPre.GetLength());
+    }
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_WidgetAcc::GetDatasets() {
+  return m_pNode->GetBindData();
+}
+FX_BOOL CXFA_WidgetAcc::ProcessValueChanged() {
+  m_pDocView->AddValidateWidget(this);
+  m_pDocView->AddCalculateWidgetAcc(this);
+  m_pDocView->RunCalculateWidgets();
+  m_pDocView->RunValidate();
+  return TRUE;
+}
+void CXFA_WidgetAcc::ResetData() {
+  CFX_WideString wsValue;
+  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
+  switch (eUIType) {
+    case XFA_ELEMENT_ImageEdit: {
+      CXFA_Value imageValue = GetDefaultValue();
+      CXFA_Image image = imageValue.GetImage();
+      CFX_WideString wsContentType, wsHref;
+      if (image) {
+        image.GetContent(wsValue);
+        image.GetContentType(wsContentType);
+        image.GetHref(wsHref);
+      }
+      SetImageEdit(wsContentType, wsHref, wsValue);
+    } break;
+    case XFA_ELEMENT_ExclGroup: {
+      CXFA_Node* pNextChild = m_pNode->GetNodeItem(
+          XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
+      while (pNextChild) {
+        CXFA_Node* pChild = pNextChild;
+        CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pChild->GetWidgetData();
+        if (!pAcc) {
+          continue;
+        }
+        CXFA_Value defValue(NULL);
+        if (wsValue.IsEmpty() && (defValue = pAcc->GetDefaultValue())) {
+          defValue.GetChildValueContent(wsValue);
+          SetValue(wsValue, XFA_VALUEPICTURE_Raw);
+          pAcc->SetValue(wsValue, XFA_VALUEPICTURE_Raw);
+        } else {
+          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
+          if (!pItems) {
+            continue;
+          }
+          CFX_WideString itemText;
+          if (pItems->CountChildren(XFA_ELEMENT_UNKNOWN) > 1) {
+            itemText = pItems->GetChild(1, XFA_ELEMENT_UNKNOWN)->GetContent();
+          }
+          pAcc->SetValue(itemText, XFA_VALUEPICTURE_Raw);
+        }
+        pNextChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling,
+                                         XFA_OBJECTTYPE_ContainerNode);
+      }
+    } break;
+    case XFA_ELEMENT_ChoiceList:
+      ClearAllSelections();
+    default:
+      if (CXFA_Value defValue = GetDefaultValue()) {
+        defValue.GetChildValueContent(wsValue);
+      }
+      SetValue(wsValue, XFA_VALUEPICTURE_Raw);
+      break;
+  }
+}
+void CXFA_WidgetAcc::SetImageEdit(const CFX_WideStringC& wsContentType,
+                                  const CFX_WideStringC& wsHref,
+                                  const CFX_WideStringC& wsData) {
+  CXFA_Image image = GetFormValue().GetImage();
+  if (image) {
+    image.SetContentType(wsContentType);
+    image.SetHref(wsHref);
+  }
+  CFX_WideString wsFormatValue(wsData);
+  GetFormatDataValue(wsData, wsFormatValue);
+  m_pNode->SetContent(wsData, wsFormatValue, TRUE);
+  CXFA_Node* pBind = GetDatasets();
+  if (!pBind) {
+    image.SetTransferEncoding(XFA_ATTRIBUTEENUM_Base64);
+    return;
+  }
+  pBind->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+  CXFA_Node* pHrefNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (pHrefNode) {
+    pHrefNode->SetCData(XFA_ATTRIBUTE_Value, wsHref);
+  } else {
+    IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
+    FXSYS_assert(pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element);
+    ((IFDE_XMLElement*)pXMLNode)->SetString(FX_WSTRC(L"href"), wsHref);
+  }
+}
+
+CXFA_WidgetAcc* CXFA_WidgetAcc::GetExclGroup() {
+  CXFA_Node* pExcl = m_pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
+    return NULL;
+  }
+  return (CXFA_WidgetAcc*)pExcl->GetWidgetData();
+}
+CXFA_FFDocView* CXFA_WidgetAcc::GetDocView() {
+  return m_pDocView;
+}
+CXFA_FFDoc* CXFA_WidgetAcc::GetDoc() {
+  return (CXFA_FFDoc*)m_pDocView->GetDoc();
+}
+CXFA_FFApp* CXFA_WidgetAcc::GetApp() {
+  return GetDoc()->GetApp();
+}
+IXFA_AppProvider* CXFA_WidgetAcc::GetAppProvider() {
+  return GetApp()->GetAppProvider();
+}
+int32_t CXFA_WidgetAcc::ProcessEvent(int32_t iActivity,
+                                     CXFA_EventParam* pEventParam) {
+  if (GetClassID() == XFA_ELEMENT_Draw) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  int32_t iRet = XFA_EVENTERROR_NotExist;
+  CXFA_NodeArray eventArray;
+  int32_t iCounts =
+      GetEventByActivity(iActivity, eventArray, pEventParam->m_bIsFormReady);
+  for (int32_t i = 0; i < iCounts; i++) {
+    CXFA_Event event(eventArray[i]);
+    int32_t result = ProcessEvent(event, pEventParam);
+    if (i == 0) {
+      iRet = result;
+    } else if (result == XFA_EVENTERROR_Sucess) {
+      iRet = result;
+    }
+  }
+  return iRet;
+}
+int32_t CXFA_WidgetAcc::ProcessEvent(CXFA_Event& event,
+                                     CXFA_EventParam* pEventParam) {
+  if (!event) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  switch (event.GetEventType()) {
+    case XFA_ELEMENT_Execute:
+      break;
+    case XFA_ELEMENT_Script: {
+      CXFA_Script script = event.GetScript();
+      return ExecuteScript(script, pEventParam);
+    } break;
+    case XFA_ELEMENT_SignData:
+      break;
+    case XFA_ELEMENT_Submit: {
+      CXFA_Submit submit = event.GetSubmit();
+      return GetDoc()->GetDocProvider()->SubmitData(GetDoc(), submit);
+    }
+    default:
+      break;
+  }
+  return XFA_EVENTERROR_NotExist;
+}
+int32_t CXFA_WidgetAcc::ProcessCalculate() {
+  if (GetClassID() == XFA_ELEMENT_Draw) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  CXFA_Calculate calc = GetCalculate();
+  if (!calc) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+    return XFA_EVENTERROR_Disabled;
+  }
+  CXFA_EventParam EventParam;
+  EventParam.m_eType = XFA_EVENT_Calculate;
+  CXFA_Script script = calc.GetScript();
+  int32_t iRet = ExecuteScript(script, &EventParam);
+  if (iRet == XFA_EVENTERROR_Sucess) {
+    if (GetRawValue() != EventParam.m_wsResult) {
+      const bool bNotify = GetDoc()->GetDocType() == XFA_DOCTYPE_Static;
+      SetValue(EventParam.m_wsResult, XFA_VALUEPICTURE_Raw);
+      UpdateUIDisplay();
+      if (bNotify) {
+        NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL);
+      }
+      iRet = XFA_EVENTERROR_Sucess;
+    }
+  }
+  return iRet;
+}
+void CXFA_WidgetAcc::ProcessScriptTestValidate(CXFA_Validate validate,
+                                               int32_t iRet,
+                                               FXJSE_HVALUE pRetValue,
+                                               FX_BOOL bVersionFlag) {
+  if (iRet == XFA_EVENTERROR_Sucess && pRetValue) {
+    if (FXJSE_Value_IsBoolean(pRetValue) && !FXJSE_Value_ToBoolean(pRetValue)) {
+      IXFA_AppProvider* pAppProvider = GetAppProvider();
+      if (!pAppProvider) {
+        return;
+      }
+      CFX_WideString wsTitle;
+      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
+      CFX_WideString wsScriptMsg;
+      validate.GetScriptMessageText(wsScriptMsg);
+      int32_t eScriptTest = validate.GetScriptTest();
+      if (eScriptTest == XFA_ATTRIBUTEENUM_Warning) {
+        if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+          return;
+        }
+        if (wsScriptMsg.IsEmpty()) {
+          GetValidateMessage(pAppProvider, wsScriptMsg, FALSE, bVersionFlag);
+        }
+        if (bVersionFlag) {
+          pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
+                               XFA_MB_OK);
+          return;
+        }
+        if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
+                                 XFA_MB_YesNo) == XFA_IDYes) {
+          GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
+        }
+      } else {
+        if (wsScriptMsg.IsEmpty()) {
+          GetValidateMessage(pAppProvider, wsScriptMsg, TRUE, bVersionFlag);
+        }
+        pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
+      }
+    }
+  }
+}
+int32_t CXFA_WidgetAcc::ProcessFormatTestValidate(CXFA_Validate validate,
+                                                  FX_BOOL bVersionFlag) {
+  CFX_WideString wsRawValue = GetRawValue();
+  if (!wsRawValue.IsEmpty()) {
+    CFX_WideString wsPicture;
+    validate.GetPicture(wsPicture);
+    if (wsPicture.IsEmpty()) {
+      return XFA_EVENTERROR_NotExist;
+    }
+    IFX_Locale* pLocale = GetLocal();
+    if (!pLocale) {
+      return XFA_EVENTERROR_NotExist;
+    }
+    CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this);
+    if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale)) {
+      IXFA_AppProvider* pAppProvider = GetAppProvider();
+      if (!pAppProvider) {
+        return XFA_EVENTERROR_NotExist;
+      }
+      CFX_WideString wsFormatMsg;
+      validate.GetFormatMessageText(wsFormatMsg);
+      CFX_WideString wsTitle;
+      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
+      int32_t eFormatTest = validate.GetFormatTest();
+      if (eFormatTest == XFA_ATTRIBUTEENUM_Error) {
+        if (wsFormatMsg.IsEmpty()) {
+          GetValidateMessage(pAppProvider, wsFormatMsg, TRUE, bVersionFlag);
+        }
+        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
+        return XFA_EVENTERROR_Sucess;
+      }
+      if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+        return XFA_EVENTERROR_NotExist;
+      }
+      if (wsFormatMsg.IsEmpty()) {
+        GetValidateMessage(pAppProvider, wsFormatMsg, FALSE, bVersionFlag);
+      }
+      if (bVersionFlag) {
+        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
+                             XFA_MB_OK);
+        return XFA_EVENTERROR_Sucess;
+      }
+      if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
+                               XFA_MB_YesNo) == XFA_IDYes) {
+        GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
+      }
+      return XFA_EVENTERROR_Sucess;
+    }
+  }
+  return XFA_EVENTERROR_NotExist;
+}
+int32_t CXFA_WidgetAcc::ProcessNullTestValidate(CXFA_Validate validate,
+                                                int32_t iFlags,
+                                                FX_BOOL bVersionFlag) {
+  CFX_WideString wsValue;
+  GetValue(wsValue, XFA_VALUEPICTURE_Raw);
+  if (!wsValue.IsEmpty()) {
+    return XFA_EVENTERROR_Sucess;
+  }
+  if (m_bIsNull && (m_bPreNull == m_bIsNull)) {
+    return XFA_EVENTERROR_Sucess;
+  }
+  int32_t eNullTest = validate.GetNullTest();
+  CFX_WideString wsNullMsg;
+  validate.GetNullMessageText(wsNullMsg);
+  if (iFlags & 0x01) {
+    int32_t iRet = XFA_EVENTERROR_Sucess;
+    if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
+      iRet = XFA_EVENTERROR_Error;
+    }
+    if (!wsNullMsg.IsEmpty()) {
+      if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
+        m_pDocView->m_arrNullTestMsg.Add(wsNullMsg);
+        return XFA_EVENTERROR_Error;
+      }
+      return XFA_EVENTERROR_Sucess;
+    }
+    return iRet;
+  }
+  if (wsNullMsg.IsEmpty() && bVersionFlag &&
+      eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
+    return XFA_EVENTERROR_Error;
+  }
+  IXFA_AppProvider* pAppProvider = GetAppProvider();
+  if (!pAppProvider) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  CFX_WideString wsCaptionName;
+  CFX_WideString wsTitle;
+  pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
+  switch (eNullTest) {
+    case XFA_ATTRIBUTEENUM_Error: {
+      if (wsNullMsg.IsEmpty()) {
+        GetValidateCaptionName(wsCaptionName, bVersionFlag);
+        CFX_WideString wsError;
+        pAppProvider->LoadString(XFA_IDS_ValidateNullError, wsError);
+        wsNullMsg.Format(wsError, (const FX_WCHAR*)wsCaptionName);
+      }
+      pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
+      return XFA_EVENTERROR_Error;
+    }
+    case XFA_ATTRIBUTEENUM_Warning: {
+      if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+        return TRUE;
+      }
+      if (wsNullMsg.IsEmpty()) {
+        GetValidateCaptionName(wsCaptionName, bVersionFlag);
+        CFX_WideString wsWarning;
+        pAppProvider->LoadString(XFA_IDS_ValidateNullWarning, wsWarning);
+        wsNullMsg.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
+                         (const FX_WCHAR*)wsCaptionName);
+      }
+      if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning,
+                               XFA_MB_YesNo) == XFA_IDYes) {
+        GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
+      }
+      return XFA_EVENTERROR_Error;
+    }
+    case XFA_ATTRIBUTEENUM_Disabled:
+    default:
+      break;
+  }
+  return XFA_EVENTERROR_Sucess;
+}
+void CXFA_WidgetAcc::GetValidateCaptionName(CFX_WideString& wsCaptionName,
+                                            FX_BOOL bVersionFlag) {
+  if (!bVersionFlag) {
+    CXFA_Caption caption = GetCaption();
+    if (caption) {
+      CXFA_Value capValue = caption.GetValue();
+      if (capValue) {
+        CXFA_Text capText = capValue.GetText();
+        if (capText) {
+          capText.GetContent(wsCaptionName);
+        }
+      }
+    }
+  }
+  if (wsCaptionName.IsEmpty()) {
+    GetName(wsCaptionName);
+  }
+}
+void CXFA_WidgetAcc::GetValidateMessage(IXFA_AppProvider* pAppProvider,
+                                        CFX_WideString& wsMessage,
+                                        FX_BOOL bError,
+                                        FX_BOOL bVersionFlag) {
+  CFX_WideString wsCaptionName;
+  GetValidateCaptionName(wsCaptionName, bVersionFlag);
+  CFX_WideString wsError;
+  if (bVersionFlag) {
+    pAppProvider->LoadString(XFA_IDS_ValidateFailed, wsError);
+    wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
+    return;
+  }
+  if (bError) {
+    pAppProvider->LoadString(XFA_IDS_ValidateError, wsError);
+    wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
+    return;
+  }
+  CFX_WideString wsWarning;
+  pAppProvider->LoadString(XFA_IDS_ValidateWarning, wsWarning);
+  wsMessage.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
+                   (const FX_WCHAR*)wsCaptionName);
+}
+int32_t CXFA_WidgetAcc::ProcessValidate(int32_t iFlags) {
+  if (GetClassID() == XFA_ELEMENT_Draw) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  CXFA_Validate validate = GetValidate();
+  if (!validate) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  FX_BOOL bInitDoc = validate.GetNode()->HasFlag(XFA_NODEFLAG_NeedsInitApp);
+  FX_BOOL bStatus =
+      m_pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End;
+  int32_t iFormat = 0;
+  FXJSE_HVALUE pRetValue = NULL;
+  int32_t iRet = XFA_EVENTERROR_NotExist;
+  CXFA_Script script = validate.GetScript();
+  if (script) {
+    CXFA_EventParam eParam;
+    eParam.m_eType = XFA_EVENT_Validate;
+    eParam.m_pTarget = this;
+    iRet = ExecuteScript(script, &eParam,
+                         ((bInitDoc || bStatus) && GetRawValue().IsEmpty())
+                             ? nullptr
+                             : &pRetValue);
+  }
+  XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
+  FX_BOOL bVersionFlag = FALSE;
+  if (version < XFA_VERSION_208) {
+    bVersionFlag = TRUE;
+  }
+  if (bInitDoc) {
+    validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, FALSE, FALSE);
+  } else {
+    iFormat = ProcessFormatTestValidate(validate, bVersionFlag);
+    if (!bVersionFlag) {
+      bVersionFlag = GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting);
+    }
+    iRet |= ProcessNullTestValidate(validate, iFlags, bVersionFlag);
+  }
+  if (iFormat != XFA_EVENTERROR_Sucess) {
+    ProcessScriptTestValidate(validate, iRet, pRetValue, bVersionFlag);
+  }
+  if (pRetValue) {
+    FXJSE_Value_Release(pRetValue);
+  }
+  return iRet | iFormat;
+}
+int32_t CXFA_WidgetAcc::ExecuteScript(CXFA_Script script,
+                                      CXFA_EventParam* pEventParam,
+                                      FXJSE_HVALUE* pRetValue) {
+  static const uint32_t MAX_RECURSION_DEPTH = 2;
+  if (m_nRecursionDepth > MAX_RECURSION_DEPTH)
+    return XFA_EVENTERROR_Sucess;
+  FXSYS_assert(pEventParam);
+  if (!script) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  if (script.GetRunAt() == XFA_ATTRIBUTEENUM_Server) {
+    return XFA_EVENTERROR_Disabled;
+  }
+  CFX_WideString wsExpression;
+  script.GetExpression(wsExpression);
+  if (wsExpression.IsEmpty()) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  XFA_SCRIPTTYPE eScriptType = script.GetContentType();
+  if (eScriptType == XFA_SCRIPTTYPE_Unkown) {
+    return XFA_EVENTERROR_Sucess;
+  }
+  CXFA_FFDoc* pDoc = GetDoc();
+  IXFA_ScriptContext* pContext = pDoc->GetXFADoc()->GetScriptContext();
+  pContext->SetEventParam(*pEventParam);
+  pContext->SetRunAtType((XFA_ATTRIBUTEENUM)script.GetRunAt());
+  CXFA_NodeArray refNodes;
+  if (pEventParam->m_eType == XFA_EVENT_InitCalculate ||
+      pEventParam->m_eType == XFA_EVENT_Calculate) {
+    pContext->SetNodesOfRunScript(&refNodes);
+  }
+  FXJSE_HVALUE hRetValue = FXJSE_Value_Create(pContext->GetRuntime());
+  ++m_nRecursionDepth;
+  FX_BOOL bRet = pContext->RunScript((XFA_SCRIPTLANGTYPE)eScriptType,
+                                     wsExpression, hRetValue, m_pNode);
+  --m_nRecursionDepth;
+  int32_t iRet = XFA_EVENTERROR_Error;
+  if (bRet) {
+    iRet = XFA_EVENTERROR_Sucess;
+    if (pEventParam->m_eType == XFA_EVENT_Calculate ||
+        pEventParam->m_eType == XFA_EVENT_InitCalculate) {
+      if (!FXJSE_Value_IsUndefined(hRetValue)) {
+        if (!FXJSE_Value_IsNull(hRetValue)) {
+          CFX_ByteString bsString;
+          FXJSE_Value_ToUTF8String(hRetValue, bsString);
+          pEventParam->m_wsResult =
+              CFX_WideString::FromUTF8(bsString, bsString.GetLength());
+        }
+        iRet = XFA_EVENTERROR_Sucess;
+      } else {
+        iRet = XFA_EVENTERROR_Error;
+      }
+      if (pEventParam->m_eType == XFA_EVENT_InitCalculate) {
+        if ((iRet == XFA_EVENTERROR_Sucess) &&
+            (GetRawValue() != pEventParam->m_wsResult)) {
+          SetValue(pEventParam->m_wsResult, XFA_VALUEPICTURE_Raw);
+          m_pDocView->AddValidateWidget(this);
+        }
+      }
+      int32_t iRefs = refNodes.GetSize();
+      for (int32_t r = 0; r < iRefs; r++) {
+        CXFA_WidgetAcc* pRefAcc = (CXFA_WidgetAcc*)refNodes[r]->GetWidgetData();
+        if (pRefAcc && pRefAcc == this) {
+          continue;
+        }
+        CXFA_Node* pRefNode = refNodes[r];
+        CXFA_CalcData* pGlobalData =
+            (CXFA_CalcData*)pRefNode->GetUserData(XFA_CalcData);
+        if (!pGlobalData) {
+          pGlobalData = new CXFA_CalcData;
+          pRefNode->SetUserData(XFA_CalcData, pGlobalData,
+                                &gs_XFADeleteCalcData);
+        }
+        if (pGlobalData->m_Globals.Find(this) < 0) {
+          pGlobalData->m_Globals.Add(this);
+        }
+      }
+    }
+  }
+  if (pRetValue) {
+    *pRetValue = hRetValue;
+  } else {
+    FXJSE_Value_Release(hRetValue);
+  }
+  pContext->SetNodesOfRunScript(NULL);
+  return iRet;
+}
+CXFA_FFWidget* CXFA_WidgetAcc::GetNextWidget(CXFA_FFWidget* pWidget) {
+  CXFA_LayoutItem* pLayout = nullptr;
+  if (pWidget) {
+    pLayout = pWidget->GetNext();
+  } else {
+    pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(m_pNode);
+  }
+  return static_cast<CXFA_FFWidget*>(pLayout);
+}
+void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFWidget* pExcept) {
+  CXFA_FFWidget* pWidget = NULL;
+  while ((pWidget = GetNextWidget(pWidget))) {
+    if (pWidget == pExcept || !pWidget->IsLoaded() ||
+        (GetUIType() != XFA_ELEMENT_CheckButton && pWidget->IsFocused())) {
+      continue;
+    }
+    pWidget->UpdateFWLData();
+    pWidget->AddInvalidateRect();
+  }
+}
+void CXFA_WidgetAcc::NotifyEvent(FX_DWORD dwEvent,
+                                 CXFA_FFWidget* pWidget,
+                                 void* pParam,
+                                 void* pAdditional) {
+  IXFA_DocProvider* pDocProvider = GetDoc()->GetDocProvider();
+  if (pWidget) {
+    pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
+  } else {
+    pWidget = GetNextWidget(pWidget);
+    if (pWidget == NULL) {
+      pDocProvider->WidgetEvent(NULL, this, dwEvent, pParam, pAdditional);
+      return;
+    }
+    while (pWidget) {
+      pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
+      pWidget = GetNextWidget(pWidget);
+    }
+  }
+}
+void CXFA_WidgetAcc::CalcCaptionSize(CFX_SizeF& szCap) {
+  CXFA_Caption caption = GetCaption();
+  if (!caption || caption.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
+    return;
+  }
+  LoadCaption();
+  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
+  int32_t iCapPlacement = caption.GetPlacementType();
+  FX_FLOAT fCapReserve = caption.GetReserve();
+  const bool bVert = iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
+                     iCapPlacement == XFA_ATTRIBUTEENUM_Bottom;
+  const bool bReserveExit = fCapReserve > 0.01;
+  CXFA_TextLayout* pCapTextLayout =
+      ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout;
+  if (pCapTextLayout) {
+    if (!bVert && eUIType != XFA_ELEMENT_Button) {
+      szCap.x = fCapReserve;
+    }
+    CFX_SizeF minSize;
+    pCapTextLayout->CalcSize(minSize, szCap, szCap);
+    if (bReserveExit) {
+      bVert ? szCap.y = fCapReserve : szCap.x = fCapReserve;
+    }
+  } else {
+    FX_FLOAT fFontSize = 10.0f;
+    if (CXFA_Font font = caption.GetFont()) {
+      fFontSize = font.GetFontSize();
+    } else if (CXFA_Font widgetfont = GetFont()) {
+      fFontSize = widgetfont.GetFontSize();
+    }
+    if (bVert) {
+      szCap.y = fCapReserve > 0 ? fCapReserve : fFontSize;
+    } else {
+      szCap.x = fCapReserve > 0 ? fCapReserve : 0;
+      szCap.y = fFontSize;
+    }
+  }
+  if (CXFA_Margin mgCap = caption.GetMargin()) {
+    FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
+    mgCap.GetLeftInset(fLeftInset);
+    mgCap.GetTopInset(fTopInset);
+    mgCap.GetRightInset(fRightInset);
+    mgCap.GetBottomInset(fBottomInset);
+    if (bReserveExit) {
+      bVert ? (szCap.x += fLeftInset + fRightInset)
+            : (szCap.y += fTopInset + fBottomInset);
+    } else {
+      szCap.x += fLeftInset + fRightInset;
+      szCap.y += fTopInset + fBottomInset;
+    }
+  }
+}
+FX_BOOL CXFA_WidgetAcc::CalculateFieldAutoSize(CFX_SizeF& size) {
+  CFX_SizeF szCap;
+  CalcCaptionSize(szCap);
+  CFX_RectF rtUIMargin;
+  GetUIMargin(rtUIMargin);
+  size.x += rtUIMargin.left + rtUIMargin.width;
+  size.y += rtUIMargin.top + rtUIMargin.height;
+  if (szCap.x > 0 && szCap.y > 0) {
+    int32_t iCapPlacement = GetCaption().GetPlacementType();
+    switch (iCapPlacement) {
+      case XFA_ATTRIBUTEENUM_Left:
+      case XFA_ATTRIBUTEENUM_Right:
+      case XFA_ATTRIBUTEENUM_Inline: {
+        size.x += szCap.x;
+        size.y = std::max(size.y, szCap.y);
+      } break;
+      case XFA_ATTRIBUTEENUM_Top:
+      case XFA_ATTRIBUTEENUM_Bottom: {
+        size.y += szCap.y;
+        size.x = std::max(size.x, szCap.x);
+      }
+      default:
+        break;
+    }
+  }
+  return CalculateWidgetAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculateWidgetAutoSize(CFX_SizeF& size) {
+  CXFA_Margin mgWidget = GetMargin();
+  if (mgWidget) {
+    FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
+    mgWidget.GetLeftInset(fLeftInset);
+    mgWidget.GetTopInset(fTopInset);
+    mgWidget.GetRightInset(fRightInset);
+    mgWidget.GetBottomInset(fBottomInset);
+    size.x += fLeftInset + fRightInset;
+    size.y += fTopInset + fBottomInset;
+  }
+  CXFA_Para para = GetPara();
+  if (para) {
+    size.x += para.GetMarginLeft();
+    size.x += para.GetTextIndent();
+  }
+  FX_FLOAT fVal = 0, fMin = 0, fMax = 0;
+  if (GetWidth(fVal)) {
+    size.x = fVal;
+  } else {
+    if (GetMinWidth(fMin)) {
+      size.x = std::max(size.x, fMin);
+    }
+    if (GetMaxWidth(fMax) && fMax > 0) {
+      size.x = std::min(size.x, fMax);
+    }
+  }
+  fVal = 0, fMin = 0, fMax = 0;
+  if (GetHeight(fVal)) {
+    size.y = fVal;
+  } else {
+    if (GetMinHeight(fMin)) {
+      size.y = std::max(size.y, fMin);
+    }
+    if (GetMaxHeight(fMax) && fMax > 0) {
+      size.y = std::min(size.y, fMax);
+    }
+  }
+  return TRUE;
+}
+void CXFA_WidgetAcc::CalculateTextContentSize(CFX_SizeF& size) {
+  FX_FLOAT fFontSize = GetFontSize();
+  CFX_WideString wsText;
+  GetValue(wsText, XFA_VALUEPICTURE_Display);
+  if (wsText.IsEmpty()) {
+    size.y += fFontSize;
+    return;
+  }
+  FX_WCHAR wcEnter = '\n';
+  FX_WCHAR wsLast = wsText.GetAt(wsText.GetLength() - 1);
+  if (wsLast == wcEnter) {
+    wsText = wsText + wcEnter;
+  }
+  if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
+    ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut = IFDE_TextOut::Create();
+    IFDE_TextOut* pTextOut = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut;
+    pTextOut->SetFont(GetFDEFont());
+    pTextOut->SetFontSize(fFontSize);
+    pTextOut->SetLineBreakTolerance(fFontSize * 0.2f);
+    pTextOut->SetLineSpace(GetLineHeight());
+    FX_DWORD dwStyles = FDE_TTOSTYLE_LastLineHeight;
+    if (GetUIType() == XFA_ELEMENT_TextEdit && IsMultiLine()) {
+      dwStyles |= FDE_TTOSTYLE_LineWrap;
+    }
+    pTextOut->SetStyles(dwStyles);
+  }
+  ((CXFA_FieldLayoutData*)m_pLayoutData)
+      ->m_pTextOut->CalcLogicSize(wsText, wsText.GetLength(), size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculateTextEditAutoSize(CFX_SizeF& size) {
+  if (size.x > 0) {
+    CFX_SizeF szOrz = size;
+    CFX_SizeF szCap;
+    CalcCaptionSize(szCap);
+    FX_BOOL bCapExit = szCap.x > 0.01 && szCap.y > 0.01;
+    int32_t iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
+    if (bCapExit) {
+      iCapPlacement = GetCaption().GetPlacementType();
+      switch (iCapPlacement) {
+        case XFA_ATTRIBUTEENUM_Left:
+        case XFA_ATTRIBUTEENUM_Right:
+        case XFA_ATTRIBUTEENUM_Inline: {
+          size.x -= szCap.x;
+        }
+        default:
+          break;
+      }
+    }
+    CFX_RectF rtUIMargin;
+    GetUIMargin(rtUIMargin);
+    size.x -= rtUIMargin.left + rtUIMargin.width;
+    CXFA_Margin mgWidget = GetMargin();
+    if (mgWidget) {
+      FX_FLOAT fLeftInset, fRightInset;
+      mgWidget.GetLeftInset(fLeftInset);
+      mgWidget.GetRightInset(fRightInset);
+      size.x -= fLeftInset + fRightInset;
+    }
+    CalculateTextContentSize(size);
+    size.y += rtUIMargin.top + rtUIMargin.height;
+    if (bCapExit) {
+      switch (iCapPlacement) {
+        case XFA_ATTRIBUTEENUM_Left:
+        case XFA_ATTRIBUTEENUM_Right:
+        case XFA_ATTRIBUTEENUM_Inline: {
+          size.y = std::max(size.y, szCap.y);
+        } break;
+        case XFA_ATTRIBUTEENUM_Top:
+        case XFA_ATTRIBUTEENUM_Bottom: {
+          size.y += szCap.y;
+        }
+        default:
+          break;
+      }
+    }
+    size.x = szOrz.x;
+    return CalculateWidgetAutoSize(size);
+  }
+  CalculateTextContentSize(size);
+  return CalculateFieldAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculateCheckButtonAutoSize(CFX_SizeF& size) {
+  FX_FLOAT fCheckSize = GetCheckButtonSize();
+  size.x = size.y = fCheckSize;
+  return CalculateFieldAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculatePushButtonAutoSize(CFX_SizeF& size) {
+  CalcCaptionSize(size);
+  return CalculateWidgetAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculateImageAutoSize(CFX_SizeF& size) {
+  if (!GetImageImage()) {
+    LoadImageImage();
+  }
+  size.clear();
+  if (CFX_DIBitmap* pBitmap = GetImageImage()) {
+    CFX_RectF rtImage, rtFit;
+    rtImage.Set(0, 0, 0, 0);
+    rtFit.Set(0, 0, 0, 0);
+    int32_t iImageXDpi = 0;
+    int32_t iImageYDpi = 0;
+    GetImageDpi(iImageXDpi, iImageYDpi);
+    rtImage.width =
+        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
+    rtImage.height =
+        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
+    if (GetWidth(rtFit.width)) {
+      GetWidthWithoutMargin(rtFit.width);
+    } else {
+      rtFit.width = rtImage.width;
+    }
+    if (GetHeight(rtFit.height)) {
+      GetHeightWithoutMargin(rtFit.height);
+    } else {
+      rtFit.height = rtImage.height;
+    }
+    size.x = rtFit.width;
+    size.y = rtFit.height;
+  }
+  return CalculateWidgetAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::CalculateImageEditAutoSize(CFX_SizeF& size) {
+  if (!GetImageEditImage()) {
+    LoadImageEditImage();
+  }
+  size.clear();
+  if (CFX_DIBitmap* pBitmap = GetImageEditImage()) {
+    CFX_RectF rtImage, rtFit;
+    rtImage.Set(0, 0, 0, 0);
+    rtFit.Set(0, 0, 0, 0);
+    int32_t iImageXDpi = 0;
+    int32_t iImageYDpi = 0;
+    GetImageEditDpi(iImageXDpi, iImageYDpi);
+    rtImage.width =
+        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
+    rtImage.height =
+        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
+    if (GetWidth(rtFit.width)) {
+      GetWidthWithoutMargin(rtFit.width);
+    } else {
+      rtFit.width = rtImage.width;
+    }
+    if (GetHeight(rtFit.height)) {
+      GetHeightWithoutMargin(rtFit.height);
+    } else {
+      rtFit.height = rtImage.height;
+    }
+    size.x = rtFit.width;
+    size.y = rtFit.height;
+  }
+  return CalculateFieldAutoSize(size);
+}
+FX_BOOL CXFA_WidgetAcc::LoadImageImage() {
+  InitLayoutData();
+  return ((CXFA_ImageLayoutData*)m_pLayoutData)->LoadImageData(this);
+}
+FX_BOOL CXFA_WidgetAcc::LoadImageEditImage() {
+  InitLayoutData();
+  return ((CXFA_ImageEditData*)m_pLayoutData)->LoadImageData(this);
+}
+void CXFA_WidgetAcc::GetImageDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
+  iImageXDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageXDpi;
+  iImageYDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageYDpi;
+}
+void CXFA_WidgetAcc::GetImageEditDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
+  iImageXDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageXDpi;
+  iImageYDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageYDpi;
+}
+FX_BOOL CXFA_WidgetAcc::CalculateTextAutoSize(CFX_SizeF& size) {
+  LoadText();
+  CXFA_TextLayout* pTextLayout =
+      ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
+  if (pTextLayout) {
+    size.x = pTextLayout->StartLayout(size.x);
+    size.y = pTextLayout->GetLayoutHeight();
+  }
+  return CalculateWidgetAutoSize(size);
+}
+void CXFA_WidgetAcc::LoadText() {
+  InitLayoutData();
+  ((CXFA_TextLayoutData*)m_pLayoutData)->LoadText(this);
+}
+FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoWidth(FX_FLOAT fWidthCalc) {
+  CXFA_Margin mgWidget = GetMargin();
+  if (mgWidget) {
+    FX_FLOAT fLeftInset, fRightInset;
+    mgWidget.GetLeftInset(fLeftInset);
+    mgWidget.GetRightInset(fRightInset);
+    fWidthCalc += fLeftInset + fRightInset;
+  }
+  FX_FLOAT fMin = 0, fMax = 0;
+  if (GetMinWidth(fMin)) {
+    fWidthCalc = std::max(fWidthCalc, fMin);
+  }
+  if (GetMaxWidth(fMax) && fMax > 0) {
+    fWidthCalc = std::min(fWidthCalc, fMax);
+  }
+  return fWidthCalc;
+}
+FX_FLOAT CXFA_WidgetAcc::GetWidthWithoutMargin(FX_FLOAT fWidthCalc) {
+  CXFA_Margin mgWidget = GetMargin();
+  if (mgWidget) {
+    FX_FLOAT fLeftInset, fRightInset;
+    mgWidget.GetLeftInset(fLeftInset);
+    mgWidget.GetRightInset(fRightInset);
+    fWidthCalc -= fLeftInset + fRightInset;
+  }
+  return fWidthCalc;
+}
+FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoHeight(FX_FLOAT fHeightCalc) {
+  CXFA_Margin mgWidget = GetMargin();
+  if (mgWidget) {
+    FX_FLOAT fTopInset, fBottomInset;
+    mgWidget.GetTopInset(fTopInset);
+    mgWidget.GetBottomInset(fBottomInset);
+    fHeightCalc += fTopInset + fBottomInset;
+  }
+  FX_FLOAT fMin = 0, fMax = 0;
+  if (GetMinHeight(fMin)) {
+    fHeightCalc = std::max(fHeightCalc, fMin);
+  }
+  if (GetMaxHeight(fMax) && fMax > 0) {
+    fHeightCalc = std::min(fHeightCalc, fMax);
+  }
+  return fHeightCalc;
+}
+FX_FLOAT CXFA_WidgetAcc::GetHeightWithoutMargin(FX_FLOAT fHeightCalc) {
+  CXFA_Margin mgWidget = GetMargin();
+  if (mgWidget) {
+    FX_FLOAT fTopInset, fBottomInset;
+    mgWidget.GetTopInset(fTopInset);
+    mgWidget.GetBottomInset(fBottomInset);
+    fHeightCalc -= fTopInset + fBottomInset;
+  }
+  return fHeightCalc;
+}
+void CXFA_WidgetAcc::StartWidgetLayout(FX_FLOAT& fCalcWidth,
+                                       FX_FLOAT& fCalcHeight) {
+  InitLayoutData();
+  XFA_ELEMENT eUIType = GetUIType();
+  if (eUIType == XFA_ELEMENT_Text) {
+    m_pLayoutData->m_fWidgetHeight = -1;
+    GetHeight(m_pLayoutData->m_fWidgetHeight);
+    StartTextLayout(fCalcWidth, fCalcHeight);
+    return;
+  }
+  if (fCalcWidth > 0 && fCalcHeight > 0) {
+    return;
+  }
+  m_pLayoutData->m_fWidgetHeight = -1;
+  FX_FLOAT fWidth = 0;
+  if (fCalcWidth > 0 && fCalcHeight < 0) {
+    if (!GetHeight(fCalcHeight)) {
+      CalculateAccWidthAndHeight(eUIType, fCalcWidth, fCalcHeight);
+    }
+    m_pLayoutData->m_fWidgetHeight = fCalcHeight;
+    return;
+  }
+  if (fCalcWidth < 0 && fCalcHeight < 0) {
+    if (!GetWidth(fWidth) || !GetHeight(fCalcHeight)) {
+      CalculateAccWidthAndHeight(eUIType, fWidth, fCalcHeight);
+    }
+    fCalcWidth = fWidth;
+  }
+  m_pLayoutData->m_fWidgetHeight = fCalcHeight;
+}
+void CXFA_WidgetAcc::CalculateAccWidthAndHeight(XFA_ELEMENT eUIType,
+                                                FX_FLOAT& fWidth,
+                                                FX_FLOAT& fCalcHeight) {
+  CFX_SizeF sz(fWidth, m_pLayoutData->m_fWidgetHeight);
+  switch (eUIType) {
+    case XFA_ELEMENT_Barcode:
+    case XFA_ELEMENT_ChoiceList:
+    case XFA_ELEMENT_Signature:
+      CalculateFieldAutoSize(sz);
+      break;
+    case XFA_ELEMENT_ImageEdit:
+      CalculateImageEditAutoSize(sz);
+      break;
+    case XFA_ELEMENT_Button:
+      CalculatePushButtonAutoSize(sz);
+      break;
+    case XFA_ELEMENT_CheckButton:
+      CalculateCheckButtonAutoSize(sz);
+      break;
+    case XFA_ELEMENT_DateTimeEdit:
+    case XFA_ELEMENT_NumericEdit:
+    case XFA_ELEMENT_PasswordEdit:
+    case XFA_ELEMENT_TextEdit:
+      CalculateTextEditAutoSize(sz);
+      break;
+    case XFA_ELEMENT_Image:
+      CalculateImageAutoSize(sz);
+      break;
+    case XFA_ELEMENT_Arc:
+    case XFA_ELEMENT_Line:
+    case XFA_ELEMENT_Rectangle:
+    case XFA_ELEMENT_Subform:
+    case XFA_ELEMENT_ExclGroup:
+      CalculateWidgetAutoSize(sz);
+      break;
+    default:
+      break;
+  }
+  fWidth = sz.x;
+  m_pLayoutData->m_fWidgetHeight = sz.y;
+  fCalcHeight = sz.y;
+}
+FX_BOOL CXFA_WidgetAcc::FindSplitPos(int32_t iBlockIndex,
+                                     FX_FLOAT& fCalcHeight) {
+  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
+  if (eUIType == XFA_ELEMENT_Subform) {
+    return FALSE;
+  }
+  if (eUIType != XFA_ELEMENT_Text && eUIType != XFA_ELEMENT_TextEdit &&
+      eUIType != XFA_ELEMENT_NumericEdit &&
+      eUIType != XFA_ELEMENT_PasswordEdit) {
+    fCalcHeight = 0;
+    return TRUE;
+  }
+  FX_FLOAT fTopInset = 0;
+  FX_FLOAT fBottomInset = 0;
+  if (iBlockIndex == 0) {
+    CXFA_Margin mgWidget = GetMargin();
+    if (mgWidget) {
+      mgWidget.GetTopInset(fTopInset);
+      mgWidget.GetBottomInset(fBottomInset);
+    }
+    CFX_RectF rtUIMargin;
+    GetUIMargin(rtUIMargin);
+    fTopInset += rtUIMargin.top;
+    fBottomInset += rtUIMargin.width;
+  }
+  if (eUIType == XFA_ELEMENT_Text) {
+    FX_FLOAT fHeight = fCalcHeight;
+    if (iBlockIndex == 0) {
+      fCalcHeight = fCalcHeight - fTopInset;
+      if (fCalcHeight < 0) {
+        fCalcHeight = 0;
+      }
+    }
+    CXFA_TextLayout* pTextLayout =
+        ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
+    pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight,
+                          m_pLayoutData->m_fWidgetHeight - fTopInset);
+    if (fCalcHeight != 0) {
+      if (iBlockIndex == 0) {
+        fCalcHeight = fCalcHeight + fTopInset;
+      }
+      if (fabs(fHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+  XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
+  FX_FLOAT fCapReserve = 0;
+  if (iBlockIndex == 0) {
+    CXFA_Caption caption = GetCaption();
+    if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
+      iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType();
+      fCapReserve = caption.GetReserve();
+    }
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Top &&
+        fCalcHeight < fCapReserve + fTopInset) {
+      fCalcHeight = 0;
+      return TRUE;
+    }
+    if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom &&
+        m_pLayoutData->m_fWidgetHeight - fCapReserve - fBottomInset) {
+      fCalcHeight = 0;
+      return TRUE;
+    }
+    if (iCapPlacement != XFA_ATTRIBUTEENUM_Top) {
+      fCapReserve = 0;
+    }
+  }
+  int32_t iLinesCount = 0;
+  FX_FLOAT fHeight = m_pLayoutData->m_fWidgetHeight;
+  CFX_WideString wsText;
+  GetValue(wsText, XFA_VALUEPICTURE_Display);
+  if (wsText.IsEmpty()) {
+    iLinesCount = 1;
+  } else {
+    if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
+      FX_FLOAT fWidth = 0;
+      GetWidth(fWidth);
+      CalculateAccWidthAndHeight(eUIType, fWidth, fHeight);
+    }
+    iLinesCount =
+        ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut->GetTotalLines();
+  }
+  if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray) {
+    ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray =
+        new CFX_FloatArray;
+  }
+  CFX_FloatArray* pFieldArray =
+      ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray;
+  int32_t iFieldSplitCount = pFieldArray->GetSize();
+  for (int32_t i = 0; i < iBlockIndex * 3; i += 3) {
+    iLinesCount -= (int32_t)pFieldArray->GetAt(i + 1);
+    fHeight -= pFieldArray->GetAt(i + 2);
+  }
+  if (iLinesCount == 0) {
+    return FALSE;
+  }
+  FX_FLOAT fLineHeight = GetLineHeight();
+  FX_FLOAT fFontSize = GetFontSize();
+  FX_FLOAT fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize;
+  FX_FLOAT fSpaceAbove = 0;
+  FX_FLOAT fStartOffset = 0;
+  if (fHeight > 0.1f && iBlockIndex == 0) {
+    fStartOffset = fTopInset;
+    fHeight -= (fTopInset + fBottomInset);
+    if (CXFA_Para para = GetPara()) {
+      fSpaceAbove = para.GetSpaceAbove();
+      FX_FLOAT fSpaceBelow = para.GetSpaceBelow();
+      fHeight -= (fSpaceAbove + fSpaceBelow);
+      switch (para.GetVerticalAlign()) {
+        case XFA_ATTRIBUTEENUM_Top:
+          fStartOffset += fSpaceAbove;
+          break;
+        case XFA_ATTRIBUTEENUM_Middle:
+          fStartOffset += ((fHeight - fTextHeight) / 2 + fSpaceAbove);
+          break;
+        case XFA_ATTRIBUTEENUM_Bottom:
+          fStartOffset += (fHeight - fTextHeight + fSpaceAbove);
+          break;
+      }
+    }
+    if (fStartOffset < 0.1f) {
+      fStartOffset = 0;
+    }
+  }
+  for (int32_t i = iBlockIndex - 1; iBlockIndex > 0 && i < iBlockIndex; i++) {
+    fStartOffset = pFieldArray->GetAt(i * 3) - pFieldArray->GetAt(i * 3 + 2);
+    if (fStartOffset < 0.1f) {
+      fStartOffset = 0;
+    }
+  }
+  if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
+    pFieldArray->SetAt(0, fStartOffset);
+  } else {
+    pFieldArray->Add(fStartOffset);
+  }
+  XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
+  FX_BOOL bCanSplitNoContent = FALSE;
+  XFA_ATTRIBUTEENUM eLayoutMode;
+  GetNode()
+      ->GetNodeItem(XFA_NODEITEM_Parent)
+      ->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, TRUE);
+  if ((eLayoutMode == XFA_ATTRIBUTEENUM_Position ||
+       eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
+       eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
+       eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
+      version > XFA_VERSION_208) {
+    bCanSplitNoContent = TRUE;
+  }
+  if ((eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
+       eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
+       eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
+      version <= XFA_VERSION_208) {
+    if (fStartOffset < fCalcHeight) {
+      bCanSplitNoContent = TRUE;
+    } else {
+      fCalcHeight = 0;
+      return TRUE;
+    }
+  }
+  if (bCanSplitNoContent) {
+    if ((fCalcHeight - fTopInset - fSpaceAbove < fLineHeight)) {
+      fCalcHeight = 0;
+      return TRUE;
+    }
+    if (fStartOffset + XFA_FLOAT_PERCISION >= fCalcHeight) {
+      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
+        pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
+        pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
+      } else {
+        pFieldArray->Add(0);
+        pFieldArray->Add(fCalcHeight);
+      }
+      return FALSE;
+    }
+    if (fCalcHeight - fStartOffset < fLineHeight) {
+      fCalcHeight = fStartOffset;
+      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
+        pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
+        pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
+      } else {
+        pFieldArray->Add(0);
+        pFieldArray->Add(fCalcHeight);
+      }
+      return TRUE;
+    }
+    FX_FLOAT fTextNum =
+        fCalcHeight + XFA_FLOAT_PERCISION - fCapReserve - fStartOffset;
+    int32_t iLineNum =
+        (int32_t)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
+    if (iLineNum >= iLinesCount) {
+      if (fCalcHeight - fStartOffset - fTextHeight >= fFontSize) {
+        if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
+          pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLinesCount);
+          pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
+        } else {
+          pFieldArray->Add((FX_FLOAT)iLinesCount);
+          pFieldArray->Add(fCalcHeight);
+        }
+        return FALSE;
+      }
+      if (fHeight - fStartOffset - fTextHeight < fFontSize) {
+        iLineNum -= 1;
+        if (iLineNum == 0) {
+          fCalcHeight = 0;
+          return TRUE;
+        }
+      } else {
+        iLineNum = (int32_t)(fTextNum / fLineHeight);
+      }
+    }
+    if (iLineNum > 0) {
+      FX_FLOAT fSplitHeight =
+          iLineNum * fLineHeight + fCapReserve + fStartOffset;
+      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
+        pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLineNum);
+        pFieldArray->SetAt(iBlockIndex * 3 + 2, fSplitHeight);
+      } else {
+        pFieldArray->Add((FX_FLOAT)iLineNum);
+        pFieldArray->Add(fSplitHeight);
+      }
+      if (fabs(fSplitHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
+        return FALSE;
+      }
+      fCalcHeight = fSplitHeight;
+      return TRUE;
+    }
+  }
+  fCalcHeight = 0;
+  return TRUE;
+}
+void CXFA_WidgetAcc::InitLayoutData() {
+  if (m_pLayoutData) {
+    return;
+  }
+  switch (GetUIType()) {
+    case XFA_ELEMENT_Text:
+      m_pLayoutData = new CXFA_TextLayoutData;
+      return;
+    case XFA_ELEMENT_TextEdit:
+      m_pLayoutData = new CXFA_TextEditData;
+      return;
+    case XFA_ELEMENT_Image:
+      m_pLayoutData = new CXFA_ImageLayoutData;
+      return;
+    case XFA_ELEMENT_ImageEdit:
+      m_pLayoutData = new CXFA_ImageEditData;
+      return;
+    default:
+      break;
+  }
+  if (GetClassID() == XFA_ELEMENT_Field) {
+    m_pLayoutData = new CXFA_FieldLayoutData;
+  } else {
+    m_pLayoutData = new CXFA_WidgetLayoutData;
+  }
+}
+void CXFA_WidgetAcc::StartTextLayout(FX_FLOAT& fCalcWidth,
+                                     FX_FLOAT& fCalcHeight) {
+  LoadText();
+  CXFA_TextLayout* pTextLayout =
+      ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
+  FX_FLOAT fTextHeight = 0;
+  if (fCalcWidth > 0 && fCalcHeight > 0) {
+    FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
+    pTextLayout->StartLayout(fWidth);
+    fTextHeight = fCalcHeight;
+    fTextHeight = GetHeightWithoutMargin(fTextHeight);
+    pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
+    return;
+  }
+  if (fCalcWidth > 0 && fCalcHeight < 0) {
+    FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
+    pTextLayout->StartLayout(fWidth);
+  }
+  if (fCalcWidth < 0 && fCalcHeight < 0) {
+    FX_FLOAT fMaxWidth = -1;
+    FX_BOOL bRet = GetWidth(fMaxWidth);
+    if (bRet) {
+      FX_FLOAT fWidth = GetWidthWithoutMargin(fMaxWidth);
+      pTextLayout->StartLayout(fWidth);
+    } else {
+      FX_FLOAT fWidth = pTextLayout->StartLayout(fMaxWidth);
+      fMaxWidth = CalculateWidgetAutoWidth(fWidth);
+      fWidth = GetWidthWithoutMargin(fMaxWidth);
+      pTextLayout->StartLayout(fWidth);
+    }
+    fCalcWidth = fMaxWidth;
+  }
+  if (m_pLayoutData->m_fWidgetHeight < 0) {
+    m_pLayoutData->m_fWidgetHeight = pTextLayout->GetLayoutHeight();
+    m_pLayoutData->m_fWidgetHeight =
+        CalculateWidgetAutoHeight(m_pLayoutData->m_fWidgetHeight);
+  }
+  fTextHeight = m_pLayoutData->m_fWidgetHeight;
+  fTextHeight = GetHeightWithoutMargin(fTextHeight);
+  pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
+  fCalcHeight = m_pLayoutData->m_fWidgetHeight;
+}
+FX_BOOL CXFA_WidgetAcc::LoadCaption() {
+  InitLayoutData();
+  return ((CXFA_FieldLayoutData*)m_pLayoutData)->LoadCaption(this);
+}
+CXFA_TextLayout* CXFA_WidgetAcc::GetCaptionTextLayout() {
+  return m_pLayoutData
+             ? ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout
+             : NULL;
+}
+CXFA_TextLayout* CXFA_WidgetAcc::GetTextLayout() {
+  return m_pLayoutData ? ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout
+                       : NULL;
+}
+CFX_DIBitmap* CXFA_WidgetAcc::GetImageImage() {
+  return m_pLayoutData ? ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap
+                       : NULL;
+}
+CFX_DIBitmap* CXFA_WidgetAcc::GetImageEditImage() {
+  return m_pLayoutData ? ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap
+                       : NULL;
+}
+void CXFA_WidgetAcc::SetImageImage(CFX_DIBitmap* newImage) {
+  if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap == newImage) {
+    return;
+  }
+  if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap &&
+      !((CXFA_ImageLayoutData*)m_pLayoutData)->m_bNamedImage) {
+    delete ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap;
+    ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = NULL;
+  }
+  ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = newImage;
+}
+void CXFA_WidgetAcc::SetImageEditImage(CFX_DIBitmap* newImage) {
+  if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap == newImage) {
+    return;
+  }
+  if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap &&
+      !((CXFA_ImageEditData*)m_pLayoutData)->m_bNamedImage) {
+    delete ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap;
+    ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = NULL;
+  }
+  ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = newImage;
+}
+CXFA_WidgetLayoutData* CXFA_WidgetAcc::GetWidgetLayoutData() {
+  return m_pLayoutData;
+}
+IFX_Font* CXFA_WidgetAcc::GetFDEFont() {
+  CFX_WideStringC wsFontName = FX_WSTRC(L"Courier");
+  FX_DWORD dwFontStyle = 0;
+  if (CXFA_Font font = GetFont()) {
+    if (font.IsBold()) {
+      dwFontStyle |= FX_FONTSTYLE_Bold;
+    }
+    if (font.IsItalic()) {
+      dwFontStyle |= FX_FONTSTYLE_Italic;
+    }
+    font.GetTypeface(wsFontName);
+  }
+  CXFA_FFDoc* pDoc = GetDoc();
+  return pDoc->GetApp()->GetXFAFontMgr()->GetFont(pDoc, wsFontName,
+                                                  dwFontStyle);
+}
+FX_FLOAT CXFA_WidgetAcc::GetFontSize() {
+  FX_FLOAT fFontSize = 10.0f;
+  if (CXFA_Font font = GetFont()) {
+    fFontSize = font.GetFontSize();
+  }
+  return fFontSize < 0.1f ? 10.0f : fFontSize;
+}
+FX_FLOAT CXFA_WidgetAcc::GetLineHeight() {
+  FX_FLOAT fLineHeight = 0;
+  if (CXFA_Para para = GetPara()) {
+    fLineHeight = para.GetLineHeight();
+  }
+  if (fLineHeight < 1) {
+    fLineHeight = GetFontSize() * 1.2f;
+  }
+  return fLineHeight;
+}
+FX_ARGB CXFA_WidgetAcc::GetTextColor() {
+  if (CXFA_Font font = GetFont()) {
+    return font.GetColor();
+  }
+  return 0xFF000000;
+}
+CXFA_Node* CXFA_TextProvider::GetTextNode(FX_BOOL& bRichText) {
+  bRichText = FALSE;
+  if (m_pTextNode) {
+    if (m_pTextNode->GetClassID() == XFA_ELEMENT_ExData) {
+      CFX_WideString wsContentType;
+      m_pTextNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
+                                FALSE);
+      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+        bRichText = TRUE;
+      }
+    }
+    return m_pTextNode;
+  }
+  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
+    CXFA_Node* pElementNode = m_pWidgetAcc->GetNode();
+    CXFA_Node* pValueNode = pElementNode->GetChild(0, XFA_ELEMENT_Value);
+    if (!pValueNode) {
+      return NULL;
+    }
+    CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
+      CFX_WideString wsContentType;
+      pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
+      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+        bRichText = TRUE;
+      }
+    }
+    return pChildNode;
+  } else if (m_eType == XFA_TEXTPROVIDERTYPE_Datasets) {
+    CXFA_Node* pBind = m_pWidgetAcc->GetDatasets();
+    IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
+    FXSYS_assert(pXMLNode);
+    for (IFDE_XMLNode* pXMLChild =
+             pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+         pXMLChild;
+         pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+      if (pXMLChild->GetType() == FDE_XMLNODE_Element) {
+        IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLChild;
+        if (XFA_RecognizeRichText(pElement)) {
+          bRichText = TRUE;
+        }
+      }
+    }
+    return pBind;
+  } else if (m_eType == XFA_TEXTPROVIDERTYPE_Caption) {
+    CXFA_Node* pCaptionNode =
+        m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
+    if (pCaptionNode == NULL) {
+      return NULL;
+    }
+    CXFA_Node* pValueNode = pCaptionNode->GetChild(0, XFA_ELEMENT_Value);
+    if (pValueNode == NULL) {
+      return NULL;
+    }
+    CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
+      CFX_WideString wsContentType;
+      pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
+      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+        bRichText = TRUE;
+      }
+    }
+    return pChildNode;
+  }
+  CXFA_Node* pItemNode =
+      m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Items);
+  if (pItemNode == NULL) {
+    return NULL;
+  }
+  CXFA_Node* pNode = pItemNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pNode) {
+    CFX_WideStringC wsName;
+    pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+    if (m_eType == XFA_TEXTPROVIDERTYPE_Rollover &&
+        wsName == FX_WSTRC(L"rollover")) {
+      return pNode;
+    }
+    if (m_eType == XFA_TEXTPROVIDERTYPE_Down && wsName == FX_WSTRC(L"down")) {
+      return pNode;
+    }
+    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+CXFA_Para CXFA_TextProvider::GetParaNode() {
+  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
+    return m_pWidgetAcc->GetPara();
+  }
+  CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
+  return CXFA_Para(pNode->GetChild(0, XFA_ELEMENT_Para));
+}
+CXFA_Font CXFA_TextProvider::GetFontNode() {
+  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
+    return m_pWidgetAcc->GetFont();
+  }
+  CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
+  pNode = pNode->GetChild(0, XFA_ELEMENT_Font);
+  if (pNode) {
+    return CXFA_Font(pNode);
+  }
+  return m_pWidgetAcc->GetFont();
+}
+FX_BOOL CXFA_TextProvider::IsCheckButtonAndAutoWidth() {
+  XFA_ELEMENT eType = m_pWidgetAcc->GetUIType();
+  if (eType == XFA_ELEMENT_CheckButton) {
+    FX_FLOAT fWidth = 0;
+    return !m_pWidgetAcc->GetWidth(fWidth);
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_TextProvider::GetEmbbedObj(FX_BOOL bURI,
+                                        FX_BOOL bRaw,
+                                        const CFX_WideString& wsAttr,
+                                        CFX_WideString& wsValue) {
+  if (m_eType != XFA_TEXTPROVIDERTYPE_Text) {
+    return FALSE;
+  }
+  if (bURI) {
+    CXFA_Node* pWidgetNode = m_pWidgetAcc->GetNode();
+    CXFA_Node* pParent = pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent);
+    CXFA_Document* pDocument = pWidgetNode->GetDocument();
+    CXFA_Node* pIDNode = NULL;
+    CXFA_WidgetAcc* pEmbAcc = NULL;
+    if (pParent) {
+      pIDNode = pDocument->GetNodeByID(pParent, wsAttr);
+    }
+    if (!pIDNode) {
+      pIDNode = pDocument->GetNodeByID(
+          ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Form)), wsAttr);
+    }
+    if (pIDNode) {
+      pEmbAcc = (CXFA_WidgetAcc*)pIDNode->GetWidgetData();
+    }
+    if (pEmbAcc) {
+      pEmbAcc->GetValue(wsValue, XFA_VALUEPICTURE_Display);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.h b/xfa/fxfa/app/xfa_ffwidgetacc.h
new file mode 100644
index 0000000..722256a
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.h
@@ -0,0 +1,44 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFWIDGETACC_H_
+#define XFA_FXFA_APP_XFA_FFWIDGETACC_H_
+
+#include "xfa/fxfa/app/xfa_textlayout.h"
+
+enum XFA_TEXTPROVIDERTYPE {
+  XFA_TEXTPROVIDERTYPE_Text,
+  XFA_TEXTPROVIDERTYPE_Datasets,
+  XFA_TEXTPROVIDERTYPE_Caption,
+  XFA_TEXTPROVIDERTYPE_Rollover,
+  XFA_TEXTPROVIDERTYPE_Down,
+};
+class CXFA_TextProvider : public IXFA_TextProvider {
+ public:
+  CXFA_TextProvider(CXFA_WidgetAcc* pWidgetAcc,
+                    XFA_TEXTPROVIDERTYPE eType,
+                    CXFA_Node* pTextNode = NULL)
+      : m_pWidgetAcc(pWidgetAcc), m_eType(eType), m_pTextNode(pTextNode) {
+    FXSYS_assert(m_pWidgetAcc);
+  }
+  virtual ~CXFA_TextProvider() {}
+  virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText);
+  virtual CXFA_Para GetParaNode();
+  virtual CXFA_Font GetFontNode();
+  virtual FX_BOOL IsCheckButtonAndAutoWidth();
+  virtual CXFA_FFDoc* GetDocNode() { return m_pWidgetAcc->GetDoc(); }
+  virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
+                               FX_BOOL bRaw,
+                               const CFX_WideString& wsAttr,
+                               CFX_WideString& wsValue);
+
+ protected:
+  CXFA_WidgetAcc* m_pWidgetAcc;
+  XFA_TEXTPROVIDERTYPE m_eType;
+  CXFA_Node* m_pTextNode;
+};
+
+#endif  // XFA_FXFA_APP_XFA_FFWIDGETACC_H_
diff --git a/xfa/fxfa/app/xfa_ffwidgethandler.cpp b/xfa/fxfa/app/xfa_ffwidgethandler.cpp
new file mode 100644
index 0000000..b775643
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidgethandler.cpp
@@ -0,0 +1,634 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_ffwidgethandler.h"
+
+#include <vector>
+
+#include "xfa/fxfa/app/xfa_ffchoicelist.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_ffdocview.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+
+CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView)
+    : m_pDocView(pDocView) {}
+CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() {}
+IXFA_PageView* CXFA_FFWidgetHandler::GetPageView(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->GetPageView();
+}
+void CXFA_FFWidgetHandler::GetRect(IXFA_Widget* hWidget, CFX_RectF& rt) {
+  static_cast<CXFA_FFWidget*>(hWidget)->GetWidgetRect(rt);
+}
+FX_DWORD CXFA_FFWidgetHandler::GetStatus(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->GetStatus();
+}
+FX_BOOL CXFA_FFWidgetHandler::GetBBox(IXFA_Widget* hWidget,
+                                      CFX_RectF& rtBox,
+                                      FX_DWORD dwStatus,
+                                      FX_BOOL bDrawFocus) {
+  return static_cast<CXFA_FFWidget*>(hWidget)
+      ->GetBBox(rtBox, dwStatus, bDrawFocus);
+}
+CXFA_WidgetAcc* CXFA_FFWidgetHandler::GetDataAcc(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->GetDataAcc();
+}
+void CXFA_FFWidgetHandler::GetName(IXFA_Widget* hWidget,
+                                   CFX_WideString& wsName,
+                                   int32_t iNameType) {
+  static_cast<CXFA_FFWidget*>(hWidget)->GetDataAcc()->GetName(wsName,
+                                                              iNameType);
+}
+FX_BOOL CXFA_FFWidgetHandler::GetToolTip(IXFA_Widget* hWidget,
+                                         CFX_WideString& wsToolTip) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->GetToolTip(wsToolTip);
+}
+void CXFA_FFWidgetHandler::SetPrivateData(IXFA_Widget* hWidget,
+                                          void* module_id,
+                                          void* pData,
+                                          PD_CALLBACK_FREEDATA callback) {
+  static_cast<CXFA_FFWidget*>(hWidget)
+      ->SetPrivateData(module_id, pData, callback);
+}
+void* CXFA_FFWidgetHandler::GetPrivateData(IXFA_Widget* hWidget,
+                                           void* module_id) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->GetPrivateData(module_id);
+}
+FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(IXFA_Widget* hWidget) {
+  m_pDocView->LockUpdate();
+  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnMouseEnter();
+  m_pDocView->UnlockUpdate();
+  m_pDocView->UpdateDocView();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(IXFA_Widget* hWidget) {
+  m_pDocView->LockUpdate();
+  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnMouseExit();
+  m_pDocView->UnlockUpdate();
+  m_pDocView->UpdateDocView();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(IXFA_Widget* hWidget,
+                                            FX_DWORD dwFlags,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  m_pDocView->LockUpdate();
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonDown(dwFlags, fx, fy);
+  if (bRet && m_pDocView->SetFocus(hWidget)) {
+    ((CXFA_FFDoc*)m_pDocView->GetDoc())
+        ->GetDocProvider()
+        ->SetFocusWidget(m_pDocView->GetDoc(), (IXFA_Widget*)hWidget);
+  }
+  m_pDocView->UnlockUpdate();
+  m_pDocView->UpdateDocView();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(IXFA_Widget* hWidget,
+                                          FX_DWORD dwFlags,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  m_pDocView->LockUpdate();
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  m_pDocView->m_bLayoutEvent = TRUE;
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonUp(dwFlags, fx, fy);
+  m_pDocView->UnlockUpdate();
+  m_pDocView->UpdateDocView();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(IXFA_Widget* hWidget,
+                                              FX_DWORD dwFlags,
+                                              FX_FLOAT fx,
+                                              FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonDblClk(dwFlags, fx, fy);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(IXFA_Widget* hWidget,
+                                          FX_DWORD dwFlags,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnMouseMove(dwFlags, fx, fy);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(IXFA_Widget* hWidget,
+                                           FX_DWORD dwFlags,
+                                           int16_t zDelta,
+                                           FX_FLOAT fx,
+                                           FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)
+                     ->OnMouseWheel(dwFlags, zDelta, fx, fy);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(IXFA_Widget* hWidget,
+                                            FX_DWORD dwFlags,
+                                            FX_FLOAT fx,
+                                            FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonDown(dwFlags, fx, fy);
+  if (bRet && m_pDocView->SetFocus(hWidget)) {
+    ((CXFA_FFDoc*)m_pDocView->GetDoc())
+        ->GetDocProvider()
+        ->SetFocusWidget(m_pDocView->GetDoc(), (IXFA_Widget*)hWidget);
+  }
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(IXFA_Widget* hWidget,
+                                          FX_DWORD dwFlags,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonUp(dwFlags, fx, fy);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(IXFA_Widget* hWidget,
+                                              FX_DWORD dwFlags,
+                                              FX_FLOAT fx,
+                                              FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonDblClk(dwFlags, fx, fy);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(IXFA_Widget* hWidget,
+                                        FX_DWORD dwKeyCode,
+                                        FX_DWORD dwFlags) {
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnKeyDown(dwKeyCode, dwFlags);
+  m_pDocView->RunInvalidate();
+  m_pDocView->UpdateDocView();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(IXFA_Widget* hWidget,
+                                      FX_DWORD dwKeyCode,
+                                      FX_DWORD dwFlags) {
+  FX_BOOL bRet =
+      static_cast<CXFA_FFWidget*>(hWidget)->OnKeyUp(dwKeyCode, dwFlags);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_BOOL CXFA_FFWidgetHandler::OnChar(IXFA_Widget* hWidget,
+                                     FX_DWORD dwChar,
+                                     FX_DWORD dwFlags) {
+  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnChar(dwChar, dwFlags);
+  m_pDocView->RunInvalidate();
+  return bRet;
+}
+FX_DWORD CXFA_FFWidgetHandler::OnHitTest(IXFA_Widget* hWidget,
+                                         FX_FLOAT fx,
+                                         FX_FLOAT fy) {
+  if (!(static_cast<CXFA_FFWidget*>(hWidget)->GetStatus() &
+        XFA_WIDGETSTATUS_Visible)) {
+    return FWL_WGTHITTEST_Unknown;
+  }
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  return static_cast<CXFA_FFWidget*>(hWidget)->OnHitTest(fx, fy);
+}
+FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(IXFA_Widget* hWidget,
+                                          FX_FLOAT fx,
+                                          FX_FLOAT fy) {
+  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
+  return static_cast<CXFA_FFWidget*>(hWidget)->OnSetCursor(fx, fy);
+}
+void CXFA_FFWidgetHandler::RenderWidget(IXFA_Widget* hWidget,
+                                        CFX_Graphics* pGS,
+                                        CFX_Matrix* pMatrix,
+                                        FX_BOOL bHighlight) {
+  static_cast<CXFA_FFWidget*>(hWidget)->RenderWidget(
+      pGS, pMatrix, bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0);
+}
+FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
+                                       XFA_EVENTTYPE eEventType) {
+  if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) {
+    return FALSE;
+  }
+  if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
+    return FALSE;
+  }
+  switch (eEventType) {
+    case XFA_EVENT_Calculate: {
+      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
+      if (!calc) {
+        return FALSE;
+      }
+      if (calc.GetScript()) {
+        return TRUE;
+      }
+      return FALSE;
+    }
+    case XFA_EVENT_Validate: {
+      CXFA_Validate val = pWidgetAcc->GetValidate();
+      if (!val) {
+        return FALSE;
+      }
+      if (val.GetScript()) {
+        return TRUE;
+      }
+      return FALSE;
+    }
+    default:
+      break;
+  }
+  CXFA_NodeArray eventArray;
+  return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
+                                        eventArray);
+}
+int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
+                                           CXFA_EventParam* pParam) {
+  if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
+    return XFA_EVENTERROR_NotExist;
+  }
+  switch (pParam->m_eType) {
+    case XFA_EVENT_Calculate:
+      return pWidgetAcc->ProcessCalculate();
+    case XFA_EVENT_Validate:
+      if (((CXFA_FFDoc*)m_pDocView->GetDoc())
+              ->GetDocProvider()
+              ->IsValidationsEnabled(m_pDocView->GetDoc())) {
+        return pWidgetAcc->ProcessValidate();
+      }
+      return XFA_EVENTERROR_Disabled;
+    case XFA_EVENT_InitCalculate: {
+      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
+      if (!calc) {
+        return XFA_EVENTERROR_NotExist;
+      }
+      if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
+        return XFA_EVENTERROR_Disabled;
+      }
+      CXFA_Script script = calc.GetScript();
+      return pWidgetAcc->ExecuteScript(script, pParam);
+    }
+    default:
+      break;
+  }
+  int32_t iRet =
+      pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
+  return iRet;
+}
+IXFA_Widget* CXFA_FFWidgetHandler::CreateWidget(IXFA_Widget* hParent,
+                                                XFA_WIDGETTYPE eType,
+                                                IXFA_Widget* hBefore) {
+  CXFA_Node* pParentFormItem =
+      hParent ? static_cast<CXFA_FFWidget*>(hParent)->GetDataAcc()->GetNode()
+              : NULL;
+  CXFA_Node* pBeforeFormItem =
+      hBefore ? static_cast<CXFA_FFWidget*>(hBefore)->GetDataAcc()->GetNode()
+              : NULL;
+  CXFA_Node* pNewFormItem =
+      CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
+  if (pNewFormItem == NULL) {
+    return NULL;
+  }
+  pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized);
+  pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized);
+  m_pDocView->RunLayout();
+  CXFA_LayoutItem* pLayout =
+      m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
+  return (IXFA_Widget*)pLayout;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
+    XFA_WIDGETTYPE eType,
+    CXFA_Node* pParent,
+    CXFA_Node* pBefore) const {
+  switch (eType) {
+    case XFA_WIDGETTYPE_Barcode:
+      return NULL;
+    case XFA_WIDGETTYPE_PushButton:
+      return CreatePushButton(pParent, pBefore);
+    case XFA_WIDGETTYPE_CheckButton:
+      return CreateCheckButton(pParent, pBefore);
+    case XFA_WIDGETTYPE_ExcludeGroup:
+      return CreateExclGroup(pParent, pBefore);
+    case XFA_WIDGETTYPE_RadioButton:
+      return CreateRadioButton(pParent, pBefore);
+    case XFA_WIDGETTYPE_Arc:
+      return CreateArc(pParent, pBefore);
+    case XFA_WIDGETTYPE_Rectangle:
+      return CreateRectangle(pParent, pBefore);
+    case XFA_WIDGETTYPE_Image:
+      return CreateImage(pParent, pBefore);
+    case XFA_WIDGETTYPE_Line:
+      return CreateLine(pParent, pBefore);
+    case XFA_WIDGETTYPE_Text:
+      return CreateText(pParent, pBefore);
+    case XFA_WIDGETTYPE_DatetimeEdit:
+      return CreateDatetimeEdit(pParent, pBefore);
+    case XFA_WIDGETTYPE_DecimalField:
+      return CreateDecimalField(pParent, pBefore);
+    case XFA_WIDGETTYPE_NumericField:
+      return CreateNumericField(pParent, pBefore);
+    case XFA_WIDGETTYPE_Signature:
+      return CreateSignature(pParent, pBefore);
+    case XFA_WIDGETTYPE_TextEdit:
+      return CreateTextEdit(pParent, pBefore);
+    case XFA_WIDGETTYPE_DropdownList:
+      return CreateDropdownList(pParent, pBefore);
+    case XFA_WIDGETTYPE_ListBox:
+      return CreateListBox(pParent, pBefore);
+    case XFA_WIDGETTYPE_ImageField:
+      return CreateImageField(pParent, pBefore);
+    case XFA_WIDGETTYPE_PasswordEdit:
+      return CreatePasswordEdit(pParent, pBefore);
+    case XFA_WIDGETTYPE_Subform:
+      return CreateSubform(pParent, pBefore);
+    default:
+      break;
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
+                                                  CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore);
+  CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField);
+  CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption);
+  CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue);
+  pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE);
+  CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption);
+  pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
+  pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
+  CreateFontNode(pCaption);
+  CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField);
+  pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
+  CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder);
+  pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
+  CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder);
+  CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill);
+  pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE);
+  CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
+  pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
+                                                   CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
+                                                 CXFA_Node* pBefore) const {
+  return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore);
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
+                                                   CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
+  CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui);
+  CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton);
+  pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore);
+  CreateValueNode(XFA_ELEMENT_Date, pField);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateNumericField(pParent, pBefore);
+  CreateValueNode(XFA_ELEMENT_Decimal, pField);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
+                                                 CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_Signature, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
+                                                CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
+                                               CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
+  CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
+  CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
+  pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
+  pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
+                                                  CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore);
+  CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
+  pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement,
+                                             CXFA_Node* pParent,
+                                             CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore);
+  CreateCopyNode(eElement, CreateCopyNode(XFA_ELEMENT_Ui, pField));
+  CreateFontNode(pField);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
+                                           CXFA_Node* pBefore) const {
+  return CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore);
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
+                                                 CXFA_Node* pBefore) const {
+  return CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore);
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
+                                             CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore);
+  CreateCopyNode(XFA_ELEMENT_ImageEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
+                                            CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Line, pParent, pBefore);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
+                                            CXFA_Node* pBefore) const {
+  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore);
+  CreateCopyNode(XFA_ELEMENT_TextEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
+  CreateFontNode(pField);
+  return pField;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement,
+                                            CXFA_Node* pParent,
+                                            CXFA_Node* pBefore) const {
+  CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore);
+  CreateValueNode(eElement, pDraw);
+  return pDraw;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
+                                               CXFA_Node* pBefore) const {
+  CXFA_Node* pSubform = CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore);
+  return pSubform;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement,
+                                                CXFA_Node* pParent,
+                                                CXFA_Node* pBefore) const {
+  CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
+  CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
+  if (pParent)
+    pParent->InsertChild(pNewFormItem, pBefore);
+  return pNewFormItem;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement,
+                                                CXFA_Node* pParent,
+                                                CXFA_Node* pBefore) const {
+  CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
+  CXFA_Node* pNewNode =
+      CreateTemplateNode(eElement, pTemplateParent,
+                         pBefore ? pBefore->GetTemplateNode() : NULL)
+          ->Clone(FALSE);
+  if (pParent)
+    pParent->InsertChild(pNewNode, pBefore);
+  return pNewNode;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement,
+                                                    CXFA_Node* pParent,
+                                                    CXFA_Node* pBefore) const {
+  CXFA_Document* pXFADoc = GetXFADoc();
+  CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(
+      XFA_XDPPACKET_Template, eElement);
+  if (pParent)
+    pParent->InsertChild(pNewTemplateNode, pBefore);
+  return pNewTemplateNode;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
+  CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent);
+  pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE);
+  return pFont;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
+                                                  FX_DWORD dwFlags,
+                                                  FX_FLOAT fInsets[4]) const {
+  CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent);
+  if (dwFlags & 0x01) {
+    pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
+                        CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
+  }
+  if (dwFlags & 0x02) {
+    pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
+                        CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
+  }
+  if (dwFlags & 0x04) {
+    pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
+                        CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
+  }
+  if (dwFlags & 0x08) {
+    pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
+                        CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
+  }
+  return pMargin;
+}
+CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue,
+                                                 CXFA_Node* pParent) const {
+  CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent);
+  CreateCopyNode(eValue, pValue);
+  return pValue;
+}
+IXFA_ObjFactory* CXFA_FFWidgetHandler::GetObjFactory() const {
+  return GetXFADoc()->GetParser()->GetFactory();
+}
+CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
+  return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc();
+}
+CXFA_FFMenuHandler::CXFA_FFMenuHandler() {}
+CXFA_FFMenuHandler::~CXFA_FFMenuHandler() {}
+FX_BOOL CXFA_FFMenuHandler::CanCopy(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanCopy();
+}
+FX_BOOL CXFA_FFMenuHandler::CanCut(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanCut();
+}
+FX_BOOL CXFA_FFMenuHandler::CanPaste(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanPaste();
+}
+FX_BOOL CXFA_FFMenuHandler::CanSelectAll(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanSelectAll();
+}
+FX_BOOL CXFA_FFMenuHandler::CanDelete(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanDelete();
+}
+FX_BOOL CXFA_FFMenuHandler::CanDeSelect(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanDeSelect();
+}
+FX_BOOL CXFA_FFMenuHandler::Copy(IXFA_Widget* hWidget, CFX_WideString& wsText) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Copy(wsText);
+}
+FX_BOOL CXFA_FFMenuHandler::Cut(IXFA_Widget* hWidget, CFX_WideString& wsText) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Cut(wsText);
+}
+FX_BOOL CXFA_FFMenuHandler::Paste(IXFA_Widget* hWidget,
+                                  const CFX_WideString& wsText) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Paste(wsText);
+}
+FX_BOOL CXFA_FFMenuHandler::SelectAll(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->SelectAll();
+}
+FX_BOOL CXFA_FFMenuHandler::Delete(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Delete();
+}
+FX_BOOL CXFA_FFMenuHandler::DeSelect(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->DeSelect();
+}
+FX_BOOL CXFA_FFMenuHandler::CanUndo(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanUndo();
+}
+FX_BOOL CXFA_FFMenuHandler::CanRedo(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->CanRedo();
+}
+FX_BOOL CXFA_FFMenuHandler::Undo(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Undo();
+}
+FX_BOOL CXFA_FFMenuHandler::Redo(IXFA_Widget* hWidget) {
+  return static_cast<CXFA_FFWidget*>(hWidget)->Redo();
+}
+FX_BOOL CXFA_FFMenuHandler::GetSuggestWords(
+    IXFA_Widget* hWidget,
+    CFX_PointF pointf,
+    std::vector<CFX_ByteString>& sSuggest) {
+  return static_cast<CXFA_FFWidget*>(hWidget)
+      ->GetSuggestWords(pointf, sSuggest);
+}
+FX_BOOL CXFA_FFMenuHandler::ReplaceSpellCheckWord(
+    IXFA_Widget* hWidget,
+    CFX_PointF pointf,
+    const CFX_ByteStringC& bsReplace) {
+  return static_cast<CXFA_FFWidget*>(hWidget)
+      ->ReplaceSpellCheckWord(pointf, bsReplace);
+}
diff --git a/xfa/fxfa/app/xfa_ffwidgethandler.h b/xfa/fxfa/app/xfa_ffwidgethandler.h
new file mode 100644
index 0000000..a9998b3
--- /dev/null
+++ b/xfa/fxfa/app/xfa_ffwidgethandler.h
@@ -0,0 +1,176 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FFWIDGETHANDLER_H_
+#define XFA_FXFA_APP_XFA_FFWIDGETHANDLER_H_
+
+#include <vector>
+
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_FFDocView;
+
+class CXFA_FFWidgetHandler : public IXFA_WidgetHandler {
+ public:
+  CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView);
+  ~CXFA_FFWidgetHandler();
+  virtual IXFA_Widget* CreateWidget(IXFA_Widget* hParent,
+                                    XFA_WIDGETTYPE eType,
+                                    IXFA_Widget* hBefore = NULL);
+  virtual IXFA_PageView* GetPageView(IXFA_Widget* hWidget);
+  virtual void GetRect(IXFA_Widget* hWidget, CFX_RectF& rt);
+  virtual FX_DWORD GetStatus(IXFA_Widget* hWidget);
+  virtual FX_BOOL GetBBox(IXFA_Widget* hWidget,
+                          CFX_RectF& rtBox,
+                          FX_DWORD dwStatus,
+                          FX_BOOL bDrawFocus = FALSE);
+  virtual CXFA_WidgetAcc* GetDataAcc(IXFA_Widget* hWidget);
+  virtual void GetName(IXFA_Widget* hWidget,
+                       CFX_WideString& wsName,
+                       int32_t iNameType = 0);
+  virtual FX_BOOL GetToolTip(IXFA_Widget* hWidget, CFX_WideString& wsToolTip);
+  virtual void SetPrivateData(IXFA_Widget* hWidget,
+                              void* module_id,
+                              void* pData,
+                              PD_CALLBACK_FREEDATA callback);
+  virtual void* GetPrivateData(IXFA_Widget* hWidget, void* module_id);
+  virtual FX_BOOL OnMouseEnter(IXFA_Widget* hWidget);
+  virtual FX_BOOL OnMouseExit(IXFA_Widget* hWidget);
+  virtual FX_BOOL OnLButtonDown(IXFA_Widget* hWidget,
+                                FX_DWORD dwFlags,
+                                FX_FLOAT fx,
+                                FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonUp(IXFA_Widget* hWidget,
+                              FX_DWORD dwFlags,
+                              FX_FLOAT fx,
+                              FX_FLOAT fy);
+  virtual FX_BOOL OnLButtonDblClk(IXFA_Widget* hWidget,
+                                  FX_DWORD dwFlags,
+                                  FX_FLOAT fx,
+                                  FX_FLOAT fy);
+  virtual FX_BOOL OnMouseMove(IXFA_Widget* hWidget,
+                              FX_DWORD dwFlags,
+                              FX_FLOAT fx,
+                              FX_FLOAT fy);
+  virtual FX_BOOL OnMouseWheel(IXFA_Widget* hWidget,
+                               FX_DWORD dwFlags,
+                               int16_t zDelta,
+                               FX_FLOAT fx,
+                               FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDown(IXFA_Widget* hWidget,
+                                FX_DWORD dwFlags,
+                                FX_FLOAT fx,
+                                FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonUp(IXFA_Widget* hWidget,
+                              FX_DWORD dwFlags,
+                              FX_FLOAT fx,
+                              FX_FLOAT fy);
+  virtual FX_BOOL OnRButtonDblClk(IXFA_Widget* hWidget,
+                                  FX_DWORD dwFlags,
+                                  FX_FLOAT fx,
+                                  FX_FLOAT fy);
+
+  virtual FX_BOOL OnKeyDown(IXFA_Widget* hWidget,
+                            FX_DWORD dwKeyCode,
+                            FX_DWORD dwFlags);
+  virtual FX_BOOL OnKeyUp(IXFA_Widget* hWidget,
+                          FX_DWORD dwKeyCode,
+                          FX_DWORD dwFlags);
+  virtual FX_BOOL OnChar(IXFA_Widget* hWidget,
+                         FX_DWORD dwChar,
+                         FX_DWORD dwFlags);
+  virtual FX_DWORD OnHitTest(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
+  virtual FX_BOOL OnSetCursor(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
+  virtual void RenderWidget(IXFA_Widget* hWidget,
+                            CFX_Graphics* pGS,
+                            CFX_Matrix* pMatrix = NULL,
+                            FX_BOOL bHighlight = FALSE);
+  virtual FX_BOOL HasEvent(CXFA_WidgetAcc* pWidgetAcc,
+                           XFA_EVENTTYPE eEventType);
+  virtual int32_t ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
+                               CXFA_EventParam* pParam);
+
+ protected:
+  CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType,
+                                  CXFA_Node* pParent,
+                                  CXFA_Node* pBefore) const;
+
+  CXFA_Node* CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateField(XFA_ELEMENT eElement,
+                         CXFA_Node* pParent,
+                         CXFA_Node* pBefore) const;
+  CXFA_Node* CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateDraw(XFA_ELEMENT eElement,
+                        CXFA_Node* pParent,
+                        CXFA_Node* pBefore) const;
+
+  CXFA_Node* CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const;
+  CXFA_Node* CreateFormItem(XFA_ELEMENT eElement,
+                            CXFA_Node* pParent,
+                            CXFA_Node* pBefore) const;
+  CXFA_Node* CreateCopyNode(XFA_ELEMENT eElement,
+                            CXFA_Node* pParent,
+                            CXFA_Node* pBefore = NULL) const;
+  CXFA_Node* CreateTemplateNode(XFA_ELEMENT eElement,
+                                CXFA_Node* pParent,
+                                CXFA_Node* pBefore) const;
+  CXFA_Node* CreateFontNode(CXFA_Node* pParent) const;
+  CXFA_Node* CreateMarginNode(CXFA_Node* pParent,
+                              FX_DWORD dwFlags,
+                              FX_FLOAT fInsets[4]) const;
+  CXFA_Node* CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const;
+  IXFA_ObjFactory* GetObjFactory() const;
+  CXFA_Document* GetXFADoc() const;
+
+  CXFA_FFDocView* m_pDocView;
+};
+
+class CXFA_FFMenuHandler : public IXFA_MenuHandler {
+ public:
+  CXFA_FFMenuHandler();
+  ~CXFA_FFMenuHandler();
+  virtual FX_BOOL CanCopy(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanCut(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanPaste(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanSelectAll(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanDelete(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanDeSelect(IXFA_Widget* hWidget);
+  virtual FX_BOOL Copy(IXFA_Widget* hWidget, CFX_WideString& wsText);
+  virtual FX_BOOL Cut(IXFA_Widget* hWidget, CFX_WideString& wsText);
+  virtual FX_BOOL Paste(IXFA_Widget* hWidget, const CFX_WideString& wsText);
+  virtual FX_BOOL SelectAll(IXFA_Widget* hWidget);
+  virtual FX_BOOL Delete(IXFA_Widget* hWidget);
+  virtual FX_BOOL DeSelect(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanUndo(IXFA_Widget* hWidget);
+  virtual FX_BOOL CanRedo(IXFA_Widget* hWidget);
+  virtual FX_BOOL Undo(IXFA_Widget* hWidget);
+  virtual FX_BOOL Redo(IXFA_Widget* hWidget);
+  virtual FX_BOOL GetSuggestWords(IXFA_Widget* hWidget,
+                                  CFX_PointF pointf,
+                                  std::vector<CFX_ByteString>& sSuggest);
+  virtual FX_BOOL ReplaceSpellCheckWord(IXFA_Widget* hWidget,
+                                        CFX_PointF pointf,
+                                        const CFX_ByteStringC& bsReplace);
+};
+
+#endif  //  XFA_FXFA_APP_XFA_FFWIDGETHANDLER_H_
diff --git a/xfa/fxfa/app/xfa_fontmgr.cpp b/xfa/fxfa/app/xfa_fontmgr.cpp
new file mode 100644
index 0000000..dda8f5b
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fontmgr.cpp
@@ -0,0 +1,2089 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fontmgr.h"
+
+#include <algorithm>
+
+#include "core/include/fpdfapi/cpdf_dictionary.h"
+#include "core/include/fpdfapi/cpdf_document.h"
+#include "core/include/fpdfapi/fpdf_resource.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+static const XFA_FONTINFO g_XFAFontsMap[] = {
+    {0x01d5d33e, L"SimSun", L"Arial", 0, 936},
+    {0x01e4f102, L"YouYuan", L"Arial", 1, 936},
+    {0x030549dc, L"LiSu", L"Arial", 1, 936},
+    {0x032edd44, L"Simhei", L"Arial", 1, 936},
+    {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252},
+    {0x03ed90e6, L"Nina", L"Arial", 0, 1252},
+    {0x077b56b3, L"KingsoftPhoneticPlain", L"Arial", 0, 1252},
+    {0x078ed524, L"MicrosoftSansSerif", L"Arial", 0, 1252},
+    {0x089b18a9, L"Arial", L"Arial", 0, 1252},
+    {0x0b2cad72, L"MonotypeCorsiva", L"Arial", 8, 1252},
+    {0x0bb003e7, L"Kartika", L"Arial", 2, 1252},
+    {0x0bb469df, L"VinerHandITC", L"Arial", 8, 1252},
+    {0x0bc1a851, L"SegoeUI", L"Arial", 0, 1252},
+    {0x0c112ebd, L"KozukaGothicPro-VIM", L"Arial", 0, 1252},
+    {0x0cfcb9c1, L"AdobeThai", L"Kokila,Arial Narrow", 0, 847},
+    {0x0e7de0f9, L"Playbill", L"Arial", 0, 1252},
+    {0x0eff47c3, L"STHupo", L"Arial", 0, 936},
+    {0x107ad374, L"Constantia", L"Arial", 2, 1252},
+    {0x12194c2d, L"KunstlerScript", L"Arial", 8, 1252},
+    {0x135ef6a1, L"MinionProSmBd",
+     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
+    {0x158c4049, L"Garamond", L"Arial", 2, 1252},
+    {0x160ecb24, L"STZhongsong", L"Arial", 0, 936},
+    {0x161ed07e, L"MSGothic", L"Arial", 1, 1252},
+    {0x171d1ed1, L"SnapITC-Regular", L"Arial", 0, 1252},
+    {0x18d1188f, L"Cambria", L"Arial", 2, 1252},
+    {0x18eaf350, L"ArialUnicodeMS", L"Arial", 0, 936},
+    {0x1a92d115, L"MingLiU", L"Arial", 1, 1252},
+    {0x1cc217c6, L"TrebuchetMS", L"Arial", 0, 1252},
+    {0x1d649596, L"BasemicTimes", L"Arial", 0, 1252},
+    {0x1e34ee60, L"BellMT", L"Arial", 2, 1252},
+    {0x1eb36945, L"CooperBlack", L"Arial", 2, 1252},
+    {0x1ef7787d, L"BatangChe", L"Arial", 1, 1252},
+    {0x20b3bd3a, L"BrushScriptMT", L"Arial", 8, 1252},
+    {0x220877aa, L"Candara", L"Arial", 0, 1252},
+    {0x22135007, L"FreestyleScript-Regular", L"Arial", 8, 1252},
+    {0x251059c3, L"Chiller", L"Arial", 0, 1252},
+    {0x25bed6dd, L"MSReferenceSansSerif", L"Arial", 0, 1252},
+    {0x28154c81, L"Parchment-Regular", L"Arial", 8, 1252},
+    {0x29711eb9, L"STLiti", L"Arial", 0, 936},
+    {0x2b1993b4, L"Basemic", L"Arial", 0, 1252},
+    {0x2b316339, L"NiagaraSolid-Reg", L"Arial", 0, 1252},
+    {0x2c147529, L"FootlightMTLight", L"Arial", 0, 1252},
+    {0x2c198928, L"HarlowSolid", L"Arial", 0, 1252},
+    {0x2c6ac6b2, L"LucidaBright", L"Arial", 2, 1252},
+    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"Arial", 0, 1252},
+    {0x2d5a47b0, L"STCaiyun", L"Arial", 0, 936},
+    {0x2def26bf, L"BernardMT-Condensed", L"Arial", 0, 1252},
+    {0x2fd8930b, L"KozukaMinchoPr6NR", L"Arial", 0, 1252},
+    {0x3115525a, L"FangSong_GB2312", L"Arial", 0, 1252},
+    {0x31327817, L"MyriadPro",
+     L"Calibri,Corbel,Candara,Cambria Math,Franklin Gothic Medium,Arial "
+     L"Narrow,Times New Roman",
+     0, 1252},
+    {0x32244975, L"Helvetica", L"Arial", 0, 1252},
+    {0x32ac995c, L"Terminal", L"Arial", 0, 1252},
+    {0x338d648a, L"NiagaraEngraved-Reg", L"Arial", 0, 1252},
+    {0x33bb65f2, L"Sylfaen", L"Arial", 2, 1252},
+    {0x3402c30e, L"MSPMincho", L"Arial", 2, 1252},
+    {0x3412bf31, L"SimSun-PUA", L"Arial", 0, 936},
+    {0x36eb39b9, L"BerlinSansFB", L"Arial", 0, 1252},
+    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
+    {0x3864c4f6, L"HighTowerText", L"Arial", 2, 1252},
+    {0x3a257d03, L"FangSong_GB2312", L"Arial", 0, 1252},
+    {0x3cdae668, L"FreestyleScript", L"Arial", 8, 1252},
+    {0x3d55aed7, L"Jokerman", L"Arial", 0, 1252},
+    {0x3d5b4385, L"PMingLiU", L"Arial", 2, 1252},
+    {0x3d9b7669, L"EstrangeloEdessa", L"Arial", 0, 1252},
+    {0x3e532d74, L"FranklinGothicMedium", L"Arial", 0, 1252},
+    {0x3e6aa32d, L"NSimSun", L"Arial", 1, 936},
+    {0x3f6c36a8, L"Gautami", L"Arial", 0, 1252},
+    {0x3ff32662, L"Chiller-Regular", L"Arial", 0, 1252},
+    {0x409de312, L"ModernNo.20", L"Arial", 2, 1252},
+    {0x41443c5e, L"Georgia", L"Arial", 2, 1252},
+    {0x4160ade5, L"BellGothicStdBlack",
+     L"Arial,Arial Unicode MS,Book Antiqua,Dotum,Georgia", 0, 1252},
+    {0x421976c4, L"Modern-Regular", L"Arial", 2, 1252},
+    {0x422a7252, L"Stencil", L"Arial", 0, 1252},
+    {0x42c8554f, L"Fixedsys", L"Arial", 0, 1252},
+    {0x435cb41d, L"Roman", L"Arial", 0, 1252},
+    {0x47882383, L"CourierNew", L"Arial", 1, 1252},
+    {0x480a2338, L"BerlinSansFBDemi", L"Arial", 0, 1252},
+    {0x480bf7a4, L"CourierStd", L"Courier New,Verdana", 0, 1252},
+    {0x481ad6ed, L"VladimirScript", L"Arial", 8, 1252},
+    {0x4911577a, L"YouYuan", L"Arial", 1, 936},
+    {0x4a788d72, L"STXingkai", L"Arial", 0, 936},
+    {0x4bf88566, L"SegoeCondensed", L"Arial", 0, 1252},
+    {0x4ccf51a4, L"BerlinSansFB-Reg", L"Arial", 0, 1252},
+    {0x4ea967ce, L"GulimChe", L"Arial", 1, 1252},
+    {0x4f68bd79, L"LetterGothicStd", L"Courier New,Verdana", 0, 1252},
+    {0x51a0d0e6, L"KozukaGothicPr6NM", L"Arial", 0, 1252},
+    {0x531b3dea, L"BasemicSymbol", L"Arial", 0, 1252},
+    {0x5333fd39, L"CalifornianFB-Reg", L"Arial", 2, 1252},
+    {0x53561a54, L"FZYTK--GBK1-0", L"Arial", 0, 936},
+    {0x55e0dde6, L"LucidaSansTypewriter", L"Arial", 0, 1252},
+    {0x574d4d3d, L"AdobeArabic", L"Arial Narrow", 0, 1252},
+    {0x5792e759, L"STKaiti", L"Arial", 0, 936},
+    {0x5921978e, L"LucidaSansUnicode", L"Arial", 0, 1252},
+    {0x594e2da4, L"Vrinda", L"Arial", 0, 1252},
+    {0x59baa9a2, L"KaiTi_GB2312", L"Arial", 0, 1252},
+    {0x5cfedf4f, L"BaskOldFace", L"Arial", 0, 1252},
+    {0x5f97921c, L"AdobeMyungjoStdM",
+     L"Batang,Bookman Old Style,Consolas,STZhongsong", 0, 936},
+    {0x5fefbfad, L"Batang", L"Arial", 2, 1252},
+    {0x605342b9, L"DotumChe", L"Arial", 1, 1252},
+    {0x608c5f9a, L"KaiTi_GB2312", L"Arial", 0, 936},
+    {0x61efd0d1, L"MaturaMTScriptCapitals", L"Arial", 0, 1252},
+    {0x626608a9, L"MVBoli", L"Arial", 0, 1252},
+    {0x630501a3, L"SmallFonts", L"Arial", 0, 1252},
+    {0x65d0e2a9, L"FZYTK--GBK1-0", L"Arial", 0, 936},
+    {0x669f29e1, L"FZSTK--GBK1-0", L"Arial", 0, 936},
+    {0x673a9e5f, L"Tunga", L"Arial", 0, 1252},
+    {0x691aa4ce, L"NiagaraSolid", L"Arial", 0, 1252},
+    {0x696259b7, L"Corbel", L"Arial", 0, 1252},
+    {0x696ee9be, L"STXihei", L"Arial", 0, 936},
+    {0x6c59cf69, L"Dotum", L"Arial", 0, 1252},
+    {0x707fa561, L"Gungsuh", L"Arial", 2, 1252},
+    {0x71416bb2, L"ZWAdobeF", L"Arial", 0, 1252},
+    {0x71b41801, L"Verdana", L"Arial", 0, 1252},
+    {0x73f25e4c, L"PalatinoLinotype", L"Arial", 0, 1252},
+    {0x73f4d19f, L"NiagaraEngraved", L"Arial", 0, 1252},
+    {0x74001694, L"MyriadProBlack", L"Book Antiqua,Constantia,Dotum,Georgia", 0,
+     1252},
+    {0x74b14d8f, L"Haettenschweiler", L"Arial", 0, 1252},
+    {0x74cb44ee, L"NSimSun", L"Arial", 1, 936},
+    {0x76b4d7ff, L"Shruti", L"Arial", 0, 1252},
+    {0x788b3533, L"Webdings", L"Arial", 6, 42},
+    {0x797dde99, L"MSSerif", L"Arial", 0, 1252},
+    {0x7a0f9e9e, L"MSMincho", L"Arial", 1, 1252},
+    {0x7b439caf, L"OldEnglishTextMT", L"Arial", 0, 1252},
+    {0x8213a433, L"LucidaSans-Typewriter", L"Arial", 0, 1252},
+    {0x82fec929, L"AdobeSongStdL",
+     L"Centaur,Calibri,STSong,Bell MT,Garamond,Times New Roman", 0, 936},
+    {0x83581825, L"Modern", L"Arial", 0, 1252},
+    {0x835a2823, L"Algerian", L"Arial", 0, 1252},
+    {0x83dab9f5, L"Script", L"Arial", 0, 1252},
+    {0x847b56da, L"Tahoma", L"Arial", 0, 1252},
+    {0x8a783cb2, L"SimSun-PUA", L"Arial", 0, 1252},
+    {0x8b5cac0e, L"Onyx", L"Arial", 0, 1252},
+    {0x8c6a499e, L"Gulim", L"Arial", 0, 1252},
+    {0x8e0af790, L"JuiceITC", L"Arial", 0, 1252},
+    {0x8e8d43b2, L"Centaur", L"Arial", 2, 1252},
+    {0x8ee4dcca, L"BookshelfSymbol7", L"Arial", 0, 1252},
+    {0x90794800, L"BellGothicStdLight", L"Bell MT,Calibri,Times New Roman", 0,
+     1252},
+    {0x909b516a, L"Century", L"Arial", 2, 1252},
+    {0x92ae370d, L"MSOutlook", L"Arial", 4, 42},
+    {0x93c9fbf1, L"LucidaFax", L"Arial", 2, 1252},
+    {0x9565085e, L"BookAntiqua", L"Arial", 2, 1252},
+    {0x9856d95d, L"AdobeMingStdL", L"Arial,Arial Unicode MS,Cambria,BatangChe",
+     0, 949},
+    {0x9bbadd6b, L"ColonnaMT", L"Arial", 0, 1252},
+    {0x9cbd16a4, L"ShowcardGothic-Reg", L"Arial", 0, 1252},
+    {0x9d73008e, L"MSSansSerif", L"Arial", 0, 1252},
+    {0xa0607db1, L"GungsuhChe", L"Arial", 1, 1252},
+    {0xa0bcf6a1, L"LatinWide", L"Arial", 2, 1252},
+    {0xa1429b36, L"Symbol", L"Arial", 6, 42},
+    {0xa1fa5abc, L"Wingdings2", L"Arial", 6, 42},
+    {0xa1fa5abd, L"Wingdings3", L"Arial", 6, 42},
+    {0xa427bad4, L"InformalRoman-Regular", L"Arial", 8, 1252},
+    {0xa8b92ece, L"FZSTK--GBK1-0", L"Arial", 0, 936},
+    {0xa8d83ece, L"CalifornianFB", L"Arial", 2, 1252},
+    {0xaa3e082c, L"Kingsoft-Phonetic", L"Arial", 0, 1252},
+    {0xaa6bcabe, L"HarlowSolidItalic", L"Arial", 0, 1252},
+    {0xade5337c, L"MSUIGothic", L"Arial", 0, 1252},
+    {0xb08dd941, L"WideLatin", L"Arial", 2, 1252},
+    {0xb207f05d, L"PoorRichard", L"Arial", 2, 1252},
+    {0xb3bc492f, L"JuiceITC-Regular", L"Arial", 0, 1252},
+    {0xb5545399, L"Marlett", L"Arial", 4, 42},
+    {0xb5dd1ebb, L"BritannicBold", L"Arial", 0, 1252},
+    {0xb699c1c5, L"LucidaCalligraphy-Italic", L"Arial", 0, 1252},
+    {0xb725d629, L"TimesNewRoman", L"Arial", 2, 1252},
+    {0xb7eaebeb, L"AdobeHeitiStdR", L"Batang,Century,Dotum", 0, 936},
+    {0xbd29c486, L"BerlinSansFBDemi-Bold", L"Arial", 0, 1252},
+    {0xbe8a8db4, L"BookshelfSymbolSeven", L"Arial", 0, 1252},
+    {0xc16c0118, L"AdobeHebrew", L"Bell MT,Berlin Sans FB,Calibri", 0, 1252},
+    {0xc318b0af, L"MyriadProLight", L"Calibri,STFangsong,Times New Roman", 0,
+     1252},
+    {0xc65e5659, L"CambriaMath", L"Arial", 2, 1252},
+    {0xc75c8f05, L"LucidaConsole", L"Arial", 1, 1252},
+    {0xca7c35d6, L"Calibri", L"Arial", 0, 1252},
+    {0xcb053f53, L"MicrosoftYaHei", L"Arial", 0, 936},
+    {0xcb7190f9, L"Magneto-Bold", L"Arial", 0, 1252},
+    {0xcca00cc5, L"System", L"Arial", 0, 1252},
+    {0xccad6f76, L"Jokerman-Regular", L"Arial", 0, 1252},
+    {0xccc5818c, L"EuroSign", L"Arial", 0, 1252},
+    {0xcf3d7234, L"LucidaHandwriting-Italic", L"Arial", 0, 1252},
+    {0xcf7b8fdb, L"MinionPro",
+     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
+    {0xcfe5755f, L"Simhei", L"Arial", 1, 936},
+    {0xd011f4ee, L"MSPGothic", L"Arial", 0, 1252},
+    {0xd060e7ef, L"Vivaldi", L"Arial", 8, 1252},
+    {0xd07edec1, L"FranklinGothic-Medium", L"Arial", 0, 1252},
+    {0xd107243f, L"SimSun", L"Arial", 0, 936},
+    {0xd1881562, L"ArialNarrow", L"Arial Narrow", 0, 1252},
+    {0xd22b7dce, L"BodoniMTPosterCompressed", L"Arial", 0, 1252},
+    {0xd22bfa60, L"ComicSansMS", L"Arial", 8, 1252},
+    {0xd3bd0e35, L"Bauhaus93", L"Arial", 0, 1252},
+    {0xd429ee7a, L"STFangsong", L"Arial", 0, 936},
+    {0xd6679c12, L"BernardMTCondensed", L"Arial", 0, 1252},
+    {0xd8e8a027, L"LucidaSans", L"Arial", 0, 1252},
+    {0xd9fe7761, L"HighTowerText-Reg", L"Arial", 2, 1252},
+    {0xda7e551e, L"STSong", L"Arial", 0, 936},
+    {0xdaa6842d, L"STZhongsong", L"Arial", 0, 936},
+    {0xdaaab93f, L"STFangsong", L"Arial", 0, 936},
+    {0xdaeb0713, L"STSong", L"Arial", 0, 936},
+    {0xdafedbef, L"STCaiyun", L"Arial", 0, 936},
+    {0xdb00a3d9, L"Broadway", L"Arial", 0, 1252},
+    {0xdb1f5ad4, L"STXinwei", L"Arial", 0, 936},
+    {0xdb326e7f, L"STKaiti", L"Arial", 0, 936},
+    {0xdb69595a, L"STHupo", L"Arial", 0, 936},
+    {0xdba0082c, L"STXihei", L"Arial", 0, 936},
+    {0xdbd0ab18, L"STXingkai", L"Arial", 0, 936},
+    {0xdc1a7db1, L"STLiti", L"Arial", 0, 936},
+    {0xdc33075f, L"KristenITC-Regular", L"Arial", 8, 1252},
+    {0xdcc7009c, L"Harrington", L"Arial", 0, 1252},
+    {0xdd712466, L"ArialBlack", L"Arial", 0, 1252},
+    {0xdde87b3e, L"Impact", L"Arial", 0, 1252},
+    {0xdf69fb32, L"SnapITC", L"Arial", 0, 1252},
+    {0xdf8b25e8, L"CenturyGothic", L"Arial", 0, 1252},
+    {0xe0f705c0, L"KristenITC", L"Arial", 8, 1252},
+    {0xe1427573, L"Raavi", L"Arial", 0, 1252},
+    {0xe2cea0cb, L"Magneto", L"Arial", 0, 1252},
+    {0xe36a9e17, L"Ravie", L"Arial", 0, 1252},
+    {0xe433f8e2, L"Parchment", L"Arial", 8, 1252},
+    {0xe43dff4a, L"Wingdings", L"Arial", 4, 42},
+    {0xe4e2c405, L"MTExtra", L"Arial", 6, 42},
+    {0xe618cc35, L"InformalRoman", L"Arial", 8, 1252},
+    {0xe6c27ffc, L"Mistral", L"Arial", 8, 1252},
+    {0xe7ebf4b9, L"Courier", L"Courier New", 0, 1252},
+    {0xe8bc4a9d, L"MSReferenceSpecialty", L"Arial", 0, 1252},
+    {0xe90fb013, L"TempusSansITC", L"Arial", 0, 1252},
+    {0xec637b42, L"Consolas", L"Verdana", 1, 1252},
+    {0xed3a683b, L"STXinwei", L"Arial", 0, 936},
+    {0xef264cd1, L"LucidaHandwriting", L"Arial", 0, 1252},
+    {0xf086bca2, L"BaskervilleOldFace", L"Arial", 0, 1252},
+    {0xf1028030, L"Mangal", L"Arial", 2, 1252},
+    {0xf1da7eb9, L"ShowcardGothic", L"Arial", 0, 1252},
+    {0xf210f06a, L"ArialMT", L"Arial", 0, 1252},
+    {0xf477f16a, L"Latha", L"Arial", 0, 1252},
+    {0xf616f3dd, L"LiSu", L"Arial", 1, 936},
+    {0xfa479aa6, L"MicrosoftYaHei", L"Arial", 0, 936},
+    {0xfcd19697, L"BookmanOldStyle", L"Arial", 0, 1252},
+    {0xfe209a82, L"LucidaCalligraphy", L"Arial", 0, 1252},
+    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Batang,Century,Dotum", 0, 936},
+};
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+static const XFA_FONTINFO g_XFAFontsMap[] = {
+    {0x01d5d33e, L"SimSun",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE",
+     0, 936},
+    {0x01e4f102, L"YouYuan",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE",
+     1, 936},
+    {0x030549dc, L"LiSu",
+     L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei "
+     L"Mono,WenQuanYi Micro Hei",
+     1, 936},
+    {0x032edd44, L"Simhei",
+     L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei "
+     L"Mono,WenQuanYi Micro Hei",
+     1, 936},
+    {0x03eac6fc, L"PoorRichard-Regular", L"Droid Sans Japanese,FreeSerif", 2,
+     1252},
+    {0x03ed90e6, L"Nina", L"FreeSerif", 0, 1252},
+    {0x077b56b3, L"KingsoftPhoneticPlain",
+     L"Tibetan Machine Uni,LKLUG,Samyak Gujarati,Droid Sans Thai,Droid Sans "
+     L"Armenian,Untitled1,utkal,Lohit Oriya",
+     0, 1252},
+    {0x078ed524, L"MicrosoftSansSerif",
+     L"Droid Sans Japanese,FreeSerif,WenQuanYi Micro Hei", 0, 1252},
+    {0x089b18a9, L"Arial",
+     L"Droid Sans Japanese,DejaVu Sans Condensed,FreeSerif,WenQuanYi Micro Hei",
+     0, 1252},
+    {0x0b2cad72, L"MonotypeCorsiva", L"Droid Sans Japanese,FreeSerif", 8, 1252},
+    {0x0bb003e7, L"Kartika",
+     L"FreeSans,Liberation Sans,Liberation Sans Narrow,Nimbus Sans "
+     L"L,Garuda,FreeSerif,WenQuanYi Micro Hei",
+     2, 1252},
+    {0x0bb469df, L"VinerHandITC",
+     L"Droid Sans Japanese,Ubuntu,Liberation Sans,Liberation Serif", 8, 1252},
+    {0x0bc1a851, L"SegoeUI", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0x0c112ebd, L"KozukaGothicPro-VIM", L"FreeSerif", 0, 1252},
+    {0x0cfcb9c1, L"AdobeThai", L"Droid Sans Japanese,Waree", 0, 847},
+    {0x0e7de0f9, L"Playbill",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Ethiopic,Droid Sans Japanese,FreeSerif",
+     0, 1252},
+    {0x0eff47c3, L"STHupo", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0x107ad374, L"Constantia",
+     L"Droid Sans Japanese,FreeSerif,WenQuanYi Micro Hei,Ubuntu", 2, 1252},
+    {0x12194c2d, L"KunstlerScript", L"Droid Sans Japanese,Liberation Serif", 8,
+     1252},
+    {0x135ef6a1, L"MinionProSmBd", L"Liberation Serif", 0, 1252},
+    {0x158c4049, L"Garamond",
+     L"Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 2, 1252},
+    {0x160ecb24, L"STZhongsong",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x161ed07e, L"MSGothic",
+     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,AR PL "
+     L"UMing CN,AR PL UMing HK,AR PL UMing TW",
+     1, 1252},
+    {0x171d1ed1, L"SnapITC-Regular",
+     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans L,DejaVu Sans", 0,
+     1252},
+    {0x18d1188f, L"Cambria", L"Droid Sans Japanese,FreeSerif,FreeMono", 2,
+     1252},
+    {0x18eaf350, L"ArialUnicodeMS",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x1a92d115, L"MingLiU",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     1, 1252},
+    {0x1cc217c6, L"TrebuchetMS",
+     L"Droid Sans Japanese,Liberation Serif,FreeSerif,Ubuntu", 0, 1252},
+    {0x1d649596, L"BasemicTimes",
+     L"Liberation Serif,Times New Roman,Droid Sans Japanese,FreeSerif,Ubuntu",
+     0, 1252},
+    {0x1e34ee60, L"BellMT",
+     L"KacstQurn,Droid Sans Japanese,Ubuntu,Liberation Serif", 2, 1252},
+    {0x1eb36945, L"CooperBlack",
+     L"KacstQurn,Droid Sans Japanese,FreeMono,Liberation Mono, WenQuanYi Micro "
+     L"Hei Mono",
+     2, 1252},
+    {0x1ef7787d, L"BatangChe",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing "
+     L"TW,WenQuanYi Zen Hei,WenQuanYi Micro Hei",
+     1, 1252},
+    {0x20b3bd3a, L"BrushScriptMT",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
+     L"Japanese,URW Chancery L,Liberation Sans",
+     8, 1252},
+    {0x220877aa, L"Candara", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0x22135007, L"FreestyleScript-Regular",
+     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 8, 1252},
+    {0x251059c3, L"Chiller",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
+     L"Japanese,Liberation Sans",
+     0, 1252},
+    {0x25bed6dd, L"MSReferenceSansSerif",
+     L"DejaVu Sans Condensed,Ubuntu Condensed,Droid Sans Japanese,AR PL UKai "
+     L"HK",
+     0, 1252},
+    {0x28154c81, L"Parchment-Regular", L"Droid Sans Japanese,Liberation Sans",
+     8, 1252},
+    {0x29711eb9, L"STLiti", L"AR PL UKai HK", 0, 936},
+    {0x2b1993b4, L"Basemic",
+     L"Liberation Serif,Droid Sans Japanese,Liberation Sans", 0, 1252},
+    {0x2b316339, L"NiagaraSolid-Reg", L"Droid Sans Japanese,Liberation Sans", 0,
+     1252},
+    {0x2c147529, L"FootlightMTLight",
+     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 0, 1252},
+    {0x2c198928, L"HarlowSolid",
+     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 0, 1252},
+    {0x2c6ac6b2, L"LucidaBright",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Japanese,Liberation Sans",
+     2, 1252},
+    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"DejaVu Sans", 0, 1252},
+    {0x2d5a47b0, L"STCaiyun", L"AR PL UKai HK", 0, 936},
+    {0x2def26bf, L"BernardMT-Condensed",
+     L"KacstQurn,Droid Sans Japanese,DejaVu Serif", 0, 1252},
+    {0x2fd8930b, L"KozukaMinchoPr6NR", L"DejaVu Serif", 0, 1252},
+    {0x3115525a, L"FangSong_GB2312",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 1252},
+    {0x31327817, L"MyriadPro",
+     L"Ubuntu Condensed,Droid Sans Japanese, FreeSerif", 0, 1252},
+    {0x32244975, L"Helvetica",
+     L"Ubuntu,DejaVu Sans Condensed,Liberation Sans,Liberation Sans "
+     L"Narrow,Nimbus Sans L",
+     0, 1252},
+    {0x32ac995c, L"Terminal", L"DejaVu Serif", 0, 1252},
+    {0x338d648a, L"NiagaraEngraved-Reg", L"Droid Sans Japanese,DejaVu Serif", 0,
+     1252},
+    {0x33bb65f2, L"Sylfaen", L"Droid Sans Japanese,DejaVu Sans", 2, 1252},
+    {0x3402c30e, L"MSPMincho",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 2,
+     1252},
+    {0x3412bf31, L"SimSun-PUA",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing CN,AR PL UMing HK", 0,
+     936},
+    {0x36eb39b9, L"BerlinSansFB",
+     L"Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 0, 1252},
+    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
+    {0x3864c4f6, L"HighTowerText", L"Droid Sans Japanese,DejaVu Serif", 2,
+     1252},
+    {0x3a257d03, L"FangSong_GB2312",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei", 0, 1252},
+    {0x3c7d1d07, L"Garamond3LTStd",
+     L"Droid Sans Japanese,Ubuntu Condensed,DejaVu Sans Condensed,Liberation "
+     L"Serif,Ubuntu,FreeSerif",
+     2, 1252},
+    {0x3cdae668, L"FreestyleScript",
+     L"KacstQurn,Droid Sans Japanese,DejaVu Sans", 8, 1252},
+    {0x3d55aed7, L"Jokerman", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0x3d5b4385, L"PMingLiU",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     2, 1252},
+    {0x3d9b7669, L"EstrangeloEdessa", L"Droid Sans Japanese,DejaVu Sans", 0,
+     1252},
+    {0x3e532d74, L"FranklinGothicMedium", L"Droid Sans Japanese,Ubuntu", 0,
+     1252},
+    {0x3e6aa32d, L"NSimSun",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     1, 936},
+    {0x3f6c36a8, L"Gautami",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic, mry_KacstQurn,Droid Sans "
+     L"Japanese,FreeSans",
+     0, 1252},
+    {0x3ff32662, L"Chiller-Regular",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,FreeSans", 0, 1252},
+    {0x409de312, L"ModernNo.20",
+     L"KacstQurn,Droid Sans Japanese,Nimbus Sans L,Nimbus Sans L,FreeSans", 2,
+     1252},
+    {0x41443c5e, L"Georgia", L"Droid Sans Japanese,FreeSans", 2, 1252},
+    {0x4160ade5, L"BellGothicStdBlack", L"FreeSans", 0, 1252},
+    {0x421976c4, L"Modern-Regular", L"FreeSans", 2, 1252},
+    {0x422a7252, L"Stencil", L"Droid Sans Japanese,FreeSans,Liberation Sans", 0,
+     1252},
+    {0x42c8554f, L"Fixedsys", L"FreeSerif", 0, 1252},
+    {0x435cb41d, L"Roman", L"FreeSerif", 0, 1252},
+    {0x47882383, L"CourierNew",
+     L"FreeMono,WenQuanYi Micro Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL "
+     L"UKai TW,AR PL UKai TW MBE,DejaVu Sans",
+     1, 1252},
+    {0x480a2338, L"BerlinSansFBDemi", L"Droid Sans Japanese,Liberation Serif",
+     0, 1252},
+    {0x480bf7a4, L"CourierStd", L"DejaVu Sans", 0, 1252},
+    {0x481ad6ed, L"VladimirScript", L"Droid Sans Japanese,DejaVu Serif", 8,
+     1252},
+    {0x4911577a, L"YouYuan",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 1,
+     936},
+    {0x4a788d72, L"STXingkai", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0x4bf88566, L"SegoeCondensed", L"FreeSerif", 0, 1252},
+    {0x4ccf51a4, L"BerlinSansFB-Reg", L"Droid Sans Japanese,Liberation Serif",
+     0, 1252},
+    {0x4ea967ce, L"GulimChe",
+     L"WenQuanYi Zen Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL "
+     L"UKai TW MBE",
+     1, 1252},
+    {0x4f68bd79, L"LetterGothicStd",
+     L"FreeMono,Liberation Mono,Andale Mono,WenQuanYi Micro Hei Mono", 0, 1252},
+    {0x51a0d0e6, L"KozukaGothicPr6NM", L"FreeSerif", 0, 1252},
+    {0x531b3dea, L"BasemicSymbol", L"FreeSerif", 0, 1252},
+    {0x5333fd39, L"CalifornianFB-Reg",
+     L"Droid Sans Japanese,URW Chancery L,FreeSerif", 2, 1252},
+    {0x53561a54, L"FZYTK--GBK1-0",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x55e0dde6, L"LucidaSansTypewriter",
+     L"Ubuntu Mono,DejaVu Sans Mono,Nimbus Mono L,Liberation Mono,Courier 10 "
+     L"Pitch,FreeMono",
+     0, 1252},
+    {0x574d4d3d, L"AdobeArabic", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0x5792e759, L"STKaiti", L"WenQuanYi Micro Hei Mono", 0, 936},
+    {0x5921978e, L"LucidaSansUnicode", L"Droid Sans Japanese,DejaVu Sans", 0,
+     1252},
+    {0x594e2da4, L"Vrinda",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Arabic "
+     L"Naskh,mry_KacstQurn,Droid Sans Japanese,FreeSans,FreeSerif",
+     0, 1252},
+    {0x59baa9a2, L"KaiTi_GB2312",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 1252},
+    {0x5cfedf4f, L"BaskOldFace",
+     L"KacstQurn,Droid Sans Japanese,Ubuntu,Liberation Serif", 0, 1252},
+    {0x5e16ac91, L"TrajanPro",
+     L"Nimbus Sans L,AR PL UMing HK,AR PL UKai HK,AR PL UMing TW,AR PL UMing "
+     L"TW MBE,DejaVu Sans,DejaVu Serif",
+     0, 1252},
+    {0x5f388196, L"ITCLegacySansStdMedium",
+     L"Liberation Serif,FreeSerif,FreeSans,Ubuntu", 0, 1252},
+    {0x5f97921c, L"AdobeMyungjoStdM",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x5fefbfad, L"Batang",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     2, 1252},
+    {0x605342b9, L"DotumChe",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 1,
+     1252},
+    {0x608c5f9a, L"KaiTi_GB2312",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x61efd0d1, L"MaturaMTScriptCapitals",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Japanese,DejaVu Serif,DejaVu Sans",
+     0, 1252},
+    {0x626608a9, L"MVBoli",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Ethiopic,Droid Sans Japanese,DejaVu Sans",
+     0, 1252},
+    {0x630501a3, L"SmallFonts", L"DejaVu Serif", 0, 1252},
+    {0x65d0e2a9, L"FZYTK--GBK1-0",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x669f29e1, L"FZSTK--GBK1-0",
+     L"AR PL UMing CN,AR PL UKai CN, AR PL UMing HK", 0, 936},
+    {0x673a9e5f, L"Tunga",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Japanese,DejaVu Serif",
+     0, 1252},
+    {0x691aa4ce, L"NiagaraSolid", L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
+    {0x696259b7, L"Corbel", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0x696ee9be, L"STXihei", L"WenQuanYi Micro Hei Mono", 0, 936},
+    {0x6c59cf69, L"Dotum", L"WenQuanYi Zen Hei Mono", 0, 1252},
+    {0x707fa561, L"Gungsuh", L"WenQuanYi Zen Hei Mono", 2, 1252},
+    {0x71416bb2, L"ZWAdobeF",
+     L"KacstArt,KacstBookm,KacstDecorative,KacstDigital,KacstFarsi,KacstLetter,"
+     L"KacstOffice,Dingbats,FreeSerif",
+     0, 1252},
+    {0x71b41801, L"Verdana",
+     L"DejaVu Sans Condensed,Ubuntu Condensed,Droid Sans Japanese,DejaVu Sans",
+     0, 1252},
+    {0x73f25e4c, L"PalatinoLinotype", L"Droid Sans Japanese,FreeSerif", 0,
+     1252},
+    {0x73f4d19f, L"NiagaraEngraved", L"Droid Sans Japanese,FreeSerif", 0, 1252},
+    {0x74001694, L"MyriadProBlack", L"Droid Sans Japanese,AR PL UKai HK", 0,
+     1252},
+    {0x74b14d8f, L"Haettenschweiler", L"Droid Sans Japanese,DejaVu Serif", 0,
+     1252},
+    {0x74cb44ee, L"NSimSun", L"WenQuanYi Zen Hei Mono", 1, 936},
+    {0x76b4d7ff, L"Shruti",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Japanese,FreeSans",
+     0, 1252},
+    {0x788b3533, L"Webdings", L"FreeSans", 6, 42},
+    {0x797dde99, L"MSSerif", L"FreeSans", 0, 1252},
+    {0x7a0f9e9e, L"MSMincho",
+     L"WenQuanYi Micro Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW",
+     1, 1252},
+    {0x7b439caf, L"OldEnglishTextMT",
+     L"Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
+    {0x8213a433, L"LucidaSans-Typewriter",
+     L"Ubuntu Mono,Liberation Mono,DejaVu Sans Mono", 0, 1252},
+    {0x82fec929, L"AdobeSongStdL",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0x83581825, L"Modern", L"FreeSans", 0, 1252},
+    {0x835a2823, L"Algerian",
+     L"KacstQurn,Droid Sans Japanese,FreeSans,Liberation Sans,Ubuntu", 0, 1252},
+    {0x83dab9f5, L"Script", L"FreeSans", 0, 1252},
+    {0x847b56da, L"Tahoma",
+     L"Droid Sans Japanese,DejaVu Sans Condensed,FreeSerif", 0, 1252},
+    {0x8a783cb2, L"SimSun-PUA",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 1252},
+    {0x8b5cac0e, L"Onyx", L"Droid Sans Japanese,Liberation Sans", 0, 1252},
+    {0x8c6a499e, L"Gulim",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 1252},
+    {0x8e0af790, L"JuiceITC", L"Droid Sans Japanese,Liberation Sans", 0, 1252},
+    {0x8e8d43b2, L"Centaur",
+     L"KacstQurn,Droid Sans Japanese,Khmer OS,Khmer OS System", 2, 1252},
+    {0x8ee4dcca, L"BookshelfSymbol7", L"Liberation Sans", 0, 1252},
+    {0x90794800, L"BellGothicStdLight", L"Liberation Sans", 0, 1252},
+    {0x909b516a, L"Century",
+     L"Droid Sans Japanese,Liberation Sans,Liberation Mono,Liberation Serif", 2,
+     1252},
+    {0x92ae370d, L"MSOutlook", L"Liberation Sans", 4, 42},
+    {0x93c9fbf1, L"LucidaFax",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans "
+     L"Ethiopic,mry_KacstQurn,Liberation Sans",
+     2, 1252},
+    {0x9565085e, L"BookAntiqua",
+     L"Droid Sans Japanese,Liberation Sans,Liberation Serif", 2, 1252},
+    {0x9856d95d, L"AdobeMingStdL", L"AR PL UMing HK", 0, 949},
+    {0x9bbadd6b, L"ColonnaMT",
+     L"KacstQurn,Droid Sans Japanese,Khmer OS,Khmer OS System", 0, 1252},
+    {0x9cbd16a4, L"ShowcardGothic-Reg",
+     L"Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
+    {0x9d73008e, L"MSSansSerif", L"FreeSerif", 0, 1252},
+    {0xa0607db1, L"GungsuhChe",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     1, 1252},
+    {0xa0bcf6a1, L"LatinWide", L"FreeSerif", 2, 1252},
+    {0xa1429b36, L"Symbol", L"FreeSerif", 6, 42},
+    {0xa1fa5abc, L"Wingdings2", L"FreeSerif", 6, 42},
+    {0xa1fa5abd, L"Wingdings3", L"FreeSerif", 6, 42},
+    {0xa427bad4, L"InformalRoman-Regular",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Japanese,FreeSerif",
+     8, 1252},
+    {0xa8b92ece, L"FZSTK--GBK1-0", L"AR PL UMing CN", 0, 936},
+    {0xa8d83ece, L"CalifornianFB", L"Droid Sans Japanese,FreeSerif", 2, 1252},
+    {0xaa3e082c, L"Kingsoft-Phonetic",
+     L"Tibetan Machine Uni,LKLUG,Samyak Gujarati,Droid Sans "
+     L"Thai,utkal,Kedage,Mallige,AR PL UKai CN",
+     0, 1252},
+    {0xaa6bcabe, L"HarlowSolidItalic",
+     L"KacstQurn,Droid Sans Japanese,Liberation Serif", 0, 1252},
+    {0xade5337c, L"MSUIGothic",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 1252},
+    {0xb08dd941, L"WideLatin",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Japanese,Liberation Serif",
+     2, 1252},
+    {0xb12765e0, L"ITCLegacySansStdBook",
+     L"AR PL UMing HK,AR PL UKai HK,FreeSerif,Ubuntu,FreeSans", 0, 1252},
+    {0xb207f05d, L"PoorRichard", L"Droid Sans Japanese,Liberation Serif", 2,
+     1252},
+    {0xb3bc492f, L"JuiceITC-Regular", L"Droid Sans Japanese,Liberation Serif",
+     0, 1252},
+    {0xb5545399, L"Marlett", L"Liberation Serif", 4, 42},
+    {0xb5dd1ebb, L"BritannicBold",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans "
+     L"Ethiopic,mry_KacstQurn,Liberation Serif",
+     0, 1252},
+    {0xb699c1c5, L"LucidaCalligraphy-Italic",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Japanese,DejaVu Serif",
+     0, 1252},
+    {0xb725d629, L"TimesNewRoman", L"Droid Sans Japanese,Liberation Sans", 2,
+     1252},
+    {0xb7eaebeb, L"AdobeHeitiStdR",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0xbd29c486, L"BerlinSansFBDemi-Bold", L"Droid Sans Japanese,DejaVu Serif",
+     0, 1252},
+    {0xbe8a8db4, L"BookshelfSymbolSeven", L"DejaVu Sans", 0, 1252},
+    {0xc16c0118, L"AdobeHebrew", L"Droid Sans Japanese,Ubuntu,Liberation Serif",
+     0, 1252},
+    {0xc318b0af, L"MyriadProLight",
+     L"Droid Sans Japanese,AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     1252},
+    {0xc65e5659, L"CambriaMath", L"Droid Sans Japanese,FreeSerif,FreeMono", 2,
+     1252},
+    {0xc75c8f05, L"LucidaConsole",
+     L"Liberation Mono,DejaVu Sans Mono,FreeMono,WenQuanYi Micro Hei Mono", 1,
+     1252},
+    {0xca7c35d6, L"Calibri", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
+    {0xcb053f53, L"MicrosoftYaHei",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0xcb7190f9, L"Magneto-Bold",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Japanese,DejaVu Serif",
+     0, 1252},
+    {0xcca00cc5, L"System", L"DejaVu Sans", 0, 1252},
+    {0xccad6f76, L"Jokerman-Regular", L"Droid Sans Japanese,DejaVu Sans", 0,
+     1252},
+    {0xccc5818c, L"EuroSign", L"DejaVu Serif", 0, 1252},
+    {0xcf3d7234, L"LucidaHandwriting-Italic",
+     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans L,DejaVu Serif", 0,
+     1252},
+    {0xcf7b8fdb, L"MinionPro", L"DejaVu Sans", 0, 1252},
+    {0xcfe5755f, L"Simhei",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     1, 936},
+    {0xd011f4ee, L"MSPGothic",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 0,
+     1252},
+    {0xd060e7ef, L"Vivaldi",
+     L"KacstQurn,Droid Sans Japanese,Liberation Sans,Ubuntu", 8, 1252},
+    {0xd07edec1, L"FranklinGothic-Medium", L"Droid Sans Japanese,Ubuntu", 0,
+     1252},
+    {0xd107243f, L"SimSun", L"WenQuanYi Zen Hei Mono", 0, 936},
+    {0xd1881562, L"ArialNarrow",
+     L"Liberation Sans Narrow,Droid Sans Japanese,FreeSerif", 0, 1252},
+    {0xd22b7dce, L"BodoniMTPosterCompressed",
+     L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
+    {0xd22bfa60, L"ComicSansMS",
+     L"Droid Sans Japanese,FreeMono,Liberation Mono", 8, 1252},
+    {0xd3bd0e35, L"Bauhaus93",
+     L"KacstQurn,Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
+    {0xd429ee7a, L"STFangsong", L"WenQuanYi Micro Hei Mono", 0, 936},
+    {0xd6679c12, L"BernardMTCondensed",
+     L"KacstQurn,Droid Sans Japanese,Nimbus Sans L,URW Chancery "
+     L"L,KacstOne,Liberation Sans",
+     0, 1252},
+    {0xd8e8a027, L"LucidaSans",
+     L"Liberation Sans Narrow,Nimbus Sans L,KacstQurn,Droid Arabic Naskh,Droid "
+     L"Sans Ethiopic,DejaVu Serif Condensed,Liberation Mono,Ubuntu",
+     0, 1252},
+    {0xd9fe7761, L"HighTowerText-Reg",
+     L"Droid Sans Japanese,Ubuntu,Liberation Serif", 2, 1252},
+    {0xda7e551e, L"STSong", L"WenQuanYi Micro Hei Mono", 0, 936},
+    {0xdaa6842d, L"STZhongsong",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0xdaaab93f, L"STFangsong",
+     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
+     L"Hei,WenQuanYi Zen Hei Sharp",
+     0, 936},
+    {0xdaeb0713, L"STSong",
+     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
+     L"Hei,WenQuanYi Zen Hei Sharp",
+     0, 936},
+    {0xdafedbef, L"STCaiyun", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0xdb00a3d9, L"Broadway",
+     L"KacstQurn,Droid Sans Japanese,DejaVu Sans,FreeMono,Liberation Mono", 0,
+     1252},
+    {0xdb1f5ad4, L"STXinwei", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0xdb326e7f, L"STKaiti",
+     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
+     L"Hei,WenQuanYi Zen Hei Sharp",
+     0, 936},
+    {0xdb69595a, L"STHupo",
+     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
+     L"Hei,WenQuanYi Zen Hei Sharp",
+     0, 936},
+    {0xdba0082c, L"STXihei",
+     L" WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
+     L"Hei,WenQuanYi Zen Hei Sharp",
+     0, 936},
+    {0xdbd0ab18, L"STXingkai", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0xdc1a7db1, L"STLiti", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0xdc33075f, L"KristenITC-Regular",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu Sans "
+     L"Condensed,Ubuntu,Liberation Sans",
+     8, 1252},
+    {0xdcc7009c, L"Harrington",
+     L"KacstQurn,Droid Sans Japanese,Liberation Serif,FreeSerif,Ubuntu", 0,
+     1252},
+    {0xdd712466, L"ArialBlack",
+     L"Droid Sans Japanese,DejaVu Sans,DejaVu Serif,FreeMono", 0, 1252},
+    {0xdde87b3e, L"Impact", L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
+    {0xdf69fb32, L"SnapITC",
+     L"Liberation Sans Narrow,Ubuntu Condensed,DejaVu Sans,DejaVu "
+     L"Serif,FreeMono",
+     0, 1252},
+    {0xdf8b25e8, L"CenturyGothic",
+     L"Droid Sans Japanese,Liberation Mono,Liberation Sans,Liberation Serif", 0,
+     1252},
+    {0xe0f705c0, L"KristenITC",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu Sans "
+     L"Condensed,Ubuntu,Liberation Sans",
+     8, 1252},
+    {0xe1427573, L"Raavi",
+     L"Droid Arabic Naskh,Droid Sans "
+     L"Ethiopic,mry_KacstQurn,FreeSerif,Liberation Serif,Khmer OS",
+     0, 1252},
+    {0xe2cea0cb, L"Magneto",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu "
+     L"Serif,DejaVu Serif Condensed,DejaVu Sans",
+     0, 1252},
+    {0xe36a9e17, L"Ravie",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu "
+     L"Serif,DejaVu Sans,FreeMono",
+     0, 1252},
+    {0xe433f8e2, L"Parchment", L"Droid Sans Japanese,DejaVu Serif", 8, 1252},
+    {0xe43dff4a, L"Wingdings", L"DejaVu Serif", 4, 42},
+    {0xe4e2c405, L"MTExtra", L"DejaVu Serif", 6, 42},
+    {0xe618cc35, L"InformalRoman",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
+     L"Japanese,Nimbus Sans L,DejaVu Sans Condensed,Ubuntu,Liberation Sans",
+     8, 1252},
+    {0xe6c27ffc, L"Mistral", L"Droid Sans Japanese,DejaVu Serif", 8, 1252},
+    {0xe7ebf4b9, L"Courier", L"DejaVu Sans,DejaVu Sans Condensed,FreeSerif", 0,
+     1252},
+    {0xe8bc4a9d, L"MSReferenceSpecialty", L"DejaVu Serif", 0, 1252},
+    {0xe90fb013, L"TempusSansITC",
+     L"Droid Sans Japanese,Ubuntu,Liberation Serif,FreeSerif", 0, 1252},
+    {0xec637b42, L"Consolas",
+     L"DejaVu Sans Condensed,AR PL UKai CN,AR PL UKai HK,AR PL UKai "
+     L"TW,FreeSerif,FreeSans",
+     1, 1252},
+    {0xed3a683b, L"STXinwei", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
+     936},
+    {0xef264cd1, L"LucidaHandwriting",
+     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans "
+     L"L,KacstQurn,Liberation Mono",
+     0, 1252},
+    {0xf086bca2, L"BaskervilleOldFace",
+     L"KacstQurn,Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 0,
+     1252},
+    {0xf1028030, L"Mangal",
+     L"FreeSans,TSCu_Paranar,Garuda,Liberation Sans,Liberation Sans "
+     L"Narrow,Nimbus Sans L",
+     2, 1252},
+    {0xf1da7eb9, L"ShowcardGothic",
+     L"Droid Sans Japanese,DejaVu Serif Condensed,DejaVu Sans "
+     L"Condensed,Liberation Sans,Ubuntu",
+     0, 1252},
+    {0xf210f06a, L"ArialMT",
+     L"Liberation Sans,Liberation Sans Narrow,FreeSans,Nimbus Sans L,Khmer OS "
+     L"System,Khmer OS",
+     0, 1252},
+    {0xf477f16a, L"Latha",
+     L"Liberation Sans Narrow,Nimbus Sans L,Droid Arabic "
+     L"Naskh,mry_KacstQurn,FreeSerif,Nimbus Sans L",
+     0, 1252},
+    {0xf616f3dd, L"LiSu",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE",
+     1, 936},
+    {0xfa479aa6, L"MicrosoftYaHei",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+    {0xfcd19697, L"BookmanOldStyle",
+     L"Droid Sans Japanese,Liberation Mono,Liberation Sans,Liberation Serif", 0,
+     1252},
+    {0xfe209a82, L"LucidaCalligraphy",
+     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
+     L"Sans Japanese,DejaVu Serif,DejaVu Sans,FreeMono",
+     0, 1252},
+    {0xfef135f8, L"AdobeHeitiStd-Regular",
+     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
+     L"Sharp,WenQuanYi Micro Hei",
+     0, 936},
+};
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+static const XFA_FONTINFO g_XFAFontsMap[] = {
+    {0x01d5d33e, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936},
+    {0x01e4f102, L"YouYuan", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0x030549dc, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0x032edd44, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0x03eac6fc, L"PoorRichard-Regular",
+     L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252},
+    {0x03ed90e6, L"Nina", L"Microsoft Sans Serif", 0, 1252},
+    {0x077b56b3, L"KingsoftPhoneticPlain",
+     L"LastResort,Apple "
+     L"Chancery,STIXVariants,STIXSizeOneSym,STIXSizeOneSym,Apple Braille",
+     0, 1252},
+    {0x078ed524, L"MicrosoftSansSerif", L"Songti SC,Apple Symbols", 0, 1252},
+    {0x089b18a9, L"Arial",
+     L"Arial Unicode MS,Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x0b2cad72, L"MonotypeCorsiva", L"Arial Narrow,Impact", 8, 1252},
+    {0x0bb003e7, L"Kartika",
+     L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Damascus", 2, 1252},
+    {0x0bb469df, L"VinerHandITC", L"Comic Sans MS,Songti SC,STSong", 8, 1252},
+    {0x0bc1a851, L"SegoeUI", L"Apple Symbols", 0, 1252},
+    {0x0c112ebd, L"KozukaGothicPro-VIM", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0x0cfcb9c1, L"AdobeThai", L"Avenir Next Condensed Ultra Light", 0, 847},
+    {0x0e7de0f9, L"Playbill", L"STIXNonUnicode", 0, 1252},
+    {0x0eff47c3, L"STHupo", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
+    {0x107ad374, L"Constantia", L"Arial Unicode MS,Palatino,Baskerville", 2,
+     1252},
+    {0x12194c2d, L"KunstlerScript",
+     L"Avenir Next Condensed Demi Bold,Arial Narrow", 8, 1252},
+    {0x135ef6a1, L"MinionProSmBd", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x158c4049, L"Garamond", L"Impact,Arial Narrow", 2, 1252},
+    {0x160ecb24, L"STZhongsong", L"STFangsong,Songti SC", 0, 936},
+    {0x161ed07e, L"MSGothic",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing "
+     L"TW,Microsoft Sans Serif,Apple Symbols",
+     1, 1252},
+    {0x171d1ed1, L"SnapITC-Regular", L"STHeiti,Arial Black", 0, 1252},
+    {0x18d1188f, L"Cambria", L"Arial Unicode MS", 2, 1252},
+    {0x18eaf350, L"ArialUnicodeMS", L"Microsoft Sans Serif,Apple Symbols", 0,
+     936},
+    {0x1a92d115, L"MingLiU", L"Heiti SC,STHeiti", 1, 1252},
+    {0x1cc217c6, L"TrebuchetMS", L"Damascus,Impact,Arial Narrow", 0, 1252},
+    {0x1d649596, L"BasemicTimes", L"Liberation Serif,Impact,Arial Narrow", 0,
+     1252},
+    {0x1e34ee60, L"BellMT",
+     L"Papyrus,STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 2, 1252},
+    {0x1eb36945, L"CooperBlack",
+     L"Marion,STIXNonUnicode,Arial Rounded MT Bold,Lucida Grande", 2, 1252},
+    {0x1ef7787d, L"BatangChe",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE,Arial Unicode MS,Heiti TC",
+     1, 1252},
+    {0x20b3bd3a, L"BrushScriptMT",
+     L"STIXNonUnicode,Damascus,Arial Narrow,Avenir Next Condensed,Cochin", 8,
+     1252},
+    {0x220877aa, L"Candara", L"Cochin,Baskerville,Marion", 0, 1252},
+    {0x22135007, L"FreestyleScript-Regular",
+     L"STIXNonUnicode,Nadeem,Zapf Dingbats", 8, 1252},
+    {0x251059c3, L"Chiller",
+     L"Zapf Dingbats,Damascus,STIXNonUnicode,Papyrus,KufiStandardGK,Baghdad", 0,
+     1252},
+    {0x25bed6dd, L"MSReferenceSansSerif",
+     L"Tahoma,Apple Symbols,Apple LiGothic,Arial Unicode MS,Lucida "
+     L"Grande,Microsoft Sans Serif",
+     0, 1252},
+    {0x28154c81, L"Parchment-Regular", L"Microsoft Sans Serif,Apple Symbols", 8,
+     1252},
+    {0x29711eb9, L"STLiti", L"Kaiti SC,Songti SC", 0, 936},
+    {0x2b1993b4, L"Basemic", L"Impact,Arial Narrow", 0, 1252},
+    {0x2b316339, L"NiagaraSolid-Reg", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x2c147529, L"FootlightMTLight",
+     L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans,Noteworthy", 0, 1252},
+    {0x2c198928, L"HarlowSolid",
+     L"Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0, 1252},
+    {0x2c6ac6b2, L"LucidaBright",
+     L"PT Sans Narrow,Papyrus,Damascus,STIXNonUnicode,Arial Rounded MT "
+     L"Bold,Comic Sans MS,Avenir Next",
+     2, 1252},
+    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0x2d5a47b0, L"STCaiyun", L"Kaiti SC,Songti SC", 0, 936},
+    {0x2def26bf, L"BernardMT-Condensed",
+     L"Impact,Avenir Next Condensed Demi Bold,American Typewriter", 0, 1252},
+    {0x2fd8930b, L"KozukaMinchoPr6NR", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x3115525a, L"FangSong_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
+    {0x31327817, L"MyriadPro", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x32244975, L"Helvetica",
+     L"Arial Narrow,Arial Unicode MS,Damascus,STIXNonUnicode", 0, 1252},
+    {0x32ac995c, L"Terminal", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x338d648a, L"NiagaraEngraved-Reg", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0x33bb65f2, L"Sylfaen", L"Arial Unicode MS,Marion", 2, 1252},
+    {0x3402c30e, L"MSPMincho", L"Arial Unicode MS,Apple SD Gothic Neo", 2,
+     1252},
+    {0x3412bf31, L"SimSun-PUA", L"STHeiti,Heiti TC,STFangsong", 0, 936},
+    {0x36eb39b9, L"BerlinSansFB", L"American Typewriter,Impact", 0, 1252},
+    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
+    {0x3864c4f6, L"HighTowerText", L"STIXGeneral,.Helvetica Neue Desk UI", 2,
+     1252},
+    {0x3a257d03, L"FangSong_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
+    {0x3cdae668, L"FreestyleScript", L"Nadeem,Zapf Dingbats,STIXNonUnicode", 8,
+     1252},
+    {0x3d55aed7, L"Jokerman",
+     L"Papyrus,Lucida Grande,Heiti TC,American Typewriter", 0, 1252},
+    {0x3d5b4385, L"PMingLiU", L"Heiti SC,STHeiti", 2, 1252},
+    {0x3d9b7669, L"EstrangeloEdessa", L"American Typewriter,Marion", 0, 1252},
+    {0x3e532d74, L"FranklinGothicMedium", L"Impact,Arial Narrow", 0, 1252},
+    {0x3e6aa32d, L"NSimSun", L"STHeiti,STFangsong", 1, 936},
+    {0x3f6c36a8, L"Gautami",
+     L"Damascus,STIXNonUnicode,STIXGeneral,American Typewriter", 0, 1252},
+    {0x3ff32662, L"Chiller-Regular", L"Papyrus,KufiStandardGK,Baghdad", 0,
+     1252},
+    {0x409de312, L"ModernNo.20", L"Avenir Next Condensed,Impact", 2, 1252},
+    {0x41443c5e, L"Georgia", L".Helvetica Neue Desk UI,Arial Unicode MS", 2,
+     1252},
+    {0x4160ade5, L"BellGothicStdBlack", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0x421976c4, L"Modern-Regular", L"Impact", 2, 1252},
+    {0x422a7252, L"Stencil", L"STIXNonUnicode,Songti SC,Georgia,Baskerville", 0,
+     1252},
+    {0x42c8554f, L"Fixedsys", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x435cb41d, L"Roman", L"Arial Narrow", 0, 1252},
+    {0x47882383, L"CourierNew", L"PCMyungjo,Osaka,Arial Unicode MS,Songti SC",
+     1, 1252},
+    {0x480a2338, L"BerlinSansFBDemi",
+     L"STIXNonUnicode,American Typewriter,Avenir Next Condensed Heavy", 0,
+     1252},
+    {0x480bf7a4, L"CourierStd", L"Courier New", 0, 1252},
+    {0x481ad6ed, L"VladimirScript",
+     L"STIXNonUnicode,Avenir Next Condensed,Impact", 8, 1252},
+    {0x4911577a, L"YouYuan", L"STHeiti,Heiti TC", 1, 936},
+    {0x4a788d72, L"STXingkai", L"Kaiti SC,Songti SC", 0, 936},
+    {0x4bf88566, L"SegoeCondensed", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x4ccf51a4, L"BerlinSansFB-Reg",
+     L"STIXNonUnicode,American Typewriter,Impact", 0, 1252},
+    {0x4ea967ce, L"GulimChe", L"Arial Unicode MS,Heiti TC,STFangsong", 1, 1252},
+    {0x4f68bd79, L"LetterGothicStd",
+     L"Courier New,Andale Mono,Ayuthaya,PCMyungjo,Osaka", 0, 1252},
+    {0x51a0d0e6, L"KozukaGothicPr6NM", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x531b3dea, L"BasemicSymbol", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x5333fd39, L"CalifornianFB-Reg",
+     L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252},
+    {0x53561a54, L"FZYTK--GBK1-0", L"STFangsong,Songti SC,STSong", 0, 936},
+    {0x55e0dde6, L"LucidaSansTypewriter", L"Menlo,Courier New,Andale Mono", 0,
+     1252},
+    {0x574d4d3d, L"AdobeArabic", L"Arial Narrow", 0, 1252},
+    {0x5792e759, L"STKaiti", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0x5921978e, L"LucidaSansUnicode", L"Lucida Grande,Arial Unicode MS,Menlo",
+     0, 1252},
+    {0x594e2da4, L"Vrinda", L"Geeza Pro,Damascus,STIXGeneral,Gill Sans", 0,
+     1252},
+    {0x59baa9a2, L"KaiTi_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
+    {0x5cfedf4f, L"BaskOldFace",
+     L"Avenir Next Condensed Heavy,PT Sans,Avenir Next Condensed", 0, 1252},
+    {0x5e16ac91, L"TrajanPro", L"Arial Narrow,PT Sans Narrow,Damascus", 0,
+     1252},
+    {0x5f97921c, L"AdobeMyungjoStdM",
+     L"AppleMyungjo,AppleGothic,Arial Unicode MS", 0, 936},
+    {0x5fefbfad, L"Batang", L"Arial Unicode MS,Songti SC", 2, 1252},
+    {0x605342b9, L"DotumChe", L"Arial Unicode MS,Heiti TC", 1, 1252},
+    {0x608c5f9a, L"KaiTi_GB2312", L"Hiragino Sans GB,STHeiti,Heiti TC", 0, 936},
+    {0x61efd0d1, L"MaturaMTScriptCapitals",
+     L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black,Avenir Next Heavy",
+     0, 1252},
+    {0x626608a9, L"MVBoli",
+     L"Apple Braille,Geeza Pro,Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x630501a3, L"SmallFonts", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x65d0e2a9, L"FZYTK--GBK1-0", L"STFangsong,Songti SC,STSong", 0, 936},
+    {0x669f29e1, L"FZSTK--GBK1-0", L"STHeiti,Heiti TC", 0, 936},
+    {0x673a9e5f, L"Tunga",
+     L"Damascus,STIXNonUnicode,Avenir Next Condensed,Avenir Next Condensed "
+     L"Ultra Light,Futura",
+     0, 1252},
+    {0x691aa4ce, L"NiagaraSolid", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x696259b7, L"Corbel", L"Cochin,Baskerville,Marion", 0, 1252},
+    {0x696ee9be, L"STXihei", L"STHeiti,Heiti TC,Songti SC,Arial Unicode MS", 0,
+     936},
+    {0x6c59cf69, L"Dotum", L"Arial Unicode MS,Songti SC", 0, 1252},
+    {0x707fa561, L"Gungsuh", L"Arial Unicode MS,Heiti TC", 2, 1252},
+    {0x71416bb2, L"ZWAdobeF",
+     L"STIXSizeFourSym,STIXSizeThreeSym,STIXSizeTwoSym,STIXSizeOneSym", 0,
+     1252},
+    {0x71b41801, L"Verdana",
+     L"Tahoma,Marion,Apple Symbols,.Helvetica Neue Desk UI,Lucida "
+     L"Grande,Courier New",
+     0, 1252},
+    {0x73f25e4c, L"PalatinoLinotype", L"Palatino,Arial Unicode MS", 0, 1252},
+    {0x73f4d19f, L"NiagaraEngraved", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x74001694, L"MyriadProBlack", L"Palatino,Baskerville,Marion,Cochin", 0,
+     1252},
+    {0x74b14d8f, L"Haettenschweiler", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x74cb44ee, L"NSimSun", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0x76b4d7ff, L"Shruti",
+     L"Damascus,STIXNonUnicode,Arial Unicode MS,American Typewriter", 0, 1252},
+    {0x788b3533, L"Webdings", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
+    {0x797dde99, L"MSSerif", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x7a0f9e9e, L"MSMincho",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE,Arial Unicode MS,Apple SD Gothic Neo",
+     1, 1252},
+    {0x7b439caf, L"OldEnglishTextMT",
+     L"STIXNonUnicode,Arial Unicode MS,Baskerville,Avenir Next Medium", 0,
+     1252},
+    {0x8213a433, L"LucidaSans-Typewriter",
+     L"Comic Sans MS,Avenir Next,Arial Rounded MT Bold", 0, 1252},
+    {0x82fec929, L"AdobeSongStdL", L"Heiti TC,STHeiti", 0, 936},
+    {0x83581825, L"Modern", L"Avenir Next Condensed,Impact", 0, 1252},
+    {0x835a2823, L"Algerian",
+     L"STIXNonUnicode,Baskerville,Avenir Next Medium,American Typewriter", 0,
+     1252},
+    {0x83dab9f5, L"Script", L"Arial Narrow", 0, 1252},
+    {0x847b56da, L"Tahoma", L"Songti SC,Apple Symbols", 0, 1252},
+    {0x8a783cb2, L"SimSun-PUA", L"STHeiti,Heiti TC,STFangsong", 0, 1252},
+    {0x8b5cac0e, L"Onyx", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0x8c6a499e, L"Gulim", L"Arial Unicode MS,Songti SC", 0, 1252},
+    {0x8e0af790, L"JuiceITC", L"Nadeem,Al Bayan", 0, 1252},
+    {0x8e8d43b2, L"Centaur", L"Avenir Next Condensed,Noteworthy,Impact", 2,
+     1252},
+    {0x8ee4dcca, L"BookshelfSymbol7", L"Microsoft Sans Serif,Apple Symbols", 0,
+     1252},
+    {0x90794800, L"BellGothicStdLight", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0x909b516a, L"Century", L"Damascus,Andale Mono,Songti SC,Arial Unicode MS",
+     2, 1252},
+    {0x92ae370d, L"MSOutlook", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
+    {0x93c9fbf1, L"LucidaFax",
+     L"PT Sans Narrow,Papyrus,Kokonor,Geeza Pro,Arial Rounded MT Bold,Lucida "
+     L"Grande,Futura",
+     2, 1252},
+    {0x9565085e, L"BookAntiqua", L"Palatino,Microsoft Sans Serif,Apple Symbols",
+     2, 1252},
+    {0x9856d95d, L"AdobeMingStdL", L"AHiragino Sans GB,Heiti TC,STHeiti", 0,
+     949},
+    {0x9bbadd6b, L"ColonnaMT", L"Noteworthy,Avenir Next Condensed,Impact", 0,
+     1252},
+    {0x9cbd16a4, L"ShowcardGothic-Reg",
+     L"Arial Unicode MS,Georgia,American Typewriter", 0, 1252},
+    {0x9d73008e, L"MSSansSerif", L"Songti SC,Apple Symbols", 0, 1252},
+    {0xa0607db1, L"GungsuhChe",
+     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
+     L"PL UMing TW MBE,Arial Unicode MS,Heiti TC,STFangsong",
+     1, 1252},
+    {0xa0bcf6a1, L"LatinWide", L"Zapfino,Arial Black,STHeiti", 2, 1252},
+    {0xa1429b36, L"Symbol", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
+    {0xa1fa5abc, L"Wingdings2", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
+    {0xa1fa5abd, L"Wingdings3", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
+    {0xa427bad4, L"InformalRoman-Regular",
+     L"STIXNonUnicode,Arial Narrow,Avenir Next Condensed Demi Bold", 8, 1252},
+    {0xa8b92ece, L"FZSTK--GBK1-0", L"STHeiti,Heiti TC,STFangsong", 0, 936},
+    {0xa8d83ece, L"CalifornianFB",
+     L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252},
+    {0xaa3e082c, L"Kingsoft-Phonetic",
+     L"STIXVariants,STIXSizeOneSym,Apple Braille", 0, 1252},
+    {0xaa6bcabe, L"HarlowSolidItalic",
+     L"STIXNonUnicode,Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0,
+     1252},
+    {0xade5337c, L"MSUIGothic", L"Arial Unicode MS,Apple SD Gothic Neo", 0,
+     1252},
+    {0xb08dd941, L"WideLatin",
+     L"Marion,Papyrus,Nanum Pen Script,Zapf Dingbats,Damascus,Zapfino,Arial "
+     L"Black,STHeiti",
+     2, 1252},
+    {0xb12765e0, L"ITCLegacySansStdBook",
+     L"LastResort,.Helvetica Neue Desk UI,Arial Unicode MS,Palatino", 0, 1252},
+    {0xb207f05d, L"PoorRichard", L"Noteworthy,Avenir Next Condensed,Impact", 2,
+     1252},
+    {0xb3bc492f, L"JuiceITC-Regular", L"Nadeem,Al Bayan,STIXNonUnicode", 0,
+     1252},
+    {0xb5545399, L"Marlett", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
+    {0xb5dd1ebb, L"BritannicBold",
+     L"Damascus,STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252},
+    {0xb699c1c5, L"LucidaCalligraphy-Italic", L"STHeiti,Arial Black", 0, 1252},
+    {0xb725d629, L"TimesNewRoman", L"Microsoft Sans Serif,Apple Symbols", 2,
+     1252},
+    {0xb7eaebeb, L"AdobeHeitiStdR", L"Heiti TC,STHeiti", 0, 936},
+    {0xbd29c486, L"BerlinSansFBDemi-Bold",
+     L"American Typewriter,Avenir Next Condensed Heavy", 0, 1252},
+    {0xbe8a8db4, L"BookshelfSymbolSeven", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0xc16c0118, L"AdobeHebrew",
+     L".Helvetica Neue Desk UI,Palatino,American Typewriter", 0, 1252},
+    {0xc318b0af, L"MyriadProLight", L"Palatino,Baskerville,Marion", 0, 1252},
+    {0xc65e5659, L"CambriaMath", L"Arial Unicode MS", 2, 1252},
+    {0xc75c8f05, L"LucidaConsole", L"Courier New,Menlo,Andale Mono", 1, 1252},
+    {0xca7c35d6, L"Calibri", L"Apple Symbols,HeadLineA", 0, 1252},
+    {0xcb053f53, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936},
+    {0xcb7190f9, L"Magneto-Bold", L"Lucida Grande", 0, 1252},
+    {0xcca00cc5, L"System", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0xccad6f76, L"Jokerman-Regular", L"Lucida Grande", 0, 1252},
+    {0xccc5818c, L"EuroSign", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0xcf3d7234, L"LucidaHandwriting-Italic",
+     L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0xcf7b8fdb, L"MinionPro",
+     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
+    {0xcfe5755f, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0xd011f4ee, L"MSPGothic", L"Arial Unicode MS,Apple SD Gothic Neo", 0,
+     1252},
+    {0xd060e7ef, L"Vivaldi",
+     L"STIXNonUnicode,Arial Unicode MS,Avenir Medium,Avenir Next Medium", 8,
+     1252},
+    {0xd07edec1, L"FranklinGothic-Medium", L"Impact,Arial Narrow", 0, 1252},
+    {0xd107243f, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936},
+    {0xd1881562, L"ArialNarrow", L"PT Sans Narrow,Apple Symbols", 0, 1252},
+    {0xd22b7dce, L"BodoniMTPosterCompressed",
+     L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
+    {0xd22bfa60, L"ComicSansMS",
+     L"Damascus,Georgia,.Helvetica Neue Desk UI,Lucida Grande,Arial Unicode MS",
+     8, 1252},
+    {0xd3bd0e35, L"Bauhaus93",
+     L"STIXNonUnicode,Arial Unicode MS,Avenir Next,Avenir", 0, 1252},
+    {0xd429ee7a, L"STFangsong", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0xd6679c12, L"BernardMTCondensed",
+     L"Impact,Avenir Next Condensed Demi Bold", 0, 1252},
+    {0xd8e8a027, L"LucidaSans",
+     L"Arial Narrow,Khmer MN,Kokonor,Damascus,Microsoft Sans Serif,Apple "
+     L"Symbols",
+     0, 1252},
+    {0xd9fe7761, L"HighTowerText-Reg",
+     L"STIXGeneral,.Helvetica Neue Desk UI,Trebuchet MS", 2, 1252},
+    {0xda7e551e, L"STSong", L"Arial Unicode MS", 0, 936},
+    {0xdaa6842d, L"STZhongsong", L"STFangsong,Songti SC,STSong", 0, 936},
+    {0xdaaab93f, L"STFangsong", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0xdaeb0713, L"STSong", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0xdafedbef, L"STCaiyun", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
+    {0xdb00a3d9, L"Broadway",
+     L"Papyrus,STIXNonUnicode,Arial Black,Avenir Next Heavy,Heiti TC", 0, 1252},
+    {0xdb1f5ad4, L"STXinwei", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
+    {0xdb326e7f, L"STKaiti", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0xdb69595a, L"STHupo", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
+    {0xdba0082c, L"STXihei", L"Songti SC,Arial Unicode MS", 0, 936},
+    {0xdbd0ab18, L"STXingkai", L"Kaiti SC,Songti SC", 0, 936},
+    {0xdc1a7db1, L"STLiti", L"Kaiti SC,Songti SC", 0, 936},
+    {0xdc33075f, L"KristenITC-Regular",
+     L"STIXNonUnicode,Damascus,Songti SC,STSong", 8, 1252},
+    {0xdcc7009c, L"Harrington",
+     L"STIXNonUnicode,Avenir Next Condensed Heavy,Noteworthy", 0, 1252},
+    {0xdd712466, L"ArialBlack", L"Geeza Pro,Damascus,Songti SC,STSong", 0,
+     1252},
+    {0xdde87b3e, L"Impact", L"Arial Narrow,Marion", 0, 1252},
+    {0xdf69fb32, L"SnapITC",
+     L"Arial Narrow,PT Sans Narrow,Marion,STHeiti,Arial Black", 0, 1252},
+    {0xdf8b25e8, L"CenturyGothic",
+     L"Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252},
+    {0xe0f705c0, L"KristenITC", L"Songti SC,STSong", 8, 1252},
+    {0xe1427573, L"Raavi",
+     L"Damascus,STIXNonUnicode,Marion,Papyrus,Avenir Next Condensed "
+     L"Heavy,American Typewriter",
+     0, 1252},
+    {0xe2cea0cb, L"Magneto",
+     L"STIXNonUnicode,Damascus,Geeza Pro,Lucida Grande,Georgia,Heiti TC", 0,
+     1252},
+    {0xe36a9e17, L"Ravie", L"STHeiti,Arial Black", 0, 1252},
+    {0xe433f8e2, L"Parchment", L"Microsoft Sans Serif,Apple Symbols", 8, 1252},
+    {0xe43dff4a, L"Wingdings", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
+    {0xe4e2c405, L"MTExtra", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
+    {0xe618cc35, L"InformalRoman", L"Arial Narrow", 8, 1252},
+    {0xe6c27ffc, L"Mistral", L"Apple Symbols", 8, 1252},
+    {0xe7ebf4b9, L"Courier", L"Courier New", 0, 1252},
+    {0xe8bc4a9d, L"MSReferenceSpecialty", L"Microsoft Sans Serif,Apple Symbols",
+     0, 1252},
+    {0xe90fb013, L"TempusSansITC",
+     L"STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 0, 1252},
+    {0xec637b42, L"Consolas",
+     L"AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,AR PL UMing "
+     L"CN,AR PL UMing HK,Microsoft Sans Serif,Tahoma",
+     1, 1252},
+    {0xed3a683b, L"STXinwei", L"Kaiti SC,Songti SC,", 0, 936},
+    {0xef264cd1, L"LucidaHandwriting",
+     L"Arial Narrow,Avenir Next Condensed Demi Bold,Avenir Next "
+     L"Condensed,Avenir Next Condensed Medium,STHeiti,Arial Black",
+     0, 1252},
+    {0xf086bca2, L"BaskervilleOldFace",
+     L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252},
+    {0xf1028030, L"Mangal",
+     L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Tahoma", 2, 1252},
+    {0xf1da7eb9, L"ShowcardGothic",
+     L"Papyrus,Arial Unicode MS,Georgia,American Typewriter", 0, 1252},
+    {0xf210f06a, L"ArialMT",
+     L"Arial Unicode MS,Arial Narrow,STIXNonUnicode,Damascus,Avenir Next "
+     L"Condensed Demi Bold,Avenir Next Condensed Medium,Avenir Next Condensed",
+     0, 1252},
+    {0xf477f16a, L"Latha",
+     L"Arial Narrow,Damascus,STIXNonUnicode,American Typewriter", 0, 1252},
+    {0xf616f3dd, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936},
+    {0xfa479aa6, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936},
+    {0xfcd19697, L"BookmanOldStyle",
+     L"Geeza Pro,Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252},
+    {0xfe209a82, L"LucidaCalligraphy",
+     L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black", 0, 1252},
+    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Heiti TC,STHeiti", 0, 936},
+};
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+static const XFA_FONTINFO g_XFAFontsMap[] = {
+    {0x01d5d33e, L"SimSun", L"Droid Sans Fallback", 0, 936},
+    {0x01e4f102, L"YouYuan", L"Droid Sans Fallback", 1, 936},
+    {0x030549dc, L"LiSu", L"Droid Sans Fallback", 1, 936},
+    {0x032edd44, L"Simhei", L"Droid Sans Fallback", 1, 936},
+    {0x03eac6fc, L"PoorRichard-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic "
+     L"Naskh,Droid Sans Ethiopic",
+     2, 1252},
+    {0x03ed90e6, L"Nina",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x077b56b3, L"KingsoftPhoneticPlain",
+     L"Droid Sans Thai,Droid Sans Armenian,Droid Arabic Naskh,Droid Sans "
+     L"Ethiopic,Droid Sans Fallback",
+     0, 1252},
+    {0x078ed524, L"MicrosoftSansSerif", L"Droid Sans Fallback", 0, 1252},
+    {0x089b18a9, L"Arial", L"Droid Sans Fallback", 0, 1252},
+    {0x0b2cad72, L"MonotypeCorsiva",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x0bb003e7, L"Kartika",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     2, 1252},
+    {0x0bb469df, L"VinerHandITC",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x0bc1a851, L"SegoeUI", L"Droid Sans Fallback", 0, 1252},
+    {0x0c112ebd, L"KozukaGothicPro-VIM",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x0cfcb9c1, L"AdobeThai",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 847},
+    {0x0e7de0f9, L"Playbill",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0x0eff47c3, L"STHupo", L"Droid Sans Fallback", 0, 936},
+    {0x107ad374, L"Constantia",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x12194c2d, L"KunstlerScript",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x135ef6a1, L"MinionProSmBd",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x158c4049, L"Garamond",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x160ecb24, L"STZhongsong", L"Droid Sans Fallback", 0, 936},
+    {0x161ed07e, L"MSGothic", L"Droid Sans Fallback", 1, 1252},
+    {0x171d1ed1, L"SnapITC-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x18d1188f, L"Cambria", L"Droid Sans Fallback", 2, 1252},
+    {0x18eaf350, L"ArialUnicodeMS", L"Droid Sans Fallback", 0, 936},
+    {0x1a92d115, L"MingLiU", L"Droid Sans Fallback", 1, 1252},
+    {0x1cc217c6, L"TrebuchetMS",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x1d649596, L"BasemicTimes",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x1e34ee60, L"BellMT",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x1eb36945, L"CooperBlack",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x1ef7787d, L"BatangChe", L"Droid Sans Fallback", 1, 1252},
+    {0x20b3bd3a, L"BrushScriptMT", L"Droid Arabic Naskh,Droid Sans Ethiopic", 8,
+     1252},
+    {0x220877aa, L"Candara",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x22135007, L"FreestyleScript-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x251059c3, L"Chiller",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252},
+    {0x25bed6dd, L"MSReferenceSansSerif", L"Droid Sans Fallback", 0, 1252},
+    {0x28154c81, L"Parchment-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x29711eb9, L"STLiti", L"Droid Sans Fallback", 0, 936},
+    {0x2b1993b4, L"Basemic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2b316339, L"NiagaraSolid-Reg",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2c147529, L"FootlightMTLight",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2c198928, L"HarlowSolid",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2c6ac6b2, L"LucidaBright",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 2, 1252},
+    {0x2c9f38e2, L"KozukaMinchoPro-VIR",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2d5a47b0, L"STCaiyun", L"Droid Sans Fallback", 0, 936},
+    {0x2def26bf, L"BernardMT-Condensed",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x2fd8930b, L"KozukaMinchoPr6NR",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x3115525a, L"FangSong_GB2312", L"Droid Sans Fallback", 0, 1252},
+    {0x31327817, L"MyriadPro",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x32244975, L"Helvetica",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252},
+    {0x32ac995c, L"Terminal",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x338d648a, L"NiagaraEngraved-Reg",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x33bb65f2, L"Sylfaen",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x3402c30e, L"MSPMincho", L"Droid Sans Fallback", 2, 1252},
+    {0x3412bf31, L"SimSun-PUA", L"Droid Sans Fallback", 0, 936},
+    {0x36eb39b9, L"BerlinSansFB",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
+    {0x3864c4f6, L"HighTowerText",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x3a257d03, L"FangSong_GB2312", L"Droid Sans Fallback", 0, 1252},
+    {0x3cdae668, L"FreestyleScript",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x3d55aed7, L"Jokerman",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x3d5b4385, L"PMingLiU", L"Droid Sans Fallback", 2, 1252},
+    {0x3d9b7669, L"EstrangeloEdessa",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x3e532d74, L"FranklinGothicMedium",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x3e6aa32d, L"NSimSun", L"Droid Sans Fallback", 1, 936},
+    {0x3f6c36a8, L"Gautami",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono,Droid Sans Fallback",
+     0, 1252},
+    {0x3ff32662, L"Chiller-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x409de312, L"ModernNo.20",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x41443c5e, L"Georgia",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x4160ade5, L"BellGothicStdBlack",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x421976c4, L"Modern-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x422a7252, L"Stencil",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x42c8554f, L"Fixedsys",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x435cb41d, L"Roman",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x47882383, L"CourierNew", L"Droid Sans Fallback", 1, 1252},
+    {0x480a2338, L"BerlinSansFBDemi",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x480bf7a4, L"CourierStd", L"Droid Sans Fallback", 0, 1252},
+    {0x481ad6ed, L"VladimirScript",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0x4911577a, L"YouYuan", L"Droid Sans Fallback", 1, 936},
+    {0x4a788d72, L"STXingkai", L"Droid Sans Fallback", 0, 936},
+    {0x4bf88566, L"SegoeCondensed",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x4ccf51a4, L"BerlinSansFB-Reg",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x4ea967ce, L"GulimChe", L"Droid Sans Fallback", 1, 1252},
+    {0x4f68bd79, L"LetterGothicStd",
+     L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
+     L"Mono,Droid Serif,Droid Sans Fallback",
+     0, 1252},
+    {0x51a0d0e6, L"KozukaGothicPr6NM",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x531b3dea, L"BasemicSymbol",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x5333fd39, L"CalifornianFB-Reg",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x53561a54, L"FZYTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
+    {0x55e0dde6, L"LucidaSansTypewriter",
+     L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic", 0, 1252},
+    {0x574d4d3d, L"AdobeArabic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x5792e759, L"STKaiti", L"Droid Sans Fallback", 0, 936},
+    {0x5921978e, L"LucidaSansUnicode", L"Droid Sans Fallback", 0, 1252},
+    {0x594e2da4, L"Vrinda",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0x59baa9a2, L"KaiTi_GB2312", L"Droid Sans Fallback", 0, 1252},
+    {0x5cfedf4f, L"BaskOldFace",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x5f97921c, L"AdobeMyungjoStdM", L"Droid Sans Fallback", 0, 936},
+    {0x5fefbfad, L"Batang", L"Droid Sans Fallback", 2, 1252},
+    {0x605342b9, L"DotumChe", L"Droid Sans Fallback", 1, 1252},
+    {0x608c5f9a, L"KaiTi_GB2312", L"Droid Sans Fallback", 0, 936},
+    {0x61efd0d1, L"MaturaMTScriptCapitals",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0x626608a9, L"MVBoli",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0x630501a3, L"SmallFonts",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x65d0e2a9, L"FZYTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
+    {0x669f29e1, L"FZSTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
+    {0x673a9e5f, L"Tunga",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono,Droid Sans Fallback",
+     0, 1252},
+    {0x691aa4ce, L"NiagaraSolid",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x696259b7, L"Corbel",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x696ee9be, L"STXihei", L"Droid Sans Fallback", 0, 936},
+    {0x6c59cf69, L"Dotum", L"Droid Sans Fallback", 0, 1252},
+    {0x707fa561, L"Gungsuh", L"Droid Sans Fallback", 2, 1252},
+    {0x71416bb2, L"ZWAdobeF",
+     L"Droid Arabic Naskh,Droid Sans Armenian,Droid Sans Ethiopic,Droid Sans "
+     L"Georgian,Droid Sans Hebrew,Droid Sans Thai",
+     0, 1252},
+    {0x71b41801, L"Verdana",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x73f25e4c, L"PalatinoLinotype", L"Droid Sans Fallback", 0, 1252},
+    {0x73f4d19f, L"NiagaraEngraved",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x74001694, L"MyriadProBlack", L"Book Antiqua,Constantia,Dotum,Georgia", 0,
+     1252},
+    {0x74b14d8f, L"Haettenschweiler",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x74cb44ee, L"NSimSun", L"Droid Sans Fallback", 1, 936},
+    {0x76b4d7ff, L"Shruti",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0x788b3533, L"Webdings",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
+    {0x797dde99, L"MSSerif",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x7a0f9e9e, L"MSMincho", L"Droid Sans Fallback", 1, 1252},
+    {0x7b439caf, L"OldEnglishTextMT",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x8213a433, L"LucidaSans-Typewriter",
+     L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 0, 1252},
+    {0x82fec929, L"AdobeSongStdL", L"Droid Sans Fallback", 0, 936},
+    {0x83581825, L"Modern",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x835a2823, L"Algerian",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x83dab9f5, L"Script",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x847b56da, L"Tahoma", L"Droid Sans Fallback", 0, 1252},
+    {0x8a783cb2, L"SimSun-PUA", L"Droid Sans Fallback", 0, 1252},
+    {0x8b5cac0e, L"Onyx",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x8c6a499e, L"Gulim", L"Droid Sans Fallback", 0, 1252},
+    {0x8e0af790, L"JuiceITC",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x8e8d43b2, L"Centaur",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x8ee4dcca, L"BookshelfSymbol7",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x90794800, L"BellGothicStdLight",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x909b516a, L"Century",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x92ae370d, L"MSOutlook",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
+    {0x93c9fbf1, L"LucidaFax",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     2, 1252},
+    {0x9565085e, L"BookAntiqua",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0x9856d95d, L"AdobeMingStdL", L"Droid Sans Fallback", 0, 949},
+    {0x9bbadd6b, L"ColonnaMT",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0x9cbd16a4, L"ShowcardGothic-Reg",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252},
+    {0x9d73008e, L"MSSansSerif",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xa0607db1, L"GungsuhChe", L"Droid Sans Fallback", 1, 1252},
+    {0xa0bcf6a1, L"LatinWide",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0xa1429b36, L"Symbol",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
+    {0xa1fa5abc, L"Wingdings2",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
+    {0xa1fa5abd, L"Wingdings3",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
+    {0xa427bad4, L"InformalRoman-Regular",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic", 8, 1252},
+    {0xa8b92ece, L"FZSTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
+    {0xa8d83ece, L"CalifornianFB",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0xaa3e082c, L"Kingsoft-Phonetic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xaa6bcabe, L"HarlowSolidItalic",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xade5337c, L"MSUIGothic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xb08dd941, L"WideLatin",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     2, 1252},
+    {0xb207f05d, L"PoorRichard",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0xb3bc492f, L"JuiceITC-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xb5545399, L"Marlett",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
+    {0xb5dd1ebb, L"BritannicBold", L"Droid Arabic Naskh,Droid Sans Ethiopic", 0,
+     1252},
+    {0xb699c1c5, L"LucidaCalligraphy-Italic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xb725d629, L"TimesNewRoman", L"Droid Sans Fallback", 2, 1252},
+    {0xb7eaebeb, L"AdobeHeitiStdR", L"Droid Sans Fallback", 0, 936},
+    {0xbd29c486, L"BerlinSansFBDemi-Bold",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xbe8a8db4, L"BookshelfSymbolSeven",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xc16c0118, L"AdobeHebrew",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic "
+     L"Naskh,Droid Sans Ethiopic",
+     0, 1252},
+    {0xc318b0af, L"MyriadProLight",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xc65e5659, L"CambriaMath", L"Droid Sans Fallback", 2, 1252},
+    {0xc75c8f05, L"LucidaConsole",
+     L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 1, 1252},
+    {0xca7c35d6, L"Calibri", L"Droid Sans Fallback", 0, 1252},
+    {0xcb053f53, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936},
+    {0xcb7190f9, L"Magneto-Bold",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xcca00cc5, L"System",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xccad6f76, L"Jokerman-Regular",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xccc5818c, L"EuroSign",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xcf3d7234, L"LucidaHandwriting-Italic",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xcf7b8fdb, L"MinionPro",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xcfe5755f, L"Simhei", L"Droid Sans Fallback", 1, 936},
+    {0xd011f4ee, L"MSPGothic", L"Droid Sans Fallback", 0, 1252},
+    {0xd060e7ef, L"Vivaldi",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0xd07edec1, L"FranklinGothic-Medium",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xd107243f, L"SimSun", L"Droid Sans Fallback", 0, 936},
+    {0xd1881562, L"ArialNarrow",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xd22b7dce, L"BodoniMTPosterCompressed",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xd22bfa60, L"ComicSansMS", L"Droid Serif,Roboto,Droid Sans Fallback", 8,
+     1252},
+    {0xd3bd0e35, L"Bauhaus93",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xd429ee7a, L"STFangsong", L"Droid Sans Fallback", 0, 936},
+    {0xd6679c12, L"BernardMTCondensed",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xd8e8a027, L"LucidaSans",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252},
+    {0xd9fe7761, L"HighTowerText-Reg",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
+    {0xda7e551e, L"STSong", L"Droid Sans Fallback", 0, 936},
+    {0xdaa6842d, L"STZhongsong", L"Droid Sans Fallback", 0, 936},
+    {0xdaaab93f, L"STFangsong", L"Droid Sans Fallback", 0, 936},
+    {0xdaeb0713, L"STSong",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 936},
+    {0xdafedbef, L"STCaiyun", L"Droid Sans Fallback", 0, 936},
+    {0xdb00a3d9, L"Broadway",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xdb1f5ad4, L"STXinwei", L"Droid Sans Fallback", 0, 936},
+    {0xdb326e7f, L"STKaiti", L"Droid Sans Fallback", 0, 936},
+    {0xdb69595a, L"STHupo", L"Droid Sans Fallback", 0, 936},
+    {0xdba0082c, L"STXihei", L"Droid Sans Fallback", 0, 936},
+    {0xdbd0ab18, L"STXingkai", L"Droid Sans Fallback", 0, 936},
+    {0xdc1a7db1, L"STLiti", L"Droid Sans Fallback", 0, 936},
+    {0xdc33075f, L"KristenITC-Regular",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252},
+    {0xdcc7009c, L"Harrington",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xdd712466, L"ArialBlack",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xdde87b3e, L"Impact",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xdf69fb32, L"SnapITC",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xdf8b25e8, L"CenturyGothic",
+     L"Droid Serif,Roboto,Droid Serif,Droid Sans Mono", 0, 1252},
+    {0xe0f705c0, L"KristenITC",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252},
+    {0xe1427573, L"Raavi",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xe2cea0cb, L"Magneto",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xe36a9e17, L"Ravie",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xe433f8e2, L"Parchment",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0xe43dff4a, L"Wingdings",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
+    {0xe4e2c405, L"MTExtra",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
+    {0xe618cc35, L"InformalRoman",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 8, 1252},
+    {0xe6c27ffc, L"Mistral",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
+    {0xe7ebf4b9, L"Courier", L"Droid Sans Fallback", 0, 1252},
+    {0xe8bc4a9d, L"MSReferenceSpecialty",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xe90fb013, L"TempusSansITC",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xec637b42, L"Consolas", L"Droid Sans Fallback", 1, 1252},
+    {0xed3a683b, L"STXinwei", L"Droid Sans Fallback", 0, 936},
+    {0xef264cd1, L"LucidaHandwriting",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xf086bca2, L"BaskervilleOldFace",
+     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xf1028030, L"Mangal",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     2, 1252},
+    {0xf1da7eb9, L"ShowcardGothic",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252},
+    {0xf210f06a, L"ArialMT",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252},
+    {0xf477f16a, L"Latha",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xf616f3dd, L"LiSu", L"Droid Sans Fallback", 1, 936},
+    {0xfa479aa6, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936},
+    {0xfcd19697, L"BookmanOldStyle",
+     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
+    {0xfe209a82, L"LucidaCalligraphy",
+     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
+     L"Mono",
+     0, 1252},
+    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Droid Sans Fallback", 0, 936},
+};
+#endif
+void XFA_LocalFontNameToEnglishName(const CFX_WideStringC& wsLocalName,
+                                    CFX_WideString& wsEnglishName) {
+  wsEnglishName = wsLocalName;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ ||   \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ||   \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+  FX_DWORD dwLocalNameHash = FX_HashCode_String_GetW(
+      wsLocalName.GetPtr(), wsLocalName.GetLength(), TRUE);
+  int32_t iStart = 0;
+  int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
+  int32_t iMid = 0;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
+    if (dwFontNameHash == dwLocalNameHash) {
+      wsEnglishName = g_XFAFontsMap[iMid].pPsName;
+      break;
+    } else if (dwFontNameHash < dwLocalNameHash) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iEnd >= iStart);
+#endif
+}
+const XFA_FONTINFO* XFA_GetFontINFOByFontName(
+    const CFX_WideStringC& wsFontName) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ ||   \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ||   \
+    _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+  CFX_WideString wsFontNameTemp = wsFontName;
+  wsFontNameTemp.Remove(L' ');
+  FX_DWORD dwCurFontNameHash =
+      FX_HashCode_String_GetW(wsFontNameTemp, wsFontNameTemp.GetLength(), TRUE);
+  int32_t iStart = 0;
+  int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
+  int32_t iMid = 0;
+  const XFA_FONTINFO* pFontInfo = NULL;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
+    if (dwFontNameHash == dwCurFontNameHash) {
+      pFontInfo = &g_XFAFontsMap[iMid];
+      break;
+    } else if (dwFontNameHash < dwCurFontNameHash) {
+      iStart = iMid + 1;
+    } else {
+      iEnd = iMid - 1;
+    }
+  } while (iEnd >= iStart);
+  return pFontInfo;
+#else
+  return NULL;
+#endif
+}
+// static
+IXFA_FontMgr* IXFA_FontMgr::CreateDefault() {
+  return new CXFA_DefFontMgr;
+}
+// virtual
+IXFA_FontMgr::~IXFA_FontMgr() {}
+CXFA_DefFontMgr::~CXFA_DefFontMgr() {
+  int32_t iCounts = m_CacheFonts.GetSize();
+  for (int32_t i = 0; i < iCounts; i++) {
+    ((IFX_Font*)m_CacheFonts[i])->Release();
+  }
+  m_CacheFonts.RemoveAll();
+}
+
+IFX_Font* CXFA_DefFontMgr::GetFont(IXFA_Doc* hDoc,
+                                   const CFX_WideStringC& wsFontFamily,
+                                   FX_DWORD dwFontStyles,
+                                   FX_WORD wCodePage) {
+  CFX_WideString wsFontName = wsFontFamily;
+  IFX_FontMgr* pFDEFontMgr =
+      static_cast<CXFA_FFDoc*>(hDoc)->GetApp()->GetFDEFontMgr();
+  IFX_Font* pFont = pFDEFontMgr->LoadFont(wsFontName, dwFontStyles, wCodePage);
+  if (!pFont) {
+    const XFA_FONTINFO* pCurFont = XFA_GetFontINFOByFontName(wsFontName);
+    if (pCurFont && pCurFont->pReplaceFont) {
+      FX_DWORD dwStyle = 0;
+      if (dwFontStyles & FX_FONTSTYLE_Bold) {
+        dwStyle |= FX_FONTSTYLE_Bold;
+      }
+      if (dwFontStyles & FX_FONTSTYLE_Italic) {
+        dwStyle |= FX_FONTSTYLE_Italic;
+      }
+      const FX_WCHAR* pReplace = pCurFont->pReplaceFont;
+      int32_t iLength = FXSYS_wcslen(pReplace);
+      while (iLength > 0) {
+        const FX_WCHAR* pNameText = pReplace;
+        while (*pNameText != L',' && iLength > 0) {
+          pNameText++;
+          iLength--;
+        }
+        CFX_WideString wsReplace =
+            CFX_WideString(pReplace, pNameText - pReplace);
+        pFont = pFDEFontMgr->LoadFont(wsReplace, dwStyle, wCodePage);
+        if (pFont) {
+          break;
+        }
+        iLength--;
+        pNameText++;
+        pReplace = pNameText;
+      }
+    }
+  }
+  if (pFont) {
+    m_CacheFonts.Add(pFont);
+  }
+  return pFont;
+}
+
+IFX_Font* CXFA_DefFontMgr::GetDefaultFont(IXFA_Doc* hDoc,
+                                          const CFX_WideStringC& wsFontFamily,
+                                          FX_DWORD dwFontStyles,
+                                          FX_WORD wCodePage) {
+  IFX_FontMgr* pFDEFontMgr = ((CXFA_FFDoc*)hDoc)->GetApp()->GetFDEFontMgr();
+  IFX_Font* pFont =
+      pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage);
+  if (!pFont)
+    pFont =
+        pFDEFontMgr->LoadFont((const FX_WCHAR*)NULL, dwFontStyles, wCodePage);
+  FXSYS_assert(pFont);
+  if (pFont) {
+    m_CacheFonts.Add(pFont);
+  }
+  return pFont;
+}
+struct XFA_PDFFONTNAME {
+  const FX_CHAR* lpPsName;
+  const FX_CHAR* lpNormal;
+  const FX_CHAR* lpBold;
+  const FX_CHAR* lpItalic;
+  const FX_CHAR* lpBoldItalic;
+};
+const XFA_PDFFONTNAME g_XFAPDFFontName[] = {
+    {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"},
+    {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold",
+     "MyriadPro-LightIt", "MyriadPro-SemiboldIt"},
+};
+CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) {
+  m_pDoc = pDoc;
+}
+CXFA_PDFFontMgr::~CXFA_PDFFontMgr() {
+  m_FDE2PDFFont.RemoveAll();
+  for (const auto& pair : m_FontMap) {
+    if (pair.second)
+      pair.second->Release();
+  }
+}
+IFX_Font* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName,
+                                    FX_BOOL bBold,
+                                    FX_BOOL bItalic,
+                                    CPDF_Font** pDstPDFFont,
+                                    FX_BOOL bStrictMatch) {
+  CPDF_Document* pDoc = m_pDoc->GetPDFDoc();
+  if (pDoc == NULL) {
+    return NULL;
+  }
+  CPDF_Dictionary* pFontSetDict =
+      pDoc->GetRoot()->GetDictBy("AcroForm")->GetDictBy("DR");
+  if (!pFontSetDict) {
+    return NULL;
+  }
+  pFontSetDict = (CPDF_Dictionary*)pFontSetDict->GetDictBy("Font");
+  if (!pFontSetDict) {
+    return NULL;
+  }
+  strPsName.Remove(' ');
+  IFX_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr();
+  for (const auto& it : *pFontSetDict) {
+    const CFX_ByteString& key = it.first;
+    CPDF_Object* pObj = it.second;
+    if (!PsNameMatchDRFontName(strPsName, bBold, bItalic, key, bStrictMatch)) {
+      continue;
+    }
+    CPDF_Object* pDirect = pObj->GetDirect();
+    if (!pDirect || !pDirect->IsDictionary()) {
+      return NULL;
+    }
+    CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)pDirect;
+    if (pFontDict->GetStringBy("Type") != "Font") {
+      return NULL;
+    }
+    CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict);
+    if (!pPDFFont) {
+      return NULL;
+    }
+    if (!pPDFFont->IsEmbedded()) {
+      *pDstPDFFont = pPDFFont;
+      return NULL;
+    }
+    return IFX_Font::LoadFont(&pPDFFont->m_Font, pFDEFontMgr);
+  }
+  return NULL;
+}
+IFX_Font* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily,
+                                   FX_DWORD dwFontStyles,
+                                   CPDF_Font** pPDFFont,
+                                   FX_BOOL bStrictMatch) {
+  FX_DWORD dwHashCode =
+      FX_HashCode_String_GetW(wsFontFamily.GetPtr(), wsFontFamily.GetLength());
+  CFX_ByteString strKey;
+  strKey.Format("%u%u", dwHashCode, dwFontStyles);
+  auto it = m_FontMap.find(strKey);
+  if (it != m_FontMap.end())
+    return it->second;
+  CFX_ByteString bsPsName = CFX_ByteString::FromUnicode(wsFontFamily);
+  FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
+  FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
+  CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic);
+  IFX_Font* pFont =
+      FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch);
+  if (pFont)
+    m_FontMap[strKey] = pFont;
+  return pFont;
+}
+CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName(
+    const CFX_ByteString& strPsName,
+    FX_BOOL bBold,
+    FX_BOOL bItalic) {
+  int32_t nCount = sizeof(g_XFAPDFFontName) / sizeof(XFA_PDFFONTNAME);
+  for (int32_t i = 0; i < nCount; i++) {
+    if (strPsName == g_XFAPDFFontName[i].lpPsName) {
+      int32_t index = 1 + ((bItalic << 1) | bBold);
+      return *(&g_XFAPDFFontName[i].lpPsName + index);
+    }
+  }
+  return strPsName;
+}
+FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(
+    const CFX_ByteStringC& bsPsName,
+    FX_BOOL bBold,
+    FX_BOOL bItalic,
+    const CFX_ByteString& bsDRFontName,
+    FX_BOOL bStrictMatch) {
+  CFX_ByteString bsDRName = bsDRFontName;
+  bsDRName.Remove('-');
+  int32_t iPsLen = bsPsName.GetLength();
+  int32_t nIndex = bsDRName.Find(bsPsName);
+  if (nIndex != -1 && !bStrictMatch) {
+    return TRUE;
+  }
+  if (nIndex != 0) {
+    return FALSE;
+  }
+  int32_t iDifferLength = bsDRName.GetLength() - iPsLen;
+  if (iDifferLength > 1 || (bBold || bItalic)) {
+    int32_t iBoldIndex = bsDRName.Find("Bold");
+    FX_BOOL bBoldFont = iBoldIndex > 0;
+    if (bBold ^ bBoldFont) {
+      return FALSE;
+    }
+    if (bBoldFont) {
+      iDifferLength =
+          std::min(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4);
+    }
+    FX_BOOL bItalicFont = TRUE;
+    if (bsDRName.Find("Italic") > 0) {
+      iDifferLength -= 6;
+    } else if (bsDRName.Find("It") > 0) {
+      iDifferLength -= 2;
+    } else if (bsDRName.Find("Oblique") > 0) {
+      iDifferLength -= 7;
+    } else {
+      bItalicFont = FALSE;
+    }
+    if (bItalic ^ bItalicFont) {
+      return FALSE;
+    }
+    if (iDifferLength > 1) {
+      CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength);
+      if (bsDRTailer.Equal("MT") || bsDRTailer.Equal("PSMT") ||
+          bsDRTailer.Equal("Regular") || bsDRTailer.Equal("Reg")) {
+        return TRUE;
+      }
+      if (bBoldFont || bItalicFont) {
+        return FALSE;
+      }
+      FX_BOOL bMatch = FALSE;
+      switch (bsPsName.GetAt(iPsLen - 1)) {
+        case 'L': {
+          if (bsDRName.Right(5).Equal("Light")) {
+            bMatch = TRUE;
+          }
+        } break;
+        case 'R': {
+          if (bsDRName.Right(7).Equal("Regular") ||
+              bsDRName.Right(3).Equal("Reg")) {
+            bMatch = TRUE;
+          }
+        } break;
+        case 'M': {
+          if (bsDRName.Right(5).Equal("Medium")) {
+            bMatch = TRUE;
+          }
+        } break;
+        default:
+          break;
+      }
+      return bMatch;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_PDFFontMgr::GetCharWidth(IFX_Font* pFont,
+                                      FX_WCHAR wUnicode,
+                                      int32_t& iWidth,
+                                      FX_BOOL bCharCode) {
+  if (wUnicode != 0x20 || bCharCode) {
+    return FALSE;
+  }
+  CPDF_Font* pPDFFont = (CPDF_Font*)m_FDE2PDFFont.GetValueAt(pFont);
+  if (!pPDFFont) {
+    return FALSE;
+  }
+  wUnicode = (FX_WCHAR)pPDFFont->CharCodeFromUnicode(wUnicode);
+  iWidth = pPDFFont->GetCharWidthF(wUnicode);
+  return TRUE;
+}
+CXFA_FontMgr::CXFA_FontMgr() : m_pDefFontMgr(NULL) {}
+CXFA_FontMgr::~CXFA_FontMgr() {
+  DelAllMgrMap();
+}
+IFX_Font* CXFA_FontMgr::GetFont(IXFA_Doc* hDoc,
+                                const CFX_WideStringC& wsFontFamily,
+                                FX_DWORD dwFontStyles,
+                                FX_WORD wCodePage) {
+  FX_DWORD dwHash = FX_HashCode_String_GetW(wsFontFamily.GetPtr(),
+                                            wsFontFamily.GetLength(), FALSE);
+  CFX_ByteString bsKey;
+  bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage);
+  auto it = m_FontMap.find(bsKey);
+  if (it != m_FontMap.end())
+    return it->second;
+  CFX_WideString wsEnglishName;
+  XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName);
+  CXFA_PDFFontMgr* pMgr = (CXFA_PDFFontMgr*)m_PDFFontMgrArray.GetValueAt(hDoc);
+  CPDF_Font* pPDFFont = NULL;
+  IFX_Font* pFont = NULL;
+  if (pMgr) {
+    pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont);
+    if (pFont)
+      return pFont;
+  }
+  if (!pFont && m_pDefFontMgr) {
+    pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage);
+  }
+  if (!pFont && pMgr) {
+    pPDFFont = NULL;
+    pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont, FALSE);
+    if (pFont)
+      return pFont;
+  }
+  if (!pFont && m_pDefFontMgr) {
+    pFont = m_pDefFontMgr->GetDefaultFont(hDoc, wsFontFamily, dwFontStyles,
+                                          wCodePage);
+  }
+  if (pFont) {
+    if (pPDFFont) {
+      pMgr->m_FDE2PDFFont.SetAt(pFont, pPDFFont);
+      pFont->SetFontProvider(pMgr);
+    }
+    m_FontMap[bsKey] = pFont;
+  }
+  return pFont;
+}
+void CXFA_FontMgr::LoadDocFonts(IXFA_Doc* hDoc) {
+  if (!m_PDFFontMgrArray.GetValueAt(hDoc)) {
+    m_PDFFontMgrArray.SetAt(hDoc, new CXFA_PDFFontMgr((CXFA_FFDoc*)hDoc));
+  }
+}
+void CXFA_FontMgr::ReleaseDocFonts(IXFA_Doc* hDoc) {
+  CXFA_PDFFontMgr* pMgr = NULL;
+  if (m_PDFFontMgrArray.Lookup(hDoc, (void*&)pMgr)) {
+    delete pMgr;
+    m_PDFFontMgrArray.RemoveKey(hDoc);
+  }
+}
+void CXFA_FontMgr::DelAllMgrMap() {
+  FX_POSITION ps = m_PDFFontMgrArray.GetStartPosition();
+  while (ps) {
+    IXFA_Doc* hDoc = NULL;
+    CXFA_PDFFontMgr* pMgr = NULL;
+    m_PDFFontMgrArray.GetNextAssoc(ps, (void*&)hDoc, (void*&)pMgr);
+    delete pMgr;
+  }
+  m_PDFFontMgrArray.RemoveAll();
+  m_FontMap.clear();
+}
+void CXFA_FontMgr::SetDefFontMgr(IXFA_FontMgr* pFontMgr) {
+  m_pDefFontMgr = pFontMgr;
+}
diff --git a/xfa/fxfa/app/xfa_fontmgr.h b/xfa/fxfa/app/xfa_fontmgr.h
new file mode 100644
index 0000000..4436079
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fontmgr.h
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FONTMGR_H_
+#define XFA_FXFA_APP_XFA_FONTMGR_H_
+
+#include <map>
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fgas/font/fgas_font.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CPDF_Font;
+
+struct XFA_FONTINFO {
+  FX_DWORD dwFontNameHash;
+  const FX_WCHAR* pPsName;
+  const FX_WCHAR* pReplaceFont;
+  FX_WORD dwStyles;
+  FX_WORD wCodePage;
+};
+
+class CXFA_DefFontMgr : public IXFA_FontMgr {
+ public:
+  CXFA_DefFontMgr() {}
+  ~CXFA_DefFontMgr() override;
+
+  // IXFA_FontMgr:
+  IFX_Font* GetFont(IXFA_Doc* hDoc,
+                    const CFX_WideStringC& wsFontFamily,
+                    FX_DWORD dwFontStyles,
+                    FX_WORD wCodePage = 0xFFFF) override;
+  IFX_Font* GetDefaultFont(IXFA_Doc* hDoc,
+                           const CFX_WideStringC& wsFontFamily,
+                           FX_DWORD dwFontStyles,
+                           FX_WORD wCodePage = 0xFFFF) override;
+
+ protected:
+  CFX_PtrArray m_CacheFonts;
+};
+
+class CXFA_PDFFontMgr : public IFX_FontProvider {
+ public:
+  CXFA_PDFFontMgr(CXFA_FFDoc* pDoc);
+  ~CXFA_PDFFontMgr();
+  IFX_Font* GetFont(const CFX_WideStringC& wsFontFamily,
+                    FX_DWORD dwFontStyles,
+                    CPDF_Font** pPDFFont,
+                    FX_BOOL bStrictMatch = TRUE);
+  FX_BOOL GetCharWidth(IFX_Font* pFont,
+                       FX_WCHAR wUnicode,
+                       int32_t& iWidth,
+                       FX_BOOL bCharCode);
+  CFX_MapPtrToPtr m_FDE2PDFFont;
+
+ protected:
+  IFX_Font* FindFont(CFX_ByteString strFamilyName,
+                     FX_BOOL bBold,
+                     FX_BOOL bItalic,
+                     CPDF_Font** pPDFFont,
+                     FX_BOOL bStrictMatch = TRUE);
+  CFX_ByteString PsNameToFontName(const CFX_ByteString& strPsName,
+                                  FX_BOOL bBold,
+                                  FX_BOOL bItalic);
+  FX_BOOL PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName,
+                                FX_BOOL bBold,
+                                FX_BOOL bItalic,
+                                const CFX_ByteString& bsDRFontName,
+                                FX_BOOL bStrictMatch = TRUE);
+
+  CXFA_FFDoc* m_pDoc;
+  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
+};
+
+class CXFA_FontMgr {
+ public:
+  CXFA_FontMgr();
+  ~CXFA_FontMgr();
+  IFX_Font* GetFont(IXFA_Doc* hDoc,
+                    const CFX_WideStringC& wsFontFamily,
+                    FX_DWORD dwFontStyles,
+                    FX_WORD wCodePage = 0xFFFF);
+  void LoadDocFonts(IXFA_Doc* hDoc);
+  void ReleaseDocFonts(IXFA_Doc* hDoc);
+
+  void SetDefFontMgr(IXFA_FontMgr* pFontMgr);
+
+ protected:
+  void DelAllMgrMap();
+
+  CFX_MapPtrToPtr m_PDFFontMgrArray;
+  IXFA_FontMgr* m_pDefFontMgr;
+  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
+};
+
+#endif  //  XFA_FXFA_APP_XFA_FONTMGR_H_
diff --git a/xfa/fxfa/app/xfa_fwladapter.cpp b/xfa/fxfa/app/xfa_fwladapter.cpp
new file mode 100644
index 0000000..1e6010e
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fwladapter.cpp
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fwladapter.h"
+
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_fffield.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+
+void FWL_PostMessageToMainRoop(CFWL_Message* pMessage) {}
+FX_BOOL FWL_ShowCaret(IFWL_Widget* pWidget,
+                      FX_BOOL bVisible,
+                      const CFX_RectF* pRtAnchor) {
+  CXFA_FFWidget* pXFAWidget = (CXFA_FFWidget*)pWidget->GetPrivateData(pWidget);
+  if (!pXFAWidget) {
+    return FALSE;
+  }
+  IXFA_DocProvider* pDocProvider = pXFAWidget->GetDoc()->GetDocProvider();
+  if (!pDocProvider) {
+    return FALSE;
+  }
+  if (bVisible) {
+    CFX_Matrix mt;
+    pXFAWidget->GetRotateMatrix(mt);
+    CFX_RectF rt(*pRtAnchor);
+    mt.TransformRect(rt);
+    pDocProvider->DisplayCaret(pXFAWidget, bVisible, &rt);
+    return TRUE;
+  }
+  pDocProvider->DisplayCaret(pXFAWidget, bVisible, pRtAnchor);
+  return TRUE;
+}
+
+FWL_ERR CXFA_FWLAdapterWidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
+                                                const CFX_RectF* pRect) {
+  if (!pWidget)
+    return FWL_ERR_Indefinite;
+  CXFA_FFField* pField = (CXFA_FFField*)pWidget->GetPrivateData(pWidget);
+  if (!pField)
+    return FWL_ERR_Indefinite;
+  pField->AddInvalidateRect(nullptr);
+  return FWL_ERR_Succeeded;
+}
+
+FX_BOOL CXFA_FWLAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget,
+                                              FX_FLOAT fMinHeight,
+                                              FX_FLOAT fMaxHeight,
+                                              const CFX_RectF& rtAnchor,
+                                              CFX_RectF& rtPopup) {
+  CXFA_FFWidget* pFFWidget = (CXFA_FFWidget*)(pWidget->GetPrivateData(pWidget));
+  CFX_Matrix mt;
+  pFFWidget->GetRotateMatrix(mt);
+  CFX_RectF rtRotateAnchor(rtAnchor);
+  mt.TransformRect(rtRotateAnchor);
+  pFFWidget->GetDoc()->GetDocProvider()->GetPopupPos(
+      pFFWidget, fMinHeight, fMaxHeight, rtRotateAnchor, rtPopup);
+  return TRUE;
+}
diff --git a/xfa/fxfa/app/xfa_fwladapter.h b/xfa/fxfa/app/xfa_fwladapter.h
new file mode 100644
index 0000000..bf9a3d6
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fwladapter.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FWLADAPTER_H_
+#define XFA_FXFA_APP_XFA_FWLADAPTER_H_
+
+#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
+
+class CXFA_FWLAdapterWidgetMgr : public CFWL_SDAdapterWidgetMgr {
+ public:
+  virtual FWL_ERR RepaintWidget(IFWL_Widget* pWidget, const CFX_RectF* pRect);
+  virtual FX_BOOL GetPopupPos(IFWL_Widget* pWidget,
+                              FX_FLOAT fMinHeight,
+                              FX_FLOAT fMaxHeight,
+                              const CFX_RectF& rtAnchor,
+                              CFX_RectF& rtPopup);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FWLADAPTER_H_
diff --git a/xfa/fxfa/app/xfa_fwltheme.cpp b/xfa/fxfa/app/xfa_fwltheme.cpp
new file mode 100644
index 0000000..b0657ee
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fwltheme.cpp
@@ -0,0 +1,424 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_fwltheme.h"
+
+#include "xfa/fde/tto/fde_textout.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fwl/basewidget/fwl_barcode.h"
+#include "xfa/include/fwl/basewidget/fwl_caret.h"
+#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
+#include "xfa/include/fwl/basewidget/fwl_combobox.h"
+#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
+#include "xfa/include/fwl/basewidget/fwl_edit.h"
+#include "xfa/include/fwl/basewidget/fwl_listbox.h"
+#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
+#include "xfa/include/fwl/basewidget/fwl_picturebox.h"
+#include "xfa/include/fwl/basewidget/fwl_pushbutton.h"
+#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
+
+CXFA_FFWidget* XFA_ThemeGetOuterWidget(IFWL_Widget* pWidget) {
+  IFWL_Widget* pOuter = pWidget;
+  while (pOuter->GetOuter()) {
+    pOuter = pOuter->GetOuter();
+  }
+  if (pOuter) {
+    return (CXFA_FFWidget*)pOuter->GetPrivateData(pOuter);
+  }
+  return NULL;
+}
+CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp) : m_pApp(pApp) {
+  m_pTextOut = NULL;
+  m_dwCapacity = 0;
+  m_fCapacity = 0;
+  m_pCalendarFont = NULL;
+  m_Rect.Set(0, 0, 0, 0);
+  m_pCheckBoxTP = new CXFA_FWLCheckBoxTP;
+  m_pListBoxTP = new CFWL_ListBoxTP;
+  m_pPictureBoxTP = new CFWL_PictureBoxTP;
+  m_pSrollBarTP = new CFWL_ScrollBarTP;
+  m_pEditTP = new CXFA_FWLEditTP;
+  m_pComboBoxTP = new CFWL_ComboBoxTP;
+  m_pMonthCalendarTP = new CFWL_MonthCalendarTP;
+  m_pDateTimePickerTP = new CFWL_DateTimePickerTP;
+  m_pPushButtonTP = new CFWL_PushButtonTP;
+  m_pCaretTP = new CFWL_CaretTP;
+  m_pBarcodeTP = new CFWL_BarcodeTP;
+  Initialize();
+}
+CXFA_FWLTheme::~CXFA_FWLTheme() {
+  Finalize();
+  delete m_pCheckBoxTP;
+  delete m_pListBoxTP;
+  delete m_pPictureBoxTP;
+  delete m_pSrollBarTP;
+  delete m_pEditTP;
+  delete m_pComboBoxTP;
+  delete m_pMonthCalendarTP;
+  delete m_pDateTimePickerTP;
+  delete m_pPushButtonTP;
+  delete m_pCaretTP;
+  delete m_pBarcodeTP;
+}
+static const FX_WCHAR* g_FWLTheme_CalFonts[] = {
+    L"Arial", L"Courier New", L"DejaVu Sans",
+};
+FWL_ERR CXFA_FWLTheme::Initialize() {
+  m_pTextOut = IFDE_TextOut::Create();
+  for (size_t i = 0; !m_pCalendarFont && i < FX_ArraySize(g_FWLTheme_CalFonts);
+       ++i) {
+    m_pCalendarFont = IFX_Font::LoadFont(g_FWLTheme_CalFonts[i], 0, 0,
+                                         m_pApp->GetFDEFontMgr());
+  }
+  if (!m_pCalendarFont) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+    m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetDefFontByCodePage(
+        FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL);
+#else
+    m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetFontByCodePage(
+        FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL);
+#endif
+  }
+
+  FXSYS_assert(NULL != m_pCalendarFont);
+  FWLTHEME_Init();
+  return FWL_ERR_Succeeded;
+}
+FWL_ERR CXFA_FWLTheme::Finalize() {
+  if (m_pTextOut) {
+    m_pTextOut->Release();
+    m_pTextOut = NULL;
+  }
+  if (m_pCalendarFont) {
+    m_pCalendarFont->Release();
+    m_pCalendarFont = NULL;
+  }
+  FWLTHEME_Release();
+  return FWL_ERR_Succeeded;
+}
+FX_BOOL CXFA_FWLTheme::IsValidWidget(IFWL_Widget* pWidget) {
+  return TRUE;
+}
+FX_DWORD CXFA_FWLTheme::GetThemeID(IFWL_Widget* pWidget) {
+  return 0;
+}
+FX_DWORD CXFA_FWLTheme::SetThemeID(IFWL_Widget* pWidget,
+                                   FX_DWORD dwThemeID,
+                                   FX_BOOL bChildren) {
+  return 0;
+}
+FX_BOOL CXFA_FWLTheme::DrawBackground(CFWL_ThemeBackground* pParams) {
+  return GetTheme(pParams->m_pWidget)->DrawBackground(pParams);
+}
+FX_BOOL CXFA_FWLTheme::DrawText(CFWL_ThemeText* pParams) {
+  if (pParams->m_wsText.IsEmpty()) {
+    return FWL_ERR_Indefinite;
+  }
+  if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) {
+    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
+    if (!pWidget) {
+      return FWL_ERR_Indefinite;
+    }
+    m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
+    m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+    m_pTextOut->SetFont(m_pCalendarFont);
+    m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
+    m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
+    if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) &&
+        !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
+        (pParams->m_dwStates &
+         (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) {
+      m_pTextOut->SetTextColor(0xFFFFFFFF);
+    }
+    if (pParams->m_iPart == FWL_PART_MCD_Caption) {
+      if (m_pMonthCalendarTP->GetThemeID(pParams->m_pWidget) == 0) {
+        m_pTextOut->SetTextColor(ArgbEncode(0xff, 0, 153, 255));
+      } else {
+        m_pTextOut->SetTextColor(ArgbEncode(0xff, 128, 128, 0));
+      }
+    }
+    CFX_Graphics* pGraphics = pParams->m_pGraphics;
+    CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
+    if (!pRenderDevice)
+      return FALSE;
+    m_pTextOut->SetRenderDevice(pRenderDevice);
+    CFX_Matrix mtPart = pParams->m_matrix;
+    CFX_Matrix* pMatrix = pGraphics->GetMatrix();
+    if (pMatrix) {
+      mtPart.Concat(*pMatrix);
+    }
+    m_pTextOut->SetMatrix(mtPart);
+    m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(),
+                              pParams->m_rtPart);
+    return TRUE;
+  }
+  CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
+  if (!pWidget) {
+    return FWL_ERR_Indefinite;
+  }
+  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
+  CFX_Graphics* pGraphics = pParams->m_pGraphics;
+  CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
+  if (!pRenderDevice)
+    return FALSE;
+  m_pTextOut->SetRenderDevice(pRenderDevice);
+  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
+  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+  m_pTextOut->SetFont(pAcc->GetFDEFont());
+  m_pTextOut->SetFontSize(pAcc->GetFontSize());
+  m_pTextOut->SetTextColor(pAcc->GetTextColor());
+  CFX_Matrix mtPart = pParams->m_matrix;
+  CFX_Matrix* pMatrix = pGraphics->GetMatrix();
+  if (pMatrix) {
+    mtPart.Concat(*pMatrix);
+  }
+  m_pTextOut->SetMatrix(mtPart);
+  m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(),
+                            pParams->m_rtPart);
+  return TRUE;
+}
+void* CXFA_FWLTheme::GetCapacity(CFWL_ThemePart* pThemePart,
+                                 FX_DWORD dwCapacity) {
+  switch (dwCapacity) {
+    case FWL_WGTCAPACITY_Font: {
+      if (CXFA_FFWidget* pWidget =
+              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+        return pWidget->GetDataAcc()->GetFDEFont();
+      }
+    } break;
+    case FWL_WGTCAPACITY_FontSize: {
+      if (CXFA_FFWidget* pWidget =
+              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+        m_fCapacity = pWidget->GetDataAcc()->GetFontSize();
+        return &m_fCapacity;
+      }
+    } break;
+    case FWL_WGTCAPACITY_TextColor: {
+      if (CXFA_FFWidget* pWidget =
+              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+        m_dwCapacity = pWidget->GetDataAcc()->GetTextColor();
+        return &m_dwCapacity;
+      }
+    } break;
+    case FWL_WGTCAPACITY_LineHeight: {
+      if (CXFA_FFWidget* pWidget =
+              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+        m_fCapacity = pWidget->GetDataAcc()->GetLineHeight();
+        return &m_fCapacity;
+      }
+    } break;
+    case FWL_WGTCAPACITY_ScrollBarWidth: {
+      m_fCapacity = 9;
+      return &m_fCapacity;
+    } break;
+    case FWL_WGTCAPACITY_UIMargin: {
+      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
+      if (pWidget) {
+        CXFA_LayoutItem* pItem = pWidget;
+        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
+        pWidgetAcc->GetUIMargin(m_Rect);
+        if (CXFA_Para para = pWidgetAcc->GetPara()) {
+          m_Rect.left += para.GetMarginLeft();
+          if (pWidgetAcc->IsMultiLine()) {
+            m_Rect.width += para.GetMarginRight();
+          }
+        }
+        if (pItem->GetPrev() == NULL) {
+          if (pItem->GetNext()) {
+            m_Rect.height = 0;
+          }
+        } else if (pItem->GetNext() == NULL) {
+          m_Rect.top = 0;
+        } else {
+          m_Rect.top = 0;
+          m_Rect.height = 0;
+        }
+      }
+      return &m_Rect;
+    } break;
+    case FWL_WGTCAPACITY_SpaceAboveBelow: {
+      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
+      if (pWidget) {
+        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
+        if (CXFA_Para para = pWidgetAcc->GetPara()) {
+          m_SizeAboveBelow.x = para.GetSpaceAbove();
+          m_SizeAboveBelow.y = para.GetSpaceBelow();
+        }
+      }
+      return &m_SizeAboveBelow;
+    } break;
+    default:
+      break;
+  }
+  if (pThemePart->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar &&
+      dwCapacity >= FWL_MCCAPACITY_Sun && dwCapacity <= FWL_MCCAPACITY_Today) {
+    if (CXFA_FFWidget* pWidget =
+            XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
+      IXFA_AppProvider* pAppProvider = pWidget->GetAppProvider();
+      m_wsResource.Empty();
+      pAppProvider->LoadString(
+          XFA_IDS_StringWeekDay_Sun + dwCapacity - FWL_WGTCAPACITY_MAX - 5,
+          m_wsResource);
+      if (!m_wsResource.IsEmpty()) {
+        return &m_wsResource;
+      }
+    }
+  }
+  return GetTheme(pThemePart->m_pWidget)->GetCapacity(pThemePart, dwCapacity);
+}
+FX_BOOL CXFA_FWLTheme::IsCustomizedLayout(IFWL_Widget* pWidget) {
+  return GetTheme(pWidget)->IsCustomizedLayout(pWidget);
+}
+FWL_ERR CXFA_FWLTheme::GetPartRect(CFWL_ThemePart* pThemePart) {
+  CFX_RectF rect;
+  return GetTheme(pThemePart->m_pWidget)->GetPartRect(pThemePart, rect);
+}
+FX_BOOL CXFA_FWLTheme::IsInPart(CFWL_ThemePart* pThemePart,
+                                FX_FLOAT fx,
+                                FX_FLOAT fy) {
+  return GetTheme(pThemePart->m_pWidget)->IsInPart(pThemePart, fx, fy);
+}
+FX_BOOL CXFA_FWLTheme::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
+  if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) {
+    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
+    if (!pWidget) {
+      return FWL_ERR_Indefinite;
+    }
+    if (!pParams)
+      return FALSE;
+    if (!m_pTextOut)
+      return FALSE;
+    m_pTextOut->SetFont(m_pCalendarFont);
+    m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
+    m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
+    m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+    m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
+    m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
+                              rect);
+    return TRUE;
+  }
+  CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
+  if (!pWidget) {
+    return FWL_ERR_Indefinite;
+  }
+  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
+  m_pTextOut->SetFont(pAcc->GetFDEFont());
+  m_pTextOut->SetFontSize(pAcc->GetFontSize());
+  m_pTextOut->SetTextColor(pAcc->GetTextColor());
+  if (!pParams)
+    return FALSE;
+  if (!m_pTextOut)
+    return FALSE;
+  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
+  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
+  m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
+                            rect);
+  return TRUE;
+}
+CFWL_WidgetTP* CXFA_FWLTheme::GetTheme(IFWL_Widget* pWidget) {
+  switch (pWidget->GetClassID()) {
+    case FWL_CLASSHASH_CheckBox:
+      return m_pCheckBoxTP;
+    case FWL_CLASSHASH_ListBox:
+      return m_pListBoxTP;
+    case FWL_CLASSHASH_PictureBox:
+      return m_pPictureBoxTP;
+    case FWL_CLASSHASH_ScrollBar:
+      return m_pSrollBarTP;
+    case FWL_CLASSHASH_Edit:
+      return m_pEditTP;
+    case FWL_CLASSHASH_ComboBox:
+      return m_pComboBoxTP;
+    case FWL_CLASSHASH_MonthCalendar:
+      return m_pMonthCalendarTP;
+    case FWL_CLASSHASH_DateTimePicker:
+      return m_pDateTimePickerTP;
+    case FWL_CLASSHASH_PushButton:
+      return m_pPushButtonTP;
+    case FWL_CLASSHASH_Caret:
+      return m_pCaretTP;
+    case FWL_CLASSHASH_Barcode:
+      return m_pBarcodeTP;
+    default:
+      break;
+  }
+  return NULL;
+}
+CXFA_FWLCheckBoxTP::CXFA_FWLCheckBoxTP() {}
+FX_BOOL CXFA_FWLCheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  if (pParams->m_iPart != FWL_PART_CKB_CheckBox) {
+    return TRUE;
+  }
+  if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+       FWL_PARTSTATE_CKB_Checked) ||
+      ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
+       FWL_PARTSTATE_CKB_Neutral)) {
+    DrawCheckSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
+                  pParams->m_dwStates, &pParams->m_matrix);
+  }
+  return TRUE;
+}
+void CXFA_FWLCheckBoxTP::DrawCheckSign(IFWL_Widget* pWidget,
+                                       CFX_Graphics* pGraphics,
+                                       const CFX_RectF* pRtBox,
+                                       int32_t iState,
+                                       CFX_Matrix* pMatrix) {
+  CFX_RectF rtSign(*pRtBox);
+  FX_DWORD dwColor = 0xFF000000;
+  if ((iState & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral) {
+    dwColor = 0xFFA9A9A9;
+  }
+  {
+    FX_DWORD dwStyle = pWidget->GetStylesEx();
+    rtSign.Deflate(rtSign.width / 4, rtSign.height / 4);
+    switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) {
+      case FWL_STYLEEXT_CKB_SignShapeCheck:
+        DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      case FWL_STYLEEXT_CKB_SignShapeCircle:
+        DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      case FWL_STYLEEXT_CKB_SignShapeCross:
+        DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      case FWL_STYLEEXT_CKB_SignShapeDiamond:
+        DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      case FWL_STYLEEXT_CKB_SignShapeSquare:
+        DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      case FWL_STYLEEXT_CKB_SignShapeStar:
+        DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix);
+        break;
+      default:
+        break;
+    }
+  }
+}
+CXFA_FWLEditTP::CXFA_FWLEditTP() {}
+CXFA_FWLEditTP::~CXFA_FWLEditTP() {}
+FX_BOOL CXFA_FWLEditTP::DrawBackground(CFWL_ThemeBackground* pParams) {
+  if (FWL_PART_EDT_CombTextLine == pParams->m_iPart) {
+    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
+    FX_ARGB cr = 0xFF000000;
+    FX_FLOAT fWidth = 1.0f;
+    if (CXFA_Border borderUI = pWidget->GetDataAcc()->GetUIBorder()) {
+      CXFA_Edge edge = borderUI.GetEdge(0);
+      if (edge) {
+        cr = edge.GetColor();
+        fWidth = edge.GetThickness();
+      }
+    }
+    CFX_Color crLine(cr);
+    pParams->m_pGraphics->SetStrokeColor(&crLine);
+    pParams->m_pGraphics->SetLineWidth(fWidth);
+    pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix);
+    return TRUE;
+  }
+  return CFWL_EditTP::DrawBackground(pParams);
+}
diff --git a/xfa/fxfa/app/xfa_fwltheme.h b/xfa/fxfa/app/xfa_fwltheme.h
new file mode 100644
index 0000000..aab8099
--- /dev/null
+++ b/xfa/fxfa/app/xfa_fwltheme.h
@@ -0,0 +1,110 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_FWLTHEME_H_
+#define XFA_FXFA_APP_XFA_FWLTHEME_H_
+
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/include/fwl/core/fwl_target.h"
+#include "xfa/include/fwl/core/fwl_theme.h"
+#include "xfa/include/fwl/theme/barcodetp.h"
+#include "xfa/include/fwl/theme/carettp.h"
+#include "xfa/include/fwl/theme/checkboxtp.h"
+#include "xfa/include/fwl/theme/comboboxtp.h"
+#include "xfa/include/fwl/theme/datetimepickertp.h"
+#include "xfa/include/fwl/theme/edittp.h"
+#include "xfa/include/fwl/theme/listboxtp.h"
+#include "xfa/include/fwl/theme/monthcalendartp.h"
+#include "xfa/include/fwl/theme/pictureboxtp.h"
+#include "xfa/include/fwl/theme/pushbuttontp.h"
+#include "xfa/include/fwl/theme/scrollbartp.h"
+#include "xfa/include/fwl/theme/widgettp.h"
+
+class CXFA_FWLTheme : public IFWL_ThemeProvider {
+ public:
+  CXFA_FWLTheme(CXFA_FFApp* pApp);
+  virtual ~CXFA_FWLTheme();
+  virtual FWL_ERR Release() {
+    delete this;
+    return FWL_ERR_Succeeded;
+  }
+  virtual IFWL_Target* Retain() { return NULL; }
+  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const {
+    return FWL_ERR_Succeeded;
+  }
+  virtual FX_DWORD GetHashCode() const { return 0; }
+  virtual FWL_ERR Initialize();
+  virtual FWL_ERR Finalize();
+  virtual FX_BOOL IsValidWidget(IFWL_Widget* pWidget);
+  virtual FX_DWORD GetThemeID(IFWL_Widget* pWidget);
+  virtual FX_DWORD SetThemeID(IFWL_Widget* pWidget,
+                              FX_DWORD dwThemeID,
+                              FX_BOOL bChildren = TRUE);
+  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
+  virtual FX_BOOL DrawText(CFWL_ThemeText* pParams);
+  virtual void* GetCapacity(CFWL_ThemePart* pThemePart, FX_DWORD dwCapacity);
+  virtual FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget);
+  virtual FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart);
+  virtual FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
+                           FX_FLOAT fx,
+                           FX_FLOAT fy);
+
+  virtual FX_BOOL CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect);
+  virtual FWL_ERR GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) {
+    return FWL_ERR_Succeeded;
+  }
+  virtual FWL_ERR SetThemeMatrix(IFWL_Widget* pWidget,
+                                 const CFX_Matrix& matrix) {
+    return FWL_ERR_Succeeded;
+  }
+  virtual FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) {
+    return FWL_ERR_Succeeded;
+  }
+
+ protected:
+  CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget);
+  CFWL_CheckBoxTP* m_pCheckBoxTP;
+  CFWL_ListBoxTP* m_pListBoxTP;
+  CFWL_PictureBoxTP* m_pPictureBoxTP;
+  CFWL_ScrollBarTP* m_pSrollBarTP;
+  CFWL_EditTP* m_pEditTP;
+  CFWL_ComboBoxTP* m_pComboBoxTP;
+  CFWL_MonthCalendarTP* m_pMonthCalendarTP;
+  CFWL_DateTimePickerTP* m_pDateTimePickerTP;
+  CFWL_PushButtonTP* m_pPushButtonTP;
+  CFWL_CaretTP* m_pCaretTP;
+  CFWL_BarcodeTP* m_pBarcodeTP;
+  IFDE_TextOut* m_pTextOut;
+  FX_FLOAT m_fCapacity;
+  FX_DWORD m_dwCapacity;
+  IFX_Font* m_pCalendarFont;
+  CFX_WideString m_wsResource;
+  CXFA_FFApp* m_pApp;
+  CFX_RectF m_Rect;
+  CFX_SizeF m_SizeAboveBelow;
+};
+class CXFA_FWLCheckBoxTP : public CFWL_CheckBoxTP {
+ public:
+  CXFA_FWLCheckBoxTP();
+  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
+
+ protected:
+  void DrawCheckSign(IFWL_Widget* pWidget,
+                     CFX_Graphics* pGraphics,
+                     const CFX_RectF* pRtBox,
+                     int32_t iState,
+                     CFX_Matrix* pMatrix);
+};
+class CXFA_FWLEditTP : public CFWL_EditTP {
+ public:
+  CXFA_FWLEditTP();
+  virtual ~CXFA_FWLEditTP();
+
+ public:
+  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
+};
+
+#endif  // XFA_FXFA_APP_XFA_FWLTHEME_H_
diff --git a/xfa/fxfa/app/xfa_rendercontext.cpp b/xfa/fxfa/app/xfa_rendercontext.cpp
new file mode 100644
index 0000000..5b5cf48
--- /dev/null
+++ b/xfa/fxfa/app/xfa_rendercontext.cpp
@@ -0,0 +1,77 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_rendercontext.h"
+
+#include "xfa/fxfa/app/xfa_ffwidget.h"
+#include "xfa/include/fxgraphics/fx_graphics.h"
+
+#define XFA_RENDERCONTEXT_MaxCount 30
+
+IXFA_RenderContext* XFA_RenderContext_Create() {
+  return new CXFA_RenderContext;
+}
+CXFA_RenderContext::CXFA_RenderContext() {
+  m_pWidgetIterator = NULL;
+  m_pWidget = NULL;
+  m_pPageView = NULL;
+  m_pGS = NULL;
+  m_dwStatus = 0;
+  m_matrix.SetIdentity();
+  m_rtClipRect.Reset();
+}
+CXFA_RenderContext::~CXFA_RenderContext() {
+  StopRender();
+}
+int32_t CXFA_RenderContext::StartRender(IXFA_PageView* pPageView,
+                                        CFX_Graphics* pGS,
+                                        const CFX_Matrix& matrix,
+                                        const CXFA_RenderOptions& options) {
+  m_pPageView = pPageView;
+  m_pGS = pGS;
+  m_matrix = matrix;
+  m_options = options;
+  CFX_RectF rtPage;
+  pGS->GetClipRect(rtPage);
+  CFX_Matrix mtRes;
+  mtRes.SetReverse(matrix);
+  m_rtClipRect.Set(rtPage.left, rtPage.top, rtPage.width, rtPage.height);
+  mtRes.TransformRect(m_rtClipRect);
+  m_dwStatus = m_options.m_bHighlight ? XFA_WIDGETSTATUS_Highlight : 0;
+  FX_DWORD dwFilterType = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_AllType |
+                          (m_options.m_bPrint ? XFA_WIDGETSTATUS_Printable
+                                              : XFA_WIDGETSTATUS_Viewable);
+  m_pWidgetIterator =
+      m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType);
+  m_pWidget = m_pWidgetIterator->MoveToNext();
+  return XFA_RENDERSTATUS_Ready;
+}
+int32_t CXFA_RenderContext::DoRender(IFX_Pause* pPause) {
+  int32_t iCount = 0;
+  while (m_pWidget) {
+    CXFA_FFWidget* pWidget = (CXFA_FFWidget*)m_pWidget;
+    CFX_RectF rtWidgetBox;
+    pWidget->GetBBox(rtWidgetBox, XFA_WIDGETSTATUS_Visible);
+    rtWidgetBox.width += 1;
+    rtWidgetBox.height += 1;
+    if (rtWidgetBox.IntersectWith(m_rtClipRect)) {
+      pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);
+    }
+    m_pWidget = m_pWidgetIterator->MoveToNext();
+    iCount++;
+    if (iCount > XFA_RENDERCONTEXT_MaxCount && pPause &&
+        pPause->NeedToPauseNow()) {
+      return XFA_RENDERSTATUS_ToBeContinued;
+    }
+  }
+  return XFA_RENDERSTATUS_Done;
+}
+void CXFA_RenderContext::StopRender() {
+  if (m_pWidgetIterator) {
+    m_pWidgetIterator->Release();
+    m_pWidgetIterator = NULL;
+  }
+}
diff --git a/xfa/fxfa/app/xfa_rendercontext.h b/xfa/fxfa/app/xfa_rendercontext.h
new file mode 100644
index 0000000..ef4b306
--- /dev/null
+++ b/xfa/fxfa/app/xfa_rendercontext.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_RENDERCONTEXT_H_
+#define XFA_FXFA_APP_XFA_RENDERCONTEXT_H_
+
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_RenderContext : public IXFA_RenderContext {
+ public:
+  CXFA_RenderContext();
+  virtual ~CXFA_RenderContext();
+  virtual void Release() { delete this; }
+  virtual int32_t StartRender(IXFA_PageView* pPageView,
+                              CFX_Graphics* pGS,
+                              const CFX_Matrix& matrix,
+                              const CXFA_RenderOptions& options);
+  virtual int32_t DoRender(IFX_Pause* pPause = NULL);
+  virtual void StopRender();
+
+ protected:
+  IXFA_WidgetIterator* m_pWidgetIterator;
+  IXFA_Widget* m_pWidget;
+  IXFA_PageView* m_pPageView;
+  CFX_Graphics* m_pGS;
+  CFX_Matrix m_matrix;
+  CXFA_RenderOptions m_options;
+  FX_DWORD m_dwStatus;
+  CFX_RectF m_rtClipRect;
+};
+
+#endif  // XFA_FXFA_APP_XFA_RENDERCONTEXT_H_
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
new file mode 100644
index 0000000..05316f8
--- /dev/null
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -0,0 +1,2001 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/app/xfa_textlayout.h"
+
+#include <algorithm>
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fde/fde_pen.h"
+#include "xfa/fgas/crt/fgas_algorithm.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fxfa/app/xfa_ffapp.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/app/xfa_fontmgr.h"
+
+CXFA_CSSTagProvider::~CXFA_CSSTagProvider() {
+  FX_POSITION pos = m_Attributes.GetStartPosition();
+  while (pos) {
+    CFX_WideString *pName = NULL, *pValue = NULL;
+    m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue);
+    delete pName;
+    delete pValue;
+  }
+}
+void CXFA_CSSTagProvider::GetNextAttribute(FX_POSITION& pos,
+                                           CFX_WideStringC& wsAttr,
+                                           CFX_WideStringC& wsValue) {
+  if (pos == NULL) {
+    return;
+  }
+  CFX_WideString* pName = NULL;
+  CFX_WideString* pValue = NULL;
+  m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue);
+  wsAttr = *pName;
+  wsValue = *pValue;
+}
+void CXFA_CSSTagProvider::SetAttribute(const CFX_WideString& wsAttr,
+                                       const CFX_WideString& wsValue) {
+  CFX_WideString* pName = new CFX_WideString();
+  CFX_WideString* pValue = new CFX_WideString();
+  *pName = wsAttr;
+  *pValue = wsValue;
+  m_Attributes.SetAt(pName, pValue);
+}
+void CXFA_TextParseContext::SetDecls(const IFDE_CSSDeclaration** ppDeclArray,
+                                     int32_t iDeclCount) {
+  if (iDeclCount <= 0 || ppDeclArray == NULL) {
+    return;
+  }
+  m_dwMatchedDecls = iDeclCount;
+  m_ppMatchedDecls = FX_Alloc(IFDE_CSSDeclaration*, iDeclCount);
+  FXSYS_memcpy(m_ppMatchedDecls, ppDeclArray,
+               iDeclCount * sizeof(IFDE_CSSDeclaration*));
+}
+CXFA_TextParser::~CXFA_TextParser() {
+  if (m_pUASheet)
+    m_pUASheet->Release();
+  if (m_pSelector)
+    m_pSelector->Release();
+  if (m_pAllocator)
+    m_pAllocator->Release();
+  FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition();
+  while (ps) {
+    IFDE_XMLNode* pXMLNode;
+    CXFA_TextParseContext* pParseContext;
+    m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext);
+    if (pParseContext)
+      FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext);
+  }
+  m_mapXMLNodeToParseContext.RemoveAll();
+}
+void CXFA_TextParser::Reset() {
+  FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition();
+  while (ps) {
+    IFDE_XMLNode* pXMLNode;
+    CXFA_TextParseContext* pParseContext;
+    m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext);
+    if (pParseContext)
+      FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext);
+  }
+  m_mapXMLNodeToParseContext.RemoveAll();
+  if (m_pAllocator) {
+    m_pAllocator->Release();
+    m_pAllocator = NULL;
+  }
+}
+void CXFA_TextParser::InitCSSData(IXFA_TextProvider* pTextProvider) {
+  if (pTextProvider == NULL) {
+    return;
+  }
+  if (m_pSelector == NULL) {
+    CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
+    IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr();
+    FXSYS_assert(pFontMgr);
+    m_pSelector = IFDE_CSSStyleSelector::Create();
+    m_pSelector->SetFontMgr(pFontMgr);
+    FX_FLOAT fFontSize = 10;
+    CXFA_Font font = pTextProvider->GetFontNode();
+    if (font) {
+      fFontSize = font.GetFontSize();
+    }
+    m_pSelector->SetDefFontSize(fFontSize);
+  }
+  if (m_pUASheet == NULL) {
+    m_pUASheet = LoadDefaultSheetStyle();
+    m_pSelector->SetStyleSheet(FDE_CSSSTYLESHEETGROUP_UserAgent, m_pUASheet);
+    m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL);
+  }
+}
+IFDE_CSSStyleSheet* CXFA_TextParser::LoadDefaultSheetStyle() {
+  static const FX_WCHAR s_pStyle[] =
+      L"html,body,ol,p,ul{display:block}"
+      L"li{display:list-item}"
+      L"ol,ul{padding-left:33px}ol{list-style-type:decimal}ol,ul{margin-top:0;"
+      L"margin-bottom:0}ul,ol{margin:1.12em 0}"
+      L"a{color:#0000ff;text-decoration:underline}b{font-weight:bolder}i{font-"
+      L"style:italic}"
+      L"sup{vertical-align:+15em;font-size:.66em}sub{vertical-align:-15em;font-"
+      L"size:.66em}";
+  return IFDE_CSSStyleSheet::LoadFromBuffer(
+      CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8);
+}
+IFDE_CSSComputedStyle* CXFA_TextParser::CreateRootStyle(
+    IXFA_TextProvider* pTextProvider) {
+  CXFA_Font font = pTextProvider->GetFontNode();
+  CXFA_Para para = pTextProvider->GetParaNode();
+  IFDE_CSSComputedStyle* pStyle = m_pSelector->CreateComputedStyle(NULL);
+  IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles();
+  IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
+  FX_FLOAT fLineHeight = 0, fFontSize = 10;
+  if (para) {
+    fLineHeight = para.GetLineHeight();
+    FDE_CSSLENGTH indent;
+    indent.Set(FDE_CSSLENGTHUNIT_Point, para.GetTextIndent());
+    pParaStyle->SetTextIndent(indent);
+    FDE_CSSTEXTALIGN hAlgin = FDE_CSSTEXTALIGN_Left;
+    switch (para.GetHorizontalAlign()) {
+      case XFA_ATTRIBUTEENUM_Center:
+        hAlgin = FDE_CSSTEXTALIGN_Center;
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        hAlgin = FDE_CSSTEXTALIGN_Right;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        hAlgin = FDE_CSSTEXTALIGN_Justify;
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        hAlgin = FDE_CSSTEXTALIGN_JustifyAll;
+        break;
+    }
+    pParaStyle->SetTextAlign(hAlgin);
+    FDE_CSSRECT rtMarginWidth;
+    rtMarginWidth.left.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginLeft());
+    rtMarginWidth.top.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceAbove());
+    rtMarginWidth.right.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginRight());
+    rtMarginWidth.bottom.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceBelow());
+    pStyle->GetBoundaryStyles()->SetMarginWidth(rtMarginWidth);
+  }
+  if (font) {
+    pFontStyle->SetColor(font.GetColor());
+    pFontStyle->SetFontStyle(font.IsItalic() ? FDE_CSSFONTSTYLE_Italic
+                                             : FDE_CSSFONTSTYLE_Normal);
+    pFontStyle->SetFontWeight(font.IsBold() ? FXFONT_FW_BOLD
+                                            : FXFONT_FW_NORMAL);
+    pParaStyle->SetNumberVerticalAlign(-font.GetBaselineShift());
+    fFontSize = font.GetFontSize();
+    FDE_CSSLENGTH letterSpacing;
+    letterSpacing.Set(FDE_CSSLENGTHUNIT_Point, font.GetLetterSpacing());
+    pParaStyle->SetLetterSpacing(letterSpacing);
+    FX_DWORD dwDecoration = 0;
+    if (font.GetLineThrough() > 0) {
+      dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough;
+    }
+    if (font.GetUnderline() > 1) {
+      dwDecoration |= FDE_CSSTEXTDECORATION_Double;
+    } else if (font.GetUnderline() > 0) {
+      dwDecoration |= FDE_CSSTEXTDECORATION_Underline;
+    }
+    pParaStyle->SetTextDecoration(dwDecoration);
+  }
+  pParaStyle->SetLineHeight(fLineHeight);
+  pFontStyle->SetFontSize(fFontSize);
+  return pStyle;
+}
+IFDE_CSSComputedStyle* CXFA_TextParser::CreateStyle(
+    IFDE_CSSComputedStyle* pParentStyle) {
+  IFDE_CSSComputedStyle* pNewStyle =
+      m_pSelector->CreateComputedStyle(pParentStyle);
+  FXSYS_assert(pNewStyle);
+  if (pParentStyle) {
+    IFDE_CSSParagraphStyle* pParaStyle = pParentStyle->GetParagraphStyles();
+    FX_DWORD dwDecoration = pParaStyle->GetTextDecoration();
+    FX_FLOAT fBaseLine = 0;
+    if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) {
+      fBaseLine = pParaStyle->GetNumberVerticalAlign();
+    }
+    pParaStyle = pNewStyle->GetParagraphStyles();
+    pParaStyle->SetTextDecoration(dwDecoration);
+    pParaStyle->SetNumberVerticalAlign(fBaseLine);
+    IFDE_CSSBoundaryStyle* pBoundarytyle = pParentStyle->GetBoundaryStyles();
+    const FDE_CSSRECT* pRect = pBoundarytyle->GetMarginWidth();
+    if (pRect) {
+      pBoundarytyle = pNewStyle->GetBoundaryStyles();
+      pBoundarytyle->SetMarginWidth(*pRect);
+    }
+  }
+  return pNewStyle;
+}
+IFDE_CSSComputedStyle* CXFA_TextParser::ComputeStyle(
+    IFDE_XMLNode* pXMLNode,
+    IFDE_CSSComputedStyle* pParentStyle) {
+  CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>(
+      m_mapXMLNodeToParseContext.GetValueAt(pXMLNode));
+  if (!pContext)
+    return nullptr;
+  pContext->m_pParentStyle = pParentStyle;
+  pParentStyle->AddRef();
+  CXFA_CSSTagProvider tagProvider;
+  ParseTagInfo(pXMLNode, tagProvider);
+  if (tagProvider.m_bContent)
+    return nullptr;
+  IFDE_CSSComputedStyle* pStyle = CreateStyle(pParentStyle);
+  IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
+  pCSSAccel->OnEnterTag(&tagProvider);
+  m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(),
+                            pContext->CountDecls(), pStyle);
+  pCSSAccel->OnLeaveTag(&tagProvider);
+  return pStyle;
+}
+void CXFA_TextParser::DoParse(IFDE_XMLNode* pXMLContainer,
+                              IXFA_TextProvider* pTextProvider) {
+  if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) {
+    return;
+  }
+  m_pAllocator =
+      FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 32, sizeof(CXFA_CSSTagProvider));
+  InitCSSData(pTextProvider);
+  IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider);
+  ParseRichText(pXMLContainer, pRootStyle);
+  pRootStyle->Release();
+}
+void CXFA_TextParser::ParseRichText(IFDE_XMLNode* pXMLNode,
+                                    IFDE_CSSComputedStyle* pParentStyle) {
+  if (pXMLNode == NULL) {
+    return;
+  }
+  CXFA_CSSTagProvider tagProvider;
+  ParseTagInfo(pXMLNode, tagProvider);
+  if (!tagProvider.m_bTagAviliable) {
+    return;
+  }
+  IFDE_CSSComputedStyle* pNewStyle = NULL;
+  if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) ||
+      (tagProvider.GetTagName() != FX_WSTRC(L"html"))) {
+    CXFA_TextParseContext* pTextContext =
+        FXTARGET_NewWith(m_pAllocator) CXFA_TextParseContext;
+    FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_Inline;
+    if (!tagProvider.m_bContent) {
+      pNewStyle = CreateStyle(pParentStyle);
+      IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
+      pCSSAccel->OnEnterTag(&tagProvider);
+      CFDE_CSSDeclarationArray DeclArray;
+      int32_t iMatchedDecls =
+          m_pSelector->MatchDeclarations(&tagProvider, DeclArray);
+      const IFDE_CSSDeclaration** ppMatchDecls =
+          (const IFDE_CSSDeclaration**)DeclArray.GetData();
+      m_pSelector->ComputeStyle(&tagProvider, ppMatchDecls, iMatchedDecls,
+                                pNewStyle);
+      pCSSAccel->OnLeaveTag(&tagProvider);
+      if (iMatchedDecls > 0) {
+        pTextContext->SetDecls(ppMatchDecls, iMatchedDecls);
+      }
+      eDisplay = pNewStyle->GetPositionStyles()->GetDisplay();
+    }
+    pTextContext->SetDisplay(eDisplay);
+    m_mapXMLNodeToParseContext.SetAt(pXMLNode, pTextContext);
+  }
+  for (IFDE_XMLNode* pXMLChild =
+           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    ParseRichText(pXMLChild, pNewStyle);
+  }
+  if (pNewStyle)
+    pNewStyle->Release();
+}
+void CXFA_TextParser::ParseTagInfo(IFDE_XMLNode* pXMLNode,
+                                   CXFA_CSSTagProvider& tagProvider) {
+  static const FX_DWORD s_XFATagName[] = {
+      0x61,       0x62,       0x69,       0x70,       0x0001f714,
+      0x00022a55, 0x000239bb, 0x00025881, 0x0bd37faa, 0x0bd37fb8,
+      0xa73e3af2, 0xb182eaae, 0xdb8ac455,
+  };
+  CFX_WideString wsName;
+  if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+    IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+    pXMLElement->GetLocalTagName(wsName);
+    tagProvider.SetTagNameObj(wsName);
+    FX_DWORD dwHashCode =
+        FX_HashCode_String_GetW(wsName, wsName.GetLength(), TRUE);
+    static const int32_t s_iCount = sizeof(s_XFATagName) / sizeof(FX_DWORD);
+    CFX_DSPATemplate<FX_DWORD> lookup;
+    tagProvider.m_bTagAviliable =
+        lookup.Lookup(dwHashCode, s_XFATagName, s_iCount) > -1;
+    CFX_WideString wsValue;
+    pXMLElement->GetString(FX_WSTRC(L"style").GetPtr(), wsValue);
+    if (!wsValue.IsEmpty()) {
+      tagProvider.SetAttribute(FX_WSTRC(L"style"), wsValue);
+    }
+  } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
+    tagProvider.m_bTagAviliable = TRUE;
+    tagProvider.m_bContent = TRUE;
+  }
+}
+int32_t CXFA_TextParser::GetVAlgin(IXFA_TextProvider* pTextProvider) const {
+  int32_t iAlign = XFA_ATTRIBUTEENUM_Top;
+  CXFA_Para para = pTextProvider->GetParaNode();
+  if (para) {
+    iAlign = para.GetVerticalAlign();
+  }
+  return iAlign;
+}
+FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const {
+  CFX_WideString wsValue;
+  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) {
+    CXFA_Measurement ms(wsValue);
+    return ms.ToUnit(XFA_UNIT_Pt);
+  }
+  return 36;
+}
+int32_t CXFA_TextParser::CountTabs(IFDE_CSSComputedStyle* pStyle) const {
+  CFX_WideString wsValue;
+  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue)) {
+    return wsValue.GetInteger();
+  }
+  return 0;
+}
+FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const {
+  CFX_WideString wsValue;
+  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) {
+    wsValue.MakeLower();
+    return wsValue == FX_WSTRC(L"yes");
+  }
+  return FALSE;
+}
+IFX_Font* CXFA_TextParser::GetFont(IXFA_TextProvider* pTextProvider,
+                                   IFDE_CSSComputedStyle* pStyle) const {
+  CFX_WideStringC wsFamily = FX_WSTRC(L"Courier");
+  FX_DWORD dwStyle = 0;
+  CXFA_Font font = pTextProvider->GetFontNode();
+  if (font) {
+    font.GetTypeface(wsFamily);
+    if (font.IsBold()) {
+      dwStyle |= FX_FONTSTYLE_Bold;
+    }
+    if (font.IsItalic()) {
+      dwStyle |= FX_FONTSTYLE_Italic;
+    }
+  }
+  if (pStyle) {
+    IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles();
+    int32_t iCount = pFontStyle->CountFontFamilies();
+    if (iCount > 0) {
+      wsFamily = pFontStyle->GetFontFamily(iCount - 1);
+    }
+    dwStyle = 0;
+    if (pFontStyle->GetFontWeight() > FXFONT_FW_NORMAL) {
+      dwStyle |= FX_FONTSTYLE_Bold;
+    }
+    if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) {
+      dwStyle |= FX_FONTSTYLE_Italic;
+    }
+  }
+  CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
+  CXFA_FontMgr* pFontMgr = pDoc->GetApp()->GetXFAFontMgr();
+  return pFontMgr->GetFont(pDoc, wsFamily, dwStyle);
+}
+FX_FLOAT CXFA_TextParser::GetFontSize(IXFA_TextProvider* pTextProvider,
+                                      IFDE_CSSComputedStyle* pStyle) const {
+  if (pStyle)
+    return pStyle->GetFontStyles()->GetFontSize();
+
+  CXFA_Font font = pTextProvider->GetFontNode();
+  if (font) {
+    return font.GetFontSize();
+  }
+  return 10;
+}
+int32_t CXFA_TextParser::GetHorScale(IXFA_TextProvider* pTextProvider,
+                                     IFDE_CSSComputedStyle* pStyle,
+                                     IFDE_XMLNode* pXMLNode) const {
+  if (pStyle) {
+    CFX_WideString wsValue;
+    if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"),
+                               wsValue)) {
+      return wsValue.GetInteger();
+    }
+    while (pXMLNode) {
+      CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>(
+          m_mapXMLNodeToParseContext.GetValueAt(pXMLNode));
+      if (pContext && pContext->m_pParentStyle &&
+          pContext->m_pParentStyle->GetCustomStyle(
+              FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) {
+        return wsValue.GetInteger();
+      }
+      pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
+    }
+  }
+  if (CXFA_Font font = pTextProvider->GetFontNode()) {
+    return static_cast<int32_t>(font.GetHorizontalScale());
+  }
+  return 100;
+}
+int32_t CXFA_TextParser::GetVerScale(IXFA_TextProvider* pTextProvider,
+                                     IFDE_CSSComputedStyle* pStyle) const {
+  if (pStyle) {
+    CFX_WideString wsValue;
+    if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue)) {
+      return wsValue.GetInteger();
+    }
+  }
+  if (CXFA_Font font = pTextProvider->GetFontNode()) {
+    return (int32_t)font.GetVerticalScale();
+  }
+  return 100;
+}
+void CXFA_TextParser::GetUnderline(IXFA_TextProvider* pTextProvider,
+                                   IFDE_CSSComputedStyle* pStyle,
+                                   int32_t& iUnderline,
+                                   int32_t& iPeriod) const {
+  iUnderline = 0;
+  iPeriod = XFA_ATTRIBUTEENUM_All;
+  if (pStyle) {
+    FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration();
+    if (dwDecoration & FDE_CSSTEXTDECORATION_Double) {
+      iUnderline = 2;
+    } else if (dwDecoration & FDE_CSSTEXTDECORATION_Underline) {
+      iUnderline = 1;
+    }
+    CFX_WideString wsValue;
+    if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) {
+      if (wsValue == FX_WSTRC(L"word")) {
+        iPeriod = XFA_ATTRIBUTEENUM_Word;
+      }
+    } else if (CXFA_Font font = pTextProvider->GetFontNode()) {
+      iPeriod = font.GetUnderlinePeriod();
+    }
+  } else {
+    CXFA_Font font = pTextProvider->GetFontNode();
+    if (font) {
+      iUnderline = font.GetUnderline();
+      iPeriod = font.GetUnderlinePeriod();
+    }
+  }
+}
+void CXFA_TextParser::GetLinethrough(IXFA_TextProvider* pTextProvider,
+                                     IFDE_CSSComputedStyle* pStyle,
+                                     int32_t& iLinethrough) const {
+  if (pStyle) {
+    FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration();
+    iLinethrough = (dwDecoration & FDE_CSSTEXTDECORATION_LineThrough) ? 1 : 0;
+  } else {
+    CXFA_Font font = pTextProvider->GetFontNode();
+    if (font) {
+      iLinethrough = font.GetLineThrough();
+    }
+  }
+}
+FX_ARGB CXFA_TextParser::GetColor(IXFA_TextProvider* pTextProvider,
+                                  IFDE_CSSComputedStyle* pStyle) const {
+  if (pStyle)
+    return pStyle->GetFontStyles()->GetColor();
+
+  if (CXFA_Font font = pTextProvider->GetFontNode())
+    return font.GetColor();
+
+  return 0xFF000000;
+}
+FX_FLOAT CXFA_TextParser::GetBaseline(IXFA_TextProvider* pTextProvider,
+                                      IFDE_CSSComputedStyle* pStyle) const {
+  if (pStyle) {
+    IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
+    if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) {
+      return pParaStyle->GetNumberVerticalAlign();
+    }
+  } else if (CXFA_Font font = pTextProvider->GetFontNode()) {
+    return font.GetBaselineShift();
+  }
+  return 0;
+}
+FX_FLOAT CXFA_TextParser::GetLineHeight(IXFA_TextProvider* pTextProvider,
+                                        IFDE_CSSComputedStyle* pStyle,
+                                        FX_BOOL bFirst,
+                                        FX_FLOAT fVerScale) const {
+  FX_FLOAT fLineHeight = 0;
+  if (pStyle) {
+    fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight();
+  } else if (CXFA_Para para = pTextProvider->GetParaNode()) {
+    fLineHeight = para.GetLineHeight();
+  }
+  if (bFirst) {
+    FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle);
+    if (fLineHeight < 0.1f) {
+      fLineHeight = fFontSize;
+    } else {
+      fLineHeight = std::min(fLineHeight, fFontSize);
+    }
+  } else if (fLineHeight < 0.1f) {
+    fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f;
+  }
+  fLineHeight *= fVerScale;
+  return fLineHeight;
+}
+FX_BOOL CXFA_TextParser::GetEmbbedObj(IXFA_TextProvider* pTextProvider,
+                                      IFDE_XMLNode* pXMLNode,
+                                      CFX_WideString& wsValue) {
+  wsValue.Empty();
+  if (pXMLNode == NULL) {
+    return FALSE;
+  }
+  FX_BOOL bRet = FALSE;
+  if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+    IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLNode;
+    CFX_WideString wsAttr;
+    pElement->GetString(FX_WSTRC(L"xfa:embed").GetPtr(), wsAttr);
+    if (wsAttr.IsEmpty()) {
+      return FALSE;
+    }
+    if (wsAttr.GetAt(0) == L'#') {
+      wsAttr.Delete(0);
+    }
+    CFX_WideString ws;
+    pElement->GetString(FX_WSTRC(L"xfa:embedType").GetPtr(), ws);
+    if (ws.IsEmpty()) {
+      ws = L"som";
+    } else {
+      ws.MakeLower();
+    }
+    FX_BOOL bURI = (ws == FX_WSTRC(L"uri"));
+    if (!bURI && ws != FX_WSTRC(L"som")) {
+      return FALSE;
+    }
+    ws.Empty();
+    pElement->GetString(FX_WSTRC(L"xfa:embedMode").GetPtr(), ws);
+    if (ws.IsEmpty()) {
+      ws = L"formatted";
+    } else {
+      ws.MakeLower();
+    }
+    FX_BOOL bRaw = (ws == FX_WSTRC(L"raw"));
+    if (!bRaw && ws != FX_WSTRC(L"formatted")) {
+      return FALSE;
+    }
+    bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue);
+  }
+  return bRet;
+}
+CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap(
+    IFDE_XMLNode* pXMLNode) {
+  return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(
+      pXMLNode);
+}
+enum XFA_TABSTOPSSTATUS {
+  XFA_TABSTOPSSTATUS_Error,
+  XFA_TABSTOPSSTATUS_EOS,
+  XFA_TABSTOPSSTATUS_None,
+  XFA_TABSTOPSSTATUS_Alignment,
+  XFA_TABSTOPSSTATUS_StartLeader,
+  XFA_TABSTOPSSTATUS_Leader,
+  XFA_TABSTOPSSTATUS_Location,
+};
+FX_BOOL CXFA_TextParser::GetTabstops(
+    IFDE_CSSComputedStyle* pStyle,
+    CXFA_TextTabstopsContext* pTabstopContext) {
+  if (pStyle == NULL || pTabstopContext == NULL) {
+    return FALSE;
+  }
+  CFX_WideString wsValue;
+  if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) &&
+      !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) {
+    return FALSE;
+  }
+  int32_t iLength = wsValue.GetLength();
+  const FX_WCHAR* pTabStops = wsValue;
+  int32_t iCur = 0;
+  int32_t iLast = 0;
+  CFX_WideString wsAlign;
+  XFA_TABSTOPSSTATUS eStatus = XFA_TABSTOPSSTATUS_None;
+  FX_WCHAR ch;
+  while (iCur < iLength) {
+    ch = pTabStops[iCur];
+    switch (eStatus) {
+      case XFA_TABSTOPSSTATUS_None:
+        if (ch <= ' ') {
+          iCur++;
+        } else {
+          eStatus = XFA_TABSTOPSSTATUS_Alignment;
+          iLast = iCur;
+        }
+        break;
+      case XFA_TABSTOPSSTATUS_Alignment:
+        if (ch == ' ') {
+          wsAlign = CFX_WideStringC(pTabStops + iLast, iCur - iLast);
+          eStatus = XFA_TABSTOPSSTATUS_StartLeader;
+          iCur++;
+          while (iCur < iLength && pTabStops[iCur] <= ' ') {
+            iCur++;
+          }
+          iLast = iCur;
+        } else {
+          iCur++;
+        }
+        break;
+      case XFA_TABSTOPSSTATUS_StartLeader:
+        if (ch != 'l') {
+          eStatus = XFA_TABSTOPSSTATUS_Location;
+        } else {
+          int32_t iCount = 0;
+          while (iCur < iLength) {
+            ch = pTabStops[iCur];
+            iCur++;
+            if (ch == '(') {
+              iCount++;
+            } else if (ch == ')') {
+              iCount--;
+              if (iCount == 0) {
+                break;
+              }
+            }
+          }
+          while (iCur < iLength && pTabStops[iCur] <= ' ') {
+            iCur++;
+          }
+          iLast = iCur;
+          eStatus = XFA_TABSTOPSSTATUS_Location;
+        }
+        break;
+      case XFA_TABSTOPSSTATUS_Location:
+        if (ch == ' ') {
+          FX_DWORD dwHashCode =
+              FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE);
+          CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast));
+          FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt);
+          pTabstopContext->Append(dwHashCode, fPos);
+          wsAlign.Empty();
+          eStatus = XFA_TABSTOPSSTATUS_None;
+        }
+        iCur++;
+        break;
+      default:
+        break;
+    }
+  }
+  if (!wsAlign.IsEmpty()) {
+    FX_DWORD dwHashCode =
+        FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE);
+    CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast));
+    FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt);
+    pTabstopContext->Append(dwHashCode, fPos);
+  }
+  return TRUE;
+}
+CXFA_TextLayout::CXFA_TextLayout(IXFA_TextProvider* pTextProvider)
+    : m_bHasBlock(FALSE),
+      m_pTextProvider(pTextProvider),
+      m_pTextDataNode(nullptr),
+      m_bRichText(FALSE),
+      m_pAllocator(nullptr),
+      m_pBreak(nullptr),
+      m_pLoader(nullptr),
+      m_iLines(0),
+      m_fMaxWidth(0),
+      m_pTabstopContext(nullptr),
+      m_bBlockContinue(TRUE) {
+  FXSYS_assert(m_pTextProvider);
+}
+CXFA_TextLayout::~CXFA_TextLayout() {
+  m_textParser.Reset();
+  delete m_pLoader;
+  delete m_pTabstopContext;
+  Unload();
+}
+void CXFA_TextLayout::Unload() {
+  int32_t iCount = m_pieceLines.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_PieceLine* pLine = m_pieceLines.GetAt(i);
+    FXTARGET_DeleteWith(CXFA_PieceLine, m_pAllocator, pLine);
+  }
+  m_pieceLines.RemoveAll();
+  if (m_pBreak) {
+    m_pBreak->Release();
+    m_pBreak = NULL;
+  }
+  if (m_pAllocator) {
+    m_pAllocator->Release();
+    m_pAllocator = NULL;
+  }
+}
+const CXFA_PieceLineArray* CXFA_TextLayout::GetPieceLines() {
+  return &m_pieceLines;
+}
+void CXFA_TextLayout::GetTextDataNode() {
+  if (m_pTextProvider == NULL) {
+    return;
+  }
+  CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText);
+  if (pNode && m_bRichText) {
+    m_textParser.Reset();
+  }
+  m_pTextDataNode = pNode;
+}
+IFDE_XMLNode* CXFA_TextLayout::GetXMLContainerNode() {
+  IFDE_XMLNode* pXMLContainer = NULL;
+  if (m_bRichText) {
+    IFDE_XMLNode* pXMLRoot = m_pTextDataNode->GetXMLMappingNode();
+    if (!pXMLRoot) {
+      return pXMLContainer;
+    }
+    for (IFDE_XMLNode* pXMLChild =
+             pXMLRoot->GetNodeItem(IFDE_XMLNode::FirstChild);
+         pXMLChild;
+         pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+      if (pXMLChild->GetType() == FDE_XMLNODE_Element) {
+        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
+        CFX_WideString wsTag;
+        pXMLElement->GetLocalTagName(wsTag);
+        if (wsTag.Equal(FX_WSTRC(L"body")) || wsTag.Equal(FX_WSTRC(L"html"))) {
+          pXMLContainer = pXMLChild;
+          break;
+        }
+      }
+    }
+  }
+  return pXMLContainer;
+}
+IFX_RTFBreak* CXFA_TextLayout::CreateBreak(FX_BOOL bDefault) {
+  FX_DWORD dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab;
+  if (!bDefault) {
+    dwStyle |= FX_RTFLAYOUTSTYLE_Pagination;
+  }
+  IFX_RTFBreak* pBreak = IFX_RTFBreak::Create(0);
+  pBreak->SetLayoutStyles(dwStyle);
+  pBreak->SetLineBreakChar(L'\n');
+  pBreak->SetLineBreakTolerance(1);
+  pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL));
+  pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, NULL));
+  return pBreak;
+}
+void CXFA_TextLayout::InitBreak(FX_FLOAT fLineWidth) {
+  CXFA_Font font = m_pTextProvider->GetFontNode();
+  CXFA_Para para = m_pTextProvider->GetParaNode();
+  FX_FLOAT fStart = 0;
+  FX_FLOAT fStartPos = 0;
+  if (para) {
+    int32_t iAlign = FX_RTFLINEALIGNMENT_Left;
+    switch (para.GetHorizontalAlign()) {
+      case XFA_ATTRIBUTEENUM_Center:
+        iAlign = FX_RTFLINEALIGNMENT_Center;
+        break;
+      case XFA_ATTRIBUTEENUM_Right:
+        iAlign = FX_RTFLINEALIGNMENT_Right;
+        break;
+      case XFA_ATTRIBUTEENUM_Justify:
+        iAlign = FX_RTFLINEALIGNMENT_Justified;
+        break;
+      case XFA_ATTRIBUTEENUM_JustifyAll:
+        iAlign = FX_RTFLINEALIGNMENT_Distributed;
+        break;
+    }
+    m_pBreak->SetAlignment(iAlign);
+    fStart = para.GetMarginLeft();
+    if (m_pTextProvider->IsCheckButtonAndAutoWidth()) {
+      if (iAlign != FX_RTFLINEALIGNMENT_Left) {
+        fLineWidth -= para.GetMarginRight();
+      }
+    } else {
+      fLineWidth -= para.GetMarginRight();
+    }
+    if (fLineWidth < 0) {
+      fLineWidth = fStart;
+    }
+    fStartPos = fStart;
+    FX_FLOAT fIndent = para.GetTextIndent();
+    if (fIndent > 0) {
+      fStartPos += fIndent;
+    }
+  }
+  m_pBreak->SetLineBoundary(fStart, fLineWidth);
+  m_pBreak->SetLineStartPos(fStartPos);
+  if (font) {
+    m_pBreak->SetHorizontalScale((int32_t)font.GetHorizontalScale());
+    m_pBreak->SetVerticalScale((int32_t)font.GetVerticalScale());
+    m_pBreak->SetCharSpace(font.GetLetterSpacing());
+  }
+  FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, NULL);
+  m_pBreak->SetFontSize(fFontSize);
+  m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL));
+  m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f);
+}
+void CXFA_TextLayout::InitBreak(IFDE_CSSComputedStyle* pStyle,
+                                FDE_CSSDISPLAY eDisplay,
+                                FX_FLOAT fLineWidth,
+                                IFDE_XMLNode* pXMLNode,
+                                IFDE_CSSComputedStyle* pParentStyle) {
+  if (pStyle == NULL) {
+    InitBreak(fLineWidth);
+    return;
+  }
+  IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
+  if (eDisplay == FDE_CSSDISPLAY_Block || eDisplay == FDE_CSSDISPLAY_ListItem) {
+    int32_t iAlign = FX_RTFLINEALIGNMENT_Left;
+    switch (pParaStyle->GetTextAlign()) {
+      case FDE_CSSTEXTALIGN_Right:
+        iAlign = FX_RTFLINEALIGNMENT_Right;
+        break;
+      case FDE_CSSTEXTALIGN_Center:
+        iAlign = FX_RTFLINEALIGNMENT_Center;
+        break;
+      case FDE_CSSTEXTALIGN_Justify:
+        iAlign = FX_RTFLINEALIGNMENT_Justified;
+        break;
+      case FDE_CSSTEXTALIGN_JustifyAll:
+        iAlign = FX_RTFLINEALIGNMENT_Distributed;
+        break;
+      default:
+        break;
+    }
+    m_pBreak->SetAlignment(iAlign);
+    FX_FLOAT fStart = 0;
+    const FDE_CSSRECT* pRect = pStyle->GetBoundaryStyles()->GetMarginWidth();
+    const FDE_CSSRECT* pPaddingRect =
+        pStyle->GetBoundaryStyles()->GetPaddingWidth();
+    if (pRect) {
+      fStart = pRect->left.GetValue();
+      fLineWidth -= pRect->right.GetValue();
+      if (pPaddingRect) {
+        fStart += pPaddingRect->left.GetValue();
+        fLineWidth -= pPaddingRect->right.GetValue();
+      }
+      if (eDisplay == FDE_CSSDISPLAY_ListItem) {
+        const FDE_CSSRECT* pParRect =
+            pParentStyle->GetBoundaryStyles()->GetMarginWidth();
+        const FDE_CSSRECT* pParPaddingRect =
+            pParentStyle->GetBoundaryStyles()->GetPaddingWidth();
+        if (pParRect) {
+          fStart += pParRect->left.GetValue();
+          fLineWidth -= pParRect->right.GetValue();
+          if (pParPaddingRect) {
+            fStart += pParPaddingRect->left.GetValue();
+            fLineWidth -= pParPaddingRect->right.GetValue();
+          }
+        }
+        FDE_CSSRECT pNewRect;
+        pNewRect.left.Set(FDE_CSSLENGTHUNIT_Point, fStart);
+        pNewRect.right.Set(FDE_CSSLENGTHUNIT_Point, pRect->right.GetValue());
+        pNewRect.top.Set(FDE_CSSLENGTHUNIT_Point, pRect->top.GetValue());
+        pNewRect.bottom.Set(FDE_CSSLENGTHUNIT_Point, pRect->bottom.GetValue());
+        pStyle->GetBoundaryStyles()->SetMarginWidth(pNewRect);
+      }
+    }
+    m_pBreak->SetLineBoundary(fStart, fLineWidth);
+    FX_FLOAT fIndent = pParaStyle->GetTextIndent().GetValue();
+    if (fIndent > 0) {
+      fStart += fIndent;
+    }
+    m_pBreak->SetLineStartPos(fStart);
+    m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle));
+    if (m_pTabstopContext == NULL) {
+      m_pTabstopContext = new CXFA_TextTabstopsContext;
+    }
+    m_textParser.GetTabstops(pStyle, m_pTabstopContext);
+    for (int32_t i = 0; i < m_pTabstopContext->m_iTabCount; i++) {
+      XFA_TABSTOPS* pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i);
+      m_pBreak->AddPositionedTab(pTab->fTabstops);
+    }
+  }
+  FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle);
+  m_pBreak->SetFontSize(fFontSize);
+  m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f);
+  m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle));
+  m_pBreak->SetHorizontalScale(
+      m_textParser.GetHorScale(m_pTextProvider, pStyle, pXMLNode));
+  m_pBreak->SetVerticalScale(m_textParser.GetVerScale(m_pTextProvider, pStyle));
+  m_pBreak->SetCharSpace(pParaStyle->GetLetterSpacing().GetValue());
+}
+int32_t CXFA_TextLayout::GetText(CFX_WideString& wsText) {
+  GetTextDataNode();
+  wsText.Empty();
+  if (m_bRichText) {
+  } else {
+    wsText = m_pTextDataNode->GetContent();
+  }
+  return wsText.GetLength();
+}
+FX_FLOAT CXFA_TextLayout::GetLayoutHeight() {
+  if (m_pLoader == NULL) {
+    return 0;
+  }
+  int32_t iCount = m_pLoader->m_lineHeights.GetSize();
+  if (iCount == 0 && m_pLoader->m_fWidth > 0) {
+    CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
+    CFX_SizeF szDef;
+    m_pLoader->m_bSaveLineHeight = TRUE;
+    m_pLoader->m_fLastPos = 0;
+    CalcSize(szMax, szMax, szDef);
+    m_pLoader->m_bSaveLineHeight = FALSE;
+    return szDef.y;
+  }
+  FX_FLOAT fHeight = m_pLoader->m_fHeight;
+  if (fHeight < 0.1f) {
+    fHeight = 0;
+    for (int32_t i = 0; i < iCount; i++) {
+      fHeight += m_pLoader->m_lineHeights.ElementAt(i);
+    }
+  }
+  return fHeight;
+}
+FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) {
+  if (m_pLoader == NULL) {
+    m_pLoader = new CXFA_LoaderContext;
+  }
+  if (fWidth < 0 || (m_pLoader->m_fWidth > -1 &&
+                     FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) {
+    m_pLoader->m_lineHeights.RemoveAll();
+    m_Blocks.RemoveAll();
+    Unload();
+    m_pLoader->m_fStartLineOffset = 0;
+  }
+  m_pLoader->m_fWidth = fWidth;
+  if (fWidth < 0) {
+    CFX_SizeF szMax;
+    CFX_SizeF szDef;
+    m_pLoader->m_bSaveLineHeight = TRUE;
+    m_pLoader->m_fLastPos = 0;
+    CalcSize(szMax, szMax, szDef);
+    m_pLoader->m_bSaveLineHeight = FALSE;
+    fWidth = szDef.x;
+  }
+  return fWidth;
+}
+FX_BOOL CXFA_TextLayout::DoLayout(int32_t iBlockIndex,
+                                  FX_FLOAT& fCalcHeight,
+                                  FX_FLOAT fContentAreaHeight,
+                                  FX_FLOAT fTextHeight) {
+  if (m_pLoader == NULL) {
+    return FALSE;
+  }
+  int32_t iBlockCount = m_Blocks.GetSize();
+  FX_FLOAT fHeight = fTextHeight;
+  if (fHeight < 0) {
+    fHeight = GetLayoutHeight();
+  }
+  m_pLoader->m_fHeight = fHeight;
+  if (fContentAreaHeight < 0) {
+    return FALSE;
+  }
+  m_bHasBlock = TRUE;
+  if (iBlockCount == 0 && fHeight > 0) {
+    fHeight = fTextHeight - GetLayoutHeight();
+    if (fHeight > 0) {
+      int32_t iAlign = m_textParser.GetVAlgin(m_pTextProvider);
+      if (iAlign == XFA_ATTRIBUTEENUM_Middle) {
+        fHeight /= 2.0f;
+      } else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) {
+        fHeight = 0;
+      }
+      m_pLoader->m_fStartLineOffset = fHeight;
+    }
+  }
+  FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset;
+  int32_t iLineIndex = 0;
+  if (iBlockCount > 1) {
+    if (iBlockCount >= (iBlockIndex + 1) * 2) {
+      iLineIndex = m_Blocks.ElementAt(iBlockIndex * 2);
+    } else {
+      iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) +
+                   m_Blocks.ElementAt(iBlockCount - 2);
+    }
+    if (m_pLoader->m_BlocksHeight.GetSize() > 0) {
+      for (int32_t i = 0; i < iBlockIndex; i++) {
+        fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
+      }
+    }
+  }
+  int32_t iCount = m_pLoader->m_lineHeights.GetSize();
+  int32_t i = 0;
+  for (i = iLineIndex; i < iCount; i++) {
+    FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
+    if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) {
+      fCalcHeight = 0;
+      return TRUE;
+    }
+    if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) {
+      if (iBlockCount >= (iBlockIndex + 1) * 2) {
+        m_Blocks.SetAt(iBlockIndex * 2, iLineIndex);
+        m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex);
+      } else {
+        m_Blocks.Add(iLineIndex);
+        m_Blocks.Add(i - iLineIndex);
+      }
+      if (i == iLineIndex) {
+        if (fCalcHeight <= fLinePos) {
+          if (m_pLoader->m_BlocksHeight.GetSize() > iBlockIndex * 2 &&
+              (m_pLoader->m_BlocksHeight.GetAt(iBlockIndex * 2) ==
+               iBlockIndex)) {
+            m_pLoader->m_BlocksHeight.SetAt(iBlockIndex * 2 + 1, fCalcHeight);
+          } else {
+            m_pLoader->m_BlocksHeight.Add((FX_FLOAT)iBlockIndex);
+            m_pLoader->m_BlocksHeight.Add(fCalcHeight);
+          }
+        }
+        return TRUE;
+      }
+      fCalcHeight = fLinePos;
+      return TRUE;
+    }
+    fLinePos += fLineHeight;
+  }
+  return FALSE;
+}
+int32_t CXFA_TextLayout::CountBlocks() const {
+  int32_t iCount = m_Blocks.GetSize() / 2;
+  return iCount > 0 ? iCount : 1;
+}
+FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize,
+                                  const CFX_SizeF& maxSize,
+                                  CFX_SizeF& defaultSize) {
+  defaultSize.x = maxSize.x;
+  if (defaultSize.x < 1) {
+    defaultSize.x = 0xFFFF;
+  }
+  if (m_pBreak)
+    m_pBreak->Release();
+
+  m_pBreak = CreateBreak(FALSE);
+  FX_FLOAT fLinePos = 0;
+  m_iLines = 0;
+  m_fMaxWidth = 0;
+  Loader(defaultSize, fLinePos, FALSE);
+  if (fLinePos < 0.1f) {
+    fLinePos = m_textParser.GetFontSize(m_pTextProvider, NULL);
+  }
+  if (m_pTabstopContext) {
+    delete m_pTabstopContext;
+    m_pTabstopContext = NULL;
+  }
+  defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos);
+  return TRUE;
+}
+FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) {
+  if (size.x < 1) {
+    return FALSE;
+  }
+  Unload();
+  m_pBreak = CreateBreak(TRUE);
+  if (m_pLoader) {
+    m_pLoader->m_iTotalLines = -1;
+    m_pLoader->m_iChar = 0;
+  }
+  m_iLines = 0;
+  FX_FLOAT fLinePos = 0;
+  Loader(size, fLinePos, TRUE);
+  UpdateAlign(size.y, fLinePos);
+  if (m_pTabstopContext) {
+    delete m_pTabstopContext;
+    m_pTabstopContext = NULL;
+  }
+  if (fHeight) {
+    *fHeight = fLinePos;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_TextLayout::Layout(int32_t iBlock) {
+  if (m_pLoader == NULL || iBlock < 0 || iBlock >= CountBlocks()) {
+    return FALSE;
+  }
+  if (m_pLoader->m_fWidth < 1) {
+    return FALSE;
+  }
+  m_pLoader->m_iTotalLines = -1;
+  m_iLines = 0;
+  FX_FLOAT fLinePos = 0;
+  CXFA_Node* pNode = NULL;
+  CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
+  int32_t iCount = m_Blocks.GetSize();
+  int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize();
+  iBlocksHeightCount /= 2;
+  if (iBlock < iBlocksHeightCount) {
+    return TRUE;
+  }
+  if (iBlock == iBlocksHeightCount) {
+    Unload();
+    m_pBreak = CreateBreak(TRUE);
+    fLinePos = m_pLoader->m_fStartLineOffset;
+    for (int32_t i = 0; i < iBlocksHeightCount; i++) {
+      fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
+    }
+    m_pLoader->m_iChar = 0;
+    if (iCount > 1) {
+      m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1);
+    }
+    Loader(szText, fLinePos, TRUE);
+    if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) {
+      UpdateAlign(szText.y, fLinePos);
+    }
+  } else if (m_pTextDataNode) {
+    iBlock *= 2;
+    if (iBlock < iCount - 2) {
+      m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1);
+    }
+    m_pBreak->Reset();
+    if (m_bRichText) {
+      IFDE_XMLNode* pContainerNode = GetXMLContainerNode();
+      if (!pContainerNode) {
+        return TRUE;
+      }
+      IFDE_XMLNode* pXMLNode = m_pLoader->m_pXMLNode;
+      if (pXMLNode == NULL) {
+        return TRUE;
+      }
+      IFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode;
+      for (; pXMLNode;
+           pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+        FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos,
+                                     m_pLoader->m_pParentStyle, TRUE);
+        if (!bFlag) {
+          break;
+        }
+      }
+      while (pXMLNode == NULL) {
+        pXMLNode = pSaveXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
+        if (pXMLNode == pContainerNode) {
+          break;
+        }
+        FX_BOOL bFlag =
+            LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
+                         TRUE, NULL, FALSE);
+        if (!bFlag) {
+          break;
+        }
+        pSaveXMLNode = pXMLNode;
+        pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
+        if (!pXMLNode) {
+          continue;
+        }
+        for (; pXMLNode;
+             pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+          FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos,
+                                       m_pLoader->m_pParentStyle, TRUE);
+          if (!bFlag) {
+            break;
+          }
+        }
+      }
+    } else {
+      pNode = m_pLoader->m_pNode;
+      if (pNode == NULL) {
+        return TRUE;
+      }
+      LoadText(pNode, szText, fLinePos, TRUE);
+    }
+  }
+  if (iBlock == iCount) {
+    delete m_pTabstopContext;
+    m_pTabstopContext = nullptr;
+    delete m_pLoader;
+    m_pLoader = nullptr;
+  }
+  return TRUE;
+}
+void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) {
+  if (!m_pLoader) {
+    return;
+  }
+  int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize();
+  if (iCountHeight == 0) {
+    return;
+  }
+  FX_BOOL bEndItem = TRUE;
+  int32_t iBlockCount = m_Blocks.GetSize();
+  FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset;
+  int32_t iLineIndex = 0;
+  if (iBlockIndex > 0) {
+    int32_t iBlockHeightCount = m_pLoader->m_BlocksHeight.GetSize();
+    iBlockHeightCount /= 2;
+    if (iBlockHeightCount >= iBlockIndex) {
+      for (int32_t i = 0; i < iBlockIndex; i++) {
+        fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
+      }
+    } else {
+      fLinePos = 0;
+    }
+    iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) +
+                 m_Blocks.ElementAt(iBlockCount - 2);
+  }
+  int32_t i = 0;
+  for (i = iLineIndex; i < iCountHeight; i++) {
+    FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
+    if (fLinePos + fLineHeight - rtText.height > 0.001) {
+      m_Blocks.Add(iLineIndex);
+      m_Blocks.Add(i - iLineIndex);
+      bEndItem = FALSE;
+      break;
+    }
+    fLinePos += fLineHeight;
+  }
+  if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) {
+    m_Blocks.Add(iLineIndex);
+    m_Blocks.Add(i - iLineIndex);
+  }
+}
+FX_BOOL CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
+                                    const CFX_Matrix& tmDoc2Device,
+                                    const CFX_RectF& rtClip,
+                                    int32_t iBlock) {
+  IFDE_RenderDevice* pDevice = IFDE_RenderDevice::Create(pFxDevice);
+  if (pDevice == NULL) {
+    return FALSE;
+  }
+  FDE_HDEVICESTATE state = pDevice->SaveState();
+  pDevice->SetClipRect(rtClip);
+  IFDE_SolidBrush* pSolidBrush =
+      (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
+  IFDE_Pen* pPen = IFDE_Pen::Create();
+  FXSYS_assert(pDevice);
+  FXSYS_assert(pSolidBrush);
+  FXSYS_assert(pPen);
+  if (m_pieceLines.GetSize() == 0) {
+    int32_t iBlockCount = CountBlocks();
+    for (int32_t i = 0; i < iBlockCount; i++) {
+      Layout(i);
+    }
+  }
+  FXTEXT_CHARPOS* pCharPos = NULL;
+  int32_t iCharCount = 0;
+  int32_t iLineStart = 0;
+  int32_t iPieceLines = m_pieceLines.GetSize();
+  int32_t iCount = m_Blocks.GetSize();
+  if (iCount > 0) {
+    iBlock *= 2;
+    if (iBlock < iCount) {
+      iLineStart = m_Blocks.ElementAt(iBlock);
+      iPieceLines = m_Blocks.ElementAt(iBlock + 1);
+    } else {
+      iPieceLines = 0;
+    }
+  }
+  for (int32_t i = 0; i < iPieceLines; i++) {
+    if (i + iLineStart >= m_pieceLines.GetSize()) {
+      break;
+    }
+    CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i + iLineStart);
+    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
+    int32_t j = 0;
+    for (j = 0; j < iPieces; j++) {
+      const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
+      int32_t iChars = pPiece->iChars;
+      if (iCharCount < iChars) {
+        FX_Free(pCharPos);
+        pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars);
+        iCharCount = iChars;
+      }
+      FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS));
+      RenderString(pDevice, pSolidBrush, pPieceLine, j, pCharPos, tmDoc2Device);
+    }
+    for (j = 0; j < iPieces; j++) {
+      RenderPath(pDevice, pPen, pPieceLine, j, pCharPos, tmDoc2Device);
+    }
+  }
+  pDevice->RestoreState(state);
+  FX_Free(pCharPos);
+  pSolidBrush->Release();
+  pPen->Release();
+  pDevice->Release();
+  return iPieceLines;
+}
+void CXFA_TextLayout::UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom) {
+  fHeight -= fBottom;
+  if (fHeight < 0.1f) {
+    return;
+  }
+  switch (m_textParser.GetVAlgin(m_pTextProvider)) {
+    case XFA_ATTRIBUTEENUM_Middle:
+      fHeight /= 2.0f;
+      break;
+    case XFA_ATTRIBUTEENUM_Bottom:
+      break;
+    default:
+      return;
+  }
+  int32_t iCount = m_pieceLines.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i);
+    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
+    for (int32_t j = 0; j < iPieces; j++) {
+      XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
+      CFX_RectF& rect = pPiece->rtPiece;
+      rect.top += fHeight;
+    }
+  }
+}
+FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF& szText,
+                                FX_FLOAT& fLinePos,
+                                FX_BOOL bSavePieces) {
+  if (m_pAllocator == NULL) {
+    m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 256, 0);
+  }
+  GetTextDataNode();
+  if (m_pTextDataNode == NULL) {
+    return TRUE;
+  }
+  if (m_bRichText) {
+    IFDE_XMLNode* pXMLContainer = GetXMLContainerNode();
+    if (pXMLContainer) {
+      if (!m_textParser.IsParsed()) {
+        m_textParser.DoParse(pXMLContainer, m_pTextProvider);
+      }
+      IFDE_CSSComputedStyle* pRootStyle =
+          m_textParser.CreateRootStyle(m_pTextProvider);
+      LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces);
+      pRootStyle->Release();
+    }
+  } else {
+    LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces);
+  }
+  return TRUE;
+}
+void CXFA_TextLayout::LoadText(CXFA_Node* pNode,
+                               const CFX_SizeF& szText,
+                               FX_FLOAT& fLinePos,
+                               FX_BOOL bSavePieces) {
+  InitBreak(szText.x);
+  CXFA_Para para = m_pTextProvider->GetParaNode();
+  FX_FLOAT fSpaceAbove = 0;
+  if (para) {
+    fSpaceAbove = para.GetSpaceAbove();
+    if (fSpaceAbove < 0.1f) {
+      fSpaceAbove = 0;
+    }
+    int32_t verAlign = para.GetVerticalAlign();
+    switch (verAlign) {
+      case XFA_ATTRIBUTEENUM_Top:
+      case XFA_ATTRIBUTEENUM_Middle:
+      case XFA_ATTRIBUTEENUM_Bottom: {
+        fLinePos += fSpaceAbove;
+        break;
+      }
+    }
+  }
+  CFX_WideString wsText = pNode->GetContent();
+  wsText.TrimRight(L" ");
+  FX_BOOL bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces);
+  if (bRet && m_pLoader) {
+    m_pLoader->m_pNode = pNode;
+  } else {
+    EndBreak(FX_RTFBREAK_ParagraphBreak, fLinePos, bSavePieces);
+  }
+}
+FX_BOOL CXFA_TextLayout::LoadRichText(IFDE_XMLNode* pXMLNode,
+                                      const CFX_SizeF& szText,
+                                      FX_FLOAT& fLinePos,
+                                      IFDE_CSSComputedStyle* pParentStyle,
+                                      FX_BOOL bSavePieces,
+                                      CXFA_LinkUserData* pLinkData,
+                                      FX_BOOL bEndBreak,
+                                      FX_BOOL bIsOl,
+                                      int32_t iLiCount) {
+  if (pXMLNode == NULL) {
+    return FALSE;
+  }
+  CXFA_TextParseContext* pContext =
+      m_textParser.GetParseContextFromMap(pXMLNode);
+  FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_None;
+  FX_BOOL bContentNode = FALSE;
+  FX_FLOAT fSpaceBelow = 0;
+  IFDE_CSSComputedStyle* pStyle = NULL;
+  CFX_WideString wsName;
+  if (bEndBreak) {
+    FX_BOOL bCurOl = FALSE;
+    FX_BOOL bCurLi = FALSE;
+    IFDE_XMLElement* pElement = NULL;
+    if (pContext) {
+      if (m_bBlockContinue ||
+          (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) {
+        m_bBlockContinue = TRUE;
+      }
+      if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
+        bContentNode = TRUE;
+      } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+        pElement = (IFDE_XMLElement*)pXMLNode;
+        pElement->GetLocalTagName(wsName);
+      }
+      if (wsName == FX_WSTRC(L"ol")) {
+        bIsOl = TRUE;
+        bCurOl = TRUE;
+      }
+      if (m_bBlockContinue || bContentNode == FALSE) {
+        eDisplay = pContext->GetDisplay();
+        if (eDisplay != FDE_CSSDISPLAY_Block &&
+            eDisplay != FDE_CSSDISPLAY_Inline &&
+            eDisplay != FDE_CSSDISPLAY_ListItem) {
+          return TRUE;
+        }
+        pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle);
+        InitBreak(bContentNode ? pParentStyle : pStyle, eDisplay, szText.x,
+                  pXMLNode, pParentStyle);
+        if ((eDisplay == FDE_CSSDISPLAY_Block ||
+             eDisplay == FDE_CSSDISPLAY_ListItem) &&
+            pStyle &&
+            (wsName.IsEmpty() ||
+             (wsName != FX_WSTRC(L"body") && wsName != FX_WSTRC(L"html") &&
+              wsName != FX_WSTRC(L"ol") && wsName != FX_WSTRC(L"ul")))) {
+          const FDE_CSSRECT* pRect =
+              pStyle->GetBoundaryStyles()->GetMarginWidth();
+          if (pRect) {
+            fLinePos += pRect->top.GetValue();
+            fSpaceBelow = pRect->bottom.GetValue();
+          }
+        }
+        if (wsName == FX_WSTRC(L"a")) {
+          CFX_WideString wsLinkContent;
+          FXSYS_assert(pElement);
+          pElement->GetString(FX_WSTRC(L"href").GetPtr(), wsLinkContent);
+          if (!wsLinkContent.IsEmpty()) {
+            pLinkData = FXTARGET_NewWith(m_pAllocator) CXFA_LinkUserData(
+                m_pAllocator,
+                wsLinkContent.GetBuffer(wsLinkContent.GetLength()));
+            wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength());
+          }
+        }
+        int32_t iTabCount =
+            m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle);
+        FX_BOOL bSpaceRun =
+            m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle);
+        CFX_WideString wsText;
+        if (bContentNode && iTabCount == 0) {
+          ((IFDE_XMLText*)pXMLNode)->GetText(wsText);
+        } else if (wsName == FX_WSTRC(L"br")) {
+          wsText = L'\n';
+        } else if (wsName == FX_WSTRC(L"li")) {
+          bCurLi = TRUE;
+          if (bIsOl) {
+            wsText.Format(L"%d.  ", iLiCount);
+          } else {
+            wsText = 0x00B7 + FX_WSTRC(L"  ");
+          }
+        } else if (!bContentNode) {
+          if (iTabCount > 0) {
+            while (iTabCount-- > 0)
+              wsText += L'\t';
+          } else {
+            m_textParser.GetEmbbedObj(m_pTextProvider, pXMLNode, wsText);
+          }
+        }
+        int32_t iLength = wsText.GetLength();
+        if (iLength > 0 && bContentNode && !bSpaceRun) {
+          ProcessText(wsText);
+        }
+        if (m_pLoader) {
+          if (wsText.GetLength() > 0 &&
+              (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) {
+            wsText.TrimLeft(0x20);
+          }
+          if (FDE_CSSDISPLAY_Block == eDisplay) {
+            m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
+          } else if (FDE_CSSDISPLAY_Inline == eDisplay &&
+                     (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) {
+            m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
+          } else if (wsText.GetLength() > 0 &&
+                     (0x20 == wsText.GetAt(wsText.GetLength() - 1))) {
+            m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
+          } else if (wsText.GetLength() != 0) {
+            m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
+          }
+        }
+        if (wsText.GetLength() > 0) {
+          if (m_pLoader == NULL || m_pLoader->m_iChar == 0) {
+            if (pLinkData) {
+              pLinkData->AddRef();
+            }
+            CXFA_TextUserData* pUserData = FXTARGET_NewWith(m_pAllocator)
+                CXFA_TextUserData(m_pAllocator,
+                                  bContentNode ? pParentStyle : pStyle,
+                                  pLinkData);
+            m_pBreak->SetUserData(pUserData);
+          }
+          if (AppendChar(wsText, fLinePos, 0, bSavePieces)) {
+            if (m_pLoader) {
+              m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
+            }
+            if (IsEnd(bSavePieces)) {
+              if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
+                m_pLoader->m_pXMLNode = pXMLNode;
+                m_pLoader->m_pParentStyle = pParentStyle;
+              }
+              if (pStyle)
+                pStyle->Release();
+              return FALSE;
+            }
+            return TRUE;
+          }
+        }
+      }
+    }
+    FX_BOOL ret = TRUE;
+    for (IFDE_XMLNode* pChildNode =
+             pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+         pChildNode;
+         pChildNode = pChildNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+      if (bCurOl) {
+        iLiCount++;
+      }
+      ret = LoadRichText(pChildNode, szText, fLinePos,
+                         pContext ? pStyle : pParentStyle, bSavePieces,
+                         pLinkData, TRUE, bIsOl, iLiCount);
+      if (ret == FALSE) {
+        return FALSE;
+      }
+    }
+    if (m_pLoader) {
+      if (FDE_CSSDISPLAY_Block == eDisplay) {
+        m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
+      }
+    }
+    if (bCurLi) {
+      EndBreak(FX_RTFBREAK_LineBreak, fLinePos, bSavePieces);
+    }
+  } else {
+    if (pContext) {
+      eDisplay = pContext->GetDisplay();
+    }
+  }
+  if (m_bBlockContinue) {
+    if (pContext && !bContentNode) {
+      FX_DWORD dwStatus = (eDisplay == FDE_CSSDISPLAY_Block)
+                              ? FX_RTFBREAK_ParagraphBreak
+                              : FX_RTFBREAK_PieceBreak;
+      EndBreak(dwStatus, fLinePos, bSavePieces);
+      if (eDisplay == FDE_CSSDISPLAY_Block) {
+        fLinePos += fSpaceBelow;
+        if (m_pTabstopContext) {
+          m_pTabstopContext->RemoveAll();
+        }
+      }
+      if (wsName == FX_WSTRC(L"a")) {
+        if (pLinkData) {
+          pLinkData->Release();
+          pLinkData = nullptr;
+        }
+      }
+      if (IsEnd(bSavePieces)) {
+        if (pStyle) {
+          pStyle->Release();
+        }
+        if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
+          m_pLoader->m_pXMLNode =
+              pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
+          m_pLoader->m_pParentStyle = pParentStyle;
+        }
+        return FALSE;
+      }
+    }
+  }
+  if (pStyle)
+    pStyle->Release();
+  return TRUE;
+}
+FX_BOOL CXFA_TextLayout::AppendChar(const CFX_WideString& wsText,
+                                    FX_FLOAT& fLinePos,
+                                    FX_FLOAT fSpaceAbove,
+                                    FX_BOOL bSavePieces) {
+  FX_DWORD dwStatus = 0;
+  int32_t iChar = 0;
+  if (m_pLoader) {
+    iChar = m_pLoader->m_iChar;
+  }
+  int32_t iLength = wsText.GetLength();
+  for (int32_t i = iChar; i < iLength; i++) {
+    FX_WCHAR wch = wsText.GetAt(i);
+    if (wch == 0xA0) {
+      wch = 0x20;
+    }
+    if ((dwStatus = m_pBreak->AppendChar(wch)) > FX_RTFBREAK_PieceBreak) {
+      AppendTextLine(dwStatus, fLinePos, bSavePieces);
+      if (IsEnd(bSavePieces)) {
+        if (m_pLoader)
+          m_pLoader->m_iChar = i;
+        return TRUE;
+      }
+      if (dwStatus == FX_RTFBREAK_ParagraphBreak && m_bRichText) {
+        fLinePos += fSpaceAbove;
+      }
+    }
+  }
+  if (m_pLoader) {
+    m_pLoader->m_iChar = 0;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_TextLayout::IsEnd(FX_BOOL bSavePieces) {
+  if (!bSavePieces) {
+    return FALSE;
+  }
+  if (m_pLoader && m_pLoader->m_iTotalLines > 0) {
+    return m_iLines >= m_pLoader->m_iTotalLines;
+  }
+  return FALSE;
+}
+void CXFA_TextLayout::ProcessText(CFX_WideString& wsText) {
+  int32_t iLen = wsText.GetLength();
+  if (iLen == 0) {
+    return;
+  }
+  FX_WCHAR* psz = wsText.GetBuffer(iLen);
+  int32_t iTrimLeft = 0;
+  FX_WCHAR wch = 0, wPrev = 0;
+  for (int32_t i = 0; i < iLen; i++) {
+    wch = psz[i];
+    if (wch < 0x20) {
+      wch = 0x20;
+    }
+    if (wch == 0x20 && wPrev == 0x20) {
+      continue;
+    }
+    wPrev = wch;
+    psz[iTrimLeft++] = wch;
+  }
+  wsText.ReleaseBuffer(iLen);
+  wsText = wsText.Left(iTrimLeft);
+}
+void CXFA_TextLayout::EndBreak(FX_DWORD dwStatus,
+                               FX_FLOAT& fLinePos,
+                               FX_BOOL bSavePieces) {
+  dwStatus = m_pBreak->EndBreak(dwStatus);
+  if (dwStatus > FX_RTFBREAK_PieceBreak) {
+    AppendTextLine(dwStatus, fLinePos, bSavePieces, TRUE);
+  }
+}
+void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle,
+                                 CXFA_PieceLine* pPieceLine) {
+  if (m_pTabstopContext == NULL || m_pTabstopContext->m_iTabCount == 0) {
+    return;
+  }
+  if (pStyle == NULL || pPieceLine == NULL) {
+    return;
+  }
+  int32_t iPieces = pPieceLine->m_textPieces.GetSize();
+  if (iPieces == 0) {
+    return;
+  }
+  XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1);
+  int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex;
+  int32_t iCount = m_textParser.CountTabs(pStyle);
+  if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) {
+    return;
+  }
+  if (iCount > 0) {
+    iTabstopsIndex++;
+    m_pTabstopContext->m_bTabstops = TRUE;
+    FX_FLOAT fRight = 0;
+    if (iPieces > 1) {
+      XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2);
+      fRight = p->rtPiece.right();
+    }
+    m_pTabstopContext->m_fTabWidth =
+        pPiece->rtPiece.width + pPiece->rtPiece.left - fRight;
+  } else if (iTabstopsIndex > -1) {
+    FX_FLOAT fLeft = 0;
+    if (m_pTabstopContext->m_bTabstops) {
+      XFA_TABSTOPS* pTabstops =
+          m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex);
+      FX_DWORD dwAlgin = pTabstops->dwAlign;
+      if (dwAlgin == FX_HashCode_String_GetW(L"center", 6)) {
+        fLeft = pPiece->rtPiece.width / 2.0f;
+      } else if (dwAlgin == FX_HashCode_String_GetW(L"right", 5) ||
+                 dwAlgin == FX_HashCode_String_GetW(L"before", 6)) {
+        fLeft = pPiece->rtPiece.width;
+      } else if (dwAlgin == FX_HashCode_String_GetW(L"decimal", 7)) {
+        int32_t iChars = pPiece->iChars;
+        for (int32_t i = 0; i < iChars; i++) {
+          if (pPiece->pszText[i] == L'.') {
+            break;
+          }
+          fLeft += pPiece->pWidths[i] / 20000.0f;
+        }
+      }
+      m_pTabstopContext->m_fLeft =
+          std::min(fLeft, m_pTabstopContext->m_fTabWidth);
+      m_pTabstopContext->m_bTabstops = FALSE;
+      m_pTabstopContext->m_fTabWidth = 0;
+    }
+    pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft;
+  }
+}
+void CXFA_TextLayout::AppendTextLine(FX_DWORD dwStatus,
+                                     FX_FLOAT& fLinePos,
+                                     FX_BOOL bSavePieces,
+                                     FX_BOOL bEndBreak) {
+  int32_t iPieces = m_pBreak->CountBreakPieces();
+  if (iPieces < 1) {
+    return;
+  }
+  IFDE_CSSComputedStyle* pStyle = NULL;
+  if (bSavePieces) {
+    CXFA_PieceLine* pPieceLine = FXTARGET_NewWith(m_pAllocator) CXFA_PieceLine;
+    m_pieceLines.Add(pPieceLine);
+    if (m_pTabstopContext) {
+      m_pTabstopContext->Reset();
+    }
+    FX_FLOAT fLineStep = 0, fBaseLine = 0;
+    int32_t i = 0;
+    for (i = 0; i < iPieces; i++) {
+      const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i);
+      CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData;
+      if (pUserData)
+        pStyle = pUserData->m_pStyle;
+      FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f;
+      XFA_TextPiece* pTP = FXTARGET_NewWith(m_pAllocator) XFA_TextPiece();
+      pTP->pszText =
+          (FX_WCHAR*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_WCHAR));
+      pTP->pWidths =
+          (int32_t*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(int32_t));
+      pTP->iChars = pPiece->m_iChars;
+      pPiece->GetString(pTP->pszText);
+      pPiece->GetWidths(pTP->pWidths);
+      pTP->iBidiLevel = pPiece->m_iBidiLevel;
+      pTP->iHorScale = pPiece->m_iHorizontalScale;
+      pTP->iVerScale = pPiece->m_iVerticalScale;
+      m_textParser.GetUnderline(m_pTextProvider, pStyle, pTP->iUnderline,
+                                pTP->iPeriod);
+      m_textParser.GetLinethrough(m_pTextProvider, pStyle, pTP->iLineThrough);
+      pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle);
+      pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle);
+      pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle);
+      pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f;
+      pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f;
+      pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f;
+      FX_FLOAT fBaseLineTemp =
+          m_textParser.GetBaseline(m_pTextProvider, pStyle);
+      pTP->rtPiece.top = fBaseLineTemp;
+      pPieceLine->m_textPieces.Add(pTP);
+      FX_FLOAT fLineHeight = m_textParser.GetLineHeight(
+          m_pTextProvider, pStyle, m_iLines == 0, fVerScale);
+      if (fBaseLineTemp > 0) {
+        FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height;
+        if (fLineHeight < fLineHeightTmp) {
+          fLineHeight = fLineHeightTmp;
+        } else {
+          fBaseLineTemp = 0;
+        }
+      } else if (fBaseLine < -fBaseLineTemp) {
+        fBaseLine = -fBaseLineTemp;
+      }
+      fLineStep = std::max(fLineStep, fLineHeight);
+      if (pUserData && pUserData->m_pLinkData) {
+        pUserData->m_pLinkData->AddRef();
+        pTP->pLinkData = pUserData->m_pLinkData;
+      } else {
+        pTP->pLinkData = NULL;
+      }
+      DoTabstops(pStyle, pPieceLine);
+    }
+    for (i = 0; i < iPieces; i++) {
+      XFA_TextPiece* pTP = pPieceLine->m_textPieces.GetAt(i);
+      FX_FLOAT& fTop = pTP->rtPiece.top;
+      FX_FLOAT fBaseLineTemp = fTop;
+      fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp;
+      fTop = std::max(0.0f, fTop);
+    }
+    fLinePos += fLineStep + fBaseLine;
+  } else {
+    FX_FLOAT fLineStep = 0;
+    FX_FLOAT fLineWidth = 0;
+    for (int32_t i = 0; i < iPieces; i++) {
+      const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i);
+      CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData;
+      if (pUserData)
+        pStyle = pUserData->m_pStyle;
+      FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f;
+      FX_FLOAT fBaseLine = m_textParser.GetBaseline(m_pTextProvider, pStyle);
+      FX_FLOAT fLineHeight = m_textParser.GetLineHeight(
+          m_pTextProvider, pStyle, m_iLines == 0, fVerScale);
+      if (fBaseLine > 0) {
+        FX_FLOAT fLineHeightTmp =
+            fBaseLine + (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f;
+        if (fLineHeight < fLineHeightTmp) {
+          fLineHeight = fLineHeightTmp;
+        }
+      }
+      fLineStep = std::max(fLineStep, fLineHeight);
+      fLineWidth += pPiece->m_iWidth / 20000.0f;
+    }
+    fLinePos += fLineStep;
+    m_fMaxWidth = std::max(m_fMaxWidth, fLineWidth);
+    if (m_pLoader && m_pLoader->m_bSaveLineHeight) {
+      FX_FLOAT fHeight = fLinePos - m_pLoader->m_fLastPos;
+      m_pLoader->m_fLastPos = fLinePos;
+      m_pLoader->m_lineHeights.Add(fHeight);
+    }
+  }
+  if (pStyle) {
+    pStyle->AddRef();
+  }
+  m_pBreak->ClearBreakPieces();
+  if (dwStatus == FX_RTFBREAK_ParagraphBreak) {
+    m_pBreak->Reset();
+    if (!pStyle && bEndBreak) {
+      CXFA_Para para = m_pTextProvider->GetParaNode();
+      if (para) {
+        FX_FLOAT fStartPos = para.GetMarginLeft();
+        FX_FLOAT fIndent = para.GetTextIndent();
+        if (fIndent > 0) {
+          fStartPos += fIndent;
+        }
+        FX_FLOAT fSpaceBelow = para.GetSpaceBelow();
+        if (fSpaceBelow < 0.1f) {
+          fSpaceBelow = 0;
+        }
+        m_pBreak->SetLineStartPos(fStartPos);
+        fLinePos += fSpaceBelow;
+      }
+    }
+  }
+  if (pStyle) {
+    FX_FLOAT fStart = 0;
+    const FDE_CSSRECT* pRect = pStyle->GetBoundaryStyles()->GetMarginWidth();
+    if (pRect) {
+      fStart = pRect->left.GetValue();
+    }
+    FX_FLOAT fTextIndent =
+        pStyle->GetParagraphStyles()->GetTextIndent().GetValue();
+    if (fTextIndent < 0) {
+      fStart -= fTextIndent;
+    }
+    m_pBreak->SetLineStartPos(fStart);
+    pStyle->Release();
+  }
+  m_iLines++;
+}
+void CXFA_TextLayout::RenderString(IFDE_RenderDevice* pDevice,
+                                   IFDE_SolidBrush* pBrush,
+                                   CXFA_PieceLine* pPieceLine,
+                                   int32_t iPiece,
+                                   FXTEXT_CHARPOS* pCharPos,
+                                   const CFX_Matrix& tmDoc2Device) {
+  const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
+  int32_t iCount = GetDisplayPos(pPiece, pCharPos);
+  if (iCount > 0) {
+    pBrush->SetColor(pPiece->dwColor);
+    pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount,
+                        pPiece->fFontSize, &tmDoc2Device);
+  }
+  pPieceLine->m_charCounts.Add(iCount);
+}
+void CXFA_TextLayout::RenderPath(IFDE_RenderDevice* pDevice,
+                                 IFDE_Pen* pPen,
+                                 CXFA_PieceLine* pPieceLine,
+                                 int32_t iPiece,
+                                 FXTEXT_CHARPOS* pCharPos,
+                                 const CFX_Matrix& tmDoc2Device) {
+  XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
+  FX_BOOL bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2;
+  FX_BOOL bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2;
+  if (bNoUnderline && bNoLineThrough) {
+    return;
+  }
+  pPen->SetColor(pPiece->dwColor);
+  IFDE_Path* pPath = IFDE_Path::Create();
+  int32_t iChars = GetDisplayPos(pPiece, pCharPos);
+  if (iChars > 0) {
+    CFX_PointF pt1, pt2;
+    FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f;
+    int32_t i = 0;
+    if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) {
+      for (int32_t i = 0; i < pPiece->iUnderline; i++) {
+        for (int32_t j = 0; j < iChars; j++) {
+          pt1.x = pCharPos[j].m_OriginX;
+          pt2.x =
+              pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
+          pt1.y = pt2.y = fEndY;
+          pPath->AddLine(pt1, pt2);
+        }
+        fEndY += 2.0f;
+      }
+    } else {
+      pt1.x = pCharPos[0].m_OriginX;
+      pt2.x =
+          pCharPos[iChars - 1].m_OriginX +
+          pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
+      for (int32_t i = 0; i < pPiece->iUnderline; i++) {
+        pt1.y = pt2.y = fEndY;
+        pPath->AddLine(pt1, pt2);
+        fEndY += 2.0f;
+      }
+    }
+    fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f;
+    pt1.x = pCharPos[0].m_OriginX;
+    pt2.x = pCharPos[iChars - 1].m_OriginX +
+            pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
+    for (i = 0; i < pPiece->iLineThrough; i++) {
+      pt1.y = pt2.y = fEndY;
+      pPath->AddLine(pt1, pt2);
+      fEndY += 2.0f;
+    }
+  } else {
+    if (bNoLineThrough &&
+        (bNoUnderline || pPiece->iPeriod != XFA_ATTRIBUTEENUM_All)) {
+      goto XFA_RenderPathRet;
+    }
+    int32_t iCharsTmp = 0;
+    int32_t iPiecePrev = iPiece, iPieceNext = iPiece;
+    while (iPiecePrev > 0) {
+      iPiecePrev--;
+      iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev);
+      if (iCharsTmp > 0) {
+        break;
+      }
+    }
+    if (iCharsTmp == 0) {
+      goto XFA_RenderPathRet;
+    }
+    iCharsTmp = 0;
+    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
+    while (iPieceNext < iPieces - 1) {
+      iPieceNext++;
+      iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext);
+      if (iCharsTmp > 0) {
+        break;
+      }
+    }
+    if (iCharsTmp == 0) {
+      goto XFA_RenderPathRet;
+    }
+    FX_FLOAT fOrgX = 0.0f, fEndX = 0.0f;
+    pPiece = pPieceLine->m_textPieces.GetAt(iPiecePrev);
+    iChars = GetDisplayPos(pPiece, pCharPos);
+    if (iChars < 1) {
+      goto XFA_RenderPathRet;
+    }
+    fOrgX = pCharPos[iChars - 1].m_OriginX +
+            pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
+    pPiece = pPieceLine->m_textPieces.GetAt(iPieceNext);
+    iChars = GetDisplayPos(pPiece, pCharPos);
+    if (iChars < 1) {
+      goto XFA_RenderPathRet;
+    }
+    fEndX = pCharPos[0].m_OriginX;
+    CFX_PointF pt1, pt2;
+    pt1.x = fOrgX, pt2.x = fEndX;
+    FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f;
+    int32_t i = 0;
+    for (i = 0; i < pPiece->iUnderline; i++) {
+      pt1.y = pt2.y = fEndY;
+      pPath->AddLine(pt1, pt2);
+      fEndY += 2.0f;
+    }
+    fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f;
+    for (i = 0; i < pPiece->iLineThrough; i++) {
+      pt1.y = pt2.y = fEndY;
+      pPath->AddLine(pt1, pt2);
+      fEndY += 2.0f;
+    }
+  }
+  pDevice->DrawPath(pPen, 1, pPath, &tmDoc2Device);
+XFA_RenderPathRet:
+  pPath->Release();
+}
+int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece,
+                                       FXTEXT_CHARPOS* pCharPos,
+                                       FX_BOOL bCharCode) {
+  if (pPiece == NULL) {
+    return 0;
+  }
+  FX_RTFTEXTOBJ tr;
+  if (!ToRun(pPiece, tr)) {
+    return 0;
+  }
+  return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode);
+}
+FX_BOOL CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) {
+  int32_t iLength = pPiece->iChars;
+  if (iLength < 1) {
+    return FALSE;
+  }
+  tr.pStr = pPiece->pszText;
+  tr.pFont = pPiece->pFont;
+  tr.pRect = &pPiece->rtPiece;
+  tr.pWidths = pPiece->pWidths;
+  tr.iLength = iLength;
+  tr.fFontSize = pPiece->fFontSize;
+  tr.iBidiLevel = pPiece->iBidiLevel;
+  tr.iCharRotation = 0;
+  tr.wLineBreakChar = L'\n';
+  tr.iVerticalScale = pPiece->iVerScale;
+  tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab;
+  tr.iHorizontalScale = pPiece->iHorScale;
+  return TRUE;
+}
diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h
new file mode 100644
index 0000000..9cc1e29
--- /dev/null
+++ b/xfa/fxfa/app/xfa_textlayout.h
@@ -0,0 +1,425 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_APP_XFA_TEXTLAYOUT_H_
+#define XFA_FXFA_APP_XFA_TEXTLAYOUT_H_
+
+#include "xfa/fde/css/fde_css.h"
+#include "xfa/fde/fde_brush.h"
+#include "xfa/fde/fde_renderdevice.h"
+#include "xfa/fgas/layout/fgas_rtfbreak.h"
+#include "xfa/fxfa/app/xfa_ffdoc.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001
+
+class CXFA_Para;
+class CXFA_Font;
+class CXFA_TextTabstopsContext;
+
+class IXFA_TextProvider {
+ public:
+  virtual ~IXFA_TextProvider() {}
+  virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText) = 0;
+  virtual CXFA_Para GetParaNode() = 0;
+  virtual CXFA_Font GetFontNode() = 0;
+  virtual FX_BOOL IsCheckButtonAndAutoWidth() = 0;
+  virtual CXFA_FFDoc* GetDocNode() = 0;
+  virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
+                               FX_BOOL bRaw,
+                               const CFX_WideString& wsAttr,
+                               CFX_WideString& wsValue) = 0;
+};
+
+class CXFA_CSSTagProvider : public IFDE_CSSTagProvider {
+ public:
+  CXFA_CSSTagProvider() : m_bTagAviliable(FALSE), m_bContent(FALSE) {}
+  virtual ~CXFA_CSSTagProvider();
+  virtual CFX_WideStringC GetTagName() { return m_wsTagName; }
+  virtual FX_POSITION GetFirstAttribute() {
+    return m_Attributes.GetStartPosition();
+  }
+  virtual void GetNextAttribute(FX_POSITION& pos,
+                                CFX_WideStringC& wsAttr,
+                                CFX_WideStringC& wsValue);
+  void SetTagNameObj(const CFX_WideString& wsName) { m_wsTagName = wsName; }
+  void SetAttribute(const CFX_WideString& wsAttr,
+                    const CFX_WideString& wsValue);
+  FX_BOOL m_bTagAviliable;
+  FX_BOOL m_bContent;
+
+ protected:
+  CFX_WideString m_wsTagName;
+  CFX_MapPtrToPtr m_Attributes;
+};
+
+class CXFA_TextParseContext : public CFX_Target {
+ public:
+  CXFA_TextParseContext()
+      : m_pParentStyle(nullptr),
+        m_ppMatchedDecls(nullptr),
+        m_dwMatchedDecls(0),
+        m_eDisplay(FDE_CSSDISPLAY_None) {}
+  ~CXFA_TextParseContext() {
+    if (m_pParentStyle)
+      m_pParentStyle->Release();
+    FX_Free(m_ppMatchedDecls);
+  }
+  void SetDisplay(FDE_CSSDISPLAY eDisplay) { m_eDisplay = eDisplay; }
+  FDE_CSSDISPLAY GetDisplay() const { return m_eDisplay; }
+  void SetDecls(const IFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount);
+  const IFDE_CSSDeclaration** GetDecls() {
+    return (const IFDE_CSSDeclaration**)m_ppMatchedDecls;
+  }
+  FX_DWORD CountDecls() const { return m_dwMatchedDecls; }
+  IFDE_CSSComputedStyle* m_pParentStyle;
+
+ protected:
+  IFDE_CSSDeclaration** m_ppMatchedDecls;
+  FX_DWORD m_dwMatchedDecls;
+  FDE_CSSDISPLAY m_eDisplay;
+};
+
+class CXFA_TextParser {
+ public:
+  CXFA_TextParser() : m_pAllocator(NULL), m_pSelector(NULL), m_pUASheet(NULL) {}
+  virtual ~CXFA_TextParser();
+  void Reset();
+  void DoParse(IFDE_XMLNode* pXMLContainer, IXFA_TextProvider* pTextProvider);
+  IFDE_CSSComputedStyle* CreateRootStyle(IXFA_TextProvider* pTextProvider);
+  IFDE_CSSComputedStyle* ComputeStyle(IFDE_XMLNode* pXMLNode,
+                                      IFDE_CSSComputedStyle* pParentStyle);
+  FX_BOOL IsParsed() const { return m_pAllocator != NULL; }
+
+  int32_t GetVAlgin(IXFA_TextProvider* pTextProvider) const;
+  FX_FLOAT GetTabInterval(IFDE_CSSComputedStyle* pStyle) const;
+  int32_t CountTabs(IFDE_CSSComputedStyle* pStyle) const;
+  FX_BOOL IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const;
+  FX_BOOL GetTabstops(IFDE_CSSComputedStyle* pStyle,
+                      CXFA_TextTabstopsContext* pTabstopContext);
+  IFX_Font* GetFont(IXFA_TextProvider* pTextProvider,
+                    IFDE_CSSComputedStyle* pStyle) const;
+  FX_FLOAT GetFontSize(IXFA_TextProvider* pTextProvider,
+                       IFDE_CSSComputedStyle* pStyle) const;
+  int32_t GetHorScale(IXFA_TextProvider* pTextProvider,
+                      IFDE_CSSComputedStyle* pStyle,
+                      IFDE_XMLNode* pXMLNode) const;
+  int32_t GetVerScale(IXFA_TextProvider* pTextProvider,
+                      IFDE_CSSComputedStyle* pStyle) const;
+  void GetUnderline(IXFA_TextProvider* pTextProvider,
+                    IFDE_CSSComputedStyle* pStyle,
+                    int32_t& iUnderline,
+                    int32_t& iPeriod) const;
+  void GetLinethrough(IXFA_TextProvider* pTextProvider,
+                      IFDE_CSSComputedStyle* pStyle,
+                      int32_t& iLinethrough) const;
+  FX_ARGB GetColor(IXFA_TextProvider* pTextProvider,
+                   IFDE_CSSComputedStyle* pStyle) const;
+  FX_FLOAT GetBaseline(IXFA_TextProvider* pTextProvider,
+                       IFDE_CSSComputedStyle* pStyle) const;
+  FX_FLOAT GetLineHeight(IXFA_TextProvider* pTextProvider,
+                         IFDE_CSSComputedStyle* pStyle,
+                         FX_BOOL bFirst,
+                         FX_FLOAT fVerScale) const;
+  FX_BOOL GetEmbbedObj(IXFA_TextProvider* pTextProvider,
+                       IFDE_XMLNode* pXMLNode,
+                       CFX_WideString& wsValue);
+  CXFA_TextParseContext* GetParseContextFromMap(IFDE_XMLNode* pXMLNode);
+
+ private:
+  void InitCSSData(IXFA_TextProvider* pTextProvider);
+  void ParseRichText(IFDE_XMLNode* pXMLNode,
+                     IFDE_CSSComputedStyle* pParentStyle);
+  void ParseTagInfo(IFDE_XMLNode* pXMLNode, CXFA_CSSTagProvider& tagProvider);
+  IFDE_CSSStyleSheet* LoadDefaultSheetStyle();
+  IFDE_CSSComputedStyle* CreateStyle(IFDE_CSSComputedStyle* pParentStyle);
+  IFX_MEMAllocator* m_pAllocator;
+  IFDE_CSSStyleSelector* m_pSelector;
+  IFDE_CSSStyleSheet* m_pUASheet;
+  CFX_MapPtrTemplate<IFDE_XMLNode*, CXFA_TextParseContext*>
+      m_mapXMLNodeToParseContext;
+};
+
+class CXFA_LoaderContext {
+ public:
+  CXFA_LoaderContext()
+      : m_bSaveLineHeight(FALSE),
+        m_fWidth(0),
+        m_fHeight(0),
+        m_fLastPos(0),
+        m_fStartLineOffset(0),
+        m_iChar(0),
+        m_iTotalLines(-1),
+        m_pXMLNode(NULL),
+        m_pNode(NULL),
+        m_pParentStyle(NULL),
+        m_dwFlags(0) {}
+  FX_BOOL m_bSaveLineHeight;
+  FX_FLOAT m_fWidth;
+  FX_FLOAT m_fHeight;
+  FX_FLOAT m_fLastPos;
+  FX_FLOAT m_fStartLineOffset;
+  int32_t m_iChar;
+  int32_t m_iLines;
+  int32_t m_iTotalLines;
+  IFDE_XMLNode* m_pXMLNode;
+  CXFA_Node* m_pNode;
+  IFDE_CSSComputedStyle* m_pParentStyle;
+  CFX_ArrayTemplate<FX_FLOAT> m_lineHeights;
+  FX_DWORD m_dwFlags;
+  CFX_FloatArray m_BlocksHeight;
+};
+
+class CXFA_LinkUserData : public IFX_Unknown, public CFX_Target {
+ public:
+  CXFA_LinkUserData(IFX_MEMAllocator* pAllocator, FX_WCHAR* pszText)
+      : m_pAllocator(pAllocator), m_dwRefCount(1) {
+    m_pszURLContent = pszText;
+  }
+  ~CXFA_LinkUserData() {}
+  virtual FX_DWORD Release() {
+    FX_DWORD dwRefCount = --m_dwRefCount;
+    if (dwRefCount <= 0) {
+      FXTARGET_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
+    }
+    return dwRefCount;
+  }
+  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
+
+ public:
+  const FX_WCHAR* GetLinkURL() { return m_pszURLContent; }
+
+ protected:
+  IFX_MEMAllocator* m_pAllocator;
+  FX_DWORD m_dwRefCount;
+  CFX_WideString m_pszURLContent;
+};
+
+class CXFA_TextUserData : public IFX_Unknown, public CFX_Target {
+ public:
+  CXFA_TextUserData(IFX_MEMAllocator* pAllocator, IFDE_CSSComputedStyle* pStyle)
+      : m_pStyle(pStyle),
+        m_pLinkData(nullptr),
+        m_pAllocator(pAllocator),
+        m_dwRefCount(0) {
+    FXSYS_assert(m_pAllocator);
+    if (m_pStyle)
+      m_pStyle->AddRef();
+  }
+  CXFA_TextUserData(IFX_MEMAllocator* pAllocator,
+                    IFDE_CSSComputedStyle* pStyle,
+                    CXFA_LinkUserData* pLinkData)
+      : m_pStyle(pStyle),
+        m_pLinkData(pLinkData),
+        m_pAllocator(pAllocator),
+        m_dwRefCount(0) {
+    FXSYS_assert(m_pAllocator);
+    if (m_pStyle)
+      m_pStyle->AddRef();
+  }
+  ~CXFA_TextUserData() {
+    if (m_pStyle)
+      m_pStyle->Release();
+    if (m_pLinkData)
+      m_pLinkData->Release();
+  }
+  virtual FX_DWORD Release() {
+    FX_DWORD dwRefCount = --m_dwRefCount;
+    if (dwRefCount == 0) {
+      FXTARGET_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
+    }
+    return dwRefCount;
+  }
+  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
+
+  IFDE_CSSComputedStyle* m_pStyle;
+  CXFA_LinkUserData* m_pLinkData;
+
+ protected:
+  IFX_MEMAllocator* m_pAllocator;
+  FX_DWORD m_dwRefCount;
+};
+
+class XFA_TextPiece : public CFX_Target {
+ public:
+  XFA_TextPiece() : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {}
+  ~XFA_TextPiece() {
+    if (pLinkData)
+      pLinkData->Release();
+  }
+
+  FX_WCHAR* pszText;
+  int32_t iChars;
+  int32_t* pWidths;
+  int32_t iHorScale;
+  int32_t iVerScale;
+  int32_t iBidiLevel;
+  int32_t iUnderline;
+  int32_t iPeriod;
+  int32_t iLineThrough;
+  IFX_Font* pFont;
+  FX_ARGB dwColor;
+  FX_FLOAT fFontSize;
+  CFX_RectF rtPiece;
+  CXFA_LinkUserData* pLinkData;
+};
+typedef CFX_ArrayTemplate<XFA_TextPiece*> CXFA_PieceArray;
+
+class CXFA_PieceLine : public CFX_Target {
+ public:
+  CXFA_PieceLine() {}
+  CXFA_PieceArray m_textPieces;
+  CFX_Int32Array m_charCounts;
+};
+typedef CFX_ArrayTemplate<CXFA_PieceLine*> CXFA_PieceLineArray;
+
+struct XFA_TABSTOPS {
+  FX_DWORD dwAlign;
+  FX_FLOAT fTabstops;
+};
+
+class CXFA_TextTabstopsContext {
+ public:
+  CXFA_TextTabstopsContext()
+      : m_iTabCount(0),
+        m_iTabIndex(-1),
+        m_bTabstops(FALSE),
+        m_fTabWidth(0),
+        m_fLeft(0) {}
+  void Append(FX_DWORD dwAlign, FX_FLOAT fTabstops) {
+    int32_t i = 0;
+    for (i = 0; i < m_iTabCount; i++) {
+      XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
+      if (fTabstops < pTabstop->fTabstops) {
+        break;
+      }
+    }
+    m_tabstops.InsertSpaceAt(i, 1);
+    XFA_TABSTOPS tabstop;
+    tabstop.dwAlign = dwAlign;
+    tabstop.fTabstops = fTabstops;
+    m_tabstops.SetAt(i, tabstop);
+    m_iTabCount++;
+  }
+  void RemoveAll() {
+    m_tabstops.RemoveAll();
+    m_iTabCount = 0;
+  }
+  void Reset() {
+    m_iTabIndex = -1;
+    m_bTabstops = FALSE;
+    m_fTabWidth = 0;
+    m_fLeft = 0;
+  }
+  CFX_ArrayTemplate<XFA_TABSTOPS> m_tabstops;
+  int32_t m_iTabCount;
+  int32_t m_iTabIndex;
+  FX_BOOL m_bTabstops;
+  FX_FLOAT m_fTabWidth;
+  FX_FLOAT m_fLeft;
+};
+
+class CXFA_TextLayout {
+ public:
+  CXFA_TextLayout(IXFA_TextProvider* pTextProvider);
+  virtual ~CXFA_TextLayout();
+  int32_t GetText(CFX_WideString& wsText);
+  FX_FLOAT GetLayoutHeight();
+  FX_FLOAT StartLayout(FX_FLOAT fWidth = -1);
+  FX_BOOL DoLayout(int32_t iBlockIndex,
+                   FX_FLOAT& fCalcHeight,
+                   FX_FLOAT fContentAreaHeight = -1,
+                   FX_FLOAT fTextHeight = -1);
+
+  FX_BOOL CalcSize(const CFX_SizeF& minSize,
+                   const CFX_SizeF& maxSize,
+                   CFX_SizeF& defaultSize);
+  FX_BOOL Layout(const CFX_SizeF& size, FX_FLOAT* fHeight = NULL);
+  void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
+  FX_BOOL DrawString(CFX_RenderDevice* pFxDevice,
+                     const CFX_Matrix& tmDoc2Device,
+                     const CFX_RectF& rtClip,
+                     int32_t iBlock = 0);
+  FX_BOOL IsLoaded() const { return m_pieceLines.GetSize() > 0; }
+  void Unload();
+  const CXFA_PieceLineArray* GetPieceLines();
+
+  FX_BOOL m_bHasBlock;
+  CFX_Int32Array m_Blocks;
+
+ private:
+  void GetTextDataNode();
+  IFDE_XMLNode* GetXMLContainerNode();
+  IFX_RTFBreak* CreateBreak(FX_BOOL bDefault);
+  void InitBreak(FX_FLOAT fLineWidth);
+  void InitBreak(IFDE_CSSComputedStyle* pStyle,
+                 FDE_CSSDISPLAY eDisplay,
+                 FX_FLOAT fLineWidth,
+                 IFDE_XMLNode* pXMLNode,
+                 IFDE_CSSComputedStyle* pParentStyle = NULL);
+  FX_BOOL Loader(const CFX_SizeF& szText,
+                 FX_FLOAT& fLinePos,
+                 FX_BOOL bSavePieces = TRUE);
+  void LoadText(CXFA_Node* pNode,
+                const CFX_SizeF& szText,
+                FX_FLOAT& fLinePos,
+                FX_BOOL bSavePieces);
+  FX_BOOL LoadRichText(IFDE_XMLNode* pXMLNode,
+                       const CFX_SizeF& szText,
+                       FX_FLOAT& fLinePos,
+                       IFDE_CSSComputedStyle* pParentStyle,
+                       FX_BOOL bSavePieces,
+                       CXFA_LinkUserData* pLinkData = NULL,
+                       FX_BOOL bEndBreak = TRUE,
+                       FX_BOOL bIsOl = FALSE,
+                       int32_t iLiCount = 0);
+  FX_BOOL AppendChar(const CFX_WideString& wsText,
+                     FX_FLOAT& fLinePos,
+                     FX_FLOAT fSpaceAbove,
+                     FX_BOOL bSavePieces);
+  void AppendTextLine(FX_DWORD dwStatus,
+                      FX_FLOAT& fLinePos,
+                      FX_BOOL bSavePieces,
+                      FX_BOOL bEndBreak = FALSE);
+  void EndBreak(FX_DWORD dwStatus, FX_FLOAT& fLinePos, FX_BOOL bDefault);
+  FX_BOOL IsEnd(FX_BOOL bSavePieces);
+  void ProcessText(CFX_WideString& wsText);
+  void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
+  void RenderString(IFDE_RenderDevice* pDevice,
+                    IFDE_SolidBrush* pBrush,
+                    CXFA_PieceLine* pPieceLine,
+                    int32_t iPiece,
+                    FXTEXT_CHARPOS* pCharPos,
+                    const CFX_Matrix& tmDoc2Device);
+  void RenderPath(IFDE_RenderDevice* pDevice,
+                  IFDE_Pen* pPen,
+                  CXFA_PieceLine* pPieceLine,
+                  int32_t iPiece,
+                  FXTEXT_CHARPOS* pCharPos,
+                  const CFX_Matrix& tmDoc2Device);
+  int32_t GetDisplayPos(const XFA_TextPiece* pPiece,
+                        FXTEXT_CHARPOS* pCharPos,
+                        FX_BOOL bCharCode = FALSE);
+  FX_BOOL ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr);
+  void DoTabstops(IFDE_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine);
+  FX_BOOL Layout(int32_t iBlock);
+  int32_t CountBlocks() const;
+
+  IXFA_TextProvider* m_pTextProvider;
+  CXFA_Node* m_pTextDataNode;
+  FX_BOOL m_bRichText;
+  IFX_MEMAllocator* m_pAllocator;
+  IFX_RTFBreak* m_pBreak;
+  CXFA_LoaderContext* m_pLoader;
+  int32_t m_iLines;
+  FX_FLOAT m_fMaxWidth;
+  CXFA_TextParser m_textParser;
+  CXFA_PieceLineArray m_pieceLines;
+  CXFA_TextTabstopsContext* m_pTabstopContext;
+  FX_BOOL m_bBlockContinue;
+};
+
+#endif  // XFA_FXFA_APP_XFA_TEXTLAYOUT_H_
diff --git a/xfa/fxfa/fm2js/xfa_error.cpp b/xfa/fxfa/fm2js/xfa_error.cpp
new file mode 100644
index 0000000..69ce608
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_error.cpp
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_error.h"
+
+static const FX_WCHAR* const gs_lpStrErrorMsgInfo[] = {
+    L"unsupported char '%c'",         L"bad suffix on number",
+    L"invalidate char '%c'",          L"expected identifier instead of '%s'",
+    L"expected '%s' instead of '%s'", L"expected 'endif' instead of '%s'",
+    L"unexpected expression '%s'",    L"expected operator '%s' instead of '%s'",
+    L"expected non-empty expression",
+};
+
+const FX_WCHAR* XFA_FM_ErrorMsg(XFA_FM_ERRMSG msg) {
+  if (msg < FMERR_MAXIMUM)
+    return gs_lpStrErrorMsgInfo[msg];
+  return L"";
+}
diff --git a/xfa/fxfa/fm2js/xfa_error.h b/xfa/fxfa/fm2js/xfa_error.h
new file mode 100644
index 0000000..1da1e24
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_error.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_ERROR_H_
+#define XFA_FXFA_FM2JS_XFA_ERROR_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+
+enum XFA_FM_ERRMSG {
+  FMERR_UNSUPPORTED_CHAR,
+  FMERR_BAD_SUFFIX_NUMBER,
+  FMERR_INVALIDATE_CHAR,
+  FMERR_EXPECTED_IDENTIFIER,
+  FMERR_EXPECTED_TOKEN,
+  FMERR_EXPECTED_IFEND,
+  FMERR_UNEXPECTED_EXPRESSION,
+  FMERR_EXPTECTED_OPERATOR,
+  FMERR_EXPECTED_NON_EMPTY_EXPRESSION,
+  FMERR_MAXIMUM
+};
+
+class CXFA_FMErrorInfo {
+ public:
+  CXFA_FMErrorInfo() : linenum(0) {}
+  ~CXFA_FMErrorInfo() {}
+  FX_DWORD linenum;
+  CFX_WideString message;
+};
+const FX_WCHAR* XFA_FM_ErrorMsg(XFA_FM_ERRMSG msg);
+
+#endif  // XFA_FXFA_FM2JS_XFA_ERROR_H_
diff --git a/xfa/fxfa/fm2js/xfa_expression.cpp b/xfa/fxfa/fm2js/xfa_expression.cpp
new file mode 100644
index 0000000..b4b1a1a
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_expression.cpp
@@ -0,0 +1,627 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_expression.h"
+
+#include "core/include/fxcrt/fx_basic.h"
+
+namespace {
+
+const CFX_WideStringC RUNTIMEBLOCKTEMPARRAY =
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array");
+
+const CFX_WideStringC RUNTIMEBLOCKTEMPARRAYINDEX =
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array_index");
+
+}  // namespace
+
+CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line)
+    : m_type(XFA_FM_EXPTYPE_UNKNOWN), m_line(line) {}
+
+CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type)
+    : m_type(type), m_line(line) {}
+
+void CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+
+void CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
+
+CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
+    FX_DWORD line,
+    FX_BOOL isGlobal,
+    const CFX_WideStringC& wsName,
+    CFX_WideStringCArray* pArguments,
+    CFX_PtrArray* pExpressions)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC),
+      m_wsName(wsName),
+      m_pArguments(pArguments),
+      m_pExpressions(pExpressions),
+      m_isGlobal(isGlobal) {}
+
+CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() {
+  if (m_pArguments) {
+    m_pArguments->RemoveAll();
+    delete m_pArguments;
+  }
+  if (m_pExpressions) {
+    for (int i = 0; i < m_pExpressions->GetSize(); ++i) {
+      delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i));
+    }
+    m_pExpressions->RemoveAll();
+    delete m_pExpressions;
+  }
+}
+
+void CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript) {
+  if (m_isGlobal && (!m_pExpressions || m_pExpressions->GetSize() == 0)) {
+    javascript << FX_WSTRC(L"// comments only");
+    return;
+  }
+  if (m_isGlobal) {
+    javascript << FX_WSTRC(L"(\n");
+  }
+  javascript << FX_WSTRC(L"function ");
+  if (m_wsName.GetAt(0) == L'!') {
+    CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+    javascript << tempName;
+  } else {
+    javascript << m_wsName;
+  }
+  javascript << FX_WSTRC(L"(");
+  if (m_pArguments != 0) {
+    CFX_WideStringC identifier = 0;
+    for (int i = 0; i < m_pArguments->GetSize(); ++i) {
+      identifier = m_pArguments->GetAt(i);
+      if (identifier.GetAt(0) == L'!') {
+        CFX_WideString tempIdentifier =
+            EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1);
+        javascript << tempIdentifier;
+      } else {
+        javascript << identifier;
+      }
+      if (i + 1 < m_pArguments->GetSize()) {
+        javascript << FX_WSTRC(L", ");
+      }
+    }
+  }
+  javascript << FX_WSTRC(L")\n{\n");
+  javascript << FX_WSTRC(L"var ");
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = null;\n");
+  if (m_pExpressions) {
+    for (int i = 0; i < m_pExpressions->GetSize(); ++i) {
+      CXFA_FMExpression* e =
+          reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i));
+      if (i + 1 < m_pExpressions->GetSize()) {
+        e->ToJavaScript(javascript);
+      } else {
+        e->ToImpliedReturnJS(javascript);
+      }
+    }
+  }
+  javascript << FX_WSTRC(L"return ");
+  if (m_isGlobal) {
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    javascript << RUNTIMEFUNCTIONRETURNVALUE;
+    javascript << FX_WSTRC(L")");
+  } else {
+    javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  }
+  javascript << FX_WSTRC(L";\n}\n");
+  if (m_isGlobal) {
+    javascript << FX_WSTRC(L").call(this);\n");
+  }
+}
+
+void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) {}
+
+CXFA_FMVarExpression::CXFA_FMVarExpression(FX_DWORD line,
+                                           const CFX_WideStringC& wsName,
+                                           CXFA_FMExpression* pInit)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR),
+      m_wsName(wsName),
+      m_pInit(pInit) {}
+
+void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"var ");
+  CFX_WideString tempName = m_wsName;
+  if (m_wsName.GetAt(0) == L'!') {
+    tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+  }
+  javascript << tempName;
+  javascript << FX_WSTRC(L" = ");
+  if (m_pInit) {
+    m_pInit->ToJavaScript(javascript);
+    javascript << tempName;
+    javascript << FX_WSTRC(L" = ");
+    javascript << XFA_FM_EXPTypeToString(VARFILTER);
+    javascript << FX_WSTRC(L"(");
+    javascript << tempName;
+    javascript << FX_WSTRC(L");\n");
+  } else {
+    javascript << FX_WSTRC(L"\"\";\n");
+  }
+}
+
+void CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"var ");
+  CFX_WideString tempName = m_wsName;
+  if (m_wsName.GetAt(0) == L'!') {
+    tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
+  }
+  javascript << tempName;
+  javascript << FX_WSTRC(L" = ");
+  if (m_pInit) {
+    m_pInit->ToJavaScript(javascript);
+    javascript << tempName;
+    javascript << FX_WSTRC(L" = ");
+    javascript << XFA_FM_EXPTypeToString(VARFILTER);
+    javascript << FX_WSTRC(L"(");
+    javascript << tempName;
+    javascript << FX_WSTRC(L");\n");
+  } else {
+    javascript << FX_WSTRC(L"\"\";\n");
+  }
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = ");
+  javascript << tempName;
+  javascript << FX_WSTRC(L";\n");
+}
+
+CXFA_FMExpExpression::CXFA_FMExpExpression(FX_DWORD line,
+                                           CXFA_FMSimpleExpression* pExpression)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) {}
+
+void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  if (m_pExpression->GetOperatorToken() == TOKassign) {
+    m_pExpression->ToJavaScript(javascript);
+  } else {
+    m_pExpression->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L";\n");
+  }
+}
+
+void CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  if (m_pExpression->GetOperatorToken() == TOKassign) {
+    m_pExpression->ToImpliedReturnJS(javascript);
+  } else {
+    if (m_pExpression->GetOperatorToken() == TOKstar ||
+        m_pExpression->GetOperatorToken() == TOKdotstar ||
+        m_pExpression->GetOperatorToken() == TOKdotscream ||
+        m_pExpression->GetOperatorToken() == TOKdotdot ||
+        m_pExpression->GetOperatorToken() == TOKdot) {
+      javascript << RUNTIMEFUNCTIONRETURNVALUE;
+      javascript << FX_WSTRC(L" = ");
+      javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+      javascript << FX_WSTRC(L"(");
+      m_pExpression->ToJavaScript(javascript);
+      javascript << FX_WSTRC(L");\n");
+    } else {
+      javascript << RUNTIMEFUNCTIONRETURNVALUE;
+      javascript << FX_WSTRC(L" = ");
+      m_pExpression->ToJavaScript(javascript);
+      javascript << FX_WSTRC(L";\n");
+    }
+  }
+}
+
+CXFA_FMBlockExpression::CXFA_FMBlockExpression(FX_DWORD line,
+                                               CFX_PtrArray* pExpressionList)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK),
+      m_pExpressionList(pExpressionList) {}
+
+CXFA_FMBlockExpression::~CXFA_FMBlockExpression() {
+  if (m_pExpressionList) {
+    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
+      delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
+    }
+    m_pExpressionList->RemoveAll();
+    delete m_pExpressionList;
+  }
+}
+
+void CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"{\n");
+  if (m_pExpressionList) {
+    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
+      CXFA_FMExpression* e =
+          reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
+      e->ToJavaScript(javascript);
+    }
+  }
+  javascript << FX_WSTRC(L"}\n");
+}
+
+void CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"{\n");
+  if (m_pExpressionList) {
+    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
+      CXFA_FMExpression* e =
+          reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
+      if (i + 1 == m_pExpressionList->GetSize()) {
+        e->ToImpliedReturnJS(javascript);
+      } else {
+        e->ToJavaScript(javascript);
+      }
+    }
+  }
+  javascript << FX_WSTRC(L"}\n");
+}
+
+CXFA_FMDoExpression::CXFA_FMDoExpression(FX_DWORD line,
+                                         CXFA_FMExpression* pList)
+    : CXFA_FMExpression(line), m_pList(pList) {}
+
+void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  m_pList->ToJavaScript(javascript);
+}
+
+void CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  m_pList->ToImpliedReturnJS(javascript);
+}
+
+CXFA_FMIfExpression::CXFA_FMIfExpression(FX_DWORD line,
+                                         CXFA_FMSimpleExpression* pExpression,
+                                         CXFA_FMExpression* pIfExpression,
+                                         CXFA_FMExpression* pElseExpression)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF),
+      m_pExpression(pExpression),
+      m_pIfExpression(pIfExpression),
+      m_pElseExpression(pElseExpression) {}
+
+void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"if (");
+  if (m_pExpression) {
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pExpression->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L")");
+  }
+  javascript << FX_WSTRC(L")\n");
+  if (m_pIfExpression) {
+    m_pIfExpression->ToJavaScript(javascript);
+  }
+  if (m_pElseExpression) {
+    if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
+      javascript << FX_WSTRC(L"else\n");
+      javascript << FX_WSTRC(L"{\n");
+      m_pElseExpression->ToJavaScript(javascript);
+      javascript << FX_WSTRC(L"}\n");
+    } else {
+      javascript << FX_WSTRC(L"else\n");
+      m_pElseExpression->ToJavaScript(javascript);
+    }
+  }
+}
+
+void CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"if (");
+  if (m_pExpression) {
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pExpression->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L")");
+  }
+  javascript << FX_WSTRC(L")\n");
+  if (m_pIfExpression) {
+    m_pIfExpression->ToImpliedReturnJS(javascript);
+  }
+  if (m_pElseExpression) {
+    if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
+      javascript << FX_WSTRC(L"else\n");
+      javascript << FX_WSTRC(L"{\n");
+      m_pElseExpression->ToImpliedReturnJS(javascript);
+      javascript << FX_WSTRC(L"}\n");
+    } else {
+      javascript << FX_WSTRC(L"else\n");
+      m_pElseExpression->ToImpliedReturnJS(javascript);
+    }
+  }
+}
+
+CXFA_FMLoopExpression::~CXFA_FMLoopExpression() {}
+
+void CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+
+void CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&) {}
+
+CXFA_FMWhileExpression::CXFA_FMWhileExpression(
+    FX_DWORD line,
+    CXFA_FMSimpleExpression* pCondition,
+    CXFA_FMExpression* pExpression)
+    : CXFA_FMLoopExpression(line),
+      m_pCondition(pCondition),
+      m_pExpression(pExpression) {}
+
+void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"while (");
+  m_pCondition->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")\n");
+  m_pExpression->ToJavaScript(javascript);
+}
+
+void CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"while (");
+  m_pCondition->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")\n");
+  m_pExpression->ToImpliedReturnJS(javascript);
+}
+
+CXFA_FMBreakExpression::CXFA_FMBreakExpression(FX_DWORD line)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK) {}
+
+CXFA_FMBreakExpression::~CXFA_FMBreakExpression() {}
+
+void CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"break;\n");
+}
+
+void CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"break;\n");
+}
+
+CXFA_FMContinueExpression::CXFA_FMContinueExpression(FX_DWORD line)
+    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE) {}
+
+CXFA_FMContinueExpression::~CXFA_FMContinueExpression() {}
+
+void CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"continue;\n");
+}
+
+void CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"continue;\n");
+}
+
+CXFA_FMForExpression::CXFA_FMForExpression(FX_DWORD line,
+                                           const CFX_WideStringC& wsVariant,
+                                           CXFA_FMSimpleExpression* pAssignment,
+                                           CXFA_FMSimpleExpression* pAccessor,
+                                           int32_t iDirection,
+                                           CXFA_FMSimpleExpression* pStep,
+                                           CXFA_FMExpression* pList)
+    : CXFA_FMLoopExpression(line),
+      m_wsVariant(wsVariant),
+      m_pAssignment(pAssignment),
+      m_pAccessor(pAccessor),
+      m_iDirection(iDirection),
+      m_pStep(pStep),
+      m_pList(pList) {}
+
+void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"{\nvar ");
+  CFX_WideString tempVariant;
+  if (m_wsVariant.GetAt(0) == L'!') {
+    tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
+    javascript << tempVariant;
+  } else {
+    tempVariant = m_wsVariant;
+    javascript << m_wsVariant;
+  }
+  javascript << FX_WSTRC(L" = null;\n");
+  javascript << FX_WSTRC(L"for (");
+  javascript << tempVariant;
+  javascript << FX_WSTRC(L" = ");
+  javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+  javascript << FX_WSTRC(L"(");
+  m_pAssignment->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"); ");
+  javascript << tempVariant;
+  if (m_iDirection == 1) {
+    javascript << FX_WSTRC(L" <= ");
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pAccessor->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L"); ");
+    javascript << tempVariant;
+    javascript << FX_WSTRC(L" += ");
+  } else {
+    javascript << FX_WSTRC(L" >= ");
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pAccessor->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L"); ");
+    javascript << tempVariant;
+    javascript << FX_WSTRC(L" -= ");
+  }
+  if (m_pStep) {
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pStep->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L")");
+  } else {
+    javascript << FX_WSTRC(L"1");
+  }
+  javascript << FX_WSTRC(L")\n");
+  m_pList->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"}\n");
+}
+
+void CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"{\nvar ");
+  CFX_WideString tempVariant;
+  if (m_wsVariant.GetAt(0) == L'!') {
+    tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
+    javascript << tempVariant;
+  } else {
+    tempVariant = m_wsVariant;
+    javascript << m_wsVariant;
+  }
+  javascript << FX_WSTRC(L" = null;\n");
+  javascript << FX_WSTRC(L"for (");
+  javascript << tempVariant;
+  javascript << FX_WSTRC(L" = ");
+  javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+  javascript << FX_WSTRC(L"(");
+  m_pAssignment->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"); ");
+  javascript << tempVariant;
+  if (m_iDirection == 1) {
+    javascript << FX_WSTRC(L" <= ");
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pAccessor->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L"); ");
+    javascript << tempVariant;
+    javascript << FX_WSTRC(L" += ");
+  } else {
+    javascript << FX_WSTRC(L" >= ");
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pAccessor->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L"); ");
+    javascript << tempVariant;
+    javascript << FX_WSTRC(L" -= ");
+  }
+  if (m_pStep) {
+    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
+    javascript << FX_WSTRC(L"(");
+    m_pStep->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L")");
+  } else {
+    javascript << FX_WSTRC(L"1");
+  }
+  javascript << FX_WSTRC(L")\n");
+  m_pList->ToImpliedReturnJS(javascript);
+  javascript << FX_WSTRC(L"}\n");
+}
+
+CXFA_FMForeachExpression::CXFA_FMForeachExpression(
+    FX_DWORD line,
+    const CFX_WideStringC& wsIdentifier,
+    CFX_PtrArray* pAccessors,
+    CXFA_FMExpression* pList)
+    : CXFA_FMLoopExpression(line),
+      m_wsIdentifier(wsIdentifier),
+      m_pAccessors(pAccessors),
+      m_pList(pList) {}
+
+CXFA_FMForeachExpression::~CXFA_FMForeachExpression() {
+  if (m_pAccessors) {
+    for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
+      delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
+    }
+    m_pAccessors->RemoveAll();
+    delete m_pAccessors;
+  }
+}
+
+void CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"{\n");
+  javascript << FX_WSTRC(L"var ");
+  if (m_wsIdentifier.GetAt(0) == L'!') {
+    CFX_WideString tempIdentifier =
+        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+    javascript << tempIdentifier;
+  } else {
+    javascript << m_wsIdentifier;
+  }
+  javascript << FX_WSTRC(L" = null;\n");
+  javascript << FX_WSTRC(L"var ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L" = ");
+  javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
+  javascript << FX_WSTRC(L"(");
+
+  for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
+    CXFA_FMSimpleExpression* s =
+        reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
+    s->ToJavaScript(javascript);
+    if (i + 1 < m_pAccessors->GetSize()) {
+      javascript << FX_WSTRC(L", ");
+    }
+  }
+  javascript << FX_WSTRC(L");\n");
+  javascript << FX_WSTRC(L"var ");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"while(");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L" < ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L".length)\n{\n");
+  if (m_wsIdentifier.GetAt(0) == L'!') {
+    CFX_WideString tempIdentifier =
+        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+    javascript << tempIdentifier;
+  } else {
+    javascript << m_wsIdentifier;
+  }
+  javascript << FX_WSTRC(L" = ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L"[");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L"++];\n");
+  m_pList->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"}\n");
+  javascript << FX_WSTRC(L"}\n");
+}
+
+void CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"{\n");
+  javascript << FX_WSTRC(L"var ");
+  if (m_wsIdentifier.GetAt(0) == L'!') {
+    CFX_WideString tempIdentifier =
+        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+    javascript << tempIdentifier;
+  } else {
+    javascript << m_wsIdentifier;
+  }
+  javascript << FX_WSTRC(L" = null;\n");
+  javascript << FX_WSTRC(L"var ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L" = ");
+  javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
+  javascript << FX_WSTRC(L"(");
+  for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
+    CXFA_FMSimpleExpression* s =
+        reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
+    s->ToJavaScript(javascript);
+    if (i + 1 < m_pAccessors->GetSize()) {
+      javascript << FX_WSTRC(L", ");
+    }
+  }
+  javascript << FX_WSTRC(L");\n");
+  javascript << FX_WSTRC(L"var ");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L" = 0;\n");
+  javascript << FX_WSTRC(L"while(");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L" < ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L".length)\n{\n");
+  if (m_wsIdentifier.GetAt(0) == L'!') {
+    CFX_WideString tempIdentifier =
+        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
+    javascript << tempIdentifier;
+  } else {
+    javascript << m_wsIdentifier;
+  }
+  javascript << FX_WSTRC(L" = ");
+  javascript << RUNTIMEBLOCKTEMPARRAY;
+  javascript << FX_WSTRC(L"[");
+  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
+  javascript << FX_WSTRC(L"++];\n");
+  m_pList->ToImpliedReturnJS(javascript);
+  javascript << FX_WSTRC(L"}\n");
+  javascript << FX_WSTRC(L"}\n");
+}
diff --git a/xfa/fxfa/fm2js/xfa_expression.h b/xfa/fxfa/fm2js/xfa_expression.h
new file mode 100644
index 0000000..0b99e8d
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_expression.h
@@ -0,0 +1,191 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_EXPRESSION_H_
+#define XFA_FXFA_FM2JS_XFA_EXPRESSION_H_
+
+#include <memory>
+
+#include "xfa/fxfa/fm2js/xfa_simpleexpression.h"
+
+enum XFA_FM_EXPTYPE {
+  XFA_FM_EXPTYPE_UNKNOWN,
+  XFA_FM_EXPTYPE_FUNC,
+  XFA_FM_EXPTYPE_VAR,
+  XFA_FM_EXPTYPE_EXP,
+  XFA_FM_EXPTYPE_BLOCK,
+  XFA_FM_EXPTYPE_IF,
+  XFA_FM_EXPTYPE_BREAK,
+  XFA_FM_EXPTYPE_CONTINUE,
+};
+
+class CXFA_FMExpression {
+ public:
+  explicit CXFA_FMExpression(FX_DWORD line);
+  CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type);
+  virtual ~CXFA_FMExpression() {}
+  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
+  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
+  FX_DWORD GetLine() { return m_line; }
+  XFA_FM_EXPTYPE GetExpType() const { return m_type; }
+
+ protected:
+  XFA_FM_EXPTYPE m_type;
+  FX_DWORD m_line;
+};
+
+class CXFA_FMFunctionDefinition : public CXFA_FMExpression {
+ public:
+  CXFA_FMFunctionDefinition(FX_DWORD line,
+                            FX_BOOL isGlobal,
+                            const CFX_WideStringC& wsName,
+                            CFX_WideStringCArray* pArguments,
+                            CFX_PtrArray* pExpressions);
+  ~CXFA_FMFunctionDefinition() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  CFX_WideStringC m_wsName;
+  CFX_WideStringCArray* m_pArguments;
+  CFX_PtrArray* m_pExpressions;
+  FX_BOOL m_isGlobal;
+};
+
+class CXFA_FMVarExpression : public CXFA_FMExpression {
+ public:
+  CXFA_FMVarExpression(FX_DWORD line,
+                       const CFX_WideStringC& wsName,
+                       CXFA_FMExpression* pInit);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  CFX_WideStringC m_wsName;
+  std::unique_ptr<CXFA_FMExpression> m_pInit;
+};
+
+class CXFA_FMExpExpression : public CXFA_FMExpression {
+ public:
+  CXFA_FMExpExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExpression);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pExpression;
+};
+
+class CXFA_FMBlockExpression : public CXFA_FMExpression {
+ public:
+  CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray* pExpressionList);
+  ~CXFA_FMBlockExpression() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  CFX_PtrArray* m_pExpressionList;
+};
+
+class CXFA_FMDoExpression : public CXFA_FMExpression {
+ public:
+  CXFA_FMDoExpression(FX_DWORD line, CXFA_FMExpression* pList);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  std::unique_ptr<CXFA_FMExpression> m_pList;
+};
+
+class CXFA_FMIfExpression : public CXFA_FMExpression {
+ public:
+  CXFA_FMIfExpression(FX_DWORD line,
+                      CXFA_FMSimpleExpression* pExpression,
+                      CXFA_FMExpression* pIfExpression,
+                      CXFA_FMExpression* pElseExpression);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pExpression;
+  std::unique_ptr<CXFA_FMExpression> m_pIfExpression;
+  std::unique_ptr<CXFA_FMExpression> m_pElseExpression;
+};
+
+class CXFA_FMLoopExpression : public CXFA_FMExpression {
+ public:
+  explicit CXFA_FMLoopExpression(FX_DWORD line) : CXFA_FMExpression(line) {}
+  ~CXFA_FMLoopExpression() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+};
+
+class CXFA_FMWhileExpression : public CXFA_FMLoopExpression {
+ public:
+  CXFA_FMWhileExpression(FX_DWORD line,
+                         CXFA_FMSimpleExpression* pCodition,
+                         CXFA_FMExpression* pExpression);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pCondition;
+  std::unique_ptr<CXFA_FMExpression> m_pExpression;
+};
+
+class CXFA_FMBreakExpression : public CXFA_FMExpression {
+ public:
+  explicit CXFA_FMBreakExpression(FX_DWORD line);
+  ~CXFA_FMBreakExpression() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+};
+
+class CXFA_FMContinueExpression : public CXFA_FMExpression {
+ public:
+  explicit CXFA_FMContinueExpression(FX_DWORD line);
+  ~CXFA_FMContinueExpression() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+};
+
+class CXFA_FMForExpression : public CXFA_FMLoopExpression {
+ public:
+  CXFA_FMForExpression(FX_DWORD line,
+                       const CFX_WideStringC& wsVariant,
+                       CXFA_FMSimpleExpression* pAssignment,
+                       CXFA_FMSimpleExpression* pAccessor,
+                       int32_t iDirection,
+                       CXFA_FMSimpleExpression* pStep,
+                       CXFA_FMExpression* pList);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  CFX_WideStringC m_wsVariant;
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pAssignment;
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pAccessor;
+  int32_t m_iDirection;
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pStep;
+  std::unique_ptr<CXFA_FMExpression> m_pList;
+};
+
+class CXFA_FMForeachExpression : public CXFA_FMLoopExpression {
+ public:
+  CXFA_FMForeachExpression(FX_DWORD line,
+                           const CFX_WideStringC& wsIdentifier,
+                           CFX_PtrArray* pAccessors,
+                           CXFA_FMExpression* pList);
+  ~CXFA_FMForeachExpression() override;
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
+
+ private:
+  CFX_WideStringC m_wsIdentifier;
+  CFX_PtrArray* m_pAccessors;
+  std::unique_ptr<CXFA_FMExpression> m_pList;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_EXPRESSION_H_
diff --git a/xfa/fxfa/fm2js/xfa_fm2jsapi.cpp b/xfa/fxfa/fm2js/xfa_fm2jsapi.cpp
new file mode 100644
index 0000000..3a6bc17
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fm2jsapi.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
+#include "xfa/fxfa/fm2js/xfa_program.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int32_t XFA_FM2JS_Translate(const CFX_WideStringC& wsFormcalc,
+                            CFX_WideTextBuf& wsJavascript,
+                            CFX_WideString& wsError) {
+  if (wsFormcalc.IsEmpty()) {
+    wsJavascript.Clear();
+    wsError.Empty();
+    return 0;
+  }
+  int32_t status = 0;
+  CXFA_FMProgram program;
+  status = program.Init(wsFormcalc);
+  if (status) {
+    wsError = program.GetError().message;
+    return status;
+  }
+  status = program.ParseProgram();
+  if (status) {
+    wsError = program.GetError().message;
+    return status;
+  }
+  program.TranslateProgram(wsJavascript);
+  return 0;
+}
+XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate() {
+  return (XFA_HFM2JSCONTEXT)CXFA_FM2JSContext::Create();
+}
+void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext,
+                                 FXJSE_HRUNTIME hScriptRuntime,
+                                 FXJSE_HCONTEXT hScriptContext,
+                                 CXFA_Document* pDocument) {
+  CXFA_FM2JSContext* pContext =
+      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
+  pContext->Initialize(hScriptRuntime, hScriptContext, pDocument);
+}
+void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext,
+                                    FXJSE_HVALUE hValue) {
+  CXFA_FM2JSContext* pContext =
+      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
+  pContext->GlobalPropertyGetter(hValue);
+}
+void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext) {
+  CXFA_FM2JSContext* pContext =
+      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
+  pContext->Release();
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/xfa/fxfa/fm2js/xfa_fm2jsapi.h b/xfa/fxfa/fm2js/xfa_fm2jsapi.h
new file mode 100644
index 0000000..246bc8f
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fm2jsapi.h
@@ -0,0 +1,37 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_FM2JSAPI_H_
+#define XFA_FXFA_FM2JS_XFA_FM2JSAPI_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/include/fxjse/fxjse.h"
+
+#define FOXIT_XFA_FM2JS_FORMCALC_RUNTIME "foxit_xfa_formcalc_runtime"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct XFA_HFM2JSCONTEXT_ { void** pData; } * XFA_HFM2JSCONTEXT;
+int32_t XFA_FM2JS_Translate(const CFX_WideStringC& wsFormcalc,
+                            CFX_WideTextBuf& wsJavascript,
+                            CFX_WideString& wsError);
+XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate();
+void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext,
+                                 FXJSE_HRUNTIME hScriptRuntime,
+                                 FXJSE_HCONTEXT hScriptContext,
+                                 CXFA_Document* pDocument);
+void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext,
+                                    FXJSE_HVALUE hValue);
+void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // XFA_FXFA_FM2JS_XFA_FM2JSAPI_H_
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
new file mode 100644
index 0000000..9de6e1c
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -0,0 +1,7223 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
+
+#include <time.h>
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/localization/fgas_locale.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+
+#define FINANCIAL_PRECISION 0.00000001
+
+namespace {
+
+struct XFA_FMHtmlReserveCode {
+  uint32_t m_uCode;
+  const FX_WCHAR* m_htmlReserve;
+};
+struct XFA_FMHtmlHashedReserveCode {
+  uint32_t m_uHash;
+  const FX_WCHAR* m_htmlReserve;
+  uint32_t m_uCode;
+};
+
+const XFA_FMHtmlHashedReserveCode reservesForDecode[] = {
+    {0x00018b62, L"Mu", 924},       {0x00019083, L"Nu", 925},
+    {0x00019ab9, L"Pi", 928},       {0x0001c3c1, L"Xi", 926},
+    {0x000210ac, L"ge", 8805},      {0x000210bb, L"gt", 62},
+    {0x00022a51, L"le", 8804},      {0x00022a60, L"lt", 60},
+    {0x00022f82, L"mu", 956},       {0x00023493, L"ne", 8800},
+    {0x00023497, L"ni", 8715},      {0x000234a3, L"nu", 957},
+    {0x000239c1, L"or", 8744},      {0x00023ed9, L"pi", 960},
+    {0x000267e1, L"xi", 958},       {0x00c41789, L"lceil", 8968},
+    {0x00eef34f, L"thetasym", 977}, {0x012d7ead, L"lcirc", 206},
+    {0x01637b56, L"agrave", 224},   {0x020856da, L"crarr", 8629},
+    {0x022188c3, L"gamma", 947},    {0x033586d3, L"nbsp", 160},
+    {0x04f4c358, L"nsub", 8836},    {0x0581466a, L"dagger", 8224},
+    {0x06b1f790, L"oelig", 339},    {0x06e490d4, L"Chi", 935},
+    {0x0718c6a1, L"ETH", 208},      {0x07196ada, L"Eta", 919},
+    {0x07f667ca, L"Ugrave", 217},   {0x083a8a21, L"Phi", 934},
+    {0x083ac28c, L"Psi", 936},      {0x086f26a9, L"Rho", 929},
+    {0x089b5b51, L"aring", 229},    {0x08a39f4a, L"Tau", 932},
+    {0x08b6188b, L"THORN", 222},    {0x09ce792a, L"icirc", 238},
+    {0x09f9d61e, L"amp", 38},       {0x09f9db33, L"and", 8743},
+    {0x09f9db36, L"ang", 8736},     {0x0a2e3514, L"cap", 8745},
+    {0x0a2e58f4, L"chi", 967},      {0x0a2e9ba8, L"cup", 8746},
+    {0x0a4897d0, L"deg", 176},      {0x0a6332fa, L"eta", 951},
+    {0x0a633301, L"eth", 240},      {0x0acc4d4b, L"int", 8747},
+    {0x0b1b3d35, L"loz", 9674},     {0x0b1b4c8b, L"lrm", 8206},
+    {0x0b4fd9b1, L"not", 172},      {0x0b845241, L"phi", 966},
+    {0x0b84576f, L"piv", 982},      {0x0b848aac, L"psi", 968},
+    {0x0bb8df5e, L"reg", 174},      {0x0bb8eec9, L"rho", 961},
+    {0x0bb9034b, L"rlm", 8207},     {0x0bd33d14, L"shy", 173},
+    {0x0bd34229, L"sim", 8764},     {0x0bd37faa, L"sub", 8834},
+    {0x0bd37fb5, L"sum", 8721},     {0x0bd37fb8, L"sup", 8835},
+    {0x0bed676a, L"tau", 964},      {0x0c07f32e, L"uml", 168},
+    {0x0c71032c, L"yen", 165},      {0x0c7f2889, L"szlig", 223},
+    {0x0c8badbb, L"zwj", 8205},     {0x10ba4dba, L"Egrave", 200},
+    {0x10f1ea24, L"para", 182},     {0x10f1ea37, L"part", 8706},
+    {0x115b2337, L"perp", 8869},    {0x12b10d15, L"prod", 8719},
+    {0x12b10d21, L"prop", 8733},    {0x12dfa9f4, L"rfloor", 8971},
+    {0x12eb4736, L"Agrave", 192},   {0x12fff2b7, L"pund", 163},
+    {0x13fda9f2, L"tilde", 732},    {0x1417fd62, L"times", 215},
+    {0x154fc726, L"ecirc", 234},    {0x165aa451, L"sigma", 963},
+    {0x1709124a, L"Dagger", 8225},  {0x192f78d5, L"iexcl", 161},
+    {0x1b7ed8d7, L"rArr", 8658},    {0x1ec88c68, L"rang", 9002},
+    {0x1ec8a0f7, L"rarr", 8594},    {0x1eda07f3, L"atilde", 227},
+    {0x1f3182c4, L"real", 8476},    {0x1fc34f8b, L"yacute", 253},
+    {0x20d11522, L"acirc", 226},    {0x21933a9b, L"rsaquo", 8250},
+    {0x21f44907, L"uacute", 250},   {0x220cca72, L"acute", 180},
+    {0x242cded1, L"alefsym", 8501}, {0x2655c66a, L"delta", 948},
+    {0x269e4b4d, L"exist", 8707},   {0x273379fa, L"micro", 181},
+    {0x27a37440, L"forall", 8704},  {0x2854e62c, L"minus", 8722},
+    {0x28636f81, L"cedil", 184},    {0x2887357b, L"iacute", 237},
+    {0x2994d5ff, L"frac12", 189},   {0x2994d601, L"frac14", 188},
+    {0x2994e043, L"frac34", 190},   {0x2a1feb41, L"lambda", 955},
+    {0x2ab215f3, L"apos", 39},      {0x2ab82ef7, L"eacute", 233},
+    {0x2b3592ef, L"auml", 228},     {0x2ce92873, L"aacute", 225},
+    {0x2daff48a, L"oslash", 248},   {0x2ef68882, L"aelig", 230},
+    {0x3061d3d3, L"Atilde", 195},   {0x314b1b6b, L"Yacute", 221},
+    {0x337c14e7, L"Uacute", 218},   {0x37676aca, L"cent", 162},
+    {0x37d0b841, L"circ", 710},     {0x386e7947, L"cong", 8773},
+    {0x386e839b, L"copy", 169},     {0x3a0e225a, L"Epsilon", 917},
+    {0x3ba7b721, L"Lambda", 923},   {0x3bd9abe6, L"Alpha", 913},
+    {0x3c3ffad7, L"Eacute", 201},   {0x3cfaf69f, L"brvbar", 166},
+    {0x3d54a489, L"omega", 969},    {0x3e70f453, L"Aacute", 193},
+    {0x3f37c06a, L"Oslash", 216},   {0x40e1b34e, L"diams", 9830},
+    {0x416596df, L"plusmn", 177},   {0x4354ff16, L"Ucirc", 219},
+    {0x454fce6a, L"Upsilon", 933},  {0x4610ad35, L"emsp", 8195},
+    {0x462afb76, L"ensp", 8194},    {0x46e30073, L"euml", 235},
+    {0x46e31a1b, L"euro", 8364},    {0x46f2eada, L"lowast", 8727},
+    {0x4dca26cf, L"Auml", 196},     {0x4e2d6083, L"image", 8465},
+    {0x4f964ee8, L"notin", 8713},   {0x50917a7a, L"epsilon", 949},
+    {0x52f9a4cd, L"Kappa", 922},    {0x5496f410, L"Ocirc", 212},
+    {0x568cbf34, L"zeta", 950},     {0x57badd20, L"ntilde", 241},
+    {0x58662109, L"zwnj", 8204},    {0x5b39870f, L"empty", 8709},
+    {0x5bd3268a, L"upsilon", 965},  {0x5e2bf8a3, L"Gamma", 915},
+    {0x5f73c13a, L"rsquo", 8217},   {0x61f2bc4d, L"iota", 953},
+    {0x625bbcf3, L"isin", 8712},    {0x62906df7, L"iuml", 239},
+    {0x64a5cb31, L"Aring", 197},    {0x66f25c4a, L"sbquo", 8218},
+    {0x6851ab60, L"spades", 9824},  {0x6942a900, L"Ntilde", 209},
+    {0x69779453, L"Euml", 203},     {0x6cda6e23, L"current", 164},
+    {0x70b5b634, L"lsquo", 8216},   {0x715a3706, L"Ecirc", 202},
+    {0x71e8bf8d, L"tdquo", 8221},   {0x72651431, L"Sigma", 931},
+    {0x7569813b, L"iquest", 191},   {0x776a436a, L"equiv", 8801},
+    {0x79215314, L"Zeta", 918},     {0x79b81224, L"ograve", 242},
+    {0x7c2f8b23, L"macr", 175},     {0x7cdb8502, L"Acirc", 194},
+    {0x8185c62e, L"ndash", 8211},   {0x8260364a, L"Delta", 916},
+    {0x846619ad, L"mdash", 8212},   {0x8550fb50, L"OElig", 338},
+    {0x88eb5b85, L"ldquo", 8220},   {0x8b3fde04, L"Ograve", 210},
+    {0x8bc5794b, L"ordf", 170},     {0x8bc57952, L"ordm", 186},
+    {0x8c14923d, L"ouml", 246},     {0x8c5a7cd6, L"theta", 952},
+    {0x8d61812b, L"thorn", 254},    {0x912b95aa, L"asymp", 8776},
+    {0x947faf81, L"middot", 183},   {0x9629202e, L"lfloor", 8970},
+    {0x972e9ec1, L"otilde", 245},   {0x9748f231, L"otimes", 8855},
+    {0x995f1469, L"Omega", 937},    {0x99eb5349, L"quot", 34},
+    {0x9aeb639e, L"hellip", 8230},  {0xa0ae2f86, L"Scaron", 352},
+    {0xa4dcb0d5, L"lsaquo", 8249},  {0xa53dbf41, L"oacute", 243},
+    {0xa5ae9e7b, L"bdquo", 8222},   {0xa602d7ba, L"sdot", 8901},
+    {0xa61ce86f, L"sect", 167},     {0xa6e4c3d7, L"sigmaf", 962},
+    {0xa7c1c74f, L"sube", 8838},    {0xa7c20ee9, L"sup1", 185},
+    {0xa7c20eea, L"sup2", 178},     {0xa7c20eeb, L"sup3", 179},
+    {0xa7c20f1d, L"supe", 8839},    {0xa8b66aa1, L"Otilde", 213},
+    {0xad958c42, L"AElig", 198},    {0xaea9261d, L"Ouml", 214},
+    {0xb040eafa, L"uArr", 8657},    {0xb07c2e1c, L"beta", 946},
+    {0xb220e92f, L"bull", 8226},    {0xb22750c4, L"ccedil", 231},
+    {0xb38ab31a, L"uarr", 8593},    {0xb598b683, L"uuml", 252},
+    {0xb6c58b21, L"Oacute", 211},   {0xb6d2a617, L"oline", 8254},
+    {0xba9fd989, L"dArr", 8659},    {0xbb5ccd41, L"lgrave", 204},
+    {0xbd39b44c, L"weierp", 8472},  {0xbde9a1a9, L"darr", 8595},
+    {0xc027e329, L"permil", 8240},  {0xc2451389, L"upsih", 978},
+    {0xc3af1ca4, L"Ccedil", 199},   {0xcd164249, L"fnof", 402},
+    {0xcf6c8467, L"hearts", 9829},  {0xd1228390, L"trade", 8482},
+    {0xd1462407, L"yuml", 255},     {0xd2cf2253, L"oplus", 8853},
+    {0xd310c1fc, L"Beta", 914},     {0xd59c4d74, L"infin", 8734},
+    {0xd64d470d, L"hArr", 8660},    {0xd67d9c75, L"divide", 247},
+    {0xd698dd37, L"Omicron", 927},  {0xd82d4a63, L"Uuml", 220},
+    {0xd9970f2d, L"harr", 8596},    {0xda91fd99, L"clubs", 9827},
+    {0xdbe5bdcc, L"there4", 8756},  {0xdd7671bd, L"prime", 8242},
+    {0xdfcf3c06, L"alpha", 945},    {0xe0213063, L"saron", 353},
+    {0xe1911d83, L"radic", 8730},   {0xe2e75468, L"raquo", 187},
+    {0xe6e27a5e, L"lacute", 205},   {0xe74a8f36, L"ucirc", 251},
+    {0xe864ecb6, L"Theta", 920},    {0xecddde5e, L"nabla", 8711},
+    {0xed1c3557, L"omicron", 959},  {0xef82228f, L"rceil", 8969},
+    {0xf1fab491, L"lArr", 8656},    {0xf3dab7e7, L"Yuml", 376},
+    {0xf4294962, L"laquo", 171},    {0xf5446822, L"lang", 9001},
+    {0xf5447cb1, L"larr", 8592},    {0xf66e9bea, L"ugrave", 249},
+    {0xf6b4ce70, L"lota", 921},     {0xf6ef34ed, L"kappa", 954},
+    {0xf72a3a56, L"thinsp", 8201},  {0xf752801a, L"luml", 207},
+    {0xf88c8430, L"ocirc", 244},    {0xf9676178, L"frasl", 8260},
+    {0xfd01885e, L"igrave", 236},   {0xff3281da, L"egrave", 232},
+};
+
+const XFA_FMHtmlReserveCode reservesForEncode[] = {
+    {34, L"quot"},     {38, L"amp"},      {39, L"apos"},
+    {60, L"lt"},       {62, L"gt"},       {160, L"nbsp"},
+    {161, L"iexcl"},   {162, L"cent"},    {163, L"pund"},
+    {164, L"current"}, {165, L"yen"},     {166, L"brvbar"},
+    {167, L"sect"},    {168, L"uml"},     {169, L"copy"},
+    {170, L"ordf"},    {171, L"laquo"},   {172, L"not"},
+    {173, L"shy"},     {174, L"reg"},     {175, L"macr"},
+    {176, L"deg"},     {177, L"plusmn"},  {178, L"sup2"},
+    {179, L"sup3"},    {180, L"acute"},   {181, L"micro"},
+    {182, L"para"},    {183, L"middot"},  {184, L"cedil"},
+    {185, L"sup1"},    {186, L"ordm"},    {187, L"raquo"},
+    {188, L"frac14"},  {189, L"frac12"},  {190, L"frac34"},
+    {191, L"iquest"},  {192, L"Agrave"},  {193, L"Aacute"},
+    {194, L"Acirc"},   {195, L"Atilde"},  {196, L"Auml"},
+    {197, L"Aring"},   {198, L"AElig"},   {199, L"Ccedil"},
+    {200, L"Egrave"},  {201, L"Eacute"},  {202, L"Ecirc"},
+    {203, L"Euml"},    {204, L"lgrave"},  {205, L"lacute"},
+    {206, L"lcirc"},   {207, L"luml"},    {208, L"ETH"},
+    {209, L"Ntilde"},  {210, L"Ograve"},  {211, L"Oacute"},
+    {212, L"Ocirc"},   {213, L"Otilde"},  {214, L"Ouml"},
+    {215, L"times"},   {216, L"Oslash"},  {217, L"Ugrave"},
+    {218, L"Uacute"},  {219, L"Ucirc"},   {220, L"Uuml"},
+    {221, L"Yacute"},  {222, L"THORN"},   {223, L"szlig"},
+    {224, L"agrave"},  {225, L"aacute"},  {226, L"acirc"},
+    {227, L"atilde"},  {228, L"auml"},    {229, L"aring"},
+    {230, L"aelig"},   {231, L"ccedil"},  {232, L"egrave"},
+    {233, L"eacute"},  {234, L"ecirc"},   {235, L"euml"},
+    {236, L"igrave"},  {237, L"iacute"},  {238, L"icirc"},
+    {239, L"iuml"},    {240, L"eth"},     {241, L"ntilde"},
+    {242, L"ograve"},  {243, L"oacute"},  {244, L"ocirc"},
+    {245, L"otilde"},  {246, L"ouml"},    {247, L"divide"},
+    {248, L"oslash"},  {249, L"ugrave"},  {250, L"uacute"},
+    {251, L"ucirc"},   {252, L"uuml"},    {253, L"yacute"},
+    {254, L"thorn"},   {255, L"yuml"},    {338, L"OElig"},
+    {339, L"oelig"},   {352, L"Scaron"},  {353, L"saron"},
+    {376, L"Yuml"},    {402, L"fnof"},    {710, L"circ"},
+    {732, L"tilde"},   {913, L"Alpha"},   {914, L"Beta"},
+    {915, L"Gamma"},   {916, L"Delta"},   {917, L"Epsilon"},
+    {918, L"Zeta"},    {919, L"Eta"},     {920, L"Theta"},
+    {921, L"lota"},    {922, L"Kappa"},   {923, L"Lambda"},
+    {924, L"Mu"},      {925, L"Nu"},      {926, L"Xi"},
+    {927, L"Omicron"}, {928, L"Pi"},      {929, L"Rho"},
+    {931, L"Sigma"},   {932, L"Tau"},     {933, L"Upsilon"},
+    {934, L"Phi"},     {935, L"Chi"},     {936, L"Psi"},
+    {937, L"Omega"},   {945, L"alpha"},   {946, L"beta"},
+    {947, L"gamma"},   {948, L"delta"},   {949, L"epsilon"},
+    {950, L"zeta"},    {951, L"eta"},     {952, L"theta"},
+    {953, L"iota"},    {954, L"kappa"},   {955, L"lambda"},
+    {956, L"mu"},      {957, L"nu"},      {958, L"xi"},
+    {959, L"omicron"}, {960, L"pi"},      {961, L"rho"},
+    {962, L"sigmaf"},  {963, L"sigma"},   {964, L"tau"},
+    {965, L"upsilon"}, {966, L"phi"},     {967, L"chi"},
+    {968, L"psi"},     {969, L"omega"},   {977, L"thetasym"},
+    {978, L"upsih"},   {982, L"piv"},     {8194, L"ensp"},
+    {8195, L"emsp"},   {8201, L"thinsp"}, {8204, L"zwnj"},
+    {8205, L"zwj"},    {8206, L"lrm"},    {8207, L"rlm"},
+    {8211, L"ndash"},  {8212, L"mdash"},  {8216, L"lsquo"},
+    {8217, L"rsquo"},  {8218, L"sbquo"},  {8220, L"ldquo"},
+    {8221, L"tdquo"},  {8222, L"bdquo"},  {8224, L"dagger"},
+    {8225, L"Dagger"}, {8226, L"bull"},   {8230, L"hellip"},
+    {8240, L"permil"}, {8242, L"prime"},  {8249, L"lsaquo"},
+    {8250, L"rsaquo"}, {8254, L"oline"},  {8260, L"frasl"},
+    {8364, L"euro"},   {8465, L"image"},  {8472, L"weierp"},
+    {8476, L"real"},   {8482, L"trade"},  {8501, L"alefsym"},
+    {8592, L"larr"},   {8593, L"uarr"},   {8594, L"rarr"},
+    {8595, L"darr"},   {8596, L"harr"},   {8629, L"crarr"},
+    {8656, L"lArr"},   {8657, L"uArr"},   {8658, L"rArr"},
+    {8659, L"dArr"},   {8660, L"hArr"},   {8704, L"forall"},
+    {8706, L"part"},   {8707, L"exist"},  {8709, L"empty"},
+    {8711, L"nabla"},  {8712, L"isin"},   {8713, L"notin"},
+    {8715, L"ni"},     {8719, L"prod"},   {8721, L"sum"},
+    {8722, L"minus"},  {8727, L"lowast"}, {8730, L"radic"},
+    {8733, L"prop"},   {8734, L"infin"},  {8736, L"ang"},
+    {8743, L"and"},    {8744, L"or"},     {8745, L"cap"},
+    {8746, L"cup"},    {8747, L"int"},    {8756, L"there4"},
+    {8764, L"sim"},    {8773, L"cong"},   {8776, L"asymp"},
+    {8800, L"ne"},     {8801, L"equiv"},  {8804, L"le"},
+    {8805, L"ge"},     {8834, L"sub"},    {8835, L"sup"},
+    {8836, L"nsub"},   {8838, L"sube"},   {8839, L"supe"},
+    {8853, L"oplus"},  {8855, L"otimes"}, {8869, L"perp"},
+    {8901, L"sdot"},   {8968, L"lceil"},  {8969, L"rceil"},
+    {8970, L"lfloor"}, {8971, L"rfloor"}, {9001, L"lang"},
+    {9002, L"rang"},   {9674, L"loz"},    {9824, L"spades"},
+    {9827, L"clubs"},  {9829, L"hearts"}, {9830, L"diams"},
+};
+
+}  // namespace
+
+void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE dValue = HValueToDouble(hThis, argOne);
+      if (dValue < 0) {
+        dValue = -dValue;
+      }
+      FXJSE_Value_SetDouble(args.GetReturnValue(), dValue);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Abs");
+  }
+}
+void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint32_t uCount = 0;
+  FX_DOUBLE dSum = 0.0;
+  if (argc >= 1) {
+    FXJSE_HVALUE argValue = 0;
+    for (int32_t i = 0; i < argc; i++) {
+      argValue = args.GetValue(i);
+      if (FXJSE_Value_IsNull(argValue)) {
+        FXJSE_Value_Release(argValue);
+        continue;
+      } else if (FXJSE_Value_IsArray(argValue)) {
+        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
+        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+        FXJSE_Value_Release(lengthValue);
+        if (iLength > 2) {
+          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
+          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+          if (FXJSE_Value_IsNull(propertyValue)) {
+            for (int32_t j = 2; j < iLength; j++) {
+              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
+              FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime);
+              GetObjectDefaultValue(jsObjectValue, defaultPropValue);
+              if (!FXJSE_Value_IsNull(defaultPropValue)) {
+                dSum += HValueToDouble(hThis, defaultPropValue);
+                uCount++;
+              }
+              FXJSE_Value_Release(defaultPropValue);
+            }
+          } else {
+            CFX_ByteString propertyStr;
+            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+            for (int32_t j = 2; j < iLength; j++) {
+              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
+              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                        newPropertyValue);
+              if (!FXJSE_Value_IsNull(newPropertyValue)) {
+                dSum += HValueToDouble(hThis, newPropertyValue);
+                uCount++;
+              }
+            }
+            FXJSE_Value_Release(newPropertyValue);
+          }
+          FXJSE_Value_Release(jsObjectValue);
+          FXJSE_Value_Release(propertyValue);
+        }
+      } else {
+        dSum += HValueToDouble(hThis, argValue);
+        uCount++;
+      }
+      FXJSE_Value_Release(argValue);
+    }
+    argValue = 0;
+  }
+  if (0 == uCount) {
+    FXJSE_Value_SetNull(args.GetReturnValue());
+  } else {
+    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount);
+  }
+}
+void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argValue)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FXJSE_Value_SetFloat(args.GetReturnValue(),
+                           FXSYS_ceil(HValueToFloat(hThis, argValue)));
+    }
+    FXJSE_Value_Release(argValue);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Ceil");
+  }
+}
+void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint32_t uCount = 0;
+  FXJSE_HVALUE argValue = 0;
+  for (int32_t i = 0; i < argc; i++) {
+    argValue = args.GetValue(i);
+    if (FXJSE_Value_IsNull(argValue)) {
+      FXJSE_Value_Release(argValue);
+      continue;
+    } else if (FXJSE_Value_IsArray(argValue)) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+      FXJSE_Value_Release(lengthValue);
+      if (iLength > 2) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
+            if (!FXJSE_Value_IsNull(newPropertyValue)) {
+              uCount++;
+            }
+          }
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                      newPropertyValue);
+            uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1);
+          }
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+        FXJSE_Value_Release(newPropertyValue);
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      }
+    } else if (FXJSE_Value_IsObject(argValue)) {
+      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+      GetObjectDefaultValue(argValue, newPropertyValue);
+      if (!FXJSE_Value_IsNull(newPropertyValue)) {
+        uCount++;
+      }
+      FXJSE_Value_Release(newPropertyValue);
+    } else {
+      uCount++;
+    }
+    FXJSE_Value_Release(argValue);
+  }
+  argValue = 0;
+  FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)uCount);
+}
+void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argValue)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FXJSE_Value_SetFloat(args.GetReturnValue(),
+                           FXSYS_floor(HValueToFloat(hThis, argValue)));
+    }
+    FXJSE_Value_Release(argValue);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Floor");
+  }
+}
+void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint32_t uCount = 0;
+  FX_DOUBLE dMaxValue = 0.0;
+  FXJSE_HVALUE argValue = 0;
+  for (int32_t i = 0; i < argc; i++) {
+    argValue = args.GetValue(i);
+    if (FXJSE_Value_IsNull(argValue)) {
+      FXJSE_Value_Release(argValue);
+      continue;
+    } else if (FXJSE_Value_IsArray(argValue)) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+      FXJSE_Value_Release(lengthValue);
+      if (iLength > 2) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
+            if (!FXJSE_Value_IsNull(newPropertyValue)) {
+              uCount++;
+              if (uCount == 1) {
+                dMaxValue = HValueToDouble(hThis, newPropertyValue);
+              } else {
+                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+                if (dMaxValue < dValue) {
+                  dMaxValue = dValue;
+                }
+              }
+            }
+          }
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                      newPropertyValue);
+            if (!FXJSE_Value_IsNull(newPropertyValue)) {
+              uCount++;
+              if (uCount == 1) {
+                dMaxValue = HValueToDouble(hThis, newPropertyValue);
+              } else {
+                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+                if (dMaxValue < dValue) {
+                  dMaxValue = dValue;
+                }
+              }
+            }
+          }
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+        FXJSE_Value_Release(newPropertyValue);
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      }
+    } else if (FXJSE_Value_IsObject(argValue)) {
+      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+      GetObjectDefaultValue(argValue, newPropertyValue);
+      if (!FXJSE_Value_IsNull(newPropertyValue)) {
+        uCount++;
+        if (uCount == 1) {
+          dMaxValue = HValueToDouble(hThis, newPropertyValue);
+        } else {
+          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+          if (dMaxValue < dValue) {
+            dMaxValue = dValue;
+          }
+        }
+      }
+      FXJSE_Value_Release(newPropertyValue);
+    } else {
+      uCount++;
+      if (uCount == 1) {
+        dMaxValue = HValueToDouble(hThis, argValue);
+      } else {
+        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
+        if (dMaxValue < dValue) {
+          dMaxValue = dValue;
+        }
+      }
+    }
+    FXJSE_Value_Release(argValue);
+  }
+  argValue = 0;
+  if (uCount) {
+    FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue);
+  } else {
+    FXJSE_Value_SetNull(args.GetReturnValue());
+  }
+}
+void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint32_t uCount = 0;
+  FX_DOUBLE dMinValue = 0.0;
+  FXJSE_HVALUE argValue = 0;
+  for (int32_t i = 0; i < argc; i++) {
+    argValue = args.GetValue(i);
+    if (FXJSE_Value_IsNull(argValue)) {
+      FXJSE_Value_Release(argValue);
+      continue;
+    } else if (FXJSE_Value_IsArray(argValue)) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+      FXJSE_Value_Release(lengthValue);
+      if (iLength > 2) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
+            if (!FXJSE_Value_IsNull(newPropertyValue)) {
+              uCount++;
+              if (uCount == 1) {
+                dMinValue = HValueToDouble(hThis, newPropertyValue);
+              } else {
+                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+                if (dMinValue > dValue) {
+                  dMinValue = dValue;
+                }
+              }
+            }
+          }
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          for (int32_t i = 2; i < iLength; i++) {
+            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                      newPropertyValue);
+            if (!FXJSE_Value_IsNull(newPropertyValue)) {
+              uCount++;
+              if (uCount == 1) {
+                dMinValue = HValueToDouble(hThis, newPropertyValue);
+              } else {
+                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+                if (dMinValue > dValue) {
+                  dMinValue = dValue;
+                }
+              }
+            }
+          }
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+        FXJSE_Value_Release(newPropertyValue);
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      }
+    } else if (FXJSE_Value_IsObject(argValue)) {
+      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+      GetObjectDefaultValue(argValue, newPropertyValue);
+      if (!FXJSE_Value_IsNull(newPropertyValue)) {
+        uCount++;
+        if (uCount == 1) {
+          dMinValue = HValueToDouble(hThis, newPropertyValue);
+        } else {
+          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
+          if (dMinValue > dValue) {
+            dMinValue = dValue;
+          }
+        }
+      }
+      FXJSE_Value_Release(newPropertyValue);
+    } else {
+      uCount++;
+      if (uCount == 1) {
+        dMinValue = HValueToDouble(hThis, argValue);
+      } else {
+        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
+        if (dMinValue > dValue) {
+          dMinValue = dValue;
+        }
+      }
+    }
+    FXJSE_Value_Release(argValue);
+  }
+  argValue = 0;
+  if (uCount) {
+    FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue);
+  } else {
+    FXJSE_Value_SetNull(args.GetReturnValue());
+  }
+}
+void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FXJSE_HVALUE argTwo = args.GetValue(1);
+    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE dDividend = 0.0;
+      FX_DOUBLE dDividor = 0.0;
+      if (FXJSE_Value_IsArray(argOne)) {
+        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
+        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+        FXJSE_Value_Release(lengthValue);
+        if (iLength > 2) {
+          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
+          FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
+          if (FXJSE_Value_IsNull(propertyValue)) {
+            dDividend = HValueToDouble(hThis, jsObjectValue);
+          } else {
+            CFX_ByteString propertyStr;
+            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                      newPropertyValue);
+            dDividend = HValueToDouble(hThis, newPropertyValue);
+            FXJSE_Value_Release(newPropertyValue);
+          }
+          FXJSE_Value_Release(propertyValue);
+          FXJSE_Value_Release(jsObjectValue);
+        } else {
+          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+        }
+      } else {
+        dDividend = HValueToDouble(hThis, argOne);
+      }
+      if (FXJSE_Value_IsArray(argTwo)) {
+        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectProp(argTwo, "length", lengthValue);
+        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+        FXJSE_Value_Release(lengthValue);
+        if (iLength > 2) {
+          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
+          FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
+          if (FXJSE_Value_IsNull(propertyValue)) {
+            dDividor = HValueToDouble(hThis, jsObjectValue);
+          } else {
+            CFX_ByteString propertyStr;
+            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                      newPropertyValue);
+            dDividor = HValueToDouble(hThis, newPropertyValue);
+            FXJSE_Value_Release(newPropertyValue);
+          }
+          FXJSE_Value_Release(propertyValue);
+          FXJSE_Value_Release(jsObjectValue);
+        } else {
+          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+        }
+      } else {
+        dDividor = HValueToDouble(hThis, argTwo);
+      }
+      if (dDividor) {
+        FXJSE_Value_SetDouble(
+            args.GetReturnValue(),
+            dDividend - dDividor * (int32_t)(dDividend / dDividor));
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Mod");
+  }
+}
+void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint8_t uPrecision = 0;
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE dValue = 0.0;
+      if (FXJSE_Value_IsArray(argOne)) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          dValue = HValueToDouble(hThis, jsObjectValue);
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                    newPropertyValue);
+          dValue = HValueToDouble(hThis, newPropertyValue);
+          FXJSE_Value_Release(newPropertyValue);
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+      } else {
+        dValue = HValueToDouble(hThis, argOne);
+      }
+      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
+      CFX_WideString wsValue = decimalValue;
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());
+    }
+    FXJSE_Value_Release(argOne);
+  } else if (argc == 2) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FXJSE_HVALUE argTwo = args.GetValue(1);
+    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE dValue = 0.0;
+      if (FXJSE_Value_IsArray(argOne)) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          dValue = HValueToDouble(hThis, jsObjectValue);
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                    newPropertyValue);
+          dValue = HValueToDouble(hThis, newPropertyValue);
+          FXJSE_Value_Release(newPropertyValue);
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+      } else {
+        dValue = HValueToDouble(hThis, argOne);
+      }
+      FX_DOUBLE dPrecision = 0.0;
+      if (FXJSE_Value_IsArray(argTwo)) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
+        FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          dPrecision = HValueToDouble(hThis, jsObjectValue);
+        } else {
+          CFX_ByteString propertyStr;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                    newPropertyValue);
+          dPrecision = HValueToDouble(hThis, newPropertyValue);
+          FXJSE_Value_Release(newPropertyValue);
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+      } else {
+        dPrecision = HValueToDouble(hThis, argTwo);
+      }
+      if (dPrecision < 0) {
+        uPrecision = 0;
+      } else if (dPrecision > 12.0) {
+        uPrecision = 12;
+      } else {
+        uPrecision = (uint8_t)dPrecision;
+      }
+      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
+      CFX_WideString wsValue = decimalValue;
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Round");
+  }
+}
+void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  uint32_t uCount = 0;
+  FX_DOUBLE dSum = 0.0;
+  if (argc) {
+    FXJSE_HVALUE argValue = 0;
+    for (int32_t i = 0; i < argc; i++) {
+      argValue = args.GetValue(i);
+      if (FXJSE_Value_IsNull(argValue)) {
+        FXJSE_Value_Release(argValue);
+        continue;
+      } else if (FXJSE_Value_IsArray(argValue)) {
+        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
+        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+        FXJSE_Value_Release(lengthValue);
+        if (iLength > 2) {
+          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
+          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+          if (FXJSE_Value_IsNull(propertyValue)) {
+            for (int32_t j = 2; j < iLength; j++) {
+              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
+              GetObjectDefaultValue(jsObjectValue, newPropertyValue);
+              if (!FXJSE_Value_IsNull(newPropertyValue)) {
+                dSum += HValueToDouble(hThis, jsObjectValue);
+                uCount++;
+              }
+            }
+          } else {
+            CFX_ByteString propertyStr;
+            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+            for (int32_t j = 2; j < iLength; j++) {
+              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
+              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
+                                        newPropertyValue);
+              if (!FXJSE_Value_IsNull(newPropertyValue)) {
+                dSum += HValueToDouble(hThis, newPropertyValue);
+                uCount++;
+              }
+            }
+          }
+          FXJSE_Value_Release(newPropertyValue);
+          FXJSE_Value_Release(jsObjectValue);
+          FXJSE_Value_Release(propertyValue);
+        } else {
+          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+        }
+      } else if (FXJSE_Value_IsObject(argValue)) {
+        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+        GetObjectDefaultValue(argValue, newPropertyValue);
+        if (!FXJSE_Value_IsNull(newPropertyValue)) {
+          dSum += HValueToDouble(hThis, argValue);
+          uCount++;
+        }
+        FXJSE_Value_Release(newPropertyValue);
+      } else {
+        dSum += HValueToDouble(hThis, argValue);
+        uCount++;
+      }
+      FXJSE_Value_Release(argValue);
+    }
+    argValue = 0;
+  }
+  if (uCount < 1) {
+    FXJSE_Value_SetNull(args.GetReturnValue());
+  } else {
+    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum);
+  }
+}
+void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  if (args.GetLength() == 0) {
+    struct tm* pTmStruct = 0;
+    time_t currentTime;
+    time(&currentTime);
+    pTmStruct = gmtime(&currentTime);
+    CFX_ByteString bufferYear;
+    CFX_ByteString bufferMon;
+    CFX_ByteString bufferDay;
+    bufferYear.Format("%d", pTmStruct->tm_year + 1900);
+    bufferMon.Format("%02d", pTmStruct->tm_mon + 1);
+    bufferDay.Format("%02d", pTmStruct->tm_mday);
+    CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay;
+    int32_t dDays = DateString2Num(bufferCurrent);
+    FXJSE_Value_SetInteger(args.GetReturnValue(), dDays);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Date");
+  }
+}
+void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    CFX_ByteString dateString;
+    CFX_ByteString formatString;
+    CFX_ByteString localString;
+    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE formatValue = 0;
+    FXJSE_HVALUE localValue = 0;
+    if (HValueIsNull(hThis, dateValue)) {
+      bFlags = TRUE;
+    } else {
+      HValueToUTF8String(dateValue, dateString);
+    }
+    if (argc > 1) {
+      formatValue = GetSimpleHValue(hThis, args, 1);
+      if (HValueIsNull(hThis, formatValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(formatValue, formatString);
+      }
+    }
+    if (argc == 3) {
+      localValue = GetSimpleHValue(hThis, args, 2);
+      if (HValueIsNull(hThis, localValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localValue, localString);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString szIsoDateString;
+      FX_BOOL bRet = Local2IsoDate(hThis, dateString, formatString, localString,
+                                   szIsoDateString);
+      if (bRet) {
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               DateString2Num(szIsoDateString));
+      } else {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+      }
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(dateValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(formatValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Date2Num");
+  }
+}
+void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc < 3) {
+    FX_BOOL bFlags = FALSE;
+    int32_t iStyle = 0;
+    CFX_ByteString szLocal;
+    FXJSE_HVALUE argStyle = 0;
+    FXJSE_HVALUE argLocal = 0;
+    if (argc > 0) {
+      argStyle = GetSimpleHValue(hThis, args, 0);
+      if (FXJSE_Value_IsNull(argStyle)) {
+        bFlags = TRUE;
+      }
+      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
+      if (iStyle > 4 || iStyle < 0) {
+        iStyle = 0;
+      }
+    }
+    if (argc == 2) {
+      argLocal = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argLocal)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(argLocal, szLocal);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString formatStr;
+      GetStandardDateFormat(hThis, iStyle, szLocal, formatStr);
+      if (formatStr.IsEmpty()) {
+        formatStr = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    if (argc > 0) {
+      FXJSE_Value_Release(argStyle);
+      if (argc == 2) {
+        FXJSE_Value_Release(argLocal);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Date2Num");
+  }
+}
+void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis,
+                                    const CFX_ByteStringC& szFuncName,
+                                    CFXJSE_Arguments& args) {
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString szArgString;
+      HValueToUTF8String(argOne, szArgString);
+      int32_t dDays = DateString2Num(szArgString);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"IsoDate2Num");
+  }
+}
+void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis,
+                                    const CFX_ByteStringC& szFuncName,
+                                    CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CXFA_Document* pDoc = pContext->GetDocument();
+      FXSYS_assert(pDoc);
+      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+      CFX_ByteString szArgString;
+      HValueToUTF8String(argOne, szArgString);
+      szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1);
+      if (szArgString.IsEmpty()) {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+        FXJSE_Value_Release(argOne);
+        return;
+      }
+      CXFA_LocaleValue timeValue(
+          XFA_VT_TIME,
+          CFX_WideString::FromUTF8(szArgString, szArgString.GetLength()),
+          (CXFA_LocaleMgr*)pMgr);
+      if (timeValue.IsValid()) {
+        CFX_Unitime uniTime = timeValue.GetTime();
+        int32_t hour = uniTime.GetHour();
+        int32_t min = uniTime.GetMinute();
+        int32_t second = uniTime.GetSecond();
+        int32_t milSecond = uniTime.GetMillisecond();
+        IFX_Locale* pDefLocale = pMgr->GetDefLocale();
+        FXSYS_assert(pDefLocale);
+        FX_TIMEZONE tzLocale;
+        pDefLocale->GetTimeZone(tzLocale);
+        int32_t mins = hour * 60 + min;
+        mins -= (tzLocale.tzHour * 60);
+        while (mins > 1440) {
+          mins -= 1440;
+        }
+        while (mins < 0) {
+          mins += 1440;
+        }
+        hour = mins / 60;
+        min = mins % 60;
+        int32_t iResult =
+            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
+        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
+      } else {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"IsoTime2Num");
+  }
+}
+void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc < 3) {
+    FX_BOOL bFlags = FALSE;
+    int32_t iStyle = 0;
+    CFX_ByteString szLocal;
+    FXJSE_HVALUE argStyle = 0;
+    FXJSE_HVALUE argLocal = 0;
+    if (argc > 0) {
+      argStyle = GetSimpleHValue(hThis, args, 0);
+      if (FXJSE_Value_IsNull(argStyle)) {
+        bFlags = TRUE;
+      }
+      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
+      if (iStyle > 4 || iStyle < 0) {
+        iStyle = 0;
+      }
+    }
+    if (argc == 2) {
+      argLocal = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argLocal)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(argLocal, szLocal);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString formatStr;
+      GetLocalDateFormat(hThis, iStyle, szLocal, formatStr, FALSE);
+      if (formatStr.IsEmpty()) {
+        formatStr = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    if (argc > 0) {
+      FXJSE_Value_Release(argStyle);
+      if (argc == 2) {
+        FXJSE_Value_Release(argLocal);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"LocalDateFmt");
+  }
+}
+void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc < 3) {
+    FX_BOOL bFlags = FALSE;
+    int32_t iStyle = 0;
+    CFX_ByteString szLocal;
+    FXJSE_HVALUE argStyle = 0;
+    FXJSE_HVALUE argLocal = 0;
+    if (argc > 0) {
+      argStyle = GetSimpleHValue(hThis, args, 0);
+      if (FXJSE_Value_IsNull(argStyle)) {
+        bFlags = TRUE;
+      }
+      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
+      if (iStyle > 4 || iStyle < 0) {
+        iStyle = 0;
+      }
+    }
+    if (argc == 2) {
+      argLocal = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argLocal)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(argLocal, szLocal);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString formatStr;
+      GetLocalTimeFormat(hThis, iStyle, szLocal, formatStr, FALSE);
+      if (formatStr.IsEmpty()) {
+        formatStr = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    if (argc > 0) {
+      FXJSE_Value_Release(argStyle);
+      if (argc == 2) {
+        FXJSE_Value_Release(argLocal);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"LocalTimeFmt");
+  }
+}
+void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    int32_t dDate;
+    CFX_ByteString formatString;
+    CFX_ByteString localString;
+    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE formatValue = 0;
+    FXJSE_HVALUE localValue = 0;
+    if (HValueIsNull(hThis, dateValue)) {
+      bFlags = TRUE;
+    } else {
+      dDate = (int32_t)HValueToFloat(hThis, dateValue);
+      bFlags = dDate < 1;
+    }
+    if (argc > 1) {
+      formatValue = GetSimpleHValue(hThis, args, 1);
+      if (HValueIsNull(hThis, formatValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(formatValue, formatString);
+      }
+    }
+    if (argc == 3) {
+      localValue = GetSimpleHValue(hThis, args, 2);
+      if (HValueIsNull(hThis, localValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localValue, localString);
+      }
+    }
+    if (!bFlags) {
+      int32_t iYear = 1900;
+      int32_t iMonth = 1;
+      int32_t iDay = 1;
+      int32_t i = 0;
+      while (dDate > 0) {
+        if (iMonth == 2) {
+          if ((!((iYear + i) % 4) && ((iYear + i) % 100)) ||
+              !((iYear + i) % 400)) {
+            if (dDate > 29) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 29;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          } else {
+            if (dDate > 28) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 28;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          }
+        } else if (iMonth < 8) {
+          if ((iMonth % 2 == 0)) {
+            if (dDate > 30) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 30;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          } else {
+            if (dDate > 31) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 31;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          }
+        } else {
+          if (iMonth % 2 != 0) {
+            if (dDate > 30) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 30;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          } else {
+            if (dDate > 31) {
+              ++iMonth;
+              if (iMonth > 12) {
+                iMonth = 1;
+                ++i;
+              }
+              iDay = 1;
+              dDate -= 31;
+            } else {
+              iDay += static_cast<int32_t>(dDate) - 1;
+              dDate = 0;
+            }
+          }
+        }
+      }
+      CFX_ByteString szIsoDateString;
+      szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay);
+      CFX_ByteString szLocalDateString;
+      IsoDate2Local(hThis, szIsoDateString, formatString, localString,
+                    szLocalDateString);
+      if (szLocalDateString.IsEmpty()) {
+        szLocalDateString = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalDateString);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(dateValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(formatValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Num2Date");
+  }
+}
+void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis,
+                                   const CFX_ByteStringC& szFuncName,
+                                   CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    int32_t iTime;
+    CFX_ByteString formatString;
+    CFX_ByteString localString;
+    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE formatValue = 0;
+    FXJSE_HVALUE localValue = 0;
+    if (FXJSE_Value_IsNull(timeValue)) {
+      bFlags = TRUE;
+    } else {
+      iTime = (int32_t)HValueToFloat(hThis, timeValue);
+      if (FXSYS_abs(iTime) < 1.0) {
+        bFlags = TRUE;
+      }
+    }
+    if (argc > 1) {
+      formatValue = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(formatValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(formatValue, formatString);
+      }
+    }
+    if (argc == 3) {
+      localValue = GetSimpleHValue(hThis, args, 2);
+      if (FXJSE_Value_IsNull(localValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localValue, localString);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString szGMTTimeString;
+      Num2AllTime(hThis, iTime, formatString, localString, TRUE,
+                  szGMTTimeString);
+      if (szGMTTimeString.IsEmpty()) {
+        szGMTTimeString = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szGMTTimeString);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(timeValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(formatValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Num2GMTime");
+  }
+}
+void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT fTime;
+    CFX_ByteString formatString;
+    CFX_ByteString localString;
+    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE formatValue = 0;
+    FXJSE_HVALUE localValue = 0;
+    if (FXJSE_Value_IsNull(timeValue)) {
+      bFlags = TRUE;
+    } else {
+      fTime = HValueToFloat(hThis, timeValue);
+      if (FXSYS_fabs(fTime) < 1.0) {
+        bFlags = TRUE;
+      }
+    }
+    if (argc > 1) {
+      formatValue = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(formatValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(formatValue, formatString);
+      }
+    }
+    if (argc == 3) {
+      localValue = GetSimpleHValue(hThis, args, 2);
+      if (FXJSE_Value_IsNull(localValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localValue, localString);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString szLocalTimeString;
+      Num2AllTime(hThis, (int32_t)fTime, formatString, localString, FALSE,
+                  szLocalTimeString);
+      if (szLocalTimeString.IsEmpty()) {
+        szLocalTimeString = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalTimeString);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(timeValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(formatValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Num2Time");
+  }
+}
+void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  if (args.GetLength() == 0) {
+    time_t now;
+    time(&now);
+    struct tm* pGmt = gmtime(&now);
+    int32_t iGMHour = pGmt->tm_hour;
+    int32_t iGMMin = pGmt->tm_min;
+    int32_t iGMSec = pGmt->tm_sec;
+    FXJSE_Value_SetInteger(args.GetReturnValue(),
+                           ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000));
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Time");
+  }
+}
+void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    CFX_ByteString timeString;
+    CFX_ByteString formatString;
+    CFX_ByteString localString;
+    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE formatValue = 0;
+    FXJSE_HVALUE localValue = 0;
+    if (HValueIsNull(hThis, timeValue)) {
+      bFlags = TRUE;
+    } else {
+      HValueToUTF8String(timeValue, timeString);
+    }
+    if (argc > 1) {
+      formatValue = GetSimpleHValue(hThis, args, 1);
+      if (HValueIsNull(hThis, formatValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(formatValue, formatString);
+      }
+    }
+    if (argc == 3) {
+      localValue = GetSimpleHValue(hThis, args, 2);
+      if (HValueIsNull(hThis, localValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localValue, localString);
+      }
+    }
+    if (!bFlags) {
+      CXFA_FM2JSContext* pContext =
+          (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+      CXFA_Document* pDoc = pContext->GetDocument();
+      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+      IFX_Locale* pLocale = NULL;
+      if (localString.IsEmpty()) {
+        CXFA_Node* pThisNode =
+            ToNode(pDoc->GetScriptContext()->GetThisObject());
+        FXSYS_assert(pThisNode);
+        CXFA_WidgetData widgetData(pThisNode);
+        pLocale = widgetData.GetLocal();
+      } else {
+        pLocale = pMgr->GetLocaleByName(
+            CFX_WideString::FromUTF8(localString, localString.GetLength()));
+      }
+      CFX_WideString wsFormat;
+      if (formatString.IsEmpty()) {
+        pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+      } else {
+        wsFormat =
+            CFX_WideString::FromUTF8(formatString, formatString.GetLength());
+      }
+      wsFormat = FX_WSTRC(L"time{") + wsFormat;
+      wsFormat += FX_WSTRC(L"}");
+      CXFA_LocaleValue timeValue(
+          XFA_VT_TIME,
+          CFX_WideString::FromUTF8(timeString, timeString.GetLength()),
+          wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);
+      if (timeValue.IsValid()) {
+        CFX_Unitime uniTime = timeValue.GetTime();
+        int32_t hour = uniTime.GetHour();
+        int32_t min = uniTime.GetMinute();
+        int32_t second = uniTime.GetSecond();
+        int32_t milSecond = uniTime.GetMillisecond();
+        int32_t mins = hour * 60 + min;
+        IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
+        if (pProvider) {
+          FX_TIMEZONE tz;
+          pProvider->GetTimeZone(tz);
+          mins -= (tz.tzHour * 60);
+          while (mins > 1440) {
+            mins -= 1440;
+          }
+          while (mins < 0) {
+            mins += 1440;
+          }
+          hour = mins / 60;
+          min = mins % 60;
+        }
+        int32_t iResult =
+            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
+        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
+      } else {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+      }
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(timeValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(formatValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Time2Num");
+  }
+}
+void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc < 3) {
+    FX_BOOL bFlags = FALSE;
+    int32_t iStyle = 0;
+    CFX_ByteString szLocal;
+    FXJSE_HVALUE argStyle = 0;
+    FXJSE_HVALUE argLocal = 0;
+    if (argc > 0) {
+      argStyle = GetSimpleHValue(hThis, args, 0);
+      if (FXJSE_Value_IsNull(argStyle)) {
+        bFlags = TRUE;
+      }
+      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
+      if (iStyle > 4 || iStyle < 0) {
+        iStyle = 0;
+      }
+    }
+    if (argc == 2) {
+      argLocal = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argLocal)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(argLocal, szLocal);
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString formatStr;
+      GetStandardTimeFormat(hThis, iStyle, szLocal, formatStr);
+      if (formatStr.IsEmpty()) {
+        formatStr = "";
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    if (argc > 0) {
+      FXJSE_Value_Release(argStyle);
+      if (argc == 2) {
+        FXJSE_Value_Release(argLocal);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"TimeFmt");
+  }
+}
+FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(const FX_CHAR* pData,
+                                           int32_t iLength,
+                                           int32_t& iStyle,
+                                           int32_t& iYear,
+                                           int32_t& iMonth,
+                                           int32_t& iDay) {
+  iYear = 0;
+  iMonth = 1;
+  iDay = 1;
+  FX_BOOL iRet = FALSE;
+  if (iLength < 4) {
+    return iRet;
+  }
+  FX_CHAR strYear[5];
+  strYear[4] = '\0';
+  for (int32_t i = 0; i < 4; ++i) {
+    if (*(pData + i) <= '9' && *(pData + i) >= '0') {
+      strYear[i] = *(pData + i);
+    } else {
+      return iRet;
+    }
+  }
+  iYear = FXSYS_atoi(strYear);
+  iStyle = 0;
+  if (iLength > 4) {
+    if (*(pData + 4) == '-') {
+      iStyle = 1;
+    } else {
+      iStyle = 0;
+    }
+  } else {
+    iRet = TRUE;
+    return iRet;
+  }
+  FX_CHAR strTemp[3];
+  strTemp[2] = '\0';
+  int32_t iPosOff = 0;
+  if (iStyle == 0) {
+    iPosOff = 4;
+    if (iLength == 4) {
+      iRet = TRUE;
+      return iRet;
+    }
+  } else {
+    iPosOff = 5;
+    if (iLength == 4) {
+      iRet = TRUE;
+      return iRet;
+    }
+  }
+  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
+      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
+    return iRet;
+  }
+  strTemp[0] = *(pData + iPosOff);
+  strTemp[1] = *(pData + iPosOff + 1);
+  iMonth = FXSYS_atoi(strTemp);
+  if (iMonth > 12 || iMonth < 1) {
+    return iRet;
+  }
+  if (iStyle == 0) {
+    iPosOff += 2;
+    if (iLength == 6) {
+      iRet = 1;
+      return iRet;
+    }
+  } else {
+    iPosOff += 3;
+    if (iLength == 7) {
+      iRet = 1;
+      return iRet;
+    }
+  }
+  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
+      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
+    return iRet;
+  }
+  strTemp[0] = *(pData + iPosOff);
+  strTemp[1] = *(pData + iPosOff + 1);
+  iDay = FXSYS_atoi(strTemp);
+  if (iPosOff + 2 < iLength) {
+    return iRet;
+  }
+  if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
+    if (iMonth == 2) {
+      if (iDay > 29) {
+        return iRet;
+      }
+    } else {
+      if (iMonth < 8) {
+        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
+          return iRet;
+        }
+      } else {
+        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
+          return iRet;
+        }
+      }
+    }
+  } else {
+    if (iMonth == 2) {
+      if (iDay > 28) {
+        return iRet;
+      }
+    } else {
+      if (iMonth < 8) {
+        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
+          return iRet;
+        }
+      } else {
+        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
+          return iRet;
+        }
+      }
+    }
+  }
+  iRet = TRUE;
+  return iRet;
+}
+FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(const FX_CHAR* pData,
+                                           int32_t iLength,
+                                           int32_t& iHour,
+                                           int32_t& iMinute,
+                                           int32_t& iSecond,
+                                           int32_t& iMilliSecond,
+                                           int32_t& iZoneHour,
+                                           int32_t& iZoneMinute) {
+  iHour = 0;
+  iMinute = 0;
+  iSecond = 0;
+  iMilliSecond = 0;
+  iZoneHour = 0;
+  iZoneMinute = 0;
+  if (!pData) {
+    return FALSE;
+  }
+  int32_t iRet = FALSE;
+  FX_CHAR strTemp[3];
+  strTemp[2] = '\0';
+  int32_t iIndex = 0;
+  int32_t iZone = 0;
+  int32_t i = iIndex;
+  while (i < iLength) {
+    if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':') {
+      iZone = i;
+      break;
+    }
+    ++i;
+  }
+  if (i == iLength) {
+    iZone = iLength;
+  }
+  int32_t iPos = 0;
+  while (iIndex < iZone) {
+    if (iIndex >= iZone) {
+      break;
+    }
+    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
+      return iRet;
+    }
+    strTemp[0] = *(pData + iIndex);
+    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
+      return iRet;
+    }
+    strTemp[1] = *(pData + iIndex + 1);
+    if (FXSYS_atoi(strTemp) > 60) {
+      return iRet;
+    }
+    if (*(pData + 2) == ':') {
+      if (iPos == 0) {
+        iHour = FXSYS_atoi(strTemp);
+        ++iPos;
+      } else if (iPos == 1) {
+        iMinute = FXSYS_atoi(strTemp);
+        ++iPos;
+      } else {
+        iSecond = FXSYS_atoi(strTemp);
+      }
+      iIndex += 3;
+    } else {
+      if (iPos == 0) {
+        iHour = FXSYS_atoi(strTemp);
+        ++iPos;
+      } else if (iPos == 1) {
+        iMinute = FXSYS_atoi(strTemp);
+        ++iPos;
+      } else if (iPos == 2) {
+        iSecond = FXSYS_atoi(strTemp);
+        ++iPos;
+      }
+      iIndex += 2;
+    }
+  }
+  if (*(pData + iIndex) == '.') {
+    ++iIndex;
+    FX_CHAR strTemp[4];
+    strTemp[3] = '\0';
+    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
+      return iRet;
+    }
+    strTemp[0] = *(pData + iIndex);
+    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
+      return iRet;
+    }
+    strTemp[1] = *(pData + iIndex + 1);
+    if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') {
+      return iRet;
+    }
+    strTemp[2] = *(pData + iIndex + 2);
+    iMilliSecond = FXSYS_atoi(strTemp);
+    if (iMilliSecond > 100) {
+      iMilliSecond = 0;
+      return iRet;
+    }
+    iIndex += 3;
+  }
+  int32_t iSign = 1;
+  if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') {
+    iRet = 1;
+    return iRet;
+  } else if (*(pData + iIndex) == '+') {
+    ++iIndex;
+  } else if (*(pData + iIndex) == '-') {
+    iSign = -1;
+    ++iIndex;
+  }
+  iPos = 0;
+  while (iIndex < iLength) {
+    if (iIndex >= iLength) {
+      return iRet;
+    }
+    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
+      return iRet;
+    }
+    strTemp[0] = *(pData + iIndex);
+    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
+      return iRet;
+    }
+    strTemp[1] = *(pData + iIndex + 1);
+    if (FXSYS_atoi(strTemp) > 60) {
+      return iRet;
+    }
+    if (*(pData + 2) == ':') {
+      if (iPos == 0) {
+        iZoneHour = FXSYS_atoi(strTemp);
+      } else if (iPos == 1) {
+        iZoneMinute = FXSYS_atoi(strTemp);
+      }
+      iIndex += 3;
+    } else {
+      if (!iPos) {
+        iZoneHour = FXSYS_atoi(strTemp);
+        ++iPos;
+      } else if (iPos == 1) {
+        iZoneMinute = FXSYS_atoi(strTemp);
+        ++iPos;
+      }
+      iIndex += 2;
+    }
+  }
+  if (iIndex < iLength) {
+    return iRet;
+  }
+  iZoneHour *= iSign;
+  iRet = TRUE;
+  return iRet;
+}
+FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(const FX_CHAR* pData,
+                                               int32_t iLength,
+                                               int32_t& iYear,
+                                               int32_t& iMonth,
+                                               int32_t& iDay,
+                                               int32_t& iHour,
+                                               int32_t& iMinute,
+                                               int32_t& iSecond,
+                                               int32_t& iMillionSecond,
+                                               int32_t& iZoneHour,
+                                               int32_t& iZoneMinute) {
+  iYear = 0;
+  iMonth = 0;
+  iDay = 0;
+  iHour = 0;
+  iMinute = 0;
+  iSecond = 0;
+  if (!pData) {
+    return FALSE;
+  }
+  int32_t iRet = FALSE;
+  int32_t iIndex = 0;
+  while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
+    if (iIndex >= iLength) {
+      return iRet;
+    }
+    ++iIndex;
+  }
+  if (iIndex != 8 && iIndex != 10) {
+    return iRet;
+  }
+  int32_t iStyle = -1;
+  iRet = IsIsoDateFormat(pData, iIndex, iStyle, iYear, iMonth, iDay);
+  if (!iRet) {
+    return iRet;
+  }
+  if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
+    return iRet;
+  }
+  ++iIndex;
+  if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) &&
+      (iLength - iIndex != 15)) {
+    return iRet;
+  }
+  iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute,
+                         iSecond, iMillionSecond, iZoneHour, iZoneMinute);
+  if (!iRet) {
+    return iRet;
+  }
+  iRet = TRUE;
+  return iRet;
+}
+FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szDate,
+                                         const CFX_ByteStringC& szFormat,
+                                         const CFX_ByteStringC& szLocale,
+                                         CFX_ByteString& strIsoDate) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return FALSE;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocale.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
+  }
+  if (!pLocale) {
+    return FALSE;
+  }
+  CFX_WideString wsFormat;
+  if (szFormat.IsEmpty()) {
+    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+  } else {
+    wsFormat =
+        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
+  }
+  CXFA_LocaleValue widgetValue(
+      XFA_VT_DATE,
+      CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), wsFormat,
+      pLocale, (CXFA_LocaleMgr*)pMgr);
+  CFX_Unitime dt = widgetValue.GetDate();
+  strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay());
+  return TRUE;
+}
+FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szTime,
+                                         const CFX_ByteStringC& szFormat,
+                                         const CFX_ByteStringC& szLocale,
+                                         CFX_ByteString& strIsoTime) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return FALSE;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocale.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
+  }
+  if (!pLocale) {
+    return FALSE;
+  }
+  CFX_WideString wsFormat;
+  if (szFormat.IsEmpty()) {
+    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+  } else {
+    wsFormat =
+        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
+  }
+  wsFormat = FX_WSTRC(L"time{") + wsFormat;
+  wsFormat += FX_WSTRC(L"}");
+  CXFA_LocaleValue widgetValue(
+      XFA_VT_TIME,
+      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), wsFormat,
+      pLocale, (CXFA_LocaleMgr*)pMgr);
+  CFX_Unitime utime = widgetValue.GetTime();
+  strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(),
+                    utime.GetSecond(), utime.GetMillisecond());
+  return TRUE;
+}
+FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szDate,
+                                         const CFX_ByteStringC& szFormat,
+                                         const CFX_ByteStringC& szLocale,
+                                         CFX_ByteString& strLocalDate) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return FALSE;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocale.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
+  }
+  if (!pLocale) {
+    return FALSE;
+  }
+  CFX_WideString wsFormat;
+  if (szFormat.IsEmpty()) {
+    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+  } else {
+    wsFormat =
+        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
+  }
+  CXFA_LocaleValue widgetValue(
+      XFA_VT_DATE,
+      CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()),
+      (CXFA_LocaleMgr*)pMgr);
+  CFX_WideString wsRet;
+  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
+                             XFA_VALUEPICTURE_Display);
+  strLocalDate = FX_UTF8Encode(wsRet, wsRet.GetLength());
+  return TRUE;
+}
+FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szTime,
+                                         const CFX_ByteStringC& szFormat,
+                                         const CFX_ByteStringC& szLocale,
+                                         CFX_ByteString& strLocalTime) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return FALSE;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocale.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
+  }
+  if (!pLocale) {
+    return FALSE;
+  }
+  CFX_WideString wsFormat;
+  if (szFormat.IsEmpty()) {
+    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+  } else {
+    wsFormat =
+        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
+  }
+  wsFormat = FX_WSTRC(L"time{") + wsFormat;
+  wsFormat += FX_WSTRC(L"}");
+  CXFA_LocaleValue widgetValue(
+      XFA_VT_TIME,
+      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()),
+      (CXFA_LocaleMgr*)pMgr);
+  CFX_WideString wsRet;
+  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
+                             XFA_VALUEPICTURE_Display);
+  strLocalTime = FX_UTF8Encode(wsRet, wsRet.GetLength());
+  return TRUE;
+}
+FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis,
+                                      const CFX_ByteStringC& szTime,
+                                      const CFX_ByteStringC& szFormat,
+                                      const CFX_ByteStringC& szLocale,
+                                      CFX_ByteString& strGMTTime) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return FALSE;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocale.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
+  }
+  if (!pLocale) {
+    return FALSE;
+  }
+  CFX_WideString wsFormat;
+  if (szFormat.IsEmpty()) {
+    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+  } else {
+    wsFormat =
+        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
+  }
+  wsFormat = FX_WSTRC(L"time{") + wsFormat;
+  wsFormat += FX_WSTRC(L"}");
+  CXFA_LocaleValue widgetValue(
+      XFA_VT_TIME,
+      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()),
+      (CXFA_LocaleMgr*)pMgr);
+  CFX_WideString wsRet;
+  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
+                             XFA_VALUEPICTURE_Display);
+  strGMTTime = FX_UTF8Encode(wsRet, wsRet.GetLength());
+  return TRUE;
+}
+int32_t CXFA_FM2JSContext::DateString2Num(const CFX_ByteStringC& szDateString) {
+  FX_BOOL bFlags = FALSE;
+  int32_t iLength = szDateString.GetLength();
+  FX_BOOL iRet = FALSE;
+  int32_t iStyle = -1;
+  int32_t iYear = 0;
+  int32_t iMonth = 0;
+  int32_t iDay = 0;
+  int32_t iHour = 0;
+  int32_t iMinute = 0;
+  int32_t iSecond = 0;
+  int32_t iMillionSecond = 0;
+  int32_t iZoneHour = 0;
+  int32_t iZoneMinute = 0;
+  if (iLength <= 10) {
+    iRet = IsIsoDateFormat(szDateString.GetCStr(), iLength, iStyle, iYear,
+                           iMonth, iDay);
+  } else {
+    iRet = IsIsoDateTimeFormat(szDateString.GetCStr(), iLength, iYear, iMonth,
+                               iDay, iHour, iMinute, iSecond, iMillionSecond,
+                               iZoneHour, iZoneMinute);
+  }
+  if (!iRet) {
+    bFlags = TRUE;
+  }
+  FX_FLOAT dDays = 0;
+  int32_t i = 1;
+  if (iYear < 1900) {
+    bFlags = TRUE;
+  }
+  if (!bFlags) {
+    while (iYear - i >= 1900) {
+      if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) {
+        dDays += 366;
+      } else {
+        dDays += 365;
+      }
+      ++i;
+    }
+    i = 1;
+    while (i < iMonth) {
+      if (i == 2) {
+        if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
+          dDays += 29;
+        } else {
+          dDays += 28;
+        }
+      } else if (i <= 7) {
+        if (i % 2 == 0) {
+          dDays += 30;
+        } else {
+          dDays += 31;
+        }
+      } else {
+        if (i % 2 == 0) {
+          dDays += 31;
+        } else {
+          dDays += 30;
+        }
+      }
+      ++i;
+    }
+    i = 0;
+    while (iDay - i > 0) {
+      dDays += 1;
+      ++i;
+    }
+  } else {
+    dDays = 0;
+  }
+  return (int32_t)dDays;
+}
+#define XFA_N 19
+static uint8_t g_sAltTable_Date[] = {
+    XFA_N, XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, 2,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, 1,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+};
+static uint8_t g_sAltTable_Time[] = {
+    14,    XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N,
+    XFA_N, 6,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 7,     XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, 1,     17,    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
+};
+static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString& wsPattern,
+                                            const CFX_WideString& wsAltSymbols,
+                                            uint8_t* pAltTable) {
+  int32_t nLength = wsPattern.GetLength();
+  FX_BOOL bInConstRange = FALSE;
+  FX_BOOL bEscape = FALSE;
+  int32_t i = 0, n = 0;
+  while (i < nLength) {
+    FX_WCHAR wc = wsPattern[i];
+    if (wc == L'\'') {
+      bInConstRange = !bInConstRange;
+      if (bEscape) {
+        i++;
+      } else {
+        wsPattern.Delete(i);
+        nLength--;
+      }
+      bEscape = !bEscape;
+      continue;
+    }
+    if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) {
+      int32_t nAlt = (int32_t)pAltTable[n];
+      if (nAlt != XFA_N) {
+        wsPattern.SetAt(i, wsAltSymbols[nAlt]);
+      }
+    }
+    i++;
+    bEscape = FALSE;
+  }
+}
+#undef XFA_N
+void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis,
+                                           int32_t iStyle,
+                                           const CFX_ByteStringC& szLocalStr,
+                                           CFX_ByteString& strFormat,
+                                           FX_BOOL bStandard) {
+  FX_LOCALEDATETIMESUBCATEGORY strStyle;
+  switch (iStyle) {
+    case 0:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+    case 1:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
+      break;
+    case 2:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+    case 3:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
+      break;
+    case 4:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
+      break;
+    default:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+  }
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocalStr.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));
+  }
+  if (!pLocale) {
+    return;
+  }
+  CFX_WideString strRet;
+  pLocale->GetDatePattern(strStyle, strRet);
+  if (!bStandard) {
+    CFX_WideString wsSymbols;
+    pLocale->GetDateTimeSymbols(wsSymbols);
+    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date);
+  }
+  strFormat = FX_UTF8Encode(strRet, strRet.GetLength());
+}
+void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis,
+                                           int32_t iStyle,
+                                           const CFX_ByteStringC& szLocalStr,
+                                           CFX_ByteString& strFormat,
+                                           FX_BOOL bStandard) {
+  FX_LOCALEDATETIMESUBCATEGORY strStyle;
+  switch (iStyle) {
+    case 0:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+    case 1:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
+      break;
+    case 2:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+    case 3:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
+      break;
+    case 4:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
+      break;
+    default:
+      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
+      break;
+  }
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return;
+  }
+  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+  IFX_Locale* pLocale = NULL;
+  if (szLocalStr.IsEmpty()) {
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    pLocale = widgetData.GetLocal();
+  } else {
+    pLocale = pMgr->GetLocaleByName(
+        CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));
+  }
+  if (!pLocale) {
+    return;
+  }
+  CFX_WideString strRet;
+  pLocale->GetTimePattern(strStyle, strRet);
+  if (!bStandard) {
+    CFX_WideString wsSymbols;
+    pLocale->GetDateTimeSymbols(wsSymbols);
+    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time);
+  }
+  strFormat = FX_UTF8Encode(strRet, strRet.GetLength());
+}
+void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis,
+                                              int32_t iStyle,
+                                              const CFX_ByteStringC& szLocalStr,
+                                              CFX_ByteString& strFormat) {
+  GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
+}
+void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis,
+                                              int32_t iStyle,
+                                              const CFX_ByteStringC& szLocalStr,
+                                              CFX_ByteString& strFormat) {
+  GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
+}
+void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis,
+                                    int32_t iTime,
+                                    const CFX_ByteStringC& szFormat,
+                                    const CFX_ByteStringC& szLocale,
+                                    FX_BOOL bGM,
+                                    CFX_ByteString& strTime) {
+  int32_t iHour = 0;
+  int32_t iMin = 0;
+  int32_t iSec = 0;
+  int32_t iZoneHour = 0;
+  int32_t iZoneMin = 0;
+  int32_t iZoneSec = 0;
+  iHour = static_cast<int>(iTime) / 3600000;
+  iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000;
+  iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000;
+  if (!bGM) {
+    GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec);
+    iHour += iZoneHour;
+    iMin += iZoneMin;
+    iSec += iZoneSec;
+  }
+  int32_t iRet = 0;
+  CFX_ByteString strIsoTime;
+  strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec);
+  if (bGM) {
+    iRet = GetGMTTime(hThis, strIsoTime, szFormat, szLocale, strTime);
+  } else {
+    iRet = IsoTime2Local(hThis, strIsoTime, szFormat, szLocale, strTime);
+  }
+  if (!iRet) {
+    strTime = "";
+  }
+}
+
+void CXFA_FM2JSContext::GetLocalTimeZone(int32_t& iHour,
+                                         int32_t& iMin,
+                                         int32_t& iSec) {
+  time_t now;
+  time(&now);
+  struct tm* pGmt = gmtime(&now);
+  int32_t iGMHour = pGmt->tm_hour;
+  int32_t iGMMin = pGmt->tm_min;
+  int32_t iGMSec = pGmt->tm_sec;
+  struct tm* pLocal = localtime(&now);
+  int32_t iLocalHour = pLocal->tm_hour;
+  int32_t iLocalMin = pLocal->tm_min;
+  int32_t iLocalSec = pLocal->tm_sec;
+  iHour = iLocalHour - iGMHour;
+  iMin = iLocalMin - iGMMin;
+  iSec = iLocalSec - iGMSec;
+}
+void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_DOUBLE nPrincipal = 0;
+    FX_DOUBLE nPayment = 0;
+    FX_DOUBLE nPeriods = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nPrincipal = HValueToDouble(hThis, argOne);
+      nPayment = HValueToDouble(hThis, argTwo);
+      nPeriods = HValueToDouble(hThis, argThree);
+      bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_DOUBLE r =
+            2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);
+        FX_DOUBLE nTemp = 1;
+        for (int32_t i = 0; i < nPeriods; ++i) {
+          nTemp *= (1 + r);
+        }
+        FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
+        while ((nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) &&
+               (!bFlags)) {
+          FX_DOUBLE nDerivative = 0;
+          nDerivative =
+              ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) -
+               (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
+              ((nTemp - 1) * (nTemp - 1));
+          if (nDerivative == 0) {
+            bFlags = TRUE;
+            continue;
+          }
+          r = r - nRet / nDerivative;
+          nTemp = 1;
+          for (int32_t i = 0; i < nPeriods; ++i) {
+            nTemp *= (1 + r);
+          }
+          nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
+        }
+        if (bFlags) {
+          FXJSE_Value_SetNull(args.GetReturnValue());
+        } else {
+          r = r * 12;
+          FXJSE_Value_SetDouble(args.GetReturnValue(), r);
+        }
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Apr");
+  }
+}
+void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nRate = 0;
+    FX_FLOAT nFutureValue = 0;
+    FX_FLOAT nInitAmount = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nRate = HValueToFloat(hThis, argOne);
+      nFutureValue = HValueToFloat(hThis, argTwo);
+      nInitAmount = HValueToFloat(hThis, argThree);
+      bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FXJSE_Value_SetFloat(args.GetReturnValue(),
+                             FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) /
+                                 FXSYS_log((FX_FLOAT)(1 + nRate)));
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"CTerm");
+  }
+}
+void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_DOUBLE nAmount = 0;
+    FX_DOUBLE nRate = 0;
+    FX_DOUBLE nPeriod = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nAmount = HValueToDouble(hThis, argOne);
+      nRate = HValueToDouble(hThis, argTwo);
+      nPeriod = HValueToDouble(hThis, argThree);
+      bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_DOUBLE dResult = 0;
+        if (!nRate) {
+          dResult = nAmount * nPeriod;
+        } else {
+          FX_DOUBLE nTemp = 1;
+          for (int i = 0; i < nPeriod; ++i) {
+            nTemp *= 1 + nRate;
+          }
+          dResult = nAmount * (nTemp - 1) / nRate;
+        }
+        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"FV");
+  }
+}
+void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 5) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nPrincpalAmount = 0;
+    FX_FLOAT nRate = 0;
+    FX_FLOAT nPayment = 0;
+    FX_FLOAT nFirstMonth = 0;
+    FX_FLOAT nNumberOfMonths = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
+    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
+              HValueIsNull(hThis, argFive));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nPrincpalAmount = HValueToFloat(hThis, argOne);
+      nRate = HValueToFloat(hThis, argTwo);
+      nPayment = HValueToFloat(hThis, argThree);
+      nFirstMonth = HValueToFloat(hThis, argFour);
+      nNumberOfMonths = HValueToFloat(hThis, argFive);
+      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
+                (nFirstMonth < 0) || (nNumberOfMonths < 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_FLOAT fResult = 0;
+        FX_FLOAT nRateOfMonth = nRate / 12;
+        int32_t iNums =
+            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
+                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
+                                              nRateOfMonth))) /
+                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
+        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
+        if (iEnd > iNums) {
+          iEnd = iNums;
+        }
+        FX_FLOAT nSum = 0;
+        if (nPayment < nPrincpalAmount * nRateOfMonth) {
+          bFlags = TRUE;
+          fResult = 0;
+        }
+        if (!bFlags) {
+          int32_t i = 0;
+          for (i = 0; i < nFirstMonth - 1; ++i) {
+            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
+          }
+          for (; i < iEnd; ++i) {
+            nSum += nPrincpalAmount * nRateOfMonth;
+            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
+          }
+          fResult = nSum;
+        }
+        FXJSE_Value_SetFloat(args.GetReturnValue(), fResult);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+    FXJSE_Value_Release(argFour);
+    FXJSE_Value_Release(argFive);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"IPmt");
+  }
+}
+void CXFA_FM2JSContext::NPV(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc > 2) {
+    FX_BOOL bFlags = FALSE;
+    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
+    for (int32_t i = 0; i < argc; i++) {
+      argValues[i] = GetSimpleHValue(hThis, args, i);
+      if (HValueIsNull(hThis, argValues[i])) {
+        bFlags = TRUE;
+      }
+    }
+    if (!bFlags) {
+      FX_DOUBLE nRate = 0;
+      nRate = HValueToDouble(hThis, argValues[0]);
+      if (nRate <= 0) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_DOUBLE* pData = FX_Alloc(FX_DOUBLE, argc - 1);
+        for (int32_t i = 1; i < argc; i++) {
+          pData[i - 1] = HValueToDouble(hThis, argValues[i]);
+        }
+        FX_DOUBLE nSum = 0;
+        int32_t iIndex = 0;
+        for (int32_t i = 0; i < argc - 1; i++) {
+          FX_DOUBLE nTemp = 1;
+          for (int32_t j = 0; j <= i; j++) {
+            nTemp *= 1 + nRate;
+          }
+          FX_DOUBLE nNum = *(pData + iIndex++);
+          nSum += nNum / nTemp;
+        }
+        FXJSE_Value_SetDouble(args.GetReturnValue(), nSum);
+        FX_Free(pData);
+        pData = 0;
+      }
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    for (int32_t i = 0; i < argc; i++) {
+      FXJSE_Value_Release(argValues[i]);
+    }
+    FX_Free(argValues);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"NPV");
+  }
+}
+void CXFA_FM2JSContext::Pmt(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nPrincipal = 0;
+    FX_FLOAT nRate = 0;
+    FX_FLOAT nPeriods = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nPrincipal = HValueToFloat(hThis, argOne);
+      nRate = HValueToFloat(hThis, argTwo);
+      nPeriods = HValueToFloat(hThis, argThree);
+      bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_FLOAT nSum = 0;
+        FX_FLOAT nTmp = 1 + nRate;
+        nSum = nTmp;
+        for (int32_t i = 0; i < nPeriods - 1; ++i) {
+          nSum *= nTmp;
+        }
+        FXJSE_Value_SetFloat(args.GetReturnValue(),
+                             (nPrincipal * nRate * nSum) / (nSum - 1));
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Pmt");
+  }
+}
+void CXFA_FM2JSContext::PPmt(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 5) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nPrincpalAmount = 0;
+    FX_FLOAT nRate = 0;
+    FX_FLOAT nPayment = 0;
+    FX_FLOAT nFirstMonth = 0;
+    FX_FLOAT nNumberOfMonths = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
+    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
+              HValueIsNull(hThis, argFive));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nPrincpalAmount = HValueToFloat(hThis, argOne);
+      nRate = HValueToFloat(hThis, argTwo);
+      nPayment = HValueToFloat(hThis, argThree);
+      nFirstMonth = HValueToFloat(hThis, argFour);
+      nNumberOfMonths = HValueToFloat(hThis, argFive);
+      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
+                (nFirstMonth < 0) || (nNumberOfMonths < 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
+        FX_FLOAT nSum = 0;
+        FX_FLOAT nRateOfMonth = nRate / 12;
+        int32_t iNums =
+            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
+                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
+                                              nRateOfMonth))) /
+                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
+        if (iEnd > iNums) {
+          iEnd = iNums;
+        }
+        if (nPayment < nPrincpalAmount * nRateOfMonth) {
+          bFlags = TRUE;
+        }
+        if (!bFlags) {
+          int32_t i = 0;
+          for (i = 0; i < nFirstMonth - 1; ++i) {
+            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
+          }
+          FX_FLOAT nTemp = 0;
+          for (; i < iEnd; ++i) {
+            nTemp = nPayment - nPrincpalAmount * nRateOfMonth;
+            nSum += nTemp;
+            nPrincpalAmount -= nTemp;
+          }
+          FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
+        } else {
+          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+        }
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+    FXJSE_Value_Release(argFour);
+    FXJSE_Value_Release(argFive);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"PPmt");
+  }
+}
+void CXFA_FM2JSContext::PV(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_DOUBLE nAmount = 0;
+    FX_DOUBLE nRate = 0;
+    FX_DOUBLE nPeriod = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nAmount = HValueToDouble(hThis, argOne);
+      nRate = HValueToDouble(hThis, argTwo);
+      nPeriod = HValueToDouble(hThis, argThree);
+      bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FX_DOUBLE nTemp = 1;
+        for (int32_t i = 0; i < nPeriod; ++i) {
+          nTemp *= 1 + nRate;
+        }
+        nTemp = 1 / nTemp;
+        FXJSE_Value_SetDouble(args.GetReturnValue(),
+                              nAmount * ((1 - nTemp) / nRate));
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"PV");
+  }
+}
+void CXFA_FM2JSContext::Rate(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nFuture = 0;
+    FX_FLOAT nPresent = 0;
+    FX_FLOAT nTotalNumber = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
+              HValueIsNull(hThis, argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nFuture = HValueToFloat(hThis, argOne);
+      nPresent = HValueToFloat(hThis, argTwo);
+      nTotalNumber = HValueToFloat(hThis, argThree);
+      bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FXJSE_Value_SetFloat(args.GetReturnValue(),
+                             (FXSYS_pow((FX_FLOAT)(nFuture / nPresent),
+                                        (FX_FLOAT)(1 / nTotalNumber)) -
+                              1));
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Rate");
+  }
+}
+void CXFA_FM2JSContext::Term(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 3) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT nMount = 0;
+    FX_FLOAT nRate = 0;
+    FX_FLOAT nFuture = 0;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
+    bFlags = (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo) ||
+              FXJSE_Value_IsNull(argThree));
+    if (bFlags) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      nMount = HValueToFloat(hThis, argOne);
+      nRate = HValueToFloat(hThis, argTwo);
+      nFuture = HValueToFloat(hThis, argThree);
+      bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0));
+      if (bFlags) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else {
+        FXJSE_Value_SetFloat(
+            args.GetReturnValue(),
+            (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) /
+             FXSYS_log((FX_FLOAT)(1 + nRate))));
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    FXJSE_Value_Release(argThree);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Term");
+  }
+}
+void CXFA_FM2JSContext::Choose(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  if (argc > 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FX_BOOL argOneIsNull = FALSE;
+    int32_t iIndex = 0;
+    argOneIsNull = HValueIsNull(hThis, argOne);
+    if (!argOneIsNull) {
+      iIndex = (int32_t)HValueToFloat(hThis, argOne);
+    }
+    FXJSE_Value_Release(argOne);
+    if (argOneIsNull) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else if (iIndex < 1) {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+    } else {
+      FX_BOOL bFound = FALSE;
+      FX_BOOL bStopCounterFlags = FALSE;
+      int32_t iArgIndex = 1;
+      int32_t iValueIndex = 0;
+      while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
+        FXJSE_HVALUE argIndexValue = args.GetValue(iArgIndex);
+        if (FXJSE_Value_IsArray(argIndexValue)) {
+          FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+          FXJSE_Value_GetObjectProp(argIndexValue, "length", lengthValue);
+          int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+          FXJSE_Value_Release(lengthValue);
+          if (iLength > 3) {
+            bStopCounterFlags = TRUE;
+          }
+          iValueIndex += (iLength - 2);
+          if (iValueIndex >= iIndex) {
+            FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+            FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+            FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+            FXJSE_Value_GetObjectPropByIdx(argIndexValue, 1, propertyValue);
+            FXJSE_Value_GetObjectPropByIdx(
+                argIndexValue, ((iLength - 1) - (iValueIndex - iIndex)),
+                jsobjectValue);
+            if (FXJSE_Value_IsNull(propertyValue)) {
+              GetObjectDefaultValue(jsobjectValue, newProperty);
+            } else {
+              CFX_ByteString propStr;
+              FXJSE_Value_ToUTF8String(propertyValue, propStr);
+              FXJSE_Value_GetObjectProp(jsobjectValue, propStr, newProperty);
+            }
+            CFX_ByteString bsChoosed;
+            HValueToUTF8String(newProperty, bsChoosed);
+            FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed);
+            FXJSE_Value_Release(newProperty);
+            FXJSE_Value_Release(jsobjectValue);
+            FXJSE_Value_Release(propertyValue);
+            bFound = TRUE;
+          }
+        } else {
+          iValueIndex++;
+          if (iValueIndex == iIndex) {
+            CFX_ByteString bsChoosed;
+            HValueToUTF8String(argIndexValue, bsChoosed);
+            FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed);
+            bFound = TRUE;
+          }
+        }
+        FXJSE_Value_Release(argIndexValue);
+        iArgIndex++;
+      }
+      if (!bFound) {
+        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Choose");
+  }
+}
+void CXFA_FM2JSContext::Exists(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FXJSE_Value_SetInteger(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Exists");
+  }
+}
+void CXFA_FM2JSContext::HasValue(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsUTF8String(argOne)) {
+      CFX_ByteString valueStr;
+      FXJSE_Value_ToUTF8String(argOne, valueStr);
+      valueStr.TrimLeft();
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty()));
+    } else if (FXJSE_Value_IsNumber(argOne) || FXJSE_Value_IsBoolean(argOne)) {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE);
+    } else {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"HasValue");
+  }
+}
+void CXFA_FM2JSContext::Oneof(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc > 1) {
+    FX_BOOL bFlags = FALSE;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE* parametersValue = 0;
+    int32_t iCount = 0;
+    unfoldArgs(hThis, args, parametersValue, iCount, 1);
+    for (int32_t i = 0; i < iCount; i++) {
+      if (simpleValueCompare(hThis, argOne, parametersValue[i])) {
+        bFlags = TRUE;
+        break;
+      }
+    }
+    FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
+    FXJSE_Value_Release(argOne);
+    for (int32_t i = 0; i < iCount; i++) {
+      FXJSE_Value_Release(parametersValue[i]);
+    }
+    FX_Free(parametersValue);
+    parametersValue = 0;
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Oneof");
+  }
+}
+void CXFA_FM2JSContext::Within(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc == 3) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetUndefined(args.GetReturnValue());
+    } else {
+      FXJSE_HVALUE argLow = GetSimpleHValue(hThis, args, 1);
+      FXJSE_HVALUE argHeight = GetSimpleHValue(hThis, args, 2);
+      if (FXJSE_Value_IsNumber(argOne)) {
+        FX_FLOAT oneNumber = HValueToFloat(hThis, argOne);
+        FX_FLOAT lowNumber = HValueToFloat(hThis, argLow);
+        FX_FLOAT heightNumber = HValueToFloat(hThis, argHeight);
+        FXJSE_Value_SetInteger(
+            args.GetReturnValue(),
+            ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)));
+      } else {
+        CFX_ByteString oneString;
+        CFX_ByteString lowString;
+        CFX_ByteString heightString;
+        HValueToUTF8String(argOne, oneString);
+        HValueToUTF8String(argLow, lowString);
+        HValueToUTF8String(argHeight, heightString);
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               ((oneString.Compare(lowString) >= 0) &&
+                                (oneString.Compare(heightString) <= 0)));
+      }
+      FXJSE_Value_Release(argLow);
+      FXJSE_Value_Release(argHeight);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Within");
+  }
+}
+void CXFA_FM2JSContext::If(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args) {
+  if (args.GetLength() == 3) {
+    FXJSE_HVALUE argCondition = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argFirstValue = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argSecondValue = GetSimpleHValue(hThis, args, 2);
+    FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition);
+    FXJSE_Value_Set(args.GetReturnValue(),
+                    bCondition ? argFirstValue : argSecondValue);
+    FXJSE_Value_Release(argSecondValue);
+    FXJSE_Value_Release(argFirstValue);
+    FXJSE_Value_Release(argCondition);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"If");
+  }
+}
+void CXFA_FM2JSContext::Eval(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE scriptValue = GetSimpleHValue(hThis, args, 0);
+    CFX_ByteString utf8ScriptString;
+    HValueToUTF8String(scriptValue, utf8ScriptString);
+    if (utf8ScriptString.IsEmpty()) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_WideTextBuf wsJavaScriptBuf;
+      CFX_WideString javaScript;
+      CFX_WideString wsError;
+      XFA_FM2JS_Translate(CFX_WideString::FromUTF8(
+                              utf8ScriptString, utf8ScriptString.GetLength()),
+                          wsJavaScriptBuf, wsError);
+      FXJSE_HCONTEXT hContext = FXJSE_Context_Create(hruntime);
+      FXJSE_HVALUE returnValue = FXJSE_Value_Create(hruntime);
+      javaScript = wsJavaScriptBuf.GetWideString();
+      FXJSE_ExecuteScript(hContext,
+                          FX_UTF8Encode(javaScript, javaScript.GetLength()),
+                          returnValue);
+      FXJSE_Value_Set(args.GetReturnValue(), returnValue);
+      FXJSE_Value_Release(returnValue);
+      FXJSE_Context_Release(hContext);
+    }
+    FXJSE_Value_Release(scriptValue);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Eval");
+  }
+}
+void CXFA_FM2JSContext::Ref(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_HVALUE rgValues[3];
+      for (int32_t i = 0; i < 3; i++) {
+        rgValues[i] = FXJSE_Value_Create(hruntime);
+      }
+      FXJSE_Value_SetInteger(rgValues[0], 4);
+      FXJSE_Value_SetNull(rgValues[1]);
+      FXJSE_Value_SetNull(rgValues[2]);
+      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
+      for (int32_t i = 0; i < 3; i++) {
+        FXJSE_Value_Release(rgValues[i]);
+      }
+    } else if (FXJSE_Value_IsArray(argOne)) {
+#ifndef NDEBUG
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
+      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
+      FXJSE_Value_Release(lengthValue);
+#endif
+      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
+      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
+      if (FXJSE_Value_IsNull(jsObjectValue)) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      } else if (FXJSE_Value_IsNull(propertyValue) &&
+                 (!FXJSE_Value_IsNull(jsObjectValue))) {
+        FXJSE_HVALUE rgValues[3];
+        for (int32_t i = 0; i < 3; i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 3);
+        FXJSE_Value_SetNull(rgValues[1]);
+        FXJSE_Value_Set(rgValues[2], jsObjectValue);
+        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
+        for (int32_t i = 0; i < 3; i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      }
+      FXJSE_Value_Release(jsObjectValue);
+      FXJSE_Value_Release(propertyValue);
+    } else if (FXJSE_Value_IsObject(argOne)) {
+      FXJSE_HVALUE rgValues[3];
+      for (int32_t i = 0; i < 3; i++) {
+        rgValues[i] = FXJSE_Value_Create(hruntime);
+      }
+      FXJSE_Value_SetInteger(rgValues[0], 3);
+      FXJSE_Value_SetNull(rgValues[1]);
+      FXJSE_Value_Set(rgValues[2], argOne);
+      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
+      for (int32_t i = 0; i < 3; i++) {
+        FXJSE_Value_Release(rgValues[i]);
+      }
+    } else if (FXJSE_Value_IsBoolean(argOne) ||
+               FXJSE_Value_IsUTF8String(argOne) ||
+               FXJSE_Value_IsNumber(argOne)) {
+      FXJSE_Value_Set(args.GetReturnValue(), argOne);
+    } else {
+      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Ref");
+  }
+}
+void CXFA_FM2JSContext::UnitType(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args) {
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(unitspanValue)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+      FXJSE_Value_Release(unitspanValue);
+      return;
+    }
+    CFX_ByteString unitspanString;
+    HValueToUTF8String(unitspanValue, unitspanString);
+    if (unitspanString.IsEmpty()) {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
+    } else {
+      enum XFA_FM2JS_VALUETYPE_ParserStatus {
+        VALUETYPE_START,
+        VALUETYPE_HAVEINVALIDCHAR,
+        VALUETYPE_HAVEDIGIT,
+        VALUETYPE_HAVEDIGITWHITE,
+        VALUETYPE_ISCM,
+        VALUETYPE_ISMM,
+        VALUETYPE_ISPT,
+        VALUETYPE_ISMP,
+        VALUETYPE_ISIN,
+      };
+      unitspanString.MakeLower();
+      CFX_WideString wsTypeString =
+          CFX_WideString::FromUTF8(unitspanString, unitspanString.GetLength());
+      const FX_WCHAR* pData = wsTypeString;
+      int32_t u = 0;
+      int32_t uLen = wsTypeString.GetLength();
+      while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
+             *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
+             *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
+        u++;
+      }
+      XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START;
+      FX_WCHAR typeChar;
+      while (u < uLen) {
+        typeChar = *(pData + u);
+        if (typeChar == 0x20 || typeChar == 0x09 || typeChar == 0x0B ||
+            typeChar == 0x0C || typeChar == 0x0A || typeChar == 0x0D) {
+          if (eParserStatus == VALUETYPE_HAVEDIGIT ||
+              eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
+            eParserStatus = VALUETYPE_HAVEDIGITWHITE;
+          } else {
+            eParserStatus = VALUETYPE_ISIN;
+            break;
+          }
+        } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' ||
+                   typeChar == '.') {
+          if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
+            eParserStatus = VALUETYPE_ISIN;
+            break;
+          } else {
+            eParserStatus = VALUETYPE_HAVEDIGIT;
+          }
+        } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) {
+          FX_WCHAR nextChar = *(pData + u + 1);
+          if ((eParserStatus == VALUETYPE_START ||
+               eParserStatus == VALUETYPE_HAVEDIGIT ||
+               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
+              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
+              nextChar != '-') {
+            eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT;
+            break;
+          } else {
+            eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
+          }
+        } else if (typeChar == 'm' && (u + 1 < uLen)) {
+          FX_WCHAR nextChar = *(pData + u + 1);
+          if ((eParserStatus == VALUETYPE_START ||
+               eParserStatus == VALUETYPE_HAVEDIGIT ||
+               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
+              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
+              nextChar != '-') {
+            eParserStatus = VALUETYPE_ISMM;
+            if (nextChar == 'p' ||
+                ((u + 5 < uLen) && *(pData + u + 1) == 'i' &&
+                 *(pData + u + 2) == 'l' && *(pData + u + 3) == 'l' &&
+                 *(pData + u + 4) == 'i' && *(pData + u + 5) == 'p')) {
+              eParserStatus = VALUETYPE_ISMP;
+            }
+            break;
+          }
+        } else {
+          eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
+        }
+        u++;
+      }
+      switch (eParserStatus) {
+        case VALUETYPE_ISCM:
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm");
+          break;
+        case VALUETYPE_ISMM:
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm");
+          break;
+        case VALUETYPE_ISPT:
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt");
+          break;
+        case VALUETYPE_ISMP:
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp");
+          break;
+        default:
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
+          break;
+      }
+    }
+    FXJSE_Value_Release(unitspanValue);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"UnitType");
+  }
+}
+void CXFA_FM2JSContext::UnitValue(FXJSE_HOBJECT hThis,
+                                  const CFX_ByteStringC& szFuncName,
+                                  CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc == 1) || (argc == 2)) {
+    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE unitValue = 0;
+    CFX_ByteString unitspanString;
+    FX_DOUBLE dFirstNumber = 0;
+    CFX_ByteString strFirstUnit;
+    CFX_ByteString strUnit;
+    if (FXJSE_Value_IsNull(unitspanValue)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      HValueToUTF8String(unitspanValue, unitspanString);
+      const FX_CHAR* pData = unitspanString;
+      if (pData) {
+        int32_t u = 0;
+        while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
+               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
+               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
+          ++u;
+        }
+        while (u < unitspanString.GetLength()) {
+          if ((*(pData + u) > '9' || *(pData + u) < '0') &&
+              *(pData + u) != '.' && *(pData + u) != '-') {
+            break;
+          }
+          ++u;
+        }
+        FX_CHAR* pTemp = NULL;
+        dFirstNumber = strtod(pData, &pTemp);
+        while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
+               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
+               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
+          ++u;
+        }
+        int32_t uLen = unitspanString.GetLength();
+        while (u < uLen) {
+          if (*(pData + u) == ' ') {
+            break;
+          }
+          strFirstUnit += (*(pData + u));
+          ++u;
+        }
+        strFirstUnit.MakeLower();
+        if (argc == 2) {
+          unitValue = GetSimpleHValue(hThis, args, 1);
+          CFX_ByteString unitTempString;
+          HValueToUTF8String(unitValue, unitTempString);
+          const FX_CHAR* pData = unitTempString;
+          int32_t u = 0;
+          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
+                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
+                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
+            ++u;
+          }
+          while (u < unitTempString.GetLength()) {
+            if ((*(pData + u) > '9' || *(pData + u) < '0') &&
+                *(pData + u) != '.') {
+              break;
+            }
+            ++u;
+          }
+          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
+                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
+                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
+            ++u;
+          }
+          int32_t uLen = unitTempString.GetLength();
+          while (u < uLen) {
+            if (*(pData + u) == ' ') {
+              break;
+            }
+            strUnit += (*(pData + u));
+            ++u;
+          }
+          strUnit.MakeLower();
+        } else {
+          strUnit = strFirstUnit;
+        }
+        FX_DOUBLE dResult = 0;
+        if (strFirstUnit.Equal("in") || strFirstUnit.Equal("inches")) {
+          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
+            dResult = dFirstNumber * 25.4;
+          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
+            dResult = dFirstNumber * 2.54;
+          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
+            dResult = dFirstNumber / 72;
+          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
+            dResult = dFirstNumber / 72000;
+          } else {
+            dResult = dFirstNumber;
+          }
+        } else if (strFirstUnit.Equal("mm") ||
+                   strFirstUnit.Equal("millimeters")) {
+          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
+            dResult = dFirstNumber;
+          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
+            dResult = dFirstNumber / 10;
+          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
+            dResult = dFirstNumber / 25.4 / 72;
+          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
+            dResult = dFirstNumber / 25.4 / 72000;
+          } else {
+            dResult = dFirstNumber / 25.4;
+          }
+        } else if (strFirstUnit.Equal("cm") ||
+                   strFirstUnit.Equal("centimeters")) {
+          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
+            dResult = dFirstNumber * 10;
+          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
+            dResult = dFirstNumber;
+          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
+            dResult = dFirstNumber / 2.54 / 72;
+          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
+            dResult = dFirstNumber / 2.54 / 72000;
+          } else {
+            dResult = dFirstNumber / 2.54;
+          }
+        } else if (strFirstUnit.Equal("pt") || strFirstUnit.Equal("points")) {
+          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
+            dResult = dFirstNumber / 72 * 25.4;
+          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
+            dResult = dFirstNumber / 72 * 2.54;
+          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
+            dResult = dFirstNumber;
+          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
+            dResult = dFirstNumber * 1000;
+          } else {
+            dResult = dFirstNumber / 72;
+          }
+        } else if (strFirstUnit.Equal("mp") ||
+                   strFirstUnit.Equal("millipoints")) {
+          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
+            dResult = dFirstNumber / 72000 * 25.4;
+          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
+            dResult = dFirstNumber / 72000 * 2.54;
+          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
+            dResult = dFirstNumber / 1000;
+          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
+            dResult = dFirstNumber;
+          } else {
+            dResult = dFirstNumber / 72000;
+          }
+        }
+        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
+      } else {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+      }
+    }
+    FXJSE_Value_Release(unitspanValue);
+    if (argc == 2) {
+      FXJSE_Value_Release(unitValue);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"UnitValue");
+  }
+}
+void CXFA_FM2JSContext::At(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString stringTwo;
+      HValueToUTF8String(argTwo, stringTwo);
+      if (stringTwo.IsEmpty()) {
+        FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
+      } else {
+        CFX_ByteString stringOne;
+        HValueToUTF8String(argOne, stringOne);
+        FX_STRSIZE iPosition = stringOne.Find(stringTwo);
+        FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"At");
+  }
+}
+void CXFA_FM2JSContext::Concat(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc >= 1) {
+    CFX_ByteString resultString;
+    FX_BOOL bAllNull = TRUE;
+    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
+    for (int32_t i = 0; i < argc; i++) {
+      argValues[i] = GetSimpleHValue(hThis, args, i);
+      if (!HValueIsNull(hThis, argValues[i])) {
+        CFX_ByteString valueStr;
+        HValueToUTF8String(argValues[i], valueStr);
+        resultString += valueStr;
+        bAllNull = FALSE;
+      }
+    }
+    for (int32_t i = 0; i < argc; i++) {
+      FXJSE_Value_Release(argValues[i]);
+    }
+    FX_Free(argValues);
+    if (bAllNull) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString);
+    }
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Concat");
+  }
+}
+void CXFA_FM2JSContext::Decode(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString toDecodeString;
+      HValueToUTF8String(argOne, toDecodeString);
+      CFX_ByteTextBuf resultBuf;
+      DecodeURL(toDecodeString, resultBuf);
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                resultBuf.GetByteString());
+    }
+    FXJSE_Value_Release(argOne);
+  } else if (argc == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString toDecodeString;
+      HValueToUTF8String(argOne, toDecodeString);
+      CFX_ByteString identifyString;
+      HValueToUTF8String(argTwo, identifyString);
+      CFX_ByteTextBuf resultBuf;
+      if (identifyString.EqualNoCase("html")) {
+        DecodeHTML(toDecodeString, resultBuf);
+      } else if (identifyString.EqualNoCase("xml")) {
+        DecodeXML(toDecodeString, resultBuf);
+      } else {
+        DecodeURL(toDecodeString, resultBuf);
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                resultBuf.GetByteString());
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Decode");
+  }
+}
+void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString,
+                                  CFX_ByteTextBuf& szResultString) {
+  CFX_WideString wsURLString =
+      CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength());
+  const FX_WCHAR* pData = wsURLString;
+  int32_t iLen = wsURLString.GetLength();
+  int32_t i = 0;
+  FX_WCHAR ch = 0;
+  FX_WCHAR chTemp = 0;
+  CFX_WideTextBuf wsResultBuf;
+  while (i < iLen) {
+    ch = *(pData + i);
+    if ('%' == ch) {
+      chTemp = 0;
+      int32_t iCount = 0;
+      while (iCount < 2) {
+        ++i;
+        ch = *(pData + i);
+        if (ch <= '9' && ch >= '0') {
+          if (!iCount) {
+            chTemp += (ch - '0') * 16;
+          } else {
+            chTemp += (ch - '0');
+          }
+        } else {
+          if (ch <= 'F' && ch >= 'A') {
+            if (!iCount) {
+              chTemp += (ch - 'A' + 10) * 16;
+            } else {
+              chTemp += (ch - 'A' + 10);
+            }
+          } else if (ch <= 'f' && ch >= 'a') {
+            if (!iCount) {
+              chTemp += (ch - 'a' + 10) * 16;
+            } else {
+              chTemp += (ch - 'a' + 10);
+            }
+          } else {
+            wsResultBuf.Clear();
+            return;
+          }
+        }
+        ++iCount;
+      }
+      wsResultBuf.AppendChar(chTemp);
+    } else {
+      wsResultBuf.AppendChar(ch);
+    }
+    ++i;
+  }
+  wsResultBuf.AppendChar(0);
+  szResultString.Clear();
+  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
+                                  wsResultBuf.GetLength());
+}
+void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString,
+                                   CFX_ByteTextBuf& szResultString) {
+  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(
+      szHTMLString.GetCStr(), szHTMLString.GetLength());
+  FX_WCHAR strString[9];
+  int32_t iStrIndex = 0;
+  int32_t iLen = wsHTMLString.GetLength();
+  int32_t i = 0;
+  int32_t iCode = 0;
+  FX_WCHAR ch = 0;
+  const FX_WCHAR* pData = wsHTMLString;
+  CFX_WideTextBuf wsResultBuf;
+  while (i < iLen) {
+    ch = *(pData + i);
+    if (ch == '&') {
+      ++i;
+      ch = *(pData + i);
+      if (ch == '#') {
+        ++i;
+        ch = *(pData + i);
+        if (ch == 'x' || ch == 'X') {
+          ++i;
+          ch = *(pData + i);
+          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
+              (ch <= 'F' && ch >= 'A')) {
+            while (ch != ';' && i < iLen) {
+              if (ch >= '0' && ch <= '9') {
+                iCode += ch - '0';
+              } else if (ch <= 'f' && ch >= 'a') {
+                iCode += ch - 'a' + 10;
+              } else if (ch <= 'F' && ch >= 'A') {
+                iCode += ch - 'A' + 10;
+              } else {
+                wsResultBuf.Clear();
+                return;
+              }
+              ++i;
+              iCode *= 16;
+              ch = *(pData + i);
+            }
+            iCode /= 16;
+          }
+        } else {
+          wsResultBuf.Clear();
+          return;
+        }
+      } else {
+        while (ch != ';' && i < iLen) {
+          strString[iStrIndex++] = ch;
+          ++i;
+          ch = *(pData + i);
+        }
+        strString[iStrIndex] = 0;
+      }
+    } else {
+      wsResultBuf.AppendChar(ch);
+      ++i;
+      continue;
+    }
+    uint32_t iData = 0;
+    if (HTMLSTR2Code(strString, iData)) {
+      wsResultBuf.AppendChar((FX_WCHAR)iData);
+    } else {
+      wsResultBuf.AppendChar(iCode);
+    }
+    iStrIndex = 0;
+    strString[iStrIndex] = 0;
+    ++i;
+  }
+  wsResultBuf.AppendChar(0);
+  szResultString.Clear();
+  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
+                                  wsResultBuf.GetLength());
+}
+void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString,
+                                  CFX_ByteTextBuf& szResultString) {
+  CFX_WideString wsXMLString =
+      CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength());
+  FX_WCHAR strString[9];
+  int32_t iStrIndex = 0;
+  int32_t iLen = wsXMLString.GetLength();
+  int32_t i = 0;
+  int32_t iCode = 0;
+  FX_WCHAR ch = 0;
+  const FX_WCHAR* pData = wsXMLString;
+  CFX_WideTextBuf wsXMLBuf;
+  while (i < iLen) {
+    ch = *(pData + i);
+    if (ch == '&') {
+      ++i;
+      ch = *(pData + i);
+      if (ch == '#') {
+        ++i;
+        ch = *(pData + i);
+        if (ch == 'x' || ch == 'X') {
+          ++i;
+          ch = *(pData + i);
+          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
+              (ch <= 'F' && ch >= 'A')) {
+            while (ch != ';') {
+              if (ch >= '0' && ch <= '9') {
+                iCode += ch - '0';
+              } else if (ch <= 'f' && ch >= 'a') {
+                iCode += ch - 'a' + 10;
+              } else if (ch <= 'F' && ch >= 'A') {
+                iCode += ch - 'A' + 10;
+              } else {
+                wsXMLBuf.Clear();
+                return;
+              }
+              ++i;
+              iCode *= 16;
+              ch = *(pData + i);
+            }
+            iCode /= 16;
+          }
+        } else {
+          wsXMLBuf.Clear();
+          return;
+        }
+      } else {
+        while (ch != ';' && i < iLen) {
+          strString[iStrIndex++] = ch;
+          ++i;
+          ch = *(pData + i);
+        }
+        strString[iStrIndex] = 0;
+      }
+    } else {
+      wsXMLBuf.AppendChar(ch);
+      ++i;
+      continue;
+    }
+    const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
+    int32_t iIndex = 0;
+    while (iIndex < 5) {
+      if (FXSYS_memcmp(strString, strName[iIndex],
+                       FXSYS_wcslen(strName[iIndex])) == 0) {
+        break;
+      }
+      ++iIndex;
+    }
+    switch (iIndex) {
+      case 0:
+        wsXMLBuf.AppendChar('"');
+        break;
+      case 1:
+        wsXMLBuf.AppendChar('&');
+        break;
+      case 2:
+        wsXMLBuf.AppendChar('\'');
+        break;
+      case 3:
+        wsXMLBuf.AppendChar('<');
+        break;
+      case 4:
+        wsXMLBuf.AppendChar('>');
+        break;
+      default:
+        wsXMLBuf.AppendChar(iCode);
+        break;
+    }
+    iStrIndex = 0;
+    strString[iStrIndex] = 0;
+    ++i;
+    iCode = 0;
+  }
+  wsXMLBuf.AppendChar(0);
+  szResultString.Clear();
+  szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength());
+}
+void CXFA_FM2JSContext::Encode(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString toEncodeString;
+      HValueToUTF8String(argOne, toEncodeString);
+      CFX_ByteTextBuf resultBuf;
+      EncodeURL(toEncodeString, resultBuf);
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                resultBuf.GetByteString());
+    }
+    FXJSE_Value_Release(argOne);
+  } else if (argc == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString toEncodeString;
+      HValueToUTF8String(argOne, toEncodeString);
+      CFX_ByteString identifyString;
+      HValueToUTF8String(argTwo, identifyString);
+      CFX_ByteTextBuf resultBuf;
+      if (identifyString.EqualNoCase("html")) {
+        EncodeHTML(toEncodeString, resultBuf);
+      } else if (identifyString.EqualNoCase("xml")) {
+        EncodeXML(toEncodeString, resultBuf);
+      } else {
+        EncodeURL(toEncodeString, resultBuf);
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                resultBuf.GetByteString());
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Encode");
+  }
+}
+void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString,
+                                  CFX_ByteTextBuf& szResultBuf) {
+  CFX_WideString wsURLString =
+      CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength());
+  CFX_WideTextBuf wsResultBuf;
+  FX_WCHAR ch = 0;
+  int32_t iLength = wsURLString.GetLength();
+  FX_WCHAR strEncode[4];
+  strEncode[0] = '%';
+  strEncode[3] = 0;
+  FX_WCHAR strUnsafe[] = {' ', '<',  '>', '"', '#', '%', '{', '}',
+                          '|', '\\', '^', '~', '[', ']', '`'};
+  FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'};
+  FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','};
+  const FX_WCHAR* strCode = L"0123456789abcdef";
+  for (int32_t u = 0; u < iLength; ++u) {
+    ch = wsURLString.GetAt(u);
+    int32_t i = 0;
+    int32_t iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]);
+    while (i < iCount) {
+      if (ch == strUnsafe[i]) {
+        int32_t iIndex = ch / 16;
+        strEncode[1] = strCode[iIndex];
+        strEncode[2] = strCode[ch - iIndex * 16];
+        wsResultBuf << FX_WSTRC(strEncode);
+        break;
+      }
+      ++i;
+    }
+    if (i < iCount) {
+      continue;
+    }
+    i = 0;
+    iCount = sizeof(strReserved) / sizeof(strReserved[0]);
+    while (i < iCount) {
+      if (ch == strReserved[i]) {
+        int32_t iIndex = ch / 16;
+        strEncode[1] = strCode[iIndex];
+        strEncode[2] = strCode[ch - iIndex * 16];
+        wsResultBuf << FX_WSTRC(strEncode);
+        break;
+      }
+      ++i;
+    }
+    if (i < iCount) {
+      continue;
+    }
+    i = 0;
+    iCount = sizeof(strSpecial) / sizeof(strSpecial[0]);
+    while (i < iCount) {
+      if (ch == strSpecial[i]) {
+        wsResultBuf.AppendChar(ch);
+        break;
+      }
+      ++i;
+    }
+    if (i < iCount) {
+      continue;
+    }
+    if (ch >= 0x80 && ch <= 0xff) {
+      int32_t iIndex = ch / 16;
+      strEncode[1] = strCode[iIndex];
+      strEncode[2] = strCode[ch - iIndex * 16];
+      wsResultBuf << FX_WSTRC(strEncode);
+    } else if (ch <= 0x1f || ch == 0x7f) {
+      int32_t iIndex = ch / 16;
+      strEncode[1] = strCode[iIndex];
+      strEncode[2] = strCode[ch - iIndex * 16];
+      wsResultBuf << FX_WSTRC(strEncode);
+    } else if (ch >= 0x20 && ch <= 0x7e) {
+      wsResultBuf.AppendChar(ch);
+    } else {
+      int32_t iRadix = 16;
+      CFX_WideString strTmp;
+      while (ch >= iRadix) {
+        FX_WCHAR tmp = strCode[ch % iRadix];
+        ch /= iRadix;
+        strTmp += tmp;
+      }
+      strTmp += strCode[ch];
+      int32_t iLen = strTmp.GetLength();
+      if (iLen < 2) {
+        break;
+      }
+      int32_t iIndex = 0;
+      if (iLen % 2 != 0) {
+        strEncode[1] = '0';
+        strEncode[2] = strTmp.GetAt(iLen - 1);
+        iIndex = iLen - 2;
+      } else {
+        strEncode[1] = strTmp.GetAt(iLen - 1);
+        strEncode[2] = strTmp.GetAt(iLen - 2);
+        iIndex = iLen - 3;
+      }
+      wsResultBuf << FX_WSTRC(strEncode);
+      while (iIndex > 0) {
+        strEncode[1] = strTmp.GetAt(iIndex);
+        strEncode[2] = strTmp.GetAt(iIndex - 1);
+        iIndex -= 2;
+        wsResultBuf << FX_WSTRC(strEncode);
+      }
+    }
+  }
+  wsResultBuf.AppendChar(0);
+  szResultBuf.Clear();
+  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
+                               wsResultBuf.GetLength());
+}
+void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString,
+                                   CFX_ByteTextBuf& szResultBuf) {
+  CFX_ByteString str = szHTMLString.GetCStr();
+  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str, str.GetLength());
+  const FX_WCHAR* strCode = L"0123456789abcdef";
+  FX_WCHAR strEncode[9];
+  strEncode[0] = '&';
+  strEncode[1] = '#';
+  strEncode[2] = 'x';
+  strEncode[5] = ';';
+  strEncode[6] = 0;
+  strEncode[7] = ';';
+  strEncode[8] = 0;
+  CFX_WideTextBuf wsResultBuf;
+  uint32_t ch = 0;
+  int32_t iLen = wsHTMLString.GetLength();
+  int32_t i = 0;
+  const FX_WCHAR* pData = wsHTMLString;
+  int32_t iIndex = 0;
+  CFX_WideString htmlReserve;
+  while (i < iLen) {
+    ch = *(pData + i);
+    htmlReserve.Empty();
+    if (HTMLCode2STR(ch, htmlReserve)) {
+      wsResultBuf.AppendChar(L'&');
+      wsResultBuf << htmlReserve;
+      wsResultBuf.AppendChar(L';');
+    } else {
+      if (ch >= 32 && ch <= 126) {
+        wsResultBuf.AppendChar((FX_WCHAR)ch);
+      } else if (ch < 256) {
+        iIndex = ch / 16;
+        strEncode[3] = strCode[iIndex];
+        strEncode[4] = strCode[ch - iIndex * 16];
+        strEncode[5] = ';';
+        strEncode[6] = 0;
+        wsResultBuf << FX_WSTRC(strEncode);
+      } else {
+        int32_t iBigByte = ch / 256;
+        int32_t iLittleByte = ch % 256;
+        strEncode[3] = strCode[iBigByte / 16];
+        strEncode[4] = strCode[iBigByte % 16];
+        strEncode[5] = strCode[iLittleByte / 16];
+        strEncode[6] = strCode[iLittleByte % 16];
+        wsResultBuf << FX_WSTRC(strEncode);
+      }
+    }
+    ++i;
+  }
+  wsResultBuf.AppendChar(0);
+  szResultBuf.Clear();
+  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
+                               wsResultBuf.GetLength());
+}
+void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString,
+                                  CFX_ByteTextBuf& szResultBuf) {
+  CFX_WideString wsXMLString =
+      CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength());
+  CFX_WideTextBuf wsResultBuf;
+  enum {
+    QUOT,
+    AMP,
+    APOS,
+    LT,
+    GT,
+  };
+  FX_WCHAR strEncode[9];
+  strEncode[0] = '&';
+  strEncode[1] = '#';
+  strEncode[2] = 'x';
+  strEncode[5] = ';';
+  strEncode[6] = 0;
+  strEncode[7] = ';';
+  strEncode[8] = 0;
+  const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
+  const FX_WCHAR* strCode = L"0123456789abcdef";
+  FX_WCHAR ch = 0;
+  int32_t iLength = wsXMLString.GetLength();
+  int32_t iIndex = 0;
+  int32_t u = 0;
+  const FX_WCHAR* pData = wsXMLString;
+  for (u = 0; u < iLength; ++u) {
+    ch = *(pData + u);
+    switch (ch) {
+      case '"':
+        wsResultBuf.AppendChar('&');
+        wsResultBuf << CFX_WideStringC(strName[QUOT]);
+        wsResultBuf.AppendChar(';');
+        break;
+      case '&':
+        wsResultBuf.AppendChar('&');
+        wsResultBuf << CFX_WideStringC(strName[AMP]);
+        wsResultBuf.AppendChar(';');
+        break;
+      case '\'':
+        wsResultBuf.AppendChar('&');
+        wsResultBuf << CFX_WideStringC(strName[APOS]);
+        wsResultBuf.AppendChar(';');
+        break;
+      case '<':
+        wsResultBuf.AppendChar('&');
+        wsResultBuf << CFX_WideStringC(strName[LT]);
+        wsResultBuf.AppendChar(';');
+        break;
+      case '>':
+        wsResultBuf.AppendChar('&');
+        wsResultBuf << CFX_WideStringC(strName[GT]);
+        wsResultBuf.AppendChar(';');
+        break;
+      default: {
+        if (ch >= 32 && ch <= 126) {
+          wsResultBuf.AppendChar(ch);
+        } else if (ch < 256) {
+          iIndex = ch / 16;
+          strEncode[3] = strCode[iIndex];
+          strEncode[4] = strCode[ch - iIndex * 16];
+          strEncode[5] = ';';
+          strEncode[6] = 0;
+          wsResultBuf << FX_WSTRC(strEncode);
+        } else {
+          int32_t iBigByte = ch / 256;
+          int32_t iLittleByte = ch % 256;
+          strEncode[3] = strCode[iBigByte / 16];
+          strEncode[4] = strCode[iBigByte % 16];
+          strEncode[5] = strCode[iLittleByte / 16];
+          strEncode[6] = strCode[iLittleByte % 16];
+          wsResultBuf << FX_WSTRC(strEncode);
+        }
+      } break;
+    }
+  }
+  wsResultBuf.AppendChar(0);
+  szResultBuf.Clear();
+  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
+                               wsResultBuf.GetLength());
+}
+FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData,
+                                        uint32_t& iCode) {
+  int32_t iLength = pData.GetLength();
+  uint32_t uHash = FX_HashCode_String_GetW(pData.GetPtr(), iLength);
+  XFA_FMHtmlHashedReserveCode htmlhashedreservecode;
+  int32_t iStart = 0,
+          iEnd = (sizeof(reservesForDecode) / sizeof(reservesForDecode[0])) - 1;
+  int32_t iMid = (iStart + iEnd) / 2;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    htmlhashedreservecode = reservesForDecode[iMid];
+    if (uHash == htmlhashedreservecode.m_uHash) {
+      iCode = htmlhashedreservecode.m_uCode;
+      return TRUE;
+    } else if (uHash < htmlhashedreservecode.m_uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return FALSE;
+}
+FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode,
+                                        CFX_WideString& wsHTMLReserve) {
+  XFA_FMHtmlReserveCode htmlreservecode;
+  int32_t iStart = 0,
+          iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1;
+  int32_t iMid = (iStart + iEnd) / 2;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    htmlreservecode = reservesForEncode[iMid];
+    if (iCode == htmlreservecode.m_uCode) {
+      wsHTMLReserve = htmlreservecode.m_htmlReserve;
+      return TRUE;
+    } else if (iCode < htmlreservecode.m_uCode) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return FALSE;
+}
+static FX_BOOL XFA_PATTERN_STRING_Type(const CFX_ByteStringC& szPattern,
+                                       FX_DWORD& patternType) {
+  CFX_WideString wsPattern =
+      CFX_WideString::FromUTF8(szPattern.GetCStr(), szPattern.GetLength());
+  if (FX_WSTRC(L"datetime") == wsPattern.Left(8)) {
+    patternType = XFA_VT_DATETIME;
+    return TRUE;
+  } else if (FX_WSTRC(L"date") == wsPattern.Left(4)) {
+    patternType = wsPattern.Find(L"time") > 0 ? XFA_VT_DATETIME : XFA_VT_DATE;
+    return TRUE;
+  } else if (FX_WSTRC(L"time") == wsPattern.Left(4)) {
+    patternType = XFA_VT_TIME;
+    return TRUE;
+  } else if (FX_WSTRC(L"text") == wsPattern.Left(4)) {
+    patternType = XFA_VT_TEXT;
+    return TRUE;
+  } else if (FX_WSTRC(L"num") == wsPattern.Left(3)) {
+    if (FX_WSTRC(L"integer") == wsPattern.Mid(4, 7)) {
+      patternType = XFA_VT_INTEGER;
+    } else if (FX_WSTRC(L"decimal") == wsPattern.Mid(4, 7)) {
+      patternType = XFA_VT_DECIMAL;
+    } else if (FX_WSTRC(L"currency") == wsPattern.Mid(4, 8)) {
+      patternType = XFA_VT_FLOAT;
+    } else if (FX_WSTRC(L"percent") == wsPattern.Mid(4, 7)) {
+      patternType = XFA_VT_FLOAT;
+    } else {
+      patternType = XFA_VT_FLOAT;
+    }
+    return TRUE;
+  }
+  patternType = XFA_VT_NULL;
+  wsPattern.MakeLower();
+  const FX_WCHAR* pData = wsPattern;
+  int32_t iLength = wsPattern.GetLength();
+  int32_t iIndex = 0;
+  FX_BOOL bSingleQuotation = FALSE;
+  FX_WCHAR patternChar;
+  while (iIndex < iLength) {
+    patternChar = *(pData + iIndex);
+    if (patternChar == 0x27) {
+      bSingleQuotation = !bSingleQuotation;
+    } else if (!bSingleQuotation &&
+               (patternChar == 'y' || patternChar == 'j')) {
+      patternType = XFA_VT_DATE;
+      iIndex++;
+      FX_WCHAR timePatternChar;
+      while (iIndex < iLength) {
+        timePatternChar = *(pData + iIndex);
+        if (timePatternChar == 0x27) {
+          bSingleQuotation = !bSingleQuotation;
+        } else if (!bSingleQuotation && timePatternChar == 't') {
+          patternType = XFA_VT_DATETIME;
+          break;
+        }
+        iIndex++;
+      }
+      break;
+    } else if (!bSingleQuotation &&
+               (patternChar == 'h' || patternChar == 'k')) {
+      patternType = XFA_VT_TIME;
+      break;
+    } else if (!bSingleQuotation &&
+               (patternChar == 'a' || patternChar == 'x' ||
+                patternChar == 'o' || patternChar == '0')) {
+      patternType = XFA_VT_TEXT;
+      if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') {
+        break;
+      }
+    } else if (!bSingleQuotation &&
+               (patternChar == 'z' || patternChar == 's' ||
+                patternChar == 'e' || patternChar == 'v' ||
+                patternChar == '8' || patternChar == ',' ||
+                patternChar == '.' || patternChar == '$')) {
+      patternType = XFA_VT_FLOAT;
+      if (patternChar == 'v' || patternChar == '8' || patternChar == '$') {
+        break;
+      }
+    }
+    iIndex++;
+  }
+  if (patternType == XFA_VT_NULL) {
+    patternType = XFA_VT_TEXT | XFA_VT_FLOAT;
+  }
+  return FALSE;
+}
+void CXFA_FM2JSContext::Format(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc >= 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    CFX_ByteString szPattern;
+    HValueToUTF8String(argOne, szPattern);
+    CFX_ByteString szValue;
+    HValueToUTF8String(argTwo, szValue);
+    CXFA_Document* pDoc = pContext->GetDocument();
+    IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+    FXSYS_assert(pThisNode);
+    CXFA_WidgetData widgetData(pThisNode);
+    IFX_Locale* pLocale = widgetData.GetLocal();
+    FX_DWORD patternType;
+    FX_BOOL bCompelte = XFA_PATTERN_STRING_Type(szPattern, patternType);
+    CFX_WideString wsPattern =
+        CFX_WideString::FromUTF8(szPattern, szPattern.GetLength());
+    CFX_WideString wsValue =
+        CFX_WideString::FromUTF8(szValue, szValue.GetLength());
+    if (!bCompelte) {
+      switch (patternType) {
+        case XFA_VT_DATETIME: {
+          FX_STRSIZE iTChar = wsPattern.Find(L'T');
+          CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
+          wsDatePattern += wsPattern.Left(iTChar);
+          wsDatePattern += FX_WSTRC(L"} ");
+          CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
+          wsTimePattern += wsPattern.Mid(iTChar + 1);
+          wsTimePattern += FX_WSTRC(L"}");
+          wsPattern = wsDatePattern + wsTimePattern;
+        } break;
+        case XFA_VT_DATE: {
+          wsPattern = FX_WSTRC(L"date{") + wsPattern;
+          wsPattern += FX_WSTRC(L"}");
+        } break;
+        case XFA_VT_TIME: {
+          wsPattern = FX_WSTRC(L"time{") + wsPattern;
+          wsPattern += FX_WSTRC(L"}");
+        } break;
+        case XFA_VT_TEXT: {
+          wsPattern = FX_WSTRC(L"text{") + wsPattern;
+          wsPattern += FX_WSTRC(L"}");
+        } break;
+        case XFA_VT_FLOAT: {
+          wsPattern = FX_WSTRC(L"num{") + wsPattern;
+          wsPattern += FX_WSTRC(L"}");
+        } break;
+        default: {
+          CFX_WideString wsTestPattern;
+          wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
+          wsTestPattern += FX_WSTRC(L"}");
+          CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
+                                           pLocale, (CXFA_LocaleMgr*)pMgr);
+          if (tempLocaleValue.IsValid()) {
+            wsPattern = wsTestPattern;
+            patternType = XFA_VT_FLOAT;
+          } else {
+            wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
+            wsTestPattern += FX_WSTRC(L"}");
+            wsPattern = wsTestPattern;
+            patternType = XFA_VT_TEXT;
+          }
+        } break;
+      }
+    }
+    CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
+                                 (CXFA_LocaleMgr*)pMgr);
+    CFX_WideString wsRet;
+    if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale,
+                                   XFA_VALUEPICTURE_Display)) {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                FX_UTF8Encode(wsRet, wsRet.GetLength()));
+    } else {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Format");
+  }
+}
+void CXFA_FM2JSContext::Left(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FX_BOOL argIsNull = FALSE;
+    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
+      argIsNull = TRUE;
+    }
+    if (argIsNull) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString sourceString;
+      HValueToUTF8String(argOne, sourceString);
+      int32_t count = HValueToInteger(hThis, argTwo);
+      if (count < 0) {
+        count = 0;
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                sourceString.Left(count));
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Left");
+  }
+}
+void CXFA_FM2JSContext::Len(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString sourceString;
+      HValueToUTF8String(argOne, sourceString);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), sourceString.GetLength());
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Len");
+  }
+}
+void CXFA_FM2JSContext::Lower(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 3)) {
+    CFX_ByteString argString;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE localeValue = 0;
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      if (argc == 2) {
+        localeValue = GetSimpleHValue(hThis, args, 1);
+      }
+      HValueToUTF8String(argOne, argString);
+      CFX_WideTextBuf lowStringBuf;
+      CFX_WideString wsArgString =
+          CFX_WideString::FromUTF8(argString, argString.GetLength());
+      const FX_WCHAR* pData = wsArgString;
+      int32_t iLen = argString.GetLength();
+      int32_t i = 0;
+      int32_t ch = 0;
+      while (i < iLen) {
+        ch = *(pData + i);
+        if (ch >= 0x41 && ch <= 0x5A) {
+          ch += 32;
+        } else if (ch >= 0xC0 && ch <= 0xDE) {
+          ch += 32;
+        } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) {
+          ch += 1;
+        }
+        lowStringBuf.AppendChar(ch);
+        ++i;
+      }
+      lowStringBuf.AppendChar(0);
+      FXJSE_Value_SetUTF8String(
+          args.GetReturnValue(),
+          FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength()));
+      if (argc == 2) {
+        FXJSE_Value_Release(localeValue);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Lower");
+  }
+}
+void CXFA_FM2JSContext::Ltrim(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString sourceString;
+      HValueToUTF8String(argOne, sourceString);
+      sourceString.TrimLeft();
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Ltrim");
+  }
+}
+void CXFA_FM2JSContext::Parse(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    if (HValueIsNull(hThis, argTwo)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString szPattern;
+      HValueToUTF8String(argOne, szPattern);
+      CFX_ByteString szValue;
+      HValueToUTF8String(argTwo, szValue);
+      CXFA_Document* pDoc = pContext->GetDocument();
+      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
+      CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
+      FXSYS_assert(pThisNode);
+      CXFA_WidgetData widgetData(pThisNode);
+      IFX_Locale* pLocale = widgetData.GetLocal();
+      FX_DWORD patternType;
+      FX_BOOL bCompletePattern =
+          XFA_PATTERN_STRING_Type(szPattern, patternType);
+      CFX_WideString wsPattern =
+          CFX_WideString::FromUTF8(szPattern, szPattern.GetLength());
+      CFX_WideString wsValue =
+          CFX_WideString::FromUTF8(szValue, szValue.GetLength());
+      CFX_ByteString szParsedValue;
+      if (bCompletePattern) {
+        CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
+                                     (CXFA_LocaleMgr*)pMgr);
+        if (localeValue.IsValid()) {
+          szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+        } else {
+          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+        }
+      } else {
+        switch (patternType) {
+          case XFA_VT_DATETIME: {
+            FX_STRSIZE iTChar = wsPattern.Find(L'T');
+            CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
+            wsDatePattern += wsPattern.Left(iTChar);
+            wsDatePattern += FX_WSTRC(L"} ");
+            CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
+            wsTimePattern += wsPattern.Mid(iTChar + 1);
+            wsTimePattern += FX_WSTRC(L"}");
+            wsPattern = wsDatePattern + wsTimePattern;
+            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+            } else {
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+            }
+          } break;
+          case XFA_VT_DATE: {
+            wsPattern = FX_WSTRC(L"date{") + wsPattern;
+            wsPattern += FX_WSTRC(L"}");
+            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+            } else {
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+            }
+          } break;
+          case XFA_VT_TIME: {
+            wsPattern = FX_WSTRC(L"time{") + wsPattern;
+            wsPattern += FX_WSTRC(L"}");
+            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+            } else {
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+            }
+          } break;
+          case XFA_VT_TEXT: {
+            wsPattern = FX_WSTRC(L"text{") + wsPattern;
+            wsPattern += FX_WSTRC(L"}");
+            CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+            } else {
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+            }
+          } break;
+          case XFA_VT_FLOAT: {
+            wsPattern = FX_WSTRC(L"num{") + wsPattern;
+            wsPattern += FX_WSTRC(L"}");
+            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              FXJSE_Value_SetDouble(args.GetReturnValue(),
+                                    localeValue.GetDoubleNum());
+            } else {
+              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+            }
+          } break;
+          default: {
+            CFX_WideString wsTestPattern;
+            wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
+            wsTestPattern += FX_WSTRC(L"}");
+            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
+                                         pLocale, (CXFA_LocaleMgr*)pMgr);
+            if (localeValue.IsValid()) {
+              FXJSE_Value_SetDouble(args.GetReturnValue(),
+                                    localeValue.GetDoubleNum());
+            } else {
+              wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
+              wsTestPattern += FX_WSTRC(L"}");
+              CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
+                                           pLocale, (CXFA_LocaleMgr*)pMgr);
+              if (localeValue.IsValid()) {
+                szParsedValue = FX_UTF8Encode(localeValue.GetValue());
+                FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
+              } else {
+                FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+              }
+            }
+          } break;
+        }
+      }
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Parse");
+  }
+}
+void CXFA_FM2JSContext::Replace(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc == 2) || (argc == 3)) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE argThree = 0;
+    CFX_ByteString oneString;
+    CFX_ByteString twoString;
+    CFX_ByteString threeString;
+    if (!HValueIsNull(hThis, argOne) && !HValueIsNull(hThis, argTwo)) {
+      HValueToUTF8String(argOne, oneString);
+      HValueToUTF8String(argTwo, twoString);
+    }
+    if (argc == 3) {
+      argThree = GetSimpleHValue(hThis, args, 2);
+      HValueToUTF8String(argThree, threeString);
+    }
+    int32_t iSrcLen = oneString.GetLength();
+    int32_t iFindLen = twoString.GetLength();
+    CFX_ByteTextBuf resultString;
+    int32_t iFindIndex = 0;
+    uint8_t ch = 0;
+    for (int32_t u = 0; u < iSrcLen; ++u) {
+      ch = oneString.GetAt(u);
+      if (ch == twoString.GetAt(iFindIndex)) {
+        int32_t iTemp = u + 1;
+        ++iFindIndex;
+        uint8_t chTemp = 0;
+        while (iFindIndex < iFindLen) {
+          chTemp = oneString.GetAt(iTemp);
+          if (chTemp == twoString.GetAt(iFindIndex)) {
+            ++iTemp;
+            ++iFindIndex;
+          } else {
+            iFindIndex = 0;
+            break;
+          }
+        }
+        if (iFindIndex == iFindLen) {
+          resultString << threeString;
+          u += iFindLen - 1;
+          iFindIndex = 0;
+        } else {
+          resultString.AppendChar(ch);
+        }
+      } else {
+        resultString.AppendChar(ch);
+      }
+    }
+    resultString.AppendChar(0);
+    FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                              resultString.GetByteString());
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    if (argc == 3) {
+      FXJSE_Value_Release(argThree);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Replace");
+  }
+}
+void CXFA_FM2JSContext::Right(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
+    FX_BOOL argIsNull = FALSE;
+    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
+      argIsNull = TRUE;
+    }
+    if (argIsNull) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString sourceString;
+      HValueToUTF8String(argOne, sourceString);
+      int32_t count = HValueToInteger(hThis, argTwo);
+      if (count < 0) {
+        count = 0;
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                sourceString.Right(count));
+    }
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Right");
+  }
+}
+void CXFA_FM2JSContext::Rtrim(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString sourceString;
+      HValueToUTF8String(argOne, sourceString);
+      sourceString.TrimRight();
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Rtrim");
+  }
+}
+void CXFA_FM2JSContext::Space(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      int32_t count = 0;
+      count = HValueToInteger(hThis, argOne);
+      count = (count < 0) ? 0 : count;
+      CFX_ByteTextBuf spaceString;
+      int32_t index = 0;
+      while (index < count) {
+        spaceString.AppendByte(' ');
+        index++;
+      }
+      spaceString.AppendByte(0);
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                spaceString.GetByteString());
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Space");
+  }
+}
+void CXFA_FM2JSContext::Str(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT fNumber;
+    int32_t iWidth = 10;
+    int32_t iPrecision = 0;
+    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE widthValue = 0;
+    FXJSE_HVALUE precisionValue = 0;
+    if (FXJSE_Value_IsNull(numberValue)) {
+      bFlags = TRUE;
+    } else {
+      fNumber = HValueToFloat(hThis, numberValue);
+    }
+    if (argc > 1) {
+      widthValue = GetSimpleHValue(hThis, args, 1);
+      iWidth = (int32_t)HValueToFloat(hThis, widthValue);
+    }
+    if (argc == 3) {
+      precisionValue = GetSimpleHValue(hThis, args, 2);
+      iPrecision = (int32_t)HValueToFloat(hThis, precisionValue);
+      if (iPrecision < 0) {
+        iPrecision = 0;
+      }
+    }
+    if (!bFlags) {
+      CFX_ByteString numberString;
+      CFX_ByteString formatStr = "%";
+      if (iPrecision) {
+        formatStr += ".";
+        formatStr += CFX_ByteString::FormatInteger(iPrecision);
+      }
+      formatStr += "f";
+      numberString.Format(formatStr, fNumber);
+      const FX_CHAR* pData = numberString;
+      int32_t iLength = numberString.GetLength();
+      int32_t u = 0;
+      while (u < iLength) {
+        if (*(pData + u) == '.') {
+          break;
+        }
+        ++u;
+      }
+      CFX_ByteTextBuf resultBuf;
+      if (u > iWidth || (iPrecision + u) >= iWidth) {
+        int32_t i = 0;
+        while (i < iWidth) {
+          resultBuf.AppendChar('*');
+          ++i;
+        }
+        resultBuf.AppendChar(0);
+      } else {
+        if (u == iLength) {
+          if (iLength > iWidth) {
+            int32_t i = 0;
+            while (i < iWidth) {
+              resultBuf.AppendChar('*');
+              ++i;
+            }
+          } else {
+            int32_t i = 0;
+            int32_t iSpace = iWidth - iLength;
+            while (i < iSpace) {
+              resultBuf.AppendChar(' ');
+              ++i;
+            }
+            resultBuf << pData;
+          }
+        } else {
+          int32_t iLeavingSpace = 0;
+          if (iPrecision == 0) {
+            iLeavingSpace = iWidth - (u + iPrecision);
+          } else {
+            iLeavingSpace = iWidth - (u + iPrecision + 1);
+          }
+          int32_t i = 0;
+          while (i < iLeavingSpace) {
+            resultBuf.AppendChar(' ');
+            ++i;
+          }
+          i = 0;
+          while (i < u) {
+            resultBuf.AppendChar(*(pData + i));
+            ++i;
+          }
+          if (iPrecision != 0) {
+            resultBuf.AppendChar('.');
+          }
+          u++;
+          i = 0;
+          while (u < iLength) {
+            if (i >= iPrecision) {
+              break;
+            }
+            resultBuf.AppendChar(*(pData + u));
+            ++i;
+            ++u;
+          }
+          while (i < iPrecision) {
+            resultBuf.AppendChar('0');
+            ++i;
+          }
+          resultBuf.AppendChar(0);
+        }
+      }
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                resultBuf.GetByteString());
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(numberValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(widthValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(precisionValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Str");
+  }
+}
+void CXFA_FM2JSContext::Stuff(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc == 3) || (argc == 4)) {
+    CFX_ByteString sourceString;
+    CFX_ByteString insertString;
+    int32_t iLength = 0;
+    int32_t iStart = 0;
+    int32_t iDelete = 0;
+    FXJSE_HVALUE sourceValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE deleteValue = GetSimpleHValue(hThis, args, 2);
+    FXJSE_HVALUE insertValue = 0;
+    if (!FXJSE_Value_IsNull(sourceValue) && !FXJSE_Value_IsNull(startValue) &&
+        !FXJSE_Value_IsNull(deleteValue)) {
+      HValueToUTF8String(sourceValue, sourceString);
+      iLength = sourceString.GetLength();
+      iStart = (int32_t)HValueToFloat(hThis, startValue);
+      if (iStart < 1) {
+        iStart = 1;
+      }
+      if (iStart > iLength) {
+        iStart = iLength;
+      }
+      iDelete = (int32_t)HValueToFloat(hThis, deleteValue);
+      if (iDelete <= 0) {
+        iDelete = 0;
+      }
+    }
+    if (argc == 4) {
+      insertValue = GetSimpleHValue(hThis, args, 3);
+      HValueToUTF8String(insertValue, insertString);
+    }
+    iStart -= 1;
+    CFX_ByteTextBuf resultString;
+    int32_t i = 0;
+    while (i < iStart) {
+      resultString.AppendChar(sourceString.GetAt(i));
+      ++i;
+    }
+    resultString << insertString;
+    i = iStart + iDelete;
+    while (i < iLength) {
+      resultString.AppendChar(sourceString.GetAt(i));
+      ++i;
+    }
+    resultString.AppendChar(0);
+    FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                              resultString.GetByteString());
+    FXJSE_Value_Release(sourceValue);
+    FXJSE_Value_Release(startValue);
+    FXJSE_Value_Release(deleteValue);
+    if (argc == 4) {
+      FXJSE_Value_Release(insertValue);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Stuff");
+  }
+}
+void CXFA_FM2JSContext::Substr(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if (argc == 3) {
+    FXJSE_HVALUE stringValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
+    FXJSE_HVALUE endValue = GetSimpleHValue(hThis, args, 2);
+    if (HValueIsNull(hThis, stringValue) || (HValueIsNull(hThis, startValue)) ||
+        (HValueIsNull(hThis, endValue))) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      CFX_ByteString szSourceStr;
+      int32_t iStart = 0;
+      int32_t iCount = 0;
+      HValueToUTF8String(stringValue, szSourceStr);
+      int32_t iLength = szSourceStr.GetLength();
+      if (iLength == 0) {
+        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+      } else {
+        iStart = (int32_t)HValueToFloat(hThis, startValue);
+        iCount = (int32_t)HValueToFloat(hThis, endValue);
+        if (iStart < 1) {
+          iStart = 1;
+        }
+        if (iStart > iLength) {
+          iStart = iLength;
+        }
+        if (iCount <= 0) {
+          iCount = 0;
+        }
+        iStart -= 1;
+        FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                  szSourceStr.Mid(iStart, iCount));
+      }
+    }
+    FXJSE_Value_Release(stringValue);
+    FXJSE_Value_Release(startValue);
+    FXJSE_Value_Release(endValue);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Substr");
+  }
+}
+void CXFA_FM2JSContext::Uuid(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc == 0) || (argc == 1)) {
+    int32_t iNum = 0;
+    FXJSE_HVALUE argOne = 0;
+    if (argc == 1) {
+      argOne = GetSimpleHValue(hThis, args, 0);
+      iNum = (int32_t)HValueToFloat(hThis, argOne);
+    }
+    FX_GUID guid;
+    FX_GUID_CreateV4(&guid);
+    CFX_ByteString bsUId;
+    FX_GUID_ToString(&guid, bsUId, iNum);
+    FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsUId);
+    if (argc == 1) {
+      FXJSE_Value_Release(argOne);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Uuid");
+  }
+}
+void CXFA_FM2JSContext::Upper(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 3)) {
+    CFX_ByteString argString;
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE localeValue = 0;
+    if (HValueIsNull(hThis, argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      if (argc == 2) {
+        localeValue = GetSimpleHValue(hThis, args, 1);
+      }
+      HValueToUTF8String(argOne, argString);
+      CFX_WideTextBuf upperStringBuf;
+      CFX_WideString wsArgString =
+          CFX_WideString::FromUTF8(argString, argString.GetLength());
+      const FX_WCHAR* pData = wsArgString;
+      int32_t iLen = wsArgString.GetLength();
+      int32_t i = 0;
+      int32_t ch = 0;
+      while (i < iLen) {
+        ch = *(pData + i);
+        if (ch >= 0x61 && ch <= 0x7A) {
+          ch -= 32;
+        } else if (ch >= 0xE0 && ch <= 0xFE) {
+          ch -= 32;
+        } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) {
+          ch -= 1;
+        }
+        upperStringBuf.AppendChar(ch);
+        ++i;
+      }
+      upperStringBuf.AppendChar(0);
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                FX_UTF8Encode(upperStringBuf.GetBuffer(),
+                                              upperStringBuf.GetLength()));
+      if (argc == 2) {
+        FXJSE_Value_Release(localeValue);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Upper");
+  }
+}
+void CXFA_FM2JSContext::WordNum(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args) {
+  int32_t argc = args.GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    FX_BOOL bFlags = FALSE;
+    FX_FLOAT fNumber;
+    int32_t iIdentifier = 0;
+    CFX_ByteString localeString;
+    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE identifierValue = 0;
+    FXJSE_HVALUE localeValue = 0;
+    if (FXJSE_Value_IsNull(numberValue)) {
+      bFlags = TRUE;
+    } else {
+      fNumber = HValueToFloat(hThis, numberValue);
+    }
+    if (argc > 1) {
+      identifierValue = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(identifierValue)) {
+        bFlags = TRUE;
+      } else {
+        iIdentifier = (int32_t)HValueToFloat(hThis, identifierValue);
+      }
+    }
+    if (argc == 3) {
+      localeValue = GetSimpleHValue(hThis, args, 2);
+      if (FXJSE_Value_IsNull(localeValue)) {
+        bFlags = TRUE;
+      } else {
+        HValueToUTF8String(localeValue, localeString);
+      }
+    }
+    if (!bFlags) {
+      if ((fNumber < 0) || (fNumber > 922337203685477550)) {
+        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "*");
+      } else {
+        CFX_ByteTextBuf resultBuf;
+        CFX_ByteString numberString;
+        numberString.Format("%.2f", fNumber);
+        WordUS(numberString, iIdentifier, resultBuf);
+        FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                  resultBuf.GetByteString());
+      }
+    } else {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    }
+    FXJSE_Value_Release(numberValue);
+    if (argc > 1) {
+      FXJSE_Value_Release(identifierValue);
+      if (argc == 3) {
+        FXJSE_Value_Release(localeValue);
+      }
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"WordNum");
+  }
+}
+void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData,
+                                   CFX_ByteTextBuf& strBuf) {
+  CFX_ByteStringC pUnits[] = {"zero", "one", "two",   "three", "four",
+                              "five", "six", "seven", "eight", "nine"};
+  CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two",   "Three", "Four",
+                                 "Five", "Six", "Seven", "Eight", "Nine"};
+  CFX_ByteStringC pTens[] = {"Ten",      "Eleven",  "Twelve",  "Thirteen",
+                             "Fourteen", "Fifteen", "Sixteen", "Seventeen",
+                             "Eighteen", "Nineteen"};
+  CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty",  "Forty",  "Fifty",
+                                 "Sixty",  "Seventy", "Eighty", "Ninety"};
+  CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ",
+                             " Billion ", "Trillion"};
+  int32_t iComm = 0;
+  const FX_CHAR* pData = szData.GetCStr();
+  int32_t iLength = szData.GetLength();
+  if (iLength > 12) {
+    iComm = 4;
+  } else if (iLength > 9) {
+    iComm = 3;
+  } else if (iLength > 6) {
+    iComm = 2;
+  } else if (iLength > 3) {
+    iComm = 1;
+  }
+  int32_t iIndex = 0;
+  int32_t iFirstCount = iLength % 3;
+  if (iFirstCount == 0) {
+    iFirstCount = 3;
+  }
+  if (iFirstCount == 3) {
+    if (*(pData + iIndex) != '0') {
+      strBuf << pCapUnits[*(pData + iIndex) - '0'];
+      strBuf << pComm[0];
+    }
+    if (*(pData + iIndex + 1) == '0') {
+      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
+    } else {
+      if (*(pData + iIndex + 1) > '1') {
+        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
+        strBuf << "-";
+        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
+      } else if (*(pData + iIndex + 1) == '1') {
+        strBuf << pTens[*(pData + iIndex + 2) - '0'];
+      } else if (*(pData + iIndex + 1) == '0') {
+        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
+      }
+    }
+    iIndex += 3;
+  } else if (iFirstCount == 2) {
+    if (*(pData + iIndex) == '0') {
+      strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
+    } else {
+      if (*(pData + iIndex) > '1') {
+        strBuf << pLastTens[*(pData + iIndex) - '2'];
+        strBuf << "-";
+        strBuf << pUnits[*(pData + iIndex + 1) - '0'];
+      } else if (*(pData + iIndex) == '1') {
+        strBuf << pTens[*(pData + iIndex + 1) - '0'];
+      } else if (*(pData + iIndex) == '0') {
+        strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
+      }
+    }
+    iIndex += 2;
+  } else if (iFirstCount == 1) {
+    strBuf << pCapUnits[*(pData + iIndex) - '0'];
+    iIndex += 1;
+  }
+  if (iLength > 3 && iFirstCount > 0) {
+    strBuf << pComm[iComm];
+    --iComm;
+  }
+  while (iIndex < iLength) {
+    if (*(pData + iIndex) != '0') {
+      strBuf << pCapUnits[*(pData + iIndex) - '0'];
+      strBuf << pComm[0];
+    }
+    if (*(pData + iIndex + 1) == '0') {
+      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
+    } else {
+      if (*(pData + iIndex + 1) > '1') {
+        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
+        strBuf << "-";
+        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
+      } else if (*(pData + iIndex + 1) == '1') {
+        strBuf << pTens[*(pData + iIndex + 2) - '0'];
+      } else if (*(pData + iIndex + 1) == '0') {
+        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
+      }
+    }
+    if (iIndex < iLength - 3) {
+      strBuf << pComm[iComm];
+      --iComm;
+    }
+    iIndex += 3;
+  }
+}
+void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData,
+                               int32_t iStyle,
+                               CFX_ByteTextBuf& strBuf) {
+  const FX_CHAR* pData = szData.GetCStr();
+  int32_t iLength = szData.GetLength();
+  switch (iStyle) {
+    case 0: {
+      int32_t iIndex = 0;
+      while (iIndex < iLength) {
+        if (*(pData + iIndex) == '.') {
+          break;
+        }
+        ++iIndex;
+      }
+      iLength = iIndex;
+      iIndex = 0;
+      int32_t iCount = 0;
+      while (iIndex < iLength) {
+        iCount = (iLength - iIndex) % 12;
+        if (!iCount && iLength - iIndex > 0) {
+          iCount = 12;
+        }
+        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
+        iIndex += iCount;
+        if (iIndex < iLength) {
+          strBuf << " Trillion ";
+        }
+      }
+    } break;
+    case 1: {
+      int32_t iIndex = 0;
+      while (iIndex < iLength) {
+        if (*(pData + iIndex) == '.') {
+          break;
+        }
+        ++iIndex;
+      }
+      iLength = iIndex;
+      iIndex = 0;
+      int32_t iCount = 0;
+      while (iIndex < iLength) {
+        iCount = (iLength - iIndex) % 12;
+        if (!iCount && iLength - iIndex > 0) {
+          iCount = 12;
+        }
+        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
+        iIndex += iCount;
+        if (iIndex < iLength) {
+          strBuf << " Trillion ";
+        }
+      }
+      strBuf << " Dollars";
+    } break;
+    case 2: {
+      int32_t iIndex = 0;
+      while (iIndex < iLength) {
+        if (*(pData + iIndex) == '.') {
+          break;
+        }
+        ++iIndex;
+      }
+      int32_t iInteger = iIndex;
+      iIndex = 0;
+      int32_t iCount = 0;
+      while (iIndex < iInteger) {
+        iCount = (iInteger - iIndex) % 12;
+        if (!iCount && iLength - iIndex > 0) {
+          iCount = 12;
+        }
+        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
+        iIndex += iCount;
+        if (iIndex < iInteger) {
+          strBuf << " Trillion ";
+        }
+      }
+      strBuf << " Dollars";
+      if (iInteger < iLength) {
+        strBuf << " And ";
+        iIndex = iInteger + 1;
+        int32_t iCount = 0;
+        while (iIndex < iLength) {
+          iCount = (iLength - iIndex) % 12;
+          if (!iCount && iLength - iIndex > 0) {
+            iCount = 12;
+          }
+          TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
+          iIndex += iCount;
+          if (iIndex < iLength) {
+            strBuf << " Trillion ";
+          }
+        }
+        strBuf << " Cents";
+      }
+    } break;
+    default:
+      break;
+  }
+}
+void CXFA_FM2JSContext::Get(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    CXFA_Document* pDoc = pContext->GetDocument();
+    if (!pDoc) {
+      return;
+    }
+    IXFA_AppProvider* pAppProvider =
+        pDoc->GetParser()->GetNotify()->GetAppProvider();
+    if (!pAppProvider) {
+      return;
+    }
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    CFX_ByteString urlString;
+    HValueToUTF8String(argOne, urlString);
+    IFX_FileRead* pFile = pAppProvider->DownloadURL(
+        CFX_WideString::FromUTF8(urlString, urlString.GetLength()));
+    if (pFile) {
+      int32_t size = pFile->GetSize();
+      uint8_t* pData = FX_Alloc(uint8_t, size);
+      pFile->ReadBlock(pData, size);
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
+                                CFX_ByteStringC(pData, size));
+      FX_Free(pData);
+      pFile->Release();
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Get");
+  }
+}
+void CXFA_FM2JSContext::Post(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if ((argc >= 2) && (argc <= 5)) {
+    CXFA_Document* pDoc = pContext->GetDocument();
+    if (!pDoc) {
+      return;
+    }
+    IXFA_AppProvider* pAppProvider =
+        pDoc->GetParser()->GetNotify()->GetAppProvider();
+    if (!pAppProvider) {
+      return;
+    }
+    CFX_ByteString bsURL;
+    CFX_ByteString bsData;
+    CFX_ByteString bsContentType;
+    CFX_ByteString bsEncode;
+    CFX_ByteString bsHeader;
+    FXJSE_HVALUE argOne;
+    FXJSE_HVALUE argTwo;
+    FXJSE_HVALUE argThree;
+    FXJSE_HVALUE argFour;
+    FXJSE_HVALUE argFive;
+    argOne = GetSimpleHValue(hThis, args, 0);
+    HValueToUTF8String(argOne, bsURL);
+    argTwo = GetSimpleHValue(hThis, args, 1);
+    HValueToUTF8String(argTwo, bsData);
+    if (argc > 2) {
+      argThree = GetSimpleHValue(hThis, args, 2);
+      HValueToUTF8String(argThree, bsContentType);
+    }
+    if (argc > 3) {
+      argFour = GetSimpleHValue(hThis, args, 3);
+      HValueToUTF8String(argFour, bsEncode);
+    }
+    if (argc > 4) {
+      argFive = GetSimpleHValue(hThis, args, 4);
+      HValueToUTF8String(argFive, bsHeader);
+    }
+    CFX_WideString decodedResponse;
+    FX_BOOL bFlags = pAppProvider->PostRequestURL(
+        CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()),
+        CFX_WideString::FromUTF8(bsData, bsData.GetLength()),
+        CFX_WideString::FromUTF8(bsContentType, bsContentType.GetLength()),
+        CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()),
+        CFX_WideString::FromUTF8(bsHeader, bsHeader.GetLength()),
+        decodedResponse);
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    if (argc > 2) {
+      FXJSE_Value_Release(argThree);
+    }
+    if (argc > 3) {
+      FXJSE_Value_Release(argFour);
+    }
+    if (argc > 4) {
+      FXJSE_Value_Release(argFive);
+    }
+    if (bFlags) {
+      FXJSE_Value_SetUTF8String(
+          args.GetReturnValue(),
+          FX_UTF8Encode(decodedResponse, decodedResponse.GetLength()));
+    } else {
+      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
+    }
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Post");
+  }
+}
+void CXFA_FM2JSContext::Put(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if ((argc == 2) || (argc == 3)) {
+    CXFA_Document* pDoc = pContext->GetDocument();
+    if (!pDoc) {
+      return;
+    }
+    IXFA_AppProvider* pAppProvider =
+        pDoc->GetParser()->GetNotify()->GetAppProvider();
+    if (!pAppProvider) {
+      return;
+    }
+    CFX_ByteString bsURL;
+    CFX_ByteString bsData;
+    CFX_ByteString bsEncode;
+    FXJSE_HVALUE argOne;
+    FXJSE_HVALUE argTwo;
+    FXJSE_HVALUE argThree;
+    argOne = GetSimpleHValue(hThis, args, 0);
+    HValueToUTF8String(argOne, bsURL);
+    argTwo = GetSimpleHValue(hThis, args, 1);
+    HValueToUTF8String(argTwo, bsData);
+    if (argc > 2) {
+      argThree = GetSimpleHValue(hThis, args, 2);
+      HValueToUTF8String(argThree, bsEncode);
+    }
+    FX_BOOL bFlags = pAppProvider->PutRequestURL(
+        CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()),
+        CFX_WideString::FromUTF8(bsData, bsData.GetLength()),
+        CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()));
+    FXJSE_Value_Release(argOne);
+    FXJSE_Value_Release(argTwo);
+    if (argc > 2) {
+      FXJSE_Value_Release(argThree);
+    }
+    if (bFlags) {
+      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
+    } else {
+      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
+    }
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Put");
+  }
+}
+void CXFA_FM2JSContext::assign_value_operator(FXJSE_HOBJECT hThis,
+                                              const CFX_ByteStringC& szFuncName,
+                                              CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE lValue = args.GetValue(0);
+    FXJSE_HVALUE rValue = GetSimpleHValue(hThis, args, 1);
+    FX_BOOL bSetStatus = TRUE;
+    if (FXJSE_Value_IsArray(lValue)) {
+      FXJSE_HVALUE leftLengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(lValue, "length", leftLengthValue);
+      int32_t iLeftLength = FXJSE_Value_ToInteger(leftLengthValue);
+      FXJSE_Value_Release(leftLengthValue);
+      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(lValue, 1, propertyValue);
+      if (FXJSE_Value_IsNull(propertyValue)) {
+        for (int32_t i = 2; i < iLeftLength; i++) {
+          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
+          bSetStatus = SetObjectDefaultValue(jsObjectValue, rValue);
+          if (!bSetStatus) {
+            pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
+            break;
+          }
+        }
+      } else {
+        CFX_ByteString propertyStr;
+        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+        for (int32_t i = 2; i < iLeftLength; i++) {
+          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
+          FXJSE_Value_SetObjectProp(jsObjectValue, propertyStr, rValue);
+        }
+      }
+      FXJSE_Value_Release(jsObjectValue);
+      FXJSE_Value_Release(propertyValue);
+    } else if (FXJSE_Value_IsObject(lValue)) {
+      bSetStatus = SetObjectDefaultValue(lValue, rValue);
+      if (!bSetStatus) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
+      }
+    }
+    FXJSE_Value_Set(args.GetReturnValue(), rValue);
+    FXJSE_Value_Release(lValue);
+    FXJSE_Value_Release(rValue);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::logical_or_operator(FXJSE_HOBJECT hThis,
+                                            const CFX_ByteStringC& szFuncName,
+                                            CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_FLOAT first = HValueToFloat(hThis, argFirst);
+      FX_FLOAT second = HValueToFloat(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first || second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::logical_and_operator(FXJSE_HOBJECT hThis,
+                                             const CFX_ByteStringC& szFuncName,
+                                             CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_FLOAT first = HValueToFloat(hThis, argFirst);
+      FX_FLOAT second = HValueToFloat(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first && second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::equality_operator(FXJSE_HOBJECT hThis,
+                                          const CFX_ByteStringC& szFuncName,
+                                          CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    if (fm_ref_equal(hThis, args)) {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
+    } else {
+      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+        FXJSE_Value_SetInteger(
+            args.GetReturnValue(),
+            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
+                ? 1
+                : 0);
+      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+                 FXJSE_Value_IsUTF8String(argSecond)) {
+        CFX_ByteString firstOutput;
+        CFX_ByteString secondOutput;
+        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               firstOutput.Equal(secondOutput) ? 1 : 0);
+      } else {
+        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               (first == second) ? 1 : 0);
+      }
+      FXJSE_Value_Release(argFirst);
+      FXJSE_Value_Release(argSecond);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::notequality_operator(FXJSE_HOBJECT hThis,
+                                             const CFX_ByteStringC& szFuncName,
+                                             CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    if (fm_ref_equal(hThis, args)) {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+    } else {
+      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+        FXJSE_Value_SetInteger(
+            args.GetReturnValue(),
+            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
+                ? 0
+                : 1);
+      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+                 FXJSE_Value_IsUTF8String(argSecond)) {
+        CFX_ByteString firstOutput;
+        CFX_ByteString secondOutput;
+        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               firstOutput.Equal(secondOutput) ? 0 : 1);
+      } else {
+        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+        FXJSE_Value_SetInteger(args.GetReturnValue(),
+                               (first == second) ? 0 : 1);
+      }
+      FXJSE_Value_Release(argFirst);
+      FXJSE_Value_Release(argSecond);
+    }
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+FX_BOOL CXFA_FM2JSContext::fm_ref_equal(FXJSE_HOBJECT hThis,
+                                        CFXJSE_Arguments& args) {
+  FX_BOOL bRet = FALSE;
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  FXJSE_HVALUE argFirst = args.GetValue(0);
+  FXJSE_HVALUE argSecond = args.GetValue(0);
+  if (FXJSE_Value_IsArray(argFirst) && FXJSE_Value_IsArray(argSecond)) {
+    FXJSE_HVALUE firstFlagValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE secondFlagValue = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectPropByIdx(argFirst, 0, firstFlagValue);
+    FXJSE_Value_GetObjectPropByIdx(argSecond, 0, secondFlagValue);
+    if ((FXJSE_Value_ToInteger(firstFlagValue) == 3) &&
+        (FXJSE_Value_ToInteger(secondFlagValue) == 3)) {
+      FXJSE_HVALUE firstJSObject = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE secondJSObject = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(argFirst, 2, firstJSObject);
+      FXJSE_Value_GetObjectPropByIdx(argSecond, 2, secondJSObject);
+      if (!FXJSE_Value_IsNull(firstJSObject) &&
+          !FXJSE_Value_IsNull(secondJSObject)) {
+        bRet = (FXJSE_Value_ToObject(firstJSObject, NULL) ==
+                FXJSE_Value_ToObject(secondJSObject, NULL));
+      }
+      FXJSE_Value_Release(firstJSObject);
+      FXJSE_Value_Release(secondJSObject);
+    }
+    FXJSE_Value_Release(firstFlagValue);
+    FXJSE_Value_Release(secondFlagValue);
+  }
+  FXJSE_Value_Release(argFirst);
+  FXJSE_Value_Release(argSecond);
+  return bRet;
+}
+void CXFA_FM2JSContext::less_operator(FXJSE_HOBJECT hThis,
+                                      const CFX_ByteStringC& szFuncName,
+                                      CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+               FXJSE_Value_IsUTF8String(argSecond)) {
+      CFX_ByteString firstOutput;
+      CFX_ByteString secondOutput;
+      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+      FXJSE_Value_SetInteger(args.GetReturnValue(),
+                             (firstOutput.Compare(secondOutput) == -1) ? 1 : 0);
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first < second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::lessequal_operator(FXJSE_HOBJECT hThis,
+                                           const CFX_ByteStringC& szFuncName,
+                                           CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetInteger(
+          args.GetReturnValue(),
+          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
+                                                                          : 0);
+    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+               FXJSE_Value_IsUTF8String(argSecond)) {
+      CFX_ByteString firstOutput;
+      CFX_ByteString secondOutput;
+      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+      FXJSE_Value_SetInteger(args.GetReturnValue(),
+                             (firstOutput.Compare(secondOutput) != 1) ? 1 : 0);
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first <= second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::greater_operator(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szFuncName,
+                                         CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
+    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+               FXJSE_Value_IsUTF8String(argSecond)) {
+      CFX_ByteString firstOutput;
+      CFX_ByteString secondOutput;
+      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+      FXJSE_Value_SetInteger(args.GetReturnValue(),
+                             (firstOutput.Compare(secondOutput) == 1) ? 1 : 0);
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first > second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::greaterequal_operator(FXJSE_HOBJECT hThis,
+                                              const CFX_ByteStringC& szFuncName,
+                                              CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetInteger(
+          args.GetReturnValue(),
+          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
+                                                                          : 0);
+    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
+               FXJSE_Value_IsUTF8String(argSecond)) {
+      CFX_ByteString firstOutput;
+      CFX_ByteString secondOutput;
+      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
+      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
+      FXJSE_Value_SetInteger(args.GetReturnValue(),
+                             (firstOutput.Compare(secondOutput) != -1) ? 1 : 0);
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first >= second) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::plus_operator(FXJSE_HOBJECT hThis,
+                                      const CFX_ByteStringC& szFuncName,
+                                      CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = args.GetValue(0);
+    FXJSE_HVALUE argSecond = args.GetValue(1);
+    if (HValueIsNull(hThis, argFirst) && HValueIsNull(hThis, argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetDouble(args.GetReturnValue(), first + second);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::minus_operator(FXJSE_HOBJECT hThis,
+                                       const CFX_ByteStringC& szFuncName,
+                                       CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetDouble(args.GetReturnValue(), first - second);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::multiple_operator(FXJSE_HOBJECT hThis,
+                                          const CFX_ByteStringC& szFuncName,
+                                          CFXJSE_Arguments& args) {
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      FXJSE_Value_SetDouble(args.GetReturnValue(), first * second);
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::divide_operator(FXJSE_HOBJECT hThis,
+                                        const CFX_ByteStringC& szFuncName,
+                                        CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  if (args.GetLength() == 2) {
+    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
+    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
+    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
+      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
+      if (second == 0.0) {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
+      } else {
+        FXJSE_Value_SetDouble(args.GetReturnValue(), first / second);
+      }
+    }
+    FXJSE_Value_Release(argFirst);
+    FXJSE_Value_Release(argSecond);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::positive_operator(FXJSE_HOBJECT hThis,
+                                          const CFX_ByteStringC& szFuncName,
+                                          CFXJSE_Arguments& args) {
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FXJSE_Value_SetDouble(args.GetReturnValue(),
+                            0.0 + HValueToDouble(hThis, argOne));
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::negative_operator(FXJSE_HOBJECT hThis,
+                                          const CFX_ByteStringC& szFuncName,
+                                          CFXJSE_Arguments& args) {
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FXJSE_Value_SetDouble(args.GetReturnValue(),
+                            0.0 - HValueToDouble(hThis, argOne));
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::logical_not_operator(FXJSE_HOBJECT hThis,
+                                             const CFX_ByteStringC& szFuncName,
+                                             CFXJSE_Arguments& args) {
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    if (FXJSE_Value_IsNull(argOne)) {
+      FXJSE_Value_SetNull(args.GetReturnValue());
+    } else {
+      FX_DOUBLE first = HValueToDouble(hThis, argOne);
+      FXJSE_Value_SetInteger(args.GetReturnValue(), (first == 0.0) ? 1 : 0);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    CXFA_FM2JSContext* pContext =
+        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::dot_accessor(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  if ((argc == 4) || (argc == 5)) {
+    FX_BOOL bIsStar = TRUE;
+    FXJSE_HVALUE argAccessor = args.GetValue(0);
+    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
+    CFX_ByteString szName = args.GetUTF8String(2);
+    int32_t iIndexFlags = args.GetInt32(3);
+    int32_t iIndexValue = 0;
+    FXJSE_HVALUE argIndex = NULL;
+    if (argc == 5) {
+      bIsStar = FALSE;
+      argIndex = args.GetValue(4);
+      iIndexValue = HValueToInteger(hThis, argIndex);
+    }
+    CFX_ByteString szSomExp;
+    GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp);
+    if (FXJSE_Value_IsArray(argAccessor)) {
+      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
+      FXJSE_Value_Release(hLengthValue);
+      int32_t iCounter = 0;
+      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
+      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
+      for (int32_t i = 0; i < (iLength - 2); i++) {
+        iSizes[i] = 0;
+      }
+      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
+      FX_BOOL bAttribute = FALSE;
+      for (int32_t i = 2; i < iLength; i++) {
+        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
+        XFA_RESOLVENODE_RS resoveNodeRS;
+        int32_t iRet = ResolveObjects(hThis, hJSObjValue, szSomExp,
+                                      resoveNodeRS, TRUE, szName.IsEmpty());
+        if (iRet > 0) {
+          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
+                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
+          iCounter += iSizes[i - 2];
+        }
+      }
+      FXJSE_Value_Release(hJSObjValue);
+      if (iCounter > 0) {
+        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
+        for (int32_t i = 0; i < (iCounter + 2); i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 1);
+        if (bAttribute) {
+          FXJSE_Value_SetUTF8String(rgValues[1], szName);
+        } else {
+          FXJSE_Value_SetNull(rgValues[1]);
+        }
+        int32_t iIndex = 2;
+        for (int32_t i = 0; i < iLength - 2; i++) {
+          for (int32_t j = 0; j < iSizes[i]; j++) {
+            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
+            iIndex++;
+          }
+        }
+        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
+        for (int32_t i = 0; i < (iCounter + 2); i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+        FX_Free(rgValues);
+      } else {
+        CFX_WideString wsPropertyName =
+            CFX_WideString::FromUTF8(szName, szName.GetLength());
+        CFX_WideString wsSomExpression =
+            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
+                                          (const FX_WCHAR*)wsPropertyName,
+                                          (const FX_WCHAR*)wsSomExpression);
+      }
+      for (int32_t i = 0; i < iLength - 2; i++) {
+        for (int32_t j = 0; j < iSizes[i]; j++) {
+          FXJSE_Value_Release(hResolveValues[i][j]);
+        }
+        if (iSizes[i] > 0) {
+          FX_Free(hResolveValues[i]);
+        }
+      }
+      FX_Free(hResolveValues);
+      FX_Free(iSizes);
+    } else {
+      XFA_RESOLVENODE_RS resoveNodeRS;
+      int32_t iRet = 0;
+      if (FXJSE_Value_IsObject(argAccessor) ||
+          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
+        iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, TRUE,
+                              szName.IsEmpty());
+      } else if (!FXJSE_Value_IsObject(argAccessor) &&
+                 !bsAccessorName.IsEmpty()) {
+        FX_BOOL bGetObject =
+            GetObjectByName(hThis, argAccessor, bsAccessorName);
+        if (bGetObject) {
+          iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS,
+                                TRUE, szName.IsEmpty());
+        }
+      }
+      if (iRet > 0) {
+        FXJSE_HVALUE* hResolveValues;
+        int32_t iSize = 0;
+        FX_BOOL bAttribute = FALSE;
+        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
+                           iSize, bAttribute);
+        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
+        for (int32_t i = 0; i < (iSize + 2); i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 1);
+        if (bAttribute) {
+          FXJSE_Value_SetUTF8String(rgValues[1], szName);
+        } else {
+          FXJSE_Value_SetNull(rgValues[1]);
+        }
+        for (int32_t i = 0; i < iSize; i++) {
+          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
+        }
+        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
+        for (int32_t i = 0; i < (iSize + 2); i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+        FX_Free(rgValues);
+        for (int32_t i = 0; i < iSize; i++) {
+          FXJSE_Value_Release(hResolveValues[i]);
+        }
+        FX_Free(hResolveValues);
+      } else {
+        CFX_WideString wsPropertyName =
+            CFX_WideString::FromUTF8(szName, szName.GetLength());
+        CFX_WideString wsSomExpression =
+            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
+                                          (const FX_WCHAR*)wsPropertyName,
+                                          (const FX_WCHAR*)wsSomExpression);
+      }
+    }
+    if (argc == 5) {
+      FXJSE_Value_Release(argIndex);
+    }
+    FXJSE_Value_Release(argAccessor);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::dotdot_accessor(FXJSE_HOBJECT hThis,
+                                        const CFX_ByteStringC& szFuncName,
+                                        CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  if ((argc == 4) || (argc == 5)) {
+    FX_BOOL bIsStar = TRUE;
+    FXJSE_HVALUE argAccessor = args.GetValue(0);
+    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
+    CFX_ByteString szName = args.GetUTF8String(2);
+    int32_t iIndexFlags = args.GetInt32(3);
+    int32_t iIndexValue = 0;
+    FXJSE_HVALUE argIndex = NULL;
+    if (argc == 5) {
+      bIsStar = FALSE;
+      argIndex = args.GetValue(4);
+      iIndexValue = HValueToInteger(hThis, argIndex);
+    }
+    CFX_ByteString szSomExp;
+    GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp);
+    if (FXJSE_Value_IsArray(argAccessor)) {
+      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
+      int32_t iCounter = 0;
+      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
+      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
+      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
+      FX_BOOL bAttribute = FALSE;
+      for (int32_t i = 2; i < iLength; i++) {
+        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
+        XFA_RESOLVENODE_RS resoveNodeRS;
+        int32_t iRet =
+            ResolveObjects(hThis, hJSObjValue, szSomExp, resoveNodeRS, FALSE);
+        if (iRet > 0) {
+          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
+                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
+          iCounter += iSizes[i - 2];
+        }
+      }
+      FXJSE_Value_Release(hJSObjValue);
+      if (iCounter > 0) {
+        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
+        for (int32_t i = 0; i < (iCounter + 2); i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 1);
+        if (bAttribute) {
+          FXJSE_Value_SetUTF8String(rgValues[1], szName);
+        } else {
+          FXJSE_Value_SetNull(rgValues[1]);
+        }
+        int32_t iIndex = 2;
+        for (int32_t i = 0; i < iLength - 2; i++) {
+          for (int32_t j = 0; j < iSizes[i]; j++) {
+            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
+            iIndex++;
+          }
+        }
+        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
+        for (int32_t i = 0; i < (iCounter + 2); i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+        FX_Free(rgValues);
+      } else {
+        CFX_WideString wsPropertyName =
+            CFX_WideString::FromUTF8(szName, szName.GetLength());
+        CFX_WideString wsSomExpression =
+            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
+                                          (const FX_WCHAR*)wsPropertyName,
+                                          (const FX_WCHAR*)wsSomExpression);
+      }
+      for (int32_t i = 0; i < iLength - 2; i++) {
+        for (int32_t j = 0; j < iSizes[i]; j++) {
+          FXJSE_Value_Release(hResolveValues[i][j]);
+        }
+        FX_Free(hResolveValues[i]);
+      }
+      FX_Free(hResolveValues);
+      FX_Free(iSizes);
+      FXJSE_Value_Release(hLengthValue);
+    } else {
+      XFA_RESOLVENODE_RS resoveNodeRS;
+      int32_t iRet = 0;
+      if (FXJSE_Value_IsObject(argAccessor) ||
+          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
+        iRet =
+            ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE);
+      } else if (!FXJSE_Value_IsObject(argAccessor) &&
+                 !bsAccessorName.IsEmpty()) {
+        FX_BOOL bGetObject =
+            GetObjectByName(hThis, argAccessor, bsAccessorName);
+        if (bGetObject) {
+          iRet =
+              ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE);
+        }
+      }
+      if (iRet > 0) {
+        FXJSE_HVALUE* hResolveValues;
+        int32_t iSize = 0;
+        FX_BOOL bAttribute = FALSE;
+        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
+                           iSize, bAttribute);
+        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
+        for (int32_t i = 0; i < (iSize + 2); i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 1);
+        if (bAttribute) {
+          FXJSE_Value_SetUTF8String(rgValues[1], szName);
+        } else {
+          FXJSE_Value_SetNull(rgValues[1]);
+        }
+        for (int32_t i = 0; i < iSize; i++) {
+          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
+        }
+        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
+        for (int32_t i = 0; i < (iSize + 2); i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+        FX_Free(rgValues);
+        for (int32_t i = 0; i < iSize; i++) {
+          FXJSE_Value_Release(hResolveValues[i]);
+        }
+        FX_Free(hResolveValues);
+      } else {
+        CFX_WideString wsPropertyName =
+            CFX_WideString::FromUTF8(szName, szName.GetLength());
+        CFX_WideString wsSomExpression =
+            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
+        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
+                                          (const FX_WCHAR*)wsPropertyName,
+                                          (const FX_WCHAR*)wsSomExpression);
+      }
+    }
+    if (argc == 5) {
+      FXJSE_Value_Release(argIndex);
+    }
+    FXJSE_Value_Release(argAccessor);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::eval_translation(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szFuncName,
+                                         CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
+    CFX_ByteString argString;
+    HValueToUTF8String(argOne, argString);
+    if (argString.IsEmpty()) {
+      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    } else {
+      CFX_WideString scriptString =
+          CFX_WideString::FromUTF8(argString, argString.GetLength());
+      CFX_WideTextBuf wsJavaScriptBuf;
+      CFX_WideString wsError;
+      XFA_FM2JS_Translate(scriptString, wsJavaScriptBuf, wsError);
+      if (wsError.IsEmpty()) {
+        CFX_WideString javaScript = wsJavaScriptBuf.GetWideString();
+        FXJSE_Value_SetUTF8String(
+            args.GetReturnValue(),
+            FX_UTF8Encode(javaScript, javaScript.GetLength()));
+      } else {
+        pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+      }
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                                      L"Eval");
+  }
+}
+void CXFA_FM2JSContext::is_fm_object(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FXJSE_Value_SetBoolean(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
+    FXJSE_Value_Release(argOne);
+  } else {
+    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
+  }
+}
+void CXFA_FM2JSContext::is_fm_array(FXJSE_HOBJECT hThis,
+                                    const CFX_ByteStringC& szFuncName,
+                                    CFXJSE_Arguments& args) {
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    FX_BOOL bIsArray = FXJSE_Value_IsArray(argOne);
+    FXJSE_Value_SetBoolean(args.GetReturnValue(), bIsArray);
+    FXJSE_Value_Release(argOne);
+  } else {
+    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
+  }
+}
+void CXFA_FM2JSContext::get_fm_value(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t iLength = args.GetLength();
+  if (iLength == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (FXJSE_Value_IsArray(argOne)) {
+      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
+      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsobjectValue);
+      if (FXJSE_Value_IsNull(propertyValue)) {
+        GetObjectDefaultValue(jsobjectValue, args.GetReturnValue());
+      } else {
+        CFX_ByteString propertyStr;
+        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr,
+                                  args.GetReturnValue());
+      }
+      FXJSE_Value_Release(propertyValue);
+      FXJSE_Value_Release(jsobjectValue);
+    } else if (FXJSE_Value_IsObject(argOne)) {
+      GetObjectDefaultValue(argOne, args.GetReturnValue());
+    } else {
+      FXJSE_Value_Set(args.GetReturnValue(), argOne);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::get_fm_jsobj(FXJSE_HOBJECT hThis,
+                                     const CFX_ByteStringC& szFuncName,
+                                     CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(hThis, nullptr));
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (FXJSE_Value_IsArray(argOne)) {
+#ifndef NDEBUG
+      FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
+      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
+      FXJSE_Value_Release(lengthValue);
+#endif
+      FXJSE_Value_GetObjectPropByIdx(argOne, 2, args.GetReturnValue());
+    } else {
+      FXJSE_Value_Set(args.GetReturnValue(), argOne);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::fm_var_filter(FXJSE_HOBJECT hThis,
+                                      const CFX_ByteStringC& szFuncName,
+                                      CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t argc = args.GetLength();
+  if (argc == 1) {
+    FXJSE_HVALUE argOne = args.GetValue(0);
+    if (FXJSE_Value_IsArray(argOne)) {
+#ifndef NDEBUG
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
+      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
+      FXJSE_Value_Release(lengthValue);
+#endif
+      FXJSE_HVALUE flagsValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(argOne, 0, flagsValue);
+      int32_t iFlags = FXJSE_Value_ToInteger(flagsValue);
+      FXJSE_Value_Release(flagsValue);
+      if (iFlags == 4) {
+        FXJSE_HVALUE rgValues[3];
+        for (int32_t i = 0; i < 3; i++) {
+          rgValues[i] = FXJSE_Value_Create(hruntime);
+        }
+        FXJSE_Value_SetInteger(rgValues[0], 3);
+        FXJSE_Value_SetNull(rgValues[1]);
+        FXJSE_Value_SetNull(rgValues[2]);
+        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
+        for (int32_t i = 0; i < 3; i++) {
+          FXJSE_Value_Release(rgValues[i]);
+        }
+      } else if (iFlags == 3) {
+        FXJSE_HVALUE objectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argOne, 2, objectValue);
+        if (!FXJSE_Value_IsNull(objectValue)) {
+          FXJSE_Value_Set(args.GetReturnValue(), argOne);
+        } else {
+          pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+        }
+        FXJSE_Value_Release(objectValue);
+      } else {
+        FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
+        FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
+        FXJSE_Value_Release(simpleValue);
+      }
+    } else {
+      FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
+      FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
+      FXJSE_Value_Release(simpleValue);
+    }
+    FXJSE_Value_Release(argOne);
+  } else {
+    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
+  }
+}
+void CXFA_FM2JSContext::concat_fm_object(FXJSE_HOBJECT hThis,
+                                         const CFX_ByteStringC& szFuncName,
+                                         CFXJSE_Arguments& args) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  uint32_t iLength = 0;
+  int32_t argCount = args.GetLength();
+  FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argCount);
+  for (int32_t i = 0; i < argCount; i++) {
+    argValues[i] = args.GetValue(i);
+    if (FXJSE_Value_IsArray(argValues[i])) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
+      int32_t length = FXJSE_Value_ToInteger(lengthValue);
+      iLength = iLength + ((length > 2) ? (length - 2) : 0);
+      FXJSE_Value_Release(lengthValue);
+    }
+    iLength += 1;
+  }
+  FXJSE_HVALUE* returnValues = FX_Alloc(FXJSE_HVALUE, iLength);
+  for (int32_t i = 0; i < (int32_t)iLength; i++) {
+    returnValues[i] = FXJSE_Value_Create(hruntime);
+  }
+  int32_t index = 0;
+  for (int32_t i = 0; i < argCount; i++) {
+    if (FXJSE_Value_IsArray(argValues[i])) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
+      int32_t length = FXJSE_Value_ToInteger(lengthValue);
+      for (int32_t j = 2; j < length; j++) {
+        FXJSE_Value_GetObjectPropByIdx(argValues[i], j, returnValues[index]);
+        index++;
+      }
+      FXJSE_Value_Release(lengthValue);
+    }
+    FXJSE_Value_Set(returnValues[index], argValues[i]);
+    index++;
+  }
+  FXJSE_Value_SetArray(args.GetReturnValue(), iLength, returnValues);
+  for (int32_t i = 0; i < argCount; i++) {
+    FXJSE_Value_Release(argValues[i]);
+  }
+  FX_Free(argValues);
+  for (int32_t i = 0; i < (int32_t)iLength; i++) {
+    FXJSE_Value_Release(returnValues[i]);
+  }
+  FX_Free(returnValues);
+}
+FXJSE_HVALUE CXFA_FM2JSContext::GetSimpleHValue(FXJSE_HOBJECT hThis,
+                                                CFXJSE_Arguments& args,
+                                                uint32_t index) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  FXSYS_assert(index < (uint32_t)args.GetLength());
+  FXJSE_HVALUE argIndex = args.GetValue(index);
+  if (FXJSE_Value_IsArray(argIndex)) {
+    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectProp(argIndex, "length", lengthValue);
+    int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+    FXJSE_Value_Release(lengthValue);
+    FXJSE_HVALUE simpleValue = FXJSE_Value_Create(hruntime);
+    if (iLength > 2) {
+      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(argIndex, 1, propertyValue);
+      FXJSE_Value_GetObjectPropByIdx(argIndex, 2, jsobjectValue);
+      if (FXJSE_Value_IsNull(propertyValue)) {
+        GetObjectDefaultValue(jsobjectValue, simpleValue);
+      } else {
+        CFX_ByteString propertyStr;
+        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, simpleValue);
+      }
+      FXJSE_Value_Release(propertyValue);
+      FXJSE_Value_Release(jsobjectValue);
+    } else {
+      FXJSE_Value_SetUndefined(simpleValue);
+    }
+    FXJSE_Value_Release(argIndex);
+    return simpleValue;
+  } else if (FXJSE_Value_IsObject(argIndex)) {
+    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
+    GetObjectDefaultValue(argIndex, defaultValue);
+    FXJSE_Value_Release(argIndex);
+    return defaultValue;
+  } else {
+    return argIndex;
+  }
+}
+FX_BOOL CXFA_FM2JSContext::HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  FX_BOOL isNull = FALSE;
+  if (FXJSE_Value_IsNull(arg)) {
+    isNull = TRUE;
+  } else if (FXJSE_Value_IsArray(arg)) {
+    int32_t iLength = hvalue_get_array_length(hThis, arg);
+    if (iLength > 2) {
+      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
+      FXJSE_Value_GetObjectPropByIdx(arg, 2, jsObjectValue);
+      if (FXJSE_Value_IsNull(propertyValue)) {
+        FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
+        GetObjectDefaultValue(jsObjectValue, defaultValue);
+        if (FXJSE_Value_IsNull(defaultValue)) {
+          isNull = TRUE;
+        }
+        FXJSE_Value_Release(defaultValue);
+      } else {
+        CFX_ByteString propertyStr;
+        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);
+        if (FXJSE_Value_IsNull(newPropertyValue)) {
+          isNull = TRUE;
+        }
+        FXJSE_Value_Release(newPropertyValue);
+      }
+      FXJSE_Value_Release(propertyValue);
+      FXJSE_Value_Release(jsObjectValue);
+    } else {
+      isNull = TRUE;
+    }
+  } else if (FXJSE_Value_IsObject(arg)) {
+    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
+    GetObjectDefaultValue(arg, defaultValue);
+    if (FXJSE_Value_IsNull(defaultValue)) {
+      isNull = TRUE;
+    }
+    FXJSE_Value_Release(defaultValue);
+  }
+  return isNull;
+}
+int32_t CXFA_FM2JSContext::hvalue_get_array_length(FXJSE_HOBJECT hThis,
+                                                   FXJSE_HVALUE arg) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t iLength = 0;
+  if (FXJSE_Value_IsArray(arg)) {
+    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectProp(arg, "length", lengthValue);
+    iLength = FXJSE_Value_ToInteger(lengthValue);
+    FXJSE_Value_Release(lengthValue);
+  }
+  return iLength;
+}
+FX_BOOL CXFA_FM2JSContext::simpleValueCompare(FXJSE_HOBJECT hThis,
+                                              FXJSE_HVALUE firstValue,
+                                              FXJSE_HVALUE secondValue) {
+  FX_BOOL bReturn = FALSE;
+  if (FXJSE_Value_IsUTF8String(firstValue)) {
+    CFX_ByteString firstString, secondString;
+    HValueToUTF8String(firstValue, firstString);
+    HValueToUTF8String(secondValue, secondString);
+    bReturn = firstString.Equal(secondString);
+  } else if (FXJSE_Value_IsNumber(firstValue)) {
+    FX_FLOAT first = HValueToFloat(hThis, firstValue);
+    FX_FLOAT second = HValueToFloat(hThis, secondValue);
+    bReturn = (first == second);
+  } else if (FXJSE_Value_IsBoolean(firstValue)) {
+    bReturn = (FXJSE_Value_ToBoolean(firstValue) ==
+               FXJSE_Value_ToBoolean(secondValue));
+  } else if (FXJSE_Value_IsNull(firstValue) &&
+             FXJSE_Value_IsNull(secondValue)) {
+    bReturn = TRUE;
+  }
+  return bReturn;
+}
+void CXFA_FM2JSContext::unfoldArgs(FXJSE_HOBJECT hThis,
+                                   CFXJSE_Arguments& args,
+                                   FXJSE_HVALUE*& resultValues,
+                                   int32_t& iCount,
+                                   int32_t iStart) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  iCount = 0;
+  int32_t argc = args.GetLength();
+  FXJSE_HVALUE* argsValue = FX_Alloc(FXJSE_HVALUE, argc);
+  for (int32_t i = iStart; i < argc; i++) {
+    argsValue[i] = args.GetValue(i);
+    if (FXJSE_Value_IsArray(argsValue[i])) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+      FXJSE_Value_Release(lengthValue);
+      iCount += ((iLength > 2) ? (iLength - 2) : 0);
+    } else {
+      iCount += 1;
+    }
+  }
+  resultValues = FX_Alloc(FXJSE_HVALUE, iCount);
+  for (int32_t i = 0; i < iCount; i++) {
+    resultValues[i] = FXJSE_Value_Create(hruntime);
+  }
+  int32_t index = 0;
+  for (int32_t i = iStart; i < argc; i++) {
+    if (FXJSE_Value_IsArray(argsValue[i])) {
+      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
+      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
+      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
+      FXJSE_Value_Release(lengthValue);
+      if (iLength > 2) {
+        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
+        FXJSE_Value_GetObjectPropByIdx(argsValue[i], 1, propertyValue);
+        if (FXJSE_Value_IsNull(propertyValue)) {
+          for (int32_t j = 2; j < iLength; j++) {
+            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
+            GetObjectDefaultValue(jsObjectValue, resultValues[index]);
+            index++;
+          }
+        } else {
+          CFX_ByteString propertyString;
+          FXJSE_Value_ToUTF8String(propertyValue, propertyString);
+          for (int32_t j = 2; j < iLength; j++) {
+            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
+            FXJSE_Value_GetObjectProp(jsObjectValue, propertyString,
+                                      resultValues[index]);
+            index++;
+          }
+        }
+        FXJSE_Value_Release(propertyValue);
+        FXJSE_Value_Release(jsObjectValue);
+      }
+    } else if (FXJSE_Value_IsObject(argsValue[i])) {
+      GetObjectDefaultValue(argsValue[i], resultValues[index]);
+      index++;
+    } else {
+      FXJSE_Value_Set(resultValues[index], argsValue[i]);
+      index++;
+    }
+  }
+  for (int32_t i = iStart; i < argc; i++) {
+    FXJSE_Value_Release(argsValue[i]);
+  }
+  FX_Free(argsValue);
+}
+void CXFA_FM2JSContext::GetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
+                                              FXJSE_HVALUE hDefaultValue) {
+  CXFA_Node* pNode =
+      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
+  if (pNode) {
+    pNode->Script_Som_DefaultValue(hDefaultValue, FALSE, (XFA_ATTRIBUTE)-1);
+  } else {
+    FXJSE_Value_SetNull(hDefaultValue);
+  }
+}
+FX_BOOL CXFA_FM2JSContext::SetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
+                                                 FXJSE_HVALUE hNewValue) {
+  CXFA_Node* pNode =
+      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
+  if (pNode) {
+    pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1);
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName,
+                                              int32_t iIndexFlags,
+                                              int32_t iIndexValue,
+                                              FX_BOOL bIsStar,
+                                              CFX_ByteString& szSomExp) {
+  if (bIsStar) {
+    szSomExp = szName + "[*]";
+    return;
+  }
+  if (iIndexFlags == 0) {
+    szSomExp = szName;
+    return;
+  }
+  if (iIndexFlags == 1 || iIndexValue == 0) {
+    szSomExp = szName + "[" +
+               CFX_ByteString::FormatInteger(iIndexValue, FXFORMAT_SIGNED) +
+               "]";
+  } else if (iIndexFlags == 2) {
+    szSomExp = (iIndexValue < 0) ? (szName + "[-") : (szName + "[+");
+    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
+    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
+    szSomExp += "]";
+  } else {
+    szSomExp = (iIndexValue < 0) ? (szName + "[") : (szName + "[-");
+    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
+    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
+    szSomExp += "]";
+  }
+}
+FX_BOOL CXFA_FM2JSContext::GetObjectByName(
+    FXJSE_HOBJECT hThis,
+    FXJSE_HVALUE accessorValue,
+    const CFX_ByteStringC& szAccessorName) {
+  FX_BOOL bFlags = FALSE;
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return bFlags;
+  }
+  IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
+  XFA_RESOLVENODE_RS resoveNodeRS;
+  FX_DWORD dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
+  int32_t iRet = pScriptContext->ResolveObjects(
+      pScriptContext->GetThisObject(),
+      CFX_WideString::FromUTF8(szAccessorName.GetCStr(),
+                               szAccessorName.GetLength()),
+      resoveNodeRS, dwFlags);
+  if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    FXJSE_Value_Set(accessorValue, pScriptContext->GetJSValueFromMap(
+                                       resoveNodeRS.nodes.GetAt(0)));
+    bFlags = TRUE;
+  }
+  return bFlags;
+}
+int32_t CXFA_FM2JSContext::ResolveObjects(FXJSE_HOBJECT hThis,
+                                          FXJSE_HVALUE hRefValue,
+                                          const CFX_ByteStringC& bsSomExp,
+                                          XFA_RESOLVENODE_RS& resoveNodeRS,
+                                          FX_BOOL bdotAccessor,
+                                          FX_BOOL bHasNoResolveName) {
+  CFX_WideString wsSomExpression =
+      CFX_WideString::FromUTF8(bsSomExp.GetCStr(), bsSomExp.GetLength());
+  int32_t iRet = -1;
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  CXFA_Document* pDoc = pContext->GetDocument();
+  if (!pDoc) {
+    return iRet;
+  }
+  IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
+  CXFA_Object* pNode = NULL;
+  FX_DWORD dFlags = 0UL;
+  if (bdotAccessor) {
+    if (FXJSE_Value_IsNull(hRefValue)) {
+      pNode = pScriptContext->GetThisObject();
+      dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
+    } else {
+      pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
+      FXSYS_assert(pNode);
+      if (bHasNoResolveName) {
+        CFX_WideString wsName;
+        if (CXFA_Node* pXFANode = pNode->AsNode()) {
+          pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
+        }
+        if (wsName.IsEmpty()) {
+          CFX_WideStringC className;
+          pNode->GetClassName(className);
+          wsName = FX_WSTRC(L"#") + className;
+        }
+        wsSomExpression = wsName + wsSomExpression;
+        dFlags = XFA_RESOLVENODE_Siblings;
+      } else {
+        dFlags = (bsSomExp == "*")
+                     ? (XFA_RESOLVENODE_Children)
+                     : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
+                        XFA_RESOLVENODE_Properties);
+      }
+    }
+  } else {
+    pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
+    dFlags = XFA_RESOLVENODE_AnyChild;
+  }
+  iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression, resoveNodeRS,
+                                        dFlags);
+  return iRet;
+}
+void CXFA_FM2JSContext::ParseResolveResult(
+    FXJSE_HOBJECT hThis,
+    const XFA_RESOLVENODE_RS& resoveNodeRS,
+    FXJSE_HVALUE hParentValue,
+    FXJSE_HVALUE*& resultValues,
+    int32_t& iSize,
+    FX_BOOL& bAttribute) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hRuntime = pContext->GetScriptRuntime();
+  iSize = 0;
+  resultValues = NULL;
+  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    bAttribute = FALSE;
+    iSize = resoveNodeRS.nodes.GetSize();
+    resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
+    for (int32_t i = 0; i < iSize; i++) {
+      resultValues[i] = FXJSE_Value_Create(hRuntime);
+      FXJSE_Value_Set(
+          resultValues[i],
+          pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap(
+              resoveNodeRS.nodes.GetAt(i)));
+    }
+  } else {
+    CXFA_HVALUEArray objectProperties(hRuntime);
+    int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties);
+    bAttribute = (iRet == 0);
+    if (bAttribute) {
+      if (FXJSE_Value_IsObject(hParentValue)) {
+        iSize = 1;
+        resultValues = FX_Alloc(FXJSE_HVALUE, 1);
+        resultValues[0] = FXJSE_Value_Create(hRuntime);
+        FXJSE_Value_Set(resultValues[0], hParentValue);
+      }
+    } else {
+      iSize = iRet;
+      resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
+      for (int32_t i = 0; i < iSize; i++) {
+        resultValues[i] = FXJSE_Value_Create(hRuntime);
+        FXJSE_Value_Set(resultValues[i], objectProperties[i]);
+      }
+    }
+  }
+}
+int32_t CXFA_FM2JSContext::HValueToInteger(FXJSE_HOBJECT hThis,
+                                           FXJSE_HVALUE hValue) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  int32_t iValue = 0;
+  if (FXJSE_Value_IsArray(hValue)) {
+    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectPropByIdx(hValue, 1, propertyValue);
+    FXJSE_Value_GetObjectPropByIdx(hValue, 2, jsobjectValue);
+    if (FXJSE_Value_IsNull(propertyValue)) {
+      GetObjectDefaultValue(jsobjectValue, newProperty);
+    } else {
+      CFX_ByteString propertyStr;
+      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
+    }
+    iValue = HValueToInteger(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+    FXJSE_Value_Release(jsobjectValue);
+    FXJSE_Value_Release(propertyValue);
+    return iValue;
+  } else if (FXJSE_Value_IsObject(hValue)) {
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    GetObjectDefaultValue(hValue, newProperty);
+    iValue = HValueToInteger(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+    return iValue;
+  } else if (FXJSE_Value_IsUTF8String(hValue)) {
+    CFX_ByteString szValue;
+    FXJSE_Value_ToUTF8String(hValue, szValue);
+    iValue = FXSYS_atoi(szValue);
+  } else {
+    iValue = FXJSE_Value_ToInteger(hValue);
+  }
+  return iValue;
+}
+FX_DOUBLE CXFA_FM2JSContext::StringToDouble(
+    const CFX_ByteStringC& szStringVal) {
+  return XFA_ByteStringToDouble(szStringVal);
+}
+FX_FLOAT CXFA_FM2JSContext::HValueToFloat(FXJSE_HOBJECT hThis,
+                                          FXJSE_HVALUE arg) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  FX_FLOAT fRet = 0.0f;
+  if (FXJSE_Value_IsArray(arg)) {
+    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
+    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
+    if (FXJSE_Value_IsNull(propertyValue)) {
+      GetObjectDefaultValue(jsobjectValue, newProperty);
+    } else {
+      CFX_ByteString propertyStr;
+      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
+    }
+    fRet = HValueToFloat(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+    FXJSE_Value_Release(jsobjectValue);
+    FXJSE_Value_Release(propertyValue);
+  } else if (FXJSE_Value_IsObject(arg)) {
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    GetObjectDefaultValue(arg, newProperty);
+    fRet = HValueToFloat(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+  } else if (FXJSE_Value_IsUTF8String(arg)) {
+    CFX_ByteString bsOutput;
+    FXJSE_Value_ToUTF8String(arg, bsOutput);
+    fRet = (FX_FLOAT)StringToDouble(bsOutput);
+  } else if (FXJSE_Value_IsUndefined(arg)) {
+    fRet = 0;
+  } else {
+    fRet = FXJSE_Value_ToFloat(arg);
+  }
+  return fRet;
+}
+FX_DOUBLE CXFA_FM2JSContext::HValueToDouble(FXJSE_HOBJECT hThis,
+                                            FXJSE_HVALUE arg) {
+  CXFA_FM2JSContext* pContext =
+      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
+  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
+  FX_DOUBLE dRet = 0;
+  if (FXJSE_Value_IsArray(arg)) {
+    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
+    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
+    if (FXJSE_Value_IsNull(propertyValue)) {
+      GetObjectDefaultValue(jsobjectValue, newProperty);
+    } else {
+      CFX_ByteString propertyStr;
+      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
+      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
+    }
+    dRet = HValueToDouble(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+    FXJSE_Value_Release(jsobjectValue);
+    FXJSE_Value_Release(propertyValue);
+  } else if (FXJSE_Value_IsObject(arg)) {
+    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
+    GetObjectDefaultValue(arg, newProperty);
+    dRet = HValueToDouble(hThis, newProperty);
+    FXJSE_Value_Release(newProperty);
+  } else if (FXJSE_Value_IsUTF8String(arg)) {
+    CFX_ByteString bsOutput;
+    FXJSE_Value_ToUTF8String(arg, bsOutput);
+    dRet = StringToDouble(bsOutput);
+  } else if (FXJSE_Value_IsUndefined(arg)) {
+    dRet = 0;
+  } else {
+    dRet = FXJSE_Value_ToDouble(arg);
+  }
+  return dRet;
+}
+void CXFA_FM2JSContext::HValueToUTF8String(FXJSE_HVALUE arg,
+                                           CFX_ByteString& szOutputString) {
+  if (FXJSE_Value_IsNull(arg) || FXJSE_Value_IsUndefined(arg)) {
+    szOutputString = "";
+  } else if (FXJSE_Value_IsBoolean(arg)) {
+    szOutputString = FXJSE_Value_ToBoolean(arg) ? "1" : "0";
+  } else {
+    szOutputString = "";
+    FXJSE_Value_ToUTF8String(arg, szOutputString);
+  }
+}
+static FXJSE_FUNCTION formcalc_fm2js_functions[] = {
+    {"Abs", CXFA_FM2JSContext::Abs},
+    {"Avg", CXFA_FM2JSContext::Avg},
+    {"Ceil", CXFA_FM2JSContext::Ceil},
+    {"Count", CXFA_FM2JSContext::Count},
+    {"Floor", CXFA_FM2JSContext::Floor},
+    {"Max", CXFA_FM2JSContext::Max},
+    {"Min", CXFA_FM2JSContext::Min},
+    {"Mod", CXFA_FM2JSContext::Mod},
+    {"Round", CXFA_FM2JSContext::Round},
+    {"Sum", CXFA_FM2JSContext::Sum},
+    {"Date", CXFA_FM2JSContext::Date},
+    {"Date2Num", CXFA_FM2JSContext::Date2Num},
+    {"DateFmt", CXFA_FM2JSContext::DateFmt},
+    {"IsoDate2Num", CXFA_FM2JSContext::IsoDate2Num},
+    {"IsoTime2Num", CXFA_FM2JSContext::IsoTime2Num},
+    {"LocalDateFmt", CXFA_FM2JSContext::LocalDateFmt},
+    {"LocalTimeFmt", CXFA_FM2JSContext::LocalTimeFmt},
+    {"Num2Date", CXFA_FM2JSContext::Num2Date},
+    {"Num2GMTime", CXFA_FM2JSContext::Num2GMTime},
+    {"Num2Time", CXFA_FM2JSContext::Num2Time},
+    {"Time", CXFA_FM2JSContext::Time},
+    {"Time2Num", CXFA_FM2JSContext::Time2Num},
+    {"TimeFmt", CXFA_FM2JSContext::TimeFmt},
+    {"Apr", CXFA_FM2JSContext::Apr},
+    {"Cterm", CXFA_FM2JSContext::CTerm},
+    {"FV", CXFA_FM2JSContext::FV},
+    {"Ipmt", CXFA_FM2JSContext::IPmt},
+    {"NPV", CXFA_FM2JSContext::NPV},
+    {"Pmt", CXFA_FM2JSContext::Pmt},
+    {"PPmt", CXFA_FM2JSContext::PPmt},
+    {"PV", CXFA_FM2JSContext::PV},
+    {"Rate", CXFA_FM2JSContext::Rate},
+    {"Term", CXFA_FM2JSContext::Term},
+    {"Choose", CXFA_FM2JSContext::Choose},
+    {"Exists", CXFA_FM2JSContext::Exists},
+    {"HasValue", CXFA_FM2JSContext::HasValue},
+    {"Oneof", CXFA_FM2JSContext::Oneof},
+    {"Within", CXFA_FM2JSContext::Within},
+    {"If", CXFA_FM2JSContext::If},
+    {"Eval", CXFA_FM2JSContext::Eval},
+    {"Translate", CXFA_FM2JSContext::eval_translation},
+    {"Ref", CXFA_FM2JSContext::Ref},
+    {"UnitType", CXFA_FM2JSContext::UnitType},
+    {"UnitValue", CXFA_FM2JSContext::UnitValue},
+    {"At", CXFA_FM2JSContext::At},
+    {"Concat", CXFA_FM2JSContext::Concat},
+    {"Decode", CXFA_FM2JSContext::Decode},
+    {"Encode", CXFA_FM2JSContext::Encode},
+    {"Format", CXFA_FM2JSContext::Format},
+    {"Left", CXFA_FM2JSContext::Left},
+    {"Len", CXFA_FM2JSContext::Len},
+    {"Lower", CXFA_FM2JSContext::Lower},
+    {"Ltrim", CXFA_FM2JSContext::Ltrim},
+    {"Parse", CXFA_FM2JSContext::Parse},
+    {"Replace", CXFA_FM2JSContext::Replace},
+    {"Right", CXFA_FM2JSContext::Right},
+    {"Rtrim", CXFA_FM2JSContext::Rtrim},
+    {"Space", CXFA_FM2JSContext::Space},
+    {"Str", CXFA_FM2JSContext::Str},
+    {"Stuff", CXFA_FM2JSContext::Stuff},
+    {"Substr", CXFA_FM2JSContext::Substr},
+    {"Uuid", CXFA_FM2JSContext::Uuid},
+    {"Upper", CXFA_FM2JSContext::Upper},
+    {"WordNum", CXFA_FM2JSContext::WordNum},
+    {"Get", CXFA_FM2JSContext::Get},
+    {"Post", CXFA_FM2JSContext::Post},
+    {"Put", CXFA_FM2JSContext::Put},
+    {"positive_operator", CXFA_FM2JSContext::positive_operator},
+    {"negative_operator", CXFA_FM2JSContext::negative_operator},
+    {"logical_or_operator", CXFA_FM2JSContext::logical_or_operator},
+    {"logical_and_operator", CXFA_FM2JSContext::logical_and_operator},
+    {"logical_not_operator", CXFA_FM2JSContext::logical_not_operator},
+    {"equality_operator", CXFA_FM2JSContext::equality_operator},
+    {"notequality_operator", CXFA_FM2JSContext::notequality_operator},
+    {"less_operator", CXFA_FM2JSContext::less_operator},
+    {"lessequal_operator", CXFA_FM2JSContext::lessequal_operator},
+    {"greater_operator", CXFA_FM2JSContext::greater_operator},
+    {"greaterequal_operator", CXFA_FM2JSContext::greaterequal_operator},
+    {"plus_operator", CXFA_FM2JSContext::plus_operator},
+    {"minus_operator", CXFA_FM2JSContext::minus_operator},
+    {"multiple_operator", CXFA_FM2JSContext::multiple_operator},
+    {"divide_operator", CXFA_FM2JSContext::divide_operator},
+    {"assign_value_operator", CXFA_FM2JSContext::assign_value_operator},
+    {"dot_accessor", CXFA_FM2JSContext::dot_accessor},
+    {"dotdot_accessor", CXFA_FM2JSContext::dotdot_accessor},
+    {"concat_fm_object", CXFA_FM2JSContext::concat_fm_object},
+    {"is_fm_object", CXFA_FM2JSContext::is_fm_object},
+    {"is_fm_array", CXFA_FM2JSContext::is_fm_array},
+    {"get_fm_value", CXFA_FM2JSContext::get_fm_value},
+    {"get_fm_jsobj", CXFA_FM2JSContext::get_fm_jsobj},
+    {"fm_var_filter", CXFA_FM2JSContext::fm_var_filter},
+};
+CXFA_FM2JSContext::CXFA_FM2JSContext()
+    : m_hFMClass(nullptr), m_pDocument(nullptr) {
+  FXSYS_memset(&m_fmClass, 0, sizeof(FXJSE_CLASS));
+}
+CXFA_FM2JSContext::~CXFA_FM2JSContext() {
+  m_pDocument = NULL;
+  if (m_hValue) {
+    FXJSE_Value_Release(m_hValue);
+    m_hValue = NULL;
+  }
+  m_hScriptRuntime = NULL;
+}
+CXFA_FM2JSContext* CXFA_FM2JSContext::Create() {
+  return new CXFA_FM2JSContext;
+}
+void CXFA_FM2JSContext::Initialize(FXJSE_HRUNTIME hScriptRuntime,
+                                   FXJSE_HCONTEXT hScriptContext,
+                                   CXFA_Document* pDoc) {
+  m_pDocument = pDoc;
+  m_hScriptRuntime = hScriptRuntime;
+  m_fmClass.name = "XFA_FM2JS_FormCalcClass";
+  m_fmClass.constructor = NULL;
+  m_fmClass.properties = NULL;
+  m_fmClass.methods = formcalc_fm2js_functions;
+  m_fmClass.propNum = 0;
+  m_fmClass.methNum =
+      sizeof(formcalc_fm2js_functions) / sizeof(formcalc_fm2js_functions[0]);
+  m_hFMClass = FXJSE_DefineClass(hScriptContext, &m_fmClass);
+  m_hValue = FXJSE_Value_Create(hScriptRuntime);
+  FXJSE_Value_SetNull(m_hValue);
+  FXJSE_Value_SetObject(m_hValue, this, m_hFMClass);
+}
+void CXFA_FM2JSContext::GlobalPropertyGetter(FXJSE_HVALUE hValue) {
+  FXJSE_Value_Set(hValue, m_hValue);
+}
+void CXFA_FM2JSContext::Release() {
+  delete this;
+}
+void CXFA_FM2JSContext::ThrowScriptErrorMessage(int32_t iStringID, ...) {
+  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
+  FXSYS_assert(pAppProvider);
+  CFX_WideString wsFormat;
+  pAppProvider->LoadString(iStringID, wsFormat);
+  CFX_WideString wsMessage;
+  va_list arg_ptr;
+  va_start(arg_ptr, iStringID);
+  wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr);
+  va_end(arg_ptr);
+  FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
+}
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.h b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
new file mode 100644
index 0000000..c80d988
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
@@ -0,0 +1,453 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
+#define XFA_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
+
+#include "xfa/fxfa/parser/xfa_script.h"
+
+class CXFA_FM2JSContext {
+ public:
+  static void Abs(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Avg(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Ceil(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Count(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Floor(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Max(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Min(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Mod(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Round(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Sum(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Date(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Date2Num(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void DateFmt(FXJSE_HOBJECT hThis,
+                      const CFX_ByteStringC& szFuncName,
+                      CFXJSE_Arguments& args);
+  static void IsoDate2Num(FXJSE_HOBJECT hThis,
+                          const CFX_ByteStringC& szFuncName,
+                          CFXJSE_Arguments& args);
+  static void IsoTime2Num(FXJSE_HOBJECT hThis,
+                          const CFX_ByteStringC& szFuncName,
+                          CFXJSE_Arguments& args);
+  static void LocalDateFmt(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void LocalTimeFmt(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void Num2Date(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void Num2GMTime(FXJSE_HOBJECT hThis,
+                         const CFX_ByteStringC& szFuncName,
+                         CFXJSE_Arguments& args);
+  static void Num2Time(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void Time(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Time2Num(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void TimeFmt(FXJSE_HOBJECT hThis,
+                      const CFX_ByteStringC& szFuncName,
+                      CFXJSE_Arguments& args);
+
+  static FX_BOOL IsIsoDateFormat(const FX_CHAR* pData,
+                                 int32_t iLength,
+                                 int32_t& iStyle,
+                                 int32_t& iYear,
+                                 int32_t& iMonth,
+                                 int32_t& iDay);
+  static FX_BOOL IsIsoTimeFormat(const FX_CHAR* pData,
+                                 int32_t iLength,
+                                 int32_t& iHour,
+                                 int32_t& iMinute,
+                                 int32_t& iSecond,
+                                 int32_t& iMilliSecond,
+                                 int32_t& iZoneHour,
+                                 int32_t& iZoneMinute);
+  static FX_BOOL IsIsoDateTimeFormat(const FX_CHAR* pData,
+                                     int32_t iLength,
+                                     int32_t& iYear,
+                                     int32_t& iMonth,
+                                     int32_t& iDay,
+                                     int32_t& iHour,
+                                     int32_t& iMinute,
+                                     int32_t& iSecond,
+                                     int32_t& iMillionSecond,
+                                     int32_t& iZoneHour,
+                                     int32_t& iZoneMinute);
+  static FX_BOOL Local2IsoDate(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szDate,
+                               const CFX_ByteStringC& szFormat,
+                               const CFX_ByteStringC& szLocale,
+                               CFX_ByteString& strIsoDate);
+  static FX_BOOL Local2IsoTime(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szTime,
+                               const CFX_ByteStringC& szFormat,
+                               const CFX_ByteStringC& szLocale,
+                               CFX_ByteString& strIsoTime);
+  static FX_BOOL IsoDate2Local(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szDate,
+                               const CFX_ByteStringC& szFormat,
+                               const CFX_ByteStringC& szLocale,
+                               CFX_ByteString& strLocalDate);
+  static FX_BOOL IsoTime2Local(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szTime,
+                               const CFX_ByteStringC& szFormat,
+                               const CFX_ByteStringC& szLocale,
+                               CFX_ByteString& strLocalTime);
+  static FX_BOOL GetGMTTime(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szTime,
+                            const CFX_ByteStringC& szFormat,
+                            const CFX_ByteStringC& szLocale,
+                            CFX_ByteString& strGMTTime);
+  static int32_t DateString2Num(const CFX_ByteStringC& szDateString);
+  static void GetLocalDateFormat(FXJSE_HOBJECT hThis,
+                                 int32_t iStyle,
+                                 const CFX_ByteStringC& szLocalStr,
+                                 CFX_ByteString& strFormat,
+                                 FX_BOOL bStandard);
+  static void GetLocalTimeFormat(FXJSE_HOBJECT hThis,
+                                 int32_t iStyle,
+                                 const CFX_ByteStringC& szLocalStr,
+                                 CFX_ByteString& strFormat,
+                                 FX_BOOL bStandard);
+  static void GetStandardDateFormat(FXJSE_HOBJECT hThis,
+                                    int32_t iStyle,
+                                    const CFX_ByteStringC& szLocalStr,
+                                    CFX_ByteString& strFormat);
+  static void GetStandardTimeFormat(FXJSE_HOBJECT hThis,
+                                    int32_t iStyle,
+                                    const CFX_ByteStringC& szLocalStr,
+                                    CFX_ByteString& strFormat);
+
+  static void Num2AllTime(FXJSE_HOBJECT hThis,
+                          int32_t iTime,
+                          const CFX_ByteStringC& szFormat,
+                          const CFX_ByteStringC& szLocale,
+                          FX_BOOL bGM,
+                          CFX_ByteString& strTime);
+  static void GetLocalTimeZone(int32_t& iHour, int32_t& iMin, int32_t& iSec);
+
+  static void Apr(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void CTerm(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void FV(FXJSE_HOBJECT hThis,
+                 const CFX_ByteStringC& szFuncName,
+                 CFXJSE_Arguments& args);
+  static void IPmt(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void NPV(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Pmt(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void PPmt(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void PV(FXJSE_HOBJECT hThis,
+                 const CFX_ByteStringC& szFuncName,
+                 CFXJSE_Arguments& args);
+  static void Rate(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Term(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Choose(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void Exists(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void HasValue(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void Oneof(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Within(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void If(FXJSE_HOBJECT hThis,
+                 const CFX_ByteStringC& szFuncName,
+                 CFXJSE_Arguments& args);
+  static void Eval(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Ref(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void UnitType(FXJSE_HOBJECT hThis,
+                       const CFX_ByteStringC& szFuncName,
+                       CFXJSE_Arguments& args);
+  static void UnitValue(FXJSE_HOBJECT hThis,
+                        const CFX_ByteStringC& szFuncName,
+                        CFXJSE_Arguments& args);
+
+  static void At(FXJSE_HOBJECT hThis,
+                 const CFX_ByteStringC& szFuncName,
+                 CFXJSE_Arguments& args);
+  static void Concat(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void Decode(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void DecodeURL(const CFX_ByteStringC& szURLString,
+                        CFX_ByteTextBuf& szResultBuf);
+  static void DecodeHTML(const CFX_ByteStringC& szHTMLString,
+                         CFX_ByteTextBuf& szResultBuf);
+  static void DecodeXML(const CFX_ByteStringC& szXMLString,
+                        CFX_ByteTextBuf& szResultBuf);
+  static void Encode(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void EncodeURL(const CFX_ByteStringC& szURLString,
+                        CFX_ByteTextBuf& szResultBuf);
+  static void EncodeHTML(const CFX_ByteStringC& szHTMLString,
+                         CFX_ByteTextBuf& szResultBuf);
+  static void EncodeXML(const CFX_ByteStringC& szXMLString,
+                        CFX_ByteTextBuf& szResultBuf);
+  static FX_BOOL HTMLSTR2Code(const CFX_WideStringC& pData, uint32_t& iCode);
+  static FX_BOOL HTMLCode2STR(uint32_t iCode, CFX_WideString& wsHTMLReserve);
+  static void Format(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void Left(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Len(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Lower(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Ltrim(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Parse(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Replace(FXJSE_HOBJECT hThis,
+                      const CFX_ByteStringC& szFuncName,
+                      CFXJSE_Arguments& args);
+  static void Right(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Rtrim(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Space(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Str(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Stuff(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void Substr(FXJSE_HOBJECT hThis,
+                     const CFX_ByteStringC& szFuncName,
+                     CFXJSE_Arguments& args);
+  static void Uuid(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Upper(FXJSE_HOBJECT hThis,
+                    const CFX_ByteStringC& szFuncName,
+                    CFXJSE_Arguments& args);
+  static void WordNum(FXJSE_HOBJECT hThis,
+                      const CFX_ByteStringC& szFuncName,
+                      CFXJSE_Arguments& args);
+  static void TrillionUS(const CFX_ByteStringC& szData,
+                         CFX_ByteTextBuf& strBuf);
+  static void WordUS(const CFX_ByteStringC& szData,
+                     int32_t iStyle,
+                     CFX_ByteTextBuf& strBuf);
+
+  static void Get(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void Post(FXJSE_HOBJECT hThis,
+                   const CFX_ByteStringC& szFuncName,
+                   CFXJSE_Arguments& args);
+  static void Put(FXJSE_HOBJECT hThis,
+                  const CFX_ByteStringC& szFuncName,
+                  CFXJSE_Arguments& args);
+  static void assign_value_operator(FXJSE_HOBJECT hThis,
+                                    const CFX_ByteStringC& szFuncName,
+                                    CFXJSE_Arguments& args);
+  static void logical_or_operator(FXJSE_HOBJECT hThis,
+                                  const CFX_ByteStringC& szFuncName,
+                                  CFXJSE_Arguments& args);
+  static void logical_and_operator(FXJSE_HOBJECT hThis,
+                                   const CFX_ByteStringC& szFuncName,
+                                   CFXJSE_Arguments& args);
+  static void equality_operator(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args);
+  static void notequality_operator(FXJSE_HOBJECT hThis,
+                                   const CFX_ByteStringC& szFuncName,
+                                   CFXJSE_Arguments& args);
+  static FX_BOOL fm_ref_equal(FXJSE_HOBJECT hThis, CFXJSE_Arguments& args);
+  static void less_operator(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args);
+  static void lessequal_operator(FXJSE_HOBJECT hThis,
+                                 const CFX_ByteStringC& szFuncName,
+                                 CFXJSE_Arguments& args);
+  static void greater_operator(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args);
+  static void greaterequal_operator(FXJSE_HOBJECT hThis,
+                                    const CFX_ByteStringC& szFuncName,
+                                    CFXJSE_Arguments& args);
+  static void plus_operator(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args);
+  static void minus_operator(FXJSE_HOBJECT hThis,
+                             const CFX_ByteStringC& szFuncName,
+                             CFXJSE_Arguments& args);
+  static void multiple_operator(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args);
+  static void divide_operator(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args);
+  static void positive_operator(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args);
+  static void negative_operator(FXJSE_HOBJECT hThis,
+                                const CFX_ByteStringC& szFuncName,
+                                CFXJSE_Arguments& args);
+  static void logical_not_operator(FXJSE_HOBJECT hThis,
+                                   const CFX_ByteStringC& szFuncName,
+                                   CFXJSE_Arguments& args);
+  static void dot_accessor(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void dotdot_accessor(FXJSE_HOBJECT hThis,
+                              const CFX_ByteStringC& szFuncName,
+                              CFXJSE_Arguments& args);
+  static void eval_translation(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args);
+  static void is_fm_object(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void is_fm_array(FXJSE_HOBJECT hThis,
+                          const CFX_ByteStringC& szFuncName,
+                          CFXJSE_Arguments& args);
+  static void get_fm_value(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void get_fm_jsobj(FXJSE_HOBJECT hThis,
+                           const CFX_ByteStringC& szFuncName,
+                           CFXJSE_Arguments& args);
+  static void fm_var_filter(FXJSE_HOBJECT hThis,
+                            const CFX_ByteStringC& szFuncName,
+                            CFXJSE_Arguments& args);
+  static void concat_fm_object(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args);
+
+  static int32_t hvalue_get_array_length(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg);
+  static FX_BOOL simpleValueCompare(FXJSE_HOBJECT hThis,
+                                    FXJSE_HVALUE firstValue,
+                                    FXJSE_HVALUE secondValue);
+  static void unfoldArgs(FXJSE_HOBJECT hThis,
+                         CFXJSE_Arguments& args,
+                         FXJSE_HVALUE*& resultValues,
+                         int32_t& iCount,
+                         int32_t iStart = 0);
+  static void GetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
+                                    FXJSE_HVALUE hDefaultValue);
+  static FX_BOOL SetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
+                                       FXJSE_HVALUE hNewValue);
+  static void GenerateSomExpression(const CFX_ByteStringC& szName,
+                                    int32_t iIndexFlags,
+                                    int32_t iIndexValue,
+                                    FX_BOOL bIsStar,
+                                    CFX_ByteString& szSomExp);
+  static FX_BOOL GetObjectByName(FXJSE_HOBJECT hThis,
+                                 FXJSE_HVALUE accessorValue,
+                                 const CFX_ByteStringC& szAccessorName);
+  static int32_t ResolveObjects(FXJSE_HOBJECT hThis,
+                                FXJSE_HVALUE hParentValue,
+                                const CFX_ByteStringC& bsSomExp,
+                                XFA_RESOLVENODE_RS& resoveNodeRS,
+                                FX_BOOL bdotAccessor = TRUE,
+                                FX_BOOL bHasNoResolveName = FALSE);
+  static void ParseResolveResult(FXJSE_HOBJECT hThis,
+                                 const XFA_RESOLVENODE_RS& resoveNodeRS,
+                                 FXJSE_HVALUE hParentValue,
+                                 FXJSE_HVALUE*& resultValues,
+                                 int32_t& iSize,
+                                 FX_BOOL& bAttribute);
+
+  static FXJSE_HVALUE GetSimpleHValue(FXJSE_HOBJECT hThis,
+                                      CFXJSE_Arguments& args,
+                                      uint32_t index);
+  static FX_BOOL HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
+  static int32_t HValueToInteger(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
+  static FX_DOUBLE StringToDouble(const CFX_ByteStringC& szStringVal);
+  static FX_FLOAT HValueToFloat(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
+  static FX_DOUBLE HValueToDouble(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
+  static void HValueToUTF8String(FXJSE_HVALUE hValue,
+                                 CFX_ByteString& outputValue);
+  CXFA_FM2JSContext();
+  ~CXFA_FM2JSContext();
+  static CXFA_FM2JSContext* Create();
+  void Initialize(FXJSE_HRUNTIME hScriptRuntime,
+                  FXJSE_HCONTEXT hScriptContext,
+                  CXFA_Document* pDoc);
+  void GlobalPropertyGetter(FXJSE_HVALUE hValue);
+  void Release();
+  FXJSE_HRUNTIME GetScriptRuntime() const { return m_hScriptRuntime; }
+  CXFA_Document* GetDocument() const { return m_pDocument; }
+  void ThrowScriptErrorMessage(int32_t iStringID, ...);
+
+ private:
+  FXJSE_HRUNTIME m_hScriptRuntime;
+  FXJSE_CLASS m_fmClass;
+  FXJSE_HCLASS m_hFMClass;
+  FXJSE_HVALUE m_hValue;
+  CXFA_Document* m_pDocument;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
diff --git a/xfa/fxfa/fm2js/xfa_fmparse.cpp b/xfa/fxfa/fm2js/xfa_fmparse.cpp
new file mode 100644
index 0000000..6e30d95
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fmparse.cpp
@@ -0,0 +1,1051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_fmparse.h"
+
+#include <memory>
+
+CXFA_FMParse::CXFA_FMParse() : m_pToken(nullptr), m_pErrorInfo(0) {}
+
+int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc,
+                           CXFA_FMErrorInfo* pErrorInfo) {
+  m_pErrorInfo = pErrorInfo;
+  m_lexer.reset(new CXFA_FMLexer(wsFormcalc, m_pErrorInfo));
+  return 0;
+}
+
+void CXFA_FMParse::NextToken() {
+  m_pToken = m_lexer->NextToken();
+  while (m_pToken->m_type == TOKreserver) {
+    if (m_lexer->HasError()) {
+      break;
+    }
+    m_pToken = m_lexer->NextToken();
+  }
+}
+
+void CXFA_FMParse::Check(XFA_FM_TOKEN op) {
+  if (m_pToken->m_type != op) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+          XFA_FM_KeywordToString(op), ws_TempString.c_str());
+  }
+  NextToken();
+}
+
+void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) {
+  m_pErrorInfo->linenum = lineNum;
+  const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg);
+  va_list ap;
+  va_start(ap, msg);
+  m_pErrorInfo->message.FormatV(lpMessageInfo, ap);
+  va_end(ap);
+}
+
+CFX_PtrArray* CXFA_FMParse::ParseTopExpression() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  CFX_PtrArray* expression = new CFX_PtrArray();
+  while (1) {
+    if (m_pToken->m_type == TOKeof || m_pToken->m_type == TOKendfunc ||
+        m_pToken->m_type == TOKendif || m_pToken->m_type == TOKelseif ||
+        m_pToken->m_type == TOKelse || m_pToken->m_type == TOKreserver) {
+      return expression;
+    }
+
+    if (m_pToken->m_type == TOKfunc) {
+      e.reset(ParseFunction());
+      if (e) {
+        expression->Add(e.release());
+      } else {
+        break;
+      }
+    } else {
+      e.reset(ParseExpression());
+      if (e) {
+        expression->Add(e.release());
+      } else {
+        break;
+      }
+    }
+  }
+  return expression;
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseFunction() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  CFX_WideStringC ident;
+  std::unique_ptr<CFX_WideStringCArray> pArguments;
+  std::unique_ptr<CFX_PtrArray> pExpressions;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  if (m_pToken->m_type != TOKidentifier) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+          ws_TempString.c_str());
+  } else {
+    ident = m_pToken->m_wstring;
+    NextToken();
+  }
+  Check(TOKlparen);
+  if (m_pToken->m_type == TOKrparen) {
+    NextToken();
+  } else {
+    pArguments.reset(new CFX_WideStringCArray());
+    CFX_WideStringC p;
+    while (1) {
+      if (m_pToken->m_type == TOKidentifier) {
+        p = m_pToken->m_wstring;
+        pArguments->Add(p);
+        NextToken();
+        if (m_pToken->m_type == TOKcomma) {
+          NextToken();
+          continue;
+        } else if (m_pToken->m_type == TOKrparen) {
+          NextToken();
+          break;
+        } else {
+          Check(TOKrparen);
+          break;
+        }
+      } else {
+        CFX_WideString ws_TempString = m_pToken->m_wstring;
+        Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+              ws_TempString.c_str());
+        NextToken();
+        break;
+      }
+    }
+  }
+  Check(TOKdo);
+  if (m_pToken->m_type == TOKendfunc) {
+    NextToken();
+  } else {
+    pExpressions.reset(ParseTopExpression());
+    Check(TOKendfunc);
+  }
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMFunctionDefinition(line, 0, ident, pArguments.release(),
+                                          pExpressions.release()));
+  } else {
+    if (pArguments)
+      pArguments->RemoveAll();
+    if (pExpressions) {
+      for (int i = 0; i < pExpressions->GetSize(); ++i)
+        delete static_cast<CXFA_FMExpression*>(pExpressions->GetAt(i));
+    }
+  }
+  return e.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseExpression() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  switch (m_pToken->m_type) {
+    case TOKvar:
+      e.reset(ParseVarExpression());
+      break;
+    case TOKnull:
+    case TOKnumber:
+    case TOKstring:
+    case TOKplus:
+    case TOKminus:
+    case TOKksnot:
+    case TOKidentifier:
+    case TOKlparen:
+      e.reset(ParseExpExpression());
+      break;
+    case TOKif:
+      e.reset(ParseIfExpression());
+      break;
+    case TOKwhile:
+      e.reset(ParseWhileExpression());
+      break;
+    case TOKfor:
+      e.reset(ParseForExpression());
+      break;
+    case TOKforeach:
+      e.reset(ParseForeachExpression());
+      break;
+    case TOKdo:
+      e.reset(ParseDoExpression());
+      break;
+    case TOKbreak:
+      e.reset(new CXFA_FMBreakExpression(line));
+      NextToken();
+      break;
+    case TOKcontinue:
+      e.reset(new CXFA_FMContinueExpression(line));
+      NextToken();
+      break;
+    default:
+      CFX_WideString ws_TempString = m_pToken->m_wstring;
+      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
+            ws_TempString.c_str());
+      NextToken();
+      break;
+  }
+  return e.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  CFX_WideStringC ident;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  if (m_pToken->m_type != TOKidentifier) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+          ws_TempString.c_str());
+  } else {
+    ident = m_pToken->m_wstring;
+    NextToken();
+  }
+  if (m_pToken->m_type == TOKassign) {
+    NextToken();
+    e.reset(ParseExpExpression());
+  }
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMVarExpression(line, ident, e.release()));
+  } else {
+    e.reset();
+  }
+  return e.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseLogicalOrExpression());
+  while (m_pToken->m_type == TOKassign) {
+    NextToken();
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2(ParseLogicalOrExpression());
+    if (m_pErrorInfo->message.IsEmpty()) {
+      pExp1.reset(new CXFA_FMAssignExpression(line, TOKassign, pExp1.release(),
+                                              pExp2.release()));
+    } else {
+      pExp1.reset();
+    }
+  }
+  return pExp1.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseSimpleExpression());
+  std::unique_ptr<CXFA_FMExpression> e;
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMExpExpression(line, pExp1.release()));
+  } else {
+    e.reset();
+  }
+  return e.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseLogicalAndExpression());
+  for (;;) {
+    switch (m_pToken->m_type) {
+      case TOKor:
+      case TOKksor: {
+        NextToken();
+        std::unique_ptr<CXFA_FMSimpleExpression> e2(
+            ParseLogicalAndExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMLogicalOrExpression(line, TOKor, e1.release(),
+                                                  e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      }
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseEqualityExpression());
+  for (;;) {
+    switch (m_pToken->m_type) {
+      case TOKand:
+      case TOKksand: {
+        NextToken();
+        std::unique_ptr<CXFA_FMSimpleExpression> e2(ParseEqualityExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMLogicalAndExpression(line, TOKand, e1.release(),
+                                                   e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      }
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseRelationalExpression());
+  for (;;) {
+    std::unique_ptr<CXFA_FMSimpleExpression> e2;
+    switch (m_pToken->m_type) {
+      case TOKeq:
+      case TOKkseq:
+        NextToken();
+        e2.reset(ParseRelationalExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMEqualityExpression(line, TOKeq, e1.release(),
+                                                 e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKne:
+      case TOKksne:
+        NextToken();
+        e2.reset(ParseRelationalExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMEqualityExpression(line, TOKne, e1.release(),
+                                                 e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseAddtiveExpression());
+  for (;;) {
+    std::unique_ptr<CXFA_FMSimpleExpression> e2;
+    switch (m_pToken->m_type) {
+      case TOKlt:
+      case TOKkslt:
+        NextToken();
+        e2.reset(ParseAddtiveExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMRelationalExpression(line, TOKlt, e1.release(),
+                                                   e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKgt:
+      case TOKksgt:
+        NextToken();
+        e2.reset(ParseAddtiveExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMRelationalExpression(line, TOKgt, e1.release(),
+                                                   e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKle:
+      case TOKksle:
+        NextToken();
+        e2.reset(ParseAddtiveExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMRelationalExpression(line, TOKle, e1.release(),
+                                                   e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKge:
+      case TOKksge:
+        NextToken();
+        e2.reset(ParseAddtiveExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMRelationalExpression(line, TOKge, e1.release(),
+                                                   e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseMultiplicativeExpression());
+  for (;;) {
+    std::unique_ptr<CXFA_FMSimpleExpression> e2;
+    switch (m_pToken->m_type) {
+      case TOKplus:
+        NextToken();
+        e2.reset(ParseMultiplicativeExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMAdditiveExpression(line, TOKplus, e1.release(),
+                                                 e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKminus:
+        NextToken();
+        e2.reset(ParseMultiplicativeExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMAdditiveExpression(line, TOKminus, e1.release(),
+                                                 e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseUnaryExpression());
+  for (;;) {
+    std::unique_ptr<CXFA_FMSimpleExpression> e2;
+    switch (m_pToken->m_type) {
+      case TOKmul:
+        NextToken();
+        e2.reset(ParseUnaryExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMMultiplicativeExpression(
+              line, TOKmul, e1.release(), e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      case TOKdiv:
+        NextToken();
+        e2.reset(ParseUnaryExpression());
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e1.reset(new CXFA_FMMultiplicativeExpression(
+              line, TOKdiv, e1.release(), e2.release()));
+        } else {
+          e1.reset();
+        }
+        continue;
+      default:
+        break;
+    }
+    break;
+  }
+  return e1.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() {
+  std::unique_ptr<CXFA_FMSimpleExpression> e;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  switch (m_pToken->m_type) {
+    case TOKplus:
+      NextToken();
+      e.reset(ParseUnaryExpression());
+      if (m_pErrorInfo->message.IsEmpty()) {
+        e.reset(new CXFA_FMPosExpression(line, e.release()));
+      } else {
+        e.reset();
+      }
+      break;
+    case TOKminus:
+      NextToken();
+      e.reset(ParseUnaryExpression());
+      if (m_pErrorInfo->message.IsEmpty()) {
+        e.reset(new CXFA_FMNegExpression(line, e.release()));
+      } else {
+        e.reset();
+      }
+      break;
+    case TOKksnot:
+      NextToken();
+      e.reset(ParseUnaryExpression());
+      if (m_pErrorInfo->message.IsEmpty()) {
+        e.reset(new CXFA_FMNotExpression(line, e.release()));
+      } else {
+        e.reset();
+      }
+      break;
+    default:
+      e.reset(ParsePrimaryExpression());
+      break;
+  }
+  return e.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() {
+  std::unique_ptr<CXFA_FMSimpleExpression> e;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  switch (m_pToken->m_type) {
+    case TOKnumber:
+      e.reset(new CXFA_FMNumberExpression(line, m_pToken->m_wstring));
+      NextToken();
+      break;
+    case TOKstring:
+      e.reset(new CXFA_FMStringExpression(line, m_pToken->m_wstring));
+      NextToken();
+      break;
+    case TOKidentifier: {
+      CFX_WideStringC wsIdentifier(m_pToken->m_wstring);
+      NextToken();
+      if (m_pToken->m_type == TOKlbracket) {
+        CXFA_FMSimpleExpression* s = ParseIndexExpression();
+        if (s) {
+          e.reset(new CXFA_FMDotAccessorExpression(line, NULL, TOKdot,
+                                                   wsIdentifier, s));
+        }
+        NextToken();
+      } else {
+        e.reset(new CXFA_FMIdentifierExpressionn(line, wsIdentifier));
+      }
+    } break;
+    case TOKif:
+      e.reset(new CXFA_FMIdentifierExpressionn(line, m_pToken->m_wstring));
+      NextToken();
+      break;
+    case TOKnull:
+      e.reset(new CXFA_FMNullExpression(line));
+      NextToken();
+      break;
+    case TOKlparen:
+      e.reset(ParseParenExpression());
+      break;
+    default:
+      CFX_WideString ws_TempString = m_pToken->m_wstring;
+      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
+            ws_TempString.c_str());
+      NextToken();
+      break;
+  }
+  e.reset(ParsePostExpression(e.release()));
+  if (!(m_pErrorInfo->message.IsEmpty()))
+    e.reset();
+  return e.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
+    CXFA_FMSimpleExpression* e) {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  while (1) {
+    switch (m_pToken->m_type) {
+      case TOKlparen: {
+        NextToken();
+        std::unique_ptr<CFX_PtrArray> pArray;
+        if (m_pToken->m_type != TOKrparen) {
+          pArray.reset(new CFX_PtrArray());
+          while (m_pToken->m_type != TOKrparen) {
+            CXFA_FMSimpleExpression* e = ParseSimpleExpression();
+            if (e) {
+              pArray->Add(e);
+            }
+            if (m_pToken->m_type == TOKcomma) {
+              NextToken();
+            } else if (m_pToken->m_type == TOKeof ||
+                       m_pToken->m_type == TOKreserver) {
+              break;
+            }
+          }
+          if (m_pToken->m_type != TOKrparen) {
+            CFX_WideString ws_TempString = m_pToken->m_wstring;
+            Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+                  XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
+          }
+        }
+        if (m_pErrorInfo->message.IsEmpty()) {
+          e = new CXFA_FMCallExpression(line, e, pArray.release(), FALSE);
+          NextToken();
+          if (m_pToken->m_type != TOKlbracket) {
+            continue;
+          }
+          CXFA_FMSimpleExpression* s = ParseIndexExpression();
+          if (s) {
+            e = new CXFA_FMDotAccessorExpression(line, e, TOKcall,
+                                                 FX_WSTRC(L""), s);
+          } else {
+            delete e;
+            e = nullptr;
+          }
+        } else {
+          if (pArray) {
+            for (int32_t i = 0; i < pArray->GetSize(); ++i)
+              delete static_cast<CXFA_FMSimpleExpression*>(pArray->GetAt(i));
+          }
+          delete e;
+          e = nullptr;
+        }
+      } break;
+      case TOKdot:
+        NextToken();
+        if (m_pToken->m_type == TOKidentifier) {
+          CFX_WideStringC tempStr = m_pToken->m_wstring;
+          FX_DWORD tempLine = m_pToken->m_uLinenum;
+          NextToken();
+          if (m_pToken->m_type == TOKlparen) {
+            CXFA_FMSimpleExpression* pExpAccessor;
+            CXFA_FMSimpleExpression* pExpCall;
+            pExpAccessor = e;
+            NextToken();
+            std::unique_ptr<CFX_PtrArray> pArray;
+            if (m_pToken->m_type != TOKrparen) {
+              pArray.reset(new CFX_PtrArray());
+              while (m_pToken->m_type != TOKrparen) {
+                CXFA_FMSimpleExpression* exp = ParseSimpleExpression();
+                pArray->Add(exp);
+                if (m_pToken->m_type == TOKcomma) {
+                  NextToken();
+                } else if (m_pToken->m_type == TOKeof ||
+                           m_pToken->m_type == TOKreserver) {
+                  break;
+                }
+              }
+              if (m_pToken->m_type != TOKrparen) {
+                CFX_WideString ws_TempString = m_pToken->m_wstring;
+                Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+                      XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
+              }
+            }
+            if (m_pErrorInfo->message.IsEmpty()) {
+              CXFA_FMSimpleExpression* pIdentifier =
+                  new CXFA_FMIdentifierExpressionn(tempLine, tempStr);
+              pExpCall = new CXFA_FMCallExpression(line, pIdentifier,
+                                                   pArray.release(), TRUE);
+              e = new CXFA_FMMethodCallExpression(line, pExpAccessor, pExpCall);
+              NextToken();
+              if (m_pToken->m_type != TOKlbracket) {
+                continue;
+              }
+              CXFA_FMSimpleExpression* s = ParseIndexExpression();
+              if (s) {
+                e = new CXFA_FMDotAccessorExpression(line, e, TOKcall,
+                                                     FX_WSTRC(L""), s);
+              } else {
+                delete e;
+                e = nullptr;
+              }
+            } else {
+              if (pArray) {
+                for (int32_t i = 0; i < pArray->GetSize(); ++i) {
+                  delete static_cast<CXFA_FMSimpleExpression*>(
+                      pArray->GetAt(i));
+                }
+              }
+              delete e;
+              e = nullptr;
+            }
+          } else if (m_pToken->m_type == TOKlbracket) {
+            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
+            if (!(m_pErrorInfo->message.IsEmpty())) {
+              delete e;
+              return nullptr;
+            }
+            e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdot, tempStr,
+                                                 s.release());
+          } else {
+            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
+                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
+            e = new CXFA_FMDotAccessorExpression(line, e, TOKdot, tempStr, s);
+            continue;
+          }
+        } else {
+          CFX_WideString ws_TempString = m_pToken->m_wstring;
+          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+                ws_TempString.c_str());
+          return e;
+        }
+        break;
+      case TOKdotdot:
+        NextToken();
+        if (m_pToken->m_type == TOKidentifier) {
+          CFX_WideStringC tempStr = m_pToken->m_wstring;
+          FX_DWORD tempLine = m_pToken->m_uLinenum;
+          NextToken();
+          if (m_pToken->m_type == TOKlbracket) {
+            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
+            if (!(m_pErrorInfo->message.IsEmpty())) {
+              delete e;
+              return nullptr;
+            }
+            e = new CXFA_FMDotDotAccessorExpression(tempLine, e, TOKdotdot,
+                                                    tempStr, s.release());
+          } else {
+            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
+                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
+            e = new CXFA_FMDotDotAccessorExpression(line, e, TOKdotdot, tempStr,
+                                                    s);
+            continue;
+          }
+        } else {
+          CFX_WideString ws_TempString = m_pToken->m_wstring;
+          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+                ws_TempString.c_str());
+          return e;
+        }
+        break;
+      case TOKdotscream:
+        NextToken();
+        if (m_pToken->m_type == TOKidentifier) {
+          CFX_WideStringC tempStr = m_pToken->m_wstring;
+          FX_DWORD tempLine = m_pToken->m_uLinenum;
+          NextToken();
+          if (m_pToken->m_type == TOKlbracket) {
+            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
+            if (!(m_pErrorInfo->message.IsEmpty())) {
+              delete e;
+              return nullptr;
+            }
+            e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdotscream,
+                                                 tempStr, s.release());
+          } else {
+            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
+                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
+            e = new CXFA_FMDotAccessorExpression(line, e, TOKdotscream, tempStr,
+                                                 s);
+            continue;
+          }
+        } else {
+          CFX_WideString ws_TempString = m_pToken->m_wstring;
+          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
+                ws_TempString.c_str());
+          return e;
+        }
+        break;
+      case TOKdotstar: {
+        CXFA_FMSimpleExpression* s =
+            new CXFA_FMIndexExpression(line, ACCESSOR_NO_INDEX, NULL, FALSE);
+        e = new CXFA_FMDotAccessorExpression(line, e, TOKdotstar,
+                                             FX_WSTRC(L"*"), s);
+      } break;
+      default:
+        return e;
+    }
+    NextToken();
+  }
+  return e;
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() {
+  std::unique_ptr<CXFA_FMSimpleExpression> pExp;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  std::unique_ptr<CXFA_FMSimpleExpression> s;
+  XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX;
+  if (m_pToken->m_type == TOKmul) {
+    pExp.reset(
+        new CXFA_FMIndexExpression(line, accessorIndex, s.release(), TRUE));
+    NextToken();
+    if (m_pToken->m_type != TOKrbracket) {
+      CFX_WideString ws_TempString = m_pToken->m_wstring;
+      Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+            XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
+      pExp.reset();
+    }
+    return pExp.release();
+  }
+  if (m_pToken->m_type == TOKplus) {
+    accessorIndex = ACCESSOR_POSITIVE_INDEX;
+    NextToken();
+  } else if (m_pToken->m_type == TOKminus) {
+    accessorIndex = ACCESSOR_NEGATIVE_INDEX;
+    NextToken();
+  }
+  s.reset(ParseSimpleExpression());
+  if (m_pToken->m_type != TOKrbracket) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+          XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
+  } else {
+    pExp.reset(
+        new CXFA_FMIndexExpression(line, accessorIndex, s.release(), FALSE));
+  }
+  return pExp.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() {
+  Check(TOKlparen);
+
+  if (m_pToken->m_type == TOKrparen) {
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_NON_EMPTY_EXPRESSION);
+    NextToken();
+    return nullptr;
+  }
+
+  FX_DWORD line = m_pToken->m_uLinenum;
+  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseLogicalOrExpression());
+
+  while (m_pToken->m_type == TOKassign) {
+    NextToken();
+    std::unique_ptr<CXFA_FMSimpleExpression> pExp2(ParseLogicalOrExpression());
+    if (m_pErrorInfo->message.IsEmpty()) {
+      pExp1.reset(new CXFA_FMAssignExpression(line, TOKassign, pExp1.release(),
+                                              pExp2.release()));
+    } else {
+      pExp1.reset();
+    }
+  }
+  Check(TOKrparen);
+  return pExp1.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  CXFA_FMExpression* e = nullptr;
+  std::unique_ptr<CFX_PtrArray> expression(new CFX_PtrArray());
+  while (1) {
+    switch (m_pToken->m_type) {
+      case TOKeof:
+      case TOKendif:
+      case TOKelseif:
+      case TOKelse:
+      case TOKendwhile:
+      case TOKendfor:
+      case TOKend:
+      case TOKendfunc:
+      case TOKreserver:
+        break;
+      case TOKfunc:
+        e = ParseFunction();
+        if (e) {
+          expression->Add(e);
+        }
+        continue;
+      default:
+        e = ParseExpression();
+        if (e) {
+          expression->Add(e);
+        }
+        continue;
+    }
+    break;
+  }
+  std::unique_ptr<CXFA_FMBlockExpression> pExp;
+  if (m_pErrorInfo->message.IsEmpty()) {
+    pExp.reset(new CXFA_FMBlockExpression(line, expression.release()));
+  } else {
+    for (int i = 0; i < expression->GetSize(); ++i)
+      delete static_cast<CXFA_FMExpression*>(expression->GetAt(i));
+  }
+  return pExp.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  const FX_WCHAR* pStartPos = m_lexer->SavePos();
+  NextToken();
+  Check(TOKlparen);
+  std::unique_ptr<CXFA_FMSimpleExpression> pExpression;
+  while (m_pToken->m_type != TOKrparen) {
+    pExpression.reset(ParseSimpleExpression());
+    if (m_pToken->m_type != TOKcomma)
+      break;
+    NextToken();
+  }
+  Check(TOKrparen);
+  if (m_pToken->m_type != TOKthen) {
+    m_lexer->SetCurrentLine(line);
+    m_pToken = new CXFA_FMToken(line);
+    m_pToken->m_type = TOKidentifier;
+    m_pToken->m_wstring = FX_WSTRC(L"if");
+    m_lexer->SetToken(m_pToken);
+    m_lexer->RestorePos(pStartPos);
+    return ParseExpExpression();
+  }
+  Check(TOKthen);
+  std::unique_ptr<CXFA_FMExpression> pIfExpression(ParseBlockExpression());
+  std::unique_ptr<CXFA_FMExpression> pElseExpression;
+  switch (m_pToken->m_type) {
+    case TOKeof:
+    case TOKendif:
+      Check(TOKendif);
+      break;
+    case TOKif:
+      pElseExpression.reset(ParseIfExpression());
+      Check(TOKendif);
+      break;
+    case TOKelseif:
+      pElseExpression.reset(ParseIfExpression());
+      break;
+    case TOKelse:
+      NextToken();
+      pElseExpression.reset(ParseBlockExpression());
+      Check(TOKendif);
+      break;
+    default:
+      CFX_WideString ws_TempString = m_pToken->m_wstring;
+      Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IFEND, ws_TempString.c_str());
+      NextToken();
+      break;
+  }
+  std::unique_ptr<CXFA_FMIfExpression> pExp;
+  if (m_pErrorInfo->message.IsEmpty()) {
+    pExp.reset(new CXFA_FMIfExpression(line, pExpression.release(),
+                                       pIfExpression.release(),
+                                       pElseExpression.release()));
+  }
+  return pExp.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() {
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  std::unique_ptr<CXFA_FMSimpleExpression> pCondition(ParseParenExpression());
+  Check(TOKdo);
+  std::unique_ptr<CXFA_FMExpression> pExpression(ParseBlockExpression());
+  Check(TOKendwhile);
+  std::unique_ptr<CXFA_FMExpression> e;
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMWhileExpression(line, pCondition.release(),
+                                       pExpression.release()));
+  }
+  return e.release();
+}
+
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() {
+  std::unique_ptr<CXFA_FMSimpleExpression> e;
+  switch (m_pToken->m_type) {
+    case TOKidentifier:
+      e.reset(ParseSimpleExpression());
+      break;
+    default:
+      CFX_WideString ws_TempString = m_pToken->m_wstring;
+      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
+            ws_TempString.c_str());
+      NextToken();
+      break;
+  }
+  return e.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseForExpression() {
+  CFX_WideStringC wsVariant;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  if (m_pToken->m_type != TOKidentifier) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
+  }
+  wsVariant = m_pToken->m_wstring;
+  NextToken();
+  std::unique_ptr<CXFA_FMSimpleExpression> pAssignment;
+  if (m_pToken->m_type == TOKassign) {
+    NextToken();
+    pAssignment.reset(ParseSimpleExpression());
+  } else {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
+  }
+  int32_t iDirection = 0;
+  if (m_pToken->m_type == TOKupto) {
+    iDirection = 1;
+  } else if (m_pToken->m_type == TOKdownto) {
+    iDirection = -1;
+  } else {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, L"upto or downto",
+          (const FX_WCHAR*)ws_TempString);
+  }
+  NextToken();
+  std::unique_ptr<CXFA_FMSimpleExpression> pAccessor(ParseSimpleExpression());
+  std::unique_ptr<CXFA_FMSimpleExpression> pStep;
+  if (m_pToken->m_type == TOKstep) {
+    NextToken();
+    pStep.reset(ParseSimpleExpression());
+  }
+  Check(TOKdo);
+  std::unique_ptr<CXFA_FMExpression> pList(ParseBlockExpression());
+  Check(TOKendfor);
+  std::unique_ptr<CXFA_FMExpression> e;
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMForExpression(line, wsVariant, pAssignment.release(),
+                                     pAccessor.release(), iDirection,
+                                     pStep.release(), pList.release()));
+  }
+  return e.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  CFX_WideStringC wsIdentifier;
+  std::unique_ptr<CFX_PtrArray> pAccessors;
+  std::unique_ptr<CXFA_FMExpression> pList;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  if (m_pToken->m_type != TOKidentifier) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
+          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
+  }
+  wsIdentifier = m_pToken->m_wstring;
+  NextToken();
+  Check(TOKin);
+  Check(TOKlparen);
+  if (m_pToken->m_type == TOKrparen) {
+    CFX_WideString ws_TempString = m_pToken->m_wstring;
+    Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
+          ws_TempString.c_str());
+    NextToken();
+  } else {
+    pAccessors.reset(new CFX_PtrArray());
+    while (m_pToken->m_type != TOKrparen) {
+      CXFA_FMSimpleExpression* s = ParseSimpleExpression();
+      if (s) {
+        pAccessors->Add(s);
+      }
+      if (m_pToken->m_type == TOKcomma) {
+        NextToken();
+      } else {
+        break;
+      }
+    }
+    Check(TOKrparen);
+  }
+  Check(TOKdo);
+  pList.reset(ParseBlockExpression());
+  Check(TOKendfor);
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMForeachExpression(
+        line, wsIdentifier, pAccessors.release(), pList.release()));
+  } else {
+    if (pAccessors) {
+      for (int i = 0; i < pAccessors->GetSize(); ++i)
+        delete static_cast<CXFA_FMSimpleExpression*>(pAccessors->GetAt(i));
+    }
+  }
+  return e.release();
+}
+
+CXFA_FMExpression* CXFA_FMParse::ParseDoExpression() {
+  std::unique_ptr<CXFA_FMExpression> e;
+  FX_DWORD line = m_pToken->m_uLinenum;
+  NextToken();
+  e.reset(ParseBlockExpression());
+  Check(TOKend);
+  if (m_pErrorInfo->message.IsEmpty()) {
+    e.reset(new CXFA_FMDoExpression(line, e.release()));
+  } else {
+    e.reset();
+  }
+  return e.release();
+}
diff --git a/xfa/fxfa/fm2js/xfa_fmparse.h b/xfa/fxfa/fm2js/xfa_fmparse.h
new file mode 100644
index 0000000..a8991b4
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_fmparse.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_FMPARSE_H_
+#define XFA_FXFA_FM2JS_XFA_FMPARSE_H_
+
+#include <memory>
+
+#include "xfa/fxfa/fm2js/xfa_expression.h"
+#include "xfa/fxfa/fm2js/xfa_lexer.h"
+
+class CXFA_FMParse {
+ public:
+  CXFA_FMParse();
+  int32_t Init(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
+  void NextToken();
+  void Check(XFA_FM_TOKEN op);
+  void Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...);
+  CFX_PtrArray* ParseTopExpression();
+  CXFA_FMExpression* ParseFunction();
+  CXFA_FMExpression* ParseExpression();
+  CXFA_FMExpression* ParseVarExpression();
+  CXFA_FMExpression* ParseExpExpression();
+  CXFA_FMExpression* ParseBlockExpression();
+  CXFA_FMExpression* ParseIfExpression();
+  CXFA_FMExpression* ParseWhileExpression();
+  CXFA_FMExpression* ParseForExpression();
+  CXFA_FMExpression* ParseForeachExpression();
+  CXFA_FMExpression* ParseDoExpression();
+  CXFA_FMSimpleExpression* ParseParenExpression();
+  CXFA_FMSimpleExpression* ParseSimpleExpression();
+  CXFA_FMSimpleExpression* ParseSubassignmentInForExpression();
+  CXFA_FMSimpleExpression* ParseLogicalOrExpression();
+  CXFA_FMSimpleExpression* ParseLogicalAndExpression();
+  CXFA_FMSimpleExpression* ParseEqualityExpression();
+  CXFA_FMSimpleExpression* ParseRelationalExpression();
+  CXFA_FMSimpleExpression* ParseAddtiveExpression();
+  CXFA_FMSimpleExpression* ParseMultiplicativeExpression();
+  CXFA_FMSimpleExpression* ParseUnaryExpression();
+  CXFA_FMSimpleExpression* ParsePrimaryExpression();
+  CXFA_FMSimpleExpression* ParsePostExpression(CXFA_FMSimpleExpression* e);
+  CXFA_FMSimpleExpression* ParseIndexExpression();
+
+ private:
+  std::unique_ptr<CXFA_FMLexer> m_lexer;
+  CXFA_FMToken* m_pToken;
+  CXFA_FMErrorInfo* m_pErrorInfo;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_FMPARSE_H_
diff --git a/xfa/fxfa/fm2js/xfa_lexer.cpp b/xfa/fxfa/fm2js/xfa_lexer.cpp
new file mode 100644
index 0000000..d470390
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_lexer.cpp
@@ -0,0 +1,552 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_lexer.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+
+namespace {
+
+struct XFA_FMDChar {
+  static const FX_WCHAR* inc(const FX_WCHAR*& p) {
+    ++p;
+    return p;
+  }
+  static const FX_WCHAR* dec(const FX_WCHAR*& p) {
+    --p;
+    return p;
+  }
+  static uint16_t get(const FX_WCHAR* p) { return *p; }
+  static FX_BOOL isWhiteSpace(const FX_WCHAR* p) {
+    return (*p) == 0x09 || (*p) == 0x0b || (*p) == 0x0c || (*p) == 0x20;
+  }
+  static FX_BOOL isLineTerminator(const FX_WCHAR* p) {
+    return *p == 0x0A || *p == 0x0D;
+  }
+  static FX_BOOL isBinary(const FX_WCHAR* p) {
+    return (*p) >= '0' && (*p) <= '1';
+  }
+  static FX_BOOL isOctal(const FX_WCHAR* p) {
+    return (*p) >= '0' && (*p) <= '7';
+  }
+  static FX_BOOL isDigital(const FX_WCHAR* p) {
+    return (*p) >= '0' && (*p) <= '9';
+  }
+  static FX_BOOL isHex(const FX_WCHAR* p) {
+    return isDigital(p) || ((*p) >= 'a' && (*p) <= 'f') ||
+           ((*p) >= 'A' && (*p) <= 'F');
+  }
+  static FX_BOOL isAlpha(const FX_WCHAR* p) {
+    return ((*p) <= 'z' && (*p) >= 'a') || ((*p) <= 'Z' && (*p) >= 'A');
+  }
+  static FX_BOOL isAvalid(const FX_WCHAR* p, FX_BOOL flag = 0);
+  static FX_BOOL string2number(const FX_WCHAR* s,
+                               FX_DOUBLE* pValue,
+                               const FX_WCHAR*& pEnd);
+  static FX_BOOL isUnicodeAlpha(uint16_t ch);
+};
+
+inline FX_BOOL XFA_FMDChar::isAvalid(const FX_WCHAR* p, FX_BOOL flag) {
+  if (*p == 0) {
+    return 1;
+  }
+  if ((*p <= 0x0A && *p >= 0x09) || *p == 0x0D ||
+      (*p <= 0xd7ff && *p >= 0x20) || (*p <= 0xfffd && *p >= 0xe000)) {
+    return 1;
+  }
+  if (!flag) {
+    if (*p == 0x0B || *p == 0x0C) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+inline FX_BOOL XFA_FMDChar::string2number(const FX_WCHAR* s,
+                                          FX_DOUBLE* pValue,
+                                          const FX_WCHAR*& pEnd) {
+  if (s) {
+    *pValue = wcstod((wchar_t*)s, (wchar_t**)&pEnd);
+  }
+  return 0;
+}
+
+inline FX_BOOL XFA_FMDChar::isUnicodeAlpha(uint16_t ch) {
+  if (ch == 0 || ch == 0x0A || ch == 0x0D || ch == 0x09 || ch == 0x0B ||
+      ch == 0x0C || ch == 0x20 || ch == '.' || ch == ';' || ch == '"' ||
+      ch == '=' || ch == '<' || ch == '>' || ch == ',' || ch == '(' ||
+      ch == ')' || ch == ']' || ch == '[' || ch == '&' || ch == '|' ||
+      ch == '+' || ch == '-' || ch == '*' || ch == '/') {
+    return FALSE;
+  }
+  return TRUE;
+}
+
+const XFA_FMKeyword keyWords[] = {
+    {TOKand, 0x00000026, L"&"},
+    {TOKlparen, 0x00000028, L"("},
+    {TOKrparen, 0x00000029, L")"},
+    {TOKmul, 0x0000002a, L"*"},
+    {TOKplus, 0x0000002b, L"+"},
+    {TOKcomma, 0x0000002c, L","},
+    {TOKminus, 0x0000002d, L"-"},
+    {TOKdot, 0x0000002e, L"."},
+    {TOKdiv, 0x0000002f, L"/"},
+    {TOKlt, 0x0000003c, L"<"},
+    {TOKassign, 0x0000003d, L"="},
+    {TOKgt, 0x0000003e, L">"},
+    {TOKlbracket, 0x0000005b, L"["},
+    {TOKrbracket, 0x0000005d, L"]"},
+    {TOKor, 0x0000007c, L"|"},
+    {TOKdotscream, 0x0000ec11, L".#"},
+    {TOKdotstar, 0x0000ec18, L".*"},
+    {TOKdotdot, 0x0000ec1c, L".."},
+    {TOKle, 0x000133f9, L"<="},
+    {TOKne, 0x000133fa, L"<>"},
+    {TOKeq, 0x0001391a, L"=="},
+    {TOKge, 0x00013e3b, L">="},
+    {TOKdo, 0x00020153, L"do"},
+    {TOKkseq, 0x00020676, L"eq"},
+    {TOKksge, 0x000210ac, L"ge"},
+    {TOKksgt, 0x000210bb, L"gt"},
+    {TOKif, 0x00021aef, L"if"},
+    {TOKin, 0x00021af7, L"in"},
+    {TOKksle, 0x00022a51, L"le"},
+    {TOKkslt, 0x00022a60, L"lt"},
+    {TOKksne, 0x00023493, L"ne"},
+    {TOKksor, 0x000239c1, L"or"},
+    {TOKnull, 0x052931bb, L"null"},
+    {TOKbreak, 0x05518c25, L"break"},
+    {TOKksand, 0x09f9db33, L"and"},
+    {TOKend, 0x0a631437, L"end"},
+    {TOKeof, 0x0a63195a, L"eof"},
+    {TOKfor, 0x0a7d67a7, L"for"},
+    {TOKnan, 0x0b4f91dd, L"nan"},
+    {TOKksnot, 0x0b4fd9b1, L"not"},
+    {TOKvar, 0x0c2203e9, L"var"},
+    {TOKthen, 0x2d5738cf, L"then"},
+    {TOKelse, 0x45f65ee9, L"else"},
+    {TOKexit, 0x4731d6ba, L"exit"},
+    {TOKdownto, 0x4caadc3b, L"downto"},
+    {TOKreturn, 0x4db8bd60, L"return"},
+    {TOKinfinity, 0x5c0a010a, L"infinity"},
+    {TOKendwhile, 0x5c64bff0, L"endwhile"},
+    {TOKforeach, 0x67e31f38, L"foreach"},
+    {TOKendfunc, 0x68f984a3, L"endfunc"},
+    {TOKelseif, 0x78253218, L"elseif"},
+    {TOKwhile, 0x84229259, L"while"},
+    {TOKendfor, 0x8ab49d7e, L"endfor"},
+    {TOKthrow, 0x8db05c94, L"throw"},
+    {TOKstep, 0xa7a7887c, L"step"},
+    {TOKupto, 0xb5155328, L"upto"},
+    {TOKcontinue, 0xc0340685, L"continue"},
+    {TOKfunc, 0xcdce60ec, L"func"},
+    {TOKendif, 0xe0e8fee6, L"endif"},
+};
+
+const XFA_FM_TOKEN KEYWORD_START = TOKdo;
+const XFA_FM_TOKEN KEYWORD_END = TOKendif;
+
+}  // namespace
+
+const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op) {
+  if (op < KEYWORD_START || op > KEYWORD_END)
+    return L"";
+  return keyWords[op].m_keyword;
+}
+
+CXFA_FMToken::CXFA_FMToken() : m_type(TOKreserver), m_uLinenum(1) {}
+
+CXFA_FMToken::CXFA_FMToken(FX_DWORD uLineNum)
+    : m_type(TOKreserver), m_uLinenum(uLineNum) {}
+
+CXFA_FMLexer::CXFA_FMLexer(const CFX_WideStringC& wsFormCalc,
+                           CXFA_FMErrorInfo* pErrorInfo)
+    : m_ptr(wsFormCalc.GetPtr()), m_uCurrentLine(1), m_pErrorInfo(pErrorInfo) {}
+
+CXFA_FMToken* CXFA_FMLexer::NextToken() {
+  m_pToken.reset(Scan());
+  return m_pToken.get();
+}
+
+CXFA_FMToken* CXFA_FMLexer::Scan() {
+  uint16_t ch = 0;
+  CXFA_FMToken* p = new CXFA_FMToken(m_uCurrentLine);
+  if (!XFA_FMDChar::isAvalid(m_ptr)) {
+    ch = XFA_FMDChar::get(m_ptr);
+    Error(FMERR_UNSUPPORTED_CHAR, ch);
+    return p;
+  }
+  int iRet = 0;
+  while (1) {
+    if (!XFA_FMDChar::isAvalid(m_ptr)) {
+      ch = XFA_FMDChar::get(m_ptr);
+      Error(FMERR_UNSUPPORTED_CHAR, ch);
+      return p;
+    }
+    ch = XFA_FMDChar::get(m_ptr);
+    switch (ch) {
+      case 0:
+        p->m_type = TOKeof;
+        return p;
+      case 0x0A:
+        ++m_uCurrentLine;
+        p->m_uLinenum = m_uCurrentLine;
+        XFA_FMDChar::inc(m_ptr);
+        break;
+      case 0x0D:
+        XFA_FMDChar::inc(m_ptr);
+        break;
+      case ';': {
+        const FX_WCHAR* pTemp = 0;
+        Comment(m_ptr, pTemp);
+        m_ptr = pTemp;
+      } break;
+      case '"': {
+        const FX_WCHAR* pTemp = 0;
+        p->m_type = TOKstring;
+        iRet = String(p, m_ptr, pTemp);
+        m_ptr = pTemp;
+      }
+        return p;
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+      case '8':
+      case '9': {
+        p->m_type = TOKnumber;
+        const FX_WCHAR* pTemp = 0;
+        iRet = Number(p, m_ptr, pTemp);
+        m_ptr = pTemp;
+        if (iRet) {
+          Error(FMERR_BAD_SUFFIX_NUMBER);
+          return p;
+        }
+      }
+        return p;
+      case '=':
+        XFA_FMDChar::inc(m_ptr);
+        if (XFA_FMDChar::isAvalid(m_ptr)) {
+          ch = XFA_FMDChar::get(m_ptr);
+          if (ch == '=') {
+            p->m_type = TOKeq;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else {
+            p->m_type = TOKassign;
+            return p;
+          }
+        } else {
+          ch = XFA_FMDChar::get(m_ptr);
+          Error(FMERR_UNSUPPORTED_CHAR, ch);
+          return p;
+        }
+        break;
+      case '<':
+        XFA_FMDChar::inc(m_ptr);
+        if (XFA_FMDChar::isAvalid(m_ptr)) {
+          ch = XFA_FMDChar::get(m_ptr);
+          if (ch == '=') {
+            p->m_type = TOKle;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else if (ch == '>') {
+            p->m_type = TOKne;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else {
+            p->m_type = TOKlt;
+            return p;
+          }
+        } else {
+          ch = XFA_FMDChar::get(m_ptr);
+          Error(FMERR_UNSUPPORTED_CHAR, ch);
+          return p;
+        }
+        break;
+      case '>':
+        XFA_FMDChar::inc(m_ptr);
+        if (XFA_FMDChar::isAvalid(m_ptr)) {
+          ch = XFA_FMDChar::get(m_ptr);
+          if (ch == '=') {
+            p->m_type = TOKge;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else {
+            p->m_type = TOKgt;
+            return p;
+          }
+        } else {
+          ch = XFA_FMDChar::get(m_ptr);
+          Error(FMERR_UNSUPPORTED_CHAR, ch);
+          return p;
+        }
+        break;
+      case ',':
+        p->m_type = TOKcomma;
+        XFA_FMDChar::inc(m_ptr);
+        return p;
+      case '(':
+        p->m_type = TOKlparen;
+        XFA_FMDChar::inc(m_ptr);
+        return p;
+      case ')':
+        p->m_type = TOKrparen;
+        XFA_FMDChar::inc(m_ptr);
+        return p;
+      case '[':
+        p->m_type = TOKlbracket;
+        XFA_FMDChar::inc(m_ptr);
+        return p;
+      case ']':
+        p->m_type = TOKrbracket;
+        XFA_FMDChar::inc(m_ptr);
+        return p;
+      case '&':
+        XFA_FMDChar::inc(m_ptr);
+        p->m_type = TOKand;
+        return p;
+      case '|':
+        XFA_FMDChar::inc(m_ptr);
+        p->m_type = TOKor;
+        return p;
+      case '+':
+        XFA_FMDChar::inc(m_ptr);
+        p->m_type = TOKplus;
+        return p;
+      case '-':
+        XFA_FMDChar::inc(m_ptr);
+        p->m_type = TOKminus;
+        return p;
+      case '*':
+        XFA_FMDChar::inc(m_ptr);
+        p->m_type = TOKmul;
+        return p;
+      case '/':
+        XFA_FMDChar::inc(m_ptr);
+        if (XFA_FMDChar::isAvalid(m_ptr)) {
+          ch = XFA_FMDChar::get(m_ptr);
+          if (ch == '/') {
+            const FX_WCHAR* pTemp = 0;
+            Comment(m_ptr, pTemp);
+            m_ptr = pTemp;
+            break;
+          } else {
+            p->m_type = TOKdiv;
+            return p;
+          }
+        } else {
+          ch = XFA_FMDChar::get(m_ptr);
+          Error(FMERR_UNSUPPORTED_CHAR, ch);
+          return p;
+        }
+        break;
+      case '.':
+        XFA_FMDChar::inc(m_ptr);
+        if (XFA_FMDChar::isAvalid(m_ptr)) {
+          ch = XFA_FMDChar::get(m_ptr);
+          if (ch == '.') {
+            p->m_type = TOKdotdot;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else if (ch == '*') {
+            p->m_type = TOKdotstar;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else if (ch == '#') {
+            p->m_type = TOKdotscream;
+            XFA_FMDChar::inc(m_ptr);
+            return p;
+          } else if (ch <= '9' && ch >= '0') {
+            p->m_type = TOKnumber;
+            const FX_WCHAR* pTemp = 0;
+            XFA_FMDChar::dec(m_ptr);
+            iRet = Number(p, m_ptr, pTemp);
+            m_ptr = pTemp;
+            if (iRet) {
+              Error(FMERR_BAD_SUFFIX_NUMBER);
+            }
+            return p;
+          } else {
+            p->m_type = TOKdot;
+            return p;
+          }
+        } else {
+          ch = XFA_FMDChar::get(m_ptr);
+          Error(FMERR_UNSUPPORTED_CHAR, ch);
+          return p;
+        }
+      case 0x09:
+      case 0x0B:
+      case 0x0C:
+      case 0x20:
+        XFA_FMDChar::inc(m_ptr);
+        break;
+      default: {
+        const FX_WCHAR* pTemp = 0;
+        iRet = Identifiers(p, m_ptr, pTemp);
+        m_ptr = pTemp;
+        if (iRet) {
+          return p;
+        }
+        p->m_type = IsKeyword(p->m_wstring);
+      }
+        return p;
+    }
+  }
+}
+
+FX_DWORD CXFA_FMLexer::Number(CXFA_FMToken* t,
+                              const FX_WCHAR* p,
+                              const FX_WCHAR*& pEnd) {
+  FX_DOUBLE number = 0;
+  if (XFA_FMDChar::string2number(p, &number, pEnd)) {
+    return 1;
+  }
+  if (pEnd && XFA_FMDChar::isAlpha(pEnd)) {
+    return 1;
+  }
+  t->m_wstring = CFX_WideStringC(p, (pEnd - p));
+  return 0;
+}
+
+FX_DWORD CXFA_FMLexer::String(CXFA_FMToken* t,
+                              const FX_WCHAR* p,
+                              const FX_WCHAR*& pEnd) {
+  const FX_WCHAR* pStart = p;
+  uint16_t ch = 0;
+  XFA_FMDChar::inc(p);
+  ch = XFA_FMDChar::get(p);
+  while (ch) {
+    if (!XFA_FMDChar::isAvalid(p)) {
+      ch = XFA_FMDChar::get(p);
+      pEnd = p;
+      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+      Error(FMERR_UNSUPPORTED_CHAR, ch);
+      return 1;
+    }
+    if (ch == '"') {
+      XFA_FMDChar::inc(p);
+      if (!XFA_FMDChar::isAvalid(p)) {
+        ch = XFA_FMDChar::get(p);
+        pEnd = p;
+        t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+        Error(FMERR_UNSUPPORTED_CHAR, ch);
+        return 1;
+      }
+      ch = XFA_FMDChar::get(p);
+      if (ch == '"') {
+        goto NEXT;
+      } else {
+        break;
+      }
+    }
+  NEXT:
+    XFA_FMDChar::inc(p);
+    ch = XFA_FMDChar::get(p);
+  }
+  pEnd = p;
+  t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+  return 0;
+}
+
+FX_DWORD CXFA_FMLexer::Identifiers(CXFA_FMToken* t,
+                                   const FX_WCHAR* p,
+                                   const FX_WCHAR*& pEnd) {
+  const FX_WCHAR* pStart = p;
+  uint16_t ch = 0;
+  ch = XFA_FMDChar::get(p);
+  XFA_FMDChar::inc(p);
+  if (!XFA_FMDChar::isAvalid(p)) {
+    pEnd = p;
+    t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+    Error(FMERR_UNSUPPORTED_CHAR, ch);
+    return 1;
+  }
+  ch = XFA_FMDChar::get(p);
+  while (ch) {
+    if (!XFA_FMDChar::isAvalid(p)) {
+      pEnd = p;
+      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+      Error(FMERR_UNSUPPORTED_CHAR, ch);
+      return 1;
+    }
+    ch = XFA_FMDChar::get(p);
+    if (XFA_FMDChar::isUnicodeAlpha(ch)) {
+      XFA_FMDChar::inc(p);
+    } else {
+      pEnd = p;
+      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+      return 0;
+    }
+  }
+  pEnd = p;
+  t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
+  return 0;
+}
+
+void CXFA_FMLexer::Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd) {
+  unsigned ch = 0;
+  XFA_FMDChar::inc(p);
+  ch = XFA_FMDChar::get(p);
+  while (ch) {
+    if (ch == 0x0D) {
+      XFA_FMDChar::inc(p);
+      pEnd = p;
+      return;
+    }
+    if (ch == 0x0A) {
+      ++m_uCurrentLine;
+      XFA_FMDChar::inc(p);
+      pEnd = p;
+      return;
+    }
+    XFA_FMDChar::inc(p);
+    ch = XFA_FMDChar::get(p);
+  }
+  pEnd = p;
+}
+
+XFA_FM_TOKEN CXFA_FMLexer::IsKeyword(const CFX_WideStringC& str) {
+  int32_t iLength = str.GetLength();
+  uint32_t uHash = FX_HashCode_String_GetW(str.GetPtr(), iLength, TRUE);
+  int32_t iStart = KEYWORD_START, iEnd = KEYWORD_END;
+  int32_t iMid = (iStart + iEnd) / 2;
+  XFA_FMKeyword keyword;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    keyword = keyWords[iMid];
+    if (uHash == keyword.m_uHash) {
+      return keyword.m_type;
+    } else if (uHash < keyword.m_uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return TOKidentifier;
+}
+
+void CXFA_FMLexer::Error(XFA_FM_ERRMSG msg, ...) {
+  m_pErrorInfo->linenum = m_uCurrentLine;
+  const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg);
+  va_list ap;
+  va_start(ap, msg);
+  m_pErrorInfo->message.FormatV(lpMessageInfo, ap);
+  va_end(ap);
+}
+
+FX_BOOL CXFA_FMLexer::HasError() const {
+  if (m_pErrorInfo->message.IsEmpty()) {
+    return FALSE;
+  }
+  return TRUE;
+}
diff --git a/xfa/fxfa/fm2js/xfa_lexer.h b/xfa/fxfa/fm2js/xfa_lexer.h
new file mode 100644
index 0000000..b0d6069
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_lexer.h
@@ -0,0 +1,134 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_LEXER_H_
+#define XFA_FXFA_FM2JS_XFA_LEXER_H_
+
+#include <memory>
+
+#include "core/include/fxcrt/fx_string.h"
+#include "xfa/fxfa/fm2js/xfa_error.h"
+
+enum XFA_FM_TOKEN {
+  TOKand,
+  TOKlparen,
+  TOKrparen,
+  TOKmul,
+  TOKplus,
+  TOKcomma,
+  TOKminus,
+  TOKdot,
+  TOKdiv,
+  TOKlt,
+  TOKassign,
+  TOKgt,
+  TOKlbracket,
+  TOKrbracket,
+  TOKor,
+  TOKdotscream,
+  TOKdotstar,
+  TOKdotdot,
+  TOKle,
+  TOKne,
+  TOKeq,
+  TOKge,
+  TOKdo,
+  TOKkseq,
+  TOKksge,
+  TOKksgt,
+  TOKif,
+  TOKin,
+  TOKksle,
+  TOKkslt,
+  TOKksne,
+  TOKksor,
+  TOKnull,
+  TOKbreak,
+  TOKksand,
+  TOKend,
+  TOKeof,
+  TOKfor,
+  TOKnan,
+  TOKksnot,
+  TOKvar,
+  TOKthen,
+  TOKelse,
+  TOKexit,
+  TOKdownto,
+  TOKreturn,
+  TOKinfinity,
+  TOKendwhile,
+  TOKforeach,
+  TOKendfunc,
+  TOKelseif,
+  TOKwhile,
+  TOKendfor,
+  TOKthrow,
+  TOKstep,
+  TOKupto,
+  TOKcontinue,
+  TOKfunc,
+  TOKendif,
+  TOKstar,
+  TOKidentifier,
+  TOKunderscore,
+  TOKdollar,
+  TOKexclamation,
+  TOKcall,
+  TOKstring,
+  TOKnumber,
+  TOKreserver
+};
+
+struct XFA_FMKeyword {
+  XFA_FM_TOKEN m_type;
+  uint32_t m_uHash;
+  const FX_WCHAR* m_keyword;
+};
+
+const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op);
+
+class CXFA_FMToken {
+ public:
+  CXFA_FMToken();
+  explicit CXFA_FMToken(FX_DWORD uLineNum);
+
+  CFX_WideStringC m_wstring;
+  XFA_FM_TOKEN m_type;
+  FX_DWORD m_uLinenum;
+};
+
+class CXFA_FMLexer {
+ public:
+  CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
+  CXFA_FMToken* NextToken();
+  FX_DWORD Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
+  FX_DWORD String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
+  FX_DWORD Identifiers(CXFA_FMToken* t,
+                       const FX_WCHAR* p,
+                       const FX_WCHAR*& pEnd);
+  void Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd);
+  XFA_FM_TOKEN IsKeyword(const CFX_WideStringC& p);
+  void SetCurrentLine(FX_DWORD line) { m_uCurrentLine = line; }
+  void SetToken(CXFA_FMToken* pToken) {
+    if (m_pToken.get() != pToken)
+      m_pToken.reset(pToken);
+  }
+  const FX_WCHAR* SavePos() { return m_ptr; }
+  void RestorePos(const FX_WCHAR* pPos) { m_ptr = pPos; }
+  void Error(XFA_FM_ERRMSG msg, ...);
+  FX_BOOL HasError() const;
+
+ protected:
+  CXFA_FMToken* Scan();
+
+  const FX_WCHAR* m_ptr;
+  FX_DWORD m_uCurrentLine;
+  std::unique_ptr<CXFA_FMToken> m_pToken;
+  CXFA_FMErrorInfo* m_pErrorInfo;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_LEXER_H_
diff --git a/xfa/fxfa/fm2js/xfa_program.cpp b/xfa/fxfa/fm2js/xfa_program.cpp
new file mode 100644
index 0000000..ef5efb2
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_program.cpp
@@ -0,0 +1,45 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_program.h"
+
+CXFA_FMProgram::CXFA_FMProgram() : m_globalFunction(0) {}
+CXFA_FMProgram::~CXFA_FMProgram() {
+  if (m_globalFunction != 0) {
+    delete m_globalFunction;
+    m_globalFunction = 0;
+  }
+}
+int32_t CXFA_FMProgram::Init(const CFX_WideStringC& wsFormcalc) {
+  return m_parse.Init(wsFormcalc, &m_pErrorInfo);
+}
+int32_t CXFA_FMProgram::ParseProgram() {
+  CFX_PtrArray* expressions = 0;
+  m_parse.NextToken();
+  if (!m_pErrorInfo.message.IsEmpty()) {
+    return -1;
+  }
+  expressions = m_parse.ParseTopExpression();
+  if (!m_pErrorInfo.message.IsEmpty()) {
+    CXFA_FMExpression* e = 0;
+    for (int32_t u = 0; u < expressions->GetSize(); ++u) {
+      e = (CXFA_FMExpression*)expressions->GetAt(u);
+      if (e) {
+        delete e;
+      }
+    }
+    delete expressions;
+    return -1;
+  }
+  m_globalFunction =
+      new CXFA_FMFunctionDefinition(1, 1, FX_WSTRC(L""), 0, expressions);
+  return 0;
+}
+int32_t CXFA_FMProgram::TranslateProgram(CFX_WideTextBuf& wsJavaScript) {
+  m_globalFunction->ToJavaScript(wsJavaScript);
+  wsJavaScript.AppendChar(0);
+  return 0;
+}
diff --git a/xfa/fxfa/fm2js/xfa_program.h b/xfa/fxfa/fm2js/xfa_program.h
new file mode 100644
index 0000000..2f6de5e
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_program.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_PROGRAM_H_
+#define XFA_FXFA_FM2JS_XFA_PROGRAM_H_
+
+#include "xfa/fxfa/fm2js/xfa_error.h"
+#include "xfa/fxfa/fm2js/xfa_fmparse.h"
+
+class CXFA_FMProgram {
+ public:
+  CXFA_FMProgram();
+  ~CXFA_FMProgram();
+  int32_t Init(const CFX_WideStringC& wsFormcalc);
+  int32_t ParseProgram();
+  int32_t TranslateProgram(CFX_WideTextBuf& wsJavaScript);
+  CXFA_FMErrorInfo& GetError() { return m_pErrorInfo; }
+
+ private:
+  CXFA_FMErrorInfo m_pErrorInfo;
+  CXFA_FMParse m_parse;
+  CXFA_FMFunctionDefinition* m_globalFunction;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_PROGRAM_H_
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
new file mode 100644
index 0000000..3e66573
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
@@ -0,0 +1,745 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_simpleexpression.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+
+namespace {
+
+const CFX_WideStringC gs_lpStrExpFuncName[] = {
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime."),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"),
+    FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"),
+};
+
+struct XFA_FMBuildInFunc {
+  uint32_t m_uHash;
+  const FX_WCHAR* m_buildinfunc;
+};
+const XFA_FMBuildInFunc g_BuildInFuncs[] = {
+    {0x0001f1f5, L"At"},           {0x00020b9c, L"FV"},
+    {0x00021aef, L"If"},           {0x00023ee6, L"PV"},
+    {0x04b5c9ee, L"Encode"},       {0x08e96685, L"DateFmt"},
+    {0x09f99db6, L"Abs"},          {0x09f9e583, L"Apr"},
+    {0x09fa043e, L"Avg"},          {0x0a9782a0, L"Get"},
+    {0x0b1b09df, L"Len"},          {0x0b3543a6, L"Max"},
+    {0x0b356ca4, L"Min"},          {0x0b358b60, L"Mod"},
+    {0x0b4fded4, L"NPV"},          {0x0b846bf1, L"Pmt"},
+    {0x0b8494f9, L"Put"},          {0x0bb8df5d, L"Ref"},
+    {0x0bd37a99, L"Str"},          {0x0bd37fb5, L"Sum"},
+    {0x1048469b, L"Cterm"},        {0x11e03660, L"Exists"},
+    {0x126236e6, L"Post"},         {0x127c6661, L"PPmt"},
+    {0x193ade3e, L"Right"},        {0x1ec8ab2c, L"Rate"},
+    {0x20e476dc, L"IsoTime2Num"},  {0x23eb6816, L"TimeFmt"},
+    {0x24fb17b0, L"LocalDateFmt"}, {0x28dee6e9, L"Format"},
+    {0x2d0890b8, L"Term"},         {0x2d71b00f, L"Time"},
+    {0x2f890fb1, L"Num2Time"},     {0x3767511d, L"Ceil"},
+    {0x3ffd1941, L"LocalTimeFmt"}, {0x442f68c8, L"Round"},
+    {0x46fd1128, L"Eval"},         {0x4d629440, L"Date2Num"},
+    {0x4dcf25f8, L"Concat"},       {0x4e00255d, L"UnitValue"},
+    {0x55a5cc29, L"Lower"},        {0x5e43e04c, L"WordNum"},
+    {0x620ce6ba, L"Ipmt"},         {0x6f544d49, L"Count"},
+    {0x7e241013, L"Within"},       {0x9b9a6e2b, L"IsoDate2Num"},
+    {0xb2c941c2, L"UnitType"},     {0xb598a1f7, L"Uuid"},
+    {0xbde9abde, L"Date"},         {0xc0010b80, L"Num2Date"},
+    {0xc1f6144c, L"Upper"},        {0xc44028f7, L"Oneof"},
+    {0xc62c1b2c, L"Space"},        {0xd0ff50f9, L"HasValue"},
+    {0xd1537042, L"Floor"},        {0xd2ac9cf1, L"Time2Num"},
+    {0xd907aee5, L"Num2GMTime"},   {0xdf24f7c4, L"Decode"},
+    {0xe2664803, L"Substr"},       {0xe3e7b528, L"Stuff"},
+    {0xe6792d4e, L"Rtrim"},        {0xe8c23f5b, L"Parse"},
+    {0xea18d121, L"Choose"},       {0xebfef69c, L"Replace"},
+    {0xf5ad782b, L"Left"},         {0xf7bb2248, L"Ltrim"},
+};
+
+struct XFA_FMSOMMethod {
+  uint32_t m_uHash;
+  const FX_WCHAR* m_wsSomMethodName;
+  FX_DWORD m_dParameters;
+};
+const XFA_FMSOMMethod gs_FMSomMethods[] = {
+    {0x00000068, L"h", 0x01},
+    {0x00000077, L"w", 0x01},
+    {0x00000078, L"x", 0x01},
+    {0x00000079, L"y", 0x01},
+    {0x05eb5b0f, L"pageSpan", 0x01},
+    {0x10f1b1bd, L"page", 0x01},
+    {0x3bf1c2a5, L"absPageSpan", 0x01},
+    {0x3c752495, L"verify", 0x0d},
+    {0x44c352ad, L"formNodes", 0x01},
+    {0x5775c2cc, L"absPageInBatch", 0x01},
+    {0x5ee00996, L"setElement", 0x01},
+    {0x7033bfd5, L"insert", 0x03},
+    {0x8c5feb32, L"sheetInBatch", 0x01},
+    {0x8f3a8379, L"sheet", 0x01},
+    {0x92dada4f, L"saveFilteredXML", 0x01},
+    {0x9cab7cae, L"remove", 0x01},
+    {0xa68635f1, L"sign", 0x61},
+    {0xaac241c8, L"isRecordGroup", 0x01},
+    {0xd8ed1467, L"clear", 0x01},
+    {0xda12e518, L"append", 0x01},
+    {0xe74f0653, L"absPage", 0x01},
+};
+
+}  // namespace
+
+CFX_WideStringC XFA_FM_EXPTypeToString(
+    XFA_FM_SimpleExpressionType simpleExpType) {
+  return gs_lpStrExpFuncName[simpleExpType];
+}
+
+CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op)
+    : m_line(line), m_op(op) {}
+
+void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+
+void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
+
+XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const {
+  return m_op;
+}
+
+CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line)
+    : CXFA_FMSimpleExpression(line, TOKnull) {}
+
+void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"null");
+}
+
+CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line,
+                                                 CFX_WideStringC wsNumber)
+    : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {}
+
+void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << m_wsNumber;
+}
+
+CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line,
+                                                 CFX_WideStringC wsString)
+    : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {}
+
+void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  CFX_WideString tempStr = m_wsString;
+  if (tempStr.GetLength() > 2) {
+    javascript.AppendChar(L'\"');
+    FX_WCHAR oneChar;
+    for (int16_t i = 1; i < tempStr.GetLength() - 1; i++) {
+      oneChar = tempStr[i];
+      switch (oneChar) {
+        case L'\"': {
+          i++;
+          javascript << FX_WSTRC(L"\\\"");
+        } break;
+        case 0x0d:
+          break;
+        case 0x0a: {
+          javascript << FX_WSTRC(L"\\n");
+        } break;
+        default: { javascript.AppendChar(oneChar); } break;
+      }
+    }
+    javascript.AppendChar(L'\"');
+  } else {
+    javascript << tempStr;
+  }
+}
+
+CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn(
+    FX_DWORD line,
+    CFX_WideStringC wsIdentifier)
+    : CXFA_FMSimpleExpression(line, TOKidentifier),
+      m_wsIdentifier(wsIdentifier) {}
+
+void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) {
+  CFX_WideString tempStr = m_wsIdentifier;
+  if (tempStr.Equal(FX_WSTRC(L"$"))) {
+    tempStr = FX_WSTRC(L"this");
+  } else if (tempStr.Equal(FX_WSTRC(L"!"))) {
+    tempStr = FX_WSTRC(L"xfa.datasets");
+  } else if (tempStr.Equal(FX_WSTRC(L"$data"))) {
+    tempStr = FX_WSTRC(L"xfa.datasets.data");
+  } else if (tempStr.Equal(FX_WSTRC(L"$event"))) {
+    tempStr = FX_WSTRC(L"xfa.event");
+  } else if (tempStr.Equal(FX_WSTRC(L"$form"))) {
+    tempStr = FX_WSTRC(L"xfa.form");
+  } else if (tempStr.Equal(FX_WSTRC(L"$host"))) {
+    tempStr = FX_WSTRC(L"xfa.host");
+  } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) {
+    tempStr = FX_WSTRC(L"xfa.layout");
+  } else if (tempStr.Equal(FX_WSTRC(L"$template"))) {
+    tempStr = FX_WSTRC(L"xfa.template");
+  } else if (tempStr[0] == L'!') {
+    tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1);
+  }
+  javascript << tempStr;
+}
+
+CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line,
+                                               XFA_FM_TOKEN op,
+                                               CXFA_FMSimpleExpression* pExp)
+    : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
+
+void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+
+CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
+                                           XFA_FM_TOKEN op,
+                                           CXFA_FMSimpleExpression* pExp1,
+                                           CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
+
+void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+
+CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line,
+                                                 XFA_FM_TOKEN op,
+                                                 CXFA_FMSimpleExpression* pExp1,
+                                                 CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"if (");
+  javascript << gs_lpStrExpFuncName[ISFMOBJECT];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"))\n{\n");
+  javascript << gs_lpStrExpFuncName[ASSIGN];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L");\n}\n");
+  CFX_WideTextBuf tempExp1;
+  m_pExp1->ToJavaScript(tempExp1);
+  if (m_pExp1->GetOperatorToken() == TOKidentifier &&
+      tempExp1.GetWideString() != FX_WSTRC(L"this")) {
+    javascript << FX_WSTRC(L"else\n{\n");
+    javascript << tempExp1;
+    javascript << FX_WSTRC(L" = ");
+    javascript << gs_lpStrExpFuncName[ASSIGN];
+    javascript << FX_WSTRC(L"(");
+    m_pExp1->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L", ");
+    m_pExp2->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L");\n}\n");
+  }
+}
+
+void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"if (");
+  javascript << gs_lpStrExpFuncName[ISFMOBJECT];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L"))\n{\n");
+  javascript << RUNTIMEFUNCTIONRETURNVALUE;
+  javascript << FX_WSTRC(L" = ");
+  javascript << gs_lpStrExpFuncName[ASSIGN];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L");\n}\n");
+  CFX_WideTextBuf tempExp1;
+  m_pExp1->ToJavaScript(tempExp1);
+  if (m_pExp1->GetOperatorToken() == TOKidentifier &&
+      tempExp1.GetWideString() != FX_WSTRC(L"this")) {
+    javascript << FX_WSTRC(L"else\n{\n");
+    javascript << RUNTIMEFUNCTIONRETURNVALUE;
+    javascript << FX_WSTRC(L" = ");
+    javascript << tempExp1;
+    javascript << FX_WSTRC(L" = ");
+    javascript << gs_lpStrExpFuncName[ASSIGN];
+    javascript << FX_WSTRC(L"(");
+    m_pExp1->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L", ");
+    m_pExp2->ToJavaScript(javascript);
+    javascript << FX_WSTRC(L");\n}\n");
+  }
+}
+
+CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[LOGICALOR];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[LOGICALAND];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  switch (m_op) {
+    case TOKeq:
+    case TOKkseq:
+      javascript << gs_lpStrExpFuncName[EQUALITY];
+      break;
+    case TOKne:
+    case TOKksne:
+      javascript << gs_lpStrExpFuncName[NOTEQUALITY];
+      break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  switch (m_op) {
+    case TOKlt:
+    case TOKkslt:
+      javascript << gs_lpStrExpFuncName[LESS];
+      break;
+    case TOKgt:
+    case TOKksgt:
+      javascript << gs_lpStrExpFuncName[GREATER];
+      break;
+    case TOKle:
+    case TOKksle:
+      javascript << gs_lpStrExpFuncName[LESSEQUAL];
+      break;
+    case TOKge:
+    case TOKksge:
+      javascript << gs_lpStrExpFuncName[GREATEREQUAL];
+      break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  switch (m_op) {
+    case TOKplus:
+      javascript << gs_lpStrExpFuncName[PLUS];
+      break;
+    case TOKminus:
+      javascript << gs_lpStrExpFuncName[MINUS];
+      break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(
+    FX_DWORD line,
+    XFA_FM_TOKEN op,
+    CXFA_FMSimpleExpression* pExp1,
+    CXFA_FMSimpleExpression* pExp2)
+    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+
+void CXFA_FMMultiplicativeExpression::ToJavaScript(
+    CFX_WideTextBuf& javascript) {
+  switch (m_op) {
+    case TOKmul:
+      javascript << gs_lpStrExpFuncName[MULTIPLE];
+      break;
+    case TOKdiv:
+      javascript << gs_lpStrExpFuncName[DIVIDE];
+      break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line,
+                                           CXFA_FMSimpleExpression* pExp)
+    : CXFA_FMUnaryExpression(line, TOKplus, pExp) {}
+
+void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[POSITIVE];
+  javascript << FX_WSTRC(L"(");
+  m_pExp->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line,
+                                           CXFA_FMSimpleExpression* pExp)
+    : CXFA_FMUnaryExpression(line, TOKminus, pExp) {}
+
+void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[NEGATIVE];
+  javascript << FX_WSTRC(L"(");
+  m_pExp->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line,
+                                           CXFA_FMSimpleExpression* pExp)
+    : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {}
+
+void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[NOT];
+  javascript << FX_WSTRC(L"(");
+  m_pExp->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line,
+                                             CXFA_FMSimpleExpression* pExp,
+                                             CFX_PtrArray* pArguments,
+                                             FX_BOOL bIsSomMethod)
+    : CXFA_FMUnaryExpression(line, TOKcall, pExp),
+      m_bIsSomMethod(bIsSomMethod),
+      m_pArguments(pArguments) {}
+
+CXFA_FMCallExpression::~CXFA_FMCallExpression() {
+  if (m_pArguments) {
+    for (int i = 0; i < m_pArguments->GetSize(); ++i) {
+      delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i));
+    }
+    m_pArguments->RemoveAll();
+    delete m_pArguments;
+  }
+}
+
+bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) {
+  uint32_t uHash = FX_HashCode_String_GetW(funcName->GetBuffer(),
+                                           funcName->GetLength(), TRUE);
+  const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs);
+  const XFA_FMBuildInFunc* pFunc =
+      std::lower_bound(g_BuildInFuncs, pEnd, uHash,
+                       [](const XFA_FMBuildInFunc& func, uint32_t hash) {
+                         return func.m_uHash < hash;
+                       });
+  if (pFunc < pEnd && uHash == pFunc->m_uHash) {
+    funcName->Clear();
+    *funcName << pFunc->m_buildinfunc;
+    return true;
+  }
+  return false;
+}
+
+FX_DWORD CXFA_FMCallExpression::IsMethodWithObjParam(
+    const CFX_WideStringC& methodName) {
+  int32_t iLength = methodName.GetLength();
+  uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength);
+  XFA_FMSOMMethod somMethodWithObjPara;
+  FX_DWORD parameters = 0x00;
+  int32_t iStart = 0,
+          iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1;
+  int32_t iMid = (iStart + iEnd) / 2;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    somMethodWithObjPara = gs_FMSomMethods[iMid];
+    if (uHash == somMethodWithObjPara.m_uHash) {
+      parameters = somMethodWithObjPara.m_dParameters;
+      break;
+    } else if (uHash < somMethodWithObjPara.m_uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return parameters;
+}
+
+void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  CFX_WideTextBuf funcName;
+  m_pExp->ToJavaScript(funcName);
+  if (m_bIsSomMethod) {
+    javascript << funcName;
+    javascript << FX_WSTRC(L"(");
+    if (m_pArguments) {
+      FX_DWORD methodPara = IsMethodWithObjParam(funcName.GetWideString());
+      if (methodPara > 0) {
+        for (int i = 0; i < m_pArguments->GetSize(); ++i) {
+          if ((methodPara & (0x01 << i)) > 0) {
+            javascript << gs_lpStrExpFuncName[GETFMJSOBJ];
+          } else {
+            javascript << gs_lpStrExpFuncName[GETFMVALUE];
+          }
+          javascript << FX_WSTRC(L"(");
+          CXFA_FMSimpleExpression* e =
+              reinterpret_cast<CXFA_FMSimpleExpression*>(
+                  m_pArguments->GetAt(i));
+          e->ToJavaScript(javascript);
+          javascript << FX_WSTRC(L")");
+          if (i + 1 < m_pArguments->GetSize()) {
+            javascript << FX_WSTRC(L", ");
+          }
+        }
+      } else {
+        for (int i = 0; i < m_pArguments->GetSize(); ++i) {
+          javascript << gs_lpStrExpFuncName[GETFMVALUE];
+          javascript << FX_WSTRC(L"(");
+          CXFA_FMSimpleExpression* e =
+              reinterpret_cast<CXFA_FMSimpleExpression*>(
+                  m_pArguments->GetAt(i));
+          e->ToJavaScript(javascript);
+          javascript << FX_WSTRC(L")");
+          if (i + 1 < m_pArguments->GetSize()) {
+            javascript << FX_WSTRC(L", ");
+          }
+        }
+      }
+    }
+    javascript << FX_WSTRC(L")");
+  } else {
+    bool isEvalFunc = false;
+    bool isExistsFunc = false;
+    if (IsBuildInFunc(&funcName)) {
+      if (funcName.GetWideString() == FX_WSTRC(L"Eval")) {
+        isEvalFunc = true;
+        javascript << FX_WSTRC(L"eval.call(this, ");
+        javascript << gs_lpStrExpFuncName[CALL];
+        javascript << FX_WSTRC(L"Translate");
+      } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) {
+        isExistsFunc = true;
+        javascript << gs_lpStrExpFuncName[CALL];
+        javascript << funcName;
+      } else {
+        javascript << gs_lpStrExpFuncName[CALL];
+        javascript << funcName;
+      }
+    } else {
+      javascript << funcName;
+    }
+    javascript << FX_WSTRC(L"(");
+    if (isExistsFunc) {
+      javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n");
+      if (m_pArguments && m_pArguments->GetSize() > 0) {
+        CXFA_FMSimpleExpression* e =
+            reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(0));
+        javascript << FX_WSTRC(L"return ");
+        e->ToJavaScript(javascript);
+        javascript << FX_WSTRC(L";\n}\n");
+      } else {
+        javascript << FX_WSTRC(L"return 0;\n}\n");
+      }
+      javascript << FX_WSTRC(
+          L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n");
+    } else if (m_pArguments) {
+      for (int i = 0; i < m_pArguments->GetSize(); ++i) {
+        CXFA_FMSimpleExpression* e =
+            reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i));
+        e->ToJavaScript(javascript);
+        if (i + 1 < m_pArguments->GetSize()) {
+          javascript << FX_WSTRC(L", ");
+        }
+      }
+    }
+    javascript << FX_WSTRC(L")");
+    if (isEvalFunc) {
+      javascript << FX_WSTRC(L")");
+    }
+  }
+}
+
+CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
+    FX_DWORD line,
+    CXFA_FMSimpleExpression* pAccessor,
+    XFA_FM_TOKEN op,
+    CFX_WideStringC wsIdentifier,
+    CXFA_FMSimpleExpression* pIndexExp)
+    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+      m_wsIdentifier(wsIdentifier) {}
+
+void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[DOT];
+  javascript << FX_WSTRC(L"(");
+  if (m_pExp1) {
+    m_pExp1->ToJavaScript(javascript);
+  } else {
+    javascript << FX_WSTRC(L"null");
+  }
+  javascript << FX_WSTRC(L", ");
+  javascript << FX_WSTRC(L"\"");
+  if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
+    m_pExp1->ToJavaScript(javascript);
+  }
+  javascript << FX_WSTRC(L"\", ");
+  if (m_op == TOKdotscream) {
+    javascript << FX_WSTRC(L"\"#");
+    javascript << m_wsIdentifier;
+    javascript << FX_WSTRC(L"\", ");
+  } else if (m_op == TOKdotstar) {
+    javascript << FX_WSTRC(L"\"*\", ");
+  } else if (m_op == TOKcall) {
+    javascript << FX_WSTRC(L"\"\", ");
+  } else {
+    javascript << FX_WSTRC(L"\"");
+    javascript << m_wsIdentifier;
+    javascript << FX_WSTRC(L"\", ");
+  }
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMIndexExpression::CXFA_FMIndexExpression(
+    FX_DWORD line,
+    XFA_FM_AccessorIndex accessorIndex,
+    CXFA_FMSimpleExpression* pIndexExp,
+    FX_BOOL bIsStarIndex)
+    : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp),
+      m_accessorIndex(accessorIndex),
+      m_bIsStarIndex(bIsStarIndex) {}
+
+void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  switch (m_accessorIndex) {
+    case ACCESSOR_NO_INDEX:
+      javascript << FX_WSTRC(L"0");
+      break;
+    case ACCESSOR_NO_RELATIVEINDEX:
+      javascript << FX_WSTRC(L"1");
+      break;
+    case ACCESSOR_POSITIVE_INDEX:
+      javascript << FX_WSTRC(L"2");
+      break;
+    case ACCESSOR_NEGATIVE_INDEX:
+      javascript << FX_WSTRC(L"3");
+      break;
+    default:
+      javascript << FX_WSTRC(L"0");
+  }
+  if (!m_bIsStarIndex) {
+    javascript << FX_WSTRC(L", ");
+    if (m_pExp) {
+      m_pExp->ToJavaScript(javascript);
+    } else {
+      javascript << FX_WSTRC(L"0");
+    }
+  }
+}
+
+CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
+    FX_DWORD line,
+    CXFA_FMSimpleExpression* pAccessor,
+    XFA_FM_TOKEN op,
+    CFX_WideStringC wsIdentifier,
+    CXFA_FMSimpleExpression* pIndexExp)
+    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+      m_wsIdentifier(wsIdentifier) {}
+
+void CXFA_FMDotDotAccessorExpression::ToJavaScript(
+    CFX_WideTextBuf& javascript) {
+  javascript << gs_lpStrExpFuncName[DOTDOT];
+  javascript << FX_WSTRC(L"(");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L", ");
+  javascript << FX_WSTRC(L"\"");
+  if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
+    m_pExp1->ToJavaScript(javascript);
+  }
+  javascript << FX_WSTRC(L"\", ");
+  javascript << FX_WSTRC(L"\"");
+  javascript << m_wsIdentifier;
+  javascript << FX_WSTRC(L"\", ");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L")");
+}
+
+CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
+    FX_DWORD line,
+    CXFA_FMSimpleExpression* pAccessorExp1,
+    CXFA_FMSimpleExpression* pCallExp)
+    : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {}
+
+void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+  javascript << FX_WSTRC(L"(\nfunction ()\n{\n");
+  javascript << FX_WSTRC(L"var method_return_value = null;\n");
+  javascript << FX_WSTRC(L"var accessor_object = ");
+  m_pExp1->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L";\n");
+  javascript << FX_WSTRC(L"if (");
+  javascript << gs_lpStrExpFuncName[ISFMARRAY];
+  javascript << FX_WSTRC(L"(accessor_object))\n{\n");
+  javascript << FX_WSTRC(
+      L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n");
+  javascript << FX_WSTRC(L"method_return_value = accessor_object[index].");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L";\n}\n}\n");
+  javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object.");
+  m_pExp2->ToJavaScript(javascript);
+  javascript << FX_WSTRC(L";\n}\n");
+  javascript << FX_WSTRC(L"return method_return_value;\n");
+  javascript << FX_WSTRC(L"}\n).call(this)");
+}
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.h b/xfa/fxfa/fm2js/xfa_simpleexpression.h
new file mode 100644
index 0000000..9098b39
--- /dev/null
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.h
@@ -0,0 +1,292 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
+#define XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
+
+#include <memory>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxfa/fm2js/xfa_lexer.h"
+
+#define RUNTIMEFUNCTIONRETURNVALUE \
+  (FX_WSTRC(L"foxit_xfa_formcalc_runtime_func_return_value"))
+#define EXCLAMATION_IN_IDENTIFIER \
+  (FX_WSTRC(L"foxit_xfa_formcalc__exclamation__"))
+
+enum XFA_FM_SimpleExpressionType {
+  ASSIGN,
+  LOGICALOR,
+  LOGICALAND,
+  EQUALITY,
+  NOTEQUALITY,
+  LESS,
+  LESSEQUAL,
+  GREATER,
+  GREATEREQUAL,
+  PLUS,
+  MINUS,
+  MULTIPLE,
+  DIVIDE,
+  POSITIVE,
+  NEGATIVE,
+  NOT,
+  CALL,
+  DOT,
+  DOTDOT,
+  CONCATFMOBJECT,
+  ISFMOBJECT,
+  ISFMARRAY,
+  GETFMVALUE,
+  GETFMJSOBJ,
+  VARFILTER
+};
+
+CFX_WideStringC XFA_FM_EXPTypeToString(
+    XFA_FM_SimpleExpressionType simpleExpType);
+
+enum XFA_FM_AccessorIndex {
+  ACCESSOR_NO_INDEX,
+  ACCESSOR_NO_RELATIVEINDEX,
+  ACCESSOR_POSITIVE_INDEX,
+  ACCESSOR_NEGATIVE_INDEX
+};
+
+class CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op);
+  virtual ~CXFA_FMSimpleExpression() {}
+  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
+  virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
+
+  XFA_FM_TOKEN GetOperatorToken() const;
+
+ protected:
+  FX_DWORD m_line;
+  XFA_FM_TOKEN m_op;
+};
+
+class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
+ public:
+  explicit CXFA_FMNullExpression(FX_DWORD line);
+  ~CXFA_FMNullExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber);
+  ~CXFA_FMNumberExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  CFX_WideStringC m_wsNumber;
+};
+
+class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString);
+  ~CXFA_FMStringExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  CFX_WideStringC m_wsString;
+};
+
+class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier);
+  ~CXFA_FMIdentifierExpressionn() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  CFX_WideStringC m_wsIdentifier;
+};
+
+class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMUnaryExpression(FX_DWORD line,
+                         XFA_FM_TOKEN op,
+                         CXFA_FMSimpleExpression* pExp);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ protected:
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
+};
+
+class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
+ public:
+  CXFA_FMBinExpression(FX_DWORD line,
+                       XFA_FM_TOKEN op,
+                       CXFA_FMSimpleExpression* pExp1,
+                       CXFA_FMSimpleExpression* pExp2);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ protected:
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
+  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
+};
+
+class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMAssignExpression(FX_DWORD line,
+                          XFA_FM_TOKEN op,
+                          CXFA_FMSimpleExpression* pExp1,
+                          CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMAssignExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+  void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMLogicalOrExpression(FX_DWORD line,
+                             XFA_FM_TOKEN op,
+                             CXFA_FMSimpleExpression* pExp1,
+                             CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMLogicalOrExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMLogicalAndExpression(FX_DWORD line,
+                              XFA_FM_TOKEN op,
+                              CXFA_FMSimpleExpression* pExp1,
+                              CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMLogicalAndExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMEqualityExpression(FX_DWORD line,
+                            XFA_FM_TOKEN op,
+                            CXFA_FMSimpleExpression* pExp1,
+                            CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMEqualityExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMRelationalExpression(FX_DWORD line,
+                              XFA_FM_TOKEN op,
+                              CXFA_FMSimpleExpression* pExp1,
+                              CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMRelationalExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMAdditiveExpression(FX_DWORD line,
+                            XFA_FM_TOKEN op,
+                            CXFA_FMSimpleExpression* pExp1,
+                            CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMAdditiveExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMMultiplicativeExpression(FX_DWORD line,
+                                  XFA_FM_TOKEN op,
+                                  CXFA_FMSimpleExpression* pExp1,
+                                  CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMMultiplicativeExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
+ public:
+  CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
+  ~CXFA_FMPosExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
+ public:
+  CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
+  ~CXFA_FMNegExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
+ public:
+  CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
+  ~CXFA_FMNotExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
+ public:
+  CXFA_FMCallExpression(FX_DWORD line,
+                        CXFA_FMSimpleExpression* pExp,
+                        CFX_PtrArray* pArguments,
+                        FX_BOOL bIsSomMethod);
+  ~CXFA_FMCallExpression() override;
+  bool IsBuildInFunc(CFX_WideTextBuf* funcName);
+  FX_DWORD IsMethodWithObjParam(const CFX_WideStringC& methodName);
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  FX_BOOL m_bIsSomMethod;
+  CFX_PtrArray* m_pArguments;
+};
+
+class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMDotAccessorExpression(FX_DWORD line,
+                               CXFA_FMSimpleExpression* pAccessor,
+                               XFA_FM_TOKEN op,
+                               CFX_WideStringC wsIdentifier,
+                               CXFA_FMSimpleExpression* pIndexExp);
+  ~CXFA_FMDotAccessorExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  CFX_WideStringC m_wsIdentifier;
+};
+
+class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
+ public:
+  CXFA_FMIndexExpression(FX_DWORD line,
+                         XFA_FM_AccessorIndex accessorIndex,
+                         CXFA_FMSimpleExpression* pIndexExp,
+                         FX_BOOL bIsStarIndex);
+  ~CXFA_FMIndexExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  XFA_FM_AccessorIndex m_accessorIndex;
+  FX_BOOL m_bIsStarIndex;
+};
+
+class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMDotDotAccessorExpression(FX_DWORD line,
+                                  CXFA_FMSimpleExpression* pAccessor,
+                                  XFA_FM_TOKEN op,
+                                  CFX_WideStringC wsIdentifier,
+                                  CXFA_FMSimpleExpression* pIndexExp);
+  ~CXFA_FMDotDotAccessorExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+
+ private:
+  CFX_WideStringC m_wsIdentifier;
+};
+
+class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
+ public:
+  CXFA_FMMethodCallExpression(FX_DWORD line,
+                              CXFA_FMSimpleExpression* pAccessorExp1,
+                              CXFA_FMSimpleExpression* pCallExp);
+  ~CXFA_FMMethodCallExpression() override {}
+  void ToJavaScript(CFX_WideTextBuf& javascript) override;
+};
+
+#endif  // XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
diff --git a/xfa/fxfa/parser/xfa_basic_data.cpp b/xfa/fxfa/parser/xfa_basic_data.cpp
new file mode 100644
index 0000000..58e71de
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_basic_data.cpp
@@ -0,0 +1,7333 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_basic_data.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_script_datawindow.h"
+#include "xfa/fxfa/parser/xfa_script_eventpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_hostpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_layoutpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_logpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[] = {
+    {0x2a, L"*", XFA_ATTRIBUTEENUM_Asterisk},
+    {0x2f, L"/", XFA_ATTRIBUTEENUM_Slash},
+    {0x5c, L"\\", XFA_ATTRIBUTEENUM_Backslash},
+    {0x239bd, L"on", XFA_ATTRIBUTEENUM_On},
+    {0x25356, L"tb", XFA_ATTRIBUTEENUM_Tb},
+    {0x25885, L"up", XFA_ATTRIBUTEENUM_Up},
+    {0x91b281, L"metaData", XFA_ATTRIBUTEENUM_MetaData},
+    {0x1f8dedb, L"delegate", XFA_ATTRIBUTEENUM_Delegate},
+    {0x2a6c55a, L"postSubmit", XFA_ATTRIBUTEENUM_PostSubmit},
+    {0x31b19c1, L"name", XFA_ATTRIBUTEENUM_Name},
+    {0x378a38a, L"cross", XFA_ATTRIBUTEENUM_Cross},
+    {0x3848b3f, L"next", XFA_ATTRIBUTEENUM_Next},
+    {0x48b6670, L"none", XFA_ATTRIBUTEENUM_None},
+    {0x51aafe5, L"shortEdge", XFA_ATTRIBUTEENUM_ShortEdge},
+    {0x55264c4, L"1mod10_1mod11", XFA_ATTRIBUTEENUM_1mod10_1mod11},
+    {0x5a5c519, L"height", XFA_ATTRIBUTEENUM_Height},
+    {0x89ce549, L"crossDiagonal", XFA_ATTRIBUTEENUM_CrossDiagonal},
+    {0x9f9d0f9, L"all", XFA_ATTRIBUTEENUM_All},
+    {0x9f9db48, L"any", XFA_ATTRIBUTEENUM_Any},
+    {0xa126261, L"toRight", XFA_ATTRIBUTEENUM_ToRight},
+    {0xa36de29, L"matchTemplate", XFA_ATTRIBUTEENUM_MatchTemplate},
+    {0xa48d040, L"dpl", XFA_ATTRIBUTEENUM_Dpl},
+    {0xa559c05, L"invisible", XFA_ATTRIBUTEENUM_Invisible},
+    {0xa7d48e3, L"fit", XFA_ATTRIBUTEENUM_Fit},
+    {0xa8a8f80, L"width", XFA_ATTRIBUTEENUM_Width},
+    {0xab466bb, L"preSubmit", XFA_ATTRIBUTEENUM_PreSubmit},
+    {0xacc5785, L"ipl", XFA_ATTRIBUTEENUM_Ipl},
+    {0xafab0f8, L"flateCompress", XFA_ATTRIBUTEENUM_FlateCompress},
+    {0xb355816, L"med", XFA_ATTRIBUTEENUM_Med},
+    {0xb69ef77, L"odd", XFA_ATTRIBUTEENUM_Odd},
+    {0xb69f9bb, L"off", XFA_ATTRIBUTEENUM_Off},
+    {0xb843dba, L"pdf", XFA_ATTRIBUTEENUM_Pdf},
+    {0xbb912b8, L"row", XFA_ATTRIBUTEENUM_Row},
+    {0xbedaf33, L"top", XFA_ATTRIBUTEENUM_Top},
+    {0xc56afcc, L"xdp", XFA_ATTRIBUTEENUM_Xdp},
+    {0xc56ba02, L"xfd", XFA_ATTRIBUTEENUM_Xfd},
+    {0xc56ddf1, L"xml", XFA_ATTRIBUTEENUM_Xml},
+    {0xc8b65f3, L"zip", XFA_ATTRIBUTEENUM_Zip},
+    {0xc8b89d6, L"zpl", XFA_ATTRIBUTEENUM_Zpl},
+    {0xf55d7ee, L"visible", XFA_ATTRIBUTEENUM_Visible},
+    {0xfe3596a, L"exclude", XFA_ATTRIBUTEENUM_Exclude},
+    {0x109d7ce7, L"mouseEnter", XFA_ATTRIBUTEENUM_MouseEnter},
+    {0x10f1bc0c, L"pair", XFA_ATTRIBUTEENUM_Pair},
+    {0x1154efe6, L"filter", XFA_ATTRIBUTEENUM_Filter},
+    {0x125bc94b, L"moveLast", XFA_ATTRIBUTEENUM_MoveLast},
+    {0x12e1f1f0, L"exportAndImport", XFA_ATTRIBUTEENUM_ExportAndImport},
+    {0x13000c60, L"push", XFA_ATTRIBUTEENUM_Push},
+    {0x138ee315, L"portrait", XFA_ATTRIBUTEENUM_Portrait},
+    {0x14da2125, L"default", XFA_ATTRIBUTEENUM_Default},
+    {0x157749a5, L"storedProc", XFA_ATTRIBUTEENUM_StoredProc},
+    {0x16641198, L"stayBOF", XFA_ATTRIBUTEENUM_StayBOF},
+    {0x16b2fc5b, L"stayEOF", XFA_ATTRIBUTEENUM_StayEOF},
+    {0x17fad373, L"postPrint", XFA_ATTRIBUTEENUM_PostPrint},
+    {0x193207d0, L"usCarrier", XFA_ATTRIBUTEENUM_UsCarrier},
+    {0x193ade3e, L"right", XFA_ATTRIBUTEENUM_Right},
+    {0x1bfc72d9, L"preOpen", XFA_ATTRIBUTEENUM_PreOpen},
+    {0x1cc9317a, L"actual", XFA_ATTRIBUTEENUM_Actual},
+    {0x1f31df1e, L"rest", XFA_ATTRIBUTEENUM_Rest},
+    {0x1fb1bf14, L"topCenter", XFA_ATTRIBUTEENUM_TopCenter},
+    {0x207de667, L"standardSymbol", XFA_ATTRIBUTEENUM_StandardSymbol},
+    {0x2196a452, L"initialize", XFA_ATTRIBUTEENUM_Initialize},
+    {0x23bd40c7, L"justifyAll", XFA_ATTRIBUTEENUM_JustifyAll},
+    {0x247cf3e9, L"normal", XFA_ATTRIBUTEENUM_Normal},
+    {0x25aa946b, L"landscape", XFA_ATTRIBUTEENUM_Landscape},
+    {0x2739b5c9, L"nonInteractive", XFA_ATTRIBUTEENUM_NonInteractive},
+    {0x27410f03, L"mouseExit", XFA_ATTRIBUTEENUM_MouseExit},
+    {0x2854e62c, L"minus", XFA_ATTRIBUTEENUM_Minus},
+    {0x287e936a, L"diagonalLeft", XFA_ATTRIBUTEENUM_DiagonalLeft},
+    {0x2972a98f, L"simplexPaginated", XFA_ATTRIBUTEENUM_SimplexPaginated},
+    {0x29d8225f, L"document", XFA_ATTRIBUTEENUM_Document},
+    {0x2a9d3016, L"warning", XFA_ATTRIBUTEENUM_Warning},
+    {0x2b35b6d9, L"auto", XFA_ATTRIBUTEENUM_Auto},
+    {0x2c1653d9, L"below", XFA_ATTRIBUTEENUM_Below},
+    {0x2c1f0540, L"bottomLeft", XFA_ATTRIBUTEENUM_BottomLeft},
+    {0x2c44e816, L"bottomCenter", XFA_ATTRIBUTEENUM_BottomCenter},
+    {0x2cd3e9f3, L"tcpl", XFA_ATTRIBUTEENUM_Tcpl},
+    {0x2d08af85, L"text", XFA_ATTRIBUTEENUM_Text},
+    {0x2dc478eb, L"grouping", XFA_ATTRIBUTEENUM_Grouping},
+    {0x2ef3afdd, L"secureSymbol", XFA_ATTRIBUTEENUM_SecureSymbol},
+    {0x2f2dd29a, L"preExecute", XFA_ATTRIBUTEENUM_PreExecute},
+    {0x33c43dec, L"docClose", XFA_ATTRIBUTEENUM_DocClose},
+    {0x33f25bb5, L"keyset", XFA_ATTRIBUTEENUM_Keyset},
+    {0x34e363da, L"vertical", XFA_ATTRIBUTEENUM_Vertical},
+    {0x361fa1b6, L"preSave", XFA_ATTRIBUTEENUM_PreSave},
+    {0x36f1c6d8, L"preSign", XFA_ATTRIBUTEENUM_PreSign},
+    {0x399f02b5, L"bottom", XFA_ATTRIBUTEENUM_Bottom},
+    {0x3b0ab096, L"toTop", XFA_ATTRIBUTEENUM_ToTop},
+    {0x3c752495, L"verify", XFA_ATTRIBUTEENUM_Verify},
+    {0x3ce05d68, L"first", XFA_ATTRIBUTEENUM_First},
+    {0x3ecead94, L"contentArea", XFA_ATTRIBUTEENUM_ContentArea},
+    {0x40623b5b, L"solid", XFA_ATTRIBUTEENUM_Solid},
+    {0x42c6cd8d, L"pessimistic", XFA_ATTRIBUTEENUM_Pessimistic},
+    {0x43ddc6bf, L"duplexPaginated", XFA_ATTRIBUTEENUM_DuplexPaginated},
+    {0x442f68c8, L"round", XFA_ATTRIBUTEENUM_Round},
+    {0x45efb847, L"remerge", XFA_ATTRIBUTEENUM_Remerge},
+    {0x46972265, L"ordered", XFA_ATTRIBUTEENUM_Ordered},
+    {0x46f95531, L"percent", XFA_ATTRIBUTEENUM_Percent},
+    {0x46fd25ae, L"even", XFA_ATTRIBUTEENUM_Even},
+    {0x4731d6ba, L"exit", XFA_ATTRIBUTEENUM_Exit},
+    {0x4977356b, L"toolTip", XFA_ATTRIBUTEENUM_ToolTip},
+    {0x49b980ee, L"orderedOccurrence", XFA_ATTRIBUTEENUM_OrderedOccurrence},
+    {0x4a7e2dfe, L"readOnly", XFA_ATTRIBUTEENUM_ReadOnly},
+    {0x4c4e8acb, L"currency", XFA_ATTRIBUTEENUM_Currency},
+    {0x4dcf25f8, L"concat", XFA_ATTRIBUTEENUM_Concat},
+    {0x4febb826, L"Thai", XFA_ATTRIBUTEENUM_Thai},
+    {0x50ef95b2, L"embossed", XFA_ATTRIBUTEENUM_Embossed},
+    {0x516e35ce, L"formdata", XFA_ATTRIBUTEENUM_Formdata},
+    {0x52fa6f0e, L"Greek", XFA_ATTRIBUTEENUM_Greek},
+    {0x54034c2f, L"decimal", XFA_ATTRIBUTEENUM_Decimal},
+    {0x542c7300, L"select", XFA_ATTRIBUTEENUM_Select},
+    {0x551f0ae5, L"longEdge", XFA_ATTRIBUTEENUM_LongEdge},
+    {0x55520a8a, L"protected", XFA_ATTRIBUTEENUM_Protected},
+    {0x559f76f3, L"bottomRight", XFA_ATTRIBUTEENUM_BottomRight},
+    {0x568cb500, L"zero", XFA_ATTRIBUTEENUM_Zero},
+    {0x56bcecb7, L"forwardOnly", XFA_ATTRIBUTEENUM_ForwardOnly},
+    {0x56bf456b, L"docReady", XFA_ATTRIBUTEENUM_DocReady},
+    {0x573cb40c, L"hidden", XFA_ATTRIBUTEENUM_Hidden},
+    {0x582e3424, L"include", XFA_ATTRIBUTEENUM_Include},
+    {0x58a3dd29, L"dashed", XFA_ATTRIBUTEENUM_Dashed},
+    {0x5955b22b, L"multiSelect", XFA_ATTRIBUTEENUM_MultiSelect},
+    {0x598d5c53, L"inactive", XFA_ATTRIBUTEENUM_Inactive},
+    {0x59c8f27d, L"embed", XFA_ATTRIBUTEENUM_Embed},
+    {0x5e7555e8, L"static", XFA_ATTRIBUTEENUM_Static},
+    {0x606d4def, L"onEntry", XFA_ATTRIBUTEENUM_OnEntry},
+    {0x6195eafb, L"Cyrillic", XFA_ATTRIBUTEENUM_Cyrillic},
+    {0x6491b0f3, L"nonBlank", XFA_ATTRIBUTEENUM_NonBlank},
+    {0x67bef031, L"topRight", XFA_ATTRIBUTEENUM_TopRight},
+    {0x67df5ebd, L"Hebrew", XFA_ATTRIBUTEENUM_Hebrew},
+    {0x6aea98be, L"topLeft", XFA_ATTRIBUTEENUM_TopLeft},
+    {0x6c51afc1, L"center", XFA_ATTRIBUTEENUM_Center},
+    {0x7145e6bf, L"moveFirst", XFA_ATTRIBUTEENUM_MoveFirst},
+    {0x7375465c, L"diamond", XFA_ATTRIBUTEENUM_Diamond},
+    {0x7461aef4, L"pageOdd", XFA_ATTRIBUTEENUM_PageOdd},
+    {0x75f8aeb2, L"1mod10", XFA_ATTRIBUTEENUM_1mod10},
+    {0x76d708e0, L"Korean", XFA_ATTRIBUTEENUM_Korean},
+    {0x789f14d7, L"aboveEmbedded", XFA_ATTRIBUTEENUM_AboveEmbedded},
+    {0x792ea39f, L"zipCompress", XFA_ATTRIBUTEENUM_ZipCompress},
+    {0x7a5b7193, L"numeric", XFA_ATTRIBUTEENUM_Numeric},
+    {0x7abec0d2, L"circle", XFA_ATTRIBUTEENUM_Circle},
+    {0x7afbba38, L"toBottom", XFA_ATTRIBUTEENUM_ToBottom},
+    {0x7b95e661, L"inverted", XFA_ATTRIBUTEENUM_Inverted},
+    {0x7baca2e3, L"update", XFA_ATTRIBUTEENUM_Update},
+    {0x7eb5da2c, L"isoname", XFA_ATTRIBUTEENUM_Isoname},
+    {0x7f6fd3d7, L"server", XFA_ATTRIBUTEENUM_Server},
+    {0x814f82b5, L"position", XFA_ATTRIBUTEENUM_Position},
+    {0x82deacf0, L"middleCenter", XFA_ATTRIBUTEENUM_MiddleCenter},
+    {0x83a49dc6, L"optional", XFA_ATTRIBUTEENUM_Optional},
+    {0x861a116f, L"usePrinterSetting", XFA_ATTRIBUTEENUM_UsePrinterSetting},
+    {0x86701ce0, L"outline", XFA_ATTRIBUTEENUM_Outline},
+    {0x8808385e, L"indexChange", XFA_ATTRIBUTEENUM_IndexChange},
+    {0x891f4606, L"change", XFA_ATTRIBUTEENUM_Change},
+    {0x89939f36, L"pageArea", XFA_ATTRIBUTEENUM_PageArea},
+    {0x8b5c3b25, L"once", XFA_ATTRIBUTEENUM_Once},
+    {0x8b5c6962, L"only", XFA_ATTRIBUTEENUM_Only},
+    {0x8b90e1f2, L"open", XFA_ATTRIBUTEENUM_Open},
+    {0x8bcfe96e, L"caption", XFA_ATTRIBUTEENUM_Caption},
+    {0x8ce83ef8, L"raised", XFA_ATTRIBUTEENUM_Raised},
+    {0x8d269cae, L"justify", XFA_ATTRIBUTEENUM_Justify},
+    {0x8fd520dc, L"refAndDescendants", XFA_ATTRIBUTEENUM_RefAndDescendants},
+    {0x9041d4b0, L"short", XFA_ATTRIBUTEENUM_Short},
+    {0x90c94426, L"pageFront", XFA_ATTRIBUTEENUM_PageFront},
+    {0x936beee5, L"monospace", XFA_ATTRIBUTEENUM_Monospace},
+    {0x947fa00f, L"middle", XFA_ATTRIBUTEENUM_Middle},
+    {0x9528a7b4, L"prePrint", XFA_ATTRIBUTEENUM_PrePrint},
+    {0x959ab231, L"always", XFA_ATTRIBUTEENUM_Always},
+    {0x96d61bf0, L"unknown", XFA_ATTRIBUTEENUM_Unknown},
+    {0x997194ee, L"toLeft", XFA_ATTRIBUTEENUM_ToLeft},
+    {0x9a83a3cd, L"above", XFA_ATTRIBUTEENUM_Above},
+    {0x9d0d71c7, L"dashDot", XFA_ATTRIBUTEENUM_DashDot},
+    {0x9df56f3e, L"gregorian", XFA_ATTRIBUTEENUM_Gregorian},
+    {0x9f6723fd, L"Roman", XFA_ATTRIBUTEENUM_Roman},
+    {0x9f693b21, L"mouseDown", XFA_ATTRIBUTEENUM_MouseDown},
+    {0xa1429b36, L"symbol", XFA_ATTRIBUTEENUM_Symbol},
+    {0xa5aa45cb, L"pageEven", XFA_ATTRIBUTEENUM_PageEven},
+    {0xa68635f1, L"sign", XFA_ATTRIBUTEENUM_Sign},
+    {0xa7315093, L"addNew", XFA_ATTRIBUTEENUM_AddNew},
+    {0xa7a773fa, L"star", XFA_ATTRIBUTEENUM_Star},
+    {0xa7d57b45, L"optimistic", XFA_ATTRIBUTEENUM_Optimistic},
+    {0xa8077321, L"rl-tb", XFA_ATTRIBUTEENUM_Rl_tb},
+    {0xa8f1468d, L"middleRight", XFA_ATTRIBUTEENUM_MiddleRight},
+    {0xaa84a1f1, L"maintain", XFA_ATTRIBUTEENUM_Maintain},
+    {0xab40b12c, L"package", XFA_ATTRIBUTEENUM_Package},
+    {0xac8b4d85, L"SimplifiedChinese", XFA_ATTRIBUTEENUM_SimplifiedChinese},
+    {0xadae6744, L"toCenter", XFA_ATTRIBUTEENUM_ToCenter},
+    {0xb0129df1, L"back", XFA_ATTRIBUTEENUM_Back},
+    {0xb0f088cf, L"unspecified", XFA_ATTRIBUTEENUM_Unspecified},
+    {0xb1271067, L"batchOptimistic", XFA_ATTRIBUTEENUM_BatchOptimistic},
+    {0xb18313a1, L"bold", XFA_ATTRIBUTEENUM_Bold},
+    {0xb1833cad, L"both", XFA_ATTRIBUTEENUM_Both},
+    {0xb221123f, L"butt", XFA_ATTRIBUTEENUM_Butt},
+    {0xb40c36bf, L"client", XFA_ATTRIBUTEENUM_Client},
+    {0xb56c7053, L"2mod10", XFA_ATTRIBUTEENUM_2mod10},
+    {0xb683a345, L"imageOnly", XFA_ATTRIBUTEENUM_ImageOnly},
+    {0xb7732dea, L"horizontal", XFA_ATTRIBUTEENUM_Horizontal},
+    {0xb88652a4, L"dotted", XFA_ATTRIBUTEENUM_Dotted},
+    {0xbb2f2880, L"userControl", XFA_ATTRIBUTEENUM_UserControl},
+    {0xbbb79c5d, L"diagonalRight", XFA_ATTRIBUTEENUM_DiagonalRight},
+    {0xbd077154, L"consumeData", XFA_ATTRIBUTEENUM_ConsumeData},
+    {0xbd3fb11e, L"check", XFA_ATTRIBUTEENUM_Check},
+    {0xbde9abda, L"data", XFA_ATTRIBUTEENUM_Data},
+    {0xbf5a02d8, L"down", XFA_ATTRIBUTEENUM_Down},
+    {0xbf7450ee, L"sansSerif", XFA_ATTRIBUTEENUM_SansSerif},
+    {0xc02d649f, L"inline", XFA_ATTRIBUTEENUM_Inline},
+    {0xc11a9e3a, L"TraditionalChinese", XFA_ATTRIBUTEENUM_TraditionalChinese},
+    {0xc16169d8, L"warn", XFA_ATTRIBUTEENUM_Warn},
+    {0xc16f071f, L"refOnly", XFA_ATTRIBUTEENUM_RefOnly},
+    {0xc27c8ba5, L"interactiveForms", XFA_ATTRIBUTEENUM_InteractiveForms},
+    {0xc2d1b15c, L"word", XFA_ATTRIBUTEENUM_Word},
+    {0xc3621288, L"unordered", XFA_ATTRIBUTEENUM_Unordered},
+    {0xc5251981, L"required", XFA_ATTRIBUTEENUM_Required},
+    {0xc7088e7d, L"importOnly", XFA_ATTRIBUTEENUM_ImportOnly},
+    {0xc72cf0e3, L"belowEmbedded", XFA_ATTRIBUTEENUM_BelowEmbedded},
+    {0xc819cf07, L"Japanese", XFA_ATTRIBUTEENUM_Japanese},
+    {0xcdce56b3, L"full", XFA_ATTRIBUTEENUM_Full},
+    {0xce0122e3, L"rl-row", XFA_ATTRIBUTEENUM_Rl_row},
+    {0xcf7d71f1, L"Vietnamese", XFA_ATTRIBUTEENUM_Vietnamese},
+    {0xcfde3e09, L"EastEuropeanRoman", XFA_ATTRIBUTEENUM_EastEuropeanRoman},
+    {0xd576d08e, L"mouseUp", XFA_ATTRIBUTEENUM_MouseUp},
+    {0xd7a92904, L"exportOnly", XFA_ATTRIBUTEENUM_ExportOnly},
+    {0xd8ed1467, L"clear", XFA_ATTRIBUTEENUM_Clear},
+    {0xd95657a6, L"click", XFA_ATTRIBUTEENUM_Click},
+    {0xd96c7de5, L"base64", XFA_ATTRIBUTEENUM_Base64},
+    {0xd9f47f36, L"close", XFA_ATTRIBUTEENUM_Close},
+    {0xdb075bde, L"host", XFA_ATTRIBUTEENUM_Host},
+    {0xdb103411, L"global", XFA_ATTRIBUTEENUM_Global},
+    {0xdb647188, L"blank", XFA_ATTRIBUTEENUM_Blank},
+    {0xdb9be968, L"table", XFA_ATTRIBUTEENUM_Table},
+    {0xdf590fbb, L"import", XFA_ATTRIBUTEENUM_Import},
+    {0xe0e573fb, L"custom", XFA_ATTRIBUTEENUM_Custom},
+    {0xe0ecc79a, L"middleLeft", XFA_ATTRIBUTEENUM_MiddleLeft},
+    {0xe1452019, L"postExecute", XFA_ATTRIBUTEENUM_PostExecute},
+    {0xe1911d98, L"radix", XFA_ATTRIBUTEENUM_Radix},
+    {0xe25fa7b8, L"postOpen", XFA_ATTRIBUTEENUM_PostOpen},
+    {0xe28dce7e, L"enter", XFA_ATTRIBUTEENUM_Enter},
+    {0xe2c44de4, L"ignore", XFA_ATTRIBUTEENUM_Ignore},
+    {0xe2cd8c61, L"lr-tb", XFA_ATTRIBUTEENUM_Lr_tb},
+    {0xe2da8336, L"fantasy", XFA_ATTRIBUTEENUM_Fantasy},
+    {0xe31d5396, L"italic", XFA_ATTRIBUTEENUM_Italic},
+    {0xe7ada113, L"author", XFA_ATTRIBUTEENUM_Author},
+    {0xe8e7cc18, L"toEdge", XFA_ATTRIBUTEENUM_ToEdge},
+    {0xe97aa98b, L"choice", XFA_ATTRIBUTEENUM_Choice},
+    {0xeafd2a38, L"disabled", XFA_ATTRIBUTEENUM_Disabled},
+    {0xeb2b7972, L"crossHatch", XFA_ATTRIBUTEENUM_CrossHatch},
+    {0xeb2db2d7, L"dataRef", XFA_ATTRIBUTEENUM_DataRef},
+    {0xec35dc6e, L"dashDotDot", XFA_ATTRIBUTEENUM_DashDotDot},
+    {0xef85d351, L"square", XFA_ATTRIBUTEENUM_Square},
+    {0xf2102445, L"dynamic", XFA_ATTRIBUTEENUM_Dynamic},
+    {0xf272c7be, L"manual", XFA_ATTRIBUTEENUM_Manual},
+    {0xf2bbb64d, L"etched", XFA_ATTRIBUTEENUM_Etched},
+    {0xf3b8fc6c, L"validationState", XFA_ATTRIBUTEENUM_ValidationState},
+    {0xf42f2b81, L"cursive", XFA_ATTRIBUTEENUM_Cursive},
+    {0xf54481d4, L"last", XFA_ATTRIBUTEENUM_Last},
+    {0xf5ad782b, L"left", XFA_ATTRIBUTEENUM_Left},
+    {0xf616da2e, L"link", XFA_ATTRIBUTEENUM_Link},
+    {0xf6b4afb0, L"long", XFA_ATTRIBUTEENUM_Long},
+    {0xf8636460, L"internationalCarrier",
+     XFA_ATTRIBUTEENUM_InternationalCarrier},
+    {0xf9fb37ac, L"PDF1.3", XFA_ATTRIBUTEENUM_PDF1_3},
+    {0xf9fb37af, L"PDF1.6", XFA_ATTRIBUTEENUM_PDF1_6},
+    {0xfbce7f19, L"serif", XFA_ATTRIBUTEENUM_Serif},
+    {0xfc82d695, L"postSave", XFA_ATTRIBUTEENUM_PostSave},
+    {0xfcef86b5, L"ready", XFA_ATTRIBUTEENUM_Ready},
+    {0xfd54fbb7, L"postSign", XFA_ATTRIBUTEENUM_PostSign},
+    {0xfdc0aae2, L"Arabic", XFA_ATTRIBUTEENUM_Arabic},
+    {0xfe06d2ca, L"error", XFA_ATTRIBUTEENUM_Error},
+    {0xfefc4885, L"urlencoded", XFA_ATTRIBUTEENUM_Urlencoded},
+    {0xff795ad2, L"lowered", XFA_ATTRIBUTEENUM_Lowered},
+};
+const int32_t g_iXFAEnumCount =
+    sizeof(g_XFAEnumData) / sizeof(XFA_ATTRIBUTEENUMINFO);
+static const CXFA_Measurement g_XFAMeasurementData[] = {
+    CXFA_Measurement(0, XFA_UNIT_In),
+    CXFA_Measurement(0, XFA_UNIT_Pt),
+    CXFA_Measurement(5, XFA_UNIT_Mm),
+    CXFA_Measurement(0.25, XFA_UNIT_Mm),
+    CXFA_Measurement(-1, XFA_UNIT_Unknown),
+    CXFA_Measurement(0, XFA_UNIT_Angle),
+    CXFA_Measurement(10, XFA_UNIT_Pt),
+    CXFA_Measurement(360, XFA_UNIT_Angle),
+    CXFA_Measurement(0.5, XFA_UNIT_Pt),
+};
+const XFA_ATTRIBUTEINFO g_XFAAttributeData[] = {
+    {0x68, L"h", XFA_ATTRIBUTE_H, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x77, L"w", XFA_ATTRIBUTE_W, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x78, L"x", XFA_ATTRIBUTE_X, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x79, L"y", XFA_ATTRIBUTE_Y, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x21aed, L"id", XFA_ATTRIBUTE_Id, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x25363, L"to", XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Config, (void*)NULL},
+    {0xcb0ac9, L"lineThrough", XFA_ATTRIBUTE_LineThrough,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x2282c73, L"hAlign", XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Left},
+    {0x2c1c7f1, L"typeface", XFA_ATTRIBUTE_Typeface, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"Courier"},
+    {0x3106c3a, L"beforeTarget", XFA_ATTRIBUTE_BeforeTarget,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x31b19c1, L"name", XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
+         XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x3848b3f, L"next", XFA_ATTRIBUTE_Next, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {0x43e349b, L"dataRowCount", XFA_ATTRIBUTE_DataRowCount,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x5518c25, L"break", XFA_ATTRIBUTE_Break, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Close},
+    {0x5ce6195, L"vScrollPolicy", XFA_ATTRIBUTE_VScrollPolicy,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0x8c74ae9, L"fontHorizontalScale", XFA_ATTRIBUTE_FontHorizontalScale,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"100%"},
+    {0x8d4f1c7, L"textIndent", XFA_ATTRIBUTE_TextIndent,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x97c1c65, L"context", XFA_ATTRIBUTE_Context, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_UNKNOWN, (void*)0},
+    {0x9876578, L"trayOut", XFA_ATTRIBUTE_TrayOut, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xa2e3514, L"cap", XFA_ATTRIBUTE_Cap, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Square},
+    {0xb3543a6, L"max", XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xb356ca4, L"min", XFA_ATTRIBUTE_Min, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
+    {0xbb8df5d, L"ref", XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_Template |
+         XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xbb8f3df, L"rid", XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xc080cd3, L"url", XFA_ATTRIBUTE_Url, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xc0811ed, L"use", XFA_ATTRIBUTE_Use, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xcfea02e, L"leftInset", XFA_ATTRIBUTE_LeftInset,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x1026c59d, L"widows", XFA_ATTRIBUTE_Widows, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x1059ec18, L"level", XFA_ATTRIBUTE_Level, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Config, (void*)0},
+    {0x1356caf8, L"bottomInset", XFA_ATTRIBUTE_BottomInset,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x13a08bdb, L"overflowTarget", XFA_ATTRIBUTE_OverflowTarget,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x1414d431, L"allowMacro", XFA_ATTRIBUTE_AllowMacro,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x14a32d52, L"pagePosition", XFA_ATTRIBUTE_PagePosition,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Any},
+    {0x1517dfa1, L"columnWidths", XFA_ATTRIBUTE_ColumnWidths,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x169134a1, L"overflowLeader", XFA_ATTRIBUTE_OverflowLeader,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x1b8dce3e, L"action", XFA_ATTRIBUTE_Action, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Include},
+    {0x1e459b8f, L"nonRepudiation", XFA_ATTRIBUTE_NonRepudiation,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x1ec8ab2c, L"rate", XFA_ATTRIBUTE_Rate, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)50},
+    {0x1ef3a64a, L"allowRichText", XFA_ATTRIBUTE_AllowRichText,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x2038c9b2, L"role", XFA_ATTRIBUTE_Role, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x20914367, L"overflowTrailer", XFA_ATTRIBUTE_OverflowTrailer,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x226ca8f1, L"operation", XFA_ATTRIBUTE_Operation,
+     XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x24d85167, L"timeout", XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_SourceSet, (void*)NULL},
+    {0x25764436, L"topInset", XFA_ATTRIBUTE_TopInset, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x25839852, L"access", XFA_ATTRIBUTE_Access, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Open},
+    {0x268b7ec1, L"commandType", XFA_ATTRIBUTE_CommandType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
+     (void*)XFA_ATTRIBUTEENUM_Unknown},
+    {0x28dee6e9, L"format", XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x28e17e91, L"dataPrep", XFA_ATTRIBUTE_DataPrep, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {0x292b88fe, L"widgetData", XFA_ATTRIBUTE_WidgetData,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
+    {0x29418bb7, L"abbr", XFA_ATTRIBUTE_Abbr, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_LocaleSet, (void*)0},
+    {0x2a82d99c, L"marginRight", XFA_ATTRIBUTE_MarginRight,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x2b5df51e, L"dataDescription", XFA_ATTRIBUTE_DataDescription,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_ConnectionSet, (void*)NULL},
+    {0x2bb3f470, L"encipherOnly", XFA_ATTRIBUTE_EncipherOnly,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x2cd79033, L"kerningMode", XFA_ATTRIBUTE_KerningMode,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {0x2ee7678f, L"rotate", XFA_ATTRIBUTE_Rotate, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 5)},
+    {0x2f105f72, L"wordCharacterCount", XFA_ATTRIBUTE_WordCharacterCount,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)7},
+    {0x2f16a382, L"type", XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x34ae103c, L"reserve", XFA_ATTRIBUTE_Reserve, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 4)},
+    {0x3650557e, L"textLocation", XFA_ATTRIBUTE_TextLocation,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Below},
+    {0x39cdb0a2, L"priority", XFA_ATTRIBUTE_Priority, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Custom},
+    {0x3a0273a6, L"underline", XFA_ATTRIBUTE_Underline,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x3b582286, L"moduleWidth", XFA_ATTRIBUTE_ModuleWidth,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 3)},
+    {0x3d123c26, L"hyphenate", XFA_ATTRIBUTE_Hyphenate,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x3e7af94f, L"listen", XFA_ATTRIBUTE_Listen, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_RefOnly},
+    {0x4156ee3f, L"delimiter", XFA_ATTRIBUTE_Delimiter, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x42fed1fd, L"contentType", XFA_ATTRIBUTE_ContentType,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
+                                  XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x453eaf38, L"startNew", XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x45a6daf8, L"eofAction", XFA_ATTRIBUTE_EofAction, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_MoveLast},
+    {0x47cfa43a, L"allowNeutral", XFA_ATTRIBUTE_AllowNeutral,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x47d03490, L"connection", XFA_ATTRIBUTE_Connection,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x4873c601, L"baselineShift", XFA_ATTRIBUTE_BaselineShift,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x4b319767, L"overlinePeriod", XFA_ATTRIBUTE_OverlinePeriod,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_All},
+    {0x4b8bc840, L"fracDigits", XFA_ATTRIBUTE_FracDigits,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)2},
+    {0x4ef3d02c, L"orientation", XFA_ATTRIBUTE_Orientation,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Portrait},
+    {0x4fdc3454, L"timeStamp", XFA_ATTRIBUTE_TimeStamp, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_XDP, (void*)NULL},
+    {0x52666f1c, L"printCheckDigit", XFA_ATTRIBUTE_PrintCheckDigit,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x534729c9, L"marginLeft", XFA_ATTRIBUTE_MarginLeft,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x5392ea58, L"stroke", XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Solid},
+    {0x5404d6df, L"moduleHeight", XFA_ATTRIBUTE_ModuleHeight,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 2)},
+    {0x54fa722c, L"transferEncoding", XFA_ATTRIBUTE_TransferEncoding,
+     XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x552d9ad5, L"usage", XFA_ATTRIBUTE_Usage, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_ExportAndImport},
+    {0x570ce835, L"presence", XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Visible},
+    {0x5739d1ff, L"radixOffset", XFA_ATTRIBUTE_RadixOffset,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x577682ac, L"preserve", XFA_ATTRIBUTE_Preserve, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x58be2870, L"aliasNode", XFA_ATTRIBUTE_AliasNode,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
+    {0x5a32e493, L"multiLine", XFA_ATTRIBUTE_MultiLine,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x5a50e9e6, L"version", XFA_ATTRIBUTE_Version, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x5ab23b6c, L"startChar", XFA_ATTRIBUTE_StartChar, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x5b707a35, L"scriptTest", XFA_ATTRIBUTE_ScriptTest,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Error},
+    {0x5c054755, L"startAngle", XFA_ATTRIBUTE_StartAngle,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 5)},
+    {0x5ec958c0, L"cursorType", XFA_ATTRIBUTE_CursorType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
+     (void*)XFA_ATTRIBUTEENUM_ForwardOnly},
+    {0x5f760b50, L"digitalSignature", XFA_ATTRIBUTE_DigitalSignature,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x60a61edd, L"codeType", XFA_ATTRIBUTE_CodeType, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x60d4c8b1, L"output", XFA_ATTRIBUTE_Output, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_ConnectionSet, (void*)NULL},
+    {0x64110ab5, L"bookendTrailer", XFA_ATTRIBUTE_BookendTrailer,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x65e30c67, L"imagingBBox", XFA_ATTRIBUTE_ImagingBBox,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"none"},
+    {0x66539c48, L"excludeInitialCap", XFA_ATTRIBUTE_ExcludeInitialCap,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x66642f8f, L"force", XFA_ATTRIBUTE_Force, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Config, (void*)NULL},
+    {0x69aa2292, L"crlSign", XFA_ATTRIBUTE_CrlSign, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x6a3405dd, L"previous", XFA_ATTRIBUTE_Previous, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {0x6a95c976, L"pushCharacterCount", XFA_ATTRIBUTE_PushCharacterCount,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)3},
+    {0x6b6ddcfb, L"nullTest", XFA_ATTRIBUTE_NullTest, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Disabled},
+    {0x6cfa828a, L"runAt", XFA_ATTRIBUTE_RunAt, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Client},
+    {0x731e0665, L"spaceBelow", XFA_ATTRIBUTE_SpaceBelow,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x74788f8b, L"sweepAngle", XFA_ATTRIBUTE_SweepAngle,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 7)},
+    {0x78bff531, L"numberOfCells", XFA_ATTRIBUTE_NumberOfCells,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0x79543055, L"letterSpacing", XFA_ATTRIBUTE_LetterSpacing,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x79975f2b, L"lockType", XFA_ATTRIBUTE_LockType, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_ReadOnly},
+    {0x7a0cc471, L"passwordChar", XFA_ATTRIBUTE_PasswordChar,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"*"},
+    {0x7a7cc341, L"vAlign", XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Top},
+    {0x7b29630a, L"sourceBelow", XFA_ATTRIBUTE_SourceBelow,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
+     (void*)XFA_ATTRIBUTEENUM_Update},
+    {0x7b95e661, L"inverted", XFA_ATTRIBUTE_Inverted, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x7c2fd80b, L"mark", XFA_ATTRIBUTE_Mark, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Default},
+    {0x7c2ff6ae, L"maxH", XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x7c2ff6bd, L"maxW", XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x7c732a66, L"truncate", XFA_ATTRIBUTE_Truncate, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x7d02356c, L"minH", XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x7d02357b, L"minW", XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x7d0b5fca, L"initial", XFA_ATTRIBUTE_Initial, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
+    {0x7d9fd7c5, L"mode", XFA_ATTRIBUTE_Mode, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Config, (void*)XFA_ATTRIBUTEENUM_UsePrinterSetting},
+    {0x7e7e845e, L"layout", XFA_ATTRIBUTE_Layout, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Position},
+    {0x7f6fd3d7, L"server", XFA_ATTRIBUTE_Server, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x824f21b7, L"embedPDF", XFA_ATTRIBUTE_EmbedPDF, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x8340ea66, L"oddOrEven", XFA_ATTRIBUTE_OddOrEven, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Any},
+    {0x836d4d7c, L"tabDefault", XFA_ATTRIBUTE_TabDefault,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x8855805f, L"contains", XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Datasets, (void*)XFA_ATTRIBUTEENUM_Data},
+    {0x8a692521, L"rightInset", XFA_ATTRIBUTE_RightInset,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x8af2e657, L"maxChars", XFA_ATTRIBUTE_MaxChars, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x8b90e1f2, L"open", XFA_ATTRIBUTE_Open, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_UserControl},
+    {0x8c99377e, L"relation", XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x8d181d61, L"wideNarrowRatio", XFA_ATTRIBUTE_WideNarrowRatio,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"3:1"},
+    {0x8e1c2921, L"relevant", XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x8e29d794, L"signatureType", XFA_ATTRIBUTE_SignatureType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Filter},
+    {0x8ec6204c, L"lineThroughPeriod", XFA_ATTRIBUTE_LineThroughPeriod,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_All},
+    {0x8ed182d1, L"shape", XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Square},
+    {0x8fa01790, L"tabStops", XFA_ATTRIBUTE_TabStops, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0x8fc36c0a, L"outputBelow", XFA_ATTRIBUTE_OutputBelow,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
+     (void*)XFA_ATTRIBUTEENUM_Warn},
+    {0x9041d4b0, L"short", XFA_ATTRIBUTE_Short, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0x907c7719, L"fontVerticalScale", XFA_ATTRIBUTE_FontVerticalScale,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"100%"},
+    {0x94446dcc, L"thickness", XFA_ATTRIBUTE_Thickness,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 8)},
+    {0x957fa006, L"commitOn", XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Select},
+    {0x982bd892, L"remainCharacterCount", XFA_ATTRIBUTE_RemainCharacterCount,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)3},
+    {0x98fd4d81, L"keyAgreement", XFA_ATTRIBUTE_KeyAgreement,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x99800d7a, L"errorCorrectionLevel", XFA_ATTRIBUTE_ErrorCorrectionLevel,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0x9a63da3d, L"upsMode", XFA_ATTRIBUTE_UpsMode, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_UsCarrier},
+    {0x9cc17d75, L"mergeMode", XFA_ATTRIBUTE_MergeMode, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_ConsumeData},
+    {0x9d833d75, L"circular", XFA_ATTRIBUTE_Circular, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0x9d8ee204, L"psName", XFA_ATTRIBUTE_PsName, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Config, (void*)NULL},
+    {0x9dcc3ab3, L"trailer", XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xa0933954, L"unicodeRange", XFA_ATTRIBUTE_UnicodeRange,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config, (void*)NULL},
+    {0xa1b0d2f5, L"executeType", XFA_ATTRIBUTE_ExecuteType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Import},
+    {0xa25a883d, L"duplexImposition", XFA_ATTRIBUTE_DuplexImposition,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_LongEdge},
+    {0xa42ca1b7, L"trayIn", XFA_ATTRIBUTE_TrayIn, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xa433f001, L"bindingNode", XFA_ATTRIBUTE_BindingNode,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
+    {0xa5340ff5, L"bofAction", XFA_ATTRIBUTE_BofAction, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_MoveFirst},
+    {0xa5b410cf, L"save", XFA_ATTRIBUTE_Save, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0xa6118c89, L"targetType", XFA_ATTRIBUTE_TargetType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xa66404cb, L"keyEncipherment", XFA_ATTRIBUTE_KeyEncipherment,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xa6710262, L"credentialServerPolicy",
+     XFA_ATTRIBUTE_CredentialServerPolicy, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {0xa686975b, L"size", XFA_ATTRIBUTE_Size, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 6)},
+    {0xa85e74f3, L"initialNumber", XFA_ATTRIBUTE_InitialNumber,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)1},
+    {0xabef37e3, L"slope", XFA_ATTRIBUTE_Slope, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Backslash},
+    {0xabfa6c4f, L"cSpace", XFA_ATTRIBUTE_CSpace, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)L"SRGB"},
+    {0xac06e2b0, L"colSpan", XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
+    {0xadc4c77b, L"binding", XFA_ATTRIBUTE_Binding, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xaf754613, L"checksum", XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xb045fbc5, L"charEncoding", XFA_ATTRIBUTE_CharEncoding,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)L"UTF-8"},
+    {0xb0e5485d, L"bind", XFA_ATTRIBUTE_Bind, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet, (void*)NULL},
+    {0xb12128b7, L"textEntry", XFA_ATTRIBUTE_TextEntry,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0xb373a862, L"archive", XFA_ATTRIBUTE_Archive, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xb598a1f7, L"uuid", XFA_ATTRIBUTE_Uuid, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_XDP, (void*)NULL},
+    {0xb5e49bf2, L"posture", XFA_ATTRIBUTE_Posture, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Normal},
+    {0xb6b44172, L"after", XFA_ATTRIBUTE_After, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xb716467b, L"orphans", XFA_ATTRIBUTE_Orphans, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0xbc0c4695, L"qualifiedName", XFA_ATTRIBUTE_QualifiedName,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_UNKNOWN, (void*)NULL},
+    {0xbc254332, L"usehref", XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xbc8fa350, L"locale", XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xbd6e1d88, L"weight", XFA_ATTRIBUTE_Weight, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Normal},
+    {0xbd96a0e9, L"underlinePeriod", XFA_ATTRIBUTE_UnderlinePeriod,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_All},
+    {0xbde9abda, L"data", XFA_ATTRIBUTE_Data, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Link},
+    {0xbe52dfbf, L"desc", XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, (void*)NULL},
+    {0xbe9ba472, L"numbered", XFA_ATTRIBUTE_Numbered, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
+    {0xc035c6b1, L"dataColumnCount", XFA_ATTRIBUTE_DataColumnCount,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xc0ec9fa4, L"overline", XFA_ATTRIBUTE_Overline, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0xc2ba0923, L"urlPolicy", XFA_ATTRIBUTE_UrlPolicy, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xc2bd40fd, L"anchorType", XFA_ATTRIBUTE_AnchorType,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_TopLeft},
+    {0xc39a88bd, L"labelRef", XFA_ATTRIBUTE_LabelRef, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xc3c1442f, L"bookendLeader", XFA_ATTRIBUTE_BookendLeader,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xc4547a08, L"maxLength", XFA_ATTRIBUTE_MaxLength,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*) - 1},
+    {0xc4fed09b, L"accessKey", XFA_ATTRIBUTE_AccessKey, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xc5762157, L"cursorLocation", XFA_ATTRIBUTE_CursorLocation,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
+     (void*)XFA_ATTRIBUTEENUM_Client},
+    {0xc860f30a, L"delayedOpen", XFA_ATTRIBUTE_DelayedOpen,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet, (void*)NULL},
+    {0xc8da4da7, L"target", XFA_ATTRIBUTE_Target, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xca5dc27c, L"dataEncipherment", XFA_ATTRIBUTE_DataEncipherment,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xcb150479, L"afterTarget", XFA_ATTRIBUTE_AfterTarget,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xcbcaf66d, L"leader", XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xcca7897e, L"picker", XFA_ATTRIBUTE_Picker, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Host},
+    {0xcd7f7b54, L"from", XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config, (void*)NULL},
+    {0xcea5e62c, L"baseProfile", XFA_ATTRIBUTE_BaseProfile,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Full},
+    {0xd171b240, L"aspect", XFA_ATTRIBUTE_Aspect, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Fit},
+    {0xd3c84d25, L"rowColumnRatio", XFA_ATTRIBUTE_RowColumnRatio,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xd4b01921, L"lineHeight", XFA_ATTRIBUTE_LineHeight,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 1)},
+    {0xd4cc53f8, L"highlight", XFA_ATTRIBUTE_Highlight, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Inverted},
+    {0xd50f903a, L"valueRef", XFA_ATTRIBUTE_ValueRef, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xd52482e0, L"maxEntries", XFA_ATTRIBUTE_MaxEntries,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Config, (void*)5},
+    {0xd57c513c, L"dataLength", XFA_ATTRIBUTE_DataLength,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xd6128d8d, L"activity", XFA_ATTRIBUTE_Activity, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Click},
+    {0xd6a39990, L"input", XFA_ATTRIBUTE_Input, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_ConnectionSet, (void*)NULL},
+    {0xd6e27f1d, L"value", XFA_ATTRIBUTE_Value, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
+         XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xd70798c2, L"blankOrNotBlank", XFA_ATTRIBUTE_BlankOrNotBlank,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Any},
+    {0xd861f8af, L"addRevocationInfo", XFA_ATTRIBUTE_AddRevocationInfo,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xd8f982bf, L"genericFamily", XFA_ATTRIBUTE_GenericFamily,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
+     (void*)XFA_ATTRIBUTEENUM_Serif},
+    {0xd996fa9b, L"hand", XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Even},
+    {0xdb55fec5, L"href", XFA_ATTRIBUTE_Href, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xdc75676c, L"textEncoding", XFA_ATTRIBUTE_TextEncoding,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xde7f92ba, L"leadDigits", XFA_ATTRIBUTE_LeadDigits,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*) - 1},
+    {0xe11a2cbc, L"permissions", XFA_ATTRIBUTE_Permissions,
+     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)2},
+    {0xe18b5659, L"spaceAbove", XFA_ATTRIBUTE_SpaceAbove,
+     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0xe1a26b56, L"codeBase", XFA_ATTRIBUTE_CodeBase, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xe349d044, L"stock", XFA_ATTRIBUTE_Stock, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xe372ae97, L"isNull", XFA_ATTRIBUTE_IsNull, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Datasets, (void*)0},
+    {0xe4c3a5e5, L"restoreState", XFA_ATTRIBUTE_RestoreState,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Manual},
+    {0xe5c96d6a, L"excludeAllCaps", XFA_ATTRIBUTE_ExcludeAllCaps,
+     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)0},
+    {0xe64b1129, L"formatTest", XFA_ATTRIBUTE_FormatTest,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Warning},
+    {0xe6f99487, L"hScrollPolicy", XFA_ATTRIBUTE_HScrollPolicy,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xe8dddf50, L"join", XFA_ATTRIBUTE_Join, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Square},
+    {0xe8f118a8, L"keyCertSign", XFA_ATTRIBUTE_KeyCertSign,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xe948b9a8, L"radius", XFA_ATTRIBUTE_Radius, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0xe996b2fe, L"sourceAbove", XFA_ATTRIBUTE_SourceAbove,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
+     (void*)XFA_ATTRIBUTEENUM_Warn},
+    {0xea7090a0, L"override", XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xeb091003, L"classId", XFA_ATTRIBUTE_ClassId, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xeb511b54, L"disable", XFA_ATTRIBUTE_Disable, XFA_ATTRIBUTETYPE_Boolean,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
+    {0xeda9017a, L"scope", XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_NOTSURE,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xf197844d, L"match", XFA_ATTRIBUTE_Match, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Once},
+    {0xf2009339, L"placement", XFA_ATTRIBUTE_Placement, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Left},
+    {0xf4ffce73, L"before", XFA_ATTRIBUTE_Before, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_Auto},
+    {0xf531b059, L"writingScript", XFA_ATTRIBUTE_WritingScript,
+     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
+     (void*)XFA_ATTRIBUTEENUM_Asterisk},
+    {0xf575ca75, L"endChar", XFA_ATTRIBUTE_EndChar, XFA_ATTRIBUTETYPE_Cdata,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
+    {0xf6b47749, L"lock", XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTETYPE_Integer,
+     XFA_XDPPACKET_Config, (void*)0},
+    {0xf6b4afb0, L"long", XFA_ATTRIBUTE_Long, XFA_ATTRIBUTETYPE_Measure,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)(g_XFAMeasurementData + 0)},
+    {0xf6b59543, L"intact", XFA_ATTRIBUTE_Intact, XFA_ATTRIBUTETYPE_Enum,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {0xf889e747, L"xdpContent", XFA_ATTRIBUTE_XdpContent,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+    {0xfea53ec6, L"decipherOnly", XFA_ATTRIBUTE_DecipherOnly,
+     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     (void*)NULL},
+};
+const int32_t g_iXFAAttributeCount =
+    sizeof(g_XFAAttributeData) / sizeof(XFA_ATTRIBUTEINFO);
+const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[] = {
+    {XFA_ELEMENT_SubformSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Ordered},
+    {XFA_ELEMENT_NumberPattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Numeric},
+    {XFA_ELEMENT_KeyUsage, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_LabelPrinter, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Zpl},
+    {XFA_ELEMENT_CalendarSymbols, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Gregorian},
+    {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {XFA_ELEMENT_TimePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Med},
+    {XFA_ELEMENT_BatchOutput, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {XFA_ELEMENT_SubjectDNs, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Issuers, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_EncryptionMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Pattern, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_CrossHatch},
+    {XFA_ELEMENT_Compress, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_ImageOnly},
+    {XFA_ELEMENT_Image, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Base64},
+    {XFA_ELEMENT_TimeStamp, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Subform, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Name},
+    {XFA_ELEMENT_Handler, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Record, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer,
+     (void*)0},
+    {XFA_ELEMENT_Command, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer,
+     (void*)30},
+    {XFA_ELEMENT_DigestMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_PageSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_OrderedOccurrence},
+    {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_Traverse, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Next},
+    {XFA_ELEMENT_Encodings, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Signing, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Oids, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Signature, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_PDF1_3},
+    {XFA_ELEMENT_ExData, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {XFA_ELEMENT_Linear, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_ToRight},
+    {XFA_ELEMENT_CurrencySymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Symbol},
+    {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_SignData, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Sign},
+    {XFA_ELEMENT_DatePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Med},
+    {XFA_ELEMENT_Bind, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_None},
+    {XFA_ELEMENT_Reasons, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_AppearanceFilter, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Form, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Cdata,
+     (void*)NULL},
+    {XFA_ELEMENT_Value, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Boolean,
+     (void*)0},
+    {XFA_ELEMENT_Calculate, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Error},
+    {XFA_ELEMENT_Connect, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer,
+     (void*)15},
+    {XFA_ELEMENT_Submit, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Xdp},
+    {XFA_ELEMENT_Radial, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_ToEdge},
+    {XFA_ELEMENT_LockDocument, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Optional},
+    {XFA_ELEMENT_Occur, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer, (void*)1},
+    {XFA_ELEMENT_NumberSymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
+     (void*)XFA_ATTRIBUTEENUM_Decimal},
+};
+const int32_t g_iXFANotsureCount =
+    sizeof(g_XFANotsureAttributes) / sizeof(XFA_NOTSUREATTRIBUTE);
+const XFA_ELEMENTINFO g_XFAElementData[] = {
+    {0x23ee3, L"ps", XFA_ELEMENT_Ps, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
+    {0x25363, L"to", XFA_ELEMENT_To, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x2587e, L"ui", XFA_ELEMENT_Ui,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x1c648b, L"recordSet", XFA_ELEMENT_RecordSet, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_Node},
+    {0x171428f, L"subsetBelow", XFA_ELEMENT_SubsetBelow, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x1a0776a, L"subformSet", XFA_ELEMENT_SubformSet,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x2340d70, L"adobeExtensionLevel", XFA_ELEMENT_AdobeExtensionLevel,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x2c1c7f1, L"typeface", XFA_ELEMENT_Typeface, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_Node},
+    {0x5518c25, L"break", XFA_ELEMENT_Break,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x5fff523, L"fontInfo", XFA_ELEMENT_FontInfo, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x653a227, L"numberPattern", XFA_ELEMENT_NumberPattern,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0x65b4a05, L"dynamicRender", XFA_ELEMENT_DynamicRender,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x7e4362e, L"printScaling", XFA_ELEMENT_PrintScaling, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x7fe6d3a, L"checkButton", XFA_ELEMENT_CheckButton,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x80cf58f, L"datePatterns", XFA_ELEMENT_DatePatterns,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0x811929d, L"sourceSet", XFA_ELEMENT_SourceSet, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_ModelNode},
+    {0x9f9d612, L"amd", XFA_ELEMENT_Amd, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x9f9efb6, L"arc", XFA_ELEMENT_Arc,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xa48835e, L"day", XFA_ELEMENT_Day, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xa6328b8, L"era", XFA_ELEMENT_Era, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xae6a0a0, L"jog", XFA_ELEMENT_Jog, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xb1b3d22, L"log", XFA_ELEMENT_Log, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xb35439e, L"map", XFA_ELEMENT_Map,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node},
+    {0xb355301, L"mdp", XFA_ELEMENT_Mdp,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xb420438, L"breakBefore", XFA_ELEMENT_BreakBefore,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xb6a091c, L"oid", XFA_ELEMENT_Oid,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0xb84389f, L"pcl", XFA_ELEMENT_Pcl, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xb843dba, L"pdf", XFA_ELEMENT_Pdf, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xbb8df5d, L"ref", XFA_ELEMENT_Ref,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0xc080cd0, L"uri", XFA_ELEMENT_Uri,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_ConnectionSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0xc56afbf, L"xdc", XFA_ELEMENT_Xdc,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Xdc, XFA_OBJECTTYPE_ModelNode},
+    {0xc56afcc, L"xdp", XFA_ELEMENT_Xdp, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc56b9ff, L"xfa", XFA_ELEMENT_Xfa, XFA_XDPPACKET_XDP,
+     XFA_OBJECTTYPE_ModelNode},
+    {0xc56fcb7, L"xsl", XFA_ELEMENT_Xsl, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc8b89d6, L"zpl", XFA_ELEMENT_Zpl, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc9bae94, L"cache", XFA_ELEMENT_Cache, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xcb016be, L"margin", XFA_ELEMENT_Margin,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xe1378fe, L"keyUsage", XFA_ELEMENT_KeyUsage,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xfe3596a, L"exclude", XFA_ELEMENT_Exclude, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x10395ac7, L"choiceList", XFA_ELEMENT_ChoiceList,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x1059ec18, L"level", XFA_ELEMENT_Level, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x10874804, L"labelPrinter", XFA_ELEMENT_LabelPrinter,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
+    {0x10c40e03, L"calendarSymbols", XFA_ELEMENT_CalendarSymbols,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0x10f1ea24, L"para", XFA_ELEMENT_Para,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x10f1ea37, L"part", XFA_ELEMENT_Part, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x1140975b, L"pdfa", XFA_ELEMENT_Pdfa, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x1154efe6, L"filter", XFA_ELEMENT_Filter,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x13f41de1, L"present", XFA_ELEMENT_Present, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x1827e6ea, L"pagination", XFA_ELEMENT_Pagination, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x18463707, L"encoding", XFA_ELEMENT_Encoding,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
+    {0x185e41e2, L"event", XFA_ELEMENT_Event,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x1adb142d, L"whitespace", XFA_ELEMENT_Whitespace, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x1f3f64c3, L"defaultUi", XFA_ELEMENT_DefaultUi,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x204e87cb, L"dataModel", XFA_ELEMENT_DataModel, XFA_XDPPACKET_Datasets,
+     XFA_OBJECTTYPE_ModelNode},
+    {0x2057b350, L"barcode", XFA_ELEMENT_Barcode,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x20596bad, L"timePattern", XFA_ELEMENT_TimePattern,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0x210b74d3, L"batchOutput", XFA_ELEMENT_BatchOutput, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x212ff0e2, L"enforce", XFA_ELEMENT_Enforce, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x21d351b4, L"currencySymbols", XFA_ELEMENT_CurrencySymbols,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0x21db83c5, L"addSilentPrint", XFA_ELEMENT_AddSilentPrint,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x22266258, L"rename", XFA_ELEMENT_Rename, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x226ca8f1, L"operation", XFA_ELEMENT_Operation,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
+    {0x23e27b84, L"typefaces", XFA_ELEMENT_Typefaces, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_Node},
+    {0x23f4aa75, L"subjectDNs", XFA_ELEMENT_SubjectDNs,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x240d5e8e, L"issuers", XFA_ELEMENT_Issuers,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x2457a033, L"signaturePseudoModel", XFA_ELEMENT_SignaturePseudoModel,
+     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
+    {0x24a52f8a, L"wsdlConnection", XFA_ELEMENT_WsdlConnection,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
+    {0x254ebd07, L"debug", XFA_ELEMENT_Debug, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x2655c66a, L"delta", XFA_ELEMENT_Delta, XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_OrdinaryObject},
+    {0x26c0daec, L"eraNames", XFA_ELEMENT_EraNames, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_Node},
+    {0x273ab03b, L"modifyAnnots", XFA_ELEMENT_ModifyAnnots,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x27875bb4, L"startNode", XFA_ELEMENT_StartNode, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x285d0dbc, L"button", XFA_ELEMENT_Button,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x28dee6e9, L"format", XFA_ELEMENT_Format,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x2a23349e, L"border", XFA_ELEMENT_Border,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x2ae67f19, L"area", XFA_ELEMENT_Area,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContainerNode},
+    {0x2c3c4c67, L"hyphenation", XFA_ELEMENT_Hyphenation,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x2d08af85, L"text", XFA_ELEMENT_Text,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x2d71b00f, L"time", XFA_ELEMENT_Time,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0x2f16a382, L"type", XFA_ELEMENT_Type, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x2fe057e9, L"overprint", XFA_ELEMENT_Overprint, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x302aee16, L"certificates", XFA_ELEMENT_Certificates,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x30b227df, L"encryptionMethods", XFA_ELEMENT_EncryptionMethods,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x32b900d1, L"setProperty", XFA_ELEMENT_SetProperty,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x337d9e45, L"printerName", XFA_ELEMENT_PrinterName, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x33edda4b, L"startPage", XFA_ELEMENT_StartPage, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x381943e4, L"pageOffset", XFA_ELEMENT_PageOffset, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x382106cd, L"dateTime", XFA_ELEMENT_DateTime,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0x386e7421, L"comb", XFA_ELEMENT_Comb,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x390acd9e, L"pattern", XFA_ELEMENT_Pattern,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x3942163e, L"ifEmpty", XFA_ELEMENT_IfEmpty, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x39944a7b, L"suppressBanner", XFA_ELEMENT_SuppressBanner,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x3b3c3dca, L"outputBin", XFA_ELEMENT_OutputBin, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x3b8a4024, L"field", XFA_ELEMENT_Field,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x3c15352f, L"agent", XFA_ELEMENT_Agent, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x3d7e8668, L"outputXSL", XFA_ELEMENT_OutputXSL, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x3e1c91c5, L"adjustData", XFA_ELEMENT_AdjustData, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x3e7a9408, L"autoSave", XFA_ELEMENT_AutoSave, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x3ecead94, L"contentArea", XFA_ELEMENT_ContentArea,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x3ef334e3, L"eventPseudoModel", XFA_ELEMENT_EventPseudoModel,
+     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
+    {0x3fadaec0, L"wsdlAddress", XFA_ELEMENT_WsdlAddress,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
+    {0x40623b5b, L"solid", XFA_ELEMENT_Solid,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x41f0bd76, L"dateTimeSymbols", XFA_ELEMENT_DateTimeSymbols,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0x444e7523, L"encryptionLevel", XFA_ELEMENT_EncryptionLevel,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x4523af55, L"edge", XFA_ELEMENT_Edge,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x45d5e3c1, L"stipple", XFA_ELEMENT_Stipple,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x475e4e87, L"attributes", XFA_ELEMENT_Attributes, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x487a8c87, L"versionControl", XFA_ELEMENT_VersionControl,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
+    {0x48e5248c, L"meridiem", XFA_ELEMENT_Meridiem, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x48f36719, L"exclGroup", XFA_ELEMENT_ExclGroup,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x4977356b, L"toolTip", XFA_ELEMENT_ToolTip,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0x499afecc, L"compress", XFA_ELEMENT_Compress, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x4a0c4948, L"reason", XFA_ELEMENT_Reason,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0x4bdcce13, L"execute", XFA_ELEMENT_Execute,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x4c56b216, L"contentCopy", XFA_ELEMENT_ContentCopy, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x4cc176d3, L"dateTimeEdit", XFA_ELEMENT_DateTimeEdit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x4e1e39b6, L"config", XFA_ELEMENT_Config, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ModelNode},
+    {0x4e2d6083, L"image", XFA_ELEMENT_Image,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0x4e814150, L"#xHTML", XFA_ELEMENT_SharpxHTML,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet |
+         XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_NodeV},
+    {0x4f2388c1, L"numberOfCopies", XFA_ELEMENT_NumberOfCopies,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x4f512e30, L"behaviorOverride", XFA_ELEMENT_BehaviorOverride,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x4fdc3454, L"timeStamp", XFA_ELEMENT_TimeStamp,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x51d90546, L"month", XFA_ELEMENT_Month, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x523437e4, L"viewerPreferences", XFA_ELEMENT_ViewerPreferences,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
+    {0x53abc1c6, L"scriptModel", XFA_ELEMENT_ScriptModel, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x54034c2f, L"decimal", XFA_ELEMENT_Decimal,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0x54202c9e, L"subform", XFA_ELEMENT_Subform,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x542c7300, L"select", XFA_ELEMENT_Select, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0x5436d198, L"window", XFA_ELEMENT_Window, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x5473b6dc, L"localeSet", XFA_ELEMENT_LocaleSet,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ModelNode},
+    {0x56ae179e, L"handler", XFA_ELEMENT_Handler,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0x5700bd5f, L"hostPseudoModel", XFA_ELEMENT_HostPseudoModel,
+     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
+    {0x570ce835, L"presence", XFA_ELEMENT_Presence, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x5779d65f, L"record", XFA_ELEMENT_Record, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x59c8f27d, L"embed", XFA_ELEMENT_Embed, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x5a50e9e6, L"version", XFA_ELEMENT_Version, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x5b8383df, L"command", XFA_ELEMENT_Command, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_Node},
+    {0x5c43c6c3, L"copies", XFA_ELEMENT_Copies, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x5e0c2c49, L"staple", XFA_ELEMENT_Staple, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x5e5083dd, L"submitFormat", XFA_ELEMENT_SubmitFormat,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x5e8c5d20, L"boolean", XFA_ELEMENT_Boolean,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x60490a85, L"message", XFA_ELEMENT_Message,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_Node},
+    {0x60d4c8b1, L"output", XFA_ELEMENT_Output, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x61810081, L"psMap", XFA_ELEMENT_PsMap, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x62bd904b, L"excludeNS", XFA_ELEMENT_ExcludeNS, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x669d4f77, L"assist", XFA_ELEMENT_Assist,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x67334a1c, L"picture", XFA_ELEMENT_Picture,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x67fe7334, L"traversal", XFA_ELEMENT_Traversal,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x6894589c, L"silentPrint", XFA_ELEMENT_SilentPrint, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x68a16bbd, L"webClient", XFA_ELEMENT_WebClient, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x69f115df, L"layoutPseudoModel", XFA_ELEMENT_LayoutPseudoModel,
+     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
+    {0x6a4bc084, L"producer", XFA_ELEMENT_Producer, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x6a9e04c9, L"corner", XFA_ELEMENT_Corner,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x6ccd7274, L"msgId", XFA_ELEMENT_MsgId, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x6e67921f, L"color", XFA_ELEMENT_Color,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x6ec217a5, L"keep", XFA_ELEMENT_Keep,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x6eef1116, L"query", XFA_ELEMENT_Query, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_Node},
+    {0x7033bfd5, L"insert", XFA_ELEMENT_Insert, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0x704af389, L"imageEdit", XFA_ELEMENT_ImageEdit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x7233018a, L"validate", XFA_ELEMENT_Validate,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x72ba47b4, L"digestMethods", XFA_ELEMENT_DigestMethods,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x72f2aa7a, L"numberPatterns", XFA_ELEMENT_NumberPatterns,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0x74caed29, L"pageSet", XFA_ELEMENT_PageSet,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x7568e6ae, L"integer", XFA_ELEMENT_Integer,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x76182db9, L"soapAddress", XFA_ELEMENT_SoapAddress,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
+    {0x773146c5, L"equate", XFA_ELEMENT_Equate, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x77d449dd, L"formFieldFilling", XFA_ELEMENT_FormFieldFilling,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x7889d68a, L"pageRange", XFA_ELEMENT_PageRange, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x7baca2e3, L"update", XFA_ELEMENT_Update, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0x7ce89001, L"connectString", XFA_ELEMENT_ConnectString,
+     XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode},
+    {0x7d9fd7c5, L"mode", XFA_ELEMENT_Mode, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x7e7e845e, L"layout", XFA_ELEMENT_Layout, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x7e845c34, L"#xml", XFA_ELEMENT_Sharpxml,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeV},
+    {0x7fb341df, L"xsdConnection", XFA_ELEMENT_XsdConnection,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
+    {0x7ffb51cc, L"traverse", XFA_ELEMENT_Traverse,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x80203b5a, L"encodings", XFA_ELEMENT_Encodings,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x803550fc, L"template", XFA_ELEMENT_Template,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ModelNode},
+    {0x803d5bbc, L"acrobat", XFA_ELEMENT_Acrobat, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0x821d6569, L"validationMessaging", XFA_ELEMENT_ValidationMessaging,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
+    {0x830e688f, L"signing", XFA_ELEMENT_Signing,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x83a550d2, L"dataWindow", XFA_ELEMENT_DataWindow, XFA_XDPPACKET_Datasets,
+     XFA_OBJECTTYPE_OrdinaryObject},
+    {0x83dab9f5, L"script", XFA_ELEMENT_Script,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x8411ebcd, L"addViewerPreferences", XFA_ELEMENT_AddViewerPreferences,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x8777642e, L"alwaysEmbed", XFA_ELEMENT_AlwaysEmbed, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x877a6b39, L"passwordEdit", XFA_ELEMENT_PasswordEdit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x87e84c99, L"numericEdit", XFA_ELEMENT_NumericEdit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x8852cdec, L"encryptionMethod", XFA_ELEMENT_EncryptionMethod,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
+    {0x891f4606, L"change", XFA_ELEMENT_Change, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x89939f36, L"pageArea", XFA_ELEMENT_PageArea,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0x8a9d6247, L"submitUrl", XFA_ELEMENT_SubmitUrl, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0x8ad8b90f, L"oids", XFA_ELEMENT_Oids,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x8b036f32, L"signature", XFA_ELEMENT_Signature,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x8b128efb, L"ADBE_JSConsole", XFA_ELEMENT_ADBE_JSConsole,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0x8bcfe96e, L"caption", XFA_ELEMENT_Caption,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x8e1c2921, L"relevant", XFA_ELEMENT_Relevant, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x8e3f0a4b, L"flipLabel", XFA_ELEMENT_FlipLabel, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0x900280b7, L"exData", XFA_ELEMENT_ExData,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0x91e80352, L"dayNames", XFA_ELEMENT_DayNames, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_Node},
+    {0x93113b11, L"soapAction", XFA_ELEMENT_SoapAction,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
+    {0x938b09f6, L"defaultTypeface", XFA_ELEMENT_DefaultTypeface,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
+    {0x95b37897, L"manifest", XFA_ELEMENT_Manifest,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x97b76b54, L"overflow", XFA_ELEMENT_Overflow,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x9a57861b, L"linear", XFA_ELEMENT_Linear,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0x9ad5a821, L"currencySymbol", XFA_ELEMENT_CurrencySymbol,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0x9c6471b3, L"delete", XFA_ELEMENT_Delete, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0x9deea61d, L"deltas", XFA_ELEMENT_Deltas, XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_OrdinaryObject},
+    {0x9e67de21, L"digestMethod", XFA_ELEMENT_DigestMethod,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
+    {0x9f3e9510, L"instanceManager", XFA_ELEMENT_InstanceManager,
+     XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xa0799892, L"equateRange", XFA_ELEMENT_EquateRange, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xa084a381, L"medium", XFA_ELEMENT_Medium,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xa1211b8b, L"textEdit", XFA_ELEMENT_TextEdit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xa17008f0, L"templateCache", XFA_ELEMENT_TemplateCache,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
+    {0xa4f7b88f, L"compressObjectStream", XFA_ELEMENT_CompressObjectStream,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xa65f5d17, L"dataValue", XFA_ELEMENT_DataValue, XFA_XDPPACKET_Datasets,
+     XFA_OBJECTTYPE_Node},
+    {0xa6caaa89, L"accessibleContent", XFA_ELEMENT_AccessibleContent,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xa8c7d5e2, L"nodeList", XFA_ELEMENT_NodeList, XFA_XDPPACKET_XDP,
+     XFA_OBJECTTYPE_NodeList},
+    {0xa94cc00b, L"includeXDPContent", XFA_ELEMENT_IncludeXDPContent,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xa9b081a1, L"xmlConnection", XFA_ELEMENT_XmlConnection,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
+    {0xab2a3b74, L"validateApprovalSignatures",
+     XFA_ELEMENT_ValidateApprovalSignatures, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xab8c5a2b, L"signData", XFA_ELEMENT_SignData,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xabaa2ceb, L"packets", XFA_ELEMENT_Packets, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xadba359c, L"datePattern", XFA_ELEMENT_DatePattern,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0xae222b2b, L"duplexOption", XFA_ELEMENT_DuplexOption,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xb012effb, L"base", XFA_ELEMENT_Base, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xb0e5485d, L"bind", XFA_ELEMENT_Bind,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_Node},
+    {0xb45d61b2, L"compression", XFA_ELEMENT_Compression, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xb563f0ff, L"user", XFA_ELEMENT_User, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0xb5848ad5, L"rectangle", XFA_ELEMENT_Rectangle,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xb6dacb72, L"effectiveOutputPolicy", XFA_ELEMENT_EffectiveOutputPolicy,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
+    {0xb7d7654d, L"ADBE_JSDebugger", XFA_ELEMENT_ADBE_JSDebugger,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xbab37f73, L"acrobat7", XFA_ELEMENT_Acrobat7, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xbc70081e, L"interactive", XFA_ELEMENT_Interactive, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xbc8fa350, L"locale", XFA_ELEMENT_Locale,
+     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0xbcd44940, L"currentPage", XFA_ELEMENT_CurrentPage, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xbde9abda, L"data", XFA_ELEMENT_Data, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xbde9abde, L"date", XFA_ELEMENT_Date,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0xbe52dfbf, L"desc", XFA_ELEMENT_Desc,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xbf4b6405, L"encrypt", XFA_ELEMENT_Encrypt,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xbfa87cce, L"draw", XFA_ELEMENT_Draw,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0xc181ff4b, L"encryption", XFA_ELEMENT_Encryption, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc1970f40, L"meridiemNames", XFA_ELEMENT_MeridiemNames,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0xc5ad9f5e, L"messaging", XFA_ELEMENT_Messaging, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc69549f4, L"speak", XFA_ELEMENT_Speak,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0xc7743dc7, L"dataGroup", XFA_ELEMENT_DataGroup, XFA_XDPPACKET_Datasets,
+     XFA_OBJECTTYPE_Node},
+    {0xc7eb20e9, L"common", XFA_ELEMENT_Common, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xc85d4528, L"#text", XFA_ELEMENT_Sharptext,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
+         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet |
+         XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_NodeV},
+    {0xc861556a, L"paginationOverride", XFA_ELEMENT_PaginationOverride,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xc903dabb, L"reasons", XFA_ELEMENT_Reasons,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xc9a8127f, L"signatureProperties", XFA_ELEMENT_SignatureProperties,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xca010c2d, L"threshold", XFA_ELEMENT_Threshold, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xcb4c5e96, L"appearanceFilter", XFA_ELEMENT_AppearanceFilter,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
+    {0xcc92aba7, L"fill", XFA_ELEMENT_Fill,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xcd308b77, L"font", XFA_ELEMENT_Font,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_Node},
+    {0xcd309ff4, L"form", XFA_ELEMENT_Form, XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_ModelNode},
+    {0xcebcca2d, L"mediumInfo", XFA_ELEMENT_MediumInfo, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xcfe0d643, L"certificate", XFA_ELEMENT_Certificate,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
+    {0xd012c033, L"password", XFA_ELEMENT_Password, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_TextNode},
+    {0xd01604bd, L"runScripts", XFA_ELEMENT_RunScripts, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xd1227e6f, L"trace", XFA_ELEMENT_Trace, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xd1532876, L"float", XFA_ELEMENT_Float,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0xd17a6c30, L"renderPolicy", XFA_ELEMENT_RenderPolicy,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xd4bf6823, L"logPseudoModel", XFA_ELEMENT_LogPseudoModel,
+     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
+    {0xd58aa962, L"destination", XFA_ELEMENT_Destination, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xd6e27f1d, L"value", XFA_ELEMENT_Value,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xd7a14462, L"bookend", XFA_ELEMENT_Bookend,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xd8c31254, L"exObject", XFA_ELEMENT_ExObject,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xda6a8590, L"openAction", XFA_ELEMENT_OpenAction, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xdab4fb7d, L"neverEmbed", XFA_ELEMENT_NeverEmbed, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xdb98475f, L"bindItems", XFA_ELEMENT_BindItems,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xdbfbe02e, L"calculate", XFA_ELEMENT_Calculate,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xdd7676ed, L"print", XFA_ELEMENT_Print, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xdde273d7, L"extras", XFA_ELEMENT_Extras,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_Node},
+    {0xde146b34, L"proto", XFA_ELEMENT_Proto,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xdf059321, L"dSigData", XFA_ELEMENT_DSigData,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xdfccf030, L"creator", XFA_ELEMENT_Creator, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xdff78c6a, L"connect", XFA_ELEMENT_Connect,
+     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
+     XFA_OBJECTTYPE_Node},
+    {0xe11a2cbc, L"permissions", XFA_ELEMENT_Permissions, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xe14c801c, L"connectionSet", XFA_ELEMENT_ConnectionSet,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_ModelNode},
+    {0xe1c83a14, L"submit", XFA_ELEMENT_Submit,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xe29821cd, L"range", XFA_ELEMENT_Range, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xe38d83c7, L"linearized", XFA_ELEMENT_Linearized, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xe3aa2578, L"packet", XFA_ELEMENT_Packet, XFA_XDPPACKET_XDP,
+     XFA_OBJECTTYPE_NodeC},
+    {0xe3aa860e, L"rootElement", XFA_ELEMENT_RootElement,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
+    {0xe3e553fa, L"plaintextMetadata", XFA_ELEMENT_PlaintextMetadata,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xe3e6e4f2, L"numberSymbols", XFA_ELEMENT_NumberSymbols,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0xe3f067f6, L"printHighQuality", XFA_ELEMENT_PrintHighQuality,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xe3fd078c, L"driver", XFA_ELEMENT_Driver, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xe48b34f2, L"incrementalLoad", XFA_ELEMENT_IncrementalLoad,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
+    {0xe550e7c2, L"subjectDN", XFA_ELEMENT_SubjectDN,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
+    {0xe6669a78, L"compressLogicalStructure",
+     XFA_ELEMENT_CompressLogicalStructure, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xe7a7ea02, L"incrementalMerge", XFA_ELEMENT_IncrementalMerge,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xe948530d, L"radial", XFA_ELEMENT_Radial,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xea8d6999, L"variables", XFA_ELEMENT_Variables,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
+    {0xeaa142c0, L"timePatterns", XFA_ELEMENT_TimePatterns,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
+    {0xeb943a71, L"effectiveInputPolicy", XFA_ELEMENT_EffectiveInputPolicy,
+     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
+    {0xef04a2bc, L"nameAttr", XFA_ELEMENT_NameAttr, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xf07222ab, L"conformance", XFA_ELEMENT_Conformance, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xf0aaaadc, L"transform", XFA_ELEMENT_Transform, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_Node},
+    {0xf1433e88, L"lockDocument", XFA_ELEMENT_LockDocument,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
+    {0xf54eb997, L"breakAfter", XFA_ELEMENT_BreakAfter,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xf616da28, L"line", XFA_ELEMENT_Line,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xf616f3dc, L"list", XFA_ELEMENT_List, XFA_XDPPACKET_XDP,
+     XFA_OBJECTTYPE_OrdinaryList},
+    {0xf7055fb1, L"source", XFA_ELEMENT_Source, XFA_XDPPACKET_SourceSet,
+     XFA_OBJECTTYPE_Node},
+    {0xf7eebe1c, L"occur", XFA_ELEMENT_Occur,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+    {0xf8d10d97, L"pickTrayByPDFSize", XFA_ELEMENT_PickTrayByPDFSize,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xf8f19e3a, L"monthNames", XFA_ELEMENT_MonthNames, XFA_XDPPACKET_LocaleSet,
+     XFA_OBJECTTYPE_Node},
+    {0xf984149b, L"severity", XFA_ELEMENT_Severity, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xf9bcb037, L"groupParent", XFA_ELEMENT_GroupParent, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_NodeV},
+    {0xfbc42fff, L"documentAssembly", XFA_ELEMENT_DocumentAssembly,
+     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
+    {0xfc78159f, L"numberSymbol", XFA_ELEMENT_NumberSymbol,
+     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
+    {0xfcbd606c, L"tagged", XFA_ELEMENT_Tagged, XFA_XDPPACKET_Config,
+     XFA_OBJECTTYPE_ContentNode},
+    {0xff063802, L"items", XFA_ELEMENT_Items,
+     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
+};
+const int32_t g_iXFAElementCount =
+    sizeof(g_XFAElementData) / sizeof(XFA_ELEMENTINFO);
+const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[] = {
+    {0, 8},    {8, 0},   {8, 14},   {22, 0},   {22, 0},   {22, 6},   {28, 0},
+    {28, 0},   {28, 1},  {29, 3},   {32, 0},   {32, 0},   {32, 0},   {32, 3},
+    {35, 1},   {36, 0},  {36, 0},   {36, 2},   {38, 0},   {38, 0},   {38, 0},
+    {38, 4},   {42, 0},  {42, 0},   {42, 1},   {43, 0},   {43, 8},   {51, 19},
+    {70, 0},   {70, 0},  {70, 2},   {72, 1},   {73, 0},   {73, 2},   {75, 4},
+    {79, 1},   {80, 1},  {81, 0},   {81, 0},   {81, 3},   {84, 0},   {84, 4},
+    {88, 4},   {92, 1},  {93, 0},   {93, 4},   {97, 9},   {106, 14}, {120, 0},
+    {120, 0},  {120, 5}, {125, 0},  {125, 1},  {126, 0},  {126, 0},  {126, 0},
+    {126, 0},  {126, 0}, {126, 1},  {127, 0},  {127, 0},  {127, 0},  {127, 0},
+    {127, 0},  {127, 0}, {127, 0},  {127, 6},  {133, 1},  {134, 0},  {134, 1},
+    {135, 0},  {135, 0}, {135, 1},  {136, 2},  {138, 5},  {143, 2},  {145, 0},
+    {145, 0},  {145, 0}, {145, 0},  {145, 0},  {145, 5},  {150, 0},  {150, 0},
+    {150, 0},  {150, 0}, {150, 0},  {150, 0},  {150, 0},  {150, 2},  {152, 0},
+    {152, 0},  {152, 0}, {152, 17}, {169, 0},  {169, 1},  {170, 0},  {170, 0},
+    {170, 2},  {172, 0}, {172, 0},  {172, 1},  {173, 0},  {173, 0},  {173, 2},
+    {175, 2},  {177, 0}, {177, 0},  {177, 0},  {177, 11}, {188, 0},  {188, 0},
+    {188, 0},  {188, 0}, {188, 0},  {188, 4},  {192, 3},  {195, 0},  {195, 0},
+    {195, 0},  {195, 0}, {195, 0},  {195, 0},  {195, 9},  {204, 0},  {204, 0},
+    {204, 17}, {221, 0}, {221, 0},  {221, 0},  {221, 0},  {221, 0},  {221, 0},
+    {221, 0},  {221, 0}, {221, 0},  {221, 4},  {225, 0},  {225, 0},  {225, 0},
+    {225, 0},  {225, 2}, {227, 3},  {230, 0},  {230, 0},  {230, 2},  {232, 0},
+    {232, 1},  {233, 2}, {235, 2},  {237, 0},  {237, 0},  {237, 2},  {239, 0},
+    {239, 1},  {240, 1}, {241, 2},  {243, 0},  {243, 3},  {246, 4},  {250, 0},
+    {250, 1},  {251, 2}, {253, 0},  {253, 0},  {253, 0},  {253, 0},  {253, 0},
+    {253, 0},  {253, 0}, {253, 0},  {253, 0},  {253, 0},  {253, 2},  {255, 2},
+    {257, 0},  {257, 6}, {263, 5},  {268, 0},  {268, 0},  {268, 0},  {268, 3},
+    {271, 0},  {271, 0}, {271, 3},  {274, 4},  {278, 0},  {278, 0},  {278, 4},
+    {282, 0},  {282, 0}, {282, 5},  {287, 0},  {287, 5},  {292, 0},  {292, 0},
+    {292, 0},  {292, 1}, {293, 0},  {293, 0},  {293, 1},  {294, 0},  {294, 2},
+    {296, 0},  {296, 0}, {296, 0},  {296, 0},  {296, 1},  {297, 0},  {297, 0},
+    {297, 4},  {301, 0}, {301, 0},  {301, 0},  {301, 0},  {301, 0},  {301, 0},
+    {301, 1},  {302, 0}, {302, 2},  {304, 0},  {304, 0},  {304, 0},  {304, 0},
+    {304, 1},  {305, 4}, {309, 0},  {309, 3},  {312, 0},  {312, 0},  {312, 1},
+    {313, 0},  {313, 8}, {321, 0},  {321, 10}, {331, 0},  {331, 10}, {341, 1},
+    {342, 12}, {354, 3}, {357, 1},  {358, 0},  {358, 0},  {358, 0},  {358, 8},
+    {366, 0},  {366, 0}, {366, 0},  {366, 0},  {366, 0},  {366, 0},  {366, 7},
+    {373, 2},  {375, 0}, {375, 1},  {376, 0},  {376, 0},  {376, 0},  {376, 0},
+    {376, 0},  {376, 0}, {376, 0},  {376, 0},  {376, 13}, {389, 0},  {389, 1},
+    {390, 1},  {391, 0}, {391, 0},  {391, 3},  {394, 0},  {394, 0},  {394, 0},
+    {394, 0},  {394, 0}, {394, 4},  {398, 9},  {407, 0},  {407, 1},  {408, 0},
+    {408, 0},  {408, 0}, {408, 0},  {408, 0},  {408, 1},  {409, 0},  {409, 2},
+    {411, 0},  {411, 0}, {411, 0},  {411, 0},  {411, 2},  {413, 0},  {413, 1},
+    {414, 0},  {414, 0}, {414, 0},  {414, 7},  {421, 0},  {421, 1},  {422, 1},
+    {423, 0},  {423, 1}, {424, 1},  {425, 0},  {425, 1},  {426, 0},  {426, 0},
+    {426, 0},  {426, 0}, {426, 0},  {426, 0},
+};
+const XFA_PROPERTY g_XFAElementPropertyData[] = {
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Jog, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_BatchOutput, 1, 0},
+    {XFA_ELEMENT_OutputBin, 1, 0},
+    {XFA_ELEMENT_Compress, 1, 0},
+    {XFA_ELEMENT_Staple, 1, 0},
+    {XFA_ELEMENT_MediumInfo, 1, 0},
+    {XFA_ELEMENT_CheckButton, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_ChoiceList, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_DefaultUi, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Barcode, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Button, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_DateTimeEdit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_ImageEdit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_PasswordEdit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_NumericEdit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Signature, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_TextEdit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_ExObject, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Break, 1, 0},
+    {XFA_ELEMENT_Overflow, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Bookend, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Occur, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_SubsetBelow, 1, 0},
+    {XFA_ELEMENT_Map, 1, 0},
+    {XFA_ELEMENT_Embed, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_DatePattern, 4, 0},
+    {XFA_ELEMENT_Edge, 1, 0},
+    {XFA_ELEMENT_Fill, 1, 0},
+    {XFA_ELEMENT_To, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Mode, 1, 0},
+    {XFA_ELEMENT_Threshold, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Jog, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_BatchOutput, 1, 0},
+    {XFA_ELEMENT_PageOffset, 1, 0},
+    {XFA_ELEMENT_OutputBin, 1, 0},
+    {XFA_ELEMENT_Staple, 1, 0},
+    {XFA_ELEMENT_MediumInfo, 1, 0},
+    {XFA_ELEMENT_AdobeExtensionLevel, 1, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_Pdfa, 1, 0},
+    {XFA_ELEMENT_BatchOutput, 1, 0},
+    {XFA_ELEMENT_ViewerPreferences, 1, 0},
+    {XFA_ELEMENT_ScriptModel, 1, 0},
+    {XFA_ELEMENT_Version, 1, 0},
+    {XFA_ELEMENT_SubmitFormat, 1, 0},
+    {XFA_ELEMENT_SilentPrint, 1, 0},
+    {XFA_ELEMENT_Producer, 1, 0},
+    {XFA_ELEMENT_Compression, 1, 0},
+    {XFA_ELEMENT_Interactive, 1, 0},
+    {XFA_ELEMENT_Encryption, 1, 0},
+    {XFA_ELEMENT_RenderPolicy, 1, 0},
+    {XFA_ELEMENT_OpenAction, 1, 0},
+    {XFA_ELEMENT_Creator, 1, 0},
+    {XFA_ELEMENT_Linearized, 1, 0},
+    {XFA_ELEMENT_Tagged, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Xsl, 1, 0},
+    {XFA_ELEMENT_Packets, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Debug, 1, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_BatchOutput, 1, 0},
+    {XFA_ELEMENT_FlipLabel, 1, 0},
+    {XFA_ELEMENT_TemplateCache, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_BatchOutput, 1, 0},
+    {XFA_ELEMENT_FlipLabel, 1, 0},
+    {XFA_ELEMENT_EraNames, 1, 0},
+    {XFA_ELEMENT_DayNames, 2, 0},
+    {XFA_ELEMENT_MeridiemNames, 1, 0},
+    {XFA_ELEMENT_MonthNames, 2, 0},
+    {XFA_ELEMENT_Hyphenation, 1, 0},
+    {XFA_ELEMENT_Amd, 1, 0},
+    {XFA_ELEMENT_Part, 1, 0},
+    {XFA_ELEMENT_IncludeXDPContent, 1, 0},
+    {XFA_ELEMENT_Conformance, 1, 0},
+    {XFA_ELEMENT_Mdp, 1, 0},
+    {XFA_ELEMENT_Certificates, 1, 0},
+    {XFA_ELEMENT_TimeStamp, 1, 0},
+    {XFA_ELEMENT_Handler, 1, 0},
+    {XFA_ELEMENT_DigestMethods, 1, 0},
+    {XFA_ELEMENT_Encodings, 1, 0},
+    {XFA_ELEMENT_Reasons, 1, 0},
+    {XFA_ELEMENT_AppearanceFilter, 1, 0},
+    {XFA_ELEMENT_LockDocument, 1, 0},
+    {XFA_ELEMENT_Xdp, 1, 0},
+    {XFA_ELEMENT_Cache, 1, 0},
+    {XFA_ELEMENT_Pagination, 1, 0},
+    {XFA_ELEMENT_Overprint, 1, 0},
+    {XFA_ELEMENT_BehaviorOverride, 1, 0},
+    {XFA_ELEMENT_Copies, 1, 0},
+    {XFA_ELEMENT_Output, 1, 0},
+    {XFA_ELEMENT_Validate, 1, 0},
+    {XFA_ELEMENT_Layout, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_Common, 1, 0},
+    {XFA_ELEMENT_PaginationOverride, 1, 0},
+    {XFA_ELEMENT_Destination, 1, 0},
+    {XFA_ELEMENT_IncrementalMerge, 1, 0},
+    {XFA_ELEMENT_Execute, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Script, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_SignData, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Submit, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_CurrencySymbol, 3, 0},
+    {XFA_ELEMENT_Operation, 1, 0},
+    {XFA_ELEMENT_WsdlAddress, 1, 0},
+    {XFA_ELEMENT_SoapAddress, 1, 0},
+    {XFA_ELEMENT_SoapAction, 1, 0},
+    {XFA_ELEMENT_EffectiveOutputPolicy, 1, 0},
+    {XFA_ELEMENT_EffectiveInputPolicy, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Era, 2, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Edge, 4, 0},
+    {XFA_ELEMENT_Corner, 4, 0},
+    {XFA_ELEMENT_Fill, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_KeyUsage, 1, 0},
+    {XFA_ELEMENT_SubjectDNs, 1, 0},
+    {XFA_ELEMENT_Issuers, 1, 0},
+    {XFA_ELEMENT_Signing, 1, 0},
+    {XFA_ELEMENT_Oids, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Ui, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Para, 1, 0},
+    {XFA_ELEMENT_Format, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Assist, 1, 0},
+    {XFA_ELEMENT_Traversal, 1, 0},
+    {XFA_ELEMENT_Keep, 1, 0},
+    {XFA_ELEMENT_Validate, 1, 0},
+    {XFA_ELEMENT_Caption, 1, 0},
+    {XFA_ELEMENT_Bind, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Font, 1, 0},
+    {XFA_ELEMENT_Value, 1, 0},
+    {XFA_ELEMENT_Calculate, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Items, 2, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Para, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Assist, 1, 0},
+    {XFA_ELEMENT_Traversal, 1, 0},
+    {XFA_ELEMENT_Validate, 1, 0},
+    {XFA_ELEMENT_Caption, 1, 0},
+    {XFA_ELEMENT_Bind, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Calculate, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Comb, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Present, 1, 0},
+    {XFA_ELEMENT_Acrobat, 1, 0},
+    {XFA_ELEMENT_Trace, 1, 0},
+    {XFA_ELEMENT_PrintScaling, 1, 0},
+    {XFA_ELEMENT_Enforce, 1, 0},
+    {XFA_ELEMENT_NumberOfCopies, 1, 0},
+    {XFA_ELEMENT_PageRange, 1, 0},
+    {XFA_ELEMENT_AddViewerPreferences, 1, 0},
+    {XFA_ELEMENT_ADBE_JSConsole, 1, 0},
+    {XFA_ELEMENT_DuplexOption, 1, 0},
+    {XFA_ELEMENT_ADBE_JSDebugger, 1, 0},
+    {XFA_ELEMENT_PickTrayByPDFSize, 1, 0},
+    {XFA_ELEMENT_Break, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Para, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Assist, 1, 0},
+    {XFA_ELEMENT_Traversal, 1, 0},
+    {XFA_ELEMENT_Keep, 1, 0},
+    {XFA_ELEMENT_Validate, 1, 0},
+    {XFA_ELEMENT_PageSet, 1, 0},
+    {XFA_ELEMENT_Overflow, 1, 0},
+    {XFA_ELEMENT_Bind, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Bookend, 1, 0},
+    {XFA_ELEMENT_Calculate, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Variables, 1, 0},
+    {XFA_ELEMENT_Occur, 1, 0},
+    {XFA_ELEMENT_Query, 1, 0},
+    {XFA_ELEMENT_Insert, 1, 0},
+    {XFA_ELEMENT_Update, 1, 0},
+    {XFA_ELEMENT_Delete, 1, 0},
+    {XFA_ELEMENT_MsgId, 1, 0},
+    {XFA_ELEMENT_Severity, 1, 0},
+    {XFA_ELEMENT_To, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Type, 1, 0},
+    {XFA_ELEMENT_ToolTip, 1, 0},
+    {XFA_ELEMENT_Speak, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_AddSilentPrint, 1, 0},
+    {XFA_ELEMENT_PrinterName, 1, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_RecordSet, 1, 0},
+    {XFA_ELEMENT_Select, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Message, 1, 0},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_NumberPattern, 4, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Occur, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_RootElement, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Xsl, 1, 0},
+    {XFA_ELEMENT_StartPage, 1, 0},
+    {XFA_ELEMENT_Relevant, 1, 0},
+    {XFA_ELEMENT_Base, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_AutoSave, 1, 0},
+    {XFA_ELEMENT_Validate, 1, 0},
+    {XFA_ELEMENT_ValidateApprovalSignatures, 1, 0},
+    {XFA_ELEMENT_Acrobat7, 1, 0},
+    {XFA_ELEMENT_Common, 1, 0},
+    {XFA_ELEMENT_Exclude, 1, 0},
+    {XFA_ELEMENT_CurrentPage, 1, 0},
+    {XFA_ELEMENT_RunScripts, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Comb, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Medium, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Occur, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Filter, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Manifest, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Para, 1, 0},
+    {XFA_ELEMENT_Font, 1, 0},
+    {XFA_ELEMENT_Value, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Day, 7, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Occur, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Comb, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Filter, 1, 0},
+    {XFA_ELEMENT_Manifest, 1, 0},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_Level, 1, 0},
+    {XFA_ELEMENT_Type, 1, 0},
+    {XFA_ELEMENT_CompressObjectStream, 1, 0},
+    {XFA_ELEMENT_CompressLogicalStructure, 1, 0},
+    {XFA_ELEMENT_Edge, 4, 0},
+    {XFA_ELEMENT_Corner, 4, 0},
+    {XFA_ELEMENT_Fill, 1, 0},
+    {XFA_ELEMENT_DynamicRender, 1, 0},
+    {XFA_ELEMENT_DatePatterns, 1, 0},
+    {XFA_ELEMENT_CalendarSymbols, 1, 0},
+    {XFA_ELEMENT_CurrencySymbols, 1, 0},
+    {XFA_ELEMENT_Typefaces, 1, 0},
+    {XFA_ELEMENT_DateTimeSymbols, 1, 0},
+    {XFA_ELEMENT_NumberPatterns, 1, 0},
+    {XFA_ELEMENT_NumberSymbols, 1, 0},
+    {XFA_ELEMENT_TimePatterns, 1, 0},
+    {XFA_ELEMENT_Uri, 1, 0},
+    {XFA_ELEMENT_Xsl, 1, 0},
+    {XFA_ELEMENT_StartNode, 1, 0},
+    {XFA_ELEMENT_OutputXSL, 1, 0},
+    {XFA_ELEMENT_AdjustData, 1, 0},
+    {XFA_ELEMENT_Attributes, 1, 0},
+    {XFA_ELEMENT_Window, 1, 0},
+    {XFA_ELEMENT_Record, 1, 0},
+    {XFA_ELEMENT_Range, 1, 0},
+    {XFA_ELEMENT_IncrementalLoad, 1, 0},
+    {XFA_ELEMENT_Text, 1, 0},
+    {XFA_ELEMENT_Time, 1, 0},
+    {XFA_ELEMENT_DateTime, 1, 0},
+    {XFA_ELEMENT_Image, 1, 0},
+    {XFA_ELEMENT_Decimal, 1, 0},
+    {XFA_ELEMENT_Boolean, 1, 0},
+    {XFA_ELEMENT_Integer, 1, 0},
+    {XFA_ELEMENT_ExData, 1, 0},
+    {XFA_ELEMENT_Date, 1, 0},
+    {XFA_ELEMENT_Float, 1, 0},
+    {XFA_ELEMENT_Certificate, 1, 0},
+    {XFA_ELEMENT_Ui, 1, 0},
+    {XFA_ELEMENT_Margin, 1, 0},
+    {XFA_ELEMENT_Para, 1, 0},
+    {XFA_ELEMENT_Border, 1, 0},
+    {XFA_ELEMENT_Assist, 1, 0},
+    {XFA_ELEMENT_Traversal, 1, 0},
+    {XFA_ELEMENT_Keep, 1, 0},
+    {XFA_ELEMENT_Caption, 1, 0},
+    {XFA_ELEMENT_Desc, 1, 0},
+    {XFA_ELEMENT_Font, 1, 0},
+    {XFA_ELEMENT_Value, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_EncryptionLevel, 1, 0},
+    {XFA_ELEMENT_Encrypt, 1, 0},
+    {XFA_ELEMENT_Permissions, 1, 0},
+    {XFA_ELEMENT_Meridiem, 2, 0},
+    {XFA_ELEMENT_SuppressBanner, 1, 0},
+    {XFA_ELEMENT_VersionControl, 1, 0},
+    {XFA_ELEMENT_LocaleSet, 1, 0},
+    {XFA_ELEMENT_Template, 1, 0},
+    {XFA_ELEMENT_ValidationMessaging, 1, 0},
+    {XFA_ELEMENT_Locale, 1, 0},
+    {XFA_ELEMENT_Data, 1, 0},
+    {XFA_ELEMENT_Messaging, 1, 0},
+    {XFA_ELEMENT_Pattern, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Solid, 1,
+     XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf},
+    {XFA_ELEMENT_Stipple, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Linear, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Radial, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Fill, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Map, 1, 0},
+    {XFA_ELEMENT_Arc, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Text, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Time, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_DateTime, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Image, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Decimal, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Boolean, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Integer, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_ExData, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Rectangle, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Date, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Float, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Line, 1, XFA_PROPERTYFLAG_OneOf},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Destination, 1, 0},
+    {XFA_ELEMENT_Message, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_ConnectString, 1, 0},
+    {XFA_ELEMENT_User, 1, 0},
+    {XFA_ELEMENT_Password, 1, 0},
+    {XFA_ELEMENT_ModifyAnnots, 1, 0},
+    {XFA_ELEMENT_ContentCopy, 1, 0},
+    {XFA_ELEMENT_FormFieldFilling, 1, 0},
+    {XFA_ELEMENT_Change, 1, 0},
+    {XFA_ELEMENT_AccessibleContent, 1, 0},
+    {XFA_ELEMENT_Print, 1, 0},
+    {XFA_ELEMENT_PlaintextMetadata, 1, 0},
+    {XFA_ELEMENT_PrintHighQuality, 1, 0},
+    {XFA_ELEMENT_DocumentAssembly, 1, 0},
+    {XFA_ELEMENT_Encrypt, 1, 0},
+    {XFA_ELEMENT_NumberSymbol, 5, 0},
+    {XFA_ELEMENT_FontInfo, 1, 0},
+    {XFA_ELEMENT_Xdc, 1, 0},
+    {XFA_ELEMENT_Color, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_TimePattern, 4, 0},
+    {XFA_ELEMENT_Whitespace, 1, 0},
+    {XFA_ELEMENT_Rename, 1, 0},
+    {XFA_ELEMENT_IfEmpty, 1, 0},
+    {XFA_ELEMENT_Presence, 1, 0},
+    {XFA_ELEMENT_Picture, 1, 0},
+    {XFA_ELEMENT_NameAttr, 1, 0},
+    {XFA_ELEMENT_GroupParent, 1, 0},
+    {XFA_ELEMENT_Script, 1, 0},
+    {XFA_ELEMENT_Edge, 1, 0},
+    {XFA_ELEMENT_Connect, 1, 0},
+    {XFA_ELEMENT_Extras, 1, 0},
+    {XFA_ELEMENT_Month, 12, 0},
+};
+const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[] = {
+    {0, 0},   {0, 0},   {0, 0},   {0, 1},    {1, 0},   {1, 4},    {5, 0},
+    {5, 0},   {5, 0},   {5, 3},   {8, 0},    {8, 0},   {8, 0},    {8, 0},
+    {8, 0},   {8, 1},   {9, 0},   {9, 0},    {9, 0},   {9, 0},    {9, 0},
+    {9, 0},   {9, 2},   {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
+    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
+    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
+    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 8},   {19, 0},
+    {19, 0},  {19, 0},  {19, 0},  {19, 0},   {19, 0},  {19, 0},   {19, 0},
+    {19, 0},  {19, 0},  {19, 0},  {19, 0},   {19, 0},  {19, 0},   {19, 1},
+    {20, 1},  {21, 1},  {22, 0},  {22, 0},   {22, 0},  {22, 0},   {22, 0},
+    {22, 0},  {22, 0},  {22, 0},  {22, 0},   {22, 0},  {22, 7},   {29, 0},
+    {29, 0},  {29, 0},  {29, 0},  {29, 0},   {29, 0},  {29, 1},   {30, 1},
+    {31, 0},  {31, 0},  {31, 0},  {31, 0},   {31, 0},  {31, 0},   {31, 0},
+    {31, 0},  {31, 0},  {31, 4},  {35, 2},   {37, 0},  {37, 0},   {37, 0},
+    {37, 0},  {37, 0},  {37, 0},  {37, 0},   {37, 0},  {37, 0},   {37, 0},
+    {37, 0},  {37, 0},  {37, 0},  {37, 0},   {37, 4},  {41, 0},   {41, 0},
+    {41, 0},  {41, 0},  {41, 0},  {41, 0},   {41, 2},  {43, 0},   {43, 0},
+    {43, 0},  {43, 0},  {43, 0},  {43, 0},   {43, 0},  {43, 0},   {43, 0},
+    {43, 13}, {56, 0},  {56, 0},  {56, 1},   {57, 0},  {57, 0},   {57, 0},
+    {57, 0},  {57, 0},  {57, 0},  {57, 0},   {57, 0},  {57, 0},   {57, 0},
+    {57, 0},  {57, 1},  {58, 0},  {58, 1},   {59, 0},  {59, 0},   {59, 0},
+    {59, 1},  {60, 0},  {60, 0},  {60, 0},   {60, 0},  {60, 0},   {60, 0},
+    {60, 0},  {60, 0},  {60, 1},  {61, 0},   {61, 0},  {61, 0},   {61, 1},
+    {62, 0},  {62, 2},  {64, 0},  {64, 0},   {64, 0},  {64, 0},   {64, 0},
+    {64, 0},  {64, 0},  {64, 0},  {64, 0},   {64, 0},  {64, 0},   {64, 0},
+    {64, 1},  {65, 1},  {66, 1},  {67, 0},   {67, 1},  {68, 0},   {68, 0},
+    {68, 0},  {68, 0},  {68, 0},  {68, 0},   {68, 0},  {68, 0},   {68, 6},
+    {74, 0},  {74, 1},  {75, 0},  {75, 0},   {75, 0},  {75, 0},   {75, 0},
+    {75, 0},  {75, 0},  {75, 0},  {75, 0},   {75, 1},  {76, 0},   {76, 0},
+    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
+    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
+    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
+    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
+    {76, 0},  {76, 0},  {76, 0},  {76, 2},   {78, 0},  {78, 0},   {78, 0},
+    {78, 1},  {79, 0},  {79, 0},  {79, 1},   {80, 0},  {80, 0},   {80, 1},
+    {81, 0},  {81, 0},  {81, 1},  {82, 0},   {82, 0},  {82, 0},   {82, 0},
+    {82, 0},  {82, 0},  {82, 0},  {82, 0},   {82, 0},  {82, 0},   {82, 1},
+    {83, 0},  {83, 0},  {83, 0},  {83, 0},   {83, 0},  {83, 0},   {83, 11},
+    {94, 0},  {94, 0},  {94, 0},  {94, 0},   {94, 0},  {94, 11},  {105, 106},
+    {211, 0}, {211, 0}, {211, 1}, {212, 0},  {212, 3}, {215, 1},  {216, 0},
+    {216, 0}, {216, 0}, {216, 0}, {216, 0},  {216, 0}, {216, 0},  {216, 0},
+    {216, 0}, {216, 0}, {216, 0}, {216, 0},  {216, 0}, {216, 12}, {228, 0},
+    {228, 0}, {228, 0}, {228, 0}, {228, 0},  {228, 0}, {228, 0},  {228, 0},
+    {228, 0}, {228, 2}, {230, 0}, {230, 0},  {230, 0}, {230, 0},  {230, 0},
+    {230, 0}, {230, 0}, {230, 0}, {230, 10},
+};
+const FX_WORD g_XFAElementChildrenData[] = {
+    XFA_ELEMENT_Extras,
+    XFA_ELEMENT_SubformSet,
+    XFA_ELEMENT_BreakBefore,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_BreakAfter,
+    XFA_ELEMENT_AlwaysEmbed,
+    XFA_ELEMENT_DefaultTypeface,
+    XFA_ELEMENT_NeverEmbed,
+    XFA_ELEMENT_Source,
+    XFA_ELEMENT_Equate,
+    XFA_ELEMENT_EquateRange,
+    XFA_ELEMENT_Ps,
+    XFA_ELEMENT_Pcl,
+    XFA_ELEMENT_Pdf,
+    XFA_ELEMENT_Zpl,
+    XFA_ELEMENT_LabelPrinter,
+    XFA_ELEMENT_WebClient,
+    XFA_ELEMENT_SubmitUrl,
+    XFA_ELEMENT_Driver,
+    XFA_ELEMENT_Typeface,
+    XFA_ELEMENT_SubjectDN,
+    XFA_ELEMENT_Certificate,
+    XFA_ELEMENT_SubformSet,
+    XFA_ELEMENT_Area,
+    XFA_ELEMENT_Field,
+    XFA_ELEMENT_ExclGroup,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_Draw,
+    XFA_ELEMENT_ExObject,
+    XFA_ELEMENT_EncryptionMethod,
+    XFA_ELEMENT_Ref,
+    XFA_ELEMENT_Event,
+    XFA_ELEMENT_SetProperty,
+    XFA_ELEMENT_BindItems,
+    XFA_ELEMENT_Connect,
+    XFA_ELEMENT_Pdf,
+    XFA_ELEMENT_Destination,
+    XFA_ELEMENT_Event,
+    XFA_ELEMENT_SetProperty,
+    XFA_ELEMENT_Field,
+    XFA_ELEMENT_Connect,
+    XFA_ELEMENT_Agent,
+    XFA_ELEMENT_PsMap,
+    XFA_ELEMENT_SubformSet,
+    XFA_ELEMENT_BreakBefore,
+    XFA_ELEMENT_Event,
+    XFA_ELEMENT_Area,
+    XFA_ELEMENT_SetProperty,
+    XFA_ELEMENT_Field,
+    XFA_ELEMENT_ExclGroup,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_Draw,
+    XFA_ELEMENT_ExObject,
+    XFA_ELEMENT_Proto,
+    XFA_ELEMENT_Connect,
+    XFA_ELEMENT_BreakAfter,
+    XFA_ELEMENT_Locale,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Font,
+    XFA_ELEMENT_Traverse,
+    XFA_ELEMENT_Map,
+    XFA_ELEMENT_DigestMethod,
+    XFA_ELEMENT_PageSet,
+    XFA_ELEMENT_PageArea,
+    XFA_ELEMENT_Encoding,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_SubmitUrl,
+    XFA_ELEMENT_Certificate,
+    XFA_ELEMENT_Area,
+    XFA_ELEMENT_Field,
+    XFA_ELEMENT_ContentArea,
+    XFA_ELEMENT_ExclGroup,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_Draw,
+    XFA_ELEMENT_Oid,
+    XFA_ELEMENT_Ref,
+    XFA_ELEMENT_ExcludeNS,
+    XFA_ELEMENT_Transform,
+    XFA_ELEMENT_SetProperty,
+    XFA_ELEMENT_Message,
+    XFA_ELEMENT_Log,
+    XFA_ELEMENT_Reason,
+    XFA_ELEMENT_Area,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Time,
+    XFA_ELEMENT_DateTime,
+    XFA_ELEMENT_Image,
+    XFA_ELEMENT_Decimal,
+    XFA_ELEMENT_Boolean,
+    XFA_ELEMENT_Integer,
+    XFA_ELEMENT_ExData,
+    XFA_ELEMENT_Date,
+    XFA_ELEMENT_Float,
+    XFA_ELEMENT_ExObject,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Time,
+    XFA_ELEMENT_DateTime,
+    XFA_ELEMENT_Image,
+    XFA_ELEMENT_Decimal,
+    XFA_ELEMENT_Boolean,
+    XFA_ELEMENT_Integer,
+    XFA_ELEMENT_ExData,
+    XFA_ELEMENT_Date,
+    XFA_ELEMENT_Float,
+    XFA_ELEMENT_Extras,
+    XFA_ELEMENT_Ui,
+    XFA_ELEMENT_SubformSet,
+    XFA_ELEMENT_Break,
+    XFA_ELEMENT_CheckButton,
+    XFA_ELEMENT_Arc,
+    XFA_ELEMENT_Mdp,
+    XFA_ELEMENT_BreakBefore,
+    XFA_ELEMENT_Oid,
+    XFA_ELEMENT_Ref,
+    XFA_ELEMENT_Margin,
+    XFA_ELEMENT_KeyUsage,
+    XFA_ELEMENT_ChoiceList,
+    XFA_ELEMENT_Para,
+    XFA_ELEMENT_Filter,
+    XFA_ELEMENT_Encoding,
+    XFA_ELEMENT_Event,
+    XFA_ELEMENT_DefaultUi,
+    XFA_ELEMENT_Barcode,
+    XFA_ELEMENT_SubjectDNs,
+    XFA_ELEMENT_Issuers,
+    XFA_ELEMENT_Button,
+    XFA_ELEMENT_Format,
+    XFA_ELEMENT_Border,
+    XFA_ELEMENT_Area,
+    XFA_ELEMENT_Hyphenation,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Time,
+    XFA_ELEMENT_Certificates,
+    XFA_ELEMENT_SetProperty,
+    XFA_ELEMENT_DateTime,
+    XFA_ELEMENT_Comb,
+    XFA_ELEMENT_Pattern,
+    XFA_ELEMENT_Field,
+    XFA_ELEMENT_ContentArea,
+    XFA_ELEMENT_Solid,
+    XFA_ELEMENT_Edge,
+    XFA_ELEMENT_Stipple,
+    XFA_ELEMENT_ExclGroup,
+    XFA_ELEMENT_ToolTip,
+    XFA_ELEMENT_Reason,
+    XFA_ELEMENT_Execute,
+    XFA_ELEMENT_DateTimeEdit,
+    XFA_ELEMENT_Image,
+    XFA_ELEMENT_TimeStamp,
+    XFA_ELEMENT_Decimal,
+    XFA_ELEMENT_Subform,
+    XFA_ELEMENT_Handler,
+    XFA_ELEMENT_Boolean,
+    XFA_ELEMENT_Message,
+    XFA_ELEMENT_Assist,
+    XFA_ELEMENT_Picture,
+    XFA_ELEMENT_Traversal,
+    XFA_ELEMENT_Corner,
+    XFA_ELEMENT_Color,
+    XFA_ELEMENT_Keep,
+    XFA_ELEMENT_ImageEdit,
+    XFA_ELEMENT_Validate,
+    XFA_ELEMENT_DigestMethods,
+    XFA_ELEMENT_PageSet,
+    XFA_ELEMENT_Integer,
+    XFA_ELEMENT_Traverse,
+    XFA_ELEMENT_Encodings,
+    XFA_ELEMENT_Signing,
+    XFA_ELEMENT_Script,
+    XFA_ELEMENT_PasswordEdit,
+    XFA_ELEMENT_NumericEdit,
+    XFA_ELEMENT_PageArea,
+    XFA_ELEMENT_Oids,
+    XFA_ELEMENT_Signature,
+    XFA_ELEMENT_Caption,
+    XFA_ELEMENT_ExData,
+    XFA_ELEMENT_Manifest,
+    XFA_ELEMENT_Overflow,
+    XFA_ELEMENT_Linear,
+    XFA_ELEMENT_DigestMethod,
+    XFA_ELEMENT_Medium,
+    XFA_ELEMENT_TextEdit,
+    XFA_ELEMENT_SignData,
+    XFA_ELEMENT_Rectangle,
+    XFA_ELEMENT_Date,
+    XFA_ELEMENT_Desc,
+    XFA_ELEMENT_Encrypt,
+    XFA_ELEMENT_Draw,
+    XFA_ELEMENT_Speak,
+    XFA_ELEMENT_Reasons,
+    XFA_ELEMENT_AppearanceFilter,
+    XFA_ELEMENT_Fill,
+    XFA_ELEMENT_Font,
+    XFA_ELEMENT_Certificate,
+    XFA_ELEMENT_Float,
+    XFA_ELEMENT_Value,
+    XFA_ELEMENT_Bookend,
+    XFA_ELEMENT_ExObject,
+    XFA_ELEMENT_BindItems,
+    XFA_ELEMENT_Calculate,
+    XFA_ELEMENT_Extras,
+    XFA_ELEMENT_Connect,
+    XFA_ELEMENT_Submit,
+    XFA_ELEMENT_SubjectDN,
+    XFA_ELEMENT_Radial,
+    XFA_ELEMENT_Variables,
+    XFA_ELEMENT_LockDocument,
+    XFA_ELEMENT_BreakAfter,
+    XFA_ELEMENT_Line,
+    XFA_ELEMENT_Occur,
+    XFA_ELEMENT_Items,
+    XFA_ELEMENT_Extras,
+    XFA_ELEMENT_WsdlConnection,
+    XFA_ELEMENT_XsdConnection,
+    XFA_ELEMENT_XmlConnection,
+    XFA_ELEMENT_SignData,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Time,
+    XFA_ELEMENT_DateTime,
+    XFA_ELEMENT_Image,
+    XFA_ELEMENT_Decimal,
+    XFA_ELEMENT_Boolean,
+    XFA_ELEMENT_Integer,
+    XFA_ELEMENT_Script,
+    XFA_ELEMENT_ExData,
+    XFA_ELEMENT_Manifest,
+    XFA_ELEMENT_Date,
+    XFA_ELEMENT_Float,
+    XFA_ELEMENT_Command,
+    XFA_ELEMENT_Bind,
+    XFA_ELEMENT_Text,
+    XFA_ELEMENT_Time,
+    XFA_ELEMENT_DateTime,
+    XFA_ELEMENT_Image,
+    XFA_ELEMENT_Decimal,
+    XFA_ELEMENT_Boolean,
+    XFA_ELEMENT_Integer,
+    XFA_ELEMENT_ExData,
+    XFA_ELEMENT_Date,
+    XFA_ELEMENT_Float,
+};
+const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[] = {
+    {0, 3},    {3, 2},    {5, 3},    {8, 10},   {18, 2},   {20, 6},   {26, 2},
+    {28, 1},   {29, 13},  {42, 2},   {44, 1},   {45, 2},   {47, 2},   {49, 7},
+    {56, 0},   {56, 4},   {60, 2},   {62, 7},   {69, 0},   {69, 0},   {69, 2},
+    {71, 2},   {73, 8},   {81, 5},   {86, 8},   {94, 4},   {98, 3},   {101, 3},
+    {104, 3},  {107, 6},  {113, 2},  {115, 2},  {117, 2},  {119, 2},  {121, 3},
+    {124, 2},  {126, 7},  {133, 13}, {146, 2},  {148, 6},  {154, 2},  {156, 3},
+    {159, 1},  {160, 17}, {177, 2},  {179, 2},  {181, 6},  {187, 2},  {189, 2},
+    {191, 3},  {194, 7},  {201, 2},  {203, 3},  {206, 0},  {206, 21}, {227, 1},
+    {228, 3},  {231, 2},  {233, 0},  {233, 2},  {235, 2},  {237, 6},  {243, 0},
+    {243, 4},  {247, 4},  {251, 0},  {251, 2},  {253, 2},  {255, 0},  {255, 0},
+    {255, 2},  {257, 2},  {259, 4},  {263, 3},  {266, 7},  {273, 10}, {283, 9},
+    {292, 6},  {298, 4},  {302, 2},  {304, 2},  {306, 6},  {312, 4},  {316, 3},
+    {319, 2},  {321, 2},  {323, 4},  {327, 4},  {331, 4},  {335, 4},  {339, 2},
+    {341, 2},  {343, 2},  {345, 22}, {367, 3},  {370, 2},  {372, 2},  {374, 2},
+    {376, 9},  {385, 0},  {385, 4},  {389, 3},  {392, 0},  {392, 2},  {394, 7},
+    {401, 4},  {405, 2},  {407, 4},  {411, 0},  {411, 21}, {432, 4},  {436, 3},
+    {439, 4},  {443, 6},  {449, 2},  {451, 5},  {456, 2},  {458, 8},  {466, 1},
+    {467, 2},  {469, 2},  {471, 5},  {476, 0},  {476, 2},  {478, 2},  {480, 6},
+    {486, 26}, {512, 4},  {516, 2},  {518, 2},  {520, 4},  {524, 0},  {524, 2},
+    {526, 2},  {528, 2},  {530, 2},  {532, 5},  {537, 2},  {539, 3},  {542, 2},
+    {544, 4},  {548, 5},  {553, 2},  {555, 0},  {555, 2},  {557, 4},  {561, 5},
+    {566, 3},  {569, 2},  {571, 3},  {574, 0},  {574, 2},  {576, 9},  {585, 2},
+    {587, 5},  {592, 6},  {598, 5},  {603, 4},  {607, 4},  {611, 8},  {619, 4},
+    {623, 0},  {623, 7},  {630, 4},  {634, 4},  {638, 5},  {643, 2},  {645, 2},
+    {647, 4},  {651, 4},  {655, 2},  {657, 2},  {659, 1},  {660, 2},  {662, 5},
+    {667, 4},  {671, 3},  {674, 2},  {676, 2},  {678, 4},  {682, 0},  {682, 9},
+    {691, 2},  {693, 2},  {695, 5},  {700, 4},  {704, 3},  {707, 2},  {709, 10},
+    {719, 2},  {721, 4},  {725, 4},  {729, 2},  {731, 6},  {737, 2},  {739, 2},
+    {741, 9},  {750, 1},  {751, 4},  {755, 3},  {758, 5},  {763, 6},  {769, 4},
+    {773, 1},  {774, 4},  {778, 0},  {778, 3},  {781, 1},  {782, 5},  {787, 10},
+    {797, 7},  {804, 3},  {807, 2},  {809, 5},  {814, 2},  {816, 0},  {816, 2},
+    {818, 2},  {820, 2},  {822, 6},  {828, 2},  {830, 1},  {831, 2},  {833, 2},
+    {835, 8},  {843, 2},  {845, 4},  {849, 4},  {853, 4},  {857, 2},  {859, 2},
+    {861, 2},  {863, 3},  {866, 2},  {868, 2},  {870, 4},  {874, 3},  {877, 5},
+    {882, 20}, {902, 2},  {904, 0},  {904, 2},  {906, 6},  {912, 1},  {913, 2},
+    {915, 1},  {916, 2},  {918, 4},  {922, 2},  {924, 2},  {926, 4},  {930, 4},
+    {934, 20}, {954, 1},  {955, 2},  {957, 4},  {961, 4},  {965, 2},  {967, 2},
+    {969, 4},  {973, 2},  {975, 0},  {975, 2},  {977, 5},  {982, 5},  {987, 8},
+    {995, 2},  {997, 2},  {999, 4},  {1003, 4}, {1007, 2}, {1009, 4}, {1013, 0},
+    {1013, 1}, {1014, 2}, {1016, 9}, {1025, 2}, {1027, 0}, {1027, 8}, {1035, 2},
+    {1037, 2}, {1039, 0}, {1039, 4}, {1043, 2}, {1045, 0}, {1045, 2}, {1047, 3},
+    {1050, 2}, {1052, 5}, {1057, 2}, {1059, 2}, {1061, 4}, {1065, 3}, {1068, 0},
+    {1068, 4}, {1072, 2}, {1074, 2}, {1076, 3}, {1079, 4}, {1083, 8}, {1091, 5},
+    {1096, 0}, {1096, 4}, {1100, 6}, {1106, 2}, {1108, 1}, {1109, 2}, {1111, 2},
+    {1113, 2}, {1115, 1}, {1116, 2}, {1118, 7},
+};
+const uint8_t g_XFAElementAttributeData[] = {
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Max,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_EofAction,
+    XFA_ATTRIBUTE_CursorType,
+    XFA_ATTRIBUTE_LockType,
+    XFA_ATTRIBUTE_BofAction,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_CursorLocation,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Relation,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_BeforeTarget,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_OverflowTarget,
+    XFA_ATTRIBUTE_OverflowLeader,
+    XFA_ATTRIBUTE_OverflowTrailer,
+    XFA_ATTRIBUTE_StartNew,
+    XFA_ATTRIBUTE_BookendTrailer,
+    XFA_ATTRIBUTE_After,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_BookendLeader,
+    XFA_ATTRIBUTE_AfterTarget,
+    XFA_ATTRIBUTE_Before,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_AllowNeutral,
+    XFA_ATTRIBUTE_Mark,
+    XFA_ATTRIBUTE_Shape,
+    XFA_ATTRIBUTE_Size,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_StartAngle,
+    XFA_ATTRIBUTE_SweepAngle,
+    XFA_ATTRIBUTE_Circular,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Hand,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Bind,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_From,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_SignatureType,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Permissions,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_StartNew,
+    XFA_ATTRIBUTE_Trailer,
+    XFA_ATTRIBUTE_TargetType,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_Leader,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_TimeStamp,
+    XFA_ATTRIBUTE_Uuid,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_LeftInset,
+    XFA_ATTRIBUTE_BottomInset,
+    XFA_ATTRIBUTE_TopInset,
+    XFA_ATTRIBUTE_RightInset,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_NonRepudiation,
+    XFA_ATTRIBUTE_EncipherOnly,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_DigitalSignature,
+    XFA_ATTRIBUTE_CrlSign,
+    XFA_ATTRIBUTE_KeyAgreement,
+    XFA_ATTRIBUTE_KeyEncipherment,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_DataEncipherment,
+    XFA_ATTRIBUTE_KeyCertSign,
+    XFA_ATTRIBUTE_DecipherOnly,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Open,
+    XFA_ATTRIBUTE_CommitOn,
+    XFA_ATTRIBUTE_TextEntry,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_HAlign,
+    XFA_ATTRIBUTE_TextIndent,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Widows,
+    XFA_ATTRIBUTE_MarginRight,
+    XFA_ATTRIBUTE_MarginLeft,
+    XFA_ATTRIBUTE_RadixOffset,
+    XFA_ATTRIBUTE_Preserve,
+    XFA_ATTRIBUTE_SpaceBelow,
+    XFA_ATTRIBUTE_VAlign,
+    XFA_ATTRIBUTE_TabDefault,
+    XFA_ATTRIBUTE_TabStops,
+    XFA_ATTRIBUTE_Orphans,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_LineHeight,
+    XFA_ATTRIBUTE_SpaceAbove,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Version,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_AddRevocationInfo,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Listen,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Activity,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_DataRowCount,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_DataPrep,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_TextLocation,
+    XFA_ATTRIBUTE_ModuleWidth,
+    XFA_ATTRIBUTE_PrintCheckDigit,
+    XFA_ATTRIBUTE_ModuleHeight,
+    XFA_ATTRIBUTE_StartChar,
+    XFA_ATTRIBUTE_Truncate,
+    XFA_ATTRIBUTE_WideNarrowRatio,
+    XFA_ATTRIBUTE_ErrorCorrectionLevel,
+    XFA_ATTRIBUTE_UpsMode,
+    XFA_ATTRIBUTE_Checksum,
+    XFA_ATTRIBUTE_CharEncoding,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_DataColumnCount,
+    XFA_ATTRIBUTE_RowColumnRatio,
+    XFA_ATTRIBUTE_DataLength,
+    XFA_ATTRIBUTE_EndChar,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Format,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Output,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Input,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_DataDescription,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Highlight,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Break,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Hand,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Level,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_ColSpan,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_WordCharacterCount,
+    XFA_ATTRIBUTE_Hyphenate,
+    XFA_ATTRIBUTE_ExcludeInitialCap,
+    XFA_ATTRIBUTE_PushCharacterCount,
+    XFA_ATTRIBUTE_RemainCharacterCount,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_ExcludeAllCaps,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Rid,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_MaxChars,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Url,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_CredentialServerPolicy,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_UrlPolicy,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Connection,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_NumberOfCells,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_H,
+    XFA_ATTRIBUTE_W,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_HAlign,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Access,
+    XFA_ATTRIBUTE_Rotate,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_VAlign,
+    XFA_ATTRIBUTE_MaxH,
+    XFA_ATTRIBUTE_MaxW,
+    XFA_ATTRIBUTE_MinH,
+    XFA_ATTRIBUTE_MinW,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_ColSpan,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Locale,
+    XFA_ATTRIBUTE_AnchorType,
+    XFA_ATTRIBUTE_AccessKey,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_H,
+    XFA_ATTRIBUTE_W,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Cap,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Stroke,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Thickness,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Rate,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_SourceBelow,
+    XFA_ATTRIBUTE_OutputBelow,
+    XFA_ATTRIBUTE_SourceAbove,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_H,
+    XFA_ATTRIBUTE_W,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_HAlign,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Access,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_VAlign,
+    XFA_ATTRIBUTE_MaxH,
+    XFA_ATTRIBUTE_MaxW,
+    XFA_ATTRIBUTE_MinH,
+    XFA_ATTRIBUTE_MinW,
+    XFA_ATTRIBUTE_Layout,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_ColSpan,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_AnchorType,
+    XFA_ATTRIBUTE_AccessKey,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Rid,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Scope,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Connection,
+    XFA_ATTRIBUTE_RunAt,
+    XFA_ATTRIBUTE_ExecuteType,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Picker,
+    XFA_ATTRIBUTE_HScrollPolicy,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_ContentType,
+    XFA_ATTRIBUTE_TransferEncoding,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Aspect,
+    XFA_ATTRIBUTE_Href,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Server,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_FracDigits,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_LeadDigits,
+    XFA_ATTRIBUTE_H,
+    XFA_ATTRIBUTE_W,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_HAlign,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_AllowMacro,
+    XFA_ATTRIBUTE_ColumnWidths,
+    XFA_ATTRIBUTE_Access,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_VAlign,
+    XFA_ATTRIBUTE_MaxH,
+    XFA_ATTRIBUTE_MaxW,
+    XFA_ATTRIBUTE_MinH,
+    XFA_ATTRIBUTE_MinW,
+    XFA_ATTRIBUTE_Layout,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_MergeMode,
+    XFA_ATTRIBUTE_ColSpan,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Locale,
+    XFA_ATTRIBUTE_AnchorType,
+    XFA_ATTRIBUTE_RestoreState,
+    XFA_ATTRIBUTE_Scope,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Timeout,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Mode,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Role,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Stroke,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Inverted,
+    XFA_ATTRIBUTE_Thickness,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Join,
+    XFA_ATTRIBUTE_Radius,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_CSpace,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Next,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Previous,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Intact,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_CommandType,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Data,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_ScriptTest,
+    XFA_ATTRIBUTE_NullTest,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_FormatTest,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Relation,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_DuplexImposition,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_To,
+    XFA_ATTRIBUTE_Force,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_From,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_DataDescription,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Operation,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_BaseProfile,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_ContentType,
+    XFA_ATTRIBUTE_RunAt,
+    XFA_ATTRIBUTE_Binding,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_PasswordChar,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_HScrollPolicy,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_HScrollPolicy,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_PagePosition,
+    XFA_ATTRIBUTE_OddOrEven,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_InitialNumber,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Numbered,
+    XFA_ATTRIBUTE_BlankOrNotBlank,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Reserve,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Placement,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Rid,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_ContentType,
+    XFA_ATTRIBUTE_TransferEncoding,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_MaxLength,
+    XFA_ATTRIBUTE_Href,
+    XFA_ATTRIBUTE_Abbr,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_WritingScript,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Action,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Trailer,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_Leader,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_To,
+    XFA_ATTRIBUTE_UnicodeRange,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_From,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_TrayOut,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Orientation,
+    XFA_ATTRIBUTE_ImagingBBox,
+    XFA_ATTRIBUTE_Short,
+    XFA_ATTRIBUTE_TrayIn,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Stock,
+    XFA_ATTRIBUTE_Long,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_VScrollPolicy,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_AllowRichText,
+    XFA_ATTRIBUTE_MultiLine,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_HScrollPolicy,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_MaxEntries,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_ContentType,
+    XFA_ATTRIBUTE_Contains,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_IsNull,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_DataDescription,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Operation,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_ContentType,
+    XFA_ATTRIBUTE_TransferEncoding,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Match,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Hand,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_H,
+    XFA_ATTRIBUTE_W,
+    XFA_ATTRIBUTE_X,
+    XFA_ATTRIBUTE_Y,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_HAlign,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Rotate,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_VAlign,
+    XFA_ATTRIBUTE_MaxH,
+    XFA_ATTRIBUTE_MaxW,
+    XFA_ATTRIBUTE_MinH,
+    XFA_ATTRIBUTE_MinW,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_ColSpan,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Locale,
+    XFA_ATTRIBUTE_AnchorType,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Rid,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Priority,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Disable,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_LineThrough,
+    XFA_ATTRIBUTE_Typeface,
+    XFA_ATTRIBUTE_FontHorizontalScale,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_KerningMode,
+    XFA_ATTRIBUTE_Underline,
+    XFA_ATTRIBUTE_BaselineShift,
+    XFA_ATTRIBUTE_OverlinePeriod,
+    XFA_ATTRIBUTE_LetterSpacing,
+    XFA_ATTRIBUTE_LineThroughPeriod,
+    XFA_ATTRIBUTE_FontVerticalScale,
+    XFA_ATTRIBUTE_PsName,
+    XFA_ATTRIBUTE_Size,
+    XFA_ATTRIBUTE_Posture,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Weight,
+    XFA_ATTRIBUTE_UnderlinePeriod,
+    XFA_ATTRIBUTE_Overline,
+    XFA_ATTRIBUTE_GenericFamily,
+    XFA_ATTRIBUTE_Checksum,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Relevant,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Override,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Trailer,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Leader,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_CodeType,
+    XFA_ATTRIBUTE_Archive,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_CodeBase,
+    XFA_ATTRIBUTE_ClassId,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Connection,
+    XFA_ATTRIBUTE_LabelRef,
+    XFA_ATTRIBUTE_ValueRef,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Override,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Value,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Timeout,
+    XFA_ATTRIBUTE_Connection,
+    XFA_ATTRIBUTE_Usage,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_DelayedOpen,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Format,
+    XFA_ATTRIBUTE_EmbedPDF,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_TextEncoding,
+    XFA_ATTRIBUTE_XdpContent,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Delimiter,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_StartNew,
+    XFA_ATTRIBUTE_Trailer,
+    XFA_ATTRIBUTE_TargetType,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Target,
+    XFA_ATTRIBUTE_Leader,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Slope,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Hand,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Max,
+    XFA_ATTRIBUTE_Min,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Initial,
+    XFA_ATTRIBUTE_Usehref,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Abbr,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Desc,
+    XFA_ATTRIBUTE_Lock,
+    XFA_ATTRIBUTE_Id,
+    XFA_ATTRIBUTE_Name,
+    XFA_ATTRIBUTE_Ref,
+    XFA_ATTRIBUTE_Use,
+    XFA_ATTRIBUTE_Presence,
+    XFA_ATTRIBUTE_Save,
+    XFA_ATTRIBUTE_Usehref,
+};
+const XFA_PACKETINFO g_XFAPacketData[] = {
+    {0x0, NULL, XFA_XDPPACKET_USER, NULL,
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
+    {0x811929d, L"sourceSet", XFA_XDPPACKET_SourceSet,
+     L"http://www.xfa.org/schema/xfa-source-set/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0xb843dba, L"pdf", XFA_XDPPACKET_Pdf, L"http://ns.adobe.com/xdp/pdf/",
+     XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0xc56afbf, L"xdc", XFA_XDPPACKET_Xdc, L"http://www.xfa.org/schema/xdc/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0xc56afcc, L"xdp", XFA_XDPPACKET_XDP, L"http://ns.adobe.com/xdp/",
+     XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x132a8fbc, L"xmpmeta", XFA_XDPPACKET_Xmpmeta,
+     L"http://ns.adobe.com/xmpmeta/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
+    {0x48d004a8, L"xfdf", XFA_XDPPACKET_Xfdf, L"http://ns.adobe.com/xfdf/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x4e1e39b6, L"config", XFA_XDPPACKET_Config,
+     L"http://www.xfa.org/schema/xci/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x5473b6dc, L"localeSet", XFA_XDPPACKET_LocaleSet,
+     L"http://www.xfa.org/schema/xfa-locale-set/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x6038580a, L"stylesheet", XFA_XDPPACKET_Stylesheet,
+     L"http://www.w3.org/1999/XSL/Transform",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
+    {0x803550fc, L"template", XFA_XDPPACKET_Template,
+     L"http://www.xfa.org/schema/xfa-template/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x8b036f32, L"signature", XFA_XDPPACKET_Signature,
+     L"http://www.w3.org/2000/09/xmldsig#",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0x99b95079, L"datasets", XFA_XDPPACKET_Datasets,
+     L"http://www.xfa.org/schema/xfa-data/",
+     XFA_XDPPACKET_FLAGS_PREFIXMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0xcd309ff4, L"form", XFA_XDPPACKET_Form,
+     L"http://www.xfa.org/schema/xfa-form/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+    {0xe14c801c, L"connectionSet", XFA_XDPPACKET_ConnectionSet,
+     L"http://www.xfa.org/schema/xfa-connection-set/",
+     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
+};
+const int32_t g_iXFAPacketCount =
+    sizeof(g_XFAPacketData) / sizeof(XFA_PACKETINFO);
+const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[] = {
+    {0, 0, 0, 2, 316},      {0, 0, 2, 2, 316},       {0, 0, 4, 2, 316},
+    {0, 0, 6, 8, 316},      {0, 0, 14, 4, 316},      {0, 0, 18, 5, 317},
+    {0, 0, 23, 2, 316},     {0, 0, 25, 1, 316},      {0, 0, 26, 12, 316},
+    {0, 0, 38, 2, 316},     {0, 0, 40, 1, 316},      {0, 0, 41, 3, 316},
+    {0, 0, 44, 2, 316},     {0, 0, 46, 6, 316},      {0, 0, 52, 0, 316},
+    {0, 0, 52, 2, 319},     {0, 0, 54, 2, 316},      {0, 0, 56, 6, 316},
+    {0, 0, 62, 0, 316},     {0, 0, 62, 0, 316},      {0, 0, 62, 2, 316},
+    {0, 0, 64, 2, 316},     {0, 0, 66, 6, 316},      {0, 0, 72, 4, 316},
+    {0, 0, 76, 7, 316},     {0, 0, 83, 2, 320},      {0, 0, 85, 3, 316},
+    {0, 0, 88, 3, 316},     {0, 0, 91, 2, 320},      {0, 0, 93, 6, 320},
+    {0, 0, 99, 4, 316},     {0, 0, 103, 2, 316},     {0, 0, 105, 3, 319},
+    {0, 0, 108, 4, 316},    {0, 0, 112, 3, 316},     {0, 0, 115, 2, 316},
+    {0, 0, 117, 6, 316},    {0, 0, 123, 12, 316},    {0, 0, 135, 2, 316},
+    {0, 0, 137, 5, 316},    {0, 0, 142, 2, 316},     {0, 0, 144, 3, 316},
+    {0, 0, 147, 1, 316},    {0, 0, 148, 14, 316},    {0, 0, 162, 2, 316},
+    {0, 0, 164, 2, 316},    {0, 0, 166, 3, 316},     {0, 0, 169, 2, 316},
+    {0, 0, 171, 2, 316},    {0, 0, 173, 2, 316},     {0, 0, 175, 4, 316},
+    {0, 0, 179, 2, 316},    {0, 0, 181, 2, 316},     {0, 0, 183, 0, 319},
+    {0, 0, 183, 20, 316},   {0, 0, 203, 1, 316},     {0, 0, 204, 3, 316},
+    {0, 0, 207, 2, 316},    {0, 0, 209, 0, 316},     {0, 0, 209, 2, 316},
+    {0, 0, 211, 2, 316},    {0, 0, 213, 4, 320},     {0, 0, 217, 0, 316},
+    {0, 0, 217, 1, 316},    {0, 0, 218, 3, 316},     {0, 4, 221, 0, 312},
+    {4, 1, 221, 1, 316},    {5, 0, 222, 2, 316},     {5, 1, 224, 3, -1},
+    {6, 0, 227, 0, 316},    {6, 0, 227, 2, 316},     {6, 0, 229, 2, 316},
+    {6, 0, 231, 3, 316},    {6, 0, 234, 2, 316},     {6, 0, 236, 6, 316},
+    {6, 0, 242, 10, 317},   {6, 0, 252, 9, 316},     {6, 0, 261, 5, 318},
+    {6, 0, 266, 4, 318},    {6, 0, 270, 2, 316},     {6, 0, 272, 2, 316},
+    {6, 0, 274, 5, 316},    {6, 0, 279, 3, 316},     {6, 0, 282, 2, 316},
+    {6, 0, 284, 2, 316},    {6, 0, 286, 2, 316},     {6, 0, 288, 2, 316},
+    {6, 0, 290, 4, 316},    {6, 0, 294, 3, 316},     {6, 0, 297, 3, 316},
+    {6, 0, 300, 2, 316},    {6, 0, 302, 2, 316},     {6, 0, 304, 2, 316},
+    {6, 13, 306, 36, 317},  {19, 0, 342, 3, 316},    {19, 0, 345, 2, 316},
+    {19, 0, 347, 2, 316},   {19, 0, 349, 2, 316},    {19, 0, 351, 7, 317},
+    {19, 2, 358, 16, 312},  {21, 0, 374, 2, 320},    {21, 0, 376, 2, 316},
+    {21, 0, 378, 0, 316},   {21, 0, 378, 2, 316},    {21, 0, 380, 6, 316},
+    {21, 0, 386, 3, 316},   {21, 0, 389, 2, 316},    {21, 0, 391, 4, 316},
+    {21, 0, 395, 0, 316},   {21, 5, 395, 30, 316},   {26, 0, 425, 2, 320},
+    {26, 0, 427, 3, 316},   {26, 0, 430, 2, 320},    {26, 0, 432, 5, 316},
+    {26, 0, 437, 2, 316},   {26, 0, 439, 3, 316},    {26, 0, 442, 2, 316},
+    {26, 0, 444, 8, 316},   {26, 0, 452, 1, 316},    {26, 0, 453, 2, 316},
+    {26, 0, 455, 2, 316},   {26, 0, 457, 4, 316},    {26, 0, 461, 0, 316},
+    {26, 0, 461, 2, 316},   {26, 0, 463, 2, 316},    {26, 0, 465, 6, 318},
+    {26, 5, 471, 31, 317},  {31, 0, 502, 2, 320},    {31, 0, 504, 2, 316},
+    {31, 0, 506, 2, 316},   {31, 0, 508, 4, 320},    {31, 16, 512, 14, 312},
+    {47, 0, 526, 2, 316},   {47, 0, 528, 2, 316},    {47, 0, 530, 2, 316},
+    {47, 0, 532, 2, 316},   {47, 0, 534, 3, 316},    {47, 0, 537, 2, 316},
+    {47, 0, 539, 3, 316},   {47, 0, 542, 3, 316},    {47, 0, 545, 4, 318},
+    {47, 0, 549, 4, 316},   {47, 0, 553, 2, 316},    {47, 0, 555, 0, 316},
+    {47, 0, 555, 2, 316},   {47, 0, 557, 3, 316},    {47, 0, 560, 6, 316},
+    {47, 0, 566, 2, 316},   {47, 0, 568, 2, 316},    {47, 0, 570, 3, 316},
+    {47, 19, 573, 1, 312},  {66, 0, 574, 2, 316},    {66, 0, 576, 8, 316},
+    {66, 0, 584, 2, 316},   {66, 0, 586, 4, 316},    {66, 0, 590, 5, 316},
+    {66, 0, 595, 3, 316},   {66, 0, 598, 2, 320},    {66, 0, 600, 3, 316},
+    {66, 0, 603, 7, 316},   {66, 0, 610, 3, 316},    {66, 0, 613, 0, 316},
+    {66, 0, 613, 4, 317},   {66, 0, 617, 4, 318},    {66, 0, 621, 2, 320},
+    {66, 0, 623, 5, 316},   {66, 0, 628, 2, 316},    {66, 0, 630, 2, 316},
+    {66, 0, 632, 2, 320},   {66, 0, 634, 2, 320},    {66, 0, 636, 4, 316},
+    {66, 0, 640, 2, 316},   {66, 0, 642, 1, 316},    {66, 0, 643, 1, 316},
+    {66, 0, 644, 4, 316},   {66, 0, 648, 3, 316},    {66, 7, 651, 2, 319},
+    {73, 0, 653, 2, 316},   {73, 0, 655, 2, 316},    {73, 0, 657, 3, 316},
+    {73, 4, 660, 4, 312},   {77, 0, 664, 10, 316},   {77, 0, 674, 2, 316},
+    {77, 0, 676, 4, 316},   {77, 0, 680, 4, 316},    {77, 0, 684, 3, 316},
+    {77, 0, 687, 2, 316},   {77, 0, 689, 2, 316},    {77, 0, 691, 8, 317},
+    {77, 0, 699, 3, 316},   {77, 0, 702, 3, 316},    {77, 0, 705, 2, 316},
+    {77, 0, 707, 2, 316},   {77, 0, 709, 5, 316},    {77, 0, 714, 4, 316},
+    {77, 0, 718, 2, 316},   {77, 0, 720, 8, 318},    {77, 0, 728, 1, 316},
+    {77, 0, 729, 2, 320},   {77, 0, 731, 3, 316},    {77, 1, 734, 4, 316},
+    {78, 0, 738, 5, 316},   {78, 0, 743, 3, 316},    {78, 0, 746, 1, 316},
+    {78, 0, 747, 2, 320},   {78, 0, 749, 0, 313},    {78, 0, 749, 2, 316},
+    {78, 5, 751, 3, 316},   {83, 0, 754, 5, 316},    {83, 0, 759, 7, 316},
+    {83, 0, 766, 6, 316},   {83, 0, 772, 3, 316},    {83, 0, 775, 2, 316},
+    {83, 0, 777, 5, 316},   {83, 0, 782, 2, 316},    {83, 0, 784, 0, 314},
+    {83, 0, 784, 2, 316},   {83, 0, 786, 1, 316},    {83, 0, 787, 2, 316},
+    {83, 0, 789, 5, 316},   {83, 0, 794, 2, 316},    {83, 0, 796, 1, 316},
+    {83, 0, 797, 2, 316},   {83, 0, 799, 2, 316},    {83, 0, 801, 6, 316},
+    {83, 0, 807, 2, 316},   {83, 0, 809, 2, 320},    {83, 0, 811, 3, 316},
+    {83, 0, 814, 4, 316},   {83, 0, 818, 2, 316},    {83, 0, 820, 2, 316},
+    {83, 0, 822, 2, 316},   {83, 0, 824, 2, 316},    {83, 0, 826, 2, 316},
+    {83, 0, 828, 2, 316},   {83, 0, 830, 4, 318},    {83, 1, 834, 2, 316},
+    {84, 0, 836, 5, 316},   {84, 0, 841, 20, 317},   {84, 0, 861, 2, 316},
+    {84, 0, 863, 0, 316},   {84, 0, 863, 2, 316},    {84, 0, 865, 4, 320},
+    {84, 0, 869, 0, 316},   {84, 0, 869, 2, 316},    {84, 0, 871, 1, 316},
+    {84, 0, 872, 2, 316},   {84, 0, 874, 3, 316},    {84, 0, 877, 2, 316},
+    {84, 0, 879, 2, 316},   {84, 0, 881, 4, 316},    {84, 0, 885, 3, 316},
+    {84, 0, 888, 17, 316},  {84, 6, 905, 1, 319},    {90, 0, 906, 2, 316},
+    {90, 0, 908, 2, 320},   {90, 0, 910, 2, 320},    {90, 0, 912, 2, 316},
+    {90, 0, 914, 2, 316},   {90, 0, 916, 4, 318},    {90, 0, 920, 2, 316},
+    {90, 5, 922, 0, 312},   {95, 0, 922, 2, 316},    {95, 0, 924, 4, 316},
+    {95, 0, 928, 4, 316},   {95, 0, 932, 6, 316},    {95, 0, 938, 2, 316},
+    {95, 0, 940, 4, 316},   {95, 0, 944, 3, 316},    {95, 0, 947, 3, 316},
+    {95, 0, 950, 2, 316},   {95, 0, 952, 3, 316},    {95, 0, 955, 0, 316},
+    {95, 0, 955, 0, 316},   {95, 0, 955, 2, 316},    {95, 0, 957, 7, 316},
+    {95, 0, 964, 2, 316},   {95, 0, 966, 0, 319},    {95, 0, 966, 7, 316},
+    {95, 0, 973, 2, 316},   {95, 0, 975, 2, 316},    {95, 3, 977, 1, 316},
+    {98, 0, 978, 2, 320},   {98, 0, 980, 4, 316},    {98, 0, 984, 0, 316},
+    {98, 0, 984, 2, 316},   {98, 0, 986, 2, 316},    {98, 0, 988, 4, 316},
+    {98, 0, 992, 1, 316},   {98, 0, 993, 2, 316},    {98, 0, 995, 2, 316},
+    {98, 0, 997, 3, 316},   {98, 0, 1000, 2, 317},   {98, 0, 1002, 0, 316},
+    {98, 0, 1002, 4, 316},  {98, 0, 1006, 4, 316},   {98, 0, 1010, 2, 316},
+    {98, 0, 1012, 3, 316},  {98, 0, 1015, 4, 316},   {98, 0, 1019, 7, 316},
+    {98, 0, 1026, 4, 316},  {98, 0, 1030, 1, 313},   {98, 17, 1031, 3, 316},
+    {115, 0, 1034, 5, 316}, {115, 0, 1039, 2, 316},  {115, 0, 1041, 1, 316},
+    {115, 0, 1042, 4, 316}, {115, 0, 1046, 2, 316},  {115, 0, 1048, 2, 316},
+    {115, 0, 1050, 1, 316}, {115, 0, 1051, 2, 316},  {115, 0, 1053, 5, 316},
+    {115, 0, 1058, 1, -1},  {115, 4, 1059, 1, 312},  {119, 1, 1060, 0, 313},
+    {120, 2, 1060, 8, 312}, {122, 11, 1068, 6, 315}, {133, 2, 1074, 0, 316},
+    {135, 0, 1074, 0, 316}, {135, 3, 1074, 2, 316},  {138, 0, 1076, 2, 316},
+};
+const XFA_METHODINFO g_SomMethodData[] = {
+    {0x3c752495, L"verify", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
+                                Script_SignaturePseudoModel_Verify},
+    {0xa68635f1, L"sign", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
+                              Script_SignaturePseudoModel_Sign},
+    {0xa7f2c5e6, L"enumerate",
+     (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
+         Script_SignaturePseudoModel_Enumerate},
+    {0xd8ed1467, L"clear", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
+                               Script_SignaturePseudoModel_Clear},
+    {0x4bdcce13, L"execute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_WsdlConnection_Execute},
+    {0x1c296ba4, L"restore",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Delta_Restore},
+    {0x7d123a9, L"clearItems",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ClearItems},
+    {0xfb0b007, L"execEvent",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecEvent},
+    {0x6716ce97, L"execInitialize",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecInitialize},
+    {0x7bb919c2, L"deleteItem",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_DeleteItem},
+    {0x9f053d5e, L"getSaveItem",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetSaveItem},
+    {0xbbd32747, L"boundItem",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_BoundItem},
+    {0xc492d950, L"getItemState",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetItemState},
+    {0xc6013cd3, L"execCalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecCalculate},
+    {0xd8930d0e, L"setItems",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItems},
+    {0xe0f15045, L"getDisplayItem",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetDisplayItem},
+    {0xe23acddc, L"setItemState",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItemState},
+    {0xe2dfb2f8, L"addItem",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_AddItem},
+    {0xef8ce48f, L"execValidate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecValidate},
+    {0x461079ef, L"emit", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::
+                              Script_EventPseudoModel_Emit},
+    {0xfec90c63, L"reset", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::
+                               Script_EventPseudoModel_Reset},
+    {0xfb0b007, L"execEvent",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecEvent},
+    {0x3d832221, L"selectedMember",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_SelectedMember},
+    {0x6716ce97, L"execInitialize",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecInitialize},
+    {0xc6013cd3, L"execCalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecCalculate},
+    {0xef8ce48f, L"execValidate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecValidate},
+    {0xfb0b007, L"execEvent",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecEvent},
+    {0x6716ce97, L"execInitialize",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecInitialize},
+    {0xc6013cd3, L"execCalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecCalculate},
+    {0xd9b9b1f1, L"getInvalidObjects",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_GetInvalidObjects},
+    {0xef8ce48f, L"execValidate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecValidate},
+    {0xa366b7c, L"exportData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                   Script_HostPseudoModel_ExportData},
+    {0x16cc226c, L"gotoURL", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                 Script_HostPseudoModel_GotoURL},
+    {0x1e0722f5, L"pageDown", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_PageDown},
+    {0x3e66cb2c, L"setFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_SetFocus},
+    {0x4ac9faae, L"openList", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_OpenList},
+    {0x7b89714f, L"response", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_Response},
+    {0x7fd9fd58, L"documentInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_DocumentInBatch},
+    {0xaf1d019d, L"resetData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                   Script_HostPseudoModel_ResetData},
+    {0xb07be13c, L"beep", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                              Script_HostPseudoModel_Beep},
+    {0xb1882ca0, L"getFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_GetFocus},
+    {0xbf4ba9ee, L"messageBox", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                    Script_HostPseudoModel_MessageBox},
+    {0xd6d4dbc1, L"documentCountInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_DocumentCountInBatch},
+    {0xdd7676ed, L"print", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                               Script_HostPseudoModel_Print},
+    {0xe2f863d0, L"currentDateTime",
+     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_CurrentDateTime},
+    {0xf995d0f5, L"importData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                    Script_HostPseudoModel_ImportData},
+    {0xfeb96b62, L"pageUp", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
+                                Script_HostPseudoModel_PageUp},
+    {0x68, L"h", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                     Script_LayoutPseudoModel_H},
+    {0x77, L"w", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                     Script_LayoutPseudoModel_W},
+    {0x78, L"x", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                     Script_LayoutPseudoModel_X},
+    {0x79, L"y", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                     Script_LayoutPseudoModel_Y},
+    {0x5460206, L"pageCount", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                                  Script_LayoutPseudoModel_PageCount},
+    {0x5eb5b0f, L"pageSpan", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                                 Script_LayoutPseudoModel_PageSpan},
+    {0x10f1b1bd, L"page", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                              Script_LayoutPseudoModel_Page},
+    {0x1c1e6318, L"pageContent",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_PageContent},
+    {0x1c1f4a5c, L"absPageCount",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_AbsPageCount},
+    {0x1ec47db5, L"absPageCountInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_AbsPageCountInBatch},
+    {0x2e4ecbdb, L"sheetCountInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_SheetCountInBatch},
+    {0x2fcff4b5, L"relayout", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                                  Script_LayoutPseudoModel_Relayout},
+    {0x3bf1c2a5, L"absPageSpan",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_AbsPageSpan},
+    {0x5775c2cc, L"absPageInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_AbsPageInBatch},
+    {0x8c5feb32, L"sheetInBatch",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_SheetInBatch},
+    {0x8f3a8379, L"sheet", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                               Script_LayoutPseudoModel_Sheet},
+    {0x96f3c4cb, L"relayoutPageArea",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_RelayoutPageArea},
+    {0xd2a4a542, L"sheetCount",
+     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+         Script_LayoutPseudoModel_SheetCount},
+    {0xe74f0653, L"absPage", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
+                                 Script_LayoutPseudoModel_AbsPage},
+    {0x44c352ad, L"formNodes",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_FormNodes},
+    {0x45efb847, L"remerge",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Remerge},
+    {0x6716ce97, L"execInitialize",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecInitialize},
+    {0x712c6afa, L"createNode",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_CreateNode},
+    {0xa8a35e25, L"recalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Recalculate},
+    {0xc6013cd3, L"execCalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecCalculate},
+    {0xef8ce48f, L"execValidate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecValidate},
+    {0x4cc1c0f9, L"moveCurrentRecord",
+     (XFA_METHOD_CALLBACK)&CScript_DataWindow::
+         Script_DataWindow_MoveCurrentRecord},
+    {0x5779d65f, L"record",
+     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_Record},
+    {0x8a476498, L"gotoRecord",
+     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_GotoRecord},
+    {0xaac241c8, L"isRecordGroup",
+     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsRecordGroup},
+    {0x1c6f4277, L"evaluate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Manifest_Evaluate},
+    {0x2afec2cc, L"moveInstance",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_MoveInstance},
+    {0x2bf94a63, L"removeInstance",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_RemoveInstance},
+    {0x303adaf4, L"setInstances",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_SetInstances},
+    {0x4d76b89e, L"addInstance",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_AddInstance},
+    {0xc660dc8a, L"insertInstance",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_InsertInstance},
+    {0xddfd1ea1, L"metadata",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Desc_Metadata},
+    {0x44c352ad, L"formNodes",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_FormNodes},
+    {0x45efb847, L"remerge",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Remerge},
+    {0x6716ce97, L"execInitialize",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecInitialize},
+    {0xa8a35e25, L"recalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Recalculate},
+    {0xc6013cd3, L"execCalculate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecCalculate},
+    {0xef8ce48f, L"execValidate",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecValidate},
+    {0x60490a85, L"message", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
+                                 Script_LogPseudoModel_Message},
+    {0x60ecfcc9, L"traceDeactivate",
+     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
+         Script_LogPseudoModel_TraceDeactivate},
+    {0x86a0f4c0, L"traceActivate",
+     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
+         Script_LogPseudoModel_TraceActivate},
+    {0x93eac39a, L"traceEnabled", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
+                                      Script_LogPseudoModel_TraceEnabled},
+    {0xd1227e6f, L"trace",
+     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_Trace},
+    {0x36c0ee14, L"getAttribute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_GetAttribute},
+    {0x5468e2a0, L"setAttribute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_SetAttribute},
+    {0xadc48de2, L"removeAttribute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_RemoveAttribute},
+    {0x3848b3f, L"next", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Next},
+    {0x14e25bc8, L"cancelBatch",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_CancelBatch},
+    {0x3ce05d68, L"first",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_First},
+    {0x649e1e65, L"updateBatch",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_UpdateBatch},
+    {0x6a3405dd, L"previous",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Previous},
+    {0x74818fb3, L"isBOF",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsBOF},
+    {0x74d07a76, L"isEOF",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsEOF},
+    {0x7613cb66, L"cancel",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Cancel},
+    {0x7baca2e3, L"update",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Update},
+    {0x8b90e1f2, L"open", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Open},
+    {0x9c6471b3, L"delete",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Delete},
+    {0xa7315093, L"addNew",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_AddNew},
+    {0xa7ce5f8d, L"requery",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Requery},
+    {0xc7368674, L"resync",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Resync},
+    {0xd9f47f36, L"close",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Close},
+    {0xf54481d4, L"last", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Last},
+    {0xf7965460, L"hasDataChanged",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_HasDataChanged},
+    {0x6275f6af, L"item",
+     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Item},
+    {0x7033bfd5, L"insert",
+     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Insert},
+    {0x9cab7cae, L"remove",
+     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Remove},
+    {0xda12e518, L"append",
+     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Append},
+    {0xd892a054, L"namedItem",
+     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_TreelistClass_NamedItem},
+    {0xba2dd386, L"resolveNode",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNode},
+    {0xe509e2b9, L"resolveNodes",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNodes},
+    {0x1bca1ebd, L"applyXSL",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_ApplyXSL},
+    {0x36c0ee14, L"getAttribute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetAttribute},
+    {0x5468e2a0, L"setAttribute",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetAttribute},
+    {0x5ee00996, L"setElement",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetElement},
+    {0x92dada4f, L"saveFilteredXML",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveFilteredXML},
+    {0x9c456500, L"saveXML",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveXML},
+    {0xabd3200a, L"getElement",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetElement},
+    {0xb269c60d, L"isPropertySpecified",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_IsPropertySpecified},
+    {0xb528be91, L"loadXML",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_LoadXML},
+    {0xd9f46591, L"clone",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_Clone},
+    {0xe006a76b, L"assignNode",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_AssignNode},
+    {0x7303fcea, L"getDelta",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDelta},
+    {0xe7742c9d, L"getDeltas",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDeltas},
+    {0x30ff6aad, L"clearErrorList",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_ClearErrorList},
+    {0x712c6afa, L"createNode",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_CreateNode},
+    {0x83a6411d, L"isCompatibleNS",
+     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_IsCompatibleNS},
+};
+const int32_t g_iSomMethodCount =
+    sizeof(g_SomMethodData) / sizeof(XFA_METHODINFO);
+const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[] = {
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xb3543a6, L"max",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Max, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x45a6daf8, L"eofAction",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_EofAction, XFA_SCRIPT_Basic},
+    {0x5ec958c0, L"cursorType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CursorType, XFA_SCRIPT_Basic},
+    {0x79975f2b, L"lockType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LockType, XFA_SCRIPT_Basic},
+    {0xa5340ff5, L"bofAction",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BofAction, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc5762157, L"cursorLocation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CursorLocation, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1ee2d24d, L"instanceIndex",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1,
+     XFA_SCRIPT_Basic},
+    {0x8c99377e, L"relation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0x3106c3a, L"beforeTarget",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BeforeTarget, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x13a08bdb, L"overflowTarget",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OverflowTarget, XFA_SCRIPT_Basic},
+    {0x169134a1, L"overflowLeader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OverflowLeader, XFA_SCRIPT_Basic},
+    {0x20914367, L"overflowTrailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OverflowTrailer, XFA_SCRIPT_Basic},
+    {0x453eaf38, L"startNew",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
+    {0x64110ab5, L"bookendTrailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BookendTrailer, XFA_SCRIPT_Basic},
+    {0xb6b44172, L"after",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_After, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc3c1442f, L"bookendLeader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BookendLeader, XFA_SCRIPT_Basic},
+    {0xcb150479, L"afterTarget",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AfterTarget, XFA_SCRIPT_Basic},
+    {0xf4ffce73, L"before",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Before, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
+     XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x47cfa43a, L"allowNeutral",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AllowNeutral, XFA_SCRIPT_Basic},
+    {0x7c2fd80b, L"mark",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Mark, XFA_SCRIPT_Basic},
+    {0x8ed182d1, L"shape",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Shape, XFA_SCRIPT_Basic},
+    {0xa686975b, L"size",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x5c054755, L"startAngle",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_StartAngle, XFA_SCRIPT_Basic},
+    {0x74788f8b, L"sweepAngle",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SweepAngle, XFA_SCRIPT_Basic},
+    {0x9d833d75, L"circular",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Circular, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd996fa9b, L"hand",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xb0e5485d, L"bind",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Bind, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xcd7f7b54, L"from",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8e29d794, L"signatureType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SignatureType, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe11a2cbc, L"permissions",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Permissions, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x453eaf38, L"startNew",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
+    {0x9dcc3ab3, L"trailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
+    {0xa6118c89, L"targetType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xcbcaf66d, L"leader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x2d574d58, L"this", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Xfa_This,
+     -1, XFA_SCRIPT_Object},
+    {0x4fdc3454, L"timeStamp",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TimeStamp, XFA_SCRIPT_Basic},
+    {0xb598a1f7, L"uuid",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Uuid, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xcfea02e, L"leftInset",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LeftInset, XFA_SCRIPT_Basic},
+    {0x1356caf8, L"bottomInset",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BottomInset, XFA_SCRIPT_Basic},
+    {0x25764436, L"topInset",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TopInset, XFA_SCRIPT_Basic},
+    {0x8a692521, L"rightInset",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RightInset, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1e459b8f, L"nonRepudiation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_NonRepudiation, XFA_SCRIPT_Basic},
+    {0x2bb3f470, L"encipherOnly",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_EncipherOnly, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0x5f760b50, L"digitalSignature",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DigitalSignature, XFA_SCRIPT_Basic},
+    {0x69aa2292, L"crlSign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CrlSign, XFA_SCRIPT_Basic},
+    {0x98fd4d81, L"keyAgreement",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_KeyAgreement, XFA_SCRIPT_Basic},
+    {0xa66404cb, L"keyEncipherment",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_KeyEncipherment, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xca5dc27c, L"dataEncipherment",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataEncipherment, XFA_SCRIPT_Basic},
+    {0xe8f118a8, L"keyCertSign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_KeyCertSign, XFA_SCRIPT_Basic},
+    {0xfea53ec6, L"decipherOnly",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DecipherOnly, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8b90e1f2, L"open",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Open, XFA_SCRIPT_Basic},
+    {0x957fa006, L"commitOn",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CommitOn, XFA_SCRIPT_Basic},
+    {0xb12128b7, L"textEntry",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TextEntry, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0x2282c73, L"hAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
+    {0x8d4f1c7, L"textIndent",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TextIndent, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2a82d99c, L"marginRight",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MarginRight, XFA_SCRIPT_Basic},
+    {0x534729c9, L"marginLeft",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MarginLeft, XFA_SCRIPT_Basic},
+    {0x5739d1ff, L"radixOffset",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RadixOffset, XFA_SCRIPT_Basic},
+    {0x577682ac, L"preserve",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Preserve, XFA_SCRIPT_Basic},
+    {0x731e0665, L"spaceBelow",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SpaceBelow, XFA_SCRIPT_Basic},
+    {0x7a7cc341, L"vAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
+    {0x836d4d7c, L"tabDefault",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TabDefault, XFA_SCRIPT_Basic},
+    {0x8fa01790, L"tabStops",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TabStops, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd4b01921, L"lineHeight",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LineHeight, XFA_SCRIPT_Basic},
+    {0xe18b5659, L"spaceAbove",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SpaceAbove, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd861f8af, L"addRevocationInfo",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AddRevocationInfo, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6128d8d, L"activity",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Activity, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x43e349b, L"dataRowCount",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataRowCount, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x28e17e91, L"dataPrep",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataPrep, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0x3650557e, L"textLocation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TextLocation, XFA_SCRIPT_Basic},
+    {0x3b582286, L"moduleWidth",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ModuleWidth, XFA_SCRIPT_Basic},
+    {0x52666f1c, L"printCheckDigit",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_PrintCheckDigit, XFA_SCRIPT_Basic},
+    {0x5404d6df, L"moduleHeight",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ModuleHeight, XFA_SCRIPT_Basic},
+    {0x5ab23b6c, L"startChar",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_StartChar, XFA_SCRIPT_Basic},
+    {0x7c732a66, L"truncate",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Truncate, XFA_SCRIPT_Basic},
+    {0x8d181d61, L"wideNarrowRatio",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_WideNarrowRatio, XFA_SCRIPT_Basic},
+    {0x99800d7a, L"errorCorrectionLevel",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ErrorCorrectionLevel, XFA_SCRIPT_Basic},
+    {0x9a63da3d, L"upsMode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_UpsMode, XFA_SCRIPT_Basic},
+    {0xaf754613, L"checksum",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Checksum, XFA_SCRIPT_Basic},
+    {0xb045fbc5, L"charEncoding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CharEncoding, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc035c6b1, L"dataColumnCount",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataColumnCount, XFA_SCRIPT_Basic},
+    {0xd3c84d25, L"rowColumnRatio",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RowColumnRatio, XFA_SCRIPT_Basic},
+    {0xd57c513c, L"dataLength",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataLength, XFA_SCRIPT_Basic},
+    {0xf575ca75, L"endChar",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_EndChar, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0x28dee6e9, L"format",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x60d4c8b1, L"output",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Output, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6a39990, L"input",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Input, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x2b5df51e, L"dataDescription",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x6c0d9600, L"currentValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_CurrentValue, -1,
+     XFA_SCRIPT_Basic},
+    {0x942643f0, L"savedValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_SavedValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_Target, -1,
+     XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd4cc53f8, L"highlight",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Highlight, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x5518c25, L"break",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Break, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd996fa9b, L"hand",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1059ec18, L"level",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer,
+     XFA_ATTRIBUTE_Level, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xac06e2b0, L"colSpan",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f105f72, L"wordCharacterCount",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_WordCharacterCount, XFA_SCRIPT_Basic},
+    {0x3d123c26, L"hyphenate",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Hyphenate, XFA_SCRIPT_Basic},
+    {0x66539c48, L"excludeInitialCap",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ExcludeInitialCap, XFA_SCRIPT_Basic},
+    {0x6a95c976, L"pushCharacterCount",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_PushCharacterCount, XFA_SCRIPT_Basic},
+    {0x982bd892, L"remainCharacterCount",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RemainCharacterCount, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe5c96d6a, L"excludeAllCaps",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ExcludeAllCaps, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8af2e657, L"maxChars",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxChars, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc080cd3, L"url",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Url, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa6710262, L"credentialServerPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CredentialServerPolicy, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc2ba0923, L"urlPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_UrlPolicy, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x47d03490, L"connection",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x78bff531, L"numberOfCells",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer,
+     XFA_ATTRIBUTE_NumberOfCells, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
+    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0x2282c73, L"hAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1abbd7e0, L"dataNode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
+     XFA_SCRIPT_Object},
+    {0x25839852, L"access",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
+    {0x2ee7678f, L"rotate",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic},
+    {0x3b1ddd06, L"fillColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x54c399e3, L"formattedValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormattedValue, -1,
+     XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x5a3b375d, L"borderColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x5e936ed6, L"fontColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FontColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x6826c408, L"parentSubform",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_ParentSubform, -1,
+     XFA_SCRIPT_Basic},
+    {0x79b67434, L"mandatoryMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0x7a7cc341, L"vAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
+    {0x7c2ff6ae, L"maxH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
+    {0x7c2ff6bd, L"maxW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
+    {0x7d02356c, L"minH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
+    {0x7d02357b, L"minW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
+    {0x85fd6faf, L"mandatory",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1,
+     XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0x964fb42e, L"formatMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormatMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0xa03cf627, L"rawValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xa60dd202, L"length",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_Length, -1,
+     XFA_SCRIPT_Basic},
+    {0xac06e2b0, L"colSpan",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbc8fa350, L"locale",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic},
+    {0xc2bd40fd, L"anchorType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
+    {0xc4fed09b, L"accessKey",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic},
+    {0xcabfa3d0, L"validationMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0xdcecd663, L"editValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_EditValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xe07e5061, L"selectedIndex",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_SelectedIndex, -1,
+     XFA_SCRIPT_Basic},
+    {0xf65e34be, L"borderWidth",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
+     XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
+    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd843798, L"fullText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                 Script_EventPseudoModel_FullText,
+     -1, XFA_SCRIPT_Basic},
+    {0x1b6d1cf5, L"reenter", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                 Script_EventPseudoModel_Reenter,
+     -1, XFA_SCRIPT_Basic},
+    {0x1e6ffa9a, L"prevContentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_PrevContentType,
+     -1, XFA_SCRIPT_Basic},
+    {0x25a3c206, L"soapFaultString",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_SoapFaultString,
+     -1, XFA_SCRIPT_Basic},
+    {0x2e00c007, L"newContentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_NewContentType,
+     -1, XFA_SCRIPT_Basic},
+    {0x4570500f, L"modifier",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_Modifier,
+     -1, XFA_SCRIPT_Basic},
+    {0x50e2e33b, L"selEnd", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                Script_EventPseudoModel_SelEnd,
+     -1, XFA_SCRIPT_Basic},
+    {0x57de87c2, L"prevText",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_PrevText,
+     -1, XFA_SCRIPT_Basic},
+    {0x6ea04e0a, L"soapFaultCode",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_SoapFaultCode,
+     -1, XFA_SCRIPT_Basic},
+    {0x6f6556cf, L"newText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                 Script_EventPseudoModel_NewText,
+     -1, XFA_SCRIPT_Basic},
+    {0x891f4606, L"change", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                Script_EventPseudoModel_Change,
+     -1, XFA_SCRIPT_Basic},
+    {0x8fa3c19e, L"shift", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                               Script_EventPseudoModel_Shift,
+     -1, XFA_SCRIPT_Basic},
+    {0xa9d9b2e1, L"keyDown", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                 Script_EventPseudoModel_KeyDown,
+     -1, XFA_SCRIPT_Basic},
+    {0xbfc89db2, L"selStart",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_SelStart,
+     -1, XFA_SCRIPT_Basic},
+    {0xc32a5812, L"commitKey",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+         Script_EventPseudoModel_CommitKey,
+     -1, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
+                                Script_EventPseudoModel_Target,
+     -1, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xa2e3514, L"cap",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Cap, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x5392ea58, L"stroke",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x94446dcc, L"thickness",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1ec8ab2c, L"rate",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Rate, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x7b29630a, L"sourceBelow",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SourceBelow, XFA_SCRIPT_Basic},
+    {0x8fc36c0a, L"outputBelow",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OutputBelow, XFA_SCRIPT_Basic},
+    {0xe996b2fe, L"sourceAbove",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_SourceAbove, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
+    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0x2282c73, L"hAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xf23332f, L"errorText",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_ErrorText, -1,
+     XFA_SCRIPT_Basic},
+    {0x1abbd7e0, L"dataNode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
+     XFA_SCRIPT_Object},
+    {0x25839852, L"access",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
+    {0x3b1ddd06, L"fillColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x5a3b375d, L"borderColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x79b67434, L"mandatoryMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0x7a7cc341, L"vAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
+    {0x7c2ff6ae, L"maxH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
+    {0x7c2ff6bd, L"maxW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
+    {0x7d02356c, L"minH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
+    {0x7d02357b, L"minW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
+    {0x7e7e845e, L"layout",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic},
+    {0x846599f8, L"transient",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_Transient, -1,
+     XFA_SCRIPT_Basic},
+    {0x85fd6faf, L"mandatory",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1,
+     XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xa03cf627, L"rawValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue,
+     -1, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue,
+     -1, XFA_SCRIPT_Basic},
+    {0xac06e2b0, L"colSpan",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc2bd40fd, L"anchorType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
+    {0xc4fed09b, L"accessKey",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic},
+    {0xcabfa3d0, L"validationMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0xf65e34be, L"borderWidth",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xeda9017a, L"scope",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x47d03490, L"connection",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
+    {0x6cfa828a, L"runAt",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic},
+    {0xa1b0d2f5, L"executeType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ExecuteType, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe6f99487, L"hScrollPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x42fed1fd, L"contentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
+    {0x54fa722c, L"transferEncoding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd171b240, L"aspect",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Aspect, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
+     XFA_SCRIPT_Basic},
+    {0xdb55fec5, L"href",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0x7f6fd3d7, L"server",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Server, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x4b8bc840, L"fracDigits",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_FracDigits, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xde7f92ba, L"leadDigits",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LeadDigits, XFA_SCRIPT_Basic},
+    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
+    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0x2282c73, L"hAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1414d431, L"allowMacro",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AllowMacro, XFA_SCRIPT_Basic},
+    {0x1517dfa1, L"columnWidths",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColumnWidths, XFA_SCRIPT_Basic},
+    {0x1abbd7e0, L"dataNode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
+     XFA_SCRIPT_Object},
+    {0x1ee2d24d, L"instanceIndex",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1,
+     XFA_SCRIPT_Basic},
+    {0x25839852, L"access",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
+    {0x3b1ddd06, L"fillColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x5a3b375d, L"borderColor",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
+     XFA_SCRIPT_Basic},
+    {0x7a7cc341, L"vAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
+    {0x7c2ff6ae, L"maxH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
+    {0x7c2ff6bd, L"maxW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
+    {0x7d02356c, L"minH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
+    {0x7d02357b, L"minW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
+    {0x7e7e845e, L"layout",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0x9cc17d75, L"mergeMode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MergeMode, XFA_SCRIPT_Basic},
+    {0x9f3e9510, L"instanceManager",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_InstanceManager, -1,
+     XFA_SCRIPT_Object},
+    {0xac06e2b0, L"colSpan",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbc8fa350, L"locale",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_Locale, -1,
+     XFA_SCRIPT_Basic},
+    {0xc2bd40fd, L"anchorType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
+    {0xcabfa3d0, L"validationMessage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
+     XFA_SCRIPT_Basic},
+    {0xe4c3a5e5, L"restoreState",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RestoreState, XFA_SCRIPT_Basic},
+    {0xeda9017a, L"scope",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic},
+    {0xf65e34be, L"borderWidth",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0x5a50e9e6, L"version",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Handler_Version, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x4107ed, L"foxitAppType",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_FoxitAppType,
+     -1, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                             Script_HostPseudoModel_Name,
+     -1, XFA_SCRIPT_Basic},
+    {0x66c1ae9, L"validationsEnabled",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_ValidationsEnabled,
+     -1, XFA_SCRIPT_Basic},
+    {0x14d04502, L"title", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                               Script_HostPseudoModel_Title,
+     -1, XFA_SCRIPT_Basic},
+    {0x193afe8b, L"foxitName",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_FoxitName,
+     -1, XFA_SCRIPT_Basic},
+    {0x392ae445, L"platform", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_Platform,
+     -1, XFA_SCRIPT_Basic},
+    {0x5a50e9e6, L"version", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                                 Script_HostPseudoModel_Version,
+     -1, XFA_SCRIPT_Basic},
+    {0x66cb1eed, L"variation",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_Variation,
+     -1, XFA_SCRIPT_Basic},
+    {0x7717cbc4, L"language", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_Language,
+     -1, XFA_SCRIPT_Basic},
+    {0x86698963, L"appType", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                                 Script_HostPseudoModel_AppType,
+     -1, XFA_SCRIPT_Basic},
+    {0x94ff9e8d, L"calculationsEnabled",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_CalculationsEnabled,
+     -1, XFA_SCRIPT_Basic},
+    {0xbcd44940, L"currentPage",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_CurrentPage,
+     -1, XFA_SCRIPT_Basic},
+    {0xd4286870, L"foxitVersion",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+         Script_HostPseudoModel_FoxitVersion,
+     -1, XFA_SCRIPT_Basic},
+    {0xd592b920, L"numPages", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
+                                  Script_HostPseudoModel_NumPages,
+     -1, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x24d85167, L"timeout",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x7d9fd7c5, L"mode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Mode, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x7d9fd7c5, L"mode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_SubmitFormat_Mode, -1,
+     XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2038c9b2, L"role",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Role, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xfcef86b5, L"ready", (XFA_ATTRIBUTE_CALLBACK)&CScript_LayoutPseudoModel::
+                               Script_LayoutPseudoModel_Ready,
+     -1, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x5392ea58, L"stroke",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x7b95e661, L"inverted",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Inverted, XFA_SCRIPT_Basic},
+    {0x94446dcc, L"thickness",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe8dddf50, L"join",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Join, XFA_SCRIPT_Basic},
+    {0xe948b9a8, L"radius",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Radius, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xabfa6c4f, L"cSpace",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CSpace, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
+    {0x3848b3f, L"next",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Next, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x6a3405dd, L"previous",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Previous, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xf6b59543, L"intact",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Intact, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x268b7ec1, L"commandType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CommandType, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbde9abda, L"data",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Data, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x5b707a35, L"scriptTest",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ScriptTest, XFA_SCRIPT_Basic},
+    {0x6b6ddcfb, L"nullTest",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_NullTest, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xe64b1129, L"formatTest",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_FormatTest, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8c99377e, L"relation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x25363, L"to",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic},
+    {0x66642f8f, L"force",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Force, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xcd7f7b54, L"from",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
+    {0x2b5df51e, L"dataDescription",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x226ca8f1, L"operation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xfb67185, L"recordsBefore", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
+                                      Script_DataWindow_RecordsBefore,
+     -1, XFA_SCRIPT_Basic},
+    {0x21d5dfcb, L"currentRecordNumber",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
+         Script_DataWindow_CurrentRecordNumber,
+     -1, XFA_SCRIPT_Basic},
+    {0x312af044, L"recordsAfter", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
+                                      Script_DataWindow_RecordsAfter,
+     -1, XFA_SCRIPT_Basic},
+    {0x6aab37cb, L"isDefined",
+     (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsDefined,
+     -1, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x42fed1fd, L"contentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
+    {0x6cfa828a, L"runAt",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic},
+    {0xa021b738, L"stateless",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Script_Stateless, -1,
+     XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xadc4c77b, L"binding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Binding, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x7a0cc471, L"passwordChar",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_PasswordChar, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe6f99487, L"hScrollPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe6f99487, L"hScrollPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x14a32d52, L"pagePosition",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_PagePosition, XFA_SCRIPT_Basic},
+    {0x8340ea66, L"oddOrEven",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OddOrEven, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xa85e74f3, L"initialNumber",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_InitialNumber, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe9ba472, L"numbered",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Numbered, XFA_SCRIPT_Basic},
+    {0xd70798c2, L"blankOrNotBlank",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BlankOrNotBlank, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x34ae103c, L"reserve",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Reserve, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xf2009339, L"placement",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Placement, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x42fed1fd, L"contentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
+    {0x54fa722c, L"transferEncoding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc4547a08, L"maxLength",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxLength, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xdb55fec5, L"href",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic},
+    {0x29418bb7, L"abbr",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf531b059, L"writingScript",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_WritingScript, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1b8dce3e, L"action",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Action, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x9dcc3ab3, L"trailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xcbcaf66d, L"leader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xb3543a6, L"max",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Max, -1,
+     XFA_SCRIPT_Basic},
+    {0xb356ca4, L"min",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Min, -1,
+     XFA_SCRIPT_Basic},
+    {0x6f544d49, L"count",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Count, -1,
+     XFA_SCRIPT_Basic},
+    {0x25363, L"to",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic},
+    {0xa0933954, L"unicodeRange",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_UnicodeRange, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xcd7f7b54, L"from",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x4ef3d02c, L"orientation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Orientation, XFA_SCRIPT_Basic},
+    {0x65e30c67, L"imagingBBox",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ImagingBBox, XFA_SCRIPT_Basic},
+    {0x9041d4b0, L"short",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Short, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe349d044, L"stock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Stock, XFA_SCRIPT_Basic},
+    {0xf6b4afb0, L"long",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Long, XFA_SCRIPT_Basic},
+    {0x5ce6195, L"vScrollPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VScrollPolicy, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x1ef3a64a, L"allowRichText",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AllowRichText, XFA_SCRIPT_Basic},
+    {0x5a32e493, L"multiLine",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MultiLine, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe6f99487, L"hScrollPolicy",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xd52482e0, L"maxEntries",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxEntries, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x42fed1fd, L"contentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
+    {0x8855805f, L"contains",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Contains, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xe372ae97, L"isNull",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_IsNull, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x2b5df51e, L"dataDescription",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x226ca8f1, L"operation",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x42fed1fd, L"contentType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
+    {0x54fa722c, L"transferEncoding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xf197844d, L"match",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Match, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd996fa9b, L"hand",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x28dee6e9, L"format",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Encrypt_Format, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
+    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
+    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
+    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
+    {0x2282c73, L"hAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2ee7678f, L"rotate",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0x7a7cc341, L"vAlign",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
+    {0x7c2ff6ae, L"maxH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
+    {0x7c2ff6bd, L"maxW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
+    {0x7d02356c, L"minH",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
+    {0x7d02357b, L"minW",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xa03cf627, L"rawValue",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xac06e2b0, L"colSpan",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbc8fa350, L"locale",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic},
+    {0xc2bd40fd, L"anchorType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x39cdb0a2, L"priority",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Priority, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xeb511b54, L"disable",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Disable, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xcb0ac9, L"lineThrough",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LineThrough, XFA_SCRIPT_Basic},
+    {0x2c1c7f1, L"typeface",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Typeface, XFA_SCRIPT_Basic},
+    {0x8c74ae9, L"fontHorizontalScale",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_FontHorizontalScale, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2cd79033, L"kerningMode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_KerningMode, XFA_SCRIPT_Basic},
+    {0x3a0273a6, L"underline",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Underline, XFA_SCRIPT_Basic},
+    {0x4873c601, L"baselineShift",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_BaselineShift, XFA_SCRIPT_Basic},
+    {0x4b319767, L"overlinePeriod",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_OverlinePeriod, XFA_SCRIPT_Basic},
+    {0x79543055, L"letterSpacing",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LetterSpacing, XFA_SCRIPT_Basic},
+    {0x8ec6204c, L"lineThroughPeriod",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LineThroughPeriod, XFA_SCRIPT_Basic},
+    {0x907c7719, L"fontVerticalScale",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_FontVerticalScale, XFA_SCRIPT_Basic},
+    {0xa686975b, L"size",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic},
+    {0xb5e49bf2, L"posture",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Posture, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbd6e1d88, L"weight",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Weight, XFA_SCRIPT_Basic},
+    {0xbd96a0e9, L"underlinePeriod",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_UnderlinePeriod, XFA_SCRIPT_Basic},
+    {0xc0ec9fa4, L"overline",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Overline, XFA_SCRIPT_Basic},
+    {0xaf754613, L"checksum",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Form_Checksum, -1,
+     XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x8e1c2921, L"relevant",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xea7090a0, L"override",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x9dcc3ab3, L"trailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xcbcaf66d, L"leader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x60a61edd, L"codeType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CodeType, XFA_SCRIPT_Basic},
+    {0xb373a862, L"archive",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Archive, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xe1a26b56, L"codeBase",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_CodeBase, XFA_SCRIPT_Basic},
+    {0xeb091003, L"classId",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ClassId, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x47d03490, L"connection",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
+    {0xc39a88bd, L"labelRef",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_LabelRef, XFA_SCRIPT_Basic},
+    {0xd50f903a, L"valueRef",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_ValueRef, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xea7090a0, L"override",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Extras_Type, -1,
+     XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x24d85167, L"timeout",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic},
+    {0x47d03490, L"connection",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
+    {0x552d9ad5, L"usage",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usage, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc860f30a, L"delayedOpen",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_DelayedOpen, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x28dee6e9, L"format",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic},
+    {0x824f21b7, L"embedPDF",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_EmbedPDF, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xdc75676c, L"textEncoding",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TextEncoding, XFA_SCRIPT_Basic},
+    {0xf889e747, L"xdpContent",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_XdpContent, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x97be91b, L"content",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Packet_Content, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x4156ee3f, L"delimiter",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Delimiter, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x2f16a382, L"type",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x453eaf38, L"startNew",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
+    {0x9dcc3ab3, L"trailer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
+    {0xa6118c89, L"targetType",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xc8da4da7, L"target",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
+    {0xcbcaf66d, L"leader",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xabef37e3, L"slope",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Slope, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xd996fa9b, L"hand",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
+    {0xa60dd202, L"length",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1,
+     XFA_SCRIPT_Basic},
+    {0x20146, L"db", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Source_Db, -1,
+     XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xb3543a6, L"max", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Max,
+     -1, XFA_SCRIPT_Basic},
+    {0xb356ca4, L"min", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Min,
+     -1, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x7d0b5fca, L"initial",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Initial, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x29418bb7, L"abbr",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0xbe52dfbf, L"desc",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
+    {0xf6b47749, L"lock",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
+     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
+    {0xbb8df5d, L"ref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
+    {0xc0811ed, L"use",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
+    {0x570ce835, L"presence",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
+    {0xa5b410cf, L"save",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Save, XFA_SCRIPT_Basic},
+    {0xbc254332, L"usehref",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
+    {0xb2c80857, L"className",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Object::Script_ObjectClass_ClassName, -1,
+     XFA_SCRIPT_Basic},
+    {0xa60dd202, L"length",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1,
+     XFA_SCRIPT_Basic},
+    {0x31b19c1, L"name",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
+    {0x9f9d0f9, L"all",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_All, -1,
+     XFA_SCRIPT_Object},
+    {0x4df15659, L"nodes",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Nodes, -1,
+     XFA_SCRIPT_Object},
+    {0x78a8d6cf, L"classAll",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassAll, -1,
+     XFA_SCRIPT_Object},
+    {0xcad6d8ca, L"parent",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Parent, -1,
+     XFA_SCRIPT_Object},
+    {0xd5679c78, L"index",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Index, -1,
+     XFA_SCRIPT_Basic},
+    {0xdb5b4bce, L"classIndex",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassIndex, -1,
+     XFA_SCRIPT_Basic},
+    {0xe4989adf, L"somExpression",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_SomExpression, -1,
+     XFA_SCRIPT_Basic},
+    {0x21aed, L"id",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
+     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
+    {0x234a1, L"ns", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Ns,
+     -1, XFA_SCRIPT_Basic},
+    {0x50d1a9d1, L"model",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Model, -1,
+     XFA_SCRIPT_Object},
+    {0xacb4823f, L"isContainer",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsContainer, -1,
+     XFA_SCRIPT_Basic},
+    {0xe372ae97, L"isNull",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsNull, -1,
+     XFA_SCRIPT_Basic},
+    {0xfe612a5b, L"oneOfChild",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_OneOfChild, -1,
+     XFA_SCRIPT_Object},
+    {0x97c1c65, L"context",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_Context, -1,
+     XFA_SCRIPT_Object},
+    {0x58be2870, L"aliasNode",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_AliasNode, -1,
+     XFA_SCRIPT_Object},
+    {0xa52682bd, L"{default}",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+    {0xd6e27f1d, L"value",
+     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
+     XFA_SCRIPT_Basic},
+};
+const int32_t g_iSomAttributeCount =
+    sizeof(g_SomAttributeData) / sizeof(XFA_ATTRIBUTEINFO);
diff --git a/xfa/fxfa/parser/xfa_basic_data.h b/xfa/fxfa/parser/xfa_basic_data.h
new file mode 100644
index 0000000..8d36650
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_basic_data.h
@@ -0,0 +1,48 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_BASIC_DATA_H_
+#define XFA_FXFA_PARSER_XFA_BASIC_DATA_H_
+
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/include/fxfa/fxfa_basic.h"
+
+extern const XFA_PACKETINFO g_XFAPacketData[];
+extern const int32_t g_iXFAPacketCount;
+
+extern const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[];
+extern const int32_t g_iXFAEnumCount;
+
+extern const XFA_ATTRIBUTEINFO g_XFAAttributeData[];
+extern const int32_t g_iXFAAttributeCount;
+
+extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[];
+extern const int32_t g_iXFANotsureCount;
+
+extern const XFA_ELEMENTINFO g_XFAElementData[];
+extern const int32_t g_iXFAElementCount;
+
+extern const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[];
+extern const FX_WORD g_XFAElementChildrenData[];
+
+extern const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[];
+extern const uint8_t g_XFAElementAttributeData[];
+
+extern const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[];
+extern const XFA_PROPERTY g_XFAElementPropertyData[];
+
+extern const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[];
+
+extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[];
+extern const int32_t g_iXFANotsureCount;
+
+extern const XFA_METHODINFO g_SomMethodData[];
+extern const int32_t g_iSomMethodCount;
+
+extern const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[];
+extern const int32_t g_iSomAttributeCount;
+
+#endif  // XFA_FXFA_PARSER_XFA_BASIC_DATA_H_
diff --git a/xfa/fxfa/parser/xfa_basic_imp.cpp b/xfa/fxfa/parser/xfa_basic_imp.cpp
new file mode 100644
index 0000000..a6d4fc0
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_basic_imp.cpp
@@ -0,0 +1,612 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_algorithm.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_system.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_data.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+const XFA_PACKETINFO* XFA_GetPacketByName(const CFX_WideStringC& wsName) {
+  int32_t iLength = wsName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
+  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    const XFA_PACKETINFO* pInfo = g_XFAPacketData + iMid;
+    if (uHash == pInfo->uHash) {
+      return pInfo;
+    } else if (uHash < pInfo->uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+
+const XFA_PACKETINFO* XFA_GetPacketByID(FX_DWORD dwPacket) {
+  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    FX_DWORD dwFind = (g_XFAPacketData + iMid)->eName;
+    if (dwPacket == dwFind) {
+      return g_XFAPacketData + iMid;
+    } else if (dwPacket < dwFind) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+
+const XFA_PACKETINFO* XFA_GetPacketByIndex(XFA_PACKET ePacket) {
+  return g_XFAPacketData + ePacket;
+}
+
+const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByName(
+    const CFX_WideStringC& wsName) {
+  int32_t iLength = wsName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
+  int32_t iStart = 0, iEnd = g_iXFAEnumCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    const XFA_ATTRIBUTEENUMINFO* pInfo = g_XFAEnumData + iMid;
+    if (uHash == pInfo->uHash) {
+      return pInfo;
+    } else if (uHash < pInfo->uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByID(XFA_ATTRIBUTEENUM eName) {
+  return g_XFAEnumData + eName;
+}
+int32_t XFA_GetAttributeCount() {
+  return g_iXFAAttributeCount;
+}
+const XFA_ATTRIBUTEINFO* XFA_GetAttributeByName(const CFX_WideStringC& wsName) {
+  int32_t iLength = wsName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
+  int32_t iStart = 0, iEnd = g_iXFAAttributeCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    const XFA_ATTRIBUTEINFO* pInfo = g_XFAAttributeData + iMid;
+    if (uHash == pInfo->uHash) {
+      return pInfo;
+    } else if (uHash < pInfo->uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+const XFA_ATTRIBUTEINFO* XFA_GetAttributeByID(XFA_ATTRIBUTE eName) {
+  return (eName < g_iXFAAttributeCount) ? (g_XFAAttributeData + eName) : NULL;
+}
+FX_BOOL XFA_GetAttributeDefaultValue(void*& pValue,
+                                     XFA_ELEMENT eElement,
+                                     XFA_ATTRIBUTE eAttribute,
+                                     XFA_ATTRIBUTETYPE eType,
+                                     FX_DWORD dwPacket) {
+  const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttribute);
+  if (pInfo == NULL) {
+    return FALSE;
+  }
+  if (dwPacket && (dwPacket & pInfo->dwPackets) == 0) {
+    return FALSE;
+  }
+  if (pInfo->eType == eType) {
+    pValue = pInfo->pDefValue;
+    return TRUE;
+  } else if (pInfo->eType == XFA_ATTRIBUTETYPE_NOTSURE) {
+    const XFA_NOTSUREATTRIBUTE* pAttr =
+        XFA_GetNotsureAttribute(eElement, eAttribute, eType);
+    if (pAttr) {
+      pValue = pAttr->pValue;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+XFA_ATTRIBUTEENUM XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT eElement,
+                                                    XFA_ATTRIBUTE eAttribute,
+                                                    FX_DWORD dwPacket) {
+  void* pValue;
+  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
+                                   XFA_ATTRIBUTETYPE_Enum, dwPacket)) {
+    return (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
+  }
+  return XFA_ATTRIBUTEENUM_Unknown;
+}
+CFX_WideStringC XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT eElement,
+                                                   XFA_ATTRIBUTE eAttribute,
+                                                   FX_DWORD dwPacket) {
+  void* pValue;
+  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
+                                   XFA_ATTRIBUTETYPE_Cdata, dwPacket)) {
+    return (const FX_WCHAR*)pValue;
+  }
+  return NULL;
+}
+FX_BOOL XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT eElement,
+                                             XFA_ATTRIBUTE eAttribute,
+                                             FX_DWORD dwPacket) {
+  void* pValue;
+  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
+                                   XFA_ATTRIBUTETYPE_Boolean, dwPacket)) {
+    return (FX_BOOL)(uintptr_t)pValue;
+  }
+  return FALSE;
+}
+int32_t XFA_GetAttributeDefaultValue_Integer(XFA_ELEMENT eElement,
+                                             XFA_ATTRIBUTE eAttribute,
+                                             FX_DWORD dwPacket) {
+  void* pValue;
+  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
+                                   XFA_ATTRIBUTETYPE_Integer, dwPacket)) {
+    return (int32_t)(uintptr_t)pValue;
+  }
+  return 0;
+}
+CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT eElement,
+                                                      XFA_ATTRIBUTE eAttribute,
+                                                      FX_DWORD dwPacket) {
+  void* pValue;
+  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
+                                   XFA_ATTRIBUTETYPE_Measure, dwPacket)) {
+    return *(CXFA_Measurement*)pValue;
+  }
+  return CXFA_Measurement();
+}
+int32_t XFA_GetElementCount() {
+  return g_iXFAElementCount;
+}
+const XFA_ELEMENTINFO* XFA_GetElementByName(const CFX_WideStringC& wsName) {
+  int32_t iLength = wsName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
+  int32_t iStart = 0, iEnd = g_iXFAElementCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    const XFA_ELEMENTINFO* pInfo = g_XFAElementData + iMid;
+    if (uHash == pInfo->uHash) {
+      return pInfo;
+    } else if (uHash < pInfo->uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+const XFA_ELEMENTINFO* XFA_GetElementByID(XFA_ELEMENT eName) {
+  return (eName < g_iXFAElementCount) ? (g_XFAElementData + eName) : NULL;
+}
+const FX_WORD* XFA_GetElementChildren(XFA_ELEMENT eElement, int32_t& iCount) {
+  if (eElement >= g_iXFAElementCount) {
+    return NULL;
+  }
+  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementChildrenIndex + eElement;
+  iCount = pElement->wCount;
+  return g_XFAElementChildrenData + pElement->wStart;
+}
+const uint8_t* XFA_GetElementAttributes(XFA_ELEMENT eElement, int32_t& iCount) {
+  if (eElement >= g_iXFAElementCount) {
+    return NULL;
+  }
+  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementAttributeIndex + eElement;
+  iCount = pElement->wCount;
+  return g_XFAElementAttributeData + pElement->wStart;
+}
+const XFA_ATTRIBUTEINFO* XFA_GetAttributeOfElement(XFA_ELEMENT eElement,
+                                                   XFA_ATTRIBUTE eAttribute,
+                                                   FX_DWORD dwPacket) {
+  int32_t iCount = 0;
+  const uint8_t* pAttr = XFA_GetElementAttributes(eElement, iCount);
+  if (pAttr == NULL || iCount < 1) {
+    return NULL;
+  }
+  CFX_DSPATemplate<uint8_t> search;
+  int32_t index = search.Lookup(eAttribute, pAttr, iCount);
+  if (index < 0) {
+    return NULL;
+  }
+  const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttribute);
+  ASSERT(pInfo);
+  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
+    return pInfo;
+  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
+}
+const XFA_ELEMENTINFO* XFA_GetChildOfElement(XFA_ELEMENT eElement,
+                                             XFA_ELEMENT eChild,
+                                             FX_DWORD dwPacket) {
+  int32_t iCount = 0;
+  const FX_WORD* pChild = XFA_GetElementChildren(eElement, iCount);
+  if (pChild == NULL || iCount < 1) {
+    return NULL;
+  }
+  CFX_DSPATemplate<FX_WORD> search;
+  int32_t index = search.Lookup(eChild, pChild, iCount);
+  if (index < 0) {
+    return NULL;
+  }
+  const XFA_ELEMENTINFO* pInfo = XFA_GetElementByID(eChild);
+  ASSERT(pInfo);
+  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
+    return pInfo;
+  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
+}
+const XFA_PROPERTY* XFA_GetElementProperties(XFA_ELEMENT eElement,
+                                             int32_t& iCount) {
+  if (eElement >= g_iXFAElementCount) {
+    return NULL;
+  }
+  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementPropertyIndex + eElement;
+  iCount = pElement->wCount;
+  return g_XFAElementPropertyData + pElement->wStart;
+}
+const XFA_PROPERTY* XFA_GetPropertyOfElement(XFA_ELEMENT eElement,
+                                             XFA_ELEMENT eProperty,
+                                             FX_DWORD dwPacket) {
+  int32_t iCount = 0;
+  const XFA_PROPERTY* pProperty = XFA_GetElementProperties(eElement, iCount);
+  if (pProperty == NULL || iCount < 1) {
+    return NULL;
+  }
+  int32_t iStart = 0, iEnd = iCount - 1, iMid;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    XFA_ELEMENT eName = (XFA_ELEMENT)pProperty[iMid].eName;
+    if (eProperty == eName) {
+      break;
+    } else if (eProperty < eName) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  if (iStart > iEnd) {
+    return NULL;
+  }
+  const XFA_ELEMENTINFO* pInfo = XFA_GetElementByID(eProperty);
+  ASSERT(pInfo);
+  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
+    return pProperty + iMid;
+  return (dwPacket & pInfo->dwPackets) ? (pProperty + iMid) : NULL;
+}
+const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(XFA_ELEMENT eElement,
+                                                    XFA_ATTRIBUTE eAttribute,
+                                                    XFA_ATTRIBUTETYPE eType) {
+  int32_t iStart = 0, iEnd = g_iXFANotsureCount - 1;
+  do {
+    int32_t iMid = (iStart + iEnd) / 2;
+    const XFA_NOTSUREATTRIBUTE* pAttr = g_XFANotsureAttributes + iMid;
+    if (eElement == pAttr->eElement) {
+      if (pAttr->eAttribute == eAttribute) {
+        if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
+          return pAttr;
+        }
+        return NULL;
+      } else {
+        int32_t iBefore = iMid - 1;
+        if (iBefore >= 0) {
+          pAttr = g_XFANotsureAttributes + iBefore;
+          while (eElement == pAttr->eElement) {
+            if (pAttr->eAttribute == eAttribute) {
+              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
+                return pAttr;
+              }
+              return NULL;
+            }
+            iBefore--;
+            if (iBefore < 0) {
+              break;
+            }
+            pAttr = g_XFANotsureAttributes + iBefore;
+          }
+        }
+        int32_t iAfter = iMid + 1;
+        if (iAfter <= g_iXFANotsureCount - 1) {
+          pAttr = g_XFANotsureAttributes + iAfter;
+          while (eElement == pAttr->eElement) {
+            if (pAttr->eAttribute == eAttribute) {
+              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
+                return pAttr;
+              }
+              return NULL;
+            }
+            iAfter++;
+            if (iAfter > g_iXFANotsureCount - 1) {
+              break;
+            }
+            pAttr = g_XFANotsureAttributes + iAfter;
+          }
+        }
+        return NULL;
+      }
+    } else if (eElement < pAttr->eElement) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+int32_t XFA_GetMethodCount() {
+  return g_iSomMethodCount;
+}
+const XFA_METHODINFO* XFA_GetMethodByName(XFA_ELEMENT eElement,
+                                          const CFX_WideStringC& wsMethodName) {
+  int32_t iLength = wsMethodName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  int32_t iElementIndex = eElement;
+  while (iElementIndex != -1) {
+    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
+    int32_t icount = scriptIndex->wMethodCount;
+    if (icount == 0) {
+      iElementIndex = scriptIndex->wParentIndex;
+      continue;
+    }
+    uint32_t uHash = FX_HashCode_String_GetW(wsMethodName.GetPtr(), iLength);
+    int32_t iStart = scriptIndex->wMethodStart, iEnd = iStart + icount - 1;
+    do {
+      int32_t iMid = (iStart + iEnd) / 2;
+      const XFA_METHODINFO* pInfo = g_SomMethodData + iMid;
+      if (uHash == pInfo->uHash) {
+        return pInfo;
+      } else if (uHash < pInfo->uHash) {
+        iEnd = iMid - 1;
+      } else {
+        iStart = iMid + 1;
+      }
+    } while (iStart <= iEnd);
+    iElementIndex = scriptIndex->wParentIndex;
+  }
+  return NULL;
+}
+const XFA_SCRIPTATTRIBUTEINFO* XFA_GetScriptAttributeByName(
+    XFA_ELEMENT eElement,
+    const CFX_WideStringC& wsAttributeName) {
+  int32_t iLength = wsAttributeName.GetLength();
+  if (iLength == 0) {
+    return NULL;
+  }
+  int32_t iElementIndex = eElement;
+  while (iElementIndex != -1) {
+    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
+    int32_t icount = scriptIndex->wAttributeCount;
+    if (icount == 0) {
+      iElementIndex = scriptIndex->wParentIndex;
+      continue;
+    }
+    uint32_t uHash = FX_HashCode_String_GetW(wsAttributeName.GetPtr(), iLength);
+    int32_t iStart = scriptIndex->wAttributeStart, iEnd = iStart + icount - 1;
+    do {
+      int32_t iMid = (iStart + iEnd) / 2;
+      const XFA_SCRIPTATTRIBUTEINFO* pInfo = g_SomAttributeData + iMid;
+      if (uHash == pInfo->uHash) {
+        return pInfo;
+      } else if (uHash < pInfo->uHash) {
+        iEnd = iMid - 1;
+      } else {
+        iStart = iMid + 1;
+      }
+    } while (iStart <= iEnd);
+    iElementIndex = scriptIndex->wParentIndex;
+  }
+  return NULL;
+}
+void CXFA_Measurement::Set(const CFX_WideStringC& wsMeasure) {
+  if (wsMeasure.IsEmpty()) {
+    m_fValue = 0;
+    m_eUnit = XFA_UNIT_Unknown;
+    return;
+  }
+  int32_t iUsedLen = 0;
+  int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0;
+  FX_FLOAT fValue = FX_wcstof(wsMeasure.GetPtr() + iOffset,
+                              wsMeasure.GetLength() - iOffset, &iUsedLen);
+  XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen));
+  Set(fValue, eUnit);
+}
+FX_BOOL CXFA_Measurement::ToString(CFX_WideString& wsMeasure) const {
+  switch (GetUnit()) {
+    case XFA_UNIT_Mm:
+      wsMeasure.Format(L"%.8gmm", GetValue());
+      return TRUE;
+    case XFA_UNIT_Pt:
+      wsMeasure.Format(L"%.8gpt", GetValue());
+      return TRUE;
+    case XFA_UNIT_In:
+      wsMeasure.Format(L"%.8gin", GetValue());
+      return TRUE;
+    case XFA_UNIT_Cm:
+      wsMeasure.Format(L"%.8gcm", GetValue());
+      return TRUE;
+    case XFA_UNIT_Mp:
+      wsMeasure.Format(L"%.8gmp", GetValue());
+      return TRUE;
+    case XFA_UNIT_Pc:
+      wsMeasure.Format(L"%.8gpc", GetValue());
+      return TRUE;
+    case XFA_UNIT_Em:
+      wsMeasure.Format(L"%.8gem", GetValue());
+      return TRUE;
+    case XFA_UNIT_Percent:
+      wsMeasure.Format(L"%.8g%%", GetValue());
+      return TRUE;
+    default:
+      wsMeasure.Format(L"%.8g", GetValue());
+      return FALSE;
+  }
+}
+FX_BOOL CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT& fValue) const {
+  fValue = GetValue();
+  XFA_UNIT eFrom = GetUnit();
+  if (eFrom == eUnit) {
+    return TRUE;
+  }
+  switch (eFrom) {
+    case XFA_UNIT_Pt:
+      break;
+    case XFA_UNIT_Mm:
+      fValue *= 72 / 2.54f / 10;
+      break;
+    case XFA_UNIT_In:
+      fValue *= 72;
+      break;
+    case XFA_UNIT_Cm:
+      fValue *= 72 / 2.54f;
+      break;
+    case XFA_UNIT_Mp:
+      fValue *= 0.001f;
+      break;
+    case XFA_UNIT_Pc:
+      fValue *= 12.0f;
+      break;
+    default:
+      fValue = 0;
+      return FALSE;
+  }
+  switch (eUnit) {
+    case XFA_UNIT_Pt:
+      return TRUE;
+    case XFA_UNIT_Mm:
+      fValue /= 72 / 2.54f / 10;
+      return TRUE;
+    case XFA_UNIT_In:
+      fValue /= 72;
+      return TRUE;
+    case XFA_UNIT_Cm:
+      fValue /= 72 / 2.54f;
+      return TRUE;
+    case XFA_UNIT_Mp:
+      fValue /= 0.001f;
+      return TRUE;
+    case XFA_UNIT_Pc:
+      fValue /= 12.0f;
+      return TRUE;
+    default:
+      fValue = 0;
+      return FALSE;
+  }
+  return FALSE;
+}
+XFA_UNIT CXFA_Measurement::GetUnit(const CFX_WideStringC& wsUnit) {
+  if (wsUnit == FX_WSTRC(L"mm")) {
+    return XFA_UNIT_Mm;
+  } else if (wsUnit == FX_WSTRC(L"pt")) {
+    return XFA_UNIT_Pt;
+  } else if (wsUnit == FX_WSTRC(L"in")) {
+    return XFA_UNIT_In;
+  } else if (wsUnit == FX_WSTRC(L"cm")) {
+    return XFA_UNIT_Cm;
+  } else if (wsUnit == FX_WSTRC(L"pc")) {
+    return XFA_UNIT_Pc;
+  } else if (wsUnit == FX_WSTRC(L"mp")) {
+    return XFA_UNIT_Mp;
+  } else if (wsUnit == FX_WSTRC(L"em")) {
+    return XFA_UNIT_Em;
+  } else if (wsUnit == FX_WSTRC(L"%")) {
+    return XFA_UNIT_Percent;
+  } else {
+    return XFA_UNIT_Unknown;
+  }
+}
+IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString& wsBuffer) {
+  return new CXFA_WideTextRead(wsBuffer);
+}
+CXFA_WideTextRead::CXFA_WideTextRead(const CFX_WideString& wsBuffer)
+    : m_wsBuffer(wsBuffer), m_iPosition(0), m_iRefCount(1) {}
+void CXFA_WideTextRead::Release() {
+  if (--m_iRefCount < 1) {
+    delete this;
+  }
+}
+IFX_Stream* CXFA_WideTextRead::Retain() {
+  m_iRefCount++;
+  return this;
+}
+FX_DWORD CXFA_WideTextRead::GetAccessModes() const {
+  return FX_STREAMACCESS_Read | FX_STREAMACCESS_Text;
+}
+int32_t CXFA_WideTextRead::GetLength() const {
+  return m_wsBuffer.GetLength() * sizeof(FX_WCHAR);
+}
+int32_t CXFA_WideTextRead::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
+  switch (eSeek) {
+    case FX_STREAMSEEK_Begin:
+      m_iPosition = iOffset;
+      break;
+    case FX_STREAMSEEK_Current:
+      m_iPosition += iOffset;
+      break;
+    case FX_STREAMSEEK_End:
+      m_iPosition = m_wsBuffer.GetLength() + iOffset;
+      break;
+  }
+  if (m_iPosition < 0) {
+    m_iPosition = 0;
+  }
+  if (m_iPosition > m_wsBuffer.GetLength()) {
+    m_iPosition = m_wsBuffer.GetLength();
+  }
+  return GetPosition();
+}
+int32_t CXFA_WideTextRead::GetPosition() {
+  return m_iPosition * sizeof(FX_WCHAR);
+}
+FX_BOOL CXFA_WideTextRead::IsEOF() const {
+  return m_iPosition >= m_wsBuffer.GetLength();
+}
+int32_t CXFA_WideTextRead::ReadString(FX_WCHAR* pStr,
+                                      int32_t iMaxLength,
+                                      FX_BOOL& bEOS,
+                                      int32_t const* pByteSize) {
+  if (iMaxLength > m_wsBuffer.GetLength() - m_iPosition) {
+    iMaxLength = m_wsBuffer.GetLength() - m_iPosition;
+  }
+  FXSYS_wcsncpy(pStr, (const FX_WCHAR*)m_wsBuffer + m_iPosition, iMaxLength);
+  m_iPosition += iMaxLength;
+  bEOS = IsEOF();
+  return iMaxLength;
+}
+FX_WORD CXFA_WideTextRead::GetCodePage() const {
+  return (sizeof(FX_WCHAR) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE;
+}
+FX_WORD CXFA_WideTextRead::SetCodePage(FX_WORD wCodePage) {
+  return GetCodePage();
+}
diff --git a/xfa/fxfa/parser/xfa_basic_imp.h b/xfa/fxfa/parser/xfa_basic_imp.h
new file mode 100644
index 0000000..7e67d2b
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_basic_imp.h
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_BASIC_IMP_H_
+#define XFA_FXFA_PARSER_XFA_BASIC_IMP_H_
+
+#include "xfa/fgas/crt/fgas_stream.h"
+#include "xfa/include/fxfa/fxfa_basic.h"
+
+struct XFA_NOTSUREATTRIBUTE {
+  XFA_ELEMENT eElement;
+  XFA_ATTRIBUTE eAttribute;
+  XFA_ATTRIBUTETYPE eType;
+  void* pValue;
+};
+const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(
+    XFA_ELEMENT eElement,
+    XFA_ATTRIBUTE eAttribute,
+    XFA_ATTRIBUTETYPE eType = XFA_ATTRIBUTETYPE_NOTSURE);
+
+class CXFA_WideTextRead : public IFX_Stream {
+ public:
+  CXFA_WideTextRead(const CFX_WideString& wsBuffer);
+  virtual void Release();
+  virtual IFX_Stream* Retain();
+
+  virtual FX_DWORD GetAccessModes() const;
+  virtual int32_t GetLength() const;
+  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
+  virtual int32_t GetPosition();
+  virtual FX_BOOL IsEOF() const;
+
+  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
+  virtual int32_t ReadString(FX_WCHAR* pStr,
+                             int32_t iMaxLength,
+                             FX_BOOL& bEOS,
+                             int32_t const* pByteSize = NULL);
+  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
+    return 0;
+  }
+  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+    return 0;
+  }
+  virtual void Flush() {}
+  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+
+  virtual int32_t GetBOM(uint8_t bom[4]) const { return 0; }
+  virtual FX_WORD GetCodePage() const;
+  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
+
+  virtual void Lock() {}
+  virtual void Unlock() {}
+
+  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
+                                         int32_t iOffset,
+                                         int32_t iLength) {
+    return NULL;
+  }
+
+  CFX_WideString GetSrcText() const { return m_wsBuffer; }
+
+ protected:
+  CFX_WideString m_wsBuffer;
+  int32_t m_iPosition;
+  int32_t m_iRefCount;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_BASIC_IMP_H_
diff --git a/xfa/fxfa/parser/xfa_docdata.h b/xfa/fxfa/parser/xfa_docdata.h
new file mode 100644
index 0000000..b3c3edd
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_docdata.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCDATA_H_
+#define XFA_FXFA_PARSER_XFA_DOCDATA_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+
+enum XFA_DATAFORMAT {
+  XFA_DATAFORMAT_XDP,
+};
+
+class IXFA_PacketExport {
+ public:
+  static IXFA_PacketExport* Create(CXFA_Document* pDocument,
+                                   XFA_DATAFORMAT eFormat = XFA_DATAFORMAT_XDP);
+  virtual ~IXFA_PacketExport() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL Export(IFX_FileWrite* pWrite) = 0;
+  virtual FX_BOOL Export(IFX_FileWrite* pWrite,
+                         CXFA_Node* pNode,
+                         FX_DWORD dwFlag = 0,
+                         const FX_CHAR* pChecksum = NULL) = 0;
+};
+class IXFA_PacketImport {
+ public:
+  static IXFA_PacketImport* Create(CXFA_Document* pDstDoc);
+  virtual ~IXFA_PacketImport() {}
+  virtual void Release() = 0;
+  virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument) = 0;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCDATA_H_
diff --git a/xfa/fxfa/parser/xfa_doclayout.h b/xfa/fxfa/parser/xfa_doclayout.h
new file mode 100644
index 0000000..bb44868
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_doclayout.h
@@ -0,0 +1,136 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCLAYOUT_H_
+#define XFA_FXFA_PARSER_XFA_DOCLAYOUT_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+
+class CXFA_ContainerLayoutItem;
+class CXFA_ContentLayoutItem;
+class IXFA_DocLayout;
+
+class IXFA_LayoutPage {
+ public:
+  virtual ~IXFA_LayoutPage() {}
+  virtual IXFA_DocLayout* GetLayout() const = 0;
+  virtual int32_t GetPageIndex() const = 0;
+  virtual void GetPageSize(CFX_SizeF& size) = 0;
+  virtual CXFA_Node* GetMasterPage() const = 0;
+};
+
+class CXFA_LayoutItem {
+ public:
+  virtual ~CXFA_LayoutItem();
+
+  FX_BOOL IsContainerLayoutItem() const { return !m_bIsContentLayoutItem; }
+  FX_BOOL IsContentLayoutItem() const { return m_bIsContentLayoutItem; }
+  inline CXFA_ContainerLayoutItem* AsContainerLayoutItem();
+  inline CXFA_ContentLayoutItem* AsContentLayoutItem();
+
+  IXFA_LayoutPage* GetPage() const;
+  CXFA_Node* GetFormNode() const;
+  void GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative = FALSE) const;
+  int32_t GetIndex() const;
+  int32_t GetCount() const;
+  CXFA_LayoutItem* GetParent() const;
+  const CXFA_LayoutItem* GetFirst() const;
+  CXFA_LayoutItem* GetFirst();
+  const CXFA_LayoutItem* GetLast() const;
+  CXFA_LayoutItem* GetLast();
+  CXFA_LayoutItem* GetPrev() const;
+  CXFA_LayoutItem* GetNext() const;
+
+  void AddChild(CXFA_LayoutItem* pChildItem);
+  void AddHeadChild(CXFA_LayoutItem* pChildItem);
+  void RemoveChild(CXFA_LayoutItem* pChildItem);
+  void InsertChild(CXFA_LayoutItem* pBeforeItem, CXFA_LayoutItem* pChildItem);
+
+  CXFA_Node* m_pFormNode;
+  CXFA_LayoutItem* m_pParent;
+  CXFA_LayoutItem* m_pNextSibling;
+  CXFA_LayoutItem* m_pFirstChild;
+
+ protected:
+  CXFA_LayoutItem(CXFA_Node* pNode, FX_BOOL bIsContentLayoutItem);
+
+  FX_BOOL m_bIsContentLayoutItem;
+};
+
+class CXFA_ContainerLayoutItem : public CXFA_LayoutItem,
+                                 public IXFA_LayoutPage {
+ public:
+  CXFA_ContainerLayoutItem(CXFA_Node* pNode);
+
+  // IXFA_LayoutPage:
+  IXFA_DocLayout* GetLayout() const override;
+  int32_t GetPageIndex() const override;
+  void GetPageSize(CFX_SizeF& size) override;
+  CXFA_Node* GetMasterPage() const override;
+
+  CXFA_Node* m_pOldSubform;
+};
+
+#define XFA_WIDGETSTATUS_Access 0x80000000
+#define XFA_WIDGETSTATUS_Disabled 0x40000000
+#define XFA_WIDGETSTATUS_RectCached 0x20000000
+#define XFA_WIDGETSTATUS_ButtonDown 0x10000000
+#define XFA_WIDGETSTATUS_Highlight 0x08000000
+#define XFA_WIDGETSTATUS_TextEditValueChanged 0x04000000
+
+class CXFA_ContentLayoutItem : public CXFA_LayoutItem {
+ public:
+  CXFA_ContentLayoutItem(CXFA_Node* pNode);
+  virtual ~CXFA_ContentLayoutItem();
+
+  CXFA_ContentLayoutItem* m_pPrev;
+  CXFA_ContentLayoutItem* m_pNext;
+  CFX_PointF m_sPos;
+  CFX_SizeF m_sSize;
+  FX_DWORD m_dwStatus;
+};
+
+CXFA_ContainerLayoutItem* CXFA_LayoutItem::AsContainerLayoutItem() {
+  return IsContainerLayoutItem() ? static_cast<CXFA_ContainerLayoutItem*>(this)
+                                 : nullptr;
+}
+CXFA_ContentLayoutItem* CXFA_LayoutItem::AsContentLayoutItem() {
+  return IsContentLayoutItem() ? static_cast<CXFA_ContentLayoutItem*>(this)
+                               : nullptr;
+}
+inline CXFA_ContainerLayoutItem* ToContainerLayoutItem(CXFA_LayoutItem* pItem) {
+  return pItem ? pItem->AsContainerLayoutItem() : nullptr;
+}
+inline CXFA_ContentLayoutItem* ToContentLayoutItem(CXFA_LayoutItem* pItem) {
+  return pItem ? pItem->AsContentLayoutItem() : nullptr;
+}
+
+class CXFA_TraverseStrategy_LayoutItem {
+ public:
+  static inline CXFA_LayoutItem* GetFirstChild(CXFA_LayoutItem* pLayoutItem) {
+    return pLayoutItem->m_pFirstChild;
+  }
+  static inline CXFA_LayoutItem* GetNextSibling(CXFA_LayoutItem* pLayoutItem) {
+    return pLayoutItem->m_pNextSibling;
+  }
+  static inline CXFA_LayoutItem* GetParent(CXFA_LayoutItem* pLayoutItem) {
+    return pLayoutItem->m_pParent;
+  }
+};
+
+class IXFA_DocLayout {
+ public:
+  virtual ~IXFA_DocLayout() {}
+  virtual CXFA_Document* GetDocument() const = 0;
+  virtual int32_t StartLayout(FX_BOOL bForceRestart = FALSE) = 0;
+  virtual int32_t DoLayout(IFX_Pause* pPause = NULL) = 0;
+  virtual FX_BOOL IncrementLayout() = 0;
+  virtual int32_t CountPages() const = 0;
+  virtual IXFA_LayoutPage* GetPage(int32_t index) const = 0;
+  virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem) = 0;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCLAYOUT_H_
diff --git a/xfa/fxfa/parser/xfa_document.h b/xfa/fxfa/parser/xfa_document.h
new file mode 100644
index 0000000..affe400
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document.h
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_H_
+#define XFA_FXFA_PARSER_XFA_DOCUMENT_H_
+
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/include/fxfa/fxfa.h"
+
+class CXFA_Document;
+class CXFA_LayoutItem;
+class CXFA_LayoutProcessor;
+class CXFA_Node;
+class IXFA_DocLayout;
+class IXFA_DocParser;
+class IXFA_LayoutPage;
+class IXFA_Notify;
+class IXFA_ObjFactory;
+class IXFA_ScriptContext;
+
+enum XFA_VERSION {
+  XFA_VERSION_UNKNOWN = 0,
+  XFA_VERSION_200 = 200,
+  XFA_VERSION_202 = 202,
+  XFA_VERSION_204 = 204,
+  XFA_VERSION_205 = 205,
+  XFA_VERSION_206 = 206,
+  XFA_VERSION_207 = 207,
+  XFA_VERSION_208 = 208,
+  XFA_VERSION_300 = 300,
+  XFA_VERSION_301 = 301,
+  XFA_VERSION_303 = 303,
+  XFA_VERSION_306 = 306,
+  XFA_VERSION_DEFAULT = XFA_VERSION_303,
+  XFA_VERSION_MIN = 200,
+  XFA_VERSION_MAX = 400,
+};
+
+#define XFA_LAYOUTSTATUS_Visible 0x0001
+#define XFA_LAYOUTSTATUS_Viewable 0x0010
+#define XFA_LAYOUTSTATUS_Printable 0x0020
+enum XFA_NODEEVENT {
+  XFA_NODEEVENT_Ready,
+  XFA_NODEEVENT_ValueChanging,
+  XFA_NODEEVENT_ValueChanged,
+  XFA_NODEEVENT_ChildAdded,
+  XFA_NODEEVENT_ChildRemoved,
+};
+enum XFA_PAGEEVENT {
+  XFA_PAGEEVENT_PageAdded,
+  XFA_PAGEEVENT_PageRemoved,
+};
+enum XFA_LAYOUTEVENT {
+  XFA_LAYOUTEVENT_ItemAdded,
+  XFA_LAYOUTEVENT_ItemRemoving,
+  XFA_LAYOUTEVENT_RectChanged,
+  XFA_LAYOUTEVENT_StatusChanged,
+};
+enum XFA_LAYOUTRESULT {
+  XFA_LAYOUTRESULT_Continue,
+  XFA_LAYOUTRESULT_Done,
+  XFA_LAYOUTRESULT_NextContent,
+};
+#define XFA_LAYOUTNOTIFY_StrictHeight 0x0001
+#define XFA_LAYOUTNOTIFY_NoParentBreak 0x0002
+
+class IXFA_Notify {
+ public:
+  virtual ~IXFA_Notify() {}
+  virtual void OnPageEvent(IXFA_LayoutPage* pSender,
+                           XFA_PAGEEVENT eEvent,
+                           void* pParam = NULL) = 0;
+
+  virtual void OnNodeEvent(CXFA_Node* pSender,
+                           XFA_NODEEVENT eEvent,
+                           void* pParam = NULL,
+                           void* pParam2 = NULL,
+                           void* pParam3 = NULL,
+                           void* pParam4 = NULL) = 0;
+  virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
+                                 FX_DWORD dwEvent,
+                                 void* pParam = NULL,
+                                 void* pAdditional = NULL,
+                                 void* pAdditional2 = NULL) = 0;
+
+  virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode) = 0;
+  virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
+                             CXFA_LayoutItem* pSender,
+                             XFA_LAYOUTEVENT eEvent,
+                             void* pParam = NULL,
+                             void* pParam2 = NULL) = 0;
+  virtual void StartFieldDrawLayout(CXFA_Node* pItem,
+                                    FX_FLOAT& fCalcWidth,
+                                    FX_FLOAT& fCalcHeight) = 0;
+  virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
+                               int32_t iBlockIndex,
+                               FX_FLOAT& fCalcHeightPos) = 0;
+  virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) = 0;
+  virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
+                                       XFA_EVENTTYPE eEventType,
+                                       FX_BOOL bIsFormReady = FALSE,
+                                       FX_BOOL bRecursive = TRUE,
+                                       CXFA_WidgetAcc* pExclude = NULL) = 0;
+  virtual void AddCalcValidate(CXFA_Node* pNode) = 0;
+  virtual IXFA_Doc* GetHDOC() = 0;
+  virtual IXFA_DocProvider* GetDocProvider() = 0;
+  virtual IXFA_AppProvider* GetAppProvider() = 0;
+  virtual IXFA_WidgetHandler* GetWidgetHandler() = 0;
+  virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem) = 0;
+  virtual void OpenDropDownList(IXFA_Widget* hWidget) = 0;
+  virtual CFX_WideString GetCurrentDateTime() = 0;
+  virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL) = 0;
+  virtual int32_t GetLayoutStatus() = 0;
+  virtual void RunNodeInitialize(CXFA_Node* pNode) = 0;
+  virtual void RunSubformIndexChange(CXFA_Node* pSubformNode) = 0;
+  virtual CXFA_Node* GetFocusWidgetNode() = 0;
+  virtual void SetFocusWidgetNode(CXFA_Node* pNode) = 0;
+};
+class IXFA_ObjFactory {
+ public:
+  virtual ~IXFA_ObjFactory() {}
+  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) = 0;
+  virtual CXFA_Node* CreateNode(const XFA_PACKETINFO* pPacket,
+                                XFA_ELEMENT eElement) = 0;
+};
+#define XFA_DOCFLAG_StrictScoping 0x0001
+#define XFA_DOCFLAG_HasInteractive 0x0002
+#define XFA_DOCFLAG_Interactive 0x0004
+#define XFA_DOCFLAG_Scripting 0x0008
+class CScript_DataWindow;
+class CScript_EventPseudoModel;
+class CScript_HostPseudoModel;
+class CScript_LogPseudoModel;
+class CScript_LayoutPseudoModel;
+class CScript_SignaturePseudoModel;
+class CXFA_Document : public IXFA_ObjFactory {
+ public:
+  CXFA_Document(IXFA_DocParser* pParser);
+  ~CXFA_Document();
+  CXFA_Node* GetRoot() const { return m_pRootNode; }
+  IXFA_DocParser* GetParser() const { return m_pParser; }
+  IXFA_Notify* GetNotify() const;
+  void SetRoot(CXFA_Node* pNewRoot);
+  CXFA_Object* GetXFAObject(const CFX_WideStringC& wsNodeName);
+  CXFA_Object* GetXFAObject(FX_DWORD wsNodeNameHash);
+  void AddPurgeNode(CXFA_Node* pNode);
+  FX_BOOL RemovePurgeNode(CXFA_Node* pNode);
+  void PurgeNodes();
+  bool HasFlag(FX_DWORD dwFlag) { return (m_dwDocFlags & dwFlag) == dwFlag; }
+  void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE);
+  FX_BOOL IsInteractive();
+  XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; }
+  XFA_VERSION RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS);
+  CXFA_LocaleMgr* GetLocalMgr();
+  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement);
+  virtual CXFA_Node* CreateNode(const XFA_PACKETINFO* pPacket,
+                                XFA_ELEMENT eElement);
+  void DoProtoMerge();
+  CXFA_Node* GetNodeByID(CXFA_Node* pRoot, const CFX_WideStringC& wsID);
+  void DoDataMerge();
+  void DoDataRemerge(FX_BOOL bDoDataMerge);
+  CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
+                                     CXFA_Node* pFormNode,
+                                     CXFA_Node* pDataScope,
+                                     FX_BOOL bOneInstance = FALSE,
+                                     FX_BOOL bDataMerge = TRUE,
+                                     FX_BOOL bUpLevel = TRUE);
+  void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot);
+  CXFA_Node* GetNotBindNode(CXFA_ObjArray& arrayNodes);
+  CXFA_LayoutProcessor* GetLayoutProcessor();
+  IXFA_DocLayout* GetDocLayout();
+  IXFA_ScriptContext* InitScriptContext(FXJSE_HRUNTIME hRuntime);
+  IXFA_ScriptContext* GetScriptContext();
+  void ClearLayoutData();
+
+  CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> m_rgGlobalBinding;
+  CXFA_NodeArray m_pPendingPageSet;
+
+ protected:
+  IXFA_DocParser* m_pParser;
+  IXFA_ScriptContext* m_pScriptContext;
+  CXFA_LayoutProcessor* m_pLayoutProcessor;
+  CXFA_Node* m_pRootNode;
+  CXFA_LocaleMgr* m_pLocalMgr;
+  CScript_DataWindow* m_pScriptDataWindow;
+  CScript_EventPseudoModel* m_pScriptEvent;
+  CScript_HostPseudoModel* m_pScriptHost;
+  CScript_LogPseudoModel* m_pScriptLog;
+  CScript_LayoutPseudoModel* m_pScriptLayout;
+  CScript_SignaturePseudoModel* m_pScriptSignature;
+  CXFA_NodeSet m_rgPurgeNodes;
+  XFA_VERSION m_eCurVersionMode;
+  FX_DWORD m_dwDocFlags;
+  friend class CXFA_SimpleParser;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCUMENT_H_
diff --git a/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp b/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp
new file mode 100644
index 0000000..8cc8d01
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp
@@ -0,0 +1,126 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+#define XFA_HASHCODE_Group 0xf7f75fcd
+
+class CXFA_TraverseStrategy_DDGroup {
+ public:
+  static inline CXFA_Node* GetFirstChild(CXFA_Node* pDDGroupNode) {
+    return pDDGroupNode->GetFirstChildByName(XFA_HASHCODE_Group);
+  }
+  static inline CXFA_Node* GetNextSibling(CXFA_Node* pDDGroupNode) {
+    return pDDGroupNode->GetNextSameNameSibling(XFA_HASHCODE_Group);
+  }
+  static inline CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) {
+    return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+};
+void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode,
+                                            CXFA_Node* pDataDescriptionNode) {
+  FXSYS_assert(pDataDescriptionNode);
+  for (CXFA_Node* pDataChild = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pDataChild;
+       pDataChild = pDataChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    FX_DWORD dwNameHash = pDataChild->GetNameHash();
+    XFA_ELEMENT eType = pDataChild->GetClassID();
+    if (!dwNameHash) {
+      continue;
+    }
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup>
+        sIterator(pDataDescriptionNode);
+    for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode;
+         pDDGroupNode = sIterator.MoveToNext()) {
+      if (pDDGroupNode != pDataDescriptionNode) {
+        if (pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) {
+          continue;
+        }
+        CFX_WideString wsNamespace;
+        if (!pDDGroupNode->TryNamespace(wsNamespace) ||
+            wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
+          continue;
+        }
+      }
+      CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(dwNameHash);
+      if (!pDDNode) {
+        continue;
+      }
+      if (pDDNode->GetClassID() != eType) {
+        break;
+      }
+      pDataChild->SetDataDescriptionNode(pDDNode);
+      XFA_DataDescription_UpdateDataRelation(pDataChild, pDDNode);
+      break;
+    }
+  }
+}
+CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(
+    CXFA_Document* pDocument,
+    CXFA_Node* pDataParent,
+    XFA_ELEMENT eNodeType,
+    const CFX_WideStringC& wsName) {
+  if (!pDataParent) {
+    return NULL;
+  }
+  CXFA_Node* pParentDDNode = pDataParent->GetDataDescriptionNode();
+  if (!pParentDDNode) {
+    CXFA_Node* pDataNode =
+        pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
+    FXSYS_assert(pDataNode);
+    pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
+    pDataNode->CreateXMLMappingNode();
+    pDataParent->InsertChild(pDataNode);
+    pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+    return pDataNode;
+  } else {
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup>
+        sIterator(pParentDDNode);
+    for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode;
+         pDDGroupNode = sIterator.MoveToNext()) {
+      if (pDDGroupNode != pParentDDNode) {
+        if (pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) {
+          continue;
+        }
+        CFX_WideString wsNamespace;
+        if (!pDDGroupNode->TryNamespace(wsNamespace) ||
+            wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
+          continue;
+        }
+      }
+      CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(wsName);
+      if (!pDDNode) {
+        continue;
+      }
+      if (pDDNode->GetClassID() != eNodeType) {
+        break;
+      }
+      CXFA_Node* pDataNode =
+          pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
+      FXSYS_assert(pDataNode);
+      pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
+      pDataNode->CreateXMLMappingNode();
+      if (eNodeType == XFA_ELEMENT_DataValue &&
+          pDDNode->GetEnum(XFA_ATTRIBUTE_Contains) ==
+              XFA_ATTRIBUTEENUM_MetaData) {
+        pDataNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_MetaData);
+      }
+      pDataParent->InsertChild(pDataNode);
+      pDataNode->SetDataDescriptionNode(pDDNode);
+      pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      return pDataNode;
+    }
+    return NULL;
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_document_datadescription_imp.h b/xfa/fxfa/parser/xfa_document_datadescription_imp.h
new file mode 100644
index 0000000..f7c626d
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_datadescription_imp.h
@@ -0,0 +1,18 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
+#define XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
+
+void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode,
+                                            CXFA_Node* pDataDescriptionNode);
+CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(
+    CXFA_Document* pDocument,
+    CXFA_Node* pDataParent,
+    XFA_ELEMENT eNodeType,
+    const CFX_WideStringC& wsName);
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
new file mode 100644
index 0000000..0dc087a
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -0,0 +1,1429 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_document_datamerger_imp.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_datadescription_imp.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+static FX_BOOL XFA_GetOccurInfo(CXFA_Node* pOccurNode,
+                                int32_t& iMin,
+                                int32_t& iMax,
+                                int32_t& iInit) {
+  if (!pOccurNode) {
+    return FALSE;
+  }
+  CXFA_Occur occur(pOccurNode);
+  return occur.GetOccurInfo(iMin, iMax, iInit);
+}
+struct XFA_DataMerge_RecurseRecord {
+  CXFA_Node* pTemplateChild;
+  CXFA_Node* pDataChild;
+};
+static CXFA_Node* XFA_DataMerge_FormValueNode_CreateChild(
+    CXFA_Node* pValueNode,
+    XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) {
+  CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (!pChildNode) {
+    if (iType == XFA_ELEMENT_UNKNOWN) {
+      return FALSE;
+    }
+    pChildNode = pValueNode->GetProperty(0, iType);
+  }
+  return pChildNode;
+}
+static void XFA_DataMerge_FormValueNode_MatchNoneCreateChild(
+    CXFA_Node* pFormNode) {
+  CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData();
+  FXSYS_assert(pWidgetData);
+  pWidgetData->GetUIType();
+}
+static FX_BOOL XFA_DataMerge_FormValueNode_SetChildContent(
+    CXFA_Node* pValueNode,
+    const CFX_WideString& wsContent,
+    XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) {
+  if (!pValueNode) {
+    return FALSE;
+  }
+  FXSYS_assert(pValueNode->GetPacketID() == XFA_XDPPACKET_Form);
+  CXFA_Node* pChildNode =
+      XFA_DataMerge_FormValueNode_CreateChild(pValueNode, iType);
+  if (!pChildNode) {
+    return FALSE;
+  }
+  XFA_OBJECTTYPE objectType = pChildNode->GetObjectType();
+  switch (objectType) {
+    case XFA_OBJECTTYPE_ContentNode: {
+      CXFA_Node* pContentRawDataNode =
+          pChildNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!pContentRawDataNode) {
+        XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
+        if (pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
+          CFX_WideString wsContentType;
+          pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
+                                   FALSE);
+          if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+            element = XFA_ELEMENT_SharpxHTML;
+          } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
+            element = XFA_ELEMENT_Sharpxml;
+          }
+        }
+        pContentRawDataNode = pChildNode->CreateSamePacketNode(element);
+        pChildNode->InsertChild(pContentRawDataNode);
+      }
+      pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
+    } break;
+    case XFA_OBJECTTYPE_NodeC:
+    case XFA_OBJECTTYPE_TextNode:
+    case XFA_OBJECTTYPE_NodeV: {
+      pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
+    } break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  return TRUE;
+}
+static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode,
+                                            CXFA_Node* pDataNode,
+                                            FX_BOOL bDataToForm = TRUE) {
+  pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode);
+  pDataNode->AddBindItem(pFormNode);
+  XFA_ELEMENT eClass = pFormNode->GetClassID();
+  if (eClass != XFA_ELEMENT_Field && eClass != XFA_ELEMENT_ExclGroup) {
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData();
+  FXSYS_assert(pWidgetData);
+  FX_BOOL bNotify = FALSE;
+  XFA_ELEMENT eUIType = pWidgetData->GetUIType();
+  CXFA_Value defValue(pFormNode->GetProperty(0, XFA_ELEMENT_Value));
+  if (!bDataToForm) {
+    CFX_WideString wsValue;
+    CFX_WideString wsFormatedValue;
+    switch (eUIType) {
+      case XFA_ELEMENT_ImageEdit: {
+        CXFA_Image image = defValue.GetImage();
+        CFX_WideString wsContentType;
+        CFX_WideString wsHref;
+        if (image) {
+          image.GetContent(wsValue);
+          image.GetContentType(wsContentType);
+          image.GetHref(wsHref);
+        }
+        IFDE_XMLElement* pXMLDataElement =
+            (IFDE_XMLElement*)(pDataNode->GetXMLMappingNode());
+        FXSYS_assert(pXMLDataElement);
+        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
+        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+        pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+        if (!wsHref.IsEmpty()) {
+          pXMLDataElement->SetString(FX_WSTRC(L"href"), wsHref);
+        }
+      } break;
+      case XFA_ELEMENT_ChoiceList:
+        defValue.GetChildValueContent(wsValue);
+        if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+          CFX_WideStringArray wsSelTextArray;
+          pWidgetData->GetSelectedItemsValue(wsSelTextArray);
+          int32_t iSize = wsSelTextArray.GetSize();
+          if (iSize >= 1) {
+            CXFA_Node* pValue = NULL;
+            for (int32_t i = 0; i < iSize; i++) {
+              pValue = pDataNode->CreateSamePacketNode(XFA_ELEMENT_DataValue);
+              pValue->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value"));
+              pValue->CreateXMLMappingNode();
+              pDataNode->InsertChild(pValue);
+              pValue->SetCData(XFA_ATTRIBUTE_Value, wsSelTextArray[i]);
+            }
+          } else {
+            IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
+            FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
+            ((IFDE_XMLElement*)pXMLNode)
+                ->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup"));
+          }
+        } else if (!wsValue.IsEmpty()) {
+          pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
+          pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+        }
+        break;
+      case XFA_ELEMENT_CheckButton:
+        defValue.GetChildValueContent(wsValue);
+        if (wsValue.IsEmpty()) {
+          break;
+        }
+        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
+        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+        break;
+      case XFA_ELEMENT_ExclGroup: {
+        CXFA_Node* pChecked = NULL;
+        CXFA_Node* pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+        for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+          if (pChild->GetClassID() != XFA_ELEMENT_Field) {
+            continue;
+          }
+          CXFA_Node* pValue = pChild->GetChild(0, XFA_ELEMENT_Value);
+          if (!pValue) {
+            continue;
+          }
+          CXFA_Value valueChild(pValue);
+          valueChild.GetChildValueContent(wsValue);
+          if (wsValue.IsEmpty()) {
+            continue;
+          }
+          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
+          if (!pItems) {
+            continue;
+          }
+          CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+          if (!pText) {
+            continue;
+          }
+          CFX_WideString wsContent;
+          if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
+            pChecked = pChild;
+            wsFormatedValue = wsValue;
+            pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+            pFormNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
+            break;
+          }
+        }
+        if (!pChecked) {
+          break;
+        }
+        pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+        for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+          if (pChild == pChecked) {
+            continue;
+          }
+          if (pChild->GetClassID() != XFA_ELEMENT_Field) {
+            continue;
+          }
+          CXFA_Node* pValue = pChild->GetProperty(0, XFA_ELEMENT_Value);
+          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
+          CXFA_Node* pText =
+              pItems ? pItems->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL;
+          if (pText) {
+            pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+          }
+          CFX_WideString wsContent;
+          if (pText) {
+            pText->TryContent(wsContent);
+          }
+          XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsContent,
+                                                      XFA_ELEMENT_Text);
+        }
+      } break;
+      case XFA_ELEMENT_NumericEdit: {
+        defValue.GetChildValueContent(wsValue);
+        if (wsValue.IsEmpty()) {
+          break;
+        }
+        CFX_WideString wsOutput;
+        pWidgetData->NormalizeNumStr(wsValue, wsOutput);
+        wsValue = wsOutput;
+        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
+        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+        CXFA_Node* pValue = pFormNode->GetProperty(0, XFA_ELEMENT_Value);
+        XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsValue,
+                                                    XFA_ELEMENT_Float);
+      } break;
+      default:
+        defValue.GetChildValueContent(wsValue);
+        if (wsValue.IsEmpty()) {
+          break;
+        }
+        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
+        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
+        break;
+    }
+  } else {
+    CFX_WideString wsXMLValue;
+    pDataNode->TryContent(wsXMLValue);
+    CFX_WideString wsNormailizeValue;
+    pWidgetData->GetNormalizeDataValue(wsXMLValue, wsNormailizeValue);
+    pDataNode->SetAttributeValue(wsNormailizeValue, wsXMLValue);
+    switch (eUIType) {
+      case XFA_ELEMENT_ImageEdit: {
+        XFA_DataMerge_FormValueNode_SetChildContent(
+            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Image);
+        CXFA_Image image = defValue.GetImage();
+        if (image) {
+          IFDE_XMLElement* pXMLDataElement =
+              (IFDE_XMLElement*)(pDataNode->GetXMLMappingNode());
+          FXSYS_assert(pXMLDataElement);
+          CFX_WideString wsContentType;
+          CFX_WideString wsHref;
+          pXMLDataElement->GetString(L"xfa:contentType", wsContentType);
+          if (!wsContentType.IsEmpty()) {
+            pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+            image.SetContentType(wsContentType);
+          }
+          pXMLDataElement->GetString(L"href", wsHref);
+          if (!wsHref.IsEmpty()) {
+            image.SetHref(wsHref);
+          }
+        }
+      } break;
+      case XFA_ELEMENT_ChoiceList:
+        if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+          CXFA_NodeArray items;
+          pDataNode->GetNodeList(items);
+          int32_t iCounts = items.GetSize();
+          if (iCounts > 0) {
+            wsNormailizeValue.Empty();
+            CFX_WideString wsItem;
+            for (int32_t i = 0; i < iCounts; i++) {
+              items[i]->TryContent(wsItem);
+              wsItem = (iCounts == 1) ? wsItem : wsItem + FX_WSTRC(L"\n");
+              wsNormailizeValue += wsItem;
+            }
+            CXFA_ExData exData = defValue.GetExData();
+            FXSYS_assert(exData);
+            exData.SetContentType((iCounts == 1) ? FX_WSTRC(L"text/plain")
+                                                 : FX_WSTRC(L"text/xml"));
+          }
+          XFA_DataMerge_FormValueNode_SetChildContent(
+              defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_ExData);
+        } else {
+          XFA_DataMerge_FormValueNode_SetChildContent(
+              defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
+        }
+        break;
+      case XFA_ELEMENT_CheckButton:
+        XFA_DataMerge_FormValueNode_SetChildContent(
+            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
+        break;
+      case XFA_ELEMENT_ExclGroup: {
+        pWidgetData->SetSelectedMemberByValue(wsNormailizeValue, bNotify, FALSE,
+                                              FALSE);
+      } break;
+      case XFA_ELEMENT_DateTimeEdit:
+        XFA_DataMerge_FormValueNode_SetChildContent(
+            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_DateTime);
+        break;
+      case XFA_ELEMENT_NumericEdit: {
+        CFX_WideString wsPicture;
+        pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
+        if (wsPicture.IsEmpty()) {
+          CFX_WideString wsOutput;
+          pWidgetData->NormalizeNumStr(wsNormailizeValue, wsOutput);
+          wsNormailizeValue = wsOutput;
+        }
+        XFA_DataMerge_FormValueNode_SetChildContent(
+            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Float);
+      } break;
+      case XFA_ELEMENT_Barcode:
+      case XFA_ELEMENT_Button:
+      case XFA_ELEMENT_PasswordEdit:
+      case XFA_ELEMENT_Signature:
+      case XFA_ELEMENT_TextEdit:
+      default:
+        XFA_DataMerge_FormValueNode_SetChildContent(
+            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
+        break;
+    }
+  }
+}
+static CXFA_Node* XFA_DataMerge_GetGlobalBinding(CXFA_Document* pDocument,
+                                                 FX_DWORD dwNameHash) {
+  CXFA_Node* pNode = NULL;
+  pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode);
+  return pNode;
+}
+static void XFA_DataMerge_RegisterGlobalBinding(CXFA_Document* pDocument,
+                                                FX_DWORD dwNameHash,
+                                                CXFA_Node* pDataNode) {
+  pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode);
+}
+static void XFA_DataMerge_ClearGlobalBinding(CXFA_Document* pDocument) {
+  pDocument->m_rgGlobalBinding.RemoveAll();
+}
+static CXFA_Node* XFA_DataMerge_ScopeMatchGlobalBinding(
+    CXFA_Node* pDataScope,
+    FX_DWORD dwNameHash,
+    XFA_ELEMENT eMatchDataNodeType,
+    FX_BOOL bUpLevel = TRUE) {
+  for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL;
+       pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets;
+       pLastDataScope = pCurDataScope,
+                 pCurDataScope =
+                     pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) {
+    for (CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash);
+         pDataChild;
+         pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) {
+      if (pDataChild == pLastDataScope ||
+          (eMatchDataNodeType != XFA_ELEMENT_DataModel &&
+           pDataChild->GetClassID() != eMatchDataNodeType) ||
+          pDataChild->HasBindItem()) {
+        continue;
+      }
+      return pDataChild;
+    }
+    for (CXFA_Node* pDataChild =
+             pCurDataScope->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
+         pDataChild; pDataChild = pDataChild->GetNextSameClassSibling(
+                         XFA_ELEMENT_DataGroup)) {
+      CXFA_Node* pDataNode = XFA_DataMerge_ScopeMatchGlobalBinding(
+          pDataChild, dwNameHash, eMatchDataNodeType, FALSE);
+      if (pDataNode) {
+        return pDataNode;
+      }
+    }
+    if (!bUpLevel) {
+      break;
+    }
+  }
+  return NULL;
+}
+static CXFA_Node* XFA_DataMerge_FindGlobalDataNode(CXFA_Document* pDocument,
+                                                   CFX_WideStringC wsName,
+                                                   CXFA_Node* pDataScope,
+                                                   XFA_ELEMENT eMatchNodeType) {
+  FX_DWORD dwNameHash =
+      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
+                                                     wsName.GetLength());
+  if (dwNameHash != 0) {
+    CXFA_Node* pBounded = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash);
+    if (!pBounded) {
+      pBounded = XFA_DataMerge_ScopeMatchGlobalBinding(pDataScope, dwNameHash,
+                                                       eMatchNodeType);
+      if (pBounded) {
+        XFA_DataMerge_RegisterGlobalBinding(pDocument, dwNameHash, pBounded);
+      }
+    }
+    return pBounded;
+  }
+  return NULL;
+}
+static CXFA_Node* XFA_DataMerge_FindOnceDataNode(CXFA_Document* pDocument,
+                                                 CFX_WideStringC wsName,
+                                                 CXFA_Node* pDataScope,
+                                                 XFA_ELEMENT eMatchNodeType) {
+  FX_DWORD dwNameHash =
+      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
+                                                     wsName.GetLength());
+  if (dwNameHash != 0) {
+    for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL;
+         pCurDataScope &&
+         pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets;
+         pLastDataScope = pCurDataScope,
+                   pCurDataScope =
+                       pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) {
+      for (CXFA_Node* pDataChild =
+               pCurDataScope->GetFirstChildByName(dwNameHash);
+           pDataChild;
+           pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) {
+        if (pDataChild == pLastDataScope ||
+            (eMatchNodeType != XFA_ELEMENT_DataModel &&
+             pDataChild->GetClassID() != eMatchNodeType) ||
+            pDataChild->HasBindItem()) {
+          continue;
+        }
+        return pDataChild;
+      }
+    }
+  }
+  return NULL;
+}
+static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument,
+                                                    CFX_WideStringC wsRef,
+                                                    CXFA_Node* pDataScope,
+                                                    XFA_ELEMENT eMatchNodeType,
+                                                    CXFA_Node* pTemplateNode,
+                                                    FX_BOOL bForceBind,
+                                                    FX_BOOL bUpLevel = TRUE) {
+  FX_DWORD dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew;
+  if (bUpLevel || wsRef != FX_WSTRC(L"name")) {
+    dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
+  }
+  XFA_RESOLVENODE_RS rs;
+  pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags,
+                                                pTemplateNode);
+  if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll ||
+      rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll ||
+      rs.nodes.GetSize() > 1) {
+    return pDocument->GetNotBindNode(rs.nodes);
+  }
+  if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
+    CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
+    CXFA_Node* pNode = ToNode(pObject);
+    if (!bForceBind && pNode && pNode->HasBindItem()) {
+      pNode = NULL;
+    }
+    return pNode;
+  }
+  return NULL;
+}
+CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument,
+                                             XFA_ELEMENT eClassID,
+                                             FX_DWORD dwNameHash,
+                                             CXFA_Node* pFormParent) {
+  CXFA_Node* pFormChild = pFormParent->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pFormChild;
+       pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pFormChild->GetClassID() == eClassID &&
+        pFormChild->GetNameHash() == dwNameHash &&
+        pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+      return pFormChild;
+    }
+  }
+  return NULL;
+}
+static FX_BOOL XFA_NeedGenerateForm(CXFA_Node* pTemplateChild,
+                                    FX_BOOL bUseInstanceManager = TRUE) {
+  XFA_ELEMENT eType = pTemplateChild->GetClassID();
+  if (eType == XFA_ELEMENT_Variables) {
+    return TRUE;
+  }
+  if (pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
+    return FALSE;
+  }
+  if (eType == XFA_ELEMENT_Proto ||
+      (bUseInstanceManager && eType == XFA_ELEMENT_Occur)) {
+    return FALSE;
+  }
+  return TRUE;
+}
+CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument,
+                                               CXFA_Node* pFormParent,
+                                               CXFA_Node* pTemplateNode,
+                                               FX_BOOL bRecursive,
+                                               CXFA_NodeArray* pSubformArray) {
+  CXFA_Node* pExistingNode = NULL;
+  if (pSubformArray == NULL) {
+    pExistingNode = XFA_DataMerge_FindFormDOMInstance(
+        pDocument, pTemplateNode->GetClassID(), pTemplateNode->GetNameHash(),
+        pFormParent);
+  } else if (pSubformArray->GetSize() > 0) {
+    pExistingNode = pSubformArray->GetAt(0);
+    pSubformArray->RemoveAt(0);
+  }
+  if (pExistingNode) {
+    if (pSubformArray) {
+      pFormParent->InsertChild(pExistingNode);
+    } else if (pExistingNode->IsContainerNode()) {
+      pFormParent->RemoveChild(pExistingNode);
+      pFormParent->InsertChild(pExistingNode);
+    }
+    pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+    pExistingNode->SetTemplateNode(pTemplateNode);
+    if (bRecursive && pExistingNode->GetClassID() != XFA_ELEMENT_Items) {
+      for (CXFA_Node* pTemplateChild =
+               pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+           pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                               XFA_NODEITEM_NextSibling)) {
+        if (XFA_NeedGenerateForm(pTemplateChild)) {
+          XFA_NodeMerge_CloneOrMergeContainer(pDocument, pExistingNode,
+                                              pTemplateChild, bRecursive);
+        }
+      }
+    }
+    pExistingNode->SetFlag(XFA_NODEFLAG_Initialized);
+    return pExistingNode;
+  }
+  CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE);
+  pFormParent->InsertChild(pNewNode, NULL);
+  if (bRecursive) {
+    for (CXFA_Node* pTemplateChild =
+             pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                             XFA_NODEITEM_NextSibling)) {
+      if (XFA_NeedGenerateForm(pTemplateChild)) {
+        CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE);
+        pNewNode->InsertChild(pNewChild, NULL);
+      }
+    }
+  }
+  return pNewNode;
+}
+static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager(
+    CXFA_Document* pDocument,
+    CXFA_Node* pFormParent,
+    CXFA_Node* pTemplateNode,
+    CXFA_NodeArray& subforms) {
+  CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name);
+  CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName;
+  FX_DWORD dwInstNameHash =
+      FX_HashCode_String_GetW(wsInstMgrNodeName, wsInstMgrNodeName.GetLength());
+  CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
+      pDocument, XFA_ELEMENT_InstanceManager, dwInstNameHash, pFormParent);
+  if (pExistingNode) {
+    FX_DWORD dwNameHash = pTemplateNode->GetNameHash();
+    for (CXFA_Node* pNode =
+             pExistingNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+         pNode;) {
+      XFA_ELEMENT eCurType = pNode->GetClassID();
+      if (eCurType == XFA_ELEMENT_InstanceManager) {
+        break;
+      }
+      if ((eCurType != XFA_ELEMENT_Subform) &&
+          (eCurType != XFA_ELEMENT_SubformSet)) {
+        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+        continue;
+      }
+      if (dwNameHash != pNode->GetNameHash()) {
+        break;
+      }
+      CXFA_Node* pNextNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      pFormParent->RemoveChild(pNode);
+      subforms.Add(pNode);
+      pNode = pNextNode;
+    }
+    pFormParent->RemoveChild(pExistingNode);
+    pFormParent->InsertChild(pExistingNode);
+    pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+    pExistingNode->SetTemplateNode(pTemplateNode);
+    return pExistingNode;
+  }
+  CXFA_Node* pNewNode = pDocument->GetParser()->GetFactory()->CreateNode(
+      XFA_XDPPACKET_Form, XFA_ELEMENT_InstanceManager);
+  FXSYS_assert(pNewNode);
+  wsInstMgrNodeName =
+      FX_WSTRC(L"_") + pTemplateNode->GetCData(XFA_ATTRIBUTE_Name);
+  pNewNode->SetCData(XFA_ATTRIBUTE_Name, wsInstMgrNodeName);
+  pFormParent->InsertChild(pNewNode, NULL);
+  pNewNode->SetTemplateNode(pTemplateNode);
+  return pNewNode;
+}
+static CXFA_Node* XFA_DataMerge_FindMatchingDataNode(
+    CXFA_Document* pDocument,
+    CXFA_Node* pTemplateNode,
+    CXFA_Node* pDataScope,
+    FX_BOOL& bAccessedDataDOM,
+    FX_BOOL bForceBind,
+    CXFA_NodeIteratorTemplate<CXFA_Node,
+                              CXFA_TraverseStrategy_XFAContainerNode>*
+        pIterator,
+    FX_BOOL& bSelfMatch,
+    XFA_ATTRIBUTEENUM& eBindMatch,
+    FX_BOOL bUpLevel = TRUE) {
+  FX_BOOL bOwnIterator = FALSE;
+  if (!pIterator) {
+    bOwnIterator = TRUE;
+    pIterator = new CXFA_NodeIteratorTemplate<
+        CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>(pTemplateNode);
+  }
+  CXFA_Node* pResult = NULL;
+  for (CXFA_Node* pCurTemplateNode = pIterator->GetCurrent();
+       pCurTemplateNode;) {
+    XFA_ELEMENT eMatchNodeType;
+    switch (pCurTemplateNode->GetClassID()) {
+      case XFA_ELEMENT_Subform:
+        eMatchNodeType = XFA_ELEMENT_DataGroup;
+        break;
+      case XFA_ELEMENT_Field: {
+        eMatchNodeType = XFA_FieldIsMultiListBox(pCurTemplateNode)
+                             ? XFA_ELEMENT_DataGroup
+                             : XFA_ELEMENT_DataValue;
+      } break;
+      case XFA_ELEMENT_ExclGroup:
+        eMatchNodeType = XFA_ELEMENT_DataValue;
+        break;
+      default:
+        pCurTemplateNode = pIterator->MoveToNext();
+        continue;
+    }
+    CXFA_Node* pTemplateNodeOccur =
+        pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
+    int32_t iMin, iMax, iInit;
+    if (pTemplateNodeOccur &&
+        XFA_GetOccurInfo(pTemplateNodeOccur, iMin, iMax, iInit) && iMax == 0) {
+      pCurTemplateNode = pIterator->MoveToNext();
+      continue;
+    }
+    CXFA_Node* pTemplateNodeBind =
+        pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind);
+    XFA_ATTRIBUTEENUM eMatch =
+        pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match)
+                          : XFA_ATTRIBUTEENUM_Once;
+    eBindMatch = eMatch;
+    switch (eMatch) {
+      case XFA_ATTRIBUTEENUM_None:
+        pCurTemplateNode = pIterator->MoveToNext();
+        continue;
+      case XFA_ATTRIBUTEENUM_Global:
+        bAccessedDataDOM = TRUE;
+        if (!bForceBind) {
+          pCurTemplateNode = pIterator->MoveToNext();
+          continue;
+        }
+        if (eMatchNodeType == XFA_ELEMENT_DataValue ||
+            (eMatchNodeType == XFA_ELEMENT_DataGroup &&
+             XFA_FieldIsMultiListBox(pTemplateNodeBind))) {
+          CXFA_Node* pGlobalBindNode = XFA_DataMerge_FindGlobalDataNode(
+              pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name),
+              pDataScope, eMatchNodeType);
+          if (!pGlobalBindNode) {
+            pCurTemplateNode = pIterator->MoveToNext();
+            continue;
+          }
+          pResult = pGlobalBindNode;
+          break;
+        }
+      case XFA_ATTRIBUTEENUM_Once: {
+        bAccessedDataDOM = TRUE;
+        CXFA_Node* pOnceBindNode = XFA_DataMerge_FindOnceDataNode(
+            pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name),
+            pDataScope, eMatchNodeType);
+        if (!pOnceBindNode) {
+          pCurTemplateNode = pIterator->MoveToNext();
+          continue;
+        }
+        pResult = pOnceBindNode;
+      } break;
+      case XFA_ATTRIBUTEENUM_DataRef: {
+        bAccessedDataDOM = TRUE;
+        CXFA_Node* pDataRefBindNode = XFA_DataMerge_FindDataRefDataNode(
+            pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref),
+            pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel);
+        if (pDataRefBindNode &&
+            pDataRefBindNode->GetClassID() == eMatchNodeType) {
+          pResult = pDataRefBindNode;
+        }
+        if (!pResult) {
+          pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext();
+          continue;
+        }
+      } break;
+      default:
+        break;
+    }
+    if (pCurTemplateNode == pTemplateNode && pResult) {
+      bSelfMatch = TRUE;
+    }
+    break;
+  }
+  if (bOwnIterator) {
+    delete pIterator;
+  }
+  return pResult;
+}
+static void XFA_DataMerge_SortRecurseRecord(
+    CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord>& rgRecords,
+    CXFA_Node* pDataScope,
+    FX_BOOL bChoiceMode = FALSE) {
+  int32_t iCount = rgRecords.GetSize();
+  CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgResultRecord;
+  for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pChildNode;
+       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    for (int32_t i = 0; i < iCount; i++) {
+      CXFA_Node* pNode = rgRecords[i].pDataChild;
+      if (pChildNode == pNode) {
+        XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild,
+                                                  pNode};
+        rgResultRecord.Add(sNewRecord);
+        rgRecords.RemoveAt(i);
+        iCount--;
+        break;
+      }
+    }
+    if (bChoiceMode && rgResultRecord.GetSize() > 0) {
+      break;
+    }
+  }
+  if (rgResultRecord.GetSize() > 0) {
+    if (!bChoiceMode) {
+      for (int32_t i = 0; i < iCount; i++) {
+        XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild,
+                                                  rgRecords[i].pDataChild};
+        rgResultRecord.Add(sNewRecord);
+      }
+    }
+    rgRecords.RemoveAll();
+    rgRecords.Copy(rgResultRecord);
+  }
+}
+static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet(
+    CXFA_Document* pDocument,
+    CXFA_Node* pTemplateNode,
+    CXFA_Node* pFormParentNode,
+    CXFA_Node* pDataScope,
+    FX_BOOL bOneInstance,
+    FX_BOOL bDataMerge) {
+  XFA_ELEMENT eElement = pTemplateNode->GetClassID();
+  CXFA_Node* pOccurNode = NULL;
+  CXFA_Node* pFirstInstance = NULL;
+  FX_BOOL bUseInstanceManager =
+      pFormParentNode->GetClassID() != XFA_ELEMENT_Area;
+  CXFA_Node* pInstMgrNode = NULL;
+  CXFA_NodeArray subformArray;
+  CXFA_NodeArray* pSearchArray = NULL;
+  if (!bOneInstance &&
+      (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Subform)) {
+    pInstMgrNode =
+        bUseInstanceManager
+            ? XFA_NodeMerge_CloneOrMergeInstanceManager(
+                  pDocument, pFormParentNode, pTemplateNode, subformArray)
+            : NULL;
+    if (CXFA_Node* pOccurTemplateNode =
+            pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur)) {
+      pOccurNode = pInstMgrNode
+                       ? XFA_NodeMerge_CloneOrMergeContainer(
+                             pDocument, pInstMgrNode, pOccurTemplateNode, FALSE)
+                       : pOccurTemplateNode;
+    } else if (pInstMgrNode) {
+      pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
+      if (pOccurNode) {
+        pOccurNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+      }
+    }
+    if (pInstMgrNode) {
+      pInstMgrNode->SetFlag(XFA_NODEFLAG_Initialized);
+      pSearchArray = &subformArray;
+      if (pFormParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+        bOneInstance = TRUE;
+        if (subformArray.GetSize() < 1) {
+          pSearchArray = NULL;
+        }
+      } else if ((pTemplateNode->GetNameHash() == 0) &&
+                 (subformArray.GetSize() < 1)) {
+        pSearchArray = NULL;
+      }
+    }
+  }
+  int32_t iMax = 1, iInit = 1, iMin = 1;
+  if (!bOneInstance) {
+    XFA_GetOccurInfo(pOccurNode, iMin, iMax, iInit);
+  }
+  XFA_ATTRIBUTEENUM eRelation =
+      eElement == XFA_ELEMENT_SubformSet
+          ? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation)
+          : XFA_ATTRIBUTEENUM_Ordered;
+  int32_t iCurRepeatIndex = 0;
+  XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None;
+  if (bDataMerge) {
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
+        sNodeIterator(pTemplateNode);
+    FX_BOOL bAccessedDataDOM = FALSE;
+    if (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Area) {
+      sNodeIterator.MoveToNext();
+    } else {
+      CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray;
+      CXFA_NodeArray subformArray;
+      for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) {
+        FX_BOOL bSelfMatch = FALSE;
+        XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None;
+        CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(
+            pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE,
+            &sNodeIterator, bSelfMatch, eBindMatch);
+        if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) {
+          break;
+        }
+        eParentBindMatch = eBindMatch;
+        CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(
+            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
+        if (!pFirstInstance) {
+          pFirstInstance = pSubformNode;
+        }
+        XFA_DataMerge_CreateDataBinding(pSubformNode, pDataNode);
+        FXSYS_assert(pSubformNode);
+        subformMapArray.SetAt(pSubformNode, pDataNode);
+        subformArray.Add(pSubformNode);
+      }
+      subformMapArray.GetStartPosition();
+      for (int32_t iIndex = 0; iIndex < subformArray.GetSize(); iIndex++) {
+        CXFA_Node* pSubform = subformArray[iIndex];
+        CXFA_Node* pDataNode =
+            reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform));
+        for (CXFA_Node* pTemplateChild =
+                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                                 XFA_NODEITEM_NextSibling)) {
+          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
+            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform,
+                                                pTemplateChild, TRUE);
+          } else if (pTemplateChild->GetObjectType() ==
+                     XFA_OBJECTTYPE_ContainerNode) {
+            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform,
+                                               pDataNode, FALSE, TRUE, FALSE);
+          }
+        }
+      }
+      subformMapArray.RemoveAll();
+    }
+    for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) {
+      FX_BOOL bSelfMatch = FALSE;
+      XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None;
+      if (!XFA_DataMerge_FindMatchingDataNode(
+              pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE,
+              &sNodeIterator, bSelfMatch, eBindMatch)) {
+        break;
+      }
+      if (eBindMatch == XFA_ATTRIBUTEENUM_DataRef &&
+          eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) {
+        break;
+      }
+      if (eRelation == XFA_ATTRIBUTEENUM_Choice ||
+          eRelation == XFA_ATTRIBUTEENUM_Unordered) {
+        CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
+            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
+        FXSYS_assert(pSubformSetNode);
+        if (!pFirstInstance) {
+          pFirstInstance = pSubformSetNode;
+        }
+        CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgItemMatchList;
+        CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList;
+        for (CXFA_Node* pTemplateChild =
+                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                                 XFA_NODEITEM_NextSibling)) {
+          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
+            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
+                                                pTemplateChild, TRUE);
+          } else if (pTemplateChild->GetObjectType() ==
+                     XFA_OBJECTTYPE_ContainerNode) {
+            CXFA_Node* pDataMatch;
+            bSelfMatch = FALSE;
+            eBindMatch = XFA_ATTRIBUTEENUM_None;
+            if (eRelation != XFA_ATTRIBUTEENUM_Ordered &&
+                (pDataMatch = XFA_DataMerge_FindMatchingDataNode(
+                     pDocument, pTemplateChild, pDataScope, bAccessedDataDOM,
+                     FALSE, NULL, bSelfMatch, eBindMatch))) {
+              XFA_DataMerge_RecurseRecord sNewRecord = {pTemplateChild,
+                                                        pDataMatch};
+              if (bSelfMatch) {
+                rgItemMatchList.InsertAt(0, sNewRecord);
+              } else {
+                rgItemMatchList.Add(sNewRecord);
+              }
+            } else {
+              rgItemUnmatchList.Add(pTemplateChild);
+            }
+          }
+        }
+        switch (eRelation) {
+          case XFA_ATTRIBUTEENUM_Choice: {
+            FXSYS_assert(rgItemMatchList.GetSize());
+            XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope, TRUE);
+            pDocument->DataMerge_CopyContainer(
+                rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope);
+          } break;
+          case XFA_ATTRIBUTEENUM_Unordered: {
+            if (rgItemMatchList.GetSize()) {
+              XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope);
+              for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count;
+                   i++) {
+                pDocument->DataMerge_CopyContainer(
+                    rgItemMatchList[i].pTemplateChild, pSubformSetNode,
+                    pDataScope);
+              }
+            }
+            for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count;
+                 i++) {
+              pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i],
+                                                 pSubformSetNode, pDataScope);
+            }
+          } break;
+          default:
+            break;
+        }
+      } else {
+        CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
+            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
+        FXSYS_assert(pSubformSetNode);
+        if (!pFirstInstance) {
+          pFirstInstance = pSubformSetNode;
+        }
+        for (CXFA_Node* pTemplateChild =
+                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                                 XFA_NODEITEM_NextSibling)) {
+          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
+            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
+                                                pTemplateChild, TRUE);
+          } else if (pTemplateChild->GetObjectType() ==
+                     XFA_OBJECTTYPE_ContainerNode) {
+            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode,
+                                               pDataScope);
+          }
+        }
+      }
+    }
+    if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) {
+      int32_t iLimit = iMax;
+      if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) {
+        iLimit = subformArray.GetSize();
+        if (iLimit < iMin) {
+          iLimit = iInit;
+        }
+      }
+      for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) {
+        if (pInstMgrNode) {
+          if (pSearchArray && pSearchArray->GetSize() < 1) {
+            if (pTemplateNode->GetNameHash() != 0) {
+              break;
+            }
+            pSearchArray = NULL;
+          }
+        } else if (!XFA_DataMerge_FindFormDOMInstance(
+                       pDocument, pTemplateNode->GetClassID(),
+                       pTemplateNode->GetNameHash(), pFormParentNode)) {
+          break;
+        }
+        CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(
+            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
+        FXSYS_assert(pSubformNode);
+        if (!pFirstInstance) {
+          pFirstInstance = pSubformNode;
+        }
+        for (CXFA_Node* pTemplateChild =
+                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                                 XFA_NODEITEM_NextSibling)) {
+          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
+            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode,
+                                                pTemplateChild, TRUE);
+          } else if (pTemplateChild->GetObjectType() ==
+                     XFA_OBJECTTYPE_ContainerNode) {
+            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode,
+                                               pDataScope);
+          }
+        }
+      }
+    }
+  }
+  int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin;
+  for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) {
+    CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
+        pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
+    FXSYS_assert(pSubformSetNode);
+    if (!pFirstInstance) {
+      pFirstInstance = pSubformSetNode;
+    }
+    FX_BOOL bFound = FALSE;
+    for (CXFA_Node* pTemplateChild =
+             pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                             XFA_NODEITEM_NextSibling)) {
+      if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
+        XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
+                                            pTemplateChild, TRUE);
+      } else if (pTemplateChild->GetObjectType() ==
+                 XFA_OBJECTTYPE_ContainerNode) {
+        if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) {
+          continue;
+        }
+        pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode,
+                                           pDataScope, FALSE, bDataMerge);
+        bFound = TRUE;
+      }
+    }
+  }
+  return pFirstInstance;
+}
+static CXFA_Node* XFA_DataMerge_CopyContainer_Field(CXFA_Document* pDocument,
+                                                    CXFA_Node* pTemplateNode,
+                                                    CXFA_Node* pFormNode,
+                                                    CXFA_Node* pDataScope,
+                                                    FX_BOOL bDataMerge,
+                                                    FX_BOOL bUpLevel = TRUE) {
+  CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer(
+      pDocument, pFormNode, pTemplateNode, FALSE);
+  FXSYS_assert(pFieldNode);
+  for (CXFA_Node* pTemplateChildNode =
+           pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem(
+                               XFA_NODEITEM_NextSibling)) {
+    if (XFA_NeedGenerateForm(pTemplateChildNode)) {
+      XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode,
+                                          pTemplateChildNode, TRUE);
+    } else if (pTemplateNode->GetClassID() == XFA_ELEMENT_ExclGroup &&
+               pTemplateChildNode->IsContainerNode()) {
+      if (pTemplateChildNode->GetClassID() == XFA_ELEMENT_Field) {
+        XFA_DataMerge_CopyContainer_Field(pDocument, pTemplateChildNode,
+                                          pFieldNode, NULL, FALSE);
+      }
+    }
+  }
+  if (bDataMerge) {
+    FX_BOOL bAccessedDataDOM = FALSE;
+    FX_BOOL bSelfMatch = FALSE;
+    XFA_ATTRIBUTEENUM eBindMatch;
+    CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(
+        pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, TRUE, NULL,
+        bSelfMatch, eBindMatch, bUpLevel);
+    if (pDataNode) {
+      XFA_DataMerge_CreateDataBinding(pFieldNode, pDataNode);
+    }
+  } else {
+    XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFieldNode);
+  }
+  return pFieldNode;
+}
+CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
+                                                  CXFA_Node* pFormNode,
+                                                  CXFA_Node* pDataScope,
+                                                  FX_BOOL bOneInstance,
+                                                  FX_BOOL bDataMerge,
+                                                  FX_BOOL bUpLevel) {
+  switch (pTemplateNode->GetClassID()) {
+    case XFA_ELEMENT_SubformSet:
+    case XFA_ELEMENT_Subform:
+    case XFA_ELEMENT_Area:
+    case XFA_ELEMENT_PageArea:
+      return XFA_DataMerge_CopyContainer_SubformSet(
+          this, pTemplateNode, pFormNode, pDataScope, bOneInstance, bDataMerge);
+    case XFA_ELEMENT_ExclGroup:
+    case XFA_ELEMENT_Field:
+    case XFA_ELEMENT_Draw:
+    case XFA_ELEMENT_ContentArea:
+      return XFA_DataMerge_CopyContainer_Field(
+          this, pTemplateNode, pFormNode, pDataScope, bDataMerge, bUpLevel);
+    case XFA_ELEMENT_PageSet:
+      break;
+    case XFA_ELEMENT_Variables:
+      break;
+    default:
+      FXSYS_assert(FALSE);
+      break;
+  }
+  return NULL;
+}
+
+static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument,
+                                                 CXFA_Node* pFormNode,
+                                                 CXFA_Node* pDataScope,
+                                                 FX_BOOL bDataRef,
+                                                 FX_BOOL bParentDataRef) {
+  FX_BOOL bMatchRef = TRUE;
+  XFA_ELEMENT eClassID = pFormNode->GetClassID();
+  CXFA_Node* pDataNode = pFormNode->GetBindData();
+  if (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup ||
+      eClassID == XFA_ELEMENT_Field) {
+    CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
+    CXFA_Node* pTemplateNodeBind =
+        pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind)
+                      : NULL;
+    XFA_ATTRIBUTEENUM eMatch =
+        pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match)
+                          : XFA_ATTRIBUTEENUM_Once;
+    switch (eMatch) {
+      case XFA_ATTRIBUTEENUM_None:
+        if (!bDataRef || bParentDataRef) {
+          XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
+        }
+        break;
+      case XFA_ATTRIBUTEENUM_Once:
+        if (!bDataRef || bParentDataRef) {
+          if (!pDataNode) {
+            if (pFormNode->GetNameHash() != 0 &&
+                pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) !=
+                    XFA_ATTRIBUTEENUM_None) {
+              XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform ||
+                                           XFA_FieldIsMultiListBox(pFormNode))
+                                              ? XFA_ELEMENT_DataGroup
+                                              : XFA_ELEMENT_DataValue;
+              pDataNode = XFA_DataDescription_MaybeCreateDataNode(
+                  pDocument, pDataScope, eDataNodeType,
+                  pFormNode->GetCData(XFA_ATTRIBUTE_Name));
+              if (pDataNode) {
+                XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE);
+              }
+            }
+            if (!pDataNode) {
+              XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
+            }
+          } else {
+            CXFA_Node* pDataParent =
+                pDataNode->GetNodeItem(XFA_NODEITEM_Parent);
+            if (pDataParent != pDataScope) {
+              FXSYS_assert(pDataParent);
+              pDataParent->RemoveChild(pDataNode);
+              pDataScope->InsertChild(pDataNode);
+            }
+          }
+        }
+        break;
+      case XFA_ATTRIBUTEENUM_Global:
+        if (!bDataRef || bParentDataRef) {
+          FX_DWORD dwNameHash = pFormNode->GetNameHash();
+          if (dwNameHash != 0 && !pDataNode) {
+            pDataNode = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash);
+            if (!pDataNode) {
+              XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform ||
+                                           XFA_FieldIsMultiListBox(pFormNode))
+                                              ? XFA_ELEMENT_DataGroup
+                                              : XFA_ELEMENT_DataValue;
+              CXFA_Node* pRecordNode =
+                  ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
+              pDataNode = XFA_DataDescription_MaybeCreateDataNode(
+                  pDocument, pRecordNode, eDataNodeType,
+                  pFormNode->GetCData(XFA_ATTRIBUTE_Name));
+              if (pDataNode) {
+                XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE);
+                XFA_DataMerge_RegisterGlobalBinding(
+                    pDocument, pFormNode->GetNameHash(), pDataNode);
+              }
+            } else {
+              XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode);
+            }
+          }
+          if (!pDataNode) {
+            XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
+          }
+        }
+        break;
+      case XFA_ATTRIBUTEENUM_DataRef: {
+        bMatchRef = bDataRef;
+        bParentDataRef = TRUE;
+        if (!pDataNode && bDataRef) {
+          CFX_WideStringC wsRef =
+              pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref);
+          FX_DWORD dFlags =
+              XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode;
+          XFA_RESOLVENODE_RS rs;
+          pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs,
+                                                        dFlags, pTemplateNode);
+          CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
+          pDataNode = ToNode(pObject);
+          if (pDataNode) {
+            XFA_DataMerge_CreateDataBinding(
+                pFormNode, pDataNode,
+                rs.dwFlags == XFA_RESOVENODE_RSTYPE_ExistNodes);
+          } else {
+            XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
+          }
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  if (bMatchRef &&
+      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_SubformSet ||
+       eClassID == XFA_ELEMENT_Area || eClassID == XFA_ELEMENT_PageArea ||
+       eClassID == XFA_ELEMENT_PageSet)) {
+    for (CXFA_Node* pFormChild =
+             pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pFormChild;
+         pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pFormChild->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) {
+        continue;
+      }
+      if (pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+        continue;
+      }
+      XFA_DataMerge_UpdateBindingRelations(pDocument, pFormChild,
+                                           pDataNode ? pDataNode : pDataScope,
+                                           bDataRef, bParentDataRef);
+    }
+  }
+}
+CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) {
+  for (CXFA_Node* pRootBoundNode = pParentFormNode;
+       pRootBoundNode &&
+       pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
+       pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) {
+    CXFA_Node* pDataScope = pRootBoundNode->GetBindData();
+    if (pDataScope) {
+      return pDataScope;
+    }
+  }
+  return ToNode(
+      pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data));
+}
+void CXFA_Document::DataMerge_UpdateBindingRelations(
+    CXFA_Node* pFormUpdateRoot) {
+  CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope(
+      pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent));
+  if (!pDataScope) {
+    return;
+  }
+  XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE,
+                                       FALSE);
+  XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE,
+                                       FALSE);
+}
+CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) {
+  for (int32_t i = 0; i < arrayNodes.GetSize(); i++) {
+    CXFA_Node* pNode = arrayNodes[i]->AsNode();
+    if (pNode && !pNode->HasBindItem())
+      return pNode;
+  }
+  return nullptr;
+}
+void CXFA_Document::DoDataMerge() {
+  CXFA_Node* pDatasetsRoot = ToNode(GetXFAObject(XFA_HASHCODE_Datasets));
+  if (!pDatasetsRoot) {
+    IFDE_XMLElement* pDatasetsXMLNode =
+        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:datasets"));
+    FXSYS_assert(pDatasetsXMLNode);
+    pDatasetsXMLNode->SetString(
+        FX_WSTRC(L"xmlns:xfa"),
+        FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"));
+    pDatasetsRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel);
+    pDatasetsRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"datasets"));
+    m_pRootNode->GetXMLMappingNode()->InsertChildNode(pDatasetsXMLNode);
+    m_pRootNode->InsertChild(pDatasetsRoot);
+    pDatasetsRoot->SetXMLMappingNode(pDatasetsXMLNode);
+  }
+  CXFA_Node *pDataRoot = NULL, *pDDRoot = NULL;
+  CFX_WideString wsDatasetsURI;
+  pDatasetsRoot->TryNamespace(wsDatasetsURI);
+  for (CXFA_Node* pChildNode =
+           pDatasetsRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pChildNode;
+       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pChildNode->GetClassID() != XFA_ELEMENT_DataGroup) {
+      continue;
+    }
+    CFX_WideString wsNamespaceURI;
+    if (!pDDRoot && pChildNode->GetNameHash() == XFA_HASHCODE_DataDescription) {
+      if (!pChildNode->TryNamespace(wsNamespaceURI)) {
+        continue;
+      }
+      if (wsNamespaceURI ==
+          FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
+        pDDRoot = pChildNode;
+      }
+    } else if (!pDataRoot && pChildNode->GetNameHash() == XFA_HASHCODE_Data) {
+      if (!pChildNode->TryNamespace(wsNamespaceURI)) {
+        continue;
+      }
+      if (wsNamespaceURI == wsDatasetsURI) {
+        pDataRoot = pChildNode;
+      }
+    }
+    if (pDataRoot && pDDRoot) {
+      break;
+    }
+  }
+  if (!pDataRoot) {
+    IFDE_XMLElement* pDataRootXMLNode =
+        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data"));
+    FXSYS_assert(pDataRootXMLNode);
+    pDataRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
+    pDataRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"data"));
+    pDataRoot->SetXMLMappingNode(pDataRootXMLNode);
+    pDatasetsRoot->InsertChild(pDataRoot);
+  }
+  CXFA_Node* pDataTopLevel =
+      pDataRoot->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
+  FX_DWORD dwNameHash = pDataTopLevel ? pDataTopLevel->GetNameHash() : 0;
+  CXFA_Node* pTemplateRoot =
+      m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template);
+  if (!pTemplateRoot) {
+    return;
+  }
+  CXFA_Node* pTemplateChosen =
+      dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) : NULL;
+  if (!pTemplateChosen ||
+      pTemplateChosen->GetClassID() != XFA_ELEMENT_Subform) {
+    pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform);
+  }
+  if (!pTemplateChosen) {
+    return;
+  }
+  CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form);
+  FX_BOOL bEmptyForm = FALSE;
+  if (!pFormRoot) {
+    bEmptyForm = TRUE;
+    pFormRoot = CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form);
+    FXSYS_assert(pFormRoot);
+    pFormRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"form"));
+    m_pRootNode->InsertChild(pFormRoot, NULL);
+  } else {
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+        sIterator(pFormRoot);
+    for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode;
+         pNode = sIterator.MoveToNext()) {
+      pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
+    }
+  }
+  CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
+      this, pFormRoot, pTemplateChosen, FALSE);
+  FXSYS_assert(pSubformSetNode);
+  if (!pDataTopLevel) {
+    CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name);
+    CFX_WideString wsDataTopLevelName =
+        wsFormName.IsEmpty() ? FX_WSTRC(L"form") : wsFormName;
+    IFDE_XMLElement* pDataTopLevelXMLNode =
+        IFDE_XMLElement::Create(wsDataTopLevelName);
+    FXSYS_assert(pDataTopLevelXMLNode);
+    pDataTopLevel = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
+    pDataTopLevel->SetCData(XFA_ATTRIBUTE_Name, wsDataTopLevelName);
+    pDataTopLevel->SetXMLMappingNode(pDataTopLevelXMLNode);
+    CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+    pDataRoot->InsertChild(pDataTopLevel, pBeforeNode);
+  }
+  FXSYS_assert(pDataTopLevel);
+  XFA_DataMerge_CreateDataBinding(pSubformSetNode, pDataTopLevel);
+  for (CXFA_Node* pTemplateChild =
+           pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pTemplateChild;
+       pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (XFA_NeedGenerateForm(pTemplateChild)) {
+      XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild,
+                                          TRUE);
+    } else if (pTemplateChild->GetObjectType() ==
+               XFA_OBJECTTYPE_ContainerNode) {
+      DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel);
+    }
+  }
+  if (pDDRoot) {
+    XFA_DataDescription_UpdateDataRelation(pDataRoot, pDDRoot);
+  }
+  DataMerge_UpdateBindingRelations(pSubformSetNode);
+  CXFA_Node* pPageSetNode =
+      pSubformSetNode->GetFirstChildByClass(XFA_ELEMENT_PageSet);
+  while (pPageSetNode) {
+    m_pPendingPageSet.Add(pPageSetNode);
+    CXFA_Node* pNextPageSetNode =
+        pPageSetNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
+    pSubformSetNode->RemoveChild(pPageSetNode);
+    pPageSetNode = pNextPageSetNode;
+  }
+  if (!bEmptyForm) {
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+        sIterator(pFormRoot);
+    CXFA_Node* pNode = sIterator.MoveToNext();
+    while (pNode) {
+      if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+        if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode ||
+            pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
+          CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
+          pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
+          pNode = pNext;
+        } else {
+          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+          pNode->SetFlag(XFA_NODEFLAG_Initialized);
+          pNode = sIterator.MoveToNext();
+        }
+      } else {
+        pNode->SetFlag(XFA_NODEFLAG_Initialized);
+        pNode = sIterator.MoveToNext();
+      }
+    }
+  }
+}
+void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) {
+  CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form));
+  if (pFormRoot) {
+    while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      pFormRoot->RemoveChild(pNode);
+    }
+    pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+  }
+  XFA_DataMerge_ClearGlobalBinding(this);
+  if (bDoDataMerge) {
+    DoDataMerge();
+  }
+  CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor();
+  pLayoutProcessor->SetForceReLayout(TRUE);
+}
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.h b/xfa/fxfa/parser/xfa_document_datamerger_imp.h
new file mode 100644
index 0000000..a5583cb
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
+#define XFA_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(
+    CXFA_Document* pDocument,
+    CXFA_Node* pFormParent,
+    CXFA_Node* pTemplateNode,
+    FX_BOOL bRecursive,
+    CXFA_NodeArray* pSubformArray = NULL);
+CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode);
+CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument,
+                                             XFA_ELEMENT eClassID,
+                                             FX_DWORD dwNameHash,
+                                             CXFA_Node* pFormParent);
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
diff --git a/xfa/fxfa/parser/xfa_document_imp.cpp b/xfa/fxfa/parser/xfa_document_imp.cpp
new file mode 100644
index 0000000..ce07c47
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_imp.cpp
@@ -0,0 +1,441 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_script_datawindow.h"
+#include "xfa/fxfa/parser/xfa_script_eventpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_hostpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_layoutpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_logpseudomodel.h"
+#include "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_Document::CXFA_Document(IXFA_DocParser* pParser)
+    : m_pParser(pParser),
+      m_pScriptContext(nullptr),
+      m_pLayoutProcessor(nullptr),
+      m_pRootNode(nullptr),
+      m_pLocalMgr(nullptr),
+      m_pScriptDataWindow(nullptr),
+      m_pScriptEvent(nullptr),
+      m_pScriptHost(nullptr),
+      m_pScriptLog(nullptr),
+      m_pScriptLayout(nullptr),
+      m_pScriptSignature(nullptr),
+      m_eCurVersionMode(XFA_VERSION_DEFAULT),
+      m_dwDocFlags(0) {
+  ASSERT(m_pParser);
+}
+CXFA_Document::~CXFA_Document() {
+  delete m_pRootNode;
+  PurgeNodes();
+}
+void CXFA_Document::ClearLayoutData() {
+  if (m_pLayoutProcessor) {
+    delete m_pLayoutProcessor;
+    m_pLayoutProcessor = NULL;
+  }
+  if (m_pScriptContext) {
+    m_pScriptContext->Release();
+    m_pScriptContext = NULL;
+  }
+  if (m_pLocalMgr) {
+    delete m_pLocalMgr;
+    m_pLocalMgr = NULL;
+  }
+  if (m_pScriptDataWindow) {
+    delete m_pScriptDataWindow;
+    m_pScriptDataWindow = NULL;
+  }
+  if (m_pScriptEvent) {
+    delete m_pScriptEvent;
+    m_pScriptEvent = NULL;
+  }
+  if (m_pScriptHost) {
+    delete m_pScriptHost;
+    m_pScriptHost = NULL;
+  }
+  if (m_pScriptLog) {
+    delete m_pScriptLog;
+    m_pScriptLog = NULL;
+  }
+  if (m_pScriptLayout) {
+    delete m_pScriptLayout;
+    m_pScriptLayout = NULL;
+  }
+  if (m_pScriptSignature) {
+    delete m_pScriptSignature;
+    m_pScriptSignature = NULL;
+  }
+}
+void CXFA_Document::SetRoot(CXFA_Node* pNewRoot) {
+  if (m_pRootNode) {
+    AddPurgeNode(m_pRootNode);
+  }
+  m_pRootNode = pNewRoot;
+  RemovePurgeNode(pNewRoot);
+}
+IXFA_Notify* CXFA_Document::GetNotify() const {
+  return m_pParser->GetNotify();
+}
+CXFA_Object* CXFA_Document::GetXFAObject(const CFX_WideStringC& wsNodeName) {
+  return GetXFAObject(
+      FX_HashCode_String_GetW(wsNodeName.GetPtr(), wsNodeName.GetLength()));
+}
+CXFA_Object* CXFA_Document::GetXFAObject(FX_DWORD dwNodeNameHash) {
+  switch (dwNodeNameHash) {
+    case XFA_HASHCODE_Data: {
+      CXFA_Node* pDatasetsNode = ToNode(GetXFAObject(XFA_HASHCODE_Datasets));
+      if (!pDatasetsNode) {
+        return NULL;
+      }
+      for (CXFA_Node* pDatasetsChild =
+               pDatasetsNode->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
+           pDatasetsChild;
+           pDatasetsChild =
+               pDatasetsChild->GetNextSameClassSibling(XFA_ELEMENT_DataGroup)) {
+        if (pDatasetsChild->GetNameHash() != XFA_HASHCODE_Data) {
+          continue;
+        }
+        CFX_WideString wsNamespaceURI;
+        if (!pDatasetsChild->TryNamespace(wsNamespaceURI)) {
+          continue;
+        }
+        CFX_WideString wsDatasetsURI;
+        if (!pDatasetsNode->TryNamespace(wsDatasetsURI)) {
+          continue;
+        }
+        if (wsNamespaceURI == wsDatasetsURI) {
+          return pDatasetsChild;
+        }
+      }
+    }
+      return NULL;
+    case XFA_HASHCODE_Record: {
+      CXFA_Node* pData = ToNode(GetXFAObject(XFA_HASHCODE_Data));
+      return pData ? pData->GetFirstChildByClass(XFA_ELEMENT_DataGroup) : NULL;
+    }
+    case XFA_HASHCODE_DataWindow: {
+      if (m_pScriptDataWindow == NULL) {
+        m_pScriptDataWindow = new CScript_DataWindow(this);
+      }
+      return m_pScriptDataWindow;
+    }
+    case XFA_HASHCODE_Event: {
+      if (m_pScriptEvent == NULL) {
+        m_pScriptEvent = new CScript_EventPseudoModel(this);
+      }
+      return m_pScriptEvent;
+    }
+    case XFA_HASHCODE_Host: {
+      if (m_pScriptHost == NULL) {
+        m_pScriptHost = new CScript_HostPseudoModel(this);
+      }
+      return m_pScriptHost;
+    }
+    case XFA_HASHCODE_Log: {
+      if (m_pScriptLog == NULL) {
+        m_pScriptLog = new CScript_LogPseudoModel(this);
+      }
+      return m_pScriptLog;
+    }
+    case XFA_HASHCODE_Signature: {
+      if (m_pScriptSignature == NULL) {
+        m_pScriptSignature = new CScript_SignaturePseudoModel(this);
+      }
+      return m_pScriptSignature;
+    }
+    case XFA_HASHCODE_Layout: {
+      if (m_pScriptLayout == NULL) {
+        m_pScriptLayout = new CScript_LayoutPseudoModel(this);
+      }
+      return m_pScriptLayout;
+    }
+    default:
+      return m_pRootNode->GetFirstChildByName(dwNodeNameHash);
+  }
+}
+CXFA_Node* CXFA_Document::CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) {
+  return CreateNode(XFA_GetPacketByID(dwPacket), eElement);
+}
+CXFA_Node* CXFA_Document::CreateNode(const XFA_PACKETINFO* pPacket,
+                                     XFA_ELEMENT eElement) {
+  if (pPacket == NULL) {
+    return NULL;
+  }
+  const XFA_ELEMENTINFO* pElement = XFA_GetElementByID(eElement);
+  if (pElement && (pElement->dwPackets & pPacket->eName)) {
+    CXFA_Node* pNode = new CXFA_Node(this, pPacket->eName, pElement->eName);
+    if (pNode) {
+      AddPurgeNode(pNode);
+    }
+    return pNode;
+  }
+  return NULL;
+}
+void CXFA_Document::AddPurgeNode(CXFA_Node* pNode) {
+  m_rgPurgeNodes.Add(pNode);
+}
+FX_BOOL CXFA_Document::RemovePurgeNode(CXFA_Node* pNode) {
+  return m_rgPurgeNodes.RemoveKey(pNode);
+}
+void CXFA_Document::PurgeNodes() {
+  FX_POSITION psNode = m_rgPurgeNodes.GetStartPosition();
+  while (psNode) {
+    CXFA_Node* pNode;
+    m_rgPurgeNodes.GetNextAssoc(psNode, pNode);
+    delete pNode;
+  }
+  m_rgPurgeNodes.RemoveAll();
+}
+void CXFA_Document::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn) {
+  if (bOn) {
+    m_dwDocFlags |= dwFlag;
+  } else {
+    m_dwDocFlags &= ~dwFlag;
+  }
+}
+FX_BOOL CXFA_Document::IsInteractive() {
+  if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive) {
+    return m_dwDocFlags & XFA_DOCFLAG_Interactive;
+  }
+  CXFA_Node* pConfig = ToNode(GetXFAObject(XFA_HASHCODE_Config));
+  if (!pConfig) {
+    return FALSE;
+  }
+  CFX_WideString wsInteractive;
+  CXFA_Node* pPresent = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present);
+  if (!pPresent) {
+    return FALSE;
+  }
+  CXFA_Node* pPDF = pPresent->GetFirstChildByClass(XFA_ELEMENT_Pdf);
+  if (!pPDF) {
+    return FALSE;
+  }
+  CXFA_Node* pInteractive = pPDF->GetChild(0, XFA_ELEMENT_Interactive);
+  if (pInteractive) {
+    m_dwDocFlags |= XFA_DOCFLAG_HasInteractive;
+    if (pInteractive->TryContent(wsInteractive) &&
+        wsInteractive == FX_WSTRC(L"1")) {
+      m_dwDocFlags |= XFA_DOCFLAG_Interactive;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+CXFA_LocaleMgr* CXFA_Document::GetLocalMgr() {
+  if (!m_pLocalMgr) {
+    CFX_WideString wsLanguage;
+    GetParser()->GetNotify()->GetAppProvider()->GetLanguage(wsLanguage);
+    m_pLocalMgr = new CXFA_LocaleMgr(
+        ToNode(GetXFAObject(XFA_HASHCODE_LocaleSet)), wsLanguage);
+  }
+  return m_pLocalMgr;
+}
+IXFA_ScriptContext* CXFA_Document::InitScriptContext(FXJSE_HRUNTIME hRuntime) {
+  if (!m_pScriptContext) {
+    m_pScriptContext = XFA_ScriptContext_Create(this);
+  }
+  m_pScriptContext->Initialize(hRuntime);
+  return m_pScriptContext;
+}
+IXFA_ScriptContext* CXFA_Document::GetScriptContext() {
+  if (!m_pScriptContext) {
+    m_pScriptContext = XFA_ScriptContext_Create(this);
+  }
+  return m_pScriptContext;
+}
+XFA_VERSION CXFA_Document::RecognizeXFAVersionNumber(
+    CFX_WideString& wsTemplateNS) {
+  CFX_WideStringC wsTemplateURIPrefix =
+      XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI;
+  FX_STRSIZE nPrefixLength = wsTemplateURIPrefix.GetLength();
+  if (CFX_WideStringC(wsTemplateNS, wsTemplateNS.GetLength()) !=
+      wsTemplateURIPrefix) {
+    return XFA_VERSION_UNKNOWN;
+  }
+  FX_STRSIZE nDotPos = wsTemplateNS.Find('.', nPrefixLength);
+  if (nDotPos == (FX_STRSIZE)-1) {
+    return XFA_VERSION_UNKNOWN;
+  }
+  int8_t iMajor =
+      FXSYS_wtoi(wsTemplateNS.Mid(nPrefixLength, nDotPos - nPrefixLength));
+  int8_t iMinor = FXSYS_wtoi(
+      wsTemplateNS.Mid(nDotPos + 1, wsTemplateNS.GetLength() - nDotPos - 2));
+  XFA_VERSION eVersion = (XFA_VERSION)((int32_t)iMajor * 100 + iMinor);
+  if (eVersion < XFA_VERSION_MIN || eVersion > XFA_VERSION_MAX) {
+    return XFA_VERSION_UNKNOWN;
+  }
+  m_eCurVersionMode = eVersion;
+  return eVersion;
+}
+CXFA_Node* CXFA_Document::GetNodeByID(CXFA_Node* pRoot,
+                                      const CFX_WideStringC& wsID) {
+  if (!pRoot || wsID.IsEmpty()) {
+    return NULL;
+  }
+  CXFA_NodeIterator sIterator(pRoot);
+  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+       pNode = sIterator.MoveToNext()) {
+    CFX_WideStringC wsIDVal;
+    if (pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) {
+      if (wsIDVal == wsID) {
+        return pNode;
+      }
+    }
+  }
+  return NULL;
+}
+static void XFA_ProtoMerge_MergeNodeRecurse(CXFA_Document* pDocument,
+                                            CXFA_Node* pDestNodeParent,
+                                            CXFA_Node* pProtoNode) {
+  CXFA_Node* pExistingNode = NULL;
+  for (CXFA_Node* pFormChild =
+           pDestNodeParent->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pFormChild;
+       pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pFormChild->GetClassID() == pProtoNode->GetClassID() &&
+        pFormChild->GetNameHash() == pProtoNode->GetNameHash() &&
+        pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+      pFormChild->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+      pExistingNode = pFormChild;
+      break;
+    }
+  }
+  if (pExistingNode) {
+    pExistingNode->SetTemplateNode(pProtoNode);
+    for (CXFA_Node* pTemplateChild =
+             pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
+                             XFA_NODEITEM_NextSibling)) {
+      XFA_ProtoMerge_MergeNodeRecurse(pDocument, pExistingNode, pTemplateChild);
+    }
+    return;
+  }
+  CXFA_Node* pNewNode = pProtoNode->Clone(TRUE);
+  pNewNode->SetTemplateNode(pProtoNode);
+  pDestNodeParent->InsertChild(pNewNode, NULL);
+}
+static void XFA_ProtoMerge_MergeNode(CXFA_Document* pDocument,
+                                     CXFA_Node* pDestNode,
+                                     CXFA_Node* pProtoNode) {
+  {
+    CXFA_NodeIterator sIterator(pDestNode);
+    for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+         pNode = sIterator.MoveToNext()) {
+      pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
+    }
+  }
+  pDestNode->SetTemplateNode(pProtoNode);
+  for (CXFA_Node* pTemplateChild =
+           pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pTemplateChild;
+       pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    XFA_ProtoMerge_MergeNodeRecurse(pDocument, pDestNode, pTemplateChild);
+  }
+  {
+    CXFA_NodeIterator sIterator(pDestNode);
+    for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+         pNode = sIterator.MoveToNext()) {
+      pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+    }
+  }
+}
+void CXFA_Document::DoProtoMerge() {
+  CXFA_Node* pTemplateRoot = ToNode(GetXFAObject(XFA_HASHCODE_Template));
+  if (!pTemplateRoot) {
+    return;
+  }
+  CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> mIDMap;
+  CXFA_NodeSet sUseNodes;
+  CXFA_NodeIterator sIterator(pTemplateRoot);
+  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+       pNode = sIterator.MoveToNext()) {
+    CFX_WideStringC wsIDVal;
+    if (pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) {
+      mIDMap[FX_HashCode_String_GetW(wsIDVal.GetPtr(), wsIDVal.GetLength())] =
+          pNode;
+    }
+    CFX_WideStringC wsUseVal;
+    if (pNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) && !wsUseVal.IsEmpty()) {
+      sUseNodes.Add(pNode);
+    } else if (pNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) &&
+               !wsUseVal.IsEmpty()) {
+      sUseNodes.Add(pNode);
+    }
+  }
+  FX_POSITION pos = sUseNodes.GetStartPosition();
+  while (pos) {
+    CXFA_Node* pUseHrefNode = NULL;
+    sUseNodes.GetNextAssoc(pos, pUseHrefNode);
+    CFX_WideString wsUseVal;
+    CFX_WideStringC wsURI, wsID, wsSOM;
+    if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) &&
+        !wsUseVal.IsEmpty()) {
+      FX_STRSIZE uSharpPos = wsUseVal.Find('#');
+      if (uSharpPos < 0) {
+        wsURI = wsUseVal;
+      } else {
+        wsURI = CFX_WideStringC((const FX_WCHAR*)wsUseVal, uSharpPos);
+        FX_STRSIZE uLen = wsUseVal.GetLength();
+        if (uLen >= uSharpPos + 5 &&
+            CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos, 5) ==
+                FX_WSTRC(L"#som(") &&
+            wsUseVal[uLen - 1] == ')') {
+          wsSOM = CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos + 5,
+                                  uLen - 1 - uSharpPos - 5);
+        } else {
+          wsID = CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos + 1,
+                                 uLen - uSharpPos - 1);
+        }
+      }
+    } else if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) &&
+               !wsUseVal.IsEmpty()) {
+      if (wsUseVal[0] == '#') {
+        wsID = CFX_WideStringC((const FX_WCHAR*)wsUseVal + 1,
+                               wsUseVal.GetLength() - 1);
+      } else {
+        wsSOM =
+            CFX_WideStringC((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength());
+      }
+    }
+    if (!wsURI.IsEmpty() && wsURI != FX_WSTRC(L".")) {
+      continue;
+    }
+    CXFA_Node* pProtoNode = NULL;
+    if (!wsSOM.IsEmpty()) {
+      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
+                        XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
+                        XFA_RESOLVENODE_Siblings;
+      XFA_RESOLVENODE_RS resoveNodeRS;
+      int32_t iRet = m_pScriptContext->ResolveObjects(pUseHrefNode, wsSOM,
+                                                      resoveNodeRS, dwFlag);
+      if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) {
+        pProtoNode = resoveNodeRS.nodes[0]->AsNode();
+      }
+    } else if (!wsID.IsEmpty()) {
+      if (!mIDMap.Lookup(
+              FX_HashCode_String_GetW(wsID.GetPtr(), wsID.GetLength()),
+              pProtoNode)) {
+        continue;
+      }
+    }
+    if (!pProtoNode) {
+      continue;
+    }
+    XFA_ProtoMerge_MergeNode(this, pUseHrefNode, pProtoNode);
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_document_layout_imp.cpp b/xfa/fxfa/parser/xfa_document_layout_imp.cpp
new file mode 100644
index 0000000..dbaa6e4
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_layout_imp.cpp
@@ -0,0 +1,208 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_datamerger_imp.h"
+#include "xfa/fxfa/parser/xfa_layout_appadapter.h"
+#include "xfa/fxfa/parser/xfa_layout_itemlayout.h"
+#include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() {
+  if (!m_pLayoutProcessor) {
+    m_pLayoutProcessor = new CXFA_LayoutProcessor(this);
+    ASSERT(m_pLayoutProcessor);
+  }
+  return m_pLayoutProcessor;
+}
+IXFA_DocLayout* CXFA_Document::GetDocLayout() {
+  return GetLayoutProcessor();
+}
+CXFA_LayoutProcessor::CXFA_LayoutProcessor(CXFA_Document* pDocument)
+    : m_pDocument(pDocument),
+      m_pRootItemLayoutProcessor(NULL),
+      m_pLayoutPageMgr(NULL),
+      m_nProgressCounter(0),
+      m_bNeeLayout(TRUE) {}
+CXFA_LayoutProcessor::~CXFA_LayoutProcessor() {
+  ClearLayoutData();
+}
+CXFA_Document* CXFA_LayoutProcessor::GetDocument() const {
+  return m_pDocument;
+}
+int32_t CXFA_LayoutProcessor::StartLayout(FX_BOOL bForceRestart) {
+  if (!bForceRestart && !IsNeedLayout()) {
+    return 100;
+  }
+  if (m_pRootItemLayoutProcessor) {
+    delete m_pRootItemLayoutProcessor;
+    m_pRootItemLayoutProcessor = NULL;
+  }
+  m_nProgressCounter = 0;
+  CXFA_Node* pFormPacketNode =
+      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
+  if (!pFormPacketNode) {
+    return -1;
+  }
+  CXFA_Node* pFormRoot =
+      pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform);
+  if (!pFormRoot) {
+    return -1;
+  }
+  if (!m_pLayoutPageMgr) {
+    m_pLayoutPageMgr = new CXFA_LayoutPageMgr(this);
+  }
+  if (!m_pLayoutPageMgr->InitLayoutPage(pFormRoot)) {
+    return -1;
+  }
+  if (!m_pLayoutPageMgr->PrepareFirstPage(pFormRoot)) {
+    return -1;
+  }
+  m_pRootItemLayoutProcessor =
+      new CXFA_ItemLayoutProcessor(pFormRoot, m_pLayoutPageMgr);
+  m_nProgressCounter = 1;
+  return 0;
+}
+int32_t CXFA_LayoutProcessor::DoLayout(IFX_Pause* pPause) {
+  if (m_nProgressCounter < 1) {
+    return -1;
+  }
+  XFA_ItemLayoutProcessorResult eStatus;
+  CXFA_Node* pFormNode = m_pRootItemLayoutProcessor->GetFormNode();
+  FX_FLOAT fPosX = pFormNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
+  FX_FLOAT fPosY = pFormNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
+  do {
+    FX_FLOAT fAvailHeight = m_pLayoutPageMgr->GetAvailHeight();
+    eStatus =
+        m_pRootItemLayoutProcessor->DoLayout(TRUE, fAvailHeight, fAvailHeight);
+    if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
+      m_nProgressCounter++;
+    }
+    CXFA_ContentLayoutItem* pLayoutItem =
+        m_pRootItemLayoutProcessor->ExtractLayoutItem();
+    if (pLayoutItem) {
+      pLayoutItem->m_sPos = CFX_PointF(fPosX, fPosY);
+    }
+    m_pLayoutPageMgr->SubmitContentItem(pLayoutItem, eStatus);
+  } while (eStatus != XFA_ItemLayoutProcessorResult_Done &&
+           (!pPause || !pPause->NeedToPauseNow()));
+  if (eStatus == XFA_ItemLayoutProcessorResult_Done) {
+    m_pLayoutPageMgr->FinishPaginatedPageSets();
+    m_pLayoutPageMgr->SyncLayoutData();
+    m_bNeeLayout = FALSE;
+    m_rgChangedContainers.RemoveAll();
+  }
+  return 100 * (eStatus == XFA_ItemLayoutProcessorResult_Done
+                    ? m_nProgressCounter
+                    : m_nProgressCounter - 1) /
+         m_nProgressCounter;
+}
+FX_BOOL CXFA_LayoutProcessor::IncrementLayout() {
+  if (m_bNeeLayout) {
+    StartLayout(TRUE);
+    return DoLayout(NULL) == 100;
+  }
+  for (int32_t i = 0, c = m_rgChangedContainers.GetSize(); i < c; i++) {
+    CXFA_Node* pNode = m_rgChangedContainers[i];
+    CXFA_Node* pParentNode =
+        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+    if (!pParentNode) {
+      return FALSE;
+    }
+    if (!CXFA_ItemLayoutProcessor::IncrementRelayoutNode(this, pNode,
+                                                         pParentNode)) {
+      return FALSE;
+    }
+  }
+  m_rgChangedContainers.RemoveAll();
+  return TRUE;
+}
+int32_t CXFA_LayoutProcessor::CountPages() const {
+  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPageCount() : 0;
+}
+IXFA_LayoutPage* CXFA_LayoutProcessor::GetPage(int32_t index) const {
+  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPage(index) : NULL;
+}
+CXFA_LayoutItem* CXFA_LayoutProcessor::GetLayoutItem(CXFA_Node* pFormItem) {
+  return static_cast<CXFA_LayoutItem*>(
+      pFormItem->GetUserData(XFA_LAYOUTITEMKEY));
+}
+void CXFA_LayoutProcessor::AddChangedContainer(CXFA_Node* pContainer) {
+  if (m_rgChangedContainers.Find(pContainer) < 0) {
+    m_rgChangedContainers.Add(pContainer);
+  }
+}
+CXFA_ContainerLayoutItem* CXFA_LayoutProcessor::GetRootLayoutItem() const {
+  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetRootLayoutItem() : NULL;
+}
+void CXFA_LayoutProcessor::ClearLayoutData() {
+  if (m_pLayoutPageMgr) {
+    delete m_pLayoutPageMgr;
+    m_pLayoutPageMgr = NULL;
+  }
+  if (m_pRootItemLayoutProcessor) {
+    delete m_pRootItemLayoutProcessor;
+    m_pRootItemLayoutProcessor = NULL;
+  }
+  m_nProgressCounter = 0;
+}
+FX_BOOL CXFA_LayoutProcessor::IsNeedLayout() {
+  return m_bNeeLayout || m_rgChangedContainers.GetSize() > 0;
+}
+CXFA_LayoutItem::CXFA_LayoutItem(CXFA_Node* pNode, FX_BOOL bIsContentLayoutItem)
+    : m_pFormNode(pNode),
+      m_pParent(NULL),
+      m_pNextSibling(NULL),
+      m_pFirstChild(NULL),
+      m_bIsContentLayoutItem(bIsContentLayoutItem) {}
+CXFA_LayoutItem::~CXFA_LayoutItem() {}
+CXFA_ContainerLayoutItem::CXFA_ContainerLayoutItem(CXFA_Node* pNode)
+    : CXFA_LayoutItem(pNode, FALSE), m_pOldSubform(NULL) {}
+IXFA_DocLayout* CXFA_ContainerLayoutItem::GetLayout() const {
+  return m_pFormNode->GetDocument()->GetLayoutProcessor();
+}
+int32_t CXFA_ContainerLayoutItem::GetPageIndex() const {
+  return m_pFormNode->GetDocument()
+      ->GetLayoutProcessor()
+      ->GetLayoutPageMgr()
+      ->GetPageIndex(this);
+}
+void CXFA_ContainerLayoutItem::GetPageSize(CFX_SizeF& size) {
+  size.clear();
+  CXFA_Node* pMedium = m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Medium);
+  if (!pMedium)
+    return;
+
+  size = CFX_SizeF(pMedium->GetMeasure(XFA_ATTRIBUTE_Short).ToUnit(XFA_UNIT_Pt),
+                   pMedium->GetMeasure(XFA_ATTRIBUTE_Long).ToUnit(XFA_UNIT_Pt));
+  if (pMedium->GetEnum(XFA_ATTRIBUTE_Orientation) ==
+      XFA_ATTRIBUTEENUM_Landscape) {
+    size = CFX_SizeF(size.y, size.x);
+  }
+}
+CXFA_Node* CXFA_ContainerLayoutItem::GetMasterPage() const {
+  return m_pFormNode;
+}
+CXFA_ContentLayoutItem::CXFA_ContentLayoutItem(CXFA_Node* pNode)
+    : CXFA_LayoutItem(pNode, TRUE),
+      m_pPrev(NULL),
+      m_pNext(NULL),
+      m_dwStatus(0) {}
+CXFA_ContentLayoutItem::~CXFA_ContentLayoutItem() {
+  if (m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY) == this) {
+    m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL);
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_document_layout_imp.h b/xfa/fxfa/parser/xfa_document_layout_imp.h
new file mode 100644
index 0000000..7f6c14e
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_layout_imp.h
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
+#define XFA_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+
+class CXFA_ItemLayoutProcessor;
+class CXFA_LayoutPageMgr;
+class CXFA_ContainerLayoutItem;
+
+class CXFA_LayoutProcessor : public IXFA_DocLayout {
+ public:
+  CXFA_LayoutProcessor(CXFA_Document* pDocument);
+  ~CXFA_LayoutProcessor();
+  virtual CXFA_Document* GetDocument() const;
+  virtual int32_t StartLayout(FX_BOOL bForceRestart = FALSE);
+  virtual int32_t DoLayout(IFX_Pause* pPause = NULL);
+  virtual FX_BOOL IncrementLayout();
+  virtual int32_t CountPages() const;
+  virtual IXFA_LayoutPage* GetPage(int32_t index) const;
+  virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem);
+
+  void AddChangedContainer(CXFA_Node* pContainer);
+  void SetForceReLayout(FX_BOOL bForceRestart) { m_bNeeLayout = bForceRestart; }
+  CXFA_ContainerLayoutItem* GetRootLayoutItem() const;
+  CXFA_ItemLayoutProcessor* GetRootRootItemLayoutProcessor() {
+    return m_pRootItemLayoutProcessor;
+  }
+  CXFA_LayoutPageMgr* GetLayoutPageMgr() { return m_pLayoutPageMgr; }
+
+ protected:
+  void ClearLayoutData();
+
+  FX_BOOL IsNeedLayout();
+
+  CXFA_Document* m_pDocument;
+  CXFA_ItemLayoutProcessor* m_pRootItemLayoutProcessor;
+  CXFA_LayoutPageMgr* m_pLayoutPageMgr;
+  CXFA_NodeArray m_rgChangedContainers;
+  uint32_t m_nProgressCounter;
+  FX_BOOL m_bNeeLayout;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
diff --git a/xfa/fxfa/parser/xfa_document_serialize.cpp b/xfa/fxfa/parser/xfa_document_serialize.cpp
new file mode 100644
index 0000000..858efff
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_serialize.cpp
@@ -0,0 +1,590 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_document_serialize.h"
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+IXFA_PacketImport* IXFA_PacketImport::Create(CXFA_Document* pDocument) {
+  return new CXFA_DataImporter(pDocument);
+}
+CXFA_DataImporter::CXFA_DataImporter(CXFA_Document* pDocument)
+    : m_pDocument(pDocument) {
+  ASSERT(m_pDocument);
+}
+FX_BOOL CXFA_DataImporter::ImportData(IFX_FileRead* pDataDocument) {
+  IXFA_Parser* pDataDocumentParser = IXFA_Parser::Create(m_pDocument);
+  if (!pDataDocumentParser) {
+    return FALSE;
+  }
+  if (pDataDocumentParser->StartParse(pDataDocument, XFA_XDPPACKET_Datasets) !=
+      XFA_PARSESTATUS_Ready) {
+    pDataDocumentParser->Release();
+    return FALSE;
+  }
+  if (pDataDocumentParser->DoParse(NULL) < XFA_PARSESTATUS_Done) {
+    pDataDocumentParser->Release();
+    return FALSE;
+  }
+  CXFA_Node* pImportDataRoot = pDataDocumentParser->GetRootNode();
+  if (!pImportDataRoot) {
+    pDataDocumentParser->Release();
+    return FALSE;
+  }
+  CXFA_Node* pDataModel =
+      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
+  if (!pDataModel) {
+    pDataDocumentParser->Release();
+    return FALSE;
+  }
+  CXFA_Node* pDataNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Data));
+  if (pDataNode) {
+    pDataModel->RemoveChild(pDataNode);
+  }
+  if (pImportDataRoot->GetClassID() == XFA_ELEMENT_DataModel) {
+    while (CXFA_Node* pChildNode =
+               pImportDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      pImportDataRoot->RemoveChild(pChildNode);
+      pDataModel->InsertChild(pChildNode);
+    }
+  } else {
+    IFDE_XMLNode* pXMLNode = pImportDataRoot->GetXMLMappingNode();
+    IFDE_XMLNode* pParentXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
+    if (pParentXMLNode) {
+      pParentXMLNode->RemoveChildNode(pXMLNode);
+    }
+    pDataModel->InsertChild(pImportDataRoot);
+  }
+  m_pDocument->DoDataRemerge(FALSE);
+  pDataDocumentParser->Release();
+  return TRUE;
+}
+CFX_WideString XFA_ExportEncodeAttribute(const CFX_WideString& str) {
+  CFX_WideTextBuf textBuf;
+  int32_t iLen = str.GetLength();
+  for (int32_t i = 0; i < iLen; i++) {
+    switch (str[i]) {
+      case '&':
+        textBuf << FX_WSTRC(L"&amp;");
+        break;
+      case '<':
+        textBuf << FX_WSTRC(L"&lt;");
+        break;
+      case '>':
+        textBuf << FX_WSTRC(L"&gt;");
+        break;
+      case '\'':
+        textBuf << FX_WSTRC(L"&apos;");
+        break;
+      case '\"':
+        textBuf << FX_WSTRC(L"&quot;");
+        break;
+      default:
+        textBuf.AppendChar(str[i]);
+    }
+  }
+  return textBuf.GetWideString();
+}
+CFX_WideString XFA_ExportEncodeContent(const CFX_WideStringC& str) {
+  CFX_WideTextBuf textBuf;
+  int32_t iLen = str.GetLength();
+  for (int32_t i = 0; i < iLen; i++) {
+    FX_WCHAR ch = str.GetAt(i);
+    if (!FDE_IsXMLValidChar(ch)) {
+      continue;
+    }
+    if (ch == '&') {
+      textBuf << FX_WSTRC(L"&amp;");
+    } else if (ch == '<') {
+      textBuf << FX_WSTRC(L"&lt;");
+    } else if (ch == '>') {
+      textBuf << FX_WSTRC(L"&gt;");
+    } else if (ch == '\'') {
+      textBuf << FX_WSTRC(L"&apos;");
+    } else if (ch == '\"') {
+      textBuf << FX_WSTRC(L"&quot;");
+    } else if (ch == ' ') {
+      if (i && str.GetAt(i - 1) != ' ') {
+        textBuf.AppendChar(' ');
+      } else {
+        textBuf << FX_WSTRC(L"&#x20;");
+      }
+    } else {
+      textBuf.AppendChar(str.GetAt(i));
+    }
+  }
+  return textBuf.GetWideString();
+}
+static void XFA_SaveAttribute(CXFA_Node* pNode,
+                              XFA_ATTRIBUTE eName,
+                              const CFX_WideStringC& wsName,
+                              FX_BOOL bProto,
+                              CFX_WideString& wsOutput) {
+  CFX_WideString wsValue;
+  if ((!bProto && !pNode->HasAttribute((XFA_ATTRIBUTE)eName, bProto)) ||
+      !pNode->GetAttribute((XFA_ATTRIBUTE)eName, wsValue, FALSE)) {
+    return;
+  }
+  wsValue = XFA_ExportEncodeAttribute(wsValue);
+  wsOutput += FX_WSTRC(L" ");
+  wsOutput += wsName;
+  wsOutput += FX_WSTRC(L"=\"");
+  wsOutput += wsValue;
+  wsOutput += FX_WSTRC(L"\"");
+}
+static FX_BOOL XFA_DataExporter_AttributeSaveInDataModel(
+    CXFA_Node* pNode,
+    XFA_ATTRIBUTE eAttribute) {
+  FX_BOOL bSaveInDataModel = FALSE;
+  if (pNode->GetClassID() != XFA_ELEMENT_Image) {
+    return bSaveInDataModel;
+  }
+  CXFA_Node* pValueNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (!pValueNode || pValueNode->GetClassID() != XFA_ELEMENT_Value) {
+    return bSaveInDataModel;
+  }
+  CXFA_Node* pFieldNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (pFieldNode && pFieldNode->GetBindData() &&
+      eAttribute == XFA_ATTRIBUTE_Href) {
+    bSaveInDataModel = TRUE;
+  }
+  return bSaveInDataModel;
+}
+FX_BOOL XFA_DataExporter_ContentNodeNeedtoExport(CXFA_Node* pContentNode) {
+  CFX_WideString wsContent;
+  if (!pContentNode->TryContent(wsContent, FALSE, FALSE)) {
+    return FALSE;
+  }
+  FXSYS_assert(pContentNode->GetObjectType() == XFA_OBJECTTYPE_ContentNode);
+  CXFA_Node* pParentNode = pContentNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Value) {
+    return TRUE;
+  }
+  CXFA_Node* pGrandParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (!pGrandParentNode ||
+      pGrandParentNode->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) {
+    return TRUE;
+  }
+  if (pGrandParentNode->GetBindData()) {
+    return FALSE;
+  }
+  CXFA_WidgetData* pWidgetData = pGrandParentNode->GetWidgetData();
+  XFA_ELEMENT eUIType = pWidgetData->GetUIType();
+  if (eUIType == XFA_ELEMENT_PasswordEdit) {
+    return FALSE;
+  }
+  return TRUE;
+}
+static void XFA_DataExporter_RecognizeXFAVersionNumber(
+    CXFA_Node* pTemplateRoot,
+    CFX_WideString& wsVersionNumber) {
+  wsVersionNumber.Empty();
+  if (!pTemplateRoot) {
+    return;
+  }
+  CFX_WideString wsTemplateNS;
+  if (!pTemplateRoot->TryNamespace(wsTemplateNS)) {
+    return;
+  }
+  XFA_VERSION eVersion =
+      pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(wsTemplateNS);
+  if (eVersion == XFA_VERSION_UNKNOWN) {
+    eVersion = XFA_VERSION_DEFAULT;
+  }
+  wsVersionNumber.Format(L"%i.%i", eVersion / 100, eVersion % 100);
+}
+static void XFA_DataExporter_RegenerateFormFile_Changed(
+    CXFA_Node* pNode,
+    CFX_WideTextBuf& buf,
+    FX_BOOL bSaveXML = FALSE) {
+  CFX_WideString wsAttrs;
+  int32_t iAttrs = 0;
+  const uint8_t* pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs);
+  while (iAttrs--) {
+    const XFA_ATTRIBUTEINFO* pAttr =
+        XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]);
+    if (pAttr->eName == XFA_ATTRIBUTE_Name ||
+        (XFA_DataExporter_AttributeSaveInDataModel(pNode, pAttr->eName) &&
+         !bSaveXML)) {
+      continue;
+    }
+    CFX_WideString wsAttr;
+    XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr);
+    wsAttrs += wsAttr;
+  }
+  CFX_WideString wsChildren;
+  switch (pNode->GetObjectType()) {
+    case XFA_OBJECTTYPE_ContentNode: {
+      if (!bSaveXML && !XFA_DataExporter_ContentNodeNeedtoExport(pNode)) {
+        break;
+      }
+      CXFA_Node* pRawValueNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+      while (pRawValueNode &&
+             pRawValueNode->GetClassID() != XFA_ELEMENT_SharpxHTML &&
+             pRawValueNode->GetClassID() != XFA_ELEMENT_Sharptext &&
+             pRawValueNode->GetClassID() != XFA_ELEMENT_Sharpxml) {
+        pRawValueNode = pRawValueNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      }
+      if (!pRawValueNode) {
+        break;
+      }
+      CFX_WideString wsContentType;
+      pNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
+      if (pRawValueNode->GetClassID() == XFA_ELEMENT_SharpxHTML &&
+          wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+        IFDE_XMLNode* pExDataXML = pNode->GetXMLMappingNode();
+        if (!pExDataXML) {
+          break;
+        }
+        IFDE_XMLNode* pRichTextXML =
+            pExDataXML->GetNodeItem(IFDE_XMLNode::FirstChild);
+        if (!pRichTextXML) {
+          break;
+        }
+        IFX_MemoryStream* pMemStream = FX_CreateMemoryStream(TRUE);
+        IFX_Stream* pTempStream = IFX_Stream::CreateStream(
+            (IFX_FileWrite*)pMemStream, FX_STREAMACCESS_Text |
+                                            FX_STREAMACCESS_Write |
+                                            FX_STREAMACCESS_Append);
+        pTempStream->SetCodePage(FX_CODEPAGE_UTF8);
+        pRichTextXML->SaveXMLNode(pTempStream);
+        wsChildren += CFX_WideString::FromUTF8(
+            (const FX_CHAR*)pMemStream->GetBuffer(), pMemStream->GetSize());
+        pTempStream->Release();
+        pMemStream->Release();
+      } else if (pRawValueNode->GetClassID() == XFA_ELEMENT_Sharpxml &&
+                 wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
+        CFX_WideString wsRawValue;
+        pRawValueNode->GetAttribute(XFA_ATTRIBUTE_Value, wsRawValue, FALSE);
+        if (wsRawValue.IsEmpty()) {
+          break;
+        }
+        CFX_WideStringArray wsSelTextArray;
+        int32_t iStart = 0;
+        int32_t iEnd = wsRawValue.Find(L'\n', iStart);
+        iEnd = (iEnd == -1) ? wsRawValue.GetLength() : iEnd;
+        while (iEnd >= iStart) {
+          wsSelTextArray.Add(wsRawValue.Mid(iStart, iEnd - iStart));
+          iStart = iEnd + 1;
+          if (iStart >= wsRawValue.GetLength()) {
+            break;
+          }
+          iEnd = wsRawValue.Find(L'\n', iStart);
+        }
+        CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+        FXSYS_assert(pParentNode);
+        CXFA_Node* pGrandparentNode =
+            pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
+        FXSYS_assert(pGrandparentNode);
+        CFX_WideString bodyTagName;
+        bodyTagName = pGrandparentNode->GetCData(XFA_ATTRIBUTE_Name);
+        if (bodyTagName.IsEmpty()) {
+          bodyTagName = FX_WSTRC(L"ListBox1");
+        }
+        buf << FX_WSTRC(L"<");
+        buf << bodyTagName;
+        buf << FX_WSTRC(L" xmlns=\"\"\n>");
+        for (int32_t i = 0; i < wsSelTextArray.GetSize(); i++) {
+          buf << FX_WSTRC(L"<value\n>");
+          buf << XFA_ExportEncodeContent(wsSelTextArray[i]);
+          buf << FX_WSTRC(L"</value\n>");
+        }
+        buf << FX_WSTRC(L"</");
+        buf << bodyTagName;
+        buf << FX_WSTRC(L"\n>");
+        wsChildren += buf.GetWideString();
+        buf.Clear();
+      } else {
+        CFX_WideStringC wsValue = pRawValueNode->GetCData(XFA_ATTRIBUTE_Value);
+        wsChildren += XFA_ExportEncodeContent(wsValue);
+      }
+    } break;
+    case XFA_OBJECTTYPE_TextNode:
+    case XFA_OBJECTTYPE_NodeC:
+    case XFA_OBJECTTYPE_NodeV: {
+      CFX_WideStringC wsValue = pNode->GetCData(XFA_ATTRIBUTE_Value);
+      wsChildren += XFA_ExportEncodeContent(wsValue);
+    } break;
+    default:
+      if (pNode->GetClassID() == XFA_ELEMENT_Items) {
+        CXFA_Node* pTemplateNode = pNode->GetTemplateNode();
+        if (!pTemplateNode ||
+            pTemplateNode->CountChildren(XFA_ELEMENT_UNKNOWN) !=
+                pNode->CountChildren(XFA_ELEMENT_UNKNOWN)) {
+          bSaveXML = TRUE;
+        }
+      }
+      CFX_WideTextBuf newBuf;
+      CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+      while (pChildNode) {
+        XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf,
+                                                    bSaveXML);
+        wsChildren += newBuf.GetWideString();
+        newBuf.Clear();
+        pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      }
+      if (!bSaveXML && !wsChildren.IsEmpty() &&
+          pNode->GetClassID() == XFA_ELEMENT_Items) {
+        wsChildren.Empty();
+        bSaveXML = TRUE;
+        CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+        while (pChildNode) {
+          XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf,
+                                                      bSaveXML);
+          wsChildren += newBuf.GetWideString();
+          newBuf.Clear();
+          pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+        }
+      }
+      break;
+  }
+  if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() ||
+      pNode->HasAttribute(XFA_ATTRIBUTE_Name)) {
+    CFX_WideStringC wsElement;
+    pNode->GetClassName(wsElement);
+    CFX_WideString wsName;
+    XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE,
+                      wsName);
+    buf << FX_WSTRC(L"<");
+    buf << wsElement;
+    buf << wsName;
+    buf << wsAttrs;
+    if (wsChildren.IsEmpty()) {
+      buf << FX_WSTRC(L"\n/>");
+    } else {
+      buf << FX_WSTRC(L"\n>");
+      buf << wsChildren;
+      buf << FX_WSTRC(L"</");
+      buf << wsElement;
+      buf << FX_WSTRC(L"\n>");
+    }
+  }
+}
+static void XFA_DataExporter_RegenerateFormFile_Container(
+    CXFA_Node* pNode,
+    IFX_Stream* pStream,
+    FX_BOOL bSaveXML = FALSE) {
+  XFA_ELEMENT eElement = pNode->GetClassID();
+  if (eElement == XFA_ELEMENT_Field || eElement == XFA_ELEMENT_Draw ||
+      !pNode->IsContainerNode()) {
+    CFX_WideTextBuf buf;
+    XFA_DataExporter_RegenerateFormFile_Changed(pNode, buf, bSaveXML);
+    FX_STRSIZE nLen = buf.GetLength();
+    if (nLen > 0) {
+      pStream->WriteString((const FX_WCHAR*)buf.GetBuffer(), nLen);
+    }
+    return;
+  }
+  CFX_WideStringC wsElement;
+  pNode->GetClassName(wsElement);
+  pStream->WriteString(L"<", 1);
+  pStream->WriteString(wsElement.GetPtr(), wsElement.GetLength());
+  CFX_WideString wsOutput;
+  XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE,
+                    wsOutput);
+  CFX_WideString wsAttrs;
+  int32_t iAttrs = 0;
+  const uint8_t* pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs);
+  while (iAttrs--) {
+    const XFA_ATTRIBUTEINFO* pAttr =
+        XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]);
+    if (pAttr->eName == XFA_ATTRIBUTE_Name) {
+      continue;
+    }
+    CFX_WideString wsAttr;
+    XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, FALSE, wsAttr);
+    wsOutput += wsAttr;
+  }
+  if (!wsOutput.IsEmpty()) {
+    pStream->WriteString((const FX_WCHAR*)wsOutput, wsOutput.GetLength());
+  }
+  CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (pChildNode) {
+    pStream->WriteString(L"\n>", 2);
+    while (pChildNode) {
+      XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream,
+                                                    bSaveXML);
+      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    pStream->WriteString(L"</", 2);
+    pStream->WriteString(wsElement.GetPtr(), wsElement.GetLength());
+    pStream->WriteString(L"\n>", 2);
+  } else {
+    pStream->WriteString(L"\n/>", 3);
+  }
+}
+void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode,
+                                         IFX_Stream* pStream,
+                                         const FX_CHAR* pChecksum,
+                                         FX_BOOL bSaveXML) {
+  if (pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) {
+    static const FX_WCHAR* s_pwsTagName = L"<form";
+    static const FX_WCHAR* s_pwsClose = L"</form\n>";
+    pStream->WriteString(s_pwsTagName, FXSYS_wcslen(s_pwsTagName));
+    if (pChecksum) {
+      static const FX_WCHAR* s_pwChecksum = L" checksum=\"";
+      CFX_WideString wsChecksum =
+          CFX_WideString::FromUTF8(pChecksum, FXSYS_strlen(pChecksum));
+      pStream->WriteString(s_pwChecksum, FXSYS_wcslen(s_pwChecksum));
+      pStream->WriteString((const FX_WCHAR*)wsChecksum, wsChecksum.GetLength());
+      pStream->WriteString(L"\"", 1);
+    }
+    pStream->WriteString(L" xmlns=\"", FXSYS_wcslen(L" xmlns=\""));
+    const FX_WCHAR* pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI;
+    pStream->WriteString(pURI, FXSYS_wcslen(pURI));
+    CFX_WideString wsVersionNumber;
+    XFA_DataExporter_RecognizeXFAVersionNumber(
+        ToNode(pNode->GetDocument()->GetXFAObject(XFA_XDPPACKET_Template)),
+        wsVersionNumber);
+    if (wsVersionNumber.IsEmpty()) {
+      wsVersionNumber = FX_WSTRC(L"2.8");
+    }
+    wsVersionNumber += FX_WSTRC(L"/\"\n>");
+    pStream->WriteString((const FX_WCHAR*)wsVersionNumber,
+                         wsVersionNumber.GetLength());
+    CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    while (pChildNode) {
+      XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream);
+      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    pStream->WriteString(s_pwsClose, FXSYS_wcslen(s_pwsClose));
+  } else {
+    XFA_DataExporter_RegenerateFormFile_Container(pNode, pStream, bSaveXML);
+  }
+}
+IXFA_PacketExport* IXFA_PacketExport::Create(CXFA_Document* pDocument,
+                                             XFA_DATAFORMAT eFormat) {
+  return new CXFA_DataExporter(pDocument);
+}
+CXFA_DataExporter::CXFA_DataExporter(CXFA_Document* pDocument)
+    : m_pDocument(pDocument) {
+  ASSERT(m_pDocument);
+}
+FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite) {
+  return Export(pWrite, m_pDocument->GetRoot());
+}
+FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite,
+                                  CXFA_Node* pNode,
+                                  FX_DWORD dwFlag,
+                                  const FX_CHAR* pChecksum) {
+  if (!pWrite) {
+    ASSERT(false);
+    return FALSE;
+  }
+  IFX_Stream* pStream = IFX_Stream::CreateStream(
+      pWrite,
+      FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
+  if (pStream == NULL) {
+    return FALSE;
+  }
+  pStream->SetCodePage(FX_CODEPAGE_UTF8);
+  FX_BOOL bRet = Export(pStream, pNode, dwFlag, pChecksum);
+  pStream->Release();
+  return bRet;
+}
+FX_BOOL CXFA_DataExporter::Export(IFX_Stream* pStream,
+                                  CXFA_Node* pNode,
+                                  FX_DWORD dwFlag,
+                                  const FX_CHAR* pChecksum) {
+  IFDE_XMLDoc* pXMLDoc = m_pDocument->GetParser()->GetXMLDoc();
+  if (pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) {
+    switch (pNode->GetPacketID()) {
+      case XFA_XDPPACKET_XDP: {
+        static const FX_WCHAR* s_pwsPreamble =
+            L"<xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\">";
+        pStream->WriteString(s_pwsPreamble, FXSYS_wcslen(s_pwsPreamble));
+        for (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+          Export(pStream, pChild, dwFlag, pChecksum);
+        }
+        static const FX_WCHAR* s_pwsPostamble = L"</xdp:xdp\n>";
+        pStream->WriteString(s_pwsPostamble, FXSYS_wcslen(s_pwsPostamble));
+      } break;
+      case XFA_XDPPACKET_Datasets: {
+        IFDE_XMLElement* pElement =
+            (IFDE_XMLElement*)pNode->GetXMLMappingNode();
+        if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
+          return FALSE;
+        }
+        CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+        FXSYS_assert(pDataNode);
+        XFA_DataExporter_DealWithDataGroupNode(pDataNode);
+        pXMLDoc->SaveXMLNode(pStream, pElement);
+      } break;
+      case XFA_XDPPACKET_Form: {
+        XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum);
+      } break;
+      case XFA_XDPPACKET_Template:
+      default: {
+        IFDE_XMLElement* pElement =
+            (IFDE_XMLElement*)pNode->GetXMLMappingNode();
+        if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
+          return FALSE;
+        }
+        pXMLDoc->SaveXMLNode(pStream, pElement);
+      } break;
+    }
+  } else {
+    CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+    CXFA_Node* pExportNode = pNode;
+    for (CXFA_Node* pChildNode =
+             pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pChildNode;
+         pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pChildNode != pNode) {
+        pExportNode = pDataNode;
+        break;
+      }
+    }
+    IFDE_XMLElement* pElement =
+        (IFDE_XMLElement*)pExportNode->GetXMLMappingNode();
+    if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
+      return FALSE;
+    }
+    XFA_DataExporter_DealWithDataGroupNode(pExportNode);
+    pElement->SetString(FX_WSTRC(L"xmlns:xfa"),
+                        FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"));
+    pXMLDoc->SaveXMLNode(pStream, pElement);
+    pElement->RemoveAttribute(L"xmlns:xfa");
+  }
+  return TRUE;
+}
+void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) {
+  if (!pDataNode || pDataNode->GetClassID() == XFA_ELEMENT_DataValue) {
+    return;
+  }
+  int32_t iChildNum = 0;
+  for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pChildNode;
+       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    iChildNum++;
+    XFA_DataExporter_DealWithDataGroupNode(pChildNode);
+  }
+  if (pDataNode->GetClassID() == XFA_ELEMENT_DataGroup) {
+    if (iChildNum > 0) {
+      IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
+      FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      if (pXMLElement->HasAttribute(L"xfa:dataNode")) {
+        pXMLElement->RemoveAttribute(L"xfa:dataNode");
+      }
+    } else {
+      IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
+      FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
+      ((IFDE_XMLElement*)pXMLNode)
+          ->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup"));
+    }
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_document_serialize.h b/xfa/fxfa/parser/xfa_document_serialize.h
new file mode 100644
index 0000000..f9253fb
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_document_serialize.h
@@ -0,0 +1,40 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
+#define XFA_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
+
+#include "xfa/fxfa/parser/xfa_docdata.h"
+
+class CXFA_DataImporter : public IXFA_PacketImport {
+ public:
+  CXFA_DataImporter(CXFA_Document* pDocument);
+  virtual void Release() { delete this; }
+  virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument);
+
+ protected:
+  CXFA_Document* m_pDocument;
+};
+
+class CXFA_DataExporter : public IXFA_PacketExport {
+ public:
+  CXFA_DataExporter(CXFA_Document* pDocument);
+  virtual void Release() { delete this; }
+  virtual FX_BOOL Export(IFX_FileWrite* pWrite);
+  virtual FX_BOOL Export(IFX_FileWrite* pWrite,
+                         CXFA_Node* pNode,
+                         FX_DWORD dwFlag = 0,
+                         const FX_CHAR* pChecksum = NULL);
+
+ protected:
+  FX_BOOL Export(IFX_Stream* pStream,
+                 CXFA_Node* pNode,
+                 FX_DWORD dwFlag,
+                 const FX_CHAR* pChecksum);
+  CXFA_Document* m_pDocument;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
diff --git a/xfa/fxfa/parser/xfa_layout_appadapter.cpp b/xfa/fxfa/parser/xfa_layout_appadapter.cpp
new file mode 100644
index 0000000..3515dee
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_appadapter.cpp
@@ -0,0 +1,62 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_layout_appadapter.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_layout_itemlayout.h"
+#include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant) {
+  FX_DWORD dwRelevant = XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
+  CFX_WideStringC wsRelevant;
+  if (pFormItem->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant)) {
+    if (wsRelevant == FX_WSTRC(L"+print") || wsRelevant == FX_WSTRC(L"print")) {
+      dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable;
+    } else if (wsRelevant == FX_WSTRC(L"-print")) {
+      dwRelevant &= ~XFA_LAYOUTSTATUS_Printable;
+    }
+  }
+  if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Viewable) &&
+      (dwRelevant != XFA_LAYOUTSTATUS_Viewable)) {
+    dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable;
+  }
+  if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Printable) &&
+      (dwRelevant != XFA_LAYOUTSTATUS_Printable)) {
+    dwRelevant &= ~XFA_LAYOUTSTATUS_Printable;
+  }
+  return dwRelevant;
+}
+void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem) {
+  CXFA_LayoutItem* pNode = pLayoutItem->m_pFirstChild;
+  IXFA_Notify* pNotify =
+      pLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify();
+  IXFA_DocLayout* pDocLayout =
+      pLayoutItem->m_pFormNode->GetDocument()->GetDocLayout();
+  while (pNode) {
+    CXFA_LayoutItem* pNext = pNode->m_pNextSibling;
+    pNode->m_pParent = nullptr;
+    pNotify->OnLayoutEvent(pDocLayout, static_cast<CXFA_LayoutItem*>(pNode),
+                           XFA_LAYOUTEVENT_ItemRemoving);
+    XFA_ReleaseLayoutItem(pNode);
+    pNode = pNext;
+  }
+  pNotify->OnLayoutEvent(pDocLayout, pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving);
+  if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea) {
+    pNotify->OnPageEvent(static_cast<CXFA_ContainerLayoutItem*>(pLayoutItem),
+                         XFA_PAGEEVENT_PageRemoved);
+  }
+  delete pLayoutItem;
+}
diff --git a/xfa/fxfa/parser/xfa_layout_appadapter.h b/xfa/fxfa/parser/xfa_layout_appadapter.h
new file mode 100644
index 0000000..f20ee9b
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_appadapter.h
@@ -0,0 +1,77 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
+#define XFA_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+
+class CXFA_TraverseStrategy_PageAreaContainerLayoutItem {
+ public:
+  static inline CXFA_ContainerLayoutItem* GetFirstChild(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
+    }
+    return NULL;
+  }
+  static inline CXFA_ContainerLayoutItem* GetNextSibling(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
+  }
+  static inline CXFA_ContainerLayoutItem* GetParent(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+  }
+};
+class CXFA_TraverseStrategy_ContentAreaContainerLayoutItem {
+ public:
+  static inline CXFA_ContainerLayoutItem* GetFirstChild(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    for (CXFA_LayoutItem* pChildItem = pLayoutItem->m_pFirstChild; pChildItem;
+         pChildItem = pChildItem->m_pNextSibling) {
+      if (CXFA_ContainerLayoutItem* pContainer =
+              pChildItem->AsContainerLayoutItem()) {
+        return pContainer;
+      }
+    }
+    return nullptr;
+  }
+  static inline CXFA_ContainerLayoutItem* GetNextSibling(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    for (CXFA_LayoutItem* pChildItem = pLayoutItem->m_pNextSibling; pChildItem;
+         pChildItem = pChildItem->m_pNextSibling) {
+      if (CXFA_ContainerLayoutItem* pContainer =
+              pChildItem->AsContainerLayoutItem()) {
+        return pContainer;
+      }
+    }
+    return nullptr;
+  }
+  static inline CXFA_ContainerLayoutItem* GetParent(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+  }
+};
+class CXFA_TraverseStrategy_ContentLayoutItem {
+ public:
+  static inline CXFA_ContentLayoutItem* GetFirstChild(
+      CXFA_ContentLayoutItem* pLayoutItem) {
+    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
+  }
+  static inline CXFA_ContentLayoutItem* GetNextSibling(
+      CXFA_ContentLayoutItem* pLayoutItem) {
+    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pNextSibling;
+  }
+  static inline CXFA_ContentLayoutItem* GetParent(
+      CXFA_ContentLayoutItem* pLayoutItem) {
+    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pParent;
+  }
+};
+FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant);
+void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem);
+
+#endif  // XFA_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
new file mode 100644
index 0000000..2924fad
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
@@ -0,0 +1,2968 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_layout_itemlayout.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "xfa/fgas/crt/fgas_algorithm.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_layout_appadapter.h"
+#include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
+                                                   CXFA_LayoutPageMgr* pPageMgr)
+    : m_bKeepBreakFinish(FALSE),
+      m_bIsProcessKeep(FALSE),
+      m_pKeepHeadNode(nullptr),
+      m_pKeepTailNode(nullptr),
+      m_pFormNode(pNode),
+      m_pLayoutItem(nullptr),
+      m_pOldLayoutItem(nullptr),
+      m_pCurChildNode(XFA_LAYOUT_INVALIDNODE),
+      m_pCurChildPreprocessor(nullptr),
+      m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages_None),
+      m_fUsedSize(0),
+      m_pPageMgr(pPageMgr),
+      m_bBreakPending(TRUE),
+      m_fLastRowWidth(0),
+      m_fLastRowY(0),
+      m_fWidthLimite(0),
+      m_bUseInheriated(FALSE),
+      m_ePreProcessRs(XFA_ItemLayoutProcessorResult_Done),
+      m_bHasAvailHeight(TRUE) {
+  FXSYS_assert(m_pFormNode && (m_pFormNode->IsContainerNode() ||
+                               m_pFormNode->GetClassID() == XFA_ELEMENT_Form));
+  m_pOldLayoutItem =
+      (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
+}
+CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
+    CXFA_Node* pFormNode) {
+  if (!pFormNode) {
+    return NULL;
+  }
+  CXFA_ContentLayoutItem* pLayoutItem = NULL;
+  if (m_pOldLayoutItem) {
+    pLayoutItem = m_pOldLayoutItem;
+    m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
+    return pLayoutItem;
+  }
+  pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument()
+                    ->GetParser()
+                    ->GetNotify()
+                    ->OnCreateLayoutItem(pFormNode);
+  CXFA_ContentLayoutItem* pPrevLayoutItem =
+      (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
+  if (pPrevLayoutItem) {
+    while (pPrevLayoutItem->m_pNext) {
+      pPrevLayoutItem = pPrevLayoutItem->m_pNext;
+    }
+    pPrevLayoutItem->m_pNext = pLayoutItem;
+    pLayoutItem->m_pPrev = pPrevLayoutItem;
+  } else {
+    pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem);
+  }
+  return pLayoutItem;
+}
+FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos(
+    CXFA_ContentLayoutItem* pLayoutItem,
+    FX_FLOAT fCurVerticalOffset,
+    FX_FLOAT& fProposedSplitPos,
+    FX_BOOL& bAppChange,
+    FX_BOOL bCalculateMargin) {
+  CXFA_Node* pFormNode = pLayoutItem->m_pFormNode;
+  if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION &&
+      fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y -
+                               XFA_LAYOUT_FLOAT_PERCISION) {
+    switch (pFormNode->GetIntact()) {
+      case XFA_ATTRIBUTEENUM_None: {
+        FX_BOOL bAnyChanged = FALSE;
+        CXFA_Document* pDocument = pFormNode->GetDocument();
+        IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
+        FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0;
+        CXFA_Node* pMarginNode =
+            pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+        if (pMarginNode && bCalculateMargin) {
+          fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset)
+                              .ToUnit(XFA_UNIT_Pt);
+          fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset)
+                                 .ToUnit(XFA_UNIT_Pt);
+        }
+        FX_BOOL bChanged = TRUE;
+        while (bChanged) {
+          bChanged = FALSE;
+          {
+            FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurVerticalOffset;
+            if (pNotify->FindSplitPos(pFormNode, pLayoutItem->GetIndex(),
+                                      fRelSplitPos)) {
+              bAnyChanged = TRUE;
+              bChanged = TRUE;
+              fProposedSplitPos = fCurVerticalOffset + fRelSplitPos;
+              bAppChange = TRUE;
+              if (fProposedSplitPos <=
+                  fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
+                return TRUE;
+              }
+            }
+          }
+          FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurBottomMargin;
+          for (CXFA_ContentLayoutItem* pChildItem =
+                   (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
+               pChildItem;
+               pChildItem =
+                   (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) {
+            FX_FLOAT fChildOffset =
+                fCurVerticalOffset + fCurTopMargin + pChildItem->m_sPos.y;
+            FX_BOOL bAppChange = FALSE;
+            if (FindLayoutItemSplitPos(pChildItem, fChildOffset, fRelSplitPos,
+                                       bAppChange, bCalculateMargin)) {
+              if (fRelSplitPos - fChildOffset < XFA_LAYOUT_FLOAT_PERCISION &&
+                  bAppChange) {
+                fProposedSplitPos = fRelSplitPos - fCurTopMargin;
+              } else {
+                fProposedSplitPos = fRelSplitPos + fCurBottomMargin;
+              }
+              bAnyChanged = TRUE;
+              bChanged = TRUE;
+              if (fProposedSplitPos <=
+                  fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
+                return TRUE;
+              }
+              if (bAnyChanged) {
+                break;
+              }
+            }
+          }
+        }
+        return bAnyChanged;
+      } break;
+      case XFA_ATTRIBUTEENUM_ContentArea:
+      case XFA_ATTRIBUTEENUM_PageArea: {
+        fProposedSplitPos = fCurVerticalOffset;
+        return TRUE;
+      }
+      default:
+        return FALSE;
+    }
+  }
+  return FALSE;
+}
+static XFA_ATTRIBUTEENUM XFA_ItemLayoutProcessor_GetLayout(
+    CXFA_Node* pFormNode,
+    FX_BOOL& bRootForceTb) {
+  bRootForceTb = FALSE;
+  XFA_ATTRIBUTEENUM eLayoutMode;
+  if (pFormNode->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, FALSE)) {
+    return eLayoutMode;
+  }
+  CXFA_Node* pParentNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Form) {
+    bRootForceTb = TRUE;
+    return XFA_ATTRIBUTEENUM_Tb;
+  }
+  return XFA_ATTRIBUTEENUM_Position;
+}
+static FX_BOOL XFA_ExistContainerKeep(CXFA_Node* pCurNode, FX_BOOL bPreFind) {
+  if (pCurNode == NULL || !XFA_ItemLayoutProcessor_IsTakingSpace(pCurNode)) {
+    return FALSE;
+  }
+  XFA_NODEITEM eItemType = XFA_NODEITEM_PrevSibling;
+  if (!bPreFind) {
+    eItemType = XFA_NODEITEM_NextSibling;
+  }
+  CXFA_Node* pPreContainer =
+      pCurNode->GetNodeItem(eItemType, XFA_OBJECTTYPE_ContainerNode);
+  if (pPreContainer == NULL) {
+    return FALSE;
+  }
+  CXFA_Node* pKeep = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Keep);
+  if (pKeep) {
+    XFA_ATTRIBUTEENUM ePrevious;
+    XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Previous;
+    if (!bPreFind) {
+      eKeepType = XFA_ATTRIBUTE_Next;
+    }
+    if (pKeep->TryEnum(eKeepType, ePrevious, FALSE)) {
+      if (ePrevious == XFA_ATTRIBUTEENUM_ContentArea ||
+          ePrevious == XFA_ATTRIBUTEENUM_PageArea) {
+        return TRUE;
+      }
+    }
+  }
+  pKeep = pPreContainer->GetFirstChildByClass(XFA_ELEMENT_Keep);
+  if (!pKeep) {
+    return FALSE;
+  }
+  XFA_ATTRIBUTEENUM eNext;
+  XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Next;
+  if (!bPreFind) {
+    eKeepType = XFA_ATTRIBUTE_Previous;
+  }
+  if (!pKeep->TryEnum(eKeepType, eNext, FALSE)) {
+    return FALSE;
+  }
+  if (eNext == XFA_ATTRIBUTEENUM_ContentArea ||
+      eNext == XFA_ATTRIBUTEENUM_PageArea) {
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_FLOAT CXFA_ItemLayoutProcessor::FindSplitPos(FX_FLOAT fProposedSplitPos) {
+  ASSERT(m_pLayoutItem);
+  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+  FX_BOOL bCalculateMargin = TRUE;
+  if (eLayout == XFA_ATTRIBUTEENUM_Position) {
+    bCalculateMargin = FALSE;
+  }
+  while (fProposedSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+    FX_BOOL bAppChange = FALSE;
+    if (!FindLayoutItemSplitPos(m_pLayoutItem, 0, fProposedSplitPos, bAppChange,
+                                bCalculateMargin)) {
+      break;
+    }
+  }
+  return fProposedSplitPos;
+}
+void CXFA_ItemLayoutProcessor::SplitLayoutItem(
+    CXFA_ContentLayoutItem* pLayoutItem,
+    CXFA_ContentLayoutItem* pSecondParent,
+    FX_FLOAT fSplitPos) {
+  FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0;
+  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+  FX_BOOL bCalculateMargin = TRUE;
+  if (eLayout == XFA_ATTRIBUTEENUM_Position) {
+    bCalculateMargin = FALSE;
+  }
+  CXFA_Node* pMarginNode =
+      pLayoutItem->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  if (pMarginNode && bCalculateMargin) {
+    fCurTopMargin =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
+    fCurBottomMargin =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
+  }
+  CXFA_ContentLayoutItem* pSecondLayoutItem = NULL;
+  if (m_pCurChildPreprocessor &&
+      m_pCurChildPreprocessor->m_pFormNode == pLayoutItem->m_pFormNode) {
+    pSecondLayoutItem = m_pCurChildPreprocessor->CreateContentLayoutItem(
+        pLayoutItem->m_pFormNode);
+  } else {
+    pSecondLayoutItem = CreateContentLayoutItem(pLayoutItem->m_pFormNode);
+  }
+  pSecondLayoutItem->m_sPos.x = pLayoutItem->m_sPos.x;
+  pSecondLayoutItem->m_sSize.x = pLayoutItem->m_sSize.x;
+  pSecondLayoutItem->m_sPos.y = 0;
+  pSecondLayoutItem->m_sSize.y = pLayoutItem->m_sSize.y - fSplitPos;
+  pLayoutItem->m_sSize.y -= pSecondLayoutItem->m_sSize.y;
+  if (pLayoutItem->m_pFirstChild) {
+    pSecondLayoutItem->m_sSize.y += fCurTopMargin;
+  }
+  if (pSecondParent) {
+    pSecondParent->AddChild(pSecondLayoutItem);
+    if (fCurTopMargin > 0 && pLayoutItem->m_pFirstChild) {
+      pSecondParent->m_sSize.y += fCurTopMargin;
+      CXFA_ContentLayoutItem* pParentItem =
+          (CXFA_ContentLayoutItem*)pSecondParent->m_pParent;
+      while (pParentItem) {
+        pParentItem->m_sSize.y += fCurTopMargin;
+        pParentItem = (CXFA_ContentLayoutItem*)pParentItem->m_pParent;
+      }
+    }
+  } else {
+    pSecondLayoutItem->m_pParent = pLayoutItem->m_pParent;
+    pSecondLayoutItem->m_pNextSibling = pLayoutItem->m_pNextSibling;
+    pLayoutItem->m_pNextSibling = pSecondLayoutItem;
+  }
+  CXFA_ContentLayoutItem* pChildren =
+      (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
+  pLayoutItem->m_pFirstChild = NULL;
+  FX_FLOAT lHeightForKeep = 0;
+  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems;
+  FX_FLOAT fAddMarginHeight = 0;
+  for (CXFA_ContentLayoutItem *pChildItem = pChildren, *pChildNext = NULL;
+       pChildItem; pChildItem = pChildNext) {
+    pChildNext = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling;
+    pChildItem->m_pNextSibling = NULL;
+    if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin +
+                         XFA_LAYOUT_FLOAT_PERCISION) {
+      if (!XFA_ExistContainerKeep(pChildItem->m_pFormNode, TRUE)) {
+        pChildItem->m_sPos.y -= fSplitPos - fCurBottomMargin;
+        pChildItem->m_sPos.y += lHeightForKeep;
+        pChildItem->m_sPos.y += fAddMarginHeight;
+        pSecondLayoutItem->AddChild(pChildItem);
+      } else {
+        if (lHeightForKeep < XFA_LAYOUT_FLOAT_PERCISION) {
+          for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize();
+               iIndex++) {
+            CXFA_ContentLayoutItem* pPreItem = keepLayoutItems[iIndex];
+            pLayoutItem->RemoveChild(pPreItem);
+            pPreItem->m_sPos.y -= fSplitPos;
+            if (pPreItem->m_sPos.y < 0) {
+              pPreItem->m_sPos.y = 0;
+            }
+            if (pPreItem->m_sPos.y + pPreItem->m_sSize.y > lHeightForKeep) {
+              pPreItem->m_sPos.y = lHeightForKeep;
+              lHeightForKeep += pPreItem->m_sSize.y;
+              pSecondLayoutItem->m_sSize.y += pPreItem->m_sSize.y;
+              if (pSecondParent) {
+                pSecondParent->m_sSize.y += pPreItem->m_sSize.y;
+              }
+            }
+            pSecondLayoutItem->AddChild(pPreItem);
+          }
+        }
+        pChildItem->m_sPos.y -= fSplitPos;
+        pChildItem->m_sPos.y += lHeightForKeep;
+        pChildItem->m_sPos.y += fAddMarginHeight;
+        pSecondLayoutItem->AddChild(pChildItem);
+      }
+    } else if (fSplitPos + XFA_LAYOUT_FLOAT_PERCISION >=
+               fCurTopMargin + fCurBottomMargin + pChildItem->m_sPos.y +
+                   pChildItem->m_sSize.y) {
+      pLayoutItem->AddChild(pChildItem);
+      if (XFA_ExistContainerKeep(pChildItem->m_pFormNode, FALSE)) {
+        keepLayoutItems.Add(pChildItem);
+      } else {
+        keepLayoutItems.RemoveAll();
+      }
+    } else {
+      FX_FLOAT fOldHeight = pSecondLayoutItem->m_sSize.y;
+      SplitLayoutItem(
+          pChildItem, pSecondLayoutItem,
+          fSplitPos - fCurTopMargin - fCurBottomMargin - pChildItem->m_sPos.y);
+      fAddMarginHeight = pSecondLayoutItem->m_sSize.y - fOldHeight;
+      pLayoutItem->AddChild(pChildItem);
+    }
+  }
+}
+void CXFA_ItemLayoutProcessor::SplitLayoutItem(FX_FLOAT fSplitPos) {
+  ASSERT(m_pLayoutItem);
+  SplitLayoutItem(m_pLayoutItem, NULL, fSplitPos);
+}
+
+IXFA_LayoutPage* CXFA_LayoutItem::GetPage() const {
+  for (CXFA_LayoutItem* pCurNode = const_cast<CXFA_LayoutItem*>(this); pCurNode;
+       pCurNode = pCurNode->m_pParent) {
+    if (pCurNode->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea)
+      return static_cast<CXFA_ContainerLayoutItem*>(pCurNode);
+  }
+  return nullptr;
+}
+
+CXFA_Node* CXFA_LayoutItem::GetFormNode() const {
+  return m_pFormNode;
+}
+
+void CXFA_LayoutItem::GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative) const {
+  ASSERT(m_bIsContentLayoutItem);
+  const CXFA_ContentLayoutItem* pThis =
+      static_cast<const CXFA_ContentLayoutItem*>(this);
+  CFX_PointF sPos = pThis->m_sPos;
+  CFX_SizeF sSize = pThis->m_sSize;
+  if (!bRelative) {
+    for (CXFA_LayoutItem* pLayoutItem = pThis->m_pParent; pLayoutItem;
+         pLayoutItem = pLayoutItem->m_pParent) {
+      if (CXFA_ContentLayoutItem* pContent =
+              pLayoutItem->AsContentLayoutItem()) {
+        sPos += pContent->m_sPos;
+        if (CXFA_Node* pMarginNode =
+                pLayoutItem->m_pFormNode->GetFirstChildByClass(
+                    XFA_ELEMENT_Margin)) {
+          sPos += CFX_PointF(pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset)
+                                 .ToUnit(XFA_UNIT_Pt),
+                             pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset)
+                                 .ToUnit(XFA_UNIT_Pt));
+        }
+      } else {
+        if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
+          sPos +=
+              CFX_PointF(pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_X)
+                             .ToUnit(XFA_UNIT_Pt),
+                         pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Y)
+                             .ToUnit(XFA_UNIT_Pt));
+          break;
+        } else if (pLayoutItem->m_pFormNode->GetClassID() ==
+                   XFA_ELEMENT_PageArea) {
+          break;
+        }
+      }
+    }
+  }
+  rtLayout.Set(sPos.x, sPos.y, sSize.x, sSize.y);
+}
+
+CXFA_LayoutItem* CXFA_LayoutItem::GetParent() const {
+  return m_pParent;
+}
+
+const CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() const {
+  ASSERT(m_bIsContentLayoutItem);
+  const CXFA_ContentLayoutItem* pCurNode =
+      static_cast<const CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pPrev) {
+    pCurNode = pCurNode->m_pPrev;
+  }
+  return pCurNode;
+}
+
+CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() {
+  ASSERT(m_bIsContentLayoutItem);
+  CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pPrev) {
+    pCurNode = pCurNode->m_pPrev;
+  }
+  return pCurNode;
+}
+
+CXFA_LayoutItem* CXFA_LayoutItem::GetLast() {
+  ASSERT(m_bIsContentLayoutItem);
+  CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pNext) {
+    pCurNode = pCurNode->m_pNext;
+  }
+  return pCurNode;
+}
+
+const CXFA_LayoutItem* CXFA_LayoutItem::GetLast() const {
+  ASSERT(m_bIsContentLayoutItem);
+  const CXFA_ContentLayoutItem* pCurNode =
+      static_cast<const CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pNext) {
+    pCurNode = pCurNode->m_pNext;
+  }
+  return pCurNode;
+}
+
+CXFA_LayoutItem* CXFA_LayoutItem::GetPrev() const {
+  ASSERT(m_bIsContentLayoutItem);
+  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pPrev;
+}
+
+CXFA_LayoutItem* CXFA_LayoutItem::GetNext() const {
+  ASSERT(m_bIsContentLayoutItem);
+  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pNext;
+}
+
+int32_t CXFA_LayoutItem::GetIndex() const {
+  ASSERT(m_bIsContentLayoutItem);
+  int32_t iIndex = 0;
+  const CXFA_ContentLayoutItem* pCurNode =
+      static_cast<const CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pPrev) {
+    pCurNode = pCurNode->m_pPrev;
+    ++iIndex;
+  }
+  return iIndex;
+}
+
+int32_t CXFA_LayoutItem::GetCount() const {
+  ASSERT(m_bIsContentLayoutItem);
+  int32_t iCount = GetIndex() + 1;
+  const CXFA_ContentLayoutItem* pCurNode =
+      static_cast<const CXFA_ContentLayoutItem*>(this);
+  while (pCurNode->m_pNext) {
+    pCurNode = pCurNode->m_pNext;
+    iCount++;
+  }
+  return iCount;
+}
+
+void CXFA_LayoutItem::AddChild(CXFA_LayoutItem* pChildItem) {
+  if (pChildItem->m_pParent) {
+    pChildItem->m_pParent->RemoveChild(pChildItem);
+  }
+  pChildItem->m_pParent = this;
+  if (m_pFirstChild == NULL) {
+    m_pFirstChild = pChildItem;
+  } else {
+    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
+    while (pExistingChildItem->m_pNextSibling) {
+      pExistingChildItem = pExistingChildItem->m_pNextSibling;
+    }
+    pExistingChildItem->m_pNextSibling = pChildItem;
+  }
+}
+void CXFA_LayoutItem::AddHeadChild(CXFA_LayoutItem* pChildItem) {
+  if (pChildItem->m_pParent) {
+    pChildItem->m_pParent->RemoveChild(pChildItem);
+  }
+  pChildItem->m_pParent = this;
+  if (m_pFirstChild == NULL) {
+    m_pFirstChild = pChildItem;
+  } else {
+    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
+    m_pFirstChild = pChildItem;
+    m_pFirstChild->m_pNextSibling = pExistingChildItem;
+  }
+}
+void CXFA_LayoutItem::InsertChild(CXFA_LayoutItem* pBeforeItem,
+                                  CXFA_LayoutItem* pChildItem) {
+  if (pBeforeItem->m_pParent != this) {
+    return;
+  }
+  if (pChildItem->m_pParent) {
+    pChildItem->m_pParent = NULL;
+  }
+  pChildItem->m_pParent = this;
+  CXFA_LayoutItem* pExistingChildItem = pBeforeItem->m_pNextSibling;
+  pBeforeItem->m_pNextSibling = pChildItem;
+  pChildItem->m_pNextSibling = pExistingChildItem;
+}
+void CXFA_LayoutItem::RemoveChild(CXFA_LayoutItem* pChildItem) {
+  if (pChildItem->m_pParent != this) {
+    return;
+  }
+  if (m_pFirstChild == pChildItem) {
+    m_pFirstChild = pChildItem->m_pNextSibling;
+  } else {
+    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
+    while (pExistingChildItem &&
+           pExistingChildItem->m_pNextSibling != pChildItem) {
+      pExistingChildItem = pExistingChildItem->m_pNextSibling;
+    }
+    if (pExistingChildItem) {
+      pExistingChildItem->m_pNextSibling = pChildItem->m_pNextSibling;
+    }
+  }
+  pChildItem->m_pNextSibling = NULL;
+  pChildItem->m_pParent = NULL;
+}
+CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::ExtractLayoutItem() {
+  CXFA_ContentLayoutItem* pLayoutItem = m_pLayoutItem;
+  if (pLayoutItem) {
+    m_pLayoutItem = (CXFA_ContentLayoutItem*)pLayoutItem->m_pNextSibling;
+    pLayoutItem->m_pNextSibling = NULL;
+  }
+  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done &&
+      ToContentLayoutItem(m_pOldLayoutItem)) {
+    if (m_pOldLayoutItem->m_pPrev) {
+      m_pOldLayoutItem->m_pPrev->m_pNext = NULL;
+    }
+    IXFA_Notify* pNotify =
+        m_pOldLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify();
+    IXFA_DocLayout* pDocLayout =
+        m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout();
+    CXFA_ContentLayoutItem* pOldLayoutItem = m_pOldLayoutItem;
+    while (pOldLayoutItem) {
+      CXFA_ContentLayoutItem* pNextOldLayoutItem = pOldLayoutItem->m_pNext;
+      pNotify->OnLayoutEvent(pDocLayout, pOldLayoutItem,
+                             XFA_LAYOUTEVENT_ItemRemoving);
+      delete pOldLayoutItem;
+      pOldLayoutItem = pNextOldLayoutItem;
+    }
+    m_pOldLayoutItem = NULL;
+  }
+  return pLayoutItem;
+}
+static FX_BOOL XFA_ItemLayoutProcessor_FindBreakNode(
+    CXFA_Node* pContainerNode,
+    CXFA_Node*& pCurActionNode,
+    XFA_ItemLayoutProcessorStages& nCurStage,
+    FX_BOOL bBreakBefore) {
+  FX_BOOL bFindRs = FALSE;
+  for (CXFA_Node* pBreakNode = pContainerNode; pBreakNode;
+       pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    XFA_ATTRIBUTE eAttributeType = XFA_ATTRIBUTE_Before;
+    if (!bBreakBefore) {
+      eAttributeType = XFA_ATTRIBUTE_After;
+    }
+    switch (pBreakNode->GetClassID()) {
+      case XFA_ELEMENT_BreakBefore: {
+        if (bBreakBefore) {
+          pCurActionNode = pBreakNode;
+          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
+          bFindRs = TRUE;
+        }
+      } break;
+      case XFA_ELEMENT_BreakAfter: {
+        if (!bBreakBefore) {
+          pCurActionNode = pBreakNode;
+          nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
+          bFindRs = TRUE;
+        }
+      } break;
+      case XFA_ELEMENT_Break:
+        if (pBreakNode->GetEnum(eAttributeType) != XFA_ATTRIBUTEENUM_Auto) {
+          pCurActionNode = pBreakNode;
+          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
+          if (!bBreakBefore) {
+            nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
+          }
+          bFindRs = TRUE;
+          break;
+        }
+      default:
+        break;
+    }
+    if (bFindRs) {
+      break;
+    }
+  }
+  return bFindRs;
+}
+static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) {
+  IXFA_Notify* pNotify = pGenerateNode->GetDocument()->GetParser()->GetNotify();
+  IXFA_DocLayout* pDocLayout = pGenerateNode->GetDocument()->GetDocLayout();
+  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
+      pGenerateNode);
+  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+       pNode = sIterator.MoveToNext()) {
+    CXFA_ContentLayoutItem* pCurLayoutItem =
+        (CXFA_ContentLayoutItem*)pNode->GetUserData(XFA_LAYOUTITEMKEY);
+    CXFA_ContentLayoutItem* pNextLayoutItem = NULL;
+    while (pCurLayoutItem) {
+      pNextLayoutItem = pCurLayoutItem->m_pNext;
+      pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
+                             XFA_LAYOUTEVENT_ItemRemoving);
+      delete pCurLayoutItem;
+      pCurLayoutItem = pNextLayoutItem;
+    }
+  }
+  pGenerateNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pGenerateNode);
+}
+void CXFA_ItemLayoutProcessor::XFA_ItemLayoutProcessor_GotoNextContainerNode(
+    CXFA_Node*& pCurActionNode,
+    XFA_ItemLayoutProcessorStages& nCurStage,
+    CXFA_Node* pParentContainer,
+    FX_BOOL bUsePageBreak) {
+  CXFA_Node* pEntireContainer = pParentContainer;
+  CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE;
+  switch (nCurStage) {
+    case XFA_ItemLayoutProcessorStages_BreakBefore:
+    case XFA_ItemLayoutProcessorStages_BreakAfter: {
+      pChildContainer = pCurActionNode->GetNodeItem(XFA_NODEITEM_Parent);
+    } break;
+    case XFA_ItemLayoutProcessorStages_Keep:
+    case XFA_ItemLayoutProcessorStages_Container:
+      pChildContainer = pCurActionNode;
+      break;
+    default:
+      pChildContainer = XFA_LAYOUT_INVALIDNODE;
+      break;
+  }
+  switch (nCurStage) {
+    case XFA_ItemLayoutProcessorStages_Keep: {
+      CXFA_Node* pBreakAfterNode =
+          pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!m_bKeepBreakFinish &&
+          XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode,
+                                                nCurStage, FALSE)) {
+        return;
+      }
+      goto CheckNextChildContainer;
+    }
+    case XFA_ItemLayoutProcessorStages_None: {
+      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      case XFA_ItemLayoutProcessorStages_BookendLeader:
+        for (CXFA_Node* pBookendNode =
+                 pCurActionNode == XFA_LAYOUT_INVALIDNODE
+                     ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
+                     : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+             pBookendNode; pBookendNode = pBookendNode->GetNodeItem(
+                               XFA_NODEITEM_NextSibling)) {
+          switch (pBookendNode->GetClassID()) {
+            case XFA_ELEMENT_Bookend:
+            case XFA_ELEMENT_Break:
+              pCurActionNode = pBookendNode;
+              nCurStage = XFA_ItemLayoutProcessorStages_BookendLeader;
+              return;
+            default:
+              break;
+          }
+        }
+    }
+      {
+        pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+        case XFA_ItemLayoutProcessorStages_BreakBefore:
+          if (pCurActionNode != XFA_LAYOUT_INVALIDNODE) {
+            CXFA_Node* pBreakBeforeNode =
+                pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+            if (!m_bKeepBreakFinish &&
+                XFA_ItemLayoutProcessor_FindBreakNode(
+                    pBreakBeforeNode, pCurActionNode, nCurStage, TRUE)) {
+              return;
+            }
+            if (m_bIsProcessKeep) {
+              if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
+                                                 pChildContainer)) {
+                return;
+              }
+              goto CheckNextChildContainer;
+            }
+            pCurActionNode = pChildContainer;
+            nCurStage = XFA_ItemLayoutProcessorStages_Container;
+            return;
+          }
+          goto CheckNextChildContainer;
+      }
+    case XFA_ItemLayoutProcessorStages_Container: {
+      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      case XFA_ItemLayoutProcessorStages_BreakAfter: {
+        if (pCurActionNode == XFA_LAYOUT_INVALIDNODE) {
+          CXFA_Node* pBreakAfterNode =
+              pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
+          if (!m_bKeepBreakFinish &&
+              XFA_ItemLayoutProcessor_FindBreakNode(
+                  pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) {
+            return;
+          }
+        } else {
+          CXFA_Node* pBreakAfterNode =
+              pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+          if (XFA_ItemLayoutProcessor_FindBreakNode(
+                  pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) {
+            return;
+          }
+        }
+        goto CheckNextChildContainer;
+      }
+    }
+    CheckNextChildContainer : {
+      CXFA_Node* pNextChildContainer =
+          pChildContainer == XFA_LAYOUT_INVALIDNODE
+              ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild,
+                                              XFA_OBJECTTYPE_ContainerNode)
+              : pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling,
+                                             XFA_OBJECTTYPE_ContainerNode);
+      while (pNextChildContainer &&
+             pNextChildContainer->HasFlag(XFA_NODEFLAG_LayoutGeneratedNode)) {
+        CXFA_Node* pSaveNode = pNextChildContainer;
+        pNextChildContainer = pNextChildContainer->GetNodeItem(
+            XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode);
+        if (pSaveNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+          XFA_DeleteLayoutGeneratedNode(pSaveNode);
+        }
+      }
+      if (!pNextChildContainer) {
+        goto NoMoreChildContainer;
+      }
+      FX_BOOL bLastKeep = FALSE;
+      if (ProcessKeepNodesForCheckNext(pCurActionNode, nCurStage,
+                                       pNextChildContainer, bLastKeep)) {
+        return;
+      }
+      if (!m_bKeepBreakFinish && !bLastKeep &&
+          XFA_ItemLayoutProcessor_FindBreakNode(
+              pNextChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild),
+              pCurActionNode, nCurStage, TRUE)) {
+        return;
+      }
+      pCurActionNode = pNextChildContainer;
+      if (m_bIsProcessKeep) {
+        nCurStage = XFA_ItemLayoutProcessorStages_Keep;
+      } else {
+        nCurStage = XFA_ItemLayoutProcessorStages_Container;
+      }
+      return;
+    }
+    NoMoreChildContainer : {
+      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      case XFA_ItemLayoutProcessorStages_BookendTrailer:
+        for (CXFA_Node* pBookendNode =
+                 pCurActionNode == XFA_LAYOUT_INVALIDNODE
+                     ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
+                     : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+             pBookendNode; pBookendNode = pBookendNode->GetNodeItem(
+                               XFA_NODEITEM_NextSibling)) {
+          switch (pBookendNode->GetClassID()) {
+            case XFA_ELEMENT_Bookend:
+            case XFA_ELEMENT_Break:
+              pCurActionNode = pBookendNode;
+              nCurStage = XFA_ItemLayoutProcessorStages_BookendTrailer;
+              return;
+            default:
+              break;
+          }
+        }
+    }
+    default:
+      pCurActionNode = NULL;
+      nCurStage = XFA_ItemLayoutProcessorStages_Done;
+  }
+}
+FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext(
+    CXFA_Node*& pCurActionNode,
+    XFA_ItemLayoutProcessorStages& nCurStage,
+    CXFA_Node*& pNextContainer,
+    FX_BOOL& bLastKeepNode) {
+  const bool bCanSplit = pNextContainer->GetIntact() == XFA_ATTRIBUTEENUM_None;
+  FX_BOOL bNextKeep = FALSE;
+  if (XFA_ExistContainerKeep(pNextContainer, FALSE)) {
+    bNextKeep = TRUE;
+  }
+  if (bNextKeep && !bCanSplit) {
+    if (!m_bIsProcessKeep && !m_bKeepBreakFinish) {
+      m_pKeepHeadNode = pNextContainer;
+      m_bIsProcessKeep = TRUE;
+    }
+  } else {
+    if (m_bIsProcessKeep && m_pKeepHeadNode) {
+      m_pKeepTailNode = pNextContainer;
+      if (!m_bKeepBreakFinish &&
+          XFA_ItemLayoutProcessor_FindBreakNode(
+              pNextContainer->GetNodeItem(XFA_NODEITEM_FirstChild),
+              pCurActionNode, nCurStage, TRUE)) {
+        return TRUE;
+      } else {
+        pNextContainer = m_pKeepHeadNode;
+        m_bKeepBreakFinish = TRUE;
+        m_pKeepHeadNode = NULL;
+        m_pKeepTailNode = NULL;
+        m_bIsProcessKeep = FALSE;
+      }
+    } else {
+      if (m_bKeepBreakFinish) {
+        bLastKeepNode = TRUE;
+      }
+      m_bKeepBreakFinish = FALSE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore(
+    CXFA_Node*& pCurActionNode,
+    XFA_ItemLayoutProcessorStages& nCurStage,
+    CXFA_Node* pContainerNode) {
+  if (m_pKeepTailNode == pContainerNode) {
+    pCurActionNode = m_pKeepHeadNode;
+    m_bKeepBreakFinish = TRUE;
+    m_pKeepHeadNode = NULL;
+    m_pKeepTailNode = NULL;
+    m_bIsProcessKeep = FALSE;
+    nCurStage = XFA_ItemLayoutProcessorStages_Container;
+    return TRUE;
+  }
+  CXFA_Node* pBreakAfterNode =
+      pContainerNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode,
+                                            nCurStage, FALSE)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode) {
+  XFA_ATTRIBUTEENUM ePresence = pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+  return ePresence == XFA_ATTRIBUTEENUM_Visible ||
+         ePresence == XFA_ATTRIBUTEENUM_Invisible;
+}
+static inline void XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
+    CXFA_Node* pFormNode,
+    FX_FLOAT& fContainerWidth,
+    FX_FLOAT& fContainerHeight,
+    FX_BOOL& bContainerWidthAutoSize,
+    FX_BOOL& bContainerHeightAutoSize) {
+  fContainerWidth = 0;
+  fContainerHeight = 0;
+  bContainerWidthAutoSize = TRUE;
+  bContainerHeightAutoSize = TRUE;
+  XFA_ELEMENT eClassID = pFormNode->GetClassID();
+  CXFA_Measurement mTmpValue;
+  if (bContainerWidthAutoSize &&
+      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) &&
+      pFormNode->TryMeasure(XFA_ATTRIBUTE_W, mTmpValue, FALSE) &&
+      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt);
+    bContainerWidthAutoSize = FALSE;
+  }
+  if (bContainerHeightAutoSize &&
+      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) &&
+      pFormNode->TryMeasure(XFA_ATTRIBUTE_H, mTmpValue, FALSE) &&
+      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt);
+    bContainerHeightAutoSize = FALSE;
+  }
+  if (bContainerWidthAutoSize && eClassID == XFA_ELEMENT_Subform &&
+      pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxW, mTmpValue, FALSE) &&
+      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt);
+    bContainerWidthAutoSize = FALSE;
+  }
+  if (bContainerHeightAutoSize && eClassID == XFA_ELEMENT_Subform &&
+      pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxH, mTmpValue, FALSE) &&
+      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt);
+    bContainerHeightAutoSize = FALSE;
+  }
+}
+static inline void
+XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
+    CXFA_Node* pFormNode,
+    FX_BOOL bContainerWidthAutoSize,
+    FX_FLOAT fContentCalculatedWidth,
+    FX_FLOAT& fContainerWidth,
+    FX_BOOL bContainerHeightAutoSize,
+    FX_FLOAT fContentCalculatedHeight,
+    FX_FLOAT& fContainerHeight) {
+  CXFA_Node* pMarginNode = pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  CXFA_Measurement mTmpValue;
+  if (bContainerWidthAutoSize) {
+    fContainerWidth = fContentCalculatedWidth;
+    if (pMarginNode) {
+      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_LeftInset, mTmpValue, FALSE)) {
+        fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt);
+      }
+      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_RightInset, mTmpValue, FALSE)) {
+        fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt);
+      }
+    }
+  }
+  if (bContainerHeightAutoSize) {
+    fContainerHeight = fContentCalculatedHeight;
+    if (pMarginNode) {
+      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_TopInset, mTmpValue, FALSE)) {
+        fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt);
+      }
+      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_BottomInset, mTmpValue,
+                                  FALSE)) {
+        fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt);
+      }
+    }
+  }
+}
+void CXFA_ItemLayoutProcessor::CalculatePositionedContainerPos(
+    CXFA_Node* pNode,
+    FX_FLOAT fWidth,
+    FX_FLOAT fHeight,
+    FX_FLOAT& fAbsoluteX,
+    FX_FLOAT& fAbsoluteY) {
+  XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
+  int32_t nAnchorType = 0;
+  switch (eAnchorType) {
+    case XFA_ATTRIBUTEENUM_TopLeft:
+      nAnchorType = 0;
+      break;
+    case XFA_ATTRIBUTEENUM_TopCenter:
+      nAnchorType = 1;
+      break;
+    case XFA_ATTRIBUTEENUM_TopRight:
+      nAnchorType = 2;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleLeft:
+      nAnchorType = 3;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleCenter:
+      nAnchorType = 4;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleRight:
+      nAnchorType = 5;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomLeft:
+      nAnchorType = 6;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomCenter:
+      nAnchorType = 7;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomRight:
+      nAnchorType = 8;
+      break;
+    default:
+      break;
+  }
+  static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8},
+                                         {6, 3, 0, 7, 4, 1, 8, 5, 2},
+                                         {8, 7, 6, 5, 4, 3, 2, 1, 0},
+                                         {2, 5, 8, 1, 4, 7, 0, 3, 6}};
+
+  FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
+  FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
+  int32_t nRotate =
+      FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
+  nRotate = XFA_MapRotation(nRotate) / 90;
+  int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType];
+  fAbsoluteX = fAnchorX;
+  fAbsoluteY = fAnchorY;
+  switch (nAbsoluteAnchorType / 3) {
+    case 1:
+      fAbsoluteY -= fHeight / 2;
+      break;
+    case 2:
+      fAbsoluteY -= fHeight;
+      break;
+    default:
+      break;
+  }
+  switch (nAbsoluteAnchorType % 3) {
+    case 1:
+      fAbsoluteX -= fWidth / 2;
+      break;
+    case 2:
+      fAbsoluteX -= fWidth;
+      break;
+    default:
+      break;
+  }
+}
+FX_BOOL CXFA_ItemLayoutProcessor::IncrementRelayoutNode(
+    CXFA_LayoutProcessor* pLayoutProcessor,
+    CXFA_Node* pNode,
+    CXFA_Node* pParentNode) {
+  return FALSE;
+}
+void CXFA_ItemLayoutProcessor::DoLayoutPageArea(
+    CXFA_ContainerLayoutItem* pPageAreaLayoutItem) {
+  CXFA_Node* pFormNode = pPageAreaLayoutItem->m_pFormNode;
+  CXFA_Node* pCurChildNode = XFA_LAYOUT_INVALIDNODE;
+  XFA_ItemLayoutProcessorStages nCurChildNodeStage =
+      XFA_ItemLayoutProcessorStages_None;
+  CXFA_LayoutItem* pBeforeItem = NULL;
+  for (XFA_ItemLayoutProcessor_GotoNextContainerNode(
+           pCurChildNode, nCurChildNodeStage, pFormNode, FALSE);
+       pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
+           pCurChildNode, nCurChildNodeStage, pFormNode, FALSE)) {
+    if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
+      continue;
+    }
+    if (pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
+      continue;
+    }
+    CXFA_ItemLayoutProcessor* pProcessor =
+        new CXFA_ItemLayoutProcessor(pCurChildNode, NULL);
+    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
+    if (!pProcessor->HasLayoutItem()) {
+      delete pProcessor;
+      continue;
+    }
+    FX_FLOAT fWidth, fHeight;
+    pProcessor->GetCurrentComponentSize(fWidth, fHeight);
+    FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0;
+    CalculatePositionedContainerPos(pCurChildNode, fWidth, fHeight, fAbsoluteX,
+                                    fAbsoluteY);
+    pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY);
+    CXFA_LayoutItem* pProcessItem = pProcessor->ExtractLayoutItem();
+    if (pBeforeItem == NULL) {
+      pPageAreaLayoutItem->AddHeadChild(pProcessItem);
+    } else {
+      pPageAreaLayoutItem->InsertChild(pBeforeItem, pProcessItem);
+    }
+    pBeforeItem = pProcessItem;
+    delete pProcessor;
+  }
+  pBeforeItem = NULL;
+  CXFA_LayoutItem* pLayoutItem = pPageAreaLayoutItem->m_pFirstChild;
+  while (pLayoutItem) {
+    if (!pLayoutItem->IsContentLayoutItem() ||
+        pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_Draw) {
+      pLayoutItem = pLayoutItem->m_pNextSibling;
+      continue;
+    }
+    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_Draw) {
+      CXFA_LayoutItem* pNextLayoutItem = pLayoutItem->m_pNextSibling;
+      pPageAreaLayoutItem->RemoveChild(pLayoutItem);
+      if (pBeforeItem == NULL) {
+        pPageAreaLayoutItem->AddHeadChild(pLayoutItem);
+      } else {
+        pPageAreaLayoutItem->InsertChild(pBeforeItem, pLayoutItem);
+      }
+      pBeforeItem = pLayoutItem;
+      pLayoutItem = pNextLayoutItem;
+    }
+  }
+}
+void CXFA_ItemLayoutProcessor::DoLayoutPositionedContainer(
+    CXFA_LayoutContext* pContext) {
+  if (m_pLayoutItem)
+    return;
+
+  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+  FX_BOOL bIgnoreXY = (m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) !=
+                       XFA_ATTRIBUTEENUM_Position);
+  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
+  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
+  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
+      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
+      bContainerHeightAutoSize);
+  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
+  FX_FLOAT fHiddenContentCalculatedWidth = 0,
+           fHiddenContentCalculatedHeight = 0;
+  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
+    XFA_ItemLayoutProcessor_GotoNextContainerNode(
+        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE);
+  }
+  int32_t iColIndex = 0;
+  for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
+           m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) {
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
+      continue;
+    }
+    if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
+      continue;
+    }
+    CXFA_ItemLayoutProcessor* pProcessor =
+        new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
+    if (pContext && pContext->m_prgSpecifiedColumnWidths) {
+      int32_t iColSpan = m_pCurChildNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
+      if (iColSpan <=
+          pContext->m_prgSpecifiedColumnWidths->GetSize() - iColIndex) {
+        pContext->m_fCurColumnWidth = 0;
+        pContext->m_bCurColumnWidthAvaiable = TRUE;
+        if (iColSpan == -1)
+          iColSpan = pContext->m_prgSpecifiedColumnWidths->GetSize();
+        for (int32_t i = 0; iColIndex + i < iColSpan; ++i) {
+          pContext->m_fCurColumnWidth +=
+              pContext->m_prgSpecifiedColumnWidths->GetAt(iColIndex + i);
+        }
+        if (pContext->m_fCurColumnWidth == 0)
+          pContext->m_bCurColumnWidthAvaiable = FALSE;
+        iColIndex += iColSpan >= 0 ? iColSpan : 0;
+      }
+    }
+    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
+                         pContext);
+    if (!pProcessor->HasLayoutItem()) {
+      delete pProcessor;
+      continue;
+    }
+    FX_FLOAT fWidth, fHeight;
+    pProcessor->GetCurrentComponentSize(fWidth, fHeight);
+    FX_BOOL bChangeParentSize = FALSE;
+    if (XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) {
+      bChangeParentSize = TRUE;
+    }
+    FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0;
+    if (!bIgnoreXY) {
+      CalculatePositionedContainerPos(m_pCurChildNode, fWidth, fHeight,
+                                      fAbsoluteX, fAbsoluteY);
+    }
+    pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY);
+    if (bContainerWidthAutoSize) {
+      FX_FLOAT fChildSuppliedWidth = fAbsoluteX + fWidth;
+      if (bChangeParentSize) {
+        if (fContentCalculatedWidth < fChildSuppliedWidth) {
+          fContentCalculatedWidth = fChildSuppliedWidth;
+        }
+      } else {
+        if (fHiddenContentCalculatedWidth < fChildSuppliedWidth &&
+            m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) {
+          fHiddenContentCalculatedWidth = fChildSuppliedWidth;
+        }
+      }
+    }
+    if (bContainerHeightAutoSize) {
+      FX_FLOAT fChildSuppliedHeight = fAbsoluteY + fHeight;
+      if (bChangeParentSize) {
+        if (fContentCalculatedHeight < fChildSuppliedHeight) {
+          fContentCalculatedHeight = fChildSuppliedHeight;
+        }
+      } else {
+        if (fHiddenContentCalculatedHeight < fChildSuppliedHeight &&
+            m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) {
+          fHiddenContentCalculatedHeight = fChildSuppliedHeight;
+        }
+      }
+    }
+    m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem());
+    delete pProcessor;
+  }
+  XFA_VERSION eVersion = m_pFormNode->GetDocument()->GetCurVersionMode();
+  if (fContentCalculatedWidth == 0 && eVersion < XFA_VERSION_207) {
+    fContentCalculatedWidth = fHiddenContentCalculatedWidth;
+  }
+  if (fContentCalculatedHeight == 0 && eVersion < XFA_VERSION_207) {
+    fContentCalculatedHeight = fHiddenContentCalculatedHeight;
+  }
+  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
+      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
+      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
+      fContainerHeight);
+  SetCurrentComponentSize(fContainerWidth, fContainerHeight);
+}
+static inline void XFA_ItemLayoutProcessor_UpdateWidgetSize(
+    CXFA_ContentLayoutItem* pLayoutItem,
+    FX_FLOAT& fWidth,
+    FX_FLOAT& fHeight) {
+  CXFA_Node* pNode = pLayoutItem->m_pFormNode;
+  ASSERT(pNode);
+  XFA_ELEMENT eClassID = pNode->GetClassID();
+  switch (eClassID) {
+    case XFA_ELEMENT_Subform:
+    case XFA_ELEMENT_Area:
+    case XFA_ELEMENT_ExclGroup:
+    case XFA_ELEMENT_SubformSet: {
+      if (fWidth < -XFA_LAYOUT_FLOAT_PERCISION) {
+        fWidth = pLayoutItem->m_sSize.x;
+      }
+      if (fHeight < -XFA_LAYOUT_FLOAT_PERCISION) {
+        fHeight = pLayoutItem->m_sSize.y;
+      }
+      break;
+    }
+    case XFA_ELEMENT_Draw:
+    case XFA_ELEMENT_Field: {
+      pNode->GetDocument()->GetParser()->GetNotify()->StartFieldDrawLayout(
+          pNode, fWidth, fHeight);
+      break;
+    }
+    default:
+      ASSERT(FALSE);
+  }
+}
+static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells(
+    CXFA_ContentLayoutItem* pLayoutRow,
+    const CFX_ArrayTemplate<FX_FLOAT>& rgSpecifiedColumnWidths,
+    XFA_ATTRIBUTEENUM eLayout) {
+  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
+  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
+  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
+      pLayoutRow->m_pFormNode, fContainerWidth, fContainerHeight,
+      bContainerWidthAutoSize, bContainerHeightAutoSize);
+  CXFA_Node* pMarginNode =
+      pLayoutRow->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
+  if (pMarginNode) {
+    fLeftInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
+    fTopInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
+    fRightInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
+    fBottomInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
+  }
+  FX_FLOAT fContentWidthLimit =
+      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+                              : fContainerWidth - fLeftInset - fRightInset;
+  FX_FLOAT fContentCurrentHeight =
+      pLayoutRow->m_sSize.y - fTopInset - fBottomInset;
+  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
+  FX_FLOAT fCurrentColX = 0;
+  int32_t nCurrentColIdx = 0;
+  FX_BOOL bMetWholeRowCell = FALSE;
+  for (CXFA_ContentLayoutItem* pLayoutChild =
+           (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
+       pLayoutChild;
+       pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
+    int32_t nOriginalColSpan =
+        pLayoutChild->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
+    int32_t nColSpan = nOriginalColSpan;
+    FX_FLOAT fColSpanWidth = 0;
+    if (nColSpan == -1 ||
+        nCurrentColIdx + nColSpan > rgSpecifiedColumnWidths.GetSize()) {
+      nColSpan = rgSpecifiedColumnWidths.GetSize() - nCurrentColIdx;
+    }
+    for (int32_t i = 0; i < nColSpan; i++) {
+      fColSpanWidth += rgSpecifiedColumnWidths[nCurrentColIdx + i];
+    }
+    if (nColSpan != nOriginalColSpan) {
+      fColSpanWidth = bMetWholeRowCell ? 0 : std::max(fColSpanWidth,
+                                                      pLayoutChild->m_sSize.y);
+    }
+    if (nOriginalColSpan == -1) {
+      bMetWholeRowCell = TRUE;
+    }
+    pLayoutChild->m_sPos = CFX_PointF(fCurrentColX, 0);
+    pLayoutChild->m_sSize.x = fColSpanWidth;
+    if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
+      fCurrentColX += fColSpanWidth;
+      nCurrentColIdx += nColSpan;
+      FX_FLOAT fNewHeight =
+          bContainerHeightAutoSize ? -1 : fContentCurrentHeight;
+      XFA_ItemLayoutProcessor_UpdateWidgetSize(pLayoutChild, fColSpanWidth,
+                                               fNewHeight);
+      pLayoutChild->m_sSize.y = fNewHeight;
+      if (bContainerHeightAutoSize) {
+        FX_FLOAT fChildSuppliedHeight = pLayoutChild->m_sSize.y;
+        if (fContentCalculatedHeight < fChildSuppliedHeight) {
+          fContentCalculatedHeight = fChildSuppliedHeight;
+        }
+      }
+    }
+  }
+  if (bContainerHeightAutoSize) {
+    for (CXFA_ContentLayoutItem* pLayoutChild =
+             (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
+         pLayoutChild;
+         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
+      XFA_ItemLayoutProcessor_UpdateWidgetSize(
+          pLayoutChild, pLayoutChild->m_sSize.x, fContentCalculatedHeight);
+      FX_FLOAT fOldChildHeight = pLayoutChild->m_sSize.y;
+      pLayoutChild->m_sSize.y = fContentCalculatedHeight;
+      CXFA_Node* pParaNode =
+          pLayoutChild->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Para);
+      if (pParaNode && pLayoutChild->m_pFirstChild) {
+        FX_FLOAT fOffHeight = fContentCalculatedHeight - fOldChildHeight;
+        XFA_ATTRIBUTEENUM eVType = pParaNode->GetEnum(XFA_ATTRIBUTE_VAlign);
+        switch (eVType) {
+          case XFA_ATTRIBUTEENUM_Middle:
+            fOffHeight = fOffHeight / 2;
+            break;
+          case XFA_ATTRIBUTEENUM_Bottom:
+            break;
+          case XFA_ATTRIBUTEENUM_Top:
+          default:
+            fOffHeight = 0;
+            break;
+        }
+        if (fOffHeight > 0) {
+          for (CXFA_ContentLayoutItem* pInnerLayoutChild =
+                   (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild;
+               pInnerLayoutChild;
+               pInnerLayoutChild =
+                   (CXFA_ContentLayoutItem*)pInnerLayoutChild->m_pNextSibling) {
+            pInnerLayoutChild->m_sPos.y += fOffHeight;
+          }
+        }
+      }
+    }
+  }
+  if (bContainerWidthAutoSize) {
+    FX_FLOAT fChildSuppliedWidth = fCurrentColX;
+    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+        fContentWidthLimit > fChildSuppliedWidth) {
+      fChildSuppliedWidth = fContentWidthLimit;
+    }
+    if (fContentCalculatedWidth < fChildSuppliedWidth) {
+      fContentCalculatedWidth = fChildSuppliedWidth;
+    }
+  } else {
+    fContentCalculatedWidth = fContainerWidth - fLeftInset - fRightInset;
+  }
+  if (pLayoutRow->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) ==
+      XFA_ATTRIBUTEENUM_Rl_row) {
+    for (CXFA_ContentLayoutItem* pLayoutChild =
+             (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
+         pLayoutChild;
+         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
+      pLayoutChild->m_sPos.x = fContentCalculatedWidth -
+                               pLayoutChild->m_sPos.x - pLayoutChild->m_sSize.x;
+    }
+  }
+  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
+      pLayoutRow->m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
+      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
+      fContainerHeight);
+  pLayoutRow->m_sSize = CFX_SizeF(fContainerWidth, fContainerHeight);
+}
+void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
+  if (m_pLayoutItem)
+    return;
+
+  if (pLayoutNode == NULL) {
+    pLayoutNode = m_pFormNode;
+  }
+  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
+  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
+  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
+  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
+      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
+      bContainerHeightAutoSize);
+  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
+  CXFA_Node* pMarginNode =
+      m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  FX_FLOAT fLeftInset = 0;
+  FX_FLOAT fRightInset = 0;
+  if (pMarginNode) {
+    fLeftInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
+    fRightInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
+  }
+  FX_FLOAT fContentWidthLimit =
+      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+                              : fContainerWidth - fLeftInset - fRightInset;
+  CFX_WideStringC wsColumnWidths;
+  if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) {
+    CFX_WideStringArray widths;
+    if (FX_SeparateStringW(wsColumnWidths.GetPtr(), wsColumnWidths.GetLength(),
+                           L' ', widths) > 0) {
+      int32_t iCols = widths.GetSize();
+      CFX_WideString wsWidth;
+      for (int32_t i = 0; i < iCols; i++) {
+        wsWidth = widths[i];
+        wsWidth.TrimLeft(L' ');
+        if (!wsWidth.IsEmpty()) {
+          CXFA_Measurement measure(wsWidth);
+          m_rgSpecifiedColumnWidths.Add(measure.ToUnit(XFA_UNIT_Pt));
+        }
+      }
+    }
+  }
+  int32_t iSpecifiedColumnCount = m_rgSpecifiedColumnWidths.GetSize();
+  CXFA_LayoutContext layoutContext;
+  layoutContext.m_prgSpecifiedColumnWidths = &m_rgSpecifiedColumnWidths;
+  CXFA_LayoutContext* pLayoutContext =
+      iSpecifiedColumnCount > 0 ? &layoutContext : NULL;
+  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
+    XFA_ItemLayoutProcessor_GotoNextContainerNode(
+        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE);
+  }
+  for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
+           m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) {
+    layoutContext.m_bCurColumnWidthAvaiable = FALSE;
+    layoutContext.m_fCurColumnWidth = 0;
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
+      continue;
+    }
+    CXFA_ItemLayoutProcessor* pProcessor =
+        new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
+    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
+                         pLayoutContext);
+    if (!pProcessor->HasLayoutItem()) {
+      delete pProcessor;
+      continue;
+    }
+    m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem());
+    delete pProcessor;
+  }
+  int32_t iRowCount = 0, iColCount = 0;
+  {
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgRowItems;
+    CFX_ArrayTemplate<int32_t> rgRowItemsSpan;
+    CFX_ArrayTemplate<FX_FLOAT> rgRowItemsWidth;
+    for (CXFA_ContentLayoutItem* pLayoutChild =
+             (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
+         pLayoutChild;
+         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
+      if (pLayoutChild->m_pFormNode->GetClassID() != XFA_ELEMENT_Subform) {
+        continue;
+      }
+      if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
+        continue;
+      }
+      XFA_ATTRIBUTEENUM eLayout =
+          pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+      if (eLayout != XFA_ATTRIBUTEENUM_Row &&
+          eLayout != XFA_ATTRIBUTEENUM_Rl_row) {
+        continue;
+      }
+      if (CXFA_ContentLayoutItem* pRowLayoutCell =
+              (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild) {
+        rgRowItems.Add(pRowLayoutCell);
+        int32_t iColSpan =
+            pRowLayoutCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
+        rgRowItemsSpan.Add(iColSpan);
+        rgRowItemsWidth.Add(pRowLayoutCell->m_sSize.x);
+      }
+    }
+    iRowCount = rgRowItems.GetSize();
+    iColCount = 0;
+    FX_BOOL bMoreColumns = TRUE;
+    while (bMoreColumns) {
+      bMoreColumns = FALSE;
+      FX_BOOL bAutoCol = FALSE;
+      for (int32_t i = 0; i < iRowCount; i++) {
+        while (rgRowItems[i] && (rgRowItemsSpan[i] <= 0 ||
+                                 !XFA_ItemLayoutProcessor_IsTakingSpace(
+                                     rgRowItems[i]->m_pFormNode))) {
+          CXFA_ContentLayoutItem* pNewCell =
+              (CXFA_ContentLayoutItem*)rgRowItems[i]->m_pNextSibling;
+          if (rgRowItemsSpan[i] < 0 && XFA_ItemLayoutProcessor_IsTakingSpace(
+                                           rgRowItems[i]->m_pFormNode)) {
+            pNewCell = NULL;
+          }
+          rgRowItems[i] = pNewCell;
+          rgRowItemsSpan[i] =
+              pNewCell
+                  ? pNewCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan)
+                  : 0;
+          rgRowItemsWidth[i] = pNewCell ? pNewCell->m_sSize.x : 0;
+        }
+        CXFA_ContentLayoutItem* pCell = rgRowItems[i];
+        if (!pCell) {
+          continue;
+        }
+        bMoreColumns = TRUE;
+        if (rgRowItemsSpan[i] == 1) {
+          if (iColCount >= iSpecifiedColumnCount) {
+            for (int32_t j = 0, c = iColCount + 1 -
+                                    m_rgSpecifiedColumnWidths.GetSize();
+                 j < c; j++) {
+              m_rgSpecifiedColumnWidths.Add(0);
+            }
+          }
+          if (m_rgSpecifiedColumnWidths[iColCount] <
+              XFA_LAYOUT_FLOAT_PERCISION) {
+            bAutoCol = TRUE;
+          }
+          if (bAutoCol &&
+              m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) {
+            m_rgSpecifiedColumnWidths[iColCount] = rgRowItemsWidth[i];
+          }
+        }
+      }
+      if (bMoreColumns) {
+        FX_FLOAT fFinalColumnWidth = 0.0f;
+        if (iColCount < m_rgSpecifiedColumnWidths.GetSize())
+          fFinalColumnWidth = m_rgSpecifiedColumnWidths[iColCount];
+        for (int32_t i = 0; i < iRowCount; ++i) {
+          if (!rgRowItems[i])
+            continue;
+          --rgRowItemsSpan[i];
+          rgRowItemsWidth[i] -= fFinalColumnWidth;
+        }
+        ++iColCount;
+      }
+    }
+  }
+  FX_FLOAT fCurrentRowY = 0;
+  for (CXFA_ContentLayoutItem* pLayoutChild =
+           (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
+       pLayoutChild;
+       pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
+    if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
+      continue;
+    }
+    if (pLayoutChild->m_pFormNode->GetClassID() == XFA_ELEMENT_Subform) {
+      XFA_ATTRIBUTEENUM eSubformLayout =
+          pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+      if (eSubformLayout == XFA_ATTRIBUTEENUM_Row ||
+          eSubformLayout == XFA_ATTRIBUTEENUM_Rl_row) {
+        XFA_ItemLayoutProcessor_RelocateTableRowCells(
+            pLayoutChild, m_rgSpecifiedColumnWidths, eSubformLayout);
+      }
+    }
+    pLayoutChild->m_sPos.y = fCurrentRowY;
+    if (bContainerWidthAutoSize) {
+      pLayoutChild->m_sPos.x = 0;
+    } else {
+      switch (pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
+        case XFA_ATTRIBUTEENUM_Left:
+        default:
+          pLayoutChild->m_sPos.x = 0;
+          break;
+        case XFA_ATTRIBUTEENUM_Center:
+          pLayoutChild->m_sPos.x =
+              (fContentWidthLimit - pLayoutChild->m_sSize.x) / 2;
+          break;
+        case XFA_ATTRIBUTEENUM_Right:
+          pLayoutChild->m_sPos.x = fContentWidthLimit - pLayoutChild->m_sSize.x;
+          break;
+      }
+    }
+    if (bContainerWidthAutoSize) {
+      FX_FLOAT fChildSuppliedWidth =
+          pLayoutChild->m_sPos.x + pLayoutChild->m_sSize.x;
+      if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+          fContentWidthLimit > fChildSuppliedWidth) {
+        fChildSuppliedWidth = fContentWidthLimit;
+      }
+      if (fContentCalculatedWidth < fChildSuppliedWidth) {
+        fContentCalculatedWidth = fChildSuppliedWidth;
+      }
+    }
+    fCurrentRowY += pLayoutChild->m_sSize.y;
+  }
+  if (bContainerHeightAutoSize) {
+    FX_FLOAT fChildSuppliedHeight = fCurrentRowY;
+    if (fContentCalculatedHeight < fChildSuppliedHeight) {
+      fContentCalculatedHeight = fChildSuppliedHeight;
+    }
+  }
+  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
+      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
+      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
+      fContainerHeight);
+  SetCurrentComponentSize(fContainerWidth, fContainerHeight);
+}
+static uint8_t XFA_ItemLayoutProcessor_HAlignEnumToInt(
+    XFA_ATTRIBUTEENUM eHAlign) {
+  switch (eHAlign) {
+    case XFA_ATTRIBUTEENUM_Center:
+      return 1;
+    case XFA_ATTRIBUTEENUM_Right:
+      return 2;
+    case XFA_ATTRIBUTEENUM_Left:
+    default:
+      return 0;
+  }
+}
+static void XFA_ItemLayoutProcessor_UpdatePendedItemLayout(
+    CXFA_ItemLayoutProcessor* pProcessor,
+    CXFA_ContentLayoutItem* pLayoutItem) {
+  XFA_ATTRIBUTEENUM eLayout =
+      pLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+  switch (eLayout) {
+    case XFA_ATTRIBUTEENUM_Row:
+    case XFA_ATTRIBUTEENUM_Rl_row:
+      XFA_ItemLayoutProcessor_RelocateTableRowCells(
+          pLayoutItem, pProcessor->m_rgSpecifiedColumnWidths, eLayout);
+      break;
+    default:
+      break;
+  }
+}
+FX_BOOL CXFA_ItemLayoutProcessor::IsAddNewRowForTrailer(
+    CXFA_ContentLayoutItem* pTrailerItem) {
+  if (!pTrailerItem) {
+    return FALSE;
+  }
+  FX_FLOAT fWidth = pTrailerItem->m_sSize.x;
+  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+  if (eLayout != XFA_ATTRIBUTEENUM_Tb && m_fWidthLimite > fWidth) {
+    return FALSE;
+  }
+  return TRUE;
+}
+static void XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
+    CXFA_ItemLayoutProcessor* pProcessor,
+    FX_FLOAT fSplitPos,
+    CXFA_ContentLayoutItem* pTrailerLayoutItem,
+    FX_BOOL bUseInherited = FALSE) {
+  if (!pTrailerLayoutItem) {
+    return;
+  }
+  FX_FLOAT fHeight = pTrailerLayoutItem->m_sSize.y;
+  if (bUseInherited) {
+    FX_FLOAT fNewSplitPos = 0;
+    if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) {
+      fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight);
+    }
+    if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+      pProcessor->SplitLayoutItem(fNewSplitPos);
+    }
+    return;
+  }
+  XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor,
+                                                 pTrailerLayoutItem);
+  CXFA_Node* pMarginNode =
+      pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
+  if (pMarginNode) {
+    fLeftInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
+    fTopInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
+    fRightInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
+    fBottomInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
+  }
+  if (!pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem)) {
+    pTrailerLayoutItem->m_sPos.y = pProcessor->m_fLastRowY;
+    pTrailerLayoutItem->m_sPos.x = pProcessor->m_fLastRowWidth;
+    pProcessor->m_pLayoutItem->m_sSize.x += pTrailerLayoutItem->m_sSize.x;
+    pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem);
+    return;
+  }
+  FX_FLOAT fNewSplitPos = 0;
+  if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) {
+    fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight);
+  }
+  if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+    pProcessor->SplitLayoutItem(fNewSplitPos);
+    pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset;
+  } else {
+    pTrailerLayoutItem->m_sPos.y = fSplitPos - fTopInset - fBottomInset;
+  }
+  switch (pTrailerLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
+    case XFA_ATTRIBUTEENUM_Left:
+    default:
+      pTrailerLayoutItem->m_sPos.x = fLeftInset;
+      break;
+    case XFA_ATTRIBUTEENUM_Right:
+      pTrailerLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x -
+                                     fRightInset -
+                                     pTrailerLayoutItem->m_sSize.x;
+      break;
+    case XFA_ATTRIBUTEENUM_Center:
+      pTrailerLayoutItem->m_sPos.x =
+          (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset -
+           pTrailerLayoutItem->m_sSize.x) /
+          2;
+      break;
+  }
+  pProcessor->m_pLayoutItem->m_sSize.y += fHeight;
+  pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem);
+}
+static void XFA_ItemLayoutProcessor_AddLeaderAfterSplit(
+    CXFA_ItemLayoutProcessor* pProcessor,
+    CXFA_ContentLayoutItem* pLeaderLayoutItem) {
+  XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, pLeaderLayoutItem);
+  CXFA_Node* pMarginNode =
+      pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  FX_FLOAT fLeftInset = 0;
+  FX_FLOAT fRightInset = 0;
+  if (pMarginNode) {
+    fLeftInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
+    fRightInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
+  }
+  FX_FLOAT fHeight = pLeaderLayoutItem->m_sSize.y;
+  for (CXFA_ContentLayoutItem* pChildItem =
+           (CXFA_ContentLayoutItem*)pProcessor->m_pLayoutItem->m_pFirstChild;
+       pChildItem;
+       pChildItem = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) {
+    pChildItem->m_sPos.y += fHeight;
+  }
+  pLeaderLayoutItem->m_sPos.y = 0;
+  switch (pLeaderLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
+    case XFA_ATTRIBUTEENUM_Left:
+    default:
+      pLeaderLayoutItem->m_sPos.x = fLeftInset;
+      break;
+    case XFA_ATTRIBUTEENUM_Right:
+      pLeaderLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x -
+                                    fRightInset - pLeaderLayoutItem->m_sSize.x;
+      break;
+    case XFA_ATTRIBUTEENUM_Center:
+      pLeaderLayoutItem->m_sPos.x =
+          (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset -
+           pLeaderLayoutItem->m_sSize.x) /
+          2;
+      break;
+  }
+  pProcessor->m_pLayoutItem->m_sSize.y += fHeight;
+  pProcessor->m_pLayoutItem->AddChild(pLeaderLayoutItem);
+}
+static void XFA_ItemLayoutProcessor_AddPendingNode(
+    CXFA_ItemLayoutProcessor* pProcessor,
+    CXFA_Node* pPendingNode,
+    FX_BOOL bBreakPending) {
+  pProcessor->m_PendingNodes.push_back(pPendingNode);
+  pProcessor->m_bBreakPending = bBreakPending;
+}
+static FX_FLOAT XFA_ItemLayoutProcessor_InsertPendingItems(
+    CXFA_ItemLayoutProcessor* pProcessor,
+    CXFA_Node* pCurChildNode) {
+  FX_FLOAT fTotalHeight = 0;
+  if (pProcessor->m_PendingNodes.empty()) {
+    return fTotalHeight;
+  }
+  if (!pProcessor->m_pLayoutItem) {
+    pProcessor->m_pLayoutItem =
+        pProcessor->CreateContentLayoutItem(pCurChildNode);
+    pProcessor->m_pLayoutItem->m_sSize.clear();
+  }
+  while (!pProcessor->m_PendingNodes.empty()) {
+    std::unique_ptr<CXFA_ItemLayoutProcessor> pPendingProcessor(
+        new CXFA_ItemLayoutProcessor(pProcessor->m_PendingNodes.front(),
+                                     nullptr));
+    pProcessor->m_PendingNodes.pop_front();
+    pPendingProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
+    CXFA_ContentLayoutItem* pPendingLayoutItem =
+        pPendingProcessor->HasLayoutItem()
+            ? pPendingProcessor->ExtractLayoutItem()
+            : nullptr;
+    if (pPendingLayoutItem) {
+      XFA_ItemLayoutProcessor_AddLeaderAfterSplit(pProcessor,
+                                                  pPendingLayoutItem);
+      if (pProcessor->m_bBreakPending) {
+        fTotalHeight += pPendingLayoutItem->m_sSize.y;
+      }
+    }
+  }
+  return fTotalHeight;
+}
+FX_FLOAT CXFA_ItemLayoutProcessor::InsertKeepLayoutItems() {
+  FX_FLOAT fTotalHeight = 0;
+  if (m_arrayKeepItems.GetSize()) {
+    if (!m_pLayoutItem) {
+      m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+      m_pLayoutItem->m_sSize.clear();
+    }
+    for (int32_t iIndex = m_arrayKeepItems.GetSize() - 1; iIndex >= 0;
+         iIndex--) {
+      XFA_ItemLayoutProcessor_AddLeaderAfterSplit(this,
+                                                  m_arrayKeepItems[iIndex]);
+      fTotalHeight += m_arrayKeepItems[iIndex]->m_sSize.y;
+    }
+    m_arrayKeepItems.RemoveAll();
+  }
+  return fTotalHeight;
+}
+FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepForSplite(
+    CXFA_ItemLayoutProcessor* pParentProcessor,
+    CXFA_ItemLayoutProcessor* pChildProcessor,
+    XFA_ItemLayoutProcessorResult eRetValue,
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& rgCurLineLayoutItem,
+    FX_FLOAT& fContentCurRowAvailWidth,
+    FX_FLOAT& fContentCurRowHeight,
+    FX_FLOAT& fContentCurRowY,
+    FX_BOOL& bAddedItemInRow,
+    FX_BOOL& bForceEndPage,
+    XFA_ItemLayoutProcessorResult& result) {
+  if (pParentProcessor == NULL || pChildProcessor == NULL) {
+    return FALSE;
+  }
+  if (pParentProcessor->m_pCurChildNode->GetIntact() !=
+          XFA_ATTRIBUTEENUM_None ||
+      !pChildProcessor->m_bHasAvailHeight) {
+    if (XFA_ExistContainerKeep(pParentProcessor->m_pCurChildNode, TRUE)) {
+      FX_FLOAT fChildWidth, fChildHeight;
+      pChildProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
+      CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems;
+      if (pParentProcessor->JudgePutNextPage(pParentProcessor->m_pLayoutItem,
+                                             fChildHeight, keepLayoutItems)) {
+        m_arrayKeepItems.RemoveAll();
+        for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize(); iIndex++) {
+          CXFA_ContentLayoutItem* pItem = keepLayoutItems.GetAt(iIndex);
+          pParentProcessor->m_pLayoutItem->RemoveChild(pItem);
+          fContentCurRowY -= pItem->m_sSize.y;
+          m_arrayKeepItems.Add(pItem);
+        }
+        bAddedItemInRow = TRUE;
+        bForceEndPage = TRUE;
+        result = XFA_ItemLayoutProcessorResult_PageFullBreak;
+        return TRUE;
+      }
+      rgCurLineLayoutItem.Add(pChildProcessor->ExtractLayoutItem());
+      bAddedItemInRow = TRUE;
+      fContentCurRowAvailWidth -= fChildWidth;
+      if (fContentCurRowHeight < fChildHeight) {
+        fContentCurRowHeight = fChildHeight;
+      }
+      result = eRetValue;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_ItemLayoutProcessor::JudgePutNextPage(
+    CXFA_ContentLayoutItem* pParentLayoutItem,
+    FX_FLOAT fChildHeight,
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems) {
+  if (pParentLayoutItem == NULL) {
+    return FALSE;
+  }
+  FX_FLOAT fItemsHeight = 0;
+  for (CXFA_ContentLayoutItem* pChildLayoutItem =
+           (CXFA_ContentLayoutItem*)pParentLayoutItem->m_pFirstChild;
+       pChildLayoutItem;
+       pChildLayoutItem =
+           (CXFA_ContentLayoutItem*)pChildLayoutItem->m_pNextSibling) {
+    if (XFA_ExistContainerKeep(pChildLayoutItem->m_pFormNode, FALSE)) {
+      pKeepItems.Add(pChildLayoutItem);
+      fItemsHeight += pChildLayoutItem->m_sSize.y;
+    } else {
+      pKeepItems.RemoveAll();
+      fItemsHeight = 0;
+    }
+  }
+  fItemsHeight += fChildHeight;
+  if (m_pPageMgr->GetNextAvailContentHeight(fItemsHeight)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) {
+  if (!pFormNode) {
+    return;
+  }
+  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
+      pFormNode);
+  for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode;
+       pNode = sIterator.MoveToNext()) {
+    if (pNode->IsContainerNode()) {
+      CXFA_Node* pBindNode = pNode->GetBindData();
+      if (pBindNode) {
+        pBindNode->RemoveBindItem(pNode);
+        pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+      }
+    }
+    pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
+  }
+}
+void CXFA_ItemLayoutProcessor::ProcessUnUseOverFlow(
+    CXFA_Node* pLeaderNode,
+    CXFA_Node* pTrailerNode,
+    CXFA_ContentLayoutItem* pTrailerItem,
+    CXFA_Node* pFormNode) {
+  ProcessUnUseBinds(pLeaderNode);
+  ProcessUnUseBinds(pTrailerNode);
+  if (pFormNode == NULL) {
+    return;
+  }
+  if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
+      pFormNode->GetClassID() == XFA_ELEMENT_Break) {
+    pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+  if (pLeaderNode && pFormNode) {
+    pFormNode->RemoveChild(pLeaderNode);
+  }
+  if (pTrailerNode && pFormNode) {
+    pFormNode->RemoveChild(pTrailerNode);
+  }
+  if (pTrailerItem) {
+    XFA_ReleaseLayoutItem(pTrailerItem);
+  }
+}
+static XFA_ItemLayoutProcessorResult XFA_ItemLayoutProcessor_InsertFlowedItem(
+    CXFA_ItemLayoutProcessor* pThis,
+    CXFA_ItemLayoutProcessor*& pProcessor,
+    FX_BOOL bContainerWidthAutoSize,
+    FX_BOOL bContainerHeightAutoSize,
+    FX_FLOAT fContainerHeight,
+    XFA_ATTRIBUTEENUM eFlowStrategy,
+    uint8_t& uCurHAlignState,
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
+    FX_BOOL bUseBreakControl,
+    FX_FLOAT fAvailHeight,
+    FX_FLOAT fRealHeight,
+    FX_FLOAT& fContentCurRowY,
+    FX_FLOAT& fContentWidthLimit,
+    FX_FLOAT& fContentCurRowAvailWidth,
+    FX_FLOAT& fContentCurRowHeight,
+    FX_BOOL& bAddedItemInRow,
+    FX_BOOL& bForceEndPage,
+    CXFA_LayoutContext* pLayoutContext = NULL,
+    FX_BOOL bNewRow = FALSE) {
+  FX_BOOL bTakeSpace =
+      XFA_ItemLayoutProcessor_IsTakingSpace(pProcessor->m_pFormNode);
+  uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(
+      pThis->m_pCurChildNode->GetEnum(XFA_ATTRIBUTE_HAlign));
+  if (bContainerWidthAutoSize) {
+    uHAlign = 0;
+  }
+  if ((eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb && uHAlign < uCurHAlignState) ||
+      (eFlowStrategy == XFA_ATTRIBUTEENUM_Rl_tb && uHAlign > uCurHAlignState)) {
+    return XFA_ItemLayoutProcessorResult_RowFullBreak;
+  }
+  uCurHAlignState = uHAlign;
+  FX_BOOL bIsOwnSplite =
+      pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None;
+  FX_BOOL bUseRealHeight =
+      bTakeSpace && bContainerHeightAutoSize && bIsOwnSplite &&
+      pProcessor->m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetIntact() ==
+          XFA_ATTRIBUTEENUM_None;
+  FX_BOOL bIsTransHeight = bTakeSpace;
+  if (bIsTransHeight && !bIsOwnSplite) {
+    FX_BOOL bRootForceTb = FALSE;
+    XFA_ATTRIBUTEENUM eLayoutStrategy = XFA_ItemLayoutProcessor_GetLayout(
+        pProcessor->m_pFormNode, bRootForceTb);
+    if (eLayoutStrategy == XFA_ATTRIBUTEENUM_Lr_tb ||
+        eLayoutStrategy == XFA_ATTRIBUTEENUM_Rl_tb) {
+      bIsTransHeight = FALSE;
+    }
+  }
+  FX_BOOL bUseInherited = FALSE;
+  CXFA_LayoutContext layoutContext;
+  if (pThis->m_pPageMgr) {
+    CXFA_Node* pOverflowNode =
+        pThis->m_pPageMgr->QueryOverflow(pThis->m_pFormNode);
+    if (pOverflowNode) {
+      layoutContext.m_pOverflowNode = pOverflowNode;
+      layoutContext.m_pOverflowProcessor = pThis;
+      pLayoutContext = &layoutContext;
+    }
+  }
+  XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult_Done;
+  if (!bNewRow ||
+      pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult_Done) {
+    eRetValue = pProcessor->DoLayout(
+        bTakeSpace ? bUseBreakControl : FALSE,
+        bUseRealHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
+        bIsTransHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
+        pLayoutContext);
+    pProcessor->m_ePreProcessRs = eRetValue;
+  } else {
+    eRetValue = pProcessor->m_ePreProcessRs;
+    pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done;
+  }
+  if (pProcessor->HasLayoutItem() == FALSE) {
+    return eRetValue;
+  }
+  FX_FLOAT fChildWidth, fChildHeight;
+  pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
+  if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) {
+    fRealHeight = XFA_LAYOUT_FLOAT_MAX;
+    fAvailHeight = XFA_LAYOUT_FLOAT_MAX;
+  }
+  if (!bTakeSpace ||
+      (fChildWidth <= fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) ||
+      (fContentWidthLimit - fContentCurRowAvailWidth <=
+       XFA_LAYOUT_FLOAT_PERCISION)) {
+    CXFA_Node *pOverflowLeaderNode = NULL, *pOverflowTrailerNode = NULL,
+              *pFormNode = NULL;
+    CXFA_ContentLayoutItem* pTrailerLayoutItem = NULL;
+    FX_BOOL bIsAddTrailerHeight = FALSE;
+    if (pThis->m_pPageMgr &&
+        pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
+      pFormNode = pThis->m_pPageMgr->QueryOverflow(pProcessor->m_pFormNode);
+      if (pFormNode == NULL && pLayoutContext &&
+          pLayoutContext->m_pOverflowProcessor) {
+        pFormNode = pLayoutContext->m_pOverflowNode;
+        bUseInherited = TRUE;
+      }
+      if (pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
+                                             pOverflowTrailerNode, FALSE,
+                                             FALSE)) {
+        if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowTrailerNode)) {
+          if (pOverflowTrailerNode) {
+            CXFA_ItemLayoutProcessor* pOverflowLeaderProcessor =
+                new CXFA_ItemLayoutProcessor(pOverflowTrailerNode, NULL);
+            pOverflowLeaderProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
+            pTrailerLayoutItem =
+                pOverflowLeaderProcessor->HasLayoutItem()
+                    ? pOverflowLeaderProcessor->ExtractLayoutItem()
+                    : NULL;
+            delete pOverflowLeaderProcessor;
+          }
+          if (bUseInherited) {
+            bIsAddTrailerHeight =
+                pThis->IsAddNewRowForTrailer(pTrailerLayoutItem);
+          } else {
+            bIsAddTrailerHeight =
+                pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem);
+          }
+          if (bIsAddTrailerHeight) {
+            FX_FLOAT fTrailerHeight = pTrailerLayoutItem->m_sSize.y;
+            fChildHeight += fTrailerHeight;
+            bIsAddTrailerHeight = TRUE;
+          }
+        }
+      }
+    }
+    if (!bTakeSpace ||
+        fContentCurRowY + fChildHeight <=
+            fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION ||
+        (!bContainerHeightAutoSize &&
+         pThis->m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >=
+             fContainerHeight)) {
+      if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+        if (pProcessor->m_bUseInheriated) {
+          if (pTrailerLayoutItem) {
+            XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
+                pProcessor, fChildHeight, pTrailerLayoutItem);
+          }
+          if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
+            XFA_ItemLayoutProcessor_AddPendingNode(pProcessor,
+                                                   pOverflowLeaderNode, FALSE);
+          }
+          pProcessor->m_bUseInheriated = FALSE;
+        } else {
+          if (bIsAddTrailerHeight) {
+            fChildHeight -= pTrailerLayoutItem->m_sSize.y;
+          }
+          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                           pOverflowTrailerNode,
+                                           pTrailerLayoutItem, pFormNode);
+        }
+        CXFA_ContentLayoutItem* pChildLayoutItem =
+            pProcessor->ExtractLayoutItem();
+        if (XFA_ExistContainerKeep(pProcessor->m_pFormNode, FALSE) &&
+            pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
+          pThis->m_arrayKeepItems.Add(pChildLayoutItem);
+        } else {
+          pThis->m_arrayKeepItems.RemoveAll();
+        }
+        rgCurLineLayoutItems[uHAlign].Add(pChildLayoutItem);
+        bAddedItemInRow = TRUE;
+        if (bTakeSpace) {
+          fContentCurRowAvailWidth -= fChildWidth;
+          if (fContentCurRowHeight < fChildHeight) {
+            fContentCurRowHeight = fChildHeight;
+          }
+        }
+        return XFA_ItemLayoutProcessorResult_Done;
+      } else {
+        if (eRetValue == XFA_ItemLayoutProcessorResult_PageFullBreak) {
+          if (pProcessor->m_bUseInheriated) {
+            if (pTrailerLayoutItem) {
+              XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
+                  pProcessor, fChildHeight, pTrailerLayoutItem);
+            }
+            if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
+              XFA_ItemLayoutProcessor_AddPendingNode(
+                  pProcessor, pOverflowLeaderNode, FALSE);
+            }
+            pProcessor->m_bUseInheriated = FALSE;
+          } else {
+            if (bIsAddTrailerHeight) {
+              fChildHeight -= pTrailerLayoutItem->m_sSize.y;
+            }
+            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                             pOverflowTrailerNode,
+                                             pTrailerLayoutItem, pFormNode);
+          }
+        }
+        rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
+        bAddedItemInRow = TRUE;
+        fContentCurRowAvailWidth -= fChildWidth;
+        if (fContentCurRowHeight < fChildHeight) {
+          fContentCurRowHeight = fChildHeight;
+        }
+        return eRetValue;
+      }
+    } else {
+      XFA_ItemLayoutProcessorResult eResult;
+      if (pThis->ProcessKeepForSplite(
+              pThis, pProcessor, eRetValue, rgCurLineLayoutItems[uHAlign],
+              fContentCurRowAvailWidth, fContentCurRowHeight, fContentCurRowY,
+              bAddedItemInRow, bForceEndPage, eResult)) {
+        return eResult;
+      }
+      bForceEndPage = TRUE;
+      FX_FLOAT fSplitPos =
+          pProcessor->FindSplitPos(fAvailHeight - fContentCurRowY);
+      if (fSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+        XFA_ATTRIBUTEENUM eLayout =
+            pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+        if (eLayout == XFA_ATTRIBUTEENUM_Tb &&
+            eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                           pOverflowTrailerNode,
+                                           pTrailerLayoutItem, pFormNode);
+          rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
+          bAddedItemInRow = TRUE;
+          if (bTakeSpace) {
+            fContentCurRowAvailWidth -= fChildWidth;
+            if (fContentCurRowHeight < fChildHeight) {
+              fContentCurRowHeight = fChildHeight;
+            }
+          }
+          return XFA_ItemLayoutProcessorResult_PageFullBreak;
+        }
+        CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL;
+        if (pThis->m_pPageMgr && !pProcessor->m_bUseInheriated &&
+            eRetValue != XFA_ItemLayoutProcessorResult_PageFullBreak) {
+          pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode,
+                                             pTempTrailerNode, FALSE, TRUE);
+        }
+        if (pTrailerLayoutItem && bIsAddTrailerHeight) {
+          XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
+              pProcessor, fSplitPos, pTrailerLayoutItem, bUseInherited);
+        } else {
+          pProcessor->SplitLayoutItem(fSplitPos);
+        }
+        if (bUseInherited) {
+          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                           pOverflowTrailerNode,
+                                           pTrailerLayoutItem, pFormNode);
+          pThis->m_bUseInheriated = TRUE;
+        } else {
+          if (pProcessor->m_pLayoutItem->m_pFirstChild &&
+              pProcessor->m_pLayoutItem->m_pFirstChild->m_pNextSibling ==
+                  NULL &&
+              pProcessor->m_pLayoutItem->m_pFirstChild->m_pFormNode->HasFlag(
+                  XFA_NODEFLAG_LayoutGeneratedNode)) {
+            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                             pOverflowTrailerNode,
+                                             pTrailerLayoutItem, pFormNode);
+          } else {
+            if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
+              XFA_ItemLayoutProcessor_AddPendingNode(
+                  pProcessor, pOverflowLeaderNode, FALSE);
+            }
+          }
+        }
+        if (pProcessor->m_pLayoutItem->m_pNextSibling) {
+          pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
+          rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
+          bAddedItemInRow = TRUE;
+          if (bTakeSpace) {
+            fContentCurRowAvailWidth -= fChildWidth;
+            if (fContentCurRowHeight < fChildHeight) {
+              fContentCurRowHeight = fChildHeight;
+            }
+          }
+        }
+        return XFA_ItemLayoutProcessorResult_PageFullBreak;
+      } else if (fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) {
+        pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
+        if (pProcessor->m_pPageMgr->GetNextAvailContentHeight(fChildHeight)) {
+          CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL;
+          if (pThis->m_pPageMgr) {
+            if (pFormNode == NULL && pLayoutContext) {
+              pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode;
+            }
+            pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode,
+                                               pTempTrailerNode, FALSE, TRUE);
+          }
+          if (bUseInherited) {
+            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                             pOverflowTrailerNode,
+                                             pTrailerLayoutItem, pFormNode);
+            pThis->m_bUseInheriated = TRUE;
+          }
+          return XFA_ItemLayoutProcessorResult_PageFullBreak;
+        }
+        rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
+        bAddedItemInRow = TRUE;
+        if (bTakeSpace) {
+          fContentCurRowAvailWidth -= fChildWidth;
+          if (fContentCurRowHeight < fChildHeight) {
+            fContentCurRowHeight = fChildHeight;
+          }
+        }
+        if (eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+          bForceEndPage = FALSE;
+        }
+        return eRetValue;
+      } else {
+        XFA_ATTRIBUTEENUM eLayout =
+            pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
+        if (pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None &&
+            eLayout == XFA_ATTRIBUTEENUM_Tb) {
+          if (pThis->m_pPageMgr) {
+            pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
+                                               pOverflowTrailerNode, FALSE,
+                                               TRUE);
+          }
+          if (pTrailerLayoutItem) {
+            XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fSplitPos,
+                                                          pTrailerLayoutItem);
+          }
+          if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
+            XFA_ItemLayoutProcessor_AddPendingNode(pProcessor,
+                                                   pOverflowLeaderNode, FALSE);
+          }
+        } else {
+          if (eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+            if (pFormNode == NULL && pLayoutContext) {
+              pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode;
+            }
+            if (pThis->m_pPageMgr) {
+              pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
+                                                 pOverflowTrailerNode, FALSE,
+                                                 TRUE);
+            }
+            if (bUseInherited) {
+              pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
+                                               pOverflowTrailerNode,
+                                               pTrailerLayoutItem, pFormNode);
+              pThis->m_bUseInheriated = TRUE;
+            }
+          }
+        }
+        return XFA_ItemLayoutProcessorResult_PageFullBreak;
+      }
+    }
+  } else {
+    return XFA_ItemLayoutProcessorResult_RowFullBreak;
+  }
+  return XFA_ItemLayoutProcessorResult_Done;
+}
+XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
+    FX_BOOL bUseBreakControl,
+    XFA_ATTRIBUTEENUM eFlowStrategy,
+    FX_FLOAT fHeightLimit,
+    FX_FLOAT fRealHeight,
+    CXFA_LayoutContext* pContext,
+    FX_BOOL bRootForceTb) {
+  m_bHasAvailHeight = TRUE;
+  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
+  FX_BOOL bBreakDone = FALSE;
+  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
+  FX_BOOL bForceEndPage = FALSE;
+  FX_BOOL bIsManualBreak = FALSE;
+  if (m_pCurChildPreprocessor) {
+    m_pCurChildPreprocessor->m_ePreProcessRs =
+        XFA_ItemLayoutProcessorResult_Done;
+  }
+  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
+      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
+      bContainerHeightAutoSize);
+  if (pContext && pContext->m_bCurColumnWidthAvaiable) {
+    bContainerWidthAutoSize = FALSE;
+    fContainerWidth = pContext->m_fCurColumnWidth;
+  }
+  if (!bContainerHeightAutoSize) {
+    fContainerHeight -= m_fUsedSize;
+  }
+  if (!bContainerHeightAutoSize) {
+    CXFA_Node* pParentNode = m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
+    FX_BOOL bFocrTb = FALSE;
+    if (pParentNode &&
+        XFA_ItemLayoutProcessor_GetLayout(pParentNode, bFocrTb) ==
+            XFA_ATTRIBUTEENUM_Row) {
+      CXFA_Node* pChildContainer = m_pFormNode->GetNodeItem(
+          XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
+      if (pChildContainer &&
+          pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling,
+                                       XFA_OBJECTTYPE_ContainerNode)) {
+        fContainerHeight = 0;
+        bContainerHeightAutoSize = TRUE;
+      }
+    }
+  }
+  CXFA_Node* pMarginNode =
+      m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
+  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
+  if (pMarginNode) {
+    fLeftInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
+    fTopInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
+    fRightInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
+    fBottomInset =
+        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
+  }
+  FX_FLOAT fContentWidthLimit =
+      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+                              : fContainerWidth - fLeftInset - fRightInset;
+  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
+  FX_FLOAT fAvailHeight = fHeightLimit - fTopInset - fBottomInset;
+  if (fAvailHeight < 0) {
+    m_bHasAvailHeight = FALSE;
+  }
+  fRealHeight = fRealHeight - fTopInset - fBottomInset;
+  FX_FLOAT fContentCurRowY = 0;
+  CXFA_ContentLayoutItem* pLayoutChild = NULL;
+  if (m_pLayoutItem) {
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done &&
+        eFlowStrategy != XFA_ATTRIBUTEENUM_Tb) {
+      pLayoutChild = (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
+      for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
+           pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
+        if (pLayoutNext->m_sPos.y != pLayoutChild->m_sPos.y) {
+          pLayoutChild = pLayoutNext;
+        }
+      }
+    }
+    for (CXFA_ContentLayoutItem* pLayoutTempChild =
+             (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
+         pLayoutTempChild != pLayoutChild;
+         pLayoutTempChild =
+             (CXFA_ContentLayoutItem*)pLayoutTempChild->m_pNextSibling) {
+      if (XFA_ItemLayoutProcessor_IsTakingSpace(
+              pLayoutTempChild->m_pFormNode)) {
+        FX_FLOAT fChildContentWidth =
+            pLayoutTempChild->m_sPos.x + pLayoutTempChild->m_sSize.x;
+        FX_FLOAT fChildContentHeight =
+            pLayoutTempChild->m_sPos.y + pLayoutTempChild->m_sSize.y;
+        if (fContentCalculatedWidth < fChildContentWidth) {
+          fContentCalculatedWidth = fChildContentWidth;
+        }
+        if (fContentCalculatedHeight < fChildContentHeight) {
+          fContentCalculatedHeight = fChildContentHeight;
+        }
+      }
+    }
+    if (pLayoutChild) {
+      fContentCurRowY = pLayoutChild->m_sPos.y;
+    } else {
+      fContentCurRowY = fContentCalculatedHeight;
+    }
+  }
+  fContentCurRowY += InsertKeepLayoutItems();
+  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_None) {
+    XFA_ItemLayoutProcessor_GotoNextContainerNode(
+        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
+  }
+  fContentCurRowY +=
+      XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode);
+  if (m_pCurChildPreprocessor &&
+      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Container) {
+    if (XFA_ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), FALSE)) {
+      m_pKeepHeadNode = m_pCurChildNode;
+      m_bIsProcessKeep = TRUE;
+      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Keep;
+    }
+  }
+  while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done) {
+    FX_FLOAT fContentCurRowHeight = 0;
+    FX_FLOAT fContentCurRowAvailWidth = fContentWidthLimit;
+    m_fWidthLimite = fContentCurRowAvailWidth;
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgCurLineLayoutItems[3];
+    uint8_t uCurHAlignState =
+        (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb ? 0 : 2);
+    if (pLayoutChild) {
+      for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
+           pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
+        if (pLayoutNext->m_pNextSibling == NULL && m_pCurChildPreprocessor &&
+            m_pCurChildPreprocessor->m_pFormNode == pLayoutNext->m_pFormNode) {
+          pLayoutNext->m_pNext = m_pCurChildPreprocessor->m_pLayoutItem;
+          m_pCurChildPreprocessor->m_pLayoutItem = pLayoutNext;
+          break;
+        }
+        uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(
+            pLayoutNext->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign));
+        rgCurLineLayoutItems[uHAlign].Add(pLayoutNext);
+        if (eFlowStrategy == XFA_ATTRIBUTEENUM_Lr_tb) {
+          if (uHAlign > uCurHAlignState) {
+            uCurHAlignState = uHAlign;
+          }
+        } else if (uHAlign < uCurHAlignState) {
+          uCurHAlignState = uHAlign;
+        }
+        if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutNext->m_pFormNode)) {
+          if (pLayoutNext->m_sSize.y > fContentCurRowHeight) {
+            fContentCurRowHeight = pLayoutNext->m_sSize.y;
+          }
+          fContentCurRowAvailWidth -= pLayoutNext->m_sSize.x;
+        }
+      }
+      if ((CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild ==
+          pLayoutChild) {
+        m_pLayoutItem->m_pFirstChild = NULL;
+      } else {
+        CXFA_ContentLayoutItem* pLayoutNext =
+            (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
+        for (; pLayoutNext;
+             pLayoutNext =
+                 (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
+          if ((CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling ==
+              pLayoutChild) {
+            pLayoutNext->m_pNextSibling = NULL;
+            break;
+          }
+        }
+      }
+      CXFA_ContentLayoutItem* pLayoutNextTemp =
+          (CXFA_ContentLayoutItem*)pLayoutChild;
+      while (pLayoutNextTemp) {
+        pLayoutNextTemp->m_pParent = NULL;
+        CXFA_ContentLayoutItem* pSaveLayoutNext =
+            (CXFA_ContentLayoutItem*)pLayoutNextTemp->m_pNextSibling;
+        pLayoutNextTemp->m_pNextSibling = NULL;
+        pLayoutNextTemp = pSaveLayoutNext;
+      }
+      pLayoutChild = NULL;
+    }
+    while (m_pCurChildNode) {
+      CXFA_ItemLayoutProcessor* pProcessor = NULL;
+      FX_BOOL bAddedItemInRow = FALSE;
+      fContentCurRowY +=
+          XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode);
+      switch (m_nCurChildNodeStage) {
+        case XFA_ItemLayoutProcessorStages_Keep:
+        case XFA_ItemLayoutProcessorStages_None:
+          break;
+        case XFA_ItemLayoutProcessorStages_BreakBefore: {
+          for (int32_t iIndex = 0; iIndex < m_arrayKeepItems.GetSize();
+               iIndex++) {
+            CXFA_ContentLayoutItem* pItem = m_arrayKeepItems.GetAt(iIndex);
+            m_pLayoutItem->RemoveChild(pItem);
+            fContentCalculatedHeight -= pItem->m_sSize.y;
+          }
+          CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL;
+          FX_BOOL bCreatePage = FALSE;
+          if (bUseBreakControl && m_pPageMgr &&
+              m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, TRUE,
+                                                    pLeaderNode, pTrailerNode,
+                                                    bCreatePage) &&
+              m_pFormNode->GetClassID() != XFA_ELEMENT_Form && bCreatePage) {
+            if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
+              XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE);
+            }
+            if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
+              if (m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() ==
+                      XFA_ELEMENT_Form &&
+                  m_pLayoutItem == NULL) {
+                XFA_ItemLayoutProcessor_AddPendingNode(this, pTrailerNode,
+                                                       TRUE);
+              } else {
+                CXFA_ItemLayoutProcessor* pProcessor =
+                    new CXFA_ItemLayoutProcessor(pTrailerNode, NULL);
+                XFA_ItemLayoutProcessor_InsertFlowedItem(
+                    this, pProcessor, bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                    uCurHAlignState, rgCurLineLayoutItems, FALSE,
+                    XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
+                    fContentWidthLimit, fContentCurRowAvailWidth,
+                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                    pContext);
+                delete pProcessor;
+                pProcessor = NULL;
+              }
+            }
+            XFA_ItemLayoutProcessor_GotoNextContainerNode(
+                m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
+            bForceEndPage = TRUE;
+            bIsManualBreak = TRUE;
+            goto SuspendAndCreateNewRow;
+          }
+        } break;
+        case XFA_ItemLayoutProcessorStages_BreakAfter: {
+          CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL;
+          FX_BOOL bCreatePage = FALSE;
+          if (bUseBreakControl && m_pPageMgr &&
+              m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, FALSE,
+                                                    pLeaderNode, pTrailerNode,
+                                                    bCreatePage) &&
+              m_pFormNode->GetClassID() != XFA_ELEMENT_Form) {
+            if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
+              CXFA_ItemLayoutProcessor* pProcessor =
+                  new CXFA_ItemLayoutProcessor(pTrailerNode, NULL);
+              XFA_ItemLayoutProcessor_InsertFlowedItem(
+                  this, pProcessor, bContainerWidthAutoSize,
+                  bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                  uCurHAlignState, rgCurLineLayoutItems, FALSE,
+                  XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
+                  fContentWidthLimit, fContentCurRowAvailWidth,
+                  fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                  pContext);
+              delete pProcessor;
+              pProcessor = NULL;
+            }
+            if (!bCreatePage) {
+              if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
+                CalculateRowChildPosition(
+                    rgCurLineLayoutItems, eFlowStrategy,
+                    bContainerHeightAutoSize, bContainerWidthAutoSize,
+                    fContentCalculatedWidth, fContentCalculatedHeight,
+                    fContentCurRowY, fContentCurRowHeight, fContentWidthLimit);
+                rgCurLineLayoutItems->RemoveAll();
+                CXFA_ItemLayoutProcessor* pProcessor =
+                    new CXFA_ItemLayoutProcessor(pLeaderNode, NULL);
+                XFA_ItemLayoutProcessor_InsertFlowedItem(
+                    this, pProcessor, bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                    uCurHAlignState, rgCurLineLayoutItems, FALSE,
+                    XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
+                    fContentWidthLimit, fContentCurRowAvailWidth,
+                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                    pContext);
+                delete pProcessor;
+                pProcessor = NULL;
+              }
+            } else {
+              if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
+                XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE);
+              }
+            }
+            XFA_ItemLayoutProcessor_GotoNextContainerNode(
+                m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
+            if (bCreatePage) {
+              bForceEndPage = TRUE;
+              bIsManualBreak = TRUE;
+              if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done) {
+                bBreakDone = TRUE;
+              }
+            }
+            goto SuspendAndCreateNewRow;
+          }
+        } break;
+        case XFA_ItemLayoutProcessorStages_BookendLeader: {
+          CXFA_Node* pLeaderNode = NULL;
+          if (m_pCurChildPreprocessor) {
+            pProcessor = m_pCurChildPreprocessor;
+            m_pCurChildPreprocessor = NULL;
+          } else if (m_pPageMgr &&
+                     m_pPageMgr->ProcessBookendLeaderOrTrailer(
+                         m_pCurChildNode, TRUE, pLeaderNode)) {
+            pProcessor = new CXFA_ItemLayoutProcessor(pLeaderNode, m_pPageMgr);
+          }
+          if (pProcessor) {
+            if (XFA_ItemLayoutProcessor_InsertFlowedItem(
+                    this, pProcessor, bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
+                    fAvailHeight, fRealHeight, fContentCurRowY,
+                    fContentWidthLimit, fContentCurRowAvailWidth,
+                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
+              goto SuspendAndCreateNewRow;
+            } else {
+              delete pProcessor;
+              pProcessor = NULL;
+            }
+          }
+        } break;
+        case XFA_ItemLayoutProcessorStages_BookendTrailer: {
+          CXFA_Node* pTrailerNode = NULL;
+          if (m_pCurChildPreprocessor) {
+            pProcessor = m_pCurChildPreprocessor;
+            m_pCurChildPreprocessor = NULL;
+          } else if (m_pPageMgr &&
+                     m_pPageMgr->ProcessBookendLeaderOrTrailer(
+                         m_pCurChildNode, FALSE, pTrailerNode)) {
+            pProcessor = new CXFA_ItemLayoutProcessor(pTrailerNode, m_pPageMgr);
+          }
+          if (pProcessor) {
+            if (XFA_ItemLayoutProcessor_InsertFlowedItem(
+                    this, pProcessor, bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
+                    fAvailHeight, fRealHeight, fContentCurRowY,
+                    fContentWidthLimit, fContentCurRowAvailWidth,
+                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
+              goto SuspendAndCreateNewRow;
+            } else {
+              delete pProcessor;
+              pProcessor = NULL;
+            }
+          }
+        } break;
+        case XFA_ItemLayoutProcessorStages_Container:
+          ASSERT(m_pCurChildNode->IsContainerNode());
+          if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
+            break;
+          }
+          if (fContentCurRowY >= fHeightLimit + XFA_LAYOUT_FLOAT_PERCISION &&
+              XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) {
+            bForceEndPage = TRUE;
+            goto SuspendAndCreateNewRow;
+          }
+          if (m_pCurChildNode->IsContainerNode()) {
+            FX_BOOL bNewRow = FALSE;
+            if (m_pCurChildPreprocessor) {
+              pProcessor = m_pCurChildPreprocessor;
+              m_pCurChildPreprocessor = NULL;
+              bNewRow = TRUE;
+            } else {
+              pProcessor =
+                  new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
+            }
+            XFA_ItemLayoutProcessor_InsertPendingItems(pProcessor,
+                                                       m_pCurChildNode);
+            XFA_ItemLayoutProcessorResult rs =
+                XFA_ItemLayoutProcessor_InsertFlowedItem(
+                    this, pProcessor, bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
+                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
+                    fAvailHeight, fRealHeight, fContentCurRowY,
+                    fContentWidthLimit, fContentCurRowAvailWidth,
+                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
+                    pContext, bNewRow);
+            switch (rs) {
+              case XFA_ItemLayoutProcessorResult_ManualBreak:
+                bIsManualBreak = TRUE;
+              case XFA_ItemLayoutProcessorResult_PageFullBreak:
+                bForceEndPage = TRUE;
+              case XFA_ItemLayoutProcessorResult_RowFullBreak:
+                goto SuspendAndCreateNewRow;
+              case XFA_ItemLayoutProcessorResult_Done:
+              default:
+                fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems(
+                    pProcessor, m_pCurChildNode);
+                delete pProcessor;
+                pProcessor = NULL;
+            }
+          }
+          break;
+        case XFA_ItemLayoutProcessorStages_Done:
+          break;
+        default:
+          break;
+      }
+      XFA_ItemLayoutProcessor_GotoNextContainerNode(
+          m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
+      if (bAddedItemInRow && eFlowStrategy == XFA_ATTRIBUTEENUM_Tb) {
+        break;
+      } else {
+        continue;
+      }
+    SuspendAndCreateNewRow:
+      if (pProcessor) {
+        m_pCurChildPreprocessor = pProcessor;
+      }
+      break;
+    }
+    CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy,
+                              bContainerHeightAutoSize, bContainerWidthAutoSize,
+                              fContentCalculatedWidth, fContentCalculatedHeight,
+                              fContentCurRowY, fContentCurRowHeight,
+                              fContentWidthLimit, bRootForceTb);
+    m_fWidthLimite = fContentCurRowAvailWidth;
+    if (bForceEndPage) {
+      break;
+    }
+  }
+  FX_BOOL bRetValue =
+      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done &&
+      m_PendingNodes.empty();
+  if (bBreakDone) {
+    bRetValue = FALSE;
+  }
+  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
+      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
+      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
+      fContainerHeight);
+  if (fContainerHeight >= XFA_LAYOUT_FLOAT_PERCISION || m_pLayoutItem ||
+      bRetValue) {
+    if (m_pLayoutItem == NULL) {
+      m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+    }
+    if (fContainerHeight < 0) {
+      fContainerHeight = 0;
+    }
+    SetCurrentComponentSize(fContainerWidth, fContainerHeight);
+    if (bForceEndPage) {
+      m_fUsedSize = 0;
+    } else {
+      m_fUsedSize += m_pLayoutItem->m_sSize.y;
+    }
+  }
+  return bRetValue
+             ? XFA_ItemLayoutProcessorResult_Done
+             : (bIsManualBreak ? XFA_ItemLayoutProcessorResult_ManualBreak
+                               : XFA_ItemLayoutProcessorResult_PageFullBreak);
+}
+FX_BOOL CXFA_ItemLayoutProcessor::CalculateRowChildPosition(
+    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
+    XFA_ATTRIBUTEENUM eFlowStrategy,
+    FX_BOOL bContainerHeightAutoSize,
+    FX_BOOL bContainerWidthAutoSize,
+    FX_FLOAT& fContentCalculatedWidth,
+    FX_FLOAT& fContentCalculatedHeight,
+    FX_FLOAT& fContentCurRowY,
+    FX_FLOAT fContentCurRowHeight,
+    FX_FLOAT fContentWidthLimit,
+    FX_BOOL bRootForceTb) {
+  int32_t nGroupLengths[3] = {0, 0, 0};
+  FX_FLOAT fGroupWidths[3] = {0, 0, 0};
+  int32_t nTotalLength = 0;
+  for (int32_t i = 0; i < 3; i++) {
+    nGroupLengths[i] = rgCurLineLayoutItems[i].GetSize();
+    for (int32_t c = nGroupLengths[i], j = 0; j < c; j++) {
+      nTotalLength++;
+      if (XFA_ItemLayoutProcessor_IsTakingSpace(
+              rgCurLineLayoutItems[i][j]->m_pFormNode)) {
+        fGroupWidths[i] += rgCurLineLayoutItems[i][j]->m_sSize.x;
+      }
+    }
+  }
+  if (!nTotalLength) {
+    if (bContainerHeightAutoSize) {
+      FX_FLOAT fNewHeight = fContentCurRowY;
+      if (fContentCalculatedHeight > fNewHeight) {
+        fContentCalculatedHeight = fNewHeight;
+      }
+    }
+    return FALSE;
+  }
+  if (m_pLayoutItem == NULL) {
+    m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+  }
+  if (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb) {
+    FX_FLOAT fCurPos;
+    fCurPos = 0;
+    for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) {
+      if (bRootForceTb) {
+        FX_FLOAT fAbsoluteX, fAbsoluteY;
+        CalculatePositionedContainerPos(rgCurLineLayoutItems[0][j]->m_pFormNode,
+                                        rgCurLineLayoutItems[0][j]->m_sSize.x,
+                                        rgCurLineLayoutItems[0][j]->m_sSize.y,
+                                        fAbsoluteX, fAbsoluteY);
+        rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
+      } else {
+        rgCurLineLayoutItems[0][j]->m_sPos =
+            CFX_PointF(fCurPos, fContentCurRowY);
+        if (XFA_ItemLayoutProcessor_IsTakingSpace(
+                rgCurLineLayoutItems[0][j]->m_pFormNode)) {
+          fCurPos += rgCurLineLayoutItems[0][j]->m_sSize.x;
+        }
+      }
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+    fCurPos = (fContentWidthLimit + fGroupWidths[0] - fGroupWidths[1] -
+               fGroupWidths[2]) /
+              2;
+    for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) {
+      if (bRootForceTb) {
+        FX_FLOAT fAbsoluteX, fAbsoluteY;
+        CalculatePositionedContainerPos(rgCurLineLayoutItems[1][j]->m_pFormNode,
+                                        rgCurLineLayoutItems[1][j]->m_sSize.x,
+                                        rgCurLineLayoutItems[1][j]->m_sSize.y,
+                                        fAbsoluteX, fAbsoluteY);
+        rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
+      } else {
+        rgCurLineLayoutItems[1][j]->m_sPos =
+            CFX_PointF(fCurPos, fContentCurRowY);
+        if (XFA_ItemLayoutProcessor_IsTakingSpace(
+                rgCurLineLayoutItems[1][j]->m_pFormNode)) {
+          fCurPos += rgCurLineLayoutItems[1][j]->m_sSize.x;
+        }
+      }
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+    fCurPos = fContentWidthLimit - fGroupWidths[2];
+    for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) {
+      if (bRootForceTb) {
+        FX_FLOAT fAbsoluteX, fAbsoluteY;
+        CalculatePositionedContainerPos(rgCurLineLayoutItems[2][j]->m_pFormNode,
+                                        rgCurLineLayoutItems[2][j]->m_sSize.x,
+                                        rgCurLineLayoutItems[2][j]->m_sSize.y,
+                                        fAbsoluteX, fAbsoluteY);
+        rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
+      } else {
+        rgCurLineLayoutItems[2][j]->m_sPos =
+            CFX_PointF(fCurPos, fContentCurRowY);
+        if (XFA_ItemLayoutProcessor_IsTakingSpace(
+                rgCurLineLayoutItems[2][j]->m_pFormNode)) {
+          fCurPos += rgCurLineLayoutItems[2][j]->m_sSize.x;
+        }
+      }
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+  } else {
+    FX_FLOAT fCurPos;
+    fCurPos = fGroupWidths[0];
+    for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) {
+      if (XFA_ItemLayoutProcessor_IsTakingSpace(
+              rgCurLineLayoutItems[0][j]->m_pFormNode)) {
+        fCurPos -= rgCurLineLayoutItems[0][j]->m_sSize.x;
+      }
+      rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+    fCurPos = (fContentWidthLimit + fGroupWidths[0] + fGroupWidths[1] -
+               fGroupWidths[2]) /
+              2;
+    for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) {
+      if (XFA_ItemLayoutProcessor_IsTakingSpace(
+              rgCurLineLayoutItems[1][j]->m_pFormNode)) {
+        fCurPos -= rgCurLineLayoutItems[1][j]->m_sSize.x;
+      }
+      rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+    fCurPos = fContentWidthLimit;
+    for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) {
+      if (XFA_ItemLayoutProcessor_IsTakingSpace(
+              rgCurLineLayoutItems[2][j]->m_pFormNode)) {
+        fCurPos -= rgCurLineLayoutItems[2][j]->m_sSize.x;
+      }
+      rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
+      m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]);
+      m_fLastRowWidth = fCurPos;
+    }
+  }
+  m_fLastRowY = fContentCurRowY;
+  fContentCurRowY += fContentCurRowHeight;
+  if (bContainerWidthAutoSize) {
+    FX_FLOAT fChildSuppliedWidth = fGroupWidths[0];
+    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+        fContentWidthLimit > fChildSuppliedWidth) {
+      fChildSuppliedWidth = fContentWidthLimit;
+    }
+    if (fContentCalculatedWidth < fChildSuppliedWidth) {
+      fContentCalculatedWidth = fChildSuppliedWidth;
+    }
+  }
+  if (bContainerHeightAutoSize) {
+    FX_FLOAT fChildSuppliedHeight = fContentCurRowY;
+    if (fContentCalculatedHeight < fChildSuppliedHeight) {
+      fContentCalculatedHeight = fChildSuppliedHeight;
+    }
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_ItemLayoutProcessor::GetSubformSetParent(
+    CXFA_Node* pSubformSet) {
+  if (pSubformSet && pSubformSet->GetClassID() == XFA_ELEMENT_SubformSet) {
+    CXFA_Node* pParent = pSubformSet->GetNodeItem(XFA_NODEITEM_Parent);
+    while (pParent) {
+      if (pParent->GetClassID() != XFA_ELEMENT_SubformSet) {
+        return pParent;
+      }
+      pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
+    }
+  }
+  return pSubformSet;
+}
+void CXFA_ItemLayoutProcessor::DoLayoutField() {
+  if (m_pLayoutItem)
+    return;
+
+  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
+  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
+  if (!m_pLayoutItem) {
+    return;
+  }
+  CXFA_Document* pDocument = m_pFormNode->GetDocument();
+  IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
+  FX_FLOAT fHeight = -1;
+  FX_FLOAT fWidth = -1;
+  pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight);
+  int32_t nRotate =
+      FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
+  nRotate = XFA_MapRotation(nRotate);
+  if (nRotate == 90 || nRotate == 270) {
+    FX_FLOAT fTmp = fWidth;
+    fWidth = fHeight;
+    fHeight = fTmp;
+  }
+  SetCurrentComponentSize(fWidth, fHeight);
+}
+XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayout(
+    FX_BOOL bUseBreakControl,
+    FX_FLOAT fHeightLimit,
+    FX_FLOAT fRealHeight,
+    CXFA_LayoutContext* pContext) {
+  XFA_ELEMENT eClassID = m_pFormNode->GetClassID();
+  switch (eClassID) {
+    case XFA_ELEMENT_Subform:
+    case XFA_ELEMENT_Area:
+    case XFA_ELEMENT_ExclGroup:
+    case XFA_ELEMENT_SubformSet: {
+      FX_BOOL bRootForceTb = FALSE;
+      CXFA_Node* pLayoutNode = GetSubformSetParent(m_pFormNode);
+      XFA_ATTRIBUTEENUM eLayoutStrategy =
+          XFA_ItemLayoutProcessor_GetLayout(pLayoutNode, bRootForceTb);
+      switch (eLayoutStrategy) {
+        case XFA_ATTRIBUTEENUM_Tb:
+        case XFA_ATTRIBUTEENUM_Lr_tb:
+        case XFA_ATTRIBUTEENUM_Rl_tb:
+          return DoLayoutFlowedContainer(bUseBreakControl, eLayoutStrategy,
+                                         fHeightLimit, fRealHeight, pContext,
+                                         bRootForceTb);
+        case XFA_ATTRIBUTEENUM_Position:
+        case XFA_ATTRIBUTEENUM_Row:
+        case XFA_ATTRIBUTEENUM_Rl_row:
+        default:
+          DoLayoutPositionedContainer(pContext);
+          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
+          return XFA_ItemLayoutProcessorResult_Done;
+        case XFA_ATTRIBUTEENUM_Table:
+          DoLayoutTableContainer(pLayoutNode);
+          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
+          return XFA_ItemLayoutProcessorResult_Done;
+      }
+    }
+    case XFA_ELEMENT_Draw:
+    case XFA_ELEMENT_Field:
+      DoLayoutField();
+      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
+      return XFA_ItemLayoutProcessorResult_Done;
+    case XFA_ELEMENT_ContentArea:
+      return XFA_ItemLayoutProcessorResult_Done;
+    default:
+      return XFA_ItemLayoutProcessorResult_Done;
+  }
+}
+void CXFA_ItemLayoutProcessor::GetCurrentComponentPos(FX_FLOAT& fAbsoluteX,
+                                                      FX_FLOAT& fAbsoluteY) {
+  ASSERT(m_pLayoutItem);
+  fAbsoluteX = m_pLayoutItem->m_sPos.x;
+  fAbsoluteY = m_pLayoutItem->m_sPos.y;
+}
+void CXFA_ItemLayoutProcessor::GetCurrentComponentSize(FX_FLOAT& fWidth,
+                                                       FX_FLOAT& fHeight) {
+  ASSERT(m_pLayoutItem);
+  fWidth = m_pLayoutItem->m_sSize.x;
+  fHeight = m_pLayoutItem->m_sSize.y;
+}
+void CXFA_ItemLayoutProcessor::SetCurrentComponentPos(FX_FLOAT fAbsoluteX,
+                                                      FX_FLOAT fAbsoluteY) {
+  m_pLayoutItem->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
+}
+void CXFA_ItemLayoutProcessor::SetCurrentComponentSize(FX_FLOAT fWidth,
+                                                       FX_FLOAT fHeight) {
+  m_pLayoutItem->m_sSize = CFX_SizeF(fWidth, fHeight);
+}
+FX_BOOL CXFA_ItemLayoutProcessor::JudgeLeaderOrTrailerForOccur(
+    CXFA_Node* pFormNode) {
+  if (pFormNode == NULL) {
+    return FALSE;
+  }
+  CXFA_Node* pTemplate = pFormNode->GetTemplateNode();
+  if (!pTemplate) {
+    pTemplate = pFormNode;
+  }
+  CXFA_Occur NodeOccur(pTemplate->GetFirstChildByClass(XFA_ELEMENT_Occur));
+  int32_t iMax = NodeOccur.GetMax();
+  if (iMax > -1) {
+    int32_t iCount =
+        (int32_t)(uintptr_t)m_PendingNodesCount.GetValueAt(pTemplate);
+    if (iCount >= iMax) {
+      return FALSE;
+    }
+    iCount++;
+    m_PendingNodesCount.SetAt(pTemplate, (void*)(uintptr_t)(iCount));
+    return TRUE;
+  }
+  return TRUE;
+}
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.h b/xfa/fxfa/parser/xfa_layout_itemlayout.h
new file mode 100644
index 0000000..362e1c1
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.h
@@ -0,0 +1,195 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
+#define XFA_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
+
+#include <float.h>
+
+#include <list>
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+
+#define XFA_LAYOUT_INVALIDNODE ((CXFA_Node*)(intptr_t)-1)
+#define XFA_LAYOUT_FLOAT_PERCISION (0.0005f)
+#define XFA_LAYOUT_FLOAT_MAX FLT_MAX
+
+class CXFA_ContainerLayoutItem;
+class CXFA_ContentLayoutItem;
+class CXFA_ItemLayoutProcessor;
+class CXFA_LayoutPageMgr;
+class CXFA_Node;
+
+enum XFA_ItemLayoutProcessorResult {
+  XFA_ItemLayoutProcessorResult_Done,
+  XFA_ItemLayoutProcessorResult_PageFullBreak,
+  XFA_ItemLayoutProcessorResult_RowFullBreak,
+  XFA_ItemLayoutProcessorResult_ManualBreak,
+};
+
+enum XFA_ItemLayoutProcessorStages {
+  XFA_ItemLayoutProcessorStages_None,
+  XFA_ItemLayoutProcessorStages_BookendLeader,
+  XFA_ItemLayoutProcessorStages_BreakBefore,
+  XFA_ItemLayoutProcessorStages_Keep,
+  XFA_ItemLayoutProcessorStages_Container,
+  XFA_ItemLayoutProcessorStages_BreakAfter,
+  XFA_ItemLayoutProcessorStages_BookendTrailer,
+  XFA_ItemLayoutProcessorStages_Done,
+};
+
+class CXFA_LayoutContext {
+ public:
+  CXFA_LayoutContext()
+      : m_prgSpecifiedColumnWidths(NULL),
+        m_fCurColumnWidth(0),
+        m_bCurColumnWidthAvaiable(FALSE),
+        m_pOverflowProcessor(NULL),
+        m_pOverflowNode(NULL) {}
+  ~CXFA_LayoutContext() { m_pOverflowProcessor = NULL; }
+  CFX_ArrayTemplate<FX_FLOAT>* m_prgSpecifiedColumnWidths;
+  FX_FLOAT m_fCurColumnWidth;
+  FX_BOOL m_bCurColumnWidthAvaiable;
+  CXFA_ItemLayoutProcessor* m_pOverflowProcessor;
+  CXFA_Node* m_pOverflowNode;
+};
+
+class CXFA_ItemLayoutProcessor {
+ public:
+  CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
+
+  XFA_ItemLayoutProcessorResult DoLayout(
+      FX_BOOL bUseBreakControl,
+      FX_FLOAT fHeightLimit,
+      FX_FLOAT fRealHeight = XFA_LAYOUT_FLOAT_MAX,
+      CXFA_LayoutContext* pContext = NULL);
+
+  void GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY);
+
+  void GetCurrentComponentSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
+
+  void SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY);
+
+  void SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
+  inline CXFA_Node* GetFormNode() { return m_pFormNode; }
+  inline FX_BOOL HasLayoutItem() { return m_pLayoutItem != NULL; }
+  CXFA_ContentLayoutItem* ExtractLayoutItem();
+
+  static FX_BOOL IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor,
+                                       CXFA_Node* pNode,
+                                       CXFA_Node* pParentNode);
+  static void CalculatePositionedContainerPos(CXFA_Node* pNode,
+                                              FX_FLOAT fWidth,
+                                              FX_FLOAT fHeight,
+                                              FX_FLOAT& fAbsoluteX,
+                                              FX_FLOAT& fAbsoluteY);
+  static FX_BOOL FindLayoutItemSplitPos(CXFA_ContentLayoutItem* pLayoutItem,
+                                        FX_FLOAT fCurVerticalOffset,
+                                        FX_FLOAT& fProposedSplitPos,
+                                        FX_BOOL& bAppChange,
+                                        FX_BOOL bCalculateMargin = TRUE);
+  FX_FLOAT FindSplitPos(FX_FLOAT fProposedSplitPos);
+  void SplitLayoutItem(CXFA_ContentLayoutItem* pLayoutItem,
+                       CXFA_ContentLayoutItem* pSecondParent,
+                       FX_FLOAT fSplitPos);
+  void SplitLayoutItem(FX_FLOAT fSplitPos);
+  FX_BOOL JudgePutNextPage(
+      CXFA_ContentLayoutItem* pParentLayoutItem,
+      FX_FLOAT fChildHeight,
+      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems);
+  FX_BOOL ProcessKeepForSplite(
+      CXFA_ItemLayoutProcessor* pParentProcessor,
+      CXFA_ItemLayoutProcessor* pChildProcessor,
+      XFA_ItemLayoutProcessorResult eRetValue,
+      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& rgCurLineLayoutItem,
+      FX_FLOAT& fContentCurRowAvailWidth,
+      FX_FLOAT& fContentCurRowHeight,
+      FX_FLOAT& fContentCurRowY,
+      FX_BOOL& bAddedItemInRow,
+      FX_BOOL& bForceEndPage,
+      XFA_ItemLayoutProcessorResult& result);
+  FX_FLOAT InsertKeepLayoutItems();
+  void DoLayoutPageArea(CXFA_ContainerLayoutItem* pPageAreaLayoutItem);
+  FX_BOOL CalculateRowChildPosition(
+      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
+      XFA_ATTRIBUTEENUM eFlowStrategy,
+      FX_BOOL bContainerHeightAutoSize,
+      FX_BOOL bContainerWidthAutoSize,
+      FX_FLOAT& fContentCalculatedWidth,
+      FX_FLOAT& fContentCalculatedHeight,
+      FX_FLOAT& fContentCurRowY,
+      FX_FLOAT fContentCurRowHeight,
+      FX_FLOAT fContentWidthLimit,
+      FX_BOOL bRootForceTb = FALSE);
+
+  void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode,
+                            CXFA_Node* pTrailerNode,
+                            CXFA_ContentLayoutItem* pTrailerItem,
+                            CXFA_Node* pFormNode);
+  void ProcessUnUseBinds(CXFA_Node* pFormNode);
+  FX_BOOL IsAddNewRowForTrailer(CXFA_ContentLayoutItem* pTrailerItem);
+  FX_BOOL JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode);
+  CXFA_ContentLayoutItem* CreateContentLayoutItem(CXFA_Node* pFormNode);
+
+ protected:
+  void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext = NULL);
+  void DoLayoutTableContainer(CXFA_Node* pLayoutNode);
+  XFA_ItemLayoutProcessorResult DoLayoutFlowedContainer(
+      FX_BOOL bUseBreakControl,
+      XFA_ATTRIBUTEENUM eFlowStrategy,
+      FX_FLOAT fHeightLimit,
+      FX_FLOAT fRealHeight,
+      CXFA_LayoutContext* pContext = NULL,
+      FX_BOOL bRootForceTb = FALSE);
+  void DoLayoutField();
+  void XFA_ItemLayoutProcessor_GotoNextContainerNode(
+      CXFA_Node*& pCurActionNode,
+      XFA_ItemLayoutProcessorStages& nCurStage,
+      CXFA_Node* pParentContainer,
+      FX_BOOL bUsePageBreak);
+
+  FX_BOOL ProcessKeepNodesForCheckNext(CXFA_Node*& pCurActionNode,
+                                       XFA_ItemLayoutProcessorStages& nCurStage,
+                                       CXFA_Node*& pNextContainer,
+                                       FX_BOOL& bLastKeepNode);
+
+  FX_BOOL ProcessKeepNodesForBreakBefore(
+      CXFA_Node*& pCurActionNode,
+      XFA_ItemLayoutProcessorStages& nCurStage,
+      CXFA_Node* pContainerNode);
+
+  CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet);
+
+ public:
+  FX_BOOL m_bKeepBreakFinish;
+  FX_BOOL m_bIsProcessKeep;
+  CXFA_Node* m_pKeepHeadNode;
+  CXFA_Node* m_pKeepTailNode;
+  CXFA_Node* m_pFormNode;
+  CXFA_ContentLayoutItem* m_pLayoutItem;
+  CXFA_ContentLayoutItem* m_pOldLayoutItem;
+  CXFA_Node* m_pCurChildNode;
+  CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor;
+  XFA_ItemLayoutProcessorStages m_nCurChildNodeStage;
+  FX_FLOAT m_fUsedSize;
+  CXFA_LayoutPageMgr* m_pPageMgr;
+  std::list<CXFA_Node*> m_PendingNodes;
+  FX_BOOL m_bBreakPending;
+  CFX_ArrayTemplate<FX_FLOAT> m_rgSpecifiedColumnWidths;
+  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> m_arrayKeepItems;
+  CFX_MapPtrToPtr m_PendingNodesCount;
+  FX_FLOAT m_fLastRowWidth;
+  FX_FLOAT m_fLastRowY;
+  FX_FLOAT m_fWidthLimite;
+  FX_BOOL m_bUseInheriated;
+  XFA_ItemLayoutProcessorResult m_ePreProcessRs;
+  FX_BOOL m_bHasAvailHeight;
+};
+FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode);
+
+#endif  // XFA_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
diff --git a/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp b/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp
new file mode 100644
index 0000000..b46d882
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp
@@ -0,0 +1,1931 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_datamerger_imp.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_layout_appadapter.h"
+#include "xfa/fxfa/parser/xfa_layout_itemlayout.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor)
+    : m_pLayoutProcessor(pLayoutProcessor),
+      m_pTemplatePageSetRoot(nullptr),
+      m_pPageSetLayoutItemRoot(nullptr),
+      m_pPageSetCurRoot(nullptr),
+      m_pCurrentContainerRecord(nullptr),
+      m_pCurPageArea(nullptr),
+      m_nAvailPages(0),
+      m_nCurPageCount(0),
+      m_ePageSetMode(XFA_ATTRIBUTEENUM_OrderedOccurrence),
+      m_bCreateOverFlowPage(FALSE) {}
+CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() {
+  ClearData();
+  CXFA_LayoutItem* pLayoutItem = GetRootLayoutItem();
+  CXFA_LayoutItem* pNextLayout = NULL;
+  for (; pLayoutItem; pLayoutItem = pNextLayout) {
+    pNextLayout = pLayoutItem->m_pNextSibling;
+    XFA_ReleaseLayoutItem(pLayoutItem);
+  }
+}
+FX_BOOL CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) {
+  PrepareLayout();
+  CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
+  if (!pTemplateNode) {
+    return FALSE;
+  }
+  m_pTemplatePageSetRoot = pTemplateNode->GetProperty(0, XFA_ELEMENT_PageSet);
+  ASSERT(m_pTemplatePageSetRoot);
+  if (m_pPageSetLayoutItemRoot) {
+    m_pPageSetLayoutItemRoot->m_pParent = NULL;
+    m_pPageSetLayoutItemRoot->m_pFirstChild = NULL;
+    m_pPageSetLayoutItemRoot->m_pNextSibling = NULL;
+    m_pPageSetLayoutItemRoot->m_pFormNode = m_pTemplatePageSetRoot;
+  } else {
+    m_pPageSetLayoutItemRoot =
+        new CXFA_ContainerLayoutItem(m_pTemplatePageSetRoot);
+  }
+  m_pPageSetCurRoot = m_pPageSetLayoutItemRoot;
+  m_pTemplatePageSetRoot->SetUserData(XFA_LAYOUTITEMKEY,
+                                      (void*)m_pPageSetLayoutItemRoot);
+  XFA_ATTRIBUTEENUM eRelation =
+      m_pTemplatePageSetRoot->GetEnum(XFA_ATTRIBUTE_Relation);
+  if (eRelation != XFA_ATTRIBUTEENUM_Unknown) {
+    m_ePageSetMode = eRelation;
+  }
+  InitPageSetMap();
+  CXFA_Node* pPageArea = NULL;
+  int32_t iCount = 0;
+  for (pPageArea = m_pTemplatePageSetRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pPageArea;
+       pPageArea = pPageArea->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pPageArea->GetClassID() == XFA_ELEMENT_PageArea) {
+      iCount++;
+      if (pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea)) {
+        return TRUE;
+      }
+    }
+  }
+  if (iCount > 0) {
+    return FALSE;
+  }
+  CXFA_Document* pDocument = pTemplateNode->GetDocument();
+  IXFA_ObjFactory* pObjFactory = pDocument->GetParser()->GetFactory();
+  pPageArea = m_pTemplatePageSetRoot->GetChild(0, XFA_ELEMENT_PageArea);
+  if (!pPageArea) {
+    pPageArea = pObjFactory->CreateNode(m_pTemplatePageSetRoot->GetPacketID(),
+                                        XFA_ELEMENT_PageArea);
+    if (!pPageArea) {
+      return FALSE;
+    }
+    m_pTemplatePageSetRoot->InsertChild(pPageArea, NULL);
+    pPageArea->SetFlag(XFA_NODEFLAG_Initialized);
+  }
+  CXFA_Node* pContentArea = pPageArea->GetChild(0, XFA_ELEMENT_ContentArea);
+  if (!pContentArea) {
+    pContentArea = pObjFactory->CreateNode(pPageArea->GetPacketID(),
+                                           XFA_ELEMENT_ContentArea);
+    if (!pContentArea) {
+      return FALSE;
+    }
+    pPageArea->InsertChild(pContentArea, NULL);
+    pContentArea->SetFlag(XFA_NODEFLAG_Initialized);
+    pContentArea->SetMeasure(XFA_ATTRIBUTE_X,
+                             CXFA_Measurement(0.25f, XFA_UNIT_In));
+    pContentArea->SetMeasure(XFA_ATTRIBUTE_Y,
+                             CXFA_Measurement(0.25f, XFA_UNIT_In));
+    pContentArea->SetMeasure(XFA_ATTRIBUTE_W,
+                             CXFA_Measurement(8.0f, XFA_UNIT_In));
+    pContentArea->SetMeasure(XFA_ATTRIBUTE_H,
+                             CXFA_Measurement(10.5f, XFA_UNIT_In));
+  }
+  CXFA_Node* pMedium = pPageArea->GetChild(0, XFA_ELEMENT_Medium);
+  if (!pMedium) {
+    pMedium =
+        pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_Medium);
+    if (!pContentArea) {
+      return FALSE;
+    }
+    pPageArea->InsertChild(pMedium, NULL);
+    pMedium->SetFlag(XFA_NODEFLAG_Initialized);
+    pMedium->SetMeasure(XFA_ATTRIBUTE_Short,
+                        CXFA_Measurement(8.5f, XFA_UNIT_In));
+    pMedium->SetMeasure(XFA_ATTRIBUTE_Long,
+                        CXFA_Measurement(11.0f, XFA_UNIT_In));
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) {
+  FX_BOOL bProBreakBefore = FALSE;
+  CXFA_Node* pBreakBeforeNode = NULL;
+  while (pRootSubform) {
+    for (CXFA_Node* pBreakNode =
+             pRootSubform->GetNodeItem(XFA_NODEITEM_FirstChild);
+         pBreakNode;
+         pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      XFA_ELEMENT eType = pBreakNode->GetClassID();
+      if (eType == XFA_ELEMENT_BreakBefore ||
+          (eType == XFA_ELEMENT_Break &&
+           pBreakNode->GetEnum(XFA_ATTRIBUTE_Before) !=
+               XFA_ATTRIBUTEENUM_Auto)) {
+        bProBreakBefore = TRUE;
+        pBreakBeforeNode = pBreakNode;
+        break;
+      }
+    }
+    if (bProBreakBefore) {
+      break;
+    }
+    bProBreakBefore = TRUE;
+    pRootSubform = pRootSubform->GetFirstChildByClass(XFA_ELEMENT_Subform);
+    while (pRootSubform &&
+           !XFA_ItemLayoutProcessor_IsTakingSpace(pRootSubform)) {
+      pRootSubform = pRootSubform->GetNextSameClassSibling(XFA_ELEMENT_Subform);
+    }
+  }
+  CXFA_Node *pLeader, *pTrailer;
+  if (pBreakBeforeNode &&
+      ExecuteBreakBeforeOrAfter(pBreakBeforeNode, TRUE, pLeader, pTrailer)) {
+    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
+    return TRUE;
+  }
+  return AppendNewPage(TRUE);
+}
+FX_BOOL CXFA_LayoutPageMgr::AppendNewPage(FX_BOOL bFirstTemPage) {
+  if (m_pCurrentContainerRecord !=
+      m_rgProposedContainerRecord.GetTailPosition()) {
+    return TRUE;
+  }
+  CXFA_Node* pPageNode = GetNextAvailPageArea(NULL);
+  if (!pPageNode) {
+    return FALSE;
+  }
+  if (bFirstTemPage && m_pCurrentContainerRecord == NULL) {
+    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
+  }
+  return !bFirstTemPage || m_pCurrentContainerRecord;
+}
+static void XFA_LayoutItemMgr_ReorderLayoutItemToTail(
+    CXFA_ContainerLayoutItem* pLayoutItem) {
+  CXFA_ContainerLayoutItem* pParentLayoutItem =
+      (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+  if (!pParentLayoutItem) {
+    return;
+  }
+  pParentLayoutItem->RemoveChild(pLayoutItem);
+  pParentLayoutItem->AddChild(pLayoutItem);
+}
+static void XFA_LayoutItemMgr_RemoveLayoutItem(
+    CXFA_ContainerLayoutItem* pLayoutItem) {
+  CXFA_ContainerLayoutItem* pParentLayoutItem =
+      (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+  if (!pParentLayoutItem) {
+    return;
+  }
+  pParentLayoutItem->RemoveChild(pLayoutItem);
+}
+void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
+                                            CXFA_ContainerRecord* pPrevRecord) {
+  if (!pNewRecord || !pPrevRecord) {
+    return;
+  }
+  if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
+    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageSet);
+    return;
+  }
+  if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
+    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageArea);
+    return;
+  }
+  if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
+    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurContentArea);
+    return;
+  }
+}
+void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(
+    CXFA_ContainerRecord* pNewRecord,
+    CXFA_ContainerRecord* pPrevRecord) {
+  if (!pNewRecord || !pPrevRecord) {
+    return;
+  }
+  if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
+    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageSet);
+    return;
+  }
+  if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
+    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageArea);
+    return;
+  }
+  if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
+    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurContentArea);
+    return;
+  }
+}
+void CXFA_LayoutPageMgr::SubmitContentItem(
+    CXFA_ContentLayoutItem* pContentLayoutItem,
+    XFA_ItemLayoutProcessorResult eStatus) {
+  if (pContentLayoutItem) {
+    GetCurrentContainerRecord()->pCurContentArea->AddChild(pContentLayoutItem);
+    m_bCreateOverFlowPage = FALSE;
+  }
+  if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
+    if (eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak &&
+        m_pCurrentContainerRecord ==
+            m_rgProposedContainerRecord.GetTailPosition()) {
+      AppendNewPage();
+    }
+    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetTailPosition();
+    m_pCurPageArea = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
+  }
+}
+FX_FLOAT CXFA_LayoutPageMgr::GetAvailHeight() {
+  CXFA_ContainerLayoutItem* pLayoutItem =
+      GetCurrentContainerRecord()->pCurContentArea;
+  if (!pLayoutItem || !pLayoutItem->m_pFormNode)
+    return 0.0f;
+  FX_FLOAT fAvailHeight =
+      pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+  if (fAvailHeight >= XFA_LAYOUT_FLOAT_PERCISION)
+    return fAvailHeight;
+  if (m_pCurrentContainerRecord ==
+      m_rgProposedContainerRecord.GetHeadPosition()) {
+    return 0.0f;
+  }
+  return XFA_LAYOUT_FLOAT_MAX;
+}
+static CXFA_Node* XFA_ResolveBreakTarget(CXFA_Node* pPageSetRoot,
+                                         FX_BOOL bNewExprStyle,
+                                         CFX_WideStringC& wsTargetExpr) {
+  CXFA_Document* pDocument = pPageSetRoot->GetDocument();
+  if (wsTargetExpr.IsEmpty()) {
+    return NULL;
+  }
+  CFX_WideString wsTargetAll = wsTargetExpr;
+  wsTargetAll.TrimLeft();
+  wsTargetAll.TrimRight();
+  int32_t iSpliteIndex = 0;
+  FX_BOOL bTargetAllFind = TRUE;
+  while (iSpliteIndex != -1) {
+    CFX_WideString wsTargetExpr;
+    int32_t iSpliteNextIndex = 0;
+    if (!bTargetAllFind) {
+      iSpliteNextIndex = wsTargetAll.Find(' ', iSpliteIndex);
+      wsTargetExpr =
+          wsTargetAll.Mid(iSpliteIndex, iSpliteNextIndex - iSpliteIndex);
+    } else {
+      wsTargetExpr = wsTargetAll;
+    }
+    if (wsTargetExpr.IsEmpty()) {
+      return NULL;
+    }
+    bTargetAllFind = FALSE;
+    if (wsTargetExpr.GetAt(0) == '#') {
+      CXFA_Node* pNode = pDocument->GetNodeByID(
+          ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Template)),
+          wsTargetExpr.Mid(1));
+      if (pNode) {
+        return pNode;
+      }
+    } else if (bNewExprStyle) {
+      CFX_WideString wsProcessedTarget = wsTargetExpr;
+      if (wsTargetExpr.Left(4) == FX_WSTRC(L"som(") &&
+          wsTargetExpr.Right(1) == FX_WSTRC(L")")) {
+        wsProcessedTarget = wsTargetExpr.Mid(4, wsTargetExpr.GetLength() - 5);
+      }
+      XFA_RESOLVENODE_RS rs;
+      int32_t iCount = pDocument->GetScriptContext()->ResolveObjects(
+          pPageSetRoot, wsProcessedTarget, rs,
+          XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+              XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings |
+              XFA_RESOLVENODE_Parent);
+      if (iCount > 0 && rs.nodes[0]->IsNode()) {
+        return rs.nodes[0]->AsNode();
+      }
+    }
+    iSpliteIndex = iSpliteNextIndex;
+  }
+  return NULL;
+}
+
+FX_BOOL XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) {
+  CFX_WideString wsExpression;
+  pTestScript->TryContent(wsExpression);
+  if (wsExpression.IsEmpty()) {
+    return TRUE;
+  }
+  return pTestScript->GetDocument()->GetParser()->GetNotify()->RunScript(
+      pTestScript, pTestScript->GetNodeItem(XFA_NODEITEM_Parent,
+                                            XFA_OBJECTTYPE_ContainerNode));
+}
+CXFA_ContainerRecord* CXFA_LayoutPageMgr::CreateContainerRecord(
+    CXFA_Node* pPageNode,
+    FX_BOOL bCreateNew) {
+  CXFA_ContainerRecord* pNewRecord = new CXFA_ContainerRecord();
+  if (m_pCurrentContainerRecord) {
+    if (!IsPageSetRootOrderedOccurrence() || pPageNode == NULL) {
+      *pNewRecord = *GetCurrentContainerRecord();
+      m_rgProposedContainerRecord.AddTail(pNewRecord);
+      return pNewRecord;
+    }
+    CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
+    if (!bCreateNew) {
+      if (pPageSet == m_pTemplatePageSetRoot) {
+        pNewRecord->pCurPageSet = m_pPageSetCurRoot;
+      } else {
+        CXFA_ContainerLayoutItem* pParentLayoutItem =
+            (CXFA_ContainerLayoutItem*)pPageSet->GetUserData(XFA_LAYOUTITEMKEY);
+        if (pParentLayoutItem == NULL) {
+          pParentLayoutItem = m_pPageSetCurRoot;
+        }
+        pNewRecord->pCurPageSet = pParentLayoutItem;
+      }
+    } else {
+      CXFA_ContainerLayoutItem* pParentPageSetLayout = NULL;
+      if (pPageSet == GetCurrentContainerRecord()->pCurPageSet->m_pFormNode) {
+        pParentPageSetLayout =
+            (CXFA_ContainerLayoutItem*)GetCurrentContainerRecord()
+                ->pCurPageSet->m_pParent;
+      } else {
+        pParentPageSetLayout =
+            (CXFA_ContainerLayoutItem*)pPageSet->GetNodeItem(
+                                                   XFA_NODEITEM_Parent)
+                ->GetUserData(XFA_LAYOUTITEMKEY);
+      }
+      CXFA_ContainerLayoutItem* pPageSetLayoutItem =
+          new CXFA_ContainerLayoutItem(pPageSet);
+      pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
+      if (pParentPageSetLayout == NULL) {
+        CXFA_ContainerLayoutItem* pPrePageSet = m_pPageSetLayoutItemRoot;
+        while (pPrePageSet->m_pNextSibling) {
+          pPrePageSet = (CXFA_ContainerLayoutItem*)pPrePageSet->m_pNextSibling;
+        }
+        pPrePageSet->m_pNextSibling = pPageSetLayoutItem;
+        m_pPageSetCurRoot = pPageSetLayoutItem;
+      } else {
+        pParentPageSetLayout->AddChild(pPageSetLayoutItem);
+      }
+      pNewRecord->pCurPageSet = pPageSetLayoutItem;
+    }
+  } else {
+    if (pPageNode) {
+      CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
+      if (pPageSet == m_pTemplatePageSetRoot) {
+        pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+      } else {
+        CXFA_ContainerLayoutItem* pPageSetLayoutItem =
+            new CXFA_ContainerLayoutItem(pPageSet);
+        pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
+        m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
+        pNewRecord->pCurPageSet = pPageSetLayoutItem;
+      }
+    } else {
+      pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+    }
+  }
+  m_rgProposedContainerRecord.AddTail(pNewRecord);
+  return pNewRecord;
+}
+void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
+                                               CXFA_Node* pNewPageArea) {
+  CXFA_ContainerLayoutItem* pNewPageAreaLayoutItem = NULL;
+  if (m_PageArray.GetSize() > m_nAvailPages) {
+    CXFA_ContainerLayoutItem* pContainerItem = m_PageArray[m_nAvailPages];
+    pContainerItem->m_pFormNode = pNewPageArea;
+    m_nAvailPages++;
+    pNewPageAreaLayoutItem = pContainerItem;
+  } else {
+    IXFA_Notify* pNotify =
+        pNewPageArea->GetDocument()->GetParser()->GetNotify();
+    CXFA_ContainerLayoutItem* pContainerItem =
+        (CXFA_ContainerLayoutItem*)pNotify->OnCreateLayoutItem(pNewPageArea);
+    m_PageArray.Add(pContainerItem);
+    m_nAvailPages++;
+    pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageAdded,
+                         (void*)(uintptr_t)m_nAvailPages);
+    pNewPageAreaLayoutItem = pContainerItem;
+  }
+  pNewRecord->pCurPageSet->AddChild(pNewPageAreaLayoutItem);
+  pNewRecord->pCurPageArea = pNewPageAreaLayoutItem;
+  pNewRecord->pCurContentArea = NULL;
+}
+void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(
+    CXFA_ContainerRecord* pNewRecord,
+    CXFA_Node* pContentArea) {
+  if (pContentArea == NULL) {
+    pNewRecord->pCurContentArea = NULL;
+    return;
+  }
+  CXFA_ContainerLayoutItem* pNewContentAreaLayoutItem =
+      new CXFA_ContainerLayoutItem(pContentArea);
+  ASSERT(pNewRecord->pCurPageArea);
+  pNewRecord->pCurPageArea->AddChild(pNewContentAreaLayoutItem);
+  pNewRecord->pCurContentArea = pNewContentAreaLayoutItem;
+}
+class CXFA_TraverseStrategy_PageSetContainerLayoutItem {
+ public:
+  static inline CXFA_ContainerLayoutItem* GetFirstChild(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      CXFA_ContainerLayoutItem* pChildItem =
+          (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
+      while (pChildItem &&
+             pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
+        pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
+      }
+      return pChildItem;
+    }
+    return NULL;
+  }
+  static inline CXFA_ContainerLayoutItem* GetNextSibling(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    CXFA_ContainerLayoutItem* pChildItem =
+        (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
+    while (pChildItem &&
+           pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
+      pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
+    }
+    return pChildItem;
+  }
+  static inline CXFA_ContainerLayoutItem* GetParent(
+      CXFA_ContainerLayoutItem* pLayoutItem) {
+    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+  }
+};
+void CXFA_LayoutPageMgr::FinishPaginatedPageSets() {
+  CXFA_ContainerLayoutItem* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot;
+  for (; pRootPageSetLayoutItem;
+       pRootPageSetLayoutItem =
+           (CXFA_ContainerLayoutItem*)pRootPageSetLayoutItem->m_pNextSibling) {
+    CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
+                              CXFA_TraverseStrategy_PageSetContainerLayoutItem>
+        sIterator(pRootPageSetLayoutItem);
+    for (CXFA_ContainerLayoutItem* pPageSetLayoutItem = sIterator.GetCurrent();
+         pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) {
+      XFA_ATTRIBUTEENUM ePageRelation =
+          pPageSetLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Relation);
+      switch (ePageRelation) {
+        case XFA_ATTRIBUTEENUM_OrderedOccurrence:
+        default: { ProcessLastPageSet(); } break;
+        case XFA_ATTRIBUTEENUM_SimplexPaginated:
+        case XFA_ATTRIBUTEENUM_DuplexPaginated: {
+          CXFA_LayoutItem* pLastPageAreaLayoutItem = NULL;
+          int32_t nPageAreaCount = 0;
+          for (CXFA_LayoutItem* pPageAreaLayoutItem =
+                   pPageSetLayoutItem->m_pFirstChild;
+               pPageAreaLayoutItem;
+               pPageAreaLayoutItem = pPageAreaLayoutItem->m_pNextSibling) {
+            if (pPageAreaLayoutItem->m_pFormNode->GetClassID() !=
+                XFA_ELEMENT_PageArea) {
+              continue;
+            }
+            nPageAreaCount++;
+            pLastPageAreaLayoutItem = pPageAreaLayoutItem;
+          }
+          if (!pLastPageAreaLayoutItem) {
+            break;
+          }
+          if (!FindPageAreaFromPageSet_SimplexDuplex(
+                  pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE,
+                  nPageAreaCount == 1 ? XFA_ATTRIBUTEENUM_Only
+                                      : XFA_ATTRIBUTEENUM_Last) &&
+              (nPageAreaCount == 1 &&
+               !FindPageAreaFromPageSet_SimplexDuplex(
+                   pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE,
+                   TRUE, XFA_ATTRIBUTEENUM_Last))) {
+            break;
+          }
+          CXFA_Node* pNode = m_pCurPageArea;
+          XFA_ATTRIBUTEENUM eCurChoice =
+              pNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
+          if (eCurChoice == XFA_ATTRIBUTEENUM_Last) {
+            XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
+            pNode->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
+            XFA_ATTRIBUTEENUM eLastChoice =
+                pLastPageAreaLayoutItem->m_pFormNode->GetEnum(
+                    XFA_ATTRIBUTE_PagePosition);
+            if (eLastChoice == XFA_ATTRIBUTEENUM_First &&
+                (ePageRelation == XFA_ATTRIBUTEENUM_SimplexPaginated ||
+                 eOddOrEven != XFA_ATTRIBUTEENUM_Odd)) {
+              CXFA_ContainerRecord* pRecord = CreateContainerRecord();
+              AddPageAreaLayoutItem(pRecord, pNode);
+              break;
+            }
+          }
+          FX_BOOL bUsable = TRUE;
+          CFX_ArrayTemplate<FX_FLOAT> rgUsedHeights;
+          for (CXFA_LayoutItem* pChildLayoutItem =
+                   pLastPageAreaLayoutItem->m_pFirstChild;
+               pChildLayoutItem;
+               pChildLayoutItem = pChildLayoutItem->m_pNextSibling) {
+            if (pChildLayoutItem->m_pFormNode->GetClassID() !=
+                XFA_ELEMENT_ContentArea) {
+              continue;
+            }
+            FX_FLOAT fUsedHeight = 0;
+            for (CXFA_LayoutItem* pContentChildLayoutItem =
+                     pChildLayoutItem->m_pFirstChild;
+                 pContentChildLayoutItem;
+                 pContentChildLayoutItem =
+                     pContentChildLayoutItem->m_pNextSibling) {
+              if (CXFA_ContentLayoutItem* pContent =
+                      pContentChildLayoutItem->AsContentLayoutItem()) {
+                fUsedHeight += pContent->m_sSize.y;
+              }
+            }
+            rgUsedHeights.Add(fUsedHeight);
+          }
+          int32_t iCurContentAreaIndex = -1;
+          for (CXFA_Node* pContentAreaNode =
+                   pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+               pContentAreaNode;
+               pContentAreaNode =
+                   pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+            if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+              continue;
+            }
+            iCurContentAreaIndex++;
+            if (rgUsedHeights[iCurContentAreaIndex] >
+                pContentAreaNode->GetMeasure(XFA_ATTRIBUTE_H)
+                        .ToUnit(XFA_UNIT_Pt) +
+                    XFA_LAYOUT_FLOAT_PERCISION) {
+              bUsable = FALSE;
+              break;
+            }
+          }
+          if (bUsable) {
+            CXFA_LayoutItem* pChildLayoutItem =
+                pLastPageAreaLayoutItem->m_pFirstChild;
+            CXFA_Node* pContentAreaNode =
+                pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+            pLastPageAreaLayoutItem->m_pFormNode = pNode;
+            while (pChildLayoutItem && pContentAreaNode) {
+              if (pChildLayoutItem->m_pFormNode->GetClassID() !=
+                  XFA_ELEMENT_ContentArea) {
+                pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
+                continue;
+              }
+              if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+                pContentAreaNode =
+                    pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+                continue;
+              }
+              pChildLayoutItem->m_pFormNode = pContentAreaNode;
+              pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
+              pContentAreaNode =
+                  pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+            }
+          } else if (pNode->GetEnum(XFA_ATTRIBUTE_PagePosition) ==
+                     XFA_ATTRIBUTEENUM_Last) {
+            CXFA_ContainerRecord* pRecord = CreateContainerRecord();
+            AddPageAreaLayoutItem(pRecord, pNode);
+          }
+        } break;
+      }
+    }
+  }
+}
+int32_t CXFA_LayoutPageMgr::GetPageCount() const {
+  return m_PageArray.GetSize();
+}
+IXFA_LayoutPage* CXFA_LayoutPageMgr::GetPage(int32_t index) const {
+  if (index < 0 || index >= m_PageArray.GetSize())
+    return nullptr;
+  return m_PageArray[index];
+}
+int32_t CXFA_LayoutPageMgr::GetPageIndex(const IXFA_LayoutPage* pPage) const {
+  // FIXME: Find() method should take const.
+  return m_PageArray.Find(static_cast<CXFA_ContainerLayoutItem*>(
+      const_cast<IXFA_LayoutPage*>(pPage)));
+}
+FX_BOOL CXFA_LayoutPageMgr::RunBreak(XFA_ELEMENT eBreakType,
+                                     XFA_ATTRIBUTEENUM eTargetType,
+                                     CXFA_Node* pTarget,
+                                     FX_BOOL bStartNew) {
+  FX_BOOL bRet = FALSE;
+  switch (eTargetType) {
+    case XFA_ATTRIBUTEENUM_ContentArea:
+      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_ContentArea) {
+        pTarget = NULL;
+      }
+      if (!pTarget || !m_pCurrentContainerRecord ||
+          pTarget !=
+              GetCurrentContainerRecord()->pCurContentArea->m_pFormNode ||
+          bStartNew) {
+        CXFA_Node* pPageArea = NULL;
+        if (pTarget) {
+          pPageArea = pTarget->GetNodeItem(XFA_NODEITEM_Parent);
+        }
+        pPageArea = GetNextAvailPageArea(pPageArea, pTarget);
+        bRet = pPageArea != NULL;
+      }
+      break;
+    case XFA_ATTRIBUTEENUM_PageArea:
+      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+        pTarget = NULL;
+      }
+      if (!pTarget || !m_pCurrentContainerRecord ||
+          pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode ||
+          bStartNew) {
+        CXFA_Node* pPageArea = GetNextAvailPageArea(pTarget, NULL, TRUE);
+        bRet = pPageArea != NULL;
+      }
+      break;
+    case XFA_ATTRIBUTEENUM_PageOdd:
+      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+        pTarget = NULL;
+      }
+      if (m_nAvailPages % 2 != 1 || !m_pCurrentContainerRecord ||
+          (pTarget &&
+           pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
+          bStartNew) {
+        if (m_nAvailPages % 2 == 1) {
+        }
+      }
+      break;
+    case XFA_ATTRIBUTEENUM_PageEven:
+      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+        pTarget = NULL;
+      }
+      if (m_nAvailPages % 2 != 0 || !m_pCurrentContainerRecord ||
+          (pTarget &&
+           pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
+          bStartNew) {
+        if (m_nAvailPages % 2 == 0) {
+        }
+      }
+      break;
+    case XFA_ATTRIBUTEENUM_Auto:
+    default:
+      break;
+  }
+  return bRet;
+}
+FX_BOOL CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(
+    CXFA_Node* pCurNode,
+    FX_BOOL bBefore,
+    CXFA_Node*& pBreakLeaderTemplate,
+    CXFA_Node*& pBreakTrailerTemplate) {
+  XFA_ELEMENT eType = pCurNode->GetClassID();
+  switch (eType) {
+    case XFA_ELEMENT_BreakBefore:
+    case XFA_ELEMENT_BreakAfter: {
+      CFX_WideStringC wsBreakLeader, wsBreakTrailer;
+      CXFA_Node* pFormNode = pCurNode->GetNodeItem(
+          XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+      CXFA_Node* pContainer = pFormNode->GetTemplateNode();
+      FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
+      CXFA_Node* pScript = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Script);
+      if (pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript)) {
+        return FALSE;
+      }
+      CFX_WideStringC wsTarget = pCurNode->GetCData(XFA_ATTRIBUTE_Target);
+      CXFA_Node* pTarget =
+          XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
+      wsBreakTrailer = pCurNode->GetCData(XFA_ATTRIBUTE_Trailer);
+      wsBreakLeader = pCurNode->GetCData(XFA_ATTRIBUTE_Leader);
+      pBreakLeaderTemplate =
+          XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakLeader);
+      pBreakTrailerTemplate =
+          XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakTrailer);
+      if (RunBreak(eType, pCurNode->GetEnum(XFA_ATTRIBUTE_TargetType), pTarget,
+                   bStartNew)) {
+        return TRUE;
+      } else {
+        if (m_rgProposedContainerRecord.GetCount() > 0 &&
+            m_pCurrentContainerRecord ==
+                m_rgProposedContainerRecord.GetHeadPosition() &&
+            eType == XFA_ELEMENT_BreakBefore) {
+          CXFA_Node* pParentNode = pFormNode->GetNodeItem(
+              XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+          if (!pParentNode ||
+              pFormNode !=
+                  pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild,
+                                           XFA_OBJECTTYPE_ContainerNode)) {
+            break;
+          }
+          pParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
+          if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Form) {
+            break;
+          }
+          return TRUE;
+        }
+      }
+    } break;
+    case XFA_ELEMENT_Break: {
+      FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
+      CFX_WideStringC wsTarget = pCurNode->GetCData(
+          bBefore ? XFA_ATTRIBUTE_BeforeTarget : XFA_ATTRIBUTE_AfterTarget);
+      CXFA_Node* pTarget =
+          XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
+      if (RunBreak(bBefore ? XFA_ELEMENT_BreakBefore : XFA_ELEMENT_BreakAfter,
+                   pCurNode->GetEnum(bBefore ? XFA_ATTRIBUTE_Before
+                                             : XFA_ATTRIBUTE_After),
+                   pTarget, bStartNew)) {
+        return TRUE;
+      }
+    } break;
+    default:
+      break;
+  }
+  return FALSE;
+}
+static void XFA_SetLayoutGeneratedNodeFlag(CXFA_Node* pNode) {
+  pNode->SetFlag(XFA_NODEFLAG_LayoutGeneratedNode, TRUE, FALSE);
+  pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE, FALSE);
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(
+    CXFA_Node* pBreakNode,
+    FX_BOOL bBefore,
+    CXFA_Node*& pBreakLeaderNode,
+    CXFA_Node*& pBreakTrailerNode,
+    FX_BOOL& bCreatePage) {
+  CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
+  CXFA_Node* pFormNode = pBreakNode->GetNodeItem(XFA_NODEITEM_Parent,
+                                                 XFA_OBJECTTYPE_ContainerNode);
+  if (XFA_ItemLayoutProcessor_IsTakingSpace(pFormNode)) {
+    bCreatePage = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore,
+                                            pLeaderTemplate, pTrailerTemplate);
+    CXFA_Document* pDocument = pBreakNode->GetDocument();
+    CXFA_Node* pDataScope = NULL;
+    pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent,
+                                       XFA_OBJECTTYPE_ContainerNode);
+    if (pLeaderTemplate) {
+      if (!pDataScope) {
+        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+      }
+      pBreakLeaderNode = pDocument->DataMerge_CopyContainer(
+          pLeaderTemplate, pFormNode, pDataScope, TRUE);
+      pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode);
+      XFA_SetLayoutGeneratedNodeFlag(pBreakLeaderNode);
+    }
+    if (pTrailerTemplate) {
+      if (!pDataScope) {
+        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+      }
+      pBreakTrailerNode = pDocument->DataMerge_CopyContainer(
+          pTrailerTemplate, pFormNode, pDataScope, TRUE);
+      pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode);
+      XFA_SetLayoutGeneratedNodeFlag(pBreakTrailerNode);
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(
+    CXFA_Node* pBookendNode,
+    FX_BOOL bLeader,
+    CXFA_Node*& pBookendAppendNode) {
+  CXFA_Node* pLeaderTemplate = NULL;
+  CXFA_Node* pFormNode = pBookendNode->GetNodeItem(
+      XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+  if (ResolveBookendLeaderOrTrailer(pBookendNode, bLeader, pLeaderTemplate)) {
+    CXFA_Document* pDocument = pBookendNode->GetDocument();
+    CXFA_Node* pDataScope = NULL;
+    if (pLeaderTemplate) {
+      if (!pDataScope) {
+        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+      }
+      pBookendAppendNode = pDocument->DataMerge_CopyContainer(
+          pLeaderTemplate, pFormNode, pDataScope, TRUE);
+      pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode);
+      XFA_SetLayoutGeneratedNodeFlag(pBookendAppendNode);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+CXFA_Node* CXFA_LayoutPageMgr::BreakOverflow(CXFA_Node* pOverflowNode,
+                                             CXFA_Node*& pLeaderTemplate,
+                                             CXFA_Node*& pTrailerTemplate,
+                                             FX_BOOL bCreatePage) {
+  CFX_WideStringC wsOverflowLeader, wsOverflowTrailer;
+  CXFA_Node* pContainer =
+      pOverflowNode->GetNodeItem(XFA_NODEITEM_Parent,
+                                 XFA_OBJECTTYPE_ContainerNode)
+          ->GetTemplateNode();
+  if (pOverflowNode->GetClassID() == XFA_ELEMENT_Break) {
+    CFX_WideStringC wsOverflowLeader;
+    CFX_WideStringC wsOverflowTarget;
+    CFX_WideStringC wsOverflowTrailer;
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
+    if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
+        !wsOverflowTarget.IsEmpty()) {
+      if (!wsOverflowTarget.IsEmpty() && bCreatePage &&
+          !m_bCreateOverFlowPage) {
+        CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot,
+                                                    TRUE, wsOverflowTarget);
+        if (pTarget) {
+          m_bCreateOverFlowPage = TRUE;
+          switch (pTarget->GetClassID()) {
+            case XFA_ELEMENT_PageArea:
+              RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea,
+                       pTarget, TRUE);
+              break;
+            case XFA_ELEMENT_ContentArea:
+              RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
+                       pTarget, TRUE);
+              break;
+            default:
+              break;
+          }
+        }
+      }
+      if (!bCreatePage) {
+        pLeaderTemplate =
+            XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
+        pTrailerTemplate =
+            XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
+      }
+      return pOverflowNode;
+    }
+    return NULL;
+  } else if (pOverflowNode->GetClassID() == XFA_ELEMENT_Overflow) {
+    CFX_WideStringC wsOverflowTarget;
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_Leader, wsOverflowLeader);
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_Trailer, wsOverflowTrailer);
+    pOverflowNode->TryCData(XFA_ATTRIBUTE_Target, wsOverflowTarget);
+    if (!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
+      CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE,
+                                                  wsOverflowTarget);
+      if (pTarget) {
+        m_bCreateOverFlowPage = TRUE;
+        switch (pTarget->GetClassID()) {
+          case XFA_ELEMENT_PageArea:
+            RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget,
+                     TRUE);
+            break;
+          case XFA_ELEMENT_ContentArea:
+            RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
+                     pTarget, TRUE);
+            break;
+          default:
+            break;
+        }
+      }
+    }
+    if (!bCreatePage) {
+      pLeaderTemplate =
+          XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
+      pTrailerTemplate =
+          XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
+    }
+    return pOverflowNode;
+  }
+  return NULL;
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessOverflow(CXFA_Node* pFormNode,
+                                            CXFA_Node*& pLeaderNode,
+                                            CXFA_Node*& pTrailerNode,
+                                            FX_BOOL bDataMerge,
+                                            FX_BOOL bCreatePage) {
+  if (pFormNode == NULL) {
+    return FALSE;
+  }
+  CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
+  FX_BOOL bIsOverflowNode = FALSE;
+  if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
+      pFormNode->GetClassID() == XFA_ELEMENT_Break) {
+    bIsOverflowNode = TRUE;
+  }
+  for (CXFA_Node* pCurNode =
+           bIsOverflowNode ? pFormNode
+                           : pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
+    if (BreakOverflow(pCurNode, pLeaderTemplate, pTrailerTemplate,
+                      bCreatePage)) {
+      if (bIsOverflowNode) {
+        pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent);
+      }
+      CXFA_Document* pDocument = pCurNode->GetDocument();
+      CXFA_Node* pDataScope = NULL;
+      if (pLeaderTemplate) {
+        if (!pDataScope) {
+          pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+        }
+        pLeaderNode = pDocument->DataMerge_CopyContainer(
+            pLeaderTemplate, pFormNode, pDataScope, TRUE);
+        pDocument->DataMerge_UpdateBindingRelations(pLeaderNode);
+        XFA_SetLayoutGeneratedNodeFlag(pLeaderNode);
+      }
+      if (pTrailerTemplate) {
+        if (!pDataScope) {
+          pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+        }
+        pTrailerNode = pDocument->DataMerge_CopyContainer(
+            pTrailerTemplate, pFormNode, pDataScope, TRUE);
+        pDocument->DataMerge_UpdateBindingRelations(pTrailerNode);
+        XFA_SetLayoutGeneratedNodeFlag(pTrailerNode);
+      }
+      return TRUE;
+    }
+    if (bIsOverflowNode) {
+      break;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(
+    CXFA_Node* pBookendNode,
+    FX_BOOL bLeader,
+    CXFA_Node*& pBookendAppendTemplate) {
+  CFX_WideStringC wsBookendLeader;
+  CXFA_Node* pContainer =
+      pBookendNode->GetNodeItem(XFA_NODEITEM_Parent,
+                                XFA_OBJECTTYPE_ContainerNode)
+          ->GetTemplateNode();
+  if (pBookendNode->GetClassID() == XFA_ELEMENT_Break) {
+    pBookendNode->TryCData(
+        bLeader ? XFA_ATTRIBUTE_BookendLeader : XFA_ATTRIBUTE_BookendTrailer,
+        wsBookendLeader);
+    if (!wsBookendLeader.IsEmpty()) {
+      pBookendAppendTemplate =
+          XFA_ResolveBreakTarget(pContainer, FALSE, wsBookendLeader);
+      return TRUE;
+    }
+    return FALSE;
+  } else if (pBookendNode->GetClassID() == XFA_ELEMENT_Bookend) {
+    pBookendNode->TryCData(
+        bLeader ? XFA_ATTRIBUTE_Leader : XFA_ATTRIBUTE_Trailer,
+        wsBookendLeader);
+    pBookendAppendTemplate =
+        XFA_ResolveBreakTarget(pContainer, TRUE, wsBookendLeader);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet(
+    CXFA_Node* pPageSet,
+    CXFA_Node* pStartChild,
+    CXFA_Node* pTargetPageArea,
+    CXFA_Node* pTargetContentArea,
+    FX_BOOL bNewPage,
+    FX_BOOL bQuery) {
+  if (pPageSet == NULL && pStartChild == NULL) {
+    return FALSE;
+  }
+  if (IsPageSetRootOrderedOccurrence()) {
+    return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild,
+                                           pTargetPageArea, pTargetContentArea,
+                                           bNewPage, bQuery);
+  }
+  XFA_ATTRIBUTEENUM ePreferredPosition = m_pCurrentContainerRecord
+                                             ? XFA_ATTRIBUTEENUM_Rest
+                                             : XFA_ATTRIBUTEENUM_First;
+  return FindPageAreaFromPageSet_SimplexDuplex(
+      pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage,
+      bQuery, ePreferredPosition);
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(
+    CXFA_Node* pPageSet,
+    CXFA_Node* pStartChild,
+    CXFA_Node* pTargetPageArea,
+    CXFA_Node* pTargetContentArea,
+    FX_BOOL bNewPage,
+    FX_BOOL bQuery) {
+  int32_t iPageSetCount = 0;
+  if (!pStartChild && !bQuery) {
+    m_pPageSetMap.Lookup(pPageSet, iPageSetCount);
+    int32_t iMax = -1;
+    CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
+    if (pOccurNode) {
+      pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+    }
+    if (iMax >= 0 && iMax <= iPageSetCount) {
+      return FALSE;
+    }
+  }
+  FX_BOOL bRes = FALSE;
+  CXFA_Node* pCurrentNode =
+      pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling)
+                  : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pCurrentNode;
+       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+      if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
+        if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
+            NULL) {
+          if (pTargetPageArea == pCurrentNode) {
+            CreateMinPageRecord(pCurrentNode, TRUE);
+            pTargetPageArea = NULL;
+          }
+          continue;
+        }
+        if (!bQuery) {
+          CXFA_ContainerRecord* pNewRecord =
+              CreateContainerRecord(pCurrentNode, pStartChild == NULL);
+          AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+          if (pTargetContentArea == NULL) {
+            pTargetContentArea =
+                pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+          }
+          AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+        }
+        m_pCurPageArea = pCurrentNode;
+        m_nCurPageCount = 1;
+        bRes = TRUE;
+        break;
+      }
+      if (!bQuery) {
+        CreateMinPageRecord(pCurrentNode, FALSE);
+      }
+    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      if (FindPageAreaFromPageSet_Ordered(pCurrentNode, NULL, pTargetPageArea,
+                                          pTargetContentArea, bNewPage,
+                                          bQuery)) {
+        bRes = TRUE;
+        break;
+      }
+      if (!bQuery) {
+        CreateMinPageSetRecord(pCurrentNode, TRUE);
+      }
+    }
+  }
+  if (!pStartChild && bRes && !bQuery) {
+    m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount);
+  }
+  return bRes;
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(
+    CXFA_Node* pPageSet,
+    CXFA_Node* pStartChild,
+    CXFA_Node* pTargetPageArea,
+    CXFA_Node* pTargetContentArea,
+    FX_BOOL bNewPage,
+    FX_BOOL bQuery,
+    XFA_ATTRIBUTEENUM ePreferredPosition) {
+  const XFA_ATTRIBUTEENUM eFallbackPosition = XFA_ATTRIBUTEENUM_Any;
+  CXFA_Node *pPreferredPageArea = NULL, *pFallbackPageArea = NULL;
+  CXFA_Node* pCurrentNode = NULL;
+  if (!pStartChild || pStartChild->GetClassID() == XFA_ELEMENT_PageArea) {
+    pCurrentNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+  } else {
+    pCurrentNode = pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  for (; pCurrentNode;
+       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+      if (!MatchPageAreaOddOrEven(pCurrentNode, FALSE)) {
+        continue;
+      }
+      XFA_ATTRIBUTEENUM eCurPagePosition =
+          pCurrentNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
+      if (ePreferredPosition == XFA_ATTRIBUTEENUM_Last) {
+        if (eCurPagePosition != ePreferredPosition) {
+          continue;
+        }
+        if (m_ePageSetMode == XFA_ATTRIBUTEENUM_SimplexPaginated ||
+            pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
+                XFA_ATTRIBUTEENUM_Any) {
+          pPreferredPageArea = pCurrentNode;
+          break;
+        }
+        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+        AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+        AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
+                                                 XFA_ELEMENT_ContentArea));
+        pPreferredPageArea = pCurrentNode;
+        return FALSE;
+      } else if (ePreferredPosition == XFA_ATTRIBUTEENUM_Only) {
+        if (eCurPagePosition != ePreferredPosition) {
+          continue;
+        }
+        if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated ||
+            pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
+                XFA_ATTRIBUTEENUM_Any) {
+          pPreferredPageArea = pCurrentNode;
+          break;
+        }
+        return FALSE;
+      }
+      if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
+        if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
+            NULL) {
+          if (pTargetPageArea == pCurrentNode) {
+            CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+            AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+            pTargetPageArea = NULL;
+          }
+          continue;
+        }
+        if ((ePreferredPosition == XFA_ATTRIBUTEENUM_Rest &&
+             eCurPagePosition == XFA_ATTRIBUTEENUM_Any) ||
+            eCurPagePosition == ePreferredPosition) {
+          pPreferredPageArea = pCurrentNode;
+          break;
+        } else if (eCurPagePosition == eFallbackPosition &&
+                   !pFallbackPageArea) {
+          pFallbackPageArea = pCurrentNode;
+        }
+      } else if (pTargetPageArea &&
+                 !MatchPageAreaOddOrEven(pTargetPageArea, FALSE)) {
+        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+        AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+        AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
+                                                 XFA_ELEMENT_ContentArea));
+      }
+    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      if (FindPageAreaFromPageSet_SimplexDuplex(
+              pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage,
+              bQuery, ePreferredPosition)) {
+        break;
+      }
+    }
+  }
+  CXFA_Node* pCurPageArea = NULL;
+  if (pPreferredPageArea) {
+    pCurPageArea = pPreferredPageArea;
+  } else if (pFallbackPageArea) {
+    pCurPageArea = pFallbackPageArea;
+  }
+  if (!pCurPageArea) {
+    return FALSE;
+  }
+  if (!bQuery) {
+    CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+    AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
+    if (pTargetContentArea == NULL) {
+      pTargetContentArea =
+          pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+    }
+    AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+  }
+  m_pCurPageArea = pCurPageArea;
+  return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea,
+                                                   FX_BOOL bLastMatch) {
+  if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated) {
+    return TRUE;
+  }
+  XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
+  pPageArea->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
+  if (eOddOrEven != XFA_ATTRIBUTEENUM_Any) {
+    int32_t iPageCount = GetPageCount();
+    if (bLastMatch) {
+      return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 1
+                                                 : iPageCount % 2 == 0;
+    }
+    return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 0
+                                               : iPageCount % 2 == 1;
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(
+    CXFA_Node* pTargetPageArea,
+    CXFA_Node* pTargetContentArea,
+    FX_BOOL bNewPage,
+    FX_BOOL bQuery) {
+  if (m_pCurPageArea == NULL) {
+    FindPageAreaFromPageSet(m_pTemplatePageSetRoot, NULL, pTargetPageArea,
+                            pTargetContentArea, bNewPage, bQuery);
+    ASSERT(m_pCurPageArea);
+    return m_pCurPageArea;
+  }
+  if (pTargetPageArea == NULL || pTargetPageArea == m_pCurPageArea) {
+    if (!bNewPage && GetNextContentArea(pTargetContentArea)) {
+      return m_pCurPageArea;
+    }
+    if (IsPageSetRootOrderedOccurrence()) {
+      int32_t iMax = -1;
+      CXFA_Node* pOccurNode =
+          m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
+      if (pOccurNode) {
+        pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+      }
+      if ((iMax < 0 || m_nCurPageCount < iMax)) {
+        if (!bQuery) {
+          CXFA_ContainerRecord* pNewRecord =
+              CreateContainerRecord(m_pCurPageArea);
+          AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea);
+          if (pTargetContentArea == NULL) {
+            pTargetContentArea =
+                m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+          }
+          AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+        }
+        m_nCurPageCount++;
+        return m_pCurPageArea;
+      }
+    }
+  }
+  if (!bQuery && IsPageSetRootOrderedOccurrence()) {
+    CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
+  }
+  if (FindPageAreaFromPageSet(m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent),
+                              m_pCurPageArea, pTargetPageArea,
+                              pTargetContentArea, bNewPage, bQuery)) {
+    return m_pCurPageArea;
+  }
+  CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
+  while (TRUE) {
+    if (FindPageAreaFromPageSet(pPageSet, NULL, pTargetPageArea,
+                                pTargetContentArea, bNewPage, bQuery)) {
+      return m_pCurPageArea;
+    }
+    if (!bQuery && IsPageSetRootOrderedOccurrence()) {
+      CreateMinPageSetRecord(pPageSet);
+    }
+    if (FindPageAreaFromPageSet(NULL, pPageSet, pTargetPageArea,
+                                pTargetContentArea, bNewPage, bQuery)) {
+      return m_pCurPageArea;
+    }
+    if (pPageSet == m_pTemplatePageSetRoot) {
+      break;
+    }
+    pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+  return NULL;
+}
+static FX_BOOL XFA_LayoutPageMgr_CheckContentAreaNotUsed(
+    CXFA_ContainerLayoutItem* pPageAreaLayoutItem,
+    CXFA_Node* pContentArea,
+    CXFA_ContainerLayoutItem*& pContentAreaLayoutItem) {
+  for (CXFA_ContainerLayoutItem* pLayoutItem =
+           (CXFA_ContainerLayoutItem*)pPageAreaLayoutItem->m_pFirstChild;
+       pLayoutItem;
+       pLayoutItem = (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling) {
+    if (pLayoutItem->m_pFormNode == pContentArea) {
+      if (pLayoutItem->m_pFirstChild == NULL) {
+        pContentAreaLayoutItem = pLayoutItem;
+        return TRUE;
+      }
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) {
+  CXFA_Node* pCurContentNode =
+      GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
+  if (pContentArea == NULL) {
+    pContentArea =
+        pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
+    if (pContentArea == NULL) {
+      return FALSE;
+    }
+  } else {
+    if (pContentArea->GetNodeItem(XFA_NODEITEM_Parent) != m_pCurPageArea) {
+      return FALSE;
+    }
+    CXFA_ContainerLayoutItem* pContentAreaLayout = NULL;
+    if (!XFA_LayoutPageMgr_CheckContentAreaNotUsed(
+            GetCurrentContainerRecord()->pCurPageArea, pContentArea,
+            pContentAreaLayout)) {
+      return FALSE;
+    }
+    if (pContentAreaLayout) {
+      if (pContentAreaLayout->m_pFormNode != pCurContentNode) {
+        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+        pNewRecord->pCurContentArea = pContentAreaLayout;
+        return TRUE;
+      } else {
+        return FALSE;
+      }
+    }
+  }
+  CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+  AddContentAreaLayoutItem(pNewRecord, pContentArea);
+  return TRUE;
+}
+void CXFA_LayoutPageMgr::InitPageSetMap() {
+  if (!IsPageSetRootOrderedOccurrence()) {
+    return;
+  }
+  CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot);
+  for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode;
+       pPageSetNode = sIterator.MoveToNext()) {
+    if (pPageSetNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      XFA_ATTRIBUTEENUM eRelation =
+          pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation);
+      if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) {
+        m_pPageSetMap.SetAt(pPageSetNode, 0);
+      }
+    }
+  }
+}
+int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea,
+                                                FX_BOOL bTargetPageArea,
+                                                FX_BOOL bCreateLast) {
+  if (pPageArea == NULL) {
+    return 0;
+  }
+  CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
+  int32_t iMin = 0;
+  if ((pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) ||
+      bTargetPageArea) {
+    CXFA_Node* pContentArea =
+        pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+    if (iMin < 1 && bTargetPageArea && !pContentArea) {
+      iMin = 1;
+    }
+    int32_t i = 0;
+    if (bCreateLast) {
+      i = m_nCurPageCount;
+    }
+    for (; i < iMin; i++) {
+      CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+      AddPageAreaLayoutItem(pNewRecord, pPageArea);
+      AddContentAreaLayoutItem(pNewRecord, pContentArea);
+    }
+  }
+  return iMin;
+}
+void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet,
+                                                FX_BOOL bCreateAll) {
+  if (pPageSet == NULL) {
+    return;
+  }
+  int32_t iCurSetCount = 0;
+  if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) {
+    return;
+  }
+  if (bCreateAll) {
+    iCurSetCount = 0;
+  }
+  CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
+  int32_t iMin = 0;
+  if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) {
+    if (iCurSetCount < iMin) {
+      for (int32_t i = 0; i < iMin - iCurSetCount; i++) {
+        for (CXFA_Node* pCurrentPageNode =
+                 pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+             pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem(
+                                   XFA_NODEITEM_NextSibling)) {
+          if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageArea) {
+            CreateMinPageRecord(pCurrentPageNode, FALSE);
+          } else if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageSet) {
+            CreateMinPageSetRecord(pCurrentPageNode, TRUE);
+          }
+        }
+      }
+      m_pPageSetMap.SetAt(pPageSet, iMin);
+    }
+  }
+}
+void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) {
+  if (pRecordNode == NULL) {
+    return;
+  }
+  for (CXFA_Node* pCurrentNode =
+           pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+       pCurrentNode;
+       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+      CreateMinPageRecord(pCurrentNode, FALSE);
+    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+      CreateMinPageSetRecord(pCurrentNode, TRUE);
+    }
+  }
+}
+void CXFA_LayoutPageMgr::ProcessLastPageSet() {
+  CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
+  CreateNextMinRecord(m_pCurPageArea);
+  CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
+  while (TRUE) {
+    CreateMinPageSetRecord(pPageSet);
+    if (pPageSet == m_pTemplatePageSetRoot) {
+      break;
+    }
+    CreateNextMinRecord(pPageSet);
+    pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+}
+FX_BOOL CXFA_LayoutPageMgr::GetNextAvailContentHeight(FX_FLOAT fChildHeight) {
+  CXFA_Node* pCurContentNode =
+      GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
+  if (pCurContentNode == NULL) {
+    return FALSE;
+  }
+  pCurContentNode =
+      pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
+  if (pCurContentNode) {
+    FX_FLOAT fNextContentHeight =
+        pCurContentNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+    return fNextContentHeight > fChildHeight;
+  }
+  CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
+  CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
+  int32_t iMax = 0;
+  if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
+    if (m_nCurPageCount == iMax) {
+      CXFA_Node* pSrcPage = m_pCurPageArea;
+      int32_t nSrcPageCount = m_nCurPageCount;
+      FX_POSITION psSrcRecord = m_rgProposedContainerRecord.GetTailPosition();
+      CXFA_Node* pNextPage = GetNextAvailPageArea(NULL, NULL, FALSE, TRUE);
+      m_pCurPageArea = pSrcPage;
+      m_nCurPageCount = nSrcPageCount;
+      CXFA_ContainerRecord* pPrevRecord =
+          (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
+              psSrcRecord);
+      while (psSrcRecord) {
+        FX_POSITION psSaveRecord = psSrcRecord;
+        CXFA_ContainerRecord* pInsertRecord =
+            (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
+                psSrcRecord);
+        RemoveLayoutRecord(pInsertRecord, pPrevRecord);
+        delete pInsertRecord;
+        m_rgProposedContainerRecord.RemoveAt(psSaveRecord);
+      }
+      if (pNextPage) {
+        CXFA_Node* pContentArea =
+            pNextPage->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+        if (pContentArea) {
+          FX_FLOAT fNextContentHeight =
+              pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+          if (fNextContentHeight > fChildHeight) {
+            return TRUE;
+          }
+        }
+      }
+      return FALSE;
+    }
+  }
+  CXFA_Node* pContentArea =
+      pPageNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+  FX_FLOAT fNextContentHeight =
+      pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+  if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION) {
+    return TRUE;
+  }
+  if (fNextContentHeight > fChildHeight) {
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_LayoutPageMgr::ClearData() {
+  ClearRecordList();
+}
+void CXFA_LayoutPageMgr::ClearRecordList() {
+  if (!m_pTemplatePageSetRoot) {
+    return;
+  }
+  if (m_rgProposedContainerRecord.GetCount() > 0) {
+    FX_POSITION sPos;
+    sPos = m_rgProposedContainerRecord.GetHeadPosition();
+    while (sPos) {
+      CXFA_ContainerRecord* pRecord =
+          (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(sPos);
+      delete pRecord;
+    }
+    m_rgProposedContainerRecord.RemoveAll();
+  }
+  m_pCurrentContainerRecord = NULL;
+  m_pCurPageArea = NULL;
+  m_nCurPageCount = 0;
+  m_bCreateOverFlowPage = FALSE;
+  m_pPageSetMap.RemoveAll();
+}
+CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem(
+    CXFA_Node* pFormNode) {
+  return pFormNode->GetDocument()->GetParser()->GetNotify()->OnCreateLayoutItem(
+      pFormNode);
+}
+static void XFA_SyncRemoveLayoutItem(CXFA_LayoutItem* pParentLayoutItem,
+                                     IXFA_Notify* pNotify,
+                                     IXFA_DocLayout* pDocLayout) {
+  CXFA_LayoutItem* pNextLayoutItem;
+  CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
+  while (pCurLayoutItem) {
+    pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
+    if (pCurLayoutItem->m_pFirstChild) {
+      XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
+    }
+    pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
+                           XFA_LAYOUTEVENT_ItemRemoving);
+    delete pCurLayoutItem;
+    pCurLayoutItem = pNextLayoutItem;
+  }
+}
+void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
+  CXFA_LayoutItem* pNextLayoutItem;
+  CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
+  while (pCurLayoutItem) {
+    pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
+    if (pCurLayoutItem->IsContentLayoutItem()) {
+      FX_DWORD dwFlag = pCurLayoutItem->m_pFormNode->GetFlag();
+      if (dwFlag & (XFA_NODEFLAG_HasRemoved)) {
+        IXFA_Notify* pNotify =
+            m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
+        IXFA_DocLayout* pDocLayout =
+            m_pTemplatePageSetRoot->GetDocument()->GetDocLayout();
+        if (pCurLayoutItem->m_pFirstChild) {
+          XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
+        }
+        pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
+                               XFA_LAYOUTEVENT_ItemRemoving);
+        delete pCurLayoutItem;
+        pCurLayoutItem = pNextLayoutItem;
+        continue;
+      }
+      if (dwFlag & XFA_NODEFLAG_LayoutGeneratedNode) {
+        CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+            sIterator(pCurLayoutItem->m_pFormNode);
+        for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+             pNode = sIterator.MoveToNext()) {
+          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, TRUE, FALSE);
+        }
+      }
+    }
+    if (pCurLayoutItem->m_pFirstChild) {
+      SaveLayoutItem(pCurLayoutItem);
+    }
+    pCurLayoutItem->m_pParent = NULL;
+    pCurLayoutItem->m_pNextSibling = NULL;
+    pCurLayoutItem->m_pFirstChild = NULL;
+    if (!pCurLayoutItem->IsContentLayoutItem() &&
+        pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
+      delete pCurLayoutItem;
+    }
+    pCurLayoutItem = pNextLayoutItem;
+  }
+}
+CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(
+    CXFA_Node* pFormNode,
+    CXFA_LayoutContext* pLayoutContext) {
+  for (CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
+    if (pCurNode->GetClassID() == XFA_ELEMENT_Break) {
+      CFX_WideStringC wsOverflowLeader;
+      CFX_WideStringC wsOverflowTarget;
+      CFX_WideStringC wsOverflowTrailer;
+      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
+      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
+      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
+      if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
+          !wsOverflowTarget.IsEmpty()) {
+        return pCurNode;
+      }
+      return NULL;
+    } else if (pCurNode->GetClassID() == XFA_ELEMENT_Overflow) {
+      return pCurNode;
+    }
+  }
+  return NULL;
+}
+void CXFA_LayoutPageMgr::MergePageSetContents() {
+  CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
+  IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
+  IXFA_DocLayout* pDocLayout = pDocument->GetDocLayout();
+  CXFA_ContainerLayoutItem* pRootLayout = GetRootLayoutItem();
+  {
+    for (int32_t iIndex = 0; iIndex < pDocument->m_pPendingPageSet.GetSize();
+         iIndex++) {
+      CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+          sIterator(pDocument->m_pPendingPageSet.GetAt(iIndex));
+      for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+           pNode = sIterator.MoveToNext()) {
+        if (pNode->IsContainerNode()) {
+          CXFA_Node* pBindNode = pNode->GetBindData();
+          if (pBindNode) {
+            pBindNode->RemoveBindItem(pNode);
+            pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+          }
+        }
+        pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
+      }
+    }
+  }
+  int32_t iIndex = 0;
+  CXFA_Node* pPendingPageSet = NULL;
+  for (; pRootLayout;
+       pRootLayout = (CXFA_ContainerLayoutItem*)pRootLayout->m_pNextSibling) {
+    pPendingPageSet = NULL;
+    CXFA_NodeIteratorTemplate<
+        CXFA_ContainerLayoutItem,
+        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+        iterator(pRootLayout);
+    CXFA_ContainerLayoutItem* pRootPageSetContainerItem = iterator.GetCurrent();
+    ASSERT(pRootPageSetContainerItem->m_pFormNode->GetClassID() ==
+           XFA_ELEMENT_PageSet);
+    if (iIndex < pDocument->m_pPendingPageSet.GetSize()) {
+      pPendingPageSet = pDocument->m_pPendingPageSet.GetAt(iIndex);
+      iIndex++;
+    }
+    if (!pPendingPageSet) {
+      if (pRootPageSetContainerItem->m_pFormNode->GetPacketID() ==
+          XFA_XDPPACKET_Template) {
+        pPendingPageSet =
+            pRootPageSetContainerItem->m_pFormNode->CloneTemplateToForm(FALSE);
+      } else {
+        pPendingPageSet = pRootPageSetContainerItem->m_pFormNode;
+      }
+    }
+    if (pRootPageSetContainerItem->m_pFormNode->GetUserData(
+            XFA_LAYOUTITEMKEY) == pRootPageSetContainerItem) {
+      pRootPageSetContainerItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY,
+                                                          NULL);
+    }
+    pRootPageSetContainerItem->m_pFormNode = pPendingPageSet;
+    pPendingPageSet->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+    for (CXFA_ContainerLayoutItem* pContainerItem = iterator.MoveToNext();
+         pContainerItem; pContainerItem = iterator.MoveToNext()) {
+      CXFA_Node* pNode = pContainerItem->m_pFormNode;
+      if (pNode->GetPacketID() != XFA_XDPPACKET_Template) {
+        continue;
+      }
+      switch (pNode->GetClassID()) {
+        case XFA_ELEMENT_PageSet: {
+          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+          pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer(
+              pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE);
+        } break;
+        case XFA_ELEMENT_PageArea: {
+          CXFA_ContainerLayoutItem* pFormLayout = pContainerItem;
+          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+          FX_BOOL bIsExistForm = TRUE;
+          for (int32_t iLevel = 0; iLevel < 3; iLevel++) {
+            pFormLayout = (CXFA_ContainerLayoutItem*)pFormLayout->m_pFirstChild;
+            if (iLevel == 2) {
+              while (pFormLayout &&
+                     !XFA_ItemLayoutProcessor_IsTakingSpace(
+                         pFormLayout->m_pFormNode)) {
+                pFormLayout =
+                    (CXFA_ContainerLayoutItem*)pFormLayout->m_pNextSibling;
+              }
+            }
+            if (pFormLayout == NULL) {
+              bIsExistForm = FALSE;
+              break;
+            }
+          }
+          if (bIsExistForm) {
+            CXFA_Node* pNewSubform = pFormLayout->m_pFormNode;
+            if (pContainerItem->m_pOldSubform &&
+                pContainerItem->m_pOldSubform != pNewSubform) {
+              CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
+                  pDocument, pContainerItem->m_pFormNode->GetClassID(),
+                  pContainerItem->m_pFormNode->GetNameHash(), pParentNode);
+              CXFA_ContainerIterator sIterator(pExistingNode);
+              for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+                   pNode = sIterator.MoveToNext()) {
+                if (pNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+                  CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+                      pNode->GetUserData(XFA_LAYOUTITEMKEY));
+                  if (pLayoutItem) {
+                    pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+                                           XFA_LAYOUTEVENT_ItemRemoving);
+                    delete pLayoutItem;
+                  }
+                }
+              }
+              if (pExistingNode) {
+                pParentNode->RemoveChild(pExistingNode);
+              }
+            }
+            pContainerItem->m_pOldSubform = pNewSubform;
+          }
+          pContainerItem->m_pFormNode = pDocument->DataMerge_CopyContainer(
+              pContainerItem->m_pFormNode, pParentNode,
+              ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)), TRUE);
+        } break;
+        case XFA_ELEMENT_ContentArea: {
+          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+          for (CXFA_Node* pChildNode =
+                   pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+               pChildNode;
+               pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+            if (pChildNode->GetTemplateNode() != pContainerItem->m_pFormNode) {
+              continue;
+            }
+            pContainerItem->m_pFormNode = pChildNode;
+            break;
+          }
+        } break;
+        default:
+          break;
+      }
+    }
+    if (!pPendingPageSet->GetNodeItem(XFA_NODEITEM_Parent)) {
+      CXFA_Node* pFormToplevelSubform =
+          pDocument->GetXFAObject(XFA_HASHCODE_Form)
+              ->AsNode()
+              ->GetFirstChildByClass(XFA_ELEMENT_Subform);
+      pFormToplevelSubform->InsertChild(pPendingPageSet);
+    }
+    pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet);
+    pPendingPageSet->SetFlag(XFA_NODEFLAG_Initialized);
+  }
+  pPendingPageSet = GetRootLayoutItem()->m_pFormNode;
+  while (pPendingPageSet) {
+    CXFA_Node* pNextPendingPageSet =
+        pPendingPageSet->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
+    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+        sIterator(pPendingPageSet);
+    CXFA_Node* pNode = sIterator.GetCurrent();
+    while (pNode) {
+      if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+        if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
+          XFA_ELEMENT eCurId = pNode->GetClassID();
+          if (eCurId == XFA_ELEMENT_PageArea || eCurId == XFA_ELEMENT_PageSet) {
+            CXFA_ContainerIterator iteChild(pNode);
+            CXFA_Node* pChildNode = iteChild.MoveToNext();
+            for (; pChildNode; pChildNode = iteChild.MoveToNext()) {
+              CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+                  pChildNode->GetUserData(XFA_LAYOUTITEMKEY));
+              if (pLayoutItem) {
+                pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+                                       XFA_LAYOUTEVENT_ItemRemoving);
+                delete pLayoutItem;
+              }
+            }
+          } else if (eCurId != XFA_ELEMENT_ContentArea) {
+            CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+                pNode->GetUserData(XFA_LAYOUTITEMKEY));
+            if (pLayoutItem) {
+              pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+                                     XFA_LAYOUTEVENT_ItemRemoving);
+              delete pLayoutItem;
+            }
+          }
+          CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
+          pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
+          pNode = pNext;
+        } else {
+          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+          pNode->SetFlag(XFA_NODEFLAG_Initialized);
+          pNode = sIterator.MoveToNext();
+        }
+      } else {
+        pNode->SetFlag(XFA_NODEFLAG_Initialized);
+        pNode = sIterator.MoveToNext();
+      }
+    }
+    pPendingPageSet = pNextPendingPageSet;
+  }
+}
+void CXFA_LayoutPageMgr::LayoutPageSetContents() {
+  CXFA_ContainerLayoutItem* pRootLayoutItem = GetRootLayoutItem();
+  for (; pRootLayoutItem;
+       pRootLayoutItem =
+           (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
+    CXFA_NodeIteratorTemplate<
+        CXFA_ContainerLayoutItem,
+        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+        iterator(pRootLayoutItem);
+    for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
+         pContainerItem; pContainerItem = iterator.MoveToNext()) {
+      CXFA_Node* pNode = pContainerItem->m_pFormNode;
+      switch (pNode->GetClassID()) {
+        case XFA_ELEMENT_PageArea:
+          m_pLayoutProcessor->GetRootRootItemLayoutProcessor()
+              ->DoLayoutPageArea(pContainerItem);
+          break;
+        default:
+          break;
+      }
+    }
+  }
+}
+void XFA_SyncContainer(IXFA_Notify* pNotify,
+                       IXFA_DocLayout* pDocLayout,
+                       CXFA_LayoutItem* pContainerItem,
+                       FX_DWORD dwRelevant,
+                       FX_BOOL bVisible,
+                       int32_t nPageIndex) {
+  FX_BOOL bVisibleItem = FALSE;
+  FX_DWORD dwStatus = 0;
+  FX_DWORD dwRelevantContainer = 0;
+  if (bVisible) {
+    XFA_ATTRIBUTEENUM eAttributeValue =
+        pContainerItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence);
+    if (eAttributeValue == XFA_ATTRIBUTEENUM_Visible ||
+        eAttributeValue == XFA_ATTRIBUTEENUM_Unknown) {
+      bVisibleItem = TRUE;
+    }
+    dwRelevantContainer =
+        XFA_GetRelevant(pContainerItem->m_pFormNode, dwRelevant);
+    dwStatus =
+        (bVisibleItem ? XFA_LAYOUTSTATUS_Visible : 0) | dwRelevantContainer;
+  }
+  pNotify->OnLayoutEvent(pDocLayout, pContainerItem, XFA_LAYOUTEVENT_ItemAdded,
+                         (void*)(uintptr_t)nPageIndex,
+                         (void*)(uintptr_t)dwStatus);
+  for (CXFA_LayoutItem* pChild = pContainerItem->m_pFirstChild; pChild;
+       pChild = pChild->m_pNextSibling) {
+    if (pChild->IsContentLayoutItem()) {
+      XFA_SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer,
+                        bVisibleItem, nPageIndex);
+    }
+  }
+}
+void CXFA_LayoutPageMgr::SyncLayoutData() {
+  MergePageSetContents();
+  LayoutPageSetContents();
+  IXFA_Notify* pNotify =
+      m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
+  int32_t nPageIdx = -1;
+  CXFA_ContainerLayoutItem* pRootLayoutItem = GetRootLayoutItem();
+  for (; pRootLayoutItem;
+       pRootLayoutItem =
+           (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
+    CXFA_NodeIteratorTemplate<
+        CXFA_ContainerLayoutItem,
+        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+        iteratorParent(pRootLayoutItem);
+    for (CXFA_ContainerLayoutItem* pContainerItem = iteratorParent.GetCurrent();
+         pContainerItem; pContainerItem = iteratorParent.MoveToNext()) {
+      switch (pContainerItem->m_pFormNode->GetClassID()) {
+        case XFA_ELEMENT_PageArea: {
+          nPageIdx++;
+          FX_DWORD dwRelevant =
+              XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
+          CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+                                    CXFA_TraverseStrategy_LayoutItem>
+              iterator(pContainerItem);
+          CXFA_LayoutItem* pChildLayoutItem = iterator.GetCurrent();
+          while (pChildLayoutItem) {
+            CXFA_ContentLayoutItem* pContentItem =
+                pChildLayoutItem->AsContentLayoutItem();
+            if (!pContentItem) {
+              pChildLayoutItem = iterator.MoveToNext();
+              continue;
+            }
+            FX_BOOL bVisible =
+                (pContentItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence) ==
+                 XFA_ATTRIBUTEENUM_Visible);
+            FX_DWORD dwRelevantChild =
+                XFA_GetRelevant(pContentItem->m_pFormNode, dwRelevant);
+            XFA_SyncContainer(pNotify, m_pLayoutProcessor, pContentItem,
+                              dwRelevantChild, bVisible, nPageIdx);
+            pChildLayoutItem = iterator.SkipChildrenAndMoveToNext();
+          }
+        } break;
+        default:
+          break;
+      }
+    }
+  }
+  int32_t nPage = m_PageArray.GetSize();
+  for (int32_t i = nPage - 1; i >= m_nAvailPages; i--) {
+    CXFA_ContainerLayoutItem* pPage = m_PageArray[i];
+    m_PageArray.RemoveAt(i);
+    pNotify->OnPageEvent(pPage, XFA_PAGEEVENT_PageRemoved);
+    delete pPage;
+  }
+  ClearRecordList();
+}
+void XFA_ReleaseLayoutItem_NoPageArea(CXFA_LayoutItem* pLayoutItem) {
+  CXFA_LayoutItem *pNext, *pNode = pLayoutItem->m_pFirstChild;
+  while (pNode) {
+    pNext = pNode->m_pNextSibling;
+    pNode->m_pParent = NULL;
+    XFA_ReleaseLayoutItem_NoPageArea(pNode);
+    pNode = pNext;
+  }
+  if (pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
+    delete pLayoutItem;
+  }
+}
+void CXFA_LayoutPageMgr::PrepareLayout() {
+  m_pPageSetCurRoot = NULL;
+  m_ePageSetMode = XFA_ATTRIBUTEENUM_OrderedOccurrence;
+  m_nAvailPages = 0;
+  ClearRecordList();
+  if (!m_pPageSetLayoutItemRoot) {
+    return;
+  }
+  CXFA_ContainerLayoutItem* pRootLayoutItem = m_pPageSetLayoutItemRoot;
+  if (pRootLayoutItem &&
+      pRootLayoutItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Form) {
+    CXFA_Node* pPageSetFormNode = pRootLayoutItem->m_pFormNode;
+    pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.RemoveAll();
+    if (pPageSetFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+      XFA_ReleaseLayoutItem(pRootLayoutItem);
+      m_pPageSetLayoutItemRoot = NULL;
+      pRootLayoutItem = NULL;
+      pPageSetFormNode = NULL;
+      m_PageArray.RemoveAll();
+    }
+    while (pPageSetFormNode) {
+      CXFA_Node* pNextPageSet =
+          pPageSetFormNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
+      pPageSetFormNode->GetNodeItem(XFA_NODEITEM_Parent)
+          ->RemoveChild(pPageSetFormNode, FALSE);
+      pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.Add(
+          pPageSetFormNode);
+      pPageSetFormNode = pNextPageSet;
+    }
+  }
+  pRootLayoutItem = m_pPageSetLayoutItemRoot;
+  CXFA_ContainerLayoutItem* pNextLayout = NULL;
+  for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
+    pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
+    SaveLayoutItem(pRootLayoutItem);
+    delete pRootLayoutItem;
+  }
+  m_pPageSetLayoutItemRoot = NULL;
+}
diff --git a/xfa/fxfa/parser/xfa_layout_pagemgr_new.h b/xfa/fxfa/parser/xfa_layout_pagemgr_new.h
new file mode 100644
index 0000000..354daa5
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_layout_pagemgr_new.h
@@ -0,0 +1,152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
+#define XFA_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_layout_itemlayout.h"
+
+class CXFA_ContainerRecord {
+ public:
+  CXFA_ContainerRecord(CXFA_ContainerLayoutItem* pPageSet = NULL,
+                       CXFA_ContainerLayoutItem* pPageArea = NULL,
+                       CXFA_ContainerLayoutItem* pContentArea = NULL)
+      : pCurPageSet(pPageSet),
+        pCurPageArea(pPageArea),
+        pCurContentArea(pContentArea) {}
+  CXFA_ContainerLayoutItem* pCurPageSet;
+  CXFA_ContainerLayoutItem* pCurPageArea;
+  CXFA_ContainerLayoutItem* pCurContentArea;
+};
+class CXFA_LayoutPageMgr {
+ public:
+  CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor);
+  ~CXFA_LayoutPageMgr();
+  FX_BOOL InitLayoutPage(CXFA_Node* pFormNode);
+  FX_BOOL PrepareFirstPage(CXFA_Node* pRootSubform);
+  FX_FLOAT GetAvailHeight();
+  FX_BOOL GetNextAvailContentHeight(FX_FLOAT fChildHeight);
+  void SubmitContentItem(CXFA_ContentLayoutItem* pContentLayoutItem,
+                         XFA_ItemLayoutProcessorResult eStatus);
+  void FinishPaginatedPageSets();
+  void SyncLayoutData();
+  int32_t GetPageCount() const;
+  IXFA_LayoutPage* GetPage(int32_t index) const;
+  int32_t GetPageIndex(const IXFA_LayoutPage* pPage) const;
+  inline CXFA_ContainerLayoutItem* GetRootLayoutItem() const {
+    return m_pPageSetLayoutItemRoot;
+  }
+  FX_BOOL ProcessBreakBeforeOrAfter(CXFA_Node* pBreakNode,
+                                    FX_BOOL bBefore,
+                                    CXFA_Node*& pBreakLeaderNode,
+                                    CXFA_Node*& pBreakTrailerNode,
+                                    FX_BOOL& bCreatePage);
+  FX_BOOL ProcessOverflow(CXFA_Node* pFormNode,
+                          CXFA_Node*& pLeaderNode,
+                          CXFA_Node*& pTrailerNode,
+                          FX_BOOL bDataMerge = FALSE,
+                          FX_BOOL bCreatePage = TRUE);
+  CXFA_Node* QueryOverflow(CXFA_Node* pFormNode,
+                           CXFA_LayoutContext* pLayoutContext = NULL);
+  FX_BOOL ProcessBookendLeaderOrTrailer(CXFA_Node* pBookendNode,
+                                        FX_BOOL bLeader,
+                                        CXFA_Node*& pBookendAppendNode);
+  CXFA_LayoutItem* FindOrCreateLayoutItem(CXFA_Node* pFormNode);
+
+ protected:
+  FX_BOOL AppendNewPage(FX_BOOL bFirstTemPage = FALSE);
+  void ReorderPendingLayoutRecordToTail(CXFA_ContainerRecord* pNewRecord,
+                                        CXFA_ContainerRecord* pPrevRecord);
+  void RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
+                          CXFA_ContainerRecord* pPrevRecord);
+  inline CXFA_ContainerRecord* GetCurrentContainerRecord() {
+    CXFA_ContainerRecord* result =
+        ((CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetAt(
+            m_pCurrentContainerRecord));
+    ASSERT(result);
+    return result;
+  }
+  CXFA_ContainerRecord* CreateContainerRecord(CXFA_Node* pPageNode = NULL,
+                                              FX_BOOL bCreateNew = FALSE);
+  void AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
+                             CXFA_Node* pNewPageArea);
+  void AddContentAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
+                                CXFA_Node* pContentArea);
+  FX_BOOL RunBreak(XFA_ELEMENT eBreakType,
+                   XFA_ATTRIBUTEENUM eTargetType,
+                   CXFA_Node* pTarget,
+                   FX_BOOL bStartNew);
+  CXFA_Node* BreakOverflow(CXFA_Node* pOverflowNode,
+                           CXFA_Node*& pLeaderTemplate,
+                           CXFA_Node*& pTrailerTemplate,
+                           FX_BOOL bCreatePage = TRUE);
+  FX_BOOL ResolveBookendLeaderOrTrailer(CXFA_Node* pBookendNode,
+                                        FX_BOOL bLeader,
+                                        CXFA_Node*& pBookendAppendTemplate);
+  FX_BOOL ExecuteBreakBeforeOrAfter(CXFA_Node* pCurNode,
+                                    FX_BOOL bBefore,
+                                    CXFA_Node*& pBreakLeaderTemplate,
+                                    CXFA_Node*& pBreakTrailerTemplate);
+
+  int32_t CreateMinPageRecord(CXFA_Node* pPageArea,
+                              FX_BOOL bTargetPageArea,
+                              FX_BOOL bCreateLast = FALSE);
+  void CreateMinPageSetRecord(CXFA_Node* pPageSet, FX_BOOL bCreateAll = FALSE);
+  void CreateNextMinRecord(CXFA_Node* pRecordNode);
+  FX_BOOL FindPageAreaFromPageSet(CXFA_Node* pPageSet,
+                                  CXFA_Node* pStartChild,
+                                  CXFA_Node* pTargetPageArea = NULL,
+                                  CXFA_Node* pTargetContentArea = NULL,
+                                  FX_BOOL bNewPage = FALSE,
+                                  FX_BOOL bQuery = FALSE);
+  FX_BOOL FindPageAreaFromPageSet_Ordered(CXFA_Node* pPageSet,
+                                          CXFA_Node* pStartChild,
+                                          CXFA_Node* pTargetPageArea = NULL,
+                                          CXFA_Node* pTargetContentArea = NULL,
+                                          FX_BOOL bNewPage = FALSE,
+                                          FX_BOOL bQuery = FALSE);
+  FX_BOOL FindPageAreaFromPageSet_SimplexDuplex(
+      CXFA_Node* pPageSet,
+      CXFA_Node* pStartChild,
+      CXFA_Node* pTargetPageArea = NULL,
+      CXFA_Node* pTargetContentArea = NULL,
+      FX_BOOL bNewPage = FALSE,
+      FX_BOOL bQuery = FALSE,
+      XFA_ATTRIBUTEENUM ePreferredPosition = XFA_ATTRIBUTEENUM_First);
+  FX_BOOL MatchPageAreaOddOrEven(CXFA_Node* pPageArea, FX_BOOL bLastMatch);
+  CXFA_Node* GetNextAvailPageArea(CXFA_Node* pTargetPageArea,
+                                  CXFA_Node* pTargetContentArea = NULL,
+                                  FX_BOOL bNewPage = FALSE,
+                                  FX_BOOL bQuery = FALSE);
+  FX_BOOL GetNextContentArea(CXFA_Node* pTargetContentArea);
+  void InitPageSetMap();
+  void ProcessLastPageSet();
+  inline FX_BOOL IsPageSetRootOrderedOccurrence() {
+    return m_ePageSetMode == XFA_ATTRIBUTEENUM_OrderedOccurrence;
+  }
+  void ClearData();
+  void ClearRecordList();
+  void MergePageSetContents();
+  void LayoutPageSetContents();
+  void PrepareLayout();
+  void SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem);
+  CXFA_LayoutProcessor* m_pLayoutProcessor;
+  CXFA_Node* m_pTemplatePageSetRoot;
+  CXFA_ContainerLayoutItem* m_pPageSetLayoutItemRoot;
+  CXFA_ContainerLayoutItem* m_pPageSetCurRoot;
+  FX_POSITION m_pCurrentContainerRecord;
+  CFX_PtrList m_rgProposedContainerRecord;
+  CXFA_Node* m_pCurPageArea;
+  int32_t m_nAvailPages;
+  int32_t m_nCurPageCount;
+  XFA_ATTRIBUTEENUM m_ePageSetMode;
+  FX_BOOL m_bCreateOverFlowPage;
+  CFX_MapPtrTemplate<CXFA_Node*, int32_t> m_pPageSetMap;
+  CFX_ArrayTemplate<CXFA_ContainerLayoutItem*> m_PageArray;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
diff --git a/xfa/fxfa/parser/xfa_locale.cpp b/xfa/fxfa/parser/xfa_locale.cpp
new file mode 100644
index 0000000..eb8c244
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_locale.cpp
@@ -0,0 +1,377 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_locale.h"
+
+#include "core/include/fxcrt/fx_xml.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+static const FX_WCHAR g_FX_Percent[] = L"z,zzz,zzz,zzz,zzz,zzz%";
+static const FX_WCHAR g_FX_Currency[] = L"$z,zzz,zzz,zzz,zzz,zz9.99";
+static const FX_WCHAR g_FX_Decimal[] = L"z,zzz,zzz,zzz,zzz,zz9.zzz";
+static const FX_WCHAR g_FX_Integer[] = L"z,zzz,zzz,zzz,zzz,zzz";
+
+CXFA_XMLLocale::CXFA_XMLLocale(CXML_Element* pLocaleData) {
+  m_pLocaleData = pLocaleData;
+}
+CXFA_XMLLocale::~CXFA_XMLLocale() {
+  if (m_pLocaleData) {
+    delete m_pLocaleData;
+  }
+}
+void CXFA_XMLLocale::Release() {
+  delete this;
+}
+CFX_WideString CXFA_XMLLocale::GetName() {
+  return m_pLocaleData ? m_pLocaleData->GetAttrValue("name") : CFX_WideString();
+}
+void CXFA_XMLLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                       CFX_WideString& wsNumSymbol) const {
+  CFX_ByteString bsSymbols;
+  CFX_WideString wsName;
+  switch (eType) {
+    case FX_LOCALENUMSYMBOL_Decimal:
+      bsSymbols = "numberSymbols";
+      wsName = FX_WSTRC(L"decimal");
+      break;
+    case FX_LOCALENUMSYMBOL_Grouping:
+      bsSymbols = "numberSymbols";
+      wsName = FX_WSTRC(L"grouping");
+      break;
+    case FX_LOCALENUMSYMBOL_Percent:
+      bsSymbols = "numberSymbols";
+      wsName = FX_WSTRC(L"percent");
+      break;
+    case FX_LOCALENUMSYMBOL_Minus:
+      bsSymbols = "numberSymbols";
+      wsName = FX_WSTRC(L"minus");
+      break;
+    case FX_LOCALENUMSYMBOL_Zero:
+      bsSymbols = "numberSymbols";
+      wsName = FX_WSTRC(L"zero");
+      break;
+    case FX_LOCALENUMSYMBOL_CurrencySymbol:
+      bsSymbols = "currencySymbols";
+      wsName = FX_WSTRC(L"symbol");
+      break;
+    case FX_LOCALENUMSYMBOL_CurrencyName:
+      bsSymbols = "currencySymbols";
+      wsName = FX_WSTRC(L"isoname");
+      break;
+    default:
+      return;
+  }
+  CXML_Element* pElement = m_pLocaleData->GetElement("", bsSymbols);
+  if (!pElement) {
+    return;
+  }
+  GetPattern(pElement, CFX_ByteStringC((const FX_CHAR*)bsSymbols,
+                                       bsSymbols.GetLength() - 1),
+             wsName, wsNumSymbol);
+}
+void CXFA_XMLLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
+  if (!m_pLocaleData) {
+    return;
+  }
+  CFX_ByteString bsSpace;
+  CXML_Element* pNumberSymbols =
+      m_pLocaleData->GetElement(bsSpace, "dateTimeSymbols");
+  if (!pNumberSymbols) {
+    return;
+  }
+  wsDtSymbol = pNumberSymbols->GetContent(0);
+}
+void CXFA_XMLLocale::GetMonthName(int32_t nMonth,
+                                  CFX_WideString& wsMonthName,
+                                  FX_BOOL bAbbr) const {
+  wsMonthName = GetCalendarSymbol("month", nMonth, bAbbr);
+}
+void CXFA_XMLLocale::GetDayName(int32_t nWeek,
+                                CFX_WideString& wsDayName,
+                                FX_BOOL bAbbr) const {
+  wsDayName = GetCalendarSymbol("day", nWeek, bAbbr);
+}
+void CXFA_XMLLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
+                                     FX_BOOL bAM) const {
+  wsMeridiemName = GetCalendarSymbol("meridiem", bAM ? 0 : 1, FALSE);
+}
+void CXFA_XMLLocale::GetTimeZone(FX_TIMEZONE& tz) const {
+  IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
+  pProvider->GetTimeZone(tz);
+}
+void CXFA_XMLLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
+  wsEraName = GetCalendarSymbol("era", bAD ? 1 : 0, FALSE);
+}
+CFX_WideString CXFA_XMLLocale::GetCalendarSymbol(const CFX_ByteStringC& symbol,
+                                                 int index,
+                                                 FX_BOOL bAbbr) const {
+  CFX_ByteString pstrSymbolNames = symbol + "Names";
+  CFX_WideString wsSymbolName = L"";
+  if (m_pLocaleData) {
+    CXML_Element* pChild = m_pLocaleData->GetElement("", "calendarSymbols");
+    if (pChild) {
+      CXML_Element* pSymbolNames = pChild->GetElement("", pstrSymbolNames);
+      if (pSymbolNames) {
+        if (pSymbolNames->GetAttrInteger("abbr") != bAbbr) {
+          pSymbolNames = pChild->GetElement("", pstrSymbolNames, 1);
+        }
+        if (pSymbolNames && pSymbolNames->GetAttrInteger("abbr") == bAbbr) {
+          CXML_Element* pSymbolName =
+              pSymbolNames->GetElement("", symbol, index);
+          if (pSymbolName) {
+            wsSymbolName = pSymbolName->GetContent(0);
+          }
+        }
+      }
+    }
+  }
+  return wsSymbolName;
+}
+void CXFA_XMLLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                    CFX_WideString& wsPattern) const {
+  CXML_Element* pElement = m_pLocaleData->GetElement("", "datePatterns");
+  if (pElement == NULL) {
+    return;
+  }
+  CFX_WideString wsName;
+  switch (eType) {
+    case FX_LOCALEDATETIMESUBCATEGORY_Short:
+      wsName = L"short";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Default:
+    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
+      wsName = L"med";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Full:
+      wsName = L"full";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Long:
+      wsName = L"long";
+      break;
+  }
+  GetPattern(pElement, "datePattern", wsName, wsPattern);
+}
+void CXFA_XMLLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                    CFX_WideString& wsPattern) const {
+  CXML_Element* pElement = m_pLocaleData->GetElement("", "timePatterns");
+  if (pElement == NULL) {
+    return;
+  }
+  CFX_WideString wsName;
+  switch (eType) {
+    case FX_LOCALEDATETIMESUBCATEGORY_Short:
+      wsName = L"short";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Default:
+    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
+      wsName = L"med";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Full:
+      wsName = L"full";
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Long:
+      wsName = L"long";
+      break;
+  }
+  GetPattern(pElement, "timePattern", wsName, wsPattern);
+}
+void CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                                   CFX_WideString& wsPattern) const {
+  CXML_Element* pElement = m_pLocaleData->GetElement("", "numberPatterns");
+  if (pElement == NULL) {
+    return;
+  }
+  switch (eType) {
+    case FX_LOCALENUMPATTERN_Percent:
+      wsPattern = g_FX_Percent;
+      break;
+    case FX_LOCALENUMPATTERN_Currency:
+      wsPattern = g_FX_Currency;
+      break;
+    case FX_LOCALENUMPATTERN_Decimal:
+      wsPattern = g_FX_Decimal;
+      break;
+    case FX_LOCALENUMPATTERN_Integer:
+      wsPattern = g_FX_Integer;
+      break;
+  }
+}
+void CXFA_XMLLocale::GetPattern(CXML_Element* pElement,
+                                const CFX_ByteStringC& bsTag,
+                                const CFX_WideStringC& wsName,
+                                CFX_WideString& wsPattern) const {
+  int32_t iCount = pElement->CountElements("", bsTag);
+  for (int32_t i = 0; i < iCount; i++) {
+    CXML_Element* pChild = pElement->GetElement("", bsTag, i);
+    if (pChild->GetAttrValue("name") == wsName) {
+      wsPattern = pChild->GetContent(0);
+      return;
+    }
+  }
+}
+CXFA_NodeLocale::CXFA_NodeLocale(CXFA_Node* pLocale) {
+  m_pLocale = pLocale;
+}
+CXFA_NodeLocale::~CXFA_NodeLocale() {}
+void CXFA_NodeLocale::Release() {
+  delete this;
+}
+CFX_WideString CXFA_NodeLocale::GetName() {
+  return m_pLocale ? m_pLocale->GetCData(XFA_ATTRIBUTE_Name) : NULL;
+}
+void CXFA_NodeLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                        CFX_WideString& wsNumSymbol) const {
+  switch (eType) {
+    case FX_LOCALENUMSYMBOL_Decimal:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"decimal"));
+      break;
+    case FX_LOCALENUMSYMBOL_Grouping:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"grouping"));
+      break;
+    case FX_LOCALENUMSYMBOL_Percent:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"percent"));
+      break;
+    case FX_LOCALENUMSYMBOL_Minus:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"minus"));
+      break;
+    case FX_LOCALENUMSYMBOL_Zero:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"zero"));
+      break;
+    case FX_LOCALENUMSYMBOL_CurrencySymbol:
+      wsNumSymbol = GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"symbol"));
+      break;
+    case FX_LOCALENUMSYMBOL_CurrencyName:
+      wsNumSymbol =
+          GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"isoname"));
+      break;
+  }
+}
+void CXFA_NodeLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
+  CXFA_Node* pSymbols =
+      m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_DateTimeSymbols) : NULL;
+  wsDtSymbol = pSymbols ? pSymbols->GetContent() : CFX_WideString();
+}
+void CXFA_NodeLocale::GetMonthName(int32_t nMonth,
+                                   CFX_WideString& wsMonthName,
+                                   FX_BOOL bAbbr) const {
+  wsMonthName = GetCalendarSymbol(XFA_ELEMENT_MonthNames, nMonth, bAbbr);
+}
+void CXFA_NodeLocale::GetDayName(int32_t nWeek,
+                                 CFX_WideString& wsDayName,
+                                 FX_BOOL bAbbr) const {
+  wsDayName = GetCalendarSymbol(XFA_ELEMENT_DayNames, nWeek, bAbbr);
+}
+void CXFA_NodeLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
+                                      FX_BOOL bAM) const {
+  wsMeridiemName =
+      GetCalendarSymbol(XFA_ELEMENT_MeridiemNames, bAM ? 0 : 1, FALSE);
+}
+void CXFA_NodeLocale::GetTimeZone(FX_TIMEZONE& tz) const {
+  IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
+  pProvider->GetTimeZone(tz);
+}
+void CXFA_NodeLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
+  wsEraName = GetCalendarSymbol(XFA_ELEMENT_EraNames, bAD ? 1 : 0, FALSE);
+}
+void CXFA_NodeLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                     CFX_WideString& wsPattern) const {
+  switch (eType) {
+    case FX_LOCALEDATETIMESUBCATEGORY_Short:
+      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"short"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
+    case FX_LOCALEDATETIMESUBCATEGORY_Default:
+      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"med"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Full:
+      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"full"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Long:
+      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"long"));
+      break;
+  }
+}
+void CXFA_NodeLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                                     CFX_WideString& wsPattern) const {
+  switch (eType) {
+    case FX_LOCALEDATETIMESUBCATEGORY_Short:
+      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"short"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
+    case FX_LOCALEDATETIMESUBCATEGORY_Default:
+      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"med"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Full:
+      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"full"));
+      break;
+    case FX_LOCALEDATETIMESUBCATEGORY_Long:
+      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"long"));
+      break;
+  }
+}
+void CXFA_NodeLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                                    CFX_WideString& wsPattern) const {
+  switch (eType) {
+    case FX_LOCALENUMPATTERN_Percent:
+      wsPattern = g_FX_Percent;
+      break;
+    case FX_LOCALENUMPATTERN_Currency:
+      wsPattern = g_FX_Currency;
+      break;
+    case FX_LOCALENUMPATTERN_Decimal:
+      wsPattern = g_FX_Decimal;
+      break;
+    case FX_LOCALENUMPATTERN_Integer:
+      wsPattern = g_FX_Integer;
+      break;
+  }
+}
+CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node* pParent,
+                                          const CFX_WideStringC& wsName) const {
+  CXFA_Node* pChild =
+      pParent ? pParent->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL;
+  while (pChild) {
+    CFX_WideString wsChild;
+    if (pChild->GetAttribute(XFA_ATTRIBUTE_Name, wsChild)) {
+      if (wsChild == wsName) {
+        return pChild;
+      }
+    }
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+CFX_WideString CXFA_NodeLocale::GetSymbol(
+    XFA_ELEMENT eElement,
+    const CFX_WideStringC& symbol_type) const {
+  CXFA_Node* pSymbols = m_pLocale ? m_pLocale->GetChild(0, eElement) : NULL;
+  CXFA_Node* pSymbol = GetNodeByName(pSymbols, symbol_type);
+  return pSymbol ? pSymbol->GetContent() : CFX_WideString();
+}
+CFX_WideString CXFA_NodeLocale::GetCalendarSymbol(XFA_ELEMENT eElement,
+                                                  int index,
+                                                  FX_BOOL bAbbr) const {
+  CXFA_Node* pCalendar =
+      m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_CalendarSymbols) : NULL;
+  if (pCalendar) {
+    CXFA_Node* pNode = pCalendar->GetFirstChildByClass(eElement);
+    for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) {
+      if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) {
+        CXFA_Node* pSymbol = pNode->GetChild(index, XFA_ELEMENT_UNKNOWN);
+        return pSymbol ? pSymbol->GetContent() : CFX_WideString();
+      }
+    }
+  }
+  return CFX_WideString();
+}
diff --git a/xfa/fxfa/parser/xfa_locale.h b/xfa/fxfa/parser/xfa_locale.h
new file mode 100644
index 0000000..522df19
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_locale.h
@@ -0,0 +1,93 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LOCALE_H_
+#define XFA_FXFA_PARSER_XFA_LOCALE_H_
+
+#include "xfa/fgas/localization/fgas_locale.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+class CXFA_XMLLocale : public IFX_Locale {
+ public:
+  CXFA_XMLLocale(CXML_Element* pLocaleData);
+  virtual void Release();
+  virtual CFX_WideString GetName();
+  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                 CFX_WideString& wsNumSymbol) const;
+
+  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
+  virtual void GetMonthName(int32_t nMonth,
+                            CFX_WideString& wsMonthName,
+                            FX_BOOL bAbbr = TRUE) const;
+  virtual void GetDayName(int32_t nWeek,
+                          CFX_WideString& wsDayName,
+                          FX_BOOL bAbbr = TRUE) const;
+  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                               FX_BOOL bAM = TRUE) const;
+  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
+  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
+
+  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                             CFX_WideString& wsPattern) const;
+
+ protected:
+  ~CXFA_XMLLocale();
+  void GetPattern(CXML_Element* pElement,
+                  const CFX_ByteStringC& bsTag,
+                  const CFX_WideStringC& wsName,
+                  CFX_WideString& wsPattern) const;
+  CFX_WideString GetCalendarSymbol(const CFX_ByteStringC& symbol,
+                                   int index,
+                                   FX_BOOL bAbbr) const;
+
+ private:
+  CXML_Element* m_pLocaleData;
+};
+class CXFA_NodeLocale : public IFX_Locale {
+ public:
+  CXFA_NodeLocale(CXFA_Node* pLocale);
+  virtual void Release();
+  virtual CFX_WideString GetName();
+  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                                 CFX_WideString& wsNumSymbol) const;
+
+  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
+  virtual void GetMonthName(int32_t nMonth,
+                            CFX_WideString& wsMonthName,
+                            FX_BOOL bAbbr = TRUE) const;
+  virtual void GetDayName(int32_t nWeek,
+                          CFX_WideString& wsDayName,
+                          FX_BOOL bAbbr = TRUE) const;
+  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                               FX_BOOL bAM = TRUE) const;
+  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
+  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
+
+  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                              CFX_WideString& wsPattern) const;
+  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                             CFX_WideString& wsPattern) const;
+
+ protected:
+  ~CXFA_NodeLocale();
+  CXFA_Node* GetNodeByName(CXFA_Node* pParent,
+                           const CFX_WideStringC& wsName) const;
+  CFX_WideString GetSymbol(XFA_ELEMENT eElement,
+                           const CFX_WideStringC& symbol_type) const;
+  CFX_WideString GetCalendarSymbol(XFA_ELEMENT eElement,
+                                   int index,
+                                   FX_BOOL bAbbr) const;
+
+  CXFA_Node* m_pLocale;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_LOCALE_H_
diff --git a/xfa/fxfa/parser/xfa_localemgr.cpp b/xfa/fxfa/parser/xfa_localemgr.cpp
new file mode 100644
index 0000000..c3ec203
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_localemgr.cpp
@@ -0,0 +1,1305 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+
+#include "core/include/fxcodec/fx_codec.h"
+#include "core/include/fxcrt/fx_xml.h"
+#include "core/include/fxge/fx_ge.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_locale.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+const uint8_t g_enUS_Locale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0x9B, 0x30, 0x14, 0x7D, 0x9F, 0xB4,
+    0x7F, 0x40, 0xD6, 0x2A, 0xB5, 0x52, 0x56, 0x6F, 0x8F, 0xA9, 0x88, 0xA5,
+    0x6C, 0x24, 0x9B, 0x3A, 0xD1, 0x55, 0x22, 0x55, 0xB5, 0xBE, 0x4C, 0x0E,
+    0xDC, 0x05, 0x34, 0xB0, 0x23, 0x83, 0x37, 0x05, 0xED, 0xE3, 0x67, 0x07,
+    0xC3, 0xC0, 0xF6, 0x24, 0xC2, 0x4B, 0x7C, 0xCF, 0x3D, 0xE7, 0xE6, 0xDE,
+    0x63, 0x30, 0x84, 0x25, 0x4F, 0x69, 0x09, 0x01, 0xA3, 0x15, 0xAC, 0x10,
+    0xB0, 0xEF, 0x4F, 0x09, 0x0A, 0x32, 0xA8, 0xD3, 0x15, 0xDA, 0xB0, 0x43,
+    0x59, 0xD4, 0xF9, 0xF5, 0xBA, 0x02, 0x51, 0xA4, 0xF4, 0x06, 0x91, 0x50,
+    0x53, 0x59, 0x46, 0x45, 0x72, 0xAA, 0xF6, 0xBC, 0xAC, 0x8D, 0xEA, 0x20,
+    0xE0, 0xC0, 0x45, 0x41, 0x99, 0x62, 0x54, 0x9C, 0x35, 0xF9, 0x83, 0x82,
+    0x6B, 0xB3, 0x26, 0xF7, 0x94, 0x49, 0x2A, 0x4E, 0x21, 0xEE, 0xC2, 0xD7,
+    0xAF, 0x0C, 0xBE, 0x85, 0xBD, 0xF0, 0x26, 0x62, 0x2A, 0xD2, 0xDC, 0x41,
+    0xD7, 0x47, 0x51, 0x94, 0x1E, 0xAE, 0xAB, 0xBF, 0x97, 0x0C, 0x3C, 0x60,
+    0xE9, 0x32, 0xD7, 0xF2, 0x20, 0xEB, 0xC6, 0x81, 0x13, 0x38, 0x36, 0x50,
+    0xED, 0x41, 0x38, 0x99, 0xAF, 0x69, 0xC3, 0x7D, 0xF8, 0x03, 0xFF, 0xE5,
+    0x17, 0x44, 0x90, 0xDA, 0x09, 0x3C, 0xB2, 0xA8, 0xE7, 0x9D, 0xA3, 0x80,
+    0xEE, 0xF7, 0x62, 0x85, 0xDE, 0xA3, 0x91, 0x73, 0x3E, 0xD7, 0x7C, 0x86,
+    0xF9, 0xEC, 0x9A, 0x6B, 0x96, 0xCF, 0x2B, 0x9F, 0x55, 0x3E, 0x9F, 0x7C,
+    0x0E, 0xF9, 0xDC, 0xF1, 0x19, 0xF3, 0x7F, 0x4F, 0x32, 0x7A, 0x32, 0xB7,
+    0x90, 0x5A, 0x91, 0x44, 0xAA, 0x5B, 0x4E, 0x75, 0xAE, 0xD7, 0x5D, 0x92,
+    0xC4, 0xDC, 0x81, 0x76, 0x12, 0x6A, 0x1B, 0x7B, 0x86, 0x8C, 0xB9, 0xE8,
+    0x2E, 0x97, 0xC2, 0x01, 0xB7, 0xA2, 0xB0, 0xA1, 0x84, 0x36, 0x52, 0x8C,
+    0x41, 0x3C, 0xF4, 0x35, 0xEA, 0x71, 0xB4, 0x6B, 0xA6, 0x59, 0xBB, 0x53,
+    0xBB, 0x4D, 0xBB, 0x45, 0xBB, 0x39, 0xBB, 0x2F, 0xBB, 0x29, 0x7F, 0x3F,
+    0xFA, 0x21, 0xCD, 0x0A, 0xA8, 0xFA, 0x67, 0xCF, 0x84, 0x64, 0x1D, 0x2B,
+    0x77, 0xFB, 0x60, 0xC4, 0x23, 0x8F, 0x56, 0x02, 0x4F, 0x2B, 0x28, 0x04,
+    0x04, 0x35, 0xD5, 0xD4, 0x8A, 0x7C, 0xF8, 0x18, 0x62, 0xFD, 0xDB, 0x25,
+    0xC8, 0x3A, 0x1A, 0x42, 0x3C, 0x10, 0x75, 0x60, 0x9D, 0x11, 0x5D, 0xE3,
+    0x0D, 0x3C, 0xD2, 0xA6, 0x01, 0xC1, 0xCE, 0x7B, 0x3A, 0x44, 0xE6, 0x00,
+    0xF9, 0x21, 0xCB, 0x12, 0x91, 0x8D, 0xBA, 0x16, 0x41, 0xAC, 0xAE, 0x20,
+    0x5A, 0x04, 0xDF, 0xD4, 0xA5, 0x27, 0x1C, 0xB8, 0x56, 0x21, 0x23, 0x2D,
+    0x39, 0x3B, 0x20, 0x72, 0xA1, 0xA8, 0x82, 0xEC, 0xAC, 0xB9, 0x40, 0x52,
+    0xE7, 0x5C, 0x34, 0x4A, 0x84, 0x23, 0xEC, 0xE1, 0xE3, 0xC9, 0x84, 0x0A,
+    0x68, 0x8A, 0x6A, 0x34, 0xF1, 0x28, 0x9A, 0x4C, 0x9C, 0xDF, 0xC5, 0xF1,
+    0x5D, 0x92, 0x04, 0xEB, 0xE0, 0x25, 0xC4, 0x23, 0x92, 0x55, 0x61, 0x32,
+    0xEA, 0x65, 0x9A, 0xF3, 0xA4, 0x83, 0x64, 0x86, 0xC0, 0xCC, 0xA9, 0x25,
+    0x1E, 0x3E, 0x9E, 0xCC, 0x65, 0x8C, 0xDA, 0x29, 0xAC, 0xDF, 0xEC, 0x4F,
+    0xA7, 0x38, 0xFB, 0xF9, 0xB9, 0xAA, 0x93, 0x4D, 0xB4, 0xFD, 0xFD, 0x4C,
+    0xF3, 0x2F, 0xED, 0x4B, 0x67, 0xCE, 0x98, 0xA4, 0x74, 0x4C, 0xEA, 0x53,
+    0xF1, 0x9F, 0x43, 0x93, 0xD8, 0xB4, 0xA2, 0x30, 0xFD, 0xE2, 0x41, 0xA4,
+    0x5D, 0xB4, 0xED, 0xF2, 0xB6, 0x6D, 0xDB, 0x10, 0x4F, 0x78, 0x4E, 0x21,
+    0x23, 0x4C, 0xA5, 0x10, 0xC0, 0xD2, 0x13, 0x22, 0x6F, 0x3A, 0xE9, 0x72,
+    0xF9, 0xE7, 0x7A, 0x58, 0xDE, 0xCC, 0xAC, 0x72, 0x04, 0x91, 0x02, 0x6B,
+    0xCC, 0xDF, 0x5F, 0x79, 0x54, 0xD8, 0x9A, 0x62, 0x28, 0xD4, 0x0F, 0x3A,
+    0x09, 0x4D, 0xD9, 0x0C, 0xD2, 0xA2, 0xA2, 0x6A, 0xF3, 0x6F, 0x7B, 0x7D,
+    0x97, 0xB6, 0xD5, 0xC3, 0xBB, 0x95, 0xCB, 0x63, 0xA1, 0x37, 0x7E, 0x31,
+    0x8B, 0x3F, 0x74, 0x7D, 0x35, 0x8B, 0x5E, 0x15, 0x4C, 0xD6, 0x88, 0xBC,
+    0x9D, 0x45, 0x6E, 0x41, 0x70, 0x44, 0xDE, 0xB9, 0x5C, 0x3C, 0x1D, 0x5B,
+    0x21, 0xFD, 0x16, 0x0C, 0x4E, 0x4C, 0x81, 0xFE, 0x66, 0x3B, 0x07, 0x6A,
+    0x9B, 0xD4, 0xA9, 0x31, 0xC9, 0xBB, 0x25, 0x8C, 0xA2, 0xA8, 0xB9, 0x5E,
+    0x20, 0xF2, 0x94, 0x44, 0xB3, 0x45, 0x63, 0xCB, 0x5D, 0x09, 0xB6, 0x7B,
+    0xD5, 0x58, 0xF7, 0x55, 0xA4, 0x96, 0x7F, 0x01, 0x75, 0x37, 0x1B, 0x8B,
+};
+const uint8_t g_enGB_Locale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0xD3, 0x30, 0x14, 0x7D, 0x47, 0xE2,
+    0x1F, 0xA2, 0x88, 0x49, 0x20, 0x6D, 0x33, 0x3C, 0x6E, 0xEA, 0x2C, 0x75,
+    0xEB, 0xD6, 0x32, 0xC8, 0xA8, 0x48, 0xC5, 0xC4, 0x5E, 0x90, 0x9B, 0x78,
+    0x8D, 0x59, 0x62, 0x57, 0x4E, 0xCC, 0x94, 0xFC, 0x02, 0x9F, 0xC0, 0x23,
+    0xCF, 0x08, 0xF1, 0x01, 0xBC, 0xF0, 0x2F, 0x48, 0xFB, 0x0C, 0x6E, 0x1A,
+    0x27, 0x4B, 0x1C, 0xAF, 0x64, 0x79, 0x89, 0xEF, 0xB9, 0xE7, 0xDC, 0xDE,
+    0x7B, 0x9C, 0xB8, 0x19, 0xC5, 0x22, 0x20, 0x31, 0x75, 0x38, 0x49, 0xE8,
+    0x91, 0x4B, 0xF9, 0xA7, 0xE9, 0xB1, 0xEB, 0x84, 0x34, 0x0D, 0x8E, 0xDC,
+    0xBB, 0xAF, 0xBF, 0xEE, 0x7E, 0xFE, 0x78, 0x0E, 0xB7, 0xBF, 0xDF, 0x7E,
+    0xBF, 0x70, 0xF1, 0xA8, 0x24, 0xF2, 0x90, 0x48, 0x3F, 0x4F, 0x96, 0x22,
+    0x4E, 0xB5, 0x66, 0x25, 0xE9, 0x4A, 0x48, 0x46, 0x38, 0x30, 0x12, 0xC1,
+    0xB3, 0xE8, 0x02, 0xE0, 0x54, 0xAF, 0xF1, 0x39, 0xE1, 0x8A, 0xC8, 0x7C,
+    0x84, 0xAA, 0xF0, 0xE9, 0x13, 0x8D, 0x9F, 0xD1, 0xA5, 0xB4, 0x26, 0x3C,
+    0x22, 0x83, 0xA8, 0x87, 0x8E, 0xD7, 0x92, 0xC5, 0x16, 0x6E, 0x5F, 0x7F,
+    0xAE, 0x38, 0xB5, 0x80, 0x71, 0x9F, 0x39, 0x56, 0x2B, 0x95, 0x66, 0x3D,
+    0xD8, 0xA7, 0xEB, 0x8C, 0x26, 0x4B, 0x2A, 0x7B, 0x99, 0x77, 0x41, 0x26,
+    0x6C, 0xF8, 0x85, 0xF8, 0x62, 0x17, 0x4C, 0x68, 0x60, 0x26, 0x50, 0xCB,
+    0xA2, 0x9A, 0xB7, 0x89, 0x1C, 0xB2, 0x5C, 0xCA, 0x23, 0xF7, 0x95, 0xDB,
+    0x72, 0xCE, 0xE6, 0x9A, 0xCD, 0x30, 0x9B, 0x5D, 0x43, 0xCD, 0xB2, 0x79,
+    0x65, 0xB3, 0xCA, 0xE6, 0x93, 0xCD, 0x21, 0x9B, 0x3B, 0x36, 0x63, 0x1E,
+    0xF6, 0x24, 0x24, 0xB9, 0x7E, 0x84, 0x60, 0x85, 0x7D, 0x05, 0x8F, 0x1C,
+    0x74, 0x5E, 0xAE, 0xAB, 0x24, 0xF6, 0x44, 0x0F, 0x5A, 0x28, 0x9A, 0x9A,
+    0xD8, 0x25, 0x0D, 0x79, 0x1F, 0x5D, 0x44, 0x4A, 0xF6, 0xC0, 0x33, 0xC9,
+    0x4C, 0xC8, 0x27, 0x99, 0x92, 0x6D, 0x10, 0x35, 0x7D, 0xB5, 0x7A, 0x6C,
+    0xED, 0x9A, 0x6E, 0xD6, 0xEC, 0xD4, 0x6C, 0xD3, 0x6C, 0xD1, 0x6C, 0xCE,
+    0xEC, 0xCB, 0x6C, 0xCA, 0xDE, 0x4F, 0x42, 0x61, 0x02, 0x46, 0x93, 0xFA,
+    0xDD, 0xD3, 0x21, 0x1E, 0x7B, 0xE0, 0x6E, 0x1D, 0xB4, 0x78, 0x78, 0x6E,
+    0x24, 0x50, 0xB7, 0x02, 0x20, 0x54, 0x12, 0x5D, 0x0D, 0x56, 0xF8, 0xF8,
+    0x64, 0x84, 0xCA, 0x7B, 0x95, 0xC0, 0xE3, 0x49, 0x13, 0xA2, 0x86, 0x58,
+    0x06, 0xC6, 0x19, 0x51, 0x35, 0x9E, 0xD1, 0x39, 0xC9, 0x32, 0x2A, 0xF9,
+    0x66, 0x4F, 0x9B, 0x48, 0x1F, 0x20, 0xD7, 0x2A, 0x8E, 0x5D, 0x7C, 0x0A,
+    0xD7, 0xAE, 0x33, 0x71, 0x3C, 0xB8, 0x9C, 0x8F, 0x70, 0x95, 0x03, 0x36,
+    0x54, 0xA3, 0x8E, 0x56, 0xC6, 0x82, 0xAF, 0x5C, 0xFC, 0x38, 0x4D, 0x42,
+    0x43, 0x2D, 0x19, 0xAA, 0x48, 0x23, 0x21, 0x33, 0xD0, 0x4C, 0x90, 0xE7,
+    0x21, 0xAB, 0x06, 0x75, 0x46, 0x04, 0x20, 0x63, 0x49, 0x6B, 0xE4, 0x56,
+    0xD4, 0x19, 0x79, 0x36, 0x3B, 0xF4, 0xBC, 0x43, 0xDF, 0x77, 0xAE, 0x46,
+    0xA8, 0xC5, 0x31, 0x0A, 0x74, 0x66, 0x7D, 0x94, 0x64, 0x33, 0x6A, 0xAD,
+    0x18, 0xC0, 0xD7, 0x83, 0x6E, 0x14, 0x3D, 0x3A, 0xEA, 0xCC, 0xA4, 0x8D,
+    0x5A, 0x00, 0x56, 0xEF, 0xF4, 0x34, 0xF7, 0xC2, 0x9B, 0x59, 0x92, 0xFA,
+    0xA7, 0x93, 0xB3, 0xDB, 0x4B, 0x12, 0xBD, 0x29, 0xAE, 0x2A, 0x63, 0xDA,
+    0x24, 0xD0, 0x71, 0x55, 0x1E, 0x89, 0xF7, 0xEE, 0x74, 0x62, 0xDD, 0x09,
+    0x60, 0xF0, 0x38, 0x06, 0x2E, 0x2E, 0x76, 0x8B, 0xE2, 0x60, 0xBF, 0x28,
+    0x8A, 0x11, 0xEA, 0xF0, 0x7A, 0x85, 0xB4, 0x30, 0x50, 0x52, 0x52, 0x1E,
+    0xE4, 0x2E, 0x7E, 0x56, 0x49, 0x0F, 0x0E, 0x06, 0x2A, 0xD7, 0x54, 0x06,
+    0x94, 0x67, 0xFA, 0x27, 0x77, 0x2C, 0x2A, 0x64, 0x74, 0xDE, 0x14, 0xAA,
+    0x87, 0xEB, 0x84, 0xBA, 0x6C, 0x48, 0x03, 0x96, 0x10, 0xD8, 0xEC, 0xFD,
+    0x5A, 0x5F, 0xA5, 0x4D, 0x75, 0xF3, 0x67, 0x2A, 0xD4, 0x9A, 0x95, 0x3B,
+    0xBD, 0x3B, 0x88, 0xDF, 0x74, 0xBD, 0x33, 0x88, 0x9E, 0x30, 0xAE, 0x52,
+    0x17, 0xEF, 0x0D, 0x22, 0x17, 0x54, 0x0A, 0x17, 0xBF, 0xEC, 0x73, 0x51,
+    0x77, 0x6C, 0x40, 0x6A, 0xDB, 0x1B, 0x27, 0xBA, 0x40, 0xFD, 0x7C, 0x6D,
+    0x02, 0x17, 0xFF, 0xF9, 0x0E, 0xE7, 0x44, 0x87, 0xD0, 0xAF, 0xA1, 0x25,
+    0x2C, 0x15, 0xE5, 0xC2, 0xC5, 0xD3, 0xE3, 0xF9, 0x60, 0x51, 0xDB, 0xF3,
+    0xBE, 0x04, 0x99, 0xCD, 0x96, 0xEF, 0x42, 0xBE, 0xA6, 0xD7, 0x24, 0x28,
+    0x0F, 0xBB, 0x7A, 0xA9, 0x6B, 0x79, 0x39, 0x7C, 0xDA, 0x84, 0xCE, 0x1C,
+    0xAC, 0x40, 0x6D, 0x66, 0x9D, 0x66, 0x9C, 0x09, 0xFE, 0x60, 0xFA, 0x44,
+    0x28, 0xC9, 0xA8, 0x74, 0xFC, 0x2C, 0xB4, 0xE6, 0xC7, 0x21, 0x7C, 0x50,
+    0x38, 0x73, 0xF6, 0x1F, 0xC2, 0x0C, 0x3E, 0x96, 0xE8, 0xED, 0x16, 0xC2,
+    0x58, 0x92, 0x25, 0xBC, 0x2E, 0x0F, 0x13, 0x16, 0x11, 0x61, 0xD6, 0xF4,
+    0x1B, 0x51, 0xA8, 0x1B, 0xE2, 0x4C, 0x45, 0x16, 0xB1, 0xA0, 0x9C, 0x63,
+    0xEF, 0xC3, 0x6B, 0xC7, 0xDB, 0x46, 0x85, 0x91, 0x83, 0x48, 0xD4, 0xD4,
+    0xF7, 0x5B, 0x7E, 0x14, 0x98, 0xAB, 0x72, 0x32, 0xE7, 0xED, 0x16, 0x92,
+    0x2F, 0x06, 0x90, 0xBC, 0x5C, 0xF1, 0xD5, 0x67, 0xB1, 0xE1, 0xE9, 0xE6,
+    0xD0, 0xFD, 0x9E, 0x95, 0x51, 0xF5, 0x19, 0x0B, 0xCB, 0x7F, 0x8E, 0x69,
+    0xAC, 0xD0};
+const uint8_t g_zhCN_Locale[] = {
+    0x78, 0x9C, 0xED, 0x56, 0x41, 0x4F, 0xD4, 0x40, 0x14, 0xBE, 0x9B, 0xF8,
+    0x1F, 0x9A, 0x46, 0x52, 0x4D, 0x58, 0x46, 0x8F, 0x90, 0xD2, 0x64, 0x03,
+    0x08, 0x06, 0xBB, 0x21, 0x96, 0x68, 0xE0, 0x62, 0xBA, 0xED, 0xB0, 0x2D,
+    0x6C, 0x3B, 0x64, 0xB6, 0x0D, 0x6E, 0x4F, 0x18, 0x82, 0x82, 0xC2, 0x45,
+    0x89, 0x9A, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x9E, 0x8C, 0x01, 0x22, 0xF1,
+    0xCF, 0xB0, 0xCB, 0x91, 0xBF, 0xE0, 0x9B, 0xED, 0xB4, 0xB4, 0xDD, 0xD9,
+    0xB5, 0x3F, 0xC0, 0x3D, 0xCD, 0xFB, 0xDE, 0xF7, 0x7D, 0xF3, 0xDE, 0xEB,
+    0x74, 0xB6, 0x6A, 0x93, 0x58, 0x66, 0x13, 0x4B, 0xBE, 0xE9, 0xE1, 0x49,
+    0x39, 0x72, 0x9E, 0x4F, 0xD5, 0x64, 0xC9, 0xC6, 0x2D, 0x6B, 0x52, 0xBE,
+    0x3C, 0x3D, 0xE9, 0x7E, 0x78, 0x7D, 0xF7, 0xEA, 0xC7, 0xE6, 0xE5, 0xC5,
+    0xFB, 0xEB, 0xDF, 0x7B, 0x10, 0x77, 0x0E, 0x2F, 0xEE, 0xC9, 0x9A, 0xCA,
+    0x14, 0xBE, 0x6D, 0x52, 0xA3, 0xED, 0xD5, 0x49, 0xB3, 0xC5, 0xC5, 0x0D,
+    0x8A, 0x1B, 0x84, 0xBA, 0xA6, 0x0F, 0x0C, 0x8F, 0xF8, 0x81, 0x53, 0x03,
+    0xB8, 0xC5, 0xD7, 0xDA, 0xE5, 0xE9, 0x66, 0xF7, 0x68, 0x47, 0x45, 0x71,
+    0x74, 0xFB, 0x56, 0x02, 0x9F, 0xEF, 0x09, 0xE1, 0xD3, 0x5D, 0x11, 0xDC,
+    0x39, 0x3C, 0x14, 0x9B, 0x1C, 0x08, 0xD9, 0xDB, 0x27, 0x62, 0xEF, 0x2D,
+    0x31, 0xFB, 0x9B, 0x90, 0x7D, 0xF6, 0x59, 0xC8, 0xDE, 0x7F, 0x39, 0x00,
+    0x1E, 0xD0, 0x28, 0xCB, 0x14, 0x7B, 0x45, 0x99, 0x31, 0x25, 0xC4, 0x5E,
+    0x24, 0x99, 0xF5, 0x3A, 0x9D, 0x94, 0x1F, 0xC8, 0xFF, 0xA7, 0x57, 0x7A,
+    0x7A, 0xB6, 0xD9, 0xE6, 0x07, 0x0E, 0x56, 0x5A, 0xF7, 0xD3, 0x71, 0xF7,
+    0xE8, 0xB8, 0xFB, 0xF1, 0x8B, 0x8A, 0x58, 0x18, 0xE7, 0x39, 0x0A, 0x7B,
+    0x88, 0xD0, 0xF3, 0x3D, 0x21, 0x77, 0x57, 0x80, 0xC2, 0x24, 0x85, 0x0E,
+    0x07, 0x22, 0xEE, 0xF6, 0x49, 0x8A, 0xA2, 0xB4, 0xC8, 0x4C, 0xC1, 0x99,
+    0x87, 0xDD, 0x53, 0x15, 0x6A, 0x2E, 0x56, 0x5B, 0xAC, 0xB3, 0x58, 0x61,
+    0xB1, 0xB6, 0x62, 0x55, 0x03, 0xEB, 0xF1, 0x30, 0x75, 0x6D, 0x17, 0x7B,
+    0xC9, 0x6B, 0xCB, 0x43, 0xD8, 0xE0, 0x4D, 0x67, 0x9F, 0x0D, 0x3E, 0x01,
+    0x32, 0x5C, 0x48, 0xBE, 0xED, 0x4B, 0xA2, 0xBC, 0x13, 0x20, 0x98, 0x9A,
+    0xDC, 0x15, 0x56, 0x50, 0xC1, 0xF7, 0xCE, 0xF6, 0x56, 0x67, 0x77, 0x5F,
+    0x45, 0x2C, 0x8C, 0xF3, 0x1C, 0x4D, 0x21, 0x94, 0x6A, 0x58, 0x50, 0xB8,
+    0x71, 0xE2, 0x5E, 0x02, 0xBC, 0x60, 0x06, 0x01, 0xA6, 0x7E, 0xEF, 0x99,
+    0xA7, 0x11, 0xBF, 0x8E, 0x56, 0xC2, 0x66, 0x53, 0xD6, 0x96, 0xE0, 0xA7,
+    0x74, 0xCE, 0x7E, 0x2A, 0xBA, 0x02, 0xA7, 0x47, 0x99, 0x56, 0x60, 0xBC,
+    0xCA, 0x0C, 0xFC, 0x58, 0xEF, 0xA9, 0xA4, 0xE0, 0xC7, 0x1D, 0x9A, 0xC4,
+    0x6F, 0x0C, 0x70, 0x28, 0xA1, 0xF6, 0xB0, 0x1D, 0x8B, 0x2B, 0x7A, 0x65,
+    0xBA, 0x04, 0xBF, 0xE5, 0x10, 0x1A, 0x30, 0x85, 0x90, 0x8F, 0x72, 0xED,
+    0x02, 0x10, 0xB8, 0x5E, 0xA6, 0xFD, 0x4C, 0x94, 0x6B, 0xBF, 0xEA, 0x38,
+    0x50, 0xEF, 0x2F, 0x45, 0xD7, 0x95, 0xCE, 0xCE, 0x2B, 0xC5, 0x30, 0x94,
+    0xAB, 0xAF, 0xEF, 0x14, 0x69, 0x59, 0x45, 0x19, 0x45, 0xC1, 0x2E, 0xD7,
+    0xBD, 0xD8, 0xA0, 0x84, 0xBC, 0xD7, 0x3E, 0xA8, 0x27, 0x74, 0x7D, 0xC2,
+    0x30, 0x4A, 0x08, 0x78, 0xFF, 0x55, 0xA6, 0xE8, 0xA3, 0xA3, 0x5C, 0xBB,
+    0x7C, 0x7E, 0x8B, 0x80, 0x25, 0x07, 0x62, 0xD6, 0xF4, 0x57, 0xD7, 0xE6,
+    0xBC, 0x96, 0x31, 0x33, 0xFD, 0x70, 0xE3, 0xD9, 0x0B, 0x67, 0x3E, 0x5A,
+    0x8E, 0x67, 0x96, 0x25, 0x81, 0xCE, 0x0F, 0xBD, 0x3A, 0xA6, 0x37, 0x83,
+    0xCB, 0xC5, 0xBC, 0x12, 0xC0, 0xE0, 0x00, 0x5B, 0xB2, 0x16, 0x8D, 0x46,
+    0xD1, 0xF8, 0x58, 0x14, 0x45, 0x2A, 0xCA, 0xF1, 0xFA, 0x8C, 0xB8, 0xD0,
+    0x0A, 0x29, 0xC5, 0xBE, 0xD5, 0x96, 0xB5, 0x3B, 0xB1, 0x74, 0x7C, 0xBC,
+    0xA4, 0x72, 0x1D, 0x53, 0x0B, 0xFB, 0x01, 0xDF, 0x72, 0x44, 0xA0, 0x42,
+    0x85, 0xCA, 0x53, 0xA3, 0xA4, 0xB9, 0x5C, 0xC8, 0x6D, 0x6D, 0x6C, 0xB9,
+    0x9E, 0x09, 0xE7, 0x60, 0x2C, 0xD1, 0xC7, 0xE9, 0xA2, 0x3A, 0xFD, 0x07,
+    0x27, 0xE1, 0xBA, 0xCB, 0x1E, 0xFB, 0x68, 0x29, 0x7E, 0x5A, 0xF5, 0x48,
+    0x29, 0xBA, 0xE7, 0xFA, 0x61, 0x4B, 0xD6, 0x2A, 0xA5, 0xC8, 0x11, 0xA6,
+    0x44, 0xD6, 0xEE, 0xF7, 0x73, 0x51, 0xBE, 0x6D, 0x40, 0x92, 0xB1, 0xA7,
+    0x93, 0xC8, 0x03, 0xC9, 0xF9, 0xEA, 0x05, 0xB2, 0x76, 0xFD, 0x07, 0xEE,
+    0xD7, 0x3C, 0xA3, 0xDF, 0x84, 0x6B, 0xDC, 0x16, 0x61, 0x0B, 0x59, 0x9B,
+    0xAA, 0x2D, 0x95, 0x16, 0x65, 0x87, 0xDE, 0x2F, 0x41, 0xC5, 0x6A, 0xD9,
+    0xCB, 0xD0, 0x5E, 0xC7, 0x2B, 0xA6, 0xC5, 0xEE, 0xC7, 0x64, 0xC9, 0xBD,
+    0xAA, 0x36, 0xA9, 0x63, 0xC9, 0x80, 0x57, 0x51, 0x32, 0x02, 0x5B, 0x7A,
+    0x2C, 0xA3, 0x2C, 0x9F, 0x93, 0xF4, 0x36, 0x7C, 0x75, 0xD9, 0xD2, 0x02,
+    0x0C, 0x4C, 0x98, 0x76, 0x7D, 0x97, 0xF8, 0x03, 0xD3, 0x53, 0x24, 0xA4,
+    0x2E, 0xA6, 0xCC, 0x5F, 0x98, 0x8F, 0x4B, 0x58, 0x70, 0xFF, 0x41, 0x98,
+    0xC3, 0x75, 0x8A, 0x37, 0x86, 0x10, 0xAA, 0xD4, 0xAC, 0xC3, 0x4B, 0x35,
+    0x98, 0xB0, 0xE8, 0x98, 0xAE, 0x30, 0x3D, 0x4F, 0xA2, 0x70, 0xCD, 0x94,
+    0x66, 0x49, 0xE0, 0xB8, 0x16, 0xEB, 0xA3, 0xF2, 0xF4, 0x91, 0xA4, 0x0F,
+    0xA3, 0x42, 0xCB, 0x96, 0x43, 0x12, 0xEA, 0x93, 0x21, 0x9B, 0x02, 0x73,
+    0xD8, 0x68, 0x39, 0xA9, 0x1D, 0xFA, 0x8D, 0x55, 0xD2, 0xE3, 0xF1, 0x7D,
+    0xD1, 0xCD, 0x33, 0x63, 0x51, 0xFC, 0x15, 0x0D, 0xCB, 0xBF, 0xC0, 0xE4,
+    0x3D, 0x40};
+const uint8_t g_zhTW_Locale[] = {
+    0x78, 0x9C, 0xED, 0x57, 0xCD, 0x4F, 0xD4, 0x40, 0x14, 0x3F, 0x63, 0xE2,
+    0xFF, 0x30, 0x69, 0x20, 0xD5, 0x04, 0xA8, 0x1E, 0x21, 0xA5, 0xC9, 0xC6,
+    0x45, 0x30, 0x58, 0x42, 0xEC, 0x46, 0x22, 0x17, 0x33, 0xDB, 0x0E, 0xDB,
+    0xC2, 0xB6, 0x43, 0x66, 0xDB, 0xC0, 0xF6, 0x24, 0x12, 0x14, 0x14, 0x62,
+    0xA2, 0xC4, 0x8F, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x89, 0x07, 0x0F, 0x2C,
+    0x51, 0xFF, 0x1A, 0x76, 0x39, 0xFA, 0x2F, 0x38, 0xD3, 0x2F, 0xFA, 0xB1,
+    0xB3, 0xD4, 0xC4, 0xA3, 0x7B, 0x9A, 0xF7, 0xDE, 0xEF, 0xF7, 0xE6, 0xBD,
+    0xDF, 0xBC, 0x7D, 0xD9, 0x95, 0x9B, 0x58, 0x87, 0x4D, 0x04, 0x1C, 0x68,
+    0xA3, 0x29, 0xC1, 0x37, 0x1F, 0xD7, 0x16, 0x05, 0x60, 0xA0, 0x96, 0x3E,
+    0x25, 0x9C, 0x9F, 0x9E, 0xF4, 0xDE, 0x3E, 0xBF, 0x71, 0xD1, 0xD9, 0x3C,
+    0xFF, 0xF9, 0xE6, 0xF7, 0x8F, 0xBD, 0xEE, 0xAB, 0x6F, 0xBD, 0xCE, 0xAF,
+    0x9B, 0x82, 0x72, 0xFD, 0x1A, 0x00, 0x32, 0x63, 0x39, 0x06, 0x24, 0x5A,
+    0xDB, 0xAE, 0xE3, 0x66, 0x2B, 0x4A, 0xD0, 0x20, 0xA8, 0x81, 0x89, 0x05,
+    0x1D, 0x86, 0x1A, 0x02, 0xB2, 0x8D, 0x1D, 0xD7, 0x9C, 0xA7, 0xA1, 0x16,
+    0xB3, 0x87, 0x42, 0x5B, 0x39, 0x3F, 0x7D, 0xD2, 0x3B, 0xDA, 0x91, 0xA5,
+    0xD0, 0x4A, 0x07, 0xCE, 0xF6, 0x38, 0x81, 0xD3, 0xDD, 0xFE, 0x81, 0xEE,
+    0xE1, 0x21, 0x2F, 0xD5, 0x01, 0x87, 0xB1, 0x7D, 0xC2, 0xBB, 0x63, 0x8B,
+    0xC7, 0xF8, 0xC2, 0x61, 0x74, 0x3E, 0x72, 0x18, 0xFB, 0x9B, 0xDC, 0x00,
+    0xB7, 0x79, 0x16, 0xCB, 0xF7, 0x0F, 0xA2, 0x73, 0x22, 0x61, 0x5A, 0x52,
+    0x00, 0xEB, 0x75, 0x32, 0x25, 0xDC, 0x16, 0xFE, 0x6B, 0xFB, 0x8F, 0xB4,
+    0x35, 0x60, 0x3B, 0x35, 0xAC, 0xD4, 0x52, 0x7A, 0xEF, 0x8F, 0x7B, 0x47,
+    0xC7, 0xBD, 0x77, 0x9F, 0x64, 0x89, 0x99, 0x39, 0x3F, 0xBD, 0xAF, 0xBF,
+    0xFF, 0x6C, 0x8F, 0x83, 0xDF, 0xED, 0xEB, 0xA7, 0x4A, 0x73, 0xF2, 0x1C,
+    0xF4, 0xC7, 0x6F, 0x9F, 0x24, 0x7E, 0x10, 0x9C, 0xFA, 0x34, 0x91, 0x1B,
+    0x8F, 0x80, 0x5D, 0xE8, 0xA3, 0xD8, 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5,
+    0x7A, 0x8B, 0x95, 0x0E, 0xAC, 0xD1, 0x46, 0xC4, 0x32, 0x2C, 0x64, 0xA7,
+    0x57, 0x43, 0xE4, 0xA2, 0xD7, 0xBD, 0xE8, 0xEE, 0xB3, 0x87, 0x8A, 0x1D,
+    0xF9, 0xF0, 0xCB, 0x42, 0x18, 0x5C, 0x9A, 0xA9, 0x4B, 0x10, 0x81, 0xA9,
+    0xFC, 0xD4, 0xA2, 0x35, 0x7D, 0xED, 0x6E, 0x6F, 0x75, 0x77, 0xF7, 0x65,
+    0x89, 0x99, 0x39, 0x7F, 0xE2, 0x04, 0xC1, 0x29, 0xE6, 0xD2, 0x65, 0x27,
+    0xE5, 0xB6, 0x5D, 0xE8, 0x35, 0xA0, 0x8B, 0x16, 0xA0, 0xEB, 0x22, 0xE2,
+    0x24, 0xD2, 0x27, 0x9E, 0x68, 0x21, 0x2E, 0x7B, 0xCD, 0xA6, 0xA0, 0x3C,
+    0xA2, 0x1F, 0xB1, 0xDB, 0xF9, 0x2E, 0xAA, 0x22, 0x9D, 0x41, 0xB1, 0x2A,
+    0xD2, 0x87, 0x10, 0xA7, 0xE9, 0x87, 0xE9, 0x92, 0x50, 0x78, 0x39, 0x9A,
+    0xD8, 0x69, 0x70, 0x72, 0x94, 0xE2, 0xDB, 0xC8, 0x08, 0xE9, 0x92, 0x2A,
+    0x55, 0x4B, 0x31, 0x5A, 0x26, 0x26, 0x2E, 0x9F, 0x03, 0x40, 0xC6, 0x13,
+    0xC9, 0xE1, 0x5A, 0x76, 0x4E, 0x8E, 0x94, 0x27, 0x23, 0x47, 0xC5, 0x34,
+    0xC5, 0xDE, 0x87, 0xA7, 0xA2, 0xAA, 0x8A, 0xDD, 0x9D, 0x67, 0xA2, 0xA6,
+    0x89, 0x17, 0x9F, 0x5F, 0x8B, 0x60, 0x49, 0x96, 0x52, 0x0C, 0x5E, 0x8A,
+    0x50, 0x8D, 0xFE, 0x29, 0x4A, 0x25, 0x08, 0xE4, 0xA8, 0x00, 0x73, 0x52,
+    0x55, 0x27, 0x35, 0xAD, 0x14, 0x25, 0xD2, 0x23, 0x24, 0xE5, 0x19, 0x4C,
+    0x8D, 0x5C, 0xEF, 0xD1, 0x70, 0xD4, 0xA8, 0x37, 0x9E, 0x98, 0x19, 0xE8,
+    0xAC, 0xAC, 0xCE, 0xDA, 0x2D, 0x6D, 0xBA, 0x7A, 0x77, 0x7D, 0x71, 0xC3,
+    0x9C, 0xF3, 0x97, 0x42, 0x11, 0xD3, 0xA0, 0x80, 0xE9, 0x78, 0x76, 0x1D,
+    0x91, 0xAC, 0x92, 0x19, 0x5F, 0x54, 0x14, 0xF5, 0xD1, 0x99, 0xD7, 0x05,
+    0xC5, 0x1F, 0xF5, 0xFD, 0x89, 0x71, 0xDF, 0xF7, 0x65, 0x29, 0x83, 0xE3,
+    0x53, 0x75, 0x8F, 0x10, 0xE4, 0xE8, 0x6D, 0x41, 0x19, 0x0E, 0xC9, 0x13,
+    0x13, 0xA5, 0xB9, 0x6B, 0x88, 0xE8, 0xC8, 0x71, 0xA3, 0x6B, 0x47, 0x8A,
+    0x3C, 0xA6, 0x47, 0xA1, 0x87, 0xA4, 0xAF, 0xCB, 0x56, 0x87, 0xB2, 0xAE,
+    0x28, 0xBD, 0x81, 0x74, 0xCB, 0x86, 0x74, 0x48, 0xC6, 0xE3, 0x2C, 0x61,
+    0x98, 0x4B, 0x68, 0x10, 0xEC, 0xAD, 0x59, 0x6C, 0x26, 0x46, 0x4B, 0x32,
+    0x92, 0x0E, 0x46, 0x4A, 0x12, 0x6C, 0xCB, 0xF1, 0x5A, 0x82, 0x32, 0x56,
+    0x12, 0xEE, 0x23, 0x82, 0x05, 0xE5, 0x56, 0x01, 0x7D, 0x29, 0x4C, 0xE6,
+    0xBD, 0xE3, 0xC7, 0xC8, 0x28, 0x93, 0x75, 0xC6, 0x63, 0x18, 0x18, 0x82,
+    0x32, 0x5F, 0x1B, 0xA6, 0x2B, 0x29, 0x83, 0x18, 0xC0, 0xB2, 0x5A, 0x98,
+    0x1D, 0x04, 0xA5, 0xB6, 0x58, 0xFD, 0x0B, 0x5A, 0xFA, 0x21, 0x0A, 0xA4,
+    0x60, 0x27, 0x16, 0xEA, 0x66, 0x4B, 0xA0, 0xBD, 0x86, 0x96, 0xA1, 0x1E,
+    0xAF, 0xE0, 0xD8, 0x8C, 0x72, 0x56, 0x0C, 0x5C, 0x47, 0x40, 0xA5, 0xAF,
+    0x05, 0x34, 0xD7, 0x00, 0xF7, 0x05, 0xA9, 0x2F, 0x4C, 0x6D, 0xD3, 0x9F,
+    0x90, 0x06, 0x58, 0xA0, 0x32, 0x72, 0x00, 0x96, 0x63, 0x61, 0x67, 0x00,
+    0xE0, 0x0E, 0xF6, 0x88, 0x85, 0x08, 0xBB, 0x85, 0x83, 0x08, 0x4B, 0x59,
+    0xB0, 0xAE, 0x84, 0xCC, 0xA2, 0x3A, 0x41, 0xEB, 0x03, 0x21, 0x15, 0x02,
+    0xEB, 0xF4, 0x8B, 0x38, 0x08, 0x52, 0x33, 0xA1, 0xC5, 0x01, 0xCC, 0x61,
+    0xDF, 0x5B, 0x85, 0x60, 0x06, 0xBB, 0xA6, 0xA5, 0xB3, 0x9E, 0xC6, 0x1E,
+    0xDE, 0x03, 0xEA, 0x60, 0x30, 0x15, 0x40, 0x37, 0x71, 0x0C, 0x7E, 0x30,
+    0xF0, 0x6A, 0x0D, 0x5F, 0x21, 0x77, 0xF4, 0x2A, 0x6D, 0xCF, 0x69, 0xAC,
+    0xE0, 0x00, 0x19, 0xDE, 0x1E, 0x2C, 0xB6, 0xD4, 0x7B, 0xCA, 0x52, 0xF8,
+    0x67, 0x41, 0xF9, 0x03, 0x11, 0xC2, 0x4A, 0xC9};
+const uint8_t g_zhHK_Locale[] = {
+    0x78, 0x9C, 0xA5, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2,
+    0x7F, 0x98, 0x6C, 0x20, 0x0B, 0x09, 0x50, 0x8A, 0x9F, 0x25, 0xCB, 0x26,
+    0x44, 0x90, 0x9A, 0x5A, 0x43, 0x2C, 0xD1, 0xC8, 0xC5, 0x6C, 0x77, 0x87,
+    0xEE, 0x42, 0x77, 0x87, 0x4C, 0xB7, 0xC1, 0x6E, 0x3C, 0x88, 0x04, 0xA5,
+    0x5A, 0x2E, 0x4A, 0x54, 0x02, 0x86, 0x78, 0x50, 0x0F, 0x48, 0xBC, 0x78,
+    0x68, 0x89, 0xC6, 0x3F, 0x43, 0x8B, 0x9E, 0xFC, 0x0B, 0xCE, 0xEC, 0x17,
+    0xFB, 0x35, 0x6D, 0x8D, 0x3D, 0xCD, 0xFB, 0xBC, 0xCF, 0xF3, 0xCE, 0xFB,
+    0x3E, 0x33, 0x3B, 0x01, 0xA1, 0x8C, 0x64, 0xA9, 0x0C, 0x81, 0x21, 0xE9,
+    0x70, 0x9A, 0xB3, 0xD4, 0x87, 0xD9, 0x1C, 0x07, 0x14, 0x58, 0x91, 0xA7,
+    0xB9, 0xD3, 0xE6, 0x71, 0xE7, 0xCD, 0xF3, 0xE1, 0xB3, 0xD6, 0xC6, 0xE9,
+    0x8F, 0xD7, 0x7F, 0xBE, 0x37, 0x7E, 0x7F, 0xDA, 0xEB, 0x34, 0xBF, 0x9E,
+    0xD5, 0x5B, 0xED, 0xED, 0xA3, 0x5F, 0x1F, 0x1A, 0x9D, 0xDD, 0x9F, 0xED,
+    0xC6, 0xC9, 0x08, 0x27, 0x5E, 0xBC, 0x00, 0x80, 0x40, 0x8B, 0x18, 0x8A,
+    0x84, 0x0B, 0x35, 0xBD, 0x88, 0xCA, 0x15, 0xB7, 0x5E, 0x09, 0xC3, 0x12,
+    0xC2, 0x9A, 0x64, 0x50, 0xD6, 0x00, 0x10, 0x74, 0x64, 0x98, 0xEA, 0x1D,
+    0x92, 0xAA, 0xD0, 0x78, 0xC0, 0x89, 0xC5, 0xD3, 0xE6, 0x93, 0xCE, 0xC1,
+    0xB6, 0x90, 0x72, 0xA2, 0x60, 0xE2, 0xA4, 0xC1, 0x48, 0x34, 0xEB, 0xC9,
+    0x89, 0xF6, 0xFE, 0x3E, 0xAB, 0xD4, 0x2E, 0x43, 0xB1, 0x75, 0xCC, 0xDA,
+    0x63, 0x93, 0xA5, 0x38, 0x62, 0x28, 0x5A, 0xEF, 0x19, 0x8A, 0x9D, 0x0D,
+    0x66, 0x82, 0x39, 0x3C, 0xCD, 0x45, 0xE7, 0x07, 0xEE, 0xDA, 0xB7, 0x30,
+    0x68, 0x29, 0x90, 0x8A, 0x45, 0x3C, 0xCD, 0xA5, 0xB9, 0x60, 0x95, 0x74,
+    0x72, 0xF1, 0xC9, 0x64, 0xF8, 0x52, 0x32, 0x7C, 0x39, 0x19, 0xBE, 0x92,
+    0x0C, 0x5F, 0x4D, 0x86, 0xAF, 0x25, 0xC3, 0xD7, 0x93, 0xE1, 0x4C, 0x32,
+    0x9C, 0x9E, 0x60, 0xE0, 0x8C, 0x39, 0xD3, 0x93, 0x3D, 0x0D, 0x54, 0xA4,
+    0x5A, 0xE0, 0x46, 0x92, 0x48, 0xEC, 0xBC, 0x3B, 0xEC, 0x1C, 0x1C, 0x76,
+    0xDE, 0x7E, 0x14, 0x52, 0x34, 0x8C, 0xE0, 0xE4, 0xC0, 0x92, 0xF1, 0x93,
+    0x06, 0x83, 0x5F, 0x4F, 0xC4, 0xC9, 0x55, 0x65, 0xD4, 0xD9, 0x4D, 0xE6,
+    0x6F, 0x1D, 0xFB, 0x38, 0xB0, 0x57, 0x09, 0x43, 0x44, 0xEE, 0x80, 0xAD,
+    0x8E, 0xCD, 0x11, 0x9F, 0x20, 0xDE, 0x7B, 0xBC, 0xEB, 0x78, 0xBF, 0xF1,
+    0x4E, 0xBB, 0xF6, 0xA8, 0x43, 0xAC, 0x29, 0x1A, 0xD4, 0x83, 0xDF, 0xBF,
+    0x0B, 0x91, 0xED, 0x5E, 0xB4, 0x77, 0xE8, 0x41, 0x79, 0x40, 0x34, 0xFD,
+    0x32, 0x96, 0x06, 0xE7, 0x61, 0x60, 0x13, 0x88, 0xA5, 0x40, 0x7D, 0x12,
+    0x91, 0x9E, 0xBE, 0xB4, 0xB7, 0x36, 0xDB, 0xF5, 0x1D, 0x21, 0x45, 0xC3,
+    0x08, 0xEE, 0x83, 0xC0, 0x5E, 0x79, 0x5A, 0xF2, 0xA2, 0xA5, 0x22, 0x4F,
+    0x9A, 0x83, 0x2A, 0x92, 0x09, 0x17, 0x24, 0xD3, 0x84, 0xD8, 0xF0, 0xAD,
+    0xF7, 0x11, 0xF7, 0xD5, 0x5B, 0xAE, 0x96, 0xCB, 0x9C, 0xF8, 0x80, 0xFC,
+    0xF8, 0x76, 0xEB, 0x1B, 0x9F, 0xE7, 0xC9, 0x1D, 0xE4, 0x67, 0x79, 0x72,
+    0x10, 0x3C, 0x98, 0x23, 0x3F, 0x6A, 0x8C, 0xAF, 0x61, 0x15, 0x29, 0x23,
+    0xA3, 0xC4, 0x28, 0xD2, 0x97, 0x5E, 0x87, 0xCA, 0xFF, 0xC8, 0x2B, 0x2A,
+    0xC2, 0x26, 0x2D, 0xD0, 0x53, 0x0E, 0x40, 0x08, 0x71, 0x7D, 0x32, 0x35,
+    0x3D, 0xE2, 0x53, 0x00, 0x09, 0xF9, 0x34, 0xA3, 0xAA, 0x7C, 0x67, 0xEF,
+    0x29, 0x9F, 0xCF, 0xF3, 0xED, 0xED, 0x67, 0x7C, 0xA1, 0xC0, 0x9F, 0x7D,
+    0x7E, 0xC5, 0x83, 0x25, 0x21, 0x15, 0x50, 0xB0, 0x4A, 0x38, 0x2E, 0x25,
+    0x97, 0xE8, 0xAB, 0x80, 0x6D, 0x13, 0xD1, 0x4F, 0xE5, 0xF3, 0x53, 0x85,
+    0x42, 0x5F, 0x12, 0xD7, 0x9A, 0x19, 0xAA, 0x89, 0x0A, 0xA8, 0x19, 0x91,
+    0xD1, 0xDD, 0x4B, 0xB3, 0x48, 0x50, 0xEF, 0x26, 0xCD, 0x4B, 0xC6, 0xCA,
+    0x6A, 0x56, 0xAF, 0x14, 0xE6, 0x66, 0x6F, 0xAE, 0xDF, 0x7F, 0xA4, 0xE6,
+    0xAC, 0x25, 0xC7, 0xC3, 0x20, 0xC9, 0x56, 0x1A, 0x55, 0xBD, 0x08, 0x71,
+    0xD8, 0xC8, 0x10, 0xE6, 0xF6, 0x44, 0x30, 0xF2, 0x2D, 0xC8, 0x9C, 0x68,
+    0x8D, 0x5A, 0x56, 0x66, 0xDC, 0xB2, 0x2C, 0x21, 0x15, 0xE2, 0xB1, 0xA5,
+    0x72, 0x15, 0x63, 0x68, 0xC8, 0x35, 0x4E, 0x1C, 0x74, 0xC4, 0x99, 0xCC,
+    0xE3, 0x61, 0x7F, 0x39, 0xD2, 0x77, 0x9D, 0x35, 0x88, 0x65, 0x68, 0x98,
+    0x6E, 0x0B, 0x43, 0x71, 0x1D, 0xF5, 0x26, 0x36, 0x8F, 0x3F, 0xE3, 0xF9,
+    0xD8, 0x03, 0x61, 0xC8, 0x2D, 0xAF, 0x40, 0x59, 0xD3, 0x25, 0x72, 0x5F,
+    0xC6, 0xBD, 0x2A, 0x4E, 0x9A, 0x29, 0x28, 0x61, 0x54, 0x5D, 0xD3, 0xE8,
+    0xF5, 0x18, 0xED, 0x53, 0xE1, 0x4F, 0x30, 0xD4, 0xA7, 0x40, 0xD7, 0x8C,
+    0x6A, 0x85, 0x13, 0xC7, 0xFA, 0xA4, 0x5B, 0x10, 0x23, 0x4E, 0x9C, 0x88,
+    0xB1, 0xCF, 0x8D, 0x09, 0x9D, 0xBD, 0x77, 0x30, 0x21, 0x67, 0xC2, 0xA0,
+    0x77, 0x23, 0xED, 0x80, 0x13, 0xB3, 0xB9, 0x41, 0xF2, 0x6C, 0x85, 0x18,
+    0x5D, 0x54, 0x5A, 0x05, 0xD1, 0x05, 0x95, 0xCD, 0xFE, 0x83, 0x2C, 0x78,
+    0x10, 0x31, 0x91, 0xFD, 0x6E, 0xC6, 0xFA, 0xA6, 0xEF, 0x41, 0x6D, 0x0D,
+    0x2E, 0x4B, 0xB2, 0xF7, 0x4C, 0x7B, 0xA1, 0x5B, 0x73, 0x46, 0x41, 0x45,
+    0x08, 0xF2, 0xE4, 0xB4, 0x40, 0xC1, 0x54, 0xC0, 0x6D, 0x2E, 0x95, 0x48,
+    0xCB, 0xD7, 0xC8, 0xDF, 0x92, 0x0A, 0x58, 0x20, 0x36, 0x32, 0x08, 0x9A,
+    0xA1, 0x21, 0xA3, 0x0B, 0xE1, 0x06, 0xAA, 0x62, 0x0D, 0x62, 0xBA, 0x0B,
+    0x83, 0xE1, 0xB4, 0xB2, 0xA0, 0xF5, 0xA4, 0x64, 0x61, 0x11, 0xC3, 0xF5,
+    0xAE, 0x94, 0x19, 0x2C, 0x15, 0xC9, 0x47, 0xD9, 0x8D, 0xB2, 0xA8, 0x4A,
+    0x1A, 0x83, 0x90, 0x43, 0x56, 0x75, 0x55, 0x02, 0xF3, 0xC8, 0x54, 0x35,
+    0x99, 0xCE, 0x34, 0x76, 0xEF, 0x16, 0xC8, 0x77, 0x27, 0x13, 0x03, 0x64,
+    0x15, 0x79, 0xE4, 0xBB, 0x5D, 0xB7, 0x2E, 0xA0, 0x1E, 0x76, 0xBB, 0xA7,
+    0x52, 0xAB, 0x1A, 0xA5, 0x15, 0x64, 0x33, 0x9D, 0xDD, 0xED, 0x47, 0x2E,
+    0x70, 0x9E, 0x42, 0xCA, 0xF9, 0x27, 0x42, 0xFC, 0x0B, 0xD9, 0x0E, 0x4B,
+    0xED};
+const uint8_t g_jaJP_Locale[] = {
+    0x78, 0x9C, 0xED, 0x56, 0xCB, 0x6E, 0xD3, 0x40, 0x14, 0x5D, 0x17, 0x89,
+    0x7F, 0x18, 0x59, 0x20, 0x83, 0xD4, 0xD6, 0x0D, 0xEF, 0x56, 0xAE, 0xA5,
+    0x8A, 0x96, 0x86, 0x16, 0xA3, 0x08, 0x57, 0xA0, 0x76, 0x83, 0x26, 0xF6,
+    0x34, 0x99, 0x36, 0x9E, 0xA9, 0x26, 0xB6, 0x4A, 0xBC, 0xE2, 0x21, 0x20,
+    0x48, 0x74, 0x01, 0x1B, 0x04, 0x44, 0x62, 0x55, 0x40, 0x02, 0x04, 0x8B,
+    0x6E, 0xD8, 0xD0, 0xAF, 0x49, 0x5A, 0x56, 0xFC, 0x02, 0x33, 0x7E, 0xC5,
+    0x8E, 0xED, 0xE0, 0xEE, 0xF1, 0x22, 0x99, 0x7B, 0x7C, 0xCE, 0xF5, 0xBD,
+    0xE7, 0x8E, 0x47, 0x56, 0x5B, 0xD4, 0x84, 0x2D, 0x04, 0x08, 0xB4, 0xD1,
+    0xBC, 0xB4, 0x05, 0xEF, 0xAF, 0xD4, 0x24, 0x60, 0xA1, 0xB6, 0x39, 0x2F,
+    0x0D, 0xDE, 0xEC, 0x1F, 0x7F, 0xFF, 0x76, 0x8E, 0xFF, 0x0D, 0x7A, 0x5F,
+    0xCF, 0x4B, 0xDA, 0xE9, 0x53, 0x00, 0xA8, 0x82, 0x4C, 0x2C, 0xC8, 0x8C,
+    0x8E, 0x5D, 0xA7, 0xAD, 0x76, 0xA8, 0x6B, 0x30, 0xD4, 0xA0, 0x0C, 0x43,
+    0x22, 0x58, 0x13, 0x40, 0xB5, 0x29, 0x71, 0x9A, 0xB7, 0xF9, 0xAD, 0xB6,
+    0x88, 0x27, 0x82, 0x58, 0xAB, 0x0C, 0x7A, 0x5D, 0x55, 0x09, 0xD6, 0x09,
+    0xF8, 0x42, 0x3E, 0x7C, 0x31, 0x1F, 0xBE, 0x94, 0x0F, 0x5F, 0xCE, 0x87,
+    0xAF, 0xE4, 0xC3, 0x57, 0xF3, 0xE1, 0x6B, 0xF9, 0xF0, 0x6C, 0x3E, 0x5C,
+    0x99, 0x29, 0xC0, 0x0B, 0xFA, 0xAC, 0x8C, 0x34, 0x0A, 0xC2, 0x75, 0xEC,
+    0x53, 0xD2, 0x37, 0x00, 0xEB, 0x75, 0x36, 0x2F, 0x55, 0xA4, 0xFF, 0x06,
+    0x9E, 0xC4, 0x40, 0x0B, 0x76, 0x12, 0xDB, 0x8E, 0x47, 0x9A, 0xD8, 0xBE,
+    0xEF, 0x7B, 0xFC, 0x57, 0x55, 0x44, 0x38, 0xC4, 0x7B, 0xDD, 0x5C, 0xFC,
+    0xE8, 0xD1, 0x97, 0x7C, 0xFE, 0x8F, 0x83, 0x82, 0x3C, 0x9F, 0x73, 0xF1,
+    0xDF, 0xCF, 0x5F, 0xE5, 0xE2, 0xFD, 0xDE, 0x87, 0x11, 0x1C, 0xF8, 0xAB,
+    0x9C, 0x26, 0x46, 0xF6, 0x40, 0xD8, 0x4D, 0xB6, 0x8F, 0x6C, 0x07, 0xD9,
+    0xDA, 0xB3, 0x55, 0x67, 0xEB, 0xCD, 0x56, 0x5A, 0x5C, 0xA3, 0x8D, 0x18,
+    0xB6, 0x30, 0xB2, 0x93, 0x2F, 0x79, 0x08, 0x69, 0xFD, 0xBD, 0x6E, 0xFF,
+    0xC5, 0x1E, 0x1F, 0x4E, 0x04, 0x64, 0x6F, 0xFF, 0x7A, 0x99, 0xBE, 0x0D,
+    0x86, 0x61, 0xE2, 0x21, 0x88, 0xC1, 0x44, 0x7E, 0x1E, 0x69, 0x47, 0x07,
+    0x0F, 0xFB, 0x4F, 0x9F, 0xF8, 0xD9, 0x45, 0x18, 0xE3, 0xC7, 0xFB, 0x87,
+    0x83, 0x77, 0x1F, 0x63, 0x10, 0xF8, 0xAB, 0x48, 0xCB, 0x8F, 0x2D, 0x65,
+    0xE4, 0xDC, 0x0A, 0x50, 0x0B, 0x3A, 0xA8, 0x06, 0x1D, 0x07, 0x31, 0x12,
+    0x5B, 0x1F, 0x23, 0xE1, 0xD1, 0xB6, 0xE9, 0xB6, 0x5A, 0x92, 0xB6, 0xCE,
+    0x2F, 0xB9, 0xFF, 0xF3, 0x40, 0xD6, 0x65, 0x6E, 0xB8, 0xBC, 0x28, 0xF3,
+    0x41, 0xC8, 0x4B, 0xFC, 0x12, 0xBE, 0xC4, 0x92, 0xA2, 0x1C, 0x2D, 0x4A,
+    0x1A, 0x05, 0x39, 0x4A, 0xE9, 0x6D, 0x64, 0x05, 0x72, 0x45, 0xD7, 0x95,
+    0xC5, 0xC5, 0x52, 0x9A, 0x76, 0x93, 0x32, 0x47, 0xA8, 0xF2, 0x35, 0x00,
+    0xA4, 0x90, 0xD0, 0x10, 0x07, 0xDB, 0x23, 0x86, 0x24, 0x90, 0x94, 0x21,
+    0x55, 0x79, 0xF0, 0xF6, 0xB1, 0xAC, 0xEB, 0x72, 0xBF, 0xFB, 0x4C, 0x36,
+    0x0C, 0xF9, 0xE8, 0xD3, 0x6B, 0x79, 0x43, 0x55, 0x12, 0xF4, 0x22, 0x7D,
+    0x60, 0x46, 0x75, 0x4E, 0xD7, 0xE7, 0x0C, 0x63, 0xAE, 0x9C, 0xC6, 0x37,
+    0x20, 0x94, 0x94, 0x12, 0x84, 0xDD, 0x0B, 0xC9, 0x28, 0x5F, 0x74, 0x3E,
+    0xD2, 0x67, 0xB8, 0x15, 0xD6, 0x38, 0x1A, 0xED, 0x8F, 0x65, 0x48, 0xB6,
+    0xB6, 0xAB, 0x76, 0xDB, 0x58, 0x5A, 0xBC, 0xB1, 0x7B, 0xEF, 0x41, 0x73,
+    0xD5, 0xDB, 0x08, 0x0C, 0x4B, 0x92, 0x7C, 0x25, 0x71, 0xED, 0x3A, 0x62,
+    0x69, 0xD7, 0x52, 0x58, 0x58, 0x12, 0xC7, 0xF8, 0x0E, 0x37, 0x25, 0xCD,
+    0x9B, 0xF4, 0xBC, 0xD9, 0x69, 0xCF, 0xF3, 0x54, 0x25, 0xC5, 0x2B, 0x96,
+    0x9A, 0x2E, 0x63, 0x88, 0x98, 0x1D, 0x49, 0x3B, 0xE3, 0x8B, 0x4B, 0x0B,
+    0x77, 0x10, 0x33, 0x11, 0x71, 0xC2, 0x67, 0x9E, 0xCD, 0xEA, 0x84, 0x19,
+    0x99, 0x06, 0xE2, 0xA6, 0x86, 0x7D, 0x4E, 0xA4, 0xA1, 0x30, 0xBD, 0x85,
+    0x4C, 0x6C, 0x43, 0xBE, 0x1B, 0xA6, 0xA3, 0x2C, 0xC1, 0xED, 0x42, 0x41,
+    0x83, 0x51, 0x77, 0x07, 0x8B, 0xF9, 0x4F, 0x96, 0x54, 0xC4, 0x1D, 0x9C,
+    0x2D, 0x29, 0xB0, 0x31, 0x71, 0xDB, 0x92, 0x36, 0x55, 0x92, 0xEE, 0x21,
+    0x46, 0x25, 0x6D, 0x26, 0xC3, 0x1E, 0x1A, 0x93, 0x1A, 0x76, 0x34, 0x89,
+    0x94, 0x33, 0x69, 0x30, 0xDA, 0x81, 0x7E, 0x20, 0x69, 0x7F, 0x0E, 0xF9,
+    0x89, 0x9D, 0x66, 0x8C, 0x51, 0xE1, 0x36, 0x15, 0x0B, 0x49, 0x5B, 0xA9,
+    0xAD, 0x9F, 0x40, 0x96, 0x1C, 0x44, 0x46, 0xE4, 0x1F, 0x7F, 0x99, 0xBA,
+    0xC5, 0xDB, 0xDE, 0xD9, 0x41, 0x9B, 0xD0, 0x8C, 0x4E, 0xDB, 0x28, 0x0C,
+    0x73, 0xAE, 0x52, 0xCF, 0xDD, 0x86, 0x60, 0x99, 0x3A, 0x4D, 0x6C, 0x82,
+    0x1A, 0xA3, 0x53, 0x77, 0x6F, 0x02, 0x5D, 0x52, 0xC6, 0x91, 0x75, 0x4C,
+    0xCC, 0x26, 0x8D, 0xC8, 0x77, 0x0A, 0xC8, 0x7A, 0x87, 0x7F, 0x2A, 0x5A,
+    0x82, 0x55, 0x44, 0xC0, 0x04, 0x53, 0x32, 0x86, 0x70, 0x9D, 0xBA, 0x0C,
+    0x23, 0x06, 0x0C, 0xC7, 0x2A, 0x60, 0x2C, 0x58, 0xB4, 0x8E, 0x40, 0x0D,
+    0xFF, 0x93, 0x52, 0x45, 0x75, 0x86, 0x76, 0xC7, 0x52, 0x16, 0x18, 0xAC,
+    0xF3, 0x17, 0x77, 0x1C, 0x65, 0xAD, 0x09, 0xF1, 0x58, 0x02, 0x6F, 0xA9,
+    0x21, 0x6A, 0x01, 0xB7, 0xC6, 0xD2, 0x0C, 0x5A, 0x8A, 0xA6, 0x77, 0x5C,
+    0xD2, 0xD8, 0xA2, 0x3E, 0x33, 0x18, 0x89, 0x7F, 0xAA, 0x25, 0xE6, 0xA9,
+    0x2A, 0xC1, 0x87, 0xBD, 0xF6, 0x17, 0x6C, 0x42, 0x08, 0x21};
+const uint8_t g_koKR_Locale[] = {
+    0x78, 0x9C, 0xED, 0x56, 0x4D, 0x6B, 0xD4, 0x40, 0x18, 0x3E, 0x57, 0xF0,
+    0x3F, 0x0C, 0xC1, 0x12, 0x85, 0x76, 0xB7, 0xEB, 0x77, 0x4B, 0x1A, 0x28,
+    0x6E, 0x6D, 0x65, 0x8D, 0x94, 0xA6, 0x58, 0xEC, 0x45, 0x66, 0x93, 0xE9,
+    0x26, 0xED, 0x26, 0x53, 0x26, 0x09, 0x75, 0x73, 0xAE, 0x52, 0xF0, 0xE2,
+    0xA1, 0x87, 0xEA, 0x6E, 0xB1, 0x07, 0x11, 0x2A, 0x88, 0x22, 0x22, 0x1E,
+    0x14, 0x7F, 0x8D, 0x62, 0x6D, 0x8A, 0x7F, 0xC1, 0xC9, 0xE7, 0xE6, 0x63,
+    0xB2, 0x4D, 0xEF, 0xEE, 0x61, 0x99, 0xF7, 0x99, 0xE7, 0x79, 0xF3, 0xBE,
+    0xCF, 0x4C, 0x5E, 0x22, 0x74, 0xB1, 0x02, 0xBB, 0x08, 0x98, 0xD0, 0x40,
+    0xB3, 0xDC, 0x26, 0x7E, 0xDC, 0x5A, 0xE6, 0x80, 0x8A, 0x2C, 0x65, 0x96,
+    0xFB, 0x35, 0x38, 0x38, 0xFE, 0x34, 0xF8, 0xFD, 0xE1, 0xFD, 0xE5, 0xE3,
+    0xD7, 0x47, 0x3F, 0xFB, 0xDF, 0xAF, 0x70, 0xE2, 0xC5, 0x0B, 0x00, 0x08,
+    0x3E, 0xDF, 0x54, 0x21, 0x91, 0x7B, 0x46, 0x1B, 0x77, 0xAD, 0x48, 0xDA,
+    0x21, 0xA8, 0x83, 0x89, 0x0E, 0x4D, 0x9F, 0x35, 0x06, 0x04, 0x03, 0x9B,
+    0xB6, 0xF6, 0x80, 0x6E, 0x59, 0x7E, 0x3C, 0x16, 0xC6, 0x62, 0xC3, 0xEB,
+    0xEF, 0x09, 0xF5, 0x70, 0x9D, 0x82, 0xAF, 0xB2, 0xE1, 0x6B, 0x6C, 0xF8,
+    0x3A, 0x1B, 0xBE, 0xC1, 0x86, 0x6F, 0xB2, 0xE1, 0x5B, 0x6C, 0xF8, 0x36,
+    0x1B, 0x9E, 0x66, 0xC3, 0x8D, 0xA9, 0x12, 0xBC, 0xA4, 0xCF, 0x46, 0xAE,
+    0x51, 0x10, 0xAD, 0x13, 0x9F, 0xD2, 0xBE, 0x01, 0xD8, 0x6E, 0x93, 0x59,
+    0xAE, 0xC1, 0xFD, 0x37, 0xF0, 0x3C, 0x06, 0xAA, 0xB0, 0x97, 0xBA, 0x76,
+    0x34, 0x12, 0xBD, 0x83, 0x6F, 0xDE, 0xAB, 0x3D, 0xFA, 0x2F, 0xD4, 0xFD,
+    0x70, 0x88, 0xF7, 0xF7, 0x98, 0xF8, 0xE9, 0x4B, 0x36, 0xEE, 0xED, 0xEE,
+    0x33, 0xF1, 0x93, 0x77, 0x47, 0x4C, 0xFC, 0xCF, 0xD7, 0x5D, 0x76, 0xFE,
+    0x67, 0x87, 0x39, 0x1C, 0x04, 0x2B, 0x46, 0x13, 0xB9, 0x3B, 0x10, 0x75,
+    0x53, 0xEC, 0xA3, 0xD8, 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5, 0x7A, 0x8B,
+    0x95, 0x96, 0xD7, 0x68, 0x20, 0xA2, 0xAB, 0x3A, 0x32, 0xD2, 0x2F, 0x79,
+    0x04, 0x89, 0xDE, 0xFE, 0x1B, 0xEF, 0x70, 0x87, 0x1E, 0x4E, 0x0C, 0x14,
+    0xB6, 0x4F, 0xFB, 0xB9, 0x6D, 0x30, 0x0C, 0x53, 0x0F, 0x41, 0x04, 0xA6,
+    0xF2, 0xD3, 0x88, 0x56, 0xF9, 0xD1, 0xEB, 0xBF, 0x08, 0xB2, 0xFB, 0x61,
+    0x82, 0x7B, 0x3B, 0x03, 0xBA, 0x95, 0x80, 0x20, 0x58, 0xC5, 0x5A, 0x3A,
+    0xB6, 0xEA, 0xB9, 0xB9, 0x15, 0xA2, 0x2A, 0xB4, 0xD1, 0x12, 0xB4, 0x6D,
+    0x44, 0xCC, 0xC4, 0xFA, 0x04, 0x89, 0x46, 0xDB, 0xBA, 0xD3, 0xED, 0x72,
+    0xE2, 0x23, 0xFA, 0xE3, 0x4F, 0x9E, 0xEE, 0xF0, 0x40, 0xE2, 0xA9, 0xE3,
+    0x3C, 0x68, 0xF2, 0xF4, 0x28, 0x78, 0x30, 0x4F, 0x7F, 0xBE, 0x35, 0x89,
+    0xAA, 0x2C, 0x4D, 0x17, 0x9B, 0x9D, 0xD2, 0x34, 0x95, 0x32, 0x18, 0x48,
+    0x0D, 0x13, 0xD4, 0x80, 0x24, 0xD5, 0x40, 0xB3, 0x59, 0x49, 0x65, 0x69,
+    0x98, 0xD8, 0xBE, 0xAE, 0x4C, 0x05, 0x40, 0x06, 0x89, 0x9C, 0xB1, 0x75,
+    0x23, 0xE7, 0x4C, 0x0A, 0xC9, 0x38, 0x33, 0x07, 0x34, 0x8D, 0xF7, 0x9E,
+    0x0F, 0x68, 0x4B, 0x12, 0x7F, 0xF2, 0x85, 0xB6, 0x26, 0xCB, 0xBC, 0xF7,
+    0x79, 0x97, 0x07, 0x6B, 0x42, 0x3D, 0x25, 0x2A, 0xCB, 0x12, 0x1A, 0x53,
+    0x9A, 0xA5, 0x52, 0x8E, 0xC0, 0x1A, 0x9A, 0x62, 0x46, 0x92, 0x66, 0x64,
+    0xB9, 0x92, 0x24, 0xF2, 0x25, 0x14, 0xE5, 0x15, 0xBE, 0x27, 0x39, 0x07,
+    0xA2, 0xDB, 0xB2, 0x42, 0xD1, 0xF8, 0x0A, 0x2D, 0x40, 0x73, 0x63, 0x73,
+    0xD1, 0xB0, 0xE4, 0xF9, 0xE6, 0xDD, 0xED, 0xD5, 0x27, 0x5A, 0xCB, 0x5D,
+    0x0B, 0xAD, 0x4C, 0x93, 0x02, 0xA5, 0xE9, 0x18, 0x6D, 0x44, 0xB2, 0x7E,
+    0x66, 0xB0, 0xA8, 0x28, 0x8A, 0xD1, 0x97, 0x40, 0xE1, 0x44, 0x77, 0xC2,
+    0x75, 0xA7, 0x6B, 0xAE, 0xEB, 0x0A, 0xF5, 0x0C, 0xAF, 0x5C, 0xAA, 0x38,
+    0x84, 0x20, 0x53, 0xE9, 0x71, 0xE2, 0xA5, 0x40, 0x5C, 0x59, 0xB8, 0x85,
+    0x88, 0x82, 0x4C, 0x3B, 0x7A, 0xE6, 0x78, 0x51, 0xE7, 0x9B, 0x51, 0x68,
+    0x20, 0x69, 0x6A, 0xD8, 0xE7, 0x58, 0x16, 0x8A, 0xD2, 0xAB, 0x48, 0xD1,
+    0x0D, 0x48, 0xEF, 0x49, 0x2D, 0xCE, 0x12, 0x6E, 0x97, 0x0A, 0x3A, 0x04,
+    0x3B, 0x5B, 0xBA, 0x7F, 0x27, 0x26, 0x2A, 0x2A, 0x92, 0x0E, 0xC6, 0x2B,
+    0x0A, 0x0C, 0xDD, 0x74, 0x2C, 0x4E, 0x9C, 0xAC, 0x48, 0x77, 0x11, 0xC1,
+    0x9C, 0x38, 0x55, 0x60, 0x0F, 0x8D, 0xC9, 0x1C, 0x76, 0x7C, 0x12, 0x19,
+    0x67, 0xB2, 0x60, 0x7C, 0x07, 0x83, 0x80, 0x13, 0xFF, 0xFE, 0x78, 0x4B,
+    0x07, 0x54, 0x86, 0x31, 0x42, 0xA5, 0x5B, 0xD8, 0x5F, 0x70, 0x62, 0x6B,
+    0x79, 0xF5, 0x1C, 0xB2, 0xF4, 0x41, 0x14, 0x44, 0xC1, 0x84, 0x2C, 0xD4,
+    0xED, 0xCF, 0x81, 0xDE, 0x16, 0x5A, 0x87, 0x4A, 0x3C, 0x90, 0xE3, 0x30,
+    0xCA, 0x39, 0xA7, 0xE2, 0x36, 0x02, 0x52, 0xCF, 0x31, 0x3B, 0x1B, 0x18,
+    0xC8, 0xB6, 0x0A, 0x24, 0xAE, 0xCE, 0x64, 0x4A, 0x3D, 0xFA, 0x75, 0xA8,
+    0x82, 0x25, 0xEA, 0x64, 0x09, 0x41, 0x37, 0x75, 0x6C, 0x8E, 0x20, 0xDC,
+    0xC1, 0x0E, 0xD1, 0x11, 0xF1, 0x9F, 0x52, 0xC2, 0x08, 0xAB, 0x59, 0xD2,
+    0xCF, 0xA4, 0x2C, 0xA2, 0x36, 0x41, 0xDB, 0x23, 0x29, 0x73, 0x04, 0xB6,
+    0xE9, 0x8B, 0x38, 0x8A, 0xB2, 0xA2, 0x41, 0xBD, 0x84, 0xD0, 0xC2, 0xAE,
+    0xB3, 0x09, 0xC1, 0x02, 0xB6, 0x35, 0x5D, 0xF1, 0x7B, 0x9A, 0x7C, 0x78,
+    0xAF, 0xD4, 0x9A, 0x88, 0x4C, 0x0D, 0x50, 0x34, 0x1C, 0x93, 0x97, 0x47,
+    0x3E, 0x9A, 0x72, 0x3B, 0x81, 0xDD, 0xF7, 0x47, 0xD2, 0x64, 0x9C, 0xA1,
+    0x05, 0x53, 0x2D, 0x75, 0x9E, 0x42, 0x3D, 0xFC, 0xFC, 0x17, 0xFF, 0x01,
+    0xDC, 0xF1, 0x18, 0xD3};
+const uint8_t g_esES_Locale[] = {
+    0x78, 0x9C, 0x9D, 0x56, 0xCF, 0x6B, 0xD4, 0x40, 0x14, 0xBE, 0x0B, 0xFE,
+    0x0F, 0x21, 0x58, 0x56, 0xA1, 0xDD, 0xD1, 0x63, 0xCB, 0x36, 0x50, 0xDA,
+    0xDA, 0x95, 0x1A, 0x59, 0x9A, 0xAA, 0xD8, 0x8B, 0x4C, 0x92, 0xE9, 0xEE,
+    0xB4, 0xC9, 0xCC, 0x32, 0x49, 0x2C, 0x9B, 0xA3, 0xE0, 0x41, 0x10, 0x0B,
+    0xDE, 0x8A, 0x27, 0x0F, 0x1E, 0x04, 0x8B, 0x77, 0x51, 0x3C, 0xF4, 0x3F,
+    0x11, 0x6A, 0xEB, 0xC9, 0x7F, 0xC1, 0x37, 0x9B, 0x49, 0x36, 0x3F, 0x66,
+    0xD7, 0x60, 0x4E, 0xF3, 0xBE, 0xF7, 0x7D, 0x2F, 0xEF, 0x7D, 0x93, 0x4C,
+    0xD2, 0x0B, 0xB8, 0x87, 0x03, 0x62, 0x30, 0x1C, 0x92, 0x75, 0x93, 0x44,
+    0xCF, 0xB7, 0x1D, 0xD3, 0xF0, 0x49, 0xE4, 0xAD, 0x9B, 0xD7, 0x1F, 0x7F,
+    0x5C, 0x9D, 0x9E, 0x5F, 0xBD, 0x3E, 0xBB, 0xFE, 0x72, 0x7E, 0xBB, 0x08,
+    0xFE, 0x7C, 0x7B, 0x73, 0xF9, 0xFE, 0xFB, 0xEF, 0xB3, 0x57, 0xBF, 0xDE,
+    0xBE, 0xBB, 0xFC, 0x7A, 0x7A, 0xC7, 0xB4, 0x7A, 0xB2, 0x00, 0xF3, 0xB1,
+    0x70, 0x26, 0xA1, 0xCB, 0x83, 0x48, 0xD5, 0x1A, 0x0A, 0x32, 0xE4, 0x82,
+    0x62, 0x06, 0x8C, 0x90, 0xB3, 0x78, 0xF4, 0x08, 0xE0, 0x48, 0xAD, 0x2D,
+    0xC2, 0x88, 0xE0, 0x3D, 0x94, 0x05, 0x37, 0x6F, 0x28, 0xF4, 0x90, 0xB8,
+    0x42, 0x87, 0x87, 0x58, 0xA4, 0x4D, 0x14, 0xBB, 0x82, 0x06, 0x1A, 0xEE,
+    0xA4, 0x49, 0x3D, 0x4A, 0x18, 0xD5, 0xA1, 0x81, 0x06, 0xC5, 0x43, 0x1E,
+    0xC5, 0x4D, 0x38, 0x22, 0xE3, 0x98, 0x92, 0x10, 0x1A, 0x6C, 0xA4, 0xB8,
+    0x17, 0x27, 0x3A, 0x9C, 0xF1, 0x17, 0x73, 0x14, 0x3E, 0xF5, 0x1A, 0x19,
+    0x54, 0x72, 0x29, 0x27, 0x4E, 0x23, 0x03, 0xBB, 0xAE, 0x58, 0x37, 0xEF,
+    0x99, 0x25, 0xF3, 0x74, 0xD6, 0xE9, 0x6C, 0xD3, 0x99, 0xA6, 0xB3, 0x4C,
+    0xE7, 0x98, 0xCE, 0x2F, 0x9D, 0x5B, 0x3A, 0xAB, 0x74, 0x1E, 0xE9, 0xFC,
+    0xD1, 0x39, 0x33, 0xDF, 0x13, 0x1F, 0x4F, 0xD4, 0x53, 0x04, 0x2B, 0xCB,
+    0xE7, 0x21, 0x65, 0xF2, 0xF6, 0x32, 0xC8, 0xB2, 0x56, 0x90, 0x30, 0x12,
+    0x55, 0x10, 0x30, 0x21, 0xAE, 0x43, 0xF4, 0xE2, 0x93, 0xF0, 0x78, 0x50,
+    0x83, 0x8F, 0x12, 0xF2, 0xA2, 0x06, 0xC1, 0xFE, 0x89, 0x7A, 0xC1, 0xE8,
+    0xE2, 0x83, 0x8B, 0xFD, 0xD9, 0x6D, 0x51, 0xD1, 0x55, 0xA9, 0xC3, 0xD2,
+    0x9E, 0xA9, 0x56, 0xEB, 0x6D, 0xD6, 0x9B, 0x6C, 0x74, 0x58, 0xEF, 0xAD,
+    0xDE, 0x58, 0xA3, 0x29, 0x7D, 0x47, 0x21, 0x11, 0xD4, 0x87, 0x87, 0x2D,
+    0x7F, 0xFD, 0x54, 0x68, 0x6D, 0xD8, 0xE0, 0x6E, 0x1E, 0x94, 0x78, 0xD6,
+    0xA0, 0x96, 0x40, 0xD5, 0x0A, 0x80, 0x10, 0x81, 0x55, 0x35, 0x58, 0x59,
+    0xB8, 0xBB, 0xD9, 0xED, 0x21, 0xB9, 0xCA, 0x52, 0x96, 0x5F, 0x06, 0x50,
+    0x41, 0x96, 0x41, 0xED, 0xA8, 0xC8, 0xBA, 0x8F, 0xC9, 0x00, 0xC7, 0x31,
+    0x18, 0x3D, 0xDD, 0xD7, 0x22, 0x52, 0xE7, 0xC8, 0x61, 0x12, 0x04, 0xA6,
+    0xB5, 0x0D, 0x97, 0xB1, 0xD5, 0x81, 0xA3, 0xC9, 0xE8, 0xD8, 0x70, 0x65,
+    0xAB, 0x67, 0x70, 0xC9, 0x69, 0x0B, 0x4D, 0xAD, 0xA0, 0x2A, 0x11, 0x70,
+    0x36, 0x34, 0xAD, 0xFF, 0x55, 0x87, 0xC4, 0x07, 0xF1, 0x16, 0xB2, 0x6D,
+    0xD4, 0x52, 0x11, 0x8D, 0xB8, 0x88, 0x67, 0x9A, 0x86, 0x02, 0x55, 0x66,
+    0x06, 0x20, 0xA6, 0x61, 0xC9, 0x83, 0x52, 0x54, 0xF1, 0xA0, 0xDF, 0xEF,
+    0xF4, 0xA1, 0xFD, 0x0E, 0x5C, 0x0E, 0x9C, 0xD2, 0x07, 0x3D, 0x54, 0x62,
+    0xD6, 0xCA, 0x54, 0x26, 0xEF, 0xF7, 0xD7, 0x6C, 0x7B, 0xCD, 0x71, 0x5A,
+    0x49, 0xA6, 0xE3, 0x2A, 0x41, 0x0B, 0xBA, 0x9A, 0x55, 0x0A, 0x1A, 0x6C,
+    0x54, 0x99, 0x4B, 0x59, 0xB5, 0x0F, 0x58, 0xBE, 0xFD, 0x3B, 0x89, 0x1D,
+    0x1F, 0x8F, 0xC2, 0xC8, 0xD9, 0xDE, 0xBA, 0x7F, 0xF2, 0x14, 0x8F, 0x76,
+    0xD3, 0x83, 0xCC, 0x9C, 0x32, 0x09, 0x74, 0x2C, 0x09, 0x5D, 0x22, 0x66,
+    0x0E, 0x55, 0x62, 0xD5, 0x08, 0x60, 0xF0, 0x9C, 0x7A, 0xA6, 0x95, 0x2E,
+    0xA7, 0xE9, 0x6A, 0x37, 0x4D, 0xD3, 0x1E, 0xAA, 0xF0, 0x1A, 0x85, 0x94,
+    0xD0, 0x4B, 0x84, 0x20, 0xCC, 0x9B, 0xE4, 0xCA, 0xD5, 0x55, 0xE3, 0x56,
+    0x4B, 0xE9, 0x98, 0x08, 0x8F, 0xB0, 0x58, 0x29, 0x97, 0x34, 0x2A, 0x54,
+    0x6B, 0xBD, 0x28, 0x94, 0x4F, 0x57, 0x09, 0x55, 0x59, 0x9F, 0x78, 0x34,
+    0xC4, 0xB0, 0xE3, 0xCB, 0xB9, 0x3E, 0x4B, 0xD7, 0xD5, 0xC5, 0x97, 0x96,
+    0x27, 0x63, 0x2A, 0x37, 0xBA, 0xDB, 0x8A, 0x5F, 0x74, 0xBD, 0xD4, 0x8A,
+    0x0E, 0x87, 0x6C, 0x12, 0x99, 0xD6, 0x4A, 0x2B, 0x72, 0x0A, 0x9F, 0x6F,
+    0xD3, 0xBA, 0xDB, 0xE4, 0xA2, 0xEA, 0xD8, 0x80, 0xE4, 0xBE, 0x17, 0x4E,
+    0x54, 0x81, 0xFC, 0xF9, 0x9A, 0x06, 0xA6, 0xF5, 0xF3, 0xE5, 0x67, 0x38,
+    0x3E, 0x2A, 0x8C, 0x66, 0x11, 0xA5, 0xA1, 0x11, 0x97, 0x0B, 0x38, 0x35,
+    0x1E, 0xEF, 0xB5, 0x16, 0x95, 0x4D, 0x6F, 0x4A, 0x50, 0xBD, 0x5B, 0xF9,
+    0x32, 0x4C, 0xC6, 0xE4, 0x10, 0x7B, 0xF2, 0x1C, 0xCC, 0x97, 0xAA, 0x96,
+    0x3D, 0x81, 0x1F, 0x1F, 0xDF, 0x18, 0x80, 0x17, 0xA8, 0xCC, 0xCC, 0xD3,
+    0x14, 0xFE, 0x46, 0xD8, 0xDC, 0xF4, 0x26, 0x4F, 0x04, 0x7C, 0x77, 0x0C,
+    0x27, 0xF6, 0xB5, 0xF9, 0x0D, 0x9F, 0xBB, 0xC4, 0x18, 0xD0, 0x7F, 0x10,
+    0xFA, 0xF2, 0x67, 0xEA, 0x64, 0x01, 0x61, 0x43, 0x60, 0x17, 0x5E, 0x98,
+    0xF9, 0x84, 0xFD, 0x11, 0xA6, 0xDA, 0xF4, 0x2E, 0x4F, 0x93, 0x63, 0x6C,
+    0xEC, 0xF0, 0x78, 0x44, 0x3D, 0x39, 0xC7, 0xCA, 0x93, 0x07, 0x86, 0xBD,
+    0x88, 0x0A, 0x23, 0x7B, 0x23, 0x9E, 0x53, 0xF7, 0x16, 0xDC, 0x14, 0x98,
+    0x43, 0x39, 0x99, 0xF1, 0x70, 0x01, 0xC9, 0xE1, 0x2D, 0x48, 0xF6, 0x24,
+    0x61, 0xC3, 0x23, 0x3E, 0xE5, 0xA9, 0xE6, 0xD0, 0x6C, 0xCF, 0x64, 0x94,
+    0xFD, 0xFC, 0xC2, 0xF2, 0x2F, 0x7C, 0xDC, 0xCC, 0x2F,
+};
+const uint8_t g_esLA_Locale[] = {
+    0x78, 0x9C, 0x9D, 0x56, 0xCD, 0x4E, 0xDC, 0x30, 0x10, 0x3E, 0x53, 0xA9,
+    0xEF, 0x60, 0x45, 0x45, 0x80, 0x04, 0x9B, 0xF6, 0xB8, 0x28, 0x44, 0x5A,
+    0x01, 0xA5, 0x15, 0x0D, 0x5A, 0x75, 0x51, 0x4B, 0xB9, 0x54, 0x4E, 0x62,
+    0x36, 0x86, 0xC4, 0x5E, 0x39, 0x09, 0x68, 0xA3, 0xBE, 0x40, 0x4F, 0x3D,
+    0xF4, 0xD4, 0x63, 0x2B, 0x21, 0xB5, 0x07, 0xD4, 0x47, 0xE8, 0x81, 0x67,
+    0x41, 0xF0, 0x18, 0x9D, 0xFC, 0x6E, 0x12, 0x3B, 0xE9, 0xD2, 0x9C, 0x3C,
+    0xDF, 0x7C, 0x9F, 0x77, 0xE6, 0xB3, 0x33, 0x1B, 0xC3, 0xE7, 0x0E, 0xF6,
+    0x09, 0x62, 0x38, 0x20, 0x3B, 0x1A, 0x09, 0x3F, 0x5A, 0x27, 0x1A, 0x72,
+    0x49, 0xE8, 0xEC, 0x68, 0x0F, 0xD7, 0x7F, 0xEE, 0xBF, 0xDC, 0xDC, 0x7F,
+    0xFE, 0xF6, 0xF0, 0xFB, 0x66, 0xFD, 0xEE, 0xC7, 0x4F, 0x88, 0xEF, 0xBE,
+    0x5E, 0x6F, 0x68, 0xE6, 0xD3, 0x27, 0x08, 0x19, 0xA9, 0x8A, 0xB9, 0x58,
+    0x4C, 0xE6, 0x81, 0xCD, 0xFD, 0xB0, 0xD8, 0x60, 0x2A, 0xC8, 0x94, 0x0B,
+    0x8A, 0x59, 0xCA, 0x5A, 0x41, 0x46, 0xC0, 0x59, 0xE4, 0x1D, 0x41, 0x2A,
+    0x4C, 0xE3, 0x95, 0x3C, 0x36, 0x09, 0x23, 0x82, 0x1B, 0x7A, 0x1E, 0xD4,
+    0xF0, 0x33, 0x62, 0x0B, 0x75, 0x26, 0xC0, 0x22, 0x51, 0xE1, 0xD8, 0x16,
+    0xD4, 0x57, 0xF2, 0xE7, 0x2A, 0xFA, 0x79, 0xCC, 0xA8, 0x1A, 0xF7, 0x95,
+    0x38, 0x9E, 0xF2, 0x30, 0x52, 0x25, 0x42, 0x32, 0x8B, 0x28, 0x09, 0xA0,
+    0x5C, 0x45, 0x92, 0x3B, 0x51, 0xAC, 0xCE, 0x30, 0x7E, 0xD9, 0xA9, 0x72,
+    0xA9, 0x23, 0xE5, 0x50, 0xB1, 0xAE, 0x1C, 0xAC, 0x3B, 0x8A, 0xB0, 0x6D,
+    0x8B, 0x1D, 0xED, 0x85, 0xD6, 0xB2, 0x56, 0x6D, 0xAC, 0xDA, 0x54, 0xB5,
+    0xA5, 0x6A, 0x43, 0xD5, 0x7E, 0xAA, 0xDD, 0x54, 0x7B, 0xA9, 0x36, 0x52,
+    0xED, 0xA0, 0xDA, 0x3D, 0xB5, 0x6F, 0xFD, 0x8E, 0xB9, 0x78, 0x5E, 0xBB,
+    0x81, 0x10, 0x99, 0x2E, 0x0F, 0x28, 0x4B, 0xCB, 0x49, 0x83, 0x0A, 0xF5,
+    0x63, 0x46, 0xC2, 0x16, 0x06, 0x16, 0x45, 0x32, 0x48, 0x6F, 0x7F, 0x09,
+    0x87, 0xFB, 0x52, 0xE2, 0x3C, 0x26, 0x97, 0x12, 0x08, 0x27, 0x2E, 0xE4,
+    0x8D, 0xC3, 0xDB, 0xEF, 0x36, 0x76, 0x17, 0x25, 0xA0, 0x6C, 0xA5, 0xA8,
+    0xBA, 0x75, 0xCA, 0x45, 0xF9, 0x72, 0xE9, 0x72, 0xE1, 0x8A, 0xAA, 0xE5,
+    0x7A, 0xE5, 0x62, 0x15, 0x85, 0x76, 0x57, 0x19, 0x10, 0x41, 0x5D, 0xB8,
+    0xB6, 0xF5, 0x57, 0xBC, 0x80, 0xCC, 0x91, 0x05, 0x67, 0x51, 0x06, 0xCD,
+    0xD4, 0xB8, 0x95, 0x42, 0x8B, 0xB0, 0xB6, 0x39, 0x11, 0xB8, 0xB6, 0x2F,
+    0x44, 0x26, 0x1E, 0xEC, 0x0E, 0x0C, 0x3D, 0x5D, 0x55, 0x90, 0x5B, 0x87,
+    0x50, 0xB6, 0x2A, 0x45, 0x30, 0xA5, 0xF4, 0xD6, 0x98, 0xCA, 0x51, 0x17,
+    0x47, 0x64, 0x8C, 0xA3, 0x08, 0x0E, 0xA6, 0x72, 0xBB, 0x42, 0x8A, 0x49,
+    0x76, 0x16, 0xFB, 0xBE, 0x66, 0xEE, 0xC3, 0x83, 0xF6, 0xD6, 0x60, 0x22,
+    0xA2, 0x35, 0x0B, 0x9E, 0x7C, 0xF5, 0x01, 0x9E, 0xD4, 0x89, 0x4A, 0xD3,
+    0xB5, 0x89, 0xCF, 0xD9, 0x54, 0x33, 0xFF, 0x5F, 0x1F, 0x10, 0x17, 0xE4,
+    0x7B, 0xBA, 0x65, 0xE9, 0x4B, 0x6B, 0x42, 0x8F, 0x8B, 0x68, 0xA1, 0x6A,
+    0x6B, 0x10, 0x6A, 0x20, 0x85, 0x23, 0x11, 0x0D, 0x5A, 0x8E, 0xD4, 0x90,
+    0x86, 0x23, 0x9E, 0xB7, 0x6D, 0x59, 0xDB, 0x93, 0x09, 0x1A, 0xA1, 0x53,
+    0x43, 0xAF, 0xB1, 0xBA, 0x64, 0xB9, 0x07, 0x8F, 0x96, 0x65, 0xAD, 0x2F,
+    0x54, 0x4B, 0x69, 0x8A, 0xD6, 0x33, 0x95, 0x2C, 0x49, 0x3B, 0x6F, 0xF5,
+    0x59, 0xDC, 0x85, 0x63, 0x40, 0xCB, 0x0B, 0x72, 0x10, 0x5B, 0xD1, 0x85,
+    0x17, 0x84, 0x93, 0xFD, 0xBD, 0x97, 0x57, 0xEF, 0xB1, 0x77, 0x98, 0x9C,
+    0xE6, 0x86, 0xD5, 0x49, 0x99, 0x92, 0xC5, 0x81, 0x4D, 0x44, 0xD3, 0xB5,
+    0x06, 0x56, 0x54, 0x05, 0x18, 0xDC, 0x6D, 0x47, 0x33, 0x93, 0xCD, 0x24,
+    0x19, 0x0E, 0x92, 0x24, 0x31, 0xF4, 0x06, 0xAF, 0x5B, 0xEA, 0xC4, 0x42,
+    0x10, 0xE6, 0xCC, 0x35, 0xF3, 0x59, 0x2E, 0x1E, 0x0E, 0x3F, 0xAD, 0x57,
+    0xCB, 0x8D, 0xA5, 0xF7, 0x99, 0x11, 0xE1, 0x10, 0x16, 0x15, 0x25, 0xAC,
+    0xCA, 0xBA, 0xD4, 0x1B, 0xA9, 0x9F, 0xAA, 0xC7, 0x45, 0xDB, 0x2B, 0x4D,
+    0xA8, 0xD8, 0xDE, 0x25, 0x0E, 0x0D, 0x30, 0x5C, 0x8E, 0x41, 0xB9, 0x4B,
+    0x9E, 0xEE, 0x14, 0x4C, 0x05, 0x8F, 0x67, 0x34, 0xBD, 0x17, 0x9B, 0x4B,
+    0x2A, 0xAA, 0x0E, 0x56, 0x97, 0x14, 0xC0, 0x84, 0x8F, 0x43, 0xCD, 0xDC,
+    0x5A, 0x92, 0x9E, 0xC0, 0x77, 0x87, 0x66, 0x3E, 0x97, 0xD8, 0x0B, 0x63,
+    0x1A, 0x67, 0x5F, 0x1E, 0x4C, 0xC3, 0x99, 0x26, 0x58, 0xDE, 0xC9, 0x2C,
+    0x80, 0x03, 0x84, 0x59, 0xD4, 0xC8, 0xF7, 0x68, 0x68, 0xC8, 0xD3, 0x85,
+    0x66, 0x5A, 0x27, 0x47, 0x8F, 0x90, 0xD5, 0x8F, 0x41, 0x12, 0x65, 0xC3,
+    0x50, 0xAA, 0x3A, 0x7D, 0xF5, 0xE7, 0x33, 0x72, 0x86, 0x9D, 0x72, 0xE8,
+    0x96, 0x61, 0xB1, 0xA7, 0x35, 0x87, 0xAF, 0x39, 0x17, 0x8D, 0xC1, 0x1D,
+    0x5D, 0x4D, 0xA0, 0xF0, 0x49, 0xC5, 0x7A, 0x08, 0xBB, 0x3C, 0x16, 0xF0,
+    0x17, 0x88, 0x26, 0x91, 0xDB, 0xC1, 0x18, 0xB9, 0xDC, 0x26, 0x68, 0x4C,
+    0xFF, 0x49, 0x79, 0x95, 0x7E, 0x1F, 0x5E, 0xF5, 0x52, 0x46, 0x02, 0xDB,
+    0xF0, 0xAE, 0xF5, 0x51, 0x8E, 0x3D, 0x4C, 0x3B, 0x08, 0x87, 0x3C, 0x89,
+    0x2F, 0x30, 0x3A, 0xE0, 0x91, 0x47, 0x9D, 0xB4, 0xA7, 0xAD, 0x77, 0xAF,
+    0x91, 0xD5, 0x4F, 0x06, 0x03, 0x1C, 0x8F, 0x97, 0xE4, 0xB7, 0xBD, 0x3F,
+    0x0D, 0xDC, 0x69, 0xDA, 0x25, 0x7A, 0xD3, 0x4B, 0x9B, 0xF0, 0xA5, 0x68,
+    0xD6, 0x3C, 0x66, 0xD3, 0x73, 0x9E, 0x31, 0xF3, 0x22, 0xB3, 0x11, 0x57,
+    0x3B, 0x4F, 0x43, 0xCF, 0x3F, 0xEF, 0xCD, 0xBF, 0xC4, 0xB5, 0xD4, 0x04};
+const uint8_t g_deDE_Loacale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD4, 0x30, 0x10, 0xBD, 0x23, 0xF1,
+    0x1F, 0xAC, 0x88, 0xAA, 0x20, 0xB5, 0x1B, 0x38, 0xB6, 0xDA, 0x46, 0x5A,
+    0x75, 0xFB, 0x41, 0x4B, 0xCA, 0xAA, 0x69, 0x41, 0xF4, 0x82, 0xBC, 0x89,
+    0xBB, 0x71, 0x9B, 0xD8, 0x2B, 0xC7, 0x69, 0xB5, 0x39, 0xF2, 0x37, 0xB8,
+    0x72, 0x04, 0x71, 0xE4, 0x04, 0x17, 0xFE, 0x09, 0x52, 0x25, 0x7E, 0x06,
+    0x93, 0x8D, 0x93, 0x26, 0xB6, 0xBB, 0x0D, 0xB9, 0xAC, 0xE7, 0xCD, 0x7B,
+    0xB3, 0x33, 0xCF, 0x89, 0x93, 0x61, 0xC2, 0x43, 0x9C, 0x10, 0xC4, 0x70,
+    0x4A, 0x76, 0x9C, 0x88, 0x7C, 0x1C, 0xEF, 0x39, 0x28, 0x22, 0x59, 0xB8,
+    0xE3, 0xDC, 0xFD, 0xFA, 0xF1, 0xF7, 0xFB, 0xB7, 0xE7, 0xF0, 0x73, 0xF7,
+    0xF9, 0xE7, 0x0B, 0xC7, 0x1B, 0x96, 0x44, 0x16, 0x61, 0x11, 0x2C, 0xD2,
+    0x29, 0x4F, 0x32, 0xA5, 0x99, 0x09, 0x32, 0xE3, 0x82, 0x62, 0x06, 0x8C,
+    0x94, 0x33, 0x19, 0x9F, 0x00, 0x9C, 0xA9, 0xB5, 0x77, 0x84, 0x59, 0x8E,
+    0xC5, 0xD0, 0xAD, 0xA2, 0xA7, 0x4F, 0x14, 0xBC, 0x4F, 0xA6, 0xC2, 0x86,
+    0xFB, 0xBF, 0xBF, 0x88, 0xC2, 0x40, 0x47, 0x73, 0x41, 0x13, 0x93, 0x8B,
+    0xA9, 0x81, 0x1D, 0xE5, 0xCC, 0x06, 0x26, 0x26, 0x38, 0xCA, 0x67, 0x79,
+    0x26, 0x0D, 0x38, 0x20, 0x73, 0x49, 0xD2, 0x29, 0x31, 0x5B, 0x7B, 0x7B,
+    0x2D, 0xB9, 0x0D, 0x3F, 0xE1, 0x37, 0x76, 0xC1, 0x98, 0x14, 0x7A, 0xC2,
+    0x6D, 0x19, 0x54, 0xF3, 0x96, 0x11, 0xC2, 0xD3, 0xA9, 0xD8, 0x71, 0x5E,
+    0x39, 0x2D, 0xDF, 0x6C, 0xA6, 0x99, 0x26, 0xD8, 0xED, 0xEA, 0x6B, 0x96,
+    0xCD, 0x2B, 0x9B, 0x55, 0x36, 0x9F, 0x6C, 0x0E, 0xD9, 0xDC, 0xB1, 0x19,
+    0xF3, 0xB0, 0x27, 0x11, 0x5E, 0xA8, 0x1B, 0x08, 0x56, 0x5E, 0xC0, 0x19,
+    0x93, 0x18, 0xFE, 0xBE, 0x0C, 0xAA, 0xAC, 0xE7, 0x73, 0x03, 0x1A, 0x53,
+    0xC2, 0x32, 0x83, 0x47, 0xA5, 0xBC, 0xE5, 0x61, 0xDC, 0x65, 0x42, 0x41,
+    0x22, 0x0C, 0xEE, 0xBE, 0x20, 0x54, 0xC7, 0x02, 0x9C, 0x76, 0x78, 0x6E,
+    0xD3, 0x5A, 0xAB, 0xCD, 0xD6, 0xC6, 0x55, 0xFD, 0x6A, 0xAD, 0x6A, 0x6D,
+    0x6A, 0x0D, 0x6A, 0xAD, 0x69, 0x2D, 0x69, 0xDD, 0xD8, 0x1B, 0x49, 0x89,
+    0xA0, 0x11, 0x25, 0x69, 0xFD, 0xD4, 0xA9, 0xD0, 0x1B, 0xF9, 0xE0, 0x6C,
+    0x1D, 0xB4, 0x78, 0xDE, 0x44, 0x4B, 0xB8, 0xDD, 0x0A, 0x80, 0x10, 0x81,
+    0x55, 0x35, 0x58, 0x79, 0x37, 0x03, 0xB4, 0x1B, 0x8B, 0xC1, 0xD0, 0x2D,
+    0x83, 0x2A, 0xEB, 0x31, 0x0D, 0x73, 0x1B, 0x49, 0x19, 0x68, 0xE7, 0x44,
+    0x35, 0x81, 0x24, 0x13, 0x2C, 0x25, 0x11, 0x6C, 0xB9, 0xB3, 0x4D, 0xA4,
+    0x0E, 0x91, 0xCB, 0x3C, 0x49, 0x1C, 0x6F, 0x0F, 0xAE, 0x0D, 0x34, 0x1E,
+    0x20, 0x1F, 0x2E, 0xF4, 0x01, 0xAE, 0x72, 0xD6, 0x86, 0xAB, 0x15, 0x52,
+    0xD2, 0x84, 0xB3, 0x99, 0xE3, 0xFD, 0xA7, 0x28, 0x25, 0x11, 0x68, 0xC6,
+    0x03, 0xDF, 0x1F, 0xF4, 0x54, 0x64, 0x31, 0x17, 0xF2, 0x5E, 0x63, 0x28,
+    0xDC, 0xCE, 0x88, 0x00, 0x48, 0x9A, 0xB6, 0x46, 0x6E, 0x45, 0x9D, 0x91,
+    0x0F, 0xB7, 0x7D, 0x7F, 0x1D, 0x9D, 0xC7, 0x02, 0xAD, 0x5F, 0x0C, 0xDD,
+    0x16, 0x4B, 0x2B, 0xD1, 0x19, 0xF6, 0xB0, 0x54, 0x6D, 0x07, 0x01, 0xEA,
+    0x23, 0x59, 0x8E, 0x5A, 0x2B, 0x7A, 0xF0, 0xD5, 0xA0, 0x4B, 0x85, 0x41,
+    0x77, 0x3B, 0x53, 0x29, 0xA3, 0xCE, 0x00, 0xAB, 0xF7, 0xFA, 0xE0, 0xCA,
+    0x97, 0xD7, 0x87, 0x69, 0x16, 0xEC, 0x8D, 0xF7, 0x6F, 0xDF, 0xE3, 0xF8,
+    0xB8, 0xB8, 0xA8, 0xAC, 0x69, 0x93, 0x40, 0xC7, 0xF2, 0xF2, 0x68, 0xBC,
+    0xF7, 0xA7, 0x13, 0xAB, 0x4E, 0x00, 0x83, 0x5B, 0x33, 0x74, 0xBC, 0x62,
+    0xA3, 0x28, 0xB6, 0x06, 0x45, 0x01, 0xC7, 0x46, 0x87, 0x67, 0x14, 0x52,
+    0xC2, 0x30, 0x17, 0x82, 0xB0, 0x70, 0x51, 0x2B, 0xB7, 0xB6, 0xD0, 0xB3,
+    0x9E, 0xD2, 0x39, 0x11, 0x21, 0x61, 0x52, 0x29, 0xD7, 0x2C, 0x2A, 0x57,
+    0x6B, 0xBD, 0x29, 0x54, 0x4F, 0xD7, 0x09, 0x9B, 0x17, 0x6B, 0x48, 0x53,
+    0x0C, 0xFB, 0xBD, 0x51, 0xEB, 0xAB, 0xB4, 0xAE, 0x6E, 0xDE, 0xA9, 0x3C,
+    0x9F, 0xD3, 0x72, 0xAB, 0x07, 0xBD, 0xF8, 0x4D, 0xD7, 0x6B, 0xBD, 0xE8,
+    0x29, 0x65, 0x79, 0xE6, 0x78, 0x9B, 0xBD, 0xC8, 0x05, 0x11, 0xDC, 0xF1,
+    0x5E, 0x9A, 0x5C, 0xB7, 0x3B, 0x36, 0x20, 0xB5, 0xEF, 0x8D, 0x13, 0x5D,
+    0xA0, 0xBE, 0xC1, 0x96, 0x81, 0xE3, 0xFD, 0xF9, 0xF4, 0x15, 0xCE, 0x8A,
+    0x0E, 0xC3, 0x2C, 0xA2, 0x34, 0x34, 0xE3, 0xE5, 0x02, 0x8E, 0x88, 0xF3,
+    0xD3, 0xDE, 0xA2, 0xB6, 0xE9, 0xA6, 0xC4, 0xD5, 0xBB, 0x2D, 0x9F, 0x86,
+    0xC5, 0x9C, 0x5C, 0xE2, 0xB0, 0x3C, 0xFA, 0xEA, 0xA5, 0xAA, 0xE5, 0x2F,
+    0xE0, 0x13, 0x27, 0x42, 0x13, 0xF0, 0xC2, 0x6D, 0x33, 0xEB, 0x34, 0x65,
+    0x94, 0xB3, 0x07, 0xD3, 0xBB, 0x3C, 0x17, 0x94, 0x08, 0x14, 0xC8, 0xC8,
+    0x9A, 0x1F, 0x45, 0xF0, 0x69, 0x81, 0x26, 0xF4, 0x11, 0xC2, 0x21, 0x7C,
+    0x35, 0x91, 0xDB, 0x15, 0x84, 0x91, 0xC0, 0x53, 0x78, 0x60, 0x1E, 0x26,
+    0x9C, 0xC5, 0x98, 0x5A, 0xD3, 0xC7, 0xBC, 0xC8, 0xAF, 0x31, 0x3A, 0xE0,
+    0x32, 0xA6, 0x61, 0x39, 0xC7, 0xE6, 0xBB, 0xD7, 0xC8, 0x5F, 0x45, 0x85,
+    0x91, 0xC3, 0x98, 0xD7, 0xD4, 0xD3, 0x15, 0x7F, 0x0A, 0xCC, 0x59, 0x39,
+    0x19, 0x7A, 0xB3, 0x82, 0x04, 0x6F, 0xFA, 0xC7, 0x49, 0xFE, 0x22, 0x67,
+    0xB3, 0x2B, 0xBE, 0xE4, 0xA9, 0xE6, 0xDC, 0xFB, 0x3D, 0x2B, 0xA3, 0xEA,
+    0x73, 0x16, 0x96, 0xFF, 0x00, 0x29, 0x27, 0xAF, 0x17,
+};
+const uint8_t g_frFR_Locale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD3, 0x40, 0x10, 0xBD, 0x23, 0xF1,
+    0x1F, 0x56, 0x16, 0x55, 0x41, 0x6A, 0xBD, 0x70, 0x4C, 0x95, 0x5A, 0xAA,
+    0xFA, 0x15, 0x28, 0x46, 0x51, 0x53, 0x40, 0xF4, 0x82, 0x36, 0xF6, 0x36,
+    0xDE, 0xD4, 0xDE, 0x8D, 0xD6, 0x76, 0x4A, 0x7C, 0xE4, 0x3F, 0x70, 0xE2,
+    0xC2, 0xB5, 0x12, 0x88, 0x03, 0x47, 0xC4, 0x85, 0xFE, 0x13, 0x24, 0x10,
+    0x3F, 0x83, 0x71, 0xBC, 0x76, 0xED, 0x5D, 0x27, 0xB8, 0xBE, 0x64, 0xE7,
+    0xCD, 0x7B, 0xE3, 0x99, 0xB7, 0xF6, 0xC6, 0xFD, 0x50, 0x78, 0x24, 0xA4,
+    0x88, 0x93, 0x88, 0xEE, 0x5A, 0x17, 0xF2, 0xED, 0xD1, 0xA9, 0x85, 0x7C,
+    0x1A, 0x7B, 0xBB, 0xD6, 0x9F, 0x6F, 0x1F, 0xFE, 0x7E, 0xFD, 0xF2, 0x10,
+    0x7E, 0x7E, 0x7F, 0xFC, 0xF1, 0xC8, 0x72, 0xFA, 0x39, 0x91, 0xFB, 0x44,
+    0x8E, 0x16, 0xD1, 0x58, 0x84, 0xB1, 0xD2, 0x4C, 0x24, 0x9D, 0x08, 0xC9,
+    0x08, 0x07, 0x46, 0x24, 0x78, 0x12, 0xBC, 0x00, 0x38, 0x56, 0x6B, 0x67,
+    0x4A, 0xF8, 0x9C, 0x51, 0xD9, 0xC7, 0x45, 0x78, 0xFF, 0x9E, 0xC2, 0x2F,
+    0x6E, 0xAE, 0xE7, 0xB2, 0x2D, 0x11, 0x11, 0x19, 0x1B, 0x20, 0x01, 0x6E,
+    0xD8, 0x42, 0x65, 0x06, 0x36, 0x4D, 0x19, 0x6F, 0x03, 0xC3, 0x90, 0x26,
+    0x66, 0x59, 0x71, 0xF3, 0xDD, 0x44, 0x63, 0x3A, 0x4B, 0x68, 0x34, 0x96,
+    0xD4, 0xC8, 0x08, 0x2F, 0x11, 0x6D, 0x38, 0x17, 0xF3, 0x76, 0x81, 0x7F,
+    0x73, 0xED, 0xE9, 0x19, 0x5C, 0x33, 0xA9, 0x24, 0x2E, 0x23, 0x44, 0xC6,
+    0x63, 0xB9, 0x6B, 0x3D, 0xB1, 0xEA, 0xDE, 0xD9, 0xED, 0xCE, 0x99, 0xF0,
+    0x2A, 0xDF, 0xDA, 0x98, 0x77, 0xB0, 0xCD, 0x94, 0xAF, 0x36, 0xCD, 0xE4,
+    0x82, 0x61, 0x26, 0x08, 0x6E, 0x99, 0x60, 0xEE, 0x94, 0xBD, 0xDA, 0x25,
+    0x9F, 0x2C, 0xD4, 0x63, 0x05, 0x2B, 0xC7, 0x67, 0x11, 0xE1, 0x5E, 0x00,
+    0xAE, 0xE6, 0x51, 0x91, 0x76, 0xC2, 0x94, 0xFB, 0xAC, 0x81, 0x80, 0x25,
+    0x3A, 0x42, 0xA5, 0x27, 0xA9, 0x06, 0x4E, 0x69, 0xAA, 0x21, 0x73, 0x78,
+    0xCC, 0x0D, 0x5A, 0x0C, 0xF7, 0xAF, 0x41, 0xB8, 0x6A, 0xA9, 0xD6, 0x5E,
+    0x6D, 0x0B, 0x55, 0x9F, 0xB6, 0xDE, 0xA3, 0xAD, 0xB7, 0x68, 0xEB, 0x1D,
+    0xDA, 0x7A, 0x77, 0xB6, 0xDE, 0x9C, 0xAD, 0x37, 0x66, 0xB7, 0xB7, 0x05,
+    0xC5, 0x98, 0xCF, 0x68, 0x54, 0xBE, 0x91, 0x2A, 0x74, 0xF6, 0x5C, 0xF0,
+    0xB7, 0x0C, 0x6A, 0x3C, 0x67, 0xA8, 0x25, 0x70, 0xB3, 0x02, 0x20, 0x54,
+    0x12, 0x55, 0x0D, 0x56, 0xF0, 0x7C, 0xD9, 0xE8, 0x99, 0xBD, 0xBD, 0x0F,
+    0xF7, 0xCF, 0xC3, 0x22, 0xEF, 0x90, 0x99, 0x8E, 0xE2, 0x4A, 0x96, 0x07,
+    0xDA, 0x39, 0x52, 0xCC, 0x91, 0xD0, 0x21, 0x49, 0x12, 0x2A, 0xF9, 0x72,
+    0x8F, 0xAB, 0xA8, 0x3C, 0x98, 0xD2, 0x30, 0xB4, 0x9C, 0x43, 0xB8, 0xD0,
+    0x01, 0x72, 0xE1, 0x42, 0x6F, 0xE0, 0xCA, 0xA7, 0xAD, 0x98, 0x5A, 0x19,
+    0x25, 0x0C, 0x05, 0x9F, 0x58, 0xCE, 0xDD, 0x34, 0xB0, 0xCF, 0x4A, 0x82,
+    0x3A, 0xF1, 0xE3, 0x40, 0xC8, 0x04, 0x14, 0x07, 0xD8, 0x75, 0x71, 0x8B,
+    0x02, 0x37, 0xA6, 0x03, 0x20, 0x61, 0x51, 0x6D, 0xDA, 0x5A, 0xD4, 0x98,
+    0x76, 0x30, 0xD8, 0x44, 0x01, 0xDA, 0x84, 0x2E, 0xCE, 0xFB, 0xB8, 0x46,
+    0xD2, 0x2A, 0x34, 0x06, 0x1D, 0x0C, 0x76, 0x5C, 0x77, 0x67, 0x34, 0xEA,
+    0x24, 0x59, 0xCE, 0x59, 0x2A, 0x3A, 0xF0, 0xD5, 0x9C, 0x4B, 0x85, 0x41,
+    0xC7, 0x8D, 0xA1, 0x94, 0x4F, 0x67, 0x80, 0x95, 0xBB, 0x7C, 0x4C, 0xDC,
+    0xE9, 0xE5, 0x20, 0x8A, 0x47, 0x87, 0x07, 0x47, 0x57, 0xAF, 0xDF, 0x05,
+    0x27, 0xD9, 0x79, 0xE1, 0x4C, 0x9D, 0x04, 0x3A, 0x9E, 0x46, 0x63, 0x2A,
+    0x6F, 0xED, 0x69, 0xC4, 0xAA, 0x13, 0xC0, 0xE0, 0xC1, 0xF4, 0x2C, 0x27,
+    0xDB, 0xCA, 0xB2, 0x9E, 0x9D, 0x65, 0x59, 0x1F, 0x37, 0x78, 0x46, 0x21,
+    0x25, 0xF4, 0x52, 0x29, 0x29, 0xF7, 0x16, 0xA5, 0xB2, 0xD7, 0x43, 0x0F,
+    0x3A, 0x4A, 0x67, 0x70, 0x76, 0x50, 0x9E, 0x28, 0xE5, 0x46, 0x8B, 0x0A,
+    0x6B, 0xAD, 0x57, 0x85, 0xCA, 0xE9, 0x1A, 0xA1, 0x2A, 0xEB, 0x53, 0x0F,
+    0x4E, 0x33, 0xD8, 0xEE, 0xAD, 0x52, 0x5F, 0xA4, 0x75, 0x75, 0xF5, 0x6F,
+    0x2B, 0xD2, 0x19, 0xCB, 0xB7, 0xFA, 0xE7, 0xA7, 0x4E, 0x82, 0xAA, 0xED,
+    0x8D, 0x4E, 0xF4, 0x88, 0xF1, 0x34, 0xB6, 0x9C, 0xED, 0x4E, 0xE4, 0x8C,
+    0x4A, 0x61, 0x39, 0x8F, 0x4D, 0x2E, 0x6E, 0xCE, 0x0D, 0x48, 0x69, 0x7C,
+    0x65, 0x45, 0x13, 0x28, 0x9F, 0xB0, 0x65, 0x60, 0x39, 0xBF, 0xDE, 0x7F,
+    0x86, 0x63, 0xA2, 0xC1, 0x30, 0x8B, 0x28, 0x0D, 0x8B, 0x45, 0xBE, 0x80,
+    0xD3, 0xE1, 0xE5, 0x69, 0x67, 0x51, 0xDD, 0x75, 0x53, 0x82, 0xF5, 0x6E,
+    0xF3, 0xD7, 0x61, 0x31, 0xA3, 0x17, 0xC4, 0xCB, 0x4F, 0xBE, 0x72, 0xA9,
+    0x6A, 0xB9, 0x0B, 0xF8, 0xFA, 0xF1, 0xD1, 0x10, 0xBC, 0xC0, 0x75, 0x66,
+    0x99, 0x66, 0x9C, 0x09, 0xBE, 0x32, 0xBD, 0x2F, 0xD2, 0xFC, 0x3B, 0x08,
+    0x8D, 0x12, 0xBF, 0x35, 0xBF, 0xE7, 0x8B, 0x31, 0x45, 0x43, 0xF6, 0x1F,
+    0xC2, 0x80, 0xC2, 0x57, 0xC6, 0xD5, 0x1A, 0xC2, 0x9E, 0x24, 0x63, 0x78,
+    0x63, 0x56, 0x13, 0xCE, 0x02, 0xC2, 0x5A, 0xD3, 0x27, 0x22, 0x4B, 0x2F,
+    0x09, 0x3A, 0x16, 0x49, 0xC0, 0xBC, 0x7C, 0x8E, 0xED, 0x57, 0x4F, 0x91,
+    0xBB, 0x8E, 0x0A, 0x23, 0x7B, 0x81, 0x28, 0xA9, 0xA7, 0x6B, 0x6E, 0x0A,
+    0xCC, 0x49, 0x3E, 0x19, 0x7A, 0xBE, 0x86, 0x34, 0x12, 0x1D, 0x48, 0xEE,
+    0x22, 0xE5, 0x93, 0xA9, 0x58, 0xF2, 0x54, 0x73, 0xF8, 0x76, 0xCF, 0xF2,
+    0xA8, 0xF8, 0xD2, 0x85, 0xE5, 0x3F, 0x5D, 0x49, 0xBE, 0x1B};
+const uint8_t g_itIT_Locale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6A, 0xD4, 0x40, 0x14, 0x7D, 0x17, 0xFC,
+    0x87, 0x21, 0x58, 0x50, 0x68, 0x3B, 0xFA, 0xD8, 0x92, 0x06, 0x4A, 0x5B,
+    0xBB, 0xA5, 0x46, 0x96, 0xEE, 0xAA, 0xD8, 0x17, 0x99, 0x64, 0xA6, 0xD9,
+    0xB1, 0xC9, 0xCC, 0x32, 0x49, 0x5A, 0x92, 0x47, 0xF1, 0xC1, 0x37, 0x7F,
+    0x42, 0x10, 0x41, 0xF1, 0x23, 0xFC, 0x13, 0xA1, 0xE2, 0x67, 0x78, 0xB3,
+    0x99, 0xA4, 0xC9, 0x64, 0xBA, 0xA6, 0x79, 0xD9, 0xB9, 0xE7, 0x9E, 0x73,
+    0x73, 0xEF, 0x99, 0x64, 0x36, 0x6E, 0x2C, 0x43, 0x12, 0x33, 0x24, 0x48,
+    0xC2, 0xF6, 0x1C, 0x9E, 0xBD, 0x3B, 0x99, 0x3B, 0x88, 0xB2, 0x34, 0xDC,
+    0x73, 0xFE, 0x7C, 0xFC, 0x7C, 0xF3, 0xE5, 0xEB, 0xCD, 0xA7, 0x6F, 0x7F,
+    0x7F, 0xFE, 0x78, 0xDC, 0x06, 0x4F, 0x1C, 0xCF, 0xAD, 0x14, 0x82, 0x12,
+    0x35, 0x2B, 0x92, 0x40, 0xC6, 0xA9, 0x16, 0x47, 0x8A, 0x45, 0x52, 0x71,
+    0x22, 0x80, 0x91, 0x48, 0x91, 0x2D, 0x5E, 0x02, 0x9C, 0xEA, 0xB5, 0x17,
+    0x31, 0x21, 0x08, 0x97, 0x2E, 0xAE, 0xC3, 0x87, 0x0F, 0x34, 0x7E, 0xC1,
+    0x82, 0x40, 0xD9, 0x12, 0x09, 0x51, 0xE5, 0x10, 0x25, 0x4B, 0xC5, 0x63,
+    0x66, 0x21, 0x47, 0x91, 0xA5, 0x46, 0xC4, 0xF3, 0x48, 0x0C, 0xE1, 0x38,
+    0x8F, 0x62, 0x0B, 0x9B, 0x44, 0x32, 0xCD, 0x86, 0x70, 0xCA, 0xB2, 0x8C,
+    0x25, 0x81, 0x1A, 0xDE, 0x55, 0x66, 0x99, 0xB4, 0xE1, 0x42, 0x5E, 0xD9,
+    0x05, 0x94, 0x87, 0x66, 0x02, 0x77, 0xAC, 0x6A, 0x78, 0xAB, 0x08, 0x11,
+    0x30, 0x66, 0xCF, 0x79, 0xE6, 0x74, 0x1C, 0xB4, 0xB9, 0x67, 0x33, 0xCE,
+    0x66, 0x9B, 0xCD, 0x33, 0x9B, 0x61, 0x36, 0xB7, 0x6C, 0x56, 0xD9, 0x7C,
+    0xB2, 0x39, 0x64, 0x73, 0xC7, 0x66, 0xCC, 0xDD, 0x9E, 0x50, 0x52, 0xE8,
+    0x47, 0x09, 0x56, 0x1E, 0x95, 0x09, 0x13, 0x3C, 0x24, 0x2E, 0xAE, 0xA2,
+    0x3A, 0x0D, 0x3D, 0x0A, 0x46, 0x7F, 0x7D, 0xEF, 0x61, 0xE0, 0x43, 0x36,
+    0x04, 0x99, 0x0A, 0x65, 0x3C, 0x80, 0xE1, 0xE1, 0xB9, 0x1A, 0x80, 0x57,
+    0x4C, 0x30, 0x65, 0x82, 0x29, 0x09, 0x48, 0xF5, 0x90, 0x68, 0x08, 0xB7,
+    0xCD, 0x75, 0x1A, 0xED, 0x6C, 0x9D, 0xEE, 0xD8, 0x6C, 0xD6, 0x6C, 0xD4,
+    0xEC, 0xD1, 0x6C, 0xCE, 0xEC, 0xCB, 0x6C, 0xC9, 0xDE, 0x0F, 0x14, 0xE2,
+    0x94, 0xB3, 0xA4, 0x79, 0x11, 0x75, 0xE8, 0xED, 0xFB, 0x60, 0x71, 0x13,
+    0x74, 0x78, 0xDE, 0xD4, 0x48, 0xE0, 0x7E, 0x05, 0x40, 0x98, 0x22, 0xBA,
+    0x1A, 0xAC, 0x3C, 0x72, 0xE0, 0xE2, 0xEA, 0xB7, 0x4E, 0x78, 0xF4, 0x36,
+    0xC4, 0x2D, 0xB1, 0x0A, 0x8C, 0x03, 0xA3, 0x6E, 0x3C, 0x63, 0x53, 0x02,
+    0x6F, 0x96, 0x12, 0xAB, 0x8D, 0x6D, 0x23, 0x7D, 0x9A, 0x5C, 0xE4, 0x71,
+    0xEC, 0x78, 0x47, 0x70, 0xA1, 0x43, 0xE4, 0xC3, 0x85, 0xDE, 0xC2, 0x55,
+    0xCD, 0xD7, 0x32, 0x8D, 0x32, 0x5A, 0x18, 0x4B, 0x11, 0x39, 0xDE, 0xE1,
+    0xFD, 0x44, 0x09, 0xA3, 0x95, 0x06, 0x83, 0x04, 0x8F, 0x12, 0xA4, 0x0B,
+    0xA9, 0x32, 0x2D, 0xB1, 0x29, 0x70, 0x6F, 0x3E, 0x00, 0x32, 0x9E, 0x74,
+    0xE6, 0xED, 0x44, 0xBD, 0x79, 0x27, 0x93, 0x5D, 0xDF, 0xDF, 0x9D, 0xCD,
+    0xD0, 0xB9, 0x8B, 0x3B, 0x1C, 0xA3, 0x40, 0x6F, 0xD2, 0xFB, 0x28, 0x56,
+    0x63, 0x36, 0xF7, 0x18, 0xC1, 0xD7, 0x53, 0xAE, 0x14, 0x03, 0x3A, 0xEE,
+    0x8D, 0xA4, 0x5D, 0x9A, 0x03, 0xD6, 0xEC, 0xF2, 0x71, 0xE1, 0xD3, 0xCB,
+    0x49, 0x92, 0xCE, 0x8E, 0x0E, 0x9F, 0x5F, 0xBF, 0x21, 0x8B, 0xD3, 0xF2,
+    0xBC, 0xF6, 0xA5, 0x4B, 0x02, 0x9D, 0xC8, 0x93, 0x80, 0xA9, 0x5B, 0x73,
+    0x7A, 0xB1, 0xEE, 0x04, 0x30, 0x78, 0x14, 0x43, 0xC7, 0x2B, 0x37, 0xCB,
+    0x72, 0x67, 0xBB, 0x2C, 0x4B, 0x17, 0xF7, 0x78, 0x83, 0x42, 0x5A, 0x18,
+    0xE6, 0x4A, 0x31, 0x11, 0x16, 0x8E, 0xF7, 0x08, 0xD5, 0xDA, 0x9D, 0x9D,
+    0x91, 0xD2, 0x25, 0x9C, 0x15, 0x4C, 0x64, 0xFA, 0x9E, 0x1B, 0x16, 0x15,
+    0x36, 0x5A, 0x6F, 0x0B, 0x35, 0xD3, 0xF5, 0x42, 0x5D, 0x96, 0xB2, 0x90,
+    0x27, 0x04, 0x36, 0x7B, 0xB3, 0xD1, 0xD7, 0x69, 0x53, 0xDD, 0xFE, 0xAD,
+    0xCA, 0x7C, 0xC9, 0xAB, 0x9D, 0xDE, 0x1E, 0xC5, 0x6F, 0xBB, 0xDE, 0x18,
+    0x45, 0x4F, 0xB8, 0xC8, 0x53, 0xC7, 0xDB, 0x1A, 0x45, 0x2E, 0x99, 0x92,
+    0x8E, 0xF7, 0x74, 0xC8, 0xC5, 0xFD, 0xB1, 0x01, 0x69, 0x7C, 0x6F, 0x9D,
+    0xE8, 0x03, 0xCD, 0x03, 0xB6, 0x0A, 0x1C, 0xEF, 0xF7, 0x07, 0x38, 0x65,
+    0xFB, 0x8C, 0x61, 0x91, 0xE6, 0x23, 0x25, 0x95, 0xD5, 0x02, 0x0E, 0x87,
+    0x57, 0x67, 0xA3, 0x45, 0x5D, 0xD3, 0x87, 0x12, 0x6C, 0x76, 0x5B, 0xBD,
+    0x0D, 0xC5, 0x92, 0x5D, 0x90, 0xB0, 0x3A, 0xEA, 0x9A, 0xA5, 0xAE, 0xE5,
+    0x17, 0xF0, 0x95, 0x43, 0xD1, 0x14, 0xBC, 0xC0, 0x5D, 0x66, 0x93, 0xE6,
+    0x82, 0x4B, 0x71, 0x67, 0xFA, 0x40, 0xE6, 0x8A, 0x33, 0x85, 0x66, 0x19,
+    0xB5, 0xE6, 0xF7, 0xA9, 0x0C, 0x18, 0x9A, 0xF2, 0xFF, 0x10, 0x26, 0x0C,
+    0xBE, 0x23, 0xAE, 0xD7, 0x10, 0xF6, 0x15, 0x09, 0xE0, 0x85, 0xB9, 0x9B,
+    0x30, 0x5F, 0x10, 0x6E, 0x4D, 0x9F, 0xCA, 0x32, 0xBF, 0x24, 0xE8, 0x58,
+    0x66, 0x0B, 0x1E, 0x56, 0x73, 0x6C, 0xBD, 0x3E, 0x41, 0xFE, 0x3A, 0x2A,
+    0x8C, 0x1C, 0x2E, 0x64, 0x43, 0x3D, 0x5B, 0x73, 0x53, 0x60, 0x46, 0xD5,
+    0x64, 0xE8, 0xC5, 0x1A, 0xD2, 0x4C, 0x8E, 0x20, 0xF9, 0x45, 0x2E, 0xA2,
+    0xF7, 0x72, 0xC5, 0xD3, 0xCD, 0xE1, 0xDB, 0x3D, 0xAB, 0xA2, 0xFA, 0xD3,
+    0x16, 0x96, 0xFF, 0x00, 0x20, 0x8B, 0xBE, 0xF7};
+const uint8_t g_ptBR_Locale[] = {
+    0x78, 0x9C, 0x9D, 0x56, 0x3D, 0x6F, 0xD4, 0x40, 0x10, 0xAD, 0x83, 0xC4,
+    0x7F, 0x58, 0x59, 0x89, 0x0E, 0xA4, 0x24, 0x86, 0x92, 0xC8, 0x67, 0xE9,
+    0x92, 0x0B, 0x39, 0x94, 0x18, 0x9D, 0xCE, 0x11, 0x88, 0x34, 0x68, 0x6D,
+    0xEF, 0xD9, 0x9B, 0xD8, 0xBB, 0xC7, 0xDA, 0x4E, 0xB0, 0x6B, 0x1A, 0x3A,
+    0x28, 0x29, 0x53, 0x20, 0x2A, 0x44, 0x83, 0x44, 0x49, 0x91, 0xDF, 0x82,
+    0xB8, 0x9F, 0xC1, 0xFA, 0xF3, 0xFC, 0xB1, 0x36, 0x06, 0x37, 0xDE, 0x99,
+    0x79, 0x6F, 0x3D, 0xF3, 0x76, 0x76, 0x64, 0xC5, 0xA5, 0x26, 0x74, 0x11,
+    0x20, 0xD0, 0x43, 0x63, 0x69, 0x15, 0xBC, 0x3E, 0x5C, 0x48, 0xC0, 0x42,
+    0xBE, 0x39, 0x96, 0xD6, 0x1F, 0x6F, 0xD7, 0x1F, 0xDE, 0xFD, 0x7E, 0xFF,
+    0x69, 0xFD, 0xED, 0xEB, 0x83, 0x5F, 0x3F, 0xBE, 0xAF, 0x3F, 0xFF, 0x7C,
+    0x28, 0xA9, 0xF7, 0xEF, 0x01, 0xA0, 0x24, 0x14, 0x62, 0x41, 0xA6, 0x47,
+    0x9E, 0x41, 0x5D, 0x3F, 0x67, 0xDB, 0x0C, 0xD9, 0x94, 0x61, 0x48, 0x12,
+    0xD4, 0x16, 0x50, 0x3C, 0x4A, 0x02, 0xE7, 0x39, 0x0F, 0xF9, 0x89, 0xBD,
+    0x95, 0xD9, 0xEA, 0x25, 0x24, 0x08, 0x33, 0xAA, 0xC8, 0x99, 0x59, 0x89,
+    0x2C, 0xD1, 0x35, 0x62, 0x1D, 0x31, 0x0F, 0xB2, 0xBB, 0x2F, 0xA2, 0x00,
+    0x34, 0x18, 0x76, 0x85, 0x04, 0x2C, 0x82, 0x5F, 0x86, 0xC4, 0x11, 0xFB,
+    0x5D, 0xA1, 0x1F, 0xDA, 0xD4, 0x0F, 0x44, 0x01, 0x1F, 0x05, 0xC8, 0x33,
+    0x84, 0xB9, 0xD2, 0x30, 0x08, 0xC5, 0x11, 0x42, 0xAF, 0xBB, 0x48, 0x16,
+    0x8A, 0x9B, 0x21, 0x90, 0xAF, 0x4B, 0x09, 0xAB, 0x92, 0x02, 0x68, 0x18,
+    0x6C, 0x2C, 0x3D, 0x96, 0x1A, 0xDA, 0x8A, 0x75, 0x15, 0x2B, 0x2A, 0x96,
+    0x53, 0x2C, 0xA6, 0x58, 0x4B, 0xB1, 0x92, 0x62, 0x1D, 0xC5, 0x22, 0x8A,
+    0xF5, 0x13, 0x6B, 0x27, 0x96, 0xAD, 0x5F, 0x31, 0x0B, 0x46, 0x95, 0x16,
+    0xE4, 0x96, 0x6A, 0x51, 0x0F, 0x93, 0x24, 0x9D, 0xC4, 0x28, 0xBD, 0x3E,
+    0xB2, 0x43, 0xDE, 0xD2, 0x7B, 0x4B, 0xDE, 0x80, 0xB0, 0x11, 0x0B, 0x10,
+    0x6F, 0x3E, 0x71, 0xE8, 0x4D, 0x08, 0x59, 0xD0, 0x15, 0xC2, 0xA4, 0x23,
+    0xE4, 0xA3, 0xB7, 0x5D, 0x91, 0xBB, 0x5B, 0x03, 0x5A, 0x9B, 0xE4, 0x40,
+    0xBA, 0x12, 0xD4, 0xD3, 0x38, 0xFF, 0xBC, 0xB0, 0x76, 0x51, 0xED, 0x52,
+    0xDA, 0x15, 0xB4, 0x13, 0x6F, 0xE7, 0x2B, 0xC8, 0xB3, 0x3B, 0x49, 0x0F,
+    0x31, 0x6C, 0x61, 0xE4, 0x55, 0x2F, 0x7F, 0xEE, 0x52, 0x27, 0x1A, 0x3F,
+    0xA4, 0xC2, 0xA8, 0x87, 0xE6, 0x8D, 0x10, 0xD8, 0x98, 0x95, 0xCD, 0x11,
+    0x83, 0x95, 0x7D, 0xB9, 0xA5, 0x1E, 0x1E, 0x29, 0x72, 0xF2, 0x2E, 0x1D,
+    0x93, 0x69, 0xE9, 0x00, 0xE9, 0xAA, 0x20, 0xF0, 0xD9, 0x25, 0x37, 0x86,
+    0x57, 0xE6, 0xB5, 0x60, 0x80, 0xE6, 0x30, 0xE0, 0xF2, 0x90, 0x52, 0xE8,
+    0xD2, 0x93, 0xCF, 0xB7, 0x65, 0xE8, 0xBA, 0x92, 0x7A, 0xCC, 0x9F, 0x5D,
+    0x30, 0x1D, 0xF1, 0x29, 0x09, 0x46, 0x1A, 0x7F, 0xB2, 0xD5, 0x2B, 0xFE,
+    0x24, 0x32, 0x94, 0xA4, 0xAE, 0x5D, 0x5C, 0x4A, 0x6C, 0x49, 0xFD, 0x7F,
+    0xBE, 0x87, 0x2C, 0x4E, 0x9F, 0xCA, 0x9A, 0x26, 0x0F, 0xE6, 0xF8, 0x0E,
+    0x65, 0xC1, 0x86, 0xD5, 0xE4, 0x00, 0x50, 0xF3, 0xE4, 0x92, 0x04, 0xD8,
+    0x6B, 0x48, 0x52, 0xF1, 0xD4, 0x24, 0x99, 0xCD, 0x46, 0x0E, 0x2F, 0x65,
+    0xC4, 0xEF, 0xD5, 0x48, 0xD7, 0x47, 0xFE, 0x08, 0x5C, 0x28, 0x72, 0x05,
+    0xDC, 0xC5, 0xCE, 0xA4, 0x48, 0xC9, 0x19, 0x77, 0x38, 0x35, 0x55, 0x61,
+    0x36, 0x3B, 0xD0, 0xB4, 0x03, 0x5D, 0x1F, 0xC4, 0xC8, 0x35, 0x48, 0x39,
+    0x4D, 0x42, 0x22, 0x40, 0xA3, 0xDC, 0xBC, 0x27, 0xCE, 0xB9, 0xB7, 0x68,
+    0x94, 0x93, 0x48, 0xB3, 0xAE, 0x66, 0x9E, 0xAF, 0x1F, 0x4F, 0x9F, 0xDE,
+    0xBC, 0x84, 0xCE, 0x69, 0x7C, 0x91, 0xE9, 0x56, 0x05, 0xA5, 0x4C, 0x12,
+    0x7A, 0x06, 0x62, 0x75, 0xF1, 0x6A, 0xBE, 0x3C, 0x27, 0xEE, 0xE3, 0xFD,
+    0x6D, 0x4A, 0x6A, 0xBC, 0x1B, 0xC7, 0x4F, 0xF6, 0xE3, 0x98, 0x0F, 0xB3,
+    0x1A, 0xAE, 0x9B, 0x6A, 0x86, 0x8C, 0x21, 0x62, 0x46, 0x92, 0xBA, 0x0D,
+    0x0A, 0xF6, 0x60, 0xF2, 0x0A, 0x31, 0x13, 0x91, 0x20, 0xFF, 0xEE, 0x4E,
+    0x9B, 0x97, 0x08, 0xD2, 0x2A, 0xA2, 0x2C, 0x6C, 0x53, 0xEB, 0x56, 0xDD,
+    0x95, 0x6F, 0x6F, 0x21, 0x13, 0x7B, 0x90, 0x37, 0xC6, 0x6E, 0xB1, 0x4B,
+    0x16, 0xEE, 0x24, 0xD8, 0x8C, 0x86, 0x2B, 0x9C, 0x34, 0xC3, 0xFE, 0x40,
+    0x46, 0x59, 0xC1, 0xCE, 0x40, 0x02, 0xEF, 0xAF, 0xD0, 0x97, 0xD4, 0xBD,
+    0x81, 0xF0, 0x18, 0x31, 0x2A, 0xA9, 0x8F, 0x5A, 0xE8, 0x8D, 0x30, 0xB5,
+    0x03, 0x2F, 0x4E, 0xA3, 0xA6, 0x4C, 0xDD, 0x59, 0xB4, 0x61, 0x6A, 0x48,
+    0xEA, 0x62, 0x9B, 0x4F, 0xA2, 0x1A, 0xA0, 0x87, 0x84, 0x7D, 0x9A, 0x2C,
+    0x24, 0xF5, 0x70, 0x71, 0xF6, 0x0F, 0xB4, 0xEA, 0x39, 0xB4, 0x48, 0xE9,
+    0x28, 0x6C, 0xA5, 0x9D, 0xDC, 0xFB, 0x68, 0x85, 0x96, 0xD0, 0x2C, 0xC6,
+    0x6D, 0x61, 0xE6, 0x7B, 0x6A, 0x11, 0xFF, 0xC3, 0xB3, 0xC0, 0x9C, 0xCB,
+    0x23, 0x8B, 0x01, 0x98, 0x60, 0x4A, 0x7A, 0x00, 0x47, 0x34, 0x64, 0x18,
+    0x31, 0xA0, 0x07, 0x56, 0x07, 0x62, 0x62, 0x51, 0x03, 0x81, 0x39, 0xFE,
+    0x2B, 0x64, 0x86, 0x0C, 0x86, 0x6E, 0x7A, 0x21, 0x13, 0x06, 0x0D, 0x7E,
+    0xC3, 0xFA, 0x20, 0xE7, 0x0E, 0xC4, 0x1D, 0x80, 0x53, 0x1A, 0x87, 0x57,
+    0x10, 0x9C, 0xD0, 0xC0, 0xC1, 0x66, 0x52, 0xD3, 0xDE, 0x8B, 0x67, 0x40,
+    0xEB, 0x07, 0x73, 0x01, 0x4C, 0x87, 0x16, 0xE0, 0x45, 0xEF, 0xA7, 0x39,
+    0xD6, 0x4E, 0xAA, 0x04, 0x67, 0xBD, 0x30, 0x9D, 0x0E, 0x82, 0x69, 0x51,
+    0x48, 0xEC, 0x4B, 0x9A, 0x22, 0xB3, 0x24, 0xD3, 0xC1, 0x56, 0x39, 0x4F,
+    0x45, 0xCE, 0xFE, 0xF7, 0xD5, 0x3F, 0x30, 0xBB, 0xD9, 0x9B};
+const uint8_t g_nlNL_Locale[] = {
+    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x4F, 0xDC, 0x30, 0x10, 0x3D, 0x53, 0xA9,
+    0xFF, 0xC1, 0x8A, 0x8A, 0x68, 0x25, 0x96, 0x2D, 0x47, 0x50, 0x88, 0xB4,
+    0x05, 0x0A, 0x15, 0x04, 0xAD, 0x58, 0xDA, 0xAA, 0x5C, 0x2A, 0x6F, 0x62,
+    0x76, 0xBD, 0x24, 0xF6, 0xCA, 0x89, 0x41, 0xC9, 0xB1, 0x52, 0x8F, 0xFD,
+    0x27, 0xAD, 0xDA, 0x5B, 0xFF, 0x4F, 0xA5, 0x4A, 0xFC, 0x8C, 0x8E, 0xF3,
+    0x45, 0x12, 0x3B, 0x69, 0xC8, 0x05, 0xCF, 0x9B, 0xF7, 0xBC, 0x33, 0xCF,
+    0xCE, 0x10, 0x3B, 0xE0, 0x1E, 0x0E, 0x08, 0x62, 0x38, 0x24, 0x07, 0x16,
+    0x0B, 0x3E, 0x5F, 0x9C, 0x5B, 0xC8, 0x27, 0x91, 0x77, 0x60, 0x3D, 0x7C,
+    0xFB, 0xFD, 0xF7, 0xEB, 0xAF, 0x87, 0x9F, 0x3F, 0x5E, 0xE6, 0xAB, 0x57,
+    0x96, 0xF3, 0xFC, 0x19, 0x42, 0xB6, 0xE2, 0x33, 0x1F, 0x8B, 0x59, 0x12,
+    0xCE, 0x79, 0x10, 0x15, 0xD2, 0x85, 0x20, 0x0B, 0x2E, 0x28, 0x66, 0x8A,
+    0xB5, 0x81, 0xEC, 0x90, 0xB3, 0x78, 0x79, 0x01, 0xA9, 0x48, 0xC5, 0x1B,
+    0x79, 0xEC, 0xAC, 0x30, 0x93, 0x58, 0x50, 0x7B, 0x9C, 0x87, 0xB5, 0xCC,
+    0x0D, 0x99, 0x8B, 0x8E, 0x54, 0x88, 0xB1, 0x88, 0x0D, 0x38, 0x5E, 0x0B,
+    0x1A, 0x98, 0xF8, 0xC4, 0xB4, 0xCB, 0x4A, 0x32, 0x33, 0x1C, 0x98, 0x60,
+    0x2C, 0x17, 0x32, 0x8A, 0x65, 0x64, 0x48, 0x45, 0x64, 0x1D, 0x93, 0x70,
+    0x4E, 0x84, 0x21, 0xC7, 0x6F, 0x63, 0x6E, 0xCE, 0x30, 0x7E, 0xD7, 0x25,
+    0xF2, 0x89, 0xD7, 0x4E, 0xA1, 0x62, 0x5D, 0x19, 0x58, 0x37, 0x14, 0xE1,
+    0xF9, 0x5C, 0x1C, 0x58, 0xBB, 0x56, 0xCB, 0x59, 0xB3, 0xAB, 0x26, 0x83,
+    0xBA, 0xEC, 0x7C, 0x8A, 0x99, 0x66, 0x2F, 0xCD, 0x56, 0x9A, 0x5D, 0x34,
+    0xFB, 0x67, 0xF6, 0xCE, 0x6C, 0x5B, 0xBF, 0x63, 0x3E, 0x4E, 0x6A, 0x17,
+    0x10, 0x22, 0x27, 0xE5, 0x70, 0x71, 0xA1, 0x1A, 0xB5, 0xAE, 0x40, 0xB8,
+    0x5E, 0x06, 0xD4, 0xA7, 0x2C, 0xD2, 0xD1, 0x7B, 0x4E, 0x4C, 0xB0, 0x0F,
+    0xFB, 0x12, 0xA1, 0xE3, 0x77, 0x82, 0xAE, 0x74, 0x34, 0xC5, 0x71, 0x93,
+    0x8C, 0xB2, 0x95, 0xA1, 0xF2, 0xD6, 0x49, 0xE7, 0x2D, 0x68, 0xE5, 0x6B,
+    0x95, 0x6B, 0x45, 0x6B, 0xE5, 0x6A, 0x75, 0x6A, 0x25, 0x76, 0x17, 0x17,
+    0x12, 0x41, 0x7D, 0x4A, 0xC2, 0xFA, 0xCB, 0x5D, 0x40, 0xCE, 0xC4, 0x85,
+    0x63, 0x28, 0x83, 0x66, 0x6A, 0xDA, 0x4A, 0xA1, 0xC7, 0xB0, 0xB6, 0x39,
+    0x11, 0xB8, 0xB6, 0x2F, 0x44, 0xCE, 0x9B, 0x43, 0x7B, 0xAC, 0xFE, 0x56,
+    0xC0, 0xE4, 0xA8, 0x02, 0x50, 0xB6, 0x2A, 0x05, 0x30, 0x9B, 0xC6, 0xAD,
+    0xE1, 0x94, 0xA3, 0x3E, 0x18, 0x3E, 0xC5, 0x31, 0xB8, 0xCE, 0x2A, 0x83,
+    0x2B, 0xA4, 0x98, 0x5F, 0x37, 0x32, 0x08, 0x2C, 0xE7, 0x18, 0x1E, 0x74,
+    0x84, 0x5C, 0x78, 0xD0, 0x27, 0x78, 0x54, 0xEF, 0x15, 0xB3, 0x4B, 0x1A,
+    0x70, 0xB6, 0xB0, 0x9C, 0xA7, 0xAA, 0x42, 0xE2, 0x83, 0x68, 0x04, 0x9A,
+    0xD1, 0x60, 0x4D, 0xB4, 0xE4, 0x22, 0xCE, 0x54, 0x23, 0x5D, 0x81, 0x50,
+    0x03, 0x29, 0x7A, 0x8F, 0x69, 0xD8, 0xEA, 0xBD, 0x86, 0x34, 0x7A, 0x3F,
+    0xDD, 0x77, 0xDD, 0xFD, 0xD9, 0x6C, 0x0B, 0x49, 0x29, 0xB6, 0xD0, 0xB5,
+    0x3D, 0xAE, 0x11, 0xBB, 0x94, 0x79, 0xEB, 0x85, 0x72, 0xA0, 0x26, 0x6B,
+    0xBC, 0x90, 0x0C, 0x12, 0x14, 0x5D, 0x2B, 0x49, 0x9B, 0xAF, 0x7A, 0x6E,
+    0x75, 0x58, 0x9C, 0xF7, 0x15, 0xA0, 0xE5, 0x25, 0x38, 0x49, 0x5C, 0xFF,
+    0xF6, 0x34, 0x8C, 0x66, 0xC7, 0x47, 0x6F, 0xEF, 0x3F, 0xE2, 0xE5, 0x59,
+    0x7A, 0x9D, 0x5B, 0x55, 0x27, 0x65, 0x4A, 0x26, 0xD5, 0x20, 0x6E, 0xFA,
+    0xD5, 0xC0, 0xCA, 0x7F, 0x94, 0x52, 0xDD, 0x5D, 0xCF, 0x72, 0xD2, 0xED,
+    0x34, 0xDD, 0xDB, 0x49, 0xD3, 0xD4, 0x1E, 0x37, 0x78, 0xDD, 0x52, 0x4F,
+    0x0A, 0x41, 0x98, 0x97, 0x58, 0xCE, 0x0B, 0x94, 0xAB, 0xF7, 0xF6, 0xA2,
+    0xC1, 0xEA, 0x35, 0x11, 0x1E, 0x61, 0x71, 0xF1, 0xC3, 0x9B, 0xBA, 0x4E,
+    0x39, 0xA2, 0x75, 0x51, 0x75, 0xF6, 0xD8, 0xEC, 0x46, 0x13, 0x2A, 0xB6,
+    0x87, 0x99, 0x4A, 0x43, 0x0C, 0x97, 0x61, 0xBB, 0xDC, 0x25, 0x4F, 0x77,
+    0x0A, 0x16, 0x82, 0xCB, 0x35, 0x55, 0x97, 0x60, 0x67, 0xA0, 0xA2, 0xEA,
+    0x60, 0x73, 0xA0, 0x20, 0xA4, 0x4C, 0x46, 0x96, 0x33, 0x1A, 0x48, 0x4F,
+    0x89, 0xE0, 0x96, 0xF3, 0x5A, 0x63, 0x3F, 0x1A, 0xD3, 0x38, 0xF1, 0xF2,
+    0x38, 0x1A, 0xCE, 0x34, 0xC1, 0xF2, 0x1A, 0x66, 0x81, 0xE5, 0xFC, 0xF9,
+    0xF2, 0x1D, 0xE6, 0x4C, 0x83, 0xD1, 0xA3, 0xA2, 0x11, 0x57, 0x0B, 0x18,
+    0x2D, 0xEF, 0x2F, 0x9F, 0x20, 0xAB, 0x1F, 0x84, 0x26, 0xCA, 0x06, 0x9D,
+    0x56, 0xB7, 0x7A, 0xD9, 0x93, 0x35, 0xB9, 0xC1, 0x5E, 0x39, 0x4C, 0xCB,
+    0xB0, 0xD8, 0xD3, 0x4D, 0xE0, 0xFB, 0xCC, 0x47, 0x53, 0xF0, 0x67, 0x6C,
+    0x26, 0x50, 0x46, 0x39, 0xEB, 0x21, 0x1C, 0x72, 0x29, 0x28, 0x11, 0x68,
+    0x16, 0xFB, 0x1D, 0x8C, 0x89, 0x0F, 0xDF, 0x3F, 0x68, 0x4A, 0xFF, 0x4B,
+    0x39, 0x85, 0xEF, 0x3D, 0x72, 0xDF, 0x4B, 0x99, 0x08, 0x3C, 0x87, 0x77,
+    0xAC, 0x8F, 0x72, 0xB5, 0xC4, 0xB4, 0x83, 0x70, 0xC6, 0x53, 0x79, 0x8B,
+    0xD1, 0x09, 0x8F, 0x97, 0xD4, 0x53, 0x3D, 0x8D, 0x3E, 0xBC, 0x43, 0x6E,
+    0x3F, 0x19, 0x0C, 0xF0, 0x96, 0xBC, 0x24, 0x5F, 0xF6, 0xFE, 0x34, 0x70,
+    0x17, 0xAA, 0x4B, 0x74, 0xDE, 0x4B, 0x9B, 0xF1, 0x41, 0x34, 0x37, 0x91,
+    0x6C, 0xB1, 0xE2, 0x19, 0x33, 0x2F, 0x32, 0x1B, 0x6D, 0xB5, 0xF3, 0xB4,
+    0xC7, 0xF9, 0xA7, 0xBA, 0xF3, 0x0F, 0xD5, 0xFA, 0xC0, 0xFA};
+const uint8_t g_ruRU_Locale[] = {
+    0x78, 0x9C, 0xAD, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2,
+    0x7F, 0x98, 0x6C, 0x24, 0x68, 0x02, 0xAD, 0x1E, 0x25, 0x65, 0x13, 0x22,
+    0x0A, 0x06, 0xD7, 0x90, 0x16, 0x34, 0x72, 0x31, 0xDB, 0xDD, 0xA1, 0x5D,
+    0xE8, 0xEE, 0x90, 0xE9, 0x6E, 0xB0, 0x7B, 0x2A, 0x85, 0xE8, 0x05, 0x25,
+    0xE1, 0xA0, 0x47, 0xF4, 0xE4, 0xC9, 0x50, 0xBE, 0x12, 0x82, 0xB6, 0x24,
+    0xFE, 0x82, 0xD9, 0xFF, 0x60, 0xD4, 0x9F, 0xE1, 0x3B, 0xFB, 0xD1, 0xEE,
+    0xB7, 0xC5, 0xD8, 0x1E, 0x3A, 0xF3, 0x3E, 0xCF, 0xF3, 0xCE, 0xFB, 0xB5,
+    0xD3, 0xB6, 0xD4, 0x20, 0x8A, 0xDC, 0xC0, 0xC8, 0x90, 0x75, 0x3C, 0x23,
+    0x50, 0xEB, 0x65, 0x79, 0x45, 0x40, 0x2A, 0x6E, 0x2A, 0x33, 0xC2, 0x8F,
+    0xAB, 0xDD, 0xDF, 0x47, 0x5F, 0x6E, 0xC3, 0xC7, 0xAF, 0xDE, 0x87, 0x9F,
+    0xEF, 0x8F, 0xEE, 0x08, 0xE2, 0xCD, 0x1B, 0x08, 0x95, 0x38, 0xDF, 0x50,
+    0x65, 0x5A, 0x69, 0xE9, 0x55, 0xD2, 0x68, 0xFA, 0xD2, 0x1A, 0xC5, 0x35,
+    0x42, 0x35, 0xD9, 0xE0, 0xAC, 0x31, 0x54, 0xD2, 0x89, 0x61, 0xD6, 0x9F,
+    0x02, 0xD4, 0xE4, 0xFB, 0x31, 0x6F, 0x2F, 0x3A, 0xFB, 0xAC, 0xC7, 0x4E,
+    0x58, 0xD7, 0x69, 0x3B, 0xFB, 0xA5, 0xA2, 0x67, 0x0B, 0xC3, 0xBB, 0xEC,
+    0x9C, 0x9D, 0x38, 0x6D, 0xD6, 0x65, 0x5F, 0x53, 0x09, 0xEC, 0x9B, 0xAB,
+    0xED, 0xB0, 0x6E, 0x1A, 0xD8, 0x65, 0x57, 0xA0, 0x3D, 0xCF, 0xD3, 0xA6,
+    0x02, 0x17, 0xCE, 0x3B, 0xD6, 0xCB, 0x86, 0x32, 0xDC, 0x75, 0x21, 0x91,
+    0x53, 0x67, 0xC7, 0xD9, 0xCE, 0x08, 0xC7, 0xD9, 0x86, 0x50, 0x7A, 0x4E,
+    0x07, 0x72, 0x3E, 0xCE, 0xC8, 0x97, 0xF5, 0xD9, 0x65, 0x3E, 0xA1, 0xC7,
+    0xFA, 0x79, 0xF0, 0x19, 0x1C, 0x71, 0x09, 0x91, 0xC4, 0x09, 0xC8, 0x5F,
+    0x0F, 0x1A, 0x10, 0x6E, 0x08, 0x92, 0xAB, 0x55, 0x3A, 0x23, 0xDC, 0x13,
+    0x92, 0x9D, 0x29, 0xE4, 0x34, 0x25, 0x0D, 0x1B, 0xA1, 0x1F, 0x99, 0xB2,
+    0xFF, 0xDD, 0x8A, 0xD4, 0xD8, 0xFD, 0x1E, 0xA4, 0x06, 0xE1, 0x16, 0x3F,
+    0x15, 0xF1, 0xAB, 0x9E, 0x8A, 0xB9, 0x25, 0x2F, 0xE4, 0xD7, 0x5A, 0x95,
+    0x5B, 0xA1, 0xD1, 0x87, 0x9D, 0x08, 0x01, 0xF6, 0x21, 0x98, 0x4B, 0x3E,
+    0x9F, 0x7E, 0x50, 0x7B, 0xEC, 0xBC, 0x54, 0xE4, 0xD8, 0x90, 0x74, 0x05,
+    0x31, 0xF5, 0x00, 0x3C, 0x73, 0x87, 0x78, 0x0F, 0xD6, 0x17, 0xEC, 0x32,
+    0x4E, 0x3A, 0x81, 0x72, 0xF7, 0xC1, 0x4F, 0x1A, 0x08, 0xC3, 0xD8, 0x76,
+    0xF5, 0xDD, 0x38, 0xF0, 0x06, 0xCE, 0xED, 0x40, 0x14, 0xE7, 0x40, 0x38,
+    0x4D, 0x9C, 0xEB, 0xEC, 0x03, 0x08, 0x0E, 0x9D, 0xD7, 0x49, 0xE5, 0xB6,
+    0xB3, 0xC3, 0x8E, 0xE1, 0xDD, 0xF7, 0xDA, 0xEC, 0x83, 0xC8, 0x5D, 0xA5,
+    0xE4, 0x1C, 0x9B, 0x2E, 0xD7, 0xFF, 0x81, 0xB3, 0x1D, 0x3F, 0xF2, 0x90,
+    0xF5, 0xE2, 0xA6, 0x03, 0xA7, 0x13, 0x37, 0x7D, 0x72, 0xDA, 0x71, 0xD3,
+    0xE7, 0x24, 0xEB, 0x30, 0x45, 0xC8, 0x8E, 0xB3, 0x43, 0xD5, 0x31, 0xD5,
+    0x54, 0x0D, 0xEB, 0xE1, 0xEB, 0xC9, 0x37, 0x89, 0xB3, 0x12, 0xB4, 0x33,
+    0xD8, 0x44, 0xA1, 0xA5, 0x18, 0x84, 0x86, 0xDB, 0x90, 0x73, 0x4C, 0xE5,
+    0x90, 0x5F, 0xD8, 0xF1, 0x91, 0xE9, 0x23, 0xD6, 0x2B, 0x38, 0x6F, 0x61,
+    0x6C, 0xB8, 0x61, 0x88, 0x44, 0x8D, 0xC8, 0x5D, 0x05, 0x6A, 0xB8, 0x6A,
+    0x8B, 0xB1, 0xBB, 0xD6, 0xB3, 0xAA, 0xB2, 0x89, 0x97, 0x64, 0xD3, 0xC4,
+    0xD4, 0x18, 0xD4, 0x7E, 0x60, 0xF1, 0xAF, 0xE3, 0x35, 0xAB, 0xD1, 0x10,
+    0xC4, 0x39, 0x24, 0xC1, 0x0B, 0xBD, 0x80, 0x17, 0x9A, 0x80, 0x27, 0x64,
+    0x82, 0x57, 0x62, 0x40, 0xCD, 0xD2, 0x36, 0x88, 0x51, 0xFB, 0x57, 0xAD,
+    0x8E, 0x55, 0x90, 0xCE, 0x15, 0x24, 0xA9, 0xC0, 0x95, 0x23, 0x69, 0x9A,
+    0x75, 0x42, 0xCD, 0xA1, 0x2A, 0xAE, 0x41, 0x28, 0x62, 0xF1, 0x8B, 0x60,
+    0x6A, 0x7A, 0xAC, 0x08, 0x21, 0x4B, 0xA4, 0x08, 0x0B, 0xD3, 0x92, 0x34,
+    0x5D, 0xA9, 0xA0, 0xD5, 0x52, 0x31, 0x44, 0xC9, 0xD2, 0x78, 0xC9, 0x5F,
+    0x4F, 0xE3, 0x26, 0xED, 0x4B, 0x46, 0x12, 0xF8, 0x19, 0x73, 0x49, 0x9C,
+    0xCF, 0xB3, 0x8D, 0xE5, 0xE6, 0xB7, 0x7C, 0x19, 0xAC, 0xC1, 0x1C, 0xCC,
+    0xCB, 0xC6, 0xFA, 0xC6, 0x82, 0xDE, 0xAC, 0x3C, 0x9C, 0x7B, 0xB4, 0xF5,
+    0xFC, 0x55, 0x7D, 0xD1, 0x5E, 0xF5, 0x8A, 0x14, 0x26, 0xB9, 0x4A, 0xC3,
+    0xD2, 0xAB, 0x98, 0x46, 0x2B, 0x15, 0xB1, 0xF9, 0x21, 0x81, 0x0D, 0x66,
+    0x59, 0x11, 0x44, 0x7B, 0xD2, 0xB6, 0xEF, 0x17, 0x6C, 0xDB, 0x2E, 0x15,
+    0x23, 0xBC, 0x6C, 0xA9, 0x62, 0x51, 0x8A, 0x0D, 0xA5, 0x35, 0xD4, 0xDE,
+    0x1A, 0x59, 0xBB, 0x89, 0xA9, 0x82, 0x0D, 0xD3, 0x97, 0x8E, 0x27, 0x75,
+    0xBC, 0x1E, 0x89, 0x1C, 0x06, 0x79, 0x0D, 0x53, 0x1D, 0x8B, 0x9A, 0x7C,
+    0xF7, 0x2A, 0x56, 0x34, 0x5D, 0x86, 0x21, 0x98, 0x0C, 0xBC, 0x78, 0x70,
+    0xA6, 0xA0, 0x46, 0x89, 0xB5, 0xA9, 0xF1, 0x11, 0xF8, 0xFE, 0x71, 0x44,
+    0xC9, 0x20, 0x85, 0xF1, 0x11, 0x05, 0xBA, 0x66, 0x58, 0x4D, 0x41, 0x9C,
+    0x1A, 0x91, 0x6E, 0x63, 0x4A, 0x04, 0xF1, 0x6E, 0x82, 0x3D, 0xAC, 0x4C,
+    0xA4, 0xE1, 0x41, 0x37, 0x22, 0xA5, 0x89, 0x1A, 0x83, 0x29, 0x74, 0x37,
+    0x82, 0xE8, 0x7E, 0x47, 0x47, 0x19, 0x39, 0x2A, 0xAD, 0x49, 0xF8, 0x42,
+    0x10, 0xCB, 0x2B, 0xE5, 0x6B, 0xC8, 0xC2, 0x9D, 0x48, 0x88, 0xDC, 0xAB,
+    0x2E, 0x11, 0x37, 0x7F, 0xCA, 0x5B, 0x9B, 0x78, 0x4D, 0x56, 0x82, 0xBB,
+    0x35, 0xD8, 0xFA, 0x3E, 0xA5, 0x16, 0xFC, 0xE0, 0x54, 0xD1, 0x12, 0xD4,
+    0xA7, 0x98, 0x4E, 0xD0, 0x0C, 0x8D, 0x18, 0x39, 0x84, 0x07, 0xC4, 0xA2,
+    0x1A, 0xA6, 0xA8, 0x62, 0xAA, 0x19, 0x8C, 0x59, 0x95, 0x54, 0x31, 0x5A,
+    0xD2, 0xFE, 0x4A, 0x59, 0xC0, 0x55, 0x8A, 0xB7, 0x72, 0x29, 0xB3, 0x54,
+    0xAE, 0xC2, 0x23, 0x96, 0x47, 0x59, 0xAE, 0xCB, 0x5A, 0x06, 0x61, 0x91,
+    0xD8, 0xD6, 0x86, 0x8C, 0xE6, 0x89, 0x59, 0xD7, 0x14, 0x9E, 0xD3, 0xD4,
+    0xB3, 0xC7, 0x48, 0xCA, 0x27, 0x43, 0x01, 0x94, 0x3A, 0x09, 0xC8, 0xE5,
+    0xDC, 0xA3, 0x81, 0x5B, 0xE3, 0x59, 0xA2, 0x27, 0xB9, 0xB4, 0x0A, 0x19,
+    0x89, 0x26, 0xB5, 0x2C, 0xA3, 0xB6, 0x4E, 0x5C, 0xA6, 0x17, 0xA4, 0x7B,
+    0xB3, 0x85, 0xFA, 0x59, 0x2A, 0x7A, 0xFF, 0x3D, 0xC4, 0x3F, 0xDE, 0xCB,
+    0x8B, 0xC4};
+static IFX_Locale* XFA_GetLocaleFromBuffer(const uint8_t* pBuf, int nBufLen) {
+  if (pBuf == NULL || nBufLen <= 0) {
+    return NULL;
+  }
+  CFX_GEModule* pGeModule = CFX_GEModule::Get();
+  if (!pGeModule) {
+    return NULL;
+  }
+  CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule();
+  if (!pCodecMgr) {
+    return NULL;
+  }
+  CXML_Element* pLocale = NULL;
+  uint8_t* pOut = NULL;
+  FX_DWORD dwSize;
+  pCodecMgr->GetFlateModule()->FlateOrLZWDecode(FALSE, pBuf, nBufLen, TRUE, 0,
+                                                0, 0, 0, 0, pOut, dwSize);
+  if (pOut) {
+    pLocale = CXML_Element::Parse(pOut, dwSize);
+    FX_Free(pOut);
+  }
+  if (pLocale) {
+    return new CXFA_XMLLocale(pLocale);
+  }
+  return NULL;
+}
+static FX_WORD XFA_GetLanguage(CFX_WideString wsLanguage) {
+  FX_WORD dwLangueID = XFA_LANGID_en_US;
+  if (wsLanguage.GetLength() < 2) {
+    return dwLangueID;
+  }
+  wsLanguage.MakeLower();
+  FX_DWORD dwIDFirst = wsLanguage.GetAt(0) << 8 | wsLanguage.GetAt(1);
+  FX_DWORD dwIDSecond = wsLanguage.GetLength() >= 5
+                            ? wsLanguage.GetAt(3) << 8 | wsLanguage.GetAt(4)
+                            : 0;
+  switch (dwIDFirst) {
+    case FXBSTR_ID(0, 0, 'z', 'h'): {
+      if (dwIDSecond == FXBSTR_ID(0, 0, 'c', 'n')) {
+        dwLangueID = XFA_LANGID_zh_CN;
+      } else if (dwIDSecond == FXBSTR_ID(0, 0, 't', 'w')) {
+        dwLangueID = XFA_LANGID_zh_TW;
+      } else if (dwIDSecond == FXBSTR_ID(0, 0, 'h', 'k')) {
+        dwLangueID = XFA_LANGID_zh_HK;
+      }
+    } break;
+    case FXBSTR_ID(0, 0, 'j', 'a'):
+      dwLangueID = XFA_LANGID_ja_JP;
+      break;
+    case FXBSTR_ID(0, 0, 'k', 'o'):
+      dwLangueID = XFA_LANGID_ko_KR;
+      break;
+    case FXBSTR_ID(0, 0, 'e', 'n'): {
+      if (dwIDSecond == FXBSTR_ID(0, 0, 'g', 'b')) {
+        dwLangueID = XFA_LANGID_en_GB;
+      } else {
+        dwLangueID = XFA_LANGID_en_US;
+      }
+    } break;
+    case FXBSTR_ID(0, 0, 'd', 'e'):
+      dwLangueID = XFA_LANGID_de_DE;
+      break;
+    case FXBSTR_ID(0, 0, 'f', 'r'):
+      dwLangueID = XFA_LANGID_fr_FR;
+      break;
+    case FXBSTR_ID(0, 0, 'e', 's'): {
+      if (dwIDSecond == FXBSTR_ID(0, 0, 'e', 's')) {
+        dwLangueID = XFA_LANGID_es_ES;
+      } else {
+        dwLangueID = XFA_LANGID_es_LA;
+      }
+    } break;
+    case FXBSTR_ID(0, 0, 'i', 't'):
+      dwLangueID = XFA_LANGID_it_IT;
+      break;
+    case FXBSTR_ID(0, 0, 'p', 't'):
+      dwLangueID = XFA_LANGID_pt_BR;
+      break;
+    case FXBSTR_ID(0, 0, 'n', 'l'):
+      dwLangueID = XFA_LANGID_nl_NL;
+      break;
+    case FXBSTR_ID(0, 0, 'r', 'u'):
+      dwLangueID = XFA_LANGID_ru_RU;
+      break;
+  }
+  return dwLangueID;
+}
+CXFA_LocaleMgr::CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid)
+    : m_dwLocaleFlags(0x00) {
+  m_dwDeflcid = XFA_GetLanguage(wsDeflcid);
+  CXFA_Node* pNodeLocale = NULL;
+  if (pLocaleSet &&
+      (pNodeLocale = pLocaleSet->GetNodeItem(XFA_NODEITEM_FirstChild))) {
+    while (pNodeLocale) {
+      m_LocaleArray.Add(new CXFA_NodeLocale(pNodeLocale));
+      pNodeLocale = pNodeLocale->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  m_pDefLocale = GetLocaleByName(wsDeflcid);
+}
+CXFA_LocaleMgr::~CXFA_LocaleMgr() {
+  int32_t iCount = m_LocaleArray.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    ((IFX_Locale*)m_LocaleArray[i])->Release();
+  }
+  int32_t iXmls = m_XMLLocaleArray.GetSize();
+  for (int32_t j = 0; j < iXmls; j++) {
+    ((IFX_Locale*)m_XMLLocaleArray[j])->Release();
+  }
+}
+void CXFA_LocaleMgr::Release() {
+  delete this;
+}
+FX_WORD CXFA_LocaleMgr::GetDefLocaleID() {
+  return m_dwDeflcid;
+}
+IFX_Locale* CXFA_LocaleMgr::GetDefLocale() {
+  if (m_pDefLocale) {
+    return m_pDefLocale;
+  } else if (m_LocaleArray.GetSize()) {
+    return (IFX_Locale*)m_LocaleArray[0];
+  } else if (m_XMLLocaleArray.GetSize()) {
+    return (IFX_Locale*)m_XMLLocaleArray[0];
+  }
+  m_pDefLocale = GetLocale(m_dwDeflcid);
+  if (m_pDefLocale)
+    m_XMLLocaleArray.Add(m_pDefLocale);
+  return m_pDefLocale;
+}
+IFX_Locale* CXFA_LocaleMgr::GetLocale(FX_WORD lcid) {
+  IFX_Locale* pLocal = NULL;
+  switch (lcid) {
+    case XFA_LANGID_zh_CN:
+      pLocal = XFA_GetLocaleFromBuffer(g_zhCN_Locale, sizeof(g_zhCN_Locale));
+      break;
+    case XFA_LANGID_zh_TW:
+      pLocal = XFA_GetLocaleFromBuffer(g_zhTW_Locale, sizeof(g_zhTW_Locale));
+      break;
+    case XFA_LANGID_zh_HK:
+      pLocal = XFA_GetLocaleFromBuffer(g_zhHK_Locale, sizeof(g_zhHK_Locale));
+      break;
+    case XFA_LANGID_ja_JP:
+      pLocal = XFA_GetLocaleFromBuffer(g_jaJP_Locale, sizeof(g_jaJP_Locale));
+      break;
+    case XFA_LANGID_ko_KR:
+      pLocal = XFA_GetLocaleFromBuffer(g_koKR_Locale, sizeof(g_koKR_Locale));
+      break;
+    case XFA_LANGID_en_GB:
+      pLocal = XFA_GetLocaleFromBuffer(g_enGB_Locale, sizeof(g_enGB_Locale));
+      break;
+    case XFA_LANGID_es_LA:
+      pLocal = XFA_GetLocaleFromBuffer(g_esLA_Locale, sizeof(g_esLA_Locale));
+      break;
+    case XFA_LANGID_es_ES:
+      pLocal = XFA_GetLocaleFromBuffer(g_esES_Locale, sizeof(g_esES_Locale));
+      break;
+    case XFA_LANGID_de_DE:
+      pLocal = XFA_GetLocaleFromBuffer(g_deDE_Loacale, sizeof(g_deDE_Loacale));
+      break;
+    case XFA_LANGID_fr_FR:
+      pLocal = XFA_GetLocaleFromBuffer(g_frFR_Locale, sizeof(g_frFR_Locale));
+      break;
+    case XFA_LANGID_it_IT:
+      pLocal = XFA_GetLocaleFromBuffer(g_itIT_Locale, sizeof(g_itIT_Locale));
+      break;
+    case XFA_LANGID_pt_BR:
+      pLocal = XFA_GetLocaleFromBuffer(g_ptBR_Locale, sizeof(g_ptBR_Locale));
+      break;
+    case XFA_LANGID_nl_NL:
+      pLocal = XFA_GetLocaleFromBuffer(g_nlNL_Locale, sizeof(g_nlNL_Locale));
+      break;
+    case XFA_LANGID_ru_RU:
+      pLocal = XFA_GetLocaleFromBuffer(g_ruRU_Locale, sizeof(g_ruRU_Locale));
+      break;
+    case XFA_LANGID_en_US:
+    default:
+      pLocal = XFA_GetLocaleFromBuffer(g_enUS_Locale, sizeof(g_enUS_Locale));
+      break;
+  }
+  return pLocal;
+}
+IFX_Locale* CXFA_LocaleMgr::GetLocaleByName(
+    const CFX_WideStringC& wsLocaleName) {
+  int32_t iCount = m_LocaleArray.GetSize();
+  int32_t i = 0;
+  for (i = 0; i < iCount; i++) {
+    IFX_Locale* pLocale = ((IFX_Locale*)m_LocaleArray[i]);
+    if (pLocale->GetName() == wsLocaleName) {
+      return pLocale;
+    }
+  }
+  int32_t iLen = wsLocaleName.GetLength();
+  if (iLen < 2) {
+    return NULL;
+  }
+  iCount = m_XMLLocaleArray.GetSize();
+  for (i = 0; i < iCount; i++) {
+    IFX_Locale* pLocale = ((IFX_Locale*)m_XMLLocaleArray[i]);
+    if (pLocale->GetName() == wsLocaleName) {
+      return pLocale;
+    }
+  }
+  FX_WORD dwLangueID = XFA_GetLanguage(wsLocaleName);
+  IFX_Locale* pLocale = GetLocale(dwLangueID);
+  if (pLocale)
+    m_XMLLocaleArray.Add(pLocale);
+  return pLocale;
+}
+void CXFA_LocaleMgr::SetDefLocale(IFX_Locale* pLocale) {
+  m_pDefLocale = pLocale;
+}
+CFX_WideStringC CXFA_LocaleMgr::GetConfigLocaleName(CXFA_Node* pConfig) {
+  if (!(m_dwLocaleFlags & 0x01)) {
+    m_wsConfigLocale.Empty();
+    if (pConfig) {
+      CXFA_Node* pChildfConfig =
+          pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
+      if (!pChildfConfig) {
+        pChildfConfig = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present);
+      }
+      CXFA_Node* pCommon =
+          pChildfConfig
+              ? pChildfConfig->GetFirstChildByClass(XFA_ELEMENT_Common)
+              : NULL;
+      CXFA_Node* pLocale =
+          pCommon ? pCommon->GetFirstChildByClass(XFA_ELEMENT_Locale) : NULL;
+      if (pLocale) {
+        pLocale->TryCData(XFA_ATTRIBUTE_Value, m_wsConfigLocale, FALSE);
+      }
+    }
+    m_dwLocaleFlags |= 0x01;
+  }
+  return m_wsConfigLocale;
+}
+static CXFA_TimeZoneProvider* g_pProvider = NULL;
+IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Create() {
+  FXSYS_assert(!g_pProvider);
+  g_pProvider = new CXFA_TimeZoneProvider();
+  return g_pProvider;
+}
+IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Get() {
+  if (!g_pProvider) {
+    g_pProvider = new CXFA_TimeZoneProvider();
+  }
+  return g_pProvider;
+}
+void IXFA_TimeZoneProvider::Destroy() {
+  delete g_pProvider;
+  g_pProvider = NULL;
+}
+#include <time.h>
+CXFA_TimeZoneProvider::CXFA_TimeZoneProvider() {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+  _tzset();
+  m_tz.tzHour = (int8_t)(_timezone / 3600 * -1);
+  m_tz.tzMinute = (int8_t)((FXSYS_abs(_timezone) % 3600) / 60);
+#else
+  tzset();
+  m_tz.tzHour = (int8_t)(timezone / 3600 * -1);
+  m_tz.tzMinute = (int8_t)((FXSYS_abs((int)timezone) % 3600) / 60);
+#endif
+}
+CXFA_TimeZoneProvider::~CXFA_TimeZoneProvider() {}
+void CXFA_TimeZoneProvider::SetTimeZone(FX_TIMEZONE& tz) {
+  m_tz = tz;
+}
+void CXFA_TimeZoneProvider::GetTimeZone(FX_TIMEZONE& tz) {
+  tz = m_tz;
+}
diff --git a/xfa/fxfa/parser/xfa_localemgr.h b/xfa/fxfa/parser/xfa_localemgr.h
new file mode 100644
index 0000000..e296fc4
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_localemgr.h
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LOCALEMGR_H_
+#define XFA_FXFA_PARSER_XFA_LOCALEMGR_H_
+
+#include "xfa/fgas/localization/fgas_datetime.h"
+#include "xfa/fgas/localization/fgas_locale.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/include/fxfa/fxfa_objectacc.h"
+
+class CXFA_Node;
+class IFX_Locale;
+
+#define XFA_LANGID_zh_CN 0x0804
+#define XFA_LANGID_zh_TW 0x0404
+#define XFA_LANGID_zh_HK 0x0c04
+#define XFA_LANGID_ja_JP 0x0411
+#define XFA_LANGID_ko_KR 0x0412
+#define XFA_LANGID_en_US 0x0409
+#define XFA_LANGID_en_GB 0x0809
+#define XFA_LANGID_es_ES 0x0c0a
+#define XFA_LANGID_es_LA 0x080a
+#define XFA_LANGID_de_DE 0x0407
+#define XFA_LANGID_fr_FR 0x040c
+#define XFA_LANGID_it_IT 0x0410
+#define XFA_LANGID_pt_BR 0x0416
+#define XFA_LANGID_nl_NL 0x0413
+#define XFA_LANGID_ru_RU 0x0419
+
+class CXFA_LocaleMgr : public IFX_LocaleMgr {
+ public:
+  CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid);
+  virtual void Release();
+  virtual FX_WORD GetDefLocaleID();
+  virtual IFX_Locale* GetDefLocale();
+  virtual IFX_Locale* GetLocale(FX_WORD lcid);
+  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName);
+  ~CXFA_LocaleMgr();
+  void SetDefLocale(IFX_Locale* pLocale);
+  CFX_WideStringC GetConfigLocaleName(CXFA_Node* pConfig);
+
+ protected:
+  CFX_PtrArray m_LocaleArray;
+  CFX_PtrArray m_XMLLocaleArray;
+  IFX_Locale* m_pDefLocale;
+  CFX_WideString m_wsConfigLocale;
+  FX_WORD m_dwDeflcid;
+  FX_WORD m_dwLocaleFlags;
+};
+
+class IXFA_TimeZoneProvider {
+ public:
+  static IXFA_TimeZoneProvider* Create();
+  static IXFA_TimeZoneProvider* Get();
+  static void Destroy();
+
+  virtual ~IXFA_TimeZoneProvider() {}
+
+  virtual void SetTimeZone(FX_TIMEZONE& tz) = 0;
+
+  virtual void GetTimeZone(FX_TIMEZONE& tz) = 0;
+};
+class CXFA_TimeZoneProvider : public IXFA_TimeZoneProvider {
+ public:
+  CXFA_TimeZoneProvider();
+  virtual ~CXFA_TimeZoneProvider();
+  virtual void SetTimeZone(FX_TIMEZONE& tz);
+  virtual void GetTimeZone(FX_TIMEZONE& tz);
+
+ private:
+  FX_TIMEZONE m_tz;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_LOCALEMGR_H_
diff --git a/xfa/fxfa/parser/xfa_localevalue.cpp b/xfa/fxfa/parser/xfa_localevalue.cpp
new file mode 100644
index 0000000..8b3efa5
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_localevalue.cpp
@@ -0,0 +1,981 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+static const FX_DOUBLE fraction_scales[] = {0.1,
+                                            0.01,
+                                            0.001,
+                                            0.0001,
+                                            0.00001,
+                                            0.000001,
+                                            0.0000001,
+                                            0.00000001,
+                                            0.000000001,
+                                            0.0000000001,
+                                            0.00000000001,
+                                            0.000000000001,
+                                            0.0000000000001,
+                                            0.00000000000001,
+                                            0.000000000000001,
+                                            0.0000000000000001};
+CXFA_LocaleValue::CXFA_LocaleValue() {
+  m_dwType = XFA_VT_NULL;
+  m_bValid = TRUE;
+  m_pLocaleMgr = NULL;
+}
+CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) {
+  m_dwType = XFA_VT_NULL;
+  m_bValid = TRUE;
+  m_pLocaleMgr = NULL;
+  *this = value;
+}
+CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
+                                   CXFA_LocaleMgr* pLocaleMgr) {
+  m_dwType = dwType;
+  m_bValid = (m_dwType != XFA_VT_NULL);
+  m_pLocaleMgr = pLocaleMgr;
+}
+CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
+                                   const CFX_WideString& wsValue,
+                                   CXFA_LocaleMgr* pLocaleMgr) {
+  m_wsValue = wsValue;
+  m_dwType = dwType;
+  m_pLocaleMgr = pLocaleMgr;
+  m_bValid = ValidateCanonicalValue(wsValue, dwType);
+}
+CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
+                                   const CFX_WideString& wsValue,
+                                   const CFX_WideString& wsFormat,
+                                   IFX_Locale* pLocale,
+                                   CXFA_LocaleMgr* pLocaleMgr) {
+  m_pLocaleMgr = pLocaleMgr;
+  m_bValid = TRUE;
+  m_dwType = dwType;
+  m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale);
+}
+CXFA_LocaleValue& CXFA_LocaleValue::operator=(const CXFA_LocaleValue& value) {
+  m_wsValue = value.m_wsValue;
+  m_dwType = value.m_dwType;
+  m_bValid = value.m_bValid;
+  m_pLocaleMgr = value.m_pLocaleMgr;
+  return *this;
+}
+CXFA_LocaleValue::~CXFA_LocaleValue() {}
+static FX_LOCALECATEGORY XFA_ValugeCategory(FX_LOCALECATEGORY eCategory,
+                                            FX_DWORD dwValueType) {
+  if (eCategory == FX_LOCALECATEGORY_Unknown) {
+    switch (dwValueType) {
+      case XFA_VT_BOOLEAN:
+      case XFA_VT_INTEGER:
+      case XFA_VT_DECIMAL:
+      case XFA_VT_FLOAT:
+        return FX_LOCALECATEGORY_Num;
+      case XFA_VT_TEXT:
+        return FX_LOCALECATEGORY_Text;
+      case XFA_VT_DATE:
+        return FX_LOCALECATEGORY_Date;
+      case XFA_VT_TIME:
+        return FX_LOCALECATEGORY_Time;
+      case XFA_VT_DATETIME:
+        return FX_LOCALECATEGORY_DateTime;
+    }
+  }
+  return eCategory;
+}
+FX_BOOL CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue,
+                                        const CFX_WideString& wsPattern,
+                                        IFX_Locale* pLocale,
+                                        CFX_WideString* pMatchFormat) {
+  CFX_WideString wsOutput;
+  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(pLocale);
+  }
+  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
+  CFX_WideStringArray wsPatterns;
+  pFormat->SplitFormatString(wsPattern, wsPatterns);
+  FX_BOOL bRet = FALSE;
+  int32_t iCount = wsPatterns.GetSize();
+  int32_t i = 0;
+  for (; i < iCount && !bRet; i++) {
+    CFX_WideString wsFormat = wsPatterns[i];
+    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
+    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
+    switch (eCategory) {
+      case FX_LOCALECATEGORY_Null:
+        bRet = pFormat->ParseNull(wsValue, wsFormat);
+        if (!bRet) {
+          bRet = wsValue.IsEmpty();
+        }
+        break;
+      case FX_LOCALECATEGORY_Zero:
+        bRet = pFormat->ParseZero(wsValue, wsFormat);
+        if (!bRet) {
+          bRet = wsValue == FX_WSTRC(L"0");
+        }
+        break;
+      case FX_LOCALECATEGORY_Num: {
+        CFX_WideString fNum;
+        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
+        if (!bRet) {
+          bRet = pFormat->FormatNum(wsValue, wsFormat, wsOutput);
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_Text:
+        bRet = pFormat->ParseText(wsValue, wsFormat, wsOutput);
+        wsOutput.Empty();
+        if (!bRet) {
+          bRet = pFormat->FormatText(wsValue, wsFormat, wsOutput);
+        }
+        break;
+      case FX_LOCALECATEGORY_Date: {
+        CFX_Unitime dt;
+        bRet = ValidateCanonicalDate(wsValue, dt);
+        if (!bRet) {
+          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
+                                        dt);
+          if (!bRet) {
+            bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
+                                           FX_DATETIMETYPE_Date);
+          }
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_Time: {
+        CFX_Unitime dt;
+        bRet =
+            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
+        if (!bRet) {
+          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
+                                         FX_DATETIMETYPE_Time);
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_DateTime: {
+        CFX_Unitime dt;
+        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
+                                      FX_DATETIMETYPE_DateTime, dt);
+        if (!bRet) {
+          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
+                                         FX_DATETIMETYPE_DateTime);
+        }
+        break;
+      }
+      default:
+        bRet = FALSE;
+        break;
+    }
+  }
+  if (bRet && pMatchFormat) {
+    *pMatchFormat = wsPatterns[i - 1];
+  }
+  pFormat->Release();
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(locale);
+  }
+  return bRet;
+}
+CFX_WideString CXFA_LocaleValue::GetValue() const {
+  return m_wsValue;
+}
+FX_DWORD CXFA_LocaleValue::GetType() const {
+  return m_dwType;
+}
+void CXFA_LocaleValue::SetValue(const CFX_WideString& wsValue,
+                                FX_DWORD dwType) {
+  m_wsValue = wsValue;
+  m_dwType = dwType;
+}
+CFX_WideString CXFA_LocaleValue::GetText() const {
+  if (m_bValid && m_dwType == XFA_VT_TEXT) {
+    return m_wsValue;
+  }
+  return CFX_WideString();
+}
+FX_FLOAT CXFA_LocaleValue::GetNum() const {
+  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
+                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
+    int64_t nIntegral = 0;
+    FX_DWORD dwFractional = 0;
+    int32_t nExponent = 0;
+    int cc = 0;
+    FX_BOOL bNegative = FALSE, bExpSign = FALSE;
+    const FX_WCHAR* str = (const FX_WCHAR*)m_wsValue;
+    int len = m_wsValue.GetLength();
+    while (XFA_IsSpace(str[cc]) && cc < len) {
+      cc++;
+    }
+    if (cc >= len) {
+      return 0;
+    }
+    if (str[0] == '+') {
+      cc++;
+    } else if (str[0] == '-') {
+      bNegative = TRUE;
+      cc++;
+    }
+    int nIntegralLen = 0;
+    while (cc < len) {
+      if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) {
+        break;
+      }
+      nIntegral = nIntegral * 10 + str[cc] - '0';
+      cc++;
+      nIntegralLen++;
+    }
+    nIntegral = bNegative ? -nIntegral : nIntegral;
+    int scale = 0;
+    double fraction = 0.0;
+    if (cc < len && str[cc] == '.') {
+      cc++;
+      while (cc < len) {
+        fraction += fraction_scales[scale] * (str[cc] - '0');
+        scale++;
+        cc++;
+        if (scale == sizeof fraction_scales / sizeof(double) ||
+            !XFA_IsDigit(str[cc])) {
+          break;
+        }
+      }
+      dwFractional = (FX_DWORD)(fraction * 4294967296.0);
+    }
+    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
+      cc++;
+      if (cc < len) {
+        if (str[cc] == '+') {
+          cc++;
+        } else if (str[cc] == '-') {
+          bExpSign = TRUE;
+          cc++;
+        }
+      }
+      while (cc < len) {
+        if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
+          break;
+        }
+        nExponent = nExponent * 10 + str[cc] - '0';
+        cc++;
+      }
+      nExponent = bExpSign ? -nExponent : nExponent;
+    }
+    FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0);
+    fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue);
+    if (nExponent != 0) {
+      fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
+    }
+    return fValue;
+  }
+  return 0;
+}
+FX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const {
+  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
+                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
+    int64_t nIntegral = 0;
+    FX_DWORD dwFractional = 0;
+    int32_t nExponent = 0;
+    int32_t cc = 0;
+    FX_BOOL bNegative = FALSE, bExpSign = FALSE;
+    const FX_WCHAR* str = (const FX_WCHAR*)m_wsValue;
+    int len = m_wsValue.GetLength();
+    while (XFA_IsSpace(str[cc]) && cc < len) {
+      cc++;
+    }
+    if (cc >= len) {
+      return 0;
+    }
+    if (str[0] == '+') {
+      cc++;
+    } else if (str[0] == '-') {
+      bNegative = TRUE;
+      cc++;
+    }
+    int32_t nIntegralLen = 0;
+    while (cc < len) {
+      if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) {
+        break;
+      }
+      nIntegral = nIntegral * 10 + str[cc] - '0';
+      cc++;
+      nIntegralLen++;
+    }
+    nIntegral = bNegative ? -nIntegral : nIntegral;
+    int32_t scale = 0;
+    FX_DOUBLE fraction = 0.0;
+    if (cc < len && str[cc] == '.') {
+      cc++;
+      while (cc < len) {
+        fraction += fraction_scales[scale] * (str[cc] - '0');
+        scale++;
+        cc++;
+        if (scale == sizeof fraction_scales / sizeof(FX_DOUBLE) ||
+            !XFA_IsDigit(str[cc])) {
+          break;
+        }
+      }
+      dwFractional = (FX_DWORD)(fraction * 4294967296.0);
+    }
+    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
+      cc++;
+      if (cc < len) {
+        if (str[cc] == '+') {
+          cc++;
+        } else if (str[cc] == '-') {
+          bExpSign = TRUE;
+          cc++;
+        }
+      }
+      while (cc < len) {
+        if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
+          break;
+        }
+        nExponent = nExponent * 10 + str[cc] - '0';
+        cc++;
+      }
+      nExponent = bExpSign ? -nExponent : nExponent;
+    }
+    FX_DOUBLE dValue = (dwFractional / 4294967296.0);
+    dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue);
+    if (nExponent != 0) {
+      dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
+    }
+    return dValue;
+  }
+  return 0;
+}
+CFX_Unitime CXFA_LocaleValue::GetDate() const {
+  if (m_bValid && m_dwType == XFA_VT_DATE) {
+    CFX_Unitime dt;
+    FX_DateFromCanonical(m_wsValue, dt);
+    return dt;
+  }
+  return CFX_Unitime();
+}
+CFX_Unitime CXFA_LocaleValue::GetTime() const {
+  if (m_bValid && m_dwType == XFA_VT_TIME) {
+    CFX_Unitime dt(0);
+    FXSYS_assert(m_pLocaleMgr);
+    FX_TimeFromCanonical(m_wsValue, dt, m_pLocaleMgr->GetDefLocale());
+    return dt;
+  }
+  return CFX_Unitime();
+}
+CFX_Unitime CXFA_LocaleValue::GetDateTime() const {
+  if (m_bValid && m_dwType == XFA_VT_DATETIME) {
+    int32_t index = m_wsValue.Find('T');
+    CFX_Unitime dt;
+    FX_DateFromCanonical(m_wsValue.Left(index), dt);
+    FXSYS_assert(m_pLocaleMgr);
+    FX_TimeFromCanonical(m_wsValue.Right(m_wsValue.GetLength() - index - 1), dt,
+                         m_pLocaleMgr->GetDefLocale());
+    return dt;
+  }
+  return CFX_Unitime();
+}
+FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText) {
+  m_dwType = XFA_VT_TEXT;
+  m_wsValue = wsText;
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText,
+                                  const CFX_WideString& wsFormat,
+                                  IFX_Locale* pLocale) {
+  m_dwType = XFA_VT_TEXT;
+  return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale);
+}
+FX_BOOL CXFA_LocaleValue::SetNum(FX_FLOAT fNum) {
+  m_dwType = XFA_VT_FLOAT;
+  m_wsValue.Format(L"%.8g", (FX_DOUBLE)fNum);
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum,
+                                 const CFX_WideString& wsFormat,
+                                 IFX_Locale* pLocale) {
+  m_dwType = XFA_VT_FLOAT;
+  return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale);
+}
+FX_BOOL CXFA_LocaleValue::SetDate(const CFX_Unitime& d) {
+  m_dwType = XFA_VT_DATE;
+  m_wsValue.Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay());
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate,
+                                  const CFX_WideString& wsFormat,
+                                  IFX_Locale* pLocale) {
+  m_dwType = XFA_VT_DATE;
+  return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale);
+}
+FX_BOOL CXFA_LocaleValue::SetTime(const CFX_Unitime& t) {
+  m_dwType = XFA_VT_TIME;
+  m_wsValue.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(),
+                   t.GetSecond());
+  if (t.GetMillisecond() > 0) {
+    CFX_WideString wsTemp;
+    wsTemp.Format(L"%:03d", t.GetMillisecond());
+    m_wsValue += wsTemp;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime,
+                                  const CFX_WideString& wsFormat,
+                                  IFX_Locale* pLocale) {
+  m_dwType = XFA_VT_TIME;
+  return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale);
+}
+FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) {
+  m_dwType = XFA_VT_DATETIME;
+  m_wsValue.Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(),
+                   dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(),
+                   dt.GetSecond());
+  if (dt.GetMillisecond() > 0) {
+    CFX_WideString wsTemp;
+    wsTemp.Format(L"%:03d", dt.GetMillisecond());
+    m_wsValue += wsTemp;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime,
+                                      const CFX_WideString& wsFormat,
+                                      IFX_Locale* pLocale) {
+  m_dwType = XFA_VT_DATETIME;
+  return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale);
+}
+FX_BOOL CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult,
+                                         const CFX_WideString& wsFormat,
+                                         IFX_Locale* pLocale,
+                                         XFA_VALUEPICTURE eValueType) const {
+  wsResult.Empty();
+  FX_BOOL bRet = FALSE;
+  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
+  CFX_WideStringArray wsPatterns;
+  pFormat->SplitFormatString(wsFormat, wsPatterns);
+  int32_t iCount = wsPatterns.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType);
+    if (bRet) {
+      break;
+    }
+  }
+  pFormat->Release();
+  return bRet;
+}
+FX_BOOL CXFA_LocaleValue::FormatSinglePattern(
+    CFX_WideString& wsResult,
+    const CFX_WideString& wsFormat,
+    IFX_Locale* pLocale,
+    XFA_VALUEPICTURE eValueType) const {
+  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(pLocale);
+  }
+  wsResult.Empty();
+  FX_BOOL bRet = FALSE;
+  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
+  FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
+  eCategory = XFA_ValugeCategory(eCategory, m_dwType);
+  switch (eCategory) {
+    case FX_LOCALECATEGORY_Null:
+      if (m_wsValue.IsEmpty()) {
+        bRet = pFormat->FormatNull(wsFormat, wsResult);
+      }
+      break;
+    case FX_LOCALECATEGORY_Zero:
+      if (m_wsValue == FX_WSTRC(L"0")) {
+        bRet = pFormat->FormatZero(wsFormat, wsResult);
+      }
+      break;
+    case FX_LOCALECATEGORY_Num:
+      bRet = pFormat->FormatNum(m_wsValue, wsFormat, wsResult);
+      break;
+    case FX_LOCALECATEGORY_Text:
+      bRet = pFormat->FormatText(m_wsValue, wsFormat, wsResult);
+      break;
+    case FX_LOCALECATEGORY_Date:
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
+                                     FX_DATETIMETYPE_Date);
+      break;
+    case FX_LOCALECATEGORY_Time:
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
+                                     FX_DATETIMETYPE_Time);
+      break;
+    case FX_LOCALECATEGORY_DateTime:
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
+                                     FX_DATETIMETYPE_DateTime);
+      break;
+    default:
+      wsResult = m_wsValue;
+      bRet = TRUE;
+  }
+  pFormat->Release();
+  if (!bRet && (eCategory != FX_LOCALECATEGORY_Num ||
+                eValueType != XFA_VALUEPICTURE_Display)) {
+    wsResult = m_wsValue;
+  }
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(locale);
+  }
+  return bRet;
+}
+static FX_BOOL XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime,
+                                      CFX_WideString& wsDate,
+                                      CFX_WideString& wsTime) {
+  wsDate = L"";
+  wsTime = L"";
+  if (wsDateTime.IsEmpty()) {
+    return FALSE;
+  }
+  int nSplitIndex = -1;
+  nSplitIndex = wsDateTime.Find('T');
+  if (nSplitIndex < 0) {
+    nSplitIndex = wsDateTime.Find(' ');
+  }
+  if (nSplitIndex < 0) {
+    return FALSE;
+  }
+  wsDate = wsDateTime.Left(nSplitIndex);
+  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue,
+                                                 FX_DWORD dwVType) {
+  if (wsValue.IsEmpty()) {
+    return TRUE;
+  }
+  CFX_Unitime dt;
+  switch (dwVType) {
+    case XFA_VT_DATE: {
+      if (ValidateCanonicalDate(wsValue, dt)) {
+        return TRUE;
+      }
+      CFX_WideString wsDate, wsTime;
+      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
+          ValidateCanonicalDate(wsDate, dt)) {
+        return TRUE;
+      }
+      return FALSE;
+    }
+    case XFA_VT_TIME: {
+      if (ValidateCanonicalTime(wsValue)) {
+        return TRUE;
+      }
+      CFX_WideString wsDate, wsTime;
+      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
+          ValidateCanonicalTime(wsTime)) {
+        return TRUE;
+      }
+      return FALSE;
+    }
+    case XFA_VT_DATETIME: {
+      CFX_WideString wsDate, wsTime;
+      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
+          ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) {
+        return TRUE;
+      }
+    } break;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate,
+                                                CFX_Unitime& unDate) {
+  const FX_WORD LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+  const FX_WORD wCountY = 4, wCountM = 2, wCountD = 2;
+  int nLen = wsDate.GetLength();
+  if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) {
+    return FALSE;
+  }
+  const bool bSymbol = wsDate.Find(0x2D) != -1;
+  FX_WORD wYear = 0;
+  FX_WORD wMonth = 0;
+  FX_WORD wDay = 0;
+  const FX_WCHAR* pDate = (const FX_WCHAR*)wsDate;
+  int nIndex = 0, nStart = 0;
+  while (pDate[nIndex] != '\0' && nIndex < wCountY) {
+    if (!XFA_IsDigit(pDate[nIndex])) {
+      return FALSE;
+    }
+    wYear = (pDate[nIndex] - '0') + wYear * 10;
+    nIndex++;
+  }
+  if (bSymbol) {
+    if (pDate[nIndex] != 0x2D) {
+      return FALSE;
+    }
+    nIndex++;
+  }
+  nStart = nIndex;
+  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) {
+    if (!XFA_IsDigit(pDate[nIndex])) {
+      return FALSE;
+    }
+    wMonth = (pDate[nIndex] - '0') + wMonth * 10;
+    nIndex++;
+  }
+  if (bSymbol) {
+    if (pDate[nIndex] != 0x2D) {
+      return FALSE;
+    }
+    nIndex++;
+  }
+  nStart = nIndex;
+  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) {
+    if (!XFA_IsDigit(pDate[nIndex])) {
+      return FALSE;
+    }
+    wDay = (pDate[nIndex] - '0') + wDay * 10;
+    nIndex++;
+  }
+  if (nIndex != nLen) {
+    return FALSE;
+  }
+  if (wYear < 1900 || wYear > 2029) {
+    return FALSE;
+  }
+  if (wMonth < 1 || wMonth > 12) {
+    if (wMonth == 0 && nLen == wCountY) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+  if (wDay < 1) {
+    if (wDay == 0 && (nLen == wCountY + wCountM)) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+  if (wMonth == 2) {
+    if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) {
+      if (wDay > 29) {
+        return FALSE;
+      }
+    } else {
+      if (wDay > 28) {
+        return FALSE;
+      }
+    }
+  } else if (wDay > LastDay[wMonth - 1]) {
+    return FALSE;
+  }
+  CFX_Unitime ut;
+  ut.Set(wYear, static_cast<uint8_t>(wMonth), static_cast<uint8_t>(wDay));
+  unDate = unDate + ut;
+  return TRUE;
+}
+FX_BOOL CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) {
+  int nLen = wsTime.GetLength();
+  if (nLen < 2)
+    return FALSE;
+  const FX_WORD wCountH = 2;
+  const FX_WORD wCountM = 2;
+  const FX_WORD wCountS = 2;
+  const FX_WORD wCountF = 3;
+  const bool bSymbol = wsTime.Find(':') != -1;
+  FX_WORD wHour = 0;
+  FX_WORD wMinute = 0;
+  FX_WORD wSecond = 0;
+  FX_WORD wFraction = 0;
+  const FX_WCHAR* pTime = (const FX_WCHAR*)wsTime;
+  int nIndex = 0;
+  int nStart = 0;
+  while (nIndex - nStart < wCountH && pTime[nIndex]) {
+    if (!XFA_IsDigit(pTime[nIndex]))
+      return FALSE;
+    wHour = pTime[nIndex] - '0' + wHour * 10;
+    nIndex++;
+  }
+  if (bSymbol) {
+    if (nIndex < nLen && pTime[nIndex] != ':')
+      return FALSE;
+    nIndex++;
+  }
+  nStart = nIndex;
+  while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
+    if (!XFA_IsDigit(pTime[nIndex]))
+      return FALSE;
+    wMinute = pTime[nIndex] - '0' + wMinute * 10;
+    nIndex++;
+  }
+  if (bSymbol) {
+    if (nIndex < nLen && pTime[nIndex] != ':')
+      return FALSE;
+    nIndex++;
+  }
+  nStart = nIndex;
+  while (nIndex - nStart < wCountS && nIndex < nLen && pTime[nIndex]) {
+    if (!XFA_IsDigit(pTime[nIndex]))
+      return FALSE;
+    wSecond = pTime[nIndex] - '0' + wSecond * 10;
+    nIndex++;
+  }
+  if (wsTime.Find('.') > 0) {
+    if (pTime[nIndex] != '.')
+      return FALSE;
+    nIndex++;
+    nStart = nIndex;
+    while (nIndex - nStart < wCountF && nIndex < nLen && pTime[nIndex]) {
+      if (!XFA_IsDigit(pTime[nIndex]))
+        return FALSE;
+      wFraction = pTime[nIndex] - '0' + wFraction * 10;
+      nIndex++;
+    }
+  }
+  if (nIndex < nLen) {
+    if (pTime[nIndex] == 'Z') {
+      nIndex++;
+    } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') {
+      int16_t nOffsetH = 0;
+      int16_t nOffsetM = 0;
+      nIndex++;
+      nStart = nIndex;
+      while (nIndex - nStart < wCountH && nIndex < nLen && pTime[nIndex]) {
+        if (!XFA_IsDigit(pTime[nIndex]))
+          return FALSE;
+        nOffsetH = pTime[nIndex] - '0' + nOffsetH * 10;
+        nIndex++;
+      }
+      if (bSymbol) {
+        if (nIndex < nLen && pTime[nIndex] != ':')
+          return FALSE;
+        nIndex++;
+      }
+      nStart = nIndex;
+      while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
+        if (!XFA_IsDigit(pTime[nIndex]))
+          return FALSE;
+        nOffsetM = pTime[nIndex] - '0' + nOffsetM * 10;
+        nIndex++;
+      }
+      if (nOffsetH > 12 || nOffsetM >= 60)
+        return FALSE;
+    }
+  }
+  return nIndex == nLen && wHour < 24 && wMinute < 60 && wSecond < 60 &&
+         wFraction <= 999;
+}
+FX_BOOL CXFA_LocaleValue::ValidateCanonicalDateTime(
+    const CFX_WideString& wsDateTime) {
+  CFX_WideString wsDate, wsTime;
+  if (wsDateTime.IsEmpty()) {
+    return FALSE;
+  }
+  int nSplitIndex = -1;
+  nSplitIndex = wsDateTime.Find('T');
+  if (nSplitIndex < 0) {
+    nSplitIndex = wsDateTime.Find(' ');
+  }
+  if (nSplitIndex < 0) {
+    return FALSE;
+  }
+  wsDate = wsDateTime.Left(nSplitIndex);
+  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
+  CFX_Unitime dt;
+  return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime);
+}
+FX_BOOL CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue,
+                                            const CFX_WideString& wsPattern,
+                                            IFX_Locale* pLocale) {
+  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(pLocale);
+  }
+  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
+  CFX_WideStringArray wsPatterns;
+  pFormat->SplitFormatString(wsPattern, wsPatterns);
+  FX_BOOL bRet = FALSE;
+  int32_t iCount = wsPatterns.GetSize();
+  for (int32_t i = 0; i < iCount && !bRet; i++) {
+    CFX_WideString wsFormat = wsPatterns[i];
+    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
+    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
+    switch (eCategory) {
+      case FX_LOCALECATEGORY_Null:
+        bRet = pFormat->ParseNull(wsValue, wsFormat);
+        if (bRet) {
+          m_wsValue.Empty();
+        }
+        break;
+      case FX_LOCALECATEGORY_Zero:
+        bRet = pFormat->ParseZero(wsValue, wsFormat);
+        if (bRet) {
+          m_wsValue = FX_WSTRC(L"0");
+        }
+        break;
+      case FX_LOCALECATEGORY_Num: {
+        CFX_WideString fNum;
+        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
+        if (bRet) {
+          m_wsValue = fNum;
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_Text:
+        bRet = pFormat->ParseText(wsValue, wsFormat, m_wsValue);
+        break;
+      case FX_LOCALECATEGORY_Date: {
+        CFX_Unitime dt;
+        bRet = ValidateCanonicalDate(wsValue, dt);
+        if (!bRet) {
+          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
+                                        dt);
+        }
+        if (bRet) {
+          SetDate(dt);
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_Time: {
+        CFX_Unitime dt;
+        bRet =
+            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
+        if (bRet) {
+          SetTime(dt);
+        }
+        break;
+      }
+      case FX_LOCALECATEGORY_DateTime: {
+        CFX_Unitime dt;
+        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
+                                      FX_DATETIMETYPE_DateTime, dt);
+        if (bRet) {
+          SetDateTime(dt);
+        }
+        break;
+      }
+      default:
+        m_wsValue = wsValue;
+        bRet = TRUE;
+        break;
+    }
+  }
+  if (!bRet) {
+    m_wsValue = wsValue;
+  }
+  pFormat->Release();
+  if (pLocale) {
+    m_pLocaleMgr->SetDefLocale(locale);
+  }
+  return bRet;
+}
+void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat,
+                                         int32_t nIntLen,
+                                         int32_t nDecLen,
+                                         FX_BOOL bSign) {
+  FXSYS_assert(wsFormat.IsEmpty());
+  FXSYS_assert(nIntLen >= -1 && nDecLen >= -1);
+  int32_t nTotalLen = (nIntLen >= 0 ? nIntLen : 2) + (bSign ? 1 : 0) +
+                      (nDecLen >= 0 ? nDecLen : 2) + (nDecLen == 0 ? 0 : 1);
+  FX_WCHAR* lpBuf = wsFormat.GetBuffer(nTotalLen);
+  int32_t nPos = 0;
+  if (bSign) {
+    lpBuf[nPos++] = L's';
+  }
+  if (nIntLen == -1) {
+    lpBuf[nPos++] = L'z';
+    lpBuf[nPos++] = L'*';
+  } else {
+    while (nIntLen) {
+      lpBuf[nPos++] = L'z';
+      nIntLen--;
+    }
+  }
+  if (nDecLen != 0) {
+    lpBuf[nPos++] = L'.';
+  }
+  if (nDecLen == -1) {
+    lpBuf[nPos++] = L'z';
+    lpBuf[nPos++] = L'*';
+  } else {
+    while (nDecLen) {
+      lpBuf[nPos++] = L'z';
+      nDecLen--;
+    }
+  }
+  wsFormat.ReleaseBuffer(nTotalLen);
+}
+FX_BOOL CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric,
+                                              CFX_WideString& wsFormat,
+                                              IFX_Locale* pLocale,
+                                              int32_t* pos) {
+  if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) {
+    return TRUE;
+  }
+  const FX_WCHAR* pNum = wsNumeric.c_str();
+  const FX_WCHAR* pFmt = wsFormat.c_str();
+  int32_t n = 0, nf = 0;
+  FX_WCHAR c = pNum[n];
+  FX_WCHAR cf = pFmt[nf];
+  if (cf == L's') {
+    if (c == L'-' || c == L'+') {
+      ++n;
+    }
+    ++nf;
+  }
+  FX_BOOL bLimit = TRUE;
+  int32_t nCount = wsNumeric.GetLength();
+  int32_t nCountFmt = wsFormat.GetLength();
+  while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) &&
+         XFA_IsDigit(c = pNum[n])) {
+    if (bLimit == TRUE) {
+      if ((cf = pFmt[nf]) == L'*') {
+        bLimit = FALSE;
+      } else if (cf == L'z') {
+        nf++;
+      } else {
+        return FALSE;
+      }
+    }
+    n++;
+  }
+  if (n == nCount) {
+    return TRUE;
+  }
+  if (nf == nCountFmt) {
+    return FALSE;
+  }
+  while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') {
+    FXSYS_assert(cf == L'z' || cf == L'*');
+    ++nf;
+  }
+  CFX_WideString wsDecimalSymbol;
+  if (pLocale) {
+    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol);
+  } else {
+    wsDecimalSymbol = CFX_WideString(L'.');
+  }
+  if (pFmt[nf] != L'.') {
+    return FALSE;
+  }
+  if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') {
+    return FALSE;
+  }
+  ++nf;
+  ++n;
+  bLimit = TRUE;
+  while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) &&
+         XFA_IsDigit(c = pNum[n])) {
+    if (bLimit == TRUE) {
+      if ((cf = pFmt[nf]) == L'*') {
+        bLimit = FALSE;
+      } else if (cf == L'z') {
+        nf++;
+      } else {
+        return FALSE;
+      }
+    }
+    n++;
+  }
+  return n == nCount;
+}
diff --git a/xfa/fxfa/parser/xfa_localevalue.h b/xfa/fxfa/parser/xfa_localevalue.h
new file mode 100644
index 0000000..5906858
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_localevalue.h
@@ -0,0 +1,112 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
+#define XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
+
+#include "xfa/include/fxfa/fxfa_objectacc.h"
+
+class IFX_Locale;
+class CFX_Unitime;
+class CXFA_LocaleMgr;
+
+#define XFA_VT_NULL 0
+#define XFA_VT_BOOLEAN 1
+#define XFA_VT_INTEGER 2
+#define XFA_VT_DECIMAL 4
+#define XFA_VT_FLOAT 8
+#define XFA_VT_TEXT 16
+#define XFA_VT_DATE 32
+#define XFA_VT_TIME 64
+#define XFA_VT_DATETIME 128
+
+class CXFA_LocaleValue {
+ public:
+  CXFA_LocaleValue();
+  CXFA_LocaleValue(const CXFA_LocaleValue& value);
+  CXFA_LocaleValue(FX_DWORD dwType, CXFA_LocaleMgr* pLocaleMgr);
+  CXFA_LocaleValue(FX_DWORD dwType,
+                   const CFX_WideString& wsValue,
+                   CXFA_LocaleMgr* pLocaleMgr);
+  CXFA_LocaleValue(FX_DWORD dwType,
+                   const CFX_WideString& wsValue,
+                   const CFX_WideString& wsFormat,
+                   IFX_Locale* pLocale,
+                   CXFA_LocaleMgr* pLocaleMgr);
+  ~CXFA_LocaleValue();
+  CXFA_LocaleValue& operator=(const CXFA_LocaleValue& value);
+
+  FX_BOOL ValidateValue(const CFX_WideString& wsValue,
+                        const CFX_WideString& wsPattern,
+                        IFX_Locale* pLocale,
+                        CFX_WideString* pMatchFormat = NULL);
+  FX_BOOL FormatPatterns(CFX_WideString& wsResult,
+                         const CFX_WideString& wsFormat,
+                         IFX_Locale* pLocale,
+                         XFA_VALUEPICTURE eValueType) const;
+  FX_BOOL FormatSinglePattern(CFX_WideString& wsResult,
+                              const CFX_WideString& wsFormat,
+                              IFX_Locale* pLocale,
+                              XFA_VALUEPICTURE eValueType) const;
+  FX_BOOL ValidateCanonicalValue(const CFX_WideString& wsValue,
+                                 FX_DWORD dwVType);
+  FX_BOOL ValidateCanonicalDate(const CFX_WideString& wsDate,
+                                CFX_Unitime& unDate);
+  FX_BOOL ValidateCanonicalTime(const CFX_WideString& wsTime);
+  FX_BOOL ValidateCanonicalDateTime(const CFX_WideString& wsDateTime);
+  void GetNumbericFormat(CFX_WideString& wsFormat,
+                         int32_t nIntLen,
+                         int32_t nDecLen,
+                         FX_BOOL bSign = TRUE);
+  FX_BOOL ValidateNumericTemp(CFX_WideString& wsNumeric,
+                              CFX_WideString& wsFormat,
+                              IFX_Locale* pLocale = NULL,
+                              int32_t* pos = NULL);
+
+  CFX_WideString GetValue() const;
+  FX_DWORD GetType() const;
+  void SetValue(const CFX_WideString& wsValue, FX_DWORD dwType);
+  CFX_WideString GetText() const;
+  FX_FLOAT GetNum() const;
+  FX_DOUBLE GetDoubleNum() const;
+  CFX_Unitime GetDate() const;
+  CFX_Unitime GetTime() const;
+  CFX_Unitime GetDateTime() const;
+  FX_BOOL SetText(const CFX_WideString& wsText);
+  FX_BOOL SetText(const CFX_WideString& wsText,
+                  const CFX_WideString& wsFormat,
+                  IFX_Locale* pLocale);
+  FX_BOOL SetNum(FX_FLOAT fNum);
+  FX_BOOL SetNum(const CFX_WideString& wsNum,
+                 const CFX_WideString& wsFormat,
+                 IFX_Locale* pLocale);
+  FX_BOOL SetDate(const CFX_Unitime& d);
+  FX_BOOL SetDate(const CFX_WideString& wsDate,
+                  const CFX_WideString& wsFormat,
+                  IFX_Locale* pLocale);
+  FX_BOOL SetTime(const CFX_Unitime& t);
+  FX_BOOL SetTime(const CFX_WideString& wsTime,
+                  const CFX_WideString& wsFormat,
+                  IFX_Locale* pLocale);
+  FX_BOOL SetDateTime(const CFX_Unitime& dt);
+  FX_BOOL SetDateTime(const CFX_WideString& wsDateTime,
+                      const CFX_WideString& wsFormat,
+                      IFX_Locale* pLocale);
+  bool IsNull() const { return m_dwType == XFA_VT_NULL; }
+  FX_BOOL IsEmpty() const { return m_wsValue.IsEmpty(); }
+  FX_BOOL IsValid() const { return m_bValid; }
+
+ protected:
+  FX_BOOL ParsePatternValue(const CFX_WideString& wsValue,
+                            const CFX_WideString& wsPattern,
+                            IFX_Locale* pLocale);
+  CXFA_LocaleMgr* m_pLocaleMgr;
+  CFX_WideString m_wsValue;
+  FX_DWORD m_dwType;
+  FX_BOOL m_bValid;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_LOCALEVALUE_H_
diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h
new file mode 100644
index 0000000..1dba001
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_object.h
@@ -0,0 +1,803 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_OBJECT_H_
+#define XFA_FXFA_PARSER_XFA_OBJECT_H_
+
+#include "xfa/fde/xml/fde_xml.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+class CXFA_Document;
+class CXFA_Node;
+class CXFA_NodeList;
+class CXFA_OrdinaryObject;
+
+enum XFA_OBJECTTYPE {
+  XFA_OBJECTTYPE_OrdinaryObject = 0x0,
+  XFA_OBJECTTYPE_OrdinaryList = 0x1,
+  XFA_OBJECTTYPE_NodeList = 0x2,
+  XFA_OBJECTTYPE_Node = 0x4,
+  XFA_OBJECTTYPE_NodeC = 0x5,
+  XFA_OBJECTTYPE_NodeV = 0x6,
+  XFA_OBJECTTYPE_ModelNode = 0x8,
+  XFA_OBJECTTYPE_TextNode = 0x9,
+  XFA_OBJECTTYPE_ContainerNode = 0xA,
+  XFA_OBJECTTYPE_ContentNode = 0xB,
+  XFA_OBJECTTYPE_VariablesThis = 0xC,
+  XFA_OBJECTTYPEMASK = 0xF,
+  XFA_NODEFLAG_Initialized = 0x00020,
+  XFA_NODEFLAG_HasRemoved = 0x00200,
+  XFA_NODEFLAG_NeedsInitApp = 0x00400,
+  XFA_NODEFLAG_BindFormItems = 0x00800,
+  XFA_NODEFLAG_UserInteractive = 0x01000,
+  XFA_NODEFLAG_SkipDataBinding = 0x02000,
+  XFA_NODEFLAG_OwnXMLNode = 0x04000,
+  XFA_NODEFLAG_UnusedNode = 0x08000,
+  XFA_NODEFLAG_LayoutGeneratedNode = 0x10000,
+};
+class CXFA_Object {
+ public:
+  CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags);
+  CXFA_Document* GetDocument() const { return m_pDocument; }
+  FX_DWORD GetFlag() const { return m_uFlags; }
+  XFA_OBJECTTYPE GetObjectType() const {
+    return (XFA_OBJECTTYPE)(m_uFlags & XFA_OBJECTTYPEMASK);
+  }
+
+  FX_BOOL IsNode() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) >= XFA_OBJECTTYPE_Node;
+  }
+  FX_BOOL IsOrdinaryObject() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryObject;
+  }
+  FX_BOOL IsNodeList() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_NodeList;
+  }
+  FX_BOOL IsOrdinaryList() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryList;
+  }
+  FX_BOOL IsContentNode() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContentNode;
+  }
+  FX_BOOL IsContainerNode() const {
+    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContainerNode;
+  }
+
+  CXFA_Node* AsNode();
+  CXFA_OrdinaryObject* AsOrdinaryObject();
+  CXFA_NodeList* AsNodeList();
+
+  const CXFA_Node* AsNode() const;
+  const CXFA_OrdinaryObject* AsOrdinaryObject() const;
+  const CXFA_NodeList* AsNodeList() const;
+
+  XFA_ELEMENT GetClassID() const;
+  void GetClassName(CFX_WideStringC& wsName) const;
+  uint32_t GetClassHashCode() const;
+  void Script_ObjectClass_ClassName(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void ThrowScriptErrorMessage(int32_t iStringID, ...);
+
+ protected:
+  CXFA_Document* const m_pDocument;
+  FX_DWORD m_uFlags;
+};
+
+#define XFA_NODEFILTER_Children 0x01
+#define XFA_NODEFILTER_Properties 0x02
+#define XFA_NODEFILTER_OneOfProperty 0x04
+#define XFA_CLONEFLAG_Content 0x01
+enum XFA_NODEITEM {
+  XFA_NODEITEM_Parent,
+  XFA_NODEITEM_FirstChild,
+  XFA_NODEITEM_NextSibling,
+  XFA_NODEITEM_PrevSibling,
+};
+enum XFA_SOM_MESSAGETYPE {
+  XFA_SOM_ValidationMessage,
+  XFA_SOM_FormatMessage,
+  XFA_SOM_MandatoryMessage
+};
+
+typedef CFX_ArrayTemplate<CXFA_Node*> CXFA_NodeArray;
+typedef CFX_StackTemplate<CXFA_Node*> CXFA_NodeStack;
+typedef CXFA_PtrSetTemplate<CXFA_Node*> CXFA_NodeSet;
+typedef void (*PD_CALLBACK_DUPLICATEDATA)(void*& pData);
+
+struct XFA_MAPDATABLOCKCALLBACKINFO {
+  PD_CALLBACK_FREEDATA pFree;
+  PD_CALLBACK_DUPLICATEDATA pCopy;
+};
+
+struct XFA_MAPDATABLOCK {
+  uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); }
+  XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo;
+  int32_t iBytes;
+};
+
+struct XFA_MAPMODULEDATA {
+  CFX_MapPtrToPtr m_ValueMap;
+  CFX_MapPtrTemplate<void*, XFA_MAPDATABLOCK*> m_BufferMap;
+};
+
+#define XFA_CalcRefCount (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'R')
+#define XFA_CalcData (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'C')
+#define XFA_LAYOUTITEMKEY (void*)(uintptr_t) FXBSTR_ID('L', 'Y', 'I', 'M')
+class CXFA_Node : public CXFA_Object {
+ public:
+  XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
+  FX_DWORD GetPacketID() const { return m_ePacket; }
+  FX_BOOL HasFlag(FX_DWORD dwFlag) const;
+  void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE, FX_BOOL bNotify = TRUE);
+  FX_BOOL IsAttributeInXML();
+  FX_BOOL IsFormContainer() {
+    return m_ePacket == XFA_XDPPACKET_Form && IsContainerNode();
+  }
+  void SetXMLMappingNode(IFDE_XMLNode* pXMLNode) { m_pXMLNode = pXMLNode; }
+  IFDE_XMLNode* GetXMLMappingNode() const { return m_pXMLNode; }
+  IFDE_XMLNode* CreateXMLMappingNode();
+  FX_BOOL IsNeedSavingXMLNode();
+  FX_DWORD GetNameHash() const { return m_dwNameHash; }
+  bool IsUnnamed() const { return m_dwNameHash == 0; }
+  CXFA_Node* GetModelNode();
+  void UpdateNameHash();
+  FX_BOOL HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit = FALSE);
+  FX_BOOL SetAttribute(XFA_ATTRIBUTE eAttr,
+                       const CFX_WideStringC& wsValue,
+                       FX_BOOL bNotify = FALSE);
+  FX_BOOL GetAttribute(XFA_ATTRIBUTE eAttr,
+                       CFX_WideString& wsValue,
+                       FX_BOOL bUseDefault = TRUE);
+  FX_BOOL SetAttribute(const CFX_WideStringC& wsAttr,
+                       const CFX_WideStringC& wsValue,
+                       FX_BOOL bNotify = FALSE);
+  FX_BOOL GetAttribute(const CFX_WideStringC& wsAttr,
+                       CFX_WideString& wsValue,
+                       FX_BOOL bUseDefault = TRUE);
+  FX_BOOL RemoveAttribute(const CFX_WideStringC& wsAttr);
+  FX_BOOL SetContent(const CFX_WideString& wsContent,
+                     const CFX_WideString& wsXMLValue,
+                     FX_BOOL bNotify = FALSE,
+                     FX_BOOL bScriptModify = FALSE,
+                     FX_BOOL bSyncData = TRUE);
+  FX_BOOL TryContent(CFX_WideString& wsContent,
+                     FX_BOOL bScriptModify = FALSE,
+                     FX_BOOL bProto = TRUE);
+  CFX_WideString GetContent();
+
+  FX_BOOL TryNamespace(CFX_WideString& wsNamespace);
+
+  FX_BOOL SetBoolean(XFA_ATTRIBUTE eAttr,
+                     FX_BOOL bValue,
+                     FX_BOOL bNotify = FALSE) {
+    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, (void*)(uintptr_t)bValue,
+                    bNotify);
+  }
+  FX_BOOL TryBoolean(XFA_ATTRIBUTE eAttr,
+                     FX_BOOL& bValue,
+                     FX_BOOL bUseDefault = TRUE);
+  FX_BOOL GetBoolean(XFA_ATTRIBUTE eAttr) {
+    FX_BOOL bValue;
+    return TryBoolean(eAttr, bValue, TRUE) ? bValue : FALSE;
+  }
+  FX_BOOL SetInteger(XFA_ATTRIBUTE eAttr,
+                     int32_t iValue,
+                     FX_BOOL bNotify = FALSE) {
+    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, (void*)(uintptr_t)iValue,
+                    bNotify);
+  }
+  FX_BOOL TryInteger(XFA_ATTRIBUTE eAttr,
+                     int32_t& iValue,
+                     FX_BOOL bUseDefault = TRUE);
+  int32_t GetInteger(XFA_ATTRIBUTE eAttr) {
+    int32_t iValue;
+    return TryInteger(eAttr, iValue, TRUE) ? iValue : 0;
+  }
+  FX_BOOL SetEnum(XFA_ATTRIBUTE eAttr,
+                  XFA_ATTRIBUTEENUM eValue,
+                  FX_BOOL bNotify = FALSE) {
+    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, (void*)(uintptr_t)eValue,
+                    bNotify);
+  }
+  FX_BOOL TryEnum(XFA_ATTRIBUTE eAttr,
+                  XFA_ATTRIBUTEENUM& eValue,
+                  FX_BOOL bUseDefault = TRUE);
+  XFA_ATTRIBUTEENUM GetEnum(XFA_ATTRIBUTE eAttr) {
+    XFA_ATTRIBUTEENUM eValue;
+    return TryEnum(eAttr, eValue, TRUE) ? eValue : XFA_ATTRIBUTEENUM_Unknown;
+  }
+  FX_BOOL SetCData(XFA_ATTRIBUTE eAttr,
+                   const CFX_WideString& wsValue,
+                   FX_BOOL bNotify = FALSE,
+                   FX_BOOL bScriptModify = FALSE);
+  FX_BOOL SetAttributeValue(const CFX_WideString& wsValue,
+                            const CFX_WideString& wsXMLValue,
+                            FX_BOOL bNotify = FALSE,
+                            FX_BOOL bScriptModify = FALSE);
+  FX_BOOL TryCData(XFA_ATTRIBUTE eAttr,
+                   CFX_WideString& wsValue,
+                   FX_BOOL bUseDefault = TRUE,
+                   FX_BOOL bProto = TRUE);
+  FX_BOOL TryCData(XFA_ATTRIBUTE eAttr,
+                   CFX_WideStringC& wsValue,
+                   FX_BOOL bUseDefault = TRUE,
+                   FX_BOOL bProto = TRUE);
+  CFX_WideStringC GetCData(XFA_ATTRIBUTE eAttr) {
+    CFX_WideStringC wsValue;
+    return TryCData(eAttr, wsValue) ? wsValue : CFX_WideStringC();
+  }
+  FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr,
+                     CXFA_Measurement mValue,
+                     FX_BOOL bNotify = FALSE);
+  FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr,
+                     CXFA_Measurement& mValue,
+                     FX_BOOL bUseDefault = TRUE) const;
+  CXFA_Measurement GetMeasure(XFA_ATTRIBUTE eAttr) const;
+  FX_BOOL SetObject(XFA_ATTRIBUTE eAttr,
+                    void* pData,
+                    XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
+  FX_BOOL TryObject(XFA_ATTRIBUTE eAttr, void*& pData);
+  void* GetObject(XFA_ATTRIBUTE eAttr) {
+    void* pData;
+    return TryObject(eAttr, pData) ? pData : NULL;
+  }
+  FX_BOOL SetUserData(void* pKey,
+                      void* pData,
+                      XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
+  FX_BOOL TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso = FALSE);
+  void* GetUserData(void* pKey, FX_BOOL bProtoAlso = FALSE) {
+    void* pData;
+    return TryUserData(pKey, pData, bProtoAlso) ? pData : NULL;
+  }
+  CXFA_Node* GetProperty(int32_t index,
+                         XFA_ELEMENT eProperty,
+                         FX_BOOL bCreateProperty = TRUE);
+  int32_t CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild = FALSE);
+  CXFA_Node* GetChild(int32_t index,
+                      XFA_ELEMENT eElement,
+                      FX_BOOL bOnlyChild = FALSE);
+  int32_t InsertChild(int32_t index, CXFA_Node* pNode);
+  FX_BOOL InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode = NULL);
+  FX_BOOL RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify = TRUE);
+  CXFA_Node* Clone(FX_BOOL bRecursive);
+  CXFA_Node* GetNodeItem(XFA_NODEITEM eItem) const;
+  CXFA_Node* GetNodeItem(XFA_NODEITEM eItem, XFA_OBJECTTYPE eType) const;
+  int32_t GetNodeList(CXFA_NodeArray& nodes,
+                      FX_DWORD dwTypeFilter = XFA_NODEFILTER_Children |
+                                              XFA_NODEFILTER_Properties,
+                      XFA_ELEMENT eElementFilter = XFA_ELEMENT_UNKNOWN,
+                      int32_t iLevel = 1);
+  CXFA_Node* CreateSamePacketNode(XFA_ELEMENT eElement,
+                                  FX_DWORD dwFlags = XFA_NODEFLAG_Initialized);
+  CXFA_Node* CloneTemplateToForm(FX_BOOL bRecursive);
+  CXFA_Node* GetTemplateNode() const;
+  void SetTemplateNode(CXFA_Node* pTemplateNode);
+  CXFA_Node* GetDataDescriptionNode();
+  void SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode);
+  CXFA_Node* GetBindData();
+  int32_t GetBindItems(CXFA_NodeArray& formItems);
+  int32_t AddBindItem(CXFA_Node* pFormNode);
+  int32_t RemoveBindItem(CXFA_Node* pFormNode);
+  FX_BOOL HasBindItem();
+  CXFA_WidgetData* GetWidgetData();
+  CXFA_WidgetData* GetContainerWidgetData();
+  FX_BOOL GetLocaleName(CFX_WideString& wsLocaleName);
+  XFA_ATTRIBUTEENUM GetIntact();
+  CXFA_Node* GetFirstChildByName(const CFX_WideStringC& wsNodeName) const;
+  CXFA_Node* GetFirstChildByName(FX_DWORD dwNodeNameHash) const;
+  CXFA_Node* GetFirstChildByClass(XFA_ELEMENT eNodeClass) const;
+  CXFA_Node* GetNextSameNameSibling(FX_DWORD dwNodeNameHash) const;
+  CXFA_Node* GetNextSameNameSibling(const CFX_WideStringC& wsNodeName) const;
+  CXFA_Node* GetNextSameClassSibling(XFA_ELEMENT eNodeClass) const;
+  int32_t GetNodeSameNameIndex() const;
+  int32_t GetNodeSameClassIndex() const;
+  void GetSOMExpression(CFX_WideString& wsSOMExpression);
+  CXFA_Node* GetInstanceMgrOfSubform();
+
+  CXFA_Node* GetOccurNode();
+  void Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments);
+  void Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments);
+  void Script_Som_ResolveNodeList(FXJSE_HVALUE hValue,
+                                  CFX_WideString wsExpression,
+                                  FX_DWORD dwFlag,
+                                  CXFA_Node* refNode = NULL);
+  void Script_TreeClass_All(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_Nodes(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_ClassAll(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_Parent(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_Index(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_TreeClass_SomExpression(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_Clone(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments);
+  void Script_NodeClass_Ns(FXJSE_HVALUE hValue,
+                           FX_BOOL bSetting,
+                           XFA_ATTRIBUTE eAttribute);
+  void Script_NodeClass_Model(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_NodeClass_IsContainer(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_NodeClass_IsNull(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+  void Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments);
+  void Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments);
+  void Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments);
+  void Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments);
+  void Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments);
+  void Script_ModelClass_Context(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute);
+  void Script_ModelClass_AliasNode(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments);
+  void Script_Delta_Restore(CFXJSE_Arguments* pArguments);
+  void Script_Delta_CurrentValue(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute);
+  void Script_Delta_SavedValue(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+  void Script_Delta_Target(FXJSE_HVALUE hValue,
+                           FX_BOOL bSetting,
+                           XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_SendAttributeChangeMessage(void* eAttribute,
+                                                   void* eValue,
+                                                   FX_BOOL bScriptModify);
+  void Script_Attribute_Integer(FXJSE_HVALUE hValue,
+                                FX_BOOL bSetting,
+                                XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_IntegerRead(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_BOOL(FXJSE_HVALUE hValue,
+                             FX_BOOL bSetting,
+                             XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_BOOLRead(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_String(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+  void Script_Attribute_StringRead(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_Som_ValidationMessage(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_Field_Length(FXJSE_HVALUE hValue,
+                           FX_BOOL bSetting,
+                           XFA_ATTRIBUTE eAttribute);
+  void Script_Som_DefaultValue(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+  void Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_Boolean_Value(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_Som_Message(FXJSE_HVALUE hValue,
+                          FX_BOOL bSetting,
+                          XFA_SOM_MESSAGETYPE iMessageType);
+  void Script_Som_BorderColor(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_Som_BorderWidth(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_Som_FillColor(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_Som_DataNode(FXJSE_HVALUE hValue,
+                           FX_BOOL bSetting,
+                           XFA_ATTRIBUTE eAttribute);
+  void Script_Som_FontColor(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_Som_Mandatory(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_Som_MandatoryMessage(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_Som_InstanceIndex(FXJSE_HVALUE hValue,
+                                FX_BOOL bSetting,
+                                XFA_ATTRIBUTE eAttribute);
+  void Script_Draw_DefaultValue(FXJSE_HVALUE hValue,
+                                FX_BOOL bSetting,
+                                XFA_ATTRIBUTE eAttribute);
+  void Script_Field_DefaultValue(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute);
+  void Script_Field_EditValue(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_Field_FormatMessage(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_Field_FormattedValue(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_Field_ParentSubform(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_Field_SelectedIndex(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_Field_ClearItems(CFXJSE_Arguments* pArguments);
+  void Script_Field_ExecEvent(CFXJSE_Arguments* pArguments);
+  void Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments);
+  void Script_Field_DeleteItem(CFXJSE_Arguments* pArguments);
+  void Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments);
+  void Script_Field_BoundItem(CFXJSE_Arguments* pArguments);
+  void Script_Field_GetItemState(CFXJSE_Arguments* pArguments);
+  void Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments);
+  void Script_Field_SetItems(CFXJSE_Arguments* pArguments);
+  void Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments);
+  void Script_Field_SetItemState(CFXJSE_Arguments* pArguments);
+  void Script_Field_AddItem(CFXJSE_Arguments* pArguments);
+  void Script_Field_ExecValidate(CFXJSE_Arguments* pArguments);
+  void Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute);
+  void Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_ExclGroup_Transient(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments);
+  void Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments);
+  void Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments);
+  void Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments);
+  void Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments);
+  void Script_Subform_InstanceManager(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_Subform_Locale(FXJSE_HVALUE hValue,
+                             FX_BOOL bSetting,
+                             XFA_ATTRIBUTE eAttribute);
+  void Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments);
+  void Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments);
+  void Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments);
+  void Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments);
+  void Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments);
+
+  int32_t Subform_and_SubformSet_InstanceIndex();
+  void Script_Template_FormNodes(CFXJSE_Arguments* pArguments);
+  void Script_Template_Remerge(CFXJSE_Arguments* pArguments);
+  void Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments);
+  void Script_Template_CreateNode(CFXJSE_Arguments* pArguments);
+  void Script_Template_Recalculate(CFXJSE_Arguments* pArguments);
+  void Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments);
+  void Script_Template_ExecValidate(CFXJSE_Arguments* pArguments);
+  void Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments);
+  void Script_InstanceManager_Count(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_InstanceManager_Max(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_InstanceManager_Min(FXJSE_HVALUE hValue,
+                                  FX_BOOL bSetting,
+                                  XFA_ATTRIBUTE eAttribute);
+  void Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments);
+  void Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments);
+  void Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments);
+  void Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments);
+  void Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments);
+  int32_t InstanceManager_SetInstances(int32_t iCount);
+  int32_t InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom);
+  void Script_Occur_Max(FXJSE_HVALUE hValue,
+                        FX_BOOL bSetting,
+                        XFA_ATTRIBUTE eAttribute);
+  void Script_Occur_Min(FXJSE_HVALUE hValue,
+                        FX_BOOL bSetting,
+                        XFA_ATTRIBUTE eAttribute);
+  void Script_Desc_Metadata(CFXJSE_Arguments* pArguments);
+  void Script_Form_FormNodes(CFXJSE_Arguments* pArguments);
+  void Script_Form_Remerge(CFXJSE_Arguments* pArguments);
+  void Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments);
+  void Script_Form_Recalculate(CFXJSE_Arguments* pArguments);
+  void Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments);
+  void Script_Form_ExecValidate(CFXJSE_Arguments* pArguments);
+  void Script_Form_Checksum(FXJSE_HVALUE hValue,
+                            FX_BOOL bSetting,
+                            XFA_ATTRIBUTE eAttribute);
+  void Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments);
+  void Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments);
+  void Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments);
+  void Script_Packet_Content(FXJSE_HVALUE hValue,
+                             FX_BOOL bSetting,
+                             XFA_ATTRIBUTE eAttribute);
+  void Script_Source_Next(CFXJSE_Arguments* pArguments);
+  void Script_Source_CancelBatch(CFXJSE_Arguments* pArguments);
+  void Script_Source_First(CFXJSE_Arguments* pArguments);
+  void Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments);
+  void Script_Source_Previous(CFXJSE_Arguments* pArguments);
+  void Script_Source_IsBOF(CFXJSE_Arguments* pArguments);
+  void Script_Source_IsEOF(CFXJSE_Arguments* pArguments);
+  void Script_Source_Cancel(CFXJSE_Arguments* pArguments);
+  void Script_Source_Update(CFXJSE_Arguments* pArguments);
+  void Script_Source_Open(CFXJSE_Arguments* pArguments);
+  void Script_Source_Delete(CFXJSE_Arguments* pArguments);
+  void Script_Source_AddNew(CFXJSE_Arguments* pArguments);
+  void Script_Source_Requery(CFXJSE_Arguments* pArguments);
+  void Script_Source_Resync(CFXJSE_Arguments* pArguments);
+  void Script_Source_Close(CFXJSE_Arguments* pArguments);
+  void Script_Source_Last(CFXJSE_Arguments* pArguments);
+  void Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments);
+  void Script_Source_Db(FXJSE_HVALUE hValue,
+                        FX_BOOL bSetting,
+                        XFA_ATTRIBUTE eAttribute);
+  void Script_Xfa_This(FXJSE_HVALUE hValue,
+                       FX_BOOL bSetting,
+                       XFA_ATTRIBUTE eAttribute);
+  void Script_Handler_Version(FXJSE_HVALUE hValue,
+                              FX_BOOL bSetting,
+                              XFA_ATTRIBUTE eAttribute);
+  void Script_SubmitFormat_Mode(FXJSE_HVALUE hValue,
+                                FX_BOOL bSetting,
+                                XFA_ATTRIBUTE eAttribute);
+  void Script_Extras_Type(FXJSE_HVALUE hValue,
+                          FX_BOOL bSetting,
+                          XFA_ATTRIBUTE eAttribute);
+  void Script_Encrypt_Format(FXJSE_HVALUE hValue,
+                             FX_BOOL bSetting,
+                             XFA_ATTRIBUTE eAttribute);
+  void Script_Script_Stateless(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+
+ protected:
+  CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement);
+  ~CXFA_Node();
+  friend class CXFA_Document;
+  CXFA_Node* Deprecated_GetPrevSibling();
+  FX_BOOL SetValue(XFA_ATTRIBUTE eAttr,
+                   XFA_ATTRIBUTETYPE eType,
+                   void* pValue,
+                   FX_BOOL bNotify);
+  FX_BOOL GetValue(XFA_ATTRIBUTE eAttr,
+                   XFA_ATTRIBUTETYPE eType,
+                   FX_BOOL bUseDefault,
+                   void*& pValue);
+  void OnRemoved(CXFA_Node* pParent, CXFA_Node* pRemoved, FX_BOOL bNotify);
+  void OnChanging(XFA_ATTRIBUTE eAttr, void* pNewValue, FX_BOOL bNotify);
+  void OnChanged(XFA_ATTRIBUTE eAttr,
+                 void* pNewValue,
+                 FX_BOOL bNotify,
+                 FX_BOOL bScriptModify = FALSE);
+  int32_t execSingleEventByName(const CFX_WideStringC& wsEventName,
+                                XFA_ELEMENT eElementType);
+  FX_BOOL SetScriptContent(const CFX_WideString& wsContent,
+                           const CFX_WideString& wsXMLValue,
+                           FX_BOOL bNotify = TRUE,
+                           FX_BOOL bScriptModify = FALSE,
+                           FX_BOOL bSyncData = TRUE);
+  CFX_WideString GetScriptContent(FX_BOOL bScriptModify = FALSE);
+  XFA_MAPMODULEDATA* CreateMapModuleData();
+  XFA_MAPMODULEDATA* GetMapModuleData() const;
+  void SetMapModuleValue(void* pKey, void* pValue);
+  FX_BOOL GetMapModuleValue(void* pKey, void*& pValue);
+  void SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue);
+  FX_BOOL GetMapModuleString(void* pKey, CFX_WideStringC& wsValue);
+  void SetMapModuleBuffer(void* pKey,
+                          void* pValue,
+                          int32_t iBytes,
+                          XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
+  FX_BOOL GetMapModuleBuffer(void* pKey,
+                             void*& pValue,
+                             int32_t& iBytes,
+                             FX_BOOL bProtoAlso = TRUE) const;
+  FX_BOOL HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso = FALSE);
+  void RemoveMapModuleKey(void* pKey = NULL);
+  void MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr = TRUE);
+  void MoveBufferMapData(CXFA_Node* pDstModule, void* pKey);
+  void MoveBufferMapData(CXFA_Node* pSrcModule,
+                         CXFA_Node* pDstModule,
+                         void* pKey,
+                         FX_BOOL bRecursive = FALSE);
+
+  CXFA_Node* m_pNext;
+  CXFA_Node* m_pChild;
+  CXFA_Node* m_pLastChild;
+  CXFA_Node* m_pParent;
+  IFDE_XMLNode* m_pXMLNode;
+  XFA_ELEMENT m_eNodeClass;
+  FX_WORD m_ePacket;
+  FX_DWORD m_dwNameHash;
+  CXFA_Node* m_pAuxNode;
+  XFA_MAPMODULEDATA* m_pMapModuleData;
+};
+class CXFA_OrdinaryObject : public CXFA_Object {
+ public:
+  CXFA_OrdinaryObject(CXFA_Document* pDocument, XFA_ELEMENT eElement)
+      : CXFA_Object(pDocument, XFA_OBJECTTYPE_OrdinaryObject),
+        m_uScriptHash(0) {
+    m_eNodeClass = eElement;
+  }
+  XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
+  uint32_t GetScriptObjHash() { return m_uScriptHash; }
+
+ protected:
+  XFA_ELEMENT m_eNodeClass;
+  uint32_t m_uScriptHash;
+};
+class CXFA_ThisProxy : public CXFA_Object {
+ public:
+  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode)
+      : CXFA_Object(pThisNode->GetDocument(), XFA_OBJECTTYPE_VariablesThis),
+        m_pThisNode(NULL),
+        m_pScriptNode(NULL) {
+    m_pThisNode = pThisNode;
+    m_pScriptNode = pScriptNode;
+  }
+  virtual ~CXFA_ThisProxy() {}
+  CXFA_Node* GetThisNode() { return m_pThisNode; }
+  CXFA_Node* GetScriptNode() { return m_pScriptNode; }
+
+ private:
+  CXFA_Node* m_pThisNode;
+  CXFA_Node* m_pScriptNode;
+};
+class CXFA_NodeList : public CXFA_Object {
+ public:
+  explicit CXFA_NodeList(CXFA_Document* pDocument);
+  virtual ~CXFA_NodeList() {}
+  XFA_ELEMENT GetClassID() const { return XFA_ELEMENT_NodeList; }
+  CXFA_Node* NamedItem(const CFX_WideStringC& wsName);
+  virtual int32_t GetLength() = 0;
+  virtual FX_BOOL Append(CXFA_Node* pNode) = 0;
+  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) = 0;
+  virtual FX_BOOL Remove(CXFA_Node* pNode) = 0;
+  virtual CXFA_Node* Item(int32_t iIndex) = 0;
+
+  void Script_ListClass_Append(CFXJSE_Arguments* pArguments);
+  void Script_ListClass_Insert(CFXJSE_Arguments* pArguments);
+  void Script_ListClass_Remove(CFXJSE_Arguments* pArguments);
+  void Script_ListClass_Item(CFXJSE_Arguments* pArguments);
+
+  void Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments);
+  void Script_ListClass_Length(FXJSE_HVALUE hValue,
+                               FX_BOOL bSetting,
+                               XFA_ATTRIBUTE eAttribute);
+};
+class CXFA_ArrayNodeList : public CXFA_NodeList {
+ public:
+  explicit CXFA_ArrayNodeList(CXFA_Document* pDocument);
+  void SetArrayNodeList(const CXFA_NodeArray& srcArray);
+  virtual int32_t GetLength();
+  virtual FX_BOOL Append(CXFA_Node* pNode);
+  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
+  virtual FX_BOOL Remove(CXFA_Node* pNode);
+  virtual CXFA_Node* Item(int32_t iIndex);
+
+ protected:
+  CXFA_NodeArray m_array;
+};
+class CXFA_AttachNodeList : public CXFA_NodeList {
+ public:
+  CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode);
+
+  virtual int32_t GetLength();
+  virtual FX_BOOL Append(CXFA_Node* pNode);
+  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
+  virtual FX_BOOL Remove(CXFA_Node* pNode);
+  virtual CXFA_Node* Item(int32_t iIndex);
+
+ protected:
+  CXFA_Node* m_pAttachNode;
+};
+class CXFA_TraverseStrategy_XFAContainerNode {
+ public:
+  static CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode,
+                                  void* pUserData = NULL) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild,
+                                      XFA_OBJECTTYPE_ContainerNode);
+  }
+  static CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode,
+                                   void* pUserData = NULL) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling,
+                                      XFA_OBJECTTYPE_ContainerNode);
+  }
+  static CXFA_Node* GetParent(CXFA_Node* pTemplateNode,
+                              void* pUserData = NULL) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent,
+                                      XFA_OBJECTTYPE_ContainerNode);
+  }
+};
+typedef CXFA_NodeIteratorTemplate<CXFA_Node,
+                                  CXFA_TraverseStrategy_XFAContainerNode>
+    CXFA_ContainerIterator;
+class CXFA_TraverseStrategy_XFANode {
+ public:
+  static inline CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  }
+  static inline CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  static inline CXFA_Node* GetParent(CXFA_Node* pTemplateNode) {
+    return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+};
+typedef CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+    CXFA_NodeIterator;
+
+inline CXFA_Node* CXFA_Object::AsNode() {
+  return IsNode() ? static_cast<CXFA_Node*>(this) : nullptr;
+}
+inline CXFA_OrdinaryObject* CXFA_Object::AsOrdinaryObject() {
+  return IsOrdinaryObject() ? static_cast<CXFA_OrdinaryObject*>(this) : nullptr;
+}
+inline CXFA_NodeList* CXFA_Object::AsNodeList() {
+  return IsNodeList() ? static_cast<CXFA_NodeList*>(this) : nullptr;
+}
+
+inline const CXFA_Node* CXFA_Object::AsNode() const {
+  return IsNode() ? static_cast<const CXFA_Node*>(this) : nullptr;
+}
+inline const CXFA_OrdinaryObject* CXFA_Object::AsOrdinaryObject() const {
+  return IsOrdinaryObject() ? static_cast<const CXFA_OrdinaryObject*>(this)
+                            : nullptr;
+}
+inline const CXFA_NodeList* CXFA_Object::AsNodeList() const {
+  return IsNodeList() ? static_cast<const CXFA_NodeList*>(this) : nullptr;
+}
+
+inline CXFA_Node* ToNode(CXFA_Object* pObj) {
+  return pObj ? pObj->AsNode() : nullptr;
+}
+inline CXFA_OrdinaryObject* ToOrdinaryObject(CXFA_Object* pObj) {
+  return pObj ? pObj->AsOrdinaryObject() : nullptr;
+}
+inline CXFA_NodeList* ToNodeList(CXFA_Object* pObj) {
+  return pObj ? pObj->AsNodeList() : nullptr;
+}
+
+inline const CXFA_Node* ToNode(const CXFA_Object* pObj) {
+  return pObj ? pObj->AsNode() : nullptr;
+}
+inline const CXFA_OrdinaryObject* ToOrdinaryObject(const CXFA_Object* pObj) {
+  return pObj ? pObj->AsOrdinaryObject() : nullptr;
+}
+inline const CXFA_NodeList* ToNodeList(const CXFA_Object* pObj) {
+  return pObj ? pObj->AsNodeList() : nullptr;
+}
+
+#endif  // XFA_FXFA_PARSER_XFA_OBJECT_H_
diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp
new file mode 100644
index 0000000..83bf800
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp
@@ -0,0 +1,5408 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fgas/crt/fgas_system.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_Object::CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags)
+    : m_pDocument(pDocument), m_uFlags(uFlags) {}
+void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const {
+  wsName = XFA_GetElementByID(GetClassID())->pName;
+}
+uint32_t CXFA_Object::GetClassHashCode() const {
+  return XFA_GetElementByID(GetClassID())->uHash;
+}
+XFA_ELEMENT CXFA_Object::GetClassID() const {
+  if (IsNode()) {
+    return AsNode()->GetClassID();
+  }
+  if (IsOrdinaryObject()) {
+    return AsOrdinaryObject()->GetClassID();
+  }
+  if (IsNodeList()) {
+    return AsNodeList()->GetClassID();
+  }
+  if (IsOrdinaryList()) {
+    return XFA_ELEMENT_List;
+  }
+  ASSERT(FALSE);
+  return (XFA_ELEMENT)0;
+}
+void CXFA_Object::Script_ObjectClass_ClassName(FXJSE_HVALUE hValue,
+                                               FX_BOOL bSetting,
+                                               XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    CFX_WideStringC className;
+    GetClassName(className);
+    FXJSE_Value_SetUTF8String(
+        hValue, FX_UTF8Encode(className.GetPtr(), className.GetLength()));
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Object::ThrowScriptErrorMessage(int32_t iStringID, ...) {
+  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
+  FXSYS_assert(pAppProvider);
+  CFX_WideString wsFormat;
+  pAppProvider->LoadString(iStringID, wsFormat);
+  CFX_WideString wsMessage;
+  va_list arg_ptr;
+  va_start(arg_ptr, iStringID);
+  wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr);
+  va_end(arg_ptr);
+  FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
+}
+
+static void XFA_DeleteWideString(void* pData) {
+  delete static_cast<CFX_WideString*>(pData);
+}
+
+static void XFA_CopyWideString(void*& pData) {
+  if (pData) {
+    CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData);
+    pData = pNewData;
+  }
+}
+static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {
+    XFA_DeleteWideString, XFA_CopyWideString};
+static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) {
+  return (XFA_OBJECTTYPE)XFA_GetElementByID(eElement)->eObjectType;
+}
+CXFA_Node::CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement)
+    : CXFA_Object(pDoc, XFA_GetElementObjectType(eElement)),
+      m_pNext(nullptr),
+      m_pChild(nullptr),
+      m_pLastChild(nullptr),
+      m_pParent(nullptr),
+      m_pXMLNode(nullptr),
+      m_eNodeClass(eElement),
+      m_ePacket(ePacket),
+      m_dwNameHash(0),
+      m_pAuxNode(nullptr),
+      m_pMapModuleData(nullptr) {
+  ASSERT(m_pDocument);
+}
+CXFA_Node::~CXFA_Node() {
+  FXSYS_assert(m_pParent == NULL);
+  RemoveMapModuleKey();
+  CXFA_Node *pNext, *pNode = m_pChild;
+  while (pNode) {
+    pNext = pNode->m_pNext;
+    pNode->m_pParent = NULL;
+    delete pNode;
+    pNode = pNext;
+  }
+  if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) {
+    m_pXMLNode->Release();
+  }
+}
+CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) {
+  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
+  CXFA_Node* pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass);
+  if (!pClone) {
+    return NULL;
+  }
+  MergeAllData(pClone);
+  pClone->UpdateNameHash();
+  if (IsNeedSavingXMLNode()) {
+    IFDE_XMLNode* pCloneXML = NULL;
+    if (IsAttributeInXML()) {
+      CFX_WideString wsName;
+      GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
+      IFDE_XMLElement* pCloneXMLElement = IFDE_XMLElement::Create(wsName);
+      CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value);
+      if (!wsValue.IsEmpty()) {
+        pCloneXMLElement->SetTextData(wsValue);
+      }
+      pCloneXML = pCloneXMLElement;
+      pCloneXMLElement = NULL;
+      pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
+    } else {
+      pCloneXML = m_pXMLNode->Clone(FALSE);
+    }
+    pClone->SetXMLMappingNode(pCloneXML);
+    pClone->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+  }
+  if (bRecursive) {
+    for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
+         pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pClone->InsertChild(pChild->Clone(bRecursive));
+    }
+  }
+  pClone->SetFlag(XFA_NODEFLAG_Initialized);
+  pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+  return pClone;
+}
+CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const {
+  switch (eItem) {
+    case XFA_NODEITEM_NextSibling:
+      return m_pNext;
+    case XFA_NODEITEM_FirstChild:
+      return m_pChild;
+    case XFA_NODEITEM_Parent:
+      return m_pParent;
+    case XFA_NODEITEM_PrevSibling:
+      if (m_pParent) {
+        CXFA_Node* pSibling = m_pParent->m_pChild;
+        CXFA_Node* pPrev = NULL;
+        while (pSibling && pSibling != this) {
+          pPrev = pSibling;
+          pSibling = pSibling->m_pNext;
+        }
+        return pPrev;
+      }
+      return NULL;
+    default:
+      break;
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem,
+                                  XFA_OBJECTTYPE eType) const {
+  CXFA_Node* pNode = NULL;
+  switch (eItem) {
+    case XFA_NODEITEM_NextSibling:
+      pNode = m_pNext;
+      if (eType != XFA_OBJECTTYPEMASK) {
+        while (pNode && pNode->GetObjectType() != eType) {
+          pNode = pNode->m_pNext;
+        }
+      }
+      break;
+    case XFA_NODEITEM_FirstChild:
+      pNode = m_pChild;
+      if (eType != XFA_OBJECTTYPEMASK) {
+        while (pNode && pNode->GetObjectType() != eType) {
+          pNode = pNode->m_pNext;
+        }
+      }
+      break;
+    case XFA_NODEITEM_Parent:
+      pNode = m_pParent;
+      if (eType != XFA_OBJECTTYPEMASK) {
+        while (pNode && pNode->GetObjectType() != eType) {
+          pNode = pNode->m_pParent;
+        }
+      }
+      break;
+    case XFA_NODEITEM_PrevSibling:
+      if (m_pParent) {
+        CXFA_Node* pSibling = m_pParent->m_pChild;
+        while (pSibling && pSibling != this) {
+          if (eType == XFA_OBJECTTYPEMASK ||
+              eType == pSibling->GetObjectType()) {
+            pNode = pSibling;
+          }
+          pSibling = pSibling->m_pNext;
+        }
+      }
+      break;
+    default:
+      break;
+  }
+  return pNode;
+}
+int32_t CXFA_Node::GetNodeList(CXFA_NodeArray& nodes,
+                               FX_DWORD dwTypeFilter,
+                               XFA_ELEMENT eElementFilter,
+                               int32_t iLevel) {
+  if (--iLevel < 0) {
+    return nodes.GetSize();
+  }
+  if (eElementFilter != XFA_ELEMENT_UNKNOWN) {
+    CXFA_Node* pChild = m_pChild;
+    while (pChild) {
+      if (pChild->GetClassID() == eElementFilter) {
+        nodes.Add(pChild);
+        if (iLevel > 0) {
+          GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
+        }
+      }
+      pChild = pChild->m_pNext;
+    }
+  } else if (dwTypeFilter ==
+             (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) {
+    CXFA_Node* pChild = m_pChild;
+    while (pChild) {
+      nodes.Add(pChild);
+      if (iLevel > 0) {
+        GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
+      }
+      pChild = pChild->m_pNext;
+    }
+  } else if (dwTypeFilter != 0) {
+    FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0;
+    FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0;
+    FX_BOOL bFilterOneOfProperties =
+        (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0;
+    CXFA_Node* pChild = m_pChild;
+    while (pChild) {
+      const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
+          GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+      if (pProperty) {
+        if (bFilterProperties) {
+          nodes.Add(pChild);
+        } else if (bFilterOneOfProperties &&
+                   (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
+          nodes.Add(pChild);
+        } else if (bFilterChildren &&
+                   (pChild->GetClassID() == XFA_ELEMENT_Variables ||
+                    pChild->GetClassID() == XFA_ELEMENT_PageSet)) {
+          nodes.Add(pChild);
+        }
+      } else {
+        if (bFilterChildren) {
+          nodes.Add(pChild);
+        }
+      }
+      pChild = pChild->m_pNext;
+    }
+    if (bFilterOneOfProperties && nodes.GetSize() < 1) {
+      int32_t iProperties = 0;
+      const XFA_PROPERTY* pProperty =
+          XFA_GetElementProperties(GetClassID(), iProperties);
+      if (pProperty == NULL || iProperties < 1) {
+        return 0;
+      }
+      for (int32_t i = 0; i < iProperties; i++) {
+        if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) {
+          IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
+          const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(GetPacketID());
+          CXFA_Node* pNewNode =
+              pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName);
+          if (!pNewNode) {
+            break;
+          }
+          InsertChild(pNewNode, NULL);
+          pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
+          nodes.Add(pNewNode);
+          break;
+        }
+      }
+    }
+  }
+  return nodes.GetSize();
+}
+CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement,
+                                           FX_DWORD dwFlags) {
+  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
+  CXFA_Node* pNode = pFactory->CreateNode(m_ePacket, eElement);
+  pNode->SetFlag(dwFlags);
+  return pNode;
+}
+CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) {
+  FXSYS_assert(m_ePacket == XFA_XDPPACKET_Template);
+  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
+  CXFA_Node* pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass);
+  if (!pClone) {
+    return NULL;
+  }
+  pClone->SetTemplateNode(this);
+  pClone->UpdateNameHash();
+  pClone->SetXMLMappingNode(GetXMLMappingNode());
+  if (bRecursive) {
+    for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
+         pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive));
+    }
+  }
+  pClone->SetFlag(XFA_NODEFLAG_Initialized);
+  return pClone;
+}
+
+CXFA_Node* CXFA_Node::GetTemplateNode() const {
+  return m_pAuxNode;
+}
+
+void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
+  m_pAuxNode = pTemplateNode;
+}
+CXFA_Node* CXFA_Node::GetBindData() {
+  ASSERT(GetPacketID() == XFA_XDPPACKET_Form);
+  return static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
+}
+int32_t CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) {
+  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
+    CXFA_NodeArray* pItems = NULL;
+    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
+    formItems.Copy(*pItems);
+    return formItems.GetSize();
+  }
+  CXFA_Node* pFormNode =
+      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
+  if (pFormNode) {
+    formItems.Add(pFormNode);
+  }
+  return formItems.GetSize();
+}
+
+static void XFA_DataNodeDeleteBindItem(void* pData) {
+  delete static_cast<CXFA_NodeArray*>(pData);
+}
+
+static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {
+    XFA_DataNodeDeleteBindItem, NULL};
+int32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
+  ASSERT(pFormNode);
+  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
+    CXFA_NodeArray* pItems = NULL;
+    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
+    ASSERT(pItems);
+    if (pItems->Find(pFormNode) < 0) {
+      pItems->Add(pFormNode);
+    }
+    return pItems->GetSize();
+  }
+  CXFA_Node* pOldFormItem =
+      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
+  if (!pOldFormItem) {
+    SetObject(XFA_ATTRIBUTE_BindingNode, pFormNode);
+    return 1;
+  } else if (pOldFormItem == pFormNode) {
+    return 1;
+  }
+  CXFA_NodeArray* pItems = new CXFA_NodeArray;
+  SetObject(XFA_ATTRIBUTE_BindingNode, pItems, &deleteBindItemCallBack);
+  pItems->Add(pOldFormItem);
+  pItems->Add(pFormNode);
+  m_uFlags |= XFA_NODEFLAG_BindFormItems;
+  return 2;
+}
+int32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
+  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
+    CXFA_NodeArray* pItems = NULL;
+    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
+    ASSERT(pItems);
+    int32_t iIndex = pItems->Find(pFormNode);
+    int32_t iCount = pItems->GetSize();
+    if (iIndex >= 0) {
+      if (iIndex != iCount - 1) {
+        pItems->SetAt(iIndex, pItems->GetAt(iCount - 1));
+      }
+      pItems->RemoveAt(iCount - 1);
+      if (iCount == 2) {
+        CXFA_Node* pLastFormNode = pItems->GetAt(0);
+        SetObject(XFA_ATTRIBUTE_BindingNode, pLastFormNode);
+        m_uFlags &= ~XFA_NODEFLAG_BindFormItems;
+      }
+      iCount--;
+    }
+    return iCount;
+  }
+  CXFA_Node* pOldFormItem =
+      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
+  if (pOldFormItem == pFormNode) {
+    SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+    pOldFormItem = NULL;
+  }
+  return pOldFormItem == NULL ? 0 : 1;
+}
+FX_BOOL CXFA_Node::HasBindItem() {
+  return (GetPacketID() == XFA_XDPPACKET_Datasets) &&
+         GetObject(XFA_ATTRIBUTE_BindingNode) != NULL;
+}
+CXFA_WidgetData* CXFA_Node::GetWidgetData() {
+  return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData);
+}
+CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() {
+  if (GetPacketID() != XFA_XDPPACKET_Form) {
+    return NULL;
+  }
+  XFA_ELEMENT classID = GetClassID();
+  if (classID == XFA_ELEMENT_ExclGroup) {
+    return NULL;
+  }
+  CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
+    return NULL;
+  }
+  if (classID == XFA_ELEMENT_Field) {
+    CXFA_WidgetData* pFieldWidgetData = GetWidgetData();
+    if (pFieldWidgetData &&
+        pFieldWidgetData->GetChoiceListOpen() ==
+            XFA_ATTRIBUTEENUM_MultiSelect) {
+      return NULL;
+    } else {
+      CFX_WideString wsPicture;
+      if (pFieldWidgetData) {
+        pFieldWidgetData->GetPictureContent(wsPicture,
+                                            XFA_VALUEPICTURE_DataBind);
+      }
+      if (!wsPicture.IsEmpty()) {
+        return pFieldWidgetData;
+      }
+      CXFA_Node* pDataNode = GetBindData();
+      if (!pDataNode) {
+        return NULL;
+      }
+      pFieldWidgetData = NULL;
+      CXFA_NodeArray formNodes;
+      pDataNode->GetBindItems(formNodes);
+      for (int32_t i = 0; i < formNodes.GetSize(); i++) {
+        CXFA_Node* pFormNode = formNodes.GetAt(i);
+        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+          continue;
+        }
+        pFieldWidgetData = pFormNode->GetWidgetData();
+        if (pFieldWidgetData) {
+          pFieldWidgetData->GetPictureContent(wsPicture,
+                                              XFA_VALUEPICTURE_DataBind);
+        }
+        if (!wsPicture.IsEmpty()) {
+          break;
+        }
+        pFieldWidgetData = NULL;
+      }
+      return pFieldWidgetData;
+    }
+  }
+  CXFA_Node* pGrandNode =
+      pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
+  CXFA_Node* pValueNode =
+      (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value)
+          ? pParentNode
+          : NULL;
+  if (!pValueNode) {
+    pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value)
+                     ? pGrandNode
+                     : NULL;
+  }
+  CXFA_Node* pParentOfValueNode =
+      pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
+  return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData()
+                            : NULL;
+}
+FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) {
+  CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode();
+  CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
+  FXSYS_assert(pTopSubform);
+  CXFA_Node* pLocaleNode = this;
+  FX_BOOL bLocale = FALSE;
+  do {
+    bLocale = pLocaleNode->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
+    if (!bLocale) {
+      pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent);
+    }
+  } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale);
+  if (bLocale) {
+    return bLocale;
+  }
+  CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
+  wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig);
+  if (!wsLocaleName.IsEmpty()) {
+    bLocale = TRUE;
+  }
+  if (bLocale) {
+    return bLocale;
+  }
+  if (pTopSubform) {
+    bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
+  }
+  if (bLocale) {
+    return bLocale;
+  }
+  IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale();
+  if (pLocale) {
+    wsLocaleName = pLocale->GetName();
+    bLocale = TRUE;
+  }
+  return bLocale;
+}
+XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() {
+  XFA_ELEMENT eElement = GetClassID();
+  CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep);
+  XFA_ATTRIBUTEENUM eLayoutType = GetEnum(XFA_ATTRIBUTE_Layout);
+  if (pKeep) {
+    XFA_ATTRIBUTEENUM eIntact;
+    if (pKeep->TryEnum(XFA_ATTRIBUTE_Intact, eIntact, FALSE)) {
+      if (eIntact == XFA_ATTRIBUTEENUM_None &&
+          eLayoutType == XFA_ATTRIBUTEENUM_Row &&
+          m_pDocument->GetCurVersionMode() < XFA_VERSION_208) {
+        CXFA_Node* pPreviewRow =
+            GetNodeItem(XFA_NODEITEM_PrevSibling, XFA_OBJECTTYPE_ContainerNode);
+        if (pPreviewRow &&
+            pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) ==
+                XFA_ATTRIBUTEENUM_Row) {
+          XFA_ATTRIBUTEENUM eValue;
+          if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) {
+            if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
+                eValue == XFA_ATTRIBUTEENUM_PageArea) {
+              return XFA_ATTRIBUTEENUM_ContentArea;
+            }
+          }
+          CXFA_Node* pKeep =
+              pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep);
+          if (pKeep) {
+            if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) {
+              if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
+                  eValue == XFA_ATTRIBUTEENUM_PageArea) {
+                return XFA_ATTRIBUTEENUM_ContentArea;
+              }
+            }
+          }
+        }
+      }
+      return eIntact;
+    }
+  }
+  switch (eElement) {
+    case XFA_ELEMENT_Subform:
+      switch (eLayoutType) {
+        case XFA_ATTRIBUTEENUM_Position:
+        case XFA_ATTRIBUTEENUM_Row:
+          return XFA_ATTRIBUTEENUM_ContentArea;
+        case XFA_ATTRIBUTEENUM_Tb:
+        case XFA_ATTRIBUTEENUM_Table:
+        case XFA_ATTRIBUTEENUM_Lr_tb:
+        case XFA_ATTRIBUTEENUM_Rl_tb:
+          return XFA_ATTRIBUTEENUM_None;
+        default:
+          break;
+      }
+      break;
+    case XFA_ELEMENT_Field: {
+      CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+      if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+        return XFA_ATTRIBUTEENUM_ContentArea;
+      }
+      if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
+        XFA_ATTRIBUTEENUM eParLayout =
+            pParentNode->GetEnum(XFA_ATTRIBUTE_Layout);
+        if (eParLayout == XFA_ATTRIBUTEENUM_Position ||
+            eParLayout == XFA_ATTRIBUTEENUM_Row ||
+            eParLayout == XFA_ATTRIBUTEENUM_Table) {
+          return XFA_ATTRIBUTEENUM_None;
+        }
+        XFA_VERSION version = m_pDocument->GetCurVersionMode();
+        if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) {
+          CXFA_Measurement measureH;
+          if (TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) {
+            return XFA_ATTRIBUTEENUM_ContentArea;
+          }
+        }
+        return XFA_ATTRIBUTEENUM_None;
+      }
+      return XFA_ATTRIBUTEENUM_ContentArea;
+    }
+    case XFA_ELEMENT_Draw:
+      return XFA_ATTRIBUTEENUM_ContentArea;
+    default:
+      break;
+  }
+  return XFA_ATTRIBUTEENUM_None;
+}
+CXFA_Node* CXFA_Node::GetDataDescriptionNode() {
+  if (m_ePacket == XFA_XDPPACKET_Datasets) {
+    return m_pAuxNode;
+  }
+  return NULL;
+}
+void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
+  FXSYS_assert(m_ePacket == XFA_XDPPACKET_Datasets);
+  m_pAuxNode = pDataDescriptionNode;
+}
+void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNode");
+    return;
+  }
+  CFX_WideString wsExpression;
+  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+  wsExpression =
+      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  CXFA_Node* refNode = this;
+  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
+    refNode = ToNode(pScriptContext->GetThisObject());
+  }
+  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
+                    XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
+                    XFA_RESOLVENODE_Siblings;
+  XFA_RESOLVENODE_RS resoveNodeRS;
+  int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
+                                                resoveNodeRS, dwFlag);
+  if (iRet < 1) {
+    return FXJSE_Value_SetNull(pArguments->GetReturnValue());
+  }
+  FXJSE_HVALUE hValue = NULL;
+  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    CXFA_Object* pNode = resoveNodeRS.nodes[0];
+    hValue = pScriptContext->GetJSValueFromMap(pNode);
+    FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
+  } else {
+    const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
+        resoveNodeRS.pScriptAttribute;
+    if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) {
+      hValue = FXJSE_Value_Create(pScriptContext->GetRuntime());
+      (resoveNodeRS.nodes[0]->*(lpAttributeInfo->lpfnCallback))(
+          hValue, FALSE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
+      FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
+      FXJSE_Value_Release(hValue);
+    } else {
+      FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    }
+  }
+}
+void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"resolveNodes");
+    return;
+  }
+  CFX_WideString wsExpression;
+  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+  wsExpression =
+      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (!hValue) {
+    return;
+  }
+  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
+                    XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
+                    XFA_RESOLVENODE_Siblings;
+  CXFA_Node* refNode = this;
+  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
+    refNode = ToNode(m_pDocument->GetScriptContext()->GetThisObject());
+  }
+  Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag, refNode);
+}
+void CXFA_Node::Script_Som_ResolveNodeList(FXJSE_HVALUE hValue,
+                                           CFX_WideString wsExpression,
+                                           FX_DWORD dwFlag,
+                                           CXFA_Node* refNode) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  XFA_RESOLVENODE_RS resoveNodeRS;
+  if (refNode == NULL) {
+    refNode = this;
+  }
+  pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwFlag);
+  CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(m_pDocument);
+  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    for (int32_t i = 0; i < resoveNodeRS.nodes.GetSize(); i++) {
+      if (resoveNodeRS.nodes[i]->IsNode())
+        pNodeList->Append(resoveNodeRS.nodes[i]->AsNode());
+    }
+  } else {
+    CXFA_HVALUEArray hValueArray(pScriptContext->GetRuntime());
+    if (resoveNodeRS.GetAttributeResult(hValueArray) > 0) {
+      CXFA_ObjArray objectArray;
+      hValueArray.GetAttributeObject(objectArray);
+      for (int32_t i = 0; i < objectArray.GetSize(); i++) {
+        if (objectArray[i]->IsNode())
+          pNodeList->Append(objectArray[i]->AsNode());
+      }
+    }
+  }
+  FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
+                        pScriptContext->GetJseNormalClass());
+}
+void CXFA_Node::Script_TreeClass_All(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
+    CFX_WideString wsName;
+    GetAttribute(XFA_ATTRIBUTE_Name, wsName);
+    CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]");
+    Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
+  }
+}
+void CXFA_Node::Script_TreeClass_Nodes(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  if (bSetting) {
+    IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
+    FXSYS_assert(pAppProvider);
+    CFX_WideString wsMessage;
+    pAppProvider->LoadString(XFA_IDS_Unable_TO_SET, wsMessage);
+    FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
+  } else {
+    CXFA_AttachNodeList* pNodeList = new CXFA_AttachNodeList(m_pDocument, this);
+    FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
+                          pScriptContext->GetJseNormalClass());
+  }
+}
+void CXFA_Node::Script_TreeClass_ClassAll(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
+    CFX_WideStringC wsName;
+    GetClassName(wsName);
+    CFX_WideString wsExpression = FX_WSTRC(L"#") + wsName + FX_WSTRC(L"[*]");
+    Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
+  }
+}
+void CXFA_Node::Script_TreeClass_Parent(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
+    if (pParent) {
+      FXJSE_Value_Set(
+          hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent));
+    } else {
+      FXJSE_Value_SetNull(hValue);
+    }
+  }
+}
+void CXFA_Node::Script_TreeClass_Index(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FXJSE_Value_SetInteger(hValue, GetNodeSameNameIndex());
+  }
+}
+void CXFA_Node::Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FXJSE_Value_SetInteger(hValue, GetNodeSameClassIndex());
+  }
+}
+void CXFA_Node::Script_TreeClass_SomExpression(FXJSE_HVALUE hValue,
+                                               FX_BOOL bSetting,
+                                               XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    CFX_WideString wsSOMExpression;
+    GetSOMExpression(wsSOMExpression);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsSOMExpression));
+  }
+}
+void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"applyXSL");
+    return;
+  }
+  CFX_WideString wsExpression;
+  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+  wsExpression =
+      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+}
+void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 3) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"assignNode");
+    return;
+  }
+  CFX_WideString wsExpression;
+  CFX_WideString wsValue;
+  int32_t iAction = 0;
+  if (iLength >= 1) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsValue = pArguments->GetUTF8String(1);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+  }
+  if (iLength >= 3) {
+    iAction = pArguments->GetInt32(2);
+  }
+}
+void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone");
+    return;
+  }
+  FX_BOOL bClone = TRUE;
+  bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
+  CXFA_Node* pCloneNode = Clone(bClone);
+  FXJSE_Value_Set(
+      pArguments->GetReturnValue(),
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode));
+}
+void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"getAttribute");
+    return;
+  }
+  CFX_WideString wsExpression;
+  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+  wsExpression =
+      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  CFX_WideString wsValue;
+  GetAttribute(wsExpression, wsValue);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+  }
+}
+void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getElement");
+    return;
+  }
+  CFX_WideString wsExpression;
+  int32_t iValue = 0;
+  if (iLength >= 1) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  }
+  if (iLength >= 2) {
+    iValue = pArguments->GetInt32(1);
+  }
+  const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression);
+  CXFA_Node* pNode = GetProperty(iValue, pElementInfo->eName);
+  FXJSE_Value_Set(pArguments->GetReturnValue(),
+                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
+}
+void CXFA_Node::Script_NodeClass_IsPropertySpecified(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 3) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"isPropertySpecified");
+    return;
+  }
+  CFX_WideString wsExpression;
+  FX_BOOL bParent = TRUE;
+  int32_t iIndex = 0;
+  if (iLength >= 1) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  }
+  if (iLength >= 2) {
+    bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
+  }
+  if (iLength >= 3) {
+    iIndex = pArguments->GetInt32(2);
+  }
+  FX_BOOL bHas = FALSE;
+  const XFA_ATTRIBUTEINFO* pAttributeInfo =
+      XFA_GetAttributeByName(wsExpression);
+  CFX_WideString wsValue;
+  if (pAttributeInfo) {
+    bHas = HasAttribute(pAttributeInfo->eName);
+  }
+  if (!bHas) {
+    const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression);
+    bHas = (GetProperty(iIndex, pElementInfo->eName) != NULL);
+  }
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, bHas);
+  }
+}
+void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 3) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"loadXML");
+    return;
+  }
+  CFX_WideString wsExpression;
+  FX_BOOL bIgnoreRoot = TRUE;
+  FX_BOOL bOverwrite = 0;
+  if (iLength >= 1) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+    if (wsExpression.IsEmpty()) {
+      return;
+    }
+  }
+  if (iLength >= 2) {
+    bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
+  }
+  if (iLength >= 3) {
+    bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
+  }
+  IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument);
+  if (!pParser) {
+    return;
+  }
+  IFDE_XMLNode* pXMLNode = NULL;
+  int32_t iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL);
+  if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) {
+    pParser->Release();
+    pParser = NULL;
+    return;
+  }
+  if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element ||
+                      XFA_RecognizeRichText((IFDE_XMLElement*)pXMLNode))) {
+    bIgnoreRoot = FALSE;
+  }
+  CXFA_Node* pFakeRoot = Clone(FALSE);
+  CFX_WideStringC wsContentType = GetCData(XFA_ATTRIBUTE_ContentType);
+  if (!wsContentType.IsEmpty()) {
+    pFakeRoot->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+  }
+  IFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode();
+  if (!pFakeXMLRoot) {
+    IFDE_XMLNode* pThisXMLRoot = GetXMLMappingNode();
+    pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL;
+  }
+  if (!pFakeXMLRoot) {
+    CFX_WideStringC wsClassName;
+    GetClassName(wsClassName);
+    pFakeXMLRoot = IFDE_XMLElement::Create(wsClassName);
+  }
+  if (bIgnoreRoot) {
+    IFDE_XMLNode* pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+    while (pXMLChild) {
+      IFDE_XMLNode* pXMLSibling =
+          pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling);
+      pXMLNode->RemoveChildNode(pXMLChild);
+      pFakeXMLRoot->InsertChildNode(pXMLChild);
+      pXMLChild = pXMLSibling;
+    }
+  } else {
+    IFDE_XMLNode* pXMLParent = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
+    if (pXMLParent) {
+      pXMLParent->RemoveChildNode(pXMLNode);
+    }
+    pFakeXMLRoot->InsertChildNode(pXMLNode);
+  }
+  pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot);
+  pFakeRoot = pParser->GetRootNode();
+  if (pFakeRoot) {
+    if (bOverwrite) {
+      CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild);
+      CXFA_Node* pNewChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+      int32_t index = 0;
+      while (pNewChild) {
+        CXFA_Node* pItem = pNewChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+        pFakeRoot->RemoveChild(pNewChild);
+        InsertChild(index++, pNewChild);
+        pNewChild->SetFlag(XFA_NODEFLAG_Initialized);
+        pNewChild = pItem;
+      }
+      while (pChild) {
+        CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+        RemoveChild(pChild);
+        pFakeRoot->InsertChild(pChild);
+        pChild = pItem;
+      }
+      if (GetPacketID() == XFA_XDPPACKET_Form &&
+          GetClassID() == XFA_ELEMENT_ExData) {
+        IFDE_XMLNode* pTempXMLNode = GetXMLMappingNode();
+        SetXMLMappingNode(pFakeXMLRoot);
+        SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+        if (pTempXMLNode &&
+            pTempXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL) {
+          pFakeXMLRoot = pTempXMLNode;
+        } else {
+          pFakeXMLRoot = NULL;
+        }
+      }
+      MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE);
+    } else {
+      CXFA_Node* pChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+      while (pChild) {
+        CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+        pFakeRoot->RemoveChild(pChild);
+        InsertChild(pChild);
+        pChild->SetFlag(XFA_NODEFLAG_Initialized);
+        pChild = pItem;
+      }
+    }
+    if (pFakeXMLRoot) {
+      pFakeRoot->SetXMLMappingNode(pFakeXMLRoot);
+      pFakeRoot->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+    }
+    pFakeRoot->SetFlag(XFA_NODEFLAG_HasRemoved, TRUE, FALSE);
+  } else {
+    if (pFakeXMLRoot) {
+      pFakeXMLRoot->Release();
+      pFakeXMLRoot = NULL;
+    }
+  }
+  pParser->Release();
+  pParser = NULL;
+}
+void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) {
+}
+
+void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 0 || iLength > 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML");
+    return;
+  }
+  FX_BOOL bPrettyMode = FALSE;
+  if (iLength == 1) {
+    CFX_ByteString bsPretty = pArguments->GetUTF8String(0);
+    if (!bsPretty.Equal("pretty")) {
+      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+      return;
+    }
+    bPrettyMode = TRUE;
+  }
+  CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  if (GetPacketID() == XFA_XDPPACKET_Form) {
+    IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
+    IFX_Stream* pStream = IFX_Stream::CreateStream(
+        (IFX_FileWrite*)pMemoryStream,
+        FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
+    if (!pStream) {
+      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
+      pMemoryStream->Release();
+      pMemoryStream = NULL;
+      return;
+    }
+    pStream->SetCodePage(FX_CODEPAGE_UTF8);
+    pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
+    XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE);
+    FXJSE_Value_SetUTF8String(
+        pArguments->GetReturnValue(),
+        CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize()));
+    pStream->Release();
+    pStream = NULL;
+    if (pMemoryStream) {
+      pMemoryStream->Release();
+      pMemoryStream = NULL;
+    }
+    return;
+  }
+  if (GetPacketID() == XFA_XDPPACKET_Datasets) {
+    IFDE_XMLNode* pElement = GetXMLMappingNode();
+    if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
+      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
+      return;
+    }
+    XFA_DataExporter_DealWithDataGroupNode(this);
+    IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
+    IFX_Stream* pStream = IFX_Stream::CreateStream(
+        (IFX_FileWrite*)pMemoryStream,
+        FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
+    if (pStream) {
+      pStream->SetCodePage(FX_CODEPAGE_UTF8);
+      pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
+      pElement->SaveXMLNode(pStream);
+      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
+                                CFX_ByteStringC(pMemoryStream->GetBuffer(),
+                                                pMemoryStream->GetSize()));
+      pStream->Release();
+      pStream = NULL;
+    }
+    if (pMemoryStream) {
+      pMemoryStream->Release();
+      pMemoryStream = NULL;
+    }
+    return;
+  }
+  FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
+}
+
+void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"setAttribute");
+    return;
+  }
+  CFX_WideString wsAttribute;
+  CFX_WideString wsAttributeValue;
+  CFX_ByteString bsAttributeValue = pArguments->GetUTF8String(0);
+  CFX_ByteString bsAttribute = pArguments->GetUTF8String(1);
+  wsAttributeValue =
+      CFX_WideString::FromUTF8(bsAttributeValue, bsAttributeValue.GetLength());
+  wsAttribute = CFX_WideString::FromUTF8(bsAttribute, bsAttribute.GetLength());
+  SetAttribute(wsAttribute, wsAttributeValue, TRUE);
+}
+void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1 && iLength != 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setElement");
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  CFX_WideString wsName;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsName = pArguments->GetUTF8String(1);
+    wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
+  }
+}
+void CXFA_Node::Script_NodeClass_Ns(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    CFX_WideString wsNameSpace;
+    TryNamespace(wsNameSpace);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsNameSpace));
+  }
+}
+void CXFA_Node::Script_NodeClass_Model(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(
+                                GetModelNode()));
+  }
+}
+void CXFA_Node::Script_NodeClass_IsContainer(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FXJSE_Value_SetBoolean(hValue, IsContainerNode());
+  }
+}
+void CXFA_Node::Script_NodeClass_IsNull(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    if (GetClassID() == XFA_ELEMENT_Subform) {
+      FXJSE_Value_SetBoolean(hValue, FALSE);
+      return;
+    }
+    CFX_WideString strValue;
+    FXJSE_Value_SetBoolean(hValue, !TryContent(strValue) || strValue.IsEmpty());
+  }
+}
+void CXFA_Node::Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    CXFA_NodeArray properts;
+    int32_t iSize = GetNodeList(properts, XFA_NODEFILTER_OneOfProperty);
+    if (iSize > 0) {
+      FXJSE_Value_Set(
+          hValue,
+          m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0]));
+    }
+  }
+}
+void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {}
+void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) {
+  CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
+  FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
+                        m_pDocument->GetScriptContext()->GetJseNormalClass());
+}
+void CXFA_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) {
+}
+void CXFA_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) {
+  Script_Template_CreateNode(pArguments);
+}
+void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"isCompatibleNS");
+    return;
+  }
+  CFX_WideString wsNameSpace;
+  if (iLength >= 1) {
+    CFX_ByteString bsNameSpace = pArguments->GetUTF8String(0);
+    wsNameSpace =
+        CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
+  }
+  CFX_WideString wsNodeNameSpace;
+  TryNamespace(wsNodeNameSpace);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, wsNodeNameSpace.Equal(wsNameSpace));
+  }
+}
+void CXFA_Node::Script_ModelClass_Context(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_ModelClass_AliasNode(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Attribute_Integer(FXJSE_HVALUE hValue,
+                                         FX_BOOL bSetting,
+                                         XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    SetInteger(eAttribute, FXJSE_Value_ToInteger(hValue), TRUE);
+  } else {
+    FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
+  }
+}
+void CXFA_Node::Script_Attribute_IntegerRead(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_Attribute_BOOL(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    SetBoolean(eAttribute, FXJSE_Value_ToBoolean(hValue), TRUE);
+  } else {
+    FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
+  }
+}
+void CXFA_Node::Script_Attribute_BOOLRead(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_Attribute_SendAttributeChangeMessage(
+    void* eAttribute,
+    void* eValue,
+    FX_BOOL bScriptModify) {
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (!pLayoutPro) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  FX_DWORD dwPacket = GetPacketID();
+  if (dwPacket & XFA_XDPPACKET_Form) {
+    FX_BOOL bNeedFindContainer = FALSE;
+    XFA_ELEMENT eType = GetClassID();
+    switch (eType) {
+      case XFA_ELEMENT_Caption:
+        bNeedFindContainer = TRUE;
+        pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                             eValue, this, GetNodeItem(XFA_NODEITEM_Parent));
+        break;
+      case XFA_ELEMENT_Font:
+      case XFA_ELEMENT_Para: {
+        bNeedFindContainer = TRUE;
+        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+        if (pParentNode->GetClassID() == XFA_ELEMENT_Caption) {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, pParentNode,
+                               pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
+        } else {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, this, pParentNode);
+        }
+      } break;
+      case XFA_ELEMENT_Margin: {
+        bNeedFindContainer = TRUE;
+        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+        XFA_ELEMENT eParentType = pParentNode->GetClassID();
+        if (pParentNode->IsContainerNode()) {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, this, pParentNode);
+        } else if (eParentType == XFA_ELEMENT_Caption) {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, pParentNode,
+                               pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
+        } else {
+          CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
+          if (pNode && pNode->GetClassID() == XFA_ELEMENT_Ui) {
+            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                                 eValue, pNode,
+                                 pNode->GetNodeItem(XFA_NODEITEM_Parent));
+          }
+        }
+      } break;
+      case XFA_ELEMENT_Comb: {
+        CXFA_Node* pEditNode = GetNodeItem(XFA_NODEITEM_Parent);
+        XFA_ELEMENT eUIType = pEditNode->GetClassID();
+        if (pEditNode && (eUIType == XFA_ELEMENT_DateTimeEdit ||
+                          eUIType == XFA_ELEMENT_NumericEdit ||
+                          eUIType == XFA_ELEMENT_TextEdit)) {
+          CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent);
+          if (pUINode) {
+            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                                 eValue, pUINode,
+                                 pUINode->GetNodeItem(XFA_NODEITEM_Parent));
+          }
+        }
+      } break;
+      case XFA_ELEMENT_Button:
+      case XFA_ELEMENT_Barcode:
+      case XFA_ELEMENT_ChoiceList:
+      case XFA_ELEMENT_DateTimeEdit:
+      case XFA_ELEMENT_NumericEdit:
+      case XFA_ELEMENT_PasswordEdit:
+      case XFA_ELEMENT_TextEdit: {
+        CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent);
+        if (pUINode) {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, pUINode,
+                               pUINode->GetNodeItem(XFA_NODEITEM_Parent));
+        }
+      } break;
+      case XFA_ELEMENT_CheckButton: {
+        bNeedFindContainer = TRUE;
+        CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent);
+        if (pUINode) {
+          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                               eValue, pUINode,
+                               pUINode->GetNodeItem(XFA_NODEITEM_Parent));
+        }
+      } break;
+      case XFA_ELEMENT_Keep:
+      case XFA_ELEMENT_Bookend:
+      case XFA_ELEMENT_Break:
+      case XFA_ELEMENT_BreakAfter:
+      case XFA_ELEMENT_BreakBefore:
+      case XFA_ELEMENT_Overflow:
+        bNeedFindContainer = TRUE;
+        break;
+      case XFA_ELEMENT_Area:
+      case XFA_ELEMENT_Draw:
+      case XFA_ELEMENT_ExclGroup:
+      case XFA_ELEMENT_Field:
+      case XFA_ELEMENT_Subform:
+      case XFA_ELEMENT_SubformSet:
+        pLayoutPro->AddChangedContainer(this);
+        pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                             eValue, this, this);
+        break;
+      case XFA_ELEMENT_Sharptext:
+      case XFA_ELEMENT_Sharpxml:
+      case XFA_ELEMENT_SharpxHTML: {
+        CXFA_Node* pTextNode = GetNodeItem(XFA_NODEITEM_Parent);
+        if (!pTextNode) {
+          return;
+        }
+        CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent);
+        if (!pValueNode) {
+          return;
+        }
+        XFA_ELEMENT eType = pValueNode->GetClassID();
+        if (eType == XFA_ELEMENT_Value) {
+          bNeedFindContainer = TRUE;
+          CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
+          if (pNode && pNode->IsContainerNode()) {
+            if (bScriptModify) {
+              pValueNode = pNode;
+            }
+            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                                 eValue, pValueNode, pNode);
+          } else {
+            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                                 eValue, pNode,
+                                 pNode->GetNodeItem(XFA_NODEITEM_Parent));
+          }
+        } else {
+          if (eType == XFA_ELEMENT_Items) {
+            CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
+            if (pNode && pNode->IsContainerNode()) {
+              pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
+                                   eValue, pValueNode, pNode);
+            }
+          }
+        }
+      } break;
+      default:
+        break;
+    }
+    if (bNeedFindContainer) {
+      CXFA_Node* pParent = this;
+      while (pParent) {
+        if (pParent->IsContainerNode()) {
+          break;
+        }
+        pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
+      }
+      if (pParent) {
+        pLayoutPro->AddChangedContainer(pParent);
+      }
+    }
+  } else {
+    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue,
+                         this, this);
+  }
+}
+void CXFA_Node::Script_Attribute_String(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    CFX_ByteString szValue;
+    FXJSE_Value_ToUTF8String(hValue, szValue);
+    CFX_WideString wsValue =
+        CFX_WideString::FromUTF8(szValue, szValue.GetLength());
+    SetAttribute(eAttribute, wsValue, TRUE);
+    if (eAttribute == XFA_ATTRIBUTE_Use && GetClassID() == XFA_ELEMENT_Desc) {
+      CFX_WideString wsUseVal = wsValue, wsID, wsSOM;
+      CXFA_Node* pTemplateNode =
+          ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
+      CXFA_Node* pProtoRoot =
+          pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Subform)
+              ->GetFirstChildByClass(XFA_ELEMENT_Proto);
+      if (!wsUseVal.IsEmpty()) {
+        if (wsUseVal[0] == '#') {
+          wsID = CFX_WideString((const FX_WCHAR*)wsUseVal + 1,
+                                wsUseVal.GetLength() - 1);
+        } else {
+          wsSOM =
+              CFX_WideString((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength());
+        }
+      }
+      CXFA_Node* pProtoNode = NULL;
+      if (!wsSOM.IsEmpty()) {
+        FX_DWORD dwFlag = XFA_RESOLVENODE_Children |
+                          XFA_RESOLVENODE_Attributes |
+                          XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
+                          XFA_RESOLVENODE_Siblings;
+        XFA_RESOLVENODE_RS resoveNodeRS;
+        int32_t iRet = m_pDocument->GetScriptContext()->ResolveObjects(
+            pProtoRoot, wsSOM, resoveNodeRS, dwFlag);
+        if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) {
+          pProtoNode = resoveNodeRS.nodes[0]->AsNode();
+        }
+      } else if (!wsID.IsEmpty()) {
+        pProtoNode = m_pDocument->GetNodeByID(pProtoRoot, wsID);
+      }
+      if (pProtoNode) {
+        CXFA_Node* pHeadChild = GetNodeItem(XFA_NODEITEM_FirstChild);
+        while (pHeadChild) {
+          CXFA_Node* pSibling =
+              pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+          RemoveChild(pHeadChild);
+          pHeadChild = pSibling;
+        }
+        CXFA_Node* pProtoForm = pProtoNode->CloneTemplateToForm(TRUE);
+        pHeadChild = pProtoForm->GetNodeItem(XFA_NODEITEM_FirstChild);
+        while (pHeadChild) {
+          CXFA_Node* pSibling =
+              pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+          pProtoForm->RemoveChild(pHeadChild);
+          InsertChild(pHeadChild);
+          pHeadChild = pSibling;
+        }
+        m_pDocument->RemovePurgeNode(pProtoForm);
+        delete pProtoForm;
+      }
+    }
+  } else {
+    CFX_WideString wsValue;
+    GetAttribute(eAttribute, wsValue);
+    FXJSE_Value_SetUTF8String(hValue,
+                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
+  }
+}
+void CXFA_Node::Script_Attribute_StringRead(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    CFX_WideString wsValue;
+    GetAttribute(eAttribute, wsValue);
+    FXJSE_Value_SetUTF8String(hValue,
+                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc == 0) || (argc == 1)) {
+    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execute");
+  }
+}
+void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"restore");
+  }
+}
+void CXFA_Node::Script_Delta_CurrentValue(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Delta_SavedValue(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Delta_Target(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Som_Message(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_SOM_MESSAGETYPE iMessageType) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  FX_BOOL bNew = FALSE;
+  CXFA_Validate validate = pWidgetData->GetValidate();
+  if (!validate) {
+    validate = pWidgetData->GetValidate(TRUE);
+    bNew = TRUE;
+  }
+  if (bSetting) {
+    CFX_ByteString bsMessage;
+    FXJSE_Value_ToUTF8String(hValue, bsMessage);
+    switch (iMessageType) {
+      case XFA_SOM_ValidationMessage:
+        validate.SetScriptMessageText(
+            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
+        break;
+      case XFA_SOM_FormatMessage:
+        validate.SetFormatMessageText(
+            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
+        break;
+      case XFA_SOM_MandatoryMessage:
+        validate.SetNullMessageText(
+            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
+        break;
+      default:
+        break;
+    }
+    if (!bNew) {
+      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+      if (!pNotify) {
+        return;
+      }
+      pNotify->AddCalcValidate(this);
+    }
+  } else {
+    CFX_WideString wsMessage;
+    switch (iMessageType) {
+      case XFA_SOM_ValidationMessage:
+        validate.GetScriptMessageText(wsMessage);
+        break;
+      case XFA_SOM_FormatMessage:
+        validate.GetFormatMessageText(wsMessage);
+        break;
+      case XFA_SOM_MandatoryMessage:
+        validate.GetNullMessageText(wsMessage);
+        break;
+      default:
+        break;
+    }
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsMessage));
+  }
+}
+void CXFA_Node::Script_Som_ValidationMessage(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute) {
+  Script_Som_Message(hValue, bSetting, XFA_SOM_ValidationMessage);
+}
+void CXFA_Node::Script_Field_Length(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetInteger(hValue, 0);
+      return;
+    }
+    FXJSE_Value_SetInteger(hValue, pWidgetData->CountChoiceListItems(TRUE));
+  }
+}
+void CXFA_Node::Script_Som_DefaultValue(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {
+  XFA_ELEMENT classID = GetClassID();
+  if (classID == XFA_ELEMENT_Field) {
+    Script_Field_DefaultValue(hValue, bSetting, eAttribute);
+    return;
+  } else if (classID == XFA_ELEMENT_Draw) {
+    Script_Draw_DefaultValue(hValue, bSetting, eAttribute);
+    return;
+  } else if (classID == XFA_ELEMENT_Boolean) {
+    Script_Boolean_Value(hValue, bSetting, eAttribute);
+    return;
+  }
+  if (bSetting) {
+    CFX_ByteString newValue;
+    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
+      FXJSE_Value_ToUTF8String(hValue, newValue);
+    }
+    CFX_WideString wsNewValue =
+        CFX_WideString::FromUTF8(newValue, newValue.GetLength());
+    CFX_WideString wsFormatValue(wsNewValue);
+    CXFA_WidgetData* pContainerWidgetData = NULL;
+    if (GetPacketID() == XFA_XDPPACKET_Datasets) {
+      CXFA_NodeArray formNodes;
+      GetBindItems(formNodes);
+      CFX_WideString wsPicture;
+      for (int32_t i = 0; i < formNodes.GetSize(); i++) {
+        CXFA_Node* pFormNode = formNodes.GetAt(i);
+        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+          continue;
+        }
+        pContainerWidgetData = pFormNode->GetContainerWidgetData();
+        if (pContainerWidgetData) {
+          pContainerWidgetData->GetPictureContent(wsPicture,
+                                                  XFA_VALUEPICTURE_DataBind);
+        }
+        if (!wsPicture.IsEmpty()) {
+          break;
+        }
+        pContainerWidgetData = NULL;
+      }
+    } else if (GetPacketID() == XFA_XDPPACKET_Form) {
+      pContainerWidgetData = GetContainerWidgetData();
+    }
+    if (pContainerWidgetData) {
+      pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
+    }
+    SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
+  } else {
+    CFX_WideString content = GetScriptContent(TRUE);
+    if (content.IsEmpty() && classID != XFA_ELEMENT_Text &&
+        classID != XFA_ELEMENT_SubmitUrl) {
+      FXJSE_Value_SetNull(hValue);
+    } else if (classID == XFA_ELEMENT_Integer) {
+      FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
+    } else if (classID == XFA_ELEMENT_Float || classID == XFA_ELEMENT_Decimal) {
+      CFX_Decimal decimal(content);
+      FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
+    } else {
+      FXJSE_Value_SetUTF8String(hValue,
+                                FX_UTF8Encode(content, content.GetLength()));
+    }
+  }
+}
+void CXFA_Node::Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CFX_WideString content = GetScriptContent(TRUE);
+  if (content.IsEmpty()) {
+    FXJSE_Value_SetNull(hValue);
+  } else {
+    FXJSE_Value_SetUTF8String(hValue,
+                              FX_UTF8Encode(content, content.GetLength()));
+  }
+}
+void CXFA_Node::Script_Boolean_Value(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    CFX_ByteString newValue;
+    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
+      FXJSE_Value_ToUTF8String(hValue, newValue);
+    }
+    int32_t iValue = FXSYS_atoi(newValue);
+    CFX_WideString wsNewValue = (iValue == 0) ? FX_WSTRC(L"0") : FX_WSTRC(L"1");
+    CFX_WideString wsFormatValue(wsNewValue);
+    CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
+    if (pContainerWidgetData) {
+      pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
+    }
+    SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
+  } else {
+    CFX_WideString wsValue = GetScriptContent(TRUE);
+    FXJSE_Value_SetBoolean(hValue, wsValue.Equal(FX_WSTRC(L"1")));
+  }
+}
+struct XFA_ExecEventParaInfo {
+ public:
+  uint32_t m_uHash;
+  const FX_WCHAR* m_lpcEventName;
+  XFA_EVENTTYPE m_eventType;
+  uint32_t m_validFlags;
+};
+static const XFA_ExecEventParaInfo gs_eventParaInfos[] = {
+    {0x02a6c55a, L"postSubmit", XFA_EVENT_PostSubmit, 0},
+    {0x0ab466bb, L"preSubmit", XFA_EVENT_PreSubmit, 0},
+    {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, 5},
+    {0x17fad373, L"postPrint", XFA_EVENT_PostPrint, 0},
+    {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, 7},
+    {0x2196a452, L"initialize", XFA_EVENT_Initialize, 1},
+    {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, 5},
+    {0x33c43dec, L"docClose", XFA_EVENT_DocClose, 0},
+    {0x361fa1b6, L"preSave", XFA_EVENT_PreSave, 0},
+    {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, 6},
+    {0x4731d6ba, L"exit", XFA_EVENT_Exit, 2},
+    {0x56bf456b, L"docReady", XFA_EVENT_DocReady, 0},
+    {0x7233018a, L"validate", XFA_EVENT_Validate, 1},
+    {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, 3},
+    {0x891f4606, L"change", XFA_EVENT_Change, 4},
+    {0x9528a7b4, L"prePrint", XFA_EVENT_PrePrint, 0},
+    {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, 5},
+    {0xcdce56b3, L"full", XFA_EVENT_Full, 4},
+    {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, 5},
+    {0xd95657a6, L"click", XFA_EVENT_Click, 4},
+    {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, 1},
+    {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, 7},
+    {0xe28dce7e, L"enter", XFA_EVENT_Enter, 2},
+    {0xfc82d695, L"postSave", XFA_EVENT_PostSave, 0},
+    {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, 6},
+};
+const XFA_ExecEventParaInfo* GetEventParaInfoByName(
+    const CFX_WideStringC& wsEventName) {
+  int32_t iLength = wsEventName.GetLength();
+  uint32_t uHash = FX_HashCode_String_GetW(wsEventName.GetPtr(), iLength);
+  const XFA_ExecEventParaInfo* eventParaInfo = NULL;
+  int32_t iStart = 0,
+          iEnd = (sizeof(gs_eventParaInfos) / sizeof(gs_eventParaInfos[0])) - 1;
+  int32_t iMid = (iStart + iEnd) / 2;
+  do {
+    iMid = (iStart + iEnd) / 2;
+    eventParaInfo = &gs_eventParaInfos[iMid];
+    if (uHash == eventParaInfo->m_uHash) {
+      return eventParaInfo;
+    } else if (uHash < eventParaInfo->m_uHash) {
+      iEnd = iMid - 1;
+    } else {
+      iStart = iMid + 1;
+    }
+  } while (iStart <= iEnd);
+  return NULL;
+}
+void XFA_STRING_TO_RGB(CFX_WideString& strRGB,
+                       int32_t& r,
+                       int32_t& g,
+                       int32_t& b) {
+  r = 0;
+  g = 0;
+  b = 0;
+  FX_WCHAR zero = '0';
+  int32_t iIndex = 0;
+  int32_t iLen = strRGB.GetLength();
+  for (int32_t i = 0; i < iLen; ++i) {
+    FX_WCHAR ch = strRGB.GetAt(i);
+    if (ch == L',') {
+      ++iIndex;
+    }
+    if (iIndex > 2) {
+      break;
+    }
+    int32_t iValue = ch - zero;
+    if (iValue >= 0 && iValue <= 9) {
+      switch (iIndex) {
+        case 0:
+          r = r * 10 + iValue;
+          break;
+        case 1:
+          g = g * 10 + iValue;
+          break;
+        default:
+          b = b * 10 + iValue;
+          break;
+      }
+    }
+  }
+}
+void CXFA_Node::Script_Som_BorderColor(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CXFA_Border border = pWidgetData->GetBorder(TRUE);
+  int32_t iSize = border.CountEdges();
+  CFX_WideString strColor;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    strColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    int32_t r = 0, g = 0, b = 0;
+    XFA_STRING_TO_RGB(strColor, r, g, b);
+    FX_ARGB rgb = ArgbEncode(100, r, g, b);
+    for (int32_t i = 0; i < iSize; ++i) {
+      CXFA_Edge edge = border.GetEdge(i);
+      edge.SetColor(rgb);
+    }
+  } else {
+    CXFA_Edge edge = border.GetEdge(0);
+    FX_ARGB color = edge.GetColor();
+    int32_t a, r, g, b;
+    ArgbDecode(color, a, r, g, b);
+    strColor.Format(L"%d,%d,%d", r, g, b);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(strColor));
+  }
+}
+void CXFA_Node::Script_Som_BorderWidth(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CXFA_Border border = pWidgetData->GetBorder(TRUE);
+  int32_t iSize = border.CountEdges();
+  CFX_WideString wsThickness;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsThickness = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    for (int32_t i = 0; i < iSize; ++i) {
+      CXFA_Edge edge = border.GetEdge(i);
+      CXFA_Measurement thickness(wsThickness);
+      edge.SetMSThickness(thickness);
+    }
+  } else {
+    CXFA_Edge edge = border.GetEdge(0);
+    CXFA_Measurement thickness = edge.GetMSThickness();
+    thickness.ToString(wsThickness);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsThickness));
+  }
+}
+void CXFA_Node::Script_Som_FillColor(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CXFA_Border border = pWidgetData->GetBorder(TRUE);
+  CXFA_Fill borderfill = border.GetFill(TRUE);
+  CXFA_Node* pNode = borderfill.GetNode();
+  if (!pNode) {
+    return;
+  }
+  CFX_WideString wsColor;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    int32_t r, g, b;
+    XFA_STRING_TO_RGB(wsColor, r, g, b);
+    FX_ARGB color = ArgbEncode(0xff, r, g, b);
+    borderfill.SetColor(color);
+  } else {
+    FX_ARGB color = borderfill.GetColor();
+    int32_t a, r, g, b;
+    ArgbDecode(color, a, r, g, b);
+    wsColor.Format(L"%d,%d,%d", r, g, b);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
+  }
+}
+void CXFA_Node::Script_Som_DataNode(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    CXFA_Node* pDataNode = GetBindData();
+    if (pDataNode) {
+      FXJSE_Value_Set(
+          hValue,
+          m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode));
+    } else {
+      FXJSE_Value_SetNull(hValue);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_Draw_DefaultValue(FXJSE_HVALUE hValue,
+                                         FX_BOOL bSetting,
+                                         XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    if (FXJSE_Value_IsUTF8String(hValue)) {
+      CXFA_WidgetData* pWidgetData = GetWidgetData();
+      FXSYS_assert(pWidgetData);
+      XFA_ELEMENT uiType = pWidgetData->GetUIType();
+      if (uiType == XFA_ELEMENT_Text) {
+        CFX_ByteString newValue;
+        FXJSE_Value_ToUTF8String(hValue, newValue);
+        CFX_WideString wsNewValue =
+            CFX_WideString::FromUTF8(newValue, newValue.GetLength());
+        CFX_WideString wsFormatValue(wsNewValue);
+        SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
+      } else if (uiType != XFA_ELEMENT_Image) {
+      }
+    }
+  } else {
+    CFX_WideString content = GetScriptContent(TRUE);
+    if (content.IsEmpty()) {
+      FXJSE_Value_SetNull(hValue);
+    } else {
+      FXJSE_Value_SetUTF8String(hValue,
+                                FX_UTF8Encode(content, content.GetLength()));
+    }
+  }
+}
+void CXFA_Node::Script_Field_DefaultValue(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  if (bSetting) {
+    if (FXJSE_Value_IsNull(hValue)) {
+      pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
+      pWidgetData->m_bIsNull = TRUE;
+    } else {
+      pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
+      pWidgetData->m_bIsNull = FALSE;
+    }
+    CFX_ByteString newValue;
+    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
+      FXJSE_Value_ToUTF8String(hValue, newValue);
+    }
+    CFX_WideString wsNewText =
+        CFX_WideString::FromUTF8(newValue, newValue.GetLength());
+    CXFA_Node* pUIChild = pWidgetData->GetUIChild();
+    if (pUIChild->GetClassID() == XFA_ELEMENT_NumericEdit) {
+      int32_t iLeadDigits = 0;
+      int32_t iFracDigits = 0;
+      pWidgetData->GetLeadDigits(iLeadDigits);
+      pWidgetData->GetFracDigits(iFracDigits);
+      wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+    }
+    CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
+    CFX_WideString wsFormatText(wsNewText);
+    if (pContainerWidgetData) {
+      pContainerWidgetData->GetFormatDataValue(wsNewText, wsFormatText);
+    }
+    SetScriptContent(wsNewText, wsFormatText, TRUE, TRUE);
+  } else {
+    CFX_WideString content = GetScriptContent(TRUE);
+    if (content.IsEmpty()) {
+      FXJSE_Value_SetNull(hValue);
+    } else {
+      CXFA_Node* pUIChild = pWidgetData->GetUIChild();
+      XFA_ELEMENT eUI = pUIChild->GetClassID();
+      CXFA_Value defVal = pWidgetData->GetFormValue();
+      CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (pNode && pNode->GetClassID() == XFA_ELEMENT_Decimal) {
+        if (eUI == XFA_ELEMENT_NumericEdit &&
+            (pNode->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) {
+          FXJSE_Value_SetUTF8String(
+              hValue, FX_UTF8Encode(content, content.GetLength()));
+        } else {
+          CFX_Decimal decimal(content);
+          FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
+        }
+      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Integer) {
+        FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
+      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Boolean) {
+        FXJSE_Value_SetBoolean(hValue, FXSYS_wtoi(content) == 0 ? FALSE : TRUE);
+      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Float) {
+        CFX_Decimal decimal(content);
+        FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
+      } else {
+        FXJSE_Value_SetUTF8String(hValue,
+                                  FX_UTF8Encode(content, content.GetLength()));
+      }
+    }
+  }
+}
+void CXFA_Node::Script_Field_EditValue(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CFX_WideString wsValue;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Edit);
+  } else {
+    pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Edit);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+  }
+}
+void CXFA_Node::Script_Som_FontColor(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CXFA_Font font = pWidgetData->GetFont(TRUE);
+  CXFA_Node* pNode = font.GetNode();
+  if (!pNode) {
+    return;
+  }
+  CFX_WideString wsColor;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    int32_t r, g, b;
+    XFA_STRING_TO_RGB(wsColor, r, g, b);
+    FX_ARGB color = ArgbEncode(0xff, r, g, b);
+    font.SetColor(color);
+  } else {
+    FX_ARGB color = font.GetColor();
+    int32_t a, r, g, b;
+    ArgbDecode(color, a, r, g, b);
+    wsColor.Format(L"%d,%d,%d", r, g, b);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
+  }
+}
+void CXFA_Node::Script_Field_FormatMessage(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  Script_Som_Message(hValue, bSetting, XFA_SOM_FormatMessage);
+}
+void CXFA_Node::Script_Field_FormattedValue(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CFX_WideString wsValue;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Display);
+  } else {
+    pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Display);
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+  }
+}
+void CXFA_Node::Script_Som_Mandatory(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CXFA_Validate validate = pWidgetData->GetValidate(TRUE);
+  CFX_WideString wsValue;
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+    validate.SetNullTest(wsValue);
+  } else {
+    int32_t iValue = validate.GetNullTest();
+    const XFA_ATTRIBUTEENUMINFO* pInfo =
+        XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)iValue);
+    if (pInfo) {
+      wsValue = pInfo->pName;
+    }
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+  }
+}
+void CXFA_Node::Script_Som_MandatoryMessage(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  Script_Som_Message(hValue, bSetting, XFA_SOM_MandatoryMessage);
+}
+void CXFA_Node::Script_Field_ParentSubform(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  } else {
+    FXJSE_Value_SetNull(hValue);
+  }
+}
+void CXFA_Node::Script_Field_SelectedIndex(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  if (bSetting) {
+    int32_t iIndex = FXJSE_Value_ToInteger(hValue);
+    if (iIndex == -1) {
+      pWidgetData->ClearAllSelections();
+      return;
+    }
+    pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
+  } else {
+    FXJSE_Value_SetInteger(hValue, pWidgetData->GetSelectedItem());
+  }
+}
+void CXFA_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  pWidgetData->DeleteItem(-1, TRUE);
+}
+void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString eventString = pArguments->GetUTF8String(0);
+    int32_t iRet = execSingleEventByName(
+        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
+        XFA_ELEMENT_Field);
+    if (eventString == "validate") {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
+                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  }
+}
+void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, FALSE, FALSE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execInitialize");
+  }
+}
+void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"deleteItem");
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  FX_BOOL bValue = pWidgetData->DeleteItem(iIndex, TRUE, TRUE);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, bValue);
+  }
+}
+void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getSaveItem");
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  if (iIndex < 0) {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    return;
+  }
+  CFX_WideString wsValue;
+  FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, TRUE);
+  if (bHasItem) {
+    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
+                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
+  } else {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+  }
+}
+void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"boundItem");
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CFX_ByteString bsValue = pArguments->GetUTF8String(0);
+  CFX_WideString wsValue =
+      CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+  CFX_WideString wsBoundValue;
+  pWidgetData->GetItemValue(wsValue, wsBoundValue);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsBoundValue));
+  }
+}
+void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"getItemState");
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  FX_BOOL bValue = pWidgetData->GetItemState(iIndex);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, bValue);
+  }
+}
+void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, FALSE, FALSE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execCalculate");
+  }
+}
+void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {}
+void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"getDisplayItem");
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  if (iIndex < 0) {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    return;
+  }
+  CFX_WideString wsValue;
+  FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, FALSE);
+  if (bHasItem) {
+    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
+                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
+  } else {
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+  }
+}
+void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"setItemState");
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  if (pArguments->GetInt32(1) != 0) {
+    pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
+  } else {
+    if (pWidgetData->GetItemState(iIndex)) {
+      pWidgetData->SetItemState(iIndex, FALSE, TRUE, TRUE);
+    }
+  }
+}
+void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addItem");
+    return;
+  }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  CFX_WideString wsLabel;
+  CFX_WideString wsValue;
+  if (iLength >= 1) {
+    CFX_ByteString bsLable = pArguments->GetUTF8String(0);
+    wsLabel = CFX_WideString::FromUTF8(bsLable, bsLable.GetLength());
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsValue = pArguments->GetUTF8String(1);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+  }
+  pWidgetData->InsertItem(wsLabel, wsValue, -1, TRUE);
+}
+void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      int32_t iRet =
+          pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, FALSE, FALSE);
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
+                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execValidate");
+  }
+}
+void CXFA_Node::Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue,
+                                                    FX_BOOL bSetting,
+                                                    XFA_ATTRIBUTE eAttribute) {
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    return;
+  }
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    pWidgetData->SetSelectedMemberByValue(
+        CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()), TRUE, TRUE);
+  } else {
+    CFX_WideString wsValue = GetScriptContent(TRUE);
+    XFA_VERSION curVersion = GetDocument()->GetCurVersionMode();
+    if (wsValue.IsEmpty() && curVersion >= XFA_VERSION_300) {
+      FXJSE_Value_SetNull(hValue);
+    } else {
+      FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+    }
+  }
+}
+void CXFA_Node::Script_ExclGroup_Transient(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString eventString = pArguments->GetUTF8String(0);
+    execSingleEventByName(
+        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
+        XFA_ELEMENT_ExclGroup);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  }
+}
+void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc == 0) || (argc == 1)) {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    } else {
+      CXFA_Node* pReturnNode = NULL;
+      if (argc == 0) {
+        pReturnNode = pWidgetData->GetSelectedMember();
+      } else {
+        CFX_ByteString szName;
+        szName = pArguments->GetUTF8String(0);
+        pReturnNode = pWidgetData->SetSelectedMember(
+            CFX_WideString::FromUTF8(szName, szName.GetLength()));
+      }
+      if (pReturnNode) {
+        FXJSE_Value_Set(
+            pArguments->GetReturnValue(),
+            m_pDocument->GetScriptContext()->GetJSValueFromMap(pReturnNode));
+      } else {
+        FXJSE_Value_SetNull(pArguments->GetReturnValue());
+      }
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"selectedMember");
+  }
+}
+void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execInitialize");
+  }
+}
+void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execCalculate");
+  }
+}
+void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
+                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execValidate");
+  }
+}
+static CXFA_Node* XFA_ScriptInstanceManager_GetItem(CXFA_Node* pInstMgrNode,
+                                                    int32_t iIndex) {
+  ASSERT(pInstMgrNode);
+  int32_t iCount = 0;
+  FX_DWORD dwNameHash = 0;
+  for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    XFA_ELEMENT eCurType = pNode->GetClassID();
+    if (eCurType == XFA_ELEMENT_InstanceManager) {
+      break;
+    }
+    if ((eCurType != XFA_ELEMENT_Subform) &&
+        (eCurType != XFA_ELEMENT_SubformSet)) {
+      continue;
+    }
+    if (iCount == 0) {
+      CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
+      CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
+      if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
+          wsInstName.Mid(1) != wsName) {
+        return NULL;
+      }
+      dwNameHash = pNode->GetNameHash();
+    }
+    if (dwNameHash != pNode->GetNameHash()) {
+      break;
+    }
+    iCount++;
+    if (iCount > iIndex) {
+      return pNode;
+    }
+  }
+  return NULL;
+}
+void CXFA_Node::Script_Som_InstanceIndex(FXJSE_HVALUE hValue,
+                                         FX_BOOL bSetting,
+                                         XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    int32_t iTo = FXJSE_Value_ToInteger(hValue);
+    int32_t iFrom = Subform_and_SubformSet_InstanceIndex();
+    CXFA_Node* pManagerNode = NULL;
+    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
+         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
+      if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
+        pManagerNode = pNode;
+        break;
+      }
+    }
+    if (pManagerNode) {
+      pManagerNode->InstanceManager_MoveInstance(iTo, iFrom);
+      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+      if (!pNotify) {
+        return;
+      }
+      CXFA_Node* pToInstance =
+          XFA_ScriptInstanceManager_GetItem(pManagerNode, iTo);
+      if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
+        pNotify->RunSubformIndexChange(pToInstance);
+      }
+      CXFA_Node* pFromInstance =
+          XFA_ScriptInstanceManager_GetItem(pManagerNode, iFrom);
+      if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
+        pNotify->RunSubformIndexChange(pFromInstance);
+      }
+    }
+  } else {
+    FXJSE_Value_SetInteger(hValue, Subform_and_SubformSet_InstanceIndex());
+  }
+}
+void CXFA_Node::Script_Subform_InstanceManager(FXJSE_HVALUE hValue,
+                                               FX_BOOL bSetting,
+                                               XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
+    CXFA_Node* pInstanceMgr = NULL;
+    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
+         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
+      if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
+        CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name);
+        if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' &&
+            wsInstMgrName.Mid(1) == wsName) {
+          pInstanceMgr = pNode;
+        }
+        break;
+      }
+    }
+    if (pInstanceMgr) {
+      FXJSE_Value_Set(
+          hValue,
+          m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
+    } else {
+      FXJSE_Value_SetNull(hValue);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+void CXFA_Node::Script_Subform_Locale(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    CFX_ByteString bsLocaleName;
+    FXJSE_Value_ToUTF8String(hValue, bsLocaleName);
+    SetCData(XFA_ATTRIBUTE_Locale,
+             CFX_WideString::FromUTF8(bsLocaleName, bsLocaleName.GetLength()),
+             TRUE, TRUE);
+  } else {
+    CFX_WideString wsLocaleName;
+    GetLocaleName(wsLocaleName);
+    FXJSE_Value_SetUTF8String(
+        hValue, FX_UTF8Encode(wsLocaleName, wsLocaleName.GetLength()));
+  }
+}
+void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString eventString = pArguments->GetUTF8String(0);
+    execSingleEventByName(
+        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
+        XFA_ELEMENT_Subform);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  }
+}
+void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execInitialize");
+  }
+}
+void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execCalculate");
+  }
+}
+void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
+                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execValidate");
+  }
+}
+void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"getInvalidObjects");
+  }
+}
+int32_t CXFA_Node::Subform_and_SubformSet_InstanceIndex() {
+  int32_t index = 0;
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
+    if ((pNode->GetClassID() == XFA_ELEMENT_Subform) ||
+        (pNode->GetClassID() == XFA_ELEMENT_SubformSet)) {
+      index++;
+    } else {
+      break;
+    }
+  }
+  return index;
+}
+void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
+  }
+}
+void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    m_pDocument->DoDataRemerge(TRUE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
+  }
+}
+void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execInitialize");
+  }
+}
+void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc > 0) && (argc < 4)) {
+    CFX_WideString strTagName;
+    CFX_WideString strName;
+    CFX_WideString strNameSpace;
+    CFX_ByteString bsTagName = pArguments->GetUTF8String(0);
+    strTagName = CFX_WideString::FromUTF8(bsTagName, bsTagName.GetLength());
+    if (argc > 1) {
+      CFX_ByteString bsName = pArguments->GetUTF8String(1);
+      strName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
+      if (argc == 3) {
+        CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2);
+        strNameSpace =
+            CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
+      }
+    }
+    const XFA_ELEMENTINFO* pElement = XFA_GetElementByName(strTagName);
+    CXFA_Node* pNewNode = CreateSamePacketNode(pElement->eName);
+    if (!pNewNode) {
+      FXJSE_Value_SetNull(pArguments->GetReturnValue());
+    } else {
+      if (!strName.IsEmpty()) {
+        if (XFA_GetAttributeOfElement(pElement->eName, XFA_ATTRIBUTE_Name,
+                                      XFA_XDPPACKET_UNKNOWN)) {
+          pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName, TRUE);
+          if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) {
+            pNewNode->CreateXMLMappingNode();
+          }
+          FXJSE_Value_Set(
+              pArguments->GetReturnValue(),
+              m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
+        } else {
+          ThrowScriptErrorMessage(XFA_IDS_NOT_HAVE_PROPERTY,
+                                  (const FX_WCHAR*)strTagName, L"name");
+        }
+      } else {
+        FXJSE_Value_Set(
+            pArguments->GetReturnValue(),
+            m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
+      }
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"createNode");
+  }
+}
+void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) {
+  if (pArguments->GetLength() == 1) {
+    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
+  }
+}
+void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execCalculate");
+  }
+}
+void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execValidate");
+  }
+}
+void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    CXFA_WidgetData* pWidgetData = GetWidgetData();
+    if (!pWidgetData) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"evaluate");
+  }
+}
+void CXFA_Node::Script_InstanceManager_Max(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CXFA_Occur nodeOccur(GetOccurNode());
+  FXJSE_Value_SetInteger(hValue, nodeOccur.GetMax());
+}
+void CXFA_Node::Script_InstanceManager_Min(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CXFA_Occur nodeOccur(GetOccurNode());
+  FXJSE_Value_SetInteger(hValue, nodeOccur.GetMin());
+}
+static int32_t XFA_ScriptInstanceManager_GetCount(CXFA_Node* pInstMgrNode) {
+  ASSERT(pInstMgrNode);
+  int32_t iCount = 0;
+  FX_DWORD dwNameHash = 0;
+  for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    XFA_ELEMENT eCurType = pNode->GetClassID();
+    if (eCurType == XFA_ELEMENT_InstanceManager) {
+      break;
+    }
+    if ((eCurType != XFA_ELEMENT_Subform) &&
+        (eCurType != XFA_ELEMENT_SubformSet)) {
+      continue;
+    }
+    if (iCount == 0) {
+      CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
+      CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
+      if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
+          wsInstName.Mid(1) != wsName) {
+        return iCount;
+      }
+      dwNameHash = pNode->GetNameHash();
+    }
+    if (dwNameHash != pNode->GetNameHash()) {
+      break;
+    }
+    iCount++;
+  }
+  return iCount;
+}
+static void
+XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
+    const CXFA_NodeSet& rgNodeSet,
+    CXFA_NodeArray& rgNodeArray,
+    CFX_ArrayTemplate<int32_t>& rgIdxArray) {
+  int32_t iCount = rgNodeSet.GetCount();
+  rgNodeArray.SetSize(iCount);
+  rgIdxArray.SetSize(iCount);
+  if (iCount == 0) {
+    return;
+  }
+  int32_t iIndex = -1, iTotalIndex = -1;
+  CXFA_Node* pNode = NULL;
+  FX_POSITION pos = rgNodeSet.GetStartPosition();
+  rgNodeSet.GetNextAssoc(pos, pNode);
+  for (pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent)
+                   ->GetNodeItem(XFA_NODEITEM_FirstChild);
+       pNode && iIndex < iCount;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    iTotalIndex++;
+    if (rgNodeSet.Lookup(pNode)) {
+      iIndex++;
+      rgNodeArray[iIndex] = pNode;
+      rgIdxArray[iIndex] = iTotalIndex;
+    }
+  }
+}
+struct CXFA_DualNodeArray {
+  CXFA_NodeSet firstNodeList;
+  CXFA_NodeSet secondNodeList;
+};
+static void XFA_ScriptInstanceManager_ReorderDataNodes(CXFA_NodeSet& sSet1,
+                                                       CXFA_NodeSet& sSet2,
+                                                       FX_BOOL bInsertBefore) {
+  CFX_MapPtrTemplate<CXFA_Node*,
+                     CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>*>
+      rgNodeListMap;
+  FX_POSITION pos;
+  pos = sSet1.GetStartPosition();
+  while (pos) {
+    CXFA_Node* pNode = NULL;
+    sSet1.GetNextAssoc(pos, pNode);
+    CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+    FX_DWORD dwNameHash = pNode->GetNameHash();
+    if (!pParentNode || !dwNameHash) {
+      continue;
+    }
+    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
+        rgNodeListMap[pParentNode];
+    if (!pNodeListChildMap) {
+      rgNodeListMap[pParentNode] = pNodeListChildMap =
+          new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
+    }
+    CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
+    if (!pDualNodeArray) {
+      (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
+          new CXFA_DualNodeArray;
+    }
+    pDualNodeArray->firstNodeList.Add(pNode);
+  }
+  pos = sSet2.GetStartPosition();
+  while (pos) {
+    CXFA_Node* pNode = NULL;
+    sSet2.GetNextAssoc(pos, pNode);
+    CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+    FX_DWORD dwNameHash = pNode->GetNameHash();
+    if (!pParentNode || !dwNameHash) {
+      continue;
+    }
+    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
+        rgNodeListMap[pParentNode];
+    if (!pNodeListChildMap) {
+      rgNodeListMap[pParentNode] = pNodeListChildMap =
+          new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
+    }
+    CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
+    if (!pDualNodeArray) {
+      (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
+          new CXFA_DualNodeArray;
+    }
+    if (pDualNodeArray->firstNodeList.Lookup(pNode)) {
+      pDualNodeArray->firstNodeList.RemoveKey(pNode);
+    } else {
+      pDualNodeArray->secondNodeList.Add(pNode);
+    }
+  }
+  pos = rgNodeListMap.GetStartPosition();
+  while (pos) {
+    CXFA_Node* pParentNode = NULL;
+    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = NULL;
+    rgNodeListMap.GetNextAssoc(pos, pParentNode, pNodeListChildMap);
+    if (!pNodeListChildMap) {
+      continue;
+    }
+    FX_POSITION childpos = pNodeListChildMap->GetStartPosition();
+    while (childpos) {
+      FX_DWORD dwNameHash = 0;
+      CXFA_DualNodeArray* pDualNodeArray = NULL;
+      pNodeListChildMap->GetNextAssoc(childpos, dwNameHash, pDualNodeArray);
+      if (!pDualNodeArray) {
+        continue;
+      }
+      if (pDualNodeArray->firstNodeList.GetCount() != 0 &&
+          pDualNodeArray->secondNodeList.GetCount() != 0) {
+        CXFA_NodeArray rgNodeArray1, rgNodeArray2;
+        CFX_ArrayTemplate<int32_t> rgIdxArray1, rgIdxArray2;
+        XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
+            pDualNodeArray->firstNodeList, rgNodeArray1, rgIdxArray1);
+        XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
+            pDualNodeArray->secondNodeList, rgNodeArray2, rgIdxArray2);
+        CXFA_Node *pParentNode = NULL, *pBeforeNode = NULL;
+        if (bInsertBefore) {
+          pBeforeNode = rgNodeArray2[0];
+          pParentNode = pBeforeNode->GetNodeItem(XFA_NODEITEM_Parent);
+        } else {
+          CXFA_Node* pLastNode = rgNodeArray2[rgIdxArray2.GetSize() - 1];
+          pParentNode = pLastNode->GetNodeItem(XFA_NODEITEM_Parent);
+          pBeforeNode = pLastNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+        }
+        for (int32_t iIdx = 0, iCount = rgIdxArray1.GetSize(); iIdx < iCount;
+             iIdx++) {
+          CXFA_Node* pCurNode = rgNodeArray1[iIdx];
+          pParentNode->RemoveChild(pCurNode);
+          pParentNode->InsertChild(pCurNode, pBeforeNode);
+        }
+      }
+      delete pDualNodeArray;
+    }
+    pNodeListChildMap->RemoveAll();
+  }
+  rgNodeListMap.RemoveAll();
+}
+static void XFA_ScriptInstanceManager_InsertItem(
+    CXFA_Node* pInstMgrNode,
+    CXFA_Node* pNewInstance,
+    int32_t iPos,
+    int32_t iCount = -1,
+    FX_BOOL bMoveDataBindingNodes = TRUE) {
+  if (iCount < 0) {
+    iCount = XFA_ScriptInstanceManager_GetCount(pInstMgrNode);
+  }
+  if (iPos < 0) {
+    iPos = iCount;
+  }
+  if (iPos == iCount) {
+    CXFA_Node* pNextSibling =
+        iCount > 0
+            ? XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iCount - 1)
+                  ->GetNodeItem(XFA_NODEITEM_NextSibling)
+            : pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
+        ->InsertChild(pNewInstance, pNextSibling);
+    if (bMoveDataBindingNodes) {
+      CXFA_NodeSet sNew, sAfter;
+      CXFA_NodeIteratorTemplate<CXFA_Node,
+                                CXFA_TraverseStrategy_XFAContainerNode>
+          sIteratorNew(pNewInstance);
+      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
+           pNode = sIteratorNew.MoveToNext()) {
+        CXFA_Node* pDataNode = pNode->GetBindData();
+        if (!pDataNode) {
+          continue;
+        }
+        sNew.Add(pDataNode);
+      }
+      CXFA_NodeIteratorTemplate<CXFA_Node,
+                                CXFA_TraverseStrategy_XFAContainerNode>
+          sIteratorAfter(pNextSibling);
+      for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode;
+           pNode = sIteratorAfter.MoveToNext()) {
+        CXFA_Node* pDataNode = pNode->GetBindData();
+        if (!pDataNode) {
+          continue;
+        }
+        sAfter.Add(pDataNode);
+      }
+      XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sAfter, FALSE);
+    }
+  } else {
+    CXFA_Node* pBeforeInstance =
+        XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iPos);
+    pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
+        ->InsertChild(pNewInstance, pBeforeInstance);
+    if (bMoveDataBindingNodes) {
+      CXFA_NodeSet sNew, sBefore;
+      CXFA_NodeIteratorTemplate<CXFA_Node,
+                                CXFA_TraverseStrategy_XFAContainerNode>
+          sIteratorNew(pNewInstance);
+      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
+           pNode = sIteratorNew.MoveToNext()) {
+        CXFA_Node* pDataNode = pNode->GetBindData();
+        if (!pDataNode) {
+          continue;
+        }
+        sNew.Add(pDataNode);
+      }
+      CXFA_NodeIteratorTemplate<CXFA_Node,
+                                CXFA_TraverseStrategy_XFAContainerNode>
+          sIteratorBefore(pBeforeInstance);
+      for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode;
+           pNode = sIteratorBefore.MoveToNext()) {
+        CXFA_Node* pDataNode = pNode->GetBindData();
+        if (!pDataNode) {
+          continue;
+        }
+        sBefore.Add(pDataNode);
+      }
+      XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sBefore, TRUE);
+    }
+  }
+}
+static void XFA_ScriptInstanceManager_RemoveItem(
+    CXFA_Node* pInstMgrNode,
+    CXFA_Node* pRemoveInstance,
+    FX_BOOL bRemoveDataBinding = TRUE) {
+  pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pRemoveInstance);
+  if (!bRemoveDataBinding) {
+    return;
+  }
+  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
+      sIterator(pRemoveInstance);
+  for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode;
+       pFormNode = sIterator.MoveToNext()) {
+    CXFA_Node* pDataNode = pFormNode->GetBindData();
+    if (!pDataNode) {
+      continue;
+    }
+    if (pDataNode->RemoveBindItem(pFormNode) == 0) {
+      if (CXFA_Node* pDataParent =
+              pDataNode->GetNodeItem(XFA_NODEITEM_Parent)) {
+        pDataParent->RemoveChild(pDataNode);
+      }
+    }
+    pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+  }
+}
+static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance(
+    CXFA_Node* pInstMgrNode,
+    FX_BOOL bDataMerge) {
+  CXFA_Document* pDocument = pInstMgrNode->GetDocument();
+  CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode();
+  CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent);
+  CXFA_Node* pDataScope = NULL;
+  for (CXFA_Node* pRootBoundNode = pFormParent;
+       pRootBoundNode &&
+       pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
+       pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) {
+    pDataScope = pRootBoundNode->GetBindData();
+    if (pDataScope) {
+      break;
+    }
+  }
+  if (!pDataScope) {
+    pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
+    ASSERT(pDataScope);
+  }
+  CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer(
+      pTemplateNode, pFormParent, pDataScope, TRUE, bDataMerge);
+  if (pInstance) {
+    pDocument->DataMerge_UpdateBindingRelations(pInstance);
+    pFormParent->RemoveChild(pInstance);
+  }
+  return pInstance;
+}
+void CXFA_Node::Script_InstanceManager_Count(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    int32_t iDesired = FXJSE_Value_ToInteger(hValue);
+    InstanceManager_SetInstances(iDesired);
+  } else {
+    FXJSE_Value_SetInteger(hValue, XFA_ScriptInstanceManager_GetCount(this));
+  }
+}
+void CXFA_Node::Script_InstanceManager_MoveInstance(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc != 2) {
+    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
+    return;
+  }
+  int32_t iFrom = pArguments->GetInt32(0);
+  int32_t iTo = pArguments->GetInt32(1);
+  InstanceManager_MoveInstance(iTo, iFrom);
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(this, iTo);
+  if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
+    pNotify->RunSubformIndexChange(pToInstance);
+  }
+  CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
+  if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
+    pNotify->RunSubformIndexChange(pFromInstance);
+  }
+}
+void CXFA_Node::Script_InstanceManager_RemoveInstance(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc != 1) {
+    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
+  if (iIndex < 0 || iIndex >= iCount) {
+    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    return;
+  }
+  CXFA_Occur nodeOccur(GetOccurNode());
+  int32_t iMin = nodeOccur.GetMin();
+  if (iCount - 1 < iMin) {
+    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
+    return;
+  }
+  CXFA_Node* pRemoveInstance = XFA_ScriptInstanceManager_GetItem(this, iIndex);
+  XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (pNotify) {
+    for (int32_t i = iIndex; i < iCount - 1; i++) {
+      CXFA_Node* pSubformInstance = XFA_ScriptInstanceManager_GetItem(this, i);
+      if (pSubformInstance &&
+          pSubformInstance->GetClassID() == XFA_ELEMENT_Subform) {
+        pNotify->RunSubformIndexChange(pSubformInstance);
+      }
+    }
+  }
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (!pLayoutPro) {
+    return;
+  }
+  pLayoutPro->AddChangedContainer(
+      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
+}
+void CXFA_Node::Script_InstanceManager_SetInstances(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc != 1) {
+    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
+    return;
+  }
+  int32_t iDesired = pArguments->GetInt32(0);
+  InstanceManager_SetInstances(iDesired);
+}
+void CXFA_Node::Script_InstanceManager_AddInstance(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc != 0) && (argc != 1)) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addInstance");
+    return;
+  }
+  FX_BOOL fFlags = TRUE;
+  if (argc == 1) {
+    fFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
+  }
+  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
+  CXFA_Occur nodeOccur(GetOccurNode());
+  int32_t iMax = nodeOccur.GetMax();
+  if (iMax >= 0 && iCount >= iMax) {
+    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    return;
+  }
+  CXFA_Node* pNewInstance =
+      XFA_ScriptInstanceManager_CreateInstance(this, fFlags);
+  XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
+                                       FALSE);
+  FXJSE_Value_Set(
+      pArguments->GetReturnValue(),
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  pNotify->RunNodeInitialize(pNewInstance);
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (!pLayoutPro) {
+    return;
+  }
+  pLayoutPro->AddChangedContainer(
+      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
+}
+void CXFA_Node::Script_InstanceManager_InsertInstance(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc != 1) && (argc != 2)) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"insertInstance");
+    return;
+  }
+  int32_t iIndex = pArguments->GetInt32(0);
+  FX_BOOL bBind = FALSE;
+  if (argc == 2) {
+    bBind = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
+  }
+  CXFA_Occur nodeOccur(GetOccurNode());
+  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
+  if (iIndex < 0 || iIndex > iCount) {
+    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    return;
+  }
+  int32_t iMax = nodeOccur.GetMax();
+  if (iMax >= 0 && iCount >= iMax) {
+    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    return;
+  }
+  CXFA_Node* pNewInstance =
+      XFA_ScriptInstanceManager_CreateInstance(this, bBind);
+  XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iIndex, iCount,
+                                       TRUE);
+  FXJSE_Value_Set(
+      pArguments->GetReturnValue(),
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  pNotify->RunNodeInitialize(pNewInstance);
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (!pLayoutPro) {
+    return;
+  }
+  pLayoutPro->AddChangedContainer(
+      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
+}
+int32_t CXFA_Node::InstanceManager_SetInstances(int32_t iDesired) {
+  CXFA_Occur nodeOccur(GetOccurNode());
+  int32_t iMax = nodeOccur.GetMax();
+  int32_t iMin = nodeOccur.GetMin();
+  if (iDesired < iMin) {
+    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
+    return 1;
+  }
+  if ((iMax >= 0) && (iDesired > iMax)) {
+    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    return 2;
+  }
+  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
+  if (iDesired == iCount) {
+    return 0;
+  }
+  if (iDesired < iCount) {
+    CFX_WideStringC wsInstManagerName = GetCData(XFA_ATTRIBUTE_Name);
+    CFX_WideString wsInstanceName = wsInstManagerName.IsEmpty()
+                                        ? wsInstManagerName
+                                        : wsInstManagerName.Mid(1);
+    FX_DWORD dInstanceNameHash =
+        wsInstanceName.IsEmpty() ? 0 : FX_HashCode_String_GetW(
+                                           wsInstanceName,
+                                           wsInstanceName.GetLength());
+    CXFA_Node* pPrevSibling =
+        (iDesired == 0) ? this
+                        : XFA_ScriptInstanceManager_GetItem(this, iDesired - 1);
+    while (iCount > iDesired) {
+      CXFA_Node* pRemoveInstance =
+          pPrevSibling->GetNodeItem(XFA_NODEITEM_NextSibling);
+      if (pRemoveInstance->GetClassID() != XFA_ELEMENT_Subform &&
+          pRemoveInstance->GetClassID() != XFA_ELEMENT_SubformSet) {
+        continue;
+      }
+      if (pRemoveInstance->GetClassID() == XFA_ELEMENT_InstanceManager) {
+        FXSYS_assert(FALSE);
+        break;
+      }
+      if (pRemoveInstance->GetNameHash() == dInstanceNameHash) {
+        XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
+        iCount--;
+      }
+    }
+  } else if (iDesired > iCount) {
+    while (iCount < iDesired) {
+      CXFA_Node* pNewInstance =
+          XFA_ScriptInstanceManager_CreateInstance(this, TRUE);
+      XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
+                                           FALSE);
+      iCount++;
+      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+      if (!pNotify) {
+        return 0;
+      }
+      pNotify->RunNodeInitialize(pNewInstance);
+    }
+  }
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (pLayoutPro) {
+    pLayoutPro->AddChangedContainer(
+        ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
+  }
+  return 0;
+}
+int32_t CXFA_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) {
+  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
+  if (iFrom > iCount || iTo > iCount - 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    return 1;
+  }
+  if (iFrom < 0 || iTo < 0 || iFrom == iTo) {
+    return 0;
+  }
+  CXFA_Node* pMoveInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
+  XFA_ScriptInstanceManager_RemoveItem(this, pMoveInstance, FALSE);
+  XFA_ScriptInstanceManager_InsertItem(this, pMoveInstance, iTo, iCount - 1,
+                                       TRUE);
+  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
+  if (pLayoutPro) {
+    pLayoutPro->AddChangedContainer(
+        ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
+  }
+  return 0;
+}
+void CXFA_Node::Script_Occur_Max(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute) {
+  CXFA_Occur occur(this);
+  if (bSetting) {
+    int32_t iMax = FXJSE_Value_ToInteger(hValue);
+    occur.SetMax(iMax);
+  } else {
+    FXJSE_Value_SetInteger(hValue, occur.GetMax());
+  }
+}
+void CXFA_Node::Script_Occur_Min(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute) {
+  CXFA_Occur occur(this);
+  if (bSetting) {
+    int32_t iMin = FXJSE_Value_ToInteger(hValue);
+    occur.SetMin(iMin);
+  } else {
+    FXJSE_Value_SetInteger(hValue, occur.GetMin());
+  }
+}
+void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if ((argc == 0) || (argc == 1)) {
+    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"metadata");
+  }
+}
+void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+    if (pDataNode) {
+      CXFA_NodeArray formItems;
+      CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
+      pFormNodes->SetArrayNodeList(formItems);
+      FXJSE_Value_SetObject(
+          pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
+          m_pDocument->GetScriptContext()->GetJseNormalClass());
+    } else {
+      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
+  }
+}
+void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    m_pDocument->DoDataRemerge(TRUE);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
+  }
+}
+void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execInitialize");
+  }
+}
+void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) {
+  CXFA_EventParam* pEventParam =
+      m_pDocument->GetScriptContext()->GetEventParam();
+  if (pEventParam->m_eType == XFA_EVENT_Calculate ||
+      pEventParam->m_eType == XFA_EVENT_InitCalculate) {
+    return;
+  }
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    const bool bScriptFlags = pArguments->GetInt32(0) != 0;
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    if (bScriptFlags) {
+      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
+      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, TRUE);
+    } else {
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
+  }
+}
+void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return;
+    }
+    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execCalculate");
+  }
+}
+void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
+    } else {
+      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
+                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"execValidate");
+  }
+}
+void CXFA_Node::Script_Form_Checksum(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    CFX_ByteString bsChecksum;
+    FXJSE_Value_ToUTF8String(hValue, bsChecksum);
+    SetAttribute(XFA_ATTRIBUTE_Checksum,
+                 CFX_WideString::FromUTF8(bsChecksum, bsChecksum.GetLength()));
+  } else {
+    CFX_WideString wsChecksum;
+    GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, FALSE);
+    FXJSE_Value_SetUTF8String(
+        hValue, FX_UTF8Encode(wsChecksum, wsChecksum.GetLength()));
+  }
+}
+void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0);
+    CFX_WideString wsAttributeValue;
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      ((IFDE_XMLElement*)pXMLNode)
+          ->GetString(CFX_WideString::FromUTF8(bsAttributeName,
+                                               bsAttributeName.GetLength()),
+                      wsAttributeValue);
+    }
+    FXJSE_Value_SetUTF8String(
+        pArguments->GetReturnValue(),
+        FX_UTF8Encode(wsAttributeValue, wsAttributeValue.GetLength()));
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"getAttribute");
+  }
+}
+void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 2) {
+    CFX_ByteString bsValue = pArguments->GetUTF8String(0);
+    CFX_ByteString bsName = pArguments->GetUTF8String(1);
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      ((IFDE_XMLElement*)pXMLNode)
+          ->SetString(CFX_WideString::FromUTF8(bsName, bsName.GetLength()),
+                      CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
+    }
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"setAttribute");
+  }
+}
+void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString bsName = pArguments->GetUTF8String(0);
+    CFX_WideString wsName =
+        CFX_WideString::FromUTF8(bsName, bsName.GetLength());
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      if (pXMLElement->HasAttribute(wsName)) {
+        pXMLElement->RemoveAttribute(wsName);
+      }
+    }
+    FXJSE_Value_SetNull(pArguments->GetReturnValue());
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"removeAttribute");
+  }
+}
+void CXFA_Node::Script_Packet_Content(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    CFX_ByteString bsNewContent;
+    FXJSE_Value_ToUTF8String(hValue, bsNewContent);
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      pXMLElement->SetTextData(
+          CFX_WideString::FromUTF8(bsNewContent, bsNewContent.GetLength()));
+    }
+  } else {
+    CFX_WideString wsTextData;
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      pXMLElement->GetTextData(wsTextData);
+    }
+    FXJSE_Value_SetUTF8String(
+        hValue, FX_UTF8Encode(wsTextData, wsTextData.GetLength()));
+  }
+}
+void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"next");
+  }
+}
+void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancelBatch");
+  }
+}
+void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"first");
+  }
+}
+void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"updateBatch");
+  }
+}
+void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"previous");
+  }
+}
+void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isBOF");
+  }
+}
+void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isEOF");
+  }
+}
+void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancel");
+  }
+}
+void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"update");
+  }
+}
+void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"open");
+  }
+}
+void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"delete");
+  }
+}
+void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addNew");
+  }
+}
+void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"requery");
+  }
+}
+void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resync");
+  }
+}
+void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"close");
+  }
+}
+void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"last");
+  }
+}
+void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 0) {
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"hasDataChanged");
+  }
+}
+void CXFA_Node::Script_Source_Db(FXJSE_HVALUE hValue,
+                                 FX_BOOL bSetting,
+                                 XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Xfa_This(FXJSE_HVALUE hValue,
+                                FX_BOOL bSetting,
+                                XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    CXFA_Object* pThis = m_pDocument->GetScriptContext()->GetThisObject();
+    FXSYS_assert(pThis);
+    FXJSE_Value_Set(hValue,
+                    m_pDocument->GetScriptContext()->GetJSValueFromMap(pThis));
+  }
+}
+void CXFA_Node::Script_Handler_Version(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_SubmitFormat_Mode(FXJSE_HVALUE hValue,
+                                         FX_BOOL bSetting,
+                                         XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Extras_Type(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute) {}
+void CXFA_Node::Script_Script_Stateless(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute) {
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(FX_WSTRC(L"0")));
+}
+void CXFA_Node::Script_Encrypt_Format(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute) {}
+enum XFA_KEYTYPE {
+  XFA_KEYTYPE_Custom,
+  XFA_KEYTYPE_Element,
+};
+void* XFA_GetMapKey_Custom(const CFX_WideStringC& wsKey) {
+  FX_DWORD dwKey = FX_HashCode_String_GetW(wsKey.GetPtr(), wsKey.GetLength());
+  return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom);
+}
+void* XFA_GetMapKey_Element(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute) {
+  return (void*)(uintptr_t)((eElement << 16) | (eAttribute << 8) |
+                            XFA_KEYTYPE_Element);
+}
+FX_BOOL CXFA_Node::HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  return HasMapModuleKey(pKey, bCanInherit);
+}
+FX_BOOL CXFA_Node::SetAttribute(XFA_ATTRIBUTE eAttr,
+                                const CFX_WideStringC& wsValue,
+                                FX_BOOL bNotify) {
+  const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
+  if (pAttr == NULL) {
+    return FALSE;
+  }
+  XFA_ATTRIBUTETYPE eType = pAttr->eType;
+  if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
+    const XFA_NOTSUREATTRIBUTE* pNotsure =
+        XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
+    eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
+  }
+  switch (eType) {
+    case XFA_ATTRIBUTETYPE_Enum: {
+      const XFA_ATTRIBUTEENUMINFO* pEnum = XFA_GetAttributeEnumByName(wsValue);
+      return SetEnum(pAttr->eName,
+                     pEnum ? pEnum->eName
+                           : (XFA_ATTRIBUTEENUM)(intptr_t)(pAttr->pDefValue),
+                     bNotify);
+    } break;
+    case XFA_ATTRIBUTETYPE_Cdata:
+      return SetCData(pAttr->eName, wsValue, bNotify);
+    case XFA_ATTRIBUTETYPE_Boolean:
+      return SetBoolean(pAttr->eName, wsValue != FX_WSTRC(L"0"), bNotify);
+    case XFA_ATTRIBUTETYPE_Integer:
+      return SetInteger(
+          pAttr->eName,
+          FXSYS_round(FX_wcstof(wsValue.GetPtr(), wsValue.GetLength())),
+          bNotify);
+    case XFA_ATTRIBUTETYPE_Measure:
+      return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify);
+    default:
+      break;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Node::GetAttribute(XFA_ATTRIBUTE eAttr,
+                                CFX_WideString& wsValue,
+                                FX_BOOL bUseDefault) {
+  const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
+  if (pAttr == NULL) {
+    return FALSE;
+  }
+  XFA_ATTRIBUTETYPE eType = pAttr->eType;
+  if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
+    const XFA_NOTSUREATTRIBUTE* pNotsure =
+        XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
+    eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
+  }
+  switch (eType) {
+    case XFA_ATTRIBUTETYPE_Enum: {
+      XFA_ATTRIBUTEENUM eValue;
+      if (!TryEnum(pAttr->eName, eValue, bUseDefault)) {
+        return FALSE;
+      }
+      wsValue = XFA_GetAttributeEnumByID(eValue)->pName;
+      return TRUE;
+    } break;
+    case XFA_ATTRIBUTETYPE_Cdata: {
+      CFX_WideStringC wsValueC;
+      if (!TryCData(pAttr->eName, wsValueC, bUseDefault)) {
+        return FALSE;
+      }
+      wsValue = wsValueC;
+      return TRUE;
+    } break;
+    case XFA_ATTRIBUTETYPE_Boolean: {
+      FX_BOOL bValue;
+      if (!TryBoolean(pAttr->eName, bValue, bUseDefault)) {
+        return FALSE;
+      }
+      wsValue = bValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0");
+      return TRUE;
+    } break;
+    case XFA_ATTRIBUTETYPE_Integer: {
+      int32_t iValue;
+      if (!TryInteger(pAttr->eName, iValue, bUseDefault)) {
+        return FALSE;
+      }
+      wsValue.Format(L"%d", iValue);
+      return TRUE;
+    } break;
+    case XFA_ATTRIBUTETYPE_Measure: {
+      CXFA_Measurement mValue;
+      if (!TryMeasure(pAttr->eName, mValue, bUseDefault)) {
+        return FALSE;
+      }
+      mValue.ToString(wsValue);
+      return TRUE;
+    } break;
+    default:
+      break;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Node::SetAttribute(const CFX_WideStringC& wsAttr,
+                                const CFX_WideStringC& wsValue,
+                                FX_BOOL bNotify) {
+  const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsValue);
+  if (pAttributeInfo) {
+    return SetAttribute(pAttributeInfo->eName, wsValue, bNotify);
+  }
+  void* pKey = XFA_GetMapKey_Custom(wsAttr);
+  SetMapModuleString(pKey, wsValue);
+  return TRUE;
+}
+FX_BOOL CXFA_Node::GetAttribute(const CFX_WideStringC& wsAttr,
+                                CFX_WideString& wsValue,
+                                FX_BOOL bUseDefault) {
+  const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsAttr);
+  if (pAttributeInfo) {
+    return GetAttribute(pAttributeInfo->eName, wsValue, bUseDefault);
+  }
+  void* pKey = XFA_GetMapKey_Custom(wsAttr);
+  CFX_WideStringC wsValueC;
+  if (GetMapModuleString(pKey, wsValueC)) {
+    wsValue = wsValueC;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Node::RemoveAttribute(const CFX_WideStringC& wsAttr) {
+  void* pKey = XFA_GetMapKey_Custom(wsAttr);
+  RemoveMapModuleKey(pKey);
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr,
+                              FX_BOOL& bValue,
+                              FX_BOOL bUseDefault) {
+  void* pValue = NULL;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) {
+    return FALSE;
+  }
+  bValue = (FX_BOOL)(uintptr_t)pValue;
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr,
+                              int32_t& iValue,
+                              FX_BOOL bUseDefault) {
+  void* pValue = NULL;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) {
+    return FALSE;
+  }
+  iValue = (int32_t)(uintptr_t)pValue;
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr,
+                           XFA_ATTRIBUTEENUM& eValue,
+                           FX_BOOL bUseDefault) {
+  void* pValue = NULL;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) {
+    return FALSE;
+  }
+  eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
+  return TRUE;
+}
+FX_BOOL CXFA_Node::SetMeasure(XFA_ATTRIBUTE eAttr,
+                              CXFA_Measurement mValue,
+                              FX_BOOL bNotify) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  OnChanging(eAttr, &mValue, bNotify);
+  SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement));
+  OnChanged(eAttr, &mValue, bNotify);
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryMeasure(XFA_ATTRIBUTE eAttr,
+                              CXFA_Measurement& mValue,
+                              FX_BOOL bUseDefault) const {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  void* pValue;
+  int32_t iBytes;
+  if (GetMapModuleBuffer(pKey, pValue, iBytes) && iBytes == sizeof(mValue)) {
+    FXSYS_memcpy(&mValue, pValue, sizeof(mValue));
+    return TRUE;
+  }
+  if (bUseDefault &&
+      XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
+                                   XFA_ATTRIBUTETYPE_Measure, m_ePacket)) {
+    FXSYS_memcpy(&mValue, pValue, sizeof(mValue));
+    return TRUE;
+  }
+  return FALSE;
+}
+
+CXFA_Measurement CXFA_Node::GetMeasure(XFA_ATTRIBUTE eAttr) const {
+  CXFA_Measurement mValue;
+  return TryMeasure(eAttr, mValue, TRUE) ? mValue : CXFA_Measurement();
+}
+
+FX_BOOL CXFA_Node::SetCData(XFA_ATTRIBUTE eAttr,
+                            const CFX_WideString& wsValue,
+                            FX_BOOL bNotify,
+                            FX_BOOL bScriptModify) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  OnChanging(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify);
+  if (eAttr == XFA_ATTRIBUTE_Value) {
+    CFX_WideString* pClone = new CFX_WideString(wsValue);
+    SetUserData(pKey, pClone, &deleteWideStringCallBack);
+  } else {
+    SetMapModuleString(pKey, wsValue);
+    if (eAttr == XFA_ATTRIBUTE_Name)
+      UpdateNameHash();
+  }
+  OnChanged(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify, bScriptModify);
+  if (IsNeedSavingXMLNode() && eAttr != XFA_ATTRIBUTE_QualifiedName &&
+      eAttr != XFA_ATTRIBUTE_BindingNode) {
+    if (eAttr == XFA_ATTRIBUTE_Name &&
+        (m_eNodeClass == XFA_ELEMENT_DataValue ||
+         m_eNodeClass == XFA_ELEMENT_DataGroup)) {
+      return TRUE;
+    }
+    if (eAttr == XFA_ATTRIBUTE_Value) {
+      FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
+      switch (eXMLType) {
+        case FDE_XMLNODE_Element:
+          if (IsAttributeInXML()) {
+            ((IFDE_XMLElement*)m_pXMLNode)
+                ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsValue);
+          } else {
+            FX_BOOL bDeleteChildren = TRUE;
+            if (GetPacketID() == XFA_XDPPACKET_Datasets) {
+              for (CXFA_Node* pChildDataNode =
+                       GetNodeItem(XFA_NODEITEM_FirstChild);
+                   pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
+                                       XFA_NODEITEM_NextSibling)) {
+                CXFA_NodeArray formNodes;
+                if (pChildDataNode->GetBindItems(formNodes) > 0) {
+                  bDeleteChildren = FALSE;
+                  break;
+                }
+              }
+            }
+            if (bDeleteChildren) {
+              ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
+            }
+            ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsValue);
+          }
+          break;
+        case FDE_XMLNODE_Text:
+          ((IFDE_XMLText*)m_pXMLNode)->SetText(wsValue);
+          break;
+        default:
+          FXSYS_assert(0);
+      }
+      return TRUE;
+    }
+    const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr);
+    if (pInfo) {
+      FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
+      CFX_WideString wsAttrName = pInfo->pName;
+      if (pInfo->eName == XFA_ATTRIBUTE_ContentType) {
+        wsAttrName = FX_WSTRC(L"xfa:") + wsAttrName;
+      }
+      ((IFDE_XMLElement*)m_pXMLNode)->SetString(wsAttrName, wsValue);
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Node::SetAttributeValue(const CFX_WideString& wsValue,
+                                     const CFX_WideString& wsXMLValue,
+                                     FX_BOOL bNotify,
+                                     FX_BOOL bScriptModify) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), XFA_ATTRIBUTE_Value);
+  OnChanging(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify);
+  CFX_WideString* pClone = new CFX_WideString(wsValue);
+  SetUserData(pKey, pClone, &deleteWideStringCallBack);
+  OnChanged(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify,
+            bScriptModify);
+  if (IsNeedSavingXMLNode()) {
+    FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
+    switch (eXMLType) {
+      case FDE_XMLNODE_Element:
+        if (IsAttributeInXML()) {
+          ((IFDE_XMLElement*)m_pXMLNode)
+              ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsXMLValue);
+        } else {
+          FX_BOOL bDeleteChildren = TRUE;
+          if (GetPacketID() == XFA_XDPPACKET_Datasets) {
+            for (CXFA_Node* pChildDataNode =
+                     GetNodeItem(XFA_NODEITEM_FirstChild);
+                 pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
+                                     XFA_NODEITEM_NextSibling)) {
+              CXFA_NodeArray formNodes;
+              if (pChildDataNode->GetBindItems(formNodes) > 0) {
+                bDeleteChildren = FALSE;
+                break;
+              }
+            }
+          }
+          if (bDeleteChildren) {
+            ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
+          }
+          ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsXMLValue);
+        }
+        break;
+      case FDE_XMLNODE_Text:
+        ((IFDE_XMLText*)m_pXMLNode)->SetText(wsXMLValue);
+        break;
+      default:
+        FXSYS_assert(0);
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
+                            CFX_WideString& wsValue,
+                            FX_BOOL bUseDefault,
+                            FX_BOOL bProto) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  if (eAttr == XFA_ATTRIBUTE_Value) {
+    CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
+    if (pStr) {
+      wsValue = *pStr;
+      return TRUE;
+    }
+  } else {
+    CFX_WideStringC wsValueC;
+    if (GetMapModuleString(pKey, wsValueC)) {
+      wsValue = wsValueC;
+      return TRUE;
+    }
+  }
+  if (!bUseDefault) {
+    return FALSE;
+  }
+  void* pValue = NULL;
+  if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
+                                   XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
+    wsValue = (const FX_WCHAR*)pValue;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
+                            CFX_WideStringC& wsValue,
+                            FX_BOOL bUseDefault,
+                            FX_BOOL bProto) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  if (eAttr == XFA_ATTRIBUTE_Value) {
+    CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
+    if (pStr) {
+      wsValue = *pStr;
+      return TRUE;
+    }
+  } else {
+    if (GetMapModuleString(pKey, wsValue)) {
+      return TRUE;
+    }
+  }
+  if (!bUseDefault) {
+    return FALSE;
+  }
+  void* pValue = NULL;
+  if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
+                                   XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
+    wsValue = (CFX_WideStringC)(const FX_WCHAR*)pValue;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Node::SetObject(XFA_ATTRIBUTE eAttr,
+                             void* pData,
+                             XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  return SetUserData(pKey, pData, pCallbackInfo);
+}
+FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, void*& pData) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  pData = GetUserData(pKey);
+  return pData != NULL;
+}
+FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr,
+                            XFA_ATTRIBUTETYPE eType,
+                            void* pValue,
+                            FX_BOOL bNotify) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  OnChanging(eAttr, pValue, bNotify);
+  SetMapModuleValue(pKey, pValue);
+  OnChanged(eAttr, pValue, bNotify);
+  if (IsNeedSavingXMLNode()) {
+    FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
+    const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr);
+    if (pInfo) {
+      switch (eType) {
+        case XFA_ATTRIBUTETYPE_Enum:
+          ((IFDE_XMLElement*)m_pXMLNode)
+              ->SetString(
+                  pInfo->pName,
+                  XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)(uintptr_t)pValue)
+                      ->pName);
+          break;
+        case XFA_ATTRIBUTETYPE_Boolean:
+          ((IFDE_XMLElement*)m_pXMLNode)
+              ->SetString(pInfo->pName,
+                          pValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0"));
+          break;
+        case XFA_ATTRIBUTETYPE_Integer:
+          ((IFDE_XMLElement*)m_pXMLNode)
+              ->SetInteger(pInfo->pName, (int32_t)(uintptr_t)pValue);
+          break;
+        default:
+          FXSYS_assert(0);
+      }
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Node::GetValue(XFA_ATTRIBUTE eAttr,
+                            XFA_ATTRIBUTETYPE eType,
+                            FX_BOOL bUseDefault,
+                            void*& pValue) {
+  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
+  if (GetMapModuleValue(pKey, pValue)) {
+    return TRUE;
+  }
+  if (!bUseDefault) {
+    return FALSE;
+  }
+  return XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, eType,
+                                      m_ePacket);
+}
+static void XFA_DefaultFreeData(void* pData) {}
+static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {
+    XFA_DefaultFreeData, NULL};
+FX_BOOL CXFA_Node::SetUserData(void* pKey,
+                               void* pData,
+                               XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
+  SetMapModuleBuffer(pKey, &pData, sizeof(void*),
+                     pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData);
+  return TRUE;
+}
+FX_BOOL CXFA_Node::TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso) {
+  int32_t iBytes = 0;
+  if (!GetMapModuleBuffer(pKey, pData, iBytes, bProtoAlso)) {
+    return FALSE;
+  }
+  return iBytes == sizeof(void*) && FXSYS_memcpy(&pData, pData, iBytes);
+}
+FX_BOOL CXFA_Node::SetScriptContent(const CFX_WideString& wsContent,
+                                    const CFX_WideString& wsXMLValue,
+                                    FX_BOOL bNotify,
+                                    FX_BOOL bScriptModify,
+                                    FX_BOOL bSyncData) {
+  CXFA_Node* pNode = NULL;
+  CXFA_Node* pBindNode = NULL;
+  switch (GetObjectType()) {
+    case XFA_OBJECTTYPE_ContainerNode: {
+      if (XFA_FieldIsMultiListBox(this)) {
+        CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
+        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+        FXSYS_assert(pChildValue);
+        pChildValue->SetCData(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml"));
+        pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
+                                      bScriptModify, FALSE);
+        CXFA_Node* pBind = GetBindData();
+        if (bSyncData && pBind) {
+          CFX_WideStringArray wsSaveTextArray;
+          int32_t iSize = 0;
+          if (!wsContent.IsEmpty()) {
+            int32_t iStart = 0;
+            int32_t iLength = wsContent.GetLength();
+            int32_t iEnd = wsContent.Find(L'\n', iStart);
+            iEnd = (iEnd == -1) ? iLength : iEnd;
+            while (iEnd >= iStart) {
+              wsSaveTextArray.Add(wsContent.Mid(iStart, iEnd - iStart));
+              iStart = iEnd + 1;
+              if (iStart >= iLength) {
+                break;
+              }
+              iEnd = wsContent.Find(L'\n', iStart);
+              if (iEnd < 0) {
+                wsSaveTextArray.Add(wsContent.Mid(iStart, iLength - iStart));
+              }
+            }
+            iSize = wsSaveTextArray.GetSize();
+          }
+          if (iSize == 0) {
+            while (CXFA_Node* pChildNode =
+                       pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+              pBind->RemoveChild(pChildNode);
+            }
+          } else {
+            CXFA_NodeArray valueNodes;
+            int32_t iDatas = pBind->GetNodeList(
+                valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue);
+            if (iDatas < iSize) {
+              int32_t iAddNodes = iSize - iDatas;
+              CXFA_Node* pValueNodes = NULL;
+              while (iAddNodes-- > 0) {
+                pValueNodes =
+                    pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue);
+                pValueNodes->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value"));
+                pValueNodes->CreateXMLMappingNode();
+                pBind->InsertChild(pValueNodes);
+              }
+              pValueNodes = NULL;
+            } else if (iDatas > iSize) {
+              int32_t iDelNodes = iDatas - iSize;
+              while (iDelNodes-- > 0) {
+                pBind->RemoveChild(pBind->GetNodeItem(XFA_NODEITEM_FirstChild));
+              }
+            }
+            int32_t i = 0;
+            for (CXFA_Node* pValueNode =
+                     pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
+                 pValueNode; pValueNode = pValueNode->GetNodeItem(
+                                 XFA_NODEITEM_NextSibling)) {
+              pValueNode->SetAttributeValue(wsSaveTextArray[i],
+                                            wsSaveTextArray[i], FALSE);
+              i++;
+            }
+          }
+          CXFA_NodeArray nodeArray;
+          pBind->GetBindItems(nodeArray);
+          for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
+            CXFA_Node* pNode = nodeArray[i];
+            if (pNode == this) {
+              continue;
+            }
+            pNode->SetScriptContent(wsContent, wsContent, bNotify,
+                                    bScriptModify, FALSE);
+          }
+        }
+        break;
+      } else if (GetClassID() == XFA_ELEMENT_ExclGroup) {
+        pNode = this;
+      } else {
+        CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
+        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+        FXSYS_assert(pChildValue);
+        pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
+                                      bScriptModify, FALSE);
+      }
+      pBindNode = GetBindData();
+      if (pBindNode && bSyncData) {
+        pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
+                                    bScriptModify, FALSE);
+        CXFA_NodeArray nodeArray;
+        pBindNode->GetBindItems(nodeArray);
+        for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
+          CXFA_Node* pNode = nodeArray[i];
+          if (pNode == this) {
+            continue;
+          }
+          pNode->SetScriptContent(wsContent, wsContent, bNotify, TRUE, FALSE);
+        }
+      }
+      pBindNode = NULL;
+      break;
+    }
+    case XFA_OBJECTTYPE_ContentNode: {
+      CFX_WideString wsContentType;
+      if (GetClassID() == XFA_ELEMENT_ExData) {
+        GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
+        if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+          wsContentType = FX_WSTRC(L"");
+          SetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType);
+        }
+      }
+      CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!pContentRawDataNode) {
+        pContentRawDataNode =
+            CreateSamePacketNode((wsContentType.Equal(FX_WSTRC(L"text/xml")))
+                                     ? XFA_ELEMENT_Sharpxml
+                                     : XFA_ELEMENT_Sharptext);
+        InsertChild(pContentRawDataNode);
+      }
+      return pContentRawDataNode->SetScriptContent(
+          wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData);
+    } break;
+    case XFA_OBJECTTYPE_NodeC:
+    case XFA_OBJECTTYPE_TextNode:
+      pNode = this;
+      break;
+    case XFA_OBJECTTYPE_NodeV:
+      pNode = this;
+      if (bSyncData && GetPacketID() == XFA_XDPPACKET_Form) {
+        CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
+        if (pParent) {
+          pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
+        }
+        if (pParent && pParent->GetClassID() == XFA_ELEMENT_Value) {
+          pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
+          if (pParent && pParent->IsContainerNode()) {
+            pBindNode = pParent->GetBindData();
+            if (pBindNode) {
+              pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
+                                          bScriptModify, FALSE);
+            }
+          }
+        }
+      }
+      break;
+    default:
+      if (GetClassID() == XFA_ELEMENT_DataValue) {
+        pNode = this;
+        pBindNode = this;
+      }
+      break;
+  }
+  if (pNode) {
+    SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify);
+    if (pBindNode && bSyncData) {
+      CXFA_NodeArray nodeArray;
+      pBindNode->GetBindItems(nodeArray);
+      for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
+        CXFA_Node* pNode = nodeArray[i];
+        pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify,
+                                FALSE);
+      }
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Node::SetContent(const CFX_WideString& wsContent,
+                              const CFX_WideString& wsXMLValue,
+                              FX_BOOL bNotify,
+                              FX_BOOL bScriptModify,
+                              FX_BOOL bSyncData) {
+  return SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify,
+                          bSyncData);
+}
+CFX_WideString CXFA_Node::GetScriptContent(FX_BOOL bScriptModify) {
+  CFX_WideString wsContent;
+  return TryContent(wsContent, bScriptModify) ? wsContent : CFX_WideString();
+}
+CFX_WideString CXFA_Node::GetContent() {
+  return GetScriptContent();
+}
+FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent,
+                              FX_BOOL bScriptModify,
+                              FX_BOOL bProto) {
+  CXFA_Node* pNode = NULL;
+  switch (GetObjectType()) {
+    case XFA_OBJECTTYPE_ContainerNode:
+      if (GetClassID() == XFA_ELEMENT_ExclGroup) {
+        pNode = this;
+      } else {
+        CXFA_Node* pValue = GetChild(0, XFA_ELEMENT_Value);
+        if (!pValue) {
+          return FALSE;
+        }
+        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+        if (pChildValue && XFA_FieldIsMultiListBox(this)) {
+          pChildValue->SetAttribute(XFA_ATTRIBUTE_ContentType,
+                                    FX_WSTRC(L"text/xml"));
+        }
+        return pChildValue
+                   ? pChildValue->TryContent(wsContent, bScriptModify, bProto)
+                   : FALSE;
+      }
+      break;
+    case XFA_OBJECTTYPE_ContentNode: {
+      CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!pContentRawDataNode) {
+        XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
+        if (GetClassID() == XFA_ELEMENT_ExData) {
+          CFX_WideString wsContentType;
+          GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
+          if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
+            element = XFA_ELEMENT_SharpxHTML;
+          } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
+            element = XFA_ELEMENT_Sharpxml;
+          }
+        }
+        pContentRawDataNode = CreateSamePacketNode(element);
+        InsertChild(pContentRawDataNode);
+      }
+      return pContentRawDataNode->TryContent(wsContent, bScriptModify, bProto);
+    }
+    case XFA_OBJECTTYPE_NodeC:
+    case XFA_OBJECTTYPE_NodeV:
+    case XFA_OBJECTTYPE_TextNode:
+      pNode = this;
+    default:
+      if (GetClassID() == XFA_ELEMENT_DataValue) {
+        pNode = this;
+      }
+      break;
+  }
+  if (pNode) {
+    if (bScriptModify) {
+      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+      if (pScriptContext) {
+        m_pDocument->GetScriptContext()->AddNodesOfRunScript(this);
+      }
+    }
+    return TryCData(XFA_ATTRIBUTE_Value, wsContent, FALSE, bProto);
+  }
+  return FALSE;
+}
+CXFA_Node* CXFA_Node::GetModelNode() {
+  switch (GetPacketID()) {
+    case XFA_XDPPACKET_XDP:
+      return m_pDocument->GetRoot();
+    case XFA_XDPPACKET_Config:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
+    case XFA_XDPPACKET_Template:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
+    case XFA_XDPPACKET_Form:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
+    case XFA_XDPPACKET_Datasets:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
+    case XFA_XDPPACKET_LocaleSet:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet));
+    case XFA_XDPPACKET_ConnectionSet:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet));
+    case XFA_XDPPACKET_SourceSet:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet));
+    case XFA_XDPPACKET_Xdc:
+      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc));
+    default:
+      return this;
+  }
+}
+FX_BOOL CXFA_Node::TryNamespace(CFX_WideString& wsNamespace) {
+  wsNamespace.Empty();
+  if (GetObjectType() == XFA_OBJECTTYPE_ModelNode ||
+      GetClassID() == XFA_ELEMENT_Packet) {
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (!pXMLNode || pXMLNode->GetType() != FDE_XMLNODE_Element) {
+      return FALSE;
+    }
+    ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
+    return TRUE;
+  } else if (GetPacketID() == XFA_XDPPACKET_Datasets) {
+    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+    if (!pXMLNode) {
+      return FALSE;
+    }
+    if (pXMLNode->GetType() != FDE_XMLNODE_Element) {
+      return TRUE;
+    }
+    if (GetClassID() == XFA_ELEMENT_DataValue &&
+        GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) {
+      return XFA_FDEExtension_ResolveNamespaceQualifier(
+          (IFDE_XMLElement*)pXMLNode, GetCData(XFA_ATTRIBUTE_QualifiedName),
+          wsNamespace);
+    }
+    ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
+    return TRUE;
+  } else {
+    CXFA_Node* pModelNode = GetModelNode();
+    return pModelNode->TryNamespace(wsNamespace);
+  }
+}
+CXFA_Node* CXFA_Node::GetProperty(int32_t index,
+                                  XFA_ELEMENT eProperty,
+                                  FX_BOOL bCreateProperty) {
+  XFA_ELEMENT eElement = GetClassID();
+  FX_DWORD dwPacket = GetPacketID();
+  const XFA_PROPERTY* pProperty =
+      XFA_GetPropertyOfElement(eElement, eProperty, dwPacket);
+  if (pProperty == NULL || index >= pProperty->uOccur) {
+    return NULL;
+  }
+  CXFA_Node* pNode = m_pChild;
+  int32_t iCount = 0;
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() == eProperty) {
+      iCount++;
+      if (iCount > index) {
+        return pNode;
+      }
+    }
+  }
+  if (!bCreateProperty) {
+    return NULL;
+  }
+  if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) {
+    pNode = m_pChild;
+    for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      const XFA_PROPERTY* pExistProperty =
+          XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket);
+      if (pExistProperty && (pExistProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
+        return NULL;
+      }
+    }
+  }
+  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
+  const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(dwPacket);
+  CXFA_Node* pNewNode;
+  for (; iCount <= index; iCount++) {
+    pNewNode = pFactory->CreateNode(pPacket, eProperty);
+    if (!pNewNode) {
+      return NULL;
+    }
+    InsertChild(pNewNode, nullptr);
+    pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
+  }
+  return pNewNode;
+}
+int32_t CXFA_Node::CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild) {
+  CXFA_Node* pNode = m_pChild;
+  int32_t iCount = 0;
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
+      if (bOnlyChild) {
+        const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
+            GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+        if (pProperty) {
+          continue;
+        }
+      }
+      iCount++;
+    }
+  }
+  return iCount;
+}
+CXFA_Node* CXFA_Node::GetChild(int32_t index,
+                               XFA_ELEMENT eElement,
+                               FX_BOOL bOnlyChild) {
+  FXSYS_assert(index > -1);
+  CXFA_Node* pNode = m_pChild;
+  int32_t iCount = 0;
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
+      if (bOnlyChild) {
+        const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
+            GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+        if (pProperty) {
+          continue;
+        }
+      }
+      iCount++;
+      if (iCount > index) {
+        return pNode;
+      }
+    }
+  }
+  return NULL;
+}
+int32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
+  ASSERT(!pNode->m_pNext);
+  pNode->m_pParent = this;
+  FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
+  if (!bWasPurgeNode)
+    FXSYS_assert(false);
+
+  if (m_pChild == NULL || index == 0) {
+    if (index > 0) {
+      return -1;
+    }
+    pNode->m_pNext = m_pChild;
+    m_pChild = pNode;
+    index = 0;
+  } else if (index < 0) {
+    m_pLastChild->m_pNext = pNode;
+  } else {
+    CXFA_Node* pPrev = m_pChild;
+    int32_t iCount = 0;
+    while (++iCount != index && pPrev->m_pNext) {
+      pPrev = pPrev->m_pNext;
+    }
+    if (index > 0 && index != iCount) {
+      return -1;
+    }
+    pNode->m_pNext = pPrev->m_pNext;
+    pPrev->m_pNext = pNode;
+    index = iCount;
+  }
+  if (pNode->m_pNext == NULL) {
+    m_pLastChild = pNode;
+  }
+  ASSERT(m_pLastChild);
+  ASSERT(m_pLastChild->m_pNext == NULL);
+  pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (pNotify) {
+    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
+  }
+  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
+    FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
+    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index);
+    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
+  }
+  return index;
+}
+FX_BOOL CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
+  if (!pNode || pNode->m_pParent ||
+      (pBeforeNode && pBeforeNode->m_pParent != this)) {
+    FXSYS_assert(false);
+    return FALSE;
+  }
+  FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
+  if (!bWasPurgeNode)
+    FXSYS_assert(false);
+
+  int32_t nIndex = -1;
+  pNode->m_pParent = this;
+  if (m_pChild == NULL || pBeforeNode == m_pChild) {
+    pNode->m_pNext = m_pChild;
+    m_pChild = pNode;
+    nIndex = 0;
+  } else if (!pBeforeNode) {
+    pNode->m_pNext = m_pLastChild->m_pNext;
+    m_pLastChild->m_pNext = pNode;
+  } else {
+    nIndex = 1;
+    CXFA_Node* pPrev = m_pChild;
+    while (pPrev->m_pNext != pBeforeNode) {
+      pPrev = pPrev->m_pNext;
+      nIndex++;
+    }
+    pNode->m_pNext = pPrev->m_pNext;
+    pPrev->m_pNext = pNode;
+  }
+  if (pNode->m_pNext == NULL) {
+    m_pLastChild = pNode;
+  }
+  ASSERT(m_pLastChild);
+  ASSERT(m_pLastChild->m_pNext == NULL);
+  pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (pNotify) {
+    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
+  }
+  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
+    FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
+    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex);
+    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() {
+  if (!m_pParent) {
+    return NULL;
+  }
+  for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling;
+       pSibling = pSibling->m_pNext) {
+    if (pSibling->m_pNext == this) {
+      return pSibling;
+    }
+  }
+  return NULL;
+}
+FX_BOOL CXFA_Node::RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify) {
+  if (pNode == NULL || pNode->m_pParent != this) {
+    FXSYS_assert(FALSE);
+    return FALSE;
+  }
+  if (m_pChild == pNode) {
+    m_pChild = pNode->m_pNext;
+    if (m_pLastChild == pNode) {
+      m_pLastChild = pNode->m_pNext;
+    }
+    pNode->m_pNext = NULL;
+    pNode->m_pParent = NULL;
+  } else {
+    CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling();
+    pPrev->m_pNext = pNode->m_pNext;
+    if (m_pLastChild == pNode) {
+      m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev;
+    }
+    pNode->m_pNext = NULL;
+    pNode->m_pParent = NULL;
+  }
+  ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL);
+  OnRemoved(this, pNode, bNotify);
+  pNode->SetFlag(XFA_NODEFLAG_HasRemoved);
+  m_pDocument->AddPurgeNode(pNode);
+  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
+    if (pNode->IsAttributeInXML()) {
+      FXSYS_assert(pNode->m_pXMLNode == m_pXMLNode &&
+                   m_pXMLNode->GetType() == FDE_XMLNODE_Element);
+      if (pNode->m_pXMLNode->GetType() == FDE_XMLNODE_Element) {
+        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)(pNode->m_pXMLNode);
+        CFX_WideStringC wsAttributeName =
+            pNode->GetCData(XFA_ATTRIBUTE_QualifiedName);
+        pXMLElement->RemoveAttribute(wsAttributeName.GetPtr());
+      }
+      CFX_WideString wsName;
+      pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
+      IFDE_XMLElement* pNewXMLElement = IFDE_XMLElement::Create(wsName);
+      CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value);
+      if (!wsValue.IsEmpty()) {
+        pNewXMLElement->SetTextData(wsValue);
+      }
+      pNode->m_pXMLNode = pNewXMLElement;
+      pNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
+    } else {
+      m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode);
+    }
+    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_Node::GetFirstChildByName(const CFX_WideStringC& wsName) const {
+  return GetFirstChildByName(
+      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
+                                                     wsName.GetLength()));
+}
+CXFA_Node* CXFA_Node::GetFirstChildByName(FX_DWORD dwNameHash) const {
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetNameHash() == dwNameHash) {
+      return pNode;
+    }
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const {
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() == eElement) {
+      return pNode;
+    }
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_DWORD dwNameHash) const {
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetNameHash() == dwNameHash) {
+      return pNode;
+    }
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_Node::GetNextSameNameSibling(
+    const CFX_WideStringC& wsNodeName) const {
+  return GetNextSameNameSibling(
+      wsNodeName.IsEmpty() ? 0
+                           : FX_HashCode_String_GetW(wsNodeName.GetPtr(),
+                                                     wsNodeName.GetLength()));
+}
+CXFA_Node* CXFA_Node::GetNextSameClassSibling(XFA_ELEMENT eElement) const {
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() == eElement) {
+      return pNode;
+    }
+  }
+  return NULL;
+}
+int32_t CXFA_Node::GetNodeSameNameIndex() const {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return -1;
+  }
+  return pScriptContext->GetIndexByName(const_cast<CXFA_Node*>(this));
+}
+int32_t CXFA_Node::GetNodeSameClassIndex() const {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return -1;
+  }
+  return pScriptContext->GetIndexByClassName(const_cast<CXFA_Node*>(this));
+}
+void CXFA_Node::GetSOMExpression(CFX_WideString& wsSOMExpression) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  pScriptContext->GetSomExpression(this, wsSOMExpression);
+}
+CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
+  CXFA_Node* pInstanceMgr = NULL;
+  if (m_ePacket == XFA_XDPPACKET_Form) {
+    CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+    if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) {
+      return pInstanceMgr;
+    }
+    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
+         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
+      XFA_ELEMENT eType = pNode->GetClassID();
+      if ((eType == XFA_ELEMENT_Subform || eType == XFA_ELEMENT_SubformSet) &&
+          pNode->m_dwNameHash != m_dwNameHash) {
+        break;
+      }
+      if (eType == XFA_ELEMENT_InstanceManager) {
+        CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
+        CFX_WideStringC wsInstName = pNode->GetCData(XFA_ATTRIBUTE_Name);
+        if (wsInstName.GetLength() > 0 && wsInstName.GetAt(0) == '_' &&
+            wsInstName.Mid(1) == wsName) {
+          pInstanceMgr = pNode;
+        }
+        break;
+      }
+    }
+  }
+  return pInstanceMgr;
+}
+CXFA_Node* CXFA_Node::GetOccurNode() {
+  return GetFirstChildByClass(XFA_ELEMENT_Occur);
+}
+FX_BOOL CXFA_Node::HasFlag(FX_DWORD dwFlag) const {
+  if (m_uFlags & dwFlag) {
+    return TRUE;
+  }
+  switch (dwFlag) {
+    case XFA_NODEFLAG_HasRemoved:
+      return m_pParent && m_pParent->HasFlag(dwFlag);
+    default:
+      break;
+  }
+  return FALSE;
+}
+void CXFA_Node::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn, FX_BOOL bNotify) {
+  if (bOn) {
+    switch (dwFlag) {
+      case XFA_NODEFLAG_Initialized:
+        if (bNotify && !HasFlag(XFA_NODEFLAG_Initialized)) {
+          IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+          if (pNotify) {
+            pNotify->OnNodeEvent(this, XFA_NODEEVENT_Ready);
+          }
+        }
+        break;
+      default:
+        break;
+    }
+    m_uFlags |= dwFlag;
+  } else {
+    m_uFlags &= ~dwFlag;
+  }
+}
+FX_BOOL CXFA_Node::IsAttributeInXML() {
+  return GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData;
+}
+void CXFA_Node::OnRemoved(CXFA_Node* pParent,
+                          CXFA_Node* pRemoved,
+                          FX_BOOL bNotify) {
+  if (bNotify && pParent) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (pNotify) {
+      pNotify->OnNodeEvent(pParent, XFA_NODEEVENT_ChildRemoved, pRemoved);
+    }
+  }
+}
+void CXFA_Node::OnChanging(XFA_ATTRIBUTE eAttr,
+                           void* pNewValue,
+                           FX_BOOL bNotify) {
+  if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (pNotify) {
+      pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanging,
+                           (void*)(uintptr_t)eAttr, pNewValue);
+    }
+  }
+}
+void CXFA_Node::OnChanged(XFA_ATTRIBUTE eAttr,
+                          void* pNewValue,
+                          FX_BOOL bNotify,
+                          FX_BOOL bScriptModify) {
+  if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
+    Script_Attribute_SendAttributeChangeMessage((void*)(uintptr_t)eAttr,
+                                                pNewValue, bScriptModify);
+  }
+}
+int32_t CXFA_Node::execSingleEventByName(const CFX_WideStringC& wsEventName,
+                                         XFA_ELEMENT eElementType) {
+  int32_t iRet = XFA_EVENTERROR_NotExist;
+  const XFA_ExecEventParaInfo* eventParaInfo =
+      GetEventParaInfoByName(wsEventName);
+  if (eventParaInfo) {
+    uint32_t validFlags = eventParaInfo->m_validFlags;
+    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+    if (!pNotify) {
+      return iRet;
+    }
+    if (validFlags == 1) {
+      iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType);
+    } else if (validFlags == 2) {
+      iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                           FALSE, FALSE);
+    } else if (validFlags == 3) {
+      if (eElementType == XFA_ELEMENT_Subform) {
+        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                             FALSE, FALSE);
+      }
+    } else if (validFlags == 4) {
+      if (eElementType == XFA_ELEMENT_ExclGroup ||
+          eElementType == XFA_ELEMENT_Field) {
+        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
+        if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
+          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                               FALSE, FALSE);
+        }
+        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                             FALSE, FALSE);
+      }
+    } else if (validFlags == 5) {
+      if (eElementType == XFA_ELEMENT_Field) {
+        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                             FALSE, FALSE);
+      }
+    } else if (validFlags == 6) {
+      CXFA_WidgetData* pWidgetData = GetWidgetData();
+      if (pWidgetData) {
+        CXFA_Node* pUINode = pWidgetData->GetUIChild();
+        if (pUINode->m_eNodeClass == XFA_ELEMENT_Signature) {
+          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                               FALSE, FALSE);
+        }
+      }
+    } else if (validFlags == 7) {
+      CXFA_WidgetData* pWidgetData = GetWidgetData();
+      if (pWidgetData) {
+        CXFA_Node* pUINode = pWidgetData->GetUIChild();
+        if ((pUINode->m_eNodeClass == XFA_ELEMENT_ChoiceList) &&
+            (!pWidgetData->IsListBox())) {
+          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
+                                               FALSE, FALSE);
+        }
+      }
+    }
+  }
+  return iRet;
+}
+void CXFA_Node::UpdateNameHash() {
+  const XFA_NOTSUREATTRIBUTE* pNotsure =
+      XFA_GetNotsureAttribute(GetClassID(), XFA_ATTRIBUTE_Name);
+  if (!pNotsure || pNotsure->eType == XFA_ATTRIBUTETYPE_Cdata) {
+    CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
+    m_dwNameHash =
+        wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
+                                                       wsName.GetLength());
+  } else if (pNotsure->eType == XFA_ATTRIBUTETYPE_Enum) {
+    CFX_WideStringC wsName =
+        XFA_GetAttributeEnumByID(GetEnum(XFA_ATTRIBUTE_Name))->pName;
+    m_dwNameHash =
+        wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
+                                                       wsName.GetLength());
+  }
+}
+IFDE_XMLNode* CXFA_Node::CreateXMLMappingNode() {
+  if (!m_pXMLNode) {
+    CFX_WideStringC wsTag = GetCData(XFA_ATTRIBUTE_Name);
+    m_pXMLNode = IFDE_XMLElement::Create(wsTag);
+    SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+  }
+  return m_pXMLNode;
+}
+FX_BOOL CXFA_Node::IsNeedSavingXMLNode() {
+  return m_pXMLNode && (GetPacketID() == XFA_XDPPACKET_Datasets ||
+                        GetClassID() == XFA_ELEMENT_Xfa);
+}
+
+XFA_MAPMODULEDATA* CXFA_Node::CreateMapModuleData() {
+  if (!m_pMapModuleData)
+    m_pMapModuleData = new XFA_MAPMODULEDATA;
+  return m_pMapModuleData;
+}
+
+XFA_MAPMODULEDATA* CXFA_Node::GetMapModuleData() const {
+  return m_pMapModuleData;
+}
+
+void CXFA_Node::SetMapModuleValue(void* pKey, void* pValue) {
+  XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
+  pModule->m_ValueMap.SetAt(pKey, pValue);
+}
+
+FX_BOOL CXFA_Node::GetMapModuleValue(void* pKey, void*& pValue) {
+  CXFA_Node* pNode = this;
+  while (pNode) {
+    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
+    if (pModule && pModule->m_ValueMap.Lookup(pKey, pValue)) {
+      return TRUE;
+    }
+    pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets
+                ? pNode->GetTemplateNode()
+                : NULL;
+  }
+  return FALSE;
+}
+void CXFA_Node::SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue) {
+  SetMapModuleBuffer(pKey, (void*)wsValue.GetPtr(),
+                     wsValue.GetLength() * sizeof(FX_WCHAR));
+}
+FX_BOOL CXFA_Node::GetMapModuleString(void* pKey, CFX_WideStringC& wsValue) {
+  void* pValue;
+  int32_t iBytes;
+  if (!GetMapModuleBuffer(pKey, pValue, iBytes)) {
+    return FALSE;
+  }
+  wsValue = CFX_WideStringC((const FX_WCHAR*)pValue, iBytes / sizeof(FX_WCHAR));
+  return TRUE;
+}
+void CXFA_Node::SetMapModuleBuffer(
+    void* pKey,
+    void* pValue,
+    int32_t iBytes,
+    XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
+  XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
+  XFA_MAPDATABLOCK*& pBuffer = pModule->m_BufferMap[pKey];
+  if (pBuffer == NULL) {
+    pBuffer =
+        (XFA_MAPDATABLOCK*)FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes);
+  } else if (pBuffer->iBytes != iBytes) {
+    if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+      pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+    }
+    pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(uint8_t, pBuffer,
+                                            sizeof(XFA_MAPDATABLOCK) + iBytes);
+  } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+    pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+  }
+  if (pBuffer == NULL) {
+    return;
+  }
+  pBuffer->pCallbackInfo = pCallbackInfo;
+  pBuffer->iBytes = iBytes;
+  FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes);
+}
+FX_BOOL CXFA_Node::GetMapModuleBuffer(void* pKey,
+                                      void*& pValue,
+                                      int32_t& iBytes,
+                                      FX_BOOL bProtoAlso) const {
+  XFA_MAPDATABLOCK* pBuffer = NULL;
+  const CXFA_Node* pNode = this;
+  while (pNode) {
+    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
+    if (pModule && pModule->m_BufferMap.Lookup(pKey, pBuffer)) {
+      break;
+    }
+    pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
+                ? pNode->GetTemplateNode()
+                : NULL;
+  }
+  if (pBuffer == NULL) {
+    return FALSE;
+  }
+  pValue = pBuffer->GetData();
+  iBytes = pBuffer->iBytes;
+  return TRUE;
+}
+FX_BOOL CXFA_Node::HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso) {
+  CXFA_Node* pNode = this;
+  while (pNode) {
+    void* pVal;
+    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
+    if (pModule &&
+        (pModule->m_ValueMap.Lookup(pKey, pVal) ||
+         pModule->m_BufferMap.Lookup(pKey, (XFA_MAPDATABLOCK*&)pVal))) {
+      return TRUE;
+    }
+    pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
+                ? pNode->GetTemplateNode()
+                : NULL;
+  }
+  return FALSE;
+}
+void CXFA_Node::RemoveMapModuleKey(void* pKey) {
+  XFA_MAPMODULEDATA* pModule = GetMapModuleData();
+  if (!pModule)
+    return;
+
+  if (pKey) {
+    XFA_MAPDATABLOCK* pBuffer = NULL;
+    pModule->m_BufferMap.Lookup(pKey, pBuffer);
+    if (pBuffer) {
+      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+      }
+      FX_Free(pBuffer);
+    }
+    pModule->m_BufferMap.RemoveKey(pKey);
+    pModule->m_ValueMap.RemoveKey(pKey);
+  } else {
+    XFA_MAPDATABLOCK* pBuffer;
+    FX_POSITION posBuffer = pModule->m_BufferMap.GetStartPosition();
+    while (posBuffer) {
+      pModule->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer);
+      if (pBuffer) {
+        if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+          pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+        }
+        FX_Free(pBuffer);
+      }
+    }
+    pModule->m_BufferMap.RemoveAll();
+    pModule->m_ValueMap.RemoveAll();
+    delete pModule;
+  }
+}
+void CXFA_Node::MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr) {
+  XFA_MAPMODULEDATA* pDstModuleData =
+      static_cast<CXFA_Node*>(pDstModule)->CreateMapModuleData();
+  XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData();
+  if (!pSrcModuleData) {
+    return;
+  }
+  FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition();
+  while (psValue) {
+    void* pKey;
+    void* pValue;
+    pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue);
+    if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) {
+      pDstModuleData->m_ValueMap.SetAt(pKey, pValue);
+    }
+  }
+  FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition();
+  while (psBuffer) {
+    void* pKey;
+    XFA_MAPDATABLOCK* pSrcBuffer;
+    pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer);
+    XFA_MAPDATABLOCK*& pBuffer = pDstModuleData->m_BufferMap[pKey];
+    if (pBuffer && !bUseSrcAttr) {
+      continue;
+    }
+    if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree &&
+        !pSrcBuffer->pCallbackInfo->pCopy) {
+      if (pBuffer) {
+        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+        pDstModuleData->m_BufferMap.RemoveKey(pKey);
+      }
+      continue;
+    }
+    if (pBuffer == NULL) {
+      pBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
+          uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
+    } else if (pBuffer->iBytes != pSrcBuffer->iBytes) {
+      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+      }
+      pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(
+          uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
+    } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
+      pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
+    }
+    if (pBuffer == NULL) {
+      continue;
+    }
+    pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
+    pBuffer->iBytes = pSrcBuffer->iBytes;
+    FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes);
+    if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) {
+      pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData());
+    }
+  }
+}
+void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, void* pKey) {
+  if (!pDstModule) {
+    return;
+  }
+  FX_BOOL bNeedMove = TRUE;
+  if (!pKey) {
+    bNeedMove = FALSE;
+  }
+  if (pDstModule->GetClassID() != GetClassID()) {
+    bNeedMove = FALSE;
+  }
+  XFA_MAPMODULEDATA* pSrcModuleData = NULL;
+  XFA_MAPMODULEDATA* pDstModuleData = NULL;
+  if (bNeedMove) {
+    pSrcModuleData = GetMapModuleData();
+    if (!pSrcModuleData) {
+      bNeedMove = FALSE;
+    }
+    pDstModuleData = pDstModule->CreateMapModuleData();
+  }
+  if (bNeedMove) {
+    void* pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey);
+    if (pBufferBlockData) {
+      pSrcModuleData->m_BufferMap.RemoveKey(pKey);
+      pDstModuleData->m_BufferMap.RemoveKey(pKey);
+      pDstModuleData->m_BufferMap.SetAt(pKey,
+                                        (XFA_MAPDATABLOCK*)pBufferBlockData);
+    }
+  }
+  if (pDstModule->GetObjectType() == XFA_OBJECTTYPE_NodeV) {
+    CFX_WideString wsValue = pDstModule->GetScriptContent(FALSE);
+    CFX_WideString wsFormatValue(wsValue);
+    CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData();
+    if (pWidgetData) {
+      pWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
+    }
+    pDstModule->SetScriptContent(wsValue, wsFormatValue, TRUE, TRUE);
+  }
+}
+void CXFA_Node::MoveBufferMapData(CXFA_Node* pSrcModule,
+                                  CXFA_Node* pDstModule,
+                                  void* pKey,
+                                  FX_BOOL bRecursive) {
+  if (!pSrcModule || !pDstModule || !pKey) {
+    return;
+  }
+  if (bRecursive) {
+    CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild);
+    CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pSrcChild && pDstChild;
+         pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling),
+         pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      MoveBufferMapData(pSrcChild, pDstChild, pKey, TRUE);
+    }
+  }
+  pSrcModule->MoveBufferMapData(pDstModule, pKey);
+}
+CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument)
+    : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) {
+  m_pDocument->GetScriptContext()->CacheList(this);
+}
+CXFA_Node* CXFA_NodeList::NamedItem(const CFX_WideStringC& wsName) {
+  int32_t iCount = GetLength();
+  FX_DWORD dwHashCode =
+      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_Node* ret = Item(i);
+    if (dwHashCode == ret->GetNameHash()) {
+      return ret;
+    }
+  }
+  return NULL;
+}
+void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+    if (pNode) {
+      Append(pNode);
+    } else {
+      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"append");
+  }
+}
+void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 2) {
+    CXFA_Node* pNewNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+    CXFA_Node* pBeforeNode = static_cast<CXFA_Node*>(pArguments->GetObject(1));
+    if (pNewNode) {
+      Insert(pNewNode, pBeforeNode);
+    } else {
+      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insert");
+  }
+}
+void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+    if (pNode) {
+      Remove(pNode);
+    } else {
+      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remove");
+  }
+}
+void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    int32_t iIndex = pArguments->GetInt32(0);
+    if ((iIndex >= 0) && (iIndex + 1 <= GetLength())) {
+      FXJSE_Value_Set(
+          pArguments->GetReturnValue(),
+          m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex)));
+    } else {
+      ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    }
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"item");
+  }
+}
+void CXFA_NodeList::Script_TreelistClass_NamedItem(
+    CFXJSE_Arguments* pArguments) {
+  int32_t argc = pArguments->GetLength();
+  if (argc == 1) {
+    CFX_ByteString szName = pArguments->GetUTF8String(0);
+    CXFA_Node* pNode =
+        NamedItem(CFX_WideString::FromUTF8(szName, szName.GetLength()));
+    if (!pNode) {
+      return;
+    }
+    FXJSE_Value_Set(pArguments->GetReturnValue(),
+                    m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"namedItem");
+  }
+}
+void CXFA_NodeList::Script_ListClass_Length(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute) {
+  if (!bSetting) {
+    FXJSE_Value_SetInteger(hValue, GetLength());
+  } else {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+  }
+}
+CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument)
+    : CXFA_NodeList(pDocument) {}
+void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray& srcArray) {
+  if (srcArray.GetSize() > 0) {
+    m_array.Copy(srcArray);
+  }
+}
+int32_t CXFA_ArrayNodeList::GetLength() {
+  return m_array.GetSize();
+}
+FX_BOOL CXFA_ArrayNodeList::Append(CXFA_Node* pNode) {
+  m_array.Add(pNode);
+  return TRUE;
+}
+FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode,
+                                   CXFA_Node* pBeforeNode) {
+  if (pBeforeNode == NULL) {
+    m_array.Add(pNewNode);
+  } else {
+    int32_t iSize = m_array.GetSize();
+    for (int32_t i = 0; i < iSize; ++i) {
+      if (m_array[i] == pBeforeNode) {
+        m_array.InsertAt(i, pNewNode);
+        break;
+      }
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_ArrayNodeList::Remove(CXFA_Node* pNode) {
+  int32_t iSize = m_array.GetSize();
+  for (int32_t i = 0; i < iSize; ++i) {
+    if (m_array[i] == pNode) {
+      m_array.RemoveAt(i);
+      break;
+    }
+  }
+  return TRUE;
+}
+CXFA_Node* CXFA_ArrayNodeList::Item(int32_t iIndex) {
+  int32_t iSize = m_array.GetSize();
+  if (iIndex >= 0 && iIndex < iSize) {
+    return m_array[iIndex];
+  }
+  return NULL;
+}
+CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument,
+                                         CXFA_Node* pAttachNode)
+    : CXFA_NodeList(pDocument) {
+  m_pAttachNode = pAttachNode;
+}
+int32_t CXFA_AttachNodeList::GetLength() {
+  return m_pAttachNode->CountChildren(
+      XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
+}
+FX_BOOL CXFA_AttachNodeList::Append(CXFA_Node* pNode) {
+  CXFA_Node* pParent = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParent) {
+    pParent->RemoveChild(pNode);
+  }
+  return m_pAttachNode->InsertChild(pNode);
+}
+FX_BOOL CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode,
+                                    CXFA_Node* pBeforeNode) {
+  CXFA_Node* pParent = pNewNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParent) {
+    pParent->RemoveChild(pNewNode);
+  }
+  return m_pAttachNode->InsertChild(pNewNode, pBeforeNode);
+}
+FX_BOOL CXFA_AttachNodeList::Remove(CXFA_Node* pNode) {
+  return m_pAttachNode->RemoveChild(pNode);
+}
+CXFA_Node* CXFA_AttachNodeList::Item(int32_t iIndex) {
+  return m_pAttachNode->GetChild(
+      iIndex, XFA_ELEMENT_UNKNOWN,
+      m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
+}
diff --git a/xfa/fxfa/parser/xfa_objectacc_imp.cpp b/xfa/fxfa/parser/xfa_objectacc_imp.cpp
new file mode 100644
index 0000000..5bf368b
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_objectacc_imp.cpp
@@ -0,0 +1,3760 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+#include "xfa/include/fxbarcode/BC_BarCode.h"
+
+static FX_ARGB XFA_WStringToColor(const CFX_WideStringC& wsValue) {
+  uint8_t r = 0, g = 0, b = 0;
+  if (wsValue.GetLength() == 0) {
+    return 0xff000000;
+  }
+  int cc = 0;
+  const FX_WCHAR* str = wsValue.GetPtr();
+  int len = wsValue.GetLength();
+  while (XFA_IsSpace(str[cc]) && cc < len) {
+    cc++;
+  }
+  if (cc >= len) {
+    return 0xff000000;
+  }
+  while (cc < len) {
+    if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
+      break;
+    }
+    r = r * 10 + str[cc] - '0';
+    cc++;
+  }
+  if (cc < len && str[cc] == ',') {
+    cc++;
+    while (XFA_IsSpace(str[cc]) && cc < len) {
+      cc++;
+    }
+    while (cc < len) {
+      if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
+        break;
+      }
+      g = g * 10 + str[cc] - '0';
+      cc++;
+    }
+    if (cc < len && str[cc] == ',') {
+      cc++;
+      while (XFA_IsSpace(str[cc]) && cc < len) {
+        cc++;
+      }
+      while (cc < len) {
+        if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
+          break;
+        }
+        b = b * 10 + str[cc] - '0';
+        cc++;
+      }
+    }
+  }
+  return (0xff << 24) | (r << 16) | (g << 8) | b;
+}
+XFA_ELEMENT CXFA_Data::GetClassID() const {
+  return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN;
+}
+FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr,
+                              FX_FLOAT& fValue,
+                              FX_BOOL bUseDefault) const {
+  CXFA_Measurement ms;
+  if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) {
+    fValue = ms.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) {
+  CXFA_Measurement ms(fValue, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(eAttr, ms);
+}
+CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+CXFA_Fill::~CXFA_Fill() {}
+int32_t CXFA_Fill::GetPresence() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+}
+void CXFA_Fill::SetColor(FX_ARGB color) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(color, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+}
+FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE)) {
+      return XFA_WStringToColor(wsColor);
+    }
+  }
+  if (bText) {
+    return 0xFF000000;
+  }
+  return 0xFFFFFFFF;
+}
+int32_t CXFA_Fill::GetFillType() {
+  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChild) {
+    int32_t eType = pChild->GetClassID();
+    if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras) {
+      return eType;
+    }
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return XFA_ELEMENT_Solid;
+}
+int32_t CXFA_Fill::GetPattern(FX_ARGB& foreColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    foreColor = XFA_WStringToColor(wsColor);
+  } else {
+    foreColor = 0xFF000000;
+  }
+  return pNode->GetEnum(XFA_ATTRIBUTE_Type);
+}
+int32_t CXFA_Fill::GetStipple(FX_ARGB& stippleColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
+  int32_t eAttr = 50;
+  pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    stippleColor = XFA_WStringToColor(wsColor);
+  } else {
+    stippleColor = 0xFF000000;
+  }
+  return eAttr;
+}
+int32_t CXFA_Fill::GetLinear(FX_ARGB& endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
+  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    endColor = XFA_WStringToColor(wsColor);
+  } else {
+    endColor = 0xFF000000;
+  }
+  return eAttr;
+}
+int32_t CXFA_Fill::GetRadial(FX_ARGB& endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
+  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
+  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
+    CFX_WideStringC wsColor;
+    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
+    endColor = XFA_WStringToColor(wsColor);
+  } else {
+    endColor = 0xFF000000;
+  }
+  return eAttr;
+}
+FX_BOOL CXFA_Fill::SetPresence(int32_t iPresence) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
+}
+FX_BOOL CXFA_Fill::SetFillType(int32_t iType) {
+  return FALSE;
+}
+FX_BOOL CXFA_Fill::SetPattern(int32_t iPattern, FX_ARGB foreColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
+  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(foreColor, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iPattern);
+}
+FX_BOOL CXFA_Fill::SetStipple(int32_t iStipple, FX_ARGB stippleColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
+  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(stippleColor, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+  return pNode->SetEnum(XFA_ATTRIBUTE_Rate, (XFA_ATTRIBUTEENUM)iStipple);
+}
+FX_BOOL CXFA_Fill::SetLinear(int32_t iLinear, FX_ARGB endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
+  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(endColor, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iLinear);
+}
+FX_BOOL CXFA_Fill::SetRadial(int32_t iRadial, FX_ARGB endColor) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
+  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(endColor, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iRadial);
+}
+CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
+}
+FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset);
+}
+FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset);
+}
+FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT& fInset,
+                                    FX_FLOAT fDefInset) const {
+  fInset = fDefInset;
+  return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
+}
+FX_BOOL CXFA_Margin::SetLeftInset(FX_FLOAT fInset) {
+  return SetMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
+}
+FX_BOOL CXFA_Margin::SetTopInset(FX_FLOAT fInset) {
+  return SetMeasure(XFA_ATTRIBUTE_TopInset, fInset);
+}
+FX_BOOL CXFA_Margin::SetRightInset(FX_FLOAT fInset) {
+  return SetMeasure(XFA_ATTRIBUTE_RightInset, fInset);
+}
+FX_BOOL CXFA_Margin::SetBottomInset(FX_FLOAT fInset) {
+  return SetMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
+}
+CXFA_Font::CXFA_Font(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+FX_FLOAT CXFA_Font::GetBaselineShift() {
+  return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Font::GetHorizontalScale() {
+  CFX_WideString wsValue;
+  m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
+  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
+  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
+}
+FX_FLOAT CXFA_Font::GetVerticalScale() {
+  CFX_WideString wsValue;
+  m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
+  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
+  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
+}
+FX_FLOAT CXFA_Font::GetLetterSpacing() {
+  CFX_WideStringC wsValue;
+  if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue)) {
+    return 0;
+  }
+  CXFA_Measurement ms(wsValue);
+  if (ms.GetUnit() == XFA_UNIT_Em) {
+    return ms.GetValue() * GetFontSize();
+  }
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+int32_t CXFA_Font::GetLineThrough() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue);
+  return iValue;
+}
+int32_t CXFA_Font::GetLineThroughPeriod() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_LineThroughPeriod, eAttr);
+  return eAttr;
+}
+int32_t CXFA_Font::GetOverline() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_Overline, iValue);
+  return iValue;
+}
+int32_t CXFA_Font::GetOverlinePeriod() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_OverlinePeriod, eAttr);
+  return eAttr;
+}
+int32_t CXFA_Font::GetUnderline() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue);
+  return iValue;
+}
+int32_t CXFA_Font::GetUnderlinePeriod() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr);
+  return eAttr;
+}
+FX_FLOAT CXFA_Font::GetFontSize() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+void CXFA_Font::GetTypeface(CFX_WideStringC& wsTypeFace) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace);
+}
+FX_BOOL CXFA_Font::IsBold() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr);
+  return eAttr == XFA_ATTRIBUTEENUM_Bold;
+}
+FX_BOOL CXFA_Font::IsItalic() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr);
+  return eAttr == XFA_ATTRIBUTEENUM_Italic;
+}
+FX_BOOL CXFA_Font::IsUseKerning() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_KerningMode, eAttr);
+  return eAttr == XFA_ATTRIBUTEENUM_Pair;
+}
+void CXFA_Font::SetColor(FX_ARGB color) {
+  CXFA_Fill fill(m_pNode->GetProperty(0, XFA_ELEMENT_Fill));
+  fill.SetColor(color);
+}
+FX_ARGB CXFA_Font::GetColor() {
+  CXFA_Fill fill(m_pNode->GetChild(0, XFA_ELEMENT_Fill));
+  return fill ? fill.GetColor(TRUE) : 0xFF000000;
+}
+FX_BOOL CXFA_Font::SetBaselineShift(FX_FLOAT fBaselineShift) {
+  CXFA_Measurement ms(fBaselineShift, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_BaselineShift, ms);
+}
+FX_BOOL CXFA_Font::SetHorizontalScale(FX_FLOAT fHorizontalScale) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%d", (int32_t)fHorizontalScale);
+  return m_pNode->SetCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
+}
+FX_BOOL CXFA_Font::SetVerticalScale(FX_FLOAT fVerticalScale) {
+  CFX_WideString wsValue;
+  wsValue.Format(L"%d", (int32_t)fVerticalScale);
+  return m_pNode->SetCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
+}
+FX_BOOL CXFA_Font::SetLetterSpacing(FX_FLOAT fLetterSpacing, XFA_UNIT eUnit) {
+  return FALSE;
+}
+FX_BOOL CXFA_Font::SetLineThrough(int32_t iLineThrough) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_LineThrough, iLineThrough);
+}
+FX_BOOL CXFA_Font::SetLineThroughPeriod(int32_t iLineThroughPeriod) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_LineThroughPeriod,
+                          (XFA_ATTRIBUTEENUM)iLineThroughPeriod);
+}
+FX_BOOL CXFA_Font::SetOverline(int32_t iOverline) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_Overline, iOverline);
+}
+FX_BOOL CXFA_Font::SetOverlinePeriod(int32_t iOverlinePeriod) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_OverlinePeriod,
+                          (XFA_ATTRIBUTEENUM)iOverlinePeriod);
+}
+FX_BOOL CXFA_Font::SetUnderline(int32_t iUnderline) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_Underline, iUnderline);
+}
+FX_BOOL CXFA_Font::SetUnderlinePeriod(int32_t iUnderlinePeriod) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_UnderlinePeriod,
+                          (XFA_ATTRIBUTEENUM)iUnderlinePeriod);
+}
+CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Caption::GetPresence() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr);
+  return eAttr;
+}
+int32_t CXFA_Caption::GetPlacementType() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr);
+  return eAttr;
+}
+FX_FLOAT CXFA_Caption::GetReserve() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+CXFA_Margin CXFA_Caption::GetMargin() {
+  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL);
+}
+CXFA_Font CXFA_Caption::GetFont() {
+  return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL);
+}
+CXFA_Value CXFA_Caption::GetValue() {
+  return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL);
+}
+CXFA_Para CXFA_Caption::GetPara() {
+  return CXFA_Para(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Para) : NULL);
+}
+FX_BOOL CXFA_Caption::SetPresence(int32_t iPresence) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
+}
+FX_BOOL CXFA_Caption::SetPlacementType(int32_t iType) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Placement, (XFA_ATTRIBUTEENUM)iType);
+}
+FX_BOOL CXFA_Caption::SetReserve(FX_FLOAT fReserve) {
+  CXFA_Measurement ms(fReserve, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_Reserve, ms);
+}
+CXFA_Para::CXFA_Para(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Para::GetHorizontalAlign() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr);
+  return eAttr;
+}
+int32_t CXFA_Para::GetVerticalAlign() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr);
+  return eAttr;
+}
+FX_FLOAT CXFA_Para::GetLineHeight() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Para::GetMarginLeft() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Para::GetMarginRight() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+int32_t CXFA_Para::GetOrphans() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_Orphans, iValue);
+  return iValue;
+}
+FX_FLOAT CXFA_Para::GetRadixOffset() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Para::GetSpaceAbove() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Para::GetSpaceBelow() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+FX_FLOAT CXFA_Para::GetTextIndent() {
+  CXFA_Measurement ms;
+  m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms);
+  return ms.ToUnit(XFA_UNIT_Pt);
+}
+int32_t CXFA_Para::GetWidows() {
+  int32_t iValue = 0;
+  m_pNode->TryInteger(XFA_ATTRIBUTE_Widows, iValue);
+  return iValue;
+}
+FX_BOOL CXFA_Para::SetHorizontalAlign(int32_t iHorizontalAlign) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_HAlign,
+                          (XFA_ATTRIBUTEENUM)iHorizontalAlign);
+}
+FX_BOOL CXFA_Para::SetVerticalAlign(int32_t iVerticalAlign) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_VAlign,
+                          (XFA_ATTRIBUTEENUM)iVerticalAlign);
+}
+FX_BOOL CXFA_Para::SetLineHeight(FX_FLOAT fLineHeight) {
+  CXFA_Measurement ms;
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_LineHeight, ms);
+}
+FX_BOOL CXFA_Para::SetMarginLeft(FX_FLOAT fMarginLeft) {
+  CXFA_Measurement ms(fMarginLeft, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
+}
+FX_BOOL CXFA_Para::SetMarginRight(FX_FLOAT fMarginRight) {
+  CXFA_Measurement ms(fMarginRight, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginRight, ms);
+}
+FX_BOOL CXFA_Para::SetOrphans(int32_t iOrphans) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_Orphans, iOrphans);
+}
+FX_BOOL CXFA_Para::SetRadixOffset(FX_FLOAT fRadixOffset) {
+  CXFA_Measurement ms(fRadixOffset, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
+}
+FX_BOOL CXFA_Para::SetSpaceAbove(FX_FLOAT fSpaceAbove) {
+  CXFA_Measurement ms(fSpaceAbove, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
+}
+FX_BOOL CXFA_Para::SetSpaceBelow(FX_FLOAT fSpaceBelow) {
+  CXFA_Measurement ms(fSpaceBelow, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
+}
+FX_BOOL CXFA_Para::SetTextIndent(FX_FLOAT fTextIndent) {
+  CXFA_Measurement ms(fTextIndent, XFA_UNIT_Pt);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_TextIndent, ms);
+}
+FX_BOOL CXFA_Para::SetWidows(int32_t iWidows) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_Widows, iWidows);
+}
+CXFA_Keep::CXFA_Keep(CXFA_Node* pNode, CXFA_Node* pParent)
+    : CXFA_Data(pNode), m_pParent(pParent) {}
+int32_t CXFA_Keep::GetIntact() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
+  switch (m_pParent->GetClassID()) {
+    case XFA_ELEMENT_Subform: {
+      XFA_ATTRIBUTEENUM eAttrSubForm;
+      m_pParent->TryEnum(XFA_ATTRIBUTE_Layout, eAttrSubForm);
+      if (eAttrSubForm == XFA_ATTRIBUTEENUM_Position ||
+          eAttrSubForm == XFA_ATTRIBUTEENUM_Row) {
+        eAttr = XFA_ATTRIBUTEENUM_ContentArea;
+      }
+    } break;
+    case XFA_ELEMENT_Draw:
+      eAttr = XFA_ATTRIBUTEENUM_ContentArea;
+      break;
+    default:
+      break;
+  }
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Intact, eAttr, FALSE);
+  return eAttr;
+}
+int32_t CXFA_Keep::GetNext() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Next, eAttr);
+  return eAttr;
+}
+int32_t CXFA_Keep::GetPrevious() {
+  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Previous, eAttr);
+  return eAttr;
+}
+FX_BOOL CXFA_Keep::SetIntact(int32_t iIntact) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Intact, (XFA_ATTRIBUTEENUM)iIntact);
+}
+FX_BOOL CXFA_Keep::SetNext(int32_t iNext) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Next, (XFA_ATTRIBUTEENUM)iNext);
+}
+FX_BOOL CXFA_Keep::SetPrevious(int32_t iPrevious) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Previous, (XFA_ATTRIBUTEENUM)iPrevious);
+}
+CXFA_Event::CXFA_Event(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Event::GetActivity() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity);
+}
+int32_t CXFA_Event::GetEventType() {
+  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChild) {
+    int32_t eType = pChild->GetClassID();
+    if (eType != XFA_ELEMENT_Extras) {
+      return eType;
+    }
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return XFA_ELEMENT_UNKNOWN;
+}
+void CXFA_Event::GetRef(CFX_WideStringC& wsRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+int32_t CXFA_Event::GetExecuteRunAt() {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  return pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
+}
+int32_t CXFA_Event::GetExecuteType() {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  return pNode->GetEnum(XFA_ATTRIBUTE_ExecuteType);
+}
+void CXFA_Event::GetExecuteConnection(CFX_WideString& wsConnection) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  CFX_WideStringC cData;
+  pNode->TryCData(XFA_ATTRIBUTE_Connection, cData);
+  wsConnection = cData;
+}
+CXFA_Script CXFA_Event::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
+CXFA_Submit CXFA_Event::GetSubmit() {
+  return CXFA_Submit(m_pNode->GetChild(0, XFA_ELEMENT_Submit));
+}
+int32_t CXFA_Event::GetSignDataOperation() {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
+  return pNode->GetEnum(XFA_ATTRIBUTE_Operation);
+}
+void CXFA_Event::GetSignDataTarget(CFX_WideString& wsTarget) {
+  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
+    CFX_WideStringC wsCData;
+    pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData);
+    wsTarget = wsCData;
+  }
+}
+FX_BOOL CXFA_Event::SetActivity(int32_t iActivity) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Activity, (XFA_ATTRIBUTEENUM)iActivity);
+}
+FX_BOOL CXFA_Event::SetEventType(int32_t iEventType) {
+  return FALSE;
+}
+FX_BOOL CXFA_Event::SetExecuteRunAt(int32_t iExecuteRunAt) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  return pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iExecuteRunAt);
+}
+FX_BOOL CXFA_Event::SetExecuteType(int32_t iExecuteType) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  return pNode->SetEnum(XFA_ATTRIBUTE_ExecuteType,
+                        (XFA_ATTRIBUTEENUM)iExecuteType);
+}
+FX_BOOL CXFA_Event::SetExecuteConnection(const CFX_WideString& wsConnection) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
+  return pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
+}
+FX_BOOL CXFA_Event::SetSignDataOperation(int32_t iOperation) {
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
+  return pNode->SetEnum(XFA_ATTRIBUTE_Operation, (XFA_ATTRIBUTEENUM)iOperation);
+}
+FX_BOOL CXFA_Event::SetSignDataTarget(const CFX_WideString& wsTarget) {
+  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
+    return pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
+  }
+  return FALSE;
+}
+CXFA_Script::CXFA_Script(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+void CXFA_Script::GetBinding(CFX_WideString& wsBinding) {
+  CFX_WideStringC cData;
+  m_pNode->TryCData(XFA_ATTRIBUTE_Binding, cData);
+  wsBinding = cData;
+}
+XFA_SCRIPTTYPE CXFA_Script::GetContentType() {
+  CFX_WideStringC cData;
+  if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) {
+    if (cData == FX_WSTRC(L"application/x-javascript")) {
+      return XFA_SCRIPTTYPE_Javascript;
+    } else if (cData == FX_WSTRC(L"application/x-formcalc")) {
+      return XFA_SCRIPTTYPE_Formcalc;
+    } else {
+      return XFA_SCRIPTTYPE_Unkown;
+    }
+  }
+  return XFA_SCRIPTTYPE_Formcalc;
+}
+int32_t CXFA_Script::GetRunAt() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
+}
+void CXFA_Script::GetExpression(CFX_WideString& wsExpression) {
+  m_pNode->TryContent(wsExpression);
+}
+FX_BOOL CXFA_Script::SetBinding(const CFX_WideString& wsBinding) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Binding, wsBinding);
+}
+FX_BOOL CXFA_Script::SetContentType(XFA_SCRIPTTYPE eType) {
+  CFX_WideString wsType;
+  switch (eType) {
+    case XFA_SCRIPTTYPE_Javascript:
+      wsType = L"application/x-javascript";
+      break;
+    case XFA_SCRIPTTYPE_Formcalc:
+      wsType = L"application/x-formcalc";
+      break;
+    default:
+      break;
+  }
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsType);
+}
+FX_BOOL CXFA_Script::SetRunAt(int32_t iRunAt) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iRunAt);
+}
+FX_BOOL CXFA_Script::SetExpression(const CFX_WideString& wsExpression) {
+  return m_pNode->SetContent(wsExpression, wsExpression);
+}
+CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() {
+  return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF);
+}
+int32_t CXFA_Submit::GetSubmitFormat() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Format);
+}
+void CXFA_Submit::GetSubmitTarget(CFX_WideStringC& wsTarget) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget);
+}
+XFA_TEXTENCODING CXFA_Submit::GetSubmitTextEncoding() {
+  CFX_WideStringC wsCData;
+  if (!m_pNode->TryCData(XFA_ATTRIBUTE_TextEncoding, wsCData)) {
+    return XFA_TEXTENCODING_None;
+  }
+  CFX_WideString wsValue(wsCData);
+  if (wsValue == L"Big-Five") {
+    return XFA_TEXTENCODING_Big5;
+  } else if (wsValue == L"fontSpecific") {
+    return XFA_TEXTENCODING_FontSpecific;
+  } else if (wsValue == L"GBK") {
+    return XFA_TEXTENCODING_GBK;
+  } else if (wsValue == L"GB-18030") {
+    return XFA_TEXTENCODING_GB18030;
+  } else if (wsValue == L"GB-2312") {
+    return XFA_TEXTENCODING_GB2312;
+  } else if (wsValue == L"ISO-8859-NN") {
+    return XFA_TEXTENCODING_ISO8859NN;
+  } else if (wsValue == L"KSC-5601") {
+    return XFA_TEXTENCODING_KSC5601;
+  } else if (wsValue == L"Shift-JIS") {
+    return XFA_TEXTENCODING_ShiftJIS;
+  } else if (wsValue == L"UCS-2") {
+    return XFA_TEXTENCODING_UCS2;
+  } else if (wsValue == L"UTF-16") {
+    return XFA_TEXTENCODING_UTF16;
+  } else if (wsValue == L"UTF-8") {
+    return XFA_TEXTENCODING_UTF8;
+  }
+  return XFA_TEXTENCODING_None;
+}
+void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC& wsContent) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent);
+}
+FX_BOOL CXFA_Submit::SetSubmitFormat(int32_t iSubmitFormat) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Format,
+                          (XFA_ATTRIBUTEENUM)iSubmitFormat);
+}
+FX_BOOL CXFA_Submit::SetSubmitTarget(const CFX_WideString& wsTarget) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
+}
+FX_BOOL CXFA_Submit::SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding) {
+  CFX_WideString wsValue;
+  switch (eTextEncoding) {
+    case XFA_TEXTENCODING_Big5:
+      wsValue = L"Big-Five";
+      break;
+    case XFA_TEXTENCODING_FontSpecific:
+      wsValue = L"fontSpecific";
+      break;
+    case XFA_TEXTENCODING_GBK:
+      wsValue = L"GBK";
+      break;
+    case XFA_TEXTENCODING_GB18030:
+      wsValue = L"GB-18030";
+      break;
+    case XFA_TEXTENCODING_GB2312:
+      wsValue = L"GB-2312";
+      break;
+    case XFA_TEXTENCODING_ISO8859NN:
+      wsValue = L"ISO-8859-NN";
+      break;
+    case XFA_TEXTENCODING_KSC5601:
+      wsValue = L"KSC-5601";
+      break;
+    case XFA_TEXTENCODING_ShiftJIS:
+      wsValue = L"Shift-JIS";
+      break;
+    case XFA_TEXTENCODING_UCS2:
+      wsValue = L"UCS-2";
+      break;
+    case XFA_TEXTENCODING_UTF16:
+      wsValue = L"UTF-16";
+      break;
+    case XFA_TEXTENCODING_UTF8:
+      wsValue = L"UTF-8";
+      break;
+    default:
+      break;
+  }
+  return m_pNode->SetCData(XFA_ATTRIBUTE_TextEncoding, wsValue);
+}
+FX_BOOL CXFA_Submit::SetSubmitXDPContent(const CFX_WideString& wsContent) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_XdpContent, wsContent);
+}
+XFA_ELEMENT CXFA_Value::GetChildValueClassID() {
+  if (!m_pNode) {
+    return XFA_ELEMENT_UNKNOWN;
+  }
+  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+    return pNode->GetClassID();
+  }
+  return XFA_ELEMENT_UNKNOWN;
+}
+FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString& wsContent) {
+  if (!m_pNode) {
+    return FALSE;
+  }
+  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+    return pNode->TryContent(wsContent);
+  }
+  return FALSE;
+}
+CXFA_Arc CXFA_Value::GetArc() {
+  return CXFA_Arc(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                          : nullptr);
+}
+CXFA_Line CXFA_Value::GetLine() {
+  return CXFA_Line(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                           : nullptr);
+}
+CXFA_Rectangle CXFA_Value::GetRectangle() {
+  return CXFA_Rectangle(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                                : nullptr);
+}
+CXFA_Text CXFA_Value::GetText() {
+  return CXFA_Text(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                           : nullptr);
+}
+CXFA_ExData CXFA_Value::GetExData() {
+  return CXFA_ExData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
+                             : nullptr);
+}
+CXFA_Image CXFA_Value::GetImage() {
+  return CXFA_Image(
+      m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : nullptr,
+      TRUE);
+}
+FX_BOOL CXFA_Value::SetChildValueContent(const CFX_WideString& wsContent,
+                                         FX_BOOL bNotify,
+                                         XFA_ELEMENT iType) {
+  if (!m_pNode) {
+    return FALSE;
+  }
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (!pNode) {
+    if (iType == XFA_ELEMENT_UNKNOWN) {
+      return FALSE;
+    }
+    pNode = m_pNode->GetProperty(0, iType);
+  }
+  CFX_WideString wsFormatContent(wsContent);
+  CXFA_WidgetData* pContainerWidgetData = pNode->GetContainerWidgetData();
+  if (pContainerWidgetData) {
+    pContainerWidgetData->GetFormatDataValue(wsContent, wsFormatContent);
+  }
+  return pNode->SetContent(wsContent, wsFormatContent, bNotify);
+}
+int32_t CXFA_Line::GetHand() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
+}
+FX_BOOL CXFA_Line::GetSlop() {
+  XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope);
+  return eSlop == XFA_ATTRIBUTEENUM_Slash;
+}
+CXFA_Edge CXFA_Line::GetEdge() {
+  return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge));
+}
+FX_BOOL CXFA_Line::SetHand(int32_t iHand) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Hand, (XFA_ATTRIBUTEENUM)iHand);
+}
+FX_BOOL CXFA_Line::SetSlop(int32_t iSlop) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Slope, (XFA_ATTRIBUTEENUM)iSlop);
+}
+CXFA_Text::CXFA_Text(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+void CXFA_Text::GetName(CFX_WideStringC& wsName) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+}
+int32_t CXFA_Text::GetMaxChars() {
+  return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxChars);
+}
+void CXFA_Text::GetRid(CFX_WideStringC& wsRid) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
+}
+void CXFA_Text::GetContent(CFX_WideString& wsText) {
+  m_pNode->TryContent(wsText);
+}
+void CXFA_Text::SetContent(CFX_WideString wsText, FX_BOOL bNotify) {
+  CFX_WideString wsFormatValue(wsText);
+  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
+  if (pContainerWidgetData) {
+    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
+  }
+  m_pNode->SetContent(wsText, wsFormatValue, bNotify);
+}
+FX_BOOL CXFA_Text::SetName(const CFX_WideString& wsName) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
+}
+FX_BOOL CXFA_Text::SetMaxChars(int32_t iMaxChars) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxChars, iMaxChars);
+}
+FX_BOOL CXFA_Text::SetRid(const CFX_WideString& wsRid) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
+}
+CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+void CXFA_ExData::GetContentType(CFX_WideStringC& wsContentType) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+void CXFA_ExData::GetHref(CFX_WideStringC& wsHref) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
+}
+int32_t CXFA_ExData::GetMaxLength() {
+  return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxLength);
+}
+void CXFA_ExData::GetRid(CFX_WideStringC& wsRid) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
+}
+int32_t CXFA_ExData::GetTransferEncoding() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
+}
+void CXFA_ExData::GetContent(CFX_WideString& wsText) {
+  m_pNode->TryContent(wsText);
+}
+FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+FX_BOOL CXFA_ExData::SetHref(const CFX_WideString& wsHref) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
+}
+FX_BOOL CXFA_ExData::SetMaxLength(int32_t iMaxLength) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxLength, iMaxLength);
+}
+FX_BOOL CXFA_ExData::SetRid(const CFX_WideString& wsRid) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
+}
+FX_BOOL CXFA_ExData::SetTransferEncoding(int32_t iTransferEncoding) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
+                          (XFA_ATTRIBUTEENUM)iTransferEncoding);
+}
+FX_BOOL CXFA_ExData::SetContent(const CFX_WideString& wsText,
+                                FX_BOOL bNotify,
+                                FX_BOOL bScriptModify,
+                                FX_BOOL bSyncData) {
+  CFX_WideString wsFormatValue(wsText);
+  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
+  if (pContainerWidgetData) {
+    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
+  }
+  return m_pNode->SetContent(wsText, wsFormatValue, bNotify, bScriptModify,
+                             bSyncData);
+}
+CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue)
+    : CXFA_Data(pNode), m_bDefValue(bDefValue) {}
+int32_t CXFA_Image::GetAspect() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect);
+}
+FX_BOOL CXFA_Image::GetContentType(CFX_WideString& wsContentType) {
+  return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+FX_BOOL CXFA_Image::GetHref(CFX_WideString& wsHref) {
+  if (m_bDefValue) {
+    return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
+  }
+  return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref);
+}
+int32_t CXFA_Image::GetTransferEncoding() {
+  if (m_bDefValue) {
+    return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
+  }
+  return XFA_ATTRIBUTEENUM_Base64;
+}
+FX_BOOL CXFA_Image::GetContent(CFX_WideString& wsText) {
+  return m_pNode->TryContent(wsText);
+}
+FX_BOOL CXFA_Image::SetAspect(int32_t iAspect) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Aspect, (XFA_ATTRIBUTEENUM)iAspect);
+}
+FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
+}
+FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) {
+  if (m_bDefValue) {
+    return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
+  }
+  return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref);
+}
+FX_BOOL CXFA_Image::SetTransferEncoding(int32_t iTransferEncoding) {
+  if (m_bDefValue) {
+    return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
+                            (XFA_ATTRIBUTEENUM)iTransferEncoding);
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Image::SetContent(const CFX_WideString& wsText) {
+  CFX_WideString wsFormatValue(wsText);
+  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
+  if (pContainerWidgetData) {
+    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
+  }
+  return m_pNode->SetContent(wsText, wsFormatValue);
+}
+CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Calculate::GetOverride() {
+  XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error;
+  m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE);
+  return eAtt;
+}
+CXFA_Script CXFA_Calculate::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
+void CXFA_Calculate::GetMessageText(CFX_WideString& wsMessage) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
+    CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text));
+    if (text) {
+      text.GetContent(wsMessage);
+    }
+  }
+}
+FX_BOOL CXFA_Calculate::SetOverride(int32_t iOverride) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Override, (XFA_ATTRIBUTEENUM)iOverride);
+}
+FX_BOOL CXFA_Calculate::SetMessageText(const CFX_WideString& wsMessage) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
+    CXFA_Node* pChildNode = pNode->GetProperty(0, XFA_ELEMENT_Text);
+    return pChildNode->SetContent(wsMessage, wsMessage);
+  }
+  return FALSE;
+}
+CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Validate::GetFormatTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest);
+}
+FX_BOOL CXFA_Validate::SetTestValue(int32_t iType,
+                                    CFX_WideString& wsValue,
+                                    XFA_ATTRIBUTEENUM eName) {
+  const XFA_ATTRIBUTEENUMINFO* pInfo = XFA_GetAttributeEnumByName(wsValue);
+  if (pInfo) {
+    eName = pInfo->eName;
+  }
+  m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE);
+  return TRUE;
+}
+FX_BOOL CXFA_Validate::SetFormatTest(CFX_WideString wsValue) {
+  return SetTestValue(XFA_ATTRIBUTE_FormatTest, wsValue,
+                      XFA_ATTRIBUTEENUM_Warning);
+}
+FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) {
+  return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue,
+                      XFA_ATTRIBUTEENUM_Disabled);
+}
+int32_t CXFA_Validate::GetNullTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest);
+}
+int32_t CXFA_Validate::GetScriptTest() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest);
+}
+void CXFA_Validate::GetMessageText(CFX_WideString& wsMessage,
+                                   const CFX_WideStringC& wsMessageType) {
+  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE)) {
+    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pItemNode;
+         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
+        continue;
+      }
+      CFX_WideStringC wsName;
+      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName.IsEmpty() || wsName == wsMessageType) {
+        pItemNode->TryContent(wsMessage);
+        return;
+      }
+    }
+  }
+}
+void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
+}
+void CXFA_Validate::GetFormatMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
+}
+void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
+}
+void CXFA_Validate::GetNullMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
+}
+void CXFA_Validate::SetMessageText(CFX_WideString& wsMessage,
+                                   const CFX_WideStringC& wsMessageType) {
+  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE)) {
+    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pItemNode;
+         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
+        continue;
+      }
+      CFX_WideStringC wsName;
+      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName.IsEmpty() || wsName == wsMessageType) {
+        pItemNode->SetContent(wsMessage, wsMessage, FALSE);
+        return;
+      }
+    }
+    CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text);
+    pNode->InsertChild(pTextNode);
+    pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE);
+    pTextNode->SetContent(wsMessage, wsMessage, FALSE);
+  }
+}
+void CXFA_Validate::GetScriptMessageText(CFX_WideString& wsMessage) {
+  GetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
+}
+void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) {
+  SetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
+}
+void CXFA_Validate::GetPicture(CFX_WideString& wsPicture) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
+    pNode->TryContent(wsPicture);
+  }
+}
+CXFA_Script CXFA_Validate::GetScript() {
+  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
+}
+CXFA_Variables::CXFA_Variables(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Variables::CountScripts() {
+  return m_pNode->CountChildren(XFA_ELEMENT_Script);
+}
+CXFA_Script CXFA_Variables::GetScript(int32_t nIndex) {
+  return CXFA_Script(m_pNode->GetChild(nIndex, XFA_ELEMENT_Script));
+}
+CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Bind::GetMatch() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Match);
+}
+void CXFA_Bind::GetRef(CFX_WideStringC& wsRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+void CXFA_Bind::GetPicture(CFX_WideString& wsPicture) {
+  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
+    pPicture->TryContent(wsPicture);
+  }
+}
+FX_BOOL CXFA_Bind::SetMatch(int32_t iMatch) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Match, (XFA_ATTRIBUTEENUM)iMatch);
+}
+FX_BOOL CXFA_Bind::SetRef(const CFX_WideString& wsRef) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+FX_BOOL CXFA_Bind::SetPicture(const CFX_WideString& wsPicture) {
+  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
+    return pPicture->SetContent(wsPicture, wsPicture);
+  }
+  return FALSE;
+}
+CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+CXFA_ToolTip CXFA_Assist::GetToolTip() {
+  return CXFA_ToolTip(m_pNode->GetChild(0, XFA_ELEMENT_ToolTip));
+}
+CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString& wsTip) {
+  return m_pNode->TryContent(wsTip);
+}
+FX_BOOL CXFA_ToolTip::SetTip(const CFX_WideString& wsTip) {
+  return m_pNode->SetContent(wsTip, wsTip);
+}
+CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+void CXFA_BindItems::GetConnection(CFX_WideStringC& wsConnection) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Connection, wsConnection);
+}
+void CXFA_BindItems::GetLabelRef(CFX_WideStringC& wsLabelRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
+}
+void CXFA_BindItems::GetValueRef(CFX_WideStringC& wsValueRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
+}
+void CXFA_BindItems::GetRef(CFX_WideStringC& wsRef) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
+}
+FX_BOOL CXFA_BindItems::SetLabelRef(const CFX_WideString& wsLabelRef) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
+}
+FX_BOOL CXFA_BindItems::SetValueRef(const CFX_WideString& wsValueRef) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
+}
+FX_BOOL CXFA_BindItems::SetRef(const CFX_WideString& wsRef) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
+}
+int32_t CXFA_Box::GetBreak() const {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Close;
+  }
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Break);
+}
+int32_t CXFA_Box::GetHand() const {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Even;
+  }
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
+}
+int32_t CXFA_Box::GetPresence() const {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Hidden;
+  }
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+}
+int32_t CXFA_Box::CountCorners() const {
+  if (!m_pNode) {
+    return 0;
+  }
+  return m_pNode->CountChildren(XFA_ELEMENT_Corner);
+}
+CXFA_Corner CXFA_Box::GetCorner(int32_t nIndex) const {
+  return CXFA_Corner(
+      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Corner, nIndex == 0)
+              : nullptr);
+}
+int32_t CXFA_Box::CountEdges() const {
+  if (!m_pNode) {
+    return 0;
+  }
+  return m_pNode->CountChildren(XFA_ELEMENT_Edge);
+}
+CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const {
+  return CXFA_Edge(
+      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0)
+              : nullptr);
+}
+static void XFA_BOX_GetStrokes(CXFA_Node* pNode,
+                               CXFA_StrokeArray& strokes,
+                               FX_BOOL bNULL) {
+  strokes.RemoveAll();
+  if (!pNode) {
+    return;
+  }
+  strokes.SetSize(8);
+  int32_t i, j;
+  for (i = 0, j = 0; i < 4; i++) {
+    CXFA_Corner corner =
+        CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0));
+    if (corner || i == 0) {
+      strokes.SetAt(j, corner);
+    } else if (bNULL) {
+      strokes.SetAt(j, CXFA_Stroke(nullptr));
+    } else if (i == 1) {
+      strokes.SetAt(j, strokes[0]);
+    } else if (i == 2) {
+      strokes.SetAt(j, strokes[0]);
+    } else {
+      strokes.SetAt(j, strokes[2]);
+    }
+    j++;
+    CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0));
+    if (edge || i == 0) {
+      strokes.SetAt(j, edge);
+    } else if (bNULL) {
+      strokes.SetAt(j, CXFA_Stroke(nullptr));
+    } else if (i == 1) {
+      strokes.SetAt(j, strokes[1]);
+    } else if (i == 2) {
+      strokes.SetAt(j, strokes[1]);
+    } else {
+      strokes.SetAt(j, strokes[3]);
+    }
+    j++;
+  }
+}
+void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
+  XFA_BOX_GetStrokes(m_pNode, strokes, FALSE);
+}
+FX_BOOL CXFA_Box::IsCircular() const {
+  if (!m_pNode) {
+    return FALSE;
+  }
+  return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular);
+}
+FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const {
+  fStartAngle = 0;
+  if (!m_pNode) {
+    return FALSE;
+  }
+  CXFA_Measurement ms;
+  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE);
+  if (bRet) {
+    fStartAngle = ms.GetValue();
+  }
+  return bRet;
+}
+FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const {
+  fSweepAngle = 360;
+  if (!m_pNode) {
+    return FALSE;
+  }
+  CXFA_Measurement ms;
+  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE);
+  if (bRet) {
+    fSweepAngle = ms.GetValue();
+  }
+  return bRet;
+}
+CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const {
+  if (!m_pNode) {
+    return CXFA_Fill(nullptr);
+  }
+  CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified);
+  return CXFA_Fill(pFillNode);
+}
+CXFA_Margin CXFA_Box::GetMargin() const {
+  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin)
+                             : nullptr);
+}
+static FX_BOOL XFA_BOX_SameStyles(const CXFA_StrokeArray& strokes) {
+  int32_t iCount = strokes.GetSize();
+  if (iCount < 1) {
+    return TRUE;
+  }
+  CXFA_Stroke stroke1 = strokes[0];
+  for (int32_t i = 1; i < iCount; i++) {
+    CXFA_Stroke stroke2 = strokes[i];
+    if (!stroke2) {
+      continue;
+    }
+    if (!stroke1) {
+      stroke1 = stroke2;
+    } else if (!stroke1.SameStyles(stroke2)) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_Box::SameStyles() const {
+  if (IsArc()) {
+    return TRUE;
+  }
+  CXFA_StrokeArray strokes;
+  XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
+  return XFA_BOX_SameStyles(strokes);
+}
+static int32_t XFA_BOX_3DStyle(const CXFA_StrokeArray& strokes,
+                               CXFA_Stroke& stroke) {
+  int32_t iCount = strokes.GetSize();
+  if (iCount < 1) {
+    return 0;
+  }
+  stroke = strokes[0];
+  for (int32_t i = 1; i < iCount; i++) {
+    CXFA_Stroke find = strokes[i];
+    if (!find) {
+      continue;
+    }
+    if (!stroke) {
+      stroke = find;
+    } else if (stroke.GetStrokeType() != find.GetStrokeType()) {
+      stroke = find;
+      break;
+    }
+  }
+  int32_t iType = stroke.GetStrokeType();
+  if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised ||
+      iType == XFA_ATTRIBUTEENUM_Etched ||
+      iType == XFA_ATTRIBUTEENUM_Embossed) {
+    return iType;
+  }
+  return 0;
+}
+int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const {
+  if (IsArc()) {
+    return 0;
+  }
+  CXFA_StrokeArray strokes;
+  XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
+  CXFA_Stroke stroke(NULL);
+  int32_t iType = XFA_BOX_3DStyle(strokes, stroke);
+  if (iType) {
+    bVisible = stroke.IsVisible();
+    fThickness = stroke.GetThickness();
+  }
+  return iType;
+}
+int32_t CXFA_Stroke::GetPresence() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence)
+                 : XFA_ATTRIBUTEENUM_Invisible;
+}
+int32_t CXFA_Stroke::GetCapType() const {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Square;
+  }
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap);
+}
+int32_t CXFA_Stroke::GetStrokeType() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke)
+                 : XFA_ATTRIBUTEENUM_Solid;
+}
+FX_FLOAT CXFA_Stroke::GetThickness() const {
+  return GetMSThickness().ToUnit(XFA_UNIT_Pt);
+}
+CXFA_Measurement CXFA_Stroke::GetMSThickness() const {
+  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness)
+                 : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge,
+                                                        XFA_ATTRIBUTE_Thickness,
+                                                        XFA_XDPPACKET_Form);
+}
+void CXFA_Stroke::SetThickness(FX_FLOAT fThickness) {
+  if (!m_pNode) {
+    return;
+  }
+  CXFA_Measurement thickness(fThickness, XFA_UNIT_Pt);
+  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, thickness);
+}
+void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) {
+  if (!m_pNode) {
+    return;
+  }
+  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness);
+}
+FX_ARGB CXFA_Stroke::GetColor() const {
+  if (!m_pNode) {
+    return 0xFF000000;
+  }
+  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color);
+  if (!pNode) {
+    return 0xFF000000;
+  }
+  CFX_WideStringC wsColor;
+  pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor);
+  return XFA_WStringToColor(wsColor);
+}
+void CXFA_Stroke::SetColor(FX_ARGB argb) {
+  if (!m_pNode) {
+    return;
+  }
+  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
+  CFX_WideString wsColor;
+  int a, r, g, b;
+  ArgbDecode(argb, a, r, g, b);
+  wsColor.Format(L"%d,%d,%d", r, g, b);
+  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
+}
+int32_t CXFA_Stroke::GetJoinType() const {
+  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join)
+                 : XFA_ATTRIBUTEENUM_Square;
+}
+FX_BOOL CXFA_Stroke::IsInverted() const {
+  return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE;
+}
+FX_FLOAT CXFA_Stroke::GetRadius() const {
+  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt)
+                 : 0;
+}
+FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, FX_DWORD dwFlags) const {
+  if (m_pNode == stroke.GetNode()) {
+    return TRUE;
+  }
+  if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) {
+    return FALSE;
+  }
+  if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 &&
+      IsVisible() != stroke.IsVisible()) {
+    return FALSE;
+  }
+  if (GetStrokeType() != stroke.GetStrokeType()) {
+    return FALSE;
+  }
+  if (GetColor() != stroke.GetColor()) {
+    return FALSE;
+  }
+  if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 &&
+      FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) {
+    return FALSE;
+  }
+  return TRUE;
+}
+FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
+                              FX_BOOL b3DStyle,
+                              int32_t nIndex) {
+  FX_FLOAT fThickness = 0;
+  {
+    if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
+      if (nIndex == 0) {
+        fThickness += 2.5f;
+      }
+      fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2);
+    }
+  }
+  return fThickness;
+}
+CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
+    : CXFA_Data(pNode),
+      m_bIsNull(TRUE),
+      m_bPreNull(TRUE),
+      m_pUiChildNode(NULL),
+      m_eUIType(XFA_ELEMENT_UNKNOWN) {}
+CXFA_Node* CXFA_WidgetData::GetUIChild() {
+  if (m_eUIType == XFA_ELEMENT_UNKNOWN) {
+    m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType);
+  }
+  return m_pUiChildNode;
+}
+XFA_ELEMENT CXFA_WidgetData::GetUIType() {
+  GetUIChild();
+  return m_eUIType;
+}
+CFX_WideString CXFA_WidgetData::GetRawValue() {
+  return m_pNode->GetContent();
+}
+int32_t CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) {
+  if (bTemplate) {
+    CXFA_Node* pNode = m_pNode->GetTemplateNode();
+    if (pNode) {
+      return pNode->GetEnum(XFA_ATTRIBUTE_Access);
+    }
+    return XFA_ATTRIBUTEENUM_Open;
+  }
+  CXFA_Node* pNode = m_pNode;
+  while (pNode) {
+    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access);
+    if (iAcc != XFA_ATTRIBUTEENUM_Open) {
+      return iAcc;
+    }
+    pNode =
+        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+  }
+  return XFA_ATTRIBUTEENUM_Open;
+}
+FX_BOOL CXFA_WidgetData::GetAccessKey(CFX_WideStringC& wsAccessKey) {
+  return m_pNode->TryCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
+}
+int32_t CXFA_WidgetData::GetAnchorType() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
+}
+int32_t CXFA_WidgetData::GetColSpan() {
+  return m_pNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
+}
+int32_t CXFA_WidgetData::GetPresence() {
+  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+  CXFA_Node* pNode = m_pNode;
+  while (pNode && pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
+    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Presence);
+    if (iAcc != XFA_ATTRIBUTEENUM_Visible) {
+      return iAcc;
+    }
+    pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+  return XFA_ATTRIBUTEENUM_Visible;
+}
+int32_t CXFA_WidgetData::GetRotate() {
+  CXFA_Measurement ms;
+  if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE)) {
+    return 0;
+  }
+  int32_t iRotate = FXSYS_round(ms.GetValue());
+  iRotate = XFA_MapRotation(iRotate);
+  return iRotate / 90 * 90;
+}
+CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) {
+  return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified));
+}
+CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified) {
+  return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified));
+}
+CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified) {
+  return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified));
+}
+CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified) {
+  return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified));
+}
+CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified) {
+  return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified));
+}
+CXFA_Keep CXFA_WidgetData::GetKeep(FX_BOOL bModified) {
+  return CXFA_Keep(m_pNode->GetProperty(0, XFA_ELEMENT_Keep, bModified),
+                   m_pNode);
+}
+void CXFA_WidgetData::GetEventList(CXFA_NodeArray& events) {
+  m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event);
+}
+int32_t CXFA_WidgetData::GetEventByActivity(int32_t iActivity,
+                                            CXFA_NodeArray& events,
+                                            FX_BOOL bIsFormReady) {
+  CXFA_NodeArray allEvents;
+  GetEventList(allEvents);
+  int32_t iCount = allEvents.GetSize();
+  for (int32_t i = 0; i < iCount; i++) {
+    CXFA_Event event(allEvents[i]);
+    if (event.GetActivity() == iActivity) {
+      if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
+        CFX_WideStringC wsRef;
+        event.GetRef(wsRef);
+        if (bIsFormReady) {
+          if (wsRef == CFX_WideStringC(L"$form")) {
+            events.Add(allEvents[i]);
+          }
+        } else {
+          if (wsRef == CFX_WideStringC(L"$layout")) {
+            events.Add(allEvents[i]);
+          }
+        }
+      } else {
+        events.Add(allEvents[i]);
+      }
+    }
+  }
+  return events.GetSize();
+}
+CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified) {
+  CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
+  return CXFA_Value(pTemNode
+                        ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified)
+                        : nullptr);
+}
+CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified) {
+  return CXFA_Value(m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified));
+}
+CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified) {
+  return CXFA_Calculate(
+      m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified));
+}
+CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) {
+  return CXFA_Validate(
+      m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified));
+}
+CXFA_Variables CXFA_WidgetData::GetVariables(FX_BOOL bModified) {
+  return CXFA_Variables(
+      m_pNode->GetProperty(0, XFA_ELEMENT_Variables, bModified));
+}
+CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified) {
+  return CXFA_Bind(m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified));
+}
+CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified) {
+  return CXFA_Assist(m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified));
+}
+void CXFA_WidgetData::GetRelevant(CFX_WideStringC& wsRelevant) {
+  m_pNode->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
+}
+FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT& fWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_W, fWidth);
+}
+FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT& fHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_H, fHeight);
+}
+FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT& fMinWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
+}
+FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT& fMinHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
+}
+FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT& fMaxWidth) {
+  return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
+}
+FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT& fMaxHeight) {
+  return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
+}
+CXFA_BindItems CXFA_WidgetData::GetBindItems() {
+  return CXFA_BindItems(m_pNode->GetChild(0, XFA_ELEMENT_BindItems));
+}
+FX_BOOL CXFA_WidgetData::SetAccess(int32_t iAccess, FX_BOOL bNotify) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Access, (XFA_ATTRIBUTEENUM)iAccess,
+                          bNotify);
+}
+FX_BOOL CXFA_WidgetData::SetAccessKey(const CFX_WideString& wsAccessKey) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
+}
+FX_BOOL CXFA_WidgetData::SetAnchorType(int32_t iType) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_AnchorType, (XFA_ATTRIBUTEENUM)iType);
+}
+FX_BOOL CXFA_WidgetData::SetColSpan(int32_t iColSpan) {
+  return m_pNode->SetInteger(XFA_ATTRIBUTE_ColSpan,
+                             (XFA_ATTRIBUTEENUM)iColSpan);
+}
+FX_BOOL CXFA_WidgetData::SetPresence(int32_t iPresence) {
+  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
+}
+FX_BOOL CXFA_WidgetData::SetRotate(int32_t iRotate) {
+  iRotate = XFA_MapRotation(iRotate);
+  CXFA_Measurement ms((FX_FLOAT)iRotate, XFA_UNIT_Angle);
+  return m_pNode->SetMeasure(XFA_ATTRIBUTE_Rotate, ms);
+}
+FX_BOOL CXFA_WidgetData::SetRelevant(const CFX_WideString& wsRelevant) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
+}
+FX_BOOL CXFA_WidgetData::SetStatus(FX_DWORD dwStatus) {
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::SetWidth(FX_FLOAT fWidth) {
+  return SetMeasure(XFA_ATTRIBUTE_W, fWidth);
+}
+FX_BOOL CXFA_WidgetData::SetHeight(FX_FLOAT fHeight) {
+  return SetMeasure(XFA_ATTRIBUTE_H, fHeight);
+}
+FX_BOOL CXFA_WidgetData::SetMinWidth(FX_FLOAT fMinWidth) {
+  return SetMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
+}
+FX_BOOL CXFA_WidgetData::SetMinHeight(FX_FLOAT fMinHeight) {
+  return SetMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
+}
+FX_BOOL CXFA_WidgetData::SetMaxWidth(FX_FLOAT fMaxWidth) {
+  return SetMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
+}
+FX_BOOL CXFA_WidgetData::SetMaxHeight(FX_FLOAT fMaxHeight) {
+  return SetMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
+}
+FX_BOOL CXFA_WidgetData::SetPos(FX_FLOAT x, FX_FLOAT y) {
+  return SetMeasure(XFA_ATTRIBUTE_X, x) && SetMeasure(XFA_ATTRIBUTE_Y, y);
+}
+FX_BOOL CXFA_WidgetData::SetName(const CFX_WideString& wsName) {
+  return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
+}
+FX_BOOL CXFA_WidgetData::SetButtonHighlight(int32_t iButtonHighlight) {
+  CXFA_Node* pUiChildNode = GetUIChild();
+  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Highlight,
+                               (XFA_ATTRIBUTEENUM)iButtonHighlight);
+}
+FX_BOOL CXFA_WidgetData::SetButtonRollover(const CFX_WideString& wsRollover,
+                                           FX_BOOL bRichText) {
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::SetButtonDown(const CFX_WideString& wsDown,
+                                       FX_BOOL bRichText) {
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::SetCheckButtonShape(int32_t iCheckButtonShape) {
+  CXFA_Node* pUiChildNode = GetUIChild();
+  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Shape,
+                               (XFA_ATTRIBUTEENUM)iCheckButtonShape);
+}
+FX_BOOL CXFA_WidgetData::SetCheckButtonMark(int32_t iCheckButtonMark) {
+  CXFA_Node* pUiChildNode = GetUIChild();
+  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Mark,
+                               (XFA_ATTRIBUTEENUM)iCheckButtonMark);
+}
+FX_BOOL CXFA_WidgetData::SetCheckButtonSize(FX_FLOAT fCheckButtonMark) {
+  CXFA_Node* pUiChildNode = GetUIChild();
+  if (pUiChildNode) {
+    CXFA_Measurement ms(fCheckButtonMark, XFA_UNIT_Pt);
+    return pUiChildNode->SetMeasure(XFA_ATTRIBUTE_Size, ms);
+  }
+  return FALSE;
+}
+CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified) {
+  CXFA_Node* pUIChild = GetUIChild();
+  return CXFA_Border(
+      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified)
+               : nullptr);
+}
+CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified) {
+  CXFA_Node* pUIChild = GetUIChild();
+  return CXFA_Margin(
+      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified)
+               : nullptr);
+}
+void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
+  rtUIMargin.Reset();
+  CXFA_Margin mgUI = GetUIMargin();
+  if (!mgUI) {
+    return;
+  }
+  CXFA_Border border = GetUIBorder();
+  if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
+    return;
+  }
+  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
+  FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset);
+  FX_BOOL bTop = mgUI.GetTopInset(fTopInset);
+  FX_BOOL bRight = mgUI.GetRightInset(fRightInset);
+  FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset);
+  if (border) {
+    FX_BOOL bVisible = FALSE;
+    FX_FLOAT fThickness = 0;
+    border.Get3DStyle(bVisible, fThickness);
+    if (!bLeft || !bTop || !bRight || !bBottom) {
+      CXFA_StrokeArray strokes;
+      border.GetStrokes(strokes);
+      if (!bTop) {
+        fTopInset = XFA_GetEdgeThickness(strokes, bVisible, 0);
+      }
+      if (!bRight) {
+        fRightInset = XFA_GetEdgeThickness(strokes, bVisible, 1);
+      }
+      if (!bBottom) {
+        fBottomInset = XFA_GetEdgeThickness(strokes, bVisible, 2);
+      }
+      if (!bLeft) {
+        fLeftInset = XFA_GetEdgeThickness(strokes, bVisible, 3);
+      }
+    }
+  }
+  rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
+}
+int32_t CXFA_WidgetData::GetButtonHighlight() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form);
+}
+FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString& wsRollover,
+                                           FX_BOOL& bRichText) {
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    while (pText) {
+      CFX_WideStringC wsName;
+      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName == FX_WSTRC(L"rollover")) {
+        pText->TryContent(wsRollover);
+        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
+        return !wsRollover.IsEmpty();
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString& wsDown,
+                                       FX_BOOL& bRichText) {
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    while (pText) {
+      CFX_WideStringC wsName;
+      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
+      if (wsName == FX_WSTRC(L"down")) {
+        pText->TryContent(wsDown);
+        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
+        return !wsDown.IsEmpty();
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return FALSE;
+}
+int32_t CXFA_WidgetData::GetCheckButtonShape() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form);
+}
+int32_t CXFA_WidgetData::GetCheckButtonMark() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form);
+}
+FX_BOOL CXFA_WidgetData::IsRadioButton() {
+  if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent)) {
+    return pParent->GetClassID() == XFA_ELEMENT_ExclGroup;
+  }
+  return FALSE;
+}
+FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt);
+  }
+  return XFA_GetAttributeDefaultValue_Measure(
+             XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form)
+      .ToUnit(XFA_UNIT_Pt);
+}
+FX_BOOL CXFA_WidgetData::IsAllowNeutral() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral);
+  }
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form);
+}
+XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
+  CFX_WideString wsValue = GetRawValue();
+  if (wsValue.IsEmpty()) {
+    return XFA_CHECKSTATE_Off;
+  }
+  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    int32_t i = 0;
+    while (pText) {
+      CFX_WideString wsContent;
+      if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
+        return (XFA_CHECKSTATE)i;
+      }
+      i++;
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+  }
+  return XFA_CHECKSTATE_Off;
+}
+void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState,
+                                    FX_BOOL bNotify) {
+  CXFA_WidgetData exclGroup(GetExclGroupNode());
+  if (exclGroup) {
+    CFX_WideString wsValue;
+    if (eCheckState != XFA_CHECKSTATE_Off) {
+      if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
+        CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+        if (pText) {
+          pText->TryContent(wsValue);
+        }
+      }
+    }
+    CXFA_Node* pChild =
+        exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      if (pChild->GetClassID() != XFA_ELEMENT_Field) {
+        continue;
+      }
+      CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items);
+      if (!pItem) {
+        continue;
+      }
+      CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+      if (!pItemchild) {
+        continue;
+      }
+      CFX_WideString text = pItemchild->GetContent();
+      CFX_WideString wsChildValue = text;
+      if (wsValue != text) {
+        pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
+        if (pItemchild) {
+          wsChildValue = pItemchild->GetContent();
+        } else {
+          wsChildValue.Empty();
+        }
+      }
+      CXFA_WidgetData ch(pChild);
+      ch.SyncValue(wsChildValue, bNotify);
+    }
+    exclGroup.SyncValue(wsValue, bNotify);
+  } else {
+    CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items);
+    if (!pItems) {
+      return;
+    }
+    int32_t i = -1;
+    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    CFX_WideString wsContent;
+    while (pText) {
+      i++;
+      if (i == eCheckState) {
+        pText->TryContent(wsContent);
+        break;
+      }
+      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    SyncValue(wsContent, bNotify);
+  }
+}
+CXFA_Node* CXFA_WidgetData::GetExclGroupNode() {
+  CXFA_Node* pExcl = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_Parent));
+  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
+    return NULL;
+  }
+  return pExcl;
+}
+CXFA_Node* CXFA_WidgetData::GetSelectedMember() {
+  CXFA_Node* pSelectedMember = NULL;
+  CFX_WideString wsState = GetRawValue();
+  if (wsState.IsEmpty()) {
+    return pSelectedMember;
+  }
+  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    CXFA_WidgetData widgetData(pNode);
+    if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) {
+      pSelectedMember = pNode;
+      break;
+    }
+  }
+  return pSelectedMember;
+}
+CXFA_Node* CXFA_WidgetData::SetSelectedMember(const CFX_WideStringC& wsName,
+                                              FX_BOOL bNotify) {
+  CXFA_Node* pSelectedMember = NULL;
+  FX_DWORD nameHash =
+      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
+  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
+       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetNameHash() == nameHash) {
+      CXFA_WidgetData widgetData(pNode);
+      widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify);
+      pSelectedMember = pNode;
+      break;
+    }
+  }
+  return pSelectedMember;
+}
+void CXFA_WidgetData::SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
+                                               FX_BOOL bNotify,
+                                               FX_BOOL bScriptModify,
+                                               FX_BOOL bSyncData) {
+  CFX_WideString wsExclGroup;
+  for (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Field) {
+      continue;
+    }
+    CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items);
+    if (!pItem) {
+      continue;
+    }
+    CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (!pItemchild) {
+      continue;
+    }
+    CFX_WideString wsChildValue = pItemchild->GetContent();
+    if (wsValue != wsChildValue) {
+      pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
+      if (pItemchild) {
+        wsChildValue = pItemchild->GetContent();
+      } else {
+        wsChildValue.Empty();
+      }
+    } else {
+      wsExclGroup = wsValue;
+    }
+    pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify,
+                      FALSE);
+  }
+  if (m_pNode) {
+    m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
+                        bSyncData);
+  }
+}
+CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() {
+  CXFA_Node* pExcl = GetNode();
+  if (!pExcl) {
+    return NULL;
+  }
+  CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pNode) {
+    if (pNode->GetClassID() == XFA_ELEMENT_Field) {
+      return pNode;
+    }
+    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) {
+  if (!pNode) {
+    return NULL;
+  }
+  CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+  while (pNodeField) {
+    if (pNodeField->GetClassID() == XFA_ELEMENT_Field) {
+      return pNodeField;
+    }
+    pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  return NULL;
+}
+int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form);
+}
+FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry);
+  }
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form);
+}
+int32_t CXFA_WidgetData::GetChoiceListOpen() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_Open);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form);
+}
+FX_BOOL CXFA_WidgetData::IsListBox() {
+  int32_t iOpenMode = GetChoiceListOpen();
+  return (iOpenMode == XFA_ATTRIBUTEENUM_Always ||
+          iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect);
+}
+int32_t CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) {
+  CXFA_NodeArray pItems;
+  CXFA_Node* pItem = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    iCount++;
+    pItems.Add(pNode);
+    if (iCount == 2) {
+      break;
+    }
+  }
+  if (iCount == 0) {
+    return 0;
+  }
+  pItem = pItems[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
+      pItem = pItems[1];
+    }
+  }
+  pItems.RemoveAll();
+  return pItem->CountChildren(XFA_ELEMENT_UNKNOWN);
+}
+FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString& wsText,
+                                           int32_t nIndex,
+                                           FX_BOOL bSaveValue) {
+  wsText.Empty();
+  CXFA_NodeArray pItemsArray;
+  CXFA_Node* pItems = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    iCount++;
+    pItemsArray.Add(pNode);
+    if (iCount == 2) {
+      break;
+    }
+  }
+  if (iCount == 0) {
+    return FALSE;
+  }
+  pItems = pItemsArray[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
+      pItems = pItemsArray[1];
+    }
+  }
+  if (pItems) {
+    CXFA_Node* pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN);
+    if (pItem) {
+      pItem->TryContent(wsText);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray& wsTextArray,
+                                         FX_BOOL bSaveValue) {
+  CXFA_NodeArray pItems;
+  CXFA_Node* pItem = NULL;
+  int32_t iCount = 0;
+  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    iCount++;
+    pItems.Add(pNode);
+    if (iCount == 2) {
+      break;
+    }
+  }
+  if (iCount == 0) {
+    return;
+  }
+  pItem = pItems[0];
+  if (iCount > 1) {
+    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
+    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
+    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
+      pItem = pItems[1];
+    }
+  }
+  pItems.RemoveAll();
+  pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    pNode->TryContent(wsTextArray.Add());
+  }
+}
+int32_t CXFA_WidgetData::CountSelectedItems() {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  if (IsListBox() || !IsChoiceListAllowTextEntry()) {
+    return wsValueArray.GetSize();
+  }
+  int32_t iSelected = 0;
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t i = 0; i < iValues; i++) {
+    int32_t iSaves = wsSaveTextArray.GetSize();
+    for (int32_t j = 0; j < iSaves; j++) {
+      if (wsValueArray[i] == wsSaveTextArray[j]) {
+        iSelected++;
+        break;
+      }
+    }
+  }
+  return iSelected;
+}
+int32_t CXFA_WidgetData::GetSelectedItem(int32_t nIndex) {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iSaves = wsSaveTextArray.GetSize();
+  for (int32_t j = 0; j < iSaves; j++) {
+    if (wsValueArray[nIndex] == wsSaveTextArray[j]) {
+      return j;
+    }
+  }
+  return -1;
+}
+void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  if (iValues < 1) {
+    return;
+  }
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  int32_t iSaves = wsSaveTextArray.GetSize();
+  for (int32_t i = 0; i < iValues; i++) {
+    for (int32_t j = 0; j < iSaves; j++) {
+      if (wsValueArray[i] == wsSaveTextArray[j]) {
+        iSelArray.Add(j);
+        break;
+      }
+    }
+  }
+}
+void CXFA_WidgetData::GetSelectedItemsValue(
+    CFX_WideStringArray& wsSelTextArray) {
+  CFX_WideString wsValue = GetRawValue();
+  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    if (!wsValue.IsEmpty()) {
+      int32_t iStart = 0;
+      int32_t iLength = wsValue.GetLength();
+      int32_t iEnd = wsValue.Find(L'\n', iStart);
+      iEnd = (iEnd == -1) ? iLength : iEnd;
+      while (iEnd >= iStart) {
+        wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart));
+        iStart = iEnd + 1;
+        if (iStart >= iLength) {
+          break;
+        }
+        iEnd = wsValue.Find(L'\n', iStart);
+        if (iEnd < 0) {
+          wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart));
+        }
+      }
+    }
+  } else {
+    wsSelTextArray.Add(wsValue);
+  }
+}
+FX_BOOL CXFA_WidgetData::GetItemState(int32_t nIndex) {
+  if (nIndex < 0) {
+    return FALSE;
+  }
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  if (wsSaveTextArray.GetSize() <= nIndex) {
+    return FALSE;
+  }
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t j = 0; j < iValues; j++) {
+    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+void CXFA_WidgetData::SetItemState(int32_t nIndex,
+                                   FX_BOOL bSelected,
+                                   FX_BOOL bNotify,
+                                   FX_BOOL bScriptModify,
+                                   FX_BOOL bSyncData) {
+  if (nIndex < 0) {
+    return;
+  }
+  CFX_WideStringArray wsSaveTextArray;
+  GetChoiceListItems(wsSaveTextArray, TRUE);
+  if (wsSaveTextArray.GetSize() <= nIndex) {
+    return;
+  }
+  int32_t iSel = -1;
+  CFX_WideStringArray wsValueArray;
+  GetSelectedItemsValue(wsValueArray);
+  int32_t iValues = wsValueArray.GetSize();
+  for (int32_t j = 0; j < iValues; j++) {
+    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
+      iSel = j;
+      break;
+    }
+  }
+  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    if (bSelected) {
+      if (iSel < 0) {
+        CFX_WideString wsValue = GetRawValue();
+        if (!wsValue.IsEmpty()) {
+          wsValue += L"\n";
+        }
+        wsValue += wsSaveTextArray[nIndex];
+        m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify,
+                            bSyncData);
+      }
+    } else if (iSel >= 0) {
+      CFX_Int32Array iSelArray;
+      GetSelectedItems(iSelArray);
+      for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
+        if (iSelArray[i] == nIndex) {
+          iSelArray.RemoveAt(i);
+          break;
+        }
+      }
+      SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData);
+    }
+  } else {
+    if (bSelected) {
+      if (iSel < 0) {
+        CFX_WideString wsSaveText = wsSaveTextArray[nIndex];
+        CFX_WideString wsFormatText(wsSaveText);
+        GetFormatDataValue(wsSaveText, wsFormatText);
+        m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify,
+                            bSyncData);
+      }
+    } else if (iSel >= 0) {
+      m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify,
+                          bScriptModify, bSyncData);
+    }
+  }
+}
+void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array& iSelArray,
+                                      FX_BOOL bNotify,
+                                      FX_BOOL bScriptModify,
+                                      FX_BOOL bSyncData) {
+  CFX_WideString wsValue;
+  int32_t iSize = iSelArray.GetSize();
+  if (iSize >= 1) {
+    CFX_WideStringArray wsSaveTextArray;
+    GetChoiceListItems(wsSaveTextArray, TRUE);
+    CFX_WideString wsItemValue;
+    for (int32_t i = 0; i < iSize; i++) {
+      wsItemValue = (iSize == 1)
+                        ? wsSaveTextArray[iSelArray[i]]
+                        : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n");
+      wsValue += wsItemValue;
+    }
+  }
+  CFX_WideString wsFormat(wsValue);
+  if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect) {
+    GetFormatDataValue(wsValue, wsFormat);
+  }
+  m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
+}
+void CXFA_WidgetData::ClearAllSelections() {
+  CXFA_Node* pBind = m_pNode->GetBindData();
+  if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
+    while (CXFA_Node* pChildNode =
+               pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      pBind->RemoveChild(pChildNode);
+    }
+  } else {
+    SyncValue(CFX_WideString(), FALSE);
+  }
+}
+void CXFA_WidgetData::InsertItem(const CFX_WideString& wsLabel,
+                                 const CFX_WideString& wsValue,
+                                 int32_t nIndex,
+                                 FX_BOOL bNotify) {
+  CFX_WideString wsNewValue(wsValue);
+  if (wsNewValue.IsEmpty()) {
+    wsNewValue = wsLabel;
+  }
+  CXFA_NodeArray listitems;
+  int32_t iCount = 0;
+  CXFA_Node* pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItemNode;
+       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItemNode->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    listitems.Add(pItemNode);
+    iCount++;
+  }
+  if (iCount < 1) {
+    CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pItems);
+    InsertListTextItem(pItems, wsLabel, nIndex);
+    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pSaveItems);
+    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
+    InsertListTextItem(pSaveItems, wsNewValue, nIndex);
+  } else if (iCount > 1) {
+    for (int32_t i = 0; i < 2; i++) {
+      CXFA_Node* pNode = listitems[i];
+      FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save);
+      if (bHasSave) {
+        InsertListTextItem(pNode, wsNewValue, nIndex);
+      } else {
+        InsertListTextItem(pNode, wsLabel, nIndex);
+      }
+    }
+  } else {
+    CXFA_Node* pNode = listitems[0];
+    pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE);
+    pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible);
+    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
+    m_pNode->InsertChild(-1, pSaveItems);
+    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
+    pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden);
+    listitems.RemoveAll();
+    CXFA_Node* pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    int32_t i = 0;
+    while (pListNode) {
+      CFX_WideString wsOldValue;
+      pListNode->TryContent(wsOldValue);
+      InsertListTextItem(pSaveItems, wsOldValue, i);
+      i++;
+      pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    InsertListTextItem(pNode, wsLabel, nIndex);
+    InsertListTextItem(pSaveItems, wsNewValue, nIndex);
+  }
+  if (!bNotify) {
+    return;
+  }
+  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
+      this, XFA_WIDGETEVENT_ListItemAdded, (void*)(const FX_WCHAR*)wsLabel,
+      (void*)(const FX_WCHAR*)wsValue, (void*)(uintptr_t)nIndex);
+}
+void CXFA_WidgetData::GetItemLabel(const CFX_WideStringC& wsValue,
+                                   CFX_WideString& wsLabel) {
+  int32_t iCount = 0;
+  CXFA_NodeArray listitems;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    iCount++;
+    listitems.Add(pItems);
+  }
+  if (iCount <= 1) {
+    wsLabel = wsValue;
+  } else {
+    CXFA_Node* pLabelItems = listitems[0];
+    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
+    CXFA_Node* pSaveItems = NULL;
+    if (bSave) {
+      pSaveItems = pLabelItems;
+      pLabelItems = listitems[1];
+    } else {
+      pSaveItems = listitems[1];
+    }
+    iCount = 0;
+    int32_t iSearch = -1;
+    CFX_WideString wsContent;
+    CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChildItem;
+         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pChildItem->TryContent(wsContent);
+      if (wsContent == wsValue) {
+        iSearch = iCount;
+        break;
+      }
+      iCount++;
+    }
+    if (iSearch < 0) {
+      return;
+    }
+    if (CXFA_Node* pText =
+            pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
+      pText->TryContent(wsLabel);
+    }
+  }
+}
+void CXFA_WidgetData::GetItemValue(const CFX_WideStringC& wsLabel,
+                                   CFX_WideString& wsValue) {
+  int32_t iCount = 0;
+  CXFA_NodeArray listitems;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    iCount++;
+    listitems.Add(pItems);
+  }
+  if (iCount <= 1) {
+    wsValue = wsLabel;
+  } else {
+    CXFA_Node* pLabelItems = listitems[0];
+    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
+    CXFA_Node* pSaveItems = NULL;
+    if (bSave) {
+      pSaveItems = pLabelItems;
+      pLabelItems = listitems[1];
+    } else {
+      pSaveItems = listitems[1];
+    }
+    iCount = 0;
+    int32_t iSearch = -1;
+    CFX_WideString wsContent;
+    CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+    for (; pChildItem;
+         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+      pChildItem->TryContent(wsContent);
+      if (wsContent == wsLabel) {
+        iSearch = iCount;
+        break;
+      }
+      iCount++;
+    }
+    if (iSearch < 0) {
+      return;
+    }
+    if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
+      pText->TryContent(wsValue);
+    }
+  }
+}
+FX_BOOL CXFA_WidgetData::DeleteItem(int32_t nIndex,
+                                    FX_BOOL bNotify,
+                                    FX_BOOL bScriptModify,
+                                    FX_BOOL bSyncData) {
+  FX_BOOL bSetValue = FALSE;
+  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
+      continue;
+    }
+    if (nIndex < 0) {
+      while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+        pItems->RemoveChild(pNode);
+      }
+    } else {
+      if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) {
+        SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData);
+        bSetValue = TRUE;
+      }
+      int32_t i = 0;
+      CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
+      while (pNode) {
+        if (i == nIndex) {
+          pItems->RemoveChild(pNode);
+          break;
+        }
+        i++;
+        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+      }
+    }
+  }
+  if (!bNotify) {
+    return TRUE;
+  }
+  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
+      this, XFA_WIDGETEVENT_ListItemRemoved, (void*)(uintptr_t)nIndex);
+  return TRUE;
+}
+int32_t CXFA_WidgetData::GetHorizontalScrollPolicy() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy);
+  }
+  return XFA_ATTRIBUTEENUM_Auto;
+}
+int32_t CXFA_WidgetData::GetNumberOfCells() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (!pUIChild) {
+    return -1;
+  }
+  if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb)) {
+    return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells);
+  }
+  return -1;
+}
+FX_BOOL CXFA_WidgetData::IsDateTimeEditUsePicker() {
+  return TRUE;
+}
+CFX_WideString CXFA_WidgetData::GetBarcodeType() {
+  CXFA_Node* pUIChild = GetUIChild();
+  return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsCharEncoding;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) {
+    if (wsCharEncoding.CompareNoCase(L"UTF-16")) {
+      val = CHAR_ENCODING_UNICODE;
+      return TRUE;
+    } else if (wsCharEncoding.CompareNoCase(L"UTF-8")) {
+      val = CHAR_ENCODING_UTF8;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  XFA_ATTRIBUTEENUM eChecksum;
+  if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) {
+    switch (eChecksum) {
+      case XFA_ATTRIBUTEENUM_None:
+        val = 0;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Auto:
+        val = 1;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_1mod10:
+        break;
+      case XFA_ATTRIBUTEENUM_1mod10_1mod11:
+        break;
+      case XFA_ATTRIBUTEENUM_2mod10:
+        break;
+      default:
+        break;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsDataLength;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) {
+    val = FXSYS_wtoi(wsDataLength);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideStringC wsStartEndChar;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) {
+    if (wsStartEndChar.GetLength()) {
+      val = (FX_CHAR)wsStartEndChar.GetAt(0);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideStringC wsStartEndChar;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) {
+    if (wsStartEndChar.GetLength()) {
+      val = (FX_CHAR)wsStartEndChar.GetAt(0);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsECLevel;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) {
+    val = FXSYS_wtoi(wsECLevel);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CXFA_Measurement mModuleWidthHeight;
+  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) {
+    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CXFA_Measurement mModuleWidthHeight;
+  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) {
+    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  FX_BOOL bPrintCheckDigit;
+  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) {
+    val = bPrintCheckDigit;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(int32_t& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  XFA_ATTRIBUTEENUM eTextLocation;
+  if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) {
+    switch (eTextLocation) {
+      case XFA_ATTRIBUTEENUM_None:
+        val = BC_TEXT_LOC_NONE;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Above:
+        val = BC_TEXT_LOC_ABOVE;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_Below:
+        val = BC_TEXT_LOC_BELOW;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_AboveEmbedded:
+        val = BC_TEXT_LOC_ABOVEEMBED;
+        return TRUE;
+      case XFA_ATTRIBUTEENUM_BelowEmbedded:
+        val = BC_TEXT_LOC_BELOWEMBED;
+        return TRUE;
+      default:
+        break;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  FX_BOOL bTruncate;
+  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) {
+    val = bTruncate;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) {
+  CXFA_Node* pUIChild = GetUIChild();
+  CFX_WideString wsWideNarrowRatio;
+  if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) {
+    FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':');
+    FX_FLOAT fRatio = 0;
+    if (ptPos >= 0) {
+      fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio);
+    } else {
+      int32_t fA, fB;
+      fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos));
+      fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1));
+      if (fB) {
+        fRatio = (FX_FLOAT)fA / fB;
+      }
+    }
+    val = fRatio;
+    return TRUE;
+  }
+  return FALSE;
+}
+void CXFA_WidgetData::GetPasswordChar(CFX_WideString& wsPassWord) {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord);
+  } else {
+    wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit,
+                                                    XFA_ATTRIBUTE_PasswordChar,
+                                                    XFA_XDPPACKET_Form);
+  }
+}
+FX_BOOL CXFA_WidgetData::IsAllowRichText() {
+  CXFA_Node* pUIChild = GetUIChild();
+  FX_BOOL bValue = FALSE;
+  if (pUIChild &&
+      pUIChild->TryBoolean(XFA_ATTRIBUTE_AllowRichText, bValue, FALSE)) {
+    return bValue;
+  }
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      return pChild->GetClassID() == XFA_ELEMENT_ExData;
+    }
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::IsMultiLine() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine);
+  }
+  return XFA_GetAttributeDefaultValue_Boolean(
+      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form);
+}
+int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
+  CXFA_Node* pUIChild = GetUIChild();
+  if (pUIChild) {
+    return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy);
+  }
+  return XFA_GetAttributeDefaultValue_Enum(
+      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form);
+}
+int32_t CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
+      switch (pChild->GetClassID()) {
+        case XFA_ELEMENT_Text:
+          eType = XFA_ELEMENT_Text;
+          return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars);
+        case XFA_ELEMENT_ExData: {
+          eType = XFA_ELEMENT_ExData;
+          int32_t iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength);
+          return iMax < 0 ? 0 : iMax;
+        }
+        default:
+          break;
+      }
+    }
+  }
+  return 0;
+}
+FX_BOOL CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
+      return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits);
+    }
+  }
+  iFracDigits = -1;
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) {
+  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
+    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
+      return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits);
+    }
+  }
+  iLeadDigits = -1;
+  return FALSE;
+}
+CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
+                                int32_t iLead,
+                                int32_t iTread) {
+  if ((iLead == -1) && (iTread == -1)) {
+    return wsValue;
+  }
+  CFX_WideString wsRet;
+  int32_t iLead_ = 0, iTread_ = -1;
+  int32_t iCount = wsValue.GetLength();
+  if (iCount == 0) {
+    return wsValue;
+  }
+  int32_t i = 0;
+  if (wsValue[i] == L'-') {
+    wsRet += L'-';
+    i++;
+  }
+  for (; i < iCount; i++) {
+    FX_WCHAR wc = wsValue[i];
+    if (XFA_IsDigit(wc)) {
+      if (iLead >= 0) {
+        iLead_++;
+        if (iLead_ > iLead) {
+          return L"0";
+        }
+      } else if (iTread_ >= 0) {
+        iTread_++;
+        if (iTread_ > iTread) {
+          if (iTread != -1) {
+            CFX_Decimal wsDeci = CFX_Decimal(wsValue);
+            wsDeci.SetScale(iTread);
+            wsRet = wsDeci;
+          }
+          return wsRet;
+        }
+      }
+    } else if (wc == L'.') {
+      iTread_ = 0;
+      iLead = -1;
+    }
+    wsRet += wc;
+  }
+  return wsRet;
+}
+FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue,
+                                  XFA_VALUEPICTURE eValueType) {
+  if (wsValue.IsEmpty()) {
+    SyncValue(wsValue, TRUE);
+    return TRUE;
+  }
+  m_bPreNull = m_bIsNull;
+  m_bIsNull = FALSE;
+  CFX_WideString wsNewText(wsValue);
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, eValueType);
+  FX_BOOL bValidate = TRUE;
+  FX_BOOL bSyncData = FALSE;
+  CXFA_Node* pNode = GetUIChild();
+  if (!pNode) {
+    return TRUE;
+  }
+  XFA_ELEMENT uiType = pNode->GetClassID();
+  if (!wsPicture.IsEmpty()) {
+    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
+    IFX_Locale* pLocale = GetLocal();
+    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+    bValidate =
+        widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
+    if (bValidate) {
+      widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
+                                     wsPicture, pLocale, pLocalMgr);
+      wsNewText = widgetValue.GetValue();
+      if (uiType == XFA_ELEMENT_NumericEdit) {
+        int32_t iLeadDigits = 0;
+        int32_t iFracDigits = 0;
+        GetLeadDigits(iLeadDigits);
+        GetFracDigits(iFracDigits);
+        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+      }
+      bSyncData = TRUE;
+    }
+  } else {
+    if (uiType == XFA_ELEMENT_NumericEdit) {
+      if (wsNewText != FX_WSTRC(L"0")) {
+        int32_t iLeadDigits = 0;
+        int32_t iFracDigits = 0;
+        GetLeadDigits(iLeadDigits);
+        GetFracDigits(iFracDigits);
+        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
+      }
+      bSyncData = TRUE;
+    }
+  }
+  if (uiType != XFA_ELEMENT_NumericEdit || bSyncData) {
+    SyncValue(wsNewText, TRUE);
+  }
+  return bValidate;
+}
+FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString& wsPicture,
+                                           XFA_VALUEPICTURE ePicture) {
+  if (ePicture == XFA_VALUEPICTURE_Raw) {
+    return FALSE;
+  }
+  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+  switch (ePicture) {
+    case XFA_VALUEPICTURE_Display: {
+      if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) {
+        if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) {
+          if (pPicture->TryContent(wsPicture)) {
+            return TRUE;
+          }
+        }
+      }
+      CFX_WideString wsDataPicture, wsTimePicture;
+      IFX_Locale* pLocale = GetLocal();
+      if (!pLocale) {
+        return FALSE;
+      }
+      FX_DWORD dwType = widgetValue.GetType();
+      switch (dwType) {
+        case XFA_VT_DATE:
+          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsPicture);
+          break;
+        case XFA_VT_TIME:
+          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsPicture);
+          break;
+        case XFA_VT_DATETIME:
+          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsDataPicture);
+          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
+                                  wsTimePicture);
+          wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture;
+          break;
+        case XFA_VT_DECIMAL:
+        case XFA_VT_FLOAT:
+          break;
+        default:
+          break;
+      }
+    }
+      return TRUE;
+    case XFA_VALUEPICTURE_Edit: {
+      CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui);
+      if (pUI) {
+        if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) {
+          if (pPicture->TryContent(wsPicture)) {
+            return TRUE;
+          }
+        }
+      }
+      {
+        CFX_WideString wsDataPicture, wsTimePicture;
+        IFX_Locale* pLocale = GetLocal();
+        if (!pLocale) {
+          return FALSE;
+        }
+        FX_DWORD dwType = widgetValue.GetType();
+        switch (dwType) {
+          case XFA_VT_DATE:
+            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsPicture);
+            break;
+          case XFA_VT_TIME:
+            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsPicture);
+            break;
+          case XFA_VT_DATETIME:
+            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsDataPicture);
+            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
+                                    wsTimePicture);
+            wsPicture = wsDataPicture + L"T" + wsTimePicture;
+            break;
+          default:
+            break;
+        }
+      }
+    }
+      return TRUE;
+    case XFA_VALUEPICTURE_DataBind: {
+      if (CXFA_Bind bind = GetBind()) {
+        bind.GetPicture(wsPicture);
+        return TRUE;
+      }
+    } break;
+    default:
+      break;
+  }
+  return FALSE;
+}
+IFX_Locale* CXFA_WidgetData::GetLocal() {
+  IFX_Locale* pLocale = NULL;
+  if (!m_pNode) {
+    return pLocale;
+  }
+  FX_BOOL bLocale = FALSE;
+  CFX_WideString wsLocaleName;
+  bLocale = m_pNode->GetLocaleName(wsLocaleName);
+  if (bLocale) {
+    if (wsLocaleName.Equal(FX_WSTRC(L"ambient"))) {
+      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale();
+    } else {
+      pLocale =
+          m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(wsLocaleName);
+    }
+  }
+  return pLocale;
+}
+static FX_BOOL XFA_SplitDateTime(const CFX_WideString& wsDateTime,
+                                 CFX_WideString& wsDate,
+                                 CFX_WideString& wsTime) {
+  wsDate = L"";
+  wsTime = L"";
+  if (wsDateTime.IsEmpty()) {
+    return FALSE;
+  }
+  int nSplitIndex = -1;
+  nSplitIndex = wsDateTime.Find('T');
+  if (nSplitIndex < 0) {
+    nSplitIndex = wsDateTime.Find(' ');
+  }
+  if (nSplitIndex < 0) {
+    return FALSE;
+  }
+  wsDate = wsDateTime.Left(nSplitIndex);
+  if (!wsDate.IsEmpty()) {
+    int32_t iCount = wsDate.GetLength();
+    int32_t i = 0;
+    for (i = 0; i < iCount; i++) {
+      if (wsDate[i] >= '0' && wsDate[i] <= '9') {
+        break;
+      }
+    }
+    if (i == iCount) {
+      return FALSE;
+    }
+  }
+  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
+  if (!wsTime.IsEmpty()) {
+    int32_t iCount = wsTime.GetLength();
+    int32_t i = 0;
+    for (i = 0; i < iCount; i++) {
+      if (wsTime[i] >= '0' && wsTime[i] <= '9') {
+        break;
+      }
+    }
+    if (i == iCount) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString& wsValue,
+                                  XFA_VALUEPICTURE eValueType) {
+  wsValue = m_pNode->GetContent();
+
+  if (eValueType == XFA_VALUEPICTURE_Display)
+    GetItemLabel(wsValue, wsValue);
+
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, eValueType);
+  CXFA_Node* pNode = GetUIChild();
+  if (!pNode)
+    return TRUE;
+
+  XFA_ELEMENT uiType = GetUIChild()->GetClassID();
+  switch (uiType) {
+    case XFA_ELEMENT_ChoiceList: {
+      if (eValueType == XFA_VALUEPICTURE_Display) {
+        int32_t iSelItemIndex = GetSelectedItem(0);
+        if (iSelItemIndex >= 0) {
+          GetChoiceListItem(wsValue, iSelItemIndex);
+          wsPicture.Empty();
+        }
+      }
+    } break;
+    case XFA_ELEMENT_NumericEdit:
+      if (eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) {
+        IFX_Locale* pLocale = GetLocal();
+        if (eValueType == XFA_VALUEPICTURE_Display && pLocale) {
+          CFX_WideString wsOutput;
+          NormalizeNumStr(wsValue, wsOutput);
+          FormatNumStr(wsOutput, pLocale, wsOutput);
+          wsValue = wsOutput;
+        }
+      }
+      break;
+    default:
+      break;
+  }
+  if (wsPicture.IsEmpty())
+    return TRUE;
+
+  if (IFX_Locale* pLocale = GetLocal()) {
+    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
+    switch (widgetValue.GetType()) {
+      case XFA_VT_DATE: {
+        CFX_WideString wsDate, wsTime;
+        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
+          if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
+            return TRUE;
+        }
+        break;
+      }
+      case XFA_VT_TIME: {
+        CFX_WideString wsDate, wsTime;
+        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
+          if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
+            return TRUE;
+        }
+        break;
+      }
+      default:
+        break;
+    }
+    widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
+  }
+  return TRUE;
+}
+
+FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(
+    const CFX_WideStringC& wsValue,
+    CFX_WideString& wsNormalizeValue) {
+  wsNormalizeValue = wsValue;
+  if (wsValue.IsEmpty()) {
+    return TRUE;
+  }
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
+  if (wsPicture.IsEmpty()) {
+    return TRUE;
+  }
+  FXSYS_assert(GetNode());
+  CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
+  IFX_Locale* pLocale = GetLocal();
+  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
+  if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
+    widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue,
+                                   wsPicture, pLocale, pLocalMgr);
+    wsNormalizeValue = widgetValue.GetValue();
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_WidgetData::GetFormatDataValue(const CFX_WideStringC& wsValue,
+                                            CFX_WideString& wsFormatedValue) {
+  wsFormatedValue = wsValue;
+  if (wsValue.IsEmpty()) {
+    return TRUE;
+  }
+  CFX_WideString wsPicture;
+  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
+  if (wsPicture.IsEmpty()) {
+    return TRUE;
+  }
+  if (IFX_Locale* pLocale = GetLocal()) {
+    FXSYS_assert(GetNode());
+    CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value);
+    if (!pNodeValue) {
+      return FALSE;
+    }
+    CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (!pValueChild) {
+      return FALSE;
+    }
+    int32_t iVTType = XFA_VT_NULL;
+    XFA_ELEMENT eType = pValueChild->GetClassID();
+    switch (eType) {
+      case XFA_ELEMENT_Decimal:
+        iVTType = XFA_VT_DECIMAL;
+        break;
+      case XFA_ELEMENT_Float:
+        iVTType = XFA_VT_FLOAT;
+        break;
+      case XFA_ELEMENT_Date:
+        iVTType = XFA_VT_DATE;
+        break;
+      case XFA_ELEMENT_Time:
+        iVTType = XFA_VT_TIME;
+        break;
+      case XFA_ELEMENT_DateTime:
+        iVTType = XFA_VT_DATETIME;
+        break;
+      case XFA_ELEMENT_Boolean:
+        iVTType = XFA_VT_BOOLEAN;
+        break;
+      case XFA_ELEMENT_Integer:
+        iVTType = XFA_VT_INTEGER;
+        break;
+      case XFA_ELEMENT_Text:
+        iVTType = XFA_VT_TEXT;
+        break;
+      default:
+        iVTType = XFA_VT_NULL;
+        break;
+    }
+    CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
+    CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr);
+    switch (widgetValue.GetType()) {
+      case XFA_VT_DATE: {
+        CFX_WideString wsDate, wsTime;
+        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
+          if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                                  XFA_VALUEPICTURE_DataBind)) {
+            return TRUE;
+          }
+        }
+        break;
+      }
+      case XFA_VT_TIME: {
+        CFX_WideString wsDate, wsTime;
+        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
+          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
+          if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                                  XFA_VALUEPICTURE_DataBind)) {
+            return TRUE;
+          }
+        }
+        break;
+      }
+      default:
+        break;
+    }
+    widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
+                               XFA_VALUEPICTURE_DataBind);
+  }
+  return FALSE;
+}
+void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue,
+                                      CFX_WideString& wsOutput) {
+  if (wsValue.IsEmpty()) {
+    return;
+  }
+  wsOutput = wsValue;
+  wsOutput.TrimLeft('0');
+  int32_t dot_index = wsOutput.Find('.');
+  int32_t iFracDigits = 0;
+  if (!wsOutput.IsEmpty() && dot_index >= 0 &&
+      (!GetFracDigits(iFracDigits) || iFracDigits != -1)) {
+    wsOutput.TrimRight(L"0");
+    wsOutput.TrimRight(L".");
+  }
+  if (wsOutput.IsEmpty() || wsOutput[0] == '.') {
+    wsOutput.Insert(0, '0');
+  }
+}
+void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue,
+                                   IFX_Locale* pLocale,
+                                   CFX_WideString& wsOutput) {
+  if (wsValue.IsEmpty()) {
+    return;
+  }
+  CFX_WideString wsSrcNum = wsValue;
+  CFX_WideString wsGroupSymbol;
+  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  FX_BOOL bNeg = FALSE;
+  if (wsSrcNum[0] == '-') {
+    bNeg = TRUE;
+    wsSrcNum.Delete(0, 1);
+  }
+  int32_t len = wsSrcNum.GetLength();
+  int32_t dot_index = wsSrcNum.Find('.');
+  if (dot_index == -1) {
+    dot_index = len;
+  }
+  int32_t cc = dot_index - 1;
+  if (cc >= 0) {
+    int nPos = dot_index % 3;
+    wsOutput.Empty();
+    for (int32_t i = 0; i < dot_index; i++) {
+      if (i % 3 == nPos && i != 0) {
+        wsOutput += wsGroupSymbol;
+      }
+      wsOutput += wsSrcNum[i];
+    }
+    if (dot_index < len) {
+      CFX_WideString wsSymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
+      wsOutput += wsSymbol;
+      wsOutput += wsSrcNum.Right(len - dot_index - 1);
+    }
+    if (bNeg) {
+      CFX_WideString wsMinusymbol;
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
+      wsOutput = wsMinusymbol + wsOutput;
+    }
+  }
+}
+void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue,
+                                FX_BOOL bNotify) {
+  if (!m_pNode) {
+    return;
+  }
+  CFX_WideString wsFormatValue(wsValue);
+  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
+  if (pContainerWidgetData) {
+    pContainerWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
+  }
+  m_pNode->SetContent(wsValue, wsFormatValue, bNotify);
+}
+void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems,
+                                         const CFX_WideStringC& wsText,
+                                         int32_t nIndex) {
+  CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text);
+  pItems->InsertChild(nIndex, pText);
+  pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE);
+}
+CXFA_Filter CXFA_WidgetData::GetFilter(FX_BOOL bModified) {
+  if (!m_pUiChildNode) {
+    return CXFA_Filter(nullptr);
+  }
+  return CXFA_Filter(
+      m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Filter, bModified));
+}
+CXFA_Manifest CXFA_WidgetData::GetManifest(FX_BOOL bModified) {
+  if (!m_pUiChildNode) {
+    return CXFA_Manifest(nullptr);
+  }
+  return CXFA_Manifest(
+      m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Manifest, bModified));
+}
+CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+int32_t CXFA_Occur::GetMax() {
+  int32_t iMax = 1;
+  if (m_pNode) {
+    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE)) {
+      iMax = GetMin();
+    }
+  }
+  return iMax;
+}
+int32_t CXFA_Occur::GetMin() {
+  int32_t iMin = 1;
+  if (m_pNode) {
+    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0) {
+      iMin = 1;
+    }
+  }
+  return iMin;
+}
+int32_t CXFA_Occur::GetInitial() {
+  int32_t iInit = 1;
+  if (m_pNode) {
+    int32_t iMin = GetMin();
+    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, TRUE) ||
+        iInit < iMin) {
+      iInit = iMin;
+    }
+  }
+  return iInit;
+}
+FX_BOOL CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
+  if (!m_pNode) {
+    return FALSE;
+  }
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0) {
+    iMin = 1;
+  }
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
+    if (iMin == 0) {
+      iMax = 1;
+    } else {
+      iMax = iMin;
+    }
+  }
+  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) ||
+      iInit < iMin) {
+    iInit = iMin;
+  }
+  return TRUE;
+}
+void CXFA_Occur::SetMax(int32_t iMax) {
+  iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
+  m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+  int32_t iMin = GetMin();
+  if (iMax != -1 && iMax < iMin) {
+    iMin = iMax;
+    m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
+  }
+}
+void CXFA_Occur::SetMin(int32_t iMin) {
+  iMin = (iMin < 0) ? 1 : iMin;
+  m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
+  int32_t iMax = GetMax();
+  if (iMax > 0 && iMax < iMin) {
+    iMax = iMin;
+    m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+  }
+}
+XFA_ATTRIBUTEENUM XFA_GetEnumTypeAttribute(
+    CXFA_Node* pNode,
+    XFA_ATTRIBUTE attributeValue = XFA_ATTRIBUTE_Type,
+    XFA_ATTRIBUTEENUM eDefaultValue = XFA_ATTRIBUTEENUM_Optional) {
+  XFA_ATTRIBUTEENUM eType = eDefaultValue;
+  if (pNode) {
+    if (!pNode->TryEnum(attributeValue, eType, TRUE)) {
+      eType = eDefaultValue;
+    }
+  }
+  return eType;
+}
+CFX_WideString CXFA_Filter::GetFilterString(XFA_ATTRIBUTE eAttribute) {
+  CFX_WideString wsStringValue;
+  if (m_pNode) {
+    m_pNode->GetAttribute(eAttribute, wsStringValue, FALSE);
+  }
+  return wsStringValue;
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetAppearanceFilterType() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Optional;
+  }
+  CXFA_Node* pAppearanceFilterNode =
+      m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
+  return XFA_GetEnumTypeAttribute(pAppearanceFilterNode);
+}
+CFX_WideString CXFA_Filter::GetAppearanceFilterContent() {
+  CFX_WideString wsContent;
+  if (m_pNode) {
+    CXFA_Node* pAppearanceFilterNode =
+        m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
+    pAppearanceFilterNode->TryContent(wsContent);
+  }
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetCertificatesCredentialServerPolicy() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Optional;
+  }
+  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
+  return XFA_GetEnumTypeAttribute(pCertsNode,
+                                  XFA_ATTRIBUTE_CredentialServerPolicy);
+}
+CFX_WideString CXFA_Filter::GetCertificatesURL() {
+  CFX_WideString wsURL;
+  if (m_pNode) {
+    CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
+    pCertsNode->GetAttribute(XFA_ATTRIBUTE_Url, wsURL, FALSE);
+  }
+  return wsURL;
+}
+CFX_WideString CXFA_Filter::GetCertificatesURLPolicy() {
+  CFX_WideString wsURLPolicy;
+  if (m_pNode) {
+    CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
+    pCertsNode->GetAttribute(XFA_ATTRIBUTE_UrlPolicy, wsURLPolicy, FALSE);
+  }
+  return wsURLPolicy;
+}
+CXFA_WrapCertificate CXFA_Filter::GetCertificatesEncryption(FX_BOOL bModified) {
+  if (!m_pNode) {
+    return CXFA_WrapCertificate(NULL);
+  }
+  CXFA_Node* pCertsNode =
+      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
+  return CXFA_WrapCertificate(
+      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Encryption, bModified)
+                 : NULL);
+}
+CXFA_WrapCertificate CXFA_Filter::GetCertificatesIssuers(FX_BOOL bModified) {
+  if (!m_pNode) {
+    return CXFA_WrapCertificate(NULL);
+  }
+  CXFA_Node* pCertsNode =
+      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
+  return CXFA_WrapCertificate(
+      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Issuers, bModified)
+                 : NULL);
+}
+CFX_WideString CXFA_Filter::GetCertificatesKeyUsageString(
+    XFA_ATTRIBUTE eAttribute) {
+  if (!m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
+  CXFA_Node* pKeyUsageNode = pCertsNode->GetProperty(0, XFA_ELEMENT_KeyUsage);
+  CFX_WideString wsAttributeValue;
+  pKeyUsageNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
+  return wsAttributeValue;
+}
+CXFA_Oids CXFA_Filter::GetCertificatesOids() {
+  if (!m_pNode) {
+    return CXFA_Oids(NULL);
+  }
+  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
+  return CXFA_Oids(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Oids)
+                              : NULL);
+}
+CXFA_WrapCertificate CXFA_Filter::GetCertificatesSigning(FX_BOOL bModified) {
+  if (!m_pNode) {
+    return CXFA_WrapCertificate(NULL);
+  }
+  CXFA_Node* pCertsNode =
+      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
+  return CXFA_WrapCertificate(
+      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Signing, bModified)
+                 : NULL);
+}
+CXFA_DigestMethods CXFA_Filter::GetDigestMethods(FX_BOOL bModified) {
+  return CXFA_DigestMethods(
+      m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_DigestMethods, bModified)
+              : NULL);
+}
+CXFA_Encodings CXFA_Filter::GetEncodings(FX_BOOL bModified) {
+  return CXFA_Encodings(
+      m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Encodings, bModified)
+              : NULL);
+}
+CXFA_EncryptionMethods CXFA_Filter::GetEncryptionMethods(FX_BOOL bModified) {
+  return CXFA_EncryptionMethods(
+      m_pNode
+          ? m_pNode->GetProperty(0, XFA_ELEMENT_EncryptionMethods, bModified)
+          : NULL);
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetHandlerType() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Optional;
+  }
+  CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
+  return XFA_GetEnumTypeAttribute(pHandlerNode);
+}
+CFX_WideString CXFA_Filter::GetHandlerContent() {
+  CFX_WideString wsContent;
+  if (m_pNode) {
+    CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
+    pHandlerNode->TryContent(wsContent);
+  }
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetlockDocumentType() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Optional;
+  }
+  CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
+  return XFA_GetEnumTypeAttribute(pLockDocNode);
+}
+CFX_WideString CXFA_Filter::GetlockDocumentContent() {
+  CFX_WideString wsContent = FX_WSTRC(L"auto");
+  if (m_pNode) {
+    CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
+    pLockDocNode->TryContent(wsContent);
+  }
+  return wsContent;
+}
+int32_t CXFA_Filter::GetMDPPermissions() {
+  int32_t iPermissions = 2;
+  if (m_pNode) {
+    CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
+    if (!pMDPNode->TryInteger(XFA_ATTRIBUTE_Permissions, iPermissions, TRUE)) {
+      iPermissions = 2;
+    }
+  }
+  return iPermissions;
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetMDPSignatureType() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Filter;
+  }
+  CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
+  return XFA_GetEnumTypeAttribute(pMDPNode, XFA_ATTRIBUTE_SignatureType,
+                                  XFA_ATTRIBUTEENUM_Filter);
+}
+CXFA_Reasons CXFA_Filter::GetReasons(FX_BOOL bModified) {
+  return CXFA_Reasons(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Reasons)
+                              : NULL);
+}
+CFX_WideString CXFA_Filter::GetTimeStampServer() {
+  CFX_WideString wsServerURI;
+  if (m_pNode) {
+    CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
+    pTimeStampNode->GetAttribute(XFA_ATTRIBUTE_Server, wsServerURI, FALSE);
+  }
+  return wsServerURI;
+}
+XFA_ATTRIBUTEENUM CXFA_Filter::GetTimeStampType() {
+  if (!m_pNode) {
+    return XFA_ATTRIBUTEENUM_Optional;
+  }
+  CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
+  return XFA_GetEnumTypeAttribute(pTimeStampNode);
+}
+CFX_WideString CXFA_Certificate::GetCertificateName() {
+  CFX_WideString wsName;
+  if (m_pNode) {
+    m_pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
+  }
+  return wsName;
+}
+CFX_WideString CXFA_Certificate::GetCertificateContent() {
+  CFX_WideString wsContent;
+  if (m_pNode) {
+    m_pNode->TryContent(wsContent);
+  }
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_WrapCertificate::GetType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_WrapCertificate::CountCertificates() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Certificate) : 0;
+}
+CXFA_Certificate CXFA_WrapCertificate::GetCertificate(int32_t nIndex) {
+  return CXFA_Certificate(
+      (nIndex > -1 && m_pNode)
+          ? m_pNode->GetChild(nIndex, XFA_ELEMENT_Certificate)
+          : NULL);
+}
+XFA_ATTRIBUTEENUM CXFA_Oids::GetOidsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_Oids::CountOids() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Oid) : 0;
+}
+CFX_WideString CXFA_Oids::GetOidContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pOidNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Oid);
+  if (!pOidNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pOidNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_SubjectDNs::GetSubjectDNsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_SubjectDNs::CountSubjectDNs() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_SubjectDN) : 0;
+}
+CFX_WideString CXFA_SubjectDNs::GetSubjectDNString(int32_t nIndex,
+                                                   XFA_ATTRIBUTE eAttribute) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
+  if (!pSubjectDNNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsAttributeValue;
+  pSubjectDNNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
+  return wsAttributeValue;
+}
+CFX_WideString CXFA_SubjectDNs::GetSubjectDNContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
+  if (!pSubjectDNNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pSubjectDNNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_DigestMethods::GetDigestMethodsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_DigestMethods::CountDigestMethods() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_DigestMethod) : 0;
+}
+CFX_WideString CXFA_DigestMethods::GetDigestMethodContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pDigestMethodNode =
+      m_pNode->GetChild(nIndex, XFA_ELEMENT_DigestMethod);
+  if (!pDigestMethodNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pDigestMethodNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_Encodings::GetEncodingsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_Encodings::CountEncodings() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Encoding) : 0;
+}
+CFX_WideString CXFA_Encodings::GetEncodingContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pEncodingNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Encoding);
+  if (!pEncodingNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pEncodingNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_EncryptionMethods::GetEncryptionMethodsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_EncryptionMethods::CountEncryptionMethods() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_EncryptionMethod) : 0;
+}
+CFX_WideString CXFA_EncryptionMethods::GetEncryptionMethodContent(
+    int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pEncryMethodNode =
+      m_pNode->GetChild(nIndex, XFA_ELEMENT_EncryptionMethod);
+  if (!pEncryMethodNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pEncryMethodNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_Reasons::GetReasonsType() {
+  return XFA_GetEnumTypeAttribute(m_pNode);
+}
+int32_t CXFA_Reasons::CountReasons() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Reason) : 0;
+}
+CFX_WideString CXFA_Reasons::GetReasonContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pReasonNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Reason);
+  if (!pReasonNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pReasonNode->TryContent(wsContent);
+  return wsContent;
+}
+XFA_ATTRIBUTEENUM CXFA_Manifest::GetAction() {
+  return XFA_GetEnumTypeAttribute(m_pNode, XFA_ATTRIBUTE_Action,
+                                  XFA_ATTRIBUTEENUM_Include);
+}
+int32_t CXFA_Manifest::CountReives() {
+  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Ref) : 0;
+}
+CFX_WideString CXFA_Manifest::GetRefContent(int32_t nIndex) {
+  if (nIndex <= -1 || !m_pNode) {
+    return FX_WSTRC(L"");
+  }
+  CXFA_Node* pRefNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Ref);
+  if (!pRefNode) {
+    return FX_WSTRC(L"");
+  }
+  CFX_WideString wsContent;
+  pRefNode->TryContent(wsContent);
+  return wsContent;
+}
diff --git a/xfa/fxfa/parser/xfa_parser.h b/xfa/fxfa/parser/xfa_parser.h
new file mode 100644
index 0000000..2d45e5f
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_parser.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_PARSER_H_
+#define XFA_FXFA_PARSER_XFA_PARSER_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+
+class IXFA_Parser {
+ public:
+  static IXFA_Parser* Create(IXFA_ObjFactory* pFactory,
+                             FX_BOOL bDocumentParser = FALSE);
+  virtual ~IXFA_Parser() {}
+  virtual void Release() = 0;
+  virtual int32_t StartParse(IFX_FileRead* pStream,
+                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP) = 0;
+  virtual int32_t DoParse(IFX_Pause* pPause = NULL) = 0;
+  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
+                               IFDE_XMLNode*& pXMLNode,
+                               IFX_Pause* pPause = NULL) = 0;
+  virtual void ConstructXFANode(CXFA_Node* pXFANode,
+                                IFDE_XMLNode* pXMLNode) = 0;
+  virtual IXFA_ObjFactory* GetFactory() const = 0;
+  virtual CXFA_Node* GetRootNode() const = 0;
+  virtual IFDE_XMLDoc* GetXMLDoc() const = 0;
+  virtual void CloseParser() = 0;
+};
+class IXFA_DocParser : public IXFA_Parser {
+ public:
+  static IXFA_DocParser* Create(IXFA_Notify* pNotify);
+  virtual CXFA_Document* GetDocument() const = 0;
+  virtual IXFA_Notify* GetNotify() const = 0;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_PARSER_H_
diff --git a/xfa/fxfa/parser/xfa_parser_imp.cpp b/xfa/fxfa/parser/xfa_parser_imp.cpp
new file mode 100644
index 0000000..f27e3a6
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_parser_imp.cpp
@@ -0,0 +1,1568 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_parser_imp.h"
+
+#include "xfa/fgas/crt/fgas_codepage.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_basic_imp.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+IXFA_Parser* IXFA_Parser::Create(IXFA_ObjFactory* pFactory,
+                                 FX_BOOL bDocumentParser) {
+  return new CXFA_SimpleParser(pFactory, bDocumentParser);
+}
+CXFA_SimpleParser::CXFA_SimpleParser(IXFA_ObjFactory* pFactory,
+                                     FX_BOOL bDocumentParser)
+    : m_pXMLParser(nullptr),
+      m_pXMLDoc(nullptr),
+      m_pStream(nullptr),
+      m_pFileRead(nullptr),
+      m_pFactory(pFactory),
+      m_pRootNode(nullptr),
+      m_ePacketID(XFA_XDPPACKET_UNKNOWN),
+      m_bDocumentParser(bDocumentParser) {}
+CXFA_SimpleParser::~CXFA_SimpleParser() {
+  CloseParser();
+}
+void CXFA_SimpleParser::SetFactory(IXFA_ObjFactory* pFactory) {
+  m_pFactory = pFactory;
+}
+static IFDE_XMLNode* XFA_FDEExtension_GetDocumentNode(
+    IFDE_XMLDoc* pXMLDoc,
+    FX_BOOL bVerifyWellFormness = FALSE) {
+  if (!pXMLDoc) {
+    return NULL;
+  }
+  IFDE_XMLNode* pXMLFakeRoot = pXMLDoc->GetRoot();
+  for (IFDE_XMLNode* pXMLNode =
+           pXMLFakeRoot->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
+      if (bVerifyWellFormness) {
+        for (IFDE_XMLNode* pNextNode =
+                 pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
+             pNextNode;
+             pNextNode = pNextNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+          if (pNextNode->GetType() == FDE_XMLNODE_Element) {
+            return FALSE;
+          }
+        }
+      }
+      return pXMLNode;
+    }
+  }
+  return NULL;
+}
+int32_t CXFA_SimpleParser::StartParse(IFX_FileRead* pStream,
+                                      XFA_XDPPACKET ePacketID) {
+  CloseParser();
+  m_pFileRead = pStream;
+  m_pStream = IFX_Stream::CreateStream(
+      pStream, FX_STREAMACCESS_Read | FX_STREAMACCESS_Text);
+  if (m_pStream == NULL) {
+    return XFA_PARSESTATUS_StreamErr;
+  }
+  FX_WORD wCodePage = m_pStream->GetCodePage();
+  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
+      wCodePage != FX_CODEPAGE_UTF8) {
+    m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
+  }
+  m_pXMLDoc = IFDE_XMLDoc::Create();
+  if (m_pXMLDoc == NULL) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  m_pXMLParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream);
+  if (m_pXMLParser == NULL) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  if (!m_pXMLDoc->LoadXML(m_pXMLParser)) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  m_ePacketID = ePacketID;
+  return XFA_PARSESTATUS_Ready;
+}
+int32_t CXFA_SimpleParser::DoParse(IFX_Pause* pPause) {
+  if (m_pXMLDoc == NULL || m_ePacketID == XFA_XDPPACKET_UNKNOWN) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  int32_t iRet = m_pXMLDoc->DoLoad(pPause);
+  if (iRet < 0) {
+    return XFA_PARSESTATUS_SyntaxErr;
+  }
+  if (iRet < 100) {
+    return iRet / 2;
+  }
+  m_pRootNode = ParseAsXDPPacket(XFA_FDEExtension_GetDocumentNode(m_pXMLDoc),
+                                 m_ePacketID);
+  m_pXMLDoc->CloseXML();
+  if (m_pStream) {
+    m_pStream->Release();
+    m_pStream = NULL;
+  }
+  if (!m_pRootNode) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  return XFA_PARSESTATUS_Done;
+}
+int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML,
+                                        IFDE_XMLNode*& pXMLNode,
+                                        IFX_Pause* pPause) {
+  CloseParser();
+  pXMLNode = NULL;
+  IFX_Stream* pStream = XFA_CreateWideTextRead(wsXML);
+  if (!pStream) {
+    return XFA_PARSESTATUS_StreamErr;
+  }
+  m_pStream = pStream;
+  m_pXMLDoc = IFDE_XMLDoc::Create();
+  if (m_pXMLDoc == NULL) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  CXFA_XMLParser* pParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream);
+  if (pParser == NULL) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+
+  pParser->m_dwCheckStatus = 0x03;
+  if (!m_pXMLDoc->LoadXML(pParser)) {
+    return XFA_PARSESTATUS_StatusErr;
+  }
+  int32_t iRet = m_pXMLDoc->DoLoad(pPause);
+  if (iRet < 0 || iRet >= 100) {
+    m_pXMLDoc->CloseXML();
+  }
+  if (iRet < 0) {
+    return XFA_PARSESTATUS_SyntaxErr;
+  }
+  if (iRet < 100) {
+    return iRet / 2;
+  }
+  if (m_pStream) {
+    m_pStream->Release();
+    m_pStream = NULL;
+  }
+  pXMLNode = XFA_FDEExtension_GetDocumentNode(m_pXMLDoc);
+  return XFA_PARSESTATUS_Done;
+}
+
+void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode,
+                                         IFDE_XMLNode* pXMLNode) {
+  XFA_XDPPACKET ePacketID = (XFA_XDPPACKET)pXFANode->GetPacketID();
+  if (ePacketID == XFA_XDPPACKET_Datasets) {
+    if (pXFANode->GetClassID() == XFA_ELEMENT_DataValue) {
+      for (IFDE_XMLNode* pXMLChild =
+               pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+           pXMLChild;
+           pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+        FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
+        if (eNodeType == FDE_XMLNODE_Instruction)
+          continue;
+
+        if (eNodeType == FDE_XMLNODE_Element) {
+          CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
+                                                        XFA_ELEMENT_DataValue);
+          if (!pXFAChild)
+            return;
+
+          CFX_WideString wsNodeStr;
+          ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr);
+          pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr);
+          CFX_WideString wsChildValue;
+          XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild,
+                                       wsChildValue);
+          if (!wsChildValue.IsEmpty())
+            pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsChildValue);
+
+          pXFANode->InsertChild(pXFAChild);
+          pXFAChild->SetXMLMappingNode(pXMLChild);
+          pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+          break;
+        }
+      }
+      m_pRootNode = pXFANode;
+    } else {
+      m_pRootNode = DataLoader(pXFANode, pXMLNode, TRUE);
+    }
+  } else if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) {
+    ParseContentNode(pXFANode, pXMLNode, ePacketID);
+    m_pRootNode = pXFANode;
+  } else {
+    m_pRootNode = NormalLoader(pXFANode, pXMLNode, ePacketID);
+  }
+}
+
+FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
+    IFDE_XMLElement* pNode,
+    const CFX_WideStringC& wsQualifier,
+    CFX_WideString& wsNamespaceURI) {
+  if (!pNode) {
+    return FALSE;
+  }
+  IFDE_XMLNode* pFakeRoot = pNode->GetNodeItem(IFDE_XMLNode::Root);
+  CFX_WideString wsNSAttribute;
+  FX_BOOL bRet = FALSE;
+  if (wsQualifier.IsEmpty()) {
+    wsNSAttribute = FX_WSTRC(L"xmlns");
+    bRet = TRUE;
+  } else {
+    wsNSAttribute = FX_WSTRC(L"xmlns:") + wsQualifier;
+  }
+  for (; pNode != pFakeRoot;
+       pNode = (IFDE_XMLElement*)pNode->GetNodeItem(IFDE_XMLNode::Parent)) {
+    if (pNode->GetType() != FDE_XMLNODE_Element) {
+      continue;
+    }
+    if (pNode->HasAttribute(wsNSAttribute)) {
+      pNode->GetString(wsNSAttribute, wsNamespaceURI);
+      return TRUE;
+    }
+  }
+  wsNamespaceURI.Empty();
+  return bRet;
+}
+static inline void XFA_FDEExtension_GetElementTagNamespaceURI(
+    IFDE_XMLElement* pElement,
+    CFX_WideString& wsNamespaceURI) {
+  CFX_WideString wsNodeStr;
+  pElement->GetNamespacePrefix(wsNodeStr);
+  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr,
+                                                  wsNamespaceURI)) {
+    wsNamespaceURI.Empty();
+  }
+}
+static FX_BOOL XFA_FDEExtension_MatchNodeName(
+    IFDE_XMLNode* pNode,
+    const CFX_WideStringC& wsLocalTagName,
+    const CFX_WideStringC& wsNamespaceURIPrefix,
+    FX_DWORD eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) {
+  if (!pNode || pNode->GetType() != FDE_XMLNODE_Element) {
+    return FALSE;
+  }
+  IFDE_XMLElement* pElement = reinterpret_cast<IFDE_XMLElement*>(pNode);
+  CFX_WideString wsNodeStr;
+  pElement->GetLocalTagName(wsNodeStr);
+  if (wsNodeStr != wsLocalTagName) {
+    return FALSE;
+  }
+  XFA_FDEExtension_GetElementTagNamespaceURI(pElement, wsNodeStr);
+  if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH) {
+    return TRUE;
+  }
+  if (eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) {
+    return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) ==
+           wsNamespaceURIPrefix;
+  }
+  return wsNodeStr == wsNamespaceURIPrefix;
+}
+static FX_BOOL XFA_FDEExtension_GetAttributeLocalName(
+    const CFX_WideStringC& wsAttributeName,
+    CFX_WideString& wsLocalAttrName) {
+  CFX_WideString wsAttrName(wsAttributeName);
+  FX_STRSIZE iFind = wsAttrName.Find(L':', 0);
+  if (iFind < 0) {
+    wsLocalAttrName = wsAttrName;
+    return FALSE;
+  } else {
+    wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - iFind - 1);
+    return TRUE;
+  }
+}
+static FX_BOOL XFA_FDEExtension_ResolveAttribute(
+    IFDE_XMLElement* pElement,
+    const CFX_WideStringC& wsAttributeName,
+    CFX_WideString& wsLocalAttrName,
+    CFX_WideString& wsNamespaceURI) {
+  CFX_WideString wsAttrName(wsAttributeName);
+  CFX_WideString wsNSPrefix;
+  if (XFA_FDEExtension_GetAttributeLocalName(wsAttributeName,
+                                             wsLocalAttrName)) {
+    wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() -
+                                 wsLocalAttrName.GetLength() - 1);
+  }
+  if (wsLocalAttrName == FX_WSTRC(L"xmlns") ||
+      wsNSPrefix == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xml")) {
+    return FALSE;
+  }
+  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
+                                                  wsNamespaceURI)) {
+    wsNamespaceURI.Empty();
+    return FALSE;
+  }
+  return TRUE;
+}
+static FX_BOOL XFA_FDEExtension_FindAttributeWithNS(
+    IFDE_XMLElement* pElement,
+    const CFX_WideStringC& wsLocalAttributeName,
+    const CFX_WideStringC& wsNamespaceURIPrefix,
+    CFX_WideString& wsValue,
+    FX_BOOL bMatchNSAsPrefix = FALSE) {
+  if (!pElement) {
+    return FALSE;
+  }
+  CFX_WideString wsAttrName;
+  CFX_WideString wsAttrValue;
+  CFX_WideString wsAttrNS;
+  for (int32_t iAttrCount = pElement->CountAttributes(), i = 0; i < iAttrCount;
+       i++) {
+    pElement->GetAttribute(i, wsAttrName, wsAttrValue);
+    FX_STRSIZE iFind = wsAttrName.Find(L':', 0);
+    CFX_WideString wsNSPrefix;
+    if (iFind < 0) {
+      if (wsLocalAttributeName != wsAttrName) {
+        continue;
+      }
+    } else {
+      if (wsLocalAttributeName !=
+          wsAttrName.Right(wsAttrName.GetLength() - iFind - 1)) {
+        continue;
+      }
+      wsNSPrefix = wsAttrName.Left(iFind);
+    }
+    if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
+                                                    wsAttrNS)) {
+      continue;
+    }
+    if (bMatchNSAsPrefix) {
+      if (wsAttrNS.Left(wsNamespaceURIPrefix.GetLength()) !=
+          wsNamespaceURIPrefix) {
+        continue;
+      }
+    } else {
+      if (wsAttrNS != wsNamespaceURIPrefix) {
+        continue;
+      }
+    }
+    wsValue = wsAttrValue;
+    return TRUE;
+  }
+  return FALSE;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode,
+                                               XFA_XDPPACKET ePacketID) {
+  switch (ePacketID) {
+    case XFA_XDPPACKET_UNKNOWN:
+      return NULL;
+    case XFA_XDPPACKET_XDP:
+      return ParseAsXDPPacket_XDP(pXMLDocumentNode, ePacketID);
+    case XFA_XDPPACKET_Config:
+      return ParseAsXDPPacket_Config(pXMLDocumentNode, ePacketID);
+    case XFA_XDPPACKET_Template:
+    case XFA_XDPPACKET_Form:
+      return ParseAsXDPPacket_TemplateForm(pXMLDocumentNode, ePacketID);
+    case XFA_XDPPACKET_Datasets:
+      return ParseAsXDPPacket_Data(pXMLDocumentNode, ePacketID);
+    case XFA_XDPPACKET_Xdc:
+      return ParseAsXDPPacket_Xdc(pXMLDocumentNode, ePacketID);
+    case XFA_XDPPACKET_LocaleSet:
+    case XFA_XDPPACKET_ConnectionSet:
+    case XFA_XDPPACKET_SourceSet:
+      return ParseAsXDPPacket_LocaleConnectionSourceSet(pXMLDocumentNode,
+                                                        ePacketID);
+    default:
+      return ParseAsXDPPacket_User(pXMLDocumentNode, ePacketID);
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  if (!XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName,
+          XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) {
+    return nullptr;
+  }
+  CXFA_Node* pXFARootNode =
+      m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa);
+  if (!pXFARootNode) {
+    return nullptr;
+  }
+  m_pRootNode = pXFARootNode;
+  pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa"));
+  {
+    IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLDocumentNode;
+    int32_t iAttributeCount = pElement->CountAttributes();
+    for (int32_t i = 0; i < iAttributeCount; i++) {
+      CFX_WideString wsAttriName, wsAttriValue;
+      pElement->GetAttribute(i, wsAttriName, wsAttriValue);
+      if (wsAttriName == FX_WSTRC(L"uuid")) {
+        pXFARootNode->SetCData(XFA_ATTRIBUTE_Uuid, wsAttriValue);
+      } else if (wsAttriName == FX_WSTRC(L"timeStamp")) {
+        pXFARootNode->SetCData(XFA_ATTRIBUTE_TimeStamp, wsAttriValue);
+      }
+    }
+  }
+  IFDE_XMLNode* pXMLConfigDOMRoot = nullptr;
+  CXFA_Node* pXFAConfigDOMRoot = nullptr;
+  {
+    for (IFDE_XMLNode* pChildItem =
+             pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+         pChildItem;
+         pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+      const XFA_PACKETINFO* pPacketInfo =
+          XFA_GetPacketByIndex(XFA_PACKET_Config);
+      if (!XFA_FDEExtension_MatchNodeName(pChildItem, pPacketInfo->pName,
+                                          pPacketInfo->pURI,
+                                          pPacketInfo->eFlags)) {
+        continue;
+      }
+      if (pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
+        return nullptr;
+      }
+      pXMLConfigDOMRoot = pChildItem;
+      pXFAConfigDOMRoot =
+          ParseAsXDPPacket_Config(pXMLConfigDOMRoot, XFA_XDPPACKET_Config);
+      pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL);
+    }
+  }
+  IFDE_XMLNode* pXMLDatasetsDOMRoot = nullptr;
+  IFDE_XMLNode* pXMLFormDOMRoot = nullptr;
+  IFDE_XMLNode* pXMLTemplateDOMRoot = nullptr;
+  {
+    for (IFDE_XMLNode* pChildItem =
+             pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+         pChildItem;
+         pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+      if (!pChildItem || pChildItem->GetType() != FDE_XMLNODE_Element) {
+        continue;
+      }
+      if (pChildItem == pXMLConfigDOMRoot) {
+        continue;
+      }
+      IFDE_XMLElement* pElement =
+          reinterpret_cast<IFDE_XMLElement*>(pChildItem);
+      CFX_WideString wsPacketName;
+      pElement->GetLocalTagName(wsPacketName);
+      const XFA_PACKETINFO* pPacketInfo = XFA_GetPacketByName(wsPacketName);
+      if (pPacketInfo && pPacketInfo->pURI) {
+        if (!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName,
+                                            pPacketInfo->pURI,
+                                            pPacketInfo->eFlags)) {
+          pPacketInfo = nullptr;
+        }
+      }
+      XFA_XDPPACKET ePacket =
+          pPacketInfo ? pPacketInfo->eName : XFA_XDPPACKET_USER;
+      if (ePacket == XFA_XDPPACKET_XDP) {
+        continue;
+      }
+      if (ePacket == XFA_XDPPACKET_Datasets) {
+        if (pXMLDatasetsDOMRoot) {
+          return nullptr;
+        }
+        pXMLDatasetsDOMRoot = pElement;
+      } else if (ePacket == XFA_XDPPACKET_Form) {
+        if (pXMLFormDOMRoot) {
+          return nullptr;
+        }
+        pXMLFormDOMRoot = pElement;
+      } else if (ePacket == XFA_XDPPACKET_Template) {
+        if (pXMLTemplateDOMRoot) {
+          // Found a duplicate template packet.
+          return nullptr;
+        }
+        CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
+        if (pPacketNode) {
+          pXMLTemplateDOMRoot = pElement;
+          pXFARootNode->InsertChild(pPacketNode);
+        }
+      } else {
+        CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
+        if (pPacketNode) {
+          if (pPacketInfo &&
+              (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) &&
+              pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
+            return nullptr;
+          }
+          pXFARootNode->InsertChild(pPacketNode);
+        }
+      }
+    }
+  }
+  if (!pXMLTemplateDOMRoot) {
+    // No template is found.
+    return nullptr;
+  }
+  if (pXMLDatasetsDOMRoot) {
+    CXFA_Node* pPacketNode =
+        ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets);
+    if (pPacketNode) {
+      pXFARootNode->InsertChild(pPacketNode);
+    }
+  }
+  if (pXMLFormDOMRoot) {
+    CXFA_Node* pPacketNode =
+        ParseAsXDPPacket(pXMLFormDOMRoot, XFA_XDPPACKET_Form);
+    if (pPacketNode) {
+      pXFARootNode->InsertChild(pPacketNode);
+    }
+  }
+  pXFARootNode->SetXMLMappingNode(pXMLDocumentNode);
+  return pXFARootNode;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Config(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  if (!XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName,
+          XFA_GetPacketByIndex(XFA_PACKET_Config)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_Config)->eFlags)) {
+    return NULL;
+  }
+  CXFA_Node* pNode =
+      m_pFactory->CreateNode(XFA_XDPPACKET_Config, XFA_ELEMENT_Config);
+  if (!pNode) {
+    return NULL;
+  }
+  pNode->SetCData(XFA_ATTRIBUTE_Name,
+                  XFA_GetPacketByIndex(XFA_PACKET_Config)->pName);
+  if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
+    return NULL;
+  }
+  pNode->SetXMLMappingNode(pXMLDocumentNode);
+  return pNode;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_TemplateForm(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  CXFA_Node* pNode = NULL;
+  if (ePacketID == XFA_XDPPACKET_Template) {
+    if (XFA_FDEExtension_MatchNodeName(
+            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_Template)->eFlags)) {
+      pNode =
+          m_pFactory->CreateNode(XFA_XDPPACKET_Template, XFA_ELEMENT_Template);
+      if (!pNode) {
+        return NULL;
+      }
+      pNode->SetCData(XFA_ATTRIBUTE_Name,
+                      XFA_GetPacketByIndex(XFA_PACKET_Template)->pName);
+      if (m_bDocumentParser) {
+        CFX_WideString wsNamespaceURI;
+        IFDE_XMLElement* pXMLDocumentElement =
+            (IFDE_XMLElement*)pXMLDocumentNode;
+        pXMLDocumentElement->GetNamespaceURI(wsNamespaceURI);
+        if (wsNamespaceURI.IsEmpty()) {
+          pXMLDocumentElement->GetString(L"xmlns:xfa", wsNamespaceURI);
+        }
+        pNode->GetDocument()->RecognizeXFAVersionNumber(wsNamespaceURI);
+      }
+      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
+        return NULL;
+      }
+    }
+  } else if (ePacketID == XFA_XDPPACKET_Form) {
+    if (XFA_FDEExtension_MatchNodeName(
+            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_Form)->eFlags)) {
+      IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode;
+      CFX_WideString wsChecksum;
+      pXMLDocumentElement->GetString(L"checksum", wsChecksum);
+      if (wsChecksum.GetLength() != 28 ||
+          m_pXMLParser->m_dwCheckStatus != 0x03) {
+        return NULL;
+      }
+      IXFA_ChecksumContext* pChecksum = XFA_Checksum_Create();
+      pChecksum->StartChecksum();
+      pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0],
+                                m_pXMLParser->m_nSize[0]);
+      pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[1],
+                                m_pXMLParser->m_nSize[1]);
+      pChecksum->FinishChecksum();
+      CFX_ByteString bsCheck;
+      pChecksum->GetChecksum(bsCheck);
+      pChecksum->Release();
+      if (bsCheck != wsChecksum.UTF8Encode()) {
+        return NULL;
+      }
+
+      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form);
+      if (!pNode) {
+        return NULL;
+      }
+      pNode->SetCData(XFA_ATTRIBUTE_Name,
+                      XFA_GetPacketByIndex(XFA_PACKET_Form)->pName);
+      pNode->SetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum);
+      CXFA_Node* pTemplateRoot =
+          m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template);
+      CXFA_Node* pTemplateChosen =
+          pTemplateRoot
+              ? pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform)
+              : NULL;
+      FX_BOOL bUseAttribute = TRUE;
+      if (pTemplateChosen &&
+          pTemplateChosen->GetEnum(XFA_ATTRIBUTE_RestoreState) !=
+              XFA_ATTRIBUTEENUM_Auto) {
+        bUseAttribute = FALSE;
+      }
+      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID, bUseAttribute)) {
+        return NULL;
+      }
+    }
+  }
+  if (pNode) {
+    pNode->SetXMLMappingNode(pXMLDocumentNode);
+  }
+  return pNode;
+}
+static IFDE_XMLNode* XFA_GetDataSetsFromXDP(IFDE_XMLNode* pXMLDocumentNode) {
+  if (XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName,
+          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
+    return pXMLDocumentNode;
+  }
+  if (!XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName,
+          XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) {
+    return NULL;
+  }
+  for (IFDE_XMLNode* pDatasetsNode =
+           pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pDatasetsNode;
+       pDatasetsNode = pDatasetsNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    if (!XFA_FDEExtension_MatchNodeName(
+            pDatasetsNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
+      continue;
+    }
+    return pDatasetsNode;
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Data(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  IFDE_XMLNode* pDatasetsXMLNode = XFA_GetDataSetsFromXDP(pXMLDocumentNode);
+  if (pDatasetsXMLNode) {
+    CXFA_Node* pNode =
+        m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel);
+    if (!pNode) {
+      return NULL;
+    }
+    pNode->SetCData(XFA_ATTRIBUTE_Name,
+                    XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName);
+    if (!DataLoader(pNode, pDatasetsXMLNode, FALSE)) {
+      return NULL;
+    }
+    pNode->SetXMLMappingNode(pDatasetsXMLNode);
+    return pNode;
+  }
+  IFDE_XMLNode* pDataXMLNode = NULL;
+  if (XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, FX_WSTRC(L"data"),
+          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
+    ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa");
+    pDataXMLNode = pXMLDocumentNode;
+  } else {
+    IFDE_XMLElement* pDataElement =
+        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data"));
+    IFDE_XMLNode* pParentXMLNode =
+        pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::Parent);
+    if (pParentXMLNode) {
+      pParentXMLNode->RemoveChildNode(pXMLDocumentNode);
+    }
+    FXSYS_assert(pXMLDocumentNode->GetType() == FDE_XMLNODE_Element);
+    if (pXMLDocumentNode->GetType() == FDE_XMLNODE_Element) {
+      ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa");
+    }
+    pDataElement->InsertChildNode(pXMLDocumentNode);
+    pDataXMLNode = pDataElement;
+  }
+  if (pDataXMLNode) {
+    CXFA_Node* pNode =
+        m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
+    if (!pNode) {
+      if (pDataXMLNode != pXMLDocumentNode) {
+        pDataXMLNode->Release();
+      }
+      return NULL;
+    }
+    CFX_WideString wsLocalName;
+    ((IFDE_XMLElement*)pDataXMLNode)->GetLocalTagName(wsLocalName);
+    pNode->SetCData(XFA_ATTRIBUTE_Name, wsLocalName);
+    if (!DataLoader(pNode, pDataXMLNode, TRUE)) {
+      return NULL;
+    }
+    pNode->SetXMLMappingNode(pDataXMLNode);
+    if (pDataXMLNode != pXMLDocumentNode) {
+      pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
+    }
+    return pNode;
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_LocaleConnectionSourceSet(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  CXFA_Node* pNode = NULL;
+  if (ePacketID == XFA_XDPPACKET_LocaleSet) {
+    if (XFA_FDEExtension_MatchNodeName(
+            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->eFlags)) {
+      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_LocaleSet,
+                                     XFA_ELEMENT_LocaleSet);
+      if (!pNode) {
+        return NULL;
+      }
+      pNode->SetCData(XFA_ATTRIBUTE_Name,
+                      XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName);
+      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
+        return NULL;
+      }
+    }
+  } else if (ePacketID == XFA_XDPPACKET_ConnectionSet) {
+    if (XFA_FDEExtension_MatchNodeName(
+            pXMLDocumentNode,
+            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->eFlags)) {
+      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_ConnectionSet,
+                                     XFA_ELEMENT_ConnectionSet);
+      if (!pNode) {
+        return NULL;
+      }
+      pNode->SetCData(XFA_ATTRIBUTE_Name,
+                      XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName);
+      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
+        return NULL;
+      }
+    }
+  } else if (ePacketID == XFA_XDPPACKET_SourceSet) {
+    if (XFA_FDEExtension_MatchNodeName(
+            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName,
+            XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pURI,
+            XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->eFlags)) {
+      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_SourceSet,
+                                     XFA_ELEMENT_SourceSet);
+      if (!pNode) {
+        return NULL;
+      }
+      pNode->SetCData(XFA_ATTRIBUTE_Name,
+                      XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName);
+      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
+        return NULL;
+      }
+    }
+  }
+  if (pNode) {
+    pNode->SetXMLMappingNode(pXMLDocumentNode);
+  }
+  return pNode;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Xdc(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  if (XFA_FDEExtension_MatchNodeName(
+          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName,
+          XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pURI,
+          XFA_GetPacketByIndex(XFA_PACKET_Xdc)->eFlags)) {
+    CXFA_Node* pNode =
+        m_pFactory->CreateNode(XFA_XDPPACKET_Xdc, XFA_ELEMENT_Xdc);
+    if (!pNode) {
+      return NULL;
+    }
+    pNode->SetCData(XFA_ATTRIBUTE_Name,
+                    XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName);
+    pNode->SetXMLMappingNode(pXMLDocumentNode);
+    return pNode;
+  }
+  return NULL;
+}
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_User(
+    IFDE_XMLNode* pXMLDocumentNode,
+    XFA_XDPPACKET ePacketID) {
+  CXFA_Node* pNode =
+      m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Packet);
+  if (!pNode) {
+    return NULL;
+  }
+  CFX_WideString wsName;
+  ((IFDE_XMLElement*)pXMLDocumentNode)->GetLocalTagName(wsName);
+  pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
+  if (!UserPacketLoader(pNode, pXMLDocumentNode)) {
+    return NULL;
+  }
+  pNode->SetXMLMappingNode(pXMLDocumentNode);
+  return pNode;
+}
+CXFA_Node* CXFA_SimpleParser::UserPacketLoader(CXFA_Node* pXFANode,
+                                               IFDE_XMLNode* pXMLDoc) {
+  return pXFANode;
+}
+static FX_BOOL XFA_FDEExtension_IsStringAllWhitespace(CFX_WideString wsText) {
+  wsText.TrimRight(L"\x20\x9\xD\xA");
+  return wsText.IsEmpty();
+}
+CXFA_Node* CXFA_SimpleParser::DataLoader(CXFA_Node* pXFANode,
+                                         IFDE_XMLNode* pXMLDoc,
+                                         FX_BOOL bDoTransform) {
+  ParseDataGroup(pXFANode, pXMLDoc, XFA_XDPPACKET_Datasets);
+  return pXFANode;
+}
+CXFA_Node* CXFA_SimpleParser::NormalLoader(CXFA_Node* pXFANode,
+                                           IFDE_XMLNode* pXMLDoc,
+                                           XFA_XDPPACKET ePacketID,
+                                           FX_BOOL bUseAttribute) {
+  FX_BOOL bOneOfPropertyFound = FALSE;
+  for (IFDE_XMLNode* pXMLChild = pXMLDoc->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    switch (pXMLChild->GetType()) {
+      case FDE_XMLNODE_Element: {
+        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
+        CFX_WideString wsTagName;
+        pXMLElement->GetLocalTagName(wsTagName);
+        const XFA_ELEMENTINFO* pElemInfo = XFA_GetElementByName(wsTagName);
+        if (!pElemInfo) {
+          continue;
+        }
+        const XFA_PROPERTY* pPropertyInfo = XFA_GetPropertyOfElement(
+            pXFANode->GetClassID(), pElemInfo->eName, ePacketID);
+        if (pPropertyInfo &&
+            ((pPropertyInfo->uFlags &
+              (XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf)) != 0)) {
+          if (bOneOfPropertyFound) {
+            break;
+          }
+          bOneOfPropertyFound = TRUE;
+        }
+        CXFA_Node* pXFAChild =
+            m_pFactory->CreateNode(ePacketID, pElemInfo->eName);
+        if (pXFAChild == NULL) {
+          return NULL;
+        }
+        if (ePacketID == XFA_XDPPACKET_Config) {
+          pXFAChild->SetAttribute(XFA_ATTRIBUTE_Name, wsTagName);
+        }
+        FX_BOOL IsNeedValue = TRUE;
+        for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count;
+             i++) {
+          CFX_WideString wsAttrQualifiedName;
+          CFX_WideString wsAttrName;
+          CFX_WideString wsAttrValue;
+          pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue);
+          XFA_FDEExtension_GetAttributeLocalName(wsAttrQualifiedName,
+                                                 wsAttrName);
+          if (wsAttrName == FX_WSTRC(L"nil") &&
+              wsAttrValue == FX_WSTRC(L"true")) {
+            IsNeedValue = FALSE;
+          }
+          const XFA_ATTRIBUTEINFO* lpAttrInfo =
+              XFA_GetAttributeByName(wsAttrName);
+          if (!lpAttrInfo) {
+            continue;
+          }
+          if (!bUseAttribute && lpAttrInfo->eName != XFA_ATTRIBUTE_Name &&
+              lpAttrInfo->eName != XFA_ATTRIBUTE_Save) {
+            continue;
+          }
+          pXFAChild->SetAttribute(lpAttrInfo->eName, wsAttrValue);
+        }
+        pXFANode->InsertChild(pXFAChild);
+        if (pElemInfo->eName == XFA_ELEMENT_Validate ||
+            pElemInfo->eName == XFA_ELEMENT_Locale) {
+          if (ePacketID == XFA_XDPPACKET_Config) {
+            ParseContentNode(pXFAChild, pXMLElement, ePacketID);
+          } else {
+            NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute);
+          }
+          break;
+        }
+        switch (pXFAChild->GetObjectType()) {
+          case XFA_OBJECTTYPE_ContentNode:
+          case XFA_OBJECTTYPE_TextNode:
+          case XFA_OBJECTTYPE_NodeC:
+          case XFA_OBJECTTYPE_NodeV:
+            if (IsNeedValue) {
+              ParseContentNode(pXFAChild, pXMLElement, ePacketID);
+            }
+            break;
+          default:
+            NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute);
+            break;
+        }
+      } break;
+      case FDE_XMLNODE_Instruction:
+        ParseInstruction(pXFANode, (IFDE_XMLInstruction*)pXMLChild, ePacketID);
+        break;
+      default:
+        break;
+    }
+  }
+  return pXFANode;
+}
+FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode) {
+  if (pRichTextXMLNode) {
+    CFX_WideString wsNamespaceURI;
+    XFA_FDEExtension_GetElementTagNamespaceURI(pRichTextXMLNode,
+                                               wsNamespaceURI);
+    if (wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/1999/xhtml")) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+class RichTextNodeVisitor {
+ public:
+  static inline IFDE_XMLNode* GetFirstChild(IFDE_XMLNode* pNode) {
+    return pNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+  }
+  static inline IFDE_XMLNode* GetNextSibling(IFDE_XMLNode* pNode) {
+    return pNode->GetNodeItem(IFDE_XMLNode::NextSibling);
+  }
+  static inline IFDE_XMLNode* GetParent(IFDE_XMLNode* pNode) {
+    return pNode->GetNodeItem(IFDE_XMLNode::Parent);
+  }
+};
+
+void XFA_ConvertXMLToPlainText(IFDE_XMLElement* pRootXMLNode,
+                               CFX_WideString& wsOutput) {
+  for (IFDE_XMLNode* pXMLChild =
+           pRootXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    switch (pXMLChild->GetType()) {
+      case FDE_XMLNODE_Element: {
+        CFX_WideString wsTextData;
+        ((IFDE_XMLElement*)pXMLChild)->GetTextData(wsTextData);
+        wsTextData += FX_WSTRC(L"\n");
+        wsOutput += wsTextData;
+      } break;
+      case FDE_XMLNODE_Text: {
+        CFX_WideString wsText;
+        ((IFDE_XMLText*)pXMLChild)->GetText(wsText);
+        if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) {
+          continue;
+        } else {
+          wsOutput = wsText;
+        }
+      } break;
+      case FDE_XMLNODE_CharData: {
+        CFX_WideString wsCharData;
+        ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsCharData);
+        if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) {
+          continue;
+        } else {
+          wsOutput = wsCharData;
+        }
+      } break;
+      default:
+        FXSYS_assert(FALSE);
+        break;
+    }
+  }
+}
+
+void CXFA_SimpleParser::ParseContentNode(CXFA_Node* pXFANode,
+                                         IFDE_XMLNode* pXMLNode,
+                                         XFA_XDPPACKET ePacketID) {
+  XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
+  if (pXFANode->GetClassID() == XFA_ELEMENT_ExData) {
+    CFX_WideStringC wsContentType =
+        pXFANode->GetCData(XFA_ATTRIBUTE_ContentType);
+    if (wsContentType == FX_WSTRC(L"text/html"))
+      element = XFA_ELEMENT_SharpxHTML;
+    else if (wsContentType == FX_WSTRC(L"text/xml"))
+      element = XFA_ELEMENT_Sharpxml;
+  }
+  if (element == XFA_ELEMENT_SharpxHTML)
+    pXFANode->SetXMLMappingNode(pXMLNode);
+
+  CFX_WideString wsValue;
+  for (IFDE_XMLNode* pXMLChild =
+           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
+    if (eNodeType == FDE_XMLNODE_Instruction)
+      continue;
+
+    if (element == XFA_ELEMENT_SharpxHTML) {
+      if (eNodeType != FDE_XMLNODE_Element)
+        break;
+
+      if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild))
+        XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsValue);
+    } else if (element == XFA_ELEMENT_Sharpxml) {
+      if (eNodeType != FDE_XMLNODE_Element)
+        break;
+      XFA_ConvertXMLToPlainText((IFDE_XMLElement*)pXMLChild, wsValue);
+    } else {
+      if (eNodeType == FDE_XMLNODE_Element)
+        break;
+      if (eNodeType == FDE_XMLNODE_Text)
+        ((IFDE_XMLText*)pXMLChild)->GetText(wsValue);
+      else if (eNodeType == FDE_XMLNODE_CharData)
+        ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsValue);
+    }
+    break;
+  }
+  if (!wsValue.IsEmpty()) {
+    if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) {
+      CXFA_Node* pContentRawDataNode =
+          m_pFactory->CreateNode(ePacketID, element);
+      FXSYS_assert(pContentRawDataNode);
+      pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsValue);
+      pXFANode->InsertChild(pContentRawDataNode);
+    } else {
+      pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsValue);
+    }
+  }
+}
+
+void CXFA_SimpleParser::ParseDataGroup(CXFA_Node* pXFANode,
+                                       IFDE_XMLNode* pXMLNode,
+                                       XFA_XDPPACKET ePacketID) {
+  for (IFDE_XMLNode* pXMLChild =
+           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    switch (pXMLChild->GetType()) {
+      case FDE_XMLNODE_Element: {
+        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
+        {
+          CFX_WideString wsNamespaceURI;
+          XFA_FDEExtension_GetElementTagNamespaceURI(pXMLElement,
+                                                     wsNamespaceURI);
+          if (wsNamespaceURI ==
+                  FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") ||
+              wsNamespaceURI ==
+                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") ||
+              wsNamespaceURI ==
+                  FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance")) {
+            continue;
+          }
+          if (0) {
+            continue;
+          }
+        }
+        XFA_ELEMENT eNodeType = XFA_ELEMENT_DataModel;
+        if (eNodeType == XFA_ELEMENT_DataModel) {
+          CFX_WideString wsDataNodeAttr;
+          if (XFA_FDEExtension_FindAttributeWithNS(
+                  pXMLElement, FX_WSTRC(L"dataNode"),
+                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"),
+                  wsDataNodeAttr)) {
+            if (wsDataNodeAttr == FX_WSTRC(L"dataGroup")) {
+              eNodeType = XFA_ELEMENT_DataGroup;
+            } else if (wsDataNodeAttr == FX_WSTRC(L"dataValue")) {
+              eNodeType = XFA_ELEMENT_DataValue;
+            }
+          }
+        }
+        CFX_WideString wsContentType;
+        if (eNodeType == XFA_ELEMENT_DataModel) {
+          if (XFA_FDEExtension_FindAttributeWithNS(
+                  pXMLElement, FX_WSTRC(L"contentType"),
+                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"),
+                  wsContentType)) {
+            if (!wsContentType.IsEmpty()) {
+              eNodeType = XFA_ELEMENT_DataValue;
+            }
+          }
+        }
+        if (eNodeType == XFA_ELEMENT_DataModel) {
+          for (IFDE_XMLNode* pXMLDataChild =
+                   pXMLElement->GetNodeItem(IFDE_XMLNode::FirstChild);
+               pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNodeItem(
+                                  IFDE_XMLNode::NextSibling)) {
+            if (pXMLDataChild->GetType() == FDE_XMLNODE_Element) {
+              if (!XFA_RecognizeRichText((IFDE_XMLElement*)pXMLDataChild)) {
+                eNodeType = XFA_ELEMENT_DataGroup;
+                break;
+              }
+            }
+          }
+        }
+        if (eNodeType == XFA_ELEMENT_DataModel) {
+          eNodeType = XFA_ELEMENT_DataValue;
+        }
+        CXFA_Node* pXFAChild =
+            m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
+        if (pXFAChild == NULL) {
+          return;
+        }
+        CFX_WideString wsNodeName;
+        pXMLElement->GetLocalTagName(wsNodeName);
+        pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeName);
+        FX_BOOL bNeedValue = TRUE;
+        if (1) {
+          for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count;
+               i++) {
+            CFX_WideString wsAttrQualifiedName;
+            CFX_WideString wsAttrValue;
+            CFX_WideString wsAttrName;
+            CFX_WideString wsAttrNamespaceURI;
+            pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue);
+            if (!XFA_FDEExtension_ResolveAttribute(
+                    pXMLElement, wsAttrQualifiedName, wsAttrName,
+                    wsAttrNamespaceURI)) {
+              continue;
+            }
+            if (wsAttrName == FX_WSTRC(L"nil") &&
+                wsAttrValue == FX_WSTRC(L"true")) {
+              bNeedValue = FALSE;
+              continue;
+            }
+            if (wsAttrNamespaceURI ==
+                    FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") ||
+                wsAttrNamespaceURI ==
+                    FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") ||
+                wsAttrNamespaceURI ==
+                    FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance") ||
+                wsAttrNamespaceURI ==
+                    FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")) {
+              continue;
+            }
+            if (0) {
+              continue;
+            }
+            CXFA_Node* pXFAMetaData = m_pFactory->CreateNode(
+                XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue);
+            if (pXFAMetaData == NULL) {
+              return;
+            }
+            pXFAMetaData->SetCData(XFA_ATTRIBUTE_Name, wsAttrName);
+            pXFAMetaData->SetCData(XFA_ATTRIBUTE_QualifiedName,
+                                   wsAttrQualifiedName);
+            pXFAMetaData->SetCData(XFA_ATTRIBUTE_Value, wsAttrValue);
+            pXFAMetaData->SetEnum(XFA_ATTRIBUTE_Contains,
+                                  XFA_ATTRIBUTEENUM_MetaData);
+            pXFAChild->InsertChild(pXFAMetaData);
+            pXFAMetaData->SetXMLMappingNode(pXMLElement);
+            pXFAMetaData->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+          }
+          if (!bNeedValue) {
+            CFX_WideString wsNilName = FX_WSTRC(L"xsi:nil");
+            pXMLElement->RemoveAttribute(wsNilName);
+          }
+        }
+        pXFANode->InsertChild(pXFAChild);
+        if (eNodeType == XFA_ELEMENT_DataGroup) {
+          ParseDataGroup(pXFAChild, pXMLElement, ePacketID);
+        } else {
+          if (bNeedValue) {
+            ParseDataValue(pXFAChild, pXMLChild, XFA_XDPPACKET_Datasets);
+          }
+        }
+        pXFAChild->SetXMLMappingNode(pXMLElement);
+        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      }
+        continue;
+      case FDE_XMLNODE_CharData: {
+        IFDE_XMLCharData* pXMLCharData = (IFDE_XMLCharData*)pXMLChild;
+        CFX_WideString wsCharData;
+        pXMLCharData->GetCharData(wsCharData);
+        if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) {
+          continue;
+        }
+        CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
+                                                      XFA_ELEMENT_DataValue);
+        if (pXFAChild == NULL) {
+          return;
+        }
+        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCharData);
+        pXFANode->InsertChild(pXFAChild);
+        pXFAChild->SetXMLMappingNode(pXMLCharData);
+        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      }
+        continue;
+      case FDE_XMLNODE_Text: {
+        IFDE_XMLText* pXMLText = (IFDE_XMLText*)pXMLChild;
+        CFX_WideString wsText;
+        pXMLText->GetText(wsText);
+        if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) {
+          continue;
+        }
+        CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
+                                                      XFA_ELEMENT_DataValue);
+        if (pXFAChild == NULL) {
+          return;
+        }
+        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsText);
+        pXFANode->InsertChild(pXFAChild);
+        pXFAChild->SetXMLMappingNode(pXMLText);
+        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      }
+        continue;
+      case FDE_XMLNODE_Instruction:
+        continue;
+      default:
+        continue;
+    }
+  }
+}
+
+void CXFA_SimpleParser::ParseDataValue(CXFA_Node* pXFANode,
+                                       IFDE_XMLNode* pXMLNode,
+                                       XFA_XDPPACKET ePacketID) {
+  CFX_WideTextBuf wsValueTextBuf;
+  CFX_WideTextBuf wsCurValueTextBuf;
+  FX_BOOL bMarkAsCompound = FALSE;
+  IFDE_XMLNode* pXMLCurValueNode = nullptr;
+  for (IFDE_XMLNode* pXMLChild =
+           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pXMLChild;
+       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
+    if (eNodeType == FDE_XMLNODE_Instruction)
+      continue;
+
+    CFX_WideString wsText;
+    if (eNodeType == FDE_XMLNODE_Text) {
+      ((IFDE_XMLText*)pXMLChild)->GetText(wsText);
+      if (!pXMLCurValueNode)
+        pXMLCurValueNode = pXMLChild;
+
+      wsCurValueTextBuf << wsText;
+    } else if (eNodeType == FDE_XMLNODE_CharData) {
+      ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsText);
+      if (!pXMLCurValueNode)
+        pXMLCurValueNode = pXMLChild;
+
+      wsCurValueTextBuf << wsText;
+    } else if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) {
+      XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsText);
+      if (!pXMLCurValueNode)
+        pXMLCurValueNode = pXMLChild;
+
+      wsCurValueTextBuf << wsText;
+    } else {
+      bMarkAsCompound = TRUE;
+      if (pXMLCurValueNode) {
+        CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString();
+        if (!wsCurValue.IsEmpty()) {
+          CXFA_Node* pXFAChild =
+              m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
+          if (!pXFAChild)
+            return;
+
+          pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L""));
+          pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue);
+          pXFANode->InsertChild(pXFAChild);
+          pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
+          pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+          wsValueTextBuf << wsCurValue;
+          wsCurValueTextBuf.Clear();
+        }
+        pXMLCurValueNode = nullptr;
+      }
+      CXFA_Node* pXFAChild =
+          m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
+      if (!pXFAChild)
+        return;
+
+      CFX_WideString wsNodeStr;
+      ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr);
+      pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr);
+      ParseDataValue(pXFAChild, pXMLChild, ePacketID);
+      pXFANode->InsertChild(pXFAChild);
+      pXFAChild->SetXMLMappingNode(pXMLChild);
+      pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      CFX_WideStringC wsCurValue = pXFAChild->GetCData(XFA_ATTRIBUTE_Value);
+      wsValueTextBuf << wsCurValue;
+    }
+  }
+  if (pXMLCurValueNode) {
+    CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString();
+    if (!wsCurValue.IsEmpty()) {
+      if (bMarkAsCompound) {
+        CXFA_Node* pXFAChild =
+            m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
+        if (!pXFAChild)
+          return;
+
+        pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L""));
+        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue);
+        pXFANode->InsertChild(pXFAChild);
+        pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
+        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
+      }
+      wsValueTextBuf << wsCurValue;
+      wsCurValueTextBuf.Clear();
+    }
+    pXMLCurValueNode = nullptr;
+  }
+  CFX_WideStringC wsNodeValue = wsValueTextBuf.GetWideString();
+  pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsNodeValue);
+}
+
+void CXFA_SimpleParser::ParseInstruction(CXFA_Node* pXFANode,
+                                         IFDE_XMLInstruction* pXMLInstruction,
+                                         XFA_XDPPACKET ePacketID) {
+  if (!m_bDocumentParser) {
+    return;
+  }
+  CFX_WideString wsTargetName;
+  pXMLInstruction->GetTargetName(wsTargetName);
+  if (wsTargetName == FX_WSTRC(L"originalXFAVersion")) {
+    CFX_WideString wsData;
+    if (pXMLInstruction->GetData(0, wsData) &&
+        (pXFANode->GetDocument()->RecognizeXFAVersionNumber(wsData) !=
+         XFA_VERSION_UNKNOWN)) {
+      wsData.Empty();
+      if (pXMLInstruction->GetData(1, wsData) &&
+          wsData == FX_WSTRC(L"v2.7-scripting:1")) {
+        pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, TRUE);
+      }
+    }
+  } else if (wsTargetName == FX_WSTRC(L"acrobat")) {
+    CFX_WideString wsData;
+    if (pXMLInstruction->GetData(0, wsData) &&
+        wsData == FX_WSTRC(L"JavaScript")) {
+      if (pXMLInstruction->GetData(1, wsData) &&
+          wsData == FX_WSTRC(L"strictScoping")) {
+        pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, TRUE);
+      }
+    }
+  }
+}
+void CXFA_SimpleParser::CloseParser() {
+  if (m_pXMLDoc) {
+    m_pXMLDoc->Release();
+    m_pXMLDoc = NULL;
+  }
+  if (m_pStream) {
+    m_pStream->Release();
+    m_pStream = NULL;
+  }
+}
+IXFA_DocParser* IXFA_DocParser::Create(IXFA_Notify* pNotify) {
+  return new CXFA_DocumentParser(pNotify);
+}
+CXFA_DocumentParser::CXFA_DocumentParser(IXFA_Notify* pNotify)
+    : m_nodeParser(NULL, TRUE), m_pNotify(pNotify), m_pDocument(NULL) {}
+CXFA_DocumentParser::~CXFA_DocumentParser() {
+  CloseParser();
+}
+int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream,
+                                        XFA_XDPPACKET ePacketID) {
+  CloseParser();
+  int32_t nRetStatus = m_nodeParser.StartParse(pStream, ePacketID);
+  if (nRetStatus == XFA_PARSESTATUS_Ready) {
+    m_pDocument = new CXFA_Document(this);
+    m_nodeParser.SetFactory(m_pDocument);
+  }
+  return nRetStatus;
+}
+int32_t CXFA_DocumentParser::DoParse(IFX_Pause* pPause) {
+  int32_t nRetStatus = m_nodeParser.DoParse(pPause);
+  if (nRetStatus >= XFA_PARSESTATUS_Done) {
+    FXSYS_assert(m_pDocument);
+    m_pDocument->SetRoot(m_nodeParser.GetRootNode());
+  }
+  return nRetStatus;
+}
+int32_t CXFA_DocumentParser::ParseXMLData(const CFX_WideString& wsXML,
+                                          IFDE_XMLNode*& pXMLNode,
+                                          IFX_Pause* pPause) {
+  CloseParser();
+  int32_t nRetStatus = m_nodeParser.ParseXMLData(wsXML, pXMLNode, NULL);
+  if (nRetStatus == XFA_PARSESTATUS_Done && pXMLNode) {
+    m_pDocument = new CXFA_Document(this);
+    m_nodeParser.SetFactory(m_pDocument);
+  }
+  return nRetStatus;
+}
+void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode,
+                                           IFDE_XMLNode* pXMLNode) {
+  if (!pXFANode || !pXMLNode) {
+    return;
+  }
+  m_nodeParser.ConstructXFANode(pXFANode, pXMLNode);
+  CXFA_Node* pRootNode = m_nodeParser.GetRootNode();
+  if (m_pDocument && pRootNode) {
+    m_pDocument->SetRoot(pRootNode);
+  }
+}
+void CXFA_DocumentParser::CloseParser() {
+  if (m_pDocument) {
+    delete m_pDocument;
+    m_pDocument = NULL;
+  }
+  m_nodeParser.CloseParser();
+}
+CXFA_XMLParser::CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream)
+    : m_nElementStart(0),
+      m_dwCheckStatus(0),
+      m_dwCurrentCheckStatus(0),
+      m_pRoot(pRoot),
+      m_pStream(pStream),
+      m_pParser(nullptr),
+      m_pParent(pRoot),
+      m_pChild(nullptr),
+      m_NodeStack(16),
+      m_dwStatus(FDE_XMLSYNTAXSTATUS_None) {
+  ASSERT(m_pParent && m_pStream);
+  m_NodeStack.Push(m_pParent);
+  m_pParser = IFDE_XMLSyntaxParser::Create();
+  m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024);
+}
+CXFA_XMLParser::~CXFA_XMLParser() {
+  if (m_pParser) {
+    m_pParser->Release();
+  }
+  m_NodeStack.RemoveAll();
+  m_ws1.Empty();
+  m_ws2.Empty();
+}
+int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
+  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) {
+    return -1;
+  }
+  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
+    return 100;
+  }
+  int32_t iCount = 0;
+  while (TRUE) {
+    m_dwStatus = m_pParser->DoSyntaxParse();
+    switch (m_dwStatus) {
+      case FDE_XMLSYNTAXSTATUS_InstructionOpen:
+        break;
+      case FDE_XMLSYNTAXSTATUS_InstructionClose:
+        if (m_pChild) {
+          if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+            break;
+          }
+        }
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementOpen:
+        if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) {
+          m_nElementStart = m_pParser->GetCurrentPos() - 1;
+        }
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementBreak:
+        break;
+      case FDE_XMLSYNTAXSTATUS_ElementClose:
+        if (m_pChild->GetType() != FDE_XMLNODE_Element) {
+          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_pParser->GetTagName(m_ws1);
+        ((IFDE_XMLElement*)m_pChild)->GetTagName(m_ws2);
+        if (m_ws1.GetLength() > 0 && !m_ws1.Equal(m_ws2)) {
+          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        }
+        m_NodeStack.Pop();
+        if (m_NodeStack.GetSize() < 1) {
+          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+          break;
+        } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) {
+          m_nSize[m_dwCurrentCheckStatus - 1] =
+              m_pParser->GetCurrentBinaryPos() -
+              m_nStart[m_dwCurrentCheckStatus - 1];
+          m_dwCurrentCheckStatus = 0;
+        }
+
+        m_pParent = (IFDE_XMLNode*)*m_NodeStack.GetTopElement();
+        m_pChild = m_pParent;
+        iCount++;
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetName:
+        m_pParser->GetTargetName(m_ws1);
+        if (m_ws1 == FX_WSTRC(L"originalXFAVersion") ||
+            m_ws1 == FX_WSTRC(L"acrobat")) {
+          m_pChild = IFDE_XMLInstruction::Create(m_ws1);
+          m_pParent->InsertChildNode(m_pChild);
+        } else {
+          m_pChild = NULL;
+        }
+        m_ws1.Empty();
+        break;
+      case FDE_XMLSYNTAXSTATUS_TagName:
+        m_pParser->GetTagName(m_ws1);
+        m_pChild = IFDE_XMLElement::Create(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_NodeStack.Push(m_pChild);
+        m_pParent = m_pChild;
+
+        if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) {
+          CFX_WideString wsTag;
+          ((IFDE_XMLElement*)m_pChild)->GetLocalTagName(wsTag);
+          if (wsTag == FX_WSTRC(L"template")) {
+            m_dwCheckStatus |= 0x01;
+            m_dwCurrentCheckStatus = 0x01;
+            m_nStart[0] = m_pParser->GetCurrentBinaryPos() -
+                          (m_pParser->GetCurrentPos() - m_nElementStart);
+          } else if (wsTag == FX_WSTRC(L"datasets")) {
+            m_dwCheckStatus |= 0x02;
+            m_dwCurrentCheckStatus = 0x02;
+            m_nStart[1] = m_pParser->GetCurrentBinaryPos() -
+                          (m_pParser->GetCurrentPos() - m_nElementStart);
+          }
+        }
+        break;
+      case FDE_XMLSYNTAXSTATUS_AttriName:
+        m_pParser->GetAttributeName(m_ws1);
+        break;
+      case FDE_XMLSYNTAXSTATUS_AttriValue:
+        if (m_pChild) {
+          m_pParser->GetAttributeName(m_ws2);
+          if (m_pChild->GetType() == FDE_XMLNODE_Element) {
+            ((IFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2);
+          }
+        }
+        m_ws1.Empty();
+        break;
+      case FDE_XMLSYNTAXSTATUS_Text:
+        m_pParser->GetTextData(m_ws1);
+        m_pChild = IFDE_XMLText::Create(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_CData:
+        m_pParser->GetTextData(m_ws1);
+        m_pChild = IFDE_XMLCharData::Create(m_ws1);
+        m_pParent->InsertChildNode(m_pChild);
+        m_pChild = m_pParent;
+        break;
+      case FDE_XMLSYNTAXSTATUS_TargetData:
+        if (m_pChild) {
+          if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
+            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
+            break;
+          }
+          if (!m_ws1.IsEmpty()) {
+            ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
+          }
+          m_pParser->GetTargetData(m_ws1);
+          ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
+        }
+        m_ws1.Empty();
+        break;
+      default:
+        break;
+    }
+    if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error ||
+        m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
+      break;
+    }
+    if (pPause && iCount > 500 && pPause->NeedToPauseNow()) {
+      break;
+    }
+  }
+  return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1)
+             ? -1
+             : m_pParser->GetStatus();
+}
diff --git a/xfa/fxfa/parser/xfa_parser_imp.h b/xfa/fxfa/parser/xfa_parser_imp.h
new file mode 100644
index 0000000..136cae6
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_parser_imp.h
@@ -0,0 +1,138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_PARSER_IMP_H_
+#define XFA_FXFA_PARSER_XFA_PARSER_IMP_H_
+
+#include "xfa/fxfa/parser/xfa_parser.h"
+
+class CXFA_XMLParser;
+
+class CXFA_SimpleParser : public IXFA_Parser {
+ public:
+  CXFA_SimpleParser(IXFA_ObjFactory* pFactory, FX_BOOL bDocumentParser = FALSE);
+  ~CXFA_SimpleParser();
+  virtual void Release() { delete this; }
+
+  virtual int32_t StartParse(IFX_FileRead* pStream,
+                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP);
+  virtual int32_t DoParse(IFX_Pause* pPause = NULL);
+  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
+                               IFDE_XMLNode*& pXMLNode,
+                               IFX_Pause* pPause = NULL);
+  virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode);
+  virtual IXFA_ObjFactory* GetFactory() const { return m_pFactory; }
+  virtual CXFA_Node* GetRootNode() const { return m_pRootNode; }
+  virtual IFDE_XMLDoc* GetXMLDoc() const { return m_pXMLDoc; }
+  virtual void CloseParser();
+
+ protected:
+  CXFA_Node* ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode,
+                              XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_XDP(IFDE_XMLNode* pXMLDocumentNode,
+                                  XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_Config(IFDE_XMLNode* pXMLDocumentNode,
+                                     XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_TemplateForm(IFDE_XMLNode* pXMLDocumentNode,
+                                           XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_Data(IFDE_XMLNode* pXMLDocumentNode,
+                                   XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_LocaleConnectionSourceSet(
+      IFDE_XMLNode* pXMLDocumentNode,
+      XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_Xdc(IFDE_XMLNode* pXMLDocumentNode,
+                                  XFA_XDPPACKET ePacketID);
+  CXFA_Node* ParseAsXDPPacket_User(IFDE_XMLNode* pXMLDocumentNode,
+                                   XFA_XDPPACKET ePacketID);
+  CXFA_Node* NormalLoader(CXFA_Node* pXFANode,
+                          IFDE_XMLNode* pXMLDoc,
+                          XFA_XDPPACKET ePacketID,
+                          FX_BOOL bUseAttribute = TRUE);
+  CXFA_Node* DataLoader(CXFA_Node* pXFANode,
+                        IFDE_XMLNode* pXMLDoc,
+                        FX_BOOL bDoTransform);
+  CXFA_Node* UserPacketLoader(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc);
+  void ParseContentNode(CXFA_Node* pXFANode,
+                        IFDE_XMLNode* pXMLNode,
+                        XFA_XDPPACKET ePacketID);
+  void ParseDataValue(CXFA_Node* pXFANode,
+                      IFDE_XMLNode* pXMLNode,
+                      XFA_XDPPACKET ePacketID);
+  void ParseDataGroup(CXFA_Node* pXFANode,
+                      IFDE_XMLNode* pXMLNode,
+                      XFA_XDPPACKET ePacketID);
+  void ParseInstruction(CXFA_Node* pXFANode,
+                        IFDE_XMLInstruction* pXMLInstruction,
+                        XFA_XDPPACKET ePacketID);
+  void SetFactory(IXFA_ObjFactory* pFactory);
+
+  CXFA_XMLParser* m_pXMLParser;
+  IFDE_XMLDoc* m_pXMLDoc;
+  IFX_Stream* m_pStream;
+  IFX_FileRead* m_pFileRead;
+  IXFA_ObjFactory* m_pFactory;
+  CXFA_Node* m_pRootNode;
+  XFA_XDPPACKET m_ePacketID;
+  FX_BOOL m_bDocumentParser;
+  friend class CXFA_DocumentParser;
+};
+
+class CXFA_DocumentParser : public IXFA_DocParser {
+ public:
+  CXFA_DocumentParser(IXFA_Notify* pNotify);
+  ~CXFA_DocumentParser();
+  virtual void Release() { delete this; }
+  virtual int32_t StartParse(IFX_FileRead* pStream,
+                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP);
+  virtual int32_t DoParse(IFX_Pause* pPause = NULL);
+  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
+                               IFDE_XMLNode*& pXMLNode,
+                               IFX_Pause* pPause = NULL);
+  virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode);
+  virtual IXFA_ObjFactory* GetFactory() const {
+    return m_nodeParser.GetFactory();
+  }
+  virtual CXFA_Node* GetRootNode() const { return m_nodeParser.GetRootNode(); }
+  virtual IFDE_XMLDoc* GetXMLDoc() const { return m_nodeParser.GetXMLDoc(); }
+  virtual IXFA_Notify* GetNotify() const { return m_pNotify; }
+  virtual CXFA_Document* GetDocument() const { return m_pDocument; }
+  virtual void CloseParser();
+
+ protected:
+  CXFA_SimpleParser m_nodeParser;
+  IXFA_Notify* m_pNotify;
+  CXFA_Document* m_pDocument;
+};
+typedef CFX_StackTemplate<IFDE_XMLNode*> CXFA_XMLNodeStack;
+
+class CXFA_XMLParser : public IFDE_XMLParser {
+ public:
+  CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream);
+  ~CXFA_XMLParser();
+
+  virtual void Release() { delete this; }
+  virtual int32_t DoParser(IFX_Pause* pPause);
+
+  FX_FILESIZE m_nStart[2];
+  size_t m_nSize[2];
+  FX_FILESIZE m_nElementStart;
+  FX_WORD m_dwCheckStatus;
+  FX_WORD m_dwCurrentCheckStatus;
+
+ protected:
+  IFDE_XMLNode* m_pRoot;
+  IFX_Stream* m_pStream;
+  IFDE_XMLSyntaxParser* m_pParser;
+
+  IFDE_XMLNode* m_pParent;
+  IFDE_XMLNode* m_pChild;
+  CXFA_XMLNodeStack m_NodeStack;
+  CFX_WideString m_ws1;
+  CFX_WideString m_ws2;
+  FX_DWORD m_dwStatus;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_PARSER_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_parser_imp_embeddertest.cpp b/xfa/fxfa/parser/xfa_parser_imp_embeddertest.cpp
similarity index 100%
rename from xfa/src/fxfa/parser/xfa_parser_imp_embeddertest.cpp
rename to xfa/fxfa/parser/xfa_parser_imp_embeddertest.cpp
diff --git a/xfa/fxfa/parser/xfa_script.h b/xfa/fxfa/parser/xfa_script.h
new file mode 100644
index 0000000..6d8f3a0
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script.h
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_H_
+
+#include "xfa/include/fxfa/fxfa.h"
+#include "xfa/include/fxfa/fxfa_objectacc.h"
+
+#define XFA_RESOLVENODE_Children 0x0001
+#define XFA_RESOLVENODE_Attributes 0x0004
+#define XFA_RESOLVENODE_Properties 0x0008
+#define XFA_RESOLVENODE_Siblings 0x0020
+#define XFA_RESOLVENODE_Parent 0x0040
+#define XFA_RESOLVENODE_AnyChild 0x0080
+#define XFA_RESOLVENODE_ALL 0x0100
+#define XFA_RESOLVENODE_CreateNode 0x0400
+#define XFA_RESOLVENODE_Bind 0x0800
+#define XFA_RESOLVENODE_BindNew 0x1000
+
+enum XFA_SCRIPTLANGTYPE {
+  XFA_SCRIPTLANGTYPE_Formcalc = XFA_SCRIPTTYPE_Formcalc,
+  XFA_SCRIPTLANGTYPE_Javascript = XFA_SCRIPTTYPE_Javascript,
+  XFA_SCRIPTLANGTYPE_Unkown = XFA_SCRIPTTYPE_Unkown,
+};
+
+enum XFA_RESOVENODE_RSTYPE {
+  XFA_RESOVENODE_RSTYPE_Nodes,
+  XFA_RESOVENODE_RSTYPE_Attribute,
+  XFA_RESOLVENODE_RSTYPE_CreateNodeOne,
+  XFA_RESOLVENODE_RSTYPE_CreateNodeAll,
+  XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll,
+  XFA_RESOVENODE_RSTYPE_ExistNodes,
+};
+
+class CXFA_HVALUEArray : public CFX_ArrayTemplate<FXJSE_HVALUE> {
+ public:
+  CXFA_HVALUEArray(FXJSE_HRUNTIME hRunTime) : m_hRunTime(hRunTime) {}
+  ~CXFA_HVALUEArray() {
+    for (int32_t i = 0; i < GetSize(); i++) {
+      FXJSE_Value_Release(GetAt(i));
+    }
+  }
+  void GetAttributeObject(CXFA_ObjArray& objArray) {
+    for (int32_t i = 0; i < GetSize(); i++) {
+      CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(GetAt(i), NULL);
+      objArray.Add(pObject);
+    }
+  }
+  FXJSE_HRUNTIME m_hRunTime;
+};
+
+struct XFA_RESOLVENODE_RS {
+  XFA_RESOLVENODE_RS()
+      : dwFlags(XFA_RESOVENODE_RSTYPE_Nodes), pScriptAttribute(NULL) {}
+  ~XFA_RESOLVENODE_RS() { nodes.RemoveAll(); }
+  int32_t GetAttributeResult(CXFA_HVALUEArray& hValueArray) const {
+    if (pScriptAttribute && pScriptAttribute->eValueType == XFA_SCRIPT_Object) {
+      FXJSE_HRUNTIME hRunTime = hValueArray.m_hRunTime;
+      for (int32_t i = 0; i < nodes.GetSize(); i++) {
+        FXJSE_HVALUE hValue = FXJSE_Value_Create(hRunTime);
+        (nodes[i]->*(pScriptAttribute->lpfnCallback))(
+            hValue, FALSE, (XFA_ATTRIBUTE)pScriptAttribute->eAttribute);
+        hValueArray.Add(hValue);
+      }
+    }
+    return hValueArray.GetSize();
+  }
+
+  CXFA_ObjArray nodes;
+  XFA_RESOVENODE_RSTYPE dwFlags;
+  const XFA_SCRIPTATTRIBUTEINFO* pScriptAttribute;
+};
+
+struct XFA_JSBUILTININFO {
+  uint32_t uUnicodeHash;
+  const FX_CHAR* pName;
+};
+
+const XFA_JSBUILTININFO* XFA_GetJSBuiltinByHash(uint32_t uHashCode);
+
+class IXFA_ScriptContext {
+ public:
+  virtual ~IXFA_ScriptContext() {}
+  virtual void Release() = 0;
+  virtual void Initialize(FXJSE_HRUNTIME hRuntime) = 0;
+
+  virtual void SetEventParam(CXFA_EventParam param) = 0;
+  virtual CXFA_EventParam* GetEventParam() = 0;
+  virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType,
+                            const CFX_WideStringC& wsScript,
+                            FXJSE_HVALUE hRetValue,
+                            CXFA_Object* pThisObject = NULL) = 0;
+  virtual int32_t ResolveObjects(CXFA_Object* refNode,
+                                 const CFX_WideStringC& wsExpression,
+                                 XFA_RESOLVENODE_RS& resolveNodeRS,
+                                 FX_DWORD dwStyles = XFA_RESOLVENODE_Children,
+                                 CXFA_Node* bindNode = NULL) = 0;
+  virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject) = 0;
+  virtual void CacheList(CXFA_NodeList* pList) = 0;
+  virtual CXFA_Object* GetThisObject() const = 0;
+  virtual FXJSE_HRUNTIME GetRuntime() const = 0;
+  virtual int32_t GetIndexByName(CXFA_Node* refNode) = 0;
+  virtual int32_t GetIndexByClassName(CXFA_Node* refNode) = 0;
+  virtual void GetSomExpression(CXFA_Node* refNode,
+                                CFX_WideString& wsExpression) = 0;
+
+  virtual void SetNodesOfRunScript(CXFA_NodeArray* pArray) = 0;
+  virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes) = 0;
+  virtual void AddNodesOfRunScript(CXFA_Node* pNode) = 0;
+  virtual FXJSE_HCLASS GetJseNormalClass() = 0;
+  virtual XFA_SCRIPTLANGTYPE GetType() = 0;
+  virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) = 0;
+  virtual FX_BOOL IsRunAtClient() = 0;
+};
+IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument);
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_H_
diff --git a/xfa/fxfa/parser/xfa_script_datawindow.cpp b/xfa/fxfa/parser/xfa_script_datawindow.cpp
new file mode 100644
index 0000000..9c771e6
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_datawindow.cpp
@@ -0,0 +1,47 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_datawindow.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_DataWindow::CScript_DataWindow(CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_DataWindow) {
+  m_uScriptHash = XFA_HASHCODE_DataWindow;
+}
+CScript_DataWindow::~CScript_DataWindow() {}
+void CScript_DataWindow::Script_DataWindow_MoveCurrentRecord(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_DataWindow::Script_DataWindow_Record(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_DataWindow::Script_DataWindow_GotoRecord(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_DataWindow::Script_DataWindow_IsRecordGroup(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_DataWindow::Script_DataWindow_RecordsBefore(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {}
+void CScript_DataWindow::Script_DataWindow_CurrentRecordNumber(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {}
+void CScript_DataWindow::Script_DataWindow_RecordsAfter(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {}
+void CScript_DataWindow::Script_DataWindow_IsDefined(FXJSE_HVALUE hValue,
+                                                     FX_BOOL bSetting,
+                                                     XFA_ATTRIBUTE eAttribute) {
+}
diff --git a/xfa/fxfa/parser/xfa_script_datawindow.h b/xfa/fxfa/parser/xfa_script_datawindow.h
new file mode 100644
index 0000000..9974e11
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_datawindow.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+class CScript_DataWindow : public CXFA_OrdinaryObject {
+ public:
+  CScript_DataWindow(CXFA_Document* pDocument);
+  virtual ~CScript_DataWindow();
+  void Script_DataWindow_MoveCurrentRecord(CFXJSE_Arguments* pArguments);
+  void Script_DataWindow_Record(CFXJSE_Arguments* pArguments);
+  void Script_DataWindow_GotoRecord(CFXJSE_Arguments* pArguments);
+  void Script_DataWindow_IsRecordGroup(CFXJSE_Arguments* pArguments);
+  void Script_DataWindow_RecordsBefore(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_DataWindow_CurrentRecordNumber(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute);
+  void Script_DataWindow_RecordsAfter(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_DataWindow_IsDefined(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
diff --git a/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp
new file mode 100644
index 0000000..4e1cb22
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_eventpseudomodel.cpp
@@ -0,0 +1,269 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_eventpseudomodel.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_EventPseudoModel::CScript_EventPseudoModel(CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_EventPseudoModel) {
+  m_uScriptHash = XFA_HASHCODE_Event;
+}
+CScript_EventPseudoModel::~CScript_EventPseudoModel() {}
+void Script_EventPseudoModel_StringProperty(FXJSE_HVALUE hValue,
+                                            CFX_WideString& wsValue,
+                                            FX_BOOL bSetting) {
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
+  } else {
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+  }
+}
+void Script_EventPseudoModel_InterProperty(FXJSE_HVALUE hValue,
+                                           int32_t& iValue,
+                                           FX_BOOL bSetting) {
+  if (bSetting) {
+    iValue = FXJSE_Value_ToInteger(hValue);
+  } else {
+    FXJSE_Value_SetInteger(hValue, iValue);
+  }
+}
+void Script_EventPseudoModel_BooleanProperty(FXJSE_HVALUE hValue,
+                                             FX_BOOL& bValue,
+                                             FX_BOOL bSetting) {
+  if (bSetting) {
+    bValue = FXJSE_Value_ToBoolean(hValue);
+  } else {
+    FXJSE_Value_SetBoolean(hValue, bValue);
+  }
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Property(
+    FXJSE_HVALUE hValue,
+    FX_DWORD dwFlag,
+    FX_BOOL bSetting) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
+  if (!pEventParam) {
+    return;
+  }
+  switch (dwFlag) {
+    case XFA_EVENT_CANCELACTION:
+      Script_EventPseudoModel_BooleanProperty(
+          hValue, pEventParam->m_bCancelAction, bSetting);
+      break;
+    case XFA_EVENT_CHANGE:
+      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsChange,
+                                             bSetting);
+      break;
+    case XFA_EVENT_COMMITKEY:
+      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iCommitKey,
+                                            bSetting);
+      break;
+    case XFA_EVENT_FULLTEXT:
+      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsFullText,
+                                             bSetting);
+      break;
+    case XFA_EVENT_KEYDOWN:
+      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bKeyDown,
+                                              bSetting);
+      break;
+    case XFA_EVENT_MODIFIER:
+      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bModifier,
+                                              bSetting);
+      break;
+    case XFA_EVENT_NEWCONTENTTYPE:
+      Script_EventPseudoModel_StringProperty(
+          hValue, pEventParam->m_wsNewContentType, bSetting);
+      break;
+    case XFA_EVENT_NEWTEXT:
+      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsNewText,
+                                             bSetting);
+      break;
+    case XFA_EVENT_PREVCONTENTTYPE:
+      Script_EventPseudoModel_StringProperty(
+          hValue, pEventParam->m_wsPrevContentType, bSetting);
+      break;
+    case XFA_EVENT_PREVTEXT:
+      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsPrevText,
+                                             bSetting);
+      break;
+    case XFA_EVENT_REENTER:
+      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bReenter,
+                                              bSetting);
+      break;
+    case XFA_EVENT_SELEND:
+      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelEnd,
+                                            bSetting);
+      break;
+    case XFA_EVENT_SELSTART:
+      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelStart,
+                                            bSetting);
+      break;
+    case XFA_EVENT_SHIFT:
+      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bShift,
+                                              bSetting);
+      break;
+    case XFA_EVENT_SOAPFAULTCODE:
+      Script_EventPseudoModel_StringProperty(
+          hValue, pEventParam->m_wsSoapFaultCode, bSetting);
+      break;
+    case XFA_EVENT_SOAPFAULTSTRING:
+      Script_EventPseudoModel_StringProperty(
+          hValue, pEventParam->m_wsSoapFaultString, bSetting);
+      break;
+    case XFA_EVENT_TARGET:
+      break;
+    default:
+      break;
+  }
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_CancelAction(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_CANCELACTION, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Change(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_CHANGE, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_CommitKey(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_COMMITKEY, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_FullText(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_FULLTEXT, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_KeyDown(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_KEYDOWN, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Modifier(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_MODIFIER, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_NewContentType(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWCONTENTTYPE, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_NewText(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWTEXT, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_PrevContentType(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVCONTENTTYPE, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_PrevText(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVTEXT, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Reenter(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_REENTER, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_SelEnd(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELEND, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_SelStart(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELSTART, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Shift(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SHIFT, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultCode(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTCODE, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultString(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTSTRING, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Target(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  Script_EventPseudoModel_Property(hValue, XFA_EVENT_TARGET, bSetting);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Emit(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
+  if (!pEventParam) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_WidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler();
+  if (!pWidgetHandler) {
+    return;
+  }
+  pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam);
+}
+void CScript_EventPseudoModel::Script_EventPseudoModel_Reset(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+  if (!pScriptContext) {
+    return;
+  }
+  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
+  if (!pEventParam) {
+    return;
+  }
+  pEventParam->Reset();
+}
diff --git a/xfa/fxfa/parser/xfa_script_eventpseudomodel.h b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
new file mode 100644
index 0000000..e1db83a
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
@@ -0,0 +1,96 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+#define XFA_EVENT_CHANGE 0
+#define XFA_EVENT_COMMITKEY 1
+#define XFA_EVENT_FULLTEXT 2
+#define XFA_EVENT_KEYDOWN 3
+#define XFA_EVENT_MODIFIER 4
+#define XFA_EVENT_NEWCONTENTTYPE 5
+#define XFA_EVENT_NEWTEXT 6
+#define XFA_EVENT_PREVCONTENTTYPE 7
+#define XFA_EVENT_PREVTEXT 8
+#define XFA_EVENT_REENTER 9
+#define XFA_EVENT_SELEND 10
+#define XFA_EVENT_SELSTART 11
+#define XFA_EVENT_SHIFT 12
+#define XFA_EVENT_SOAPFAULTCODE 13
+#define XFA_EVENT_SOAPFAULTSTRING 14
+#define XFA_EVENT_TARGET 15
+#define XFA_EVENT_CANCELACTION 16
+
+class CScript_EventPseudoModel : public CXFA_OrdinaryObject {
+ public:
+  explicit CScript_EventPseudoModel(CXFA_Document* pDocument);
+  virtual ~CScript_EventPseudoModel();
+
+  void Script_EventPseudoModel_CancelAction(FXJSE_HVALUE hValue,
+                                            FX_BOOL bSetting,
+                                            XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_Change(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_CommitKey(FXJSE_HVALUE hValue,
+                                         FX_BOOL bSetting,
+                                         XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_FullText(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_KeyDown(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_Modifier(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_NewContentType(FXJSE_HVALUE hValue,
+                                              FX_BOOL bSetting,
+                                              XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_NewText(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_PrevContentType(FXJSE_HVALUE hValue,
+                                               FX_BOOL bSetting,
+                                               XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_PrevText(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_Reenter(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_SelEnd(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_SelStart(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_Shift(FXJSE_HVALUE hValue,
+                                     FX_BOOL bSetting,
+                                     XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_SoapFaultCode(FXJSE_HVALUE hValue,
+                                             FX_BOOL bSetting,
+                                             XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_SoapFaultString(FXJSE_HVALUE hValue,
+                                               FX_BOOL bSetting,
+                                               XFA_ATTRIBUTE eAttribute);
+  void Script_EventPseudoModel_Target(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+
+  void Script_EventPseudoModel_Emit(CFXJSE_Arguments* pArguments);
+  void Script_EventPseudoModel_Reset(CFXJSE_Arguments* pArguments);
+
+ protected:
+  void Script_EventPseudoModel_Property(FXJSE_HVALUE hValue,
+                                        FX_DWORD dwFlag,
+                                        FX_BOOL bSetting);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp
new file mode 100644
index 0000000..1f5886b
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp
@@ -0,0 +1,800 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_hostpseudomodel.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_HostPseudoModel) {
+  m_uScriptHash = XFA_HASHCODE_Host;
+}
+CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
+void CScript_HostPseudoModel::Script_HostPseudoModel_LoadString(
+    FXJSE_HVALUE hValue,
+    IXFA_Notify* pNotify,
+    FX_DWORD dwFlag) {
+  CFX_WideString wsValue;
+  pNotify->GetAppProvider()->LoadString(dwFlag, wsValue);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_AppType(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CFX_WideString wsAppType;
+  pNotify->GetAppProvider()->GetAppType(wsAppType);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitAppType(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CFX_WideString wsAppType;
+  pNotify->GetAppProvider()->GetFoxitAppType(wsAppType);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_CalculationsEnabled(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  if (bSetting) {
+    pNotify->GetDocProvider()->SetCalculationsEnabled(
+        hDoc, FXJSE_Value_ToBoolean(hValue));
+    return;
+  }
+  FX_BOOL bEnabled = pNotify->GetDocProvider()->IsCalculationsEnabled(hDoc);
+  FXJSE_Value_SetBoolean(hValue, bEnabled);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentPage(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  if (bSetting) {
+    pNotify->GetDocProvider()->SetCurrentPage(hDoc,
+                                              FXJSE_Value_ToInteger(hValue));
+    return;
+  }
+  int32_t iCurrentPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
+  FXJSE_Value_SetInteger(hValue, iCurrentPage);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Language(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_LANGUAGE);
+    return;
+  }
+  CFX_WideString wsLanguage;
+  pNotify->GetAppProvider()->GetLanguage(wsLanguage);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsLanguage));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_NumPages(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_NUMPAGES);
+    return;
+  }
+  int32_t iNumPages = pNotify->GetDocProvider()->CountPages(hDoc);
+  FXJSE_Value_SetInteger(hValue, iNumPages);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Platform(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_PLATFORM);
+    return;
+  }
+  CFX_WideString wsPlatform;
+  pNotify->GetAppProvider()->GetPlatform(wsPlatform);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsPlatform));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Title(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  if (bSetting) {
+    CFX_ByteString bsValue;
+    FXJSE_Value_ToUTF8String(hValue, bsValue);
+    pNotify->GetDocProvider()->SetTitle(
+        hDoc, CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
+    return;
+  }
+  CFX_WideString wsTitle;
+  pNotify->GetDocProvider()->GetTitle(hDoc, wsTitle);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsTitle));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_ValidationsEnabled(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  if (bSetting) {
+    pNotify->GetDocProvider()->SetValidationsEnabled(
+        hDoc, FXJSE_Value_ToBoolean(hValue));
+    return;
+  }
+  FX_BOOL bEnabled = pNotify->GetDocProvider()->IsValidationsEnabled(hDoc);
+  FXJSE_Value_SetBoolean(hValue, bEnabled);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Variation(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VARIATION);
+    return;
+  }
+  CFX_WideString wsVariation;
+  pNotify->GetAppProvider()->GetVariation(wsVariation);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVariation));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Version(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
+    return;
+  }
+  CFX_WideString wsVersion;
+  pNotify->GetAppProvider()->GetVersion(wsVersion);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitVersion(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
+    return;
+  }
+  CFX_WideString wsVersion;
+  pNotify->GetAppProvider()->GetFoxitVersion(wsVersion);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Name(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CFX_WideString wsAppName;
+  pNotify->GetAppProvider()->GetAppName(wsAppName);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppName));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitName(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
+    return;
+  }
+  CFX_WideString wsFoxitAppName;
+  pNotify->GetAppProvider()->GetFoxitAppName(wsFoxitAppName);
+  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsFoxitAppName));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_GotoURL(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"gotoURL");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CFX_WideString wsURL;
+  if (iLength >= 1) {
+    CFX_ByteString bsURL = pArguments->GetUTF8String(0);
+    wsURL = CFX_WideString::FromUTF8(bsURL, bsURL.GetLength());
+  }
+  pNotify->GetDocProvider()->GotoURL(hDoc, wsURL);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_OpenList(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"openList");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    FXJSE_HVALUE hValue = pArguments->GetValue(0);
+    if (FXJSE_Value_IsObject(hValue)) {
+      pNode = static_cast<CXFA_Node*>(FXJSE_Value_ToObject(hValue, nullptr));
+    } else if (FXJSE_Value_IsUTF8String(hValue)) {
+      CFX_ByteString bsString;
+      FXJSE_Value_ToUTF8String(hValue, bsString);
+      CFX_WideString wsExpression =
+          CFX_WideString::FromUTF8(bsString, bsString.GetLength());
+      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+      if (!pScriptContext) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      CXFA_Object* pObject = pScriptContext->GetThisObject();
+      if (!pObject) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
+                        XFA_RESOLVENODE_Siblings;
+      XFA_RESOLVENODE_RS resoveNodeRS;
+      int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
+                                                    resoveNodeRS, dwFlag);
+      if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      pNode = resoveNodeRS.nodes[0]->AsNode();
+    }
+    FXJSE_Value_Release(hValue);
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
+  if (!hWidget) {
+    return;
+  }
+  pNotify->GetDocProvider()->SetFocusWidget(pNotify->GetHDOC(), hWidget);
+  pNotify->OpenDropDownList(hWidget);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Response(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 4) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"response");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CFX_WideString wsQuestion;
+  CFX_WideString wsTitle;
+  CFX_WideString wsDefaultAnswer;
+  FX_BOOL bMark = FALSE;
+  if (iLength >= 1) {
+    CFX_ByteString bsQuestion = pArguments->GetUTF8String(0);
+    wsQuestion = CFX_WideString::FromUTF8(bsQuestion, bsQuestion.GetLength());
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsTitle = pArguments->GetUTF8String(1);
+    wsTitle = CFX_WideString::FromUTF8(bsTitle, bsTitle.GetLength());
+  }
+  if (iLength >= 3) {
+    CFX_ByteString bsDefaultAnswer = pArguments->GetUTF8String(2);
+    wsDefaultAnswer =
+        CFX_WideString::FromUTF8(bsDefaultAnswer, bsDefaultAnswer.GetLength());
+  }
+  if (iLength >= 4) {
+    bMark = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
+  }
+  CFX_WideString wsAnswer;
+  pNotify->GetAppProvider()->Response(wsAnswer, wsQuestion, wsTitle,
+                                      wsDefaultAnswer, bMark);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAnswer));
+  }
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentInBatch(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  int32_t iCur = pNotify->GetAppProvider()->GetCurDocumentInBatch();
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iCur);
+  }
+}
+static int32_t XFA_FilterName(const CFX_WideStringC& wsExpression,
+                              int32_t nStart,
+                              CFX_WideString& wsFilter) {
+  FXSYS_assert(nStart > -1);
+  int32_t iLength = wsExpression.GetLength();
+  if (nStart >= iLength) {
+    return iLength;
+  }
+  FX_WCHAR* pBuf = wsFilter.GetBuffer(iLength - nStart);
+  int32_t nCount = 0;
+  const FX_WCHAR* pSrc = wsExpression.GetPtr();
+  FX_WCHAR wCur;
+  while (nStart < iLength) {
+    wCur = pSrc[nStart++];
+    if (wCur == ',') {
+      break;
+    }
+    pBuf[nCount++] = wCur;
+  }
+  wsFilter.ReleaseBuffer(nCount);
+  wsFilter.TrimLeft();
+  wsFilter.TrimRight();
+  return nStart;
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_ResetData(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 0 || iLength > 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resetData");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CFX_WideString wsExpression;
+  if (iLength >= 1) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  }
+  if (wsExpression.IsEmpty()) {
+    pNotify->ResetData();
+    return;
+  }
+  int32_t iStart = 0;
+  CFX_WideString wsName;
+  CXFA_Node* pNode = NULL;
+  int32_t iExpLength = wsExpression.GetLength();
+  while (iStart < iExpLength) {
+    iStart = XFA_FilterName(wsExpression, iStart, wsName);
+    IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+    if (!pScriptContext) {
+      return;
+    }
+    CXFA_Object* pObject = pScriptContext->GetThisObject();
+    if (!pObject) {
+      return;
+    }
+    FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
+                      XFA_RESOLVENODE_Siblings;
+    XFA_RESOLVENODE_RS resoveNodeRS;
+    int32_t iRet =
+        pScriptContext->ResolveObjects(pObject, wsName, resoveNodeRS, dwFlag);
+    if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
+      continue;
+    }
+    pNode = resoveNodeRS.nodes[0]->AsNode();
+    pNotify->ResetData(pNode->GetWidgetData());
+  }
+  if (!pNode) {
+    pNotify->ResetData();
+  }
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Beep(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 0 || iLength > 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"beep");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  FX_DWORD dwType = 4;
+  if (iLength >= 1) {
+    dwType = pArguments->GetInt32(0);
+  }
+  pNotify->GetAppProvider()->Beep(dwType);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_SetFocus(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setFocus");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    FXJSE_HVALUE hValue = pArguments->GetValue(0);
+    if (FXJSE_Value_IsObject(hValue)) {
+      pNode = static_cast<CXFA_Node*>(FXJSE_Value_ToObject(hValue, NULL));
+    } else if (FXJSE_Value_IsUTF8String(hValue)) {
+      CFX_ByteString bsString;
+      FXJSE_Value_ToUTF8String(hValue, bsString);
+      CFX_WideString wsExpression =
+          CFX_WideString::FromUTF8(bsString, bsString.GetLength());
+      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
+      if (!pScriptContext) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      CXFA_Object* pObject = pScriptContext->GetThisObject();
+      if (!pObject) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
+                        XFA_RESOLVENODE_Siblings;
+      XFA_RESOLVENODE_RS resoveNodeRS;
+      int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
+                                                    resoveNodeRS, dwFlag);
+      if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
+        FXJSE_Value_Release(hValue);
+        return;
+      }
+      pNode = resoveNodeRS.nodes[0]->AsNode();
+    }
+    FXJSE_Value_Release(hValue);
+  }
+  pNotify->SetFocusWidgetNode(pNode);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_GetFocus(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CXFA_Node* pNode = pNotify->GetFocusWidgetNode();
+  if (!pNode) {
+    return;
+  }
+  FXJSE_Value_Set(pArguments->GetReturnValue(),
+                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_MessageBox(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 4) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"messageBox");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CFX_WideString wsMessage;
+  CFX_WideString bsTitle;
+  FX_DWORD dwMessageType = XFA_MBICON_Error;
+  FX_DWORD dwButtonType = XFA_MB_OK;
+  if (iLength >= 1) {
+    if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 0, wsMessage)) {
+      return;
+    }
+  }
+  if (iLength >= 2) {
+    if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 1, bsTitle)) {
+      return;
+    }
+  }
+  if (iLength >= 3) {
+    dwMessageType = pArguments->GetInt32(2);
+    if (dwMessageType > XFA_MBICON_Status) {
+      dwMessageType = XFA_MBICON_Error;
+    }
+  }
+  if (iLength >= 4) {
+    dwButtonType = pArguments->GetInt32(3);
+    if (dwButtonType > XFA_MB_YesNoCancel) {
+      dwButtonType = XFA_MB_OK;
+    }
+  }
+  int32_t iValue = pNotify->GetAppProvider()->MsgBox(
+      wsMessage, bsTitle, dwMessageType, dwButtonType);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iValue);
+  }
+}
+FX_BOOL CScript_HostPseudoModel::Script_HostPseudoModel_ValidateArgsForMsg(
+    CFXJSE_Arguments* pArguments,
+    int32_t iArgIndex,
+    CFX_WideString& wsValue) {
+  if (pArguments == NULL || iArgIndex < 0) {
+    return FALSE;
+  }
+  FX_BOOL bIsJsType = FALSE;
+  if (m_pDocument->GetScriptContext()->GetType() ==
+      XFA_SCRIPTLANGTYPE_Javascript) {
+    bIsJsType = TRUE;
+  }
+  FXJSE_HVALUE hValueArg = pArguments->GetValue(iArgIndex);
+  if (!FXJSE_Value_IsUTF8String(hValueArg) && bIsJsType) {
+    ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
+    FXJSE_Value_Release(hValueArg);
+    return FALSE;
+  }
+  if (FXJSE_Value_IsNull(hValueArg)) {
+    wsValue = FX_WSTRC(L"");
+  } else {
+    CFX_ByteString byMessage;
+    FXJSE_Value_ToUTF8String(hValueArg, byMessage);
+    wsValue = CFX_WideString::FromUTF8(byMessage, byMessage.GetLength());
+  }
+  FXJSE_Value_Release(hValueArg);
+  return TRUE;
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentCountInBatch(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  int32_t iValue = pNotify->GetAppProvider()->GetDocumentCountInBatch();
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iValue);
+  }
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_Print(
+    CFXJSE_Arguments* pArguments) {
+  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
+    return;
+  }
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 8) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"print");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  FX_DWORD dwOptions = 0;
+  FX_BOOL bShowDialog = TRUE;
+  if (iLength >= 1) {
+    bShowDialog = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
+  }
+  if (bShowDialog) {
+    dwOptions |= XFA_PRINTOPT_ShowDialog;
+  }
+  int32_t nStartPage = 0;
+  if (iLength >= 2) {
+    nStartPage = pArguments->GetInt32(1);
+  }
+  int32_t nEndPage = 0;
+  if (iLength >= 3) {
+    nEndPage = pArguments->GetInt32(2);
+  }
+  FX_BOOL bCanCancel = TRUE;
+  if (iLength >= 4) {
+    bCanCancel = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
+  }
+  if (bCanCancel) {
+    dwOptions |= XFA_PRINTOPT_CanCancel;
+  }
+  FX_BOOL bShrinkPage = TRUE;
+  if (iLength >= 5) {
+    bShrinkPage = pArguments->GetInt32(4) == 0 ? FALSE : TRUE;
+  }
+  if (bShrinkPage) {
+    dwOptions |= XFA_PRINTOPT_ShrinkPage;
+  }
+  FX_BOOL bAsImage = TRUE;
+  if (iLength >= 6) {
+    bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
+  }
+  if (bAsImage) {
+    dwOptions |= XFA_PRINTOPT_AsImage;
+  }
+  FX_BOOL bReverseOrder = TRUE;
+  if (iLength >= 7) {
+    bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
+  }
+  bReverseOrder = pArguments->GetInt32(6) == 0 ? FALSE : TRUE;
+  if (bReverseOrder) {
+    dwOptions |= XFA_PRINTOPT_ReverseOrder;
+  }
+  FX_BOOL bPrintAnnot = TRUE;
+  if (iLength >= 8) {
+    bPrintAnnot = pArguments->GetInt32(7) == 0 ? FALSE : TRUE;
+  }
+  if (bPrintAnnot) {
+    dwOptions |= XFA_PRINTOPT_PrintAnnot;
+  }
+  pNotify->GetDocProvider()->Print(hDoc, nStartPage, nEndPage, dwOptions);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_ImportData(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 0 || iLength > 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"importData");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CFX_WideString wsFilePath;
+  if (iLength > 0) {
+    CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
+    wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  pNotify->GetDocProvider()->ImportData(hDoc, wsFilePath);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_ExportData(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 0 || iLength > 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"exportData");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CFX_WideString wsFilePath;
+  FX_BOOL bXDP = TRUE;
+  if (iLength >= 1) {
+    CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
+    wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
+  }
+  if (iLength >= 2) {
+    bXDP = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
+  }
+  pNotify->GetDocProvider()->ExportData(hDoc, wsFilePath, bXDP);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_PageUp(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
+  int32_t nNewPage = 0;
+  if (nCurPage <= 1) {
+    return;
+  }
+  nNewPage = nCurPage - 1;
+  pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_PageDown(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
+  int32_t nPageCount = pNotify->GetDocProvider()->CountPages(hDoc);
+  if (!nPageCount || nCurPage == nPageCount) {
+    return;
+  }
+  int32_t nNewPage = 0;
+  if (nCurPage >= nPageCount) {
+    nNewPage = nPageCount - 1;
+  } else {
+    nNewPage = nCurPage + 1;
+  }
+  pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
+}
+void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentDateTime(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  CFX_WideString wsDataTime = pNotify->GetCurrentDateTime();
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsDataTime));
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_script_hostpseudomodel.h b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
new file mode 100644
index 0000000..dcc2a9b
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
@@ -0,0 +1,89 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
+
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+class CScript_HostPseudoModel : public CXFA_OrdinaryObject {
+ public:
+  CScript_HostPseudoModel(CXFA_Document* pDocument);
+  virtual ~CScript_HostPseudoModel();
+
+  void Script_HostPseudoModel_AppType(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_FoxitAppType(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_CalculationsEnabled(FXJSE_HVALUE hValue,
+                                                  FX_BOOL bSetting,
+                                                  XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_CurrentPage(FXJSE_HVALUE hValue,
+                                          FX_BOOL bSetting,
+                                          XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Language(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_NumPages(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Platform(FXJSE_HVALUE hValue,
+                                       FX_BOOL bSetting,
+                                       XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Title(FXJSE_HVALUE hValue,
+                                    FX_BOOL bSetting,
+                                    XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_ValidationsEnabled(FXJSE_HVALUE hValue,
+                                                 FX_BOOL bSetting,
+                                                 XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Variation(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Version(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_FoxitVersion(FXJSE_HVALUE hValue,
+                                           FX_BOOL bSetting,
+                                           XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_Name(FXJSE_HVALUE hValue,
+                                   FX_BOOL bSetting,
+                                   XFA_ATTRIBUTE eAttribute);
+  void Script_HostPseudoModel_FoxitName(FXJSE_HVALUE hValue,
+                                        FX_BOOL bSetting,
+                                        XFA_ATTRIBUTE eAttribute);
+
+  void Script_HostPseudoModel_GotoURL(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_OpenList(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_Response(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_DocumentInBatch(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_ResetData(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_Beep(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_SetFocus(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_GetFocus(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_MessageBox(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_DocumentCountInBatch(
+      CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_Print(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_ImportData(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_ExportData(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_PageUp(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_PageDown(CFXJSE_Arguments* pArguments);
+  void Script_HostPseudoModel_CurrentDateTime(CFXJSE_Arguments* pArguments);
+
+ protected:
+  void Script_HostPseudoModel_LoadString(FXJSE_HVALUE hValue,
+                                         IXFA_Notify* pNotify,
+                                         FX_DWORD dwFlag);
+  FX_BOOL Script_HostPseudoModel_ValidateArgsForMsg(
+      CFXJSE_Arguments* pArguments,
+      int32_t iArgIndex,
+      CFX_WideString& wsValue);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/xfa_script_imp.cpp b/xfa/fxfa/parser/xfa_script_imp.cpp
new file mode 100644
index 0000000..275f494
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_imp.cpp
@@ -0,0 +1,781 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_imp.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_script_nodehelper.h"
+#include "xfa/fxfa/parser/xfa_script_resolveprocessor.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument)
+    : m_pDocument(pDocument),
+      m_hJsContext(nullptr),
+      m_hJsRuntime(nullptr),
+      m_hJsClass(nullptr),
+      m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown),
+      m_pScriptNodeArray(nullptr),
+      m_pResolveProcessor(nullptr),
+      m_hFM2JSContext(nullptr),
+      m_pThisObject(nullptr),
+      m_dwBuiltInInFlags(0),
+      m_eRunAtType(XFA_ATTRIBUTEENUM_Client) {
+  FXSYS_memset(&m_JsGlobalClass, 0, sizeof(FXJSE_CLASS));
+  FXSYS_memset(&m_JsNormalClass, 0, sizeof(FXJSE_CLASS));
+}
+CXFA_ScriptContext::~CXFA_ScriptContext() {
+  FX_POSITION ps = m_mapXFAToHValue.GetStartPosition();
+  while (ps) {
+    CXFA_Object* pXFAObj;
+    FXJSE_HVALUE pValue;
+    m_mapXFAToHValue.GetNextAssoc(ps, pXFAObj, pValue);
+    FXJSE_Value_Release(pValue);
+  }
+  m_mapXFAToHValue.RemoveAll();
+  ReleaseVariablesMap();
+  if (m_hFM2JSContext) {
+    XFA_FM2JS_ContextRelease(m_hFM2JSContext);
+    m_hFM2JSContext = NULL;
+  }
+  if (m_hJsContext) {
+    FXJSE_Context_Release(m_hJsContext);
+    m_hJsContext = NULL;
+  }
+  if (m_pResolveProcessor) {
+    delete m_pResolveProcessor;
+    m_pResolveProcessor = NULL;
+  }
+  m_upObjectArray.RemoveAll();
+  for (int32_t i = 0; i < m_CacheListArray.GetSize(); i++) {
+    delete ((CXFA_NodeList*)m_CacheListArray[i]);
+  }
+  m_CacheListArray.RemoveAll();
+}
+void CXFA_ScriptContext::Initialize(FXJSE_HRUNTIME hRuntime) {
+  m_hJsRuntime = hRuntime;
+  DefineJsContext();
+  DefineJsClass();
+  m_pResolveProcessor = new CXFA_ResolveProcessor;
+}
+void CXFA_ScriptContext::Release() {
+  delete this;
+}
+FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType,
+                                      const CFX_WideStringC& wsScript,
+                                      FXJSE_HVALUE hRetValue,
+                                      CXFA_Object* pThisObject) {
+  CFX_ByteString btScript;
+  XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType;
+  m_eScriptType = eScriptType;
+  if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) {
+    if (!m_hFM2JSContext) {
+      m_hFM2JSContext = XFA_FM2JS_ContextCreate();
+      XFA_FM2JS_ContextInitialize(m_hFM2JSContext, m_hJsRuntime, m_hJsContext,
+                                  m_pDocument);
+    }
+    CFX_WideTextBuf wsJavaScript;
+    CFX_WideString wsErrorInfo;
+    int32_t iFlags = XFA_FM2JS_Translate(wsScript, wsJavaScript, wsErrorInfo);
+    if (iFlags) {
+      FXJSE_Value_SetUndefined(hRetValue);
+      return FALSE;
+    }
+    btScript =
+        FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength());
+  } else {
+    btScript = FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength());
+  }
+  CXFA_Object* pOriginalObject = m_pThisObject;
+  m_pThisObject = pThisObject;
+  FXJSE_HVALUE pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL;
+  FX_BOOL bRet = FXJSE_ExecuteScript(m_hJsContext, btScript, hRetValue, pValue);
+  m_pThisObject = pOriginalObject;
+  m_eScriptType = eSaveType;
+  return bRet;
+}
+void CXFA_ScriptContext::GlobalPropertySetter(FXJSE_HOBJECT hObject,
+                                              const CFX_ByteStringC& szPropName,
+                                              FXJSE_HVALUE hValue) {
+  CXFA_Object* lpOrginalNode =
+      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  CXFA_Document* pDoc = lpOrginalNode->GetDocument();
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pDoc->GetScriptContext();
+  CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode);
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  FX_DWORD dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings |
+                    XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                    XFA_RESOLVENODE_Attributes;
+  CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
+  if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
+    pRefNode = ToNode(lpCurNode);
+  }
+  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
+                                       TRUE)) {
+    return;
+  }
+  if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
+    if (FXJSE_Value_IsUndefined(hValue)) {
+      FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue);
+      return;
+    }
+  }
+  IXFA_Notify* pNotify = pDoc->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  pNotify->GetDocProvider()->SetGlobalProperty(pNotify->GetHDOC(), szPropName,
+                                               hValue);
+}
+FX_BOOL CXFA_ScriptContext::QueryNodeByFlag(CXFA_Node* refNode,
+                                            const CFX_WideStringC& propname,
+                                            FXJSE_HVALUE hValue,
+                                            FX_DWORD dwFlag,
+                                            FX_BOOL bSetting) {
+  if (!refNode)
+    return false;
+  XFA_RESOLVENODE_RS resolveRs;
+  if (ResolveObjects(refNode, propname, resolveRs, dwFlag) <= 0)
+    return false;
+  if (resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
+    FXJSE_HVALUE pValue = GetJSValueFromMap(resolveRs.nodes[0]);
+    FXJSE_Value_Set(hValue, pValue);
+    return true;
+  }
+  if (resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Attribute) {
+    const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = resolveRs.pScriptAttribute;
+    if (lpAttributeInfo) {
+      (resolveRs.nodes[0]->*(lpAttributeInfo->lpfnCallback))(
+          hValue, bSetting, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
+    }
+  }
+  return true;
+}
+void CXFA_ScriptContext::GlobalPropertyGetter(FXJSE_HOBJECT hObject,
+                                              const CFX_ByteStringC& szPropName,
+                                              FXJSE_HVALUE hValue) {
+  CXFA_Object* pOrginalObject =
+      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  CXFA_Document* pDoc = pOrginalObject->GetDocument();
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pDoc->GetScriptContext();
+  CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOrginalObject);
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) {
+    if (szPropName == FOXIT_XFA_FM2JS_FORMCALC_RUNTIME) {
+      XFA_FM2JS_GlobalPropertyGetter(lpScriptContext->m_hFM2JSContext, hValue);
+      return;
+    }
+    uint32_t uHashCode =
+        FX_HashCode_String_GetW(wsPropName, wsPropName.GetLength());
+    if (uHashCode != XFA_HASHCODE_Layout) {
+      CXFA_Object* pObject =
+          lpScriptContext->GetDocument()->GetXFAObject(uHashCode);
+      if (pObject) {
+        FXJSE_Value_Set(hValue, lpScriptContext->GetJSValueFromMap(pObject));
+        return;
+      }
+    }
+  }
+  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                    XFA_RESOLVENODE_Attributes;
+  CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
+  if (pOrginalObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
+    pRefNode = ToNode(lpCurNode);
+  }
+  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
+                                       FALSE)) {
+    return;
+  }
+  dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings;
+  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
+                                       FALSE)) {
+    return;
+  }
+  CXFA_Object* pScriptObject =
+      lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
+  if (pScriptObject &&
+      lpScriptContext->QueryVariableHValue(pScriptObject->AsNode(), szPropName,
+                                           hValue, TRUE)) {
+    return;
+  }
+  IXFA_Notify* pNotify = pDoc->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  pNotify->GetDocProvider()->GetGlobalProperty(pNotify->GetHDOC(), szPropName,
+                                               hValue);
+}
+void CXFA_ScriptContext::NormalPropertyGetter(FXJSE_HOBJECT hObject,
+                                              const CFX_ByteStringC& szPropName,
+                                              FXJSE_HVALUE hValue) {
+  CXFA_Object* pOrginalObject =
+      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  if (pOrginalObject == NULL) {
+    FXJSE_Value_SetUndefined(hValue);
+    return;
+  }
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
+  CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
+  if (wsPropName == FX_WSTRC(L"xfa")) {
+    FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap(
+        lpScriptContext->GetDocument()->GetRoot());
+    FXJSE_Value_Set(hValue, pValue);
+    return;
+  }
+  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+                    XFA_RESOLVENODE_Attributes;
+  FX_BOOL bRet = lpScriptContext->QueryNodeByFlag(ToNode(pObject), wsPropName,
+                                                  hValue, dwFlag, FALSE);
+  if (bRet) {
+    return;
+  }
+  if (pObject == lpScriptContext->GetThisObject() ||
+      (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Javascript &&
+       !lpScriptContext->IsStrictScopeInJavaScript())) {
+    dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings;
+    bRet = lpScriptContext->QueryNodeByFlag(ToNode(pObject), wsPropName, hValue,
+                                            dwFlag, FALSE);
+  }
+  if (bRet) {
+    return;
+  }
+  CXFA_Object* pScriptObject =
+      lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
+  if (pScriptObject) {
+    bRet = lpScriptContext->QueryVariableHValue(ToNode(pScriptObject),
+                                                szPropName, hValue, TRUE);
+  }
+  if (!bRet) {
+    FXJSE_Value_SetUndefined(hValue);
+  }
+}
+void CXFA_ScriptContext::NormalPropertySetter(FXJSE_HOBJECT hObject,
+                                              const CFX_ByteStringC& szPropName,
+                                              FXJSE_HVALUE hValue) {
+  CXFA_Object* pOrginalObject =
+      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  if (pOrginalObject == NULL) {
+    return;
+  }
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
+  CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
+      XFA_GetScriptAttributeByName(pObject->GetClassID(), wsPropName);
+  if (lpAttributeInfo) {
+    (pObject->*(lpAttributeInfo->lpfnCallback))(
+        hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
+  } else {
+    if (pObject->IsNode()) {
+      if (wsPropName.GetAt(0) == '#') {
+        wsPropName = wsPropName.Right(wsPropName.GetLength() - 1);
+      }
+      CXFA_Node* pNode = ToNode(pObject);
+      CXFA_Node* pPropOrChild = NULL;
+      const XFA_ELEMENTINFO* lpElementInfo = XFA_GetElementByName(wsPropName);
+      if (lpElementInfo) {
+        pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName);
+      } else {
+        pPropOrChild = pNode->GetFirstChildByName(wsPropName);
+      }
+      if (pPropOrChild) {
+        CFX_WideString wsDefaultName = FX_WSTRC(L"{default}");
+        const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
+            XFA_GetScriptAttributeByName(pPropOrChild->GetClassID(),
+                                         wsDefaultName);
+        if (lpAttributeInfo) {
+          (pPropOrChild->*(lpAttributeInfo->lpfnCallback))(
+              hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
+          return;
+        }
+      }
+    }
+    CXFA_Object* pScriptObject =
+        lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
+    if (pScriptObject) {
+      lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), szPropName,
+                                           hValue, FALSE);
+    }
+  }
+}
+int32_t CXFA_ScriptContext::NormalPropTypeGetter(
+    FXJSE_HOBJECT hObject,
+    const CFX_ByteStringC& szPropName,
+    FX_BOOL bQueryIn) {
+  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  if (pObject == NULL) {
+    return FXJSE_ClassPropType_None;
+  }
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
+  pObject = lpScriptContext->GetVariablesThis(pObject);
+  XFA_ELEMENT objElement = pObject->GetClassID();
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  if (XFA_GetMethodByName(objElement, wsPropName)) {
+    return FXJSE_ClassPropType_Method;
+  }
+  if (bQueryIn && !XFA_GetScriptAttributeByName(objElement, wsPropName)) {
+    return FXJSE_ClassPropType_None;
+  }
+  return FXJSE_ClassPropType_Property;
+}
+int32_t CXFA_ScriptContext::GlobalPropTypeGetter(
+    FXJSE_HOBJECT hObject,
+    const CFX_ByteStringC& szPropName,
+    FX_BOOL bQueryIn) {
+  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+  if (pObject == NULL) {
+    return FXJSE_ClassPropType_None;
+  }
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
+  pObject = lpScriptContext->GetVariablesThis(pObject);
+  XFA_ELEMENT objElement = pObject->GetClassID();
+  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
+  if (XFA_GetMethodByName(objElement, wsPropName)) {
+    return FXJSE_ClassPropType_Method;
+  }
+  return FXJSE_ClassPropType_Property;
+}
+void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis,
+                                          const CFX_ByteStringC& szFuncName,
+                                          CFXJSE_Arguments& args) {
+  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL);
+  if (pObject == NULL) {
+    return;
+  }
+  CXFA_ScriptContext* lpScriptContext =
+      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
+  pObject = lpScriptContext->GetVariablesThis(pObject);
+  CFX_WideString wsFunName = CFX_WideString::FromUTF8(
+      (const FX_CHAR*)szFuncName.GetPtr(), szFuncName.GetLength());
+  const XFA_METHODINFO* lpMethodInfo =
+      XFA_GetMethodByName(pObject->GetClassID(), wsFunName);
+  if (NULL == lpMethodInfo) {
+    return;
+  }
+  (pObject->*(lpMethodInfo->lpfnCallback))(&args);
+}
+FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() {
+  return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping);
+}
+XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() {
+  return m_eScriptType;
+}
+void CXFA_ScriptContext::DefineJsContext() {
+  m_JsGlobalClass.constructor = NULL;
+  m_JsGlobalClass.name = "Root";
+  m_JsGlobalClass.propNum = 0;
+  m_JsGlobalClass.properties = NULL;
+  m_JsGlobalClass.methNum = 0;
+  m_JsGlobalClass.methods = NULL;
+  m_JsGlobalClass.dynPropGetter = CXFA_ScriptContext::GlobalPropertyGetter;
+  m_JsGlobalClass.dynPropSetter = CXFA_ScriptContext::GlobalPropertySetter;
+  m_JsGlobalClass.dynPropTypeGetter = CXFA_ScriptContext::GlobalPropTypeGetter;
+  m_JsGlobalClass.dynPropDeleter = NULL;
+  m_JsGlobalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall;
+  m_hJsContext = FXJSE_Context_Create(m_hJsRuntime, &m_JsGlobalClass,
+                                      m_pDocument->GetRoot());
+  RemoveBuiltInObjs(m_hJsContext);
+  FXJSE_Context_EnableCompatibleMode(
+      m_hJsContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS);
+}
+FXJSE_HCONTEXT CXFA_ScriptContext::CreateVariablesContext(
+    CXFA_Node* pScriptNode,
+    CXFA_Node* pSubform) {
+  if (pScriptNode == NULL || pSubform == NULL) {
+    return NULL;
+  }
+  if (m_mapVariableToHValue.GetCount() == 0) {
+    m_JsGlobalVariablesClass.constructor = NULL;
+    m_JsGlobalVariablesClass.name = "XFAScriptObject";
+    m_JsGlobalVariablesClass.propNum = 0;
+    m_JsGlobalVariablesClass.properties = NULL;
+    m_JsGlobalVariablesClass.methNum = 0;
+    m_JsGlobalVariablesClass.methods = NULL;
+    m_JsGlobalVariablesClass.dynPropGetter =
+        CXFA_ScriptContext::GlobalPropertyGetter;
+    m_JsGlobalVariablesClass.dynPropSetter =
+        CXFA_ScriptContext::GlobalPropertySetter;
+    m_JsGlobalVariablesClass.dynPropTypeGetter =
+        CXFA_ScriptContext::NormalPropTypeGetter;
+    m_JsGlobalVariablesClass.dynPropDeleter = NULL;
+    m_JsGlobalVariablesClass.dynMethodCall =
+        CXFA_ScriptContext::NormalMethodCall;
+  }
+  CXFA_ThisProxy* lpVariableNode = new CXFA_ThisProxy(pSubform, pScriptNode);
+  FXJSE_HCONTEXT hVariablesContext = FXJSE_Context_Create(
+      m_hJsRuntime, &m_JsGlobalVariablesClass, (CXFA_Object*)lpVariableNode);
+  RemoveBuiltInObjs(hVariablesContext);
+  FXJSE_Context_EnableCompatibleMode(
+      hVariablesContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS);
+  m_mapVariableToHValue.SetAt(pScriptNode, hVariablesContext);
+  return hVariablesContext;
+}
+CXFA_Object* CXFA_ScriptContext::GetVariablesThis(CXFA_Object* pObject,
+                                                  FX_BOOL bScriptNode) {
+  if (pObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
+    return bScriptNode ? ((CXFA_ThisProxy*)pObject)->GetScriptNode()
+                       : ((CXFA_ThisProxy*)pObject)->GetThisNode();
+  }
+  return pObject;
+}
+FX_BOOL CXFA_ScriptContext::RunVariablesScript(CXFA_Node* pScriptNode) {
+  if (pScriptNode == NULL) {
+    return FALSE;
+  }
+  if (pScriptNode->GetClassID() == XFA_ELEMENT_Script) {
+    CXFA_Node* pParent = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent);
+    if (!pParent || pParent->GetClassID() != XFA_ELEMENT_Variables) {
+      return FALSE;
+    }
+    if (m_mapVariableToHValue.GetValueAt(pScriptNode)) {
+      return TRUE;
+    }
+    CXFA_Node* pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (!pTextNode) {
+      return FALSE;
+    }
+    CFX_WideStringC wsScript;
+    if (!pTextNode->TryCData(XFA_ATTRIBUTE_Value, wsScript)) {
+      return FALSE;
+    }
+    CFX_ByteString btScript =
+        FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength());
+    FXJSE_HVALUE hRetValue = FXJSE_Value_Create(m_hJsRuntime);
+    CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent);
+    FXJSE_HCONTEXT hVariablesContext =
+        CreateVariablesContext(pScriptNode, pThisObject);
+    CXFA_Object* pOriginalObject = m_pThisObject;
+    m_pThisObject = pThisObject;
+    FX_BOOL bRet = FXJSE_ExecuteScript(hVariablesContext, btScript, hRetValue);
+    m_pThisObject = pOriginalObject;
+    FXJSE_Value_Release(hRetValue);
+    return bRet;
+  }
+  return TRUE;
+}
+FX_BOOL CXFA_ScriptContext::QueryVariableHValue(
+    CXFA_Node* pScriptNode,
+    const CFX_ByteStringC& szPropName,
+    FXJSE_HVALUE hValue,
+    FX_BOOL bGetter) {
+  if (!pScriptNode || pScriptNode->GetClassID() != XFA_ELEMENT_Script) {
+    return FALSE;
+  }
+  CXFA_Node* variablesNode = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent);
+  if (!variablesNode || variablesNode->GetClassID() != XFA_ELEMENT_Variables) {
+    return FALSE;
+  }
+  FX_BOOL bRes = FALSE;
+  void* lpVariables = m_mapVariableToHValue.GetValueAt(pScriptNode);
+  if (lpVariables) {
+    FXJSE_HCONTEXT hVariableContext = (FXJSE_HCONTEXT)lpVariables;
+    FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext);
+    FXJSE_HVALUE hVariableValue = FXJSE_Value_Create(m_hJsRuntime);
+    if (!bGetter) {
+      FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue);
+      bRes = TRUE;
+    } else if (FXJSE_Value_ObjectHasOwnProp(hObject, szPropName, FALSE)) {
+      FXJSE_Value_GetObjectProp(hObject, szPropName, hVariableValue);
+      if (FXJSE_Value_IsFunction(hVariableValue)) {
+        FXJSE_Value_SetFunctionBind(hValue, hVariableValue, hObject);
+      } else if (bGetter) {
+        FXJSE_Value_Set(hValue, hVariableValue);
+      } else {
+        FXJSE_Value_Set(hVariableValue, hValue);
+      }
+      bRes = TRUE;
+    }
+    FXJSE_Value_Release(hVariableValue);
+    FXJSE_Value_Release(hObject);
+  }
+  return bRes;
+}
+void CXFA_ScriptContext::ReleaseVariablesMap() {
+  FX_POSITION ps = m_mapVariableToHValue.GetStartPosition();
+  while (ps) {
+    CXFA_Object* pScriptNode;
+    FXJSE_HCONTEXT hVariableContext;
+    m_mapVariableToHValue.GetNextAssoc(ps, pScriptNode, hVariableContext);
+    FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext);
+    CXFA_Object* lpCurNode = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
+    if (lpCurNode) {
+      delete (CXFA_ThisProxy*)lpCurNode;
+      lpCurNode = NULL;
+    }
+    FXJSE_Value_Release(hObject);
+    FXJSE_Context_Release(hVariableContext);
+    hVariableContext = NULL;
+  }
+  m_mapVariableToHValue.RemoveAll();
+}
+void CXFA_ScriptContext::DefineJsClass() {
+  m_JsNormalClass.constructor = NULL;
+  m_JsNormalClass.name = "XFAObject";
+  m_JsNormalClass.propNum = 0;
+  m_JsNormalClass.properties = NULL;
+  m_JsNormalClass.methNum = 0;
+  m_JsNormalClass.methods = NULL;
+  m_JsNormalClass.dynPropGetter = CXFA_ScriptContext::NormalPropertyGetter;
+  m_JsNormalClass.dynPropSetter = CXFA_ScriptContext::NormalPropertySetter;
+  m_JsNormalClass.dynPropTypeGetter = CXFA_ScriptContext::NormalPropTypeGetter;
+  m_JsNormalClass.dynPropDeleter = NULL;
+  m_JsNormalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall;
+  m_hJsClass = FXJSE_DefineClass(m_hJsContext, &m_JsNormalClass);
+}
+void CXFA_ScriptContext::RemoveBuiltInObjs(FXJSE_HCONTEXT jsContext) const {
+  static const CFX_ByteStringC OBJ_NAME[2] = {"Number", "Date"};
+  FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(jsContext);
+  FXJSE_HVALUE hProp = FXJSE_Value_Create(m_hJsRuntime);
+  for (int i = 0; i < 2; ++i) {
+    if (FXJSE_Value_GetObjectProp(hObject, OBJ_NAME[i], hProp))
+      FXJSE_Value_DeleteObjectProp(hObject, OBJ_NAME[i]);
+  }
+  FXJSE_Value_Release(hProp);
+  FXJSE_Value_Release(hObject);
+}
+FXJSE_HCLASS CXFA_ScriptContext::GetJseNormalClass() {
+  return m_hJsClass;
+}
+int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode,
+                                           const CFX_WideStringC& wsExpression,
+                                           XFA_RESOLVENODE_RS& resolveNodeRS,
+                                           FX_DWORD dwStyles,
+                                           CXFA_Node* bindNode) {
+  if (wsExpression.IsEmpty()) {
+    return 0;
+  }
+  if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc ||
+      (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
+    m_upObjectArray.RemoveAll();
+  }
+  if (refNode && refNode->IsNode() &&
+      (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
+    m_upObjectArray.Add(refNode->AsNode());
+  }
+  FX_BOOL bNextCreate = FALSE;
+  if (dwStyles & XFA_RESOLVENODE_CreateNode) {
+    m_pResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode);
+  }
+  m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = NULL;
+  m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1;
+  CXFA_ResolveNodesData rndFind;
+  int32_t nStart = 0;
+  int32_t nLevel = 0;
+  int32_t nRet = -1;
+  rndFind.m_pSC = this;
+  CXFA_ObjArray findNodes;
+  findNodes.Add(refNode ? refNode : m_pDocument->GetRoot());
+  int32_t nNodes = 0;
+  while (TRUE) {
+    nNodes = findNodes.GetSize();
+    int32_t i = 0;
+    rndFind.m_dwStyles = dwStyles;
+    m_pResolveProcessor->m_iCurStart = nStart;
+    nStart = m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression,
+                                                             nStart, rndFind);
+    if (nStart < 1) {
+      if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) {
+        CXFA_Node* pDataNode = NULL;
+        nStart = m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart;
+        if (nStart != -1) {
+          pDataNode = m_pDocument->GetNotBindNode(findNodes);
+          if (pDataNode) {
+            findNodes.RemoveAll();
+            findNodes.Add(pDataNode);
+            break;
+          }
+        } else {
+          pDataNode = findNodes[0]->AsNode();
+          findNodes.RemoveAll();
+          findNodes.Add(pDataNode);
+          break;
+        }
+        dwStyles |= XFA_RESOLVENODE_Bind;
+        findNodes.RemoveAll();
+        findNodes.Add(m_pResolveProcessor->GetNodeHelper()->m_pAllStartParent);
+        continue;
+      } else {
+        break;
+      }
+    }
+    if (bNextCreate) {
+      FX_BOOL bCreate =
+          m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
+              rndFind.m_wsName, rndFind.m_wsCondition,
+              nStart == wsExpression.GetLength(), this);
+      if (bCreate) {
+        continue;
+      } else {
+        break;
+      }
+    }
+    CXFA_ObjArray retNodes;
+    while (i < nNodes) {
+      FX_BOOL bDataBind = FALSE;
+      if (((dwStyles & XFA_RESOLVENODE_Bind) ||
+           (dwStyles & XFA_RESOLVENODE_CreateNode)) &&
+          nNodes > 1) {
+        CXFA_ResolveNodesData rndBind;
+        m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart,
+                                                        rndBind);
+        m_pResolveProcessor->XFA_ResolveNode_SetIndexDataBind(
+            rndBind.m_wsCondition, i, nNodes);
+        bDataBind = TRUE;
+      }
+      rndFind.m_CurNode = findNodes[i++];
+      rndFind.m_nLevel = nLevel;
+      rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes;
+      nRet = m_pResolveProcessor->XFA_ResolveNodes(rndFind);
+      if (nRet < 1) {
+        continue;
+      }
+      if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute &&
+          rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) {
+        FXJSE_HVALUE hValue = FXJSE_Value_Create(m_hJsRuntime);
+        (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))(
+            hValue, FALSE,
+            (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute);
+        rndFind.m_Nodes.SetAt(0,
+                              (CXFA_Object*)FXJSE_Value_ToObject(hValue, NULL));
+        FXJSE_Value_Release(hValue);
+      }
+      int32_t iSize = m_upObjectArray.GetSize();
+      if (iSize) {
+        m_upObjectArray.RemoveAt(iSize - 1);
+      }
+      retNodes.Append(rndFind.m_Nodes);
+      rndFind.m_Nodes.RemoveAll();
+      if (bDataBind) {
+        break;
+      }
+    }
+    findNodes.RemoveAll();
+    nNodes = retNodes.GetSize();
+    if (nNodes < 1) {
+      if (dwStyles & XFA_RESOLVENODE_CreateNode) {
+        bNextCreate = TRUE;
+        if (m_pResolveProcessor->GetNodeHelper()->m_pCreateParent == NULL) {
+          m_pResolveProcessor->GetNodeHelper()->m_pCreateParent =
+              ToNode(rndFind.m_CurNode);
+          m_pResolveProcessor->GetNodeHelper()->m_iCreateCount = 1;
+        }
+        FX_BOOL bCreate =
+            m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
+                rndFind.m_wsName, rndFind.m_wsCondition,
+                nStart == wsExpression.GetLength(), this);
+        if (bCreate) {
+          continue;
+        } else {
+          break;
+        }
+      } else {
+        break;
+      }
+    }
+    findNodes.Copy(retNodes);
+    rndFind.m_Nodes.RemoveAll();
+    if (nLevel == 0) {
+      dwStyles &= ~(XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
+    }
+    nLevel++;
+  }
+  if (!bNextCreate) {
+    resolveNodeRS.dwFlags = rndFind.m_dwFlag;
+    if (nNodes > 0) {
+      resolveNodeRS.nodes.Append(findNodes);
+    }
+    if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) {
+      resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute;
+      return 1;
+    }
+  }
+  if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind |
+                  XFA_RESOLVENODE_BindNew)) {
+    m_pResolveProcessor->XFA_ResolveNode_SetResultCreateNode(
+        resolveNodeRS, rndFind.m_wsCondition);
+    if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) {
+      resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes;
+    }
+    return resolveNodeRS.nodes.GetSize();
+  }
+  return nNodes;
+}
+FXJSE_HVALUE CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) {
+  if (!pObject) {
+    return NULL;
+  }
+  if (pObject->IsNode()) {
+    RunVariablesScript(pObject->AsNode());
+  }
+  void* pValue = m_mapXFAToHValue.GetValueAt(pObject);
+  if (pValue == NULL) {
+    FXJSE_HVALUE jsHvalue = FXJSE_Value_Create(m_hJsRuntime);
+    FXJSE_Value_SetObject(jsHvalue, pObject, m_hJsClass);
+    m_mapXFAToHValue.SetAt(pObject, jsHvalue);
+    pValue = jsHvalue;
+  }
+  return (FXJSE_HVALUE)pValue;
+}
+int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) {
+  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
+  return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
+                                    lpNodeHelper->XFA_NodeIsProperty(refNode),
+                                    FALSE);
+}
+int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) {
+  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
+  return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
+                                    lpNodeHelper->XFA_NodeIsProperty(refNode),
+                                    TRUE);
+}
+void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode,
+                                          CFX_WideString& wsExpression) {
+  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
+  lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE,
+                                      XFA_LOGIC_Transparent);
+}
+void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) {
+  m_pScriptNodeArray = pArray;
+}
+void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) {
+  if (!m_pScriptNodeArray) {
+    return;
+  }
+  if (nodes.GetSize() > 0) {
+    m_pScriptNodeArray->Copy(nodes);
+  }
+}
+void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) {
+  if (!m_pScriptNodeArray) {
+    return;
+  }
+  if (m_pScriptNodeArray->Find(pNode) == -1) {
+    m_pScriptNodeArray->Add(pNode);
+  }
+}
+IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument) {
+  return new CXFA_ScriptContext(pDocument);
+}
diff --git a/xfa/fxfa/parser/xfa_script_imp.h b/xfa/fxfa/parser/xfa_script_imp.h
new file mode 100644
index 0000000..e4b5501
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_imp.h
@@ -0,0 +1,127 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_IMP_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_IMP_H_
+
+#include <map>
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+#define XFA_RESOLVENODE_TagName 0x0002
+
+class CXFA_ResolveProcessor;
+
+class CXFA_ScriptContext : public IXFA_ScriptContext {
+ public:
+  explicit CXFA_ScriptContext(CXFA_Document* pDocument);
+  ~CXFA_ScriptContext();
+
+  virtual void Release();
+  virtual void Initialize(FXJSE_HRUNTIME hRuntime);
+  virtual void SetEventParam(CXFA_EventParam param) { m_eventParam = param; }
+  virtual CXFA_EventParam* GetEventParam() { return &m_eventParam; }
+  virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType,
+                            const CFX_WideStringC& wsScript,
+                            FXJSE_HVALUE hRetValue,
+                            CXFA_Object* pThisObject = NULL);
+
+  virtual int32_t ResolveObjects(CXFA_Object* refNode,
+                                 const CFX_WideStringC& wsExpression,
+                                 XFA_RESOLVENODE_RS& resolveNodeRS,
+                                 FX_DWORD dwStyles = XFA_RESOLVENODE_Children,
+                                 CXFA_Node* bindNode = NULL);
+  virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject);
+  virtual void CacheList(CXFA_NodeList* pList) { m_CacheListArray.Add(pList); }
+  virtual CXFA_Object* GetThisObject() const { return m_pThisObject; }
+  virtual FXJSE_HRUNTIME GetRuntime() const { return m_hJsRuntime; }
+
+  virtual int32_t GetIndexByName(CXFA_Node* refNode);
+  virtual int32_t GetIndexByClassName(CXFA_Node* refNode);
+  virtual void GetSomExpression(CXFA_Node* refNode,
+                                CFX_WideString& wsExpression);
+
+  virtual void SetNodesOfRunScript(CXFA_NodeArray* pArray);
+  virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes);
+  virtual void AddNodesOfRunScript(CXFA_Node* pNode);
+  virtual FXJSE_HCLASS GetJseNormalClass();
+
+  virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) { m_eRunAtType = eRunAt; }
+  virtual FX_BOOL IsRunAtClient() {
+    return m_eRunAtType != XFA_ATTRIBUTEENUM_Server;
+  }
+  FX_BOOL QueryNodeByFlag(CXFA_Node* refNode,
+                          const CFX_WideStringC& propname,
+                          FXJSE_HVALUE hValue,
+                          FX_DWORD dwFlag,
+                          FX_BOOL bSetting);
+  FX_BOOL QueryVariableHValue(CXFA_Node* pScriptNode,
+                              const CFX_ByteStringC& szPropName,
+                              FXJSE_HVALUE hValue,
+                              FX_BOOL bGetter);
+  FX_BOOL QueryBuiltinHValue(const CFX_ByteStringC& szPropName,
+                             FXJSE_HVALUE hValue);
+  static void GlobalPropertyGetter(FXJSE_HOBJECT hObject,
+                                   const CFX_ByteStringC& szPropName,
+                                   FXJSE_HVALUE hValue);
+  static void GlobalPropertySetter(FXJSE_HOBJECT hObject,
+                                   const CFX_ByteStringC& szPropName,
+                                   FXJSE_HVALUE hValue);
+  static void NormalPropertyGetter(FXJSE_HOBJECT hObject,
+                                   const CFX_ByteStringC& szPropName,
+                                   FXJSE_HVALUE hValue);
+  static void NormalPropertySetter(FXJSE_HOBJECT hObject,
+                                   const CFX_ByteStringC& szPropName,
+                                   FXJSE_HVALUE hValue);
+  static void NormalMethodCall(FXJSE_HOBJECT hThis,
+                               const CFX_ByteStringC& szFuncName,
+                               CFXJSE_Arguments& args);
+  static int32_t NormalPropTypeGetter(FXJSE_HOBJECT hObject,
+                                      const CFX_ByteStringC& szPropName,
+                                      FX_BOOL bQueryIn);
+  static int32_t GlobalPropTypeGetter(FXJSE_HOBJECT hObject,
+                                      const CFX_ByteStringC& szPropName,
+                                      FX_BOOL bQueryIn);
+  FX_BOOL RunVariablesScript(CXFA_Node* pScriptNode);
+  CXFA_Object* GetVariablesThis(CXFA_Object* pObject,
+                                FX_BOOL bScriptNode = FALSE);
+  void ReleaseVariablesMap();
+  FX_BOOL IsStrictScopeInJavaScript();
+  XFA_SCRIPTLANGTYPE GetType();
+  CXFA_NodeArray& GetUpObjectArray() { return m_upObjectArray; }
+  CXFA_Document* GetDocument() const { return m_pDocument; }
+
+ protected:
+  void DefineJsContext();
+  FXJSE_HCONTEXT CreateVariablesContext(CXFA_Node* pScriptNode,
+                                        CXFA_Node* pSubform);
+  void DefineJsClass();
+  void RemoveBuiltInObjs(FXJSE_HCONTEXT jsContext) const;
+
+  CXFA_Document* m_pDocument;
+  FXJSE_HCONTEXT m_hJsContext;
+  FXJSE_HRUNTIME m_hJsRuntime;
+  FXJSE_HCLASS m_hJsClass;
+  XFA_SCRIPTLANGTYPE m_eScriptType;
+  FXJSE_CLASS m_JsGlobalClass;
+  FXJSE_CLASS m_JsNormalClass;
+  CFX_MapPtrTemplate<CXFA_Object*, FXJSE_HVALUE> m_mapXFAToHValue;
+  FXJSE_CLASS m_JsGlobalVariablesClass;
+  CFX_MapPtrTemplate<CXFA_Object*, FXJSE_HCONTEXT> m_mapVariableToHValue;
+  CXFA_EventParam m_eventParam;
+  CXFA_NodeArray m_upObjectArray;
+  CFX_PtrArray m_CacheListArray;
+  CXFA_NodeArray* m_pScriptNodeArray;
+  CXFA_ResolveProcessor* m_pResolveProcessor;
+  XFA_HFM2JSCONTEXT m_hFM2JSContext;
+  CXFA_Object* m_pThisObject;
+  FX_DWORD m_dwBuiltInInFlags;
+  XFA_ATTRIBUTEENUM m_eRunAtType;
+};
+
+#endif  //  XFA_FXFA_PARSER_XFA_SCRIPT_IMP_H_
diff --git a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp
new file mode 100644
index 0000000..d4a4ea8
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.cpp
@@ -0,0 +1,552 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_layoutpseudomodel.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
+#include "xfa/fxfa/parser/xfa_layout_appadapter.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_LayoutPseudoModel::CScript_LayoutPseudoModel(CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LayoutPseudoModel) {
+  m_uScriptHash = XFA_HASHCODE_Layout;
+}
+CScript_LayoutPseudoModel::~CScript_LayoutPseudoModel() {}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Ready(
+    FXJSE_HVALUE hValue,
+    FX_BOOL bSetting,
+    XFA_ATTRIBUTE eAttribute) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  if (bSetting) {
+    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_READY);
+    return;
+  }
+  int32_t iStatus = pNotify->GetLayoutStatus();
+  FXJSE_Value_SetBoolean(hValue, iStatus >= 2);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_HWXY(
+    CFXJSE_Arguments* pArguments,
+    XFA_LAYOUTMODEL_HWXY layoutModel) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 3) {
+    const FX_WCHAR* methodName = NULL;
+    switch (layoutModel) {
+      case XFA_LAYOUTMODEL_H:
+        methodName = L"h";
+        break;
+      case XFA_LAYOUTMODEL_W:
+        methodName = L"w";
+        break;
+      case XFA_LAYOUTMODEL_X:
+        methodName = L"x";
+        break;
+      case XFA_LAYOUTMODEL_Y:
+        methodName = L"y";
+        break;
+    }
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  CFX_WideString wsUnit = FX_WSTRC(L"pt");
+  int32_t iIndex = 0;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsUnit = pArguments->GetUTF8String(1);
+    if (!bsUnit.IsEmpty()) {
+      wsUnit = CFX_WideString::FromUTF8(bsUnit, bsUnit.GetLength());
+    }
+  }
+  if (iLength >= 3) {
+    iIndex = pArguments->GetInt32(2);
+  }
+  if (!pNode) {
+    return;
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  CFX_RectF rtRect;
+  CXFA_Measurement measure;
+  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  if (!pLayoutItem) {
+    return;
+  }
+  while (iIndex > 0 && pLayoutItem) {
+    pLayoutItem = pLayoutItem->GetNext();
+    iIndex--;
+  }
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (!pLayoutItem) {
+    FXJSE_Value_SetFloat(hValue, 0);
+    return;
+  }
+  pLayoutItem->GetRect(rtRect, TRUE);
+  switch (layoutModel) {
+    case XFA_LAYOUTMODEL_H:
+      measure.Set(rtRect.height, XFA_UNIT_Pt);
+      break;
+    case XFA_LAYOUTMODEL_W:
+      measure.Set(rtRect.width, XFA_UNIT_Pt);
+      break;
+    case XFA_LAYOUTMODEL_X:
+      measure.Set(rtRect.left, XFA_UNIT_Pt);
+      break;
+    case XFA_LAYOUTMODEL_Y:
+      measure.Set(rtRect.top, XFA_UNIT_Pt);
+      break;
+  }
+  XFA_UNIT unit = measure.GetUnit(wsUnit);
+  FX_FLOAT fValue = measure.ToUnit(unit);
+  fValue = FXSYS_round(fValue * 1000) / 1000.0f;
+  if (hValue) {
+    FXJSE_Value_SetFloat(hValue, fValue);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_H(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_H);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_W(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_W);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_X(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_X);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Y(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_Y);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_NumberedPageCount(
+    CFXJSE_Arguments* pArguments,
+    FX_BOOL bNumbered) {
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  int32_t iPageCount = 0;
+  int32_t iPageNum = pDocLayout->CountPages();
+  if (bNumbered) {
+    for (int32_t i = 0; i < iPageNum; i++) {
+      IXFA_LayoutPage* pLayoutPage = pDocLayout->GetPage(i);
+      if (!pLayoutPage) {
+        continue;
+      }
+      CXFA_Node* pMasterPage = pLayoutPage->GetMasterPage();
+      if (pMasterPage->GetInteger(XFA_ATTRIBUTE_Numbered)) {
+        iPageCount++;
+      }
+    }
+  } else {
+    iPageCount = iPageNum;
+  }
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageCount);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageCount(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_NumberedPageCount(pArguments, TRUE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageSpan(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageSpan");
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (!pNode) {
+    return;
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  if (!pLayoutItem) {
+    FXJSE_Value_SetInteger(hValue, -1);
+    return;
+  }
+  int32_t iLast = pLayoutItem->GetLast()->GetPage()->GetPageIndex();
+  int32_t iFirst = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
+  int32_t iPageSpan = iLast - iFirst + 1;
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageSpan);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Page(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_PageImp(pArguments, FALSE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_GetObjArray(
+    IXFA_DocLayout* pDocLayout,
+    int32_t iPageNo,
+    const CFX_WideString& wsType,
+    FX_BOOL bOnPageArea,
+    CXFA_NodeArray& retArray) {
+  CXFA_ContainerLayoutItem* pLayoutPage =
+      (CXFA_ContainerLayoutItem*)pDocLayout->GetPage(iPageNo);
+  if (!pLayoutPage) {
+    return;
+  }
+  if (wsType == FX_WSTRC(L"pageArea")) {
+    if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
+      retArray.Add(pMasterPage);
+    }
+    return;
+  }
+  if (wsType == FX_WSTRC(L"contentArea")) {
+    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
+         pItem = pItem->m_pNextSibling) {
+      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
+        retArray.Add(pItem->m_pFormNode);
+      }
+    }
+    return;
+  }
+  CFX_MapPtrToPtr formItems;
+  formItems.InitHashTable(256, TRUE);
+  if (wsType.IsEmpty()) {
+    if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
+      retArray.Add(pMasterPage);
+    }
+    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
+         pItem = pItem->m_pNextSibling) {
+      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
+        retArray.Add(pItem->m_pFormNode);
+        if (!bOnPageArea) {
+          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
+                                    CXFA_TraverseStrategy_ContentLayoutItem>
+          iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
+          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
+               pItemChild; pItemChild = iterator.MoveToNext()) {
+            if (!pItemChild->IsContentLayoutItem()) {
+              continue;
+            }
+            XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
+            if (eElementType != XFA_ELEMENT_Field &&
+                eElementType != XFA_ELEMENT_Draw &&
+                eElementType != XFA_ELEMENT_Subform &&
+                eElementType != XFA_ELEMENT_Area) {
+              continue;
+            }
+            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
+              continue;
+            }
+            formItems.SetAt(pItemChild->m_pFormNode, this);
+            retArray.Add(pItemChild->m_pFormNode);
+          }
+        }
+      } else {
+        if (bOnPageArea) {
+          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
+                                    CXFA_TraverseStrategy_ContentLayoutItem>
+          iterator((CXFA_ContentLayoutItem*)pItem);
+          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
+               pItemChild; pItemChild = iterator.MoveToNext()) {
+            if (!pItemChild->IsContentLayoutItem()) {
+              continue;
+            }
+            XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
+            if (eElementType != XFA_ELEMENT_Field &&
+                eElementType != XFA_ELEMENT_Draw &&
+                eElementType != XFA_ELEMENT_Subform &&
+                eElementType != XFA_ELEMENT_Area) {
+              continue;
+            }
+            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
+              continue;
+            }
+            formItems.SetAt(pItemChild->m_pFormNode, this);
+            retArray.Add(pItemChild->m_pFormNode);
+          }
+        }
+      }
+    }
+    return;
+  }
+  XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
+  if (wsType == FX_WSTRC(L"field")) {
+    eType = XFA_ELEMENT_Field;
+  } else if (wsType == FX_WSTRC(L"draw")) {
+    eType = XFA_ELEMENT_Draw;
+  } else if (wsType == FX_WSTRC(L"subform")) {
+    eType = XFA_ELEMENT_Subform;
+  } else if (wsType == FX_WSTRC(L"area")) {
+    eType = XFA_ELEMENT_Area;
+  }
+  if (eType != XFA_ELEMENT_UNKNOWN) {
+    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
+         pItem = pItem->m_pNextSibling) {
+      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
+        if (!bOnPageArea) {
+          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
+                                    CXFA_TraverseStrategy_ContentLayoutItem>
+          iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
+          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
+               pItemChild; pItemChild = iterator.MoveToNext()) {
+            if (!pItemChild->IsContentLayoutItem()) {
+              continue;
+            }
+            if (pItemChild->m_pFormNode->GetClassID() != eType) {
+              continue;
+            }
+            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
+              continue;
+            }
+            formItems.SetAt(pItemChild->m_pFormNode, this);
+            retArray.Add(pItemChild->m_pFormNode);
+          }
+        }
+      } else {
+        if (bOnPageArea) {
+          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
+                                    CXFA_TraverseStrategy_ContentLayoutItem>
+          iterator((CXFA_ContentLayoutItem*)pItem);
+          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
+               pItemChild; pItemChild = iterator.MoveToNext()) {
+            if (!pItemChild->IsContentLayoutItem()) {
+              continue;
+            }
+            if (pItemChild->m_pFormNode->GetClassID() != eType) {
+              continue;
+            }
+            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
+              continue;
+            }
+            formItems.SetAt(pItemChild->m_pFormNode, this);
+            retArray.Add(pItemChild->m_pFormNode);
+          }
+        }
+      }
+    }
+    return;
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageContent(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 3) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageContent");
+    return;
+  }
+  int32_t iIndex = 0;
+  CFX_WideString wsType;
+  FX_BOOL bOnPageArea = FALSE;
+  if (iLength >= 1) {
+    iIndex = pArguments->GetInt32(0);
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsType = pArguments->GetUTF8String(1);
+    wsType = CFX_WideString::FromUTF8(bsType, bsType.GetLength());
+  }
+  if (iLength >= 3) {
+    bOnPageArea = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  CXFA_NodeArray retArray;
+  Script_LayoutPseudoModel_GetObjArray(pDocLayout, iIndex, wsType, bOnPageArea,
+                                       retArray);
+  CXFA_ArrayNodeList* pArrayNodeList = new CXFA_ArrayNodeList(m_pDocument);
+  pArrayNodeList->SetArrayNodeList(retArray);
+  FXJSE_Value_SetObject(pArguments->GetReturnValue(),
+                        (CXFA_Object*)pArrayNodeList,
+                        m_pDocument->GetScriptContext()->GetJseNormalClass());
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCount(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCountInBatch(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t iPageCount = pNotify->GetDocProvider()->AbsPageCountInBatch(hDoc);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageCount);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCountInBatch(
+    CFXJSE_Arguments* pArguments) {
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t iPageCount = pNotify->GetDocProvider()->SheetCountInBatch(hDoc);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageCount);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Relayout(
+    CFXJSE_Arguments* pArguments) {
+  CXFA_Node* pRootNode = m_pDocument->GetRoot();
+  CXFA_Node* pFormRoot = pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form);
+  FXSYS_assert(pFormRoot);
+  CXFA_Node* pContentRootNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+  CXFA_LayoutProcessor* pLayoutProcessor = m_pDocument->GetLayoutProcessor();
+  if (pContentRootNode) {
+    pLayoutProcessor->AddChangedContainer(pContentRootNode);
+  }
+  pLayoutProcessor->SetForceReLayout(TRUE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageSpan(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_PageSpan(pArguments);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageInBatch(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"absPageInBatch");
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (!pNode) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
+  if (!hWidget) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t iPageCount = pNotify->GetDocProvider()->AbsPageInBatch(hDoc, hWidget);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageCount);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetInBatch(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
+                            L"sheetInBatch");
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (!pNode) {
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
+  if (!hWidget) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  int32_t iPageCount = pNotify->GetDocProvider()->SheetInBatch(hDoc, hWidget);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, iPageCount);
+  }
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Sheet(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_RelayoutPageArea(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCount(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPage(
+    CFXJSE_Arguments* pArguments) {
+  Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
+}
+void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageImp(
+    CFXJSE_Arguments* pArguments,
+    FX_BOOL bAbsPage) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 1) {
+    const FX_WCHAR* methodName;
+    if (bAbsPage) {
+      methodName = L"absPage";
+    } else {
+      methodName = L"page";
+    }
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
+    return;
+  }
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  int32_t iPage = 0;
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (!pNode && hValue) {
+    FXJSE_Value_SetInteger(hValue, iPage);
+  }
+  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
+  if (!pDocLayout) {
+    return;
+  }
+  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
+  if (!pLayoutItem) {
+    FXJSE_Value_SetInteger(hValue, -1);
+    return;
+  }
+  iPage = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, bAbsPage ? iPage : iPage + 1);
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
new file mode 100644
index 0000000..349a3cc
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
+
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+
+enum XFA_LAYOUTMODEL_HWXY {
+  XFA_LAYOUTMODEL_H,
+  XFA_LAYOUTMODEL_W,
+  XFA_LAYOUTMODEL_X,
+  XFA_LAYOUTMODEL_Y
+};
+
+class CScript_LayoutPseudoModel : public CXFA_OrdinaryObject {
+ public:
+  explicit CScript_LayoutPseudoModel(CXFA_Document* pDocument);
+  ~CScript_LayoutPseudoModel();
+
+  void Script_LayoutPseudoModel_Ready(FXJSE_HVALUE hValue,
+                                      FX_BOOL bSetting,
+                                      XFA_ATTRIBUTE eAttribute);
+
+  void Script_LayoutPseudoModel_HWXY(CFXJSE_Arguments* pArguments,
+                                     XFA_LAYOUTMODEL_HWXY layoutModel);
+  void Script_LayoutPseudoModel_H(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_W(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_X(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_Y(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_NumberedPageCount(CFXJSE_Arguments* pArguments,
+                                                  FX_BOOL bNumbered);
+  void Script_LayoutPseudoModel_PageCount(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_PageSpan(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_Page(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_PageContent(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_AbsPageCount(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_AbsPageCountInBatch(
+      CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_SheetCountInBatch(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_Relayout(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_AbsPageSpan(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_AbsPageInBatch(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_SheetInBatch(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_Sheet(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_RelayoutPageArea(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_SheetCount(CFXJSE_Arguments* pArguments);
+  void Script_LayoutPseudoModel_AbsPage(CFXJSE_Arguments* pArguments);
+
+ protected:
+  void Script_LayoutPseudoModel_GetObjArray(IXFA_DocLayout* pDocLayout,
+                                            int32_t iPageNo,
+                                            const CFX_WideString& wsType,
+                                            FX_BOOL bOnPageArea,
+                                            CXFA_NodeArray& retArray);
+  void Script_LayoutPseudoModel_PageImp(CFXJSE_Arguments* pArguments,
+                                        FX_BOOL bAbsPage);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp b/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp
new file mode 100644
index 0000000..01f94c5
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_logpseudomodel.cpp
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_logpseudomodel.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_LogPseudoModel::CScript_LogPseudoModel(CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LogPseudoModel) {
+  m_uScriptHash = XFA_HASHCODE_Log;
+}
+CScript_LogPseudoModel::~CScript_LogPseudoModel() {}
+void CScript_LogPseudoModel::Script_LogPseudoModel_Message(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_LogPseudoModel::Script_LogPseudoModel_TraceEnabled(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_LogPseudoModel::Script_LogPseudoModel_TraceActivate(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_LogPseudoModel::Script_LogPseudoModel_TraceDeactivate(
+    CFXJSE_Arguments* pArguments) {}
+void CScript_LogPseudoModel::Script_LogPseudoModel_Trace(
+    CFXJSE_Arguments* pArguments) {}
diff --git a/xfa/fxfa/parser/xfa_script_logpseudomodel.h b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
new file mode 100644
index 0000000..8cd7c23
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+class CScript_LogPseudoModel : public CXFA_OrdinaryObject {
+ public:
+  explicit CScript_LogPseudoModel(CXFA_Document* pDocument);
+  virtual ~CScript_LogPseudoModel();
+
+  void Script_LogPseudoModel_Message(CFXJSE_Arguments* pArguments);
+  void Script_LogPseudoModel_TraceEnabled(CFXJSE_Arguments* pArguments);
+  void Script_LogPseudoModel_TraceActivate(CFXJSE_Arguments* pArguments);
+  void Script_LogPseudoModel_TraceDeactivate(CFXJSE_Arguments* pArguments);
+  void Script_LogPseudoModel_Trace(CFXJSE_Arguments* pArguments);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/xfa_script_nodehelper.cpp b/xfa/fxfa/parser/xfa_script_nodehelper.cpp
new file mode 100644
index 0000000..ba58430
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_nodehelper.cpp
@@ -0,0 +1,429 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_nodehelper.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_script_imp.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_NodeHelper::CXFA_NodeHelper(void)
+    : m_eLastCreateType(XFA_ELEMENT_DataValue),
+      m_pCreateParent(NULL),
+      m_iCreateCount(0),
+      m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne),
+      m_iCurAllStart(-1),
+      m_pAllStartParent(NULL) {}
+CXFA_NodeHelper::~CXFA_NodeHelper(void) {}
+CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(
+    CXFA_Node* parent,
+    const FX_WCHAR* pwsName,
+    FX_BOOL bIsClassName) {
+  if (parent == NULL) {
+    return NULL;
+  }
+  CXFA_NodeArray siblings;
+  uint32_t uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName));
+  XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
+  if (siblings.GetSize() == 0) {
+    return NULL;
+  }
+  return siblings[0];
+}
+int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode,
+                                           XFA_LOGIC_TYPE eLogicType,
+                                           CXFA_NodeArray* pSiblings,
+                                           FX_BOOL bIsClassName) {
+  if (!pNode)
+    return 0;
+  CXFA_Node* parent =
+      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
+  if (!parent)
+    return 0;
+  const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
+      parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+  if (!pProperty && eLogicType == XFA_LOGIC_Transparent) {
+    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
+    if (parent == NULL) {
+      return 0;
+    }
+  }
+  if (bIsClassName) {
+    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
+                                        pSiblings, eLogicType, bIsClassName);
+  } else {
+    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
+                                        eLogicType, bIsClassName);
+  }
+}
+int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(
+    CXFA_Node* parent,
+    FX_DWORD dNameHash,
+    CXFA_NodeArray* pSiblings,
+    FX_BOOL bIsClassName) {
+  if (parent == NULL || pSiblings == NULL) {
+    return 0;
+  }
+  int32_t nCount = 0;
+  int32_t i = 0;
+  CXFA_NodeArray properties;
+  parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
+  int32_t nProperties = properties.GetSize();
+  for (i = 0; i < nProperties; ++i) {
+    CXFA_Node* child = properties[i];
+    if (bIsClassName) {
+      if (child->GetClassHashCode() == dNameHash) {
+        pSiblings->Add(child);
+        nCount++;
+      }
+    } else {
+      if (child->GetNameHash() == dNameHash) {
+        pSiblings->Add(child);
+        nCount++;
+      }
+    }
+    if (nCount > 0) {
+      return nCount;
+    }
+    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
+                                              bIsClassName);
+  }
+  CXFA_NodeArray children;
+  parent->GetNodeList(children, XFA_NODEFILTER_Children);
+  int32_t nChildren = children.GetSize();
+  for (i = 0; i < nChildren; i++) {
+    CXFA_Node* child = children[i];
+    if (bIsClassName) {
+      if (child->GetClassHashCode() == dNameHash) {
+        if (pSiblings) {
+          pSiblings->Add(child);
+        }
+        nCount++;
+      }
+    } else {
+      if (child->GetNameHash() == dNameHash) {
+        if (pSiblings) {
+          pSiblings->Add(child);
+        }
+        nCount++;
+      }
+    }
+    if (nCount > 0) {
+      return nCount;
+    }
+    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
+                                              bIsClassName);
+  }
+  return nCount;
+}
+int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
+                                                      FX_DWORD dNameHash,
+                                                      CXFA_NodeArray* pSiblings,
+                                                      XFA_LOGIC_TYPE eLogicType,
+                                                      FX_BOOL bIsClassName,
+                                                      FX_BOOL bIsFindProperty) {
+  if (parent == NULL || pSiblings == NULL) {
+    return 0;
+  }
+  int32_t nCount = 0;
+  int32_t i = 0;
+  if (bIsFindProperty) {
+    CXFA_NodeArray properties;
+    parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
+    int32_t nProperties = properties.GetSize();
+    for (i = 0; i < nProperties; ++i) {
+      CXFA_Node* child = properties[i];
+      if (bIsClassName) {
+        if (child->GetClassHashCode() == dNameHash) {
+          pSiblings->Add(child);
+          nCount++;
+        }
+      } else {
+        if (child->GetNameHash() == dNameHash) {
+          if (child->GetClassID() != XFA_ELEMENT_PageSet &&
+              child->GetClassID() != XFA_ELEMENT_Extras &&
+              child->GetClassID() != XFA_ELEMENT_Items) {
+            pSiblings->Add(child);
+            nCount++;
+          }
+        }
+      }
+      if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) {
+        nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
+                                               eLogicType, bIsClassName, FALSE);
+      }
+    }
+    if (nCount > 0) {
+      return nCount;
+    }
+  }
+  CXFA_NodeArray children;
+  parent->GetNodeList(children, XFA_NODEFILTER_Children);
+  int32_t nChildren = children.GetSize();
+  for (i = 0; i < nChildren; i++) {
+    CXFA_Node* child = children[i];
+    if (child->GetClassID() == XFA_ELEMENT_Variables) {
+      continue;
+    }
+    if (bIsClassName) {
+      if (child->GetClassHashCode() == dNameHash) {
+        if (pSiblings) {
+          pSiblings->Add(child);
+        }
+        nCount++;
+      }
+    } else {
+      if (child->GetNameHash() == dNameHash) {
+        if (pSiblings) {
+          pSiblings->Add(child);
+        }
+        nCount++;
+      }
+    }
+    if (eLogicType == XFA_LOGIC_NoTransparent) {
+      continue;
+    }
+    if (XFA_NodeIsTransparent(child) &&
+        child->GetClassID() != XFA_ELEMENT_PageSet) {
+      nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
+                                             eLogicType, bIsClassName, FALSE);
+    }
+  }
+  return nCount;
+}
+CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(
+    CXFA_Node* pNode,
+    XFA_LOGIC_TYPE eLogicType) {
+  if (!pNode) {
+    return NULL;
+  }
+  if (eLogicType == XFA_LOGIC_NoTransparent) {
+    return pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  }
+  CXFA_Node* parent;
+  CXFA_Node* node = pNode;
+  while (TRUE) {
+    parent = XFA_ResolveNodes_GetParent(node);
+    if (parent == NULL) {
+      break;
+    }
+    XFA_ELEMENT parentElement = parent->GetClassID();
+    if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) ||
+        parentElement == XFA_ELEMENT_Variables) {
+      break;
+    }
+    node = parent;
+  }
+  return parent;
+}
+int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode,
+                                      XFA_LOGIC_TYPE eLogicType,
+                                      FX_BOOL bIsProperty,
+                                      FX_BOOL bIsClassIndex) {
+  CXFA_Node* parent =
+      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
+  if (parent == NULL) {
+    return 0;
+  }
+  if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
+    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
+    if (parent == NULL) {
+      return 0;
+    }
+  }
+  FX_DWORD dwHashName = pNode->GetNameHash();
+  if (bIsClassIndex) {
+    dwHashName = pNode->GetClassHashCode();
+  }
+  CXFA_NodeArray siblings;
+  int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
+                                               eLogicType, bIsClassIndex);
+  for (int32_t i = 0; i < iSize; ++i) {
+    CXFA_Node* child = siblings[i];
+    if (child == pNode) {
+      return i;
+    }
+  }
+  return 0;
+}
+void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode,
+                                            CFX_WideString& wsName,
+                                            FX_BOOL bIsAllPath,
+                                            XFA_LOGIC_TYPE eLogicType) {
+  wsName.Empty();
+  if (bIsAllPath) {
+    XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType);
+    CFX_WideString wsParent;
+    CXFA_Node* parent =
+        XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
+    while (parent) {
+      XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType);
+      wsParent += L".";
+      wsParent += wsName;
+      wsName = wsParent;
+      parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
+    }
+    return;
+  }
+
+  CFX_WideStringC wsTagName;
+  CFX_WideString ws;
+  FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode);
+  if (refNode->IsUnnamed() ||
+      (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) {
+    refNode->GetClassName(wsTagName);
+    ws = wsTagName;
+    wsName.Format(L"#%s[%d]", (const FX_WCHAR*)ws,
+                  XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE));
+    return;
+  }
+  ws = refNode->GetCData(XFA_ATTRIBUTE_Name);
+  ws.Replace(L".", L"\\.");
+  wsName.Format(L"%s[%d]", (const FX_WCHAR*)ws,
+                XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE));
+}
+
+FX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) {
+  if (refNode == NULL) {
+    return FALSE;
+  }
+  XFA_ELEMENT eRefNode = refNode->GetClassID();
+  if ((refNode->IsUnnamed() && refNode->IsContainerNode()) ||
+      eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area ||
+      eRefNode == XFA_ELEMENT_Proto) {
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(
+    CFX_WideString& wsCondition) {
+  int32_t iLen = wsCondition.GetLength();
+  CFX_WideString wsIndex = FX_WSTRC(L"0");
+  FX_BOOL bAll = FALSE;
+
+  if (iLen == 0) {
+    m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
+    return FALSE;
+  }
+  if (wsCondition.GetAt(0) == '[') {
+    int32_t i = 1;
+    for (; i < iLen; ++i) {
+      FX_WCHAR ch = wsCondition[i];
+      if (ch == ' ') {
+        continue;
+      }
+      if (ch == '+' || ch == '-') {
+        break;
+      } else if (ch == '*') {
+        bAll = TRUE;
+        break;
+      } else {
+        break;
+      }
+    }
+    if (bAll) {
+      wsIndex = FX_WSTRC(L"1");
+      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll;
+    } else {
+      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
+      wsIndex = wsCondition.Mid(i, iLen - 1 - i);
+    }
+    int32_t iIndex = wsIndex.GetInteger();
+    m_iCreateCount = iIndex;
+    return TRUE;
+  }
+  return FALSE;
+}
+FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(
+    CFX_WideString wsName,
+    CFX_WideString wsCondition,
+    FX_BOOL bLastNode,
+    CXFA_ScriptContext* pScriptContext) {
+  if (m_pCreateParent == NULL) {
+    return FALSE;
+  }
+  FX_BOOL bIsClassName = FALSE;
+  FX_BOOL bResult = FALSE;
+  if (wsName.GetAt(0) == '!') {
+    wsName = wsName.Right(wsName.GetLength() - 1);
+    m_pCreateParent = ToNode(
+        pScriptContext->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
+  }
+  if (wsName.GetAt(0) == '#') {
+    bIsClassName = TRUE;
+    wsName = wsName.Right(wsName.GetLength() - 1);
+  }
+  if (m_iCreateCount == 0) {
+    XFA_CreateNode_ForCondition(wsCondition);
+  }
+  if (bIsClassName) {
+    const XFA_ELEMENTINFO* lpElement = XFA_GetElementByName(wsName);
+    if (lpElement == NULL) {
+      return FALSE;
+    }
+    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
+      CXFA_Node* pNewNode =
+          m_pCreateParent->CreateSamePacketNode(lpElement->eName);
+      if (pNewNode) {
+        m_pCreateParent->InsertChild(pNewNode);
+        if (iIndex == m_iCreateCount - 1) {
+          m_pCreateParent = pNewNode;
+        }
+        bResult = TRUE;
+      }
+    }
+  } else {
+    XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup;
+    if (bLastNode) {
+      eClassType = m_eLastCreateType;
+    }
+    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
+      CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
+      if (pNewNode) {
+        pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName);
+        pNewNode->CreateXMLMappingNode();
+        m_pCreateParent->InsertChild(pNewNode);
+        if (iIndex == m_iCreateCount - 1) {
+          m_pCreateParent = pNewNode;
+        }
+        bResult = TRUE;
+      }
+    }
+  }
+  if (!bResult) {
+    m_pCreateParent = NULL;
+  }
+  return bResult;
+}
+void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) {
+  if (refNode == NULL) {
+    return;
+  }
+  if (refNode->GetClassID() == XFA_ELEMENT_Subform) {
+    m_eLastCreateType = XFA_ELEMENT_DataGroup;
+  } else if (refNode->GetClassID() == XFA_ELEMENT_Field) {
+    m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
+                            ? XFA_ELEMENT_DataGroup
+                            : XFA_ELEMENT_DataValue;
+  } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
+    m_eLastCreateType = XFA_ELEMENT_DataValue;
+  }
+}
+FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) {
+  CXFA_Node* parent =
+      XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
+  return parent && refNode &&
+         XFA_GetPropertyOfElement(parent->GetClassID(), refNode->GetClassID(),
+                                  XFA_XDPPACKET_UNKNOWN);
+}
diff --git a/xfa/fxfa/parser/xfa_script_nodehelper.h b/xfa/fxfa/parser/xfa_script_nodehelper.h
new file mode 100644
index 0000000..b52f681
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_nodehelper.h
@@ -0,0 +1,72 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+class CXFA_ScriptContext;
+
+enum XFA_LOGIC_TYPE {
+  XFA_LOGIC_NoTransparent,
+  XFA_LOGIC_Transparent,
+};
+
+class CXFA_NodeHelper {
+ public:
+  CXFA_NodeHelper(void);
+  ~CXFA_NodeHelper(void);
+  CXFA_Node* XFA_ResolveNodes_GetOneChild(CXFA_Node* parent,
+                                          const FX_WCHAR* pwsName,
+                                          FX_BOOL bIsClassName = FALSE);
+  CXFA_Node* XFA_ResolveNodes_GetParent(
+      CXFA_Node* pNode,
+      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);
+
+  int32_t XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
+                                       FX_DWORD dNameHash,
+                                       CXFA_NodeArray* pSiblings,
+                                       XFA_LOGIC_TYPE eLogicType,
+                                       FX_BOOL bIsClassName = FALSE,
+                                       FX_BOOL bIsFindProperty = TRUE);
+  int32_t XFA_NodeAcc_TraverseAnySiblings(CXFA_Node* parent,
+                                          FX_DWORD dNameHash,
+                                          CXFA_NodeArray* pSiblings,
+                                          FX_BOOL bIsClassName = FALSE);
+  int32_t XFA_CountSiblings(CXFA_Node* pNode,
+                            XFA_LOGIC_TYPE eLogicType,
+                            CXFA_NodeArray* pSiblings,
+                            FX_BOOL bIsClassName = FALSE);
+  int32_t XFA_GetIndex(CXFA_Node* pNode,
+                       XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent,
+                       FX_BOOL bIsProperty = FALSE,
+                       FX_BOOL bIsClassIndex = FALSE);
+  void XFA_GetNameExpression(
+      CXFA_Node* refNode,
+      CFX_WideString& wsName,
+      FX_BOOL bIsAllPath,
+      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);
+  FX_BOOL XFA_NodeIsTransparent(CXFA_Node* refNode);
+  FX_BOOL XFA_ResolveNodes_CreateNode(CFX_WideString wsName,
+                                      CFX_WideString wsCondition,
+                                      FX_BOOL bLastNode,
+                                      CXFA_ScriptContext* pScriptContext);
+  FX_BOOL XFA_CreateNode_ForCondition(CFX_WideString& wsCondition);
+  void XFA_SetCreateNodeType(CXFA_Node* refNode);
+  FX_BOOL XFA_NodeIsProperty(CXFA_Node* refNode);
+
+ public:
+  XFA_ELEMENT m_eLastCreateType;
+  CXFA_Node* m_pCreateParent;
+  int32_t m_iCreateCount;
+  XFA_RESOVENODE_RSTYPE m_iCreateFlag;
+  int32_t m_iCurAllStart;
+  CXFA_Node* m_pAllStartParent;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
diff --git a/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp b/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp
new file mode 100644
index 0000000..b40d714
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp
@@ -0,0 +1,825 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_resolveprocessor.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_script_imp.h"
+#include "xfa/fxfa/parser/xfa_script_nodehelper.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CXFA_ResolveProcessor::CXFA_ResolveProcessor(void)
+    : m_pNodeHelper(NULL), m_iCurStart(0) {
+  m_pNodeHelper = new CXFA_NodeHelper;
+}
+CXFA_ResolveProcessor::~CXFA_ResolveProcessor(void) {
+  if (m_pNodeHelper) {
+    delete m_pNodeHelper;
+    m_pNodeHelper = NULL;
+  }
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes(CXFA_ResolveNodesData& rnd) {
+  if (rnd.m_CurNode == NULL) {
+    return -1;
+  }
+  if (!rnd.m_CurNode->IsNode()) {
+    if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) {
+      return XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, rnd.m_wsName);
+    }
+    return 0;
+  }
+  if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild) {
+    return XFA_ResolveNodes_AnyChild(rnd);
+  }
+  FX_WCHAR wch = rnd.m_wsName.GetAt(0);
+  switch (wch) {
+    case '$':
+      return XFA_ResolveNodes_Dollar(rnd);
+    case '!':
+      return XFA_ResolveNodes_Excalmatory(rnd);
+    case '#':
+      return XFA_ResolveNodes_NumberSign(rnd);
+    case '*':
+      return XFA_ResolveNodes_Asterisk(rnd);
+    case '.':
+      return XFA_ResolveNodes_AnyChild(rnd);
+    default:
+      break;
+  }
+  if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) {
+    rnd.m_Nodes.Add(rnd.m_pSC->GetThisObject());
+    return 1;
+  } else if (rnd.m_CurNode->GetClassID() == XFA_ELEMENT_Xfa) {
+    CXFA_Object* pObjNode =
+        rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName);
+    if (pObjNode) {
+      rnd.m_Nodes.Add(pObjNode);
+    } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) {
+      rnd.m_Nodes.Add(rnd.m_CurNode);
+    } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) &&
+               XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd,
+                                               rnd.m_wsName)) {
+      return 1;
+    }
+    if (rnd.m_Nodes.GetSize() > 0) {
+      XFA_ResolveNode_FilterCondition(rnd, rnd.m_wsCondition);
+    }
+    return rnd.m_Nodes.GetSize();
+  }
+  int32_t nRet = XFA_ResolveNodes_Normal(rnd);
+  if (nRet < 1 && rnd.m_uHashName == XFA_HASHCODE_Xfa) {
+    rnd.m_Nodes.Add(rnd.m_pSC->GetDocument()->GetRoot());
+  }
+  return rnd.m_Nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_AnyChild(
+    CXFA_ResolveNodesData& rnd) {
+  CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
+  CFX_WideString wsCondition = rnd.m_wsCondition;
+  CXFA_Node* findNode = NULL;
+  CXFA_NodeArray siblings;
+  FX_BOOL bClassName = FALSE;
+  if (wsName.GetAt(0) == '#') {
+    bClassName = TRUE;
+    wsName = wsName.Right(wsName.GetLength() - 1);
+  }
+  findNode = m_pNodeHelper->XFA_ResolveNodes_GetOneChild(ToNode(rnd.m_CurNode),
+                                                         wsName, bClassName);
+  if (findNode == NULL) {
+    return 0;
+  }
+  if (wsCondition.IsEmpty()) {
+    rnd.m_Nodes.Add(findNode);
+    return rnd.m_Nodes.GetSize();
+  }
+  m_pNodeHelper->XFA_CountSiblings(findNode, XFA_LOGIC_Transparent,
+                                   (CXFA_NodeArray*)&rnd.m_Nodes, bClassName);
+  XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+  return rnd.m_Nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Dollar(
+    CXFA_ResolveNodesData& rnd) {
+  CXFA_ObjArray& nodes = rnd.m_Nodes;
+  CFX_WideString wsName = rnd.m_wsName;
+  CFX_WideString wsCondition = rnd.m_wsCondition;
+  int32_t iNameLen = wsName.GetLength();
+  if (iNameLen == 1) {
+    nodes.Add(rnd.m_CurNode);
+    return 1;
+  }
+  if (rnd.m_nLevel > 0) {
+    return -1;
+  }
+  FX_DWORD dwNameHash =
+      FX_HashCode_String_GetW((const FX_WCHAR*)wsName + 1, iNameLen - 1);
+  if (dwNameHash == XFA_HASHCODE_Xfa) {
+    nodes.Add(rnd.m_pSC->GetDocument()->GetRoot());
+  } else {
+    CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash);
+    if (pObjNode) {
+      rnd.m_Nodes.Add(pObjNode);
+    }
+  }
+  if (rnd.m_Nodes.GetSize() > 0) {
+    XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+  }
+  return rnd.m_Nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Excalmatory(
+    CXFA_ResolveNodesData& rnd) {
+  if (rnd.m_nLevel > 0) {
+    return 0;
+  }
+  CXFA_Node* datasets =
+      ToNode(rnd.m_pSC->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
+  if (!datasets) {
+    return 0;
+  }
+  CXFA_ResolveNodesData rndFind;
+  rndFind.m_pSC = rnd.m_pSC;
+  rndFind.m_CurNode = datasets;
+  rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
+  rndFind.m_uHashName =
+      FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength());
+  rndFind.m_nLevel = rnd.m_nLevel + 1;
+  rndFind.m_dwStyles = XFA_RESOLVENODE_Children;
+  rndFind.m_wsCondition = rnd.m_wsCondition;
+  XFA_ResolveNodes(rndFind);
+  if (rndFind.m_Nodes.GetSize() > 0) {
+    rnd.m_Nodes.Append(rndFind.m_Nodes);
+    rndFind.m_Nodes.RemoveAll();
+  }
+  return rnd.m_Nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_NumberSign(
+    CXFA_ResolveNodesData& rnd) {
+  CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
+  CFX_WideString wsCondition = rnd.m_wsCondition;
+  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
+  if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) {
+    return 1;
+  }
+  CXFA_ResolveNodesData rndFind;
+  rndFind.m_pSC = rnd.m_pSC;
+  rndFind.m_nLevel = rnd.m_nLevel + 1;
+  rndFind.m_dwStyles = rnd.m_dwStyles;
+  rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName;
+  rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes;
+  rndFind.m_wsName = wsName;
+  rndFind.m_uHashName =
+      FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength());
+  rndFind.m_wsCondition = wsCondition;
+  rndFind.m_CurNode = curNode;
+  XFA_ResolveNodes_Normal(rndFind);
+  if (rndFind.m_Nodes.GetSize() > 0) {
+    if (wsCondition.GetLength() == 0 && rndFind.m_Nodes.Find(curNode) >= 0) {
+      rnd.m_Nodes.Add(curNode);
+    } else {
+      rnd.m_Nodes.Append(rndFind.m_Nodes);
+      rndFind.m_Nodes.RemoveAll();
+    }
+  }
+  return rnd.m_Nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_ForAttributeRs(
+    CXFA_Object* curNode,
+    CXFA_ResolveNodesData& rnd,
+    const CFX_WideStringC& strAttr) {
+  const XFA_SCRIPTATTRIBUTEINFO* lpScriptAttribute =
+      XFA_GetScriptAttributeByName(curNode->GetClassID(), strAttr);
+  if (lpScriptAttribute) {
+    rnd.m_pScriptAttribute = lpScriptAttribute;
+    rnd.m_Nodes.Add(curNode);
+    rnd.m_dwFlag = XFA_RESOVENODE_RSTYPE_Attribute;
+    return 1;
+  }
+  return 0;
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Normal(
+    CXFA_ResolveNodesData& rnd) {
+  if (rnd.m_nLevel > 32) {
+    return 0;
+  }
+  if (!rnd.m_CurNode->IsNode()) {
+    return 0;
+  }
+  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
+  CXFA_ObjArray& nodes = rnd.m_Nodes;
+  int32_t nNum = nodes.GetSize();
+  FX_DWORD dwStyles = rnd.m_dwStyles;
+  CFX_WideString& wsName = rnd.m_wsName;
+  uint32_t uNameHash = rnd.m_uHashName;
+  CFX_WideString& wsCondition = rnd.m_wsCondition;
+  CXFA_ResolveNodesData rndFind;
+  rndFind.m_wsName = rnd.m_wsName;
+  rndFind.m_wsCondition = rnd.m_wsCondition;
+  rndFind.m_pSC = rnd.m_pSC;
+  rndFind.m_nLevel = rnd.m_nLevel + 1;
+  rndFind.m_uHashName = uNameHash;
+  CXFA_NodeArray children;
+  CXFA_NodeArray properties;
+  CXFA_Node* pVariablesNode = NULL;
+  CXFA_Node* pPageSetNode = NULL;
+  CXFA_Node* pChild = curNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+  while (pChild) {
+    if (pChild->GetClassID() == XFA_ELEMENT_Variables) {
+      pVariablesNode = pChild;
+      pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+      continue;
+    } else if (pChild->GetClassID() == XFA_ELEMENT_PageSet) {
+      pPageSetNode = pChild;
+      pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+      continue;
+    } else {
+      const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement(
+          curNode->GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+      if (pPropert) {
+        properties.Add(pChild);
+      } else {
+        children.Add(pChild);
+      }
+    }
+    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+  }
+  if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) {
+    uint32_t uPropHash = pVariablesNode->GetClassHashCode();
+    if (uPropHash == uNameHash) {
+      nodes.Add(pVariablesNode);
+    } else {
+      rndFind.m_CurNode = pVariablesNode;
+      XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind);
+      CFX_WideString wsSaveCondition = rndFind.m_wsCondition;
+      rndFind.m_wsCondition.Empty();
+      XFA_ResolveNodes_Normal(rndFind);
+      rndFind.m_wsCondition = wsSaveCondition;
+      if (rndFind.m_Nodes.GetSize() > 0) {
+        nodes.Append(rndFind.m_Nodes);
+        rndFind.m_Nodes.RemoveAll();
+      }
+    }
+    if (nodes.GetSize() > nNum) {
+      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+      if (nodes.GetSize() > 0) {
+        return 1;
+      }
+      return 0;
+    }
+  }
+  if (dwStyles & XFA_RESOLVENODE_Children) {
+    FX_BOOL bSetFlag = FALSE;
+    if (pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties)) {
+      children.Add(pPageSetNode);
+    }
+    for (int32_t i = 0; i < children.GetSize(); i++) {
+      CXFA_Node* child = children[i];
+      if (dwStyles & XFA_RESOLVENODE_TagName) {
+        if (child->GetClassHashCode() == uNameHash) {
+          nodes.Add(child);
+        }
+      } else if (child->GetNameHash() == uNameHash) {
+        nodes.Add(child);
+      }
+      if (m_pNodeHelper->XFA_NodeIsTransparent(child) &&
+          child->GetClassID() != XFA_ELEMENT_PageSet) {
+        if (!bSetFlag) {
+          XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind);
+          bSetFlag = TRUE;
+        }
+        rndFind.m_CurNode = child;
+        CFX_WideString wsSaveCondition = rndFind.m_wsCondition;
+        rndFind.m_wsCondition.Empty();
+        XFA_ResolveNodes_Normal(rndFind);
+        rndFind.m_wsCondition = wsSaveCondition;
+        if (rndFind.m_Nodes.GetSize() > 0) {
+          nodes.Append(rndFind.m_Nodes);
+          rndFind.m_Nodes.RemoveAll();
+        }
+      }
+    }
+    if (nodes.GetSize() > nNum) {
+      if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
+        CXFA_NodeArray upArrayNodes;
+        if (m_pNodeHelper->XFA_NodeIsTransparent(ToNode(curNode))) {
+          m_pNodeHelper->XFA_CountSiblings(
+              ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes,
+              !!(dwStyles & XFA_RESOLVENODE_TagName));
+        }
+        if (upArrayNodes.GetSize() > nodes.GetSize()) {
+          upArrayNodes[0] = ToNode(nodes[0]);
+          nodes.RemoveAll();
+          nodes.Append((CXFA_ObjArray&)upArrayNodes);
+          upArrayNodes.RemoveAll();
+        }
+      }
+      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+      if (nodes.GetSize() > 0) {
+        return 1;
+      }
+      return 0;
+    }
+  }
+  if (dwStyles & XFA_RESOLVENODE_Attributes) {
+    if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) {
+      return 1;
+    }
+  }
+  if (dwStyles & XFA_RESOLVENODE_Properties) {
+    for (int32_t i = 0; i < properties.GetSize(); i++) {
+      CXFA_Node* childProperty = properties[i];
+      if (childProperty->IsUnnamed()) {
+        uint32_t uPropHash = childProperty->GetClassHashCode();
+        if (uPropHash == uNameHash) {
+          nodes.Add(childProperty);
+        }
+      } else if (childProperty->GetNameHash() == uNameHash &&
+                 childProperty->GetClassID() != XFA_ELEMENT_Extras &&
+                 childProperty->GetClassID() != XFA_ELEMENT_Items) {
+        nodes.Add(childProperty);
+      }
+    }
+    if (nodes.GetSize() > nNum) {
+      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+      if (nodes.GetSize() > 0) {
+        return 1;
+      }
+      return 0;
+    }
+    CXFA_Node* pProp = NULL;
+    if (XFA_ELEMENT_Subform == curNode->GetClassID() &&
+        XFA_HASHCODE_Occur == uNameHash) {
+      CXFA_Node* pInstanceManager =
+          curNode->AsNode()->GetInstanceMgrOfSubform();
+      if (pInstanceManager) {
+        pProp = pInstanceManager->GetProperty(0, XFA_ELEMENT_Occur, TRUE);
+      }
+    } else {
+      const XFA_ELEMENTINFO* pElement = XFA_GetElementByName(wsName);
+      if (pElement) {
+        pProp = curNode->AsNode()->GetProperty(
+            0, pElement->eName, pElement->eName != XFA_ELEMENT_PageSet);
+      }
+    }
+    if (pProp) {
+      nodes.Add(pProp);
+      return nodes.GetSize();
+    }
+  }
+  CXFA_Node* parentNode = m_pNodeHelper->XFA_ResolveNodes_GetParent(
+      curNode->AsNode(), XFA_LOGIC_NoTransparent);
+  uint32_t uCurClassHash = curNode->GetClassHashCode();
+  if (!parentNode) {
+    if (uCurClassHash == uNameHash) {
+      nodes.Add(curNode->AsNode());
+      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+      if (nodes.GetSize() > 0) {
+        return 1;
+      }
+    }
+    return 0;
+  }
+  if (dwStyles & XFA_RESOLVENODE_Siblings) {
+    CXFA_Node* child = parentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+    FX_DWORD dwSubStyles =
+        XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties;
+    if (dwStyles & XFA_RESOLVENODE_TagName) {
+      dwSubStyles |= XFA_RESOLVENODE_TagName;
+    }
+    if (dwStyles & XFA_RESOLVENODE_ALL) {
+      dwSubStyles |= XFA_RESOLVENODE_ALL;
+    }
+    rndFind.m_dwStyles = dwSubStyles;
+    while (child) {
+      if (child == curNode) {
+        if (dwStyles & XFA_RESOLVENODE_TagName) {
+          if (uCurClassHash == uNameHash) {
+            nodes.Add(curNode);
+          }
+        } else {
+          if (child->GetNameHash() == uNameHash) {
+            nodes.Add(curNode);
+            if (rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) {
+              nodes.RemoveAll();
+              nodes.Add(curNode);
+              return 1;
+            }
+          }
+        }
+        child = child->GetNodeItem(XFA_NODEITEM_NextSibling);
+        continue;
+      }
+      if (dwStyles & XFA_RESOLVENODE_TagName) {
+        if (child->GetClassHashCode() == uNameHash) {
+          nodes.Add(child);
+        }
+      } else if (child->GetNameHash() == uNameHash) {
+        nodes.Add(child);
+      }
+      const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement(
+          parentNode->GetClassID(), child->GetClassID(), XFA_XDPPACKET_UNKNOWN);
+      FX_BOOL bInnerSearch = FALSE;
+      if (pPropert) {
+        if ((child->GetClassID() == XFA_ELEMENT_Variables ||
+             child->GetClassID() == XFA_ELEMENT_PageSet)) {
+          bInnerSearch = TRUE;
+        }
+      } else {
+        if (m_pNodeHelper->XFA_NodeIsTransparent(child)) {
+          bInnerSearch = TRUE;
+        }
+      }
+      if (bInnerSearch) {
+        rndFind.m_CurNode = child;
+        CFX_WideString wsOriginCondition = rndFind.m_wsCondition;
+        rndFind.m_wsCondition.Empty();
+        FX_DWORD dwOriginStyle = rndFind.m_dwStyles;
+        rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL;
+        XFA_ResolveNodes_Normal(rndFind);
+        rndFind.m_dwStyles = dwOriginStyle;
+        rndFind.m_wsCondition = wsOriginCondition;
+        if (rndFind.m_Nodes.GetSize() > 0) {
+          nodes.Append(rndFind.m_Nodes);
+          rndFind.m_Nodes.RemoveAll();
+        }
+      }
+      child = child->GetNodeItem(XFA_NODEITEM_NextSibling);
+    }
+    if (nodes.GetSize() > nNum) {
+      if (m_pNodeHelper->XFA_NodeIsTransparent(parentNode)) {
+        CXFA_NodeArray upArrayNodes;
+        m_pNodeHelper->XFA_CountSiblings(
+            ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes,
+            !!(dwStyles & XFA_RESOLVENODE_TagName));
+        if (upArrayNodes.GetSize() > nodes.GetSize()) {
+          upArrayNodes[0] = ToNode(nodes[0]);
+          nodes.RemoveAll();
+          nodes.Append((CXFA_ObjArray&)upArrayNodes);
+          upArrayNodes.RemoveAll();
+        }
+      }
+      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
+      if (nodes.GetSize() > 0) {
+        return 1;
+      }
+      return 0;
+    }
+  }
+  if (dwStyles & XFA_RESOLVENODE_Parent) {
+    FX_DWORD dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
+                           XFA_RESOLVENODE_Properties;
+    if (dwStyles & XFA_RESOLVENODE_TagName) {
+      dwSubStyles |= XFA_RESOLVENODE_TagName;
+    }
+    if (dwStyles & XFA_RESOLVENODE_ALL) {
+      dwSubStyles |= XFA_RESOLVENODE_ALL;
+    }
+    rndFind.m_dwStyles = dwSubStyles;
+    rndFind.m_CurNode = parentNode;
+    CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray();
+    array.Add(parentNode);
+    XFA_ResolveNodes_Normal(rndFind);
+    if (rndFind.m_Nodes.GetSize() > 0) {
+      nodes.Append(rndFind.m_Nodes);
+      rndFind.m_Nodes.RemoveAll();
+    }
+    if (nodes.GetSize() > nNum) {
+      return 1;
+    }
+  }
+  return 0;
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Asterisk(
+    CXFA_ResolveNodesData& rnd) {
+  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
+  CXFA_ObjArray& nodes = rnd.m_Nodes;
+  CXFA_NodeArray array;
+  curNode->GetNodeList(array,
+                       XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties);
+  nodes.Append((CXFA_ObjArray&)array);
+  return nodes.GetSize();
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_PopStack(
+    CFX_Int32Array& stack) {
+  int32_t nType = -1;
+  int32_t iSize = stack.GetSize() - 1;
+  if (iSize > -1) {
+    nType = stack[iSize];
+    stack.RemoveAt(iSize, 1);
+  }
+  return nType;
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_GetFilter(
+    const CFX_WideStringC& wsExpression,
+    int32_t nStart,
+    CXFA_ResolveNodesData& rnd) {
+  FXSYS_assert(nStart > -1);
+  int32_t iLength = wsExpression.GetLength();
+  if (nStart >= iLength) {
+    return 0;
+  }
+  CFX_WideString& wsName = rnd.m_wsName;
+  CFX_WideString& wsCondition = rnd.m_wsCondition;
+  FX_WCHAR* pNameBuf = wsName.GetBuffer(iLength - nStart);
+  FX_WCHAR* pConditionBuf = wsCondition.GetBuffer(iLength - nStart);
+  int32_t nNameCount = 0;
+  int32_t nConditionCount = 0;
+  CFX_Int32Array stack;
+  int32_t nType = -1;
+  const FX_WCHAR* pSrc = wsExpression.GetPtr();
+  FX_WCHAR wPrev = 0, wCur;
+  FX_BOOL bIsCondition = FALSE;
+  while (nStart < iLength) {
+    wCur = pSrc[nStart++];
+    if (wCur == '.') {
+      if (wPrev == '\\') {
+        pNameBuf[nNameCount - 1] = wPrev = '.';
+        continue;
+      }
+      if (nNameCount == 0) {
+        pNameBuf[nNameCount++] = wCur;
+        continue;
+      }
+      FX_WCHAR wLookahead = nStart < iLength ? pSrc[nStart] : 0;
+      if (wLookahead != '[' && wLookahead != '(') {
+        if (nType < 0) {
+          break;
+        }
+      }
+    }
+    if (wCur == '[' || wCur == '(') {
+      bIsCondition = TRUE;
+    } else if (wCur == '.' && nStart < iLength &&
+               (pSrc[nStart] == '[' || pSrc[nStart] == '(')) {
+      bIsCondition = TRUE;
+    }
+    if (bIsCondition) {
+      pConditionBuf[nConditionCount++] = wCur;
+    } else {
+      pNameBuf[nNameCount++] = wCur;
+    }
+    FX_BOOL bRecursive = TRUE;
+    switch (nType) {
+      case 0:
+        if (wCur == ']') {
+          nType = XFA_ResolveNodes_PopStack(stack);
+          bRecursive = FALSE;
+        }
+        break;
+      case 1:
+        if (wCur == ')') {
+          nType = XFA_ResolveNodes_PopStack(stack);
+          bRecursive = FALSE;
+        }
+        break;
+      case 2:
+        if (wCur == '"') {
+          nType = XFA_ResolveNodes_PopStack(stack);
+          bRecursive = FALSE;
+        }
+        break;
+    }
+    if (bRecursive) {
+      switch (wCur) {
+        case '[':
+          stack.Add(nType);
+          nType = 0;
+          break;
+        case '(':
+          stack.Add(nType);
+          nType = 1;
+          break;
+        case '"':
+          stack.Add(nType);
+          nType = 2;
+          break;
+      }
+    }
+    wPrev = wCur;
+  }
+  if (stack.GetSize() > 0) {
+    return -1;
+  }
+  wsName.ReleaseBuffer(nNameCount);
+  wsName.TrimLeft();
+  wsName.TrimRight();
+  wsCondition.ReleaseBuffer(nConditionCount);
+  wsCondition.TrimLeft();
+  wsCondition.TrimRight();
+  rnd.m_uHashName = FX_HashCode_String_GetW(wsName, wsName.GetLength());
+  return nStart;
+}
+void CXFA_ResolveProcessor::XFA_ResolveNode_ConditionArray(
+    int32_t iCurIndex,
+    CFX_WideString wsCondition,
+    int32_t iFoundCount,
+    CXFA_ResolveNodesData& rnd) {
+  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
+  int32_t iLen = wsCondition.GetLength();
+  FX_BOOL bRelative = FALSE;
+  FX_BOOL bAll = FALSE;
+  int32_t i = 1;
+  for (; i < iLen; ++i) {
+    FX_WCHAR ch = wsCondition[i];
+    if (ch == ' ') {
+      continue;
+    }
+    if (ch == '+' || ch == '-') {
+      bRelative = TRUE;
+      break;
+    } else if (ch == '*') {
+      bAll = TRUE;
+      break;
+    } else {
+      break;
+    }
+  }
+  if (bAll) {
+    if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
+      if (rnd.m_dwStyles & XFA_RESOLVENODE_Bind) {
+        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
+        m_pNodeHelper->m_iCreateCount = 1;
+        findNodes.RemoveAll();
+        m_pNodeHelper->m_iCurAllStart = -1;
+        m_pNodeHelper->m_pAllStartParent = NULL;
+      } else {
+        if (m_pNodeHelper->m_iCurAllStart == -1) {
+          m_pNodeHelper->m_iCurAllStart = m_iCurStart;
+          m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurNode);
+        }
+      }
+    } else if (rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) {
+      if (m_pNodeHelper->m_iCurAllStart == -1) {
+        m_pNodeHelper->m_iCurAllStart = m_iCurStart;
+      }
+    }
+    return;
+  }
+  if (iFoundCount == 1 && !iLen) {
+    return;
+  }
+  CFX_WideString wsIndex;
+  wsIndex = wsCondition.Mid(i, iLen - 1 - i);
+  int32_t iIndex = wsIndex.GetInteger();
+  if (bRelative) {
+    iIndex += iCurIndex;
+  }
+  if (iFoundCount <= iIndex || iIndex < 0) {
+    if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
+      m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
+      m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1;
+    }
+    findNodes.RemoveAll();
+  } else {
+    CXFA_Node* ret = findNodes[iIndex];
+    findNodes.RemoveAll();
+    findNodes.Add(ret);
+  }
+}
+void CXFA_ResolveProcessor::XFA_ResolveNode_DoPredicateFilter(
+    int32_t iCurIndex,
+    CFX_WideString wsCondition,
+    int32_t iFoundCount,
+    CXFA_ResolveNodesData& rnd) {
+  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
+  FXSYS_assert(iFoundCount == findNodes.GetSize());
+  CFX_WideString wsExpression;
+  IXFA_ScriptContext* pContext = NULL;
+  XFA_SCRIPTLANGTYPE eLangType = XFA_SCRIPTLANGTYPE_Unkown;
+  if (wsCondition.Left(2) == FX_WSTRC(L".[") &&
+      wsCondition.Right(1) == FX_WSTRC(L"]")) {
+    eLangType = XFA_SCRIPTLANGTYPE_Formcalc;
+  } else if (wsCondition.Left(2) == FX_WSTRC(L".(") &&
+             wsCondition.Right(1) == FX_WSTRC(L")")) {
+    eLangType = XFA_SCRIPTLANGTYPE_Javascript;
+  } else {
+    return;
+  }
+  pContext = rnd.m_pSC;
+  wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3);
+  for (int32_t i = iFoundCount - 1; i >= 0; i--) {
+    CXFA_Object* node = findNodes[i];
+    FX_BOOL bRet = FALSE;
+    FXJSE_HVALUE pRetValue = FXJSE_Value_Create(rnd.m_pSC->GetRuntime());
+    bRet = pContext->RunScript(eLangType, wsExpression, pRetValue, node);
+    if (!bRet || !FXJSE_Value_ToBoolean(pRetValue)) {
+      findNodes.RemoveAt(i);
+    }
+    FXJSE_Value_Release(pRetValue);
+  }
+}
+
+void CXFA_ResolveProcessor::XFA_ResolveNode_FilterCondition(
+    CXFA_ResolveNodesData& rnd,
+    CFX_WideString wsCondition) {
+  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
+  int32_t iCurrIndex = 0;
+  const CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray();
+  int32_t iSize = array.GetSize();
+  if (iSize) {
+    CXFA_Node* curNode = array[iSize - 1];
+    FX_BOOL bIsProperty = m_pNodeHelper->XFA_NodeIsProperty(curNode);
+    if (curNode->IsUnnamed() ||
+        (bIsProperty && curNode->GetClassID() != XFA_ELEMENT_PageSet)) {
+      iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent,
+                                               bIsProperty, TRUE);
+    } else {
+      iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent,
+                                               bIsProperty, FALSE);
+    }
+  }
+  int32_t iFoundCount = findNodes.GetSize();
+  wsCondition.TrimLeft();
+  wsCondition.TrimRight();
+  int32_t iLen = wsCondition.GetLength();
+  if (!iLen) {
+    if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL) {
+      return;
+    }
+    if (iFoundCount == 1) {
+      return;
+    }
+    if (iFoundCount <= iCurrIndex) {
+      if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
+        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
+        m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1;
+      }
+      findNodes.RemoveAll();
+      return;
+    } else {
+      CXFA_Node* ret = findNodes[iCurrIndex];
+      findNodes.RemoveAll();
+      findNodes.Add(ret);
+      return;
+    }
+  }
+  FX_WCHAR wTypeChar = wsCondition[0];
+  switch (wTypeChar) {
+    case '[':
+      XFA_ResolveNode_ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd);
+      return;
+    case '(':
+      return;
+    case '"':
+      return;
+    case '.':
+      if (iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '(')) {
+        XFA_ResolveNode_DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount,
+                                          rnd);
+      }
+    default:
+      return;
+  }
+}
+void CXFA_ResolveProcessor::XFA_ResolveNodes_SetStylesForChild(
+    FX_DWORD dwParentStyles,
+    CXFA_ResolveNodesData& rnd) {
+  FX_DWORD dwSubStyles = XFA_RESOLVENODE_Children;
+  if (dwParentStyles & XFA_RESOLVENODE_TagName) {
+    dwSubStyles |= XFA_RESOLVENODE_TagName;
+  }
+  dwSubStyles &= ~XFA_RESOLVENODE_Parent;
+  dwSubStyles &= ~XFA_RESOLVENODE_Siblings;
+  dwSubStyles &= ~XFA_RESOLVENODE_Properties;
+  dwSubStyles |= XFA_RESOLVENODE_ALL;
+  rnd.m_dwStyles = dwSubStyles;
+}
+int32_t CXFA_ResolveProcessor::XFA_ResolveNode_SetResultCreateNode(
+    XFA_RESOLVENODE_RS& resolveNodeRS,
+    CFX_WideString& wsLastCondition) {
+  if (m_pNodeHelper->m_pCreateParent) {
+    resolveNodeRS.nodes.Add(m_pNodeHelper->m_pCreateParent);
+  } else {
+    m_pNodeHelper->XFA_CreateNode_ForCondition(wsLastCondition);
+  }
+  resolveNodeRS.dwFlags = m_pNodeHelper->m_iCreateFlag;
+  if (resolveNodeRS.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
+    if (m_pNodeHelper->m_iCurAllStart != -1) {
+      resolveNodeRS.dwFlags = XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll;
+    }
+  }
+  return resolveNodeRS.nodes.GetSize();
+}
+void CXFA_ResolveProcessor::XFA_ResolveNode_SetIndexDataBind(
+    CFX_WideString& wsNextCondition,
+    int32_t& iIndex,
+    int32_t iCount) {
+  if (m_pNodeHelper->XFA_CreateNode_ForCondition(wsNextCondition)) {
+    if (m_pNodeHelper->m_eLastCreateType == XFA_ELEMENT_DataGroup) {
+      iIndex = 0;
+    } else {
+      iIndex = iCount - 1;
+    }
+  } else {
+    iIndex = iCount - 1;
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_script_resolveprocessor.h b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
new file mode 100644
index 0000000..fa34a88
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
@@ -0,0 +1,86 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/include/fxfa/fxfa_objectacc.h"
+
+class CXFA_NodeHelper;
+class CXFA_ScriptContext;
+
+class CXFA_ResolveNodesData {
+ public:
+  CXFA_ResolveNodesData(CXFA_ScriptContext* pSC = NULL)
+      : m_pSC(pSC),
+        m_CurNode(NULL),
+        m_wsName(),
+        m_uHashName(0),
+        m_wsCondition(),
+        m_nLevel(0),
+        m_Nodes(),
+        m_dwStyles(XFA_RESOLVENODE_Children),
+        m_pScriptAttribute(NULL),
+        m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {}
+  ~CXFA_ResolveNodesData() { m_Nodes.RemoveAll(); }
+  CXFA_ScriptContext* m_pSC;
+  CXFA_Object* m_CurNode;
+  CFX_WideString m_wsName;
+  uint32_t m_uHashName;
+  CFX_WideString m_wsCondition;
+  int32_t m_nLevel;
+  CXFA_ObjArray m_Nodes;
+  FX_DWORD m_dwStyles;
+  const XFA_SCRIPTATTRIBUTEINFO* m_pScriptAttribute;
+  XFA_RESOVENODE_RSTYPE m_dwFlag;
+};
+class CXFA_ResolveProcessor {
+ public:
+  CXFA_ResolveProcessor(void);
+  ~CXFA_ResolveProcessor(void);
+  int32_t XFA_ResolveNodes(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_AnyChild(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_Dollar(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_Excalmatory(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_NumberSign(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_Asterisk(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_Normal(CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_ForAttributeRs(CXFA_Object* curNode,
+                                          CXFA_ResolveNodesData& rnd,
+                                          const CFX_WideStringC& strAttr);
+  void XFA_ResolveNode_ConditionArray(int32_t iCurIndex,
+                                      CFX_WideString wsCondition,
+                                      int32_t iFoundCount,
+                                      CXFA_ResolveNodesData& rnd);
+  void XFA_ResolveNode_DoPredicateFilter(int32_t iCurIndex,
+                                         CFX_WideString wsCondition,
+                                         int32_t iFoundCount,
+                                         CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNodes_GetFilter(const CFX_WideStringC& wsExpression,
+                                     int32_t nStart,
+                                     CXFA_ResolveNodesData& rnd);
+  void XFA_ResolveNode_FilterCondition(CXFA_ResolveNodesData& rnd,
+                                       CFX_WideString wsCondition);
+  int32_t XFA_ResolveNodes_PopStack(CFX_Int32Array& stack);
+  void XFA_ResolveNodes_SetStylesForChild(FX_DWORD dwParentStyles,
+                                          CXFA_ResolveNodesData& rnd);
+  int32_t XFA_ResolveNode_SetResultCreateNode(XFA_RESOLVENODE_RS& resolveNodeRS,
+                                              CFX_WideString& wsLastCondition);
+  void XFA_ResolveNode_SetIndexDataBind(CFX_WideString& wsNextCondition,
+                                        int32_t& iIndex,
+                                        int32_t iCount);
+  CXFA_NodeHelper* GetNodeHelper() { return m_pNodeHelper; }
+
+ private:
+  CXFA_NodeHelper* m_pNodeHelper;
+
+ public:
+  int32_t m_iCurStart;
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
diff --git a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp
new file mode 100644
index 0000000..ee33eb2
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.cpp
@@ -0,0 +1,124 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_script_signaturepseudomodel.h"
+
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+CScript_SignaturePseudoModel::CScript_SignaturePseudoModel(
+    CXFA_Document* pDocument)
+    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_SignaturePseudoModel) {
+  m_uScriptHash = XFA_HASHCODE_Signature;
+}
+CScript_SignaturePseudoModel::~CScript_SignaturePseudoModel() {}
+void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Verify(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 4) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"verify");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CXFA_Node* pNode = NULL;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  int32_t bVerify = pNotify->GetDocProvider()->Verify(hDoc, pNode);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetInteger(hValue, bVerify);
+  }
+}
+void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Sign(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 3 || iLength > 7) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"sign");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CXFA_NodeList* pNodeList = NULL;
+  CFX_WideString wsExpression;
+  CFX_WideString wsXMLIdent;
+  if (iLength >= 1) {
+    pNodeList = (CXFA_NodeList*)pArguments->GetObject(0);
+  }
+  if (iLength >= 2) {
+    CFX_ByteString bsExpression = pArguments->GetUTF8String(1);
+    wsExpression =
+        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
+  }
+  if (iLength >= 3) {
+    CFX_ByteString bsXMLIdent = pArguments->GetUTF8String(2);
+    wsXMLIdent = CFX_WideString::FromUTF8(bsXMLIdent, bsXMLIdent.GetLength());
+  }
+  FX_BOOL bSign = pNotify->GetDocProvider()->Sign(hDoc, pNodeList, wsExpression,
+                                                  wsXMLIdent);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, bSign);
+  }
+}
+void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Enumerate(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength != 0) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"enumerate");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CXFA_NodeList* pList = pNotify->GetDocProvider()->Enumerate(hDoc);
+  if (!pList)
+    return;
+  FXJSE_Value_Set(pArguments->GetReturnValue(),
+                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pList));
+}
+void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Clear(
+    CFXJSE_Arguments* pArguments) {
+  int32_t iLength = pArguments->GetLength();
+  if (iLength < 1 || iLength > 2) {
+    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clear");
+    return;
+  }
+  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
+  if (!pNotify) {
+    return;
+  }
+  IXFA_Doc* hDoc = pNotify->GetHDOC();
+  CXFA_Node* pNode = NULL;
+  FX_BOOL bClear = TRUE;
+  if (iLength >= 1) {
+    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  }
+  if (iLength >= 2) {
+    bClear = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
+  }
+  FX_BOOL bFlag = pNotify->GetDocProvider()->Clear(hDoc, pNode, bClear);
+  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
+  if (hValue) {
+    FXJSE_Value_SetBoolean(hValue, bFlag);
+  }
+}
diff --git a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
new file mode 100644
index 0000000..2591917
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
+#define XFA_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
+
+#include "xfa/fxfa/parser/xfa_object.h"
+
+class CScript_SignaturePseudoModel : public CXFA_OrdinaryObject {
+ public:
+  CScript_SignaturePseudoModel(CXFA_Document* pDocument);
+  ~CScript_SignaturePseudoModel();
+  void Script_SignaturePseudoModel_Verify(CFXJSE_Arguments* pArguments);
+  void Script_SignaturePseudoModel_Sign(CFXJSE_Arguments* pArguments);
+  void Script_SignaturePseudoModel_Enumerate(CFXJSE_Arguments* pArguments);
+  void Script_SignaturePseudoModel_Clear(CFXJSE_Arguments* pArguments);
+};
+
+#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/xfa_utils.h b/xfa/fxfa/parser/xfa_utils.h
new file mode 100644
index 0000000..6cc17d9
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_utils.h
@@ -0,0 +1,219 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXFA_PARSER_XFA_UTILS_H_
+#define XFA_FXFA_PARSER_XFA_UTILS_H_
+
+#include "xfa/fde/xml/fde_xml.h"
+#include "xfa/include/fxfa/fxfa_basic.h"
+
+class CXFA_LocaleValue;
+
+FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
+    IFDE_XMLElement* pNode,
+    const CFX_WideStringC& wsQualifier,
+    CFX_WideString& wsNamespaceURI);
+template <class NodeType, class TraverseStrategy>
+class CXFA_NodeIteratorTemplate {
+ public:
+  CXFA_NodeIteratorTemplate(NodeType* pRootNode = NULL) : m_pRoot(pRootNode) {
+    if (pRootNode) {
+      m_NodeStack.Push(pRootNode);
+    }
+  }
+  FX_BOOL Init(NodeType* pRootNode) {
+    if (!pRootNode) {
+      return FALSE;
+    }
+    m_pRoot = pRootNode;
+    m_NodeStack.RemoveAll();
+    m_NodeStack.Push(pRootNode);
+    return TRUE;
+  }
+  void Clear() { m_NodeStack.RemoveAll(); }
+  void Reset() {
+    Clear();
+    if (m_pRoot) {
+      m_NodeStack.Push(m_pRoot);
+    }
+  }
+  FX_BOOL SetCurrent(NodeType* pCurNode) {
+    m_NodeStack.RemoveAll();
+    if (pCurNode) {
+      CFX_StackTemplate<NodeType*> revStack;
+      NodeType* pNode;
+      for (pNode = pCurNode; pNode && pNode != m_pRoot;
+           pNode = TraverseStrategy::GetParent(pNode)) {
+        revStack.Push(pNode);
+      }
+      if (!pNode) {
+        return FALSE;
+      }
+      revStack.Push(m_pRoot);
+      while (revStack.GetSize()) {
+        m_NodeStack.Push(*revStack.GetTopElement());
+        revStack.Pop();
+      }
+    }
+    return TRUE;
+  }
+  NodeType* GetCurrent() const {
+    return m_NodeStack.GetSize() ? *m_NodeStack.GetTopElement() : NULL;
+  }
+  NodeType* GetRoot() const { return m_pRoot; }
+  NodeType* MoveToPrev() {
+    int32_t nStackLength = m_NodeStack.GetSize();
+    if (nStackLength == 1) {
+      return NULL;
+    } else if (nStackLength > 1) {
+      NodeType* pCurItem = *m_NodeStack.GetTopElement();
+      m_NodeStack.Pop();
+      NodeType* pParentItem = *m_NodeStack.GetTopElement();
+      NodeType* pParentFirstChildItem =
+          TraverseStrategy::GetFirstChild(pParentItem);
+      if (pCurItem == pParentFirstChildItem) {
+        return pParentItem;
+      }
+      NodeType *pPrevItem = pParentFirstChildItem, *pPrevItemNext = NULL;
+      for (; pPrevItem; pPrevItem = pPrevItemNext) {
+        pPrevItemNext = TraverseStrategy::GetNextSibling(pPrevItem);
+        if (!pPrevItemNext || pPrevItemNext == pCurItem) {
+          break;
+        }
+      }
+      m_NodeStack.Push(pPrevItem);
+    } else {
+      m_NodeStack.RemoveAll();
+      if (m_pRoot) {
+        m_NodeStack.Push(m_pRoot);
+      }
+    }
+    if (m_NodeStack.GetSize() > 0) {
+      NodeType* pChildItem = *m_NodeStack.GetTopElement();
+      while ((pChildItem = TraverseStrategy::GetFirstChild(pChildItem)) !=
+             NULL) {
+        while (NodeType* pNextItem =
+                   TraverseStrategy::GetNextSibling(pChildItem)) {
+          pChildItem = pNextItem;
+        }
+        m_NodeStack.Push(pChildItem);
+      }
+      return *m_NodeStack.GetTopElement();
+    }
+    return NULL;
+  }
+  NodeType* MoveToNext() {
+    NodeType** ppNode = NULL;
+    NodeType* pCurrent = GetCurrent();
+    while (m_NodeStack.GetSize() > 0) {
+      while ((ppNode = m_NodeStack.GetTopElement())) {
+        if (pCurrent != *ppNode) {
+          return *ppNode;
+        }
+        NodeType* pChild = TraverseStrategy::GetFirstChild(*ppNode);
+        if (pChild == NULL) {
+          break;
+        }
+        m_NodeStack.Push(pChild);
+      }
+      while ((ppNode = m_NodeStack.GetTopElement())) {
+        NodeType* pNext = TraverseStrategy::GetNextSibling(*ppNode);
+        m_NodeStack.Pop();
+        if (m_NodeStack.GetSize() == 0) {
+          break;
+        }
+        if (pNext) {
+          m_NodeStack.Push(pNext);
+          break;
+        }
+      }
+    }
+    return NULL;
+  }
+  NodeType* SkipChildrenAndMoveToNext() {
+    NodeType** ppNode = NULL;
+    while ((ppNode = m_NodeStack.GetTopElement())) {
+      NodeType* pNext = TraverseStrategy::GetNextSibling(*ppNode);
+      m_NodeStack.Pop();
+      if (m_NodeStack.GetSize() == 0) {
+        break;
+      }
+      if (pNext) {
+        m_NodeStack.Push(pNext);
+        break;
+      }
+    }
+    return GetCurrent();
+  }
+
+ protected:
+  NodeType* m_pRoot;
+  CFX_StackTemplate<NodeType*> m_NodeStack;
+};
+template <class KeyType>
+class CXFA_PtrSetTemplate : private CFX_MapPtrToPtr {
+ public:
+  CXFA_PtrSetTemplate() : CFX_MapPtrToPtr(10) {}
+
+  int GetCount() const { return CFX_MapPtrToPtr::GetCount(); }
+
+  FX_BOOL IsEmpty() const { return CFX_MapPtrToPtr::IsEmpty(); }
+
+  FX_BOOL Lookup(KeyType key) const {
+    void* pValue = NULL;
+    return CFX_MapPtrToPtr::Lookup((void*)key, pValue);
+  }
+
+  FX_BOOL operator[](KeyType key) { return Lookup(key); }
+
+  void Add(KeyType key) { CFX_MapPtrToPtr::SetAt((void*)key, (void*)key); }
+
+  FX_BOOL RemoveKey(KeyType key) {
+    return CFX_MapPtrToPtr::RemoveKey((void*)key);
+  }
+
+  void RemoveAll() { CFX_MapPtrToPtr::RemoveAll(); }
+
+  FX_POSITION GetStartPosition() const {
+    return CFX_MapPtrToPtr::GetStartPosition();
+  }
+
+  void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey) const {
+    void* pKey = NULL;
+    void* pValue = NULL;
+    CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);
+    rKey = (KeyType)(uintptr_t)pKey;
+  }
+};
+class CXFA_Node;
+class CXFA_WidgetData;
+
+CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType);
+CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData);
+CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
+                                int32_t iLead,
+                                int32_t iTread);
+FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString& wsStringVal);
+FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal);
+int32_t XFA_MapRotation(int32_t nRotation);
+
+FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode);
+void XFA_GetPlainTextFromRichText(IFDE_XMLNode* pXMLNode,
+                                  CFX_WideString& wsPlainText);
+FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode);
+IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString& wsBuffer);
+FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement,
+                            FX_BOOL bLayoutContainer = FALSE);
+FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence);
+FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout);
+FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout);
+void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode);
+void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode,
+                                         IFX_Stream* pStream,
+                                         const FX_CHAR* pChecksum = NULL,
+                                         FX_BOOL bSaveXML = FALSE);
+
+#endif  // XFA_FXFA_PARSER_XFA_UTILS_H_
diff --git a/xfa/fxfa/parser/xfa_utils_imp.cpp b/xfa/fxfa/parser/xfa_utils_imp.cpp
new file mode 100644
index 0000000..c043e7c
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_utils_imp.cpp
@@ -0,0 +1,403 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+#include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
+#include "xfa/fxfa/parser/xfa_docdata.h"
+#include "xfa/fxfa/parser/xfa_doclayout.h"
+#include "xfa/fxfa/parser/xfa_document.h"
+#include "xfa/fxfa/parser/xfa_localemgr.h"
+#include "xfa/fxfa/parser/xfa_localevalue.h"
+#include "xfa/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_parser.h"
+#include "xfa/fxfa/parser/xfa_script.h"
+
+CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType) {
+  XFA_ELEMENT eType = pNode->GetClassID();
+  eWidgetType = eType;
+  if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_Draw) {
+    return NULL;
+  }
+  eWidgetType = XFA_ELEMENT_UNKNOWN;
+  XFA_ELEMENT eUIType = XFA_ELEMENT_UNKNOWN;
+  CXFA_Value defValue(pNode->GetProperty(0, XFA_ELEMENT_Value, TRUE));
+  XFA_ELEMENT eValueType = (XFA_ELEMENT)defValue.GetChildValueClassID();
+  switch (eValueType) {
+    case XFA_ELEMENT_Boolean:
+      eUIType = XFA_ELEMENT_CheckButton;
+      break;
+    case XFA_ELEMENT_Integer:
+    case XFA_ELEMENT_Decimal:
+    case XFA_ELEMENT_Float:
+      eUIType = XFA_ELEMENT_NumericEdit;
+      break;
+    case XFA_ELEMENT_ExData:
+    case XFA_ELEMENT_Text:
+      eUIType = XFA_ELEMENT_TextEdit;
+      eWidgetType = XFA_ELEMENT_Text;
+      break;
+    case XFA_ELEMENT_Date:
+    case XFA_ELEMENT_Time:
+    case XFA_ELEMENT_DateTime:
+      eUIType = XFA_ELEMENT_DateTimeEdit;
+      break;
+    case XFA_ELEMENT_Image:
+      eUIType = XFA_ELEMENT_ImageEdit;
+      eWidgetType = XFA_ELEMENT_Image;
+      break;
+    case XFA_ELEMENT_Arc:
+    case XFA_ELEMENT_Line:
+    case XFA_ELEMENT_Rectangle:
+      eUIType = XFA_ELEMENT_DefaultUi;
+      eWidgetType = eValueType;
+      break;
+    default:
+      break;
+  }
+  CXFA_Node* pUIChild = NULL;
+  CXFA_Node* pUI = pNode->GetProperty(0, XFA_ELEMENT_Ui, TRUE);
+  CXFA_Node* pChild = pUI->GetNodeItem(XFA_NODEITEM_FirstChild);
+  for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+    XFA_ELEMENT eChild = pChild->GetClassID();
+    if (eChild == XFA_ELEMENT_Extras || eChild == XFA_ELEMENT_Picture) {
+      continue;
+    }
+    const XFA_PROPERTY* pProperty =
+        XFA_GetPropertyOfElement(XFA_ELEMENT_Ui, eChild, XFA_XDPPACKET_Form);
+    if (pProperty && (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
+      pUIChild = pChild;
+      break;
+    }
+  }
+  if (eType == XFA_ELEMENT_Draw) {
+    XFA_ELEMENT eDraw = pUIChild ? pUIChild->GetClassID() : XFA_ELEMENT_UNKNOWN;
+    switch (eDraw) {
+      case XFA_ELEMENT_TextEdit:
+        eWidgetType = XFA_ELEMENT_Text;
+        break;
+      case XFA_ELEMENT_ImageEdit:
+        eWidgetType = XFA_ELEMENT_Image;
+        break;
+      default:
+        eWidgetType =
+            eWidgetType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_Text : eWidgetType;
+        break;
+    }
+  } else {
+    if (pUIChild && pUIChild->GetClassID() == XFA_ELEMENT_DefaultUi) {
+      eWidgetType = XFA_ELEMENT_TextEdit;
+    } else {
+      eWidgetType = pUIChild
+                        ? pUIChild->GetClassID()
+                        : (eUIType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_TextEdit
+                                                          : eUIType);
+    }
+  }
+  if (!pUIChild) {
+    if (eUIType == XFA_ELEMENT_UNKNOWN) {
+      eUIType = XFA_ELEMENT_TextEdit;
+      defValue.GetNode()->GetProperty(0, XFA_ELEMENT_Text, TRUE);
+    }
+    pUIChild = pUI->GetProperty(0, eUIType, TRUE);
+  } else if (eUIType == XFA_ELEMENT_UNKNOWN) {
+    switch (pUIChild->GetClassID()) {
+      case XFA_ELEMENT_CheckButton: {
+        eValueType = XFA_ELEMENT_Text;
+        if (CXFA_Node* pItems = pNode->GetChild(0, XFA_ELEMENT_Items)) {
+          if (CXFA_Node* pItem = pItems->GetChild(0, XFA_ELEMENT_UNKNOWN)) {
+            eValueType = pItem->GetClassID();
+          }
+        }
+      } break;
+      case XFA_ELEMENT_DateTimeEdit:
+        eValueType = XFA_ELEMENT_DateTime;
+        break;
+      case XFA_ELEMENT_ImageEdit:
+        eValueType = XFA_ELEMENT_Image;
+        break;
+      case XFA_ELEMENT_NumericEdit:
+        eValueType = XFA_ELEMENT_Float;
+        break;
+      case XFA_ELEMENT_ChoiceList: {
+        eValueType = (pUIChild->GetEnum(XFA_ATTRIBUTE_Open) ==
+                      XFA_ATTRIBUTEENUM_MultiSelect)
+                         ? XFA_ELEMENT_ExData
+                         : XFA_ELEMENT_Text;
+      } break;
+      case XFA_ELEMENT_Barcode:
+      case XFA_ELEMENT_Button:
+      case XFA_ELEMENT_PasswordEdit:
+      case XFA_ELEMENT_Signature:
+      case XFA_ELEMENT_TextEdit:
+      default:
+        eValueType = XFA_ELEMENT_Text;
+        break;
+    }
+    defValue.GetNode()->GetProperty(0, eValueType, TRUE);
+  }
+  return pUIChild;
+}
+CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData) {
+  CXFA_Node* pNodeValue =
+      pWidgetData->GetNode()->GetChild(0, XFA_ELEMENT_Value);
+  if (!pNodeValue) {
+    return CXFA_LocaleValue();
+  }
+  CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
+  if (!pValueChild) {
+    return CXFA_LocaleValue();
+  }
+  int32_t iVTType = XFA_VT_NULL;
+  XFA_ELEMENT eType = pValueChild->GetClassID();
+  switch (eType) {
+    case XFA_ELEMENT_Decimal:
+      iVTType = XFA_VT_DECIMAL;
+      break;
+    case XFA_ELEMENT_Float:
+      iVTType = XFA_VT_FLOAT;
+      break;
+    case XFA_ELEMENT_Date:
+      iVTType = XFA_VT_DATE;
+      break;
+    case XFA_ELEMENT_Time:
+      iVTType = XFA_VT_TIME;
+      break;
+    case XFA_ELEMENT_DateTime:
+      iVTType = XFA_VT_DATETIME;
+      break;
+    case XFA_ELEMENT_Boolean:
+      iVTType = XFA_VT_BOOLEAN;
+      break;
+    case XFA_ELEMENT_Integer:
+      iVTType = XFA_VT_INTEGER;
+      break;
+    case XFA_ELEMENT_Text:
+      iVTType = XFA_VT_TEXT;
+      break;
+    default:
+      iVTType = XFA_VT_NULL;
+      break;
+  }
+  return CXFA_LocaleValue(iVTType, pWidgetData->GetRawValue(),
+                          pWidgetData->GetNode()->GetDocument()->GetLocalMgr());
+}
+void XFA_GetPlainTextFromRichText(IFDE_XMLNode* pXMLNode,
+                                  CFX_WideString& wsPlainText) {
+  if (pXMLNode == NULL) {
+    return;
+  }
+  switch (pXMLNode->GetType()) {
+    case FDE_XMLNODE_Element: {
+      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
+      CFX_WideString wsTag;
+      pXMLElement->GetLocalTagName(wsTag);
+      uint32_t uTag = FX_HashCode_String_GetW(wsTag, wsTag.GetLength(), TRUE);
+      if (uTag == 0x0001f714) {
+        wsPlainText += L"\n";
+      } else if (uTag == 0x00000070) {
+        if (!wsPlainText.IsEmpty()) {
+          wsPlainText += L"\n";
+        }
+      } else if (uTag == 0xa48ac63) {
+        if (!wsPlainText.IsEmpty() &&
+            wsPlainText[wsPlainText.GetLength() - 1] != '\n') {
+          wsPlainText += L"\n";
+        }
+      }
+    } break;
+    case FDE_XMLNODE_Text: {
+      CFX_WideString wsContent;
+      ((IFDE_XMLText*)pXMLNode)->GetText(wsContent);
+      wsPlainText += wsContent;
+    } break;
+    case FDE_XMLNODE_CharData: {
+      CFX_WideString wsCharData;
+      ((IFDE_XMLCharData*)pXMLNode)->GetCharData(wsCharData);
+      wsPlainText += wsCharData;
+    } break;
+    default:
+      break;
+  }
+  for (IFDE_XMLNode* pChildXML =
+           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
+       pChildXML;
+       pChildXML = pChildXML->GetNodeItem(IFDE_XMLNode::NextSibling)) {
+    XFA_GetPlainTextFromRichText(pChildXML, wsPlainText);
+  }
+}
+FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode) {
+  FX_BOOL bRet = FALSE;
+  if (!pFieldNode) {
+    return bRet;
+  }
+  CXFA_Node* pUIChild = pFieldNode->GetChild(0, XFA_ELEMENT_Ui);
+  if (pUIChild) {
+    CXFA_Node* pFirstChild = pUIChild->GetNodeItem(XFA_NODEITEM_FirstChild);
+    if (pFirstChild && pFirstChild->GetClassID() == XFA_ELEMENT_ChoiceList) {
+      bRet = pFirstChild->GetEnum(XFA_ATTRIBUTE_Open) ==
+             XFA_ATTRIBUTEENUM_MultiSelect;
+    }
+  }
+  return bRet;
+}
+FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement, FX_BOOL bLayoutContainer) {
+  switch (eElement) {
+    case XFA_ELEMENT_Draw:
+    case XFA_ELEMENT_Field:
+    case XFA_ELEMENT_InstanceManager:
+      return !bLayoutContainer;
+    case XFA_ELEMENT_Area:
+    case XFA_ELEMENT_Subform:
+    case XFA_ELEMENT_ExclGroup:
+    case XFA_ELEMENT_SubformSet:
+      return TRUE;
+    case XFA_ELEMENT_PageArea:
+    case XFA_ELEMENT_Form:
+      return TRUE;
+    default:
+      return FALSE;
+  }
+  return FALSE;
+}
+FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence) {
+  switch (ePresence) {
+    case XFA_ATTRIBUTEENUM_Visible:
+    case XFA_ATTRIBUTEENUM_Invisible:
+      return TRUE;
+    default:
+      return FALSE;
+  }
+  return FALSE;
+}
+FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout) {
+  switch (eLayout) {
+    case XFA_ATTRIBUTEENUM_Tb:
+    case XFA_ATTRIBUTEENUM_Lr_tb:
+    case XFA_ATTRIBUTEENUM_Rl_tb:
+      return TRUE;
+    default:
+      return FALSE;
+  }
+  return FALSE;
+}
+FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout) {
+  switch (eLayout) {
+    case XFA_ATTRIBUTEENUM_Lr_tb:
+    case XFA_ATTRIBUTEENUM_Rl_tb:
+      return TRUE;
+    default:
+      return FALSE;
+  }
+  return FALSE;
+}
+static const FX_DOUBLE fraction_scales[] = {0.1,
+                                            0.01,
+                                            0.001,
+                                            0.0001,
+                                            0.00001,
+                                            0.000001,
+                                            0.0000001,
+                                            0.00000001,
+                                            0.000000001,
+                                            0.0000000001,
+                                            0.00000000001,
+                                            0.000000000001,
+                                            0.0000000000001,
+                                            0.00000000000001,
+                                            0.000000000000001,
+                                            0.0000000000000001};
+FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString& wsStringVal) {
+  CFX_WideString wsValue = wsStringVal;
+  wsValue.TrimLeft();
+  wsValue.TrimRight();
+  int64_t nIntegral = 0;
+  FX_DWORD dwFractional = 0;
+  int32_t nExponent = 0;
+  int32_t cc = 0;
+  FX_BOOL bNegative = FALSE, bExpSign = FALSE;
+  const FX_WCHAR* str = (const FX_WCHAR*)wsValue;
+  int32_t len = wsValue.GetLength();
+  if (str[0] == '+') {
+    cc++;
+  } else if (str[0] == '-') {
+    bNegative = TRUE;
+    cc++;
+  }
+  int32_t nIntegralLen = 0;
+  while (cc < len) {
+    if (str[cc] == '.' || str[cc] == 'E' || str[cc] == 'e' ||
+        nIntegralLen > 17) {
+      break;
+    }
+    if (!XFA_IsDigit(str[cc])) {
+      return 0;
+    }
+    nIntegral = nIntegral * 10 + str[cc] - '0';
+    cc++;
+    nIntegralLen++;
+  }
+  nIntegral = bNegative ? -nIntegral : nIntegral;
+  int32_t scale = 0;
+  FX_DOUBLE fraction = 0.0;
+  if (cc < len && str[cc] == '.') {
+    cc++;
+    while (cc < len) {
+      fraction += fraction_scales[scale] * (str[cc] - '0');
+      scale++;
+      cc++;
+      if (cc == len) {
+        break;
+      }
+      if (scale == sizeof(fraction_scales) / sizeof(FX_DOUBLE) ||
+          str[cc] == 'E' || str[cc] == 'e') {
+        break;
+      }
+      if (!XFA_IsDigit(str[cc])) {
+        return 0;
+      }
+    }
+    dwFractional = (FX_DWORD)(fraction * 4294967296.0);
+  }
+  if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
+    cc++;
+    if (cc < len) {
+      if (str[cc] == '+') {
+        cc++;
+      } else if (str[cc] == '-') {
+        bExpSign = TRUE;
+        cc++;
+      }
+    }
+    while (cc < len) {
+      if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
+        return 0;
+      }
+      nExponent = nExponent * 10 + str[cc] - '0';
+      cc++;
+    }
+    nExponent = bExpSign ? -nExponent : nExponent;
+  }
+  FX_DOUBLE dValue = (dwFractional / 4294967296.0);
+  dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue);
+  if (nExponent != 0) {
+    dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
+  }
+  return dValue;
+}
+
+FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal) {
+  CFX_WideString wsValue =
+      CFX_WideString::FromUTF8(szStringVal.GetCStr(), szStringVal.GetLength());
+  return XFA_WideStringToDouble(wsValue);
+}
+
+int32_t XFA_MapRotation(int32_t nRotation) {
+  nRotation = nRotation % 360;
+  nRotation = nRotation < 0 ? nRotation + 360 : nRotation;
+  return nRotation;
+}
diff --git a/xfa/fxfa/parser/xfa_utils_imp_unittest.cpp b/xfa/fxfa/parser/xfa_utils_imp_unittest.cpp
new file mode 100644
index 0000000..93ee3b9
--- /dev/null
+++ b/xfa/fxfa/parser/xfa_utils_imp_unittest.cpp
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "xfa/fxfa/parser/xfa_utils.h"
+
+TEST(XfaUtilsImp, XFA_MapRotation) {
+  struct TestCase {
+    int input;
+    int expected_output;
+  } TestCases[] = {{-1000000, 80}, {-361, 359}, {-360, 0},  {-359, 1},
+                   {-91, 269},     {-90, 270},  {-89, 271}, {-1, 359},
+                   {0, 0},         {1, 1},      {89, 89},   {90, 90},
+                   {91, 91},       {359, 359},  {360, 0},   {361, 1},
+                   {100000, 280}};
+
+  for (size_t i = 0; i < FX_ArraySize(TestCases); ++i) {
+    EXPECT_EQ(TestCases[i].expected_output,
+              XFA_MapRotation(TestCases[i].input));
+  }
+}
diff --git a/xfa/fxgraphics/fx_graphics.cpp b/xfa/fxgraphics/fx_graphics.cpp
new file mode 100644
index 0000000..a3fb84d
--- /dev/null
+++ b/xfa/fxgraphics/fx_graphics.cpp
@@ -0,0 +1,1548 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/include/fxgraphics/fx_graphics.h"
+
+#include <memory>
+
+#include "xfa/fxgraphics/fx_path_generator.h"
+#include "xfa/fxgraphics/pre.h"
+
+class CAGG_Graphics {
+ public:
+  CAGG_Graphics();
+  FX_ERR Create(CFX_Graphics* owner,
+                int32_t width,
+                int32_t height,
+                FXDIB_Format format);
+  virtual ~CAGG_Graphics();
+
+ private:
+  CFX_Graphics* _owner;
+};
+CFX_Graphics::CFX_Graphics() {
+  _type = FX_CONTEXT_None;
+  _info._graphState.SetDashCount(0);
+  _info._isAntialiasing = TRUE;
+  _info._strokeAlignment = FX_STROKEALIGNMENT_Center;
+  _info._CTM.SetIdentity();
+  _info._isActOnDash = FALSE;
+  _info._strokeColor = NULL;
+  _info._fillColor = NULL;
+  _info._font = NULL;
+  _info._fontSize = 40.0;
+  _info._fontHScale = 1.0;
+  _info._fontSpacing = 0.0;
+  _renderDevice = NULL;
+  _aggGraphics = NULL;
+}
+FX_ERR CFX_Graphics::Create(CFX_RenderDevice* renderDevice,
+                            FX_BOOL isAntialiasing) {
+  if (!renderDevice)
+    return FX_ERR_Parameter_Invalid;
+  if (_type != FX_CONTEXT_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_CONTEXT_Device;
+  _info._isAntialiasing = isAntialiasing;
+  _renderDevice = renderDevice;
+  if (_renderDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP) {
+    return FX_ERR_Succeeded;
+  }
+  return FX_ERR_Indefinite;
+}
+FX_ERR CFX_Graphics::Create(int32_t width,
+                            int32_t height,
+                            FXDIB_Format format,
+                            FX_BOOL isNative,
+                            FX_BOOL isAntialiasing) {
+  if (_type != FX_CONTEXT_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_CONTEXT_Device;
+  _info._isAntialiasing = isAntialiasing;
+  {
+    _aggGraphics = new CAGG_Graphics;
+    return _aggGraphics->Create(this, width, height, format);
+  }
+}
+CFX_Graphics::~CFX_Graphics() {
+  if (_aggGraphics) {
+    delete _aggGraphics;
+    _aggGraphics = NULL;
+  }
+  _renderDevice = NULL;
+  _info._graphState.SetDashCount(0);
+  _type = FX_CONTEXT_None;
+}
+FX_ERR CFX_Graphics::GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      capVal = _renderDevice->GetDeviceCaps(capID);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::IsPrinterDevice(FX_BOOL& isPrinter) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      int32_t deviceClass = _renderDevice->GetDeviceClass();
+      if (deviceClass == FXDC_PRINTER) {
+        isPrinter = TRUE;
+      } else {
+        isPrinter = FALSE;
+      }
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::EnableAntialiasing(FX_BOOL isAntialiasing) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._isAntialiasing = isAntialiasing;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SaveGraphState() {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _renderDevice->SaveState();
+      TInfo* info = new TInfo;
+      info->_graphState.Copy(_info._graphState);
+      info->_isAntialiasing = _info._isAntialiasing;
+      info->_strokeAlignment = _info._strokeAlignment;
+      info->_CTM = _info._CTM;
+      info->_isActOnDash = _info._isActOnDash;
+      info->_strokeColor = _info._strokeColor;
+      info->_fillColor = _info._fillColor;
+      info->_font = _info._font;
+      info->_fontSize = _info._fontSize;
+      info->_fontHScale = _info._fontHScale;
+      info->_fontSpacing = _info._fontSpacing;
+      _infoStack.Add(info);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::RestoreGraphState() {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _renderDevice->RestoreState();
+      int32_t size = _infoStack.GetSize();
+      if (size <= 0) {
+        return FX_ERR_Intermediate_Value_Invalid;
+      }
+      int32_t topIndex = size - 1;
+      TInfo* info = (TInfo*)_infoStack.GetAt(topIndex);
+      if (!info)
+        return FX_ERR_Intermediate_Value_Invalid;
+      _info._graphState.Copy(info->_graphState);
+      _info._isAntialiasing = info->_isAntialiasing;
+      _info._strokeAlignment = info->_strokeAlignment;
+      _info._CTM = info->_CTM;
+      _info._isActOnDash = info->_isActOnDash;
+      _info._strokeColor = info->_strokeColor;
+      _info._fillColor = info->_fillColor;
+      _info._font = info->_font;
+      _info._fontSize = info->_fontSize;
+      _info._fontHScale = info->_fontHScale;
+      _info._fontSpacing = info->_fontSpacing;
+      delete info;
+      info = NULL;
+      _infoStack.RemoveAt(topIndex);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetLineCap(CFX_GraphStateData::LineCap& lineCap) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      lineCap = _info._graphState.m_LineCap;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetLineCap(CFX_GraphStateData::LineCap lineCap) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._graphState.m_LineCap = lineCap;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetDashCount(int32_t& dashCount) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      dashCount = _info._graphState.m_DashCount;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray) {
+  if (!dashArray)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      dashPhase = _info._graphState.m_DashPhase;
+      FXSYS_memcpy(dashArray, _info._graphState.m_DashArray,
+                   _info._graphState.m_DashCount * sizeof(FX_FLOAT));
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetLineDash(FX_FLOAT dashPhase,
+                                 FX_FLOAT* dashArray,
+                                 int32_t dashCount) {
+  if (dashCount > 0 && !dashArray) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  dashCount = dashCount < 0 ? 0 : dashCount;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      FX_FLOAT scale = 1.0;
+      if (_info._isActOnDash) {
+        scale = _info._graphState.m_LineWidth;
+      }
+      _info._graphState.m_DashPhase = dashPhase;
+      _info._graphState.SetDashCount(dashCount);
+      for (int32_t i = 0; i < dashCount; i++) {
+        _info._graphState.m_DashArray[i] = dashArray[i] * scale;
+      }
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetLineDash(FX_DashStyle dashStyle) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceSetLineDash(dashStyle);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      lineJoin = _info._graphState.m_LineJoin;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetLineJoin(CFX_GraphStateData::LineJoin lineJoin) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._graphState.m_LineJoin = lineJoin;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetMiterLimit(FX_FLOAT& miterLimit) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      miterLimit = _info._graphState.m_MiterLimit;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetMiterLimit(FX_FLOAT miterLimit) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._graphState.m_MiterLimit = miterLimit;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetLineWidth(FX_FLOAT& lineWidth) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      lineWidth = _info._graphState.m_LineWidth;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._graphState.m_LineWidth = lineWidth;
+      _info._isActOnDash = isActOnDash;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      strokeAlignment = _info._strokeAlignment;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetStrokeAlignment(FX_StrokeAlignment strokeAlignment) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._strokeAlignment = strokeAlignment;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetStrokeColor(CFX_Color* color) {
+  if (!color)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._strokeColor = color;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetFillColor(CFX_Color* color) {
+  if (!color)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._fillColor = color;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::StrokePath(CFX_Path* path, CFX_Matrix* matrix) {
+  if (!path)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceStrokePath(path, matrix);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::FillPath(CFX_Path* path,
+                              FX_FillMode fillMode,
+                              CFX_Matrix* matrix) {
+  if (!path)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceFillPath(path, fillMode, matrix);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::ClipPath(CFX_Path* path,
+                              FX_FillMode fillMode,
+                              CFX_Matrix* matrix) {
+  if (!path)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      FX_BOOL result = _renderDevice->SetClip_PathFill(
+          path->GetPathData(), (CFX_Matrix*)matrix, fillMode);
+      if (!result)
+        return FX_ERR_Indefinite;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::DrawImage(CFX_DIBSource* source,
+                               const CFX_PointF& point,
+                               CFX_Matrix* matrix) {
+  if (!source)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceDrawImage(source, point, matrix);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::StretchImage(CFX_DIBSource* source,
+                                  const CFX_RectF& rect,
+                                  CFX_Matrix* matrix) {
+  if (!source)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceStretchImage(source, rect, matrix);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::ConcatMatrix(const CFX_Matrix* matrix) {
+  if (!matrix)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._CTM.Concat(*matrix);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+CFX_Matrix* CFX_Graphics::GetMatrix() {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return NULL;
+      return &_info._CTM;
+    }
+    default: { return NULL; }
+  }
+}
+FX_ERR CFX_Graphics::GetClipRect(CFX_RectF& rect) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      FX_RECT r = _renderDevice->GetClipBox();
+      rect.left = (FX_FLOAT)r.left;
+      rect.top = (FX_FLOAT)r.top;
+      rect.width = (FX_FLOAT)r.Width();
+      rect.height = (FX_FLOAT)r.Height();
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetClipRect(const CFX_RectF& rect) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      if (!_renderDevice->SetClip_Rect(
+              FX_RECT(FXSYS_round(rect.left), FXSYS_round(rect.top),
+                      FXSYS_round(rect.right()), FXSYS_round(rect.bottom())))) {
+        return FX_ERR_Method_Not_Supported;
+      }
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::ClearClip() {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetFont(CFX_Font* font) {
+  if (!font)
+    return FX_ERR_Parameter_Invalid;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._font = font;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetFontSize(const FX_FLOAT size) {
+  FX_FLOAT fontSize = size <= 0 ? 1.0f : size;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._fontSize = fontSize;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetFontHScale(const FX_FLOAT scale) {
+  FX_FLOAT fontHScale = scale <= 0 ? 1.0f : scale;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._fontHScale = fontHScale;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetCharSpacing(const FX_FLOAT spacing) {
+  FX_FLOAT fontSpacing = spacing < 0 ? 0 : spacing;
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      _info._fontSpacing = fontSpacing;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::SetTextDrawingMode(const int32_t mode) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::ShowText(const CFX_PointF& point,
+                              const CFX_WideString& text,
+                              CFX_Matrix* matrix) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      return RenderDeviceShowText(point, text, matrix);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::CalcTextRect(CFX_RectF& rect,
+                                  const CFX_WideString& text,
+                                  FX_BOOL isMultiline,
+                                  CFX_Matrix* matrix) {
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      int32_t length = text.GetLength();
+      FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length);
+      FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length);
+      CalcTextInfo(text, charCodes, charPos, rect);
+      FX_Free(charPos);
+      FX_Free(charCodes);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics,
+                              const CFX_Matrix* matrix) {
+  if (!graphics)
+    return FX_ERR_Parameter_Invalid;
+  CFX_Matrix m;
+  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+        _info._CTM.f);
+  if (matrix) {
+    m.Concat(*matrix);
+  }
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      {
+        if (!graphics->_renderDevice)
+          return FX_ERR_Parameter_Invalid;
+        CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap();
+        FX_BOOL result = _renderDevice->SetDIBits(bitmap, 0, 0);
+        if (!result)
+          return FX_ERR_Method_Not_Supported;
+      }
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics,
+                              FX_FLOAT srcLeft,
+                              FX_FLOAT srcTop,
+                              const CFX_RectF& dstRect,
+                              const CFX_Matrix* matrix) {
+  if (!graphics)
+    return FX_ERR_Parameter_Invalid;
+  CFX_Matrix m;
+  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+        _info._CTM.f);
+  if (matrix) {
+    m.Concat(*matrix);
+  }
+  switch (_type) {
+    case FX_CONTEXT_Device: {
+      if (!_renderDevice)
+        return FX_ERR_Property_Invalid;
+      {
+        if (!graphics->_renderDevice)
+          return FX_ERR_Parameter_Invalid;
+        CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap();
+        CFX_DIBitmap bmp;
+        FX_BOOL result =
+            bmp.Create((int32_t)dstRect.width, (int32_t)dstRect.height,
+                       bitmap->GetFormat());
+        if (!result)
+          return FX_ERR_Intermediate_Value_Invalid;
+        result = graphics->_renderDevice->GetDIBits(&bmp, (int32_t)srcLeft,
+                                                    (int32_t)srcTop);
+        if (!result)
+          return FX_ERR_Method_Not_Supported;
+        result = _renderDevice->SetDIBits(&bmp, (int32_t)dstRect.left,
+                                          (int32_t)dstRect.top);
+        if (!result)
+          return FX_ERR_Method_Not_Supported;
+        return FX_ERR_Succeeded;
+      }
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+CFX_RenderDevice* CFX_Graphics::GetRenderDevice() {
+  return _renderDevice;
+}
+FX_ERR CFX_Graphics::InverseRect(const CFX_RectF& rect) {
+  if (!_renderDevice)
+    return FX_ERR_Property_Invalid;
+  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
+  if (!bitmap)
+    return FX_ERR_Property_Invalid;
+  CFX_RectF temp(rect);
+  _info._CTM.TransformRect(temp);
+  CFX_RectF r;
+  r.Set(0, 0, (FX_FLOAT)bitmap->GetWidth(), (FX_FLOAT)bitmap->GetWidth());
+  r.Intersect(temp);
+  if (r.IsEmpty()) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  FX_ARGB* pBuf =
+      (FX_ARGB*)(bitmap->GetBuffer() + int32_t(r.top) * bitmap->GetPitch());
+  int32_t bottom = (int32_t)r.bottom();
+  int32_t right = (int32_t)r.right();
+  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
+    FX_ARGB* pLine = pBuf + (int32_t)r.left;
+    for (int32_t j = (int32_t)r.left; j < right; j++) {
+      FX_ARGB c = *pLine;
+      *pLine++ = (c & 0xFF000000) | (0xFFFFFF - (c & 0x00FFFFFF));
+    }
+    pBuf = (FX_ARGB*)((uint8_t*)pBuf + bitmap->GetPitch());
+  }
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::XorDIBitmap(const CFX_DIBitmap* srcBitmap,
+                                 const CFX_RectF& rect) {
+  if (!_renderDevice)
+    return FX_ERR_Property_Invalid;
+  CFX_DIBitmap* dst = _renderDevice->GetBitmap();
+  if (!dst)
+    return FX_ERR_Property_Invalid;
+  CFX_RectF temp(rect);
+  _info._CTM.TransformRect(temp);
+  CFX_RectF r;
+  r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth());
+  r.Intersect(temp);
+  if (r.IsEmpty()) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() +
+                                int32_t(r.top) * srcBitmap->GetPitch());
+  FX_ARGB* pDstBuf =
+      (FX_ARGB*)(dst->GetBuffer() + int32_t(r.top) * dst->GetPitch());
+  int32_t bottom = (int32_t)r.bottom();
+  int32_t right = (int32_t)r.right();
+  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
+    FX_ARGB* pSrcLine = pSrcBuf + (int32_t)r.left;
+    FX_ARGB* pDstLine = pDstBuf + (int32_t)r.left;
+    for (int32_t j = (int32_t)r.left; j < right; j++) {
+      FX_ARGB c = *pDstLine;
+      *pDstLine++ =
+          ArgbEncode(FXARGB_A(c), (c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF));
+      pSrcLine++;
+    }
+    pSrcBuf = (FX_ARGB*)((uint8_t*)pSrcBuf + srcBitmap->GetPitch());
+    pDstBuf = (FX_ARGB*)((uint8_t*)pDstBuf + dst->GetPitch());
+  }
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::EqvDIBitmap(const CFX_DIBitmap* srcBitmap,
+                                 const CFX_RectF& rect) {
+  if (!_renderDevice)
+    return FX_ERR_Property_Invalid;
+  CFX_DIBitmap* dst = _renderDevice->GetBitmap();
+  if (!dst)
+    return FX_ERR_Property_Invalid;
+  CFX_RectF temp(rect);
+  _info._CTM.TransformRect(temp);
+  CFX_RectF r;
+  r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth());
+  r.Intersect(temp);
+  if (r.IsEmpty()) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() +
+                                int32_t(r.top) * srcBitmap->GetPitch());
+  FX_ARGB* pDstBuf =
+      (FX_ARGB*)(dst->GetBuffer() + int32_t(r.top) * dst->GetPitch());
+  int32_t bottom = (int32_t)r.bottom();
+  int32_t right = (int32_t)r.right();
+  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
+    FX_ARGB* pSrcLine = pSrcBuf + (int32_t)r.left;
+    FX_ARGB* pDstLine = pDstBuf + (int32_t)r.left;
+    for (int32_t j = (int32_t)r.left; j < right; j++) {
+      FX_ARGB c = *pDstLine;
+      *pDstLine++ =
+          ArgbEncode(FXARGB_A(c), ~((c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF)));
+      pSrcLine++;
+    }
+    pSrcBuf = (FX_ARGB*)((uint8_t*)pSrcBuf + srcBitmap->GetPitch());
+    pDstBuf = (FX_ARGB*)((uint8_t*)pDstBuf + dst->GetPitch());
+  }
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) {
+  switch (dashStyle) {
+    case FX_DASHSTYLE_Solid: {
+      _info._graphState.SetDashCount(0);
+      return FX_ERR_Succeeded;
+    }
+    case FX_DASHSTYLE_Dash: {
+      FX_FLOAT dashArray[] = {3, 1};
+      SetLineDash(0, dashArray, 2);
+      return FX_ERR_Succeeded;
+    }
+    case FX_DASHSTYLE_Dot: {
+      FX_FLOAT dashArray[] = {1, 1};
+      SetLineDash(0, dashArray, 2);
+      return FX_ERR_Succeeded;
+    }
+    case FX_DASHSTYLE_DashDot: {
+      FX_FLOAT dashArray[] = {3, 1, 1, 1};
+      SetLineDash(0, dashArray, 4);
+      return FX_ERR_Succeeded;
+    }
+    case FX_DASHSTYLE_DashDotDot: {
+      FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1};
+      SetLineDash(0, dashArray, 6);
+      return FX_ERR_Succeeded;
+    }
+    default: { return FX_ERR_Parameter_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::RenderDeviceStrokePath(CFX_Path* path,
+                                            CFX_Matrix* matrix) {
+  if (!_info._strokeColor)
+    return FX_ERR_Property_Invalid;
+  CFX_Matrix m;
+  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+        _info._CTM.f);
+  if (matrix) {
+    m.Concat(*matrix);
+  }
+  switch (_info._strokeColor->_type) {
+    case FX_COLOR_Solid: {
+      FX_BOOL result = _renderDevice->DrawPath(
+          path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState, 0x0,
+          _info._strokeColor->_argb, 0);
+      if (!result)
+        return FX_ERR_Indefinite;
+      return FX_ERR_Succeeded;
+    }
+    case FX_COLOR_Pattern: {
+      return StrokePathWithPattern(path, &m);
+    }
+    case FX_COLOR_Shading: {
+      return StrokePathWithShading(path, &m);
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::RenderDeviceFillPath(CFX_Path* path,
+                                          FX_FillMode fillMode,
+                                          CFX_Matrix* matrix) {
+  if (!_info._fillColor)
+    return FX_ERR_Property_Invalid;
+  CFX_Matrix m;
+  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+        _info._CTM.f);
+  if (matrix) {
+    m.Concat(*matrix);
+  }
+  switch (_info._fillColor->_type) {
+    case FX_COLOR_Solid: {
+      FX_BOOL result = _renderDevice->DrawPath(
+          path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState,
+          _info._fillColor->_argb, 0x0, fillMode);
+      if (!result)
+        return FX_ERR_Indefinite;
+      return FX_ERR_Succeeded;
+    }
+    case FX_COLOR_Pattern: {
+      { return FillPathWithPattern(path, fillMode, &m); }
+    }
+    case FX_COLOR_Shading: {
+      { return FillPathWithShading(path, fillMode, &m); }
+    }
+    default: { return FX_ERR_Property_Invalid; }
+  }
+}
+FX_ERR CFX_Graphics::RenderDeviceDrawImage(CFX_DIBSource* source,
+                                           const CFX_PointF& point,
+                                           CFX_Matrix* matrix) {
+  CFX_Matrix m1;
+  m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+         _info._CTM.f);
+  if (matrix) {
+    m1.Concat(*matrix);
+  }
+  CFX_Matrix m2;
+  m2.Set((FX_FLOAT)source->GetWidth(), 0.0, 0.0, (FX_FLOAT)source->GetHeight(),
+         point.x, point.y);
+  m2.Concat(m1);
+  int32_t left, top;
+  CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE);
+  CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m2, left, top);
+  CFX_RectF r;
+  GetClipRect(r);
+  FX_ERR result = FX_ERR_Indefinite;
+  {
+    CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
+    CFX_DIBitmap bmp;
+    bmp.Create(bitmap->GetWidth(), bitmap->GetHeight(), FXDIB_Argb);
+    _renderDevice->GetDIBits(&bmp, 0, 0);
+    bmp.TransferBitmap(FXSYS_round(r.left), FXSYS_round(r.top),
+                       FXSYS_round(r.Width()), FXSYS_round(r.Height()), bmp2,
+                       FXSYS_round(r.left - left), FXSYS_round(r.top - top));
+    _renderDevice->SetDIBits(&bmp, 0, 0);
+    result = FX_ERR_Succeeded;
+  }
+  if (bmp2) {
+    delete bmp2;
+    bmp2 = NULL;
+  }
+  if (bmp1) {
+    delete bmp1;
+    bmp1 = NULL;
+  }
+  return result;
+}
+FX_ERR CFX_Graphics::RenderDeviceStretchImage(CFX_DIBSource* source,
+                                              const CFX_RectF& rect,
+                                              CFX_Matrix* matrix) {
+  CFX_Matrix m1;
+  m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+         _info._CTM.f);
+  if (matrix) {
+    m1.Concat(*matrix);
+  }
+  CFX_DIBitmap* bmp1 =
+      source->StretchTo((int32_t)rect.Width(), (int32_t)rect.Height());
+  CFX_Matrix m2;
+  m2.Set(rect.Width(), 0.0, 0.0, rect.Height(), rect.left, rect.top);
+  m2.Concat(m1);
+  int32_t left, top;
+  CFX_DIBitmap* bmp2 = bmp1->FlipImage(FALSE, TRUE);
+  CFX_DIBitmap* bmp3 = bmp2->TransformTo((CFX_Matrix*)&m2, left, top);
+  CFX_RectF r;
+  GetClipRect(r);
+  FX_ERR result = FX_ERR_Indefinite;
+  {
+    CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
+    bitmap->CompositeBitmap(FXSYS_round(r.left), FXSYS_round(r.top),
+                            FXSYS_round(r.Width()), FXSYS_round(r.Height()),
+                            bmp3, FXSYS_round(r.left - left),
+                            FXSYS_round(r.top - top));
+    result = FX_ERR_Succeeded;
+  }
+  if (bmp3) {
+    delete bmp3;
+    bmp3 = NULL;
+  }
+  if (bmp2) {
+    delete bmp2;
+    bmp2 = NULL;
+  }
+  if (bmp1) {
+    delete bmp1;
+    bmp1 = NULL;
+  }
+  return result;
+}
+FX_ERR CFX_Graphics::RenderDeviceShowText(const CFX_PointF& point,
+                                          const CFX_WideString& text,
+                                          CFX_Matrix* matrix) {
+  int32_t length = text.GetLength();
+  FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length);
+  FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length);
+  CFX_RectF rect;
+  rect.Set(point.x, point.y, 0, 0);
+  CalcTextInfo(text, charCodes, charPos, rect);
+  CFX_Matrix m;
+  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
+        _info._CTM.f);
+  m.Translate(0, _info._fontSize * _info._fontHScale);
+  if (matrix) {
+    m.Concat(*matrix);
+  }
+  FX_BOOL result = _renderDevice->DrawNormalText(
+      length, charPos, _info._font, CFX_GEModule::Get()->GetFontCache(),
+      -_info._fontSize * _info._fontHScale, (CFX_Matrix*)&m,
+      _info._fillColor->_argb, FXTEXT_CLEARTYPE);
+  if (!result)
+    return FX_ERR_Indefinite;
+  FX_Free(charPos);
+  FX_Free(charCodes);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix) {
+  return FX_ERR_Method_Not_Supported;
+}
+FX_ERR CFX_Graphics::StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix) {
+  return FX_ERR_Method_Not_Supported;
+}
+FX_ERR CFX_Graphics::FillPathWithPattern(CFX_Path* path,
+                                         FX_FillMode fillMode,
+                                         CFX_Matrix* matrix) {
+  CFX_Pattern* pattern = _info._fillColor->_pattern;
+  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
+  int32_t width = bitmap->GetWidth();
+  int32_t height = bitmap->GetHeight();
+  CFX_DIBitmap bmp;
+  bmp.Create(width, height, FXDIB_Argb);
+  _renderDevice->GetDIBits(&bmp, 0, 0);
+  switch (pattern->_type) {
+    case FX_PATTERN_Bitmap: {
+      int32_t xStep = FXSYS_round(pattern->_x1Step);
+      int32_t yStep = FXSYS_round(pattern->_y1Step);
+      int32_t xCount = width / xStep + 1;
+      int32_t yCount = height / yStep + 1;
+      for (int32_t i = 0; i <= yCount; i++) {
+        for (int32_t j = 0; j <= xCount; j++) {
+          bmp.TransferBitmap(j * xStep, i * yStep, xStep, yStep,
+                             pattern->_bitmap, 0, 0);
+        }
+      }
+      break;
+    }
+    case FX_PATTERN_Hatch: {
+      FX_HatchStyle hatchStyle = _info._fillColor->_pattern->_hatchStyle;
+      if (hatchStyle < FX_HATCHSTYLE_Horizontal ||
+          hatchStyle > FX_HATCHSTYLE_SolidDiamond) {
+        return FX_ERR_Intermediate_Value_Invalid;
+      }
+      const FX_HATCHDATA& data = hatchBitmapData[hatchStyle];
+      CFX_DIBitmap mask;
+      mask.Create(data.width, data.height, FXDIB_1bppMask);
+      FXSYS_memcpy(mask.GetBuffer(), data.maskBits,
+                   mask.GetPitch() * data.height);
+      CFX_FloatRect rectf = path->GetPathData()->GetBoundingBox();
+      if (matrix) {
+        rectf.Transform((const CFX_Matrix*)matrix);
+      }
+      FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
+                   FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
+      CFX_FxgeDevice device;
+      device.Attach(&bmp);
+      device.FillRect(&rect, _info._fillColor->_pattern->_backArgb);
+      for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight()) {
+        for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) {
+          device.SetBitMask(&mask, i, j, _info._fillColor->_pattern->_foreArgb);
+        }
+      }
+      break;
+    }
+  }
+  _renderDevice->SaveState();
+  _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix,
+                                  fillMode);
+  SetDIBitsWithMatrix(&bmp, &pattern->_matrix);
+  _renderDevice->RestoreState();
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path,
+                                         FX_FillMode fillMode,
+                                         CFX_Matrix* matrix) {
+  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
+  int32_t width = bitmap->GetWidth();
+  int32_t height = bitmap->GetHeight();
+  FX_FLOAT start_x = _info._fillColor->_shading->_beginPoint.x;
+  FX_FLOAT start_y = _info._fillColor->_shading->_beginPoint.y;
+  FX_FLOAT end_x = _info._fillColor->_shading->_endPoint.x;
+  FX_FLOAT end_y = _info._fillColor->_shading->_endPoint.y;
+  CFX_DIBitmap bmp;
+  bmp.Create(width, height, FXDIB_Argb);
+  _renderDevice->GetDIBits(&bmp, 0, 0);
+  int32_t pitch = bmp.GetPitch();
+  FX_BOOL result = FALSE;
+  switch (_info._fillColor->_shading->_type) {
+    case FX_SHADING_Axial: {
+      FX_FLOAT x_span = end_x - start_x;
+      FX_FLOAT y_span = end_y - start_y;
+      FX_FLOAT axis_len_square = (x_span * x_span) + (y_span * y_span);
+      for (int32_t row = 0; row < height; row++) {
+        FX_DWORD* dib_buf = (FX_DWORD*)(bmp.GetBuffer() + row * pitch);
+        for (int32_t column = 0; column < width; column++) {
+          FX_FLOAT x = (FX_FLOAT)(column);
+          FX_FLOAT y = (FX_FLOAT)(row);
+          FX_FLOAT scale =
+              (((x - start_x) * x_span) + ((y - start_y) * y_span)) /
+              axis_len_square;
+          if (scale < 0) {
+            if (!_info._fillColor->_shading->_isExtendedBegin) {
+              continue;
+            }
+            scale = 0;
+          } else if (scale > 1.0f) {
+            if (!_info._fillColor->_shading->_isExtendedEnd) {
+              continue;
+            }
+            scale = 1.0f;
+          }
+          int32_t index = (int32_t)(scale * (FX_SHADING_Steps - 1));
+          dib_buf[column] = _info._fillColor->_shading->_argbArray[index];
+        }
+      }
+      result = TRUE;
+      break;
+    }
+    case FX_SHADING_Radial: {
+      FX_FLOAT start_r = _info._fillColor->_shading->_beginRadius;
+      FX_FLOAT end_r = _info._fillColor->_shading->_endRadius;
+      FX_FLOAT a = ((start_x - end_x) * (start_x - end_x)) +
+                   ((start_y - end_y) * (start_y - end_y)) -
+                   ((start_r - end_r) * (start_r - end_r));
+      for (int32_t row = 0; row < height; row++) {
+        FX_DWORD* dib_buf = (FX_DWORD*)(bmp.GetBuffer() + row * pitch);
+        for (int32_t column = 0; column < width; column++) {
+          FX_FLOAT x = (FX_FLOAT)(column);
+          FX_FLOAT y = (FX_FLOAT)(row);
+          FX_FLOAT b = -2 * (((x - start_x) * (end_x - start_x)) +
+                             ((y - start_y) * (end_y - start_y)) +
+                             (start_r * (end_r - start_r)));
+          FX_FLOAT c = ((x - start_x) * (x - start_x)) +
+                       ((y - start_y) * (y - start_y)) - (start_r * start_r);
+          FX_FLOAT s;
+          if (a == 0) {
+            s = -c / b;
+          } else {
+            FX_FLOAT b2_4ac = (b * b) - 4 * (a * c);
+            if (b2_4ac < 0) {
+              continue;
+            }
+            FX_FLOAT root = (FXSYS_sqrt(b2_4ac));
+            FX_FLOAT s1, s2;
+            if (a > 0) {
+              s1 = (-b - root) / (2 * a);
+              s2 = (-b + root) / (2 * a);
+            } else {
+              s2 = (-b - root) / (2 * a);
+              s1 = (-b + root) / (2 * a);
+            }
+            if (s2 <= 1.0f || _info._fillColor->_shading->_isExtendedEnd) {
+              s = (s2);
+            } else {
+              s = (s1);
+            }
+            if ((start_r) + s * (end_r - start_r) < 0) {
+              continue;
+            }
+          }
+          if (s < 0) {
+            if (!_info._fillColor->_shading->_isExtendedBegin) {
+              continue;
+            }
+            s = 0;
+          }
+          if (s > 1.0f) {
+            if (!_info._fillColor->_shading->_isExtendedEnd) {
+              continue;
+            }
+            s = 1.0f;
+          }
+          int index = (int32_t)(s * (FX_SHADING_Steps - 1));
+          dib_buf[column] = _info._fillColor->_shading->_argbArray[index];
+        }
+      }
+      result = TRUE;
+      break;
+    }
+    default: { result = FALSE; }
+  }
+  if (result) {
+    _renderDevice->SaveState();
+    _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix,
+                                    fillMode);
+    SetDIBitsWithMatrix(&bmp, matrix);
+    _renderDevice->RestoreState();
+  }
+  return result;
+}
+FX_ERR CFX_Graphics::SetDIBitsWithMatrix(CFX_DIBSource* source,
+                                         CFX_Matrix* matrix) {
+  if (matrix->IsIdentity()) {
+    _renderDevice->SetDIBits(source, 0, 0);
+  } else {
+    CFX_Matrix m;
+    m.Set((FX_FLOAT)source->GetWidth(), 0, 0, (FX_FLOAT)source->GetHeight(), 0,
+          0);
+    m.Concat(*matrix);
+    int32_t left, top;
+    CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE);
+    CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m, left, top);
+    _renderDevice->SetDIBits(bmp2, left, top);
+    if (bmp2) {
+      delete bmp2;
+      bmp2 = NULL;
+    }
+    if (bmp1) {
+      delete bmp1;
+      bmp1 = NULL;
+    }
+  }
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Graphics::CalcTextInfo(const CFX_WideString& text,
+                                  FX_DWORD* charCodes,
+                                  FXTEXT_CHARPOS* charPos,
+                                  CFX_RectF& rect) {
+  std::unique_ptr<CFX_UnicodeEncoding> encoding(
+      new CFX_UnicodeEncoding(_info._font));
+  int32_t length = text.GetLength();
+  FX_FLOAT penX = (FX_FLOAT)rect.left;
+  FX_FLOAT penY = (FX_FLOAT)rect.top;
+  FX_FLOAT left = (FX_FLOAT)(0);
+  FX_FLOAT top = (FX_FLOAT)(0);
+  charCodes[0] = text.GetAt(0);
+  charPos[0].m_OriginX = penX + left;
+  charPos[0].m_OriginY = penY + top;
+  charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[0]);
+  charPos[0].m_FontCharWidth = FXSYS_round(
+      _info._font->GetGlyphWidth(charPos[0].m_GlyphIndex) * _info._fontHScale);
+  charPos[0].m_bGlyphAdjust = TRUE;
+  charPos[0].m_AdjustMatrix[0] = -1;
+  charPos[0].m_AdjustMatrix[1] = 0;
+  charPos[0].m_AdjustMatrix[2] = 0;
+  charPos[0].m_AdjustMatrix[3] = 1;
+  penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * _info._fontSize / 1000 +
+          _info._fontSpacing;
+  for (int32_t i = 1; i < length; i++) {
+    charCodes[i] = text.GetAt(i);
+    charPos[i].m_OriginX = penX + left;
+    charPos[i].m_OriginY = penY + top;
+    charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[i]);
+    charPos[i].m_FontCharWidth =
+        FXSYS_round(_info._font->GetGlyphWidth(charPos[i].m_GlyphIndex) *
+                    _info._fontHScale);
+    charPos[i].m_bGlyphAdjust = TRUE;
+    charPos[i].m_AdjustMatrix[0] = -1;
+    charPos[i].m_AdjustMatrix[1] = 0;
+    charPos[i].m_AdjustMatrix[2] = 0;
+    charPos[i].m_AdjustMatrix[3] = 1;
+    penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * _info._fontSize / 1000 +
+            _info._fontSpacing;
+  }
+  rect.width = (FX_FLOAT)penX - rect.left;
+  rect.height = rect.top + _info._fontSize * _info._fontHScale - rect.top;
+  return FX_ERR_Succeeded;
+}
+CAGG_Graphics::CAGG_Graphics() {
+  _owner = NULL;
+}
+FX_ERR CAGG_Graphics::Create(CFX_Graphics* owner,
+                             int32_t width,
+                             int32_t height,
+                             FXDIB_Format format) {
+  if (owner->_renderDevice) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  if (_owner) {
+    return FX_ERR_Property_Invalid;
+  }
+  CFX_FxgeDevice* device = new CFX_FxgeDevice;
+  device->Create(width, height, format);
+  _owner = owner;
+  _owner->_renderDevice = device;
+  _owner->_renderDevice->GetBitmap()->Clear(0xFFFFFFFF);
+  return FX_ERR_Succeeded;
+}
+CAGG_Graphics::~CAGG_Graphics() {
+  if (_owner->_renderDevice) {
+    delete (CFX_FxgeDevice*)_owner->_renderDevice;
+  }
+  _owner = NULL;
+}
+CFX_Path::CFX_Path() {
+  _generator = NULL;
+}
+FX_ERR CFX_Path::Create() {
+  if (_generator) {
+    return FX_ERR_Property_Invalid;
+  }
+  _generator = new CFX_PathGenerator;
+  _generator->Create();
+  return FX_ERR_Succeeded;
+}
+CFX_Path::~CFX_Path() {
+  if (_generator) {
+    delete _generator;
+    _generator = NULL;
+  }
+}
+FX_ERR CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->MoveTo(x, y);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->LineTo(x, y);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::BezierTo(FX_FLOAT ctrlX1,
+                          FX_FLOAT ctrlY1,
+                          FX_FLOAT ctrlX2,
+                          FX_FLOAT ctrlY2,
+                          FX_FLOAT toX,
+                          FX_FLOAT toY) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::ArcTo(FX_FLOAT left,
+                       FX_FLOAT top,
+                       FX_FLOAT width,
+                       FX_FLOAT height,
+                       FX_FLOAT startAngle,
+                       FX_FLOAT sweepAngle) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2,
+                    startAngle, sweepAngle);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::Close() {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->Close();
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddLine(x1, y1, x2, y2);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddBezier(FX_FLOAT startX,
+                           FX_FLOAT startY,
+                           FX_FLOAT ctrlX1,
+                           FX_FLOAT ctrlY1,
+                           FX_FLOAT ctrlX2,
+                           FX_FLOAT ctrlY2,
+                           FX_FLOAT endX,
+                           FX_FLOAT endY) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX,
+                        endY);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddRectangle(FX_FLOAT left,
+                              FX_FLOAT top,
+                              FX_FLOAT width,
+                              FX_FLOAT height) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddRectangle(left, top, left + width, top + height);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddEllipse(FX_FLOAT left,
+                            FX_FLOAT top,
+                            FX_FLOAT width,
+                            FX_FLOAT height) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddEllipse(left + width / 2, top + height / 2, width / 2,
+                         height / 2);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddEllipse(const CFX_RectF& rect) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddEllipse(rect.left + rect.Width() / 2,
+                         rect.top + rect.Height() / 2, rect.Width() / 2,
+                         rect.Height() / 2);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddArc(FX_FLOAT left,
+                        FX_FLOAT top,
+                        FX_FLOAT width,
+                        FX_FLOAT height,
+                        FX_FLOAT startAngle,
+                        FX_FLOAT sweepAngle) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2,
+                     startAngle, sweepAngle);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddPie(FX_FLOAT left,
+                        FX_FLOAT top,
+                        FX_FLOAT width,
+                        FX_FLOAT height,
+                        FX_FLOAT startAngle,
+                        FX_FLOAT sweepAngle) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2,
+                     startAngle, sweepAngle);
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::AddSubpath(CFX_Path* path) {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->AddPathData(path->GetPathData());
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Path::Clear() {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  _generator->GetPathData()->SetPointCount(0);
+  return FX_ERR_Succeeded;
+}
+FX_BOOL CFX_Path::IsEmpty() {
+  if (!_generator)
+    return FX_ERR_Property_Invalid;
+  if (_generator->GetPathData()->GetPointCount() == 0) {
+    return TRUE;
+  }
+  return FALSE;
+}
+CFX_PathData* CFX_Path::GetPathData() {
+  if (!_generator)
+    return NULL;
+  return _generator->GetPathData();
+}
+CFX_Color::CFX_Color() {
+  _type = FX_COLOR_None;
+}
+CFX_Color::CFX_Color(const FX_ARGB argb) {
+  _type = FX_COLOR_None;
+  Set(argb);
+}
+CFX_Color::CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb) {
+  _type = FX_COLOR_None;
+  Set(pattern, argb);
+}
+CFX_Color::CFX_Color(CFX_Shading* shading) {
+  _type = FX_COLOR_None;
+  Set(shading);
+}
+CFX_Color::~CFX_Color() {
+  _type = FX_COLOR_None;
+}
+FX_ERR CFX_Color::Set(const FX_ARGB argb) {
+  _type = FX_COLOR_Solid;
+  _argb = argb;
+  _pattern = NULL;
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Color::Set(CFX_Pattern* pattern, const FX_ARGB argb) {
+  if (!pattern)
+    return FX_ERR_Parameter_Invalid;
+  _type = FX_COLOR_Pattern;
+  _argb = argb;
+  _pattern = pattern;
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Color::Set(CFX_Shading* shading) {
+  if (!shading)
+    return FX_ERR_Parameter_Invalid;
+  _type = FX_COLOR_Shading;
+  _shading = shading;
+  return FX_ERR_Succeeded;
+}
+CFX_Pattern::CFX_Pattern() {
+  _type = FX_PATTERN_None;
+  _matrix.SetIdentity();
+}
+FX_ERR CFX_Pattern::Create(CFX_DIBitmap* bitmap,
+                           const FX_FLOAT xStep,
+                           const FX_FLOAT yStep,
+                           CFX_Matrix* matrix) {
+  if (!bitmap)
+    return FX_ERR_Parameter_Invalid;
+  if (_type != FX_PATTERN_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_PATTERN_Bitmap;
+  _bitmap = bitmap;
+  _x1Step = xStep;
+  _y1Step = yStep;
+  if (matrix) {
+    _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
+                matrix->f);
+  }
+  return FX_ERR_Succeeded;
+}
+FX_ERR CFX_Pattern::Create(FX_HatchStyle hatchStyle,
+                           const FX_ARGB foreArgb,
+                           const FX_ARGB backArgb,
+                           CFX_Matrix* matrix) {
+  if (hatchStyle < FX_HATCHSTYLE_Horizontal ||
+      hatchStyle > FX_HATCHSTYLE_SolidDiamond) {
+    return FX_ERR_Parameter_Invalid;
+  }
+  if (_type != FX_PATTERN_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_PATTERN_Hatch;
+  _hatchStyle = hatchStyle;
+  _foreArgb = foreArgb;
+  _backArgb = backArgb;
+  if (matrix) {
+    _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
+                matrix->f);
+  }
+  return FX_ERR_Succeeded;
+}
+CFX_Pattern::~CFX_Pattern() {
+  _type = FX_PATTERN_None;
+}
+CFX_Shading::CFX_Shading() {
+  _type = FX_SHADING_None;
+}
+FX_ERR CFX_Shading::CreateAxial(const CFX_PointF& beginPoint,
+                                const CFX_PointF& endPoint,
+                                FX_BOOL isExtendedBegin,
+                                FX_BOOL isExtendedEnd,
+                                const FX_ARGB beginArgb,
+                                const FX_ARGB endArgb) {
+  if (_type != FX_SHADING_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_SHADING_Axial;
+  _beginPoint = beginPoint;
+  _endPoint = endPoint;
+  _isExtendedBegin = isExtendedBegin;
+  _isExtendedEnd = isExtendedEnd;
+  _beginArgb = beginArgb;
+  _endArgb = endArgb;
+  return InitArgbArray();
+}
+FX_ERR CFX_Shading::CreateRadial(const CFX_PointF& beginPoint,
+                                 const CFX_PointF& endPoint,
+                                 const FX_FLOAT beginRadius,
+                                 const FX_FLOAT endRadius,
+                                 FX_BOOL isExtendedBegin,
+                                 FX_BOOL isExtendedEnd,
+                                 const FX_ARGB beginArgb,
+                                 const FX_ARGB endArgb) {
+  if (_type != FX_SHADING_None) {
+    return FX_ERR_Property_Invalid;
+  }
+  _type = FX_SHADING_Radial;
+  _beginPoint = beginPoint;
+  _endPoint = endPoint;
+  _beginRadius = beginRadius;
+  _endRadius = endRadius;
+  _isExtendedBegin = isExtendedBegin;
+  _isExtendedEnd = isExtendedEnd;
+  _beginArgb = beginArgb;
+  _endArgb = endArgb;
+  return InitArgbArray();
+}
+CFX_Shading::~CFX_Shading() {
+  _type = FX_SHADING_None;
+}
+FX_ERR CFX_Shading::InitArgbArray() {
+  int32_t a1, r1, g1, b1;
+  ArgbDecode(_beginArgb, a1, r1, g1, b1);
+  int32_t a2, r2, g2, b2;
+  ArgbDecode(_endArgb, a2, r2, g2, b2);
+  FX_FLOAT f = (FX_FLOAT)(FX_SHADING_Steps - 1);
+  FX_FLOAT aScale = (FX_FLOAT)(1.0 * (a2 - a1) / f);
+  FX_FLOAT rScale = (FX_FLOAT)(1.0 * (r2 - r1) / f);
+  FX_FLOAT gScale = (FX_FLOAT)(1.0 * (g2 - g1) / f);
+  FX_FLOAT bScale = (FX_FLOAT)(1.0 * (b2 - b1) / f);
+  int32_t a3, r3, g3, b3;
+  for (int32_t i = 0; i < FX_SHADING_Steps; i++) {
+    a3 = (int32_t)(i * aScale);
+    r3 = (int32_t)(i * rScale);
+    g3 = (int32_t)(i * gScale);
+    b3 = (int32_t)(i * bScale);
+    _argbArray[i] =
+        FXARGB_TODIB(FXARGB_MAKE((a1 + a3), (r1 + r3), (g1 + g3), (b1 + b3)));
+  }
+  return FX_ERR_Succeeded;
+}
+class CFX_Pause : public IFX_Pause {
+ public:
+  virtual FX_BOOL NeedToPauseNow() { return TRUE; }
+};
diff --git a/xfa/fxgraphics/fx_path_generator.cpp b/xfa/fxgraphics/fx_path_generator.cpp
new file mode 100644
index 0000000..cbe0f29
--- /dev/null
+++ b/xfa/fxgraphics/fx_path_generator.cpp
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxgraphics/fx_path_generator.h"
+
+#include "xfa/fxgraphics/pre.h"
+
+CFX_PathGenerator::CFX_PathGenerator() {
+  m_pPathData = NULL;
+}
+void CFX_PathGenerator::Create() {
+  m_pPathData = new CFX_PathData;
+}
+CFX_PathGenerator::~CFX_PathGenerator() {
+  if (m_pPathData) {
+    delete m_pPathData;
+    m_pPathData = NULL;
+  }
+}
+void CFX_PathGenerator::AddPathData(CFX_PathData* pPathData) {
+  if (pPathData && pPathData->GetPointCount() > 0) {
+    int nCount = pPathData->GetPointCount();
+    FX_PATHPOINT* pPoints = pPathData->GetPoints();
+    AddPathData(pPoints, nCount);
+  }
+}
+void CFX_PathGenerator::AddPathData(FX_PATHPOINT* pPoints, int nCount) {
+  if (pPoints && nCount > 0) {
+    int nOldCount = m_pPathData->GetPointCount();
+    m_pPathData->AddPointCount(nCount);
+    FX_PATHPOINT* pDstPoints = m_pPathData->GetPoints();
+    FXSYS_memcpy(pDstPoints + nOldCount, pPoints,
+                 sizeof(FX_PATHPOINT) * nCount);
+  }
+}
+void CFX_PathGenerator::MoveTo(FX_FLOAT x, FX_FLOAT y) {
+  m_pPathData->AddPointCount(1);
+  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_MOVETO);
+}
+void CFX_PathGenerator::LineTo(FX_FLOAT x, FX_FLOAT y) {
+  m_pPathData->AddPointCount(1);
+  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_LINETO);
+}
+void CFX_PathGenerator::BezierTo(FX_FLOAT ctrl_x1,
+                                 FX_FLOAT ctrl_y1,
+                                 FX_FLOAT ctrl_x2,
+                                 FX_FLOAT ctrl_y2,
+                                 FX_FLOAT to_x,
+                                 FX_FLOAT to_y) {
+  int old_count = m_pPathData->GetPointCount();
+  m_pPathData->AddPointCount(3);
+  m_pPathData->SetPoint(old_count, ctrl_x1, ctrl_y1, FXPT_BEZIERTO);
+  m_pPathData->SetPoint(old_count + 1, ctrl_x2, ctrl_y2, FXPT_BEZIERTO);
+  m_pPathData->SetPoint(old_count + 2, to_x, to_y, FXPT_BEZIERTO);
+}
+void CFX_PathGenerator::Close() {
+  if (m_pPathData->GetPointCount() > 0) {
+    int index = m_pPathData->GetPointCount() - 1;
+    FX_PATHPOINT* pPoints = m_pPathData->GetPoints();
+    pPoints[index].m_Flag |= FXPT_CLOSEFIGURE;
+  }
+}
+void CFX_PathGenerator::AddLine(FX_FLOAT x1,
+                                FX_FLOAT y1,
+                                FX_FLOAT x2,
+                                FX_FLOAT y2) {
+  int old_count = m_pPathData->GetPointCount();
+  m_pPathData->AddPointCount(2);
+  m_pPathData->SetPoint(old_count, x1, y1, FXPT_MOVETO);
+  m_pPathData->SetPoint(old_count + 1, x2, y2, FXPT_LINETO);
+}
+void CFX_PathGenerator::AddBezier(FX_FLOAT start_x,
+                                  FX_FLOAT start_y,
+                                  FX_FLOAT ctrl_x1,
+                                  FX_FLOAT ctrl_y1,
+                                  FX_FLOAT ctrl_x2,
+                                  FX_FLOAT ctrl_y2,
+                                  FX_FLOAT end_x,
+                                  FX_FLOAT end_y) {
+  int old_count = m_pPathData->GetPointCount();
+  m_pPathData->AddPointCount(4);
+  m_pPathData->SetPoint(old_count, start_x, start_y, FXPT_MOVETO);
+  m_pPathData->SetPoint(old_count + 1, ctrl_x1, ctrl_y1, FXPT_BEZIERTO);
+  m_pPathData->SetPoint(old_count + 2, ctrl_x2, ctrl_y2, FXPT_BEZIERTO);
+  m_pPathData->SetPoint(old_count + 3, end_x, end_y, FXPT_BEZIERTO);
+}
+void CFX_PathGenerator::AddRectangle(FX_FLOAT x1,
+                                     FX_FLOAT y1,
+                                     FX_FLOAT x2,
+                                     FX_FLOAT y2) {
+  m_pPathData->AppendRect(x1, y1, x2, y2);
+}
+void CFX_PathGenerator::AddEllipse(FX_FLOAT x,
+                                   FX_FLOAT y,
+                                   FX_FLOAT width,
+                                   FX_FLOAT height) {
+  AddArc(x, y, width, height, 0, FX_PI * 2);
+}
+void CFX_PathGenerator::ArcTo(FX_FLOAT x,
+                              FX_FLOAT y,
+                              FX_FLOAT width,
+                              FX_FLOAT height,
+                              FX_FLOAT start_angle,
+                              FX_FLOAT sweep_angle) {
+  FX_FLOAT x0 = FXSYS_cos(sweep_angle / 2);
+  FX_FLOAT y0 = FXSYS_sin(sweep_angle / 2);
+  FX_FLOAT tx = ((1.0f - x0) * 4) / (3 * 1.0f);
+  FX_FLOAT ty = y0 - ((tx * x0) / y0);
+  FX_FLOAT px[3], py[3];
+  px[0] = x0 + tx;
+  py[0] = -ty;
+  px[1] = x0 + tx;
+  py[1] = ty;
+  FX_FLOAT sn = FXSYS_sin(start_angle + sweep_angle / 2);
+  FX_FLOAT cs = FXSYS_cos(start_angle + sweep_angle / 2);
+  int old_count = m_pPathData->GetPointCount();
+  m_pPathData->AddPointCount(3);
+  FX_FLOAT bezier_x, bezier_y;
+  bezier_x = x + (width * ((px[0] * cs) - (py[0] * sn)));
+  bezier_y = y + (height * ((px[0] * sn) + (py[0] * cs)));
+  m_pPathData->SetPoint(old_count, bezier_x, bezier_y, FXPT_BEZIERTO);
+  bezier_x = x + (width * ((px[1] * cs) - (py[1] * sn)));
+  bezier_y = y + (height * ((px[1] * sn) + (py[1] * cs)));
+  m_pPathData->SetPoint(old_count + 1, bezier_x, bezier_y, FXPT_BEZIERTO);
+  bezier_x = x + (width * FXSYS_cos(start_angle + sweep_angle));
+  bezier_y = y + (height * FXSYS_sin(start_angle + sweep_angle));
+  m_pPathData->SetPoint(old_count + 2, bezier_x, bezier_y, FXPT_BEZIERTO);
+}
+void CFX_PathGenerator::AddArc(FX_FLOAT x,
+                               FX_FLOAT y,
+                               FX_FLOAT width,
+                               FX_FLOAT height,
+                               FX_FLOAT start_angle,
+                               FX_FLOAT sweep_angle) {
+  if (sweep_angle == 0) {
+    return;
+  }
+
+  const FX_FLOAT bezier_arc_angle_epsilon = 0.01f;
+  while (start_angle > FX_PI * 2) {
+    start_angle -= FX_PI * 2;
+  }
+  while (start_angle < 0) {
+    start_angle += FX_PI * 2;
+  }
+  if (sweep_angle >= FX_PI * 2) {
+    sweep_angle = FX_PI * 2;
+  }
+  if (sweep_angle <= -FX_PI * 2) {
+    sweep_angle = -FX_PI * 2;
+  }
+  m_pPathData->AddPointCount(1);
+  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1,
+                        x + (width * FXSYS_cos(start_angle)),
+                        y + (height * FXSYS_sin(start_angle)), FXPT_MOVETO);
+  FX_FLOAT total_sweep = 0, local_sweep = 0, prev_sweep = 0;
+  FX_BOOL done = FALSE;
+  do {
+    if (sweep_angle < 0) {
+      prev_sweep = total_sweep;
+      local_sweep = -FX_PI / 2;
+      total_sweep -= FX_PI / 2;
+      if (total_sweep <= sweep_angle + bezier_arc_angle_epsilon) {
+        local_sweep = sweep_angle - prev_sweep;
+        done = TRUE;
+      }
+    } else {
+      prev_sweep = total_sweep;
+      local_sweep = FX_PI / 2;
+      total_sweep += FX_PI / 2;
+      if (total_sweep >= sweep_angle - bezier_arc_angle_epsilon) {
+        local_sweep = sweep_angle - prev_sweep;
+        done = TRUE;
+      }
+    }
+    ArcTo(x, y, width, height, start_angle, local_sweep);
+    start_angle += local_sweep;
+  } while (!done);
+}
+void CFX_PathGenerator::AddPie(FX_FLOAT x,
+                               FX_FLOAT y,
+                               FX_FLOAT width,
+                               FX_FLOAT height,
+                               FX_FLOAT start_angle,
+                               FX_FLOAT sweep_angle) {
+  if (sweep_angle == 0) {
+    int old_count = m_pPathData->GetPointCount();
+    m_pPathData->AddPointCount(2);
+    m_pPathData->SetPoint(old_count, x, y, FXPT_MOVETO);
+    m_pPathData->SetPoint(old_count + 1, x + (width * FXSYS_cos(start_angle)),
+                          y + (height * FXSYS_sin(start_angle)), FXPT_LINETO);
+    return;
+  }
+  AddArc(x, y, width, height, start_angle, sweep_angle);
+  m_pPathData->AddPointCount(1);
+  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y,
+                        FXPT_LINETO | FXPT_CLOSEFIGURE);
+}
diff --git a/xfa/fxgraphics/fx_path_generator.h b/xfa/fxgraphics/fx_path_generator.h
new file mode 100644
index 0000000..3087a64
--- /dev/null
+++ b/xfa/fxgraphics/fx_path_generator.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXGRAPHICS_FX_PATH_GENERATOR_H_
+#define XFA_FXGRAPHICS_FX_PATH_GENERATOR_H_
+
+#include "core/include/fxge/fx_ge.h"
+
+class CFX_PathGenerator {
+ public:
+  CFX_PathGenerator();
+  void Create();
+  ~CFX_PathGenerator();
+  CFX_PathData* GetPathData() const { return m_pPathData; }
+  void AddPathData(CFX_PathData* path_data);
+  void AddPathData(FX_PATHPOINT* points, int count);
+  void MoveTo(FX_FLOAT x, FX_FLOAT y);
+  void LineTo(FX_FLOAT x, FX_FLOAT y);
+  void BezierTo(FX_FLOAT ctrl_x1,
+                FX_FLOAT ctrl_y1,
+                FX_FLOAT ctrl_x2,
+                FX_FLOAT ctrl_y2,
+                FX_FLOAT to_x,
+                FX_FLOAT to_y);
+  void Close();
+  void ArcTo(FX_FLOAT x,
+             FX_FLOAT y,
+             FX_FLOAT width,
+             FX_FLOAT height,
+             FX_FLOAT start_angle,
+             FX_FLOAT sweep_angle);
+
+  void AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+  void AddBezier(FX_FLOAT start_x,
+                 FX_FLOAT start_y,
+                 FX_FLOAT ctrl_x1,
+                 FX_FLOAT ctrl_y1,
+                 FX_FLOAT ctrl_x2,
+                 FX_FLOAT ctrl_y2,
+                 FX_FLOAT end_x,
+                 FX_FLOAT end_y);
+  void AddRectangle(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+  void AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height);
+  void AddArc(FX_FLOAT x,
+              FX_FLOAT y,
+              FX_FLOAT width,
+              FX_FLOAT height,
+              FX_FLOAT start_angle,
+              FX_FLOAT sweep_angle);
+  void AddPie(FX_FLOAT x,
+              FX_FLOAT y,
+              FX_FLOAT width,
+              FX_FLOAT height,
+              FX_FLOAT start_angle,
+              FX_FLOAT sweep_angle);
+
+ protected:
+  CFX_PathData* m_pPathData;
+};
+
+#endif  // XFA_FXGRAPHICS_FX_PATH_GENERATOR_H_
diff --git a/xfa/fxgraphics/pre.h b/xfa/fxgraphics/pre.h
new file mode 100644
index 0000000..fb0ac55
--- /dev/null
+++ b/xfa/fxgraphics/pre.h
@@ -0,0 +1,586 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXGRAPHICS_PRE_H_
+#define XFA_FXGRAPHICS_PRE_H_
+
+enum {
+  FX_CONTEXT_None = 0,
+  FX_CONTEXT_Device,
+};
+enum { FX_COLOR_None = 0, FX_COLOR_Solid, FX_COLOR_Pattern, FX_COLOR_Shading };
+enum { FX_PATTERN_None = 0, FX_PATTERN_Bitmap, FX_PATTERN_Hatch };
+enum { FX_SHADING_None = 0, FX_SHADING_Axial, FX_SHADING_Radial };
+
+#define FX_HATCHSTYLE_Total 53
+
+struct FX_HATCHDATA {
+  int32_t width;
+  int32_t height;
+  uint8_t maskBits[64];
+};
+typedef FX_HATCHDATA const* FX_LPCHATCHDATA;
+
+static const FX_HATCHDATA hatchBitmapData[FX_HATCHSTYLE_Total] = {
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x15, 0x15, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x7f, 0x7f, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
+         0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,
+         0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
+         0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00,
+         0x83, 0x83, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
+         0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
+         0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,
+         0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00,
+         0xc1, 0xc1, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
+         0xcc, 0xcc, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
+         0x04, 0x04, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
+         0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
+         0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00,
+         0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00,
+         0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,
+         0x8d, 0x8d, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
+         0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+         0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
+         0xc0, 0xc0, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
+         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
+         0x81, 0x81, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x51, 0x51, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00,
+         0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
+         0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
+         0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
+         0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00,
+         0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
+         0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
+         0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,
+         0xf8, 0xf8, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
+         0x88, 0x88, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
+         0x99, 0x99, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+         0x0f, 0x0f, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
+         0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
+         0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
+         0x01, 0x01, 0x00, 0x00,
+     }},
+    {16,
+     16,
+     {
+         0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
+         0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
+         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+         0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+     }},
+};
+#if defined(__WIN32__) || defined(_WIN32)
+#define FX_START_TIMER    \
+  SYSTEMTIME start, stop; \
+  ::GetLocalTime(&start);
+#define FX_STOP_TIMER                                            \
+  ::GetLocalTime(&stop);                                         \
+  WORD wSecond = stop.wSecond - start.wSecond;                   \
+  WORD wMilliseconds = stop.wMilliseconds - start.wMilliseconds; \
+  char buf[256];                                                 \
+  memset(buf, 0, sizeof(buf));                                   \
+  snprintf(buf, sizeof(buf) - 1, "duration is %d millisecond\n", \
+           wSecond * 1000 + wMilliseconds);                      \
+  ::OutputDebugString(buf);
+#elif defined(__linux) || defined(linux)
+#define FX_START_TIMER
+#define FX_STOP_TIMER
+#elif defined(__APPLE__) || defined(__MACOSX__)
+#define FX_START_TIMER        \
+  NSTimeInterval start, stop; \
+  start = [NSDate timeIntervalSinceReferenceDate];
+#define FX_STOP_TIMER                             \
+  stop = [NSDate timeIntervalSinceReferenceDate]; \
+  NSTimeInterval duration = stop - start;         \
+  printf("duration is %f millisecond\n", duration * 1000);
+#else
+#endif
+
+#endif  // XFA_FXGRAPHICS_PRE_H_
diff --git a/xfa/fxjse/class.cpp b/xfa/fxjse/class.cpp
new file mode 100644
index 0000000..e87fbbf
--- /dev/null
+++ b/xfa/fxjse/class.cpp
@@ -0,0 +1,348 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxjse/class.h"
+
+#include "xfa/fxjse/context.h"
+#include "xfa/fxjse/scope_inline.h"
+#include "xfa/fxjse/util_inline.h"
+#include "xfa/fxjse/value.h"
+
+static void FXJSE_V8ConstructorCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info);
+static void FXJSE_V8FunctionCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info);
+static void FXJSE_V8GetterCallback_Wrapper(
+    v8::Local<v8::String> property,
+    const v8::PropertyCallbackInfo<v8::Value>& info);
+static void FXJSE_V8SetterCallback_Wrapper(
+    v8::Local<v8::String> property,
+    v8::Local<v8::Value> value,
+    const v8::PropertyCallbackInfo<void>& info);
+
+void FXJSE_DefineFunctions(FXJSE_HCONTEXT hContext,
+                           const FXJSE_FUNCTION* lpFunctions,
+                           int nNum) {
+  CFXJSE_Context* lpContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  ASSERT(lpContext);
+  CFXJSE_ScopeUtil_IsolateHandleContext scope(lpContext);
+  v8::Isolate* pIsolate = lpContext->GetRuntime();
+  v8::Local<v8::Object> hGlobalObject =
+      FXJSE_GetGlobalObjectFromContext(scope.GetLocalContext());
+  for (int32_t i = 0; i < nNum; i++) {
+    v8::Maybe<bool> maybe_success = hGlobalObject->DefineOwnProperty(
+        scope.GetLocalContext(),
+        v8::String::NewFromUtf8(pIsolate, lpFunctions[i].name),
+        v8::Function::New(
+            pIsolate, FXJSE_V8FunctionCallback_Wrapper,
+            v8::External::New(pIsolate,
+                              const_cast<FXJSE_FUNCTION*>(lpFunctions + i))),
+        static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
+    if (!maybe_success.FromMaybe(false))
+      return;
+  }
+}
+
+FXJSE_HCLASS FXJSE_DefineClass(FXJSE_HCONTEXT hContext,
+                               const FXJSE_CLASS* lpClass) {
+  CFXJSE_Context* lpContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  ASSERT(lpContext);
+  return reinterpret_cast<FXJSE_HCLASS>(
+      CFXJSE_Class::Create(lpContext, lpClass, FALSE));
+}
+
+FXJSE_HCLASS FXJSE_GetClass(FXJSE_HCONTEXT hContext,
+                            const CFX_ByteStringC& szName) {
+  return reinterpret_cast<FXJSE_HCLASS>(CFXJSE_Class::GetClassFromContext(
+      reinterpret_cast<CFXJSE_Context*>(hContext), szName));
+}
+
+static void FXJSE_V8FunctionCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_FUNCTION* lpFunctionInfo =
+      static_cast<FXJSE_FUNCTION*>(info.Data().As<v8::External>()->Value());
+  if (!lpFunctionInfo) {
+    return;
+  }
+  CFX_ByteStringC szFunctionName(lpFunctionInfo->name);
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(info.This());
+  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
+  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
+  lpFunctionInfo->callbackProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                               szFunctionName,
+                               reinterpret_cast<CFXJSE_Arguments&>(impl));
+  if (!lpRetValue->DirectGetValue().IsEmpty()) {
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+  }
+  delete lpRetValue;
+  lpRetValue = NULL;
+  delete lpThisValue;
+  lpThisValue = NULL;
+}
+
+static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_CLASS* lpClassDefinition =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  if (!lpClassDefinition) {
+    return;
+  }
+  CFX_ByteStringC szFunctionName(lpClassDefinition->name);
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(info.This());
+  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
+  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
+  lpClassDefinition->constructor(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                                 szFunctionName,
+                                 reinterpret_cast<CFXJSE_Arguments&>(impl));
+  if (!lpRetValue->DirectGetValue().IsEmpty()) {
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+  }
+  delete lpRetValue;
+  lpRetValue = NULL;
+  delete lpThisValue;
+  lpThisValue = NULL;
+}
+
+static void FXJSE_V8GetterCallback_Wrapper(
+    v8::Local<v8::String> property,
+    const v8::PropertyCallbackInfo<v8::Value>& info) {
+  const FXJSE_PROPERTY* lpPropertyInfo =
+      static_cast<FXJSE_PROPERTY*>(info.Data().As<v8::External>()->Value());
+  if (!lpPropertyInfo) {
+    return;
+  }
+  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(info.This());
+  lpPropertyInfo->getProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                          szPropertyName,
+                          reinterpret_cast<FXJSE_HVALUE>(lpPropValue));
+  info.GetReturnValue().Set(lpPropValue->DirectGetValue());
+  delete lpThisValue;
+  lpThisValue = NULL;
+  delete lpPropValue;
+  lpPropValue = NULL;
+}
+
+static void FXJSE_V8SetterCallback_Wrapper(
+    v8::Local<v8::String> property,
+    v8::Local<v8::Value> value,
+    const v8::PropertyCallbackInfo<void>& info) {
+  const FXJSE_PROPERTY* lpPropertyInfo =
+      static_cast<FXJSE_PROPERTY*>(info.Data().As<v8::External>()->Value());
+  if (!lpPropertyInfo) {
+    return;
+  }
+  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(info.This());
+  lpPropValue->ForceSetValue(value);
+  lpPropertyInfo->setProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                          szPropertyName,
+                          reinterpret_cast<FXJSE_HVALUE>(lpPropValue));
+  delete lpThisValue;
+  lpThisValue = NULL;
+  delete lpPropValue;
+  lpPropValue = NULL;
+}
+
+static void FXJSE_V8ConstructorCallback_Wrapper(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_CLASS* lpClassDefinition =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  if (!lpClassDefinition) {
+    return;
+  }
+  FXSYS_assert(info.This()->InternalFieldCount());
+  info.This()->SetAlignedPointerInInternalField(0, NULL);
+}
+
+FXJSE_HRUNTIME CFXJSE_Arguments::GetRuntime() const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return reinterpret_cast<FXJSE_HRUNTIME>(
+      lpArguments->m_pRetValue->GetIsolate());
+}
+
+int32_t CFXJSE_Arguments::GetLength() const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return lpArguments->m_pInfo->Length();
+}
+
+FXJSE_HVALUE CFXJSE_Arguments::GetValue(int32_t index) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  CFXJSE_Value* lpArgValue = CFXJSE_Value::Create(v8::Isolate::GetCurrent());
+  ASSERT(lpArgValue);
+  lpArgValue->ForceSetValue((*lpArguments->m_pInfo)[index]);
+  return reinterpret_cast<FXJSE_HVALUE>(lpArgValue);
+}
+
+FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return (*lpArguments->m_pInfo)[index]->BooleanValue();
+}
+
+int32_t CFXJSE_Arguments::GetInt32(int32_t index) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return static_cast<int32_t>((*lpArguments->m_pInfo)[index]->NumberValue());
+}
+
+FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return static_cast<FX_FLOAT>((*lpArguments->m_pInfo)[index]->NumberValue());
+}
+
+CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  v8::Local<v8::String> hString = (*lpArguments->m_pInfo)[index]->ToString();
+  v8::String::Utf8Value szStringVal(hString);
+  return CFX_ByteString(*szStringVal);
+}
+
+void* CFXJSE_Arguments::GetObject(int32_t index, FXJSE_HCLASS hClass) const {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  v8::Local<v8::Value> hValue = (*lpArguments->m_pInfo)[index];
+  ASSERT(!hValue.IsEmpty());
+  if (!hValue->IsObject()) {
+    return NULL;
+  }
+  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
+  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), lpClass);
+}
+
+FXJSE_HVALUE CFXJSE_Arguments::GetReturnValue() {
+  const CFXJSE_ArgumentsImpl* lpArguments =
+      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
+  return reinterpret_cast<FXJSE_HVALUE>(lpArguments->m_pRetValue);
+}
+static void FXJSE_Context_GlobalObjToString(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  if (!lpClass) {
+    return;
+  }
+  if (info.This() == info.Holder() && lpClass->name) {
+    CFX_ByteString szStringVal;
+    szStringVal.Format("[object %s]", lpClass->name);
+    info.GetReturnValue().Set(v8::String::NewFromUtf8(
+        info.GetIsolate(), (const FX_CHAR*)szStringVal,
+        v8::String::kNormalString, szStringVal.GetLength()));
+  } else {
+    v8::Local<v8::String> local_str =
+        info.This()
+            ->ObjectProtoToString(info.GetIsolate()->GetCurrentContext())
+            .FromMaybe(v8::Local<v8::String>());
+    info.GetReturnValue().Set(local_str);
+  }
+}
+
+CFXJSE_Class* CFXJSE_Class::Create(CFXJSE_Context* lpContext,
+                                   const FXJSE_CLASS* lpClassDefinition,
+                                   FX_BOOL bIsJSGlobal) {
+  if (!lpContext || !lpClassDefinition) {
+    return NULL;
+  }
+  CFXJSE_Class* pClass =
+      GetClassFromContext(lpContext, lpClassDefinition->name);
+  if (pClass) {
+    return pClass;
+  }
+  v8::Isolate* pIsolate = lpContext->m_pIsolate;
+  pClass = new CFXJSE_Class(lpContext);
+  pClass->m_szClassName = lpClassDefinition->name;
+  pClass->m_lpClassDefinition = lpClassDefinition;
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
+  v8::Local<v8::FunctionTemplate> hFunctionTemplate = v8::FunctionTemplate::New(
+      pIsolate, bIsJSGlobal ? 0 : FXJSE_V8ConstructorCallback_Wrapper,
+      v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(lpClassDefinition)));
+  hFunctionTemplate->SetClassName(
+      v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name));
+  hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1);
+  v8::Local<v8::ObjectTemplate> hObjectTemplate =
+      hFunctionTemplate->InstanceTemplate();
+  SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition);
+
+  if (lpClassDefinition->propNum) {
+    for (int32_t i = 0; i < lpClassDefinition->propNum; i++) {
+      hObjectTemplate->SetNativeDataProperty(
+          v8::String::NewFromUtf8(pIsolate,
+                                  lpClassDefinition->properties[i].name),
+          lpClassDefinition->properties[i].getProc
+              ? FXJSE_V8GetterCallback_Wrapper
+              : NULL,
+          lpClassDefinition->properties[i].setProc
+              ? FXJSE_V8SetterCallback_Wrapper
+              : NULL,
+          v8::External::New(pIsolate, const_cast<FXJSE_PROPERTY*>(
+                                          lpClassDefinition->properties + i)),
+          static_cast<v8::PropertyAttribute>(v8::DontDelete));
+    }
+  }
+  if (lpClassDefinition->methNum) {
+    for (int32_t i = 0; i < lpClassDefinition->methNum; i++) {
+      hObjectTemplate->Set(
+          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name),
+          v8::FunctionTemplate::New(
+              pIsolate, FXJSE_V8FunctionCallback_Wrapper,
+              v8::External::New(pIsolate, const_cast<FXJSE_FUNCTION*>(
+                                              lpClassDefinition->methods + i))),
+          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
+    }
+  }
+  if (lpClassDefinition->constructor) {
+    if (bIsJSGlobal) {
+      hObjectTemplate->Set(
+          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
+          v8::FunctionTemplate::New(
+              pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
+              v8::External::New(pIsolate,
+                                const_cast<FXJSE_CLASS*>(lpClassDefinition))),
+          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
+    } else {
+      v8::Local<v8::Context> hLocalContext =
+          v8::Local<v8::Context>::New(pIsolate, lpContext->m_hContext);
+      FXJSE_GetGlobalObjectFromContext(hLocalContext)
+          ->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
+                v8::Function::New(
+                    pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
+                    v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(
+                                                    lpClassDefinition))));
+    }
+  }
+  if (bIsJSGlobal) {
+    hObjectTemplate->Set(
+        v8::String::NewFromUtf8(pIsolate, "toString"),
+        v8::FunctionTemplate::New(
+            pIsolate, FXJSE_Context_GlobalObjToString,
+            v8::External::New(pIsolate,
+                              const_cast<FXJSE_CLASS*>(lpClassDefinition))));
+  }
+  pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate);
+  lpContext->m_rgClasses.Add(pClass);
+  return pClass;
+}
+CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext,
+                                                const CFX_ByteStringC& szName) {
+  for (int count = pContext->m_rgClasses.GetSize(), i = 0; i < count; i++) {
+    CFXJSE_Class* pClass = pContext->m_rgClasses[i];
+    if (pClass->m_szClassName == szName) {
+      return pClass;
+    }
+  }
+  return NULL;
+}
diff --git a/xfa/fxjse/class.h b/xfa/fxjse/class.h
new file mode 100644
index 0000000..e67a77a
--- /dev/null
+++ b/xfa/fxjse/class.h
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_CLASS_H_
+#define XFA_FXJSE_CLASS_H_
+
+#include "v8/include/v8.h"
+#include "xfa/include/fxjse/fxjse.h"
+
+class CFXJSE_Context;
+class CFXJSE_Value;
+
+class CFXJSE_Class {
+ protected:
+  CFXJSE_Class(CFXJSE_Context* lpContext)
+      : m_lpClassDefinition(nullptr), m_pContext(lpContext) {}
+
+ public:
+  inline CFXJSE_Context* GetContext() { return m_pContext; }
+  inline v8::Global<v8::FunctionTemplate>& GetTemplate() { return m_hTemplate; }
+
+ public:
+  static CFXJSE_Class* Create(CFXJSE_Context* pContext,
+                              const FXJSE_CLASS* lpClassDefintion,
+                              FX_BOOL bIsJSGlobal = FALSE);
+  static CFXJSE_Class* GetClassFromContext(CFXJSE_Context* pContext,
+                                           const CFX_ByteStringC& szName);
+  static void SetUpNamedPropHandler(
+      v8::Isolate* pIsolate,
+      v8::Local<v8::ObjectTemplate>& hObjectTemplate,
+      const FXJSE_CLASS* lpClassDefinition);
+
+ protected:
+  CFX_ByteString m_szClassName;
+  const FXJSE_CLASS* m_lpClassDefinition;
+  CFXJSE_Context* m_pContext;
+  v8::Global<v8::FunctionTemplate> m_hTemplate;
+  friend class CFXJSE_Context;
+  friend class CFXJSE_Value;
+};
+struct CFXJSE_ArgumentsImpl {
+  const v8::FunctionCallbackInfo<v8::Value>* m_pInfo;
+  CFXJSE_Value* m_pRetValue;
+};
+
+#endif  // XFA_FXJSE_CLASS_H_
diff --git a/xfa/fxjse/context.cpp b/xfa/fxjse/context.cpp
new file mode 100644
index 0000000..1b46a79
--- /dev/null
+++ b/xfa/fxjse/context.cpp
@@ -0,0 +1,275 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxjse/context.h"
+
+#include "xfa/fxjse/class.h"
+#include "xfa/fxjse/scope_inline.h"
+#include "xfa/fxjse/util_inline.h"
+#include "xfa/fxjse/value.h"
+
+FXJSE_HCONTEXT FXJSE_Context_Create(FXJSE_HRUNTIME hRuntime,
+                                    const FXJSE_CLASS* lpGlobalClass,
+                                    void* lpGlobalObject) {
+  CFXJSE_Context* pContext = CFXJSE_Context::Create(
+      reinterpret_cast<v8::Isolate*>(hRuntime), lpGlobalClass, lpGlobalObject);
+  return reinterpret_cast<FXJSE_HCONTEXT>(pContext);
+}
+
+void FXJSE_Context_Release(FXJSE_HCONTEXT hContext) {
+  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  if (pContext) {
+    delete pContext;
+  }
+}
+
+FXJSE_HVALUE FXJSE_Context_GetGlobalObject(FXJSE_HCONTEXT hContext) {
+  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  if (!pContext) {
+    return NULL;
+  }
+  CFXJSE_Value* lpValue = CFXJSE_Value::Create(pContext->GetRuntime());
+  ASSERT(lpValue);
+  pContext->GetGlobalObject(lpValue);
+  return reinterpret_cast<FXJSE_HVALUE>(lpValue);
+}
+
+FXJSE_HRUNTIME FXJSE_Context_GetRuntime(FXJSE_HCONTEXT hContext) {
+  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  return pContext ? reinterpret_cast<FXJSE_HRUNTIME>(pContext->GetRuntime())
+                  : NULL;
+}
+
+static const FX_CHAR* szCompatibleModeScripts[] = {
+    "(function(global, list) {\n"
+    "  'use strict';\n"
+    "  var objname;\n"
+    "  for (objname in list) {\n"
+    "    var globalobj = global[objname];\n"
+    "    if (globalobj) {\n"
+    "      list[objname].forEach(function(name) {\n"
+    "        if (!globalobj[name]) {\n"
+    "          Object.defineProperty(globalobj, name, {\n"
+    "            writable: true,\n"
+    "            enumerable: false,\n"
+    "            value: (function(obj) {\n"
+    "              if (arguments.length === 0) {\n"
+    "                throw new TypeError('missing argument 0 when calling "
+    "                    function ' + objname + '.' + name);\n"
+    "              }\n"
+    "              return globalobj.prototype[name].apply(obj, "
+    "                  Array.prototype.slice.call(arguments, 1));\n"
+    "            })\n"
+    "          });\n"
+    "        }\n"
+    "      });\n"
+    "    }\n"
+    "  }\n"
+    "}(this, {String: ['substr', 'toUpperCase']}));"};
+void FXJSE_Context_EnableCompatibleMode(FXJSE_HCONTEXT hContext,
+                                        FX_DWORD dwCompatibleFlags) {
+  for (uint32_t i = 0; i < (uint32_t)FXJSE_COMPATIBLEMODEFLAGCOUNT; i++) {
+    if (dwCompatibleFlags & (1 << i)) {
+      FXJSE_ExecuteScript(hContext, szCompatibleModeScripts[i], NULL, NULL);
+    }
+  }
+}
+
+FX_BOOL FXJSE_ExecuteScript(FXJSE_HCONTEXT hContext,
+                            const FX_CHAR* szScript,
+                            FXJSE_HVALUE hRetValue,
+                            FXJSE_HVALUE hNewThisObject) {
+  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
+  ASSERT(pContext);
+  return pContext->ExecuteScript(
+      szScript, reinterpret_cast<CFXJSE_Value*>(hRetValue),
+      reinterpret_cast<CFXJSE_Value*>(hNewThisObject));
+}
+
+v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
+                                              v8::TryCatch& trycatch) {
+  v8::Local<v8::Object> hReturnValue = v8::Object::New(pIsolate);
+  if (trycatch.HasCaught()) {
+    v8::Local<v8::Value> hException = trycatch.Exception();
+    v8::Local<v8::Message> hMessage = trycatch.Message();
+    if (hException->IsObject()) {
+      v8::Local<v8::Value> hValue;
+      hValue = hException.As<v8::Object>()->Get(
+          v8::String::NewFromUtf8(pIsolate, "name"));
+      if (hValue->IsString() || hValue->IsStringObject()) {
+        hReturnValue->Set(0, hValue);
+      } else {
+        hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
+      }
+      hValue = hException.As<v8::Object>()->Get(
+          v8::String::NewFromUtf8(pIsolate, "message"));
+      if (hValue->IsString() || hValue->IsStringObject()) {
+        hReturnValue->Set(1, hValue);
+      } else {
+        hReturnValue->Set(1, hMessage->Get());
+      }
+    } else {
+      hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
+      hReturnValue->Set(1, hMessage->Get());
+    }
+    hReturnValue->Set(2, hException);
+    hReturnValue->Set(3, v8::Integer::New(pIsolate, hMessage->GetLineNumber()));
+    hReturnValue->Set(4, hMessage->GetSourceLine());
+    v8::Maybe<int32_t> maybe_int =
+        hMessage->GetStartColumn(pIsolate->GetCurrentContext());
+    hReturnValue->Set(5, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0)));
+    maybe_int = hMessage->GetEndColumn(pIsolate->GetCurrentContext());
+    hReturnValue->Set(6, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0)));
+  }
+  return hReturnValue;
+}
+
+FX_BOOL FXJSE_ReturnValue_GetMessage(FXJSE_HVALUE hRetValue,
+                                     CFX_ByteString& utf8Name,
+                                     CFX_ByteString& utf8Message) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
+  if (!lpValue) {
+    return FALSE;
+  }
+  v8::Isolate* pIsolate = lpValue->GetIsolate();
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
+  v8::Local<v8::Value> hValue =
+      v8::Local<v8::Value>::New(pIsolate, lpValue->DirectGetValue());
+  if (!hValue->IsObject()) {
+    return FALSE;
+  }
+  v8::String::Utf8Value hStringVal0(
+      hValue.As<v8::Object>()->Get(0)->ToString());
+  utf8Name = *hStringVal0;
+  v8::String::Utf8Value hStringVal1(
+      hValue.As<v8::Object>()->Get(1)->ToString());
+  utf8Message = *hStringVal1;
+  return TRUE;
+}
+
+FX_BOOL FXJSE_ReturnValue_GetLineInfo(FXJSE_HVALUE hRetValue,
+                                      int32_t& nLine,
+                                      int32_t& nCol) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
+  if (!lpValue) {
+    return FALSE;
+  }
+  v8::Isolate* pIsolate = lpValue->GetIsolate();
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
+  v8::Local<v8::Value> hValue =
+      v8::Local<v8::Value>::New(pIsolate, lpValue->DirectGetValue());
+  if (!hValue->IsObject()) {
+    return FALSE;
+  }
+  v8::MaybeLocal<v8::Int32> maybe_int =
+      hValue.As<v8::Object>()->Get(3)->ToInt32(pIsolate->GetCurrentContext());
+  nLine = maybe_int.FromMaybe(v8::Local<v8::Int32>())->Value();
+  maybe_int =
+      hValue.As<v8::Object>()->Get(5)->ToInt32(pIsolate->GetCurrentContext());
+  nCol = maybe_int.FromMaybe(v8::Local<v8::Int32>())->Value();
+  return TRUE;
+}
+
+CFXJSE_Context* CFXJSE_Context::Create(v8::Isolate* pIsolate,
+                                       const FXJSE_CLASS* lpGlobalClass,
+                                       void* lpGlobalObject) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate);
+  CFXJSE_Context* pContext = new CFXJSE_Context(pIsolate);
+  CFXJSE_Class* lpGlobalClassObj = NULL;
+  v8::Local<v8::ObjectTemplate> hObjectTemplate;
+  if (lpGlobalClass) {
+    lpGlobalClassObj = CFXJSE_Class::Create(pContext, lpGlobalClass, TRUE);
+    ASSERT(lpGlobalClassObj);
+    v8::Local<v8::FunctionTemplate> hFunctionTemplate =
+        v8::Local<v8::FunctionTemplate>::New(pIsolate,
+                                             lpGlobalClassObj->m_hTemplate);
+    hObjectTemplate = hFunctionTemplate->InstanceTemplate();
+  } else {
+    hObjectTemplate = v8::ObjectTemplate::New(pIsolate);
+    hObjectTemplate->SetInternalFieldCount(1);
+  }
+  v8::Local<v8::Context> hNewContext =
+      v8::Context::New(pIsolate, NULL, hObjectTemplate);
+  v8::Local<v8::Context> hRootContext = v8::Local<v8::Context>::New(
+      pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
+  hNewContext->SetSecurityToken(hRootContext->GetSecurityToken());
+  v8::Local<v8::Object> hGlobalObject =
+      FXJSE_GetGlobalObjectFromContext(hNewContext);
+  FXJSE_UpdateObjectBinding(hGlobalObject, lpGlobalObject);
+  pContext->m_hContext.Reset(pIsolate, hNewContext);
+  return pContext;
+}
+
+CFXJSE_Context::~CFXJSE_Context() {
+  for (int32_t i = 0, count = m_rgClasses.GetSize(); i < count; i++) {
+    CFXJSE_Class* pClass = m_rgClasses[i];
+    if (pClass) {
+      delete pClass;
+    }
+  }
+  m_rgClasses.RemoveAll();
+}
+
+void CFXJSE_Context::GetGlobalObject(CFXJSE_Value* pValue) {
+  ASSERT(pValue);
+  CFXJSE_ScopeUtil_IsolateHandleContext scope(this);
+  v8::Local<v8::Context> hContext =
+      v8::Local<v8::Context>::New(m_pIsolate, m_hContext);
+  v8::Local<v8::Object> hGlobalObject = hContext->Global();
+  pValue->ForceSetValue(hGlobalObject);
+}
+
+FX_BOOL CFXJSE_Context::ExecuteScript(const FX_CHAR* szScript,
+                                      CFXJSE_Value* lpRetValue,
+                                      CFXJSE_Value* lpNewThisObject) {
+  CFXJSE_ScopeUtil_IsolateHandleContext scope(this);
+  v8::TryCatch trycatch(m_pIsolate);
+  v8::Local<v8::String> hScriptString =
+      v8::String::NewFromUtf8(m_pIsolate, szScript);
+  if (lpNewThisObject == NULL) {
+    v8::Local<v8::Script> hScript = v8::Script::Compile(hScriptString);
+    if (!trycatch.HasCaught()) {
+      v8::Local<v8::Value> hValue = hScript->Run();
+      if (!trycatch.HasCaught()) {
+        if (lpRetValue) {
+          lpRetValue->m_hValue.Reset(m_pIsolate, hValue);
+        }
+        return TRUE;
+      }
+    }
+    if (lpRetValue) {
+      lpRetValue->m_hValue.Reset(m_pIsolate,
+                                 FXJSE_CreateReturnValue(m_pIsolate, trycatch));
+    }
+    return FALSE;
+  } else {
+    v8::Local<v8::Value> hNewThis =
+        v8::Local<v8::Value>::New(m_pIsolate, lpNewThisObject->m_hValue);
+    ASSERT(!hNewThis.IsEmpty());
+    v8::Local<v8::Script> hWrapper =
+        v8::Script::Compile(v8::String::NewFromUtf8(
+            m_pIsolate, "(function () { return eval(arguments[0]); })"));
+    v8::Local<v8::Value> hWrapperValue = hWrapper->Run();
+    ASSERT(hWrapperValue->IsFunction());
+    v8::Local<v8::Function> hWrapperFn = hWrapperValue.As<v8::Function>();
+    if (!trycatch.HasCaught()) {
+      v8::Local<v8::Value> rgArgs[] = {hScriptString};
+      v8::Local<v8::Value> hValue =
+          hWrapperFn->Call(hNewThis.As<v8::Object>(), 1, rgArgs);
+      if (!trycatch.HasCaught()) {
+        if (lpRetValue) {
+          lpRetValue->m_hValue.Reset(m_pIsolate, hValue);
+        }
+        return TRUE;
+      }
+    }
+    if (lpRetValue) {
+      lpRetValue->m_hValue.Reset(m_pIsolate,
+                                 FXJSE_CreateReturnValue(m_pIsolate, trycatch));
+    }
+    return FALSE;
+  }
+}
diff --git a/xfa/fxjse/context.h b/xfa/fxjse/context.h
new file mode 100644
index 0000000..01a1f4b
--- /dev/null
+++ b/xfa/fxjse/context.h
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_CONTEXT_H_
+#define XFA_FXJSE_CONTEXT_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "v8/include/v8.h"
+#include "xfa/include/fxjse/fxjse.h"
+
+class CFXJSE_Class;
+class CFXJSE_Value;
+
+class CFXJSE_Context {
+ protected:
+  CFXJSE_Context(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
+
+ public:
+  static CFXJSE_Context* Create(v8::Isolate* pIsolate,
+                                const FXJSE_CLASS* lpGlobalClass = NULL,
+                                void* lpGlobalObject = NULL);
+  ~CFXJSE_Context();
+  V8_INLINE v8::Isolate* GetRuntime(void) { return m_pIsolate; }
+  void GetGlobalObject(CFXJSE_Value* pValue);
+  FX_BOOL ExecuteScript(const FX_CHAR* szScript,
+                        CFXJSE_Value* lpRetValue,
+                        CFXJSE_Value* lpNewThisObject = NULL);
+
+ protected:
+  CFXJSE_Context();
+  CFXJSE_Context(const CFXJSE_Context&);
+  CFXJSE_Context& operator=(const CFXJSE_Context&);
+
+ protected:
+  v8::Global<v8::Context> m_hContext;
+  v8::Isolate* m_pIsolate;
+  CFX_ArrayTemplate<CFXJSE_Class*> m_rgClasses;
+  friend class CFXJSE_Class;
+  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
+  friend class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext;
+};
+v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
+                                              v8::TryCatch& trycatch);
+
+#endif  // XFA_FXJSE_CONTEXT_H_
diff --git a/xfa/fxjse/dynprop.cpp b/xfa/fxjse/dynprop.cpp
new file mode 100644
index 0000000..88cb019
--- /dev/null
+++ b/xfa/fxjse/dynprop.cpp
@@ -0,0 +1,236 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxjse/class.h"
+#include "xfa/fxjse/value.h"
+
+static void FXJSE_DynPropGetterAdapter_MethodCallback(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> hCallBackInfo = info.Data().As<v8::Object>();
+  FXJSE_CLASS* lpClass = static_cast<FXJSE_CLASS*>(
+      hCallBackInfo->GetAlignedPointerFromInternalField(0));
+  v8::Local<v8::String> hPropName =
+      hCallBackInfo->GetInternalField(1).As<v8::String>();
+  ASSERT(lpClass && !hPropName.IsEmpty());
+  v8::String::Utf8Value szPropName(hPropName);
+  CFX_ByteStringC szFxPropName = *szPropName;
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(info.This());
+  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
+  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
+  lpClass->dynMethodCall(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                         szFxPropName,
+                         reinterpret_cast<CFXJSE_Arguments&>(impl));
+  if (!lpRetValue->DirectGetValue().IsEmpty()) {
+    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
+  }
+  delete lpRetValue;
+  lpRetValue = nullptr;
+  delete lpThisValue;
+  lpThisValue = nullptr;
+}
+
+static void FXJSE_DynPropGetterAdapter(const FXJSE_CLASS* lpClass,
+                                       FXJSE_HOBJECT hObject,
+                                       const CFX_ByteStringC& szPropName,
+                                       FXJSE_HVALUE hValue) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
+  if (nPropType == FXJSE_ClassPropType_Property) {
+    if (lpClass->dynPropGetter) {
+      lpClass->dynPropGetter(hObject, szPropName, hValue);
+    }
+  } else if (nPropType == FXJSE_ClassPropType_Method) {
+    if (lpClass->dynMethodCall && hValue) {
+      CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+      v8::Isolate* pIsolate = lpValue->GetIsolate();
+      v8::HandleScope hscope(pIsolate);
+      v8::Local<v8::ObjectTemplate> hCallBackInfoTemplate =
+          v8::ObjectTemplate::New(pIsolate);
+      hCallBackInfoTemplate->SetInternalFieldCount(2);
+      v8::Local<v8::Object> hCallBackInfo =
+          hCallBackInfoTemplate->NewInstance();
+      hCallBackInfo->SetAlignedPointerInInternalField(
+          0, const_cast<FXJSE_CLASS*>(lpClass));
+      hCallBackInfo->SetInternalField(
+          1, v8::String::NewFromUtf8(
+                 pIsolate, reinterpret_cast<const char*>(szPropName.GetPtr()),
+                 v8::String::kNormalString, szPropName.GetLength()));
+      lpValue->ForceSetValue(v8::Function::New(
+          lpValue->GetIsolate(), FXJSE_DynPropGetterAdapter_MethodCallback,
+          hCallBackInfo));
+    }
+  }
+}
+
+static void FXJSE_DynPropSetterAdapter(const FXJSE_CLASS* lpClass,
+                                       FXJSE_HOBJECT hObject,
+                                       const CFX_ByteStringC& szPropName,
+                                       FXJSE_HVALUE hValue) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
+  if (nPropType != FXJSE_ClassPropType_Method) {
+    if (lpClass->dynPropSetter) {
+      lpClass->dynPropSetter(hObject, szPropName, hValue);
+    }
+  }
+}
+
+static FX_BOOL FXJSE_DynPropQueryAdapter(const FXJSE_CLASS* lpClass,
+                                         FXJSE_HOBJECT hObject,
+                                         const CFX_ByteStringC& szPropName) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(hObject, szPropName, TRUE);
+  return nPropType != FXJSE_ClassPropType_None;
+}
+
+static FX_BOOL FXJSE_DynPropDeleterAdapter(const FXJSE_CLASS* lpClass,
+                                           FXJSE_HOBJECT hObject,
+                                           const CFX_ByteStringC& szPropName) {
+  ASSERT(lpClass);
+  int32_t nPropType =
+      lpClass->dynPropTypeGetter == nullptr
+          ? FXJSE_ClassPropType_Property
+          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
+  if (nPropType != FXJSE_ClassPropType_Method) {
+    if (lpClass->dynPropDeleter) {
+      return lpClass->dynPropDeleter(hObject, szPropName);
+    } else {
+      return nPropType == FXJSE_ClassPropType_Property ? FALSE : TRUE;
+    }
+  }
+  return FALSE;
+}
+
+static void FXJSE_V8_GenericNamedPropertyQueryCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Integer>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::HandleScope scope(pIsolate);
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(thisObject);
+  if (FXJSE_DynPropQueryAdapter(lpClass,
+                                reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
+                                szFxPropName)) {
+    info.GetReturnValue().Set(v8::DontDelete);
+  } else {
+    const int32_t iV8Absent = 64;
+    info.GetReturnValue().Set(iV8Absent);
+  }
+  delete lpThisValue;
+  lpThisValue = nullptr;
+}
+
+static void FXJSE_V8_GenericNamedPropertyDeleterCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::HandleScope scope(pIsolate);
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(thisObject);
+  info.GetReturnValue().Set(
+      FXJSE_DynPropDeleterAdapter(
+          lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName)
+          ? true
+          : false);
+  delete lpThisValue;
+  lpThisValue = nullptr;
+}
+
+static void FXJSE_V8_GenericNamedPropertyGetterCallback(
+    v8::Local<v8::Name> property,
+    const v8::PropertyCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(thisObject);
+  CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate());
+  FXJSE_DynPropGetterAdapter(
+      lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName,
+      reinterpret_cast<FXJSE_HVALUE>(lpNewValue));
+  info.GetReturnValue().Set(lpNewValue->DirectGetValue());
+  delete lpThisValue;
+  lpThisValue = nullptr;
+}
+
+static void FXJSE_V8_GenericNamedPropertySetterCallback(
+    v8::Local<v8::Name> property,
+    v8::Local<v8::Value> value,
+    const v8::PropertyCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> thisObject = info.This();
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  v8::String::Utf8Value szPropName(property);
+  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
+  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpThisValue->ForceSetValue(thisObject);
+  CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate());
+  lpNewValue->ForceSetValue(value);
+  FXJSE_DynPropSetterAdapter(
+      lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName,
+      reinterpret_cast<FXJSE_HVALUE>(lpNewValue));
+  info.GetReturnValue().Set(value);
+  delete lpThisValue;
+  lpThisValue = nullptr;
+}
+
+static void FXJSE_V8_GenericNamedPropertyEnumeratorCallback(
+    const v8::PropertyCallbackInfo<v8::Array>& info) {
+  const FXJSE_CLASS* lpClass =
+      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
+  v8::Isolate* pIsolate = info.GetIsolate();
+  v8::Local<v8::Array> newArray = v8::Array::New(pIsolate, lpClass->propNum);
+  for (int i = 0; i < lpClass->propNum; i++) {
+    newArray->Set(
+        i, v8::String::NewFromUtf8(pIsolate, lpClass->properties[i].name));
+  }
+  info.GetReturnValue().Set(newArray);
+}
+
+void CFXJSE_Class::SetUpNamedPropHandler(
+    v8::Isolate* pIsolate,
+    v8::Local<v8::ObjectTemplate>& hObjectTemplate,
+    const FXJSE_CLASS* lpClassDefinition) {
+  v8::NamedPropertyHandlerConfiguration configuration(
+      lpClassDefinition->dynPropGetter
+          ? FXJSE_V8_GenericNamedPropertyGetterCallback
+          : 0,
+      lpClassDefinition->dynPropSetter
+          ? FXJSE_V8_GenericNamedPropertySetterCallback
+          : 0,
+      lpClassDefinition->dynPropTypeGetter
+          ? FXJSE_V8_GenericNamedPropertyQueryCallback
+          : 0,
+      lpClassDefinition->dynPropDeleter
+          ? FXJSE_V8_GenericNamedPropertyDeleterCallback
+          : 0,
+      FXJSE_V8_GenericNamedPropertyEnumeratorCallback,
+      v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(lpClassDefinition)),
+      v8::PropertyHandlerFlags::kNonMasking);
+  hObjectTemplate->SetHandler(configuration);
+}
diff --git a/xfa/fxjse/runtime.cpp b/xfa/fxjse/runtime.cpp
new file mode 100644
index 0000000..a1472c7
--- /dev/null
+++ b/xfa/fxjse/runtime.cpp
@@ -0,0 +1,128 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxjse/runtime.h"
+
+#include "fpdfsdk/include/jsapi/fxjs_v8.h"
+#include "xfa/fxjse/scope_inline.h"
+
+// Duplicates fpdfsdk's JS_Runtime.h, but keeps XFA from depending on it.
+// TODO(tsepez): make a single version of this.
+class FXJSE_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
+  void* Allocate(size_t length) override { return calloc(1, length); }
+  void* AllocateUninitialized(size_t length) override { return malloc(length); }
+  void Free(void* data, size_t length) override { free(data); }
+};
+
+static void FXJSE_KillV8() {
+  v8::V8::Dispose();
+}
+
+void FXJSE_Initialize() {
+  if (!CFXJSE_RuntimeData::g_RuntimeList) {
+    CFXJSE_RuntimeData::g_RuntimeList = new CFXJSE_RuntimeList;
+  }
+  static FX_BOOL bV8Initialized = FALSE;
+  if (bV8Initialized) {
+    return;
+  }
+  bV8Initialized = TRUE;
+  atexit(FXJSE_KillV8);
+}
+
+static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate) {
+  {
+    v8::Locker locker(pIsolate);
+    if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
+      delete pData->m_pFXJSERuntimeData;
+      pData->m_pFXJSERuntimeData = nullptr;
+    }
+  }
+  pIsolate->Dispose();
+}
+
+void FXJSE_Finalize() {
+  if (CFXJSE_RuntimeData::g_RuntimeList) {
+    CFXJSE_RuntimeData::g_RuntimeList->RemoveAllRuntimes(
+        FXJSE_Runtime_DisposeCallback);
+    delete CFXJSE_RuntimeData::g_RuntimeList;
+    CFXJSE_RuntimeData::g_RuntimeList = NULL;
+  }
+}
+
+FXJSE_HRUNTIME FXJSE_Runtime_Create() {
+  v8::Isolate::CreateParams params;
+  params.array_buffer_allocator = new FXJSE_ArrayBufferAllocator();
+  v8::Isolate* pIsolate = v8::Isolate::New(params);
+  ASSERT(pIsolate && CFXJSE_RuntimeData::g_RuntimeList);
+  CFXJSE_RuntimeData::g_RuntimeList->AppendRuntime(pIsolate);
+  return reinterpret_cast<FXJSE_HRUNTIME>(pIsolate);
+}
+
+void FXJSE_Runtime_Release(FXJSE_HRUNTIME hRuntime, bool bOwnedRuntime) {
+  v8::Isolate* pIsolate = reinterpret_cast<v8::Isolate*>(hRuntime);
+  if (!pIsolate)
+    return;
+  if (bOwnedRuntime) {
+    ASSERT(CFXJSE_RuntimeData::g_RuntimeList);
+    CFXJSE_RuntimeData::g_RuntimeList->RemoveRuntime(
+        pIsolate, FXJSE_Runtime_DisposeCallback);
+  } else {
+    if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
+      delete pData->m_pFXJSERuntimeData;
+      pData->m_pFXJSERuntimeData = nullptr;
+    }
+  }
+}
+
+CFXJSE_RuntimeData* CFXJSE_RuntimeData::Create(v8::Isolate* pIsolate) {
+  CFXJSE_RuntimeData* pRuntimeData = new CFXJSE_RuntimeData(pIsolate);
+  CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate);
+  v8::Local<v8::FunctionTemplate> hFuncTemplate =
+      v8::FunctionTemplate::New(pIsolate);
+  v8::Local<v8::Context> hContext =
+      v8::Context::New(pIsolate, 0, hFuncTemplate->InstanceTemplate());
+  hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate));
+  pRuntimeData->m_hRootContextGlobalTemplate.Reset(pIsolate, hFuncTemplate);
+  pRuntimeData->m_hRootContext.Reset(pIsolate, hContext);
+  return pRuntimeData;
+}
+
+CFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) {
+  FXJS_PerIsolateData::SetUp(pIsolate);
+  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
+  if (!pData->m_pFXJSERuntimeData)
+    pData->m_pFXJSERuntimeData = CFXJSE_RuntimeData::Create(pIsolate);
+  return pData->m_pFXJSERuntimeData;
+}
+
+CFXJSE_RuntimeList* CFXJSE_RuntimeData::g_RuntimeList = NULL;
+void CFXJSE_RuntimeList::AppendRuntime(v8::Isolate* pIsolate) {
+  m_RuntimeList.Add(pIsolate);
+}
+
+void CFXJSE_RuntimeList::RemoveRuntime(
+    v8::Isolate* pIsolate,
+    CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
+  int32_t iIdx = m_RuntimeList.Find(pIsolate, 0);
+  if (iIdx >= 0) {
+    m_RuntimeList.RemoveAt(iIdx, 1);
+  }
+  if (lpfnDisposeCallback) {
+    lpfnDisposeCallback(pIsolate);
+  }
+}
+
+void CFXJSE_RuntimeList::RemoveAllRuntimes(
+    CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
+  int32_t iSize = m_RuntimeList.GetSize();
+  if (lpfnDisposeCallback) {
+    for (int32_t iIdx = 0; iIdx < iSize; iIdx++) {
+      lpfnDisposeCallback(m_RuntimeList[iIdx]);
+    }
+  }
+  m_RuntimeList.RemoveAll();
+}
diff --git a/xfa/fxjse/runtime.h b/xfa/fxjse/runtime.h
new file mode 100644
index 0000000..023aaaa
--- /dev/null
+++ b/xfa/fxjse/runtime.h
@@ -0,0 +1,51 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_RUNTIME_H_
+#define XFA_FXJSE_RUNTIME_H_
+
+#include "core/include/fxcrt/fx_basic.h"
+#include "v8/include/v8.h"
+
+class CFXJSE_RuntimeList;
+
+class CFXJSE_RuntimeData {
+ protected:
+  CFXJSE_RuntimeData(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
+
+ public:
+  static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate);
+  static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate);
+
+ public:
+  v8::Isolate* m_pIsolate;
+  v8::Global<v8::FunctionTemplate> m_hRootContextGlobalTemplate;
+  v8::Global<v8::Context> m_hRootContext;
+
+ public:
+  static CFXJSE_RuntimeList* g_RuntimeList;
+
+ protected:
+  CFXJSE_RuntimeData();
+  CFXJSE_RuntimeData(const CFXJSE_RuntimeData&);
+  CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&);
+};
+
+class CFXJSE_RuntimeList {
+ public:
+  typedef void (*RuntimeDisposeCallback)(v8::Isolate*);
+
+ public:
+  void AppendRuntime(v8::Isolate* pIsolate);
+  void RemoveRuntime(v8::Isolate* pIsolate,
+                     RuntimeDisposeCallback lpfnDisposeCallback);
+  void RemoveAllRuntimes(RuntimeDisposeCallback lpfnDisposeCallback);
+
+ protected:
+  CFX_ArrayTemplate<v8::Isolate*> m_RuntimeList;
+};
+
+#endif  // XFA_FXJSE_RUNTIME_H_
diff --git a/xfa/fxjse/scope_inline.h b/xfa/fxjse/scope_inline.h
new file mode 100644
index 0000000..8eeda5c
--- /dev/null
+++ b/xfa/fxjse/scope_inline.h
@@ -0,0 +1,108 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_SCOPE_INLINE_H_
+#define XFA_FXJSE_SCOPE_INLINE_H_
+
+#include "xfa/fxjse/context.h"
+#include "xfa/fxjse/runtime.h"
+
+class CFXJSE_ScopeUtil_IsolateHandle {
+ protected:
+  v8::Isolate* m_isolate;
+  v8::Locker m_locker;
+  v8::Isolate::Scope m_iscope;
+  v8::HandleScope m_hscope;
+
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate)
+      : m_isolate(pIsolate),
+        m_locker(pIsolate),
+        m_iscope(pIsolate),
+        m_hscope(pIsolate) {}
+  v8::Isolate* GetIsolate() { return m_isolate; }
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&);
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandle&);
+  void* operator new(size_t size);
+  void operator delete(void*, size_t);
+};
+class CFXJSE_ScopeUtil_IsolateHandleRootContext {
+  CFXJSE_ScopeUtil_IsolateHandle m_parent;
+  v8::Context::Scope m_cscope;
+
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate)
+      : m_parent(pIsolate),
+        m_cscope(v8::Local<v8::Context>::New(
+            pIsolate,
+            CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandleRootContext(
+      const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
+  void* operator new(size_t size);
+  void operator delete(void*, size_t);
+};
+class CFXJSE_ScopeUtil_IsolateHandleContext {
+  CFXJSE_Context* m_context;
+  CFXJSE_ScopeUtil_IsolateHandle m_parent;
+  v8::Context::Scope m_cscope;
+
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext)
+      : m_context(pContext),
+        m_parent(pContext->m_pIsolate),
+        m_cscope(v8::Local<v8::Context>::New(pContext->m_pIsolate,
+                                             pContext->m_hContext)) {}
+  v8::Isolate* GetIsolate() { return m_context->m_pIsolate; }
+  v8::Local<v8::Context> GetLocalContext() {
+    return v8::Local<v8::Context>::New(m_context->m_pIsolate,
+                                       m_context->m_hContext);
+  }
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandleContext(
+      const CFXJSE_ScopeUtil_IsolateHandleContext&);
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&);
+  void* operator new(size_t size);
+  void operator delete(void*, size_t);
+};
+class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext {
+  CFXJSE_Context* m_context;
+  CFXJSE_ScopeUtil_IsolateHandle m_parent;
+  v8::Context::Scope m_cscope;
+
+ public:
+  explicit CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
+      v8::Isolate* pIsolate,
+      CFXJSE_Context* pContext)
+      : m_context(pContext),
+        m_parent(pIsolate),
+        m_cscope(v8::Local<v8::Context>::New(
+            pIsolate,
+            pContext ? pContext->m_hContext
+                     : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
+  v8::Isolate* GetIsolate() { return m_parent.GetIsolate(); }
+  v8::Local<v8::Context> GetLocalContext() {
+    v8::Isolate* pIsolate = m_parent.GetIsolate();
+    return v8::Local<v8::Context>::New(
+        pIsolate, m_context
+                      ? m_context->m_hContext
+                      : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
+  }
+
+ private:
+  CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
+      const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
+  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
+  void* operator new(size_t size);
+  void operator delete(void*, size_t);
+};
+
+#endif  // XFA_FXJSE_SCOPE_INLINE_H_
diff --git a/xfa/fxjse/util_inline.h b/xfa/fxjse/util_inline.h
new file mode 100644
index 0000000..e61dc6a
--- /dev/null
+++ b/xfa/fxjse/util_inline.h
@@ -0,0 +1,51 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_UTIL_INLINE_H_
+#define XFA_FXJSE_UTIL_INLINE_H_
+
+#include "xfa/fxjse/context.h"
+
+static V8_INLINE v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
+    const v8::Local<v8::Context>& hContext) {
+  return hContext->Global()->GetPrototype().As<v8::Object>();
+}
+static V8_INLINE void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
+                                                void* lpNewBinding) {
+  ASSERT(!hObject.IsEmpty());
+  ASSERT(hObject->InternalFieldCount() > 0);
+  hObject->SetAlignedPointerInInternalField(0, lpNewBinding);
+}
+static V8_INLINE void* FXJSE_RetrieveObjectBinding(
+    const v8::Local<v8::Object>& hJSObject,
+    CFXJSE_Class* lpClass = NULL) {
+  ASSERT(!hJSObject.IsEmpty());
+  if (!hJSObject->IsObject()) {
+    return NULL;
+  }
+  v8::Local<v8::Object> hObject = hJSObject;
+  if (hObject->InternalFieldCount() == 0) {
+    v8::Local<v8::Value> hProtoObject = hObject->GetPrototype();
+    if (hProtoObject.IsEmpty() || !hProtoObject->IsObject()) {
+      return NULL;
+    }
+    hObject = hProtoObject.As<v8::Object>();
+    if (hObject->InternalFieldCount() == 0) {
+      return NULL;
+    }
+  }
+  if (lpClass) {
+    v8::Local<v8::FunctionTemplate> hClass =
+        v8::Local<v8::FunctionTemplate>::New(
+            lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate());
+    if (!hClass->HasInstance(hObject)) {
+      return NULL;
+    }
+  }
+  return hObject->GetAlignedPointerFromInternalField(0);
+}
+
+#endif  // XFA_FXJSE_UTIL_INLINE_H_
diff --git a/xfa/fxjse/value.cpp b/xfa/fxjse/value.cpp
new file mode 100644
index 0000000..7732026
--- /dev/null
+++ b/xfa/fxjse/value.cpp
@@ -0,0 +1,582 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxjse/value.h"
+
+#include <math.h>
+
+#include "xfa/fxjse/class.h"
+#include "xfa/fxjse/util_inline.h"
+
+FX_BOOL FXJSE_Value_IsUndefined(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsUndefined();
+}
+
+FX_BOOL FXJSE_Value_IsNull(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsNull();
+}
+
+FX_BOOL FXJSE_Value_IsBoolean(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsBoolean();
+}
+
+FX_BOOL FXJSE_Value_IsUTF8String(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsString();
+}
+
+FX_BOOL FXJSE_Value_IsNumber(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsNumber();
+}
+
+FX_BOOL FXJSE_Value_IsInteger(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsInteger();
+}
+
+FX_BOOL FXJSE_Value_IsObject(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsObject();
+}
+
+FX_BOOL FXJSE_Value_IsArray(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsArray();
+}
+
+FX_BOOL FXJSE_Value_IsFunction(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsFunction();
+}
+
+FX_BOOL FXJSE_Value_IsDate(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  return lpValue && lpValue->IsDate();
+}
+
+FX_BOOL FXJSE_Value_ToBoolean(FXJSE_HVALUE hValue) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToBoolean();
+}
+
+FX_FLOAT FXJSE_Value_ToFloat(FXJSE_HVALUE hValue) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToFloat();
+}
+
+FXJSE_DOUBLE FXJSE_Value_ToDouble(FXJSE_HVALUE hValue) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToDouble();
+}
+
+void FXJSE_Value_ToUTF8String(FXJSE_HVALUE hValue,
+                              CFX_ByteString& szStrOutput) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToString(szStrOutput);
+}
+
+int32_t FXJSE_Value_ToInteger(FXJSE_HVALUE hValue) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToInteger();
+}
+
+void* FXJSE_Value_ToObject(FXJSE_HVALUE hValue, FXJSE_HCLASS hClass) {
+  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
+  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToObject(lpClass);
+}
+
+void FXJSE_Value_SetUndefined(FXJSE_HVALUE hValue) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetUndefined();
+}
+
+void FXJSE_Value_SetNull(FXJSE_HVALUE hValue) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetNull();
+}
+
+void FXJSE_Value_SetBoolean(FXJSE_HVALUE hValue, FX_BOOL bBoolean) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetBoolean(bBoolean);
+}
+
+void FXJSE_Value_SetUTF8String(FXJSE_HVALUE hValue,
+                               const CFX_ByteStringC& szString) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetString(szString);
+}
+
+void FXJSE_Value_SetInteger(FXJSE_HVALUE hValue, int32_t nInteger) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetInteger(nInteger);
+}
+
+void FXJSE_Value_SetFloat(FXJSE_HVALUE hValue, FX_FLOAT fFloat) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetFloat(fFloat);
+}
+
+void FXJSE_Value_SetDouble(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetDouble(dDouble);
+}
+
+void FXJSE_Value_SetObject(FXJSE_HVALUE hValue,
+                           void* lpObject,
+                           FXJSE_HCLASS hClass) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
+  if (!lpClass) {
+    ASSERT(!lpObject);
+    lpValue->SetJSObject();
+  } else {
+    lpValue->SetHostObject(lpObject, lpClass);
+  }
+}
+
+void FXJSE_Value_SetArray(FXJSE_HVALUE hValue,
+                          uint32_t uValueCount,
+                          FXJSE_HVALUE* rgValues) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)
+      ->SetArray(uValueCount, reinterpret_cast<CFXJSE_Value**>(rgValues));
+}
+
+void FXJSE_Value_SetDate(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) {
+  reinterpret_cast<CFXJSE_Value*>(hValue)->SetDate(dDouble);
+}
+
+void FXJSE_Value_Set(FXJSE_HVALUE hValue, FXJSE_HVALUE hOriginalValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpOriginalValue =
+      reinterpret_cast<CFXJSE_Value*>(hOriginalValue);
+  ASSERT(lpValue && lpOriginalValue);
+  lpValue->Assign(lpOriginalValue);
+}
+
+FX_BOOL FXJSE_Value_GetObjectProp(FXJSE_HVALUE hValue,
+                                  const CFX_ByteStringC& szPropName,
+                                  FXJSE_HVALUE hPropValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
+  ASSERT(lpValue && lpPropValue);
+  return lpValue->GetObjectProperty(szPropName, lpPropValue);
+}
+
+FX_BOOL FXJSE_Value_SetObjectProp(FXJSE_HVALUE hValue,
+                                  const CFX_ByteStringC& szPropName,
+                                  FXJSE_HVALUE hPropValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
+  ASSERT(lpValue && lpPropValue);
+  return lpValue->SetObjectProperty(szPropName, lpPropValue);
+}
+
+FX_BOOL FXJSE_Value_GetObjectPropByIdx(FXJSE_HVALUE hValue,
+                                       uint32_t uPropIdx,
+                                       FXJSE_HVALUE hPropValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
+  ASSERT(lpValue && lpPropValue);
+  return lpValue->GetObjectProperty(uPropIdx, lpPropValue);
+}
+
+FX_BOOL FXJSE_Value_SetObjectPropByIdx(FXJSE_HVALUE hValue,
+                                       uint32_t uPropIdx,
+                                       FXJSE_HVALUE hPropValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
+  ASSERT(lpValue && lpPropValue);
+  return lpValue->SetObjectProperty(uPropIdx, lpPropValue);
+}
+
+FX_BOOL FXJSE_Value_DeleteObjectProp(FXJSE_HVALUE hValue,
+                                     const CFX_ByteStringC& szPropName) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)
+      ->DeleteObjectProperty(szPropName);
+}
+
+FX_BOOL FXJSE_Value_ObjectHasOwnProp(FXJSE_HVALUE hValue,
+                                     const CFX_ByteStringC& szPropName,
+                                     FX_BOOL bUseTypeGetter) {
+  return reinterpret_cast<CFXJSE_Value*>(hValue)
+      ->HasObjectOwnProperty(szPropName, bUseTypeGetter);
+}
+
+FX_BOOL FXJSE_Value_SetObjectOwnProp(FXJSE_HVALUE hValue,
+                                     const CFX_ByteStringC& szPropName,
+                                     FXJSE_HVALUE hPropValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
+  ASSERT(lpValue && lpPropValue);
+  return lpValue->SetObjectOwnProperty(szPropName, lpPropValue);
+}
+
+FX_BOOL FXJSE_Value_SetFunctionBind(FXJSE_HVALUE hValue,
+                                    FXJSE_HVALUE hOldFunction,
+                                    FXJSE_HVALUE hNewThis) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  CFXJSE_Value* lpOldFunction = reinterpret_cast<CFXJSE_Value*>(hOldFunction);
+  CFXJSE_Value* lpNewThis = reinterpret_cast<CFXJSE_Value*>(hNewThis);
+  ASSERT(lpValue && lpOldFunction && lpNewThis);
+  return lpValue->SetFunctionBind(lpOldFunction, lpNewThis);
+}
+
+FX_BOOL FXJSE_Value_CallFunction(FXJSE_HVALUE hFunction,
+                                 FXJSE_HVALUE hThis,
+                                 FXJSE_HVALUE hRetValue,
+                                 uint32_t nArgCount,
+                                 FXJSE_HVALUE* lpArgs) {
+  CFXJSE_Value* lpThis = reinterpret_cast<CFXJSE_Value*>(hThis);
+  CFXJSE_Value* lpRetValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
+  return reinterpret_cast<CFXJSE_Value*>(hFunction)
+      ->Call(lpThis, lpRetValue, nArgCount, lpArgs);
+}
+
+FXJSE_HVALUE FXJSE_Value_Create(FXJSE_HRUNTIME hRuntime) {
+  return reinterpret_cast<FXJSE_HVALUE>(
+      CFXJSE_Value::Create(reinterpret_cast<v8::Isolate*>(hRuntime)));
+}
+
+void FXJSE_Value_Release(FXJSE_HVALUE hValue) {
+  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
+  delete lpValue;
+}
+
+FXJSE_HRUNTIME FXJSE_Value_GetRuntime(FXJSE_HVALUE hValue) {
+  return reinterpret_cast<FXJSE_HRUNTIME>(
+      reinterpret_cast<CFXJSE_Value*>(hValue)->GetIsolate());
+}
+
+void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Name,
+                        const CFX_ByteStringC& utf8Message) {
+  v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
+  ASSERT(pIsolate);
+
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
+  v8::Local<v8::String> hMessage = v8::String::NewFromUtf8(
+      pIsolate, utf8Message.GetCStr(), v8::String::kNormalString,
+      utf8Message.GetLength());
+  v8::Local<v8::Value> hError;
+
+  if (utf8Name == "RangeError") {
+    hError = v8::Exception::RangeError(hMessage);
+  } else if (utf8Name == "ReferenceError") {
+    hError = v8::Exception::ReferenceError(hMessage);
+  } else if (utf8Name == "SyntaxError") {
+    hError = v8::Exception::SyntaxError(hMessage);
+  } else if (utf8Name == "TypeError") {
+    hError = v8::Exception::TypeError(hMessage);
+  } else {
+    hError = v8::Exception::Error(hMessage);
+    if (utf8Name != "Error" && !utf8Name.IsEmpty()) {
+      hError.As<v8::Object>()->Set(
+          v8::String::NewFromUtf8(pIsolate, "name"),
+          v8::String::NewFromUtf8(pIsolate, utf8Name.GetCStr(),
+                                  v8::String::kNormalString,
+                                  utf8Name.GetLength()));
+    }
+  }
+  pIsolate->ThrowException(hError);
+}
+
+CFXJSE_Value* CFXJSE_Value::Create(v8::Isolate* pIsolate) {
+  return new CFXJSE_Value(pIsolate);
+}
+
+void* CFXJSE_Value::ToObject(CFXJSE_Class* lpClass) const {
+  ASSERT(!m_hValue.IsEmpty());
+
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  ASSERT(!hValue.IsEmpty());
+
+  if (!hValue->IsObject())
+    return nullptr;
+
+  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), lpClass);
+}
+
+V8_INLINE static double FXJSE_ftod(FX_FLOAT fNumber) {
+  if (sizeof(FX_FLOAT) != 4) {
+    ASSERT(FALSE);
+    return fNumber;
+  }
+
+  uint32_t nFloatBits = (uint32_t&)fNumber;
+  uint8_t nExponent = (uint8_t)(nFloatBits >> 16 >> 7);
+  if (nExponent == 0 || nExponent == 255)
+    return fNumber;
+
+  int8_t nErrExp = nExponent - 127 - 23;
+  if (nErrExp >= 0)
+    return fNumber;
+
+  double dwError = pow(2.0, nErrExp), dwErrorHalf = dwError / 2;
+  double dNumber = fNumber, dNumberAbs = fabs(fNumber);
+  double dNumberAbsMin = dNumberAbs - dwErrorHalf,
+         dNumberAbsMax = dNumberAbs + dwErrorHalf;
+  int32_t iErrPos = 0;
+  if (floor(dNumberAbsMin) == floor(dNumberAbsMax)) {
+    dNumberAbsMin = fmod(dNumberAbsMin, 1.0);
+    dNumberAbsMax = fmod(dNumberAbsMax, 1.0);
+    int32_t iErrPosMin = 1, iErrPosMax = 38;
+    do {
+      int32_t iMid = (iErrPosMin + iErrPosMax) / 2;
+      double dPow = pow(10.0, iMid);
+      if (floor(dNumberAbsMin * dPow) == floor(dNumberAbsMax * dPow)) {
+        iErrPosMin = iMid + 1;
+      } else {
+        iErrPosMax = iMid;
+      }
+    } while (iErrPosMin < iErrPosMax);
+    iErrPos = iErrPosMax;
+  }
+  double dPow = pow(10.0, iErrPos);
+  return fNumber < 0 ? ceil(dNumber * dPow - 0.5) / dPow
+                     : floor(dNumber * dPow + 0.5) / dPow;
+}
+
+void CFXJSE_Value::SetFloat(FX_FLOAT fFloat) {
+  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+  v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, FXJSE_ftod(fFloat));
+  m_hValue.Reset(m_pIsolate, hValue);
+}
+
+void CFXJSE_Value::SetHostObject(void* lpObject, CFXJSE_Class* lpClass) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  ASSERT(lpClass);
+  v8::Local<v8::FunctionTemplate> hClass =
+      v8::Local<v8::FunctionTemplate>::New(m_pIsolate, lpClass->m_hTemplate);
+  v8::Local<v8::Object> hObject = hClass->InstanceTemplate()->NewInstance();
+  FXJSE_UpdateObjectBinding(hObject, lpObject);
+  m_hValue.Reset(m_pIsolate, hObject);
+}
+
+void CFXJSE_Value::SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Array> hArrayObject = v8::Array::New(m_pIsolate, uValueCount);
+  if (rgValues) {
+    for (uint32_t i = 0; i < uValueCount; i++) {
+      if (rgValues[i]) {
+        hArrayObject->Set(i, v8::Local<v8::Value>::New(
+                                 m_pIsolate, rgValues[i]->DirectGetValue()));
+      }
+    }
+  }
+  m_hValue.Reset(m_pIsolate, hArrayObject);
+}
+
+void CFXJSE_Value::SetDate(FXJSE_DOUBLE dDouble) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hDate = v8::Date::New(m_pIsolate, dDouble);
+  m_hValue.Reset(m_pIsolate, hDate);
+}
+
+FX_BOOL CFXJSE_Value::SetObjectProperty(const CFX_ByteStringC& szPropName,
+                                        CFXJSE_Value* lpPropValue) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::Value> hPropValue =
+      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->DirectGetValue());
+  return (FX_BOOL)hObject.As<v8::Object>()->Set(
+      v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(),
+                              v8::String::kNormalString,
+                              szPropName.GetLength()),
+      hPropValue);
+}
+
+FX_BOOL CFXJSE_Value::GetObjectProperty(const CFX_ByteStringC& szPropName,
+                                        CFXJSE_Value* lpPropValue) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::Value> hPropValue =
+      hObject.As<v8::Object>()->Get(v8::String::NewFromUtf8(
+          m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
+          szPropName.GetLength()));
+  lpPropValue->ForceSetValue(hPropValue);
+  return TRUE;
+}
+
+FX_BOOL CFXJSE_Value::SetObjectProperty(uint32_t uPropIdx,
+                                        CFXJSE_Value* lpPropValue) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::Value> hPropValue =
+      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->DirectGetValue());
+  return (FX_BOOL)hObject.As<v8::Object>()->Set(uPropIdx, hPropValue);
+}
+
+FX_BOOL CFXJSE_Value::GetObjectProperty(uint32_t uPropIdx,
+                                        CFXJSE_Value* lpPropValue) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::Value> hPropValue = hObject.As<v8::Object>()->Get(uPropIdx);
+  lpPropValue->ForceSetValue(hPropValue);
+  return TRUE;
+}
+
+FX_BOOL CFXJSE_Value::DeleteObjectProperty(const CFX_ByteStringC& szPropName) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  hObject.As<v8::Object>()->Delete(v8::String::NewFromUtf8(
+      m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
+      szPropName.GetLength()));
+  return TRUE;
+}
+
+FX_BOOL CFXJSE_Value::HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                                           FX_BOOL bUseTypeGetter) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::String> hKey = v8::String::NewFromUtf8(
+      m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
+      szPropName.GetLength());
+  return hObject.As<v8::Object>()->HasRealNamedProperty(hKey) ||
+         (bUseTypeGetter &&
+          hObject.As<v8::Object>()
+              ->HasOwnProperty(m_pIsolate->GetCurrentContext(), hKey)
+              .FromMaybe(false));
+}
+
+FX_BOOL CFXJSE_Value::SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                                           CFXJSE_Value* lpPropValue) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hObject =
+      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+  if (!hObject->IsObject())
+    return FALSE;
+
+  v8::Local<v8::Value> hValue =
+      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->m_hValue);
+  return hObject.As<v8::Object>()
+      ->DefineOwnProperty(
+          m_pIsolate->GetCurrentContext(),
+          v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(),
+                                  v8::String::kNormalString,
+                                  szPropName.GetLength()),
+          hValue)
+      .FromMaybe(false);
+}
+
+FX_BOOL CFXJSE_Value::SetFunctionBind(CFXJSE_Value* lpOldFunction,
+                                      CFXJSE_Value* lpNewThis) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> rgArgs[2];
+  v8::Local<v8::Value> hOldFunction =
+      v8::Local<v8::Value>::New(m_pIsolate, lpOldFunction->DirectGetValue());
+  if (hOldFunction.IsEmpty() || !hOldFunction->IsFunction())
+    return FALSE;
+
+  rgArgs[0] = hOldFunction;
+  v8::Local<v8::Value> hNewThis =
+      v8::Local<v8::Value>::New(m_pIsolate, lpNewThis->DirectGetValue());
+  if (hNewThis.IsEmpty())
+    return FALSE;
+
+  rgArgs[1] = hNewThis;
+  v8::Local<v8::String> hBinderFuncSource =
+      v8::String::NewFromUtf8(m_pIsolate,
+                              "(function (oldfunction, newthis) { return "
+                              "oldfunction.bind(newthis); })");
+  v8::Local<v8::Function> hBinderFunc =
+      v8::Script::Compile(hBinderFuncSource)->Run().As<v8::Function>();
+  v8::Local<v8::Value> hBoundFunction =
+      hBinderFunc->Call(m_pIsolate->GetCurrentContext()->Global(), 2, rgArgs);
+  if (hBoundFunction.IsEmpty() || !hBoundFunction->IsFunction())
+    return FALSE;
+
+  m_hValue.Reset(m_pIsolate, hBoundFunction);
+  return TRUE;
+}
+
+#define FXJSE_INVALID_PTR ((void*)(intptr_t)-1)
+FX_BOOL CFXJSE_Value::Call(CFXJSE_Value* lpReceiver,
+                           CFXJSE_Value* lpRetValue,
+                           uint32_t nArgCount,
+                           FXJSE_HVALUE* lpArgs) {
+  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+  v8::Local<v8::Value> hFunctionValue =
+      v8::Local<v8::Value>::New(m_pIsolate, DirectGetValue());
+  v8::Local<v8::Object> hFunctionObject =
+      !hFunctionValue.IsEmpty() && hFunctionValue->IsObject()
+          ? hFunctionValue.As<v8::Object>()
+          : v8::Local<v8::Object>();
+
+  v8::TryCatch trycatch(m_pIsolate);
+  if (hFunctionObject.IsEmpty() || !hFunctionObject->IsCallable()) {
+    if (lpRetValue)
+      lpRetValue->ForceSetValue(FXJSE_CreateReturnValue(m_pIsolate, trycatch));
+    return FALSE;
+  }
+
+  v8::Local<v8::Value> hReturnValue;
+  v8::Local<v8::Value>* lpLocalArgs = NULL;
+  if (nArgCount) {
+    lpLocalArgs = FX_Alloc(v8::Local<v8::Value>, nArgCount);
+    for (uint32_t i = 0; i < nArgCount; i++) {
+      new (lpLocalArgs + i) v8::Local<v8::Value>;
+      CFXJSE_Value* lpArg = (CFXJSE_Value*)lpArgs[i];
+      if (lpArg) {
+        lpLocalArgs[i] =
+            v8::Local<v8::Value>::New(m_pIsolate, lpArg->DirectGetValue());
+      }
+      if (lpLocalArgs[i].IsEmpty()) {
+        lpLocalArgs[i] = v8::Undefined(m_pIsolate);
+      }
+    }
+  }
+
+  FX_BOOL bRetValue = TRUE;
+  if (lpReceiver == FXJSE_INVALID_PTR) {
+    v8::MaybeLocal<v8::Value> maybe_retvalue =
+        hFunctionObject->CallAsConstructor(m_pIsolate->GetCurrentContext(),
+                                           nArgCount, lpLocalArgs);
+    hReturnValue = maybe_retvalue.FromMaybe(v8::Local<v8::Value>());
+  } else {
+    v8::Local<v8::Value> hReceiver;
+    if (lpReceiver) {
+      hReceiver =
+          v8::Local<v8::Value>::New(m_pIsolate, lpReceiver->DirectGetValue());
+    }
+    if (hReceiver.IsEmpty() || !hReceiver->IsObject())
+      hReceiver = v8::Object::New(m_pIsolate);
+
+    v8::MaybeLocal<v8::Value> maybe_retvalue = hFunctionObject->CallAsFunction(
+        m_pIsolate->GetCurrentContext(), hReceiver, nArgCount, lpLocalArgs);
+    hReturnValue = maybe_retvalue.FromMaybe(v8::Local<v8::Value>());
+  }
+
+  if (trycatch.HasCaught()) {
+    hReturnValue = FXJSE_CreateReturnValue(m_pIsolate, trycatch);
+    bRetValue = FALSE;
+  }
+
+  if (lpRetValue)
+    lpRetValue->ForceSetValue(hReturnValue);
+
+  if (lpLocalArgs) {
+    for (uint32_t i = 0; i < nArgCount; i++)
+      lpLocalArgs[i].~Local();
+    FX_Free(lpLocalArgs);
+  }
+  return bRetValue;
+}
diff --git a/xfa/fxjse/value.h b/xfa/fxjse/value.h
new file mode 100644
index 0000000..7e140d7
--- /dev/null
+++ b/xfa/fxjse/value.h
@@ -0,0 +1,241 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FXJSE_VALUE_H_
+#define XFA_FXJSE_VALUE_H_
+
+#include "xfa/fxjse/scope_inline.h"
+
+class CFXJSE_Value {
+ public:
+  CFXJSE_Value(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
+
+ protected:
+  CFXJSE_Value();
+  CFXJSE_Value(const CFXJSE_Value&);
+  CFXJSE_Value& operator=(const CFXJSE_Value&);
+
+ public:
+  V8_INLINE FX_BOOL IsUndefined() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsUndefined();
+  }
+  V8_INLINE FX_BOOL IsNull() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsNull();
+  }
+  V8_INLINE FX_BOOL IsBoolean() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsBoolean();
+  }
+  V8_INLINE FX_BOOL IsString() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsString();
+  }
+  V8_INLINE FX_BOOL IsNumber() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsNumber();
+  }
+  V8_INLINE FX_BOOL IsInteger() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsInt32();
+  }
+  V8_INLINE FX_BOOL IsObject() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsObject();
+  }
+  V8_INLINE FX_BOOL IsArray() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsArray();
+  }
+  V8_INLINE FX_BOOL IsFunction() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsFunction();
+  }
+  V8_INLINE FX_BOOL IsDate() const {
+    if (m_hValue.IsEmpty()) {
+      return FALSE;
+    }
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return hValue->IsDate();
+  }
+
+ public:
+  V8_INLINE FX_BOOL ToBoolean() const {
+    ASSERT(!m_hValue.IsEmpty());
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return static_cast<FX_BOOL>(hValue->BooleanValue());
+  }
+  V8_INLINE FX_FLOAT ToFloat() const {
+    ASSERT(!m_hValue.IsEmpty());
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return static_cast<FX_FLOAT>(hValue->NumberValue());
+  }
+  V8_INLINE FXJSE_DOUBLE ToDouble() const {
+    ASSERT(!m_hValue.IsEmpty());
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return static_cast<FXJSE_DOUBLE>(hValue->NumberValue());
+  }
+  V8_INLINE int32_t ToInteger() const {
+    ASSERT(!m_hValue.IsEmpty());
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    return static_cast<int32_t>(hValue->NumberValue());
+  }
+  V8_INLINE void ToString(CFX_ByteString& szStrOutput) const {
+    ASSERT(!m_hValue.IsEmpty());
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
+    v8::Local<v8::String> hString = hValue->ToString();
+    v8::String::Utf8Value hStringVal(hString);
+    szStrOutput = *hStringVal;
+  }
+  void* ToObject(CFXJSE_Class* lpClass) const;
+
+ public:
+  V8_INLINE void SetUndefined() {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::Undefined(m_pIsolate);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetNull() {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::Null(m_pIsolate);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetBoolean(FX_BOOL bBoolean) {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue =
+        v8::Boolean::New(m_pIsolate, bBoolean != FALSE);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetInteger(int32_t nInteger) {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::Integer::New(m_pIsolate, nInteger);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetDouble(FXJSE_DOUBLE dDouble) {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, dDouble);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetString(const CFX_ByteStringC& szString) {
+    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::String::NewFromUtf8(
+        m_pIsolate, reinterpret_cast<const char*>(szString.GetPtr()),
+        v8::String::kNormalString, szString.GetLength());
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void SetFloat(FX_FLOAT fFloat);
+  V8_INLINE void SetJSObject() {
+    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
+    v8::Local<v8::Value> hValue = v8::Object::New(m_pIsolate);
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  void SetHostObject(void* lpObject, CFXJSE_Class* lpClass);
+  void SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues);
+  void SetDate(FXJSE_DOUBLE dDouble);
+
+ public:
+  FX_BOOL GetObjectProperty(const CFX_ByteStringC& szPropName,
+                            CFXJSE_Value* lpPropValue);
+  FX_BOOL SetObjectProperty(const CFX_ByteStringC& szPropName,
+                            CFXJSE_Value* lpPropValue);
+  FX_BOOL GetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
+  FX_BOOL SetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
+  FX_BOOL DeleteObjectProperty(const CFX_ByteStringC& szPropName);
+  FX_BOOL HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                               FX_BOOL bUseTypeGetter);
+  FX_BOOL SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
+                               CFXJSE_Value* lpPropValue);
+  FX_BOOL SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis);
+  FX_BOOL Call(CFXJSE_Value* lpReceiver,
+               CFXJSE_Value* lpRetValue,
+               uint32_t nArgCount,
+               FXJSE_HVALUE* lpArgs);
+
+ public:
+  V8_INLINE v8::Isolate* GetIsolate() const { return m_pIsolate; }
+  V8_INLINE const v8::Global<v8::Value>& DirectGetValue() const {
+    return m_hValue;
+  }
+  V8_INLINE void ForceSetValue(v8::Local<v8::Value> hValue) {
+    m_hValue.Reset(m_pIsolate, hValue);
+  }
+  V8_INLINE void Assign(const CFXJSE_Value* lpValue) {
+    if (lpValue) {
+      m_hValue.Reset(m_pIsolate, lpValue->m_hValue);
+    } else {
+      m_hValue.Reset();
+    }
+  }
+
+ public:
+  static CFXJSE_Value* Create(v8::Isolate* pIsolate);
+
+ protected:
+  v8::Isolate* m_pIsolate;
+  v8::Global<v8::Value> m_hValue;
+  friend class CFXJSE_Context;
+  friend class CFXJSE_Class;
+};
+
+#endif  // XFA_FXJSE_VALUE_H_
diff --git a/xfa/include/fwl/basewidget/fwl_picturebox.h b/xfa/include/fwl/basewidget/fwl_picturebox.h
index be99949..123607a 100644
--- a/xfa/include/fwl/basewidget/fwl_picturebox.h
+++ b/xfa/include/fwl/basewidget/fwl_picturebox.h
@@ -7,7 +7,7 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FWL_PICTUREBOX_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FWL_PICTUREBOX_H_
 
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
 
 #define FWL_CLASS_PictureBox L"FWL_PICTUREBOX"
 #define FWL_CLASSHASH_PictureBox 2974721741
diff --git a/xfa/include/fwl/basewidget/fwl_pushbutton.h b/xfa/include/fwl/basewidget/fwl_pushbutton.h
index ffc05c2..28f9df4 100644
--- a/xfa/include/fwl/basewidget/fwl_pushbutton.h
+++ b/xfa/include/fwl/basewidget/fwl_pushbutton.h
@@ -7,8 +7,8 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FWL_PUSHBUTTON_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FWL_PUSHBUTTON_H_
 
+#include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
 
 #define FWL_CLASS_PushButton L"FWL_PUSHBUTTON"
 #define FWL_CLASSHASH_PushButton 3521614244
diff --git a/xfa/include/fwl/basewidget/fwl_scrollbar.h b/xfa/include/fwl/basewidget/fwl_scrollbar.h
index 461e675..8cd69bc 100644
--- a/xfa/include/fwl/basewidget/fwl_scrollbar.h
+++ b/xfa/include/fwl/basewidget/fwl_scrollbar.h
@@ -7,7 +7,7 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FWL_SCROLLBAR_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FWL_SCROLLBAR_H_
 
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
 
 #define FWL_CLASS_ScrollBar L"FWL_SCROLLBAR"
 #define FWL_CLASSHASH_ScrollBar 2826584844
diff --git a/xfa/include/fwl/basewidget/fwl_spinbutton.h b/xfa/include/fwl/basewidget/fwl_spinbutton.h
index 17f4895..fdd27c6 100644
--- a/xfa/include/fwl/basewidget/fwl_spinbutton.h
+++ b/xfa/include/fwl/basewidget/fwl_spinbutton.h
@@ -7,7 +7,7 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FWL_SPINBUTTON_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FWL_SPINBUTTON_H_
 
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
 
 #define FWL_CLASS_SpinButton L"FWL_SPINBUTTON"
 #define FWL_CLASSHASH_SpinButton 3793043646
diff --git a/xfa/include/fwl/core/fwl_content.h b/xfa/include/fwl/core/fwl_content.h
index 5801bd3..10d6c1e 100644
--- a/xfa/include/fwl/core/fwl_content.h
+++ b/xfa/include/fwl/core/fwl_content.h
@@ -7,7 +7,7 @@
 #ifndef XFA_INCLUDE_FWL_CORE_FWL_CONTENT_H_
 #define XFA_INCLUDE_FWL_CORE_FWL_CONTENT_H_
 
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
 
 class IFWL_Content : public IFWL_Widget {
  public:
diff --git a/xfa/include/fwl/core/fwl_panel.h b/xfa/include/fwl/core/fwl_panel.h
index 462112c..4e0b7a3 100644
--- a/xfa/include/fwl/core/fwl_panel.h
+++ b/xfa/include/fwl/core/fwl_panel.h
@@ -7,7 +7,7 @@
 #ifndef XFA_INCLUDE_FWL_CORE_FWL_PANEL_H_
 #define XFA_INCLUDE_FWL_CORE_FWL_PANEL_H_
 
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
+#include "xfa/fwl/core/fwl_widgetimp.h"
 
 class IFWL_Content;
 
diff --git a/xfa/include/fxfa/fxfa_objectacc.h b/xfa/include/fxfa/fxfa_objectacc.h
index 7938b2e..6f111b0 100644
--- a/xfa/include/fxfa/fxfa_objectacc.h
+++ b/xfa/include/fxfa/fxfa_objectacc.h
@@ -8,7 +8,7 @@
 #define XFA_INCLUDE_FXFA_FXFA_OBJECTACC_H_
 
 #include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
+#include "xfa/fxfa/parser/xfa_object.h"
 
 class CXFA_Node;
 class IFX_Locale;
diff --git a/xfa/src/fde/css/fde_css.h b/xfa/src/fde/css/fde_css.h
deleted file mode 100644
index 1e62b66..0000000
--- a/xfa/src/fde/css/fde_css.h
+++ /dev/null
@@ -1,1082 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSS_H_
-#define XFA_SRC_FDE_CSS_FDE_CSS_H_
-
-#include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-class IFDE_CSSValue;
-class IFDE_CSSValueList;
-class IFDE_CSSDeclaration;
-class IFDE_CSSSelector;
-class IFDE_CSSRule;
-class IFDE_CSSStyleSheet;
-class IFDE_CSSStyleSheetCache;
-class IFDE_CSSSyntaxParser;
-class IFDE_CSSRubyStyle;
-class IFDE_CSSMultiColumnStyle;
-class IFDE_CSSGeneratedContentStyle;
-class IFDE_CSSFontStyle;
-class IFDE_CSSBoundaryStyle;
-class IFDE_CSSPositionStyle;
-class IFDE_CSSParagraphStyle;
-class IFDE_CSSBackgroundStyle;
-class IFDE_CSSListStyle;
-class IFDE_CSSTableStyle;
-class IFDE_CSSVisualStyle;
-class IFDE_CSSComputedStyle;
-class IFDE_CSSTagProvider;
-class IFDE_CSSAccelerator;
-class IFDE_CSSStyleSelector;
-
-enum FDE_CSSVALUETYPE {
-  FDE_CSSVALUETYPE_Primitive = 1,
-  FDE_CSSVALUETYPE_List = 2,
-  FDE_CSSVALUETYPE_Shorthand,
-};
-enum FDE_CSSPRIMITIVETYPE {
-  FDE_CSSPRIMITIVETYPE_Unknown = 0,
-  FDE_CSSPRIMITIVETYPE_Number = 1,
-  FDE_CSSPRIMITIVETYPE_Percent = 2,
-  FDE_CSSPRIMITIVETYPE_EMS = 3,
-  FDE_CSSPRIMITIVETYPE_EXS = 4,
-  FDE_CSSPRIMITIVETYPE_PX = 5,
-  FDE_CSSPRIMITIVETYPE_CM = 6,
-  FDE_CSSPRIMITIVETYPE_MM = 7,
-  FDE_CSSPRIMITIVETYPE_IN = 8,
-  FDE_CSSPRIMITIVETYPE_PT = 9,
-  FDE_CSSPRIMITIVETYPE_PC = 10,
-  FDE_CSSPRIMITIVETYPE_String = 19,
-  FDE_CSSPRIMITIVETYPE_URI = 20,
-  FDE_CSSPRIMITIVETYPE_RGB = 25,
-  FDE_CSSPRIMITIVETYPE_Enum,
-  FDE_CSSPRIMITIVETYPE_Function,
-};
-enum FDE_CSSPROPERTYVALUE {
-  FDE_CSSPROPERTYVALUE_Bolder,
-  FDE_CSSPROPERTYVALUE_LowerLatin,
-  FDE_CSSPROPERTYVALUE_Lowercase,
-  FDE_CSSPROPERTYVALUE_LowerGreek,
-  FDE_CSSPROPERTYVALUE_Sesame,
-  FDE_CSSPROPERTYVALUE_None,
-  FDE_CSSPROPERTYVALUE_NwResize,
-  FDE_CSSPROPERTYVALUE_WResize,
-  FDE_CSSPROPERTYVALUE_Dot,
-  FDE_CSSPROPERTYVALUE_End,
-  FDE_CSSPROPERTYVALUE_Ltr,
-  FDE_CSSPROPERTYVALUE_Pre,
-  FDE_CSSPROPERTYVALUE_Rtl,
-  FDE_CSSPROPERTYVALUE_Sub,
-  FDE_CSSPROPERTYVALUE_Top,
-  FDE_CSSPROPERTYVALUE_Visible,
-  FDE_CSSPROPERTYVALUE_Filled,
-  FDE_CSSPROPERTYVALUE_SwResize,
-  FDE_CSSPROPERTYVALUE_NoRepeat,
-  FDE_CSSPROPERTYVALUE_Default,
-  FDE_CSSPROPERTYVALUE_Transparent,
-  FDE_CSSPROPERTYVALUE_Ridge,
-  FDE_CSSPROPERTYVALUE_Right,
-  FDE_CSSPROPERTYVALUE_HorizontalTb,
-  FDE_CSSPROPERTYVALUE_DistributeLetter,
-  FDE_CSSPROPERTYVALUE_DoubleCircle,
-  FDE_CSSPROPERTYVALUE_Ruby,
-  FDE_CSSPROPERTYVALUE_Collapse,
-  FDE_CSSPROPERTYVALUE_Normal,
-  FDE_CSSPROPERTYVALUE_Avoid,
-  FDE_CSSPROPERTYVALUE_UpperRoman,
-  FDE_CSSPROPERTYVALUE_Auto,
-  FDE_CSSPROPERTYVALUE_Text,
-  FDE_CSSPROPERTYVALUE_XSmall,
-  FDE_CSSPROPERTYVALUE_Thin,
-  FDE_CSSPROPERTYVALUE_Repeat,
-  FDE_CSSPROPERTYVALUE_Small,
-  FDE_CSSPROPERTYVALUE_NeResize,
-  FDE_CSSPROPERTYVALUE_NoContent,
-  FDE_CSSPROPERTYVALUE_Outside,
-  FDE_CSSPROPERTYVALUE_EResize,
-  FDE_CSSPROPERTYVALUE_TableRow,
-  FDE_CSSPROPERTYVALUE_Bottom,
-  FDE_CSSPROPERTYVALUE_Underline,
-  FDE_CSSPROPERTYVALUE_CjkIdeographic,
-  FDE_CSSPROPERTYVALUE_SeResize,
-  FDE_CSSPROPERTYVALUE_Fixed,
-  FDE_CSSPROPERTYVALUE_Double,
-  FDE_CSSPROPERTYVALUE_Solid,
-  FDE_CSSPROPERTYVALUE_RubyBaseGroup,
-  FDE_CSSPROPERTYVALUE_OpenQuote,
-  FDE_CSSPROPERTYVALUE_Lighter,
-  FDE_CSSPROPERTYVALUE_LowerRoman,
-  FDE_CSSPROPERTYVALUE_Strict,
-  FDE_CSSPROPERTYVALUE_TableCaption,
-  FDE_CSSPROPERTYVALUE_Oblique,
-  FDE_CSSPROPERTYVALUE_Decimal,
-  FDE_CSSPROPERTYVALUE_Loose,
-  FDE_CSSPROPERTYVALUE_Hebrew,
-  FDE_CSSPROPERTYVALUE_Hidden,
-  FDE_CSSPROPERTYVALUE_Dashed,
-  FDE_CSSPROPERTYVALUE_Embed,
-  FDE_CSSPROPERTYVALUE_TableRowGroup,
-  FDE_CSSPROPERTYVALUE_TableColumn,
-  FDE_CSSPROPERTYVALUE_Static,
-  FDE_CSSPROPERTYVALUE_Outset,
-  FDE_CSSPROPERTYVALUE_DecimalLeadingZero,
-  FDE_CSSPROPERTYVALUE_KeepWords,
-  FDE_CSSPROPERTYVALUE_KatakanaIroha,
-  FDE_CSSPROPERTYVALUE_Super,
-  FDE_CSSPROPERTYVALUE_Center,
-  FDE_CSSPROPERTYVALUE_TableHeaderGroup,
-  FDE_CSSPROPERTYVALUE_Inside,
-  FDE_CSSPROPERTYVALUE_XxLarge,
-  FDE_CSSPROPERTYVALUE_Triangle,
-  FDE_CSSPROPERTYVALUE_RubyTextGroup,
-  FDE_CSSPROPERTYVALUE_Circle,
-  FDE_CSSPROPERTYVALUE_Hiragana,
-  FDE_CSSPROPERTYVALUE_RepeatX,
-  FDE_CSSPROPERTYVALUE_RepeatY,
-  FDE_CSSPROPERTYVALUE_Move,
-  FDE_CSSPROPERTYVALUE_HiraganaIroha,
-  FDE_CSSPROPERTYVALUE_RubyBase,
-  FDE_CSSPROPERTYVALUE_Scroll,
-  FDE_CSSPROPERTYVALUE_Smaller,
-  FDE_CSSPROPERTYVALUE_TableFooterGroup,
-  FDE_CSSPROPERTYVALUE_Baseline,
-  FDE_CSSPROPERTYVALUE_Separate,
-  FDE_CSSPROPERTYVALUE_Armenian,
-  FDE_CSSPROPERTYVALUE_Open,
-  FDE_CSSPROPERTYVALUE_Relative,
-  FDE_CSSPROPERTYVALUE_Thick,
-  FDE_CSSPROPERTYVALUE_Justify,
-  FDE_CSSPROPERTYVALUE_Middle,
-  FDE_CSSPROPERTYVALUE_Always,
-  FDE_CSSPROPERTYVALUE_DistributeSpace,
-  FDE_CSSPROPERTYVALUE_LineEdge,
-  FDE_CSSPROPERTYVALUE_PreWrap,
-  FDE_CSSPROPERTYVALUE_Medium,
-  FDE_CSSPROPERTYVALUE_NResize,
-  FDE_CSSPROPERTYVALUE_ListItem,
-  FDE_CSSPROPERTYVALUE_Show,
-  FDE_CSSPROPERTYVALUE_Currentcolor,
-  FDE_CSSPROPERTYVALUE_NoCloseQuote,
-  FDE_CSSPROPERTYVALUE_VerticalLr,
-  FDE_CSSPROPERTYVALUE_VerticalRl,
-  FDE_CSSPROPERTYVALUE_Pointer,
-  FDE_CSSPROPERTYVALUE_XxSmall,
-  FDE_CSSPROPERTYVALUE_Bold,
-  FDE_CSSPROPERTYVALUE_Both,
-  FDE_CSSPROPERTYVALUE_SmallCaps,
-  FDE_CSSPROPERTYVALUE_Katakana,
-  FDE_CSSPROPERTYVALUE_After,
-  FDE_CSSPROPERTYVALUE_Horizontal,
-  FDE_CSSPROPERTYVALUE_Dotted,
-  FDE_CSSPROPERTYVALUE_Disc,
-  FDE_CSSPROPERTYVALUE_Georgian,
-  FDE_CSSPROPERTYVALUE_Inline,
-  FDE_CSSPROPERTYVALUE_Overline,
-  FDE_CSSPROPERTYVALUE_Wait,
-  FDE_CSSPROPERTYVALUE_BreakAll,
-  FDE_CSSPROPERTYVALUE_UpperAlpha,
-  FDE_CSSPROPERTYVALUE_Capitalize,
-  FDE_CSSPROPERTYVALUE_Nowrap,
-  FDE_CSSPROPERTYVALUE_TextBottom,
-  FDE_CSSPROPERTYVALUE_NoOpenQuote,
-  FDE_CSSPROPERTYVALUE_Groove,
-  FDE_CSSPROPERTYVALUE_Progress,
-  FDE_CSSPROPERTYVALUE_Larger,
-  FDE_CSSPROPERTYVALUE_CloseQuote,
-  FDE_CSSPROPERTYVALUE_TableCell,
-  FDE_CSSPROPERTYVALUE_PreLine,
-  FDE_CSSPROPERTYVALUE_Absolute,
-  FDE_CSSPROPERTYVALUE_InlineTable,
-  FDE_CSSPROPERTYVALUE_BidiOverride,
-  FDE_CSSPROPERTYVALUE_InlineBlock,
-  FDE_CSSPROPERTYVALUE_Inset,
-  FDE_CSSPROPERTYVALUE_Crosshair,
-  FDE_CSSPROPERTYVALUE_UpperLatin,
-  FDE_CSSPROPERTYVALUE_Help,
-  FDE_CSSPROPERTYVALUE_Hide,
-  FDE_CSSPROPERTYVALUE_Uppercase,
-  FDE_CSSPROPERTYVALUE_SResize,
-  FDE_CSSPROPERTYVALUE_Table,
-  FDE_CSSPROPERTYVALUE_Blink,
-  FDE_CSSPROPERTYVALUE_Block,
-  FDE_CSSPROPERTYVALUE_Start,
-  FDE_CSSPROPERTYVALUE_TableColumnGroup,
-  FDE_CSSPROPERTYVALUE_Italic,
-  FDE_CSSPROPERTYVALUE_LineThrough,
-  FDE_CSSPROPERTYVALUE_KeepAll,
-  FDE_CSSPROPERTYVALUE_LowerAlpha,
-  FDE_CSSPROPERTYVALUE_RunIn,
-  FDE_CSSPROPERTYVALUE_Square,
-  FDE_CSSPROPERTYVALUE_XLarge,
-  FDE_CSSPROPERTYVALUE_Large,
-  FDE_CSSPROPERTYVALUE_Before,
-  FDE_CSSPROPERTYVALUE_Left,
-  FDE_CSSPROPERTYVALUE_TextTop,
-  FDE_CSSPROPERTYVALUE_RubyText,
-  FDE_CSSPROPERTYVALUE_NoDisplay,
-  FDE_CSSPROPERTYVALUE_MAX
-};
-class IFDE_CSSValue {
- public:
-  virtual ~IFDE_CSSValue() {}
-  virtual FDE_CSSVALUETYPE GetType() const = 0;
-};
-class IFDE_CSSPrimitiveValue : public IFDE_CSSValue {
- public:
-  virtual FDE_CSSVALUETYPE GetType() const {
-    return FDE_CSSVALUETYPE_Primitive;
-  }
-  virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const = 0;
-  virtual FX_ARGB GetRGBColor() const = 0;
-  virtual FX_FLOAT GetFloat() const = 0;
-  virtual const FX_WCHAR* GetString(int32_t& iLength) const = 0;
-  virtual FDE_CSSPROPERTYVALUE GetEnum() const = 0;
-  virtual const FX_WCHAR* GetFuncName() const = 0;
-  virtual int32_t CountArgs() const = 0;
-  virtual IFDE_CSSValue* GetArgs(int32_t index) const = 0;
-};
-class IFDE_CSSValueList : public IFDE_CSSValue {
- public:
-  virtual FDE_CSSVALUETYPE GetType() const { return FDE_CSSVALUETYPE_List; }
-  virtual int32_t CountValues() const = 0;
-  virtual IFDE_CSSValue* GetValue(int32_t index) const = 0;
-};
-enum FDE_CSSPROPERTY {
-  FDE_CSSPROPERTY_WritingMode,
-  FDE_CSSPROPERTY_ColumnRuleWidth,
-  FDE_CSSPROPERTY_BorderLeft,
-  FDE_CSSPROPERTY_ColumnRule,
-  FDE_CSSPROPERTY_Height,
-  FDE_CSSPROPERTY_CounterReset,
-  FDE_CSSPROPERTY_Content,
-  FDE_CSSPROPERTY_RubyPosition,
-  FDE_CSSPROPERTY_BackgroundColor,
-  FDE_CSSPROPERTY_Width,
-  FDE_CSSPROPERTY_Src,
-  FDE_CSSPROPERTY_Top,
-  FDE_CSSPROPERTY_Margin,
-  FDE_CSSPROPERTY_BorderColor,
-  FDE_CSSPROPERTY_Widows,
-  FDE_CSSPROPERTY_BorderBottomColor,
-  FDE_CSSPROPERTY_TextIndent,
-  FDE_CSSPROPERTY_Right,
-  FDE_CSSPROPERTY_TextEmphasisStyle,
-  FDE_CSSPROPERTY_PaddingLeft,
-  FDE_CSSPROPERTY_ColumnWidth,
-  FDE_CSSPROPERTY_MarginLeft,
-  FDE_CSSPROPERTY_Border,
-  FDE_CSSPROPERTY_BorderTop,
-  FDE_CSSPROPERTY_RubyOverhang,
-  FDE_CSSPROPERTY_PageBreakBefore,
-  FDE_CSSPROPERTY_MaxHeight,
-  FDE_CSSPROPERTY_MinWidth,
-  FDE_CSSPROPERTY_BorderLeftColor,
-  FDE_CSSPROPERTY_Bottom,
-  FDE_CSSPROPERTY_Quotes,
-  FDE_CSSPROPERTY_MaxWidth,
-  FDE_CSSPROPERTY_PaddingRight,
-  FDE_CSSPROPERTY_ListStyleImage,
-  FDE_CSSPROPERTY_WhiteSpace,
-  FDE_CSSPROPERTY_BorderBottom,
-  FDE_CSSPROPERTY_ListStyleType,
-  FDE_CSSPROPERTY_WordBreak,
-  FDE_CSSPROPERTY_OverflowX,
-  FDE_CSSPROPERTY_OverflowY,
-  FDE_CSSPROPERTY_BorderTopColor,
-  FDE_CSSPROPERTY_FontFamily,
-  FDE_CSSPROPERTY_Cursor,
-  FDE_CSSPROPERTY_RubyAlign,
-  FDE_CSSPROPERTY_ColumnRuleColor,
-  FDE_CSSPROPERTY_FontWeight,
-  FDE_CSSPROPERTY_BorderRightStyle,
-  FDE_CSSPROPERTY_MinHeight,
-  FDE_CSSPROPERTY_Color,
-  FDE_CSSPROPERTY_LetterSpacing,
-  FDE_CSSPROPERTY_EmptyCells,
-  FDE_CSSPROPERTY_TextAlign,
-  FDE_CSSPROPERTY_RubySpan,
-  FDE_CSSPROPERTY_Position,
-  FDE_CSSPROPERTY_BorderStyle,
-  FDE_CSSPROPERTY_BorderBottomStyle,
-  FDE_CSSPROPERTY_BorderCollapse,
-  FDE_CSSPROPERTY_ColumnCount,
-  FDE_CSSPROPERTY_BorderRightWidth,
-  FDE_CSSPROPERTY_UnicodeBidi,
-  FDE_CSSPROPERTY_VerticalAlign,
-  FDE_CSSPROPERTY_PaddingTop,
-  FDE_CSSPROPERTY_Columns,
-  FDE_CSSPROPERTY_Overflow,
-  FDE_CSSPROPERTY_TableLayout,
-  FDE_CSSPROPERTY_FontVariant,
-  FDE_CSSPROPERTY_ListStyle,
-  FDE_CSSPROPERTY_BackgroundPosition,
-  FDE_CSSPROPERTY_BorderWidth,
-  FDE_CSSPROPERTY_TextEmphasisColor,
-  FDE_CSSPROPERTY_BorderLeftStyle,
-  FDE_CSSPROPERTY_PageBreakInside,
-  FDE_CSSPROPERTY_TextEmphasis,
-  FDE_CSSPROPERTY_BorderBottomWidth,
-  FDE_CSSPROPERTY_ColumnGap,
-  FDE_CSSPROPERTY_Orphans,
-  FDE_CSSPROPERTY_BorderRight,
-  FDE_CSSPROPERTY_FontSize,
-  FDE_CSSPROPERTY_PageBreakAfter,
-  FDE_CSSPROPERTY_CaptionSide,
-  FDE_CSSPROPERTY_BackgroundRepeat,
-  FDE_CSSPROPERTY_BorderTopStyle,
-  FDE_CSSPROPERTY_BorderSpacing,
-  FDE_CSSPROPERTY_TextTransform,
-  FDE_CSSPROPERTY_FontStyle,
-  FDE_CSSPROPERTY_Font,
-  FDE_CSSPROPERTY_LineHeight,
-  FDE_CSSPROPERTY_MarginRight,
-  FDE_CSSPROPERTY_Float,
-  FDE_CSSPROPERTY_BorderLeftWidth,
-  FDE_CSSPROPERTY_Display,
-  FDE_CSSPROPERTY_Clear,
-  FDE_CSSPROPERTY_ColumnRuleStyle,
-  FDE_CSSPROPERTY_TextCombine,
-  FDE_CSSPROPERTY_ListStylePosition,
-  FDE_CSSPROPERTY_Visibility,
-  FDE_CSSPROPERTY_PaddingBottom,
-  FDE_CSSPROPERTY_BackgroundAttachment,
-  FDE_CSSPROPERTY_BackgroundImage,
-  FDE_CSSPROPERTY_LineBreak,
-  FDE_CSSPROPERTY_Background,
-  FDE_CSSPROPERTY_BorderTopWidth,
-  FDE_CSSPROPERTY_WordSpacing,
-  FDE_CSSPROPERTY_BorderRightColor,
-  FDE_CSSPROPERTY_CounterIncrement,
-  FDE_CSSPROPERTY_Left,
-  FDE_CSSPROPERTY_TextDecoration,
-  FDE_CSSPROPERTY_Padding,
-  FDE_CSSPROPERTY_MarginBottom,
-  FDE_CSSPROPERTY_MarginTop,
-  FDE_CSSPROPERTY_Direction,
-  FDE_CSSPROPERTY_MAX
-};
-class IFDE_CSSDeclaration {
- public:
-  virtual ~IFDE_CSSDeclaration() {}
-  virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty,
-                                     FX_BOOL& bImportant) const = 0;
-  virtual FX_POSITION GetStartPosition() const = 0;
-  virtual void GetNextProperty(FX_POSITION& pos,
-                               FDE_CSSPROPERTY& eProperty,
-                               IFDE_CSSValue*& pValue,
-                               FX_BOOL& bImportant) const = 0;
-  virtual FX_POSITION GetStartCustom() const = 0;
-  virtual void GetNextCustom(FX_POSITION& pos,
-                             CFX_WideString& wsName,
-                             CFX_WideString& wsValue) const = 0;
-};
-typedef CFX_ArrayTemplate<IFDE_CSSDeclaration*> CFDE_CSSDeclarationArray;
-enum FDE_CSSPERSUDO {
-  FDE_CSSPERSUDO_After,
-  FDE_CSSPERSUDO_Before,
-  FDE_CSSPERSUDO_NONE
-};
-enum FDE_CSSSELECTORTYPE {
-  FDE_CSSSELECTORTYPE_Element,
-  FDE_CSSSELECTORTYPE_Descendant,
-  FDE_CSSSELECTORTYPE_Class,
-  FDE_CSSSELECTORTYPE_Persudo,
-  FDE_CSSSELECTORTYPE_ID,
-};
-class IFDE_CSSSelector {
- public:
-  virtual ~IFDE_CSSSelector() {}
-  virtual FDE_CSSSELECTORTYPE GetType() const = 0;
-  virtual FX_DWORD GetNameHash() const = 0;
-  virtual IFDE_CSSSelector* GetNextSelector() const = 0;
-};
-#define FDE_CSSMEDIATYPE_Braille 0x01
-#define FDE_CSSMEDIATYPE_Emboss 0x02
-#define FDE_CSSMEDIATYPE_Handheld 0x04
-#define FDE_CSSMEDIATYPE_Print 0x08
-#define FDE_CSSMEDIATYPE_Projection 0x10
-#define FDE_CSSMEDIATYPE_Screen 0x20
-#define FDE_CSSMEDIATYPE_TTY 0x40
-#define FDE_CSSMEDIATYPE_TV 0x80
-#define FDE_CSSMEDIATYPE_ALL 0xFF
-enum FDE_CSSRULETYPE {
-  FDE_CSSRULETYPE_Unknown = 0,
-  FDE_CSSRULETYPE_Style = 1,
-  FDE_CSSRULETYPE_Media = 4,
-  FDE_CSSRULETYPE_FontFace = 5,
-};
-class IFDE_CSSRule {
- public:
-  virtual ~IFDE_CSSRule() {}
-  virtual FDE_CSSRULETYPE GetType() const = 0;
-};
-typedef CFX_MassArrayTemplate<IFDE_CSSRule*> CFDE_CSSRuleArray;
-class IFDE_CSSStyleRule : public IFDE_CSSRule {
- public:
-  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_Style; }
-  virtual int32_t CountSelectorLists() const = 0;
-  virtual IFDE_CSSSelector* GetSelectorList(int32_t index) const = 0;
-  virtual IFDE_CSSDeclaration* GetDeclaration() const = 0;
-};
-class IFDE_CSSMediaRule : public IFDE_CSSRule {
- public:
-  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_Media; }
-  virtual FX_DWORD GetMediaList() const = 0;
-  virtual int32_t CountRules() const = 0;
-  virtual IFDE_CSSRule* GetRule(int32_t index) = 0;
-};
-class IFDE_CSSFontFaceRule : public IFDE_CSSRule {
- public:
-  virtual FDE_CSSRULETYPE GetType() const { return FDE_CSSRULETYPE_FontFace; }
-  virtual IFDE_CSSDeclaration* GetDeclaration() const = 0;
-};
-class IFDE_CSSStyleSheet : public IFX_Unknown {
- public:
-  static IFDE_CSSStyleSheet* LoadHTMLStandardStyleSheet();
-  static IFDE_CSSStyleSheet* LoadFromStream(
-      const CFX_WideString& szUrl,
-      IFX_Stream* pStream,
-      FX_WORD wCodePage,
-      FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
-  static IFDE_CSSStyleSheet* LoadFromBuffer(
-      const CFX_WideString& szUrl,
-      const FX_WCHAR* pBuffer,
-      int32_t iBufSize,
-      FX_WORD wCodePage,
-      FX_DWORD dwMediaList = FDE_CSSMEDIATYPE_ALL);
-  virtual FX_BOOL GetUrl(CFX_WideString& szUrl) = 0;
-  virtual FX_DWORD GetMediaList() const = 0;
-  virtual FX_WORD GetCodePage() const = 0;
-
-  virtual int32_t CountRules() const = 0;
-  virtual IFDE_CSSRule* GetRule(int32_t index) = 0;
-};
-typedef CFX_ArrayTemplate<IFDE_CSSStyleSheet*> CFDE_CSSStyleSheetArray;
-#define FDE_CSSUSERSTYLESHEET (FX_BSTRC("#USERSHEET"))
-#define FDE_CSSUAGENTSTYLESHEET (FX_BSTRC("#AGENTSHEET"))
-class IFDE_CSSStyleSheetCache {
- public:
-  static IFDE_CSSStyleSheetCache* Create();
-  virtual ~IFDE_CSSStyleSheetCache() {}
-  virtual void Release() = 0;
-  virtual void SetMaxItems(int32_t iMaxCount = 5) = 0;
-  virtual void AddStyleSheet(const CFX_ByteStringC& szKey,
-                             IFDE_CSSStyleSheet* pStyleSheet) = 0;
-  virtual IFDE_CSSStyleSheet* GetStyleSheet(
-      const CFX_ByteStringC& szKey) const = 0;
-  virtual void RemoveStyleSheet(const CFX_ByteStringC& szKey) = 0;
-};
-enum FDE_CSSSYNTAXSTATUS {
-  FDE_CSSSYNTAXSTATUS_Error,
-  FDE_CSSSYNTAXSTATUS_EOS,
-  FDE_CSSSYNTAXSTATUS_None,
-  FDE_CSSSYNTAXSTATUS_Charset,
-  FDE_CSSSYNTAXSTATUS_ImportRule,
-  FDE_CSSSYNTAXSTATUS_ImportClose,
-  FDE_CSSSYNTAXSTATUS_PageRule,
-  FDE_CSSSYNTAXSTATUS_StyleRule,
-  FDE_CSSSYNTAXSTATUS_FontFaceRule,
-  FDE_CSSSYNTAXSTATUS_MediaRule,
-  FDE_CSSSYNTAXSTATUS_MediaType,
-  FDE_CSSSYNTAXSTATUS_URI,
-  FDE_CSSSYNTAXSTATUS_Selector,
-  FDE_CSSSYNTAXSTATUS_DeclOpen,
-  FDE_CSSSYNTAXSTATUS_DeclClose,
-  FDE_CSSSYNTAXSTATUS_PropertyName,
-  FDE_CSSSYNTAXSTATUS_PropertyValue,
-};
-class IFDE_CSSSyntaxParser {
- public:
-  static IFDE_CSSSyntaxParser* Create();
-  virtual ~IFDE_CSSSyntaxParser() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL Init(IFX_Stream* pStream,
-                       int32_t iCSSPlaneSize,
-                       int32_t iTextDataSize = 32,
-                       FX_BOOL bOnlyDeclaration = FALSE) = 0;
-  virtual FX_BOOL Init(const FX_WCHAR* pBuffer,
-                       int32_t iBufferSize,
-                       int32_t iTextDatSize = 32,
-                       FX_BOOL bOnlyDeclaration = FALSE) = 0;
-
-  virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse() = 0;
-  virtual const FX_WCHAR* GetCurrentString(int32_t& iLength) const = 0;
-};
-enum FDE_CSSLENGTHUNIT {
-  FDE_CSSLENGTHUNIT_Auto,
-  FDE_CSSLENGTHUNIT_None,
-  FDE_CSSLENGTHUNIT_Normal,
-  FDE_CSSLENGTHUNIT_Point,
-  FDE_CSSLENGTHUNIT_Percent,
-};
-#define FDE_CSSUNITBITS (3)
-#define FDE_CSSUNITMASK ((1 << FDE_CSSUNITBITS) - 1)
-struct FDE_CSSLENGTH {
-  FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit) {
-    m_iData = eUnit;
-    return *this;
-  }
-  FDE_CSSLENGTH& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
-    m_iData = ((intptr_t)(fValue * 1024.0f) << FDE_CSSUNITBITS) | eUnit;
-    return *this;
-  }
-  FDE_CSSLENGTHUNIT GetUnit() const {
-    return (FDE_CSSLENGTHUNIT)(m_iData & FDE_CSSUNITMASK);
-  }
-  FX_FLOAT GetValue() const { return (m_iData >> FDE_CSSUNITBITS) / 1024.0f; }
-  FX_BOOL NonZero() const { return (m_iData >> FDE_CSSUNITBITS) != 0; }
-
- private:
-  intptr_t m_iData;
-};
-struct FDE_CSSPOINT {
-  FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit) {
-    x.Set(eUnit);
-    y.Set(eUnit);
-    return *this;
-  }
-  FDE_CSSPOINT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
-    x.Set(eUnit, fValue);
-    y.Set(eUnit, fValue);
-    return *this;
-  }
-  FDE_CSSLENGTH x, y;
-};
-struct FDE_CSSSIZE {
-  FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit) {
-    cx.Set(eUnit);
-    cy.Set(eUnit);
-    return *this;
-  }
-  FDE_CSSSIZE& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
-    cx.Set(eUnit, fValue);
-    cy.Set(eUnit, fValue);
-    return *this;
-  }
-  FDE_CSSLENGTH cx, cy;
-};
-struct FDE_CSSRECT {
-  FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit) {
-    left.Set(eUnit);
-    top.Set(eUnit);
-    right.Set(eUnit);
-    bottom.Set(eUnit);
-    return *this;
-  }
-  FDE_CSSRECT& Set(FDE_CSSLENGTHUNIT eUnit, FX_FLOAT fValue) {
-    left.Set(eUnit, fValue);
-    top.Set(eUnit, fValue);
-    right.Set(eUnit, fValue);
-    bottom.Set(eUnit, fValue);
-    return *this;
-  }
-
-  FDE_CSSLENGTH left, top, right, bottom;
-};
-enum FDE_CSSBKGATTACHMENT {
-  FDE_CSSBKGATTACHMENT_Scroll,
-  FDE_CSSBKGATTACHMENT_Fixed,
-};
-enum FDE_CSSBKGREPEAT {
-  FDE_CSSBKGREPEAT_Repeat,
-  FDE_CSSBKGREPEAT_RepeatX,
-  FDE_CSSBKGREPEAT_RepeatY,
-  FDE_CSSBKGREPEAT_NoRepeat,
-};
-enum FDE_CSSBORDERSTYLE {
-  FDE_CSSBORDERSTYLE_None,
-  FDE_CSSBORDERSTYLE_Hidden,
-  FDE_CSSBORDERSTYLE_Dotted,
-  FDE_CSSBORDERSTYLE_Dashed,
-  FDE_CSSBORDERSTYLE_Solid,
-  FDE_CSSBORDERSTYLE_Double,
-  FDE_CSSBORDERSTYLE_Groove,
-  FDE_CSSBORDERSTYLE_Ridge,
-  FDE_CSSBORDERSTYLE_Inset,
-  FDE_CSSBORDERSTYLE_outset,
-};
-enum FDE_CSSCLEAR {
-  FDE_CSSCLEAR_None,
-  FDE_CSSCLEAR_Left,
-  FDE_CSSCLEAR_Right,
-  FDE_CSSCLEAR_Both,
-};
-enum FDE_CSSDISPLAY {
-  FDE_CSSDISPLAY_None,
-  FDE_CSSDISPLAY_ListItem,
-  FDE_CSSDISPLAY_RunIn,
-  FDE_CSSDISPLAY_Block,
-  FDE_CSSDISPLAY_Inline,
-  FDE_CSSDISPLAY_InlineBlock,
-  FDE_CSSDISPLAY_InlineTable,
-  FDE_CSSDISPLAY_Table,
-  FDE_CSSDISPLAY_TableRow,
-  FDE_CSSDISPLAY_TableCell,
-  FDE_CSSDISPLAY_TableCaption,
-  FDE_CSSDISPLAY_TableColumn,
-  FDE_CSSDISPLAY_TableRowGroup,
-  FDE_CSSDISPLAY_TableColumnGroup,
-  FDE_CSSDISPLAY_TableHeaderGroup,
-  FDE_CSSDISPLAY_TableFooterGroup,
-  FDE_CSSDISPLAY_Ruby,
-  FDE_CSSDISPLAY_RubyBase,
-  FDE_CSSDISPLAY_RubyText,
-  FDE_CSSDISPLSY_RubyBaseGroup,
-  FDE_CSSDISPLAY_RubyTextGroup,
-};
-enum FDE_CSSVISIBILITY {
-  FDE_CSSVISIBILITY_Visible,
-  FDE_CSSVISIBILITY_Hidden,
-  FDE_CSSVISIBILITY_Collapse,
-};
-enum FDE_CSSFONTSTYLE {
-  FDE_CSSFONTSTYLE_Normal,
-  FDE_CSSFONTSTYLE_Italic,
-};
-enum FDE_CSSFLOAT {
-  FDE_CSSFLOAT_None,
-  FDE_CSSFLOAT_Left,
-  FDE_CSSFLOAT_Right,
-};
-enum FDE_CSSWRITINGMODE {
-  FDE_CSSWRITINGMODE_HorizontalTb,
-  FDE_CSSWRITINGMODE_VerticalRl,
-  FDE_CSSWRITINGMODE_VerticalLr,
-};
-enum FDE_CSSWORDBREAK {
-  FDE_CSSWORDBREAK_Normal,
-  FDE_CSSWORDBREAK_KeepAll,
-  FDE_CSSWORDBREAK_BreakAll,
-  FDE_CSSWORDBREAK_KeepWords,
-};
-enum FDE_CSSPAGEBREAK {
-  FDE_CSSPAGEBREAK_Auto,
-  FDE_CSSPAGEBREAK_Always,
-  FDE_CSSPAGEBREAK_Avoid,
-  FDE_CSSPAGEBREAK_Left,
-  FDE_CSSPAGEBREAK_Right,
-};
-enum FDE_CSSOVERFLOW {
-  FDE_CSSOVERFLOW_Visible,
-  FDE_CSSOVERFLOW_Hidden,
-  FDE_CSSOVERFLOW_Scroll,
-  FDE_CSSOVERFLOW_Auto,
-  FDE_CSSOVERFLOW_NoDisplay,
-  FDE_CSSOVERFLOW_NoContent,
-};
-enum FDE_CSSLINEBREAK {
-  FDE_CSSLINEBREAK_Auto,
-  FDE_CSSLINEBREAK_Loose,
-  FDE_CSSLINEBREAK_Normal,
-  FDE_CSSLINEBREAK_Strict,
-};
-enum FDE_CSSTEXTEMPHASISFILL {
-  FDE_CSSTEXTEMPHASISFILL_Filled,
-  FDE_CSSTEXTEMPHASISFILL_Open,
-};
-enum FDE_CSSTEXTEMPHASISMARK {
-  FDE_CSSTEXTEMPHASISMARK_None,
-  FDE_CSSTEXTEMPHASISMARK_Auto,
-  FDE_CSSTEXTEMPHASISMARK_Dot,
-  FDE_CSSTEXTEMPHASISMARK_Circle,
-  FDE_CSSTEXTEMPHASISMARK_DoubleCircle,
-  FDE_CSSTEXTEMPHASISMARK_Triangle,
-  FDE_CSSTEXTEMPHASISMARK_Sesame,
-  FDE_CSSTEXTEMPHASISMARK_Custom,
-};
-enum FDE_CSSTEXTCOMBINE {
-  FDE_CSSTEXTCOMBINE_Horizontal,
-  FDE_CSSTEXTCOMBINE_None,
-};
-enum FDE_CSSCURSOR {
-  FDE_CSSCURSOR_Auto,
-  FDE_CSSCURSOR_Crosshair,
-  FDE_CSSCURSOR_Default,
-  FDE_CSSCURSOR_Pointer,
-  FDE_CSSCURSOR_Move,
-  FDE_CSSCURSOR_EResize,
-  FDE_CSSCURSOR_NeResize,
-  FDE_CSSCURSOR_NwResize,
-  FDE_CSSCURSOR_NResize,
-  FDE_CSSCURSOR_SeResize,
-  FDE_CSSCURSOR_SwResize,
-  FDE_CSSCURSOR_SResize,
-  FDE_CSSCURSOR_WResize,
-  FDE_CSSCURSOR_Text,
-  FDE_CSSCURSOR_Wait,
-  FDE_CSSCURSOR_Help,
-  FDE_CSSCURSOR_Progress,
-};
-enum FDE_CSSPOSITION {
-  FDE_CSSPOSITION_Static,
-  FDE_CSSPOSITION_Relative,
-  FDE_CSSPOSITION_Absolute,
-  FDE_CSSPOSITION_Fixed,
-};
-enum FDE_CSSCAPTIONSIDE {
-  FDE_CSSCAPTIONSIDE_Top,
-  FDE_CSSCAPTIONSIDE_Bottom,
-  FDE_CSSCAPTIONSIDE_Left,
-  FDE_CSSCAPTIONSIDE_Right,
-  FDE_CSSCAPTIONSIDE_Before,
-  FDE_CSSCAPTIONSIDE_After,
-};
-enum FDE_CSSRUBYALIGN {
-  FDE_CSSRUBYALIGN_Auto,
-  FDE_CSSRUBYALIGN_Start,
-  FDE_CSSRUBYALIGN_Left,
-  FDE_CSSRUBYALIGN_Center,
-  FDE_CSSRUBYALIGN_End,
-  FDE_CSSRUBYALIGN_Right,
-  FDE_CSSRUBYALIGN_DistributeLetter,
-  FDE_CSSRUBYALIGN_DistributeSpace,
-  FDE_CSSRUBYALIGN_LineEdge,
-};
-enum FDE_CSSRUBYOVERHANG {
-  FDE_CSSRUBYOVERHANG_Auto,
-  FDE_CSSRUBYOVERHANG_Start,
-  FDE_CSSRUBYOVERHANG_End,
-  FDE_CSSRUBYOVERHANG_None,
-};
-enum FDE_CSSRUBYPOSITION {
-  FDE_CSSRUBYPOSITION_Before,
-  FDE_CSSRUBYPOSITION_After,
-  FDE_CSSRUBYPOSITION_Right,
-  FDE_CSSRUBYPOSITION_Inline,
-};
-enum FDE_CSSRUBYSPAN {
-  FDE_CSSRUBYSPAN_None,
-  FDE_CSSRUBYSPAN_Attr,
-};
-enum FDE_CSSTEXTALIGN {
-  FDE_CSSTEXTALIGN_Left,
-  FDE_CSSTEXTALIGN_Right,
-  FDE_CSSTEXTALIGN_Center,
-  FDE_CSSTEXTALIGN_Justify,
-  FDE_CSSTEXTALIGN_JustifyAll,
-};
-enum FDE_CSSVERTICALALIGN {
-  FDE_CSSVERTICALALIGN_Baseline,
-  FDE_CSSVERTICALALIGN_Sub,
-  FDE_CSSVERTICALALIGN_Super,
-  FDE_CSSVERTICALALIGN_Top,
-  FDE_CSSVERTICALALIGN_TextTop,
-  FDE_CSSVERTICALALIGN_Middle,
-  FDE_CSSVERTICALALIGN_Bottom,
-  FDE_CSSVERTICALALIGN_TextBottom,
-  FDE_CSSVERTICALALIGN_Number,
-};
-enum FDE_CSSLISTSTYLETYPE {
-  FDE_CSSLISTSTYLETYPE_Disc,
-  FDE_CSSLISTSTYLETYPE_Circle,
-  FDE_CSSLISTSTYLETYPE_Square,
-  FDE_CSSLISTSTYLETYPE_Decimal,
-  FDE_CSSLISTSTYLETYPE_DecimalLeadingZero,
-  FDE_CSSLISTSTYLETYPE_LowerRoman,
-  FDE_CSSLISTSTYLETYPE_UpperRoman,
-  FDE_CSSLISTSTYLETYPE_LowerGreek,
-  FDE_CSSLISTSTYLETYPE_LowerLatin,
-  FDE_CSSLISTSTYLETYPE_UpperLatin,
-  FDE_CSSLISTSTYLETYPE_Armenian,
-  FDE_CSSLISTSTYLETYPE_Georgian,
-  FDE_CSSLISTSTYLETYPE_LowerAlpha,
-  FDE_CSSLISTSTYLETYPE_UpperAlpha,
-  FDE_CSSLISTSTYLETYPE_None,
-  FDE_CSSLISTSTYLETYPE_CjkIdeographic,
-  FDE_CSSLISTSTYLETYPE_Hebrew,
-  FDE_CSSLISTSTYLETYPE_Hiragana,
-  FDE_CSSLISTSTYLETYPE_HiraganaIroha,
-  FDE_CSSLISTSTYLETYPE_Katakana,
-  FDE_CSSLISTSTYLETYPE_KatakanaIroha,
-};
-enum FDE_CSSLISTSTYLEPOSITION {
-  FDE_CSSLISTSTYLEPOSITION_Outside,
-  FDE_CSSLISTSTYLEPOSITION_Inside,
-};
-enum FDE_CSSWHITESPACE {
-  FDE_CSSWHITESPACE_Normal,
-  FDE_CSSWHITESPACE_Pre,
-  FDE_CSSWHITESPACE_Nowrap,
-  FDE_CSSWHITESPACE_PreWrap,
-  FDE_CSSWHITESPACE_PreLine,
-};
-enum FDE_CSSFONTVARIANT {
-  FDE_CSSFONTVARIANT_Normal,
-  FDE_CSSFONTVARIANT_SmallCaps,
-};
-enum FDE_CSSTEXTTRANSFORM {
-  FDE_CSSTEXTTRANSFORM_None,
-  FDE_CSSTEXTTRANSFORM_Capitalize,
-  FDE_CSSTEXTTRANSFORM_UpperCase,
-  FDE_CSSTEXTTRANSFORM_LowerCase,
-};
-enum FDE_CSSTEXTDECORATION {
-  FDE_CSSTEXTDECORATION_None = 0,
-  FDE_CSSTEXTDECORATION_Underline = 1,
-  FDE_CSSTEXTDECORATION_Overline = 2,
-  FDE_CSSTEXTDECORATION_LineThrough = 4,
-  FDE_CSSTEXTDECORATION_Blink = 8,
-  FDE_CSSTEXTDECORATION_Double = 16,
-};
-class IFDE_CSSRubyStyle {
- public:
-  virtual ~IFDE_CSSRubyStyle() {}
-  virtual FDE_CSSRUBYALIGN GetRubyAlign() const = 0;
-  virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const = 0;
-  virtual FDE_CSSRUBYPOSITION GetRubyPosition() const = 0;
-  virtual FDE_CSSRUBYSPAN GetRubySpanType() const = 0;
-  virtual IFDE_CSSValue* GetRubySpanAttr() const = 0;
-};
-class IFDE_CSSMultiColumnStyle {
- public:
-  virtual ~IFDE_CSSMultiColumnStyle() {}
-  virtual const FDE_CSSLENGTH& GetColumnCount() const = 0;
-  virtual const FDE_CSSLENGTH& GetColumnGap() const = 0;
-  virtual FX_ARGB GetColumnRuleColor() const = 0;
-  virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const = 0;
-  virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const = 0;
-  virtual const FDE_CSSLENGTH& GetColumnWidth() const = 0;
-  virtual void SetColumnCount(const FDE_CSSLENGTH& columnCount) = 0;
-  virtual void SetColumnGap(const FDE_CSSLENGTH& columnGap) = 0;
-  virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) = 0;
-  virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) = 0;
-  virtual void SetColumnRuleWidth(const FDE_CSSLENGTH& columnRuleWidth) = 0;
-  virtual void SetColumnWidth(const FDE_CSSLENGTH& columnWidth) = 0;
-};
-class IFDE_CSSGeneratedContentStyle {
- public:
-  virtual ~IFDE_CSSGeneratedContentStyle() {}
-  virtual int32_t CountCounters() = 0;
-  virtual const FX_WCHAR* GetCounterIdentifier(int32_t index) = 0;
-  virtual FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) = 0;
-  virtual FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) = 0;
-  virtual IFDE_CSSValueList* GetContent() const = 0;
-  virtual int32_t CountQuotes() const = 0;
-  virtual const FX_WCHAR* GetQuotes(int32_t index) const = 0;
-};
-class IFDE_CSSFontStyle {
- public:
-  virtual ~IFDE_CSSFontStyle() {}
-  virtual int32_t CountFontFamilies() const = 0;
-  virtual const FX_WCHAR* GetFontFamily(int32_t index) const = 0;
-  virtual FX_WORD GetFontWeight() const = 0;
-  virtual FDE_CSSFONTVARIANT GetFontVariant() const = 0;
-  virtual FDE_CSSFONTSTYLE GetFontStyle() const = 0;
-  virtual FX_FLOAT GetFontSize() const = 0;
-  virtual FX_ARGB GetColor() const = 0;
-  virtual void SetFontWeight(FX_WORD wFontWeight) = 0;
-  virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) = 0;
-  virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) = 0;
-  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
-  virtual void SetColor(FX_ARGB dwFontColor) = 0;
-};
-class IFDE_CSSBoundaryStyle {
- public:
-  virtual ~IFDE_CSSBoundaryStyle() {}
-  virtual FX_ARGB GetBorderLeftColor() const = 0;
-  virtual FX_ARGB GetBorderTopColor() const = 0;
-  virtual FX_ARGB GetBorderRightColor() const = 0;
-  virtual FX_ARGB GetBorderBottomColor() const = 0;
-  virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const = 0;
-  virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const = 0;
-  virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const = 0;
-  virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const = 0;
-  virtual const FDE_CSSRECT* GetBorderWidth() const = 0;
-  virtual const FDE_CSSRECT* GetMarginWidth() const = 0;
-  virtual const FDE_CSSRECT* GetPaddingWidth() const = 0;
-  virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) = 0;
-  virtual void SetBorderTopColor(FX_ARGB dwBorderColor) = 0;
-  virtual void SetBorderRightColor(FX_ARGB dwBorderColor) = 0;
-  virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) = 0;
-
-  virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
-  virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
-  virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
-  virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) = 0;
-
-  virtual void SetBorderWidth(const FDE_CSSRECT& rect) = 0;
-  virtual void SetMarginWidth(const FDE_CSSRECT& rect) = 0;
-  virtual void SetPaddingWidth(const FDE_CSSRECT& rect) = 0;
-};
-class IFDE_CSSPositionStyle {
- public:
-  virtual ~IFDE_CSSPositionStyle() {}
-  virtual FDE_CSSDISPLAY GetDisplay() const = 0;
-  virtual const FDE_CSSSIZE& GetBoxSize() const = 0;
-  virtual const FDE_CSSSIZE& GetMinBoxSize() const = 0;
-  virtual const FDE_CSSSIZE& GetMaxBoxSize() const = 0;
-  virtual FDE_CSSFLOAT GetFloat() const = 0;
-  virtual FDE_CSSCLEAR GetClear() const = 0;
-  virtual FDE_CSSPOSITION GetPosition() const = 0;
-  virtual FDE_CSSLENGTH GetTop() const = 0;
-  virtual FDE_CSSLENGTH GetBottom() const = 0;
-  virtual FDE_CSSLENGTH GetLeft() const = 0;
-  virtual FDE_CSSLENGTH GetRight() const = 0;
-  virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) = 0;
-  virtual void SetBoxSize(const FDE_CSSSIZE& boxSize) = 0;
-  virtual void SetMinBoxSize(const FDE_CSSSIZE& minBoxSize) = 0;
-  virtual void SetMaxBoxSize(const FDE_CSSSIZE& maxBoxSize) = 0;
-  virtual void SetFloat(FDE_CSSFLOAT eFloat) = 0;
-  virtual void SetClear(FDE_CSSCLEAR eClear) = 0;
-};
-class IFDE_CSSParagraphStyle {
- public:
-  virtual ~IFDE_CSSParagraphStyle() {}
-  virtual FX_FLOAT GetLineHeight() const = 0;
-  virtual FDE_CSSWHITESPACE GetWhiteSpace() const = 0;
-  virtual const FDE_CSSLENGTH& GetTextIndent() const = 0;
-  virtual FDE_CSSTEXTALIGN GetTextAlign() const = 0;
-  virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const = 0;
-  virtual FX_FLOAT GetNumberVerticalAlign() const = 0;
-  virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const = 0;
-  virtual FX_DWORD GetTextDecoration() const = 0;
-  virtual const FDE_CSSLENGTH& GetLetterSpacing() const = 0;
-  virtual const FDE_CSSLENGTH& GetWordSpacing() const = 0;
-  virtual FDE_CSSWRITINGMODE GetWritingMode() const = 0;
-  virtual FDE_CSSWORDBREAK GetWordBreak() const = 0;
-  virtual int32_t GetWidows() const = 0;
-  virtual FX_ARGB GetTextEmphasisColor() const = 0;
-  virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const = 0;
-  virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const = 0;
-  virtual FDE_CSSPAGEBREAK GetPageBreakInside() const = 0;
-  virtual int32_t GetOrphans() const = 0;
-  virtual FDE_CSSLINEBREAK GetLineBreak() const = 0;
-  virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const = 0;
-  virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const = 0;
-  virtual const FX_WCHAR* GetTextEmphasisCustom() const = 0;
-  virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const = 0;
-  virtual FX_BOOL HasTextCombineNumber() const = 0;
-  virtual FX_FLOAT GetTextCombineNumber() const = 0;
-  virtual void SetLineHeight(FX_FLOAT fLineHeight) = 0;
-  virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) = 0;
-  virtual void SetTextIndent(const FDE_CSSLENGTH& textIndent) = 0;
-  virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) = 0;
-  virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) = 0;
-  virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) = 0;
-  virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) = 0;
-  virtual void SetTextDecoration(FX_DWORD dwTextDecoration) = 0;
-  virtual void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) = 0;
-  virtual void SetWordSpacing(const FDE_CSSLENGTH& wordSpacing) = 0;
-  virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) = 0;
-  virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) = 0;
-  virtual void SetWidows(int32_t iWidows) = 0;
-  virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) = 0;
-  virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) = 0;
-  virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) = 0;
-  virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) = 0;
-  virtual void SetOrphans(int32_t iOrphans) = 0;
-  virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) = 0;
-};
-class IFDE_CSSBackgroundStyle {
- public:
-  virtual ~IFDE_CSSBackgroundStyle() {}
-  virtual FX_ARGB GetBKGColor() const = 0;
-  virtual const FX_WCHAR* GetBKGImage() const = 0;
-  virtual FDE_CSSBKGREPEAT GetBKGRepeat() const = 0;
-  virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const = 0;
-  virtual const FDE_CSSPOINT& GetBKGPosition() const = 0;
-  virtual void SetBKGColor(FX_ARGB dwBKGColor) = 0;
-  virtual void SetBKGPosition(const FDE_CSSPOINT& bkgPosition) = 0;
-};
-class IFDE_CSSListStyle {
- public:
-  virtual ~IFDE_CSSListStyle() {}
-  virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const = 0;
-  virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const = 0;
-  virtual const FX_WCHAR* GetListStyleImage() const = 0;
-  virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) = 0;
-  virtual void SetListStylePosition(
-      FDE_CSSLISTSTYLEPOSITION eListStylePosition) = 0;
-};
-class IFDE_CSSTableStyle {
- public:
-  virtual ~IFDE_CSSTableStyle() {}
-  virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const = 0;
-};
-class IFDE_CSSVisualStyle {
- public:
-  virtual ~IFDE_CSSVisualStyle() {}
-  virtual FDE_CSSVISIBILITY GetVisibility() const = 0;
-  virtual FDE_CSSOVERFLOW GetOverflowX() const = 0;
-  virtual FDE_CSSOVERFLOW GetOverflowY() const = 0;
-  virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) = 0;
-};
-class IFDE_CSSComputedStyle : public IFX_Unknown {
- public:
-  virtual void Reset() = 0;
-  virtual IFDE_CSSFontStyle* GetFontStyles() const = 0;
-  virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const = 0;
-  virtual IFDE_CSSPositionStyle* GetPositionStyles() const = 0;
-  virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const = 0;
-  virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const = 0;
-  virtual IFDE_CSSVisualStyle* GetVisualStyles() const = 0;
-  virtual IFDE_CSSListStyle* GetListStyles() const = 0;
-  virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const = 0;
-  virtual IFDE_CSSTableStyle* GetTableStyle() const = 0;
-  virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const = 0;
-  virtual IFDE_CSSRubyStyle* GetRubyStyle() const = 0;
-  virtual FX_BOOL GetCustomStyle(const CFX_WideStringC& wsName,
-                                 CFX_WideString& wsValue) const = 0;
-};
-enum FDE_CSSSTYLESHEETGROUP {
-  FDE_CSSSTYLESHEETGROUP_UserAgent,
-  FDE_CSSSTYLESHEETGROUP_User,
-  FDE_CSSSTYLESHEETGROUP_Author,
-  FDE_CSSSTYLESHEETGROUP_MAX,
-};
-enum FDE_CSSSTYLESHEETPRIORITY {
-  FDE_CSSSTYLESHEETPRIORITY_High,
-  FDE_CSSSTYLESHEETPRIORITY_Mid,
-  FDE_CSSSTYLESHEETPRIORITY_Low,
-  FDE_CSSSTYLESHEETPRIORITY_MAX,
-};
-class IFDE_CSSTagProvider {
- public:
-  virtual ~IFDE_CSSTagProvider() {}
-  virtual CFX_WideStringC GetTagName() = 0;
-  virtual FX_POSITION GetFirstAttribute() = 0;
-  virtual void GetNextAttribute(FX_POSITION& pos,
-                                CFX_WideStringC& wsAttr,
-                                CFX_WideStringC& wsValue) = 0;
-};
-class IFDE_CSSAccelerator {
- public:
-  virtual ~IFDE_CSSAccelerator() {}
-  virtual void OnEnterTag(IFDE_CSSTagProvider* pTag) = 0;
-  virtual void OnLeaveTag(IFDE_CSSTagProvider* pTag) = 0;
-};
-class IFDE_CSSStyleSelector {
- public:
-  static IFDE_CSSStyleSelector* Create();
-  virtual ~IFDE_CSSStyleSelector() {}
-  virtual void Release() = 0;
-  virtual void SetFontMgr(IFX_FontMgr* pFontMgr) = 0;
-  virtual void SetDefFontSize(FX_FLOAT fFontSize) = 0;
-  virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
-                                IFDE_CSSStyleSheet* pSheet) = 0;
-  virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType,
-                                 const CFDE_CSSStyleSheetArray* pArray) = 0;
-  virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType,
-                                FDE_CSSSTYLESHEETPRIORITY ePriority) = 0;
-  virtual void UpdateStyleIndex(FX_DWORD dwMediaList) = 0;
-  virtual IFDE_CSSAccelerator* InitAccelerator() = 0;
-  virtual IFDE_CSSComputedStyle* CreateComputedStyle(
-      IFDE_CSSComputedStyle* pParentStyle) = 0;
-  virtual int32_t MatchDeclarations(
-      IFDE_CSSTagProvider* pTag,
-      CFDE_CSSDeclarationArray& matchedDecls,
-      FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE) = 0;
-  virtual void ComputeStyle(IFDE_CSSTagProvider* pTag,
-                            const IFDE_CSSDeclaration** ppDeclArray,
-                            int32_t iDeclCount,
-                            IFDE_CSSComputedStyle* pDestStyle) = 0;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSS_H_
diff --git a/xfa/src/fde/css/fde_csscache.cpp b/xfa/src/fde/css/fde_csscache.cpp
deleted file mode 100644
index 012585b..0000000
--- a/xfa/src/fde/css/fde_csscache.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_csscache.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_ext.h"
-
-FDE_CSSCacheItem::FDE_CSSCacheItem(IFDE_CSSStyleSheet* p)
-    : pStylesheet(p), dwActivity(0) {
-  FXSYS_assert(pStylesheet);
-  pStylesheet->AddRef();
-}
-FDE_CSSCacheItem::~FDE_CSSCacheItem() {
-  pStylesheet->Release();
-}
-IFDE_CSSStyleSheetCache* IFDE_CSSStyleSheetCache::Create() {
-  return new CFDE_CSSStyleSheetCache;
-}
-
-CFDE_CSSStyleSheetCache::CFDE_CSSStyleSheetCache()
-    : m_pFixedStore(NULL), m_iMaxItems(5) {}
-
-CFDE_CSSStyleSheetCache::~CFDE_CSSStyleSheetCache() {
-  for (const auto& pair : m_Stylesheets) {
-    FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, pair.second);
-  }
-  m_Stylesheets.clear();
-  if (m_pFixedStore) {
-    m_pFixedStore->Release();
-  }
-}
-void CFDE_CSSStyleSheetCache::AddStyleSheet(const CFX_ByteStringC& szKey,
-                                            IFDE_CSSStyleSheet* pStyleSheet) {
-  FXSYS_assert(pStyleSheet != NULL);
-  if (m_pFixedStore == NULL) {
-    m_pFixedStore =
-        FX_CreateAllocator(FX_ALLOCTYPE_Fixed, std::max(10, m_iMaxItems),
-                           sizeof(FDE_CSSCacheItem));
-    FXSYS_assert(m_pFixedStore != NULL);
-  }
-  auto it = m_Stylesheets.find(szKey);
-  if (it != m_Stylesheets.end()) {
-    FDE_CSSCacheItem* pItem = it->second;
-    if (pItem->pStylesheet != pStyleSheet) {
-      pItem->pStylesheet->Release();
-      pItem->pStylesheet = pStyleSheet;
-      pItem->pStylesheet->AddRef();
-      pItem->dwActivity = 0;
-    }
-  } else {
-    while (static_cast<int32_t>(m_Stylesheets.size()) >= m_iMaxItems) {
-      RemoveLowestActivityItem();
-    }
-    m_Stylesheets[szKey] =
-        FXTARGET_NewWith(m_pFixedStore) FDE_CSSCacheItem(pStyleSheet);
-  }
-}
-IFDE_CSSStyleSheet* CFDE_CSSStyleSheetCache::GetStyleSheet(
-    const CFX_ByteStringC& szKey) const {
-  auto it = m_Stylesheets.find(szKey);
-  if (it == m_Stylesheets.end()) {
-    return nullptr;
-  }
-  FDE_CSSCacheItem* pItem = it->second;
-  pItem->dwActivity++;
-  pItem->pStylesheet->AddRef();
-  return pItem->pStylesheet;
-}
-void CFDE_CSSStyleSheetCache::RemoveStyleSheet(const CFX_ByteStringC& szKey) {
-  auto it = m_Stylesheets.find(szKey);
-  if (it == m_Stylesheets.end()) {
-    return;
-  }
-  FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, it->second);
-  m_Stylesheets.erase(it);
-}
-void CFDE_CSSStyleSheetCache::RemoveLowestActivityItem() {
-  auto found = m_Stylesheets.end();
-  for (auto it = m_Stylesheets.begin(); it != m_Stylesheets.end(); ++it) {
-    switch (it->first.GetID()) {
-      case FXBSTR_ID('#', 'U', 'S', 'E'):
-      case FXBSTR_ID('#', 'A', 'G', 'E'):
-        continue;
-    }
-    if (found == m_Stylesheets.end() ||
-        it->second->dwActivity > found->second->dwActivity) {
-      found = it;
-    }
-  }
-  if (found != m_Stylesheets.end()) {
-    FXTARGET_DeleteWith(FDE_CSSCacheItem, m_pFixedStore, found->second);
-    m_Stylesheets.erase(found);
-  }
-}
-FDE_CSSTagCache::FDE_CSSTagCache(FDE_CSSTagCache* parent,
-                                 IFDE_CSSTagProvider* tag)
-    : pTag(tag),
-      pParent(parent),
-      dwIDHash(0),
-      dwTagHash(0),
-      iClassIndex(0),
-      dwClassHashs(1) {
-  FXSYS_assert(pTag != NULL);
-  CFX_WideStringC wsValue, wsName = pTag->GetTagName();
-  dwTagHash =
-      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
-  FX_POSITION pos = pTag->GetFirstAttribute();
-  while (pos != NULL) {
-    pTag->GetNextAttribute(pos, wsName, wsValue);
-    FX_DWORD dwNameHash =
-        FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
-    static const FX_DWORD s_dwIDHash = FX_HashCode_String_GetW(L"id", 2, TRUE);
-    static const FX_DWORD s_dwClassHash =
-        FX_HashCode_String_GetW(L"class", 5, TRUE);
-    if (dwNameHash == s_dwClassHash) {
-      FX_DWORD dwHash =
-          FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
-      dwClassHashs.Add(dwHash);
-    } else if (dwNameHash == s_dwIDHash) {
-      dwIDHash = FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
-    }
-  }
-}
-FDE_CSSTagCache::FDE_CSSTagCache(const FDE_CSSTagCache& it)
-    : pTag(it.pTag),
-      pParent(it.pParent),
-      dwIDHash(it.dwIDHash),
-      dwTagHash(it.dwTagHash),
-      iClassIndex(0),
-      dwClassHashs(1) {
-  if (it.dwClassHashs.GetSize() > 0) {
-    dwClassHashs.Copy(it.dwClassHashs);
-  }
-}
-void CFDE_CSSAccelerator::OnEnterTag(IFDE_CSSTagProvider* pTag) {
-  FDE_CSSTagCache* pTop = GetTopElement();
-  FDE_CSSTagCache item(pTop, pTag);
-  m_Stack.Push(item);
-}
-void CFDE_CSSAccelerator::OnLeaveTag(IFDE_CSSTagProvider* pTag) {
-  FXSYS_assert(m_Stack.GetTopElement());
-  FXSYS_assert(m_Stack.GetTopElement()->GetTag() == pTag);
-  m_Stack.Pop();
-}
diff --git a/xfa/src/fde/css/fde_csscache.h b/xfa/src/fde/css/fde_csscache.h
deleted file mode 100644
index e10bea7..0000000
--- a/xfa/src/fde/css/fde_csscache.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSCACHE_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSCACHE_H_
-
-#include <map>
-
-#include "xfa/src/fde/css/fde_css.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class FDE_CSSCacheItem : public CFX_Target {
- public:
-  explicit FDE_CSSCacheItem(IFDE_CSSStyleSheet* p);
-  ~FDE_CSSCacheItem();
-
-  IFDE_CSSStyleSheet* pStylesheet;
-  FX_DWORD dwActivity;
-};
-
-class CFDE_CSSStyleSheetCache : public IFDE_CSSStyleSheetCache,
-                                public CFX_Target {
- public:
-  CFDE_CSSStyleSheetCache();
-  ~CFDE_CSSStyleSheetCache();
-  virtual void Release() { delete this; }
-
-  virtual void SetMaxItems(int32_t iMaxCount = 5) {
-    FXSYS_assert(iMaxCount >= 3);
-    m_iMaxItems = iMaxCount;
-  }
-
-  virtual void AddStyleSheet(const CFX_ByteStringC& szKey,
-                             IFDE_CSSStyleSheet* pStyleSheet);
-  virtual IFDE_CSSStyleSheet* GetStyleSheet(const CFX_ByteStringC& szKey) const;
-  virtual void RemoveStyleSheet(const CFX_ByteStringC& szKey);
-
- protected:
-  void RemoveLowestActivityItem();
-  std::map<CFX_ByteString, FDE_CSSCacheItem*> m_Stylesheets;
-  IFX_MEMAllocator* m_pFixedStore;
-  int32_t m_iMaxItems;
-};
-
-class FDE_CSSTagCache : public CFX_Target {
- public:
-  FDE_CSSTagCache(FDE_CSSTagCache* parent, IFDE_CSSTagProvider* tag);
-  FDE_CSSTagCache(const FDE_CSSTagCache& it);
-  FDE_CSSTagCache* GetParent() const { return pParent; }
-  IFDE_CSSTagProvider* GetTag() const { return pTag; }
-  FX_DWORD HashID() const { return dwIDHash; }
-  FX_DWORD HashTag() const { return dwTagHash; }
-  int32_t CountHashClass() const { return dwClassHashs.GetSize(); }
-  void SetClassIndex(int32_t index) { iClassIndex = index; }
-  FX_DWORD HashClass() const {
-    return iClassIndex < dwClassHashs.GetSize()
-               ? dwClassHashs.GetAt(iClassIndex)
-               : 0;
-  }
-
- protected:
-  IFDE_CSSTagProvider* pTag;
-  FDE_CSSTagCache* pParent;
-  FX_DWORD dwIDHash;
-  FX_DWORD dwTagHash;
-  int32_t iClassIndex;
-  CFDE_DWordArray dwClassHashs;
-};
-typedef CFX_ObjectStackTemplate<FDE_CSSTagCache> CFDE_CSSTagStack;
-
-class CFDE_CSSAccelerator : public IFDE_CSSAccelerator, public CFX_Target {
- public:
-  virtual void OnEnterTag(IFDE_CSSTagProvider* pTag);
-  virtual void OnLeaveTag(IFDE_CSSTagProvider* pTag);
-  void Clear() { m_Stack.RemoveAll(); }
-  FDE_CSSTagCache* GetTopElement() const { return m_Stack.GetTopElement(); }
-
- protected:
-  CFDE_CSSTagStack m_Stack;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSCACHE_H_
diff --git a/xfa/src/fde/css/fde_cssdatatable.cpp b/xfa/src/fde/css/fde_cssdatatable.cpp
deleted file mode 100644
index 5ad83e7..0000000
--- a/xfa/src/fde/css/fde_cssdatatable.cpp
+++ /dev/null
@@ -1,889 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_cssdatatable.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/crt/fgas_system.h"
-
-FX_BOOL FDE_CSSLengthToFloat(const FDE_CSSLENGTH& len,
-                             FX_FLOAT fPercentBase,
-                             FX_FLOAT& fResult) {
-  switch (len.GetUnit()) {
-    case FDE_CSSLENGTHUNIT_Point:
-      fResult = len.GetValue();
-      return TRUE;
-    case FDE_CSSLENGTHUNIT_Percent:
-      fResult = len.GetValue() * fPercentBase;
-      return TRUE;
-    default:
-      return FALSE;
-  }
-}
-CFX_FloatRect FDE_CSSBoundaryToRect(IFDE_CSSBoundaryStyle* pBoundStyle,
-                                    FX_FLOAT fContainerWidth,
-                                    FX_BOOL bPadding,
-                                    FX_BOOL bBorder,
-                                    FX_BOOL bMargin) {
-  FXSYS_assert(pBoundStyle != NULL);
-  FX_FLOAT fResult;
-  const FDE_CSSRECT* pRect;
-  CFX_FloatRect rect(0, 0, 0, 0);
-  if (bPadding) {
-    pRect = pBoundStyle->GetPaddingWidth();
-    if (pRect != NULL) {
-      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
-        rect.left += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
-        rect.top += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
-        rect.right += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
-        rect.bottom += fResult;
-      }
-    }
-  }
-  if (bBorder) {
-    pRect = pBoundStyle->GetBorderWidth();
-    if (pRect != NULL) {
-      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
-        rect.left += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
-        rect.top += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
-        rect.right += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
-        rect.bottom += fResult;
-      }
-    }
-  }
-  if (bMargin) {
-    pRect = pBoundStyle->GetMarginWidth();
-    if (pRect != NULL) {
-      if (FDE_CSSLengthToFloat(pRect->left, fContainerWidth, fResult)) {
-        rect.left += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->top, fContainerWidth, fResult)) {
-        rect.top += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->right, fContainerWidth, fResult)) {
-        rect.right += fResult;
-      }
-      if (FDE_CSSLengthToFloat(pRect->bottom, fContainerWidth, fResult)) {
-        rect.bottom += fResult;
-      }
-    }
-  }
-  return rect;
-}
-FX_DWORD FDE_CSSFontStyleToFDE(IFDE_CSSFontStyle* pFontStyle) {
-  FXSYS_assert(pFontStyle != NULL);
-  FX_DWORD dwFontStyle = FX_FONTSTYLE_Normal;
-  if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) {
-    dwFontStyle |= FX_FONTSTYLE_Italic;
-  }
-  if (pFontStyle->GetFontWeight() >= 700) {
-    dwFontStyle |= FX_FONTSTYLE_Bold;
-  }
-  return dwFontStyle;
-}
-static const FDE_CSSPROPERTYTABLE g_FDE_CSSProperties[] = {
-    {FDE_CSSPROPERTY_WritingMode, L"writing-mode", 0x01878076,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_ColumnRuleWidth, L"column-rule-width", 0x0200FB00,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderLeft, L"border-left", 0x04080036,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_ColumnRule, L"column-rule", 0x04C83DF3,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_Height, L"height", 0x05A5C519,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_CounterReset, L"counter-reset", 0x0894F9B0,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_Content, L"content", 0x097BE91B,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeURI | FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_RubyPosition, L"ruby-position", 0x09ACD024,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BackgroundColor, L"background-color", 0x09E8E8AC,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_Width, L"width", 0x0A8A8F80,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Src, L"src", 0x0BD37048,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeURI},
-    {FDE_CSSPROPERTY_Top, L"top", 0x0BEDAF33, FDE_CSSVALUETYPE_Primitive |
-                                                  FDE_CSSVALUETYPE_MaybeEnum |
-                                                  FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Margin, L"margin", 0x0CB016BE,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderColor, L"border-color", 0x0CBB528A,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_Widows, L"widows", 0x1026C59D,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderBottomColor, L"border-bottom-color", 0x121E22EC,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_TextIndent, L"text-indent", 0x169ADB74,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Right, L"right", 0x193ADE3E,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_TextEmphasisStyle, L"text-emphasis-style", 0x20DBAF4A,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_PaddingLeft, L"padding-left", 0x228CF02F,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_ColumnWidth, L"column-width", 0x24C9AC9B,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_MarginLeft, L"margin-left", 0x297C5656,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
-         FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Border, L"border", 0x2A23349E, FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_BorderTop, L"border-top", 0x2B866ADE,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_RubyOverhang, L"ruby-overhang", 0x2CCA0D89,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_PageBreakBefore, L"page-break-before", 0x3119B36F,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_MaxHeight, L"max-height", 0x343597EC,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_MinWidth, L"min-width", 0x35832871,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderLeftColor, L"border-left-color", 0x35C64022,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_Bottom, L"bottom", 0x399F02B5,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Quotes, L"quotes", 0x3D8C6A01,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_MaxWidth, L"max-width", 0x3EA274F3,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_PaddingRight, L"padding-right", 0x3F616AC2,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_ListStyleImage, L"list-style-image", 0x42A8A86A,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeURI},
-    {FDE_CSSPROPERTY_WhiteSpace, L"white-space", 0x42F0429A,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderBottom, L"border-bottom", 0x452CE780,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_ListStyleType, L"list-style-type", 0x48094789,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_WordBreak, L"word-break", 0x4D74A3CE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_OverflowX, L"overflow-x", 0x4ECEBF99,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_OverflowY, L"overflow-y", 0x4ECEBF9A,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderTopColor, L"border-top-color", 0x5109B8CA,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_FontFamily, L"font-family", 0x574686E6,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_Cursor, L"cursor", 0x59DFCA5E,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_RubyAlign, L"ruby-align", 0x6077BDFA,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_ColumnRuleColor, L"column-rule-color", 0x65DDFD9F,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_FontWeight, L"font-weight", 0x6692F60C,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderRightStyle, L"border-right-style", 0x6920DDA7,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_MinHeight, L"min-height", 0x6AAE312A,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Color, L"color", 0x6E67921F,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_LetterSpacing, L"letter-spacing", 0x70536102,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_EmptyCells, L"empty-cells", 0x7531528F,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_TextAlign, L"text-align", 0x7553F1BD,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_RubySpan, L"ruby-span", 0x76FCFCE1,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeFunction},
-    {FDE_CSSPROPERTY_Position, L"position", 0x814F82B5,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderStyle, L"border-style", 0x82A4CD5C,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderBottomStyle, L"border-bottom-style", 0x88079DBE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderCollapse, L"border-collapse", 0x8883C7FE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_ColumnCount, L"column-count", 0x89936A64,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderRightWidth, L"border-right-width", 0x8F5A6036,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_UnicodeBidi, L"unicode-bidi", 0x91670F6C,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_VerticalAlign, L"vertical-align", 0x934A87D2,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_PaddingTop, L"padding-top", 0x959D22B7,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Columns, L"columns", 0x96FA5D81,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_Overflow, L"overflow", 0x97B76B54,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_TableLayout, L"table-layout", 0x9B1CB4B3,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_FontVariant, L"font-variant", 0x9C785779,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_ListStyle, L"list-style", 0x9E6C471A,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_BackgroundPosition, L"background-position", 0xA8846D22,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderWidth, L"border-width", 0xA8DE4FEB,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_TextEmphasisColor, L"text-emphasis-color", 0xAAF23478,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_BorderLeftStyle, L"border-left-style", 0xABAFBAF4,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_PageBreakInside, L"page-break-inside", 0xACB695F8,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_TextEmphasis, L"text-emphasis", 0xAD0E580C,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_BorderBottomWidth, L"border-bottom-width", 0xAE41204D,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_ColumnGap, L"column-gap", 0xB5C1BA73,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Orphans, L"orphans", 0xB716467B,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderRight, L"border-right", 0xB78E9EA9,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_FontSize, L"font-size", 0xB93956DF,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_PageBreakAfter, L"page-break-after", 0xBC358AEE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_CaptionSide, L"caption-side", 0xC03F3560,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BackgroundRepeat, L"background-repeat", 0xC2C2FDCE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderTopStyle, L"border-top-style", 0xC6F3339C,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderSpacing, L"border-spacing", 0xC72030F0,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_TextTransform, L"text-transform", 0xC88EEA6E,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_FontStyle, L"font-style", 0xCB1950F5,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Font, L"font", 0xCD308B77, FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_LineHeight, L"line-height", 0xCFCACE2E,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_MarginRight, L"margin-right", 0xD13C58C9,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
-         FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Float, L"float", 0xD1532876,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BorderLeftWidth, L"border-left-width", 0xD1E93D83,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_Display, L"display", 0xD4224C36,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Clear, L"clear", 0xD8ED1467,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_ColumnRuleStyle, L"column-rule-style", 0xDBC77871,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_TextCombine, L"text-combine", 0xDC5207CF,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_ListStylePosition, L"list-style-position", 0xE1A1DE3C,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Visibility, L"visibility", 0xE29F5168,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_PaddingBottom, L"padding-bottom", 0xE555B3B9,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BackgroundAttachment, L"background-attachment", 0xE77981F6,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_BackgroundImage, L"background-image", 0xE9AEB710,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeURI},
-    {FDE_CSSPROPERTY_LineBreak, L"line-break", 0xEA2D1D9A,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Background, L"background", 0xEB49DD40,
-     FDE_CSSVALUETYPE_Shorthand},
-    {FDE_CSSPROPERTY_BorderTopWidth, L"border-top-width", 0xED2CB62B,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_WordSpacing, L"word-spacing", 0xEDA63BAE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_BorderRightColor, L"border-right-color", 0xF33762D5,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeColor},
-    {FDE_CSSPROPERTY_CounterIncrement, L"counter-increment", 0xF4CFB1B2,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber | FDE_CSSVALUETYPE_MaybeString},
-    {FDE_CSSPROPERTY_Left, L"left", 0xF5AD782B,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum |
-         FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_TextDecoration, L"text-decoration", 0xF7C634BA,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Padding, L"padding", 0xF8C373F7,
-     FDE_CSSVALUETYPE_List | FDE_CSSVALUETYPE_MaybeNumber},
-    {FDE_CSSPROPERTY_MarginBottom, L"margin-bottom", 0xF93485A0,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
-         FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_MarginTop, L"margin-top", 0xFE51DCFE,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeNumber |
-         FDE_CSSVALUETYPE_MaybeEnum},
-    {FDE_CSSPROPERTY_Direction, L"direction", 0xFE746E61,
-     FDE_CSSVALUETYPE_Primitive | FDE_CSSVALUETYPE_MaybeEnum},
-};
-static const FDE_CSSPROPERTYVALUETABLE g_FDE_CSSPropertyValues[] = {
-    {FDE_CSSPROPERTYVALUE_Bolder, L"bolder", 0x009F1058},
-    {FDE_CSSPROPERTYVALUE_LowerLatin, L"lower-latin", 0x016014CE},
-    {FDE_CSSPROPERTYVALUE_Lowercase, L"lowercase", 0x02ACB805},
-    {FDE_CSSPROPERTYVALUE_LowerGreek, L"lower-greek", 0x03D81D64},
-    {FDE_CSSPROPERTYVALUE_Sesame, L"sesame", 0x0432ECDE},
-    {FDE_CSSPROPERTYVALUE_None, L"none", 0x048B6670},
-    {FDE_CSSPROPERTYVALUE_NwResize, L"nw-resize", 0x054B4BE4},
-    {FDE_CSSPROPERTYVALUE_WResize, L"w-resize", 0x0A2F8D76},
-    {FDE_CSSPROPERTYVALUE_Dot, L"dot", 0x0A48CB27},
-    {FDE_CSSPROPERTYVALUE_End, L"end", 0x0A631437},
-    {FDE_CSSPROPERTYVALUE_Ltr, L"ltr", 0x0B1B56D2},
-    {FDE_CSSPROPERTYVALUE_Pre, L"pre", 0x0B848587},
-    {FDE_CSSPROPERTYVALUE_Rtl, L"rtl", 0x0BB92C52},
-    {FDE_CSSPROPERTYVALUE_Sub, L"sub", 0x0BD37FAA},
-    {FDE_CSSPROPERTYVALUE_Top, L"top", 0x0BEDAF33},
-    {FDE_CSSPROPERTYVALUE_Visible, L"visible", 0x0F55D7EE},
-    {FDE_CSSPROPERTYVALUE_Filled, L"filled", 0x10827DD0},
-    {FDE_CSSPROPERTYVALUE_SwResize, L"sw-resize", 0x10B548E9},
-    {FDE_CSSPROPERTYVALUE_NoRepeat, L"no-repeat", 0x1235C18B},
-    {FDE_CSSPROPERTYVALUE_Default, L"default", 0x14DA2125},
-    {FDE_CSSPROPERTYVALUE_Transparent, L"transparent", 0x17B64DB2},
-    {FDE_CSSPROPERTYVALUE_Ridge, L"ridge", 0x18EBEE4B},
-    {FDE_CSSPROPERTYVALUE_Right, L"right", 0x193ADE3E},
-    {FDE_CSSPROPERTYVALUE_HorizontalTb, L"horizontal-tb", 0x1A66A86D},
-    {FDE_CSSPROPERTYVALUE_DistributeLetter, L"distribute-letter", 0x1EDBD75C},
-    {FDE_CSSPROPERTYVALUE_DoubleCircle, L"double-circle", 0x1FF082BA},
-    {FDE_CSSPROPERTYVALUE_Ruby, L"ruby", 0x20D66C02},
-    {FDE_CSSPROPERTYVALUE_Collapse, L"collapse", 0x2128D673},
-    {FDE_CSSPROPERTYVALUE_Normal, L"normal", 0x247CF3E9},
-    {FDE_CSSPROPERTYVALUE_Avoid, L"avoid", 0x24E684B3},
-    {FDE_CSSPROPERTYVALUE_UpperRoman, L"upper-roman", 0x28BAC2B6},
-    {FDE_CSSPROPERTYVALUE_Auto, L"auto", 0x2B35B6D9},
-    {FDE_CSSPROPERTYVALUE_Text, L"text", 0x2D08AF85},
-    {FDE_CSSPROPERTYVALUE_XSmall, L"x-small", 0x2D2FCAFE},
-    {FDE_CSSPROPERTYVALUE_Thin, L"thin", 0x2D574D53},
-    {FDE_CSSPROPERTYVALUE_Repeat, L"repeat", 0x306614A1},
-    {FDE_CSSPROPERTYVALUE_Small, L"small", 0x316A3739},
-    {FDE_CSSPROPERTYVALUE_NeResize, L"ne-resize", 0x31FD5E12},
-    {FDE_CSSPROPERTYVALUE_NoContent, L"no-content", 0x33A1C545},
-    {FDE_CSSPROPERTYVALUE_Outside, L"outside", 0x36DF693D},
-    {FDE_CSSPROPERTYVALUE_EResize, L"e-resize", 0x36E19FA4},
-    {FDE_CSSPROPERTYVALUE_TableRow, L"table-row", 0x3912A02D},
-    {FDE_CSSPROPERTYVALUE_Bottom, L"bottom", 0x399F02B5},
-    {FDE_CSSPROPERTYVALUE_Underline, L"underline", 0x3A0273A6},
-    {FDE_CSSPROPERTYVALUE_CjkIdeographic, L"cjk-ideographic", 0x3A641CC4},
-    {FDE_CSSPROPERTYVALUE_SeResize, L"se-resize", 0x3D675B17},
-    {FDE_CSSPROPERTYVALUE_Fixed, L"fixed", 0x3D7DEB10},
-    {FDE_CSSPROPERTYVALUE_Double, L"double", 0x3D98515B},
-    {FDE_CSSPROPERTYVALUE_Solid, L"solid", 0x40623B5B},
-    {FDE_CSSPROPERTYVALUE_RubyBaseGroup, L"ruby-base-group", 0x41014E84},
-    {FDE_CSSPROPERTYVALUE_OpenQuote, L"open-quote", 0x44A41E8D},
-    {FDE_CSSPROPERTYVALUE_Lighter, L"lighter", 0x45BEB7AF},
-    {FDE_CSSPROPERTYVALUE_LowerRoman, L"lower-roman", 0x5044D253},
-    {FDE_CSSPROPERTYVALUE_Strict, L"strict", 0x52F4EBD9},
-    {FDE_CSSPROPERTYVALUE_TableCaption, L"table-caption", 0x5325CD63},
-    {FDE_CSSPROPERTYVALUE_Oblique, L"oblique", 0x53EBDDB1},
-    {FDE_CSSPROPERTYVALUE_Decimal, L"decimal", 0x54034C2F},
-    {FDE_CSSPROPERTYVALUE_Loose, L"loose", 0x54D3A1E2},
-    {FDE_CSSPROPERTYVALUE_Hebrew, L"hebrew", 0x565792DD},
-    {FDE_CSSPROPERTYVALUE_Hidden, L"hidden", 0x573CB40C},
-    {FDE_CSSPROPERTYVALUE_Dashed, L"dashed", 0x58A3DD29},
-    {FDE_CSSPROPERTYVALUE_Embed, L"embed", 0x59C8F27D},
-    {FDE_CSSPROPERTYVALUE_TableRowGroup, L"table-row-group", 0x5A43BD07},
-    {FDE_CSSPROPERTYVALUE_TableColumn, L"table-column", 0x5E705DA3},
-    {FDE_CSSPROPERTYVALUE_Static, L"static", 0x5E7555E8},
-    {FDE_CSSPROPERTYVALUE_Outset, L"outset", 0x61236164},
-    {FDE_CSSPROPERTYVALUE_DecimalLeadingZero, L"decimal-leading-zero",
-     0x61DFC55D},
-    {FDE_CSSPROPERTYVALUE_KeepWords, L"keep-words", 0x63964801},
-    {FDE_CSSPROPERTYVALUE_KatakanaIroha, L"katakana-iroha", 0x65D7C91C},
-    {FDE_CSSPROPERTYVALUE_Super, L"super", 0x6A4F842F},
-    {FDE_CSSPROPERTYVALUE_Center, L"center", 0x6C51AFC1},
-    {FDE_CSSPROPERTYVALUE_TableHeaderGroup, L"table-header-group", 0x706103D8},
-    {FDE_CSSPROPERTYVALUE_Inside, L"inside", 0x709CB0FC},
-    {FDE_CSSPROPERTYVALUE_XxLarge, L"xx-large", 0x70BB1508},
-    {FDE_CSSPROPERTYVALUE_Triangle, L"triangle", 0x7524EDF6},
-    {FDE_CSSPROPERTYVALUE_RubyTextGroup, L"ruby-text-group", 0x78C2B98E},
-    {FDE_CSSPROPERTYVALUE_Circle, L"circle", 0x7ABEC0D2},
-    {FDE_CSSPROPERTYVALUE_Hiragana, L"hiragana", 0x7BF5E25B},
-    {FDE_CSSPROPERTYVALUE_RepeatX, L"repeat-x", 0x7C8F3226},
-    {FDE_CSSPROPERTYVALUE_RepeatY, L"repeat-y", 0x7C8F3227},
-    {FDE_CSSPROPERTYVALUE_Move, L"move", 0x7DA03417},
-    {FDE_CSSPROPERTYVALUE_HiraganaIroha, L"hiragana-iroha", 0x7EE863FB},
-    {FDE_CSSPROPERTYVALUE_RubyBase, L"ruby-base", 0x7FD1B1EA},
-    {FDE_CSSPROPERTYVALUE_Scroll, L"scroll", 0x84787AEF},
-    {FDE_CSSPROPERTYVALUE_Smaller, L"smaller", 0x849769F0},
-    {FDE_CSSPROPERTYVALUE_TableFooterGroup, L"table-footer-group", 0x85BDD97E},
-    {FDE_CSSPROPERTYVALUE_Baseline, L"baseline", 0x87436BA3},
-    {FDE_CSSPROPERTYVALUE_Separate, L"separate", 0x877C66B5},
-    {FDE_CSSPROPERTYVALUE_Armenian, L"armenian", 0x889BE4EB},
-    {FDE_CSSPROPERTYVALUE_Open, L"open", 0x8B90E1F2},
-    {FDE_CSSPROPERTYVALUE_Relative, L"relative", 0x8C995B5C},
-    {FDE_CSSPROPERTYVALUE_Thick, L"thick", 0x8CC35EB3},
-    {FDE_CSSPROPERTYVALUE_Justify, L"justify", 0x8D269CAE},
-    {FDE_CSSPROPERTYVALUE_Middle, L"middle", 0x947FA00F},
-    {FDE_CSSPROPERTYVALUE_Always, L"always", 0x959AB231},
-    {FDE_CSSPROPERTYVALUE_DistributeSpace, L"distribute-space", 0x97A20E58},
-    {FDE_CSSPROPERTYVALUE_LineEdge, L"line-edge", 0x9A845D2A},
-    {FDE_CSSPROPERTYVALUE_PreWrap, L"pre-wrap", 0x9D59588E},
-    {FDE_CSSPROPERTYVALUE_Medium, L"medium", 0xA084A381},
-    {FDE_CSSPROPERTYVALUE_NResize, L"n-resize", 0xA088968D},
-    {FDE_CSSPROPERTYVALUE_ListItem, L"list-item", 0xA32382B8},
-    {FDE_CSSPROPERTYVALUE_Show, L"show", 0xA66C10C1},
-    {FDE_CSSPROPERTYVALUE_Currentcolor, L"currentColor", 0xA7883922},
-    {FDE_CSSPROPERTYVALUE_NoCloseQuote, L"no-close-quote", 0xA79CBFFB},
-    {FDE_CSSPROPERTYVALUE_VerticalLr, L"vertical-lr", 0xA8673F65},
-    {FDE_CSSPROPERTYVALUE_VerticalRl, L"vertical-rl", 0xA8675E25},
-    {FDE_CSSPROPERTYVALUE_Pointer, L"pointer", 0xA90929C1},
-    {FDE_CSSPROPERTYVALUE_XxSmall, L"xx-small", 0xADE1FC76},
-    {FDE_CSSPROPERTYVALUE_Bold, L"bold", 0xB18313A1},
-    {FDE_CSSPROPERTYVALUE_Both, L"both", 0xB1833CAD},
-    {FDE_CSSPROPERTYVALUE_SmallCaps, L"small-caps", 0xB299428D},
-    {FDE_CSSPROPERTYVALUE_Katakana, L"katakana", 0xB421A4BC},
-    {FDE_CSSPROPERTYVALUE_After, L"after", 0xB6B44172},
-    {FDE_CSSPROPERTYVALUE_Horizontal, L"horizontal", 0xB7732DEA},
-    {FDE_CSSPROPERTYVALUE_Dotted, L"dotted", 0xB88652A4},
-    {FDE_CSSPROPERTYVALUE_Disc, L"disc", 0xBEBC18C3},
-    {FDE_CSSPROPERTYVALUE_Georgian, L"georgian", 0xBEF99E8C},
-    {FDE_CSSPROPERTYVALUE_Inline, L"inline", 0xC02D649F},
-    {FDE_CSSPROPERTYVALUE_Overline, L"overline", 0xC0EC9FA4},
-    {FDE_CSSPROPERTYVALUE_Wait, L"wait", 0xC1613BB5},
-    {FDE_CSSPROPERTYVALUE_BreakAll, L"break-all", 0xC3145BAB},
-    {FDE_CSSPROPERTYVALUE_UpperAlpha, L"upper-alpha", 0xC52D4A9F},
-    {FDE_CSSPROPERTYVALUE_Capitalize, L"capitalize", 0xC5321D46},
-    {FDE_CSSPROPERTYVALUE_Nowrap, L"nowrap", 0xC7994417},
-    {FDE_CSSPROPERTYVALUE_TextBottom, L"text-bottom", 0xC7D08D87},
-    {FDE_CSSPROPERTYVALUE_NoOpenQuote, L"no-open-quote", 0xC8CD7877},
-    {FDE_CSSPROPERTYVALUE_Groove, L"groove", 0xCB24A412},
-    {FDE_CSSPROPERTYVALUE_Progress, L"progress", 0xCD1D9835},
-    {FDE_CSSPROPERTYVALUE_Larger, L"larger", 0xCD3C409D},
-    {FDE_CSSPROPERTYVALUE_CloseQuote, L"close-quote", 0xCF8696D1},
-    {FDE_CSSPROPERTYVALUE_TableCell, L"table-cell", 0xCFB5E595},
-    {FDE_CSSPROPERTYVALUE_PreLine, L"pre-line", 0xD04FEDBC},
-    {FDE_CSSPROPERTYVALUE_Absolute, L"absolute", 0xD0B2D55F},
-    {FDE_CSSPROPERTYVALUE_InlineTable, L"inline-table", 0xD131F494},
-    {FDE_CSSPROPERTYVALUE_BidiOverride, L"bidi-override", 0xD161FDE5},
-    {FDE_CSSPROPERTYVALUE_InlineBlock, L"inline-block", 0xD26A8BD7},
-    {FDE_CSSPROPERTYVALUE_Inset, L"inset", 0xD6F23243},
-    {FDE_CSSPROPERTYVALUE_Crosshair, L"crosshair", 0xD6F8018E},
-    {FDE_CSSPROPERTYVALUE_UpperLatin, L"upper-latin", 0xD9D60531},
-    {FDE_CSSPROPERTYVALUE_Help, L"help", 0xDA002969},
-    {FDE_CSSPROPERTYVALUE_Hide, L"hide", 0xDA69395A},
-    {FDE_CSSPROPERTYVALUE_Uppercase, L"uppercase", 0xDAD595A8},
-    {FDE_CSSPROPERTYVALUE_SResize, L"s-resize", 0xDB3AADF2},
-    {FDE_CSSPROPERTYVALUE_Table, L"table", 0xDB9BE968},
-    {FDE_CSSPROPERTYVALUE_Blink, L"blink", 0xDC36E390},
-    {FDE_CSSPROPERTYVALUE_Block, L"block", 0xDCD480AB},
-    {FDE_CSSPROPERTYVALUE_Start, L"start", 0xE1D9D5AE},
-    {FDE_CSSPROPERTYVALUE_TableColumnGroup, L"table-column-group", 0xE2258EFD},
-    {FDE_CSSPROPERTYVALUE_Italic, L"italic", 0xE31D5396},
-    {FDE_CSSPROPERTYVALUE_LineThrough, L"line-through", 0xE4C5A276},
-    {FDE_CSSPROPERTYVALUE_KeepAll, L"keep-all", 0xE704A72B},
-    {FDE_CSSPROPERTYVALUE_LowerAlpha, L"lower-alpha", 0xECB75A3C},
-    {FDE_CSSPROPERTYVALUE_RunIn, L"run-in", 0xEEC930B9},
-    {FDE_CSSPROPERTYVALUE_Square, L"square", 0xEF85D351},
-    {FDE_CSSPROPERTYVALUE_XLarge, L"x-large", 0xF008E390},
-    {FDE_CSSPROPERTYVALUE_Large, L"large", 0xF4434FCB},
-    {FDE_CSSPROPERTYVALUE_Before, L"before", 0xF4FFCE73},
-    {FDE_CSSPROPERTYVALUE_Left, L"left", 0xF5AD782B},
-    {FDE_CSSPROPERTYVALUE_TextTop, L"text-top", 0xFCB58D45},
-    {FDE_CSSPROPERTYVALUE_RubyText, L"ruby-text", 0xFCC77174},
-    {FDE_CSSPROPERTYVALUE_NoDisplay, L"no-display", 0xFE482860},
-};
-static const FDE_CSSMEDIATYPETABLE g_FDE_CSSMediaTypes[] = {
-    {0xF09, 0x02},  {0x4880, 0x20}, {0x536A, 0x80},
-    {0x741D, 0x10}, {0x76ED, 0x08}, {0x7CFB, 0x01},
-    {0x9578, 0x04}, {0xC8E1, 0x40}, {0xD0F9, 0xFF},
-};
-static const FDE_CSSLENGTHUNITTABLE g_FDE_CSSLengthUnits[] = {
-    {0x0672, 3},  {0x067D, 4}, {0x1AF7, 8}, {0x2F7A, 7},
-    {0x3ED3, 10}, {0x3EE4, 9}, {0x3EE8, 5}, {0xFC30, 6},
-};
-static const FDE_CSSCOLORTABLE g_FDE_CSSColors[] = {
-    {0x031B47FE, 0xff000080}, {0x0BB8DF5B, 0xffff0000},
-    {0x0D82A78C, 0xff800000}, {0x2ACC82E8, 0xff00ffff},
-    {0x2D083986, 0xff008080}, {0x4A6A6195, 0xffc0c0c0},
-    {0x546A8EF3, 0xff808080}, {0x65C9169C, 0xffffa500},
-    {0x8422BB61, 0xffffffff}, {0x9271A558, 0xff800080},
-    {0xA65A3EE3, 0xffff00ff}, {0xB1345708, 0xff0000ff},
-    {0xB6D2CF1F, 0xff808000}, {0xD19B5E1C, 0xffffff00},
-    {0xDB64391D, 0xff000000}, {0xF616D507, 0xff00ff00},
-    {0xF6EFFF31, 0xff008000},
-};
-static const FDE_CSSPERSUDOTABLE g_FDE_CSSPersudoType[] = {
-    {FDE_CSSPERSUDO_After, L":after", 0x16EE1FEC},
-    {FDE_CSSPERSUDO_Before, L":before", 0x7DCDDE2D},
-};
-FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo) {
-  return (ePersudo < FDE_CSSPERSUDO_NONE) ? (g_FDE_CSSPersudoType + ePersudo)
-                                          : NULL;
-}
-FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(const FX_WCHAR* pszName,
-                                                 int32_t iLength) {
-  FXSYS_assert(pszName != NULL && iLength > 0);
-  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
-  int32_t iEnd = FDE_CSSPROPERTY_MAX - 1;
-  int32_t iMid, iStart = 0;
-  FX_DWORD dwMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    dwMid = g_FDE_CSSProperties[iMid].dwHash;
-    if (dwHash == dwMid) {
-      return g_FDE_CSSProperties + iMid;
-    } else if (dwHash > dwMid) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName) {
-  return (eName < FDE_CSSPROPERTY_MAX) ? (g_FDE_CSSProperties + eName) : NULL;
-}
-FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(
-    const FX_WCHAR* pszName,
-    int32_t iLength) {
-  FXSYS_assert(pszName != NULL && iLength > 0);
-  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
-  int32_t iEnd = FDE_CSSPROPERTYVALUE_MAX - 1;
-  int32_t iMid, iStart = 0;
-  FX_DWORD dwMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    dwMid = g_FDE_CSSPropertyValues[iMid].dwHash;
-    if (dwHash == dwMid) {
-      return g_FDE_CSSPropertyValues + iMid;
-    } else if (dwHash > dwMid) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(
-    FDE_CSSPROPERTYVALUE eName) {
-  return (eName < FDE_CSSPROPERTYVALUE_MAX) ? (g_FDE_CSSPropertyValues + eName)
-                                            : NULL;
-}
-FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(const FX_WCHAR* pszName,
-                                                   int32_t iLength) {
-  FXSYS_assert(pszName != NULL && iLength > 0);
-  FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE);
-  int32_t iEnd =
-      sizeof(g_FDE_CSSMediaTypes) / sizeof(FDE_CSSMEDIATYPETABLE) - 1;
-  int32_t iMid, iStart = 0;
-  FX_WORD uMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    uMid = g_FDE_CSSMediaTypes[iMid].wHash;
-    if (wHash == uMid) {
-      return g_FDE_CSSMediaTypes + iMid;
-    } else if (wHash > uMid) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(const FX_WCHAR* pszName,
-                                                     int32_t iLength) {
-  FXSYS_assert(pszName != NULL && iLength > 0);
-  FX_WORD wHash = (FX_WORD)FX_HashCode_String_GetW(pszName, iLength, TRUE);
-  int32_t iEnd =
-      sizeof(g_FDE_CSSLengthUnits) / sizeof(FDE_CSSLENGTHUNITTABLE) - 1;
-  int32_t iMid, iStart = 0;
-  FX_WORD wMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    wMid = g_FDE_CSSLengthUnits[iMid].wHash;
-    if (wHash == wMid) {
-      return g_FDE_CSSLengthUnits + iMid;
-    } else if (wHash > wMid) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(const FX_WCHAR* pszName,
-                                           int32_t iLength) {
-  FXSYS_assert(pszName != NULL && iLength > 0);
-  FX_DWORD dwHash = FX_HashCode_String_GetW(pszName, iLength, TRUE);
-  int32_t iEnd = sizeof(g_FDE_CSSColors) / sizeof(FDE_CSSCOLORTABLE) - 1;
-  int32_t iMid, iStart = 0;
-  FX_DWORD dwMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    dwMid = g_FDE_CSSColors[iMid].dwHash;
-    if (dwHash == dwMid) {
-      return g_FDE_CSSColors + iMid;
-    } else if (dwHash > dwMid) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-FX_BOOL FDE_ParseCSSNumber(const FX_WCHAR* pszValue,
-                           int32_t iValueLen,
-                           FX_FLOAT& fValue,
-                           FDE_CSSPRIMITIVETYPE& eUnit) {
-  FXSYS_assert(pszValue != NULL && iValueLen > 0);
-  int32_t iUsedLen = 0;
-  fValue = FX_wcstof(pszValue, iValueLen, &iUsedLen);
-  if (iUsedLen <= 0) {
-    return FALSE;
-  }
-  iValueLen -= iUsedLen;
-  pszValue += iUsedLen;
-  eUnit = FDE_CSSPRIMITIVETYPE_Number;
-  if (iValueLen >= 1 && *pszValue == '%') {
-    eUnit = FDE_CSSPRIMITIVETYPE_Percent;
-  } else if (iValueLen == 2) {
-    FDE_LPCCSSLENGTHUNITTABLE pUnit = FDE_GetCSSLengthUnitByName(pszValue, 2);
-    if (pUnit != NULL) {
-      eUnit = (FDE_CSSPRIMITIVETYPE)pUnit->wValue;
-    }
-  }
-  return TRUE;
-}
-
-FX_BOOL FDE_ParseCSSString(const FX_WCHAR* pszValue,
-                           int32_t iValueLen,
-                           int32_t& iOffset,
-                           int32_t& iLength) {
-  FXSYS_assert(pszValue != NULL && iValueLen > 0);
-  iOffset = 0;
-  iLength = iValueLen;
-  if (iValueLen >= 2) {
-    FX_WCHAR first = pszValue[0], last = pszValue[iValueLen - 1];
-    if ((first == '\"' && last == '\"') || (first == '\'' && last == '\'')) {
-      iOffset = 1, iLength -= 2;
-    }
-  }
-  return iValueLen > 0;
-}
-
-FX_BOOL FDE_ParseCSSURI(const FX_WCHAR* pszValue,
-                        int32_t iValueLen,
-                        int32_t& iOffset,
-                        int32_t& iLength) {
-  FXSYS_assert(pszValue != NULL && iValueLen > 0);
-  if (iValueLen < 6 || pszValue[iValueLen - 1] != ')' ||
-      FX_wcsnicmp(L"url(", pszValue, 4)) {
-    return FALSE;
-  }
-  if (FDE_ParseCSSString(pszValue + 4, iValueLen - 5, iOffset, iLength)) {
-    iOffset += 4;
-    return TRUE;
-  }
-  return FALSE;
-}
-
-FX_BOOL FDE_ParseCSSColor(const FX_WCHAR* pszValue,
-                          int32_t iValueLen,
-                          FX_ARGB& dwColor) {
-  FXSYS_assert(pszValue != NULL && iValueLen > 0);
-  if (*pszValue == '#') {
-    switch (iValueLen) {
-      case 4: {
-        uint8_t red = FX_Hex2Dec((uint8_t)pszValue[1], (uint8_t)pszValue[1]);
-        uint8_t green = FX_Hex2Dec((uint8_t)pszValue[2], (uint8_t)pszValue[2]);
-        uint8_t blue = FX_Hex2Dec((uint8_t)pszValue[3], (uint8_t)pszValue[3]);
-        dwColor = ArgbEncode(255, red, green, blue);
-      }
-        return TRUE;
-      case 7: {
-        uint8_t red = FX_Hex2Dec((uint8_t)pszValue[1], (uint8_t)pszValue[2]);
-        uint8_t green = FX_Hex2Dec((uint8_t)pszValue[3], (uint8_t)pszValue[4]);
-        uint8_t blue = FX_Hex2Dec((uint8_t)pszValue[5], (uint8_t)pszValue[6]);
-        dwColor = ArgbEncode(255, red, green, blue);
-      }
-        return TRUE;
-    }
-  } else if (iValueLen >= 10) {
-    if (pszValue[iValueLen - 1] != ')' || FX_wcsnicmp(L"rgb(", pszValue, 4)) {
-      return FALSE;
-    }
-    uint8_t rgb[3] = {0};
-    FX_FLOAT fValue;
-    FDE_CSSPRIMITIVETYPE eType;
-    CFDE_CSSValueListParser list(pszValue + 4, iValueLen - 5, ',');
-    for (int32_t i = 0; i < 3; ++i) {
-      if (!list.NextValue(eType, pszValue, iValueLen)) {
-        return FALSE;
-      }
-      if (eType != FDE_CSSPRIMITIVETYPE_Number) {
-        return FALSE;
-      }
-      if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-        return FALSE;
-      }
-      rgb[i] = eType == FDE_CSSPRIMITIVETYPE_Percent
-                   ? FXSYS_round(fValue * 2.55f)
-                   : FXSYS_round(fValue);
-    }
-    dwColor = ArgbEncode(255, rgb[0], rgb[1], rgb[2]);
-    return TRUE;
-  } else {
-    FDE_LPCCSSCOLORTABLE pColor = FDE_GetCSSColorByName(pszValue, iValueLen);
-    if (pColor != NULL) {
-      dwColor = pColor->dwValue;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-CFDE_CSSValueList::CFDE_CSSValueList(IFX_MEMAllocator* pStaticStore,
-                                     const CFDE_CSSValueArray& list) {
-  m_iCount = list.GetSize();
-  int32_t iByteCount = m_iCount * sizeof(IFDE_CSSValue*);
-  m_ppList = (IFDE_CSSValue**)pStaticStore->Alloc(iByteCount);
-  FXSYS_memcpy(m_ppList, list.GetData(), iByteCount);
-}
-FX_BOOL CFDE_CSSValueListParser::NextValue(FDE_CSSPRIMITIVETYPE& eType,
-                                           const FX_WCHAR*& pStart,
-                                           int32_t& iLength) {
-  while (m_pCur < m_pEnd && (*m_pCur <= ' ' || *m_pCur == m_Separator)) {
-    ++m_pCur;
-  }
-  if (m_pCur >= m_pEnd) {
-    return FALSE;
-  }
-  eType = FDE_CSSPRIMITIVETYPE_Unknown;
-  pStart = m_pCur;
-  iLength = 0;
-  FX_WCHAR wch = *m_pCur;
-  if (wch == '#') {
-    iLength = SkipTo(' ');
-    if (iLength == 4 || iLength == 7) {
-      eType = FDE_CSSPRIMITIVETYPE_RGB;
-    }
-  } else if ((wch >= '0' && wch <= '9') || wch == '.' || wch == '-' ||
-             wch == '+') {
-    while (m_pCur < m_pEnd && (*m_pCur > ' ' && *m_pCur != m_Separator)) {
-      ++m_pCur;
-    }
-    iLength = m_pCur - pStart;
-    if (iLength > 0) {
-      eType = FDE_CSSPRIMITIVETYPE_Number;
-    }
-  } else if (wch == '\"' || wch == '\'') {
-    pStart++;
-    iLength = SkipTo(wch) - 1;
-    m_pCur++;
-    eType = FDE_CSSPRIMITIVETYPE_String;
-  } else if (m_pEnd - m_pCur > 5 && m_pCur[3] == '(') {
-    if (FX_wcsnicmp(L"url", m_pCur, 3) == 0) {
-      wch = m_pCur[4];
-      if (wch == '\"' || wch == '\'') {
-        pStart += 5;
-        iLength = SkipTo(wch) - 6;
-        m_pCur += 2;
-      } else {
-        pStart += 4;
-        iLength = SkipTo(')') - 4;
-        m_pCur++;
-      }
-      eType = FDE_CSSPRIMITIVETYPE_URI;
-    } else if (FX_wcsnicmp(L"rgb", m_pCur, 3) == 0) {
-      iLength = SkipTo(')') + 1;
-      m_pCur++;
-      eType = FDE_CSSPRIMITIVETYPE_RGB;
-    }
-  } else {
-    iLength = SkipTo(m_Separator, TRUE, TRUE);
-    eType = FDE_CSSPRIMITIVETYPE_String;
-  }
-  return m_pCur <= m_pEnd && iLength > 0;
-}
-int32_t CFDE_CSSValueListParser::SkipTo(FX_WCHAR wch,
-                                        FX_BOOL bWSSeparator,
-                                        FX_BOOL bBrContinue) {
-  const FX_WCHAR* pStart = m_pCur;
-  if (!bBrContinue) {
-    if (bWSSeparator) {
-      while ((++m_pCur < m_pEnd) && (*m_pCur != wch) && (*m_pCur > ' ')) {
-        continue;
-      }
-    } else {
-      while (++m_pCur < m_pEnd && *m_pCur != wch) {
-        continue;
-      }
-    }
-
-  } else {
-    int32_t iBracketCount = 0;
-    if (bWSSeparator) {
-      while ((m_pCur < m_pEnd) && (*m_pCur != wch) && (*m_pCur > ' ')) {
-        if (*m_pCur == '(') {
-          iBracketCount++;
-        } else if (*m_pCur == ')') {
-          iBracketCount--;
-        }
-        m_pCur++;
-      }
-    } else {
-      while (m_pCur < m_pEnd && *m_pCur != wch) {
-        if (*m_pCur == '(') {
-          iBracketCount++;
-        } else if (*m_pCur == ')') {
-          iBracketCount--;
-        }
-        m_pCur++;
-      }
-    }
-    while (iBracketCount > 0 && m_pCur < m_pEnd) {
-      if (*m_pCur == ')') {
-        iBracketCount--;
-      }
-      m_pCur++;
-    }
-  }
-  return m_pCur - pStart;
-}
diff --git a/xfa/src/fde/css/fde_cssdatatable.h b/xfa/src/fde/css/fde_cssdatatable.h
deleted file mode 100644
index 950b8d3..0000000
--- a/xfa/src/fde/css/fde_cssdatatable.h
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSDATATABLE_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSDATATABLE_H_
-
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fde/css/fde_css.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class CFDE_CSSFunction : public CFX_Target {
- public:
-  CFDE_CSSFunction(const FX_WCHAR* pszFuncName, IFDE_CSSValueList* pArgList)
-      : m_pArgList(pArgList), m_pszFuncName(pszFuncName) {
-    FXSYS_assert(pArgList != NULL);
-  }
-  int32_t CountArgs() const { return m_pArgList->CountValues(); }
-  IFDE_CSSValue* GetArgs(int32_t index) const {
-    return m_pArgList->GetValue(index);
-  }
-  const FX_WCHAR* GetFuncName() const { return m_pszFuncName; }
-
- protected:
-  IFDE_CSSValueList* m_pArgList;
-  const FX_WCHAR* m_pszFuncName;
-};
-class CFDE_CSSPrimitiveValue : public IFDE_CSSPrimitiveValue,
-                               public CFX_Target {
- public:
-  CFDE_CSSPrimitiveValue(const CFDE_CSSPrimitiveValue& src) { *this = src; }
-  CFDE_CSSPrimitiveValue(FX_ARGB color)
-      : m_eType(FDE_CSSPRIMITIVETYPE_RGB), m_dwColor(color) {}
-  CFDE_CSSPrimitiveValue(FDE_CSSPROPERTYVALUE eValue)
-      : m_eType(FDE_CSSPRIMITIVETYPE_Enum), m_eEnum(eValue) {}
-  CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, FX_FLOAT fValue)
-      : m_eType(eType), m_fNumber(fValue) {}
-  CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, const FX_WCHAR* pValue)
-      : m_eType(eType), m_pString(pValue) {
-    FXSYS_assert(m_pString != NULL);
-  }
-  CFDE_CSSPrimitiveValue(CFDE_CSSFunction* pFunction)
-      : m_eType(FDE_CSSPRIMITIVETYPE_Function), m_pFunction(pFunction) {}
-
-  virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const { return m_eType; }
-
-  virtual FX_ARGB GetRGBColor() const {
-    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_RGB);
-    return m_dwColor;
-  }
-  virtual FX_FLOAT GetFloat() const {
-    FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_Number &&
-                 m_eType <= FDE_CSSPRIMITIVETYPE_PC);
-    return m_fNumber;
-  }
-  virtual const FX_WCHAR* GetString(int32_t& iLength) const {
-    FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_String &&
-                 m_eType <= FDE_CSSPRIMITIVETYPE_URI);
-    iLength = FXSYS_wcslen(m_pString);
-    return m_pString;
-  }
-  virtual FDE_CSSPROPERTYVALUE GetEnum() const {
-    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Enum);
-    return m_eEnum;
-  }
-  virtual const FX_WCHAR* GetFuncName() const {
-    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
-    return m_pFunction->GetFuncName();
-  }
-  virtual int32_t CountArgs() const {
-    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
-    return m_pFunction->CountArgs();
-  }
-  virtual IFDE_CSSValue* GetArgs(int32_t index) const {
-    FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function);
-    return m_pFunction->GetArgs(index);
-  }
-
-  FDE_CSSPRIMITIVETYPE m_eType;
-  union {
-    FX_ARGB m_dwColor;
-    FX_FLOAT m_fNumber;
-    const FX_WCHAR* m_pString;
-    FDE_CSSPROPERTYVALUE m_eEnum;
-    CFDE_CSSFunction* m_pFunction;
-  };
-};
-typedef CFX_ArrayTemplate<IFDE_CSSPrimitiveValue*> CFDE_CSSPrimitiveArray;
-typedef CFX_ArrayTemplate<IFDE_CSSValue*> CFDE_CSSValueArray;
-class CFDE_CSSValueList : public IFDE_CSSValueList, public CFX_Target {
- public:
-  CFDE_CSSValueList(IFX_MEMAllocator* pStaticStore,
-                    const CFDE_CSSValueArray& list);
-  virtual int32_t CountValues() const { return m_iCount; }
-  virtual IFDE_CSSValue* GetValue(int32_t index) const {
-    return m_ppList[index];
-  }
-
- protected:
-  IFDE_CSSValue** m_ppList;
-  int32_t m_iCount;
-};
-class CFDE_CSSValueListParser : public CFX_Target {
- public:
-  CFDE_CSSValueListParser(const FX_WCHAR* psz, int32_t iLen, FX_WCHAR separator)
-      : m_Separator(separator), m_pCur(psz), m_pEnd(psz + iLen) {
-    FXSYS_assert(psz != NULL && iLen > 0);
-  }
-  FX_BOOL NextValue(FDE_CSSPRIMITIVETYPE& eType,
-                    const FX_WCHAR*& pStart,
-                    int32_t& iLength);
-  FX_WCHAR m_Separator;
-
- protected:
-  int32_t SkipTo(FX_WCHAR wch,
-                 FX_BOOL bWSSeparator = FALSE,
-                 FX_BOOL bBrContinue = FALSE);
-  const FX_WCHAR* m_pCur;
-  const FX_WCHAR* m_pEnd;
-};
-
-#define FDE_CSSVALUETYPE_MaybeNumber 0x0100
-#define FDE_CSSVALUETYPE_MaybeEnum 0x0200
-#define FDE_CSSVALUETYPE_MaybeURI 0x0400
-#define FDE_CSSVALUETYPE_MaybeString 0x0800
-#define FDE_CSSVALUETYPE_MaybeColor 0x1000
-#define FDE_CSSVALUETYPE_MaybeFunction 0x2000
-#define FDE_IsOnlyValue(type, enum) \
-  (((type) & ~(enum)) == FDE_CSSVALUETYPE_Primitive)
-struct FDE_CSSPROPERTYTABLE {
-  FDE_CSSPROPERTY eName;
-  const FX_WCHAR* pszName;
-  FX_DWORD dwHash;
-  FX_DWORD dwType;
-};
-typedef FDE_CSSPROPERTYTABLE const* FDE_LPCCSSPROPERTYTABLE;
-
-FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(const FX_WCHAR* pszName,
-                                                 int32_t iLength);
-FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName);
-struct FDE_CSSPROPERTYVALUETABLE {
-  FDE_CSSPROPERTYVALUE eName;
-  const FX_WCHAR* pszName;
-  FX_DWORD dwHash;
-};
-typedef FDE_CSSPROPERTYVALUETABLE const* FDE_LPCCSSPROPERTYVALUETABLE;
-
-FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName(
-    const FX_WCHAR* pszName,
-    int32_t iLength);
-FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum(
-    FDE_CSSPROPERTYVALUE eName);
-struct FDE_CSSMEDIATYPETABLE {
-  FX_WORD wHash;
-  FX_WORD wValue;
-};
-typedef FDE_CSSMEDIATYPETABLE const* FDE_LPCCSSMEDIATYPETABLE;
-FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(const FX_WCHAR* pszName,
-                                                   int32_t iLength);
-struct FDE_CSSLENGTHUNITTABLE {
-  FX_WORD wHash;
-  FX_WORD wValue;
-};
-typedef FDE_CSSLENGTHUNITTABLE const* FDE_LPCCSSLENGTHUNITTABLE;
-FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(const FX_WCHAR* pszName,
-                                                     int32_t iLength);
-struct FDE_CSSCOLORTABLE {
-  FX_DWORD dwHash;
-  FX_ARGB dwValue;
-};
-typedef FDE_CSSCOLORTABLE const* FDE_LPCCSSCOLORTABLE;
-FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(const FX_WCHAR* pszName,
-                                           int32_t iLength);
-struct FDE_CSSPERSUDOTABLE {
-  FDE_CSSPERSUDO eName;
-  const FX_WCHAR* pszName;
-  FX_DWORD dwHash;
-};
-typedef FDE_CSSPERSUDOTABLE const* FDE_LPCCSSPERSUDOTABLE;
-
-FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo);
-FX_BOOL FDE_ParseCSSNumber(const FX_WCHAR* pszValue,
-                           int32_t iValueLen,
-                           FX_FLOAT& fValue,
-                           FDE_CSSPRIMITIVETYPE& eUnit);
-FX_BOOL FDE_ParseCSSString(const FX_WCHAR* pszValue,
-                           int32_t iValueLen,
-                           int32_t& iOffset,
-                           int32_t& iLength);
-FX_BOOL FDE_ParseCSSColor(const FX_WCHAR* pszValue,
-                          int32_t iValueLen,
-                          FX_ARGB& dwColor);
-FX_BOOL FDE_ParseCSSURI(const FX_WCHAR* pszValue,
-                        int32_t iValueLen,
-                        int32_t& iOffset,
-                        int32_t& iLength);
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSDATATABLE_H_
diff --git a/xfa/src/fde/css/fde_cssdeclaration.cpp b/xfa/src/fde/css/fde_cssdeclaration.cpp
deleted file mode 100644
index 073c14d..0000000
--- a/xfa/src/fde/css/fde_cssdeclaration.cpp
+++ /dev/null
@@ -1,1377 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_cssdeclaration.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/crt/fgas_system.h"
-
-IFDE_CSSValue* CFDE_CSSDeclaration::GetProperty(FDE_CSSPROPERTY eProperty,
-                                                FX_BOOL& bImportant) const {
-  for (const FDE_CSSPropertyHolder* pHolder = m_pFirstProperty; pHolder;
-       pHolder = pHolder->pNext) {
-    if (pHolder->eProperty == eProperty) {
-      bImportant = pHolder->bImportant;
-      return pHolder->pValue;
-    }
-  }
-  return NULL;
-}
-FX_POSITION CFDE_CSSDeclaration::GetStartPosition() const {
-  return (FX_POSITION)m_pFirstProperty;
-}
-void CFDE_CSSDeclaration::GetNextProperty(FX_POSITION& pos,
-                                          FDE_CSSPROPERTY& eProperty,
-                                          IFDE_CSSValue*& pValue,
-                                          FX_BOOL& bImportant) const {
-  const FDE_CSSPropertyHolder* pHolder = (const FDE_CSSPropertyHolder*)pos;
-  FXSYS_assert(pHolder != NULL);
-  bImportant = pHolder->bImportant;
-  eProperty = (FDE_CSSPROPERTY)pHolder->eProperty;
-  pValue = pHolder->pValue;
-  pos = (FX_POSITION)pHolder->pNext;
-}
-FX_POSITION CFDE_CSSDeclaration::GetStartCustom() const {
-  return (FX_POSITION)m_pFirstCustom;
-}
-void CFDE_CSSDeclaration::GetNextCustom(FX_POSITION& pos,
-                                        CFX_WideString& wsName,
-                                        CFX_WideString& wsValue) const {
-  const FDE_CSSCustomProperty* pProperty = (const FDE_CSSCustomProperty*)pos;
-  if (pProperty == NULL) {
-    return;
-  }
-  wsName = pProperty->pwsName;
-  wsValue = pProperty->pwsValue;
-  pos = (FX_POSITION)pProperty->pNext;
-}
-const FX_WCHAR* CFDE_CSSDeclaration::CopyToLocal(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen) {
-  FXSYS_assert(iValueLen > 0);
-  CFX_MapPtrToPtr* pCache = pArgs->pStringCache;
-  void* pKey = NULL;
-  if (pCache) {
-    void* pszCached = NULL;
-    pKey =
-        (void*)(uintptr_t)FX_HashCode_String_GetW(pszValue, iValueLen, FALSE);
-    if (pCache->Lookup(pKey, pszCached)) {
-      return (const FX_WCHAR*)pszCached;
-    }
-  }
-  FX_WCHAR* psz =
-      (FX_WCHAR*)pArgs->pStaticStore->Alloc((iValueLen + 1) * sizeof(FX_WCHAR));
-  if (psz == NULL) {
-    return NULL;
-  }
-  FXSYS_wcsncpy(psz, pszValue, iValueLen);
-  psz[iValueLen] = '\0';
-  if (pCache) {
-    pCache->SetAt(pKey, psz);
-  }
-  return psz;
-}
-IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewNumberValue(
-    IFX_MEMAllocator* pStaticStore,
-    FDE_CSSPRIMITIVETYPE eUnit,
-    FX_FLOAT fValue) const {
-  static CFDE_CSSPrimitiveValue s_ZeroValue(FDE_CSSPRIMITIVETYPE_Number, 0.0f);
-  if (eUnit == FDE_CSSPRIMITIVETYPE_Number && FXSYS_fabs(fValue) < 0.001f) {
-    return &s_ZeroValue;
-  }
-  return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eUnit, fValue);
-}
-inline IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewEnumValue(
-    IFX_MEMAllocator* pStaticStore,
-    FDE_CSSPROPERTYVALUE eValue) const {
-  return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eValue);
-}
-void CFDE_CSSDeclaration::AddPropertyHolder(IFX_MEMAllocator* pStaticStore,
-                                            FDE_CSSPROPERTY eProperty,
-                                            IFDE_CSSValue* pValue,
-                                            FX_BOOL bImportant) {
-  FDE_CSSPropertyHolder* pHolder =
-      FXTARGET_NewWith(pStaticStore) FDE_CSSPropertyHolder;
-  pHolder->bImportant = bImportant;
-  pHolder->eProperty = eProperty;
-  pHolder->pValue = pValue;
-  pHolder->pNext = NULL;
-  if (m_pLastProperty == NULL) {
-    m_pLastProperty = m_pFirstProperty = pHolder;
-  } else {
-    m_pLastProperty->pNext = pHolder;
-    m_pLastProperty = pHolder;
-  }
-}
-FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                         const FX_WCHAR* pszValue,
-                                         int32_t iValueLen) {
-  FXSYS_assert(iValueLen > 0);
-  FX_BOOL bImportant = FALSE;
-  if (iValueLen >= 10 && pszValue[iValueLen - 10] == '!' &&
-      FX_wcsnicmp(L"important", pszValue + iValueLen - 9, 9) == 0) {
-    if ((iValueLen -= 10) == 0) {
-      return FALSE;
-    }
-    bImportant = TRUE;
-  }
-  const FX_DWORD dwType = pArgs->pProperty->dwType;
-  switch (dwType & 0x0F) {
-    case FDE_CSSVALUETYPE_Primitive: {
-      static const FX_DWORD g_ValueGuessOrder[] = {
-          FDE_CSSVALUETYPE_MaybeNumber,   FDE_CSSVALUETYPE_MaybeEnum,
-          FDE_CSSVALUETYPE_MaybeColor,    FDE_CSSVALUETYPE_MaybeURI,
-          FDE_CSSVALUETYPE_MaybeFunction, FDE_CSSVALUETYPE_MaybeString,
-      };
-      static const int32_t g_ValueGuessCount =
-          sizeof(g_ValueGuessOrder) / sizeof(FX_DWORD);
-      for (int32_t i = 0; i < g_ValueGuessCount; ++i) {
-        const FX_DWORD dwMatch = dwType & g_ValueGuessOrder[i];
-        if (dwMatch == 0) {
-          continue;
-        }
-        IFDE_CSSValue* pCSSValue = NULL;
-        switch (dwMatch) {
-          case FDE_CSSVALUETYPE_MaybeFunction:
-            pCSSValue = ParseFunction(pArgs, pszValue, iValueLen);
-            break;
-          case FDE_CSSVALUETYPE_MaybeNumber:
-            pCSSValue = ParseNumber(pArgs, pszValue, iValueLen);
-            break;
-          case FDE_CSSVALUETYPE_MaybeEnum:
-            pCSSValue = ParseEnum(pArgs, pszValue, iValueLen);
-            break;
-          case FDE_CSSVALUETYPE_MaybeColor:
-            pCSSValue = ParseColor(pArgs, pszValue, iValueLen);
-            break;
-          case FDE_CSSVALUETYPE_MaybeURI:
-            pCSSValue = ParseURI(pArgs, pszValue, iValueLen);
-            break;
-          case FDE_CSSVALUETYPE_MaybeString:
-            pCSSValue = ParseString(pArgs, pszValue, iValueLen);
-            break;
-          default:
-            break;
-        }
-        if (pCSSValue != NULL) {
-          AddPropertyHolder(pArgs->pStaticStore, pArgs->pProperty->eName,
-                            pCSSValue, bImportant);
-          return TRUE;
-        }
-        if (FDE_IsOnlyValue(dwType, g_ValueGuessOrder[i])) {
-          return FALSE;
-        }
-      }
-    } break;
-    case FDE_CSSVALUETYPE_Shorthand: {
-      IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-      IFDE_CSSValue *pColor, *pStyle, *pWidth;
-      switch (pArgs->pProperty->eName) {
-        case FDE_CSSPROPERTY_Font:
-          return ParseFontProperty(pArgs, pszValue, iValueLen, bImportant);
-        case FDE_CSSPROPERTY_Background:
-          return ParseBackgroundProperty(pArgs, pszValue, iValueLen,
-                                         bImportant);
-        case FDE_CSSPROPERTY_ListStyle:
-          return ParseListStyleProperty(pArgs, pszValue, iValueLen, bImportant);
-        case FDE_CSSPROPERTY_Border:
-          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
-                                   pStyle, pWidth)) {
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderLeftColor,
-                              FDE_CSSPROPERTY_BorderLeftStyle,
-                              FDE_CSSPROPERTY_BorderLeftWidth);
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderTopColor,
-                              FDE_CSSPROPERTY_BorderTopStyle,
-                              FDE_CSSPROPERTY_BorderTopWidth);
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderRightColor,
-                              FDE_CSSPROPERTY_BorderRightStyle,
-                              FDE_CSSPROPERTY_BorderRightWidth);
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderBottomColor,
-                              FDE_CSSPROPERTY_BorderBottomStyle,
-                              FDE_CSSPROPERTY_BorderBottomWidth);
-            return TRUE;
-          }
-          break;
-        case FDE_CSSPROPERTY_BorderLeft:
-          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
-                                   pStyle, pWidth)) {
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderLeftColor,
-                              FDE_CSSPROPERTY_BorderLeftStyle,
-                              FDE_CSSPROPERTY_BorderLeftWidth);
-            return TRUE;
-          }
-          break;
-        case FDE_CSSPROPERTY_BorderTop:
-          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
-                                   pStyle, pWidth)) {
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderTopColor,
-                              FDE_CSSPROPERTY_BorderTopStyle,
-                              FDE_CSSPROPERTY_BorderTopWidth);
-            return TRUE;
-          }
-          break;
-        case FDE_CSSPROPERTY_BorderRight:
-          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
-                                   pStyle, pWidth)) {
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderRightColor,
-                              FDE_CSSPROPERTY_BorderRightStyle,
-                              FDE_CSSPROPERTY_BorderRightWidth);
-            return TRUE;
-          }
-          break;
-        case FDE_CSSPROPERTY_BorderBottom:
-          if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor,
-                                   pStyle, pWidth)) {
-            AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant,
-                              FDE_CSSPROPERTY_BorderBottomColor,
-                              FDE_CSSPROPERTY_BorderBottomStyle,
-                              FDE_CSSPROPERTY_BorderBottomWidth);
-            return TRUE;
-          }
-          break;
-        case FDE_CSSPROPERTY_Overflow:
-          return ParseOverflowProperty(pArgs, pszValue, iValueLen, bImportant);
-        case FDE_CSSPROPERTY_ColumnRule:
-          return ParseColumnRuleProperty(pArgs, pszValue, iValueLen,
-                                         bImportant);
-        default:
-          break;
-      }
-    } break;
-    case FDE_CSSVALUETYPE_List:
-      switch (pArgs->pProperty->eName) {
-        case FDE_CSSPROPERTY_CounterIncrement:
-        case FDE_CSSPROPERTY_CounterReset:
-          return ParseCounterProperty(pArgs, pszValue, iValueLen, bImportant);
-        case FDE_CSSPROPERTY_Content:
-          return ParseContentProperty(pArgs, pszValue, iValueLen, bImportant);
-        default:
-          return ParseValueListProperty(pArgs, pszValue, iValueLen, bImportant);
-      }
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  return FALSE;
-}
-FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                         const FX_WCHAR* pszName,
-                                         int32_t iNameLen,
-                                         const FX_WCHAR* pszValue,
-                                         int32_t iValueLen) {
-  FDE_CSSCustomProperty* pProperty =
-      FXTARGET_NewWith(pArgs->pStaticStore) FDE_CSSCustomProperty;
-  pProperty->pwsName = CopyToLocal(pArgs, pszName, iNameLen);
-  pProperty->pwsValue = CopyToLocal(pArgs, pszValue, iValueLen);
-  pProperty->pNext = NULL;
-  if (m_pLastCustom == NULL) {
-    m_pLastCustom = m_pFirstCustom = pProperty;
-  } else {
-    m_pLastCustom->pNext = pProperty;
-    m_pLastCustom = pProperty;
-  }
-  return TRUE;
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseNumber(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen) {
-  FX_FLOAT fValue;
-  FDE_CSSPRIMITIVETYPE eUnit;
-  if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eUnit)) {
-    return NULL;
-  }
-  return NewNumberValue(pArgs->pStaticStore, eUnit, fValue);
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseEnum(const FDE_CSSPROPERTYARGS* pArgs,
-                                              const FX_WCHAR* pszValue,
-                                              int32_t iValueLen) {
-  const FDE_CSSPROPERTYVALUETABLE* pValue =
-      FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-  return pValue ? NewEnumValue(pArgs->pStaticStore, pValue->eName) : NULL;
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseColor(const FDE_CSSPROPERTYARGS* pArgs,
-                                               const FX_WCHAR* pszValue,
-                                               int32_t iValueLen) {
-  FX_ARGB dwColor;
-  if (!FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-    return NULL;
-  }
-  return FXTARGET_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseURI(const FDE_CSSPROPERTYARGS* pArgs,
-                                             const FX_WCHAR* pszValue,
-                                             int32_t iValueLen) {
-  int32_t iOffset;
-  if (!FDE_ParseCSSURI(pszValue, iValueLen, iOffset, iValueLen)) {
-    return NULL;
-  }
-  if (iValueLen <= 0) {
-    return NULL;
-  }
-  pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen);
-  return pszValue
-             ? FXTARGET_NewWith(pArgs->pStaticStore)
-                   CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_URI, pszValue)
-             : NULL;
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseString(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen) {
-  int32_t iOffset;
-  if (!FDE_ParseCSSString(pszValue, iValueLen, iOffset, iValueLen)) {
-    return NULL;
-  }
-  if (iValueLen <= 0) {
-    return NULL;
-  }
-  pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen);
-  return pszValue
-             ? FXTARGET_NewWith(pArgs->pStaticStore)
-                   CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)
-             : NULL;
-}
-IFDE_CSSValue* CFDE_CSSDeclaration::ParseFunction(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen) {
-  if (pszValue[iValueLen - 1] != ')') {
-    return NULL;
-  }
-  int32_t iStartBracket = 0;
-  while (pszValue[iStartBracket] != '(') {
-    if (iStartBracket < iValueLen) {
-      iStartBracket++;
-    } else {
-      return NULL;
-    }
-  }
-  if (iStartBracket == 0) {
-    return NULL;
-  }
-  const FX_WCHAR* pszFuncName = CopyToLocal(pArgs, pszValue, iStartBracket);
-  pszValue += (iStartBracket + 1);
-  iValueLen -= (iStartBracket + 2);
-  CFDE_CSSValueArray argumentArr;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ',');
-  FDE_CSSPRIMITIVETYPE ePrimitiveType;
-  while (parser.NextValue(ePrimitiveType, pszValue, iValueLen)) {
-    switch (ePrimitiveType) {
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pPropertyValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pPropertyValue != NULL) {
-          argumentArr.Add(
-              NewEnumValue(pArgs->pStaticStore, pPropertyValue->eName));
-          continue;
-        }
-        IFDE_CSSValue* pFunctionValue =
-            ParseFunction(pArgs, pszValue, iValueLen);
-        if (pFunctionValue != NULL) {
-          argumentArr.Add(pFunctionValue);
-          continue;
-        }
-        argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore)
-                            CFDE_CSSPrimitiveValue(
-                                FDE_CSSPRIMITIVETYPE_String,
-                                CopyToLocal(pArgs, pszValue, iValueLen)));
-      } break;
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, ePrimitiveType)) {
-          argumentArr.Add(
-              NewNumberValue(pArgs->pStaticStore, ePrimitiveType, fValue));
-        }
-      } break;
-      default:
-        argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore)
-                            CFDE_CSSPrimitiveValue(
-                                FDE_CSSPRIMITIVETYPE_String,
-                                CopyToLocal(pArgs, pszValue, iValueLen)));
-        break;
-    }
-  }
-  IFDE_CSSValueList* pArgumentList = FXTARGET_NewWith(pArgs->pStaticStore)
-      CFDE_CSSValueList(pArgs->pStaticStore, argumentArr);
-  CFDE_CSSFunction* pFunction = FXTARGET_NewWith(pArgs->pStaticStore)
-      CFDE_CSSFunction(pszFuncName, pArgumentList);
-  return FXTARGET_NewWith(pArgs->pStaticStore)
-      CFDE_CSSPrimitiveValue(pFunction);
-}
-FX_BOOL CFDE_CSSDeclaration::ParseContentProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = (IFX_MEMAllocator*)pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  FDE_CSSPRIMITIVETYPE eType;
-  CFDE_CSSValueArray list;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_URI:
-        list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-            eType, CopyToLocal(pArgs, pszValue, iValueLen)));
-        break;
-      case FDE_CSSPRIMITIVETYPE_Number:
-        return FALSE;
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue != NULL) {
-          switch (pValue->eName) {
-            case FDE_CSSPROPERTYVALUE_Normal:
-            case FDE_CSSPROPERTYVALUE_None: {
-              if (list.GetSize() == 0) {
-                list.Add(NewEnumValue(pStaticStore, pValue->eName));
-              } else {
-                return FALSE;
-              }
-            } break;
-            case FDE_CSSPROPERTYVALUE_OpenQuote:
-            case FDE_CSSPROPERTYVALUE_CloseQuote:
-            case FDE_CSSPROPERTYVALUE_NoOpenQuote:
-            case FDE_CSSPROPERTYVALUE_NoCloseQuote:
-              list.Add(NewEnumValue(pStaticStore, pValue->eName));
-              break;
-            default:
-              return FALSE;
-          }
-          continue;
-        }
-        IFDE_CSSValue* pFunction = ParseFunction(pArgs, pszValue, iValueLen);
-        if (pFunction != NULL) {
-          list.Add(pFunction);
-          continue;
-        }
-        list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-            eType, CopyToLocal(pArgs, pszValue, iValueLen)));
-      } break;
-      case FDE_CSSPRIMITIVETYPE_RGB:
-        return FALSE;
-      default:
-        break;
-    }
-  }
-  if (list.GetSize() == 0) {
-    return FALSE;
-  }
-  AddPropertyHolder(pStaticStore, pArgs->pProperty->eName,
-                    FXTARGET_NewWith(pStaticStore)
-                        CFDE_CSSValueList(pStaticStore, list),
-                    bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseCounterProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  CFDE_CSSValueArray list;
-  CFDE_CSSValueArray listFull;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-          if (list.GetSize() == 1) {
-            list.Add(NewNumberValue(pStaticStore, eType, fValue));
-            listFull.Add(FXTARGET_NewWith(pStaticStore)
-                             CFDE_CSSValueList(pStaticStore, list));
-            list.RemoveAll();
-          } else {
-            return FALSE;
-          }
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_String: {
-        if (list.GetSize() == 0) {
-          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
-          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              FDE_CSSPRIMITIVETYPE_String, pszValue));
-        } else {
-          listFull.Add(FXTARGET_NewWith(pStaticStore)
-                           CFDE_CSSValueList(pStaticStore, list));
-          list.RemoveAll();
-          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
-          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              FDE_CSSPRIMITIVETYPE_String, pszValue));
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (list.GetSize() == 1) {
-    listFull.Add(FXTARGET_NewWith(pStaticStore)
-                     CFDE_CSSValueList(pStaticStore, list));
-  }
-  if (listFull.GetSize() == 0) {
-    return FALSE;
-  }
-  AddPropertyHolder(pStaticStore, pArgs->pProperty->eName,
-                    FXTARGET_NewWith(pStaticStore)
-                        CFDE_CSSValueList(pStaticStore, listFull),
-                    bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseValueListProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  FX_WCHAR separator =
-      (pArgs->pProperty->eName == FDE_CSSPROPERTY_FontFamily) ? ',' : ' ';
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, separator);
-  const FX_DWORD dwType = pArgs->pProperty->dwType;
-  FDE_CSSPRIMITIVETYPE eType;
-  CFDE_CSSValueArray list;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_Number:
-        if (dwType & FDE_CSSVALUETYPE_MaybeNumber) {
-          FX_FLOAT fValue;
-          if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-            list.Add(NewNumberValue(pStaticStore, eType, fValue));
-          }
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_String:
-        if (dwType & FDE_CSSVALUETYPE_MaybeColor) {
-          FX_ARGB dwColor;
-          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-            list.Add(FXTARGET_NewWith(pStaticStore)
-                         CFDE_CSSPrimitiveValue(dwColor));
-            continue;
-          }
-        }
-        if (dwType & FDE_CSSVALUETYPE_MaybeEnum) {
-          const FDE_CSSPROPERTYVALUETABLE* pValue =
-              FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-          if (pValue != NULL) {
-            list.Add(NewEnumValue(pStaticStore, pValue->eName));
-            continue;
-          }
-        }
-        if (dwType & FDE_CSSVALUETYPE_MaybeString) {
-          pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
-          list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              FDE_CSSPRIMITIVETYPE_String, pszValue));
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_RGB:
-        if (dwType & FDE_CSSVALUETYPE_MaybeColor) {
-          FX_ARGB dwColor;
-          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-            list.Add(FXTARGET_NewWith(pStaticStore)
-                         CFDE_CSSPrimitiveValue(dwColor));
-          }
-        }
-        break;
-      default:
-        break;
-    }
-  }
-  if (list.GetSize() == 0) {
-    return FALSE;
-  }
-  switch (pArgs->pProperty->eName) {
-    case FDE_CSSPROPERTY_BorderColor:
-      return Add4ValuesProperty(
-          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftColor,
-          FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderRightColor,
-          FDE_CSSPROPERTY_BorderBottomColor);
-    case FDE_CSSPROPERTY_BorderStyle:
-      return Add4ValuesProperty(
-          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftStyle,
-          FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderRightStyle,
-          FDE_CSSPROPERTY_BorderBottomStyle);
-    case FDE_CSSPROPERTY_BorderWidth:
-      return Add4ValuesProperty(
-          pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftWidth,
-          FDE_CSSPROPERTY_BorderTopWidth, FDE_CSSPROPERTY_BorderRightWidth,
-          FDE_CSSPROPERTY_BorderBottomWidth);
-    case FDE_CSSPROPERTY_Margin:
-      return Add4ValuesProperty(
-          pStaticStore, list, bImportant, FDE_CSSPROPERTY_MarginLeft,
-          FDE_CSSPROPERTY_MarginTop, FDE_CSSPROPERTY_MarginRight,
-          FDE_CSSPROPERTY_MarginBottom);
-    case FDE_CSSPROPERTY_Padding:
-      return Add4ValuesProperty(
-          pStaticStore, list, bImportant, FDE_CSSPROPERTY_PaddingLeft,
-          FDE_CSSPROPERTY_PaddingTop, FDE_CSSPROPERTY_PaddingRight,
-          FDE_CSSPROPERTY_PaddingBottom);
-    default: {
-      CFDE_CSSValueList* pList =
-          FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list);
-      AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, pList,
-                        bImportant);
-      return TRUE;
-    } break;
-  }
-  return FALSE;
-}
-FX_BOOL CFDE_CSSDeclaration::Add4ValuesProperty(IFX_MEMAllocator* pStaticStore,
-                                                const CFDE_CSSValueArray& list,
-                                                FX_BOOL bImportant,
-                                                FDE_CSSPROPERTY eLeft,
-                                                FDE_CSSPROPERTY eTop,
-                                                FDE_CSSPROPERTY eRight,
-                                                FDE_CSSPROPERTY eBottom) {
-  switch (list.GetSize()) {
-    case 1:
-      AddPropertyHolder(pStaticStore, eLeft, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eRight, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant);
-      return TRUE;
-    case 2:
-      AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant);
-      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
-      AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant);
-      return TRUE;
-    case 3:
-      AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant);
-      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
-      AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant);
-      return TRUE;
-    case 4:
-      AddPropertyHolder(pStaticStore, eLeft, list[3], bImportant);
-      AddPropertyHolder(pStaticStore, eTop, list[0], bImportant);
-      AddPropertyHolder(pStaticStore, eRight, list[1], bImportant);
-      AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant);
-      return TRUE;
-    default:
-      break;
-  }
-  return FALSE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseBorderPropoerty(
-    IFX_MEMAllocator* pStaticStore,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    IFDE_CSSValue*& pColor,
-    IFDE_CSSValue*& pStyle,
-    IFDE_CSSValue*& pWidth) const {
-  pColor = pStyle = pWidth = NULL;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_Number:
-        if (pWidth == NULL) {
-          FX_FLOAT fValue;
-          if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-            pWidth = NewNumberValue(pStaticStore, eType, fValue);
-          }
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_RGB:
-        if (pColor == NULL) {
-          FX_ARGB dwColor;
-          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-            pColor =
-                FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
-          }
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSCOLORTABLE* pColorItem =
-            FDE_GetCSSColorByName(pszValue, iValueLen);
-        if (pColorItem != NULL) {
-          if (pColor == NULL) {
-            pColor = FXTARGET_NewWith(pStaticStore)
-                CFDE_CSSPrimitiveValue(pColorItem->dwValue);
-          }
-          continue;
-        }
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue == NULL) {
-          continue;
-        }
-        switch (pValue->eName) {
-          case FDE_CSSPROPERTYVALUE_Transparent:
-            if (pColor == NULL) {
-              pColor = FXTARGET_NewWith(pStaticStore)
-                  CFDE_CSSPrimitiveValue((FX_ARGB)0);
-            }
-            break;
-          case FDE_CSSPROPERTYVALUE_Thin:
-          case FDE_CSSPROPERTYVALUE_Thick:
-          case FDE_CSSPROPERTYVALUE_Medium:
-            if (pWidth == NULL) {
-              pWidth = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          case FDE_CSSPROPERTYVALUE_None:
-          case FDE_CSSPROPERTYVALUE_Hidden:
-          case FDE_CSSPROPERTYVALUE_Dotted:
-          case FDE_CSSPROPERTYVALUE_Dashed:
-          case FDE_CSSPROPERTYVALUE_Solid:
-          case FDE_CSSPROPERTYVALUE_Double:
-          case FDE_CSSPROPERTYVALUE_Groove:
-          case FDE_CSSPROPERTYVALUE_Ridge:
-          case FDE_CSSPROPERTYVALUE_Inset:
-          case FDE_CSSPROPERTYVALUE_Outset:
-            if (pStyle == NULL) {
-              pStyle = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          default:
-            break;
-        }
-      }; break;
-      default:
-        break;
-    }
-  }
-  if (pColor == NULL) {
-    pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
-  }
-  if (pStyle == NULL) {
-    pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
-  }
-  if (pWidth == NULL) {
-    pWidth = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
-  }
-  return TRUE;
-}
-void CFDE_CSSDeclaration::AddBorderProperty(IFX_MEMAllocator* pStaticStore,
-                                            IFDE_CSSValue* pColor,
-                                            IFDE_CSSValue* pStyle,
-                                            IFDE_CSSValue* pWidth,
-                                            FX_BOOL bImportant,
-                                            FDE_CSSPROPERTY eColor,
-                                            FDE_CSSPROPERTY eStyle,
-                                            FDE_CSSPROPERTY eWidth) {
-  AddPropertyHolder(pStaticStore, eStyle, pStyle, bImportant);
-  AddPropertyHolder(pStaticStore, eWidth, pWidth, bImportant);
-  AddPropertyHolder(pStaticStore, eColor, pColor, bImportant);
-}
-FX_BOOL CFDE_CSSDeclaration::ParseListStyleProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  IFDE_CSSPrimitiveValue *pType = NULL, *pImage = NULL, *pPosition = NULL;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_URI:
-        if (pImage == NULL) {
-          pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              eType, CopyToLocal(pArgs, pszValue, iValueLen));
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue == NULL) {
-          break;
-        }
-        switch (pValue->eName) {
-          case FDE_CSSPROPERTYVALUE_None:
-            if (pImage == NULL) {
-              pImage = NewEnumValue(pStaticStore, pValue->eName);
-            } else if (pType == NULL) {
-              pImage = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          case FDE_CSSPROPERTYVALUE_Inside:
-          case FDE_CSSPROPERTYVALUE_Outside:
-            if (pPosition == NULL) {
-              pPosition = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          case FDE_CSSPROPERTYVALUE_Disc:
-          case FDE_CSSPROPERTYVALUE_Circle:
-          case FDE_CSSPROPERTYVALUE_Square:
-          case FDE_CSSPROPERTYVALUE_Decimal:
-          case FDE_CSSPROPERTYVALUE_DecimalLeadingZero:
-          case FDE_CSSPROPERTYVALUE_LowerRoman:
-          case FDE_CSSPROPERTYVALUE_UpperRoman:
-          case FDE_CSSPROPERTYVALUE_LowerGreek:
-          case FDE_CSSPROPERTYVALUE_LowerLatin:
-          case FDE_CSSPROPERTYVALUE_UpperLatin:
-          case FDE_CSSPROPERTYVALUE_Armenian:
-          case FDE_CSSPROPERTYVALUE_Georgian:
-          case FDE_CSSPROPERTYVALUE_LowerAlpha:
-          case FDE_CSSPROPERTYVALUE_UpperAlpha:
-            if (pType == NULL) {
-              pType = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          default:
-            break;
-        }
-      }; break;
-      default:
-        break;
-    }
-  }
-  if (pPosition == NULL) {
-    pPosition = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Outside);
-  }
-  if (pImage == NULL) {
-    pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
-  }
-  if (pType == NULL) {
-    pType = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
-  }
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStylePosition, pPosition,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleImage, pImage,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleType, pType,
-                    bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseBackgroundProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  IFDE_CSSPrimitiveValue *pColor = NULL, *pImage = NULL, *pRepeat = NULL;
-  IFDE_CSSPrimitiveValue *pPosX = NULL, *pPosY = NULL, *pAttachment = NULL;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_URI:
-        if (pImage == NULL) {
-          pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              eType, CopyToLocal(pArgs, pszValue, iValueLen));
-        }
-        break;
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-          break;
-        }
-        if (pPosX == NULL) {
-          pPosX = NewNumberValue(pStaticStore, eType, fValue);
-        } else if (pPosY == NULL) {
-          pPosY = NewNumberValue(pStaticStore, eType, fValue);
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue != NULL) {
-          switch (pValue->eName) {
-            case FDE_CSSPROPERTYVALUE_None:
-              if (pImage == NULL) {
-                pImage = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Transparent:
-              if (pColor == NULL) {
-                pColor = FXTARGET_NewWith(pStaticStore)
-                    CFDE_CSSPrimitiveValue((FX_ARGB)0);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Fixed:
-            case FDE_CSSPROPERTYVALUE_Scroll:
-              if (pAttachment == NULL) {
-                pAttachment = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Repeat:
-            case FDE_CSSPROPERTYVALUE_RepeatX:
-            case FDE_CSSPROPERTYVALUE_RepeatY:
-            case FDE_CSSPROPERTYVALUE_NoRepeat:
-              if (pRepeat == NULL) {
-                pRepeat = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Left:
-            case FDE_CSSPROPERTYVALUE_Right:
-              if (pPosX == NULL) {
-                pPosX = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Top:
-            case FDE_CSSPROPERTYVALUE_Bottom:
-              if (pPosY == NULL) {
-                pPosX = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Center:
-              if (pPosX == NULL) {
-                pPosX = NewEnumValue(pStaticStore, pValue->eName);
-              } else if (pPosY == NULL) {
-                pPosX = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            default:
-              break;
-          }
-          break;
-        }
-        const FDE_CSSCOLORTABLE* pColorItem =
-            FDE_GetCSSColorByName(pszValue, iValueLen);
-        if (pColorItem != NULL) {
-          if (pColor == NULL) {
-            pColor = FXTARGET_NewWith(pStaticStore)
-                CFDE_CSSPrimitiveValue(pColorItem->dwValue);
-          }
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_RGB:
-        if (pColor == NULL) {
-          FX_ARGB dwColor;
-          if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-            pColor =
-                FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
-          }
-        }
-        break;
-      default:
-        break;
-    }
-  }
-  if (pColor == NULL) {
-    pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
-  }
-  if (pImage == NULL) {
-    pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
-  }
-  if (pRepeat == NULL) {
-    pRepeat = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Repeat);
-  }
-  if (pAttachment == NULL) {
-    pAttachment = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Scroll);
-  }
-  if (pPosX == NULL) {
-    pPosX = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
-    pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
-  } else if (pPosY == NULL) {
-    pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f);
-  }
-  CFDE_CSSValueArray position;
-  position.Add(pPosX);
-  position.Add(pPosY);
-  CFDE_CSSValueList* pPosList =
-      FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, position);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundColor, pColor,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundImage, pImage,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundRepeat, pRepeat,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundPosition, pPosList,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundAttachment,
-                    pAttachment, bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseFontProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                               const FX_WCHAR* pszValue,
-                                               int32_t iValueLen,
-                                               FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, '/');
-  IFDE_CSSPrimitiveValue *pStyle = NULL, *pVariant = NULL, *pWeight = NULL;
-  IFDE_CSSPrimitiveValue *pFontSize = NULL, *pLineHeight = NULL;
-  CFDE_CSSValueArray familyList;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue != NULL) {
-          switch (pValue->eName) {
-            case FDE_CSSPROPERTYVALUE_XxSmall:
-            case FDE_CSSPROPERTYVALUE_XSmall:
-            case FDE_CSSPROPERTYVALUE_Small:
-            case FDE_CSSPROPERTYVALUE_Medium:
-            case FDE_CSSPROPERTYVALUE_Large:
-            case FDE_CSSPROPERTYVALUE_XLarge:
-            case FDE_CSSPROPERTYVALUE_XxLarge:
-            case FDE_CSSPROPERTYVALUE_Smaller:
-            case FDE_CSSPROPERTYVALUE_Larger:
-              if (pFontSize == NULL) {
-                pFontSize = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              continue;
-            case FDE_CSSPROPERTYVALUE_Bold:
-            case FDE_CSSPROPERTYVALUE_Bolder:
-            case FDE_CSSPROPERTYVALUE_Lighter:
-              if (pWeight == NULL) {
-                pWeight = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              continue;
-            case FDE_CSSPROPERTYVALUE_Italic:
-            case FDE_CSSPROPERTYVALUE_Oblique:
-              if (pStyle == NULL) {
-                pStyle = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              continue;
-            case FDE_CSSPROPERTYVALUE_SmallCaps:
-              if (pVariant == NULL) {
-                pVariant = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              continue;
-            case FDE_CSSPROPERTYVALUE_Normal:
-              if (pStyle == NULL) {
-                pStyle = NewEnumValue(pStaticStore, pValue->eName);
-              } else if (pVariant == NULL) {
-                pVariant = NewEnumValue(pStaticStore, pValue->eName);
-              } else if (pWeight == NULL) {
-                pWeight = NewEnumValue(pStaticStore, pValue->eName);
-              } else if (pFontSize == NULL) {
-                pFontSize = NewEnumValue(pStaticStore, pValue->eName);
-              } else if (pLineHeight == NULL) {
-                pLineHeight = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              continue;
-            default:
-              break;
-          }
-        }
-        if (pFontSize != NULL) {
-          familyList.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(
-              eType, CopyToLocal(pArgs, pszValue, iValueLen)));
-        }
-        parser.m_Separator = ',';
-      } break;
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-          break;
-        }
-        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          switch ((int32_t)fValue) {
-            case 100:
-            case 200:
-            case 300:
-            case 400:
-            case 500:
-            case 600:
-            case 700:
-            case 800:
-            case 900:
-              if (pWeight == NULL) {
-                pWeight = NewNumberValue(pStaticStore,
-                                         FDE_CSSPRIMITIVETYPE_Number, fValue);
-              }
-              continue;
-          }
-        }
-        if (pFontSize == NULL) {
-          pFontSize = NewNumberValue(pStaticStore, eType, fValue);
-        } else if (pLineHeight == NULL) {
-          pLineHeight = NewNumberValue(pStaticStore, eType, fValue);
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (pStyle == NULL) {
-    pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
-  }
-  if (pVariant == NULL) {
-    pVariant = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
-  }
-  if (pWeight == NULL) {
-    pWeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
-  }
-  if (pFontSize == NULL) {
-    pFontSize = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium);
-  }
-  if (pLineHeight == NULL) {
-    pLineHeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal);
-  }
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontStyle, pStyle,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontVariant, pVariant,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontWeight, pWeight,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontSize, pFontSize,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_LineHeight, pLineHeight,
-                    bImportant);
-  if (familyList.GetSize() > 0) {
-    CFDE_CSSValueList* pList = FXTARGET_NewWith(pStaticStore)
-        CFDE_CSSValueList(pStaticStore, familyList);
-    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontFamily, pList,
-                      bImportant);
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseColumnRuleProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  IFDE_CSSPrimitiveValue* pColumnRuleWidth = NULL;
-  IFDE_CSSPrimitiveValue* pColumnRuleStyle = NULL;
-  IFDE_CSSPrimitiveValue* pColumnRuleColor = NULL;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue != NULL) {
-          switch (pValue->eName) {
-            case FDE_CSSPROPERTYVALUE_None:
-            case FDE_CSSPROPERTYVALUE_Hidden:
-            case FDE_CSSPROPERTYVALUE_Dotted:
-            case FDE_CSSPROPERTYVALUE_Dashed:
-            case FDE_CSSPROPERTYVALUE_Solid:
-            case FDE_CSSPROPERTYVALUE_Double:
-            case FDE_CSSPROPERTYVALUE_Groove:
-            case FDE_CSSPROPERTYVALUE_Ridge:
-            case FDE_CSSPROPERTYVALUE_Inset:
-            case FDE_CSSPROPERTYVALUE_Outset:
-              if (pColumnRuleStyle == NULL) {
-                pColumnRuleStyle = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Transparent:
-              if (pColumnRuleColor == NULL) {
-                pColumnRuleColor = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            case FDE_CSSPROPERTYVALUE_Thin:
-            case FDE_CSSPROPERTYVALUE_Medium:
-            case FDE_CSSPROPERTYVALUE_Thick:
-              if (pColumnRuleWidth == NULL) {
-                pColumnRuleWidth = NewEnumValue(pStaticStore, pValue->eName);
-              }
-              break;
-            default:
-              break;
-          }
-          continue;
-        }
-        FX_ARGB dwColor;
-        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor) &&
-            pColumnRuleColor == NULL) {
-          pColumnRuleColor = FXTARGET_NewWith(pStaticStore)
-              CFDE_CSSPrimitiveValue((FX_ARGB)dwColor);
-          continue;
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType) &&
-            pColumnRuleWidth == NULL) {
-          pColumnRuleWidth = NewNumberValue(pStaticStore, eType, fValue);
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_RGB: {
-        FX_ARGB dwColor;
-        if (pColumnRuleColor == NULL &&
-            FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-          pColumnRuleColor = FXTARGET_NewWith(pStaticStore)
-              CFDE_CSSPrimitiveValue((FX_ARGB)dwColor);
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (pColumnRuleColor == NULL && pColumnRuleStyle == NULL &&
-      pColumnRuleWidth == NULL) {
-    return FALSE;
-  }
-  if (pColumnRuleStyle == NULL) {
-    pColumnRuleStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None);
-  }
-  if (pColumnRuleWidth == NULL) {
-    pColumnRuleWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium);
-  }
-  if (pColumnRuleColor == NULL) {
-    pColumnRuleColor =
-        FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0);
-  }
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleStyle,
-                    pColumnRuleStyle, bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleWidth,
-                    pColumnRuleWidth, bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleColor,
-                    pColumnRuleColor, bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseTextEmphasisProperty(
-    FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  CFDE_CSSValueArray arrEmphasisStyle;
-  FDE_CSSPRIMITIVETYPE eType;
-  IFDE_CSSPrimitiveValue* pEmphasisColor = NULL;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue != NULL) {
-          arrEmphasisStyle.Add(NewEnumValue(pStaticStore, pValue->eName));
-          continue;
-        }
-        FX_ARGB dwColor;
-        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-          pEmphasisColor =
-              FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
-          continue;
-        }
-        pszValue = CopyToLocal(pArgs, pszValue, iValueLen);
-        arrEmphasisStyle.Add(
-            FXTARGET_NewWith(pStaticStore)
-                CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue));
-      } break;
-      case FDE_CSSPRIMITIVETYPE_RGB: {
-        FX_ARGB dwColor;
-        if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) {
-          pEmphasisColor =
-              FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor);
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (arrEmphasisStyle.GetSize() != 0) {
-    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisStyle,
-                      FXTARGET_NewWith(pStaticStore)
-                          CFDE_CSSValueList(pStaticStore, arrEmphasisStyle),
-                      bImportant);
-  }
-  if (pEmphasisColor != NULL) {
-    AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisColor,
-                      pEmphasisColor, bImportant);
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseColumnsProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  IFDE_CSSPrimitiveValue* pColumnWidth = NULL;
-  IFDE_CSSPrimitiveValue* pColumnCount = NULL;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    switch (eType) {
-      case FDE_CSSPRIMITIVETYPE_String: {
-        const FDE_CSSPROPERTYVALUETABLE* pValue =
-            FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-        if (pValue == NULL && pValue->eName == FDE_CSSPROPERTYVALUE_Auto) {
-          pColumnWidth = NewEnumValue(pStaticStore, pValue->eName);
-        }
-      } break;
-      case FDE_CSSPRIMITIVETYPE_Number: {
-        FX_FLOAT fValue;
-        if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) {
-          switch (eType) {
-            case FDE_CSSPRIMITIVETYPE_Number:
-              if (pColumnCount == NULL) {
-                pColumnCount = NewNumberValue(pStaticStore, eType, fValue);
-              }
-              break;
-            default:
-              if (pColumnWidth == NULL) {
-                pColumnWidth = NewNumberValue(pStaticStore, eType, fValue);
-              }
-              break;
-          }
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (pColumnWidth == NULL && pColumnCount == NULL) {
-    return FALSE;
-  } else if (pColumnWidth == NULL) {
-    pColumnWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto);
-  } else if (pColumnCount == NULL) {
-    pColumnCount = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto);
-  }
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnWidth, pColumnWidth,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnCount, pColumnCount,
-                    bImportant);
-  return TRUE;
-}
-FX_BOOL CFDE_CSSDeclaration::ParseOverflowProperty(
-    const FDE_CSSPROPERTYARGS* pArgs,
-    const FX_WCHAR* pszValue,
-    int32_t iValueLen,
-    FX_BOOL bImportant) {
-  IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore;
-  CFDE_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  IFDE_CSSPrimitiveValue* pOverflowX = NULL;
-  IFDE_CSSPrimitiveValue* pOverflowY = NULL;
-  FDE_CSSPRIMITIVETYPE eType;
-  while (parser.NextValue(eType, pszValue, iValueLen)) {
-    if (eType == FDE_CSSPRIMITIVETYPE_String) {
-      const FDE_CSSPROPERTYVALUETABLE* pValue =
-          FDE_GetCSSPropertyValueByName(pszValue, iValueLen);
-      if (pValue != NULL) {
-        switch (pValue->eName) {
-          case FDE_CSSOVERFLOW_Visible:
-          case FDE_CSSOVERFLOW_Hidden:
-          case FDE_CSSOVERFLOW_Scroll:
-          case FDE_CSSOVERFLOW_Auto:
-          case FDE_CSSOVERFLOW_NoDisplay:
-          case FDE_CSSOVERFLOW_NoContent:
-            if (pOverflowX != NULL && pOverflowY != NULL) {
-              return FALSE;
-            } else if (pOverflowX == NULL) {
-              pOverflowX = NewEnumValue(pStaticStore, pValue->eName);
-            } else if (pOverflowY == NULL) {
-              pOverflowY = NewEnumValue(pStaticStore, pValue->eName);
-            }
-            break;
-          default:
-            break;
-        }
-      }
-    }
-  }
-  if (pOverflowX == NULL && pOverflowY == NULL) {
-    return FALSE;
-  } else if (pOverflowY == NULL) {
-    pOverflowY = NewEnumValue(pStaticStore, pOverflowX->GetEnum());
-  }
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowX, pOverflowX,
-                    bImportant);
-  AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowY, pOverflowY,
-                    bImportant);
-  return TRUE;
-}
diff --git a/xfa/src/fde/css/fde_cssdeclaration.h b/xfa/src/fde/css/fde_cssdeclaration.h
deleted file mode 100644
index 9866b20..0000000
--- a/xfa/src/fde/css/fde_cssdeclaration.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSDECLARATION_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSDECLARATION_H_
-
-#include "xfa/src/fde/css/fde_cssdatatable.h"
-
-class FDE_CSSPropertyHolder : public CFX_Target {
- public:
-  int16_t eProperty;
-  int16_t bImportant;
-  IFDE_CSSValue* pValue;
-  FDE_CSSPropertyHolder* pNext;
-};
-
-class FDE_CSSCustomProperty : public CFX_Target {
- public:
-  const FX_WCHAR* pwsName;
-  const FX_WCHAR* pwsValue;
-  FDE_CSSCustomProperty* pNext;
-};
-
-struct FDE_CSSPROPERTYARGS {
-  IFX_MEMAllocator* pStaticStore;
-  CFX_MapPtrToPtr* pStringCache;
-  FDE_LPCCSSPROPERTYTABLE pProperty;
-};
-
-class CFDE_CSSDeclaration : public IFDE_CSSDeclaration, public CFX_Target {
- public:
-  CFDE_CSSDeclaration()
-      : m_pFirstProperty(NULL),
-        m_pLastProperty(NULL),
-        m_pFirstCustom(NULL),
-        m_pLastCustom(NULL) {}
-  virtual IFDE_CSSValue* GetProperty(FDE_CSSPROPERTY eProperty,
-                                     FX_BOOL& bImportant) const;
-  virtual FX_POSITION GetStartPosition() const;
-  virtual void GetNextProperty(FX_POSITION& pos,
-                               FDE_CSSPROPERTY& eProperty,
-                               IFDE_CSSValue*& pValue,
-                               FX_BOOL& bImportant) const;
-  virtual FX_POSITION GetStartCustom() const;
-  virtual void GetNextCustom(FX_POSITION& pos,
-                             CFX_WideString& wsName,
-                             CFX_WideString& wsValue) const;
-  FX_BOOL AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                      const FX_WCHAR* pszValue,
-                      int32_t iValueLen);
-  FX_BOOL AddProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                      const FX_WCHAR* pszName,
-                      int32_t iNameLen,
-                      const FX_WCHAR* pszValue,
-                      int32_t iValueLen);
-
- protected:
-  FX_BOOL ParseTextEmphasisProperty(FDE_CSSPROPERTYARGS* pArgs,
-                                    const FX_WCHAR* pszValue,
-                                    int32_t iValueLen,
-                                    FX_BOOL bImportant);
-  FX_BOOL ParseColumnsProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                               const FX_WCHAR* pszValue,
-                               int32_t iValueLen,
-                               FX_BOOL bImportant);
-  FX_BOOL ParseColumnRuleProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                  const FX_WCHAR* pszValue,
-                                  int32_t iValueLen,
-                                  FX_BOOL bImportant);
-  FX_BOOL ParseOverflowProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                const FX_WCHAR* pszValue,
-                                int32_t iValueLen,
-                                FX_BOOL bImportant);
-  FX_BOOL ParseFontProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                            const FX_WCHAR* pszValue,
-                            int32_t iValueLen,
-                            FX_BOOL bImportant);
-  FX_BOOL ParseBackgroundProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                  const FX_WCHAR* pszValue,
-                                  int32_t iValueLen,
-                                  FX_BOOL bImportant);
-  FX_BOOL ParseListStyleProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                 const FX_WCHAR* pszValue,
-                                 int32_t iValueLen,
-                                 FX_BOOL bImportant);
-  FX_BOOL ParseBorderPropoerty(IFX_MEMAllocator* pStaticStore,
-                               const FX_WCHAR* pszValue,
-                               int32_t iValueLen,
-                               IFDE_CSSValue*& pColor,
-                               IFDE_CSSValue*& pStyle,
-                               IFDE_CSSValue*& pWidth) const;
-  void AddBorderProperty(IFX_MEMAllocator* pStaticStore,
-                         IFDE_CSSValue* pColor,
-                         IFDE_CSSValue* pStyle,
-                         IFDE_CSSValue* pWidth,
-                         FX_BOOL bImportant,
-                         FDE_CSSPROPERTY eColor,
-                         FDE_CSSPROPERTY eStyle,
-                         FDE_CSSPROPERTY eWidth);
-  FX_BOOL ParseContentProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                               const FX_WCHAR* pszValue,
-                               int32_t iValueLen,
-                               FX_BOOL bImportant);
-  FX_BOOL ParseCounterProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                               const FX_WCHAR* pszValue,
-                               int32_t iValueLen,
-                               FX_BOOL bImportant);
-  FX_BOOL ParseValueListProperty(const FDE_CSSPROPERTYARGS* pArgs,
-                                 const FX_WCHAR* pszValue,
-                                 int32_t iValueLen,
-                                 FX_BOOL bImportant);
-  FX_BOOL Add4ValuesProperty(IFX_MEMAllocator* pStaticStore,
-                             const CFDE_CSSValueArray& list,
-                             FX_BOOL bImportant,
-                             FDE_CSSPROPERTY eLeft,
-                             FDE_CSSPROPERTY eTop,
-                             FDE_CSSPROPERTY eRight,
-                             FDE_CSSPROPERTY eBottom);
-  IFDE_CSSValue* ParseNumber(const FDE_CSSPROPERTYARGS* pArgs,
-                             const FX_WCHAR* pszValue,
-                             int32_t iValueLen);
-  IFDE_CSSValue* ParseEnum(const FDE_CSSPROPERTYARGS* pArgs,
-                           const FX_WCHAR* pszValue,
-                           int32_t iValueLen);
-  IFDE_CSSValue* ParseColor(const FDE_CSSPROPERTYARGS* pArgs,
-                            const FX_WCHAR* pszValue,
-                            int32_t iValueLen);
-  IFDE_CSSValue* ParseURI(const FDE_CSSPROPERTYARGS* pArgs,
-                          const FX_WCHAR* pszValue,
-                          int32_t iValueLen);
-  IFDE_CSSValue* ParseString(const FDE_CSSPROPERTYARGS* pArgs,
-                             const FX_WCHAR* pszValue,
-                             int32_t iValueLen);
-  IFDE_CSSValue* ParseFunction(const FDE_CSSPROPERTYARGS* pArgs,
-                               const FX_WCHAR* pszValue,
-                               int32_t iValueLen);
-  const FX_WCHAR* CopyToLocal(const FDE_CSSPROPERTYARGS* pArgs,
-                              const FX_WCHAR* pszValue,
-                              int32_t iValueLen);
-  void AddPropertyHolder(IFX_MEMAllocator* pStaticStore,
-                         FDE_CSSPROPERTY eProperty,
-                         IFDE_CSSValue* pValue,
-                         FX_BOOL bImportant);
-  IFDE_CSSPrimitiveValue* NewNumberValue(IFX_MEMAllocator* pStaticStore,
-                                         FDE_CSSPRIMITIVETYPE eUnit,
-                                         FX_FLOAT fValue) const;
-  IFDE_CSSPrimitiveValue* NewEnumValue(IFX_MEMAllocator* pStaticStore,
-                                       FDE_CSSPROPERTYVALUE eValue) const;
-  FDE_CSSPropertyHolder* m_pFirstProperty;
-  FDE_CSSPropertyHolder* m_pLastProperty;
-  FDE_CSSCustomProperty* m_pFirstCustom;
-  FDE_CSSCustomProperty* m_pLastCustom;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSDECLARATION_H_
diff --git a/xfa/src/fde/css/fde_cssstyleselector.cpp b/xfa/src/fde/css/fde_cssstyleselector.cpp
deleted file mode 100644
index ff82f9d..0000000
--- a/xfa/src/fde/css/fde_cssstyleselector.cpp
+++ /dev/null
@@ -1,1794 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_cssstyleselector.h"
-
-#include <algorithm>
-
-#include "xfa/src/fde/css/fde_csscache.h"
-#include "xfa/src/fde/css/fde_cssdeclaration.h"
-
-int32_t CFDE_CSSCounterStyle::FindIndex(const FX_WCHAR* pszIdentifier) {
-  int32_t iCount = m_arrCounterData.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) ==
-        0) {
-      return i;
-    }
-  }
-  return -1;
-}
-void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList* pList) {
-  if (pList == NULL) {
-    return;
-  }
-  int32_t iCount = pList->CountValues();
-  FX_FLOAT fDefValue = 1.0;
-  FX_BOOL bDefIncrement = TRUE;
-  if (pList == m_pCounterReset) {
-    fDefValue = 0.0;
-    bDefIncrement = FALSE;
-  }
-  for (int32_t i = 0; i < iCount; i++) {
-    IFDE_CSSValueList* pCounter = (IFDE_CSSValueList*)pList->GetValue(i);
-    int32_t iLen;
-    const FX_WCHAR* pszIdentifier =
-        ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(0)))->GetString(iLen);
-    FX_FLOAT fValue = fDefValue;
-    if (pCounter->CountValues() > 1) {
-      fValue = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(1)))->GetFloat();
-    }
-    int32_t iIndex = FindIndex(pszIdentifier);
-    if (iIndex == -1) {
-      FDE_CSSCOUNTERDATA data;
-      data.m_pszIdent = pszIdentifier;
-      if (bDefIncrement) {
-        data.m_bIncrement = TRUE;
-        data.m_iIncVal = (int32_t)fValue;
-      } else {
-        data.m_iResetVal = (int32_t)fValue;
-        data.m_bReset = TRUE;
-      }
-      m_arrCounterData.Add(data);
-    } else {
-      FDE_CSSCOUNTERDATA& data = m_arrCounterData.ElementAt(iIndex);
-      if (bDefIncrement) {
-        data.m_bIncrement = TRUE;
-        data.m_iIncVal += (int32_t)fValue;
-      } else {
-        data.m_bReset = TRUE;
-        data.m_iResetVal = (int32_t)fValue;
-      }
-    }
-  }
-}
-void CFDE_CSSCounterStyle::UpdateIndex() {
-  if (!m_bIndexDirty) {
-    return;
-  }
-  m_arrCounterData.RemoveAll();
-  DoUpdateIndex(m_pCounterInc);
-  DoUpdateIndex(m_pCounterReset);
-  m_bIndexDirty = FALSE;
-}
-FDE_CSSTEXTEMPHASISMARK CFDE_CSSComputedStyle::GetTextEmphasisMark() const {
-  if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) {
-    return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark;
-  }
-  if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) {
-    return FDE_CSSTEXTEMPHASISMARK_Dot;
-  }
-  return FDE_CSSTEXTEMPHASISMARK_Sesame;
-}
-FDE_CSSRuleData::FDE_CSSRuleData(IFDE_CSSSelector* pSel,
-                                 IFDE_CSSDeclaration* pDecl,
-                                 FX_DWORD dwPos)
-    : pSelector(pSel), pDeclaration(pDecl), dwPriority(dwPos), pNext(NULL) {
-  static const FX_DWORD s_Specific[5] = {0x00010000, 0x00010000, 0x00100000,
-                                         0x00100000, 0x01000000};
-  for (; pSel != NULL; pSel = pSel->GetNextSelector()) {
-    FDE_CSSSELECTORTYPE eType = pSel->GetType();
-    if (eType > FDE_CSSSELECTORTYPE_Descendant ||
-        pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) {
-      dwPriority += s_Specific[eType];
-    }
-  }
-}
-void CFDE_CSSRuleCollection::Clear() {
-  m_IDRules.RemoveAll();
-  m_TagRules.RemoveAll();
-  m_ClassRules.RemoveAll();
-  m_pUniversalRules = NULL;
-  m_pStaticStore = NULL;
-  m_iSelectors = 0;
-}
-void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets,
-                                          FX_DWORD dwMediaList,
-                                          IFX_FontMgr* pFontMgr) {
-  int32_t iSheets = sheets.GetSize();
-  for (int32_t i = 0; i < iSheets; ++i) {
-    IFDE_CSSStyleSheet* pSheet = sheets.GetAt(i);
-    if (FX_DWORD dwMatchMedia = pSheet->GetMediaList() & dwMediaList) {
-      int32_t iRules = pSheet->CountRules();
-      for (int32_t j = 0; j < iRules; j++) {
-        AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr);
-      }
-    }
-  }
-}
-void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet,
-                                          IFDE_CSSRule* pRule,
-                                          FX_DWORD dwMediaList,
-                                          IFX_FontMgr* pFontMgr) {
-  switch (pRule->GetType()) {
-    case FDE_CSSRULETYPE_Style: {
-      IFDE_CSSStyleRule* pStyleRule = (IFDE_CSSStyleRule*)pRule;
-      IFDE_CSSDeclaration* pDeclaration = pStyleRule->GetDeclaration();
-      int32_t iSelectors = pStyleRule->CountSelectorLists();
-      for (int32_t i = 0; i < iSelectors; ++i) {
-        IFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i);
-        if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) {
-          FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration);
-          AddRuleTo(m_pPersudoRules, pData);
-          continue;
-        }
-        if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) {
-          AddRuleTo(m_TagRules, pSelector->GetNameHash(), pSelector,
-                    pDeclaration);
-          continue;
-        }
-        IFDE_CSSSelector* pNext = pSelector->GetNextSelector();
-        if (pNext == NULL) {
-          FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration);
-          AddRuleTo(m_pUniversalRules, pData);
-          continue;
-        }
-        switch (pNext->GetType()) {
-          case FDE_CSSSELECTORTYPE_ID:
-            AddRuleTo(m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration);
-            break;
-          case FDE_CSSSELECTORTYPE_Class:
-            AddRuleTo(m_ClassRules, pNext->GetNameHash(), pSelector,
-                      pDeclaration);
-            break;
-          case FDE_CSSSELECTORTYPE_Descendant:
-          case FDE_CSSSELECTORTYPE_Element:
-            AddRuleTo(m_pUniversalRules, NewRuleData(pSelector, pDeclaration));
-            break;
-          default:
-            FXSYS_assert(FALSE);
-            break;
-        }
-      }
-    } break;
-    case FDE_CSSRULETYPE_Media: {
-      IFDE_CSSMediaRule* pMediaRule = (IFDE_CSSMediaRule*)pRule;
-      if (pMediaRule->GetMediaList() & dwMediaList) {
-        int32_t iRules = pMediaRule->CountRules();
-        for (int32_t i = 0; i < iRules; ++i) {
-          AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList,
-                       pFontMgr);
-        }
-      }
-    } break;
-    default:
-      break;
-  }
-}
-void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr& map,
-                                       FX_DWORD dwKey,
-                                       IFDE_CSSSelector* pSel,
-                                       IFDE_CSSDeclaration* pDecl) {
-  void* pKey = (void*)(uintptr_t)dwKey;
-  FDE_CSSRuleData* pData = NewRuleData(pSel, pDecl);
-  FDE_CSSRuleData* pList = NULL;
-  if (!map.Lookup(pKey, (void*&)pList)) {
-    map.SetAt(pKey, pData);
-  } else if (AddRuleTo(pList, pData)) {
-    map.SetAt(pKey, pList);
-  }
-}
-
-FX_BOOL CFDE_CSSRuleCollection::AddRuleTo(FDE_CSSRuleData*& pList,
-                                          FDE_CSSRuleData* pData) {
-  if (pList) {
-    pData->pNext = pList->pNext;
-    pList->pNext = pData;
-    return FALSE;
-  }
-
-  pList = pData;
-  return TRUE;
-}
-
-FDE_CSSRuleData* CFDE_CSSRuleCollection::NewRuleData(
-    IFDE_CSSSelector* pSel,
-    IFDE_CSSDeclaration* pDecl) {
-  return FXTARGET_NewWith(m_pStaticStore)
-      FDE_CSSRuleData(pSel, pDecl, ++m_iSelectors);
-}
-
-IFDE_CSSStyleSelector* IFDE_CSSStyleSelector::Create() {
-  return new CFDE_CSSStyleSelector;
-}
-CFDE_CSSStyleSelector::CFDE_CSSStyleSelector()
-    : m_pFontMgr(NULL),
-      m_fDefFontSize(12.0f),
-      m_pRuleDataStore(NULL),
-      m_pInlineStyleStore(NULL),
-      m_pFixedStyleStore(NULL),
-      m_pAccelerator(NULL) {
-  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author;
-  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User;
-  m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] =
-      FDE_CSSSTYLESHEETGROUP_UserAgent;
-}
-CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector() {
-  Reset();
-  if (m_pInlineStyleStore != NULL) {
-    m_pInlineStyleStore->Release();
-  }
-  if (m_pFixedStyleStore != NULL) {
-    m_pFixedStyleStore->Release();
-  }
-  if (m_pAccelerator != NULL) {
-    delete m_pAccelerator;
-  }
-}
-void CFDE_CSSStyleSelector::SetFontMgr(IFX_FontMgr* pFontMgr) {
-  m_pFontMgr = pFontMgr;
-}
-void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) {
-  FXSYS_assert(fFontSize > 0);
-  m_fDefFontSize = fFontSize;
-}
-IFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() {
-  if (m_pAccelerator == NULL) {
-    m_pAccelerator = new CFDE_CSSAccelerator;
-    FXSYS_assert(m_pAccelerator != NULL);
-  }
-  m_pAccelerator->Clear();
-  return m_pAccelerator;
-}
-IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(
-    IFDE_CSSComputedStyle* pParentStyle) {
-  if (m_pFixedStyleStore == NULL) {
-    m_pFixedStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 16,
-                                            sizeof(CFDE_CSSComputedStyle));
-    FXSYS_assert(m_pFixedStyleStore != NULL);
-  }
-  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore)
-      CFDE_CSSComputedStyle(m_pFixedStyleStore);
-  if (pParentStyle) {
-    pStyle->m_InheritedData =
-        ((CFDE_CSSComputedStyle*)pParentStyle)->m_InheritedData;
-  } else {
-    pStyle->m_InheritedData.Reset();
-  }
-  pStyle->m_NonInheritedData.Reset();
-  return pStyle;
-}
-FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
-                                             IFDE_CSSStyleSheet* pSheet) {
-  FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);
-  CFDE_CSSStyleSheetArray& dest = m_SheetGroups[eType];
-  dest.RemoveAt(0, dest.GetSize());
-  if (pSheet != NULL) {
-    dest.Add(pSheet);
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(
-    FDE_CSSSTYLESHEETGROUP eType,
-    const CFDE_CSSStyleSheetArray* pArray) {
-  FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);
-  CFDE_CSSStyleSheetArray& dest = m_SheetGroups[eType];
-  if (pArray == NULL) {
-    dest.RemoveAt(0, dest.GetSize());
-  } else {
-    dest.Copy(*pArray);
-  }
-  return TRUE;
-}
-void CFDE_CSSStyleSelector::SetStylePriority(
-    FDE_CSSSTYLESHEETGROUP eType,
-    FDE_CSSSTYLESHEETPRIORITY ePriority) {
-  m_ePriorities[ePriority] = eType;
-}
-void CFDE_CSSStyleSelector::UpdateStyleIndex(FX_DWORD dwMediaList) {
-  Reset();
-  m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0);
-  FXSYS_assert(m_pRuleDataStore != NULL);
-  for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
-    CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup];
-    rules.m_pStaticStore = m_pRuleDataStore;
-    rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr);
-  }
-}
-void CFDE_CSSStyleSelector::Reset() {
-  for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
-    m_RuleCollection[iGroup].Clear();
-  }
-  if (m_pRuleDataStore != NULL) {
-    m_pRuleDataStore->Release();
-    m_pRuleDataStore = NULL;
-  }
-}
-int32_t CFDE_CSSStyleSelector::MatchDeclarations(
-    IFDE_CSSTagProvider* pTag,
-    CFDE_CSSDeclarationArray& matchedDecls,
-    FDE_CSSPERSUDO ePersudoType) {
-  FXSYS_assert(m_pAccelerator != NULL && pTag != NULL);
-  FDE_CSSTagCache* pCache = m_pAccelerator->GetTopElement();
-  FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag);
-  matchedDecls.RemoveAt(0, matchedDecls.GetSize());
-  for (int32_t ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0;
-       --ePriority) {
-    FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority];
-    CFDE_CSSRuleCollection& rules = m_RuleCollection[eGroup];
-    if (rules.CountSelectors() == 0) {
-      continue;
-    }
-    if (ePersudoType == FDE_CSSPERSUDO_NONE) {
-      MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType);
-      if (pCache->HashTag()) {
-        MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()),
-                   ePersudoType);
-      }
-      int32_t iCount = pCache->CountHashClass();
-      for (int32_t i = 0; i < iCount; i++) {
-        pCache->SetClassIndex(i);
-        MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()),
-                   ePersudoType);
-      }
-    } else {
-      MatchRules(pCache, rules.GetPersudoRuleData(), ePersudoType);
-    }
-
-    std::sort(m_MatchedRules.begin(), m_MatchedRules.end(),
-              [](const FDE_CSSRuleData* p1, const FDE_CSSRuleData* p2) {
-                return p1->dwPriority < p2->dwPriority;
-              });
-    for (const auto& rule : m_MatchedRules)
-      matchedDecls.Add(rule->pDeclaration);
-    m_MatchedRules.clear();
-  }
-  return matchedDecls.GetSize();
-}
-
-void CFDE_CSSStyleSelector::MatchRules(FDE_CSSTagCache* pCache,
-                                       FDE_CSSRuleData* pList,
-                                       FDE_CSSPERSUDO ePersudoType) {
-  while (pList) {
-    if (MatchSelector(pCache, pList->pSelector, ePersudoType))
-      m_MatchedRules.push_back(pList);
-    pList = pList->pNext;
-  }
-}
-
-FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_CSSTagCache* pCache,
-                                             IFDE_CSSSelector* pSel,
-                                             FDE_CSSPERSUDO ePersudoType) {
-  FX_DWORD dwHash;
-  while (pSel != NULL && pCache != NULL) {
-    switch (pSel->GetType()) {
-      case FDE_CSSSELECTORTYPE_Descendant:
-        dwHash = pSel->GetNameHash();
-        while ((pCache = pCache->GetParent()) != NULL) {
-          if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {
-            continue;
-          }
-          if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) {
-            return TRUE;
-          }
-        }
-        return FALSE;
-      case FDE_CSSSELECTORTYPE_ID:
-        dwHash = pCache->HashID();
-        if (dwHash != pSel->GetNameHash()) {
-          return FALSE;
-        }
-        break;
-      case FDE_CSSSELECTORTYPE_Class:
-        dwHash = pCache->HashClass();
-        if (dwHash != pSel->GetNameHash()) {
-          return FALSE;
-        }
-        break;
-      case FDE_CSSSELECTORTYPE_Element:
-        dwHash = pSel->GetNameHash();
-        if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {
-          return FALSE;
-        }
-        break;
-      case FDE_CSSSELECTORTYPE_Persudo:
-        dwHash = FDE_GetCSSPersudoByEnum(ePersudoType)->dwHash;
-        if (dwHash != pSel->GetNameHash()) {
-          return FALSE;
-        }
-        break;
-      default:
-        FXSYS_assert(FALSE);
-        break;
-    }
-    pSel = pSel->GetNextSelector();
-  }
-  return pSel == NULL && pCache != NULL;
-}
-
-void CFDE_CSSStyleSelector::ComputeStyle(
-    IFDE_CSSTagProvider* pTag,
-    const IFDE_CSSDeclaration** ppDeclArray,
-    int32_t iDeclCount,
-    IFDE_CSSComputedStyle* pDestStyle) {
-  FXSYS_assert(iDeclCount >= 0);
-  FXSYS_assert(pDestStyle);
-  FX_POSITION pos = pTag->GetFirstAttribute();
-  if (pos != NULL) {
-    if (m_pInlineStyleStore == NULL) {
-      m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0);
-    }
-    CFDE_CSSDeclaration* pDecl = NULL;
-    CFX_WideStringC wsAttri, wsValue;
-    FX_DWORD dwAttriHash;
-    do {
-      pTag->GetNextAttribute(pos, wsAttri, wsValue);
-      dwAttriHash =
-          FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE);
-      static const FX_DWORD s_dwStyleHash =
-          FX_HashCode_String_GetW(L"style", 5, TRUE);
-      static const FX_DWORD s_dwAlignHash =
-          FX_HashCode_String_GetW(L"align", 5, TRUE);
-      if (dwAttriHash == s_dwStyleHash) {
-        if (pDecl == NULL) {
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
-        }
-        AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength());
-      } else if (dwAttriHash == s_dwAlignHash) {
-        if (pDecl == NULL) {
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
-        }
-        FDE_CSSPROPERTYARGS args;
-        args.pStringCache = NULL;
-        args.pStaticStore = m_pInlineStyleStore;
-        args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);
-        pDecl->AddProperty(&args, wsValue.GetPtr(), wsValue.GetLength());
-      }
-    } while (pos != NULL);
-    if (pDecl != NULL) {
-      CFDE_CSSDeclarationArray decls;
-      decls.SetSize(iDeclCount + 1);
-      IFDE_CSSDeclaration** ppInline = decls.GetData();
-      FXSYS_memcpy(ppInline, ppDeclArray,
-                   iDeclCount * sizeof(IFDE_CSSDeclaration*));
-      ppInline[iDeclCount++] = pDecl;
-      ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration**)ppInline, iDeclCount,
-                        pDestStyle);
-      ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration**)ppInline,
-                        iDeclCount, pDestStyle);
-      return;
-    }
-  }
-  if (iDeclCount > 0) {
-    FXSYS_assert(ppDeclArray != NULL);
-    ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle);
-    ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle);
-  }
-}
-void CFDE_CSSStyleSelector::ApplyDeclarations(
-    FX_BOOL bPriority,
-    const IFDE_CSSDeclaration** ppDeclArray,
-    int32_t iDeclCount,
-    IFDE_CSSComputedStyle* pDestStyle) {
-  CFDE_CSSComputedStyle* pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle;
-  IFDE_CSSValue* pVal;
-  FX_BOOL bImportant;
-  int32_t i;
-  if (bPriority) {
-    IFDE_CSSValue *pLastest = NULL, *pImportant = NULL;
-    for (i = 0; i < iDeclCount; ++i) {
-      pVal = ppDeclArray[i]->GetProperty(FDE_CSSPROPERTY_FontSize, bImportant);
-      if (pVal == NULL) {
-        continue;
-      } else if (bImportant) {
-        pImportant = pVal;
-      } else {
-        pLastest = pVal;
-      }
-    }
-    if (pImportant) {
-      ApplyProperty(FDE_CSSPROPERTY_FontSize, pImportant, pComputedStyle);
-    } else if (pLastest) {
-      ApplyProperty(FDE_CSSPROPERTY_FontSize, pLastest, pComputedStyle);
-    }
-  } else {
-    CFDE_CSSDeclarationArray importants;
-    const IFDE_CSSDeclaration* pDecl = NULL;
-    FDE_CSSPROPERTY eProp;
-    FX_POSITION pos;
-    for (i = 0; i < iDeclCount; ++i) {
-      pDecl = ppDeclArray[i];
-      pos = pDecl->GetStartPosition();
-      while (pos != NULL) {
-        pDecl->GetNextProperty(pos, eProp, pVal, bImportant);
-        if (eProp == FDE_CSSPROPERTY_FontSize) {
-          continue;
-        } else if (!bImportant) {
-          ApplyProperty(eProp, pVal, pComputedStyle);
-        } else if (importants.GetSize() == 0 ||
-                   importants[importants.GetUpperBound()] != pDecl) {
-          importants.Add((IFDE_CSSDeclaration*)pDecl);
-        }
-      }
-    }
-    iDeclCount = importants.GetSize();
-    for (i = 0; i < iDeclCount; ++i) {
-      pDecl = importants[i];
-      pos = pDecl->GetStartPosition();
-      while (pos != NULL) {
-        pDecl->GetNextProperty(pos, eProp, pVal, bImportant);
-        if (bImportant && eProp != FDE_CSSPROPERTY_FontSize) {
-          ApplyProperty(eProp, pVal, pComputedStyle);
-        }
-      }
-    }
-    CFX_WideString wsName, wsValue;
-    pos = pDecl->GetStartCustom();
-    while (pos) {
-      pDecl->GetNextCustom(pos, wsName, wsValue);
-      pComputedStyle->AddCustomStyle(wsName, wsValue);
-    }
-  }
-}
-void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
-                                              const FX_WCHAR* psz,
-                                              int32_t iLen) {
-  FXSYS_assert(pDecl != NULL && psz != NULL && iLen > 0);
-  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
-  if (pSyntax == NULL) {
-    return;
-  }
-  if (pSyntax->Init(psz, iLen, 32, TRUE)) {
-    int32_t iLen;
-    const FX_WCHAR* psz;
-    FDE_CSSPROPERTYARGS args;
-    args.pStringCache = NULL;
-    args.pStaticStore = m_pInlineStyleStore;
-    args.pProperty = NULL;
-    CFX_WideString wsName;
-    for (;;) {
-      FDE_CSSSYNTAXSTATUS eStatus = pSyntax->DoSyntaxParse();
-      if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyName) {
-        psz = pSyntax->GetCurrentString(iLen);
-        args.pProperty = FDE_GetCSSPropertyByName(psz, iLen);
-        if (args.pProperty == NULL) {
-          wsName = CFX_WideStringC(psz, iLen);
-        }
-      } else if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyValue) {
-        if (args.pProperty != NULL) {
-          psz = pSyntax->GetCurrentString(iLen);
-          if (iLen > 0) {
-            pDecl->AddProperty(&args, psz, iLen);
-          }
-        } else if (iLen > 0) {
-          psz = pSyntax->GetCurrentString(iLen);
-          if (iLen > 0) {
-            pDecl->AddProperty(&args, wsName, wsName.GetLength(), psz, iLen);
-          }
-        }
-      } else {
-        break;
-      }
-    }
-  }
-  pSyntax->Release();
-}
-#define FDE_CSSNONINHERITS (pComputedStyle->m_NonInheritedData)
-#define FDE_CSSINHERITS (pComputedStyle->m_InheritedData)
-#define FDE_CSSFONTSIZE (FDE_CSSINHERITS.m_fFontSize)
-void CFDE_CSSStyleSelector::ApplyProperty(
-    FDE_CSSPROPERTY eProperty,
-    IFDE_CSSValue* pValue,
-    CFDE_CSSComputedStyle* pComputedStyle) {
-  if (pValue->GetType() == FDE_CSSVALUETYPE_Primitive) {
-    IFDE_CSSPrimitiveValue* pPrimitive = (IFDE_CSSPrimitiveValue*)pValue;
-    FDE_CSSPRIMITIVETYPE eType = pPrimitive->GetPrimitiveType();
-    switch (eProperty) {
-      case FDE_CSSPROPERTY_Display:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eDisplay = ToDisplay(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_FontSize: {
-        FX_FLOAT& fFontSize = FDE_CSSFONTSIZE;
-        if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
-            eType <= FDE_CSSPRIMITIVETYPE_PC) {
-          fFontSize = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          fFontSize = ToFontSize(pPrimitive->GetEnum(), fFontSize);
-        }
-      } break;
-      case FDE_CSSPROPERTY_LineHeight:
-        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          FDE_CSSINHERITS.m_fLineHeight =
-              pPrimitive->GetFloat() * FDE_CSSFONTSIZE;
-        } else if (eType > FDE_CSSPRIMITIVETYPE_Number &&
-                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
-          FDE_CSSINHERITS.m_fLineHeight =
-              ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);
-        }
-        break;
-      case FDE_CSSPROPERTY_TextAlign:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eTextAligh = ToTextAlign(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_TextIndent:
-        SetLengthWithPercent(FDE_CSSINHERITS.m_TextIndent, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_FontWeight:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_wFontWeight = ToFontWeight(pPrimitive->GetEnum());
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          int32_t iValue = (int32_t)pPrimitive->GetFloat() / 100;
-          if (iValue >= 1 && iValue <= 9) {
-            FDE_CSSINHERITS.m_wFontWeight = iValue * 100;
-          }
-        }
-        break;
-      case FDE_CSSPROPERTY_FontStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eFontStyle = ToFontStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_Color:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSINHERITS.m_dwFontColor = pPrimitive->GetRGBColor();
-        }
-        break;
-      case FDE_CSSPROPERTY_MarginLeft:
-        FDE_CSSNONINHERITS.m_bHasMargin |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.left, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MarginTop:
-        FDE_CSSNONINHERITS.m_bHasMargin |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.top, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MarginRight:
-        FDE_CSSNONINHERITS.m_bHasMargin |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.right, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MarginBottom:
-        FDE_CSSNONINHERITS.m_bHasMargin |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.bottom, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_PaddingLeft:
-        FDE_CSSNONINHERITS.m_bHasPadding |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.left, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_PaddingTop:
-        FDE_CSSNONINHERITS.m_bHasPadding |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.top, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_PaddingRight:
-        FDE_CSSNONINHERITS.m_bHasPadding |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.right, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_PaddingBottom:
-        FDE_CSSNONINHERITS.m_bHasPadding |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.bottom,
-                                 eType, pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BorderLeftWidth:
-        FDE_CSSNONINHERITS.m_bHasBorder |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.left, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BorderTopWidth:
-        FDE_CSSNONINHERITS.m_bHasBorder |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.top, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BorderRightWidth:
-        FDE_CSSNONINHERITS.m_bHasBorder |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.right, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BorderBottomWidth:
-        FDE_CSSNONINHERITS.m_bHasBorder |=
-            SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.bottom, eType,
-                                 pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BorderLeftStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBDRLeftStyle =
-              ToBorderStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderTopStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBDRTopStyle =
-              ToBorderStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderRightStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBDRRightStyle =
-              ToBorderStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderBottomStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBDRBottomStyle =
-              ToBorderStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderLeftColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwBDRLeftColor = pPrimitive->GetRGBColor();
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderTopColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwBDRTopColor = pPrimitive->GetRGBColor();
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderRightColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwBDRRightColor = pPrimitive->GetRGBColor();
-        }
-        break;
-      case FDE_CSSPROPERTY_BorderBottomColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwBDRBottomColor = pPrimitive->GetRGBColor();
-        }
-        break;
-      case FDE_CSSPROPERTY_ListStyleType:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eListStyleType =
-              ToListStyleType(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_ListStylePosition:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eListStylePosition =
-              ToListStylePosition(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BackgroundColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwBKGColor = pPrimitive->GetRGBColor();
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_dwBKGColor = 0;
-        }
-        break;
-      case FDE_CSSPROPERTY_Visibility:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eVisibility = ToVisibility(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_Width:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cx, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_Height:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cy, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MinWidth:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cx, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MinHeight:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cy, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MaxWidth:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cx, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_MaxHeight:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cy, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_VerticalAlign:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eVerticalAlign =
-              ToVerticalAlign(pPrimitive->GetEnum());
-        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
-                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
-          FDE_CSSNONINHERITS.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number;
-          FDE_CSSNONINHERITS.m_fVerticalAlign =
-              ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);
-        }
-        break;
-      case FDE_CSSPROPERTY_WhiteSpace:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eWhiteSpace = ToWhiteSpace(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_TextTransform:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eTextTransform =
-              ToTextTransform(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_FontVariant:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eFontVariant = ToFontVariant(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_LetterSpacing:
-        if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
-          break;
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
-        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
-                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
-          SetLengthWithPercent(FDE_CSSINHERITS.m_LetterSpacing, eType,
-                               pPrimitive, FDE_CSSFONTSIZE);
-        }
-        break;
-      case FDE_CSSPROPERTY_WordSpacing:
-        if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
-          break;
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
-        } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
-                   eType <= FDE_CSSPRIMITIVETYPE_PC) {
-          SetLengthWithPercent(FDE_CSSINHERITS.m_WordSpacing, eType, pPrimitive,
-                               FDE_CSSFONTSIZE);
-        }
-        break;
-      case FDE_CSSPROPERTY_Float:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eFloat = ToFloat(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_Clear:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eClear = ToClear(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_WritingMode:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eWritingMode = ToWritingMode(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_WordBreak:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eWordBreak = ToWordBreak(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_Widows:
-        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          FDE_CSSINHERITS.m_iWidows = (int32_t)pPrimitive->GetFloat();
-        }
-        break;
-      case FDE_CSSPROPERTY_Orphans:
-        if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          FDE_CSSINHERITS.m_iOrphans = (int32_t)pPrimitive->GetFloat();
-        }
-        break;
-      case FDE_CSSPROPERTY_TextEmphasisColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          switch (pPrimitive->GetEnum()) {
-            case FDE_CSSPROPERTYVALUE_Transparent:
-              FDE_CSSINHERITS.m_dwTextEmphasisColor = 0;
-              FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;
-              break;
-            case FDE_CSSPROPERTYVALUE_Currentcolor:
-              FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = TRUE;
-              break;
-            default:
-              break;
-          }
-        } else if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSINHERITS.m_dwTextEmphasisColor = pPrimitive->GetRGBColor();
-          FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;
-        }
-        break;
-      case FDE_CSSPROPERTY_PageBreakBefore:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_ePageBreakBefore =
-              ToPageBreak(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_PageBreakAfter:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_ePageBreakAfter =
-              ToPageBreak(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_PageBreakInside:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_ePageBreakInside =
-              ToPageBreak(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_OverflowX:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eOverflowX = ToOverflow(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_OverflowY:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eOverflowY = ToOverflow(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_LineBreak:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eLineBreak = ToLineBreak(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_ColumnCount:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);
-        } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {
-          FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Point,
-                                               pPrimitive->GetFloat());
-        }
-        break;
-      case FDE_CSSPROPERTY_ColumnGap:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnGap, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_ColumnRuleColor:
-        if (eType == FDE_CSSPRIMITIVETYPE_RGB) {
-          FDE_CSSNONINHERITS.m_dwColumnRuleColor = pPrimitive->GetRGBColor();
-          FDE_CSSNONINHERITS.m_bColumnRuleColorSame = FALSE;
-        }
-        break;
-      case FDE_CSSPROPERTY_ColumnRuleStyle:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eColumnRuleStyle =
-              ToBorderStyle(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_ColumnRuleWidth:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnRuleWidth, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_ColumnWidth:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnWidth, eType,
-                             pPrimitive, FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_BackgroundImage:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_pszBKGImage = NULL;
-        } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {
-          int32_t iLength;
-          FDE_CSSNONINHERITS.m_pszBKGImage = pPrimitive->GetString(iLength);
-        }
-        break;
-      case FDE_CSSPROPERTY_Position:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_ePosition = ToPosition(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_Top:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Top, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_Bottom:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Bottom, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_Left:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Left, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_Right:
-        SetLengthWithPercent(FDE_CSSNONINHERITS.m_Right, eType, pPrimitive,
-                             FDE_CSSFONTSIZE);
-        break;
-      case FDE_CSSPROPERTY_ListStyleImage:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_pszListStyleImage = NULL;
-        } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {
-          int32_t iLength;
-          FDE_CSSINHERITS.m_pszListStyleImage = pPrimitive->GetString(iLength);
-        }
-        break;
-      case FDE_CSSPROPERTY_CaptionSide:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eCaptionSide = ToCaptionSide(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BackgroundRepeat:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBKGRepeat = ToBKGRepeat(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_BackgroundAttachment:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSNONINHERITS.m_eBKGAttachment =
-              ToBKGAttachment(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_RubyAlign:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eRubyAlign = ToRubyAlign(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_RubyOverhang:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eRubyOverhang =
-              ToRubyOverhang(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_RubyPosition:
-        if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-          FDE_CSSINHERITS.m_eRubyPosition =
-              ToRubyPosition(pPrimitive->GetEnum());
-        }
-        break;
-      case FDE_CSSPROPERTY_RubySpan:
-        FDE_CSSNONINHERITS.m_pRubySpan = pPrimitive;
-        break;
-      default:
-        break;
-    }
-  } else if (pValue->GetType() == FDE_CSSVALUETYPE_List) {
-    IFDE_CSSValueList* pList = (IFDE_CSSValueList*)pValue;
-    int32_t iCount = pList->CountValues();
-    if (iCount > 0) {
-      switch (eProperty) {
-        case FDE_CSSPROPERTY_FontFamily:
-          FDE_CSSINHERITS.m_pFontFamily = pList;
-          break;
-        case FDE_CSSPROPERTY_TextDecoration:
-          FDE_CSSNONINHERITS.m_dwTextDecoration = ToTextDecoration(pList);
-          break;
-        case FDE_CSSPROPERTY_CounterIncrement: {
-          if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {
-            FDE_CSSNONINHERITS.m_pCounterStyle = new CFDE_CSSCounterStyle;
-          }
-          FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterIncrementList(pList);
-        } break;
-        case FDE_CSSPROPERTY_CounterReset: {
-          if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {
-            FDE_CSSNONINHERITS.m_pCounterStyle = new CFDE_CSSCounterStyle;
-          }
-          FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterResetList(pList);
-        } break;
-        case FDE_CSSPROPERTY_Content:
-          FDE_CSSNONINHERITS.m_pContentList = pList;
-          break;
-        case FDE_CSSPROPERTY_Quotes:
-          FDE_CSSINHERITS.m_pQuotes = pList;
-          break;
-        case FDE_CSSPROPERTY_TextCombine: {
-          for (int32_t i = 0; i < pList->CountValues(); i++) {
-            IFDE_CSSPrimitiveValue* pVal =
-                (IFDE_CSSPrimitiveValue*)pList->GetValue(i);
-            switch (pVal->GetPrimitiveType()) {
-              case FDE_CSSPRIMITIVETYPE_Enum: {
-                switch (pVal->GetEnum()) {
-                  case FDE_CSSPROPERTYVALUE_None: {
-                    FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_None;
-                    FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;
-                  } break;
-                  case FDE_CSSPROPERTYVALUE_Horizontal: {
-                    FDE_CSSNONINHERITS.m_eTextCombine =
-                        FDE_CSSTEXTCOMBINE_Horizontal;
-                    FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;
-                  } break;
-                  default:
-                    break;
-                }
-              } break;
-              case FDE_CSSPRIMITIVETYPE_Number:
-                FDE_CSSNONINHERITS.m_fTextCombineNumber = pVal->GetFloat();
-                break;
-              default:
-                break;
-            }
-          }
-        } break;
-        case FDE_CSSPROPERTY_TextEmphasisStyle: {
-          FDE_CSSTEXTEMPHASISFILL eFill;
-          FDE_CSSTEXTEMPHASISMARK eMark;
-          for (int32_t i = 0; i < pList->CountValues(); i++) {
-            IFDE_CSSPrimitiveValue* pVal =
-                (IFDE_CSSPrimitiveValue*)pList->GetValue(i);
-            switch (pVal->GetPrimitiveType()) {
-              case FDE_CSSPRIMITIVETYPE_Enum: {
-                if (ToTextEmphasisFill(pVal->GetEnum(), eFill)) {
-                  FDE_CSSINHERITS.m_eTextEmphasisFill = eFill;
-                  continue;
-                } else if (ToTextEmphasisMark(pVal->GetEnum(), eMark)) {
-                  FDE_CSSINHERITS.m_eTextEmphasisMark = eMark;
-                }
-              } break;
-              case FDE_CSSPRIMITIVETYPE_String: {
-                FDE_CSSINHERITS.m_eTextEmphasisMark =
-                    FDE_CSSTEXTEMPHASISMARK_Custom;
-                int32_t iLen;
-                FDE_CSSINHERITS.m_pszTextEmphasisCustomMark =
-                    pVal->GetString(iLen);
-              } break;
-              default:
-                break;
-            }
-          }
-        } break;
-        default:
-          break;
-      }
-    }
-  } else {
-    FXSYS_assert(FALSE);
-  }
-}
-FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
-                                            FX_FLOAT fValue,
-                                            FX_FLOAT fPercentBase) {
-  switch (eUnit) {
-    case FDE_CSSPRIMITIVETYPE_PX:
-    case FDE_CSSPRIMITIVETYPE_Number:
-      return fValue * 72 / 96;
-    case FDE_CSSPRIMITIVETYPE_PT:
-      return fValue;
-    case FDE_CSSPRIMITIVETYPE_EMS:
-    case FDE_CSSPRIMITIVETYPE_EXS:
-      return fValue * fPercentBase;
-    case FDE_CSSPRIMITIVETYPE_Percent:
-      return fValue * fPercentBase / 100.0f;
-    case FDE_CSSPRIMITIVETYPE_CM:
-      return fValue * 28.3464f;
-    case FDE_CSSPRIMITIVETYPE_MM:
-      return fValue * 2.8346f;
-    case FDE_CSSPRIMITIVETYPE_IN:
-      return fValue * 72.0f;
-    case FDE_CSSPRIMITIVETYPE_PC:
-      return fValue / 12.0f;
-    default:
-      return fValue;
-  }
-}
-FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-    default:
-      return FDE_CSSRUBYSPAN_None;
-  }
-}
-FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Before:
-      return FDE_CSSRUBYPOSITION_Before;
-    case FDE_CSSPROPERTYVALUE_After:
-      return FDE_CSSRUBYPOSITION_After;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSRUBYPOSITION_Right;
-    case FDE_CSSPROPERTYVALUE_Inline:
-      return FDE_CSSRUBYPOSITION_Inline;
-    default:
-      return FDE_CSSRUBYPOSITION_Before;
-  }
-}
-FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSRUBYOVERHANG_Auto;
-    case FDE_CSSPROPERTYVALUE_Start:
-      return FDE_CSSRUBYOVERHANG_Start;
-    case FDE_CSSPROPERTYVALUE_End:
-      return FDE_CSSRUBYOVERHANG_End;
-    case FDE_CSSPROPERTYVALUE_None:
-    default:
-      return FDE_CSSRUBYOVERHANG_None;
-  }
-}
-FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSRUBYALIGN_Auto;
-    case FDE_CSSPROPERTYVALUE_Start:
-      return FDE_CSSRUBYALIGN_Start;
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSRUBYALIGN_End;
-    case FDE_CSSPROPERTYVALUE_Center:
-      return FDE_CSSRUBYALIGN_Center;
-    case FDE_CSSPROPERTYVALUE_End:
-      return FDE_CSSRUBYALIGN_End;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSRUBYALIGN_Right;
-    case FDE_CSSPROPERTYVALUE_DistributeLetter:
-      return FDE_CSSRUBYALIGN_DistributeLetter;
-    case FDE_CSSPROPERTYVALUE_DistributeSpace:
-      return FDE_CSSRUBYALIGN_DistributeSpace;
-    case FDE_CSSPROPERTYVALUE_LineEdge:
-      return FDE_CSSRUBYALIGN_LineEdge;
-    default:
-      return FDE_CSSRUBYALIGN_Auto;
-  }
-}
-FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(
-    FDE_CSSPROPERTYVALUE eValue,
-    FDE_CSSTEXTEMPHASISMARK& eMark) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-      eMark = FDE_CSSTEXTEMPHASISMARK_None;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_Dot:
-      eMark = FDE_CSSTEXTEMPHASISMARK_Dot;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_Circle:
-      eMark = FDE_CSSTEXTEMPHASISMARK_Circle;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_DoubleCircle:
-      eMark = FDE_CSSTEXTEMPHASISMARK_DoubleCircle;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_Triangle:
-      eMark = FDE_CSSTEXTEMPHASISMARK_Triangle;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_Sesame:
-      eMark = FDE_CSSTEXTEMPHASISMARK_Sesame;
-      return TRUE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(
-    FDE_CSSPROPERTYVALUE eValue,
-    FDE_CSSTEXTEMPHASISFILL& eFill) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Filled:
-      eFill = FDE_CSSTEXTEMPHASISFILL_Filled;
-      return TRUE;
-    case FDE_CSSPROPERTYVALUE_Open:
-      eFill = FDE_CSSTEXTEMPHASISFILL_Open;
-      return TRUE;
-    default:
-      return FALSE;
-  }
-}
-FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Fixed:
-      return FDE_CSSBKGATTACHMENT_Fixed;
-    case FDE_CSSPROPERTYVALUE_Scroll:
-      return FDE_CSSBKGATTACHMENT_Scroll;
-    default:
-      return FDE_CSSBKGATTACHMENT_Fixed;
-  }
-}
-FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Top:
-      return FDE_CSSCAPTIONSIDE_Top;
-    case FDE_CSSPROPERTYVALUE_Bottom:
-      return FDE_CSSCAPTIONSIDE_Bottom;
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSCAPTIONSIDE_Left;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSCAPTIONSIDE_Right;
-    case FDE_CSSPROPERTYVALUE_Before:
-      return FDE_CSSCAPTIONSIDE_Before;
-    case FDE_CSSPROPERTYVALUE_After:
-      return FDE_CSSCAPTIONSIDE_After;
-    default:
-      return FDE_CSSCAPTIONSIDE_Top;
-  }
-}
-FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Static:
-      return FDE_CSSPOSITION_Static;
-    case FDE_CSSPROPERTYVALUE_Relative:
-      return FDE_CSSPOSITION_Relative;
-    case FDE_CSSPROPERTYVALUE_Fixed:
-      return FDE_CSSPOSITION_Fixed;
-    case FDE_CSSPROPERTYVALUE_Absolute:
-      return FDE_CSSPOSITION_Absolute;
-    default:
-      return FDE_CSSPOSITION_Static;
-  }
-}
-FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSCURSOR_Auto;
-    case FDE_CSSPROPERTYVALUE_Crosshair:
-      return FDE_CSSCURSOR_Crosshair;
-    case FDE_CSSPROPERTYVALUE_Default:
-      return FDE_CSSCURSOR_Default;
-    case FDE_CSSPROPERTYVALUE_Pointer:
-      return FDE_CSSCURSOR_Pointer;
-    case FDE_CSSPROPERTYVALUE_Move:
-      return FDE_CSSCURSOR_Move;
-    case FDE_CSSPROPERTYVALUE_EResize:
-      return FDE_CSSCURSOR_EResize;
-    case FDE_CSSPROPERTYVALUE_NeResize:
-      return FDE_CSSCURSOR_NeResize;
-    case FDE_CSSPROPERTYVALUE_NwResize:
-      return FDE_CSSCURSOR_NwResize;
-    case FDE_CSSPROPERTYVALUE_NResize:
-      return FDE_CSSCURSOR_NResize;
-    case FDE_CSSPROPERTYVALUE_SeResize:
-      return FDE_CSSCURSOR_SeResize;
-    case FDE_CSSPROPERTYVALUE_SwResize:
-      return FDE_CSSCURSOR_SwResize;
-    default:
-      return FDE_CSSCURSOR_Auto;
-  }
-}
-FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Repeat:
-      return FDE_CSSBKGREPEAT_Repeat;
-    case FDE_CSSPROPERTYVALUE_RepeatX:
-      return FDE_CSSBKGREPEAT_RepeatX;
-    case FDE_CSSPROPERTYVALUE_RepeatY:
-      return FDE_CSSBKGREPEAT_RepeatY;
-    case FDE_CSSPROPERTYVALUE_NoRepeat:
-      return FDE_CSSBKGREPEAT_NoRepeat;
-    default:
-      return FDE_CSSBKGREPEAT_Repeat;
-  }
-}
-FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Horizontal:
-      return FDE_CSSTEXTCOMBINE_Horizontal;
-    case FDE_CSSPROPERTYVALUE_None:
-    default:
-      return FDE_CSSTEXTCOMBINE_None;
-  }
-}
-FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSLINEBREAK_Auto;
-    case FDE_CSSPROPERTYVALUE_Loose:
-      return FDE_CSSLINEBREAK_Loose;
-    case FDE_CSSPROPERTYVALUE_Normal:
-      return FDE_CSSLINEBREAK_Normal;
-    case FDE_CSSPROPERTYVALUE_Strict:
-      return FDE_CSSLINEBREAK_Strict;
-    default:
-      return FDE_CSSLINEBREAK_Auto;
-  }
-}
-FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Visible:
-      return FDE_CSSOVERFLOW_Visible;
-    case FDE_CSSPROPERTYVALUE_Hidden:
-      return FDE_CSSOVERFLOW_Hidden;
-    case FDE_CSSPROPERTYVALUE_Scroll:
-      return FDE_CSSOVERFLOW_Scroll;
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSOVERFLOW_Auto;
-    case FDE_CSSPROPERTYVALUE_NoDisplay:
-      return FDE_CSSOVERFLOW_NoDisplay;
-    case FDE_CSSPROPERTYVALUE_NoContent:
-      return FDE_CSSOVERFLOW_NoContent;
-    default:
-      return FDE_CSSOVERFLOW_Visible;
-  }
-}
-FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_HorizontalTb:
-      return FDE_CSSWRITINGMODE_HorizontalTb;
-    case FDE_CSSPROPERTYVALUE_VerticalRl:
-      return FDE_CSSWRITINGMODE_VerticalRl;
-    case FDE_CSSPROPERTYVALUE_VerticalLr:
-      return FDE_CSSWRITINGMODE_VerticalLr;
-    default:
-      return FDE_CSSWRITINGMODE_HorizontalTb;
-  }
-}
-FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Normal:
-      return FDE_CSSWORDBREAK_Normal;
-    case FDE_CSSPROPERTYVALUE_KeepAll:
-      return FDE_CSSWORDBREAK_KeepAll;
-    case FDE_CSSPROPERTYVALUE_BreakAll:
-      return FDE_CSSWORDBREAK_BreakAll;
-    case FDE_CSSPROPERTYVALUE_KeepWords:
-      return FDE_CSSWORDBREAK_KeepWords;
-    default:
-      return FDE_CSSWORDBREAK_Normal;
-  }
-}
-FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSFLOAT_Left;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSFLOAT_Right;
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSFLOAT_None;
-    default:
-      return FDE_CSSFLOAT_None;
-  }
-}
-FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSCLEAR_None;
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSCLEAR_Left;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSCLEAR_Right;
-    case FDE_CSSPROPERTYVALUE_Both:
-      return FDE_CSSCLEAR_Both;
-    default:
-      return FDE_CSSCLEAR_None;
-  }
-}
-FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Avoid:
-      return FDE_CSSPAGEBREAK_Avoid;
-    case FDE_CSSPROPERTYVALUE_Auto:
-      return FDE_CSSPAGEBREAK_Auto;
-    case FDE_CSSPROPERTYVALUE_Always:
-      return FDE_CSSPAGEBREAK_Always;
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSPAGEBREAK_Left;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSPAGEBREAK_Right;
-    default:
-      return FDE_CSSPAGEBREAK_Auto;
-  }
-}
-FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Inline:
-      return FDE_CSSDISPLAY_Inline;
-    case FDE_CSSPROPERTYVALUE_Block:
-      return FDE_CSSDISPLAY_Block;
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSDISPLAY_None;
-    case FDE_CSSPROPERTYVALUE_ListItem:
-      return FDE_CSSDISPLAY_ListItem;
-    case FDE_CSSPROPERTYVALUE_TableCell:
-      return FDE_CSSDISPLAY_TableCell;
-    case FDE_CSSPROPERTYVALUE_TableRow:
-      return FDE_CSSDISPLAY_TableRow;
-    case FDE_CSSPROPERTYVALUE_Table:
-      return FDE_CSSDISPLAY_Table;
-    case FDE_CSSPROPERTYVALUE_TableCaption:
-      return FDE_CSSDISPLAY_TableCaption;
-    case FDE_CSSPROPERTYVALUE_TableRowGroup:
-      return FDE_CSSDISPLAY_TableRowGroup;
-    case FDE_CSSPROPERTYVALUE_TableHeaderGroup:
-      return FDE_CSSDISPLAY_TableHeaderGroup;
-    case FDE_CSSPROPERTYVALUE_TableFooterGroup:
-      return FDE_CSSDISPLAY_TableFooterGroup;
-    case FDE_CSSPROPERTYVALUE_TableColumnGroup:
-      return FDE_CSSDISPLAY_TableColumnGroup;
-    case FDE_CSSPROPERTYVALUE_TableColumn:
-      return FDE_CSSDISPLAY_TableColumn;
-    case FDE_CSSPROPERTYVALUE_InlineTable:
-      return FDE_CSSDISPLAY_InlineTable;
-    case FDE_CSSPROPERTYVALUE_InlineBlock:
-      return FDE_CSSDISPLAY_InlineBlock;
-    case FDE_CSSPROPERTYVALUE_RunIn:
-      return FDE_CSSDISPLAY_RunIn;
-    case FDE_CSSPROPERTYVALUE_Ruby:
-      return FDE_CSSDISPLAY_Ruby;
-    case FDE_CSSPROPERTYVALUE_RubyBase:
-      return FDE_CSSDISPLAY_RubyBase;
-    case FDE_CSSPROPERTYVALUE_RubyText:
-      return FDE_CSSDISPLAY_RubyText;
-    case FDE_CSSPROPERTYVALUE_RubyBaseGroup:
-      return FDE_CSSDISPLSY_RubyBaseGroup;
-    case FDE_CSSPROPERTYVALUE_RubyTextGroup:
-      return FDE_CSSDISPLAY_RubyTextGroup;
-    default:
-      return FDE_CSSDISPLAY_Inline;
-  }
-}
-FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Left:
-      return FDE_CSSTEXTALIGN_Left;
-    case FDE_CSSPROPERTYVALUE_Center:
-      return FDE_CSSTEXTALIGN_Center;
-    case FDE_CSSPROPERTYVALUE_Right:
-      return FDE_CSSTEXTALIGN_Right;
-    case FDE_CSSPROPERTYVALUE_Justify:
-      return FDE_CSSTEXTALIGN_Justify;
-    default:
-      return FDE_CSSTEXTALIGN_Left;
-  }
-}
-FX_WORD CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Normal:
-      return 400;
-    case FDE_CSSPROPERTYVALUE_Bold:
-      return 700;
-    case FDE_CSSPROPERTYVALUE_Bolder:
-      return 900;
-    case FDE_CSSPROPERTYVALUE_Lighter:
-      return 200;
-    default:
-      return 400;
-  }
-}
-FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Italic:
-    case FDE_CSSPROPERTYVALUE_Oblique:
-      return FDE_CSSFONTSTYLE_Italic;
-    default:
-      return FDE_CSSFONTSTYLE_Normal;
-  }
-}
-FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSBORDERSTYLE_None;
-    case FDE_CSSPROPERTYVALUE_Solid:
-      return FDE_CSSBORDERSTYLE_Solid;
-    case FDE_CSSPROPERTYVALUE_Hidden:
-      return FDE_CSSBORDERSTYLE_Hidden;
-    case FDE_CSSPROPERTYVALUE_Dotted:
-      return FDE_CSSBORDERSTYLE_Dotted;
-    case FDE_CSSPROPERTYVALUE_Dashed:
-      return FDE_CSSBORDERSTYLE_Dashed;
-    case FDE_CSSPROPERTYVALUE_Double:
-      return FDE_CSSBORDERSTYLE_Double;
-    case FDE_CSSPROPERTYVALUE_Groove:
-      return FDE_CSSBORDERSTYLE_Groove;
-    case FDE_CSSPROPERTYVALUE_Ridge:
-      return FDE_CSSBORDERSTYLE_Ridge;
-    case FDE_CSSPROPERTYVALUE_Inset:
-      return FDE_CSSBORDERSTYLE_Inset;
-    case FDE_CSSPROPERTYVALUE_Outset:
-      return FDE_CSSBORDERSTYLE_outset;
-    default:
-      return FDE_CSSBORDERSTYLE_None;
-  }
-}
-FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(
-    FDE_CSSLENGTH& width,
-    FDE_CSSPRIMITIVETYPE eType,
-    IFDE_CSSPrimitiveValue* pPrimitive,
-    FX_FLOAT fFontSize) {
-  if (eType == FDE_CSSPRIMITIVETYPE_Percent) {
-    width.Set(FDE_CSSLENGTHUNIT_Percent, pPrimitive->GetFloat() / 100.0f);
-    return width.NonZero();
-  } else if (eType >= FDE_CSSPRIMITIVETYPE_Number &&
-             eType <= FDE_CSSPRIMITIVETYPE_PC) {
-    FX_FLOAT fValue = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);
-    width.Set(FDE_CSSLENGTHUNIT_Point, fValue);
-    return width.NonZero();
-  } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {
-    switch (pPrimitive->GetEnum()) {
-      case FDE_CSSPROPERTYVALUE_Auto:
-        width.Set(FDE_CSSLENGTHUNIT_Auto);
-        return TRUE;
-      case FDE_CSSPROPERTYVALUE_None:
-        width.Set(FDE_CSSLENGTHUNIT_None);
-        return TRUE;
-      case FDE_CSSPROPERTYVALUE_Thin:
-        width.Set(FDE_CSSLENGTHUNIT_Point, 2);
-        return TRUE;
-      case FDE_CSSPROPERTYVALUE_Medium:
-        width.Set(FDE_CSSLENGTHUNIT_Point, 3);
-        return TRUE;
-      case FDE_CSSPROPERTYVALUE_Thick:
-        width.Set(FDE_CSSLENGTHUNIT_Point, 4);
-        return TRUE;
-      default:
-        return FALSE;
-    }
-  }
-  return FALSE;
-}
-FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue,
-                                           FX_FLOAT fCurFontSize) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_XxSmall:
-      return m_fDefFontSize / 1.2f / 1.2f / 1.2f;
-    case FDE_CSSPROPERTYVALUE_XSmall:
-      return m_fDefFontSize / 1.2f / 1.2f;
-    case FDE_CSSPROPERTYVALUE_Small:
-      return m_fDefFontSize / 1.2f;
-    case FDE_CSSPROPERTYVALUE_Medium:
-      return m_fDefFontSize;
-    case FDE_CSSPROPERTYVALUE_Large:
-      return m_fDefFontSize * 1.2f;
-    case FDE_CSSPROPERTYVALUE_XLarge:
-      return m_fDefFontSize * 1.2f * 1.2f;
-    case FDE_CSSPROPERTYVALUE_XxLarge:
-      return m_fDefFontSize * 1.2f * 1.2f * 1.2f;
-    case FDE_CSSPROPERTYVALUE_Larger:
-      return fCurFontSize * 1.2f;
-    case FDE_CSSPROPERTYVALUE_Smaller:
-      return fCurFontSize / 1.2f;
-    default:
-      return fCurFontSize;
-  }
-}
-FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Baseline:
-      return FDE_CSSVERTICALALIGN_Baseline;
-    case FDE_CSSPROPERTYVALUE_Middle:
-      return FDE_CSSVERTICALALIGN_Middle;
-    case FDE_CSSPROPERTYVALUE_Bottom:
-      return FDE_CSSVERTICALALIGN_Bottom;
-    case FDE_CSSPROPERTYVALUE_Super:
-      return FDE_CSSVERTICALALIGN_Super;
-    case FDE_CSSPROPERTYVALUE_Sub:
-      return FDE_CSSVERTICALALIGN_Sub;
-    case FDE_CSSPROPERTYVALUE_Top:
-      return FDE_CSSVERTICALALIGN_Top;
-    case FDE_CSSPROPERTYVALUE_TextTop:
-      return FDE_CSSVERTICALALIGN_TextTop;
-    case FDE_CSSPROPERTYVALUE_TextBottom:
-      return FDE_CSSVERTICALALIGN_TextBottom;
-    default:
-      return FDE_CSSVERTICALALIGN_Baseline;
-  }
-}
-FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSLISTSTYLETYPE_None;
-    case FDE_CSSPROPERTYVALUE_Disc:
-      return FDE_CSSLISTSTYLETYPE_Disc;
-    case FDE_CSSPROPERTYVALUE_Circle:
-      return FDE_CSSLISTSTYLETYPE_Circle;
-    case FDE_CSSPROPERTYVALUE_Square:
-      return FDE_CSSLISTSTYLETYPE_Square;
-    case FDE_CSSPROPERTYVALUE_Decimal:
-      return FDE_CSSLISTSTYLETYPE_Decimal;
-    case FDE_CSSPROPERTYVALUE_DecimalLeadingZero:
-      return FDE_CSSLISTSTYLETYPE_DecimalLeadingZero;
-    case FDE_CSSPROPERTYVALUE_LowerRoman:
-      return FDE_CSSLISTSTYLETYPE_LowerRoman;
-    case FDE_CSSPROPERTYVALUE_UpperRoman:
-      return FDE_CSSLISTSTYLETYPE_UpperRoman;
-    case FDE_CSSPROPERTYVALUE_LowerGreek:
-      return FDE_CSSLISTSTYLETYPE_LowerGreek;
-    case FDE_CSSPROPERTYVALUE_LowerLatin:
-      return FDE_CSSLISTSTYLETYPE_LowerLatin;
-    case FDE_CSSPROPERTYVALUE_UpperLatin:
-      return FDE_CSSLISTSTYLETYPE_UpperLatin;
-    case FDE_CSSPROPERTYVALUE_Armenian:
-      return FDE_CSSLISTSTYLETYPE_Armenian;
-    case FDE_CSSPROPERTYVALUE_Georgian:
-      return FDE_CSSLISTSTYLETYPE_Georgian;
-    case FDE_CSSPROPERTYVALUE_LowerAlpha:
-      return FDE_CSSLISTSTYLETYPE_LowerAlpha;
-    case FDE_CSSPROPERTYVALUE_UpperAlpha:
-      return FDE_CSSLISTSTYLETYPE_UpperAlpha;
-    case FDE_CSSPROPERTYVALUE_CjkIdeographic:
-      return FDE_CSSLISTSTYLETYPE_CjkIdeographic;
-    case FDE_CSSPROPERTYVALUE_Hebrew:
-      return FDE_CSSLISTSTYLETYPE_Hebrew;
-    case FDE_CSSLISTSTYLETYPE_Hiragana:
-      return FDE_CSSLISTSTYLETYPE_Hiragana;
-    case FDE_CSSLISTSTYLETYPE_HiraganaIroha:
-      return FDE_CSSLISTSTYLETYPE_HiraganaIroha;
-    case FDE_CSSLISTSTYLETYPE_Katakana:
-      return FDE_CSSLISTSTYLETYPE_Katakana;
-    case FDE_CSSLISTSTYLETYPE_KatakanaIroha:
-      return FDE_CSSLISTSTYLETYPE_KatakanaIroha;
-    default:
-      return FDE_CSSLISTSTYLETYPE_Disc;
-  }
-}
-FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(
-    FDE_CSSPROPERTYVALUE eValue) {
-  return eValue == FDE_CSSPROPERTYVALUE_Inside
-             ? FDE_CSSLISTSTYLEPOSITION_Inside
-             : FDE_CSSLISTSTYLEPOSITION_Outside;
-}
-FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Visible:
-      return FDE_CSSVISIBILITY_Visible;
-    case FDE_CSSPROPERTYVALUE_Hidden:
-      return FDE_CSSVISIBILITY_Hidden;
-    case FDE_CSSPROPERTYVALUE_Collapse:
-      return FDE_CSSVISIBILITY_Collapse;
-    default:
-      return FDE_CSSVISIBILITY_Visible;
-  }
-}
-FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_Normal:
-      return FDE_CSSWHITESPACE_Normal;
-    case FDE_CSSPROPERTYVALUE_Pre:
-      return FDE_CSSWHITESPACE_Pre;
-    case FDE_CSSPROPERTYVALUE_Nowrap:
-      return FDE_CSSWHITESPACE_Nowrap;
-    case FDE_CSSPROPERTYVALUE_PreWrap:
-      return FDE_CSSWHITESPACE_PreWrap;
-    case FDE_CSSPROPERTYVALUE_PreLine:
-      return FDE_CSSWHITESPACE_PreLine;
-    default:
-      return FDE_CSSWHITESPACE_Normal;
-  }
-}
-FX_DWORD CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) {
-  FX_DWORD dwDecoration = 0;
-  for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) {
-    IFDE_CSSPrimitiveValue* pPrimitive =
-        (IFDE_CSSPrimitiveValue*)pValue->GetValue(i);
-    if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) {
-      switch (pPrimitive->GetEnum()) {
-        case FDE_CSSPROPERTYVALUE_Underline:
-          dwDecoration |= FDE_CSSTEXTDECORATION_Underline;
-          break;
-        case FDE_CSSPROPERTYVALUE_LineThrough:
-          dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough;
-          break;
-        case FDE_CSSPROPERTYVALUE_Overline:
-          dwDecoration |= FDE_CSSTEXTDECORATION_Overline;
-          break;
-        case FDE_CSSPROPERTYVALUE_Blink:
-          dwDecoration |= FDE_CSSTEXTDECORATION_Blink;
-          break;
-        case FDE_CSSPROPERTYVALUE_Double:
-          dwDecoration |= FDE_CSSTEXTDECORATION_Double;
-          break;
-        default:
-          break;
-      }
-    }
-  }
-  return dwDecoration;
-}
-FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(
-    FDE_CSSPROPERTYVALUE eValue) {
-  switch (eValue) {
-    case FDE_CSSPROPERTYVALUE_None:
-      return FDE_CSSTEXTTRANSFORM_None;
-    case FDE_CSSPROPERTYVALUE_Capitalize:
-      return FDE_CSSTEXTTRANSFORM_Capitalize;
-    case FDE_CSSPROPERTYVALUE_Uppercase:
-      return FDE_CSSTEXTTRANSFORM_UpperCase;
-    case FDE_CSSPROPERTYVALUE_Lowercase:
-      return FDE_CSSTEXTTRANSFORM_LowerCase;
-    default:
-      return FDE_CSSTEXTTRANSFORM_None;
-  }
-}
-FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(
-    FDE_CSSPROPERTYVALUE eValue) {
-  return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps
-                                                  : FDE_CSSFONTVARIANT_Normal;
-}
diff --git a/xfa/src/fde/css/fde_cssstyleselector.h b/xfa/src/fde/css/fde_cssstyleselector.h
deleted file mode 100644
index 5f5ee09..0000000
--- a/xfa/src/fde/css/fde_cssstyleselector.h
+++ /dev/null
@@ -1,901 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
-
-#include <vector>
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fde/css/fde_css.h"
-#include "xfa/src/fde/css/fde_csscache.h"
-#include "xfa/src/fde/css/fde_cssdeclaration.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_system.h"
-
-#define FDE_CSSUNIVERSALHASH ('*')
-
-class FDE_CSSRuleData : public CFX_Target {
- public:
-  FDE_CSSRuleData(IFDE_CSSSelector* pSel,
-                  IFDE_CSSDeclaration* pDecl,
-                  FX_DWORD dwPos);
-
-  IFDE_CSSSelector* pSelector;
-  IFDE_CSSDeclaration* pDeclaration;
-  FX_DWORD dwPriority;
-  FDE_CSSRuleData* pNext;
-};
-
-class CFDE_CSSRuleCollection : public CFX_Target {
- public:
-  CFDE_CSSRuleCollection()
-      : m_pStaticStore(nullptr),
-        m_pUniversalRules(nullptr),
-        m_pPersudoRules(nullptr),
-        m_iSelectors(0) {}
-  ~CFDE_CSSRuleCollection() { Clear(); }
-  void AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets,
-                    FX_DWORD dwMediaList,
-                    IFX_FontMgr* pFontMgr);
-  void Clear();
-
-  int32_t CountSelectors() const { return m_iSelectors; }
-  FDE_CSSRuleData* GetIDRuleData(FX_DWORD dwIDHash) {
-    void* pData;
-    return m_IDRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
-               ? (FDE_CSSRuleData*)pData
-               : NULL;
-  }
-  FDE_CSSRuleData* GetTagRuleData(FX_DWORD dwTagHasn) {
-    void* pData;
-    return m_TagRules.Lookup((void*)(uintptr_t)dwTagHasn, pData)
-               ? (FDE_CSSRuleData*)pData
-               : NULL;
-  }
-  FDE_CSSRuleData* GetClassRuleData(FX_DWORD dwIDHash) {
-    void* pData;
-    return m_ClassRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
-               ? (FDE_CSSRuleData*)pData
-               : NULL;
-  }
-  FDE_CSSRuleData* GetUniversalRuleData() { return m_pUniversalRules; }
-  FDE_CSSRuleData* GetPersudoRuleData() { return m_pPersudoRules; }
-  IFX_MEMAllocator* m_pStaticStore;
-
- protected:
-  void AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet,
-                    IFDE_CSSRule* pRule,
-                    FX_DWORD dwMediaList,
-                    IFX_FontMgr* pFontMgr);
-  void AddRuleTo(CFX_MapPtrToPtr& map,
-                 FX_DWORD dwKey,
-                 IFDE_CSSSelector* pSel,
-                 IFDE_CSSDeclaration* pDecl);
-  FX_BOOL AddRuleTo(FDE_CSSRuleData*& pList, FDE_CSSRuleData* pData);
-  FDE_CSSRuleData* NewRuleData(IFDE_CSSSelector* pSel,
-                               IFDE_CSSDeclaration* pDecl);
-  CFX_MapPtrToPtr m_IDRules;
-  CFX_MapPtrToPtr m_TagRules;
-  CFX_MapPtrToPtr m_ClassRules;
-  FDE_CSSRuleData* m_pUniversalRules;
-  FDE_CSSRuleData* m_pPersudoRules;
-  int32_t m_iSelectors;
-};
-class CFDE_CSSAccelerator;
-class CFDE_CSSComputedStyle;
-class CFDE_CSSStyleSelector : public IFDE_CSSStyleSelector, public CFX_Target {
- public:
-  CFDE_CSSStyleSelector();
-  ~CFDE_CSSStyleSelector();
-  virtual void Release() { delete this; }
-
-  virtual void SetFontMgr(IFX_FontMgr* pFontMgr);
-  virtual void SetDefFontSize(FX_FLOAT fFontSize);
-
-  virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
-                                IFDE_CSSStyleSheet* pSheet);
-  virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType,
-                                 const CFDE_CSSStyleSheetArray* pArray);
-  virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType,
-                                FDE_CSSSTYLESHEETPRIORITY ePriority);
-  virtual void UpdateStyleIndex(FX_DWORD dwMediaList);
-  virtual IFDE_CSSAccelerator* InitAccelerator();
-  virtual IFDE_CSSComputedStyle* CreateComputedStyle(
-      IFDE_CSSComputedStyle* pParentStyle);
-  virtual int32_t MatchDeclarations(
-      IFDE_CSSTagProvider* pTag,
-      CFDE_CSSDeclarationArray& matchedDecls,
-      FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE);
-  virtual void ComputeStyle(IFDE_CSSTagProvider* pTag,
-                            const IFDE_CSSDeclaration** ppDeclArray,
-                            int32_t iDeclCount,
-                            IFDE_CSSComputedStyle* pDestStyle);
-
- protected:
-  void Reset();
-  void MatchRules(FDE_CSSTagCache* pCache,
-                  FDE_CSSRuleData* pList,
-                  FDE_CSSPERSUDO ePersudoType);
-  FX_BOOL MatchSelector(FDE_CSSTagCache* pCache,
-                        IFDE_CSSSelector* pSel,
-                        FDE_CSSPERSUDO ePersudoType);
-  void AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
-                         const FX_WCHAR* psz,
-                         int32_t iLen);
-  void ApplyDeclarations(FX_BOOL bPriority,
-                         const IFDE_CSSDeclaration** ppDeclArray,
-                         int32_t iDeclCount,
-                         IFDE_CSSComputedStyle* pDestStyle);
-  void ApplyProperty(FDE_CSSPROPERTY eProperty,
-                     IFDE_CSSValue* pValue,
-                     CFDE_CSSComputedStyle* pComputedStyle);
-
-  FX_FLOAT ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
-                       FX_FLOAT fValue,
-                       FX_FLOAT fPercentBase);
-  FX_BOOL SetLengthWithPercent(FDE_CSSLENGTH& width,
-                               FDE_CSSPRIMITIVETYPE eType,
-                               IFDE_CSSPrimitiveValue* pPrimitive,
-                               FX_FLOAT fFontSize);
-  FX_FLOAT ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize);
-  FDE_CSSDISPLAY ToDisplay(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSTEXTALIGN ToTextAlign(FDE_CSSPROPERTYVALUE eValue);
-  FX_WORD ToFontWeight(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSFONTSTYLE ToFontStyle(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSBORDERSTYLE ToBorderStyle(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSVERTICALALIGN ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSLISTSTYLETYPE ToListStyleType(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSLISTSTYLEPOSITION ToListStylePosition(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSVISIBILITY ToVisibility(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSWHITESPACE ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue);
-  FX_DWORD ToTextDecoration(IFDE_CSSValueList* pList);
-  FDE_CSSTEXTTRANSFORM ToTextTransform(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSFONTVARIANT ToFontVariant(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSFLOAT ToFloat(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSCLEAR ToClear(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSWRITINGMODE ToWritingMode(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSWORDBREAK ToWordBreak(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSPAGEBREAK ToPageBreak(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSOVERFLOW ToOverflow(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSLINEBREAK ToLineBreak(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSTEXTCOMBINE ToTextCombine(FDE_CSSPROPERTYVALUE eValue);
-  FX_BOOL ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue,
-                             FDE_CSSTEXTEMPHASISMARK& eMark);
-  FX_BOOL ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue,
-                             FDE_CSSTEXTEMPHASISFILL& eFill);
-  FDE_CSSCURSOR ToCursor(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSPOSITION ToPosition(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSCAPTIONSIDE ToCaptionSide(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSBKGREPEAT ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSBKGATTACHMENT ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSRUBYALIGN ToRubyAlign(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSRUBYOVERHANG ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue);
-  FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue);
-  IFX_FontMgr* m_pFontMgr;
-  FX_FLOAT m_fDefFontSize;
-  IFX_MEMAllocator* m_pRuleDataStore;
-  CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX];
-  CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX];
-  FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX];
-  IFX_MEMAllocator* m_pInlineStyleStore;
-  IFX_MEMAllocator* m_pFixedStyleStore;
-  CFDE_CSSAccelerator* m_pAccelerator;
-  std::vector<FDE_CSSRuleData*> m_MatchedRules;
-};
-
-struct FDE_CSSCOUNTERDATA {
- public:
-  FDE_CSSCOUNTERDATA() { FXSYS_memset(this, 0, sizeof(FDE_CSSCOUNTERDATA)); }
-  FX_BOOL GetCounterIncrement(int32_t& iValue) {
-    iValue = m_iIncVal;
-    return m_bIncrement;
-  }
-  FX_BOOL GetCounterReset(int32_t& iValue) {
-    iValue = m_iResetVal;
-    return m_bReset;
-  }
-
-  const FX_WCHAR* m_pszIdent;
-  FX_BOOL m_bIncrement;
-  FX_BOOL m_bReset;
-  int32_t m_iIncVal;
-  int32_t m_iResetVal;
-};
-
-class CFDE_CSSCounterStyle {
- public:
-  CFDE_CSSCounterStyle() : m_pCounterInc(NULL), m_pCounterReset(NULL) {}
-  void SetCounterIncrementList(IFDE_CSSValueList* pList) {
-    m_pCounterInc = pList;
-    m_bIndexDirty = TRUE;
-  }
-  void SetCounterResetList(IFDE_CSSValueList* pList) {
-    m_pCounterReset = pList;
-    m_bIndexDirty = TRUE;
-  }
-  int32_t CountCounters() {
-    UpdateIndex();
-    return m_arrCounterData.GetSize();
-  }
-  FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
-    UpdateIndex();
-    return m_arrCounterData.ElementAt(index).GetCounterIncrement(iValue);
-  }
-  FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
-    UpdateIndex();
-    return m_arrCounterData.ElementAt(index).GetCounterReset(iValue);
-  }
-  const FX_WCHAR* GetCounterIdentifier(int32_t index) {
-    UpdateIndex();
-    return m_arrCounterData.ElementAt(index).m_pszIdent;
-  }
-
- protected:
-  void UpdateIndex();
-  void DoUpdateIndex(IFDE_CSSValueList* pList);
-  int32_t FindIndex(const FX_WCHAR* pszIdentifier);
-  IFDE_CSSValueList* m_pCounterInc;
-  IFDE_CSSValueList* m_pCounterReset;
-  CFX_ArrayTemplate<FDE_CSSCOUNTERDATA> m_arrCounterData;
-  FX_BOOL m_bIndexDirty;
-};
-class CFDE_CSSInheritedData {
- public:
-  void Reset() {
-    FXSYS_memset(this, 0, sizeof(CFDE_CSSInheritedData));
-    m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
-    m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
-    m_TextIndent.Set(FDE_CSSLENGTHUNIT_Point, 0);
-    m_fFontSize = 12.0f;
-    m_fLineHeight = 14.0f;
-    m_wFontWeight = 400;
-    m_dwFontColor = 0xFF000000;
-    m_iWidows = 2;
-    m_bTextEmphasisColorCurrent = TRUE;
-    m_iOrphans = 2;
-  }
-  const FX_WCHAR* m_pszListStyleImage;
-  FDE_CSSLENGTH m_LetterSpacing;
-  FDE_CSSLENGTH m_WordSpacing;
-  FDE_CSSLENGTH m_TextIndent;
-  IFDE_CSSValueList* m_pFontFamily;
-  IFDE_CSSValueList* m_pQuotes;
-  IFDE_CSSValueList* m_pCursorUris;
-  FDE_CSSCURSOR m_eCursor;
-  FX_FLOAT m_fFontSize;
-  FX_FLOAT m_fLineHeight;
-  FX_ARGB m_dwFontColor;
-  FX_ARGB m_dwTextEmphasisColor;
-  FX_WORD m_wFontWeight;
-  int32_t m_iWidows;
-  int32_t m_iOrphans;
-  const FX_WCHAR* m_pszTextEmphasisCustomMark;
-  FX_WORD m_eFontVariant : 1;
-  FX_WORD m_eFontStyle : 1;
-  FX_WORD m_bTextEmphasisColorCurrent : 1;
-  FX_WORD m_eTextAligh : 2;
-  FX_WORD m_eVisibility : 2;
-  FX_WORD m_eWhiteSpace : 3;
-  FX_WORD m_eTextTransform : 2;
-  FX_WORD m_eWritingMode : 2;
-  FX_WORD m_eWordBreak : 2;
-  FX_WORD m_eLineBreak : 2;
-  FX_WORD m_eTextEmphasisFill : 1;
-  FX_WORD m_eTextEmphasisMark : 3;
-  FX_WORD m_eCaptionSide : 3;
-
-  FX_WORD m_eRubyAlign : 4;
-  FX_WORD m_eRubyOverhang : 2;
-  FX_WORD m_eRubyPosition : 2;
-};
-class CFDE_CSSNonInheritedData {
- public:
-  void Reset() {
-    FXSYS_memset(this, 0, sizeof(CFDE_CSSNonInheritedData));
-    m_MarginWidth = m_BorderWidth =
-        m_PaddingWidth.Set(FDE_CSSLENGTHUNIT_Point, 0);
-    m_MinBoxSize.Set(FDE_CSSLENGTHUNIT_Point, 0);
-    m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None);
-    m_eDisplay = FDE_CSSDISPLAY_Inline;
-    m_fVerticalAlign = 0.0f;
-    m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);
-    m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal);
-    m_bColumnRuleColorSame = TRUE;
-    m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto);
-    m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto);
-    m_eTextCombine = FDE_CSSTEXTCOMBINE_None;
-  }
-
-  IFDE_CSSValueList* m_pContentList;
-  CFDE_CSSCounterStyle* m_pCounterStyle;
-  FDE_CSSRECT m_MarginWidth;
-  FDE_CSSRECT m_BorderWidth;
-  FDE_CSSRECT m_PaddingWidth;
-  FDE_CSSSIZE m_BoxSize;
-  FDE_CSSSIZE m_MinBoxSize;
-  FDE_CSSSIZE m_MaxBoxSize;
-  FDE_CSSPOINT m_BKGPosition;
-  const FX_WCHAR* m_pszBKGImage;
-  FX_ARGB m_dwBKGColor;
-  FX_ARGB m_dwBDRLeftColor;
-  FX_ARGB m_dwBDRTopColor;
-  FX_ARGB m_dwBDRRightColor;
-  FX_ARGB m_dwBDRBottomColor;
-  IFDE_CSSValue* m_pRubySpan;
-  FDE_CSSLENGTH m_ColumnCount;
-  FDE_CSSLENGTH m_ColumnGap;
-  FDE_CSSLENGTH m_ColumnRuleWidth;
-  FDE_CSSLENGTH m_ColumnWidth;
-  FX_ARGB m_dwColumnRuleColor;
-  FDE_CSSLENGTH m_Top;
-  FDE_CSSLENGTH m_Bottom;
-  FDE_CSSLENGTH m_Left;
-  FDE_CSSLENGTH m_Right;
-
-  FX_FLOAT m_fVerticalAlign;
-  FX_FLOAT m_fTextCombineNumber;
-  FX_DWORD m_eBDRLeftStyle : 4;
-  FX_DWORD m_eBDRTopStyle : 4;
-  FX_DWORD m_eBDRRightStyle : 4;
-  FX_DWORD m_eBDRBottomStyle : 4;
-  FX_DWORD m_eDisplay : 5;
-  FX_DWORD m_eVerticalAlign : 4;
-  FX_DWORD m_eListStyleType : 5;
-  FX_DWORD m_eColumnRuleStyle : 4;
-  FX_DWORD m_ePageBreakInside : 3;
-  FX_DWORD m_ePageBreakAfter : 3;
-  FX_DWORD m_ePageBreakBefore : 3;
-  FX_DWORD m_ePosition : 2;
-  FX_DWORD m_eBKGRepeat : 2;
-  FX_DWORD m_eFloat : 2;
-  FX_DWORD m_eClear : 2;
-  FX_DWORD m_eOverflowX : 3;
-  FX_DWORD m_eOverflowY : 3;
-  FX_DWORD m_eListStylePosition : 1;
-  FX_DWORD m_eBKGAttachment : 1;
-  FX_DWORD m_bHasMargin : 1;
-  FX_DWORD m_bHasBorder : 1;
-  FX_DWORD m_bHasPadding : 1;
-  FX_DWORD m_dwTextDecoration : 5;
-  FX_DWORD m_eTextCombine : 1;
-  FX_DWORD m_bColumnRuleColorSame : 1;
-  FX_DWORD m_bHasTextCombineNumber : 1;
-};
-class CFDE_CSSComputedStyle : public IFDE_CSSComputedStyle,
-                              public IFDE_CSSFontStyle,
-                              public IFDE_CSSBoundaryStyle,
-                              public IFDE_CSSPositionStyle,
-                              public IFDE_CSSParagraphStyle,
-                              public IFDE_CSSBackgroundStyle,
-                              public IFDE_CSSVisualStyle,
-                              public IFDE_CSSListStyle,
-                              public IFDE_CSSMultiColumnStyle,
-                              public IFDE_CSSGeneratedContentStyle,
-                              public IFDE_CSSTableStyle,
-                              public IFDE_CSSRubyStyle,
-                              public CFX_Target {
- public:
-  CFDE_CSSComputedStyle(IFX_MEMAllocator* pAlloc)
-      : m_dwRefCount(1), m_pAllocator(pAlloc) {}
-  ~CFDE_CSSComputedStyle() {}
-  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
-  virtual FX_DWORD Release() {
-    FX_DWORD dwRefCount = --m_dwRefCount;
-    if (dwRefCount == 0) {
-      if (m_NonInheritedData.m_pCounterStyle != NULL) {
-        delete m_NonInheritedData.m_pCounterStyle;
-      }
-      FXTARGET_DeleteWith(CFDE_CSSComputedStyle, m_pAllocator, this);
-    }
-    return dwRefCount;
-  }
-
-  virtual void Reset() {
-    m_InheritedData.Reset();
-    m_NonInheritedData.Reset();
-  }
-  virtual IFDE_CSSFontStyle* GetFontStyles() const {
-    return (IFDE_CSSFontStyle * const) this;
-  }
-  virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const {
-    return (IFDE_CSSBoundaryStyle * const) this;
-  }
-  virtual IFDE_CSSPositionStyle* GetPositionStyles() const {
-    return (IFDE_CSSPositionStyle * const) this;
-  }
-  virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const {
-    return (IFDE_CSSParagraphStyle * const) this;
-  }
-  virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const {
-    return (IFDE_CSSBackgroundStyle * const) this;
-  }
-  virtual IFDE_CSSVisualStyle* GetVisualStyles() const {
-    return (IFDE_CSSVisualStyle * const) this;
-  }
-  virtual IFDE_CSSListStyle* GetListStyles() const {
-    return (IFDE_CSSListStyle * const) this;
-  }
-  virtual IFDE_CSSTableStyle* GetTableStyle() const {
-    return (IFDE_CSSTableStyle * const) this;
-  }
-  virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const {
-    return (IFDE_CSSMultiColumnStyle * const) this;
-  }
-  virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const {
-    return (IFDE_CSSGeneratedContentStyle * const) this;
-  }
-  virtual IFDE_CSSRubyStyle* GetRubyStyle() const {
-    return (IFDE_CSSRubyStyle * const) this;
-  }
-  virtual FX_BOOL GetCustomStyle(const CFX_WideStringC& wsName,
-                                 CFX_WideString& wsValue) const {
-    for (int32_t i = m_CustomProperties.GetSize() - 2; i > -1; i -= 2) {
-      if (wsName == m_CustomProperties[i]) {
-        wsValue = m_CustomProperties[i + 1];
-        return TRUE;
-      }
-    }
-    return FALSE;
-  }
-  virtual FDE_CSSRUBYALIGN GetRubyAlign() const {
-    return (FDE_CSSRUBYALIGN)m_InheritedData.m_eRubyAlign;
-  }
-  virtual FDE_CSSRUBYPOSITION GetRubyPosition() const {
-    return (FDE_CSSRUBYPOSITION)m_InheritedData.m_eRubyPosition;
-  }
-  virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const {
-    return (FDE_CSSRUBYOVERHANG)m_InheritedData.m_eRubyOverhang;
-  }
-  virtual FDE_CSSRUBYSPAN GetRubySpanType() const {
-    return m_NonInheritedData.m_pRubySpan == NULL ? FDE_CSSRUBYSPAN_None
-                                                  : FDE_CSSRUBYSPAN_Attr;
-  }
-  virtual IFDE_CSSValue* GetRubySpanAttr() const {
-    return m_NonInheritedData.m_pRubySpan;
-  }
-  virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const {
-    return (FDE_CSSCAPTIONSIDE)m_InheritedData.m_eCaptionSide;
-  }
-  virtual int32_t CountCounters() {
-    return (m_NonInheritedData.m_pCounterStyle == NULL)
-               ? 0
-               : m_NonInheritedData.m_pCounterStyle->CountCounters();
-  }
-  virtual const FX_WCHAR* GetCounterIdentifier(int32_t index) {
-    return m_NonInheritedData.m_pCounterStyle->GetCounterIdentifier(index);
-  }
-  virtual FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
-    return m_NonInheritedData.m_pCounterStyle->GetCounterReset(index, iValue);
-  }
-  virtual FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
-    return m_NonInheritedData.m_pCounterStyle->GetCounterIncrement(index,
-                                                                   iValue);
-  }
-  virtual IFDE_CSSValueList* GetContent() const {
-    return m_NonInheritedData.m_pContentList;
-  }
-  virtual int32_t CountQuotes() const {
-    return m_InheritedData.m_pQuotes == NULL
-               ? 0
-               : m_InheritedData.m_pQuotes->CountValues();
-  }
-  virtual const FX_WCHAR* GetQuotes(int32_t index) const {
-    FXSYS_assert(m_InheritedData.m_pQuotes != NULL &&
-                 m_InheritedData.m_pQuotes->CountValues() > index);
-    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pQuotes->GetValue(
-                index)))
-        ->GetString(index);
-  }
-  virtual const FDE_CSSLENGTH& GetColumnCount() const {
-    return m_NonInheritedData.m_ColumnCount;
-  }
-  virtual const FDE_CSSLENGTH& GetColumnGap() const {
-    return m_NonInheritedData.m_ColumnGap;
-  }
-  virtual FX_ARGB GetColumnRuleColor() const {
-    return m_NonInheritedData.m_bColumnRuleColorSame
-               ? m_InheritedData.m_dwFontColor
-               : m_NonInheritedData.m_dwColumnRuleColor;
-  }
-  virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const {
-    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eColumnRuleStyle;
-  }
-  virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const {
-    return m_NonInheritedData.m_ColumnRuleWidth;
-  }
-  virtual const FDE_CSSLENGTH& GetColumnWidth() const {
-    return m_NonInheritedData.m_ColumnWidth;
-  }
-  virtual void SetColumnCount(const FDE_CSSLENGTH& columnCount) {
-    m_NonInheritedData.m_ColumnCount = columnCount;
-  }
-  virtual void SetColumnGap(const FDE_CSSLENGTH& columnGap) {
-    m_NonInheritedData.m_ColumnGap = columnGap;
-  }
-  virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) {
-    m_NonInheritedData.m_dwColumnRuleColor = dwColumnRuleColor,
-    m_NonInheritedData.m_bColumnRuleColorSame = FALSE;
-  }
-  virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) {
-    m_NonInheritedData.m_eColumnRuleStyle = eColumnRuleStyle;
-  }
-  virtual void SetColumnRuleWidth(const FDE_CSSLENGTH& columnRuleWidth) {
-    m_NonInheritedData.m_ColumnRuleWidth = columnRuleWidth;
-  }
-  virtual void SetColumnWidth(const FDE_CSSLENGTH& columnWidth) {
-    m_NonInheritedData.m_ColumnWidth = columnWidth;
-  }
-  virtual int32_t CountFontFamilies() const {
-    return m_InheritedData.m_pFontFamily
-               ? m_InheritedData.m_pFontFamily->CountValues()
-               : 0;
-  }
-  virtual const FX_WCHAR* GetFontFamily(int32_t index) const {
-    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pFontFamily->GetValue(
-                index)))
-        ->GetString(index);
-  }
-  virtual FX_WORD GetFontWeight() const {
-    return m_InheritedData.m_wFontWeight;
-  }
-  virtual FDE_CSSFONTVARIANT GetFontVariant() const {
-    return (FDE_CSSFONTVARIANT)m_InheritedData.m_eFontVariant;
-  }
-  virtual FDE_CSSFONTSTYLE GetFontStyle() const {
-    return (FDE_CSSFONTSTYLE)m_InheritedData.m_eFontStyle;
-  }
-  virtual FX_FLOAT GetFontSize() const { return m_InheritedData.m_fFontSize; }
-  virtual FX_ARGB GetColor() const { return m_InheritedData.m_dwFontColor; }
-  virtual void SetFontWeight(FX_WORD wFontWeight) {
-    m_InheritedData.m_wFontWeight = wFontWeight;
-  }
-  virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) {
-    m_InheritedData.m_eFontVariant = eFontVariant;
-  }
-  virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) {
-    m_InheritedData.m_eFontStyle = eFontStyle;
-  }
-  virtual void SetFontSize(FX_FLOAT fFontSize) {
-    m_InheritedData.m_fFontSize = fFontSize;
-  }
-  virtual void SetColor(FX_ARGB dwFontColor) {
-    m_InheritedData.m_dwFontColor = dwFontColor;
-  }
-  virtual FX_ARGB GetBorderLeftColor() const {
-    return m_NonInheritedData.m_dwBDRLeftColor;
-  }
-  virtual FX_ARGB GetBorderTopColor() const {
-    return m_NonInheritedData.m_dwBDRTopColor;
-  }
-  virtual FX_ARGB GetBorderRightColor() const {
-    return m_NonInheritedData.m_dwBDRRightColor;
-  }
-  virtual FX_ARGB GetBorderBottomColor() const {
-    return m_NonInheritedData.m_dwBDRBottomColor;
-  }
-
-  virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const {
-    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRLeftStyle;
-  }
-  virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const {
-    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRTopStyle;
-  }
-  virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const {
-    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRRightStyle;
-  }
-  virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const {
-    return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRBottomStyle;
-  }
-
-  virtual const FDE_CSSRECT* GetBorderWidth() const {
-    return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth)
-                                           : NULL;
-  }
-  virtual const FDE_CSSRECT* GetMarginWidth() const {
-    return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth)
-                                           : NULL;
-  }
-  virtual const FDE_CSSRECT* GetPaddingWidth() const {
-    return m_NonInheritedData.m_bHasPadding
-               ? &(m_NonInheritedData.m_PaddingWidth)
-               : NULL;
-  }
-  virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) {
-    m_NonInheritedData.m_dwBDRLeftColor = dwBorderColor;
-  }
-  virtual void SetBorderTopColor(FX_ARGB dwBorderColor) {
-    m_NonInheritedData.m_dwBDRTopColor = dwBorderColor;
-  }
-  virtual void SetBorderRightColor(FX_ARGB dwBorderColor) {
-    m_NonInheritedData.m_dwBDRRightColor = dwBorderColor;
-  }
-  virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) {
-    m_NonInheritedData.m_dwBDRBottomColor = dwBorderColor;
-  }
-
-  virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
-    m_NonInheritedData.m_eBDRLeftStyle = eBorderStyle;
-  }
-  virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
-    m_NonInheritedData.m_eBDRTopStyle = eBorderStyle;
-  }
-  virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
-    m_NonInheritedData.m_eBDRRightStyle = eBorderStyle;
-  }
-  virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
-    m_NonInheritedData.m_eBDRBottomStyle = eBorderStyle;
-  }
-
-  virtual void SetBorderWidth(const FDE_CSSRECT& rect) {
-    m_NonInheritedData.m_BorderWidth = rect;
-    m_NonInheritedData.m_bHasBorder = TRUE;
-  }
-  virtual void SetMarginWidth(const FDE_CSSRECT& rect) {
-    m_NonInheritedData.m_MarginWidth = rect;
-    m_NonInheritedData.m_bHasMargin = TRUE;
-  }
-  virtual void SetPaddingWidth(const FDE_CSSRECT& rect) {
-    m_NonInheritedData.m_PaddingWidth = rect;
-    m_NonInheritedData.m_bHasPadding = TRUE;
-  }
-  virtual FDE_CSSDISPLAY GetDisplay() const {
-    return (FDE_CSSDISPLAY)m_NonInheritedData.m_eDisplay;
-  }
-  virtual const FDE_CSSSIZE& GetBoxSize() const {
-    return m_NonInheritedData.m_BoxSize;
-  }
-  virtual const FDE_CSSSIZE& GetMinBoxSize() const {
-    return m_NonInheritedData.m_MinBoxSize;
-  }
-  virtual const FDE_CSSSIZE& GetMaxBoxSize() const {
-    return m_NonInheritedData.m_MaxBoxSize;
-  }
-  virtual FDE_CSSFLOAT GetFloat() const {
-    return (FDE_CSSFLOAT)m_NonInheritedData.m_eFloat;
-  }
-  virtual FDE_CSSCLEAR GetClear() const {
-    return (FDE_CSSCLEAR)m_NonInheritedData.m_eClear;
-  }
-  virtual FDE_CSSPOSITION GetPosition() const {
-    return (FDE_CSSPOSITION)m_NonInheritedData.m_ePosition;
-  }
-  virtual FDE_CSSLENGTH GetTop() const { return m_NonInheritedData.m_Top; }
-  virtual FDE_CSSLENGTH GetBottom() const {
-    return m_NonInheritedData.m_Bottom;
-  }
-  virtual FDE_CSSLENGTH GetLeft() const { return m_NonInheritedData.m_Left; }
-  virtual FDE_CSSLENGTH GetRight() const { return m_NonInheritedData.m_Right; }
-
-  virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) {
-    m_NonInheritedData.m_eDisplay = eDisplay;
-  }
-  virtual void SetBoxSize(const FDE_CSSSIZE& size) {
-    m_NonInheritedData.m_BoxSize = size;
-  }
-  virtual void SetMinBoxSize(const FDE_CSSSIZE& size) {
-    m_NonInheritedData.m_MinBoxSize = size;
-  }
-  virtual void SetMaxBoxSize(const FDE_CSSSIZE& size) {
-    m_NonInheritedData.m_MaxBoxSize = size;
-  }
-  virtual void SetFloat(FDE_CSSFLOAT eFloat) {
-    m_NonInheritedData.m_eFloat = eFloat;
-  }
-  virtual void SetClear(FDE_CSSCLEAR eClear) {
-    m_NonInheritedData.m_eClear = eClear;
-  }
-  virtual FX_FLOAT GetLineHeight() const {
-    return m_InheritedData.m_fLineHeight;
-  }
-  virtual FDE_CSSWHITESPACE GetWhiteSpace() const {
-    return (FDE_CSSWHITESPACE)m_InheritedData.m_eWhiteSpace;
-  }
-  virtual const FDE_CSSLENGTH& GetTextIndent() const {
-    return m_InheritedData.m_TextIndent;
-  }
-  virtual FDE_CSSTEXTALIGN GetTextAlign() const {
-    return (FDE_CSSTEXTALIGN)m_InheritedData.m_eTextAligh;
-  }
-  virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const {
-    return (FDE_CSSVERTICALALIGN)m_NonInheritedData.m_eVerticalAlign;
-  }
-  virtual FX_FLOAT GetNumberVerticalAlign() const {
-    return m_NonInheritedData.m_fVerticalAlign;
-  }
-  virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const {
-    return (FDE_CSSTEXTTRANSFORM)m_InheritedData.m_eTextTransform;
-  }
-  virtual FX_DWORD GetTextDecoration() const {
-    return m_NonInheritedData.m_dwTextDecoration;
-  }
-  virtual const FDE_CSSLENGTH& GetLetterSpacing() const {
-    return m_InheritedData.m_LetterSpacing;
-  }
-  virtual const FDE_CSSLENGTH& GetWordSpacing() const {
-    return m_InheritedData.m_WordSpacing;
-  }
-  virtual FDE_CSSWRITINGMODE GetWritingMode() const {
-    return (FDE_CSSWRITINGMODE)m_InheritedData.m_eWritingMode;
-  }
-  virtual FDE_CSSWORDBREAK GetWordBreak() const {
-    return (FDE_CSSWORDBREAK)m_InheritedData.m_eWordBreak;
-  }
-  virtual int32_t GetWidows() const { return m_InheritedData.m_iWidows; }
-  virtual FX_ARGB GetTextEmphasisColor() const {
-    return m_InheritedData.m_bTextEmphasisColorCurrent
-               ? m_InheritedData.m_dwFontColor
-               : m_InheritedData.m_dwTextEmphasisColor;
-  }
-  virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const {
-    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakBefore;
-  }
-  virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const {
-    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakAfter;
-  }
-  virtual FDE_CSSPAGEBREAK GetPageBreakInside() const {
-    return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakInside;
-  }
-  virtual int32_t GetOrphans() const { return m_InheritedData.m_iOrphans; }
-  virtual FDE_CSSLINEBREAK GetLineBreak() const {
-    return (FDE_CSSLINEBREAK)m_InheritedData.m_eLineBreak;
-  }
-  virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const;
-  virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const {
-    return (FDE_CSSTEXTEMPHASISFILL)m_InheritedData.m_eTextEmphasisFill;
-  }
-  virtual const FX_WCHAR* GetTextEmphasisCustom() const {
-    FXSYS_assert(m_InheritedData.m_eTextEmphasisMark ==
-                 FDE_CSSTEXTEMPHASISMARK_Custom);
-    return m_InheritedData.m_pszTextEmphasisCustomMark;
-  }
-  virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const {
-    return (FDE_CSSTEXTCOMBINE)m_NonInheritedData.m_eTextCombine;
-  }
-  virtual FX_BOOL HasTextCombineNumber() const {
-    return m_NonInheritedData.m_bHasTextCombineNumber;
-  }
-  virtual FX_FLOAT GetTextCombineNumber() const {
-    FXSYS_assert(m_NonInheritedData.m_eTextCombine ==
-                 FDE_CSSTEXTCOMBINE_Horizontal);
-    return m_NonInheritedData.m_fTextCombineNumber;
-  }
-  virtual void SetLineHeight(FX_FLOAT fLineHeight) {
-    m_InheritedData.m_fLineHeight = fLineHeight;
-  }
-  virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) {
-    m_InheritedData.m_eWhiteSpace = eWhiteSpace;
-  }
-  virtual void SetTextIndent(const FDE_CSSLENGTH& textIndent) {
-    m_InheritedData.m_TextIndent = textIndent;
-  }
-  virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) {
-    m_InheritedData.m_eTextAligh = eTextAlign;
-  }
-  virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) {
-    m_NonInheritedData.m_eVerticalAlign = eVerticalAlign;
-  }
-  virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) {
-    m_NonInheritedData.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number,
-    m_NonInheritedData.m_fVerticalAlign = fAlign;
-  }
-  virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) {
-    m_InheritedData.m_eTextTransform = eTextTransform;
-  }
-  virtual void SetTextDecoration(FX_DWORD dwTextDecoration) {
-    m_NonInheritedData.m_dwTextDecoration = dwTextDecoration;
-  }
-  virtual void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) {
-    m_InheritedData.m_LetterSpacing = letterSpacing;
-  }
-  virtual void SetWordSpacing(const FDE_CSSLENGTH& wordSpacing) {
-    m_InheritedData.m_WordSpacing = wordSpacing;
-  }
-  virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) {
-    m_InheritedData.m_eWritingMode = eWritingMode;
-  }
-  virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) {
-    m_InheritedData.m_eWordBreak = eWordBreak;
-  }
-  virtual void SetWidows(int32_t iWidows) {
-    m_InheritedData.m_iWidows = iWidows;
-  }
-  virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) {
-    m_InheritedData.m_dwTextEmphasisColor = dwTextEmphasisColor,
-    m_InheritedData.m_bTextEmphasisColorCurrent = FALSE;
-  }
-  virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) {
-    m_NonInheritedData.m_ePageBreakBefore = ePageBreakBefore;
-  }
-  virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) {
-    m_NonInheritedData.m_ePageBreakAfter = ePageBreakAfter;
-  }
-  virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) {
-    m_NonInheritedData.m_ePageBreakInside = ePageBreakInside;
-  }
-  virtual void SetOrphans(int32_t iOrphans) {
-    m_InheritedData.m_iOrphans = iOrphans;
-  }
-  virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) {
-    m_InheritedData.m_eLineBreak = eLineBreak;
-  }
-  virtual FX_ARGB GetBKGColor() const {
-    return m_NonInheritedData.m_dwBKGColor;
-  }
-  virtual const FX_WCHAR* GetBKGImage() const {
-    return m_NonInheritedData.m_pszBKGImage;
-  }
-  virtual const FDE_CSSPOINT& GetBKGPosition() const {
-    return m_NonInheritedData.m_BKGPosition;
-  }
-  virtual FDE_CSSBKGREPEAT GetBKGRepeat() const {
-    return (FDE_CSSBKGREPEAT)m_NonInheritedData.m_eBKGRepeat;
-  }
-  virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const {
-    return (FDE_CSSBKGATTACHMENT)m_NonInheritedData.m_eBKGAttachment;
-  }
-  virtual void SetBKGColor(FX_ARGB dwBKGColor) {
-    m_NonInheritedData.m_dwBKGColor = dwBKGColor;
-  }
-  virtual void SetBKGPosition(const FDE_CSSPOINT& bkgPosition) {
-    m_NonInheritedData.m_BKGPosition = bkgPosition;
-  }
-  virtual FDE_CSSVISIBILITY GetVisibility() const {
-    return (FDE_CSSVISIBILITY)m_InheritedData.m_eVisibility;
-  }
-  virtual FDE_CSSOVERFLOW GetOverflowX() const {
-    return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowX;
-  }
-  virtual FDE_CSSOVERFLOW GetOverflowY() const {
-    return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowY;
-  }
-  virtual int32_t CountCursorUrls() const {
-    return m_InheritedData.m_pCursorUris == NULL
-               ? 0
-               : m_InheritedData.m_pCursorUris->CountValues();
-  }
-  virtual const FX_WCHAR* GetCursorUrl(int32_t index) const {
-    FXSYS_assert(m_InheritedData.m_pCursorUris != NULL);
-    return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pCursorUris->GetValue(
-                index)))
-        ->GetString(index);
-  }
-  virtual FDE_CSSCURSOR GetCursorType() const {
-    return m_InheritedData.m_eCursor;
-  }
-  virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) {
-    m_InheritedData.m_eVisibility = eVisibility;
-  }
-  virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const {
-    return (FDE_CSSLISTSTYLETYPE)m_NonInheritedData.m_eListStyleType;
-  }
-  virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const {
-    return (FDE_CSSLISTSTYLEPOSITION)m_NonInheritedData.m_eListStylePosition;
-  }
-  virtual const FX_WCHAR* GetListStyleImage() const {
-    return m_InheritedData.m_pszListStyleImage;
-  }
-  virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) {
-    m_NonInheritedData.m_eListStyleType = eListStyleType;
-  }
-  virtual void SetListStylePosition(
-      FDE_CSSLISTSTYLEPOSITION eListStylePosition) {
-    m_NonInheritedData.m_eListStylePosition = eListStylePosition;
-  }
-  void AddCustomStyle(const CFX_WideString& wsName,
-                      const CFX_WideString& wsValue) {
-    m_CustomProperties.Add(wsName);
-    m_CustomProperties.Add(wsValue);
-  }
-  FX_DWORD m_dwRefCount;
-  IFX_MEMAllocator* m_pAllocator;
-  CFDE_CSSInheritedData m_InheritedData;
-  CFDE_CSSNonInheritedData m_NonInheritedData;
-  CFX_WideStringArray m_CustomProperties;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
diff --git a/xfa/src/fde/css/fde_cssstylesheet.cpp b/xfa/src/fde/css/fde_cssstylesheet.cpp
deleted file mode 100644
index 9b18dd2..0000000
--- a/xfa/src/fde/css/fde_cssstylesheet.cpp
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_cssstylesheet.h"
-
-#include "xfa/src/fde/css/fde_cssdatatable.h"
-#include "xfa/src/fde/css/fde_csssyntax.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-
-IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadHTMLStandardStyleSheet() {
-  static const FX_WCHAR* s_pStyle =
-      L"html,address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,frameset,"
-      L"h1,h2,h3,h4,h5,h6,noframes,ol,p,ul,center,dir,hr,menu,pre{display:"
-      L"block}"
-      L"li{display:list-item}head{display:none}table{display:table}tr{display:"
-      L"table-row}thead{display:table-header-group}tbody{display:table-row-"
-      L"group}tfoot{display:table-footer-group}"
-      L"col{display:table-column}colgroup{display:table-column-group}td,th{"
-      L"display:table-cell}caption{display:table-caption}th{font-weight:bolder;"
-      L"text-align:center}caption{text-align:center}"
-      L"body{margin:0}h1{font-size:2em;margin:.67em "
-      L"0}h2{font-size:1.5em;margin:.75em 0}h3{font-size:1.17em;margin:.83em "
-      L"0}h4,p,blockquote,ul,fieldset,form,ol,dl,dir,menu{margin:1.12em 0}"
-      L"h5{font-size:.83em;margin:1.5em 0}h6{font-size:.75em;margin:1.67em "
-      L"0}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bolder}blockquote{margin-left:"
-      L"40px;margin-right:40px}i,cite,em,var,address{font-style:italic}"
-      L"pre,tt,code,kbd,samp{font-family:monospace}pre{white-space:pre}button,"
-      L"textarea,input,select{display:inline-block}big{font-size:1.17em}small,"
-      L"sub,sup{font-size:.83em}sub{vertical-align:sub}"
-      L"sup{vertical-align:super}table{border-spacing:2px}thead,tbody,tfoot{"
-      L"vertical-align:middle}td,th,tr{vertical-align:inherit}s,strike,del{"
-      L"text-decoration:line-through}hr{border:1px inset silver}"
-      L"ol,ul,dir,menu,dd{margin-left:40px}ol{list-style-type:decimal}ol ul,ul "
-      L"ol,ul ul,ol "
-      L"ol{margin-top:0;margin-bottom:0}u,ins{text-decoration:underline}center{"
-      L"text-align:center}"
-      L"ruby{display:ruby}rt{display:ruby-text;font-size:.5em}rb{display:ruby-"
-      L"base}rbc{display:ruby-base-group}rtc{display:ruby-text-group}"
-      L"q:before{content:open-quote}q:after{content:close-quote}"
-      L"rp{display:none}";
-  return IFDE_CSSStyleSheet::LoadFromBuffer(
-      CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8);
-}
-
-IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromStream(
-    const CFX_WideString& szUrl,
-    IFX_Stream* pStream,
-    FX_WORD wCodePage,
-    FX_DWORD dwMediaList) {
-  CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList);
-  if (!pStyleSheet->LoadFromStream(szUrl, pStream, wCodePage)) {
-    pStyleSheet->Release();
-    pStyleSheet = NULL;
-  }
-  return pStyleSheet;
-}
-IFDE_CSSStyleSheet* IFDE_CSSStyleSheet::LoadFromBuffer(
-    const CFX_WideString& szUrl,
-    const FX_WCHAR* pBuffer,
-    int32_t iBufSize,
-    FX_WORD wCodePage,
-    FX_DWORD dwMediaList) {
-  CFDE_CSSStyleSheet* pStyleSheet = new CFDE_CSSStyleSheet(dwMediaList);
-  if (!pStyleSheet->LoadFromBuffer(szUrl, pBuffer, iBufSize, wCodePage)) {
-    pStyleSheet->Release();
-    pStyleSheet = NULL;
-  }
-  return pStyleSheet;
-}
-CFDE_CSSStyleSheet::CFDE_CSSStyleSheet(FX_DWORD dwMediaList)
-    : m_wCodePage(FX_CODEPAGE_UTF8),
-      m_wRefCount(1),
-      m_dwMediaList(dwMediaList),
-      m_pAllocator(NULL) {
-  FXSYS_assert(m_dwMediaList > 0);
-}
-CFDE_CSSStyleSheet::~CFDE_CSSStyleSheet() {
-  Reset();
-}
-void CFDE_CSSStyleSheet::Reset() {
-  for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) {
-    IFDE_CSSRule* pRule = m_RuleArray.GetAt(i);
-    switch (pRule->GetType()) {
-      case FDE_CSSRULETYPE_Style:
-        ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule();
-        break;
-      case FDE_CSSRULETYPE_Media:
-        ((CFDE_CSSMediaRule*)pRule)->~CFDE_CSSMediaRule();
-        break;
-      case FDE_CSSRULETYPE_FontFace:
-        ((CFDE_CSSFontFaceRule*)pRule)->~CFDE_CSSFontFaceRule();
-        break;
-      default:
-        FXSYS_assert(FALSE);
-        break;
-    }
-  }
-  m_RuleArray.RemoveAll();
-  m_Selectors.RemoveAll();
-  m_StringCache.RemoveAll();
-  if (m_pAllocator) {
-    m_pAllocator->Release();
-    m_pAllocator = NULL;
-  }
-}
-FX_DWORD CFDE_CSSStyleSheet::AddRef() {
-  return ++m_wRefCount;
-}
-FX_DWORD CFDE_CSSStyleSheet::Release() {
-  FX_DWORD dwRefCount = --m_wRefCount;
-  if (dwRefCount == 0) {
-    delete this;
-  }
-  return dwRefCount;
-}
-int32_t CFDE_CSSStyleSheet::CountRules() const {
-  return m_RuleArray.GetSize();
-}
-IFDE_CSSRule* CFDE_CSSStyleSheet::GetRule(int32_t index) {
-  return m_RuleArray.GetAt(index);
-}
-FX_BOOL CFDE_CSSStyleSheet::LoadFromStream(const CFX_WideString& szUrl,
-                                           IFX_Stream* pStream,
-                                           FX_WORD wCodePage) {
-  FXSYS_assert(pStream != NULL);
-  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
-  if (pSyntax == NULL) {
-    return FALSE;
-  }
-  if (pStream->GetCodePage() != wCodePage) {
-    pStream->SetCodePage(wCodePage);
-  }
-  FX_BOOL bRet = pSyntax->Init(pStream, 4096) && LoadFromSyntax(pSyntax);
-  pSyntax->Release();
-  m_wCodePage = wCodePage;
-  m_szUrl = szUrl;
-  return bRet;
-}
-FX_BOOL CFDE_CSSStyleSheet::LoadFromBuffer(const CFX_WideString& szUrl,
-                                           const FX_WCHAR* pBuffer,
-                                           int32_t iBufSize,
-                                           FX_WORD wCodePage) {
-  FXSYS_assert(pBuffer != NULL && iBufSize > 0);
-  IFDE_CSSSyntaxParser* pSyntax = IFDE_CSSSyntaxParser::Create();
-  if (pSyntax == NULL) {
-    return FALSE;
-  }
-  FX_BOOL bRet = pSyntax->Init(pBuffer, iBufSize) && LoadFromSyntax(pSyntax);
-  pSyntax->Release();
-  m_wCodePage = wCodePage;
-  m_szUrl = szUrl;
-  return bRet;
-}
-FX_BOOL CFDE_CSSStyleSheet::LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax) {
-  Reset();
-  m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0);
-  if (m_pAllocator == NULL) {
-    return FALSE;
-  }
-  FDE_CSSSYNTAXSTATUS eStatus;
-  do {
-    switch (eStatus = pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_StyleRule:
-        eStatus = LoadStyleRule(pSyntax, m_RuleArray);
-        break;
-      case FDE_CSSSYNTAXSTATUS_MediaRule:
-        eStatus = LoadMediaRule(pSyntax);
-        break;
-      case FDE_CSSSYNTAXSTATUS_FontFaceRule:
-        eStatus = LoadFontFaceRule(pSyntax, m_RuleArray);
-        break;
-      case FDE_CSSSYNTAXSTATUS_ImportRule:
-        eStatus = LoadImportRule(pSyntax);
-        break;
-      case FDE_CSSSYNTAXSTATUS_PageRule:
-        eStatus = LoadPageRule(pSyntax);
-        break;
-      default:
-        break;
-    }
-  } while (eStatus >= FDE_CSSSYNTAXSTATUS_None);
-  m_Selectors.RemoveAll();
-  m_StringCache.RemoveAll();
-  return eStatus != FDE_CSSSYNTAXSTATUS_Error;
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadMediaRule(
-    IFDE_CSSSyntaxParser* pSyntax) {
-  FX_DWORD dwMediaList = 0;
-  CFDE_CSSMediaRule* pMediaRule = NULL;
-  for (;;) {
-    switch (pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_MediaType: {
-        int32_t iLen;
-        const FX_WCHAR* psz = pSyntax->GetCurrentString(iLen);
-        FDE_LPCCSSMEDIATYPETABLE pMediaType =
-            FDE_GetCSSMediaTypeByName(psz, iLen);
-        if (pMediaType != NULL) {
-          dwMediaList |= pMediaType->wValue;
-        }
-      } break;
-      case FDE_CSSSYNTAXSTATUS_StyleRule:
-        if (pMediaRule == NULL) {
-          SkipRuleSet(pSyntax);
-        } else {
-          FDE_CSSSYNTAXSTATUS eStatus =
-              LoadStyleRule(pSyntax, pMediaRule->GetArray());
-          if (eStatus < FDE_CSSSYNTAXSTATUS_None) {
-            return eStatus;
-          }
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclOpen:
-        if ((dwMediaList & m_dwMediaList) > 0 && pMediaRule == NULL) {
-          pMediaRule =
-              FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList);
-          m_RuleArray.Add(pMediaRule);
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclClose:
-        return FDE_CSSSYNTAXSTATUS_None;
-        FDE_CSSSWITCHDEFAULTS();
-    }
-  }
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadStyleRule(
-    IFDE_CSSSyntaxParser* pSyntax,
-    CFDE_CSSRuleArray& ruleArray) {
-  m_Selectors.RemoveAt(0, m_Selectors.GetSize());
-  CFDE_CSSStyleRule* pStyleRule = NULL;
-  const FX_WCHAR* pszValue = NULL;
-  int32_t iValueLen = 0;
-  FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
-  propertyArgs.pStringCache = &m_StringCache;
-  propertyArgs.pProperty = NULL;
-  CFX_WideString wsName;
-  for (;;) {
-    switch (pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_Selector: {
-        pszValue = pSyntax->GetCurrentString(iValueLen);
-        IFDE_CSSSelector* pSelector =
-            CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen);
-        if (pSelector != NULL) {
-          m_Selectors.Add(pSelector);
-        }
-      } break;
-      case FDE_CSSSYNTAXSTATUS_PropertyName:
-        pszValue = pSyntax->GetCurrentString(iValueLen);
-        propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen);
-        if (propertyArgs.pProperty == NULL) {
-          wsName = CFX_WideStringC(pszValue, iValueLen);
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_PropertyValue:
-        if (propertyArgs.pProperty != NULL) {
-          pszValue = pSyntax->GetCurrentString(iValueLen);
-          if (iValueLen > 0) {
-            pStyleRule->GetDeclImp().AddProperty(&propertyArgs, pszValue,
-                                                 iValueLen);
-          }
-        } else if (iValueLen > 0) {
-          pszValue = pSyntax->GetCurrentString(iValueLen);
-          if (iValueLen > 0) {
-            pStyleRule->GetDeclImp().AddProperty(
-                &propertyArgs, wsName, wsName.GetLength(), pszValue, iValueLen);
-          }
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclOpen:
-        if (pStyleRule == NULL && m_Selectors.GetSize() > 0) {
-          pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule;
-          pStyleRule->SetSelector(m_pAllocator, m_Selectors);
-          ruleArray.Add(pStyleRule);
-        } else {
-          SkipRuleSet(pSyntax);
-          return FDE_CSSSYNTAXSTATUS_None;
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclClose:
-        if (pStyleRule != NULL &&
-            pStyleRule->GetDeclImp().GetStartPosition() == NULL) {
-          pStyleRule->~CFDE_CSSStyleRule();
-          ruleArray.RemoveLast(1);
-        }
-        return FDE_CSSSYNTAXSTATUS_None;
-        FDE_CSSSWITCHDEFAULTS();
-    }
-  }
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadFontFaceRule(
-    IFDE_CSSSyntaxParser* pSyntax,
-    CFDE_CSSRuleArray& ruleArray) {
-  CFDE_CSSFontFaceRule* pFontFaceRule = NULL;
-  const FX_WCHAR* pszValue = NULL;
-  int32_t iValueLen = 0;
-  FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
-  propertyArgs.pStringCache = &m_StringCache;
-  propertyArgs.pProperty = NULL;
-  for (;;) {
-    switch (pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_PropertyName:
-        pszValue = pSyntax->GetCurrentString(iValueLen);
-        propertyArgs.pProperty = FDE_GetCSSPropertyByName(pszValue, iValueLen);
-        break;
-      case FDE_CSSSYNTAXSTATUS_PropertyValue:
-        if (propertyArgs.pProperty != NULL) {
-          pszValue = pSyntax->GetCurrentString(iValueLen);
-          if (iValueLen > 0) {
-            pFontFaceRule->GetDeclImp().AddProperty(&propertyArgs, pszValue,
-                                                    iValueLen);
-          }
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclOpen:
-        if (pFontFaceRule == NULL) {
-          pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule;
-          ruleArray.Add(pFontFaceRule);
-        }
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclClose:
-        return FDE_CSSSYNTAXSTATUS_None;
-        FDE_CSSSWITCHDEFAULTS();
-    }
-  }
-  return FDE_CSSSYNTAXSTATUS_None;
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadImportRule(
-    IFDE_CSSSyntaxParser* pSyntax) {
-  for (;;) {
-    switch (pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_ImportClose:
-        return FDE_CSSSYNTAXSTATUS_None;
-      case FDE_CSSSYNTAXSTATUS_URI:
-        break;
-        FDE_CSSSWITCHDEFAULTS();
-    }
-  }
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::LoadPageRule(
-    IFDE_CSSSyntaxParser* pSyntax) {
-  return SkipRuleSet(pSyntax);
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSStyleSheet::SkipRuleSet(
-    IFDE_CSSSyntaxParser* pSyntax) {
-  for (;;) {
-    switch (pSyntax->DoSyntaxParse()) {
-      case FDE_CSSSYNTAXSTATUS_Selector:
-      case FDE_CSSSYNTAXSTATUS_DeclOpen:
-      case FDE_CSSSYNTAXSTATUS_PropertyName:
-      case FDE_CSSSYNTAXSTATUS_PropertyValue:
-        break;
-      case FDE_CSSSYNTAXSTATUS_DeclClose:
-        return FDE_CSSSYNTAXSTATUS_None;
-        FDE_CSSSWITCHDEFAULTS();
-    }
-  }
-  return FDE_CSSSYNTAXSTATUS_None;
-}
-void CFDE_CSSStyleRule::SetSelector(IFX_MEMAllocator* pStaticStore,
-                                    const CFDE_CSSSelectorArray& list) {
-  FXSYS_assert(m_ppSelector == NULL);
-  m_iSelectors = list.GetSize();
-  m_ppSelector = (IFDE_CSSSelector**)pStaticStore->Alloc(
-      m_iSelectors * sizeof(IFDE_CSSSelector*));
-  for (int32_t i = 0; i < m_iSelectors; ++i) {
-    m_ppSelector[i] = list.GetAt(i);
-  }
-}
-CFDE_CSSMediaRule::~CFDE_CSSMediaRule() {
-  for (int32_t i = m_RuleArray.GetSize() - 1; i >= 0; --i) {
-    IFDE_CSSRule* pRule = m_RuleArray.GetAt(i);
-    switch (pRule->GetType()) {
-      case FDE_CSSRULETYPE_Style:
-        ((CFDE_CSSStyleRule*)pRule)->~CFDE_CSSStyleRule();
-        break;
-      default:
-        FXSYS_assert(FALSE);
-        break;
-    }
-  }
-}
-inline FX_BOOL FDE_IsCSSChar(FX_WCHAR wch) {
-  return (wch >= 'a' && wch <= 'z') || (wch >= 'A' && wch <= 'Z');
-}
-int32_t FDE_GetCSSPersudoLen(const FX_WCHAR* psz, const FX_WCHAR* pEnd) {
-  FXSYS_assert(*psz == ':');
-  const FX_WCHAR* pStart = psz;
-  while (psz < pEnd) {
-    FX_WCHAR wch = *psz;
-    if (FDE_IsCSSChar(wch) || wch == ':') {
-      ++psz;
-    } else {
-      break;
-    }
-  }
-  return psz - pStart;
-}
-int32_t FDE_GetCSSNameLen(const FX_WCHAR* psz, const FX_WCHAR* pEnd) {
-  const FX_WCHAR* pStart = psz;
-  while (psz < pEnd) {
-    FX_WCHAR wch = *psz;
-    if (FDE_IsCSSChar(wch) || (wch >= '0' && wch <= '9') || wch == '_' ||
-        wch == '-') {
-      ++psz;
-    } else {
-      break;
-    }
-  }
-  return psz - pStart;
-}
-IFDE_CSSSelector* CFDE_CSSSelector::FromString(IFX_MEMAllocator* pStaticStore,
-                                               const FX_WCHAR* psz,
-                                               int32_t iLen) {
-  FXSYS_assert(pStaticStore != NULL && psz != NULL && iLen > 0);
-  const FX_WCHAR* pStart = psz;
-  const FX_WCHAR* pEnd = psz + iLen;
-  for (; psz < pEnd; ++psz) {
-    switch (*psz) {
-      case '>':
-      case '[':
-      case '+':
-        return NULL;
-    }
-  }
-  CFDE_CSSSelector *pFirst = NULL, *pLast = NULL;
-  CFDE_CSSSelector *pPersudoFirst = NULL, *pPersudoLast = NULL;
-  for (psz = pStart; psz < pEnd;) {
-    FX_WCHAR wch = *psz;
-    if (wch == '.' || wch == '#') {
-      if (psz == pStart || psz[-1] == ' ') {
-        CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
-            CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, L"*", 1, TRUE);
-        if (p == NULL) {
-          return NULL;
-        }
-        if (pFirst != NULL) {
-          pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant);
-          p->SetNext(pFirst);
-        }
-        pFirst = pLast = p;
-      }
-      FXSYS_assert(pLast != NULL);
-      int32_t iNameLen = FDE_GetCSSNameLen(++psz, pEnd);
-      if (iNameLen == 0) {
-        return NULL;
-      }
-      FDE_CSSSELECTORTYPE eType =
-          wch == '.' ? FDE_CSSSELECTORTYPE_Class : FDE_CSSSELECTORTYPE_ID;
-      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
-          CFDE_CSSSelector(eType, psz, iNameLen, FALSE);
-      if (p == NULL) {
-        return NULL;
-      }
-      p->SetNext(pLast->GetNextSelector());
-      pLast->SetNext(p);
-      pLast = p;
-      psz += iNameLen;
-    } else if (FDE_IsCSSChar(wch) || wch == '*') {
-      int32_t iNameLen = wch == '*' ? 1 : FDE_GetCSSNameLen(psz, pEnd);
-      if (iNameLen == 0) {
-        return NULL;
-      }
-      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
-          CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Element, psz, iNameLen, TRUE);
-      if (p == NULL) {
-        return NULL;
-      }
-      if (pFirst == NULL) {
-        pFirst = pLast = p;
-      } else {
-        pFirst->SetType(FDE_CSSSELECTORTYPE_Descendant);
-        p->SetNext(pFirst);
-        pFirst = pLast = p;
-      }
-      psz += iNameLen;
-    } else if (wch == ':') {
-      int32_t iNameLen = FDE_GetCSSPersudoLen(psz, pEnd);
-      if (iNameLen == 0) {
-        return NULL;
-      }
-      CFDE_CSSSelector* p = FXTARGET_NewWith(pStaticStore)
-          CFDE_CSSSelector(FDE_CSSSELECTORTYPE_Persudo, psz, iNameLen, TRUE);
-      if (p == NULL) {
-        return NULL;
-      }
-      if (pPersudoFirst == NULL) {
-        pPersudoFirst = pPersudoLast = p;
-      } else {
-        pPersudoLast->SetNext(p);
-        pPersudoLast = p;
-      }
-      psz += iNameLen;
-    } else if (wch == ' ') {
-      psz++;
-    } else {
-      return NULL;
-    }
-  }
-  if (pPersudoFirst == NULL) {
-    return pFirst;
-  } else {
-    pPersudoLast->SetNext(pFirst);
-    return pPersudoFirst;
-  }
-}
diff --git a/xfa/src/fde/css/fde_cssstylesheet.h b/xfa/src/fde/css/fde_cssstylesheet.h
deleted file mode 100644
index 5e11c74..0000000
--- a/xfa/src/fde/css/fde_cssstylesheet.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSSTYLESHEET_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSSTYLESHEET_H_
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fde/css/fde_cssdeclaration.h"
-
-class CFDE_CSSSelector : public IFDE_CSSSelector, public CFX_Target {
- public:
-  CFDE_CSSSelector(FDE_CSSSELECTORTYPE eType,
-                   const FX_WCHAR* psz,
-                   int32_t iLen,
-                   FX_BOOL bIgnoreCase)
-      : m_eType(eType),
-        m_dwHash(FX_HashCode_String_GetW(psz, iLen, bIgnoreCase)),
-        m_pNext(NULL) {}
-  virtual FDE_CSSSELECTORTYPE GetType() const { return m_eType; }
-
-  virtual FX_DWORD GetNameHash() const { return m_dwHash; }
-
-  virtual IFDE_CSSSelector* GetNextSelector() const { return m_pNext; }
-  static IFDE_CSSSelector* FromString(IFX_MEMAllocator* pStaticStore,
-                                      const FX_WCHAR* psz,
-                                      int32_t iLen);
-  void SetNext(IFDE_CSSSelector* pNext) { m_pNext = pNext; }
-
- protected:
-  static CFDE_CSSSelector* ParseSelector(IFX_MEMAllocator* pStaticStore,
-                                         const FX_WCHAR* psz,
-                                         int32_t& iOff,
-                                         int32_t iLen,
-                                         FDE_CSSSELECTORTYPE eType);
-  void SetType(FDE_CSSSELECTORTYPE eType) { m_eType = eType; }
-  FDE_CSSSELECTORTYPE m_eType;
-  FX_DWORD m_dwHash;
-  IFDE_CSSSelector* m_pNext;
-};
-typedef CFX_ArrayTemplate<IFDE_CSSSelector*> CFDE_CSSSelectorArray;
-class CFDE_CSSStyleRule : public IFDE_CSSStyleRule, public CFX_Target {
- public:
-  CFDE_CSSStyleRule() : m_ppSelector(NULL), m_iSelectors(0) {}
-  virtual int32_t CountSelectorLists() const { return m_iSelectors; }
-  virtual IFDE_CSSSelector* GetSelectorList(int32_t index) const {
-    return m_ppSelector[index];
-  }
-
-  virtual IFDE_CSSDeclaration* GetDeclaration() const {
-    return (IFDE_CSSDeclaration*)&m_Declaration;
-  }
-  CFDE_CSSDeclaration& GetDeclImp() { return m_Declaration; }
-  void SetSelector(IFX_MEMAllocator* pStaticStore,
-                   const CFDE_CSSSelectorArray& list);
-
- protected:
-  CFDE_CSSDeclaration m_Declaration;
-  IFDE_CSSSelector** m_ppSelector;
-  int32_t m_iSelectors;
-};
-class CFDE_CSSMediaRule : public IFDE_CSSMediaRule, public CFX_Target {
- public:
-  CFDE_CSSMediaRule(FX_DWORD dwMediaList) : m_dwMediaList(dwMediaList) {}
-  ~CFDE_CSSMediaRule();
-
-  virtual FX_DWORD GetMediaList() const { return m_dwMediaList; }
-
-  virtual int32_t CountRules() const { return m_RuleArray.GetSize(); }
-  virtual IFDE_CSSRule* GetRule(int32_t index) {
-    return m_RuleArray.GetAt(index);
-  }
-  CFDE_CSSRuleArray& GetArray() { return m_RuleArray; }
-
- protected:
-  FX_DWORD m_dwMediaList;
-  CFDE_CSSRuleArray m_RuleArray;
-};
-class CFDE_CSSFontFaceRule : public IFDE_CSSFontFaceRule, public CFX_Target {
- public:
-  virtual IFDE_CSSDeclaration* GetDeclaration() const {
-    return (IFDE_CSSDeclaration*)&m_Declaration;
-  }
-  CFDE_CSSDeclaration& GetDeclImp() { return m_Declaration; }
-
- protected:
-  CFDE_CSSDeclaration m_Declaration;
-};
-#define FDE_CSSSWITCHDEFAULTS()     \
-  case FDE_CSSSYNTAXSTATUS_EOS:     \
-    return FDE_CSSSYNTAXSTATUS_EOS; \
-  case FDE_CSSSYNTAXSTATUS_Error:   \
-  default:                          \
-    return FDE_CSSSYNTAXSTATUS_Error;
-class CFDE_CSSStyleSheet : public IFDE_CSSStyleSheet, public CFX_Target {
- public:
-  CFDE_CSSStyleSheet(FX_DWORD dwMediaList);
-  ~CFDE_CSSStyleSheet();
-  virtual FX_DWORD AddRef();
-  virtual FX_DWORD Release();
-
-  virtual FX_BOOL GetUrl(CFX_WideString& szUrl) {
-    szUrl = m_szUrl;
-    return szUrl.GetLength() > 0;
-  }
-  virtual FX_DWORD GetMediaList() const { return m_dwMediaList; }
-  virtual FX_WORD GetCodePage() const { return m_wCodePage; }
-  virtual int32_t CountRules() const;
-  virtual IFDE_CSSRule* GetRule(int32_t index);
-  FX_BOOL LoadFromStream(const CFX_WideString& szUrl,
-                         IFX_Stream* pStream,
-                         FX_WORD wCodePage);
-  FX_BOOL LoadFromBuffer(const CFX_WideString& szUrl,
-                         const FX_WCHAR* pBuffer,
-                         int32_t iBufSize,
-                         FX_WORD wCodePage);
-
- protected:
-  void Reset();
-  FX_BOOL LoadFromSyntax(IFDE_CSSSyntaxParser* pSyntax);
-  FDE_CSSSYNTAXSTATUS LoadStyleRule(IFDE_CSSSyntaxParser* pSyntax,
-                                    CFDE_CSSRuleArray& ruleArray);
-  FDE_CSSSYNTAXSTATUS LoadImportRule(IFDE_CSSSyntaxParser* pSyntax);
-  FDE_CSSSYNTAXSTATUS LoadPageRule(IFDE_CSSSyntaxParser* pSyntax);
-  FDE_CSSSYNTAXSTATUS LoadMediaRule(IFDE_CSSSyntaxParser* pSyntax);
-  FDE_CSSSYNTAXSTATUS LoadFontFaceRule(IFDE_CSSSyntaxParser* pSyntax,
-                                       CFDE_CSSRuleArray& ruleArray);
-  FDE_CSSSYNTAXSTATUS SkipRuleSet(IFDE_CSSSyntaxParser* pSyntax);
-  FX_WORD m_wCodePage;
-  FX_WORD m_wRefCount;
-  FX_DWORD m_dwMediaList;
-  IFX_MEMAllocator* m_pAllocator;
-  CFDE_CSSRuleArray m_RuleArray;
-  CFX_WideString m_szUrl;
-  CFDE_CSSSelectorArray m_Selectors;
-  CFX_MapPtrToPtr m_StringCache;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSSTYLESHEET_H_
diff --git a/xfa/src/fde/css/fde_csssyntax.cpp b/xfa/src/fde/css/fde_csssyntax.cpp
deleted file mode 100644
index 5fe502e..0000000
--- a/xfa/src/fde/css/fde_csssyntax.cpp
+++ /dev/null
@@ -1,487 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/css/fde_csssyntax.h"
-
-#include "xfa/src/fde/css/fde_cssdatatable.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-
-#ifdef _cplusplus
-extern "C" {
-#endif
-
-inline FX_BOOL FDE_IsSelectorStart(FX_WCHAR wch) {
-  return wch == '.' || wch == '#' || wch == '*' || (wch >= 'a' && wch <= 'z') ||
-         (wch >= 'A' && wch <= 'Z');
-}
-
-#ifdef _cplusplus
-};
-#endif
-
-IFDE_CSSSyntaxParser* IFDE_CSSSyntaxParser::Create() {
-  return new CFDE_CSSSyntaxParser;
-}
-CFDE_CSSSyntaxParser::CFDE_CSSSyntaxParser()
-    : m_pStream(NULL),
-      m_iStreamPos(0),
-      m_iPlaneSize(0),
-      m_iTextDatLen(0),
-      m_dwCheck((FX_DWORD)-1),
-      m_eMode(FDE_CSSSYNTAXMODE_RuleSet),
-      m_eStatus(FDE_CSSSYNTAXSTATUS_None) {}
-CFDE_CSSSyntaxParser::~CFDE_CSSSyntaxParser() {
-  m_TextData.Reset();
-  m_TextPlane.Reset();
-}
-FX_BOOL CFDE_CSSSyntaxParser::Init(IFX_Stream* pStream,
-                                   int32_t iCSSPlaneSize,
-                                   int32_t iTextDataSize,
-                                   FX_BOOL bOnlyDeclaration) {
-  FXSYS_assert(pStream != NULL && iCSSPlaneSize > 0 && iTextDataSize > 0);
-  Reset(bOnlyDeclaration);
-  if (!m_TextData.EstimateSize(iTextDataSize)) {
-    return FALSE;
-  }
-  uint8_t bom[4];
-  m_pStream = pStream;
-  m_iStreamPos = m_pStream->GetBOM(bom);
-  m_iPlaneSize = iCSSPlaneSize;
-  return TRUE;
-}
-FX_BOOL CFDE_CSSSyntaxParser::Init(const FX_WCHAR* pBuffer,
-                                   int32_t iBufferSize,
-                                   int32_t iTextDatSize,
-                                   FX_BOOL bOnlyDeclaration) {
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0 && iTextDatSize > 0);
-  Reset(bOnlyDeclaration);
-  if (!m_TextData.EstimateSize(iTextDatSize)) {
-    return FALSE;
-  }
-  return m_TextPlane.AttachBuffer(pBuffer, iBufferSize);
-}
-void CFDE_CSSSyntaxParser::Reset(FX_BOOL bOnlyDeclaration) {
-  m_TextPlane.Reset();
-  m_TextData.Reset();
-  m_pStream = NULL;
-  m_iStreamPos = 0;
-  m_iTextDatLen = 0;
-  m_dwCheck = (FX_DWORD)-1;
-  m_eStatus = FDE_CSSSYNTAXSTATUS_None;
-  m_eMode = bOnlyDeclaration ? FDE_CSSSYNTAXMODE_PropertyName
-                             : FDE_CSSSYNTAXMODE_RuleSet;
-}
-FDE_CSSSYNTAXSTATUS CFDE_CSSSyntaxParser::DoSyntaxParse() {
-  while (m_eStatus >= FDE_CSSSYNTAXSTATUS_None) {
-    if (m_TextPlane.IsEOF()) {
-      if (m_pStream == NULL) {
-        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
-            m_TextData.GetLength() > 0) {
-          SaveTextData();
-          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
-        }
-        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
-      }
-      FX_BOOL bEOS;
-      int32_t iLen = m_TextPlane.LoadFromStream(m_pStream, m_iStreamPos,
-                                                m_iPlaneSize, bEOS);
-      m_iStreamPos = m_pStream->GetPosition();
-      if (iLen < 1) {
-        if (m_eMode == FDE_CSSSYNTAXMODE_PropertyValue &&
-            m_TextData.GetLength() > 0) {
-          SaveTextData();
-          return m_eStatus = FDE_CSSSYNTAXSTATUS_PropertyValue;
-        }
-        return m_eStatus = FDE_CSSSYNTAXSTATUS_EOS;
-      }
-    }
-    FX_WCHAR wch;
-    while (!m_TextPlane.IsEOF()) {
-      wch = m_TextPlane.GetChar();
-      switch (m_eMode) {
-        case FDE_CSSSYNTAXMODE_RuleSet:
-          switch (wch) {
-            case '@':
-              m_TextPlane.MoveNext();
-              SwitchMode(FDE_CSSSYNTAXMODE_AtRule);
-              break;
-            case '}':
-              m_TextPlane.MoveNext();
-              if (RestoreMode()) {
-                return FDE_CSSSYNTAXSTATUS_DeclClose;
-              } else {
-                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-              }
-              break;
-            case '/':
-              if (m_TextPlane.GetNextChar() == '*') {
-                m_ModeStack.Push(m_eMode);
-                SwitchMode(FDE_CSSSYNTAXMODE_Comment);
-                break;
-              }
-            default:
-              if (wch <= ' ') {
-                m_TextPlane.MoveNext();
-              } else if (FDE_IsSelectorStart(wch)) {
-                SwitchMode(FDE_CSSSYNTAXMODE_Selector);
-                return FDE_CSSSYNTAXSTATUS_StyleRule;
-              } else {
-                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-              }
-              break;
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_Selector:
-          switch (wch) {
-            case ',':
-              m_TextPlane.MoveNext();
-              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
-              if (m_iTextDatLen > 0) {
-                return FDE_CSSSYNTAXSTATUS_Selector;
-              }
-              break;
-            case '{':
-              if (m_TextData.GetLength() > 0) {
-                SaveTextData();
-                return FDE_CSSSYNTAXSTATUS_Selector;
-              } else {
-                m_TextPlane.MoveNext();
-                m_ModeStack.Push(FDE_CSSSYNTAXMODE_RuleSet);
-                SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
-                return FDE_CSSSYNTAXSTATUS_DeclOpen;
-              }
-              break;
-            case '/':
-              if (m_TextPlane.GetNextChar() == '*') {
-                if (SwitchToComment() > 0) {
-                  return FDE_CSSSYNTAXSTATUS_Selector;
-                }
-                break;
-              }
-            default:
-              AppendChar(wch);
-              break;
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_PropertyName:
-          switch (wch) {
-            case ':':
-              m_TextPlane.MoveNext();
-              SwitchMode(FDE_CSSSYNTAXMODE_PropertyValue);
-              return FDE_CSSSYNTAXSTATUS_PropertyName;
-            case '}':
-              m_TextPlane.MoveNext();
-              if (RestoreMode()) {
-                return FDE_CSSSYNTAXSTATUS_DeclClose;
-              } else {
-                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-              }
-              break;
-            case '/':
-              if (m_TextPlane.GetNextChar() == '*') {
-                if (SwitchToComment() > 0) {
-                  return FDE_CSSSYNTAXSTATUS_PropertyName;
-                }
-                break;
-              }
-            default:
-              AppendChar(wch);
-              break;
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_PropertyValue:
-          switch (wch) {
-            case ';':
-              m_TextPlane.MoveNext();
-            case '}':
-              SwitchMode(FDE_CSSSYNTAXMODE_PropertyName);
-              return FDE_CSSSYNTAXSTATUS_PropertyValue;
-            case '/':
-              if (m_TextPlane.GetNextChar() == '*') {
-                if (SwitchToComment() > 0) {
-                  return FDE_CSSSYNTAXSTATUS_PropertyValue;
-                }
-                break;
-              }
-            default:
-              AppendChar(wch);
-              break;
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_Comment:
-          if (wch == '/' && m_TextData.GetLength() > 0 &&
-              m_TextData.GetAt(m_TextData.GetLength() - 1) == '*') {
-            RestoreMode();
-          } else {
-            m_TextData.AppendChar(wch);
-          }
-          m_TextPlane.MoveNext();
-          break;
-        case FDE_CSSSYNTAXMODE_MediaType:
-          switch (wch) {
-            case ',':
-              m_TextPlane.MoveNext();
-              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
-              if (m_iTextDatLen > 0) {
-                return FDE_CSSSYNTAXSTATUS_MediaType;
-              }
-              break;
-            case '{': {
-              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
-              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_MediaRule) {
-                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-              }
-              if (m_TextData.GetLength() > 0) {
-                SaveTextData();
-                return FDE_CSSSYNTAXSTATUS_MediaType;
-              } else {
-                m_TextPlane.MoveNext();
-                *pMode = FDE_CSSSYNTAXMODE_RuleSet;
-                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
-                return FDE_CSSSYNTAXSTATUS_DeclOpen;
-              }
-            } break;
-            case ';': {
-              FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
-              if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
-                return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-              }
-              if (m_TextData.GetLength() > 0) {
-                SaveTextData();
-                if (IsImportEnabled()) {
-                  return FDE_CSSSYNTAXSTATUS_MediaType;
-                }
-              } else {
-                FX_BOOL bEnabled = IsImportEnabled();
-                m_TextPlane.MoveNext();
-                m_ModeStack.Pop();
-                SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
-                if (bEnabled) {
-                  DisableImport();
-                  return FDE_CSSSYNTAXSTATUS_ImportClose;
-                }
-              }
-            } break;
-            case '/':
-              if (m_TextPlane.GetNextChar() == '*') {
-                if (SwitchToComment() > 0) {
-                  return FDE_CSSSYNTAXSTATUS_MediaType;
-                }
-                break;
-              }
-            default:
-              AppendChar(wch);
-              break;
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_URI: {
-          FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
-          if (pMode == NULL || *pMode != FDE_CSSSYNTAXMODE_Import) {
-            return m_eStatus = FDE_CSSSYNTAXSTATUS_Error;
-          }
-          if (wch <= ' ' || wch == ';') {
-            int32_t iURIStart, iURILength = m_TextData.GetLength();
-            if (iURILength > 0 &&
-                FDE_ParseCSSURI(m_TextData.GetBuffer(), iURILength, iURIStart,
-                                iURILength)) {
-              m_TextData.Subtract(iURIStart, iURILength);
-              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
-              if (IsImportEnabled()) {
-                return FDE_CSSSYNTAXSTATUS_URI;
-              } else {
-                break;
-              }
-            }
-          }
-          AppendChar(wch);
-        } break;
-        case FDE_CSSSYNTAXMODE_AtRule:
-          if (wch > ' ') {
-            AppendChar(wch);
-          } else {
-            int32_t iLen = m_TextData.GetLength();
-            const FX_WCHAR* psz = m_TextData.GetBuffer();
-            if (FXSYS_wcsncmp(L"charset", psz, iLen) == 0) {
-              SwitchMode(FDE_CSSSYNTAXMODE_Charset);
-            } else if (FXSYS_wcsncmp(L"import", psz, iLen) == 0) {
-              m_ModeStack.Push(FDE_CSSSYNTAXMODE_Import);
-              SwitchMode(FDE_CSSSYNTAXMODE_URI);
-              if (IsImportEnabled()) {
-                return FDE_CSSSYNTAXSTATUS_ImportRule;
-              } else {
-                break;
-              }
-            } else if (FXSYS_wcsncmp(L"media", psz, iLen) == 0) {
-              m_ModeStack.Push(FDE_CSSSYNTAXMODE_MediaRule);
-              SwitchMode(FDE_CSSSYNTAXMODE_MediaType);
-              return FDE_CSSSYNTAXSTATUS_MediaRule;
-            } else if (FXSYS_wcsncmp(L"font-face", psz, iLen) == 0) {
-              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
-              return FDE_CSSSYNTAXSTATUS_FontFaceRule;
-            } else if (FXSYS_wcsncmp(L"page", psz, iLen) == 0) {
-              SwitchMode(FDE_CSSSYNTAXMODE_Selector);
-              return FDE_CSSSYNTAXSTATUS_PageRule;
-            } else {
-              SwitchMode(FDE_CSSSYNTAXMODE_UnknownRule);
-            }
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_Charset:
-          if (wch == ';') {
-            m_TextPlane.MoveNext();
-            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
-            if (IsCharsetEnabled()) {
-              DisableCharset();
-              if (m_iTextDatLen > 0) {
-                if (m_pStream != NULL) {
-                  FX_WORD wCodePage = FX_GetCodePageFormStringW(
-                      m_TextData.GetBuffer(), m_iTextDatLen);
-                  if (wCodePage < 0xFFFF &&
-                      m_pStream->GetCodePage() != wCodePage) {
-                    m_pStream->SetCodePage(wCodePage);
-                  }
-                }
-                return FDE_CSSSYNTAXSTATUS_Charset;
-              }
-            }
-          } else {
-            AppendChar(wch);
-          }
-          break;
-        case FDE_CSSSYNTAXMODE_UnknownRule:
-          if (wch == ';') {
-            SwitchMode(FDE_CSSSYNTAXMODE_RuleSet);
-          }
-          m_TextPlane.MoveNext();
-          break;
-        default:
-          FXSYS_assert(FALSE);
-          break;
-      }
-    }
-  }
-  return m_eStatus;
-}
-FX_BOOL CFDE_CSSSyntaxParser::IsImportEnabled() const {
-  if ((m_dwCheck & FDE_CSSSYNTAXCHECK_AllowImport) == 0) {
-    return FALSE;
-  }
-  if (m_ModeStack.GetSize() > 1) {
-    return FALSE;
-  }
-  return TRUE;
-}
-inline FX_BOOL CFDE_CSSSyntaxParser::AppendChar(FX_WCHAR wch) {
-  m_TextPlane.MoveNext();
-  if (m_TextData.GetLength() > 0 || wch > ' ') {
-    m_TextData.AppendChar(wch);
-    return TRUE;
-  }
-  return FALSE;
-}
-inline int32_t CFDE_CSSSyntaxParser::SaveTextData() {
-  m_iTextDatLen = m_TextData.TrimEnd();
-  m_TextData.Clear();
-  return m_iTextDatLen;
-}
-inline void CFDE_CSSSyntaxParser::SwitchMode(FDE_CSSSYNTAXMODE eMode) {
-  m_eMode = eMode;
-  SaveTextData();
-}
-inline int32_t CFDE_CSSSyntaxParser::SwitchToComment() {
-  int32_t iLength = m_TextData.GetLength();
-  m_ModeStack.Push(m_eMode);
-  SwitchMode(FDE_CSSSYNTAXMODE_Comment);
-  return iLength;
-}
-inline FX_BOOL CFDE_CSSSyntaxParser::RestoreMode() {
-  FDE_CSSSYNTAXMODE* pMode = m_ModeStack.GetTopElement();
-  if (pMode == NULL) {
-    return FALSE;
-  }
-  SwitchMode(*pMode);
-  m_ModeStack.Pop();
-  return TRUE;
-}
-const FX_WCHAR* CFDE_CSSSyntaxParser::GetCurrentString(int32_t& iLength) const {
-  iLength = m_iTextDatLen;
-  return m_TextData.GetBuffer();
-}
-CFDE_CSSTextBuf::CFDE_CSSTextBuf()
-    : m_bExtBuf(FALSE),
-      m_pBuffer(NULL),
-      m_iBufLen(0),
-      m_iDatLen(0),
-      m_iDatPos(0) {}
-CFDE_CSSTextBuf::~CFDE_CSSTextBuf() {
-  Reset();
-}
-void CFDE_CSSTextBuf::Reset() {
-  if (!m_bExtBuf) {
-    FX_Free(m_pBuffer);
-    m_pBuffer = NULL;
-  }
-  m_iDatPos = m_iDatLen = m_iBufLen;
-}
-FX_BOOL CFDE_CSSTextBuf::AttachBuffer(const FX_WCHAR* pBuffer,
-                                      int32_t iBufLen) {
-  Reset();
-  m_pBuffer = (FX_WCHAR*)pBuffer;
-  m_iDatLen = m_iBufLen = iBufLen;
-  return m_bExtBuf = TRUE;
-}
-FX_BOOL CFDE_CSSTextBuf::EstimateSize(int32_t iAllocSize) {
-  FXSYS_assert(iAllocSize > 0);
-  Clear();
-  m_bExtBuf = FALSE;
-  return ExpandBuf(iAllocSize);
-}
-int32_t CFDE_CSSTextBuf::LoadFromStream(IFX_Stream* pTxtStream,
-                                        int32_t iStreamOffset,
-                                        int32_t iMaxChars,
-                                        FX_BOOL& bEOS) {
-  FXSYS_assert(iStreamOffset >= 0 && iMaxChars > 0);
-  Clear();
-  m_bExtBuf = FALSE;
-  if (!ExpandBuf(iMaxChars)) {
-    return 0;
-  }
-  if (pTxtStream->GetPosition() != iStreamOffset) {
-    pTxtStream->Seek(FX_STREAMSEEK_Begin, iStreamOffset);
-  }
-  m_iDatLen = pTxtStream->ReadString(m_pBuffer, iMaxChars, bEOS);
-  return m_iDatLen;
-}
-FX_BOOL CFDE_CSSTextBuf::ExpandBuf(int32_t iDesiredSize) {
-  if (m_bExtBuf) {
-    return FALSE;
-  }
-  if (!m_pBuffer) {
-    m_pBuffer = FX_Alloc(FX_WCHAR, iDesiredSize);
-  } else if (m_iBufLen != iDesiredSize) {
-    m_pBuffer = FX_Realloc(FX_WCHAR, m_pBuffer, iDesiredSize);
-  } else {
-    return TRUE;
-  }
-  if (!m_pBuffer) {
-    m_iBufLen = 0;
-    return FALSE;
-  }
-  m_iBufLen = iDesiredSize;
-  return TRUE;
-}
-void CFDE_CSSTextBuf::Subtract(int32_t iStart, int32_t iLength) {
-  FXSYS_assert(iStart >= 0 && iLength > 0);
-  if (iLength > m_iDatLen - iStart) {
-    iLength = m_iDatLen - iStart;
-  }
-  if (iLength < 0) {
-    iLength = 0;
-  } else {
-    FXSYS_memmove(m_pBuffer, m_pBuffer + iStart, iLength * sizeof(FX_WCHAR));
-  }
-  m_iDatLen = iLength;
-}
diff --git a/xfa/src/fde/css/fde_csssyntax.h b/xfa/src/fde/css/fde_csssyntax.h
deleted file mode 100644
index dc7acdb..0000000
--- a/xfa/src/fde/css/fde_csssyntax.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_CSS_FDE_CSSSYNTAX_H_
-#define XFA_SRC_FDE_CSS_FDE_CSSSYNTAX_H_
-
-#include "xfa/src/fde/css/fde_css.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-
-class CFDE_CSSTextBuf : public CFX_Target {
- public:
-  CFDE_CSSTextBuf();
-  ~CFDE_CSSTextBuf();
-  FX_BOOL AttachBuffer(const FX_WCHAR* pBuffer, int32_t iBufLen);
-  FX_BOOL EstimateSize(int32_t iAllocSize);
-  int32_t LoadFromStream(IFX_Stream* pTxtStream,
-                         int32_t iStreamOffset,
-                         int32_t iMaxChars,
-                         FX_BOOL& bEOS);
-  FX_BOOL AppendChar(FX_WCHAR wch) {
-    if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) {
-      return FALSE;
-    }
-    return (m_pBuffer[m_iDatLen++] = wch), TRUE;
-  }
-  void Clear() { m_iDatPos = m_iDatLen = 0; }
-  void Reset();
-  int32_t TrimEnd() {
-    while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') {
-      --m_iDatLen;
-    }
-    AppendChar(0);
-    return --m_iDatLen;
-  }
-  void Subtract(int32_t iStart, int32_t iLength);
-  FX_BOOL IsEOF() const { return m_iDatPos >= m_iDatLen; }
-  FX_WCHAR GetAt(int32_t index) const { return m_pBuffer[index]; }
-  FX_WCHAR GetChar() const { return m_pBuffer[m_iDatPos]; }
-  FX_WCHAR GetNextChar() const {
-    return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1];
-  }
-  void MoveNext() { m_iDatPos++; }
-  int32_t GetLength() const { return m_iDatLen; }
-  const FX_WCHAR* GetBuffer() const { return m_pBuffer; }
-
- protected:
-  FX_BOOL ExpandBuf(int32_t iDesiredSize);
-  FX_BOOL m_bExtBuf;
-  FX_WCHAR* m_pBuffer;
-  int32_t m_iBufLen;
-  int32_t m_iDatLen;
-  int32_t m_iDatPos;
-};
-
-#define FDE_CSSSYNTAXCHECK_AllowCharset 1
-#define FDE_CSSSYNTAXCHECK_AllowImport 2
-
-enum FDE_CSSSYNTAXMODE {
-  FDE_CSSSYNTAXMODE_RuleSet,
-  FDE_CSSSYNTAXMODE_Comment,
-  FDE_CSSSYNTAXMODE_AtRule,
-  FDE_CSSSYNTAXMODE_UnknownRule,
-  FDE_CSSSYNTAXMODE_Charset,
-  FDE_CSSSYNTAXMODE_Import,
-  FDE_CSSSYNTAXMODE_MediaRule,
-  FDE_CSSSYNTAXMODE_URI,
-  FDE_CSSSYNTAXMODE_MediaType,
-  FDE_CSSSYNTAXMODE_Selector,
-  FDE_CSSSYNTAXMODE_PropertyName,
-  FDE_CSSSYNTAXMODE_PropertyValue,
-};
-
-class CFDE_CSSSyntaxParser : public IFDE_CSSSyntaxParser, public CFX_Target {
- public:
-  CFDE_CSSSyntaxParser();
-  ~CFDE_CSSSyntaxParser();
-  virtual void Release() { delete this; }
-  virtual FX_BOOL Init(IFX_Stream* pStream,
-                       int32_t iCSSPlaneSize,
-                       int32_t iTextDataSize = 32,
-                       FX_BOOL bOnlyDeclaration = FALSE);
-  virtual FX_BOOL Init(const FX_WCHAR* pBuffer,
-                       int32_t iBufferSize,
-                       int32_t iTextDatSize = 32,
-                       FX_BOOL bOnlyDeclaration = FALSE);
-  virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse();
-  virtual const FX_WCHAR* GetCurrentString(int32_t& iLength) const;
-
- protected:
-  void Reset(FX_BOOL bOnlyDeclaration);
-  void SwitchMode(FDE_CSSSYNTAXMODE eMode);
-  int32_t SwitchToComment();
-
-  FX_BOOL RestoreMode();
-  FX_BOOL AppendChar(FX_WCHAR wch);
-  int32_t SaveTextData();
-  FX_BOOL IsCharsetEnabled() const {
-    return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0;
-  }
-  void DisableCharset() { m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport; }
-  FX_BOOL IsImportEnabled() const;
-  void DisableImport() { m_dwCheck = 0; }
-  IFX_Stream* m_pStream;
-  int32_t m_iStreamPos;
-  int32_t m_iPlaneSize;
-  CFDE_CSSTextBuf m_TextData;
-  CFDE_CSSTextBuf m_TextPlane;
-  int32_t m_iTextDatLen;
-  FX_DWORD m_dwCheck;
-  FDE_CSSSYNTAXMODE m_eMode;
-  FDE_CSSSYNTAXSTATUS m_eStatus;
-  CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack;
-};
-
-#endif  // XFA_SRC_FDE_CSS_FDE_CSSSYNTAX_H_
diff --git a/xfa/src/fde/fde_brush.h b/xfa/src/fde/fde_brush.h
deleted file mode 100644
index 00edeeb..0000000
--- a/xfa/src/fde/fde_brush.h
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_BRUSH_H_
-#define XFA_SRC_FDE_FDE_BRUSH_H_
-
-#include "core/include/fxcrt/fx_system.h"
-#include "core/include/fxge/fx_dib.h"
-
-class IFDE_Image;
-
-#define FDE_BRUSHTYPE_Unknown -1
-#define FDE_BRUSHTYPE_Solid 0
-#define FDE_BRUSHTYPE_Hatch 1
-#define FDE_BRUSHTYPE_Texture 2
-#define FDE_BRUSHTYPE_LinearGradient 3
-#define FDE_BRUSHTYPE_MAX 3
-#define FDE_WRAPMODE_Tile 0
-#define FDE_WRAPMODE_TileFlipX 1
-#define FDE_WRAPMODE_TileFlipY 2
-#define FDE_WRAPMODE_TileFlipXY 3
-#define FDE_WRAPMODE_Clamp 4
-
-struct FDE_GRADIENTCOLOR {
-  FX_FLOAT pos;
-  FX_ARGB color;
-};
-typedef CFX_ArrayTemplate<FDE_GRADIENTCOLOR> CFDE_GradientColors;
-
-class IFDE_Brush {
- public:
-  static IFDE_Brush* Create(int32_t iType);
-  virtual ~IFDE_Brush() {}
-  virtual void Release() = 0;
-  virtual int32_t GetType() const = 0;
-};
-
-class IFDE_SolidBrush : public IFDE_Brush {
- public:
-  virtual FX_ARGB GetColor() const = 0;
-  virtual void SetColor(FX_ARGB color) = 0;
-  virtual const CFX_Matrix& GetMatrix() const = 0;
-  virtual void ResetMatrix() = 0;
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) = 0;
-  virtual void RotateMatrix(FX_FLOAT fRadian) = 0;
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) = 0;
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) = 0;
-  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
-};
-
-#define FDE_HATCHSTYLE_Horizontal 0
-#define FDE_HATCHSTYLE_Vertical 1
-#define FDE_HATCHSTYLE_ForwardDiagonal 2
-#define FDE_HATCHSTYLE_BackwardDiagonal 3
-#define FDE_HATCHSTYLE_Cross 4
-#define FDE_HATCHSTYLE_DiagonalCross 5
-#define FDE_HATCHSTYLE_05Percent 6
-#define FDE_HATCHSTYLE_10Percent 7
-#define FDE_HATCHSTYLE_20Percent 8
-#define FDE_HATCHSTYLE_25Percent 9
-#define FDE_HATCHSTYLE_30Percent 10
-#define FDE_HATCHSTYLE_40Percent 11
-#define FDE_HATCHSTYLE_50Percent 12
-#define FDE_HATCHSTYLE_60Percent 13
-#define FDE_HATCHSTYLE_70Percent 14
-#define FDE_HATCHSTYLE_75Percent 15
-#define FDE_HATCHSTYLE_80Percent 16
-#define FDE_HATCHSTYLE_90Percent 17
-#define FDE_HATCHSTYLE_LightDownwardDiagonal 18
-#define FDE_HATCHSTYLE_LightUpwardDiagonal 19
-#define FDE_HATCHSTYLE_DarkDownwardDiagonal 20
-#define FDE_HATCHSTYLE_DarkUpwardDiagonal 21
-#define FDE_HATCHSTYLE_WideDownwardDiagonal 22
-#define FDE_HATCHSTYLE_WideUpwardDiagonal 23
-#define FDE_HATCHSTYLE_LightVertical 24
-#define FDE_HATCHSTYLE_LightHorizontal 25
-#define FDE_HATCHSTYLE_NarrowVertical 26
-#define FDE_HATCHSTYLE_NarrowHorizontal 27
-#define FDE_HATCHSTYLE_DarkVertical 28
-#define FDE_HATCHSTYLE_DarkHorizontal 29
-#define FDE_HATCHSTYLE_DashedDownwardDiagonal 30
-#define FDE_HATCHSTYLE_DashedUpwardDiagonal 31
-#define FDE_HATCHSTYLE_DashedHorizontal 32
-#define FDE_HATCHSTYLE_DashedVertical 33
-#define FDE_HATCHSTYLE_SmallConfetti 34
-#define FDE_HATCHSTYLE_LargeConfetti 35
-#define FDE_HATCHSTYLE_ZigZag 36
-#define FDE_HATCHSTYLE_Wave 37
-#define FDE_HATCHSTYLE_DiagonalBrick 38
-#define FDE_HATCHSTYLE_HorizontalBrick 39
-#define FDE_HATCHSTYLE_Weave 40
-#define FDE_HATCHSTYLE_Plaid 41
-#define FDE_HATCHSTYLE_Divot 42
-#define FDE_HATCHSTYLE_DottedGrid 43
-#define FDE_HATCHSTYLE_DottedDiamond 44
-#define FDE_HATCHSTYLE_Shingle 45
-#define FDE_HATCHSTYLE_Trellis 46
-#define FDE_HATCHSTYLE_Sphere 47
-#define FDE_HATCHSTYLE_SmallGrid 48
-#define FDE_HATCHSTYLE_SmallCheckerBoard 49
-#define FDE_HATCHSTYLE_LargeCheckerBoard 50
-#define FDE_HATCHSTYLE_OutlinedDiamond 51
-#define FDE_HATCHSTYLE_SolidDiamond 52
-#define FDE_HATCHSTYLE_Total 53
-#define FDE_HATCHSTYLE_LargeGrid FDE_HATCHSTYLE_Cross
-#define FDE_HATCHSTYLE_Min FDE_HATCHSTYLE_Horizontal
-#define FDE_HATCHSTYLE_Max (FDE_HATCHSTYLE_Total - 1)
-
-class IFDE_HatchBrush : public IFDE_Brush {
- public:
-  virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const = 0;
-  virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) = 0;
-  virtual int32_t GetHatchStyle() const = 0;
-  virtual FX_BOOL SetHatchStyle(int32_t iHatchStyle) = 0;
-};
-
-class IFDE_TextureBrush : public IFDE_Brush {
- public:
-  virtual IFDE_Image* GetImage() const = 0;
-  virtual void SetImage(IFDE_Image* pImage, FX_BOOL bAutoRelease) = 0;
-  virtual int32_t GetWrapMode() const = 0;
-  virtual void SetWrapMode(int32_t iWrapMode) = 0;
-};
-
-#define FDE_LINEARGRADIENTMODE_Horizontal 0
-#define FDE_LINEARGRADIENTMODE_Vertical 1
-#define FDE_LINEARGRADIENTMODE_ForwardDiagonal 2
-#define FDE_LINEARGRADIENTMODE_BackwardDiagonal 3
-
-class IFDE_LinearGradientBrush : public IFDE_Brush {
- public:
-  virtual void GetLinearPoints(CFX_PointF& startingPoint,
-                               CFX_PointF& endingPoint) const = 0;
-  virtual void SetLinearPoints(const CFX_PointF& startingPoint,
-                               const CFX_PointF& endingPoint) = 0;
-  virtual void GetLinearColors(FX_ARGB& startingColor,
-                               FX_ARGB& endingColor) const = 0;
-  virtual void SetLinearColors(const FX_ARGB& startingColor,
-                               const FX_ARGB& endingColor) = 0;
-  virtual int32_t CountGradientColors() const = 0;
-  virtual FX_BOOL GetGradientColors(CFDE_GradientColors& colors) const = 0;
-  virtual FX_BOOL SetGradientColors(const CFDE_GradientColors& colors) = 0;
-  virtual int32_t GetWrapMode() const = 0;
-  virtual void SetWrapMode(int32_t iWrapMode) = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_BRUSH_H_
diff --git a/xfa/src/fde/fde_devbasic.cpp b/xfa/src/fde/fde_devbasic.cpp
deleted file mode 100644
index c119110..0000000
--- a/xfa/src/fde/fde_devbasic.cpp
+++ /dev/null
@@ -1,550 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_devbasic.h"
-
-#include <cstdint>
-
-#include "xfa/src/fde/fde_brush.h"
-
-static const FDE_HATCHDATA gs_HatchBitmapData[FDE_HATCHSTYLE_Total] = {
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x15, 0x15, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x7f, 0x7f, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-         0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,
-         0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
-         0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00,
-         0x83, 0x83, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-         0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-         0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,
-         0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00,
-         0xc1, 0xc1, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x04, 0x04, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
-         0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
-         0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00,
-         0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00,
-         0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,
-         0x8d, 0x8d, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
-         0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
-         0xc0, 0xc0, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x51, 0x51, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00,
-         0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
-         0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-         0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
-         0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00,
-         0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,
-         0xf8, 0xf8, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
-         0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-};
-FDE_LPCHATCHDATA FDE_DEVGetHatchData(int32_t iHatchStyle) {
-  if (iHatchStyle < FDE_HATCHSTYLE_Min || iHatchStyle > FDE_HATCHSTYLE_Max) {
-    return NULL;
-  }
-  return &gs_HatchBitmapData[iHatchStyle];
-}
diff --git a/xfa/src/fde/fde_devbasic.h b/xfa/src/fde/fde_devbasic.h
deleted file mode 100644
index 6b27beb..0000000
--- a/xfa/src/fde/fde_devbasic.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_DEVBASIC_H_
-#define XFA_SRC_FDE_FDE_DEVBASIC_H_
-
-#include <cstdint>
-
-struct FDE_HATCHDATA {
-  int32_t iWidth;
-  int32_t iHeight;
-  uint8_t MaskBits[64];
-};
-typedef FDE_HATCHDATA const* FDE_LPCHATCHDATA;
-FDE_LPCHATCHDATA FDE_DEVGetHatchData(int32_t iHatchStyle);
-
-#endif  // XFA_SRC_FDE_FDE_DEVBASIC_H_
diff --git a/xfa/src/fde/fde_gedevice.cpp b/xfa/src/fde/fde_gedevice.cpp
deleted file mode 100644
index 13ae1bb..0000000
--- a/xfa/src/fde/fde_gedevice.cpp
+++ /dev/null
@@ -1,573 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_gedevice.h"
-
-#include <algorithm>
-
-#include "xfa/src/fde/fde_brush.h"
-#include "xfa/src/fde/fde_devbasic.h"
-#include "xfa/src/fde/fde_geobject.h"
-#include "xfa/src/fde/fde_image.h"
-#include "xfa/src/fde/fde_pen.h"
-
-FX_BOOL FDE_GetStockHatchMask(int32_t iHatchStyle, CFX_DIBitmap& hatchMask) {
-  FDE_LPCHATCHDATA pData = FDE_DEVGetHatchData(iHatchStyle);
-  if (!pData) {
-    return FALSE;
-  }
-  hatchMask.Create(pData->iWidth, pData->iHeight, FXDIB_1bppMask);
-  FXSYS_memcpy(hatchMask.GetBuffer(), pData->MaskBits,
-               hatchMask.GetPitch() * pData->iHeight);
-  return TRUE;
-}
-
-IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap,
-                                             FX_BOOL bRgbByteOrder) {
-  if (pBitmap == NULL) {
-    return NULL;
-  }
-  CFX_FxgeDevice* pDevice = new CFX_FxgeDevice;
-  pDevice->Attach(pBitmap, 0, bRgbByteOrder);
-  return new CFDE_FxgeDevice(pDevice, TRUE);
-}
-IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_RenderDevice* pDevice) {
-  return pDevice ? new CFDE_FxgeDevice(pDevice, FALSE) : nullptr;
-}
-CFDE_FxgeDevice::CFDE_FxgeDevice(CFX_RenderDevice* pDevice,
-                                 FX_BOOL bOwnerDevice)
-    : m_pDevice(pDevice),
-      m_bOwnerDevice(bOwnerDevice),
-      m_pCharPos(NULL),
-      m_iCharCount(0) {
-  FXSYS_assert(pDevice != NULL);
-  FX_RECT rt = m_pDevice->GetClipBox();
-  m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
-               (FX_FLOAT)rt.Height());
-}
-CFDE_FxgeDevice::~CFDE_FxgeDevice() {
-  FX_Free(m_pCharPos);
-  if (m_bOwnerDevice)
-    delete m_pDevice;
-}
-int32_t CFDE_FxgeDevice::GetWidth() const {
-  return m_pDevice->GetWidth();
-}
-int32_t CFDE_FxgeDevice::GetHeight() const {
-  return m_pDevice->GetHeight();
-}
-FDE_HDEVICESTATE CFDE_FxgeDevice::SaveState() {
-  m_pDevice->SaveState();
-  return NULL;
-}
-void CFDE_FxgeDevice::RestoreState(FDE_HDEVICESTATE hState) {
-  m_pDevice->RestoreState();
-  const FX_RECT& rt = m_pDevice->GetClipBox();
-  m_rtClip.Set((FX_FLOAT)rt.left, (FX_FLOAT)rt.top, (FX_FLOAT)rt.Width(),
-               (FX_FLOAT)rt.Height());
-}
-FX_BOOL CFDE_FxgeDevice::SetClipRect(const CFX_RectF& rtClip) {
-  m_rtClip = rtClip;
-  return m_pDevice->SetClip_Rect(FX_RECT((int32_t)FXSYS_floor(rtClip.left),
-                                         (int32_t)FXSYS_floor(rtClip.top),
-                                         (int32_t)FXSYS_ceil(rtClip.right()),
-                                         (int32_t)FXSYS_ceil(rtClip.bottom())));
-}
-const CFX_RectF& CFDE_FxgeDevice::GetClipRect() {
-  return m_rtClip;
-}
-FX_BOOL CFDE_FxgeDevice::SetClipPath(const IFDE_Path* pClip) {
-  return FALSE;
-}
-IFDE_Path* CFDE_FxgeDevice::GetClipPath() const {
-  return NULL;
-}
-FX_FLOAT CFDE_FxgeDevice::GetDpiX() const {
-  return 96;
-}
-FX_FLOAT CFDE_FxgeDevice::GetDpiY() const {
-  return 96;
-}
-FX_BOOL CFDE_FxgeDevice::DrawImage(CFX_DIBSource* pDib,
-                                   const CFX_RectF* pSrcRect,
-                                   const CFX_RectF& dstRect,
-                                   const CFX_Matrix* pImgMatrix,
-                                   const CFX_Matrix* pDevMatrix) {
-  FXSYS_assert(pDib != NULL);
-  CFX_RectF srcRect;
-  if (pSrcRect) {
-    srcRect = *pSrcRect;
-  } else {
-    srcRect.Set(0, 0, (FX_FLOAT)pDib->GetWidth(), (FX_FLOAT)pDib->GetHeight());
-  }
-  if (srcRect.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_Matrix dib2fxdev;
-  if (pImgMatrix) {
-    dib2fxdev = *pImgMatrix;
-  } else {
-    dib2fxdev.SetIdentity();
-  }
-  dib2fxdev.a = dstRect.width;
-  dib2fxdev.d = -dstRect.height;
-  dib2fxdev.e = dstRect.left;
-  dib2fxdev.f = dstRect.bottom();
-  if (pDevMatrix) {
-    dib2fxdev.Concat(*pDevMatrix);
-  }
-  void* handle = NULL;
-  m_pDevice->StartDIBits(pDib, 255, 0, (const CFX_Matrix*)&dib2fxdev, 0,
-                         handle);
-  while (m_pDevice->ContinueDIBits(handle, NULL)) {
-  }
-  m_pDevice->CancelDIBits(handle);
-  return handle != NULL;
-}
-FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush,
-                                    IFX_Font* pFont,
-                                    const FXTEXT_CHARPOS* pCharPos,
-                                    int32_t iCount,
-                                    FX_FLOAT fFontSize,
-                                    const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL &&
-               iCount > 0);
-  CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache();
-  CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont();
-  switch (pBrush->GetType()) {
-    case FDE_BRUSHTYPE_Solid: {
-      FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor();
-      if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
-          !pFxFont->IsItalic()) {
-        FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
-        FX_FLOAT* pAM;
-        for (int32_t i = 0; i < iCount; ++i) {
-          static const FX_FLOAT mc = 0.267949f;
-          pAM = pCP->m_AdjustMatrix;
-          pAM[2] = mc * pAM[0] + pAM[2];
-          pAM[3] = mc * pAM[1] + pAM[3];
-          pCP++;
-        }
-      }
-      FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
-      IFX_Font* pCurFont = NULL;
-      IFX_Font* pSTFont = NULL;
-      FXTEXT_CHARPOS* pCurCP = NULL;
-      int32_t iCurCount = 0;
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      FX_DWORD dwFontStyle = pFont->GetFontStyles();
-      CFX_Font FxFont;
-      CFX_SubstFont SubstFxFont;
-      FxFont.SetSubstFont(&SubstFxFont);
-      SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
-      SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight;
-      SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
-      SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      for (int32_t i = 0; i < iCount; ++i) {
-        pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
-        pCP->m_GlyphIndex &= 0x00FFFFFF;
-        pCP->m_bFontStyle = FALSE;
-        if (pCurFont != pSTFont) {
-          if (pCurFont != NULL) {
-            pFxFont = (CFX_Font*)pCurFont->GetDevFont();
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-            FxFont.SetFace(pFxFont->GetFace());
-            m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache,
-                                      -fFontSize, (const CFX_Matrix*)pMatrix,
-                                      argb, FXTEXT_CLEARTYPE);
-#else
-            m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
-                                      -fFontSize, (const CFX_Matrix*)pMatrix,
-                                      argb, FXTEXT_CLEARTYPE);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-          }
-          pCurFont = pSTFont;
-          pCurCP = pCP;
-          iCurCount = 1;
-        } else {
-          iCurCount++;
-        }
-        pCP++;
-      }
-      if (pCurFont != NULL && iCurCount) {
-        pFxFont = (CFX_Font*)pCurFont->GetDevFont();
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-        FxFont.SetFace(pFxFont->GetFace());
-        FX_BOOL bRet = m_pDevice->DrawNormalText(
-            iCurCount, pCurCP, &FxFont, pCache, -fFontSize,
-            (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE);
-        FxFont.SetSubstFont(nullptr);
-        FxFont.SetFace(nullptr);
-        return bRet;
-#else
-        return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache,
-                                         -fFontSize, (const CFX_Matrix*)pMatrix,
-                                         argb, FXTEXT_CLEARTYPE);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      }
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      FxFont.SetSubstFont(nullptr);
-      FxFont.SetFace(nullptr);
-#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      return TRUE;
-    } break;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen,
-                                    FX_FLOAT fPenWidth,
-                                    const CFX_PointF& pt1,
-                                    const CFX_PointF& pt2,
-                                    const CFX_PointF& pt3,
-                                    const CFX_PointF& pt4,
-                                    const CFX_Matrix* pMatrix) {
-  CFX_PointsF points;
-  points.Add(pt1);
-  points.Add(pt2);
-  points.Add(pt3);
-  points.Add(pt4);
-  CFDE_Path path;
-  path.AddBezier(points);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   const CFX_PointsF& points,
-                                   FX_BOOL bClosed,
-                                   FX_FLOAT fTension,
-                                   const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddCurve(points, bClosed, fTension);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen,
-                                     FX_FLOAT fPenWidth,
-                                     const CFX_RectF& rect,
-                                     const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddEllipse(rect);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   const CFX_PointsF& points,
-                                   const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddLines(points);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen,
-                                  FX_FLOAT fPenWidth,
-                                  const CFX_PointF& pt1,
-                                  const CFX_PointF& pt2,
-                                  const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddLine(pt1, pt2);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen,
-                                  FX_FLOAT fPenWidth,
-                                  const IFDE_Path* pPath,
-                                  const CFX_Matrix* pMatrix) {
-  CFDE_Path* pGePath = (CFDE_Path*)pPath;
-  if (pGePath == NULL) {
-    return FALSE;
-  }
-  CFX_GraphStateData graphState;
-  if (!CreatePen(pPen, fPenWidth, graphState)) {
-    return FALSE;
-  }
-  return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix,
-                             &graphState, 0, pPen->GetColor(), 0);
-}
-FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen,
-                                     FX_FLOAT fPenWidth,
-                                     const CFX_PointsF& points,
-                                     const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddPolygon(points);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen,
-                                       FX_FLOAT fPenWidth,
-                                       const CFX_RectF& rect,
-                                       const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddRectangle(rect);
-  return DrawPath(pPen, fPenWidth, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush,
-                                         const CFX_PointsF& points,
-                                         FX_FLOAT fTension,
-                                         const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddCurve(points, TRUE, fTension);
-  return FillPath(pBrush, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush,
-                                     const CFX_RectF& rect,
-                                     const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddEllipse(rect);
-  return FillPath(pBrush, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush* pBrush,
-                                     const CFX_PointsF& points,
-                                     const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddPolygon(points);
-  return FillPath(pBrush, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush* pBrush,
-                                       const CFX_RectF& rect,
-                                       const CFX_Matrix* pMatrix) {
-  CFDE_Path path;
-  path.AddRectangle(rect);
-  return FillPath(pBrush, &path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen,
-                                   FX_FLOAT fPenWidth,
-                                   CFX_GraphStateData& graphState) {
-  if (pPen == NULL) {
-    return FALSE;
-  }
-  graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap();
-  graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin();
-  graphState.m_LineWidth = fPenWidth;
-  graphState.m_MiterLimit = pPen->GetMiterLimit();
-  graphState.m_DashPhase = pPen->GetDashPhase();
-  CFX_FloatArray dashArray;
-  switch (pPen->GetDashStyle()) {
-    case FDE_DASHSTYLE_Dash:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_Dot:
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_DashDot:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_DashDotDot:
-      dashArray.Add(3);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      dashArray.Add(1);
-      break;
-    case FDE_DASHSTYLE_Customized:
-      pPen->GetDashArray(dashArray);
-      break;
-  }
-  int32_t iDashCount = dashArray.GetSize();
-  if (iDashCount > 0) {
-    graphState.SetDashCount(iDashCount);
-    for (int32_t i = 0; i < iDashCount; ++i) {
-      graphState.m_DashArray[i] = dashArray[i] * fPenWidth;
-    }
-  }
-  return TRUE;
-}
-typedef FX_BOOL (CFDE_FxgeDevice::*pfFillPath)(IFDE_Brush* pBrush,
-                                               const CFX_PathData* pPath,
-                                               const CFX_Matrix* pMatrix);
-static const pfFillPath gs_FillPath[] = {
-    &CFDE_FxgeDevice::FillSolidPath, &CFDE_FxgeDevice::FillHatchPath,
-    &CFDE_FxgeDevice::FillTexturePath, &CFDE_FxgeDevice::FillLinearGradientPath,
-};
-FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush,
-                                  const IFDE_Path* pPath,
-                                  const CFX_Matrix* pMatrix) {
-  CFDE_Path* pGePath = (CFDE_Path*)pPath;
-  if (pGePath == NULL) {
-    return FALSE;
-  }
-  if (pBrush == NULL) {
-    return FALSE;
-  }
-  int32_t iType = pBrush->GetType();
-  if (iType < 0 || iType > FDE_BRUSHTYPE_MAX) {
-    return FALSE;
-  }
-  return (this->*gs_FillPath[iType])(pBrush, &pGePath->m_Path, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush,
-                                       const CFX_PathData* pPath,
-                                       const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid);
-  IFDE_SolidBrush* pSolidBrush = (IFDE_SolidBrush*)pBrush;
-  return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL,
-                             pSolidBrush->GetColor(), 0, FXFILL_WINDING);
-}
-FX_BOOL CFDE_FxgeDevice::FillHatchPath(IFDE_Brush* pBrush,
-                                       const CFX_PathData* pPath,
-                                       const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Hatch);
-  IFDE_HatchBrush* pHatchBrush = (IFDE_HatchBrush*)pBrush;
-  int32_t iStyle = pHatchBrush->GetHatchStyle();
-  if (iStyle < FDE_HATCHSTYLE_Min || iStyle > FDE_HATCHSTYLE_Max) {
-    return FALSE;
-  }
-  CFX_DIBitmap mask;
-  if (!FDE_GetStockHatchMask(iStyle, mask)) {
-    return FALSE;
-  }
-  FX_ARGB dwForeColor = pHatchBrush->GetColor(TRUE);
-  FX_ARGB dwBackColor = pHatchBrush->GetColor(FALSE);
-  CFX_FloatRect rectf = pPath->GetBoundingBox();
-  if (pMatrix) {
-    rectf.Transform((const CFX_Matrix*)pMatrix);
-  }
-  FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
-               FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
-  m_pDevice->SaveState();
-  m_pDevice->StartRendering();
-  m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix,
-                              FXFILL_WINDING);
-  m_pDevice->FillRect(&rect, dwBackColor);
-  for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight())
-    for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) {
-      m_pDevice->SetBitMask(&mask, i, j, dwForeColor);
-    }
-  m_pDevice->EndRendering();
-  m_pDevice->RestoreState();
-  return TRUE;
-}
-FX_BOOL CFDE_FxgeDevice::FillTexturePath(IFDE_Brush* pBrush,
-                                         const CFX_PathData* pPath,
-                                         const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Texture);
-  IFDE_TextureBrush* pTextureBrush = static_cast<IFDE_TextureBrush*>(pBrush);
-  IFDE_Image* pImage = pTextureBrush->GetImage();
-  if (!pImage)
-    return FALSE;
-
-  CFX_Size size(pImage->GetImageWidth(), pImage->GetImageHeight());
-  CFX_DIBitmap bmp;
-  bmp.Create(size.x, size.y, FXDIB_Argb);
-  if (!pImage->StartLoadImage(&bmp, 0, 0, size.x, size.y, 0, 0, size.x,
-                              size.y)) {
-    return FALSE;
-  }
-  if (pImage->DoLoadImage() < 100) {
-    return FALSE;
-  }
-  pImage->StopLoadImage();
-  return WrapTexture(pTextureBrush->GetWrapMode(), &bmp, pPath, pMatrix);
-}
-FX_BOOL CFDE_FxgeDevice::WrapTexture(int32_t iWrapMode,
-                                     const CFX_DIBitmap* pBitmap,
-                                     const CFX_PathData* pPath,
-                                     const CFX_Matrix* pMatrix) {
-  CFX_FloatRect rectf = pPath->GetBoundingBox();
-  if (pMatrix) {
-    rectf.Transform((const CFX_Matrix*)pMatrix);
-  }
-  FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
-               FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
-  rect.Normalize();
-  if (rect.IsEmpty()) {
-    return FALSE;
-  }
-  m_pDevice->SaveState();
-  m_pDevice->StartRendering();
-  m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix,
-                              FXFILL_WINDING);
-  switch (iWrapMode) {
-    case FDE_WRAPMODE_Tile:
-    case FDE_WRAPMODE_TileFlipX:
-    case FDE_WRAPMODE_TileFlipY:
-    case FDE_WRAPMODE_TileFlipXY: {
-      FX_BOOL bFlipX = iWrapMode == FDE_WRAPMODE_TileFlipXY ||
-                       iWrapMode == FDE_WRAPMODE_TileFlipX;
-      FX_BOOL bFlipY = iWrapMode == FDE_WRAPMODE_TileFlipXY ||
-                       iWrapMode == FDE_WRAPMODE_TileFlipY;
-      const CFX_DIBitmap* pFlip[2][2];
-      pFlip[0][0] = pBitmap;
-      pFlip[0][1] = bFlipX ? pBitmap->FlipImage(TRUE, FALSE) : pBitmap;
-      pFlip[1][0] = bFlipY ? pBitmap->FlipImage(FALSE, TRUE) : pBitmap;
-      pFlip[1][1] =
-          (bFlipX || bFlipY) ? pBitmap->FlipImage(bFlipX, bFlipY) : pBitmap;
-      int32_t iCounterY = 0;
-      for (int32_t j = rect.top; j < rect.bottom; j += pBitmap->GetHeight()) {
-        int32_t indexY = iCounterY++ % 2;
-        int32_t iCounterX = 0;
-        for (int32_t i = rect.left; i < rect.right; i += pBitmap->GetWidth()) {
-          int32_t indexX = iCounterX++ % 2;
-          m_pDevice->SetDIBits(pFlip[indexY][indexX], i, j);
-        }
-      }
-      if (pFlip[0][1] != pFlip[0][0]) {
-        delete pFlip[0][1];
-      }
-      if (pFlip[1][0] != pFlip[0][0]) {
-        delete pFlip[1][0];
-      }
-      if (pFlip[1][1] != pFlip[0][0]) {
-        delete pFlip[1][1];
-      }
-    } break;
-    case FDE_WRAPMODE_Clamp: {
-      m_pDevice->SetDIBits(pBitmap, rect.left, rect.bottom);
-    } break;
-  }
-  m_pDevice->EndRendering();
-  m_pDevice->RestoreState();
-  return TRUE;
-}
-FX_BOOL CFDE_FxgeDevice::FillLinearGradientPath(IFDE_Brush* pBrush,
-                                                const CFX_PathData* pPath,
-                                                const CFX_Matrix* pMatrix) {
-  FXSYS_assert(pPath && pBrush &&
-               pBrush->GetType() == FDE_BRUSHTYPE_LinearGradient);
-  IFDE_LinearGradientBrush* pLinearBrush = (IFDE_LinearGradientBrush*)pBrush;
-  CFX_PointF pt0, pt1;
-  pLinearBrush->GetLinearPoints(pt0, pt1);
-  CFX_VectorF fDiagonal(pt0, pt1);
-  FX_FLOAT fTheta = FXSYS_atan2(fDiagonal.y, fDiagonal.x);
-  FX_FLOAT fLength = fDiagonal.Length();
-  FX_FLOAT fTotalX = fLength / FXSYS_cos(fTheta);
-  FX_FLOAT fTotalY = fLength / FXSYS_cos(FX_PI / 2 - fTheta);
-  FX_FLOAT fSteps = std::max(fTotalX, fTotalY);
-  FX_FLOAT dx = fTotalX / fSteps;
-  FX_FLOAT dy = fTotalY / fSteps;
-  FX_ARGB cr0, cr1;
-  pLinearBrush->GetLinearColors(cr0, cr1);
-  FX_FLOAT a0 = FXARGB_A(cr0);
-  FX_FLOAT r0 = FXARGB_R(cr0);
-  FX_FLOAT g0 = FXARGB_G(cr0);
-  FX_FLOAT b0 = FXARGB_B(cr0);
-  FX_FLOAT da = (FXARGB_A(cr1) - a0) / fSteps;
-  FX_FLOAT dr = (FXARGB_R(cr1) - r0) / fSteps;
-  FX_FLOAT dg = (FXARGB_G(cr1) - g0) / fSteps;
-  FX_FLOAT db = (FXARGB_B(cr1) - b0) / fSteps;
-  CFX_DIBitmap bmp;
-  bmp.Create(FXSYS_round(FXSYS_fabs(fDiagonal.x)),
-             FXSYS_round(FXSYS_fabs(fDiagonal.y)), FXDIB_Argb);
-  CFX_FxgeDevice dev;
-  dev.Attach(&bmp);
-  pt1 = pt0;
-  int32_t iSteps = FXSYS_round(FXSYS_ceil(fSteps));
-  while (--iSteps >= 0) {
-    cr0 = ArgbEncode(FXSYS_round(a0), FXSYS_round(r0), FXSYS_round(g0),
-                     FXSYS_round(b0));
-    dev.DrawCosmeticLine(pt0.x, pt0.y, pt1.x, pt1.y, cr0);
-    pt1.x += dx;
-    pt0.y += dy;
-    a0 += da;
-    r0 += dr;
-    g0 += dg;
-    b0 += db;
-  }
-  return WrapTexture(pLinearBrush->GetWrapMode(), &bmp, pPath, pMatrix);
-}
diff --git a/xfa/src/fde/fde_gedevice.h b/xfa/src/fde/fde_gedevice.h
deleted file mode 100644
index fa91ab1..0000000
--- a/xfa/src/fde/fde_gedevice.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_GEDEVICE_H_
-#define XFA_SRC_FDE_FDE_GEDEVICE_H_
-
-#include "xfa/src/fde/fde_renderdevice.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class CFDE_FxgeDevice : public IFDE_RenderDevice, public CFX_Target {
- public:
-  CFDE_FxgeDevice(CFX_RenderDevice* pDevice, FX_BOOL bOwnerDevice);
-  ~CFDE_FxgeDevice();
-  virtual void Release() { delete this; }
-
-  virtual int32_t GetWidth() const;
-  virtual int32_t GetHeight() const;
-  virtual FDE_HDEVICESTATE SaveState();
-  virtual void RestoreState(FDE_HDEVICESTATE hState);
-  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip);
-  virtual IFDE_Path* GetClipPath() const;
-  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip);
-  virtual const CFX_RectF& GetClipRect();
-
-  virtual FX_FLOAT GetDpiX() const;
-  virtual FX_FLOAT GetDpiY() const;
-
-  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
-                            const CFX_RectF* pSrcRect,
-                            const CFX_RectF& dstRect,
-                            const CFX_Matrix* pImgMatrix = NULL,
-                            const CFX_Matrix* pDevMatrix = NULL);
-  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
-                             IFX_Font* pFont,
-                             const FXTEXT_CHARPOS* pCharPos,
-                             int32_t iCount,
-                             FX_FLOAT fFontSize,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
-                             FX_FLOAT fPenWidth,
-                             const CFX_PointF& pt1,
-                             const CFX_PointF& pt2,
-                             const CFX_PointF& pt3,
-                             const CFX_PointF& pt4,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            FX_BOOL bClosed,
-                            FX_FLOAT fTension = 0.5f,
-                            const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const CFX_PointF& pt1,
-                           const CFX_PointF& pt2,
-                           const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
-                                FX_FLOAT fPenWidth,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
-                                  const CFX_PointsF& points,
-                                  FX_FLOAT fTension = 0.5f,
-                                  const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL);
-  FX_BOOL FillSolidPath(IFDE_Brush* pBrush,
-                        const CFX_PathData* pPath,
-                        const CFX_Matrix* pMatrix);
-  FX_BOOL FillHatchPath(IFDE_Brush* pBrush,
-                        const CFX_PathData* pPath,
-                        const CFX_Matrix* pMatrix);
-  FX_BOOL FillTexturePath(IFDE_Brush* pBrush,
-                          const CFX_PathData* pPath,
-                          const CFX_Matrix* pMatrix);
-  FX_BOOL FillLinearGradientPath(IFDE_Brush* pBrush,
-                                 const CFX_PathData* pPath,
-                                 const CFX_Matrix* pMatrix);
-  FX_BOOL DrawSolidString(IFDE_Brush* pBrush,
-                          IFX_Font* pFont,
-                          const FXTEXT_CHARPOS* pCharPos,
-                          int32_t iCount,
-                          FX_FLOAT fFontSize,
-                          const CFX_Matrix* pMatrix);
-  FX_BOOL DrawStringPath(IFDE_Brush* pBrush,
-                         IFX_Font* pFont,
-                         const FXTEXT_CHARPOS* pCharPos,
-                         int32_t iCount,
-                         FX_FLOAT fFontSize,
-                         const CFX_Matrix* pMatrix);
-
- protected:
-  FX_BOOL CreatePen(IFDE_Pen* pPen,
-                    FX_FLOAT fPenWidth,
-                    CFX_GraphStateData& graphState);
-  FX_BOOL WrapTexture(int32_t iWrapMode,
-                      const CFX_DIBitmap* pBitmap,
-                      const CFX_PathData* pPath,
-                      const CFX_Matrix* pMatrix);
-  CFX_RenderDevice* m_pDevice;
-  CFX_RectF m_rtClip;
-  FX_BOOL m_bOwnerDevice;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharCount;
-};
-
-#endif  // XFA_SRC_FDE_FDE_GEDEVICE_H_
diff --git a/xfa/src/fde/fde_geobject.cpp b/xfa/src/fde/fde_geobject.cpp
deleted file mode 100644
index 3170692..0000000
--- a/xfa/src/fde/fde_geobject.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_geobject.h"
-
-#include "xfa/src/fde/fde_object.h"
-
-IFDE_Path* IFDE_Path::Create() {
-  return new CFDE_Path;
-}
-FX_BOOL CFDE_Path::StartFigure() {
-  return CloseFigure();
-}
-FX_BOOL CFDE_Path::CloseFigure() {
-  FX_PATHPOINT* pPoint = GetLastPoint();
-  if (pPoint) {
-    pPoint->m_Flag |= FXPT_CLOSEFIGURE;
-  }
-  return TRUE;
-}
-FX_PATHPOINT* CFDE_Path::GetLastPoint(int32_t iCount) const {
-  if (iCount < 1) {
-    return NULL;
-  }
-  int32_t iPoints = m_Path.GetPointCount();
-  if (iCount > iPoints) {
-    return NULL;
-  }
-  return m_Path.GetPoints() + iPoints - iCount;
-}
-FX_BOOL CFDE_Path::FigureClosed() const {
-  FX_PATHPOINT* pPoint = GetLastPoint();
-  return pPoint ? (pPoint->m_Flag & FXPT_CLOSEFIGURE) : TRUE;
-}
-FX_PATHPOINT* CFDE_Path::AddPoints(int32_t iCount) {
-  if (iCount < 1) {
-    return NULL;
-  }
-  int32_t iPoints = m_Path.GetPointCount();
-  m_Path.AddPointCount(iCount);
-  return m_Path.GetPoints() + iPoints;
-}
-void CFDE_Path::MoveTo(FX_FLOAT fx, FX_FLOAT fy) {
-  FX_PATHPOINT* pPoint = AddPoints(1);
-  pPoint->m_PointX = fx;
-  pPoint->m_PointY = fy;
-  pPoint->m_Flag = FXPT_MOVETO;
-}
-void CFDE_Path::LineTo(FX_FLOAT fx, FX_FLOAT fy) {
-  FX_PATHPOINT* pPoint = AddPoints(1);
-  pPoint->m_PointX = fx;
-  pPoint->m_PointY = fy;
-  pPoint->m_Flag = FXPT_LINETO;
-}
-void CFDE_Path::BezierTo(const CFX_PointF& p1,
-                         const CFX_PointF& p2,
-                         const CFX_PointF& p3) {
-  FX_PATHPOINT* p = AddPoints(3);
-  p[0].m_PointX = p1.x;
-  p[0].m_PointY = p1.y;
-  p[0].m_Flag = FXPT_BEZIERTO;
-  p[1].m_PointX = p2.x;
-  p[1].m_PointY = p2.y;
-  p[1].m_Flag = FXPT_BEZIERTO;
-  p[2].m_PointX = p3.x;
-  p[2].m_PointY = p3.y;
-  p[2].m_Flag = FXPT_BEZIERTO;
-}
-void CFDE_Path::ArcTo(FX_BOOL bStart,
-                      const CFX_RectF& rect,
-                      FX_FLOAT startAngle,
-                      FX_FLOAT endAngle) {
-  FX_FLOAT rx = rect.width / 2;
-  FX_FLOAT ry = rect.height / 2;
-  FX_FLOAT cx = rect.left + rx;
-  FX_FLOAT cy = rect.top + ry;
-  FX_FLOAT alpha =
-      FXSYS_atan2(rx * FXSYS_sin(startAngle), ry * FXSYS_cos(startAngle));
-  FX_FLOAT beta =
-      FXSYS_atan2(rx * FXSYS_sin(endAngle), ry * FXSYS_cos(endAngle));
-  if (FXSYS_fabs(beta - alpha) > FX_PI) {
-    if (beta > alpha) {
-      beta -= 2 * FX_PI;
-    } else {
-      alpha -= 2 * FX_PI;
-    }
-  }
-  FX_FLOAT half_delta = (beta - alpha) / 2;
-  FX_FLOAT bcp = 4.0f / 3 * (1 - FXSYS_cos(half_delta)) / FXSYS_sin(half_delta);
-  FX_FLOAT sin_alpha = FXSYS_sin(alpha);
-  FX_FLOAT sin_beta = FXSYS_sin(beta);
-  FX_FLOAT cos_alpha = FXSYS_cos(alpha);
-  FX_FLOAT cos_beta = FXSYS_cos(beta);
-  if (bStart)
-    MoveTo(CFX_PointF(cx + rx * cos_alpha, cy + ry * sin_alpha));
-
-  BezierTo(CFX_PointF(cx + rx * (cos_alpha - bcp * sin_alpha),
-                      cy + ry * (sin_alpha + bcp * cos_alpha)),
-           CFX_PointF(cx + rx * (cos_beta + bcp * sin_beta),
-                      cy + ry * (sin_beta - bcp * cos_beta)),
-           CFX_PointF(cx + rx * cos_beta, cy + ry * sin_beta));
-}
-
-void CFDE_Path::AddBezier(const CFX_PointsF& points) {
-  if (points.GetSize() != 4) {
-    return;
-  }
-  const CFX_PointF* p = points.GetData();
-  MoveTo(p[0]);
-  BezierTo(p[1], p[2], p[3]);
-}
-void CFDE_Path::AddBeziers(const CFX_PointsF& points) {
-  int32_t iCount = points.GetSize();
-  if (iCount < 4) {
-    return;
-  }
-  const CFX_PointF* p = points.GetData();
-  const CFX_PointF* pEnd = p + iCount;
-  MoveTo(p[0]);
-  for (++p; p <= pEnd - 3; p += 3) {
-    BezierTo(p[0], p[1], p[2]);
-  }
-}
-void CFDE_Path::GetCurveTangents(const CFX_PointsF& points,
-                                 CFX_PointsF& tangents,
-                                 FX_BOOL bClosed,
-                                 FX_FLOAT fTension) const {
-  int32_t iCount = points.GetSize();
-  tangents.SetSize(iCount);
-  if (iCount < 3) {
-    return;
-  }
-  FX_FLOAT fCoefficient = fTension / 3.0f;
-  const CFX_PointF* pPoints = points.GetData();
-  CFX_PointF* pTangents = tangents.GetData();
-  for (int32_t i = 0; i < iCount; ++i) {
-    int32_t r = i + 1;
-    int32_t s = i - 1;
-    if (r >= iCount) {
-      r = bClosed ? (r - iCount) : (iCount - 1);
-    }
-    if (s < 0) {
-      s = bClosed ? (s + iCount) : 0;
-    }
-    pTangents[i].x += (fCoefficient * (pPoints[r].x - pPoints[s].x));
-    pTangents[i].y += (fCoefficient * (pPoints[r].y - pPoints[s].y));
-  }
-}
-void CFDE_Path::AddCurve(const CFX_PointsF& points,
-                         FX_BOOL bClosed,
-                         FX_FLOAT fTension) {
-  int32_t iLast = points.GetUpperBound();
-  if (iLast < 1) {
-    return;
-  }
-  CFX_PointsF tangents;
-  GetCurveTangents(points, tangents, bClosed, fTension);
-  const CFX_PointF* pPoints = points.GetData();
-  CFX_PointF* pTangents = tangents.GetData();
-  MoveTo(pPoints[0]);
-  for (int32_t i = 0; i < iLast; ++i) {
-    BezierTo(CFX_PointF(pPoints[i].x + pTangents[i].x,
-                        pPoints[i].y + pTangents[i].y),
-             CFX_PointF(pPoints[i + 1].x - pTangents[i + 1].x,
-                        pPoints[i + 1].y - pTangents[i + 1].y),
-             CFX_PointF(pPoints[i + 1].x, pPoints[i + 1].y));
-  }
-  if (bClosed) {
-    BezierTo(CFX_PointF(pPoints[iLast].x + pTangents[iLast].x,
-                        pPoints[iLast].y + pTangents[iLast].y),
-             CFX_PointF(pPoints[0].x - pTangents[0].x,
-                        pPoints[0].y - pTangents[0].y),
-             CFX_PointF(pPoints[0].x, pPoints[0].y));
-    CloseFigure();
-  }
-}
-void CFDE_Path::AddEllipse(const CFX_RectF& rect) {
-  FX_FLOAT fStartAngle = 0;
-  FX_FLOAT fEndAngle = FX_PI / 2;
-  for (int32_t i = 0; i < 4; ++i) {
-    ArcTo(i == 0, rect, fStartAngle, fEndAngle);
-    fStartAngle += FX_PI / 2;
-    fEndAngle += FX_PI / 2;
-  }
-  CloseFigure();
-}
-void CFDE_Path::AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) {
-  FX_PATHPOINT* pLast = GetLastPoint();
-  if (pLast == NULL || FXSYS_fabs(pLast->m_PointX - pt1.x) > 0.001 ||
-      FXSYS_fabs(pLast->m_PointY - pt1.y) > 0.001) {
-    MoveTo(pt1);
-  }
-  LineTo(pt2);
-}
-void CFDE_Path::AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) {
-  CFDE_Path* pPath = (CFDE_Path*)pSrc;
-  if (pPath == NULL) {
-    return;
-  }
-  int32_t iCount = pPath->m_Path.GetPointCount();
-  if (iCount < 1) {
-    return;
-  }
-  if (bConnect) {
-    LineTo(pPath->m_Path.GetPointX(0), pPath->m_Path.GetPointY(0));
-  }
-  m_Path.Append(&pPath->m_Path, NULL);
-}
-void CFDE_Path::AddPolygon(const CFX_PointsF& points) {
-  int32_t iCount = points.GetSize();
-  if (iCount < 2) {
-    return;
-  }
-  AddLines(points);
-  const CFX_PointF* p = points.GetData();
-  if (FXSYS_fabs(p[0].x - p[iCount - 1].x) < 0.01f ||
-      FXSYS_fabs(p[0].y - p[iCount - 1].y) < 0.01f) {
-    LineTo(p[0]);
-  }
-  CloseFigure();
-}
-void CFDE_Path::AddLines(const CFX_PointsF& points) {
-  int32_t iCount = points.GetSize();
-  if (iCount < 2) {
-    return;
-  }
-  const CFX_PointF* p = points.GetData();
-  const CFX_PointF* pEnd = p + iCount;
-  MoveTo(p[0]);
-  for (++p; p < pEnd; ++p) {
-    LineTo(*p);
-  }
-}
-void CFDE_Path::AddRectangle(const CFX_RectF& rect) {
-  MoveTo(rect.TopLeft());
-  LineTo(rect.TopRight());
-  LineTo(rect.BottomRight());
-  LineTo(rect.BottomLeft());
-  CloseFigure();
-}
-void CFDE_Path::GetBBox(CFX_RectF& bbox) const {
-  CFX_FloatRect rect = m_Path.GetBoundingBox();
-  bbox.Set(rect.left, rect.top, rect.Width(), rect.Height());
-  bbox.Normalize();
-}
-void CFDE_Path::GetBBox(CFX_RectF& bbox,
-                        FX_FLOAT fLineWidth,
-                        FX_FLOAT fMiterLimit) const {
-  CFX_FloatRect rect = m_Path.GetBoundingBox(fLineWidth, fMiterLimit);
-  bbox.Set(rect.left, rect.top, rect.Width(), rect.Height());
-  bbox.Normalize();
-}
diff --git a/xfa/src/fde/fde_geobject.h b/xfa/src/fde/fde_geobject.h
deleted file mode 100644
index 1f5cc4d..0000000
--- a/xfa/src/fde/fde_geobject.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_GEOBJECT_H_
-#define XFA_SRC_FDE_FDE_GEOBJECT_H_
-
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fde/fde_path.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class CFDE_Path : public IFDE_Path, public CFX_Target {
- public:
-  virtual void Release() { delete this; }
-
-  virtual FX_BOOL StartFigure();
-  virtual FX_BOOL CloseFigure();
-
-  virtual void AddBezier(const CFX_PointsF& points);
-  virtual void AddBeziers(const CFX_PointsF& points);
-  virtual void AddCurve(const CFX_PointsF& points,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension = 0.5f);
-  virtual void AddEllipse(const CFX_RectF& rect);
-  virtual void AddLines(const CFX_PointsF& points);
-  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2);
-  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect);
-  virtual void AddPolygon(const CFX_PointsF& points);
-  virtual void AddRectangle(const CFX_RectF& rect);
-  virtual void GetBBox(CFX_RectF& bbox) const;
-  virtual void GetBBox(CFX_RectF& bbox,
-                       FX_FLOAT fLineWidth,
-                       FX_FLOAT fMiterLimit) const;
-  FX_PATHPOINT* AddPoints(int32_t iCount);
-  FX_PATHPOINT* GetLastPoint(int32_t iCount = 1) const;
-  FX_BOOL FigureClosed() const;
-  void MoveTo(FX_FLOAT fx, FX_FLOAT fy);
-  void LineTo(FX_FLOAT fx, FX_FLOAT fy);
-  void BezierTo(const CFX_PointF& p1,
-                const CFX_PointF& p2,
-                const CFX_PointF& p3);
-  void ArcTo(FX_BOOL bStart,
-             const CFX_RectF& rect,
-             FX_FLOAT startAngle,
-             FX_FLOAT endAngle);
-  void MoveTo(const CFX_PointF& p0) { MoveTo(p0.x, p0.y); }
-  void LineTo(const CFX_PointF& p1) { LineTo(p1.x, p1.y); }
-  void GetCurveTangents(const CFX_PointsF& points,
-                        CFX_PointsF& tangents,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension) const;
-  CFX_PathData m_Path;
-};
-
-#endif  // XFA_SRC_FDE_FDE_GEOBJECT_H_
diff --git a/xfa/src/fde/fde_image.h b/xfa/src/fde/fde_image.h
deleted file mode 100644
index a9f16de..0000000
--- a/xfa/src/fde/fde_image.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_IMAGE_H_
-#define XFA_SRC_FDE_FDE_IMAGE_H_
-
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-class IFDE_Image {
- public:
-  virtual ~IFDE_Image() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL LoadImage() = 0;
-  virtual void FreeImage() = 0;
-  virtual int32_t CountFrames() const = 0;
-  virtual FX_BOOL LoadFrame(int32_t index) = 0;
-  virtual CFX_DIBitmap* GetFrameImage() = 0;
-  virtual int32_t GetImageFormat() const = 0;
-  virtual int32_t GetImageWidth() const = 0;
-  virtual int32_t GetImageHeight() const = 0;
-  virtual int32_t GetDelayTime(int32_t iFrameIndex) const = 0;
-  virtual int32_t GetLoopCount() const = 0;
-  virtual FX_BOOL StartLoadImage(CFX_DIBitmap* pDIBitmap,
-                                 int32_t dibX,
-                                 int32_t dibY,
-                                 int32_t dibCX,
-                                 int32_t dibCY,
-                                 int32_t imgX,
-                                 int32_t imgY,
-                                 int32_t imgCX,
-                                 int32_t imgCY,
-                                 int32_t iFrameIndex = 0) = 0;
-  virtual int32_t DoLoadImage(IFX_Pause* pPause = NULL) = 0;
-  virtual void StopLoadImage() = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_IMAGE_H_
diff --git a/xfa/src/fde/fde_iterator.cpp b/xfa/src/fde/fde_iterator.cpp
deleted file mode 100644
index 71be02e..0000000
--- a/xfa/src/fde/fde_iterator.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_iterator.h"
-
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create() {
-  return new CFDE_VisualSetIterator;
-}
-CFDE_VisualSetIterator::CFDE_VisualSetIterator() : m_dwFilter(0) {}
-CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {
-  m_CanvasStack.RemoveAll();
-}
-FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet* pCanvas) {
-  FXSYS_assert(pCanvas != NULL);
-  m_CanvasStack.RemoveAll();
-  FDE_CANVASITEM canvas;
-  canvas.hCanvas = NULL;
-  canvas.pCanvas = pCanvas;
-  canvas.hPos = pCanvas->GetFirstPosition(NULL);
-  if (canvas.hPos == NULL) {
-    return FALSE;
-  }
-  return m_CanvasStack.Push(canvas) == 0;
-}
-FX_BOOL CFDE_VisualSetIterator::FilterObjects(FX_DWORD dwObjects) {
-  if (m_CanvasStack.GetSize() == 0) {
-    return FALSE;
-  }
-  while (m_CanvasStack.GetSize() > 1) {
-    m_CanvasStack.Pop();
-  }
-  m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget;
-  if (dwObjects & FDE_VISUALOBJ_Widget) {
-    m_dwFilter |= 0xFF00;
-  }
-  FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
-  FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
-  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);
-  return pCanvas->hPos != NULL;
-}
-void CFDE_VisualSetIterator::Reset() {
-  FilterObjects(m_dwFilter);
-}
-FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet*& pVisualSet,
-                                               FDE_HVISUALOBJ* phCanvasObj,
-                                               IFDE_CanvasSet** ppCanvasSet) {
-  while (m_CanvasStack.GetSize() > 0) {
-    FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
-    FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
-    if (pCanvas->hPos == NULL) {
-      if (m_CanvasStack.GetSize() == 1) {
-        break;
-      }
-      m_CanvasStack.Pop();
-      continue;
-    }
-    do {
-      FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(
-          pCanvas->hCanvas, pCanvas->hPos, pVisualSet);
-      FXSYS_assert(hObj != NULL);
-      FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
-      if (eType == FDE_VISUALOBJ_Canvas) {
-        FDE_CANVASITEM canvas;
-        canvas.hCanvas = hObj;
-        canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;
-        canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj);
-        m_CanvasStack.Push(canvas);
-        break;
-      }
-      FX_DWORD dwObj =
-          (eType == FDE_VISUALOBJ_Widget)
-              ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj)
-              : (FX_DWORD)eType;
-      if ((m_dwFilter & dwObj) != 0) {
-        if (ppCanvasSet) {
-          *ppCanvasSet = pCanvas->pCanvas;
-        }
-        if (phCanvasObj) {
-          *phCanvasObj = pCanvas->hCanvas;
-        }
-        return hObj;
-      }
-    } while (pCanvas->hPos != NULL);
-  }
-  if (ppCanvasSet) {
-    *ppCanvasSet = NULL;
-  }
-  if (phCanvasObj) {
-    *phCanvasObj = NULL;
-  }
-  pVisualSet = NULL;
-  return NULL;
-}
diff --git a/xfa/src/fde/fde_iterator.h b/xfa/src/fde/fde_iterator.h
deleted file mode 100644
index 2bb4c1a..0000000
--- a/xfa/src/fde/fde_iterator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_ITERATOR_H_
-#define XFA_SRC_FDE_FDE_ITERATOR_H_
-
-#include "xfa/src/fde/fde_visualset.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-struct FDE_CANVASITEM {
-  IFDE_CanvasSet* pCanvas;
-  FDE_HVISUALOBJ hCanvas;
-  FX_POSITION hPos;
-};
-
-class CFDE_VisualSetIterator : public IFDE_VisualSetIterator,
-                               public CFX_Target {
- public:
-  CFDE_VisualSetIterator();
-  ~CFDE_VisualSetIterator();
-  virtual void Release() { delete this; }
-
-  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas);
-  virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF);
-
-  virtual void Reset();
-  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
-                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
-                                 IFDE_CanvasSet** ppCanvasSet = NULL);
-
- protected:
-  FX_DWORD m_dwFilter;
-  CFX_StackTemplate<FDE_CANVASITEM> m_CanvasStack;
-};
-
-#endif  // XFA_SRC_FDE_FDE_ITERATOR_H_
diff --git a/xfa/src/fde/fde_object.cpp b/xfa/src/fde/fde_object.cpp
deleted file mode 100644
index 1350ae9..0000000
--- a/xfa/src/fde/fde_object.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_object.h"
-
-IFDE_Pen* IFDE_Pen::Create() {
-  return new CFDE_Pen();
-}
-IFDE_Brush* IFDE_Brush::Create(int32_t iType) {
-  switch (iType) {
-    case FDE_BRUSHTYPE_Solid:
-      return new CFDE_SolidBrush;
-    case FDE_BRUSHTYPE_Hatch:
-      return new CFDE_HatchBrush;
-    case FDE_BRUSHTYPE_Texture:
-      return new CFDE_TextureBrush;
-    case FDE_BRUSHTYPE_LinearGradient:
-      return new CFDE_LinearBrush;
-    default:
-      return NULL;
-  }
-}
diff --git a/xfa/src/fde/fde_object.h b/xfa/src/fde/fde_object.h
deleted file mode 100644
index d9e5737..0000000
--- a/xfa/src/fde/fde_object.h
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_OBJECT_H_
-#define XFA_SRC_FDE_FDE_OBJECT_H_
-
-#include <cstdint>
-
-#include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fde/fde_brush.h"
-#include "xfa/src/fde/fde_pen.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class CFDE_Pen : public IFDE_Pen, public CFX_Target {
- public:
-  CFDE_Pen()
-      : m_Color(0),
-        m_iLineCap(0),
-        m_iLineJoin(0),
-        m_iDashStyle(0),
-        m_fDashPhase(0),
-        m_fMiterLimit(10),
-        m_bAutoRelease(FALSE),
-        m_pBrush(NULL) {}
-
-  ~CFDE_Pen() {
-    if (m_pBrush && m_bAutoRelease) {
-      m_pBrush->Release();
-    }
-  }
-  virtual void Release() { delete this; }
-
-  virtual int32_t GetType() const {
-    return m_pBrush ? m_pBrush->GetType() : FDE_PENTYPE_SolidColor;
-  }
-
-  virtual FX_ARGB GetColor() const { return m_Color; }
-  virtual void SetColor(FX_ARGB color) { m_Color = color; }
-  virtual IFDE_Brush* GetBrush() const { return m_pBrush; }
-  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) {
-    m_bAutoRelease = bAutoRelease;
-    m_pBrush = pBrush;
-    if (m_pBrush && m_pBrush->GetType() == FDE_BRUSHTYPE_Solid) {
-      m_Color = ((IFDE_SolidBrush*)m_pBrush)->GetColor();
-    }
-  }
-  virtual int32_t GetLineCap() const { return m_iLineCap; }
-  virtual void SetLineCap(int32_t iLineCap) { m_iLineCap = iLineCap; }
-  virtual int32_t GetDashStyle() const { return m_iDashStyle; }
-  virtual void SetDashStyle(int32_t iDashStyle) { m_iDashStyle = iDashStyle; }
-  virtual FX_FLOAT GetDashPhase() const { return m_fDashPhase; }
-  virtual void SetDashPhase(FX_FLOAT fPhase) { m_fDashPhase = fPhase; }
-  virtual int32_t CountDashArray() const { return m_DashArray.GetSize(); }
-  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const {
-    dashArray.Copy(m_DashArray);
-    return dashArray.GetSize();
-  }
-  virtual void SetDashArray(const CFX_FloatArray& dashArray) {
-    m_DashArray.Copy(dashArray);
-  }
-  virtual int32_t GetLineJoin() const { return m_iLineJoin; }
-  virtual void SetLineJoin(int32_t iLineJoin) { m_iLineJoin = iLineJoin; }
-  virtual FX_FLOAT GetMiterLimit() const { return m_fMiterLimit; }
-  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) {
-    m_fMiterLimit = fMiterLimit;
-  }
-  virtual int32_t CountCompoundPatterns() const {
-    return m_CompoundPatterns.GetSize();
-  }
-  virtual FX_BOOL GetCompoundPatterns(
-      CFDE_CompoundPatterns& compoundPatterns) const {
-    return compoundPatterns.Copy(m_CompoundPatterns), TRUE;
-  }
-  virtual FX_BOOL SetCompoundPatterns(
-      const CFDE_CompoundPatterns& compoundPatterns) {
-    return m_CompoundPatterns.Copy(compoundPatterns), TRUE;
-  }
-
-  FX_ARGB m_Color;
-  int32_t m_iLineCap;
-  int32_t m_iLineJoin;
-  int32_t m_iDashStyle;
-  FX_FLOAT m_fDashPhase;
-  FX_FLOAT m_fMiterLimit;
-  FX_BOOL m_bAutoRelease;
-  IFDE_Brush* m_pBrush;
-  CFX_FloatArray m_DashArray;
-  CFDE_CompoundPatterns m_CompoundPatterns;
-};
-class CFDE_SolidBrush : public IFDE_SolidBrush, public CFX_Target {
- public:
-  CFDE_SolidBrush() : m_Color(0xFF000000) { m_Matrix.SetIdentity(); }
-
-  virtual void Release() { delete this; }
-  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Solid; }
-  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
-  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
-    m_Matrix.Translate(dx, dy);
-  }
-  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
-    m_Matrix.Concat(matrix);
-  }
-  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
-  virtual FX_ARGB GetColor() const { return m_Color; }
-  virtual void SetColor(FX_ARGB color) { m_Color = color; }
-
-  FX_ARGB m_Color;
-  CFX_Matrix m_Matrix;
-};
-class CFDE_HatchBrush : public IFDE_HatchBrush, public CFX_Target {
- public:
-  CFDE_HatchBrush() : m_iStyle(-1), m_BackColor(0), m_ForeColor(0) {
-    m_Matrix.SetIdentity();
-  }
-
-  virtual void Release() { delete this; }
-  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Hatch; }
-  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
-  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
-    m_Matrix.Translate(dx, dy);
-  }
-  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
-    m_Matrix.Concat(matrix);
-  }
-  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
-  virtual FX_ARGB GetColor(FX_BOOL bForegroundColor) const {
-    return bForegroundColor ? m_ForeColor : m_BackColor;
-  }
-  virtual void SetColor(FX_ARGB color, FX_BOOL bForegroundColor) {
-    if (bForegroundColor) {
-      m_ForeColor = color;
-    } else {
-      m_BackColor = color;
-    }
-  }
-
-  virtual int32_t GetHatchStyle() const { return m_iStyle; }
-  virtual FX_BOOL SetHatchStyle(int32_t iHatchStyle) {
-    m_iStyle = iHatchStyle;
-    return m_iStyle >= FDE_HATCHSTYLE_Min && m_iStyle <= FDE_HATCHSTYLE_Max;
-  }
-  int32_t m_iStyle;
-  FX_ARGB m_BackColor;
-  FX_ARGB m_ForeColor;
-  CFX_Matrix m_Matrix;
-};
-class CFDE_TextureBrush : public IFDE_TextureBrush, public CFX_Target {
- public:
-  CFDE_TextureBrush() : m_iWrap(0), m_pImage(NULL), m_bAutoRelease(FALSE) {
-    m_Matrix.SetIdentity();
-  }
-
-  virtual void Release() { delete this; }
-  virtual int32_t GetType() const { return FDE_BRUSHTYPE_Texture; }
-  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
-  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
-    m_Matrix.Translate(dx, dy);
-  }
-  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
-    m_Matrix.Concat(matrix);
-  }
-  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
-  virtual IFDE_Image* GetImage() const { return m_pImage; }
-  virtual void SetImage(IFDE_Image* pImage, FX_BOOL bAutoRelease) {
-    m_pImage = pImage;
-    m_bAutoRelease = bAutoRelease;
-  }
-  virtual int32_t GetWrapMode() const { return m_iWrap; }
-  virtual void SetWrapMode(int32_t iWrapMode) { m_iWrap = iWrapMode; }
-  int32_t m_iWrap;
-  IFDE_Image* m_pImage;
-  FX_BOOL m_bAutoRelease;
-  CFX_Matrix m_Matrix;
-};
-class CFDE_LinearBrush : public IFDE_LinearGradientBrush, public CFX_Target {
- public:
-  CFDE_LinearBrush() : m_EndColor(0), m_StartColor(0), m_iWrapMode(0) {
-    m_StartPoint.x = m_StartPoint.y = m_EndPoint.x = m_EndPoint.y = 0;
-    m_Matrix.SetIdentity();
-  }
-
-  virtual void Release() { delete this; }
-  virtual int32_t GetType() const { return FDE_BRUSHTYPE_LinearGradient; }
-  virtual const CFX_Matrix& GetMatrix() const { return m_Matrix; }
-  virtual void ResetMatrix() { m_Matrix.SetIdentity(); }
-  virtual void TranslateMatrix(FX_FLOAT dx, FX_FLOAT dy) {
-    m_Matrix.Translate(dx, dy);
-  }
-  virtual void RotateMatrix(FX_FLOAT fRadian) { m_Matrix.Rotate(fRadian); }
-  virtual void ScaleMatrix(FX_FLOAT sx, FX_FLOAT sy) { m_Matrix.Scale(sx, sy); }
-  virtual void ConcatMatrix(const CFX_Matrix& matrix) {
-    m_Matrix.Concat(matrix);
-  }
-  virtual void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
-  virtual void GetLinearPoints(CFX_PointF& startingPoint,
-                               CFX_PointF& endingPoint) const {
-    startingPoint = m_StartPoint;
-    endingPoint = m_EndPoint;
-  }
-  virtual void SetLinearPoints(const CFX_PointF& startingPoint,
-                               const CFX_PointF& endingPoint) {
-    m_StartPoint = startingPoint;
-    m_EndPoint = endingPoint;
-  }
-  virtual void GetLinearColors(FX_ARGB& startingColor,
-                               FX_ARGB& endingColor) const {
-    startingColor = m_StartColor;
-    endingColor = m_EndColor;
-  }
-  virtual void SetLinearColors(const FX_ARGB& startingColor,
-                               const FX_ARGB& endingColor) {
-    m_StartColor = startingColor;
-    m_EndColor = endingColor;
-  }
-  virtual int32_t CountGradientColors() const { return m_GradColors.GetSize(); }
-  virtual FX_BOOL GetGradientColors(CFDE_GradientColors& colors) const {
-    return colors.Copy(m_GradColors), TRUE;
-  }
-  virtual FX_BOOL SetGradientColors(const CFDE_GradientColors& colors) {
-    return m_GradColors.Copy(colors), TRUE;
-  }
-
-  virtual int32_t GetWrapMode() const { return m_iWrapMode; }
-  virtual void SetWrapMode(int32_t iWrapMode) { m_iWrapMode = iWrapMode; }
-  CFX_PointF m_EndPoint;
-  CFX_PointF m_StartPoint;
-  FX_ARGB m_EndColor;
-  FX_ARGB m_StartColor;
-  CFDE_GradientColors m_GradColors;
-  int32_t m_iWrapMode;
-  CFX_Matrix m_Matrix;
-};
-
-#endif  // XFA_SRC_FDE_FDE_OBJECT_H_
diff --git a/xfa/src/fde/fde_path.h b/xfa/src/fde/fde_path.h
deleted file mode 100644
index a6a8d67..0000000
--- a/xfa/src/fde/fde_path.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_PATH_H_
-#define XFA_SRC_FDE_FDE_PATH_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "core/include/fxcrt/fx_system.h"
-
-class IFDE_Path {
- public:
-  static IFDE_Path* Create();
-  virtual ~IFDE_Path() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL StartFigure() = 0;
-  virtual FX_BOOL CloseFigure() = 0;
-  virtual void AddBezier(const CFX_PointsF& points) = 0;
-  virtual void AddBeziers(const CFX_PointsF& points) = 0;
-  virtual void AddCurve(const CFX_PointsF& points,
-                        FX_BOOL bClosed,
-                        FX_FLOAT fTension = 0.5f) = 0;
-  virtual void AddEllipse(const CFX_RectF& rect) = 0;
-  virtual void AddLines(const CFX_PointsF& points) = 0;
-  virtual void AddLine(const CFX_PointF& pt1, const CFX_PointF& pt2) = 0;
-  virtual void AddPath(const IFDE_Path* pSrc, FX_BOOL bConnect) = 0;
-  virtual void AddPolygon(const CFX_PointsF& points) = 0;
-  virtual void AddRectangle(const CFX_RectF& rect) = 0;
-  virtual void GetBBox(CFX_RectF& bbox) const = 0;
-  virtual void GetBBox(CFX_RectF& bbox,
-                       FX_FLOAT fLineWidth,
-                       FX_FLOAT fMiterLimit) const = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_PATH_H_
diff --git a/xfa/src/fde/fde_pen.h b/xfa/src/fde/fde_pen.h
deleted file mode 100644
index adaa2da..0000000
--- a/xfa/src/fde/fde_pen.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_PEN_H_
-#define XFA_SRC_FDE_FDE_PEN_H_
-
-class IFDE_Pen;
-
-#define FDE_PENTYPE_Unknown FDE_BRUSHTYPE_Unknown
-#define FDE_PENTYPE_SolidColor FDE_BRUSHTYPE_Solid
-#define FDE_PENTYPE_HatchBrush FDE_BRUSHTYPE_Hatch
-#define FDE_PENTYPE_TextureBrush FDE_BRUSHTYPE_Texture
-#define FDE_PENTYPE_LinearGradient FDE_BRUSHTYPE_LinearGradient
-#define FDE_PENTYPE_MAX FDE_BRUSHTYPE_MAX
-
-#define FDE_DASHSTYLE_Solid 0
-#define FDE_DASHSTYLE_Dash 1
-#define FDE_DASHSTYLE_Dot 2
-#define FDE_DASHSTYLE_DashDot 3
-#define FDE_DASHSTYLE_DashDotDot 4
-#define FDE_DASHSTYLE_Customized 5
-
-#define FDE_LINEJOIN_Miter 0
-#define FDE_LINEJOIN_Round 1
-#define FDE_LINEJOIN_Bevel 2
-
-#define FDE_LINECAP_Flat 0
-#define FDE_LINECAP_Round 1
-#define FDE_LINECAP_Square 2
-
-struct FDE_COMPOUNDPATTERN {
-  FX_FLOAT pos;
-  FX_FLOAT width;
-};
-typedef CFX_ArrayTemplate<FDE_COMPOUNDPATTERN> CFDE_CompoundPatterns;
-
-class IFDE_Pen {
- public:
-  static IFDE_Pen* Create();
-  virtual ~IFDE_Pen() {}
-  virtual void Release() = 0;
-  virtual int32_t GetType() const = 0;
-  virtual FX_ARGB GetColor() const = 0;
-  virtual void SetColor(FX_ARGB color) = 0;
-  virtual IFDE_Brush* GetBrush() const = 0;
-  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) = 0;
-  virtual int32_t GetLineCap() const = 0;
-  virtual void SetLineCap(int32_t iLineCap) = 0;
-  virtual int32_t GetDashStyle() const = 0;
-  virtual void SetDashStyle(int32_t iDashStyle) = 0;
-  virtual FX_FLOAT GetDashPhase() const = 0;
-  virtual void SetDashPhase(FX_FLOAT fPhase) = 0;
-  virtual int32_t CountDashArray() const = 0;
-  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const = 0;
-  virtual void SetDashArray(const CFX_FloatArray& dashArray) = 0;
-  virtual int32_t GetLineJoin() const = 0;
-  virtual void SetLineJoin(int32_t iLineJoin) = 0;
-  virtual FX_FLOAT GetMiterLimit() const = 0;
-  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) = 0;
-  virtual int32_t CountCompoundPatterns() const = 0;
-  virtual FX_BOOL GetCompoundPatterns(
-      CFDE_CompoundPatterns& compoundPatterns) const = 0;
-  virtual FX_BOOL SetCompoundPatterns(
-      const CFDE_CompoundPatterns& compoundPatterns) = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_PEN_H_
diff --git a/xfa/src/fde/fde_render.cpp b/xfa/src/fde/fde_render.cpp
deleted file mode 100644
index b4330cc..0000000
--- a/xfa/src/fde/fde_render.cpp
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/fde_render.h"
-
-#include "xfa/src/fde/fde_renderdevice.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-#define FDE_PATHRENDER_Stroke 1
-#define FDE_PATHRENDER_Fill 2
-
-namespace {
-
-class CFDE_RenderContext : public IFDE_RenderContext,
-                           public CFX_Target {
- public:
-  CFDE_RenderContext();
-  virtual ~CFDE_RenderContext();
-  virtual void Release() { delete this; }
-  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
-                              IFDE_CanvasSet* pCanvasSet,
-                              const CFX_Matrix& tmDoc2Device);
-  virtual FDE_RENDERSTATUS GetStatus() const { return m_eStatus; }
-  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL);
-  virtual void StopRender();
-  void RenderPath(IFDE_PathSet* pPathSet, FDE_HVISUALOBJ hPath);
-  void RenderText(IFDE_TextSet* pTextSet, FDE_HVISUALOBJ hText);
-  FX_BOOL ApplyClip(IFDE_VisualSet* pVisualSet,
-                    FDE_HVISUALOBJ hObj,
-                    FDE_HDEVICESTATE& hState);
-  void RestoreClip(FDE_HDEVICESTATE hState);
-
- protected:
-  FDE_RENDERSTATUS m_eStatus;
-  IFDE_RenderDevice* m_pRenderDevice;
-  IFDE_SolidBrush* m_pSolidBrush;
-  CFX_Matrix m_Transform;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosCount;
-  IFDE_VisualSetIterator* m_pIterator;
-};
-
-}  // namespace
-
-void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
-                       const CFX_RectF& docPageRect,
-                       const CFX_Rect& devicePageRect,
-                       int32_t iRotate,
-                       FX_DWORD dwCoordinatesType) {
-  FXSYS_assert(iRotate >= 0 && iRotate <= 3);
-  FX_BOOL bFlipX = (dwCoordinatesType & 0x01) != 0;
-  FX_BOOL bFlipY = (dwCoordinatesType & 0x02) != 0;
-  CFX_Matrix m;
-  m.Set((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0);
-  if (iRotate == 0 || iRotate == 2) {
-    m.a *= (FX_FLOAT)devicePageRect.width / docPageRect.width;
-    m.d *= (FX_FLOAT)devicePageRect.height / docPageRect.height;
-  } else {
-    m.a *= (FX_FLOAT)devicePageRect.height / docPageRect.width;
-    m.d *= (FX_FLOAT)devicePageRect.width / docPageRect.height;
-  }
-  m.Rotate(iRotate * 1.57079632675f);
-  switch (iRotate) {
-    case 0:
-      m.e = bFlipX ? (FX_FLOAT)devicePageRect.right()
-                   : (FX_FLOAT)devicePageRect.left;
-      m.f = bFlipY ? (FX_FLOAT)devicePageRect.bottom()
-                   : (FX_FLOAT)devicePageRect.top;
-      break;
-    case 1:
-      m.e = bFlipY ? (FX_FLOAT)devicePageRect.left
-                   : (FX_FLOAT)devicePageRect.right();
-      m.f = bFlipX ? (FX_FLOAT)devicePageRect.bottom()
-                   : (FX_FLOAT)devicePageRect.top;
-      break;
-    case 2:
-      m.e = bFlipX ? (FX_FLOAT)devicePageRect.left
-                   : (FX_FLOAT)devicePageRect.right();
-      m.f = bFlipY ? (FX_FLOAT)devicePageRect.top
-                   : (FX_FLOAT)devicePageRect.bottom();
-      break;
-    case 3:
-      m.e = bFlipY ? (FX_FLOAT)devicePageRect.right()
-                   : (FX_FLOAT)devicePageRect.left;
-      m.f = bFlipX ? (FX_FLOAT)devicePageRect.top
-                   : (FX_FLOAT)devicePageRect.bottom();
-      break;
-    default:
-      break;
-  }
-  pageMatrix = m;
-}
-IFDE_RenderContext* IFDE_RenderContext::Create() {
-  return new CFDE_RenderContext;
-}
-CFDE_RenderContext::CFDE_RenderContext()
-    : m_eStatus(FDE_RENDERSTATUS_Reset),
-      m_pRenderDevice(NULL),
-      m_pSolidBrush(NULL),
-      m_Transform(),
-      m_pCharPos(NULL),
-      m_iCharPosCount(0),
-      m_pIterator(NULL) {
-  m_Transform.SetIdentity();
-}
-CFDE_RenderContext::~CFDE_RenderContext() {
-  StopRender();
-}
-FX_BOOL CFDE_RenderContext::StartRender(IFDE_RenderDevice* pRenderDevice,
-                                        IFDE_CanvasSet* pCanvasSet,
-                                        const CFX_Matrix& tmDoc2Device) {
-  if (m_pRenderDevice != NULL) {
-    return FALSE;
-  }
-  if (pRenderDevice == NULL) {
-    return FALSE;
-  }
-  if (pCanvasSet == NULL) {
-    return FALSE;
-  }
-
-  m_eStatus = FDE_RENDERSTATUS_Paused;
-  m_pRenderDevice = pRenderDevice;
-  m_Transform = tmDoc2Device;
-  if (m_pIterator == NULL) {
-    m_pIterator = IFDE_VisualSetIterator::Create();
-    FXSYS_assert(m_pIterator != NULL);
-  }
-  return m_pIterator->AttachCanvas(pCanvasSet) && m_pIterator->FilterObjects();
-}
-FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) {
-  if (m_pRenderDevice == NULL) {
-    return FDE_RENDERSTATUS_Failed;
-  }
-  if (m_pIterator == NULL) {
-    return FDE_RENDERSTATUS_Failed;
-  }
-  FDE_RENDERSTATUS eStatus = FDE_RENDERSTATUS_Paused;
-  CFX_Matrix rm;
-  rm.SetReverse(m_Transform);
-  CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect();
-  if (rtDocClip.IsEmpty()) {
-    rtDocClip.left = rtDocClip.top = 0;
-    rtDocClip.width = (FX_FLOAT)m_pRenderDevice->GetWidth();
-    rtDocClip.height = (FX_FLOAT)m_pRenderDevice->GetHeight();
-  }
-  rm.TransformRect(rtDocClip);
-  IFDE_VisualSet* pVisualSet;
-  FDE_HVISUALOBJ hVisualObj;
-  CFX_RectF rtObj;
-  int32_t iCount = 0;
-  while (TRUE) {
-    hVisualObj = m_pIterator->GetNext(pVisualSet);
-    if (hVisualObj == NULL || pVisualSet == NULL) {
-      eStatus = FDE_RENDERSTATUS_Done;
-      break;
-    }
-    rtObj.Empty();
-    pVisualSet->GetRect(hVisualObj, rtObj);
-    if (!rtDocClip.IntersectWith(rtObj)) {
-      continue;
-    }
-    switch (pVisualSet->GetType()) {
-      case FDE_VISUALOBJ_Text:
-        RenderText((IFDE_TextSet*)pVisualSet, hVisualObj);
-        iCount += 5;
-        break;
-      case FDE_VISUALOBJ_Path:
-        RenderPath((IFDE_PathSet*)pVisualSet, hVisualObj);
-        iCount += 20;
-        break;
-      case FDE_VISUALOBJ_Widget:
-        iCount += 10;
-        break;
-      case FDE_VISUALOBJ_Canvas:
-        FXSYS_assert(FALSE);
-        break;
-      default:
-        break;
-    }
-    if (iCount >= 100 && pPause != NULL && pPause->NeedToPauseNow()) {
-      eStatus = FDE_RENDERSTATUS_Paused;
-      break;
-    }
-  }
-  return m_eStatus = eStatus;
-}
-void CFDE_RenderContext::StopRender() {
-  m_eStatus = FDE_RENDERSTATUS_Reset;
-  m_pRenderDevice = nullptr;
-  m_Transform.SetIdentity();
-  if (m_pIterator) {
-    m_pIterator->Release();
-    m_pIterator = nullptr;
-  }
-  if (m_pSolidBrush) {
-    m_pSolidBrush->Release();
-    m_pSolidBrush = nullptr;
-  }
-  FX_Free(m_pCharPos);
-  m_pCharPos = nullptr;
-  m_iCharPosCount = 0;
-}
-void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
-                                    FDE_HVISUALOBJ hText) {
-  FXSYS_assert(m_pRenderDevice != NULL);
-  FXSYS_assert(pTextSet != NULL && hText != NULL);
-  IFX_Font* pFont = pTextSet->GetFont(hText);
-  if (pFont == NULL) {
-    return;
-  }
-  int32_t iCount = pTextSet->GetDisplayPos(hText, NULL, FALSE);
-  if (iCount < 1) {
-    return;
-  }
-  if (m_pSolidBrush == NULL) {
-    m_pSolidBrush = (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
-    if (m_pSolidBrush == NULL) {
-      return;
-    }
-  }
-  if (m_pCharPos == NULL) {
-    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iCount);
-  } else if (m_iCharPosCount < iCount) {
-    m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iCount);
-  }
-  if (m_iCharPosCount < iCount) {
-    m_iCharPosCount = iCount;
-  }
-  iCount = pTextSet->GetDisplayPos(hText, m_pCharPos, FALSE);
-  FX_FLOAT fFontSize = pTextSet->GetFontSize(hText);
-  FX_ARGB dwColor = pTextSet->GetFontColor(hText);
-  m_pSolidBrush->SetColor(dwColor);
-  FDE_HDEVICESTATE hState;
-  FX_BOOL bClip = ApplyClip(pTextSet, hText, hState);
-  m_pRenderDevice->DrawString(m_pSolidBrush, pFont, m_pCharPos, iCount,
-                              fFontSize, &m_Transform);
-  if (bClip) {
-    RestoreClip(hState);
-  }
-}
-void CFDE_RenderContext::RenderPath(IFDE_PathSet* pPathSet,
-                                    FDE_HVISUALOBJ hPath) {
-  FXSYS_assert(m_pRenderDevice != NULL);
-  FXSYS_assert(pPathSet != NULL && hPath != NULL);
-  IFDE_Path* pPath = pPathSet->GetPath(hPath);
-  if (pPath == NULL) {
-    return;
-  }
-  FDE_HDEVICESTATE hState;
-  FX_BOOL bClip = ApplyClip(pPathSet, hPath, hState);
-  int32_t iRenderMode = pPathSet->GetRenderMode(hPath);
-  if (iRenderMode & FDE_PATHRENDER_Stroke) {
-    IFDE_Pen* pPen = pPathSet->GetPen(hPath);
-    FX_FLOAT fWidth = pPathSet->GetPenWidth(hPath);
-    if (pPen != NULL && fWidth > 0) {
-      m_pRenderDevice->DrawPath(pPen, fWidth, pPath, &m_Transform);
-    }
-  }
-  if (iRenderMode & FDE_PATHRENDER_Fill) {
-    IFDE_Brush* pBrush = pPathSet->GetBrush(hPath);
-    if (pBrush != NULL) {
-      m_pRenderDevice->FillPath(pBrush, pPath, &m_Transform);
-    }
-  }
-  if (bClip) {
-    RestoreClip(hState);
-  }
-}
-FX_BOOL CFDE_RenderContext::ApplyClip(IFDE_VisualSet* pVisualSet,
-                                      FDE_HVISUALOBJ hObj,
-                                      FDE_HDEVICESTATE& hState) {
-  CFX_RectF rtClip;
-  if (!pVisualSet->GetClip(hObj, rtClip)) {
-    return FALSE;
-  }
-  CFX_RectF rtObj;
-  pVisualSet->GetRect(hObj, rtObj);
-  rtClip.Offset(rtObj.left, rtObj.top);
-  m_Transform.TransformRect(rtClip);
-  const CFX_RectF& rtDevClip = m_pRenderDevice->GetClipRect();
-  rtClip.Intersect(rtDevClip);
-  hState = m_pRenderDevice->SaveState();
-  return m_pRenderDevice->SetClipRect(rtClip);
-}
-void CFDE_RenderContext::RestoreClip(FDE_HDEVICESTATE hState) {
-  m_pRenderDevice->RestoreState(hState);
-}
diff --git a/xfa/src/fde/fde_render.h b/xfa/src/fde/fde_render.h
deleted file mode 100644
index 2995d10..0000000
--- a/xfa/src/fde/fde_render.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_RENDER_H_
-#define XFA_SRC_FDE_FDE_RENDER_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "xfa/src/fde/fde_visualset.h"
-
-class IFDE_RenderDevice;
-
-void FDE_GetPageMatrix(CFX_Matrix& pageMatrix,
-                       const CFX_RectF& docPageRect,
-                       const CFX_Rect& devicePageRect,
-                       int32_t iRotate,
-                       FX_DWORD dwCoordinatesType = 0);
-enum FDE_RENDERSTATUS {
-  FDE_RENDERSTATUS_Reset = 0,
-  FDE_RENDERSTATUS_Paused,
-  FDE_RENDERSTATUS_Done,
-  FDE_RENDERSTATUS_Failed,
-};
-
-class IFDE_RenderContext {
- public:
-  static IFDE_RenderContext* Create();
-  virtual ~IFDE_RenderContext() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL StartRender(IFDE_RenderDevice* pRenderDevice,
-                              IFDE_CanvasSet* pCanvasSet,
-                              const CFX_Matrix& tmDoc2Device) = 0;
-  virtual FDE_RENDERSTATUS GetStatus() const = 0;
-  virtual FDE_RENDERSTATUS DoRender(IFX_Pause* pPause = NULL) = 0;
-  virtual void StopRender() = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_RENDER_H_
diff --git a/xfa/src/fde/fde_renderdevice.h b/xfa/src/fde/fde_renderdevice.h
deleted file mode 100644
index 63a3664..0000000
--- a/xfa/src/fde/fde_renderdevice.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_RENDERDEVICE_H_
-#define XFA_SRC_FDE_FDE_RENDERDEVICE_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "core/include/fxge/fx_font.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fde/fde_path.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-class IFDE_Pen;
-class IFDE_Brush;
-class CFX_DIBitmap;
-class CFX_DIBSource;
-
-typedef struct FDE_HDEVICESTATE_ { void* pData; } * FDE_HDEVICESTATE;
-
-class IFDE_RenderDevice {
- public:
-  static IFDE_RenderDevice* Create(CFX_DIBitmap* pBitmap,
-                                   FX_BOOL bRgbByteOrder = FALSE);
-  static IFDE_RenderDevice* Create(CFX_RenderDevice* pDevice);
-  virtual ~IFDE_RenderDevice() {}
-  virtual void Release() = 0;
-
-  virtual int32_t GetWidth() const = 0;
-  virtual int32_t GetHeight() const = 0;
-  virtual FDE_HDEVICESTATE SaveState() = 0;
-  virtual void RestoreState(FDE_HDEVICESTATE hState) = 0;
-  virtual FX_BOOL SetClipPath(const IFDE_Path* pClip) = 0;
-  virtual IFDE_Path* GetClipPath() const = 0;
-  virtual FX_BOOL SetClipRect(const CFX_RectF& rtClip) = 0;
-  virtual const CFX_RectF& GetClipRect() = 0;
-
-  virtual FX_FLOAT GetDpiX() const = 0;
-  virtual FX_FLOAT GetDpiY() const = 0;
-
-  virtual FX_BOOL DrawImage(CFX_DIBSource* pDib,
-                            const CFX_RectF* pSrcRect,
-                            const CFX_RectF& dstRect,
-                            const CFX_Matrix* pImgMatrix = NULL,
-                            const CFX_Matrix* pDevMatrix = NULL) = 0;
-  virtual FX_BOOL DrawString(IFDE_Brush* pBrush,
-                             IFX_Font* pFont,
-                             const FXTEXT_CHARPOS* pCharPos,
-                             int32_t iCount,
-                             FX_FLOAT fFontSize,
-                             const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawBezier(IFDE_Pen* pPen,
-                             FX_FLOAT fPenWidth,
-                             const CFX_PointF& pt1,
-                             const CFX_PointF& pt2,
-                             const CFX_PointF& pt3,
-                             const CFX_PointF& pt4,
-                             const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawCurve(IFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            FX_BOOL bClosed,
-                            FX_FLOAT fTension = 0.5f,
-                            const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawEllipse(IFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawLines(IFDE_Pen* pPen,
-                            FX_FLOAT fPenWidth,
-                            const CFX_PointsF& points,
-                            const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawLine(IFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const CFX_PointF& pt1,
-                           const CFX_PointF& pt2,
-                           const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawPath(IFDE_Pen* pPen,
-                           FX_FLOAT fPenWidth,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawPolygon(IFDE_Pen* pPen,
-                              FX_FLOAT fPenWidth,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL DrawRectangle(IFDE_Pen* pPen,
-                                FX_FLOAT fPenWidth,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillClosedCurve(IFDE_Brush* pBrush,
-                                  const CFX_PointsF& points,
-                                  FX_FLOAT fTension = 0.5f,
-                                  const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillEllipse(IFDE_Brush* pBrush,
-                              const CFX_RectF& rect,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPath(IFDE_Brush* pBrush,
-                           const IFDE_Path* pPath,
-                           const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillPolygon(IFDE_Brush* pBrush,
-                              const CFX_PointsF& points,
-                              const CFX_Matrix* pMatrix = NULL) = 0;
-  virtual FX_BOOL FillRectangle(IFDE_Brush* pBrush,
-                                const CFX_RectF& rect,
-                                const CFX_Matrix* pMatrix = NULL) = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_RENDERDEVICE_H_
diff --git a/xfa/src/fde/fde_visualset.h b/xfa/src/fde/fde_visualset.h
deleted file mode 100644
index 71c431f..0000000
--- a/xfa/src/fde/fde_visualset.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_FDE_VISUALSET_H_
-#define XFA_SRC_FDE_FDE_VISUALSET_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "core/include/fxge/fx_dib.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fde/fde_brush.h"
-#include "xfa/src/fde/fde_image.h"
-#include "xfa/src/fde/fde_path.h"
-#include "xfa/src/fde/fde_pen.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-enum FDE_VISUALOBJTYPE {
-  FDE_VISUALOBJ_Canvas = 0x00,
-  FDE_VISUALOBJ_Text = 0x01,
-  FDE_VISUALOBJ_Image = 0x02,
-  FDE_VISUALOBJ_Path = 0x04,
-  FDE_VISUALOBJ_Widget = 0x08,
-};
-
-typedef struct FDE_HVISUALOBJ_ { void* pData; } const* FDE_HVISUALOBJ;
-
-class IFDE_VisualSet {
- public:
-  virtual ~IFDE_VisualSet() {}
-  virtual FDE_VISUALOBJTYPE GetType() = 0;
-  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) = 0;
-  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix) = 0;
-  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) = 0;
-  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) = 0;
-};
-
-class IFDE_CanvasSet : public IFDE_VisualSet {
- public:
-  virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas) = 0;
-  virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas,
-                                 FX_POSITION& pos,
-                                 IFDE_VisualSet*& pVisualSet) = 0;
-  virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas,
-                                         IFDE_VisualSet*& pVisualSet) = 0;
-};
-
-class IFDE_TextSet : public IFDE_VisualSet {
- public:
-  virtual int32_t GetString(FDE_HVISUALOBJ hText, CFX_WideString& wsText) = 0;
-  virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText) = 0;
-  virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText) = 0;
-  virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText) = 0;
-  virtual int32_t GetDisplayPos(FDE_HVISUALOBJ hText,
-                                FXTEXT_CHARPOS* pCharPos,
-                                FX_BOOL bCharCode = FALSE,
-                                CFX_WideString* pWSForms = NULL) = 0;
-  virtual int32_t GetCharRects(FDE_HVISUALOBJ hText,
-                               CFX_RectFArray& rtArray) = 0;
-};
-
-struct FDE_IMAGEFILTERPARAMS : public CFX_Target {
-  int32_t iFilterType;
-};
-
-class IFDE_ImageSet : public IFDE_VisualSet {
- public:
-  virtual IFDE_Image* GetImage(FDE_HVISUALOBJ hImage) = 0;
-  virtual FX_POSITION GetFirstFilterPosition(FDE_HVISUALOBJ hImage) = 0;
-  virtual const FDE_IMAGEFILTERPARAMS* GetNextFilter(FDE_HVISUALOBJ hImage,
-                                                     FX_POSITION& pos) = 0;
-};
-
-class IFDE_PathSet : public IFDE_VisualSet {
- public:
-  virtual IFDE_Path* GetPath(FDE_HVISUALOBJ hPath) = 0;
-  virtual int32_t GetFillMode(FDE_HVISUALOBJ hPath) = 0;
-  virtual int32_t GetRenderMode(FDE_HVISUALOBJ hPath) = 0;
-  virtual IFDE_Pen* GetPen(FDE_HVISUALOBJ hPath) = 0;
-  virtual FX_FLOAT GetPenWidth(FDE_HVISUALOBJ hPath) = 0;
-  virtual IFDE_Brush* GetBrush(FDE_HVISUALOBJ hPath) = 0;
-};
-
-enum FDE_WIDGETOBJ {
-  FDE_WIDGETOBJ_Unknown = 0x0000,
-  FDE_WIDGETOBJ_Anchor = 0x0100,
-  FDE_WIDGETOBJ_NamedDest = 0x0200,
-  FDE_WIDGETOBJ_HyperLink = 0x0400,
-};
-
-class IFDE_WidgetSet : public IFDE_VisualSet {
- public:
-  virtual FDE_WIDGETOBJ GetWidgetType(FDE_HVISUALOBJ hWidget) = 0;
-  virtual FX_FLOAT GetFloat(FDE_HVISUALOBJ hWidget,
-                            int32_t iParameter,
-                            FX_FLOAT fDefVal = 0.0f) = 0;
-  virtual int32_t GetInteger(FDE_HVISUALOBJ hWidget,
-                             int32_t iParameter,
-                             int32_t iDefVal = 0) = 0;
-  virtual FX_BOOL GetString(FDE_HVISUALOBJ hWidget,
-                            int32_t iParameter,
-                            CFX_WideString& wsValue) = 0;
-  virtual FX_BOOL GetRects(FDE_HVISUALOBJ hWidget,
-                           int32_t iParameter,
-                           CFX_RectFArray& rects) = 0;
-};
-
-class IFDE_VisualSetIterator {
- public:
-  static IFDE_VisualSetIterator* Create();
-  virtual ~IFDE_VisualSetIterator() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL AttachCanvas(IFDE_CanvasSet* pCanvas) = 0;
-  virtual FX_BOOL FilterObjects(FX_DWORD dwObjects = 0xFFFFFFFF) = 0;
-  virtual void Reset() = 0;
-  virtual FDE_HVISUALOBJ GetNext(IFDE_VisualSet*& pVisualSet,
-                                 FDE_HVISUALOBJ* phCanvasObj = NULL,
-                                 IFDE_CanvasSet** ppCanvasSet = NULL) = 0;
-};
-
-#endif  // XFA_SRC_FDE_FDE_VISUALSET_H_
diff --git a/xfa/src/fde/tto/fde_textout.cpp b/xfa/src/fde/tto/fde_textout.cpp
deleted file mode 100644
index fc3e4ab..0000000
--- a/xfa/src/fde/tto/fde_textout.cpp
+++ /dev/null
@@ -1,1120 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/tto/fde_textout.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fde/fde_brush.h"
-#include "xfa/src/fde/fde_pen.h"
-#include "xfa/src/fde/fde_renderdevice.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-#include "xfa/src/fgas/layout/fgas_textbreak.h"
-
-namespace {
-
-struct FDE_TTOPIECE {
- public:
-  int32_t iStartChar;
-  int32_t iChars;
-  FX_DWORD dwCharStyles;
-  CFX_RectF rtPiece;
-};
-typedef FDE_TTOPIECE* FDE_LPTTOPIECE;
-typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
-
-class CFDE_TTOLine : public CFX_Target {
- public:
-  CFDE_TTOLine();
-  CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
-  ~CFDE_TTOLine();
-  int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
-  int32_t GetSize() const;
-  FDE_LPTTOPIECE GetPtrAt(int32_t index);
-  void RemoveLast(int32_t iCount);
-  void RemoveAll(FX_BOOL bLeaveMemory);
-  FX_BOOL m_bNewReload;
-  CFDE_TTOPieceArray m_pieces;
-
- protected:
-  int32_t m_iPieceCount;
-};
-typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
-
-class CFDE_TextOut : public IFDE_TextOut, public CFX_Target {
- public:
-  CFDE_TextOut();
-  ~CFDE_TextOut();
-  virtual void Release() { delete this; }
-  virtual void SetFont(IFX_Font* pFont);
-  virtual void SetFontSize(FX_FLOAT fFontSize);
-  virtual void SetTextColor(FX_ARGB color);
-  virtual void SetStyles(FX_DWORD dwStyles);
-  virtual void SetTabWidth(FX_FLOAT fTabWidth);
-  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis);
-  virtual void SetParagraphBreakChar(FX_WCHAR wch);
-  virtual void SetAlignment(int32_t iAlignment);
-  virtual void SetLineSpace(FX_FLOAT fLineSpace);
-  virtual void SetDIBitmap(CFX_DIBitmap* pDIB);
-  virtual void SetRenderDevice(CFX_RenderDevice* pDevice);
-  virtual void SetClipRect(const CFX_Rect& rtClip);
-  virtual void SetClipRect(const CFX_RectF& rtClip);
-  virtual void SetMatrix(const CFX_Matrix& matrix);
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Size& size);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_SizeF& size);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Rect& rect);
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_RectF& rect);
-
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        int32_t x,
-                        int32_t y);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        FX_FLOAT x,
-                        FX_FLOAT y);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_Rect& rect);
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_RectF& rect);
-
-  virtual void SetLogicClipRect(const CFX_RectF& rtClip);
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_SizeF& size);
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_RectF& rect);
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             FX_FLOAT x,
-                             FX_FLOAT y);
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             const CFX_RectF& rect);
-  virtual int32_t GetTotalLines();
-
- protected:
-  void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
-  FX_BOOL RetrieveLineWidth(FX_DWORD dwBreakStatus,
-                            FX_FLOAT& fStartPos,
-                            FX_FLOAT& fWidth,
-                            FX_FLOAT& fHeight);
-  void SetLineWidth(CFX_RectF& rect);
-  void DrawText(const FX_WCHAR* pwsStr,
-                int32_t iLength,
-                const CFX_RectF& rect,
-                const CFX_RectF& rtClip);
-  void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
-  void LoadEllipsis();
-  void ExpandBuffer(int32_t iSize, int32_t iType);
-  void RetrieveEllPieces(int32_t*& pCharWidths);
-
-  void Reload(const CFX_RectF& rect);
-  void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
-  FX_BOOL RetriecePieces(FX_DWORD dwBreakStatus,
-                         int32_t& iStartChar,
-                         int32_t& iPieceWidths,
-                         FX_BOOL bReload,
-                         const CFX_RectF& rect);
-  void AppendPiece(const FDE_TTOPIECE& ttoPiece,
-                   FX_BOOL bNeedReload,
-                   FX_BOOL bEnd);
-  void ReplaceWidthEllipsis();
-  void DoAlignment(const CFX_RectF& rect);
-  void OnDraw(const CFX_RectF& rtClip);
-  int32_t GetDisplayPos(FDE_LPTTOPIECE pPiece);
-  int32_t GetCharRects(FDE_LPTTOPIECE pPiece);
-
-  void ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr);
-  void DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen);
-
-  IFX_TxtBreak* m_pTxtBreak;
-  IFX_Font* m_pFont;
-  FX_FLOAT m_fFontSize;
-  FX_FLOAT m_fLineSpace;
-  FX_FLOAT m_fLinePos;
-  FX_FLOAT m_fTolerance;
-  int32_t m_iAlignment;
-  int32_t m_iTxtBkAlignment;
-  int32_t* m_pCharWidths;
-  int32_t m_iChars;
-  int32_t* m_pEllCharWidths;
-  int32_t m_iEllChars;
-  FX_WCHAR m_wParagraphBkChar;
-  FX_ARGB m_TxtColor;
-  FX_DWORD m_dwStyles;
-  FX_DWORD m_dwTxtBkStyles;
-  CFX_WideString m_wsEllipsis;
-  FX_BOOL m_bElliChanged;
-  int32_t m_iEllipsisWidth;
-  CFX_WideString m_wsText;
-  CFX_RectF m_rtClip;
-  CFX_RectF m_rtLogicClip;
-  CFX_Matrix m_Matrix;
-  CFDE_TTOLineArray m_ttoLines;
-  int32_t m_iCurLine;
-  int32_t m_iCurPiece;
-  int32_t m_iTotalLines;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosSize;
-  IFDE_RenderDevice* m_pRenderDevice;
-  CFX_Int32Array m_hotKeys;
-  CFX_RectFArray m_rectArray;
-};
-
-}  // namespace
-
-IFDE_TextOut* IFDE_TextOut::Create() {
-  return new CFDE_TextOut;
-}
-CFDE_TextOut::CFDE_TextOut()
-    : m_pFont(NULL),
-      m_fFontSize(12.0f),
-      m_fLineSpace(m_fFontSize),
-      m_fLinePos(0.0f),
-      m_fTolerance(0.0f),
-      m_iAlignment(0),
-      m_iTxtBkAlignment(0),
-      m_pCharWidths(NULL),
-      m_iChars(0),
-      m_pEllCharWidths(NULL),
-      m_iEllChars(0),
-      m_wParagraphBkChar(L'\n'),
-      m_TxtColor(0xFF000000),
-      m_dwStyles(0),
-      m_dwTxtBkStyles(0),
-      m_bElliChanged(FALSE),
-      m_iEllipsisWidth(0),
-      m_ttoLines(5),
-      m_iCurLine(0),
-      m_iCurPiece(0),
-      m_iTotalLines(0),
-      m_pCharPos(NULL),
-      m_iCharPosSize(0),
-      m_pRenderDevice(NULL) {
-  m_pTxtBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
-  FXSYS_assert(m_pTxtBreak != NULL);
-  m_Matrix.SetIdentity();
-  m_rtClip.Reset();
-  m_rtLogicClip.Reset();
-}
-CFDE_TextOut::~CFDE_TextOut() {
-  if (m_pTxtBreak) {
-    m_pTxtBreak->Release();
-  }
-  FX_Free(m_pCharWidths);
-  FX_Free(m_pEllCharWidths);
-  if (m_pRenderDevice) {
-    m_pRenderDevice->Release();
-  }
-  FX_Free(m_pCharPos);
-  m_ttoLines.RemoveAll();
-}
-void CFDE_TextOut::SetFont(IFX_Font* pFont) {
-  FXSYS_assert(pFont);
-  m_pFont = pFont;
-  m_pTxtBreak->SetFont(pFont);
-}
-void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) {
-  FXSYS_assert(fFontSize > 0);
-  m_fFontSize = fFontSize;
-  m_pTxtBreak->SetFontSize(fFontSize);
-}
-void CFDE_TextOut::SetTextColor(FX_ARGB color) {
-  m_TxtColor = color;
-}
-void CFDE_TextOut::SetStyles(FX_DWORD dwStyles) {
-  m_dwStyles = dwStyles;
-  m_dwTxtBkStyles = 0;
-  if (dwStyles & FDE_TTOSTYLE_SingleLine) {
-    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_SingleLine;
-  }
-  if (dwStyles & FDE_TTOSTYLE_ExpandTab) {
-    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ExpandTab;
-  }
-  if (dwStyles & FDE_TTOSTYLE_ArabicShapes) {
-    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicShapes;
-  }
-  if (dwStyles & FDE_TTOSTYLE_RTL) {
-    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
-  }
-  if (dwStyles & FDE_TTOSTYLE_ArabicContext) {
-    m_dwTxtBkStyles |= FX_TXTLAYOUTSTYLE_ArabicContext;
-  }
-  if (dwStyles & FDE_TTOSTYLE_VerticalLayout) {
-    m_dwTxtBkStyles |=
-        (FX_TXTLAYOUTSTYLE_VerticalChars | FX_TXTLAYOUTSTYLE_VerticalLayout);
-  }
-  m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
-}
-void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) {
-  FXSYS_assert(fTabWidth > 1.0f);
-  m_pTxtBreak->SetTabWidth(fTabWidth, FALSE);
-}
-void CFDE_TextOut::SetEllipsisString(const CFX_WideString& wsEllipsis) {
-  m_bElliChanged = TRUE;
-  m_wsEllipsis = wsEllipsis;
-}
-void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) {
-  m_wParagraphBkChar = wch;
-  m_pTxtBreak->SetParagraphBreakChar(wch);
-}
-void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
-  m_iAlignment = iAlignment;
-  switch (m_iAlignment) {
-    case FDE_TTOALIGNMENT_TopCenter:
-    case FDE_TTOALIGNMENT_Center:
-    case FDE_TTOALIGNMENT_BottomCenter:
-      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Center;
-      break;
-    case FDE_TTOALIGNMENT_TopRight:
-    case FDE_TTOALIGNMENT_CenterRight:
-    case FDE_TTOALIGNMENT_BottomRight:
-      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Right;
-      break;
-    default:
-      m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Left;
-      break;
-  }
-  m_pTxtBreak->SetAlignment(m_iTxtBkAlignment);
-}
-void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
-  FXSYS_assert(fLineSpace > 1.0f);
-  m_fLineSpace = fLineSpace;
-}
-void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) {
-  FXSYS_assert(pDIB != NULL);
-  if (m_pRenderDevice != NULL) {
-    m_pRenderDevice->Release();
-  }
-  m_pRenderDevice = IFDE_RenderDevice::Create(pDIB);
-}
-void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) {
-  FXSYS_assert(pDevice != NULL);
-  if (m_pRenderDevice != NULL) {
-    m_pRenderDevice->Release();
-  }
-  m_pRenderDevice = IFDE_RenderDevice::Create(pDevice);
-}
-void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) {
-  m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
-               (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
-}
-void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) {
-  m_rtClip = rtClip;
-}
-void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) {
-  m_rtLogicClip = rtClip;
-}
-void CFDE_TextOut::SetMatrix(const CFX_Matrix& matrix) {
-  m_Matrix = matrix;
-}
-void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) {
-  m_fTolerance = fTolerance;
-  m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
-}
-int32_t CFDE_TextOut::GetTotalLines() {
-  return m_iTotalLines;
-}
-void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            CFX_Size& size) {
-  CFX_RectF rtText;
-  rtText.Set(0.0f, 0.0f, (FX_FLOAT)size.x, (FX_FLOAT)size.y);
-  CalcSize(pwsStr, iLength, rtText);
-  size.x = (int32_t)rtText.Width();
-  size.y = (int32_t)rtText.Height();
-}
-void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            CFX_SizeF& size) {
-  CFX_RectF rtText;
-  rtText.Set(0.0f, 0.0f, size.x, size.y);
-  CalcSize(pwsStr, iLength, rtText);
-  size.x = rtText.Width();
-  size.y = rtText.Height();
-}
-void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            CFX_Rect& rect) {
-  CFX_RectF rtText;
-  rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.Width(),
-             (FX_FLOAT)rect.Height());
-  CalcSize(pwsStr, iLength, rtText);
-  rect.Set((int32_t)rtText.left, (int32_t)rtText.top, (int32_t)rtText.Width(),
-           (int32_t)rtText.Height());
-}
-void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            CFX_RectF& rect) {
-  if (pwsStr == NULL || iLength < 1) {
-    rect.width = 0.0f;
-    rect.height = 0.0f;
-  } else {
-    CFX_Matrix rm;
-    rm.SetReverse(m_Matrix);
-    rm.TransformRect(rect);
-    CalcTextSize(pwsStr, iLength, rect);
-    m_Matrix.TransformRect(rect);
-  }
-}
-void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
-                                 int32_t iLength,
-                                 CFX_SizeF& size) {
-  CFX_RectF rtText;
-  rtText.Set(0.0f, 0.0f, size.x, size.y);
-  CalcLogicSize(pwsStr, iLength, rtText);
-  size.x = rtText.Width();
-  size.y = rtText.Height();
-}
-void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
-                                 int32_t iLength,
-                                 CFX_RectF& rect) {
-  if (pwsStr == NULL || iLength < 1) {
-    rect.width = 0.0f;
-    rect.height = 0.0f;
-  } else {
-    CalcTextSize(pwsStr, iLength, rect);
-  }
-}
-void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
-                                int32_t iLength,
-                                CFX_RectF& rect) {
-  FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f);
-  SetLineWidth(rect);
-  m_iTotalLines = 0;
-  const FX_WCHAR* pStr = pwsStr;
-  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  FX_FLOAT fWidth = 0.0f;
-  FX_FLOAT fHeight = 0.0f;
-  FX_FLOAT fStartPos = bVertical ? rect.bottom() : rect.right();
-  FX_DWORD dwBreakStatus = 0;
-  FX_WCHAR wPreChar = 0;
-  FX_WCHAR wch;
-  FX_WCHAR wBreak = 0;
-  while (iLength-- > 0) {
-    wch = *pStr++;
-    if (wBreak == 0 && (wch == L'\n' || wch == L'\r')) {
-      wBreak = wch;
-      m_pTxtBreak->SetParagraphBreakChar(wch);
-    }
-    if (bHotKey && wch == L'&' && wPreChar != L'&') {
-      wPreChar = wch;
-      continue;
-    }
-    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight);
-    }
-    wPreChar = 0;
-  }
-  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-    RetrieveLineWidth(dwBreakStatus, fStartPos, fWidth, fHeight);
-  }
-  m_pTxtBreak->Reset();
-  FX_FLOAT fInc = rect.Height() - fHeight;
-  if (bVertical) {
-    fInc = rect.Width() - fHeight;
-  }
-  if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft &&
-      m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) {
-    fInc /= 2.0f;
-  } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) {
-    fInc = 0.0f;
-  }
-  if (bVertical) {
-    rect.top += fStartPos;
-    rect.left += fInc;
-    rect.width = fHeight;
-    rect.height = std::min(fWidth, rect.Height());
-  } else {
-    rect.left += fStartPos;
-    rect.top += fInc;
-    rect.width = std::min(fWidth, rect.Width());
-    rect.height = fHeight;
-    if (m_dwStyles & FDE_TTOSTYLE_LastLineHeight) {
-      rect.height -= m_fLineSpace - m_fFontSize;
-    }
-  }
-}
-void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
-  if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) {
-    FX_FLOAT fLineWidth = 0.0f;
-    if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) {
-      if (rect.Height() < 1.0f) {
-        rect.height = m_fFontSize * 1000.0f;
-      }
-      fLineWidth = rect.Height();
-    } else {
-      if (rect.Width() < 1.0f) {
-        rect.width = m_fFontSize * 1000.0f;
-      }
-      fLineWidth = rect.Width();
-    }
-    m_pTxtBreak->SetLineWidth(fLineWidth);
-  }
-}
-FX_BOOL CFDE_TextOut::RetrieveLineWidth(FX_DWORD dwBreakStatus,
-                                        FX_FLOAT& fStartPos,
-                                        FX_FLOAT& fWidth,
-                                        FX_FLOAT& fHeight) {
-  if (dwBreakStatus <= FX_TXTBREAK_PieceBreak) {
-    return FALSE;
-  }
-  FX_FLOAT fLineStep =
-      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
-  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
-  FX_FLOAT fLineWidth = 0.0f;
-  int32_t iCount = m_pTxtBreak->CountBreakPieces();
-  for (int32_t i = 0; i < iCount; i++) {
-    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
-    fLineWidth += (FX_FLOAT)pPiece->m_iWidth / 20000.0f;
-    fStartPos = std::min(fStartPos, (FX_FLOAT)pPiece->m_iStartPos / 20000.0f);
-  }
-  m_pTxtBreak->ClearBreakPieces();
-  if (dwBreakStatus == FX_TXTBREAK_ParagraphBreak) {
-    m_pTxtBreak->Reset();
-  }
-  if (!bLineWrap && dwBreakStatus == FX_TXTBREAK_LineBreak) {
-    fWidth += fLineWidth;
-  } else {
-    fWidth = std::max(fWidth, fLineWidth);
-    fHeight += fLineStep;
-  }
-  m_iTotalLines++;
-  return TRUE;
-}
-void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            int32_t x,
-                            int32_t y) {
-  CFX_RectF rtText;
-  rtText.Set((FX_FLOAT)x, (FX_FLOAT)y, m_fFontSize * 1000.0f,
-             m_fFontSize * 1000.0f);
-  DrawText(pwsStr, iLength, rtText);
-}
-void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            FX_FLOAT x,
-                            FX_FLOAT y) {
-  CFX_RectF rtText;
-  rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
-  DrawText(pwsStr, iLength, rtText);
-}
-void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            const CFX_Rect& rect) {
-  CFX_RectF rtText;
-  rtText.Set((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, (FX_FLOAT)rect.width,
-             (FX_FLOAT)rect.height);
-  DrawText(pwsStr, iLength, rtText);
-}
-void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            const CFX_RectF& rect) {
-  CFX_RectF rtText;
-  rtText.Set(rect.left, rect.top, rect.width, rect.height);
-  CFX_Matrix rm;
-  rm.SetReverse(m_Matrix);
-  rm.TransformRect(rtText);
-  DrawText(pwsStr, iLength, rtText, m_rtClip);
-}
-void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
-                                 int32_t iLength,
-                                 FX_FLOAT x,
-                                 FX_FLOAT y) {
-  CFX_RectF rtText;
-  rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
-  DrawLogicText(pwsStr, iLength, rtText);
-}
-void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
-                                 int32_t iLength,
-                                 const CFX_RectF& rect) {
-  CFX_RectF rtClip;
-  rtClip.Set(m_rtLogicClip.left, m_rtLogicClip.top, m_rtLogicClip.width,
-             m_rtLogicClip.height);
-  m_Matrix.TransformRect(rtClip);
-  DrawText(pwsStr, iLength, rect, rtClip);
-}
-void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            const CFX_RectF& rect,
-                            const CFX_RectF& rtClip) {
-  FXSYS_assert(m_pFont != NULL && m_fFontSize >= 1.0f);
-  if (pwsStr == NULL || iLength < 1) {
-    return;
-  }
-  if (rect.width < m_fFontSize || rect.height < m_fFontSize) {
-    return;
-  }
-  FX_FLOAT fLineWidth = rect.width;
-  if (m_dwStyles & FDE_TTOSTYLE_VerticalLayout) {
-    fLineWidth = rect.height;
-  }
-  m_pTxtBreak->SetLineWidth(fLineWidth);
-  m_ttoLines.RemoveAll(TRUE);
-  m_wsText.Empty();
-  LoadText(pwsStr, iLength, rect);
-  if (m_dwStyles & FDE_TTOSTYLE_Ellipsis) {
-    ReplaceWidthEllipsis();
-  }
-  Reload(rect);
-  DoAlignment(rect);
-  OnDraw(rtClip);
-}
-void CFDE_TextOut::ExpandBuffer(int32_t iSize, int32_t iType) {
-  switch (iType) {
-    case 0:
-      if (!m_pCharWidths) {
-        m_pCharWidths = FX_Alloc(int32_t, iSize);
-        m_iChars = iSize;
-      } else if (m_iChars < iSize) {
-        m_pCharWidths = FX_Realloc(int32_t, m_pCharWidths, iSize);
-        m_iChars = iSize;
-      }
-      FXSYS_memset(m_pCharWidths, 0, iSize * sizeof(int32_t));
-      break;
-    case 1:
-      if (!m_pEllCharWidths) {
-        m_pEllCharWidths = FX_Alloc(int32_t, iSize);
-        m_iEllChars = iSize;
-      } else if (m_iEllChars < iSize) {
-        m_pEllCharWidths = FX_Realloc(int32_t, m_pEllCharWidths, iSize);
-        m_iEllChars = iSize;
-      }
-      FXSYS_memset(m_pEllCharWidths, 0, iSize * sizeof(int32_t));
-      break;
-    case 2:
-      if (m_pCharPos == NULL) {
-        m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iSize);
-        m_iCharPosSize = iSize;
-      } else if (m_iCharPosSize < iSize) {
-        m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iSize);
-        m_iCharPosSize = iSize;
-      }
-      break;
-  }
-}
-void CFDE_TextOut::LoadEllipsis() {
-  if (!m_bElliChanged) {
-    return;
-  }
-  m_bElliChanged = FALSE;
-  m_iEllipsisWidth = 0;
-  int32_t iLength = m_wsEllipsis.GetLength();
-  if (iLength < 1) {
-    return;
-  }
-  ExpandBuffer(iLength, 1);
-  const FX_WCHAR* pStr = (const FX_WCHAR*)m_wsEllipsis;
-  int32_t* pCharWidths = m_pEllCharWidths;
-  FX_DWORD dwBreakStatus;
-  FX_WCHAR wch;
-  while (iLength-- > 0) {
-    wch = *pStr++;
-    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      RetrieveEllPieces(pCharWidths);
-    }
-  }
-  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-    RetrieveEllPieces(pCharWidths);
-  }
-  m_pTxtBreak->Reset();
-}
-void CFDE_TextOut::RetrieveEllPieces(int32_t*& pCharWidths) {
-  int32_t iCount = m_pTxtBreak->CountBreakPieces();
-  CFX_Char* pTC;
-  for (int32_t i = 0; i < iCount; i++) {
-    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
-    int32_t iPieceChars = pPiece->GetLength();
-    for (int32_t j = 0; j < iPieceChars; j++) {
-      pTC = pPiece->GetCharPtr(j);
-      if (pTC->m_iCharWidth <= 0) {
-        *pCharWidths = 0;
-      } else {
-        *pCharWidths = pTC->m_iCharWidth;
-      }
-      m_iEllipsisWidth += *pCharWidths;
-      pCharWidths++;
-    }
-  }
-  m_pTxtBreak->ClearBreakPieces();
-}
-void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
-                            int32_t iLength,
-                            const CFX_RectF& rect) {
-  FX_WCHAR* pStr = m_wsText.GetBuffer(iLength);
-  int32_t iTxtLength = iLength;
-  ExpandBuffer(iTxtLength, 0);
-  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
-  FX_FLOAT fLineStep =
-      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
-  FX_FLOAT fLineStop = bVertical ? rect.left : rect.bottom();
-  m_fLinePos = bVertical ? rect.right() : rect.top;
-  if (bVertical) {
-    fLineStep = -fLineStep;
-  }
-  m_hotKeys.RemoveAll();
-  int32_t iStartChar = 0;
-  int32_t iChars = 0;
-  int32_t iPieceWidths = 0;
-  FX_DWORD dwBreakStatus;
-  FX_WCHAR wch;
-  FX_BOOL bRet = FALSE;
-  while (iTxtLength-- > 0) {
-    wch = *pwsStr++;
-    if (wch == L'&' && bHotKey && (pStr - 1) != NULL && *(pStr - 1) != L'&') {
-      if (iTxtLength > 0) {
-        m_hotKeys.Add(iChars);
-      }
-      continue;
-    }
-    *pStr++ = wch;
-    iChars++;
-    dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      FX_BOOL bEndofLine =
-          RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect);
-      if (bEndofLine && (bLineWrap || (dwBreakStatus > FX_TXTBREAK_LineBreak &&
-                                       !bLineWrap))) {
-        iPieceWidths = 0;
-        m_iCurLine++;
-        m_fLinePos += fLineStep;
-      }
-      if ((bVertical && m_fLinePos + fLineStep < fLineStop) ||
-          (!bVertical && m_fLinePos + fLineStep > fLineStop)) {
-        int32_t iCurLine = m_iCurLine;
-        if (bEndofLine) {
-          iCurLine--;
-        }
-        CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iCurLine);
-        pLine->m_bNewReload = TRUE;
-        bRet = TRUE;
-        break;
-      }
-    }
-  }
-  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak && !bRet) {
-    RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, FALSE, rect);
-  }
-  m_pTxtBreak->ClearBreakPieces();
-  m_pTxtBreak->Reset();
-  m_wsText.ReleaseBuffer(iLength);
-}
-FX_BOOL CFDE_TextOut::RetriecePieces(FX_DWORD dwBreakStatus,
-                                     int32_t& iStartChar,
-                                     int32_t& iPieceWidths,
-                                     FX_BOOL bReload,
-                                     const CFX_RectF& rect) {
-  FX_BOOL bSingleLine = !!(m_dwStyles & FDE_TTOSTYLE_SingleLine);
-  FX_BOOL bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap);
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  FX_FLOAT fLineStep =
-      (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize;
-  if (bVertical) {
-    fLineStep = -fLineStep;
-  }
-  CFX_Char* pTC = NULL;
-  FX_BOOL bNeedReload = FALSE;
-  FX_FLOAT fLineWidth = bVertical ? rect.Height() : rect.Width();
-  int32_t iLineWidth = FXSYS_round(fLineWidth * 20000.0f);
-  int32_t iCount = m_pTxtBreak->CountBreakPieces();
-  for (int32_t i = 0; i < iCount; i++) {
-    const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
-    int32_t iPieceChars = pPiece->GetLength();
-    int32_t iChar = iStartChar;
-    int32_t iWidth = 0;
-    int32_t j = 0;
-    for (; j < iPieceChars; j++) {
-      pTC = pPiece->GetCharPtr(j);
-      int32_t iCurCharWidth = pTC->m_iCharWidth > 0 ? pTC->m_iCharWidth : 0;
-      if (bSingleLine || !bLineWrap) {
-        if (iLineWidth - iPieceWidths - iWidth < iCurCharWidth) {
-          bNeedReload = TRUE;
-          break;
-        }
-      }
-      iWidth += iCurCharWidth;
-      m_pCharWidths[iChar++] = iCurCharWidth;
-    }
-    if (j == 0 && !bReload) {
-      CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
-      pLine->m_bNewReload = TRUE;
-    } else if (j > 0) {
-      CFX_RectF rtPiece;
-      if (bVertical) {
-        rtPiece.left = m_fLinePos;
-        rtPiece.top = rect.top + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
-        rtPiece.width = fLineStep;
-        rtPiece.height = iWidth / 20000.0f;
-      } else {
-        rtPiece.left = rect.left + (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
-        rtPiece.top = m_fLinePos;
-        rtPiece.width = iWidth / 20000.0f;
-        rtPiece.height = fLineStep;
-      }
-      FDE_TTOPIECE ttoPiece;
-      ttoPiece.iStartChar = iStartChar;
-      ttoPiece.iChars = j;
-      ttoPiece.rtPiece = rtPiece;
-      ttoPiece.dwCharStyles = pPiece->m_dwCharStyles;
-      if (FX_IsOdd(pPiece->m_iBidiLevel)) {
-        ttoPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
-      }
-      AppendPiece(ttoPiece, bNeedReload, (bReload && i == iCount - 1));
-    }
-    iStartChar += iPieceChars;
-    iPieceWidths += iWidth;
-  }
-  m_pTxtBreak->ClearBreakPieces();
-  FX_BOOL bRet = bSingleLine || bLineWrap || (!bLineWrap && bNeedReload) ||
-                 dwBreakStatus == FX_TXTBREAK_ParagraphBreak;
-  return bRet;
-}
-void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
-                               FX_BOOL bNeedReload,
-                               FX_BOOL bEnd) {
-  if (m_iCurLine >= m_ttoLines.GetSize()) {
-    CFDE_TTOLine ttoLine;
-    ttoLine.m_bNewReload = bNeedReload;
-    m_iCurPiece = ttoLine.AddPiece(m_iCurPiece, ttoPiece);
-    m_iCurLine = m_ttoLines.Add(ttoLine);
-  } else {
-    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
-    pLine->m_bNewReload = bNeedReload;
-    m_iCurPiece = pLine->AddPiece(m_iCurPiece, ttoPiece);
-    if (bEnd) {
-      int32_t iPieces = pLine->GetSize();
-      if (m_iCurPiece < iPieces) {
-        pLine->RemoveLast(iPieces - m_iCurPiece - 1);
-      }
-    }
-  }
-  if (!bEnd && bNeedReload) {
-    m_iCurPiece = 0;
-  }
-}
-void CFDE_TextOut::ReplaceWidthEllipsis() {
-  LoadEllipsis();
-  int32_t iLength = m_wsEllipsis.GetLength();
-  if (iLength < 1) {
-    return;
-  }
-  int32_t iLines = m_ttoLines.GetSize();
-  for (int32_t i = 0; i < iLines; i++) {
-    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
-    if (!pLine->m_bNewReload) {
-      continue;
-    }
-    int32_t iEllipsisCharIndex = iLength - 1;
-    int32_t iCharWidth = 0;
-    int32_t iCharCount = 0;
-    int32_t iPiece = pLine->GetSize();
-    while (iPiece-- > 0) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece);
-      if (pPiece == NULL) {
-        break;
-      }
-      for (int32_t j = pPiece->iChars - 1; j >= 0; j--) {
-        if (iEllipsisCharIndex < 0) {
-          break;
-        }
-        int32_t index = pPiece->iStartChar + j;
-        iCharWidth += m_pCharWidths[index];
-        iCharCount++;
-        if (iCharCount <= iLength) {
-          m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex));
-          m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex];
-        } else if (iCharWidth <= m_iEllipsisWidth) {
-          m_wsText.SetAt(index, 0);
-          m_pCharWidths[index] = 0;
-        }
-        iEllipsisCharIndex--;
-      }
-      if (iEllipsisCharIndex < 0) {
-        break;
-      }
-    }
-  }
-}
-void CFDE_TextOut::Reload(const CFX_RectF& rect) {
-  int32_t iCount = m_ttoLines.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
-    if (pLine == NULL || !pLine->m_bNewReload) {
-      continue;
-    }
-    m_iCurLine = i;
-    m_iCurPiece = 0;
-    ReloadLinePiece(pLine, rect);
-  }
-}
-void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) {
-  const FX_WCHAR* pwsStr = (const FX_WCHAR*)m_wsText;
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  int32_t iPieceWidths = 0;
-  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
-  int32_t iStartChar = pPiece->iStartChar;
-  m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top;
-  int32_t iPieceCount = pLine->GetSize();
-  int32_t iPieceIndex = 0;
-  FX_DWORD dwBreakStatus = 0;
-  FX_WCHAR wch;
-  while (iPieceIndex < iPieceCount) {
-    int32_t iStar = iStartChar;
-    int32_t iEnd = pPiece->iChars + iStar;
-    while (iStar < iEnd) {
-      wch = *(pwsStr + iStar);
-      dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-      if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-        RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect);
-      }
-      iStar++;
-    }
-    iPieceIndex++;
-    pPiece = pLine->GetPtrAt(iPieceIndex);
-  }
-  dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-    RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect);
-  }
-  m_pTxtBreak->Reset();
-}
-void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom();
-  int32_t iLines = m_ttoLines.GetSize();
-  if (iLines < 1) {
-    return;
-  }
-  CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1);
-  FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
-  if (pPiece == NULL) {
-    return;
-  }
-  FX_FLOAT fLineStopD =
-      bVertical ? pPiece->rtPiece.right() : pPiece->rtPiece.bottom();
-  FX_FLOAT fInc = fLineStopS - fLineStopD;
-  if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft &&
-      m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) {
-    fInc /= 2.0f;
-  } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) {
-    fInc = 0.0f;
-  }
-  if (fInc < 1.0f) {
-    return;
-  }
-  for (int32_t i = 0; i < iLines; i++) {
-    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
-    int32_t iPieces = pLine->GetSize();
-    for (int32_t j = 0; j < iPieces; j++) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
-      if (bVertical) {
-        pPiece->rtPiece.left += fInc;
-      } else {
-        pPiece->rtPiece.top += fInc;
-      }
-    }
-  }
-}
-void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
-  if (m_pRenderDevice == NULL) {
-    return;
-  }
-  int32_t iLines = m_ttoLines.GetSize();
-  if (iLines < 1) {
-    return;
-  }
-  IFDE_SolidBrush* pBrush =
-      (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
-  pBrush->SetColor(m_TxtColor);
-  IFDE_Pen* pPen = NULL;
-  FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState();
-  if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) {
-    m_pRenderDevice->SetClipRect(rtClip);
-  }
-  for (int32_t i = 0; i < iLines; i++) {
-    CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
-    int32_t iPieces = pLine->GetSize();
-    for (int32_t j = 0; j < iPieces; j++) {
-      FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
-      if (pPiece == NULL) {
-        continue;
-      }
-      int32_t iCount = GetDisplayPos(pPiece);
-      if (iCount > 0) {
-        m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount,
-                                    m_fFontSize, &m_Matrix);
-      }
-      DrawLine(pPiece, pPen);
-    }
-  }
-  m_pRenderDevice->RestoreState(hDev);
-  if (pBrush) {
-    pBrush->Release();
-  }
-  if (pPen) {
-    pPen->Release();
-  }
-}
-int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) {
-  FX_TXTRUN tr;
-  ToTextRun(pPiece, tr);
-  ExpandBuffer(tr.iLength, 2);
-  return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
-}
-int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) {
-  FX_TXTRUN tr;
-  ToTextRun(pPiece, tr);
-  m_rectArray.RemoveAll();
-  return m_pTxtBreak->GetCharRects(&tr, m_rectArray);
-}
-void CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr) {
-  tr.pAccess = NULL;
-  tr.pIdentity = NULL;
-  tr.pStr = (const FX_WCHAR*)m_wsText + pPiece->iStartChar;
-  tr.pWidths = m_pCharWidths + pPiece->iStartChar;
-  tr.iLength = pPiece->iChars;
-  tr.pFont = m_pFont;
-  tr.fFontSize = m_fFontSize;
-  tr.dwStyles = m_dwTxtBkStyles;
-  tr.iCharRotation = 0;
-  tr.dwCharStyles = pPiece->dwCharStyles;
-  tr.wLineBreakChar = m_wParagraphBkChar;
-  tr.pRect = &pPiece->rtPiece;
-}
-void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, IFDE_Pen*& pPen) {
-  FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline);
-  FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout);
-  FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
-  FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
-  if (!bUnderLine && !bStrikeOut && !bHotKey) {
-    return;
-  }
-  if (pPen == NULL) {
-    pPen = IFDE_Pen::Create();
-    pPen->SetColor(m_TxtColor);
-  }
-  IFDE_Path* pPath = IFDE_Path::Create();
-  int32_t iLineCount = 0;
-  CFX_RectF rtText = pPiece->rtPiece;
-  CFX_PointF pt1, pt2;
-  if (bUnderLine) {
-    if (bVertical) {
-      pt1.x = rtText.left;
-      pt1.y = rtText.top;
-      pt2.x = rtText.left;
-      pt2.y = rtText.bottom();
-    } else {
-      pt1.x = rtText.left;
-      pt1.y = rtText.bottom();
-      pt2.x = rtText.right();
-      pt2.y = rtText.bottom();
-    }
-    pPath->AddLine(pt1, pt2);
-    iLineCount++;
-  }
-  if (bStrikeOut) {
-    if (bVertical) {
-      pt1.x = rtText.left + rtText.width * 2.0f / 5.0f;
-      pt1.y = rtText.top;
-      pt2.x = pt1.x;
-      pt2.y = rtText.bottom();
-    } else {
-      pt1.x = rtText.left;
-      pt1.y = rtText.bottom() - rtText.height * 2.0f / 5.0f;
-      pt2.x = rtText.right();
-      pt2.y = pt1.y;
-    }
-    pPath->AddLine(pt1, pt2);
-    iLineCount++;
-  }
-  if (bHotKey) {
-    int32_t iHotKeys = m_hotKeys.GetSize();
-    int32_t iCount = GetCharRects(pPiece);
-    if (iCount > 0) {
-      for (int32_t i = 0; i < iHotKeys; i++) {
-        int32_t iCharIndex = m_hotKeys.GetAt(i);
-        if (iCharIndex >= pPiece->iStartChar &&
-            iCharIndex < pPiece->iStartChar + pPiece->iChars) {
-          CFX_RectF rect = m_rectArray.GetAt(iCharIndex - pPiece->iStartChar);
-          if (bVertical) {
-            pt1.x = rect.left;
-            pt1.y = rect.top;
-            pt2.x = rect.left;
-            pt2.y = rect.bottom();
-          } else {
-            pt1.x = rect.left;
-            pt1.y = rect.bottom();
-            pt2.x = rect.right();
-            pt2.y = rect.bottom();
-          }
-          pPath->AddLine(pt1, pt2);
-          iLineCount++;
-        }
-      }
-    }
-  }
-  if (iLineCount > 0) {
-    m_pRenderDevice->DrawPath(pPen, 1, pPath, &m_Matrix);
-  }
-  pPath->Release();
-}
-CFDE_TTOLine::CFDE_TTOLine()
-    : m_bNewReload(FALSE), m_pieces(5), m_iPieceCount(0) {}
-CFDE_TTOLine::CFDE_TTOLine(const CFDE_TTOLine& ttoLine) : m_pieces(5) {
-  m_bNewReload = ttoLine.m_bNewReload;
-  m_iPieceCount = ttoLine.m_iPieceCount;
-  m_pieces.Copy(ttoLine.m_pieces);
-}
-CFDE_TTOLine::~CFDE_TTOLine() {}
-int32_t CFDE_TTOLine::AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece) {
-  if (index >= m_iPieceCount) {
-    index = m_pieces.Add(ttoPiece) + 1;
-    m_iPieceCount++;
-  } else {
-    FDE_TTOPIECE& piece = m_pieces.GetAt(index);
-    piece = ttoPiece;
-  }
-  return index;
-}
-int32_t CFDE_TTOLine::GetSize() const {
-  return m_iPieceCount;
-}
-FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) {
-  if (index >= m_iPieceCount) {
-    return NULL;
-  }
-  return m_pieces.GetPtrAt(index);
-}
-void CFDE_TTOLine::RemoveLast(int32_t iCount) {
-  m_pieces.RemoveLast(iCount);
-}
-void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) {
-  m_pieces.RemoveAll(bLeaveMemory);
-}
diff --git a/xfa/src/fde/tto/fde_textout.h b/xfa/src/fde/tto/fde_textout.h
deleted file mode 100644
index 0b8074b..0000000
--- a/xfa/src/fde/tto/fde_textout.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_TTO_FDE_TEXTOUT_H_
-#define XFA_SRC_FDE_TTO_FDE_TEXTOUT_H_
-
-#include "core/include/fxge/fx_dib.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-#define FDE_TTOSTYLE_Underline 0x0001
-#define FDE_TTOSTYLE_Strikeout 0x0002
-#define FDE_TTOSTYLE_VerticalLayout 0x0004
-#define FDE_TTOSTYLE_SingleLine 0x0010
-#define FDE_TTOSTYLE_ExpandTab 0x0020
-#define FDE_TTOSTYLE_HotKey 0x0040
-#define FDE_TTOSTYLE_Ellipsis 0x0080
-#define FDE_TTOSTYLE_LineWrap 0x0100
-#define FDE_TTOSTYLE_ArabicShapes 0x0200
-#define FDE_TTOSTYLE_RTL 0x0400
-#define FDE_TTOSTYLE_ArabicContext 0x0800
-#define FDE_TTOSTYLE_LastLineHeight 0x1000
-#define FDE_TTOALIGNMENT_TopLeft 0
-#define FDE_TTOALIGNMENT_TopCenter 1
-#define FDE_TTOALIGNMENT_TopRight 2
-#define FDE_TTOALIGNMENT_TopAuto 3
-#define FDE_TTOALIGNMENT_CenterLeft 4
-#define FDE_TTOALIGNMENT_Center 5
-#define FDE_TTOALIGNMENT_CenterRight 6
-#define FDE_TTOALIGNMENT_CenterAuto 7
-#define FDE_TTOALIGNMENT_BottomLeft 8
-#define FDE_TTOALIGNMENT_BottomCenter 9
-#define FDE_TTOALIGNMENT_BottomRight 10
-#define FDE_TTOALIGNMENT_BottomAuto 11
-
-class IFDE_TextOut {
- public:
-  static IFDE_TextOut* Create();
-  virtual ~IFDE_TextOut() {}
-  virtual void Release() = 0;
-  virtual void SetFont(IFX_Font* pFont) = 0;
-  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
-  virtual void SetTextColor(FX_ARGB color) = 0;
-  virtual void SetStyles(FX_DWORD dwStyles) = 0;
-  virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0;
-  virtual void SetEllipsisString(const CFX_WideString& wsEllipsis) = 0;
-  virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
-  virtual void SetAlignment(int32_t iAlignment) = 0;
-  virtual void SetLineSpace(FX_FLOAT fLineSpace) = 0;
-  virtual void SetDIBitmap(CFX_DIBitmap* pDIB) = 0;
-  virtual void SetRenderDevice(CFX_RenderDevice* pDevice) = 0;
-  virtual void SetClipRect(const CFX_Rect& rtClip) = 0;
-  virtual void SetClipRect(const CFX_RectF& rtClip) = 0;
-  virtual void SetMatrix(const CFX_Matrix& matrix) = 0;
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Size& size) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_SizeF& size) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_Rect& rect) = 0;
-  virtual void CalcSize(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        CFX_RectF& rect) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        int32_t x,
-                        int32_t y) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        FX_FLOAT x,
-                        FX_FLOAT y) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_Rect& rect) = 0;
-  virtual void DrawText(const FX_WCHAR* pwsStr,
-                        int32_t iLength,
-                        const CFX_RectF& rect) = 0;
-  virtual void SetLogicClipRect(const CFX_RectF& rtClip) = 0;
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_SizeF& size) = 0;
-  virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             CFX_RectF& rect) = 0;
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             FX_FLOAT x,
-                             FX_FLOAT y) = 0;
-  virtual void DrawLogicText(const FX_WCHAR* pwsStr,
-                             int32_t iLength,
-                             const CFX_RectF& rect) = 0;
-  virtual int32_t GetTotalLines() = 0;
-};
-
-#endif  // XFA_SRC_FDE_TTO_FDE_TEXTOUT_H_
diff --git a/xfa/src/fde/xml/fde_xml.h b/xfa/src/fde/xml/fde_xml.h
deleted file mode 100644
index 03e2a60..0000000
--- a/xfa/src/fde/xml/fde_xml.h
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_XML_FDE_XML_H_
-#define XFA_SRC_FDE_XML_FDE_XML_H_
-
-#include "xfa/src/fgas/crt/fgas_stream.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-class IFDE_XMLNode;
-class IFDE_XMLInstruction;
-class IFDE_XMLDeclaration;
-class IFDE_XMLElement;
-class IFDE_XMLText;
-class IFDE_XMLDoc;
-class IFDE_XMLParser;
-class IFDE_XMLSyntaxParser;
-
-enum FDE_XMLNODETYPE {
-  FDE_XMLNODE_Unknown = 0,
-  FDE_XMLNODE_Instruction,
-  FDE_XMLNODE_Element,
-  FDE_XMLNODE_Text,
-  FDE_XMLNODE_CharData,
-};
-
-struct FDE_XMLNODE {
-  int32_t iNodeNum;
-  FDE_XMLNODETYPE eNodeType;
-};
-typedef CFX_StackTemplate<FDE_XMLNODE> CFDE_XMLNodeStack;
-
-FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch);
-FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch);
-FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar);
-
-class IFDE_XMLNode {
- public:
-  virtual ~IFDE_XMLNode() {}
-  virtual void Release() = 0;
-  virtual FDE_XMLNODETYPE GetType() const = 0;
-  virtual int32_t CountChildNodes() const = 0;
-  virtual IFDE_XMLNode* GetChildNode(int32_t index) const = 0;
-  virtual int32_t GetChildNodeIndex(IFDE_XMLNode* pNode) const = 0;
-  virtual IFDE_XMLNode* GetPath(const FX_WCHAR* pPath,
-                                int32_t iLength = -1,
-                                FX_BOOL bQualifiedName = TRUE) const = 0;
-  virtual int32_t InsertChildNode(IFDE_XMLNode* pNode, int32_t index = -1) = 0;
-  virtual void RemoveChildNode(IFDE_XMLNode* pNode) = 0;
-  virtual void DeleteChildren() = 0;
-  enum NodeItem {
-    Root = 0,
-    Parent,
-    FirstSibling,
-    PriorSibling,
-    NextSibling,
-    LastSibling,
-    FirstNeighbor,
-    PriorNeighbor,
-    NextNeighbor,
-    LastNeighbor,
-    FirstChild,
-    LastChild
-  };
-  virtual IFDE_XMLNode* GetNodeItem(NodeItem eItem) const = 0;
-  virtual int32_t GetNodeLevel() const = 0;
-  virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
-                                 IFDE_XMLNode* pNode) = 0;
-  virtual IFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) = 0;
-  virtual IFDE_XMLNode* Clone(FX_BOOL bRecursive) = 0;
-  virtual void SaveXMLNode(IFX_Stream* pXMLStream) = 0;
-};
-class IFDE_XMLInstruction : public IFDE_XMLNode {
- public:
-  static IFDE_XMLInstruction* Create(const CFX_WideString& wsTarget);
-  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
-  virtual int32_t CountAttributes() const = 0;
-  virtual FX_BOOL GetAttribute(int32_t index,
-                               CFX_WideString& wsAttriName,
-                               CFX_WideString& wsAttriValue) const = 0;
-  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
-  virtual void GetString(const FX_WCHAR* pwsAttriName,
-                         CFX_WideString& wsAttriValue,
-                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
-  virtual void SetString(const CFX_WideString& wsAttriName,
-                         const CFX_WideString& wsAttriValue) = 0;
-  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
-                             int32_t iDefValue = 0) const = 0;
-  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
-                          int32_t iAttriValue) = 0;
-  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
-                            FX_FLOAT fDefValue = 0) const = 0;
-  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
-  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
-  virtual int32_t CountData() const = 0;
-  virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const = 0;
-  virtual void AppendData(const CFX_WideString& wsData) = 0;
-  virtual void RemoveData(int32_t index) = 0;
-};
-class IFDE_XMLElement : public IFDE_XMLNode {
- public:
-  static IFDE_XMLElement* Create(const CFX_WideString& wsTag);
-  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
-  virtual void GetLocalTagName(CFX_WideString& wsTag) const = 0;
-  virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const = 0;
-  virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const = 0;
-  virtual int32_t CountAttributes() const = 0;
-  virtual FX_BOOL GetAttribute(int32_t index,
-                               CFX_WideString& wsAttriName,
-                               CFX_WideString& wsAttriValue) const = 0;
-  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const = 0;
-  virtual void GetString(const FX_WCHAR* pwsAttriName,
-                         CFX_WideString& wsAttriValue,
-                         const FX_WCHAR* pwsDefValue = NULL) const = 0;
-  virtual void SetString(const CFX_WideString& wsAttriName,
-                         const CFX_WideString& wsAttriValue) = 0;
-  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
-                             int32_t iDefValue = 0) const = 0;
-  virtual void SetInteger(const FX_WCHAR* pwsAttriName,
-                          int32_t iAttriValue) = 0;
-  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
-                            FX_FLOAT fDefValue = 0) const = 0;
-  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue) = 0;
-  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName) = 0;
-  virtual void GetTextData(CFX_WideString& wsText) const = 0;
-  virtual void SetTextData(const CFX_WideString& wsText) = 0;
-};
-class IFDE_XMLText : public IFDE_XMLNode {
- public:
-  static IFDE_XMLText* Create(const CFX_WideString& wsText);
-  virtual void GetText(CFX_WideString& wsText) const = 0;
-  virtual void SetText(const CFX_WideString& wsText) = 0;
-};
-class IFDE_XMLDeclaration : public IFDE_XMLNode {
- public:
-};
-class IFDE_XMLCharData : public IFDE_XMLDeclaration {
- public:
-  static IFDE_XMLCharData* Create(const CFX_WideString& wsCData);
-  virtual ~IFDE_XMLCharData() {}
-
-  virtual void GetCharData(CFX_WideString& wsCData) const = 0;
-  virtual void SetCharData(const CFX_WideString& wsCData) = 0;
-};
-
-struct FDE_XMLREADERHANDLER {
-  void* pData;
-  void (*OnTagEnter)(FDE_XMLREADERHANDLER* pThis,
-                     FDE_XMLNODETYPE eType,
-                     const CFX_WideString& wsTagName);
-  void (*OnTagBreak)(FDE_XMLREADERHANDLER* pThis,
-                     const CFX_WideString& wsTagName);
-  void (*OnTagClose)(FDE_XMLREADERHANDLER* pThis,
-                     const CFX_WideString& wsTagName);
-  void (*OnAttribute)(FDE_XMLREADERHANDLER* pThis,
-                      const CFX_WideString& wsName,
-                      const CFX_WideString& wsValue);
-  void (*OnData)(FDE_XMLREADERHANDLER* pThis,
-                 FDE_XMLNODETYPE eType,
-                 const CFX_WideString& wsValue);
-};
-
-class IFDE_XMLDoc {
- public:
-  static IFDE_XMLDoc* Create();
-  virtual ~IFDE_XMLDoc() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream,
-                          int32_t iXMLPlaneSize = 8192,
-                          int32_t iTextDataSize = 256,
-                          FDE_XMLREADERHANDLER* pHandler = NULL) = 0;
-  virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser) = 0;
-  virtual int32_t DoLoad(IFX_Pause* pPause = NULL) = 0;
-  virtual void CloseXML() = 0;
-  virtual IFDE_XMLNode* GetRoot() const = 0;
-  virtual void SaveXML(IFX_Stream* pXMLStream = NULL,
-                       FX_BOOL bSaveBOM = TRUE) = 0;
-  virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode) = 0;
-};
-class IFDE_XMLParser {
- public:
-  virtual ~IFDE_XMLParser() {}
-  virtual void Release() = 0;
-  virtual int32_t DoParser(IFX_Pause* pPause) = 0;
-};
-#define FDE_XMLSYNTAXSTATUS_None 0x00
-#define FDE_XMLSYNTAXSTATUS_InstructionOpen 0x01
-#define FDE_XMLSYNTAXSTATUS_InstructionClose 0x02
-#define FDE_XMLSYNTAXSTATUS_ElementOpen 0x03
-#define FDE_XMLSYNTAXSTATUS_ElementBreak 0x04
-#define FDE_XMLSYNTAXSTATUS_ElementClose 0x05
-#define FDE_XMLSYNTAXSTATUS_TargetName 0x06
-#define FDE_XMLSYNTAXSTATUS_TagName 0x07
-#define FDE_XMLSYNTAXSTATUS_AttriName 0x08
-#define FDE_XMLSYNTAXSTATUS_AttriValue 0x09
-#define FDE_XMLSYNTAXSTATUS_Text 0x0A
-#define FDE_XMLSYNTAXSTATUS_CData 0x0B
-#define FDE_XMLSYNTAXSTATUS_TargetData 0x0C
-#define FDE_XMLSYNTAXSTATUS_Error 0xFE
-#define FDE_XMLSYNTAXSTATUS_EOS 0xFF
-class IFDE_XMLSyntaxParser {
- public:
-  static IFDE_XMLSyntaxParser* Create();
-  virtual ~IFDE_XMLSyntaxParser() {}
-  virtual void Release() = 0;
-  virtual void Init(IFX_Stream* pStream,
-                    int32_t iXMLPlaneSize,
-                    int32_t iTextDataSize = 256) = 0;
-  virtual FX_DWORD DoSyntaxParse() = 0;
-  virtual int32_t GetStatus() const = 0;
-  virtual int32_t GetCurrentPos() const = 0;
-  virtual FX_FILESIZE GetCurrentBinaryPos() const = 0;
-  virtual int32_t GetCurrentNodeNumber() const = 0;
-  virtual int32_t GetLastNodeNumber() const = 0;
-  virtual void GetTargetName(CFX_WideString& wsTarget) const = 0;
-  virtual void GetTagName(CFX_WideString& wsTag) const = 0;
-  virtual void GetAttributeName(CFX_WideString& wsAttriName) const = 0;
-  virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const = 0;
-  virtual void GetTextData(CFX_WideString& wsText) const = 0;
-  virtual void GetTargetData(CFX_WideString& wsData) const = 0;
-};
-
-#endif  // XFA_SRC_FDE_XML_FDE_XML_H_
diff --git a/xfa/src/fde/xml/fde_xml_imp.cpp b/xfa/src/fde/xml/fde_xml_imp.cpp
deleted file mode 100644
index 94e5de6..0000000
--- a/xfa/src/fde/xml/fde_xml_imp.cpp
+++ /dev/null
@@ -1,2100 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fde/xml/fde_xml_imp.h"
-
-#include <algorithm>
-
-#include "xfa/src/fgas/crt/fgas_system.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-
-#define FDE_XMLVALIDCHARRANGENUM 5
-
-static const FX_WCHAR g_XMLValidCharRange[FDE_XMLVALIDCHARRANGENUM][2] = {
-    {0x09, 0x09},
-    {0x0A, 0x0A},
-    {0x0D, 0x0D},
-    {0x20, 0xD7FF},
-    {0xE000, 0xFFFD}};
-
-FX_BOOL FDE_IsXMLValidChar(FX_WCHAR ch) {
-  int32_t iStart = 0, iEnd = FDE_XMLVALIDCHARRANGENUM - 1, iMid;
-  while (iStart <= iEnd) {
-    iMid = (iStart + iEnd) / 2;
-    if (ch < g_XMLValidCharRange[iMid][0]) {
-      iEnd = iMid - 1;
-    } else if (ch > g_XMLValidCharRange[iMid][1]) {
-      iStart = iMid + 1;
-    } else {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL FDE_IsXMLWhiteSpace(FX_WCHAR ch) {
-  return ch == L' ' || ch == 0x0A || ch == 0x0D || ch == 0x09;
-}
-
-struct FDE_XMLNAMECHAR {
-  FX_WCHAR wStart;
-  FX_WCHAR wEnd;
-  FX_BOOL bStartChar;
-};
-
-#define FDE_XMLNAMECHARSNUM 20
-static FDE_XMLNAMECHAR g_XMLNameChars[FDE_XMLNAMECHARSNUM] = {
-    {L'-', L'.', FALSE},    {L'0', L'9', FALSE},     {L':', L':', FALSE},
-    {L'A', L'Z', TRUE},     {L'_', L'_', TRUE},      {L'a', L'z', TRUE},
-    {0xB7, 0xB7, FALSE},    {0xC0, 0xD6, TRUE},      {0xD8, 0xF6, TRUE},
-    {0xF8, 0x02FF, TRUE},   {0x0300, 0x036F, FALSE}, {0x0370, 0x037D, TRUE},
-    {0x037F, 0x1FFF, TRUE}, {0x200C, 0x200D, TRUE},  {0x203F, 0x2040, FALSE},
-    {0x2070, 0x218F, TRUE}, {0x2C00, 0x2FEF, TRUE},  {0x3001, 0xD7FF, TRUE},
-    {0xF900, 0xFDCF, TRUE}, {0xFDF0, 0xFFFD, TRUE},
-};
-
-FX_BOOL FDE_IsXMLNameChar(FX_WCHAR ch, FX_BOOL bFirstChar) {
-  int32_t iStart = 0, iEnd = FDE_XMLNAMECHARSNUM - 1, iMid;
-  while (iStart <= iEnd) {
-    iMid = (iStart + iEnd) / 2;
-    if (ch < g_XMLNameChars[iMid].wStart) {
-      iEnd = iMid - 1;
-    } else if (ch > g_XMLNameChars[iMid].wEnd) {
-      iStart = iMid + 1;
-    } else {
-      if (bFirstChar) {
-        return g_XMLNameChars[iMid].bStartChar;
-      }
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-CFDE_XMLNode::CFDE_XMLNode()
-    : m_pParent(NULL), m_pChild(NULL), m_pPrior(NULL), m_pNext(NULL) {}
-CFDE_XMLNode::~CFDE_XMLNode() {
-  DeleteChildren();
-}
-void CFDE_XMLNode::DeleteChildren() {
-  CFDE_XMLNode *pChild = m_pChild, *pTemp;
-  while (pChild != NULL) {
-    pTemp = pChild->m_pNext;
-    pChild->Release();
-    pChild = pTemp;
-  }
-  m_pChild = NULL;
-}
-int32_t CFDE_XMLNode::CountChildNodes() const {
-  int32_t iCount = 0;
-  CFDE_XMLNode* pChild = m_pChild;
-  while (pChild != NULL) {
-    iCount++;
-    pChild = pChild->m_pNext;
-  }
-  return iCount;
-}
-CFDE_XMLNode* CFDE_XMLNode::GetChildNode(int32_t index) const {
-  CFDE_XMLNode* pChild = m_pChild;
-  while (pChild != NULL) {
-    if (index == 0) {
-      return pChild;
-    }
-    index--;
-    pChild = pChild->m_pNext;
-  }
-  return NULL;
-}
-int32_t CFDE_XMLNode::GetChildNodeIndex(CFDE_XMLNode* pNode) const {
-  int32_t index = 0;
-  CFDE_XMLNode* pChild = m_pChild;
-  while (pChild != NULL) {
-    if (pChild == pNode) {
-      return index;
-    }
-    index++;
-    pChild = pChild->m_pNext;
-  }
-  return -1;
-}
-CFDE_XMLNode* CFDE_XMLNode::GetPath(const FX_WCHAR* pPath,
-                                    int32_t iLength,
-                                    FX_BOOL bQualifiedName) const {
-  FXSYS_assert(pPath != NULL);
-  if (iLength < 0) {
-    iLength = FXSYS_wcslen(pPath);
-  }
-  if (iLength == 0) {
-    return NULL;
-  }
-  CFX_WideString csPath;
-  const FX_WCHAR* pStart = pPath;
-  const FX_WCHAR* pEnd = pPath + iLength;
-  FX_WCHAR ch;
-  while (pStart < pEnd) {
-    ch = *pStart++;
-    if (ch == L'/') {
-      break;
-    } else {
-      csPath += ch;
-    }
-  }
-  iLength -= pStart - pPath;
-  CFDE_XMLNode* pFind = NULL;
-  if (csPath.GetLength() < 1) {
-    pFind = GetNodeItem(IFDE_XMLNode::Root);
-  } else if (csPath.Compare(L"..") == 0) {
-    pFind = m_pParent;
-  } else if (csPath.Compare(L".") == 0) {
-    pFind = (CFDE_XMLNode*)this;
-  } else {
-    CFX_WideString wsTag;
-    CFDE_XMLNode* pNode = m_pChild;
-    while (pNode != NULL) {
-      if (pNode->GetType() == FDE_XMLNODE_Element) {
-        if (bQualifiedName) {
-          ((CFDE_XMLElement*)pNode)->GetTagName(wsTag);
-        } else {
-          ((CFDE_XMLElement*)pNode)->GetLocalTagName(wsTag);
-        }
-        if (wsTag.Compare(csPath) == 0) {
-          if (iLength < 1) {
-            pFind = pNode;
-          } else {
-            pFind = pNode->GetPath(pStart, iLength, bQualifiedName);
-          }
-          if (pFind != NULL) {
-            return pFind;
-          }
-        }
-      }
-      pNode = pNode->m_pNext;
-    }
-  }
-  if (pFind == NULL || iLength < 1) {
-    return pFind;
-  }
-  return pFind->GetPath(pStart, iLength, bQualifiedName);
-}
-int32_t CFDE_XMLNode::InsertChildNode(CFDE_XMLNode* pNode, int32_t index) {
-  FXSYS_assert(pNode != NULL);
-  pNode->m_pParent = this;
-  if (m_pChild == NULL) {
-    m_pChild = pNode;
-    pNode->m_pPrior = NULL;
-    pNode->m_pNext = NULL;
-    return 0;
-  } else if (index == 0) {
-    pNode->m_pNext = m_pChild;
-    pNode->m_pPrior = NULL;
-    m_pChild->m_pPrior = pNode;
-    m_pChild = pNode;
-    return 0;
-  }
-  int32_t iCount = 0;
-  CFDE_XMLNode* pFind = m_pChild;
-  while (++iCount != index && pFind->m_pNext != NULL) {
-    pFind = pFind->m_pNext;
-  }
-  pNode->m_pPrior = pFind;
-  pNode->m_pNext = pFind->m_pNext;
-  if (pFind->m_pNext != NULL) {
-    pFind->m_pNext->m_pPrior = pNode;
-  }
-  pFind->m_pNext = pNode;
-  return iCount;
-}
-void CFDE_XMLNode::RemoveChildNode(CFDE_XMLNode* pNode) {
-  FXSYS_assert(m_pChild != NULL && pNode != NULL);
-  if (m_pChild == pNode) {
-    m_pChild = pNode->m_pNext;
-  } else {
-    pNode->m_pPrior->m_pNext = pNode->m_pNext;
-  }
-  if (pNode->m_pNext != NULL) {
-    pNode->m_pNext->m_pPrior = pNode->m_pPrior;
-  }
-  pNode->m_pParent = NULL;
-  pNode->m_pNext = NULL;
-  pNode->m_pPrior = NULL;
-}
-CFDE_XMLNode* CFDE_XMLNode::GetNodeItem(IFDE_XMLNode::NodeItem eItem) const {
-  switch (eItem) {
-    case IFDE_XMLNode::Root: {
-      CFDE_XMLNode* pParent = (CFDE_XMLNode*)this;
-      while (pParent->m_pParent != NULL) {
-        pParent = pParent->m_pParent;
-      }
-      return pParent;
-    }
-    case IFDE_XMLNode::Parent:
-      return m_pParent;
-    case IFDE_XMLNode::FirstSibling: {
-      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
-      while (pItem->m_pPrior != NULL) {
-        pItem = pItem->m_pPrior;
-      }
-      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
-    }
-    case IFDE_XMLNode::PriorSibling:
-      return m_pPrior;
-    case IFDE_XMLNode::NextSibling:
-      return m_pNext;
-    case IFDE_XMLNode::LastSibling: {
-      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
-      while (pItem->m_pNext != NULL) {
-        pItem = pItem->m_pNext;
-      }
-      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
-    }
-    case IFDE_XMLNode::FirstNeighbor: {
-      CFDE_XMLNode* pParent = (CFDE_XMLNode*)this;
-      while (pParent->m_pParent != NULL) {
-        pParent = pParent->m_pParent;
-      }
-      return pParent == (CFDE_XMLNode*)this ? NULL : pParent;
-    }
-    case IFDE_XMLNode::PriorNeighbor: {
-      if (m_pPrior == NULL) {
-        return m_pParent;
-      }
-      CFDE_XMLNode* pItem = m_pPrior;
-      while (CFDE_XMLNode* pTemp = pItem->m_pChild) {
-        pItem = pTemp;
-        while ((pTemp = pItem->m_pNext) != NULL) {
-          pItem = pTemp;
-        }
-      }
-      return pItem;
-    }
-    case IFDE_XMLNode::NextNeighbor: {
-      if (m_pChild != NULL) {
-        return m_pChild;
-      }
-      if (m_pNext != NULL) {
-        return m_pNext;
-      }
-      CFDE_XMLNode* pItem = m_pParent;
-      while (pItem != NULL) {
-        if (pItem->m_pNext != NULL) {
-          return pItem->m_pNext;
-        }
-        pItem = pItem->m_pParent;
-      }
-      return NULL;
-    }
-    case IFDE_XMLNode::LastNeighbor: {
-      CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
-      while (pItem->m_pParent != NULL) {
-        pItem = pItem->m_pParent;
-      }
-      while (TRUE) {
-        while (pItem->m_pNext != NULL) {
-          pItem = pItem->m_pNext;
-        }
-        if (pItem->m_pChild == NULL) {
-          break;
-        }
-        pItem = pItem->m_pChild;
-      }
-      return pItem == (CFDE_XMLNode*)this ? NULL : pItem;
-    }
-    case IFDE_XMLNode::FirstChild:
-      return m_pChild;
-    case IFDE_XMLNode::LastChild: {
-      if (m_pChild == NULL) {
-        return NULL;
-      }
-      CFDE_XMLNode* pChild = m_pChild;
-      while (pChild->m_pNext != NULL) {
-        pChild = pChild->m_pNext;
-      }
-      return pChild;
-    }
-    default:
-      break;
-  }
-  return NULL;
-}
-int32_t CFDE_XMLNode::GetNodeLevel() const {
-  int32_t iLevel = 0;
-  CFDE_XMLNode* pItem = (CFDE_XMLNode*)this;
-  while ((pItem = pItem->m_pParent) != NULL) {
-    iLevel++;
-  }
-  return iLevel;
-}
-FX_BOOL CFDE_XMLNode::InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
-                                     CFDE_XMLNode* pNode) {
-  FXSYS_assert(pNode != NULL);
-  switch (eItem) {
-    case IFDE_XMLNode::NextSibling: {
-      pNode->m_pParent = m_pParent;
-      pNode->m_pNext = m_pNext;
-      pNode->m_pPrior = this;
-      if (m_pNext) {
-        m_pNext->m_pPrior = pNode;
-      }
-      m_pNext = pNode;
-      return TRUE;
-    }
-    case IFDE_XMLNode::PriorSibling: {
-      pNode->m_pParent = m_pParent;
-      pNode->m_pNext = this;
-      pNode->m_pPrior = m_pPrior;
-      if (m_pPrior) {
-        m_pPrior->m_pNext = pNode;
-      } else if (m_pParent) {
-        m_pParent->m_pChild = pNode;
-      }
-      m_pPrior = pNode;
-      return TRUE;
-    }
-    default:
-      return FALSE;
-  }
-  return FALSE;
-}
-CFDE_XMLNode* CFDE_XMLNode::RemoveNodeItem(IFDE_XMLNode::NodeItem eItem) {
-  CFDE_XMLNode* pNode = NULL;
-  switch (eItem) {
-    case IFDE_XMLNode::NextSibling:
-      if (m_pNext) {
-        pNode = m_pNext;
-        m_pNext = pNode->m_pNext;
-        if (m_pNext) {
-          m_pNext->m_pPrior = this;
-        }
-        pNode->m_pParent = NULL;
-        pNode->m_pNext = NULL;
-        pNode->m_pPrior = NULL;
-      }
-      break;
-    default:
-      break;
-  }
-  return pNode;
-}
-CFDE_XMLNode* CFDE_XMLNode::Clone(FX_BOOL bRecursive) {
-  return NULL;
-}
-void CFDE_XMLNode::SaveXMLNode(IFX_Stream* pXMLStream) {
-  CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
-  FXSYS_assert(pXMLStream != NULL && pNode != NULL);
-  switch (pNode->GetType()) {
-    case FDE_XMLNODE_Instruction: {
-      CFX_WideString ws;
-      CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
-      if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
-        ws = L"<?xml version=\"1.0\" encoding=\"";
-        FX_WORD wCodePage = pXMLStream->GetCodePage();
-        if (wCodePage == FX_CODEPAGE_UTF16LE) {
-          ws += L"UTF-16";
-        } else if (wCodePage == FX_CODEPAGE_UTF16BE) {
-          ws += L"UTF-16be";
-        } else {
-          ws += L"UTF-8";
-        }
-        ws += L"\"?>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      } else {
-        ws.Format(L"<?%s", (const FX_WCHAR*)pInstruction->m_wsTarget);
-        pXMLStream->WriteString(ws, ws.GetLength());
-        CFX_WideStringArray& attributes = pInstruction->m_Attributes;
-        int32_t i, iCount = attributes.GetSize();
-        CFX_WideString wsValue;
-        for (i = 0; i < iCount; i += 2) {
-          ws = L" ";
-          ws += attributes[i];
-          ws += L"=\"";
-          wsValue = attributes[i + 1];
-          wsValue.Replace(L"&", L"&amp;");
-          wsValue.Replace(L"<", L"&lt;");
-          wsValue.Replace(L">", L"&gt;");
-          wsValue.Replace(L"\'", L"&apos;");
-          wsValue.Replace(L"\"", L"&quot;");
-          ws += wsValue;
-          ws += L"\"";
-          pXMLStream->WriteString(ws, ws.GetLength());
-        }
-        CFX_WideStringArray& targetdata = pInstruction->m_TargetData;
-        iCount = targetdata.GetSize();
-        for (i = 0; i < iCount; i++) {
-          ws = L" \"";
-          ws += targetdata[i];
-          ws += L"\"";
-          pXMLStream->WriteString(ws, ws.GetLength());
-        }
-        ws = L"?>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-    } break;
-    case FDE_XMLNODE_Element: {
-      CFX_WideString ws;
-      ws = L"<";
-      ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
-      pXMLStream->WriteString(ws, ws.GetLength());
-      CFX_WideStringArray& attributes = ((CFDE_XMLElement*)pNode)->m_Attributes;
-      int32_t iCount = attributes.GetSize();
-      CFX_WideString wsValue;
-      for (int32_t i = 0; i < iCount; i += 2) {
-        ws = L" ";
-        ws += attributes[i];
-        ws += L"=\"";
-        wsValue = attributes[i + 1];
-        wsValue.Replace(L"&", L"&amp;");
-        wsValue.Replace(L"<", L"&lt;");
-        wsValue.Replace(L">", L"&gt;");
-        wsValue.Replace(L"\'", L"&apos;");
-        wsValue.Replace(L"\"", L"&quot;");
-        ws += wsValue;
-        ws += L"\"";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-      if (pNode->m_pChild == NULL) {
-        ws = L"\n/>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      } else {
-        ws = L"\n>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-        CFDE_XMLNode* pChild = pNode->m_pChild;
-        while (pChild != NULL) {
-          pChild->SaveXMLNode(pXMLStream);
-          pChild = pChild->m_pNext;
-        }
-        ws = L"</";
-        ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
-        ws += L"\n>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-    } break;
-    case FDE_XMLNODE_Text: {
-      CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText;
-      ws.Replace(L"&", L"&amp;");
-      ws.Replace(L"<", L"&lt;");
-      ws.Replace(L">", L"&gt;");
-      ws.Replace(L"\'", L"&apos;");
-      ws.Replace(L"\"", L"&quot;");
-      pXMLStream->WriteString(ws, ws.GetLength());
-    } break;
-    case FDE_XMLNODE_CharData: {
-      CFX_WideString ws = L"<![CDATA[";
-      ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
-      ws += L"]]>";
-      pXMLStream->WriteString(ws, ws.GetLength());
-    } break;
-    case FDE_XMLNODE_Unknown:
-      break;
-    default:
-      break;
-  }
-}
-void CFDE_XMLNode::CloneChildren(CFDE_XMLNode* pClone) {
-  if (!m_pChild) {
-    return;
-  }
-  CFDE_XMLNode* pNext = m_pChild;
-  CFDE_XMLNode* pCloneNext = pNext->Clone(TRUE);
-  pClone->InsertChildNode(pCloneNext);
-  pNext = pNext->m_pNext;
-  while (pNext) {
-    CFDE_XMLNode* pChild = pNext->Clone(TRUE);
-    pCloneNext->InsertNodeItem(IFDE_XMLNode::NextSibling, pChild);
-    pCloneNext = pChild;
-    pNext = pNext->m_pNext;
-  }
-}
-IFDE_XMLInstruction* IFDE_XMLInstruction::Create(
-    const CFX_WideString& wsTarget) {
-  return (IFDE_XMLInstruction*)new CFDE_XMLInstruction(wsTarget);
-}
-CFDE_XMLInstruction::CFDE_XMLInstruction(const CFX_WideString& wsTarget)
-    : m_wsTarget(wsTarget) {
-  FXSYS_assert(m_wsTarget.GetLength() > 0);
-}
-CFDE_XMLNode* CFDE_XMLInstruction::Clone(FX_BOOL bRecursive) {
-  CFDE_XMLInstruction* pClone = new CFDE_XMLInstruction(m_wsTarget);
-  if (!pClone) {
-    return pClone;
-  }
-  pClone->m_Attributes.Copy(m_Attributes);
-  pClone->m_TargetData.Copy(m_TargetData);
-  if (bRecursive) {
-    CloneChildren(pClone);
-  }
-  return pClone;
-}
-int32_t CFDE_XMLInstruction::CountAttributes() const {
-  return m_Attributes.GetSize() / 2;
-}
-FX_BOOL CFDE_XMLInstruction::GetAttribute(int32_t index,
-                                          CFX_WideString& wsAttriName,
-                                          CFX_WideString& wsAttriValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  FXSYS_assert(index > -1 && index < iCount / 2);
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (index == 0) {
-      wsAttriName = m_Attributes[i];
-      wsAttriValue = m_Attributes[i + 1];
-      return TRUE;
-    }
-    index--;
-  }
-  return FALSE;
-}
-FX_BOOL CFDE_XMLInstruction::HasAttribute(const FX_WCHAR* pwsAttriName) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CFDE_XMLInstruction::GetString(const FX_WCHAR* pwsAttriName,
-                                    CFX_WideString& wsAttriValue,
-                                    const FX_WCHAR* pwsDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      wsAttriValue = m_Attributes[i + 1];
-      return;
-    }
-  }
-  wsAttriValue = pwsDefValue;
-}
-void CFDE_XMLInstruction::SetString(const CFX_WideString& wsAttriName,
-                                    const CFX_WideString& wsAttriValue) {
-  FXSYS_assert(wsAttriName.GetLength() > 0);
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(wsAttriName) == 0) {
-      m_Attributes[i] = wsAttriName;
-      m_Attributes[i + 1] = wsAttriValue;
-      return;
-    }
-  }
-  m_Attributes.Add(wsAttriName);
-  m_Attributes.Add(wsAttriValue);
-}
-int32_t CFDE_XMLInstruction::GetInteger(const FX_WCHAR* pwsAttriName,
-                                        int32_t iDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return FXSYS_wtoi((const FX_WCHAR*)m_Attributes[i + 1]);
-    }
-  }
-  return iDefValue;
-}
-void CFDE_XMLInstruction::SetInteger(const FX_WCHAR* pwsAttriName,
-                                     int32_t iAttriValue) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%d", iAttriValue);
-  SetString(pwsAttriName, wsValue);
-}
-FX_FLOAT CFDE_XMLInstruction::GetFloat(const FX_WCHAR* pwsAttriName,
-                                       FX_FLOAT fDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return FX_wcstof((const FX_WCHAR*)m_Attributes[i + 1]);
-    }
-  }
-  return fDefValue;
-}
-void CFDE_XMLInstruction::SetFloat(const FX_WCHAR* pwsAttriName,
-                                   FX_FLOAT fAttriValue) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%f", fAttriValue);
-  SetString(pwsAttriName, wsValue);
-}
-void CFDE_XMLInstruction::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      m_Attributes.RemoveAt(i + 1);
-      m_Attributes.RemoveAt(i);
-      return;
-    }
-  }
-}
-int32_t CFDE_XMLInstruction::CountData() const {
-  return m_TargetData.GetSize();
-}
-FX_BOOL CFDE_XMLInstruction::GetData(int32_t index,
-                                     CFX_WideString& wsData) const {
-  if (index < 0 || index >= m_TargetData.GetSize()) {
-    return FALSE;
-  }
-  wsData = m_TargetData[index];
-  return TRUE;
-}
-void CFDE_XMLInstruction::AppendData(const CFX_WideString& wsData) {
-  m_TargetData.Add(wsData);
-}
-void CFDE_XMLInstruction::RemoveData(int32_t index) {
-  m_TargetData.RemoveAt(index);
-}
-IFDE_XMLElement* IFDE_XMLElement::Create(const CFX_WideString& wsTag) {
-  return (IFDE_XMLElement*)new CFDE_XMLElement(wsTag);
-}
-CFDE_XMLElement::CFDE_XMLElement(const CFX_WideString& wsTag)
-    : CFDE_XMLNode(), m_wsTag(wsTag), m_Attributes() {
-  FXSYS_assert(m_wsTag.GetLength() > 0);
-}
-CFDE_XMLElement::~CFDE_XMLElement() {
-  m_Attributes.RemoveAll();
-}
-CFDE_XMLNode* CFDE_XMLElement::Clone(FX_BOOL bRecursive) {
-  CFDE_XMLElement* pClone = new CFDE_XMLElement(m_wsTag);
-  if (!pClone) {
-    return NULL;
-  }
-  pClone->m_Attributes.Copy(m_Attributes);
-  if (bRecursive) {
-    CloneChildren(pClone);
-  } else {
-    CFX_WideString wsText;
-    CFDE_XMLNode* pChild = m_pChild;
-    while (pChild != NULL) {
-      switch (pChild->GetType()) {
-        case FDE_XMLNODE_Text:
-          wsText += ((CFDE_XMLText*)pChild)->m_wsText;
-          break;
-        default:
-          break;
-      }
-      pChild = pChild->m_pNext;
-    }
-    pClone->SetTextData(wsText);
-  }
-  return pClone;
-}
-void CFDE_XMLElement::GetTagName(CFX_WideString& wsTag) const {
-  wsTag = m_wsTag;
-}
-void CFDE_XMLElement::GetLocalTagName(CFX_WideString& wsTag) const {
-  FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
-  if (iFind < 0) {
-    wsTag = m_wsTag;
-  } else {
-    wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1);
-  }
-}
-void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const {
-  FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
-  if (iFind < 0) {
-    wsPrefix.Empty();
-  } else {
-    wsPrefix = m_wsTag.Left(iFind);
-  }
-}
-void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const {
-  CFX_WideString wsAttri(L"xmlns"), wsPrefix;
-  GetNamespacePrefix(wsPrefix);
-  if (wsPrefix.GetLength() > 0) {
-    wsAttri += L":";
-    wsAttri += wsPrefix;
-  }
-  wsNamespace.Empty();
-  CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
-  while (pNode != NULL) {
-    if (pNode->GetType() != FDE_XMLNODE_Element) {
-      break;
-    }
-    CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode;
-    if (!pElement->HasAttribute(wsAttri)) {
-      pNode = pNode->GetNodeItem(IFDE_XMLNode::Parent);
-      continue;
-    }
-    pElement->GetString(wsAttri, wsNamespace);
-    break;
-  }
-}
-int32_t CFDE_XMLElement::CountAttributes() const {
-  return m_Attributes.GetSize() / 2;
-}
-FX_BOOL CFDE_XMLElement::GetAttribute(int32_t index,
-                                      CFX_WideString& wsAttriName,
-                                      CFX_WideString& wsAttriValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  FXSYS_assert(index > -1 && index < iCount / 2);
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (index == 0) {
-      wsAttriName = m_Attributes[i];
-      wsAttriValue = m_Attributes[i + 1];
-      return TRUE;
-    }
-    index--;
-  }
-  return FALSE;
-}
-FX_BOOL CFDE_XMLElement::HasAttribute(const FX_WCHAR* pwsAttriName) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CFDE_XMLElement::GetString(const FX_WCHAR* pwsAttriName,
-                                CFX_WideString& wsAttriValue,
-                                const FX_WCHAR* pwsDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      wsAttriValue = m_Attributes[i + 1];
-      return;
-    }
-  }
-  wsAttriValue = pwsDefValue;
-}
-void CFDE_XMLElement::SetString(const CFX_WideString& wsAttriName,
-                                const CFX_WideString& wsAttriValue) {
-  FXSYS_assert(wsAttriName.GetLength() > 0);
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(wsAttriName) == 0) {
-      m_Attributes[i] = wsAttriName;
-      m_Attributes[i + 1] = wsAttriValue;
-      return;
-    }
-  }
-  m_Attributes.Add(wsAttriName);
-  m_Attributes.Add(wsAttriValue);
-}
-int32_t CFDE_XMLElement::GetInteger(const FX_WCHAR* pwsAttriName,
-                                    int32_t iDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return FXSYS_wtoi((const FX_WCHAR*)m_Attributes[i + 1]);
-    }
-  }
-  return iDefValue;
-}
-void CFDE_XMLElement::SetInteger(const FX_WCHAR* pwsAttriName,
-                                 int32_t iAttriValue) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%d", iAttriValue);
-  SetString(pwsAttriName, wsValue);
-}
-FX_FLOAT CFDE_XMLElement::GetFloat(const FX_WCHAR* pwsAttriName,
-                                   FX_FLOAT fDefValue) const {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      return FX_wcstof((const FX_WCHAR*)m_Attributes[i + 1]);
-    }
-  }
-  return fDefValue;
-}
-void CFDE_XMLElement::SetFloat(const FX_WCHAR* pwsAttriName,
-                               FX_FLOAT fAttriValue) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%f", fAttriValue);
-  SetString(pwsAttriName, wsValue);
-}
-void CFDE_XMLElement::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
-  int32_t iCount = m_Attributes.GetSize();
-  for (int32_t i = 0; i < iCount; i += 2) {
-    if (m_Attributes[i].Compare(pwsAttriName) == 0) {
-      m_Attributes.RemoveAt(i + 1);
-      m_Attributes.RemoveAt(i);
-      return;
-    }
-  }
-}
-void CFDE_XMLElement::GetTextData(CFX_WideString& wsText) const {
-  CFX_WideTextBuf buffer;
-  CFDE_XMLNode* pChild = m_pChild;
-  while (pChild != NULL) {
-    switch (pChild->GetType()) {
-      case FDE_XMLNODE_Text:
-        buffer << ((CFDE_XMLText*)pChild)->m_wsText;
-        break;
-      case FDE_XMLNODE_CharData:
-        buffer << ((CFDE_XMLCharData*)pChild)->m_wsCharData;
-        break;
-      default:
-        break;
-    }
-    pChild = pChild->m_pNext;
-  }
-  wsText = buffer.GetWideString();
-}
-void CFDE_XMLElement::SetTextData(const CFX_WideString& wsText) {
-  if (wsText.GetLength() < 1) {
-    return;
-  }
-  InsertChildNode(new CFDE_XMLText(wsText));
-}
-IFDE_XMLText* IFDE_XMLText::Create(const CFX_WideString& wsText) {
-  return (IFDE_XMLText*)new CFDE_XMLText(wsText);
-}
-CFDE_XMLText::CFDE_XMLText(const CFX_WideString& wsText)
-    : CFDE_XMLNode(), m_wsText(wsText) {}
-CFDE_XMLNode* CFDE_XMLText::Clone(FX_BOOL bRecursive) {
-  CFDE_XMLText* pClone = new CFDE_XMLText(m_wsText);
-  return pClone;
-}
-IFDE_XMLCharData* IFDE_XMLCharData::Create(const CFX_WideString& wsCData) {
-  return (IFDE_XMLCharData*)new CFDE_XMLCharData(wsCData);
-}
-CFDE_XMLCharData::CFDE_XMLCharData(const CFX_WideString& wsCData)
-    : CFDE_XMLDeclaration(), m_wsCharData(wsCData) {}
-CFDE_XMLNode* CFDE_XMLCharData::Clone(FX_BOOL bRecursive) {
-  CFDE_XMLCharData* pClone = new CFDE_XMLCharData(m_wsCharData);
-  return pClone;
-}
-IFDE_XMLDoc* IFDE_XMLDoc::Create() {
-  return (IFDE_XMLDoc*)new CFDE_XMLDoc;
-}
-CFDE_XMLDoc::CFDE_XMLDoc()
-    : m_pRoot(NULL), m_pSyntaxParser(NULL), m_pXMLParser(NULL) {
-  Reset(TRUE);
-  CFDE_XMLInstruction* pXML = new CFDE_XMLInstruction(L"xml");
-  m_pRoot->InsertChildNode(pXML);
-}
-CFDE_XMLDoc::~CFDE_XMLDoc() {
-  Reset(FALSE);
-}
-void CFDE_XMLDoc::Reset(FX_BOOL bInitRoot) {
-  m_iStatus = 0;
-  m_pStream = NULL;
-  if (bInitRoot) {
-    if (m_pRoot == NULL) {
-      m_pRoot = new CFDE_XMLNode;
-    } else {
-      m_pRoot->DeleteChildren();
-    }
-  } else {
-    if (m_pRoot != NULL) {
-      m_pRoot->Release();
-      m_pRoot = NULL;
-    }
-  }
-  ReleaseParser();
-}
-void CFDE_XMLDoc::ReleaseParser() {
-  if (m_pXMLParser != NULL) {
-    m_pXMLParser->Release();
-    m_pXMLParser = NULL;
-  }
-  if (m_pSyntaxParser != NULL) {
-    m_pSyntaxParser->Release();
-    m_pSyntaxParser = NULL;
-  }
-}
-FX_BOOL CFDE_XMLDoc::LoadXML(IFX_Stream* pXMLStream,
-                             int32_t iXMLPlaneSize,
-                             int32_t iTextDataSize,
-                             FDE_XMLREADERHANDLER* pHandler) {
-  if (pXMLStream == NULL) {
-    return FALSE;
-  }
-  Reset(TRUE);
-  iXMLPlaneSize = iXMLPlaneSize / 1024;
-  if (iXMLPlaneSize < 1) {
-    iXMLPlaneSize = 1;
-  }
-  iXMLPlaneSize *= 1024;
-  if (iXMLPlaneSize < 4096) {
-    iXMLPlaneSize = 4096;
-  }
-  iTextDataSize = iTextDataSize / 128;
-  if (iTextDataSize < 1) {
-    iTextDataSize = 1;
-  }
-  iTextDataSize *= 128;
-  if (iTextDataSize < 128) {
-    iTextDataSize = 128;
-  }
-  m_pStream = pXMLStream;
-  FX_WORD wCodePage = m_pStream->GetCodePage();
-  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
-      wCodePage != FX_CODEPAGE_UTF8) {
-    m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
-  }
-  m_pSyntaxParser = IFDE_XMLSyntaxParser::Create();
-  if (m_pSyntaxParser == NULL) {
-    return FALSE;
-  }
-  m_pSyntaxParser->Init(m_pStream, iXMLPlaneSize, iTextDataSize);
-  if (pHandler == NULL) {
-    m_pXMLParser = new CFDE_XMLDOMParser(m_pRoot, m_pSyntaxParser);
-  } else {
-    m_pXMLParser = new CFDE_XMLSAXParser(pHandler, m_pSyntaxParser);
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_XMLDoc::LoadXML(IFDE_XMLParser* pXMLParser) {
-  if (pXMLParser == NULL) {
-    return FALSE;
-  }
-  Reset(TRUE);
-  m_pXMLParser = pXMLParser;
-  return m_pXMLParser != NULL;
-}
-int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) {
-  if (m_iStatus >= 100) {
-    return m_iStatus;
-  }
-  FXSYS_assert(m_pXMLParser != NULL);
-  return m_iStatus = m_pXMLParser->DoParser(pPause);
-}
-void CFDE_XMLDoc::CloseXML() {
-  ReleaseParser();
-}
-void CFDE_XMLDoc::SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pINode) {
-  CFDE_XMLNode* pNode = (CFDE_XMLNode*)pINode;
-  FXSYS_assert(pXMLStream != NULL && pNode != NULL);
-  switch (pNode->GetType()) {
-    case FDE_XMLNODE_Instruction: {
-      CFX_WideString ws;
-      CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
-      if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
-        ws = L"<?xml version=\"1.0\" encoding=\"";
-        FX_WORD wCodePage = pXMLStream->GetCodePage();
-        if (wCodePage == FX_CODEPAGE_UTF16LE) {
-          ws += L"UTF-16";
-        } else if (wCodePage == FX_CODEPAGE_UTF16BE) {
-          ws += L"UTF-16be";
-        } else {
-          ws += L"UTF-8";
-        }
-        ws += L"\"?>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      } else {
-        ws.Format(L"<?%s", (const FX_WCHAR*)pInstruction->m_wsTarget);
-        pXMLStream->WriteString(ws, ws.GetLength());
-        CFX_WideStringArray& attributes = pInstruction->m_Attributes;
-        int32_t i, iCount = attributes.GetSize();
-        CFX_WideString wsValue;
-        for (i = 0; i < iCount; i += 2) {
-          ws = L" ";
-          ws += attributes[i];
-          ws += L"=\"";
-          wsValue = attributes[i + 1];
-          wsValue.Replace(L"&", L"&amp;");
-          wsValue.Replace(L"<", L"&lt;");
-          wsValue.Replace(L">", L"&gt;");
-          wsValue.Replace(L"\'", L"&apos;");
-          wsValue.Replace(L"\"", L"&quot;");
-          ws += wsValue;
-          ws += L"\"";
-          pXMLStream->WriteString(ws, ws.GetLength());
-        }
-        CFX_WideStringArray& targetdata = pInstruction->m_TargetData;
-        iCount = targetdata.GetSize();
-        for (i = 0; i < iCount; i++) {
-          ws = L" \"";
-          ws += targetdata[i];
-          ws += L"\"";
-          pXMLStream->WriteString(ws, ws.GetLength());
-        }
-        ws = L"?>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-    } break;
-    case FDE_XMLNODE_Element: {
-      CFX_WideString ws;
-      ws = L"<";
-      ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
-      pXMLStream->WriteString(ws, ws.GetLength());
-      CFX_WideStringArray& attributes = ((CFDE_XMLElement*)pNode)->m_Attributes;
-      int32_t iCount = attributes.GetSize();
-      CFX_WideString wsValue;
-      for (int32_t i = 0; i < iCount; i += 2) {
-        ws = L" ";
-        ws += attributes[i];
-        ws += L"=\"";
-        wsValue = attributes[i + 1];
-        wsValue.Replace(L"&", L"&amp;");
-        wsValue.Replace(L"<", L"&lt;");
-        wsValue.Replace(L">", L"&gt;");
-        wsValue.Replace(L"\'", L"&apos;");
-        wsValue.Replace(L"\"", L"&quot;");
-        ws += wsValue;
-        ws += L"\"";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-      if (pNode->m_pChild == NULL) {
-        ws = L"\n/>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      } else {
-        ws = L"\n>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-        CFDE_XMLNode* pChild = pNode->m_pChild;
-        while (pChild != NULL) {
-          SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pChild);
-          pChild = pChild->m_pNext;
-        }
-        ws = L"</";
-        ws += ((CFDE_XMLElement*)pNode)->m_wsTag;
-        ws += L"\n>";
-        pXMLStream->WriteString(ws, ws.GetLength());
-      }
-    } break;
-    case FDE_XMLNODE_Text: {
-      CFX_WideString ws = ((CFDE_XMLText*)pNode)->m_wsText;
-      ws.Replace(L"&", L"&amp;");
-      ws.Replace(L"<", L"&lt;");
-      ws.Replace(L">", L"&gt;");
-      ws.Replace(L"\'", L"&apos;");
-      ws.Replace(L"\"", L"&quot;");
-      pXMLStream->WriteString(ws, ws.GetLength());
-    } break;
-    case FDE_XMLNODE_CharData: {
-      CFX_WideString ws = L"<![CDATA[";
-      ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
-      ws += L"]]>";
-      pXMLStream->WriteString(ws, ws.GetLength());
-    } break;
-    case FDE_XMLNODE_Unknown:
-      break;
-    default:
-      break;
-  }
-}
-void CFDE_XMLDoc::SaveXML(IFX_Stream* pXMLStream, FX_BOOL bSaveBOM) {
-  if (pXMLStream == NULL || pXMLStream == m_pStream) {
-    m_pStream->Seek(FX_STREAMSEEK_Begin, 0);
-    pXMLStream = m_pStream;
-  }
-  FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Text) != 0);
-  FXSYS_assert((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Write) != 0);
-  FX_WORD wCodePage = pXMLStream->GetCodePage();
-  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
-      wCodePage != FX_CODEPAGE_UTF8) {
-    wCodePage = FX_CODEPAGE_UTF8;
-    pXMLStream->SetCodePage(wCodePage);
-  }
-  if (bSaveBOM) {
-    pXMLStream->WriteString(L"\xFEFF", 1);
-  }
-  CFDE_XMLNode* pNode = m_pRoot->m_pChild;
-  while (pNode != NULL) {
-    SaveXMLNode(pXMLStream, (IFDE_XMLNode*)pNode);
-    pNode = pNode->m_pNext;
-  }
-  if (pXMLStream == m_pStream) {
-    int32_t iPos = pXMLStream->GetPosition();
-    pXMLStream->SetLength(iPos);
-  }
-}
-CFDE_XMLDOMParser::CFDE_XMLDOMParser(CFDE_XMLNode* pRoot,
-                                     IFDE_XMLSyntaxParser* pParser)
-    : m_pParser(pParser),
-      m_pParent(pRoot),
-      m_pChild(NULL),
-      m_NodeStack(16),
-      m_ws1(),
-      m_ws2() {
-  m_NodeStack.Push(m_pParent);
-}
-CFDE_XMLDOMParser::~CFDE_XMLDOMParser() {
-  m_NodeStack.RemoveAll();
-  m_ws1.Empty();
-  m_ws2.Empty();
-}
-int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) {
-  FX_DWORD dwRet;
-  int32_t iCount = 0;
-  while (TRUE) {
-    dwRet = m_pParser->DoSyntaxParse();
-    switch (dwRet) {
-      case FDE_XMLSYNTAXSTATUS_InstructionOpen:
-        break;
-      case FDE_XMLSYNTAXSTATUS_InstructionClose:
-        if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementOpen:
-      case FDE_XMLSYNTAXSTATUS_ElementBreak:
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementClose:
-        if (m_pChild->GetType() != FDE_XMLNODE_Element) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pParser->GetTagName(m_ws1);
-        ((CFDE_XMLElement*)m_pChild)->GetTagName(m_ws2);
-        if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_ws2) != 0) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_NodeStack.Pop();
-        if (m_NodeStack.GetSize() < 1) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement();
-        m_pChild = m_pParent;
-        iCount++;
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetName:
-        m_pParser->GetTargetName(m_ws1);
-        m_pChild = new CFDE_XMLInstruction(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_ws1.Empty();
-        break;
-      case FDE_XMLSYNTAXSTATUS_TagName:
-        m_pParser->GetTagName(m_ws1);
-        m_pChild = new CFDE_XMLElement(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_NodeStack.Push(m_pChild);
-        m_pParent = m_pChild;
-        break;
-      case FDE_XMLSYNTAXSTATUS_AttriName:
-        m_pParser->GetAttributeName(m_ws1);
-        break;
-      case FDE_XMLSYNTAXSTATUS_AttriValue:
-        if (m_pChild == NULL) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pParser->GetAttributeName(m_ws2);
-        if (m_pChild->GetType() == FDE_XMLNODE_Element) {
-          ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2);
-        } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) {
-          ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2);
-        }
-        m_ws1.Empty();
-        break;
-      case FDE_XMLSYNTAXSTATUS_Text:
-        m_pParser->GetTextData(m_ws1);
-        m_pChild = new CFDE_XMLText(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_CData:
-        m_pParser->GetTextData(m_ws1);
-        m_pChild = new CFDE_XMLCharData(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetData:
-        if (m_pChild == NULL ||
-            m_pChild->GetType() != FDE_XMLNODE_Instruction) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        if (!m_ws1.IsEmpty()) {
-          ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
-        }
-        m_pParser->GetTargetData(m_ws1);
-        ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
-        m_ws1.Empty();
-        break;
-      default:
-        break;
-    }
-    if (dwRet == FDE_XMLSYNTAXSTATUS_Error ||
-        dwRet == FDE_XMLSYNTAXSTATUS_EOS) {
-      break;
-    }
-    if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) {
-      break;
-    }
-  }
-  return m_pParser->GetStatus();
-}
-CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler,
-                                     IFDE_XMLSyntaxParser* pParser)
-    : m_pHandler(pHandler),
-      m_pParser(pParser),
-      m_TagStack(16),
-      m_pTagTop(NULL),
-      m_ws1(),
-      m_ws2() {}
-CFDE_XMLSAXParser::~CFDE_XMLSAXParser() {
-  m_TagStack.RemoveAll();
-  m_ws1.Empty();
-  m_ws2.Empty();
-}
-int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) {
-  FX_DWORD dwRet = 0;
-  int32_t iCount = 0;
-  while (TRUE) {
-    dwRet = m_pParser->DoSyntaxParse();
-    switch (dwRet) {
-      case FDE_XMLSYNTAXSTATUS_ElementBreak:
-        if (m_pTagTop == NULL) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        if (m_pTagTop->eType == FDE_XMLNODE_Element) {
-          m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName);
-        }
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementClose:
-        if (m_pTagTop == NULL || m_pTagTop->eType != FDE_XMLNODE_Element) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pParser->GetTagName(m_ws1);
-        if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_pTagTop->wsTagName) != 0) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        } else if (m_ws1.GetLength() == 0) {
-          m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName);
-        }
-        m_pHandler->OnTagClose(m_pHandler, m_pTagTop->wsTagName);
-        Pop();
-        iCount++;
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetName: {
-        m_pParser->GetTargetName(m_ws1);
-        CFDE_XMLTAG xmlTag;
-        xmlTag.wsTagName = m_ws1;
-        xmlTag.eType = FDE_XMLNODE_Instruction;
-        Push(xmlTag);
-        m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction,
-                               m_pTagTop->wsTagName);
-        m_ws1.Empty();
-      } break;
-      case FDE_XMLSYNTAXSTATUS_TagName: {
-        m_pParser->GetTargetName(m_ws1);
-        CFDE_XMLTAG xmlTag;
-        xmlTag.wsTagName = m_ws1;
-        xmlTag.eType = FDE_XMLNODE_Element;
-        Push(xmlTag);
-        m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element,
-                               m_pTagTop->wsTagName);
-      } break;
-      case FDE_XMLSYNTAXSTATUS_AttriName:
-        m_pParser->GetTargetName(m_ws1);
-        break;
-      case FDE_XMLSYNTAXSTATUS_AttriValue:
-        m_pParser->GetAttributeName(m_ws2);
-        if (m_pTagTop == NULL) {
-          dwRet = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        if (m_pTagTop->eType == FDE_XMLNODE_Element) {
-          m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2);
-        }
-        m_ws1.Empty();
-        break;
-      case FDE_XMLSYNTAXSTATUS_CData:
-        m_pParser->GetTextData(m_ws1);
-        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1);
-        break;
-      case FDE_XMLSYNTAXSTATUS_Text:
-        m_pParser->GetTextData(m_ws1);
-        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1);
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetData:
-        m_pParser->GetTargetData(m_ws1);
-        m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1);
-        m_ws1.Empty();
-        break;
-      default:
-        break;
-    }
-    if (dwRet == FDE_XMLSYNTAXSTATUS_Error ||
-        dwRet == FDE_XMLSYNTAXSTATUS_EOS) {
-      break;
-    }
-    if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) {
-      break;
-    }
-  }
-  return m_pParser->GetStatus();
-}
-inline void CFDE_XMLSAXParser::Push(const CFDE_XMLTAG& xmlTag) {
-  m_TagStack.Push(xmlTag);
-  m_pTagTop = m_TagStack.GetTopElement();
-}
-inline void CFDE_XMLSAXParser::Pop() {
-  m_TagStack.Pop();
-  m_pTagTop = m_TagStack.GetTopElement();
-}
-
-CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep)
-    : m_iDataLength(0),
-      m_iBufferSize(0),
-      m_iAllocStep(iAllocStep),
-      m_iStartPosition(0) {}
-CFDE_BlockBuffer::~CFDE_BlockBuffer() {
-  ClearBuffer();
-}
-FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) {
-  iIndexInBlock = 0;
-  if (!m_BlockArray.GetSize()) {
-    return nullptr;
-  }
-  int32_t iRealIndex = m_iStartPosition + m_iDataLength;
-  if (iRealIndex == m_iBufferSize) {
-    FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
-    m_BlockArray.Add(pBlock);
-    m_iBufferSize += m_iAllocStep;
-    return pBlock;
-  }
-  iIndexInBlock = iRealIndex % m_iAllocStep;
-  return (FX_WCHAR*)m_BlockArray[iRealIndex / m_iAllocStep];
-}
-FX_BOOL CFDE_BlockBuffer::InitBuffer(int32_t iBufferSize) {
-  ClearBuffer();
-  int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1;
-  for (int32_t i = 0; i < iNumOfBlock; i++) {
-    m_BlockArray.Add(FX_Alloc(FX_WCHAR, m_iAllocStep));
-  }
-  m_iBufferSize = iNumOfBlock * m_iAllocStep;
-  return TRUE;
-}
-void CFDE_BlockBuffer::SetTextChar(int32_t iIndex, FX_WCHAR ch) {
-  if (iIndex < 0) {
-    return;
-  }
-  int32_t iRealIndex = m_iStartPosition + iIndex;
-  int32_t iBlockIndex = iRealIndex / m_iAllocStep;
-  int32_t iInnerIndex = iRealIndex % m_iAllocStep;
-  int32_t iBlockSize = m_BlockArray.GetSize();
-  if (iBlockIndex >= iBlockSize) {
-    int32_t iNewBlocks = iBlockIndex - iBlockSize + 1;
-    do {
-      FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
-      m_BlockArray.Add(pBlock);
-      m_iBufferSize += m_iAllocStep;
-    } while (--iNewBlocks);
-  }
-  FX_WCHAR* pTextData = (FX_WCHAR*)m_BlockArray[iBlockIndex];
-  *(pTextData + iInnerIndex) = ch;
-  if (m_iDataLength <= iIndex) {
-    m_iDataLength = iIndex + 1;
-  }
-}
-int32_t CFDE_BlockBuffer::DeleteTextChars(int32_t iCount, FX_BOOL bDirection) {
-  if (iCount <= 0) {
-    return m_iDataLength;
-  }
-  if (iCount >= m_iDataLength) {
-    Reset(FALSE);
-    return 0;
-  }
-  if (bDirection) {
-    m_iStartPosition += iCount;
-    m_iDataLength -= iCount;
-  } else {
-    m_iDataLength -= iCount;
-  }
-  return m_iDataLength;
-}
-void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData,
-                                   int32_t iStart,
-                                   int32_t iLength) const {
-  wsTextData.Empty();
-  int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition;
-  if (iStart < 0 || iStart > iMaybeDataLength) {
-    return;
-  }
-  if (iLength == -1 || iLength > iMaybeDataLength) {
-    iLength = iMaybeDataLength;
-  }
-  if (iLength <= 0) {
-    return;
-  }
-  FX_WCHAR* pBuf = wsTextData.GetBuffer(iLength);
-  if (!pBuf) {
-    return;
-  }
-  int32_t iStartBlockIndex = 0;
-  int32_t iStartInnerIndex = 0;
-  TextDataIndex2BufIndex(iStart, iStartBlockIndex, iStartInnerIndex);
-  int32_t iEndBlockIndex = 0;
-  int32_t iEndInnerIndex = 0;
-  TextDataIndex2BufIndex(iStart + iLength, iEndBlockIndex, iEndInnerIndex);
-  int32_t iPointer = 0;
-  for (int32_t i = iStartBlockIndex; i <= iEndBlockIndex; i++) {
-    int32_t iBufferPointer = 0;
-    int32_t iCopyLength = m_iAllocStep;
-    if (i == iStartBlockIndex) {
-      iCopyLength -= iStartInnerIndex;
-      iBufferPointer = iStartInnerIndex;
-    }
-    if (i == iEndBlockIndex) {
-      iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex);
-    }
-    FX_WCHAR* pBlockBuf = (FX_WCHAR*)m_BlockArray[i];
-    FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer,
-                 iCopyLength * sizeof(FX_WCHAR));
-    iPointer += iCopyLength;
-  }
-  wsTextData.ReleaseBuffer(iLength);
-}
-void CFDE_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex,
-                                              int32_t& iBlockIndex,
-                                              int32_t& iInnerIndex) const {
-  FXSYS_assert(iIndex >= 0);
-  int32_t iRealIndex = m_iStartPosition + iIndex;
-  iBlockIndex = iRealIndex / m_iAllocStep;
-  iInnerIndex = iRealIndex % m_iAllocStep;
-}
-void CFDE_BlockBuffer::ClearBuffer() {
-  m_iBufferSize = 0;
-  int32_t iSize = m_BlockArray.GetSize();
-  for (int32_t i = 0; i < iSize; i++) {
-    FX_Free(m_BlockArray[i]);
-    m_BlockArray[i] = NULL;
-  }
-  m_BlockArray.RemoveAll();
-}
-
-IFDE_XMLSyntaxParser* IFDE_XMLSyntaxParser::Create() {
-  return new CFDE_XMLSyntaxParser;
-}
-
-CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser()
-    : m_pStream(nullptr),
-      m_iXMLPlaneSize(-1),
-      m_iCurrentPos(0),
-      m_iCurrentNodeNum(-1),
-      m_iLastNodeNum(-1),
-      m_iParsedChars(0),
-      m_iParsedBytes(0),
-      m_pBuffer(nullptr),
-      m_iBufferChars(0),
-      m_bEOS(FALSE),
-      m_pStart(nullptr),
-      m_pEnd(nullptr),
-      m_XMLNodeStack(16),
-      m_iAllocStep(m_BlockBuffer.GetAllocStep()),
-      m_iDataLength(m_BlockBuffer.GetDataLengthRef()),
-      m_pCurrentBlock(nullptr),
-      m_iIndexInBlock(0),
-      m_iTextDataLength(0),
-      m_dwStatus(FDE_XMLSYNTAXSTATUS_None),
-      m_dwMode(FDE_XMLSYNTAXMODE_Text),
-      m_wQuotationMark(0),
-      m_iEntityStart(-1),
-      m_SkipStack(16) {
-  m_CurNode.iNodeNum = -1;
-  m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
-}
-void CFDE_XMLSyntaxParser::Init(IFX_Stream* pStream,
-                                int32_t iXMLPlaneSize,
-                                int32_t iTextDataSize) {
-  FXSYS_assert(m_pStream == NULL && m_pBuffer == NULL);
-  FXSYS_assert(pStream != NULL && iXMLPlaneSize > 0);
-  int32_t iStreamLength = pStream->GetLength();
-  FXSYS_assert(iStreamLength > 0);
-  m_pStream = pStream;
-  m_iXMLPlaneSize = std::min(iXMLPlaneSize, iStreamLength);
-  uint8_t bom[4];
-  m_iCurrentPos = m_pStream->GetBOM(bom);
-  FXSYS_assert(m_pBuffer == NULL);
-  m_pBuffer = FX_Alloc(FX_WCHAR, m_iXMLPlaneSize);
-  m_pStart = m_pEnd = m_pBuffer;
-  FXSYS_assert(!m_BlockBuffer.IsInitialized());
-  m_BlockBuffer.InitBuffer();
-  m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-  m_iParsedBytes = m_iParsedChars = 0;
-  m_iBufferChars = 0;
-}
-FX_DWORD CFDE_XMLSyntaxParser::DoSyntaxParse() {
-  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error ||
-      m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
-    return m_dwStatus;
-  }
-  FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized());
-  int32_t iStreamLength = m_pStream->GetLength();
-  int32_t iPos;
-  FX_WCHAR ch;
-  FX_DWORD dwStatus = FDE_XMLSYNTAXSTATUS_None;
-  while (TRUE) {
-    if (m_pStart >= m_pEnd) {
-      if (m_bEOS || m_iCurrentPos >= iStreamLength) {
-        m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
-        return m_dwStatus;
-      }
-      m_iParsedChars += (m_pEnd - m_pBuffer);
-      m_iParsedBytes = m_iCurrentPos;
-      if (m_pStream->GetPosition() != m_iCurrentPos) {
-        m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos);
-      }
-      m_iBufferChars =
-          m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS);
-      iPos = m_pStream->GetPosition();
-      if (m_iBufferChars < 1) {
-        m_iCurrentPos = iStreamLength;
-        m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
-        return m_dwStatus;
-      }
-      m_iCurrentPos = iPos;
-      m_pStart = m_pBuffer;
-      m_pEnd = m_pBuffer + m_iBufferChars;
-    }
-    while (m_pStart < m_pEnd) {
-      ch = *m_pStart;
-      switch (m_dwMode) {
-        case FDE_XMLSYNTAXMODE_Text:
-          if (ch == L'<') {
-            if (m_iDataLength > 0) {
-              m_iTextDataLength = m_iDataLength;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_iEntityStart = -1;
-              dwStatus = FDE_XMLSYNTAXSTATUS_Text;
-            } else {
-              m_pStart++;
-              m_dwMode = FDE_XMLSYNTAXMODE_Node;
-            }
-          } else {
-            ParseTextChar(ch);
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_Node:
-          if (ch == L'!') {
-            m_pStart++;
-            m_dwMode = FDE_XMLSYNTAXMODE_SkipCommentOrDecl;
-          } else if (ch == L'/') {
-            m_pStart++;
-            m_dwMode = FDE_XMLSYNTAXMODE_CloseElement;
-          } else if (ch == L'?') {
-            m_iLastNodeNum++;
-            m_iCurrentNodeNum = m_iLastNodeNum;
-            m_CurNode.iNodeNum = m_iLastNodeNum;
-            m_CurNode.eNodeType = FDE_XMLNODE_Instruction;
-            m_XMLNodeStack.Push(m_CurNode);
-            m_pStart++;
-            m_dwMode = FDE_XMLSYNTAXMODE_Target;
-            dwStatus = FDE_XMLSYNTAXSTATUS_InstructionOpen;
-          } else {
-            m_iLastNodeNum++;
-            m_iCurrentNodeNum = m_iLastNodeNum;
-            m_CurNode.iNodeNum = m_iLastNodeNum;
-            m_CurNode.eNodeType = FDE_XMLNODE_Element;
-            m_XMLNodeStack.Push(m_CurNode);
-            m_dwMode = FDE_XMLSYNTAXMODE_Tag;
-            dwStatus = FDE_XMLSYNTAXSTATUS_ElementOpen;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_Target:
-        case FDE_XMLSYNTAXMODE_Tag:
-          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
-            if (m_iDataLength < 1) {
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            } else {
-              m_iTextDataLength = m_iDataLength;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (m_dwMode != FDE_XMLSYNTAXMODE_Target) {
-                dwStatus = FDE_XMLSYNTAXSTATUS_TagName;
-              } else {
-                dwStatus = FDE_XMLSYNTAXSTATUS_TargetName;
-              }
-              m_dwMode = FDE_XMLSYNTAXMODE_AttriName;
-            }
-          } else {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = ch;
-            m_iDataLength++;
-            m_pStart++;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_AttriName:
-          if (m_iDataLength < 1 && FDE_IsXMLWhiteSpace(ch)) {
-            m_pStart++;
-            break;
-          }
-          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
-            if (m_iDataLength < 1) {
-              if (m_CurNode.eNodeType == FDE_XMLNODE_Element) {
-                if (ch == L'>' || ch == L'/') {
-                  m_dwMode = FDE_XMLSYNTAXMODE_BreakElement;
-                  break;
-                }
-              } else if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
-                if (ch == L'?') {
-                  m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction;
-                  m_pStart++;
-                } else {
-                  m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
-                }
-                break;
-              }
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            } else {
-              if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
-                if (ch != '=' && !FDE_IsXMLWhiteSpace(ch)) {
-                  m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
-                  break;
-                }
-              }
-              m_iTextDataLength = m_iDataLength;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_dwMode = FDE_XMLSYNTAXMODE_AttriEqualSign;
-              dwStatus = FDE_XMLSYNTAXSTATUS_AttriName;
-            }
-          } else {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = ch;
-            m_iDataLength++;
-            m_pStart++;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_AttriEqualSign:
-          if (FDE_IsXMLWhiteSpace(ch)) {
-            m_pStart++;
-            break;
-          }
-          if (ch != L'=') {
-            if (m_CurNode.eNodeType == FDE_XMLNODE_Instruction) {
-              m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
-              break;
-            }
-            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-            return m_dwStatus;
-          } else {
-            m_dwMode = FDE_XMLSYNTAXMODE_AttriQuotation;
-            m_pStart++;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_AttriQuotation:
-          if (FDE_IsXMLWhiteSpace(ch)) {
-            m_pStart++;
-            break;
-          }
-          if (ch != L'\"' && ch != L'\'') {
-            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-            return m_dwStatus;
-          } else {
-            m_wQuotationMark = ch;
-            m_dwMode = FDE_XMLSYNTAXMODE_AttriValue;
-            m_pStart++;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_AttriValue:
-          if (ch == m_wQuotationMark) {
-            if (m_iEntityStart > -1) {
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            }
-            m_iTextDataLength = m_iDataLength;
-            m_wQuotationMark = 0;
-            m_BlockBuffer.Reset();
-            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-            m_pStart++;
-            m_dwMode = FDE_XMLSYNTAXMODE_AttriName;
-            dwStatus = FDE_XMLSYNTAXSTATUS_AttriValue;
-          } else {
-            ParseTextChar(ch);
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_CloseInstruction:
-          if (ch != L'>') {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = ch;
-            m_iDataLength++;
-            m_dwMode = FDE_XMLSYNTAXMODE_TargetData;
-          } else if (m_iDataLength > 0) {
-            m_iTextDataLength = m_iDataLength;
-            m_BlockBuffer.Reset();
-            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-            dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
-          } else {
-            m_pStart++;
-            FDE_XMLNODE* pXMLNode = m_XMLNodeStack.GetTopElement();
-            if (pXMLNode == NULL) {
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            }
-            m_XMLNodeStack.Pop();
-            pXMLNode = m_XMLNodeStack.GetTopElement();
-            if (pXMLNode == NULL) {
-              m_CurNode.iNodeNum = -1;
-              m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
-            } else {
-              m_CurNode = *pXMLNode;
-            }
-            m_iCurrentNodeNum = m_CurNode.iNodeNum;
-            m_BlockBuffer.Reset();
-            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-            m_dwMode = FDE_XMLSYNTAXMODE_Text;
-            dwStatus = FDE_XMLSYNTAXSTATUS_InstructionClose;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_BreakElement:
-          if (ch == L'>') {
-            m_dwMode = FDE_XMLSYNTAXMODE_Text;
-            dwStatus = FDE_XMLSYNTAXSTATUS_ElementBreak;
-          } else if (ch == L'/') {
-            m_dwMode = FDE_XMLSYNTAXMODE_CloseElement;
-          } else {
-            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-            return m_dwStatus;
-          }
-          m_pStart++;
-          break;
-        case FDE_XMLSYNTAXMODE_CloseElement:
-          if (!FDE_IsXMLNameChar(ch, m_iDataLength < 1)) {
-            if (ch == L'>') {
-              FDE_XMLNODE* pXMLNode = m_XMLNodeStack.GetTopElement();
-              if (pXMLNode == NULL) {
-                m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-                return m_dwStatus;
-              }
-              m_XMLNodeStack.Pop();
-              pXMLNode = m_XMLNodeStack.GetTopElement();
-              if (pXMLNode == NULL) {
-                m_CurNode.iNodeNum = -1;
-                m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
-              } else {
-                m_CurNode = *pXMLNode;
-              }
-              m_iCurrentNodeNum = m_CurNode.iNodeNum;
-              m_iTextDataLength = m_iDataLength;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_dwMode = FDE_XMLSYNTAXMODE_Text;
-              dwStatus = FDE_XMLSYNTAXSTATUS_ElementClose;
-            } else if (!FDE_IsXMLWhiteSpace(ch)) {
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            }
-          } else {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = ch;
-            m_iDataLength++;
-          }
-          m_pStart++;
-          break;
-        case FDE_XMLSYNTAXMODE_SkipCommentOrDecl:
-          if (ch == '-') {
-            m_dwMode = FDE_XMLSYNTAXMODE_SkipComment;
-          } else {
-            m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode;
-            m_SkipChar = L'>';
-            m_SkipStack.Push(L'>');
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_SkipDeclNode:
-          if (m_SkipChar == L'\'' || m_SkipChar == L'\"') {
-            m_pStart++;
-            if (ch != m_SkipChar) {
-              break;
-            }
-            m_SkipStack.Pop();
-            FX_DWORD* pDWord = m_SkipStack.GetTopElement();
-            if (pDWord == NULL) {
-              m_dwMode = FDE_XMLSYNTAXMODE_Text;
-            } else {
-              m_SkipChar = (FX_WCHAR)*pDWord;
-            }
-          } else {
-            switch (ch) {
-              case L'<':
-                m_SkipChar = L'>';
-                m_SkipStack.Push(L'>');
-                break;
-              case L'[':
-                m_SkipChar = L']';
-                m_SkipStack.Push(L']');
-                break;
-              case L'(':
-                m_SkipChar = L')';
-                m_SkipStack.Push(L')');
-                break;
-              case L'\'':
-                m_SkipChar = L'\'';
-                m_SkipStack.Push(L'\'');
-                break;
-              case L'\"':
-                m_SkipChar = L'\"';
-                m_SkipStack.Push(L'\"');
-                break;
-              default:
-                if (ch == m_SkipChar) {
-                  m_SkipStack.Pop();
-                  FX_DWORD* pDWord = m_SkipStack.GetTopElement();
-                  if (pDWord == NULL) {
-                    if (m_iDataLength >= 9) {
-                      CFX_WideString wsHeader;
-                      m_BlockBuffer.GetTextData(wsHeader, 0, 7);
-                      if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) {
-                        CFX_WideString wsTailer;
-                        m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2,
-                                                  2);
-                        if (wsTailer.Equal(FX_WSTRC(L"]]"))) {
-                          m_BlockBuffer.DeleteTextChars(7, TRUE);
-                          m_BlockBuffer.DeleteTextChars(2, FALSE);
-                          dwStatus = FDE_XMLSYNTAXSTATUS_CData;
-                        }
-                      }
-                    }
-                    m_iTextDataLength = m_iDataLength;
-                    m_BlockBuffer.Reset();
-                    m_pCurrentBlock =
-                        m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-                    m_dwMode = FDE_XMLSYNTAXMODE_Text;
-                  } else {
-                    m_SkipChar = (FX_WCHAR)*pDWord;
-                  }
-                }
-                break;
-            }
-            if (m_SkipStack.GetSize() > 0) {
-              if (m_iIndexInBlock == m_iAllocStep) {
-                m_pCurrentBlock =
-                    m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-                if (!m_pCurrentBlock) {
-                  return FDE_XMLSYNTAXSTATUS_Error;
-                }
-              }
-              m_pCurrentBlock[m_iIndexInBlock++] = ch;
-              m_iDataLength++;
-            }
-            m_pStart++;
-          }
-          break;
-        case FDE_XMLSYNTAXMODE_SkipComment:
-          if (ch == L'-') {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = L'-';
-            m_iDataLength++;
-          } else if (ch == L'>') {
-            if (m_iDataLength > 1) {
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_dwMode = FDE_XMLSYNTAXMODE_Text;
-            }
-          } else {
-            m_BlockBuffer.Reset();
-            m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-          }
-          m_pStart++;
-          break;
-        case FDE_XMLSYNTAXMODE_TargetData:
-          if (FDE_IsXMLWhiteSpace(ch)) {
-            if (m_iDataLength < 1) {
-              m_pStart++;
-              break;
-            } else if (m_wQuotationMark == 0) {
-              m_iTextDataLength = m_iDataLength;
-              m_wQuotationMark = 0;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_pStart++;
-              dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
-              break;
-            }
-          }
-          if (ch == '?') {
-            m_dwMode = FDE_XMLSYNTAXMODE_CloseInstruction;
-            m_pStart++;
-          } else if (ch == '\"') {
-            if (m_wQuotationMark == 0) {
-              m_wQuotationMark = ch;
-              m_pStart++;
-            } else if (ch == m_wQuotationMark) {
-              m_iTextDataLength = m_iDataLength;
-              m_wQuotationMark = 0;
-              m_BlockBuffer.Reset();
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              m_pStart++;
-              dwStatus = FDE_XMLSYNTAXSTATUS_TargetData;
-            } else {
-              m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-              return m_dwStatus;
-            }
-          } else {
-            if (m_iIndexInBlock == m_iAllocStep) {
-              m_pCurrentBlock =
-                  m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-              if (!m_pCurrentBlock) {
-                return FDE_XMLSYNTAXSTATUS_Error;
-              }
-            }
-            m_pCurrentBlock[m_iIndexInBlock++] = ch;
-            m_iDataLength++;
-            m_pStart++;
-          }
-          break;
-        default:
-          break;
-      }
-      if (dwStatus != FDE_XMLSYNTAXSTATUS_None) {
-        return dwStatus;
-      }
-    }
-  }
-  return 0;
-}
-
-CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() {
-  if (m_pCurrentBlock) {
-    m_pCurrentBlock = NULL;
-  }
-  FX_Free(m_pBuffer);
-}
-
-int32_t CFDE_XMLSyntaxParser::GetStatus() const {
-  if (m_pStream == NULL) {
-    return -1;
-  }
-  int32_t iStreamLength = m_pStream->GetLength();
-  if (iStreamLength < 1) {
-    return 100;
-  }
-  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) {
-    return -1;
-  }
-  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
-    return 100;
-  }
-  return m_iParsedBytes * 100 / iStreamLength;
-}
-static int32_t FX_GetUTF8EncodeLength(const FX_WCHAR* pSrc, int32_t iSrcLen) {
-  FX_DWORD unicode = 0;
-  int32_t iDstNum = 0;
-  while (iSrcLen-- > 0) {
-    unicode = *pSrc++;
-    int nbytes = 0;
-    if ((FX_DWORD)unicode < 0x80) {
-      nbytes = 1;
-    } else if ((FX_DWORD)unicode < 0x800) {
-      nbytes = 2;
-    } else if ((FX_DWORD)unicode < 0x10000) {
-      nbytes = 3;
-    } else if ((FX_DWORD)unicode < 0x200000) {
-      nbytes = 4;
-    } else if ((FX_DWORD)unicode < 0x4000000) {
-      nbytes = 5;
-    } else {
-      nbytes = 6;
-    }
-    iDstNum += nbytes;
-  }
-  return iDstNum;
-}
-FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const {
-  if (m_pStream == NULL) {
-    return 0;
-  }
-  int32_t nSrcLen = m_pStart - m_pBuffer;
-  int32_t nDstLen = FX_GetUTF8EncodeLength(m_pBuffer, nSrcLen);
-  return m_iParsedBytes + nDstLen;
-}
-
-void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) {
-  if (m_iIndexInBlock == m_iAllocStep) {
-    m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-    if (!m_pCurrentBlock) {
-      return;
-    }
-  }
-  m_pCurrentBlock[m_iIndexInBlock++] = ch;
-  m_iDataLength++;
-  if (m_iEntityStart > -1 && ch == L';') {
-    CFX_WideString csEntity;
-    m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1,
-                              (m_iDataLength - 1) - m_iEntityStart - 1);
-    int32_t iLen = csEntity.GetLength();
-    if (iLen > 0) {
-      if (csEntity[0] == L'#') {
-        ch = 0;
-        FX_WCHAR w;
-        if (iLen > 1 && csEntity[1] == L'x') {
-          for (int32_t i = 2; i < iLen; i++) {
-            w = csEntity[i];
-            if (w >= L'0' && w <= L'9') {
-              ch = (ch << 4) + w - L'0';
-            } else if (w >= L'A' && w <= L'F') {
-              ch = (ch << 4) + w - 55;
-            } else if (w >= L'a' && w <= L'f') {
-              ch = (ch << 4) + w - 87;
-            } else {
-              break;
-            }
-          }
-        } else {
-          for (int32_t i = 1; i < iLen; i++) {
-            w = csEntity[i];
-            if (w < L'0' || w > L'9') {
-              break;
-            }
-            ch = ch * 10 + w - L'0';
-          }
-        }
-        if (ch != 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, ch);
-          m_iEntityStart++;
-        }
-      } else {
-        if (csEntity.Compare(L"amp") == 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, L'&');
-          m_iEntityStart++;
-        } else if (csEntity.Compare(L"lt") == 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, L'<');
-          m_iEntityStart++;
-        } else if (csEntity.Compare(L"gt") == 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, L'>');
-          m_iEntityStart++;
-        } else if (csEntity.Compare(L"apos") == 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, L'\'');
-          m_iEntityStart++;
-        } else if (csEntity.Compare(L"quot") == 0) {
-          m_BlockBuffer.SetTextChar(m_iEntityStart, L'\"');
-          m_iEntityStart++;
-        }
-      }
-    }
-    m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE);
-    m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
-    m_iEntityStart = -1;
-  } else {
-    if (m_iEntityStart < 0 && ch == L'&') {
-      m_iEntityStart = m_iDataLength - 1;
-    }
-  }
-  m_pStart++;
-}
diff --git a/xfa/src/fde/xml/fde_xml_imp.h b/xfa/src/fde/xml/fde_xml_imp.h
deleted file mode 100644
index 815d746..0000000
--- a/xfa/src/fde/xml/fde_xml_imp.h
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FDE_XML_FDE_XML_IMP_H_
-#define XFA_SRC_FDE_XML_FDE_XML_IMP_H_
-
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fde/xml/fde_xml.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-
-class CFDE_BlockBuffer;
-class CFDE_XMLInstruction;
-class CFDE_XMLElement;
-class CFDE_XMLText;
-class CFDE_XMLDoc;
-class IFDE_XMLParser;
-class CFDE_XMLDOMParser;
-class CFDE_XMLSAXParser;
-class CFDE_XMLSyntaxParser;
-
-class CFDE_XMLNode : public CFX_Target {
- public:
-  CFDE_XMLNode();
-  virtual void Release() { delete this; }
-  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Unknown; }
-  virtual int32_t CountChildNodes() const;
-  virtual CFDE_XMLNode* GetChildNode(int32_t index) const;
-  virtual int32_t GetChildNodeIndex(CFDE_XMLNode* pNode) const;
-  virtual CFDE_XMLNode* GetPath(const FX_WCHAR* pPath,
-                                int32_t iLength = -1,
-                                FX_BOOL bQualifiedName = TRUE) const;
-  virtual int32_t InsertChildNode(CFDE_XMLNode* pNode, int32_t index = -1);
-  virtual void RemoveChildNode(CFDE_XMLNode* pNode);
-  virtual void DeleteChildren();
-  virtual CFDE_XMLNode* GetNodeItem(IFDE_XMLNode::NodeItem eItem) const;
-  virtual int32_t GetNodeLevel() const;
-  virtual FX_BOOL InsertNodeItem(IFDE_XMLNode::NodeItem eItem,
-                                 CFDE_XMLNode* pNode);
-  virtual CFDE_XMLNode* RemoveNodeItem(IFDE_XMLNode::NodeItem eItem);
-  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
-  virtual void SaveXMLNode(IFX_Stream* pXMLStream);
-
- public:
-  ~CFDE_XMLNode();
-  void CloneChildren(CFDE_XMLNode* pClone);
-  CFDE_XMLNode* m_pParent;
-  CFDE_XMLNode* m_pChild;
-  CFDE_XMLNode* m_pPrior;
-  CFDE_XMLNode* m_pNext;
-};
-class CFDE_XMLInstruction : public CFDE_XMLNode {
- public:
-  CFDE_XMLInstruction(const CFX_WideString& wsTarget);
-  virtual void Release() { delete this; }
-  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Instruction; }
-  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
-  virtual void GetTargetName(CFX_WideString& wsTarget) const {
-    wsTarget = m_wsTarget;
-  }
-  virtual int32_t CountAttributes() const;
-  virtual FX_BOOL GetAttribute(int32_t index,
-                               CFX_WideString& wsAttriName,
-                               CFX_WideString& wsAttriValue) const;
-  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const;
-  virtual void GetString(const FX_WCHAR* pwsAttriName,
-                         CFX_WideString& wsAttriValue,
-                         const FX_WCHAR* pwsDefValue = NULL) const;
-  virtual void SetString(const CFX_WideString& wsAttriName,
-                         const CFX_WideString& wsAttriValue);
-  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
-                             int32_t iDefValue = 0) const;
-  virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue);
-  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
-                            FX_FLOAT fDefValue = 0) const;
-  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue);
-  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName);
-  virtual int32_t CountData() const;
-  virtual FX_BOOL GetData(int32_t index, CFX_WideString& wsData) const;
-  virtual void AppendData(const CFX_WideString& wsData);
-  virtual void RemoveData(int32_t index);
-
- public:
-  ~CFDE_XMLInstruction() {}
-  CFX_WideString m_wsTarget;
-  CFX_WideStringArray m_Attributes;
-  CFX_WideStringArray m_TargetData;
-};
-class CFDE_XMLElement : public CFDE_XMLNode {
- public:
-  CFDE_XMLElement(const CFX_WideString& wsTag);
-  virtual void Release() { delete this; }
-  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Element; }
-  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
-  virtual void GetTagName(CFX_WideString& wsTag) const;
-  virtual void GetLocalTagName(CFX_WideString& wsTag) const;
-  virtual void GetNamespacePrefix(CFX_WideString& wsPrefix) const;
-  virtual void GetNamespaceURI(CFX_WideString& wsNamespace) const;
-  virtual int32_t CountAttributes() const;
-  virtual FX_BOOL GetAttribute(int32_t index,
-                               CFX_WideString& wsAttriName,
-                               CFX_WideString& wsAttriValue) const;
-  virtual FX_BOOL HasAttribute(const FX_WCHAR* pwsAttriName) const;
-  virtual void GetString(const FX_WCHAR* pwsAttriName,
-                         CFX_WideString& wsAttriValue,
-                         const FX_WCHAR* pwsDefValue = NULL) const;
-  virtual void SetString(const CFX_WideString& wsAttriName,
-                         const CFX_WideString& wsAttriValue);
-  virtual int32_t GetInteger(const FX_WCHAR* pwsAttriName,
-                             int32_t iDefValue = 0) const;
-  virtual void SetInteger(const FX_WCHAR* pwsAttriName, int32_t iAttriValue);
-  virtual FX_FLOAT GetFloat(const FX_WCHAR* pwsAttriName,
-                            FX_FLOAT fDefValue = 0) const;
-  virtual void SetFloat(const FX_WCHAR* pwsAttriName, FX_FLOAT fAttriValue);
-  virtual void RemoveAttribute(const FX_WCHAR* pwsAttriName);
-  virtual void GetTextData(CFX_WideString& wsText) const;
-  virtual void SetTextData(const CFX_WideString& wsText);
-
- public:
-  ~CFDE_XMLElement();
-  CFX_WideString m_wsTag;
-  CFX_WideStringArray m_Attributes;
-};
-class CFDE_XMLText : public CFDE_XMLNode {
- public:
-  CFDE_XMLText(const CFX_WideString& wsText);
-  virtual void Release() { delete this; }
-  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_Text; }
-  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
-  virtual void GetText(CFX_WideString& wsText) const { wsText = m_wsText; }
-  virtual void SetText(const CFX_WideString& wsText) { m_wsText = wsText; }
-
- public:
-  ~CFDE_XMLText() {}
-  CFX_WideString m_wsText;
-};
-class CFDE_XMLDeclaration : public CFDE_XMLNode {
- public:
-  CFDE_XMLDeclaration() : CFDE_XMLNode() {}
-};
-class CFDE_XMLCharData : public CFDE_XMLDeclaration {
- public:
-  CFDE_XMLCharData(const CFX_WideString& wsCData);
-
-  virtual void Release() { delete this; }
-  virtual FDE_XMLNODETYPE GetType() const { return FDE_XMLNODE_CharData; }
-  virtual CFDE_XMLNode* Clone(FX_BOOL bRecursive);
-  virtual void GetCharData(CFX_WideString& wsCharData) const {
-    wsCharData = m_wsCharData;
-  }
-  virtual void SetCharData(const CFX_WideString& wsCData) {
-    m_wsCharData = wsCData;
-  }
-
- public:
-  ~CFDE_XMLCharData() {}
-
-  CFX_WideString m_wsCharData;
-};
-class CFDE_XMLDoc : public CFX_Target {
- public:
-  CFDE_XMLDoc();
-  ~CFDE_XMLDoc();
-  virtual void Release() { delete this; }
-  virtual FX_BOOL LoadXML(IFX_Stream* pXMLStream,
-                          int32_t iXMLPlaneSize = 8192,
-                          int32_t iTextDataSize = 256,
-                          FDE_XMLREADERHANDLER* pHandler = NULL);
-  virtual FX_BOOL LoadXML(IFDE_XMLParser* pXMLParser);
-  virtual int32_t DoLoad(IFX_Pause* pPause = NULL);
-  virtual void CloseXML();
-  virtual CFDE_XMLNode* GetRoot() const { return m_pRoot; }
-  virtual void SaveXML(IFX_Stream* pXMLStream = NULL, FX_BOOL bSaveBOM = TRUE);
-  virtual void SaveXMLNode(IFX_Stream* pXMLStream, IFDE_XMLNode* pNode);
-
- protected:
-  IFX_Stream* m_pStream;
-  int32_t m_iStatus;
-  CFDE_XMLNode* m_pRoot;
-  IFDE_XMLSyntaxParser* m_pSyntaxParser;
-  IFDE_XMLParser* m_pXMLParser;
-  void Reset(FX_BOOL bInitRoot);
-  void ReleaseParser();
-};
-typedef CFX_StackTemplate<CFDE_XMLNode*> CFDE_XMLDOMNodeStack;
-class CFDE_XMLDOMParser : public IFDE_XMLParser, public CFX_Target {
- public:
-  CFDE_XMLDOMParser(CFDE_XMLNode* pRoot, IFDE_XMLSyntaxParser* pParser);
-  ~CFDE_XMLDOMParser();
-
-  virtual void Release() { delete this; }
-  virtual int32_t DoParser(IFX_Pause* pPause);
-
- private:
-  IFDE_XMLSyntaxParser* m_pParser;
-  CFDE_XMLNode* m_pParent;
-  CFDE_XMLNode* m_pChild;
-  CFDE_XMLDOMNodeStack m_NodeStack;
-  CFX_WideString m_ws1;
-  CFX_WideString m_ws2;
-};
-class CFDE_XMLTAG : public CFX_Target {
- public:
-  CFDE_XMLTAG() : eType(FDE_XMLNODE_Unknown) {}
-  CFDE_XMLTAG(const CFDE_XMLTAG& src)
-      : wsTagName(src.wsTagName), eType(src.eType) {}
-  CFX_WideString wsTagName;
-  FDE_XMLNODETYPE eType;
-};
-typedef CFX_ObjectStackTemplate<CFDE_XMLTAG> CFDE_XMLTagStack;
-class CFDE_XMLSAXParser : public IFDE_XMLParser, public CFX_Target {
- public:
-  CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler,
-                    IFDE_XMLSyntaxParser* pParser);
-  ~CFDE_XMLSAXParser();
-
-  virtual void Release() { delete this; }
-  virtual int32_t DoParser(IFX_Pause* pPause);
-
- private:
-  void Push(const CFDE_XMLTAG& xmlTag);
-  void Pop();
-  FDE_XMLREADERHANDLER* m_pHandler;
-  IFDE_XMLSyntaxParser* m_pParser;
-  CFDE_XMLTagStack m_TagStack;
-  CFDE_XMLTAG* m_pTagTop;
-  CFX_WideString m_ws1;
-  CFX_WideString m_ws2;
-};
-
-class CFDE_BlockBuffer : public CFX_Target {
- public:
-  CFDE_BlockBuffer(int32_t iAllocStep = 1024 * 1024);
-  ~CFDE_BlockBuffer();
-
-  FX_BOOL InitBuffer(int32_t iBufferSize = 1024 * 1024);
-  FX_BOOL IsInitialized() { return m_iBufferSize / m_iAllocStep >= 1; }
-  void ReleaseBuffer() { delete this; }
-  FX_WCHAR* GetAvailableBlock(int32_t& iIndexInBlock);
-  inline int32_t GetAllocStep() const { return m_iAllocStep; }
-  inline int32_t& GetDataLengthRef() { return m_iDataLength; }
-  inline void Reset(FX_BOOL bReserveData = TRUE) {
-    if (!bReserveData) {
-      m_iStartPosition = 0;
-    }
-    m_iDataLength = 0;
-  }
-  void SetTextChar(int32_t iIndex, FX_WCHAR ch);
-  int32_t DeleteTextChars(int32_t iCount, FX_BOOL bDirection = TRUE);
-  void GetTextData(CFX_WideString& wsTextData,
-                   int32_t iStart = 0,
-                   int32_t iLength = -1) const;
-
- protected:
-  inline void TextDataIndex2BufIndex(const int32_t iIndex,
-                                     int32_t& iBlockIndex,
-                                     int32_t& iInnerIndex) const;
-  void ClearBuffer();
-  CFX_PtrArray m_BlockArray;
-  int32_t m_iDataLength;
-  int32_t m_iBufferSize;
-  int32_t m_iAllocStep;
-  int32_t m_iStartPosition;
-};
-
-#define FDE_XMLSYNTAXMODE_Text 0
-#define FDE_XMLSYNTAXMODE_Node 1
-#define FDE_XMLSYNTAXMODE_Target 2
-#define FDE_XMLSYNTAXMODE_Tag 3
-#define FDE_XMLSYNTAXMODE_AttriName 4
-#define FDE_XMLSYNTAXMODE_AttriEqualSign 5
-#define FDE_XMLSYNTAXMODE_AttriQuotation 6
-#define FDE_XMLSYNTAXMODE_AttriValue 7
-#define FDE_XMLSYNTAXMODE_Entity 8
-#define FDE_XMLSYNTAXMODE_EntityDecimal 9
-#define FDE_XMLSYNTAXMODE_EntityHex 10
-#define FDE_XMLSYNTAXMODE_CloseInstruction 11
-#define FDE_XMLSYNTAXMODE_BreakElement 12
-#define FDE_XMLSYNTAXMODE_CloseElement 13
-#define FDE_XMLSYNTAXMODE_SkipDeclNode 14
-#define FDE_XMLSYNTAXMODE_DeclCharData 15
-#define FDE_XMLSYNTAXMODE_SkipComment 16
-#define FDE_XMLSYNTAXMODE_SkipCommentOrDecl 17
-#define FDE_XMLSYNTAXMODE_TargetData 18
-class CFDE_XMLSyntaxParser : public IFDE_XMLSyntaxParser, public CFX_Target {
- public:
-  CFDE_XMLSyntaxParser();
-  ~CFDE_XMLSyntaxParser();
-  virtual void Release() { delete this; }
-  virtual void Init(IFX_Stream* pStream,
-                    int32_t iXMLPlaneSize,
-                    int32_t iTextDataSize = 256);
-  virtual FX_DWORD DoSyntaxParse();
-  virtual int32_t GetStatus() const;
-  virtual int32_t GetCurrentPos() const {
-    return m_iParsedChars + (m_pStart - m_pBuffer);
-  }
-  virtual FX_FILESIZE GetCurrentBinaryPos() const;
-  virtual int32_t GetCurrentNodeNumber() const { return m_iCurrentNodeNum; }
-  virtual int32_t GetLastNodeNumber() const { return m_iLastNodeNum; }
-
-  virtual void GetTargetName(CFX_WideString& wsTarget) const {
-    m_BlockBuffer.GetTextData(wsTarget, 0, m_iTextDataLength);
-  }
-  virtual void GetTagName(CFX_WideString& wsTag) const {
-    m_BlockBuffer.GetTextData(wsTag, 0, m_iTextDataLength);
-  }
-  virtual void GetAttributeName(CFX_WideString& wsAttriName) const {
-    m_BlockBuffer.GetTextData(wsAttriName, 0, m_iTextDataLength);
-  }
-  virtual void GetAttributeValue(CFX_WideString& wsAttriValue) const {
-    m_BlockBuffer.GetTextData(wsAttriValue, 0, m_iTextDataLength);
-  }
-  virtual void GetTextData(CFX_WideString& wsText) const {
-    m_BlockBuffer.GetTextData(wsText, 0, m_iTextDataLength);
-  }
-  virtual void GetTargetData(CFX_WideString& wsData) const {
-    m_BlockBuffer.GetTextData(wsData, 0, m_iTextDataLength);
-  }
-
- protected:
-  IFX_Stream* m_pStream;
-  int32_t m_iXMLPlaneSize;
-  int32_t m_iCurrentPos;
-  int32_t m_iCurrentNodeNum;
-  int32_t m_iLastNodeNum;
-  int32_t m_iParsedChars;
-  int32_t m_iParsedBytes;
-  FX_WCHAR* m_pBuffer;
-  int32_t m_iBufferChars;
-  FX_BOOL m_bEOS;
-  FX_WCHAR* m_pStart;
-  FX_WCHAR* m_pEnd;
-  FDE_XMLNODE m_CurNode;
-  CFDE_XMLNodeStack m_XMLNodeStack;
-  CFDE_BlockBuffer m_BlockBuffer;
-  int32_t m_iAllocStep;
-  int32_t& m_iDataLength;
-  FX_WCHAR* m_pCurrentBlock;
-  int32_t m_iIndexInBlock;
-  int32_t m_iTextDataLength;
-  FX_DWORD m_dwStatus;
-  FX_DWORD m_dwMode;
-  FX_WCHAR m_wQuotationMark;
-  int32_t m_iEntityStart;
-  CFX_DWordStack m_SkipStack;
-  FX_WCHAR m_SkipChar;
-  inline void ParseTextChar(FX_WCHAR ch);
-};
-
-#endif  // XFA_SRC_FDE_XML_FDE_XML_IMP_H_
diff --git a/xfa/src/fee/fde_txtedtbuf.cpp b/xfa/src/fee/fde_txtedtbuf.cpp
deleted file mode 100644
index 93a12dd..0000000
--- a/xfa/src/fee/fde_txtedtbuf.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fde_txtedtbuf.h"
-
-#include <algorithm>
-
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-
-#define FDE_DEFCHUNKCOUNT 2
-#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
-#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
-#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
-
-CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias)
-    : m_pBuf(pBuf),
-      m_nCurChunk(0),
-      m_nCurIndex(0),
-      m_nIndex(0),
-      m_Alias(wcAlias) {
-  FXSYS_assert(m_pBuf);
-}
-CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() {}
-void CFDE_TxtEdtBufIter::Release() {
-  delete this;
-}
-FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev) {
-  if (bPrev) {
-    if (m_nIndex == 0) {
-      return FALSE;
-    }
-    FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
-    CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = NULL;
-    if (m_nCurIndex > 0) {
-      m_nCurIndex--;
-    } else {
-      while (m_nCurChunk > 0) {
-        --m_nCurChunk;
-        lpChunk =
-            (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
-        if (lpChunk->nUsed > 0) {
-          m_nCurIndex = lpChunk->nUsed - 1;
-          break;
-        }
-      }
-    }
-    FXSYS_assert(m_nCurChunk >= 0);
-    m_nIndex--;
-    return TRUE;
-  } else {
-    if (m_nIndex >= (m_pBuf->m_nTotal - 1)) {
-      return FALSE;
-    }
-    FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
-    CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk =
-        (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
-    if (lpChunk->nUsed != (m_nCurIndex + 1)) {
-      m_nCurIndex++;
-    } else {
-      int32_t nEnd = m_pBuf->m_Chunks.GetSize() - 1;
-      while (m_nCurChunk < nEnd) {
-        m_nCurChunk++;
-        CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunkTemp =
-            (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
-        if (lpChunkTemp->nUsed > 0) {
-          m_nCurIndex = 0;
-          break;
-        }
-      }
-    }
-    m_nIndex++;
-    return TRUE;
-  }
-}
-void CFDE_TxtEdtBufIter::SetAt(int32_t nIndex) {
-  FXSYS_assert(nIndex >= 0 && nIndex < m_pBuf->m_nTotal);
-  CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp;
-  m_pBuf->Index2CP(nIndex, cp);
-  m_nIndex = nIndex;
-  m_nCurChunk = cp.nChunkIndex;
-  m_nCurIndex = cp.nCharIndex;
-}
-int32_t CFDE_TxtEdtBufIter::GetAt() const {
-  return m_nIndex;
-}
-FX_WCHAR CFDE_TxtEdtBufIter::GetChar() {
-  FXSYS_assert(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal);
-  if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1)) {
-    return ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])
-        ->wChars[m_nCurIndex];
-  }
-  return m_Alias;
-}
-FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail) const {
-  return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0;
-}
-IFX_CharIter* CFDE_TxtEdtBufIter::Clone() {
-  CFDE_TxtEdtBufIter* pIter = new CFDE_TxtEdtBufIter(m_pBuf);
-  pIter->m_nCurChunk = m_nCurChunk;
-  pIter->m_nCurIndex = m_nCurIndex;
-  pIter->m_nIndex = m_nIndex;
-  pIter->m_Alias = m_Alias;
-  return pIter;
-}
-CFDE_TxtEdtBuf::CFDE_TxtEdtBuf(int32_t nDefChunkSize)
-    : m_nChunkSize(nDefChunkSize),
-      m_nTotal(0),
-      m_bChanged(FALSE),
-      m_pAllocator(NULL) {
-  FXSYS_assert(m_nChunkSize);
-  ResetChunkBuffer(FDE_DEFCHUNKCOUNT, m_nChunkSize);
-}
-void CFDE_TxtEdtBuf::Release() {
-  delete this;
-}
-CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf() {
-  Clear(TRUE);
-  m_pAllocator->Release();
-  m_Chunks.RemoveAll();
-}
-FX_BOOL CFDE_TxtEdtBuf::SetChunkSize(int32_t nChunkSize) {
-  FXSYS_assert(nChunkSize);
-  ResetChunkBuffer(FDE_DEFCHUNKCOUNT, nChunkSize);
-  return TRUE;
-}
-int32_t CFDE_TxtEdtBuf::GetChunkSize() const {
-  return m_nChunkSize;
-}
-int32_t CFDE_TxtEdtBuf::GetTextLength() const {
-  return m_nTotal;
-}
-void CFDE_TxtEdtBuf::SetText(const CFX_WideString& wsText) {
-  FXSYS_assert(!wsText.IsEmpty());
-  Clear(FALSE);
-  int32_t nTextLength = wsText.GetLength();
-  int32_t nNeedCount =
-      ((nTextLength - 1) / m_nChunkSize + 1) - m_Chunks.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nNeedCount; i++) {
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
-        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
-    lpChunk->nUsed = 0;
-    m_Chunks.Add(lpChunk);
-  }
-  int32_t nTotalCount = m_Chunks.GetSize();
-  const FX_WCHAR* lpSrcBuf = wsText.c_str();
-  int32_t nLeave = nTextLength;
-  int32_t nCopyedLength = m_nChunkSize;
-  for (i = 0; i < nTotalCount && nLeave > 0; i++) {
-    if (nLeave < nCopyedLength) {
-      nCopyedLength = nLeave;
-    }
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
-    FXSYS_memcpy(lpChunk->wChars, lpSrcBuf, nCopyedLength * sizeof(FX_WCHAR));
-    nLeave -= nCopyedLength;
-    lpSrcBuf += nCopyedLength;
-    lpChunk->nUsed = nCopyedLength;
-  }
-  m_nTotal = nTextLength;
-  m_bChanged = TRUE;
-}
-void CFDE_TxtEdtBuf::GetText(CFX_WideString& wsText) const {
-  GetRange(wsText, 0, m_nTotal);
-}
-FX_WCHAR CFDE_TxtEdtBuf::GetCharByIndex(int32_t nIndex) const {
-  FXSYS_assert(nIndex >= 0 && nIndex < GetTextLength());
-  FDE_LPCHUNKHEADER pChunkHeader = NULL;
-  int32_t nTotal = 0;
-  int32_t nCount = m_Chunks.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    pChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[i];
-    nTotal += pChunkHeader->nUsed;
-    if (nTotal > nIndex) {
-      break;
-    }
-  }
-  FXSYS_assert(pChunkHeader);
-  return pChunkHeader->wChars[pChunkHeader->nUsed - (nTotal - nIndex)];
-}
-void CFDE_TxtEdtBuf::GetRange(CFX_WideString& wsText,
-                              int32_t nBegin,
-                              int32_t nLength) const {
-  FDE_CHUNKPLACE cp;
-  Index2CP(nBegin, cp);
-  int32_t nLeave = nLength;
-  int32_t nCount = m_Chunks.GetSize();
-  FX_WCHAR* lpDstBuf = wsText.GetBuffer(nLength);
-  int32_t nChunkIndex = cp.nChunkIndex;
-  FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
-  int32_t nCopyLength = lpChunkHeader->nUsed - cp.nCharIndex;
-  FX_WCHAR* lpSrcBuf = lpChunkHeader->wChars + cp.nCharIndex;
-  while (nLeave > 0) {
-    if (nLeave <= nCopyLength) {
-      nCopyLength = nLeave;
-    }
-    FXSYS_memcpy(lpDstBuf, lpSrcBuf, nCopyLength * sizeof(FX_WCHAR));
-    nChunkIndex++;
-    if (nChunkIndex >= nCount) {
-      break;
-    }
-    lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
-    lpSrcBuf = lpChunkHeader->wChars;
-    nLeave -= nCopyLength;
-    lpDstBuf += nCopyLength;
-    nCopyLength = lpChunkHeader->nUsed;
-  }
-  wsText.ReleaseBuffer();
-}
-void CFDE_TxtEdtBuf::Insert(int32_t nPos,
-                            const FX_WCHAR* lpText,
-                            int32_t nLength) {
-  FXSYS_assert(nPos >= 0 && nPos <= m_nTotal);
-  FDE_CHUNKPLACE cp;
-  Index2CP(nPos, cp);
-  int32_t nLengthTemp = nLength;
-  if (cp.nCharIndex != 0) {
-    FDE_LPCHUNKHEADER lpNewChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
-        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex];
-    int32_t nCopy = lpChunk->nUsed - cp.nCharIndex;
-    FXSYS_memcpy(lpNewChunk->wChars, lpChunk->wChars + cp.nCharIndex,
-                 nCopy * sizeof(FX_WCHAR));
-    lpChunk->nUsed -= nCopy;
-    cp.nChunkIndex++;
-    m_Chunks.InsertAt(cp.nChunkIndex, lpNewChunk);
-    lpNewChunk->nUsed = nCopy;
-    cp.nCharIndex = 0;
-  }
-  if (cp.nChunkIndex != 0) {
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex - 1];
-    if (lpChunk->nUsed != m_nChunkSize) {
-      cp.nChunkIndex--;
-      int32_t nFree = m_nChunkSize - lpChunk->nUsed;
-      int32_t nCopy = std::min(nLengthTemp, nFree);
-      FXSYS_memcpy(lpChunk->wChars + lpChunk->nUsed, lpText,
-                   nCopy * sizeof(FX_WCHAR));
-      lpText += nCopy;
-      nLengthTemp -= nCopy;
-      lpChunk->nUsed += nCopy;
-      cp.nChunkIndex++;
-    }
-  }
-  while (nLengthTemp > 0) {
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(
-        sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR));
-    FXSYS_assert(lpChunk);
-    int32_t nCopy = std::min(nLengthTemp, m_nChunkSize);
-    FXSYS_memcpy(lpChunk->wChars, lpText, nCopy * sizeof(FX_WCHAR));
-    lpText += nCopy;
-    nLengthTemp -= nCopy;
-    lpChunk->nUsed = nCopy;
-    m_Chunks.InsertAt(cp.nChunkIndex, lpChunk);
-    cp.nChunkIndex++;
-  }
-  m_nTotal += nLength;
-  m_bChanged = TRUE;
-}
-void CFDE_TxtEdtBuf::Delete(int32_t nIndex, int32_t nLength) {
-  FXSYS_assert(nLength > 0 && nIndex >= 0 && nIndex + nLength <= m_nTotal);
-  FDE_CHUNKPLACE cpEnd;
-  Index2CP(nIndex + nLength - 1, cpEnd);
-  m_nTotal -= nLength;
-  FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
-  int32_t nFirstPart = cpEnd.nCharIndex + 1;
-  int32_t nMovePart = lpChunk->nUsed - nFirstPart;
-  if (nMovePart != 0) {
-    int32_t nDelete = std::min(nFirstPart, nLength);
-    FXSYS_memmove(lpChunk->wChars + nFirstPart - nDelete,
-                  lpChunk->wChars + nFirstPart, nMovePart * sizeof(FX_WCHAR));
-    lpChunk->nUsed -= nDelete;
-    nLength -= nDelete;
-    cpEnd.nChunkIndex--;
-  }
-  while (nLength > 0) {
-    lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
-    int32_t nDeleted = std::min(lpChunk->nUsed, nLength);
-    lpChunk->nUsed -= nDeleted;
-    if (lpChunk->nUsed == 0) {
-      m_pAllocator->Free(lpChunk);
-      m_Chunks.RemoveAt(cpEnd.nChunkIndex);
-      lpChunk = NULL;
-    }
-    nLength -= nDeleted;
-    cpEnd.nChunkIndex--;
-  }
-  m_bChanged = TRUE;
-}
-void CFDE_TxtEdtBuf::Clear(FX_BOOL bRelease) {
-  int32_t i = 0;
-  int32_t nCount = m_Chunks.GetSize();
-  if (bRelease) {
-    while (i < nCount) {
-      m_pAllocator->Free(m_Chunks[i++]);
-    }
-    m_Chunks.RemoveAll();
-  } else {
-    while (i < nCount) {
-      ((FDE_LPCHUNKHEADER)m_Chunks[i++])->nUsed = 0;
-    }
-  }
-  m_nTotal = 0;
-  m_bChanged = TRUE;
-}
-FX_BOOL CFDE_TxtEdtBuf::Optimize(IFX_Pause* pPause) {
-  if (m_bChanged == FALSE) {
-    return TRUE;
-  }
-  if (m_nTotal == 0) {
-    return TRUE;
-  }
-  int32_t nCount = m_Chunks.GetSize();
-  if (nCount == 0) {
-    return TRUE;
-  }
-  int32_t i = 0;
-  for (; i < nCount; i++) {
-    FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
-    if (lpChunk->nUsed == 0) {
-      m_pAllocator->Free(lpChunk);
-      m_Chunks.RemoveAt(i);
-      --i;
-      --nCount;
-    }
-  }
-  if (pPause != NULL && pPause->NeedToPauseNow()) {
-    return FALSE;
-  }
-  FDE_LPCHUNKHEADER lpPreChunk = (FDE_LPCHUNKHEADER)m_Chunks[0];
-  FDE_LPCHUNKHEADER lpCurChunk = NULL;
-  for (i = 1; i < nCount; i++) {
-    lpCurChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
-    if (lpPreChunk->nUsed + lpCurChunk->nUsed <= m_nChunkSize) {
-      FXSYS_memcpy(lpPreChunk->wChars + lpPreChunk->nUsed, lpCurChunk->wChars,
-                   lpCurChunk->nUsed * sizeof(FX_WCHAR));
-      lpPreChunk->nUsed += lpCurChunk->nUsed;
-      m_pAllocator->Free(lpCurChunk);
-      m_Chunks.RemoveAt(i);
-      --i;
-      --nCount;
-    } else {
-      lpPreChunk = lpCurChunk;
-    }
-    if (pPause != NULL && pPause->NeedToPauseNow()) {
-      return FALSE;
-    }
-  }
-  m_bChanged = FALSE;
-  return TRUE;
-}
-void CFDE_TxtEdtBuf::ResetChunkBuffer(int32_t nDefChunkCount,
-                                      int32_t nChunkSize) {
-  FXSYS_assert(nChunkSize);
-  FXSYS_assert(nDefChunkCount);
-  if (m_pAllocator) {
-    m_pAllocator->Release();
-    m_pAllocator = NULL;
-  }
-  m_Chunks.RemoveAll();
-  m_nChunkSize = nChunkSize;
-  int32_t nChunkLength =
-      sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR);
-  m_pAllocator =
-      FX_CreateAllocator(FX_ALLOCTYPE_Fixed, nDefChunkCount, nChunkLength);
-  FXSYS_assert(m_pAllocator);
-  FDE_LPCHUNKHEADER lpChunkHeader =
-      (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(nChunkLength);
-  FXSYS_assert(lpChunkHeader);
-  lpChunkHeader->nUsed = 0;
-  m_Chunks.Add(lpChunkHeader);
-  m_nTotal = 0;
-}
-int32_t CFDE_TxtEdtBuf::CP2Index(const FDE_CHUNKPLACE& cp) const {
-  int32_t nTotal = cp.nCharIndex;
-  int32_t i = 0;
-  for (i = 0; i < cp.nChunkIndex; i++) {
-    nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
-  }
-  return nTotal;
-}
-void CFDE_TxtEdtBuf::Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const {
-  FXSYS_assert(nIndex <= GetTextLength());
-  if (nIndex == m_nTotal) {
-    cp.nChunkIndex = m_Chunks.GetSize() - 1;
-    cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex])->nUsed;
-    return;
-  }
-  int32_t i = 0;
-  int32_t nTotal = 0;
-  int32_t nCount = m_Chunks.GetSize();
-  for (; i < nCount; i++) {
-    nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
-    if (nTotal > nIndex) {
-      break;
-    }
-  }
-  cp.nChunkIndex = i;
-  cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed - (nTotal - nIndex);
-}
diff --git a/xfa/src/fee/fde_txtedtbuf.h b/xfa/src/fee/fde_txtedtbuf.h
deleted file mode 100644
index 9fb6ac1..0000000
--- a/xfa/src/fee/fde_txtedtbuf.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FDE_TXTEDTBUF_H_
-#define XFA_SRC_FEE_FDE_TXTEDTBUF_H_
-
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class IFX_CharIter;
-class CFDE_TxtEdtBuf;
-
-class CFDE_TxtEdtBufIter : public IFX_CharIter {
- public:
-  CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias = 0);
-
-  virtual void Release();
-  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
-  virtual FX_WCHAR GetChar();
-  virtual void SetAt(int32_t nIndex);
-  virtual int32_t GetAt() const;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
-  virtual IFX_CharIter* Clone();
-
- protected:
-  ~CFDE_TxtEdtBufIter();
-
- private:
-  CFDE_TxtEdtBuf* m_pBuf;
-  int32_t m_nCurChunk;
-  int32_t m_nCurIndex;
-  int32_t m_nIndex;
-  FX_WCHAR m_Alias;
-};
-class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf {
-  friend class CFDE_TxtEdtBufIter;
-  struct _FDE_CHUNKHEADER {
-    int32_t nUsed;
-    FX_WCHAR wChars[1];
-  };
-  typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER;
-  typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER;
-  struct _FDE_CHUNKPLACE {
-    int32_t nChunkIndex;
-    int32_t nCharIndex;
-  };
-  typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE;
-  typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE;
-
- public:
-  CFDE_TxtEdtBuf(int32_t nDefChunkSize = FDE_DEFCHUNKLENGTH);
-
-  virtual void Release();
-  virtual FX_BOOL SetChunkSize(int32_t nChunkSize);
-  virtual int32_t GetChunkSize() const;
-  virtual int32_t GetTextLength() const;
-  virtual void SetText(const CFX_WideString& wsText);
-  virtual void GetText(CFX_WideString& wsText) const;
-  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const;
-  virtual void GetRange(CFX_WideString& wsText,
-                        int32_t nBegine,
-                        int32_t nCount = -1) const;
-
-  virtual void Insert(int32_t nPos,
-                      const FX_WCHAR* lpText,
-                      int32_t nLength = 1);
-  virtual void Delete(int32_t nIndex, int32_t nLength = 1);
-  virtual void Clear(FX_BOOL bRelease = TRUE);
-
-  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);
-
- protected:
-  virtual ~CFDE_TxtEdtBuf();
-
- private:
-  void ResetChunkBuffer(int32_t nDefChunkCount, int32_t nChunkSize);
-  int32_t CP2Index(const FDE_CHUNKPLACE& cp) const;
-  void Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const;
-
-  int32_t m_nChunkSize;
-
-  int32_t m_nTotal;
-  FX_BOOL m_bChanged;
-  CFX_PtrArray m_Chunks;
-  IFX_MEMAllocator* m_pAllocator;
-};
-
-#endif  // XFA_SRC_FEE_FDE_TXTEDTBUF_H_
diff --git a/xfa/src/fee/fde_txtedtengine.cpp b/xfa/src/fee/fde_txtedtengine.cpp
deleted file mode 100644
index 9f8fe5b..0000000
--- a/xfa/src/fee/fde_txtedtengine.cpp
+++ /dev/null
@@ -1,1783 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fde_txtedtengine.h"
-
-#include <algorithm>
-
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fee/fde_txtedtbuf.h"
-#include "xfa/src/fee/fde_txtedtparag.h"
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-#include "xfa/src/fee/ifde_txtedtpage.h"
-
-#define FDE_PAGEWIDTH_MAX 0xFFFF
-#define FDE_TXTPLATESIZE (1024 * 12)
-#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029)
-#define FDE_TXTEDT_DORECORD_INS 0
-#define FDE_TXTEDT_DORECORD_DEL 1
-
-IFDE_TxtEdtEngine* IFDE_TxtEdtEngine::Create() {
-  return new CFDE_TxtEdtEngine();
-}
-CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
-    : m_pTextBreak(nullptr),
-      m_nPageLineCount(20),
-      m_nLineCount(0),
-      m_nAnchorPos(-1),
-      m_nLayoutPos(0),
-      m_fCaretPosReserve(0.0),
-      m_nCaret(0),
-      m_bBefore(TRUE),
-      m_nCaretPage(0),
-      m_dwFindFlags(0),
-      m_bLock(FALSE),
-      m_nLimit(0),
-      m_wcAliasChar(L'*'),
-      m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto),
-      m_bAutoLineEnd(TRUE),
-      m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR) {
-  FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
-  m_pTxtBuf = new CFDE_TxtEdtBuf();
-  m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
-}
-CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
-  if (m_pTxtBuf) {
-    m_pTxtBuf->Release();
-    m_pTxtBuf = NULL;
-  }
-  if (m_pTextBreak) {
-    m_pTextBreak->Release();
-    m_pTextBreak = NULL;
-  }
-  RemoveAllParags();
-  RemoveAllPages();
-  m_Param.pEventSink = NULL;
-  ClearSelection();
-}
-void CFDE_TxtEdtEngine::Release() {
-  delete this;
-}
-void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
-  if (m_pTextBreak == NULL) {
-    m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
-  }
-  FXSYS_memcpy(&m_Param, &params, sizeof(FDE_TXTEDTPARAMS));
-  m_wLineEnd = params.wLineBreakChar;
-  m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
-  UpdateTxtBreak();
-}
-const FDE_TXTEDTPARAMS* CFDE_TxtEdtEngine::GetEditParams() const {
-  return &m_Param;
-}
-int32_t CFDE_TxtEdtEngine::CountPages() const {
-  if (m_nLineCount == 0) {
-    return 0;
-  }
-  return ((m_nLineCount - 1) / m_nPageLineCount) + 1;
-}
-IFDE_TxtEdtPage* CFDE_TxtEdtEngine::GetPage(int32_t nIndex) {
-  if (m_PagePtrArray.GetSize() <= nIndex) {
-    return NULL;
-  }
-  return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex];
-}
-FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(int32_t nChunkSize) {
-  return m_pTxtBuf->SetChunkSize(nChunkSize);
-}
-void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream* pStream) {
-  ResetEngine();
-  int32_t nIndex = 0;
-  if (pStream != NULL && pStream->GetLength()) {
-    int32_t nStreamLength = pStream->GetLength();
-    FX_BOOL bValid = TRUE;
-    if (m_nLimit > 0 && nStreamLength > m_nLimit) {
-      bValid = FALSE;
-    }
-    FX_BOOL bPreIsCR = FALSE;
-    if (bValid) {
-      uint8_t bom[4];
-      int32_t nPos = pStream->GetBOM(bom);
-      pStream->Seek(FX_STREAMSEEK_Begin, nPos);
-      int32_t nPlateSize = std::min(nStreamLength, m_pTxtBuf->GetChunkSize());
-      FX_WCHAR* lpwstr = FX_Alloc(FX_WCHAR, nPlateSize);
-      FX_BOOL bEos = false;
-      while (!bEos) {
-        int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, bEos);
-        bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR);
-        m_pTxtBuf->Insert(nIndex, lpwstr, nRead);
-        nIndex += nRead;
-      }
-      FX_Free(lpwstr);
-    }
-  }
-  m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1);
-  RebuildParagraphs();
-}
-void CFDE_TxtEdtEngine::SetText(const CFX_WideString& wsText) {
-  ResetEngine();
-  int32_t nLength = wsText.GetLength();
-  if (nLength > 0) {
-    CFX_WideString wsTemp;
-    FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
-    FXSYS_memcpy(lpBuffer, wsText.c_str(), nLength * sizeof(FX_WCHAR));
-    ReplaceParagEnd(lpBuffer, nLength, FALSE);
-    wsTemp.ReleaseBuffer(nLength);
-    if (m_nLimit > 0 && nLength > m_nLimit) {
-      wsTemp.Delete(m_nLimit, nLength - m_nLimit);
-      nLength = m_nLimit;
-    }
-    m_pTxtBuf->SetText(wsTemp);
-  }
-  m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1);
-  RebuildParagraphs();
-}
-int32_t CFDE_TxtEdtEngine::GetTextLength() const {
-  return GetTextBufLength();
-}
-void CFDE_TxtEdtEngine::GetText(CFX_WideString& wsText,
-                                int32_t nStart,
-                                int32_t nCount) {
-  int32_t nTextBufLength = GetTextBufLength();
-  if (nCount == -1) {
-    nCount = nTextBufLength - nStart;
-  }
-  m_pTxtBuf->GetRange(wsText, nStart, nCount);
-  RecoverParagEnd(wsText);
-}
-
-void CFDE_TxtEdtEngine::ClearText() {
-  DeleteRange(0, -1);
-}
-int32_t CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret) const {
-  rtCaret = m_rtCaret;
-  return m_nCaret;
-}
-int32_t CFDE_TxtEdtEngine::GetCaretPos() const {
-  if (IsLocked()) {
-    return 0;
-  }
-  return m_nCaret + (m_bBefore ? 0 : 1);
-}
-int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
-  if (IsLocked()) {
-    return 0;
-  }
-  FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength());
-  if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
-    return 0;
-  }
-  m_bBefore = bBefore;
-  m_nCaret = nIndex;
-  MovePage2Char(m_nCaret);
-  GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
-  if (!m_bBefore) {
-    m_nCaret++;
-    m_bBefore = TRUE;
-  }
-  m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
-                           ? m_rtCaret.top
-                           : m_rtCaret.left;
-  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
-  m_nAnchorPos = -1;
-  return m_nCaret;
-}
-int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
-                                        FX_BOOL bShift,
-                                        FX_BOOL bCtrl) {
-  if (IsLocked()) {
-    return 0;
-  }
-  if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
-    return 0;
-  }
-  FX_BOOL bSelChange = FALSE;
-  if (IsSelect()) {
-    ClearSelection();
-    bSelChange = TRUE;
-  }
-  if (bShift) {
-    if (m_nAnchorPos == -1) {
-      m_nAnchorPos = m_nCaret;
-    }
-  } else {
-    m_nAnchorPos = -1;
-  }
-  FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
-  switch (eMoveCaret) {
-    case MC_Left: {
-      if (bVertical) {
-        CFX_PointF ptCaret;
-        if (MoveUp(ptCaret)) {
-          UpdateCaretIndex(ptCaret);
-        }
-      } else {
-        FX_BOOL bBefore = TRUE;
-        int32_t nIndex = MoveBackward(bBefore);
-        if (nIndex >= 0) {
-          UpdateCaretRect(nIndex, bBefore);
-        }
-      }
-    } break;
-    case MC_Right: {
-      if (bVertical) {
-        CFX_PointF ptCaret;
-        if (MoveDown(ptCaret)) {
-          UpdateCaretIndex(ptCaret);
-        }
-      } else {
-        FX_BOOL bBefore = TRUE;
-        int32_t nIndex = MoveForward(bBefore);
-        if (nIndex >= 0) {
-          UpdateCaretRect(nIndex, bBefore);
-        }
-      }
-    } break;
-    case MC_Up: {
-      if (bVertical) {
-        FX_BOOL bBefore = TRUE;
-        int32_t nIndex = MoveBackward(bBefore);
-        if (nIndex >= 0) {
-          UpdateCaretRect(nIndex, bBefore);
-        }
-      } else {
-        CFX_PointF ptCaret;
-        if (MoveUp(ptCaret)) {
-          UpdateCaretIndex(ptCaret);
-        }
-      }
-    } break;
-    case MC_Down: {
-      if (bVertical) {
-        FX_BOOL bBefore = TRUE;
-        int32_t nIndex = MoveForward(bBefore);
-        if (nIndex >= 0) {
-          UpdateCaretRect(nIndex, bBefore);
-        }
-      } else {
-        CFX_PointF ptCaret;
-        if (MoveDown(ptCaret)) {
-          UpdateCaretIndex(ptCaret);
-        }
-      }
-    } break;
-    case MC_WordBackward:
-      break;
-    case MC_WordForward:
-      break;
-    case MC_LineStart:
-      MoveLineStart();
-      break;
-    case MC_LineEnd:
-      MoveLineEnd();
-      break;
-    case MC_ParagStart:
-      MoveParagStart();
-      break;
-    case MC_ParagEnd:
-      MoveParagEnd();
-      break;
-    case MC_PageDown:
-      break;
-    case MC_PageUp:
-      break;
-    case MC_Home:
-      MoveHome();
-      break;
-    case MC_End:
-      MoveEnd();
-      break;
-    default:
-      break;
-  }
-  if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) {
-    AddSelRange(std::min(m_nAnchorPos, m_nCaret),
-                FXSYS_abs(m_nAnchorPos - m_nCaret));
-    m_Param.pEventSink->On_SelChanged(this);
-  }
-  if (bSelChange) {
-    m_Param.pEventSink->On_SelChanged(this);
-  }
-  return m_nCaret;
-}
-void CFDE_TxtEdtEngine::Lock() {
-  m_bLock = TRUE;
-}
-void CFDE_TxtEdtEngine::Unlock() {
-  m_bLock = FALSE;
-}
-FX_BOOL CFDE_TxtEdtEngine::IsLocked() const {
-  return m_bLock;
-}
-int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart,
-                                  const FX_WCHAR* lpText,
-                                  int32_t nLength) {
-  if (IsLocked()) {
-    return FDE_TXTEDT_MODIFY_RET_F_Locked;
-  }
-  CFX_WideString wsTemp;
-  FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
-  FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
-  ReplaceParagEnd(lpBuffer, nLength, FALSE);
-  wsTemp.ReleaseBuffer(nLength);
-  FX_BOOL bPart = FALSE;
-  if (m_nLimit > 0) {
-    int32_t nTotalLength = GetTextBufLength();
-    int32_t nCount = m_SelRangePtrArr.GetSize();
-    for (int32_t i = 0; i < nCount; i++) {
-      FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i);
-      nTotalLength -= lpSelRange->nCount;
-    }
-    int32_t nExpectLength = nTotalLength + nLength;
-    if (nTotalLength == m_nLimit) {
-      return FDE_TXTEDT_MODIFY_RET_F_Full;
-    }
-    if (nExpectLength > m_nLimit) {
-      nLength -= (nExpectLength - m_nLimit);
-      bPart = TRUE;
-    }
-  }
-  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) ||
-      (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
-    int32_t nTemp = nLength;
-    if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) {
-      CFX_WideString wsText;
-      while (nLength > 0) {
-        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
-        int32_t nTotal = wsText.GetLength();
-        FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal);
-        for (int32_t i = 0; i < nTotal; i++) {
-          lpBuf[i] = m_wcAliasChar;
-        }
-        wsText.ReleaseBuffer(nTotal);
-        if (IsFitArea(wsText)) {
-          break;
-        }
-        nLength--;
-      }
-    } else {
-      CFX_WideString wsText;
-      while (nLength > 0) {
-        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
-        if (IsFitArea(wsText)) {
-          break;
-        }
-        nLength--;
-      }
-    }
-    if (nLength == 0) {
-      return FDE_TXTEDT_MODIFY_RET_F_Full;
-    }
-    if (nLength < nTemp) {
-      bPart = TRUE;
-    }
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
-    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
-      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
-    }
-  }
-  if (IsSelect()) {
-    DeleteSelect();
-  }
-  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
-    IFDE_TxtEdtDoRecord* pRecord =
-        new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength);
-    CFX_ByteString bsDoRecord;
-    pRecord->Serialize(bsDoRecord);
-    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
-    pRecord->Release();
-  }
-  GetText(m_ChangeInfo.wsPrevText, 0);
-  Inner_Insert(m_nCaret, lpBuffer, nLength);
-  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
-  m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength);
-  nStart = m_nCaret;
-  nStart += nLength;
-  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
-  FX_BOOL bBefore = TRUE;
-  if (wChar != L'\n' && wChar != L'\r') {
-    nStart--;
-    bBefore = FALSE;
-  }
-  SetCaretPos(nStart, bBefore);
-  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
-  return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, FX_BOOL bBackspace) {
-  if (IsLocked()) {
-    return FDE_TXTEDT_MODIFY_RET_F_Locked;
-  }
-  if (IsSelect()) {
-    DeleteSelect();
-    return FDE_TXTEDT_MODIFY_RET_S_Normal;
-  }
-
-  int32_t nCount = 1;
-  if (bBackspace) {
-    if (nStart == 0) {
-      return FDE_TXTEDT_MODIFY_RET_F_Boundary;
-    }
-    if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' &&
-        m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') {
-      nStart--;
-      nCount++;
-    }
-    nStart--;
-  } else {
-    if (nStart == GetTextBufLength()) {
-      return FDE_TXTEDT_MODIFY_RET_F_Full;
-    }
-    if ((nStart + 1 < GetTextBufLength()) &&
-        (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') &&
-        (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) {
-      nCount++;
-    }
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreDeleteText(wsText, nStart, nCount);
-    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
-      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
-    }
-  }
-  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
-    CFX_WideString wsRange;
-    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
-    IFDE_TxtEdtDoRecord* pRecord =
-        new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange);
-    CFX_ByteString bsDoRecord;
-    pRecord->Serialize(bsDoRecord);
-    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
-    pRecord->Release();
-  }
-  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
-  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
-  Inner_DeleteRange(nStart, nCount);
-  SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0),
-              (bBackspace || nStart == 0));
-  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
-  return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) {
-  if (IsLocked()) {
-    return FDE_TXTEDT_MODIFY_RET_F_Locked;
-  }
-  if (nCount == -1) {
-    nCount = GetTextBufLength();
-  }
-  if (nCount == 0) {
-    return FDE_TXTEDT_MODIFY_RET_S_Normal;
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreDeleteText(wsText, nStart, nCount);
-    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
-      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
-    }
-  }
-  DeleteRange_DoRecord(nStart, nCount);
-  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
-  SetCaretPos(nStart, TRUE);
-  return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart,
-                                   int32_t nLength,
-                                   const CFX_WideString& wsReplace) {
-  if (IsLocked()) {
-    return FDE_TXTEDT_MODIFY_RET_F_Locked;
-  }
-  if (nStart < 0 || (nStart + nLength > GetTextBufLength())) {
-    return FDE_TXTEDT_MODIFY_RET_F_Boundary;
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreReplaceText(wsText, nStart, nLength, wsReplace.c_str(),
-                      wsReplace.GetLength());
-    if (!m_Param.pEventSink->On_Validate(this, wsText)) {
-      return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
-    }
-  }
-  if (IsSelect()) {
-    ClearSelection();
-  }
-  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace;
-  GetText(m_ChangeInfo.wsDelete, nStart, nLength);
-  if (nLength > 0) {
-    Inner_DeleteRange(nStart, nLength);
-  }
-  int32_t nTextLength = wsReplace.GetLength();
-  if (nTextLength > 0) {
-    Inner_Insert(nStart, wsReplace.c_str(), nTextLength);
-  }
-  m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength);
-  nStart += nTextLength;
-  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
-  FX_BOOL bBefore = TRUE;
-  if (wChar != L'\n' && wChar != L'\r') {
-    nStart--;
-    bBefore = FALSE;
-  }
-  SetCaretPos(nStart, bBefore);
-  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-  m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
-  return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) {
-  m_nLimit = nLimit;
-}
-void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) {
-  m_wcAliasChar = wcAlias;
-}
-
-void CFDE_TxtEdtEngine::RemoveSelRange(int32_t nStart, int32_t nCount) {
-  FDE_LPTXTEDTSELRANGE lpTemp = NULL;
-  int32_t nRangeCount = m_SelRangePtrArr.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nRangeCount; i++) {
-    lpTemp = m_SelRangePtrArr[i];
-    if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) {
-      delete lpTemp;
-      m_SelRangePtrArr.RemoveAt(i);
-      return;
-    }
-  }
-}
-
-void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) {
-  if (nCount == -1) {
-    nCount = GetTextLength() - nStart;
-  }
-  int32_t nSize = m_SelRangePtrArr.GetSize();
-  if (nSize <= 0) {
-    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
-    lpSelRange->nStart = nStart;
-    lpSelRange->nCount = nCount;
-    m_SelRangePtrArr.Add(lpSelRange);
-    m_Param.pEventSink->On_SelChanged(this);
-    return;
-  }
-  FDE_LPTXTEDTSELRANGE lpTemp = NULL;
-  lpTemp = m_SelRangePtrArr[nSize - 1];
-  if (nStart >= lpTemp->nStart + lpTemp->nCount) {
-    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
-    lpSelRange->nStart = nStart;
-    lpSelRange->nCount = nCount;
-    m_SelRangePtrArr.Add(lpSelRange);
-    m_Param.pEventSink->On_SelChanged(this);
-    return;
-  }
-  int32_t nEnd = nStart + nCount - 1;
-  FX_BOOL bBegin = FALSE;
-  int32_t nRangeBgn = 0;
-  int32_t nRangeCnt = 0;
-  for (int32_t i = 0; i < nSize; i++) {
-    lpTemp = m_SelRangePtrArr[i];
-    int32_t nTempBgn = lpTemp->nStart;
-    int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1;
-    if (bBegin) {
-      if (nEnd < nTempBgn) {
-        break;
-      } else if (nStart >= nTempBgn && nStart <= nTempEnd) {
-        nRangeCnt++;
-        break;
-      }
-      nRangeCnt++;
-    } else {
-      if (nStart <= nTempEnd) {
-        nRangeBgn = i;
-        if (nEnd < nTempBgn) {
-          break;
-        }
-        nRangeCnt = 1;
-        bBegin = TRUE;
-      }
-    }
-  }
-  if (nRangeCnt == 0) {
-    FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
-    lpSelRange->nStart = nStart;
-    lpSelRange->nCount = nCount;
-    m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange);
-  } else {
-    lpTemp = m_SelRangePtrArr[nRangeBgn];
-    lpTemp->nStart = nStart;
-    lpTemp->nCount = nCount;
-    nRangeCnt--;
-    nRangeBgn++;
-    while (nRangeCnt--) {
-      delete m_SelRangePtrArr[nRangeBgn];
-      m_SelRangePtrArr.RemoveAt(nRangeBgn);
-    }
-  }
-  m_Param.pEventSink->On_SelChanged(this);
-}
-
-int32_t CFDE_TxtEdtEngine::CountSelRanges() {
-  return m_SelRangePtrArr.GetSize();
-}
-int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  nStart = m_SelRangePtrArr[nIndex]->nStart;
-  return m_SelRangePtrArr[nIndex]->nCount;
-}
-void CFDE_TxtEdtEngine::ClearSelection() {
-  int32_t nCount = m_SelRangePtrArr.GetSize();
-  FDE_LPTXTEDTSELRANGE lpRange = NULL;
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    lpRange = m_SelRangePtrArr[i];
-    if (lpRange != NULL) {
-      delete lpRange;
-      lpRange = NULL;
-    }
-  }
-  m_SelRangePtrArr.RemoveAll();
-  if (nCount && m_Param.pEventSink) {
-    m_Param.pEventSink->On_SelChanged(this);
-  }
-}
-FX_BOOL CFDE_TxtEdtEngine::Redo(const CFX_ByteStringC& bsRedo) {
-  if (IsLocked()) {
-    return FALSE;
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
-    return FALSE;
-  }
-  IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo);
-  FXSYS_assert(pDoRecord);
-  if (pDoRecord == NULL) {
-    return FALSE;
-  }
-  FX_BOOL bOK = pDoRecord->Redo();
-  pDoRecord->Release();
-  return bOK;
-}
-FX_BOOL CFDE_TxtEdtEngine::Undo(const CFX_ByteStringC& bsUndo) {
-  if (IsLocked()) {
-    return FALSE;
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
-    return FALSE;
-  }
-  IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo);
-  FXSYS_assert(pDoRecord);
-  if (pDoRecord == NULL) {
-    return FALSE;
-  }
-  FX_BOOL bOK = pDoRecord->Undo();
-  pDoRecord->Release();
-  return bOK;
-}
-int32_t CFDE_TxtEdtEngine::StartLayout() {
-  Lock();
-  RemoveAllPages();
-  m_nLayoutPos = 0;
-  m_nLineCount = 0;
-  return 0;
-}
-int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) {
-  int32_t nCount = m_ParagPtrArray.GetSize();
-  CFDE_TxtEdtParag* pParag = NULL;
-  int32_t nLineCount = 0;
-  for (; m_nLayoutPos < nCount; m_nLayoutPos++) {
-    pParag = m_ParagPtrArray[m_nLayoutPos];
-    pParag->CalcLines();
-    nLineCount += pParag->m_nLineCount;
-    if ((pPause != NULL) && (nLineCount > m_nPageLineCount) &&
-        pPause->NeedToPauseNow()) {
-      m_nLineCount += nLineCount;
-      return (++m_nLayoutPos * 100) / nCount;
-    }
-  }
-  m_nLineCount += nLineCount;
-  return 100;
-}
-void CFDE_TxtEdtEngine::EndLayout() {
-  UpdatePages();
-  int32_t nLength = GetTextLength();
-  if (m_nCaret > nLength) {
-    m_nCaret = nLength;
-  }
-  int32_t nIndex = m_nCaret;
-  if (!m_bBefore) {
-    nIndex--;
-  }
-  m_rtCaret.Set(0, 0, 1, m_Param.fFontSize);
-  Unlock();
-}
-FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause* pPause) {
-  return m_pTxtBuf->Optimize(pPause);
-}
-IFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const {
-  return (IFDE_TxtEdtBuf*)m_pTxtBuf;
-}
-int32_t CFDE_TxtEdtEngine::GetTextBufLength() const {
-  return m_pTxtBuf->GetTextLength() - 1;
-}
-IFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const {
-  return m_pTextBreak;
-}
-int32_t CFDE_TxtEdtEngine::GetLineCount() const {
-  return m_nLineCount;
-}
-int32_t CFDE_TxtEdtEngine::GetPageLineCount() const {
-  return m_nPageLineCount;
-}
-int32_t CFDE_TxtEdtEngine::CountParags() const {
-  return m_ParagPtrArray.GetSize();
-}
-IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(int32_t nParagIndex) const {
-  return m_ParagPtrArray[nParagIndex];
-}
-IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() {
-  if (!m_pTxtBuf) {
-    return NULL;
-  }
-  return new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
-}
-int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag,
-                                      int32_t nStartLineofParag,
-                                      int32_t nLineIndex,
-                                      int32_t& nStartLine) const {
-  int32_t nLineTotal = nStartLineofParag;
-  int32_t nCount = m_ParagPtrArray.GetSize();
-  CFDE_TxtEdtParag* pParag = NULL;
-  int32_t i = nStartParag;
-  for (; i < nCount; i++) {
-    pParag = m_ParagPtrArray[i];
-    nLineTotal += pParag->m_nLineCount;
-    if (nLineTotal > nLineIndex) {
-      break;
-    }
-  }
-  nStartLine = nLineTotal - pParag->m_nLineCount;
-  return i;
-}
-void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString& wsText,
-                                         int32_t nIndex,
-                                         int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
-  wsText.Delete(nIndex, nLength);
-}
-void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString& wsText,
-                                         int32_t nIndex,
-                                         const FX_WCHAR* lpText,
-                                         int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
-  int32_t nSelIndex = 0;
-  int32_t nSelLength = 0;
-  int32_t nSelCount = CountSelRanges();
-  while (nSelCount--) {
-    nSelLength = GetSelRange(nSelCount, nSelIndex);
-    wsText.Delete(nSelIndex, nSelLength);
-    nIndex = nSelIndex;
-  }
-  CFX_WideString wsTemp;
-  int32_t nOldLength = wsText.GetLength();
-  const FX_WCHAR* pOldBuffer = wsText.c_str();
-  FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength);
-  FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR));
-  FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR));
-  FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex,
-               (nOldLength - nIndex) * sizeof(FX_WCHAR));
-  wsTemp.ReleaseBuffer(nOldLength + nLength);
-  wsText = wsTemp;
-}
-void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString& wsText,
-                                          int32_t nIndex,
-                                          int32_t nOriginLength,
-                                          const FX_WCHAR* lpText,
-                                          int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
-  int32_t nSelIndex = 0;
-  int32_t nSelLength = 0;
-  int32_t nSelCount = CountSelRanges();
-  while (nSelCount--) {
-    nSelLength = GetSelRange(nSelCount, nSelIndex);
-    wsText.Delete(nSelIndex, nSelLength);
-  }
-  wsText.Delete(nIndex, nOriginLength);
-  int32_t i = 0;
-  for (i = 0; i < nLength; i++) {
-    wsText.Insert(nIndex++, lpText[i]);
-  }
-}
-void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart,
-                                     const FX_WCHAR* lpText,
-                                     int32_t nLength) {
-  FXSYS_assert(nLength > 0);
-  FDE_TXTEDTPARAGPOS ParagPos;
-  TextPos2ParagPos(nStart, ParagPos);
-  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-  int32_t nParagCount = m_ParagPtrArray.GetSize();
-  int32_t i = 0;
-  for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) {
-    m_ParagPtrArray[i]->m_nCharStart += nLength;
-  }
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
-  int32_t nReserveLineCount = pParag->m_nLineCount;
-  int32_t nReserveCharStart = pParag->m_nCharStart;
-  int32_t nLeavePart = ParagPos.nCharIndex;
-  int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
-  int32_t nTextStart = 0;
-  FX_WCHAR wCurChar = L' ';
-  const FX_WCHAR* lpPos = lpText;
-  FX_BOOL bFirst = TRUE;
-  int32_t nParagIndex = ParagPos.nParagIndex;
-  for (i = 0; i < nLength; i++, lpPos++) {
-    wCurChar = *lpPos;
-    if (wCurChar == m_wLineEnd) {
-      if (bFirst) {
-        pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
-        pParag->m_nLineCount = -1;
-        nReserveCharStart += pParag->m_nCharCount;
-        bFirst = FALSE;
-      } else {
-        pParag = new CFDE_TxtEdtParag(this);
-        pParag->m_nLineCount = -1;
-        pParag->m_nCharCount = i - nTextStart + 1;
-        pParag->m_nCharStart = nReserveCharStart;
-        m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
-        nReserveCharStart += pParag->m_nCharCount;
-      }
-      nTextStart = i + 1;
-    }
-  }
-  if (bFirst) {
-    pParag->m_nCharCount += nLength;
-    pParag->m_nLineCount = -1;
-    bFirst = FALSE;
-  } else {
-    pParag = new CFDE_TxtEdtParag(this);
-    pParag->m_nLineCount = -1;
-    pParag->m_nCharCount = nLength - nTextStart + nCutPart;
-    pParag->m_nCharStart = nReserveCharStart;
-    m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
-  }
-  m_pTxtBuf->Insert(nStart, lpText, nLength);
-  int32_t nTotalLineCount = 0;
-  for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) {
-    pParag = m_ParagPtrArray[i];
-    pParag->CalcLines();
-    nTotalLineCount += pParag->m_nLineCount;
-  }
-  m_nLineCount += nTotalLineCount - nReserveLineCount;
-  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-  UpdatePages();
-}
-
-void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) {
-  if (nCount == -1) {
-    nCount = m_pTxtBuf->GetTextLength() - nStart;
-  }
-  int32_t nEnd = nStart + nCount - 1;
-  FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength());
-  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-  FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd;
-  TextPos2ParagPos(nStart, ParagPosBgn);
-  TextPos2ParagPos(nEnd, ParagPosEnd);
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex];
-  FX_BOOL bLastParag = FALSE;
-  if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) {
-    if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) {
-      ParagPosEnd.nParagIndex++;
-    } else {
-      bLastParag = TRUE;
-    }
-  }
-  int32_t nTotalLineCount = 0;
-  int32_t nTotalCharCount = 0;
-  int32_t i = 0;
-  for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
-    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
-    pParag->CalcLines();
-    nTotalLineCount += pParag->m_nLineCount;
-    nTotalCharCount += pParag->m_nCharCount;
-  }
-  m_pTxtBuf->Delete(nStart, nCount);
-  int32_t nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag)
-                                ? ParagPosBgn.nParagIndex
-                                : (ParagPosBgn.nParagIndex + 1);
-  for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
-    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nNextParagIndex];
-    delete pParag;
-    m_ParagPtrArray.RemoveAt(nNextParagIndex);
-  }
-  if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) {
-    pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex];
-    pParag->m_nCharCount = nTotalCharCount - nCount;
-    pParag->CalcLines();
-    nTotalLineCount -= pParag->m_nLineCount;
-  }
-  int32_t nParagCount = m_ParagPtrArray.GetSize();
-  for (i = nNextParagIndex; i < nParagCount; i++) {
-    m_ParagPtrArray[i]->m_nCharStart -= nCount;
-  }
-  m_nLineCount -= nTotalLineCount;
-  UpdatePages();
-  int32_t nPageCount = CountPages();
-  if (m_nCaretPage >= nPageCount) {
-    m_nCaretPage = nPageCount - 1;
-  }
-  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart,
-                                             int32_t nCount,
-                                             FX_BOOL bSel) {
-  FXSYS_assert(nStart >= 0);
-  if (nCount == -1) {
-    nCount = GetTextLength() - nStart;
-  }
-  FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength());
-
-  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
-    CFX_WideString wsRange;
-    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
-    IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_DeleteRange(
-        this, nStart, m_nCaret, wsRange, bSel);
-    CFX_ByteString bsDoRecord;
-    pRecord->Serialize(bsDoRecord);
-    m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
-    pRecord->Release();
-  }
-  m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
-  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
-  Inner_DeleteRange(nStart, nCount);
-}
-void CFDE_TxtEdtEngine::ResetEngine() {
-  RemoveAllPages();
-  RemoveAllParags();
-  ClearSelection();
-  m_nCaret = 0;
-  m_pTxtBuf->Clear(FALSE);
-  m_nCaret = 0;
-}
-void CFDE_TxtEdtEngine::RebuildParagraphs() {
-  RemoveAllParags();
-  FX_WCHAR wChar = L' ';
-  int32_t nParagStart = 0;
-  int32_t nIndex = 0;
-  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
-  pIter->SetAt(0);
-  do {
-    wChar = pIter->GetChar();
-    nIndex = pIter->GetAt();
-    if (wChar == m_wLineEnd) {
-      CFDE_TxtEdtParag* pParag = new CFDE_TxtEdtParag(this);
-      pParag->m_nCharStart = nParagStart;
-      pParag->m_nCharCount = nIndex - nParagStart + 1;
-      pParag->m_nLineCount = -1;
-      m_ParagPtrArray.Add(pParag);
-      nParagStart = nIndex + 1;
-    }
-  } while (pIter->Next());
-  pIter->Release();
-}
-void CFDE_TxtEdtEngine::RemoveAllParags() {
-  int32_t nCount = m_ParagPtrArray.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
-    if (pParag) {
-      delete pParag;
-    }
-  }
-  m_ParagPtrArray.RemoveAll();
-}
-void CFDE_TxtEdtEngine::RemoveAllPages() {
-  int32_t nCount = m_PagePtrArray.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    IFDE_TxtEdtPage* pPage = m_PagePtrArray[i];
-    if (pPage) {
-      pPage->Release();
-    }
-  }
-  m_PagePtrArray.RemoveAll();
-}
-void CFDE_TxtEdtEngine::UpdateParags() {
-  int32_t nCount = m_ParagPtrArray.GetSize();
-  if (nCount == 0) {
-    return;
-  }
-  CFDE_TxtEdtParag* pParag = NULL;
-  int32_t nLineCount = 0;
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    pParag = m_ParagPtrArray[i];
-    if (pParag->m_nLineCount == -1) {
-      pParag->CalcLines();
-    }
-    nLineCount += pParag->m_nLineCount;
-  }
-  m_nLineCount = nLineCount;
-}
-void CFDE_TxtEdtEngine::UpdatePages() {
-  if (m_nLineCount == 0) {
-    return;
-  }
-  int32_t nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1;
-  int32_t nSize = m_PagePtrArray.GetSize();
-  if (nSize == nPageCount) {
-    return;
-  }
-  if (nSize > nPageCount) {
-    IFDE_TxtEdtPage* pPage = NULL;
-    int32_t i = 0;
-    for (i = nSize - 1; i >= nPageCount; i--) {
-      pPage = m_PagePtrArray[i];
-      if (pPage) {
-        pPage->Release();
-      }
-      m_PagePtrArray.RemoveAt(i);
-    }
-    m_Param.pEventSink->On_PageCountChanged(this);
-    return;
-  }
-  if (nSize < nPageCount) {
-    IFDE_TxtEdtPage* pPage = NULL;
-    int32_t i = 0;
-    for (i = nSize; i < nPageCount; i++) {
-      pPage = IFDE_TxtEdtPage::Create(this, i);
-      m_PagePtrArray.Add(pPage);
-    }
-    m_Param.pEventSink->On_PageCountChanged(this);
-    return;
-  }
-}
-void CFDE_TxtEdtEngine::UpdateTxtBreak() {
-  FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles();
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine;
-  } else {
-    dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_CombText;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_ExpandTab;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext;
-  }
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) {
-    dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes;
-  } else {
-    dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes;
-  }
-  m_pTextBreak->SetLayoutStyles(dwStyle);
-  FX_DWORD dwAligment = 0;
-  if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) {
-    dwAligment |= FX_TXTLINEALIGNMENT_Justified;
-  } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) {
-    dwAligment |= FX_TXTLINEALIGNMENT_Distributed;
-  }
-  if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) {
-    dwAligment |= FX_TXTLINEALIGNMENT_Center;
-  } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) {
-    dwAligment |= FX_TXTLINEALIGNMENT_Right;
-  }
-  m_pTextBreak->SetAlignment(dwAligment);
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-    if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
-      m_pTextBreak->SetLineWidth(m_Param.fPlateHeight);
-    } else {
-      m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
-    }
-  } else {
-    if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
-      m_pTextBreak->SetLineWidth(m_Param.fPlateWidth);
-    } else {
-      m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
-    }
-  }
-  m_nPageLineCount = m_Param.nLineCount;
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
-    FX_FLOAT fCombWidth =
-        m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical
-            ? m_Param.fPlateHeight
-            : m_Param.fPlateWidth;
-    if (m_nLimit > 0) {
-      fCombWidth /= m_nLimit;
-    }
-    m_pTextBreak->SetCombWidth(fCombWidth);
-  }
-  m_pTextBreak->SetFont(m_Param.pFont);
-  m_pTextBreak->SetFontSize(m_Param.fFontSize);
-  m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant);
-  m_pTextBreak->SetDefaultChar(m_Param.wDefChar);
-  m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar);
-  m_pTextBreak->SetCharRotation(m_Param.nCharRotation);
-  m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f);
-  m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale);
-  m_pTextBreak->SetCharSpace(m_Param.fCharSpace);
-}
-FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_WCHAR*& lpText,
-                                           int32_t& nLength,
-                                           FX_BOOL bPreIsCR) {
-  for (int32_t i = 0; i < nLength; i++) {
-    FX_WCHAR wc = lpText[i];
-    switch (wc) {
-      case L'\r': {
-        lpText[i] = m_wLineEnd;
-        bPreIsCR = TRUE;
-      } break;
-      case L'\n': {
-        if (bPreIsCR == TRUE) {
-          int32_t nNext = i + 1;
-          if (nNext < nLength) {
-            FXSYS_memmove(lpText + i, lpText + nNext,
-                          (nLength - nNext) * sizeof(FX_WCHAR));
-          }
-          i--;
-          nLength--;
-          bPreIsCR = FALSE;
-          if (m_bAutoLineEnd) {
-            m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF;
-            m_bAutoLineEnd = FALSE;
-          }
-        } else {
-          lpText[i] = m_wLineEnd;
-          if (m_bAutoLineEnd) {
-            m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF;
-            m_bAutoLineEnd = FALSE;
-          }
-        }
-      } break;
-      default: {
-        if (bPreIsCR && m_bAutoLineEnd) {
-          m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR;
-          m_bAutoLineEnd = FALSE;
-        }
-        bPreIsCR = FALSE;
-      } break;
-    }
-  }
-  return bPreIsCR;
-}
-void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString& wsText) {
-  FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r';
-  if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) {
-    CFX_ArrayTemplate<int32_t> PosArr;
-    int32_t nLength = wsText.GetLength();
-    int32_t i = 0;
-    FX_WCHAR* lpPos = (FX_WCHAR*)(const FX_WCHAR*)wsText;
-    for (i = 0; i < nLength; i++, lpPos++) {
-      if (*lpPos == m_wLineEnd) {
-        *lpPos = wc;
-        PosArr.Add(i);
-      }
-    }
-    const FX_WCHAR* lpSrcBuf = wsText.c_str();
-    CFX_WideString wsTemp;
-    int32_t nCount = PosArr.GetSize();
-    FX_WCHAR* lpDstBuf = wsTemp.GetBuffer(nLength + nCount);
-    int32_t nDstPos = 0;
-    int32_t nSrcPos = 0;
-    for (i = 0; i < nCount; i++) {
-      int32_t nPos = PosArr[i];
-      int32_t nCopyLen = nPos - nSrcPos + 1;
-      FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
-                   nCopyLen * sizeof(FX_WCHAR));
-      nDstPos += nCopyLen;
-      nSrcPos += nCopyLen;
-      lpDstBuf[nDstPos] = L'\n';
-      nDstPos++;
-    }
-    if (nSrcPos < nLength) {
-      FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
-                   (nLength - nSrcPos) * sizeof(FX_WCHAR));
-    }
-    wsTemp.ReleaseBuffer(nLength + nCount);
-    wsText = wsTemp;
-  } else {
-    int32_t nLength = wsText.GetLength();
-    FX_WCHAR* lpBuf = (FX_WCHAR*)(const FX_WCHAR*)wsText;
-    for (int32_t i = 0; i < nLength; i++, lpBuf++) {
-      if (*lpBuf == m_wLineEnd) {
-        *lpBuf = wc;
-      }
-    }
-  }
-}
-int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) {
-  FXSYS_assert(nIndex >= 0);
-  FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength());
-  if (m_nCaretPage >= 0) {
-    IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
-    m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-    int32_t nPageCharStart = pPage->GetCharStart();
-    int32_t nPageCharCount = pPage->GetCharCount();
-    if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) {
-      m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-      return m_nCaretPage;
-    }
-    m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-  }
-  CFDE_TxtEdtParag* pParag = NULL;
-  int32_t nLineCount = 0;
-  int32_t nParagCount = m_ParagPtrArray.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < nParagCount; i++) {
-    pParag = m_ParagPtrArray[i];
-    if (pParag->m_nCharStart <= nIndex &&
-        nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) {
-      break;
-    }
-    nLineCount += pParag->m_nLineCount;
-  }
-  pParag->LoadParag();
-  int32_t nLineStart = -1;
-  int32_t nLineCharCount = -1;
-  for (i = 0; i < pParag->m_nLineCount; i++) {
-    pParag->GetLineRange(i, nLineStart, nLineCharCount);
-    if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) {
-      break;
-    }
-  }
-  FXSYS_assert(i < pParag->m_nLineCount);
-  nLineCount += (i + 1);
-  m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1;
-  m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
-  pParag->UnloadParag();
-  return m_nCaretPage;
-}
-void CFDE_TxtEdtEngine::TextPos2ParagPos(int32_t nIndex,
-                                         FDE_TXTEDTPARAGPOS& ParagPos) const {
-  FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength());
-  int32_t nCount = m_ParagPtrArray.GetSize();
-  int32_t nBgn = 0;
-  int32_t nMid = 0;
-  int32_t nEnd = nCount - 1;
-  while (nEnd > nBgn) {
-    nMid = (nBgn + nEnd) / 2;
-    CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nMid];
-    if (nIndex < pParag->m_nCharStart) {
-      nEnd = nMid - 1;
-    } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) {
-      nBgn = nMid + 1;
-    } else {
-      break;
-    }
-  }
-  if (nBgn == nEnd) {
-    nMid = nBgn;
-  }
-  FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart &&
-               (nIndex < m_ParagPtrArray[nMid]->m_nCharStart +
-                             m_ParagPtrArray[nMid]->m_nCharCount));
-  ParagPos.nParagIndex = nMid;
-  ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart;
-}
-int32_t CFDE_TxtEdtEngine::MoveForward(FX_BOOL& bBefore) {
-  if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) {
-    return -1;
-  }
-  int32_t nCaret = m_nCaret;
-  if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) &&
-      (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') &&
-      (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) {
-    nCaret++;
-  }
-  nCaret++;
-  bBefore = TRUE;
-  return nCaret;
-}
-int32_t CFDE_TxtEdtEngine::MoveBackward(FX_BOOL& bBefore) {
-  if (m_nCaret == 0) {
-    return FALSE;
-  }
-  int32_t nCaret = m_nCaret;
-  if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' &&
-      m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') {
-    nCaret--;
-  }
-  nCaret--;
-  bBefore = TRUE;
-  return nCaret;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF& ptCaret) {
-  IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
-  const CFX_RectF& rtContent = pPage->GetContentsBox();
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-    ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace;
-    ptCaret.y = m_fCaretPosReserve;
-    FX_BOOL bLineReserve =
-        m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
-    if (ptCaret.x < rtContent.left) {
-      if (bLineReserve) {
-        if (m_nCaretPage == CountPages() - 1) {
-          return FALSE;
-        }
-      } else {
-        if (m_nCaretPage == 0) {
-          return FALSE;
-        }
-      }
-      if (bLineReserve) {
-        m_nCaretPage++;
-      } else {
-        m_nCaretPage--;
-      }
-      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
-      ptCaret.x -= rtContent.left;
-      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
-      ptCaret.x += pCurPage->GetContentsBox().right();
-    }
-  } else {
-    ptCaret.x = m_fCaretPosReserve;
-    ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace;
-    if (ptCaret.y < rtContent.top) {
-      if (m_nCaretPage == 0) {
-        return FALSE;
-      }
-      ptCaret.y -= rtContent.top;
-      m_nCaretPage--;
-      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
-      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
-      ptCaret.y += pCurPage->GetContentsBox().bottom();
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF& ptCaret) {
-  IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
-  const CFX_RectF& rtContent = pPage->GetContentsBox();
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-    ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace;
-    ptCaret.y = m_fCaretPosReserve;
-    if (ptCaret.x >= rtContent.right()) {
-      FX_BOOL bLineReserve =
-          m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
-      if (bLineReserve) {
-        if (m_nCaretPage == 0) {
-          return FALSE;
-        }
-      } else {
-        if (m_nCaretPage == CountPages() - 1) {
-          return FALSE;
-        }
-      }
-      if (bLineReserve) {
-        m_nCaretPage--;
-      } else {
-        m_nCaretPage++;
-      }
-      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
-      ptCaret.x -= rtContent.right();
-      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
-      ptCaret.x += pCurPage->GetContentsBox().left;
-    }
-  } else {
-    ptCaret.x = m_fCaretPosReserve;
-    ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace;
-    if (ptCaret.y >= rtContent.bottom()) {
-      if (m_nCaretPage == CountPages() - 1) {
-        return FALSE;
-      }
-      ptCaret.y -= rtContent.bottom();
-      m_nCaretPage++;
-      m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
-      IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
-      ptCaret.y += pCurPage->GetContentsBox().top;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveLineStart() {
-  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
-  FDE_TXTEDTPARAGPOS ParagPos;
-  TextPos2ParagPos(nIndex, ParagPos);
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
-  pParag->LoadParag();
-  int32_t nLineCount = pParag->m_nLineCount;
-  int32_t i = 0;
-  int32_t nStart = 0;
-  int32_t nCount = 0;
-  for (; i < nLineCount; i++) {
-    pParag->GetLineRange(i, nStart, nCount);
-    if (nIndex >= nStart && nIndex < nStart + nCount) {
-      break;
-    }
-  }
-  UpdateCaretRect(nStart, TRUE);
-  pParag->UnloadParag();
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd() {
-  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
-  FDE_TXTEDTPARAGPOS ParagPos;
-  TextPos2ParagPos(nIndex, ParagPos);
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
-  pParag->LoadParag();
-  int32_t nLineCount = pParag->m_nLineCount;
-  int32_t i = 0;
-  int32_t nStart = 0;
-  int32_t nCount = 0;
-  for (; i < nLineCount; i++) {
-    pParag->GetLineRange(i, nStart, nCount);
-    if (nIndex >= nStart && nIndex < nStart + nCount) {
-      break;
-    }
-  }
-  nIndex = nStart + nCount - 1;
-  FXSYS_assert(nIndex <= GetTextBufLength());
-  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
-  FX_BOOL bBefore = FALSE;
-  if (nIndex <= GetTextBufLength()) {
-    if (wChar == L'\r') {
-      bBefore = TRUE;
-    } else if (wChar == L'\n' && nIndex > nStart) {
-      bBefore = TRUE;
-      nIndex--;
-      wChar = m_pTxtBuf->GetCharByIndex(nIndex);
-      if (wChar != L'\r') {
-        nIndex++;
-      }
-    }
-  }
-  UpdateCaretRect(nIndex, bBefore);
-  pParag->UnloadParag();
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveParagStart() {
-  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
-  FDE_TXTEDTPARAGPOS ParagPos;
-  TextPos2ParagPos(nIndex, ParagPos);
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
-  UpdateCaretRect(pParag->m_nCharStart, TRUE);
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd() {
-  int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
-  FDE_TXTEDTPARAGPOS ParagPos;
-  TextPos2ParagPos(nIndex, ParagPos);
-  CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
-  nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1;
-  FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
-  if (wChar == L'\n' && nIndex > 0) {
-    nIndex--;
-    wChar = m_pTxtBuf->GetCharByIndex(nIndex);
-    if (wChar != L'\r') {
-      nIndex++;
-    }
-  }
-  UpdateCaretRect(nIndex, TRUE);
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveHome() {
-  UpdateCaretRect(0, TRUE);
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveEnd() {
-  UpdateCaretRect(GetTextBufLength(), TRUE);
-  return TRUE;
-}
-
-FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
-  IFDE_TextOut* pTextOut = IFDE_TextOut::Create();
-  pTextOut->SetLineSpace(m_Param.fLineSpace);
-  pTextOut->SetFont(m_Param.pFont);
-  pTextOut->SetFontSize(m_Param.fFontSize);
-  CFX_RectF rcText;
-  FXSYS_memset(&rcText, 0, sizeof(rcText));
-  FX_DWORD dwStyle = 0;
-  if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) {
-    dwStyle |= FDE_TTOSTYLE_SingleLine;
-  }
-  if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
-    dwStyle |= FDE_TTOSTYLE_LineWrap;
-    rcText.width = m_Param.fPlateWidth;
-  } else {
-    rcText.width = 65535;
-  }
-  pTextOut->SetStyles(dwStyle);
-  wsText += L"\n";
-  pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText);
-  pTextOut->Release();
-  wsText.Delete(wsText.GetLength() - 1);
-  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) &&
-      (rcText.width > m_Param.fPlateWidth)) {
-    return FALSE;
-  }
-  if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) &&
-      (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) {
-    return FALSE;
-  }
-  return TRUE;
-}
-void CFDE_TxtEdtEngine::UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore) {
-  MovePage2Char(nIndex);
-  GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore);
-  m_nCaret = nIndex;
-  m_bBefore = bBefore;
-  if (!m_bBefore) {
-    m_nCaret++;
-    m_bBefore = TRUE;
-  }
-  m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
-                           ? m_rtCaret.top
-                           : m_rtCaret.left;
-  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret,
-                                     int32_t nPageIndex,
-                                     int32_t nCaret,
-                                     FX_BOOL bBefore) {
-  IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
-  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-  FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText;
-  int32_t nIndexInpage = nCaret - pPage->GetCharStart();
-  if (bBefore && bCombText && nIndexInpage > 0) {
-    nIndexInpage--;
-    bBefore = FALSE;
-  }
-  int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText);
-  if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-    if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
-        (FX_IsOdd(nBIDILevel) && bBefore)) {
-      rtCaret.Offset(0, rtCaret.height - 1.0f);
-    }
-    if (rtCaret.height == 0 && rtCaret.top > 1.0f) {
-      rtCaret.top -= 1.0f;
-    }
-    rtCaret.height = 1.0f;
-  } else {
-    if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
-        (FX_IsOdd(nBIDILevel) && bBefore)) {
-      rtCaret.Offset(rtCaret.width - 1.0f, 0);
-    }
-    if (rtCaret.width == 0 && rtCaret.left > 1.0f) {
-      rtCaret.left -= 1.0f;
-    }
-    rtCaret.width = 1.0f;
-  }
-  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) {
-  IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
-  m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-  m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore);
-  GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
-  if (!m_bBefore) {
-    m_nCaret++;
-    m_bBefore = TRUE;
-  }
-  m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage);
-  m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-}
-FX_BOOL CFDE_TxtEdtEngine::IsSelect() {
-  return m_SelRangePtrArr.GetSize() > 0;
-}
-void CFDE_TxtEdtEngine::DeleteSelect() {
-  int32_t nCountRange = CountSelRanges();
-  if (nCountRange > 0) {
-    int32_t nSelStart;
-    int32_t nSelCount;
-    while (nCountRange > 0) {
-      nSelCount = GetSelRange(--nCountRange, nSelStart);
-      FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange];
-      delete lpTemp;
-      m_SelRangePtrArr.RemoveAt(nCountRange);
-      DeleteRange_DoRecord(nSelStart, nSelCount, TRUE);
-    }
-    ClearSelection();
-    m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
-    m_Param.pEventSink->On_SelChanged(this);
-    SetCaretPos(nSelStart, TRUE);
-    return;
-  }
-}
-IFDE_TxtEdtDoRecord* IFDE_TxtEdtDoRecord::Create(
-    const CFX_ByteStringC& bsDoRecord) {
-  const FX_CHAR* lpBuf = bsDoRecord.GetCStr();
-  int32_t nType = *((int32_t*)lpBuf);
-  switch (nType) {
-    case FDE_TXTEDT_DORECORD_INS:
-      return new CFDE_TxtEdtDoRecord_Insert(bsDoRecord);
-    case FDE_TXTEDT_DORECORD_DEL:
-      return new CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord);
-    default:
-      break;
-  }
-  return NULL;
-}
-CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
-    const CFX_ByteStringC& bsDoRecord) {
-  Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
-    CFDE_TxtEdtEngine* pEngine,
-    int32_t nCaret,
-    const FX_WCHAR* lpText,
-    int32_t nLength)
-    : m_pEngine(pEngine), m_nCaret(nCaret) {
-  FXSYS_assert(pEngine);
-  FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength);
-  FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
-  m_wsInsert.ReleaseBuffer();
-}
-CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {}
-void CFDE_TxtEdtDoRecord_Insert::Release() {
-  delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() {
-  if (m_pEngine->IsSelect()) {
-    m_pEngine->ClearSelection();
-  }
-  m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength());
-  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
-  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
-  m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
-  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
-  m_pEngine->SetCaretPos(m_nCaret, TRUE);
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() {
-  m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength());
-  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
-  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
-  m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
-  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
-  m_pEngine->SetCaretPos(m_nCaret, FALSE);
-  return TRUE;
-}
-void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString& bsDoRecord) const {
-  CFX_ArchiveSaver ArchiveSaver;
-  ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_INS);
-  ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
-  ArchiveSaver << m_nCaret;
-  ArchiveSaver << m_wsInsert;
-  int32_t nLength = ArchiveSaver.GetLength();
-  const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
-  FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
-  FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
-  bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_Insert::Deserialize(
-    const CFX_ByteStringC& bsDoRecord) {
-  CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
-                                  bsDoRecord.GetLength());
-  int32_t nType = 0;
-  ArchiveLoader >> nType;
-  FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS);
-  int32_t nEngine = 0;
-  ArchiveLoader >> nEngine;
-  m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
-  ArchiveLoader >> m_nCaret;
-  ArchiveLoader >> m_wsInsert;
-}
-CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
-    const CFX_ByteStringC& bsDoRecord) {
-  Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
-    CFDE_TxtEdtEngine* pEngine,
-    int32_t nIndex,
-    int32_t nCaret,
-    const CFX_WideString& wsRange,
-    FX_BOOL bSel)
-    : m_pEngine(pEngine),
-      m_bSel(bSel),
-      m_nIndex(nIndex),
-      m_nCaret(nCaret),
-      m_wsRange(wsRange) {
-  FXSYS_assert(pEngine);
-}
-CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {}
-void CFDE_TxtEdtDoRecord_DeleteRange::Release() {
-  delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() {
-  if (m_pEngine->IsSelect()) {
-    m_pEngine->ClearSelection();
-  }
-  m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength());
-  if (m_bSel) {
-    m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength());
-  }
-  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
-  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
-  m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
-  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
-  m_pEngine->SetCaretPos(m_nCaret, TRUE);
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() {
-  m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength());
-  if (m_bSel) {
-    m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength());
-  }
-  FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
-  m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
-  m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
-  Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
-  m_pEngine->SetCaretPos(m_nIndex, TRUE);
-  return TRUE;
-}
-void CFDE_TxtEdtDoRecord_DeleteRange::Serialize(
-    CFX_ByteString& bsDoRecord) const {
-  CFX_ArchiveSaver ArchiveSaver;
-  ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_DEL);
-  ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
-  ArchiveSaver << (int32_t)m_bSel;
-  ArchiveSaver << m_nIndex;
-  ArchiveSaver << m_nCaret;
-  ArchiveSaver << m_wsRange;
-  int32_t nLength = ArchiveSaver.GetLength();
-  const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
-  FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
-  FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
-  bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize(
-    const CFX_ByteStringC& bsDoRecord) {
-  CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
-                                  bsDoRecord.GetLength());
-  int32_t nType = 0;
-  ArchiveLoader >> nType;
-  FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL);
-  int32_t nEngine = 0;
-  ArchiveLoader >> nEngine;
-  m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
-  int32_t iSel = 0;
-  ArchiveLoader >> iSel;
-  m_bSel = !!iSel;
-  ArchiveLoader >> m_nIndex;
-  ArchiveLoader >> m_nCaret;
-  ArchiveLoader >> m_wsRange;
-}
diff --git a/xfa/src/fee/fde_txtedtengine.h b/xfa/src/fee/fde_txtedtengine.h
deleted file mode 100644
index ef1270f..0000000
--- a/xfa/src/fee/fde_txtedtengine.h
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FDE_TXTEDTENGINE_H_
-#define XFA_SRC_FEE_FDE_TXTEDTENGINE_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-
-class IFX_TxtBreak;
-class IFX_CharIter;
-class CFDE_TxtEdtParag;
-class CFDE_TxtEdtDoRecord_Insert;
-class CFDE_TxtEdtDoRecord_DeleteRange;
-
-class IFDE_TxtEdtDoRecord {
- public:
-  static IFDE_TxtEdtDoRecord* Create(const CFX_ByteStringC& bsDoRecord);
-  virtual ~IFDE_TxtEdtDoRecord() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL Redo() = 0;
-  virtual FX_BOOL Undo() = 0;
-  virtual void Serialize(CFX_ByteString& bsDoRecord) const = 0;
-};
-
-class CFDE_TxtEdtEngine : public IFDE_TxtEdtEngine {
-  friend class CFDE_TxtEdtDoRecord_Insert;
-  friend class CFDE_TxtEdtDoRecord_DeleteRange;
-  friend class CFDE_TxtEdtPage;
-  struct _FDE_TXTEDTSELRANGE {
-    int32_t nStart;
-    int32_t nCount;
-  };
-  typedef _FDE_TXTEDTSELRANGE FDE_TXTEDTSELRANGE;
-  typedef _FDE_TXTEDTSELRANGE* FDE_LPTXTEDTSELRANGE;
-  struct _FDE_TXTEDTPARAGPOS {
-    int32_t nParagIndex;
-    int32_t nCharIndex;
-  };
-  typedef _FDE_TXTEDTPARAGPOS FDE_TXTEDTPARAGPOS;
-  typedef _FDE_TXTEDTPARAGPOS* FDE_LPTXTEDTPARAGPOS;
-
- public:
-  CFDE_TxtEdtEngine();
-  virtual void Release();
-
-  virtual void SetEditParams(const FDE_TXTEDTPARAMS& params);
-  virtual const FDE_TXTEDTPARAMS* GetEditParams() const;
-
-  virtual int32_t CountPages() const;
-  virtual IFDE_TxtEdtPage* GetPage(int32_t nIndex);
-
-  virtual FX_BOOL SetBufChunkSize(int32_t nChunkSize);
-  virtual void SetTextByStream(IFX_Stream* pStream);
-  virtual void SetText(const CFX_WideString& wsText);
-  virtual int32_t GetTextLength() const;
-  virtual void GetText(CFX_WideString& wsText,
-                       int32_t nStart,
-                       int32_t nCount = -1);
-  virtual void ClearText();
-
-  virtual int32_t GetCaretRect(CFX_RectF& rtCaret) const;
-  virtual int32_t GetCaretPos() const;
-  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore);
-  virtual int32_t MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
-                               FX_BOOL bShift = FALSE,
-                               FX_BOOL bCtrl = FALSE);
-  virtual void Lock();
-  virtual void Unlock();
-  virtual FX_BOOL IsLocked() const;
-
-  virtual int32_t Insert(int32_t nStart,
-                         const FX_WCHAR* lpText,
-                         int32_t nLength);
-  virtual int32_t Delete(int32_t nStart, FX_BOOL bBackspace = FALSE);
-  virtual int32_t DeleteRange(int32_t nStart, int32_t nCount = -1);
-  virtual int32_t Replace(int32_t nStart,
-                          int32_t nLength,
-                          const CFX_WideString& wsReplace);
-
-  virtual void SetLimit(int32_t nLimit);
-  virtual void SetAliasChar(FX_WCHAR wcAlias);
-
-  void RemoveSelRange(int32_t nStart, int32_t nCount = -1);
-
-  virtual void AddSelRange(int32_t nStart, int32_t nCount = -1);
-  virtual int32_t CountSelRanges();
-  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
-  virtual void ClearSelection();
-
-  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRedo);
-  virtual FX_BOOL Undo(const CFX_ByteStringC& bsUndo);
-
-  virtual int32_t StartLayout();
-  virtual int32_t DoLayout(IFX_Pause* pPause);
-  virtual void EndLayout();
-
-  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);
-  virtual int32_t CountParags() const;
-  virtual IFDE_TxtEdtParag* GetParag(int32_t nParagIndex) const;
-  virtual IFX_CharIter* CreateCharIter();
-  IFDE_TxtEdtBuf* GetTextBuf() const;
-  int32_t GetTextBufLength() const;
-  IFX_TxtBreak* GetTextBreak() const;
-  int32_t GetLineCount() const;
-  int32_t GetPageLineCount() const;
-
-  int32_t Line2Parag(int32_t nStartParag,
-                     int32_t nStartLineofParag,
-                     int32_t nLineIndex,
-                     int32_t& nStartLine) const;
-  FX_WCHAR GetAliasChar() const { return m_wcAliasChar; }
-
- protected:
-  virtual ~CFDE_TxtEdtEngine();
-
- private:
-  void Inner_Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);
-  void GetPreDeleteText(CFX_WideString& wsText,
-                        int32_t nIndex,
-                        int32_t nLength);
-  void GetPreInsertText(CFX_WideString& wsText,
-                        int32_t nIndex,
-                        const FX_WCHAR* lpText,
-                        int32_t nLength);
-  void GetPreReplaceText(CFX_WideString& wsText,
-                         int32_t nIndex,
-                         int32_t nOriginLength,
-                         const FX_WCHAR* lpText,
-                         int32_t nLength);
-
-  void Inner_DeleteRange(int32_t nStart, int32_t nCount = -1);
-  void DeleteRange_DoRecord(int32_t nStart,
-                            int32_t nCount,
-                            FX_BOOL bSel = FALSE);
-  void ResetEngine();
-  void RebuildParagraphs();
-  void RemoveAllParags();
-  void RemoveAllPages();
-  void UpdateParags();
-  void UpdatePages();
-  void UpdateTxtBreak();
-
-  FX_BOOL ReplaceParagEnd(FX_WCHAR*& lpText,
-                          int32_t& nLength,
-                          FX_BOOL bPreIsCR = FALSE);
-  void RecoverParagEnd(CFX_WideString& wsText);
-  int32_t MovePage2Char(int32_t nIndex);
-  void TextPos2ParagPos(int32_t nIndex, FDE_TXTEDTPARAGPOS& ParagPos) const;
-  int32_t MoveForward(FX_BOOL& bBefore);
-  int32_t MoveBackward(FX_BOOL& bBefore);
-  FX_BOOL MoveUp(CFX_PointF& ptCaret);
-  FX_BOOL MoveDown(CFX_PointF& ptCaret);
-  FX_BOOL MoveLineStart();
-  FX_BOOL MoveLineEnd();
-  FX_BOOL MoveParagStart();
-  FX_BOOL MoveParagEnd();
-  FX_BOOL MoveHome();
-  FX_BOOL MoveEnd();
-  FX_BOOL IsFitArea(CFX_WideString& wsText);
-  void UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore = TRUE);
-  void GetCaretRect(CFX_RectF& rtCaret,
-                    int32_t nPageIndex,
-                    int32_t nCaret,
-                    FX_BOOL bBefore = TRUE);
-  void UpdateCaretIndex(const CFX_PointF& ptCaret);
-
-  FX_BOOL IsSelect();
-  void DeleteSelect();
-
-  IFDE_TxtEdtBuf* m_pTxtBuf;
-  IFX_TxtBreak* m_pTextBreak;
-  FDE_TXTEDTPARAMS m_Param;
-  CFX_ArrayTemplate<IFDE_TxtEdtPage*> m_PagePtrArray;
-  CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray;
-  CFX_ArrayTemplate<FDE_LPTXTEDTSELRANGE> m_SelRangePtrArr;
-  int32_t m_nPageLineCount;
-  int32_t m_nLineCount;
-  int32_t m_nAnchorPos;
-  int32_t m_nLayoutPos;
-  FX_FLOAT m_fCaretPosReserve;
-  int32_t m_nCaret;
-  FX_BOOL m_bBefore;
-  int32_t m_nCaretPage;
-  CFX_RectF m_rtCaret;
-  FX_DWORD m_dwFindFlags;
-  FX_BOOL m_bLock;
-  int32_t m_nLimit;
-  FX_WCHAR m_wcAliasChar;
-  int32_t m_nFirstLineEnd;
-  FX_BOOL m_bAutoLineEnd;
-  FX_WCHAR m_wLineEnd;
-  FDE_TXTEDT_TEXTCHANGE_INFO m_ChangeInfo;
-};
-
-class CFDE_TxtEdtDoRecord_Insert : public IFDE_TxtEdtDoRecord {
- public:
-  CFDE_TxtEdtDoRecord_Insert(const CFX_ByteStringC& bsDoRecord);
-  CFDE_TxtEdtDoRecord_Insert(CFDE_TxtEdtEngine* pEngine,
-                             int32_t nCaret,
-                             const FX_WCHAR* lpText,
-                             int32_t nLength);
-  virtual void Release();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-  virtual void Serialize(CFX_ByteString& bsDoRecord) const;
-
- protected:
-  ~CFDE_TxtEdtDoRecord_Insert();
-  void Deserialize(const CFX_ByteStringC& bsDoRecord);
-
- private:
-  CFDE_TxtEdtEngine* m_pEngine;
-  int32_t m_nCaret;
-  CFX_WideString m_wsInsert;
-};
-
-class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord {
- public:
-  CFDE_TxtEdtDoRecord_DeleteRange(const CFX_ByteStringC& bsDoRecord);
-  CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine* pEngine,
-                                  int32_t nIndex,
-                                  int32_t nCaret,
-                                  const CFX_WideString& wsRange,
-                                  FX_BOOL bSel = FALSE);
-  virtual void Release();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-  virtual void Serialize(CFX_ByteString& bsDoRecord) const;
-
- protected:
-  ~CFDE_TxtEdtDoRecord_DeleteRange();
-  void Deserialize(const CFX_ByteStringC& bsDoRecord);
-
- private:
-  CFDE_TxtEdtEngine* m_pEngine;
-  FX_BOOL m_bSel;
-  int32_t m_nIndex;
-  int32_t m_nCaret;
-  CFX_WideString m_wsRange;
-};
-
-#endif  // XFA_SRC_FEE_FDE_TXTEDTENGINE_H_
diff --git a/xfa/src/fee/fde_txtedtpage.cpp b/xfa/src/fee/fde_txtedtpage.cpp
deleted file mode 100644
index 932832f..0000000
--- a/xfa/src/fee/fde_txtedtpage.cpp
+++ /dev/null
@@ -1,650 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fde_txtedtpage.h"
-
-#include <algorithm>
-
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak.h"
-#include "xfa/src/fee/fde_txtedtbuf.h"
-#include "xfa/src/fee/fde_txtedtengine.h"
-#include "xfa/src/fee/fde_txtedtparag.h"
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-#include "xfa/src/fee/ifde_txtedtpage.h"
-
-#define FDE_TXTEDT_TOLERANCE 0.1f
-
-IFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(IFDE_TxtEdtEngine* pEngine,
-                                         int32_t nIndex) {
-  return (IFDE_TxtEdtPage*)new CFDE_TxtEdtPage(pEngine, nIndex);
-}
-CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage)
-    : m_pPage(pPage) {}
-CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {}
-FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
-  return FDE_VISUALOBJ_Text;
-}
-FX_BOOL CFDE_TxtEdtTextSet::GetBBox(FDE_HVISUALOBJ hVisualObj,
-                                    CFX_RectF& bbox) {
-  return FALSE;
-}
-FX_BOOL CFDE_TxtEdtTextSet::GetMatrix(FDE_HVISUALOBJ hVisualObj,
-                                      CFX_Matrix& matrix) {
-  return FALSE;
-}
-FX_BOOL CFDE_TxtEdtTextSet::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
-  rt = ((FDE_TEXTEDITPIECE*)(hVisualObj))->rtPiece;
-  return TRUE;
-}
-FX_BOOL CFDE_TxtEdtTextSet::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
-  return FALSE;
-}
-int32_t CFDE_TxtEdtTextSet::GetString(FDE_HVISUALOBJ hText,
-                                      CFX_WideString& wsText) {
-  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
-  FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount);
-  for (int32_t i = 0; i < pPiece->nCount; i++) {
-    pBuffer[i] = m_pPage->GetChar((void*)hText, i);
-  }
-  wsText.ReleaseBuffer(pPiece->nCount);
-  return pPiece->nCount;
-}
-IFX_Font* CFDE_TxtEdtTextSet::GetFont(FDE_HVISUALOBJ hText) {
-  return m_pPage->GetEngine()->GetEditParams()->pFont;
-}
-FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize(FDE_HVISUALOBJ hText) {
-  return m_pPage->GetEngine()->GetEditParams()->fFontSize;
-}
-FX_ARGB CFDE_TxtEdtTextSet::GetFontColor(FDE_HVISUALOBJ hText) {
-  return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
-}
-int32_t CFDE_TxtEdtTextSet::GetDisplayPos(FDE_HVISUALOBJ hText,
-                                          FXTEXT_CHARPOS* pCharPos,
-                                          FX_BOOL bCharCode,
-                                          CFX_WideString* pWSForms) {
-  if (hText == NULL) {
-    return 0;
-  }
-  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
-  int32_t nLength = pPiece->nCount;
-  if (nLength < 1) {
-    return 0;
-  }
-  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
-  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
-  IFX_TxtBreak* pBreak = pEngine->GetTextBreak();
-  FX_DWORD dwLayoutStyle = pBreak->GetLayoutStyles();
-  FX_TXTRUN tr;
-  tr.pAccess = m_pPage;
-  tr.pIdentity = (void*)hText;
-  tr.pStr = NULL;
-  tr.pWidths = NULL;
-  tr.iLength = nLength;
-  tr.pFont = pTextParams->pFont;
-  tr.fFontSize = pTextParams->fFontSize;
-  tr.dwStyles = dwLayoutStyle;
-  tr.iCharRotation = pTextParams->nCharRotation;
-  tr.dwCharStyles = pPiece->dwCharStyles;
-  tr.pRect = &(pPiece->rtPiece);
-  tr.wLineBreakChar = pTextParams->wLineBreakChar;
-  return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
-}
-int32_t CFDE_TxtEdtTextSet::GetCharRects(FDE_HVISUALOBJ hText,
-                                         CFX_RectFArray& rtArray) {
-  return GetCharRects_Impl(hText, rtArray);
-}
-int32_t CFDE_TxtEdtTextSet::GetCharRects_Impl(FDE_HVISUALOBJ hText,
-                                              CFX_RectFArray& rtArray,
-                                              FX_BOOL bBBox) {
-  if (hText == NULL) {
-    return 0;
-  }
-  FDE_TEXTEDITPIECE* pPiece = (FDE_TEXTEDITPIECE*)hText;
-  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
-  int32_t nLength = pPiece->nCount;
-  if (nLength < 1) {
-    return 0;
-  }
-  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
-  FX_DWORD dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
-  FX_TXTRUN tr;
-  tr.pAccess = m_pPage;
-  tr.pIdentity = (void*)hText;
-  tr.pStr = NULL;
-  tr.pWidths = NULL;
-  tr.iLength = nLength;
-  tr.pFont = pTextParams->pFont;
-  tr.fFontSize = pTextParams->fFontSize;
-  tr.dwStyles = dwLayoutStyle;
-  tr.iCharRotation = pTextParams->nCharRotation;
-  tr.dwCharStyles = pPiece->dwCharStyles;
-  tr.pRect = &(pPiece->rtPiece);
-  tr.wLineBreakChar = pTextParams->wLineBreakChar;
-  return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox);
-}
-CFDE_TxtEdtPage::CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
-    : m_pIter(nullptr),
-      m_pTextSet(nullptr),
-      m_pBgnParag(nullptr),
-      m_pEndParag(nullptr),
-      m_nRefCount(0),
-      m_nPageStart(-1),
-      m_nCharCount(0),
-      m_nPageIndex(nPageIndex),
-      m_bLoaded(FALSE),
-      m_pCharWidth(nullptr) {
-  FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
-  FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
-  FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
-  FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
-  m_pEditEngine = (CFDE_TxtEdtEngine*)pEngine;
-}
-CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
-  m_PieceMassArr.RemoveAll(TRUE);
-  if (m_pTextSet) {
-    delete m_pTextSet;
-    m_pTextSet = NULL;
-  }
-  if (m_pCharWidth) {
-    delete[] m_pCharWidth;
-    m_pCharWidth = NULL;
-  }
-  if (m_pIter != NULL) {
-    m_pIter->Release();
-    m_pIter = NULL;
-  }
-}
-void CFDE_TxtEdtPage::Release() {
-  delete this;
-}
-IFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
-  return (IFDE_TxtEdtEngine*)m_pEditEngine;
-}
-FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() {
-  return FDE_VISUALOBJ_Text;
-}
-FX_BOOL CFDE_TxtEdtPage::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) {
-  return FALSE;
-}
-FX_BOOL CFDE_TxtEdtPage::GetMatrix(FDE_HVISUALOBJ hVisualObj,
-                                   CFX_Matrix& matrix) {
-  return FALSE;
-}
-FX_BOOL CFDE_TxtEdtPage::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
-  return FALSE;
-}
-FX_BOOL CFDE_TxtEdtPage::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
-  return FALSE;
-}
-int32_t CFDE_TxtEdtPage::GetCharRect(int32_t nIndex,
-                                     CFX_RectF& rect,
-                                     FX_BOOL bBBox) const {
-  FXSYS_assert(m_nRefCount > 0);
-  FXSYS_assert(nIndex >= 0 && nIndex < m_nCharCount);
-  if (m_nRefCount < 1) {
-    return 0;
-  }
-  int32_t nCount = m_PieceMassArr.GetSize();
-  for (int32_t i = 0; i < nCount; i++) {
-    const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
-    if (nIndex >= pPiece->nStart &&
-        nIndex < (pPiece->nStart + pPiece->nCount)) {
-      CFX_RectFArray rectArr;
-      if (bBBox) {
-        m_pTextSet->GetCharRects_Impl((FDE_HVISUALOBJ)pPiece, rectArr, bBBox);
-      } else {
-        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
-      }
-      rect = rectArr[nIndex - pPiece->nStart];
-      return pPiece->nBidiLevel;
-    }
-  }
-  FXSYS_assert(0);
-  return 0;
-}
-int32_t CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF& fPoint,
-                                      FX_BOOL& bBefore) {
-  FX_BOOL bVertical = m_pEditEngine->GetEditParams()->dwLayoutStyles &
-                      FDE_TEXTEDITLAYOUT_DocVertical;
-  CFX_PointF ptF = fPoint;
-  NormalizePt2Rect(ptF, m_rtPageContents, FDE_TXTEDT_TOLERANCE);
-  int32_t nCount = m_PieceMassArr.GetSize();
-  CFX_RectF rtLine;
-  int32_t nBgn = 0;
-  int32_t nEnd = 0;
-  FX_BOOL bInLine = FALSE;
-  int32_t i = 0;
-  for (i = 0; i < nCount; i++) {
-    const FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
-    if (!bInLine && (bVertical ? (pPiece->rtPiece.left <= ptF.x &&
-                                  pPiece->rtPiece.right() > ptF.x)
-                               : (pPiece->rtPiece.top <= ptF.y &&
-                                  pPiece->rtPiece.bottom() > ptF.y))) {
-      nBgn = nEnd = i;
-      rtLine = pPiece->rtPiece;
-      bInLine = TRUE;
-    } else if (bInLine) {
-      if (bVertical ? (!(pPiece->rtPiece.left <= ptF.x &&
-                         pPiece->rtPiece.right() > ptF.x))
-                    : (pPiece->rtPiece.bottom() <= ptF.y ||
-                       pPiece->rtPiece.top > ptF.y)) {
-        nEnd = i - 1;
-        break;
-      } else {
-        rtLine.Union(pPiece->rtPiece);
-      }
-    }
-  }
-  NormalizePt2Rect(ptF, rtLine, FDE_TXTEDT_TOLERANCE);
-  int32_t nCaret = 0;
-  FDE_TEXTEDITPIECE* pPiece = NULL;
-  for (i = nBgn; i <= nEnd; i++) {
-    pPiece = m_PieceMassArr.GetPtrAt(i);
-    nCaret = m_nPageStart + pPiece->nStart;
-    if (pPiece->rtPiece.Contains(ptF)) {
-      CFX_RectFArray rectArr;
-      m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
-      int32_t nRtCount = rectArr.GetSize();
-      for (int32_t j = 0; j < nRtCount; j++) {
-        if (rectArr[j].Contains(ptF)) {
-          nCaret = m_nPageStart + pPiece->nStart + j;
-          if (nCaret >= m_pEditEngine->GetTextBufLength()) {
-            bBefore = TRUE;
-            return m_pEditEngine->GetTextBufLength();
-          }
-          FX_WCHAR wChar = m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret);
-          if (wChar == L'\n' || wChar == L'\r') {
-            if (wChar == L'\n') {
-              if (m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret - 1) ==
-                  L'\r') {
-                nCaret--;
-              }
-            }
-            bBefore = TRUE;
-            return nCaret;
-          }
-          if (bVertical
-                  ? (ptF.y > ((rectArr[j].top + rectArr[j].bottom()) / 2))
-                  : (ptF.x > ((rectArr[j].left + rectArr[j].right()) / 2))) {
-            bBefore = FX_IsOdd(pPiece->nBidiLevel);
-          } else {
-            bBefore = !FX_IsOdd(pPiece->nBidiLevel);
-          }
-          return nCaret;
-        }
-      }
-    }
-  }
-  bBefore = TRUE;
-  return nCaret;
-}
-int32_t CFDE_TxtEdtPage::GetCharStart() const {
-  return m_nPageStart;
-}
-int32_t CFDE_TxtEdtPage::GetCharCount() const {
-  return m_nCharCount;
-}
-int32_t CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF& rtClip,
-                                       FXTEXT_CHARPOS*& pCharPos,
-                                       CFX_RectF* pBBox) const {
-  pCharPos = FX_Alloc(FXTEXT_CHARPOS, m_nCharCount);
-  int32_t nCharPosCount = 0;
-  FDE_HVISUALOBJ hVisualObj = NULL;
-  int32_t nVisualObjCount = m_PieceMassArr.GetSize();
-  FXTEXT_CHARPOS* pos = pCharPos;
-  CFX_RectF rtObj;
-  for (int32_t i = 0; i < nVisualObjCount; i++) {
-    hVisualObj = (FDE_HVISUALOBJ)m_PieceMassArr.GetPtrAt(i);
-    m_pTextSet->GetRect(hVisualObj, rtObj);
-    if (!rtClip.IntersectWith(rtObj)) {
-      continue;
-    }
-    int32_t nCount = m_pTextSet->GetDisplayPos(hVisualObj, pos, FALSE);
-    nCharPosCount += nCount;
-    pos += nCount;
-  }
-  if ((nCharPosCount * 5) < (m_nCharCount << 2)) {
-    FXTEXT_CHARPOS* pTemp = FX_Alloc(FXTEXT_CHARPOS, nCharPosCount);
-    FXSYS_memcpy(pTemp, pCharPos, sizeof(FXTEXT_CHARPOS) * nCharPosCount);
-    FX_Free(pCharPos);
-    pCharPos = pTemp;
-  }
-  return nCharPosCount;
-}
-void CFDE_TxtEdtPage::CalcRangeRectArray(int32_t nStart,
-                                         int32_t nCount,
-                                         CFX_RectFArray& RectFArr) const {
-  int32_t nPieceCount = m_PieceMassArr.GetSize();
-  int32_t nEnd = nStart + nCount - 1;
-  FX_BOOL bInRange = FALSE;
-  for (int32_t i = 0; i < nPieceCount; i++) {
-    FDE_TEXTEDITPIECE* piece = m_PieceMassArr.GetPtrAt(i);
-    if (!bInRange) {
-      if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) {
-        int32_t nRangeEnd = piece->nCount - 1;
-        FX_BOOL bEnd = FALSE;
-        if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
-          nRangeEnd = nEnd - piece->nStart;
-          bEnd = TRUE;
-        }
-        CFX_RectFArray rcArr;
-        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
-        CFX_RectF rectPiece = rcArr[nStart - piece->nStart];
-        rectPiece.Union(rcArr[nRangeEnd]);
-        RectFArr.Add(rectPiece);
-        if (bEnd) {
-          return;
-        }
-        bInRange = TRUE;
-      }
-    } else {
-      if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
-        CFX_RectFArray rcArr;
-        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
-        CFX_RectF rectPiece = rcArr[0];
-        rectPiece.Union(rcArr[nEnd - piece->nStart]);
-        RectFArr.Add(rectPiece);
-        return;
-      }
-      RectFArr.Add(piece->rtPiece);
-    }
-  }
-}
-
-int32_t CFDE_TxtEdtPage::SelectWord(const CFX_PointF& fPoint, int32_t& nCount) {
-  if (m_nRefCount < 0) {
-    return -1;
-  }
-  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
-  FX_BOOL bBefore;
-  int32_t nIndex = GetCharIndex(fPoint, bBefore);
-  if (nIndex == m_pEditEngine->GetTextBufLength()) {
-    nIndex = m_pEditEngine->GetTextBufLength() - 1;
-  }
-  if (nIndex < 0) {
-    return -1;
-  }
-  IFX_WordBreak* pIter = FX_WordBreak_Create();
-  pIter->Attach(new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf));
-  pIter->SetAt(nIndex);
-  nCount = pIter->GetWordLength();
-  int32_t nRet = pIter->GetWordPos();
-  pIter->Release();
-  return nRet;
-}
-FX_BOOL CFDE_TxtEdtPage::IsLoaded(const CFX_RectF* pClipBox) {
-  return m_bLoaded;
-}
-int32_t CFDE_TxtEdtPage::LoadPage(const CFX_RectF* pClipBox,
-                                  IFX_Pause* pPause) {
-  if (m_nRefCount > 0) {
-    m_nRefCount++;
-    return m_nRefCount;
-  }
-  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
-  const FDE_TXTEDTPARAMS* pParams = m_pEditEngine->GetEditParams();
-  if (m_pIter != NULL) {
-    m_pIter->Release();
-  }
-  FX_WCHAR wcAlias = 0;
-  if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
-    wcAlias = m_pEditEngine->GetAliasChar();
-  }
-  m_pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias);
-  IFX_TxtBreak* pBreak = m_pEditEngine->GetTextBreak();
-  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  pBreak->ClearBreakPieces();
-  int32_t nPageLineCount = m_pEditEngine->GetPageLineCount();
-  int32_t nStartLine = nPageLineCount * m_nPageIndex;
-  int32_t nEndLine = std::min((nStartLine + nPageLineCount - 1),
-                              (m_pEditEngine->GetLineCount() - 1));
-  int32_t nPageStart, nPageEnd, nTemp, nBgnParag, nStartLineInParag, nEndParag,
-      nEndLineInParag;
-  nBgnParag = m_pEditEngine->Line2Parag(0, 0, nStartLine, nStartLineInParag);
-  m_pBgnParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nBgnParag);
-  m_pBgnParag->LoadParag();
-  m_pBgnParag->GetLineRange(nStartLine - nStartLineInParag, nPageStart, nTemp);
-  nEndParag = m_pEditEngine->Line2Parag(nBgnParag, nStartLineInParag, nEndLine,
-                                        nEndLineInParag);
-  m_pEndParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nEndParag);
-  m_pEndParag->LoadParag();
-  m_pEndParag->GetLineRange(nEndLine - nEndLineInParag, nPageEnd, nTemp);
-  nPageEnd += (nTemp - 1);
-  FX_BOOL bVertial = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
-  FX_BOOL bLineReserve =
-      pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
-  FX_FLOAT fLineStart =
-      bVertial
-          ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f)
-          : 0.0f;
-  FX_FLOAT fLineStep =
-      (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
-  FX_FLOAT fLinePos = fLineStart;
-  if (m_pTextSet == NULL) {
-    m_pTextSet = new CFDE_TxtEdtTextSet(this);
-  }
-  m_PieceMassArr.RemoveAll(TRUE);
-  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
-  int32_t nPieceStart = 0;
-  if (m_pCharWidth != NULL) {
-    delete[] m_pCharWidth;
-  }
-  m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1];
-  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  pBreak->ClearBreakPieces();
-  m_nPageStart = nPageStart;
-  m_nCharCount = nPageEnd - nPageStart + 1;
-  FX_BOOL bReload = FALSE;
-  FX_FLOAT fDefCharWidth = 0;
-  IFX_CharIter* pIter = m_pIter->Clone();
-  pIter->SetAt(nPageStart);
-  m_pIter->SetAt(nPageStart);
-  FX_BOOL bFirstPiece = TRUE;
-  do {
-    if (bReload) {
-      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    } else {
-      FX_WCHAR wAppend = pIter->GetChar();
-      dwBreakStatus = pBreak->AppendChar(wAppend);
-    }
-    if (pIter->GetAt() == nPageEnd && dwBreakStatus < FX_TXTBREAK_LineBreak) {
-      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    }
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      int32_t nPieceCount = pBreak->CountBreakPieces();
-      for (int32_t j = 0; j < nPieceCount; j++) {
-        const CFX_TxtPiece* pPiece = pBreak->GetBreakPiece(j);
-        FDE_TEXTEDITPIECE TxtEdtPiece;
-        FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE));
-        TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel;
-        TxtEdtPiece.nCount = pPiece->GetLength();
-        TxtEdtPiece.nStart = nPieceStart;
-        TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles;
-        if (FX_IsOdd(pPiece->m_iBidiLevel)) {
-          TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
-        }
-        FX_FLOAT fParaBreakWidth = 0.0f;
-        if (pPiece->m_dwStatus > FX_TXTBREAK_PieceBreak) {
-          FX_WCHAR wRtChar = pParams->wLineBreakChar;
-          if (TxtEdtPiece.nCount >= 2) {
-            FX_WCHAR wChar = pBuf->GetCharByIndex(
-                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
-            FX_WCHAR wCharPre = pBuf->GetCharByIndex(
-                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 2);
-            if (wChar == wRtChar) {
-              fParaBreakWidth += fDefCharWidth;
-            }
-            if (wCharPre == wRtChar) {
-              fParaBreakWidth += fDefCharWidth;
-            }
-          } else if (TxtEdtPiece.nCount >= 1) {
-            FX_WCHAR wChar = pBuf->GetCharByIndex(
-                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
-            if (wChar == wRtChar) {
-              fParaBreakWidth += fDefCharWidth;
-            }
-          }
-        }
-        if (pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
-          TxtEdtPiece.rtPiece.left = fLinePos;
-          TxtEdtPiece.rtPiece.top = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
-          TxtEdtPiece.rtPiece.width = pParams->fLineSpace;
-          TxtEdtPiece.rtPiece.height =
-              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
-        } else {
-          TxtEdtPiece.rtPiece.left = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
-          TxtEdtPiece.rtPiece.top = fLinePos;
-          TxtEdtPiece.rtPiece.width =
-              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
-          TxtEdtPiece.rtPiece.height = pParams->fLineSpace;
-        }
-        if (bFirstPiece) {
-          m_rtPageContents = TxtEdtPiece.rtPiece;
-          bFirstPiece = FALSE;
-        } else {
-          m_rtPageContents.Union(TxtEdtPiece.rtPiece);
-        }
-        nPieceStart += TxtEdtPiece.nCount;
-        m_PieceMassArr.Add(TxtEdtPiece);
-        for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
-          CFX_Char* ptc = pPiece->GetCharPtr(k);
-          m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
-        }
-      }
-      fLinePos += fLineStep;
-      pBreak->ClearBreakPieces();
-    }
-    if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) {
-      bReload = TRUE;
-      pIter->Next(TRUE);
-    }
-  } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd));
-  if (m_rtPageContents.left != 0) {
-    FX_FLOAT fDelta = 0.0f;
-    if (m_rtPageContents.width < pParams->fPlateWidth) {
-      if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Right) {
-        fDelta = pParams->fPlateWidth - m_rtPageContents.width;
-      } else if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Center) {
-        if ((pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) &&
-            m_nCharCount > 1) {
-          int32_t nCount = m_nCharCount - 1;
-          int32_t n = (m_pEditEngine->m_nLimit - nCount) / 2;
-          fDelta = (m_rtPageContents.width / nCount) * n;
-        } else {
-          fDelta = (pParams->fPlateWidth - m_rtPageContents.width) / 2;
-        }
-      }
-    }
-    FX_FLOAT fOffset = m_rtPageContents.left - fDelta;
-    int32_t nCount = m_PieceMassArr.GetSize();
-    for (int32_t i = 0; i < nCount; i++) {
-      FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(i);
-      pPiece->rtPiece.Offset(-fOffset, 0.0f);
-    }
-    m_rtPageContents.Offset(-fOffset, 0.0f);
-  }
-  if (m_pEditEngine->GetEditParams()->dwLayoutStyles &
-      FDE_TEXTEDITLAYOUT_LastLineHeight) {
-    m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize;
-    int32_t nCount = m_PieceMassArr.GetSize();
-    FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
-    pPiece->rtPiece.height = pParams->fFontSize;
-  }
-  pIter->Release();
-  m_nRefCount = 1;
-  m_bLoaded = TRUE;
-  return 0;
-}
-void CFDE_TxtEdtPage::UnloadPage(const CFX_RectF* pClipBox) {
-  FXSYS_assert(m_nRefCount > 0);
-  m_nRefCount--;
-  if (m_nRefCount == 0) {
-    m_PieceMassArr.RemoveAll();
-    if (m_pTextSet) {
-      delete m_pTextSet;
-      m_pTextSet = NULL;
-    }
-    if (m_pCharWidth) {
-      delete[] m_pCharWidth;
-      m_pCharWidth = NULL;
-    }
-    if (m_pBgnParag) {
-      m_pBgnParag->UnloadParag();
-    }
-    if (m_pEndParag) {
-      m_pEndParag->UnloadParag();
-    }
-    if (m_pIter) {
-      m_pIter->Release();
-      m_pIter = NULL;
-    }
-    m_pBgnParag = NULL;
-    m_pEndParag = NULL;
-  }
-}
-
-const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() {
-  return m_rtPageContents;
-}
-FX_POSITION CFDE_TxtEdtPage::GetFirstPosition(FDE_HVISUALOBJ hCanvas) {
-  if (m_PieceMassArr.GetSize() < 1) {
-    return NULL;
-  }
-  return (FX_POSITION)1;
-}
-FDE_HVISUALOBJ CFDE_TxtEdtPage::GetNext(FDE_HVISUALOBJ hCanvas,
-                                        FX_POSITION& pos,
-                                        IFDE_VisualSet*& pVisualSet) {
-  if (m_pTextSet == NULL) {
-    pos = NULL;
-    return NULL;
-  }
-  int32_t nPos = (int32_t)(uintptr_t)pos;
-  pVisualSet = m_pTextSet;
-  if (nPos + 1 > m_PieceMassArr.GetSize()) {
-    pos = NULL;
-  } else {
-    pos = (FX_POSITION)(uintptr_t)(nPos + 1);
-  }
-  return (FDE_HVISUALOBJ)(m_PieceMassArr.GetPtrAt(nPos - 1));
-}
-FDE_HVISUALOBJ CFDE_TxtEdtPage::GetParentCanvas(FDE_HVISUALOBJ hCanvas,
-                                                IFDE_VisualSet*& pVisualSet) {
-  return NULL;
-}
-FX_WCHAR CFDE_TxtEdtPage::GetChar(void* pIdentity, int32_t index) const {
-  int32_t nIndex =
-      m_nPageStart + ((FDE_TEXTEDITPIECE*)pIdentity)->nStart + index;
-  if (nIndex != m_pIter->GetAt()) {
-    m_pIter->SetAt(nIndex);
-  }
-  FX_WCHAR wChar = m_pIter->GetChar();
-  m_pIter->Next();
-  return wChar;
-}
-int32_t CFDE_TxtEdtPage::GetWidth(void* pIdentity, int32_t index) const {
-  int32_t nWidth =
-      m_pCharWidth[((FDE_TEXTEDITPIECE*)pIdentity)->nStart + index];
-  return nWidth;
-}
-void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF& ptF,
-                                       const CFX_RectF& rtF,
-                                       FX_FLOAT fTolerance) const {
-  if (rtF.Contains(ptF.x, ptF.y)) {
-    return;
-  }
-  if (ptF.x < rtF.left) {
-    ptF.x = rtF.left;
-  } else if (ptF.x >= rtF.right()) {
-    ptF.x = rtF.right() - fTolerance;
-  }
-  if (ptF.y < rtF.top) {
-    ptF.y = rtF.top;
-  } else if (ptF.y >= rtF.bottom()) {
-    ptF.y = rtF.bottom() - fTolerance;
-  }
-}
diff --git a/xfa/src/fee/fde_txtedtpage.h b/xfa/src/fee/fde_txtedtpage.h
deleted file mode 100644
index 2ea0725..0000000
--- a/xfa/src/fee/fde_txtedtpage.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FDE_TXTEDTPAGE_H_
-#define XFA_SRC_FEE_FDE_TXTEDTPAGE_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fde/fde_visualset.h"
-#include "xfa/src/fee/ifde_txtedtpage.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-class IFX_CharIter;
-class CFDE_TxtEdtEngine;
-class CFDE_TxtEdtPage;
-class CFDE_TxtEdtParag;
-
-enum FDE_TXTEDT_CHARTYPE {
-  FDE_TXTEDT_CHARTYPE_Unknown = 0,
-  FDE_TXTEDT_CHARTYPE_Tab,
-  FDE_TXTEDT_CHARTYPE_Space,
-  FDE_TXTEDT_CHARTYPE_Punctuation,
-  FDE_TXTEDT_CHARTYPE_LineBreak,
-  FDE_TXTEDT_CHARTYPE_Number,
-  FDE_TXTEDT_CHARTYPE_Char,
-  FDE_TXTEDT_CHARTYPE_CJK,
-};
-
-inline FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar) {
-  if (wChar == 0x9) {
-    return FDE_TXTEDT_CHARTYPE_Tab;
-  } else if (wChar == 0x20 || wChar == 0xA0) {
-    return FDE_TXTEDT_CHARTYPE_Space;
-  } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 ||
-             (wChar >= L'!' && wChar <= L'/') ||
-             (wChar >= L':' && wChar <= L'@') ||
-             (wChar >= L'[' && wChar <= L'^') ||
-             (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) {
-    return FDE_TXTEDT_CHARTYPE_Punctuation;
-  } else if (wChar == 0x0a || wChar == 0x0d) {
-    return FDE_TXTEDT_CHARTYPE_LineBreak;
-  } else if (wChar >= '0' && wChar <= '9') {
-    return FDE_TXTEDT_CHARTYPE_Number;
-  } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) ||
-             (wChar >= 0x3000 && wChar <= 0x303f) ||
-             (wChar >= 0x31c0 && wChar <= 0x31ef) ||
-             (wChar >= 0x3200 && wChar <= 0x32ff) ||
-             (wChar >= 0x3300 && wChar <= 0x33ff) ||
-             (wChar >= 0x3400 && wChar <= 0x4dbf) ||
-             (wChar >= 0x4e00 && wChar <= 0x9fff) ||
-             (wChar >= 0xf900 && wChar <= 0xfaff) ||
-             (wChar >= 0xfe30 && wChar <= 0xfe4f)) {
-    return FDE_TXTEDT_CHARTYPE_CJK;
-  } else {
-    return FDE_TXTEDT_CHARTYPE_Char;
-  }
-}
-
-struct FDE_TEXTEDITPIECE {
-  int32_t nStart;
-  int32_t nCount;
-  int32_t nBidiLevel;
-  CFX_RectF rtPiece;
-  FX_DWORD dwCharStyles;
-};
-typedef CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> CFDE_TXTEDTPieceMassArray;
-
-class CFDE_TxtEdtTextSet : public IFDE_TextSet {
- public:
-  CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage);
-  ~CFDE_TxtEdtTextSet();
-
-  virtual FDE_VISUALOBJTYPE GetType();
-  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox);
-  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix);
-  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
-  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
-  virtual int32_t GetString(FDE_HVISUALOBJ hText, CFX_WideString& wsText);
-  virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText);
-  virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText);
-  virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText);
-  virtual int32_t GetDisplayPos(FDE_HVISUALOBJ hText,
-                                FXTEXT_CHARPOS* pCharPos,
-                                FX_BOOL bCharCode = FALSE,
-                                CFX_WideString* pWSForms = NULL);
-  virtual int32_t GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray& rtArray);
-  virtual int32_t GetCharRects_Impl(FDE_HVISUALOBJ hText,
-                                    CFX_RectFArray& rtArray,
-                                    FX_BOOL bBBox = FALSE);
-
- private:
-  CFDE_TxtEdtPage* m_pPage;
-};
-
-class CFDE_TxtEdtPage : public IFDE_TxtEdtPage {
- public:
-  CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nLineIndex);
-
-  // IFDE_TxtEditPage:
-  void Release() override;
-  IFDE_TxtEdtEngine* GetEngine() const override;
-  int32_t GetCharRect(int32_t nIndex,
-                      CFX_RectF& rect,
-                      FX_BOOL bBBox = FALSE) const override;
-  int32_t GetCharIndex(const CFX_PointF& fPoint, FX_BOOL& bBefore) override;
-  void CalcRangeRectArray(int32_t nStart,
-                          int32_t nCount,
-                          CFX_RectFArray& RectFArr) const override;
-  int32_t SelectWord(const CFX_PointF& fPoint, int32_t& nCount) override;
-  int32_t GetCharStart() const override;
-  int32_t GetCharCount() const override;
-  int32_t GetDisplayPos(const CFX_RectF& rtClip,
-                        FXTEXT_CHARPOS*& pCharPos,
-                        CFX_RectF* pBBox) const override;
-  FX_BOOL IsLoaded(const CFX_RectF* pClipBox) override;
-  int32_t LoadPage(const CFX_RectF* pClipBox, IFX_Pause* pPause) override;
-  void UnloadPage(const CFX_RectF* pClipBox) override;
-  const CFX_RectF& GetContentsBox() override;
-
-  // IFDE_VisualSet:
-  FDE_VISUALOBJTYPE GetType() override;
-  FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) override;
-  FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix) override;
-  FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) override;
-  FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) override;
-
-  // IFDE_CanvasSet:
-  FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas) override;
-  FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas,
-                         FX_POSITION& pos,
-                         IFDE_VisualSet*& pVisualSet) override;
-  FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas,
-                                 IFDE_VisualSet*& pVisualSet) override;
-
-  // IFX_TxtAccess:
-  FX_WCHAR GetChar(void* pIdentity, int32_t index) const override;
-  int32_t GetWidth(void* pIdentity, int32_t index) const override;
-
- protected:
-  virtual ~CFDE_TxtEdtPage();
-
- private:
-  void NormalizePt2Rect(CFX_PointF& ptF,
-                        const CFX_RectF& rtF,
-                        FX_FLOAT fTolerance) const;
-
-  IFX_CharIter* m_pIter;
-  CFDE_TxtEdtTextSet* m_pTextSet;
-  CFDE_TxtEdtEngine* m_pEditEngine;
-  CFDE_TXTEDTPieceMassArray m_PieceMassArr;
-  CFDE_TxtEdtParag* m_pBgnParag;
-  CFDE_TxtEdtParag* m_pEndParag;
-  int32_t m_nRefCount;
-  int32_t m_nPageStart;
-  int32_t m_nCharCount;
-  int32_t m_nPageIndex;
-  FX_BOOL m_bLoaded;
-  CFX_RectF m_rtPage;
-  CFX_RectF m_rtPageMargin;
-  CFX_RectF m_rtPageContents;
-  CFX_RectF m_rtPageCanvas;
-  int32_t* m_pCharWidth;
-};
-
-#endif  // XFA_SRC_FEE_FDE_TXTEDTPAGE_H_
diff --git a/xfa/src/fee/fde_txtedtparag.cpp b/xfa/src/fee/fde_txtedtparag.cpp
deleted file mode 100644
index 32f846b..0000000
--- a/xfa/src/fee/fde_txtedtparag.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fde_txtedtparag.h"
-
-#include "xfa/src/fee/fde_txtedtbuf.h"
-#include "xfa/src/fee/fde_txtedtengine.h"
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak.h"
-#include "xfa/src/fee/ifde_txtedtbuf.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-#include "xfa/src/fgas/layout/fgas_textbreak.h"
-
-CFDE_TxtEdtParag::CFDE_TxtEdtParag(CFDE_TxtEdtEngine* pEngine)
-    : m_nCharStart(0),
-      m_nCharCount(0),
-      m_nLineCount(0),
-      m_lpData(NULL),
-      m_pEngine(pEngine) {
-  FXSYS_assert(m_pEngine);
-}
-CFDE_TxtEdtParag::~CFDE_TxtEdtParag() {
-  if (m_lpData != NULL) {
-    FX_Free(m_lpData);
-  }
-}
-void CFDE_TxtEdtParag::LoadParag() {
-  if (m_lpData != NULL) {
-    ((int32_t*)m_lpData)[0]++;
-    return;
-  }
-  IFX_TxtBreak* pTxtBreak = m_pEngine->GetTextBreak();
-  IFDE_TxtEdtBuf* pTxtBuf = m_pEngine->GetTextBuf();
-  const FDE_TXTEDTPARAMS* pParam = m_pEngine->GetEditParams();
-  FX_WCHAR wcAlias = 0;
-  if (pParam->dwMode & FDE_TEXTEDITMODE_Password) {
-    wcAlias = m_pEngine->GetAliasChar();
-  }
-  IFX_CharIter* pIter =
-      new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf, wcAlias);
-  pIter->SetAt(m_nCharStart);
-  int32_t nEndIndex = m_nCharStart + m_nCharCount;
-  CFX_ArrayTemplate<int32_t> LineBaseArr;
-  FX_BOOL bReload = FALSE;
-  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
-  do {
-    if (bReload) {
-      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    } else {
-      FX_WCHAR wAppend = pIter->GetChar();
-      dwBreakStatus = pTxtBreak->AppendChar(wAppend);
-    }
-    if (pIter->GetAt() + 1 == nEndIndex &&
-        dwBreakStatus < FX_TXTBREAK_LineBreak) {
-      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    }
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      int32_t nCount = pTxtBreak->CountBreakPieces();
-      int32_t nTotal = 0;
-      for (int32_t j = 0; j < nCount; j++) {
-        const CFX_TxtPiece* Piece = pTxtBreak->GetBreakPiece(j);
-        nTotal += Piece->GetLength();
-      }
-      LineBaseArr.Add(nTotal);
-      pTxtBreak->ClearBreakPieces();
-    }
-    if ((pIter->GetAt() + 1 == nEndIndex) &&
-        (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
-      bReload = TRUE;
-      pIter->Next(TRUE);
-    }
-  } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
-  pIter->Release();
-  pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  pTxtBreak->ClearBreakPieces();
-  int32_t nLineCount = LineBaseArr.GetSize();
-  m_nLineCount = nLineCount;
-  if (m_lpData == NULL) {
-    m_lpData = FX_Alloc(int32_t, nLineCount + 1);
-  } else {
-    m_lpData = FX_Realloc(int32_t, m_lpData, (nLineCount + 1));
-  }
-  int32_t* pIntArr = (int32_t*)m_lpData;
-  pIntArr[0] = 1;
-  m_nLineCount = nLineCount;
-  pIntArr++;
-  for (int32_t j = 0; j < nLineCount; j++, pIntArr++) {
-    *pIntArr = LineBaseArr[j];
-  }
-  LineBaseArr.RemoveAll();
-}
-void CFDE_TxtEdtParag::UnloadParag() {
-  FXSYS_assert(m_lpData != NULL);
-  ((int32_t*)m_lpData)[0]--;
-  FXSYS_assert(((int32_t*)m_lpData)[0] >= 0);
-  if (((int32_t*)m_lpData)[0] == 0) {
-    FX_Free(m_lpData);
-    m_lpData = NULL;
-  }
-}
-void CFDE_TxtEdtParag::CalcLines() {
-  IFX_TxtBreak* pTxtBreak = m_pEngine->GetTextBreak();
-  IFDE_TxtEdtBuf* pTxtBuf = m_pEngine->GetTextBuf();
-  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf);
-  int32_t nCount = 0;
-  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
-  int32_t nEndIndex = m_nCharStart + m_nCharCount;
-  pIter->SetAt(m_nCharStart);
-  FX_BOOL bReload = FALSE;
-  do {
-    if (bReload) {
-      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    } else {
-      FX_WCHAR wAppend = pIter->GetChar();
-      dwBreakStatus = pTxtBreak->AppendChar(wAppend);
-    }
-    if (pIter->GetAt() + 1 == nEndIndex &&
-        dwBreakStatus < FX_TXTBREAK_LineBreak) {
-      dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-    }
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      nCount++;
-      pTxtBreak->ClearBreakPieces();
-    }
-    if ((pIter->GetAt() + 1 == nEndIndex) &&
-        (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
-      bReload = TRUE;
-      pIter->Next(TRUE);
-    }
-  } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
-  pIter->Release();
-  pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  pTxtBreak->ClearBreakPieces();
-  m_nLineCount = nCount;
-}
-void CFDE_TxtEdtParag::GetLineRange(int32_t nLineIndex,
-                                    int32_t& nStart,
-                                    int32_t& nCount) const {
-  int32_t* pLineBaseArr = (int32_t*)m_lpData;
-  FXSYS_assert(nLineIndex < m_nLineCount);
-  nStart = m_nCharStart;
-  pLineBaseArr++;
-  for (int32_t i = 0; i < nLineIndex; i++) {
-    nStart += *pLineBaseArr;
-    pLineBaseArr++;
-  }
-  nCount = *pLineBaseArr;
-}
diff --git a/xfa/src/fee/fde_txtedtparag.h b/xfa/src/fee/fde_txtedtparag.h
deleted file mode 100644
index 5af0497..0000000
--- a/xfa/src/fee/fde_txtedtparag.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FDE_TXTEDTPARAG_H_
-#define XFA_SRC_FEE_FDE_TXTEDTPARAG_H_
-
-#include "xfa/src/fee/ifde_txtedtengine.h"
-
-class CFDE_TxtEdtEngine;
-
-class CFDE_TxtEdtParag : public IFDE_TxtEdtParag {
- public:
-  explicit CFDE_TxtEdtParag(CFDE_TxtEdtEngine* pEngine);
-  ~CFDE_TxtEdtParag();
-
-  virtual int32_t GetTextLength() const { return m_nCharCount; }
-  virtual int32_t GetStartIndex() const { return m_nCharStart; }
-  virtual int32_t CountLines() const { return m_nLineCount; }
-  virtual void GetLineRange(int32_t nLineIndex,
-                            int32_t& nStart,
-                            int32_t& nCount) const;
-  void LoadParag();
-  void UnloadParag();
-  void CalcLines();
-  int32_t m_nCharStart;
-  int32_t m_nCharCount;
-  int32_t m_nLineCount;
-
- private:
-  void* m_lpData;
-  CFDE_TxtEdtEngine* m_pEngine;
-};
-
-#endif  // XFA_SRC_FEE_FDE_TXTEDTPARAG_H_
diff --git a/xfa/src/fee/fx_wordbreak/fx_wordbreak.h b/xfa/src/fee/fx_wordbreak/fx_wordbreak.h
deleted file mode 100644
index f67afb6..0000000
--- a/xfa/src/fee/fx_wordbreak/fx_wordbreak.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
-#define XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxcrt/fx_system.h"
-
-class IFX_CharIter;
-
-class IFX_WordBreak {
- public:
-  virtual ~IFX_WordBreak() {}
-  virtual void Release() = 0;
-  virtual void Attach(IFX_CharIter* pIter) = 0;
-  virtual void Attach(const CFX_WideString& wsText) = 0;
-  virtual FX_BOOL Next(FX_BOOL bPrev) = 0;
-  virtual void SetAt(int32_t nIndex) = 0;
-  virtual int32_t GetWordPos() const = 0;
-  virtual int32_t GetWordLength() const = 0;
-  virtual void GetWord(CFX_WideString& wsWord) const = 0;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
-};
-IFX_WordBreak* FX_WordBreak_Create();
-
-#endif  // XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
diff --git a/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.cpp b/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.cpp
deleted file mode 100644
index 036b4f8..0000000
--- a/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h"
-
-FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint) {
-  FX_DWORD dwProperty =
-      (FX_DWORD)gs_FX_WordBreak_CodePointProperties[wcCodePoint >> 1];
-  return (FX_WordBreakProp)(((wcCodePoint) & 1) ? (dwProperty & 0x0F)
-                                                  : (dwProperty >> 4));
-}
-CFX_CharIter::CFX_CharIter(const CFX_WideString& wsText)
-    : m_wsText(wsText), m_nIndex(0) {
-  FXSYS_assert(!wsText.IsEmpty());
-}
-CFX_CharIter::~CFX_CharIter() {}
-void CFX_CharIter::Release() {
-  delete this;
-}
-FX_BOOL CFX_CharIter::Next(FX_BOOL bPrev) {
-  if (bPrev) {
-    if (m_nIndex <= 0) {
-      return FALSE;
-    }
-    m_nIndex--;
-  } else {
-    if (m_nIndex + 1 >= m_wsText.GetLength()) {
-      return FALSE;
-    }
-    m_nIndex++;
-  }
-  return TRUE;
-}
-FX_WCHAR CFX_CharIter::GetChar() {
-  return m_wsText.GetAt(m_nIndex);
-}
-void CFX_CharIter::SetAt(int32_t nIndex) {
-  if (nIndex < 0 || nIndex >= m_wsText.GetLength()) {
-    return;
-  }
-  m_nIndex = nIndex;
-}
-int32_t CFX_CharIter::GetAt() const {
-  return m_nIndex;
-}
-FX_BOOL CFX_CharIter::IsEOF(FX_BOOL bTail) const {
-  return bTail ? (m_nIndex + 1 == m_wsText.GetLength()) : (m_nIndex == 0);
-}
-IFX_CharIter* CFX_CharIter::Clone() {
-  CFX_CharIter* pIter = new CFX_CharIter(m_wsText);
-  pIter->m_nIndex = m_nIndex;
-  return pIter;
-}
-CFX_WordBreak::CFX_WordBreak() : m_pPreIter(NULL), m_pCurIter(NULL) {}
-CFX_WordBreak::~CFX_WordBreak() {
-  if (m_pPreIter) {
-    m_pPreIter->Release();
-    m_pPreIter = NULL;
-  }
-  if (m_pCurIter) {
-    m_pCurIter->Release();
-    m_pCurIter = NULL;
-  }
-}
-void CFX_WordBreak::Release() {
-  delete this;
-}
-void CFX_WordBreak::Attach(IFX_CharIter* pIter) {
-  FXSYS_assert(pIter);
-  m_pCurIter = pIter;
-}
-void CFX_WordBreak::Attach(const CFX_WideString& wsText) {
-  m_pCurIter = new CFX_CharIter(wsText);
-}
-FX_BOOL CFX_WordBreak::Next(FX_BOOL bPrev) {
-  IFX_CharIter* pIter = bPrev ? m_pPreIter->Clone() : m_pCurIter->Clone();
-  if (pIter->IsEOF(!bPrev)) {
-    return FALSE;
-  }
-  pIter->Next(bPrev);
-  if (!FindNextBreakPos(pIter, bPrev, TRUE)) {
-    pIter->Release();
-    return FALSE;
-  }
-  if (bPrev) {
-    m_pCurIter->Release();
-    m_pCurIter = m_pPreIter;
-    m_pCurIter->Next(TRUE);
-    m_pPreIter = pIter;
-  } else {
-    m_pPreIter->Release();
-    m_pPreIter = m_pCurIter;
-    m_pPreIter->Next();
-    m_pCurIter = pIter;
-  }
-  return TRUE;
-}
-void CFX_WordBreak::SetAt(int32_t nIndex) {
-  if (m_pPreIter) {
-    m_pPreIter->Release();
-    m_pPreIter = NULL;
-  }
-  m_pCurIter->SetAt(nIndex);
-  FindNextBreakPos(m_pCurIter, TRUE, FALSE);
-  m_pPreIter = m_pCurIter;
-  m_pCurIter = m_pPreIter->Clone();
-  FindNextBreakPos(m_pCurIter, FALSE, FALSE);
-}
-int32_t CFX_WordBreak::GetWordPos() const {
-  return m_pPreIter->GetAt();
-}
-int32_t CFX_WordBreak::GetWordLength() const {
-  return m_pCurIter->GetAt() - m_pPreIter->GetAt() + 1;
-}
-void CFX_WordBreak::GetWord(CFX_WideString& wsWord) const {
-  int32_t nWordLength = GetWordLength();
-  if (nWordLength <= 0) {
-    return;
-  }
-  FX_WCHAR* lpBuf = wsWord.GetBuffer(nWordLength);
-  IFX_CharIter* pTempIter = m_pPreIter->Clone();
-  int32_t i = 0;
-  while (pTempIter->GetAt() <= m_pCurIter->GetAt()) {
-    lpBuf[i++] = pTempIter->GetChar();
-    FX_BOOL bEnd = pTempIter->Next();
-    if (!bEnd) {
-      break;
-    }
-  }
-  pTempIter->Release();
-  wsWord.ReleaseBuffer(nWordLength);
-}
-FX_BOOL CFX_WordBreak::IsEOF(FX_BOOL bTail) const {
-  return m_pCurIter->IsEOF(bTail);
-}
-FX_BOOL CFX_WordBreak::FindNextBreakPos(IFX_CharIter* pIter,
-                                        FX_BOOL bPrev,
-                                        FX_BOOL bFromNext) {
-  FX_WordBreakProp ePreType = FX_WordBreakProp_None;
-  FX_WordBreakProp eCurType = FX_WordBreakProp_None;
-  FX_WordBreakProp eNextType = FX_WordBreakProp_None;
-  if (pIter->IsEOF(!bPrev)) {
-    return TRUE;
-  }
-  if (!(bFromNext || pIter->IsEOF(bPrev))) {
-    pIter->Next(!bPrev);
-    FX_WCHAR wcTemp = pIter->GetChar();
-    ePreType = FX_GetWordBreakProperty(wcTemp);
-    pIter->Next(bPrev);
-  }
-  FX_WCHAR wcTemp = pIter->GetChar();
-  eCurType = FX_GetWordBreakProperty(wcTemp);
-  FX_BOOL bFirst = TRUE;
-  do {
-    pIter->Next(bPrev);
-    FX_WCHAR wcTemp = pIter->GetChar();
-    eNextType = FX_GetWordBreakProperty(wcTemp);
-    FX_WORD wBreak =
-        gs_FX_WordBreak_Table[eCurType] & ((FX_WORD)(1 << eNextType));
-    if (wBreak) {
-      if (pIter->IsEOF(!bPrev)) {
-        pIter->Next(!bPrev);
-        return TRUE;
-      }
-      if (bFirst) {
-        int32_t nFlags = 0;
-        if (eCurType == FX_WordBreakProp_MidLetter) {
-          if (eNextType == FX_WordBreakProp_ALetter) {
-            nFlags = 1;
-          }
-        } else if (eCurType == FX_WordBreakProp_MidNum) {
-          if (eNextType == FX_WordBreakProp_Numberic) {
-            nFlags = 2;
-          }
-        } else if (eCurType == FX_WordBreakProp_MidNumLet) {
-          if (eNextType == FX_WordBreakProp_ALetter) {
-            nFlags = 1;
-          } else if (eNextType == FX_WordBreakProp_Numberic) {
-            nFlags = 2;
-          }
-        }
-        if (nFlags > 0) {
-          FXSYS_assert(nFlags <= 2);
-          if (!((nFlags == 1 && ePreType == FX_WordBreakProp_ALetter) ||
-                (nFlags == 2 && ePreType == FX_WordBreakProp_Numberic))) {
-            pIter->Next(!bPrev);
-            return TRUE;
-          }
-          pIter->Next(bPrev);
-          wBreak = FALSE;
-        }
-        bFirst = FALSE;
-      }
-      if (wBreak) {
-        int32_t nFlags = 0;
-        if (eNextType == FX_WordBreakProp_MidLetter) {
-          if (eCurType == FX_WordBreakProp_ALetter) {
-            nFlags = 1;
-          }
-        } else if (eNextType == FX_WordBreakProp_MidNum) {
-          if (eCurType == FX_WordBreakProp_Numberic) {
-            nFlags = 2;
-          }
-        } else if (eNextType == FX_WordBreakProp_MidNumLet) {
-          if (eCurType == FX_WordBreakProp_ALetter) {
-            nFlags = 1;
-          } else if (eCurType == FX_WordBreakProp_Numberic) {
-            nFlags = 2;
-          }
-        }
-        if (nFlags <= 0) {
-          pIter->Next(!bPrev);
-          return TRUE;
-        }
-        FXSYS_assert(nFlags <= 2);
-        pIter->Next(bPrev);
-        wcTemp = pIter->GetChar();
-        eNextType = (FX_WordBreakProp)FX_GetWordBreakProperty(wcTemp);
-        if (!((nFlags == 1 && eNextType == FX_WordBreakProp_ALetter) ||
-              (nFlags == 2 && eNextType == FX_WordBreakProp_Numberic))) {
-          pIter->Next(!bPrev);
-          pIter->Next(!bPrev);
-          return TRUE;
-        }
-      }
-    }
-    ePreType = eCurType;
-    eCurType = eNextType;
-    bFirst = FALSE;
-  } while (!pIter->IsEOF(!bPrev));
-  return TRUE;
-}
-IFX_WordBreak* FX_WordBreak_Create() {
-  return new CFX_WordBreak;
-}
diff --git a/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h b/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h
deleted file mode 100644
index 253d83b..0000000
--- a/xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
-#define XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
-
-#include <cstdint>
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak.h"
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-
-extern const FX_WORD gs_FX_WordBreak_Table[16];
-extern const uint8_t gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1];
-enum FX_WordBreakProp {
-  FX_WordBreakProp_None = 0,
-  FX_WordBreakProp_CR,
-  FX_WordBreakProp_LF,
-  FX_WordBreakProp_NewLine,
-  FX_WordBreakProp_Extend,
-  FX_WordBreakProp_Format,
-  FX_WordBreakProp_KataKana,
-  FX_WordBreakProp_ALetter,
-  FX_WordBreakProp_MidLetter,
-  FX_WordBreakProp_MidNum,
-  FX_WordBreakProp_MidNumLet,
-  FX_WordBreakProp_Numberic,
-  FX_WordBreakProp_ExtendNumLet,
-};
-FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint);
-class CFX_CharIter : public IFX_CharIter {
- public:
-  CFX_CharIter(const CFX_WideString& wsText);
-  virtual void Release();
-  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
-  virtual FX_WCHAR GetChar();
-  virtual void SetAt(int32_t nIndex);
-  virtual int32_t GetAt() const;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
-  virtual IFX_CharIter* Clone();
-
- protected:
-  ~CFX_CharIter();
-
- private:
-  const CFX_WideString& m_wsText;
-  int32_t m_nIndex;
-};
-class CFX_WordBreak : public IFX_WordBreak {
- public:
-  CFX_WordBreak();
-  virtual void Release();
-  virtual void Attach(IFX_CharIter* pIter);
-  virtual void Attach(const CFX_WideString& wsText);
-  virtual FX_BOOL Next(FX_BOOL bPrev);
-  virtual void SetAt(int32_t nIndex);
-  virtual int32_t GetWordPos() const;
-  virtual int32_t GetWordLength() const;
-  virtual void GetWord(CFX_WideString& wsWord) const;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail) const;
-
- protected:
-  ~CFX_WordBreak();
-  FX_BOOL FindNextBreakPos(IFX_CharIter* pIter,
-                           FX_BOOL bPrev,
-                           FX_BOOL bFromNext = TRUE);
-
- private:
-  IFX_CharIter* m_pPreIter;
-  IFX_CharIter* m_pCurIter;
-};
-
-#endif  // XFA_SRC_FEE_FX_WORDBREAK_FX_WORDBREAK_IMPL_H_
diff --git a/xfa/src/fee/fx_wordbreak/fx_wordbreakdata.cpp b/xfa/src/fee/fx_wordbreak/fx_wordbreakdata.cpp
deleted file mode 100644
index ea1a31f..0000000
--- a/xfa/src/fee/fx_wordbreak/fx_wordbreakdata.cpp
+++ /dev/null
@@ -1,2748 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fee/fx_wordbreak/fx_wordbreak_impl.h"
-
-const FX_WORD gs_FX_WordBreak_Table[16] = {
-    0xFFFF, 0xFFF9, 0xFFFB, 0xFFFB, 0xFFFB, 0xFFFB, 0xEFBB, 0xE77B,
-    0xFFFB, 0xFFFB, 0xFFFB, 0xE77B, 0xE73B, 0xFFFB, 0xFFFB, 0xFFFB,
-};
-
-const uint8_t gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1] =
-    // NOLINTNEXTLINE
-    {
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x89, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C,
-        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x70, 0x05, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x70, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00,
-        0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x70, 0x77,
-        0x00, 0x77, 0x77, 0x90, 0x00, 0x00, 0x00, 0x78, 0x77, 0x70, 0x70, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x04, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
-        0x07, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x09, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x04, 0x04, 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x40, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x0B, 0x90, 0x77, 0x47, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x44,
-        0x44, 0x44, 0x45, 0x44, 0x44, 0x44, 0x47, 0x74, 0x40, 0x44, 0x44, 0x77,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x05, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x07, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x77, 0x00,
-        0x90, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x44, 0x44, 0x74, 0x44, 0x44, 0x44, 0x44, 0x74, 0x44,
-        0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x47, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x40, 0x74, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x70, 0x00, 0x00,
-        0x07, 0x77, 0x77, 0x77, 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07,
-        0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x00, 0x47, 0x44,
-        0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x70, 0x00, 0x00, 0x00, 0x04,
-        0x00, 0x00, 0x77, 0x07, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
-        0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x07, 0x77,
-        0x77, 0x70, 0x00, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x70,
-        0x77, 0x00, 0x40, 0x44, 0x44, 0x40, 0x00, 0x04, 0x40, 0x04, 0x44, 0x00,
-        0x04, 0x00, 0x00, 0x00, 0x07, 0x77, 0x70, 0x70, 0x00, 0x00, 0x00, 0xBB,
-        0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x07, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44, 0x44, 0x44, 0x44, 0x04,
-        0x44, 0x04, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07,
-        0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
-        0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44,
-        0x00, 0x00, 0x77, 0x07, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
-        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x77,
-        0x77, 0x70, 0x00, 0x77, 0x70, 0x77, 0x77, 0x00, 0x07, 0x70, 0x70, 0x77,
-        0x00, 0x07, 0x70, 0x00, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x00, 0x00, 0x44, 0x44, 0x40, 0x00, 0x44, 0x40, 0x44, 0x44, 0x00,
-        0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB,
-        0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x07, 0x44, 0x44, 0x44, 0x40, 0x44,
-        0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x77, 0x00, 0x00, 0x00,
-        0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77,
-        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
-        0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40,
-        0x00, 0x00, 0x00, 0x70, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07, 0x77,
-        0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x00, 0x07, 0x44, 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00,
-        0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x77, 0x44, 0x00, 0xBB,
-        0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77,
-        0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
-        0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, 0x77, 0x77, 0x77, 0x70,
-        0x00, 0x40, 0x00, 0x04, 0x44, 0x44, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44,
-        0x44, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x44, 0x77, 0x77, 0x77, 0x77,
-        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x77, 0x77, 0x00, 0x00,
-        0x44, 0x44, 0x44, 0x44, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00,
-        0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44, 0x40, 0x44, 0x40, 0x04,
-        0x44, 0x44, 0x44, 0x00, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70, 0x70, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70,
-        0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77,
-        0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77,
-        0x70, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x74, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00,
-        0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
-        0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x77,
-        0x77, 0x77, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44,
-        0x44, 0x40, 0x00, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x07, 0x77,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x47, 0x77, 0x74, 0x77, 0x77, 0x40, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x07, 0x07, 0x07, 0x07, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x70, 0x77,
-        0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x70, 0x77,
-        0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x55,
-        0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x08,
-        0x33, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
-        0xC0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x50, 0x00, 0x00, 0x55, 0x55, 0x55,
-        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x70, 0x00, 0x07, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00,
-        0x07, 0x77, 0x77, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x77, 0x77, 0x07,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x07, 0x77,
-        0x77, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
-        0x00, 0x07, 0x77, 0x74, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x70,
-        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
-        0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
-        0x77, 0x77, 0x77, 0x70, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44,
-        0x06, 0x66, 0x66, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x04, 0x46, 0x60, 0x00, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x66, 0x66, 0x00, 0x00, 0x07, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x74, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77,
-        0x77, 0x47, 0x77, 0x47, 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x77, 0x77, 0x77, 0x00, 0x07, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44,
-        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
-        0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x07, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB,
-        0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x40, 0x04,
-        0x40, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x40, 0x44, 0x00,
-        0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x07, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x07, 0x47, 0x77, 0x77, 0x77, 0x77,
-        0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x70, 0x70,
-        0x77, 0x07, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
-        0x90, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x40,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCC, 0x90, 0xA0, 0x98, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x05,
-        0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x89, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C, 0x07, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-        0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x44, 0x77, 0x77, 0x77, 0x77,
-        0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
-        0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77,
-        0x00, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x00, 0x00,
-};
diff --git a/xfa/src/fee/ifde_txtedtbuf.h b/xfa/src/fee/ifde_txtedtbuf.h
deleted file mode 100644
index 8cc7dfe..0000000
--- a/xfa/src/fee/ifde_txtedtbuf.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_IFDE_TXTEDTBUF_H_
-#define XFA_SRC_FEE_IFDE_TXTEDTBUF_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-#define FDE_DEFCHUNKLENGTH (1024)
-
-class IFDE_TxtEdtBuf {
- public:
-  virtual ~IFDE_TxtEdtBuf() {}
-  virtual void Release() = 0;
-
-  virtual FX_BOOL SetChunkSize(int32_t nChunkSize) = 0;
-  virtual int32_t GetChunkSize() const = 0;
-  virtual int32_t GetTextLength() const = 0;
-  virtual void SetText(const CFX_WideString& wsText) = 0;
-  virtual void GetText(CFX_WideString& wsText) const = 0;
-  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const = 0;
-  virtual void GetRange(CFX_WideString& wsText,
-                        int32_t nBegin,
-                        int32_t nCount = -1) const = 0;
-
-  virtual void Insert(int32_t nPos,
-                      const FX_WCHAR* lpText,
-                      int32_t nLength = 1) = 0;
-  virtual void Delete(int32_t nIndex, int32_t nLength = 1) = 0;
-
-  virtual void Clear(FX_BOOL bRelease = TRUE) = 0;
-
-  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL) = 0;
-};
-
-#endif  // XFA_SRC_FEE_IFDE_TXTEDTBUF_H_
diff --git a/xfa/src/fee/ifde_txtedtengine.h b/xfa/src/fee/ifde_txtedtengine.h
deleted file mode 100644
index f49e086..0000000
--- a/xfa/src/fee/ifde_txtedtengine.h
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_IFDE_TXTEDTENGINE_H_
-#define XFA_SRC_FEE_IFDE_TXTEDTENGINE_H_
-
-#include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-class IFDE_TxtEdtPage;
-class IFDE_TxtEdtEngine;
-class IFDE_TxtEdtEventSink;
-class IFDE_TxtEdtParag;
-
-typedef struct FDE_HTXTEDTFIND_ { void* pData; } * FDE_HTXTEDTFIND;
-
-#define FDE_TXTEDT_FIND_FLAGS_Prev (0L << 0)
-#define FDE_TXTEDT_FIND_FLAGS_Next (1L << 0)
-#define FDE_TXTEDT_FIND_FLAGS_WholeWord (1L << 1)
-#define FDE_TXTEDT_FIND_FLAGS_NoCase (1L << 2)
-
-#define FDE_TEXTEDITMODE_MultiLines (1L << 0)
-#define FDE_TEXTEDITMODE_AutoLineWrap (1L << 1)
-#define FDE_TEXTEDITMODE_ReadOnly (1L << 2)
-#define FDE_TEXTEDITMODE_LimitArea_Vert (1L << 3)
-#define FDE_TEXTEDITMODE_LimitArea_Horz (1L << 4)
-#define FDE_TEXTEDITMODE_NoRedoUndo (1L << 5)
-#define FDE_TEXTEDITMODE_FIELD_TAB (1L << 6)
-#define FDE_TEXTEDITMODE_FIELD_AUTO (1L << 7)
-#define FDE_TEXTEDITMODE_Validate (1L << 8)
-#define FDE_TEXTEDITMODE_Password (1L << 9)
-
-#define FDE_TEXTEDITALIGN_Left (0L << 0)
-#define FDE_TEXTEDITALIGN_Center (1L << 0)
-#define FDE_TEXTEDITALIGN_Right (2L << 0)
-#define FDE_TEXTEDITALIGN_Normal (1L << 3)
-#define FDE_TEXTEDITALIGN_Justified (1L << 4)
-#define FDE_TEXTEDITALIGN_Distributed (1L << 5)
-
-#define FDE_TEXTEDITLAYOUT_DocVertical (1L << 0)
-#define FDE_TEXTEDITLAYOUT_CharVertial (1L << 1)
-#define FDE_TEXTEDITLAYOUT_LineReserve (1L << 2)
-#define FDE_TEXTEDITLAYOUT_RTL (1L << 3)
-#define FDE_TEXTEDITLAYOUT_CombText (1L << 4)
-#define FDE_TEXTEDITLAYOUT_ExpandTab (1L << 5)
-#define FDE_TEXTEDITLAYOUT_ArabicContext (1L << 6)
-#define FDE_TEXTEDITLAYOUT_ArabicShapes (1L << 7)
-#define FDE_TEXTEDITLAYOUT_LastLineHeight (1L << 8)
-
-enum FDE_TXTEDTMOVECARET {
-  MC_MoveNone = 0,
-  MC_Left,
-  MC_Right,
-  MC_Up,
-  MC_Down,
-  MC_WordBackward,
-  MC_WordForward,
-  MC_LineStart,
-  MC_LineEnd,
-  MC_ParagStart,
-  MC_ParagEnd,
-  MC_PageUp,
-  MC_PageDown,
-  MC_Home,
-  MC_End,
-};
-enum FDE_TXTEDT_MODIFY_RET {
-  FDE_TXTEDT_MODIFY_RET_F_Tab = -6,
-  FDE_TXTEDT_MODIFY_RET_F_Locked = -5,
-  FDE_TXTEDT_MODIFY_RET_F_Invalidate = -4,
-  FDE_TXTEDT_MODIFY_RET_F_Boundary = -3,
-  FDE_TXTEDT_MODIFY_RET_F_Full = -2,
-  FDE_TXTEDT_MODIFY_RET_F_Normal = -1,
-  FDE_TXTEDT_MODIFY_RET_S_Normal = 0,
-  FDE_TXTEDT_MODIFY_RET_S_Full = 1,
-  FDE_TXTEDT_MODIFY_RET_S_Part = 2,
-  FDE_TXTEDT_MODIFY_RET_S_Empty = 3,
-  FDE_TXTEDT_MODIFY_RET_T_Tab = 4,
-};
-enum FDE_TXTEDIT_LINEEND {
-  FDE_TXTEDIT_LINEEND_Auto,
-  FDE_TXTEDIT_LINEEND_CRLF,
-  FDE_TXTEDIT_LINEEND_CR,
-  FDE_TXTEDIT_LINEEND_LF,
-};
-struct _FDE_TXTEDTPARAMS {
-  _FDE_TXTEDTPARAMS()
-      : fPlateWidth(0),
-        fPlateHeight(0),
-        nLineCount(0),
-        dwLayoutStyles(0),
-        dwAlignment(0),
-        dwMode(0),
-        pFont(NULL),
-        fFontSize(10.0f),
-        dwFontColor(0xff000000),
-        fLineSpace(10.0f),
-        fTabWidth(36),
-        bTabEquidistant(FALSE),
-        wDefChar(0xFEFF),
-        wLineBreakChar('\n'),
-        nCharRotation(0),
-        nLineEnd(0),
-        nHorzScale(100),
-        fCharSpace(0),
-        pEventSink(NULL) {}
-  FX_FLOAT fPlateWidth;
-  FX_FLOAT fPlateHeight;
-  int32_t nLineCount;
-  FX_DWORD dwLayoutStyles;
-  FX_DWORD dwAlignment;
-  FX_DWORD dwMode;
-  IFX_Font* pFont;
-  FX_FLOAT fFontSize;
-  FX_ARGB dwFontColor;
-  FX_FLOAT fLineSpace;
-  FX_FLOAT fTabWidth;
-  FX_BOOL bTabEquidistant;
-  FX_WCHAR wDefChar;
-  FX_WCHAR wLineBreakChar;
-  int32_t nCharRotation;
-  int32_t nLineEnd;
-  int32_t nHorzScale;
-  FX_FLOAT fCharSpace;
-  IFDE_TxtEdtEventSink* pEventSink;
-};
-typedef _FDE_TXTEDTPARAMS FDE_TXTEDTPARAMS;
-typedef _FDE_TXTEDTPARAMS* FDE_LPTXTEDTPARAMS;
-enum FDE_TXTEDT_TEXTCHANGE_TYPE {
-  FDE_TXTEDT_TEXTCHANGE_TYPE_Insert = 0,
-  FDE_TXTEDT_TEXTCHANGE_TYPE_Delete,
-  FDE_TXTEDT_TEXTCHANGE_TYPE_Replace,
-};
-struct _FDE_TXTEDT_TEXTCHANGE_INFO {
-  int32_t nChangeType;
-  CFX_WideString wsInsert;
-  CFX_WideString wsDelete;
-  CFX_WideString wsPrevText;
-};
-typedef _FDE_TXTEDT_TEXTCHANGE_INFO FDE_TXTEDT_TEXTCHANGE_INFO;
-typedef _FDE_TXTEDT_TEXTCHANGE_INFO* FDE_LPTXTEDT_TEXTCHANGE_INFO;
-class IFDE_TxtEdtEventSink {
- public:
-  virtual ~IFDE_TxtEdtEventSink() {}
-  virtual void On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
-                               int32_t nPage,
-                               FX_BOOL bVisible = TRUE) = 0;
-  virtual void On_TextChanged(IFDE_TxtEdtEngine* pEdit,
-                              FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) = 0;
-  virtual void On_PageCountChanged(IFDE_TxtEdtEngine* pEdit) = 0;
-  virtual void On_SelChanged(IFDE_TxtEdtEngine* pEdit) = 0;
-  virtual FX_BOOL On_PageLoad(IFDE_TxtEdtEngine* pEdit,
-                              int32_t nPageIndex,
-                              int32_t nPurpose) = 0;
-  virtual FX_BOOL On_PageUnload(IFDE_TxtEdtEngine* pEdit,
-                                int32_t nPageIndex,
-                                int32_t nPurpose) = 0;
-  virtual FX_BOOL On_PageChange(IFDE_TxtEdtEngine* pEdit,
-                                int32_t nPageIndex) = 0;
-  virtual void On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
-                              const CFX_ByteStringC& bsDoRecord) = 0;
-  virtual FX_BOOL On_ValidateField(IFDE_TxtEdtEngine* pEdit,
-                                   int32_t nBlockIndex,
-                                   int32_t nFieldIndex,
-                                   const CFX_WideString& wsFieldText,
-                                   int32_t nCharIndex) = 0;
-  virtual FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
-                                   int32_t nBlockIndex) = 0;
-  virtual FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
-                                        int32_t nBlockIndex,
-                                        CFX_WideString& wsBlockText) = 0;
-  virtual FX_BOOL On_Validate(IFDE_TxtEdtEngine* pEdit,
-                              CFX_WideString& wsText) = 0;
-};
-class IFX_CharIter {
- public:
-  virtual ~IFX_CharIter() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE) = 0;
-  virtual FX_WCHAR GetChar() = 0;
-  virtual void SetAt(int32_t nIndex) = 0;
-  virtual int32_t GetAt() const = 0;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
-  virtual IFX_CharIter* Clone() = 0;
-};
-class IFDE_TxtEdtEngine {
- public:
-  static IFDE_TxtEdtEngine* Create();
-
-  virtual ~IFDE_TxtEdtEngine() {}
-  virtual void Release() = 0;
-  virtual void SetEditParams(const FDE_TXTEDTPARAMS& params) = 0;
-  virtual const FDE_TXTEDTPARAMS* GetEditParams() const = 0;
-
-  virtual int32_t CountPages() const = 0;
-  virtual IFDE_TxtEdtPage* GetPage(int32_t nIndex) = 0;
-  virtual FX_BOOL SetBufChunkSize(int32_t nChunkSize) = 0;
-  virtual void SetTextByStream(IFX_Stream* pStream) = 0;
-  virtual void SetText(const CFX_WideString& wsText) = 0;
-  virtual int32_t GetTextLength() const = 0;
-  virtual void GetText(CFX_WideString& wsText,
-                       int32_t nStart,
-                       int32_t nCount = -1) = 0;
-  virtual void ClearText() = 0;
-
-  virtual int32_t GetCaretRect(CFX_RectF& rtCaret) const = 0;
-  virtual int32_t GetCaretPos() const = 0;
-  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE) = 0;
-  virtual int32_t MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
-                               FX_BOOL bShift = FALSE,
-                               FX_BOOL bCtrl = FALSE) = 0;
-
-  virtual void Lock() = 0;
-  virtual void Unlock() = 0;
-  virtual FX_BOOL IsLocked() const = 0;
-
-  virtual int32_t Insert(int32_t nStart,
-                         const FX_WCHAR* lpText,
-                         int32_t nLength) = 0;
-  virtual int32_t Delete(int32_t nStart, FX_BOOL bBackspace = FALSE) = 0;
-  virtual int32_t DeleteRange(int32_t nStart, int32_t nCount = -1) = 0;
-  virtual int32_t Replace(int32_t nStart,
-                          int32_t nLength,
-                          const CFX_WideString& wsReplace) = 0;
-  virtual void SetLimit(int32_t nLimit) = 0;
-  virtual void SetAliasChar(FX_WCHAR wAlias) = 0;
-  virtual void AddSelRange(int32_t nStart, int32_t nCount = -1) = 0;
-  virtual int32_t CountSelRanges() = 0;
-  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart) = 0;
-  virtual void ClearSelection() = 0;
-
-  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRedo) = 0;
-  virtual FX_BOOL Undo(const CFX_ByteStringC& bsUndo) = 0;
-
-  virtual int32_t StartLayout() = 0;
-  virtual int32_t DoLayout(IFX_Pause* pPause) = 0;
-  virtual void EndLayout() = 0;
-
-  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL) = 0;
-  virtual int32_t CountParags() const = 0;
-  virtual IFDE_TxtEdtParag* GetParag(int32_t nParagIndex) const = 0;
-  virtual IFX_CharIter* CreateCharIter() = 0;
-};
-class IFDE_TxtEdtParag {
- public:
-  virtual ~IFDE_TxtEdtParag() {}
-  virtual int32_t GetTextLength() const = 0;
-  virtual int32_t GetStartIndex() const = 0;
-  virtual int32_t CountLines() const = 0;
-  virtual void GetLineRange(int32_t nLineIndex,
-                            int32_t& nStart,
-                            int32_t& nCount) const = 0;
-};
-
-#endif  // XFA_SRC_FEE_IFDE_TXTEDTENGINE_H_
diff --git a/xfa/src/fee/ifde_txtedtpage.h b/xfa/src/fee/ifde_txtedtpage.h
deleted file mode 100644
index f76498d..0000000
--- a/xfa/src/fee/ifde_txtedtpage.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FEE_IFDE_TXTEDTPAGE_H_
-#define XFA_SRC_FEE_IFDE_TXTEDTPAGE_H_
-
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fde/fde_visualset.h"
-#include "xfa/src/fgas/layout/fgas_textbreak.h"
-
-class IFDE_TxtEdtEngine;
-class IFDE_TxtEdtPage : public IFDE_CanvasSet, public IFX_TxtAccess {
- public:
-  static IFDE_TxtEdtPage* Create(IFDE_TxtEdtEngine* pEngine, int32_t nIndex);
-
-  virtual void Release() = 0;
-
-  virtual IFDE_TxtEdtEngine* GetEngine() const = 0;
-  virtual int32_t GetCharRect(int32_t nIndex,
-                              CFX_RectF& rect,
-                              FX_BOOL bBBox = FALSE) const = 0;
-  virtual int32_t GetCharIndex(const CFX_PointF& fPoint, FX_BOOL& bBefore) = 0;
-  virtual void CalcRangeRectArray(int32_t nStart,
-                                  int32_t nCount,
-                                  CFX_RectFArray& RectFArr) const = 0;
-  virtual int32_t SelectWord(const CFX_PointF& fPoint, int32_t& nCount) = 0;
-  virtual int32_t GetCharStart() const = 0;
-  virtual int32_t GetCharCount() const = 0;
-
-  virtual int32_t GetDisplayPos(const CFX_RectF& rtClip,
-                                FXTEXT_CHARPOS*& pCharPos,
-                                CFX_RectF* pBBox) const = 0;
-  virtual FX_BOOL IsLoaded(const CFX_RectF* pClipBox) = 0;
-  virtual int32_t LoadPage(const CFX_RectF* pClipBox, IFX_Pause* pPause) = 0;
-  virtual void UnloadPage(const CFX_RectF* pClipBox) = 0;
-  virtual const CFX_RectF& GetContentsBox() = 0;
-};
-
-#endif  // XFA_SRC_FEE_IFDE_TXTEDTPAGE_H_
diff --git a/xfa/src/fgas/crt/fgas_algorithm.cpp b/xfa/src/fgas/crt/fgas_algorithm.cpp
deleted file mode 100644
index 60b43ac..0000000
--- a/xfa/src/fgas/crt/fgas_algorithm.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-
-#include "core/include/fxcrt/fx_basic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-static const FX_CHAR g_FXBase64EncoderMap[64] = {
-    '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',
-    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
-};
-
-struct FX_BASE64DATA {
-  FX_DWORD data1 : 2;
-  FX_DWORD data2 : 6;
-  FX_DWORD data3 : 4;
-  FX_DWORD data4 : 4;
-  FX_DWORD data5 : 6;
-  FX_DWORD data6 : 2;
-  FX_DWORD data7 : 8;
-};
-
-static void FX_Base64EncodePiece(const FX_BASE64DATA& src,
-                                 int32_t iBytes,
-                                 FX_CHAR dst[4]) {
-  dst[0] = g_FXBase64EncoderMap[src.data2];
-  FX_DWORD b = src.data1 << 4;
-  if (iBytes > 1) {
-    b |= src.data4;
-  }
-  dst[1] = g_FXBase64EncoderMap[b];
-  if (iBytes > 1) {
-    b = src.data3 << 2;
-    if (iBytes > 2) {
-      b |= src.data6;
-    }
-    dst[2] = g_FXBase64EncoderMap[b];
-    if (iBytes > 2) {
-      dst[3] = g_FXBase64EncoderMap[src.data5];
-    } else {
-      dst[3] = '=';
-    }
-  } else {
-    dst[2] = dst[3] = '=';
-  }
-}
-int32_t FX_Base64EncodeA(const uint8_t* pSrc, int32_t iSrcLen, FX_CHAR* pDst) {
-  FXSYS_assert(pSrc != NULL);
-  if (iSrcLen < 1) {
-    return 0;
-  }
-  if (pDst == NULL) {
-    int32_t iDstLen = iSrcLen / 3 * 4;
-    if ((iSrcLen % 3) != 0) {
-      iDstLen += 4;
-    }
-    return iDstLen;
-  }
-  FX_BASE64DATA srcData;
-  int32_t iBytes = 3;
-  FX_CHAR* pDstEnd = pDst;
-  while (iSrcLen > 0) {
-    if (iSrcLen > 2) {
-      ((uint8_t*)&srcData)[0] = *pSrc++;
-      ((uint8_t*)&srcData)[1] = *pSrc++;
-      ((uint8_t*)&srcData)[2] = *pSrc++;
-      iSrcLen -= 3;
-    } else {
-      *((FX_DWORD*)&srcData) = 0;
-      ((uint8_t*)&srcData)[0] = *pSrc++;
-      if (iSrcLen > 1) {
-        ((uint8_t*)&srcData)[1] = *pSrc++;
-      }
-      iBytes = iSrcLen;
-      iSrcLen = 0;
-    }
-    FX_Base64EncodePiece(srcData, iBytes, pDstEnd);
-    pDstEnd += 4;
-  }
-  return pDstEnd - pDst;
-}
-
-static const uint8_t g_FXBase64DecoderMap[256] = {
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F,
-    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
-    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
-    0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,
-    0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
-    0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF,
-};
-static void FX_Base64DecodePiece(const FX_CHAR src[4],
-                                 int32_t iChars,
-                                 FX_BASE64DATA& dst,
-                                 int32_t& iBytes) {
-  FXSYS_assert(iChars > 0 && iChars < 5);
-  iBytes = 1;
-  dst.data2 = g_FXBase64DecoderMap[(uint8_t)src[0]];
-  if (iChars > 1) {
-    uint8_t b = g_FXBase64DecoderMap[(uint8_t)src[1]];
-    dst.data1 = b >> 4;
-    dst.data4 = b;
-    if (iChars > 2) {
-      iBytes = 2;
-      b = g_FXBase64DecoderMap[(uint8_t)src[2]];
-      dst.data3 = b >> 2;
-      dst.data6 = b;
-      if (iChars > 3) {
-        iBytes = 3;
-        dst.data5 = g_FXBase64DecoderMap[(uint8_t)src[3]];
-      } else {
-        dst.data5 = 0;
-      }
-    } else {
-      dst.data3 = 0;
-    }
-  } else {
-    dst.data1 = 0;
-  }
-}
-int32_t FX_Base64DecodeA(const FX_CHAR* pSrc, int32_t iSrcLen, uint8_t* pDst) {
-  FXSYS_assert(pSrc != NULL);
-  if (iSrcLen < 1) {
-    return 0;
-  }
-  while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') {
-    iSrcLen--;
-  }
-  if (iSrcLen < 1) {
-    return 0;
-  }
-  if (pDst == NULL) {
-    int32_t iDstLen = iSrcLen / 4 * 3;
-    iSrcLen %= 4;
-    if (iSrcLen == 1) {
-      iDstLen += 1;
-    } else if (iSrcLen == 2) {
-      iDstLen += 1;
-    } else if (iSrcLen == 3) {
-      iDstLen += 2;
-    }
-    return iDstLen;
-  }
-  FX_CHAR srcData[4];
-  FX_BASE64DATA dstData;
-  int32_t iChars = 4, iBytes;
-  uint8_t* pDstEnd = pDst;
-  while (iSrcLen > 0) {
-    if (iSrcLen > 3) {
-      *((FX_DWORD*)srcData) = *((FX_DWORD*)pSrc);
-      pSrc += 4;
-      iSrcLen -= 4;
-    } else {
-      *((FX_DWORD*)&dstData) = 0;
-      *((FX_DWORD*)srcData) = 0;
-      srcData[0] = *pSrc++;
-      if (iSrcLen > 1) {
-        srcData[1] = *pSrc++;
-      }
-      if (iSrcLen > 2) {
-        srcData[2] = *pSrc++;
-      }
-      iChars = iSrcLen;
-      iSrcLen = 0;
-    }
-    FX_Base64DecodePiece(srcData, iChars, dstData, iBytes);
-    *pDstEnd++ = ((uint8_t*)&dstData)[0];
-    if (iBytes > 1) {
-      *pDstEnd++ = ((uint8_t*)&dstData)[1];
-    }
-    if (iBytes > 2) {
-      *pDstEnd++ = ((uint8_t*)&dstData)[2];
-    }
-  }
-  return pDstEnd - pDst;
-}
-int32_t FX_Base64DecodeW(const FX_WCHAR* pSrc, int32_t iSrcLen, uint8_t* pDst) {
-  FXSYS_assert(pSrc != NULL);
-  if (iSrcLen < 1) {
-    return 0;
-  }
-  while (iSrcLen > 0 && pSrc[iSrcLen - 1] == '=') {
-    iSrcLen--;
-  }
-  if (iSrcLen < 1) {
-    return 0;
-  }
-  if (pDst == NULL) {
-    int32_t iDstLen = iSrcLen / 4 * 3;
-    iSrcLen %= 4;
-    if (iSrcLen == 1) {
-      iDstLen += 1;
-    } else if (iSrcLen == 2) {
-      iDstLen += 1;
-    } else if (iSrcLen == 3) {
-      iDstLen += 2;
-    }
-    return iDstLen;
-  }
-  FX_CHAR srcData[4];
-  FX_BASE64DATA dstData;
-  int32_t iChars = 4, iBytes;
-  uint8_t* pDstEnd = pDst;
-  while (iSrcLen > 0) {
-    if (iSrcLen > 3) {
-      srcData[0] = (FX_CHAR)*pSrc++;
-      srcData[1] = (FX_CHAR)*pSrc++;
-      srcData[2] = (FX_CHAR)*pSrc++;
-      srcData[3] = (FX_CHAR)*pSrc++;
-      iSrcLen -= 4;
-    } else {
-      *((FX_DWORD*)&dstData) = 0;
-      *((FX_DWORD*)srcData) = 0;
-      srcData[0] = (FX_CHAR)*pSrc++;
-      if (iSrcLen > 1) {
-        srcData[1] = (FX_CHAR)*pSrc++;
-      }
-      if (iSrcLen > 2) {
-        srcData[2] = (FX_CHAR)*pSrc++;
-      }
-      iChars = iSrcLen;
-      iSrcLen = 0;
-    }
-    FX_Base64DecodePiece(srcData, iChars, dstData, iBytes);
-    *pDstEnd++ = ((uint8_t*)&dstData)[0];
-    if (iBytes > 1) {
-      *pDstEnd++ = ((uint8_t*)&dstData)[1];
-    }
-    if (iBytes > 2) {
-      *pDstEnd++ = ((uint8_t*)&dstData)[2];
-    }
-  }
-  return pDstEnd - pDst;
-}
-
-static const uint8_t g_FXHex2DecMap[256] = {
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  1,  2,  3, 4, 5, 6, 7, 8, 9,  0,  0,
-    0,  0,  0,  0, 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 10, 11, 12,
-    13, 14, 15, 0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0,  0,  0,
-    0,  0,  0,  0, 0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0,
-};
-uint8_t FX_Hex2Dec(uint8_t hexHigh, uint8_t hexLow) {
-  return (g_FXHex2DecMap[hexHigh] << 4) + g_FXHex2DecMap[hexLow];
-}
-int32_t FX_SeparateStringW(const FX_WCHAR* pStr,
-                           int32_t iStrLen,
-                           FX_WCHAR delimiter,
-                           CFX_WideStringArray& pieces) {
-  if (pStr == NULL) {
-    return 0;
-  }
-  if (iStrLen < 0) {
-    iStrLen = FXSYS_wcslen(pStr);
-  }
-  const FX_WCHAR* pToken = pStr;
-  const FX_WCHAR* pEnd = pStr + iStrLen;
-  while (TRUE) {
-    if (pStr >= pEnd || delimiter == *pStr) {
-      CFX_WideString sub(pToken, pStr - pToken);
-      pieces.Add(sub);
-      pToken = pStr + 1;
-      if (pStr >= pEnd) {
-        break;
-      }
-    }
-    pStr++;
-  }
-  return pieces.GetSize();
-}
-#ifdef __cplusplus
-}
-#endif
diff --git a/xfa/src/fgas/crt/fgas_algorithm.h b/xfa/src/fgas/crt/fgas_algorithm.h
deleted file mode 100644
index f819716..0000000
--- a/xfa/src/fgas/crt/fgas_algorithm.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_ALGORITHM_H_
-#define XFA_SRC_FGAS_CRT_FGAS_ALGORITHM_H_
-
-#include <cstdint>
-
-#include "core/include/fxcrt/fx_basic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int32_t FX_Base64EncodeA(const uint8_t* pSrc, int32_t iSrcLen, FX_CHAR* pDst);
-int32_t FX_Base64DecodeA(const FX_CHAR* pSrc, int32_t iSrcLen, uint8_t* pDst);
-int32_t FX_Base64DecodeW(const FX_WCHAR* pSrc, int32_t iSrcLen, uint8_t* pDst);
-uint8_t FX_Hex2Dec(uint8_t hexHigh, uint8_t hexLow);
-int32_t FX_SeparateStringW(const FX_WCHAR* pStr,
-                           int32_t iStrLen,
-                           FX_WCHAR delimiter,
-                           CFX_WideStringArray& pieces);
-#ifdef __cplusplus
-};
-#endif
-
-template <class baseType>
-class CFX_DSPATemplate {
- public:
-  int32_t Lookup(const baseType& find, const baseType* pArray, int32_t iCount) {
-    FXSYS_assert(pArray != NULL);
-    if (iCount < 1) {
-      return -1;
-    }
-    int32_t iStart = 0, iEnd = iCount - 1, iMid;
-    do {
-      iMid = (iStart + iEnd) / 2;
-      const baseType& v = pArray[iMid];
-      if (find == v) {
-        return iMid;
-      } else if (find < v) {
-        iEnd = iMid - 1;
-      } else {
-        iStart = iMid + 1;
-      }
-    } while (iStart <= iEnd);
-    return -1;
-  }
-};
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_ALGORITHM_H_
diff --git a/xfa/src/fgas/crt/fgas_codepage.cpp b/xfa/src/fgas/crt/fgas_codepage.cpp
deleted file mode 100644
index 622c417..0000000
--- a/xfa/src/fgas/crt/fgas_codepage.cpp
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/crt/fgas_language.h"
-
-static const FX_CHARSET_MAP g_FXCharset2CodePageTable[] = {
-    {0, 1252},   {1, 0},      {2, 42},     {77, 10000}, {78, 10001},
-    {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005}, {84, 10004},
-    {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029}, {89, 10007},
-    {128, 932},  {129, 949},  {130, 1361}, {134, 936},  {136, 950},
-    {161, 1253}, {162, 1254}, {163, 1258}, {177, 1255}, {178, 1256},
-    {186, 1257}, {204, 1251}, {222, 874},  {238, 1250}, {254, 437},
-    {255, 850},
-};
-FX_WORD FX_GetCodePageFromCharset(uint8_t charset) {
-  int32_t iEnd = sizeof(g_FXCharset2CodePageTable) / sizeof(FX_CHARSET_MAP) - 1;
-  FXSYS_assert(iEnd >= 0);
-  int32_t iStart = 0, iMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    const FX_CHARSET_MAP& cp = g_FXCharset2CodePageTable[iMid];
-    if (charset == cp.charset) {
-      return cp.codepage;
-    } else if (charset < cp.charset) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return 0xFFFF;
-}
-static const FX_CHARSET_MAP g_FXCodepage2CharsetTable[] = {
-    {1, 0},      {2, 42},     {254, 437},  {255, 850},  {222, 874},
-    {128, 932},  {134, 936},  {129, 949},  {136, 950},  {238, 1250},
-    {204, 1251}, {0, 1252},   {161, 1253}, {162, 1254}, {177, 1255},
-    {178, 1256}, {186, 1257}, {163, 1258}, {130, 1361}, {77, 10000},
-    {78, 10001}, {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005},
-    {84, 10004}, {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029},
-    {89, 10007},
-};
-FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage) {
-  int32_t iEnd = sizeof(g_FXCodepage2CharsetTable) / sizeof(FX_CHARSET_MAP) - 1;
-  FXSYS_assert(iEnd >= 0);
-  int32_t iStart = 0, iMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    const FX_CHARSET_MAP& cp = g_FXCodepage2CharsetTable[iMid];
-    if (codepage == cp.codepage) {
-      return cp.charset;
-    } else if (codepage < cp.codepage) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return 0xFFFF;
-}
-const FX_LANG2CPMAP g_FXLang2CodepageTable[] = {
-    {FX_LANG_Arabic_SaudiArabia, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Bulgarian_Bulgaria, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Catalan_Catalan, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Chinese_Taiwan, FX_CODEPAGE_ChineseTraditional},
-    {FX_LANG_CzechRepublic, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Danish_Denmark, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_German_Germany, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Greek_Greece, FX_CODEPAGE_MSWin_Greek},
-    {FX_LANG_English_UnitedStates, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_TraditionalSort, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Finnish_Finland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_France, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Hebrew_Israel, FX_CODEPAGE_MSWin_Hebrew},
-    {FX_LANG_Hungarian_Hungary, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Icelandic_Iceland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Italian_Italy, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Japanese_Japan, FX_CODEPAGE_ShiftJIS},
-    {FX_LANG_Korean_Korea, FX_CODEPAGE_Korean},
-    {FX_LANG_Dutch_Netherlands, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Norwegian_Bokmal, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Polish_Poland, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Portuguese_Brazil, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Romanian_Romania, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Russian_Russia, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Croatian_Croatia, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Slovak_Slovakia, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Albanian_Albania, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Swedish_Sweden, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Thai_Thailand, FX_CODEPAGE_MSDOS_Thai},
-    {FX_LANG_Turkish_Turkey, FX_CODEPAGE_MSWin_Turkish},
-    {FX_LANG_Urdu_Pakistan, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Indonesian_Indonesia, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Ukrainian_Ukraine, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Belarusian_Belarus, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Slovenian_Slovenia, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Estonian_Estonia, FX_CODEPAGE_MSWin_Baltic},
-    {FX_LANG_Latvian_Latvia, FX_CODEPAGE_MSWin_Baltic},
-    {FX_LANG_Lithuanian_Lithuania, FX_CODEPAGE_MSWin_Baltic},
-    {FX_LANG_Persian, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Vietnamese_Vietnam, FX_CODEPAGE_MSWin_Vietnamese},
-    {FX_LANG_Armenian_Armenia, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Azerbaijan_Latin, FX_CODEPAGE_MSWin_Turkish},
-    {FX_LANG_Basque_Basque, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Macedonian, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Afrikaans_SouthAfrica, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Georgian_Georgia, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Faroese_FaroeIslands, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Hindi_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Malay_Malaysia, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Kazakh_Kazakhstan, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Kyrgyz_Kyrgyzstan, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Kiswahili_Kenya, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Uzbek_LatinUzbekistan, FX_CODEPAGE_MSWin_Turkish},
-    {FX_LANG_Tatar_Russia, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Punjabi_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Gujarati_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Tamil_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Telugu_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Kannada_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Marathi_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_SanskritIndia, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Mongolian_CyrillicMongolia, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Galician_Galician, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Konkani_India, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Syriac_Syria, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Divehi_Maldives, FX_CODEPAGE_DefANSI},
-    {FX_LANG_Arabic_Iraq, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Chinese_PRC, FX_CODEPAGE_ChineseSimplified},
-    {FX_LANG_German_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_English_UnitedKingdom, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Mexico, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_Belgium, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Italian_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Dutch_Belgium, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Norwegian_Nynorsk, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Portuguese_Portugal, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_SerbianLatin_Serbia, FX_CODEPAGE_MSWin_EasternEuropean},
-    {FX_LANG_Swedish_Finland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Azerbaijan_Cyrillic, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Malay_BruneiDarussalam, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Uzbek_CyrillicUzbekistan, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Arabic_Egypt, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Chinese_HongKong, FX_CODEPAGE_ChineseTraditional},
-    {FX_LANG_German_Austria, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_English_Australia, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_InternationalSort, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_Canada, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_SerbianCyrillic_Serbia, FX_CODEPAGE_MSWin_Cyrillic},
-    {FX_LANG_Arabic_Libya, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Chinese_Singapore, FX_CODEPAGE_ChineseSimplified},
-    {FX_LANG_German_Luxembourg, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_English_Canada, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Guatemala, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_Switzerland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Algeria, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Chinese_Macao, FX_CODEPAGE_ChineseTraditional},
-    {FX_LANG_German_Liechtenstein, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_English_NewZealand, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_CostaRica, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_Luxembourg, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Morocco, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Ireland, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Panama, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_French_Monaco, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Tunisia, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_SouthAfrica, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_DominicanRepublic, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Oman, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Jamaica, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Venezuela, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Yemen, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Caribbean, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Colombia, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Syria, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Belize, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Peru, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Jordan, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_TrinidadTobago, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Argentina, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Lebanon, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Zimbabwe, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Ecuador, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Kuwait, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_English_Philippines, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Chile, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_UAE, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Spanish_Uruguay, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Bahrain, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Spanish_Paraguay, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Arabic_Qatar, FX_CODEPAGE_MSWin_Arabic},
-    {FX_LANG_Spanish_Bolivia, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_ElSalvador, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Honduras, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_Nicaragua, FX_CODEPAGE_MSWin_WesternEuropean},
-    {FX_LANG_Spanish_PuertoRico, FX_CODEPAGE_MSWin_WesternEuropean},
-};
-FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage) {
-  int32_t iEnd = sizeof(g_FXLang2CodepageTable) / sizeof(FX_LANG2CPMAP) - 1;
-  FXSYS_assert(iEnd >= 0);
-  int32_t iStart = 0, iMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    const FX_LANG2CPMAP& cp = g_FXLang2CodepageTable[iMid];
-    if (wLanguage == cp.wLanguage) {
-      return cp.wCodepage;
-    } else if (wLanguage < cp.wLanguage) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return 0xFFFF;
-}
-static const FX_STR2CPHASH g_FXCPHashTable[] = {
-    {0xd45, 0x6faf},      {0xd46, 0x6fb0},      {0xd47, 0x6fb1},
-    {0xd48, 0x6fb2},      {0xd49, 0x4e6},       {0xd4d, 0x6fbd},
-    {0xe9e, 0x4e4},       {0xc998, 0x1b5},      {0x18ef0, 0x3a8},
-    {0x19f85, 0x5182},    {0x2e2335, 0x3b6},    {0x325153, 0x5182},
-    {0x145bded, 0x2716},  {0x3c9a5f2, 0xc6f3},  {0x4c45f2d, 0x3a4},
-    {0x4c45f4e, 0xc431},  {0x58caf51, 0x4e4},   {0x5a5cd7d, 0x3a8},
-    {0x5a6c6a7, 0x4e4},   {0x5a6ca0b, 0x1b5},   {0x5a6cd68, 0x307},
-    {0x5a6d8d3, 0x4e4},   {0x5a6d948, 0x354},   {0x5a6d96b, 0x362},
-    {0x5a6d984, 0x366},   {0x5a90e35, 0x1b5},   {0x5e0cf00, 0x6fb5},
-    {0x609c324, 0x551},   {0x617d97f, 0x5182},  {0x6a6fd91, 0xfde8},
-    {0x6a6fd92, 0xfde9},  {0x6b102de, 0xcadc},  {0x6b10f48, 0x4e89},
-    {0x1020805f, 0x4e4},  {0x10f0524c, 0x6fb5}, {0x11d558fe, 0x6fb0},
-    {0x13898d19, 0xc42d}, {0x13898d3a, 0xc431}, {0x138a319e, 0x6fb1},
-    {0x14679c09, 0x96c6}, {0x153f0a3d, 0x6fb2}, {0x1576eeb3, 0x4e20},
-    {0x169a0ce6, 0xc6f9}, {0x16f3e2dc, 0x6fb3}, {0x18a8bb7a, 0x6fb4},
-    {0x1a5d9419, 0x6fb5}, {0x1a847b48, 0x3a8},  {0x1b762419, 0xcec8},
-    {0x1b9d7847, 0x475},  {0x1c126cb9, 0x6fb6}, {0x1ccdbc7d, 0x4f42},
-    {0x1d330f5f, 0x2714}, {0x1dc74559, 0x4e6},  {0x1edd80da, 0x4e4},
-    {0x23e4b03d, 0xfde8}, {0x24f28a16, 0x4f3d}, {0x286e7a32, 0x2715},
-    {0x2c7c18ed, 0x3a8},  {0x2e2103b7, 0x2713}, {0x304bf479, 0x6fb4},
-    {0x304bf47d, 0x6fb5}, {0x309bb869, 0xfde8}, {0x309bb86a, 0xfde9},
-    {0x33664357, 0x3b6},  {0x352d6b49, 0x3a4},  {0x36f5661c, 0x1b5},
-    {0x392e8f48, 0xcadc}, {0x3dc7c64c, 0x47c},  {0x3ed2e8e1, 0x4e4},
-    {0x3f0c2fea, 0xcaed}, {0x3f0fef8f, 0xc6f2}, {0x3f5e130f, 0x5182},
-    {0x47174d1f, 0x3a8},  {0x49686b7b, 0x6fb4}, {0x4b80b0d9, 0x3a4},
-    {0x4dcda97a, 0x4e4},  {0x4dcda9b6, 0x4e4},  {0x4e881e6a, 0x5221},
-    {0x4ffdf5a1, 0x36a},  {0x4ffdf5a5, 0x6fbd}, {0x5241ce16, 0x4e8b},
-    {0x546bab9d, 0x4e4},  {0x54a3d64e, 0x6fb6}, {0x562179bd, 0x5161},
-    {0x57c1df15, 0xc6f7}, {0x61ff6e62, 0x4f36}, {0x6359c7d8, 0x4f35},
-    {0x63f3c335, 0x3a8},  {0x645a0f78, 0x477},  {0x691ac2fd, 0x275f},
-    {0x6dc2eab0, 0x2d0},  {0x6dc2eeef, 0x35e},  {0x6dc2ef10, 0x36a},
-    {0x7103138a, 0x47d},  {0x710dfbd0, 0xc6f5}, {0x7319f6cb, 0x36a},
-    {0x745096ad, 0x3a8},  {0x74866229, 0x4e8c}, {0x77185fa5, 0x3a8},
-    {0x7953f002, 0x6faf}, {0x7953f003, 0x6fb0}, {0x7953f004, 0x6fb1},
-    {0x7953f005, 0x6fb2}, {0x7953f006, 0x6fb7}, {0x7953f00a, 0x6fbd},
-    {0x7c577571, 0x2761}, {0x7e8c8ff1, 0x479},  {0x8031f47f, 0x3b5},
-    {0x8031f481, 0x3b5},  {0x80c4a710, 0x5187}, {0x857c7e14, 0xfde8},
-    {0x857c7e15, 0xfde9}, {0x86b59c90, 0x4e4},  {0x86b59c91, 0x6fb0},
-    {0x86b59c92, 0x6fb1}, {0x86b59c93, 0x6fb2}, {0x86b59c94, 0x6fb3},
-    {0x86b59c95, 0x6fb4}, {0x86b59c96, 0x6fb5}, {0x86b59c97, 0x4e7},
-    {0x86b59c98, 0x4e6},  {0x8b4b24ec, 0x5190}, {0x8face362, 0x4e4},
-    {0x8ff9ec2a, 0xfde9}, {0x919d3989, 0xcadc}, {0x9967e5ad, 0x4e22},
-    {0x99f8b933, 0x6fbd}, {0x9bd2a380, 0x4fc7}, {0x9befad23, 0x4f38},
-    {0x9c7ac649, 0x4f3c}, {0xa02468db, 0xdeae}, {0xa02468ec, 0xdeab},
-    {0xa024692a, 0xdeaa}, {0xa0246997, 0xdeb2}, {0xa02469ff, 0xdeb0},
-    {0xa0246a3d, 0xdeb1}, {0xa0246a8c, 0xdeaf}, {0xa0246a9a, 0xdeb3},
-    {0xa0246b16, 0xdeac}, {0xa0246b1a, 0xdead}, {0xa071addc, 0x4b1},
-    {0xa38b62dc, 0x474},  {0xa4c09fed, 0x3a8},  {0xa51e86e5, 0x4e7},
-    {0xa67ab13e, 0x3a4},  {0xa7414244, 0x51a9}, {0xa9ddbead, 0xc6fb},
-    {0xab24ffab, 0x4e8a}, {0xabef8ac4, 0x2710}, {0xabfa20ac, 0x6fb4},
-    {0xad36895e, 0x4e2},  {0xad36895f, 0x4e3},  {0xaf310e90, 0x402},
-    {0xaf31166f, 0x4e8},  {0xaf7277a5, 0x3b6},  {0xafc0d8b3, 0x96c6},
-    {0xb0fd5dba, 0xcae0}, {0xb0fd5e95, 0xcadc}, {0xb1052893, 0x7149},
-    {0xb1e98745, 0x36a},  {0xb277e91c, 0x5166}, {0xb2f7eac5, 0xcae0},
-    {0xb2f7eba0, 0xcadc}, {0xb2f7ebc1, 0x3b5},  {0xb53fa77d, 0x3a8},
-    {0xb6391138, 0x6fb5}, {0xb7358b7f, 0x6fb6}, {0xb8c42b40, 0x4e4},
-    {0xb8c42ea4, 0x1b5},  {0xb8c439e7, 0x2e1},  {0xb8c43a61, 0x307},
-    {0xb8c43d6c, 0x4e4},  {0xb8c43ddf, 0x352},  {0xb8c43de1, 0x354},
-    {0xb8c43de6, 0x359},  {0xb8c43dff, 0x35d},  {0xb8c43e04, 0x362},
-    {0xb8c43e07, 0x365},  {0xbcd29a7f, 0x3a8},  {0xbce34e78, 0x5182},
-    {0xbce34e7b, 0x556a}, {0xbce81504, 0x3b5},  {0xbd8a4c95, 0x272d},
-    {0xbdd89dad, 0x4e4},  {0xbdd89dae, 0x6fb0}, {0xbdd89daf, 0x6fb1},
-    {0xbdd89db0, 0x6fb2}, {0xbdd89db1, 0x4e6},  {0xbdd89db5, 0x6fbd},
-    {0xc1756e9f, 0x36b},  {0xc7482444, 0x47a},  {0xc9281c18, 0x4e4},
-    {0xc9ef95df, 0x47b},  {0xccc9db0d, 0x4e4},  {0xccc9db0e, 0x6fb0},
-    {0xcd73425f, 0x3b6},  {0xce38b40b, 0x4b0},  {0xce99e549, 0x25},
-    {0xcf598740, 0x4e7},  {0xcf6d6f78, 0x4e4},  {0xcf758df6, 0x3a4},
-    {0xd1266e51, 0x6fb5}, {0xd2910213, 0x2718}, {0xd29196bb, 0x2712},
-    {0xd3eb2fc2, 0x476},  {0xd442dc2c, 0x4fc4}, {0xd9da4da4, 0x2711},
-    {0xdbad2f42, 0x4e4},  {0xdbad2f43, 0x6fb0}, {0xdbad2f44, 0x6fb1},
-    {0xdbad2f45, 0x6fb2}, {0xdbad2f46, 0x6fb3}, {0xdbad2f47, 0x6fb4},
-    {0xdbad2f48, 0x6fb5}, {0xdbad2f49, 0x6fb6}, {0xdbad2f4a, 0x4e6},
-    {0xdc438033, 0x4f31}, {0xdccb439b, 0x477},  {0xdccdc626, 0x3b5},
-    {0xdd80a595, 0x4e4},  {0xdd80a596, 0x6fb0}, {0xdd80a59e, 0x6fb1},
-    {0xdd80a5b4, 0x6fb2}, {0xdd80a5d9, 0x6fb5}, {0xdd80a5da, 0x6fb4},
-    {0xdd80a5fa, 0x6fb6}, {0xdd80a615, 0x6fb3}, {0xdd80a619, 0x4e6},
-    {0xdd80a61a, 0x3b5},  {0xdd80c0f8, 0x4e9f}, {0xdf7e46ff, 0x4fc8},
-    {0xdf8680fd, 0x556a}, {0xdfb0bd6e, 0xc42d}, {0xdff05486, 0x2c4},
-    {0xe3323399, 0x3a4},  {0xe60412dd, 0x3b5},  {0xeee47add, 0x4b0},
-    {0xf021a186, 0x4e2},  {0xf021a187, 0x4e3},  {0xf021a188, 0x4e4},
-    {0xf021a189, 0x4e5},  {0xf021a18a, 0x4e6},  {0xf021a18b, 0x4e7},
-    {0xf021a18c, 0x4e8},  {0xf021a18d, 0x4e9},  {0xf021a18e, 0x4ea},
-    {0xf0700456, 0x6fb3}, {0xf274f175, 0x3b5},  {0xf2a9730b, 0x3a8},
-    {0xf3d463c2, 0x3a4},  {0xf52a70a3, 0xc42e}, {0xf5693147, 0x6fb3},
-    {0xf637e157, 0x478},  {0xfc213f3a, 0x2717}, {0xff654d14, 0x3b5},
-};
-FX_WORD FX_GetCodePageFromStringA(const FX_CHAR* pStr, int32_t iLength) {
-  FXSYS_assert(pStr != NULL);
-  if (iLength < 0) {
-    iLength = FXSYS_strlen(pStr);
-  }
-  if (iLength == 0) {
-    return 0xFFFF;
-  }
-  uint32_t uHash = FX_HashCode_String_GetA(pStr, iLength, TRUE);
-  int32_t iStart = 0, iMid;
-  int32_t iEnd = sizeof(g_FXCPHashTable) / sizeof(FX_STR2CPHASH) - 1;
-  FXSYS_assert(iEnd >= 0);
-  do {
-    iMid = (iStart + iEnd) / 2;
-    const FX_STR2CPHASH& cp = g_FXCPHashTable[iMid];
-    if (uHash == cp.uHash) {
-      return (FX_WORD)cp.uCodePage;
-    } else if (uHash < cp.uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return 0xFFFF;
-}
-FX_WORD FX_GetCodePageFormStringW(const FX_WCHAR* pStr, int32_t iLength) {
-  if (iLength < 0) {
-    iLength = FXSYS_wcslen(pStr);
-  }
-  if (iLength == 0) {
-    return 0xFFFF;
-  }
-  CFX_ByteString csStr;
-  FX_CHAR* pBuf = csStr.GetBuffer(iLength + 1);
-  for (int32_t i = 0; i < iLength; ++i) {
-    *pBuf++ = (FX_CHAR)*pStr++;
-  }
-  csStr.ReleaseBuffer(iLength);
-  return FX_GetCodePageFromStringA(csStr, iLength);
-}
diff --git a/xfa/src/fgas/crt/fgas_codepage.h b/xfa/src/fgas/crt/fgas_codepage.h
deleted file mode 100644
index e9111d1..0000000
--- a/xfa/src/fgas/crt/fgas_codepage.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_CODEPAGE_H_
-#define XFA_SRC_FGAS_CRT_FGAS_CODEPAGE_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-#define FX_CODEPAGE_DefANSI 0
-#define FX_CODEPAGE_DefOEM 1
-#define FX_CODEPAGE_DefMAC 2
-#define FX_CODEPAGE_Thread 3
-#define FX_CODEPAGE_Symbol 42
-#define FX_CODEPAGE_MSDOS_US 437
-#define FX_CODEPAGE_Arabic_ASMO708 708
-#define FX_CODEPAGE_Arabic_ASMO449Plus 709
-#define FX_CODEPAGE_Arabic_Transparent 710
-#define FX_CODEPAGE_Arabic_NafithaEnhanced 711
-#define FX_CODEPAGE_Arabic_TransparentASMO 720
-#define FX_CODEPAGE_MSDOS_Greek1 737
-#define FX_CODEPAGE_MSDOS_Baltic 775
-#define FX_CODEPAGE_MSWin31_WesternEuropean 819
-#define FX_CODEPAGE_MSDOS_WesternEuropean 850
-#define FX_CODEPAGE_MSDOS_EasternEuropean 852
-#define FX_CODEPAGE_MSDOS_Latin3 853
-#define FX_CODEPAGE_MSDOS_Cyrillic 855
-#define FX_CODEPAGE_MSDOS_Turkish 857
-#define FX_CODEPAGE_MSDOS_Latin1Euro 858
-#define FX_CODEPAGE_MSDOS_Portuguese 860
-#define FX_CODEPAGE_MSDOS_Icelandic 861
-#define FX_CODEPAGE_MSDOS_Hebrew 862
-#define FX_CODEPAGE_MSDOS_FrenchCanadian 863
-#define FX_CODEPAGE_MSDOS_Arabic 864
-#define FX_CODEPAGE_MSDOS_Norwegian 865
-#define FX_CODEPAGE_MSDOS_Russian 866
-#define FX_CODEPAGE_MSDOS_Greek2 869
-#define FX_CODEPAGE_MSDOS_Thai 874
-#define FX_CODEPAGE_MSDOS_KamenickyCS 895
-#define FX_CODEPAGE_ShiftJIS 932
-#define FX_CODEPAGE_ChineseSimplified 936
-#define FX_CODEPAGE_Korean 949
-#define FX_CODEPAGE_ChineseTraditional 950
-#define FX_CODEPAGE_UTF16LE 1200
-#define FX_CODEPAGE_UTF16BE 1201
-#define FX_CODEPAGE_MSWin_EasternEuropean 1250
-#define FX_CODEPAGE_MSWin_Cyrillic 1251
-#define FX_CODEPAGE_MSWin_WesternEuropean 1252
-#define FX_CODEPAGE_MSWin_Greek 1253
-#define FX_CODEPAGE_MSWin_Turkish 1254
-#define FX_CODEPAGE_MSWin_Hebrew 1255
-#define FX_CODEPAGE_MSWin_Arabic 1256
-#define FX_CODEPAGE_MSWin_Baltic 1257
-#define FX_CODEPAGE_MSWin_Vietnamese 1258
-#define FX_CODEPAGE_Johab 1361
-#define FX_CODEPAGE_MAC_Roman 10000
-#define FX_CODEPAGE_MAC_ShiftJIS 10001
-#define FX_CODEPAGE_MAC_ChineseTraditional 10002
-#define FX_CODEPAGE_MAC_Korean 10003
-#define FX_CODEPAGE_MAC_Arabic 10004
-#define FX_CODEPAGE_MAC_Hebrew 10005
-#define FX_CODEPAGE_MAC_Greek 10006
-#define FX_CODEPAGE_MAC_Cyrillic 10007
-#define FX_CODEPAGE_MAC_ChineseSimplified 10008
-#define FX_CODEPAGE_MAC_Thai 10021
-#define FX_CODEPAGE_MAC_EasternEuropean 10029
-#define FX_CODEPAGE_MAC_Turkish 10081
-#define FX_CODEPAGE_UTF32LE 12000
-#define FX_CODEPAGE_UTF32BE 12001
-#define FX_CODEPAGE_ISO8859_1 28591
-#define FX_CODEPAGE_ISO8859_2 28592
-#define FX_CODEPAGE_ISO8859_3 28593
-#define FX_CODEPAGE_ISO8859_4 28594
-#define FX_CODEPAGE_ISO8859_5 28595
-#define FX_CODEPAGE_ISO8859_6 28596
-#define FX_CODEPAGE_ISO8859_7 28597
-#define FX_CODEPAGE_ISO8859_8 28598
-#define FX_CODEPAGE_ISO8859_9 28599
-#define FX_CODEPAGE_ISO8859_10 28600
-#define FX_CODEPAGE_ISO8859_11 28601
-#define FX_CODEPAGE_ISO8859_12 28602
-#define FX_CODEPAGE_ISO8859_13 28603
-#define FX_CODEPAGE_ISO8859_14 28604
-#define FX_CODEPAGE_ISO8859_15 28605
-#define FX_CODEPAGE_ISO8859_16 28606
-#define FX_CODEPAGE_ISCII_Devanagari 57002
-#define FX_CODEPAGE_ISCII_Bengali 57003
-#define FX_CODEPAGE_ISCII_Tamil 57004
-#define FX_CODEPAGE_ISCII_Telugu 57005
-#define FX_CODEPAGE_ISCII_Assamese 57006
-#define FX_CODEPAGE_ISCII_Oriya 57007
-#define FX_CODEPAGE_ISCII_Kannada 57008
-#define FX_CODEPAGE_ISCII_Malayalam 57009
-#define FX_CODEPAGE_ISCII_Gujarati 57010
-#define FX_CODEPAGE_ISCII_Punjabi 57011
-#define FX_CODEPAGE_UTF7 65000
-#define FX_CODEPAGE_UTF8 65001
-#define FX_CHARSET_ANSI 0
-#define FX_CHARSET_Default 1
-#define FX_CHARSET_Symbol 2
-#define FX_CHARSET_MAC_Roman 77
-#define FX_CHARSET_MAC_ShiftJIS 78
-#define FX_CHARSET_MAC_Korean 79
-#define FX_CHARSET_MAC_ChineseSimplified 80
-#define FX_CHARSET_MAC_ChineseTriditional 81
-#define FX_CHARSET_MAC_Johab 82
-#define FX_CHARSET_MAC_Hebrew 83
-#define FX_CHARSET_MAC_Arabic 84
-#define FX_CHARSET_MAC_Greek 85
-#define FX_CHARSET_MAC_Turkish 86
-#define FX_CHARSET_MAC_Thai 87
-#define FX_CHARSET_MAC_EasternEuropean 88
-#define FX_CHARSET_MAC_Cyrillic 89
-#define FX_CHARSET_ShiftJIS 128
-#define FX_CHARSET_Korean 129
-#define FX_CHARSET_Johab 130
-#define FX_CHARSET_ChineseSimplified 134
-#define FX_CHARSET_ChineseTriditional 136
-#define FX_CHARSET_MSWin_Greek 161
-#define FX_CHARSET_MSWin_Turkish 162
-#define FX_CHARSET_MSWin_Vietnamese 163
-#define FX_CHARSET_MSWin_Hebrew 177
-#define FX_CHARSET_MSWin_Arabic 178
-#define FX_CHARSET_ArabicTraditional 179
-#define FX_CHARSET_ArabicUser 180
-#define FX_CHARSET_HebrewUser 181
-#define FX_CHARSET_MSWin_Baltic 186
-#define FX_CHARSET_MSWin_Cyrillic 204
-#define FX_CHARSET_Thai 222
-#define FX_CHARSET_MSWin_EasterEuropean 238
-#define FX_CHARSET_US 254
-#define FX_CHARSET_OEM 255
-
-FX_WORD FX_GetCodePageFromCharset(uint8_t charset);
-FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage);
-FX_WORD FX_GetCodePageFromStringA(const FX_CHAR* pStr, int32_t iLength);
-FX_WORD FX_GetCodePageFormStringW(const FX_WCHAR* pStr, int32_t iLength);
-FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage);
-void FX_SwapByteOrder(FX_WCHAR* pStr, int32_t iLength);
-void FX_SwapByteOrderCopy(const FX_WCHAR* pSrc,
-                          FX_WCHAR* pDst,
-                          int32_t iLength);
-void FX_UTF16ToWChar(void* pBuffer, int32_t iLength);
-void FX_UTF16ToWCharCopy(const FX_WORD* pUTF16,
-                         FX_WCHAR* pWChar,
-                         int32_t iLength);
-void FX_WCharToUTF16(void* pBuffer, int32_t iLength);
-void FX_WCharToUTF16Copy(const FX_WCHAR* pWChar,
-                         FX_WORD* pUTF16,
-                         int32_t iLength);
-int32_t FX_DecodeString(FX_WORD wCodePage,
-                        const FX_CHAR* pSrc,
-                        int32_t* pSrcLen,
-                        FX_WCHAR* pDst,
-                        int32_t* pDstLen,
-                        FX_BOOL bErrBreak = FALSE);
-int32_t FX_UTF8Decode(const FX_CHAR* pSrc,
-                      int32_t* pSrcLen,
-                      FX_WCHAR* pDst,
-                      int32_t* pDstLen);
-
-struct FX_STR2CPHASH {
-  uint32_t uHash;
-  uint32_t uCodePage;
-};
-
-struct FX_CHARSET_MAP {
-  uint16_t charset;
-  uint16_t codepage;
-};
-
-struct FX_LANG2CPMAP {
-  FX_WORD wLanguage;
-  FX_WORD wCodepage;
-};
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_CODEPAGE_H_
diff --git a/xfa/src/fgas/crt/fgas_encode.cpp b/xfa/src/fgas/crt/fgas_encode.cpp
deleted file mode 100644
index 564ccf6..0000000
--- a/xfa/src/fgas/crt/fgas_encode.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-
-void FX_SwapByteOrder(FX_WCHAR* pStr, int32_t iLength) {
-  FXSYS_assert(pStr != NULL);
-  if (iLength < 0) {
-    iLength = FXSYS_wcslen(pStr);
-  }
-  FX_WORD wch;
-  if (sizeof(FX_WCHAR) > 2) {
-    while (iLength-- > 0) {
-      wch = (FX_WORD)*pStr;
-      wch = (wch >> 8) | (wch << 8);
-      wch &= 0x00FF;
-      *pStr++ = wch;
-    }
-  } else {
-    while (iLength-- > 0) {
-      wch = (FX_WORD)*pStr;
-      wch = (wch >> 8) | (wch << 8);
-      *pStr++ = wch;
-    }
-  }
-}
-void FX_SwapByteOrderCopy(const FX_WCHAR* pSrc,
-                          FX_WCHAR* pDst,
-                          int32_t iLength) {
-  FXSYS_assert(pSrc != NULL && pDst != NULL);
-  if (iLength < 0) {
-    iLength = FXSYS_wcslen(pSrc);
-  }
-  FX_WORD wch;
-  if (sizeof(FX_WCHAR) > 2) {
-    while (iLength-- > 0) {
-      wch = (FX_WORD)*pSrc++;
-      wch = (wch >> 8) | (wch << 8);
-      wch &= 0x00FF;
-      *pDst++ = wch;
-    }
-  } else {
-    while (iLength-- > 0) {
-      wch = (FX_WORD)*pSrc++;
-      wch = (wch >> 8) | (wch << 8);
-      *pDst++ = wch;
-    }
-  }
-}
-void FX_UTF16ToWChar(void* pBuffer, int32_t iLength) {
-  FXSYS_assert(pBuffer != NULL && iLength > 0);
-  if (sizeof(FX_WCHAR) == 2) {
-    return;
-  }
-  FX_WORD* pSrc = (FX_WORD*)pBuffer;
-  FX_WCHAR* pDst = (FX_WCHAR*)pBuffer;
-  while (--iLength >= 0) {
-    pDst[iLength] = (FX_WCHAR)pSrc[iLength];
-  }
-}
-void FX_UTF16ToWCharCopy(const FX_WORD* pUTF16,
-                         FX_WCHAR* pWChar,
-                         int32_t iLength) {
-  FXSYS_assert(pUTF16 != NULL && pWChar != NULL && iLength > 0);
-  if (sizeof(FX_WCHAR) == 2) {
-    FXSYS_memcpy(pWChar, pUTF16, iLength * sizeof(FX_WCHAR));
-  } else {
-    while (--iLength >= 0) {
-      pWChar[iLength] = (FX_WCHAR)pUTF16[iLength];
-    }
-  }
-}
-void FX_WCharToUTF16(void* pBuffer, int32_t iLength) {
-  FXSYS_assert(pBuffer != NULL && iLength > 0);
-  if (sizeof(FX_WCHAR) == 2) {
-    return;
-  }
-  const FX_WCHAR* pSrc = (const FX_WCHAR*)pBuffer;
-  FX_WORD* pDst = (FX_WORD*)pBuffer;
-  while (--iLength >= 0) {
-    *pDst++ = (FX_WORD)*pSrc++;
-  }
-}
-void FX_WCharToUTF16Copy(const FX_WCHAR* pWChar,
-                         FX_WORD* pUTF16,
-                         int32_t iLength) {
-  FXSYS_assert(pWChar != NULL && pUTF16 != NULL && iLength > 0);
-  if (sizeof(FX_WCHAR) == 2) {
-    FXSYS_memcpy(pUTF16, pWChar, iLength * sizeof(FX_WCHAR));
-  } else {
-    while (--iLength >= 0) {
-      *pUTF16++ = (FX_WORD)*pWChar++;
-    }
-  }
-}
-inline FX_DWORD FX_DWordFromBytes(const uint8_t* pStr) {
-  return FXBSTR_ID(pStr[3], pStr[2], pStr[1], pStr[0]);
-}
-inline FX_WORD FX_WordFromBytes(const uint8_t* pStr) {
-  return (pStr[1] << 8 | pStr[0]);
-}
-int32_t FX_DecodeString(FX_WORD wCodePage,
-                        const FX_CHAR* pSrc,
-                        int32_t* pSrcLen,
-                        FX_WCHAR* pDst,
-                        int32_t* pDstLen,
-                        FX_BOOL bErrBreak) {
-  if (wCodePage == FX_CODEPAGE_UTF8) {
-    return FX_UTF8Decode(pSrc, pSrcLen, pDst, pDstLen);
-  }
-  return -1;
-}
-int32_t FX_UTF8Decode(const FX_CHAR* pSrc,
-                      int32_t* pSrcLen,
-                      FX_WCHAR* pDst,
-                      int32_t* pDstLen) {
-  if (pSrcLen == NULL || pDstLen == NULL) {
-    return -1;
-  }
-  int32_t iSrcLen = *pSrcLen;
-  if (iSrcLen < 1) {
-    *pSrcLen = *pDstLen = 0;
-    return 1;
-  }
-  int32_t iDstLen = *pDstLen;
-  FX_BOOL bValidDst = (pDst != NULL && iDstLen > 0);
-  FX_DWORD dwCode = 0;
-  int32_t iPending = 0;
-  int32_t iSrcNum = 0, iDstNum = 0;
-  int32_t k = 0;
-  int32_t iIndex = 0;
-  k = 1;
-  while (iIndex < iSrcLen) {
-    uint8_t byte = (uint8_t) * (pSrc + iIndex);
-    if (byte < 0x80) {
-      iPending = 0;
-      k = 1;
-      iDstNum++;
-      iSrcNum += k;
-      if (bValidDst) {
-        *pDst++ = byte;
-        if (iDstNum >= iDstLen) {
-          break;
-        }
-      }
-    } else if (byte < 0xc0) {
-      if (iPending < 1) {
-        break;
-      }
-      iPending--;
-      dwCode |= (byte & 0x3f) << (iPending * 6);
-      if (iPending == 0) {
-        iDstNum++;
-        iSrcNum += k;
-        if (bValidDst) {
-          *pDst++ = dwCode;
-          if (iDstNum >= iDstLen) {
-            break;
-          }
-        }
-      }
-    } else if (byte < 0xe0) {
-      iPending = 1;
-      k = 2;
-      dwCode = (byte & 0x1f) << 6;
-    } else if (byte < 0xf0) {
-      iPending = 2;
-      k = 3;
-      dwCode = (byte & 0x0f) << 12;
-    } else if (byte < 0xf8) {
-      iPending = 3;
-      k = 4;
-      dwCode = (byte & 0x07) << 18;
-    } else if (byte < 0xfc) {
-      iPending = 4;
-      k = 5;
-      dwCode = (byte & 0x03) << 24;
-    } else if (byte < 0xfe) {
-      iPending = 5;
-      k = 6;
-      dwCode = (byte & 0x01) << 30;
-    } else {
-      break;
-    }
-    iIndex++;
-  }
-  *pSrcLen = iSrcNum;
-  *pDstLen = iDstNum;
-  return 1;
-}
diff --git a/xfa/src/fgas/crt/fgas_language.h b/xfa/src/fgas/crt/fgas_language.h
deleted file mode 100644
index 15f32e1..0000000
--- a/xfa/src/fgas/crt/fgas_language.h
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_LANGUAGE_H_
-#define XFA_SRC_FGAS_CRT_FGAS_LANGUAGE_H_
-
-#define FX_LANG_Neutral 0x0000
-#define FX_LANG_Invariant 0x007f
-#define FX_LANG_UserDefault 0x0400
-#define FX_LANG_SystemDefault 0x0800
-#define FX_LANG_Afrikaans_SouthAfrica 0x0436
-#define FX_LANG_Albanian_Albania 0x041c
-#define FX_LANG_Alsatian_France 0x0484
-#define FX_LANG_Amharic_Ethiopia 0x045e
-#define FX_LANG_Arabic_Algeria 0x1401
-#define FX_LANG_Arabic_Bahrain 0x3c01
-#define FX_LANG_Arabic_Egypt 0x0c01
-#define FX_LANG_Arabic_Iraq 0x0801
-#define FX_LANG_Arabic_Jordan 0x2c01
-#define FX_LANG_Arabic_Kuwait 0x3401
-#define FX_LANG_Arabic_Lebanon 0x3001
-#define FX_LANG_Arabic_Libya 0x1001
-#define FX_LANG_Arabic_Morocco 0x1801
-#define FX_LANG_Arabic_Oman 0x2001
-#define FX_LANG_Arabic_Qatar 0x4001
-#define FX_LANG_Arabic_SaudiArabia 0x0401
-#define FX_LANG_Arabic_Syria 0x2801
-#define FX_LANG_Arabic_Tunisia 0x1c01
-#define FX_LANG_Arabic_UAE 0x3801
-#define FX_LANG_Arabic_Yemen 0x2401
-#define FX_LANG_Armenian_Armenia 0x042b
-#define FX_LANG_Assamese_India 0x044d
-#define FX_LANG_Azerbaijan_Cyrillic 0x082c
-#define FX_LANG_Azerbaijan_Latin 0x042c
-#define FX_LANG_Bashkir_Russia 0x046d
-#define FX_LANG_Basque_Basque 0x042d
-#define FX_LANG_Belarusian_Belarus 0x0423
-#define FX_LANG_Bengali_Bangladesh 0x0845
-#define FX_LANG_Bengali_India 0x0445
-#define FX_LANG_Bosnia_Herzegovina 0x101a
-#define FX_LANG_Bosnian_Cyrillic 0x201a
-#define FX_LANG_Bosnian_Latin 0x141a
-#define FX_LANG_Breton_France 0x047e
-#define FX_LANG_Bulgarian_Bulgaria 0x0402
-#define FX_LANG_Burmese 0x0455
-#define FX_LANG_Catalan_Catalan 0x0403
-#define FX_LANG_Cherokee 0x045c
-#define FX_LANG_Chinese_HongKong 0x0c04
-#define FX_LANG_Chinese_Macao 0x1404
-#define FX_LANG_Chinese_PRC 0x0804
-#define FX_LANG_Chinese_Singapore 0x1004
-#define FX_LANG_Chinese_Taiwan 0x0404
-#define FX_LANG_Corsican_France 0x0483
-#define FX_LANG_Croatian_Croatia 0x041a
-#define FX_LANG_Croatian_Latin 0x101a
-#define FX_LANG_CustomCurrent 0x0c00
-#define FX_LANG_CzechRepublic 0x0405
-#define FX_LANG_Danish_Denmark 0x0406
-#define FX_LANG_Dari_Afghanistan 0x048c
-#define FX_LANG_Divehi_Maldives 0x0465
-#define FX_LANG_Dutch_Belgium 0x0813
-#define FX_LANG_Dutch_Netherlands 0x0413
-#define FX_LANG_Dutch_Preferred 0x0013
-#define FX_LANG_Dzongkha 0x0851
-#define FX_LANG_Edo 0x0466
-#define FX_LANG_English_Australia 0x0c09
-#define FX_LANG_English_Belize 0x2809
-#define FX_LANG_English_Canada 0x1009
-#define FX_LANG_English_Caribbean 0x2409
-#define FX_LANG_English_HongKong 0x3c09
-#define FX_LANG_English_India 0x4009
-#define FX_LANG_English_Indonesia 0x3809
-#define FX_LANG_English_Ireland 0x1809
-#define FX_LANG_English_Jamaica 0x2009
-#define FX_LANG_English_Malaysia 0x4409
-#define FX_LANG_English_NewZealand 0x1409
-#define FX_LANG_English_Philippines 0x3409
-#define FX_LANG_English_Singapore 0x4809
-#define FX_LANG_English_SouthAfrica 0x1c09
-#define FX_LANG_English_TrinidadTobago 0x2c09
-#define FX_LANG_English_UnitedKingdom 0x0809
-#define FX_LANG_English_UnitedStates 0x0409
-#define FX_LANG_English_Zimbabwe 0x3009
-#define FX_LANG_Estonian_Estonia 0x0425
-#define FX_LANG_Faroese_FaroeIslands 0x0438
-#define FX_LANG_Filipino_Philippines 0x0464
-#define FX_LANG_Finnish_Finland 0x040b
-#define FX_LANG_French_Belgium 0x080c
-#define FX_LANG_French_Cameroon 0x2c0c
-#define FX_LANG_French_Canada 0x0c0c
-#define FX_LANG_French_CongoDRC 0x240c
-#define FX_LANG_French_CotedIvoire 0x300c
-#define FX_LANG_French_France 0x040c
-#define FX_LANG_French_Haiti 0x3c0c
-#define FX_LANG_French_Luxembourg 0x140c
-#define FX_LANG_French_Mali 0x340c
-#define FX_LANG_French_Monaco 0x180c
-#define FX_LANG_French_Morocco 0x380c
-#define FX_LANG_French_Reunion 0x200c
-#define FX_LANG_French_Senegal 0x280c
-#define FX_LANG_French_Switzerland 0x100c
-#define FX_LANG_French_WestIndies 0x1c0c
-#define FX_LANG_Frisian_Netherlands 0x0462
-#define FX_LANG_Fulfulde 0x0467
-#define FX_LANG_Gaelic_Ireland 0x083c
-#define FX_LANG_Gaelic_Scotland 0x043c
-#define FX_LANG_Galician_Galician 0x0456
-#define FX_LANG_Georgian_Georgia 0x0437
-#define FX_LANG_German_Austria 0x0c07
-#define FX_LANG_German_Germany 0x0407
-#define FX_LANG_German_Liechtenstein 0x1407
-#define FX_LANG_German_Luxembourg 0x1007
-#define FX_LANG_German_Switzerland 0x0807
-#define FX_LANG_Greek_Greece 0x0408
-#define FX_LANG_Greenlandic_Greenland 0x046f
-#define FX_LANG_Guarani 0x0474
-#define FX_LANG_Gujarati_India 0x0447
-#define FX_LANG_Hausa_LatinNigeria 0x0468
-#define FX_LANG_Hawaiian 0x0475
-#define FX_LANG_Hebrew_Israel 0x040d
-#define FX_LANG_Hindi_India 0x0439
-#define FX_LANG_Hungarian_Hungary 0x040e
-#define FX_LANG_Ibibio_Nigeria 0x0469
-#define FX_LANG_Icelandic_Iceland 0x040f
-#define FX_LANG_Igbo_Nigeria 0x0470
-#define FX_LANG_Indonesian_Indonesia 0x0421
-#define FX_LANG_Inuktitut_LatinCanada 0x085d
-#define FX_LANG_Inuktitut_SyllabicsCanada 0x045d
-#define FX_LANG_IsiXhosa_SouthAfrica 0x0434
-#define FX_LANG_IsiZulu_SouthAfrica 0x0435
-#define FX_LANG_Italian_Italy 0x0410
-#define FX_LANG_Italian_Switzerland 0x0810
-#define FX_LANG_Japanese_Japan 0x0411
-#define FX_LANG_Kannada_India 0x044b
-#define FX_LANG_Kanuri 0x0471
-#define FX_LANG_Kashmiri 0x0860
-#define FX_LANG_Kashmiri_Arabic 0x0460
-#define FX_LANG_Kazakh_Kazakhstan 0x043f
-#define FX_LANG_Khmer_Cambodia 0x0453
-#define FX_LANG_Kiche_Guatemala 0x0486
-#define FX_LANG_Kinyarwanda_Rwanda 0x0487
-#define FX_LANG_Kiswahili_Kenya 0x0441
-#define FX_LANG_Konkani_India 0x0457
-#define FX_LANG_Korean_Korea 0x0412
-#define FX_LANG_Kyrgyz_Kyrgyzstan 0x0440
-#define FX_LANG_Lao_LaoPDR 0x0454
-#define FX_LANG_Latin 0x0476
-#define FX_LANG_Latvian_Latvia 0x0426
-#define FX_LANG_Lithuanian_Lithuania 0x0427
-#define FX_LANG_LithuanianTrad 0x0827
-#define FX_LANG_Lower Sorbian_Germany 0x082e
-#define FX_LANG_Luxembourgish_Luxembourg 0x046e
-#define FX_LANG_Macedonian 0x042f
-#define FX_LANG_Malay_BruneiDarussalam 0x083e
-#define FX_LANG_Malay_Malaysia 0x043e
-#define FX_LANG_Malayalam_India 0x044c
-#define FX_LANG_Maldivian 0x0465
-#define FX_LANG_Maltese_Malta 0x043a
-#define FX_LANG_Manipuri 0x0458
-#define FX_LANG_Maori_NewZealand 0x0481
-#define FX_LANG_Mapudungun_Chile 0x047a
-#define FX_LANG_Marathi_India 0x044e
-#define FX_LANG_Mohawk_Mohawk 0x047c
-#define FX_LANG_Mongolian_CyrillicMongolia 0x0450
-#define FX_LANG_Mongolian_TraditionalMongolian 0x0850
-#define FX_LANG_Nepali_India 0x0861
-#define FX_LANG_Nepali_Nepal 0x0461
-#define FX_LANG_Norwegian_Bokmal 0x0414
-#define FX_LANG_Norwegian_Nynorsk 0x0814
-#define FX_LANG_Occitan_France 0x0482
-#define FX_LANG_Oriya_India 0x0448
-#define FX_LANG_Oromo 0x0472
-#define FX_LANG_Papiamentu 0x0479
-#define FX_LANG_Pashto_Afghanistan 0x0463
-#define FX_LANG_Persian 0x0429
-#define FX_LANG_Polish_Poland 0x0415
-#define FX_LANG_Portuguese_Brazil 0x0416
-#define FX_LANG_Portuguese_Portugal 0x0816
-#define FX_LANG_Punjabi_India 0x0446
-#define FX_LANG_Punjabi_Pakistan 0x0846
-#define FX_LANG_Quechua_Bolivia 0x046b
-#define FX_LANG_Quechua_Ecuador 0x086b
-#define FX_LANG_Quechua_Peru 0x0c6b
-#define FX_LANG_Romanian_Moldova 0x0818
-#define FX_LANG_Romanian_Romania 0x0418
-#define FX_LANG_Romansh_Switzerland 0x0417
-#define FX_LANG_Russian_Moldova 0x0819
-#define FX_LANG_Russian_Russia 0x0419
-#define FX_LANG_Sami_InariFinland 0x243b
-#define FX_LANG_Sami_LuleNorway 0x103b
-#define FX_LANG_Sami_LuleSweden 0x143b
-#define FX_LANG_Sami_NorthernFinland 0x0c3b
-#define FX_LANG_Sami_NorthernNorway 0x043b
-#define FX_LANG_Sami_NorthernSweden 0x083b
-#define FX_LANG_Sami_SkoltFinland 0x203b
-#define FX_LANG_Sami_SouthernNorway 0x183b
-#define FX_LANG_Sami_SouthernSweden 0x1c3b
-#define FX_LANG_SanskritIndia 0x044f
-#define FX_LANG_SerbianCyrillic_BosniaHerzegovina 0x1c1a
-#define FX_LANG_SerbianCyrillic_Serbia 0x0c1a
-#define FX_LANG_SerbianLatin_BosniaHerzegovina 0x181a
-#define FX_LANG_SerbianLatin_Serbia 0x081a
-#define FX_LANG_SesothoSaLeboa 0x046c
-#define FX_LANG_Setswana_SouthAfrica 0x0432
-#define FX_LANG_Sindhi_Arabic 0x0859
-#define FX_LANG_Sindhi_Devanagari 0x0459
-#define FX_LANG_Sinhala_SriLanka 0x045b
-#define FX_LANG_Slovak_Slovakia 0x041b
-#define FX_LANG_Slovenian_Slovenia 0x0424
-#define FX_LANG_Somali 0x0477
-#define FX_LANG_Spanish_Argentina 0x2c0a
-#define FX_LANG_Spanish_Bolivia 0x400a
-#define FX_LANG_Spanish_Chile 0x340a
-#define FX_LANG_Spanish_Colombia 0x240a
-#define FX_LANG_Spanish_CostaRica 0x140a
-#define FX_LANG_Spanish_DominicanRepublic 0x1c0a
-#define FX_LANG_Spanish_Ecuador 0x300a
-#define FX_LANG_Spanish_ElSalvador 0x440a
-#define FX_LANG_Spanish_Guatemala 0x100a
-#define FX_LANG_Spanish_Honduras 0x480a
-#define FX_LANG_Spanish_Mexico 0x080a
-#define FX_LANG_Spanish_Nicaragua 0x4c0a
-#define FX_LANG_Spanish_Panama 0x180a
-#define FX_LANG_Spanish_Paraguay 0x3c0a
-#define FX_LANG_Spanish_Peru 0x280a
-#define FX_LANG_Spanish_PuertoRico 0x500a
-#define FX_LANG_Spanish_InternationalSort 0x0c0a
-#define FX_LANG_Spanish_TraditionalSort 0x040a
-#define FX_LANG_Spanish_UnitedStates 0x540a
-#define FX_LANG_Spanish_Uruguay 0x380a
-#define FX_LANG_Spanish_Venezuela 0x200a
-#define FX_LANG_Sutu_SouthAfrica 0x0430
-#define FX_LANG_Swedish_Finland 0x081d
-#define FX_LANG_Swedish_Sweden 0x041d
-#define FX_LANG_Syriac_Syria 0x045a
-#define FX_LANG_Tajik_CyrillicTajikistan 0x0428
-#define FX_LANG_Tamazight_ArabicMorocco 0x045f
-#define FX_LANG_Tamazight_LatinAlgeria 0x085f
-#define FX_LANG_Tamil_India 0x0449
-#define FX_LANG_Tatar_Russia 0x0444
-#define FX_LANG_Telugu_India 0x044a
-#define FX_LANG_Thai_Thailand 0x041e
-#define FX_LANG_TibetanPRC 0x0451
-#define FX_LANG_Tigrigna_Eritrea 0x0873
-#define FX_LANG_Tigrigna_Ethiopia 0x0473
-#define FX_LANG_Tsonga 0x0431
-#define FX_LANG_Turkish_Turkey 0x041f
-#define FX_LANG_Turkmen_Turkmenistan 0x0442
-#define FX_LANG_UighurPRC 0x0480
-#define FX_LANG_Ukrainian_Ukraine 0x0422
-#define FX_LANG_UpperSorbian_Germany 0x042e
-#define FX_LANG_Urdu_Pakistan 0x0420
-#define FX_LANG_Urdu_India 0x0820
-#define FX_LANG_Uzbek_CyrillicUzbekistan 0x0843
-#define FX_LANG_Uzbek_LatinUzbekistan 0x0443
-#define FX_LANG_Venda 0x0433
-#define FX_LANG_Vietnamese_Vietnam 0x042a
-#define FX_LANG_Welsh_UnitedKingdom 0x0452
-#define FX_LANG_Wolof_Senegal 0x0488
-#define FX_LANG_Xhosa 0x0434
-#define FX_LANG_Yakut_Russia 0x0485
-#define FX_LANG_YiPRC 0x0478
-#define FX_LANG_Yiddish 0x043d
-#define FX_LANG_Yoruba_Nigeria 0x046a
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_LANGUAGE_H_
diff --git a/xfa/src/fgas/crt/fgas_memory.cpp b/xfa/src/fgas/crt/fgas_memory.cpp
deleted file mode 100644
index c88c7e3..0000000
--- a/xfa/src/fgas/crt/fgas_memory.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-#include <algorithm>
-
-namespace {
-
-class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target {
- public:
-  CFX_DefStore() {}
-  ~CFX_DefStore() {}
-  virtual void Release() { delete this; }
-  virtual void* Alloc(size_t size) { return FX_Alloc(uint8_t, size); }
-  virtual void Free(void* pBlock) { FX_Free(pBlock); }
-  virtual size_t GetBlockSize() const { return 0; }
-  virtual size_t GetDefChunkSize() const { return 0; }
-  virtual size_t SetDefChunkSize(size_t size) { return 0; }
-  virtual size_t GetCurrentDataSize() const { return 0; }
-};
-
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(push, 1)
-#endif
-struct FX_STATICSTORECHUNK {
-  FX_STATICSTORECHUNK* pNextChunk;
-  size_t iChunkSize;
-  size_t iFreeSize;
-};
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(pop)
-#endif
-
-class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target {
- public:
-  CFX_StaticStore(size_t iDefChunkSize = 4096);
-  ~CFX_StaticStore();
-  virtual void Release() { delete this; }
-  virtual void* Alloc(size_t size);
-  virtual void Free(void* pBlock) {}
-  virtual size_t GetBlockSize() const { return 0; }
-  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
-  virtual size_t SetDefChunkSize(size_t size);
-  virtual size_t GetCurrentDataSize() const { return m_iAllocatedSize; }
-
- protected:
-  size_t m_iAllocatedSize;
-  size_t m_iDefChunkSize;
-  FX_STATICSTORECHUNK* m_pChunk;
-  FX_STATICSTORECHUNK* m_pLastChunk;
-  FX_STATICSTORECHUNK* AllocChunk(size_t size);
-  FX_STATICSTORECHUNK* FindChunk(size_t size);
-};
-
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(push, 1)
-#endif
-struct FX_FIXEDSTORECHUNK {
-  uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); }
-  uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; }
-
-  FX_FIXEDSTORECHUNK* pNextChunk;
-  size_t iChunkSize;
-  size_t iFreeNum;
-};
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(pop)
-#endif
-
-class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target {
- public:
-  CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk);
-  virtual ~CFX_FixedStore();
-  virtual void Release() { delete this; }
-  virtual void* Alloc(size_t size);
-  virtual void Free(void* pBlock);
-  virtual size_t GetBlockSize() const { return m_iBlockSize; }
-  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
-  virtual size_t SetDefChunkSize(size_t iChunkSize);
-  virtual size_t GetCurrentDataSize() const { return 0; }
-
- protected:
-  FX_FIXEDSTORECHUNK* AllocChunk();
-
-  size_t m_iBlockSize;
-  size_t m_iDefChunkSize;
-  FX_FIXEDSTORECHUNK* m_pChunk;
-};
-
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(push, 1)
-#endif
-struct FX_DYNAMICSTOREBLOCK {
-  uint8_t* Data() { return reinterpret_cast<uint8_t*>(this + 1); }
-  FX_DYNAMICSTOREBLOCK* NextBlock() {
-    return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(Data() + iBlockSize);
-  }
-  size_t iBlockSize;
-  FX_BOOL bUsed;
-};
-
-struct FX_DYNAMICSTORECHUNK {
-  FX_DYNAMICSTOREBLOCK* FirstBlock() {
-    return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(this + 1);
-  }
-  FX_DYNAMICSTORECHUNK* pNextChunk;
-  size_t iChunkSize;
-  size_t iFreeSize;
-};
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(pop)
-#endif
-
-class CFX_DynamicStore : public IFX_MEMAllocator, public CFX_Target {
- public:
-  CFX_DynamicStore(size_t iDefChunkSize = 4096);
-  virtual ~CFX_DynamicStore();
-  virtual void Release() { delete this; }
-  virtual void* Alloc(size_t size);
-  virtual void Free(void* pBlock);
-  virtual size_t GetBlockSize() const { return 0; }
-  virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; }
-  virtual size_t SetDefChunkSize(size_t size);
-  virtual size_t GetCurrentDataSize() const { return 0; }
-
- protected:
-  FX_DYNAMICSTORECHUNK* AllocChunk(size_t size);
-
-  size_t m_iDefChunkSize;
-  FX_DYNAMICSTORECHUNK* m_pChunk;
-};
-
-}  // namespace
-
-#define FX_4BYTEALIGN(size) (((size) + 3) / 4 * 4)
-
-IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType,
-                                     size_t chunkSize,
-                                     size_t blockSize) {
-  switch (eType) {
-    case FX_ALLOCTYPE_Dynamic:
-      return new CFX_DynamicStore(chunkSize);
-    case FX_ALLOCTYPE_Default:
-      return new CFX_DefStore();
-    case FX_ALLOCTYPE_Static:
-      return new CFX_StaticStore(chunkSize);
-    case FX_ALLOCTYPE_Fixed:
-      return new CFX_FixedStore(blockSize, chunkSize);
-    default:
-      return NULL;
-  }
-}
-CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize)
-    : m_iAllocatedSize(0),
-      m_iDefChunkSize(iDefChunkSize),
-      m_pChunk(NULL),
-      m_pLastChunk(NULL) {
-  FXSYS_assert(m_iDefChunkSize != 0);
-}
-CFX_StaticStore::~CFX_StaticStore() {
-  FX_STATICSTORECHUNK* pChunk = m_pChunk;
-  while (pChunk) {
-    FX_STATICSTORECHUNK* pNext = pChunk->pNextChunk;
-    FX_Free(pChunk);
-    pChunk = pNext;
-  }
-}
-FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) {
-  FXSYS_assert(size != 0);
-  FX_STATICSTORECHUNK* pChunk = (FX_STATICSTORECHUNK*)FX_Alloc(
-      uint8_t, sizeof(FX_STATICSTORECHUNK) + size);
-  pChunk->iChunkSize = size;
-  pChunk->iFreeSize = size;
-  pChunk->pNextChunk = NULL;
-  if (m_pLastChunk == NULL) {
-    m_pChunk = pChunk;
-  } else {
-    m_pLastChunk->pNextChunk = pChunk;
-  }
-  m_pLastChunk = pChunk;
-  return pChunk;
-}
-FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) {
-  FXSYS_assert(size != 0);
-  if (m_pLastChunk == NULL || m_pLastChunk->iFreeSize < size) {
-    return AllocChunk(std::max(m_iDefChunkSize, size));
-  }
-  return m_pLastChunk;
-}
-void* CFX_StaticStore::Alloc(size_t size) {
-  size = FX_4BYTEALIGN(size);
-  FXSYS_assert(size != 0);
-  FX_STATICSTORECHUNK* pChunk = FindChunk(size);
-  FXSYS_assert(pChunk->iFreeSize >= size);
-  uint8_t* p = (uint8_t*)pChunk;
-  p += sizeof(FX_STATICSTORECHUNK) + pChunk->iChunkSize - pChunk->iFreeSize;
-  pChunk->iFreeSize -= size;
-  m_iAllocatedSize += size;
-  return p;
-}
-size_t CFX_StaticStore::SetDefChunkSize(size_t size) {
-  FXSYS_assert(size != 0);
-  size_t v = m_iDefChunkSize;
-  m_iDefChunkSize = size;
-  return v;
-}
-CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk)
-    : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)),
-      m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)),
-      m_pChunk(NULL) {
-  FXSYS_assert(m_iBlockSize != 0 && m_iDefChunkSize != 0);
-}
-CFX_FixedStore::~CFX_FixedStore() {
-  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
-  while (pChunk) {
-    FX_FIXEDSTORECHUNK* pNext = pChunk->pNextChunk;
-    FX_Free(pChunk);
-    pChunk = pNext;
-  }
-}
-FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() {
-  int32_t iTotalSize = sizeof(FX_FIXEDSTORECHUNK) + m_iDefChunkSize +
-                       m_iBlockSize * m_iDefChunkSize;
-  FX_FIXEDSTORECHUNK* pChunk =
-      (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize);
-  if (pChunk == NULL) {
-    return NULL;
-  }
-  FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize);
-  pChunk->pNextChunk = m_pChunk;
-  pChunk->iChunkSize = m_iDefChunkSize;
-  pChunk->iFreeNum = m_iDefChunkSize;
-  m_pChunk = pChunk;
-  return pChunk;
-}
-void* CFX_FixedStore::Alloc(size_t size) {
-  if (size > m_iBlockSize) {
-    return NULL;
-  }
-  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
-  while (pChunk != NULL) {
-    if (pChunk->iFreeNum > 0) {
-      break;
-    }
-    pChunk = pChunk->pNextChunk;
-  }
-  if (pChunk == NULL) {
-    pChunk = AllocChunk();
-  }
-  FXSYS_assert(pChunk != NULL);
-  uint8_t* pFlags = pChunk->FirstFlag();
-  size_t i = 0;
-  for (; i < pChunk->iChunkSize; i++)
-    if (pFlags[i] == 0) {
-      break;
-    }
-  FXSYS_assert(i < pChunk->iChunkSize);
-  pFlags[i] = 1;
-  pChunk->iFreeNum--;
-  return pChunk->FirstBlock() + i * m_iBlockSize;
-}
-void CFX_FixedStore::Free(void* pBlock) {
-  FXSYS_assert(pBlock != NULL);
-  FX_FIXEDSTORECHUNK* pPrior = NULL;
-  FX_FIXEDSTORECHUNK* pChunk = m_pChunk;
-  uint8_t* pStart = NULL;
-  uint8_t* pEnd;
-  while (pChunk != NULL) {
-    pStart = pChunk->FirstBlock();
-    if (pBlock >= pStart) {
-      pEnd = pStart + m_iBlockSize * pChunk->iChunkSize;
-      if (pBlock < pEnd) {
-        break;
-      }
-    }
-    pPrior = pChunk, pChunk = pChunk->pNextChunk;
-  }
-  FXSYS_assert(pChunk != NULL);
-  size_t iPos = ((uint8_t*)pBlock - pStart) / m_iBlockSize;
-  FXSYS_assert(iPos < pChunk->iChunkSize);
-  uint8_t* pFlags = pChunk->FirstFlag();
-  if (pFlags[iPos] == 0) {
-    return;
-  }
-  pFlags[iPos] = 0;
-  pChunk->iFreeNum++;
-  if (pChunk->iFreeNum == pChunk->iChunkSize) {
-    if (pPrior == NULL) {
-      m_pChunk = pChunk->pNextChunk;
-    } else {
-      pPrior->pNextChunk = pChunk->pNextChunk;
-    }
-    FX_Free(pChunk);
-  }
-}
-size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) {
-  FXSYS_assert(iChunkSize != 0);
-  size_t v = m_iDefChunkSize;
-  m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize);
-  return v;
-}
-CFX_DynamicStore::CFX_DynamicStore(size_t iDefChunkSize)
-    : m_iDefChunkSize(iDefChunkSize), m_pChunk(NULL) {
-  FXSYS_assert(m_iDefChunkSize != 0);
-}
-CFX_DynamicStore::~CFX_DynamicStore() {
-  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
-  while (pChunk) {
-    FX_DYNAMICSTORECHUNK* pNext = pChunk->pNextChunk;
-    FX_Free(pChunk);
-    pChunk = pNext;
-  }
-}
-FX_DYNAMICSTORECHUNK* CFX_DynamicStore::AllocChunk(size_t size) {
-  FXSYS_assert(size != 0);
-  FX_DYNAMICSTORECHUNK* pChunk = (FX_DYNAMICSTORECHUNK*)FX_Alloc(
-      uint8_t,
-      sizeof(FX_DYNAMICSTORECHUNK) + sizeof(FX_DYNAMICSTOREBLOCK) * 2 + size);
-  if (pChunk == NULL) {
-    return NULL;
-  }
-  pChunk->iChunkSize = size;
-  pChunk->iFreeSize = size;
-  FX_DYNAMICSTOREBLOCK* pBlock = pChunk->FirstBlock();
-  pBlock->iBlockSize = size;
-  pBlock->bUsed = FALSE;
-  pBlock = pBlock->NextBlock();
-  pBlock->iBlockSize = 0;
-  pBlock->bUsed = TRUE;
-  if (m_pChunk != NULL && size >= m_iDefChunkSize) {
-    FX_DYNAMICSTORECHUNK* pLast = m_pChunk;
-    while (pLast->pNextChunk != NULL) {
-      pLast = pLast->pNextChunk;
-    }
-    pLast->pNextChunk = pChunk;
-    pChunk->pNextChunk = NULL;
-  } else {
-    pChunk->pNextChunk = m_pChunk;
-    m_pChunk = pChunk;
-  }
-  return pChunk;
-}
-void* CFX_DynamicStore::Alloc(size_t size) {
-  size = FX_4BYTEALIGN(size);
-  FXSYS_assert(size != 0);
-  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
-  FX_DYNAMICSTOREBLOCK* pBlock = NULL;
-  while (pChunk != NULL) {
-    if (pChunk->iFreeSize >= size) {
-      pBlock = pChunk->FirstBlock();
-      FX_BOOL bFind = FALSE;
-      while (pBlock->iBlockSize != 0) {
-        if (!pBlock->bUsed && pBlock->iBlockSize >= size) {
-          bFind = TRUE;
-          break;
-        }
-        pBlock = pBlock->NextBlock();
-      }
-      if (bFind) {
-        break;
-      }
-    }
-    pChunk = pChunk->pNextChunk;
-  }
-  if (pChunk == NULL) {
-    pChunk = AllocChunk(std::max(m_iDefChunkSize, size));
-    pBlock = pChunk->FirstBlock();
-  }
-  FXSYS_assert(pChunk != NULL && pBlock != NULL);
-  size_t m = size + sizeof(FX_DYNAMICSTOREBLOCK);
-  pBlock->bUsed = TRUE;
-  if (pBlock->iBlockSize > m) {
-    size_t n = pBlock->iBlockSize;
-    pBlock->iBlockSize = size;
-    FX_DYNAMICSTOREBLOCK* pNextBlock = pBlock->NextBlock();
-    pNextBlock->bUsed = FALSE;
-    pNextBlock->iBlockSize = n - size - sizeof(FX_DYNAMICSTOREBLOCK);
-    pChunk->iFreeSize -= size + sizeof(FX_DYNAMICSTOREBLOCK);
-  } else {
-    pChunk->iFreeSize -= pBlock->iBlockSize;
-  }
-  return pBlock->Data();
-}
-void CFX_DynamicStore::Free(void* pBlock) {
-  FXSYS_assert(pBlock != NULL);
-  FX_DYNAMICSTORECHUNK* pPriorChunk = NULL;
-  FX_DYNAMICSTORECHUNK* pChunk = m_pChunk;
-  while (pChunk != NULL) {
-    if (pBlock > pChunk &&
-        pBlock <= ((uint8_t*)pChunk + sizeof(FX_DYNAMICSTORECHUNK) +
-                   pChunk->iChunkSize)) {
-      break;
-    }
-    pPriorChunk = pChunk, pChunk = pChunk->pNextChunk;
-  }
-  FXSYS_assert(pChunk != NULL);
-  FX_DYNAMICSTOREBLOCK* pPriorBlock = NULL;
-  FX_DYNAMICSTOREBLOCK* pFindBlock = pChunk->FirstBlock();
-  while (pFindBlock->iBlockSize != 0) {
-    if (pBlock == (void*)pFindBlock->Data()) {
-      break;
-    }
-    pPriorBlock = pFindBlock;
-    pFindBlock = pFindBlock->NextBlock();
-  }
-  FXSYS_assert(pFindBlock->iBlockSize != 0 && pFindBlock->bUsed &&
-               pBlock == (void*)pFindBlock->Data());
-  pFindBlock->bUsed = FALSE;
-  pChunk->iFreeSize += pFindBlock->iBlockSize;
-  if (pPriorBlock == NULL) {
-    pPriorBlock = pChunk->FirstBlock();
-  } else if (pPriorBlock->bUsed) {
-    pPriorBlock = pFindBlock;
-  }
-  pFindBlock = pPriorBlock;
-  size_t sizeFree = 0;
-  size_t sizeBlock = 0;
-  while (pFindBlock->iBlockSize != 0 && !pFindBlock->bUsed) {
-    if (pFindBlock != pPriorBlock) {
-      sizeFree += sizeof(FX_DYNAMICSTOREBLOCK);
-      sizeBlock += sizeof(FX_DYNAMICSTOREBLOCK);
-    }
-    sizeBlock += pFindBlock->iBlockSize;
-    pFindBlock = pFindBlock->NextBlock();
-  }
-  pPriorBlock->iBlockSize = sizeBlock;
-  pChunk->iFreeSize += sizeFree;
-  if (pChunk->iFreeSize == pChunk->iChunkSize) {
-    if (pPriorChunk == NULL) {
-      m_pChunk = pChunk->pNextChunk;
-    } else {
-      pPriorChunk->pNextChunk = pChunk->pNextChunk;
-    }
-    FX_Free(pChunk);
-  }
-}
-size_t CFX_DynamicStore::SetDefChunkSize(size_t size) {
-  FXSYS_assert(size != 0);
-  size_t v = m_iDefChunkSize;
-  m_iDefChunkSize = size;
-  return v;
-}
diff --git a/xfa/src/fgas/crt/fgas_memory.h b/xfa/src/fgas/crt/fgas_memory.h
deleted file mode 100644
index 90a8dda..0000000
--- a/xfa/src/fgas/crt/fgas_memory.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_MEMORY_H_
-#define XFA_SRC_FGAS_CRT_FGAS_MEMORY_H_
-
-#include "core/include/fxcrt/fx_memory.h"
-#include "core/include/fxcrt/fx_system.h"
-
-class IFX_MEMAllocator;
-class CFX_Target;
-enum FX_ALLOCTYPE {
-  FX_ALLOCTYPE_Default = 0,
-  FX_ALLOCTYPE_Static,
-  FX_ALLOCTYPE_Fixed,
-  FX_ALLOCTYPE_Dynamic,
-};
-
-class IFX_MEMAllocator {
- public:
-  virtual ~IFX_MEMAllocator() {}
-  virtual void Release() = 0;
-  virtual void* Alloc(size_t size) = 0;
-  virtual void Free(void* pBlock) = 0;
-  virtual size_t GetBlockSize() const = 0;
-  virtual size_t GetDefChunkSize() const = 0;
-  virtual size_t SetDefChunkSize(size_t size) = 0;
-  virtual size_t GetCurrentDataSize() const = 0;
-};
-
-IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType,
-                                     size_t chunkSize,
-                                     size_t blockSize);
-class CFX_Target {
- public:
-  virtual ~CFX_Target() {}
-  void* operator new(size_t size) { return FX_Alloc(uint8_t, size); }
-  void operator delete(void* p) { FX_Free(p); }
-  void* operator new(size_t size, IFX_MEMAllocator* pAllocator) {
-    return pAllocator->Alloc(size);
-  }
-  void operator delete(void* p, IFX_MEMAllocator* pAllocator) {
-    pAllocator->Free(p);
-  }
-  void* operator new(size_t size, void* place) { return place; }
-  void operator delete(void* p, void* place) {}
-};
-
-#define FXTARGET_NewWith(__allocator__) new (__allocator__)
-#define FXTARGET_DeleteWith(__class__, __allocator__, pointer) \
-  {                                                            \
-    (pointer)->~__class__();                                   \
-    (pointer)->operator delete((pointer), (__allocator__));    \
-  }
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_MEMORY_H_
diff --git a/xfa/src/fgas/crt/fgas_stream.cpp b/xfa/src/fgas/crt/fgas_stream.cpp
deleted file mode 100644
index c515b56..0000000
--- a/xfa/src/fgas/crt/fgas_stream.cpp
+++ /dev/null
@@ -1,1626 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_stream.h"
-
-#include <algorithm>
-
-#include "xfa/src/fgas/crt/fgas_system.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-
-namespace {
-
-class CFX_StreamImp {
- public:
-  virtual void Release() { delete this; }
-  virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
-  virtual int32_t GetLength() const = 0;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0;
-  virtual int32_t GetPosition() = 0;
-  virtual FX_BOOL IsEOF() const = 0;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0;
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS) = 0;
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0;
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0;
-  virtual void Flush() = 0;
-  virtual FX_BOOL SetLength(int32_t iLength) = 0;
-
- protected:
-  CFX_StreamImp();
-  virtual ~CFX_StreamImp() {}
-  FX_DWORD m_dwAccess;
-};
-
-class CFX_FileStreamImp : public CFX_StreamImp {
- public:
-  CFX_FileStreamImp();
-  virtual ~CFX_FileStreamImp();
-  FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
-  virtual void Flush();
-  virtual FX_BOOL SetLength(int32_t iLength);
-
- protected:
-  FXSYS_FILE* m_hFile;
-  int32_t m_iLength;
-};
-
-class CFX_BufferStreamImp : public CFX_StreamImp {
- public:
-  CFX_BufferStreamImp();
-  virtual ~CFX_BufferStreamImp() {}
-  FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
-  virtual void Flush() {}
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
-
- protected:
-  uint8_t* m_pData;
-  int32_t m_iTotalSize;
-  int32_t m_iPosition;
-  int32_t m_iLength;
-};
-
-class CFX_FileReadStreamImp : public CFX_StreamImp {
- public:
-  CFX_FileReadStreamImp();
-  virtual ~CFX_FileReadStreamImp() {}
-  FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition() { return m_iPosition; }
-  virtual FX_BOOL IsEOF() const;
-
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-    return 0;
-  }
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-    return 0;
-  }
-  virtual void Flush() {}
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
-
- protected:
-  IFX_FileRead* m_pFileRead;
-  int32_t m_iPosition;
-  int32_t m_iLength;
-};
-
-class CFX_BufferReadStreamImp : public CFX_StreamImp {
- public:
-  CFX_BufferReadStreamImp();
-  ~CFX_BufferReadStreamImp();
-  FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
-                         int32_t iFileSize,
-                         FX_DWORD dwAccess,
-                         FX_BOOL bReleaseBufferRead);
-
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition() { return m_iPosition; }
-  virtual FX_BOOL IsEOF() const;
-
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-    return 0;
-  }
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-    return 0;
-  }
-  virtual void Flush() {}
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
-
- private:
-  IFX_BufferRead* m_pBufferRead;
-  FX_BOOL m_bReleaseBufferRead;
-  int32_t m_iPosition;
-  int32_t m_iBufferSize;
-};
-
-class CFX_FileWriteStreamImp : public CFX_StreamImp {
- public:
-  CFX_FileWriteStreamImp();
-  virtual ~CFX_FileWriteStreamImp() {}
-  FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition() { return m_iPosition; }
-  virtual FX_BOOL IsEOF() const;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS) {
-    return 0;
-  }
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
-  virtual void Flush();
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
-
- protected:
-  IFX_FileWrite* m_pFileWrite;
-  int32_t m_iPosition;
-};
-
-enum FX_STREAMTYPE {
-  FX_SREAMTYPE_Unknown = 0,
-  FX_STREAMTYPE_File,
-  FX_STREAMTYPE_Buffer,
-  FX_STREAMTYPE_Stream,
-  FX_STREAMTYPE_BufferRead,
-};
-
-class CFX_Stream : public IFX_Stream {
- public:
-  CFX_Stream();
-  ~CFX_Stream();
-  FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
-  FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
-  FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
-  FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
-  FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
-                         int32_t iFileSize,
-                         FX_DWORD dwAccess,
-                         FX_BOOL bReleaseBufferRead);
-  virtual void Release();
-  virtual IFX_Stream* Retain();
-  virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS,
-                             int32_t const* pByteSize = NULL);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
-  virtual void Flush();
-  virtual FX_BOOL SetLength(int32_t iLength);
-  virtual int32_t GetBOM(uint8_t bom[4]) const;
-  virtual FX_WORD GetCodePage() const;
-  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
-  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
-                                         int32_t iOffset,
-                                         int32_t iLength);
-
- protected:
-  FX_STREAMTYPE m_eStreamType;
-  CFX_StreamImp* m_pStreamImp;
-  FX_DWORD m_dwAccess;
-  int32_t m_iTotalSize;
-  int32_t m_iPosition;
-  int32_t m_iStart;
-  int32_t m_iLength;
-  int32_t m_iRefCount;
-};
-
-class CFX_TextStream : public IFX_Stream {
- public:
-  CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream);
-  ~CFX_TextStream();
-  virtual void Release();
-  virtual IFX_Stream* Retain();
-
-  virtual FX_DWORD GetAccessModes() const;
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
-
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS,
-                             int32_t const* pByteSize = NULL);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
-  virtual void Flush();
-  virtual FX_BOOL SetLength(int32_t iLength);
-
-  virtual int32_t GetBOM(uint8_t bom[4]) const;
-  virtual FX_WORD GetCodePage() const;
-  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
-
-  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
-                                         int32_t iOffset,
-                                         int32_t iLength);
-
- protected:
-  FX_WORD m_wCodePage;
-  int32_t m_wBOMLength;
-  FX_DWORD m_dwBOM;
-  uint8_t* m_pBuf;
-  int32_t m_iBufSize;
-  FX_BOOL m_bDelStream;
-  IFX_Stream* m_pStreamImp;
-  int32_t m_iRefCount;
-  void InitStream();
-};
-
-class CFGAS_FileRead : public IFX_FileRead {
- public:
-  CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream);
-  virtual ~CFGAS_FileRead();
-  virtual void Release() { delete this; }
-  virtual FX_FILESIZE GetSize();
-  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
-
- protected:
-  FX_BOOL m_bReleaseStream;
-  IFX_Stream* m_pStream;
-};
-
-class CFX_BufferAccImp : public IFX_FileRead {
- public:
-  CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
-                   FX_FILESIZE iFileSize,
-                   FX_BOOL bReleaseStream);
-  virtual ~CFX_BufferAccImp();
-  virtual void Release() { delete this; }
-  virtual FX_FILESIZE GetSize();
-  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
-
- protected:
-  IFX_BufferRead* m_pBufferRead;
-  FX_BOOL m_bReleaseStream;
-  FX_FILESIZE m_iBufSize;
-};
-
-class CFGAS_FileWrite : public IFX_FileWrite {
- public:
-  CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream);
-  virtual ~CFGAS_FileWrite();
-  virtual void Release() { delete this; }
-  virtual FX_FILESIZE GetSize();
-  virtual FX_BOOL Flush();
-  virtual FX_BOOL WriteBlock(const void* pData, size_t size);
-  virtual FX_BOOL WriteBlock(const void* pData,
-                             FX_FILESIZE offset,
-                             size_t size);
-
- protected:
-  IFX_Stream* m_pStream;
-  FX_BOOL m_bReleaseStream;
-};
-
-}  // namespace
-
-IFX_Stream* IFX_Stream::CreateStream(IFX_BufferRead* pBufferRead,
-                                     FX_DWORD dwAccess,
-                                     int32_t iFileSize,
-                                     FX_BOOL bReleaseBufferRead) {
-  CFX_Stream* pSR = new CFX_Stream;
-  if (!pSR->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
-                           bReleaseBufferRead)) {
-    pSR->Release();
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-IFX_Stream* IFX_Stream::CreateStream(IFX_FileRead* pFileRead,
-                                     FX_DWORD dwAccess) {
-  CFX_Stream* pSR = new CFX_Stream;
-  if (!pSR->LoadFileRead(pFileRead, dwAccess)) {
-    pSR->Release();
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-IFX_Stream* IFX_Stream::CreateStream(IFX_FileWrite* pFileWrite,
-                                     FX_DWORD dwAccess) {
-  CFX_Stream* pSR = new CFX_Stream;
-  if (!pSR->LoadFileWrite(pFileWrite, dwAccess)) {
-    pSR->Release();
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-IFX_Stream* IFX_Stream::CreateStream(const FX_WCHAR* pszFileName,
-                                     FX_DWORD dwAccess) {
-  CFX_Stream* pSR = new CFX_Stream;
-  if (!pSR->LoadFile(pszFileName, dwAccess)) {
-    pSR->Release();
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-IFX_Stream* IFX_Stream::CreateStream(uint8_t* pData,
-                                     int32_t length,
-                                     FX_DWORD dwAccess) {
-  CFX_Stream* pSR = new CFX_Stream;
-  if (!pSR->LoadBuffer(pData, length, dwAccess)) {
-    pSR->Release();
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-
-CFX_StreamImp::CFX_StreamImp() : m_dwAccess(0) {}
-CFX_FileStreamImp::CFX_FileStreamImp()
-    : CFX_StreamImp(), m_hFile(NULL), m_iLength(0) {}
-CFX_FileStreamImp::~CFX_FileStreamImp() {
-  if (m_hFile != NULL) {
-    FXSYS_fclose(m_hFile);
-  }
-}
-FX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
-                                    FX_DWORD dwAccess) {
-  FXSYS_assert(m_hFile == NULL);
-  FXSYS_assert(pszSrcFileName != NULL && FXSYS_wcslen(pszSrcFileName) > 0);
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
-    _FX_OS_ == _FX_WIN64_
-  CFX_WideString wsMode;
-  if (dwAccess & FX_STREAMACCESS_Write) {
-    if (dwAccess & FX_STREAMACCESS_Append) {
-      wsMode = L"a+b";
-    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
-      wsMode = L"w+b";
-    } else {
-      wsMode = L"r+b";
-    }
-  } else {
-    wsMode = L"rb";
-  }
-  m_hFile = FXSYS_wfopen(pszSrcFileName, wsMode);
-
-  if (!m_hFile) {
-    if (dwAccess & FX_STREAMACCESS_Write) {
-      if (dwAccess & FX_STREAMACCESS_Create)
-        m_hFile = FXSYS_wfopen(pszSrcFileName, L"w+b");
-
-      if (!m_hFile) {
-        m_hFile = FXSYS_wfopen(pszSrcFileName, L"r+b");
-        if (!m_hFile)
-          return FALSE;
-
-        if (dwAccess & FX_STREAMACCESS_Truncate)
-          FX_fsetsize(m_hFile, 0);
-      }
-    } else {
-      return FALSE;
-    }
-  }
-#else
-  CFX_ByteString wsMode;
-  if (dwAccess & FX_STREAMACCESS_Write) {
-    if (dwAccess & FX_STREAMACCESS_Append) {
-      wsMode = "a+b";
-    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
-      wsMode = "w+b";
-    } else {
-      wsMode = "r+b";
-    }
-  } else {
-    wsMode = "rb";
-  }
-  CFX_ByteString szFileName = CFX_ByteString::FromUnicode(pszSrcFileName);
-  m_hFile = FXSYS_fopen(szFileName, wsMode);
-  if (m_hFile == NULL) {
-    if (dwAccess & FX_STREAMACCESS_Write) {
-      if (dwAccess & FX_STREAMACCESS_Create) {
-        m_hFile = FXSYS_fopen(szFileName, "w+b");
-      }
-      if (m_hFile == NULL) {
-        m_hFile = FXSYS_fopen(szFileName, "r+b");
-        if (m_hFile == NULL) {
-          return FALSE;
-        }
-        if (dwAccess & FX_STREAMACCESS_Truncate) {
-          FX_fsetsize(m_hFile, 0);
-        }
-      }
-    } else {
-      return FALSE;
-    }
-  }
-#endif
-  m_dwAccess = dwAccess;
-  if ((dwAccess & (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) ==
-      (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) {
-    m_iLength = 0;
-  } else {
-    m_iLength = FX_filelength(m_hFile);
-  }
-  return TRUE;
-}
-int32_t CFX_FileStreamImp::GetLength() const {
-  FXSYS_assert(m_hFile != NULL);
-  return m_iLength;
-}
-int32_t CFX_FileStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  FXSYS_assert(m_hFile != NULL);
-  FXSYS_fseek(m_hFile, iOffset, eSeek);
-  return FXSYS_ftell(m_hFile);
-}
-int32_t CFX_FileStreamImp::GetPosition() {
-  FXSYS_assert(m_hFile != NULL);
-  return FXSYS_ftell(m_hFile);
-}
-FX_BOOL CFX_FileStreamImp::IsEOF() const {
-  FXSYS_assert(m_hFile != NULL);
-  return FXSYS_ftell(m_hFile) >= m_iLength;
-}
-int32_t CFX_FileStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
-  FXSYS_assert(m_hFile != NULL);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  return FXSYS_fread(pBuffer, 1, iBufferSize, m_hFile);
-}
-int32_t CFX_FileStreamImp::ReadString(FX_WCHAR* pStr,
-                                      int32_t iMaxLength,
-                                      FX_BOOL& bEOS) {
-  FXSYS_assert(m_hFile != NULL);
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  if (m_iLength <= 0) {
-    return 0;
-  }
-  int32_t iPosition = FXSYS_ftell(m_hFile);
-  int32_t iLen = std::min((m_iLength - iPosition) / 2, iMaxLength);
-  if (iLen <= 0) {
-    return 0;
-  }
-  iLen = FXSYS_fread(pStr, 2, iLen, m_hFile);
-  int32_t iCount = 0;
-  while (*pStr != L'\0' && iCount < iLen) {
-    pStr++, iCount++;
-  }
-  iPosition += iCount * 2;
-  if (FXSYS_ftell(m_hFile) != iPosition) {
-    FXSYS_fseek(m_hFile, iPosition, 0);
-  }
-  bEOS = (iPosition >= m_iLength);
-  return iCount;
-}
-int32_t CFX_FileStreamImp::WriteData(const uint8_t* pBuffer,
-                                     int32_t iBufferSize) {
-  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  int32_t iRet = FXSYS_fwrite(pBuffer, 1, iBufferSize, m_hFile);
-  if (iRet != 0) {
-    int32_t iPos = FXSYS_ftell(m_hFile);
-    if (iPos > m_iLength) {
-      m_iLength = iPos;
-    }
-  }
-  return iRet;
-}
-int32_t CFX_FileStreamImp::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FXSYS_assert(pStr != NULL && iLength > 0);
-  int32_t iRet = FXSYS_fwrite(pStr, 2, iLength, m_hFile);
-  if (iRet != 0) {
-    int32_t iPos = FXSYS_ftell(m_hFile);
-    if (iPos > m_iLength) {
-      m_iLength = iPos;
-    }
-  }
-  return iRet;
-}
-void CFX_FileStreamImp::Flush() {
-  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FXSYS_fflush(m_hFile);
-}
-FX_BOOL CFX_FileStreamImp::SetLength(int32_t iLength) {
-  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FX_BOOL bRet = FX_fsetsize(m_hFile, iLength);
-  m_iLength = FX_filelength(m_hFile);
-  return bRet;
-}
-CFX_FileReadStreamImp::CFX_FileReadStreamImp()
-    : m_pFileRead(NULL), m_iPosition(0), m_iLength(0) {}
-FX_BOOL CFX_FileReadStreamImp::LoadFileRead(IFX_FileRead* pFileRead,
-                                            FX_DWORD dwAccess) {
-  FXSYS_assert(m_pFileRead == NULL && pFileRead != NULL);
-  if (dwAccess & FX_STREAMACCESS_Write) {
-    return FALSE;
-  }
-  m_pFileRead = pFileRead;
-  m_iLength = m_pFileRead->GetSize();
-  return TRUE;
-}
-int32_t CFX_FileReadStreamImp::GetLength() const {
-  return m_iLength;
-}
-int32_t CFX_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  switch (eSeek) {
-    case FX_STREAMSEEK_Begin:
-      m_iPosition = iOffset;
-      break;
-    case FX_STREAMSEEK_Current:
-      m_iPosition += iOffset;
-      break;
-    case FX_STREAMSEEK_End:
-      m_iPosition = m_iLength + iOffset;
-      break;
-  }
-  if (m_iPosition < 0) {
-    m_iPosition = 0;
-  } else if (m_iPosition >= m_iLength) {
-    m_iPosition = m_iLength;
-  }
-  return m_iPosition;
-}
-FX_BOOL CFX_FileReadStreamImp::IsEOF() const {
-  return m_iPosition >= m_iLength;
-}
-int32_t CFX_FileReadStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
-  FXSYS_assert(m_pFileRead != NULL);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  if (iBufferSize > m_iLength - m_iPosition) {
-    iBufferSize = m_iLength - m_iPosition;
-  }
-  if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) {
-    m_iPosition += iBufferSize;
-    return iBufferSize;
-  }
-  return 0;
-}
-int32_t CFX_FileReadStreamImp::ReadString(FX_WCHAR* pStr,
-                                          int32_t iMaxLength,
-                                          FX_BOOL& bEOS) {
-  FXSYS_assert(m_pFileRead != NULL);
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
-  if (iMaxLength <= 0) {
-    return 0;
-  }
-  int32_t i = 0;
-  while (i < iMaxLength && pStr[i] != L'\0') {
-    ++i;
-  }
-  bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0';
-  return i;
-}
-CFX_BufferReadStreamImp::CFX_BufferReadStreamImp()
-    : m_pBufferRead(NULL),
-      m_bReleaseBufferRead(FALSE),
-      m_iPosition(0),
-      m_iBufferSize(0) {}
-CFX_BufferReadStreamImp::~CFX_BufferReadStreamImp() {
-  if (m_bReleaseBufferRead && m_pBufferRead != NULL) {
-    m_pBufferRead->Release();
-  }
-}
-FX_BOOL CFX_BufferReadStreamImp::LoadBufferRead(IFX_BufferRead* pBufferRead,
-                                                int32_t iFileSize,
-                                                FX_DWORD dwAccess,
-                                                FX_BOOL bReleaseBufferRead) {
-  FXSYS_assert(m_pBufferRead == NULL && pBufferRead != NULL);
-  if (dwAccess & FX_STREAMACCESS_Write) {
-    return FALSE;
-  }
-  m_bReleaseBufferRead = bReleaseBufferRead;
-  m_pBufferRead = pBufferRead;
-  m_iBufferSize = iFileSize;
-  if (m_iBufferSize >= 0) {
-    return TRUE;
-  }
-  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
-    return FALSE;
-  }
-  m_iBufferSize = m_pBufferRead->GetBlockSize();
-  while (!m_pBufferRead->IsEOF()) {
-    m_pBufferRead->ReadNextBlock(FALSE);
-    m_iBufferSize += m_pBufferRead->GetBlockSize();
-  }
-  return TRUE;
-}
-int32_t CFX_BufferReadStreamImp::GetLength() const {
-  return m_iBufferSize;
-}
-int32_t CFX_BufferReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  int32_t iLength = GetLength();
-  switch (eSeek) {
-    case FX_STREAMSEEK_Begin:
-      m_iPosition = iOffset;
-      break;
-    case FX_STREAMSEEK_Current:
-      m_iPosition += iOffset;
-      break;
-    case FX_STREAMSEEK_End:
-      m_iPosition = iLength + iOffset;
-      break;
-  }
-  if (m_iPosition < 0) {
-    m_iPosition = 0;
-  } else if (m_iPosition >= iLength) {
-    m_iPosition = iLength;
-  }
-  return m_iPosition;
-}
-FX_BOOL CFX_BufferReadStreamImp::IsEOF() const {
-  return m_pBufferRead ? m_pBufferRead->IsEOF() : TRUE;
-}
-int32_t CFX_BufferReadStreamImp::ReadData(uint8_t* pBuffer,
-                                          int32_t iBufferSize) {
-  FXSYS_assert(m_pBufferRead != NULL);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  int32_t iLength = GetLength();
-  if (m_iPosition >= iLength) {
-    return 0;
-  }
-  if (iBufferSize > iLength - m_iPosition) {
-    iBufferSize = iLength - m_iPosition;
-  }
-  FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset();
-  FX_DWORD dwBlockSize = m_pBufferRead->GetBlockSize();
-  if (m_iPosition < (int32_t)dwBlockOffset) {
-    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
-      return 0;
-    }
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-  }
-  while (m_iPosition < (int32_t)dwBlockOffset ||
-         m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
-    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
-      break;
-    }
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-  }
-  if (m_iPosition < (int32_t)dwBlockOffset ||
-      m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
-    return 0;
-  }
-  const uint8_t* pBufferTmp = m_pBufferRead->GetBlockBuffer();
-  FX_DWORD dwOffsetTmp = m_iPosition - dwBlockOffset;
-  FX_DWORD dwCopySize =
-      std::min(iBufferSize, (int32_t)(dwBlockSize - dwOffsetTmp));
-  FXSYS_memcpy(pBuffer, pBufferTmp + dwOffsetTmp, dwCopySize);
-  dwOffsetTmp = dwCopySize;
-  iBufferSize -= dwCopySize;
-  while (iBufferSize > 0) {
-    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
-      break;
-    }
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-    pBufferTmp = m_pBufferRead->GetBlockBuffer();
-    dwCopySize = std::min((FX_DWORD)iBufferSize, dwBlockSize);
-    FXSYS_memcpy(pBuffer + dwOffsetTmp, pBufferTmp, dwCopySize);
-    dwOffsetTmp += dwCopySize;
-    iBufferSize -= dwCopySize;
-  }
-  m_iPosition += dwOffsetTmp;
-  return dwOffsetTmp;
-}
-int32_t CFX_BufferReadStreamImp::ReadString(FX_WCHAR* pStr,
-                                            int32_t iMaxLength,
-                                            FX_BOOL& bEOS) {
-  FXSYS_assert(m_pBufferRead != NULL);
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
-  if (iMaxLength <= 0) {
-    return 0;
-  }
-  int32_t i = 0;
-  while (i < iMaxLength && pStr[i] != L'\0') {
-    ++i;
-  }
-  bEOS = (m_iPosition >= GetLength()) || pStr[i] == L'\0';
-  return i;
-}
-CFX_FileWriteStreamImp::CFX_FileWriteStreamImp()
-    : m_pFileWrite(NULL), m_iPosition(0) {}
-FX_BOOL CFX_FileWriteStreamImp::LoadFileWrite(IFX_FileWrite* pFileWrite,
-                                              FX_DWORD dwAccess) {
-  FXSYS_assert(m_pFileWrite == NULL && pFileWrite != NULL);
-  if (dwAccess & FX_STREAMACCESS_Read) {
-    return FALSE;
-  }
-  if (dwAccess & FX_STREAMACCESS_Append) {
-    m_iPosition = pFileWrite->GetSize();
-  }
-  m_pFileWrite = pFileWrite;
-  return TRUE;
-}
-int32_t CFX_FileWriteStreamImp::GetLength() const {
-  if (!m_pFileWrite) {
-    return 0;
-  }
-  return (int32_t)m_pFileWrite->GetSize();
-}
-int32_t CFX_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  int32_t iLength = GetLength();
-  switch (eSeek) {
-    case FX_STREAMSEEK_Begin:
-      m_iPosition = iOffset;
-      break;
-    case FX_STREAMSEEK_Current:
-      m_iPosition += iOffset;
-      break;
-    case FX_STREAMSEEK_End:
-      m_iPosition = iLength + iOffset;
-      break;
-  }
-  if (m_iPosition < 0) {
-    m_iPosition = 0;
-  } else if (m_iPosition >= iLength) {
-    m_iPosition = iLength;
-  }
-  return m_iPosition;
-}
-FX_BOOL CFX_FileWriteStreamImp::IsEOF() const {
-  return m_iPosition >= GetLength();
-}
-int32_t CFX_FileWriteStreamImp::WriteData(const uint8_t* pBuffer,
-                                          int32_t iBufferSize) {
-  if (!m_pFileWrite) {
-    return 0;
-  }
-  if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) {
-    m_iPosition += iBufferSize;
-  }
-  return iBufferSize;
-}
-int32_t CFX_FileWriteStreamImp::WriteString(const FX_WCHAR* pStr,
-                                            int32_t iLength) {
-  return WriteData((const uint8_t*)pStr, iLength * sizeof(FX_WCHAR));
-}
-void CFX_FileWriteStreamImp::Flush() {
-  if (m_pFileWrite) {
-    m_pFileWrite->Flush();
-  }
-}
-CFX_BufferStreamImp::CFX_BufferStreamImp()
-    : CFX_StreamImp(),
-      m_pData(NULL),
-      m_iTotalSize(0),
-      m_iPosition(0),
-      m_iLength(0) {}
-FX_BOOL CFX_BufferStreamImp::LoadBuffer(uint8_t* pData,
-                                        int32_t iTotalSize,
-                                        FX_DWORD dwAccess) {
-  FXSYS_assert(m_pData == NULL);
-  FXSYS_assert(pData != NULL && iTotalSize > 0);
-  m_dwAccess = dwAccess;
-  m_pData = pData;
-  m_iTotalSize = iTotalSize;
-  m_iPosition = 0;
-  m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iTotalSize;
-  return TRUE;
-}
-int32_t CFX_BufferStreamImp::GetLength() const {
-  FXSYS_assert(m_pData != NULL);
-  return m_iLength;
-}
-int32_t CFX_BufferStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  FXSYS_assert(m_pData != NULL);
-  if (eSeek == FX_STREAMSEEK_Begin) {
-    m_iPosition = iOffset;
-  } else if (eSeek == FX_STREAMSEEK_Current) {
-    m_iPosition += iOffset;
-  } else if (eSeek == FX_STREAMSEEK_End) {
-    m_iPosition = m_iLength + iOffset;
-  }
-  if (m_iPosition > m_iLength) {
-    m_iPosition = m_iLength;
-  }
-  if (m_iPosition < 0) {
-    m_iPosition = 0;
-  }
-  return m_iPosition;
-}
-int32_t CFX_BufferStreamImp::GetPosition() {
-  FXSYS_assert(m_pData != NULL);
-  return m_iPosition;
-}
-FX_BOOL CFX_BufferStreamImp::IsEOF() const {
-  FXSYS_assert(m_pData != NULL);
-  return m_iPosition >= m_iLength;
-}
-int32_t CFX_BufferStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
-  FXSYS_assert(m_pData != NULL);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  int32_t iLen = std::min(m_iLength - m_iPosition, iBufferSize);
-  if (iLen <= 0) {
-    return 0;
-  }
-  FXSYS_memcpy(pBuffer, m_pData + m_iPosition, iLen);
-  m_iPosition += iLen;
-  return iLen;
-}
-int32_t CFX_BufferStreamImp::ReadString(FX_WCHAR* pStr,
-                                        int32_t iMaxLength,
-                                        FX_BOOL& bEOS) {
-  FXSYS_assert(m_pData != NULL);
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  int32_t iLen = std::min((m_iLength - m_iPosition) / 2, iMaxLength);
-  if (iLen <= 0) {
-    return 0;
-  }
-  const FX_WCHAR* pSrc = (const FX_WCHAR*)(FX_CHAR*)(m_pData + m_iPosition);
-  int32_t iCount = 0;
-  while (*pSrc != L'\0' && iCount < iLen) {
-    *pStr++ = *pSrc++, iCount++;
-  }
-  m_iPosition += iCount * 2;
-  bEOS = (*pSrc == L'\0') || (m_iPosition >= m_iLength);
-  return iCount;
-}
-int32_t CFX_BufferStreamImp::WriteData(const uint8_t* pBuffer,
-                                       int32_t iBufferSize) {
-  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  int32_t iLen = std::min(m_iTotalSize - m_iPosition, iBufferSize);
-  if (iLen <= 0) {
-    return 0;
-  }
-  FXSYS_memcpy(m_pData + m_iPosition, pBuffer, iLen);
-  m_iPosition += iLen;
-  if (m_iPosition > m_iLength) {
-    m_iLength = m_iPosition;
-  }
-  return iLen;
-}
-int32_t CFX_BufferStreamImp::WriteString(const FX_WCHAR* pStr,
-                                         int32_t iLength) {
-  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
-  FXSYS_assert(pStr != NULL && iLength > 0);
-  int32_t iLen = std::min((m_iTotalSize - m_iPosition) / 2, iLength);
-  if (iLen <= 0) {
-    return 0;
-  }
-  FXSYS_memcpy(m_pData + m_iPosition, pStr, iLen * 2);
-  m_iPosition += iLen * 2;
-  if (m_iPosition > m_iLength) {
-    m_iLength = m_iPosition;
-  }
-  return iLen;
-}
-IFX_Stream* IFX_Stream::CreateTextStream(IFX_Stream* pBaseStream,
-                                         FX_BOOL bDeleteOnRelease) {
-  FXSYS_assert(pBaseStream != NULL);
-  return new CFX_TextStream(pBaseStream, bDeleteOnRelease);
-}
-CFX_TextStream::CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream)
-    : m_wCodePage(FX_CODEPAGE_DefANSI),
-      m_wBOMLength(0),
-      m_dwBOM(0),
-      m_pBuf(NULL),
-      m_iBufSize(0),
-      m_bDelStream(bDelStream),
-      m_pStreamImp(pStream),
-      m_iRefCount(1) {
-  FXSYS_assert(m_pStreamImp != NULL);
-  m_pStreamImp->Retain();
-  InitStream();
-}
-CFX_TextStream::~CFX_TextStream() {
-  m_pStreamImp->Release();
-  if (m_bDelStream) {
-    m_pStreamImp->Release();
-  }
-  if (m_pBuf != NULL) {
-    FX_Free(m_pBuf);
-  }
-}
-void CFX_TextStream::InitStream() {
-  int32_t iPosition = m_pStreamImp->GetPosition();
-  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0);
-  m_pStreamImp->ReadData((uint8_t*)&m_dwBOM, 3);
-#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
-  m_dwBOM &= 0x00FFFFFF;
-  if (m_dwBOM == 0x00BFBBEF) {
-    m_wBOMLength = 3;
-    m_wCodePage = FX_CODEPAGE_UTF8;
-  } else {
-    m_dwBOM &= 0x0000FFFF;
-    if (m_dwBOM == 0x0000FFFE) {
-      m_wBOMLength = 2;
-      m_wCodePage = FX_CODEPAGE_UTF16BE;
-    } else if (m_dwBOM == 0x0000FEFF) {
-      m_wBOMLength = 2;
-      m_wCodePage = FX_CODEPAGE_UTF16LE;
-    } else {
-      m_wBOMLength = 0;
-      m_dwBOM = 0;
-      m_wCodePage = FXSYS_GetACP();
-    }
-  }
-#else
-  m_dwBOM &= 0xFFFFFF00;
-  if (m_dwBOM == 0xEFBBBF00) {
-    m_wBOMLength = 3;
-    m_wCodePage = FX_CODEPAGE_UTF8;
-  } else {
-    m_dwBOM &= 0xFFFF0000;
-    if (m_dwBOM == 0xFEFF0000) {
-      m_wBOMLength = 2;
-      m_wCodePage = FX_CODEPAGE_UTF16BE;
-    } else if (m_dwBOM == 0xFFFE0000) {
-      m_wBOMLength = 2;
-      m_wCodePage = FX_CODEPAGE_UTF16LE;
-    } else {
-      m_wBOMLength = 0;
-      m_dwBOM = 0;
-      m_wCodePage = FXSYS_GetACP();
-    }
-  }
-#endif
-  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition));
-}
-void CFX_TextStream::Release() {
-  if (--m_iRefCount < 1) {
-    delete this;
-  }
-}
-IFX_Stream* CFX_TextStream::Retain() {
-  m_iRefCount++;
-  return this;
-}
-FX_DWORD CFX_TextStream::GetAccessModes() const {
-  return m_pStreamImp->GetAccessModes() | FX_STREAMACCESS_Text;
-}
-int32_t CFX_TextStream::GetLength() const {
-  return m_pStreamImp->GetLength();
-}
-int32_t CFX_TextStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  return m_pStreamImp->Seek(eSeek, iOffset);
-}
-int32_t CFX_TextStream::GetPosition() {
-  return m_pStreamImp->GetPosition();
-}
-FX_BOOL CFX_TextStream::IsEOF() const {
-  return m_pStreamImp->IsEOF();
-}
-int32_t CFX_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
-  return m_pStreamImp->ReadData(pBuffer, iBufferSize);
-}
-int32_t CFX_TextStream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-  return m_pStreamImp->WriteData(pBuffer, iBufferSize);
-}
-void CFX_TextStream::Flush() {
-  m_pStreamImp->Flush();
-}
-FX_BOOL CFX_TextStream::SetLength(int32_t iLength) {
-  return m_pStreamImp->SetLength(iLength);
-}
-FX_WORD CFX_TextStream::GetCodePage() const {
-  return m_wCodePage;
-}
-IFX_Stream* CFX_TextStream::CreateSharedStream(FX_DWORD dwAccess,
-                                               int32_t iOffset,
-                                               int32_t iLength) {
-  IFX_Stream* pSR =
-      m_pStreamImp->CreateSharedStream(dwAccess, iOffset, iLength);
-  if (pSR == NULL) {
-    return NULL;
-  }
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return new CFX_TextStream(pSR, TRUE);
-  }
-  return pSR;
-}
-int32_t CFX_TextStream::GetBOM(uint8_t bom[4]) const {
-  if (m_wBOMLength < 1) {
-    return 0;
-  }
-  *(FX_DWORD*)bom = m_dwBOM;
-  return m_wBOMLength;
-}
-FX_WORD CFX_TextStream::SetCodePage(FX_WORD wCodePage) {
-  if (m_wBOMLength > 0) {
-    return m_wCodePage;
-  }
-  FX_WORD v = m_wCodePage;
-  m_wCodePage = wCodePage;
-  return v;
-}
-int32_t CFX_TextStream::ReadString(FX_WCHAR* pStr,
-                                   int32_t iMaxLength,
-                                   FX_BOOL& bEOS,
-                                   int32_t const* pByteSize) {
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  int32_t iLen;
-  if (m_wCodePage == FX_CODEPAGE_UTF16LE ||
-      m_wCodePage == FX_CODEPAGE_UTF16BE) {
-    int32_t iBytes = pByteSize == NULL ? iMaxLength * 2 : *pByteSize;
-    iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes);
-    iMaxLength = iLen / 2;
-    if (sizeof(FX_WCHAR) > 2) {
-      FX_UTF16ToWChar(pStr, iMaxLength);
-    }
-#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_
-    if (m_wCodePage == FX_CODEPAGE_UTF16LE) {
-      FX_SwapByteOrder(pStr, iMaxLength);
-    }
-#else
-    if (m_wCodePage == FX_CODEPAGE_UTF16BE) {
-      FX_SwapByteOrder(pStr, iMaxLength);
-    }
-#endif
-  } else {
-    int32_t pos = m_pStreamImp->GetPosition();
-    int32_t iBytes = pByteSize == NULL ? iMaxLength : *pByteSize;
-    iBytes = std::min(iBytes, m_pStreamImp->GetLength() - pos);
-    if (iBytes > 0) {
-      if (m_pBuf == NULL) {
-        m_pBuf = FX_Alloc(uint8_t, iBytes);
-        m_iBufSize = iBytes;
-      } else if (iBytes > m_iBufSize) {
-        m_pBuf = FX_Realloc(uint8_t, m_pBuf, iBytes);
-        m_iBufSize = iBytes;
-      }
-      iLen = m_pStreamImp->ReadData(m_pBuf, iBytes);
-      int32_t iSrc = iLen;
-      int32_t iDecode = FX_DecodeString(m_wCodePage, (const FX_CHAR*)m_pBuf,
-                                        &iSrc, pStr, &iMaxLength, TRUE);
-      m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen);
-      if (iDecode < 1) {
-        return -1;
-      }
-    } else {
-      iMaxLength = 0;
-    }
-  }
-  bEOS = m_pStreamImp->IsEOF();
-  return iMaxLength;
-}
-int32_t CFX_TextStream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-  FXSYS_assert(pStr != NULL && iLength > 0);
-  if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) {
-    return -1;
-  }
-  if (m_wCodePage == FX_CODEPAGE_UTF8) {
-    int32_t len = iLength;
-    CFX_UTF8Encoder encoder;
-    while (len-- > 0) {
-      encoder.Input(*pStr++);
-    }
-    CFX_ByteStringC bsResult = encoder.GetResult();
-    m_pStreamImp->WriteData((const uint8_t*)bsResult.GetCStr(),
-                            bsResult.GetLength());
-  }
-  return iLength;
-}
-CFX_Stream::CFX_Stream()
-    : m_eStreamType(FX_SREAMTYPE_Unknown),
-      m_pStreamImp(NULL),
-      m_dwAccess(0),
-      m_iTotalSize(0),
-      m_iPosition(0),
-      m_iStart(0),
-      m_iLength(0),
-      m_iRefCount(1) {}
-CFX_Stream::~CFX_Stream() {
-  if (m_eStreamType != FX_STREAMTYPE_Stream && m_pStreamImp != NULL) {
-    m_pStreamImp->Release();
-  }
-}
-FX_BOOL CFX_Stream::LoadFile(const FX_WCHAR* pszSrcFileName,
-                             FX_DWORD dwAccess) {
-  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
-    return FALSE;
-  }
-  if (pszSrcFileName == NULL || FXSYS_wcslen(pszSrcFileName) < 1) {
-    return FALSE;
-  }
-  m_pStreamImp = new CFX_FileStreamImp();
-  FX_BOOL bRet =
-      ((CFX_FileStreamImp*)m_pStreamImp)->LoadFile(pszSrcFileName, dwAccess);
-  if (!bRet) {
-    m_pStreamImp->Release();
-    m_pStreamImp = NULL;
-  } else {
-    m_eStreamType = FX_STREAMTYPE_File;
-    m_dwAccess = dwAccess;
-    m_iLength = m_pStreamImp->GetLength();
-  }
-  return bRet;
-}
-FX_BOOL CFX_Stream::LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess) {
-  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
-    return FALSE;
-  }
-  if (pFileRead == NULL) {
-    return FALSE;
-  }
-  m_pStreamImp = new CFX_FileReadStreamImp();
-  FX_BOOL bRet =
-      ((CFX_FileReadStreamImp*)m_pStreamImp)->LoadFileRead(pFileRead, dwAccess);
-  if (!bRet) {
-    m_pStreamImp->Release();
-    m_pStreamImp = NULL;
-  } else {
-    m_eStreamType = FX_STREAMTYPE_File;
-    m_dwAccess = dwAccess;
-    m_iLength = m_pStreamImp->GetLength();
-  }
-  return bRet;
-}
-FX_BOOL CFX_Stream::LoadFileWrite(IFX_FileWrite* pFileWrite,
-                                  FX_DWORD dwAccess) {
-  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
-    return FALSE;
-  }
-  if (pFileWrite == NULL) {
-    return FALSE;
-  }
-  m_pStreamImp = new CFX_FileWriteStreamImp();
-  FX_BOOL bRet = ((CFX_FileWriteStreamImp*)m_pStreamImp)
-                     ->LoadFileWrite(pFileWrite, dwAccess);
-  if (!bRet) {
-    m_pStreamImp->Release();
-    m_pStreamImp = NULL;
-  } else {
-    m_eStreamType = FX_STREAMTYPE_File;
-    m_dwAccess = dwAccess;
-    m_iLength = m_pStreamImp->GetLength();
-  }
-  return bRet;
-}
-FX_BOOL CFX_Stream::LoadBuffer(uint8_t* pData,
-                               int32_t iTotalSize,
-                               FX_DWORD dwAccess) {
-  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
-    return FALSE;
-  }
-  if (pData == NULL || iTotalSize < 1) {
-    return FALSE;
-  }
-  m_pStreamImp = new CFX_BufferStreamImp();
-  FX_BOOL bRet = ((CFX_BufferStreamImp*)m_pStreamImp)
-                     ->LoadBuffer(pData, iTotalSize, dwAccess);
-  if (!bRet) {
-    m_pStreamImp->Release();
-    m_pStreamImp = NULL;
-  } else {
-    m_eStreamType = FX_STREAMTYPE_Buffer;
-    m_dwAccess = dwAccess;
-    m_iLength = m_pStreamImp->GetLength();
-  }
-  return bRet;
-}
-FX_BOOL CFX_Stream::LoadBufferRead(IFX_BufferRead* pBufferRead,
-                                   int32_t iFileSize,
-                                   FX_DWORD dwAccess,
-                                   FX_BOOL bReleaseBufferRead) {
-  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
-    return FALSE;
-  }
-  if (!pBufferRead) {
-    return FALSE;
-  }
-  m_pStreamImp = new CFX_BufferReadStreamImp;
-  FX_BOOL bRet = ((CFX_BufferReadStreamImp*)m_pStreamImp)
-                     ->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
-                                      bReleaseBufferRead);
-  if (!bRet) {
-    m_pStreamImp->Release();
-    m_pStreamImp = NULL;
-  } else {
-    m_eStreamType = FX_STREAMTYPE_BufferRead;
-    m_dwAccess = dwAccess;
-    m_iLength = m_pStreamImp->GetLength();
-  }
-  return bRet;
-}
-void CFX_Stream::Release() {
-  if (--m_iRefCount < 1) {
-    delete this;
-  }
-}
-IFX_Stream* CFX_Stream::Retain() {
-  m_iRefCount++;
-  return this;
-}
-int32_t CFX_Stream::GetLength() const {
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  if (m_eStreamType == FX_STREAMTYPE_File ||
-      m_eStreamType == FX_STREAMTYPE_Buffer) {
-    return m_pStreamImp->GetLength();
-  }
-  return m_iLength;
-}
-int32_t CFX_Stream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  if (m_eStreamType == FX_STREAMTYPE_File ||
-      m_eStreamType == FX_STREAMTYPE_Buffer) {
-    return m_iPosition = m_pStreamImp->Seek(eSeek, iOffset);
-  }
-  int32_t iEnd = m_iStart + m_iLength;
-  int32_t iPosition = m_iStart + iOffset;
-  if (eSeek == FX_STREAMSEEK_Begin) {
-    m_iPosition = iPosition;
-  } else if (eSeek == FX_STREAMSEEK_Current) {
-    m_iPosition += iOffset;
-  } else if (eSeek == FX_STREAMSEEK_End) {
-    m_iPosition = iEnd + iOffset;
-  }
-  if (m_iPosition > iEnd) {
-    m_iPosition = iEnd;
-  }
-  if (m_iPosition < m_iStart) {
-    m_iPosition = m_iStart;
-  }
-  return m_iPosition - m_iStart;
-}
-int32_t CFX_Stream::GetPosition() {
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  if (m_eStreamType == FX_STREAMTYPE_File ||
-      m_eStreamType == FX_STREAMTYPE_Buffer) {
-    return m_iPosition = m_pStreamImp->GetPosition();
-  }
-  return m_iPosition - m_iStart;
-}
-FX_BOOL CFX_Stream::IsEOF() const {
-  if (m_pStreamImp == NULL) {
-    return TRUE;
-  }
-  if (m_eStreamType == FX_STREAMTYPE_File ||
-      m_eStreamType == FX_STREAMTYPE_Buffer) {
-    return m_pStreamImp->IsEOF();
-  }
-  return m_iPosition >= m_iStart + m_iLength;
-}
-int32_t CFX_Stream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  int32_t iLen = std::min(m_iStart + m_iLength - m_iPosition, iBufferSize);
-  if (iLen <= 0) {
-    return 0;
-  }
-  if (m_pStreamImp->GetPosition() != m_iPosition) {
-    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
-  }
-  iLen = m_pStreamImp->ReadData(pBuffer, iLen);
-  m_iPosition = m_pStreamImp->GetPosition();
-  return iLen;
-}
-int32_t CFX_Stream::ReadString(FX_WCHAR* pStr,
-                               int32_t iMaxLength,
-                               FX_BOOL& bEOS,
-                               int32_t const* pByteSize) {
-  FXSYS_assert(pStr != NULL && iMaxLength > 0);
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  int32_t iEnd = m_iStart + m_iLength;
-  int32_t iLen = iEnd - m_iPosition;
-  if (pByteSize != NULL) {
-    iLen = std::min(iLen, *pByteSize);
-  }
-  iLen = std::min(iEnd / 2, iMaxLength);
-  if (iLen <= 0) {
-    return 0;
-  }
-  if (m_pStreamImp->GetPosition() != m_iPosition) {
-    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
-  }
-  iLen = m_pStreamImp->ReadString(pStr, iLen, bEOS);
-  m_iPosition = m_pStreamImp->GetPosition();
-  if (iLen > 0 && m_iPosition >= iEnd) {
-    bEOS = TRUE;
-  }
-  return iLen;
-}
-int32_t CFX_Stream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
-    return -1;
-  }
-  int32_t iLen = iBufferSize;
-  if (m_eStreamType == FX_STREAMTYPE_Stream) {
-    iLen = std::min(m_iStart + m_iTotalSize - m_iPosition, iBufferSize);
-    if (iLen <= 0) {
-      return 0;
-    }
-  }
-  int32_t iEnd = m_iStart + m_iLength;
-  if (m_pStreamImp->GetPosition() != m_iPosition) {
-    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
-  }
-  iLen = m_pStreamImp->WriteData(pBuffer, iLen);
-  m_iPosition = m_pStreamImp->GetPosition();
-  if (m_iPosition > iEnd) {
-    m_iLength = m_iPosition - m_iStart;
-  }
-  return iLen;
-}
-int32_t CFX_Stream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-  FXSYS_assert(pStr != NULL && iLength > 0);
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
-    return -1;
-  }
-  int32_t iLen = iLength;
-  if (m_eStreamType == FX_STREAMTYPE_Stream) {
-    iLen = std::min((m_iStart + m_iTotalSize - m_iPosition) / 2, iLength);
-    if (iLen <= 0) {
-      return 0;
-    }
-  }
-  int32_t iEnd = m_iStart + m_iLength;
-  if (m_pStreamImp->GetPosition() != m_iPosition) {
-    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
-  }
-  iLen = m_pStreamImp->WriteString(pStr, iLen);
-  m_iPosition = m_pStreamImp->GetPosition();
-  if (m_iPosition > iEnd) {
-    m_iLength = m_iPosition - m_iStart;
-  }
-  return iLen;
-}
-void CFX_Stream::Flush() {
-  if (m_pStreamImp == NULL) {
-    return;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
-    return;
-  }
-  m_pStreamImp->Flush();
-}
-FX_BOOL CFX_Stream::SetLength(int32_t iLength) {
-  if (m_pStreamImp == NULL) {
-    return FALSE;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
-    return FALSE;
-  }
-  return m_pStreamImp->SetLength(iLength);
-}
-int32_t CFX_Stream::GetBOM(uint8_t bom[4]) const {
-  if (m_pStreamImp == NULL) {
-    return -1;
-  }
-  return 0;
-}
-FX_WORD CFX_Stream::GetCodePage() const {
-#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
-  return FX_CODEPAGE_UTF16LE;
-#else
-  return FX_CODEPAGE_UTF16BE;
-#endif
-}
-FX_WORD CFX_Stream::SetCodePage(FX_WORD wCodePage) {
-#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
-  return FX_CODEPAGE_UTF16LE;
-#else
-  return FX_CODEPAGE_UTF16BE;
-#endif
-}
-IFX_Stream* CFX_Stream::CreateSharedStream(FX_DWORD dwAccess,
-                                           int32_t iOffset,
-                                           int32_t iLength) {
-  FXSYS_assert(iLength > 0);
-  if (m_pStreamImp == NULL) {
-    return NULL;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Text) != 0 &&
-      (dwAccess & FX_STREAMACCESS_Text) == 0) {
-    return NULL;
-  }
-  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0 &&
-      (dwAccess & FX_STREAMACCESS_Write) != 0) {
-    return NULL;
-  }
-  int32_t iStart = m_iStart + iOffset;
-  int32_t iTotal = m_iStart + m_iLength;
-  if (iStart < m_iStart || iStart >= iTotal) {
-    return NULL;
-  }
-  int32_t iEnd = iStart + iLength;
-  if (iEnd < iStart || iEnd > iTotal) {
-    return NULL;
-  }
-  CFX_Stream* pShared = new CFX_Stream;
-  pShared->m_eStreamType = FX_STREAMTYPE_Stream;
-  pShared->m_pStreamImp = m_pStreamImp;
-  pShared->m_dwAccess = dwAccess;
-  pShared->m_iTotalSize = iLength;
-  pShared->m_iPosition = iStart;
-  pShared->m_iStart = iStart;
-  pShared->m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iLength;
-  if (dwAccess & FX_STREAMACCESS_Text) {
-    return IFX_Stream::CreateTextStream(pShared, TRUE);
-  }
-  return pShared;
-}
-IFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream,
-                                FX_BOOL bReleaseStream) {
-  FXSYS_assert(pBaseStream != NULL);
-  return new CFGAS_FileRead(pBaseStream, bReleaseStream);
-}
-CFGAS_FileRead::CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream)
-    : m_bReleaseStream(bReleaseStream), m_pStream(pStream) {
-  FXSYS_assert(m_pStream != NULL);
-}
-CFGAS_FileRead::~CFGAS_FileRead() {
-  if (m_bReleaseStream) {
-    m_pStream->Release();
-  }
-}
-FX_FILESIZE CFGAS_FileRead::GetSize() {
-  return (FX_FILESIZE)m_pStream->GetLength();
-}
-FX_BOOL CFGAS_FileRead::ReadBlock(void* buffer,
-                                  FX_FILESIZE offset,
-                                  size_t size) {
-  m_pStream->Seek(FX_STREAMSEEK_Begin, (int32_t)offset);
-  int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size);
-  return iLen == (int32_t)size;
-}
-
-IFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
-                                FX_FILESIZE iFileSize,
-                                FX_BOOL bReleaseStream) {
-  if (!pBufferRead) {
-    return NULL;
-  }
-  return new CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream);
-}
-CFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
-                                   FX_FILESIZE iFileSize,
-                                   FX_BOOL bReleaseStream)
-    : m_pBufferRead(pBufferRead),
-      m_bReleaseStream(bReleaseStream),
-      m_iBufSize(iFileSize) {
-  FXSYS_assert(m_pBufferRead);
-}
-CFX_BufferAccImp::~CFX_BufferAccImp() {
-  if (m_bReleaseStream && m_pBufferRead) {
-    m_pBufferRead->Release();
-  }
-}
-FX_FILESIZE CFX_BufferAccImp::GetSize() {
-  if (!m_pBufferRead) {
-    return 0;
-  }
-  if (m_iBufSize >= 0) {
-    return m_iBufSize;
-  }
-  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
-    return 0;
-  }
-  m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize();
-  while (!m_pBufferRead->IsEOF()) {
-    m_pBufferRead->ReadNextBlock(FALSE);
-    m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize();
-  }
-  return m_iBufSize;
-}
-FX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer,
-                                    FX_FILESIZE offset,
-                                    size_t size) {
-  if (!m_pBufferRead) {
-    return FALSE;
-  }
-  if (!buffer || !size) {
-    return TRUE;
-  }
-  FX_FILESIZE dwBufSize = GetSize();
-  if (offset >= dwBufSize) {
-    return FALSE;
-  }
-  size_t dwBlockSize = m_pBufferRead->GetBlockSize();
-  FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset();
-  if (offset < dwBlockOffset) {
-    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
-      return FALSE;
-    }
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-  }
-  while (offset < dwBlockOffset ||
-         offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
-    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
-      break;
-    }
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-  }
-  if (offset < dwBlockOffset ||
-      offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
-    return FALSE;
-  }
-  const uint8_t* pBuffer = m_pBufferRead->GetBlockBuffer();
-  const FX_FILESIZE dwOffset = offset - dwBlockOffset;
-  size_t dwCopySize =
-      std::min(size, static_cast<size_t>(dwBlockSize - dwOffset));
-  FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize);
-  offset = dwCopySize;
-  size -= dwCopySize;
-  while (size) {
-    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
-      break;
-    }
-    dwBlockOffset = m_pBufferRead->GetBlockOffset();
-    dwBlockSize = m_pBufferRead->GetBlockSize();
-    pBuffer = m_pBufferRead->GetBlockBuffer();
-    dwCopySize = std::min(size, dwBlockSize);
-    FXSYS_memcpy(((uint8_t*)buffer) + offset, pBuffer, dwCopySize);
-    offset += dwCopySize;
-    size -= dwCopySize;
-  }
-  return TRUE;
-}
-
-IFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
-                                  FX_BOOL bReleaseStream) {
-  FXSYS_assert(pBaseStream != NULL);
-  return new CFGAS_FileWrite(pBaseStream, bReleaseStream);
-}
-
-CFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream)
-    : m_pStream(pStream), m_bReleaseStream(bReleaseStream) {
-  FXSYS_assert(m_pStream != NULL);
-}
-CFGAS_FileWrite::~CFGAS_FileWrite() {
-  if (m_bReleaseStream) {
-    m_pStream->Release();
-  }
-}
-FX_FILESIZE CFGAS_FileWrite::GetSize() {
-  return m_pStream->GetLength();
-}
-FX_BOOL CFGAS_FileWrite::Flush() {
-  m_pStream->Flush();
-  return TRUE;
-}
-FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) {
-  return m_pStream->WriteData((const uint8_t*)pData, (int32_t)size) ==
-         (int32_t)size;
-}
-FX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData,
-                                    FX_FILESIZE offset,
-                                    size_t size) {
-  m_pStream->Seek(FX_STREAMSEEK_Begin, offset);
-  int32_t iLen = m_pStream->WriteData((uint8_t*)pData, (int32_t)size);
-  return iLen == (int32_t)size;
-}
diff --git a/xfa/src/fgas/crt/fgas_stream.h b/xfa/src/fgas/crt/fgas_stream.h
deleted file mode 100644
index cc40a76..0000000
--- a/xfa/src/fgas/crt/fgas_stream.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_STREAM_H_
-#define XFA_SRC_FGAS_CRT_FGAS_STREAM_H_
-
-#include "core/include/fxcrt/fx_stream.h"
-#include "core/include/fxcrt/fx_system.h"
-
-class IFX_Stream;
-
-IFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream,
-                                FX_BOOL bReleaseStream = FALSE);
-IFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
-                                FX_FILESIZE iFileSize = -1,
-                                FX_BOOL bReleaseStream = TRUE);
-IFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
-                                  FX_BOOL bReleaseStream = FALSE);
-enum FX_STREAMACCESS {
-  FX_STREAMACCESS_Binary = 0x00,
-  FX_STREAMACCESS_Text = 0x01,
-  FX_STREAMACCESS_Read = 0x02,
-  FX_STREAMACCESS_Write = 0x04,
-  FX_STREAMACCESS_Truncate = 0x10,
-  FX_STREAMACCESS_Append = 0x20,
-  FX_STREAMACCESS_Create = 0x80,
-};
-
-enum FX_STREAMSEEK {
-  FX_STREAMSEEK_Begin = 0,
-  FX_STREAMSEEK_Current,
-  FX_STREAMSEEK_End,
-};
-
-class IFX_Stream {
- public:
-  static IFX_Stream* CreateStream(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
-  static IFX_Stream* CreateStream(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
-  static IFX_Stream* CreateStream(const FX_WCHAR* pszFileName,
-                                  FX_DWORD dwAccess);
-  static IFX_Stream* CreateStream(uint8_t* pData,
-                                  int32_t length,
-                                  FX_DWORD dwAccess);
-  static IFX_Stream* CreateStream(IFX_BufferRead* pBufferRead,
-                                  FX_DWORD dwAccess,
-                                  int32_t iFileSize = -1,
-                                  FX_BOOL bReleaseBufferRead = TRUE);
-  static IFX_Stream* CreateTextStream(IFX_Stream* pBaseStream,
-                                      FX_BOOL bDeleteOnRelease);
-  virtual ~IFX_Stream() {}
-  virtual void Release() = 0;
-  virtual IFX_Stream* Retain() = 0;
-  virtual FX_DWORD GetAccessModes() const = 0;
-  virtual int32_t GetLength() const = 0;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0;
-  virtual int32_t GetPosition() = 0;
-  virtual FX_BOOL IsEOF() const = 0;
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0;
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS,
-                             int32_t const* pByteSize = NULL) = 0;
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0;
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0;
-  virtual void Flush() = 0;
-  virtual FX_BOOL SetLength(int32_t iLength) = 0;
-  virtual int32_t GetBOM(uint8_t bom[4]) const = 0;
-  virtual FX_WORD GetCodePage() const = 0;
-  virtual FX_WORD SetCodePage(FX_WORD wCodePage) = 0;
-  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
-                                         int32_t iOffset,
-                                         int32_t iLength) = 0;
-};
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_STREAM_H_
diff --git a/xfa/src/fgas/crt/fgas_system.cpp b/xfa/src/fgas/crt/fgas_system.cpp
deleted file mode 100644
index a4ca754..0000000
--- a/xfa/src/fgas/crt/fgas_system.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_system.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_system.h"
-
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
-    _FX_OS_ == _FX_WIN64_
-#include <io.h>
-#elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_
-#include <sys/times.h>
-#endif
-
-namespace {
-
-inline FX_BOOL FX_isupper(int32_t ch) {
-  return ch >= 'A' && ch <= 'Z';
-}
-
-inline int32_t FX_tolower(int32_t ch) {
-  return FX_isupper(ch) ? (ch + 0x20) : ch;
-}
-
-}  // namespace
-
-int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count) {
-  FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
-  FX_WCHAR wch1 = 0, wch2 = 0;
-  while (count-- > 0) {
-    wch1 = (FX_WCHAR)FX_tolower(*s1++);
-    wch2 = (FX_WCHAR)FX_tolower(*s2++);
-    if (wch1 != wch2) {
-      break;
-    }
-  }
-  return wch1 - wch2;
-}
-
-int32_t FX_filelength(FXSYS_FILE* file) {
-  FXSYS_assert(file != NULL);
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-  return _filelength(_fileno(file));
-#else
-  int32_t iPos = FXSYS_ftell(file);
-  FXSYS_fseek(file, 0, FXSYS_SEEK_END);
-  int32_t iLen = FXSYS_ftell(file);
-  FXSYS_fseek(file, iPos, FXSYS_SEEK_SET);
-  return iLen;
-#endif
-}
-
-FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size) {
-  FXSYS_assert(file != NULL);
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-  return _chsize(_fileno(file), size) == 0;
-#elif _FX_OS_ == _FX_WIN32_MOBILE_
-  HANDLE hFile = _fileno(file);
-  FX_DWORD dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT);
-  ::SetFilePointer(hFile, size, 0, FILE_BEGIN);
-  FX_BOOL bRet = ::SetEndOfFile(hFile);
-  ::SetFilePointer(hFile, (int32_t)dwPos, 0, FILE_BEGIN);
-  return bRet;
-#else
-  return FALSE;
-#endif
-}
-
-FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr, int32_t iLength, int32_t* pUsedLen) {
-  FXSYS_assert(pwsStr != NULL);
-  if (iLength < 0) {
-    iLength = FXSYS_wcslen(pwsStr);
-  }
-  if (iLength == 0) {
-    return 0.0f;
-  }
-  int32_t iUsedLen = 0;
-  FX_BOOL bNegtive = FALSE;
-  switch (pwsStr[iUsedLen]) {
-    case '-':
-      bNegtive = TRUE;
-    case '+':
-      iUsedLen++;
-      break;
-  }
-  FX_FLOAT fValue = 0.0f;
-  while (iUsedLen < iLength) {
-    FX_WCHAR wch = pwsStr[iUsedLen];
-    if (wch >= L'0' && wch <= L'9') {
-      fValue = fValue * 10.0f + (wch - L'0');
-    } else {
-      break;
-    }
-    iUsedLen++;
-  }
-  if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
-    FX_FLOAT fPrecise = 0.1f;
-    while (++iUsedLen < iLength) {
-      FX_WCHAR wch = pwsStr[iUsedLen];
-      if (wch >= L'0' && wch <= L'9') {
-        fValue += (wch - L'0') * fPrecise;
-        fPrecise *= 0.1f;
-      } else {
-        break;
-      }
-    }
-  }
-  if (pUsedLen) {
-    *pUsedLen = iUsedLen;
-  }
-  return bNegtive ? -fValue : fValue;
-}
diff --git a/xfa/src/fgas/crt/fgas_system.h b/xfa/src/fgas/crt/fgas_system.h
deleted file mode 100644
index fb5a88e..0000000
--- a/xfa/src/fgas/crt/fgas_system.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_SYSTEM_H_
-#define XFA_SRC_FGAS_CRT_FGAS_SYSTEM_H_
-
-#include "core/include/fxcrt/fx_system.h"
-
-#define FX_RAD2DEG(r) ((r)*180.0f / FX_PI)
-#define FX_DEG2RAD(a) ((a)*FX_PI / 180.0f)
-
-FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr,
-                   int32_t iLength = -1,
-                   int32_t* pUsedLen = NULL);
-int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count);
-
-int32_t FX_filelength(FXSYS_FILE* file);
-FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size);
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_SYSTEM_H_
diff --git a/xfa/src/fgas/crt/fgas_utils.cpp b/xfa/src/fgas/crt/fgas_utils.cpp
deleted file mode 100644
index 8b3ed0a..0000000
--- a/xfa/src/fgas/crt/fgas_utils.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class FX_BASEARRAYDATA : public CFX_Target {
- public:
-  FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize)
-      : iGrowSize(growsize),
-        iBlockSize(blocksize),
-        iTotalCount(0),
-        iBlockCount(0),
-        pBuffer(nullptr) {}
-
-  ~FX_BASEARRAYDATA() { FX_Free(pBuffer); }
-
-  int32_t iGrowSize;
-  int32_t iBlockSize;
-  int32_t iTotalCount;
-  int32_t iBlockCount;
-  uint8_t* pBuffer;
-};
-CFX_BaseArray::CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize) {
-  FXSYS_assert(iGrowSize > 0 && iBlockSize > 0);
-  m_pData = new FX_BASEARRAYDATA(iGrowSize, iBlockSize);
-}
-CFX_BaseArray::~CFX_BaseArray() {
-  RemoveAll();
-  delete m_pData;
-}
-int32_t CFX_BaseArray::GetSize() const {
-  return m_pData->iBlockCount;
-}
-int32_t CFX_BaseArray::GetBlockSize() const {
-  return m_pData->iBlockSize;
-}
-uint8_t* CFX_BaseArray::AddSpaceTo(int32_t index) {
-  FXSYS_assert(index > -1);
-  uint8_t*& pBuffer = m_pData->pBuffer;
-  int32_t& iTotalCount = m_pData->iTotalCount;
-  int32_t iBlockSize = m_pData->iBlockSize;
-  if (index >= iTotalCount) {
-    int32_t iGrowSize = m_pData->iGrowSize;
-    iTotalCount = (index / iGrowSize + 1) * iGrowSize;
-    int32_t iNewSize = iTotalCount * iBlockSize;
-    if (!pBuffer) {
-      pBuffer = FX_Alloc(uint8_t, iNewSize);
-    } else {
-      pBuffer = FX_Realloc(uint8_t, pBuffer, iNewSize);
-    }
-  }
-  int32_t& iBlockCount = m_pData->iBlockCount;
-  if (index >= iBlockCount) {
-    iBlockCount = index + 1;
-  }
-  return pBuffer + index * iBlockSize;
-}
-uint8_t* CFX_BaseArray::GetAt(int32_t index) const {
-  FXSYS_assert(index > -1 && index < m_pData->iBlockCount);
-  return m_pData->pBuffer + index * m_pData->iBlockSize;
-}
-uint8_t* CFX_BaseArray::GetBuffer() const {
-  return m_pData->pBuffer;
-}
-int32_t CFX_BaseArray::Append(const CFX_BaseArray& src,
-                              int32_t iStart,
-                              int32_t iCount) {
-  int32_t iBlockSize = m_pData->iBlockSize;
-  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);
-  int32_t& iBlockCount = m_pData->iBlockCount;
-  int32_t iAdded = src.GetSize();
-  FXSYS_assert(iStart > -1 && iStart < iAdded);
-  if (iCount < 0) {
-    iCount = iAdded;
-  }
-  if (iStart + iCount > iAdded) {
-    iCount = iAdded - iStart;
-  }
-  if (iCount < 1) {
-    return 0;
-  }
-  uint8_t* pDst = m_pData->pBuffer + iBlockCount * iBlockSize;
-  AddSpaceTo(iBlockCount + iCount - 1);
-  FXSYS_memcpy(pDst, src.m_pData->pBuffer + iStart * iBlockSize,
-               iCount * iBlockSize);
-  return iCount;
-}
-int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src,
-                            int32_t iStart,
-                            int32_t iCount) {
-  int32_t iBlockSize = m_pData->iBlockSize;
-  FXSYS_assert(iBlockSize == src.m_pData->iBlockSize);
-  int32_t iCopied = src.GetSize();
-  FXSYS_assert(iStart > -1 && iStart < iCopied);
-  if (iCount < 0) {
-    iCount = iCopied;
-  }
-  if (iStart + iCount > iCopied) {
-    iCount = iCopied - iStart;
-  }
-  if (iCount < 1) {
-    return 0;
-  }
-  RemoveAll(TRUE);
-  AddSpaceTo(iCount - 1);
-  FXSYS_memcpy(m_pData->pBuffer, src.m_pData->pBuffer + iStart * iBlockSize,
-               iCount * iBlockSize);
-  return iCount;
-}
-int32_t CFX_BaseArray::RemoveLast(int32_t iCount) {
-  int32_t& iBlockCount = m_pData->iBlockCount;
-  if (iCount < 0 || iCount > iBlockCount) {
-    iCount = iBlockCount;
-    iBlockCount = 0;
-  } else {
-    iBlockCount -= iCount;
-  }
-  return iCount;
-}
-void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) {
-  if (!bLeaveMemory) {
-    uint8_t*& pBuffer = m_pData->pBuffer;
-    if (pBuffer != NULL) {
-      FX_Free(pBuffer);
-      pBuffer = NULL;
-    }
-    m_pData->iTotalCount = 0;
-  }
-  m_pData->iBlockCount = 0;
-}
-
-CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(int32_t iChunkSize,
-                                           int32_t iBlockSize)
-    : m_iChunkSize(iChunkSize),
-      m_iBlockSize(iBlockSize),
-      m_iChunkCount(0),
-      m_iBlockCount(0) {
-  FXSYS_assert(m_iChunkSize > 0 && m_iBlockSize > 0);
-  m_pData = new CFX_PtrArray;
-  m_pData->SetSize(16);
-}
-CFX_BaseMassArrayImp::~CFX_BaseMassArrayImp() {
-  RemoveAll();
-  delete m_pData;
-}
-uint8_t* CFX_BaseMassArrayImp::AddSpaceTo(int32_t index) {
-  FXSYS_assert(index > -1);
-  uint8_t* pChunk;
-  if (index < m_iBlockCount) {
-    pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
-  } else {
-    int32_t iMemSize = m_iChunkSize * m_iBlockSize;
-    while (TRUE) {
-      if (index < m_iChunkCount * m_iChunkSize) {
-        pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
-        break;
-      } else {
-        pChunk = FX_Alloc(uint8_t, iMemSize);
-        if (m_iChunkCount < m_pData->GetSize()) {
-          m_pData->SetAt(m_iChunkCount, pChunk);
-        } else {
-          m_pData->Add(pChunk);
-        }
-        m_iChunkCount++;
-      }
-    }
-  }
-  FXSYS_assert(pChunk != NULL);
-  m_iBlockCount = index + 1;
-  return pChunk + (index % m_iChunkSize) * m_iBlockSize;
-}
-uint8_t* CFX_BaseMassArrayImp::GetAt(int32_t index) const {
-  FXSYS_assert(index > -1 && index < m_iBlockCount);
-  uint8_t* pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize);
-  FXSYS_assert(pChunk != NULL);
-  return pChunk + (index % m_iChunkSize) * m_iBlockSize;
-}
-int32_t CFX_BaseMassArrayImp::Append(const CFX_BaseMassArrayImp& src,
-                                     int32_t iStart,
-                                     int32_t iCount) {
-  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
-  int32_t iAdded = src.m_iBlockCount;
-  FXSYS_assert(iStart > -1 && iStart < iAdded);
-  if (iCount < 0) {
-    iCount = iAdded;
-  }
-  if (iStart + iCount > iAdded) {
-    iCount = iAdded - iStart;
-  }
-  if (iCount < 1) {
-    return m_iBlockCount;
-  }
-  int32_t iBlockCount = m_iBlockCount;
-  int32_t iTotal = m_iBlockCount + iCount;
-  AddSpaceTo(iTotal - 1);
-  Append(iBlockCount, src, iStart, iCount);
-  return m_iBlockCount;
-}
-int32_t CFX_BaseMassArrayImp::Copy(const CFX_BaseMassArrayImp& src,
-                                   int32_t iStart,
-                                   int32_t iCount) {
-  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
-  int32_t iCopied = src.m_iBlockCount;
-  FXSYS_assert(iStart > -1);
-  if (iStart >= iCopied) {
-    return 0;
-  }
-  RemoveAll(TRUE);
-  if (iCount < 0) {
-    iCount = iCopied;
-  }
-  if (iStart + iCount > iCopied) {
-    iCount = iCopied - iStart;
-  }
-  if (iCount < 1) {
-    return 0;
-  }
-  if (m_iBlockCount < iCount) {
-    AddSpaceTo(iCount - 1);
-  }
-  Append(0, src, iStart, iCount);
-  return m_iBlockCount;
-}
-
-void CFX_BaseMassArrayImp::Append(int32_t iDstStart,
-                                  const CFX_BaseMassArrayImp& src,
-                                  int32_t iSrcStart,
-                                  int32_t iSrcCount) {
-  FXSYS_assert(iDstStart > -1);
-  FXSYS_assert(m_iBlockSize == src.m_iBlockSize);
-  FXSYS_assert(src.m_iBlockCount > 0);
-  FXSYS_assert(m_iBlockCount >= iDstStart + iSrcCount);
-  FXSYS_assert(iSrcStart > -1);
-  FXSYS_assert(iSrcStart < src.m_iBlockCount);
-  FXSYS_assert(iSrcCount > 0);
-  FXSYS_assert(iSrcStart + iSrcCount <= src.m_iBlockCount);
-
-  int32_t iDstChunkIndex = iDstStart / m_iChunkSize;
-  int32_t iSrcChunkIndex = iSrcStart / src.m_iChunkSize;
-  uint8_t* pDstChunk = (uint8_t*)GetAt(iDstStart);
-  uint8_t* pSrcChunk = (uint8_t*)src.GetAt(iSrcStart);
-  int32_t iDstChunkSize = m_iChunkSize - (iDstStart % m_iChunkSize);
-  int32_t iSrcChunkSize = src.m_iChunkSize - (iSrcStart % src.m_iChunkSize);
-  int32_t iCopySize =
-      std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize));
-  int32_t iCopyBytes = iCopySize * m_iBlockSize;
-  while (iSrcCount > 0) {
-    FXSYS_assert(pDstChunk != NULL && pSrcChunk != NULL);
-    FXSYS_memcpy(pDstChunk, pSrcChunk, iCopyBytes);
-    iSrcCount -= iCopySize;
-    iSrcChunkSize -= iCopySize;
-    if (iSrcChunkSize < 1) {
-      iSrcChunkSize = src.m_iChunkSize;
-      iSrcChunkIndex++;
-      pSrcChunk = (uint8_t*)src.m_pData->GetAt(iSrcChunkIndex);
-    } else {
-      pSrcChunk += iCopyBytes;
-    }
-    iDstChunkSize -= iCopySize;
-    if (iDstChunkSize < 1) {
-      iDstChunkSize = m_iChunkSize;
-      iDstChunkIndex++;
-      pDstChunk = (uint8_t*)m_pData->GetAt(iDstChunkIndex);
-    } else {
-      pDstChunk += iCopyBytes;
-    }
-    iCopySize = std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize));
-    iCopyBytes = iCopySize * m_iBlockSize;
-  }
-}
-int32_t CFX_BaseMassArrayImp::RemoveLast(int32_t iCount) {
-  if (iCount < 0 || iCount >= m_iBlockCount) {
-    m_iBlockCount = 0;
-  } else {
-    m_iBlockCount -= iCount;
-  }
-  return m_iBlockCount;
-}
-void CFX_BaseMassArrayImp::RemoveAll(FX_BOOL bLeaveMemory) {
-  if (bLeaveMemory) {
-    m_iBlockCount = 0;
-    return;
-  }
-  for (int32_t i = 0; i < m_iChunkCount; i++) {
-    void* p = m_pData->GetAt(i);
-    if (p == NULL) {
-      continue;
-    }
-    FX_Free(p);
-  }
-  m_pData->RemoveAll();
-  m_iChunkCount = 0;
-  m_iBlockCount = 0;
-}
-CFX_BaseMassArray::CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize) {
-  m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize);
-}
-CFX_BaseMassArray::~CFX_BaseMassArray() {
-  delete m_pData;
-}
-int32_t CFX_BaseMassArray::GetSize() const {
-  return m_pData->m_iBlockCount;
-}
-uint8_t* CFX_BaseMassArray::AddSpaceTo(int32_t index) {
-  return m_pData->AddSpaceTo(index);
-}
-uint8_t* CFX_BaseMassArray::GetAt(int32_t index) const {
-  return m_pData->GetAt(index);
-}
-int32_t CFX_BaseMassArray::Append(const CFX_BaseMassArray& src,
-                                  int32_t iStart,
-                                  int32_t iCount) {
-  return m_pData->Append(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount);
-}
-int32_t CFX_BaseMassArray::Copy(const CFX_BaseMassArray& src,
-                                int32_t iStart,
-                                int32_t iCount) {
-  return m_pData->Copy(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount);
-}
-int32_t CFX_BaseMassArray::RemoveLast(int32_t iCount) {
-  return m_pData->RemoveLast(iCount);
-}
-void CFX_BaseMassArray::RemoveAll(FX_BOOL bLeaveMemory) {
-  m_pData->RemoveAll(bLeaveMemory);
-}
-
-struct FX_BASEDISCRETEARRAYDATA {
-  int32_t iBlockSize;
-  int32_t iChunkSize;
-  int32_t iChunkCount;
-  CFX_PtrArray ChunkBuffer;
-};
-
-CFX_BaseDiscreteArray::CFX_BaseDiscreteArray(int32_t iChunkSize,
-                                             int32_t iBlockSize) {
-  FXSYS_assert(iChunkSize > 0 && iBlockSize > 0);
-  FX_BASEDISCRETEARRAYDATA* pData = new FX_BASEDISCRETEARRAYDATA;
-  m_pData = pData;
-  pData->ChunkBuffer.SetSize(16);
-  pData->iChunkCount = 0;
-  pData->iChunkSize = iChunkSize;
-  pData->iBlockSize = iBlockSize;
-}
-CFX_BaseDiscreteArray::~CFX_BaseDiscreteArray() {
-  RemoveAll();
-  delete static_cast<FX_BASEDISCRETEARRAYDATA*>(m_pData);
-}
-uint8_t* CFX_BaseDiscreteArray::AddSpaceTo(int32_t index) {
-  FXSYS_assert(index > -1);
-  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
-  int32_t& iChunkCount = pData->iChunkCount;
-  int32_t iChunkSize = pData->iChunkSize;
-  uint8_t* pChunk = NULL;
-  int32_t iChunk = index / iChunkSize;
-  if (iChunk < iChunkCount) {
-    pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk);
-  }
-  if (!pChunk) {
-    pChunk = FX_Alloc2D(uint8_t, iChunkSize, pData->iBlockSize);
-    FXSYS_memset(pChunk, 0, iChunkSize * pData->iBlockSize);
-    pData->ChunkBuffer.SetAtGrow(iChunk, pChunk);
-    if (iChunkCount <= iChunk) {
-      iChunkCount = iChunk + 1;
-    }
-  }
-  return pChunk + (index % iChunkSize) * pData->iBlockSize;
-}
-uint8_t* CFX_BaseDiscreteArray::GetAt(int32_t index) const {
-  FXSYS_assert(index > -1);
-  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
-  int32_t iChunkSize = pData->iChunkSize;
-  int32_t iChunk = index / iChunkSize;
-  if (iChunk >= pData->iChunkCount) {
-    return NULL;
-  }
-  uint8_t* pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk);
-  if (pChunk == NULL) {
-    return NULL;
-  }
-  return pChunk + (index % iChunkSize) * pData->iBlockSize;
-}
-void CFX_BaseDiscreteArray::RemoveAll() {
-  FX_BASEDISCRETEARRAYDATA* pData = (FX_BASEDISCRETEARRAYDATA*)m_pData;
-  CFX_PtrArray& ChunkBuffer = pData->ChunkBuffer;
-  int32_t& iChunkCount = pData->iChunkCount;
-  for (int32_t i = 0; i < iChunkCount; i++) {
-    void* p = ChunkBuffer.GetAt(i);
-    if (p == NULL) {
-      continue;
-    }
-    FX_Free(p);
-  }
-  ChunkBuffer.RemoveAll();
-  iChunkCount = 0;
-}
-CFX_BaseStack::CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize) {
-  m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize);
-}
-CFX_BaseStack::~CFX_BaseStack() {
-  delete (CFX_BaseMassArrayImp*)m_pData;
-}
-uint8_t* CFX_BaseStack::Push() {
-  return m_pData->AddSpace();
-}
-void CFX_BaseStack::Pop() {
-  int32_t& iBlockCount = m_pData->m_iBlockCount;
-  if (iBlockCount < 1) {
-    return;
-  }
-  iBlockCount--;
-}
-uint8_t* CFX_BaseStack::GetTopElement() const {
-  int32_t iSize = m_pData->m_iBlockCount;
-  if (iSize < 1) {
-    return NULL;
-  }
-  return m_pData->GetAt(iSize - 1);
-}
-int32_t CFX_BaseStack::GetSize() const {
-  return m_pData->m_iBlockCount;
-}
-uint8_t* CFX_BaseStack::GetAt(int32_t index) const {
-  return m_pData->GetAt(index);
-}
-void CFX_BaseStack::RemoveAll(FX_BOOL bLeaveMemory) {
-  m_pData->RemoveAll(bLeaveMemory);
-}
diff --git a/xfa/src/fgas/crt/fgas_utils.h b/xfa/src/fgas/crt/fgas_utils.h
deleted file mode 100644
index f52255a..0000000
--- a/xfa/src/fgas/crt/fgas_utils.h
+++ /dev/null
@@ -1,737 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
-#define XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
-
-#include "core/include/fxcrt/fx_coordinates.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-
-class FX_BASEARRAYDATA;
-
-template <class baseType>
-class CFX_CPLTree;
-
-class CFX_BaseArray : public CFX_Target {
- protected:
-  CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize);
-  ~CFX_BaseArray();
-  int32_t GetSize() const;
-  int32_t GetBlockSize() const;
-  uint8_t* AddSpaceTo(int32_t index);
-  uint8_t* GetAt(int32_t index) const;
-  uint8_t* GetBuffer() const;
-  int32_t Append(const CFX_BaseArray& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1);
-  int32_t Copy(const CFX_BaseArray& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1);
-  int32_t RemoveLast(int32_t iCount = -1);
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
-
-  FX_BASEARRAYDATA* m_pData;
-};
-
-template <class baseType>
-class CFX_BaseArrayTemplate : public CFX_BaseArray {
- public:
-  CFX_BaseArrayTemplate(int32_t iGrowSize = 100)
-      : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
-  CFX_BaseArrayTemplate(int32_t iGrowSize, int32_t iBlockSize)
-      : CFX_BaseArray(iGrowSize, iBlockSize) {}
-  int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
-  int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
-  baseType* AddSpace() {
-    return (baseType*)CFX_BaseArray::AddSpaceTo(CFX_BaseArray::GetSize());
-  }
-  int32_t Add(const baseType& element) {
-    int32_t index = CFX_BaseArray::GetSize();
-    *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
-    return index;
-  }
-  baseType* GetBuffer() const { return (baseType*)CFX_BaseArray::GetBuffer(); }
-  baseType& GetAt(int32_t index) const {
-    return *(baseType*)CFX_BaseArray::GetAt(index);
-  }
-  baseType* GetPtrAt(int32_t index) const {
-    return (baseType*)CFX_BaseArray::GetAt(index);
-  }
-  void SetAt(int32_t index, const baseType& element) {
-    *(baseType*)CFX_BaseArray::GetAt(index) = element;
-  }
-  void SetAtGrow(int32_t index, const baseType& element) {
-    *(baseType*)CFX_BaseArray::AddSpaceTo(index) = element;
-  }
-  int32_t Append(const CFX_BaseArrayTemplate& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1) {
-    return CFX_BaseArray::Append(src, iStart, iCount);
-  }
-  int32_t Copy(const CFX_BaseArrayTemplate& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1) {
-    return CFX_BaseArray::Copy(src, iStart, iCount);
-  }
-  int32_t RemoveLast(int32_t iCount = -1) {
-    return CFX_BaseArray::RemoveLast(iCount);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    CFX_BaseArray::RemoveAll(bLeaveMemory);
-  }
-};
-typedef CFX_BaseArrayTemplate<void*> CFDE_PtrArray;
-typedef CFX_BaseArrayTemplate<FX_DWORD> CFDE_DWordArray;
-typedef CFX_BaseArrayTemplate<FX_WORD> CFDE_WordArray;
-
-template <class baseType>
-class CFX_ObjectBaseArrayTemplate : public CFX_BaseArray {
- public:
-  CFX_ObjectBaseArrayTemplate(int32_t iGrowSize = 100)
-      : CFX_BaseArray(iGrowSize, sizeof(baseType)) {}
-  ~CFX_ObjectBaseArrayTemplate() { RemoveAll(FALSE); }
-  int32_t GetSize() const { return CFX_BaseArray::GetSize(); }
-  int32_t GetBlockSize() const { return CFX_BaseArray::GetBlockSize(); }
-  int32_t Add(const baseType& element) {
-    int32_t index = CFX_BaseArray::GetSize();
-    baseType* p = (baseType*)CFX_BaseArray::AddSpaceTo(index);
-    new ((void*)p) baseType(element);
-    return index;
-  }
-  baseType& GetAt(int32_t index) const {
-    return *(baseType*)CFX_BaseArray::GetAt(index);
-  }
-  baseType* GetPtrAt(int32_t index) const {
-    return (baseType*)CFX_BaseArray::GetAt(index);
-  }
-  int32_t Append(const CFX_ObjectBaseArrayTemplate& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1) {
-    FXSYS_assert(GetBlockSize() == src.GetBlockSize());
-    if (iCount == 0) {
-      return 0;
-    }
-    int32_t iSize = src.GetSize();
-    FXSYS_assert(iStart > -1 && iStart < iSize);
-    if (iCount < 0) {
-      iCount = iSize;
-    }
-    if (iStart + iCount > iSize) {
-      iCount = iSize - iStart;
-    }
-    if (iCount < 1) {
-      return 0;
-    }
-    iSize = CFX_BaseArray::GetSize();
-    CFX_BaseArray::AddSpaceTo(iSize + iCount - 1);
-    uint8_t** pStart = CFX_BaseArray::GetAt(iSize);
-    int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
-    iSize = iStart + iCount;
-    for (int32_t i = iStart; i < iSize; i++) {
-      FXTARGET_NewWith((void*)pStart) baseType(src.GetAt(i));
-      pStart += iBlockSize;
-    }
-    return iCount;
-  }
-  int32_t Copy(const CFX_ObjectBaseArrayTemplate& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1) {
-    FXSYS_assert(GetBlockSize() == src.GetBlockSize());
-    if (iCount == 0) {
-      return 0;
-    }
-    int32_t iSize = src.GetSize();
-    FXSYS_assert(iStart > -1 && iStart < iSize);
-    if (iCount < 0) {
-      iCount = iSize;
-    }
-    if (iStart + iCount > iSize) {
-      iCount = iSize - iStart;
-    }
-    if (iCount < 1) {
-      return 0;
-    }
-    RemoveAll(TRUE);
-    CFX_BaseArray::AddSpaceTo(iCount - 1);
-    uint8_t** pStart = CFX_BaseArray::GetAt(0);
-    int32_t iBlockSize = CFX_BaseArray::GetBlockSize();
-    iSize = iStart + iCount;
-    for (int32_t i = iStart; i < iSize; i++) {
-      new ((void*)pStart) baseType(src.GetAt(i));
-      pStart += iBlockSize;
-    }
-    return iCount;
-  }
-  int32_t RemoveLast(int32_t iCount = -1) {
-    int32_t iSize = CFX_BaseArray::GetSize();
-    if (iCount < 0 || iCount > iSize) {
-      iCount = iSize;
-    }
-    if (iCount == 0) {
-      return iSize;
-    }
-    for (int32_t i = iSize - iCount; i < iSize; i++) {
-      ((baseType*)GetPtrAt(i))->~baseType();
-    }
-    return CFX_BaseArray::RemoveLast(iCount);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    int32_t iSize = CFX_BaseArray::GetSize();
-    for (int32_t i = 0; i < iSize; i++) {
-      ((baseType*)GetPtrAt(i))->~baseType();
-    }
-    CFX_BaseArray::RemoveAll(bLeaveMemory);
-  }
-};
-
-class CFX_BaseMassArrayImp : public CFX_Target {
- public:
-  CFX_BaseMassArrayImp(int32_t iChunkSize, int32_t iBlockSize);
-  ~CFX_BaseMassArrayImp();
-  uint8_t* AddSpace() { return AddSpaceTo(m_iBlockCount); }
-  uint8_t* AddSpaceTo(int32_t index);
-  uint8_t* GetAt(int32_t index) const;
-  int32_t Append(const CFX_BaseMassArrayImp& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1);
-  int32_t Copy(const CFX_BaseMassArrayImp& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1);
-  int32_t RemoveLast(int32_t iCount = -1);
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
-  int32_t m_iChunkSize;
-  int32_t m_iBlockSize;
-  int32_t m_iChunkCount;
-  int32_t m_iBlockCount;
-  CFX_PtrArray* m_pData;
-
- protected:
-  void Append(int32_t iDstStart,
-              const CFX_BaseMassArrayImp& src,
-              int32_t iSrcStart = 0,
-              int32_t iSrcCount = -1);
-};
-
-class CFX_BaseMassArray : public CFX_Target {
- protected:
-  CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize);
-  ~CFX_BaseMassArray();
-  int32_t GetSize() const;
-  uint8_t* AddSpaceTo(int32_t index);
-  uint8_t* GetAt(int32_t index) const;
-  int32_t Append(const CFX_BaseMassArray& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1);
-  int32_t Copy(const CFX_BaseMassArray& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1);
-  int32_t RemoveLast(int32_t iCount = -1);
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
-  CFX_BaseMassArrayImp* m_pData;
-};
-
-template <class baseType>
-class CFX_MassArrayTemplate : public CFX_BaseMassArray {
- public:
-  CFX_MassArrayTemplate(int32_t iChunkSize = 100)
-      : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
-  CFX_MassArrayTemplate(int32_t iChunkSize, int32_t iBlockSize)
-      : CFX_BaseMassArray(iChunkSize, iBlockSize) {}
-  int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
-  baseType* AddSpace() {
-    return (baseType*)CFX_BaseMassArray::AddSpaceTo(
-        CFX_BaseMassArray::GetSize());
-  }
-  int32_t Add(const baseType& element) {
-    int32_t index = CFX_BaseMassArray::GetSize();
-    *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
-    return index;
-  }
-  baseType& GetAt(int32_t index) const {
-    return *(baseType*)CFX_BaseMassArray::GetAt(index);
-  }
-  baseType* GetPtrAt(int32_t index) const {
-    return (baseType*)CFX_BaseMassArray::GetAt(index);
-  }
-  void SetAt(int32_t index, const baseType& element) {
-    *(baseType*)CFX_BaseMassArray::GetAt(index) = element;
-  }
-  void SetAtGrow(int32_t index, const baseType& element) {
-    *(baseType*)CFX_BaseMassArray::AddSpaceTo(index) = element;
-  }
-  int32_t Append(const CFX_MassArrayTemplate& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1) {
-    return CFX_BaseMassArray::Append(src, iStart, iCount);
-  }
-  int32_t Copy(const CFX_MassArrayTemplate& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1) {
-    return CFX_BaseMassArray::Copy(src, iStart, iCount);
-  }
-  int32_t RemoveLast(int32_t iCount = -1) {
-    return CFX_BaseMassArray::RemoveLast(iCount);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    CFX_BaseMassArray::RemoveAll(bLeaveMemory);
-  }
-};
-typedef CFX_MassArrayTemplate<void*> CFX_PtrMassArray;
-typedef CFX_MassArrayTemplate<int32_t> CFX_Int32MassArray;
-typedef CFX_MassArrayTemplate<FX_DWORD> CFX_DWordMassArray;
-typedef CFX_MassArrayTemplate<FX_WORD> CFX_WordMassArray;
-typedef CFX_MassArrayTemplate<CFX_Rect> CFX_RectMassArray;
-typedef CFX_MassArrayTemplate<CFX_RectF> CFX_RectFMassArray;
-
-template <class baseType>
-class CFX_ObjectMassArrayTemplate : public CFX_BaseMassArray {
- public:
-  CFX_ObjectMassArrayTemplate(int32_t iChunkSize = 100)
-      : CFX_BaseMassArray(iChunkSize, sizeof(baseType)) {}
-  ~CFX_ObjectMassArrayTemplate() { RemoveAll(FALSE); }
-  int32_t GetSize() const { return CFX_BaseMassArray::GetSize(); }
-  int32_t Add(const baseType& element) {
-    int32_t index = CFX_BaseMassArray::GetSize();
-    baseType* p = (baseType*)CFX_BaseMassArray::AddSpaceTo(index);
-    new ((void*)p) baseType(element);
-    return index;
-  }
-  baseType& GetAt(int32_t index) const {
-    return *(baseType*)CFX_BaseMassArray::GetAt(index);
-  }
-  baseType* GetPtrAt(int32_t index) const {
-    return (baseType*)CFX_BaseMassArray::GetAt(index);
-  }
-  int32_t Append(const CFX_ObjectMassArrayTemplate& src,
-                 int32_t iStart = 0,
-                 int32_t iCount = -1) {
-    if (iCount == 0) {
-      return CFX_BaseMassArray::GetSize();
-    }
-    int32_t iSize = src.GetSize();
-    FXSYS_assert(iStart > -1 && iStart < iSize);
-    if (iCount < 0) {
-      iCount = iSize;
-    }
-    int32_t iEnd = iStart + iCount;
-    if (iEnd > iSize) {
-      iEnd = iSize;
-    }
-    for (int32_t i = iStart; i < iEnd; i++) {
-      Add(src.GetAt(i));
-    }
-    return CFX_BaseMassArray::GetSize();
-  }
-  int32_t Copy(const CFX_ObjectMassArrayTemplate& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1) {
-    if (iCount == 0) {
-      return CFX_BaseMassArray::GetSize();
-    }
-    int32_t iSize = src.GetSize();
-    FXSYS_assert(iStart > -1 && iStart < iSize);
-    if (iCount < 0) {
-      iCount = iSize;
-    }
-    int32_t iEnd = iStart + iCount;
-    if (iEnd > iSize) {
-      iEnd = iSize;
-    }
-    RemoveAll(TRUE);
-    for (int32_t i = iStart; i < iEnd; i++) {
-      Add(src.GetAt(i));
-    }
-    return CFX_BaseMassArray::GetSize();
-  }
-  int32_t RemoveLast(int32_t iCount = -1) {
-    int32_t iSize = CFX_BaseMassArray::GetSize();
-    if (iCount < 0 || iCount > iSize) {
-      iCount = iSize;
-    }
-    if (iCount == 0) {
-      return iSize;
-    }
-    for (int32_t i = iSize - iCount; i < iSize; i++) {
-      ((baseType*)GetPtrAt(i))->~baseType();
-    }
-    return CFX_BaseMassArray::RemoveLast(iCount);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    int32_t iSize = CFX_BaseMassArray::GetSize();
-    for (int32_t i = 0; i < iSize; i++) {
-      ((baseType*)GetPtrAt(i))->~baseType();
-    }
-    CFX_BaseMassArray::RemoveAll(bLeaveMemory);
-  }
-};
-
-class CFX_BaseDiscreteArray : public CFX_Target {
- protected:
-  CFX_BaseDiscreteArray(int32_t iChunkSize, int32_t iBlockSize);
-  ~CFX_BaseDiscreteArray();
-  uint8_t* AddSpaceTo(int32_t index);
-  uint8_t* GetAt(int32_t index) const;
-  void RemoveAll();
-  void* m_pData;
-};
-
-template <class baseType>
-class CFX_DiscreteArrayTemplate : public CFX_BaseDiscreteArray {
- public:
-  CFX_DiscreteArrayTemplate(int32_t iChunkSize = 100)
-      : CFX_BaseDiscreteArray(iChunkSize, sizeof(baseType)) {}
-  baseType& GetAt(int32_t index, const baseType& defValue) const {
-    baseType* p = (baseType*)CFX_BaseDiscreteArray::GetAt(index);
-    return p == NULL ? (baseType&)defValue : *p;
-  }
-  baseType* GetPtrAt(int32_t index) const {
-    return (baseType*)CFX_BaseDiscreteArray::GetAt(index);
-  }
-  void SetAtGrow(int32_t index, const baseType& element) {
-    *(baseType*)CFX_BaseDiscreteArray::AddSpaceTo(index) = element;
-  }
-  void RemoveAll() { CFX_BaseDiscreteArray::RemoveAll(); }
-};
-typedef CFX_DiscreteArrayTemplate<void*> CFX_PtrDiscreteArray;
-typedef CFX_DiscreteArrayTemplate<FX_DWORD> CFX_DWordDiscreteArray;
-typedef CFX_DiscreteArrayTemplate<FX_WORD> CFX_WordDiscreteArray;
-
-class CFX_BaseStack : public CFX_Target {
- protected:
-  CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize);
-  ~CFX_BaseStack();
-  uint8_t* Push();
-  void Pop();
-  uint8_t* GetTopElement() const;
-  int32_t GetSize() const;
-  uint8_t* GetAt(int32_t index) const;
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE);
-  CFX_BaseMassArrayImp* m_pData;
-};
-
-template <class baseType>
-class CFX_StackTemplate : public CFX_BaseStack {
- public:
-  CFX_StackTemplate(int32_t iChunkSize = 100)
-      : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
-  int32_t Push(const baseType& element) {
-    int32_t index = CFX_BaseStack::GetSize();
-    *(baseType*)CFX_BaseStack::Push() = element;
-    return index;
-  }
-  void Pop() { CFX_BaseStack::Pop(); }
-  baseType* GetTopElement() const {
-    return (baseType*)CFX_BaseStack::GetTopElement();
-  }
-  int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
-  baseType* GetAt(int32_t index) const {
-    return (baseType*)CFX_BaseStack::GetAt(index);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    CFX_BaseStack::RemoveAll(bLeaveMemory);
-  }
-};
-typedef CFX_StackTemplate<void*> CFX_PtrStack;
-typedef CFX_StackTemplate<FX_DWORD> CFX_DWordStack;
-typedef CFX_StackTemplate<FX_WORD> CFX_WordStack;
-typedef CFX_StackTemplate<int32_t> CFX_Int32Stack;
-
-template <class baseType>
-class CFX_ObjectStackTemplate : public CFX_BaseStack {
- public:
-  CFX_ObjectStackTemplate(int32_t iChunkSize = 100)
-      : CFX_BaseStack(iChunkSize, sizeof(baseType)) {}
-  ~CFX_ObjectStackTemplate() { RemoveAll(); }
-  int32_t Push(const baseType& element) {
-    int32_t index = CFX_BaseStack::GetSize();
-    baseType* p = (baseType*)CFX_BaseStack::Push();
-    new ((void*)p) baseType(element);
-    return index;
-  }
-  void Pop() {
-    baseType* p = (baseType*)CFX_BaseStack::GetTopElement();
-    if (p != NULL) {
-      p->~baseType();
-    }
-    CFX_BaseStack::Pop();
-  }
-  baseType* GetTopElement() const {
-    return (baseType*)CFX_BaseStack::GetTopElement();
-  }
-  int32_t GetSize() const { return CFX_BaseStack::GetSize(); }
-  baseType* GetAt(int32_t index) const {
-    return (baseType*)CFX_BaseStack::GetAt(index);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    int32_t iSize = CFX_BaseStack::GetSize();
-    for (int32_t i = 0; i < iSize; i++) {
-      ((baseType*)CFX_BaseStack::GetAt(i))->~baseType();
-    }
-    CFX_BaseStack::RemoveAll(bLeaveMemory);
-  }
-  int32_t Copy(const CFX_ObjectStackTemplate& src,
-               int32_t iStart = 0,
-               int32_t iCount = -1) {
-    if (iCount == 0) {
-      return CFX_BaseStack::GetSize();
-    }
-    int32_t iSize = src.GetSize();
-    FXSYS_assert(iStart > -1 && iStart < iSize);
-    if (iCount < 0) {
-      iCount = iSize;
-    }
-    int32_t iEnd = iStart + iCount;
-    if (iEnd > iSize) {
-      iEnd = iSize;
-    }
-    RemoveAll(TRUE);
-    for (int32_t i = iStart; i < iEnd; i++) {
-      Push(*src.GetAt(i));
-    }
-    return CFX_BaseStack::GetSize();
-  }
-};
-
-template <class baseType>
-class CFX_CPLTreeNode : public CFX_Target {
- public:
-  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
-  CFX_CPLTreeNode()
-      : m_pParentNode(NULL),
-        m_pChildNode(NULL),
-        m_pPrevNode(NULL),
-        m_pNextNode(NULL),
-        m_Data() {}
-  enum TreeNode {
-    Root = 0,
-    Parent,
-    FirstSibling,
-    PreviousSibling,
-    NextSibling,
-    LastSibling,
-    FirstNeighbor,
-    PreviousNeighbor,
-    NextNeighbor,
-    LastNeighbor,
-    FirstChild,
-    LastChild
-  };
-  CPLTreeNode* GetNode(TreeNode eNode) const {
-    switch (eNode) {
-      case Root: {
-        CPLTreeNode* pParent = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pParent->m_pParentNode) != NULL) {
-          pParent = pTemp;
-        }
-        return pParent;
-      }
-      case Parent:
-        return m_pParentNode;
-      case FirstSibling: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pPrevNode) != NULL) {
-          pNode = pTemp;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case PreviousSibling:
-        return m_pPrevNode;
-      case NextSibling:
-        return m_pNextNode;
-      case LastSibling: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pNextNode) != NULL) {
-          pNode = pTemp;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case FirstNeighbor: {
-        CPLTreeNode* pParent = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pParent->m_pParentNode) != NULL) {
-          pParent = pTemp;
-        }
-        return pParent == (CPLTreeNode*)this ? NULL : pParent;
-      }
-      case PreviousNeighbor: {
-        if (m_pPrevNode == NULL) {
-          return m_pParentNode;
-        }
-        CPLTreeNode* pNode = m_pPrevNode;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pChildNode) != NULL) {
-          pNode = pTemp;
-          while ((pTemp = pNode->m_pNextNode) != NULL) {
-            pNode = pTemp;
-          }
-        }
-        return pNode;
-      }
-      case NextNeighbor: {
-        if (m_pChildNode != NULL) {
-          return m_pChildNode;
-        }
-        if (m_pNextNode != NULL) {
-          return m_pNextNode;
-        }
-        CPLTreeNode* pNode = m_pParentNode;
-        while (pNode != NULL) {
-          if (pNode->m_pNextNode != NULL) {
-            return pNode->m_pNextNode;
-          }
-          pNode = pNode->m_pParentNode;
-        }
-        return NULL;
-      }
-      case LastNeighbor: {
-        CPLTreeNode* pNode = (CPLTreeNode*)this;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pNode->m_pParentNode) != NULL) {
-          pNode = pTemp;
-        }
-        while (TRUE) {
-          CPLTreeNode* pTemp;
-          while ((pTemp = pNode->m_pNextNode) != NULL) {
-            pNode = pTemp;
-          }
-          if (pNode->m_pChildNode == NULL) {
-            break;
-          }
-          pNode = pNode->m_pChildNode;
-        }
-        return pNode == (CPLTreeNode*)this ? NULL : pNode;
-      }
-      case FirstChild:
-        return m_pChildNode;
-      case LastChild: {
-        if (m_pChildNode == NULL) {
-          return NULL;
-        }
-        CPLTreeNode* pChild = m_pChildNode;
-        CPLTreeNode* pTemp;
-        while ((pTemp = pChild->m_pNextNode) != NULL) {
-          pChild = pTemp;
-        }
-        return pChild;
-      }
-      default:
-        break;
-    }
-    return NULL;
-  }
-  void SetParentNode(CPLTreeNode* pNode) { m_pParentNode = pNode; }
-  int32_t CountChildNodes() const {
-    int32_t iCount = 0;
-    CPLTreeNode* pNode = m_pChildNode;
-    while (pNode) {
-      iCount++;
-      pNode = pNode->m_pNextNode;
-    }
-    return iCount;
-  }
-  CPLTreeNode* GetChildNode(int32_t iIndex) const {
-    int32_t iCount = 0;
-    CPLTreeNode* pNode = m_pChildNode;
-    while (pNode) {
-      if (iIndex == iCount) {
-        return pNode;
-      }
-      iCount++;
-      pNode = pNode->m_pNextNode;
-    }
-    return NULL;
-  }
-  int32_t GetNodeIndex() const {
-    int32_t index = 0;
-    CPLTreeNode* pNode = m_pPrevNode;
-    while (pNode != NULL) {
-      index++;
-      pNode = pNode->m_pPrevNode;
-    }
-    return index;
-  }
-  FX_BOOL IsParentNode(const CPLTreeNode* pNode) const {
-    CPLTreeNode* pParent = m_pParentNode;
-    while (pParent != NULL) {
-      if (pParent == pNode) {
-        return TRUE;
-      }
-      pParent = pParent->GetTreeNode(Parent);
-    }
-    return FALSE;
-  }
-  FX_BOOL IsChildNode(const CPLTreeNode* pNode) const {
-    if (pNode == NULL) {
-      return FALSE;
-    }
-    return pNode->IsParentNode((const CPLTreeNode*)this);
-  }
-  void SetChildNode(CPLTreeNode* pNode) { m_pChildNode = pNode; }
-  void SetPrevNode(CPLTreeNode* pNode) { m_pPrevNode = pNode; }
-  void SetNextNode(CPLTreeNode* pNode) { m_pNextNode = pNode; }
-  int32_t GetNodeLevel() const {
-    int32_t iLevel = 0;
-    CPLTreeNode* pNode = (CPLTreeNode*)this;
-    while ((pNode = pNode->m_pParentNode) != NULL) {
-      iLevel++;
-    }
-    return iLevel;
-  }
-  bool IsRootNode() const { return !m_pParentNode; }
-  baseType GetData() const { return m_Data; }
-  void SetData(baseType data) { m_Data = data; }
-
- protected:
-  CPLTreeNode* m_pParentNode;
-  CPLTreeNode* m_pChildNode;
-  CPLTreeNode* m_pPrevNode;
-  CPLTreeNode* m_pNextNode;
-  baseType m_Data;
-  friend class CFX_CPLTree<baseType>;
-};
-
-template <class baseType>
-class CFX_CPLTree {
- public:
-  typedef CFX_CPLTreeNode<baseType> CPLTreeNode;
-  CFX_CPLTree() : m_Root() {}
-  ~CFX_CPLTree() {
-    CPLTreeNode* pNode = m_Root.GetNode(CPLTreeNode::LastNeighbor);
-    while (pNode != NULL) {
-      if (pNode->IsRootNode()) {
-        break;
-      }
-      CPLTreeNode* pTemp = pNode->GetNode(CPLTreeNode::PreviousNeighbor);
-      delete pNode;
-      pNode = pTemp;
-    }
-  }
-  CPLTreeNode* GetRoot() { return &m_Root; }
-  CPLTreeNode* AddChild(baseType data, CPLTreeNode* pParent = NULL) {
-    if (pParent == NULL) {
-      pParent = &m_Root;
-    }
-    CPLTreeNode* pChild = new CPLTreeNode;
-    pChild->SetParentNode(pParent);
-    pChild->SetData(data);
-    if (pParent->m_pChildNode == NULL) {
-      pParent->m_pChildNode = pChild;
-    } else {
-      CPLTreeNode* pLast = pParent->GetNode(CPLTreeNode::LastChild);
-      pChild->SetPrevNode(pLast);
-      pLast->SetNextNode(pChild);
-    }
-    return pChild;
-  }
-
- protected:
-  CPLTreeNode m_Root;
-};
-
-#endif  // XFA_SRC_FGAS_CRT_FGAS_UTILS_H_
diff --git a/xfa/src/fgas/font/fgas_font.h b/xfa/src/fgas/font/fgas_font.h
deleted file mode 100644
index 0484dee..0000000
--- a/xfa/src/fgas/font/fgas_font.h
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_FONT_FGAS_FONT_H_
-#define XFA_SRC_FGAS_FONT_FGAS_FONT_H_
-
-#include "core/include/fxge/fx_font.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-#endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-
-class IFX_Font;
-class IFX_FontMgr;
-
-#define FX_FONTSTYLE_Normal 0x00
-#define FX_FONTSTYLE_FixedPitch 0x01
-#define FX_FONTSTYLE_Serif 0x02
-#define FX_FONTSTYLE_Symbolic 0x04
-#define FX_FONTSTYLE_Script 0x08
-#define FX_FONTSTYLE_Italic 0x40
-#define FX_FONTSTYLE_Bold 0x40000
-#define FX_FONTSTYLE_BoldItalic (FX_FONTSTYLE_Bold | FX_FONTSTYLE_Italic)
-#define FX_FONTSTYLE_ExactMatch 0x80000000
-#define FX_FONTDECORATION_Underline 0x00000001
-#define FX_FONTDECORATION_Strikeout 0x00000002
-#define FX_FONTDECORATION_Overline 0x00000004
-#define FX_FONTDECORATION_Emphasis 0x00000008
-#define FX_FONTDECORATION_Superscript 0x00000010
-#define FX_FONTDECORATION_Subscript 0x00000020
-#define FX_FONTDECORATION_SmallCapital 0x00000040
-#define FX_FONTDECORATION_Capital 0x00000080
-#define FX_FONTDECORATION_Lowercase 0x000000C0
-#define FX_FONTDECORATION_Raised 0x00000100
-#define FX_FONTDECORATION_Sunken 0x00000200
-#define FX_FONTDECORATION_Shadow 0x00000400
-#define FX_FONTDECORATION_BoundingShape 0x20000000
-#define FX_FONTDECORATION_Hide 0x40000000
-#define FX_FONTDECORATION_StrokeFill 0x80000000
-#define FX_BOUNDINGSHAPE_None 0
-#define FX_BOUNDINGSHAPE_Circle 1
-#define FX_BOUNDINGSHAPE_Square 2
-#define FX_BOUNDINGSHAPE_Triangle 3
-#define FX_BOUNDINGSHAPE_Diamond 4
-
-class IFX_FontProvider {
- public:
-  virtual ~IFX_FontProvider() {}
-  virtual FX_BOOL GetCharWidth(IFX_Font* pFont,
-                               FX_WCHAR wUnicode,
-                               int32_t& iWidth,
-                               FX_BOOL bCharCode = FALSE) = 0;
-};
-
-class IFX_Font {
- public:
-  static IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
-                            FX_DWORD dwFontStyles,
-                            FX_WORD wCodePage,
-                            IFX_FontMgr* pFontMgr);
-  static IFX_Font* LoadFont(const uint8_t* pBuffer,
-                            int32_t iLength,
-                            IFX_FontMgr* pFontMgr);
-  static IFX_Font* LoadFont(const FX_WCHAR* pszFileName, IFX_FontMgr* pFontMgr);
-  static IFX_Font* LoadFont(IFX_Stream* pFontStream,
-                            IFX_FontMgr* pFontMgr,
-                            FX_BOOL bSaveStream = FALSE);
-  static IFX_Font* LoadFont(CFX_Font* pExtFont,
-                            IFX_FontMgr* pFontMgr,
-                            FX_BOOL bTakeOver = FALSE);
-  virtual ~IFX_Font() {}
-  virtual void Release() = 0;
-  virtual IFX_Font* Retain() = 0;
-  virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) = 0;
-  virtual void GetFamilyName(CFX_WideString& wsFamily) const = 0;
-  virtual void GetPsName(CFX_WideString& wsName) const = 0;
-  virtual FX_DWORD GetFontStyles() const = 0;
-  virtual uint8_t GetCharSet() const = 0;
-  virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
-                               int32_t& iWidth,
-                               FX_BOOL bCharCode = FALSE) = 0;
-  virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode,
-                                FX_BOOL bCharCode = FALSE) = 0;
-  virtual int32_t GetAscent() const = 0;
-  virtual int32_t GetDescent() const = 0;
-  virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
-                              CFX_Rect& bbox,
-                              FX_BOOL bCharCode = FALSE) = 0;
-  virtual FX_BOOL GetBBox(CFX_Rect& bbox) = 0;
-  virtual int32_t GetItalicAngle() const = 0;
-  virtual void Reset() = 0;
-  virtual IFX_Font* GetSubstFont(int32_t iGlyphIndex) const = 0;
-  virtual void* GetDevFont() const = 0;
-  virtual void SetFontProvider(IFX_FontProvider* pProvider) = 0;
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) = 0;
-#endif
-};
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-struct FX_FONTMATCHPARAMS {
-  const FX_WCHAR* pwsFamily;
-  FX_DWORD dwFontStyles;
-  FX_DWORD dwUSB;
-  FX_DWORD dwMatchFlags;
-  FX_WCHAR wUnicode;
-  FX_WORD wCodePage;
-};
-typedef FX_FONTMATCHPARAMS* FX_LPFONTMATCHPARAMS;
-typedef FX_FONTMATCHPARAMS const* FX_LPCFONTMATCHPARAMS;
-
-struct FX_FONTSIGNATURE {
-  FX_DWORD fsUsb[4];
-  FX_DWORD fsCsb[2];
-};
-inline bool operator==(const FX_FONTSIGNATURE& left,
-                       const FX_FONTSIGNATURE& right) {
-  return left.fsUsb[0] == right.fsUsb[0] && left.fsUsb[1] == right.fsUsb[1] &&
-         left.fsUsb[2] == right.fsUsb[2] && left.fsUsb[3] == right.fsUsb[3] &&
-         left.fsCsb[0] == right.fsCsb[0] && left.fsCsb[1] == right.fsCsb[1];
-}
-
-struct FX_FONTDESCRIPTOR {
-  FX_WCHAR wsFontFace[32];
-  FX_DWORD dwFontStyles;
-  uint8_t uCharSet;
-  FX_FONTSIGNATURE FontSignature;
-};
-typedef FX_FONTDESCRIPTOR* FX_LPFONTDESCRIPTOR;
-typedef FX_FONTDESCRIPTOR const* FX_LPCFONTDESCRIPTOR;
-typedef CFX_MassArrayTemplate<FX_FONTDESCRIPTOR> CFX_FontDescriptors;
-inline bool operator==(const FX_FONTDESCRIPTOR& left,
-                       const FX_FONTDESCRIPTOR& right) {
-  return left.uCharSet == right.uCharSet &&
-         left.dwFontStyles == right.dwFontStyles &&
-         left.FontSignature == right.FontSignature &&
-         FXSYS_wcscmp(left.wsFontFace, right.wsFontFace) == 0;
-}
-
-#define FX_FONTMATCHPARA_MacthStyle 0x01
-#define FX_FONTMATCHPARA_MacthFamily 0x02
-#define FX_FONTMATCHPARA_MacthUnicode 0x04
-typedef void (*FX_LPEnumAllFonts)(CFX_FontDescriptors& fonts,
-                                  void* pUserData,
-                                  const FX_WCHAR* pwsFaceName,
-                                  FX_WCHAR wUnicode);
-FX_LPEnumAllFonts FX_GetDefFontEnumerator();
-typedef FX_LPCFONTDESCRIPTOR (*FX_LPMatchFont)(FX_LPFONTMATCHPARAMS pParams,
-                                               const CFX_FontDescriptors& fonts,
-                                               void* pUserData);
-FX_LPMatchFont FX_GetDefFontMatchor();
-class IFX_FontMgr {
- public:
-  static IFX_FontMgr* Create(FX_LPEnumAllFonts pEnumerator,
-                             FX_LPMatchFont pMatcher = NULL,
-                             void* pUserData = NULL);
-  virtual ~IFX_FontMgr() {}
-  virtual void Release() = 0;
-  virtual IFX_Font* GetDefFontByCodePage(
-      FX_WORD wCodePage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByCharset(
-      uint8_t nCharset,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByUnicode(
-      FX_WCHAR wUnicode,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByLanguage(
-      FX_WORD wLanguage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage = 0xFFFF) = 0;
-  virtual IFX_Font* LoadFont(const uint8_t* pBuffer, int32_t iLength) = 0;
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName) = 0;
-  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
-                             const FX_WCHAR* pszFontAlias = NULL,
-                             FX_DWORD dwFontStyles = 0,
-                             FX_WORD wCodePage = 0,
-                             FX_BOOL bSaveStream = FALSE) = 0;
-  virtual IFX_Font* LoadFont(IFX_Font* pSrcFont,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage = 0xFFFF) = 0;
-  virtual void ClearFontCache() = 0;
-  virtual void RemoveFont(IFX_Font* pFont) = 0;
-};
-#else
-class IFX_FontMgrDelegate {
- public:
-  virtual ~IFX_FontMgrDelegate() {}
-  virtual IFX_Font* GetDefFontByCodePage(
-      IFX_FontMgr* pFontMgr,
-      FX_WORD wCodePage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByCharset(
-      IFX_FontMgr* pFontMgr,
-      uint8_t nCharset,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByUnicode(
-      IFX_FontMgr* pFontMgr,
-      FX_WCHAR wUnicode,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByLanguage(
-      IFX_FontMgr* pFontMgr,
-      FX_WORD wLanguage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-};
-class IFX_FontSourceEnum {
- public:
-  virtual ~IFX_FontSourceEnum() {}
-  virtual void Release() = 0;
-  virtual FX_POSITION GetStartPosition(void* pUserData = NULL) = 0;
-  virtual IFX_FileAccess* GetNext(FX_POSITION& pos, void* pUserData = NULL) = 0;
-};
-IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum();
-class IFX_FontMgr {
- public:
-  static IFX_FontMgr* Create(IFX_FontSourceEnum* pFontEnum,
-                             IFX_FontMgrDelegate* pDelegate = NULL,
-                             void* pUserData = NULL);
-  virtual ~IFX_FontMgr() {}
-  virtual void Release() = 0;
-  virtual IFX_Font* GetDefFontByCodePage(
-      FX_WORD wCodePage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByCharset(
-      uint8_t nCharset,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByUnicode(
-      FX_WCHAR wUnicode,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetDefFontByLanguage(
-      FX_WORD wLanguage,
-      FX_DWORD dwFontStyles,
-      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage,
-                                      FX_DWORD dwFontStyles,
-                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  inline IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
-                            FX_DWORD dwFontStyles,
-                            FX_WORD wCodePage) {
-    return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
-  }
-  virtual IFX_Font* GetFontByCharset(uint8_t nCharset,
-                                     FX_DWORD dwFontStyles,
-                                     const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode,
-                                     FX_DWORD dwFontStyles,
-                                     const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage,
-                                      FX_DWORD dwFontStyles,
-                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
-  virtual IFX_Font* LoadFont(const uint8_t* pBuffer,
-                             int32_t iLength,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount = NULL) = 0;
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount = NULL) = 0;
-  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount = NULL,
-                             FX_BOOL bSaveStream = FALSE) = 0;
-
-  virtual void ClearFontCache() = 0;
-  virtual void RemoveFont(IFX_Font* pFont) = 0;
-};
-#endif
-
-#endif  // XFA_SRC_FGAS_FONT_FGAS_FONT_H_
diff --git a/xfa/src/fgas/font/fgas_fontutils.cpp b/xfa/src/fgas/font/fgas_fontutils.cpp
deleted file mode 100644
index 62f26f5..0000000
--- a/xfa/src/fgas/font/fgas_fontutils.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/font/fgas_fontutils.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles) {
-  FX_DWORD dwHash = wCodePage;
-  if (dwFontStyles & FX_FONTSTYLE_FixedPitch) {
-    dwHash |= 0x00010000;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Serif) {
-    dwHash |= 0x00020000;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Symbolic) {
-    dwHash |= 0x00040000;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Script) {
-    dwHash |= 0x00080000;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Italic) {
-    dwHash |= 0x00100000;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Bold) {
-    dwHash |= 0x00200000;
-  }
-  return dwHash;
-}
-FX_DWORD FGAS_GetFontFamilyHash(const FX_WCHAR* pszFontFamily,
-                                FX_DWORD dwFontStyles,
-                                FX_WORD wCodePage) {
-  CFX_WideString wsFont(pszFontFamily);
-  if (dwFontStyles & FX_FONTSTYLE_Bold) {
-    wsFont += L"Bold";
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Italic) {
-    wsFont += L"Italic";
-  }
-  wsFont += wCodePage;
-  return FX_HashCode_String_GetW((const FX_WCHAR*)wsFont, wsFont.GetLength());
-}
-static const FGAS_FONTUSB g_FXGdiFontUSBTable[] = {
-    {0x0000, 0x007F, 0, 1252},     {0x0080, 0x00FF, 1, 1252},
-    {0x0100, 0x017F, 2, 1250},     {0x0180, 0x024F, 3, 1250},
-    {0x0250, 0x02AF, 4, 0xFFFF},   {0x02B0, 0x02FF, 5, 0xFFFF},
-    {0x0300, 0x036F, 6, 0xFFFF},   {0x0370, 0x03FF, 7, 1253},
-    {0x0400, 0x04FF, 9, 1251},     {0x0500, 0x052F, 9, 0xFFFF},
-    {0x0530, 0x058F, 10, 0xFFFF},  {0x0590, 0x05FF, 11, 1255},
-    {0x0600, 0x06FF, 13, 1256},    {0x0700, 0x074F, 71, 0xFFFF},
-    {0x0750, 0x077F, 13, 0xFFFF},  {0x0780, 0x07BF, 72, 0xFFFF},
-    {0x07C0, 0x07FF, 14, 0xFFFF},  {0x0800, 0x08FF, 999, 0xFFFF},
-    {0x0900, 0x097F, 15, 0xFFFF},  {0x0980, 0x09FF, 16, 0xFFFF},
-    {0x0A00, 0x0A7F, 17, 0xFFFF},  {0x0A80, 0x0AFF, 18, 0xFFFF},
-    {0x0B00, 0x0B7F, 19, 0xFFFF},  {0x0B80, 0x0BFF, 20, 0xFFFF},
-    {0x0C00, 0x0C7F, 21, 0xFFFF},  {0x0C80, 0x0CFF, 22, 0xFFFF},
-    {0x0D00, 0x0D7F, 23, 0xFFFF},  {0x0D80, 0x0DFF, 73, 0xFFFF},
-    {0x0E00, 0x0E7F, 24, 874},     {0x0E80, 0x0EFF, 25, 0xFFFF},
-    {0x0F00, 0x0FFF, 70, 0xFFFF},  {0x1000, 0x109F, 74, 0xFFFF},
-    {0x10A0, 0x10FF, 26, 0xFFFF},  {0x1100, 0x11FF, 28, 0xFFFF},
-    {0x1200, 0x137F, 75, 0xFFFF},  {0x1380, 0x139F, 75, 0xFFFF},
-    {0x13A0, 0x13FF, 76, 0xFFFF},  {0x1400, 0x167F, 77, 0xFFFF},
-    {0x1680, 0x169F, 78, 0xFFFF},  {0x16A0, 0x16FF, 79, 0xFFFF},
-    {0x1700, 0x171F, 84, 0xFFFF},  {0x1720, 0x173F, 84, 0xFFFF},
-    {0x1740, 0x175F, 84, 0xFFFF},  {0x1760, 0x177F, 84, 0xFFFF},
-    {0x1780, 0x17FF, 80, 0xFFFF},  {0x1800, 0x18AF, 81, 0xFFFF},
-    {0x18B0, 0x18FF, 999, 0xFFFF}, {0x1900, 0x194F, 93, 0xFFFF},
-    {0x1950, 0x197F, 94, 0xFFFF},  {0x1980, 0x19DF, 95, 0xFFFF},
-    {0x19E0, 0x19FF, 80, 0xFFFF},  {0x1A00, 0x1A1F, 96, 0xFFFF},
-    {0x1A20, 0x1AFF, 999, 0xFFFF}, {0x1B00, 0x1B7F, 27, 0xFFFF},
-    {0x1B80, 0x1BBF, 112, 0xFFFF}, {0x1BC0, 0x1BFF, 999, 0xFFFF},
-    {0x1C00, 0x1C4F, 113, 0xFFFF}, {0x1C50, 0x1C7F, 114, 0xFFFF},
-    {0x1C80, 0x1CFF, 999, 0xFFFF}, {0x1D00, 0x1D7F, 4, 0xFFFF},
-    {0x1D80, 0x1DBF, 4, 0xFFFF},   {0x1DC0, 0x1DFF, 6, 0xFFFF},
-    {0x1E00, 0x1EFF, 29, 0xFFFF},  {0x1F00, 0x1FFF, 30, 0xFFFF},
-    {0x2000, 0x206F, 31, 0xFFFF},  {0x2070, 0x209F, 32, 0xFFFF},
-    {0x20A0, 0x20CF, 33, 0xFFFF},  {0x20D0, 0x20FF, 34, 0xFFFF},
-    {0x2100, 0x214F, 35, 0xFFFF},  {0x2150, 0x215F, 36, 0xFFFF},
-    {0x2160, 0x216B, 36, 936},     {0x216C, 0x216F, 36, 0xFFFF},
-    {0x2170, 0x2179, 36, 936},     {0x217A, 0x218F, 36, 0xFFFF},
-    {0x2190, 0x2199, 37, 949},     {0x219A, 0x21FF, 37, 0xFFFF},
-    {0x2200, 0x22FF, 38, 0xFFFF},  {0x2300, 0x23FF, 39, 0xFFFF},
-    {0x2400, 0x243F, 40, 0xFFFF},  {0x2440, 0x245F, 41, 0xFFFF},
-    {0x2460, 0x2473, 42, 932},     {0x2474, 0x249B, 42, 936},
-    {0x249C, 0x24E9, 42, 949},     {0x24EA, 0x24FF, 42, 0xFFFF},
-    {0x2500, 0x2573, 43, 936},     {0x2574, 0x257F, 43, 0xFFFF},
-    {0x2580, 0x2580, 44, 0xFFFF},  {0x2581, 0x258F, 44, 936},
-    {0x2590, 0x259F, 44, 0xFFFF},  {0x25A0, 0x25FF, 45, 0xFFFF},
-    {0x2600, 0x26FF, 46, 0xFFFF},  {0x2700, 0x27BF, 47, 0xFFFF},
-    {0x27C0, 0x27EF, 38, 0xFFFF},  {0x27F0, 0x27FF, 37, 0xFFFF},
-    {0x2800, 0x28FF, 82, 0xFFFF},  {0x2900, 0x297F, 37, 0xFFFF},
-    {0x2980, 0x29FF, 38, 0xFFFF},  {0x2A00, 0x2AFF, 38, 0xFFFF},
-    {0x2B00, 0x2BFF, 37, 0xFFFF},  {0x2C00, 0x2C5F, 97, 0xFFFF},
-    {0x2C60, 0x2C7F, 29, 0xFFFF},  {0x2C80, 0x2CFF, 8, 0xFFFF},
-    {0x2D00, 0x2D2F, 26, 0xFFFF},  {0x2D30, 0x2D7F, 98, 0xFFFF},
-    {0x2D80, 0x2DDF, 75, 0xFFFF},  {0x2DE0, 0x2DFF, 9, 0xFFFF},
-    {0x2E00, 0x2E7F, 31, 0xFFFF},  {0x2E80, 0x2EFF, 59, 0xFFFF},
-    {0x2F00, 0x2FDF, 59, 0xFFFF},  {0x2FE0, 0x2FEF, 999, 0xFFFF},
-    {0x2FF0, 0x2FFF, 59, 0xFFFF},  {0x3000, 0x303F, 48, 0xFFFF},
-    {0x3040, 0x309F, 49, 932},     {0x30A0, 0x30FF, 50, 932},
-    {0x3100, 0x3129, 51, 936},     {0x312A, 0x312F, 51, 0xFFFF},
-    {0x3130, 0x318F, 52, 949},     {0x3190, 0x319F, 59, 0xFFFF},
-    {0x31A0, 0x31BF, 51, 0xFFFF},  {0x31C0, 0x31EF, 61, 0xFFFF},
-    {0x31F0, 0x31FF, 50, 0xFFFF},  {0x3200, 0x321C, 54, 949},
-    {0x321D, 0x325F, 54, 0xFFFF},  {0x3260, 0x327F, 54, 949},
-    {0x3280, 0x32FF, 54, 0xFFFF},  {0x3300, 0x3387, 55, 0xFFFF},
-    {0x3388, 0x33D0, 55, 949},     {0x33D1, 0x33FF, 55, 0xFFFF},
-    {0x3400, 0x4DBF, 59, 0xFFFF},  {0x4DC0, 0x4DFF, 99, 0xFFFF},
-    {0x4E00, 0x9FA5, 59, 936},     {0x9FA6, 0x9FFF, 59, 0xFFFF},
-    {0xA000, 0xA48F, 83, 0xFFFF},  {0xA490, 0xA4CF, 83, 0xFFFF},
-    {0xA4D0, 0xA4FF, 999, 0xFFFF}, {0xA500, 0xA63F, 12, 0xFFFF},
-    {0xA640, 0xA69F, 9, 0xFFFF},   {0xA6A0, 0xA6FF, 999, 0xFFFF},
-    {0xA700, 0xA71F, 5, 0xFFFF},   {0xA720, 0xA7FF, 29, 0xFFFF},
-    {0xA800, 0xA82F, 100, 0xFFFF}, {0xA830, 0xA8FF, 999, 0xFFFF},
-    {0xA840, 0xA87F, 53, 0xFFFF},  {0xA880, 0xA8DF, 115, 0xFFFF},
-    {0xA8E0, 0xA8FF, 999, 0xFFFF}, {0xA900, 0xA92F, 116, 0xFFFF},
-    {0xA930, 0xA95F, 117, 0xFFFF}, {0xA960, 0xA9FF, 999, 0xFFFF},
-    {0xAA00, 0xAA5F, 118, 0xFFFF}, {0xAA60, 0xABFF, 999, 0xFFFF},
-    {0xAC00, 0xD7AF, 56, 949},     {0xD7B0, 0xD7FF, 999, 0xFFFF},
-    {0xD800, 0xDB7F, 57, 0xFFFF},  {0xDB80, 0xDBFF, 57, 0xFFFF},
-    {0xDC00, 0xDFFF, 57, 0xFFFF},  {0xE000, 0xE814, 60, 0xFFFF},
-    {0xE815, 0xE864, 60, 936},     {0xE865, 0xF8FF, 60, 0xFFFF},
-    {0xF900, 0xFA0B, 61, 949},     {0xFA0C, 0xFA0D, 61, 936},
-    {0xFA0E, 0xFA2D, 61, 932},     {0xFA2E, 0xFAFF, 61, 0xFFFF},
-    {0xFB00, 0xFB4F, 62, 0xFFFF},  {0xFB50, 0xFDFF, 63, 1256},
-    {0xFE00, 0xFE0F, 91, 0xFFFF},  {0xFE10, 0xFE1F, 65, 0xFFFF},
-    {0xFE20, 0xFE2F, 64, 0xFFFF},  {0xFE30, 0xFE4F, 65, 0xFFFF},
-    {0xFE50, 0xFE6F, 66, 0xFFFF},  {0xFE70, 0xFEFF, 67, 1256},
-    {0xFF00, 0xFF5F, 68, 936},     {0xFF60, 0xFF9F, 68, 932},
-    {0xFFA0, 0xFFEF, 68, 0xFFFF},
-};
-
-const FGAS_FONTUSB* FGAS_GetUnicodeBitField(FX_WCHAR wUnicode) {
-  int32_t iEnd = sizeof(g_FXGdiFontUSBTable) / sizeof(FGAS_FONTUSB) - 1;
-  FXSYS_assert(iEnd >= 0);
-  int32_t iStart = 0, iMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    const FGAS_FONTUSB& usb = g_FXGdiFontUSBTable[iMid];
-    if (wUnicode < usb.wStartUnicode) {
-      iEnd = iMid - 1;
-    } else if (wUnicode > usb.wEndUnicode) {
-      iStart = iMid + 1;
-    } else {
-      return &usb;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
diff --git a/xfa/src/fgas/font/fgas_fontutils.h b/xfa/src/fgas/font/fgas_fontutils.h
deleted file mode 100644
index 4cceb68..0000000
--- a/xfa/src/fgas/font/fgas_fontutils.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_FONT_FGAS_FONTUTILS_H_
-#define XFA_SRC_FGAS_FONT_FGAS_FONTUTILS_H_
-
-#include "core/include/fxcrt/fx_string.h"
-
-struct FGAS_FONTUSB {
-  FX_WCHAR wStartUnicode;
-  FX_WCHAR wEndUnicode;
-  FX_WORD wBitField;
-  FX_WORD wCodePage;
-};
-
-FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles);
-FX_DWORD FGAS_GetFontFamilyHash(const FX_WCHAR* pszFontFamily,
-                                FX_DWORD dwFontStyles,
-                                FX_WORD wCodePage);
-const FGAS_FONTUSB* FGAS_GetUnicodeBitField(FX_WCHAR wUnicode);
-
-#endif  // XFA_SRC_FGAS_FONT_FGAS_FONTUTILS_H_
diff --git a/xfa/src/fgas/font/fgas_gefont.cpp b/xfa/src/fgas/font/fgas_gefont.cpp
deleted file mode 100644
index df614a5..0000000
--- a/xfa/src/fgas/font/fgas_gefont.cpp
+++ /dev/null
@@ -1,572 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/font/fgas_gefont.h"
-
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/font/fgas_fontutils.h"
-
-IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFontFamily,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage,
-                             IFX_FontMgr* pFontMgr) {
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (NULL != pFontMgr) {
-    return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
-  }
-  return NULL;
-#else
-  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
-  if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) {
-    pFont->Release();
-    return NULL;
-  }
-  return pFont;
-#endif
-}
-IFX_Font* IFX_Font::LoadFont(const uint8_t* pBuffer,
-                             int32_t iLength,
-                             IFX_FontMgr* pFontMgr) {
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (NULL != pFontMgr) {
-    return pFontMgr->LoadFont(pBuffer, iLength, 0, NULL);
-  }
-  return NULL;
-#else
-  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
-  if (!pFont->LoadFont(pBuffer, iLength)) {
-    pFont->Release();
-    return NULL;
-  }
-  return pFont;
-#endif
-}
-IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFileName,
-                             IFX_FontMgr* pFontMgr) {
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (NULL != pFontMgr) {
-    return pFontMgr->LoadFont(pszFileName, 0, NULL);
-  }
-  return NULL;
-#else
-  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
-  if (!pFont->LoadFont(pszFileName)) {
-    pFont->Release();
-    return NULL;
-  }
-  return pFont;
-#endif
-}
-IFX_Font* IFX_Font::LoadFont(IFX_Stream* pFontStream,
-                             IFX_FontMgr* pFontMgr,
-                             FX_BOOL bSaveStream) {
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (NULL != pFontMgr) {
-    return pFontMgr->LoadFont(pFontStream, 0, NULL);
-  }
-  return NULL;
-#else
-  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
-  if (!pFont->LoadFont(pFontStream, bSaveStream)) {
-    pFont->Release();
-    return NULL;
-  }
-  return pFont;
-#endif
-}
-IFX_Font* IFX_Font::LoadFont(CFX_Font* pExtFont,
-                             IFX_FontMgr* pFontMgr,
-                             FX_BOOL bTakeOver) {
-  CFX_GEFont* pFont = new CFX_GEFont(pFontMgr);
-  if (!pFont->LoadFont(pExtFont, bTakeOver)) {
-    pFont->Release();
-    return NULL;
-  }
-  return pFont;
-}
-CFX_GEFont::CFX_GEFont(IFX_FontMgr* pFontMgr)
-    :
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      m_bUseLogFontStyle(FALSE),
-      m_dwLogFontStyle(0),
-#endif
-      m_pFont(NULL),
-      m_pFontMgr(pFontMgr),
-      m_iRefCount(1),
-      m_bExtFont(FALSE),
-      m_pStream(NULL),
-      m_pFileRead(NULL),
-      m_pFontEncoding(NULL),
-      m_pCharWidthMap(NULL),
-      m_pRectArray(NULL),
-      m_pBBoxMap(NULL),
-      m_pProvider(NULL),
-      m_wCharSet(0xFFFF),
-      m_SubstFonts(),
-      m_FontMapper(16) {
-}
-
-CFX_GEFont::CFX_GEFont(const CFX_GEFont& src, FX_DWORD dwFontStyles)
-    :
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      m_bUseLogFontStyle(FALSE),
-      m_dwLogFontStyle(0),
-#endif
-      m_pFont(NULL),
-      m_pFontMgr(src.m_pFontMgr),
-      m_iRefCount(1),
-      m_bExtFont(FALSE),
-      m_pStream(NULL),
-      m_pFileRead(NULL),
-      m_pFontEncoding(NULL),
-      m_pCharWidthMap(NULL),
-      m_pRectArray(NULL),
-      m_pBBoxMap(NULL),
-      m_pProvider(NULL),
-      m_wCharSet(0xFFFF),
-      m_SubstFonts(),
-      m_FontMapper(16) {
-  m_pFont = new CFX_Font;
-  FXSYS_assert(m_pFont != NULL);
-  FXSYS_assert(src.m_pFont != NULL);
-  m_pFont->LoadClone(src.m_pFont);
-  CFX_SubstFont* pSubst = m_pFont->GetSubstFont();
-  if (!pSubst) {
-    pSubst = new CFX_SubstFont;
-    m_pFont->SetSubstFont(pSubst);
-  }
-  pSubst->m_Weight =
-      (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
-  if (dwFontStyles & FX_FONTSTYLE_Italic) {
-    pSubst->m_SubstFlags |= FXFONT_SUBST_ITALIC;
-  }
-  InitFont();
-}
-CFX_GEFont::~CFX_GEFont() {
-  int32_t iCount = m_SubstFonts.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    IFX_Font* pFont = (IFX_Font*)m_SubstFonts[i];
-    pFont->Release();
-  }
-  m_SubstFonts.RemoveAll();
-  m_FontMapper.RemoveAll();
-  if (m_pFileRead != NULL) {
-    m_pFileRead->Release();
-  }
-  if (m_pStream != NULL) {
-    m_pStream->Release();
-  }
-  if (m_pFontEncoding != NULL) {
-    delete m_pFontEncoding;
-  }
-  if (m_pCharWidthMap != NULL) {
-    delete m_pCharWidthMap;
-  }
-  if (m_pRectArray != NULL) {
-    delete m_pRectArray;
-  }
-  if (m_pBBoxMap != NULL) {
-    delete m_pBBoxMap;
-  }
-  if (m_pFont != NULL && !m_bExtFont) {
-    delete m_pFont;
-  }
-}
-void CFX_GEFont::Release() {
-  if (--m_iRefCount < 1) {
-    if (m_pFontMgr != NULL) {
-      m_pFontMgr->RemoveFont(this);
-    }
-    delete this;
-  }
-}
-IFX_Font* CFX_GEFont::Retain() {
-  ++m_iRefCount;
-  return this;
-}
-FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage) {
-  if (m_pFont) {
-    return FALSE;
-  }
-  CFX_ByteString csFontFamily;
-  if (pszFontFamily != NULL) {
-    csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily);
-  }
-  FX_DWORD dwFlags = 0;
-  if (dwFontStyles & FX_FONTSTYLE_FixedPitch) {
-    dwFlags |= FXFONT_FIXED_PITCH;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Serif) {
-    dwFlags |= FXFONT_SERIF;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Symbolic) {
-    dwFlags |= FXFONT_SYMBOLIC;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Script) {
-    dwFlags |= FXFONT_SCRIPT;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Italic) {
-    dwFlags |= FXFONT_ITALIC;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_Bold) {
-    dwFlags |= FXFONT_BOLD;
-  }
-  if (dwFontStyles & FX_FONTSTYLE_ExactMatch) {
-    dwFlags |= FXFONT_EXACTMATCH;
-  }
-  int32_t iWeight =
-      (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
-  FX_WORD wCharSet = FX_GetCharsetFromCodePage(wCodePage);
-  if (wCharSet == 0xFFFF) {
-    wCharSet = FXSYS_GetACP();
-  }
-  m_wCharSet = wCharSet;
-  m_pFont = new CFX_Font;
-  if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) {
-    csFontFamily += ",BoldItalic";
-  } else if (dwFlags & FXFONT_BOLD) {
-    csFontFamily += ",Bold";
-  } else if (dwFlags & FXFONT_ITALIC) {
-    csFontFamily += ",Italic";
-  }
-  m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage);
-  FX_BOOL bRet = m_pFont->GetFace() != nullptr;
-  if (bRet) {
-    bRet = InitFont();
-  }
-  return bRet;
-}
-FX_BOOL CFX_GEFont::LoadFont(const uint8_t* pBuffer, int32_t length) {
-  if (m_pFont) {
-    return FALSE;
-  }
-  m_pFont = new CFX_Font;
-  FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length);
-  if (bRet) {
-    bRet = InitFont();
-  }
-  m_wCharSet = 0xFFFF;
-  return bRet;
-}
-FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFileName) {
-  if (m_pFont || m_pStream || m_pFileRead) {
-    return FALSE;
-  }
-  m_pStream = IFX_Stream::CreateStream(
-      pszFileName, FX_STREAMACCESS_Binary | FX_STREAMACCESS_Read);
-  m_pFileRead = FX_CreateFileRead(m_pStream);
-  FX_BOOL bRet = FALSE;
-  if (m_pStream && m_pFileRead) {
-    m_pFont = new CFX_Font;
-    bRet = m_pFont->LoadFile(m_pFileRead);
-    if (bRet) {
-      bRet = InitFont();
-    } else {
-      m_pFileRead->Release();
-      m_pFileRead = nullptr;
-    }
-  }
-  m_wCharSet = 0xFFFF;
-  return bRet;
-}
-FX_BOOL CFX_GEFont::LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream) {
-  if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) {
-    return FALSE;
-  }
-  if (bSaveStream) {
-    m_pStream = pFontStream;
-  }
-  m_pFileRead = FX_CreateFileRead(pFontStream);
-  m_pFont = new CFX_Font;
-  FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead);
-  if (bRet) {
-    bRet = InitFont();
-  } else {
-    m_pFileRead->Release();
-    m_pFileRead = nullptr;
-  }
-  m_wCharSet = 0xFFFF;
-  return bRet;
-}
-FX_BOOL CFX_GEFont::LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver) {
-  if (m_pFont || !pExtFont) {
-    return FALSE;
-  }
-  m_pFont = pExtFont;
-  FX_BOOL bRet = !!m_pFont;
-  if (bRet) {
-    m_bExtFont = !bTakeOver;
-    bRet = InitFont();
-  } else {
-    m_bExtFont = TRUE;
-  }
-  m_wCharSet = 0xFFFF;
-  return bRet;
-}
-FX_BOOL CFX_GEFont::InitFont() {
-  if (!m_pFont) {
-    return FALSE;
-  }
-  if (!m_pFontEncoding) {
-    m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont);
-    if (!m_pFontEncoding) {
-      return FALSE;
-    }
-  }
-  if (!m_pCharWidthMap) {
-    m_pCharWidthMap = new CFX_WordDiscreteArray(1024);
-  }
-  if (!m_pRectArray) {
-    m_pRectArray = new CFX_RectMassArray(16);
-  }
-  if (!m_pBBoxMap) {
-    m_pBBoxMap = new CFX_MapPtrToPtr(16);
-  }
-  return TRUE;
-}
-IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage) {
-  if (GetFontStyles() == dwFontStyles) {
-    return Retain();
-  }
-  return new CFX_GEFont(*this, dwFontStyles);
-}
-uint8_t CFX_GEFont::GetCharSet() const {
-  if (m_wCharSet != 0xFFFF) {
-    return (uint8_t)m_wCharSet;
-  }
-  if (!m_pFont->GetSubstFont()) {
-    return FX_CHARSET_Default;
-  }
-  return m_pFont->GetSubstFont()->m_Charset;
-}
-void CFX_GEFont::GetFamilyName(CFX_WideString& wsFamily) const {
-  if (!m_pFont->GetSubstFont() ||
-      m_pFont->GetSubstFont()->m_Family.GetLength() == 0) {
-    wsFamily = CFX_WideString::FromLocal(m_pFont->GetFamilyName());
-  } else {
-    wsFamily = CFX_WideString::FromLocal(m_pFont->GetSubstFont()->m_Family);
-  }
-}
-void CFX_GEFont::GetPsName(CFX_WideString& wsName) const {
-  wsName = m_pFont->GetPsName();
-}
-FX_DWORD CFX_GEFont::GetFontStyles() const {
-  FXSYS_assert(m_pFont != NULL);
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (m_bUseLogFontStyle) {
-    return m_dwLogFontStyle;
-  }
-#endif
-  FX_DWORD dwStyles = 0;
-  if (!m_pFont->GetSubstFont()) {
-    if (m_pFont->IsBold()) {
-      dwStyles |= FX_FONTSTYLE_Bold;
-    }
-    if (m_pFont->IsItalic()) {
-      dwStyles |= FX_FONTSTYLE_Italic;
-    }
-  } else {
-    if (m_pFont->GetSubstFont()->m_Weight == FXFONT_FW_BOLD) {
-      dwStyles |= FX_FONTSTYLE_Bold;
-    }
-    if (m_pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_ITALIC) {
-      dwStyles |= FX_FONTSTYLE_Italic;
-    }
-  }
-  return dwStyles;
-}
-FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode,
-                                 int32_t& iWidth,
-                                 FX_BOOL bCharCode) {
-  return GetCharWidth(wUnicode, iWidth, TRUE, bCharCode);
-}
-FX_BOOL CFX_GEFont::GetCharWidth(FX_WCHAR wUnicode,
-                                 int32_t& iWidth,
-                                 FX_BOOL bRecursive,
-                                 FX_BOOL bCharCode) {
-  FXSYS_assert(m_pCharWidthMap != NULL);
-  iWidth = m_pCharWidthMap->GetAt(wUnicode, 0);
-  if (iWidth < 1) {
-    if (!m_pProvider ||
-        !m_pProvider->GetCharWidth(this, wUnicode, iWidth, bCharCode)) {
-      IFX_Font* pFont = NULL;
-      int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
-      if (iGlyph != 0xFFFF && pFont != NULL) {
-        if (pFont == (IFX_Font*)this) {
-          iWidth = m_pFont->GetGlyphWidth(iGlyph);
-          if (iWidth < 0) {
-            iWidth = -1;
-          }
-        } else if (((CFX_GEFont*)pFont)
-                       ->GetCharWidth(wUnicode, iWidth, FALSE, bCharCode)) {
-          return TRUE;
-        }
-      } else {
-        iWidth = -1;
-      }
-    }
-    m_pCharWidthMap->SetAtGrow(wUnicode, (int16_t)iWidth);
-  } else if (iWidth == 65535) {
-    iWidth = -1;
-  }
-  return iWidth > 0;
-}
-FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode,
-                                CFX_Rect& bbox,
-                                FX_BOOL bCharCode) {
-  return GetCharBBox(wUnicode, bbox, TRUE, bCharCode);
-}
-FX_BOOL CFX_GEFont::GetCharBBox(FX_WCHAR wUnicode,
-                                CFX_Rect& bbox,
-                                FX_BOOL bRecursive,
-                                FX_BOOL bCharCode) {
-  FXSYS_assert(m_pRectArray != NULL);
-  FXSYS_assert(m_pBBoxMap != NULL);
-  void* pRect = NULL;
-  if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) {
-    IFX_Font* pFont = NULL;
-    int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
-    if (iGlyph != 0xFFFF && pFont != NULL) {
-      if (pFont == (IFX_Font*)this) {
-        FX_RECT rtBBox;
-        if (m_pFont->GetGlyphBBox(iGlyph, rtBBox)) {
-          CFX_Rect rt;
-          rt.Set(rtBBox.left, rtBBox.top, rtBBox.Width(), rtBBox.Height());
-          int32_t index = m_pRectArray->Add(rt);
-          pRect = m_pRectArray->GetPtrAt(index);
-          m_pBBoxMap->SetAt((void*)(uintptr_t)wUnicode, pRect);
-        }
-      } else if (((CFX_GEFont*)pFont)
-                     ->GetCharBBox(wUnicode, bbox, FALSE, bCharCode)) {
-        return TRUE;
-      }
-    }
-  }
-  if (!pRect)
-    return FALSE;
-
-  bbox = *static_cast<const CFX_Rect*>(pRect);
-  return TRUE;
-}
-FX_BOOL CFX_GEFont::GetBBox(CFX_Rect& bbox) {
-  FX_RECT rt(0, 0, 0, 0);
-  FX_BOOL bRet = m_pFont->GetBBox(rt);
-  if (bRet) {
-    bbox.left = rt.left;
-    bbox.width = rt.Width();
-    bbox.top = rt.bottom;
-    bbox.height = -rt.Height();
-  }
-  return bRet;
-}
-int32_t CFX_GEFont::GetItalicAngle() const {
-  if (!m_pFont->GetSubstFont()) {
-    return 0;
-  }
-  return m_pFont->GetSubstFont()->m_ItalicAngle;
-}
-int32_t CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode) {
-  return GetGlyphIndex(wUnicode, TRUE, NULL, bCharCode);
-}
-int32_t CFX_GEFont::GetGlyphIndex(FX_WCHAR wUnicode,
-                                  FX_BOOL bRecursive,
-                                  IFX_Font** ppFont,
-                                  FX_BOOL bCharCode) {
-  FXSYS_assert(m_pFontEncoding != NULL);
-  int32_t iGlyphIndex = m_pFontEncoding->GlyphFromCharCode(wUnicode);
-  if (iGlyphIndex > 0) {
-    if (ppFont != NULL) {
-      *ppFont = (IFX_Font*)this;
-    }
-    return iGlyphIndex;
-  }
-  const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode);
-  if (pFontUSB == NULL) {
-    return 0xFFFF;
-  }
-  FX_WORD wBitField = pFontUSB->wBitField;
-  if (wBitField >= 128) {
-    return 0xFFFF;
-  }
-  IFX_Font* pFont = NULL;
-  m_FontMapper.Lookup((void*)(uintptr_t)wUnicode, (void*&)pFont);
-  if (pFont != NULL && pFont != (IFX_Font*)this) {
-    iGlyphIndex =
-        ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
-    if (iGlyphIndex != 0xFFFF) {
-      int32_t i = m_SubstFonts.Find(pFont);
-      if (i > -1) {
-        iGlyphIndex |= ((i + 1) << 24);
-        if (ppFont != NULL) {
-          *ppFont = pFont;
-        }
-        return iGlyphIndex;
-      }
-    }
-  }
-  if (m_pFontMgr != NULL && bRecursive) {
-    CFX_WideString wsFamily;
-    GetFamilyName(wsFamily);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-    IFX_Font* pFont = m_pFontMgr->GetDefFontByUnicode(
-        wUnicode, GetFontStyles(), (const FX_WCHAR*)wsFamily);
-#else
-    IFX_Font* pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(),
-                                                   (const FX_WCHAR*)wsFamily);
-    if (NULL == pFont) {
-      pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), NULL);
-    }
-#endif
-    if (pFont != NULL) {
-      if (pFont == (IFX_Font*)this) {
-        pFont->Release();
-        return 0xFFFF;
-      }
-      m_FontMapper.SetAt((void*)(uintptr_t)wUnicode, (void*)pFont);
-      int32_t i = m_SubstFonts.GetSize();
-      m_SubstFonts.Add(pFont);
-      iGlyphIndex =
-          ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
-      if (iGlyphIndex != 0xFFFF) {
-        iGlyphIndex |= ((i + 1) << 24);
-        if (ppFont != NULL) {
-          *ppFont = pFont;
-        }
-        return iGlyphIndex;
-      }
-    }
-  }
-  return 0xFFFF;
-}
-int32_t CFX_GEFont::GetAscent() const {
-  return m_pFont->GetAscent();
-}
-int32_t CFX_GEFont::GetDescent() const {
-  return m_pFont->GetDescent();
-}
-void CFX_GEFont::Reset() {
-  int32_t iCount = m_SubstFonts.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    IFX_Font* pFont = (IFX_Font*)m_SubstFonts[i];
-    ((CFX_GEFont*)pFont)->Reset();
-  }
-  if (m_pCharWidthMap != NULL) {
-    m_pCharWidthMap->RemoveAll();
-  }
-  if (m_pBBoxMap != NULL) {
-    m_pBBoxMap->RemoveAll();
-  }
-  if (m_pRectArray != NULL) {
-    m_pRectArray->RemoveAll();
-  }
-}
-IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const {
-  iGlyphIndex = ((FX_DWORD)iGlyphIndex) >> 24;
-  return iGlyphIndex == 0 ? (IFX_Font*)this
-                          : (IFX_Font*)m_SubstFonts[iGlyphIndex - 1];
-}
diff --git a/xfa/src/fgas/font/fgas_gefont.h b/xfa/src/fgas/font/fgas_gefont.h
deleted file mode 100644
index 1bc8a6a..0000000
--- a/xfa/src/fgas/font/fgas_gefont.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_FONT_FGAS_GEFONT_H_
-#define XFA_SRC_FGAS_FONT_FGAS_GEFONT_H_
-
-#include "xfa/src/fgas/crt/fgas_utils.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-#define FXFONT_SUBST_ITALIC 0x02
-
-class CFX_GEFont : public IFX_Font {
- public:
-  CFX_GEFont(const CFX_GEFont& src, FX_DWORD dwFontStyles);
-  CFX_GEFont(IFX_FontMgr* pFontMgr);
-  ~CFX_GEFont();
-  virtual void Release();
-  virtual IFX_Font* Retain();
-  FX_BOOL LoadFont(const FX_WCHAR* pszFontFamily,
-                   FX_DWORD dwFontStyles,
-                   FX_WORD wCodePage);
-  FX_BOOL LoadFont(const uint8_t* pBuffer, int32_t length);
-  FX_BOOL LoadFont(const FX_WCHAR* pszFileName);
-  FX_BOOL LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream);
-  FX_BOOL LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver = FALSE);
-  virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0);
-  virtual void GetFamilyName(CFX_WideString& wsFamily) const;
-  virtual void GetPsName(CFX_WideString& wsName) const;
-  virtual FX_DWORD GetFontStyles() const;
-  virtual uint8_t GetCharSet() const;
-  virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
-                               int32_t& iWidth,
-                               FX_BOOL bCharCode = FALSE);
-  virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE);
-  virtual int32_t GetAscent() const;
-  virtual int32_t GetDescent() const;
-  virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
-                              CFX_Rect& bbox,
-                              FX_BOOL bCharCode = FALSE);
-  virtual FX_BOOL GetBBox(CFX_Rect& bbox);
-  virtual int32_t GetItalicAngle() const;
-  virtual void Reset();
-  virtual IFX_Font* GetSubstFont(int32_t iGlyphIndex) const;
-  virtual void* GetDevFont() const { return (void*)m_pFont; }
-  virtual void SetFontProvider(IFX_FontProvider* pProvider) {
-    m_pProvider = pProvider;
-  }
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) {
-    m_bUseLogFontStyle = TRUE;
-    m_dwLogFontStyle = dwLogFontStyle;
-  }
-#endif
-
- protected:
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  FX_BOOL m_bUseLogFontStyle;
-  FX_DWORD m_dwLogFontStyle;
-#endif
-  CFX_Font* m_pFont;
-  IFX_FontMgr* m_pFontMgr;
-  int32_t m_iRefCount;
-  FX_BOOL m_bExtFont;
-  IFX_Stream* m_pStream;
-  IFX_FileRead* m_pFileRead;
-  CFX_UnicodeEncoding* m_pFontEncoding;
-  CFX_WordDiscreteArray* m_pCharWidthMap;
-  CFX_RectMassArray* m_pRectArray;
-  CFX_MapPtrToPtr* m_pBBoxMap;
-  IFX_FontProvider* m_pProvider;
-  FX_WORD m_wCharSet;
-  CFX_PtrArray m_SubstFonts;
-  CFX_MapPtrToPtr m_FontMapper;
-  FX_BOOL InitFont();
-  FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
-                      CFX_Rect& bbox,
-                      FX_BOOL bRecursive,
-                      FX_BOOL bCharCode = FALSE);
-  FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
-                       int32_t& iWidth,
-                       FX_BOOL bRecursive,
-                       FX_BOOL bCharCode = FALSE);
-  int32_t GetGlyphIndex(FX_WCHAR wUnicode,
-                        FX_BOOL bRecursive,
-                        IFX_Font** ppFont,
-                        FX_BOOL bCharCode = FALSE);
-};
-
-#endif  // XFA_SRC_FGAS_FONT_FGAS_GEFONT_H_
diff --git a/xfa/src/fgas/font/fgas_stdfontmgr.cpp b/xfa/src/fgas/font/fgas_stdfontmgr.cpp
deleted file mode 100644
index 99f1fdd..0000000
--- a/xfa/src/fgas/font/fgas_stdfontmgr.cpp
+++ /dev/null
@@ -1,1515 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/font/fgas_stdfontmgr.h"
-
-#include "core/include/fxcrt/fx_stream.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/font/fgas_fontutils.h"
-
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-IFX_FontMgr* IFX_FontMgr::Create(FX_LPEnumAllFonts pEnumerator,
-                                 FX_LPMatchFont pMatcher,
-                                 void* pUserData) {
-  return new CFX_StdFontMgrImp(pEnumerator, pMatcher, pUserData);
-}
-CFX_StdFontMgrImp::CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator,
-                                     FX_LPMatchFont pMatcher,
-                                     void* pUserData)
-    : m_pMatcher(pMatcher),
-      m_pEnumerator(pEnumerator),
-      m_FontFaces(),
-      m_Fonts(),
-      m_CPFonts(8),
-      m_FamilyFonts(16),
-      m_UnicodeFonts(16),
-      m_BufferFonts(4),
-      m_FileFonts(4),
-      m_StreamFonts(4),
-      m_DeriveFonts(4),
-      m_pUserData(pUserData) {
-  if (m_pEnumerator != NULL) {
-    m_pEnumerator(m_FontFaces, m_pUserData, NULL, 0xFEFF);
-  }
-  if (m_pMatcher == NULL) {
-    m_pMatcher = FX_DefFontMatcher;
-  }
-  FXSYS_assert(m_pMatcher != NULL);
-}
-CFX_StdFontMgrImp::~CFX_StdFontMgrImp() {
-  m_FontFaces.RemoveAll();
-  m_CPFonts.RemoveAll();
-  m_FamilyFonts.RemoveAll();
-  m_UnicodeFonts.RemoveAll();
-  m_BufferFonts.RemoveAll();
-  m_FileFonts.RemoveAll();
-  m_StreamFonts.RemoveAll();
-  m_DeriveFonts.RemoveAll();
-  for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) {
-    IFX_Font* pFont = (IFX_Font*)m_Fonts[i];
-    if (pFont != NULL) {
-      pFont->Release();
-    }
-  }
-  m_Fonts.RemoveAll();
-}
-IFX_Font* CFX_StdFontMgrImp::GetDefFontByCodePage(
-    FX_WORD wCodePage,
-    FX_DWORD dwFontStyles,
-    const FX_WCHAR* pszFontFamily) {
-  FX_DWORD dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
-  IFX_Font* pFont = NULL;
-  if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
-    return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL;
-  }
-  FX_LPCFONTDESCRIPTOR pFD;
-  if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) {
-    if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) {
-      if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL)
-        return NULL;
-    }
-  }
-  FXSYS_assert(pFD != NULL);
-  pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
-  if (pFont != NULL) {
-    m_Fonts.Add(pFont);
-    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage);
-    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    return LoadFont(pFont, dwFontStyles, wCodePage);
-  }
-  return NULL;
-}
-IFX_Font* CFX_StdFontMgrImp::GetDefFontByCharset(
-    uint8_t nCharset,
-    FX_DWORD dwFontStyles,
-    const FX_WCHAR* pszFontFamily) {
-  return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
-                              pszFontFamily);
-}
-
-IFX_Font* CFX_StdFontMgrImp::GetDefFontByUnicode(
-    FX_WCHAR wUnicode,
-    FX_DWORD dwFontStyles,
-    const FX_WCHAR* pszFontFamily) {
-  const FGAS_FONTUSB* pRet = FGAS_GetUnicodeBitField(wUnicode);
-  if (pRet->wBitField == 999)
-    return nullptr;
-
-  FX_DWORD dwHash =
-      FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField);
-  IFX_Font* pFont = nullptr;
-  if (m_UnicodeFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont))
-    return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : nullptr;
-
-  FX_LPCFONTDESCRIPTOR pFD =
-      FindFont(pszFontFamily, dwFontStyles, FALSE, pRet->wCodePage,
-               pRet->wBitField, wUnicode);
-  if (!pFD && pszFontFamily) {
-    pFD = FindFont(nullptr, dwFontStyles, FALSE, pRet->wCodePage,
-                   pRet->wBitField, wUnicode);
-  }
-  if (!pFD)
-    return nullptr;
-
-  FX_WORD wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
-  const FX_WCHAR* pFontFace = pFD->wsFontFace;
-  pFont = IFX_Font::LoadFont(pFontFace, dwFontStyles, wCodePage, this);
-  if (pFont) {
-    m_Fonts.Add(pFont);
-    m_UnicodeFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
-    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage);
-    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    return LoadFont(pFont, dwFontStyles, wCodePage);
-  }
-  return nullptr;
-}
-
-IFX_Font* CFX_StdFontMgrImp::GetDefFontByLanguage(
-    FX_WORD wLanguage,
-    FX_DWORD dwFontStyles,
-    const FX_WCHAR* pszFontFamily) {
-  return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage),
-                              dwFontStyles, pszFontFamily);
-}
-IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily,
-                                      FX_DWORD dwFontStyles,
-                                      FX_WORD wCodePage) {
-  FX_DWORD dwHash =
-      FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage);
-  IFX_Font* pFont = NULL;
-  if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
-    return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL;
-  }
-  FX_LPCFONTDESCRIPTOR pFD = NULL;
-  if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) {
-    if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) ==
-        NULL) {
-      return NULL;
-    }
-  }
-  FXSYS_assert(pFD != NULL);
-  if (wCodePage == 0xFFFF) {
-    wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
-  }
-  pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
-  if (pFont != NULL) {
-    m_Fonts.Add(pFont);
-    m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
-    m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    return LoadFont(pFont, dwFontStyles, wCodePage);
-  }
-  return NULL;
-}
-IFX_Font* CFX_StdFontMgrImp::LoadFont(const uint8_t* pBuffer, int32_t iLength) {
-  FXSYS_assert(pBuffer != NULL && iLength > 0);
-  IFX_Font* pFont = NULL;
-  if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) {
-    if (pFont != NULL) {
-      return pFont->Retain();
-    }
-  }
-  pFont = IFX_Font::LoadFont(pBuffer, iLength, this);
-  if (pFont != NULL) {
-    m_Fonts.Add(pFont);
-    m_BufferFonts.SetAt((void*)pBuffer, pFont);
-    return pFont->Retain();
-  }
-  return NULL;
-}
-IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) {
-  FXSYS_assert(pszFileName != NULL);
-  FX_DWORD dwHash = FX_HashCode_String_GetW(pszFileName, -1);
-  IFX_Font* pFont = NULL;
-  if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
-    if (pFont != NULL) {
-      return pFont->Retain();
-    }
-  }
-  pFont = IFX_Font::LoadFont(pszFileName, NULL);
-  if (pFont != NULL) {
-    m_Fonts.Add(pFont);
-    m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    return pFont->Retain();
-  }
-  return NULL;
-}
-IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream,
-                                      const FX_WCHAR* pszFontAlias,
-                                      FX_DWORD dwFontStyles,
-                                      FX_WORD wCodePage,
-                                      FX_BOOL bSaveStream) {
-  FXSYS_assert(pFontStream != NULL && pFontStream->GetLength() > 0);
-  IFX_Font* pFont = NULL;
-  if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) {
-    if (pFont != NULL) {
-      if (pszFontAlias != NULL) {
-        FX_DWORD dwHash =
-            FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
-        m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-      }
-      return LoadFont(pFont, dwFontStyles, wCodePage);
-    }
-  }
-  pFont = IFX_Font::LoadFont(pFontStream, this, bSaveStream);
-  if (pFont != NULL) {
-    m_Fonts.Add(pFont);
-    m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont);
-    if (pszFontAlias != NULL) {
-      FX_DWORD dwHash =
-          FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
-      m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    }
-    return LoadFont(pFont, dwFontStyles, wCodePage);
-  }
-  return NULL;
-}
-IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font* pSrcFont,
-                                      FX_DWORD dwFontStyles,
-                                      FX_WORD wCodePage) {
-  FXSYS_assert(pSrcFont != NULL);
-  if (pSrcFont->GetFontStyles() == dwFontStyles) {
-    return pSrcFont->Retain();
-  }
-  void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles,
-                     (void*)(uintptr_t)wCodePage};
-  FX_DWORD dwHash =
-      FX_HashCode_String_GetA((const FX_CHAR*)buffer, 3 * sizeof(void*));
-  IFX_Font* pFont = NULL;
-  if (m_DeriveFonts.GetCount() > 0) {
-    m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont);
-    if (pFont != NULL) {
-      return pFont->Retain();
-    }
-  }
-  pFont = pSrcFont->Derive(dwFontStyles, wCodePage);
-  if (pFont != NULL) {
-    m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
-    int32_t index = m_Fonts.Find(pFont);
-    if (index < 0) {
-      m_Fonts.Add(pFont);
-      pFont->Retain();
-    }
-    return pFont;
-  }
-  return NULL;
-}
-void CFX_StdFontMgrImp::ClearFontCache() {
-  int32_t iCount = m_Fonts.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    IFX_Font* pFont = (IFX_Font*)m_Fonts[i];
-    if (pFont != NULL) {
-      pFont->Reset();
-    }
-  }
-}
-void CFX_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap, IFX_Font* pFont) {
-  FX_POSITION pos = fontMap.GetStartPosition();
-  void* pKey;
-  void* pFind;
-  while (pos != NULL) {
-    pFind = NULL;
-    fontMap.GetNextAssoc(pos, pKey, pFind);
-    if (pFind != (void*)pFont) {
-      continue;
-    }
-    fontMap.RemoveKey(pKey);
-    break;
-  }
-}
-void CFX_StdFontMgrImp::RemoveFont(IFX_Font* pFont) {
-  RemoveFont(m_CPFonts, pFont);
-  RemoveFont(m_FamilyFonts, pFont);
-  RemoveFont(m_UnicodeFonts, pFont);
-  RemoveFont(m_BufferFonts, pFont);
-  RemoveFont(m_FileFonts, pFont);
-  RemoveFont(m_StreamFonts, pFont);
-  RemoveFont(m_DeriveFonts, pFont);
-  int32_t iFind = m_Fonts.Find(pFont);
-  if (iFind > -1) {
-    m_Fonts.RemoveAt(iFind, 1);
-  }
-}
-FX_LPCFONTDESCRIPTOR CFX_StdFontMgrImp::FindFont(const FX_WCHAR* pszFontFamily,
-                                                 FX_DWORD dwFontStyles,
-                                                 FX_DWORD dwMatchFlags,
-                                                 FX_WORD wCodePage,
-                                                 FX_DWORD dwUSB,
-                                                 FX_WCHAR wUnicode) {
-  if (m_pMatcher == NULL) {
-    return NULL;
-  }
-  FX_FONTMATCHPARAMS params;
-  FXSYS_memset(&params, 0, sizeof(params));
-  params.dwUSB = dwUSB;
-  params.wUnicode = wUnicode;
-  params.wCodePage = wCodePage;
-  params.pwsFamily = pszFontFamily;
-  params.dwFontStyles = dwFontStyles;
-  params.dwMatchFlags = dwMatchFlags;
-  FX_LPCFONTDESCRIPTOR pDesc = m_pMatcher(&params, m_FontFaces, m_pUserData);
-  if (pDesc) {
-    return pDesc;
-  }
-  if (pszFontFamily && m_pEnumerator) {
-    CFX_FontDescriptors namedFonts;
-    m_pEnumerator(namedFonts, m_pUserData, pszFontFamily, wUnicode);
-    params.pwsFamily = NULL;
-    pDesc = m_pMatcher(&params, namedFonts, m_pUserData);
-    if (pDesc == NULL) {
-      return NULL;
-    }
-    for (int32_t i = m_FontFaces.GetSize() - 1; i >= 0; i--) {
-      FX_LPCFONTDESCRIPTOR pMatch = m_FontFaces.GetPtrAt(i);
-      if (*pMatch == *pDesc) {
-        return pMatch;
-      }
-    }
-    int index = m_FontFaces.Add(*pDesc);
-    return m_FontFaces.GetPtrAt(index);
-  }
-  return NULL;
-}
-FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
-                                       const CFX_FontDescriptors& fonts,
-                                       void* pUserData) {
-  FX_LPCFONTDESCRIPTOR pBestFont = NULL;
-  int32_t iBestSimilar = 0;
-  FX_BOOL bMatchStyle =
-      (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0;
-  int32_t iCount = fonts.GetSize();
-  for (int32_t i = 0; i < iCount; ++i) {
-    FX_LPCFONTDESCRIPTOR pFont = fonts.GetPtrAt(i);
-    if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) ==
-        FX_FONTSTYLE_BoldItalic) {
-      continue;
-    }
-    if (pParams->pwsFamily) {
-      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace)) {
-        continue;
-      }
-      if (pFont->uCharSet == FX_CHARSET_Symbol) {
-        return pFont;
-      }
-    }
-    if (pFont->uCharSet == FX_CHARSET_Symbol) {
-      continue;
-    }
-    if (pParams->wCodePage != 0xFFFF) {
-      if (FX_GetCodePageFromCharset(pFont->uCharSet) != pParams->wCodePage) {
-        continue;
-      }
-    } else {
-      if (pParams->dwUSB < 128) {
-        FX_DWORD dwByte = pParams->dwUSB / 32;
-        FX_DWORD dwUSB = 1 << (pParams->dwUSB % 32);
-        if ((pFont->FontSignature.fsUsb[dwByte] & dwUSB) == 0) {
-          continue;
-        }
-      }
-    }
-    if (bMatchStyle) {
-      if ((pFont->dwFontStyles & 0x0F) == (pParams->dwFontStyles & 0x0F)) {
-        return pFont;
-      } else {
-        continue;
-      }
-    }
-    if (pParams->pwsFamily != NULL) {
-      if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) {
-        return pFont;
-      }
-    }
-    int32_t iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles);
-    if (iBestSimilar < iSimilarValue) {
-      iBestSimilar = iSimilarValue;
-      pBestFont = pFont;
-    }
-  }
-  return iBestSimilar < 1 ? NULL : pBestFont;
-}
-int32_t FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles) {
-  int32_t iValue = 0;
-  if ((dwFontStyles & FX_FONTSTYLE_Symbolic) ==
-      (pFont->dwFontStyles & FX_FONTSTYLE_Symbolic)) {
-    iValue += 64;
-  }
-  if ((dwFontStyles & FX_FONTSTYLE_FixedPitch) ==
-      (pFont->dwFontStyles & FX_FONTSTYLE_FixedPitch)) {
-    iValue += 32;
-  }
-  if ((dwFontStyles & FX_FONTSTYLE_Serif) ==
-      (pFont->dwFontStyles & FX_FONTSTYLE_Serif)) {
-    iValue += 16;
-  }
-  if ((dwFontStyles & FX_FONTSTYLE_Script) ==
-      (pFont->dwFontStyles & FX_FONTSTYLE_Script)) {
-    iValue += 8;
-  }
-  return iValue;
-}
-FX_LPMatchFont FX_GetDefFontMatchor() {
-  return FX_DefFontMatcher;
-}
-FX_DWORD FX_GetGdiFontStyles(const LOGFONTW& lf) {
-  FX_DWORD dwStyles = 0;
-  if ((lf.lfPitchAndFamily & 0x03) == FIXED_PITCH) {
-    dwStyles |= FX_FONTSTYLE_FixedPitch;
-  }
-  uint8_t nFamilies = lf.lfPitchAndFamily & 0xF0;
-  if (nFamilies == FF_ROMAN) {
-    dwStyles |= FX_FONTSTYLE_Serif;
-  }
-  if (nFamilies == FF_SCRIPT) {
-    dwStyles |= FX_FONTSTYLE_Script;
-  }
-  if (lf.lfCharSet == SYMBOL_CHARSET) {
-    dwStyles |= FX_FONTSTYLE_Symbolic;
-  }
-  return dwStyles;
-}
-static int32_t CALLBACK FX_GdiFontEnumProc(ENUMLOGFONTEX* lpelfe,
-                                           NEWTEXTMETRICEX* lpntme,
-                                           DWORD dwFontType,
-                                           LPARAM lParam) {
-  if (dwFontType != TRUETYPE_FONTTYPE) {
-    return 1;
-  }
-  const LOGFONTW& lf = ((LPENUMLOGFONTEXW)lpelfe)->elfLogFont;
-  if (lf.lfFaceName[0] == L'@') {
-    return 1;
-  }
-  FX_LPFONTDESCRIPTOR pFont = FX_Alloc(FX_FONTDESCRIPTOR, 1);
-  FXSYS_memset(pFont, 0, sizeof(FX_FONTDESCRIPTOR));
-  pFont->uCharSet = lf.lfCharSet;
-  pFont->dwFontStyles = FX_GetGdiFontStyles(lf);
-  FXSYS_wcsncpy(pFont->wsFontFace, (const FX_WCHAR*)lf.lfFaceName, 31);
-  pFont->wsFontFace[31] = 0;
-  FXSYS_memcpy(&pFont->FontSignature, &lpntme->ntmFontSig,
-               sizeof(lpntme->ntmFontSig));
-  ((CFX_FontDescriptors*)lParam)->Add(*pFont);
-  FX_Free(pFont);
-  return 1;
-}
-static void FX_EnumGdiFonts(CFX_FontDescriptors& fonts,
-                            void* pUserData,
-                            const FX_WCHAR* pwsFaceName,
-                            FX_WCHAR wUnicode) {
-  HDC hDC = ::GetDC(NULL);
-  LOGFONTW lfFind;
-  FXSYS_memset(&lfFind, 0, sizeof(lfFind));
-  lfFind.lfCharSet = DEFAULT_CHARSET;
-  if (pwsFaceName) {
-    FXSYS_wcsncpy((FX_WCHAR*)lfFind.lfFaceName, pwsFaceName, 31);
-    lfFind.lfFaceName[31] = 0;
-  }
-  EnumFontFamiliesExW(hDC, (LPLOGFONTW)&lfFind,
-                      (FONTENUMPROCW)FX_GdiFontEnumProc, (LPARAM)&fonts, 0);
-  ::ReleaseDC(NULL, hDC);
-}
-FX_LPEnumAllFonts FX_GetDefFontEnumerator() {
-  return FX_EnumGdiFonts;
-}
-#else
-const FX_CHAR* g_FontFolders[] = {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
-    "/usr/share/fonts", "/usr/share/X11/fonts/Type1",
-    "/usr/share/X11/fonts/TTF", "/usr/local/share/fonts",
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-    "~/Library/Fonts", "/Library/Fonts", "/System/Library/Fonts",
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-    "/system/fonts",
-#endif
-};
-
-CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() {
-  for (size_t i = 0; i < FX_ArraySize(g_FontFolders); ++i)
-    m_FolderPaths.Add(g_FontFolders[i]);
-}
-
-CFX_ByteString CFX_FontSourceEnum_File::GetNextFile() {
-Restart:
-  void* pCurHandle =
-      m_FolderQueue.GetSize() == 0
-          ? NULL
-          : m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle;
-  if (NULL == pCurHandle) {
-    if (m_FolderPaths.GetSize() < 1) {
-      return "";
-    }
-    pCurHandle = FX_OpenFolder(m_FolderPaths[m_FolderPaths.GetSize() - 1]);
-    FX_HandleParentPath hpp;
-    hpp.pFileHandle = pCurHandle;
-    hpp.bsParentPath = m_FolderPaths[m_FolderPaths.GetSize() - 1];
-    m_FolderQueue.Add(hpp);
-  }
-  CFX_ByteString bsName;
-  FX_BOOL bFolder;
-  CFX_ByteString bsFolderSpearator =
-      CFX_ByteString::FromUnicode(CFX_WideString(FX_GetFolderSeparator()));
-  while (TRUE) {
-    if (!FX_GetNextFile(pCurHandle, bsName, bFolder)) {
-      FX_CloseFolder(pCurHandle);
-      m_FolderQueue.RemoveAt(m_FolderQueue.GetSize() - 1);
-      if (m_FolderQueue.GetSize() == 0) {
-        m_FolderPaths.RemoveAt(m_FolderPaths.GetSize() - 1);
-        if (m_FolderPaths.GetSize() == 0) {
-          return "";
-        } else {
-          goto Restart;
-        }
-      }
-      pCurHandle =
-          m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle;
-      continue;
-    }
-    if (bsName == "." || bsName == "..") {
-      continue;
-    }
-    if (bFolder) {
-      FX_HandleParentPath hpp;
-      hpp.bsParentPath =
-          m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
-          bsFolderSpearator + bsName;
-      hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath);
-      if (hpp.pFileHandle == NULL) {
-        continue;
-      }
-      m_FolderQueue.Add(hpp);
-      pCurHandle = hpp.pFileHandle;
-      continue;
-    }
-    bsName =
-        m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
-        bsFolderSpearator + bsName;
-    break;
-  }
-  return bsName;
-}
-FX_POSITION CFX_FontSourceEnum_File::GetStartPosition(void* pUserData) {
-  m_wsNext = GetNextFile().UTF8Decode();
-  if (0 == m_wsNext.GetLength()) {
-    return (FX_POSITION)0;
-  }
-  return (FX_POSITION)-1;
-}
-IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos,
-                                                 void* pUserData) {
-  IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext);
-  m_wsNext = GetNextFile().UTF8Decode();
-  pos = 0 != m_wsNext.GetLength() ? pAccess : NULL;
-  return (IFX_FileAccess*)pAccess;
-}
-IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum() {
-  return (IFX_FontSourceEnum*)new CFX_FontSourceEnum_File;
-}
-IFX_FontMgr* IFX_FontMgr::Create(IFX_FontSourceEnum* pFontEnum,
-                                 IFX_FontMgrDelegate* pDelegate,
-                                 void* pUserData) {
-  if (NULL == pFontEnum) {
-    return NULL;
-  }
-  CFX_FontMgrImp* pFontMgr =
-      new CFX_FontMgrImp(pFontEnum, pDelegate, pUserData);
-  if (pFontMgr->EnumFonts()) {
-    return pFontMgr;
-  }
-  delete pFontMgr;
-  return NULL;
-}
-CFX_FontMgrImp::CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum,
-                               IFX_FontMgrDelegate* pDelegate,
-                               void* pUserData)
-    : m_pFontSource(pFontEnum),
-      m_pDelegate(pDelegate),
-      m_pUserData(pUserData) {}
-
-FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() {
-  CFX_FontMapper* pFontMapper =
-      CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper();
-  if (!pFontMapper)
-    return FALSE;
-  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
-  if (!pSystemFontInfo)
-    return FALSE;
-  pSystemFontInfo->EnumFontList(pFontMapper);
-  for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
-    IFX_FileRead* pFontStream =
-        CreateFontStream(pFontMapper, pSystemFontInfo, i);
-    if (!pFontStream)
-      continue;
-    CFX_WideString wsFaceName =
-        CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str());
-    RegisterFaces(pFontStream, &wsFaceName);
-    pFontStream->Release();
-  }
-  if (m_InstalledFonts.GetSize() == 0)
-    return FALSE;
-  return TRUE;
-}
-FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() {
-  CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary();
-  FX_POSITION pos = m_pFontSource->GetStartPosition();
-  IFX_FileAccess* pFontSource = nullptr;
-  IFX_FileRead* pFontStream = nullptr;
-  while (pos) {
-    pFontSource = m_pFontSource->GetNext(pos);
-    pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly);
-    if (!pFontStream) {
-      pFontSource->Release();
-      continue;
-    }
-    RegisterFaces(pFontStream, nullptr);
-    pFontStream->Release();
-    pFontSource->Release();
-  }
-  if (m_InstalledFonts.GetSize() == 0)
-    return FALSE;
-  return TRUE;
-}
-FX_BOOL CFX_FontMgrImp::EnumFonts() {
-  if (EnumFontsFromFontMapper())
-    return TRUE;
-  return EnumFontsFromFiles();
-}
-void CFX_FontMgrImp::Release() {
-  for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) {
-    delete m_InstalledFonts[i];
-  }
-  FX_POSITION pos = m_Hash2CandidateList.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    CFX_FontDescriptorInfos* pDescs;
-    m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs);
-    if (NULL != pDescs) {
-      delete pDescs;
-    }
-  }
-  pos = m_Hash2Fonts.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    CFX_ArrayTemplate<IFX_Font*>* pFonts;
-    m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
-    if (NULL != pFonts) {
-      delete pFonts;
-    }
-  }
-  m_Hash2Fonts.RemoveAll();
-  pos = m_Hash2FileAccess.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    IFX_FileAccess* pFileAccess;
-    m_Hash2FileAccess.GetNextAssoc(pos, dwHash, pFileAccess);
-    if (NULL != pFileAccess) {
-      pFileAccess->Release();
-    }
-  }
-  pos = m_FileAccess2IFXFont.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    IFX_Font* pFont;
-    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont);
-    if (NULL != pFont) {
-      pFont->Release();
-    }
-  }
-  pos = m_IFXFont2FileRead.GetStartPosition();
-  while (pos) {
-    IFX_Font* pFont;
-    IFX_FileRead* pFileRead;
-    m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead);
-    pFileRead->Release();
-  }
-  delete this;
-}
-IFX_Font* CFX_FontMgrImp::GetDefFontByCodePage(FX_WORD wCodePage,
-                                               FX_DWORD dwFontStyles,
-                                               const FX_WCHAR* pszFontFamily) {
-  return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByCodePage(
-                                          this, wCodePage, dwFontStyles,
-                                          pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::GetDefFontByCharset(uint8_t nCharset,
-                                              FX_DWORD dwFontStyles,
-                                              const FX_WCHAR* pszFontFamily) {
-  return NULL == m_pDelegate ? NULL
-                             : m_pDelegate->GetDefFontByCharset(
-                                   this, nCharset, dwFontStyles, pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::GetDefFontByUnicode(FX_WCHAR wUnicode,
-                                              FX_DWORD dwFontStyles,
-                                              const FX_WCHAR* pszFontFamily) {
-  return NULL == m_pDelegate ? NULL
-                             : m_pDelegate->GetDefFontByUnicode(
-                                   this, wUnicode, dwFontStyles, pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(FX_WORD wLanguage,
-                                               FX_DWORD dwFontStyles,
-                                               const FX_WCHAR* pszFontFamily) {
-  return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByLanguage(
-                                          this, wLanguage, dwFontStyles,
-                                          pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::GetFontByCodePage(FX_WORD wCodePage,
-                                            FX_DWORD dwFontStyles,
-                                            const FX_WCHAR* pszFontFamily) {
-  CFX_ByteString bsHash;
-  bsHash.Format("%d, %d", wCodePage, dwFontStyles);
-  bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
-  FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
-  CFX_ArrayTemplate<IFX_Font*>* pFonts = NULL;
-  IFX_Font* pFont = NULL;
-  if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
-    if (NULL == pFonts) {
-      return NULL;
-    }
-    if (0 != pFonts->GetSize()) {
-      return pFonts->GetAt(0)->Retain();
-    }
-  }
-  if (!pFonts)
-    pFonts = new CFX_ArrayTemplate<IFX_Font*>;
-  m_Hash2Fonts.SetAt(dwHash, pFonts);
-  CFX_FontDescriptorInfos* sortedFonts = NULL;
-  if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
-    sortedFonts = new CFX_FontDescriptorInfos;
-    MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
-               CFX_WideString(pszFontFamily), 0);
-    m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
-  }
-  if (sortedFonts->GetSize() == 0) {
-    return NULL;
-  }
-  CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont;
-  if (pDesc->m_pFileAccess)
-    pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr);
-  else
-    pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
-  if (NULL != pFont) {
-    pFont->SetLogicalFontStyle(dwFontStyles);
-  }
-  pFonts->Add(pFont);
-  return pFont;
-}
-IFX_Font* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset,
-                                           FX_DWORD dwFontStyles,
-                                           const FX_WCHAR* pszFontFamily) {
-  return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
-                           pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode,
-                                           FX_DWORD dwFontStyles,
-                                           const FX_WCHAR* pszFontFamily) {
-  IFX_Font* pFont = nullptr;
-  if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont))
-    return nullptr;
-  const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode);
-  FX_WORD wCodePage = x ? x->wCodePage : 0xFFFF;
-  FX_WORD wBitField = x ? x->wBitField : 0x03E7;
-  CFX_ByteString bsHash;
-  if (wCodePage == 0xFFFF)
-    bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles);
-  else
-    bsHash.Format("%d, %d", wCodePage, dwFontStyles);
-  bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
-  FX_DWORD dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
-  CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr;
-  if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
-    if (!pFonts)
-      return nullptr;
-    for (int32_t i = 0; i < pFonts->GetSize(); ++i) {
-      if (VerifyUnicode(pFonts->GetAt(i), wUnicode))
-        return pFonts->GetAt(i)->Retain();
-    }
-  }
-  if (!pFonts)
-    pFonts = new CFX_ArrayTemplate<IFX_Font*>;
-  m_Hash2Fonts.SetAt(dwHash, pFonts);
-  CFX_FontDescriptorInfos* sortedFonts = nullptr;
-  if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
-    sortedFonts = new CFX_FontDescriptorInfos;
-    MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
-               CFX_WideString(pszFontFamily), wUnicode);
-    m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
-  }
-  for (int32_t i = 0; i < sortedFonts->GetSize(); ++i) {
-    CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont;
-    if (!VerifyUnicode(pDesc, wUnicode))
-      continue;
-    if (pDesc->m_pFileAccess)
-      pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr);
-    else
-      pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
-    if (!pFont)
-      continue;
-    pFont->SetLogicalFontStyle(dwFontStyles);
-    pFonts->Add(pFont);
-    return pFont;
-  }
-  if (!pszFontFamily)
-    m_FailedUnicodes2NULL.SetAt(wUnicode, nullptr);
-  return nullptr;
-}
-FX_BOOL CFX_FontMgrImp::VerifyUnicode(CFX_FontDescriptor* pDesc,
-                                      FX_WCHAR wcUnicode) {
-  IFX_FileRead* pFileRead = nullptr;
-  if (pDesc->m_pFileAccess)
-    pFileRead = pDesc->m_pFileAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
-  else
-    pFileRead = CreateFontStream(pDesc->m_wsFaceName.UTF8Encode());
-  if (!pFileRead)
-    return FALSE;
-  FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex);
-  FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE);
-  FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode);
-  pFileRead->Release();
-  if (!pFace)
-    return FALSE;
-  if (FXFT_Get_Face_External_Stream(pFace))
-    FXFT_Clear_Face_External_Stream(pFace);
-  FXFT_Done_Face(pFace);
-  return !retCharmap && retIndex;
-}
-FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) {
-  if (NULL == pFont) {
-    return FALSE;
-  }
-  FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace();
-  FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace);
-  if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) {
-    return FALSE;
-  }
-  if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) {
-    FXFT_Set_Charmap(pFace, charmap);
-    return FALSE;
-  }
-  return TRUE;
-}
-IFX_Font* CFX_FontMgrImp::GetFontByLanguage(FX_WORD wLanguage,
-                                            FX_DWORD dwFontStyles,
-                                            const FX_WCHAR* pszFontFamily) {
-  return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles,
-                           pszFontFamily);
-}
-IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer,
-                                   int32_t iLength,
-                                   int32_t iFaceIndex,
-                                   int32_t* pFaceCount) {
-  void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength};
-  FX_DWORD dwHash =
-      FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*));
-  IFX_FileAccess* pFontAccess = NULL;
-  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
-  }
-  if (NULL != pFontAccess) {
-    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
-  } else {
-    return NULL;
-  }
-}
-IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName,
-                                   int32_t iFaceIndex,
-                                   int32_t* pFaceCount) {
-  CFX_ByteString bsHash;
-  bsHash += CFX_WideString(pszFileName).UTF8Encode();
-  FX_DWORD dwHash =
-      FX_HashCode_String_GetA((const FX_CHAR*)bsHash, bsHash.GetLength());
-  IFX_FileAccess* pFontAccess = NULL;
-  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
-    pFontAccess = FX_CreateDefaultFileAccess(pszFileName);
-    m_Hash2FileAccess.SetAt(dwHash, pFontAccess);
-  }
-  if (NULL != pFontAccess) {
-    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
-  } else {
-    return NULL;
-  }
-}
-IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream,
-                                   int32_t iFaceIndex,
-                                   int32_t* pFaceCount,
-                                   FX_BOOL bSaveStream) {
-  void* Hash[1] = {(void*)(uintptr_t)pFontStream};
-  FX_DWORD dwHash =
-      FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*));
-  IFX_FileAccess* pFontAccess = NULL;
-  if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
-  }
-  if (NULL != pFontAccess) {
-    return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
-  } else {
-    return NULL;
-  }
-}
-IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess,
-                                   int32_t iFaceIndex,
-                                   int32_t* pFaceCount,
-                                   FX_BOOL bWantCache) {
-  FX_DWORD dwHash = 0;
-  IFX_Font* pFont = NULL;
-  if (bWantCache) {
-    CFX_ByteString bsHash;
-    bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex);
-    dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
-    if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) {
-      if (NULL != pFont) {
-        if (NULL != pFaceCount) {
-          *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
-        }
-        return pFont->Retain();
-      }
-    }
-  }
-  CFX_Font* pInternalFont = new CFX_Font;
-  IFX_FileRead* pFontStream =
-      pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
-  if (NULL == pFontStream) {
-    delete pInternalFont;
-    return NULL;
-  }
-  if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
-    delete pInternalFont;
-    pFontStream->Release();
-    return NULL;
-  }
-  pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE);
-  if (NULL == pFont) {
-    delete pInternalFont;
-    pFontStream->Release();
-    return NULL;
-  }
-  if (bWantCache) {
-    m_FileAccess2IFXFont.SetAt(dwHash, pFont);
-  }
-  m_IFXFont2FileRead.SetAt(pFont, pFontStream);
-  if (NULL != pFaceCount) {
-    *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
-  }
-  return pFont;
-}
-IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName,
-                                   int32_t iFaceIndex,
-                                   int32_t* pFaceCount) {
-  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
-  if (!pFontMapper)
-    return nullptr;
-  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
-  if (!pSystemFontInfo)
-    return nullptr;
-  IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode());
-  if (!pFontStream)
-    return nullptr;
-  if (!LoadFace(pFontStream, 0)) {
-    pFontStream->Release();
-    return nullptr;
-  }
-  CFX_Font* pInternalFont = new CFX_Font();
-  if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
-    pFontStream->Release();
-    return nullptr;
-  }
-  IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE);
-  if (!pFont) {
-    pFontStream->Release();
-    return nullptr;
-  }
-  m_IFXFont2FileRead.SetAt(pFont, pFontStream);
-  if (pFaceCount)
-    *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
-  return pFont;
-}
-extern "C" {
-unsigned long _ftStreamRead(FXFT_Stream stream,
-                            unsigned long offset,
-                            unsigned char* buffer,
-                            unsigned long count) {
-  if (count == 0) {
-    return 0;
-  }
-  IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
-  int res = pFile->ReadBlock(buffer, offset, count);
-  if (res) {
-    return count;
-  }
-  return 0;
-}
-void _ftStreamClose(FXFT_Stream stream) {}
-};
-
-FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
-                                   int32_t iFaceIndex) {
-  if (!pFontStream)
-    return nullptr;
-
-  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-  pFontMgr->InitFTLibrary();
-  FXFT_Library library = pFontMgr->GetFTLibrary();
-  if (!library)
-    return nullptr;
-
-  FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1);
-  FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec));
-  ftStream->base = NULL;
-  ftStream->descriptor.pointer = pFontStream;
-  ftStream->pos = 0;
-  ftStream->size = (unsigned long)pFontStream->GetSize();
-  ftStream->read = _ftStreamRead;
-  ftStream->close = _ftStreamClose;
-
-  FXFT_Open_Args ftArgs;
-  FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args));
-  ftArgs.flags |= FT_OPEN_STREAM;
-  ftArgs.stream = ftStream;
-
-  FXFT_Face pFace = NULL;
-  if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) {
-    FX_Free(ftStream);
-    return nullptr;
-  }
-
-  FXFT_Set_Pixel_Sizes(pFace, 0, 64);
-  return pFace;
-}
-
-IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
-    CFX_FontMapper* pFontMapper,
-    IFX_SystemFontInfo* pSystemFontInfo,
-    FX_DWORD index) {
-  int iExact = 0;
-  void* hFont = pSystemFontInfo->MapFont(
-      0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact);
-  if (!hFont)
-    return nullptr;
-  FX_DWORD dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0);
-  if (dwFileSize == 0)
-    return nullptr;
-  uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1);
-  dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize);
-  return FX_CreateMemoryStream(pBuffer, dwFileSize, TRUE);
-}
-
-IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
-    const CFX_ByteString& bsFaceName) {
-  CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
-  if (!pFontMapper)
-    return nullptr;
-  IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
-  if (!pSystemFontInfo)
-    return nullptr;
-  pSystemFontInfo->EnumFontList(pFontMapper);
-  for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
-    if (pFontMapper->GetFaceName(i) == bsFaceName)
-      return CreateFontStream(pFontMapper, pSystemFontInfo, i);
-  }
-  return nullptr;
-}
-int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
-                                   FX_WORD wCodePage,
-                                   FX_DWORD dwFontStyles,
-                                   const CFX_WideString& FontName,
-                                   FX_WCHAR wcUnicode) {
-  MatchedFonts.RemoveAll();
-  CFX_WideString wsNormalizedFontName = FontName;
-  static const int32_t nMax = 0xffff;
-  CFX_FontDescriptor* pFont = NULL;
-  int32_t nCount = m_InstalledFonts.GetSize();
-  for (int32_t i = 0; i < nCount; i++) {
-    pFont = m_InstalledFonts[i];
-    int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles,
-                                   wsNormalizedFontName, wcUnicode);
-    if (nPenalty >= 0xFFFF) {
-      continue;
-    }
-    FX_FontDescriptorInfo FontInfo;
-    FontInfo.pFont = pFont;
-    FontInfo.nPenalty = nPenalty;
-    MatchedFonts.Add(FontInfo);
-    if (MatchedFonts.GetSize() == nMax) {
-      break;
-    }
-  }
-  if (MatchedFonts.GetSize() == 0) {
-    return 0;
-  }
-  CFX_SSortTemplate<FX_FontDescriptorInfo> ssort;
-  ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize());
-  return MatchedFonts.GetSize();
-}
-struct FX_BitCodePage {
-  FX_WORD wBit;
-  FX_WORD wCodePage;
-};
-static const FX_BitCodePage g_Bit2CodePage[] = {
-    {0, 1252}, {1, 1250}, {2, 1251}, {3, 1253},  {4, 1254}, {5, 1255},
-    {6, 1256}, {7, 1257}, {8, 1258}, {9, 0},     {10, 0},   {11, 0},
-    {12, 0},   {13, 0},   {14, 0},   {15, 0},    {16, 874}, {17, 932},
-    {18, 936}, {19, 949}, {20, 950}, {21, 1361}, {22, 0},   {23, 0},
-    {24, 0},   {25, 0},   {26, 0},   {27, 0},    {28, 0},   {29, 0},
-    {30, 0},   {31, 0},   {32, 0},   {33, 0},    {34, 0},   {35, 0},
-    {36, 0},   {37, 0},   {38, 0},   {39, 0},    {40, 0},   {41, 0},
-    {42, 0},   {43, 0},   {44, 0},   {45, 0},    {46, 0},   {47, 0},
-    {48, 869}, {49, 866}, {50, 865}, {51, 864},  {52, 863}, {53, 862},
-    {54, 861}, {55, 860}, {56, 857}, {57, 855},  {58, 852}, {59, 775},
-    {60, 737}, {61, 708}, {62, 850}, {63, 437},
-};
-
-FX_WORD FX_GetCodePageBit(FX_WORD wCodePage) {
-  for (size_t i = 0; i < FX_ArraySize(g_Bit2CodePage); ++i) {
-    if (g_Bit2CodePage[i].wCodePage == wCodePage)
-      return g_Bit2CodePage[i].wBit;
-  }
-  return (FX_WORD)-1;
-}
-
-FX_WORD FX_GetUnicodeBit(FX_WCHAR wcUnicode) {
-  const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wcUnicode);
-  return x ? x->wBitField : 999;
-}
-
-int32_t CFX_FontMgrImp::CalcPenalty(CFX_FontDescriptor* pInstalled,
-                                    FX_WORD wCodePage,
-                                    FX_DWORD dwFontStyles,
-                                    const CFX_WideString& FontName,
-                                    FX_WCHAR wcUnicode) {
-  int32_t nPenalty = 30000;
-  if (0 != FontName.GetLength()) {
-    if (FontName != pInstalled->m_wsFaceName) {
-      int32_t i;
-      for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) {
-        if (pInstalled->m_wsFamilyNames[i] == FontName) {
-          break;
-        }
-      }
-      if (i == pInstalled->m_wsFamilyNames.GetSize()) {
-        nPenalty += 0xFFFF;
-      } else {
-        nPenalty -= 28000;
-      }
-    } else {
-      nPenalty -= 30000;
-    }
-    if (30000 == nPenalty &&
-        0 == IsPartName(pInstalled->m_wsFaceName, FontName)) {
-      int32_t i;
-      for (i = 0; i < pInstalled->m_wsFamilyNames.GetSize(); i++) {
-        if (0 != IsPartName(pInstalled->m_wsFamilyNames[i], FontName)) {
-          break;
-        }
-      }
-      if (i == pInstalled->m_wsFamilyNames.GetSize()) {
-        nPenalty += 0xFFFF;
-      } else {
-        nPenalty -= 26000;
-      }
-    } else {
-      nPenalty -= 27000;
-    }
-  }
-  FX_DWORD dwStyleMask = pInstalled->m_dwFontStyles ^ dwFontStyles;
-  if (dwStyleMask & FX_FONTSTYLE_Bold) {
-    nPenalty += 4500;
-  }
-  if (dwStyleMask & FX_FONTSTYLE_FixedPitch) {
-    nPenalty += 10000;
-  }
-  if (dwStyleMask & FX_FONTSTYLE_Italic) {
-    nPenalty += 10000;
-  }
-  if (dwStyleMask & FX_FONTSTYLE_Serif) {
-    nPenalty += 500;
-  }
-  if (dwStyleMask & FX_FONTSTYLE_Symbolic) {
-    nPenalty += 0xFFFF;
-  }
-  if (nPenalty >= 0xFFFF) {
-    return 0xFFFF;
-  }
-  FX_WORD wBit =
-      ((0 == wCodePage || 0xFFFF == wCodePage) ? (FX_WORD)-1
-                                               : FX_GetCodePageBit(wCodePage));
-  if (wBit != (FX_WORD)-1) {
-    FXSYS_assert(wBit < 64);
-    if (0 == (pInstalled->m_dwCsb[wBit / 32] & (1 << (wBit % 32)))) {
-      nPenalty += 0xFFFF;
-    } else {
-      nPenalty -= 60000;
-    }
-  }
-  wBit =
-      ((0 == wcUnicode || 0xFFFE == wcUnicode) ? (FX_WORD)999
-                                               : FX_GetUnicodeBit(wcUnicode));
-  if (wBit != (FX_WORD)999) {
-    FXSYS_assert(wBit < 128);
-    if (0 == (pInstalled->m_dwUsb[wBit / 32] & (1 << (wBit % 32)))) {
-      nPenalty += 0xFFFF;
-    } else {
-      nPenalty -= 60000;
-    }
-  }
-  return nPenalty;
-}
-void CFX_FontMgrImp::ClearFontCache() {
-  FX_POSITION pos = m_Hash2CandidateList.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    CFX_FontDescriptorInfos* pDescs;
-    m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs);
-    if (NULL != pDescs) {
-      delete pDescs;
-    }
-  }
-  pos = m_FileAccess2IFXFont.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    IFX_Font* pFont;
-    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont);
-    if (NULL != pFont) {
-      pFont->Release();
-    }
-  }
-  pos = m_IFXFont2FileRead.GetStartPosition();
-  while (pos) {
-    IFX_Font* pFont;
-    IFX_FileRead* pFileRead;
-    m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead);
-    pFileRead->Release();
-  }
-}
-void CFX_FontMgrImp::RemoveFont(IFX_Font* pEFont) {
-  if (NULL == pEFont) {
-    return;
-  }
-  IFX_FileRead* pFileRead;
-  if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) {
-    pFileRead->Release();
-    m_IFXFont2FileRead.RemoveKey(pEFont);
-  }
-  FX_POSITION pos;
-  pos = m_FileAccess2IFXFont.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    IFX_Font* pCFont;
-    m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pCFont);
-    if (pCFont == pEFont) {
-      m_FileAccess2IFXFont.RemoveKey(dwHash);
-      break;
-    }
-  }
-  pos = m_Hash2Fonts.GetStartPosition();
-  while (pos) {
-    FX_DWORD dwHash;
-    CFX_ArrayTemplate<IFX_Font*>* pFonts;
-    m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
-    if (NULL != pFonts) {
-      for (int32_t i = 0; i < pFonts->GetSize(); i++) {
-        if (pFonts->GetAt(i) == pEFont) {
-          pFonts->SetAt(i, NULL);
-        }
-      }
-    } else {
-      m_Hash2Fonts.RemoveKey(dwHash);
-    }
-  }
-}
-void CFX_FontMgrImp::RegisterFace(FXFT_Face pFace,
-                                  CFX_FontDescriptors& Fonts,
-                                  const CFX_WideString* pFaceName,
-                                  IFX_FileAccess* pFontAccess) {
-  if (0 == (pFace->face_flags & FT_FACE_FLAG_SCALABLE)) {
-    return;
-  }
-  CFX_FontDescriptor* pFont = new CFX_FontDescriptor;
-  pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0;
-  pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0;
-  pFont->m_dwFontStyles |= GetFlags(pFace);
-  CFX_WordArray Charsets;
-  GetCharsets(pFace, Charsets);
-  GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb);
-  unsigned long nLength = 0;
-  FT_ULong dwTag;
-  uint8_t* pTable = NULL;
-  FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e');
-  unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, NULL, &nLength);
-  if (0 == error && 0 != nLength) {
-    pTable = FX_Alloc(uint8_t, nLength);
-    error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, NULL);
-    if (0 != error) {
-      FX_Free(pTable);
-      pTable = NULL;
-    }
-  }
-  GetNames(pTable, pFont->m_wsFamilyNames);
-  if (NULL != pTable) {
-    FX_Free(pTable);
-  }
-  pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode());
-  if (pFaceName) {
-    pFont->m_wsFaceName = *pFaceName;
-  } else {
-    pFont->m_wsFaceName =
-        CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
-  }
-  pFont->m_nFaceIndex = pFace->face_index;
-  if (pFontAccess)
-    pFont->m_pFileAccess = pFontAccess->Retain();
-  else
-    pFont->m_pFileAccess = nullptr;
-  Fonts.Add(pFont);
-}
-void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream,
-                                   const CFX_WideString* pFaceName) {
-  int32_t index = 0;
-  int32_t num_faces = 0;
-  do {
-    FXFT_Face pFace = LoadFace(pFontStream, index++);
-    if (!pFace)
-      continue;
-    // All faces keep number of faces. It can be retrieved from any one face.
-    if (!num_faces)
-      num_faces = pFace->num_faces;
-    RegisterFace(pFace, m_InstalledFonts, pFaceName, nullptr);
-    if (FXFT_Get_Face_External_Stream(pFace))
-      FXFT_Clear_Face_External_Stream(pFace);
-    FXFT_Done_Face(pFace);
-  } while (index < num_faces);
-}
-FX_DWORD CFX_FontMgrImp::GetFlags(FXFT_Face pFace) {
-  FX_DWORD flag = 0;
-  if (FT_IS_FIXED_WIDTH(pFace)) {
-    flag |= FX_FONTSTYLE_FixedPitch;
-  }
-  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
-  if (!pOS2) {
-    return flag;
-  }
-  if (pOS2->ulCodePageRange1 & (1 << 31)) {
-    flag |= FX_FONTSTYLE_Symbolic;
-  }
-  if (pOS2->panose[0] == 2) {
-    uint8_t uSerif = pOS2->panose[1];
-    if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {
-      flag |= FX_FONTSTYLE_Serif;
-    }
-  }
-  return flag;
-}
-#define GetUInt8(p) ((uint8_t)((p)[0]))
-#define GetUInt16(p) ((uint16_t)((p)[0] << 8 | (p)[1]))
-#define GetUInt32(p) \
-  ((uint32_t)((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3]))
-void CFX_FontMgrImp::GetNames(const uint8_t* name_table,
-                              CFX_WideStringArray& Names) {
-  if (NULL == name_table) {
-    return;
-  }
-  uint8_t* lpTable = (uint8_t*)name_table;
-  CFX_WideString wsFamily;
-  uint8_t* sp = lpTable + 2;
-  uint8_t* lpNameRecord = lpTable + 6;
-  uint16_t nNameCount = GetUInt16(sp);
-  uint8_t* lpStr = lpTable + GetUInt16(sp + 2);
-  for (uint16_t j = 0; j < nNameCount; j++) {
-    uint16_t nNameID = GetUInt16(lpNameRecord + j * 12 + 6);
-    if (nNameID != 1) {
-      continue;
-    }
-    uint16_t nPlatformID = GetUInt16(lpNameRecord + j * 12 + 0);
-    uint16_t nNameLength = GetUInt16(lpNameRecord + j * 12 + 8);
-    uint16_t nNameOffset = GetUInt16(lpNameRecord + j * 12 + 10);
-    wsFamily.Empty();
-    if (nPlatformID != 1) {
-      for (uint16_t k = 0; k < nNameLength / 2; k++) {
-        FX_WCHAR wcTemp = GetUInt16(lpStr + nNameOffset + k * 2);
-        wsFamily += wcTemp;
-      }
-      Names.Add(wsFamily);
-    } else {
-      for (uint16_t k = 0; k < nNameLength; k++) {
-        FX_WCHAR wcTemp = GetUInt8(lpStr + nNameOffset + k);
-        wsFamily += wcTemp;
-      }
-      Names.Add(wsFamily);
-    }
-  }
-}
-#undef GetUInt8
-#undef GetUInt16
-#undef GetUInt32
-struct FX_BIT2CHARSET {
-  FX_WORD wBit;
-  FX_WORD wCharset;
-};
-FX_BIT2CHARSET g_FX_Bit2Charset1[16] = {
-    {1 << 0, FX_CHARSET_ANSI},
-    {1 << 1, FX_CHARSET_MSWin_EasterEuropean},
-    {1 << 2, FX_CHARSET_MSWin_Cyrillic},
-    {1 << 3, FX_CHARSET_MSWin_Greek},
-    {1 << 4, FX_CHARSET_MSWin_Turkish},
-    {1 << 5, FX_CHARSET_MSWin_Hebrew},
-    {1 << 6, FX_CHARSET_MSWin_Arabic},
-    {1 << 7, FX_CHARSET_MSWin_Baltic},
-    {1 << 8, FX_CHARSET_MSWin_Vietnamese},
-    {1 << 9, FX_CHARSET_Default},
-    {1 << 10, FX_CHARSET_Default},
-    {1 << 11, FX_CHARSET_Default},
-    {1 << 12, FX_CHARSET_Default},
-    {1 << 13, FX_CHARSET_Default},
-    {1 << 14, FX_CHARSET_Default},
-    {1 << 15, FX_CHARSET_Default},
-};
-FX_BIT2CHARSET g_FX_Bit2Charset2[16] = {
-    {1 << 0, FX_CHARSET_Thai},
-    {1 << 1, FX_CHARSET_ShiftJIS},
-    {1 << 2, FX_CHARSET_ChineseSimplified},
-    {1 << 3, FX_CHARSET_Korean},
-    {1 << 4, FX_CHARSET_ChineseTriditional},
-    {1 << 5, FX_CHARSET_Johab},
-    {1 << 6, FX_CHARSET_Default},
-    {1 << 7, FX_CHARSET_Default},
-    {1 << 8, FX_CHARSET_Default},
-    {1 << 9, FX_CHARSET_Default},
-    {1 << 10, FX_CHARSET_Default},
-    {1 << 11, FX_CHARSET_Default},
-    {1 << 12, FX_CHARSET_Default},
-    {1 << 13, FX_CHARSET_Default},
-    {1 << 14, FX_CHARSET_OEM},
-    {1 << 15, FX_CHARSET_Symbol},
-};
-FX_BIT2CHARSET g_FX_Bit2Charset3[16] = {
-    {1 << 0, FX_CHARSET_Default},  {1 << 1, FX_CHARSET_Default},
-    {1 << 2, FX_CHARSET_Default},  {1 << 3, FX_CHARSET_Default},
-    {1 << 4, FX_CHARSET_Default},  {1 << 5, FX_CHARSET_Default},
-    {1 << 6, FX_CHARSET_Default},  {1 << 7, FX_CHARSET_Default},
-    {1 << 8, FX_CHARSET_Default},  {1 << 9, FX_CHARSET_Default},
-    {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default},
-    {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default},
-    {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_Default},
-};
-FX_BIT2CHARSET g_FX_Bit2Charset4[16] = {
-    {1 << 0, FX_CHARSET_Default},  {1 << 1, FX_CHARSET_Default},
-    {1 << 2, FX_CHARSET_Default},  {1 << 3, FX_CHARSET_Default},
-    {1 << 4, FX_CHARSET_Default},  {1 << 5, FX_CHARSET_Default},
-    {1 << 6, FX_CHARSET_Default},  {1 << 7, FX_CHARSET_Default},
-    {1 << 8, FX_CHARSET_Default},  {1 << 9, FX_CHARSET_Default},
-    {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default},
-    {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default},
-    {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_US},
-};
-#define CODEPAGERANGE_IMPLEMENT(n)                   \
-  for (int32_t i = 0; i < 16; i++) {                 \
-    if ((a##n & g_FX_Bit2Charset##n[i].wBit) != 0) { \
-      Charsets.Add(g_FX_Bit2Charset##n[i].wCharset); \
-    }                                                \
-  }
-void CFX_FontMgrImp::GetCharsets(FXFT_Face pFace, CFX_WordArray& Charsets) {
-  Charsets.RemoveAll();
-  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
-  if (NULL != pOS2) {
-    FX_WORD a1, a2, a3, a4;
-    a1 = pOS2->ulCodePageRange1 & 0x0000ffff;
-    CODEPAGERANGE_IMPLEMENT(1);
-    a2 = (pOS2->ulCodePageRange1 >> 16) & 0x0000ffff;
-    CODEPAGERANGE_IMPLEMENT(2);
-    a3 = pOS2->ulCodePageRange2 & 0x0000ffff;
-    CODEPAGERANGE_IMPLEMENT(3);
-    a4 = (pOS2->ulCodePageRange2 >> 16) & 0x0000ffff;
-    CODEPAGERANGE_IMPLEMENT(4);
-  } else {
-    Charsets.Add(FX_CHARSET_Default);
-  }
-}
-#undef CODEPAGERANGE_IMPLEMENT
-void CFX_FontMgrImp::GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB) {
-  TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
-  if (NULL != pOS2) {
-    USB[0] = pOS2->ulUnicodeRange1;
-    USB[1] = pOS2->ulUnicodeRange2;
-    USB[2] = pOS2->ulUnicodeRange3;
-    USB[3] = pOS2->ulUnicodeRange4;
-    CSB[0] = pOS2->ulCodePageRange1;
-    CSB[1] = pOS2->ulCodePageRange2;
-  } else {
-    USB[0] = 0;
-    USB[1] = 0;
-    USB[2] = 0;
-    USB[3] = 0;
-    CSB[0] = 0;
-    CSB[1] = 0;
-  }
-}
-int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1,
-                                   const CFX_WideString& Name2) {
-  if (Name1.Find((const FX_WCHAR*)Name2) != -1) {
-    return 1;
-  }
-  return 0;
-}
-#endif
diff --git a/xfa/src/fgas/font/fgas_stdfontmgr.h b/xfa/src/fgas/font/fgas_stdfontmgr.h
deleted file mode 100644
index cf16033..0000000
--- a/xfa/src/fgas/font/fgas_stdfontmgr.h
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_FONT_FGAS_STDFONTMGR_H_
-#define XFA_SRC_FGAS_FONT_FGAS_STDFONTMGR_H_
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "core/include/fxge/fx_freetype.h"
-#include "core/include/fxge/fx_ge.h"
-#include "third_party/freetype/include/freetype/fttypes.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-int32_t FX_GetSimilarValue(FX_LPCFONTDESCRIPTOR pFont, FX_DWORD dwFontStyles);
-FX_LPCFONTDESCRIPTOR FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
-                                       const CFX_FontDescriptors& fonts,
-                                       void* pUserData);
-
-class CFX_StdFontMgrImp : public IFX_FontMgr {
- public:
-  CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator,
-                    FX_LPMatchFont pMatcher,
-                    void* pUserData);
-  ~CFX_StdFontMgrImp();
-  virtual void Release() { delete this; }
-  virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage,
-                                         FX_DWORD dwFontStyles,
-                                         const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByCharset(uint8_t nCharset,
-                                        FX_DWORD dwFontStyles,
-                                        const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode,
-                                        FX_DWORD dwFontStyles,
-                                        const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage,
-                                         FX_DWORD dwFontStyles,
-                                         const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage = 0xFFFF);
-  virtual IFX_Font* LoadFont(const uint8_t* pBuffer, int32_t iLength);
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName);
-  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
-                             const FX_WCHAR* pszFontAlias = NULL,
-                             FX_DWORD dwFontStyles = 0,
-                             FX_WORD wCodePage = 0,
-                             FX_BOOL bSaveStream = FALSE);
-  virtual IFX_Font* LoadFont(IFX_Font* pSrcFont,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage = 0xFFFF);
-  virtual void ClearFontCache();
-  virtual void RemoveFont(IFX_Font* pFont);
-
- protected:
-  FX_LPMatchFont m_pMatcher;
-  FX_LPEnumAllFonts m_pEnumerator;
-  CFX_FontDescriptors m_FontFaces;
-  CFX_PtrArray m_Fonts;
-  CFX_MapPtrToPtr m_CPFonts;
-  CFX_MapPtrToPtr m_FamilyFonts;
-  CFX_MapPtrToPtr m_UnicodeFonts;
-  CFX_MapPtrToPtr m_BufferFonts;
-  CFX_MapPtrToPtr m_FileFonts;
-  CFX_MapPtrToPtr m_StreamFonts;
-  CFX_MapPtrToPtr m_DeriveFonts;
-  void* m_pUserData;
-  void RemoveFont(CFX_MapPtrToPtr& fontMap, IFX_Font* pFont);
-  FX_LPCFONTDESCRIPTOR FindFont(const FX_WCHAR* pszFontFamily,
-                                FX_DWORD dwFontStyles,
-                                FX_DWORD dwMatchFlags,
-                                FX_WORD wCodePage,
-                                FX_DWORD dwUSB = 999,
-                                FX_WCHAR wUnicode = 0);
-  IFX_Font* GetFont(FX_LPCFONTDESCRIPTOR pFD, FX_DWORD dwFontStyles);
-};
-FX_DWORD FX_GetGdiFontStyles(const LOGFONTW& lf);
-
-#else
-
-class CFX_FontDescriptor {
- public:
-  CFX_FontDescriptor()
-      : m_pFileAccess(NULL), m_nFaceIndex(0), m_dwFontStyles(0) {
-    m_dwUsb[0] = m_dwUsb[1] = m_dwUsb[2] = m_dwUsb[3] = 0;
-    m_dwCsb[0] = m_dwCsb[1] = 0;
-  }
-  ~CFX_FontDescriptor() {
-    if (NULL != m_pFileAccess) {
-      m_pFileAccess->Release();
-    }
-  }
-  IFX_FileAccess* m_pFileAccess;
-  int32_t m_nFaceIndex;
-  CFX_WideString m_wsFaceName;
-  CFX_WideStringArray m_wsFamilyNames;
-  FX_DWORD m_dwFontStyles;
-  FX_DWORD m_dwUsb[4];
-  FX_DWORD m_dwCsb[2];
-};
-typedef CFX_ArrayTemplate<CFX_FontDescriptor*> CFX_FontDescriptors;
-
-struct FX_FontDescriptorInfo {
- public:
-  CFX_FontDescriptor* pFont;
-  int32_t nPenalty;
-
-  bool operator>(const FX_FontDescriptorInfo& other) const {
-    return nPenalty > other.nPenalty;
-  }
-  bool operator<(const FX_FontDescriptorInfo& other) const {
-    return nPenalty < other.nPenalty;
-  }
-  bool operator==(const FX_FontDescriptorInfo& other) const {
-    return nPenalty == other.nPenalty;
-  }
-};
-typedef CFX_ArrayTemplate<FX_FontDescriptorInfo> CFX_FontDescriptorInfos;
-
-struct FX_HandleParentPath {
-  FX_HandleParentPath() {}
-  FX_HandleParentPath(const FX_HandleParentPath& x) {
-    pFileHandle = x.pFileHandle;
-    bsParentPath = x.bsParentPath;
-  }
-  void* pFileHandle;
-  CFX_ByteString bsParentPath;
-};
-
-class CFX_FontSourceEnum_File : public IFX_FontSourceEnum {
- public:
-  CFX_FontSourceEnum_File();
-  virtual void Release() { delete this; }
-  virtual FX_POSITION GetStartPosition(void* pUserData = NULL);
-  virtual IFX_FileAccess* GetNext(FX_POSITION& pos, void* pUserData = NULL);
-
- private:
-  CFX_ByteString GetNextFile();
-  CFX_WideString m_wsNext;
-  CFX_ObjectArray<FX_HandleParentPath> m_FolderQueue;
-  CFX_ByteStringArray m_FolderPaths;
-};
-typedef CFX_MapPtrTemplate<FX_DWORD, IFX_FileAccess*> CFX_HashFileMap;
-typedef CFX_MapPtrTemplate<FX_DWORD, IFX_Font*> CFX_HashFontMap;
-typedef CFX_MapPtrTemplate<FX_DWORD, CFX_FontDescriptorInfos*>
-    CFX_HashFontDescsMap;
-typedef CFX_MapPtrTemplate<FX_DWORD, CFX_ArrayTemplate<IFX_Font*>*>
-    CFX_HashFontsMap;
-typedef CFX_MapPtrTemplate<FX_WCHAR, IFX_Font*> CFX_UnicodeFontMap;
-typedef CFX_MapPtrTemplate<IFX_FileAccess*, CFX_ArrayTemplate<IFX_Font*>*>
-    CFX_FileFontMap;
-typedef CFX_MapPtrTemplate<IFX_Font*, IFX_FileRead*> CFX_FonStreamtMap;
-
-class CFX_FontMgrImp : public IFX_FontMgr {
- public:
-  CFX_FontMgrImp(IFX_FontSourceEnum* pFontEnum,
-                 IFX_FontMgrDelegate* pDelegate = NULL,
-                 void* pUserData = NULL);
-  virtual void Release();
-  virtual IFX_Font* GetDefFontByCodePage(FX_WORD wCodePage,
-                                         FX_DWORD dwFontStyles,
-                                         const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByCharset(uint8_t nCharset,
-                                        FX_DWORD dwFontStyles,
-                                        const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByUnicode(FX_WCHAR wUnicode,
-                                        FX_DWORD dwFontStyles,
-                                        const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetDefFontByLanguage(FX_WORD wLanguage,
-                                         FX_DWORD dwFontStyles,
-                                         const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage,
-                                      FX_DWORD dwFontStyles,
-                                      const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetFontByCharset(uint8_t nCharset,
-                                     FX_DWORD dwFontStyles,
-                                     const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode,
-                                     FX_DWORD dwFontStyles,
-                                     const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage,
-                                      FX_DWORD dwFontStyles,
-                                      const FX_WCHAR* pszFontFamily = NULL);
-  virtual IFX_Font* LoadFont(const uint8_t* pBuffer,
-                             int32_t iLength,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount);
-  virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount);
-  virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount,
-                             FX_BOOL bSaveStream = FALSE);
-  virtual IFX_Font* LoadFont(const CFX_WideString& wsFaceName,
-                             int32_t iFaceIndex,
-                             int32_t* pFaceCount);
-  virtual void ClearFontCache();
-  virtual void RemoveFont(IFX_Font* pFont);
-  FX_BOOL EnumFonts();
-  FX_BOOL EnumFontsFromFontMapper();
-  FX_BOOL EnumFontsFromFiles();
-
- protected:
-  void RegisterFace(FXFT_Face pFace,
-                    CFX_FontDescriptors& Fonts,
-                    const CFX_WideString* pFaceName,
-                    IFX_FileAccess* pFontAccess);
-  void RegisterFaces(IFX_FileRead* pFontStream,
-                     const CFX_WideString* pFaceName);
-  void GetNames(const uint8_t* name_table, CFX_WideStringArray& Names);
-  void GetCharsets(FXFT_Face pFace, CFX_WordArray& Charsets);
-  void GetUSBCSB(FXFT_Face pFace, FX_DWORD* USB, FX_DWORD* CSB);
-  FX_DWORD GetFlags(FXFT_Face pFace);
-  CFX_FontDescriptors m_InstalledFonts;
-  FX_BOOL VerifyUnicode(CFX_FontDescriptor* pDesc, FX_WCHAR wcUnicode);
-  FX_BOOL VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode);
-  int32_t IsPartName(const CFX_WideString& Name1, const CFX_WideString& Name2);
-  int32_t MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
-                     FX_WORD wCodePage,
-                     FX_DWORD dwFontStyles,
-                     const CFX_WideString& FontName,
-                     FX_WCHAR wcUnicode = 0xFFFE);
-  int32_t CalcPenalty(CFX_FontDescriptor* pInstalled,
-                      FX_WORD wCodePage,
-                      FX_DWORD dwFontStyles,
-                      const CFX_WideString& FontName,
-                      FX_WCHAR wcUnicode = 0xFFFE);
-  IFX_Font* LoadFont(IFX_FileAccess* pFontAccess,
-                     int32_t iFaceIndex,
-                     int32_t* pFaceCount,
-                     FX_BOOL bWantCache = FALSE);
-  FXFT_Face LoadFace(IFX_FileRead* pFontStream, int32_t iFaceIndex);
-  IFX_FileRead* CreateFontStream(CFX_FontMapper* pFontMapper,
-                                 IFX_SystemFontInfo* pSystemFontInfo,
-                                 FX_DWORD index);
-  IFX_FileRead* CreateFontStream(const CFX_ByteString& bsFaceName);
-  CFX_HashFontDescsMap m_Hash2CandidateList;
-  CFX_HashFontsMap m_Hash2Fonts;
-  CFX_HashFileMap m_Hash2FileAccess;
-  CFX_HashFontMap m_FileAccess2IFXFont;
-  CFX_FonStreamtMap m_IFXFont2FileRead;
-  CFX_UnicodeFontMap m_FailedUnicodes2NULL;
-  IFX_FontSourceEnum* m_pFontSource;
-  IFX_FontMgrDelegate* m_pDelegate;
-  void* m_pUserData;
-};
-#endif
-
-#endif  // XFA_SRC_FGAS_FONT_FGAS_STDFONTMGR_H_
diff --git a/xfa/src/fgas/layout/fgas_linebreak.cpp b/xfa/src/fgas/layout/fgas_linebreak.cpp
deleted file mode 100644
index b43b800..0000000
--- a/xfa/src/fgas/layout/fgas_linebreak.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/layout/fgas_linebreak.h"
-
-#include "core/include/fxcrt/fx_ucd.h"
-
-const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32] = {
-    {FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBPB, FX_LBPB, FX_LBPB, FX_LBCP, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBPB, FX_LBPB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBPB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBPB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBIB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBIB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBIB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBIB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBIB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBDB, FX_LBPB,
-     FX_LBDB, FX_LBIB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBPB, FX_LBPB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBPB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBDB, FX_LBPB, FX_LBIB, FX_LBDB, FX_LBIB, FX_LBPB, FX_LBPB, FX_LBPB,
-     FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBDB, FX_LBIB, FX_LBIB,
-     FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
-     FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-    {FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
-     FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-};
-
-void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
-                              FX_LINEBREAKTYPE* pBrkType,
-                              int32_t iLength) {
-  if (iLength < 2) {
-    return;
-  }
-  FX_DWORD dwCur, dwNext;
-  FX_WCHAR wch;
-  wch = *pwsText++;
-  dwCur = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
-  iLength--;
-  for (int32_t i = 0; i < iLength; i++) {
-    wch = *pwsText++;
-    dwNext = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
-    if (dwNext == FX_CBP_SP) {
-      pBrkType[i] = FX_LBT_PROHIBITED_BRK;
-    } else {
-      pBrkType[i] = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                      (dwCur << 5) + dwNext);
-    }
-    dwCur = dwNext;
-  }
-  pBrkType[iLength] = FX_LBT_INDIRECT_BRK;
-}
-void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
-                              int32_t iLength,
-                              CFX_Int32MassArray& bp) {
-  if (iLength < 2) {
-    return;
-  }
-  FX_LINEBREAKTYPE eType;
-  FX_DWORD dwCur, dwNext;
-  FX_WCHAR wch;
-  wch = *pwsText++;
-  dwCur = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
-  iLength--;
-  for (int32_t i = 0; i < iLength; i++) {
-    wch = *pwsText++;
-    dwNext = kTextLayoutCodeProperties[(FX_WORD)wch] & 0x003F;
-    if (dwNext == FX_CBP_SP) {
-      eType = FX_LBT_PROHIBITED_BRK;
-    } else {
-      eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                (dwCur << 5) + dwNext);
-    }
-    if (eType == FX_LBT_DIRECT_BRK) {
-      bp.Add(i);
-    }
-    dwCur = dwNext;
-  }
-}
diff --git a/xfa/src/fgas/layout/fgas_linebreak.h b/xfa/src/fgas/layout/fgas_linebreak.h
deleted file mode 100644
index 7b91124..0000000
--- a/xfa/src/fgas/layout/fgas_linebreak.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LAYOUT_FGAS_LINEBREAK_H_
-#define XFA_SRC_FGAS_LAYOUT_FGAS_LINEBREAK_H_
-
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-enum FX_LINEBREAKTYPE {
-  FX_LBT_UNKNOWN = 0x00,
-  FX_LBT_DIRECT_BRK = 0x1A,
-  FX_LBT_INDIRECT_BRK = 0x2B,
-  FX_LBT_COM_INDIRECT_BRK = 0x3C,
-  FX_LBT_COM_PROHIBITED_BRK = 0x4D,
-  FX_LBT_PROHIBITED_BRK = 0x5E,
-  FX_LBT_HANGUL_SPACE_BRK = 0x6F,
-};
-
-#define FX_LBUN FX_LBT_UNKNOWN
-#define FX_LBDB FX_LBT_DIRECT_BRK
-#define FX_LBIB FX_LBT_INDIRECT_BRK
-#define FX_LBCB FX_LBT_COM_INDIRECT_BRK
-#define FX_LBCP FX_LBT_COM_PROHIBITED_BRK
-#define FX_LBPB FX_LBT_PROHIBITED_BRK
-#define FX_LBHS FX_LBT_HANGUL_SPACE_BRK
-
-extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32];
-
-void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
-                              FX_LINEBREAKTYPE* pBrkType,
-                              int32_t iLength);
-void FX_GetLineBreakPositions(const FX_WCHAR* pwsText,
-                              int32_t iLength,
-                              CFX_Int32MassArray& bp);
-
-#endif  // XFA_SRC_FGAS_LAYOUT_FGAS_LINEBREAK_H_
diff --git a/xfa/src/fgas/layout/fgas_rtfbreak.cpp b/xfa/src/fgas/layout/fgas_rtfbreak.cpp
deleted file mode 100644
index 7e4ab4c..0000000
--- a/xfa/src/fgas/layout/fgas_rtfbreak.cpp
+++ /dev/null
@@ -1,1691 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/layout/fgas_rtfbreak.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_arb.h"
-#include "xfa/src/fgas/layout/fgas_linebreak.h"
-#include "xfa/src/fgas/layout/fgas_unicode.h"
-
-namespace {
-
-class CFX_RTFLine {
- public:
-  CFX_RTFLine()
-      : m_LinePieces(16),
-        m_iStart(0),
-        m_iWidth(0),
-        m_iArabicChars(0),
-        m_iMBCSChars(0) {}
-  ~CFX_RTFLine() { RemoveAll(); }
-  int32_t CountChars() const { return m_LineChars.GetSize(); }
-  CFX_RTFChar& GetChar(int32_t index) {
-    FXSYS_assert(index > -1 && index < m_LineChars.GetSize());
-    return *m_LineChars.GetDataPtr(index);
-  }
-  CFX_RTFChar* GetCharPtr(int32_t index) {
-    FXSYS_assert(index > -1 && index < m_LineChars.GetSize());
-    return m_LineChars.GetDataPtr(index);
-  }
-  int32_t CountPieces() const { return m_LinePieces.GetSize(); }
-  CFX_RTFPiece& GetPiece(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());
-    return m_LinePieces.GetAt(index);
-  }
-  CFX_RTFPiece* GetPiecePtr(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());
-    return m_LinePieces.GetPtrAt(index);
-  }
-  int32_t GetLineEnd() const { return m_iStart + m_iWidth; }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    CFX_RTFChar* pChar;
-    IFX_Unknown* pUnknown;
-    int32_t iCount = m_LineChars.GetSize();
-    for (int32_t i = 0; i < iCount; i++) {
-      pChar = m_LineChars.GetDataPtr(i);
-      if ((pUnknown = pChar->m_pUserData) != NULL) {
-        pUnknown->Release();
-      }
-    }
-    m_LineChars.RemoveAll();
-    m_LinePieces.RemoveAll(bLeaveMemory);
-    m_iWidth = 0;
-    m_iArabicChars = 0;
-    m_iMBCSChars = 0;
-  }
-  CFX_RTFCharArray m_LineChars;
-  CFX_RTFPieceArray m_LinePieces;
-  int32_t m_iStart;
-  int32_t m_iWidth;
-  int32_t m_iArabicChars;
-  int32_t m_iMBCSChars;
-};
-
-class CFX_RTFBreak : public IFX_RTFBreak {
- public:
-  CFX_RTFBreak(FX_DWORD dwPolicies);
-  ~CFX_RTFBreak();
-  void Release() override { delete this; }
-  void SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) override;
-  void SetLineStartPos(FX_FLOAT fLinePos) override;
-  FX_DWORD GetLayoutStyles() const override { return m_dwLayoutStyles; }
-  void SetLayoutStyles(FX_DWORD dwLayoutStyles) override;
-  void SetFont(IFX_Font* pFont) override;
-  void SetFontSize(FX_FLOAT fFontSize) override;
-  void SetTabWidth(FX_FLOAT fTabWidth) override;
-  void AddPositionedTab(FX_FLOAT fTabPos) override;
-  void SetPositionedTabs(const CFX_FloatArray& tabs) override;
-  void ClearPositionedTabs() override;
-  void SetDefaultChar(FX_WCHAR wch) override;
-  void SetLineBreakChar(FX_WCHAR wch) override;
-  void SetLineBreakTolerance(FX_FLOAT fTolerance) override;
-  void SetHorizontalScale(int32_t iScale) override;
-  void SetVerticalScale(int32_t iScale) override;
-  void SetCharRotation(int32_t iCharRotation) override;
-  void SetCharSpace(FX_FLOAT fCharSpace) override;
-  void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) override;
-  void SetReadingOrder(FX_BOOL bRTL = FALSE) override;
-  void SetAlignment(int32_t iAlignment = FX_RTFLINEALIGNMENT_Left) override;
-  void SetUserData(IFX_Unknown* pUserData) override;
-  FX_DWORD AppendChar(FX_WCHAR wch) override;
-  FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) override;
-  int32_t CountBreakPieces() const override;
-  const CFX_RTFPiece* GetBreakPiece(int32_t index) const override;
-  void GetLineRect(CFX_RectF& rect) const override;
-  void ClearBreakPieces() override;
-  void Reset() override;
-  int32_t GetDisplayPos(
-      const FX_RTFTEXTOBJ* pText,
-      FXTEXT_CHARPOS* pCharPos,
-      FX_BOOL bCharCode = FALSE,
-      CFX_WideString* pWSForms = NULL,
-      FX_AdjustCharDisplayPos pAdjustPos = NULL) const override;
-  int32_t GetCharRects(const FX_RTFTEXTOBJ* pText,
-                       CFX_RectFArray& rtArray,
-                       FX_BOOL bCharBBox = FALSE) const override;
-  FX_DWORD AppendChar_CharCode(FX_WCHAR wch);
-  FX_DWORD AppendChar_Combination(CFX_RTFChar* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Tab(CFX_RTFChar* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Control(CFX_RTFChar* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Arabic(CFX_RTFChar* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Others(CFX_RTFChar* pCurChar, int32_t iRotation);
-
- protected:
-  FX_DWORD m_dwPolicies;
-  IFX_ArabicChar* m_pArabicChar;
-  int32_t m_iBoundaryStart;
-  int32_t m_iBoundaryEnd;
-  FX_DWORD m_dwLayoutStyles;
-  FX_BOOL m_bPagination;
-  FX_BOOL m_bVertical;
-  FX_BOOL m_bSingleLine;
-  FX_BOOL m_bCharCode;
-  IFX_Font* m_pFont;
-  int32_t m_iFontHeight;
-  int32_t m_iFontSize;
-  int32_t m_iTabWidth;
-  CFX_Int32Array m_PositionedTabs;
-  FX_BOOL m_bOrphanLine;
-  FX_WCHAR m_wDefChar;
-  int32_t m_iDefChar;
-  FX_WCHAR m_wLineBreakChar;
-  int32_t m_iHorizontalScale;
-  int32_t m_iVerticalScale;
-  int32_t m_iLineRotation;
-  int32_t m_iCharRotation;
-  int32_t m_iRotation;
-  int32_t m_iCharSpace;
-  FX_BOOL m_bWordSpace;
-  int32_t m_iWordSpace;
-  FX_BOOL m_bRTL;
-  int32_t m_iAlignment;
-  IFX_Unknown* m_pUserData;
-  FX_DWORD m_dwCharType;
-  FX_DWORD m_dwIdentity;
-  CFX_RTFLine m_RTFLine1;
-  CFX_RTFLine m_RTFLine2;
-  CFX_RTFLine* m_pCurLine;
-  int32_t m_iReady;
-  int32_t m_iTolerance;
-  int32_t GetLineRotation(FX_DWORD dwStyles) const;
-  void SetBreakStatus();
-  CFX_RTFChar* GetLastChar(int32_t index) const;
-  CFX_RTFLine* GetRTFLine(FX_BOOL bReady) const;
-  CFX_RTFPieceArray* GetRTFPieces(FX_BOOL bReady) const;
-  FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const;
-  int32_t GetLastPositionedTab() const;
-  FX_BOOL GetPositionedTab(int32_t& iTabPos) const;
-  int32_t GetBreakPos(CFX_RTFCharArray& tca,
-                      int32_t& iEndPos,
-                      FX_BOOL bAllChars = FALSE,
-                      FX_BOOL bOnlyBrk = FALSE);
-  void SplitTextLine(CFX_RTFLine* pCurLine,
-                     CFX_RTFLine* pNextLine,
-                     FX_BOOL bAllChars = FALSE);
-  FX_BOOL EndBreak_SplitLine(CFX_RTFLine* pNextLine,
-                             FX_BOOL bAllChars,
-                             FX_DWORD dwStatus);
-  void EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus);
-  void EndBreak_Alignment(CFX_TPOArray& tpos,
-                          FX_BOOL bAllChars,
-                          FX_DWORD dwStatus);
-};
-
-}  // namespace
-
-IFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) {
-  return new CFX_RTFBreak(dwPolicies);
-}
-CFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies)
-    : m_dwPolicies(dwPolicies),
-      m_pArabicChar(NULL),
-      m_iBoundaryStart(0),
-      m_iBoundaryEnd(2000000),
-      m_dwLayoutStyles(0),
-      m_bPagination(FALSE),
-      m_bVertical(FALSE),
-      m_bSingleLine(FALSE),
-      m_bCharCode(FALSE),
-      m_pFont(NULL),
-      m_iFontHeight(240),
-      m_iFontSize(240),
-      m_iTabWidth(720000),
-      m_PositionedTabs(),
-      m_bOrphanLine(FALSE),
-      m_wDefChar(0xFEFF),
-      m_iDefChar(0),
-      m_wLineBreakChar(L'\n'),
-      m_iHorizontalScale(100),
-      m_iVerticalScale(100),
-      m_iLineRotation(0),
-      m_iCharRotation(0),
-      m_iRotation(0),
-      m_iCharSpace(0),
-      m_bWordSpace(FALSE),
-      m_iWordSpace(0),
-      m_bRTL(FALSE),
-      m_iAlignment(FX_RTFLINEALIGNMENT_Left),
-      m_pUserData(NULL),
-      m_dwCharType(0),
-      m_dwIdentity(0),
-      m_RTFLine1(),
-      m_RTFLine2(),
-      m_pCurLine(NULL),
-      m_iReady(0),
-      m_iTolerance(0) {
-  m_pArabicChar = IFX_ArabicChar::Create();
-  m_pCurLine = &m_RTFLine1;
-}
-CFX_RTFBreak::~CFX_RTFBreak() {
-  Reset();
-  m_PositionedTabs.RemoveAll();
-  m_pArabicChar->Release();
-  if (m_pUserData != NULL) {
-    m_pUserData->Release();
-  }
-}
-void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) {
-  if (fLineStart > fLineEnd)
-    return;
-  m_iBoundaryStart = FXSYS_round(fLineStart * 20000.0f);
-  m_iBoundaryEnd = FXSYS_round(fLineEnd * 20000.0f);
-  m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iBoundaryEnd);
-  m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iBoundaryStart);
-}
-void CFX_RTFBreak::SetLineStartPos(FX_FLOAT fLinePos) {
-  int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
-  iLinePos = std::min(iLinePos, m_iBoundaryEnd);
-  iLinePos = std::max(iLinePos, m_iBoundaryStart);
-  m_pCurLine->m_iStart = iLinePos;
-}
-void CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) {
-  if (m_dwLayoutStyles == dwLayoutStyles) {
-    return;
-  }
-  SetBreakStatus();
-  m_dwLayoutStyles = dwLayoutStyles;
-  m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0;
-  m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
-  m_bSingleLine = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
-  m_bCharCode = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
-  m_iLineRotation = GetLineRotation(m_dwLayoutStyles);
-  m_iRotation = m_iLineRotation + m_iCharRotation;
-  m_iRotation %= 4;
-}
-void CFX_RTFBreak::SetFont(IFX_Font* pFont) {
-  if (pFont == NULL) {
-    return;
-  }
-  if (m_pFont == pFont) {
-    return;
-  }
-  SetBreakStatus();
-  m_pFont = pFont;
-  m_iDefChar = 0;
-  if (m_pFont != NULL) {
-    m_iFontHeight = m_iFontSize;
-    if (m_wDefChar != 0xFEFF) {
-      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-      m_iDefChar *= m_iFontSize;
-    }
-  }
-}
-void CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) {
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  if (m_iFontSize == iFontSize) {
-    return;
-  }
-  SetBreakStatus();
-  m_iFontSize = iFontSize;
-  m_iDefChar = 0;
-  if (m_pFont != NULL) {
-    m_iFontHeight = m_iFontSize;
-    if (m_wDefChar != 0xFEFF) {
-      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-      m_iDefChar *= m_iFontSize;
-    }
-  }
-}
-void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) {
-  m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
-}
-void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) {
-  int32_t iLineEnd = m_iBoundaryEnd;
-  int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart;
-  if (iTabPos > iLineEnd) {
-    iTabPos = iLineEnd;
-  }
-  if (m_PositionedTabs.Find(iTabPos, 0) > -1) {
-    return;
-  }
-  int32_t iCount = m_PositionedTabs.GetSize();
-  int32_t iFind = 0;
-  for (; iFind < iCount; iFind++) {
-    if (m_PositionedTabs[iFind] > iTabPos) {
-      break;
-    }
-  }
-  m_PositionedTabs.InsertAt(iFind, iTabPos);
-  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
-    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
-  } else {
-    m_bOrphanLine = FALSE;
-  }
-}
-void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) {
-  m_PositionedTabs.RemoveAll();
-  int32_t iCount = tabs.GetSize();
-  m_PositionedTabs.SetSize(iCount);
-  int32_t iLineEnd = m_iBoundaryEnd;
-  int32_t iTabPos;
-  for (int32_t i = 0; i < iCount; i++) {
-    iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart;
-    if (iTabPos > iLineEnd) {
-      iTabPos = iLineEnd;
-    }
-    m_PositionedTabs[i] = iTabPos;
-  }
-  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
-    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
-  } else {
-    m_bOrphanLine = FALSE;
-  }
-}
-void CFX_RTFBreak::ClearPositionedTabs() {
-  m_PositionedTabs.RemoveAll();
-  m_bOrphanLine = FALSE;
-}
-void CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) {
-  m_wDefChar = wch;
-  m_iDefChar = 0;
-  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
-    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-    if (m_iDefChar < 0) {
-      m_iDefChar = 0;
-    } else {
-      m_iDefChar *= m_iFontSize;
-    }
-  }
-}
-void CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) {
-  if (wch != L'\r' && wch != L'\n') {
-    return;
-  }
-  m_wLineBreakChar = wch;
-}
-void CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
-  m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
-}
-void CFX_RTFBreak::SetHorizontalScale(int32_t iScale) {
-  if (iScale < 0) {
-    iScale = 0;
-  }
-  if (m_iHorizontalScale == iScale) {
-    return;
-  }
-  SetBreakStatus();
-  m_iHorizontalScale = iScale;
-}
-void CFX_RTFBreak::SetVerticalScale(int32_t iScale) {
-  if (iScale < 0) {
-    iScale = 0;
-  }
-  if (m_iVerticalScale == iScale) {
-    return;
-  }
-  SetBreakStatus();
-  m_iVerticalScale = iScale;
-}
-void CFX_RTFBreak::SetCharRotation(int32_t iCharRotation) {
-  if (iCharRotation < 0) {
-    iCharRotation += (-iCharRotation / 4 + 1) * 4;
-  } else if (iCharRotation > 3) {
-    iCharRotation -= (iCharRotation / 4) * 4;
-  }
-  if (m_iCharRotation == iCharRotation) {
-    return;
-  }
-  SetBreakStatus();
-  m_iCharRotation = iCharRotation;
-  m_iRotation = m_iLineRotation + m_iCharRotation;
-  m_iRotation %= 4;
-}
-void CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) {
-  m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
-}
-void CFX_RTFBreak::SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) {
-  m_bWordSpace = !bDefault;
-  m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f);
-}
-void CFX_RTFBreak::SetReadingOrder(FX_BOOL bRTL) {
-  m_bRTL = bRTL;
-}
-void CFX_RTFBreak::SetAlignment(int32_t iAlignment) {
-  FXSYS_assert(iAlignment >= FX_RTFLINEALIGNMENT_Left &&
-               iAlignment <= FX_RTFLINEALIGNMENT_Distributed);
-  m_iAlignment = iAlignment;
-}
-void CFX_RTFBreak::SetUserData(IFX_Unknown* pUserData) {
-  if (m_pUserData == pUserData) {
-    return;
-  }
-  SetBreakStatus();
-  if (m_pUserData != NULL) {
-    m_pUserData->Release();
-  }
-  m_pUserData = pUserData;
-  if (m_pUserData != NULL) {
-    m_pUserData->AddRef();
-  }
-}
-static const int32_t gs_FX_RTFLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
-int32_t CFX_RTFBreak::GetLineRotation(FX_DWORD dwStyles) const {
-  return gs_FX_RTFLineRotations[(dwStyles & 0x0E) >> 1];
-}
-void CFX_RTFBreak::SetBreakStatus() {
-  m_dwIdentity++;
-  int32_t iCount = m_pCurLine->CountChars();
-  if (iCount < 1) {
-    return;
-  }
-  CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
-  if (tc.m_dwStatus == 0) {
-    tc.m_dwStatus = FX_RTFBREAK_PieceBreak;
-  }
-}
-CFX_RTFChar* CFX_RTFBreak::GetLastChar(int32_t index) const {
-  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
-  int32_t iCount = tca.GetSize();
-  if (index < 0 || index >= iCount) {
-    return NULL;
-  }
-  CFX_RTFChar* pTC;
-  int32_t iStart = iCount - 1;
-  while (iStart > -1) {
-    pTC = tca.GetDataPtr(iStart--);
-    if (pTC->m_iCharWidth >= 0 ||
-        pTC->GetCharType() != FX_CHARTYPE_Combination) {
-      if (--index < 0) {
-        return pTC;
-      }
-    }
-  }
-  return NULL;
-}
-CFX_RTFLine* CFX_RTFBreak::GetRTFLine(FX_BOOL bReady) const {
-  if (bReady) {
-    if (m_iReady == 1) {
-      return (CFX_RTFLine*)&m_RTFLine1;
-    } else if (m_iReady == 2) {
-      return (CFX_RTFLine*)&m_RTFLine2;
-    } else {
-      return NULL;
-    }
-  }
-  FXSYS_assert(m_pCurLine != NULL);
-  return m_pCurLine;
-}
-CFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(FX_BOOL bReady) const {
-  CFX_RTFLine* pRTFLine = GetRTFLine(bReady);
-  if (pRTFLine == NULL) {
-    return NULL;
-  }
-  return &pRTFLine->m_LinePieces;
-}
-inline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const {
-  return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType;
-}
-int32_t CFX_RTFBreak::GetLastPositionedTab() const {
-  int32_t iCount = m_PositionedTabs.GetSize();
-  if (iCount < 1) {
-    return m_iBoundaryStart;
-  }
-  return m_PositionedTabs[iCount - 1];
-}
-FX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const {
-  int32_t iCount = m_PositionedTabs.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    if (m_PositionedTabs[i] > iTabPos) {
-      iTabPos = m_PositionedTabs[i];
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-typedef FX_DWORD (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)(
-    CFX_RTFChar* pCurChar,
-    int32_t iRotation);
-static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = {
-    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Tab,
-    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Control,
-    &CFX_RTFBreak::AppendChar_Combination, &CFX_RTFBreak::AppendChar_Others,
-    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Arabic,
-    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
-    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
-    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Others,
-    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Others,
-};
-FX_DWORD CFX_RTFBreak::AppendChar(FX_WCHAR wch) {
-  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL && m_pArabicChar != NULL);
-  if (m_bCharCode) {
-    return AppendChar_CharCode(wch);
-  }
-  FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch];
-  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
-  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
-  CFX_RTFChar* pCurChar = tca.AddSpace();
-  pCurChar->m_dwStatus = 0;
-  pCurChar->m_wCharCode = wch;
-  pCurChar->m_dwCharProps = dwProps;
-  pCurChar->m_dwCharStyles = 0;
-  pCurChar->m_dwLayoutStyles = 0;
-  pCurChar->m_iFontSize = m_iFontSize;
-  pCurChar->m_iFontHeight = m_iFontHeight;
-  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
-  pCurChar->m_iVertialScale = m_iVerticalScale;
-  pCurChar->m_nRotation = m_iCharRotation;
-  pCurChar->m_iCharWidth = 0;
-  pCurChar->m_dwIdentity = m_dwIdentity;
-  if (m_pUserData != NULL) {
-    m_pUserData->AddRef();
-  }
-  pCurChar->m_pUserData = m_pUserData;
-  FX_DWORD dwRet1 = FX_RTFBREAK_None;
-  if (dwType != FX_CHARTYPE_Combination &&
-      GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) {
-    if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 &&
-        m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
-      if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) {
-        dwRet1 = EndBreak(FX_RTFBREAK_LineBreak);
-        int32_t iCount = m_pCurLine->CountChars();
-        if (iCount > 0) {
-          pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1);
-        }
-      }
-    }
-  }
-  int32_t iRotation = m_iRotation;
-  if (m_bVertical && (dwProps & 0x8000) != 0) {
-    iRotation = (iRotation + 1) % 4;
-  }
-  FX_DWORD dwRet2 =
-      (this->*g_FX_RTFBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(
-          pCurChar, iRotation);
-  m_dwCharType = dwType;
-  return std::max(dwRet1, dwRet2);
-}
-FX_DWORD CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) {
-  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL);
-  FXSYS_assert(m_bCharCode);
-  m_pCurLine->m_iMBCSChars++;
-  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
-  CFX_RTFChar* pCurChar = tca.AddSpace();
-  pCurChar->m_dwStatus = 0;
-  pCurChar->m_wCharCode = wch;
-  pCurChar->m_dwCharProps = 0;
-  pCurChar->m_dwCharStyles = 0;
-  pCurChar->m_dwLayoutStyles = m_dwLayoutStyles;
-  pCurChar->m_iFontSize = m_iFontSize;
-  pCurChar->m_iFontHeight = m_iFontHeight;
-  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
-  pCurChar->m_iVertialScale = m_iVerticalScale;
-  pCurChar->m_nRotation = m_iCharRotation;
-  pCurChar->m_iCharWidth = 0;
-  pCurChar->m_dwIdentity = m_dwIdentity;
-  if (m_pUserData != NULL) {
-    m_pUserData->AddRef();
-  }
-  pCurChar->m_pUserData = m_pUserData;
-  int32_t iCharWidth = 0;
-  if (m_bVertical != FX_IsOdd(m_iRotation)) {
-    iCharWidth = 1000;
-  } else {
-    if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) {
-      iCharWidth = m_iDefChar;
-    }
-  }
-  iCharWidth *= m_iFontSize;
-  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
-  iCharWidth += m_iCharSpace;
-  pCurChar->m_iCharWidth = iCharWidth;
-  m_pCurLine->m_iWidth += iCharWidth;
-  m_dwCharType = 0;
-  if (!m_bSingleLine &&
-      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
-    return EndBreak(FX_RTFBREAK_LineBreak);
-  }
-  return FX_RTFBREAK_None;
-}
-FX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar,
-                                              int32_t iRotation) {
-  int32_t iCharWidth = 0;
-  if (m_bVertical != FX_IsOdd(iRotation)) {
-    iCharWidth = 1000;
-  } else {
-    if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
-                               m_bCharCode)) {
-      iCharWidth = 0;
-    }
-  }
-  iCharWidth *= m_iFontSize;
-  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
-  CFX_RTFChar* pLastChar = GetLastChar(0);
-  if (pLastChar != NULL && pLastChar->GetCharType() > FX_CHARTYPE_Combination) {
-    iCharWidth = -iCharWidth;
-  } else {
-    m_dwCharType = FX_CHARTYPE_Combination;
-  }
-  pCurChar->m_iCharWidth = iCharWidth;
-  if (iCharWidth > 0) {
-    m_pCurLine->m_iWidth += iCharWidth;
-  }
-  return FX_RTFBREAK_None;
-}
-FX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar,
-                                      int32_t iRotation) {
-  if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) {
-    FX_BOOL bBreak = FALSE;
-    if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
-      bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance);
-    }
-    int32_t& iLineWidth = m_pCurLine->m_iWidth;
-    int32_t iCharWidth = iLineWidth;
-    if (GetPositionedTab(iCharWidth)) {
-      iCharWidth -= iLineWidth;
-    } else {
-      iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth;
-    }
-    pCurChar->m_iCharWidth = iCharWidth;
-    iLineWidth += iCharWidth;
-    if (!m_bSingleLine && !m_bOrphanLine && bBreak) {
-      return EndBreak(FX_RTFBREAK_LineBreak);
-    }
-  }
-  return FX_RTFBREAK_None;
-}
-FX_DWORD CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar,
-                                          int32_t iRotation) {
-  FX_DWORD dwRet2 = FX_RTFBREAK_None;
-  if (!m_bSingleLine) {
-    switch (pCurChar->m_wCharCode) {
-      case L'\v':
-      case 0x2028:
-        dwRet2 = FX_RTFBREAK_LineBreak;
-        break;
-      case L'\f':
-        dwRet2 = FX_RTFBREAK_PageBreak;
-        break;
-      case 0x2029:
-        dwRet2 = FX_RTFBREAK_ParagraphBreak;
-        break;
-      default:
-        if (pCurChar->m_wCharCode == m_wLineBreakChar) {
-          dwRet2 = FX_RTFBREAK_ParagraphBreak;
-        }
-        break;
-    }
-    if (dwRet2 != FX_RTFBREAK_None) {
-      dwRet2 = EndBreak(dwRet2);
-    }
-  }
-  return dwRet2;
-}
-FX_DWORD CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar,
-                                         int32_t iRotation) {
-  CFX_RTFChar* pLastChar = NULL;
-  int32_t& iLineWidth = m_pCurLine->m_iWidth;
-  int32_t iCharWidth = 0;
-  FX_WCHAR wForm;
-  FX_BOOL bAlef = FALSE;
-  if (m_dwCharType >= FX_CHARTYPE_ArabicAlef &&
-      m_dwCharType <= FX_CHARTYPE_ArabicDistortion) {
-    pLastChar = GetLastChar(1);
-    if (pLastChar != NULL) {
-      iLineWidth -= pLastChar->m_iCharWidth;
-      CFX_RTFChar* pPrevChar = GetLastChar(2);
-      wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar);
-      bAlef = (wForm == 0xFEFF &&
-               pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef);
-      int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation;
-      if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) {
-        iLastRotation++;
-      }
-      if (m_bVertical != FX_IsOdd(iLastRotation)) {
-        iCharWidth = 1000;
-      } else {
-        if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) {
-          if (!m_pFont->GetCharWidth(pLastChar->m_wCharCode, iCharWidth,
-                                     m_bCharCode)) {
-            iCharWidth = m_iDefChar;
-          }
-        }
-      }
-      iCharWidth *= m_iFontSize;
-      iCharWidth = iCharWidth * m_iHorizontalScale / 100;
-      pLastChar->m_iCharWidth = iCharWidth;
-      iLineWidth += iCharWidth;
-      iCharWidth = 0;
-    }
-  }
-  wForm =
-      m_pArabicChar->GetFormChar(pCurChar, (bAlef ? NULL : pLastChar), NULL);
-  if (m_bVertical != FX_IsOdd(iRotation)) {
-    iCharWidth = 1000;
-  } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode) &&
-             !m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
-                                    m_bCharCode)) {
-    iCharWidth = m_iDefChar;
-  }
-
-  iCharWidth *= m_iFontSize;
-  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
-  pCurChar->m_iCharWidth = iCharWidth;
-  iLineWidth += iCharWidth;
-  m_pCurLine->m_iArabicChars++;
-  if (!m_bSingleLine && !m_bOrphanLine &&
-      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
-    return EndBreak(FX_RTFBREAK_LineBreak);
-  }
-  return FX_RTFBREAK_None;
-}
-FX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar,
-                                         int32_t iRotation) {
-  FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK);
-  FX_WCHAR wForm;
-  if (dwType == FX_CHARTYPE_Numeric) {
-    if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) {
-      wForm = pCurChar->m_wCharCode + 0x0630;
-    } else {
-      wForm = pCurChar->m_wCharCode;
-    }
-  } else if (m_bRTL || m_bVertical) {
-    wForm = FX_GetMirrorChar(pCurChar->m_wCharCode, pCurChar->m_dwCharProps,
-                             m_bRTL, m_bVertical);
-  } else {
-    wForm = pCurChar->m_wCharCode;
-  }
-  int32_t iCharWidth = 0;
-  if (m_bVertical != FX_IsOdd(iRotation)) {
-    iCharWidth = 1000;
-  } else {
-    if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) {
-      iCharWidth = m_iDefChar;
-    }
-  }
-  iCharWidth *= m_iFontSize;
-  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
-  iCharWidth += m_iCharSpace;
-  if (dwType == FX_CHARTYPE_Space && m_bWordSpace) {
-    iCharWidth += m_iWordSpace;
-  }
-  pCurChar->m_iCharWidth = iCharWidth;
-  m_pCurLine->m_iWidth += iCharWidth;
-  FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space ||
-                    (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0);
-  if (!m_bSingleLine && !m_bOrphanLine && bBreak &&
-      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
-    return EndBreak(FX_RTFBREAK_LineBreak);
-  }
-  return FX_RTFBREAK_None;
-}
-FX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) {
-  FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak &&
-               dwStatus <= FX_RTFBREAK_PageBreak);
-  m_dwIdentity++;
-  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
-  int32_t iCount = pCurPieces->GetSize();
-  if (iCount > 0) {
-    CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
-    if (dwStatus > FX_RTFBREAK_PieceBreak) {
-      pLastPiece->m_dwStatus = dwStatus;
-    } else {
-      dwStatus = pLastPiece->m_dwStatus;
-    }
-    return dwStatus;
-  } else {
-    CFX_RTFLine* pLastLine = GetRTFLine(TRUE);
-    if (pLastLine != NULL) {
-      pCurPieces = &pLastLine->m_LinePieces;
-      iCount = pCurPieces->GetSize();
-      if (iCount-- > 0) {
-        CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
-        if (dwStatus > FX_RTFBREAK_PieceBreak) {
-          pLastPiece->m_dwStatus = dwStatus;
-        } else {
-          dwStatus = pLastPiece->m_dwStatus;
-        }
-        return dwStatus;
-      }
-      return FX_RTFBREAK_None;
-    }
-    iCount = m_pCurLine->CountChars();
-    if (iCount < 1) {
-      return FX_RTFBREAK_None;
-    }
-    CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
-    tc.m_dwStatus = dwStatus;
-    if (dwStatus <= FX_RTFBREAK_PieceBreak) {
-      return dwStatus;
-    }
-  }
-  m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2;
-  CFX_RTFLine* pNextLine =
-      (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1;
-  FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right);
-  CFX_TPOArray tpos;
-  if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
-    goto EndBreak_Ret;
-  }
-  if (!m_bCharCode) {
-    EndBreak_BidiLine(tpos, dwStatus);
-  }
-  if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) {
-    EndBreak_Alignment(tpos, bAllChars, dwStatus);
-  }
-EndBreak_Ret:
-  m_pCurLine = pNextLine;
-  m_pCurLine->m_iStart = m_iBoundaryStart;
-  CFX_RTFChar* pTC = GetLastChar(0);
-  m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType();
-  return dwStatus;
-}
-FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine,
-                                         FX_BOOL bAllChars,
-                                         FX_DWORD dwStatus) {
-  FX_BOOL bDone = FALSE;
-  if (!m_bSingleLine && !m_bOrphanLine &&
-      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
-    CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1);
-    switch (tc.GetCharType()) {
-      case FX_CHARTYPE_Tab:
-        if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
-          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-          bDone = TRUE;
-        }
-        break;
-      case FX_CHARTYPE_Control:
-        break;
-      case FX_CHARTYPE_Space:
-        if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) {
-          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-          bDone = TRUE;
-        }
-        break;
-      default:
-        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-        bDone = TRUE;
-        break;
-    }
-  }
-  if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) {
-    const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.GetData();
-    const CFX_RTFChar* pTC;
-    CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
-    CFX_RTFPiece tp;
-    tp.m_pChars = &m_pCurLine->m_LineChars;
-    FX_BOOL bNew = TRUE;
-    FX_DWORD dwIdentity = (FX_DWORD)-1;
-    int32_t iLast = m_pCurLine->CountChars() - 1, j = 0;
-    for (int32_t i = 0; i <= iLast;) {
-      pTC = pCurChars + i;
-      if (bNew) {
-        tp.m_iStartChar = i;
-        tp.m_iStartPos += tp.m_iWidth;
-        tp.m_iWidth = 0;
-        tp.m_dwStatus = pTC->m_dwStatus;
-        tp.m_iFontSize = pTC->m_iFontSize;
-        tp.m_iFontHeight = pTC->m_iFontHeight;
-        tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-        tp.m_iVerticalScale = pTC->m_iVertialScale;
-        tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles;
-        dwIdentity = pTC->m_dwIdentity;
-        tp.m_dwIdentity = dwIdentity;
-        tp.m_pUserData = pTC->m_pUserData;
-        j = i;
-        bNew = FALSE;
-      }
-      if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None ||
-          pTC->m_dwIdentity != dwIdentity) {
-        tp.m_iChars = i - j;
-        if (pTC->m_dwIdentity == dwIdentity) {
-          tp.m_dwStatus = pTC->m_dwStatus;
-          tp.m_iWidth += pTC->m_iCharWidth;
-          tp.m_iChars += 1;
-          i++;
-        }
-        pCurPieces->Add(tp);
-        bNew = TRUE;
-      } else {
-        tp.m_iWidth += pTC->m_iCharWidth;
-        i++;
-      }
-    }
-    return TRUE;
-  }
-  if (bAllChars && !bDone) {
-    int32_t iEndPos = m_pCurLine->GetLineEnd();
-    GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, TRUE);
-  }
-  return FALSE;
-}
-void CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus) {
-  FX_TPO tpo;
-  CFX_RTFPiece tp;
-  CFX_RTFChar* pTC;
-  int32_t i, j;
-  CFX_RTFCharArray& chars = m_pCurLine->m_LineChars;
-  int32_t iCount = m_pCurLine->CountChars();
-  FX_BOOL bDone = (!m_bPagination && !m_bCharCode &&
-                   (m_pCurLine->m_iArabicChars > 0 || m_bRTL));
-  if (bDone) {
-    int32_t iBidiNum = 0;
-    for (i = 0; i < iCount; i++) {
-      pTC = chars.GetDataPtr(i);
-      pTC->m_iBidiPos = i;
-      if (pTC->GetCharType() != FX_CHARTYPE_Control) {
-        iBidiNum = i;
-      }
-      if (i == 0) {
-        pTC->m_iBidiLevel = 1;
-      }
-    }
-    FX_BidiLine(chars, iBidiNum + 1, m_bRTL ? 1 : 0);
-  } else {
-    for (i = 0; i < iCount; i++) {
-      pTC = chars.GetDataPtr(i);
-      pTC->m_iBidiLevel = 0;
-      pTC->m_iBidiPos = 0;
-      pTC->m_iBidiOrder = 0;
-    }
-  }
-  tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
-  tp.m_iStartPos = m_pCurLine->m_iStart;
-  tp.m_pChars = &chars;
-  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
-  int32_t iBidiLevel = -1, iCharWidth;
-  FX_DWORD dwIdentity = (FX_DWORD)-1;
-  i = j = 0;
-  while (i < iCount) {
-    pTC = chars.GetDataPtr(i);
-    if (iBidiLevel < 0) {
-      iBidiLevel = pTC->m_iBidiLevel;
-      iCharWidth = pTC->m_iCharWidth;
-      if (iCharWidth < 1) {
-        tp.m_iWidth = 0;
-      } else {
-        tp.m_iWidth = iCharWidth;
-      }
-      tp.m_iBidiLevel = iBidiLevel;
-      tp.m_iBidiPos = pTC->m_iBidiOrder;
-      tp.m_iFontSize = pTC->m_iFontSize;
-      tp.m_iFontHeight = pTC->m_iFontHeight;
-      tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-      tp.m_iVerticalScale = pTC->m_iVertialScale;
-      dwIdentity = pTC->m_dwIdentity;
-      tp.m_dwIdentity = dwIdentity;
-      tp.m_pUserData = pTC->m_pUserData;
-      tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
-      i++;
-    } else if (iBidiLevel != pTC->m_iBidiLevel ||
-               pTC->m_dwIdentity != dwIdentity) {
-      tp.m_iChars = i - tp.m_iStartChar;
-      pCurPieces->Add(tp);
-      tp.m_iStartPos += tp.m_iWidth;
-      tp.m_iStartChar = i;
-      tpo.index = j++;
-      tpo.pos = tp.m_iBidiPos;
-      tpos.Add(tpo);
-      iBidiLevel = -1;
-    } else {
-      iCharWidth = pTC->m_iCharWidth;
-      if (iCharWidth > 0) {
-        tp.m_iWidth += iCharWidth;
-      }
-      i++;
-    }
-  }
-  if (i > tp.m_iStartChar) {
-    tp.m_dwStatus = dwStatus;
-    tp.m_iChars = i - tp.m_iStartChar;
-    pCurPieces->Add(tp);
-    tpo.index = j;
-    tpo.pos = tp.m_iBidiPos;
-    tpos.Add(tpo);
-  }
-  if (!m_bCharCode) {
-    j = tpos.GetSize() - 1;
-    FX_TEXTLAYOUT_PieceSort(tpos, 0, j);
-    int32_t iStartPos = m_pCurLine->m_iStart;
-    for (i = 0; i <= j; i++) {
-      tpo = tpos.GetAt(i);
-      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
-      ttp.m_iStartPos = iStartPos;
-      iStartPos += ttp.m_iWidth;
-    }
-  }
-}
-void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
-                                      FX_BOOL bAllChars,
-                                      FX_DWORD dwStatus) {
-  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
-  int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
-  int32_t iCount = pCurPieces->GetSize();
-  FX_BOOL bFind = FALSE;
-  FX_DWORD dwCharType;
-  int32_t i, j;
-  FX_TPO tpo;
-  for (i = iCount - 1; i > -1; i--) {
-    tpo = tpos.GetAt(i);
-    CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
-    if (!bFind) {
-      iNetWidth = ttp.GetEndPos();
-    }
-    FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel);
-    j = bArabic ? 0 : ttp.m_iChars - 1;
-    while (j > -1 && j < ttp.m_iChars) {
-      const CFX_RTFChar& tc = ttp.GetChar(j);
-      if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) {
-        iGapChars++;
-      }
-      if (!bFind || !bAllChars) {
-        dwCharType = tc.GetCharType();
-        if (dwCharType == FX_CHARTYPE_Space ||
-            dwCharType == FX_CHARTYPE_Control) {
-          if (!bFind) {
-            iCharWidth = tc.m_iCharWidth;
-            if (bAllChars && iCharWidth > 0) {
-              iNetWidth -= iCharWidth;
-            }
-          }
-        } else {
-          bFind = TRUE;
-          if (!bAllChars) {
-            break;
-          }
-        }
-      }
-      j += bArabic ? 1 : -1;
-    }
-    if (!bAllChars && bFind) {
-      break;
-    }
-  }
-  int32_t iOffset = m_iBoundaryEnd - iNetWidth;
-  int32_t iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask);
-  int32_t iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask);
-  if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed ||
-                        (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified &&
-                         dwStatus != FX_RTFBREAK_ParagraphBreak))) {
-    int32_t iStart = -1;
-    for (i = 0; i < iCount; i++) {
-      tpo = tpos.GetAt(i);
-      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
-      if (iStart < 0) {
-        iStart = ttp.m_iStartPos;
-      } else {
-        ttp.m_iStartPos = iStart;
-      }
-      int32_t k;
-      for (j = 0; j < ttp.m_iChars; j++) {
-        CFX_RTFChar& tc = ttp.GetChar(j);
-        if (tc.m_nBreakType != FX_LBT_DIRECT_BRK || tc.m_iCharWidth < 0) {
-          continue;
-        }
-        k = iOffset / iGapChars;
-        tc.m_iCharWidth += k;
-        ttp.m_iWidth += k;
-        iOffset -= k;
-        iGapChars--;
-        if (iGapChars < 1) {
-          break;
-        }
-      }
-      iStart += ttp.m_iWidth;
-    }
-  } else if (iLowerAlignment > FX_RTFLINEALIGNMENT_Left) {
-    if (iLowerAlignment == FX_RTFLINEALIGNMENT_Center) {
-      iOffset /= 2;
-    }
-    if (iOffset > 0) {
-      for (i = 0; i < iCount; i++) {
-        CFX_RTFPiece& ttp = pCurPieces->GetAt(i);
-        ttp.m_iStartPos += iOffset;
-      }
-    }
-  }
-}
-int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca,
-                                  int32_t& iEndPos,
-                                  FX_BOOL bAllChars,
-                                  FX_BOOL bOnlyBrk) {
-  int32_t iLength = tca.GetSize() - 1;
-  if (iLength < 1) {
-    return iLength;
-  }
-  int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1,
-          iLast = -1, iLastPos = -1;
-  if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) {
-    if (!bAllChars || m_bCharCode) {
-      return iLength;
-    }
-    iBreak = iLength;
-    iBreakPos = iEndPos;
-  }
-  CFX_RTFChar* pCharArray = tca.GetData();
-  if (m_bCharCode) {
-    const CFX_RTFChar* pChar;
-    int32_t iCharWidth;
-    while (iLength > 0) {
-      if (iEndPos <= m_iBoundaryEnd) {
-        break;
-      }
-      pChar = pCharArray + iLength--;
-      iCharWidth = pChar->m_iCharWidth;
-      if (iCharWidth > 0) {
-        iEndPos -= iCharWidth;
-      }
-    }
-    return iLength;
-  }
-  FX_BOOL bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0;
-  FX_BOOL bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0;
-  FX_BOOL bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0;
-  FX_BOOL bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0;
-  FX_LINEBREAKTYPE eType;
-  FX_DWORD nCodeProp, nCur, nNext;
-  CFX_RTFChar* pCur = pCharArray + iLength--;
-  if (bAllChars) {
-    pCur->m_nBreakType = FX_LBT_UNKNOWN;
-  }
-  nCodeProp = pCur->m_dwCharProps;
-  nNext = nCodeProp & 0x003F;
-  int32_t iCharWidth = pCur->m_iCharWidth;
-  if (iCharWidth > 0) {
-    iEndPos -= iCharWidth;
-  }
-  while (iLength >= 0) {
-    pCur = pCharArray + iLength;
-    nCodeProp = pCur->m_dwCharProps;
-    nCur = nCodeProp & 0x003F;
-    FX_BOOL bNeedBreak = FALSE;
-    if (nCur == FX_CBP_SP) {
-      bNeedBreak = !bSpaceBreak;
-      if (nNext == FX_CBP_SP) {
-        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
-      } else {
-        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                  (nCur << 5) + nNext);
-      }
-    } else if (nCur == FX_CBP_TB) {
-      bNeedBreak = !bTabBreak;
-      if (nNext == FX_CBP_TB) {
-        eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
-      } else {
-        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                  (nCur << 5) + nNext);
-      }
-    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
-      eType = FX_LBT_DIRECT_BRK;
-    } else if (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS) {
-      eType = FX_LBT_DIRECT_BRK;
-    } else {
-      if (nNext == FX_CBP_SP) {
-        eType = FX_LBT_PROHIBITED_BRK;
-      } else {
-        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                  (nCur << 5) + nNext);
-      }
-    }
-    if (bAllChars) {
-      pCur->m_nBreakType = eType;
-    }
-    if (!bOnlyBrk) {
-      iCharWidth = pCur->m_iCharWidth;
-      FX_BOOL bBreak = FALSE;
-      if (nCur == FX_CBP_TB && bTabBreak) {
-        bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd;
-      } else {
-        bBreak = iEndPos <= m_iBoundaryEnd;
-      }
-      if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) {
-        if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
-          iBreak = iLength;
-          iBreakPos = iEndPos;
-          if (!bAllChars) {
-            return iLength;
-          }
-        } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) {
-          iIndirect = iLength;
-          iIndirectPos = iEndPos;
-        }
-        if (iLast < 0) {
-          iLast = iLength;
-          iLastPos = iEndPos;
-        }
-      }
-      if (iCharWidth > 0) {
-        iEndPos -= iCharWidth;
-      }
-    }
-    nNext = nCodeProp & 0x003F;
-    iLength--;
-  }
-  if (bOnlyBrk) {
-    return 0;
-  }
-  if (iBreak > -1) {
-    iEndPos = iBreakPos;
-    return iBreak;
-  }
-  if (iIndirect > -1) {
-    iEndPos = iIndirectPos;
-    return iIndirect;
-  }
-  if (iLast > -1) {
-    iEndPos = iLastPos;
-    return iLast;
-  }
-  return 0;
-}
-void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine,
-                                 CFX_RTFLine* pNextLine,
-                                 FX_BOOL bAllChars) {
-  FXSYS_assert(pCurLine != NULL && pNextLine != NULL);
-  int32_t iCount = pCurLine->CountChars();
-  if (iCount < 2) {
-    return;
-  }
-  int32_t iEndPos = pCurLine->GetLineEnd();
-  CFX_RTFCharArray& curChars = pCurLine->m_LineChars;
-  int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
-  if (iCharPos < 0) {
-    iCharPos = 0;
-  }
-  iCharPos++;
-  if (iCharPos >= iCount) {
-    pNextLine->RemoveAll(TRUE);
-    CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1);
-    pTC->m_nBreakType = FX_LBT_UNKNOWN;
-    return;
-  }
-  CFX_RTFCharArray& nextChars = pNextLine->m_LineChars;
-  int cur_size = curChars.GetSize();
-  nextChars.SetSize(cur_size - iCharPos);
-  FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
-               (cur_size - iCharPos) * sizeof(CFX_RTFChar));
-  iCount -= iCharPos;
-  cur_size = curChars.GetSize();
-  curChars.RemoveAt(cur_size - iCount, iCount);
-  pNextLine->m_iStart = pCurLine->m_iStart;
-  pNextLine->m_iWidth = pCurLine->GetLineEnd() - iEndPos;
-  pCurLine->m_iWidth = iEndPos;
-  CFX_RTFChar* tc = curChars.GetDataPtr(iCharPos - 1);
-  tc->m_nBreakType = FX_LBT_UNKNOWN;
-  iCount = nextChars.GetSize();
-  CFX_RTFChar* pNextChars = nextChars.GetData();
-  for (int32_t i = 0; i < iCount; i++) {
-    CFX_RTFChar* tc = pNextChars + i;
-    if (tc->GetCharType() >= FX_CHARTYPE_ArabicAlef) {
-      pCurLine->m_iArabicChars--;
-      pNextLine->m_iArabicChars++;
-    }
-    if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) {
-      pCurLine->m_iMBCSChars--;
-      pNextLine->m_iMBCSChars++;
-    }
-    tc->m_dwStatus = 0;
-  }
-}
-int32_t CFX_RTFBreak::CountBreakPieces() const {
-  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
-  if (pRTFPieces == NULL) {
-    return 0;
-  }
-  return pRTFPieces->GetSize();
-}
-const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const {
-  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
-  if (pRTFPieces == NULL) {
-    return NULL;
-  }
-  if (index < 0 || index >= pRTFPieces->GetSize()) {
-    return NULL;
-  }
-  return pRTFPieces->GetPtrAt(index);
-}
-void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const {
-  rect.top = 0;
-  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
-  if (pRTFLine == NULL) {
-    rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f;
-    rect.width = rect.height = 0;
-    return;
-  }
-  rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f;
-  rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f;
-  CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces;
-  int32_t iCount = rtfPieces.GetSize();
-  if (iCount < 1) {
-    rect.width = 0;
-    return;
-  }
-  CFX_RTFPiece* pBreakPiece;
-  int32_t iLineHeight = 0, iMax;
-  for (int32_t i = 0; i < iCount; i++) {
-    pBreakPiece = rtfPieces.GetPtrAt(i);
-    int32_t iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight *
-                                      pBreakPiece->m_iVerticalScale / 100.0f);
-    iMax = std::max(pBreakPiece->m_iFontSize, iFontHeight);
-    if (i == 0) {
-      iLineHeight = iMax;
-    } else if (iLineHeight < iMax) {
-      iLineHeight = iMax;
-    }
-  }
-  rect.height = ((FX_FLOAT)iLineHeight) / 20.0f;
-}
-void CFX_RTFBreak::ClearBreakPieces() {
-  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
-  if (pRTFLine != NULL) {
-    pRTFLine->RemoveAll(TRUE);
-  }
-  m_iReady = 0;
-}
-void CFX_RTFBreak::Reset() {
-  m_dwCharType = 0;
-  m_RTFLine1.RemoveAll(TRUE);
-  m_RTFLine2.RemoveAll(TRUE);
-}
-int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText,
-                                    FXTEXT_CHARPOS* pCharPos,
-                                    FX_BOOL bCharCode,
-                                    CFX_WideString* pWSForms,
-                                    FX_AdjustCharDisplayPos pAdjustPos) const {
-  if (pText == NULL || pText->iLength < 1) {
-    return 0;
-  }
-  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
-               pText->pFont != NULL && pText->pRect != NULL);
-  const FX_WCHAR* pStr = pText->pStr;
-  int32_t* pWidths = pText->pWidths;
-  int32_t iLength = pText->iLength - 1;
-  IFX_Font* pFont = pText->pFont;
-  FX_DWORD dwStyles = pText->dwLayoutStyles;
-  CFX_RectF rtText(*pText->pRect);
-  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
-  FX_FLOAT fFontSize = pText->fFontSize;
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  int32_t iAscent = pFont->GetAscent();
-  int32_t iDescent = pFont->GetDescent();
-  int32_t iMaxHeight = iAscent - iDescent;
-  FX_FLOAT fFontHeight = fFontSize;
-  FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight;
-  FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight;
-  FX_BOOL bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
-  FX_BOOL bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
-  FX_BOOL bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0;
-  FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
-  int32_t iRotation = GetLineRotation(dwStyles) + pText->iCharRotation;
-  int32_t iCharRotation;
-  FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm;
-  int32_t iWidth, iCharWidth, iCharHeight;
-  FX_FLOAT fX, fY, fCharWidth, fCharHeight;
-  int32_t iHorScale = pText->iHorizontalScale;
-  int32_t iVerScale = pText->iVerticalScale;
-  FX_BOOL bEmptyChar;
-  FX_DWORD dwProps, dwCharType;
-  fX = rtText.left;
-  fY = rtText.top;
-  if (bVerticalDoc) {
-    fX += (rtText.width - fFontSize) / 2.0f;
-    if (bRTLPiece) {
-      fY = rtText.bottom();
-    }
-  } else {
-    if (bRTLPiece) {
-      fX = rtText.right();
-    }
-    fY += fAscent;
-  }
-  int32_t iCount = 0;
-  for (int32_t i = 0; i <= iLength; i++) {
-    wch = *pStr++;
-    iWidth = *pWidths++;
-    if (!bMBCSCode) {
-      dwProps = FX_GetUnicodeProperties(wch);
-      dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
-      if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
-        wPrev = 0xFEFF;
-        continue;
-      }
-    } else {
-      dwProps = 0;
-      dwCharType = 0;
-    }
-    if (iWidth != 0) {
-      iCharWidth = iWidth;
-      if (iCharWidth < 0) {
-        iCharWidth = -iCharWidth;
-      }
-      if (!bMBCSCode) {
-        bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab &&
-                      dwCharType <= FX_CHARTYPE_Control);
-      } else {
-        bEmptyChar = FALSE;
-      }
-      if (!bEmptyChar) {
-        iCount++;
-      }
-      if (pCharPos != NULL) {
-        iCharWidth /= iFontSize;
-        wForm = wch;
-        if (!bMBCSCode) {
-          if (dwCharType >= FX_CHARTYPE_ArabicAlef) {
-            if (i < iLength) {
-              wNext = *pStr;
-              if (*pWidths < 0) {
-                if (i + 1 < iLength) {
-                  wNext = pStr[1];
-                }
-              }
-            } else {
-              wNext = 0xFEFF;
-            }
-            wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext);
-          } else if (bRTLPiece || bVerticalChar) {
-            wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar);
-          } else if (dwCharType == FX_CHARTYPE_Numeric && bArabicNumber) {
-            wForm = wch + 0x0630;
-          }
-          dwProps = FX_GetUnicodeProperties(wForm);
-        }
-        iCharRotation = iRotation;
-        if (!bMBCSCode && bVerticalChar && (dwProps & 0x8000) != 0) {
-          iCharRotation++;
-          iCharRotation %= 4;
-        }
-        if (!bEmptyChar) {
-          if (bCharCode) {
-            pCharPos->m_GlyphIndex = wch;
-          } else {
-            pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wForm, bMBCSCode);
-            if (pCharPos->m_GlyphIndex == 0xFFFF) {
-              pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wch, bMBCSCode);
-            }
-          }
-          pCharPos->m_ExtGID = pCharPos->m_GlyphIndex;
-          pCharPos->m_FontCharWidth = iCharWidth;
-          if (pWSForms) {
-            *pWSForms += wForm;
-          }
-        }
-        if (bVerticalDoc) {
-          iCharHeight = iCharWidth;
-          iCharWidth = 1000;
-        } else {
-          iCharHeight = 1000;
-        }
-        fCharWidth = fFontSize * iCharWidth / 1000.0f;
-        fCharHeight = fFontSize * iCharHeight / 1000.0f;
-        if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
-          if (bVerticalDoc) {
-            fY -= fCharHeight;
-          } else {
-            fX -= fCharWidth;
-          }
-        }
-        if (!bEmptyChar) {
-          CFX_PointF ptOffset;
-          FX_BOOL bAdjusted = FALSE;
-          if (pAdjustPos) {
-            bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize,
-                                   bVerticalChar, ptOffset);
-          }
-          if (!pAdjustPos && bVerticalChar && (dwProps & 0x00010000) != 0) {
-            CFX_Rect rtBBox;
-            rtBBox.Reset();
-            if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) {
-              ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f;
-              ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f;
-            }
-          }
-          pCharPos->m_OriginX = fX + ptOffset.x;
-          pCharPos->m_OriginY = fY - ptOffset.y;
-        }
-        if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
-          if (bVerticalDoc) {
-            fY += fCharHeight;
-          } else {
-            fX += fCharWidth;
-          }
-        }
-        if (!bEmptyChar) {
-          pCharPos->m_bGlyphAdjust = TRUE;
-          if (bVerticalDoc) {
-            if (iCharRotation == 0) {
-              pCharPos->m_AdjustMatrix[0] = -1;
-              pCharPos->m_AdjustMatrix[1] = 0;
-              pCharPos->m_AdjustMatrix[2] = 0;
-              pCharPos->m_AdjustMatrix[3] = 1;
-              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f;
-            } else if (iCharRotation == 1) {
-              pCharPos->m_AdjustMatrix[0] = 0;
-              pCharPos->m_AdjustMatrix[1] = -1;
-              pCharPos->m_AdjustMatrix[2] = -1;
-              pCharPos->m_AdjustMatrix[3] = 0;
-              pCharPos->m_OriginX -=
-                  fDescent + fAscent * iVerScale / 100.0f - fAscent;
-            } else if (iCharRotation == 2) {
-              pCharPos->m_AdjustMatrix[0] = 1;
-              pCharPos->m_AdjustMatrix[1] = 0;
-              pCharPos->m_AdjustMatrix[2] = 0;
-              pCharPos->m_AdjustMatrix[3] = -1;
-              pCharPos->m_OriginX += fCharWidth;
-              pCharPos->m_OriginY += fAscent;
-            } else {
-              pCharPos->m_AdjustMatrix[0] = 0;
-              pCharPos->m_AdjustMatrix[1] = 1;
-              pCharPos->m_AdjustMatrix[2] = 1;
-              pCharPos->m_AdjustMatrix[3] = 0;
-              pCharPos->m_OriginX += fAscent;
-              pCharPos->m_OriginY += fCharWidth;
-            }
-          } else {
-            if (iCharRotation == 0) {
-              pCharPos->m_AdjustMatrix[0] = -1;
-              pCharPos->m_AdjustMatrix[1] = 0;
-              pCharPos->m_AdjustMatrix[2] = 0;
-              pCharPos->m_AdjustMatrix[3] = 1;
-              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f - fAscent;
-            } else if (iCharRotation == 1) {
-              pCharPos->m_AdjustMatrix[0] = 0;
-              pCharPos->m_AdjustMatrix[1] = -1;
-              pCharPos->m_AdjustMatrix[2] = -1;
-              pCharPos->m_AdjustMatrix[3] = 0;
-              pCharPos->m_OriginX -= fDescent;
-              pCharPos->m_OriginY -= fAscent + fDescent;
-            } else if (iCharRotation == 2) {
-              pCharPos->m_AdjustMatrix[0] = 1;
-              pCharPos->m_AdjustMatrix[1] = 0;
-              pCharPos->m_AdjustMatrix[2] = 0;
-              pCharPos->m_AdjustMatrix[3] = -1;
-              pCharPos->m_OriginX += fCharWidth;
-              pCharPos->m_OriginY -= fAscent;
-            } else {
-              pCharPos->m_AdjustMatrix[0] = 0;
-              pCharPos->m_AdjustMatrix[1] = 1;
-              pCharPos->m_AdjustMatrix[2] = 1;
-              pCharPos->m_AdjustMatrix[3] = 0;
-              pCharPos->m_OriginX += fAscent * iVerScale / 100.0f;
-            }
-          }
-          if (iHorScale != 100 || iVerScale != 100) {
-            pCharPos->m_AdjustMatrix[0] =
-                pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f;
-            pCharPos->m_AdjustMatrix[1] =
-                pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f;
-            pCharPos->m_AdjustMatrix[2] =
-                pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f;
-            pCharPos->m_AdjustMatrix[3] =
-                pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
-          }
-          pCharPos++;
-        }
-      }
-    }
-    if (iWidth > 0) {
-      wPrev = wch;
-    }
-  }
-  return iCount;
-}
-int32_t CFX_RTFBreak::GetCharRects(const FX_RTFTEXTOBJ* pText,
-                                   CFX_RectFArray& rtArray,
-                                   FX_BOOL bCharBBox) const {
-  if (pText == NULL || pText->iLength < 1) {
-    return 0;
-  }
-  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
-               pText->pFont != NULL && pText->pRect != NULL);
-  const FX_WCHAR* pStr = pText->pStr;
-  int32_t* pWidths = pText->pWidths;
-  int32_t iLength = pText->iLength;
-  CFX_RectF rect(*pText->pRect);
-  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
-  FX_FLOAT fFontSize = pText->fFontSize;
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  FX_FLOAT fScale = fFontSize / 1000.0f;
-  IFX_Font* pFont = pText->pFont;
-  if (pFont == NULL) {
-    bCharBBox = FALSE;
-  }
-  CFX_Rect bbox;
-  bbox.Set(0, 0, 0, 0);
-  if (bCharBBox) {
-    bCharBBox = pFont->GetBBox(bbox);
-  }
-  FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
-  FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
-  rtArray.RemoveAll();
-  rtArray.SetSize(iLength);
-  FX_DWORD dwStyles = pText->dwLayoutStyles;
-  FX_BOOL bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
-  FX_BOOL bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
-  FX_BOOL bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
-  FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar;
-  int32_t iCharSize;
-  FX_FLOAT fCharSize, fStart;
-  if (bVertical) {
-    fStart = bRTLPiece ? rect.bottom() : rect.top;
-  } else {
-    fStart = bRTLPiece ? rect.right() : rect.left;
-  }
-  for (int32_t i = 0; i < iLength; i++) {
-    wch = *pStr++;
-    iCharSize = *pWidths++;
-    fCharSize = (FX_FLOAT)iCharSize / 20000.0f;
-    FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch));
-    if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 ||
-          (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) {
-      bRet = FALSE;
-    }
-    if (bRet) {
-      iCharSize = iFontSize * 500;
-      fCharSize = fFontSize / 2.0f;
-    }
-    if (bVertical) {
-      rect.top = fStart;
-      if (bRTLPiece) {
-        rect.top -= fCharSize;
-        fStart -= fCharSize;
-      } else {
-        fStart += fCharSize;
-      }
-      rect.height = fCharSize;
-    } else {
-      rect.left = fStart;
-      if (bRTLPiece) {
-        rect.left -= fCharSize;
-        fStart -= fCharSize;
-      } else {
-        fStart += fCharSize;
-      }
-      rect.width = fCharSize;
-    }
-    if (bCharBBox && !bRet) {
-      int32_t iCharWidth = 1000;
-      pFont->GetCharWidth(wch, iCharWidth);
-      FX_FLOAT fRTLeft = 0, fCharWidth = 0;
-      if (iCharWidth > 0) {
-        fCharWidth = iCharWidth * fScale;
-        fRTLeft = fLeft;
-        if (bCombText) {
-          fRTLeft = (rect.width - fCharWidth) / 2.0f;
-        }
-      }
-      CFX_RectF rtBBoxF;
-      if (bVertical) {
-        rtBBoxF.top = rect.left + fRTLeft;
-        rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f;
-        rtBBoxF.height = fCharWidth;
-        rtBBoxF.width = fHeight;
-        rtBBoxF.left = std::max(rtBBoxF.left, 0.0f);
-      } else {
-        rtBBoxF.left = rect.left + fRTLeft;
-        rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f;
-        rtBBoxF.width = fCharWidth;
-        rtBBoxF.height = fHeight;
-        rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
-      }
-      rtArray.SetAt(i, rtBBoxF);
-      continue;
-    }
-    rtArray.SetAt(i, rect);
-  }
-  return iLength;
-}
diff --git a/xfa/src/fgas/layout/fgas_rtfbreak.h b/xfa/src/fgas/layout/fgas_rtfbreak.h
deleted file mode 100644
index 24cf2e3..0000000
--- a/xfa/src/fgas/layout/fgas_rtfbreak.h
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LAYOUT_FGAS_RTFBREAK_H_
-#define XFA_SRC_FGAS_LAYOUT_FGAS_RTFBREAK_H_
-
-#include "core/include/fxcrt/fx_ucd.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fgas/crt/fgas_memory.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-#include "xfa/src/fgas/layout/fgas_textbreak.h"
-#include "xfa/src/fgas/layout/fgas_unicode.h"
-
-class IFX_Unknown;
-class IFX_Font;
-
-#define FX_RTFBREAKPOLICY_None 0x00
-#define FX_RTFBREAKPOLICY_SpaceBreak 0x01
-#define FX_RTFBREAKPOLICY_NumberBreak 0x02
-#define FX_RTFBREAKPOLICY_InfixBreak 0x04
-#define FX_RTFBREAKPOLICY_TabBreak 0x08
-#define FX_RTFBREAKPOLICY_OrphanPositionedTab 0x10
-#define FX_RTFBREAK_None 0x00
-#define FX_RTFBREAK_PieceBreak 0x01
-#define FX_RTFBREAK_LineBreak 0x02
-#define FX_RTFBREAK_ParagraphBreak 0x03
-#define FX_RTFBREAK_PageBreak 0x04
-#define FX_RTFLAYOUTSTYLE_Pagination 0x01
-#define FX_RTFLAYOUTSTYLE_VerticalLayout 0x02
-#define FX_RTFLAYOUTSTYLE_VerticalChars 0x04
-#define FX_RTFLAYOUTSTYLE_LineDirection 0x08
-#define FX_RTFLAYOUTSTYLE_ExpandTab 0x10
-#define FX_RTFLAYOUTSTYLE_ArabicNumber 0x20
-#define FX_RTFLAYOUTSTYLE_SingleLine 0x40
-#define FX_RTFLAYOUTSTYLE_MBCSCode 0x80
-#define FX_RTFCHARSTYLE_Alignment 0x000F
-#define FX_RTFCHARSTYLE_ArabicNumber 0x0010
-#define FX_RTFCHARSTYLE_ArabicShadda 0x0020
-#define FX_RTFCHARSTYLE_OddBidiLevel 0x0040
-#define FX_RTFCHARSTYLE_RTLReadingOrder 0x0080
-#define FX_RTFCHARSTYLE_ArabicContext 0x0300
-#define FX_RTFCHARSTYLE_ArabicIndic 0x0400
-#define FX_RTFCHARSTYLE_ArabicComma 0x0800
-#define FX_RTFLINEALIGNMENT_Left 0
-#define FX_RTFLINEALIGNMENT_Center 1
-#define FX_RTFLINEALIGNMENT_Right 2
-#define FX_RTFLINEALIGNMENT_Justified (1 << 2)
-#define FX_RTFLINEALIGNMENT_Distributed (2 << 2)
-#define FX_RTFLINEALIGNMENT_JustifiedLeft \
-  (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Justified)
-#define FX_RTFLINEALIGNMENT_JustifiedCenter \
-  (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Justified)
-#define FX_RTFLINEALIGNMENT_JustifiedRight \
-  (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Justified)
-#define FX_RTFLINEALIGNMENT_DistributedLeft \
-  (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Distributed)
-#define FX_RTFLINEALIGNMENT_DistributedCenter \
-  (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Distributed)
-#define FX_RTFLINEALIGNMENT_DistributedRight \
-  (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Distributed)
-#define FX_RTFLINEALIGNMENT_LowerMask 0x03
-#define FX_RTFLINEALIGNMENT_HigherMask 0x0C
-
-struct FX_RTFTEXTOBJ {
-  FX_RTFTEXTOBJ() {
-    pStr = NULL;
-    pWidths = NULL;
-    iLength = 0;
-    pFont = NULL;
-    fFontSize = 12.0f;
-    dwLayoutStyles = 0;
-    iCharRotation = 0;
-    iBidiLevel = 0;
-    pRect = NULL;
-    wLineBreakChar = L'\n';
-    iHorizontalScale = 100;
-    iVerticalScale = 100;
-  }
-
-  const FX_WCHAR* pStr;
-  int32_t* pWidths;
-  int32_t iLength;
-  IFX_Font* pFont;
-  FX_FLOAT fFontSize;
-  FX_DWORD dwLayoutStyles;
-  int32_t iCharRotation;
-  int32_t iBidiLevel;
-  const CFX_RectF* pRect;
-  FX_WCHAR wLineBreakChar;
-  int32_t iHorizontalScale;
-  int32_t iVerticalScale;
-};
-
-class CFX_RTFPiece : public CFX_Target {
- public:
-  CFX_RTFPiece()
-      : m_dwStatus(FX_RTFBREAK_PieceBreak),
-        m_iStartPos(0),
-        m_iWidth(-1),
-        m_iStartChar(0),
-        m_iChars(0),
-        m_iBidiLevel(0),
-        m_iBidiPos(0),
-        m_iFontSize(0),
-        m_iFontHeight(0),
-        m_iHorizontalScale(100),
-        m_iVerticalScale(100),
-        m_dwLayoutStyles(0),
-        m_dwIdentity(0),
-        m_pChars(NULL),
-        m_pUserData(NULL) {}
-  ~CFX_RTFPiece() { Reset(); }
-  void AppendChar(const CFX_RTFChar& tc) {
-    FXSYS_assert(m_pChars != NULL);
-    m_pChars->Add(tc);
-    if (m_iWidth < 0) {
-      m_iWidth = tc.m_iCharWidth;
-    } else {
-      m_iWidth += tc.m_iCharWidth;
-    }
-    m_iChars++;
-  }
-  int32_t GetEndPos() const {
-    return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
-  }
-  int32_t GetLength() const { return m_iChars; }
-  int32_t GetEndChar() const { return m_iStartChar + m_iChars; }
-  CFX_RTFChar& GetChar(int32_t index) {
-    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
-    return *m_pChars->GetDataPtr(m_iStartChar + index);
-  }
-  CFX_RTFChar* GetCharPtr(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
-    return m_pChars->GetDataPtr(m_iStartChar + index);
-  }
-  void GetString(FX_WCHAR* pText) const {
-    FXSYS_assert(pText != NULL);
-    int32_t iEndChar = m_iStartChar + m_iChars;
-    CFX_RTFChar* pChar;
-    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
-      pChar = m_pChars->GetDataPtr(i);
-      *pText++ = (FX_WCHAR)pChar->m_wCharCode;
-    }
-  }
-  void GetString(CFX_WideString& wsText) const {
-    FX_WCHAR* pText = wsText.GetBuffer(m_iChars);
-    GetString(pText);
-    wsText.ReleaseBuffer(m_iChars);
-  }
-  void GetWidths(int32_t* pWidths) const {
-    FXSYS_assert(pWidths != NULL);
-    int32_t iEndChar = m_iStartChar + m_iChars;
-    CFX_RTFChar* pChar;
-    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
-      pChar = m_pChars->GetDataPtr(i);
-      *pWidths++ = pChar->m_iCharWidth;
-    }
-  }
-  void Reset() {
-    m_dwStatus = FX_RTFBREAK_PieceBreak;
-    if (m_iWidth > -1) {
-      m_iStartPos += m_iWidth;
-    }
-    m_iWidth = -1;
-    m_iStartChar += m_iChars;
-    m_iChars = 0;
-    m_iBidiLevel = 0;
-    m_iBidiPos = 0;
-    m_iHorizontalScale = 100;
-    m_iVerticalScale = 100;
-  }
-  FX_DWORD m_dwStatus;
-  int32_t m_iStartPos;
-  int32_t m_iWidth;
-  int32_t m_iStartChar;
-  int32_t m_iChars;
-  int32_t m_iBidiLevel;
-  int32_t m_iBidiPos;
-  int32_t m_iFontSize;
-  int32_t m_iFontHeight;
-  int32_t m_iHorizontalScale;
-  int32_t m_iVerticalScale;
-  FX_DWORD m_dwLayoutStyles;
-  FX_DWORD m_dwIdentity;
-  CFX_RTFCharArray* m_pChars;
-  IFX_Unknown* m_pUserData;
-};
-typedef CFX_BaseArrayTemplate<CFX_RTFPiece> CFX_RTFPieceArray;
-
-class IFX_RTFBreak {
- public:
-  static IFX_RTFBreak* Create(FX_DWORD dwPolicies);
-  virtual ~IFX_RTFBreak() {}
-  virtual void Release() = 0;
-  virtual void SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) = 0;
-  virtual void SetLineStartPos(FX_FLOAT fLinePos) = 0;
-  virtual FX_DWORD GetLayoutStyles() const = 0;
-  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;
-  virtual void SetFont(IFX_Font* pFont) = 0;
-  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
-  virtual void SetTabWidth(FX_FLOAT fTabWidth) = 0;
-  virtual void AddPositionedTab(FX_FLOAT fTabPos) = 0;
-  virtual void SetPositionedTabs(const CFX_FloatArray& tabs) = 0;
-  virtual void ClearPositionedTabs() = 0;
-  virtual void SetDefaultChar(FX_WCHAR wch) = 0;
-  virtual void SetLineBreakChar(FX_WCHAR wch) = 0;
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
-  virtual void SetHorizontalScale(int32_t iScale) = 0;
-  virtual void SetVerticalScale(int32_t iScale) = 0;
-  virtual void SetCharRotation(int32_t iCharRotation) = 0;
-  virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0;
-  virtual void SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) = 0;
-  virtual void SetReadingOrder(FX_BOOL bRTL = FALSE) = 0;
-  virtual void SetAlignment(int32_t iAlignment = FX_RTFLINEALIGNMENT_Left) = 0;
-  virtual void SetUserData(IFX_Unknown* pUserData) = 0;
-  virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0;
-  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) = 0;
-  virtual int32_t CountBreakPieces() const = 0;
-  virtual const CFX_RTFPiece* GetBreakPiece(int32_t index) const = 0;
-  virtual void GetLineRect(CFX_RectF& rect) const = 0;
-  virtual void ClearBreakPieces() = 0;
-  virtual void Reset() = 0;
-  virtual int32_t GetDisplayPos(
-      const FX_RTFTEXTOBJ* pText,
-      FXTEXT_CHARPOS* pCharPos,
-      FX_BOOL bCharCode = FALSE,
-      CFX_WideString* pWSForms = NULL,
-      FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;
-  virtual int32_t GetCharRects(const FX_RTFTEXTOBJ* pText,
-                               CFX_RectFArray& rtArray,
-                               FX_BOOL bCharBBox = FALSE) const = 0;
-};
-
-#endif  // XFA_SRC_FGAS_LAYOUT_FGAS_RTFBREAK_H_
diff --git a/xfa/src/fgas/layout/fgas_textbreak.cpp b/xfa/src/fgas/layout/fgas_textbreak.cpp
deleted file mode 100644
index af7be50..0000000
--- a/xfa/src/fgas/layout/fgas_textbreak.cpp
+++ /dev/null
@@ -1,1824 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/layout/fgas_textbreak.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_arb.h"
-#include "core/include/fxcrt/fx_memory.h"
-#include "xfa/src/fgas/layout/fgas_linebreak.h"
-#include "xfa/src/fgas/layout/fgas_unicode.h"
-
-namespace {
-
-class CFX_TxtLine {
- public:
-  CFX_TxtLine(int32_t iBlockSize)
-      : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {
-    m_pLineChars = new CFX_TxtCharArray;
-    m_pLinePieces = new CFX_TxtPieceArray(16);
-  }
-  ~CFX_TxtLine() {
-    RemoveAll();
-    delete m_pLineChars;
-    delete m_pLinePieces;
-  }
-  int32_t CountChars() const { return m_pLineChars->GetSize(); }
-  CFX_TxtChar* GetCharPtr(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_pLineChars->GetSize());
-    return m_pLineChars->GetDataPtr(index);
-  }
-  int32_t CountPieces() const { return m_pLinePieces->GetSize(); }
-  CFX_TxtPiece* GetPiecePtr(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_pLinePieces->GetSize());
-    return m_pLinePieces->GetPtrAt(index);
-  }
-  void GetString(CFX_WideString& wsStr) const {
-    int32_t iCount = m_pLineChars->GetSize();
-    FX_WCHAR* pBuf = wsStr.GetBuffer(iCount);
-    CFX_Char* pChar;
-    for (int32_t i = 0; i < iCount; i++) {
-      pChar = m_pLineChars->GetDataPtr(i);
-      *pBuf++ = (FX_WCHAR)pChar->m_wCharCode;
-    }
-    wsStr.ReleaseBuffer(iCount);
-  }
-  void RemoveAll(FX_BOOL bLeaveMemory = FALSE) {
-    m_pLineChars->RemoveAll();
-    m_pLinePieces->RemoveAll(bLeaveMemory);
-    m_iWidth = 0;
-    m_iArabicChars = 0;
-  }
-  CFX_TxtCharArray* m_pLineChars;
-  CFX_TxtPieceArray* m_pLinePieces;
-  int32_t m_iStart;
-  int32_t m_iWidth;
-  int32_t m_iArabicChars;
-};
-
-class CFX_TxtBreak : public IFX_TxtBreak {
- public:
-  CFX_TxtBreak(FX_DWORD dwPolicies);
-  ~CFX_TxtBreak();
-  virtual void Release() { delete this; }
-  virtual void SetLineWidth(FX_FLOAT fLineWidth);
-  virtual void SetLinePos(FX_FLOAT fLinePos);
-  virtual FX_DWORD GetLayoutStyles() const { return m_dwLayoutStyles; }
-  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles);
-  virtual void SetFont(IFX_Font* pFont);
-  virtual void SetFontSize(FX_FLOAT fFontSize);
-  virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
-  virtual void SetDefaultChar(FX_WCHAR wch);
-  virtual void SetParagraphBreakChar(FX_WCHAR wch);
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
-  virtual void SetHorizontalScale(int32_t iScale);
-  virtual void SetVerticalScale(int32_t iScale);
-  virtual void SetCharRotation(int32_t iCharRotation);
-  virtual void SetCharSpace(FX_FLOAT fCharSpace);
-  virtual void SetAlignment(int32_t iAlignment);
-  virtual FX_DWORD GetContextCharStyles() const;
-  virtual void SetContextCharStyles(FX_DWORD dwCharStyles);
-  virtual void SetCombWidth(FX_FLOAT fCombWidth);
-  virtual void SetUserData(void* pUserData);
-  virtual FX_DWORD AppendChar(FX_WCHAR wch);
-  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak);
-  virtual int32_t CountBreakChars() const;
-  virtual int32_t CountBreakPieces() const;
-  virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const;
-  virtual void ClearBreakPieces();
-  virtual void Reset();
-  virtual int32_t GetDisplayPos(
-      const FX_TXTRUN* pTxtRun,
-      FXTEXT_CHARPOS* pCharPos,
-      FX_BOOL bCharCode = FALSE,
-      CFX_WideString* pWSForms = NULL,
-      FX_AdjustCharDisplayPos pAdjustPos = NULL) const;
-  virtual int32_t GetCharRects(const FX_TXTRUN* pTxtRun,
-                               CFX_RectFArray& rtArray,
-                               FX_BOOL bCharBBox = FALSE) const;
-  void AppendChar_PageLoad(CFX_Char* pCurChar, FX_DWORD dwProps);
-  FX_DWORD AppendChar_Combination(CFX_Char* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Control(CFX_Char* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Arabic(CFX_Char* pCurChar, int32_t iRotation);
-  FX_DWORD AppendChar_Others(CFX_Char* pCurChar, int32_t iRotation);
-
- protected:
-  FX_DWORD m_dwPolicies;
-  FX_BOOL m_bPagination;
-  IFX_ArabicChar* m_pArabicChar;
-  int32_t m_iLineWidth;
-  FX_DWORD m_dwLayoutStyles;
-  FX_BOOL m_bVertical;
-  FX_BOOL m_bArabicContext;
-  FX_BOOL m_bArabicShapes;
-  FX_BOOL m_bRTL;
-  FX_BOOL m_bSingleLine;
-  FX_BOOL m_bCombText;
-  int32_t m_iArabicContext;
-  int32_t m_iCurArabicContext;
-  IFX_Font* m_pFont;
-  int32_t m_iFontSize;
-  FX_BOOL m_bEquidistant;
-  int32_t m_iTabWidth;
-  FX_WCHAR m_wDefChar;
-  FX_WCHAR m_wParagBreakChar;
-  int32_t m_iDefChar;
-  int32_t m_iLineRotation;
-  int32_t m_iCharRotation;
-  int32_t m_iRotation;
-  int32_t m_iAlignment;
-  FX_DWORD m_dwContextCharStyles;
-  int32_t m_iCombWidth;
-  void* m_pUserData;
-  FX_DWORD m_dwCharType;
-  FX_BOOL m_bCurRTL;
-  int32_t m_iCurAlignment;
-  FX_BOOL m_bArabicNumber;
-  FX_BOOL m_bArabicComma;
-  CFX_TxtLine* m_pTxtLine1;
-  CFX_TxtLine* m_pTxtLine2;
-  CFX_TxtLine* m_pCurLine;
-  int32_t m_iReady;
-  int32_t m_iTolerance;
-  int32_t m_iHorScale;
-  int32_t m_iVerScale;
-  int32_t m_iCharSpace;
-  void SetBreakStatus();
-  int32_t GetLineRotation(FX_DWORD dwStyles) const;
-  CFX_TxtChar* GetLastChar(int32_t index, FX_BOOL bOmitChar = TRUE) const;
-  CFX_TxtLine* GetTxtLine(FX_BOOL bReady) const;
-  CFX_TxtPieceArray* GetTxtPieces(FX_BOOL bReady) const;
-  FX_DWORD GetUnifiedCharType(FX_DWORD dwType) const;
-  void ResetArabicContext();
-  void ResetContextCharStyles();
-  void EndBreak_UpdateArabicShapes();
-  FX_BOOL EndBreak_SplitLine(CFX_TxtLine* pNextLine,
-                             FX_BOOL bAllChars,
-                             FX_DWORD dwStatus);
-  void EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus);
-  void EndBreak_Alignment(CFX_TPOArray& tpos,
-                          FX_BOOL bAllChars,
-                          FX_DWORD dwStatus);
-  int32_t GetBreakPos(CFX_TxtCharArray& ca,
-                      int32_t& iEndPos,
-                      FX_BOOL bAllChars = FALSE,
-                      FX_BOOL bOnlyBrk = FALSE);
-  void SplitTextLine(CFX_TxtLine* pCurLine,
-                     CFX_TxtLine* pNextLine,
-                     FX_BOOL bAllChars = FALSE);
-};
-
-}  // namespace
-
-extern const FX_LINEBREAKTYPE gs_FX_LineBreak_PairTable[64][32];
-IFX_TxtBreak* IFX_TxtBreak::Create(FX_DWORD dwPolicies) {
-  return new CFX_TxtBreak(dwPolicies);
-}
-CFX_TxtBreak::CFX_TxtBreak(FX_DWORD dwPolicies)
-    : m_dwPolicies(dwPolicies),
-      m_pArabicChar(NULL),
-      m_iLineWidth(2000000),
-      m_dwLayoutStyles(0),
-      m_bVertical(FALSE),
-      m_bArabicContext(FALSE),
-      m_bArabicShapes(FALSE),
-      m_bRTL(FALSE),
-      m_bSingleLine(FALSE),
-      m_bCombText(FALSE),
-      m_iArabicContext(1),
-      m_iCurArabicContext(1),
-      m_pFont(NULL),
-      m_iFontSize(240),
-      m_bEquidistant(TRUE),
-      m_iTabWidth(720000),
-      m_wDefChar(0xFEFF),
-      m_wParagBreakChar(L'\n'),
-      m_iDefChar(0),
-      m_iLineRotation(0),
-      m_iCharRotation(0),
-      m_iRotation(0),
-      m_iAlignment(FX_TXTLINEALIGNMENT_Left),
-      m_dwContextCharStyles(0),
-      m_iCombWidth(360000),
-      m_pUserData(NULL),
-      m_dwCharType(0),
-      m_bArabicNumber(FALSE),
-      m_bArabicComma(FALSE),
-      m_pCurLine(NULL),
-      m_iReady(0),
-      m_iTolerance(0),
-      m_iHorScale(100),
-      m_iVerScale(100),
-      m_iCharSpace(0) {
-  m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0;
-  m_pArabicChar = IFX_ArabicChar::Create();
-  if (m_bPagination) {
-    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_Char));
-    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_Char));
-  } else {
-    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_TxtChar));
-    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_TxtChar));
-  }
-  m_pCurLine = m_pTxtLine1;
-  ResetArabicContext();
-}
-CFX_TxtBreak::~CFX_TxtBreak() {
-  Reset();
-  delete m_pTxtLine1;
-  delete m_pTxtLine2;
-  m_pArabicChar->Release();
-}
-void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) {
-  m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f);
-  FXSYS_assert(m_iLineWidth >= 20000);
-}
-void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) {
-  int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
-  if (iLinePos < 0) {
-    iLinePos = 0;
-  }
-  if (iLinePos > m_iLineWidth) {
-    iLinePos = m_iLineWidth;
-  }
-  m_pCurLine->m_iStart = iLinePos;
-  m_pCurLine->m_iWidth += iLinePos;
-}
-void CFX_TxtBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) {
-  m_dwLayoutStyles = dwLayoutStyles;
-  m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0;
-  m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0;
-  m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0;
-  m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0;
-  m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0;
-  m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
-  ResetArabicContext();
-  m_iLineRotation = GetLineRotation(m_dwLayoutStyles);
-  m_iRotation = m_iLineRotation + m_iCharRotation;
-  m_iRotation %= 4;
-}
-void CFX_TxtBreak::SetFont(IFX_Font* pFont) {
-  if (pFont == NULL) {
-    return;
-  }
-  if (m_pFont == pFont) {
-    return;
-  }
-  SetBreakStatus();
-  m_pFont = pFont;
-  m_iDefChar = 0;
-  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
-    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-    m_iDefChar *= m_iFontSize;
-  }
-}
-void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) {
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  if (m_iFontSize == iFontSize) {
-    return;
-  }
-  SetBreakStatus();
-  m_iFontSize = iFontSize;
-  m_iDefChar = 0;
-  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
-    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-    m_iDefChar *= m_iFontSize;
-  }
-}
-void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
-  m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
-  if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) {
-    m_iTabWidth = FX_TXTBREAK_MinimumTabWidth;
-  }
-  m_bEquidistant = bEquidistant;
-}
-void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) {
-  m_wDefChar = wch;
-  m_iDefChar = 0;
-  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
-    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
-    if (m_iDefChar < 0) {
-      m_iDefChar = 0;
-    } else {
-      m_iDefChar *= m_iFontSize;
-    }
-  }
-}
-void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) {
-  if (wch != L'\r' && wch != L'\n') {
-    return;
-  }
-  m_wParagBreakChar = wch;
-}
-void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
-  m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
-}
-void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) {
-  if (iCharRotation < 0) {
-    iCharRotation += (-iCharRotation / 4 + 1) * 4;
-  } else if (iCharRotation > 3) {
-    iCharRotation -= (iCharRotation / 4) * 4;
-  }
-  if (m_iCharRotation == iCharRotation) {
-    return;
-  }
-  SetBreakStatus();
-  m_iCharRotation = iCharRotation;
-  m_iRotation = m_iLineRotation + m_iCharRotation;
-  m_iRotation %= 4;
-}
-void CFX_TxtBreak::SetAlignment(int32_t iAlignment) {
-  FXSYS_assert(iAlignment >= FX_TXTLINEALIGNMENT_Left &&
-               iAlignment <= FX_TXTLINEALIGNMENT_Distributed);
-  m_iAlignment = iAlignment;
-  ResetArabicContext();
-}
-void CFX_TxtBreak::ResetContextCharStyles() {
-  m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment;
-  if (m_bArabicNumber) {
-    m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber;
-  }
-  if (m_bArabicComma) {
-    m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma;
-  }
-  if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) {
-    m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder;
-  }
-  m_dwContextCharStyles |= (m_iArabicContext << 8);
-}
-FX_DWORD CFX_TxtBreak::GetContextCharStyles() const {
-  return m_dwContextCharStyles;
-}
-void CFX_TxtBreak::SetContextCharStyles(FX_DWORD dwCharStyles) {
-  m_iCurAlignment = dwCharStyles & 0x0F;
-  m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0;
-  m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0;
-  m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0;
-  m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8);
-  ResetContextCharStyles();
-}
-void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) {
-  m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f);
-}
-void CFX_TxtBreak::SetUserData(void* pUserData) {
-  if (m_pUserData == pUserData) {
-    return;
-  }
-  SetBreakStatus();
-  m_pUserData = pUserData;
-}
-void CFX_TxtBreak::SetBreakStatus() {
-  if (m_bPagination) {
-    return;
-  }
-  int32_t iCount = m_pCurLine->CountChars();
-  if (iCount < 1) {
-    return;
-  }
-  CFX_TxtChar* pTC = (CFX_TxtChar*)m_pCurLine->GetCharPtr(iCount - 1);
-  if (pTC->m_dwStatus == 0) {
-    pTC->m_dwStatus = FX_TXTBREAK_PieceBreak;
-  }
-}
-void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) {
-  if (iScale < 0) {
-    iScale = 0;
-  }
-  if (iScale == m_iHorScale) {
-    return;
-  }
-  SetBreakStatus();
-  m_iHorScale = iScale;
-}
-void CFX_TxtBreak::SetVerticalScale(int32_t iScale) {
-  if (iScale < 0) {
-    iScale = 0;
-  }
-  if (iScale == m_iHorScale) {
-    return;
-  }
-  SetBreakStatus();
-  m_iVerScale = iScale;
-}
-void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) {
-  m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
-}
-static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
-int32_t CFX_TxtBreak::GetLineRotation(FX_DWORD dwStyles) const {
-  return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1];
-}
-CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const {
-  CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars;
-  int32_t iCount = ca.GetSize();
-  if (index < 0 || index >= iCount) {
-    return NULL;
-  }
-  CFX_TxtChar* pTC;
-  int32_t iStart = iCount - 1;
-  while (iStart > -1) {
-    pTC = ca.GetDataPtr(iStart--);
-    if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) {
-      continue;
-    }
-    if (--index < 0) {
-      return pTC;
-    }
-  }
-  return NULL;
-}
-CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const {
-  if (!bReady) {
-    return m_pCurLine;
-  }
-  if (m_iReady == 1) {
-    return m_pTxtLine1;
-  } else if (m_iReady == 2) {
-    return m_pTxtLine2;
-  } else {
-    return NULL;
-  }
-}
-CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const {
-  CFX_TxtLine* pTxtLine = GetTxtLine(bReady);
-  if (pTxtLine == NULL) {
-    return NULL;
-  }
-  return pTxtLine->m_pLinePieces;
-}
-inline FX_DWORD CFX_TxtBreak::GetUnifiedCharType(FX_DWORD dwType) const {
-  return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType;
-}
-void CFX_TxtBreak::ResetArabicContext() {
-  if (m_bArabicContext) {
-    m_bCurRTL = m_iCurArabicContext > 1;
-    m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right
-                                              : FX_TXTLINEALIGNMENT_Left;
-    m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask);
-    m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes;
-  } else {
-    if (m_bPagination) {
-      m_bCurRTL = FALSE;
-      m_iCurAlignment = 0;
-    } else {
-      m_bCurRTL = m_bRTL;
-      m_iCurAlignment = m_iAlignment;
-    }
-    if (m_bRTL) {
-      m_bArabicNumber = m_iArabicContext >= 1;
-    } else {
-      m_bArabicNumber = m_iArabicContext > 1;
-    }
-    m_bArabicNumber = m_bArabicNumber && m_bArabicShapes;
-  }
-  m_bArabicComma = m_bArabicNumber;
-  ResetContextCharStyles();
-}
-void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, FX_DWORD dwProps) {
-  if (!m_bPagination) {
-    ((CFX_TxtChar*)pCurChar)->m_dwStatus = 0;
-    ((CFX_TxtChar*)pCurChar)->m_pUserData = m_pUserData;
-  }
-  if (m_bArabicContext || m_bArabicShapes) {
-    int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
-    int32_t iArabicContext =
-        (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL)
-            ? 2
-            : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0
-                                                                          : 1);
-    if (iArabicContext != m_iArabicContext && iArabicContext != 1) {
-      m_iArabicContext = iArabicContext;
-      if (m_iCurArabicContext == 1) {
-        m_iCurArabicContext = iArabicContext;
-      }
-      ResetArabicContext();
-      if (!m_bPagination) {
-        CFX_TxtChar* pLastChar = (CFX_TxtChar*)GetLastChar(1, FALSE);
-        if (pLastChar != NULL && pLastChar->m_dwStatus < 1) {
-          pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak;
-        }
-      }
-    }
-  }
-  pCurChar->m_dwCharStyles = m_dwContextCharStyles;
-}
-FX_DWORD CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar,
-                                              int32_t iRotation) {
-  FXSYS_assert(pCurChar != NULL);
-  FX_WCHAR wch = pCurChar->m_wCharCode;
-  FX_WCHAR wForm;
-  int32_t iCharWidth = 0;
-  CFX_Char* pLastChar;
-  pCurChar->m_iCharWidth = -1;
-  if (m_bCombText) {
-    iCharWidth = m_iCombWidth;
-  } else {
-    if (m_bVertical != FX_IsOdd(iRotation)) {
-      iCharWidth = 1000;
-    } else {
-      wForm = wch;
-      if (!m_bPagination) {
-        pLastChar = GetLastChar(0, FALSE);
-        if (pLastChar != NULL &&
-            (((CFX_TxtChar*)pLastChar)->m_dwCharStyles &
-             FX_TXTCHARSTYLE_ArabicShadda) == 0) {
-          FX_BOOL bShadda = FALSE;
-          if (wch == 0x0651) {
-            FX_WCHAR wLast = pLastChar->m_wCharCode;
-            if (wLast >= 0x064C && wLast <= 0x0650) {
-              wForm = FX_GetArabicFromShaddaTable(wLast);
-              bShadda = TRUE;
-            }
-          } else if (wch >= 0x064C && wch <= 0x0650) {
-            if (pLastChar->m_wCharCode == 0x0651) {
-              wForm = FX_GetArabicFromShaddaTable(wch);
-              bShadda = TRUE;
-            }
-          }
-          if (bShadda) {
-            ((CFX_TxtChar*)pLastChar)->m_dwCharStyles |=
-                FX_TXTCHARSTYLE_ArabicShadda;
-            ((CFX_TxtChar*)pLastChar)->m_iCharWidth = 0;
-            ((CFX_TxtChar*)pCurChar)->m_dwCharStyles |=
-                FX_TXTCHARSTYLE_ArabicShadda;
-          }
-        }
-      }
-      if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
-        iCharWidth = 0;
-      }
-    }
-    iCharWidth *= m_iFontSize;
-    iCharWidth = iCharWidth * m_iHorScale / 100;
-  }
-  pCurChar->m_iCharWidth = -iCharWidth;
-  return FX_TXTBREAK_None;
-}
-FX_DWORD CFX_TxtBreak::AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation) {
-  m_dwCharType = FX_CHARTYPE_Tab;
-  if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) {
-    return FX_TXTBREAK_None;
-  }
-  int32_t& iLineWidth = m_pCurLine->m_iWidth;
-  int32_t iCharWidth;
-  if (m_bCombText) {
-    iCharWidth = m_iCombWidth;
-  } else {
-    if (m_bEquidistant) {
-      iCharWidth = iLineWidth;
-      iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth;
-      if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) {
-        iCharWidth += m_iTabWidth;
-      }
-    } else {
-      iCharWidth = m_iTabWidth;
-    }
-  }
-  pCurChar->m_iCharWidth = iCharWidth;
-  iLineWidth += iCharWidth;
-  if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) {
-    return EndBreak(FX_TXTBREAK_LineBreak);
-  }
-  return FX_TXTBREAK_None;
-}
-FX_DWORD CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar,
-                                          int32_t iRotation) {
-  m_dwCharType = FX_CHARTYPE_Control;
-  FX_DWORD dwRet = FX_TXTBREAK_None;
-  if (!m_bSingleLine) {
-    FX_WCHAR wch = pCurChar->m_wCharCode;
-    switch (wch) {
-      case L'\v':
-      case 0x2028:
-        dwRet = FX_TXTBREAK_LineBreak;
-        break;
-      case L'\f':
-        dwRet = FX_TXTBREAK_PageBreak;
-        break;
-      case 0x2029:
-        dwRet = FX_TXTBREAK_ParagraphBreak;
-        break;
-      default:
-        if (wch == m_wParagBreakChar) {
-          dwRet = FX_TXTBREAK_ParagraphBreak;
-        }
-        break;
-    }
-    if (dwRet != FX_TXTBREAK_None) {
-      dwRet = EndBreak(dwRet);
-    }
-  }
-  return dwRet;
-}
-FX_DWORD CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar,
-                                         int32_t iRotation) {
-  FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK);
-  int32_t& iLineWidth = m_pCurLine->m_iWidth;
-  FX_WCHAR wForm;
-  int32_t iCharWidth = 0;
-  CFX_Char* pLastChar = NULL;
-  FX_BOOL bAlef = FALSE;
-  if (!m_bCombText && m_dwCharType >= FX_CHARTYPE_ArabicAlef &&
-      m_dwCharType <= FX_CHARTYPE_ArabicDistortion) {
-    pLastChar = GetLastChar(1);
-    if (pLastChar != NULL) {
-      iCharWidth = pLastChar->m_iCharWidth;
-      if (iCharWidth > 0) {
-        iLineWidth -= iCharWidth;
-      }
-      CFX_Char* pPrevChar = GetLastChar(2);
-      wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar);
-      bAlef = (wForm == 0xFEFF &&
-               pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef);
-      int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation;
-      if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) {
-        iLastRotation++;
-      }
-      if (m_bVertical != FX_IsOdd(iLastRotation)) {
-        iCharWidth = 1000;
-      } else {
-        m_pFont->GetCharWidth(wForm, iCharWidth, FALSE);
-      }
-      if (wForm == 0xFEFF) {
-        iCharWidth = m_iDefChar;
-      }
-      iCharWidth *= m_iFontSize;
-      iCharWidth = iCharWidth * m_iHorScale / 100;
-      pLastChar->m_iCharWidth = iCharWidth;
-      iLineWidth += iCharWidth;
-      iCharWidth = 0;
-    }
-  }
-  m_dwCharType = dwType;
-  wForm = m_pArabicChar->GetFormChar(pCurChar, bAlef ? NULL : pLastChar, NULL);
-  if (m_bCombText) {
-    iCharWidth = m_iCombWidth;
-  } else {
-    if (m_bVertical != FX_IsOdd(iRotation)) {
-      iCharWidth = 1000;
-    } else {
-      m_pFont->GetCharWidth(wForm, iCharWidth, FALSE);
-    }
-    if (wForm == 0xFEFF) {
-      iCharWidth = m_iDefChar;
-    }
-    iCharWidth *= m_iFontSize;
-    iCharWidth = iCharWidth * m_iHorScale / 100;
-  }
-  pCurChar->m_iCharWidth = iCharWidth;
-  iLineWidth += iCharWidth;
-  m_pCurLine->m_iArabicChars++;
-  if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) {
-    return EndBreak(FX_TXTBREAK_LineBreak);
-  }
-  return FX_TXTBREAK_None;
-}
-FX_DWORD CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar,
-                                         int32_t iRotation) {
-  FX_DWORD dwProps = pCurChar->m_dwCharProps;
-  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
-  int32_t& iLineWidth = m_pCurLine->m_iWidth;
-  int32_t iCharWidth = 0;
-  m_dwCharType = dwType;
-  FX_WCHAR wch = pCurChar->m_wCharCode;
-  FX_WCHAR wForm = wch;
-  if (dwType == FX_CHARTYPE_Numeric) {
-    if (m_bArabicNumber) {
-      wForm = wch + 0x0630;
-      pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicIndic;
-    }
-  } else if (wch == L',') {
-    if (m_bArabicShapes && m_iCurArabicContext > 0) {
-      wForm = 0x060C;
-      pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma;
-    }
-  } else if (m_bCurRTL || m_bVertical) {
-    wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical);
-  }
-  if (m_bCombText) {
-    iCharWidth = m_iCombWidth;
-  } else {
-    if (m_bVertical != FX_IsOdd(iRotation)) {
-      iCharWidth = 1000;
-    } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
-      iCharWidth = m_iDefChar;
-    }
-    iCharWidth *= m_iFontSize;
-    iCharWidth = iCharWidth * m_iHorScale / 100;
-  }
-  iCharWidth += m_iCharSpace;
-  pCurChar->m_iCharWidth = iCharWidth;
-  iLineWidth += iCharWidth;
-  FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space ||
-                    (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0);
-  if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) {
-    return EndBreak(FX_TXTBREAK_LineBreak);
-  }
-  return FX_TXTBREAK_None;
-}
-typedef FX_DWORD (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)(CFX_Char* pCurChar,
-                                                            int32_t iRotation);
-static const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = {
-    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Tab,
-    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Control,
-    &CFX_TxtBreak::AppendChar_Combination, &CFX_TxtBreak::AppendChar_Others,
-    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Arabic,
-    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Arabic,
-    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Arabic,
-    &CFX_TxtBreak::AppendChar_Arabic,      &CFX_TxtBreak::AppendChar_Others,
-    &CFX_TxtBreak::AppendChar_Others,      &CFX_TxtBreak::AppendChar_Others,
-};
-FX_DWORD CFX_TxtBreak::AppendChar(FX_WCHAR wch) {
-  FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch];
-  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
-  CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace();
-  pCurChar->m_wCharCode = (FX_WORD)wch;
-  pCurChar->m_nRotation = m_iCharRotation;
-  pCurChar->m_dwCharProps = dwProps;
-  pCurChar->m_dwCharStyles = 0;
-  pCurChar->m_iCharWidth = 0;
-  pCurChar->m_iHorizontalScale = m_iHorScale;
-  pCurChar->m_iVertialScale = m_iVerScale;
-  pCurChar->m_dwStatus = 0;
-  pCurChar->m_iBidiClass = 0;
-  pCurChar->m_iBidiLevel = 0;
-  pCurChar->m_iBidiPos = 0;
-  pCurChar->m_iBidiOrder = 0;
-  pCurChar->m_pUserData = NULL;
-  AppendChar_PageLoad(pCurChar, dwProps);
-  FX_DWORD dwRet1 = FX_TXTBREAK_None;
-  if (dwType != FX_CHARTYPE_Combination &&
-      GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) {
-    if (m_dwCharType > 0 &&
-        m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance && !m_bSingleLine) {
-      if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) {
-        dwRet1 = EndBreak(FX_TXTBREAK_LineBreak);
-        int32_t iCount = m_pCurLine->CountChars();
-        if (iCount > 0) {
-          pCurChar = m_pCurLine->m_pLineChars->GetDataPtr(iCount - 1);
-        }
-      }
-    }
-  }
-  int32_t iRotation = m_iRotation;
-  if (m_bVertical && (dwProps & 0x8000) != 0) {
-    iRotation = (iRotation + 1) % 4;
-  }
-  FX_DWORD dwRet2 =
-      (this->*g_FX_TxtBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(
-          pCurChar, iRotation);
-  return std::max(dwRet1, dwRet2);
-}
-void CFX_TxtBreak::EndBreak_UpdateArabicShapes() {
-  FXSYS_assert(m_bArabicShapes);
-  int32_t iCount = m_pCurLine->CountChars();
-  if (iCount < 2) {
-    return;
-  }
-  int32_t& iLineWidth = m_pCurLine->m_iWidth;
-  CFX_Char *pCur, *pNext;
-  pCur = m_pCurLine->GetCharPtr(0);
-  FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
-  pCur = m_pCurLine->GetCharPtr(1);
-  FX_WCHAR wch, wForm;
-  FX_BOOL bNextNum;
-  int32_t i = 1, iCharWidth, iRotation;
-  do {
-    i++;
-    if (i < iCount) {
-      pNext = m_pCurLine->GetCharPtr(i);
-      bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
-    } else {
-      pNext = NULL;
-      bNextNum = FALSE;
-    }
-    wch = pCur->m_wCharCode;
-    if (wch == L'.') {
-      if (bPrevNum && bNextNum) {
-        iRotation = m_iRotation;
-        if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) {
-          iRotation = ((iRotation + 1) & 0x03);
-        }
-        wForm = wch == L'.' ? 0x066B : 0x066C;
-        iLineWidth -= pCur->m_iCharWidth;
-        if (m_bCombText) {
-          iCharWidth = m_iCombWidth;
-        } else {
-          if (m_bVertical != FX_IsOdd(iRotation)) {
-            iCharWidth = 1000;
-          } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) {
-            iCharWidth = m_iDefChar;
-          }
-          iCharWidth *= m_iFontSize;
-          iCharWidth = iCharWidth * m_iHorScale / 100;
-        }
-        pCur->m_iCharWidth = iCharWidth;
-        iLineWidth += iCharWidth;
-      }
-    }
-    bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0;
-    pCur = pNext;
-  } while (i < iCount);
-}
-FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine,
-                                         FX_BOOL bAllChars,
-                                         FX_DWORD dwStatus) {
-  int32_t iCount = m_pCurLine->CountChars();
-  FX_BOOL bDone = FALSE;
-  CFX_Char* pTC;
-  if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) {
-    pTC = m_pCurLine->GetCharPtr(iCount - 1);
-    switch (pTC->GetCharType()) {
-      case FX_CHARTYPE_Tab:
-      case FX_CHARTYPE_Control:
-        break;
-      case FX_CHARTYPE_Space:
-        if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) {
-          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-          bDone = TRUE;
-        }
-        break;
-      default:
-        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
-        bDone = TRUE;
-        break;
-    }
-  }
-  iCount = m_pCurLine->CountChars();
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
-  CFX_TxtPiece tp;
-  if (m_bPagination) {
-    tp.m_dwStatus = dwStatus;
-    tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_iWidth = m_pCurLine->m_iWidth;
-    tp.m_iStartChar = 0;
-    tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
-    tp.m_pUserData = m_pUserData;
-    pTC = m_pCurLine->GetCharPtr(0);
-    tp.m_dwCharStyles = pTC->m_dwCharStyles;
-    tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-    tp.m_iVerticalScale = pTC->m_iVertialScale;
-    pCurPieces->Add(tp);
-    m_pCurLine = pNextLine;
-    m_dwCharType = 0;
-    return TRUE;
-  }
-  if (bAllChars && !bDone) {
-    int32_t iEndPos = m_pCurLine->m_iWidth;
-    GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE);
-  }
-  return FALSE;
-}
-void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus) {
-  CFX_TxtPiece tp;
-  FX_TPO tpo;
-  CFX_TxtChar* pTC;
-  int32_t i, j;
-  CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars;
-  int32_t iCount = m_pCurLine->CountChars();
-  FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL);
-  if (!m_bPagination && bDone) {
-    int32_t iBidiNum = 0;
-    for (i = 0; i < iCount; i++) {
-      pTC = chars.GetDataPtr(i);
-      pTC->m_iBidiPos = i;
-      if (pTC->GetCharType() != FX_CHARTYPE_Control) {
-        iBidiNum = i;
-      }
-      if (i == 0) {
-        pTC->m_iBidiLevel = 1;
-      }
-    }
-    FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0);
-  }
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
-  if (!m_bPagination &&
-      (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) {
-    tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
-    tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
-    int32_t iBidiLevel = -1, iCharWidth;
-    i = 0, j = -1;
-    while (i < iCount) {
-      pTC = chars.GetDataPtr(i);
-      if (iBidiLevel < 0) {
-        iBidiLevel = pTC->m_iBidiLevel;
-        tp.m_iWidth = 0;
-        tp.m_iBidiLevel = iBidiLevel;
-        tp.m_iBidiPos = pTC->m_iBidiOrder;
-        tp.m_dwCharStyles = pTC->m_dwCharStyles;
-        tp.m_pUserData = pTC->m_pUserData;
-        tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-        tp.m_iVerticalScale = pTC->m_iVertialScale;
-        tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
-      }
-      if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwStatus != 0) {
-        if (iBidiLevel == pTC->m_iBidiLevel) {
-          tp.m_dwStatus = pTC->m_dwStatus;
-          iCharWidth = pTC->m_iCharWidth;
-          if (iCharWidth > 0) {
-            tp.m_iWidth += iCharWidth;
-          }
-          i++;
-        }
-        tp.m_iChars = i - tp.m_iStartChar;
-        pCurPieces->Add(tp);
-        tp.m_iStartPos += tp.m_iWidth;
-        tp.m_iStartChar = i;
-        tpo.index = ++j;
-        tpo.pos = tp.m_iBidiPos;
-        tpos.Add(tpo);
-        iBidiLevel = -1;
-      } else {
-        iCharWidth = pTC->m_iCharWidth;
-        if (iCharWidth > 0) {
-          tp.m_iWidth += iCharWidth;
-        }
-        i++;
-      }
-    }
-    if (i > tp.m_iStartChar) {
-      tp.m_dwStatus = dwStatus;
-      tp.m_iChars = i - tp.m_iStartChar;
-      pCurPieces->Add(tp);
-      tpo.index = ++j;
-      tpo.pos = tp.m_iBidiPos;
-      tpos.Add(tpo);
-    }
-    if (j > -1) {
-      if (j > 0) {
-        FX_TEXTLAYOUT_PieceSort(tpos, 0, j);
-        int32_t iStartPos = 0;
-        for (i = 0; i <= j; i++) {
-          tpo = tpos.GetAt(i);
-          CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
-          ttp.m_iStartPos = iStartPos;
-          iStartPos += ttp.m_iWidth;
-        }
-      }
-      CFX_TxtPiece& ttp = pCurPieces->GetAt(j);
-      ttp.m_dwStatus = dwStatus;
-    }
-  } else {
-    tp.m_dwStatus = dwStatus;
-    tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_iWidth = m_pCurLine->m_iWidth;
-    tp.m_iStartChar = 0;
-    tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
-    tp.m_pUserData = m_pUserData;
-    pTC = chars.GetDataPtr(0);
-    tp.m_dwCharStyles = pTC->m_dwCharStyles;
-    tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
-    tp.m_iVerticalScale = pTC->m_iVertialScale;
-    pCurPieces->Add(tp);
-    tpo.index = 0;
-    tpo.pos = 0;
-    tpos.Add(tpo);
-  }
-}
-void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
-                                      FX_BOOL bAllChars,
-                                      FX_DWORD dwStatus) {
-  int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
-  int32_t i, j, iCount = pCurPieces->GetSize();
-  FX_BOOL bFind = FALSE;
-  FX_TPO tpo;
-  CFX_TxtChar* pTC;
-  FX_DWORD dwCharType;
-  for (i = iCount - 1; i > -1; i--) {
-    tpo = tpos.GetAt(i);
-    CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
-    if (!bFind) {
-      iNetWidth = ttp.GetEndPos();
-    }
-    FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel);
-    j = bArabic ? 0 : ttp.m_iChars - 1;
-    while (j > -1 && j < ttp.m_iChars) {
-      pTC = ttp.GetCharPtr(j);
-      if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) {
-        iGapChars++;
-      }
-      if (!bFind || !bAllChars) {
-        dwCharType = pTC->GetCharType();
-        if (dwCharType == FX_CHARTYPE_Space ||
-            dwCharType == FX_CHARTYPE_Control) {
-          if (!bFind) {
-            iCharWidth = pTC->m_iCharWidth;
-            if (bAllChars && iCharWidth > 0) {
-              iNetWidth -= iCharWidth;
-            }
-          }
-        } else {
-          bFind = TRUE;
-          if (!bAllChars) {
-            break;
-          }
-        }
-      }
-      j += bArabic ? 1 : -1;
-    }
-    if (!bAllChars && bFind) {
-      break;
-    }
-  }
-  int32_t iOffset = m_iLineWidth - iNetWidth;
-  int32_t iLowerAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_LowerMask);
-  int32_t iHigherAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_HigherMask);
-  if (iGapChars > 0 && (iHigherAlignment == FX_TXTLINEALIGNMENT_Distributed ||
-                        (iHigherAlignment == FX_TXTLINEALIGNMENT_Justified &&
-                         dwStatus != FX_TXTBREAK_ParagraphBreak))) {
-    int32_t iStart = -1;
-    for (i = 0; i < iCount; i++) {
-      tpo = tpos.GetAt(i);
-      CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index);
-      if (iStart < -1) {
-        iStart = ttp.m_iStartPos;
-      } else {
-        ttp.m_iStartPos = iStart;
-      }
-      int32_t k;
-      for (j = 0; j < ttp.m_iChars; j++) {
-        pTC = ttp.GetCharPtr(j);
-        if (pTC->m_nBreakType != FX_LBT_DIRECT_BRK || pTC->m_iCharWidth < 0) {
-          continue;
-        }
-        k = iOffset / iGapChars;
-        pTC->m_iCharWidth += k;
-        ttp.m_iWidth += k;
-        iOffset -= k;
-        iGapChars--;
-        if (iGapChars < 1) {
-          break;
-        }
-      }
-      iStart += ttp.m_iWidth;
-    }
-  } else if (iLowerAlignment > FX_TXTLINEALIGNMENT_Left) {
-    if (iLowerAlignment == FX_TXTLINEALIGNMENT_Center) {
-      iOffset /= 2;
-    }
-    if (iOffset > 0) {
-      for (i = 0; i < iCount; i++) {
-        CFX_TxtPiece& ttp = pCurPieces->GetAt(i);
-        ttp.m_iStartPos += iOffset;
-      }
-    }
-  }
-}
-FX_DWORD CFX_TxtBreak::EndBreak(FX_DWORD dwStatus) {
-  FXSYS_assert(dwStatus >= FX_TXTBREAK_PieceBreak &&
-               dwStatus <= FX_TXTBREAK_PageBreak);
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
-  int32_t iCount = pCurPieces->GetSize();
-  if (iCount > 0) {
-    CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
-    if (dwStatus > FX_TXTBREAK_PieceBreak) {
-      pLastPiece->m_dwStatus = dwStatus;
-    } else {
-      dwStatus = pLastPiece->m_dwStatus;
-    }
-    return dwStatus;
-  } else {
-    CFX_TxtLine* pLastLine = GetTxtLine(TRUE);
-    if (pLastLine != NULL) {
-      pCurPieces = pLastLine->m_pLinePieces;
-      iCount = pCurPieces->GetSize();
-      if (iCount-- > 0) {
-        CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
-        if (dwStatus > FX_TXTBREAK_PieceBreak) {
-          pLastPiece->m_dwStatus = dwStatus;
-        } else {
-          dwStatus = pLastPiece->m_dwStatus;
-        }
-        return dwStatus;
-      }
-      return FX_TXTBREAK_None;
-    }
-    iCount = m_pCurLine->CountChars();
-    if (iCount < 1) {
-      return FX_TXTBREAK_None;
-    }
-    if (!m_bPagination) {
-      CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1);
-      pTC->m_dwStatus = dwStatus;
-    }
-    if (dwStatus <= FX_TXTBREAK_PieceBreak) {
-      return dwStatus;
-    }
-  }
-  m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2;
-  CFX_TxtLine* pNextLine =
-      (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1;
-  FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right);
-  CFX_TPOArray tpos;
-  CFX_Char* pTC;
-  if (m_bArabicShapes) {
-    EndBreak_UpdateArabicShapes();
-  }
-  if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
-    goto EndBreak_Ret;
-  }
-  EndBreak_BidiLine(tpos, dwStatus);
-  if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) {
-    EndBreak_Alignment(tpos, bAllChars, dwStatus);
-  }
-EndBreak_Ret:
-  m_pCurLine = pNextLine;
-  pTC = GetLastChar(0, FALSE);
-  m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType();
-  if (dwStatus == FX_TXTBREAK_ParagraphBreak) {
-    m_iArabicContext = m_iCurArabicContext = 1;
-    ResetArabicContext();
-  }
-  return dwStatus;
-}
-int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca,
-                                  int32_t& iEndPos,
-                                  FX_BOOL bAllChars,
-                                  FX_BOOL bOnlyBrk) {
-  int32_t iLength = ca.GetSize() - 1;
-  if (iLength < 1) {
-    return iLength;
-  }
-  int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1,
-          iLast = -1, iLastPos = -1;
-  if (m_bSingleLine || iEndPos <= m_iLineWidth) {
-    if (!bAllChars) {
-      return iLength;
-    }
-    iBreak = iLength;
-    iBreakPos = iEndPos;
-  }
-  FX_BOOL bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0;
-  FX_BOOL bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0;
-  FX_LINEBREAKTYPE eType;
-  FX_DWORD nCodeProp, nCur, nNext;
-  CFX_Char* pCur = ca.GetDataPtr(iLength--);
-  if (bAllChars) {
-    pCur->m_nBreakType = FX_LBT_UNKNOWN;
-  }
-  nCodeProp = pCur->m_dwCharProps;
-  nNext = nCodeProp & 0x003F;
-  int32_t iCharWidth = pCur->m_iCharWidth;
-  if (iCharWidth > 0) {
-    iEndPos -= iCharWidth;
-  }
-  while (iLength >= 0) {
-    pCur = ca.GetDataPtr(iLength);
-    nCodeProp = pCur->m_dwCharProps;
-    nCur = nCodeProp & 0x003F;
-    if (nCur == FX_CBP_SP) {
-      if (nNext == FX_CBP_SP) {
-        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
-      } else {
-        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                  (nCur << 5) + nNext);
-      }
-    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
-      eType = FX_LBT_DIRECT_BRK;
-    } else {
-      if (nNext == FX_CBP_SP) {
-        eType = FX_LBT_PROHIBITED_BRK;
-      } else {
-        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
-                  (nCur << 5) + nNext);
-      }
-    }
-    if (bAllChars) {
-      pCur->m_nBreakType = (uint8_t)eType;
-    }
-    if (!bOnlyBrk) {
-      if (m_bSingleLine || iEndPos <= m_iLineWidth ||
-          (nCur == FX_CBP_SP && !bSpaceBreak)) {
-        if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
-          iBreak = iLength;
-          iBreakPos = iEndPos;
-          if (!bAllChars) {
-            return iLength;
-          }
-        } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) {
-          iIndirect = iLength;
-          iIndirectPos = iEndPos;
-        }
-        if (iLast < 0) {
-          iLast = iLength;
-          iLastPos = iEndPos;
-        }
-      }
-      iCharWidth = pCur->m_iCharWidth;
-      if (iCharWidth > 0) {
-        iEndPos -= iCharWidth;
-      }
-    }
-    nNext = nCodeProp & 0x003F;
-    iLength--;
-  }
-  if (bOnlyBrk) {
-    return 0;
-  }
-  if (iBreak > -1) {
-    iEndPos = iBreakPos;
-    return iBreak;
-  }
-  if (iIndirect > -1) {
-    iEndPos = iIndirectPos;
-    return iIndirect;
-  }
-  if (iLast > -1) {
-    iEndPos = iLastPos;
-    return iLast;
-  }
-  return 0;
-}
-void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine,
-                                 CFX_TxtLine* pNextLine,
-                                 FX_BOOL bAllChars) {
-  FXSYS_assert(pCurLine != NULL && pNextLine != NULL);
-  int32_t iCount = pCurLine->CountChars();
-  if (iCount < 2) {
-    return;
-  }
-  int32_t iEndPos = pCurLine->m_iWidth;
-  CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars;
-  int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
-  if (iCharPos < 0) {
-    iCharPos = 0;
-  }
-  iCharPos++;
-  if (iCharPos >= iCount) {
-    pNextLine->RemoveAll(TRUE);
-    CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1);
-    pTC->m_nBreakType = FX_LBT_UNKNOWN;
-    return;
-  }
-  CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars;
-  int cur_size = curChars.GetSize();
-  nextChars.SetSize(cur_size - iCharPos);
-  FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
-               (cur_size - iCharPos) * sizeof(CFX_TxtChar));
-  iCount -= iCharPos;
-  cur_size = curChars.GetSize();
-  curChars.RemoveAt(cur_size - iCount, iCount);
-  pCurLine->m_iWidth = iEndPos;
-  CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1);
-  pTC->m_nBreakType = FX_LBT_UNKNOWN;
-  iCount = nextChars.GetSize();
-  int32_t iCharWidth, iWidth = 0;
-  for (int32_t i = 0; i < iCount; i++) {
-    pTC = nextChars.GetDataPtr(i);
-    if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) {
-      pCurLine->m_iArabicChars--;
-      pNextLine->m_iArabicChars++;
-    }
-    iCharWidth = pTC->m_iCharWidth;
-    if (iCharWidth > 0) {
-      iWidth += iCharWidth;
-    }
-    if (m_bPagination) {
-      continue;
-    }
-    pTC->m_dwStatus = 0;
-  }
-  pNextLine->m_iWidth = iWidth;
-}
-int32_t CFX_TxtBreak::CountBreakChars() const {
-  CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
-  return pTxtLine == NULL ? 0 : pTxtLine->CountChars();
-}
-int32_t CFX_TxtBreak::CountBreakPieces() const {
-  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
-  if (pTxtPieces == NULL) {
-    return 0;
-  }
-  return pTxtPieces->GetSize();
-}
-const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
-  CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
-  if (pTxtPieces == NULL) {
-    return NULL;
-  }
-  if (index < 0 || index >= pTxtPieces->GetSize()) {
-    return NULL;
-  }
-  return pTxtPieces->GetPtrAt(index);
-}
-void CFX_TxtBreak::ClearBreakPieces() {
-  CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
-  if (pTxtLine != NULL) {
-    pTxtLine->RemoveAll(TRUE);
-  }
-  m_iReady = 0;
-}
-void CFX_TxtBreak::Reset() {
-  m_dwCharType = 0;
-  m_iArabicContext = m_iCurArabicContext = 1;
-  ResetArabicContext();
-  m_pTxtLine1->RemoveAll(TRUE);
-  m_pTxtLine2->RemoveAll(TRUE);
-}
-
-struct FX_FORMCHAR {
-  FX_WORD wch;
-  FX_WORD wForm;
-  int32_t iWidth;
-};
-
-int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
-                                    FXTEXT_CHARPOS* pCharPos,
-                                    FX_BOOL bCharCode,
-                                    CFX_WideString* pWSForms,
-                                    FX_AdjustCharDisplayPos pAdjustPos) const {
-  if (pTxtRun == NULL || pTxtRun->iLength < 1) {
-    return 0;
-  }
-  IFX_TxtAccess* pAccess = pTxtRun->pAccess;
-  void* pIdentity = pTxtRun->pIdentity;
-  const FX_WCHAR* pStr = pTxtRun->pStr;
-  int32_t* pWidths = pTxtRun->pWidths;
-  int32_t iLength = pTxtRun->iLength - 1;
-  IFX_Font* pFont = pTxtRun->pFont;
-  FX_DWORD dwStyles = pTxtRun->dwStyles;
-  CFX_RectF rtText(*pTxtRun->pRect);
-  FX_BOOL bRTLPiece =
-      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
-  FX_BOOL bArabicNumber =
-      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0;
-  FX_BOOL bArabicComma =
-      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0;
-  FX_FLOAT fFontSize = pTxtRun->fFontSize;
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  int32_t iAscent = pFont->GetAscent();
-  int32_t iDescent = pFont->GetDescent();
-  int32_t iMaxHeight = iAscent - iDescent;
-  FX_FLOAT fFontHeight = fFontSize;
-  FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight;
-  FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight;
-  FX_BOOL bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0;
-  FX_BOOL bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0;
-  int32_t iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation;
-  int32_t iCharRotation;
-  FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm, wLast = 0xFEFF;
-  int32_t iWidth, iCharWidth, iCharHeight;
-  FX_FLOAT fX, fY, fCharWidth, fCharHeight;
-  int32_t iHorScale = pTxtRun->iHorizontalScale;
-  int32_t iVerScale = pTxtRun->iVerticalScale;
-  FX_BOOL bSkipSpace = pTxtRun->bSkipSpace;
-  FX_BOOL bEmptyChar, bShadda = FALSE, bLam = FALSE;
-  FX_DWORD dwProps, dwCharType;
-  FX_FORMCHAR formChars[3];
-  FX_FLOAT fYBase;
-  fX = rtText.left;
-  if (bVerticalDoc) {
-    fX += (rtText.width - fFontSize) / 2.0f;
-    fYBase = bRTLPiece ? rtText.bottom() : rtText.top;
-    fY = fYBase;
-  } else {
-    if (bRTLPiece) {
-      fX = rtText.right();
-    }
-    fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f;
-    fY = fYBase + fAscent;
-  }
-  int32_t iCount = 0, iNext, iForms;
-  for (int32_t i = 0; i <= iLength; i++) {
-    if (pAccess != NULL) {
-      wch = pAccess->GetChar(pIdentity, i);
-      iWidth = pAccess->GetWidth(pIdentity, i);
-    } else {
-      wch = *pStr++;
-      iWidth = *pWidths++;
-    }
-    dwProps = FX_GetUnicodeProperties(wch);
-    dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
-    if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
-      wPrev = 0xFEFF;
-      wLast = wch;
-      continue;
-    }
-    if (dwCharType >= FX_CHARTYPE_ArabicAlef) {
-      if (i < iLength) {
-        if (pAccess != NULL) {
-          iNext = i + 1;
-          while (iNext <= iLength) {
-            wNext = pAccess->GetChar(pIdentity, iNext);
-            dwProps = FX_GetUnicodeProperties(wNext);
-            if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination) {
-              break;
-            }
-            iNext++;
-          }
-          if (iNext > iLength) {
-            wNext = 0xFEFF;
-          }
-        } else {
-          int32_t j = -1;
-          do {
-            j++;
-            if (i + j >= iLength) {
-              break;
-            }
-            wNext = pStr[j];
-            dwProps = FX_GetUnicodeProperties(wNext);
-          } while ((dwProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination);
-          if (i + j >= iLength) {
-            wNext = 0xFEFF;
-          }
-        }
-      } else {
-        wNext = 0xFEFF;
-      }
-      wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext);
-      bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647);
-    } else if (dwCharType == FX_CHARTYPE_Combination) {
-      wForm = wch;
-      if (wch >= 0x064C && wch <= 0x0651) {
-        if (bShadda) {
-          wForm = 0xFEFF;
-          bShadda = FALSE;
-        } else {
-          wNext = 0xFEFF;
-          if (pAccess != NULL) {
-            iNext = i + 1;
-            if (iNext <= iLength) {
-              wNext = pAccess->GetChar(pIdentity, iNext);
-            }
-          } else {
-            if (i < iLength) {
-              wNext = *pStr;
-            }
-          }
-          if (wch == 0x0651) {
-            if (wNext >= 0x064C && wNext <= 0x0650) {
-              wForm = FX_GetArabicFromShaddaTable(wNext);
-              bShadda = TRUE;
-            }
-          } else {
-            if (wNext == 0x0651) {
-              wForm = FX_GetArabicFromShaddaTable(wch);
-              bShadda = TRUE;
-            }
-          }
-        }
-      } else {
-        bShadda = FALSE;
-      }
-    } else if (dwCharType == FX_CHARTYPE_Numeric) {
-      wForm = wch;
-      if (bArabicNumber) {
-        wForm += 0x0630;
-      }
-    } else if (wch == L'.') {
-      wForm = wch;
-      if (bArabicNumber) {
-        wNext = 0xFEFF;
-        if (pAccess != NULL) {
-          iNext = i + 1;
-          if (iNext <= iLength) {
-            wNext = pAccess->GetChar(pIdentity, iNext);
-          }
-        } else {
-          if (i < iLength) {
-            wNext = *pStr;
-          }
-        }
-        if (wNext >= L'0' && wNext <= L'9') {
-          wForm = 0x066B;
-        }
-      }
-    } else if (wch == L',') {
-      wForm = wch;
-      if (bArabicComma) {
-        wForm = 0x060C;
-      }
-    } else if (bRTLPiece || bVerticalChar) {
-      wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar);
-    } else {
-      wForm = wch;
-    }
-    if (dwCharType != FX_CHARTYPE_Combination) {
-      bShadda = FALSE;
-    }
-    if (dwCharType < FX_CHARTYPE_ArabicAlef) {
-      bLam = FALSE;
-    }
-    dwProps = FX_GetUnicodeProperties(wForm);
-    iCharRotation = iRotation;
-    if (bVerticalChar && (dwProps & 0x8000) != 0) {
-      iCharRotation++;
-    }
-    iCharRotation %= 4;
-    bEmptyChar =
-        (dwCharType >= FX_CHARTYPE_Tab && dwCharType <= FX_CHARTYPE_Control);
-    if (wForm == 0xFEFF) {
-      bEmptyChar = TRUE;
-    }
-    iForms = bLam ? 3 : 1;
-    iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms;
-    if (pCharPos == NULL) {
-      if (iWidth > 0) {
-        wPrev = wch;
-      }
-      wLast = wch;
-      continue;
-    }
-    iCharWidth = iWidth;
-    if (iCharWidth < 0) {
-      iCharWidth = -iCharWidth;
-    }
-    iCharWidth /= iFontSize;
-    formChars[0].wch = wch;
-    formChars[0].wForm = wForm;
-    formChars[0].iWidth = iCharWidth;
-    if (bLam) {
-      formChars[1].wForm = 0x0651;
-      iCharWidth = 0;
-      pFont->GetCharWidth(0x0651, iCharWidth, FALSE);
-      formChars[1].iWidth = iCharWidth;
-      formChars[2].wForm = 0x0670;
-      iCharWidth = 0;
-      pFont->GetCharWidth(0x0670, iCharWidth, FALSE);
-      formChars[2].iWidth = iCharWidth;
-    }
-    for (int32_t j = 0; j < iForms; j++) {
-      wForm = (FX_WCHAR)formChars[j].wForm;
-      iCharWidth = formChars[j].iWidth;
-      if (j > 0) {
-        dwCharType = FX_CHARTYPE_Combination;
-        wch = wForm;
-        wLast = (FX_WCHAR)formChars[j - 1].wForm;
-      }
-      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
-        pCharPos->m_GlyphIndex =
-            bCharCode ? wch : pFont->GetGlyphIndex(wForm, FALSE);
-        pCharPos->m_ExtGID = pCharPos->m_GlyphIndex;
-        pCharPos->m_FontCharWidth = iCharWidth;
-        if (pWSForms) {
-          *pWSForms += wForm;
-        }
-      }
-      if (bVerticalDoc) {
-        iCharHeight = iCharWidth;
-        iCharWidth = 1000;
-      } else {
-        iCharHeight = 1000;
-      }
-      fCharWidth = fFontSize * iCharWidth / 1000.0f;
-      fCharHeight = fFontSize * iCharHeight / 1000.0f;
-      if (bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
-        if (bVerticalDoc) {
-          fY -= fCharHeight;
-        } else {
-          fX -= fCharWidth;
-        }
-      }
-      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
-        pCharPos->m_OriginX = fX;
-        pCharPos->m_OriginY = fY;
-        if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) {
-          int32_t iFormWidth = iCharWidth;
-          pFont->GetCharWidth(wForm, iFormWidth, FALSE);
-          FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f;
-          if (bVerticalDoc) {
-            pCharPos->m_OriginY += fOffset;
-          } else {
-            pCharPos->m_OriginX += fOffset;
-          }
-        }
-        if (dwCharType == FX_CHARTYPE_Combination) {
-          CFX_Rect rtBBox;
-          rtBBox.Reset();
-          if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) {
-            pCharPos->m_OriginY =
-                fYBase + fFontSize -
-                fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight;
-          }
-          if (wForm == wch && wLast != 0xFEFF) {
-            FX_DWORD dwLastProps = FX_GetUnicodeProperties(wLast);
-            if ((dwLastProps & FX_CHARTYPEBITSMASK) ==
-                FX_CHARTYPE_Combination) {
-              CFX_Rect rtBBox;
-              rtBBox.Reset();
-              if (pFont->GetCharBBox(wLast, rtBBox, FALSE)) {
-                pCharPos->m_OriginY -= fFontSize * rtBBox.height / iMaxHeight;
-              }
-            }
-          }
-        }
-        CFX_PointF ptOffset;
-        FX_BOOL bAdjusted = FALSE;
-        if (pAdjustPos) {
-          bAdjusted = pAdjustPos(wForm, bCharCode, pFont, fFontSize,
-                                 bVerticalChar, ptOffset);
-        }
-        if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) {
-          CFX_Rect rtBBox;
-          rtBBox.Reset();
-          if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) {
-            ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight;
-            ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight;
-          }
-        }
-        pCharPos->m_OriginX += ptOffset.x;
-        pCharPos->m_OriginY -= ptOffset.y;
-      }
-      if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
-        if (bVerticalDoc) {
-          fY += fCharHeight;
-        } else {
-          fX += fCharWidth;
-        }
-      }
-      if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
-        pCharPos->m_bGlyphAdjust = TRUE;
-        if (bVerticalDoc) {
-          if (iCharRotation == 0) {
-            pCharPos->m_AdjustMatrix[0] = -1;
-            pCharPos->m_AdjustMatrix[1] = 0;
-            pCharPos->m_AdjustMatrix[2] = 0;
-            pCharPos->m_AdjustMatrix[3] = 1;
-            pCharPos->m_OriginY += fAscent;
-          } else if (iCharRotation == 1) {
-            pCharPos->m_AdjustMatrix[0] = 0;
-            pCharPos->m_AdjustMatrix[1] = -1;
-            pCharPos->m_AdjustMatrix[2] = -1;
-            pCharPos->m_AdjustMatrix[3] = 0;
-            pCharPos->m_OriginX -= fDescent;
-          } else if (iCharRotation == 2) {
-            pCharPos->m_AdjustMatrix[0] = 1;
-            pCharPos->m_AdjustMatrix[1] = 0;
-            pCharPos->m_AdjustMatrix[2] = 0;
-            pCharPos->m_AdjustMatrix[3] = -1;
-            pCharPos->m_OriginX += fCharWidth;
-            pCharPos->m_OriginY += fAscent;
-          } else {
-            pCharPos->m_AdjustMatrix[0] = 0;
-            pCharPos->m_AdjustMatrix[1] = 1;
-            pCharPos->m_AdjustMatrix[2] = 1;
-            pCharPos->m_AdjustMatrix[3] = 0;
-            pCharPos->m_OriginX += fAscent;
-          }
-        } else {
-          if (iCharRotation == 0) {
-            pCharPos->m_AdjustMatrix[0] = -1;
-            pCharPos->m_AdjustMatrix[1] = 0;
-            pCharPos->m_AdjustMatrix[2] = 0;
-            pCharPos->m_AdjustMatrix[3] = 1;
-          } else if (iCharRotation == 1) {
-            pCharPos->m_AdjustMatrix[0] = 0;
-            pCharPos->m_AdjustMatrix[1] = -1;
-            pCharPos->m_AdjustMatrix[2] = -1;
-            pCharPos->m_AdjustMatrix[3] = 0;
-            pCharPos->m_OriginX -= fDescent;
-            pCharPos->m_OriginY -= fAscent + fDescent;
-          } else if (iCharRotation == 2) {
-            pCharPos->m_AdjustMatrix[0] = 1;
-            pCharPos->m_AdjustMatrix[1] = 0;
-            pCharPos->m_AdjustMatrix[2] = 0;
-            pCharPos->m_AdjustMatrix[3] = -1;
-            pCharPos->m_OriginX += fCharWidth;
-            pCharPos->m_OriginY -= fAscent;
-          } else {
-            pCharPos->m_AdjustMatrix[0] = 0;
-            pCharPos->m_AdjustMatrix[1] = 1;
-            pCharPos->m_AdjustMatrix[2] = 1;
-            pCharPos->m_AdjustMatrix[3] = 0;
-            pCharPos->m_OriginX += fAscent;
-          }
-        }
-        if (iHorScale != 100 || iVerScale != 100) {
-          pCharPos->m_AdjustMatrix[0] =
-              pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f;
-          pCharPos->m_AdjustMatrix[1] =
-              pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f;
-          pCharPos->m_AdjustMatrix[2] =
-              pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f;
-          pCharPos->m_AdjustMatrix[3] =
-              pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
-        }
-        pCharPos++;
-      }
-    }
-    if (iWidth > 0) {
-      wPrev = (FX_WCHAR)formChars[0].wch;
-    }
-    wLast = wch;
-  }
-  return iCount;
-}
-int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
-                                   CFX_RectFArray& rtArray,
-                                   FX_BOOL bCharBBox) const {
-  if (pTxtRun == NULL || pTxtRun->iLength < 1) {
-    return 0;
-  }
-  IFX_TxtAccess* pAccess = pTxtRun->pAccess;
-  void* pIdentity = pTxtRun->pIdentity;
-  const FX_WCHAR* pStr = pTxtRun->pStr;
-  int32_t* pWidths = pTxtRun->pWidths;
-  int32_t iLength = pTxtRun->iLength;
-  CFX_RectF rect(*pTxtRun->pRect);
-  FX_BOOL bRTLPiece =
-      (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
-  FX_FLOAT fFontSize = pTxtRun->fFontSize;
-  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
-  FX_FLOAT fScale = fFontSize / 1000.0f;
-  IFX_Font* pFont = pTxtRun->pFont;
-  if (pFont == NULL) {
-    bCharBBox = FALSE;
-  }
-  CFX_Rect bbox;
-  bbox.Set(0, 0, 0, 0);
-  if (bCharBBox) {
-    bCharBBox = pFont->GetBBox(bbox);
-  }
-  FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
-  FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
-  rtArray.RemoveAll();
-  rtArray.SetSize(iLength);
-  FX_BOOL bVertical =
-      (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0;
-  FX_BOOL bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0;
-  FX_BOOL bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
-  FX_WCHAR wch, wLineBreakChar = pTxtRun->wLineBreakChar;
-  int32_t iCharSize;
-  FX_FLOAT fCharSize, fStart;
-  if (bVertical) {
-    fStart = bRTLPiece ? rect.bottom() : rect.top;
-  } else {
-    fStart = bRTLPiece ? rect.right() : rect.left;
-  }
-  for (int32_t i = 0; i < iLength; i++) {
-    if (pAccess != NULL) {
-      wch = pAccess->GetChar(pIdentity, i);
-      iCharSize = pAccess->GetWidth(pIdentity, i);
-    } else {
-      wch = *pStr++;
-      iCharSize = *pWidths++;
-    }
-    fCharSize = (FX_FLOAT)iCharSize / 20000.0f;
-    FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch));
-    if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 ||
-          (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) {
-      bRet = FALSE;
-    }
-    if (bRet) {
-      iCharSize = iFontSize * 500;
-      fCharSize = fFontSize / 2.0f;
-    }
-    if (bVertical) {
-      rect.top = fStart;
-      if (bRTLPiece) {
-        rect.top -= fCharSize;
-        fStart -= fCharSize;
-      } else {
-        fStart += fCharSize;
-      }
-      rect.height = fCharSize;
-    } else {
-      rect.left = fStart;
-      if (bRTLPiece) {
-        rect.left -= fCharSize;
-        fStart -= fCharSize;
-      } else {
-        fStart += fCharSize;
-      }
-      rect.width = fCharSize;
-    }
-    if (bCharBBox && !bRet) {
-      int32_t iCharWidth = 1000;
-      pFont->GetCharWidth(wch, iCharWidth);
-      FX_FLOAT fRTLeft = 0, fCharWidth = 0;
-      if (iCharWidth > 0) {
-        fCharWidth = iCharWidth * fScale;
-        fRTLeft = fLeft;
-        if (bCombText) {
-          fRTLeft = (rect.width - fCharWidth) / 2.0f;
-        }
-      }
-      CFX_RectF rtBBoxF;
-      if (bVertical) {
-        rtBBoxF.top = rect.left + fRTLeft;
-        rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f;
-        rtBBoxF.height = fCharWidth;
-        rtBBoxF.width = fHeight;
-        rtBBoxF.left = std::max(rtBBoxF.left, 0.0f);
-      } else {
-        rtBBoxF.left = rect.left + fRTLeft;
-        rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f;
-        rtBBoxF.width = fCharWidth;
-        rtBBoxF.height = fHeight;
-        rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
-      }
-      rtArray.SetAt(i, rtBBoxF);
-      continue;
-    }
-    rtArray.SetAt(i, rect);
-  }
-  return iLength;
-}
diff --git a/xfa/src/fgas/layout/fgas_textbreak.h b/xfa/src/fgas/layout/fgas_textbreak.h
deleted file mode 100644
index 65fba72..0000000
--- a/xfa/src/fgas/layout/fgas_textbreak.h
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
-#define XFA_SRC_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
-
-#include "core/include/fxcrt/fx_ucd.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-#include "xfa/src/fgas/layout/fgas_unicode.h"
-
-class IFX_Font;
-class CFX_Char;
-class IFX_TxtAccess;
-class CFX_TxtChar;
-class CFX_TxtPiece;
-class IFX_TxtBreak;
-
-#define FX_TXTBREAKPOLICY_None 0x00
-#define FX_TXTBREAKPOLICY_Pagination 0x01
-#define FX_TXTBREAKPOLICY_SpaceBreak 0x02
-#define FX_TXTBREAKPOLICY_NumberBreak 0x04
-#define FX_TXTBREAK_None 0x00
-#define FX_TXTBREAK_PieceBreak 0x01
-#define FX_TXTBREAK_LineBreak 0x02
-#define FX_TXTBREAK_ParagraphBreak 0x03
-#define FX_TXTBREAK_PageBreak 0x04
-#define FX_TXTBREAK_ControlChar 0x10
-#define FX_TXTBREAK_BreakChar 0x20
-#define FX_TXTBREAK_UnknownChar 0x40
-#define FX_TXTBREAK_RemoveChar 0x80
-#define FX_TXTLAYOUTSTYLE_MutipleFormat 0x0001
-#define FX_TXTLAYOUTSTYLE_VerticalLayout 0x0002
-#define FX_TXTLAYOUTSTYLE_VerticalChars 0x0004
-#define FX_TXTLAYOUTSTYLE_ReverseLine 0x0008
-#define FX_TXTLAYOUTSTYLE_ArabicContext 0x0010
-#define FX_TXTLAYOUTSTYLE_ArabicShapes 0x0020
-#define FX_TXTLAYOUTSTYLE_RTLReadingOrder 0x0040
-#define FX_TXTLAYOUTSTYLE_ExpandTab 0x0100
-#define FX_TXTLAYOUTSTYLE_SingleLine 0x0200
-#define FX_TXTLAYOUTSTYLE_CombText 0x0400
-#define FX_TXTCHARSTYLE_Alignment 0x000F
-#define FX_TXTCHARSTYLE_ArabicNumber 0x0010
-#define FX_TXTCHARSTYLE_ArabicShadda 0x0020
-#define FX_TXTCHARSTYLE_OddBidiLevel 0x0040
-#define FX_TXTCHARSTYLE_RTLReadingOrder 0x0080
-#define FX_TXTCHARSTYLE_ArabicContext 0x0300
-#define FX_TXTCHARSTYLE_ArabicIndic 0x0400
-#define FX_TXTCHARSTYLE_ArabicComma 0x0800
-#define FX_TXTLINEALIGNMENT_Left 0
-#define FX_TXTLINEALIGNMENT_Center 1
-#define FX_TXTLINEALIGNMENT_Right 2
-#define FX_TXTLINEALIGNMENT_Justified (1 << 2)
-#define FX_TXTLINEALIGNMENT_Distributed (2 << 2)
-#define FX_TXTLINEALIGNMENT_JustifiedLeft \
-  (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Justified)
-#define FX_TXTLINEALIGNMENT_JustifiedCenter \
-  (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Justified)
-#define FX_TXTLINEALIGNMENT_JustifiedRight \
-  (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Justified)
-#define FX_TXTLINEALIGNMENT_DistributedLeft \
-  (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Distributed)
-#define FX_TXTLINEALIGNMENT_DistributedCenter \
-  (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Distributed)
-#define FX_TXTLINEALIGNMENT_DistributedRight \
-  (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Distributed)
-#define FX_TXTLINEALIGNMENT_LowerMask 0x03
-#define FX_TXTLINEALIGNMENT_HigherMask 0x0C
-#define FX_TXTBREAK_MinimumTabWidth 160000
-
-class IFX_TxtAccess {
- public:
-  virtual ~IFX_TxtAccess() {}
-  virtual FX_WCHAR GetChar(void* pIdentity, int32_t index) const = 0;
-  virtual int32_t GetWidth(void* pIdentity, int32_t index) const = 0;
-};
-
-struct FX_TXTRUN {
-  FX_TXTRUN() {
-    pAccess = NULL;
-    pIdentity = NULL;
-    pStr = NULL;
-    pWidths = NULL;
-    iLength = 0;
-    pFont = NULL;
-    fFontSize = 12;
-    dwStyles = 0;
-    iHorizontalScale = 100;
-    iVerticalScale = 100;
-    iCharRotation = 0;
-    dwCharStyles = 0;
-    pRect = NULL;
-    wLineBreakChar = L'\n';
-    bSkipSpace = TRUE;
-  }
-
-  IFX_TxtAccess* pAccess;
-  void* pIdentity;
-  const FX_WCHAR* pStr;
-  int32_t* pWidths;
-  int32_t iLength;
-  IFX_Font* pFont;
-  FX_FLOAT fFontSize;
-  FX_DWORD dwStyles;
-  int32_t iHorizontalScale;
-  int32_t iVerticalScale;
-  int32_t iCharRotation;
-  FX_DWORD dwCharStyles;
-  const CFX_RectF* pRect;
-  FX_WCHAR wLineBreakChar;
-  FX_BOOL bSkipSpace;
-};
-
-class CFX_TxtPiece : public CFX_Target {
- public:
-  CFX_TxtPiece()
-      : m_dwStatus(FX_TXTBREAK_PieceBreak),
-        m_iStartPos(0),
-        m_iWidth(-1),
-        m_iStartChar(0),
-        m_iChars(0),
-        m_iBidiLevel(0),
-        m_iBidiPos(0),
-        m_iHorizontalScale(100),
-        m_iVerticalScale(100),
-        m_dwCharStyles(0),
-        m_pChars(NULL),
-        m_pUserData(NULL) {}
-  int32_t GetEndPos() const {
-    return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
-  }
-  int32_t GetLength() const { return m_iChars; }
-  int32_t GetEndChar() const { return m_iStartChar + m_iChars; }
-  CFX_TxtChar* GetCharPtr(int32_t index) const {
-    FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
-    return m_pChars->GetDataPtr(m_iStartChar + index);
-  }
-  void GetString(FX_WCHAR* pText) const {
-    FXSYS_assert(pText != NULL);
-    int32_t iEndChar = m_iStartChar + m_iChars;
-    CFX_Char* pChar;
-    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
-      pChar = m_pChars->GetDataPtr(i);
-      *pText++ = (FX_WCHAR)pChar->m_wCharCode;
-    }
-  }
-
-  void GetString(CFX_WideString& wsText) const {
-    FX_WCHAR* pText = wsText.GetBuffer(m_iChars);
-    GetString(pText);
-    wsText.ReleaseBuffer(m_iChars);
-  }
-  void GetWidths(int32_t* pWidths) const {
-    FXSYS_assert(pWidths != NULL);
-    int32_t iEndChar = m_iStartChar + m_iChars;
-    CFX_Char* pChar;
-    for (int32_t i = m_iStartChar; i < iEndChar; i++) {
-      pChar = m_pChars->GetDataPtr(i);
-      *pWidths++ = pChar->m_iCharWidth;
-    }
-  }
-  FX_DWORD m_dwStatus;
-  int32_t m_iStartPos;
-  int32_t m_iWidth;
-  int32_t m_iStartChar;
-  int32_t m_iChars;
-  int32_t m_iBidiLevel;
-  int32_t m_iBidiPos;
-  int32_t m_iHorizontalScale;
-  int32_t m_iVerticalScale;
-  FX_DWORD m_dwCharStyles;
-  CFX_TxtCharArray* m_pChars;
-  void* m_pUserData;
-};
-typedef CFX_BaseArrayTemplate<CFX_TxtPiece> CFX_TxtPieceArray;
-
-class IFX_TxtBreak {
- public:
-  static IFX_TxtBreak* Create(FX_DWORD dwPolicies);
-  virtual ~IFX_TxtBreak() {}
-  virtual void Release() = 0;
-  virtual void SetLineWidth(FX_FLOAT fLineWidth) = 0;
-  virtual void SetLinePos(FX_FLOAT fLinePos) = 0;
-  virtual FX_DWORD GetLayoutStyles() const = 0;
-  virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;
-  virtual void SetFont(IFX_Font* pFont) = 0;
-  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
-  virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) = 0;
-  virtual void SetDefaultChar(FX_WCHAR wch) = 0;
-  virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
-  virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
-  virtual void SetHorizontalScale(int32_t iScale) = 0;
-  virtual void SetVerticalScale(int32_t iScale) = 0;
-  virtual void SetCharRotation(int32_t iCharRotation) = 0;
-  virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0;
-  virtual void SetAlignment(int32_t iAlignment) = 0;
-  virtual FX_DWORD GetContextCharStyles() const = 0;
-  virtual void SetContextCharStyles(FX_DWORD dwCharStyles) = 0;
-  virtual void SetCombWidth(FX_FLOAT fCombWidth) = 0;
-  virtual void SetUserData(void* pUserData) = 0;
-  virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0;
-  virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak) = 0;
-  virtual int32_t CountBreakChars() const = 0;
-  virtual int32_t CountBreakPieces() const = 0;
-  virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const = 0;
-  virtual void ClearBreakPieces() = 0;
-  virtual void Reset() = 0;
-  virtual int32_t GetDisplayPos(
-      const FX_TXTRUN* pTxtRun,
-      FXTEXT_CHARPOS* pCharPos,
-      FX_BOOL bCharCode = FALSE,
-      CFX_WideString* pWSForms = NULL,
-      FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;
-  virtual int32_t GetCharRects(const FX_TXTRUN* pTxtRun,
-                               CFX_RectFArray& rtArray,
-                               FX_BOOL bCharBBox = FALSE) const = 0;
-};
-
-#endif  // XFA_SRC_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
diff --git a/xfa/src/fgas/layout/fgas_unicode.cpp b/xfa/src/fgas/layout/fgas_unicode.cpp
deleted file mode 100644
index f463d75..0000000
--- a/xfa/src/fgas/layout/fgas_unicode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/layout/fgas_unicode.h"
-
-void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray& tpos, int32_t iStart, int32_t iEnd) {
-  FXSYS_assert(iStart > -1 && iStart < tpos.GetSize());
-  FXSYS_assert(iEnd > -1 && iEnd < tpos.GetSize());
-  if (iStart >= iEnd) {
-    return;
-  }
-  int32_t i = iStart, j = iEnd;
-  FX_TPO *pCur = tpos.GetPtrAt(iStart), *pSort;
-  int32_t v = pCur->pos;
-  while (i < j) {
-    while (j > i) {
-      pSort = tpos.GetPtrAt(j);
-      if (pSort->pos < v) {
-        FX_TPO t = *pSort;
-        *pSort = *pCur;
-        *pCur = t;
-        pCur = pSort;
-        break;
-      }
-      j--;
-    }
-    while (i < j) {
-      pSort = tpos.GetPtrAt(i);
-      if (pSort->pos > v) {
-        FX_TPO t = *pSort;
-        *pSort = *pCur;
-        *pCur = t;
-        pCur = pSort;
-        break;
-      }
-      i++;
-    }
-  }
-  i--, j++;
-  if (iStart < i) {
-    FX_TEXTLAYOUT_PieceSort(tpos, iStart, i);
-  }
-  if (j < iEnd) {
-    FX_TEXTLAYOUT_PieceSort(tpos, j, iEnd);
-  }
-}
-static const FX_JAPCHARPROPERTYEX gs_FX_JapCharPropertysEx[] = {
-    {0x3001, 0x13}, {0x3002, 0x13}, {0x3041, 0x23}, {0x3043, 0x23},
-    {0x3045, 0x23}, {0x3047, 0x23}, {0x3049, 0x23}, {0x3063, 0x23},
-    {0x3083, 0x23}, {0x3085, 0x23}, {0x3087, 0x23}, {0x308E, 0x23},
-    {0x3095, 0x23}, {0x3096, 0x23}, {0x30A1, 0x23}, {0x30A3, 0x23},
-    {0x30A5, 0x23}, {0x30A7, 0x23}, {0x30A9, 0x23}, {0x30C3, 0x23},
-    {0x30E3, 0x23}, {0x30E5, 0x23}, {0x30E7, 0x23}, {0x30EE, 0x23},
-    {0x30F5, 0x23}, {0x30F6, 0x23}, {0x30FB, 0x22}, {0x31F0, 0x23},
-    {0x31F1, 0x23}, {0x31F2, 0x23}, {0x31F3, 0x23}, {0x31F4, 0x23},
-    {0x31F5, 0x23}, {0x31F6, 0x23}, {0x31F7, 0x23}, {0x31F8, 0x23},
-    {0x31F9, 0x23}, {0x31FA, 0x23}, {0x31FB, 0x23}, {0x31FC, 0x23},
-    {0x31FD, 0x23}, {0x31FE, 0x23}, {0x31FF, 0x23},
-};
-const FX_JAPCHARPROPERTYEX* FX_GetJapCharPropertyEx(FX_WCHAR wch) {
-  int32_t iStart = 0;
-  int32_t iEnd =
-      sizeof(gs_FX_JapCharPropertysEx) / sizeof(FX_JAPCHARPROPERTYEX);
-  while (iStart <= iEnd) {
-    int32_t iMid = (iStart + iEnd) / 2;
-    FX_WCHAR wJapChar = gs_FX_JapCharPropertysEx[iMid].wChar;
-    if (wch == wJapChar) {
-      return gs_FX_JapCharPropertysEx + iMid;
-    } else if (wch < wJapChar) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  }
-  return NULL;
-}
-FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch,
-                                   FX_BOOL bMBCSCode,
-                                   IFX_Font* pFont,
-                                   FX_FLOAT fFontSize,
-                                   FX_BOOL bVertical,
-                                   CFX_PointF& ptOffset) {
-  if (pFont == NULL || !bVertical) {
-    return FALSE;
-  }
-  if (wch < 0x3001 || wch > 0x31FF) {
-    return FALSE;
-  }
-  const FX_JAPCHARPROPERTYEX* pJapChar = FX_GetJapCharPropertyEx(wch);
-  if (pJapChar == NULL) {
-    return FALSE;
-  }
-  CFX_Rect rtBBox;
-  rtBBox.Reset();
-  if (pFont->GetCharBBox(wch, rtBBox, bMBCSCode)) {
-    switch (pJapChar->uAlign & 0xF0) {
-      case FX_JAPCHARPROPERTYEX_Top:
-        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 1200.0f;
-        break;
-      case FX_JAPCHARPROPERTYEX_Middle:
-        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 6000.0f;
-        break;
-    }
-    switch (pJapChar->uAlign & 0x0F) {
-      case FX_JAPCHARPROPERTYEX_Center:
-        ptOffset.x = fFontSize * (600 - rtBBox.right()) / 1000.0f;
-        break;
-      case FX_JAPCHARPROPERTYEX_Right:
-        ptOffset.x = fFontSize * (950 - rtBBox.right()) / 1000.0f;
-        break;
-    }
-  }
-  return TRUE;
-}
diff --git a/xfa/src/fgas/layout/fgas_unicode.h b/xfa/src/fgas/layout/fgas_unicode.h
deleted file mode 100644
index f25da87..0000000
--- a/xfa/src/fgas/layout/fgas_unicode.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LAYOUT_FGAS_UNICODE_H_
-#define XFA_SRC_FGAS_LAYOUT_FGAS_UNICODE_H_
-
-#include "xfa/src/fgas/font/fgas_font.h"
-#include "xfa/src/fgas/crt/fgas_utils.h"
-
-#define FX_JAPCHARPROPERTYEX_Left 0x01
-#define FX_JAPCHARPROPERTYEX_Center 0x02
-#define FX_JAPCHARPROPERTYEX_Right 0x03
-#define FX_JAPCHARPROPERTYEX_Top 0x10
-#define FX_JAPCHARPROPERTYEX_Middle 0x20
-#define FX_JAPCHARPROPERTYEX_Bottom 0x30
-
-struct FX_TPO {
-  int32_t index;
-  int32_t pos;
-};
-typedef CFX_MassArrayTemplate<FX_TPO> CFX_TPOArray;
-
-void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray& tpos, int32_t iStart, int32_t iEnd);
-
-struct FX_JAPCHARPROPERTYEX {
-  FX_WCHAR wChar;
-  uint8_t uAlign;
-};
-
-const FX_JAPCHARPROPERTYEX* FX_GetJapCharPropertyEx(FX_WCHAR wch);
-typedef FX_BOOL (*FX_AdjustCharDisplayPos)(FX_WCHAR wch,
-                                           FX_BOOL bMBCSCode,
-                                           IFX_Font* pFont,
-                                           FX_FLOAT fFontSize,
-                                           FX_BOOL bVertical,
-                                           CFX_PointF& ptOffset);
-FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch,
-                                   FX_BOOL bMBCSCode,
-                                   IFX_Font* pFont,
-                                   FX_FLOAT fFontSize,
-                                   FX_BOOL bVertical,
-                                   CFX_PointF& ptOffset);
-
-#endif  // XFA_SRC_FGAS_LAYOUT_FGAS_UNICODE_H_
diff --git a/xfa/src/fgas/localization/fgas_datetime.cpp b/xfa/src/fgas/localization/fgas_datetime.cpp
deleted file mode 100644
index e803b49..0000000
--- a/xfa/src/fgas/localization/fgas_datetime.cpp
+++ /dev/null
@@ -1,550 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fgas/localization/fgas_datetime.h"
-
-#if _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_ || \
-    _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_
-#include <sys/time.h>
-#include <time.h>
-#endif
-
-const uint8_t g_FXDaysPerMonth[12] = {31, 28, 31, 30, 31, 30,
-                                      31, 31, 30, 31, 30, 31};
-const uint8_t g_FXDaysPerLeapMonth[12] = {31, 29, 31, 30, 31, 30,
-                                          31, 31, 30, 31, 30, 31};
-const int32_t g_FXDaysBeforeMonth[12] = {0,   31,  59,  90,  120, 151,
-                                         181, 212, 243, 273, 304, 334};
-const int32_t g_FXDaysBeforeLeapMonth[12] = {0,   31,  60,  91,  121, 152,
-                                             182, 213, 244, 274, 305, 335};
-const int32_t g_FXDaysPerYear = 365;
-const int32_t g_FXDaysPerLeapYear = 366;
-const int32_t g_FXDaysPer4Years = 1461;
-const int32_t g_FXDaysPer100Years = 36524;
-const int32_t g_FXDaysPer400Years = 146097;
-const int64_t g_FXMillisecondsPerSecond = 1000;
-const int64_t g_FXMillisecondsPerMinute = 60000;
-const int64_t g_FXMillisecondsPerHour = 3600000;
-const int64_t g_FXMillisecondsPerDay = 86400000;
-FX_BOOL FX_IsLeapYear(int32_t iYear) {
-  FXSYS_assert(iYear != 0);
-  return ((iYear % 4) == 0 && (iYear % 100) != 0) || (iYear % 400) == 0;
-}
-int32_t FX_DaysInYear(int32_t iYear) {
-  FXSYS_assert(iYear != 0);
-  return FX_IsLeapYear(iYear) ? g_FXDaysPerLeapYear : g_FXDaysPerYear;
-}
-uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth) {
-  FXSYS_assert(iYear != 0);
-  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
-  const uint8_t* p =
-      FX_IsLeapYear(iYear) ? g_FXDaysPerLeapMonth : g_FXDaysPerMonth;
-  return p[iMonth - 1];
-}
-static int32_t FX_DaysBeforeMonthInYear(int32_t iYear, uint8_t iMonth) {
-  FXSYS_assert(iYear != 0);
-  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
-  const int32_t* p =
-      FX_IsLeapYear(iYear) ? g_FXDaysBeforeLeapMonth : g_FXDaysBeforeMonth;
-  return p[iMonth - 1];
-}
-static int64_t FX_DateToDays(int32_t iYear,
-                             uint8_t iMonth,
-                             uint8_t iDay,
-                             FX_BOOL bIncludeThisDay = FALSE) {
-  FXSYS_assert(iYear != 0);
-  FXSYS_assert(iMonth >= 1 && iMonth <= 12);
-  FXSYS_assert(iDay >= 1 && iDay <= FX_DaysInMonth(iYear, iMonth));
-  int64_t iDays = FX_DaysBeforeMonthInYear(iYear, iMonth);
-  iDays += iDay;
-  if (!bIncludeThisDay) {
-    iDays--;
-  }
-  if (iYear > 0) {
-    iYear--;
-  } else {
-    iDays -= FX_DaysInYear(iYear);
-    iYear++;
-  }
-  return iDays + (int64_t)iYear * 365 + iYear / 4 - iYear / 100 + iYear / 400;
-}
-static void FX_DaysToDate(int64_t iDays,
-                          int32_t& iYear,
-                          uint8_t& iMonth,
-                          uint8_t& iDay) {
-  FX_BOOL bBC = iDays < 0;
-  if (bBC) {
-    iDays = -iDays;
-  }
-  iYear = 1;
-  iMonth = 1;
-  iDay = 1;
-  if (iDays >= g_FXDaysPer400Years) {
-    iYear += (int32_t)(iDays / g_FXDaysPer400Years * 400);
-    iDays %= g_FXDaysPer400Years;
-  }
-  if (iDays >= g_FXDaysPer100Years) {
-    if (iDays == g_FXDaysPer100Years * 4) {
-      iYear += 300;
-      iDays -= g_FXDaysPer100Years * 3;
-    } else {
-      iYear += (int32_t)(iDays / g_FXDaysPer100Years * 100);
-      iDays %= g_FXDaysPer100Years;
-    }
-  }
-  if (iDays >= g_FXDaysPer4Years) {
-    iYear += (int32_t)(iDays / g_FXDaysPer4Years * 4);
-    iDays %= g_FXDaysPer4Years;
-  }
-  while (TRUE) {
-    int32_t iYearDays = FX_DaysInYear(iYear);
-    if (iDays < iYearDays) {
-      if (bBC) {
-        iYear = -iYear;
-        iDays = iYearDays - iDays;
-      }
-      break;
-    }
-    iYear++;
-    iDays -= iYearDays;
-  }
-  while (TRUE) {
-    int32_t iMonthDays = FX_DaysInMonth(iYear, iMonth);
-    if (iDays < iMonthDays) {
-      break;
-    }
-    iMonth++;
-    iDays -= iMonthDays;
-  }
-  iDay += (uint8_t)iDays;
-}
-
-struct FXUT_SYSTEMTIME {
-  FX_WORD wYear;
-  FX_WORD wMonth;
-  FX_WORD wDayOfWeek;
-  FX_WORD wDay;
-  FX_WORD wHour;
-  FX_WORD wMinute;
-  FX_WORD wSecond;
-  FX_WORD wMilliseconds;
-};
-
-void CFX_Unitime::Now() {
-  FXUT_SYSTEMTIME utLocal;
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
-    _FX_OS_ == _FX_WIN64_
-  ::GetLocalTime((LPSYSTEMTIME)&utLocal);
-#elif _FX_OS_ != _FX_EMBEDDED_
-#if 1
-  timeval curTime;
-  gettimeofday(&curTime, NULL);
-#else
-  struct timespec curTime;
-  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
-#endif
-  struct tm st;
-  localtime_r(&curTime.tv_sec, &st);
-  utLocal.wYear = st.tm_year + 1900;
-  utLocal.wMonth = st.tm_mon + 1;
-  utLocal.wDayOfWeek = st.tm_wday;
-  utLocal.wDay = st.tm_mday;
-  utLocal.wHour = st.tm_hour;
-  utLocal.wMinute = st.tm_min;
-  utLocal.wSecond = st.tm_sec;
-  utLocal.wMilliseconds = curTime.tv_usec / 1000;
-#endif
-  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
-      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
-      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
-}
-void CFX_Unitime::SetGMTime() {
-  FXUT_SYSTEMTIME utLocal;
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
-    _FX_OS_ == _FX_WIN64_
-  ::GetSystemTime((LPSYSTEMTIME)&utLocal);
-#elif _FX_OS_ != _FX_EMBEDDED_
-#if 1
-  timeval curTime;
-  gettimeofday(&curTime, NULL);
-#else
-  struct timespec curTime;
-  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime);
-#endif
-  struct tm st;
-  gmtime_r(&curTime.tv_sec, &st);
-  utLocal.wYear = st.tm_year + 1900;
-  utLocal.wMonth = st.tm_mon + 1;
-  utLocal.wDayOfWeek = st.tm_wday;
-  utLocal.wDay = st.tm_mday;
-  utLocal.wHour = st.tm_hour;
-  utLocal.wMinute = st.tm_min;
-  utLocal.wSecond = st.tm_sec;
-  utLocal.wMilliseconds = curTime.tv_usec / 1000;
-#endif
-  Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay,
-      (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute,
-      (uint8_t)utLocal.wSecond, (FX_WORD)utLocal.wMilliseconds);
-}
-void CFX_Unitime::Set(int32_t year,
-                      uint8_t month,
-                      uint8_t day,
-                      uint8_t hour,
-                      uint8_t minute,
-                      uint8_t second,
-                      FX_WORD millisecond) {
-  FXSYS_assert(hour <= 23);
-  FXSYS_assert(minute <= 59);
-  FXSYS_assert(second <= 59);
-  FXSYS_assert(millisecond <= 999);
-  m_iUnitime = (int64_t)hour * g_FXMillisecondsPerHour +
-               (int64_t)minute * g_FXMillisecondsPerMinute +
-               (int64_t)second * g_FXMillisecondsPerSecond + millisecond;
-  if (year > 0) {
-    m_iUnitime =
-        m_iUnitime +
-        FX_DateToDays(year, month, day, FALSE) * g_FXMillisecondsPerDay;
-  }
-}
-void CFX_Unitime::Set(FX_UNITIME t) {
-  m_iUnitime = t;
-}
-int32_t CFX_Unitime::GetYear() const {
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  return iYear;
-}
-uint8_t CFX_Unitime::GetMonth() const {
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  return iMonth;
-}
-uint8_t CFX_Unitime::GetDay() const {
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  return iDay;
-}
-FX_WEEKDAY CFX_Unitime::GetDayOfWeek() const {
-  int32_t v = (int32_t)((m_iUnitime / g_FXMillisecondsPerDay + 1) % 7);
-  if (v < 0) {
-    v += 7;
-  }
-  return (FX_WEEKDAY)v;
-}
-FX_WORD CFX_Unitime::GetDayOfYear() const {
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  return FX_DaysBeforeMonthInYear(iYear, iMonth) + iDay;
-}
-int64_t CFX_Unitime::GetDayOfAD() const {
-  FX_BOOL bBC = m_iUnitime < 0;
-  int64_t iDays = m_iUnitime / g_FXMillisecondsPerDay;
-  iDays += bBC ? -1 : 0;
-  if (bBC && (m_iUnitime % g_FXMillisecondsPerDay) == 0) {
-    iDays++;
-  }
-  return iDays;
-}
-uint8_t CFX_Unitime::GetHour() const {
-  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerDay);
-  if (v < 0) {
-    v += g_FXMillisecondsPerDay;
-  }
-  return (uint8_t)(v / g_FXMillisecondsPerHour);
-}
-uint8_t CFX_Unitime::GetMinute() const {
-  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerHour);
-  if (v < 0) {
-    v += g_FXMillisecondsPerHour;
-  }
-  return (uint8_t)(v / g_FXMillisecondsPerMinute);
-}
-uint8_t CFX_Unitime::GetSecond() const {
-  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerMinute);
-  if (v < 0) {
-    v += g_FXMillisecondsPerMinute;
-  }
-  return (uint8_t)(v / g_FXMillisecondsPerSecond);
-}
-FX_WORD CFX_Unitime::GetMillisecond() const {
-  int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerSecond);
-  if (v < 0) {
-    v += g_FXMillisecondsPerSecond;
-  }
-  return (FX_WORD)v;
-}
-FX_BOOL CFX_Unitime::AddYears(int32_t iYears) {
-  FX_UNITIME ut = m_iUnitime;
-  if (ut < 0) {
-    ut = -ut;
-  }
-  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  iYear += iYears;
-  if (iYear == 0) {
-    iYear = iYears > 0 ? 1 : -1;
-  }
-  m_iUnitime =
-      FX_DateToDays(iYear, iMonth, iDay, FALSE) * g_FXMillisecondsPerDay;
-  m_iUnitime += (iYear < 0) ? -r : r;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddMonths(int32_t iMonths) {
-  FX_BOOL b = iMonths > 0;
-  FX_UNITIME ut = m_iUnitime;
-  if (ut < 0) {
-    ut = -ut;
-  }
-  FX_UNITIME r = ut % g_FXMillisecondsPerDay;
-  int32_t iYear;
-  uint8_t iMonth, iDay;
-  FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay);
-  iMonths += iMonth;
-  while (iMonths < 1) {
-    iYear--, iMonths += 12;
-  }
-  while (iMonths > 12) {
-    iYear++, iMonths -= 12;
-  }
-  if (iYear == 0) {
-    iYear = b ? 1 : -1;
-  }
-  m_iUnitime = FX_DateToDays(iYear, (uint8_t)iMonths, iDay, FALSE) *
-               g_FXMillisecondsPerDay;
-  m_iUnitime += (iYear < 0) ? -r : r;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddDays(int32_t iDays) {
-  m_iUnitime += (int64_t)iDays * g_FXMillisecondsPerDay;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddHours(int32_t iHours) {
-  m_iUnitime += (int64_t)iHours * g_FXMillisecondsPerHour;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddMinutes(int32_t iMinutes) {
-  m_iUnitime += (int64_t)iMinutes * g_FXMillisecondsPerMinute;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddSeconds(int32_t iSeconds) {
-  m_iUnitime += ((int64_t)iSeconds) * g_FXMillisecondsPerSecond;
-  return TRUE;
-}
-FX_BOOL CFX_Unitime::AddMilliseconds(int32_t iMilliseconds) {
-  m_iUnitime += iMilliseconds;
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::Set(int32_t year,
-                          uint8_t month,
-                          uint8_t day,
-                          uint8_t hour,
-                          uint8_t minute,
-                          uint8_t second,
-                          FX_WORD millisecond) {
-  ASSERT(year != 0);
-  ASSERT(month >= 1 && month <= 12);
-  ASSERT(day >= 1 && day <= FX_DaysInMonth(year, month));
-  ASSERT(hour <= 23);
-  ASSERT(minute <= 59);
-  ASSERT(second <= 59);
-  ASSERT(millisecond <= 999);
-  m_DateTime.Date.sDate.year = year;
-  m_DateTime.Date.sDate.month = month;
-  m_DateTime.Date.sDate.day = day;
-  m_DateTime.Time.sTime.hour = hour;
-  m_DateTime.Time.sTime.minute = minute;
-  m_DateTime.Time.sTime.second = second;
-  m_DateTime.Time.sTime.millisecond = millisecond;
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::FromUnitime(FX_UNITIME t) {
-  CFX_Unitime ut(t);
-  FX_DaysToDate(ut.GetDayOfAD(), m_DateTime.Date.sDate.year,
-                m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day);
-  m_DateTime.Date.sDate.day = ut.GetHour();
-  m_DateTime.Time.sTime.minute = ut.GetMinute();
-  m_DateTime.Time.sTime.second = ut.GetSecond();
-  m_DateTime.Time.sTime.millisecond = ut.GetMillisecond();
-  return TRUE;
-}
-FX_UNITIME CFX_DateTime::ToUnitime() const {
-  FX_UNITIME v =
-      (int64_t)m_DateTime.Date.sDate.day * g_FXMillisecondsPerHour +
-      (int64_t)m_DateTime.Time.sTime.minute * g_FXMillisecondsPerMinute +
-      (int64_t)m_DateTime.Time.sTime.second * g_FXMillisecondsPerSecond +
-      m_DateTime.Time.sTime.millisecond;
-  v += FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
-                     m_DateTime.Date.sDate.day, FALSE) *
-       g_FXMillisecondsPerDay;
-  return v;
-}
-int32_t CFX_DateTime::GetYear() const {
-  return m_DateTime.Date.sDate.year;
-}
-uint8_t CFX_DateTime::GetMonth() const {
-  return m_DateTime.Date.sDate.month;
-}
-uint8_t CFX_DateTime::GetDay() const {
-  return m_DateTime.Date.sDate.day;
-}
-FX_WEEKDAY CFX_DateTime::GetDayOfWeek() const {
-  int32_t v = (int32_t)(FX_DateToDays(m_DateTime.Date.sDate.year,
-                                      m_DateTime.Date.sDate.month,
-                                      m_DateTime.Date.sDate.day, TRUE) %
-                        7);
-  if (v < 0) {
-    v += 7;
-  }
-  return (FX_WEEKDAY)v;
-}
-FX_WORD CFX_DateTime::GetDayOfYear() const {
-  return FX_DaysBeforeMonthInYear(m_DateTime.Date.sDate.year,
-                                  m_DateTime.Date.sDate.month) +
-         m_DateTime.Date.sDate.day;
-}
-int64_t CFX_DateTime::GetDayOfAD() const {
-  return FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
-                       m_DateTime.Date.sDate.day, TRUE);
-}
-uint8_t CFX_DateTime::GetHour() const {
-  return m_DateTime.Date.sDate.day;
-}
-uint8_t CFX_DateTime::GetMinute() const {
-  return m_DateTime.Time.sTime.minute;
-}
-uint8_t CFX_DateTime::GetSecond() const {
-  return m_DateTime.Time.sTime.second;
-}
-FX_WORD CFX_DateTime::GetMillisecond() const {
-  return m_DateTime.Time.sTime.millisecond;
-}
-FX_BOOL CFX_DateTime::AddYears(int32_t iYears) {
-  if (iYears == 0) {
-    return FALSE;
-  }
-  int32_t v = m_DateTime.Date.sDate.year + iYears;
-  if (v >= 0 && m_DateTime.Date.sDate.year < 0) {
-    v++;
-  } else if (v <= 0 && m_DateTime.Date.sDate.year > 0) {
-    v--;
-  }
-  m_DateTime.Date.sDate.year = v;
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddMonths(int32_t iMonths) {
-  if (iMonths == 0) {
-    return FALSE;
-  }
-  FX_BOOL b = iMonths > 0;
-  iMonths += m_DateTime.Date.sDate.month;
-  while (iMonths < 1) {
-    m_DateTime.Date.sDate.year--;
-    if (m_DateTime.Date.sDate.year == 0) {
-      m_DateTime.Date.sDate.year = -1;
-    }
-    iMonths += 12;
-  }
-  while (iMonths > 12) {
-    m_DateTime.Date.sDate.year++;
-    if (m_DateTime.Date.sDate.year == 0) {
-      m_DateTime.Date.sDate.year = 1;
-    }
-    iMonths -= 12;
-  }
-  if (m_DateTime.Date.sDate.year == 0) {
-    m_DateTime.Date.sDate.year = b ? 1 : -1;
-  }
-  m_DateTime.Date.sDate.month = (uint8_t)iMonths;
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddDays(int32_t iDays) {
-  if (iDays == 0) {
-    return FALSE;
-  }
-  int64_t v1 =
-      FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
-                    m_DateTime.Date.sDate.day, TRUE);
-  int64_t v2 = v1 + iDays;
-  if (v2 <= 0 && v1 > 0) {
-    v2--;
-  } else if (v2 >= 0 && v1 < 0) {
-    v2++;
-  }
-  FX_DaysToDate(v2, m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month,
-                m_DateTime.Date.sDate.day);
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddHours(int32_t iHours) {
-  if (iHours == 0) {
-    return FALSE;
-  }
-  iHours += m_DateTime.Date.sDate.day;
-  int32_t iDays = iHours / 24;
-  iHours %= 24;
-  if (iHours < 0) {
-    iDays--, iHours += 24;
-  }
-  m_DateTime.Date.sDate.day = (uint8_t)iHours;
-  if (iDays != 0) {
-    AddDays(iDays);
-  }
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddMinutes(int32_t iMinutes) {
-  if (iMinutes == 0) {
-    return FALSE;
-  }
-  iMinutes += m_DateTime.Time.sTime.minute;
-  int32_t iHours = iMinutes / 60;
-  iMinutes %= 60;
-  if (iMinutes < 0) {
-    iHours--, iMinutes += 60;
-  }
-  m_DateTime.Time.sTime.minute = (uint8_t)iMinutes;
-  if (iHours != 0) {
-    AddHours(iHours);
-  }
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddSeconds(int32_t iSeconds) {
-  if (iSeconds == 0) {
-    return FALSE;
-  }
-  iSeconds += m_DateTime.Time.sTime.second;
-  int32_t iMinutes = iSeconds / 60;
-  iSeconds %= 60;
-  if (iSeconds < 0) {
-    iMinutes--, iSeconds += 60;
-  }
-  m_DateTime.Time.sTime.second = (uint8_t)iSeconds;
-  if (iMinutes != 0) {
-    AddMinutes(iMinutes);
-  }
-  return TRUE;
-}
-FX_BOOL CFX_DateTime::AddMilliseconds(int32_t iMilliseconds) {
-  if (iMilliseconds == 0) {
-    return FALSE;
-  }
-  iMilliseconds += m_DateTime.Time.sTime.millisecond;
-  int32_t iSeconds = (int32_t)(iMilliseconds / g_FXMillisecondsPerSecond);
-  iMilliseconds %= g_FXMillisecondsPerSecond;
-  if (iMilliseconds < 0) {
-    iSeconds--, iMilliseconds += g_FXMillisecondsPerSecond;
-  }
-  m_DateTime.Time.sTime.millisecond = (FX_WORD)iMilliseconds;
-  if (iSeconds != 0) {
-    AddSeconds(iSeconds);
-  }
-  return TRUE;
-}
diff --git a/xfa/src/fgas/localization/fgas_datetime.h b/xfa/src/fgas/localization/fgas_datetime.h
deleted file mode 100644
index 5dd70cc..0000000
--- a/xfa/src/fgas/localization/fgas_datetime.h
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LOCALIZATION_FGAS_DATETIME_H_
-#define XFA_SRC_FGAS_LOCALIZATION_FGAS_DATETIME_H_
-
-#include "core/include/fxcrt/fx_system.h"
-
-class CFX_Unitime;
-class CFX_DateTime;
-
-typedef int64_t FX_UNITIME;
-enum FX_WEEKDAY {
-  FX_Sunday = 0,
-  FX_Monday,
-  FX_Tuesday,
-  FX_Wednesday,
-  FX_Thursday,
-  FX_Friday,
-  FX_Saturday,
-};
-
-FX_BOOL FX_IsLeapYear(int32_t iYear);
-int32_t FX_DaysInYear(int32_t iYear);
-uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
-
-class CFX_Unitime {
- public:
-  CFX_Unitime() { m_iUnitime = 0; }
-  CFX_Unitime(FX_UNITIME iUnitime) { m_iUnitime = iUnitime; }
-  CFX_Unitime(const CFX_Unitime& unitime) { m_iUnitime = unitime.m_iUnitime; }
-  operator FX_UNITIME*() { return &m_iUnitime; }
-  operator FX_UNITIME const*() const { return &m_iUnitime; }
-  operator FX_UNITIME&() { return m_iUnitime; }
-  operator const FX_UNITIME&() const { return m_iUnitime; }
-  CFX_Unitime& operator=(const CFX_Unitime& t) {
-    m_iUnitime = t.m_iUnitime;
-    return *this;
-  }
-  CFX_Unitime& operator=(FX_UNITIME t) {
-    m_iUnitime = t;
-    return *this;
-  }
-  CFX_Unitime& operator+=(const CFX_Unitime& t) {
-    m_iUnitime += t.m_iUnitime;
-    return *this;
-  }
-  CFX_Unitime& operator+=(FX_UNITIME t) {
-    m_iUnitime += t;
-    return *this;
-  }
-  CFX_Unitime& operator-=(const CFX_Unitime& t) {
-    m_iUnitime -= t.m_iUnitime;
-    return *this;
-  }
-  CFX_Unitime& operator-=(FX_UNITIME t) {
-    m_iUnitime -= t;
-    return *this;
-  }
-  void Now();
-  void SetGMTime();
-  void Set(int32_t year,
-           uint8_t month,
-           uint8_t day,
-           uint8_t hour = 0,
-           uint8_t minute = 0,
-           uint8_t second = 0,
-           FX_WORD millisecond = 0);
-  void Set(FX_UNITIME t);
-  int32_t GetYear() const;
-  uint8_t GetMonth() const;
-  uint8_t GetDay() const;
-  FX_WEEKDAY GetDayOfWeek() const;
-  FX_WORD GetDayOfYear() const;
-  int64_t GetDayOfAD() const;
-  uint8_t GetHour() const;
-  uint8_t GetMinute() const;
-  uint8_t GetSecond() const;
-  FX_WORD GetMillisecond() const;
-  FX_BOOL AddYears(int32_t iYears);
-  FX_BOOL AddMonths(int32_t iMonths);
-  FX_BOOL AddDays(int32_t iDays);
-  FX_BOOL AddHours(int32_t iHours);
-  FX_BOOL AddMinutes(int32_t iMinutes);
-  FX_BOOL AddSeconds(int32_t iSeconds);
-  FX_BOOL AddMilliseconds(int32_t iMilliseconds);
-  friend CFX_Unitime operator+(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
-  }
-  friend CFX_Unitime operator+(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return CFX_Unitime(t1.m_iUnitime + t2);
-  }
-  friend CFX_Unitime operator+(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return CFX_Unitime(t1 + t2.m_iUnitime);
-  }
-  friend CFX_Unitime operator-(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return CFX_Unitime(t1.m_iUnitime + t2.m_iUnitime);
-  }
-  friend CFX_Unitime operator-(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return CFX_Unitime(t1.m_iUnitime + t2);
-  }
-  friend CFX_Unitime operator-(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return CFX_Unitime(t1 + t2.m_iUnitime);
-  }
-  friend bool operator==(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime == t2.m_iUnitime;
-  }
-  friend bool operator==(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime == t2;
-  }
-  friend bool operator==(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 == t2.m_iUnitime;
-  }
-  friend bool operator!=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime != t2.m_iUnitime;
-  }
-  friend bool operator!=(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime != t2;
-  }
-  friend bool operator!=(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 != t2.m_iUnitime;
-  }
-  friend bool operator>(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime > t2.m_iUnitime;
-  }
-  friend bool operator>(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime > t2;
-  }
-  friend bool operator>(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 > t2.m_iUnitime;
-  }
-  friend bool operator>=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime >= t2.m_iUnitime;
-  }
-  friend bool operator>=(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime >= t2;
-  }
-  friend bool operator>=(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 >= t2.m_iUnitime;
-  }
-  friend bool operator<(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime < t2.m_iUnitime;
-  }
-  friend bool operator<(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime < t2;
-  }
-  friend bool operator<(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 < t2.m_iUnitime;
-  }
-  friend bool operator<=(const CFX_Unitime& t1, const CFX_Unitime& t2) {
-    return t1.m_iUnitime <= t2.m_iUnitime;
-  }
-  friend bool operator<=(const CFX_Unitime& t1, FX_UNITIME t2) {
-    return t1.m_iUnitime <= t2;
-  }
-  friend bool operator<=(FX_UNITIME t1, const CFX_Unitime& t2) {
-    return t1 <= t2.m_iUnitime;
-  }
-
- private:
-  FX_UNITIME m_iUnitime;
-};
-
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(push, 1)
-#endif
-struct FX_DATE {
-  int32_t year;
-  uint8_t month;
-  uint8_t day;
-};
-
-struct FX_TIME {
-  uint8_t hour;
-  uint8_t minute;
-  uint8_t second;
-  FX_WORD millisecond;
-};
-
-struct FX_TIMEZONE {
-  int8_t tzHour;
-  uint8_t tzMinute;
-};
-
-struct FX_DATETIME {
-  union {
-    struct {
-      int32_t year;
-      uint8_t month;
-      uint8_t day;
-    } sDate;
-    FX_DATE aDate;
-  } Date;
-  union {
-    struct {
-      uint8_t hour;
-      uint8_t minute;
-      uint8_t second;
-      FX_WORD millisecond;
-    } sTime;
-    FX_TIME aTime;
-  } Time;
-};
-
-struct FX_DATETIMEZONE {
-  union {
-    struct {
-      union {
-        struct {
-          int32_t year;
-          uint8_t month;
-          uint8_t day;
-        };
-        FX_DATE date;
-      };
-      union {
-        struct {
-          uint8_t hour;
-          uint8_t minute;
-          uint8_t second;
-          FX_WORD millisecond;
-        };
-        FX_TIME time;
-      };
-    };
-    FX_DATETIME dt;
-  };
-  union {
-    struct {
-      int8_t tzHour;
-      uint8_t tzMinute;
-    };
-    FX_TIMEZONE tz;
-  };
-};
-#if _FX_OS_ != _FX_ANDROID_
-#pragma pack(pop)
-#endif
-
-class CFX_DateTime {
- public:
-  CFX_DateTime() {}
-  CFX_DateTime(const FX_DATETIME& dt) { m_DateTime = dt; }
-  CFX_DateTime(const CFX_DateTime& dt) { m_DateTime = dt.m_DateTime; }
-  virtual ~CFX_DateTime() {}
-  operator FX_DATETIME*() { return &m_DateTime; }
-  operator const FX_DATETIME*() const { return &m_DateTime; }
-  operator FX_DATETIME&() { return m_DateTime; }
-  operator const FX_DATETIME&() const { return m_DateTime; }
-  CFX_DateTime& operator=(const CFX_DateTime& dt) {
-    m_DateTime = dt.m_DateTime;
-    return *this;
-  }
-  CFX_DateTime& operator=(const FX_DATETIME& dt) {
-    m_DateTime = dt;
-    return *this;
-  }
-  CFX_DateTime& operator+=(const CFX_DateTime& dt) {
-    FromUnitime(ToUnitime() + dt.ToUnitime());
-    return *this;
-  }
-  CFX_DateTime& operator+=(const FX_DATETIME& dt) {
-    FromUnitime(ToUnitime() + ((const CFX_DateTime&)dt).ToUnitime());
-    return *this;
-  }
-  CFX_DateTime& operator-=(const CFX_DateTime& dt) {
-    FromUnitime(ToUnitime() - dt.ToUnitime());
-    return *this;
-  }
-  CFX_DateTime& operator-=(const FX_DATETIME& dt) {
-    FromUnitime(ToUnitime() - ((const CFX_DateTime&)dt).ToUnitime());
-    return *this;
-  }
-  virtual FX_BOOL Set(int32_t year,
-                      uint8_t month,
-                      uint8_t day,
-                      uint8_t hour = 0,
-                      uint8_t minute = 0,
-                      uint8_t second = 0,
-                      FX_WORD millisecond = 0);
-  virtual FX_BOOL FromUnitime(FX_UNITIME t);
-  virtual FX_UNITIME ToUnitime() const;
-  virtual int32_t GetYear() const;
-  virtual uint8_t GetMonth() const;
-  virtual uint8_t GetDay() const;
-  virtual FX_WEEKDAY GetDayOfWeek() const;
-  virtual FX_WORD GetDayOfYear() const;
-  virtual int64_t GetDayOfAD() const;
-  virtual uint8_t GetHour() const;
-  virtual uint8_t GetMinute() const;
-  virtual uint8_t GetSecond() const;
-  virtual FX_WORD GetMillisecond() const;
-  virtual FX_BOOL AddYears(int32_t iYears);
-  virtual FX_BOOL AddMonths(int32_t iMonths);
-  virtual FX_BOOL AddDays(int32_t iDays);
-  virtual FX_BOOL AddHours(int32_t iHours);
-  virtual FX_BOOL AddMinutes(int32_t iMinutes);
-  virtual FX_BOOL AddSeconds(int32_t iSeconds);
-  virtual FX_BOOL AddMilliseconds(int32_t iMilliseconds);
-  friend CFX_DateTime operator+(const CFX_DateTime& dt1,
-                                const CFX_DateTime& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(dt1.ToUnitime() + dt2.ToUnitime());
-    return dt;
-  }
-  friend CFX_DateTime operator+(const CFX_DateTime& dt1,
-                                const FX_DATETIME& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(dt1.ToUnitime() + ((const CFX_DateTime&)dt2).ToUnitime());
-    return dt;
-  }
-  friend CFX_DateTime operator+(const FX_DATETIME& dt1,
-                                const CFX_DateTime& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() + dt2.ToUnitime());
-    return dt;
-  }
-  friend CFX_DateTime operator-(const CFX_DateTime& dt1,
-                                const CFX_DateTime& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(dt1.ToUnitime() - dt2.ToUnitime());
-    return dt;
-  }
-  friend CFX_DateTime operator-(const CFX_DateTime& dt1,
-                                const FX_DATETIME& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(dt1.ToUnitime() - ((const CFX_DateTime&)dt2).ToUnitime());
-    return dt;
-  }
-  friend CFX_DateTime operator-(const FX_DATETIME& dt1,
-                                const CFX_DateTime& dt2) {
-    CFX_DateTime dt;
-    dt.FromUnitime(((const CFX_DateTime&)dt1).ToUnitime() - dt2.ToUnitime());
-    return dt;
-  }
-  friend FX_BOOL operator==(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1),
-                        static_cast<const FX_DATETIME*>(dt2),
-                        sizeof(FX_DATETIME)) == 0;
-  }
-  friend FX_BOOL operator==(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1), &dt2,
-                        sizeof(FX_DATETIME)) == 0;
-  }
-  friend FX_BOOL operator==(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return FXSYS_memcmp(&dt1, static_cast<const FX_DATETIME*>(dt2),
-                        sizeof(FX_DATETIME)) == 0;
-  }
-  friend FX_BOOL operator!=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1),
-                        static_cast<const FX_DATETIME*>(dt2),
-                        sizeof(FX_DATETIME)) != 0;
-  }
-  friend FX_BOOL operator!=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return FXSYS_memcmp(static_cast<const FX_DATETIME*>(dt1), &dt2,
-                        sizeof(FX_DATETIME)) != 0;
-  }
-  friend FX_BOOL operator!=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return FXSYS_memcmp(&dt1, static_cast<const FX_DATETIME*>(dt2),
-                        sizeof(FX_DATETIME)) != 0;
-  }
-  friend FX_BOOL operator>(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return dt1.ToUnitime() > dt2.ToUnitime();
-  }
-  friend FX_BOOL operator>(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return dt1.ToUnitime() > ((const CFX_DateTime&)dt2).ToUnitime();
-  }
-  friend FX_BOOL operator>(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return ((const CFX_DateTime&)dt1).ToUnitime() > dt2.ToUnitime();
-  }
-  friend FX_BOOL operator>=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return dt1.ToUnitime() >= dt2.ToUnitime();
-  }
-  friend FX_BOOL operator>=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return dt1.ToUnitime() >= ((const CFX_DateTime&)dt2).ToUnitime();
-  }
-  friend FX_BOOL operator>=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return ((const CFX_DateTime&)dt1).ToUnitime() >= dt2.ToUnitime();
-  }
-  friend FX_BOOL operator<(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return dt1.ToUnitime() < dt2.ToUnitime();
-  }
-  friend FX_BOOL operator<(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return dt1.ToUnitime() < ((const CFX_DateTime&)dt2).ToUnitime();
-  }
-  friend FX_BOOL operator<(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return ((const CFX_DateTime&)dt1).ToUnitime() < dt2.ToUnitime();
-  }
-  friend FX_BOOL operator<=(const CFX_DateTime& dt1, const CFX_DateTime& dt2) {
-    return dt1.ToUnitime() <= dt2.ToUnitime();
-  }
-  friend FX_BOOL operator<=(const CFX_DateTime& dt1, const FX_DATETIME& dt2) {
-    return dt1.ToUnitime() <= ((const CFX_DateTime&)dt2).ToUnitime();
-  }
-  friend FX_BOOL operator<=(const FX_DATETIME& dt1, const CFX_DateTime& dt2) {
-    return ((const CFX_DateTime&)dt1).ToUnitime() <= dt2.ToUnitime();
-  }
-
- private:
-  FX_DATETIME m_DateTime;
-};
-
-#endif  // XFA_SRC_FGAS_LOCALIZATION_FGAS_DATETIME_H_
diff --git a/xfa/src/fgas/localization/fgas_locale.cpp b/xfa/src/fgas/localization/fgas_locale.cpp
deleted file mode 100644
index 1eaa0eb..0000000
--- a/xfa/src/fgas/localization/fgas_locale.cpp
+++ /dev/null
@@ -1,5030 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "core/include/fxcrt/fx_xml.h"
-#include "xfa/src/fgas/localization/fgas_localeimp.h"
-
-#define FX_LOCALECATEGORY_DateHash 0xbde9abde
-#define FX_LOCALECATEGORY_TimeHash 0x2d71b00f
-#define FX_LOCALECATEGORY_DateTimeHash 0x158c72ed
-#define FX_LOCALECATEGORY_NumHash 0x0b4ff870
-#define FX_LOCALECATEGORY_TextHash 0x2d08af85
-#define FX_LOCALECATEGORY_ZeroHash 0x568cb500
-#define FX_LOCALECATEGORY_NullHash 0x052931bb
-
-struct FX_LOCALESUBCATEGORYINFO {
-  uint32_t uHash;
-  const FX_WCHAR* pName;
-  int32_t eSubCategory;
-};
-
-static const FX_LOCALESUBCATEGORYINFO g_FXLocaleDateTimeSubCatData[] = {
-    {0x14da2125, L"default", FX_LOCALEDATETIMESUBCATEGORY_Default},
-    {0x9041d4b0, L"short", FX_LOCALEDATETIMESUBCATEGORY_Short},
-    {0xa084a381, L"medium", FX_LOCALEDATETIMESUBCATEGORY_Medium},
-    {0xcdce56b3, L"full", FX_LOCALEDATETIMESUBCATEGORY_Full},
-    {0xf6b4afb0, L"long", FX_LOCALEDATETIMESUBCATEGORY_Long},
-};
-static const int32_t g_iFXLocaleDateTimeSubCatCount =
-    sizeof(g_FXLocaleDateTimeSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO);
-
-static const FX_LOCALESUBCATEGORYINFO g_FXLocaleNumSubCatData[] = {
-    {0x46f95531, L"percent", FX_LOCALENUMPATTERN_Percent},
-    {0x4c4e8acb, L"currency", FX_LOCALENUMPATTERN_Currency},
-    {0x54034c2f, L"decimal", FX_LOCALENUMPATTERN_Decimal},
-    {0x7568e6ae, L"integer", FX_LOCALENUMPATTERN_Integer},
-};
-static const int32_t g_iFXLocaleNumSubCatCount =
-    sizeof(g_FXLocaleNumSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO);
-
-struct FX_LOCALETIMEZONEINFO {
-  FX_DWORD uHash;
-  int16_t iHour;
-  int16_t iMinute;
-};
-
-static const FX_LOCALETIMEZONEINFO g_FXLocaleTimeZoneData[] = {
-    {FXBSTR_ID(0, 'C', 'D', 'T'), -5, 0}, {FXBSTR_ID(0, 'C', 'S', 'T'), -6, 0},
-    {FXBSTR_ID(0, 'E', 'D', 'T'), -4, 0}, {FXBSTR_ID(0, 'E', 'S', 'T'), -5, 0},
-    {FXBSTR_ID(0, 'M', 'D', 'T'), -6, 0}, {FXBSTR_ID(0, 'M', 'S', 'T'), -7, 0},
-    {FXBSTR_ID(0, 'P', 'D', 'T'), -7, 0}, {FXBSTR_ID(0, 'P', 'S', 'T'), -8, 0},
-};
-
-static const CFX_WideStringC gs_wsTextSymbols = FX_WSTRC(L"AXO09");
-static const CFX_WideStringC gs_wsTimeSymbols = FX_WSTRC(L"hHkKMSFAzZ");
-static const CFX_WideStringC gs_wsDateSymbols = FX_WSTRC(L"DJMEeGgYwW");
-static const CFX_WideStringC gs_wsConstChars = FX_WSTRC(L",-:/. ");
-
-static FX_STRSIZE FX_Local_Find(const CFX_WideStringC& wsSymbols,
-                                FX_WCHAR ch,
-                                FX_STRSIZE nStart = 0) {
-  FX_STRSIZE nLength = wsSymbols.GetLength();
-  if (nLength < 1 || nStart > nLength) {
-    return -1;
-  }
-  const FX_WCHAR* lpsz =
-      (const FX_WCHAR*)FXSYS_wcschr(wsSymbols.GetPtr() + nStart, ch);
-  return (lpsz == NULL) ? -1 : (FX_STRSIZE)(lpsz - wsSymbols.GetPtr());
-}
-static const FX_WCHAR* const gs_LocalNumberSymbols[] = {
-    L"decimal", L"grouping",       L"percent",      L"minus",
-    L"zero",    L"currencySymbol", L"currencyName",
-};
-IFX_Locale* IFX_Locale::Create(CXML_Element* pLocaleData) {
-  return new CFX_Locale(pLocaleData);
-}
-CFX_Locale::CFX_Locale(CXML_Element* pLocaleData) {
-  m_pElement = pLocaleData;
-}
-CFX_Locale::~CFX_Locale() {}
-CFX_WideString CFX_Locale::GetName() {
-  return CFX_WideString();
-}
-static CFX_WideString FX_GetXMLContent(const CFX_ByteStringC& bsSpace,
-                                       CXML_Element* pxmlElement,
-                                       const CFX_ByteStringC& bsTag,
-                                       const CFX_WideStringC& wsName) {
-  CXML_Element* pDatePattern = NULL;
-  int32_t nCount = pxmlElement->CountElements(bsSpace, bsTag);
-  int32_t i = 0;
-  for (; i < nCount; i++) {
-    pDatePattern = pxmlElement->GetElement(bsSpace, bsTag, i);
-    if (pDatePattern->GetAttrValue("name") == wsName) {
-      break;
-    }
-  }
-  if (i < nCount && pDatePattern) {
-    return pDatePattern->GetContent(0);
-  }
-  return L"";
-}
-void CFX_Locale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                   CFX_WideString& wsNumSymbol) const {
-  if (!m_pElement) {
-    return;
-  }
-  CFX_ByteString bsSpace;
-  CFX_WideString wsName = gs_LocalNumberSymbols[eType];
-  CXML_Element* pNumberSymbols =
-      m_pElement->GetElement(bsSpace, "numberSymbols");
-  if (!pNumberSymbols) {
-    return;
-  }
-  wsNumSymbol =
-      FX_GetXMLContent(bsSpace, pNumberSymbols, "numberSymbol", wsName);
-}
-void CFX_Locale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
-  if (!m_pElement) {
-    return;
-  }
-  CFX_ByteString bsSpace;
-  CXML_Element* pNumberSymbols =
-      m_pElement->GetElement(bsSpace, "dateTimeSymbols");
-  if (!pNumberSymbols) {
-    return;
-  }
-  wsDtSymbol = pNumberSymbols->GetContent(0);
-}
-static void FX_GetCalendarSymbol(CXML_Element* pXmlElement,
-                                 const CFX_ByteString& symbol_type,
-                                 int32_t index,
-                                 FX_BOOL bAbbr,
-                                 CFX_WideString& wsName) {
-  CFX_ByteString bsSpace;
-  CFX_ByteString pstrSymbolNames = symbol_type + "Names";
-  CXML_Element* pChild = pXmlElement->GetElement(bsSpace, "calendarSymbols");
-  if (!pChild) {
-    return;
-  }
-  CXML_Element* pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames);
-  if (!pSymbolNames) {
-    return;
-  }
-  if (pSymbolNames->GetAttrInteger("abbr") != bAbbr) {
-    pSymbolNames = pChild->GetElement(bsSpace, pstrSymbolNames, 1);
-  }
-  if (pSymbolNames && pSymbolNames->GetAttrInteger("abbr") == bAbbr) {
-    CXML_Element* pSymbolName =
-        pSymbolNames->GetElement(bsSpace, symbol_type, index);
-    if (pSymbolName) {
-      wsName = pSymbolName->GetContent(0);
-    }
-  }
-}
-void CFX_Locale::GetMonthName(int32_t nMonth,
-                              CFX_WideString& wsMonthName,
-                              FX_BOOL bAbbr) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetCalendarSymbol(m_pElement, "month", nMonth, bAbbr, wsMonthName);
-}
-void CFX_Locale::GetDayName(int32_t nWeek,
-                            CFX_WideString& wsDayName,
-                            FX_BOOL bAbbr) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetCalendarSymbol(m_pElement, "day", nWeek, bAbbr, wsDayName);
-}
-void CFX_Locale::GetMeridiemName(CFX_WideString& wsMeridiemName,
-                                 FX_BOOL bAM) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetCalendarSymbol(m_pElement, "meridiem", bAM ? 0 : 1, FALSE,
-                       wsMeridiemName);
-}
-static int32_t FX_ParseTimeZone(const FX_WCHAR* pStr,
-                                int32_t iLen,
-                                FX_TIMEZONE& tz) {
-  tz.tzHour = 0;
-  tz.tzMinute = 0;
-  if (iLen < 0) {
-    return 0;
-  }
-  int32_t iStart = 1;
-  int32_t iEnd = iStart + 2;
-  while (iStart < iLen && iStart < iEnd) {
-    tz.tzHour = tz.tzHour * 10 + pStr[iStart++] - '0';
-  }
-  if (iStart < iLen && pStr[iStart] == ':') {
-    iStart++;
-  }
-  iEnd = iStart + 2;
-  while (iStart < iLen && iStart < iEnd) {
-    tz.tzMinute = tz.tzMinute * 10 + pStr[iStart++] - '0';
-  }
-  if (pStr[0] == '-') {
-    tz.tzHour = -tz.tzHour;
-  }
-  return iStart;
-}
-void CFX_Locale::GetTimeZone(FX_TIMEZONE& tz) const {
-  tz.tzHour = 0;
-  tz.tzMinute = 0;
-  if (!m_pElement) {
-    return;
-  }
-  CXML_Element* pxmlTimeZone = m_pElement->GetElement("", "timeZone");
-  if (pxmlTimeZone) {
-    CFX_WideString wsTimeZone = pxmlTimeZone->GetContent(0);
-    FX_ParseTimeZone(wsTimeZone, wsTimeZone.GetLength(), tz);
-  }
-}
-void CFX_Locale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetCalendarSymbol(m_pElement, "era", bAD ? 0 : 1, FALSE, wsEraName);
-}
-static void FX_GetPattern(CXML_Element* pXmlElement,
-                          const CFX_ByteString& bsCategory,
-                          const CFX_WideString& wsSubCategory,
-                          CFX_WideString& wsPattern) {
-  CFX_ByteString bsSpace;
-  CXML_Element* pDatePatterns =
-      pXmlElement->GetElement(bsSpace, bsCategory + "s");
-  if (!pDatePatterns) {
-    return;
-  }
-  wsPattern =
-      FX_GetXMLContent(bsSpace, pDatePatterns, bsCategory, wsSubCategory);
-}
-static void FX_GetDateTimePattern(CXML_Element* pXmlElement,
-                                  const CFX_ByteString& bsCategory,
-                                  FX_LOCALEDATETIMESUBCATEGORY eType,
-                                  CFX_WideString& wsPattern) {
-  CFX_WideString wsType = g_FXLocaleDateTimeSubCatData[eType].pName;
-  FX_GetPattern(pXmlElement, bsCategory, wsType, wsPattern);
-}
-void CFX_Locale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                CFX_WideString& wsPattern) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetDateTimePattern(m_pElement, "datePattern", eType, wsPattern);
-}
-void CFX_Locale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                CFX_WideString& wsPattern) const {
-  if (!m_pElement) {
-    return;
-  }
-  FX_GetDateTimePattern(m_pElement, "timePattern", eType, wsPattern);
-}
-void CFX_Locale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                               CFX_WideString& wsPattern) const {
-  CFX_WideString wsType = g_FXLocaleNumSubCatData[eType].pName;
-  FX_GetPattern(m_pElement, "numberPattern", wsType, wsPattern);
-}
-static FX_BOOL FX_IsDigit(FX_WCHAR c) {
-  return c >= '0' && c <= '9';
-}
-static FX_BOOL FX_IsAlpha(FX_WCHAR c) {
-  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
-}
-static FX_BOOL FX_IsSpace(FX_WCHAR c) {
-  return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09);
-}
-static const FX_FLOAT gs_fraction_scales[] = {
-    0.1f,         0.01f,         0.001f,        0.0001f,
-    0.00001f,     0.000001f,     0.0000001f,    0.00000001f,
-    0.000000001f, 0.0000000001f, 0.00000000001f};
-static const int32_t gs_fraction_count =
-    sizeof(gs_fraction_scales) / sizeof(FX_FLOAT);
-
-class CFX_LCNumeric {
- public:
-  CFX_LCNumeric();
-  CFX_LCNumeric(int64_t integral,
-                uint32_t fractional = 0,
-                int32_t exponent = 0);
-  CFX_LCNumeric(FX_FLOAT dbRetValue);
-  CFX_LCNumeric(double dbvalue);
-  CFX_LCNumeric(CFX_WideString& wsNumeric);
-
-  FX_FLOAT GetFloat() const;
-  double GetDouble() const;
-  CFX_WideString ToString() const;
-  CFX_WideString ToString(int32_t nTreading, FX_BOOL bTrimTailZeros) const;
-
-  int64_t m_Integral;
-  uint32_t m_Fractional;
-  int32_t m_Exponent;
-};
-
-static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue,
-                                   CFX_LCNumeric& lcnum) {
-  lcnum.m_Integral = 0;
-  lcnum.m_Fractional = 0;
-  lcnum.m_Exponent = 0;
-
-  if (wsValue.IsEmpty())
-    return FALSE;
-
-  const int32_t nIntegralMaxLen = 17;
-  int32_t cc = 0;
-  bool bNegative = false;
-  bool bExpSign = false;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsValue;
-  int32_t len = wsValue.GetLength();
-  while (cc < len && FX_IsSpace(str[cc]))
-    cc++;
-
-  if (cc >= len)
-    return FALSE;
-
-  if (str[cc] == '+') {
-    cc++;
-  } else if (str[cc] == '-') {
-    bNegative = true;
-    cc++;
-  }
-  int32_t nIntegralLen = 0;
-  while (cc < len) {
-    if (str[cc] == '.')
-      break;
-
-    if (!FX_IsDigit(str[cc])) {
-      if ((str[cc] == 'E' || str[cc] == 'e'))
-        break;
-      else
-        return FALSE;
-    }
-    if (nIntegralLen < nIntegralMaxLen) {
-      lcnum.m_Integral = lcnum.m_Integral * 10 + str[cc] - '0';
-      nIntegralLen++;
-    }
-    cc++;
-  }
-
-  lcnum.m_Integral = bNegative ? -lcnum.m_Integral : lcnum.m_Integral;
-  if (cc < len && str[cc] == '.') {
-    int scale = 0;
-    double fraction = 0.0;
-    cc++;
-    while (cc < len) {
-      if (scale >= gs_fraction_count) {
-        while (cc < len) {
-          if (!FX_IsDigit(str[cc]))
-            break;
-          cc++;
-        }
-      }
-      if (!FX_IsDigit(str[cc])) {
-        if ((str[cc] == 'E' || str[cc] == 'e'))
-          break;
-        else
-          return FALSE;
-      }
-      fraction += gs_fraction_scales[scale] * (str[cc] - '0');
-      scale++;
-      cc++;
-    }
-    lcnum.m_Fractional = (FX_DWORD)(fraction * 4294967296.0);
-  }
-  if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
-    cc++;
-    if (cc < len) {
-      if (str[cc] == '+') {
-        cc++;
-      } else if (str[cc] == '-') {
-        bExpSign = true;
-        cc++;
-      }
-    }
-    while (cc < len) {
-      if (FX_IsDigit(str[cc]))
-        return FALSE;
-      lcnum.m_Exponent = lcnum.m_Exponent * 10 + str[cc] - '0';
-      cc++;
-    }
-    lcnum.m_Exponent = bExpSign ? -lcnum.m_Exponent : lcnum.m_Exponent;
-  }
-  return TRUE;
-}
-
-CFX_LCNumeric::CFX_LCNumeric() {
-  m_Integral = 0;
-  m_Fractional = 0;
-  m_Exponent = 0;
-}
-CFX_LCNumeric::CFX_LCNumeric(int64_t integral,
-                             FX_DWORD fractional,
-                             int32_t exponent) {
-  m_Integral = integral;
-  m_Fractional = fractional;
-  m_Exponent = exponent;
-}
-CFX_LCNumeric::CFX_LCNumeric(FX_FLOAT dbRetValue) {
-  m_Integral = (int64_t)dbRetValue;
-  m_Fractional = (FX_DWORD)(((dbRetValue > 0) ? (dbRetValue - m_Integral)
-                                              : (m_Integral - dbRetValue)) *
-                            4294967296);
-  m_Exponent = 0;
-}
-CFX_LCNumeric::CFX_LCNumeric(double dbvalue) {
-  m_Integral = (int64_t)dbvalue;
-  m_Fractional = (FX_DWORD)(
-      ((dbvalue > 0) ? (dbvalue - m_Integral) : (m_Integral - dbvalue)) *
-      4294967296);
-  m_Exponent = 0;
-}
-CFX_LCNumeric::CFX_LCNumeric(CFX_WideString& wsNumeric) {
-  FX_WStringToNumeric(wsNumeric, *this);
-}
-FX_FLOAT CFX_LCNumeric::GetFloat() const {
-  FX_FLOAT dbRetValue = m_Fractional / 4294967296.0f;
-  dbRetValue = m_Integral + (m_Integral >= 0 ? dbRetValue : -dbRetValue);
-  if (m_Exponent != 0) {
-    dbRetValue *= FXSYS_pow(10, (FX_FLOAT)m_Exponent);
-  }
-  return dbRetValue;
-}
-double CFX_LCNumeric::GetDouble() const {
-  double value = m_Fractional / 4294967296.0;
-  value = m_Integral + (m_Integral >= 0 ? value : -value);
-  if (m_Exponent != 0) {
-    value *= FXSYS_pow(10, (FX_FLOAT)m_Exponent);
-  }
-  return value;
-}
-
-CFX_WideString CFX_LCNumeric::ToString() const {
-  return ToString(8, TRUE);
-}
-
-CFX_WideString CFX_LCNumeric::ToString(int32_t nTreading,
-                                       FX_BOOL bTrimTailZeros) const {
-  CFX_WideString wsFormat;
-  wsFormat.Format(L"%%.%df", nTreading);
-  CFX_WideString wsResult;
-  wsResult.Format(wsFormat.c_str(), GetDouble());
-  if (bTrimTailZeros && nTreading > 0) {
-    wsResult.TrimRight(L"0");
-    wsResult.TrimRight(L".");
-  }
-  return wsResult;
-}
-
-IFX_FormatString* IFX_FormatString::Create(IFX_LocaleMgr* pLocaleMgr,
-                                           FX_BOOL bUseLCID) {
-  if (!pLocaleMgr) {
-    return NULL;
-  }
-  return new CFX_FormatString(pLocaleMgr, bUseLCID);
-}
-CFX_FormatString::CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID)
-    : m_pLocaleMgr(pLocaleMgr), m_bUseLCID(bUseLCID) {}
-CFX_FormatString::~CFX_FormatString() {}
-void CFX_FormatString::SplitFormatString(const CFX_WideString& wsFormatString,
-                                         CFX_WideStringArray& wsPatterns) {
-  int32_t iStrLen = wsFormatString.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsFormatString;
-  const FX_WCHAR* pToken = pStr;
-  const FX_WCHAR* pEnd = pStr + iStrLen;
-  FX_BOOL iQuote = FALSE;
-  while (TRUE) {
-    if (pStr >= pEnd) {
-      CFX_WideString sub(pToken, pStr - pToken);
-      wsPatterns.Add(sub);
-      return;
-    } else if (*pStr == '\'') {
-      iQuote = !iQuote;
-    } else if (*pStr == L'|' && !iQuote) {
-      CFX_WideString sub(pToken, pStr - pToken);
-      wsPatterns.Add(sub);
-      pToken = pStr + 1;
-    }
-    pStr++;
-  }
-}
-static CFX_WideString FX_GetLiteralText(const FX_WCHAR* pStrPattern,
-                                        int32_t& iPattern,
-                                        int32_t iLenPattern) {
-  CFX_WideString wsOutput;
-  if (pStrPattern[iPattern] != '\'') {
-    return wsOutput;
-  }
-  iPattern++;
-  int32_t iQuote = 1;
-  while (iPattern < iLenPattern) {
-    if (pStrPattern[iPattern] == '\'') {
-      iQuote++;
-      if ((iPattern + 1 >= iLenPattern) ||
-          ((pStrPattern[iPattern + 1] != '\'') && (iQuote % 2 == 0))) {
-        break;
-      } else {
-        iQuote++;
-      }
-      iPattern++;
-    } else if (pStrPattern[iPattern] == '\\' && (iPattern + 1 < iLenPattern) &&
-               pStrPattern[iPattern + 1] == 'u') {
-      int32_t iKeyValue = 0;
-      iPattern += 2;
-      int32_t i = 0;
-      while (iPattern < iLenPattern && i++ < 4) {
-        FX_WCHAR ch = pStrPattern[iPattern++];
-        if ((ch >= '0' && ch <= '9')) {
-          iKeyValue = iKeyValue * 16 + ch - '0';
-        } else if ((ch >= 'a' && ch <= 'f')) {
-          iKeyValue = iKeyValue * 16 + ch - 'a' + 10;
-        } else if ((ch >= 'A' && ch <= 'F')) {
-          iKeyValue = iKeyValue * 16 + ch - 'A' + 10;
-        }
-      }
-      if (iKeyValue != 0) {
-        wsOutput += (FX_WCHAR)(iKeyValue & 0x0000FFFF);
-      }
-      continue;
-    }
-    wsOutput += pStrPattern[iPattern++];
-  }
-  return wsOutput;
-}
-static CFX_WideString FX_GetLiteralTextReverse(const FX_WCHAR* pStrPattern,
-                                               int32_t& iPattern) {
-  CFX_WideString wsOutput;
-  if (pStrPattern[iPattern] != '\'') {
-    return wsOutput;
-  }
-  iPattern--;
-  int32_t iQuote = 1;
-  while (iPattern >= 0) {
-    if (pStrPattern[iPattern] == '\'') {
-      iQuote++;
-      if (iPattern - 1 >= 0 ||
-          ((pStrPattern[iPattern - 1] != '\'') && (iQuote % 2 == 0))) {
-        break;
-      } else {
-        iQuote++;
-      }
-      iPattern--;
-    } else if (pStrPattern[iPattern] == '\\' &&
-               pStrPattern[iPattern + 1] == 'u') {
-      iPattern--;
-      int32_t iKeyValue = 0;
-      int32_t iLen = wsOutput.GetLength();
-      int32_t i = 1;
-      for (; i < iLen && i < 5; i++) {
-        FX_WCHAR ch = wsOutput[i];
-        if ((ch >= '0' && ch <= '9')) {
-          iKeyValue = iKeyValue * 16 + ch - '0';
-        } else if ((ch >= 'a' && ch <= 'f')) {
-          iKeyValue = iKeyValue * 16 + ch - 'a' + 10;
-        } else if ((ch >= 'A' && ch <= 'F')) {
-          iKeyValue = iKeyValue * 16 + ch - 'A' + 10;
-        }
-      }
-      if (iKeyValue != 0) {
-        wsOutput.Delete(0, i);
-        wsOutput = (FX_WCHAR)(iKeyValue & 0x0000FFFF) + wsOutput;
-      }
-      continue;
-    }
-    wsOutput = pStrPattern[iPattern--] + wsOutput;
-  }
-  return wsOutput;
-}
-FX_LOCALECATEGORY CFX_FormatString::GetCategory(
-    const CFX_WideString& wsPattern) {
-  FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown;
-  int32_t ccf = 0;
-  int32_t iLenf = wsPattern.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
-  FX_BOOL bBraceOpen = FALSE;
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      FX_GetLiteralText(pStr, ccf, iLenf);
-    } else if (!bBraceOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
-      CFX_WideString wsCategory(pStr[ccf]);
-      ccf++;
-      while (TRUE) {
-        if (ccf == iLenf) {
-          return eCategory;
-        }
-        if (pStr[ccf] == '.' || pStr[ccf] == '(') {
-          break;
-        }
-        if (pStr[ccf] == '{') {
-          bBraceOpen = TRUE;
-          break;
-        }
-        wsCategory += pStr[ccf];
-        ccf++;
-      }
-      FX_DWORD dwHash =
-          FX_HashCode_String_GetW(wsCategory, wsCategory.GetLength());
-      if (dwHash == FX_LOCALECATEGORY_DateHash) {
-        if (eCategory == FX_LOCALECATEGORY_Time) {
-          return FX_LOCALECATEGORY_DateTime;
-        }
-        eCategory = FX_LOCALECATEGORY_Date;
-      } else if (dwHash == FX_LOCALECATEGORY_TimeHash) {
-        if (eCategory == FX_LOCALECATEGORY_Date) {
-          return FX_LOCALECATEGORY_DateTime;
-        }
-        eCategory = FX_LOCALECATEGORY_Time;
-      } else if (dwHash == FX_LOCALECATEGORY_DateTimeHash) {
-        return FX_LOCALECATEGORY_DateTime;
-      } else if (dwHash == FX_LOCALECATEGORY_TextHash) {
-        return FX_LOCALECATEGORY_Text;
-      } else if (dwHash == FX_LOCALECATEGORY_NumHash) {
-        return FX_LOCALECATEGORY_Num;
-      } else if (dwHash == FX_LOCALECATEGORY_ZeroHash) {
-        return FX_LOCALECATEGORY_Zero;
-      } else if (dwHash == FX_LOCALECATEGORY_NullHash) {
-        return FX_LOCALECATEGORY_Null;
-      }
-    } else if (pStr[ccf] == '}') {
-      bBraceOpen = FALSE;
-    }
-    ccf++;
-  }
-  return eCategory;
-}
-static FX_WORD FX_WStringToLCID(const FX_WCHAR* pstrLCID) {
-  if (!pstrLCID) {
-    return 0;
-  }
-  wchar_t* pEnd;
-  return (FX_WORD)wcstol((wchar_t*)pstrLCID, &pEnd, 16);
-}
-FX_WORD CFX_FormatString::GetLCID(const CFX_WideString& wsPattern) {
-  return FX_WStringToLCID(GetLocaleName(wsPattern));
-}
-CFX_WideString CFX_FormatString::GetLocaleName(
-    const CFX_WideString& wsPattern) {
-  int32_t ccf = 0;
-  int32_t iLenf = wsPattern.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      FX_GetLiteralText(pStr, ccf, iLenf);
-    } else if (pStr[ccf] == '(') {
-      ccf++;
-      CFX_WideString wsLCID;
-      while (ccf < iLenf && pStr[ccf] != ')') {
-        wsLCID += pStr[ccf++];
-      }
-      return wsLCID;
-    }
-    ccf++;
-  }
-  return CFX_WideString();
-}
-IFX_Locale* CFX_FormatString::GetTextFormat(const CFX_WideString& wsPattern,
-                                            const CFX_WideStringC& wsCategory,
-                                            CFX_WideString& wsPurgePattern) {
-  IFX_Locale* pLocale = NULL;
-  int32_t ccf = 0;
-  int32_t iLenf = wsPattern.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
-  FX_BOOL bBrackOpen = FALSE;
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      int32_t iCurChar = ccf;
-      FX_GetLiteralText(pStr, ccf, iLenf);
-      wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
-    } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
-      CFX_WideString wsSearchCategory(pStr[ccf]);
-      ccf++;
-      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
-             pStr[ccf] != '(') {
-        wsSearchCategory += pStr[ccf];
-        ccf++;
-      }
-      if (wsSearchCategory != wsCategory) {
-        continue;
-      }
-      while (ccf < iLenf) {
-        if (pStr[ccf] == '(') {
-          ccf++;
-          CFX_WideString wsLCID;
-          while (ccf < iLenf && pStr[ccf] != ')') {
-            wsLCID += pStr[ccf++];
-          }
-          pLocale = GetPatternLocale(wsLCID);
-        } else if (pStr[ccf] == '{') {
-          bBrackOpen = TRUE;
-          break;
-        }
-        ccf++;
-      }
-    } else if (pStr[ccf] != '}') {
-      wsPurgePattern += pStr[ccf];
-    }
-    ccf++;
-  }
-  if (!bBrackOpen) {
-    wsPurgePattern = wsPattern;
-  }
-  if (!pLocale) {
-    pLocale = m_pLocaleMgr->GetDefLocale();
-  }
-  return pLocale;
-}
-#define FX_NUMSTYLE_Percent 0x01
-#define FX_NUMSTYLE_Exponent 0x02
-#define FX_NUMSTYLE_DotVorv 0x04
-IFX_Locale* CFX_FormatString::GetNumericFormat(const CFX_WideString& wsPattern,
-                                               int32_t& iDotIndex,
-                                               FX_DWORD& dwStyle,
-                                               CFX_WideString& wsPurgePattern) {
-  dwStyle = 0;
-  IFX_Locale* pLocale = NULL;
-  int32_t ccf = 0;
-  int32_t iLenf = wsPattern.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
-  FX_BOOL bFindDot = FALSE;
-  FX_BOOL bBrackOpen = FALSE;
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      int32_t iCurChar = ccf;
-      FX_GetLiteralText(pStr, ccf, iLenf);
-      wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
-    } else if (!bBrackOpen && FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
-      CFX_WideString wsCategory(pStr[ccf]);
-      ccf++;
-      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
-             pStr[ccf] != '(') {
-        wsCategory += pStr[ccf];
-        ccf++;
-      }
-      if (wsCategory != FX_WSTRC(L"num")) {
-        bBrackOpen = TRUE;
-        ccf = 0;
-        continue;
-      }
-      while (ccf < iLenf) {
-        if (pStr[ccf] == '(') {
-          ccf++;
-          CFX_WideString wsLCID;
-          while (ccf < iLenf && pStr[ccf] != ')') {
-            wsLCID += pStr[ccf++];
-          }
-          pLocale = GetPatternLocale(wsLCID);
-        } else if (pStr[ccf] == '{') {
-          bBrackOpen = TRUE;
-          break;
-        } else if (pStr[ccf] == '.') {
-          CFX_WideString wsSubCategory;
-          ccf++;
-          while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') {
-            wsSubCategory += pStr[ccf++];
-          }
-          FX_DWORD dwSubHash =
-              FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength());
-          FX_LOCALENUMSUBCATEGORY eSubCategory = FX_LOCALENUMPATTERN_Decimal;
-          for (int32_t i = 0; i < g_iFXLocaleNumSubCatCount; i++) {
-            if (g_FXLocaleNumSubCatData[i].uHash == dwSubHash) {
-              eSubCategory = (FX_LOCALENUMSUBCATEGORY)g_FXLocaleNumSubCatData[i]
-                                 .eSubCategory;
-              break;
-            }
-          }
-          wsSubCategory.Empty();
-          if (!pLocale) {
-            pLocale = m_pLocaleMgr->GetDefLocale();
-          }
-          FXSYS_assert(pLocale != NULL);
-          pLocale->GetNumPattern(eSubCategory, wsSubCategory);
-          iDotIndex = wsSubCategory.Find('.');
-          if (iDotIndex > 0) {
-            iDotIndex += wsPurgePattern.GetLength();
-            bFindDot = TRUE;
-            dwStyle |= FX_NUMSTYLE_DotVorv;
-          }
-          wsPurgePattern += wsSubCategory;
-          if (eSubCategory == FX_LOCALENUMPATTERN_Percent) {
-            dwStyle |= FX_NUMSTYLE_Percent;
-          }
-          continue;
-        }
-        ccf++;
-      }
-    } else if (pStr[ccf] == 'E') {
-      dwStyle |= FX_NUMSTYLE_Exponent;
-      wsPurgePattern += pStr[ccf];
-    } else if (pStr[ccf] == '%') {
-      dwStyle |= FX_NUMSTYLE_Percent;
-      wsPurgePattern += pStr[ccf];
-    } else if (pStr[ccf] != '}') {
-      wsPurgePattern += pStr[ccf];
-    }
-    if (!bFindDot) {
-      if (pStr[ccf] == '.' || pStr[ccf] == 'V' || pStr[ccf] == 'v') {
-        bFindDot = TRUE;
-        iDotIndex = wsPurgePattern.GetLength() - 1;
-        dwStyle |= FX_NUMSTYLE_DotVorv;
-      }
-    }
-    ccf++;
-  }
-  if (!bFindDot) {
-    iDotIndex = wsPurgePattern.GetLength();
-  }
-  if (!pLocale) {
-    pLocale = m_pLocaleMgr->GetDefLocale();
-  }
-  return pLocale;
-}
-static FX_BOOL FX_GetNumericDotIndex(const CFX_WideString& wsNum,
-                                     const CFX_WideString& wsDotSymbol,
-                                     int32_t& iDotIndex) {
-  int32_t ccf = 0;
-  int32_t iLenf = wsNum.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsNum;
-  int32_t iLenDot = wsDotSymbol.GetLength();
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      FX_GetLiteralText(pStr, ccf, iLenf);
-    } else if (ccf + iLenDot <= iLenf &&
-               !FXSYS_wcsncmp(pStr + ccf, (const FX_WCHAR*)wsDotSymbol,
-                              iLenDot)) {
-      iDotIndex = ccf;
-      return TRUE;
-    }
-    ccf++;
-  }
-  iDotIndex = wsNum.Find('.');
-  if (iDotIndex < 0) {
-    iDotIndex = iLenf;
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_BOOL CFX_FormatString::ParseText(const CFX_WideString& wsSrcText,
-                                    const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsValue) {
-  wsValue.Empty();
-  if (wsSrcText.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat);
-  if (wsTextFormat.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t iText = 0, iPattern = 0;
-  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
-  int32_t iLenText = wsSrcText.GetLength();
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern && iText < iLenText) {
-    switch (pStrPattern[iPattern]) {
-      case '\'': {
-        CFX_WideString wsLiteral =
-            FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-        int32_t iLiteralLen = wsLiteral.GetLength();
-        if (iText + iLiteralLen > iLenText ||
-            FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
-                          iLiteralLen)) {
-          wsValue = wsSrcText;
-          return FALSE;
-        }
-        iText += iLiteralLen;
-        iPattern++;
-        break;
-      }
-      case 'A':
-        if (FX_IsAlpha(pStrText[iText])) {
-          wsValue += pStrText[iText];
-          iText++;
-        }
-        iPattern++;
-        break;
-      case 'X':
-        wsValue += pStrText[iText];
-        iText++;
-        iPattern++;
-        break;
-      case 'O':
-      case '0':
-        if (FX_IsDigit(pStrText[iText]) || FX_IsAlpha(pStrText[iText])) {
-          wsValue += pStrText[iText];
-          iText++;
-        }
-        iPattern++;
-        break;
-      case '9':
-        if (FX_IsDigit(pStrText[iText])) {
-          wsValue += pStrText[iText];
-          iText++;
-        }
-        iPattern++;
-        break;
-      default:
-        if (pStrPattern[iPattern] != pStrText[iText]) {
-          wsValue = wsSrcText;
-          return FALSE;
-        }
-        iPattern++;
-        iText++;
-        break;
-    }
-  }
-  return iPattern == iLenPattern && iText == iLenText;
-}
-FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum,
-                                   const CFX_WideString& wsPattern,
-                                   FX_FLOAT& fValue) {
-  fValue = 0.0f;
-  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t dot_index_f = -1;
-  FX_DWORD dwFormatStyle = 0;
-  CFX_WideString wsNumFormat;
-  IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
-  if (!pLocale || wsNumFormat.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t iExponent = 0;
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  int32_t iGroupLen = wsGroupSymbol.GetLength();
-  CFX_WideString wsMinus;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus);
-  int32_t iMinusLen = wsMinus.GetLength();
-  int cc = 0, ccf = 0;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
-  int len = wsSrcNum.GetLength();
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
-  int lenf = wsNumFormat.GetLength();
-  double dbRetValue = 0;
-  double coeff = 1;
-  FX_BOOL bHavePercentSymbol = FALSE;
-  FX_BOOL bNeg = FALSE;
-  FX_BOOL bReverseParse = FALSE;
-  int32_t dot_index = 0;
-  if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) &&
-      (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
-    bReverseParse = TRUE;
-  }
-  bReverseParse = FALSE;
-  if (bReverseParse) {
-    ccf = lenf - 1;
-    cc = len - 1;
-    while (ccf > dot_index_f && cc >= 0) {
-      switch (strf[ccf]) {
-        case '\'': {
-          CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
-          int32_t iLiteralLen = wsLiteral.GetLength();
-          cc -= iLiteralLen - 1;
-          if (cc < 0 || FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
-                                      iLiteralLen)) {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-          break;
-        }
-        case '9':
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
-          coeff *= 0.1;
-          cc--;
-          ccf--;
-          break;
-        case 'z':
-          if (cc >= 0) {
-            dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
-            coeff *= 0.1;
-            cc--;
-          }
-          ccf--;
-          break;
-        case 'Z':
-          if (str[cc] != ' ') {
-            dbRetValue = dbRetValue * coeff + (str[cc] - '0') * 0.1;
-            coeff *= 0.1;
-          }
-          cc--;
-          ccf--;
-          break;
-        case 'S':
-          if (str[cc] == '+' || str[cc] == ' ') {
-            cc--;
-          } else {
-            cc -= iMinusLen - 1;
-            if (cc < 0 ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            cc--;
-            bNeg = TRUE;
-          }
-          ccf--;
-          break;
-        case 's':
-          if (str[cc] == '+') {
-            cc--;
-          } else {
-            cc -= iMinusLen - 1;
-            if (cc < 0 ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            cc--;
-            bNeg = TRUE;
-          }
-          ccf--;
-          break;
-        case 'E': {
-          if (cc >= dot_index) {
-            return FALSE;
-          }
-          FX_BOOL bExpSign = FALSE;
-          while (cc >= 0) {
-            if (str[cc] == 'E' || str[cc] == 'e') {
-              break;
-            }
-            if (FX_IsDigit(str[cc])) {
-              iExponent = iExponent + (str[cc] - '0') * 10;
-              cc--;
-              continue;
-            } else if (str[cc] == '+') {
-              cc--;
-              continue;
-            } else if (cc - iMinusLen + 1 > 0 &&
-                       !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
-                                      (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              bExpSign = TRUE;
-              cc -= iMinusLen;
-            } else {
-              return FALSE;
-            }
-          }
-          cc--;
-          iExponent = bExpSign ? -iExponent : iExponent;
-          ccf--;
-        } break;
-        case '$': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
-                                     wsSymbol);
-          int32_t iSymbolLen = wsSymbol.GetLength();
-          cc -= iSymbolLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-        } break;
-        case 'r':
-          if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
-            if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-              bNeg = TRUE;
-              cc -= 2;
-            }
-            ccf -= 2;
-          } else {
-            ccf--;
-          }
-          break;
-        case 'R':
-          if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-              bNeg = TRUE;
-              cc -= 2;
-            }
-            ccf -= 2;
-          } else {
-            ccf--;
-          }
-          break;
-        case 'b':
-          if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
-            if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-              bNeg = TRUE;
-              cc -= 2;
-            }
-            ccf -= 2;
-          } else {
-            ccf--;
-          }
-          break;
-        case 'B':
-          if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-              bNeg = TRUE;
-              cc -= 2;
-            }
-            ccf -= 2;
-          } else {
-            ccf--;
-          }
-          break;
-        case '.':
-        case 'V':
-        case 'v':
-          return FALSE;
-        case '%': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-          int32_t iSysmbolLen = wsSymbol.GetLength();
-          cc -= iSysmbolLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-          bHavePercentSymbol = TRUE;
-        } break;
-        case '8':
-          while (ccf < lenf && strf[ccf] == '8') {
-            ccf++;
-          }
-          while (cc < len && FX_IsDigit(str[cc])) {
-            dbRetValue = (str[cc] - '0') * coeff + dbRetValue;
-            coeff *= 0.1;
-            cc++;
-          }
-          break;
-        case ',': {
-          if (cc >= 0) {
-            cc -= iGroupLen - 1;
-            if (cc >= 0 &&
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
-                              iGroupLen) == 0) {
-              cc--;
-            } else {
-              cc += iGroupLen - 1;
-            }
-          }
-          ccf--;
-        } break;
-        case '(':
-          if (str[cc] == L'(') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-          break;
-        case ')':
-          if (str[cc] == L')') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-          break;
-        default:
-          if (strf[ccf] != str[cc]) {
-            return FALSE;
-          }
-          cc--;
-          ccf--;
-      }
-    }
-    dot_index = cc + 1;
-  }
-  ccf = dot_index_f - 1;
-  cc = dot_index - 1;
-  coeff = 1;
-  while (ccf >= 0 && cc >= 0) {
-    switch (strf[ccf]) {
-      case '\'': {
-        CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
-        int32_t iLiteralLen = wsLiteral.GetLength();
-        cc -= iLiteralLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      }
-      case '9':
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-        coeff *= 10;
-        cc--;
-        ccf--;
-        break;
-      case 'z':
-        if (FX_IsDigit(str[cc])) {
-          dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-          coeff *= 10;
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'Z':
-        if (str[cc] != ' ') {
-          if (FX_IsDigit(str[cc])) {
-            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-            coeff *= 10;
-            cc--;
-          }
-        } else {
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'S':
-        if (str[cc] == '+' || str[cc] == ' ') {
-          cc--;
-        } else {
-          cc -= iMinusLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            return FALSE;
-          }
-          cc--;
-          bNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 's':
-        if (str[cc] == '+') {
-          cc--;
-        } else {
-          cc -= iMinusLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            return FALSE;
-          }
-          cc--;
-          bNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 'E': {
-        if (cc >= dot_index) {
-          return FALSE;
-        }
-        FX_BOOL bExpSign = FALSE;
-        while (cc >= 0) {
-          if (str[cc] == 'E' || str[cc] == 'e') {
-            break;
-          }
-          if (FX_IsDigit(str[cc])) {
-            iExponent = iExponent + (str[cc] - '0') * 10;
-            cc--;
-            continue;
-          } else if (str[cc] == '+') {
-            cc--;
-            continue;
-          } else if (cc - iMinusLen + 1 > 0 &&
-                     !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
-                                    (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            bExpSign = TRUE;
-            cc -= iMinusLen;
-          } else {
-            return FALSE;
-          }
-        }
-        cc--;
-        iExponent = bExpSign ? -iExponent : iExponent;
-        ccf--;
-      } break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        int32_t iSymbolLen = wsSymbol.GetLength();
-        cc -= iSymbolLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-      } break;
-      case 'r':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
-          if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'R':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-          if (str[cc] == ' ') {
-            cc++;
-          } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'b':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
-          if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'B':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-          if (str[cc] == ' ') {
-            cc++;
-          } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case '.':
-      case 'V':
-      case 'v':
-        return FALSE;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        int32_t iSysmbolLen = wsSymbol.GetLength();
-        cc -= iSysmbolLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        bHavePercentSymbol = TRUE;
-      } break;
-      case '8':
-        return FALSE;
-      case ',': {
-        if (cc >= 0) {
-          cc -= iGroupLen - 1;
-          if (cc >= 0 &&
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
-                            iGroupLen) == 0) {
-            cc--;
-          } else {
-            cc += iGroupLen - 1;
-          }
-        }
-        ccf--;
-      } break;
-      case '(':
-        if (str[cc] == L'(') {
-          bNeg = TRUE;
-        } else if (str[cc] != L' ') {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      case ')':
-        if (str[cc] == L')') {
-          bNeg = TRUE;
-        } else if (str[cc] != L' ') {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      default:
-        if (strf[ccf] != str[cc]) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-    }
-  }
-  if (cc >= 0) {
-    return FALSE;
-  }
-  if (!bReverseParse) {
-    ccf = dot_index_f + 1;
-    cc = (dot_index == len) ? len : dot_index + 1;
-    coeff = 0.1;
-    while (cc < len && ccf < lenf) {
-      switch (strf[ccf]) {
-        case '\'': {
-          CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
-          int32_t iLiteralLen = wsLiteral.GetLength();
-          if (cc + iLiteralLen > len ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
-                            iLiteralLen)) {
-            return FALSE;
-          }
-          cc += iLiteralLen;
-          ccf++;
-          break;
-        }
-        case '9':
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          {
-            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-            coeff *= 0.1;
-          }
-          cc++;
-          ccf++;
-          break;
-        case 'z':
-          if (FX_IsDigit(str[cc])) {
-            dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-            coeff *= 0.1;
-            cc++;
-          }
-          ccf++;
-          break;
-        case 'Z':
-          if (str[cc] != ' ') {
-            if (FX_IsDigit(str[cc])) {
-              dbRetValue = dbRetValue + (str[cc] - '0') * coeff;
-              coeff *= 0.1;
-              cc++;
-            }
-          } else {
-            cc++;
-          }
-          ccf++;
-          break;
-        case 'S':
-          if (str[cc] == '+' || str[cc] == ' ') {
-            cc++;
-          } else {
-            if (cc + iMinusLen > len ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            bNeg = TRUE;
-            cc += iMinusLen;
-          }
-          ccf++;
-          break;
-        case 's':
-          if (str[cc] == '+') {
-            cc++;
-          } else {
-            if (cc + iMinusLen > len ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            bNeg = TRUE;
-            cc += iMinusLen;
-          }
-          ccf++;
-          break;
-        case 'E': {
-          if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) {
-            return FALSE;
-          }
-          FX_BOOL bExpSign = FALSE;
-          cc++;
-          if (cc < len) {
-            if (str[cc] == '+') {
-              cc++;
-            } else if (str[cc] == '-') {
-              bExpSign = TRUE;
-              cc++;
-            }
-          }
-          while (cc < len) {
-            if (!FX_IsDigit(str[cc])) {
-              break;
-            }
-            iExponent = iExponent * 10 + str[cc] - '0';
-            cc++;
-          }
-          iExponent = bExpSign ? -iExponent : iExponent;
-          ccf++;
-        } break;
-        case '$': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
-                                     wsSymbol);
-          int32_t iSymbolLen = wsSymbol.GetLength();
-          if (cc + iSymbolLen > len ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
-            return FALSE;
-          }
-          cc += iSymbolLen;
-          ccf++;
-        } break;
-        case 'c':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
-            if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'C':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'd':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
-            if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'D':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case '.':
-        case 'V':
-        case 'v':
-          return FALSE;
-        case '%': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-          int32_t iSysmbolLen = wsSymbol.GetLength();
-          if (cc + iSysmbolLen <= len &&
-              !FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol,
-                             iSysmbolLen)) {
-            cc += iSysmbolLen;
-          }
-          ccf++;
-          bHavePercentSymbol = TRUE;
-        } break;
-        case '8': {
-          while (ccf < lenf && strf[ccf] == '8') {
-            ccf++;
-          }
-          while (cc < len && FX_IsDigit(str[cc])) {
-            dbRetValue = (str[cc] - '0') * coeff + dbRetValue;
-            coeff *= 0.1;
-            cc++;
-          }
-        } break;
-        case ',': {
-          if (cc + iGroupLen <= len &&
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
-                            iGroupLen) == 0) {
-            cc += iGroupLen;
-          }
-          ccf++;
-        } break;
-        case '(':
-          if (str[cc] == L'(') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-          break;
-        case ')':
-          if (str[cc] == L')') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-          break;
-        default:
-          if (strf[ccf] != str[cc]) {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-      }
-    }
-    if (cc != len) {
-      return FALSE;
-    }
-  }
-  if (iExponent) {
-    dbRetValue *= FXSYS_pow(10, (FX_FLOAT)iExponent);
-  }
-  if (bHavePercentSymbol) {
-    dbRetValue /= 100.0;
-  }
-  if (bNeg) {
-    dbRetValue = -dbRetValue;
-  }
-  fValue = (FX_FLOAT)dbRetValue;
-  return TRUE;
-}
-void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult) {
-  int32_t iCount = wsNum.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsNum;
-  FX_WCHAR* pDst = wsResult.GetBuffer(iCount);
-  int32_t nIndex = 0;
-  FX_BOOL bMinus = FALSE;
-  int32_t i = 0;
-  for (i = 0; i < iCount; i++) {
-    FX_WCHAR wc = pStr[i];
-    if (wc == '.') {
-      break;
-    }
-    if ((wc == L'0' || wc == L' ' || wc == '+') && nIndex == 0) {
-      continue;
-    }
-    if (wc == '-') {
-      pDst[nIndex++] = wc;
-      bMinus = TRUE;
-      continue;
-    }
-    if (wc == L'0' && nIndex == 1 && bMinus) {
-      continue;
-    }
-    pDst[nIndex++] = wc;
-  }
-  if (bMinus && nIndex == 1) {
-    pDst[nIndex++] = '0';
-  }
-  if (nIndex == 0) {
-    wsResult.ReleaseBuffer(0);
-    pDst = wsResult.GetBuffer(iCount + 1);
-    pDst[nIndex++] = '0';
-  }
-  int32_t j = 0;
-  for (j = iCount - 1; j > i; j--) {
-    FX_WCHAR wc = pStr[j];
-    if (wc != L'0' && wc != L' ') {
-      break;
-    }
-  }
-  if (j > i) {
-    pDst[nIndex++] = '.';
-    FXSYS_wcsncpy(pDst + nIndex, pStr + i + 1, j - i);
-    nIndex += j - i;
-  }
-  wsResult.ReleaseBuffer(nIndex);
-}
-FX_BOOL CFX_FormatString::ParseNum(const CFX_WideString& wsSrcNum,
-                                   const CFX_WideString& wsPattern,
-                                   CFX_WideString& wsValue) {
-  wsValue.Empty();
-  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t dot_index_f = -1;
-  FX_DWORD dwFormatStyle = 0;
-  CFX_WideString wsNumFormat;
-  IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
-  if (!pLocale || wsNumFormat.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t iExponent = 0;
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  int32_t iGroupLen = wsGroupSymbol.GetLength();
-  CFX_WideString wsMinus;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus);
-  int32_t iMinusLen = wsMinus.GetLength();
-  int cc = 0, ccf = 0;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
-  int len = wsSrcNum.GetLength();
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
-  int lenf = wsNumFormat.GetLength();
-  FX_BOOL bHavePercentSymbol = FALSE;
-  FX_BOOL bNeg = FALSE;
-  FX_BOOL bReverseParse = FALSE;
-  int32_t dot_index = 0;
-  if (!FX_GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) &&
-      (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
-    bReverseParse = TRUE;
-  }
-  bReverseParse = FALSE;
-  ccf = dot_index_f - 1;
-  cc = dot_index - 1;
-  while (ccf >= 0 && cc >= 0) {
-    switch (strf[ccf]) {
-      case '\'': {
-        CFX_WideString wsLiteral = FX_GetLiteralTextReverse(strf, ccf);
-        int32_t iLiteralLen = wsLiteral.GetLength();
-        cc -= iLiteralLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      }
-      case '9':
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        wsValue = CFX_WideStringC(str[cc]) + wsValue;
-        cc--;
-        ccf--;
-        break;
-      case 'z':
-        if (FX_IsDigit(str[cc])) {
-          wsValue = CFX_WideStringC(str[cc]) + wsValue;
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'Z':
-        if (str[cc] != ' ') {
-          if (FX_IsDigit(str[cc])) {
-            wsValue = CFX_WideStringC(str[cc]) + wsValue;
-            cc--;
-          }
-        } else {
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'S':
-        if (str[cc] == '+' || str[cc] == ' ') {
-          cc--;
-        } else {
-          cc -= iMinusLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            return FALSE;
-          }
-          cc--;
-          bNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 's':
-        if (str[cc] == '+') {
-          cc--;
-        } else {
-          cc -= iMinusLen - 1;
-          if (cc < 0 ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            return FALSE;
-          }
-          cc--;
-          bNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 'E': {
-        if (cc >= dot_index) {
-          return FALSE;
-        }
-        FX_BOOL bExpSign = FALSE;
-        while (cc >= 0) {
-          if (str[cc] == 'E' || str[cc] == 'e') {
-            break;
-          }
-          if (FX_IsDigit(str[cc])) {
-            iExponent = iExponent + (str[cc] - '0') * 10;
-            cc--;
-            continue;
-          } else if (str[cc] == '+') {
-            cc--;
-            continue;
-          } else if (cc - iMinusLen + 1 > 0 &&
-                     !FXSYS_wcsncmp(str + (cc - iMinusLen + 1),
-                                    (const FX_WCHAR*)wsMinus, iMinusLen)) {
-            bExpSign = TRUE;
-            cc -= iMinusLen;
-          } else {
-            return FALSE;
-          }
-        }
-        cc--;
-        iExponent = bExpSign ? -iExponent : iExponent;
-        ccf--;
-      } break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        int32_t iSymbolLen = wsSymbol.GetLength();
-        cc -= iSymbolLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-      } break;
-      case 'r':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
-          if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'R':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-          if (str[cc] == ' ') {
-            cc++;
-          } else if (str[cc] == 'R' && cc - 1 >= 0 && str[cc - 1] == 'C') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'b':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
-          if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case 'B':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-          if (str[cc] == ' ') {
-            cc++;
-          } else if (str[cc] == 'B' && cc - 1 >= 0 && str[cc - 1] == 'D') {
-            bNeg = TRUE;
-            cc -= 2;
-          }
-          ccf -= 2;
-        } else {
-          ccf--;
-        }
-        break;
-      case '.':
-      case 'V':
-      case 'v':
-        return FALSE;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        int32_t iSysmbolLen = wsSymbol.GetLength();
-        cc -= iSysmbolLen - 1;
-        if (cc < 0 ||
-            FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSysmbolLen)) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        bHavePercentSymbol = TRUE;
-      } break;
-      case '8':
-        return FALSE;
-      case ',': {
-        if (cc >= 0) {
-          cc -= iGroupLen - 1;
-          if (cc >= 0 &&
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
-                            iGroupLen) == 0) {
-            cc--;
-          } else {
-            cc += iGroupLen - 1;
-          }
-        }
-        ccf--;
-      } break;
-      case '(':
-        if (str[cc] == L'(') {
-          bNeg = TRUE;
-        } else if (str[cc] != L' ') {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      case ')':
-        if (str[cc] == L')') {
-          bNeg = TRUE;
-        } else if (str[cc] != L' ') {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-        break;
-      default:
-        if (strf[ccf] != str[cc]) {
-          return FALSE;
-        }
-        cc--;
-        ccf--;
-    }
-  }
-  if (cc >= 0) {
-    if (str[cc] == '-') {
-      bNeg = TRUE;
-      cc--;
-    }
-    if (cc >= 0) {
-      return FALSE;
-    }
-  }
-  if (dot_index < len && (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
-    wsValue += '.';
-  }
-  if (!bReverseParse) {
-    ccf = dot_index_f + 1;
-    cc = (dot_index == len) ? len : dot_index + 1;
-    while (cc < len && ccf < lenf) {
-      switch (strf[ccf]) {
-        case '\'': {
-          CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
-          int32_t iLiteralLen = wsLiteral.GetLength();
-          if (cc + iLiteralLen > len ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral,
-                            iLiteralLen)) {
-            return FALSE;
-          }
-          cc += iLiteralLen;
-          ccf++;
-          break;
-        }
-        case '9':
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          { wsValue += str[cc]; }
-          cc++;
-          ccf++;
-          break;
-        case 'z':
-          if (FX_IsDigit(str[cc])) {
-            wsValue += str[cc];
-            cc++;
-          }
-          ccf++;
-          break;
-        case 'Z':
-          if (str[cc] != ' ') {
-            if (FX_IsDigit(str[cc])) {
-              wsValue += str[cc];
-              cc++;
-            }
-          } else {
-            cc++;
-          }
-          ccf++;
-          break;
-        case 'S':
-          if (str[cc] == '+' || str[cc] == ' ') {
-            cc++;
-          } else {
-            if (cc + iMinusLen > len ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            bNeg = TRUE;
-            cc += iMinusLen;
-          }
-          ccf++;
-          break;
-        case 's':
-          if (str[cc] == '+') {
-            cc++;
-          } else {
-            if (cc + iMinusLen > len ||
-                FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsMinus, iMinusLen)) {
-              return FALSE;
-            }
-            bNeg = TRUE;
-            cc += iMinusLen;
-          }
-          ccf++;
-          break;
-        case 'E': {
-          if (cc >= len || (str[cc] != 'E' && str[cc] != 'e')) {
-            return FALSE;
-          }
-          FX_BOOL bExpSign = FALSE;
-          cc++;
-          if (cc < len) {
-            if (str[cc] == '+') {
-              cc++;
-            } else if (str[cc] == '-') {
-              bExpSign = TRUE;
-              cc++;
-            }
-          }
-          while (cc < len) {
-            if (!FX_IsDigit(str[cc])) {
-              break;
-            }
-            iExponent = iExponent * 10 + str[cc] - '0';
-            cc++;
-          }
-          iExponent = bExpSign ? -iExponent : iExponent;
-          ccf++;
-        } break;
-        case '$': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
-                                     wsSymbol);
-          int32_t iSymbolLen = wsSymbol.GetLength();
-          if (cc + iSymbolLen > len ||
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol, iSymbolLen)) {
-            return FALSE;
-          }
-          cc += iSymbolLen;
-          ccf++;
-        } break;
-        case 'c':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
-            if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'C':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'C' && cc + 1 < len && str[cc + 1] == 'R') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'd':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
-            if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case 'D':
-          if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
-            if (str[cc] == ' ') {
-              cc++;
-            } else if (str[cc] == 'D' && cc + 1 < len && str[cc + 1] == 'B') {
-              bNeg = TRUE;
-              cc += 2;
-            }
-            ccf += 2;
-          }
-          break;
-        case '.':
-        case 'V':
-        case 'v':
-          return FALSE;
-        case '%': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-          int32_t iSysmbolLen = wsSymbol.GetLength();
-          if (cc + iSysmbolLen <= len &&
-              !FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsSymbol,
-                             iSysmbolLen)) {
-            cc += iSysmbolLen;
-          }
-          ccf++;
-          bHavePercentSymbol = TRUE;
-        } break;
-        case '8': {
-          while (ccf < lenf && strf[ccf] == '8') {
-            ccf++;
-          }
-          while (cc < len && FX_IsDigit(str[cc])) {
-            wsValue += str[cc];
-            cc++;
-          }
-        } break;
-        case ',': {
-          if (cc + iGroupLen <= len &&
-              FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsGroupSymbol,
-                            iGroupLen) == 0) {
-            cc += iGroupLen;
-          }
-          ccf++;
-        } break;
-        case '(':
-          if (str[cc] == L'(') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-          break;
-        case ')':
-          if (str[cc] == L')') {
-            bNeg = TRUE;
-          } else if (str[cc] != L' ') {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-          break;
-        default:
-          if (strf[ccf] != str[cc]) {
-            return FALSE;
-          }
-          cc++;
-          ccf++;
-      }
-    }
-    if (cc != len) {
-      return FALSE;
-    }
-  }
-  if (iExponent || bHavePercentSymbol) {
-    CFX_Decimal decimal = CFX_Decimal(wsValue);
-    if (iExponent) {
-      decimal = decimal * CFX_Decimal(FXSYS_pow(10, (FX_FLOAT)iExponent));
-    }
-    if (bHavePercentSymbol) {
-      decimal = decimal / CFX_Decimal(100);
-    }
-    wsValue = decimal;
-  }
-  if (bNeg) {
-    wsValue = CFX_WideStringC('-') + wsValue;
-  }
-  return TRUE;
-}
-FX_DATETIMETYPE CFX_FormatString::GetDateTimeFormat(
-    const CFX_WideString& wsPattern,
-    IFX_Locale*& pLocale,
-    CFX_WideString& wsDatePattern,
-    CFX_WideString& wsTimePattern) {
-  pLocale = NULL;
-  CFX_WideString wsTempPattern;
-  FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown;
-  int32_t ccf = 0;
-  int32_t iLenf = wsPattern.GetLength();
-  const FX_WCHAR* pStr = (const FX_WCHAR*)wsPattern;
-  int32_t iFindCategory = 0;
-  FX_BOOL bBraceOpen = FALSE;
-  while (ccf < iLenf) {
-    if (pStr[ccf] == '\'') {
-      int32_t iCurChar = ccf;
-      FX_GetLiteralText(pStr, ccf, iLenf);
-      wsTempPattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
-    } else if (!bBraceOpen && iFindCategory != 3 &&
-               FX_Local_Find(gs_wsConstChars, pStr[ccf]) < 0) {
-      CFX_WideString wsCategory(pStr[ccf]);
-      ccf++;
-      while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
-             pStr[ccf] != '(') {
-        if (pStr[ccf] == 'T') {
-          wsDatePattern = wsPattern.Left(ccf);
-          wsTimePattern = wsPattern.Right(wsPattern.GetLength() - ccf);
-          wsTimePattern.SetAt(0, ' ');
-          if (!pLocale) {
-            pLocale = m_pLocaleMgr->GetDefLocale();
-          }
-          return FX_DATETIMETYPE_DateTime;
-        }
-        wsCategory += pStr[ccf];
-        ccf++;
-      }
-      if (!(iFindCategory & 1) && wsCategory == FX_WSTRC(L"date")) {
-        iFindCategory |= 1;
-        eCategory = FX_LOCALECATEGORY_Date;
-        if (iFindCategory & 2) {
-          iFindCategory = 4;
-        }
-      } else if (!(iFindCategory & 2) && wsCategory == FX_WSTRC(L"time")) {
-        iFindCategory |= 2;
-        eCategory = FX_LOCALECATEGORY_Time;
-      } else if (wsCategory == FX_WSTRC(L"datetime")) {
-        iFindCategory = 3;
-        eCategory = FX_LOCALECATEGORY_DateTime;
-      } else {
-        continue;
-      }
-      while (ccf < iLenf) {
-        if (pStr[ccf] == '(') {
-          ccf++;
-          CFX_WideString wsLCID;
-          while (ccf < iLenf && pStr[ccf] != ')') {
-            wsLCID += pStr[ccf++];
-          }
-          pLocale = GetPatternLocale(wsLCID);
-        } else if (pStr[ccf] == '{') {
-          bBraceOpen = TRUE;
-          break;
-        } else if (pStr[ccf] == '.') {
-          CFX_WideString wsSubCategory;
-          ccf++;
-          while (ccf < iLenf && pStr[ccf] != '(' && pStr[ccf] != '{') {
-            wsSubCategory += pStr[ccf++];
-          }
-          FX_DWORD dwSubHash =
-              FX_HashCode_String_GetW(wsSubCategory, wsSubCategory.GetLength());
-          FX_LOCALEDATETIMESUBCATEGORY eSubCategory =
-              FX_LOCALEDATETIMESUBCATEGORY_Medium;
-          for (int32_t i = 0; i < g_iFXLocaleDateTimeSubCatCount; i++) {
-            if (g_FXLocaleDateTimeSubCatData[i].uHash == dwSubHash) {
-              eSubCategory =
-                  (FX_LOCALEDATETIMESUBCATEGORY)g_FXLocaleDateTimeSubCatData[i]
-                      .eSubCategory;
-              break;
-            }
-          }
-          if (!pLocale) {
-            pLocale = m_pLocaleMgr->GetDefLocale();
-          }
-          FXSYS_assert(pLocale != NULL);
-          switch (eCategory) {
-            case FX_LOCALECATEGORY_Date:
-              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
-              wsDatePattern = wsTempPattern + wsDatePattern;
-              break;
-            case FX_LOCALECATEGORY_Time:
-              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
-              wsTimePattern = wsTempPattern + wsTimePattern;
-              break;
-            case FX_LOCALECATEGORY_DateTime:
-              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
-              wsDatePattern = wsTempPattern + wsDatePattern;
-              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
-              break;
-            default:
-              break;
-          }
-          wsTempPattern.Empty();
-          continue;
-        }
-        ccf++;
-      }
-    } else if (pStr[ccf] == '}') {
-      bBraceOpen = FALSE;
-      if (!wsTempPattern.IsEmpty()) {
-        if (eCategory == FX_LOCALECATEGORY_Time) {
-          wsTimePattern = wsTempPattern;
-        } else if (eCategory == FX_LOCALECATEGORY_Date) {
-          wsDatePattern = wsTempPattern;
-        }
-        wsTempPattern.Empty();
-      }
-    } else {
-      wsTempPattern += pStr[ccf];
-    }
-    ccf++;
-  }
-  if (!wsTempPattern.IsEmpty()) {
-    if (eCategory == FX_LOCALECATEGORY_Date) {
-      wsDatePattern += wsTempPattern;
-    } else {
-      wsTimePattern += wsTempPattern;
-    }
-  }
-  if (!pLocale) {
-    pLocale = m_pLocaleMgr->GetDefLocale();
-  }
-  if (!iFindCategory) {
-    wsTimePattern.Empty();
-    wsDatePattern = wsPattern;
-  }
-  return (FX_DATETIMETYPE)iFindCategory;
-}
-static FX_BOOL FX_ParseLocaleDate(const CFX_WideString& wsDate,
-                                  const CFX_WideString& wsDatePattern,
-                                  IFX_Locale* pLocale,
-                                  CFX_Unitime& datetime,
-                                  int32_t& cc) {
-  int32_t year = 1900;
-  int32_t month = 1;
-  int32_t day = 1;
-  int32_t ccf = 0;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsDate;
-  int32_t len = wsDate.GetLength();
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsDatePattern;
-  int32_t lenf = wsDatePattern.GetLength();
-  while (cc < len && ccf < lenf) {
-    if (strf[ccf] == '\'') {
-      CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
-      int32_t iLiteralLen = wsLiteral.GetLength();
-      if (cc + iLiteralLen > len ||
-          FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
-        return FALSE;
-      }
-      cc += iLiteralLen;
-      ccf++;
-      continue;
-    } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) {
-      if (strf[ccf] != str[cc]) {
-        return FALSE;
-      }
-      cc++;
-      ccf++;
-      continue;
-    }
-    FX_DWORD dwSymbolNum = 1;
-    FX_DWORD dwSymbol = strf[ccf++];
-    while (ccf < lenf && strf[ccf] == dwSymbol) {
-      ccf++;
-      dwSymbolNum++;
-    }
-    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
-    if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      day = str[cc++] - '0';
-      if (cc < len && FX_IsDigit(str[cc])) {
-        day = day * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      day = str[cc++] - '0';
-      if (cc < len) {
-        day = day * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) {
-      int i = 0;
-      while (cc < len && i < 3 && FX_IsDigit(str[cc])) {
-        cc++;
-        i++;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) {
-      cc += 3;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      month = str[cc++] - '0';
-      if (cc < len && FX_IsDigit(str[cc])) {
-        month = month * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      month = str[cc++] - '0';
-      if (cc < len) {
-        month = month * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
-      CFX_WideString wsMonthNameAbbr;
-      FX_WORD i = 0;
-      for (; i < 12; i++) {
-        pLocale->GetMonthName(i, wsMonthNameAbbr, TRUE);
-        if (wsMonthNameAbbr.IsEmpty()) {
-          continue;
-        }
-        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsMonthNameAbbr, str + cc,
-                           wsMonthNameAbbr.GetLength())) {
-          break;
-        }
-      }
-      if (i < 12) {
-        cc += wsMonthNameAbbr.GetLength();
-        month = i + 1;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
-      CFX_WideString wsMonthName;
-      FX_WORD i = 0;
-      for (; i < 12; i++) {
-        pLocale->GetMonthName(i, wsMonthName, FALSE);
-        if (wsMonthName.IsEmpty()) {
-          continue;
-        }
-        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsMonthName, str + cc,
-                           wsMonthName.GetLength())) {
-          break;
-        }
-      }
-      if (i < 12) {
-        cc += wsMonthName.GetLength();
-        month = i + 1;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
-      cc += 1;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
-      CFX_WideString wsDayNameAbbr;
-      FX_WORD i = 0;
-      for (; i < 7; i++) {
-        pLocale->GetDayName(i, wsDayNameAbbr, TRUE);
-        if (wsDayNameAbbr.IsEmpty()) {
-          continue;
-        }
-        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsDayNameAbbr, str + cc,
-                           wsDayNameAbbr.GetLength())) {
-          break;
-        }
-      }
-      if (i < 12) {
-        cc += wsDayNameAbbr.GetLength();
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
-      CFX_WideString wsDayName;
-      int32_t i = 0;
-      for (; i < 7; i++) {
-        pLocale->GetDayName(i, wsDayName, FALSE);
-        if (wsDayName == L"") {
-          continue;
-        }
-        if (!FXSYS_wcsncmp((const FX_WCHAR*)wsDayName, str + cc,
-                           wsDayName.GetLength())) {
-          break;
-        }
-      }
-      if (i < 12) {
-        cc += wsDayName.GetLength();
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
-      cc += 1;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
-      cc += 2;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
-      if (cc + 2 > len) {
-        return FALSE;
-      }
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      year = str[cc++] - '0';
-      if (cc >= len || !FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      year = year * 10 + str[cc++] - '0';
-      if (year <= 29) {
-        year += 2000;
-      } else {
-        year += 1900;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) {
-      int i = 0;
-      year = 0;
-      if (cc + 4 > len) {
-        return FALSE;
-      }
-      while (i < 4) {
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        year = year * 10 + str[cc] - '0';
-        cc++;
-        i++;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) {
-      cc += 1;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) {
-      cc += 2;
-    }
-  }
-  if (cc < len) {
-    return FALSE;
-  }
-  CFX_Unitime ut;
-  ut.Set(year, month, day);
-  datetime = datetime + ut;
-  return cc;
-}
-static void FX_ResolveZone(uint8_t& wHour,
-                           uint8_t& wMinute,
-                           FX_TIMEZONE tzDiff,
-                           IFX_Locale* pLocale) {
-  int32_t iMinuteDiff = wHour * 60 + wMinute;
-  FX_TIMEZONE tzLocale;
-  pLocale->GetTimeZone(tzLocale);
-  iMinuteDiff += tzLocale.tzHour * 60 +
-                 (tzLocale.tzHour < 0 ? -tzLocale.tzMinute : tzLocale.tzMinute);
-  iMinuteDiff -= tzDiff.tzHour * 60 +
-                 (tzDiff.tzHour < 0 ? -tzDiff.tzMinute : tzDiff.tzMinute);
-  while (iMinuteDiff > 1440) {
-    iMinuteDiff -= 1440;
-  }
-  while (iMinuteDiff < 0) {
-    iMinuteDiff += 1440;
-  }
-  wHour = iMinuteDiff / 60;
-  wMinute = iMinuteDiff % 60;
-}
-static FX_BOOL FX_ParseLocaleTime(const CFX_WideString& wsTime,
-                                  const CFX_WideString& wsTimePattern,
-                                  IFX_Locale* pLocale,
-                                  CFX_Unitime& datetime,
-                                  int32_t& cc) {
-  uint8_t hour = 0;
-  uint8_t minute = 0;
-  uint8_t second = 0;
-  FX_WORD millisecond = 0;
-  int32_t ccf = 0;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsTime;
-  int len = wsTime.GetLength();
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsTimePattern;
-  int lenf = wsTimePattern.GetLength();
-  FX_BOOL bHasA = FALSE;
-  FX_BOOL bPM = FALSE;
-  while (cc < len && ccf < lenf) {
-    if (strf[ccf] == '\'') {
-      CFX_WideString wsLiteral = FX_GetLiteralText(strf, ccf, lenf);
-      int32_t iLiteralLen = wsLiteral.GetLength();
-      if (cc + iLiteralLen > len ||
-          FXSYS_wcsncmp(str + cc, (const FX_WCHAR*)wsLiteral, iLiteralLen)) {
-        return FALSE;
-      }
-      cc += iLiteralLen;
-      ccf++;
-      continue;
-    } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) == -1) {
-      if (strf[ccf] != str[cc]) {
-        return FALSE;
-      }
-      cc++;
-      ccf++;
-      continue;
-    }
-    FX_DWORD dwSymbolNum = 1;
-    FX_DWORD dwSymbol = strf[ccf++];
-    while (ccf < lenf && strf[ccf] == dwSymbol) {
-      ccf++;
-      dwSymbolNum++;
-    }
-    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
-    if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1') ||
-        dwSymbol == FXBSTR_ID(0, 0, 'H', '1') ||
-        dwSymbol == FXBSTR_ID(0, 0, 'h', '1') ||
-        dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      hour = str[cc++] - '0';
-      if (cc < len && FX_IsDigit(str[cc])) {
-        hour = hour * 10 + str[cc++] - '0';
-      }
-      if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1') && hour == 24) {
-        hour = 0;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2') ||
-               dwSymbol == FXBSTR_ID(0, 0, 'H', '2') ||
-               dwSymbol == FXBSTR_ID(0, 0, 'h', '2') ||
-               dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      hour = str[cc++] - '0';
-      if (cc >= len) {
-        return FALSE;
-      }
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      hour = hour * 10 + str[cc++] - '0';
-      if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2') && hour == 24) {
-        hour = 0;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      minute = str[cc++] - '0';
-      if (cc < len && FX_IsDigit(str[cc])) {
-        minute = minute * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      minute = str[cc++] - '0';
-      if (cc >= len) {
-        return FALSE;
-      }
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      minute = minute * 10 + str[cc++] - '0';
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      second = str[cc++] - '0';
-      if (cc < len && FX_IsDigit(str[cc])) {
-        second = second * 10 + str[cc++] - '0';
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      second = str[cc++] - '0';
-      if (cc >= len) {
-        return FALSE;
-      }
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      second = second * 10 + str[cc++] - '0';
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) {
-      if (cc + 3 >= len) {
-        return FALSE;
-      }
-      int i = 0;
-      while (i < 3) {
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        millisecond = millisecond * 10 + str[cc++] - '0';
-        i++;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
-      CFX_WideString wsAM;
-      pLocale->GetMeridiemName(wsAM, TRUE);
-      CFX_WideString wsPM;
-      pLocale->GetMeridiemName(wsPM, FALSE);
-      if ((cc + wsAM.GetLength() <= len) &&
-          (CFX_WideStringC(str + cc, wsAM.GetLength()) == wsAM)) {
-        cc += wsAM.GetLength();
-        bHasA = TRUE;
-      } else if ((cc + wsPM.GetLength() <= len) &&
-                 (CFX_WideStringC(str + cc, wsPM.GetLength()) == wsPM)) {
-        cc += wsPM.GetLength();
-        bHasA = TRUE;
-        bPM = TRUE;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
-      if (cc + 3 > len) {
-        continue;
-      }
-      FX_DWORD dwHash = str[cc++];
-      dwHash = (dwHash << 8) | str[cc++];
-      dwHash = (dwHash << 8) | str[cc++];
-      if (dwHash == FXBSTR_ID(0, 'G', 'M', 'T')) {
-        FX_TIMEZONE tzDiff;
-        tzDiff.tzHour = 0;
-        tzDiff.tzMinute = 0;
-        if (cc < len && (str[cc] == '-' || str[cc] == '+')) {
-          cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
-        }
-        FX_ResolveZone(hour, minute, tzDiff, pLocale);
-      } else {
-        const FX_LOCALETIMEZONEINFO* pEnd =
-            g_FXLocaleTimeZoneData + FX_ArraySize(g_FXLocaleTimeZoneData);
-        const FX_LOCALETIMEZONEINFO* pTimeZoneInfo =
-            std::lower_bound(g_FXLocaleTimeZoneData, pEnd, dwHash,
-                             [](const FX_LOCALETIMEZONEINFO& info,
-                                FX_DWORD hash) { return info.uHash < hash; });
-        if (pTimeZoneInfo < pEnd && dwHash == pTimeZoneInfo->uHash) {
-          hour += pTimeZoneInfo->iHour;
-          minute += pTimeZoneInfo->iHour > 0 ? pTimeZoneInfo->iMinute
-                                             : -pTimeZoneInfo->iMinute;
-        }
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
-      if (str[cc] != 'Z') {
-        FX_TIMEZONE tzDiff;
-        cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
-        FX_ResolveZone(hour, minute, tzDiff, pLocale);
-      } else {
-        cc++;
-      }
-    }
-  }
-  if (bHasA) {
-    if (bPM) {
-      hour += 12;
-      if (hour == 24) {
-        hour = 12;
-      }
-    } else {
-      if (hour == 12) {
-        hour = 0;
-      }
-    }
-  }
-  CFX_Unitime ut;
-  ut.Set(0, 0, 0, hour, minute, second, millisecond);
-  datetime = datetime + ut;
-  return cc;
-}
-FX_BOOL CFX_FormatString::ParseDateTime(const CFX_WideString& wsSrcDateTime,
-                                        const CFX_WideString& wsPattern,
-                                        FX_DATETIMETYPE eDateTimeType,
-                                        CFX_Unitime& dtValue) {
-  dtValue.Set(0);
-  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsDatePattern, wsTimePattern;
-  IFX_Locale* pLocale = NULL;
-  FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
-  if (!pLocale) {
-    return FALSE;
-  }
-  if (eCategory == FX_DATETIMETYPE_Unknown) {
-    eCategory = eDateTimeType;
-  }
-  if (eCategory == FX_DATETIMETYPE_Unknown) {
-    return FALSE;
-  }
-  if (eCategory == FX_DATETIMETYPE_TimeDate) {
-    int32_t iStart = 0;
-    if (!FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
-                            iStart)) {
-      return FALSE;
-    }
-    if (!FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
-                            iStart)) {
-      return FALSE;
-    }
-  } else {
-    int32_t iStart = 0;
-    if ((eCategory & FX_DATETIMETYPE_Date) &&
-        !FX_ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
-                            iStart)) {
-      return FALSE;
-    }
-    if ((eCategory & FX_DATETIMETYPE_Time) &&
-        !FX_ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
-                            iStart)) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CFX_FormatString::ParseZero(const CFX_WideString& wsSrcText,
-                                    const CFX_WideString& wsPattern) {
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat);
-  int32_t iText = 0, iPattern = 0;
-  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
-  int32_t iLenText = wsSrcText.GetLength();
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern && iText < iLenText) {
-    if (pStrPattern[iPattern] == '\'') {
-      CFX_WideString wsLiteral =
-          FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-      int32_t iLiteralLen = wsLiteral.GetLength();
-      if (iText + iLiteralLen > iLenText ||
-          FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
-                        iLiteralLen)) {
-        return FALSE;
-      }
-      iText += iLiteralLen;
-      iPattern++;
-      continue;
-    } else if (pStrPattern[iPattern] != pStrText[iText]) {
-      return FALSE;
-    } else {
-      iText++;
-      iPattern++;
-    }
-  }
-  return iPattern == iLenPattern && iText == iLenText;
-}
-FX_BOOL CFX_FormatString::ParseNull(const CFX_WideString& wsSrcText,
-                                    const CFX_WideString& wsPattern) {
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat);
-  int32_t iText = 0, iPattern = 0;
-  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
-  int32_t iLenText = wsSrcText.GetLength();
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern && iText < iLenText) {
-    if (pStrPattern[iPattern] == '\'') {
-      CFX_WideString wsLiteral =
-          FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-      int32_t iLiteralLen = wsLiteral.GetLength();
-      if (iText + iLiteralLen > iLenText ||
-          FXSYS_wcsncmp(pStrText + iText, (const FX_WCHAR*)wsLiteral,
-                        iLiteralLen)) {
-        return FALSE;
-      }
-      iText += iLiteralLen;
-      iPattern++;
-      continue;
-    } else if (pStrPattern[iPattern] != pStrText[iText]) {
-      return FALSE;
-    } else {
-      iText++;
-      iPattern++;
-    }
-  }
-  return iPattern == iLenPattern && iText == iLenText;
-}
-FX_BOOL CFX_FormatString::FormatText(const CFX_WideString& wsSrcText,
-                                     const CFX_WideString& wsPattern,
-                                     CFX_WideString& wsOutput) {
-  if (wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t iLenText = wsSrcText.GetLength();
-  if (iLenText == 0) {
-    return FALSE;
-  }
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"text"), wsTextFormat);
-  int32_t iText = 0, iPattern = 0;
-  const FX_WCHAR* pStrText = (const FX_WCHAR*)wsSrcText;
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern) {
-    switch (pStrPattern[iPattern]) {
-      case '\'': {
-        wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-        iPattern++;
-        break;
-      }
-      case 'A':
-        if (iText >= iLenText || !FX_IsAlpha(pStrText[iText])) {
-          return FALSE;
-        }
-        wsOutput += pStrText[iText++];
-        iPattern++;
-        break;
-      case 'X':
-        if (iText >= iLenText) {
-          return FALSE;
-        }
-        wsOutput += pStrText[iText++];
-        iPattern++;
-        break;
-      case 'O':
-      case '0':
-        if (iText >= iLenText ||
-            (!FX_IsDigit(pStrText[iText]) && !FX_IsAlpha(pStrText[iText]))) {
-          return FALSE;
-        }
-        wsOutput += pStrText[iText++];
-        iPattern++;
-        break;
-      case '9':
-        if (iText >= iLenText || !FX_IsDigit(pStrText[iText])) {
-          return FALSE;
-        }
-        wsOutput += pStrText[iText++];
-        iPattern++;
-        break;
-      default:
-        wsOutput += pStrPattern[iPattern++];
-        break;
-    }
-  }
-  return iText == iLenText;
-}
-static int32_t FX_GetNumTrailingLimit(const CFX_WideString& wsFormat,
-                                      int iDotPos,
-                                      FX_BOOL& bTrimTailZeros) {
-  if (iDotPos < 0) {
-    return 0;
-  }
-  int32_t iCount = wsFormat.GetLength();
-  int32_t iTreading = 0;
-  for (iDotPos++; iDotPos < iCount; iDotPos++) {
-    FX_WCHAR wc = wsFormat[iDotPos];
-    if (wc == L'z' || wc == L'9' || wc == 'Z') {
-      iTreading++;
-      bTrimTailZeros = (wc == L'9' ? FALSE : TRUE);
-    }
-  }
-  return iTreading;
-}
-FX_BOOL CFX_FormatString::FormatStrNum(const CFX_WideStringC& wsInputNum,
-                                       const CFX_WideString& wsPattern,
-                                       CFX_WideString& wsOutput) {
-  if (wsInputNum.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t dot_index_f = -1;
-  FX_DWORD dwNumStyle = 0;
-  CFX_WideString wsNumFormat;
-  IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat);
-  if (!pLocale || wsNumFormat.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t cc = 0, ccf = 0;
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
-  int lenf = wsNumFormat.GetLength();
-  CFX_WideString wsSrcNum = wsInputNum;
-  wsSrcNum.TrimLeft('0');
-  if (wsSrcNum.IsEmpty() || wsSrcNum[0] == '.') {
-    wsSrcNum.Insert(0, '0');
-  }
-  CFX_Decimal decimal = CFX_Decimal(wsSrcNum);
-  if (dwNumStyle & FX_NUMSTYLE_Percent) {
-    decimal = decimal * CFX_Decimal(100);
-    wsSrcNum = decimal;
-  }
-  int32_t exponent = 0;
-  if (dwNumStyle & FX_NUMSTYLE_Exponent) {
-    int fixed_count = 0;
-    while (ccf < dot_index_f) {
-      switch (strf[ccf]) {
-        case '\'':
-          FX_GetLiteralText(strf, ccf, dot_index_f);
-          break;
-        case '9':
-        case 'z':
-        case 'Z':
-          fixed_count++;
-          break;
-      }
-      ccf++;
-    }
-    int threshold = 1;
-    while (fixed_count > 1) {
-      threshold *= 10;
-      fixed_count--;
-    }
-    if (decimal != CFX_Decimal(0)) {
-      if (decimal < CFX_Decimal(threshold)) {
-        decimal = decimal * CFX_Decimal(10);
-        exponent = -1;
-        while (decimal < CFX_Decimal(threshold)) {
-          decimal = decimal * CFX_Decimal(10);
-          exponent -= 1;
-        }
-      } else if (decimal > CFX_Decimal(threshold)) {
-        threshold *= 10;
-        while (decimal > CFX_Decimal(threshold)) {
-          decimal = decimal / CFX_Decimal(10);
-          exponent += 1;
-        }
-      }
-    }
-  }
-  FX_BOOL bTrimTailZeros = FALSE;
-  int32_t iTreading =
-      FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros);
-  int32_t scale = decimal.GetScale();
-  if (iTreading < scale) {
-    decimal.SetScale(iTreading);
-    wsSrcNum = decimal;
-  }
-  if (bTrimTailZeros && scale > 0 && iTreading > 0) {
-    wsSrcNum.TrimRight(L"0");
-    wsSrcNum.TrimRight(L".");
-  }
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  FX_BOOL bNeg = FALSE;
-  if (wsSrcNum[0] == '-') {
-    bNeg = TRUE;
-    wsSrcNum.Delete(0, 1);
-  }
-  FX_BOOL bAddNeg = FALSE;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsSrcNum;
-  int len = wsSrcNum.GetLength();
-  int dot_index = wsSrcNum.Find('.');
-  if (dot_index == -1) {
-    dot_index = len;
-  }
-  ccf = dot_index_f - 1;
-  cc = dot_index - 1;
-  while (ccf >= 0) {
-    switch (strf[ccf]) {
-      case '9':
-        if (cc >= 0) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          cc--;
-        } else {
-          wsOutput = CFX_WideStringC(L'0') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 'z':
-        if (cc >= 0) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          if (str[0] != '0') {
-            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          }
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'Z':
-        if (cc >= 0) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          if (str[0] == '0') {
-            wsOutput = CFX_WideStringC(L' ') + wsOutput;
-          } else {
-            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          }
-          cc--;
-        } else {
-          wsOutput = CFX_WideStringC(L' ') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 'S':
-        if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
-          bAddNeg = TRUE;
-        } else {
-          wsOutput = CFX_WideStringC(L' ') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 's':
-        if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
-          bAddNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 'E': {
-        CFX_WideString wsExp;
-        wsExp.Format(L"E%+d", exponent);
-        wsOutput = wsExp + wsOutput;
-      }
-        ccf--;
-        break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
-      }
-        ccf--;
-        break;
-      case 'r':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
-          if (bNeg) {
-            wsOutput = L"CR" + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'R':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-          if (bNeg) {
-            wsOutput = L"CR" + wsOutput;
-          } else {
-            wsOutput = L"  " + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'b':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
-          if (bNeg) {
-            wsOutput = L"db" + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'B':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-          if (bNeg) {
-            wsOutput = L"DB" + wsOutput;
-          } else {
-            wsOutput = L"  " + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
-      }
-        ccf--;
-        break;
-      case ',':
-        if (cc >= 0) {
-          wsOutput = wsGroupSymbol + wsOutput;
-        }
-        ccf--;
-        break;
-      case '(':
-        if (bNeg) {
-          wsOutput = L"(" + wsOutput;
-        } else {
-          wsOutput = L" " + wsOutput;
-        }
-        bAddNeg = TRUE;
-        ccf--;
-        break;
-      case ')':
-        if (bNeg) {
-          wsOutput = L")" + wsOutput;
-        } else {
-          wsOutput = L" " + wsOutput;
-        }
-        ccf--;
-        break;
-      case '\'':
-        wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput;
-        ccf--;
-        break;
-      default:
-        wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput;
-        ccf--;
-    }
-  }
-  if (cc >= 0) {
-    int nPos = dot_index % 3;
-    wsOutput.Empty();
-    for (int32_t i = 0; i < dot_index; i++) {
-      if (i % 3 == nPos && i != 0) {
-        wsOutput += wsGroupSymbol;
-      }
-      wsOutput += wsSrcNum[i];
-    }
-    if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
-      wsOutput += wsSrcNum.Right(len - dot_index - 1);
-    }
-    if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-    return FALSE;
-  }
-  if (dot_index_f == wsNumFormat.GetLength()) {
-    if (!bAddNeg && bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-    return TRUE;
-  }
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
-  if (strf[dot_index_f] == 'V') {
-    wsOutput += wsDotSymbol;
-  } else if (strf[dot_index_f] == '.') {
-    if (dot_index < len) {
-      wsOutput += wsDotSymbol;
-    } else {
-      if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') {
-        wsOutput += wsDotSymbol;
-      }
-    }
-  }
-  ccf = dot_index_f + 1;
-  cc = dot_index + 1;
-  while (ccf < lenf) {
-    switch (strf[ccf]) {
-      case '\'':
-        wsOutput += FX_GetLiteralText(strf, ccf, lenf);
-        ccf++;
-        break;
-      case '9':
-        if (cc < len) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          wsOutput += str[cc];
-          cc++;
-        } else {
-          wsOutput += L'0';
-        }
-        ccf++;
-        break;
-      case 'z':
-        if (cc < len) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          wsOutput += str[cc];
-          cc++;
-        }
-        ccf++;
-        break;
-      case 'Z':
-        if (cc < len) {
-          if (!FX_IsDigit(str[cc])) {
-            return FALSE;
-          }
-          wsOutput += str[cc];
-          cc++;
-        } else {
-          wsOutput += L'0';
-        }
-        ccf++;
-        break;
-      case 'E': {
-        CFX_WideString wsExp;
-        wsExp.Format(L"E%+d", exponent);
-        wsOutput += wsExp;
-      }
-        ccf++;
-        break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput += wsSymbol;
-      }
-        ccf++;
-        break;
-      case 'c':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
-          if (bNeg) {
-            wsOutput += L"CR";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'C':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
-          if (bNeg) {
-            wsOutput += L"CR";
-          } else {
-            wsOutput += L"  ";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'd':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
-          if (bNeg) {
-            wsOutput += L"db";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'D':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
-          if (bNeg) {
-            wsOutput += L"DB";
-          } else {
-            wsOutput += L"  ";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput += wsSymbol;
-      }
-        ccf++;
-        break;
-      case '8': {
-        while (ccf < lenf && strf[ccf] == '8') {
-          ccf++;
-        }
-        while (cc < len && FX_IsDigit(str[cc])) {
-          wsOutput += str[cc];
-          cc++;
-        }
-      } break;
-      case ',':
-        wsOutput += wsGroupSymbol;
-        ccf++;
-        break;
-      case '(':
-        if (bNeg) {
-          wsOutput += '(';
-        } else {
-          wsOutput += ' ';
-        }
-        bAddNeg = TRUE;
-        ccf++;
-        break;
-      case ')':
-        if (bNeg) {
-          wsOutput += ')';
-        } else {
-          wsOutput += ' ';
-        }
-        ccf++;
-        break;
-      default:
-        ccf++;
-    }
-  }
-  if (!bAddNeg && bNeg) {
-    CFX_WideString wsMinusymbol;
-    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-    wsOutput =
-        wsMinusymbol + wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1);
-  }
-  return TRUE;
-}
-FX_BOOL CFX_FormatString::FormatLCNumeric(CFX_LCNumeric& lcNum,
-                                          const CFX_WideString& wsPattern,
-                                          CFX_WideString& wsOutput) {
-  int32_t dot_index_f = -1;
-  FX_DWORD dwNumStyle = 0;
-  CFX_WideString wsNumFormat;
-  IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat);
-  if (!pLocale || wsNumFormat.IsEmpty()) {
-    return FALSE;
-  }
-  int32_t cc = 0, ccf = 0;
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsNumFormat;
-  int lenf = wsNumFormat.GetLength();
-  double dbOrgRaw = lcNum.GetDouble();
-  double dbRetValue = dbOrgRaw;
-  if (dwNumStyle & FX_NUMSTYLE_Percent) {
-    dbRetValue *= 100;
-  }
-  int32_t exponent = 0;
-  if (dwNumStyle & FX_NUMSTYLE_Exponent) {
-    int fixed_count = 0;
-    while (ccf < dot_index_f) {
-      switch (strf[ccf]) {
-        case '\'':
-          FX_GetLiteralText(strf, ccf, dot_index_f);
-          break;
-        case '9':
-        case 'z':
-        case 'Z':
-          fixed_count++;
-          break;
-      }
-      ccf++;
-    }
-    int threshold = 1;
-    while (fixed_count > 1) {
-      threshold *= 10;
-      fixed_count--;
-    }
-    if (dbRetValue != 0) {
-      if (dbRetValue < threshold) {
-        dbRetValue *= 10;
-        exponent = -1;
-        while (dbRetValue < threshold) {
-          dbRetValue *= 10;
-          exponent -= 1;
-        }
-      } else if (dbRetValue > threshold) {
-        threshold *= 10;
-        while (dbRetValue > threshold) {
-          dbRetValue /= 10;
-          exponent += 1;
-        }
-      }
-    }
-  }
-  if (dwNumStyle & (FX_NUMSTYLE_Percent | FX_NUMSTYLE_Exponent)) {
-    lcNum = CFX_LCNumeric(dbRetValue);
-  }
-  FX_BOOL bTrimTailZeros = FALSE;
-  int32_t iTreading =
-      FX_GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros);
-  CFX_WideString wsNumeric = lcNum.ToString(iTreading, bTrimTailZeros);
-  if (wsNumeric.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  FX_BOOL bNeg = FALSE;
-  if (wsNumeric[0] == '-') {
-    bNeg = TRUE;
-    wsNumeric.Delete(0, 1);
-  }
-  FX_BOOL bAddNeg = FALSE;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsNumeric;
-  int len = wsNumeric.GetLength();
-  int dot_index = wsNumeric.Find('.');
-  if (dot_index == -1) {
-    dot_index = len;
-  }
-  ccf = dot_index_f - 1;
-  cc = dot_index - 1;
-  while (ccf >= 0) {
-    switch (strf[ccf]) {
-      case '9':
-        if (cc >= 0) {
-          wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          cc--;
-        } else {
-          wsOutput = CFX_WideStringC(L'0') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 'z':
-        if (cc >= 0) {
-          if (lcNum.m_Integral != 0) {
-            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          }
-          cc--;
-        }
-        ccf--;
-        break;
-      case 'Z':
-        if (cc >= 0) {
-          if (lcNum.m_Integral == 0) {
-            wsOutput = CFX_WideStringC(L' ') + wsOutput;
-          } else {
-            wsOutput = CFX_WideStringC(str[cc]) + wsOutput;
-          }
-          cc--;
-        } else {
-          wsOutput = CFX_WideStringC(L' ') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 'S':
-        if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
-          bAddNeg = TRUE;
-        } else {
-          wsOutput = CFX_WideStringC(L' ') + wsOutput;
-        }
-        ccf--;
-        break;
-      case 's':
-        if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
-          bAddNeg = TRUE;
-        }
-        ccf--;
-        break;
-      case 'E': {
-        CFX_WideString wsExp;
-        wsExp.Format(L"E%+d", exponent);
-        wsOutput = wsExp + wsOutput;
-      }
-        ccf--;
-        break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
-      }
-        ccf--;
-        break;
-      case 'r':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
-          if (bNeg) {
-            wsOutput = L"CR" + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'R':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-          if (bNeg) {
-            wsOutput = L"CR" + wsOutput;
-          } else {
-            wsOutput = L"  " + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'b':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
-          if (bNeg) {
-            wsOutput = L"db" + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'B':
-        if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-          if (bNeg) {
-            wsOutput = L"DB" + wsOutput;
-          } else {
-            wsOutput = L"  " + wsOutput;
-          }
-          ccf -= 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
-      }
-        ccf--;
-        break;
-      case ',':
-        if (cc >= 0) {
-          wsOutput = wsGroupSymbol + wsOutput;
-        }
-        ccf--;
-        break;
-      case '(':
-        if (bNeg) {
-          wsOutput = L"(" + wsOutput;
-        } else {
-          wsOutput = L" " + wsOutput;
-        }
-        bAddNeg = TRUE;
-        ccf--;
-        break;
-      case ')':
-        if (bNeg) {
-          wsOutput = L")" + wsOutput;
-        } else {
-          wsOutput = L" " + wsOutput;
-        }
-        ccf--;
-        break;
-      case '\'':
-        wsOutput = FX_GetLiteralTextReverse(strf, ccf) + wsOutput;
-        ccf--;
-        break;
-      default:
-        wsOutput = CFX_WideStringC(strf[ccf]) + wsOutput;
-        ccf--;
-    }
-  }
-  if (cc >= 0) {
-    int nPos = dot_index % 3;
-    wsOutput.Empty();
-    for (int32_t i = 0; i < dot_index; i++) {
-      if (i % 3 == nPos && i != 0) {
-        wsOutput += wsGroupSymbol;
-      }
-      wsOutput += wsNumeric[i];
-    }
-    if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
-      wsOutput += wsNumeric.Right(len - dot_index - 1);
-    }
-    if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-    return FALSE;
-  }
-  if (dot_index_f == wsNumFormat.GetLength()) {
-    if (!bAddNeg && bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-    return TRUE;
-  }
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
-  if (strf[dot_index_f] == 'V') {
-    wsOutput += wsDotSymbol;
-  } else if (strf[dot_index_f] == '.') {
-    if (dot_index < len) {
-      wsOutput += wsDotSymbol;
-    } else {
-      if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z') {
-        wsOutput += wsDotSymbol;
-      }
-    }
-  }
-  ccf = dot_index_f + 1;
-  cc = dot_index + 1;
-  while (ccf < lenf) {
-    switch (strf[ccf]) {
-      case '\'':
-        wsOutput += FX_GetLiteralText(strf, ccf, lenf);
-        ccf++;
-        break;
-      case '9':
-        if (cc < len) {
-          wsOutput += str[cc];
-          cc++;
-        } else {
-          wsOutput += L'0';
-        }
-        ccf++;
-        break;
-      case 'z':
-        if (cc < len) {
-          wsOutput += str[cc];
-          cc++;
-        }
-        ccf++;
-        break;
-      case 'Z':
-        if (cc < len) {
-          wsOutput += str[cc];
-          cc++;
-        } else {
-          wsOutput += L'0';
-        }
-        ccf++;
-        break;
-      case 'E': {
-        CFX_WideString wsExp;
-        wsExp.Format(L"E%+d", exponent);
-        wsOutput += wsExp;
-      }
-        ccf++;
-        break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput += wsSymbol;
-      }
-        ccf++;
-        break;
-      case 'c':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
-          if (bNeg) {
-            wsOutput += L"CR";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'C':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
-          if (bNeg) {
-            wsOutput += L"CR";
-          } else {
-            wsOutput += L"  ";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'd':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
-          if (bNeg) {
-            wsOutput += L"db";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case 'D':
-        if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
-          if (bNeg) {
-            wsOutput += L"DB";
-          } else {
-            wsOutput += L"  ";
-          }
-          ccf += 2;
-          bAddNeg = TRUE;
-        }
-        break;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput += wsSymbol;
-      }
-        ccf++;
-        break;
-      case '8': {
-        while (ccf < lenf && strf[ccf] == '8') {
-          ccf++;
-        }
-        while (cc < len && FX_IsDigit(str[cc])) {
-          wsOutput += str[cc];
-          cc++;
-        }
-      } break;
-      case ',':
-        wsOutput += wsGroupSymbol;
-        ccf++;
-        break;
-      case '(':
-        if (bNeg) {
-          wsOutput += '(';
-        } else {
-          wsOutput += ' ';
-        }
-        bAddNeg = TRUE;
-        ccf++;
-        break;
-      case ')':
-        if (bNeg) {
-          wsOutput += ')';
-        } else {
-          wsOutput += ' ';
-        }
-        ccf++;
-        break;
-      default:
-        ccf++;
-    }
-  }
-  if (!bAddNeg && bNeg) {
-    CFX_WideString wsMinusymbol;
-    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-    wsOutput =
-        wsOutput[0] + wsMinusymbol + wsOutput.Mid(1, wsOutput.GetLength() - 1);
-  }
-  return TRUE;
-}
-FX_BOOL CFX_FormatString::FormatNum(const CFX_WideString& wsSrcNum,
-                                    const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsOutput) {
-  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  return FormatStrNum(wsSrcNum, wsPattern, wsOutput);
-}
-FX_BOOL CFX_FormatString::FormatNum(FX_FLOAT fNum,
-                                    const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsOutput) {
-  if (wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_LCNumeric lcNum(fNum);
-  return FormatLCNumeric(lcNum, wsPattern, wsOutput);
-}
-FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate,
-                             CFX_Unitime& datetime) {
-  int32_t year = 1900;
-  int32_t month = 1;
-  int32_t day = 1;
-  FX_WORD wYear = 0;
-  int cc_start = 0, cc = 0;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsDate;
-  int len = wsDate.GetLength();
-  if (len > 10) {
-    return FALSE;
-  }
-  while (cc < len && cc < 4) {
-    if (!FX_IsDigit(str[cc])) {
-      return FALSE;
-    }
-    wYear = wYear * 10 + str[cc++] - '0';
-  }
-  year = wYear;
-  if (cc < 4 || wYear < 1900) {
-    return FALSE;
-  }
-  if (cc < len) {
-    if (str[cc] == '-') {
-      cc++;
-    }
-    cc_start = cc;
-    uint8_t tmpM = 0;
-    while (cc < len && cc < cc_start + 2) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      tmpM = tmpM * 10 + str[cc++] - '0';
-    }
-    month = tmpM;
-    if (cc == cc_start + 1 || tmpM > 12 || tmpM < 1) {
-      return FALSE;
-    }
-    if (cc < len) {
-      if (str[cc] == '-') {
-        cc++;
-      }
-      uint8_t tmpD = 0;
-      cc_start = cc;
-      while (cc < len && cc < cc_start + 2) {
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        tmpD = tmpD * 10 + str[cc++] - '0';
-      }
-      day = tmpD;
-      if (tmpD < 1) {
-        return FALSE;
-      }
-      if ((tmpM == 1 || tmpM == 3 || tmpM == 5 || tmpM == 7 || tmpM == 8 ||
-           tmpM == 10 || tmpM == 12) &&
-          tmpD > 31) {
-        return FALSE;
-      }
-      if ((tmpM == 4 || tmpM == 6 || tmpM == 9 || tmpM == 11) && tmpD > 30) {
-        return FALSE;
-      }
-      FX_BOOL iLeapYear;
-      if ((wYear % 4 == 0 && wYear % 100 != 0) || wYear % 400 == 0) {
-        iLeapYear = TRUE;
-      } else {
-        iLeapYear = FALSE;
-      }
-      if ((iLeapYear && tmpM == 2 && tmpD > 29) ||
-          (!iLeapYear && tmpM == 2 && tmpD > 28)) {
-        return FALSE;
-      }
-    }
-  }
-  CFX_Unitime ut;
-  ut.Set(year, month, day);
-  datetime = datetime + ut;
-  return TRUE;
-}
-FX_BOOL FX_TimeFromCanonical(const CFX_WideStringC& wsTime,
-                             CFX_Unitime& datetime,
-                             IFX_Locale* pLocale) {
-  if (wsTime.GetLength() == 0) {
-    return FALSE;
-  }
-  uint8_t hour = 0;
-  uint8_t minute = 0;
-  uint8_t second = 0;
-  FX_WORD millisecond = 0;
-  int cc_start = 0, cc = cc_start;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsTime.GetPtr();
-  int len = wsTime.GetLength();
-  while (cc < len && cc < 2) {
-    if (!FX_IsDigit(str[cc])) {
-      return FALSE;
-    }
-    hour = hour * 10 + str[cc++] - '0';
-  }
-  if (cc < 2 || hour >= 24) {
-    return FALSE;
-  }
-  if (cc < len) {
-    if (str[cc] == ':') {
-      cc++;
-    }
-    cc_start = cc;
-    while (cc < len && cc < cc_start + 2) {
-      if (!FX_IsDigit(str[cc])) {
-        return FALSE;
-      }
-      minute = minute * 10 + str[cc++] - '0';
-    }
-    if (cc == cc_start + 1 || minute >= 60) {
-      return FALSE;
-    }
-    if (cc < len) {
-      if (str[cc] == ':') {
-        cc++;
-      }
-      cc_start = cc;
-      while (cc < len && cc < cc_start + 2) {
-        if (!FX_IsDigit(str[cc])) {
-          return FALSE;
-        }
-        second = second * 10 + str[cc++] - '0';
-      }
-      if (cc == cc_start + 1 || second >= 60) {
-        return FALSE;
-      }
-      if (cc < len) {
-        if (str[cc] == '.') {
-          cc++;
-          cc_start = cc;
-          while (cc < len && cc < cc_start + 3) {
-            if (!FX_IsDigit(str[cc])) {
-              return FALSE;
-            }
-            millisecond = millisecond * 10 + str[cc++] - '0';
-          }
-          if (cc < cc_start + 3 || millisecond >= 1000) {
-            return FALSE;
-          }
-        }
-        if (cc < len) {
-          FX_TIMEZONE tzDiff;
-          tzDiff.tzHour = 0;
-          tzDiff.tzMinute = 0;
-          if (str[cc] != 'Z') {
-            cc += FX_ParseTimeZone(str + cc, len - cc, tzDiff);
-          }
-          FX_ResolveZone(hour, minute, tzDiff, pLocale);
-        }
-      }
-    }
-  }
-  CFX_Unitime ut;
-  ut.Set(0, 0, 0, hour, minute, second, millisecond);
-  datetime = datetime + ut;
-  return TRUE;
-}
-static FX_WORD FX_GetSolarMonthDays(FX_WORD year, FX_WORD month) {
-  if (month % 2) {
-    return 31;
-  } else if (month == 2) {
-    return FX_IsLeapYear(year) ? 29 : 28;
-  }
-  return 30;
-}
-static FX_WORD FX_GetWeekDay(FX_WORD year, FX_WORD month, FX_WORD day) {
-  FX_WORD g_month_day[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
-  FX_WORD nDays =
-      (year - 1) % 7 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
-  nDays += g_month_day[month - 1] + day;
-  if (FX_IsLeapYear(year) && month > 2) {
-    nDays++;
-  }
-  return nDays % 7;
-}
-static FX_WORD FX_GetWeekOfMonth(FX_WORD year, FX_WORD month, FX_WORD day) {
-  FX_WORD week_day = FX_GetWeekDay(year, month, 1);
-  FX_WORD week_index = 0;
-  week_index += day / 7;
-  day = day % 7;
-  if (week_day + day > 7) {
-    week_index++;
-  }
-  return week_index;
-}
-static FX_WORD FX_GetWeekOfYear(FX_WORD year, FX_WORD month, FX_WORD day) {
-  FX_WORD nDays = 0;
-  for (FX_WORD i = 1; i < month; i++) {
-    nDays += FX_GetSolarMonthDays(year, i);
-  }
-  nDays += day;
-  FX_WORD week_day = FX_GetWeekDay(year, 1, 1);
-  FX_WORD week_index = 1;
-  week_index += nDays / 7;
-  nDays = nDays % 7;
-  if (week_day + nDays > 7) {
-    week_index++;
-  }
-  return week_index;
-}
-static FX_BOOL FX_DateFormat(const CFX_WideString& wsDatePattern,
-                             IFX_Locale* pLocale,
-                             const CFX_Unitime& datetime,
-                             CFX_WideString& wsResult) {
-  FX_BOOL bRet = TRUE;
-  int32_t year = datetime.GetYear();
-  uint8_t month = datetime.GetMonth();
-  uint8_t day = datetime.GetDay();
-  int32_t ccf = 0;
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsDatePattern;
-  int32_t lenf = wsDatePattern.GetLength();
-  while (ccf < lenf) {
-    if (strf[ccf] == '\'') {
-      wsResult += FX_GetLiteralText(strf, ccf, lenf);
-      ccf++;
-      continue;
-    } else if (FX_Local_Find(gs_wsDateSymbols, strf[ccf]) < 0) {
-      wsResult += strf[ccf++];
-      continue;
-    }
-    FX_DWORD dwSymbolNum = 1;
-    FX_DWORD dwSymbol = strf[ccf++];
-    while (ccf < lenf && strf[ccf] == dwSymbol) {
-      ccf++;
-      dwSymbolNum++;
-    }
-    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
-    if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) {
-      CFX_WideString wsDay;
-      wsDay.Format(L"%d", day);
-      wsResult += wsDay;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) {
-      CFX_WideString wsDay;
-      wsDay.Format(L"%02d", day);
-      wsResult += wsDay;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) {
-      FX_WORD nDays = 0;
-      for (int i = 1; i < month; i++) {
-        nDays += FX_GetSolarMonthDays(year, i);
-      }
-      nDays += day;
-      CFX_WideString wsDays;
-      wsDays.Format(L"%d", nDays);
-      wsResult += wsDays;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) {
-      FX_WORD nDays = 0;
-      for (int i = 1; i < month; i++) {
-        nDays += FX_GetSolarMonthDays(year, i);
-      }
-      nDays += day;
-      CFX_WideString wsDays;
-      wsDays.Format(L"%03d", nDays);
-      wsResult += wsDays;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      CFX_WideString wsMonth;
-      wsMonth.Format(L"%d", month);
-      wsResult += wsMonth;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      CFX_WideString wsMonth;
-      wsMonth.Format(L"%02d", month);
-      wsResult += wsMonth;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
-      CFX_WideString wsTemp;
-      pLocale->GetMonthName(month - 1, wsTemp, TRUE);
-      wsResult += wsTemp;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
-      CFX_WideString wsTemp;
-      pLocale->GetMonthName(month - 1, wsTemp, FALSE);
-      wsResult += wsTemp;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
-      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
-      CFX_WideString wsWeekDay;
-      wsWeekDay.Format(L"%d", wWeekDay + 1);
-      wsResult += wsWeekDay;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
-      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
-      CFX_WideString wsTemp;
-      pLocale->GetDayName(wWeekDay, wsTemp, TRUE);
-      wsResult += wsTemp;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
-      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
-      if (pLocale) {
-        CFX_WideString wsTemp;
-        pLocale->GetDayName(wWeekDay, wsTemp, FALSE);
-        wsResult += wsTemp;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
-      FX_WORD wWeekDay = FX_GetWeekDay(year, month, day);
-      CFX_WideString wsWeekDay;
-      wsWeekDay.Format(L"%d", wWeekDay ? wWeekDay : 7);
-      wsResult += wsWeekDay;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
-      CFX_WideString wsTemp;
-      pLocale->GetEraName(wsTemp, year < 0);
-      wsResult += wsTemp;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
-      CFX_WideString wsYear;
-      wsYear.Format(L"%02d", year % 100);
-      wsResult += wsYear;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) {
-      CFX_WideString wsYear;
-      wsYear.Format(L"%d", year);
-      wsResult += wsYear;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) {
-      FX_WORD week_index = FX_GetWeekOfMonth(year, month, day);
-      CFX_WideString wsWeekInMonth;
-      wsWeekInMonth.Format(L"%d", week_index);
-      wsResult += wsWeekInMonth;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) {
-      FX_WORD week_index = FX_GetWeekOfYear(year, month, day);
-      CFX_WideString wsWeekInYear;
-      wsWeekInYear.Format(L"%02d", week_index);
-      wsResult += wsWeekInYear;
-    }
-  }
-  return bRet;
-}
-static FX_BOOL FX_TimeFormat(const CFX_WideString& wsTimePattern,
-                             IFX_Locale* pLocale,
-                             const CFX_Unitime& datetime,
-                             CFX_WideString& wsResult) {
-  FX_BOOL bGMT = FALSE;
-  FX_BOOL bRet = TRUE;
-  uint8_t hour = datetime.GetHour();
-  uint8_t minute = datetime.GetMinute();
-  uint8_t second = datetime.GetSecond();
-  FX_WORD millisecond = datetime.GetMillisecond();
-  int32_t ccf = 0;
-  const FX_WCHAR* strf = (const FX_WCHAR*)wsTimePattern;
-  int32_t lenf = wsTimePattern.GetLength();
-  FX_WORD wHour = hour;
-  FX_BOOL bPM = FALSE;
-  if (wsTimePattern.Find('A') != -1) {
-    if (wHour >= 12) {
-      bPM = TRUE;
-    }
-  }
-  while (ccf < lenf) {
-    if (strf[ccf] == '\'') {
-      wsResult += FX_GetLiteralText(strf, ccf, lenf);
-      ccf++;
-      continue;
-    } else if (FX_Local_Find(gs_wsTimeSymbols, strf[ccf]) < 0) {
-      wsResult += strf[ccf++];
-      continue;
-    }
-    FX_DWORD dwSymbolNum = 1;
-    FX_DWORD dwSymbol = strf[ccf++];
-    while (ccf < lenf && strf[ccf] == dwSymbol) {
-      ccf++;
-      dwSymbolNum++;
-    }
-    dwSymbol = (dwSymbol << 8) | (dwSymbolNum + '0');
-    if (dwSymbol == FXBSTR_ID(0, 0, 'h', '1')) {
-      if (wHour > 12) {
-        wHour -= 12;
-      }
-      CFX_WideString wsHour;
-      wsHour.Format(L"%d", wHour == 0 ? 12 : wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'h', '2')) {
-      if (wHour > 12) {
-        wHour -= 12;
-      }
-      CFX_WideString wsHour;
-      wsHour.Format(L"%02d", wHour == 0 ? 12 : wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) {
-      CFX_WideString wsHour;
-      wsHour.Format(L"%d", wHour == 0 ? 24 : wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) {
-      CFX_WideString wsHour;
-      wsHour.Format(L"%02d", wHour == 0 ? 24 : wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1')) {
-      if (wHour > 12) {
-        wHour -= 12;
-      }
-      CFX_WideString wsHour;
-      wsHour.Format(L"%d", wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '1')) {
-      CFX_WideString wsHour;
-      wsHour.Format(L"%d", wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2')) {
-      if (wHour > 12) {
-        wHour -= 12;
-      }
-      CFX_WideString wsHour;
-      wsHour.Format(L"%02d", wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '2')) {
-      CFX_WideString wsHour;
-      wsHour.Format(L"%02d", wHour);
-      wsResult += wsHour;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      CFX_WideString wsMinute;
-      wsMinute.Format(L"%d", minute);
-      wsResult += wsMinute;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      CFX_WideString wsMinute;
-      wsMinute.Format(L"%02d", minute);
-      wsResult += wsMinute;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) {
-      CFX_WideString wsSecond;
-      wsSecond.Format(L"%d", second);
-      wsResult += wsSecond;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) {
-      CFX_WideString wsSecond;
-      wsSecond.Format(L"%02d", second);
-      wsResult += wsSecond;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) {
-      CFX_WideString wsMilliseconds;
-      wsMilliseconds.Format(L"%03d", millisecond);
-      wsResult += wsMilliseconds;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
-      CFX_WideString wsMeridiem;
-      pLocale->GetMeridiemName(wsMeridiem, !bPM);
-      wsResult += wsMeridiem;
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
-      wsResult += FX_WSTRC(L"GMT");
-      FX_TIMEZONE tz;
-      pLocale->GetTimeZone(tz);
-      if (!bGMT && (tz.tzHour != 0 || tz.tzMinute != 0)) {
-        if (tz.tzHour < 0) {
-          wsResult += FX_WSTRC(L"-");
-        } else {
-          wsResult += FX_WSTRC(L"+");
-        }
-        CFX_WideString wsTimezone;
-        wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
-        wsResult += wsTimezone;
-      }
-    } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
-      FX_TIMEZONE tz;
-      pLocale->GetTimeZone(tz);
-      if (!bGMT && tz.tzHour != 0 && tz.tzMinute != 0) {
-        if (tz.tzHour < 0) {
-          wsResult += FX_WSTRC(L"-");
-        } else {
-          wsResult += FX_WSTRC(L"+");
-        }
-        CFX_WideString wsTimezone;
-        wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
-        wsResult += wsTimezone;
-      }
-    }
-  }
-  return bRet;
-}
-static FX_BOOL FX_FormatDateTime(const CFX_Unitime& dt,
-                                 const CFX_WideString& wsDatePattern,
-                                 const CFX_WideString& wsTimePattern,
-                                 FX_BOOL bDateFirst,
-                                 IFX_Locale* pLocale,
-                                 CFX_WideString& wsOutput) {
-  FX_BOOL bRet = TRUE;
-  CFX_WideString wsDateOut, wsTimeOut;
-  if (!wsDatePattern.IsEmpty()) {
-    bRet &= FX_DateFormat(wsDatePattern, pLocale, dt, wsDateOut);
-  }
-  if (!wsTimePattern.IsEmpty()) {
-    bRet &= FX_TimeFormat(wsTimePattern, pLocale, dt, wsTimeOut);
-  }
-  wsOutput = bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut;
-  return bRet;
-}
-FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                         const CFX_WideString& wsPattern,
-                                         CFX_WideString& wsOutput) {
-  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsDatePattern, wsTimePattern;
-  IFX_Locale* pLocale = NULL;
-  FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
-  if (pLocale == NULL || eCategory == FX_DATETIMETYPE_Unknown) {
-    return FALSE;
-  }
-  CFX_Unitime dt(0);
-  int32_t iT = wsSrcDateTime.Find(L"T");
-  if (iT < 0) {
-    if (eCategory == FX_DATETIMETYPE_Date) {
-      FX_DateFromCanonical(wsSrcDateTime, dt);
-    } else if (eCategory == FX_DATETIMETYPE_Time) {
-      FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale);
-    }
-  } else {
-    FX_DateFromCanonical(wsSrcDateTime.Left(iT), dt);
-    FX_TimeFromCanonical(
-        wsSrcDateTime.Right(wsSrcDateTime.GetLength() - iT - 1), dt, pLocale);
-  }
-  return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern,
-                           eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
-                           wsOutput);
-}
-FX_BOOL CFX_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                         const CFX_WideString& wsPattern,
-                                         CFX_WideString& wsOutput,
-                                         FX_DATETIMETYPE eDateTimeType) {
-  if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsDatePattern, wsTimePattern;
-  IFX_Locale* pLocale = NULL;
-  FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
-  if (!pLocale) {
-    return FALSE;
-  }
-  if (eCategory == FX_DATETIMETYPE_Unknown) {
-    if (eDateTimeType == FX_DATETIMETYPE_Time) {
-      wsTimePattern = wsDatePattern;
-      wsDatePattern.Empty();
-    }
-    eCategory = eDateTimeType;
-  }
-  if (eCategory == FX_DATETIMETYPE_Unknown) {
-    return FALSE;
-  }
-  CFX_Unitime dt(0);
-  int32_t iT = wsSrcDateTime.Find(L"T");
-  if (iT < 0) {
-    if (eCategory == FX_DATETIMETYPE_Date &&
-        FX_DateFromCanonical(wsSrcDateTime, dt)) {
-      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale,
-                               wsOutput);
-    } else if (eCategory == FX_DATETIMETYPE_Time &&
-               FX_TimeFromCanonical(wsSrcDateTime, dt, pLocale)) {
-      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern, TRUE, pLocale,
-                               wsOutput);
-    }
-  } else {
-    CFX_WideStringC wsSrcDate((const FX_WCHAR*)wsSrcDateTime, iT);
-    CFX_WideStringC wsSrcTime((const FX_WCHAR*)wsSrcDateTime + iT + 1,
-                              wsSrcDateTime.GetLength() - iT - 1);
-    if (wsSrcDate.IsEmpty() || wsSrcTime.IsEmpty()) {
-      return FALSE;
-    }
-    if (FX_DateFromCanonical(wsSrcDate, dt) &&
-        FX_TimeFromCanonical(wsSrcTime, dt, pLocale)) {
-      return FX_FormatDateTime(dt, wsDatePattern, wsTimePattern,
-                               eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
-                               wsOutput);
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFX_FormatString::FormatDateTime(const CFX_Unitime& dt,
-                                         const CFX_WideString& wsPattern,
-                                         CFX_WideString& wsOutput) {
-  if (wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsDatePattern, wsTimePattern;
-  IFX_Locale* pLocale = NULL;
-  FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
-  if (!pLocale) {
-    return FALSE;
-  }
-  return FX_FormatDateTime(dt, wsPattern, wsTimePattern,
-                           eCategory != FX_DATETIMETYPE_TimeDate, pLocale,
-                           wsOutput);
-}
-FX_BOOL CFX_FormatString::FormatZero(const CFX_WideString& wsPattern,
-                                     CFX_WideString& wsOutput) {
-  if (wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"zero"), wsTextFormat);
-  int32_t iPattern = 0;
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern) {
-    if (pStrPattern[iPattern] == '\'') {
-      wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-      iPattern++;
-      continue;
-    } else {
-      wsOutput += pStrPattern[iPattern++];
-      continue;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CFX_FormatString::FormatNull(const CFX_WideString& wsPattern,
-                                     CFX_WideString& wsOutput) {
-  if (wsPattern.IsEmpty()) {
-    return FALSE;
-  }
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, FX_WSTRC(L"null"), wsTextFormat);
-  int32_t iPattern = 0;
-  const FX_WCHAR* pStrPattern = (const FX_WCHAR*)wsTextFormat;
-  int32_t iLenPattern = wsTextFormat.GetLength();
-  while (iPattern < iLenPattern) {
-    if (pStrPattern[iPattern] == '\'') {
-      wsOutput += FX_GetLiteralText(pStrPattern, iPattern, iLenPattern);
-      iPattern++;
-      continue;
-    } else {
-      wsOutput += pStrPattern[iPattern++];
-      continue;
-    }
-  }
-  return TRUE;
-}
-IFX_Locale* CFX_FormatString::GetPatternLocale(
-    const CFX_WideStringC& wsLocale) {
-  if (m_bUseLCID) {
-  }
-  return m_pLocaleMgr->GetLocaleByName(wsLocale);
-}
-#define FXMATH_DECIMAL_SCALELIMIT 0x1c
-#define FXMATH_DECIMAL_NEGMASK (0x80000000L)
-#define FXMATH_DECIMAL_FORCEBOOL(x) (!(!(x)))
-#define FXMATH_DECIMAL_MAKEFLAGS(NEG, SCALE) \
-  (((SCALE) << 0x10) | ((NEG) ? FXMATH_DECIMAL_NEGMASK : 0))
-#define FXMATH_DECIMAL_FLAGS2NEG(FLAGS) \
-  FXMATH_DECIMAL_FORCEBOOL((FLAGS)&FXMATH_DECIMAL_NEGMASK)
-#define FXMATH_DECIMAL_FLAGS2SCALE(FLAGS) \
-  ((uint8_t)(((FLAGS) & ~FXMATH_DECIMAL_NEGMASK) >> 0x10))
-#define FXMATH_DECIMAL_RSHIFT32BIT(x) ((x) >> 0x10 >> 0x10)
-#define FXMATH_DECIMAL_LSHIFT32BIT(x) ((x) << 0x10 << 0x10)
-static inline uint8_t fxmath_decimal_helper_div10(uint64_t& phi,
-                                                  uint64_t& pmid,
-                                                  uint64_t& plo) {
-  uint8_t retVal;
-  pmid += FXMATH_DECIMAL_LSHIFT32BIT(phi % 0xA);
-  phi /= 0xA;
-  plo += FXMATH_DECIMAL_LSHIFT32BIT(pmid % 0xA);
-  pmid /= 0xA;
-  retVal = plo % 0xA;
-  plo /= 0xA;
-  return retVal;
-}
-static inline uint8_t fxmath_decimal_helper_div10_any(uint64_t nums[],
-                                                      uint8_t numcount) {
-  uint8_t retVal = 0;
-  for (int i = numcount - 1; i > 0; i--) {
-    nums[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(nums[i] % 0xA);
-    nums[i] /= 0xA;
-  }
-  if (numcount) {
-    retVal = nums[0] % 0xA;
-    nums[0] /= 0xA;
-  }
-  return retVal;
-}
-static inline void fxmath_decimal_helper_mul10(uint64_t& phi,
-                                               uint64_t& pmid,
-                                               uint64_t& plo) {
-  plo *= 0xA;
-  pmid = pmid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(plo);
-  plo = (uint32_t)plo;
-  phi = phi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(pmid);
-  pmid = (uint32_t)pmid;
-}
-static inline void fxmath_decimal_helper_mul10_any(uint64_t nums[],
-                                                   uint8_t numcount) {
-  nums[0] *= 0xA;
-  for (int i = 1; i < numcount; i++) {
-    nums[i] = nums[i] * 0xA + FXMATH_DECIMAL_RSHIFT32BIT(nums[i - 1]);
-    nums[i - 1] = (uint32_t)nums[i - 1];
-  }
-}
-static inline void fxmath_decimal_helper_normalize(uint64_t& phi,
-                                                   uint64_t& pmid,
-                                                   uint64_t& plo) {
-  phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid);
-  pmid = (uint32_t)pmid;
-  pmid += FXMATH_DECIMAL_RSHIFT32BIT(plo);
-  plo = (uint32_t)plo;
-  phi += FXMATH_DECIMAL_RSHIFT32BIT(pmid);
-  pmid = (uint32_t)pmid;
-}
-static inline void fxmath_decimal_helper_normalize_any(uint64_t nums[],
-                                                       uint8_t len) {
-  {
-    for (int i = len - 2; i > 0; i--) {
-      nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]);
-      nums[i] = (uint32_t)nums[i];
-    }
-  }
-  {
-    for (int i = 0; i < len - 1; i++) {
-      nums[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(nums[i]);
-      nums[i] = (uint32_t)nums[i];
-    }
-  }
-}
-static inline int8_t fxmath_decimal_helper_raw_compare(uint32_t hi1,
-                                                       uint32_t mid1,
-                                                       uint32_t lo1,
-                                                       uint32_t hi2,
-                                                       uint32_t mid2,
-                                                       uint32_t lo2) {
-  int8_t retVal = 0;
-  if (!retVal) {
-    retVal += (hi1 > hi2 ? 1 : (hi1 < hi2 ? -1 : 0));
-  }
-  if (!retVal) {
-    retVal += (mid1 > mid2 ? 1 : (mid1 < mid2 ? -1 : 0));
-  }
-  if (!retVal) {
-    retVal += (lo1 > lo2 ? 1 : (lo1 < lo2 ? -1 : 0));
-  }
-  return retVal;
-}
-static inline int8_t fxmath_decimal_helper_raw_compare_any(uint64_t a[],
-                                                           uint8_t al,
-                                                           uint64_t b[],
-                                                           uint8_t bl) {
-  int8_t retVal = 0;
-  for (int i = std::max(al - 1, bl - 1); i >= 0; i--) {
-    uint64_t l = (i >= al ? 0 : a[i]), r = (i >= bl ? 0 : b[i]);
-    retVal += (l > r ? 1 : (l < r ? -1 : 0));
-    if (retVal) {
-      return retVal;
-    }
-  }
-  return retVal;
-}
-static inline void fxmath_decimal_helper_dec_any(uint64_t a[], uint8_t al) {
-  for (int i = 0; i < al; i++) {
-    if (a[i]--) {
-      return;
-    }
-  }
-}
-static inline void fxmath_decimal_helper_inc_any(uint64_t a[], uint8_t al) {
-  for (int i = 0; i < al; i++) {
-    a[i]++;
-    if ((uint32_t)a[i] == a[i]) {
-      return;
-    }
-    a[i] = 0;
-  }
-}
-static inline void fxmath_decimal_helper_raw_mul(uint64_t a[],
-                                                 uint8_t al,
-                                                 uint64_t b[],
-                                                 uint8_t bl,
-                                                 uint64_t c[],
-                                                 uint8_t cl) {
-  assert(al + bl <= cl);
-  {
-    for (int i = 0; i < cl; i++) {
-      c[i] = 0;
-    }
-  }
-  {
-    for (int i = 0; i < al; i++) {
-      for (int j = 0; j < bl; j++) {
-        uint64_t m = (uint64_t)a[i] * b[j];
-        c[i + j] += (uint32_t)m;
-        c[i + j + 1] += FXMATH_DECIMAL_RSHIFT32BIT(m);
-      }
-    }
-  }
-  {
-    for (int i = 0; i < cl - 1; i++) {
-      c[i + 1] += FXMATH_DECIMAL_RSHIFT32BIT(c[i]);
-      c[i] = (uint32_t)c[i];
-    }
-  }
-  {
-    for (int i = 0; i < cl; i++) {
-      c[i] = (uint32_t)c[i];
-    }
-  }
-}
-static inline void fxmath_decimal_helper_raw_div(uint64_t a[],
-                                                 uint8_t al,
-                                                 uint64_t b[],
-                                                 uint8_t bl,
-                                                 uint64_t c[],
-                                                 uint8_t cl) {
-  int i;
-  for (i = 0; i < cl; i++) {
-    c[i] = 0;
-  }
-  uint64_t left[16] = {0}, right[16] = {0};
-  left[0] = 0;
-  for (i = 0; i < al; i++) {
-    right[i] = a[i];
-  }
-  uint64_t tmp[16];
-  while (fxmath_decimal_helper_raw_compare_any(left, al, right, al) <= 0) {
-    uint64_t cur[16];
-    for (i = 0; i < al; i++) {
-      cur[i] = left[i] + right[i];
-    }
-    for (i = al - 1; i >= 0; i--) {
-      if (i) {
-        cur[i - 1] += FXMATH_DECIMAL_LSHIFT32BIT(cur[i] % 2);
-      }
-      cur[i] /= 2;
-    }
-    fxmath_decimal_helper_raw_mul(cur, al, b, bl, tmp, 16);
-    switch (fxmath_decimal_helper_raw_compare_any(tmp, 16, a, al)) {
-      case -1:
-        for (i = 0; i < 16; i++) {
-          left[i] = cur[i];
-        }
-        left[0]++;
-        fxmath_decimal_helper_normalize_any(left, al);
-        break;
-      case 1:
-        for (i = 0; i < 16; i++) {
-          right[i] = cur[i];
-        }
-        fxmath_decimal_helper_dec_any(right, al);
-        break;
-      case 0:
-        for (i = 0; i < std::min(al, cl); i++) {
-          c[i] = cur[i];
-        }
-        return;
-    }
-  }
-  for (i = 0; i < std::min(al, cl); i++) {
-    c[i] = left[i];
-  }
-}
-static inline FX_BOOL fxmath_decimal_helper_outofrange(uint64_t a[],
-                                                       uint8_t al,
-                                                       uint8_t goal) {
-  for (int i = goal; i < al; i++) {
-    if (a[i]) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-static inline void fxmath_decimal_helper_shrinkintorange(uint64_t a[],
-                                                         uint8_t al,
-                                                         uint8_t goal,
-                                                         uint8_t& scale) {
-  FX_BOOL bRoundUp = FALSE;
-  while (scale != 0 && (scale > FXMATH_DECIMAL_SCALELIMIT ||
-                        fxmath_decimal_helper_outofrange(a, al, goal))) {
-    bRoundUp = fxmath_decimal_helper_div10_any(a, al) >= 5;
-    scale--;
-  }
-  if (bRoundUp) {
-    fxmath_decimal_helper_normalize_any(a, goal);
-    fxmath_decimal_helper_inc_any(a, goal);
-  }
-}
-static inline void fxmath_decimal_helper_truncate(uint64_t& phi,
-                                                  uint64_t& pmid,
-                                                  uint64_t& plo,
-                                                  uint8_t& scale,
-                                                  uint8_t minscale = 0) {
-  while (scale > minscale) {
-    uint64_t thi = phi, tmid = pmid, tlo = plo;
-    if (fxmath_decimal_helper_div10(thi, tmid, tlo) != 0) {
-      break;
-    }
-    phi = thi, pmid = tmid, plo = tlo;
-    scale--;
-  }
-}
-CFX_Decimal::CFX_Decimal() {
-  m_uLo = m_uMid = m_uHi = m_uFlags = 0;
-}
-CFX_Decimal::CFX_Decimal(uint64_t val) {
-  m_uLo = (uint32_t)val;
-  m_uMid = (uint32_t)FXMATH_DECIMAL_RSHIFT32BIT(val);
-  m_uHi = 0;
-  m_uFlags = 0;
-}
-CFX_Decimal::CFX_Decimal(uint32_t val) {
-  m_uLo = (uint32_t)val;
-  m_uMid = m_uHi = 0;
-  m_uFlags = 0;
-}
-CFX_Decimal::CFX_Decimal(uint32_t lo,
-                         uint32_t mid,
-                         uint32_t hi,
-                         FX_BOOL neg,
-                         uint8_t scale) {
-  scale = (scale > FXMATH_DECIMAL_SCALELIMIT ? 0 : scale);
-  m_uLo = lo;
-  m_uMid = mid;
-  m_uHi = hi;
-  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(neg && IsNotZero(), scale);
-}
-CFX_Decimal::CFX_Decimal(int32_t val) {
-  if (val >= 0) {
-    *this = CFX_Decimal((uint32_t)val);
-  } else {
-    *this = CFX_Decimal((uint32_t)-val);
-    SetNegate();
-  }
-}
-CFX_Decimal::CFX_Decimal(int64_t val) {
-  if (val >= 0) {
-    *this = CFX_Decimal((uint64_t)val);
-  } else {
-    *this = CFX_Decimal((uint64_t)-val);
-    SetNegate();
-  }
-}
-CFX_Decimal::CFX_Decimal(FX_FLOAT val, uint8_t scale) {
-  FX_FLOAT newval = fabs(val);
-  uint64_t phi, pmid, plo;
-  plo = (uint64_t)newval;
-  pmid = (uint64_t)(newval / 1e32);
-  phi = (uint64_t)(newval / 1e64);
-  newval = FXSYS_fmod(newval, 1.0f);
-  for (uint8_t iter = 0; iter < scale; iter++) {
-    fxmath_decimal_helper_mul10(phi, pmid, plo);
-    newval *= 10;
-    plo += (uint64_t)newval;
-    newval = FXSYS_fmod(newval, 1.0f);
-  }
-  plo += FXSYS_round(newval);
-  fxmath_decimal_helper_normalize(phi, pmid, plo);
-  m_uHi = (uint32_t)phi;
-  m_uMid = (uint32_t)pmid;
-  m_uLo = (uint32_t)plo;
-  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(val < 0 && IsNotZero(), scale);
-}
-CFX_Decimal::CFX_Decimal(const CFX_WideStringC& strObj) {
-  const FX_WCHAR* str = strObj.GetPtr();
-  const FX_WCHAR* strBound = str + strObj.GetLength();
-  FX_BOOL pointmet = 0;
-  FX_BOOL negmet = 0;
-  uint8_t scale = 0;
-  m_uHi = m_uMid = m_uLo = 0;
-  while (str != strBound && *str == ' ') {
-    str++;
-  }
-  if (str != strBound && *str == '-') {
-    negmet = 1;
-    str++;
-  } else if (str != strBound && *str == '+') {
-    str++;
-  }
-  while (str != strBound && ((*str >= '0' && *str <= '9') || *str == '.') &&
-         scale < FXMATH_DECIMAL_SCALELIMIT) {
-    if (*str == '.') {
-      if (pointmet) {
-        goto cont;
-      }
-      pointmet = 1;
-    } else {
-      m_uHi = m_uHi * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((uint64_t)m_uMid * 0xA);
-      m_uMid = m_uMid * 0xA + FXMATH_DECIMAL_RSHIFT32BIT((uint64_t)m_uLo * 0xA);
-      m_uLo = m_uLo * 0xA + (*str - '0');
-      if (pointmet) {
-        scale++;
-      }
-    }
-  cont:
-    str++;
-  }
-  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(negmet && IsNotZero(), scale);
-}
-
-CFX_Decimal::CFX_Decimal(const CFX_ByteStringC& strObj) {
-  *this = CFX_Decimal(CFX_WideString::FromLocal(strObj));
-}
-
-CFX_Decimal::operator CFX_WideString() const {
-  CFX_WideString retString;
-  CFX_WideString tmpbuf;
-  uint64_t phi = m_uHi, pmid = m_uMid, plo = m_uLo;
-  while (phi || pmid || plo) {
-    tmpbuf += fxmath_decimal_helper_div10(phi, pmid, plo) + '0';
-  }
-  uint8_t outputlen = (uint8_t)tmpbuf.GetLength();
-  uint8_t scale = (uint8_t)FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
-  while (scale >= outputlen) {
-    tmpbuf += '0';
-    outputlen++;
-  }
-  if (FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero()) {
-    retString += '-';
-  }
-  for (uint8_t idx = 0; idx < outputlen; idx++) {
-    if (idx == (outputlen - scale) && scale != 0) {
-      retString += '.';
-    }
-    retString += tmpbuf[outputlen - 1 - idx];
-  }
-  return retString;
-}
-CFX_Decimal::operator double() const {
-  double pow = (double)(1 << 16) * (1 << 16);
-  double base =
-      ((double)m_uHi) * pow * pow + ((double)m_uMid) * pow + ((double)m_uLo);
-  int8_t scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
-  FX_BOOL bNeg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags);
-  return (bNeg ? -1 : 1) * base * ::pow(10.0, -scale);
-}
-void CFX_Decimal::SetScale(uint8_t newscale) {
-  uint8_t oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
-  if (newscale > oldscale) {
-    uint64_t phi = m_uHi, pmid = m_uMid, plo = m_uLo;
-    for (uint8_t iter = 0; iter < newscale - oldscale; iter++) {
-      fxmath_decimal_helper_mul10(phi, pmid, plo);
-    }
-    m_uHi = (uint32_t)phi;
-    m_uMid = (uint32_t)pmid;
-    m_uLo = (uint32_t)plo;
-    m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
-        FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale);
-  } else if (newscale < oldscale) {
-    uint64_t phi, pmid, plo;
-    phi = 0, pmid = 0, plo = 5;
-    {
-      for (uint8_t iter = 0; iter < oldscale - newscale - 1; iter++) {
-        fxmath_decimal_helper_mul10(phi, pmid, plo);
-      }
-    }
-    phi += m_uHi;
-    pmid += m_uMid;
-    plo += m_uLo;
-    fxmath_decimal_helper_normalize(phi, pmid, plo);
-    {
-      for (uint8_t iter = 0; iter < oldscale - newscale; iter++) {
-        fxmath_decimal_helper_div10(phi, pmid, plo);
-      }
-    }
-    m_uHi = (uint32_t)phi;
-    m_uMid = (uint32_t)pmid;
-    m_uLo = (uint32_t)plo;
-    m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
-        FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), newscale);
-  }
-}
-uint8_t CFX_Decimal::GetScale() {
-  uint8_t oldscale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
-  return oldscale;
-}
-void CFX_Decimal::SetAbs() {
-  m_uFlags &= ~FXMATH_DECIMAL_NEGMASK;
-}
-void CFX_Decimal::SetNegate() {
-  if (IsNotZero()) {
-    m_uFlags ^= FXMATH_DECIMAL_NEGMASK;
-  }
-}
-void CFX_Decimal::FloorOrCeil(FX_BOOL bFloor) {
-  uint64_t nums[3] = {m_uLo, m_uMid, m_uHi};
-  FX_BOOL bDataLoss = FALSE;
-  for (int i = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags); i > 0; i--) {
-    bDataLoss = fxmath_decimal_helper_div10_any(nums, 3) || bDataLoss;
-  }
-  if (bDataLoss && (bFloor ? FXMATH_DECIMAL_FLAGS2NEG(m_uFlags)
-                           : !FXMATH_DECIMAL_FLAGS2NEG(m_uFlags))) {
-    fxmath_decimal_helper_inc_any(nums, 3);
-  }
-  m_uHi = (uint32_t)nums[2];
-  m_uMid = (uint32_t)nums[1];
-  m_uLo = (uint32_t)nums[0];
-  m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
-      FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) && IsNotZero(), 0);
-}
-void CFX_Decimal::SetFloor() {
-  FloorOrCeil(TRUE);
-}
-void CFX_Decimal::SetCeiling() {
-  FloorOrCeil(FALSE);
-}
-void CFX_Decimal::SetTruncate() {
-  FloorOrCeil(!FXMATH_DECIMAL_FLAGS2NEG(m_uFlags));
-}
-void CFX_Decimal::Swap(CFX_Decimal& val) {
-  uint32_t tmp;
-  tmp = m_uHi;
-  m_uHi = val.m_uHi;
-  val.m_uHi = tmp;
-  tmp = m_uMid;
-  m_uMid = val.m_uMid;
-  val.m_uMid = tmp;
-  tmp = m_uLo;
-  m_uLo = val.m_uLo;
-  val.m_uLo = tmp;
-  tmp = m_uFlags;
-  m_uFlags = val.m_uFlags;
-  val.m_uFlags = tmp;
-}
-int8_t CFX_Decimal::Compare(const CFX_Decimal& val) const {
-  CFX_Decimal lhs = *this, rhs = val;
-  int8_t retVal = 0;
-  if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) !=
-      FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) {
-    uint8_t scale = std::min(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags),
-                             FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags));
-    lhs.SetScale(scale);
-    rhs.SetScale(scale);
-  }
-  retVal = -(FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) -
-             FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags));
-  if (retVal) {
-    return retVal;
-  }
-  retVal = fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo,
-                                             rhs.m_uHi, rhs.m_uMid, rhs.m_uLo);
-  return (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) ? -retVal : retVal);
-}
-CFX_Decimal CFX_Decimal::AddOrMinus(const CFX_Decimal& val,
-                                    FX_BOOL isAdding) const {
-  CFX_Decimal lhs = *this, rhs = val;
-  if (FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) !=
-      FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags)) {
-    uint8_t scale = std::max(FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags),
-                             FXMATH_DECIMAL_FLAGS2SCALE(rhs.m_uFlags));
-    lhs.SetScale(scale);
-    rhs.SetScale(scale);
-  }
-  if (!isAdding) {
-    rhs.SetNegate();
-  }
-  if (FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags) ==
-      FXMATH_DECIMAL_FLAGS2NEG(rhs.m_uFlags)) {
-    uint64_t phi = lhs.m_uHi, pmid = lhs.m_uMid, plo = lhs.m_uLo;
-    phi += rhs.m_uHi;
-    pmid += rhs.m_uMid;
-    plo += rhs.m_uLo;
-    fxmath_decimal_helper_normalize(phi, pmid, plo);
-    if (FXMATH_DECIMAL_RSHIFT32BIT(phi) &&
-        FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) != 0) {
-      fxmath_decimal_helper_div10(phi, pmid, plo);
-      lhs.m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(
-          FXMATH_DECIMAL_FLAGS2NEG(lhs.m_uFlags),
-          FXMATH_DECIMAL_FLAGS2SCALE(lhs.m_uFlags) - 1);
-    }
-    lhs.m_uHi = (uint32_t)phi;
-    lhs.m_uMid = (uint32_t)pmid;
-    lhs.m_uLo = (uint32_t)plo;
-    return lhs;
-  } else {
-    if (fxmath_decimal_helper_raw_compare(lhs.m_uHi, lhs.m_uMid, lhs.m_uLo,
-                                          rhs.m_uHi, rhs.m_uMid,
-                                          rhs.m_uLo) < 0) {
-      lhs.Swap(rhs);
-    }
-    lhs.m_uHi -= rhs.m_uHi;
-    if (lhs.m_uMid < rhs.m_uMid) {
-      lhs.m_uHi--;
-    }
-    lhs.m_uMid -= rhs.m_uMid;
-    if (lhs.m_uLo < rhs.m_uLo) {
-      if (!lhs.m_uMid) {
-        lhs.m_uHi--;
-      }
-      lhs.m_uMid--;
-    }
-    lhs.m_uLo -= rhs.m_uLo;
-    return lhs;
-  }
-}
-CFX_Decimal CFX_Decimal::Multiply(const CFX_Decimal& val) const {
-  uint64_t a[3] = {m_uLo, m_uMid, m_uHi},
-           b[3] = {val.m_uLo, val.m_uMid, val.m_uHi};
-  uint64_t c[6];
-  fxmath_decimal_helper_raw_mul(a, 3, b, 3, c, 6);
-  FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^
-                FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags);
-  uint8_t scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) +
-                  FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags);
-  fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale);
-  return CFX_Decimal((uint32_t)c[0], (uint32_t)c[1], (uint32_t)c[2], neg,
-                     scale);
-}
-CFX_Decimal CFX_Decimal::Divide(const CFX_Decimal& val) const {
-  if (!val.IsNotZero()) {
-    return CFX_Decimal();
-  }
-  FX_BOOL neg = FXMATH_DECIMAL_FLAGS2NEG(m_uFlags) ^
-                FXMATH_DECIMAL_FLAGS2NEG(val.m_uFlags);
-  uint64_t a[7] = {m_uLo, m_uMid, m_uHi},
-           b[3] = {val.m_uLo, val.m_uMid, val.m_uHi}, c[7] = {0};
-  uint8_t scale = 0;
-  if (FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) <
-      FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags)) {
-    for (int i = FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags) -
-                 FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags);
-         i > 0; i--) {
-      fxmath_decimal_helper_mul10_any(a, 7);
-    }
-  } else {
-    scale = FXMATH_DECIMAL_FLAGS2SCALE(m_uFlags) -
-            FXMATH_DECIMAL_FLAGS2SCALE(val.m_uFlags);
-  }
-  uint8_t minscale = scale;
-  if (!IsNotZero()) {
-    return CFX_Decimal(0, 0, 0, 0, minscale);
-  }
-  while (!a[6]) {
-    fxmath_decimal_helper_mul10_any(a, 7);
-    scale++;
-  }
-  fxmath_decimal_helper_div10_any(a, 7);
-  scale--;
-  fxmath_decimal_helper_raw_div(a, 6, b, 3, c, 7);
-  fxmath_decimal_helper_shrinkintorange(c, 6, 3, scale);
-  fxmath_decimal_helper_truncate(c[2], c[1], c[0], scale, minscale);
-  return CFX_Decimal((uint32_t)c[0], (uint32_t)c[1], (uint32_t)c[2], neg,
-                     scale);
-}
-CFX_Decimal CFX_Decimal::Modulus(const CFX_Decimal& val) const {
-  CFX_Decimal lhs = *this, rhs_abs = val;
-  rhs_abs.SetAbs();
-  if (!rhs_abs.IsNotZero()) {
-    return *this;
-  }
-  while (TRUE) {
-    CFX_Decimal lhs_abs = lhs;
-    lhs_abs.SetAbs();
-    if (lhs_abs < rhs_abs) {
-      break;
-    }
-    CFX_Decimal quot = lhs / rhs_abs;
-    quot.SetTruncate();
-    lhs = lhs - quot * rhs_abs;
-  }
-  return lhs;
-}
-bool CFX_Decimal::operator==(const CFX_Decimal& val) const {
-  return Compare(val) == 0;
-}
-bool CFX_Decimal::operator<=(const CFX_Decimal& val) const {
-  return Compare(val) <= 0;
-}
-bool CFX_Decimal::operator>=(const CFX_Decimal& val) const {
-  return Compare(val) >= 0;
-}
-bool CFX_Decimal::operator!=(const CFX_Decimal& val) const {
-  return Compare(val) != 0;
-}
-bool CFX_Decimal::operator<(const CFX_Decimal& val) const {
-  return Compare(val) < 0;
-}
-bool CFX_Decimal::operator>(const CFX_Decimal& val) const {
-  return Compare(val) > 0;
-}
-CFX_Decimal CFX_Decimal::operator+(const CFX_Decimal& val) const {
-  return AddOrMinus(val, TRUE);
-}
-CFX_Decimal CFX_Decimal::operator-(const CFX_Decimal& val) const {
-  return AddOrMinus(val, FALSE);
-}
-CFX_Decimal CFX_Decimal::operator*(const CFX_Decimal& val) const {
-  return Multiply(val);
-}
-CFX_Decimal CFX_Decimal::operator/(const CFX_Decimal& val) const {
-  return Divide(val);
-}
-CFX_Decimal CFX_Decimal::operator%(const CFX_Decimal& val) const {
-  return Modulus(val);
-}
diff --git a/xfa/src/fgas/localization/fgas_locale.h b/xfa/src/fgas/localization/fgas_locale.h
deleted file mode 100644
index 03dd518..0000000
--- a/xfa/src/fgas/localization/fgas_locale.h
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALE_H_
-#define XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALE_H_
-
-#include "core/include/fxcrt/fx_xml.h"
-#include "xfa/src/fgas/localization/fgas_datetime.h"
-
-class CFX_Unitime;
-
-enum FX_LOCALENUMSYMBOL {
-  FX_LOCALENUMSYMBOL_Decimal,
-  FX_LOCALENUMSYMBOL_Grouping,
-  FX_LOCALENUMSYMBOL_Percent,
-  FX_LOCALENUMSYMBOL_Minus,
-  FX_LOCALENUMSYMBOL_Zero,
-  FX_LOCALENUMSYMBOL_CurrencySymbol,
-  FX_LOCALENUMSYMBOL_CurrencyName,
-};
-enum FX_LOCALEDATETIMESUBCATEGORY {
-  FX_LOCALEDATETIMESUBCATEGORY_Default,
-  FX_LOCALEDATETIMESUBCATEGORY_Short,
-  FX_LOCALEDATETIMESUBCATEGORY_Medium,
-  FX_LOCALEDATETIMESUBCATEGORY_Full,
-  FX_LOCALEDATETIMESUBCATEGORY_Long,
-};
-enum FX_LOCALENUMSUBCATEGORY {
-  FX_LOCALENUMPATTERN_Percent,
-  FX_LOCALENUMPATTERN_Currency,
-  FX_LOCALENUMPATTERN_Decimal,
-  FX_LOCALENUMPATTERN_Integer,
-};
-enum FX_LOCALECATEGORY {
-  FX_LOCALECATEGORY_Unknown,
-  FX_LOCALECATEGORY_Date,
-  FX_LOCALECATEGORY_Time,
-  FX_LOCALECATEGORY_DateTime,
-  FX_LOCALECATEGORY_Num,
-  FX_LOCALECATEGORY_Text,
-  FX_LOCALECATEGORY_Zero,
-  FX_LOCALECATEGORY_Null,
-};
-enum FX_DATETIMETYPE {
-  FX_DATETIMETYPE_Unknown,
-  FX_DATETIMETYPE_Date,
-  FX_DATETIMETYPE_Time,
-  FX_DATETIMETYPE_DateTime,
-  FX_DATETIMETYPE_TimeDate,
-};
-
-class IFX_Locale {
- public:
-  static IFX_Locale* Create(CXML_Element* pLocaleData);
-
-  virtual ~IFX_Locale() {}
-  virtual void Release() = 0;
-
-  virtual CFX_WideString GetName() = 0;
-
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const = 0;
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const = 0;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const = 0;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const = 0;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const = 0;
-  virtual void GetEraName(CFX_WideString& wsEraName,
-                          FX_BOOL bAD = TRUE) const = 0;
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const = 0;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const = 0;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const = 0;
-};
-
-class IFX_LocaleMgr {
- public:
-  virtual ~IFX_LocaleMgr() {}
-  virtual void Release() = 0;
-  virtual FX_WORD GetDefLocaleID() = 0;
-  virtual IFX_Locale* GetDefLocale() = 0;
-  virtual IFX_Locale* GetLocale(FX_WORD lcid) = 0;
-  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName) = 0;
-};
-IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath,
-                                   FX_WORD wDefaultLCID);
-void FX_ParseNumString(const CFX_WideString& wsNum, CFX_WideString& wsResult);
-FX_BOOL FX_DateFromCanonical(const CFX_WideString& wsDate,
-                             CFX_Unitime& datetime);
-FX_BOOL FX_TimeFromCanonical(const CFX_WideStringC& wsTime,
-                             CFX_Unitime& datetime,
-                             IFX_Locale* pLocale);
-class IFX_FormatString {
- public:
-  static IFX_FormatString* Create(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID);
-
-  virtual ~IFX_FormatString() {}
-  virtual void Release() = 0;
-  virtual void SplitFormatString(const CFX_WideString& wsFormatString,
-                                 CFX_WideStringArray& wsPatterns) = 0;
-  virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern) = 0;
-  virtual FX_WORD GetLCID(const CFX_WideString& wsPattern) = 0;
-  virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern) = 0;
-  virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsValue) = 0;
-  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
-                           const CFX_WideString& wsPattern,
-                           FX_FLOAT& fValue) = 0;
-  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
-                           const CFX_WideString& wsPattern,
-                           CFX_WideString& wsValue) = 0;
-  virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime,
-                                const CFX_WideString& wsPattern,
-                                FX_DATETIMETYPE eDateTimeType,
-                                CFX_Unitime& dtValue) = 0;
-  virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern) = 0;
-  virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern) = 0;
-  virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText,
-                             const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatNum(FX_FLOAT fNum,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput,
-                                 FX_DATETIMETYPE eDateTimeType) = 0;
-  virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput) = 0;
-  virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput) = 0;
-};
-class CFX_Decimal {
- public:
-  CFX_Decimal();
-  CFX_Decimal(uint32_t val);
-  CFX_Decimal(uint64_t val);
-  CFX_Decimal(int32_t val);
-  CFX_Decimal(int64_t val);
-  CFX_Decimal(FX_FLOAT val, uint8_t scale = 3);
-  CFX_Decimal(const CFX_WideStringC& str);
-  CFX_Decimal(const CFX_ByteStringC& str);
-  operator CFX_WideString() const;
-  operator double() const;
-  bool operator==(const CFX_Decimal& val) const;
-  bool operator<=(const CFX_Decimal& val) const;
-  bool operator>=(const CFX_Decimal& val) const;
-  bool operator!=(const CFX_Decimal& val) const;
-  bool operator<(const CFX_Decimal& val) const;
-  bool operator>(const CFX_Decimal& val) const;
-  CFX_Decimal operator+(const CFX_Decimal& val) const;
-  CFX_Decimal operator-(const CFX_Decimal& val) const;
-  CFX_Decimal operator*(const CFX_Decimal& val) const;
-  CFX_Decimal operator/(const CFX_Decimal& val) const;
-  CFX_Decimal operator%(const CFX_Decimal& val) const;
-  void SetScale(uint8_t newScale);
-  uint8_t GetScale();
-  void SetAbs();
-  void SetNegate();
-  void SetFloor();
-  void SetCeiling();
-  void SetTruncate();
-
- protected:
-  CFX_Decimal(uint32_t hi,
-              uint32_t mid,
-              uint32_t lo,
-              FX_BOOL neg,
-              uint8_t scale);
-  inline FX_BOOL IsNotZero() const { return m_uHi || m_uMid || m_uLo; }
-  inline int8_t Compare(const CFX_Decimal& val) const;
-  inline void Swap(CFX_Decimal& val);
-  inline void FloorOrCeil(FX_BOOL bFloor);
-  CFX_Decimal AddOrMinus(const CFX_Decimal& val, FX_BOOL isAdding) const;
-  CFX_Decimal Multiply(const CFX_Decimal& val) const;
-  CFX_Decimal Divide(const CFX_Decimal& val) const;
-  CFX_Decimal Modulus(const CFX_Decimal& val) const;
-  uint32_t m_uFlags;
-  uint32_t m_uHi;
-  uint32_t m_uLo;
-  uint32_t m_uMid;
-};
-
-#endif  // XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALE_H_
diff --git a/xfa/src/fgas/localization/fgas_localeimp.h b/xfa/src/fgas/localization/fgas_localeimp.h
deleted file mode 100644
index 5da8b51..0000000
--- a/xfa/src/fgas/localization/fgas_localeimp.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
-#define XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
-
-#include "xfa/src/fgas/localization/fgas_locale.h"
-
-class CFX_LCNumeric;
-
-class CFX_Locale : public IFX_Locale {
- public:
-  CFX_Locale(CXML_Element* pLocaleData);
-  virtual void Release() { delete this; }
-
-  virtual CFX_WideString GetName();
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const;
-
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
-  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
-
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const;
-
- protected:
-  virtual ~CFX_Locale();
-  CXML_Element* m_pElement;
-};
-
-class CFX_FormatString : public IFX_FormatString {
- public:
-  CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, FX_BOOL bUseLCID);
-  virtual void Release() { delete this; }
-
-  virtual void SplitFormatString(const CFX_WideString& wsFormatString,
-                                 CFX_WideStringArray& wsPatterns);
-  virtual FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern);
-  virtual FX_WORD GetLCID(const CFX_WideString& wsPattern);
-  virtual CFX_WideString GetLocaleName(const CFX_WideString& wsPattern);
-  virtual FX_BOOL ParseText(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsValue);
-  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
-                           const CFX_WideString& wsPattern,
-                           FX_FLOAT& fValue);
-  virtual FX_BOOL ParseNum(const CFX_WideString& wsSrcNum,
-                           const CFX_WideString& wsPattern,
-                           CFX_WideString& wsValue);
-  virtual FX_BOOL ParseDateTime(const CFX_WideString& wsSrcDateTime,
-                                const CFX_WideString& wsPattern,
-                                FX_DATETIMETYPE eDateTimeType,
-                                CFX_Unitime& dtValue);
-  virtual FX_BOOL ParseZero(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern);
-  virtual FX_BOOL ParseNull(const CFX_WideString& wsSrcText,
-                            const CFX_WideString& wsPattern);
-  virtual FX_BOOL FormatText(const CFX_WideString& wsSrcText,
-                             const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatNum(const CFX_WideString& wsSrcNum,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatNum(FX_FLOAT fNum,
-                            const CFX_WideString& wsPattern,
-                            CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatDateTime(const CFX_WideString& wsSrcDateTime,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput,
-                                 FX_DATETIMETYPE eDateTimeType);
-  virtual FX_BOOL FormatDateTime(const CFX_Unitime& dt,
-                                 const CFX_WideString& wsPattern,
-                                 CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatZero(const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput);
-  virtual FX_BOOL FormatNull(const CFX_WideString& wsPattern,
-                             CFX_WideString& wsOutput);
-
- protected:
-  virtual ~CFX_FormatString();
-  IFX_Locale* GetTextFormat(const CFX_WideString& wsPattern,
-                            const CFX_WideStringC& wsCategory,
-                            CFX_WideString& wsPurgePattern);
-  IFX_Locale* GetNumericFormat(const CFX_WideString& wsPattern,
-                               int32_t& iDotIndex,
-                               FX_DWORD& dwStyle,
-                               CFX_WideString& wsPurgePattern);
-  FX_BOOL FormatStrNum(const CFX_WideStringC& wsInputNum,
-                       const CFX_WideString& wsPattern,
-                       CFX_WideString& wsOutput);
-  FX_BOOL FormatLCNumeric(CFX_LCNumeric& lcNum,
-                          const CFX_WideString& wsPattern,
-                          CFX_WideString& wsOutput);
-  FX_DATETIMETYPE GetDateTimeFormat(const CFX_WideString& wsPattern,
-                                    IFX_Locale*& pLocale,
-                                    CFX_WideString& wsDatePattern,
-                                    CFX_WideString& wsTimePattern);
-  IFX_Locale* GetPatternLocale(const CFX_WideStringC& wsLocale);
-  IFX_LocaleMgr* m_pLocaleMgr;
-  FX_BOOL m_bUseLCID;
-};
-
-#endif  // XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEIMP_H_
diff --git a/xfa/src/fgas/localization/fgas_localemgr.cpp b/xfa/src/fgas/localization/fgas_localemgr.cpp
deleted file mode 100644
index 81dbfd3..0000000
--- a/xfa/src/fgas/localization/fgas_localemgr.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/localization/fgas_localemgr.h"
-
-#include "core/include/fxcrt/fx_xml.h"
-
-IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath,
-                                   FX_WORD wDefaultLCID) {
-  void* pPathHandle = FX_OpenFolder(pszLocalPath);
-  if (!pPathHandle) {
-    return NULL;
-  }
-  CFX_LocaleMgr* pLocaleMgr = new CFX_LocaleMgr(wDefaultLCID);
-  CFX_WideString wsFileName;
-  FX_BOOL bFolder = FALSE;
-  while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) {
-    if (!bFolder) {
-      if (wsFileName.GetLength() < 4) {
-        continue;
-      }
-      CFX_WideString wsExt = wsFileName.Right(4);
-      wsExt.MakeLower();
-      if (wsExt != L".xml") {
-        continue;
-      }
-      CFX_WideString wsFullPath(pszLocalPath);
-      wsFullPath += L"\\" + wsFileName;
-      IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath);
-      if (!pRead) {
-        continue;
-      }
-      CXML_Element* pXmlLocale = CXML_Element::Parse(pRead);
-      pRead->Release();
-      CFX_ByteString bssp = pXmlLocale->GetNamespace();
-      if (bssp == "http://www.foxitsoftware.com/localization") {
-        CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid");
-        wchar_t* pEnd = NULL;
-        FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16);
-        if (pLocaleMgr->m_lcid2xml.GetValueAt((void*)(uintptr_t)dwLCID)) {
-          delete pXmlLocale;
-        } else {
-          pLocaleMgr->m_lcid2xml.SetAt((void*)(uintptr_t)dwLCID, pXmlLocale);
-        }
-      } else {
-        delete pXmlLocale;
-      }
-    }
-  }
-  FX_CloseFolder(pPathHandle);
-  return pLocaleMgr;
-}
-CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID) : m_wDefLCID(wDefLCID) {}
-CFX_LocaleMgr::~CFX_LocaleMgr() {
-  FX_POSITION ps = m_lcid2locale.GetStartPosition();
-  while (ps) {
-    void* plcid;
-    IFX_Locale* pLocale = NULL;
-    m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale);
-    pLocale->Release();
-  }
-  m_lcid2locale.RemoveAll();
-  ps = m_lcid2xml.GetStartPosition();
-  while (ps) {
-    void* plcid;
-    CXML_Element* pxml = NULL;
-    m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml);
-    delete pxml;
-  }
-  m_lcid2xml.RemoveAll();
-}
-FX_WORD CFX_LocaleMgr::GetDefLocaleID() {
-  return m_wDefLCID;
-}
-IFX_Locale* CFX_LocaleMgr::GetDefLocale() {
-  return GetLocale(m_wDefLCID);
-}
-IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid) {
-  IFX_Locale* pLocale =
-      (IFX_Locale*)m_lcid2locale.GetValueAt((void*)(uintptr_t)lcid);
-  if (!pLocale) {
-    CXML_Element* pxml =
-        (CXML_Element*)m_lcid2xml.GetValueAt((void*)(uintptr_t)lcid);
-    if (pxml) {
-      pLocale = IFX_Locale::Create(pxml);
-      m_lcid2locale.SetAt((void*)(uintptr_t)lcid, pLocale);
-    }
-  }
-  return pLocale;
-}
-IFX_Locale* CFX_LocaleMgr::GetLocaleByName(
-    const CFX_WideStringC& wsLocaleName) {
-  return NULL;
-}
diff --git a/xfa/src/fgas/localization/fgas_localemgr.h b/xfa/src/fgas/localization/fgas_localemgr.h
deleted file mode 100644
index f2693c7..0000000
--- a/xfa/src/fgas/localization/fgas_localemgr.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
-#define XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
-
-#include "xfa/src/fgas/localization/fgas_locale.h"
-
-class CFX_LocaleMgr : public IFX_LocaleMgr {
- public:
-  CFX_LocaleMgr(FX_WORD wDefLCID);
-  virtual void Release() { delete this; }
-  virtual FX_WORD GetDefLocaleID();
-  virtual IFX_Locale* GetDefLocale();
-  virtual IFX_Locale* GetLocale(FX_WORD lcid);
-  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName);
-  CFX_MapPtrToPtr m_lcid2xml;
-
- protected:
-  ~CFX_LocaleMgr();
-  CFX_MapPtrToPtr m_lcid2locale;
-  FX_WORD m_wDefLCID;
-};
-
-#endif  // XFA_SRC_FGAS_LOCALIZATION_FGAS_LOCALEMGR_H_
diff --git a/xfa/src/fgas/xml/fgas_sax.h b/xfa/src/fgas/xml/fgas_sax.h
deleted file mode 100644
index 50762d4..0000000
--- a/xfa/src/fgas/xml/fgas_sax.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_XML_FGAS_SAX_H_
-#define XFA_SRC_FGAS_XML_FGAS_SAX_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-#define FX_SAXPARSEMODE_NotConvert_amp 0x0001
-#define FX_SAXPARSEMODE_NotConvert_lt 0x0002
-#define FX_SAXPARSEMODE_NotConvert_gt 0x0004
-#define FX_SAXPARSEMODE_NotConvert_apos 0x0008
-#define FX_SAXPARSEMODE_NotConvert_quot 0x0010
-#define FX_SAXPARSEMODE_NotConvert_sharp 0x0020
-#define FX_SAXPARSEMODE_NotSkipSpace 0x0100
-
-enum FX_SAXNODE {
-  FX_SAXNODE_Unknown = 0,
-  FX_SAXNODE_Instruction,
-  FX_SAXNODE_Declaration,
-  FX_SAXNODE_Comment,
-  FX_SAXNODE_Tag,
-  FX_SAXNODE_Text,
-  FX_SAXNODE_CharData,
-};
-
-class IFX_SAXReaderHandler {
- public:
-  virtual ~IFX_SAXReaderHandler() {}
-  virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName,
-                           FX_SAXNODE eType,
-                           FX_DWORD dwStartPos) = 0;
-  virtual void OnTagAttribute(void* pTag,
-                              const CFX_ByteStringC& bsAttri,
-                              const CFX_ByteStringC& bsValue) = 0;
-  virtual void OnTagBreak(void* pTag) = 0;
-  virtual void OnTagData(void* pTag,
-                         FX_SAXNODE eType,
-                         const CFX_ByteStringC& bsData,
-                         FX_DWORD dwStartPos) = 0;
-  virtual void OnTagClose(void* pTag, FX_DWORD dwEndPos) = 0;
-  virtual void OnTagEnd(void* pTag,
-                        const CFX_ByteStringC& bsTagName,
-                        FX_DWORD dwEndPos) = 0;
-  virtual void OnTargetData(void* pTag,
-                            FX_SAXNODE eType,
-                            const CFX_ByteStringC& bsData,
-                            FX_DWORD dwStartPos) = 0;
-};
-
-class IFX_SAXReader {
- public:
-  virtual ~IFX_SAXReader() {}
-  virtual void Release() = 0;
-  virtual int32_t StartParse(IFX_FileRead* pFile,
-                             FX_DWORD dwStart = 0,
-                             FX_DWORD dwLen = -1,
-                             FX_DWORD dwParseMode = 0) = 0;
-  virtual int32_t ContinueParse(IFX_Pause* pPause = NULL) = 0;
-  virtual void SkipCurrentNode() = 0;
-  virtual void SetHandler(IFX_SAXReaderHandler* pHandler) = 0;
-};
-IFX_SAXReader* FX_SAXReader_Create();
-
-#endif  // XFA_SRC_FGAS_XML_FGAS_SAX_H_
diff --git a/xfa/src/fgas/xml/fgas_sax_imp.cpp b/xfa/src/fgas/xml/fgas_sax_imp.cpp
deleted file mode 100644
index f30a357..0000000
--- a/xfa/src/fgas/xml/fgas_sax_imp.cpp
+++ /dev/null
@@ -1,688 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fgas/xml/fgas_sax_imp.h"
-
-#include <algorithm>
-
-namespace {
-
-const FX_DWORD kSaxFileBufSize = 32768;
-
-}  // namespace
-
-IFX_SAXReader* FX_SAXReader_Create() {
-  return new CFX_SAXReader;
-}
-CFX_SAXFile::CFX_SAXFile()
-    : m_pFile(NULL),
-      m_dwStart(0),
-      m_dwEnd(0),
-      m_dwCur(0),
-      m_pBuf(NULL),
-      m_dwBufSize(0),
-      m_dwBufIndex(0) {}
-FX_BOOL CFX_SAXFile::StartFile(IFX_FileRead* pFile,
-                               FX_DWORD dwStart,
-                               FX_DWORD dwLen) {
-  FXSYS_assert(m_pFile == NULL && pFile != NULL);
-  FX_DWORD dwSize = pFile->GetSize();
-  if (dwStart >= dwSize) {
-    return FALSE;
-  }
-  if (dwLen == -1 || dwStart + dwLen > dwSize) {
-    dwLen = dwSize - dwStart;
-  }
-  if (dwLen == 0) {
-    return FALSE;
-  }
-  m_dwBufSize = std::min(dwLen, kSaxFileBufSize);
-  m_pBuf = FX_Alloc(uint8_t, m_dwBufSize);
-  if (!pFile->ReadBlock(m_pBuf, dwStart, m_dwBufSize)) {
-    return FALSE;
-  }
-  m_dwStart = dwStart;
-  m_dwEnd = dwStart + dwLen;
-  m_dwCur = dwStart;
-  m_pFile = pFile;
-  m_dwBufIndex = 0;
-  return TRUE;
-}
-FX_BOOL CFX_SAXFile::ReadNextBlock() {
-  FXSYS_assert(m_pFile != NULL);
-  FX_DWORD dwSize = m_dwEnd - m_dwCur;
-  if (dwSize == 0) {
-    return FALSE;
-  }
-  m_dwBufSize = std::min(dwSize, kSaxFileBufSize);
-  if (!m_pFile->ReadBlock(m_pBuf, m_dwCur, m_dwBufSize)) {
-    return FALSE;
-  }
-  m_dwBufIndex = 0;
-  return TRUE;
-}
-void CFX_SAXFile::Reset() {
-  if (m_pBuf) {
-    FX_Free(m_pBuf);
-    m_pBuf = NULL;
-  }
-  m_pFile = NULL;
-}
-CFX_SAXReader::CFX_SAXReader()
-    : m_File(),
-      m_pHandler(nullptr),
-      m_iState(-1),
-      m_pRoot(nullptr),
-      m_pCurItem(nullptr),
-      m_dwItemID(0),
-      m_iDataSize(256),
-      m_iNameSize(256),
-      m_dwParseMode(0),
-      m_pCommentContext(nullptr) {
-  m_pszData = FX_Alloc(uint8_t, m_iDataSize);
-  m_pszName = FX_Alloc(uint8_t, m_iNameSize);
-}
-CFX_SAXReader::~CFX_SAXReader() {
-  Reset();
-  if (m_pszData) {
-    FX_Free(m_pszData);
-    m_pszData = NULL;
-  }
-  if (m_pszName) {
-    FX_Free(m_pszName);
-    m_pszName = NULL;
-  }
-}
-void CFX_SAXReader::Reset() {
-  m_File.Reset();
-  CFX_SAXItem* pItem = m_pRoot;
-  while (pItem) {
-    CFX_SAXItem* pNext = pItem->m_pNext;
-    delete pItem;
-    pItem = pNext;
-  }
-  m_pRoot = NULL;
-  m_pCurItem = NULL;
-  m_dwItemID = 0;
-  m_SkipStack.RemoveAll();
-  m_SkipChar = 0;
-  m_iDataLength = 0;
-  m_iEntityStart = -1;
-  m_iNameLength = 0;
-  m_iDataPos = 0;
-  if (m_pCommentContext) {
-    delete m_pCommentContext;
-    m_pCommentContext = NULL;
-  }
-}
-inline void CFX_SAXReader::Push() {
-  CFX_SAXItem* pNew = new CFX_SAXItem;
-  pNew->m_dwID = ++m_dwItemID;
-  pNew->m_bSkip = m_pCurItem->m_bSkip;
-  pNew->m_pPrev = m_pCurItem;
-  m_pCurItem->m_pNext = pNew;
-  m_pCurItem = pNew;
-}
-inline void CFX_SAXReader::Pop() {
-  if (!m_pCurItem) {
-    return;
-  }
-  CFX_SAXItem* pPrev = m_pCurItem->m_pPrev;
-  pPrev->m_pNext = NULL;
-  delete m_pCurItem;
-  m_pCurItem = pPrev;
-}
-inline void CFX_SAXReader::AppendData(uint8_t ch) {
-  ReallocDataBuffer();
-  m_pszData[m_iDataPos++] = ch;
-}
-inline void CFX_SAXReader::AppendName(uint8_t ch) {
-  ReallocNameBuffer();
-  m_pszName[m_iDataPos++] = ch;
-}
-void CFX_SAXReader::ReallocDataBuffer() {
-  if (m_iDataPos < m_iDataSize) {
-    return;
-  }
-  if (m_iDataSize <= 1024 * 1024) {
-    m_iDataSize *= 2;
-  } else {
-    m_iDataSize += 1024 * 1024;
-  }
-  m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize);
-}
-void CFX_SAXReader::ReallocNameBuffer() {
-  if (m_iDataPos < m_iNameSize) {
-    return;
-  }
-  if (m_iNameSize <= 1024 * 1024) {
-    m_iNameSize *= 2;
-  } else {
-    m_iNameSize += 1024 * 1024;
-  }
-  m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize);
-}
-inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) {
-  return (m_dwParseMode & FX_SAXPARSEMODE_NotSkipSpace) == 0 && ch < 0x21;
-}
-int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile,
-                                  FX_DWORD dwStart,
-                                  FX_DWORD dwLen,
-                                  FX_DWORD dwParseMode) {
-  m_iState = -1;
-  Reset();
-  if (!m_File.StartFile(pFile, dwStart, dwLen)) {
-    return -1;
-  }
-  m_iState = 0;
-  m_eMode = FX_SAXMODE_Text;
-  m_ePrevMode = FX_SAXMODE_Text;
-  m_bCharData = FALSE;
-  m_dwDataOffset = 0;
-  m_pRoot = m_pCurItem = new CFX_SAXItem;
-  m_pCurItem->m_dwID = ++m_dwItemID;
-  m_dwParseMode = dwParseMode;
-  return 0;
-}
-typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)();
-static const FX_SAXReader_LPFParse g_FX_SAXReader_LPFParse[FX_SAXMODE_MAX] = {
-    &CFX_SAXReader::ParseText,
-    &CFX_SAXReader::ParseNodeStart,
-    &CFX_SAXReader::ParseDeclOrComment,
-    &CFX_SAXReader::ParseDeclNode,
-    &CFX_SAXReader::ParseComment,
-    &CFX_SAXReader::ParseCommentContent,
-    &CFX_SAXReader::ParseTagName,
-    &CFX_SAXReader::ParseTagAttributeName,
-    &CFX_SAXReader::ParseTagAttributeEqual,
-    &CFX_SAXReader::ParseTagAttributeValue,
-    &CFX_SAXReader::ParseMaybeClose,
-    &CFX_SAXReader::ParseTagClose,
-    &CFX_SAXReader::ParseTagEnd,
-    &CFX_SAXReader::ParseTargetData,
-};
-int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) {
-  if (m_iState < 0 || m_iState > 99) {
-    return m_iState;
-  }
-  while (m_File.m_dwCur < m_File.m_dwEnd) {
-    FX_DWORD& index = m_File.m_dwBufIndex;
-    FX_DWORD size = m_File.m_dwBufSize;
-    const uint8_t* pBuf = m_File.m_pBuf;
-    while (index < size) {
-      m_CurByte = pBuf[index];
-      (this->*g_FX_SAXReader_LPFParse[m_eMode])();
-      index++;
-    }
-    m_File.m_dwCur += index;
-    m_iState = (m_File.m_dwCur - m_File.m_dwStart) * 100 /
-               (m_File.m_dwEnd - m_File.m_dwStart);
-    if (m_File.m_dwCur >= m_File.m_dwEnd) {
-      break;
-    }
-    if (!m_File.ReadNextBlock()) {
-      m_iState = -2;
-      break;
-    }
-    m_dwDataOffset = 0;
-    if (pPause && pPause->NeedToPauseNow()) {
-      break;
-    }
-  }
-  return m_iState;
-}
-void CFX_SAXReader::ParseChar(uint8_t ch) {
-  ReallocDataBuffer();
-  m_pszData[m_iDataPos] = ch;
-  if (m_iEntityStart > -1 && ch == ';') {
-    int32_t iSaveEntityStart = m_iEntityStart;
-    CFX_ByteString csEntity(m_pszData + m_iEntityStart + 1,
-                            m_iDataPos - m_iEntityStart - 1);
-    int32_t iLen = csEntity.GetLength();
-    if (iLen > 0) {
-      if (csEntity[0] == '#') {
-        if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_sharp) == 0) {
-          ch = 0;
-          uint8_t w;
-          if (iLen > 1 && csEntity[1] == 'x') {
-            for (int32_t i = 2; i < iLen; i++) {
-              w = csEntity[i];
-              if (w >= '0' && w <= '9') {
-                ch = (ch << 4) + w - '0';
-              } else if (w >= 'A' && w <= 'F') {
-                ch = (ch << 4) + w - 55;
-              } else if (w >= 'a' && w <= 'f') {
-                ch = (ch << 4) + w - 87;
-              } else {
-                break;
-              }
-            }
-          } else {
-            for (int32_t i = 1; i < iLen; i++) {
-              w = csEntity[i];
-              if (w < '0' || w > '9') {
-                break;
-              }
-              ch = ch * 10 + w - '0';
-            }
-          }
-          if (ch != 0) {
-            m_pszData[m_iEntityStart++] = ch;
-          }
-        }
-      } else {
-        if (csEntity.Compare("amp") == 0) {
-          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_amp) == 0) {
-            m_pszData[m_iEntityStart++] = '&';
-          }
-        } else if (csEntity.Compare("lt") == 0) {
-          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_lt) == 0) {
-            m_pszData[m_iEntityStart++] = '<';
-          }
-        } else if (csEntity.Compare("gt") == 0) {
-          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_gt) == 0) {
-            m_pszData[m_iEntityStart++] = '>';
-          }
-        } else if (csEntity.Compare("apos") == 0) {
-          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_apos) == 0) {
-            m_pszData[m_iEntityStart++] = '\'';
-          }
-        } else if (csEntity.Compare("quot") == 0) {
-          if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_quot) == 0) {
-            m_pszData[m_iEntityStart++] = '\"';
-          }
-        }
-      }
-    }
-    if (iSaveEntityStart != m_iEntityStart) {
-      m_iDataPos = m_iEntityStart;
-      m_iEntityStart = -1;
-    } else {
-      m_iDataPos++;
-      m_iEntityStart = -1;
-    }
-  } else {
-    if (m_iEntityStart < 0 && ch == '&') {
-      m_iEntityStart = m_iDataPos;
-    }
-    m_iDataPos++;
-  }
-}
-void CFX_SAXReader::ParseText() {
-  if (m_CurByte == '<') {
-    if (m_iDataPos > 0) {
-      m_iDataLength = m_iDataPos;
-      m_iDataPos = 0;
-      if (m_pHandler) {
-        NotifyData();
-      }
-    }
-    Push();
-    m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
-    m_eMode = FX_SAXMODE_NodeStart;
-    return;
-  }
-  if (m_iDataPos < 1 && SkipSpace(m_CurByte)) {
-    return;
-  }
-  ParseChar(m_CurByte);
-}
-void CFX_SAXReader::ParseNodeStart() {
-  if (m_CurByte == '?') {
-    m_pCurItem->m_eNode = FX_SAXNODE_Instruction;
-    m_eMode = FX_SAXMODE_TagName;
-    return;
-  }
-  if (m_CurByte == '!') {
-    m_eMode = FX_SAXMODE_DeclOrComment;
-    return;
-  }
-  if (m_CurByte == '/') {
-    m_eMode = FX_SAXMODE_TagEnd;
-    return;
-  }
-  if (m_CurByte == '>') {
-    Pop();
-    m_eMode = FX_SAXMODE_Text;
-    return;
-  }
-  if (m_CurByte > 0x20) {
-    m_dwDataOffset = m_File.m_dwBufIndex;
-    m_pCurItem->m_eNode = FX_SAXNODE_Tag;
-    m_eMode = FX_SAXMODE_TagName;
-    AppendData(m_CurByte);
-  }
-}
-void CFX_SAXReader::ParseDeclOrComment() {
-  if (m_CurByte == '-') {
-    m_eMode = FX_SAXMODE_Comment;
-    m_pCurItem->m_eNode = FX_SAXNODE_Comment;
-    if (m_pCommentContext == NULL) {
-      m_pCommentContext = new CFX_SAXCommentContext;
-    }
-    m_pCommentContext->m_iHeaderCount = 1;
-    m_pCommentContext->m_iTailCount = 0;
-  } else {
-    m_eMode = FX_SAXMODE_DeclNode;
-    m_dwDataOffset = m_File.m_dwBufIndex;
-    m_SkipChar = '>';
-    m_SkipStack.Add('>');
-    SkipNode();
-  }
-}
-void CFX_SAXReader::ParseComment() {
-  m_pCommentContext->m_iHeaderCount = 2;
-  m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
-  m_eMode = FX_SAXMODE_CommentContent;
-}
-void CFX_SAXReader::ParseCommentContent() {
-  if (m_CurByte == '-') {
-    m_pCommentContext->m_iTailCount++;
-  } else if (m_CurByte == '>' && m_pCommentContext->m_iTailCount == 2) {
-    m_iDataLength = m_iDataPos;
-    m_iDataPos = 0;
-    if (m_pHandler) {
-      NotifyTargetData();
-    }
-    Pop();
-    m_eMode = FX_SAXMODE_Text;
-  } else {
-    while (m_pCommentContext->m_iTailCount > 0) {
-      AppendData('-');
-      m_pCommentContext->m_iTailCount--;
-    }
-    AppendData(m_CurByte);
-  }
-}
-void CFX_SAXReader::ParseDeclNode() {
-  SkipNode();
-}
-void CFX_SAXReader::ParseTagName() {
-  if (m_CurByte < 0x21 || m_CurByte == '/' || m_CurByte == '>' ||
-      m_CurByte == '?') {
-    m_iDataLength = m_iDataPos;
-    m_iDataPos = 0;
-    if (m_pHandler) {
-      NotifyEnter();
-    }
-    if (m_CurByte < 0x21) {
-      m_eMode = FX_SAXMODE_TagAttributeName;
-    } else if (m_CurByte == '/' || m_CurByte == '?') {
-      m_ePrevMode = m_eMode;
-      m_eMode = FX_SAXMODE_TagMaybeClose;
-    } else {
-      if (m_pHandler) {
-        NotifyBreak();
-      }
-      m_eMode = FX_SAXMODE_Text;
-    }
-  } else {
-    AppendData(m_CurByte);
-  }
-}
-void CFX_SAXReader::ParseTagAttributeName() {
-  if (m_CurByte < 0x21 || m_CurByte == '=') {
-    if (m_iDataPos < 1 && m_CurByte < 0x21) {
-      return;
-    }
-    m_iNameLength = m_iDataPos;
-    m_iDataPos = 0;
-    m_SkipChar = 0;
-    m_eMode = m_CurByte == '=' ? FX_SAXMODE_TagAttributeValue
-                               : FX_SAXMODE_TagAttributeEqual;
-    return;
-  }
-  if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') {
-    if (m_CurByte == '/' || m_CurByte == '?') {
-      m_ePrevMode = m_eMode;
-      m_eMode = FX_SAXMODE_TagMaybeClose;
-    } else {
-      if (m_pHandler) {
-        NotifyBreak();
-      }
-      m_eMode = FX_SAXMODE_Text;
-    }
-    return;
-  }
-  if (m_iDataPos < 1) {
-    m_dwDataOffset = m_File.m_dwBufIndex;
-  }
-  AppendName(m_CurByte);
-}
-void CFX_SAXReader::ParseTagAttributeEqual() {
-  if (m_CurByte == '=') {
-    m_SkipChar = 0;
-    m_eMode = FX_SAXMODE_TagAttributeValue;
-    return;
-  } else if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-    m_iDataPos = m_iNameLength;
-    AppendName(0x20);
-    m_eMode = FX_SAXMODE_TargetData;
-    ParseTargetData();
-  }
-}
-void CFX_SAXReader::ParseTagAttributeValue() {
-  if (m_SkipChar) {
-    if (m_SkipChar == m_CurByte) {
-      {
-        m_iDataLength = m_iDataPos;
-        m_iDataPos = 0;
-        if (m_pHandler) {
-          NotifyAttribute();
-        }
-      }
-      m_SkipChar = 0;
-      m_eMode = FX_SAXMODE_TagAttributeName;
-      return;
-    }
-    ParseChar(m_CurByte);
-    return;
-  }
-  if (m_CurByte < 0x21) {
-    return;
-  }
-  if (m_iDataPos < 1) {
-    if (m_CurByte == '\'' || m_CurByte == '\"') {
-      m_SkipChar = m_CurByte;
-    }
-  }
-}
-void CFX_SAXReader::ParseMaybeClose() {
-  if (m_CurByte == '>') {
-    if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-      m_iNameLength = m_iDataPos;
-      m_iDataPos = 0;
-      if (m_pHandler) {
-        NotifyTargetData();
-      }
-    }
-    ParseTagClose();
-    m_eMode = FX_SAXMODE_Text;
-  } else if (m_ePrevMode == FX_SAXMODE_TagName) {
-    AppendData('/');
-    m_eMode = FX_SAXMODE_TagName;
-    m_ePrevMode = FX_SAXMODE_Text;
-    ParseTagName();
-  } else if (m_ePrevMode == FX_SAXMODE_TagAttributeName) {
-    AppendName('/');
-    m_eMode = FX_SAXMODE_TagAttributeName;
-    m_ePrevMode = FX_SAXMODE_Text;
-    ParseTagAttributeName();
-  } else if (m_ePrevMode == FX_SAXMODE_TargetData) {
-    AppendName('?');
-    m_eMode = FX_SAXMODE_TargetData;
-    m_ePrevMode = FX_SAXMODE_Text;
-    ParseTargetData();
-  }
-}
-void CFX_SAXReader::ParseTagClose() {
-  m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
-  if (m_pHandler) {
-    NotifyClose();
-  }
-  Pop();
-}
-void CFX_SAXReader::ParseTagEnd() {
-  if (m_CurByte < 0x21) {
-    return;
-  }
-  if (m_CurByte == '>') {
-    Pop();
-    m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
-    m_iDataLength = m_iDataPos;
-    m_iDataPos = 0;
-    if (m_pHandler) {
-      NotifyEnd();
-    }
-    Pop();
-    m_eMode = FX_SAXMODE_Text;
-  } else {
-    ParseChar(m_CurByte);
-  }
-}
-void CFX_SAXReader::ParseTargetData() {
-  if (m_CurByte == '?') {
-    m_ePrevMode = m_eMode;
-    m_eMode = FX_SAXMODE_TagMaybeClose;
-  } else {
-    AppendName(m_CurByte);
-  }
-}
-void CFX_SAXReader::SkipNode() {
-  int32_t iLen = m_SkipStack.GetSize();
-  if (m_SkipChar == '\'' || m_SkipChar == '\"') {
-    if (m_CurByte != m_SkipChar) {
-      return;
-    }
-    iLen--;
-    FXSYS_assert(iLen > -1);
-    m_SkipStack.RemoveAt(iLen, 1);
-    m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
-    return;
-  }
-  switch (m_CurByte) {
-    case '<':
-      m_SkipChar = '>';
-      m_SkipStack.Add('>');
-      break;
-    case '[':
-      m_SkipChar = ']';
-      m_SkipStack.Add(']');
-      break;
-    case '(':
-      m_SkipChar = ')';
-      m_SkipStack.Add(')');
-      break;
-    case '\'':
-      m_SkipChar = '\'';
-      m_SkipStack.Add('\'');
-      break;
-    case '\"':
-      m_SkipChar = '\"';
-      m_SkipStack.Add('\"');
-      break;
-    default:
-      if (m_CurByte == m_SkipChar) {
-        iLen--;
-        m_SkipStack.RemoveAt(iLen, 1);
-        m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
-        if (iLen == 0 && m_CurByte == '>') {
-          m_iDataLength = m_iDataPos;
-          m_iDataPos = 0;
-          if (m_iDataLength >= 9 &&
-              FXSYS_memcmp(m_pszData, "[CDATA[", 7 * sizeof(uint8_t)) == 0 &&
-              FXSYS_memcmp(m_pszData + m_iDataLength - 2, "]]",
-                           2 * sizeof(uint8_t)) == 0) {
-            Pop();
-            m_iDataLength -= 9;
-            m_dwDataOffset += 7;
-            FXSYS_memmove(m_pszData, m_pszData + 7,
-                          m_iDataLength * sizeof(uint8_t));
-            m_bCharData = TRUE;
-            if (m_pHandler) {
-              NotifyData();
-            }
-            m_bCharData = FALSE;
-          } else {
-            Pop();
-          }
-          m_eMode = FX_SAXMODE_Text;
-        }
-      }
-      break;
-  }
-  if (iLen > 0) {
-    ParseChar(m_CurByte);
-  }
-}
-void CFX_SAXReader::NotifyData() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag)
-    m_pHandler->OnTagData(m_pCurItem->m_pNode,
-                          m_bCharData ? FX_SAXNODE_CharData : FX_SAXNODE_Text,
-                          CFX_ByteStringC(m_pszData, m_iDataLength),
-                          m_File.m_dwCur + m_dwDataOffset);
-}
-void CFX_SAXReader::NotifyEnter() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
-      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-    m_pCurItem->m_pNode =
-        m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength),
-                               m_pCurItem->m_eNode, m_dwNodePos);
-  }
-}
-void CFX_SAXReader::NotifyAttribute() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
-      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-    m_pHandler->OnTagAttribute(m_pCurItem->m_pNode,
-                               CFX_ByteStringC(m_pszName, m_iNameLength),
-                               CFX_ByteStringC(m_pszData, m_iDataLength));
-  }
-}
-void CFX_SAXReader::NotifyBreak() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) {
-    m_pHandler->OnTagBreak(m_pCurItem->m_pNode);
-  }
-}
-void CFX_SAXReader::NotifyClose() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag ||
-      m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-    m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos);
-  }
-}
-void CFX_SAXReader::NotifyEnd() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) {
-    m_pHandler->OnTagEnd(m_pCurItem->m_pNode,
-                         CFX_ByteStringC(m_pszData, m_iDataLength),
-                         m_dwNodePos);
-  }
-}
-void CFX_SAXReader::NotifyTargetData() {
-  FXSYS_assert(m_pHandler != NULL);
-  if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) {
-    m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode,
-                             CFX_ByteStringC(m_pszName, m_iNameLength),
-                             m_dwNodePos);
-  } else if (m_pCurItem->m_eNode == FX_SAXNODE_Comment) {
-    m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode,
-                             CFX_ByteStringC(m_pszData, m_iDataLength),
-                             m_dwNodePos);
-  }
-}
-void CFX_SAXReader::SkipCurrentNode() {
-  if (!m_pCurItem) {
-    return;
-  }
-  m_pCurItem->m_bSkip = TRUE;
-}
-void CFX_SAXReader::SetHandler(IFX_SAXReaderHandler* pHandler) {
-  m_pHandler = pHandler;
-}
diff --git a/xfa/src/fgas/xml/fgas_sax_imp.h b/xfa/src/fgas/xml/fgas_sax_imp.h
deleted file mode 100644
index a65f2ab..0000000
--- a/xfa/src/fgas/xml/fgas_sax_imp.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FGAS_XML_FGAS_SAX_IMP_H_
-#define XFA_SRC_FGAS_XML_FGAS_SAX_IMP_H_
-
-#include "xfa/src/fgas/xml/fgas_sax.h"
-
-class CFX_SAXFile {
- public:
-  CFX_SAXFile();
-  FX_BOOL StartFile(IFX_FileRead* pFile, FX_DWORD dwStart, FX_DWORD dwLen);
-  FX_BOOL ReadNextBlock();
-  void Reset();
-  IFX_FileRead* m_pFile;
-  FX_DWORD m_dwStart;
-  FX_DWORD m_dwEnd;
-  FX_DWORD m_dwCur;
-  uint8_t* m_pBuf;
-  FX_DWORD m_dwBufSize;
-  FX_DWORD m_dwBufIndex;
-};
-
-enum FX_SAXMODE {
-  FX_SAXMODE_Text = 0,
-  FX_SAXMODE_NodeStart,
-  FX_SAXMODE_DeclOrComment,
-  FX_SAXMODE_DeclNode,
-  FX_SAXMODE_Comment,
-  FX_SAXMODE_CommentContent,
-  FX_SAXMODE_TagName,
-  FX_SAXMODE_TagAttributeName,
-  FX_SAXMODE_TagAttributeEqual,
-  FX_SAXMODE_TagAttributeValue,
-  FX_SAXMODE_TagMaybeClose,
-  FX_SAXMODE_TagClose,
-  FX_SAXMODE_TagEnd,
-  FX_SAXMODE_TargetData,
-  FX_SAXMODE_MAX,
-};
-
-class CFX_SAXItem {
- public:
-  CFX_SAXItem()
-      : m_pNode(NULL),
-        m_eNode(FX_SAXNODE_Unknown),
-        m_dwID(0),
-        m_bSkip(FALSE),
-        m_pPrev(NULL),
-        m_pNext(NULL) {}
-  void* m_pNode;
-  FX_SAXNODE m_eNode;
-  FX_DWORD m_dwID;
-  FX_BOOL m_bSkip;
-  CFX_SAXItem* m_pPrev;
-  CFX_SAXItem* m_pNext;
-};
-
-class CFX_SAXCommentContext {
- public:
-  CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {}
-  int32_t m_iHeaderCount;
-  int32_t m_iTailCount;
-};
-
-class CFX_SAXReader : public IFX_SAXReader {
- public:
-  CFX_SAXReader();
-  ~CFX_SAXReader();
-  virtual void Release() { delete this; }
-  virtual int32_t StartParse(IFX_FileRead* pFile,
-                             FX_DWORD dwStart = 0,
-                             FX_DWORD dwLen = -1,
-                             FX_DWORD dwParseMode = 0);
-  virtual int32_t ContinueParse(IFX_Pause* pPause = NULL);
-  virtual void SkipCurrentNode();
-  virtual void SetHandler(IFX_SAXReaderHandler* pHandler);
-  void AppendData(uint8_t ch);
-  void AppendName(uint8_t ch);
-  void ParseText();
-  void ParseNodeStart();
-  void ParseInstruction();
-  void ParseDeclOrComment();
-  void ParseDeclNode();
-  void ParseComment();
-  void ParseCommentContent();
-  void ParseTagName();
-  void ParseTagAttributeName();
-  void ParseTagAttributeEqual();
-  void ParseTagAttributeValue();
-  void ParseMaybeClose();
-  void ParseTagClose();
-  void ParseTagEnd();
-  void ParseTargetData();
-
- protected:
-  CFX_SAXFile m_File;
-  IFX_SAXReaderHandler* m_pHandler;
-  int32_t m_iState;
-  CFX_SAXItem* m_pRoot;
-  CFX_SAXItem* m_pCurItem;
-  FX_DWORD m_dwItemID;
-  FX_SAXMODE m_eMode;
-  FX_SAXMODE m_ePrevMode;
-  FX_BOOL m_bCharData;
-  uint8_t m_CurByte;
-  FX_DWORD m_dwDataOffset;
-  CFX_ByteArray m_SkipStack;
-  uint8_t m_SkipChar;
-  FX_DWORD m_dwNodePos;
-  uint8_t* m_pszData;
-  int32_t m_iDataSize;
-  int32_t m_iDataLength;
-  int32_t m_iEntityStart;
-  int32_t m_iDataPos;
-  uint8_t* m_pszName;
-  int32_t m_iNameSize;
-  int32_t m_iNameLength;
-  FX_DWORD m_dwParseMode;
-  CFX_SAXCommentContext* m_pCommentContext;
-  void Reset();
-  void Push();
-  void Pop();
-  FX_BOOL SkipSpace(uint8_t ch);
-  void SkipNode();
-  void NotifyData();
-  void NotifyEnter();
-  void NotifyAttribute();
-  void NotifyBreak();
-  void NotifyClose();
-  void NotifyEnd();
-  void NotifyTargetData();
-  void ReallocDataBuffer();
-  void ReallocNameBuffer();
-  void ParseChar(uint8_t ch);
-};
-
-#endif  // XFA_SRC_FGAS_XML_FGAS_SAX_IMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_barcodeimp.cpp b/xfa/src/fwl/basewidget/fwl_barcodeimp.cpp
deleted file mode 100644
index af604f1..0000000
--- a/xfa/src/fwl/basewidget/fwl_barcodeimp.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_barcodeimp.h"
-
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_Barcode* IFWL_Barcode::Create(const CFWL_WidgetImpProperties& properties) {
-  IFWL_Barcode* pBarcode = new IFWL_Barcode;
-  CFWL_BarcodeImp* pBarcodeImpl = new CFWL_BarcodeImp(properties, nullptr);
-  pBarcode->SetImpl(pBarcodeImpl);
-  pBarcodeImpl->SetInterface(pBarcode);
-  return pBarcode;
-}
-IFWL_Barcode::IFWL_Barcode() {}
-void IFWL_Barcode::SetType(BC_TYPE type) {
-  static_cast<CFWL_BarcodeImp*>(GetImpl())->SetType(type);
-}
-FX_BOOL IFWL_Barcode::IsProtectedType() {
-  return static_cast<CFWL_BarcodeImp*>(GetImpl())->IsProtectedType();
-}
-
-CFWL_BarcodeImp::CFWL_BarcodeImp(const CFWL_WidgetImpProperties& properties,
-                                 IFWL_Widget* pOuter)
-    : CFWL_EditImp(properties, pOuter),
-      m_pBarcodeEngine(NULL),
-      m_dwStatus(0),
-      m_type(BC_UNKNOWN) {}
-CFWL_BarcodeImp::~CFWL_BarcodeImp() {
-  ReleaseBarcodeEngine();
-}
-FWL_ERR CFWL_BarcodeImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Barcode;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_BarcodeImp::GetClassID() const {
-  return FWL_CLASSHASH_Barcode;
-}
-FWL_ERR CFWL_BarcodeImp::Initialize() {
-  if (!m_pDelegate) {
-    m_pDelegate = new CFWL_BarcodeImpDelegate(this);
-  }
-  if (CFWL_EditImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_BarcodeImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  ReleaseBarcodeEngine();
-  return CFWL_EditImp::Finalize();
-}
-FWL_ERR CFWL_BarcodeImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  FWL_ERR ret = CFWL_EditImp::Update();
-  GenerateBarcodeImageCache();
-  return ret;
-}
-FWL_ERR CFWL_BarcodeImp::DrawWidget(CFX_Graphics* pGraphics,
-                                    const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    GenerateBarcodeImageCache();
-    if (!m_pBarcodeEngine || (m_dwStatus & XFA_BCS_EncodeSuccess) == 0) {
-      return FWL_ERR_Succeeded;
-    }
-    CFX_Matrix mt;
-    mt.e = m_rtClient.left;
-    mt.f = m_rtClient.top;
-    if (pMatrix) {
-      mt.Concat(*pMatrix);
-    }
-    int32_t errorCode = 0;
-    if (!m_pBarcodeEngine->RenderDevice(pGraphics->GetRenderDevice(), pMatrix,
-                                        errorCode)) {
-      return FWL_ERR_Indefinite;
-    }
-    return FWL_ERR_Succeeded;
-  }
-  return CFWL_EditImp::DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_BarcodeImp::GenerateBarcodeImageCache() {
-  if ((m_dwStatus & XFA_BCS_NeedUpdate) == 0)
-    return;
-  m_dwStatus = 0;
-  CreateBarcodeEngine();
-  IFWL_BarcodeDP* pData =
-      static_cast<IFWL_BarcodeDP*>(m_pProperties->m_pDataProvider);
-  if (!pData)
-    return;
-  if (!m_pBarcodeEngine)
-    return;
-  CFX_WideString wsText;
-  if (GetText(wsText) != FWL_ERR_Succeeded)
-    return;
-  CFWL_ThemePart part;
-  part.m_pWidget = m_pInterface;
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  IFX_Font* pFont =
-      static_cast<IFX_Font*>(pTheme->GetCapacity(&part, FWL_WGTCAPACITY_Font));
-  CFX_Font* pCXFont =
-      pFont ? static_cast<CFX_Font*>(pFont->GetDevFont()) : nullptr;
-  if (pCXFont) {
-    m_pBarcodeEngine->SetFont(pCXFont);
-  }
-  FX_FLOAT* pFontSize = static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FontSize));
-  if (pFontSize) {
-    m_pBarcodeEngine->SetFontSize(*pFontSize);
-  }
-  FX_ARGB* pFontColor = static_cast<FX_ARGB*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_TextColor));
-  if (pFontColor) {
-    m_pBarcodeEngine->SetFontColor(*pFontColor);
-  }
-  m_pBarcodeEngine->SetHeight(int32_t(m_rtClient.height));
-  m_pBarcodeEngine->SetWidth(int32_t(m_rtClient.width));
-  FX_DWORD dwAttributeMask = pData->GetBarcodeAttributeMask();
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_CHARENCODING) {
-    m_pBarcodeEngine->SetCharEncoding(pData->GetCharEncoding());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEHEIGHT) {
-    m_pBarcodeEngine->SetModuleHeight(pData->GetModuleHeight());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_MODULEWIDTH) {
-    m_pBarcodeEngine->SetModuleWidth(pData->GetModuleWidth());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_DATALENGTH) {
-    m_pBarcodeEngine->SetDataLength(pData->GetDataLength());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_CALCHECKSUM) {
-    m_pBarcodeEngine->SetCalChecksum(pData->GetCalChecksum());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_PRINTCHECKSUM) {
-    m_pBarcodeEngine->SetPrintChecksum(pData->GetPrintChecksum());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_TEXTLOCATION) {
-    m_pBarcodeEngine->SetTextLocation(pData->GetTextLocation());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_WIDENARROWRATIO) {
-    m_pBarcodeEngine->SetWideNarrowRatio(pData->GetWideNarrowRatio());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_STARTCHAR) {
-    m_pBarcodeEngine->SetStartChar(pData->GetStartChar());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_ENDCHAR) {
-    m_pBarcodeEngine->SetEndChar(pData->GetEndChar());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_VERSION) {
-    m_pBarcodeEngine->SetVersion(pData->GetVersion());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_ECLEVEL) {
-    m_pBarcodeEngine->SetErrorCorrectionLevel(pData->GetErrorCorrectionLevel());
-  }
-  if (dwAttributeMask & FWL_BCDATTRIBUTE_TRUNCATED) {
-    m_pBarcodeEngine->SetTruncated(pData->GetTruncated());
-  }
-  int32_t errorCode = 0;
-  m_dwStatus = m_pBarcodeEngine->Encode(wsText, TRUE, errorCode)
-                   ? XFA_BCS_EncodeSuccess
-                   : 0;
-}
-void CFWL_BarcodeImp::CreateBarcodeEngine() {
-  if ((m_pBarcodeEngine == NULL) && (m_type != BC_UNKNOWN)) {
-    m_pBarcodeEngine = FX_Barcode_Create(m_type);
-  }
-}
-void CFWL_BarcodeImp::ReleaseBarcodeEngine() {
-  if (m_pBarcodeEngine) {
-    m_pBarcodeEngine->Release();
-    m_pBarcodeEngine = NULL;
-  }
-}
-void CFWL_BarcodeImp::SetType(BC_TYPE type) {
-  if (m_type == type) {
-    return;
-  }
-  ReleaseBarcodeEngine();
-  m_type = type;
-  m_dwStatus = XFA_BCS_NeedUpdate;
-}
-FWL_ERR CFWL_BarcodeImp::SetText(const CFX_WideString& wsText) {
-  ReleaseBarcodeEngine();
-  m_dwStatus = XFA_BCS_NeedUpdate;
-  return CFWL_EditImp::SetText(wsText);
-}
-FX_BOOL CFWL_BarcodeImp::IsProtectedType() {
-  if (!m_pBarcodeEngine) {
-    return TRUE;
-  }
-  BC_TYPE tEngineType = m_pBarcodeEngine->GetType();
-  if (tEngineType == BC_QR_CODE || tEngineType == BC_PDF417 ||
-      tEngineType == BC_DATAMATRIX) {
-    return TRUE;
-  }
-  return FALSE;
-}
-CFWL_BarcodeImpDelegate::CFWL_BarcodeImpDelegate(CFWL_BarcodeImp* pOwner)
-    : CFWL_EditImpDelegate(pOwner) {}
-FWL_ERR CFWL_BarcodeImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  FX_DWORD dwFlag = pEvent->GetClassID();
-  if (dwFlag == FWL_EVTHASH_EDT_TextChanged) {
-    CFWL_BarcodeImp* pOwner = static_cast<CFWL_BarcodeImp*>(m_pOwner);
-    pOwner->ReleaseBarcodeEngine();
-    pOwner->m_dwStatus = XFA_BCS_NeedUpdate;
-  }
-  return CFWL_EditImpDelegate::OnProcessEvent(pEvent);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_barcodeimp.h b/xfa/src/fwl/basewidget/fwl_barcodeimp.h
deleted file mode 100644
index eedcb16..0000000
--- a/xfa/src/fwl/basewidget/fwl_barcodeimp.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
-
-#include "xfa/include/fwl/basewidget/fwl_barcode.h"
-#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
-#include "xfa/include/fwl/basewidget/fxmath_barcode.h"
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-
-class CFWL_WidgetImpProperties;
-class CFWL_BarcodeImpDelegate;
-class IFWL_Widget;
-
-#define XFA_BCS_NeedUpdate 0x0001
-#define XFA_BCS_EncodeSuccess 0x0002
-
-class CFWL_BarcodeImp : public CFWL_EditImp {
- public:
-  CFWL_BarcodeImp(const CFWL_WidgetImpProperties& properties,
-                  IFWL_Widget* pOuter);
-  virtual ~CFWL_BarcodeImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_ERR SetText(const CFX_WideString& wsText);
-  virtual void SetType(BC_TYPE type);
-  FX_BOOL IsProtectedType();
-
- protected:
-  void GenerateBarcodeImageCache();
-  void CreateBarcodeEngine();
-  void ReleaseBarcodeEngine();
-  IFX_Barcode* m_pBarcodeEngine;
-  FX_DWORD m_dwStatus;
-  BC_TYPE m_type;
-  friend class CFWL_BarcodeImpDelegate;
-};
-
-class CFWL_BarcodeImpDelegate : public CFWL_EditImpDelegate {
- public:
-  CFWL_BarcodeImpDelegate(CFWL_BarcodeImp* pOwner);
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_BARCODEIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_caretimp.cpp b/xfa/src/fwl/basewidget/fwl_caretimp.cpp
deleted file mode 100644
index 752f889..0000000
--- a/xfa/src/fwl/basewidget/fwl_caretimp.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_caretimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_caret.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_Caret* IFWL_Caret::Create(const CFWL_WidgetImpProperties& properties,
-                               IFWL_Widget* pOuter) {
-  IFWL_Caret* pCaret = new IFWL_Caret;
-  CFWL_CaretImp* pCaretImpl = new CFWL_CaretImp(properties, pOuter);
-  pCaret->SetImpl(pCaretImpl);
-  pCaretImpl->SetInterface(pCaret);
-  return pCaret;
-}
-IFWL_Caret::IFWL_Caret() {}
-FWL_ERR IFWL_Caret::ShowCaret(FX_BOOL bFlag) {
-  return static_cast<CFWL_CaretImp*>(GetImpl())->ShowCaret(bFlag);
-}
-FWL_ERR IFWL_Caret::GetFrequency(FX_DWORD& elapse) {
-  return static_cast<CFWL_CaretImp*>(GetImpl())->GetFrequency(elapse);
-}
-FWL_ERR IFWL_Caret::SetFrequency(FX_DWORD elapse) {
-  return static_cast<CFWL_CaretImp*>(GetImpl())->SetFrequency(elapse);
-}
-FWL_ERR IFWL_Caret::SetColor(CFX_Color crFill) {
-  return static_cast<CFWL_CaretImp*>(GetImpl())->SetColor(crFill);
-}
-
-CFWL_CaretImp::CFWL_CaretImp(const CFWL_WidgetImpProperties& properties,
-                             IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_hTimer(nullptr),
-      m_dwElapse(400),
-      m_bSetColor(FALSE) {
-  m_pTimer = new CFWL_CaretTimer(this);
-  SetStates(FWL_STATE_CAT_HightLight);
-}
-CFWL_CaretImp::~CFWL_CaretImp() {
-  if (m_pTimer) {
-    delete m_pTimer;
-    m_pTimer = NULL;
-  }
-}
-FWL_ERR CFWL_CaretImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Caret;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_CaretImp::GetClassID() const {
-  return FWL_CLASSHASH_Caret;
-}
-FWL_ERR CFWL_CaretImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_CaretImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CaretImp::Finalize() {
-  if (m_hTimer) {
-    FWL_StopTimer(m_hTimer);
-    m_hTimer = NULL;
-  }
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_CaretImp::DrawWidget(CFX_Graphics* pGraphics,
-                                  const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CaretImp::ShowCaret(FX_BOOL bFlag) {
-  if (m_hTimer) {
-    FWL_StopTimer(m_hTimer);
-    m_hTimer = NULL;
-  }
-  if (bFlag) {
-    m_hTimer = FWL_StartTimer(m_pTimer, m_dwElapse);
-  }
-  return SetStates(FWL_WGTSTATE_Invisible, !bFlag);
-}
-FWL_ERR CFWL_CaretImp::GetFrequency(FX_DWORD& elapse) {
-  elapse = m_dwElapse;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CaretImp::SetFrequency(FX_DWORD elapse) {
-  m_dwElapse = elapse;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CaretImp::SetColor(CFX_Color crFill) {
-  m_bSetColor = TRUE;
-  m_crFill = crFill;
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_CaretImp::DrawCaretBK(CFX_Graphics* pGraphics,
-                                   IFWL_ThemeProvider* pTheme,
-                                   const CFX_Matrix* pMatrix) {
-  CFX_RectF rect;
-  GetWidgetRect(rect);
-  rect.Set(0, 0, rect.width, rect.height);
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_pGraphics = pGraphics;
-  param.m_rtPart = rect;
-  if (m_bSetColor) {
-    param.m_pData = &m_crFill;
-  }
-  if (!(m_pProperties->m_dwStates & FWL_STATE_CAT_HightLight)) {
-    return FWL_ERR_Succeeded;
-  }
-  param.m_iPart = FWL_PART_CAT_Background;
-  param.m_dwStates = FWL_PARTSTATE_CAT_HightLight;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&param);
-  return FWL_ERR_Succeeded;
-}
-
-CFWL_CaretImp::CFWL_CaretTimer::CFWL_CaretTimer(CFWL_CaretImp* pCaret)
-    : m_pCaret(pCaret) {}
-
-int32_t CFWL_CaretImp::CFWL_CaretTimer::Run(FWL_HTIMER hTimer) {
-  if (m_pCaret->GetStates() & FWL_STATE_CAT_HightLight) {
-    m_pCaret->SetStates(FWL_STATE_CAT_HightLight, FALSE);
-  } else {
-    m_pCaret->SetStates(FWL_STATE_CAT_HightLight);
-  }
-  CFX_RectF rt;
-  m_pCaret->GetWidgetRect(rt);
-  rt.Set(0, 0, rt.width + 1, rt.height);
-  m_pCaret->Repaint(&rt);
-  return 1;
-}
-CFWL_CaretImpDelegate::CFWL_CaretImpDelegate(CFWL_CaretImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_CaretImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  return 1;
-}
-FWL_ERR CFWL_CaretImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                            const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_caretimp.h b/xfa/src/fwl/basewidget/fwl_caretimp.h
deleted file mode 100644
index e3dde63..0000000
--- a/xfa/src/fwl/basewidget/fwl_caretimp.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_CARETIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_CARETIMP_H_
-
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_CaretImpDelegate;
-
-class CFWL_CaretImp : public CFWL_WidgetImp {
- public:
-  CFWL_CaretImp(const CFWL_WidgetImpProperties& properties,
-                IFWL_Widget* pOuter);
-  virtual ~CFWL_CaretImp();
-
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
-  virtual FWL_ERR ShowCaret(FX_BOOL bFlag = TRUE);
-  virtual FWL_ERR GetFrequency(FX_DWORD& elapse);
-  virtual FWL_ERR SetFrequency(FX_DWORD elapse);
-  virtual FWL_ERR SetColor(CFX_Color crFill);
-
- protected:
-  FX_BOOL DrawCaretBK(CFX_Graphics* pGraphics,
-                      IFWL_ThemeProvider* pTheme,
-                      const CFX_Matrix* pMatrix);
-  class CFWL_CaretTimer : public IFWL_Timer {
-   public:
-    explicit CFWL_CaretTimer(CFWL_CaretImp* pCaret);
-    ~CFWL_CaretTimer() override {}
-    int32_t Run(FWL_HTIMER hTimer) override;
-    CFWL_CaretImp* const m_pCaret;
-  };
-  CFWL_CaretTimer* m_pTimer;
-  FWL_HTIMER m_hTimer;
-  FX_DWORD m_dwElapse;
-  CFX_Color m_crFill;
-  FX_BOOL m_bSetColor;
-  friend class CFWL_CaretImpDelegate;
-  friend class CFWL_CaretTimer;
-};
-class CFWL_CaretImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_CaretImpDelegate(CFWL_CaretImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  CFWL_CaretImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_CARETIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_checkboximp.cpp b/xfa/src/fwl/basewidget/fwl_checkboximp.cpp
deleted file mode 100644
index 16cc8f7..0000000
--- a/xfa/src/fwl/basewidget/fwl_checkboximp.cpp
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_checkboximp.h"
-
-#include <algorithm>
-
-#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-#define FWL_CKB_CaptionMargin 5
-
-// static
-IFWL_CheckBox* IFWL_CheckBox::Create(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter) {
-  IFWL_CheckBox* pCheckBox = new IFWL_CheckBox;
-  CFWL_CheckBoxImp* pCheckBoxImpl = new CFWL_CheckBoxImp(properties, pOuter);
-  pCheckBox->SetImpl(pCheckBoxImpl);
-  pCheckBoxImpl->SetInterface(pCheckBox);
-  return pCheckBox;
-}
-IFWL_CheckBox::IFWL_CheckBox() {}
-int32_t IFWL_CheckBox::GetCheckState() {
-  return static_cast<CFWL_CheckBoxImp*>(GetImpl())->GetCheckState();
-}
-FWL_ERR IFWL_CheckBox::SetCheckState(int32_t iCheck) {
-  return static_cast<CFWL_CheckBoxImp*>(GetImpl())->SetCheckState(iCheck);
-}
-
-CFWL_CheckBoxImp::CFWL_CheckBoxImp(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
-      m_iTTOAlign(FDE_TTOALIGNMENT_Center),
-      m_bBtnDown(FALSE) {
-  m_rtClient.Reset();
-  m_rtBox.Reset();
-  m_rtCaption.Reset();
-  m_rtFocus.Reset();
-}
-CFWL_CheckBoxImp::~CFWL_CheckBoxImp() {}
-FWL_ERR CFWL_CheckBoxImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_CheckBox;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_CheckBoxImp::GetClassID() const {
-  return FWL_CLASSHASH_CheckBox;
-}
-FWL_ERR CFWL_CheckBoxImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_CheckBoxImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CheckBoxImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_CheckBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pThemeProvider)
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    if (!m_pProperties->m_pThemeProvider)
-      return FWL_ERR_Indefinite;
-    if (!m_pProperties->m_pDataProvider)
-      return FWL_ERR_Indefinite;
-    CFX_WideString wsCaption;
-    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
-    if (wsCaption.GetLength() > 0) {
-      CFX_SizeF sz = CalcTextSize(
-          wsCaption, m_pProperties->m_pThemeProvider,
-          m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine);
-      rect.Set(0, 0, sz.x, sz.y);
-    }
-    rect.Inflate(FWL_CKB_CaptionMargin, FWL_CKB_CaptionMargin);
-    IFWL_CheckBoxDP* pData =
-        static_cast<IFWL_CheckBoxDP*>(m_pProperties->m_pDataProvider);
-    FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface);
-    rect.width += fCheckBox;
-    if (rect.height < fCheckBox) {
-      rect.height = fCheckBox;
-    }
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CheckBoxImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  UpdateTextOutStyles();
-  Layout();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_CheckBoxImp::DrawWidget(CFX_Graphics* pGraphics,
-                                     const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_CKB_Border, m_pProperties->m_pThemeProvider,
-               pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_CKB_Edge, pTheme, pMatrix);
-  }
-  int32_t dwStates = GetPartStates();
-  {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_CKB_Background;
-    param.m_dwStates = dwStates;
-    param.m_pGraphics = pGraphics;
-    if (pMatrix) {
-      param.m_matrix.Concat(*pMatrix);
-    }
-    param.m_rtPart = m_rtClient;
-    if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-      param.m_pData = &m_rtFocus;
-    }
-    pTheme->DrawBackground(&param);
-    param.m_iPart = FWL_PART_CKB_CheckBox;
-    param.m_rtPart = m_rtBox;
-    pTheme->DrawBackground(&param);
-  }
-  if (!m_pProperties->m_pDataProvider)
-    return FWL_ERR_Indefinite;
-  {
-    CFX_WideString wsCaption;
-    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
-    int32_t iLen = wsCaption.GetLength();
-    if (iLen <= 0)
-      return FWL_ERR_Indefinite;
-    CFWL_ThemeText textParam;
-    textParam.m_pWidget = m_pInterface;
-    textParam.m_iPart = FWL_PART_CKB_Caption;
-    textParam.m_dwStates = dwStates;
-    textParam.m_pGraphics = pGraphics;
-    if (pMatrix) {
-      textParam.m_matrix.Concat(*pMatrix);
-    }
-    textParam.m_rtPart = m_rtCaption;
-    textParam.m_wsText = wsCaption;
-    textParam.m_dwTTOStyles = m_dwTTOStyles;
-    textParam.m_iTTOAlign = m_iTTOAlign;
-    pTheme->DrawText(&textParam);
-  }
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_CheckBoxImp::GetCheckState() {
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) &&
-      ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-       FWL_STATE_CKB_Neutral)) {
-    return 2;
-  }
-  if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-      FWL_STATE_CKB_Checked) {
-    return 1;
-  }
-  return 0;
-}
-FWL_ERR CFWL_CheckBoxImp::SetCheckState(int32_t iCheck) {
-  m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
-  switch (iCheck) {
-    case 0: {
-      break;
-    }
-    case 1: {
-      m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
-      break;
-    }
-    case 2: {
-      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
-        m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral;
-      }
-      break;
-    }
-    default: {}
-  }
-  Repaint(&m_rtClient);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_CheckBoxImp::Layout() {
-  int32_t width = int32_t(m_pProperties->m_rtWidget.width + 0.5f);
-  int32_t height = int32_t(m_pProperties->m_rtWidget.height + 0.5f);
-  m_pProperties->m_rtWidget.width = (FX_FLOAT)width;
-  m_pProperties->m_rtWidget.height = (FX_FLOAT)height;
-  GetClientRect(m_rtClient);
-  FX_FLOAT fBoxTop = m_rtClient.top;
-  FX_FLOAT fBoxLeft = m_rtClient.left;
-  FX_FLOAT fTextLeft = 0.0, fTextRight = 0.0;
-  FX_FLOAT fClientRight = m_rtClient.right();
-  FX_FLOAT fClientBottom = m_rtClient.bottom();
-  if (!m_pProperties->m_pDataProvider)
-    return;
-  IFWL_CheckBoxDP* pData =
-      static_cast<IFWL_CheckBoxDP*>(m_pProperties->m_pDataProvider);
-  FX_FLOAT fCheckBox = pData->GetBoxSize(m_pInterface);
-  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) {
-    case FWL_STYLEEXT_CKB_Top: {
-      fBoxTop = m_rtClient.top;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Bottom: {
-      fBoxTop = fClientBottom - fCheckBox;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_VCenter:
-    default: {
-      fBoxTop = m_rtClient.top + (m_rtClient.height - fCheckBox) / 2;
-      fBoxTop = FXSYS_floor(fBoxTop);
-    }
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_LeftText) {
-    fBoxLeft = fClientRight - fCheckBox;
-    fTextLeft = m_rtClient.left;
-    fTextRight = fBoxLeft;
-  } else {
-    fTextLeft = fBoxLeft + fCheckBox;
-    fTextRight = fClientRight;
-  }
-  m_rtBox.Set(fBoxLeft, fBoxTop, fCheckBox, fCheckBox);
-  m_rtCaption.Set(fTextLeft, m_rtClient.top, fTextRight - fTextLeft,
-                  m_rtClient.height);
-  m_rtCaption.Inflate(-FWL_CKB_CaptionMargin, -FWL_CKB_CaptionMargin);
-  CFX_RectF rtFocus;
-  rtFocus.Set(m_rtCaption.left, m_rtCaption.top, m_rtCaption.width,
-              m_rtCaption.height);
-  CFX_WideString wsCaption;
-  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
-  if (wsCaption.IsEmpty()) {
-    m_rtFocus.Set(0, 0, 0, 0);
-  } else {
-    CalcTextRect(wsCaption, m_pProperties->m_pThemeProvider, m_dwTTOStyles,
-                 m_iTTOAlign, rtFocus);
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) == 0) {
-      FX_FLOAT fWidth = std::max(m_rtCaption.width, rtFocus.width);
-      FX_FLOAT fHeight = std::min(m_rtCaption.height, rtFocus.height);
-      FX_FLOAT fLeft = m_rtCaption.left;
-      FX_FLOAT fTop = m_rtCaption.top;
-      if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_HLayoutMask) ==
-          FWL_STYLEEXT_CKB_Center) {
-        fLeft = m_rtCaption.left + (m_rtCaption.width - fWidth) / 2;
-      } else if ((m_pProperties->m_dwStyleExes &
-                  FWL_STYLEEXT_CKB_HLayoutMask) == FWL_STYLEEXT_CKB_Right) {
-        fLeft = m_rtCaption.right() - fWidth;
-      }
-      if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_VLayoutMask) ==
-          FWL_STYLEEXT_CKB_VCenter) {
-        fTop = m_rtCaption.top + (m_rtCaption.height - fHeight) / 2;
-      } else if ((m_pProperties->m_dwStyleExes &
-                  FWL_STYLEEXT_CKB_VLayoutMask) == FWL_STYLEEXT_CKB_Bottom) {
-        fTop = m_rtCaption.bottom() - fHeight;
-      }
-      m_rtFocus.Set(fLeft, fTop, fWidth, fHeight);
-    } else {
-      m_rtFocus.Set(rtFocus.left, rtFocus.top, rtFocus.width, rtFocus.height);
-    }
-    m_rtFocus.Inflate(1, 1);
-  }
-}
-FX_DWORD CFWL_CheckBoxImp::GetPartStates() {
-  int32_t dwStates = FWL_PARTSTATE_CKB_UnChecked;
-  if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-      FWL_STATE_CKB_Neutral) {
-    dwStates = FWL_PARTSTATE_CKB_Neutral;
-  } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-             FWL_STATE_CKB_Checked) {
-    dwStates = FWL_PARTSTATE_CKB_Checked;
-  }
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    dwStates |= FWL_PARTSTATE_CKB_Disabled;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) {
-    dwStates |= FWL_PARTSTATE_CKB_Hovered;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
-    dwStates |= FWL_PARTSTATE_CKB_Pressed;
-  } else {
-    dwStates |= FWL_PARTSTATE_CKB_Normal;
-  }
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    dwStates |= FWL_PARTSTATE_CKB_Focused;
-  }
-  return dwStates;
-}
-void CFWL_CheckBoxImp::UpdateTextOutStyles() {
-  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  switch (m_pProperties->m_dwStyleExes &
-          (FWL_STYLEEXT_CKB_HLayoutMask | FWL_STYLEEXT_CKB_VLayoutMask)) {
-    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopRight;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Left | FWL_STYLEEXT_CKB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Center | FWL_STYLEEXT_CKB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter;
-      break;
-    }
-    case FWL_STYLEEXT_CKB_Right | FWL_STYLEEXT_CKB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight;
-      break;
-    }
-    default: {}
-  }
-  m_dwTTOStyles = 0;
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
-    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_MultiLine) {
-    m_dwTTOStyles |= FDE_TTOSTYLE_LineWrap;
-  } else {
-    m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine;
-  }
-}
-void CFWL_CheckBoxImp::NextStates() {
-  FX_DWORD dwFirststate = m_pProperties->m_dwStates;
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_RadioButton) {
-    if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-        FWL_STATE_CKB_Unchecked) {
-      CFWL_WidgetMgr* pWidgetMgr =
-          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-      if (!pWidgetMgr->IsFormDisabled()) {
-        CFX_PtrArray radioarr;
-        pWidgetMgr->GetSameGroupRadioButton(m_pInterface, radioarr);
-        IFWL_CheckBox* pCheckBox = NULL;
-        int32_t iCount = radioarr.GetSize();
-        for (int32_t i = 0; i < iCount; i++) {
-          pCheckBox = static_cast<IFWL_CheckBox*>(radioarr[i]);
-          if (pCheckBox != m_pInterface &&
-              pCheckBox->GetStates() & FWL_STATE_CKB_Checked) {
-            pCheckBox->SetCheckState(0);
-            CFX_RectF rt;
-            pCheckBox->GetWidgetRect(rt);
-            rt.left = rt.top = 0;
-            m_pWidgetMgr->RepaintWidget(pCheckBox, &rt);
-            break;
-          }
-        }
-      }
-      m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
-    }
-  } else {
-    if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-        FWL_STATE_CKB_Neutral) {
-      m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
-      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
-        m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
-      }
-    } else if ((m_pProperties->m_dwStates & FWL_STATE_CKB_CheckMask) ==
-               FWL_STATE_CKB_Checked) {
-      m_pProperties->m_dwStates &= ~FWL_STATE_CKB_CheckMask;
-    } else {
-      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CKB_3State) {
-        m_pProperties->m_dwStates |= FWL_STATE_CKB_Neutral;
-      } else {
-        m_pProperties->m_dwStates |= FWL_STATE_CKB_Checked;
-      }
-    }
-  }
-  Repaint(&m_rtClient);
-  FX_DWORD dwLaststate = m_pProperties->m_dwStates;
-  if (dwFirststate != dwLaststate) {
-    CFWL_EvtCkbCheckStateChanged wmCheckBoxState;
-    wmCheckBoxState.m_pSrcTarget = m_pInterface;
-    DispatchEvent(&wmCheckBoxState);
-  }
-}
-CFWL_CheckBoxImpDelegate::CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_CheckBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  int32_t iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_Activate: {
-      OnActivate(pMessage);
-      break;
-    }
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
-      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
-        OnKeyDown(pKey);
-      }
-      break;
-    }
-    default: { iRet = 0; }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_CheckBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                               const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_CheckBoxImpDelegate::OnActivate(CFWL_Message* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
-}
-void CFWL_CheckBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                              FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-  }
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
-}
-void CFWL_CheckBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    return;
-  }
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  m_pOwner->m_bBtnDown = TRUE;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
-}
-void CFWL_CheckBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_bBtnDown) {
-    return;
-  }
-  m_pOwner->m_bBtnDown = FALSE;
-  if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    return;
-  }
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
-  m_pOwner->NextStates();
-}
-void CFWL_CheckBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    return;
-  }
-  FX_BOOL bRepaint = FALSE;
-  if (m_pOwner->m_bBtnDown) {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) == 0) {
-        bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
-      }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered)) {
-        bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
-      }
-    } else {
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
-        bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
-      }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
-        bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-      }
-    }
-  } else {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
-        bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-      }
-    }
-  }
-  if (bRepaint) {
-    m_pOwner->Repaint(&(m_pOwner->m_rtBox));
-  }
-}
-void CFWL_CheckBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bBtnDown) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
-  }
-  m_pOwner->Repaint(&(m_pOwner->m_rtBox));
-}
-void CFWL_CheckBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
-    m_pOwner->DispatchKeyEvent(pMsg);
-    return;
-  }
-  if (pMsg->m_dwKeyCode == FWL_VKEY_Return ||
-      pMsg->m_dwKeyCode == FWL_VKEY_Space) {
-    m_pOwner->NextStates();
-  }
-}
diff --git a/xfa/src/fwl/basewidget/fwl_checkboximp.h b/xfa/src/fwl/basewidget/fwl_checkboximp.h
deleted file mode 100644
index 98702aa..0000000
--- a/xfa/src/fwl/basewidget/fwl_checkboximp.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_CheckBoxImpDelegate;
-
-class CFWL_CheckBoxImp : public CFWL_WidgetImp {
- public:
-  CFWL_CheckBoxImp(const CFWL_WidgetImpProperties& properties,
-                   IFWL_Widget* pOuter);
-  ~CFWL_CheckBoxImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual int32_t GetCheckState();
-  virtual FWL_ERR SetCheckState(int32_t iCheck);
-
- protected:
-  void Layout();
-  FX_DWORD GetPartStates();
-  void UpdateTextOutStyles();
-  void NextStates();
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtBox;
-  CFX_RectF m_rtCaption;
-  CFX_RectF m_rtFocus;
-  FX_DWORD m_dwTTOStyles;
-  int32_t m_iTTOAlign;
-  FX_BOOL m_bBtnDown;
-  friend class CFWL_CheckBoxImpDelegate;
-};
-class CFWL_CheckBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_CheckBoxImpDelegate(CFWL_CheckBoxImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnActivate(CFWL_Message* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  CFWL_CheckBoxImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_CHECKBOXIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_comboboximp.cpp b/xfa/src/fwl/basewidget/fwl_comboboximp.cpp
deleted file mode 100644
index 5eef96e..0000000
--- a/xfa/src/fwl/basewidget/fwl_comboboximp.cpp
+++ /dev/null
@@ -1,1819 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_comboboximp.h"
-
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-#include "xfa/src/fwl/basewidget/fwl_formproxyimp.h"
-#include "xfa/src/fwl/basewidget/fwl_listboximp.h"
-#include "xfa/src/fwl/basewidget/fwl_scrollbarimp.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-// static
-IFWL_ComboBox* IFWL_ComboBox::Create(
-    const CFWL_WidgetImpProperties& properties) {
-  IFWL_ComboBox* pComboBox = new IFWL_ComboBox;
-  CFWL_ComboBoxImp* pComboBoxImpl = new CFWL_ComboBoxImp(properties, nullptr);
-  pComboBox->SetImpl(pComboBoxImpl);
-  pComboBoxImpl->SetInterface(pComboBox);
-  return pComboBox;
-}
-IFWL_ComboBox::IFWL_ComboBox() {}
-int32_t IFWL_ComboBox::GetCurSel() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetCurSel();
-}
-FWL_ERR IFWL_ComboBox::SetCurSel(int32_t iSel) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetCurSel(iSel);
-}
-FWL_ERR IFWL_ComboBox::SetEditText(const CFX_WideString& wsText) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetEditText(wsText);
-}
-int32_t IFWL_ComboBox::GetEditTextLength() const {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetEditTextLength();
-}
-FWL_ERR IFWL_ComboBox::GetEditText(CFX_WideString& wsText,
-                                   int32_t nStart,
-                                   int32_t nCount) const {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
-      ->GetEditText(wsText, nStart, nCount);
-}
-FWL_ERR IFWL_ComboBox::SetEditSelRange(int32_t nStart, int32_t nCount) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
-      ->SetEditSelRange(nStart, nCount);
-}
-int32_t IFWL_ComboBox::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
-      ->GetEditSelRange(nIndex, nStart);
-}
-int32_t IFWL_ComboBox::GetEditLimit() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetEditLimit();
-}
-FWL_ERR IFWL_ComboBox::SetEditLimit(int32_t nLimit) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->SetEditLimit(nLimit);
-}
-FWL_ERR IFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDoClipboard(iCmd);
-}
-FX_BOOL IFWL_ComboBox::EditRedo(const CFX_ByteStringC& bsRecord) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditRedo(bsRecord);
-}
-FX_BOOL IFWL_ComboBox::EditUndo(const CFX_ByteStringC& bsRecord) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditUndo(bsRecord);
-}
-IFWL_ListBox* IFWL_ComboBox::GetListBoxt() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetListBoxt();
-}
-FX_BOOL IFWL_ComboBox::AfterFocusShowDropList() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->AfterFocusShowDropList();
-}
-FX_ERR IFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->OpenDropDownList(bActivate);
-}
-FX_BOOL IFWL_ComboBox::EditCanUndo() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanUndo();
-}
-FX_BOOL IFWL_ComboBox::EditCanRedo() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanRedo();
-}
-FX_BOOL IFWL_ComboBox::EditUndo() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditUndo();
-}
-FX_BOOL IFWL_ComboBox::EditRedo() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditRedo();
-}
-FX_BOOL IFWL_ComboBox::EditCanCopy() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanCopy();
-}
-FX_BOOL IFWL_ComboBox::EditCanCut() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanCut();
-}
-FX_BOOL IFWL_ComboBox::EditCanSelectAll() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCanSelectAll();
-}
-FX_BOOL IFWL_ComboBox::EditCopy(CFX_WideString& wsCopy) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCopy(wsCopy);
-}
-FX_BOOL IFWL_ComboBox::EditCut(CFX_WideString& wsCut) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditCut(wsCut);
-}
-FX_BOOL IFWL_ComboBox::EditPaste(const CFX_WideString& wsPaste) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditPaste(wsPaste);
-}
-FX_BOOL IFWL_ComboBox::EditSelectAll() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditSelectAll();
-}
-FX_BOOL IFWL_ComboBox::EditDelete() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDelete();
-}
-FX_BOOL IFWL_ComboBox::EditDeSelect() {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->EditDeSelect();
-}
-FWL_ERR IFWL_ComboBox::GetBBox(CFX_RectF& rect) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())->GetBBox(rect);
-}
-FWL_ERR IFWL_ComboBox::EditModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                          FX_DWORD dwStylesExRemoved) {
-  return static_cast<CFWL_ComboBoxImp*>(GetImpl())
-      ->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-
-CFWL_ComboEditImp::CFWL_ComboEditImp(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter)
-    : CFWL_EditImp(properties, pOuter) {
-  m_pOuter = static_cast<CFWL_ComboBoxImp*>(pOuter->GetImpl());
-}
-
-CFWL_ComboEditImpDelegate::CFWL_ComboEditImpDelegate(CFWL_ComboEditImp* pOwner)
-    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
-int32_t CFWL_ComboEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  FX_BOOL backDefault = TRUE;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      if (dwMsgCode == FWL_MSGHASH_SetFocus) {
-        m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-      } else {
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-      }
-      backDefault = FALSE;
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      if ((pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) &&
-          ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)) {
-        m_pOwner->SetSelected();
-        m_pOwner->SetComboBoxFocus(TRUE);
-      }
-      break;
-    }
-    default: {}
-  }
-  if (!backDefault) {
-    return 1;
-  }
-  return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
-}
-void CFWL_ComboEditImp::ClearSelected() {
-  ClearSelections();
-  Repaint(&m_rtClient);
-}
-void CFWL_ComboEditImp::SetSelected() {
-  FlagFocus(TRUE);
-  EndCaret();
-  AddSelRange(0);
-}
-void CFWL_ComboEditImp::EndCaret() {
-  m_pEdtEngine->MoveCaretPos(MC_End);
-}
-void CFWL_ComboEditImp::FlagFocus(FX_BOOL bSet) {
-  if (bSet) {
-    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    ShowCaret(FALSE);
-  }
-}
-void CFWL_ComboEditImp::SetComboBoxFocus(FX_BOOL bSet) {
-  m_pOuter->SetFocus(bSet);
-}
-CFWL_ComboListImp::CFWL_ComboListImp(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter)
-    : CFWL_ListBoxImp(properties, pOuter), m_bNotifyOwner(TRUE) {
-  FXSYS_assert(pOuter != NULL);
-}
-FWL_ERR CFWL_ComboListImp::Initialize() {
-  if (CFWL_ListBoxImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  delete m_pDelegate;
-  m_pDelegate = new CFWL_ComboListImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboListImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_ListBoxImp::Finalize();
-}
-int32_t CFWL_ComboListImp::MatchItem(const CFX_WideString& wsMatch) {
-  if (wsMatch.IsEmpty()) {
-    return -1;
-  }
-  if (!m_pProperties->m_pDataProvider)
-    return -1;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    CFX_WideString wsText;
-    pData->GetItemText(m_pInterface, hItem, wsText);
-    FX_STRSIZE pos = wsText.Find(wsMatch.c_str());
-    if (!pos) {
-      return i;
-    }
-  }
-  return -1;
-}
-void CFWL_ComboListImp::ChangeSelected(int32_t iSel) {
-  if (!m_pProperties->m_pDataProvider)
-    return;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel);
-  CFX_RectF rtInvalidate;
-  rtInvalidate.Reset();
-  FWL_HLISTITEM hOld = GetSelItem(0);
-  int32_t iOld = pData->GetItemIndex(m_pInterface, hOld);
-  if (iOld == iSel) {
-    return;
-  } else if (iOld > -1) {
-    GetItemRect(iOld, rtInvalidate);
-    SetSelItem(hOld, FALSE);
-  }
-  if (hItem) {
-    CFX_RectF rect;
-    GetItemRect(iSel, rect);
-    rtInvalidate.Union(rect);
-    FWL_HLISTITEM hSel = pData->GetItem(m_pInterface, iSel);
-    SetSelItem(hSel, TRUE);
-  }
-  if (!rtInvalidate.IsEmpty()) {
-    Repaint(&rtInvalidate);
-  }
-}
-int32_t CFWL_ComboListImp::CountItems() {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  return pData ? pData->CountItems(m_pInterface) : 0;
-}
-void CFWL_ComboListImp::GetItemRect(int32_t nIndex, CFX_RectF& rtItem) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, nIndex);
-  pData->GetItemRect(m_pInterface, hItem, rtItem);
-}
-void CFWL_ComboListImp::ClientToOuter(FX_FLOAT& fx, FX_FLOAT& fy) {
-  fx += m_pProperties->m_rtWidget.left, fy += m_pProperties->m_rtWidget.top;
-  IFWL_Widget* pOwner = GetOwner();
-  if (!pOwner)
-    return;
-  pOwner->TransformTo(m_pOuter, fx, fy);
-}
-void CFWL_ComboListImp::SetFocus(FX_BOOL bSet) {
-  CFWL_WidgetImp::SetFocus(bSet);
-}
-CFWL_ComboListImpDelegate::CFWL_ComboListImpDelegate(CFWL_ComboListImp* pOwner)
-    : CFWL_ListBoxImpDelegate(pOwner), m_pOwner(pOwner) {}
-int32_t CFWL_ComboListImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwHashCode = pMessage->GetClassID();
-  FX_BOOL backDefault = TRUE;
-  if (dwHashCode == FWL_MSGHASH_SetFocus ||
-      dwHashCode == FWL_MSGHASH_KillFocus) {
-    OnDropListFocusChanged(pMessage, dwHashCode == FWL_MSGHASH_SetFocus);
-  } else if (dwHashCode == FWL_MSGHASH_Mouse) {
-    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
-      CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
-      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
-        pMsg->m_fx -= rect.left;
-        pMsg->m_fy -= rect.top;
-        IFWL_WidgetDelegate* pDelegate =
-            m_pOwner->m_pVertScrollBar->SetDelegate(NULL);
-        return pDelegate->OnProcessMessage(pMsg);
-      }
-    }
-    FX_DWORD dwCmd = pMsg->m_dwCmd;
-    switch (dwCmd) {
-      case FWL_MSGMOUSECMD_MouseMove: {
-        backDefault = FALSE;
-        OnDropListMouseMove(pMsg);
-        break;
-      }
-      case FWL_MSGMOUSECMD_LButtonDown: {
-        backDefault = FALSE;
-        OnDropListLButtonDown(pMsg);
-        break;
-      }
-      case FWL_MSGMOUSECMD_LButtonUp: {
-        backDefault = FALSE;
-        OnDropListLButtonUp(pMsg);
-        break;
-      }
-      default: {}
-    }
-  } else if (dwHashCode == FWL_MSGHASH_Key) {
-    backDefault = !OnDropListKey(static_cast<CFWL_MsgKey*>(pMessage));
-  }
-  if (!backDefault) {
-    return 1;
-  }
-  return CFWL_ListBoxImpDelegate::OnProcessMessage(pMessage);
-}
-void CFWL_ComboListImpDelegate::OnDropListFocusChanged(CFWL_Message* pMsg,
-                                                       FX_BOOL bSet) {
-  if (!bSet) {
-    CFWL_MsgKillFocus* pKill = static_cast<CFWL_MsgKillFocus*>(pMsg);
-    CFWL_ComboBoxImp* pOuter =
-        static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-    if (pKill->m_pSetFocus == m_pOwner->m_pOuter ||
-        pKill->m_pSetFocus == pOuter->m_pEdit.get()) {
-      pOuter->ShowDropList(FALSE);
-    }
-  }
-}
-int32_t CFWL_ComboListImpDelegate::OnDropListMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->m_bNotifyOwner) {
-      m_pOwner->m_bNotifyOwner = FALSE;
-    }
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
-      CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
-      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
-        return 1;
-      }
-    }
-    FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-    if (hItem) {
-      if (!m_pOwner->m_pProperties->m_pDataProvider)
-        return 0;
-      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
-          m_pOwner->m_pProperties->m_pDataProvider);
-      int32_t iSel = pData->GetItemIndex(m_pOwner->m_pInterface, hItem);
-      CFWL_EvtCmbHoverChanged event;
-      event.m_pSrcTarget = m_pOwner->m_pOuter;
-      event.m_iCurHover = iSel;
-      m_pOwner->DispatchEvent(&event);
-      m_pOwner->ChangeSelected(iSel);
-    }
-  } else if (m_pOwner->m_bNotifyOwner) {
-    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
-    CFWL_ComboBoxImp* pOuter =
-        static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-    pOuter->m_pDelegate->OnProcessMessage(pMsg);
-  }
-  return 1;
-}
-int32_t CFWL_ComboListImpDelegate::OnDropListLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    return 0;
-  }
-  CFWL_ComboBoxImp* pOuter =
-      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-  pOuter->ShowDropList(FALSE);
-  return 1;
-}
-int32_t CFWL_ComboListImpDelegate::OnDropListLButtonUp(CFWL_MsgMouse* pMsg) {
-  CFWL_ComboBoxImp* pOuter =
-      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-  if (m_pOwner->m_bNotifyOwner) {
-    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
-    pOuter->m_pDelegate->OnProcessMessage(pMsg);
-  } else {
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
-      CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
-      if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
-        return 1;
-      }
-    }
-    pOuter->ShowDropList(FALSE);
-    FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-    if (hItem) {
-      pOuter->ProcessSelChanged(TRUE);
-    }
-  }
-  return 1;
-}
-int32_t CFWL_ComboListImpDelegate::OnDropListKey(CFWL_MsgKey* pKey) {
-  CFWL_ComboBoxImp* pOuter =
-      static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-  FX_BOOL bPropagate = FALSE;
-  if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
-    FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
-    switch (dwKeyCode) {
-      case FWL_VKEY_Return:
-      case FWL_VKEY_Escape: {
-        pOuter->ShowDropList(FALSE);
-        return 1;
-      }
-      case FWL_VKEY_Up:
-      case FWL_VKEY_Down: {
-        OnDropListKeyDown(pKey);
-        pOuter->SetDelegate(nullptr);
-        pOuter->ProcessSelChanged(FALSE);
-        return 1;
-      }
-      default: { bPropagate = TRUE; }
-    }
-  } else if (pKey->m_dwCmd == FWL_MSGKEYCMD_Char) {
-    bPropagate = TRUE;
-  }
-  if (bPropagate) {
-    pKey->m_pDstTarget = m_pOwner->m_pOuter;
-    pOuter->m_pDelegate->OnProcessMessage(pKey);
-    return 1;
-  }
-  return 0;
-}
-void CFWL_ComboListImpDelegate::OnDropListKeyDown(CFWL_MsgKey* pKey) {
-  FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
-  switch (dwKeyCode) {
-    case FWL_VKEY_Up:
-    case FWL_VKEY_Down:
-    case FWL_VKEY_Home:
-    case FWL_VKEY_End: {
-      CFWL_ComboBoxImp* pOuter =
-          static_cast<CFWL_ComboBoxImp*>(m_pOwner->m_pOuter->GetImpl());
-      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
-          m_pOwner->m_pProperties->m_pDataProvider);
-      FWL_HLISTITEM hItem =
-          pData->GetItem(m_pOwner->m_pInterface, pOuter->m_iCurSel);
-      hItem = m_pOwner->GetItem(hItem, dwKeyCode);
-      if (!hItem) {
-        break;
-      }
-      m_pOwner->SetSelection(hItem, hItem, TRUE);
-      m_pOwner->ScrollToVisible(hItem);
-      CFX_RectF rtInvalidate;
-      rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                       m_pOwner->m_pProperties->m_rtWidget.height);
-      m_pOwner->Repaint(&rtInvalidate);
-      break;
-    }
-    default: {}
-  }
-}
-CFWL_ComboBoxImp::CFWL_ComboBoxImp(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_pForm(NULL),
-      m_bLButtonDown(FALSE),
-      m_iCurSel(-1),
-      m_iBtnState(FWL_PARTSTATE_CMB_Normal),
-      m_fComboFormHandler(0),
-      m_bNeedShowList(FALSE) {
-  m_rtClient.Reset();
-  m_rtBtn.Reset();
-  m_rtHandler.Reset();
-}
-CFWL_ComboBoxImp::~CFWL_ComboBoxImp() {}
-FWL_ERR CFWL_ComboBoxImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_ComboBox;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ComboBoxImp::GetClassID() const {
-  return FWL_CLASSHASH_ComboBox;
-}
-FWL_ERR CFWL_ComboBoxImp::Initialize() {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_Initialize();
-  }
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_WGTSTATE_Invisible;  // Probably a bug; not a FWL_ERR_ value.
-  m_pDelegate = new CFWL_ComboBoxImpDelegate(this);
-  CFWL_WidgetImpProperties prop;
-  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  prop.m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemIconText) {
-    prop.m_dwStyleExes |= FWL_STYLEEXT_LTB_Icon;
-  }
-  prop.m_pDataProvider = m_pProperties->m_pDataProvider;
-  m_pListBox.reset(IFWL_ListBox::CreateComboList(prop, m_pInterface));
-  m_pListBox->Initialize();
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) {
-    CFWL_WidgetImpProperties prop2;
-    m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop2, m_pInterface));
-    m_pEdit->Initialize();
-    static_cast<CFWL_EditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
-  }
-  if (m_pEdit) {
-    m_pEdit->SetParent(m_pInterface);
-  }
-  SetStates(m_pProperties->m_dwStates);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::Finalize() {
-  if (m_pEdit) {
-    m_pEdit->Finalize();
-  }
-  m_pListBox->Finalize();
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_ComboBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Reset();
-    FX_BOOL bIsDropDown = IsDropDownStyle();
-    if (bIsDropDown && m_pEdit) {
-      m_pEdit->GetWidgetRect(rect, TRUE);
-    } else {
-      rect.width = 100;
-      rect.height = 16;
-    }
-    if (!m_pProperties->m_pThemeProvider) {
-      ReSetTheme();
-    }
-    FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
-        GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-    if (!pFWidth)
-      return FWL_ERR_Indefinite;
-    rect.Inflate(0, 0, *pFWidth, 0);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                         FX_DWORD dwStylesExRemoved) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-  }
-  FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown;
-  FX_BOOL bRemoveDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown;
-  if (bAddDropDown && !m_pEdit) {
-    CFWL_WidgetImpProperties prop;
-    m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop, nullptr));
-    m_pEdit->Initialize();
-    static_cast<CFWL_EditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
-    m_pEdit->SetParent(m_pInterface);
-  } else if (bRemoveDropDown && m_pEdit) {
-    m_pEdit->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-FWL_ERR CFWL_ComboBoxImp::Update() {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_Update();
-  }
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  ReSetTheme();
-  FX_BOOL bDropDown = IsDropDownStyle();
-  if (bDropDown && m_pEdit) {
-    ReSetEditAlignment();
-  }
-  if (m_pProperties->m_pThemeProvider == NULL) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  Layout();
-  CFWL_ThemePart part;
-  part.m_pWidget = m_pInterface;
-  m_fComboFormHandler =
-      *static_cast<FX_FLOAT*>(m_pProperties->m_pThemeProvider->GetCapacity(
-          &part, FWL_WGTCAPACITY_CMB_ComboFormHandler));
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ComboBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_HitTest(fx, fy);
-  }
-  return CFWL_WidgetImp::HitTest(fx, fy);
-}
-FWL_ERR CFWL_ComboBoxImp::DrawWidget(CFX_Graphics* pGraphics,
-                                     const CFX_Matrix* pMatrix) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_DrawWidget(pGraphics, pMatrix);
-  }
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  FX_BOOL bIsDropDown = IsDropDownStyle();
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_CMB_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_CMB_Edge, pTheme, pMatrix);
-  }
-  if (!bIsDropDown) {
-    CFX_RectF rtTextBk(m_rtClient);
-    rtTextBk.width -= m_rtBtn.width;
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_CMB_Background;
-    param.m_pGraphics = pGraphics;
-    if (pMatrix) {
-      param.m_matrix.Concat(*pMatrix);
-    }
-    param.m_rtPart = rtTextBk;
-    if (m_iCurSel >= 0) {
-      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
-          static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-              ->m_pProperties->m_pDataProvider);
-      void* p = pData->GetItemData(m_pListBox.get(),
-                                   pData->GetItem(m_pListBox.get(), m_iCurSel));
-      if (p != NULL) {
-        param.m_pData = p;
-      }
-    }
-    if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-      param.m_dwStates = FWL_PARTSTATE_CMB_Disabled;
-    } else if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
-               (m_iCurSel >= 0)) {
-      param.m_dwStates = FWL_PARTSTATE_CMB_Selected;
-    } else {
-      param.m_dwStates = FWL_PARTSTATE_CMB_Normal;
-    }
-    pTheme->DrawBackground(&param);
-    if (m_iCurSel >= 0) {
-      if (!m_pListBox)
-        return FWL_ERR_Indefinite;
-      CFX_WideString wsText;
-      IFWL_ComboBoxDP* pData =
-          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-          ->GetItemText(hItem, wsText);
-      CFWL_ThemeText param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_CMB_Caption;
-      param.m_dwStates = m_iBtnState;
-      param.m_pGraphics = pGraphics;
-      param.m_matrix.Concat(*pMatrix);
-      param.m_rtPart = rtTextBk;
-      param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
-                             ? FWL_PARTSTATE_CMB_Selected
-                             : FWL_PARTSTATE_CMB_Normal;
-      param.m_wsText = wsText;
-      param.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-      param.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
-      pTheme->DrawText(&param);
-    }
-  }
-  {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_CMB_DropDownButton;
-    param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                           ? FWL_PARTSTATE_CMB_Disabled
-                           : m_iBtnState;
-    param.m_pGraphics = pGraphics;
-    param.m_matrix.Concat(*pMatrix);
-    param.m_rtPart = m_rtBtn;
-    pTheme->DrawBackground(&param);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  if (!pThemeProvider)
-    return FWL_ERR_Indefinite;
-  m_pProperties->m_pThemeProvider = pThemeProvider;
-  if (m_pListBox && pThemeProvider->IsValidWidget(m_pListBox.get())) {
-    m_pListBox->SetThemeProvider(pThemeProvider);
-  }
-  if (m_pEdit && pThemeProvider->IsValidWidget(m_pEdit.get())) {
-    m_pEdit->SetThemeProvider(pThemeProvider);
-  }
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ComboBoxImp::GetCurSel() {
-  return m_iCurSel;
-}
-FWL_ERR CFWL_ComboBoxImp::SetCurSel(int32_t iSel) {
-  int32_t iCount =
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->CountItems();
-  FX_BOOL bClearSel = iSel < 0 || iSel >= iCount;
-  FX_BOOL bDropDown = IsDropDownStyle();
-  if (bDropDown && m_pEdit) {
-    if (bClearSel) {
-      m_pEdit->SetText(CFX_WideString());
-    } else {
-      CFX_WideString wsText;
-      IFWL_ComboBoxDP* pData =
-          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iSel);
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-          ->GetItemText(hItem, wsText);
-      m_pEdit->SetText(wsText);
-    }
-    m_pEdit->Update();
-  }
-  m_iCurSel = bClearSel ? -1 : iSel;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  FX_BOOL bIsDropDown = IsDropDownStyle();
-  if (bIsDropDown && m_pEdit) {
-    m_pEdit->SetStates(dwStates, bSet);
-  }
-  if (m_pListBox) {
-    m_pListBox->SetStates(dwStates, bSet);
-  }
-  return CFWL_WidgetImp::SetStates(dwStates, bSet);
-}
-FWL_ERR CFWL_ComboBoxImp::SetEditText(const CFX_WideString& wsText) {
-  if (!m_pEdit)
-    return FWL_ERR_Indefinite;
-  m_pEdit->SetText(wsText);
-  return m_pEdit->Update();
-}
-int32_t CFWL_ComboBoxImp::GetEditTextLength() const {
-  if (!m_pEdit)
-    return -1;
-  return m_pEdit->GetTextLength();
-}
-FWL_ERR CFWL_ComboBoxImp::GetEditText(CFX_WideString& wsText,
-                                      int32_t nStart,
-                                      int32_t nCount) const {
-  if (m_pEdit) {
-    return m_pEdit->GetText(wsText, nStart, nCount);
-  } else if (m_pListBox) {
-    IFWL_ComboBoxDP* pData =
-        static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
-    return m_pListBox->GetItemText(hItem, wsText);
-  }
-  return FWL_ERR_Indefinite;
-}
-FWL_ERR CFWL_ComboBoxImp::SetEditSelRange(int32_t nStart, int32_t nCount) {
-  if (!m_pEdit)
-    return FWL_ERR_Indefinite;
-  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->ClearSelected();
-  m_pEdit->AddSelRange(nStart, nCount);
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ComboBoxImp::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!m_pEdit)
-    return -1;
-  return m_pEdit->GetSelRange(nIndex, nStart);
-}
-int32_t CFWL_ComboBoxImp::GetEditLimit() {
-  if (!m_pEdit)
-    return -1;
-  return m_pEdit->GetLimit();
-}
-FWL_ERR CFWL_ComboBoxImp::SetEditLimit(int32_t nLimit) {
-  if (!m_pEdit)
-    return FWL_ERR_Indefinite;
-  return m_pEdit->SetLimit(nLimit);
-}
-FWL_ERR CFWL_ComboBoxImp::EditDoClipboard(int32_t iCmd) {
-  if (!m_pEdit)
-    return FWL_ERR_Indefinite;
-  return m_pEdit->DoClipboard(iCmd);
-}
-FX_BOOL CFWL_ComboBoxImp::EditRedo(const CFX_ByteStringC& bsRecord) {
-  if (!m_pEdit)
-    return FALSE;
-  return m_pEdit->Redo(bsRecord);
-}
-FX_BOOL CFWL_ComboBoxImp::EditUndo(const CFX_ByteStringC& bsRecord) {
-  if (!m_pEdit)
-    return FALSE;
-  return m_pEdit->Undo(bsRecord);
-}
-IFWL_ListBox* CFWL_ComboBoxImp::GetListBoxt() {
-  return m_pListBox.get();
-}
-FX_BOOL CFWL_ComboBoxImp::AfterFocusShowDropList() {
-  if (!m_bNeedShowList) {
-    return FALSE;
-  }
-  if (m_pEdit) {
-    MatchEditText();
-  }
-  ShowDropList(TRUE);
-  m_bNeedShowList = FALSE;
-  return TRUE;
-}
-FX_ERR CFWL_ComboBoxImp::OpenDropDownList(FX_BOOL bActivate) {
-  ShowDropList(bActivate);
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_ComboBoxImp::EditCanUndo() {
-  return m_pEdit->CanUndo();
-}
-FX_BOOL CFWL_ComboBoxImp::EditCanRedo() {
-  return m_pEdit->CanRedo();
-}
-FX_BOOL CFWL_ComboBoxImp::EditUndo() {
-  return m_pEdit->Undo();
-}
-FX_BOOL CFWL_ComboBoxImp::EditRedo() {
-  return m_pEdit->Redo();
-}
-FX_BOOL CFWL_ComboBoxImp::EditCanCopy() {
-  return m_pEdit->CountSelRanges() > 0;
-}
-FX_BOOL CFWL_ComboBoxImp::EditCanCut() {
-  if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
-    return FALSE;
-  }
-  return m_pEdit->CountSelRanges() > 0;
-}
-FX_BOOL CFWL_ComboBoxImp::EditCanSelectAll() {
-  return m_pEdit->GetTextLength() > 0;
-}
-FX_BOOL CFWL_ComboBoxImp::EditCopy(CFX_WideString& wsCopy) {
-  return m_pEdit->Copy(wsCopy);
-}
-FX_BOOL CFWL_ComboBoxImp::EditCut(CFX_WideString& wsCut) {
-  return m_pEdit->Cut(wsCut);
-}
-FX_BOOL CFWL_ComboBoxImp::EditPaste(const CFX_WideString& wsPaste) {
-  return m_pEdit->Paste(wsPaste);
-}
-FX_BOOL CFWL_ComboBoxImp::EditSelectAll() {
-  return m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_ComboBoxImp::EditDelete() {
-  return m_pEdit->ClearText() == FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_ComboBoxImp::EditDeSelect() {
-  return m_pEdit->ClearSelections() == FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::GetBBox(CFX_RectF& rect) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_GetBBox(rect);
-  }
-  rect = m_pProperties->m_rtWidget;
-  if (m_pListBox && IsDropListShowed()) {
-    CFX_RectF rtList;
-    m_pListBox->GetWidgetRect(rtList);
-    rtList.Offset(rect.left, rect.top);
-    rect.Union(rtList);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::EditModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                             FX_DWORD dwStylesExRemoved) {
-  if (m_pEdit != NULL) {
-    return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-  } else {
-    return FWL_ERR_Parameter_Invalid;
-  }
-}
-FX_FLOAT CFWL_ComboBoxImp::GetListHeight() {
-  return static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider)
-      ->GetListHeight(m_pInterface);
-}
-void CFWL_ComboBoxImp::DrawStretchHandler(CFX_Graphics* pGraphics,
-                                          const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pGraphics = pGraphics;
-  param.m_iPart = FWL_PART_CMB_StretcgHandler;
-  param.m_dwStates = FWL_PARTSTATE_CMB_Normal;
-  param.m_pWidget = m_pInterface;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  param.m_rtPart = m_rtHandler;
-  m_pProperties->m_pThemeProvider->DrawBackground(&param);
-}
-void CFWL_ComboBoxImp::ShowDropList(FX_BOOL bActivate) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_ShowDropList(bActivate);
-  }
-  FX_BOOL bDropList = IsDropListShowed();
-  if (bDropList == bActivate) {
-    return;
-  }
-  if (!m_pForm) {
-    InitProxyForm();
-  }
-  m_pListProxyDelegate->Reset();
-  if (bActivate) {
-    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-        ->ChangeSelected(m_iCurSel);
-    ReSetListItemAlignment();
-    FX_DWORD dwStyleAdd = m_pProperties->m_dwStyleExes &
-                          (FWL_STYLEEXT_CMB_Sort | FWL_STYLEEXT_CMB_OwnerDraw);
-    m_pListBox->ModifyStylesEx(dwStyleAdd, 0);
-    m_pListBox->GetWidgetRect(m_rtList, TRUE);
-    FX_FLOAT fHeight = GetListHeight();
-    if (fHeight > 0) {
-      if (m_rtList.height > GetListHeight()) {
-        m_rtList.height = GetListHeight();
-        m_pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll, 0);
-      }
-    }
-    CFX_RectF rtAnchor;
-    rtAnchor.Set(0, 0, m_pProperties->m_rtWidget.width,
-                 m_pProperties->m_rtWidget.height);
-    FX_FLOAT fMinHeight = 0;
-    if (m_rtList.width < m_rtClient.width) {
-      m_rtList.width = m_rtClient.width;
-    }
-    m_rtProxy = m_rtList;
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) {
-      m_rtProxy.height += m_fComboFormHandler;
-    }
-    GetPopupPos(fMinHeight, m_rtProxy.height, rtAnchor, m_rtProxy);
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListDrag) {
-      FX_FLOAT fx = 0;
-      FX_FLOAT fy = m_rtClient.top + m_rtClient.height / 2;
-      TransformTo(NULL, fx, fy);
-      m_bUpFormHandler = fy > m_rtProxy.top;
-      if (m_bUpFormHandler) {
-        m_rtHandler.Set(0, 0, m_rtList.width, m_fComboFormHandler);
-        m_rtList.top = m_fComboFormHandler;
-      } else {
-        m_rtHandler.Set(0, m_rtList.height, m_rtList.width,
-                        m_fComboFormHandler);
-      }
-    }
-    m_pForm->SetWidgetRect(m_rtProxy);
-    m_pForm->Update();
-    m_pListBox->SetWidgetRect(m_rtList);
-    m_pListBox->Update();
-    CFWL_EvtCmbPreDropDown ev;
-    ev.m_pSrcTarget = m_pInterface;
-    DispatchEvent(&ev);
-    m_fItemHeight =
-        static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->m_fItemHeight;
-    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->SetFocus(TRUE);
-    m_pForm->DoModal();
-    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->SetFocus(FALSE);
-  } else {
-    m_pForm->EndDoModal();
-    CFWL_EvtCmbCloseUp ev;
-    ev.m_pSrcTarget = m_pInterface;
-    DispatchEvent(&ev);
-    m_bLButtonDown = FALSE;
-    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->m_bNotifyOwner =
-        TRUE;
-    SetFocus(TRUE);
-  }
-}
-FX_BOOL CFWL_ComboBoxImp::IsDropListShowed() {
-  return m_pForm && !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
-}
-FX_BOOL CFWL_ComboBoxImp::IsDropDownStyle() const {
-  return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown;
-}
-void CFWL_ComboBoxImp::MatchEditText() {
-  CFX_WideString wsText;
-  m_pEdit->GetText(wsText);
-  int32_t iMatch =
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())->MatchItem(wsText);
-  if (iMatch != m_iCurSel) {
-    static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-        ->ChangeSelected(iMatch);
-    if (iMatch >= 0) {
-      SynchrEditText(iMatch);
-    }
-  } else if (iMatch >= 0) {
-    static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
-  }
-  m_iCurSel = iMatch;
-}
-void CFWL_ComboBoxImp::SynchrEditText(int32_t iListItem) {
-  CFX_WideString wsText;
-  IFWL_ComboBoxDP* pData =
-      static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-  FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iListItem);
-  static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-      ->GetItemText(hItem, wsText);
-  m_pEdit->SetText(wsText);
-  m_pEdit->Update();
-  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
-}
-void CFWL_ComboBoxImp::Layout() {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_Layout();
-  }
-  GetClientRect(m_rtClient);
-  FX_FLOAT* pFWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pFWidth)
-    return;
-  FX_FLOAT fBtn = *pFWidth;
-  m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn,
-              m_rtClient.height);
-  FX_BOOL bIsDropDown = IsDropDownStyle();
-  if (bIsDropDown && m_pEdit) {
-    CFX_RectF rtEdit;
-    rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
-               m_rtClient.height);
-    m_pEdit->SetWidgetRect(rtEdit);
-    if (m_iCurSel >= 0) {
-      CFX_WideString wsText;
-      IFWL_ComboBoxDP* pData =
-          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-          ->GetItemText(hItem, wsText);
-      m_pEdit->LockUpdate();
-      m_pEdit->SetText(wsText);
-      m_pEdit->UnlockUpdate();
-    }
-    m_pEdit->Update();
-  }
-}
-void CFWL_ComboBoxImp::ReSetTheme() {
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (!pTheme) {
-    pTheme = GetAvailableTheme();
-    m_pProperties->m_pThemeProvider = pTheme;
-  }
-  if (m_pListBox) {
-    if (!m_pListBox->GetThemeProvider() &&
-        pTheme->IsValidWidget(m_pListBox.get())) {
-      m_pListBox->SetThemeProvider(pTheme);
-    }
-  }
-  if (m_pEdit) {
-    if (!m_pEdit->GetThemeProvider() && pTheme->IsValidWidget(m_pEdit.get())) {
-      m_pEdit->SetThemeProvider(pTheme);
-    }
-  }
-}
-void CFWL_ComboBoxImp::ReSetEditAlignment() {
-  if (!m_pEdit)
-    return;
-  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
-  FX_DWORD dwAdd = 0;
-  switch (dwStylExes & FWL_STYLEEXT_CMB_EditHAlignMask) {
-    case FWL_STYLEEXT_CMB_EditHCenter: {
-      dwAdd |= FWL_STYLEEXT_EDT_HCenter;
-      break;
-    }
-    case FWL_STYLEEXT_CMB_EditHFar: {
-      dwAdd |= FWL_STYLEEXT_EDT_HFar;
-      break;
-    }
-    default: { dwAdd |= FWL_STYLEEXT_EDT_HNear; }
-  }
-  switch (dwStylExes & FWL_STYLEEXT_CMB_EditVAlignMask) {
-    case FWL_STYLEEXT_CMB_EditVCenter: {
-      dwAdd |= FWL_STYLEEXT_EDT_VCenter;
-      break;
-    }
-    case FWL_STYLEEXT_CMB_EditVFar: {
-      dwAdd |= FWL_STYLEEXT_EDT_VFar;
-      break;
-    }
-    default: { dwAdd |= FWL_STYLEEXT_EDT_VNear; }
-  }
-  if (dwStylExes & FWL_STYLEEXT_CMB_EditJustified) {
-    dwAdd |= FWL_STYLEEXT_EDT_Justified;
-  }
-  if (dwStylExes & FWL_STYLEEXT_CMB_EditDistributed) {
-    dwAdd |= FWL_STYLEEXT_EDT_Distributed;
-  }
-  m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
-                                     FWL_STYLEEXT_EDT_HAlignModeMask |
-                                     FWL_STYLEEXT_EDT_VAlignMask);
-}
-void CFWL_ComboBoxImp::ReSetListItemAlignment() {
-  if (!m_pListBox)
-    return;
-  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
-  FX_DWORD dwAdd = 0;
-  switch (dwStylExes & FWL_STYLEEXT_CMB_ListItemAlignMask) {
-    case FWL_STYLEEXT_CMB_ListItemCenterAlign: {
-      dwAdd |= FWL_STYLEEXT_LTB_CenterAlign;
-    }
-    case FWL_STYLEEXT_CMB_ListItemRightAlign: {
-      dwAdd |= FWL_STYLEEXT_LTB_RightAlign;
-    }
-    default: { dwAdd |= FWL_STYLEEXT_LTB_LeftAlign; }
-  }
-  m_pListBox->ModifyStylesEx(dwAdd, FWL_STYLEEXT_CMB_ListItemAlignMask);
-}
-void CFWL_ComboBoxImp::ProcessSelChanged(FX_BOOL bLButtonUp) {
-  IFWL_ComboBoxDP* pDatas =
-      static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-  m_iCurSel = pDatas->GetItemIndex(m_pInterface, m_pListBox->GetSelItem(0));
-  FX_BOOL bDropDown = IsDropDownStyle();
-  if (bDropDown) {
-    IFWL_ComboBoxDP* pData =
-        static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
-    if (hItem) {
-      CFX_WideString wsText;
-      pData->GetItemText(m_pInterface, hItem, wsText);
-      if (m_pEdit) {
-        m_pEdit->SetText(wsText);
-        m_pEdit->Update();
-        static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetSelected();
-      }
-      CFWL_EvtCmbSelChanged ev;
-      ev.bLButtonUp = bLButtonUp;
-      ev.m_pSrcTarget = m_pInterface;
-      ev.iArraySels.Add(m_iCurSel);
-      DispatchEvent(&ev);
-    }
-  } else {
-    Repaint(&m_rtClient);
-  }
-}
-void CFWL_ComboBoxImp::InitProxyForm() {
-  if (m_pForm)
-    return;
-  if (!m_pListBox)
-    return;
-  CFWL_WidgetImpProperties propForm;
-  propForm.m_pOwner = m_pInterface;
-  propForm.m_dwStyles = FWL_WGTSTYLE_Popup;
-  propForm.m_dwStates = FWL_WGTSTATE_Invisible;
-  CFX_WideString className;
-  m_pForm = IFWL_Form::CreateFormProxy(propForm, &className, m_pListBox.get());
-  m_pForm->Initialize();
-  m_pProxy = static_cast<CFWL_FormProxyImp*>(m_pForm->GetImpl());
-  m_pListBox->SetParent(m_pForm);
-  m_pListProxyDelegate = new CFWL_ComboProxyImpDelegate(m_pForm, this);
-  m_pProxy->SetDelegate(m_pListProxyDelegate);
-}
-FWL_ERR CFWL_ComboBoxImp::DisForm_Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_WGTSTATE_Invisible;  // Ditto.
-  m_pDelegate = new CFWL_ComboBoxImpDelegate(this);
-  DisForm_InitComboList();
-  DisForm_InitComboEdit();
-  return FWL_ERR_Succeeded;
-}
-void CFWL_ComboBoxImp::DisForm_InitComboList() {
-  if (m_pListBox) {
-    return;
-  }
-  CFWL_WidgetImpProperties prop;
-  prop.m_pParent = m_pInterface;
-  prop.m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
-  prop.m_dwStates = FWL_WGTSTATE_Invisible;
-  prop.m_pDataProvider = m_pProperties->m_pDataProvider;
-  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pListBox.reset(IFWL_ListBox::CreateComboList(prop, m_pInterface));
-  m_pListBox->Initialize();
-}
-void CFWL_ComboBoxImp::DisForm_InitComboEdit() {
-  if (m_pEdit) {
-    return;
-  }
-  CFWL_WidgetImpProperties prop;
-  prop.m_pParent = m_pInterface;
-  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pEdit.reset(IFWL_Edit::CreateComboEdit(prop, m_pInterface));
-  m_pEdit->Initialize();
-  static_cast<CFWL_ComboEditImp*>(m_pEdit->GetImpl())->SetOuter(m_pInterface);
-}
-void CFWL_ComboBoxImp::DisForm_ShowDropList(FX_BOOL bActivate) {
-  FX_BOOL bDropList = DisForm_IsDropListShowed();
-  if (bDropList == bActivate) {
-    return;
-  }
-  if (bActivate) {
-    CFWL_EvtCmbPreDropDown preEvent;
-    preEvent.m_pSrcTarget = m_pInterface;
-    DispatchEvent(&preEvent);
-    CFWL_ComboListImp* pComboList =
-        static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl());
-    int32_t iItems = pComboList->CountItems();
-    if (iItems < 1) {
-      return;
-    }
-    ReSetListItemAlignment();
-    pComboList->ChangeSelected(m_iCurSel);
-    FX_FLOAT fItemHeight = pComboList->GetItemHeigt();
-    FX_FLOAT fBorder = GetBorderSize();
-    FX_FLOAT fPopupMin = 0.0f;
-    if (iItems > 3) {
-      fPopupMin = fItemHeight * 3 + fBorder * 2;
-    }
-    FX_FLOAT fPopupMax = fItemHeight * iItems + fBorder * 2;
-    CFX_RectF rtList;
-    rtList.left = m_rtClient.left;
-    rtList.width = m_pProperties->m_rtWidget.width;
-    rtList.top = 0;
-    rtList.height = 0;
-    GetPopupPos(fPopupMin, fPopupMax, m_pProperties->m_rtWidget, rtList);
-    m_pListBox->SetWidgetRect(rtList);
-    m_pListBox->Update();
-  } else {
-    SetFocus(TRUE);
-  }
-  m_pListBox->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
-  if (bActivate) {
-    CFWL_EvtCmbPostDropDown postEvent;
-    postEvent.m_pSrcTarget = m_pInterface;
-    DispatchEvent(&postEvent);
-  }
-  CFX_RectF rect;
-  m_pListBox->GetWidgetRect(rect);
-  rect.Inflate(2, 2);
-  Repaint(&rect);
-}
-FX_BOOL CFWL_ComboBoxImp::DisForm_IsDropListShowed() {
-  return !(m_pListBox->GetStates() & FWL_WGTSTATE_Invisible);
-}
-FWL_ERR CFWL_ComboBoxImp::DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                                 FX_DWORD dwStylesExRemoved) {
-  if (!m_pEdit) {
-    DisForm_InitComboEdit();
-  }
-  FX_BOOL bAddDropDown = dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown;
-  FX_BOOL bDelDropDown = dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown;
-  dwStylesExRemoved &= ~FWL_STYLEEXT_CMB_DropDown;
-  m_pProperties->m_dwStyleExes |= FWL_STYLEEXT_CMB_DropDown;
-  if (bAddDropDown) {
-    m_pEdit->ModifyStylesEx(0, FWL_STYLEEXT_EDT_ReadOnly);
-  } else if (bDelDropDown) {
-    m_pEdit->ModifyStylesEx(FWL_STYLEEXT_EDT_ReadOnly, 0);
-  }
-  return CFWL_WidgetImp::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-FWL_ERR CFWL_ComboBoxImp::DisForm_Update() {
-  if (m_iLock) {
-    return FWL_ERR_Indefinite;
-  }
-  if (m_pEdit) {
-    ReSetEditAlignment();
-  }
-  ReSetTheme();
-  Layout();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ComboBoxImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rect;
-  rect.Set(0, 0, m_pProperties->m_rtWidget.width - m_rtBtn.width,
-           m_pProperties->m_rtWidget.height);
-  if (rect.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Edit;
-  }
-  if (m_rtBtn.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  if (DisForm_IsDropListShowed()) {
-    m_pListBox->GetWidgetRect(rect);
-    if (rect.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Client;
-    }
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FWL_ERR CFWL_ComboBoxImp::DisForm_DrawWidget(CFX_Graphics* pGraphics,
-                                             const CFX_Matrix* pMatrix) {
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFX_Matrix mtOrg;
-  mtOrg.Set(1, 0, 0, 1, 0, 0);
-  if (pMatrix) {
-    mtOrg = *pMatrix;
-  }
-  FX_BOOL bListShowed = m_pListBox && DisForm_IsDropListShowed();
-  pGraphics->SaveGraphState();
-  pGraphics->ConcatMatrix(&mtOrg);
-  if (!m_rtBtn.IsEmpty(0.1f)) {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_CMB_DropDownButton;
-    param.m_dwStates = m_iBtnState;
-    param.m_pGraphics = pGraphics;
-    param.m_rtPart = m_rtBtn;
-    pTheme->DrawBackground(&param);
-  }
-  pGraphics->RestoreGraphState();
-  if (m_pEdit) {
-    CFX_RectF rtEdit;
-    m_pEdit->GetWidgetRect(rtEdit);
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top);
-    mt.Concat(mtOrg);
-    m_pEdit->DrawWidget(pGraphics, &mt);
-  }
-  if (bListShowed) {
-    CFX_RectF rtList;
-    m_pListBox->GetWidgetRect(rtList);
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, rtList.left, rtList.top);
-    mt.Concat(mtOrg);
-    m_pListBox->DrawWidget(pGraphics, &mt);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImp::DisForm_GetBBox(CFX_RectF& rect) {
-  rect = m_pProperties->m_rtWidget;
-  if (m_pListBox && DisForm_IsDropListShowed()) {
-    CFX_RectF rtList;
-    m_pListBox->GetWidgetRect(rtList);
-    rtList.Offset(rect.left, rect.top);
-    rect.Union(rtList);
-  }
-  return FWL_ERR_Succeeded;
-}
-void CFWL_ComboBoxImp::DisForm_Layout() {
-  GetClientRect(m_rtClient);
-  m_rtContent = m_rtClient;
-  FX_FLOAT* pFWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pFWidth)
-    return;
-  FX_FLOAT borderWidth = 0;
-  { borderWidth = FWL_PART_CMB_Border; }
-  FX_FLOAT fBtn = *pFWidth;
-  if (!(GetStylesEx() & FWL_STYLEEXT_CMB_ReadOnly)) {
-    m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top + borderWidth,
-                fBtn - borderWidth, m_rtClient.height - 2 * borderWidth);
-  }
-  CFX_RectF* pUIMargin =
-      static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
-  if (pUIMargin) {
-    m_rtContent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                        pUIMargin->height);
-  }
-  FX_BOOL bIsDropDown = IsDropDownStyle();
-  if (bIsDropDown && m_pEdit) {
-    CFX_RectF rtEdit;
-    rtEdit.Set(m_rtContent.left, m_rtContent.top, m_rtContent.width - fBtn,
-               m_rtContent.height);
-    m_pEdit->SetWidgetRect(rtEdit);
-    if (m_iCurSel >= 0) {
-      CFX_WideString wsText;
-      IFWL_ComboBoxDP* pData =
-          static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, m_iCurSel);
-      static_cast<CFWL_ComboListImp*>(m_pListBox->GetImpl())
-          ->GetItemText(hItem, wsText);
-      m_pEdit->LockUpdate();
-      m_pEdit->SetText(wsText);
-      m_pEdit->UnlockUpdate();
-    }
-    m_pEdit->Update();
-  }
-}
-CFWL_ComboBoxImpDelegate::CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_ComboBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_OnProcessMessage(pMessage);
-  }
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  FX_BOOL iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      OnKey(static_cast<CFWL_MsgKey*>(pMessage));
-      break;
-    }
-    default: { iRet = 0; }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_ComboBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  FX_DWORD dwFlag = pEvent->GetClassID();
-  if (dwFlag == FWL_EVTHASH_LTB_DrawItem) {
-    CFWL_EvtLtbDrawItem* pDrawItemEvent =
-        static_cast<CFWL_EvtLtbDrawItem*>(pEvent);
-    CFWL_EvtCmbDrawItem pTemp;
-    pTemp.m_pSrcTarget = m_pOwner->m_pInterface;
-    pTemp.m_pGraphics = pDrawItemEvent->m_pGraphics;
-    pTemp.m_index = pDrawItemEvent->m_index;
-    pTemp.m_rtItem = pDrawItemEvent->m_rect;
-    m_pOwner->DispatchEvent(&pTemp);
-  } else if (dwFlag == FWL_EVTHASH_Scroll) {
-    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
-    CFWL_EvtScroll pScrollEv;
-    pScrollEv.m_pSrcTarget = m_pOwner->m_pInterface;
-    pScrollEv.m_iScrollCode = pScrollEvent->m_iScrollCode;
-    pScrollEv.m_fPos = pScrollEvent->m_fPos;
-    m_pOwner->DispatchEvent(&pScrollEv);
-  } else if (dwFlag == FWL_EVTHASH_EDT_TextChanged) {
-    CFWL_EvtEdtTextChanged* pTextChangedEvent =
-        static_cast<CFWL_EvtEdtTextChanged*>(pEvent);
-    CFWL_EvtCmbEditChanged pTemp;
-    pTemp.m_pSrcTarget = m_pOwner->m_pInterface;
-    pTemp.wsInsert = pTextChangedEvent->wsInsert;
-    pTemp.wsDelete = pTextChangedEvent->wsDelete;
-    pTemp.nChangeType = pTextChangedEvent->nChangeType;
-    m_pOwner->DispatchEvent(&pTemp);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ComboBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                               const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_ComboBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                              FX_BOOL bSet) {
-  IFWL_Target* pDstTarget = pMsg->m_pDstTarget;
-  IFWL_Target* pSrcTarget = pMsg->m_pSrcTarget;
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (bDropDown && pSrcTarget != m_pOwner->m_pListBox.get()) {
-      if (!m_pOwner->m_pEdit)
-        return;
-      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
-          ->SetSelected();
-    } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    if (bDropDown && pDstTarget != m_pOwner->m_pListBox.get()) {
-      if (!m_pOwner->m_pEdit)
-        return;
-      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
-          ->FlagFocus(FALSE);
-      static_cast<CFWL_ComboEditImp*>(m_pOwner->m_pEdit->GetImpl())
-          ->ClearSelected();
-    } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-  }
-}
-void CFWL_ComboBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    return;
-  }
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
-  FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
-  if (bClickBtn) {
-    if (bDropDown && m_pOwner->m_pEdit) {
-      m_pOwner->MatchEditText();
-    }
-    m_pOwner->m_bLButtonDown = TRUE;
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Pressed;
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    m_pOwner->ShowDropList(TRUE);
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
-}
-void CFWL_ComboBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDown = FALSE;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Hovered;
-  } else {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-}
-void CFWL_ComboBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  int32_t iOldState = m_pOwner->m_iBtnState;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = m_pOwner->m_bLButtonDown
-                                ? FWL_PARTSTATE_CMB_Pressed
-                                : FWL_PARTSTATE_CMB_Hovered;
-  } else {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
-  }
-  if ((iOldState != m_pOwner->m_iBtnState) &&
-      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
-        FWL_WGTSTATE_Disabled)) {
-    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-  }
-}
-void CFWL_ComboBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->IsDropListShowed() &&
-      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
-        FWL_WGTSTATE_Disabled)) {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_CMB_Normal;
-    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-  }
-}
-void CFWL_ComboBoxImpDelegate::OnKey(CFWL_MsgKey* pMsg) {
-  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
-  if (dwKeyCode == FWL_VKEY_Tab) {
-    m_pOwner->DispatchKeyEvent(pMsg);
-    return;
-  }
-  if (pMsg->m_pDstTarget == m_pOwner->m_pInterface)
-    DoSubCtrlKey(pMsg);
-}
-void CFWL_ComboBoxImpDelegate::DoSubCtrlKey(CFWL_MsgKey* pMsg) {
-  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
-  const bool bUp = dwKeyCode == FWL_VKEY_Up;
-  const bool bDown = dwKeyCode == FWL_VKEY_Down;
-  if (bUp || bDown) {
-    int32_t iCount =
-        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
-            ->CountItems();
-    if (iCount < 1) {
-      return;
-    }
-    FX_BOOL bMatchEqual = FALSE;
-    int32_t iCurSel = m_pOwner->m_iCurSel;
-    FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-    if (bDropDown && m_pOwner->m_pEdit) {
-      CFX_WideString wsText;
-      m_pOwner->m_pEdit->GetText(wsText);
-      iCurSel = static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
-                    ->MatchItem(wsText);
-      if (iCurSel >= 0) {
-        CFX_WideString wsTemp;
-        IFWL_ComboBoxDP* pData = static_cast<IFWL_ComboBoxDP*>(
-            m_pOwner->m_pProperties->m_pDataProvider);
-        FWL_HLISTITEM hItem = pData->GetItem(m_pOwner->m_pInterface, iCurSel);
-        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl())
-            ->GetItemText(hItem, wsTemp);
-        bMatchEqual = wsText.Equal(wsTemp);
-      }
-    }
-    if (iCurSel < 0) {
-      iCurSel = 0;
-    } else if (!bDropDown || bMatchEqual) {
-      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
-        return;
-      }
-      if (bUp) {
-        iCurSel--;
-      } else {
-        iCurSel++;
-      }
-    }
-    m_pOwner->m_iCurSel = iCurSel;
-    if (bDropDown && m_pOwner->m_pEdit) {
-      m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
-    } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-    return;
-  }
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-  if (bDropDown) {
-    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(pMsg);
-  }
-}
-int32_t CFWL_ComboBoxImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  FX_BOOL backDefault = TRUE;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      backDefault = FALSE;
-      DisForm_OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      backDefault = FALSE;
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          DisForm_OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      backDefault = FALSE;
-      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
-      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyUp) {
-        break;
-      }
-      if (m_pOwner->DisForm_IsDropListShowed() &&
-          pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
-        FX_DWORD dwKeyCode = pKey->m_dwKeyCode;
-        FX_BOOL bListKey =
-            dwKeyCode == FWL_VKEY_Up || dwKeyCode == FWL_VKEY_Down ||
-            dwKeyCode == FWL_VKEY_Return || dwKeyCode == FWL_VKEY_Escape;
-        if (bListKey) {
-          IFWL_WidgetDelegate* pDelegate =
-              m_pOwner->m_pListBox->SetDelegate(NULL);
-          pDelegate->OnProcessMessage(pMessage);
-          break;
-        }
-      }
-      DisForm_OnKey(pKey);
-      break;
-    }
-    default: {}
-  }
-  if (!backDefault) {
-    return 1;
-  }
-  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-void CFWL_ComboBoxImpDelegate::DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  FX_BOOL bDropDown = m_pOwner->DisForm_IsDropListShowed();
-  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
-  FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
-  if (bClickBtn) {
-    if (m_pOwner->DisForm_IsDropListShowed()) {
-      m_pOwner->DisForm_ShowDropList(FALSE);
-      return;
-    }
-    {
-      if (m_pOwner->m_pEdit) {
-        m_pOwner->MatchEditText();
-      }
-      m_pOwner->DisForm_ShowDropList(TRUE);
-    }
-  }
-}
-void CFWL_ComboBoxImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
-                                                      FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if ((m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) {
-      CFWL_MsgSetFocus msg;
-      msg.m_pDstTarget = m_pOwner->m_pEdit.get();
-      msg.m_pSrcTarget = NULL;
-      IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-      pDelegate->OnProcessMessage(&msg);
-    }
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->DisForm_ShowDropList(FALSE);
-    CFWL_MsgKillFocus msg;
-    msg.m_pDstTarget = NULL;
-    msg.m_pSrcTarget = m_pOwner->m_pEdit.get();
-    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(&msg);
-  }
-}
-void CFWL_ComboBoxImpDelegate::DisForm_OnKey(CFWL_MsgKey* pMsg) {
-  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
-  const bool bUp = dwKeyCode == FWL_VKEY_Up;
-  const bool bDown = dwKeyCode == FWL_VKEY_Down;
-  if (bUp || bDown) {
-    CFWL_ComboListImp* pComboList =
-        static_cast<CFWL_ComboListImp*>(m_pOwner->m_pListBox->GetImpl());
-    int32_t iCount = pComboList->CountItems();
-    if (iCount < 1) {
-      return;
-    }
-    FX_BOOL bMatchEqual = FALSE;
-    int32_t iCurSel = m_pOwner->m_iCurSel;
-    if (m_pOwner->m_pEdit) {
-      CFX_WideString wsText;
-      m_pOwner->m_pEdit->GetText(wsText);
-      iCurSel = pComboList->MatchItem(wsText);
-      if (iCurSel >= 0) {
-        CFX_WideString wsTemp;
-        FWL_HLISTITEM item = m_pOwner->m_pListBox->GetSelItem(iCurSel);
-        m_pOwner->m_pListBox->GetItemText(item, wsTemp);
-        bMatchEqual = wsText.Equal(wsTemp);
-      }
-    }
-    if (iCurSel < 0) {
-      iCurSel = 0;
-    } else if (bMatchEqual) {
-      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
-        return;
-      }
-      if (bUp) {
-        iCurSel--;
-      } else {
-        iCurSel++;
-      }
-    }
-    m_pOwner->m_iCurSel = iCurSel;
-    m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
-    return;
-  }
-  if (m_pOwner->m_pEdit) {
-    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(pMsg);
-  }
-}
-CFWL_ComboProxyImpDelegate::CFWL_ComboProxyImpDelegate(
-    IFWL_Form* pForm,
-    CFWL_ComboBoxImp* pComboBox)
-    : m_bLButtonDown(FALSE),
-      m_bLButtonUpSelf(FALSE),
-      m_fStartPos(0),
-      m_pForm(pForm),
-      m_pComboBox(pComboBox) {}
-int32_t CFWL_ComboProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  if (dwMsgCode == FWL_MSGHASH_Mouse) {
-    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    FX_DWORD dwCmd = pMsg->m_dwCmd;
-    switch (dwCmd) {
-      case FWL_MSGMOUSECMD_LButtonDown: {
-        OnLButtonDown(pMsg);
-        break;
-      }
-      case FWL_MSGMOUSECMD_LButtonUp: {
-        OnLButtonUp(pMsg);
-        break;
-      }
-      case FWL_MSGMOUSECMD_MouseMove: {
-        OnMouseMove(pMsg);
-        break;
-      }
-      default: {}
-    }
-  }
-  if (dwMsgCode == FWL_MSGHASH_Deactivate) {
-    OnDeactive(static_cast<CFWL_MsgDeactivate*>(pMessage));
-  }
-  if (dwMsgCode == FWL_MSGHASH_KillFocus || dwMsgCode == FWL_MSGHASH_SetFocus) {
-    OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage),
-                   dwMsgCode == FWL_MSGHASH_SetFocus);
-  }
-  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-FWL_ERR CFWL_ComboProxyImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                 const CFX_Matrix* pMatrix) {
-  m_pComboBox->DrawStretchHandler(pGraphics, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_ComboProxyImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  CFX_RectF rtWidget;
-  m_pForm->GetWidgetRect(rtWidget);
-  rtWidget.left = rtWidget.top = 0;
-  if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_bLButtonDown = TRUE;
-    pDriver->SetGrab(m_pForm, TRUE);
-  } else {
-    m_bLButtonDown = FALSE;
-    pDriver->SetGrab(m_pForm, FALSE);
-    m_pComboBox->ShowDropList(FALSE);
-  }
-}
-void CFWL_ComboProxyImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_bLButtonDown = FALSE;
-  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  pDriver->SetGrab(m_pForm, FALSE);
-  if (m_bLButtonUpSelf) {
-    CFX_RectF rect;
-    m_pForm->GetWidgetRect(rect);
-    rect.left = rect.top = 0;
-    if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) &&
-        m_pComboBox->IsDropListShowed()) {
-      m_pComboBox->ShowDropList(FALSE);
-    }
-  } else {
-    m_bLButtonUpSelf = TRUE;
-  }
-}
-void CFWL_ComboProxyImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {}
-void CFWL_ComboProxyImpDelegate::OnDeactive(CFWL_MsgDeactivate* pMsg) {
-  m_pComboBox->ShowDropList(FALSE);
-}
-void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus* pMsg,
-                                                FX_BOOL bSet) {
-  if (!bSet) {
-    if (pMsg->m_pSetFocus == NULL) {
-      m_pComboBox->ShowDropList(FALSE);
-    }
-  }
-}
diff --git a/xfa/src/fwl/basewidget/fwl_comboboximp.h b/xfa/src/fwl/basewidget/fwl_comboboximp.h
deleted file mode 100644
index 000e0af..0000000
--- a/xfa/src/fwl/basewidget/fwl_comboboximp.h
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
-
-#include <memory>
-
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-#include "xfa/src/fwl/basewidget/fwl_listboximp.h"
-
-class CFWL_WidgetImp;
-class CFWL_WidgetImpProperties;
-class CFWL_WidgetImpDelegate;
-class CFWL_ListBoxImp;
-class CFWL_ListBoxImpDelegate;
-class CFWL_FormProxyImp;
-class IFWL_Widget;
-class CFWL_ComboEditImp;
-class CFWL_ComboEditImpDelegate;
-class CFWL_ComboListImp;
-class CFWL_ComboListImpDelegate;
-class CFWL_ComboBoxImp;
-class CFWL_ComboBoxImpDelegate;
-class CFWL_ComboProxyImpDelegate;
-class CFWL_ComboEditImp : public CFWL_EditImp {
- public:
-  CFWL_ComboEditImp(const CFWL_WidgetImpProperties& properties,
-                    IFWL_Widget* pOuter);
-
-  void ClearSelected();
-  void SetSelected();
-  void EndCaret();
-  void FlagFocus(FX_BOOL bSet);
-
- protected:
-  void SetComboBoxFocus(FX_BOOL bSet);
-  CFWL_ComboBoxImp* m_pOuter;
-  friend class CFWL_ComboEditImpDelegate;
-};
-class CFWL_ComboEditImpDelegate : public CFWL_EditImpDelegate {
- public:
-  CFWL_ComboEditImpDelegate(CFWL_ComboEditImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-
- protected:
-  CFWL_ComboEditImp* m_pOwner;
-};
-class CFWL_ComboListImp : public CFWL_ListBoxImp {
- public:
-  CFWL_ComboListImp(const CFWL_WidgetImpProperties& properties,
-                    IFWL_Widget* pOuter);
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  int32_t MatchItem(const CFX_WideString& wsMatch);
-  void ChangeSelected(int32_t iSel);
-  int32_t CountItems();
-  void GetItemRect(int32_t nIndex, CFX_RectF& rtItem);
-  void ClientToOuter(FX_FLOAT& fx, FX_FLOAT& fy);
-  void SetFocus(FX_BOOL bSet);
-  FX_BOOL m_bNotifyOwner;
-  friend class CFWL_ComboListImpDelegate;
-  friend class CFWL_ComboBoxImp;
-};
-class CFWL_ComboListImpDelegate : public CFWL_ListBoxImpDelegate {
- public:
-  CFWL_ComboListImpDelegate(CFWL_ComboListImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-
- protected:
-  void OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  int32_t OnDropListMouseMove(CFWL_MsgMouse* pMsg);
-  int32_t OnDropListLButtonDown(CFWL_MsgMouse* pMsg);
-  int32_t OnDropListLButtonUp(CFWL_MsgMouse* pMsg);
-  int32_t OnDropListKey(CFWL_MsgKey* pKey);
-  void OnDropListKeyDown(CFWL_MsgKey* pKey);
-  CFWL_ComboListImp* m_pOwner;
-};
-class CFWL_ComboBoxImp : public CFWL_WidgetImp {
- public:
-  CFWL_ComboBoxImp(const CFWL_WidgetImpProperties& properties,
-                   IFWL_Widget* pOuter);
-  virtual ~CFWL_ComboBoxImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                 FX_DWORD dwStylesExRemoved);
-  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
-  virtual FWL_ERR Update();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
-  virtual int32_t GetCurSel();
-  virtual FWL_ERR SetCurSel(int32_t iSel);
-  virtual FWL_ERR SetEditText(const CFX_WideString& wsText);
-  virtual int32_t GetEditTextLength() const;
-  virtual FWL_ERR GetEditText(CFX_WideString& wsText,
-                              int32_t nStart = 0,
-                              int32_t nCount = -1) const;
-  virtual FWL_ERR SetEditSelRange(int32_t nStart, int32_t nCount = -1);
-  virtual int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart);
-  virtual int32_t GetEditLimit();
-  virtual FWL_ERR SetEditLimit(int32_t nLimit);
-  virtual FWL_ERR EditDoClipboard(int32_t iCmd);
-  virtual FX_BOOL EditRedo(const CFX_ByteStringC& bsRecord);
-  virtual FX_BOOL EditUndo(const CFX_ByteStringC& bsRecord);
-  virtual IFWL_ListBox* GetListBoxt();
-  virtual FX_BOOL AfterFocusShowDropList();
-  virtual FX_ERR OpenDropDownList(FX_BOOL bActivate);
-  virtual FX_BOOL EditCanUndo();
-  virtual FX_BOOL EditCanRedo();
-  virtual FX_BOOL EditUndo();
-  virtual FX_BOOL EditRedo();
-  virtual FX_BOOL EditCanCopy();
-  virtual FX_BOOL EditCanCut();
-  virtual FX_BOOL EditCanSelectAll();
-  virtual FX_BOOL EditCopy(CFX_WideString& wsCopy);
-  virtual FX_BOOL EditCut(CFX_WideString& wsCut);
-  virtual FX_BOOL EditPaste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL EditSelectAll();
-  virtual FX_BOOL EditDelete();
-  virtual FX_BOOL EditDeSelect();
-  virtual FWL_ERR GetBBox(CFX_RectF& rect);
-  virtual FWL_ERR EditModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                     FX_DWORD dwStylesExRemoved);
-
- protected:
-  void DrawStretchHandler(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix);
-  FX_FLOAT GetListHeight();
-  void ShowDropList(FX_BOOL bActivate);
-  FX_BOOL IsDropListShowed();
-  FX_BOOL IsDropDownStyle() const;
-  void MatchEditText();
-  void SynchrEditText(int32_t iListItem);
-  void Layout();
-  void ReSetTheme();
-  void ReSetEditAlignment();
-  void ReSetListItemAlignment();
-  void ProcessSelChanged(FX_BOOL bLButtonUp);
-  void InitProxyForm();
-  FWL_ERR DisForm_Initialize();
-  void DisForm_InitComboList();
-  void DisForm_InitComboEdit();
-  void DisForm_ShowDropList(FX_BOOL bActivate);
-  FX_BOOL DisForm_IsDropListShowed();
-  FWL_ERR DisForm_ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                 FX_DWORD dwStylesExRemoved);
-  FWL_ERR DisForm_Update();
-  FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  FWL_ERR DisForm_DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  FWL_ERR DisForm_GetBBox(CFX_RectF& rect);
-  void DisForm_Layout();
-
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtContent;
-  CFX_RectF m_rtBtn;
-  CFX_RectF m_rtList;
-  CFX_RectF m_rtProxy;
-  CFX_RectF m_rtHandler;
-  std::unique_ptr<IFWL_Edit> m_pEdit;
-  std::unique_ptr<IFWL_ListBox> m_pListBox;
-  IFWL_Form* m_pForm;
-  FX_BOOL m_bLButtonDown;
-  FX_BOOL m_bUpFormHandler;
-  int32_t m_iCurSel;
-  int32_t m_iBtnState;
-  FX_FLOAT m_fComboFormHandler;
-  FX_FLOAT m_fItemHeight;
-  FX_BOOL m_bNeedShowList;
-  CFWL_FormProxyImp* m_pProxy;
-  CFWL_ComboProxyImpDelegate* m_pListProxyDelegate;
-
-  friend class CFWL_ComboListImp;
-  friend class CFWL_ComboEditImp;
-  friend class CFWL_ComboEditImpDelegate;
-  friend class CFWL_ComboListImpDelegate;
-  friend class CFWL_ComboBoxImpDelegate;
-  friend class CFWL_ComboProxyImpDelegate;
-};
-class CFWL_ComboBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ComboBoxImpDelegate(CFWL_ComboBoxImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnKey(CFWL_MsgKey* pMsg);
-  void DoSubCtrlKey(CFWL_MsgKey* pMsg);
-
- protected:
-  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
-  void DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void DisForm_OnKey(CFWL_MsgKey* pMsg);
-
- protected:
-  CFWL_ComboBoxImp* m_pOwner;
-  friend class CFWL_ComboEditImpDelegate;
-  friend class CFWL_ComboListImpDelegate;
-};
-class CFWL_ComboProxyImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ComboProxyImpDelegate(IFWL_Form* pForm, CFWL_ComboBoxImp* pComboBox);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-  void Reset() { m_bLButtonUpSelf = FALSE; }
-
- protected:
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnDeactive(CFWL_MsgDeactivate* pMsg);
-  void OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet);
-  FX_BOOL m_bLButtonDown;
-  FX_BOOL m_bLButtonUpSelf;
-  FX_FLOAT m_fStartPos;
-  IFWL_Form* m_pForm;
-  CFWL_ComboBoxImp* m_pComboBox;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_COMBOBOXIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_datetimepickerimp.cpp b/xfa/src/fwl/basewidget/fwl_datetimepickerimp.cpp
deleted file mode 100644
index c969418..0000000
--- a/xfa/src/fwl/basewidget/fwl_datetimepickerimp.cpp
+++ /dev/null
@@ -1,1161 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_datetimepickerimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_spinbutton.h"
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-#include "xfa/src/fwl/basewidget/fwl_formproxyimp.h"
-#include "xfa/src/fwl/basewidget/fwl_monthcalendarimp.h"
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-#define FWL_DTP_WIDTH 100
-#define FWL_DTP_HEIGHT 20
-
-// static
-IFWL_DateTimePicker* IFWL_DateTimePicker::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_DateTimePicker* pDateTimePicker = new IFWL_DateTimePicker;
-  CFWL_DateTimePickerImp* pDateTimePickerImpl =
-      new CFWL_DateTimePickerImp(properties, pOuter);
-  pDateTimePicker->SetImpl(pDateTimePickerImpl);
-  pDateTimePickerImpl->SetInterface(pDateTimePicker);
-  return pDateTimePicker;
-}
-
-// Static
-IFWL_DateTimeForm* IFWL_DateTimeForm::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_DateTimeForm* pDateTimeForm = new IFWL_DateTimeForm;
-  CFWL_FormProxyImp* pFormProxyImpl = new CFWL_FormProxyImp(properties, pOuter);
-  pDateTimeForm->SetImpl(pFormProxyImpl);
-  pFormProxyImpl->SetInterface(pDateTimeForm);
-  return pDateTimeForm;
-}
-
-// static
-IFWL_DateTimeCalender* IFWL_DateTimeCalender::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_DateTimeCalender* pDateTimeCalendar = new IFWL_DateTimeCalender;
-  CFWL_DateTimeCalendar* pDateTimeCalendarImpl =
-      new CFWL_DateTimeCalendar(properties, pOuter);
-  pDateTimeCalendar->SetImpl(pDateTimeCalendarImpl);
-  pDateTimeCalendarImpl->SetInterface(pDateTimeCalendar);
-  return pDateTimeCalendar;
-}
-
-// static
-IFWL_DateTimeEdit* IFWL_DateTimeEdit::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_DateTimeEdit* pDateTimeEdit = new IFWL_DateTimeEdit;
-  CFWL_DateTimeEdit* pDateTimeEditImpl =
-      new CFWL_DateTimeEdit(properties, pOuter);
-  pDateTimeEdit->SetImpl(pDateTimeEditImpl);
-  pDateTimeEditImpl->SetInterface(pDateTimeEdit);
-  return pDateTimeEdit;
-}
-
-IFWL_DateTimePicker::IFWL_DateTimePicker() {}
-int32_t IFWL_DateTimePicker::CountSelRanges() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->GetDataTimeEdit()
-      ->CountSelRanges();
-}
-int32_t IFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->GetDataTimeEdit()
-      ->GetSelRange(nIndex, nStart);
-}
-FWL_ERR IFWL_DateTimePicker::GetCurSel(int32_t& iYear,
-                                       int32_t& iMonth,
-                                       int32_t& iDay) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->GetCurSel(iYear, iMonth, iDay);
-}
-FWL_ERR IFWL_DateTimePicker::SetCurSel(int32_t iYear,
-                                       int32_t iMonth,
-                                       int32_t iDay) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->SetCurSel(iYear, iMonth, iDay);
-}
-FWL_ERR IFWL_DateTimePicker::SetEditText(const CFX_WideString& wsText) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SetEditText(wsText);
-}
-FWL_ERR IFWL_DateTimePicker::GetEditText(CFX_WideString& wsText,
-                                         int32_t nStart,
-                                         int32_t nCount) const {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->GetEditText(wsText, nStart, nCount);
-}
-FX_BOOL IFWL_DateTimePicker::CanUndo() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanUndo();
-}
-FX_BOOL IFWL_DateTimePicker::CanRedo() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanRedo();
-}
-FX_BOOL IFWL_DateTimePicker::Undo() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Undo();
-}
-FX_BOOL IFWL_DateTimePicker::Redo() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Redo();
-}
-FX_BOOL IFWL_DateTimePicker::CanCopy() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanCopy();
-}
-FX_BOOL IFWL_DateTimePicker::CanCut() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanCut();
-}
-FX_BOOL IFWL_DateTimePicker::CanSelectAll() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->CanSelectAll();
-}
-FX_BOOL IFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Copy(wsCopy);
-}
-FX_BOOL IFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Cut(wsCut);
-}
-FX_BOOL IFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Paste(wsPaste);
-}
-FX_BOOL IFWL_DateTimePicker::SelectAll() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SelectAll();
-}
-FX_BOOL IFWL_DateTimePicker::Delete() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->Delete();
-}
-FX_BOOL IFWL_DateTimePicker::DeSelect() {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->DeSelect();
-}
-FWL_ERR IFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->GetBBox(rect);
-}
-FWL_ERR IFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())->SetEditLimit(nLimit);
-}
-FWL_ERR IFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
-                                                FX_DWORD dwStylesExRemoved) {
-  return static_cast<CFWL_DateTimePickerImp*>(GetImpl())
-      ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-CFWL_DateTimeEdit::CFWL_DateTimeEdit(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter)
-    : CFWL_EditImp(properties, pOuter) {}
-FWL_ERR CFWL_DateTimeEdit::Initialize() {
-  m_pDelegate = new CFWL_DateTimeEditImpDelegate(this);
-  if (CFWL_EditImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimeEdit::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_EditImp::Finalize();
-}
-CFWL_DateTimeEditImpDelegate::CFWL_DateTimeEditImpDelegate(
-    CFWL_DateTimeEdit* pOwner)
-    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
-int32_t CFWL_DateTimeEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_OnProcessMessage(pMessage);
-  }
-  FX_DWORD dwHashCode = pMessage->GetClassID();
-  if (dwHashCode == FWL_MSGHASH_SetFocus ||
-      dwHashCode == FWL_MSGHASH_KillFocus) {
-    IFWL_Widget* pOuter = m_pOwner->GetOuter();
-    IFWL_WidgetDelegate* pDelegate = pOuter->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(pMessage);
-  }
-  return 1;
-}
-int32_t CFWL_DateTimeEditImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
-  FX_DWORD dwHashCode = pMessage->GetClassID();
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-    if (dwHashCode == FWL_MSGHASH_Mouse) {
-      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
-      if (pMouse->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown ||
-          pMouse->m_dwCmd == FWL_MSGMOUSECMD_RButtonDown) {
-        if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-          m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-        }
-        CFWL_DateTimePickerImp* pDateTime =
-            static_cast<CFWL_DateTimePickerImp*>(m_pOwner->m_pOuter->GetImpl());
-        if (pDateTime->IsMonthCalendarShowed()) {
-          CFX_RectF rtInvalidate;
-          pDateTime->GetWidgetRect(rtInvalidate);
-          pDateTime->ShowMonthCalendar(FALSE);
-          rtInvalidate.Offset(-rtInvalidate.left, -rtInvalidate.top);
-          pDateTime->Repaint(&rtInvalidate);
-        }
-      }
-    } else if (dwHashCode == FWL_MSGHASH_Key) {
-      return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
-    }
-  }
-  return CFWL_EditImpDelegate::OnProcessMessage(pMessage);
-}
-CFWL_DateTimeCalendar::CFWL_DateTimeCalendar(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_MonthCalendarImp(properties, pOuter) {}
-FWL_ERR CFWL_DateTimeCalendar::Initialize() {
-  if (CFWL_MonthCalendarImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  delete m_pDelegate;
-  m_pDelegate = new CFWL_DateTimeCalendarImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimeCalendar::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_MonthCalendarImp::Finalize();
-}
-CFWL_DateTimeCalendarImpDelegate::CFWL_DateTimeCalendarImpDelegate(
-    CFWL_DateTimeCalendar* pOwner)
-    : CFWL_MonthCalendarImpDelegate(pOwner), m_pOwner(pOwner) {
-  m_bFlag = FALSE;
-}
-int32_t CFWL_DateTimeCalendarImpDelegate::OnProcessMessage(
-    CFWL_Message* pMessage) {
-  FX_DWORD dwCode = pMessage->GetClassID();
-  if (dwCode == FWL_MSGHASH_SetFocus || dwCode == FWL_MSGHASH_KillFocus) {
-    IFWL_Widget* pOuter = m_pOwner->GetOuter();
-    IFWL_WidgetDelegate* pDelegate = pOuter->SetDelegate(NULL);
-    return pDelegate->OnProcessMessage(pMessage);
-  } else if (dwCode == FWL_MSGHASH_Mouse) {
-    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) {
-      OnLButtonDownEx(pMsg);
-      return 1;
-    } else if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
-      OnLButtonUpEx(pMsg);
-      return 1;
-    }
-  }
-  return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
-}
-void CFWL_DateTimeCalendarImpDelegate::OnLButtonDownEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed;
-    m_pOwner->PrevMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed;
-    m_pOwner->NextMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
-        0) {
-      m_pOwner->JumpToToday();
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-  } else {
-    IFWL_DateTimePicker* pIPicker =
-        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-    CFWL_DateTimePickerImp* pPicker =
-        static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
-    if (pPicker->IsMonthCalendarShowed()) {
-      m_bFlag = 1;
-    }
-  }
-}
-void CFWL_DateTimeCalendarImpDelegate::OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_OnLButtonUpEx(pMsg);
-  }
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
-    return;
-  }
-  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
-    return;
-  }
-  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    return;
-  }
-  int32_t iOldSel = 0;
-  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-    iOldSel = m_pOwner->m_arrSelDays[0];
-  }
-  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-  CFX_RectF rt;
-  IFWL_DateTimePicker* pIPicker =
-      static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-  CFWL_DateTimePickerImp* pPicker =
-      static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
-  pPicker->m_pForm->GetWidgetRect(rt);
-  rt.Set(0, 0, rt.width, rt.height);
-  if (iCurSel > 0) {
-    FWL_DATEINFO* lpDatesInfo =
-        (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
-    CFX_RectF rtInvalidate(lpDatesInfo->rect);
-    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
-      lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
-      rtInvalidate.Union(lpDatesInfo->rect);
-    }
-    m_pOwner->AddSelDay(iCurSel);
-    if (!m_pOwner->m_pOuter)
-      return;
-    pPicker->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
-                               iCurSel);
-    pPicker->ShowMonthCalendar(FALSE);
-  } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) {
-    IFWL_DateTimePicker* pIPicker =
-        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-    CFWL_DateTimePickerImp* pPicker =
-        static_cast<CFWL_DateTimePickerImp*>(pIPicker->GetImpl());
-    pPicker->ShowMonthCalendar(FALSE);
-  }
-  m_bFlag = 0;
-}
-void CFWL_DateTimeCalendarImpDelegate::OnMouseMoveEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
-    return;
-  }
-  FX_BOOL bRepaint = FALSE;
-  CFX_RectF rtInvalidate;
-  rtInvalidate.Set(0, 0, 0, 0);
-  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    bRepaint = m_pOwner->m_iHovered != iHover;
-    if (bRepaint) {
-      if (m_pOwner->m_iHovered > 0) {
-        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-      }
-      if (iHover > 0) {
-        CFX_RectF rtDay;
-        m_pOwner->GetDayRect(iHover, rtDay);
-        if (rtInvalidate.IsEmpty()) {
-          rtInvalidate = rtDay;
-        } else {
-          rtInvalidate.Union(rtDay);
-        }
-      }
-    }
-    m_pOwner->m_iHovered = iHover;
-    CFWL_Event_DtpHoverChanged ev;
-    ev.hoverday = iHover;
-    m_pOwner->DispatchEvent(&ev);
-  } else {
-    bRepaint = m_pOwner->m_iHovered > 0;
-    if (bRepaint) {
-      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    }
-    m_pOwner->m_iHovered = -1;
-  }
-  if (bRepaint && !rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-int32_t CFWL_DateTimeCalendarImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
-  if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) {
-    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
-      DisForm_OnLButtonUpEx(pMsg);
-      return 1;
-    }
-  }
-  return CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
-}
-void CFWL_DateTimeCalendarImpDelegate::DisForm_OnLButtonUpEx(
-    CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&(m_pOwner->m_rtLBtn));
-    return;
-  }
-  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&(m_pOwner->m_rtRBtn));
-    return;
-  }
-  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    return;
-  }
-  int32_t iOldSel = 0;
-  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-    iOldSel = m_pOwner->m_arrSelDays[0];
-  }
-  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-  if (iCurSel > 0) {
-    FWL_DATEINFO* lpDatesInfo =
-        (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
-    CFX_RectF rtInvalidate(lpDatesInfo->rect);
-    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
-      lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
-      rtInvalidate.Union(lpDatesInfo->rect);
-    }
-    m_pOwner->AddSelDay(iCurSel);
-    CFWL_DateTimePickerImp* pDateTime =
-        static_cast<CFWL_DateTimePickerImp*>(m_pOwner->m_pOuter->GetImpl());
-    pDateTime->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
-                                 iCurSel);
-    pDateTime->ShowMonthCalendar(FALSE);
-  }
-}
-CFWL_DateTimePickerImp::CFWL_DateTimePickerImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_iBtnState(1),
-      m_iYear(-1),
-      m_iMonth(-1),
-      m_iDay(-1),
-      m_bLBtnDown(FALSE),
-      m_pEdit(nullptr),
-      m_pMonthCal(nullptr),
-      m_pForm(nullptr) {
-  m_rtBtn.Set(0, 0, 0, 0);
-}
-CFWL_DateTimePickerImp::~CFWL_DateTimePickerImp() {}
-FWL_ERR CFWL_DateTimePickerImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_DateTimePicker;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_DateTimePickerImp::GetClassID() const {
-  return FWL_CLASSHASH_DateTimePicker;
-}
-FWL_ERR CFWL_DateTimePickerImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_DateTimePickerImpDelegate(this);
-  m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
-  CFWL_WidgetImpProperties propMonth;
-  propMonth.m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
-  propMonth.m_dwStates = FWL_WGTSTATE_Invisible;
-  propMonth.m_pDataProvider = &m_MonthCalendarDP;
-  propMonth.m_pParent = m_pInterface;
-  propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pMonthCal.reset(IFWL_DateTimeCalender::Create(propMonth, m_pInterface));
-  m_pMonthCal->Initialize();
-  CFX_RectF rtMonthCal;
-  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
-  rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height);
-  m_pMonthCal->SetWidgetRect(rtMonthCal);
-  CFWL_WidgetImpProperties propEdit;
-  propEdit.m_pParent = m_pInterface;
-  propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pEdit.reset(IFWL_DateTimeEdit::Create(propEdit, m_pInterface));
-  m_pEdit->Initialize();
-  RegisterEventTarget(m_pMonthCal.get());
-  RegisterEventTarget(m_pEdit.get());
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::Finalize() {
-  if (m_pEdit) {
-    m_pEdit->Finalize();
-  }
-  if (m_pMonthCal) {
-    m_pMonthCal->Finalize();
-  }
-  if (m_pForm) {
-    m_pForm->Finalize();
-  }
-  UnregisterEventTarget();
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_DateTimePickerImp::GetWidgetRect(CFX_RectF& rect,
-                                              FX_BOOL bAutoSize) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_GetWidgetRect(rect, bAutoSize);
-  }
-  if (bAutoSize) {
-    rect.Set(0, 0, FWL_DTP_WIDTH, FWL_DTP_HEIGHT);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::Update() {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_Update();
-  }
-  if (m_iLock) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
-  GetClientRect(m_rtClient);
-  FX_FLOAT* pFWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pFWidth)
-    return FWL_ERR_Indefinite;
-  FX_FLOAT fBtn = *pFWidth;
-  m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn - 1,
-              m_rtClient.height - 1);
-  CFX_RectF rtEdit;
-  rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
-             m_rtClient.height);
-  m_pEdit->SetWidgetRect(rtEdit);
-  ReSetEditAlignment();
-  m_pEdit->Update();
-  if (!(m_pMonthCal->GetThemeProvider())) {
-    m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
-  }
-  if (m_pProperties->m_pDataProvider) {
-    IFWL_DateTimePickerDP* pData =
-        static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(m_pInterface, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
-  }
-  CFX_RectF rtMonthCal;
-  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
-  CFX_RectF rtPopUp;
-  rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT,
-              rtMonthCal.width, rtMonthCal.height);
-  m_pMonthCal->SetWidgetRect(rtPopUp);
-  m_pMonthCal->Update();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_DateTimePickerImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_HitTest(fx, fy);
-  }
-  if (m_rtClient.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  if (IsMonthCalendarShowed()) {
-    CFX_RectF rect;
-    m_pMonthCal->GetWidgetRect(rect);
-    if (rect.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Client;
-    }
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FWL_ERR CFWL_DateTimePickerImp::DrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_DTP_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_DTP_Edge, pTheme, pMatrix);
-  }
-  if (!m_rtBtn.IsEmpty()) {
-    DrawDropDownButton(pGraphics, pTheme, pMatrix);
-  }
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_DrawWidget(pGraphics, pMatrix);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::SetThemeProvider(IFWL_ThemeProvider* pTP) {
-  m_pProperties->m_pThemeProvider = pTP;
-  m_pMonthCal->SetThemeProvider(pTP);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::GetCurSel(int32_t& iYear,
-                                          int32_t& iMonth,
-                                          int32_t& iDay) {
-  iYear = m_iYear;
-  iMonth = m_iMonth;
-  iDay = m_iDay;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::SetCurSel(int32_t iYear,
-                                          int32_t iMonth,
-                                          int32_t iDay) {
-  if (iYear <= 0 || iYear >= 3000)
-    return FWL_ERR_Indefinite;
-  if (iMonth <= 0 || iMonth >= 13)
-    return FWL_ERR_Indefinite;
-  if (iDay <= 0 || iDay >= 32)
-    return FWL_ERR_Indefinite;
-  m_iYear = iYear;
-  m_iMonth = iMonth;
-  m_iDay = iDay;
-  m_pMonthCal->SetSelect(iYear, iMonth, iDay);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::SetEditText(const CFX_WideString& wsText) {
-  if (!m_pEdit)
-    return FWL_ERR_Indefinite;
-  int32_t iRet = m_pEdit->SetText(wsText);
-  Repaint(&m_rtClient);
-  CFWL_Event_DtpEditChanged ev;
-  ev.m_wsText = wsText;
-  DispatchEvent(&ev);
-  return iRet;
-}
-FWL_ERR CFWL_DateTimePickerImp::GetEditText(CFX_WideString& wsText,
-                                            int32_t nStart,
-                                            int32_t nCount) const {
-  if (m_pEdit) {
-    return m_pEdit->GetText(wsText, nStart, nCount);
-  }
-  return FWL_ERR_Indefinite;
-}
-FX_BOOL CFWL_DateTimePickerImp::CanUndo() {
-  return m_pEdit->CanUndo();
-}
-FX_BOOL CFWL_DateTimePickerImp::CanRedo() {
-  return m_pEdit->CanRedo();
-}
-FX_BOOL CFWL_DateTimePickerImp::Undo() {
-  return m_pEdit->Undo();
-}
-FX_BOOL CFWL_DateTimePickerImp::Redo() {
-  return m_pEdit->Redo();
-}
-FX_BOOL CFWL_DateTimePickerImp::CanCopy() {
-  int32_t nCount = m_pEdit->CountSelRanges();
-  return nCount > 0;
-}
-FX_BOOL CFWL_DateTimePickerImp::CanCut() {
-  if (m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
-    return FALSE;
-  }
-  int32_t nCount = m_pEdit->CountSelRanges();
-  return nCount > 0;
-}
-FX_BOOL CFWL_DateTimePickerImp::CanSelectAll() {
-  return m_pEdit->GetTextLength() > 0;
-}
-FX_BOOL CFWL_DateTimePickerImp::Copy(CFX_WideString& wsCopy) {
-  return m_pEdit->Copy(wsCopy);
-}
-FX_BOOL CFWL_DateTimePickerImp::Cut(CFX_WideString& wsCut) {
-  return m_pEdit->Cut(wsCut);
-}
-FX_BOOL CFWL_DateTimePickerImp::Paste(const CFX_WideString& wsPaste) {
-  return m_pEdit->Paste(wsPaste);
-}
-FX_BOOL CFWL_DateTimePickerImp::SelectAll() {
-  return m_pEdit->AddSelRange(0) == FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_DateTimePickerImp::Delete() {
-  return m_pEdit->ClearText() == FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_DateTimePickerImp::DeSelect() {
-  return m_pEdit->ClearSelections() == FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::GetBBox(CFX_RectF& rect) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_GetBBox(rect);
-  }
-  rect = m_pProperties->m_rtWidget;
-  if (IsMonthCalendarShowed()) {
-    CFX_RectF rtMonth;
-    m_pMonthCal->GetWidgetRect(rtMonth);
-    rtMonth.Offset(m_pProperties->m_rtWidget.left,
-                   m_pProperties->m_rtWidget.top);
-    rect.Union(rtMonth);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::SetEditLimit(int32_t nLimit) {
-  return m_pEdit->SetLimit(nLimit);
-}
-FWL_ERR CFWL_DateTimePickerImp::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
-                                                   FX_DWORD dwStylesExRemoved) {
-  return m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-void CFWL_DateTimePickerImp::DrawDropDownButton(CFX_Graphics* pGraphics,
-                                                IFWL_ThemeProvider* pTheme,
-                                                const CFX_Matrix* pMatrix) {
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_Spin) ==
-      FWL_STYLEEXT_DTP_Spin) {
-    CFWL_WidgetImpProperties prop;
-    prop.m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert;
-    prop.m_pParent = m_pInterface;
-    prop.m_rtWidget = m_rtBtn;
-    IFWL_SpinButton* pSpin = IFWL_SpinButton::Create(prop, m_pInterface);
-    pSpin->Initialize();
-  } else {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_DTP_DropDownButton;
-    param.m_dwStates = m_iBtnState;
-    param.m_pGraphics = pGraphics;
-    param.m_rtPart = m_rtBtn;
-    if (pMatrix) {
-      param.m_matrix.Concat(*pMatrix);
-    }
-    pTheme->DrawBackground(&param);
-  }
-}
-void CFWL_DateTimePickerImp::FormatDateString(int32_t iYear,
-                                              int32_t iMonth,
-                                              int32_t iDay,
-                                              CFX_WideString& wsText) {
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_ShortDateFormat) ==
-      FWL_STYLEEXT_DTP_ShortDateFormat) {
-    wsText.Format(L"%d-%d-%d", iYear, iMonth, iDay);
-  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_LongDateFormat) ==
-             FWL_STYLEEXT_DTP_LongDateFormat) {
-    wsText.Format(L"%d Year %d Month %d Day", iYear, iMonth, iDay);
-  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat) ==
-             FWL_STYLEEXT_DTP_TimeFormat) {
-  }
-}
-void CFWL_DateTimePickerImp::ShowMonthCalendar(FX_BOOL bActivate) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_ShowMonthCalendar(bActivate);
-  }
-  if (IsMonthCalendarShowed() == bActivate) {
-    return;
-  }
-  if (!m_pForm) {
-    InitProxyForm();
-  }
-  if (bActivate) {
-    CFX_RectF rtMonth;
-    m_pMonthCal->GetWidgetRect(rtMonth);
-    CFX_RectF rtAnchor;
-    rtAnchor.Set(0, 0, m_pProperties->m_rtWidget.width,
-                 m_pProperties->m_rtWidget.height);
-    GetPopupPos(0, rtMonth.height, rtAnchor, rtMonth);
-    m_pForm->SetWidgetRect(rtMonth);
-    rtMonth.left = rtMonth.top = 0;
-    m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
-    m_pMonthCal->SetWidgetRect(rtMonth);
-    m_pMonthCal->Update();
-    m_pForm->DoModal();
-  } else {
-    m_pForm->EndDoModal();
-  }
-}
-FX_BOOL CFWL_DateTimePickerImp::IsMonthCalendarShowed() {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_IsMonthCalendarShowed();
-  }
-  if (!m_pForm)
-    return FALSE;
-  return !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
-}
-void CFWL_DateTimePickerImp::ReSetEditAlignment() {
-  if (!m_pEdit)
-    return;
-  FX_DWORD dwStylExes = m_pProperties->m_dwStyleExes;
-  FX_DWORD dwAdd = 0;
-  switch (dwStylExes & FWL_STYLEEXT_DTP_EditHAlignMask) {
-    case FWL_STYLEEXT_DTP_EditHCenter: {
-      dwAdd |= FWL_STYLEEXT_EDT_HCenter;
-      break;
-    }
-    case FWL_STYLEEXT_DTP_EditHFar: {
-      dwAdd |= FWL_STYLEEXT_EDT_HFar;
-      break;
-    }
-    default: { dwAdd |= FWL_STYLEEXT_EDT_HNear; }
-  }
-  switch (dwStylExes & FWL_STYLEEXT_DTP_EditVAlignMask) {
-    case FWL_STYLEEXT_DTP_EditVCenter: {
-      dwAdd |= FWL_STYLEEXT_EDT_VCenter;
-      break;
-    }
-    case FWL_STYLEEXT_DTP_EditVFar: {
-      dwAdd |= FWL_STYLEEXT_EDT_VFar;
-      break;
-    }
-    default: { dwAdd |= FWL_STYLEEXT_EDT_VNear; }
-  }
-  if (dwStylExes & FWL_STYLEEXT_DTP_EditJustified) {
-    dwAdd |= FWL_STYLEEXT_EDT_Justified;
-  }
-  if (dwStylExes & FWL_STYLEEXT_DTP_EditDistributed) {
-    dwAdd |= FWL_STYLEEXT_EDT_Distributed;
-  }
-  m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
-                                     FWL_STYLEEXT_EDT_HAlignModeMask |
-                                     FWL_STYLEEXT_EDT_VAlignMask);
-}
-void CFWL_DateTimePickerImp::ProcessSelChanged(int32_t iYear,
-                                               int32_t iMonth,
-                                               int32_t iDay) {
-  m_iYear = iYear;
-  m_iMonth = iMonth;
-  m_iDay = iDay;
-  CFX_WideString wsText;
-  FormatDateString(m_iYear, m_iMonth, m_iDay, wsText);
-  m_pEdit->SetText(wsText);
-  m_pEdit->Update();
-  Repaint(&m_rtClient);
-  CFWL_Event_DtpSelectChanged ev;
-  ev.m_pSrcTarget = m_pInterface;
-  ev.iYear = m_iYear;
-  ev.iMonth = m_iMonth;
-  ev.iDay = m_iDay;
-  DispatchEvent(&ev);
-}
-void CFWL_DateTimePickerImp::InitProxyForm() {
-  if (m_pForm)
-    return;
-  if (!m_pMonthCal)
-    return;
-  CFWL_WidgetImpProperties propForm;
-  propForm.m_dwStyles = FWL_WGTSTYLE_Popup;
-  propForm.m_dwStates = FWL_WGTSTATE_Invisible;
-  propForm.m_pOwner = m_pInterface;
-  m_pForm.reset(IFWL_DateTimeForm::Create(propForm, m_pMonthCal.get()));
-  m_pForm->Initialize();
-  m_pMonthCal->SetParent(m_pForm.get());
-}
-IFWL_DateTimeEdit* CFWL_DateTimePickerImp::GetDataTimeEdit() {
-  return m_pEdit.get();
-}
-FWL_ERR CFWL_DateTimePickerImp::DisForm_Initialize() {
-  m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
-  DisForm_InitDateTimeCalendar();
-  DisForm_InitDateTimeEdit();
-  RegisterEventTarget(m_pMonthCal.get());
-  RegisterEventTarget(m_pEdit.get());
-  return FWL_ERR_Succeeded;
-}
-void CFWL_DateTimePickerImp::DisForm_InitDateTimeCalendar() {
-  if (m_pMonthCal) {
-    return;
-  }
-  CFWL_WidgetImpProperties propMonth;
-  propMonth.m_dwStyles =
-      FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border | FWL_WGTSTYLE_EdgeSunken;
-  propMonth.m_dwStates = FWL_WGTSTATE_Invisible;
-  propMonth.m_pParent = m_pInterface;
-  propMonth.m_pDataProvider = &m_MonthCalendarDP;
-  propMonth.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pMonthCal.reset(IFWL_DateTimeCalender::Create(propMonth, m_pInterface));
-  m_pMonthCal->Initialize();
-  CFX_RectF rtMonthCal;
-  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
-  rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height);
-  m_pMonthCal->SetWidgetRect(rtMonthCal);
-}
-void CFWL_DateTimePickerImp::DisForm_InitDateTimeEdit() {
-  if (m_pEdit) {
-    return;
-  }
-  CFWL_WidgetImpProperties propEdit;
-  propEdit.m_pParent = m_pInterface;
-  propEdit.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  m_pEdit.reset(IFWL_DateTimeEdit::Create(propEdit, m_pInterface));
-  m_pEdit->Initialize();
-}
-FX_BOOL CFWL_DateTimePickerImp::DisForm_IsMonthCalendarShowed() {
-  if (!m_pMonthCal)
-    return FALSE;
-  return !(m_pMonthCal->GetStates() & FWL_WGTSTATE_Invisible);
-}
-void CFWL_DateTimePickerImp::DisForm_ShowMonthCalendar(FX_BOOL bActivate) {
-  FX_BOOL bShowed = IsMonthCalendarShowed();
-  if (bShowed == bActivate) {
-    return;
-  }
-  if (bActivate) {
-    CFX_RectF rtMonthCal;
-    m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
-    FX_FLOAT fPopupMin = rtMonthCal.height;
-    FX_FLOAT fPopupMax = rtMonthCal.height;
-    CFX_RectF rtAnchor(m_pProperties->m_rtWidget);
-    rtAnchor.width = rtMonthCal.width;
-    rtMonthCal.left = m_rtClient.left;
-    rtMonthCal.top = rtAnchor.Height();
-    GetPopupPos(fPopupMin, fPopupMax, rtAnchor, rtMonthCal);
-    m_pMonthCal->SetWidgetRect(rtMonthCal);
-    if (m_iYear > 0 && m_iMonth > 0 && m_iDay > 0) {
-      m_pMonthCal->SetSelect(m_iYear, m_iMonth, m_iDay);
-    }
-    m_pMonthCal->Update();
-  }
-  m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
-  if (bActivate) {
-    CFWL_MsgSetFocus msg;
-    msg.m_pDstTarget = m_pMonthCal.get();
-    msg.m_pSrcTarget = m_pEdit.get();
-    IFWL_WidgetDelegate* pDelegate = m_pEdit->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(&msg);
-  }
-  CFX_RectF rtInvalidate, rtCal;
-  rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
-                   m_pProperties->m_rtWidget.height);
-  m_pMonthCal->GetWidgetRect(rtCal);
-  rtInvalidate.Union(rtCal);
-  rtInvalidate.Inflate(2, 2);
-  Repaint(&rtInvalidate);
-}
-FX_DWORD CFWL_DateTimePickerImp::DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rect;
-  rect.Set(0, 0, m_pProperties->m_rtWidget.width,
-           m_pProperties->m_rtWidget.height);
-  if (rect.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Edit;
-  }
-  if (DisForm_IsNeedShowButton()) {
-    rect.width += m_fBtn;
-  }
-  if (rect.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  if (IsMonthCalendarShowed()) {
-    m_pMonthCal->GetWidgetRect(rect);
-    if (rect.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Client;
-    }
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FX_BOOL CFWL_DateTimePickerImp::DisForm_IsNeedShowButton() {
-  FX_BOOL bFocus = m_pProperties->m_dwStates & FWL_WGTSTATE_Focused ||
-                   m_pMonthCal->GetStates() & FWL_WGTSTATE_Focused ||
-                   m_pEdit->GetStates() & FWL_WGTSTATE_Focused;
-  return bFocus;
-}
-FWL_ERR CFWL_DateTimePickerImp::DisForm_Update() {
-  if (m_iLock) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
-  GetClientRect(m_rtClient);
-  m_pEdit->SetWidgetRect(m_rtClient);
-  ReSetEditAlignment();
-  m_pEdit->Update();
-  if (m_pMonthCal->GetThemeProvider() == NULL) {
-    m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
-  }
-  if (m_pProperties->m_pDataProvider) {
-    IFWL_DateTimePickerDP* pData =
-        static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(m_pInterface, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
-  }
-  FX_FLOAT* pWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pWidth)
-    return 0;
-  m_fBtn = *pWidth;
-  CFX_RectF rtMonthCal;
-  m_pMonthCal->GetWidgetRect(rtMonthCal, TRUE);
-  CFX_RectF rtPopUp;
-  rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + FWL_DTP_HEIGHT,
-              rtMonthCal.width, rtMonthCal.height);
-  m_pMonthCal->SetWidgetRect(rtPopUp);
-  m_pMonthCal->Update();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::DisForm_GetWidgetRect(CFX_RectF& rect,
-                                                      FX_BOOL bAutoSize) {
-  rect = m_pProperties->m_rtWidget;
-  if (DisForm_IsNeedShowButton()) {
-    rect.width += m_fBtn;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::DisForm_GetBBox(CFX_RectF& rect) {
-  rect = m_pProperties->m_rtWidget;
-  if (DisForm_IsNeedShowButton()) {
-    rect.width += m_fBtn;
-  }
-  if (IsMonthCalendarShowed()) {
-    CFX_RectF rtMonth;
-    m_pMonthCal->GetWidgetRect(rtMonth);
-    rtMonth.Offset(m_pProperties->m_rtWidget.left,
-                   m_pProperties->m_rtWidget.top);
-    rect.Union(rtMonth);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePickerImp::DisForm_DrawWidget(CFX_Graphics* pGraphics,
-                                                   const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (m_pEdit) {
-    CFX_RectF rtEdit;
-    m_pEdit->GetWidgetRect(rtEdit);
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top);
-    if (pMatrix) {
-      mt.Concat(*pMatrix);
-    }
-    m_pEdit->DrawWidget(pGraphics, &mt);
-  }
-  if (IsMonthCalendarShowed()) {
-    CFX_RectF rtMonth;
-    m_pMonthCal->GetWidgetRect(rtMonth);
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, rtMonth.left, rtMonth.top);
-    if (pMatrix) {
-      mt.Concat(*pMatrix);
-    }
-    m_pMonthCal->DrawWidget(pGraphics, &mt);
-  }
-  return FWL_ERR_Succeeded;
-}
-CFWL_DateTimePickerImpDelegate::CFWL_DateTimePickerImpDelegate(
-    CFWL_DateTimePickerImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_DateTimePickerImpDelegate::OnProcessMessage(
-    CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMouse->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMouse);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    default:
-      break;
-  }
-  if (dwMsgCode == FWL_MSGHASH_Key &&
-      m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
-    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-    return pDelegate->OnProcessMessage(pMessage);
-  }
-  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-FWL_ERR CFWL_DateTimePickerImpDelegate::OnDrawWidget(
-    CFX_Graphics* pGraphics,
-    const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_DateTimePickerImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                    FX_BOOL bSet) {
-  if (!pMsg)
-    return;
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-    return DisForm_OnFocusChanged(pMsg, bSet);
-  }
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
-  if (pMsg->m_pSrcTarget == m_pOwner->m_pMonthCal.get() &&
-      m_pOwner->IsMonthCalendarShowed()) {
-    m_pOwner->ShowMonthCalendar(FALSE);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_DateTimePickerImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (!pMsg)
-    return;
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsMonthCalendarShowed()) {
-      m_pOwner->ShowMonthCalendar(FALSE);
-      CFWL_Event_DtpCloseUp ev;
-      m_pOwner->DispatchEvent(&ev);
-    } else {
-      if (!(m_pOwner->m_pProperties->m_dwStyleExes &
-            FWL_STYLEEXT_DTP_TimeFormat)) {
-        m_pOwner->ShowMonthCalendar(TRUE);
-        CFWL_Event_DtpDropDown ev;
-        m_pOwner->DispatchEvent(&ev);
-      } else {
-      }
-      m_pOwner->m_bLBtnDown = TRUE;
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-  }
-}
-void CFWL_DateTimePickerImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (!pMsg)
-    return;
-  m_pOwner->m_bLBtnDown = FALSE;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Hovered;
-  } else {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-}
-void CFWL_DateTimePickerImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-  } else {
-    m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-}
-void CFWL_DateTimePickerImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (!pMsg)
-    return;
-  m_pOwner->m_iBtnState = FWL_PARTSTATE_DTP_Normal;
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-}
-void CFWL_DateTimePickerImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
-                                                            FX_BOOL bSet) {
-  CFX_RectF rtInvalidate(m_pOwner->m_rtBtn);
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (m_pOwner->m_pEdit &&
-        !(m_pOwner->m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) {
-      m_pOwner->m_rtBtn.Set(m_pOwner->m_pProperties->m_rtWidget.width, 0,
-                            m_pOwner->m_fBtn,
-                            m_pOwner->m_pProperties->m_rtWidget.height - 1);
-    }
-    rtInvalidate = m_pOwner->m_rtBtn;
-    pMsg->m_pDstTarget = m_pOwner->m_pEdit.get();
-    IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-    pDelegate->OnProcessMessage(pMsg);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->m_rtBtn.Set(0, 0, 0, 0);
-    if (m_pOwner->DisForm_IsMonthCalendarShowed()) {
-      m_pOwner->ShowMonthCalendar(FALSE);
-    }
-    if (m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
-      pMsg->m_pSrcTarget = m_pOwner->m_pEdit.get();
-      IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pEdit->SetDelegate(NULL);
-      pDelegate->OnProcessMessage(pMsg);
-    }
-  }
-  rtInvalidate.Inflate(2, 2);
-  m_pOwner->Repaint(&rtInvalidate);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_datetimepickerimp.h b/xfa/src/fwl/basewidget/fwl_datetimepickerimp.h
deleted file mode 100644
index 4bc1063..0000000
--- a/xfa/src/fwl/basewidget/fwl_datetimepickerimp.h
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
-
-#include <memory>
-
-#include "xfa/include/fwl/core/fwl_form.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-#include "xfa/src/fwl/basewidget/fwl_monthcalendarimp.h"
-
-class CFWL_WidgetImp;
-class CFWL_WidgetImpProperties;
-class CFWL_WidgetImpDelegate;
-class CFWL_DateTimeEdit;
-class CFWL_DateTimeEditImpDelegate;
-class CFWL_DateTimeCalendar;
-class CFWL_DateTimeCalendarImpDelegate;
-class CFWL_DateTimePickerImp;
-class CFWL_DateTimePickerImpDelegate;
-
-class IFWL_DateTimeForm : public IFWL_Form {
- public:
-  static IFWL_DateTimeForm* Create(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter);
-
- protected:
-  IFWL_DateTimeForm() {}
-};
-
-class IFWL_DateTimeCalender : public IFWL_MonthCalendar {
- public:
-  static IFWL_DateTimeCalender* Create(
-      const CFWL_WidgetImpProperties& properties,
-      IFWL_Widget* pOuter);
-
- protected:
-  IFWL_DateTimeCalender() {}
-};
-
-class IFWL_DateTimeEdit : public IFWL_Edit {
- public:
-  static IFWL_DateTimeEdit* Create(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter);
-
- protected:
-  IFWL_DateTimeEdit() {}
-};
-
-class CFWL_DateTimeEdit : public CFWL_EditImp {
- public:
-  CFWL_DateTimeEdit(const CFWL_WidgetImpProperties& properties,
-                    IFWL_Widget* pOuter);
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
- protected:
-  friend class CFWL_DateTimeEditImpDelegate;
-};
-class CFWL_DateTimeEditImpDelegate : public CFWL_EditImpDelegate {
- public:
-  CFWL_DateTimeEditImpDelegate(CFWL_DateTimeEdit* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-
- private:
-  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
-
- protected:
-  CFWL_DateTimeEdit* m_pOwner;
-};
-class CFWL_DateTimeCalendar : public CFWL_MonthCalendarImp {
- public:
-  CFWL_DateTimeCalendar(const CFWL_WidgetImpProperties& properties,
-                        IFWL_Widget* pOuter);
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
- protected:
-  friend class CFWL_DateTimeCalendarImpDelegate;
-};
-class CFWL_DateTimeCalendarImpDelegate : public CFWL_MonthCalendarImpDelegate {
- public:
-  CFWL_DateTimeCalendarImpDelegate(CFWL_DateTimeCalendar* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-
-  void OnLButtonDownEx(CFWL_MsgMouse* pMsg);
-  void OnLButtonUpEx(CFWL_MsgMouse* pMsg);
-  void OnMouseMoveEx(CFWL_MsgMouse* pMsg);
-
- private:
-  int32_t DisForm_OnProcessMessage(CFWL_Message* pMessage);
-  void DisForm_OnLButtonUpEx(CFWL_MsgMouse* pMsg);
-
- protected:
-  CFWL_DateTimeCalendar* m_pOwner;
-  FX_BOOL m_bFlag;
-};
-class CFWL_DateTimePickerImp : public CFWL_WidgetImp {
- public:
-  CFWL_DateTimePickerImp(const CFWL_WidgetImpProperties& properties,
-                         IFWL_Widget* pOuter);
-  virtual ~CFWL_DateTimePickerImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pTP);
-  virtual FWL_ERR GetCurSel(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
-  virtual FWL_ERR SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
-  virtual FWL_ERR SetEditText(const CFX_WideString& wsText);
-  virtual FWL_ERR GetEditText(CFX_WideString& wsText,
-                              int32_t nStart = 0,
-                              int32_t nCount = -1) const;
-
- public:
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-  virtual FX_BOOL CanCopy();
-  virtual FX_BOOL CanCut();
-  virtual FX_BOOL CanSelectAll();
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL SelectAll();
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL DeSelect();
-  virtual FWL_ERR GetBBox(CFX_RectF& rect);
-  virtual FWL_ERR SetEditLimit(int32_t nLimit);
-  virtual FWL_ERR ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
-                                     FX_DWORD dwStylesExRemoved);
-
- public:
-  IFWL_DateTimeEdit* GetDataTimeEdit();
-
- protected:
-  void DrawDropDownButton(CFX_Graphics* pGraphics,
-                          IFWL_ThemeProvider* pTheme,
-                          const CFX_Matrix* pMatrix);
-  void FormatDateString(int32_t iYear,
-                        int32_t iMonth,
-                        int32_t iDay,
-                        CFX_WideString& wsText);
-  void ShowMonthCalendar(FX_BOOL bActivate);
-  FX_BOOL IsMonthCalendarShowed();
-  void ReSetEditAlignment();
-  void InitProxyForm();
-  void ProcessSelChanged(int32_t iYear, int32_t iMonth, int32_t iDay);
-
- private:
-  FWL_ERR DisForm_Initialize();
-  void DisForm_InitDateTimeCalendar();
-  void DisForm_InitDateTimeEdit();
-  FX_BOOL DisForm_IsMonthCalendarShowed();
-  void DisForm_ShowMonthCalendar(FX_BOOL bActivate);
-  FX_DWORD DisForm_HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  FX_BOOL DisForm_IsNeedShowButton();
-  FWL_ERR DisForm_Update();
-  FWL_ERR DisForm_GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  FWL_ERR DisForm_GetBBox(CFX_RectF& rect);
-  FWL_ERR DisForm_DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  CFX_RectF m_rtBtn;
-  CFX_RectF m_rtClient;
-  int32_t m_iBtnState;
-  int32_t m_iYear;
-  int32_t m_iMonth;
-  int32_t m_iDay;
-  FX_BOOL m_bLBtnDown;
-  std::unique_ptr<IFWL_DateTimeEdit> m_pEdit;
-  std::unique_ptr<IFWL_DateTimeCalender> m_pMonthCal;
-  std::unique_ptr<IFWL_DateTimeForm> m_pForm;
-  FX_FLOAT m_fBtn;
-  class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP {
-   public:
-    CFWL_MonthCalendarImpDP() {
-      m_iCurYear = 2010;
-      m_iCurMonth = 3;
-      m_iCurDay = 29;
-    }
-    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget,
-                               CFX_WideString& wsCaption) {
-      return FWL_ERR_Succeeded;
-    }
-    virtual int32_t GetCurDay(IFWL_Widget* pWidget) { return m_iCurDay; }
-    virtual int32_t GetCurMonth(IFWL_Widget* pWidget) { return m_iCurMonth; }
-    virtual int32_t GetCurYear(IFWL_Widget* pWidget) { return m_iCurYear; }
-    int32_t m_iCurDay;
-    int32_t m_iCurYear;
-    int32_t m_iCurMonth;
-  };
-
-  CFWL_MonthCalendarImpDP m_MonthCalendarDP;
-  friend class CFWL_DateTimeEditImpDelegate;
-  friend class CFWL_DateTimeCalendar;
-  friend class CFWL_DateTimeCalendarImpDelegate;
-  friend class CFWL_DateTimePickerImpDelegate;
-};
-class CFWL_DateTimePickerImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_DateTimePickerImpDelegate(CFWL_DateTimePickerImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-
-  CFWL_DateTimePickerImp* m_pOwner;
-
- private:
-  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_DATETIMEPICKERIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_editimp.cpp b/xfa/src/fwl/basewidget/fwl_editimp.cpp
deleted file mode 100644
index 662fa91..0000000
--- a/xfa/src/fwl/basewidget/fwl_editimp.cpp
+++ /dev/null
@@ -1,2152 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_editimp.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "xfa/include/fwl/basewidget/fwl_caret.h"
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/fde_render.h"
-#include "xfa/src/fde/fde_renderdevice.h"
-#include "xfa/src/fee/ifde_txtedtpage.h"
-#include "xfa/src/fwl/basewidget/fwl_caretimp.h"
-#include "xfa/src/fwl/basewidget/fwl_comboboximp.h"
-#include "xfa/src/fwl/basewidget/fwl_scrollbarimp.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-// static
-IFWL_Edit* IFWL_Edit::Create(const CFWL_WidgetImpProperties& properties,
-                             IFWL_Widget* pOuter) {
-  IFWL_Edit* pEdit = new IFWL_Edit;
-  CFWL_EditImp* pEditImpl = new CFWL_EditImp(properties, pOuter);
-  pEdit->SetImpl(pEditImpl);
-  pEditImpl->SetInterface(pEdit);
-  return pEdit;
-}
-// static
-IFWL_Edit* IFWL_Edit::CreateComboEdit(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_Edit* pEdit = new IFWL_Edit;
-  CFWL_EditImp* pComboEditImpl = new CFWL_ComboEditImp(properties, pOuter);
-  pEdit->SetImpl(pComboEditImpl);
-  pComboEditImpl->SetInterface(pEdit);
-  return pEdit;
-}
-IFWL_Edit::IFWL_Edit() {}
-FWL_ERR IFWL_Edit::SetText(const CFX_WideString& wsText) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetText(wsText);
-}
-int32_t IFWL_Edit::GetTextLength() const {
-  return static_cast<CFWL_EditImp*>(GetImpl())->GetTextLength();
-}
-FWL_ERR IFWL_Edit::GetText(CFX_WideString& wsText,
-                           int32_t nStart,
-                           int32_t nCount) const {
-  return static_cast<CFWL_EditImp*>(GetImpl())->GetText(wsText, nStart, nCount);
-}
-FWL_ERR IFWL_Edit::ClearText() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->ClearText();
-}
-int32_t IFWL_Edit::GetCaretPos() const {
-  return static_cast<CFWL_EditImp*>(GetImpl())->GetCaretPos();
-}
-int32_t IFWL_Edit::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetCaretPos(nIndex, bBefore);
-}
-FWL_ERR IFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->AddSelRange(nStart, nCount);
-}
-int32_t IFWL_Edit::CountSelRanges() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->CountSelRanges();
-}
-int32_t IFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->GetSelRange(nIndex, nStart);
-}
-FWL_ERR IFWL_Edit::ClearSelections() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->ClearSelections();
-}
-int32_t IFWL_Edit::GetLimit() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->GetLimit();
-}
-FWL_ERR IFWL_Edit::SetLimit(int32_t nLimit) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetLimit(nLimit);
-}
-FWL_ERR IFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetAliasChar(wAlias);
-}
-FWL_ERR IFWL_Edit::Insert(int32_t nStart,
-                          const FX_WCHAR* lpText,
-                          int32_t nLen) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Insert(nStart, lpText, nLen);
-}
-FWL_ERR IFWL_Edit::DeleteSelections() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->DeleteSelections();
-}
-FWL_ERR IFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->DeleteRange(nStart, nCount);
-}
-FWL_ERR IFWL_Edit::ReplaceSelections(const CFX_WideStringC& wsReplace) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->ReplaceSelections(wsReplace);
-}
-FWL_ERR IFWL_Edit::Replace(int32_t nStart,
-                           int32_t nLen,
-                           const CFX_WideStringC& wsReplace) {
-  return static_cast<CFWL_EditImp*>(GetImpl())
-      ->Replace(nStart, nLen, wsReplace);
-}
-FWL_ERR IFWL_Edit::DoClipboard(int32_t iCmd) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->DoClipboard(iCmd);
-}
-FX_BOOL IFWL_Edit::Copy(CFX_WideString& wsCopy) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Copy(wsCopy);
-}
-FX_BOOL IFWL_Edit::Cut(CFX_WideString& wsCut) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Cut(wsCut);
-}
-FX_BOOL IFWL_Edit::Paste(const CFX_WideString& wsPaste) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Paste(wsPaste);
-}
-FX_BOOL IFWL_Edit::Delete() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Delete();
-}
-FX_BOOL IFWL_Edit::Redo(const CFX_ByteStringC& bsRecord) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Redo(bsRecord);
-}
-FX_BOOL IFWL_Edit::Undo(const CFX_ByteStringC& bsRecord) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Undo(bsRecord);
-}
-FX_BOOL IFWL_Edit::Undo() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Undo();
-}
-FX_BOOL IFWL_Edit::Redo() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->Redo();
-}
-FX_BOOL IFWL_Edit::CanUndo() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->CanUndo();
-}
-FX_BOOL IFWL_Edit::CanRedo() {
-  return static_cast<CFWL_EditImp*>(GetImpl())->CanRedo();
-}
-FWL_ERR IFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
-  return static_cast<CFWL_EditImp*>(GetImpl())
-      ->SetTabWidth(fTabWidth, bEquidistant);
-}
-FWL_ERR IFWL_Edit::SetOuter(IFWL_Widget* pOuter) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetOuter(pOuter);
-}
-FWL_ERR IFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetNumberRange(iMin, iMax);
-}
-FWL_ERR IFWL_Edit::SetBackColor(FX_DWORD dwColor) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetBackgroundColor(dwColor);
-}
-FWL_ERR IFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetFont(wsFont, fSize);
-}
-void IFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
-  return static_cast<CFWL_EditImp*>(GetImpl())->SetScrollOffset(fScrollOffset);
-}
-FX_BOOL IFWL_Edit::GetSuggestWords(CFX_PointF pointf,
-                                   std::vector<CFX_ByteString>& sSuggest) {
-  return static_cast<CFWL_EditImp*>(GetImpl())
-      ->GetSuggestWords(pointf, sSuggest);
-}
-FX_BOOL IFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
-                                         const CFX_ByteStringC& bsReplace) {
-  return static_cast<CFWL_EditImp*>(GetImpl())
-      ->ReplaceSpellCheckWord(pointf, bsReplace);
-}
-#define FWL_EDIT_Margin 3
-CFWL_EditImp::CFWL_EditImp(const CFWL_WidgetImpProperties& properties,
-                           IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_fVAlignOffset(0.0f),
-      m_fScrollOffsetX(0.0f),
-      m_fScrollOffsetY(0.0f),
-      m_pEdtEngine(NULL),
-      m_bLButtonDown(FALSE),
-      m_nSelStart(0),
-      m_nLimit(-1),
-      m_fSpaceAbove(0),
-      m_fSpaceBelow(0),
-      m_fFontSize(0),
-      m_bSetRange(FALSE),
-      m_iMin(-1),
-      m_iMax(0xFFFFFFF),
-      m_backColor(0),
-      m_updateBackColor(FALSE),
-      m_iCurRecord(-1),
-      m_iMaxRecord(128) {
-  m_rtClient.Reset();
-  m_rtEngine.Reset();
-  m_rtStatic.Reset();
-}
-CFWL_EditImp::~CFWL_EditImp() {
-  if (m_pEdtEngine) {
-    m_pEdtEngine->Release();
-    m_pEdtEngine = NULL;
-  }
-  ClearRecord();
-}
-FWL_ERR CFWL_EditImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Edit;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_EditImp::GetClassID() const {
-  return FWL_CLASSHASH_Edit;
-}
-FWL_ERR CFWL_EditImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  if (!m_pDelegate) {
-    m_pDelegate = new CFWL_EditImpDelegate(this);
-  }
-  InitCaret();
-  if (!m_pEdtEngine) {
-    InitEngine();
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::Finalize() {
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    ShowCaret(FALSE);
-  }
-  if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->Finalize();
-  }
-  if (m_pVertScrollBar) {
-    m_pVertScrollBar->Finalize();
-  }
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_EditImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (m_pEdtEngine) {
-      int32_t iTextLen = m_pEdtEngine->GetTextLength();
-      if (iTextLen > 0) {
-        CFX_WideString wsText;
-        m_pEdtEngine->GetText(wsText, 0);
-        CFX_SizeF sz = CalcTextSize(
-            wsText, m_pProperties->m_pThemeProvider,
-            m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
-        rect.Set(0, 0, sz.x, sz.y);
-      }
-    }
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-      if (IsShowScrollBar(TRUE)) {
-        FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-        rect.width += *pfWidth;
-        rect.width += FWL_EDIT_Margin;
-      }
-      if (IsShowScrollBar(FALSE)) {
-        FX_FLOAT* pfWidth = static_cast<FX_FLOAT*>(
-            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-        rect.height += *pfWidth;
-        rect.height += FWL_EDIT_Margin;
-      }
-    }
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    ShowCaret(FALSE);
-  }
-  return CFWL_WidgetImp::SetStates(dwStates, bSet);
-}
-FWL_ERR CFWL_EditImp::SetWidgetRect(const CFX_RectF& rect) {
-  return CFWL_WidgetImp::SetWidgetRect(rect);
-}
-FWL_ERR CFWL_EditImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  Layout();
-  if (m_rtClient.IsEmpty()) {
-    return FWL_ERR_Indefinite;
-  }
-  UpdateEditEngine();
-  UpdateVAlignment();
-  UpdateScroll();
-  InitCaret();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_EditImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-    if (IsShowScrollBar(TRUE)) {
-      CFX_RectF rect;
-      m_pVertScrollBar->GetWidgetRect(rect);
-      if (rect.Contains(fx, fy)) {
-        return FWL_WGTHITTEST_VScrollBar;
-      }
-    }
-    if (IsShowScrollBar(FALSE)) {
-      CFX_RectF rect;
-      m_pHorzScrollBar->GetWidgetRect(rect);
-      if (rect.Contains(fx, fy)) {
-        return FWL_WGTHITTEST_HScrollBar;
-      }
-    }
-  }
-  if (m_rtClient.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Edit;
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-#define FX_EDIT_ISLATINWORD(u)                                     \
-  (u == 0x2D || (u <= 0x005A && u >= 0x0041) ||                    \
-   (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0) || \
-   u == 0x0027)
-static void AddSquigglyPath(CFX_Path& PathData,
-                            FX_FLOAT fStartX,
-                            FX_FLOAT fEndX,
-                            FX_FLOAT fY,
-                            FX_FLOAT fStep) {
-  PathData.MoveTo(fStartX, fY);
-  FX_FLOAT fx;
-  int32_t i;
-  for (i = 1, fx = fStartX + fStep; fx < fEndX; fx += fStep, i++) {
-    PathData.LineTo(fx, fY + (i & 1) * fStep);
-  }
-}
-void CFWL_EditImp::AddSpellCheckObj(CFX_Path& PathData,
-                                    int32_t nStart,
-                                    int32_t nCount,
-                                    FX_FLOAT fOffSetX,
-                                    FX_FLOAT fOffSetY) {
-  FX_FLOAT fStartX = 0.0f;
-  FX_FLOAT fEndX = 0.0f;
-  FX_FLOAT fY = 0.0f;
-  FX_FLOAT fStep = 0.0f;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  CFX_RectFArray rectArray;
-  CFX_RectF rectText;
-  const FDE_TXTEDTPARAMS* txtEdtParams = m_pEdtEngine->GetEditParams();
-  FX_FLOAT fAsent = (FX_FLOAT)txtEdtParams->pFont->GetAscent() *
-                    txtEdtParams->fFontSize / 1000;
-  pPage->CalcRangeRectArray(nStart, nCount, rectArray);
-  for (int i = 0; i < rectArray.GetSize(); i++) {
-    rectText = rectArray.GetAt(i);
-    fY = rectText.top + fAsent + fOffSetY;
-    fStep = txtEdtParams->fFontSize / 16.0f;
-    fStartX = rectText.left + fOffSetX;
-    fEndX = fStartX + rectText.Width();
-    AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
-  }
-}
-int32_t CFWL_EditImp::GetWordAtPoint(CFX_PointF pointf, int32_t& nCount) {
-  return 0;
-}
-FX_BOOL CFWL_EditImp::GetSuggestWords(CFX_PointF pointf,
-                                      std::vector<CFX_ByteString>& sSuggest) {
-  int32_t nWordCount = 0;
-  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
-  if (nWordCount < 1) {
-    return FALSE;
-  }
-  CFX_WideString wsSpell;
-  GetText(wsSpell, nWordStart, nWordCount);
-  CFX_ByteString sLatinWord;
-  for (int i = 0; i < nWordCount; i++) {
-    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      break;
-    }
-    sLatinWord += (FX_CHAR)wsSpell[i];
-  }
-  if (sLatinWord.IsEmpty()) {
-    return FALSE;
-  }
-  CFWL_EvtEdtCheckWord checkWordEvent;
-  checkWordEvent.m_pSrcTarget = m_pInterface;
-  checkWordEvent.bsWord = sLatinWord;
-  checkWordEvent.bCheckWord = TRUE;
-  DispatchEvent(&checkWordEvent);
-  if (checkWordEvent.bCheckWord) {
-    return FALSE;
-  }
-  CFWL_EvtEdtGetSuggestWords suggestWordsEvent;
-  suggestWordsEvent.m_pSrcTarget = m_pInterface;
-  suggestWordsEvent.bsWord = sLatinWord;
-  suggestWordsEvent.bsArraySuggestWords = sSuggest;
-  suggestWordsEvent.bSuggestWords = FALSE;
-  DispatchEvent(&checkWordEvent);
-  return suggestWordsEvent.bSuggestWords;
-}
-FX_BOOL CFWL_EditImp::ReplaceSpellCheckWord(CFX_PointF pointf,
-                                            const CFX_ByteStringC& bsReplace) {
-  int32_t nWordCount = 0;
-  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
-  if (nWordCount < 1) {
-    return FALSE;
-  }
-  CFX_WideString wsSpell;
-  GetText(wsSpell, nWordStart, nWordCount);
-  for (int i = 0; i < nWordCount; i++) {
-    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      nWordCount = i;
-      break;
-    }
-  }
-  int32_t nDestLen = bsReplace.GetLength();
-  CFX_WideString wsDest;
-  FX_WCHAR* pBuffer = wsDest.GetBuffer(nDestLen);
-  for (int32_t i = 0; i < nDestLen; i++) {
-    pBuffer[i] = bsReplace[i];
-  }
-  wsDest.ReleaseBuffer(nDestLen);
-  Replace(nWordStart, nWordCount, wsDest);
-  return TRUE;
-}
-void CFWL_EditImp::DrawSpellCheck(CFX_Graphics* pGraphics,
-                                  const CFX_Matrix* pMatrix) {
-  pGraphics->SaveGraphState();
-  if (pMatrix) {
-    pGraphics->ConcatMatrix(const_cast<CFX_Matrix*>(pMatrix));
-  }
-  FX_ARGB cr = 0xFFFF0000;
-  CFX_Color crLine(cr);
-  CFWL_EvtEdtCheckWord checkWordEvent;
-  checkWordEvent.m_pSrcTarget = m_pInterface;
-  CFX_ByteString sLatinWord;
-  CFX_Path pathSpell;
-  pathSpell.Create();
-  int32_t nStart = 0;
-  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
-  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
-  CFX_WideString wsSpell;
-  GetText(wsSpell);
-  int32_t nContentLen = wsSpell.GetLength();
-  for (int i = 0; i < nContentLen; i++) {
-    if (FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      if (sLatinWord.IsEmpty()) {
-        nStart = i;
-      }
-      sLatinWord += (FX_CHAR)wsSpell[i];
-    } else {
-      checkWordEvent.bsWord = sLatinWord;
-      checkWordEvent.bCheckWord = TRUE;
-      DispatchEvent(&checkWordEvent);
-      if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
-        AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
-                         fOffSetY);
-      }
-      sLatinWord.Empty();
-    }
-  }
-  checkWordEvent.bsWord = sLatinWord;
-  checkWordEvent.bCheckWord = TRUE;
-  DispatchEvent(&checkWordEvent);
-  if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
-    AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
-                     fOffSetY);
-  }
-  if (!pathSpell.IsEmpty()) {
-    CFX_RectF rtClip = m_rtEngine;
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY);
-    if (pMatrix) {
-      pMatrix->TransformRect(rtClip);
-      mt.Concat(*pMatrix);
-    }
-    pGraphics->SetClipRect(rtClip);
-    pGraphics->SetStrokeColor(&crLine);
-    pGraphics->SetLineWidth(0);
-    pGraphics->StrokePath(&pathSpell, NULL);
-  }
-  pGraphics->RestoreGraphState();
-}
-FWL_ERR CFWL_EditImp::DrawWidget(CFX_Graphics* pGraphics,
-                                 const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  if (m_rtClient.IsEmpty()) {
-    return FWL_ERR_Indefinite;
-  }
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (!m_pWidgetMgr->IsFormDisabled()) {
-    DrawTextBk(pGraphics, pTheme, pMatrix);
-  }
-  if (m_pEdtEngine) {
-    DrawContent(pGraphics, pTheme, pMatrix);
-  }
-  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
-      !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly)) {
-    DrawSpellCheck(pGraphics, pMatrix);
-  }
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_EDT_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_EDT_Edge, pTheme, pMatrix);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  if (!pThemeProvider)
-    return FWL_ERR_Indefinite;
-  if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->SetThemeProvider(pThemeProvider);
-  }
-  if (m_pVertScrollBar) {
-    m_pVertScrollBar->SetThemeProvider(pThemeProvider);
-  }
-  if (m_pCaret) {
-    m_pCaret->SetThemeProvider(pThemeProvider);
-  }
-  m_pProperties->m_pThemeProvider = pThemeProvider;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetText(const CFX_WideString& wsText) {
-  m_pEdtEngine->SetText(wsText);
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_EditImp::GetTextLength() const {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetTextLength();
-}
-FWL_ERR CFWL_EditImp::GetText(CFX_WideString& wsText,
-                              int32_t nStart,
-                              int32_t nCount) const {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->GetText(wsText, nStart, nCount);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::ClearText() {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->ClearText();
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_EditImp::GetCaretPos() const {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetCaretPos();
-}
-int32_t CFWL_EditImp::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-}
-FWL_ERR CFWL_EditImp::AddSelRange(int32_t nStart, int32_t nCount) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->AddSelRange(nStart, nCount);
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_EditImp::CountSelRanges() {
-  if (!m_pEdtEngine)
-    return 0;
-  return m_pEdtEngine->CountSelRanges();
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_EditImp::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetSelRange(nIndex, nStart);
-}
-FWL_ERR CFWL_EditImp::ClearSelections() {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->ClearSelection();
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_EditImp::GetLimit() {
-  return m_nLimit;
-}
-FWL_ERR CFWL_EditImp::SetLimit(int32_t nLimit) {
-  m_nLimit = nLimit;
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->SetLimit(nLimit);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetAliasChar(FX_WCHAR wAlias) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Indefinite;
-  m_pEdtEngine->SetAliasChar(wAlias);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::Insert(int32_t nStart,
-                             const FX_WCHAR* lpText,
-                             int32_t nLen) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    return FWL_ERR_Indefinite;
-  }
-  m_pEdtEngine->Insert(nStart, lpText, nLen);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::DeleteSelections() {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  int32_t iCount = m_pEdtEngine->CountSelRanges();
-  if (iCount > 0) {
-    m_pEdtEngine->Delete(-1);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::DeleteRange(int32_t nStart, int32_t nCount) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->DeleteRange(nStart, nCount);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::ReplaceSelections(const CFX_WideStringC& wsReplace) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  int32_t iCount = m_pEdtEngine->CountSelRanges();
-  for (int i = 0; i < iCount; i++) {
-    int32_t nStart;
-    int32_t nCount = m_pEdtEngine->GetSelRange(i, nStart);
-    m_pEdtEngine->Replace(nStart, nCount, wsReplace);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::Replace(int32_t nStart,
-                              int32_t nLen,
-                              const CFX_WideStringC& wsReplace) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  m_pEdtEngine->Replace(nStart, nLen, wsReplace);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::DoClipboard(int32_t iCmd) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    return FWL_ERR_Succeeded;
-  }
-  return FWL_ERR_Indefinite;
-}
-FX_BOOL CFWL_EditImp::Copy(CFX_WideString& wsCopy) {
-  if (!m_pEdtEngine)
-    return FALSE;
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
-  if (nCount == 0) {
-    return FALSE;
-  }
-  wsCopy.Empty();
-  CFX_WideString wsTemp;
-  int32_t nStart, nLength;
-  for (int32_t i = 0; i < nCount; i++) {
-    nLength = m_pEdtEngine->GetSelRange(i, nStart);
-    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
-    wsCopy += wsTemp;
-    wsTemp.Empty();
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::Cut(CFX_WideString& wsCut) {
-  if (!m_pEdtEngine)
-    return FALSE;
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
-  if (nCount == 0) {
-    return FALSE;
-  }
-  wsCut.Empty();
-  CFX_WideString wsTemp;
-  int32_t nStart, nLength;
-  for (int32_t i = 0; i < nCount; i++) {
-    nLength = m_pEdtEngine->GetSelRange(i, nStart);
-    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
-    wsCut += wsTemp;
-    wsTemp.Empty();
-  }
-  m_pEdtEngine->Delete(0);
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::Paste(const CFX_WideString& wsPaste) {
-  if (!m_pEdtEngine)
-    return FALSE;
-  int32_t nCaret = m_pEdtEngine->GetCaretPos();
-  int32_t iError =
-      m_pEdtEngine->Insert(nCaret, wsPaste.c_str(), wsPaste.GetLength());
-  if (iError < 0) {
-    ProcessInsertError(iError);
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::Delete() {
-  if (!m_pEdtEngine)
-    return FALSE;
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
-  if (nCount < 1) {
-    return FALSE;
-  }
-  m_pEdtEngine->Delete(0);
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::Redo(const CFX_ByteStringC& bsRecord) {
-  if (!m_pEdtEngine)
-    return FALSE;
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) {
-    return TRUE;
-  }
-  return m_pEdtEngine->Redo(bsRecord);
-}
-FX_BOOL CFWL_EditImp::Undo(const CFX_ByteStringC& bsRecord) {
-  if (!m_pEdtEngine)
-    return FALSE;
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) {
-    return TRUE;
-  }
-  return m_pEdtEngine->Undo(bsRecord);
-}
-FX_BOOL CFWL_EditImp::Undo() {
-  if (!CanUndo()) {
-    return FALSE;
-  }
-  CFX_ByteString bsRecord = m_RecordArr[m_iCurRecord--];
-  return Undo(bsRecord);
-}
-FX_BOOL CFWL_EditImp::Redo() {
-  if (!CanRedo()) {
-    return FALSE;
-  }
-  CFX_ByteString bsRecord = m_RecordArr[++m_iCurRecord];
-  return Redo(bsRecord);
-}
-FX_BOOL CFWL_EditImp::CanUndo() {
-  return m_iCurRecord >= 0;
-}
-FX_BOOL CFWL_EditImp::CanRedo() {
-  return m_iCurRecord < m_RecordArr.GetSize() - 1;
-}
-FWL_ERR CFWL_EditImp::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
-  if (!m_pEdtEngine)
-    return FWL_ERR_Succeeded;
-  FDE_LPTXTEDTPARAMS pParams =
-      (FDE_LPTXTEDTPARAMS)m_pEdtEngine->GetEditParams();
-  pParams->fTabWidth = fTabWidth;
-  pParams->bTabEquidistant = bEquidistant;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetOuter(IFWL_Widget* pOuter) {
-  m_pOuter = pOuter;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetNumberRange(int32_t iMin, int32_t iMax) {
-  m_iMin = iMin;
-  m_iMax = iMax;
-  m_bSetRange = TRUE;
-  return FWL_ERR_Succeeded;
-}
-void CFWL_EditImp::On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
-                                   int32_t nPage,
-                                   FX_BOOL bVisible) {
-  if (m_rtEngine.IsEmpty()) {
-    return;
-  }
-  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    return;
-  }
-  FX_BOOL bRepaintContent = UpdateOffset();
-  UpdateCaret();
-  CFX_RectF rtInvalid;
-  rtInvalid.Set(0, 0, 0, 0);
-  FX_BOOL bRepaintScroll = FALSE;
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) {
-    IFWL_ScrollBar* pScroll = UpdateScroll();
-    if (pScroll) {
-      pScroll->GetWidgetRect(rtInvalid);
-      bRepaintScroll = TRUE;
-    }
-  }
-  if (bRepaintContent || bRepaintScroll) {
-    if (bRepaintContent) {
-      rtInvalid.Union(m_rtEngine);
-    }
-    Repaint(&rtInvalid);
-  }
-}
-void CFWL_EditImp::On_TextChanged(IFDE_TxtEdtEngine* pEdit,
-                                  FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) {
-  FX_DWORD dwStyleEx = m_pProperties->m_dwStyleExes;
-  if (dwStyleEx & FWL_STYLEEXT_EDT_VAlignMask) {
-    UpdateVAlignment();
-  }
-  IFDE_TxtEdtPage* page = m_pEdtEngine->GetPage(0);
-  FX_FLOAT fContentWidth = page->GetContentsBox().width;
-  FX_FLOAT fContentHeight = page->GetContentsBox().height;
-  CFX_RectF rtTemp;
-  GetClientRect(rtTemp);
-  FX_BOOL bHSelfAdaption =
-      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption;
-  FX_BOOL bVSelfAdaption =
-      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption;
-  FX_BOOL bNeedUpdate = FALSE;
-  if (bHSelfAdaption || bVSelfAdaption) {
-    CFWL_EvtEdtPreSelfAdaption evt;
-    evt.m_pSrcTarget = m_pInterface;
-    evt.bHSelfAdaption = TRUE;
-    evt.bVSelfAdaption = TRUE;
-    FX_FLOAT fWidth;
-    FX_FLOAT fHight;
-    fWidth = bHSelfAdaption ? fContentWidth : m_pProperties->m_rtWidget.width;
-    fHight = bVSelfAdaption ? fContentHeight : m_pProperties->m_rtWidget.height;
-    evt.rtAfterChange.Set(0, 0, fWidth, fHight);
-    DispatchEvent(&evt);
-    if (!evt.bHSelfAdaption) {
-      ModifyStylesEx(
-          0, FWL_STYLEEXT_EDT_HSelfAdaption | FWL_STYLEEXT_EDT_AutoHScroll);
-    }
-    if (!evt.bVSelfAdaption) {
-      ModifyStylesEx(
-          0, FWL_STYLEEXT_EDT_VSelfAdaption | FWL_STYLEEXT_EDT_AutoVScroll);
-    }
-    bNeedUpdate = (bHSelfAdaption && !evt.bHSelfAdaption) ||
-                  (bVSelfAdaption && !evt.bVSelfAdaption);
-  }
-  FX_FLOAT fContentWidth1 = fContentWidth;
-  FX_FLOAT fContentHeight1 = fContentHeight;
-  if (bNeedUpdate) {
-    UpdateEditParams();
-    UpdateEditLayout();
-    IFDE_TxtEdtPage* page1 = m_pEdtEngine->GetPage(0);
-    fContentWidth1 = page1->GetContentsBox().width;
-    fContentHeight1 = page1->GetContentsBox().height;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption) {
-    rtTemp.width = std::max(m_pProperties->m_rtWidget.width, fContentWidth1);
-    m_pProperties->m_rtWidget.width = fContentWidth1;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption) {
-    rtTemp.height = std::max(m_pProperties->m_rtWidget.height, fContentHeight1);
-    m_pProperties->m_rtWidget.height = fContentHeight1;
-  }
-  CFWL_EvtEdtTextChanged event;
-  event.m_pSrcTarget = m_pInterface;
-  event.nChangeType = ChangeInfo.nChangeType;
-  event.wsInsert = ChangeInfo.wsInsert;
-  event.wsDelete = ChangeInfo.wsDelete;
-  event.wsPrevText = ChangeInfo.wsPrevText;
-  DispatchEvent(&event);
-  LayoutScrollBar();
-  Repaint(&rtTemp);
-}
-void CFWL_EditImp::On_SelChanged(IFDE_TxtEdtEngine* pEdit) {
-  CFX_RectF rtTemp;
-  GetClientRect(rtTemp);
-  Repaint(&rtTemp);
-}
-FX_BOOL CFWL_EditImp::On_PageLoad(IFDE_TxtEdtEngine* pEdit,
-                                  int32_t nPageIndex,
-                                  int32_t nPurpose) {
-  IFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
-  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
-  if (!pPage)
-    return FALSE;
-  pPage->LoadPage(nullptr, nullptr);
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::On_PageUnload(IFDE_TxtEdtEngine* pEdit,
-                                    int32_t nPageIndex,
-                                    int32_t nPurpose) {
-  IFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
-  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
-  if (!pPage)
-    return FALSE;
-  pPage->UnloadPage(nullptr);
-  return TRUE;
-}
-
-void CFWL_EditImp::On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
-                                  const CFX_ByteStringC& bsDoRecord) {
-  AddDoRecord(bsDoRecord);
-}
-
-FX_BOOL CFWL_EditImp::On_ValidateField(IFDE_TxtEdtEngine* pEdit,
-                                       int32_t nBlockIndex,
-                                       int32_t nFieldIndex,
-                                       const CFX_WideString& wsFieldText,
-                                       int32_t nCharIndex) {
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
-                                       int32_t nBlockIndex) {
-  return TRUE;
-}
-FX_BOOL CFWL_EditImp::On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
-                                            int32_t nBlockIndex,
-                                            CFX_WideString& wsBlockText) {
-  return FALSE;
-}
-FX_BOOL CFWL_EditImp::On_Validate(IFDE_TxtEdtEngine* pEdit,
-                                  CFX_WideString& wsText) {
-  IFWL_Widget* pDst = GetOuter();
-  if (!pDst) {
-    pDst = m_pInterface;
-  }
-  CFWL_EvtEdtValidate event;
-  event.pDstWidget = pDst;
-  event.m_pSrcTarget = m_pInterface;
-  event.wsInsert = wsText;
-  event.bValidate = TRUE;
-  DispatchEvent(&event);
-  return event.bValidate;
-}
-FWL_ERR CFWL_EditImp::SetBackgroundColor(FX_DWORD color) {
-  m_backColor = color;
-  m_updateBackColor = TRUE;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImp::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
-  m_wsFont = wsFont;
-  m_fFontSize = fSize;
-  return FWL_ERR_Succeeded;
-}
-void CFWL_EditImp::SetScrollOffset(FX_FLOAT fScrollOffset) {
-  m_fScrollOffsetY = fScrollOffset;
-}
-void CFWL_EditImp::DrawTextBk(CFX_Graphics* pGraphics,
-                              IFWL_ThemeProvider* pTheme,
-                              const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_EDT_Background;
-  param.m_dwData = FWL_PARTDATA_EDT_Background;
-  param.m_dwStates = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly
-                         ? FWL_PARTSTATE_EDT_ReadOnly
-                         : FWL_PARTSTATE_EDT_Normal;
-  FX_DWORD dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled);
-  if (dwStates) {
-    param.m_dwStates = FWL_PARTSTATE_EDT_Disable;
-  }
-  param.m_pGraphics = pGraphics;
-  param.m_matrix = *pMatrix;
-  param.m_rtPart = m_rtClient;
-  pTheme->DrawBackground(&param);
-  if (!IsShowScrollBar(TRUE) || !IsShowScrollBar(FALSE)) {
-    return;
-  }
-  CFX_RectF rtScorll;
-  m_pHorzScrollBar->GetWidgetRect(rtScorll);
-  CFX_RectF rtStatic;
-  rtStatic.Set(m_rtClient.right() - rtScorll.height,
-               m_rtClient.bottom() - rtScorll.height, rtScorll.height,
-               rtScorll.height);
-  param.m_dwData = FWL_PARTDATA_EDT_StaticBackground;
-  param.m_rtPart = rtStatic;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_EditImp::DrawContent(CFX_Graphics* pGraphics,
-                               IFWL_ThemeProvider* pTheme,
-                               const CFX_Matrix* pMatrix) {
-  if (!m_pEdtEngine)
-    return;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return;
-  pGraphics->SaveGraphState();
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
-    pGraphics->SaveGraphState();
-  }
-  CFX_RectF rtClip = m_rtEngine;
-  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
-  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
-  CFX_Matrix mt;
-  mt.Set(1, 0, 0, 1, fOffSetX, fOffSetY);
-  if (pMatrix) {
-    pMatrix->TransformRect(rtClip);
-    mt.Concat(*pMatrix);
-  }
-  FX_BOOL bShowSel =
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoHideSel) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
-  if (bShowSel) {
-    IFWL_Widget* pForm =
-        m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
-    if (pForm) {
-      bShowSel = (pForm->GetStates() & FWL_WGTSTATE_Deactivated) !=
-                 FWL_WGTSTATE_Deactivated;
-    }
-  }
-  int32_t nSelCount = m_pEdtEngine->CountSelRanges();
-  if (bShowSel && nSelCount > 0) {
-    int32_t nPageCharStart = pPage->GetCharStart();
-    int32_t nPageCharCount = pPage->GetCharCount();
-    int32_t nPageCharEnd = nPageCharStart + nPageCharCount - 1;
-    int32_t nCharCount;
-    int32_t nCharStart;
-    CFX_RectFArray rectArr;
-    int32_t i = 0;
-    for (i = 0; i < nSelCount; i++) {
-      nCharCount = m_pEdtEngine->GetSelRange(i, nCharStart);
-      int32_t nCharEnd = nCharStart + nCharCount - 1;
-      if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd) {
-        continue;
-      }
-      int32_t nBgn = std::max(nCharStart, nPageCharStart);
-      int32_t nEnd = std::min(nCharEnd, nPageCharEnd);
-      pPage->CalcRangeRectArray(nBgn - nPageCharStart, nEnd - nBgn + 1,
-                                rectArr);
-    }
-    int32_t nCount = rectArr.GetSize();
-    CFX_Path path;
-    path.Create();
-    for (i = 0; i < nCount; i++) {
-      rectArr[i].left += fOffSetX;
-      rectArr[i].top += fOffSetY;
-      path.AddRectangle(rectArr[i].left, rectArr[i].top, rectArr[i].width,
-                        rectArr[i].height);
-    }
-    pGraphics->SetClipRect(rtClip);
-    CFWL_ThemeBackground param;
-    param.m_pGraphics = pGraphics;
-    param.m_matrix = *pMatrix;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_EDT_Background;
-    param.m_pPath = &path;
-    pTheme->DrawBackground(&param);
-  }
-  CFX_RenderDevice* pRenderDev = pGraphics->GetRenderDevice();
-  if (!pRenderDev)
-    return;
-  IFDE_RenderDevice* pRenderDevice = IFDE_RenderDevice::Create(pRenderDev);
-  if (!pRenderDevice)
-    return;
-  IFDE_RenderContext* pRenderContext = IFDE_RenderContext::Create();
-  if (!pRenderContext)
-    return;
-  pRenderDevice->SetClipRect(rtClip);
-  pRenderContext->StartRender(pRenderDevice, pPage, mt);
-  pRenderContext->DoRender(NULL);
-  pRenderContext->Release();
-  pRenderDevice->Release();
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
-    pGraphics->RestoreGraphState();
-    CFX_Path path;
-    path.Create();
-    int32_t iLimit = m_nLimit > 0 ? m_nLimit : 1;
-    FX_FLOAT fStep = m_rtEngine.width / iLimit;
-    FX_FLOAT fLeft = m_rtEngine.left + 1;
-    for (int32_t i = 1; i < iLimit; i++) {
-      fLeft += fStep;
-      path.AddLine(fLeft, m_rtClient.top, fLeft, m_rtClient.bottom());
-    }
-    CFWL_ThemeBackground param;
-    param.m_pGraphics = pGraphics;
-    param.m_matrix = *pMatrix;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_EDT_CombTextLine;
-    param.m_pPath = &path;
-    pTheme->DrawBackground(&param);
-  }
-  pGraphics->RestoreGraphState();
-}
-void CFWL_EditImp::UpdateEditEngine() {
-  UpdateEditParams();
-  UpdateEditLayout();
-  if (m_nLimit > -1) {
-    m_pEdtEngine->SetLimit(m_nLimit);
-  }
-}
-void CFWL_EditImp::UpdateEditParams() {
-  FDE_TXTEDTPARAMS params;
-  params.nHorzScale = 100;
-  params.fPlateWidth = m_rtEngine.width;
-  params.fPlateHeight = m_rtEngine.height;
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_RTLLayout) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_RTL;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalLayout) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_DocVertical;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalChars) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CharVertial;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReverseLine) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LineReserve;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ArabicShapes) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ArabicShapes;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ExpandTab) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ExpandTab;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CombText;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_LastLineHeight) {
-    params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LastLineHeight;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Validate) {
-    params.dwMode |= FDE_TEXTEDITMODE_Validate;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Password) {
-    params.dwMode |= FDE_TEXTEDITMODE_Password;
-  }
-  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignMask) {
-    case FWL_STYLEEXT_EDT_HNear: {
-      params.dwAlignment |= FDE_TEXTEDITALIGN_Left;
-      break;
-    }
-    case FWL_STYLEEXT_EDT_HCenter: {
-      params.dwAlignment |= FDE_TEXTEDITALIGN_Center;
-      break;
-    }
-    case FWL_STYLEEXT_EDT_HFar: {
-      params.dwAlignment |= FDE_TEXTEDITALIGN_Right;
-      break;
-    }
-    default: {}
-  }
-  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignModeMask) {
-    case FWL_STYLEEXT_EDT_Justified: {
-      params.dwAlignment |= FDE_TEXTEDITALIGN_Justified;
-      break;
-    }
-    case FWL_STYLEEXT_EDT_Distributed: {
-      params.dwAlignment |= FDE_TEXTEDITALIGN_Distributed;
-      break;
-    }
-    default: { params.dwAlignment |= FDE_TEXTEDITALIGN_Normal; }
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) {
-    params.dwMode |= FDE_TEXTEDITMODE_MultiLines;
-    if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) == 0 &&
-        (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) {
-      params.dwMode |=
-          FDE_TEXTEDITMODE_AutoLineWrap | FDE_TEXTEDITMODE_LimitArea_Horz;
-    }
-    if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) == 0 &&
-        (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoVScroll) == 0) {
-      params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Vert;
-    } else {
-      params.fPlateHeight = 0x00FFFFFF;
-    }
-  } else {
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) {
-      params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Horz;
-    }
-  }
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    params.dwMode |= FDE_TEXTEDITMODE_ReadOnly;
-  }
-  FX_FLOAT* pFontSize =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FontSize));
-  if (!pFontSize)
-    return;
-  m_fFontSize = *pFontSize;
-  FX_DWORD* pFontColor =
-      static_cast<FX_DWORD*>(GetThemeCapacity(FWL_WGTCAPACITY_TextColor));
-  if (!pFontColor)
-    return;
-  params.dwFontColor = *pFontColor;
-  FX_FLOAT* pLineHeight =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_LineHeight));
-  if (!pLineHeight)
-    return;
-  params.fLineSpace = *pLineHeight;
-  IFX_Font* pFont =
-      static_cast<IFX_Font*>(GetThemeCapacity(FWL_WGTCAPACITY_Font));
-  if (!pFont)
-    return;
-  params.pFont = pFont;
-  params.fFontSize = m_fFontSize;
-  params.nLineCount = (int32_t)(params.fPlateHeight / params.fLineSpace);
-  if (params.nLineCount <= 0) {
-    params.nLineCount = 1;
-  }
-  params.fTabWidth = params.fFontSize * 1;
-  params.bTabEquidistant = TRUE;
-  params.wLineBreakChar = L'\n';
-  params.nCharRotation = 0;
-  params.pEventSink = this;
-  m_pEdtEngine->SetEditParams(params);
-}
-
-void CFWL_EditImp::UpdateEditLayout() {
-  if (m_pEdtEngine->GetTextLength() <= 0)
-    m_pEdtEngine->SetTextByStream(nullptr);
-
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  if (pPage)
-    pPage->UnloadPage(nullptr);
-
-  m_pEdtEngine->StartLayout();
-  m_pEdtEngine->DoLayout(nullptr);
-  m_pEdtEngine->EndLayout();
-  pPage = m_pEdtEngine->GetPage(0);
-  if (pPage)
-    pPage->LoadPage(nullptr, nullptr);
-}
-
-FX_BOOL CFWL_EditImp::UpdateOffset() {
-  CFX_RectF rtCaret;
-  m_pEdtEngine->GetCaretRect(rtCaret);
-  FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
-  FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
-  rtCaret.Offset(fOffSetX, fOffSetY);
-  const CFX_RectF& rtEidt = m_rtEngine;
-  if (rtEidt.Contains(rtCaret)) {
-    IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-    if (!pPage)
-      return FALSE;
-    CFX_RectF rtFDE = pPage->GetContentsBox();
-    rtFDE.Offset(fOffSetX, fOffSetY);
-    if (rtFDE.right() < rtEidt.right() && m_fScrollOffsetX > 0) {
-      m_fScrollOffsetX += rtFDE.right() - rtEidt.right();
-      if (m_fScrollOffsetX < 0) {
-        m_fScrollOffsetX = 0;
-      }
-    }
-    if (rtFDE.bottom() < rtEidt.bottom() && m_fScrollOffsetY > 0) {
-      m_fScrollOffsetY += rtFDE.bottom() - rtEidt.bottom();
-      if (m_fScrollOffsetY < 0) {
-        m_fScrollOffsetY = 0;
-      }
-    }
-    return FALSE;
-  } else {
-    FX_FLOAT offsetX = 0.0;
-    FX_FLOAT offsetY = 0.0;
-    if (rtCaret.left < rtEidt.left) {
-      offsetX = rtCaret.left - rtEidt.left;
-    }
-    if (rtCaret.right() > rtEidt.right()) {
-      offsetX = rtCaret.right() - rtEidt.right();
-    }
-    if (rtCaret.top < rtEidt.top) {
-      offsetY = rtCaret.top - rtEidt.top;
-    }
-    if (rtCaret.bottom() > rtEidt.bottom()) {
-      offsetY = rtCaret.bottom() - rtEidt.bottom();
-    }
-    if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption)) {
-      m_fScrollOffsetX += offsetX;
-    }
-    if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption)) {
-      m_fScrollOffsetY += offsetY;
-    }
-    if (m_fFontSize > m_rtEngine.height) {
-      m_fScrollOffsetY = 0;
-    }
-    return TRUE;
-  }
-}
-FX_BOOL CFWL_EditImp::UpdateOffset(IFWL_ScrollBar* pScrollBar,
-                                   FX_FLOAT fPosChanged) {
-  if (pScrollBar == m_pHorzScrollBar.get()) {
-    m_fScrollOffsetX += fPosChanged;
-  } else {
-    m_fScrollOffsetY += fPosChanged;
-  }
-  return TRUE;
-}
-void CFWL_EditImp::UpdateVAlignment() {
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return;
-  const CFX_RectF& rtFDE = pPage->GetContentsBox();
-  FX_FLOAT fOffsetY = 0.0f;
-  FX_FLOAT fSpaceAbove = 0.0f;
-  FX_FLOAT fSpaceBelow = 0.0f;
-  CFX_SizeF* pSpace = static_cast<CFX_SizeF*>(
-      GetThemeCapacity(FWL_WGTCAPACITY_SpaceAboveBelow));
-  if (pSpace) {
-    fSpaceAbove = pSpace->x;
-    fSpaceBelow = pSpace->y;
-  }
-  if (fSpaceAbove < 0.1f) {
-    fSpaceAbove = 0;
-  }
-  if (fSpaceBelow < 0.1f) {
-    fSpaceBelow = 0;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VCenter) {
-    fOffsetY = (m_rtEngine.height - rtFDE.height) / 2;
-    if (fOffsetY < (fSpaceAbove + fSpaceBelow) / 2 &&
-        fSpaceAbove < fSpaceBelow) {
-      return;
-    }
-    fOffsetY += (fSpaceAbove - fSpaceBelow) / 2;
-  } else if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VFar) {
-    fOffsetY = (m_rtEngine.height - rtFDE.height);
-    fOffsetY -= fSpaceBelow;
-  } else {
-    fOffsetY += fSpaceAbove;
-  }
-  m_fVAlignOffset = fOffsetY;
-  if (m_fVAlignOffset < 0) {
-    m_fVAlignOffset = 0;
-  }
-}
-void CFWL_EditImp::UpdateCaret() {
-  CFX_RectF rtFDE;
-  m_pEdtEngine->GetCaretRect(rtFDE);
-  rtFDE.Offset(m_rtEngine.left - m_fScrollOffsetX,
-               m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset);
-  CFX_RectF rtCaret;
-  rtCaret.Set(rtFDE.left, rtFDE.top, rtFDE.width, rtFDE.height);
-  CFX_RectF temp = rtCaret;
-  CFX_RectF rtClient;
-  GetClientRect(rtClient);
-  rtCaret.Intersect(rtClient);
-  if (rtCaret.left > rtClient.right()) {
-    FX_FLOAT right = rtCaret.right();
-    rtCaret.left = rtClient.right() - 1;
-    rtCaret.width = right - rtCaret.left;
-  }
-  FX_BOOL bIntersect = !rtCaret.IsEmpty();
-  FX_BOOL bShow = TRUE;
-  FX_BOOL bShowWhole = FALSE;
-  if (!(m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) || !bIntersect) {
-    bShow = FALSE;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption &&
-      temp.right() > m_rtEngine.right()) {
-    bShowWhole = TRUE;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VSelfAdaption &&
-      temp.bottom() > m_rtEngine.bottom()) {
-    bShowWhole = TRUE;
-  } else {
-    bShow = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && bIntersect);
-  }
-  if (bShowWhole) {
-    rtCaret = temp;
-  }
-  ShowCaret(bShow, &rtCaret);
-}
-IFWL_ScrollBar* CFWL_EditImp::UpdateScroll() {
-  FX_BOOL bShowHorz =
-      m_pHorzScrollBar &&
-      ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0);
-  FX_BOOL bShowVert =
-      m_pVertScrollBar &&
-      ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0);
-  if (!bShowHorz && !bShowVert) {
-    return NULL;
-  }
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return NULL;
-  const CFX_RectF& rtFDE = pPage->GetContentsBox();
-  IFWL_ScrollBar* pRepaint = NULL;
-  if (bShowHorz) {
-    CFX_RectF rtScroll;
-    m_pHorzScrollBar->GetWidgetRect(rtScroll);
-    if (rtScroll.width < rtFDE.width) {
-      m_pHorzScrollBar->LockUpdate();
-      FX_FLOAT fRange = rtFDE.width - rtScroll.width;
-      m_pHorzScrollBar->SetRange(0.0f, fRange);
-      FX_FLOAT fPos = m_fScrollOffsetX;
-      if (fPos < 0.0f) {
-        fPos = 0.0f;
-      }
-      if (fPos > fRange) {
-        fPos = fRange;
-      }
-      m_pHorzScrollBar->SetPos(fPos);
-      m_pHorzScrollBar->SetTrackPos(fPos);
-      m_pHorzScrollBar->SetPageSize(rtScroll.width);
-      m_pHorzScrollBar->SetStepSize(rtScroll.width / 10);
-      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE);
-      m_pHorzScrollBar->UnlockUpdate();
-      m_pHorzScrollBar->Update();
-      pRepaint = m_pHorzScrollBar.get();
-    } else if ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) {
-      m_pHorzScrollBar->LockUpdate();
-      m_pHorzScrollBar->SetRange(0, -1);
-      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE);
-      m_pHorzScrollBar->UnlockUpdate();
-      m_pHorzScrollBar->Update();
-      pRepaint = m_pHorzScrollBar.get();
-    }
-  }
-  if (bShowVert) {
-    CFX_RectF rtScroll;
-    m_pVertScrollBar->GetWidgetRect(rtScroll);
-    if (rtScroll.height < rtFDE.height) {
-      m_pVertScrollBar->LockUpdate();
-      FX_FLOAT fStep = m_pEdtEngine->GetEditParams()->fLineSpace;
-      FX_FLOAT fRange = rtFDE.height - m_rtEngine.height;
-      if (fRange < fStep) {
-        fRange = fStep;
-      }
-      m_pVertScrollBar->SetRange(0.0f, fRange);
-      FX_FLOAT fPos = m_fScrollOffsetY;
-      if (fPos < 0.0f) {
-        fPos = 0.0f;
-      }
-      if (fPos > fRange) {
-        fPos = fRange;
-      }
-      m_pVertScrollBar->SetPos(fPos);
-      m_pVertScrollBar->SetTrackPos(fPos);
-      m_pVertScrollBar->SetPageSize(rtScroll.height);
-      m_pVertScrollBar->SetStepSize(fStep);
-      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, FALSE);
-      m_pVertScrollBar->UnlockUpdate();
-      m_pVertScrollBar->Update();
-      pRepaint = m_pVertScrollBar.get();
-    } else if ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) {
-      m_pVertScrollBar->LockUpdate();
-      m_pVertScrollBar->SetRange(0, -1);
-      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled, TRUE);
-      m_pVertScrollBar->UnlockUpdate();
-      m_pVertScrollBar->Update();
-      pRepaint = m_pVertScrollBar.get();
-    }
-  }
-  return pRepaint;
-}
-FX_BOOL CFWL_EditImp::IsShowScrollBar(FX_BOOL bVert) {
-  FX_BOOL bShow =
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus)
-          ? (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) ==
-                FWL_WGTSTATE_Focused
-          : TRUE;
-  if (bVert) {
-    return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll) &&
-           (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) &&
-           IsContentHeightOverflow();
-  }
-  return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) &&
-         (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
-}
-FX_BOOL CFWL_EditImp::IsContentHeightOverflow() {
-  if (!m_pEdtEngine)
-    return FALSE;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return FALSE;
-  return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f;
-}
-int32_t CFWL_EditImp::AddDoRecord(const CFX_ByteStringC& bsDoRecord) {
-  int32_t nCount = m_RecordArr.GetSize();
-  if (m_iCurRecord == nCount - 1) {
-    if (nCount == m_iMaxRecord) {
-      m_RecordArr.RemoveAt(0);
-      m_iCurRecord--;
-    }
-  } else {
-    for (int32_t i = nCount - 1; i > m_iCurRecord; i--) {
-      m_RecordArr.RemoveAt(i);
-    }
-  }
-  m_RecordArr.Add(bsDoRecord);
-  return m_iCurRecord = m_RecordArr.GetSize() - 1;
-}
-void CFWL_EditImp::Layout() {
-  GetClientRect(m_rtClient);
-  m_rtEngine = m_rtClient;
-  FX_FLOAT* pfWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pfWidth)
-    return;
-  FX_FLOAT fWidth = *pfWidth;
-  if (!m_pOuter) {
-    CFX_RectF* pUIMargin =
-        static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
-    if (pUIMargin) {
-      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
-  } else if (m_pOuter->GetClassID() == FWL_CLASSHASH_DateTimePicker) {
-    CFWL_ThemePart part;
-    part.m_pWidget = m_pOuter;
-    CFX_RectF* pUIMargin =
-        static_cast<CFX_RectF*>(m_pOuter->GetThemeProvider()->GetCapacity(
-            &part, FWL_WGTCAPACITY_UIMargin));
-    if (pUIMargin) {
-      m_rtEngine.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
-  }
-  FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE);
-  FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE);
-  if (bShowVertScrollbar) {
-    InitScrollBar();
-    CFX_RectF rtVertScr;
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-      rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, m_rtClient.top,
-                    fWidth, m_rtClient.height);
-    } else {
-      rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
-                    m_rtClient.height);
-      if (bShowHorzScrollbar) {
-        rtVertScr.height -= fWidth;
-      }
-      m_rtEngine.width -= fWidth;
-    }
-    m_pVertScrollBar->SetWidgetRect(rtVertScr);
-    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-    m_pVertScrollBar->Update();
-  } else if (m_pVertScrollBar) {
-    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  if (bShowHorzScrollbar) {
-    InitScrollBar(FALSE);
-    CFX_RectF rtHoriScr;
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-      rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin,
-                    m_rtClient.width, fWidth);
-    } else {
-      rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
-                    m_rtClient.width, fWidth);
-      if (bShowVertScrollbar) {
-        rtHoriScr.width -= fWidth;
-      }
-      m_rtEngine.height -= fWidth;
-    }
-    m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
-    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-    m_pHorzScrollBar->Update();
-  } else if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-}
-void CFWL_EditImp::LayoutScrollBar() {
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus) ==
-      0) {
-    return;
-  }
-  FX_FLOAT* pfWidth = NULL;
-  FX_BOOL bShowVertScrollbar = IsShowScrollBar(TRUE);
-  FX_BOOL bShowHorzScrollbar = IsShowScrollBar(FALSE);
-  if (bShowVertScrollbar) {
-    if (!m_pVertScrollBar) {
-      pfWidth = static_cast<FX_FLOAT*>(
-          GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
-      InitScrollBar();
-      CFX_RectF rtVertScr;
-      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-        rtVertScr.Set(m_rtClient.right() + FWL_EDIT_Margin, m_rtClient.top,
-                      fWidth, m_rtClient.height);
-      } else {
-        rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
-                      m_rtClient.height);
-        if (bShowHorzScrollbar) {
-          rtVertScr.height -= fWidth;
-        }
-      }
-      m_pVertScrollBar->SetWidgetRect(rtVertScr);
-      m_pVertScrollBar->Update();
-    }
-    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-  } else if (m_pVertScrollBar) {
-    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  if (bShowHorzScrollbar) {
-    if (!m_pHorzScrollBar) {
-      if (!pfWidth) {
-        pfWidth = static_cast<FX_FLOAT*>(
-            GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-      }
-      FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
-      InitScrollBar(FALSE);
-      CFX_RectF rtHoriScr;
-      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
-        rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + FWL_EDIT_Margin,
-                      m_rtClient.width, fWidth);
-      } else {
-        rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
-                      m_rtClient.width, fWidth);
-        if (bShowVertScrollbar) {
-          rtHoriScr.width -= (fWidth);
-        }
-      }
-      m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
-      m_pHorzScrollBar->Update();
-    }
-    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-  } else if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  if (bShowVertScrollbar || bShowHorzScrollbar) {
-    UpdateScroll();
-  }
-}
-void CFWL_EditImp::DeviceToEngine(CFX_PointF& pt) {
-  pt.x += -m_rtEngine.left + m_fScrollOffsetX;
-  pt.y += -m_rtEngine.top - m_fVAlignOffset + m_fScrollOffsetY;
-}
-void CFWL_EditImp::InitScrollBar(FX_BOOL bVert) {
-  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
-    return;
-  }
-  CFWL_WidgetImpProperties prop;
-  prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
-  prop.m_dwStates = FWL_WGTSTATE_Disabled | FWL_WGTSTATE_Invisible;
-  prop.m_pParent = m_pInterface;
-  prop.m_pThemeProvider = m_pProperties->m_pThemeProvider;
-  IFWL_ScrollBar* pScrollBar = IFWL_ScrollBar::Create(prop, m_pInterface);
-  pScrollBar->Initialize();
-  (bVert ? &m_pVertScrollBar : &m_pHorzScrollBar)->reset(pScrollBar);
-}
-void CFWL_EditImp::InitEngine() {
-  if (m_pEdtEngine) {
-    return;
-  }
-  m_pEdtEngine = IFDE_TxtEdtEngine::Create();
-}
-extern FX_BOOL FWL_ShowCaret(IFWL_Widget* pWidget,
-                             FX_BOOL bVisible,
-                             const CFX_RectF* pRtAnchor);
-void CFWL_EditImp::ShowCaret(FX_BOOL bVisible, CFX_RectF* pRect) {
-  if (m_pCaret) {
-    m_pCaret->ShowCaret(bVisible);
-    if (bVisible && !pRect->IsEmpty()) {
-      m_pCaret->SetWidgetRect(*pRect);
-    }
-    Repaint(&m_rtEngine);
-  } else {
-    IFWL_Widget* pOuter = m_pInterface;
-    if (bVisible) {
-      pRect->Offset(m_pProperties->m_rtWidget.left,
-                    m_pProperties->m_rtWidget.top);
-    }
-    while (pOuter->GetOuter()) {
-      pOuter = pOuter->GetOuter();
-      if (bVisible) {
-        CFX_RectF rtOuter;
-        pOuter->GetWidgetRect(rtOuter);
-        pRect->Offset(rtOuter.left, rtOuter.top);
-      }
-    }
-    FWL_ShowCaret(pOuter, bVisible, pRect);
-  }
-}
-FX_BOOL CFWL_EditImp::ValidateNumberChar(FX_WCHAR cNum) {
-  if (!m_pEdtEngine) {
-    return FALSE;
-  }
-  if (!m_bSetRange) {
-    return TRUE;
-  }
-  CFX_WideString wsOld, wsText;
-  m_pEdtEngine->GetText(wsText, 0);
-  if (wsText.IsEmpty()) {
-    if (cNum == L'0') {
-      return FALSE;
-    }
-    return TRUE;
-  }
-  int32_t caretPos = m_pEdtEngine->GetCaretPos();
-  int32_t iSel = CountSelRanges();
-  if (iSel == 0) {
-    if (cNum == L'0' && caretPos == 0) {
-      return FALSE;
-    }
-    int32_t nLen = wsText.GetLength();
-    CFX_WideString l = wsText.Mid(0, caretPos);
-    CFX_WideString r = wsText.Mid(caretPos, nLen - caretPos);
-    CFX_WideString wsNew = l + cNum + r;
-    if (wsNew.GetInteger() <= m_iMax) {
-      return TRUE;
-    }
-  } else {
-    if (wsText.GetInteger() <= m_iMax) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CFWL_EditImp::InitCaret() {
-  if (!m_pCaret) {
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret)) {
-      CFWL_WidgetImpProperties prop;
-      m_pCaret.reset(IFWL_Caret::Create(prop, m_pInterface));
-      m_pCaret->Initialize();
-      m_pCaret->SetParent(m_pInterface);
-      m_pCaret->SetStates(m_pProperties->m_dwStates);
-    }
-  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret) ==
-             0) {
-    m_pCaret.reset();
-  }
-}
-void CFWL_EditImp::ClearRecord() {
-  m_iCurRecord = -1;
-  m_RecordArr.RemoveAll();
-}
-void CFWL_EditImp::ProcessInsertError(int32_t iError) {
-  switch (iError) {
-    case -2: {
-      CFWL_EvtEdtTextFull textFullEvent;
-      textFullEvent.m_pSrcTarget = m_pInterface;
-      DispatchEvent(&textFullEvent);
-      break;
-    }
-    default: {}
-  }
-}
-CFWL_EditImpDelegate::CFWL_EditImpDelegate(CFWL_EditImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_EditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  int32_t iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_Activate: {
-      DoActivate(static_cast<CFWL_MsgActivate*>(pMessage));
-      break;
-    }
-    case FWL_MSGHASH_Deactivate: {
-      DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage));
-      break;
-    }
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonDblClk: {
-          OnButtonDblClk(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_RButtonDown: {
-          DoButtonDown(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
-      FX_DWORD dwCmd = pKey->m_dwCmd;
-      if (dwCmd == FWL_MSGKEYCMD_KeyDown) {
-        OnKeyDown(pKey);
-      } else if (dwCmd == FWL_MSGKEYCMD_Char) {
-        OnChar(pKey);
-      }
-      break;
-    }
-    default: { iRet = 0; }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_EditImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  if (!pEvent)
-    return FWL_ERR_Indefinite;
-  FX_DWORD dwHashCode = pEvent->GetClassID();
-  if (dwHashCode != FWL_EVTHASH_Scroll) {
-    return FWL_ERR_Succeeded;
-  }
-  IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
-  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
-       m_pOwner->m_pVertScrollBar) ||
-      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
-       m_pOwner->m_pHorzScrollBar)) {
-    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
-    OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
-             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_EditImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_EditImpDelegate::DoActivate(CFWL_MsgActivate* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates |= ~FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_EditImpDelegate::DoDeactivate(CFWL_MsgDeactivate* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates &= FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_EditImpDelegate::DoButtonDown(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  if (!m_pOwner->m_pEdtEngine) {
-    m_pOwner->UpdateEditEngine();
-  }
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return;
-  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
-  FX_BOOL bBefore = TRUE;
-  int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
-  if (nIndex < 0) {
-    nIndex = 0;
-  }
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-}
-void CFWL_EditImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
-  FX_DWORD dwStyleEx = m_pOwner->GetStylesEx();
-  FX_BOOL bRepaint = dwStyleEx & FWL_STYLEEXT_EDT_InnerCaret;
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (!m_pOwner->m_pEdtEngine) {
-      m_pOwner->UpdateEditEngine();
-    }
-    m_pOwner->UpdateVAlignment();
-    m_pOwner->UpdateOffset();
-    m_pOwner->UpdateCaret();
-  } else if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->ShowCaret(FALSE);
-    if (m_pOwner->m_pEdtEngine &&
-        (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
-      int32_t nSel = m_pOwner->CountSelRanges();
-      if (nSel > 0) {
-        m_pOwner->ClearSelections();
-        bRepaint = TRUE;
-      }
-      m_pOwner->SetCaretPos(0);
-      m_pOwner->UpdateOffset();
-    }
-    m_pOwner->ClearRecord();
-  }
-  m_pOwner->LayoutScrollBar();
-  if (bRepaint) {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                     m_pOwner->m_pProperties->m_rtWidget.height);
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-void CFWL_EditImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  DoCursor(pMsg);
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    return;
-  }
-  m_pOwner->m_bLButtonDown = TRUE;
-  m_pOwner->SetGrab(TRUE);
-  DoButtonDown(pMsg);
-  int32_t nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
-  FX_BOOL bRepaint = FALSE;
-  int32_t iCount = m_pOwner->m_pEdtEngine->CountSelRanges();
-  if (iCount > 0) {
-    m_pOwner->m_pEdtEngine->ClearSelection();
-    bRepaint = TRUE;
-  }
-  FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
-  if (bShift && m_pOwner->m_nSelStart != nIndex) {
-    int32_t iStart = std::min(m_pOwner->m_nSelStart, nIndex);
-    int32_t iEnd = std::max(m_pOwner->m_nSelStart, nIndex);
-    m_pOwner->m_pEdtEngine->AddSelRange(iStart, iEnd - iStart);
-    bRepaint = TRUE;
-  } else {
-    m_pOwner->m_nSelStart = nIndex;
-  }
-  if (bRepaint) {
-    m_pOwner->Repaint(&m_pOwner->m_rtEngine);
-  }
-}
-void CFWL_EditImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  DoCursor(pMsg);
-  m_pOwner->m_bLButtonDown = FALSE;
-  m_pOwner->SetGrab(FALSE);
-}
-void CFWL_EditImpDelegate::OnButtonDblClk(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
-    return;
-  DoCursor(pMsg);
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return;
-  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
-  int32_t nCount = 0;
-  int32_t nIndex = pPage->SelectWord(pt, nCount);
-  if (nIndex < 0) {
-    return;
-  }
-  m_pOwner->m_pEdtEngine->AddSelRange(nIndex, nCount);
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, FALSE);
-  m_pOwner->Repaint(&m_pOwner->m_rtEngine);
-}
-void CFWL_EditImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
-    return;
-  DoCursor(pMsg);
-  if (m_pOwner->m_nSelStart == -1 || !m_pOwner->m_bLButtonDown) {
-    return;
-  }
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
-  if (!pPage)
-    return;
-  CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
-  FX_BOOL bBefore = TRUE;
-  int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-  nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
-  m_pOwner->m_pEdtEngine->ClearSelection();
-  if (nIndex != m_pOwner->m_nSelStart) {
-    int32_t nLen = m_pOwner->m_pEdtEngine->GetTextLength();
-    if (m_pOwner->m_nSelStart >= nLen) {
-      m_pOwner->m_nSelStart = nLen;
-    }
-    m_pOwner->m_pEdtEngine->AddSelRange(
-        std::min(m_pOwner->m_nSelStart, nIndex),
-        FXSYS_abs(nIndex - m_pOwner->m_nSelStart));
-  }
-}
-void CFWL_EditImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
-    return;
-  FDE_TXTEDTMOVECARET MoveCaret = MC_MoveNone;
-  FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
-  FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl;
-  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
-  switch (dwKeyCode) {
-    case FWL_VKEY_Left: {
-      MoveCaret = MC_Left;
-      break;
-    }
-    case FWL_VKEY_Right: {
-      MoveCaret = MC_Right;
-      break;
-    }
-    case FWL_VKEY_Up: {
-      MoveCaret = MC_Up;
-      break;
-    }
-    case FWL_VKEY_Down: {
-      MoveCaret = MC_Down;
-      break;
-    }
-    case FWL_VKEY_Home: {
-      if (bCtrl) {
-        MoveCaret = MC_Home;
-      } else {
-        MoveCaret = MC_LineStart;
-      }
-      break;
-    }
-    case FWL_VKEY_End: {
-      if (bCtrl) {
-        MoveCaret = MC_End;
-      } else {
-        MoveCaret = MC_LineEnd;
-      }
-      break;
-    }
-    case FWL_VKEY_Insert: {
-      break;
-    }
-    case FWL_VKEY_Delete: {
-      if ((m_pOwner->m_pProperties->m_dwStyleExes &
-           FWL_STYLEEXT_EDT_ReadOnly) ||
-          (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-        break;
-      }
-      int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
-#if (_FX_OS_ == _FX_MACOSX_)
-      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
-#else
-      m_pOwner->m_pEdtEngine->Delete(nCaret);
-#endif
-      break;
-    }
-    case FWL_VKEY_F2: {
-      break;
-    }
-    case FWL_VKEY_Tab: {
-      m_pOwner->DispatchKeyEvent(pMsg);
-      break;
-    }
-    default: {
-#if (_FX_OS_ == _FX_MACOSX_)
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Command) {
-#else
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
-#endif
-        if (dwKeyCode == 0x43 || dwKeyCode == 0x63) {
-          m_pOwner->DoClipboard(1);
-          return;
-        }
-        if (dwKeyCode == 0x58 || dwKeyCode == 0x78) {
-          m_pOwner->DoClipboard(2);
-          return;
-        }
-        if (dwKeyCode == 0x56 || dwKeyCode == 0x76) {
-          m_pOwner->DoClipboard(3);
-          return;
-        }
-      }
-    }
-  }
-  if (MoveCaret != MC_MoveNone) {
-    m_pOwner->m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl);
-  }
-}
-void CFWL_EditImpDelegate::OnChar(CFWL_MsgKey* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    return;
-  }
-  if (!m_pOwner->m_pEdtEngine)
-    return;
-  int32_t iError = 0;
-  FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode;
-  int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
-  switch (c) {
-    case FWL_VKEY_Back: {
-      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
-      break;
-    }
-    case 0x0A: {
-      break;
-    }
-    case FWL_VKEY_Escape: {
-      break;
-    }
-    case FWL_VKEY_Tab: {
-      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\t", 1);
-      break;
-    }
-    case FWL_VKEY_Return: {
-      if (m_pOwner->m_pProperties->m_dwStyleExes &
-          FWL_STYLEEXT_EDT_WantReturn) {
-        iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\n", 1);
-      }
-      break;
-    }
-    default: {
-      if (!m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-        if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Number) {
-          if (((pMsg->m_dwKeyCode < FWL_VKEY_0) &&
-               (pMsg->m_dwKeyCode != 0x2E && pMsg->m_dwKeyCode != 0x2D)) ||
-              pMsg->m_dwKeyCode > FWL_VKEY_9) {
-            break;
-          }
-          if (!m_pOwner->ValidateNumberChar(c)) {
-            break;
-          }
-        }
-      }
-#if (_FX_OS_ == _FX_MACOSX_)
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Command)
-#else
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl)
-#endif
-      {
-        break;
-      }
-      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, &c, 1);
-      break;
-    }
-  }
-  if (iError < 0) {
-    m_pOwner->ProcessInsertError(iError);
-  }
-}
-FX_BOOL CFWL_EditImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
-                                       FX_DWORD dwCode,
-                                       FX_FLOAT fPos) {
-  CFX_SizeF fs;
-  pScrollBar->GetRange(fs.x, fs.y);
-  FX_FLOAT iCurPos = pScrollBar->GetPos();
-  FX_FLOAT fStep = pScrollBar->GetStepSize();
-  switch (dwCode) {
-    case FWL_SCBCODE_Min: {
-      fPos = fs.x;
-      break;
-    }
-    case FWL_SCBCODE_Max: {
-      fPos = fs.y;
-      break;
-    }
-    case FWL_SCBCODE_StepBackward: {
-      fPos -= fStep;
-      if (fPos < fs.x + fStep / 2) {
-        fPos = fs.x;
-      }
-      break;
-    }
-    case FWL_SCBCODE_StepForward: {
-      fPos += fStep;
-      if (fPos > fs.y - fStep / 2) {
-        fPos = fs.y;
-      }
-      break;
-    }
-    case FWL_SCBCODE_PageBackward: {
-      fPos -= pScrollBar->GetPageSize();
-      if (fPos < fs.x) {
-        fPos = fs.x;
-      }
-      break;
-    }
-    case FWL_SCBCODE_PageForward: {
-      fPos += pScrollBar->GetPageSize();
-      if (fPos > fs.y) {
-        fPos = fs.y;
-      }
-      break;
-    }
-    case FWL_SCBCODE_Pos:
-    case FWL_SCBCODE_TrackPos: {
-      break;
-    }
-    case FWL_SCBCODE_EndScroll: {
-      return FALSE;
-    }
-    default: {}
-  }
-  if (iCurPos != fPos) {
-    pScrollBar->SetPos(fPos);
-    pScrollBar->SetTrackPos(fPos);
-    m_pOwner->UpdateOffset(pScrollBar, fPos - iCurPos);
-    if (m_pOwner->m_pEdtEngine) {
-      m_pOwner->UpdateCaret();
-    }
-    CFX_RectF rect;
-    m_pOwner->GetWidgetRect(rect);
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2);
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-  return TRUE;
-}
-void CFWL_EditImpDelegate::DoCursor(CFWL_MsgMouse* pMsg) {}
diff --git a/xfa/src/fwl/basewidget/fwl_editimp.h b/xfa/src/fwl/basewidget/fwl_editimp.h
deleted file mode 100644
index 6e6b35c..0000000
--- a/xfa/src/fwl/basewidget/fwl_editimp.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_EDITIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_EDITIMP_H_
-
-#include <memory>
-#include <vector>
-
-#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
-#include "xfa/src/fee/ifde_txtedtengine.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class CFWL_WidgetImpDelegate;
-class IFWL_Caret;
-class CFWL_EditImp;
-class CFWL_EditImpDelegate;
-
-class CFWL_EditImp : public CFWL_WidgetImp, public IFDE_TxtEdtEventSink {
- public:
-  CFWL_EditImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
-  ~CFWL_EditImp() override;
-
-  // CFWL_WidgetImp:
-  FWL_ERR GetClassName(CFX_WideString& wsClass) const override;
-  FX_DWORD GetClassID() const override;
-  FWL_ERR Initialize() override;
-  FWL_ERR Finalize() override;
-  FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE) override;
-  FWL_ERR SetWidgetRect(const CFX_RectF& rect) override;
-  FWL_ERR Update() override;
-  FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy) override;
-  FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE) override;
-  FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                     const CFX_Matrix* pMatrix = NULL) override;
-  FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
-
-  virtual FWL_ERR SetText(const CFX_WideString& wsText);
-  virtual int32_t GetTextLength() const;
-  virtual FWL_ERR GetText(CFX_WideString& wsText,
-                          int32_t nStart = 0,
-                          int32_t nCount = -1) const;
-  virtual FWL_ERR ClearText();
-  virtual int32_t GetCaretPos() const;
-  virtual int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE);
-  virtual FWL_ERR AddSelRange(int32_t nStart, int32_t nCount = -1);
-  virtual int32_t CountSelRanges();
-  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
-  virtual FWL_ERR ClearSelections();
-  virtual int32_t GetLimit();
-  virtual FWL_ERR SetLimit(int32_t nLimit);
-  virtual FWL_ERR SetAliasChar(FX_WCHAR wAlias);
-  virtual FWL_ERR Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLen);
-  virtual FWL_ERR DeleteSelections();
-  virtual FWL_ERR DeleteRange(int32_t nStart, int32_t nCount = -1);
-  virtual FWL_ERR ReplaceSelections(const CFX_WideStringC& wsReplace);
-  virtual FWL_ERR Replace(int32_t nStart,
-                          int32_t nLen,
-                          const CFX_WideStringC& wsReplace);
-  virtual FWL_ERR DoClipboard(int32_t iCmd);
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL Redo(const CFX_ByteStringC& bsRecord);
-  virtual FX_BOOL Undo(const CFX_ByteStringC& bsRecord);
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FWL_ERR SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
-  virtual FWL_ERR SetOuter(IFWL_Widget* pOuter);
-  virtual FWL_ERR SetNumberRange(int32_t iMin, int32_t iMax);
-  void On_CaretChanged(IFDE_TxtEdtEngine* pEdit,
-                       int32_t nPage,
-                       FX_BOOL bVisible = true) override;
-  void On_TextChanged(IFDE_TxtEdtEngine* pEdit,
-                      FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo) override;
-  void On_PageCountChanged(IFDE_TxtEdtEngine* pEdit) override {}
-  void On_SelChanged(IFDE_TxtEdtEngine* pEdit) override;
-  FX_BOOL On_PageLoad(IFDE_TxtEdtEngine* pEdit,
-                      int32_t nPageIndex,
-                      int32_t nPurpose) override;
-  FX_BOOL On_PageUnload(IFDE_TxtEdtEngine* pEdit,
-                        int32_t nPageIndex,
-                        int32_t nPurpose) override;
-  FX_BOOL On_PageChange(IFDE_TxtEdtEngine* pEdit, int32_t nPageIndex) override {
-    return TRUE;
-  }
-  void On_AddDoRecord(IFDE_TxtEdtEngine* pEdit,
-                      const CFX_ByteStringC& bsDoRecord) override;
-  FX_BOOL On_ValidateField(IFDE_TxtEdtEngine* pEdit,
-                           int32_t nBlockIndex,
-                           int32_t nFieldIndex,
-                           const CFX_WideString& wsFieldText,
-                           int32_t nCharIndex) override;
-  FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine* pEdit,
-                           int32_t nBlockIndex) override;
-  FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine* pEdit,
-                                int32_t nBlockIndex,
-                                CFX_WideString& wsBlockText) override;
-  FX_BOOL On_Validate(IFDE_TxtEdtEngine* pEdit,
-                      CFX_WideString& wsText) override;
-  virtual FWL_ERR SetBackgroundColor(FX_DWORD color);
-  virtual FWL_ERR SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
-  void SetScrollOffset(FX_FLOAT fScrollOffset);
-  FX_BOOL GetSuggestWords(CFX_PointF pointf,
-                          std::vector<CFX_ByteString>& sSuggest);
-  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
-                                const CFX_ByteStringC& bsReplace);
-
- protected:
-  void DrawTextBk(CFX_Graphics* pGraphics,
-                  IFWL_ThemeProvider* pTheme,
-                  const CFX_Matrix* pMatrix = NULL);
-  void DrawContent(CFX_Graphics* pGraphics,
-                   IFWL_ThemeProvider* pTheme,
-                   const CFX_Matrix* pMatrix = NULL);
-  void UpdateEditEngine();
-  void UpdateEditParams();
-  void UpdateEditLayout();
-  FX_BOOL UpdateOffset();
-  FX_BOOL UpdateOffset(IFWL_ScrollBar* pScrollBar, FX_FLOAT fPosChanged);
-  void UpdateVAlignment();
-  void UpdateCaret();
-  IFWL_ScrollBar* UpdateScroll();
-  void Layout();
-  void LayoutScrollBar();
-  void DeviceToEngine(CFX_PointF& pt);
-  void InitScrollBar(FX_BOOL bVert = TRUE);
-  void InitEngine();
-  virtual void ShowCaret(FX_BOOL bVisible, CFX_RectF* pRect = NULL);
-  FX_BOOL ValidateNumberChar(FX_WCHAR cNum);
-  void InitCaret();
-  void ClearRecord();
-  FX_BOOL IsShowScrollBar(FX_BOOL bVert);
-  FX_BOOL IsContentHeightOverflow();
-  int32_t AddDoRecord(const CFX_ByteStringC& bsDoRecord);
-  void ProcessInsertError(int32_t iError);
-
-  void DrawSpellCheck(CFX_Graphics* pGraphics,
-                      const CFX_Matrix* pMatrix = NULL);
-  void AddSpellCheckObj(CFX_Path& PathData,
-                        int32_t nStart,
-                        int32_t nCount,
-                        FX_FLOAT fOffSetX,
-                        FX_FLOAT fOffSetY);
-  int32_t GetWordAtPoint(CFX_PointF pointf, int32_t& nCount);
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtEngine;
-  CFX_RectF m_rtStatic;
-  FX_FLOAT m_fVAlignOffset;
-  FX_FLOAT m_fScrollOffsetX;
-  FX_FLOAT m_fScrollOffsetY;
-  IFDE_TxtEdtEngine* m_pEdtEngine;
-  FX_BOOL m_bLButtonDown;
-  int32_t m_nSelStart;
-  int32_t m_nLimit;
-  FX_FLOAT m_fSpaceAbove;
-  FX_FLOAT m_fSpaceBelow;
-  FX_FLOAT m_fFontSize;
-  FX_ARGB m_argbSel;
-  FX_BOOL m_bSetRange;
-  int32_t m_iMin;
-  int32_t m_iMax;
-  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
-  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
-  std::unique_ptr<IFWL_Caret> m_pCaret;
-  CFX_WideString m_wsCache;
-  friend class CFWL_TxtEdtEventSink;
-  friend class CFWL_EditImpDelegate;
-  FX_DWORD m_backColor;
-  FX_BOOL m_updateBackColor;
-  CFX_WideString m_wsFont;
-  CFX_ByteStringArray m_RecordArr;
-  int32_t m_iCurRecord;
-  int32_t m_iMaxRecord;
-};
-
-class CFWL_EditImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_EditImpDelegate(CFWL_EditImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void DoActivate(CFWL_MsgActivate* pMsg);
-  void DoDeactivate(CFWL_MsgDeactivate* pMsg);
-  void DoButtonDown(CFWL_MsgMouse* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnButtonDblClk(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  void OnChar(CFWL_MsgKey* pMsg);
-  FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos);
-  void DoCursor(CFWL_MsgMouse* pMsg);
-  CFWL_EditImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_EDITIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_formproxyimp.cpp b/xfa/src/fwl/basewidget/fwl_formproxyimp.cpp
deleted file mode 100644
index 3985f00..0000000
--- a/xfa/src/fwl/basewidget/fwl_formproxyimp.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_formproxyimp.h"
-
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-CFWL_FormProxyImp::CFWL_FormProxyImp(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter)
-    : CFWL_FormImp(properties, pOuter) {}
-CFWL_FormProxyImp::~CFWL_FormProxyImp() {}
-FWL_ERR CFWL_FormProxyImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_FormProxy;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_FormProxyImp::GetClassID() const {
-  return FWL_CLASSHASH_FormProxy;
-}
-FX_BOOL CFWL_FormProxyImp::IsInstance(const CFX_WideStringC& wsClass) const {
-  if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy)) {
-    return TRUE;
-  }
-  return CFWL_FormImp::IsInstance(wsClass);
-}
-FWL_ERR CFWL_FormProxyImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_FormProxyImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_FormProxyImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_FormProxyImp::Update() {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_FormProxyImp::DrawWidget(CFX_Graphics* pGraphics,
-                                      const CFX_Matrix* pMatrix) {
-  return FWL_ERR_Succeeded;
-}
-CFWL_FormProxyImpDelegate::CFWL_FormProxyImpDelegate(CFWL_FormProxyImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_FormProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pOuter->SetDelegate(NULL);
-  return pDelegate->OnProcessMessage(pMessage);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_formproxyimp.h b/xfa/src/fwl/basewidget/fwl_formproxyimp.h
deleted file mode 100644
index 56ef053..0000000
--- a/xfa/src/fwl/basewidget/fwl_formproxyimp.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
-
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class CFWL_FormProxyImpDelegate;
-
-class CFWL_FormProxyImp : public CFWL_FormImp {
- public:
-  CFWL_FormProxyImp(const CFWL_WidgetImpProperties& properties,
-                    IFWL_Widget* pOuter);
-  ~CFWL_FormProxyImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  friend class CFWL_FormProxyImpDelegate;
-};
-class CFWL_FormProxyImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_FormProxyImpDelegate(CFWL_FormProxyImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-
- protected:
-  CFWL_FormProxyImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_FORMPROXYIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_listboximp.cpp b/xfa/src/fwl/basewidget/fwl_listboximp.cpp
deleted file mode 100644
index aac2d27..0000000
--- a/xfa/src/fwl/basewidget/fwl_listboximp.cpp
+++ /dev/null
@@ -1,1241 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_listboximp.h"
-
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/basewidget/fwl_comboboximp.h"
-#include "xfa/src/fwl/basewidget/fwl_scrollbarimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-#define FWL_LISTBOX_ItemTextMargin 2
-
-// static
-IFWL_ListBox* IFWL_ListBox::Create(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter) {
-  IFWL_ListBox* pListBox = new IFWL_ListBox;
-  CFWL_ListBoxImp* pListBoxImpl = new CFWL_ListBoxImp(properties, pOuter);
-  pListBox->SetImpl(pListBoxImpl);
-  pListBoxImpl->SetInterface(pListBox);
-  return pListBox;
-}
-// static
-IFWL_ListBox* IFWL_ListBox::CreateComboList(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_ListBox* pListBox = new IFWL_ListBox;
-  CFWL_ListBoxImp* pComboListImpl = new CFWL_ComboListImp(properties, pOuter);
-  pListBox->SetImpl(pComboListImpl);
-  pComboListImpl->SetInterface(pListBox);
-  return pListBox;
-}
-IFWL_ListBox::IFWL_ListBox() {}
-int32_t IFWL_ListBox::CountSelItems() {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->CountSelItems();
-}
-FWL_HLISTITEM IFWL_ListBox::GetSelItem(int32_t nIndexSel) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetSelItem(nIndexSel);
-}
-int32_t IFWL_ListBox::GetSelIndex(int32_t nIndex) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetSelIndex(nIndex);
-}
-FWL_ERR IFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->SetSelItem(hItem, bSelect);
-}
-FWL_ERR IFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetItemText(hItem, wsText);
-}
-FWL_ERR IFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->GetScrollPos(fPos, bVert);
-}
-FWL_ERR* IFWL_ListBox::Sort(IFWL_ListBoxCompare* pCom) {
-  return static_cast<CFWL_ListBoxImp*>(GetImpl())->Sort(pCom);
-}
-
-CFWL_ListBoxImp::CFWL_ListBoxImp(const CFWL_WidgetImpProperties& properties,
-                                 IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_dwTTOStyles(0),
-      m_iTTOAligns(0),
-      m_hAnchor(NULL),
-      m_fScorllBarWidth(0),
-      m_bLButtonDown(FALSE),
-      m_pScrollBarTP(NULL) {
-  m_rtClient.Reset();
-  m_rtConent.Reset();
-  m_rtStatic.Reset();
-}
-CFWL_ListBoxImp::~CFWL_ListBoxImp() {}
-FWL_ERR CFWL_ListBoxImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_ListBox;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ListBoxImp::GetClassID() const {
-  return FWL_CLASSHASH_ListBox;
-}
-FWL_ERR CFWL_ListBoxImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_ListBoxImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImp::Finalize() {
-  if (m_pVertScrollBar) {
-    m_pVertScrollBar->Finalize();
-  }
-  if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->Finalize();
-  }
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_ListBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pThemeProvider) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_SizeF fs = CalcSize(TRUE);
-    rect.Set(0, 0, fs.x, fs.y);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  m_iTTOAligns = FDE_TTOALIGNMENT_Center;
-  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_AlignMask) {
-    case FWL_STYLEEXT_LTB_LeftAlign: {
-      m_iTTOAligns = FDE_TTOALIGNMENT_CenterLeft;
-      break;
-    }
-    case FWL_STYLEEXT_LTB_RightAlign: {
-      m_iTTOAligns = FDE_TTOALIGNMENT_CenterRight;
-      break;
-    }
-    case FWL_STYLEEXT_LTB_CenterAlign:
-    default: { m_iTTOAligns = FDE_TTOALIGNMENT_Center; }
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
-    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
-  m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine;
-  m_fScorllBarWidth = GetScrollWidth();
-  SortItem();
-  CalcSize();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ListBoxImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (IsShowScrollBar(FALSE)) {
-    CFX_RectF rect;
-    m_pHorzScrollBar->GetWidgetRect(rect);
-    if (rect.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_HScrollBar;
-    }
-  }
-  if (IsShowScrollBar(TRUE)) {
-    CFX_RectF rect;
-    m_pVertScrollBar->GetWidgetRect(rect);
-    if (rect.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_VScrollBar;
-    }
-  }
-  if (m_rtClient.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FWL_ERR CFWL_ListBoxImp::DrawWidget(CFX_Graphics* pGraphics,
-                                    const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  pGraphics->SaveGraphState();
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_LTB_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_LTB_Edge, pTheme, pMatrix);
-  }
-  CFX_RectF rtClip(m_rtConent);
-  if (IsShowScrollBar(FALSE)) {
-    rtClip.height -= m_fScorllBarWidth;
-  }
-  if (IsShowScrollBar(TRUE)) {
-    rtClip.width -= m_fScorllBarWidth;
-  }
-  if (pMatrix) {
-    pMatrix->TransformRect(rtClip);
-  }
-  pGraphics->SetClipRect(rtClip);
-  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_NoBackground) == 0) {
-    DrawBkground(pGraphics, pTheme, pMatrix);
-  }
-  DrawItems(pGraphics, pTheme, pMatrix);
-  pGraphics->RestoreGraphState();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  if (!pThemeProvider)
-    return FWL_ERR_Indefinite;
-  if (!pThemeProvider->IsValidWidget(m_pInterface)) {
-    m_pScrollBarTP = pThemeProvider;
-    return FWL_ERR_Succeeded;
-  }
-  m_pProperties->m_pThemeProvider = pThemeProvider;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ListBoxImp::CountSelItems() {
-  if (!m_pProperties->m_pDataProvider)
-    return 0;
-  int32_t iRet = 0;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      continue;
-    }
-    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
-    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
-      iRet++;
-    }
-  }
-  return iRet;
-}
-FWL_HLISTITEM CFWL_ListBoxImp::GetSelItem(int32_t nIndexSel) {
-  if (!m_pProperties->m_pDataProvider)
-    return NULL;
-  int32_t index = 0;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      return NULL;
-    }
-    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
-    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
-      if (index == nIndexSel) {
-        return hItem;
-      } else {
-        index++;
-      }
-    }
-  }
-  return NULL;
-}
-int32_t CFWL_ListBoxImp::GetSelIndex(int32_t nIndex) {
-  if (!m_pProperties->m_pDataProvider)
-    return -1;
-  int32_t index = 0;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      return -1;
-    }
-    FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
-    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
-      if (index == nIndex) {
-        return i;
-      } else {
-        index++;
-      }
-    }
-  }
-  return -1;
-}
-FWL_ERR CFWL_ListBoxImp::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
-  if (!m_pProperties->m_pDataProvider)
-    return FWL_ERR_Indefinite;
-  if (!hItem) {
-    if (bSelect) {
-      SelectAll();
-    } else {
-      ClearSelection();
-      SetFocusItem(NULL);
-    }
-    return FWL_ERR_Indefinite;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
-    SetSelectionDirect(hItem, bSelect);
-  } else {
-    SetSelection(hItem, hItem, bSelect);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImp::GetItemText(FWL_HLISTITEM hItem,
-                                     CFX_WideString& wsText) {
-  if (!m_pProperties->m_pDataProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  if (!hItem)
-    return FWL_ERR_Indefinite;
-  pData->GetItemText(m_pInterface, hItem, wsText);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImp::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
-  if ((bVert && IsShowScrollBar(TRUE)) || (!bVert && IsShowScrollBar(FALSE))) {
-    IFWL_ScrollBar* pScrollBar =
-        bVert ? m_pVertScrollBar.get() : m_pHorzScrollBar.get();
-    fPos = pScrollBar->GetPos();
-    return FWL_ERR_Succeeded;
-  }
-  return FWL_ERR_Indefinite;
-}
-FWL_ERR* CFWL_ListBoxImp::Sort(IFWL_ListBoxCompare* pCom) {
-  FWL_HLISTITEM hTemp;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t sz = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < sz - 1; i++) {
-    for (int32_t j = i + 1; j < sz; j++) {
-      if (pCom->Compare(pData->GetItem(m_pInterface, i),
-                        pData->GetItem(m_pInterface, j)) > 0) {
-        hTemp = pData->GetItem(m_pInterface, i);
-        pData->SetItemIndex(m_pInterface, pData->GetItem(m_pInterface, j), i);
-        pData->SetItemIndex(m_pInterface, hTemp, j);
-      }
-    }
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_HLISTITEM CFWL_ListBoxImp::GetItem(FWL_HLISTITEM hItem,
-                                       FX_DWORD dwKeyCode) {
-  FWL_HLISTITEM hRet = NULL;
-  switch (dwKeyCode) {
-    case FWL_VKEY_Up:
-    case FWL_VKEY_Down:
-    case FWL_VKEY_Home:
-    case FWL_VKEY_End: {
-      const bool bUp = dwKeyCode == FWL_VKEY_Up;
-      const bool bDown = dwKeyCode == FWL_VKEY_Down;
-      const bool bHome = dwKeyCode == FWL_VKEY_Home;
-      IFWL_ListBoxDP* pData =
-          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-      int32_t iDstItem = -1;
-      if (bUp || bDown) {
-        int32_t index = pData->GetItemIndex(m_pInterface, hItem);
-        iDstItem = dwKeyCode == FWL_VKEY_Up ? index - 1 : index + 1;
-      } else if (bHome) {
-        iDstItem = 0;
-      } else {
-        int32_t iCount = pData->CountItems(m_pInterface);
-        iDstItem = iCount - 1;
-      }
-      hRet = pData->GetItem(m_pInterface, iDstItem);
-      break;
-    }
-    default: {}
-  }
-  return hRet;
-}
-void CFWL_ListBoxImp::SetSelection(FWL_HLISTITEM hStart,
-                                   FWL_HLISTITEM hEnd,
-                                   FX_BOOL bSelected) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iStart = pData->GetItemIndex(m_pInterface, hStart);
-  int32_t iEnd = pData->GetItemIndex(m_pInterface, hEnd);
-  if (iStart > iEnd) {
-    int32_t iTemp = iStart;
-    iStart = iEnd;
-    iEnd = iTemp;
-  }
-  if (bSelected) {
-    int32_t iCount = pData->CountItems(m_pInterface);
-    for (int32_t i = 0; i < iCount; i++) {
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-      SetSelectionDirect(hItem, FALSE);
-    }
-  }
-  for (; iStart <= iEnd; iStart++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, iStart);
-    SetSelectionDirect(hItem, bSelected);
-  }
-}
-void CFWL_ListBoxImp::SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FX_DWORD dwOldStyle = pData->GetItemStyles(m_pInterface, hItem);
-  bSelect ? dwOldStyle |= FWL_ITEMSTATE_LTB_Selected
-          : dwOldStyle &= ~FWL_ITEMSTATE_LTB_Selected;
-  pData->SetItemStyles(m_pInterface, hItem, dwOldStyle);
-}
-FX_BOOL CFWL_ListBoxImp::IsItemSelected(FWL_HLISTITEM hItem) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem);
-  return (dwState & FWL_ITEMSTATE_LTB_Selected) != 0;
-}
-void CFWL_ListBoxImp::ClearSelection() {
-  FX_BOOL bMulti =
-      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    FX_DWORD dwState = pData->GetItemStyles(m_pInterface, hItem);
-    FX_BOOL bFindSel = dwState & FWL_ITEMSTATE_LTB_Selected;
-    if (!bFindSel) {
-      continue;
-    }
-    SetSelectionDirect(hItem, FALSE);
-    if (!bMulti) {
-      return;
-    }
-  }
-}
-void CFWL_ListBoxImp::SelectAll() {
-  FX_BOOL bMulti =
-      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
-  if (!bMulti) {
-    return;
-  }
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  if (iCount > 0) {
-    FWL_HLISTITEM hItemStart = pData->GetItem(m_pInterface, 0);
-    FWL_HLISTITEM hItemEnd = pData->GetItem(m_pInterface, iCount - 1);
-    SetSelection(hItemStart, hItemEnd, FALSE);
-  }
-}
-FWL_HLISTITEM CFWL_ListBoxImp::GetFocusedItem() {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem)
-      return NULL;
-    if (pData->GetItemStyles(m_pInterface, hItem) & FWL_ITEMSTATE_LTB_Focused) {
-      return hItem;
-    }
-  }
-  return NULL;
-}
-void CFWL_ListBoxImp::SetFocusItem(FWL_HLISTITEM hItem) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FWL_HLISTITEM hFocus = GetFocusedItem();
-  if (hItem != hFocus) {
-    if (hFocus) {
-      FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hFocus);
-      dwStyle &= ~FWL_ITEMSTATE_LTB_Focused;
-      pData->SetItemStyles(m_pInterface, hFocus, dwStyle);
-    }
-    if (hItem) {
-      FX_DWORD dwStyle = pData->GetItemStyles(m_pInterface, hItem);
-      dwStyle |= FWL_ITEMSTATE_LTB_Focused;
-      pData->SetItemStyles(m_pInterface, hItem, dwStyle);
-    }
-  }
-}
-FWL_HLISTITEM CFWL_ListBoxImp::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
-  fx -= m_rtConent.left, fy -= m_rtConent.top;
-  FX_FLOAT fPosX = 0.0f;
-  if (m_pHorzScrollBar) {
-    fPosX = m_pHorzScrollBar->GetPos();
-  }
-  FX_FLOAT fPosY = 0.0;
-  if (m_pVertScrollBar) {
-    fPosY = m_pVertScrollBar->GetPos();
-  }
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t nCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < nCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      continue;
-    }
-    CFX_RectF rtItem;
-    pData->GetItemRect(m_pInterface, hItem, rtItem);
-    rtItem.Offset(-fPosX, -fPosY);
-    if (rtItem.Contains(fx, fy)) {
-      return hItem;
-    }
-  }
-  return NULL;
-}
-FX_BOOL CFWL_ListBoxImp::GetItemCheckRect(FWL_HLISTITEM hItem,
-                                          CFX_RectF& rtCheck) {
-  if (!m_pProperties->m_pDataProvider)
-    return FALSE;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
-    return FALSE;
-  }
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  pData->GetItemCheckRect(m_pInterface, hItem, rtCheck);
-  return TRUE;
-}
-FX_BOOL CFWL_ListBoxImp::GetItemChecked(FWL_HLISTITEM hItem) {
-  if (!m_pProperties->m_pDataProvider)
-    return FALSE;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
-    return FALSE;
-  }
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  return (pData->GetItemCheckState(m_pInterface, hItem) &
-          FWL_ITEMSTATE_LTB_Checked);
-}
-FX_BOOL CFWL_ListBoxImp::SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked) {
-  if (!m_pProperties->m_pDataProvider)
-    return FALSE;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
-    return FALSE;
-  }
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  pData->SetItemCheckState(m_pInterface, hItem,
-                           bChecked ? FWL_ITEMSTATE_LTB_Checked : 0);
-  return TRUE;
-}
-FX_BOOL CFWL_ListBoxImp::ScrollToVisible(FWL_HLISTITEM hItem) {
-  if (!m_pVertScrollBar)
-    return FALSE;
-  CFX_RectF rtItem;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  pData->GetItemRect(m_pInterface, hItem, rtItem);
-  FX_BOOL bScroll = FALSE;
-  FX_FLOAT fPosY = m_pVertScrollBar->GetPos();
-  rtItem.Offset(0, -fPosY + m_rtConent.top);
-  if (rtItem.top < m_rtConent.top) {
-    fPosY += rtItem.top - m_rtConent.top;
-    bScroll = TRUE;
-  } else if (rtItem.bottom() > m_rtConent.bottom()) {
-    fPosY += rtItem.bottom() - m_rtConent.bottom();
-    bScroll = TRUE;
-  }
-  if (!bScroll) {
-    return FALSE;
-  }
-  m_pVertScrollBar->SetPos(fPosY);
-  m_pVertScrollBar->SetTrackPos(fPosY);
-  Repaint(&m_rtClient);
-  return TRUE;
-}
-void CFWL_ListBoxImp::DrawBkground(CFX_Graphics* pGraphics,
-                                   IFWL_ThemeProvider* pTheme,
-                                   const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pTheme)
-    return;
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_LTB_Background;
-  param.m_dwStates = 0;
-  param.m_pGraphics = pGraphics;
-  param.m_matrix.Concat(*pMatrix);
-  param.m_rtPart = m_rtClient;
-  if (IsShowScrollBar(FALSE) && IsShowScrollBar(TRUE)) {
-    param.m_pData = &m_rtStatic;
-  }
-  if (!IsEnabled()) {
-    param.m_dwStates = FWL_PARTSTATE_LTB_Disabled;
-  }
-  pTheme->DrawBackground(&param);
-}
-void CFWL_ListBoxImp::DrawItems(CFX_Graphics* pGraphics,
-                                IFWL_ThemeProvider* pTheme,
-                                const CFX_Matrix* pMatrix) {
-  FX_FLOAT fPosX = 0.0f;
-  if (m_pHorzScrollBar) {
-    fPosX = m_pHorzScrollBar->GetPos();
-  }
-  FX_FLOAT fPosY = 0.0f;
-  if (m_pVertScrollBar) {
-    fPosY = m_pVertScrollBar->GetPos();
-  }
-  CFX_RectF rtView(m_rtConent);
-  if (m_pHorzScrollBar) {
-    rtView.height -= m_fScorllBarWidth;
-  }
-  if (m_pVertScrollBar) {
-    rtView.width -= m_fScorllBarWidth;
-  }
-  FX_BOOL bMultiCol =
-      m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      continue;
-    }
-    CFX_RectF rtItem;
-    pData->GetItemRect(m_pInterface, hItem, rtItem);
-    rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY);
-    if (rtItem.bottom() < m_rtConent.top) {
-      continue;
-    }
-    if (rtItem.top >= m_rtConent.bottom()) {
-      break;
-    }
-    if (bMultiCol && rtItem.left > m_rtConent.right()) {
-      break;
-    }
-    if (GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw) {
-      CFWL_EvtLtbDrawItem ev;
-      ev.m_pSrcTarget = m_pInterface;
-      ev.m_pGraphics = pGraphics;
-      ev.m_matrix = *pMatrix;
-      ev.m_index = i;
-      ev.m_rect = rtItem;
-      DispatchEvent(&ev);
-    } else {
-      DrawItem(pGraphics, pTheme, hItem, i, rtItem, pMatrix);
-    }
-  }
-}
-void CFWL_ListBoxImp::DrawItem(CFX_Graphics* pGraphics,
-                               IFWL_ThemeProvider* pTheme,
-                               FWL_HLISTITEM hItem,
-                               int32_t Index,
-                               const CFX_RectF& rtItem,
-                               const CFX_Matrix* pMatrix) {
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  FX_DWORD dwItemStyles = pData->GetItemStyles(m_pInterface, hItem);
-  FX_DWORD dwPartStates = FWL_PARTSTATE_LTB_Normal;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    dwPartStates = FWL_PARTSTATE_LTB_Disabled;
-  } else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected) {
-    dwPartStates = FWL_PARTSTATE_LTB_Selected;
-  }
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused &&
-      dwItemStyles & FWL_ITEMSTATE_LTB_Focused) {
-    dwPartStates |= FWL_PARTSTATE_LTB_Focused;
-  }
-  FWL_ListBoxItemData itemData;
-  itemData.pDataProvider = pData;
-  itemData.iIndex = Index;
-  {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = m_pInterface;
-    param.m_iPart = FWL_PART_LTB_ListItem;
-    param.m_dwStates = dwPartStates;
-    param.m_pGraphics = pGraphics;
-    param.m_matrix.Concat(*pMatrix);
-    param.m_rtPart = rtItem;
-    param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
-    CFX_RectF rtFocus(rtItem);
-    param.m_pData = &rtFocus;
-    if (m_pVertScrollBar && !m_pHorzScrollBar &&
-        (dwPartStates & FWL_PARTSTATE_LTB_Focused)) {
-      param.m_rtPart.left += 1;
-      param.m_rtPart.width -= (m_fScorllBarWidth + 1);
-      rtFocus.Deflate(0.5, 0.5, 1 + m_fScorllBarWidth, 1);
-    }
-    pTheme->DrawBackground(&param);
-  }
-  {
-    FX_BOOL bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon;
-    if (bHasIcon) {
-      CFX_RectF rtDIB;
-      CFX_DIBitmap* pDib = pData->GetItemIcon(m_pInterface, hItem);
-      rtDIB.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
-      if (pDib) {
-        CFWL_ThemeBackground param;
-        param.m_pWidget = m_pInterface;
-        param.m_iPart = FWL_PART_LTB_Icon;
-        param.m_pGraphics = pGraphics;
-        param.m_matrix.Concat(*pMatrix);
-        param.m_rtPart = rtDIB;
-        param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
-        param.m_pImage = pDib;
-        pTheme->DrawBackground(&param);
-      }
-    }
-    FX_BOOL bHasCheck = GetStylesEx() & FWL_STYLEEXT_LTB_Check;
-    if (bHasCheck) {
-      CFX_RectF rtCheck;
-      rtCheck.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
-      rtCheck.Deflate(2, 2, 2, 2);
-      pData->SetItemCheckRect(m_pInterface, hItem, rtCheck);
-      CFWL_ThemeBackground param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_LTB_Check;
-      param.m_pGraphics = pGraphics;
-      if (GetItemChecked(hItem)) {
-        param.m_dwStates = FWL_PARTSTATE_LTB_Checked;
-      } else {
-        param.m_dwStates = FWL_PARTSTATE_LTB_UnChecked;
-      }
-      param.m_matrix.Concat(*pMatrix);
-      param.m_rtPart = rtCheck;
-      param.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
-      pTheme->DrawBackground(&param);
-    }
-    CFX_WideString wsText;
-    pData->GetItemText(m_pInterface, hItem, wsText);
-    if (wsText.GetLength() <= 0) {
-      return;
-    }
-    CFX_RectF rtText(rtItem);
-    rtText.Deflate(FWL_LISTBOX_ItemTextMargin, FWL_LISTBOX_ItemTextMargin);
-    if (bHasIcon || bHasCheck) {
-      rtText.Deflate(rtItem.height, 0, 0, 0);
-    }
-    CFWL_ThemeText textParam;
-    textParam.m_pWidget = m_pInterface;
-    textParam.m_iPart = FWL_PART_LTB_ListItem;
-    textParam.m_dwStates = dwPartStates;
-    textParam.m_pGraphics = pGraphics;
-    textParam.m_matrix.Concat(*pMatrix);
-    textParam.m_rtPart = rtText;
-    textParam.m_wsText = wsText;
-    textParam.m_dwTTOStyles = m_dwTTOStyles;
-    textParam.m_iTTOAlign = m_iTTOAligns;
-    textParam.m_dwData = (FX_DWORD)(uintptr_t)(&itemData);
-    pTheme->DrawText(&textParam);
-  }
-}
-CFX_SizeF CFWL_ListBoxImp::CalcSize(FX_BOOL bAutoSize) {
-  CFX_SizeF fs;
-  if (!m_pProperties->m_pThemeProvider)
-    return fs;
-
-  GetClientRect(m_rtClient);
-  m_rtConent = m_rtClient;
-  CFX_RectF rtUIMargin;
-  rtUIMargin.Set(0, 0, 0, 0);
-  if (!m_pOuter) {
-    CFX_RectF* pUIMargin =
-        static_cast<CFX_RectF*>(GetThemeCapacity(FWL_WGTCAPACITY_UIMargin));
-    if (pUIMargin) {
-      m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
-                         pUIMargin->height);
-    }
-  }
-  FX_FLOAT fWidth = 0;
-  if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(m_pInterface)) {
-    IFWL_ListBoxDP* pData =
-        static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-    if (!bAutoSize) {
-    }
-    int32_t iCount = pData->CountItems(m_pInterface);
-    for (int32_t i = 0; i < iCount; i++) {
-      FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-      CFWL_ThemePart itemPart;
-      itemPart.m_pWidget = m_pInterface;
-      itemPart.m_iPart = FWL_PART_LTB_ListItem;
-      itemPart.m_pData = m_pProperties->m_pDataProvider;
-      itemPart.m_dwData = i;
-      CFX_RectF r;
-      m_pProperties->m_pThemeProvider->GetPartRect(&itemPart, r);
-      if (!bAutoSize) {
-        CFX_RectF rtItem;
-        rtItem.Set(m_rtClient.left, m_rtClient.top + fs.y, r.width, r.height);
-        IFWL_ListBoxDP* pData =
-            static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-        pData->SetItemRect(m_pInterface, hItem, rtItem);
-      }
-      fs.y += r.height;
-      if (fs.x < r.width) {
-        fs.x = r.width;
-        fWidth = r.width;
-      }
-    }
-  } else {
-    fWidth = GetMaxTextWidth();
-    fWidth += 2 * FWL_LISTBOX_ItemTextMargin;
-    if (!bAutoSize) {
-      FX_FLOAT fActualWidth =
-          m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
-      if (fWidth < fActualWidth) {
-        fWidth = fActualWidth;
-      }
-    }
-    IFWL_ListBoxDP* pData =
-        static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-    m_fItemHeight = GetItemHeigt();
-    FX_BOOL bHasIcon;
-    bHasIcon = GetStylesEx() & FWL_STYLEEXT_LTB_Icon;
-    if (bHasIcon) {
-      fWidth += m_fItemHeight;
-    }
-    int32_t iCount = pData->CountItems(m_pInterface);
-    for (int32_t i = 0; i < iCount; i++) {
-      FWL_HLISTITEM htem = pData->GetItem(m_pInterface, i);
-      GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize);
-    }
-  }
-  if (bAutoSize) {
-    return fs;
-  }
-  FX_FLOAT iWidth = m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
-  FX_FLOAT iHeight = m_rtClient.height;
-  FX_BOOL bShowVertScr =
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) &&
-      (m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll);
-  FX_BOOL bShowHorzScr =
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarAlaways) &&
-      (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll);
-  if (!bShowVertScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_VScroll &&
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) == 0) {
-    bShowVertScr = (fs.y > iHeight);
-  }
-  if (!bShowHorzScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) {
-    bShowHorzScr = (fs.x > iWidth);
-  }
-  CFX_SizeF szRange;
-  if (bShowVertScr) {
-    if (!m_pVertScrollBar) {
-      InitScrollBar();
-    }
-    CFX_RectF rtScrollBar;
-    rtScrollBar.Set(m_rtClient.right() - m_fScorllBarWidth, m_rtClient.top,
-                    m_fScorllBarWidth, m_rtClient.height - 1);
-    if (bShowHorzScr) {
-      rtScrollBar.height -= m_fScorllBarWidth;
-    }
-    m_pVertScrollBar->SetWidgetRect(rtScrollBar);
-    szRange.x = 0, szRange.y = fs.y - m_rtConent.height;
-    if (szRange.y < m_fItemHeight) {
-      szRange.y = m_fItemHeight;
-    }
-    m_pVertScrollBar->SetRange(szRange.x, szRange.y);
-    m_pVertScrollBar->SetPageSize(rtScrollBar.height * 9 / 10);
-    m_pVertScrollBar->SetStepSize(m_fItemHeight);
-    FX_FLOAT fPos = m_pVertScrollBar->GetPos();
-    if (fPos < 0) {
-      fPos = 0;
-    }
-    if (fPos > szRange.y) {
-      fPos = szRange.y;
-    }
-    m_pVertScrollBar->SetPos(fPos);
-    m_pVertScrollBar->SetTrackPos(fPos);
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
-            0 ||
-        (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) {
-      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-    }
-    m_pVertScrollBar->Update();
-  } else if (m_pVertScrollBar) {
-    m_pVertScrollBar->SetPos(0);
-    m_pVertScrollBar->SetTrackPos(0);
-    m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  if (bShowHorzScr) {
-    if (!m_pHorzScrollBar) {
-      InitScrollBar(FALSE);
-    }
-    CFX_RectF rtScrollBar;
-    rtScrollBar.Set(m_rtClient.left, m_rtClient.bottom() - m_fScorllBarWidth,
-                    m_rtClient.width, m_fScorllBarWidth);
-    if (bShowVertScr) {
-      rtScrollBar.width -= m_fScorllBarWidth;
-    }
-    m_pHorzScrollBar->SetWidgetRect(rtScrollBar);
-    szRange.x = 0, szRange.y = fs.x - rtScrollBar.width;
-    m_pHorzScrollBar->SetRange(szRange.x, szRange.y);
-    m_pHorzScrollBar->SetPageSize(fWidth * 9 / 10);
-    m_pHorzScrollBar->SetStepSize(fWidth / 10);
-    FX_FLOAT fPos = m_pHorzScrollBar->GetPos();
-    if (fPos < 0) {
-      fPos = 0;
-    }
-    if (fPos > szRange.y) {
-      fPos = szRange.y;
-    }
-    m_pHorzScrollBar->SetPos(fPos);
-    m_pHorzScrollBar->SetTrackPos(fPos);
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
-            0 ||
-        (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)) {
-      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-    }
-    m_pHorzScrollBar->Update();
-  } else if (m_pHorzScrollBar) {
-    m_pHorzScrollBar->SetPos(0);
-    m_pHorzScrollBar->SetTrackPos(0);
-    m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  }
-  if (bShowVertScr && bShowHorzScr) {
-    m_rtStatic.Set(m_rtClient.right() - m_fScorllBarWidth,
-                   m_rtClient.bottom() - m_fScorllBarWidth, m_fScorllBarWidth,
-                   m_fScorllBarWidth);
-  }
-  return fs;
-}
-void CFWL_ListBoxImp::GetItemSize(CFX_SizeF& size,
-                                  FWL_HLISTITEM hItem,
-                                  FX_FLOAT fWidth,
-                                  FX_FLOAT m_fItemHeight,
-                                  FX_BOOL bAutoSize) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) {
-  } else {
-    if (!bAutoSize) {
-      CFX_RectF rtItem;
-      rtItem.Set(0, size.y, fWidth, m_fItemHeight);
-      IFWL_ListBoxDP* pData =
-          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-      pData->SetItemRect(m_pInterface, hItem, rtItem);
-    }
-    size.x = fWidth;
-    size.y += m_fItemHeight;
-  }
-}
-FX_FLOAT CFWL_ListBoxImp::GetMaxTextWidth() {
-  FX_FLOAT fRet = 0.0f;
-  IFWL_ListBoxDP* pData =
-      static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(m_pInterface);
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM hItem = pData->GetItem(m_pInterface, i);
-    if (!hItem) {
-      continue;
-    }
-    CFX_WideString wsText;
-    pData->GetItemText(m_pInterface, hItem, wsText);
-    CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider);
-    if (sz.x > fRet) {
-      fRet = sz.x;
-    }
-  }
-  return fRet;
-}
-FX_FLOAT CFWL_ListBoxImp::GetScrollWidth() {
-  FX_FLOAT* pfWidth =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-  if (!pfWidth)
-    return 0;
-  return *pfWidth;
-}
-FX_FLOAT CFWL_ListBoxImp::GetItemHeigt() {
-  FX_FLOAT* pfFont =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FontSize));
-  if (!pfFont)
-    return 20;
-  return *pfFont + 2 * FWL_LISTBOX_ItemTextMargin;
-}
-void CFWL_ListBoxImp::InitScrollBar(FX_BOOL bVert) {
-  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
-    return;
-  }
-  CFWL_WidgetImpProperties prop;
-  prop.m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
-  prop.m_dwStates = FWL_WGTSTATE_Invisible;
-  prop.m_pParent = m_pInterface;
-  prop.m_pThemeProvider = m_pScrollBarTP;
-  IFWL_ScrollBar* pScrollBar = IFWL_ScrollBar::Create(prop, m_pInterface);
-  pScrollBar->Initialize();
-  (bVert ? &m_pVertScrollBar : &m_pHorzScrollBar)->reset(pScrollBar);
-}
-void CFWL_ListBoxImp::SortItem() {}
-FX_BOOL CFWL_ListBoxImp::IsShowScrollBar(FX_BOOL bVert) {
-  IFWL_ScrollBar* pScrollbar =
-      bVert ? m_pVertScrollBar.get() : m_pHorzScrollBar.get();
-  if (!pScrollbar || (pScrollbar->GetStates() & FWL_WGTSTATE_Invisible)) {
-    return FALSE;
-  }
-  return !(m_pProperties->m_dwStyleExes &
-           FWL_STYLEEXT_LTB_ShowScrollBarFocus) ||
-         (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
-}
-void CFWL_ListBoxImp::ProcessSelChanged() {
-  CFWL_EvtLtbSelChanged selEvent;
-  selEvent.m_pSrcTarget = m_pInterface;
-  CFX_Int32Array arrSels;
-  int32_t iCount = CountSelItems();
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_HLISTITEM item = GetSelItem(i);
-    if (item == NULL) {
-      continue;
-    }
-    selEvent.iarraySels.Add(i);
-  }
-  DispatchEvent(&selEvent);
-}
-CFWL_ListBoxImpDelegate::CFWL_ListBoxImpDelegate(CFWL_ListBoxImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_ListBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  if (!m_pOwner->IsEnabled()) {
-    return 1;
-  }
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  int32_t iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_MouseWheel: {
-      OnMouseWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage));
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pMsg = static_cast<CFWL_MsgKey*>(pMessage);
-      if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown)
-        OnKeyDown(pMsg);
-      break;
-    }
-    default: { iRet = 0; }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_ListBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  if (!pEvent)
-    return FWL_ERR_Indefinite;
-  if (pEvent->GetClassID() != FWL_EVTHASH_Scroll) {
-    return FWL_ERR_Succeeded;
-  }
-  IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
-  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
-       m_pOwner->m_pVertScrollBar) ||
-      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
-       m_pOwner->m_pHorzScrollBar)) {
-    CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
-    OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
-             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ListBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_ListBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
-  if (m_pOwner->GetStylesEx() & FWL_STYLEEXT_LTB_ShowScrollBarFocus) {
-    if (m_pOwner->m_pVertScrollBar) {
-      m_pOwner->m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
-    }
-    if (m_pOwner->m_pHorzScrollBar) {
-      m_pOwner->m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
-    }
-  }
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_ListBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDown = TRUE;
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  FWL_HLISTITEM hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-  if (!hItem) {
-    return;
-  }
-  if (m_pOwner->m_pProperties->m_dwStyleExes &
-      FWL_STYLEEXT_LTB_MultiSelection) {
-    if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
-      FX_BOOL bSelected = m_pOwner->IsItemSelected(hItem);
-      m_pOwner->SetSelectionDirect(hItem, !bSelected);
-      m_pOwner->m_hAnchor = hItem;
-    } else if (pMsg->m_dwFlags & FWL_KEYFLAG_Shift) {
-      if (m_pOwner->m_hAnchor) {
-        m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE);
-      } else {
-        m_pOwner->SetSelectionDirect(hItem, TRUE);
-      }
-    } else {
-      m_pOwner->SetSelection(hItem, hItem, TRUE);
-      m_pOwner->m_hAnchor = hItem;
-    }
-  } else {
-    m_pOwner->SetSelection(hItem, hItem, TRUE);
-  }
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check) {
-    FWL_HLISTITEM hSelectedItem =
-        m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-    CFX_RectF rtCheck;
-    m_pOwner->GetItemCheckRect(hSelectedItem, rtCheck);
-    FX_BOOL bChecked = m_pOwner->GetItemChecked(hItem);
-    if (rtCheck.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if (bChecked) {
-        m_pOwner->SetItemChecked(hItem, FALSE);
-      } else {
-        m_pOwner->SetItemChecked(hItem, TRUE);
-      }
-      m_pOwner->Update();
-    }
-  }
-  m_pOwner->SetFocusItem(hItem);
-  m_pOwner->ScrollToVisible(hItem);
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->ProcessSelChanged();
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_ListBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bLButtonDown) {
-    m_pOwner->m_bLButtonDown = FALSE;
-    m_pOwner->SetGrab(FALSE);
-    DispatchSelChangedEv();
-  }
-}
-void CFWL_ListBoxImpDelegate::OnMouseWheel(CFWL_MsgMouseWheel* pMsg) {
-  if (!m_pOwner->IsShowScrollBar(TRUE)) {
-    return;
-  }
-  IFWL_WidgetDelegate* pDelegate =
-      m_pOwner->m_pVertScrollBar->SetDelegate(NULL);
-  pDelegate->OnProcessMessage(pMsg);
-}
-void CFWL_ListBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  FX_DWORD dwKeyCode = pMsg->m_dwKeyCode;
-  switch (dwKeyCode) {
-    case FWL_VKEY_Tab:
-    case FWL_VKEY_Up:
-    case FWL_VKEY_Down:
-    case FWL_VKEY_Home:
-    case FWL_VKEY_End: {
-      FWL_HLISTITEM hItem = m_pOwner->GetFocusedItem();
-      hItem = m_pOwner->GetItem(hItem, dwKeyCode);
-      FX_BOOL bShift = pMsg->m_dwFlags & FWL_KEYFLAG_Shift;
-      FX_BOOL bCtrl = pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl;
-      OnVK(hItem, bShift, bCtrl);
-      DispatchSelChangedEv();
-      m_pOwner->ProcessSelChanged();
-      break;
-    }
-    default: {}
-  }
-}
-void CFWL_ListBoxImpDelegate::OnVK(FWL_HLISTITEM hItem,
-                                   FX_BOOL bShift,
-                                   FX_BOOL bCtrl) {
-  if (!hItem) {
-    return;
-  }
-  if (m_pOwner->m_pProperties->m_dwStyleExes &
-      FWL_STYLEEXT_LTB_MultiSelection) {
-    if (bCtrl) {
-    } else if (bShift) {
-      if (m_pOwner->m_hAnchor) {
-        m_pOwner->SetSelection(m_pOwner->m_hAnchor, hItem, TRUE);
-      } else {
-        m_pOwner->SetSelectionDirect(hItem, TRUE);
-      }
-    } else {
-      m_pOwner->SetSelection(hItem, hItem, TRUE);
-      m_pOwner->m_hAnchor = hItem;
-    }
-  } else {
-    m_pOwner->SetSelection(hItem, hItem, TRUE);
-  }
-  m_pOwner->SetFocusItem(hItem);
-  m_pOwner->ScrollToVisible(hItem);
-  {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                     m_pOwner->m_pProperties->m_rtWidget.height);
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-FX_BOOL CFWL_ListBoxImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
-                                          FX_DWORD dwCode,
-                                          FX_FLOAT fPos) {
-  CFX_SizeF fs;
-  pScrollBar->GetRange(fs.x, fs.y);
-  FX_FLOAT iCurPos = pScrollBar->GetPos();
-  FX_FLOAT fStep = pScrollBar->GetStepSize();
-  switch (dwCode) {
-    case FWL_SCBCODE_Min: {
-      fPos = fs.x;
-      break;
-    }
-    case FWL_SCBCODE_Max: {
-      fPos = fs.y;
-      break;
-    }
-    case FWL_SCBCODE_StepBackward: {
-      fPos -= fStep;
-      if (fPos < fs.x + fStep / 2) {
-        fPos = fs.x;
-      }
-      break;
-    }
-    case FWL_SCBCODE_StepForward: {
-      fPos += fStep;
-      if (fPos > fs.y - fStep / 2) {
-        fPos = fs.y;
-      }
-      break;
-    }
-    case FWL_SCBCODE_PageBackward: {
-      fPos -= pScrollBar->GetPageSize();
-      if (fPos < fs.x) {
-        fPos = fs.x;
-      }
-      break;
-    }
-    case FWL_SCBCODE_PageForward: {
-      fPos += pScrollBar->GetPageSize();
-      if (fPos > fs.y) {
-        fPos = fs.y;
-      }
-      break;
-    }
-    case FWL_SCBCODE_Pos:
-    case FWL_SCBCODE_TrackPos:
-      break;
-    case FWL_SCBCODE_EndScroll:
-      return FALSE;
-  }
-  if (iCurPos != fPos) {
-    pScrollBar->SetPos(fPos);
-    pScrollBar->SetTrackPos(fPos);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
-  return TRUE;
-}
-void CFWL_ListBoxImpDelegate::DispatchSelChangedEv() {
-  CFWL_EvtLtbSelChanged ev;
-  ev.m_pSrcTarget = m_pOwner->m_pInterface;
-  m_pOwner->DispatchEvent(&ev);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_listboximp.h b/xfa/src/fwl/basewidget/fwl_listboximp.h
deleted file mode 100644
index 614b76c..0000000
--- a/xfa/src/fwl/basewidget/fwl_listboximp.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
-
-#include <memory>
-
-#include "xfa/include/fwl/basewidget/fwl_combobox.h"
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/basewidget/fwl_listbox.h"
-#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_ListBoxImpDelegate;
-
-class CFWL_ListBoxImp : public CFWL_WidgetImp {
- public:
-  CFWL_ListBoxImp(const CFWL_WidgetImpProperties& properties,
-                  IFWL_Widget* pOuter);
-  ~CFWL_ListBoxImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
-  virtual int32_t CountSelItems();
-  virtual FWL_HLISTITEM GetSelItem(int32_t nIndexSel);
-  virtual int32_t GetSelIndex(int32_t nIndex);
-  virtual FWL_ERR SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect = TRUE);
-  virtual FWL_ERR GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText);
-  virtual FWL_ERR GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert = TRUE);
-  virtual FWL_ERR* Sort(IFWL_ListBoxCompare* pCom);
-
- protected:
-  FWL_HLISTITEM GetItem(FWL_HLISTITEM hItem, FX_DWORD dwKeyCode);
-  void SetSelection(FWL_HLISTITEM hStart,
-                    FWL_HLISTITEM hEnd,
-                    FX_BOOL bSelected);
-  void SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect);
-  FX_BOOL IsItemSelected(FWL_HLISTITEM hItem);
-  void ClearSelection();
-  void SelectAll();
-  FWL_HLISTITEM GetFocusedItem();
-  void SetFocusItem(FWL_HLISTITEM hItem);
-  FWL_HLISTITEM GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy);
-  FX_BOOL GetItemCheckRect(FWL_HLISTITEM hItem, CFX_RectF& rtCheck);
-  FX_BOOL SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked);
-  FX_BOOL GetItemChecked(FWL_HLISTITEM hItem);
-  FX_BOOL ScrollToVisible(FWL_HLISTITEM hItem);
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix = NULL);
-  void DrawItems(CFX_Graphics* pGraphics,
-                 IFWL_ThemeProvider* pTheme,
-                 const CFX_Matrix* pMatrix = NULL);
-  void DrawItem(CFX_Graphics* pGraphics,
-                IFWL_ThemeProvider* pTheme,
-                FWL_HLISTITEM hItem,
-                int32_t Index,
-                const CFX_RectF& rtItem,
-                const CFX_Matrix* pMatrix = NULL);
-  void DrawStatic(CFX_Graphics* pGraphics, IFWL_ThemeProvider* pTheme);
-  CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE);
-  void GetItemSize(CFX_SizeF& size,
-                   FWL_HLISTITEM hItem,
-                   FX_FLOAT fWidth,
-                   FX_FLOAT fHeight,
-                   FX_BOOL bAutoSize = FALSE);
-  FX_FLOAT GetMaxTextWidth();
-  FX_FLOAT GetScrollWidth();
-  FX_FLOAT GetItemHeigt();
-  void InitScrollBar(FX_BOOL bVert = TRUE);
-  void SortItem();
-  FX_BOOL IsShowScrollBar(FX_BOOL bVert);
-  void ProcessSelChanged();
-
- protected:
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtStatic;
-  CFX_RectF m_rtConent;
-  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
-  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
-  FX_DWORD m_dwTTOStyles;
-  int32_t m_iTTOAligns;
-  FWL_HLISTITEM m_hAnchor;
-  FX_FLOAT m_fItemHeight;
-  FX_FLOAT m_fScorllBarWidth;
-  FX_BOOL m_bLButtonDown;
-  IFWL_ThemeProvider* m_pScrollBarTP;
-  friend class CFWL_ListBoxImpDelegate;
-};
-class CFWL_ListBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ListBoxImpDelegate(CFWL_ListBoxImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseWheel(CFWL_MsgMouseWheel* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  void OnVK(FWL_HLISTITEM hItem, FX_BOOL bShift, FX_BOOL bCtrl);
-  FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos);
-  void DispatchSelChangedEv();
-  CFWL_ListBoxImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_LISTBOXIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_monthcalendarimp.cpp b/xfa/src/fwl/basewidget/fwl_monthcalendarimp.cpp
deleted file mode 100644
index 8bea9f1..0000000
--- a/xfa/src/fwl/basewidget/fwl_monthcalendarimp.cpp
+++ /dev/null
@@ -1,1098 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_monthcalendarimp.h"
-
-#include <algorithm>
-
-#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-#define MONTHCAL_HSEP_HEIGHT 1
-#define MONTHCAL_VSEP_WIDTH 1
-#define MONTHCAL_HMARGIN 3
-#define MONTHCAL_VMARGIN 2
-#define MONTHCAL_ROWS 9
-#define MONTHCAL_COLUMNS 7
-#define MONTHCAL_HEADER_BTN_VMARGIN 7
-#define MONTHCAL_HEADER_BTN_HMARGIN 5
-
-// static
-IFWL_MonthCalendar* IFWL_MonthCalendar::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_MonthCalendar* pMonthCalendar = new IFWL_MonthCalendar;
-  CFWL_MonthCalendarImp* pMonthCalendarImpl =
-      new CFWL_MonthCalendarImp(properties, pOuter);
-  pMonthCalendar->SetImpl(pMonthCalendarImpl);
-  pMonthCalendarImpl->SetInterface(pMonthCalendar);
-  return pMonthCalendar;
-}
-IFWL_MonthCalendar::IFWL_MonthCalendar() {}
-int32_t IFWL_MonthCalendar::CountSelect() {
-  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())->CountSelect();
-}
-FX_BOOL IFWL_MonthCalendar::GetSelect(int32_t& iYear,
-                                      int32_t& iMonth,
-                                      int32_t& iDay,
-                                      int32_t nIndex) {
-  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())
-      ->GetSelect(iYear, iMonth, iDay, nIndex);
-}
-FX_BOOL IFWL_MonthCalendar::SetSelect(int32_t iYear,
-                                      int32_t iMonth,
-                                      int32_t iDay) {
-  return static_cast<CFWL_MonthCalendarImp*>(GetImpl())
-      ->SetSelect(iYear, iMonth, iDay);
-}
-
-CFWL_MonthCalendarImp::CFWL_MonthCalendarImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_iCurYear(2011),
-      m_iCurMonth(1),
-      m_iYear(2011),
-      m_iMonth(1),
-      m_iDay(1),
-      m_iHovered(-1),
-      m_iLBtnPartStates(FWL_PARTSTATE_MCD_Normal),
-      m_iRBtnPartStates(FWL_PARTSTATE_MCD_Normal) {
-  m_rtHead.Reset();
-  m_rtWeek.Reset();
-  m_rtLBtn.Reset();
-  m_rtRBtn.Reset();
-  m_rtDates.Reset();
-  m_rtHSep.Reset();
-  m_rtHeadText.Reset();
-  m_rtToday.Reset();
-  m_rtTodayFlag.Reset();
-  m_rtClient.Reset();
-  m_rtWeekNum.Reset();
-  m_rtWeekNumSep.Reset();
-  m_pDateTime = new CFX_DateTime;
-  m_bInit = FALSE;
-  m_iMaxSel = 1;
-}
-CFWL_MonthCalendarImp::~CFWL_MonthCalendarImp() {
-  ClearDateItem();
-  delete m_pDateTime;
-  m_arrSelDays.RemoveAll();
-}
-FWL_ERR CFWL_MonthCalendarImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_MonthCalendar;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_MonthCalendarImp::GetClassID() const {
-  return FWL_CLASSHASH_MonthCalendar;
-}
-FWL_ERR CFWL_MonthCalendarImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_MonthCalendarImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_MonthCalendarImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_MonthCalendarImp::GetWidgetRect(CFX_RectF& rect,
-                                             FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    CFX_SizeF fs = CalcSize(TRUE);
-    rect.Set(0, 0, fs.x, fs.y);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_MonthCalendarImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  GetCapValue();
-  if (!m_bInit) {
-    m_bInit = InitDate();
-  }
-  ClearDateItem();
-  ReSetDateItem();
-  LayOut();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_MonthCalendarImp::DrawWidget(CFX_Graphics* pGraphics,
-                                          const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (m_pProperties->m_pThemeProvider == NULL) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_MCD_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_MCD_Edge, pTheme, pMatrix);
-  }
-  DrawBkground(pGraphics, pTheme, pMatrix);
-  DrawHeadBK(pGraphics, pTheme, pMatrix);
-  DrawLButton(pGraphics, pTheme, pMatrix);
-  DrawRButton(pGraphics, pTheme, pMatrix);
-  DrawSeperator(pGraphics, pTheme, pMatrix);
-  DrawDatesInBK(pGraphics, pTheme, pMatrix);
-  DrawDatesInCircle(pGraphics, pTheme, pMatrix);
-  DrawCaption(pGraphics, pTheme, pMatrix);
-  DrawWeek(pGraphics, pTheme, pMatrix);
-  DrawDatesIn(pGraphics, pTheme, pMatrix);
-  DrawDatesOut(pGraphics, pTheme, pMatrix);
-  DrawToday(pGraphics, pTheme, pMatrix);
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
-    DrawWeekNumberSep(pGraphics, pTheme, pMatrix);
-    DrawWeekNumber(pGraphics, pTheme, pMatrix);
-  }
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_MonthCalendarImp::CountSelect() {
-  return m_arrSelDays.GetSize();
-}
-FX_BOOL CFWL_MonthCalendarImp::GetSelect(int32_t& iYear,
-                                         int32_t& iMonth,
-                                         int32_t& iDay,
-                                         int32_t nIndex) {
-  if (nIndex >= m_arrSelDays.GetSize()) {
-    return FALSE;
-  }
-  iYear = m_iCurYear;
-  iMonth = m_iCurMonth;
-  iDay = m_arrSelDays[nIndex];
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::SetSelect(int32_t iYear,
-                                         int32_t iMonth,
-                                         int32_t iDay) {
-  ChangeToMonth(iYear, iMonth);
-  return AddSelDay(iDay);
-}
-void CFWL_MonthCalendarImp::DrawBkground(CFX_Graphics* pGraphics,
-                                         IFWL_ThemeProvider* pTheme,
-                                         const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_Background;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_rtPart = m_rtClient;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawHeadBK(CFX_Graphics* pGraphics,
-                                       IFWL_ThemeProvider* pTheme,
-                                       const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_Header;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_rtPart = m_rtHead;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawLButton(CFX_Graphics* pGraphics,
-                                        IFWL_ThemeProvider* pTheme,
-                                        const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_LBtn;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = m_iLBtnPartStates;
-  params.m_rtPart = m_rtLBtn;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawRButton(CFX_Graphics* pGraphics,
-                                        IFWL_ThemeProvider* pTheme,
-                                        const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_RBtn;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = m_iRBtnPartStates;
-  params.m_rtPart = m_rtRBtn;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawCaption(CFX_Graphics* pGraphics,
-                                        IFWL_ThemeProvider* pTheme,
-                                        const CFX_Matrix* pMatrix) {
-  CFWL_ThemeText textParam;
-  textParam.m_pWidget = m_pInterface;
-  textParam.m_iPart = FWL_PART_MCD_Caption;
-  textParam.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  textParam.m_pGraphics = pGraphics;
-  int32_t iYear;
-  int32_t iMonth;
-  iYear = m_iCurYear;
-  iMonth = m_iCurMonth;
-  CFX_WideString wsCation;
-  GetHeadText(iYear, iMonth, wsCation);
-  textParam.m_wsText = wsCation;
-  m_szHead = CalcTextSize(textParam.m_wsText, m_pProperties->m_pThemeProvider);
-  CalcHeadSize();
-  textParam.m_rtPart = m_rtHeadText;
-  textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  textParam.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
-    textParam.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawText(&textParam);
-}
-void CFWL_MonthCalendarImp::DrawSeperator(CFX_Graphics* pGraphics,
-                                          IFWL_ThemeProvider* pTheme,
-                                          const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_HSeparator;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_rtPart = m_rtHSep;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawDatesInBK(CFX_Graphics* pGraphics,
-                                          IFWL_ThemeProvider* pTheme,
-                                          const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_DateInBK;
-  params.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  int32_t iCount = m_arrDates.GetSize();
-  for (int32_t j = 0; j < iCount; j++) {
-    FWL_DATEINFO* pDataInfo = (FWL_DATEINFO*)m_arrDates.GetAt(j);
-    if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Selected) {
-      params.m_dwStates |= FWL_PARTSTATE_MCD_Selected;
-      if (((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) ==
-           0) &&
-          pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
-        params.m_dwStates |= FWL_PARTSTATE_MCD_Flagged;
-      }
-      if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Focused) {
-        params.m_dwStates |= FWL_PARTSTATE_MCD_Focused;
-      }
-    } else if (j == m_iHovered - 1) {
-      params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered;
-    } else if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
-      params.m_dwStates = FWL_PARTSTATE_MCD_Flagged;
-      pTheme->DrawBackground(&params);
-    }
-    params.m_rtPart = pDataInfo->rect;
-    pTheme->DrawBackground(&params);
-    params.m_dwStates = 0;
-  }
-}
-void CFWL_MonthCalendarImp::DrawWeek(CFX_Graphics* pGraphics,
-                                     IFWL_ThemeProvider* pTheme,
-                                     const CFX_Matrix* pMatrix) {
-  CFWL_ThemeText params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_Week;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  CFX_RectF rtDayOfWeek;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  for (int32_t i = 0; i < 7; i++) {
-    rtDayOfWeek.Set(m_rtWeek.left + i * (m_szCell.x + MONTHCAL_HMARGIN * 2),
-                    m_rtWeek.top, m_szCell.x, m_szCell.y);
-    CFX_WideString* wsWeekDay = static_cast<CFX_WideString*>(
-        pTheme->GetCapacity(&params, i + FWL_MCCAPACITY_Sun));
-    params.m_rtPart = rtDayOfWeek;
-    params.m_wsText = *wsWeekDay;
-    params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-    pTheme->DrawText(&params);
-  }
-}
-void CFWL_MonthCalendarImp::DrawWeekNumber(CFX_Graphics* pGraphics,
-                                           IFWL_ThemeProvider* pTheme,
-                                           const CFX_Matrix* pMatrix) {
-  CFWL_ThemeText params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_WeekNum;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
-  CFX_WideString wsWeekNum;
-  params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  int32_t iWeekNum = 0;
-  int32_t iMonthNum = m_pDateTime->GetMonth();
-  int32_t iDayNum = FX_DaysInMonth(m_iCurYear, iMonthNum);
-  int32_t iTemp = 0;
-  FX_FLOAT fVStartPos = m_rtClient.top + m_fHeadHei + m_fHSepHei;
-  FX_FLOAT fHStartPos = m_rtClient.left;
-  for (int32_t i = 1; i <= iDayNum; i += 7) {
-    iTemp++;
-    iWeekNum = CalWeekNumber(m_iCurYear, iMonthNum, i);
-    m_rtWeekNum.Set(fHStartPos, fVStartPos + m_fDateCellHei * iTemp,
-                    m_fWeekNumWid, m_fDateCellHei);
-    wsWeekNum.Format(L"%d", iWeekNum);
-    params.m_wsText = wsWeekNum;
-    params.m_rtPart = m_rtWeekNum;
-    pTheme->DrawText(&params);
-  }
-}
-void CFWL_MonthCalendarImp::DrawWeekNumberSep(CFX_Graphics* pGraphics,
-                                              IFWL_ThemeProvider* pTheme,
-                                              const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_WeekNumSep;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_rtPart = m_rtWeekNumSep;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawToday(CFX_Graphics* pGraphics,
-                                      IFWL_ThemeProvider* pTheme,
-                                      const CFX_Matrix* pMatrix) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) {
-    return;
-  }
-  CFWL_ThemeText params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_Today;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
-  CFX_WideString* wsDay = static_cast<CFX_WideString*>(
-      pTheme->GetCapacity(&params, FWL_MCCAPACITY_Today));
-  CFX_WideString wsText;
-  GetTodayText(m_iYear, m_iMonth, m_iDay, wsText);
-  params.m_wsText = *wsDay + wsText;
-  m_szToday = CalcTextSize(params.m_wsText, m_pProperties->m_pThemeProvider);
-  CalcTodaySize();
-  params.m_rtPart = m_rtToday;
-  params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawText(&params);
-}
-void CFWL_MonthCalendarImp::DrawDatesIn(CFX_Graphics* pGraphics,
-                                        IFWL_ThemeProvider* pTheme,
-                                        const CFX_Matrix* pMatrix) {
-  CFWL_ThemeText params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_DatesIn;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  int32_t iCount = m_arrDates.GetSize();
-  for (int32_t j = 0; j < iCount; j++) {
-    FWL_DATEINFO* pDataInfo = (FWL_DATEINFO*)m_arrDates.GetAt(j);
-    params.m_wsText = pDataInfo->wsDay;
-    params.m_rtPart = pDataInfo->rect;
-    params.m_dwStates = pDataInfo->dwStates;
-    if (j + 1 == m_iHovered) {
-      params.m_dwStates |= FWL_PARTSTATE_MCD_Hovered;
-    }
-    params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-    pTheme->DrawText(&params);
-  }
-}
-void CFWL_MonthCalendarImp::DrawDatesOut(CFX_Graphics* pGraphics,
-                                         IFWL_ThemeProvider* pTheme,
-                                         const CFX_Matrix* pMatrix) {
-  CFWL_ThemeText params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_DatesOut;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawText(&params);
-}
-void CFWL_MonthCalendarImp::DrawDatesInCircle(CFX_Graphics* pGraphics,
-                                              IFWL_ThemeProvider* pTheme,
-                                              const CFX_Matrix* pMatrix) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) {
-    return;
-  }
-  if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear) {
-    return;
-  }
-  if (m_iDay < 1 || m_iDay > m_arrDates.GetSize()) {
-    return;
-  }
-  FWL_DATEINFO* pDate = (FWL_DATEINFO*)m_arrDates[m_iDay - 1];
-  if (!pDate)
-    return;
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_DateInCircle;
-  params.m_pGraphics = pGraphics;
-  params.m_rtPart = pDate->rect;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-void CFWL_MonthCalendarImp::DrawTodayCircle(CFX_Graphics* pGraphics,
-                                            IFWL_ThemeProvider* pTheme,
-                                            const CFX_Matrix* pMatrix) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) {
-    return;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) {
-    return;
-  }
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_MCD_TodayCircle;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = FWL_PARTSTATE_MCD_Normal;
-  params.m_rtPart = m_rtTodayFlag;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&params);
-}
-CFX_SizeF CFWL_MonthCalendarImp::CalcSize(FX_BOOL bAutoSize) {
-  if (!m_pProperties->m_pThemeProvider)
-    return CFX_SizeF();
-
-  if (!bAutoSize) {
-    GetClientRect(m_rtClient);
-    return CFX_SizeF(m_rtClient.width, m_rtClient.height);
-  }
-
-  CFX_SizeF fs;
-  CFWL_ThemePart params;
-  params.m_pWidget = m_pInterface;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFX_WideString* wsText = NULL;
-  FX_FLOAT fMaxWeekW = 0.0f;
-  FX_FLOAT fMaxWeekH = 0.0f;
-  for (FX_DWORD week = FWL_MCCAPACITY_Sun; week <= FWL_MCCAPACITY_Sat; week++) {
-    wsText = static_cast<CFX_WideString*>(pTheme->GetCapacity(&params, week));
-    CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider);
-    fMaxWeekW = (fMaxWeekW >= sz.x) ? fMaxWeekW : sz.x;
-    fMaxWeekH = (fMaxWeekH >= sz.y) ? fMaxWeekH : sz.y;
-  }
-  FX_FLOAT fDayMaxW = 0.0f;
-  FX_FLOAT fDayMaxH = 0.0f;
-  for (int day = 10; day <= 31; day++) {
-    CFX_WideString wsDay;
-    wsDay.Format(L"%d", day);
-    CFX_SizeF sz = CalcTextSize(wsDay, m_pProperties->m_pThemeProvider);
-    fDayMaxW = (fDayMaxW >= sz.x) ? fDayMaxW : sz.x;
-    fDayMaxH = (fDayMaxH >= sz.y) ? fDayMaxH : sz.y;
-  }
-  m_szCell.x = FX_FLOAT((fMaxWeekW >= fDayMaxW) ? (int)(fMaxWeekW + 0.5)
-                                                : (int)(fDayMaxW + 0.5));
-  m_szCell.y = (fMaxWeekH >= fDayMaxH) ? fMaxWeekH : fDayMaxH;
-  fs.x = m_szCell.x * MONTHCAL_COLUMNS +
-         MONTHCAL_HMARGIN * MONTHCAL_COLUMNS * 2 +
-         MONTHCAL_HEADER_BTN_HMARGIN * 2;
-  FX_FLOAT fMonthMaxW = 0.0f;
-  FX_FLOAT fMonthMaxH = 0.0f;
-  for (FX_DWORD month = FWL_MCCAPACITY_January;
-       month <= FWL_MCCAPACITY_December; month++) {
-    wsText = static_cast<CFX_WideString*>(pTheme->GetCapacity(&params, month));
-    CFX_SizeF sz = CalcTextSize(*wsText, m_pProperties->m_pThemeProvider);
-    fMonthMaxW = (fMonthMaxW >= sz.x) ? fMonthMaxW : sz.x;
-    fMonthMaxH = (fMonthMaxH >= sz.y) ? fMonthMaxH : sz.y;
-  }
-  CFX_WideString wsYear;
-  GetHeadText(m_iYear, m_iMonth, wsYear);
-  CFX_SizeF szYear = CalcTextSize(wsYear, m_pProperties->m_pThemeProvider);
-  fMonthMaxH = std::max(fMonthMaxH, szYear.y);
-  m_szHead = CFX_SizeF(fMonthMaxW + szYear.x, fMonthMaxH);
-  fMonthMaxW = m_szHead.x + MONTHCAL_HEADER_BTN_HMARGIN * 2 + m_szCell.x * 2;
-  fs.x = std::max(fs.x, fMonthMaxW);
-  CFX_WideString wsToday;
-  GetTodayText(m_iYear, m_iMonth, m_iDay, wsToday);
-  wsText = static_cast<CFX_WideString*>(
-      pTheme->GetCapacity(&params, FWL_MCCAPACITY_Today));
-  m_wsToday = *wsText + wsToday;
-  m_szToday = CalcTextSize(wsToday, m_pProperties->m_pThemeProvider);
-  m_szToday.y = (m_szToday.y >= m_szCell.y) ? m_szToday.y : m_szCell.y;
-  fs.y = m_szCell.x + m_szCell.y * (MONTHCAL_ROWS - 2) + m_szToday.y +
-         MONTHCAL_VMARGIN * MONTHCAL_ROWS * 2 + MONTHCAL_HEADER_BTN_VMARGIN * 4;
-  return fs;
-}
-
-void CFWL_MonthCalendarImp::CalcHeadSize() {
-  FX_FLOAT fHeadHMargin = (m_rtClient.width - m_szHead.x) / 2;
-  FX_FLOAT fHeadVMargin = (m_szCell.x - m_szHead.y) / 2;
-  m_rtHeadText.Set(m_rtClient.left + fHeadHMargin,
-                   m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN +
-                       MONTHCAL_VMARGIN + fHeadVMargin,
-                   m_szHead.x, m_szHead.y);
-}
-void CFWL_MonthCalendarImp::CalcTodaySize() {
-  m_rtTodayFlag.Set(
-      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
-      m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN,
-      m_szCell.x, m_szToday.y);
-  m_rtToday.Set(
-      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + m_szCell.x +
-          MONTHCAL_HMARGIN * 2,
-      m_rtDates.bottom() + MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN,
-      m_szToday.x, m_szToday.y);
-}
-void CFWL_MonthCalendarImp::LayOut() {
-  GetClientRect(m_rtClient);
-  {
-    m_rtHead.Set(
-        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, m_rtClient.top,
-        m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-        m_szCell.x + (MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN) * 2);
-    m_rtWeek.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                 m_rtHead.bottom(),
-                 m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-                 m_szCell.y + MONTHCAL_VMARGIN * 2);
-    m_rtLBtn.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
-                 m_szCell.x);
-    m_rtRBtn.Set(m_rtClient.left + m_rtClient.width -
-                     MONTHCAL_HEADER_BTN_HMARGIN - m_szCell.x,
-                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
-                 m_szCell.x);
-    m_rtHSep.Set(
-        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
-        m_rtWeek.bottom() - MONTHCAL_VMARGIN,
-        m_rtClient.width - (MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN) * 2,
-        MONTHCAL_HSEP_HEIGHT);
-    m_rtDates.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                  m_rtWeek.bottom(),
-                  m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-                  m_szCell.y * (MONTHCAL_ROWS - 3) +
-                      MONTHCAL_VMARGIN * (MONTHCAL_ROWS - 3) * 2);
-  }
-  CalDateItem();
-}
-void CFWL_MonthCalendarImp::CalDateItem() {
-  FX_BOOL bNewWeek = FALSE;
-  int32_t iWeekOfMonth = 0;
-  FX_FLOAT fLeft = m_rtDates.left;
-  FX_FLOAT fTop = m_rtDates.top;
-  int32_t iCount = m_arrDates.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(i);
-    if (bNewWeek) {
-      iWeekOfMonth++;
-      bNewWeek = FALSE;
-    }
-    pDateInfo->rect.Set(
-        fLeft + pDateInfo->iDayOfWeek * (m_szCell.x + (MONTHCAL_HMARGIN * 2)),
-        fTop + iWeekOfMonth * (m_szCell.y + (MONTHCAL_VMARGIN * 2)),
-        m_szCell.x + (MONTHCAL_HMARGIN * 2),
-        m_szCell.y + (MONTHCAL_VMARGIN * 2));
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
-      pDateInfo->rect.Offset(m_fWeekNumWid, 0);
-    }
-    if (pDateInfo->iDayOfWeek >= 6) {
-      bNewWeek = TRUE;
-    }
-  }
-}
-void CFWL_MonthCalendarImp::GetCapValue() {
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFWL_ThemePart part;
-  part.m_pWidget = m_pInterface;
-  m_fHeadWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_WIDTH));
-  m_fHeadHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_Height));
-  m_fHeadBtnWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH));
-  m_fHeadBtnHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT));
-  m_fHeadBtnHMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN));
-  m_fHeadBtnVMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN));
-  m_fHeadTextWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT));
-  m_fHeadTextHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT));
-  m_fHeadTextHMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN));
-  m_fHeadTextVMargin = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN));
-  m_fHSepWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_WIDTH));
-  m_fHSepHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HSEP_HEIGHT));
-  m_fWeekNumWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH));
-  m_fSepDOffset = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_DOFFSET));
-  m_fSepX = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_X));
-  m_fSepY = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_SEP_Y));
-  m_fWeekNumHeigh = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT));
-  m_fWeekWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_WIDTH));
-  m_fWeekHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WEEK_HEIGHT));
-  m_fDateCellWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH));
-  m_fDateCellHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT));
-  m_fTodayWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_WIDHT));
-  m_fTodayHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_HEIGHT));
-  m_fTodayFlagWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT));
-  m_fMCWid = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_WIDTH));
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
-    m_fMCWid += m_fWeekNumWid;
-  }
-  m_fMCHei = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_WGTCAPACITY_MC_HEIGHT));
-}
-int32_t CFWL_MonthCalendarImp::CalWeekNumber(int32_t iYear,
-                                             int32_t iMonth,
-                                             int32_t iDay) {
-  return 0;
-}
-FX_BOOL CFWL_MonthCalendarImp::GetMinDate(int32_t& iYear,
-                                          int32_t& iMonth,
-                                          int32_t& iDay) {
-  iYear = m_dtMin.iYear;
-  iMonth = m_dtMin.iMonth;
-  iDay = m_dtMin.iDay;
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::SetMinDate(int32_t iYear,
-                                          int32_t iMonth,
-                                          int32_t iDay) {
-  m_dtMin = DATE(iYear, iMonth, iDay);
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::GetMaxDate(int32_t& iYear,
-                                          int32_t& iMonth,
-                                          int32_t& iDay) {
-  iYear = m_dtMax.iYear;
-  iMonth = m_dtMax.iMonth;
-  iDay = m_dtMax.iDay;
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::SetMaxDate(int32_t iYear,
-                                          int32_t iMonth,
-                                          int32_t iDay) {
-  m_dtMax = DATE(iYear, iMonth, iDay);
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::InitDate() {
-  if (m_pProperties->m_pDataProvider) {
-    IFWL_MonthCalendarDP* pDateProv =
-        static_cast<IFWL_MonthCalendarDP*>(m_pProperties->m_pDataProvider);
-    m_iYear = pDateProv->GetCurYear(m_pInterface);
-    m_iMonth = pDateProv->GetCurMonth(m_pInterface);
-    m_iDay = pDateProv->GetCurDay(m_pInterface);
-    m_iCurYear = m_iYear;
-    m_iCurMonth = m_iMonth;
-  } else {
-    m_iDay = 1;
-    m_iMonth = 1;
-    m_iYear = 1;
-    m_iCurYear = m_iYear;
-    m_iCurMonth = m_iMonth;
-  }
-  GetTodayText(m_iYear, m_iMonth, m_iDay, m_wsToday);
-  GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead);
-  m_dtMin = DATE(1500, 12, 1);
-  m_dtMax = DATE(2200, 1, 1);
-  return TRUE;
-}
-void CFWL_MonthCalendarImp::ClearDateItem() {
-  int32_t iCount = m_arrDates.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_DATEINFO* pData = (FWL_DATEINFO*)m_arrDates.GetAt(i);
-    delete pData;
-  }
-  m_arrDates.RemoveAll();
-}
-void CFWL_MonthCalendarImp::ReSetDateItem() {
-  m_pDateTime->Set(m_iCurYear, m_iCurMonth, 1);
-  int32_t iDays = FX_DaysInMonth(m_iCurYear, m_iCurMonth);
-  int32_t iDayOfWeek = m_pDateTime->GetDayOfWeek();
-  for (int32_t i = 0; i < iDays; i++) {
-    if (iDayOfWeek >= 7) {
-      iDayOfWeek = 0;
-    }
-    CFX_WideString wsDay;
-    wsDay.Format(L"%d", i + 1);
-    FX_DWORD dwStates = 0;
-    if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1)) {
-      dwStates |= FWL_ITEMSTATE_MCD_Flag;
-    }
-    if (m_arrSelDays.Find(i + 1) != -1) {
-      dwStates |= FWL_ITEMSTATE_MCD_Selected;
-    }
-    CFX_RectF rtDate;
-    rtDate.Set(0, 0, 0, 0);
-    m_arrDates.Add(
-        new FWL_DATEINFO(i + 1, iDayOfWeek, dwStates, rtDate, wsDay));
-    iDayOfWeek++;
-  }
-}
-FX_BOOL CFWL_MonthCalendarImp::NextMonth() {
-  int32_t iYear = m_iCurYear, iMonth = m_iCurMonth;
-  if (iMonth >= 12) {
-    iMonth = 1;
-    iYear++;
-  } else {
-    iMonth++;
-  }
-  DATE dt(m_iCurYear, m_iCurMonth, 1);
-  if (!(dt < m_dtMax)) {
-    return FALSE;
-  }
-  m_iCurYear = iYear, m_iCurMonth = iMonth;
-  ChangeToMonth(m_iCurYear, m_iCurMonth);
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::PrevMonth() {
-  int32_t iYear = m_iCurYear, iMonth = m_iCurMonth;
-  if (iMonth <= 1) {
-    iMonth = 12;
-    iYear--;
-  } else {
-    iMonth--;
-  }
-  DATE dt(m_iCurYear, m_iCurMonth, 1);
-  if (!(dt > m_dtMin)) {
-    return FALSE;
-  }
-  m_iCurYear = iYear, m_iCurMonth = iMonth;
-  ChangeToMonth(m_iCurYear, m_iCurMonth);
-  return TRUE;
-}
-void CFWL_MonthCalendarImp::ChangeToMonth(int32_t iYear, int32_t iMonth) {
-  m_iCurYear = iYear;
-  m_iCurMonth = iMonth;
-  m_iHovered = -1;
-  ClearDateItem();
-  ReSetDateItem();
-  CalDateItem();
-  GetHeadText(m_iCurYear, m_iCurMonth, m_wsHead);
-}
-FX_BOOL CFWL_MonthCalendarImp::RemoveSelDay(int32_t iDay, FX_BOOL bAll) {
-  if (iDay == -1 && !bAll) {
-    return FALSE;
-  }
-  if (bAll) {
-    int32_t iCount = m_arrSelDays.GetSize();
-    int32_t iDatesCount = m_arrDates.GetSize();
-    for (int32_t i = 0; i < iCount; i++) {
-      int32_t iSelDay = m_arrSelDays.GetAt(i);
-      if (iSelDay <= iDatesCount) {
-        FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iSelDay - 1);
-        pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
-      }
-    }
-    m_arrSelDays.RemoveAll();
-  } else {
-    int32_t index = m_arrSelDays.Find(iDay);
-    if (index == -1) {
-      return FALSE;
-    }
-    int32_t iSelDay = m_arrSelDays.GetAt(iDay);
-    int32_t iDatesCount = m_arrDates.GetSize();
-    if (iSelDay <= iDatesCount) {
-      FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iSelDay - 1);
-      pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
-    }
-    m_arrSelDays.RemoveAt(index);
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::AddSelDay(int32_t iDay) {
-  FXSYS_assert(iDay > 0);
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
-  } else {
-    if (m_arrSelDays.Find(iDay) == -1) {
-      RemoveSelDay(-1, TRUE);
-      if (iDay <= m_arrDates.GetSize()) {
-        FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(iDay - 1);
-        pDateInfo->dwStates |= FWL_ITEMSTATE_MCD_Selected;
-      }
-      m_arrSelDays.Add(iDay);
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarImp::JumpToToday() {
-  if (m_iYear != m_iCurYear || m_iMonth != m_iCurMonth) {
-    m_iCurYear = m_iYear;
-    m_iCurMonth = m_iMonth;
-    ChangeToMonth(m_iYear, m_iMonth);
-    AddSelDay(m_iDay);
-  } else {
-    if (m_arrSelDays.Find(m_iDay) == -1) {
-      AddSelDay(m_iDay);
-    }
-  }
-  return TRUE;
-}
-void CFWL_MonthCalendarImp::GetHeadText(int32_t iYear,
-                                        int32_t iMonth,
-                                        CFX_WideString& wsHead) {
-  FXSYS_assert(iMonth > 0 && iMonth < 13);
-  static const FX_WCHAR* const pMonth[] = {
-      L"January",   L"February", L"March",    L"April",
-      L"May",       L"June",     L"July",     L"August",
-      L"September", L"October",  L"November", L"December"};
-  wsHead.Format(L"%s, %d", pMonth[iMonth - 1], iYear);
-}
-void CFWL_MonthCalendarImp::GetTodayText(int32_t iYear,
-                                         int32_t iMonth,
-                                         int32_t iDay,
-                                         CFX_WideString& wsToday) {
-  wsToday.Format(L", %d/%d/%d", iDay, iMonth, iYear);
-}
-int32_t CFWL_MonthCalendarImp::GetDayAtPoint(FX_FLOAT x, FX_FLOAT y) {
-  int32_t iCount = m_arrDates.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates.GetAt(i);
-    if (pDateInfo->rect.Contains(x, y)) {
-      return ++i;
-    }
-  }
-  return -1;
-}
-FX_BOOL CFWL_MonthCalendarImp::GetDayRect(int32_t iDay, CFX_RectF& rtDay) {
-  if (iDay <= 0 || iDay > m_arrDates.GetSize()) {
-    return FALSE;
-  }
-  FWL_DATEINFO* pDateInfo = (FWL_DATEINFO*)m_arrDates[iDay - 1];
-  if (!pDateInfo)
-    return FALSE;
-  rtDay = pDateInfo->rect;
-  return TRUE;
-}
-CFWL_MonthCalendarImpDelegate::CFWL_MonthCalendarImpDelegate(
-    CFWL_MonthCalendarImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_MonthCalendarImpDelegate::OnProcessMessage(
-    CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  int32_t iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMouse->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMouse);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMouse);
-          break;
-        }
-        default: { break; }
-      }
-      break;
-    }
-    default: {
-      iRet = 0;
-      break;
-    }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_MonthCalendarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                    const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-
-void CFWL_MonthCalendarImpDelegate::OnActivate(CFWL_Message* pMsg) {}
-
-void CFWL_MonthCalendarImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                   FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_MonthCalendarImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = FWL_PARTSTATE_MCD_Pressed;
-    m_pOwner->PrevMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates |= FWL_PARTSTATE_MCD_Pressed;
-    m_pOwner->NextMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
-        0) {
-      m_pOwner->JumpToToday();
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
-  } else {
-    if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
-    } else {
-      int32_t iOldSel = 0;
-      if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-        iOldSel = m_pOwner->m_arrSelDays[0];
-      } else {
-        return;
-      }
-      int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-      FX_BOOL bSelChanged = iCurSel > 0 && iCurSel != iOldSel;
-      if (bSelChanged) {
-        FWL_DATEINFO* lpDatesInfo =
-            (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iCurSel - 1);
-        CFX_RectF rtInvalidate(lpDatesInfo->rect);
-        if (iOldSel > 0) {
-          lpDatesInfo = (FWL_DATEINFO*)m_pOwner->m_arrDates.GetAt(iOldSel - 1);
-          rtInvalidate.Union(lpDatesInfo->rect);
-        }
-        m_pOwner->AddSelDay(iCurSel);
-        CFWL_EvtClick wmClick;
-        wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
-        m_pOwner->DispatchEvent(&wmClick);
-        CFWL_EventMcdDateChanged wmDateSelected;
-        wmDateSelected.m_iStartDay = iCurSel;
-        wmDateSelected.m_iEndDay = iCurSel;
-        wmDateSelected.m_iOldMonth = m_pOwner->m_iCurMonth;
-        wmDateSelected.m_iOldYear = m_pOwner->m_iCurYear;
-        wmDateSelected.m_pSrcTarget = m_pOwner->m_pInterface;
-        m_pOwner->DispatchEvent(&wmDateSelected);
-        m_pOwner->Repaint(&rtInvalidate);
-      }
-    }
-  }
-}
-void CFWL_MonthCalendarImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
-  } else if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iDay = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    if (iDay != -1) {
-      m_pOwner->AddSelDay(iDay);
-    }
-  }
-}
-void CFWL_MonthCalendarImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
-    return;
-  }
-  FX_BOOL bRepaint = FALSE;
-  CFX_RectF rtInvalidate;
-  rtInvalidate.Set(0, 0, 0, 0);
-  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    bRepaint = m_pOwner->m_iHovered != iHover;
-    if (bRepaint) {
-      if (m_pOwner->m_iHovered > 0) {
-        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-      }
-      if (iHover > 0) {
-        CFX_RectF rtDay;
-        m_pOwner->GetDayRect(iHover, rtDay);
-        if (rtInvalidate.IsEmpty()) {
-          rtInvalidate = rtDay;
-        } else {
-          rtInvalidate.Union(rtDay);
-        }
-      }
-    }
-    m_pOwner->m_iHovered = iHover;
-  } else {
-    bRepaint = m_pOwner->m_iHovered > 0;
-    if (bRepaint) {
-      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    }
-    m_pOwner->m_iHovered = -1;
-  }
-  if (bRepaint && !rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-void CFWL_MonthCalendarImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_iHovered > 0) {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, 0, 0);
-    m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    m_pOwner->m_iHovered = -1;
-    if (!rtInvalidate.IsEmpty()) {
-      m_pOwner->Repaint(&rtInvalidate);
-    }
-  }
-}
diff --git a/xfa/src/fwl/basewidget/fwl_monthcalendarimp.h b/xfa/src/fwl/basewidget/fwl_monthcalendarimp.h
deleted file mode 100644
index b2a21dc..0000000
--- a/xfa/src/fwl/basewidget/fwl_monthcalendarimp.h
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
-
-#include "xfa/src/fgas/localization/fgas_datetime.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_MonthCalendarImpDelegate;
-
-extern uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth);
-
-class CFWL_MonthCalendarImp : public CFWL_WidgetImp {
- public:
-  CFWL_MonthCalendarImp(const CFWL_WidgetImpProperties& properties,
-                        IFWL_Widget* pOuter);
-  ~CFWL_MonthCalendarImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual int32_t CountSelect();
-  virtual FX_BOOL GetSelect(int32_t& iYear,
-                            int32_t& iMonth,
-                            int32_t& iDay,
-                            int32_t nIndex = 0);
-  virtual FX_BOOL SetSelect(int32_t iYear, int32_t iMonth, int32_t iDay);
-
- protected:
-  struct DATE {
-    DATE() : iYear(0), iMonth(0), iDay(0) {}
-    DATE(int32_t year, int32_t month, int32_t day)
-        : iYear(year), iMonth(month), iDay(day) {}
-    FX_BOOL operator<(const DATE& right) {
-      if (iYear < right.iYear) {
-        return TRUE;
-      } else if (iYear == right.iYear) {
-        if (iMonth < right.iMonth) {
-          return TRUE;
-        } else if (iMonth == right.iMonth) {
-          return iDay < right.iDay;
-        }
-      }
-      return FALSE;
-    }
-    FX_BOOL operator>(const DATE& right) {
-      if (iYear > right.iYear) {
-        return TRUE;
-      } else if (iYear == right.iYear) {
-        if (iMonth > right.iMonth) {
-          return TRUE;
-        } else if (iMonth == right.iMonth) {
-          return iDay > right.iDay;
-        }
-      }
-      return FALSE;
-    }
-    int32_t iYear;
-    int32_t iMonth;
-    int32_t iDay;
-  };
-
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
-  void DrawHeadBK(CFX_Graphics* pGraphics,
-                  IFWL_ThemeProvider* pTheme,
-                  const CFX_Matrix* pMatrix);
-  void DrawLButton(CFX_Graphics* pGraphics,
-                   IFWL_ThemeProvider* pTheme,
-                   const CFX_Matrix* pMatrix);
-  void DrawRButton(CFX_Graphics* pGraphics,
-                   IFWL_ThemeProvider* pTheme,
-                   const CFX_Matrix* pMatrix);
-  void DrawCaption(CFX_Graphics* pGraphics,
-                   IFWL_ThemeProvider* pTheme,
-                   const CFX_Matrix* pMatrix);
-  void DrawSeperator(CFX_Graphics* pGraphics,
-                     IFWL_ThemeProvider* pTheme,
-                     const CFX_Matrix* pMatrix);
-  void DrawDatesInBK(CFX_Graphics* pGraphics,
-                     IFWL_ThemeProvider* pTheme,
-                     const CFX_Matrix* pMatrix);
-  void DrawWeek(CFX_Graphics* pGraphics,
-                IFWL_ThemeProvider* pTheme,
-                const CFX_Matrix* pMatrix);
-  void DrawWeekNumber(CFX_Graphics* pGraphics,
-                      IFWL_ThemeProvider* pTheme,
-                      const CFX_Matrix* pMatrix);
-  void DrawWeekNumberSep(CFX_Graphics* pGraphics,
-                         IFWL_ThemeProvider* pTheme,
-                         const CFX_Matrix* pMatrix);
-  void DrawToday(CFX_Graphics* pGraphics,
-                 IFWL_ThemeProvider* pTheme,
-                 const CFX_Matrix* pMatrix);
-  void DrawDatesIn(CFX_Graphics* pGraphics,
-                   IFWL_ThemeProvider* pTheme,
-                   const CFX_Matrix* pMatrix);
-  void DrawDatesOut(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
-  void DrawDatesInCircle(CFX_Graphics* pGraphics,
-                         IFWL_ThemeProvider* pTheme,
-                         const CFX_Matrix* pMatrix);
-  void DrawTodayCircle(CFX_Graphics* pGraphics,
-                       IFWL_ThemeProvider* pTheme,
-                       const CFX_Matrix* pMatrix);
-  CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE);
-  void LayOut();
-  void CalcHeadSize();
-  void CalcTodaySize();
-  void CalDateItem();
-  void GetCapValue();
-  int32_t CalWeekNumber(int32_t iYear, int32_t iMonth, int32_t iDay);
-  FX_BOOL GetMinDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
-  FX_BOOL SetMinDate(int32_t iYear, int32_t iMonth, int32_t iDay);
-  FX_BOOL GetMaxDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
-  FX_BOOL SetMaxDate(int32_t iYear, int32_t iMonth, int32_t iDay);
-  FX_BOOL InitDate();
-  void ClearDateItem();
-  void ReSetDateItem();
-  FX_BOOL NextMonth();
-  FX_BOOL PrevMonth();
-  void ChangeToMonth(int32_t iYear, int32_t iMonth);
-  FX_BOOL RemoveSelDay(int32_t iDay, FX_BOOL bAll = FALSE);
-  FX_BOOL AddSelDay(int32_t iDay);
-  FX_BOOL JumpToToday();
-  void GetHeadText(int32_t iYear, int32_t iMonth, CFX_WideString& wsHead);
-  void GetTodayText(int32_t iYear,
-                    int32_t iMonth,
-                    int32_t iDay,
-                    CFX_WideString& wsToday);
-  int32_t GetDayAtPoint(FX_FLOAT x, FX_FLOAT y);
-  FX_BOOL GetDayRect(int32_t iDay, CFX_RectF& rtDay);
-
-  FX_BOOL m_bInit;
-  CFX_RectF m_rtHead;
-  CFX_RectF m_rtWeek;
-  CFX_RectF m_rtLBtn;
-  CFX_RectF m_rtRBtn;
-  CFX_RectF m_rtDates;
-  CFX_RectF m_rtHSep;
-  CFX_RectF m_rtHeadText;
-  CFX_RectF m_rtToday;
-  CFX_RectF m_rtTodayFlag;
-  CFX_RectF m_rtWeekNum;
-  CFX_RectF m_rtWeekNumSep;
-  CFX_RectF m_rtTemp;
-  CFX_WideString m_wsHead;
-  CFX_WideString m_wsToday;
-  CFX_DateTime* m_pDateTime;
-  CFX_PtrArray m_arrDates;
-  int32_t m_iCurYear;
-  int32_t m_iCurMonth;
-  int32_t m_iYear;
-  int32_t m_iMonth;
-  int32_t m_iDay;
-  int32_t m_iHovered;
-  int32_t m_iLBtnPartStates;
-  int32_t m_iRBtnPartStates;
-  DATE m_dtMin;
-  DATE m_dtMax;
-  CFX_SizeF m_szHead;
-  CFX_SizeF m_szCell;
-  CFX_SizeF m_szToday;
-  CFX_ArrayTemplate<int32_t> m_arrSelDays;
-  int32_t m_iMaxSel;
-  CFX_RectF m_rtClient;
-  FX_FLOAT m_fHeadWid;
-  FX_FLOAT m_fHeadHei;
-  FX_FLOAT m_fHeadBtnWid;
-  FX_FLOAT m_fHeadBtnHei;
-  FX_FLOAT m_fHeadBtnHMargin;
-  FX_FLOAT m_fHeadBtnVMargin;
-  FX_FLOAT m_fHeadTextWid;
-  FX_FLOAT m_fHeadTextHei;
-  FX_FLOAT m_fHeadTextHMargin;
-  FX_FLOAT m_fHeadTextVMargin;
-  FX_FLOAT m_fHSepWid;
-  FX_FLOAT m_fHSepHei;
-  FX_FLOAT m_fWeekNumWid;
-  FX_FLOAT m_fSepDOffset;
-  FX_FLOAT m_fSepX;
-  FX_FLOAT m_fSepY;
-  FX_FLOAT m_fWeekNumHeigh;
-  FX_FLOAT m_fWeekWid;
-  FX_FLOAT m_fWeekHei;
-  FX_FLOAT m_fDateCellWid;
-  FX_FLOAT m_fDateCellHei;
-  FX_FLOAT m_fTodayWid;
-  FX_FLOAT m_fTodayHei;
-  FX_FLOAT m_fTodayFlagWid;
-  FX_FLOAT m_fMCWid;
-  FX_FLOAT m_fMCHei;
-  friend class CFWL_MonthCalendarImpDelegate;
-};
-
-struct FWL_DATEINFO {
-  FWL_DATEINFO(int32_t day,
-               int32_t dayofweek,
-               FX_DWORD dwSt,
-               CFX_RectF rc,
-               CFX_WideString& wsday)
-      : iDay(day),
-        iDayOfWeek(dayofweek),
-        dwStates(dwSt),
-        rect(rc),
-        wsDay(wsday) {}
-  int32_t iDay;
-  int32_t iDayOfWeek;
-  FX_DWORD dwStates;
-  CFX_RectF rect;
-  CFX_WideString wsDay;
-};
-
-class CFWL_MonthCalendarImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_MonthCalendarImpDelegate(CFWL_MonthCalendarImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnActivate(CFWL_Message* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  CFWL_MonthCalendarImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_pictureboximp.cpp b/xfa/src/fwl/basewidget/fwl_pictureboximp.cpp
deleted file mode 100644
index d0efaf3..0000000
--- a/xfa/src/fwl/basewidget/fwl_pictureboximp.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_pictureboximp.h"
-
-#include "xfa/include/fwl/lightwidget/picturebox.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_PictureBox* IFWL_PictureBox::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_PictureBox* pPictureBox = new IFWL_PictureBox;
-  CFWL_PictureBoxImp* pPictureBoxImpl =
-      new CFWL_PictureBoxImp(properties, pOuter);
-  pPictureBox->SetImpl(pPictureBoxImpl);
-  pPictureBoxImpl->SetInterface(pPictureBox);
-  return pPictureBox;
-}
-IFWL_PictureBox::IFWL_PictureBox() {}
-
-CFWL_PictureBoxImp::CFWL_PictureBoxImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_bTop(FALSE),
-      m_bVCenter(FALSE),
-      m_bButton(FALSE) {
-  m_rtClient.Reset();
-  m_rtImage.Reset();
-  m_matrix.SetIdentity();
-}
-CFWL_PictureBoxImp::~CFWL_PictureBoxImp() {}
-FWL_ERR CFWL_PictureBoxImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_PictureBox;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_PictureBoxImp::GetClassID() const {
-  return FWL_CLASSHASH_PictureBox;
-}
-FWL_ERR CFWL_PictureBoxImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_PictureBoxImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PictureBoxImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_PictureBoxImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pDataProvider)
-      return FWL_ERR_Indefinite;
-    CFX_DIBitmap* pBitmap =
-        static_cast<IFWL_PictureBoxDP*>(m_pProperties->m_pDataProvider)
-            ->GetPicture(m_pInterface);
-    if (pBitmap) {
-      rect.Set(0, 0, (FX_FLOAT)pBitmap->GetWidth(),
-               (FX_FLOAT)pBitmap->GetHeight());
-    }
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PictureBoxImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Succeeded;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  GetClientRect(m_rtClient);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PictureBoxImp::DrawWidget(CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_PTB_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_PTB_Edge, pTheme, pMatrix);
-  }
-  DrawBkground(pGraphics, pTheme, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_PictureBoxImp::DrawBkground(CFX_Graphics* pGraphics,
-                                      IFWL_ThemeProvider* pTheme,
-                                      const CFX_Matrix* pMatrix) {
-  IFWL_PictureBoxDP* pPictureDP =
-      static_cast<IFWL_PictureBoxDP*>(m_pProperties->m_pDataProvider);
-  if (!pPictureDP)
-    return;
-
-  CFX_DIBitmap* pPicture = pPictureDP->GetPicture(m_pInterface);
-  CFX_Matrix matrix;
-  pPictureDP->GetMatrix(m_pInterface, matrix);
-  if (!pPicture)
-    return;
-
-  matrix.Concat(*pMatrix);
-  FX_FLOAT fx = (FX_FLOAT)pPicture->GetWidth();
-  FX_FLOAT fy = (FX_FLOAT)pPicture->GetHeight();
-  if (fx > m_rtClient.width) {
-    fx = m_rtClient.width;
-  }
-  if (fy > m_rtClient.height) {
-    fy = m_rtClient.height;
-  }
-  pGraphics->DrawImage(pPicture, CFX_PointF((m_rtClient.width - fx) / 2,
-                                            (m_rtClient.height - fy) / 2),
-                       &matrix);
-}
-FX_BOOL CFWL_PictureBoxImp::VStyle(FX_BOOL dwStyle) {
-  switch (dwStyle & FWL_STYLEEXT_PTB_VAlignMask) {
-    case FWL_STYLEEXT_PTB_Top: {
-      return m_bTop = TRUE;
-      break;
-    }
-    case FWL_STYLEEXT_PTB_Vcenter: {
-      return m_bVCenter = TRUE;
-      break;
-    }
-    case FWL_STYLEEXT_PTB_Bottom: {
-      return m_bButton = TRUE;
-      break;
-    }
-  }
-  return FALSE;
-}
-CFWL_PictureBoxImpDelegate::CFWL_PictureBoxImpDelegate(
-    CFWL_PictureBoxImp* pOwner)
-    : m_pOwner(pOwner) {}
-FWL_ERR CFWL_PictureBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                 const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_pictureboximp.h b/xfa/src/fwl/basewidget/fwl_pictureboximp.h
deleted file mode 100644
index cfa50af..0000000
--- a/xfa/src/fwl/basewidget/fwl_pictureboximp.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_PictureBoxImpDelegate;
-
-class CFWL_PictureBoxImp : public CFWL_WidgetImp {
- public:
-  CFWL_PictureBoxImp(const CFWL_WidgetImpProperties& properties,
-                     IFWL_Widget* pOuter);
-  ~CFWL_PictureBoxImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix = NULL);
-  FX_BOOL VStyle(FX_BOOL dwStyle);
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtImage;
-  CFX_Matrix m_matrix;
-  FX_BOOL m_bTop;
-  FX_BOOL m_bVCenter;
-  FX_BOOL m_bButton;
-  friend class CFWL_PictureBoxImpDelegate;
-};
-class CFWL_PictureBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_PictureBoxImpDelegate(CFWL_PictureBoxImp* pOwner);
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  CFWL_PictureBoxImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_PICTUREBOXIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_pushbuttonimp.cpp b/xfa/src/fwl/basewidget/fwl_pushbuttonimp.cpp
deleted file mode 100644
index 4ed0e3b..0000000
--- a/xfa/src/fwl/basewidget/fwl_pushbuttonimp.cpp
+++ /dev/null
@@ -1,550 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_pushbuttonimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_pushbutton.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_PushButton* IFWL_PushButton::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_PushButton* pPushButton = new IFWL_PushButton;
-  CFWL_PushButtonImp* pPushButtonImpl =
-      new CFWL_PushButtonImp(properties, pOuter);
-  pPushButton->SetImpl(pPushButtonImpl);
-  pPushButtonImpl->SetInterface(pPushButton);
-  return pPushButton;
-}
-IFWL_PushButton::IFWL_PushButton() {}
-
-CFWL_PushButtonImp::CFWL_PushButtonImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_bBtnDown(FALSE),
-      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
-      m_iTTOAlign(FDE_TTOALIGNMENT_Center) {
-  m_rtClient.Set(0, 0, 0, 0);
-  m_rtCaption.Set(0, 0, 0, 0);
-}
-CFWL_PushButtonImp::~CFWL_PushButtonImp() {}
-FWL_ERR CFWL_PushButtonImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_PushButton;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_PushButtonImp::GetClassID() const {
-  return FWL_CLASSHASH_PushButton;
-}
-FWL_ERR CFWL_PushButtonImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_PushButtonImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PushButtonImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_PushButtonImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (m_pProperties->m_pThemeProvider == NULL) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_WideString wsCaption;
-    IFWL_PushButtonDP* pData =
-        static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
-    if (pData) {
-      pData->GetCaption(m_pInterface, wsCaption);
-    }
-    int32_t iLen = wsCaption.GetLength();
-    if (iLen > 0) {
-      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
-      rect.Set(0, 0, sz.x, sz.y);
-    }
-    FX_FLOAT* fcaption =
-        static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin));
-    rect.Inflate(*fcaption, *fcaption);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PushButtonImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  if ((dwStates & FWL_WGTSTATE_Disabled) && bSet) {
-    m_pProperties->m_dwStates = FWL_WGTSTATE_Disabled;
-    return FWL_ERR_Succeeded;
-  }
-  return CFWL_WidgetImp::SetStates(dwStates, bSet);
-}
-FWL_ERR CFWL_PushButtonImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  UpdateTextOutStyles();
-  GetClientRect(m_rtClient);
-  m_rtCaption = m_rtClient;
-  FX_FLOAT* fcaption =
-      static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_PSB_Margin));
-  m_rtCaption.Inflate(-*fcaption, -*fcaption);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PushButtonImp::DrawWidget(CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_PushButtonDP* pData =
-      static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
-  CFX_DIBitmap* pPicture = NULL;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_PSB_Border, m_pProperties->m_pThemeProvider,
-               pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_PSB_Edge, m_pProperties->m_pThemeProvider,
-             pMatrix);
-  }
-  DrawBkground(pGraphics, m_pProperties->m_pThemeProvider, pMatrix);
-  CFX_Matrix matrix;
-  matrix.Concat(*pMatrix);
-  FX_FLOAT iPicwidth = 0;
-  FX_FLOAT ipicheight = 0;
-  CFX_WideString wsCaption;
-  if (pData) {
-    pData->GetCaption(m_pInterface, wsCaption);
-  }
-  CFX_RectF rtText;
-  rtText.Set(0, 0, 0, 0);
-  if (!wsCaption.IsEmpty()) {
-    CalcTextRect(wsCaption, pTheme, 0, m_iTTOAlign, rtText);
-  }
-  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_PSB_ModeMask) {
-    case FWL_STYLEEXT_PSB_TextOnly:
-      DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix);
-      break;
-    case FWL_STYLEEXT_PSB_IconOnly:
-      if (pData) {
-        pPicture = pData->GetPicture(m_pInterface);
-      }
-      if (pPicture) {
-        CFX_PointF point;
-        switch (m_iTTOAlign) {
-          case 0: {
-            point.x = m_rtClient.left;
-            point.y = m_rtClient.top;
-            break;
-          }
-          case 1: {
-            point.x = m_rtClient.left +
-                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
-            point.y = m_rtClient.top;
-            break;
-          }
-          case 2:
-            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
-            point.y = m_rtClient.top;
-            break;
-          case 4:
-            point.x = m_rtClient.left;
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            break;
-          case 5:
-            point.x = m_rtClient.left +
-                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            break;
-          case 6:
-            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            break;
-          case 8:
-            point.x = m_rtClient.left;
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            break;
-          case 9:
-            point.x = m_rtClient.left +
-                      (m_rtClient.width / 2 - pPicture->GetWidth() / 2);
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            break;
-          case 10:
-            point.x = m_rtClient.left + m_rtClient.width - pPicture->GetWidth();
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            break;
-        }
-        pGraphics->DrawImage(pPicture, point, &matrix);
-      }
-      break;
-    case FWL_STYLEEXT_PSB_TextIcon:
-      if (pPicture) {
-        CFX_PointF point;
-        switch (m_iTTOAlign) {
-          case 0: {
-            point.x = m_rtClient.left;
-            point.y = m_rtClient.top;
-            iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7);
-            ipicheight =
-                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
-            break;
-          }
-          case 1: {
-            point.x =
-                m_rtClient.left + (m_rtClient.width / 2 -
-                                   (pPicture->GetWidth() + rtText.width) / 2);
-            point.y = m_rtClient.top;
-            iPicwidth = pPicture->GetWidth() -
-                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
-                        rtText.width / 2 - 7;
-            ipicheight =
-                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
-            break;
-          }
-          case 2:
-            point.x = m_rtClient.left + m_rtClient.width -
-                      pPicture->GetWidth() - rtText.width;
-            point.y = m_rtClient.top;
-            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
-                        pPicture->GetWidth() - rtText.width + 7;
-            ipicheight =
-                pPicture->GetHeight() / 2 - m_rtCaption.top - rtText.height / 2;
-            break;
-          case 4:
-            point.x = m_rtClient.left;
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            iPicwidth = m_rtClient.left + pPicture->GetWidth() - 7;
-            break;
-          case 5:
-            point.x =
-                m_rtClient.left + (m_rtClient.width / 2 -
-                                   (pPicture->GetWidth() + rtText.width) / 2);
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            iPicwidth = pPicture->GetWidth() -
-                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
-                        rtText.width / 2 - 7;
-            break;
-          case 6:
-            point.x = m_rtClient.left + m_rtClient.width -
-                      pPicture->GetWidth() - rtText.width;
-            point.y = m_rtClient.top + m_rtClient.height / 2 -
-                      pPicture->GetHeight() / 2;
-            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
-                        pPicture->GetWidth() - rtText.width + 7;
-            break;
-          case 8:
-            point.x = m_rtClient.left;
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            iPicwidth = (FX_FLOAT)(pPicture->GetWidth() - 7);
-            ipicheight -= rtText.height / 2;
-            break;
-          case 9:
-            point.x =
-                m_rtClient.left + (m_rtClient.width / 2 -
-                                   (pPicture->GetWidth() + rtText.width) / 2);
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            iPicwidth = pPicture->GetWidth() -
-                        ((m_rtClient.width) / 2 - rtText.width / 2 - point.x) +
-                        rtText.width / 2 - 7;
-            ipicheight -= rtText.height / 2;
-            break;
-          case 10:
-            point.x = m_rtClient.left + m_rtClient.width -
-                      pPicture->GetWidth() - rtText.width;
-            point.y =
-                m_rtClient.top + m_rtClient.height - pPicture->GetHeight();
-            iPicwidth = m_rtClient.left + m_rtClient.width - point.x -
-                        pPicture->GetWidth() - rtText.width + 7;
-            ipicheight -= rtText.height / 2;
-            break;
-        }
-        pGraphics->DrawImage(pPicture, point, &matrix);
-      }
-      matrix.e += m_rtClient.left + iPicwidth;
-      matrix.f += m_rtClient.top + ipicheight;
-      DrawText(pGraphics, m_pProperties->m_pThemeProvider, &matrix);
-      break;
-  }
-  return FWL_ERR_Succeeded;
-}
-void CFWL_PushButtonImp::DrawBkground(CFX_Graphics* pGraphics,
-                                      IFWL_ThemeProvider* pTheme,
-                                      const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_PSB_Background;
-  param.m_dwStates = GetPartStates();
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  param.m_rtPart = m_rtClient;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    param.m_pData = &m_rtCaption;
-  }
-  pTheme->DrawBackground(&param);
-}
-void CFWL_PushButtonImp::DrawText(CFX_Graphics* pGraphics,
-                                  IFWL_ThemeProvider* pTheme,
-                                  const CFX_Matrix* pMatrix) {
-  if (!m_pProperties->m_pDataProvider)
-    return;
-  CFX_WideString wsCaption;
-  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
-  if (wsCaption.IsEmpty()) {
-    return;
-  }
-  CFWL_ThemeText param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_PSB_Caption;
-  param.m_dwStates = GetPartStates();
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  param.m_rtPart = m_rtCaption;
-  param.m_wsText = wsCaption;
-  param.m_dwTTOStyles = m_dwTTOStyles;
-  param.m_iTTOAlign = m_iTTOAlign;
-  pTheme->DrawText(&param);
-}
-FX_DWORD CFWL_PushButtonImp::GetPartStates() {
-  FX_DWORD dwStates = FWL_PARTSTATE_PSB_Normal;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    dwStates |= FWL_PARTSTATE_PSB_Focused;
-  }
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
-    dwStates = FWL_PARTSTATE_PSB_Disabled;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
-    dwStates |= FWL_PARTSTATE_PSB_Pressed;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
-    dwStates |= FWL_PARTSTATE_PSB_Hovered;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Default) {
-    dwStates |= FWL_PARTSTATE_PSB_Default;
-  }
-  return dwStates;
-}
-void CFWL_PushButtonImp::UpdateTextOutStyles() {
-  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  switch (m_pProperties->m_dwStyleExes &
-          (FWL_STYLEEXT_PSB_HLayoutMask | FWL_STYLEEXT_PSB_VLayoutMask)) {
-    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopCenter;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Top: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_TopRight;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomLeft;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomCenter;
-      break;
-    }
-    case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_Bottom: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight;
-      break;
-    }
-    default: {}
-  }
-  m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
-    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
-}
-CFWL_PushButtonImpDelegate::CFWL_PushButtonImpDelegate(
-    CFWL_PushButtonImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_PushButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  if (!m_pOwner->IsEnabled()) {
-    return 1;
-  }
-  int32_t iRet = 1;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
-      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
-        OnKeyDown(pKey);
-      }
-      break;
-    }
-    default: {
-      iRet = 0;
-      break;
-    }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_PushButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PushButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                 const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_PushButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_PushButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  m_pOwner->m_bBtnDown = TRUE;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_PushButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bBtnDown = FALSE;
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-  }
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    CFWL_EvtClick wmClick;
-    wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
-    m_pOwner->DispatchEvent(&wmClick);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_PushButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  FX_BOOL bRepaint = FALSE;
-  if (m_pOwner->m_bBtnDown) {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) == 0) {
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
-        bRepaint = TRUE;
-      }
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
-        bRepaint = TRUE;
-      }
-    } else {
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-        bRepaint = TRUE;
-      }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-        bRepaint = TRUE;
-      }
-    }
-  } else {
-    if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      return;
-    }
-    if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-      bRepaint = TRUE;
-    }
-  }
-  if (bRepaint) {
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
-}
-void CFWL_PushButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bBtnDown = FALSE;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_PushButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (pMsg->m_dwKeyCode == FWL_VKEY_Return) {
-    CFWL_EvtMouse wmMouse;
-    wmMouse.m_pSrcTarget = m_pOwner->m_pInterface;
-    wmMouse.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
-    m_pOwner->DispatchEvent(&wmMouse);
-    CFWL_EvtClick wmClick;
-    wmClick.m_pSrcTarget = m_pOwner->m_pInterface;
-    m_pOwner->DispatchEvent(&wmClick);
-    return;
-  }
-  if (pMsg->m_dwKeyCode != FWL_VKEY_Tab) {
-    return;
-  }
-  m_pOwner->DispatchKeyEvent(pMsg);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_pushbuttonimp.h b/xfa/src/fwl/basewidget/fwl_pushbuttonimp.h
deleted file mode 100644
index 5869074..0000000
--- a/xfa/src/fwl/basewidget/fwl_pushbuttonimp.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_PushButtonImpDelegate;
-
-class CFWL_PushButtonImp : public CFWL_WidgetImp {
- public:
-  CFWL_PushButtonImp(const CFWL_WidgetImpProperties& properties,
-                     IFWL_Widget* pOuter);
-  virtual ~CFWL_PushButtonImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
-  void DrawText(CFX_Graphics* pGraphics,
-                IFWL_ThemeProvider* pTheme,
-                const CFX_Matrix* pMatrix);
-  FX_DWORD GetPartStates();
-  void UpdateTextOutStyles();
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtCaption;
-  FX_BOOL m_bBtnDown;
-  FX_DWORD m_dwTTOStyles;
-  int32_t m_iTTOAlign;
-  friend class CFWL_PushButtonImpDelegate;
-};
-class CFWL_PushButtonImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_PushButtonImpDelegate(CFWL_PushButtonImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  CFWL_PushButtonImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_PUSHBUTTONIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_scrollbarimp.cpp b/xfa/src/fwl/basewidget/fwl_scrollbarimp.cpp
deleted file mode 100644
index c43ebbb..0000000
--- a/xfa/src/fwl/basewidget/fwl_scrollbarimp.cpp
+++ /dev/null
@@ -1,805 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_scrollbarimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-#define FWL_SCROLLBAR_Elapse 500
-#define FWL_SCROLLBAR_MinThumb 5
-
-// static
-IFWL_ScrollBar* IFWL_ScrollBar::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_ScrollBar* pScrollBar = new IFWL_ScrollBar;
-  CFWL_ScrollBarImp* pScrollBarImpl = new CFWL_ScrollBarImp(properties, pOuter);
-  pScrollBar->SetImpl(pScrollBarImpl);
-  pScrollBarImpl->SetInterface(pScrollBar);
-  return pScrollBar;
-}
-IFWL_ScrollBar::IFWL_ScrollBar() {}
-FX_BOOL IFWL_ScrollBar::IsVertical() {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->IsVertical();
-}
-FWL_ERR IFWL_ScrollBar::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetRange(fMin, fMax);
-}
-FWL_ERR IFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetRange(fMin, fMax);
-}
-FX_FLOAT IFWL_ScrollBar::GetPageSize() {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetPageSize();
-}
-FWL_ERR IFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetPageSize(fPageSize);
-}
-FX_FLOAT IFWL_ScrollBar::GetStepSize() {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetStepSize();
-}
-FWL_ERR IFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetStepSize(fStepSize);
-}
-FX_FLOAT IFWL_ScrollBar::GetPos() {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetPos();
-}
-FWL_ERR IFWL_ScrollBar::SetPos(FX_FLOAT fPos) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetPos(fPos);
-}
-FX_FLOAT IFWL_ScrollBar::GetTrackPos() {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->GetTrackPos();
-}
-FWL_ERR IFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->SetTrackPos(fTrackPos);
-}
-FX_BOOL IFWL_ScrollBar::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
-  return static_cast<CFWL_ScrollBarImp*>(GetImpl())->DoScroll(dwCode, fPos);
-}
-CFWL_ScrollBarImp::CFWL_ScrollBarImp(const CFWL_WidgetImpProperties& properties,
-                                     IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_hTimer(nullptr),
-      m_fRangeMin(0),
-      m_fRangeMax(-1),
-      m_fPageSize(0),
-      m_fStepSize(0),
-      m_fPos(0),
-      m_fTrackPos(0),
-      m_iMinButtonState(FWL_PARTSTATE_SCB_Normal),
-      m_iMaxButtonState(FWL_PARTSTATE_SCB_Normal),
-      m_iThumbButtonState(FWL_PARTSTATE_SCB_Normal),
-      m_iMinTrackState(FWL_PARTSTATE_SCB_Normal),
-      m_iMaxTrackState(FWL_PARTSTATE_SCB_Normal),
-      m_fLastTrackPos(0),
-      m_cpTrackPointX(0),
-      m_cpTrackPointY(0),
-      m_iMouseWheel(0),
-      m_bTrackMouseLeave(FALSE),
-      m_bMouseHover(FALSE),
-      m_bMouseDown(FALSE),
-      m_bRepaintThumb(FALSE),
-      m_fButtonLen(0),
-      m_bMinSize(FALSE),
-      m_bCustomLayout(FALSE),
-      m_fMinThumb(FWL_SCROLLBAR_MinThumb) {
-  m_rtClient.Reset();
-  m_rtThumb.Reset();
-  m_rtMinBtn.Reset();
-  m_rtMaxBtn.Reset();
-  m_rtMinTrack.Reset();
-  m_rtMaxTrack.Reset();
-}
-CFWL_ScrollBarImp::~CFWL_ScrollBarImp() {}
-FWL_ERR CFWL_ScrollBarImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_ScrollBar;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ScrollBarImp::GetClassID() const {
-  return FWL_CLASSHASH_ScrollBar;
-}
-FWL_ERR CFWL_ScrollBarImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_ScrollBarImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ScrollBarImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_ScrollBarImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
-        GetThemeCapacity(FWL_WGTCAPACITY_ScrollBarWidth));
-    if (!pfMinWidth)
-      return FWL_ERR_Indefinite;
-    if (IsVertical()) {
-      rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
-    } else {
-      rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
-    }
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ScrollBarImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  Layout();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ScrollBarImp::DrawWidget(CFX_Graphics* pGraphics,
-                                      const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_SCB_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_SCB_Edge, pTheme, pMatrix);
-  }
-  DrawTrack(pGraphics, pTheme, TRUE, pMatrix);
-  DrawTrack(pGraphics, pTheme, FALSE, pMatrix);
-  DrawArrowBtn(pGraphics, pTheme, TRUE, pMatrix);
-  DrawArrowBtn(pGraphics, pTheme, FALSE, pMatrix);
-  DrawThumb(pGraphics, pTheme, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-inline FX_BOOL CFWL_ScrollBarImp::IsVertical() {
-  return m_pProperties->m_dwStyleExes & FWL_STYLEEXT_SCB_Vert;
-}
-FWL_ERR CFWL_ScrollBarImp::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
-  fMin = m_fRangeMin;
-  fMax = m_fRangeMax;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ScrollBarImp::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
-  m_fRangeMin = fMin;
-  m_fRangeMax = fMax;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_ScrollBarImp::GetPageSize() {
-  return m_fPageSize;
-}
-FWL_ERR CFWL_ScrollBarImp::SetPageSize(FX_FLOAT fPageSize) {
-  m_fPageSize = fPageSize;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_ScrollBarImp::GetStepSize() {
-  return m_fStepSize;
-}
-FWL_ERR CFWL_ScrollBarImp::SetStepSize(FX_FLOAT fStepSize) {
-  m_fStepSize = fStepSize;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_ScrollBarImp::GetPos() {
-  return m_fPos;
-}
-FWL_ERR CFWL_ScrollBarImp::SetPos(FX_FLOAT fPos) {
-  m_fPos = fPos;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_ScrollBarImp::GetTrackPos() {
-  return m_fTrackPos;
-}
-FWL_ERR CFWL_ScrollBarImp::SetTrackPos(FX_FLOAT fTrackPos) {
-  m_fTrackPos = fTrackPos;
-  CalcThumbButtonRect(m_rtThumb);
-  CalcMinTrackRect(m_rtMinTrack);
-  CalcMaxTrackRect(m_rtMaxTrack);
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_ScrollBarImp::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
-  switch (dwCode) {
-    case FWL_SCBCODE_Min:
-    case FWL_SCBCODE_Max:
-    case FWL_SCBCODE_PageBackward:
-    case FWL_SCBCODE_PageForward:
-    case FWL_SCBCODE_StepBackward:
-      break;
-    case FWL_SCBCODE_StepForward:
-      break;
-    case FWL_SCBCODE_Pos:
-    case FWL_SCBCODE_TrackPos:
-    case FWL_SCBCODE_EndScroll:
-      break;
-    default: { return FALSE; }
-  }
-  return OnScroll(dwCode, fPos);
-}
-int32_t CFWL_ScrollBarImp::Run(FWL_HTIMER hTimer) {
-  if (m_hTimer) {
-    FWL_StopTimer(m_hTimer);
-  }
-  if (!SendEvent()) {
-    m_hTimer = FWL_StartTimer(this, 0);
-  }
-  return 1;
-}
-FWL_ERR CFWL_ScrollBarImp::SetOuter(IFWL_Widget* pOuter) {
-  m_pOuter = pOuter;
-  return FWL_ERR_Succeeded;
-}
-void CFWL_ScrollBarImp::DrawTrack(CFX_Graphics* pGraphics,
-                                  IFWL_ThemeProvider* pTheme,
-                                  FX_BOOL bLower,
-                                  const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = bLower ? FWL_PART_SCB_LowerTrack : FWL_PART_SCB_UpperTrack;
-  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                         ? FWL_PARTSTATE_SCB_Disabled
-                         : (bLower ? m_iMinTrackState : m_iMaxTrackState);
-  param.m_pGraphics = pGraphics;
-  param.m_matrix.Concat(*pMatrix);
-  param.m_rtPart = bLower ? m_rtMinTrack : m_rtMaxTrack;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_ScrollBarImp::DrawArrowBtn(CFX_Graphics* pGraphics,
-                                     IFWL_ThemeProvider* pTheme,
-                                     FX_BOOL bMinBtn,
-                                     const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = bMinBtn ? FWL_PART_SCB_ForeArrow : FWL_PART_SCB_BackArrow;
-  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                         ? FWL_PARTSTATE_SCB_Disabled
-                         : (bMinBtn ? m_iMinButtonState : m_iMaxButtonState);
-  param.m_pGraphics = pGraphics;
-  param.m_matrix.Concat(*pMatrix);
-  param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn;
-  if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) {
-    pTheme->DrawBackground(&param);
-  }
-}
-void CFWL_ScrollBarImp::DrawThumb(CFX_Graphics* pGraphics,
-                                  IFWL_ThemeProvider* pTheme,
-                                  const CFX_Matrix* pMatrix) {
-  if (!IsEnabled()) {
-  }
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_SCB_Thumb;
-  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                         ? FWL_PARTSTATE_SCB_Disabled
-                         : m_iThumbButtonState;
-  param.m_pGraphics = pGraphics;
-  param.m_matrix.Concat(*pMatrix);
-  param.m_rtPart = m_rtThumb;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_ScrollBarImp::Layout() {
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  CFWL_ThemePart part;
-  part.m_pWidget = m_pInterface;
-  m_fMinThumb = *static_cast<FX_FLOAT*>(
-      pTheme->GetCapacity(&part, FWL_CAPACITY_SCB_Size));
-  m_bCustomLayout = pTheme->IsCustomizedLayout(m_pInterface);
-  GetClientRect(m_rtClient);
-  CalcButtonLen();
-  CalcMinButtonRect(m_rtMinBtn);
-  CalcMaxButtonRect(m_rtMaxBtn);
-  CalcThumbButtonRect(m_rtThumb);
-  CalcMinTrackRect(m_rtMinTrack);
-  CalcMaxTrackRect(m_rtMaxTrack);
-}
-void CFWL_ScrollBarImp::CalcButtonLen() {
-  m_fButtonLen = IsVertical() ? m_rtClient.width : m_rtClient.height;
-  FX_FLOAT fLength = IsVertical() ? m_rtClient.height : m_rtClient.width;
-  if (fLength < m_fButtonLen * 2) {
-    m_fButtonLen = fLength / 2;
-    m_bMinSize = TRUE;
-  } else {
-    m_bMinSize = FALSE;
-  }
-}
-void CFWL_ScrollBarImp::CalcMinButtonRect(CFX_RectF& rect) {
-  if (m_bCustomLayout) {
-    IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-    CFWL_ThemePart pPart;
-    pPart.m_rtPart = m_rtMinBtn;
-    pPart.m_pWidget = m_pInterface;
-    pPart.m_iPart = FWL_PART_SCB_ForeArrow;
-    pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                           ? FWL_PARTSTATE_SCB_Disabled
-                           : m_iMinButtonState;
-    pTheme->GetPartRect(&pPart, rect);
-  } else {
-    rect.left = m_rtClient.left;
-    rect.top = m_rtClient.top;
-    rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen;
-    rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height;
-  }
-}
-void CFWL_ScrollBarImp::CalcMaxButtonRect(CFX_RectF& rect) {
-  if (m_bCustomLayout) {
-    IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-    CFWL_ThemePart pPart;
-    pPart.m_rtPart = m_rtMaxBtn;
-    pPart.m_pWidget = m_pInterface;
-    pPart.m_iPart = FWL_PART_SCB_BackArrow;
-    pPart.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
-                           ? FWL_PARTSTATE_SCB_Disabled
-                           : m_iMaxButtonState;
-    pTheme->GetPartRect(&pPart, rect);
-  } else {
-    rect.left =
-        IsVertical() ? m_rtClient.left : m_rtClient.right() - m_fButtonLen;
-    rect.top =
-        IsVertical() ? m_rtClient.bottom() - m_fButtonLen : m_rtClient.top;
-    rect.width = IsVertical() ? m_rtClient.width : m_fButtonLen;
-    rect.height = IsVertical() ? m_fButtonLen : m_rtClient.height;
-  }
-}
-void CFWL_ScrollBarImp::CalcThumbButtonRect(CFX_RectF& rect) {
-  if (!IsEnabled()) {
-    m_rtThumb.Reset();
-    return;
-  }
-  if (m_bMinSize) {
-    m_rtThumb.Empty();
-    return;
-  }
-  FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
-  memset(&rect, 0, sizeof(CFX_Rect));
-  if (fRange < 0) {
-    if (IsVertical()) {
-      rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0);
-    } else {
-      rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height);
-    }
-    return;
-  }
-  CFX_RectF rtClient = m_rtClient;
-  FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width;
-  FX_FLOAT fSize = m_fButtonLen;
-  if (m_bCustomLayout) {
-    if (IsVertical()) {
-      fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height;
-      if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) {
-        fLength = 0.0f;
-      }
-    } else {
-      fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width;
-      if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) {
-        fLength = 0.0f;
-      }
-    }
-  } else {
-    fLength -= fSize * 2.0f;
-    if (fLength < fSize) {
-      fLength = 0.0f;
-    }
-  }
-  FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength);
-  if (fThumbSize < m_fMinThumb) {
-    fThumbSize = m_fMinThumb;
-  }
-  FX_FLOAT fDiff = fLength - fThumbSize;
-  if (fDiff < 0.0f) {
-    fDiff = 0.0f;
-  }
-  FX_FLOAT fTrackPos = m_fTrackPos;
-  if (fTrackPos > m_fRangeMax) {
-    fTrackPos = m_fRangeMax;
-  }
-  if (fTrackPos < m_fRangeMin) {
-    fTrackPos = m_fRangeMin;
-  }
-  if (!fRange)
-    return;
-  if (m_bCustomLayout) {
-    FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange;
-    rect.left = rtClient.left;
-    if (!IsVertical()) {
-      if ((m_rtMinBtn.right() == m_rtMaxBtn.left && m_rtMinBtn.width > 0 &&
-           m_rtMaxBtn.width > 0) ||
-          (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width)) {
-        rect.left += iPos;
-      } else {
-        rect.left += m_rtMinBtn.right() + iPos;
-      }
-    }
-    rect.top = rtClient.top;
-    if (IsVertical()) {
-      if ((m_rtMinBtn.bottom() == m_rtMaxBtn.top && m_rtMinBtn.height > 0 &&
-           m_rtMaxBtn.height > 0) ||
-          (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height)) {
-        rect.top += iPos;
-      } else {
-        rect.top += m_rtMinBtn.bottom() + iPos;
-      }
-    }
-    rect.width = IsVertical() ? rtClient.width : fThumbSize;
-    rect.height = IsVertical() ? fThumbSize : rtClient.height;
-  } else {
-    FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
-    rect.left = rtClient.left;
-    if (!IsVertical()) {
-      rect.left += iPos;
-    }
-    rect.top = rtClient.top;
-    if (IsVertical()) {
-      rect.top += iPos;
-    }
-    rect.width = IsVertical() ? rtClient.width : fThumbSize;
-    rect.height = IsVertical() ? fThumbSize : rtClient.height;
-  }
-}
-void CFWL_ScrollBarImp::CalcMinTrackRect(CFX_RectF& rect) {
-  if (m_bMinSize) {
-    rect.Empty();
-    return;
-  }
-  FX_FLOAT fBottom = m_rtThumb.bottom();
-  FX_FLOAT fRight = m_rtThumb.right();
-  FX_FLOAT ix = (m_rtThumb.left + fRight) / 2;
-  FX_FLOAT iy = (m_rtThumb.top + fBottom) / 2;
-  rect.left = m_rtClient.left;
-  rect.top = m_rtClient.top;
-  FX_BOOL bVertical = IsVertical();
-  rect.width = bVertical ? m_rtClient.width : ix;
-  rect.height = bVertical ? iy : m_rtClient.height;
-  if (m_bCustomLayout) {
-    if (bVertical) {
-      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
-        rect.top = m_rtClient.top;
-      } else if (m_rtMinBtn.top < m_rtThumb.top) {
-        rect.top = m_rtMinBtn.bottom();
-        rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
-      }
-    } else {
-      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
-        rect.left = m_rtClient.left;
-      } else if (m_rtMinBtn.left < m_rtThumb.left) {
-        rect.left = m_rtMinBtn.right();
-        rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
-      }
-    }
-  }
-}
-void CFWL_ScrollBarImp::CalcMaxTrackRect(CFX_RectF& rect) {
-  if (m_bMinSize) {
-    rect.Empty();
-    return;
-  }
-  FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2;
-  FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
-  FX_BOOL bVertical = IsVertical();
-  rect.left = bVertical ? m_rtClient.left : ix;
-  rect.top = bVertical ? iy : m_rtClient.top;
-  rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix;
-  rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height;
-  if (m_bCustomLayout) {
-    if (bVertical) {
-      if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
-          m_rtMaxBtn.height > 0) {
-        rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
-      } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
-        rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
-      }
-    } else {
-      if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
-          m_rtMaxBtn.width > 0) {
-        rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
-      } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
-        rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
-      }
-    }
-  }
-}
-FX_FLOAT CFWL_ScrollBarImp::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) {
-  FX_FLOAT fDiffX = fx - m_cpTrackPointX;
-  FX_FLOAT fDiffY = fy - m_cpTrackPointY;
-  FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
-  FX_FLOAT fPos;
-  if (m_bCustomLayout) {
-    if (IsVertical()) {
-      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
-        fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height);
-      } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) {
-        fPos = fRange * fDiffY /
-               (m_rtMinBtn.top - m_rtClient.top - m_rtThumb.height);
-      } else {
-        fPos = fRange * fDiffY /
-               (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
-      }
-    } else {
-      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
-        fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width);
-      } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) {
-        fPos = fRange * fDiffX /
-               (m_rtMinBtn.left - m_rtClient.left - m_rtThumb.width);
-      } else {
-        fPos = fRange * fDiffX /
-               (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width);
-      }
-    }
-  } else {
-    if (IsVertical()) {
-      fPos = fRange * fDiffY /
-             (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
-    } else {
-      fPos = fRange * fDiffX /
-             (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width);
-    }
-  }
-  fPos += m_fLastTrackPos;
-  if (fPos < m_fRangeMin) {
-    fPos = m_fRangeMin;
-  }
-  if (fPos > m_fRangeMax) {
-    fPos = m_fRangeMax;
-  }
-  return fPos;
-}
-void CFWL_ScrollBarImp::GetTrackRect(CFX_RectF& rect, FX_BOOL bLower) {
-  FX_BOOL bDisabled = m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled;
-  if (bDisabled || m_bCustomLayout) {
-    rect = bLower ? m_rtMinTrack : m_rtMaxTrack;
-  } else {
-    FX_FLOAT fW = m_rtThumb.width / 2;
-    FX_FLOAT fH = m_rtThumb.height / 2;
-    FX_BOOL bVert = IsVertical();
-    if (bLower) {
-      if (bVert) {
-        FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
-        fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
-        rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
-                 m_rtMinTrack.width, fMinTrackHeight);
-      } else {
-        FX_FLOAT fMinTrackWidth =
-            m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
-        fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
-        rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
-                 fMinTrackWidth, m_rtMinTrack.height);
-      }
-    } else {
-      if (bVert) {
-        FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
-        fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
-        rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
-                 fMaxTrackHeight);
-      } else {
-        FX_FLOAT fMaxTrackWidth =
-            m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
-        fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
-        rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
-                 m_rtMaxTrack.height);
-      }
-    }
-  }
-}
-FX_BOOL CFWL_ScrollBarImp::SendEvent() {
-  if (m_iMinButtonState == FWL_PARTSTATE_SCB_Pressed) {
-    DoScroll(FWL_SCBCODE_StepBackward, m_fTrackPos);
-    return FALSE;
-  }
-  if (m_iMaxButtonState == FWL_PARTSTATE_SCB_Pressed) {
-    DoScroll(FWL_SCBCODE_StepForward, m_fTrackPos);
-    return FALSE;
-  }
-  if (m_iMinTrackState == FWL_PARTSTATE_SCB_Pressed) {
-    DoScroll(FWL_SCBCODE_PageBackward, m_fTrackPos);
-    return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY);
-  }
-  if (m_iMaxTrackState == FWL_PARTSTATE_SCB_Pressed) {
-    DoScroll(FWL_SCBCODE_PageForward, m_fTrackPos);
-    return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY);
-  }
-  if (m_iMouseWheel) {
-    FX_WORD dwCode =
-        m_iMouseWheel < 0 ? FWL_SCBCODE_StepForward : FWL_SCBCODE_StepBackward;
-    DoScroll(dwCode, m_fTrackPos);
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_ScrollBarImp::OnScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
-  FX_BOOL bRet = TRUE;
-  CFWL_EvtScroll ev;
-  ev.m_iScrollCode = dwCode;
-  ev.m_pSrcTarget = m_pInterface;
-  ev.m_fPos = fPos;
-  ev.m_pRet = &bRet;
-  DispatchEvent(&ev);
-  return bRet;
-}
-CFWL_ScrollBarImpDelegate::CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_ScrollBarImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  int32_t iRet = 1;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  if (dwMsgCode == FWL_MSGHASH_Mouse) {
-    CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    FX_DWORD dwCmd = pMsg->m_dwCmd;
-    switch (dwCmd) {
-      case FWL_MSGMOUSECMD_LButtonDown: {
-        OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
-        break;
-      }
-      case FWL_MSGMOUSECMD_LButtonUp: {
-        OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
-        break;
-      }
-      case FWL_MSGMOUSECMD_MouseMove: {
-        OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
-        break;
-      }
-      case FWL_MSGMOUSECMD_MouseLeave: {
-        OnMouseLeave();
-        break;
-      }
-      default: { iRet = 0; }
-    }
-  } else if (dwMsgCode == FWL_MSGHASH_MouseWheel) {
-    CFWL_MsgMouseWheel* pMsg = static_cast<CFWL_MsgMouseWheel*>(pMessage);
-    OnMouseWheel(pMsg->m_fx, pMsg->m_fy, pMsg->m_dwFlags, pMsg->m_fDeltaX,
-                 pMsg->m_fDeltaY);
-  } else {
-    iRet = 0;
-  }
-  return iRet;
-}
-FWL_ERR CFWL_ScrollBarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_ScrollBarImpDelegate::OnLButtonDown(FX_DWORD dwFlags,
-                                              FX_FLOAT fx,
-                                              FX_FLOAT fy) {
-  if (!m_pOwner->IsEnabled()) {
-    return;
-  }
-  m_pOwner->m_bMouseDown = TRUE;
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->m_cpTrackPointX = fx;
-  m_pOwner->m_cpTrackPointY = fy;
-  m_pOwner->m_fLastTrackPos = m_pOwner->m_fTrackPos;
-  if (m_pOwner->m_rtMinBtn.Contains(fx, fy)) {
-    DoMouseDown(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  } else {
-    if (m_pOwner->m_rtThumb.Contains(fx, fy)) {
-      DoMouseDown(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx,
-                  fy);
-    } else {
-      if (m_pOwner->m_rtMaxBtn.Contains(fx, fy)) {
-        DoMouseDown(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx,
-                    fy);
-      } else {
-        if (m_pOwner->m_rtMinTrack.Contains(fx, fy)) {
-          DoMouseDown(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx,
-                      fy);
-        } else {
-          DoMouseDown(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx,
-                      fy);
-        }
-      }
-    }
-  }
-  if (!m_pOwner->SendEvent()) {
-    m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SCROLLBAR_Elapse);
-  }
-}
-void CFWL_ScrollBarImpDelegate::OnLButtonUp(FX_DWORD dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  FWL_StopTimer(m_pOwner->m_hTimer);
-  m_pOwner->m_bMouseDown = FALSE;
-  DoMouseUp(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  DoMouseUp(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
-  DoMouseUp(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
-  DoMouseUp(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
-  DoMouseUp(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
-  m_pOwner->SetGrab(FALSE);
-}
-void CFWL_ScrollBarImpDelegate::OnMouseMove(FX_DWORD dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  DoMouseMove(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  DoMouseMove(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
-  DoMouseMove(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
-  DoMouseMove(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
-  DoMouseMove(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
-}
-void CFWL_ScrollBarImpDelegate::OnMouseLeave() {
-  DoMouseLeave(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState);
-  DoMouseLeave(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState);
-  DoMouseLeave(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState);
-  DoMouseLeave(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState);
-  DoMouseLeave(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState);
-}
-void CFWL_ScrollBarImpDelegate::OnMouseWheel(FX_FLOAT fx,
-                                             FX_FLOAT fy,
-                                             FX_DWORD dwFlags,
-                                             FX_FLOAT fDeltaX,
-                                             FX_FLOAT fDeltaY) {
-  m_pOwner->m_iMouseWheel = (int32_t)fDeltaX;
-  m_pOwner->SendEvent();
-  m_pOwner->m_iMouseWheel = 0;
-}
-void CFWL_ScrollBarImpDelegate::DoMouseDown(int32_t iItem,
-                                            const CFX_RectF& rtItem,
-                                            int32_t& iState,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  if (!rtItem.Contains(fx, fy)) {
-    return;
-  }
-  if (iState == FWL_PARTSTATE_SCB_Pressed) {
-    return;
-  }
-  iState = FWL_PARTSTATE_SCB_Pressed;
-  m_pOwner->Repaint(&rtItem);
-}
-void CFWL_ScrollBarImpDelegate::DoMouseUp(int32_t iItem,
-                                          const CFX_RectF& rtItem,
-                                          int32_t& iState,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  int32_t iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered
-                                              : FWL_PARTSTATE_SCB_Normal;
-  if (iState == iNewState) {
-    return;
-  }
-  iState = iNewState;
-  m_pOwner->Repaint(&rtItem);
-  m_pOwner->OnScroll(FWL_SCBCODE_EndScroll, m_pOwner->m_fTrackPos);
-}
-void CFWL_ScrollBarImpDelegate::DoMouseMove(int32_t iItem,
-                                            const CFX_RectF& rtItem,
-                                            int32_t& iState,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  if (!m_pOwner->m_bMouseDown) {
-    int32_t iNewState = rtItem.Contains(fx, fy) ? FWL_PARTSTATE_SCB_Hovered
-                                                : FWL_PARTSTATE_SCB_Normal;
-    if (iState == iNewState) {
-      return;
-    }
-    iState = iNewState;
-    m_pOwner->Repaint(&rtItem);
-  } else if ((2 == iItem) &&
-             (m_pOwner->m_iThumbButtonState == FWL_PARTSTATE_SCB_Pressed)) {
-    FX_FLOAT fPos = m_pOwner->GetTrackPointPos(fx, fy);
-    m_pOwner->m_fTrackPos = fPos;
-    m_pOwner->OnScroll(FWL_SCBCODE_TrackPos, fPos);
-  }
-}
-void CFWL_ScrollBarImpDelegate::DoMouseLeave(int32_t iItem,
-                                             const CFX_RectF& rtItem,
-                                             int32_t& iState) {
-  if (iState == FWL_PARTSTATE_SCB_Normal) {
-    return;
-  }
-  iState = FWL_PARTSTATE_SCB_Normal;
-  m_pOwner->Repaint(&rtItem);
-}
-void CFWL_ScrollBarImpDelegate::DoMouseHover(int32_t iItem,
-                                             const CFX_RectF& rtItem,
-                                             int32_t& iState) {
-  if (iState == FWL_PARTSTATE_SCB_Hovered) {
-    return;
-  }
-  iState = FWL_PARTSTATE_SCB_Hovered;
-  m_pOwner->Repaint(&rtItem);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_scrollbarimp.h b/xfa/src/fwl/basewidget/fwl_scrollbarimp.h
deleted file mode 100644
index be1f254..0000000
--- a/xfa/src/fwl/basewidget/fwl_scrollbarimp.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
-
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_ScrollBarImpDelegate;
-
-class CFWL_ScrollBarImp : public CFWL_WidgetImp, public IFWL_Timer {
- public:
-  CFWL_ScrollBarImp(const CFWL_WidgetImpProperties& properties,
-                    IFWL_Widget* pOuter);
-  ~CFWL_ScrollBarImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FX_BOOL IsVertical();
-  virtual FWL_ERR GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
-  virtual FWL_ERR SetRange(FX_FLOAT fMin, FX_FLOAT fMax);
-  virtual FX_FLOAT GetPageSize();
-  virtual FWL_ERR SetPageSize(FX_FLOAT fPageSize);
-  virtual FX_FLOAT GetStepSize();
-  virtual FWL_ERR SetStepSize(FX_FLOAT fStepSize);
-  virtual FX_FLOAT GetPos();
-  virtual FWL_ERR SetPos(FX_FLOAT fPos);
-  virtual FX_FLOAT GetTrackPos();
-  virtual FWL_ERR SetTrackPos(FX_FLOAT fTrackPos);
-  virtual FX_BOOL DoScroll(FX_DWORD dwCode, FX_FLOAT fPos = 0.0f);
-  virtual FWL_ERR SetOuter(IFWL_Widget* pOuter);
-  virtual int32_t Run(FWL_HTIMER hTimer);
-
- protected:
-  void DrawTrack(CFX_Graphics* pGraphics,
-                 IFWL_ThemeProvider* pTheme,
-                 FX_BOOL bLower = TRUE,
-                 const CFX_Matrix* pMatrix = NULL);
-  void DrawArrowBtn(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    FX_BOOL bMinBtn = TRUE,
-                    const CFX_Matrix* pMatrix = NULL);
-  void DrawThumb(CFX_Graphics* pGraphics,
-                 IFWL_ThemeProvider* pTheme,
-                 const CFX_Matrix* pMatrix = NULL);
-  void Layout();
-  void CalcButtonLen();
-  void CalcMinButtonRect(CFX_RectF& rect);
-  void CalcMaxButtonRect(CFX_RectF& rect);
-  void CalcThumbButtonRect(CFX_RectF& rect);
-  void CalcMinTrackRect(CFX_RectF& rect);
-  void CalcMaxTrackRect(CFX_RectF& rect);
-  FX_FLOAT GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy);
-  void GetTrackRect(CFX_RectF& rect, FX_BOOL bLower = TRUE);
-  FX_BOOL SendEvent();
-  FX_BOOL OnScroll(FX_DWORD dwCode, FX_FLOAT fPos);
-
-  FWL_HTIMER m_hTimer;
-  FX_FLOAT m_fRangeMin;
-  FX_FLOAT m_fRangeMax;
-  FX_FLOAT m_fPageSize;
-  FX_FLOAT m_fStepSize;
-  FX_FLOAT m_fPos;
-  FX_FLOAT m_fTrackPos;
-  int32_t m_iMinButtonState;
-  int32_t m_iMaxButtonState;
-  int32_t m_iThumbButtonState;
-  int32_t m_iMinTrackState;
-  int32_t m_iMaxTrackState;
-  FX_FLOAT m_fLastTrackPos;
-  FX_FLOAT m_cpTrackPointX;
-  FX_FLOAT m_cpTrackPointY;
-  int32_t m_iMouseWheel;
-  FX_BOOL m_bTrackMouseLeave;
-  FX_BOOL m_bMouseHover;
-  FX_BOOL m_bMouseDown;
-  FX_BOOL m_bRepaintThumb;
-  FX_FLOAT m_fButtonLen;
-  FX_BOOL m_bMinSize;
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtThumb;
-  CFX_RectF m_rtMinBtn;
-  CFX_RectF m_rtMaxBtn;
-  CFX_RectF m_rtMinTrack;
-  CFX_RectF m_rtMaxTrack;
-  FX_BOOL m_bCustomLayout;
-  FX_FLOAT m_fMinThumb;
-  friend class CFWL_ScrollBarImpDelegate;
-};
-class CFWL_ScrollBarImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  void OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  void OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  void OnMouseLeave();
-  void OnMouseWheel(FX_FLOAT fx,
-                    FX_FLOAT fy,
-                    FX_DWORD dwFlags,
-                    FX_FLOAT fDeltaX,
-                    FX_FLOAT fDeltaY);
-  void DoMouseDown(int32_t iItem,
-                   const CFX_RectF& rtItem,
-                   int32_t& iState,
-                   FX_FLOAT fx,
-                   FX_FLOAT fy);
-  void DoMouseUp(int32_t iItem,
-                 const CFX_RectF& rtItem,
-                 int32_t& iState,
-                 FX_FLOAT fx,
-                 FX_FLOAT fy);
-  void DoMouseMove(int32_t iItem,
-                   const CFX_RectF& rtItem,
-                   int32_t& iState,
-                   FX_FLOAT fx,
-                   FX_FLOAT fy);
-  void DoMouseLeave(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
-  void DoMouseHover(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
-
-  CFWL_ScrollBarImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_spinbuttonimp.cpp b/xfa/src/fwl/basewidget/fwl_spinbuttonimp.cpp
deleted file mode 100644
index fd7c226..0000000
--- a/xfa/src/fwl/basewidget/fwl_spinbuttonimp.cpp
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_spinbuttonimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_spinbutton.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-#define FWL_SPN_MinWidth 18
-#define FWL_SPN_MinHeight 32
-#define FWL_SPIN_Elapse 200
-
-// static
-IFWL_SpinButton* IFWL_SpinButton::Create(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter) {
-  IFWL_SpinButton* pSpinButton = new IFWL_SpinButton;
-  CFWL_SpinButtonImp* pSpinButtonImpl =
-      new CFWL_SpinButtonImp(properties, nullptr);
-  pSpinButton->SetImpl(pSpinButtonImpl);
-  pSpinButtonImpl->SetInterface(pSpinButton);
-  return pSpinButton;
-}
-IFWL_SpinButton::IFWL_SpinButton() {}
-FWL_ERR IFWL_SpinButton::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) {
-  return static_cast<CFWL_SpinButtonImp*>(GetImpl())
-      ->EnableButton(bEnable, bUp);
-}
-FX_BOOL IFWL_SpinButton::IsButtonEnable(FX_BOOL bUp) {
-  return static_cast<CFWL_SpinButtonImp*>(GetImpl())->IsButtonEnable(bUp);
-}
-
-CFWL_SpinButtonImp::CFWL_SpinButtonImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_dwUpState(FWL_PARTSTATE_SPB_Normal),
-      m_dwDnState(FWL_PARTSTATE_SPB_Normal),
-      m_iButtonIndex(0),
-      m_bLButtonDwn(FALSE),
-      m_hTimer(NULL) {
-  m_rtClient.Reset();
-  m_rtUpButton.Reset();
-  m_rtDnButton.Reset();
-  m_pProperties->m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert;
-}
-CFWL_SpinButtonImp::~CFWL_SpinButtonImp() {}
-FWL_ERR CFWL_SpinButtonImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_SpinButton;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_SpinButtonImp::GetClassID() const {
-  return FWL_CLASSHASH_SpinButton;
-}
-FWL_ERR CFWL_SpinButtonImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_SpinButtonImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SpinButtonImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_SpinButtonImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, FWL_SPN_MinWidth, FWL_SPN_MinHeight);
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SpinButtonImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  GetClientRect(m_rtClient);
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXE_SPB_Vert) {
-    m_rtUpButton.Set(m_rtClient.top, m_rtClient.left, m_rtClient.width,
-                     m_rtClient.height / 2);
-    m_rtDnButton.Set(m_rtClient.left, m_rtClient.top + m_rtClient.height / 2,
-                     m_rtClient.width, m_rtClient.height / 2);
-  } else {
-    m_rtUpButton.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width / 2,
-                     m_rtClient.height);
-    m_rtDnButton.Set(m_rtClient.left + m_rtClient.width / 2, m_rtClient.top,
-                     m_rtClient.width / 2, m_rtClient.height);
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_SpinButtonImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_rtClient.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  if (HasBorder() && (m_rtClient.Contains(fx, fy))) {
-    return FWL_WGTHITTEST_Border;
-  }
-  if (HasEdge()) {
-    CFX_RectF rtEdge;
-    GetEdgeRect(rtEdge);
-    if (rtEdge.Contains(fx, fy)) {
-      return FWL_PART_SPB_Edge;
-    }
-  }
-  if (m_rtUpButton.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_SPB_UpButton;
-  }
-  if (m_rtDnButton.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_SPB_DownButton;
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FWL_ERR CFWL_SpinButtonImp::DrawWidget(CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  CFX_RectF rtClip(m_rtClient);
-  if (pMatrix != NULL) {
-    pMatrix->TransformRect(rtClip);
-  }
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (HasBorder()) {
-    DrawBorder(pGraphics, FWL_PART_SPB_Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, FWL_PART_SPB_Edge, pTheme, pMatrix);
-  }
-  DrawUpButton(pGraphics, pTheme, pMatrix);
-  DrawDownButton(pGraphics, pTheme, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_SpinButtonImp::Run(FWL_HTIMER hTimer) {
-  if (m_hTimer) {
-    CFWL_EvtSpbClick wmPosChanged;
-    wmPosChanged.m_pSrcTarget = m_pInterface;
-    wmPosChanged.m_bUp = m_iButtonIndex == 0;
-    DispatchEvent(&wmPosChanged);
-  }
-  return 1;
-}
-FWL_ERR CFWL_SpinButtonImp::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) {
-  if (bUp) {
-    if (bEnable) {
-      m_dwUpState = FWL_PARTSTATE_SPB_Normal;
-    } else {
-      m_dwUpState = FWL_PARTSTATE_SPB_Disabled;
-    }
-  } else {
-    if (bEnable) {
-      m_dwDnState = FWL_PARTSTATE_SPB_Normal;
-    } else {
-      m_dwDnState = FWL_PARTSTATE_SPB_Disabled;
-    }
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_SpinButtonImp::IsButtonEnable(FX_BOOL bUp) {
-  if (bUp) {
-    return (m_dwUpState != FWL_PARTSTATE_SPB_Disabled);
-  }
-  return (m_dwDnState != FWL_PARTSTATE_SPB_Disabled);
-}
-void CFWL_SpinButtonImp::DrawUpButton(CFX_Graphics* pGraphics,
-                                      IFWL_ThemeProvider* pTheme,
-                                      const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_SPB_UpButton;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = m_dwUpState + 1;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  params.m_rtPart = m_rtUpButton;
-  pTheme->DrawBackground(&params);
-}
-void CFWL_SpinButtonImp::DrawDownButton(CFX_Graphics* pGraphics,
-                                        IFWL_ThemeProvider* pTheme,
-                                        const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground params;
-  params.m_pWidget = m_pInterface;
-  params.m_iPart = FWL_PART_SPB_DownButton;
-  params.m_pGraphics = pGraphics;
-  params.m_dwStates = m_dwDnState + 1;
-  if (pMatrix) {
-    params.m_matrix.Concat(*pMatrix);
-  }
-  params.m_rtPart = m_rtDnButton;
-  pTheme->DrawBackground(&params);
-}
-CFWL_SpinButtonImpDelegate::CFWL_SpinButtonImpDelegate(
-    CFWL_SpinButtonImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_SpinButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  int32_t iRet = 1;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_SetFocus:
-    case FWL_MSGHASH_KillFocus: {
-      OnFocusChanged(pMessage, dwMsgCode == FWL_MSGHASH_SetFocus);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      FX_DWORD dwCmd = pMsg->m_dwCmd;
-      switch (dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMsg);
-          break;
-        }
-        default: {}
-      }
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
-      if (pKey->m_dwCmd == FWL_MSGKEYCMD_KeyDown) {
-        OnKeyDown(pKey);
-      }
-      break;
-    }
-    default: {
-      iRet = 0;
-      break;
-    }
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-  return iRet;
-}
-FWL_ERR CFWL_SpinButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SpinButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                 const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_SpinButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_SpinButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDwn = TRUE;
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->SetFocus(TRUE);
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
-    return;
-  FX_BOOL bUpPress = (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
-                      m_pOwner->IsButtonEnable(TRUE));
-  FX_BOOL bDnPress = (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
-                      m_pOwner->IsButtonEnable(FALSE));
-  if (!bUpPress && !bDnPress) {
-    return;
-  }
-  if (bUpPress) {
-    m_pOwner->m_iButtonIndex = 0;
-    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Pressed;
-  }
-  if (bDnPress) {
-    m_pOwner->m_iButtonIndex = 1;
-    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Pressed;
-  }
-  CFWL_EvtSpbClick wmPosChanged;
-  wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface;
-  wmPosChanged.m_bUp = bUpPress;
-  m_pOwner->DispatchEvent(&wmPosChanged);
-  m_pOwner->Repaint(bUpPress ? &m_pOwner->m_rtUpButton
-                             : &m_pOwner->m_rtDnButton);
-  m_pOwner->m_hTimer = FWL_StartTimer(m_pOwner, FWL_SPIN_Elapse);
-}
-void CFWL_SpinButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_PARTSTATE_SPB_Disabled) {
-    return;
-  }
-  m_pOwner->m_bLButtonDwn = FALSE;
-  m_pOwner->SetGrab(FALSE);
-  m_pOwner->SetFocus(FALSE);
-  if (m_pOwner->m_hTimer) {
-    FWL_StopTimer(m_pOwner->m_hTimer);
-    m_pOwner->m_hTimer = NULL;
-  }
-  FX_BOOL bRepaint = FALSE;
-  CFX_RectF rtInvalidate;
-  if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Pressed &&
-      m_pOwner->IsButtonEnable(TRUE)) {
-    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
-    bRepaint = TRUE;
-    rtInvalidate = m_pOwner->m_rtUpButton;
-  } else if (m_pOwner->m_dwDnState == FWL_PARTSTATE_SPB_Pressed &&
-             m_pOwner->IsButtonEnable(FALSE)) {
-    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
-    bRepaint = TRUE;
-    rtInvalidate = m_pOwner->m_rtDnButton;
-  }
-  if (bRepaint) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-void CFWL_SpinButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
-    return;
-  if (m_pOwner->m_bLButtonDwn) {
-    return;
-  }
-  FX_BOOL bRepaint = FALSE;
-  CFX_RectF rtInvlidate;
-  rtInvlidate.Reset();
-  if (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsButtonEnable(TRUE)) {
-      if (m_pOwner->m_dwUpState == FWL_PARTSTATE_SPB_Hovered) {
-        m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Hovered;
-        bRepaint = TRUE;
-        rtInvlidate = m_pOwner->m_rtUpButton;
-      }
-      if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal &&
-          m_pOwner->IsButtonEnable(FALSE)) {
-        m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
-        if (bRepaint) {
-          rtInvlidate.Union(m_pOwner->m_rtDnButton);
-        } else {
-          rtInvlidate = m_pOwner->m_rtDnButton;
-        }
-        bRepaint = TRUE;
-      }
-    }
-    if (!m_pOwner->IsButtonEnable(FALSE)) {
-      m_pOwner->EnableButton(FALSE, FALSE);
-    }
-  } else if (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsButtonEnable(FALSE)) {
-      if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Hovered) {
-        m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Hovered;
-        bRepaint = TRUE;
-        rtInvlidate = m_pOwner->m_rtDnButton;
-      }
-      if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal &&
-          m_pOwner->IsButtonEnable(TRUE)) {
-        m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
-        if (bRepaint) {
-          rtInvlidate.Union(m_pOwner->m_rtUpButton);
-        } else {
-          rtInvlidate = m_pOwner->m_rtUpButton;
-        }
-        bRepaint = TRUE;
-      }
-    }
-  } else if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal ||
-             m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) {
-    if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal) {
-      m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
-      bRepaint = TRUE;
-      rtInvlidate = m_pOwner->m_rtUpButton;
-    }
-    if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal) {
-      m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
-      if (bRepaint) {
-        rtInvlidate.Union(m_pOwner->m_rtDnButton);
-      } else {
-        rtInvlidate = m_pOwner->m_rtDnButton;
-      }
-      bRepaint = TRUE;
-    }
-  }
-  if (bRepaint) {
-    m_pOwner->Repaint(&rtInvlidate);
-  }
-}
-void CFWL_SpinButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (!pMsg)
-    return;
-  if (m_pOwner->m_dwUpState != FWL_PARTSTATE_SPB_Normal &&
-      m_pOwner->IsButtonEnable(TRUE)) {
-    m_pOwner->m_dwUpState = FWL_PARTSTATE_SPB_Normal;
-  }
-  if (m_pOwner->m_dwDnState != FWL_PARTSTATE_SPB_Normal &&
-      m_pOwner->IsButtonEnable(FALSE)) {
-    m_pOwner->m_dwDnState = FWL_PARTSTATE_SPB_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-void CFWL_SpinButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
-    return;
-  FX_BOOL bUp =
-      pMsg->m_dwKeyCode == FWL_VKEY_Up || pMsg->m_dwKeyCode == FWL_VKEY_Left;
-  FX_BOOL bDown =
-      pMsg->m_dwKeyCode == FWL_VKEY_Down || pMsg->m_dwKeyCode == FWL_VKEY_Right;
-  if (!bUp && !bDown) {
-    return;
-  }
-  FX_BOOL bUpEnable = m_pOwner->IsButtonEnable(TRUE);
-  FX_BOOL bDownEnable = m_pOwner->IsButtonEnable(FALSE);
-  if (!bUpEnable && !bDownEnable) {
-    return;
-  }
-  CFWL_EvtSpbClick wmPosChanged;
-  wmPosChanged.m_pSrcTarget = m_pOwner->m_pInterface;
-  wmPosChanged.m_bUp = bUpEnable;
-  m_pOwner->DispatchEvent(&wmPosChanged);
-  m_pOwner->Repaint(bUpEnable ? &m_pOwner->m_rtUpButton
-                              : &m_pOwner->m_rtDnButton);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_spinbuttonimp.h b/xfa/src/fwl/basewidget/fwl_spinbuttonimp.h
deleted file mode 100644
index 769db28..0000000
--- a/xfa/src/fwl/basewidget/fwl_spinbuttonimp.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
-
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class CFWL_SpinButtonImpDelegate;
-
-class CFWL_SpinButtonImp : public CFWL_WidgetImp, public IFWL_Timer {
- public:
-  CFWL_SpinButtonImp(const CFWL_WidgetImpProperties& properties,
-                     IFWL_Widget* pOuter);
-  ~CFWL_SpinButtonImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual int32_t Run(FWL_HTIMER hTimer);
-  FWL_ERR EnableButton(FX_BOOL bEnable, FX_BOOL bUp = TRUE);
-  FX_BOOL IsButtonEnable(FX_BOOL bUp = TRUE);
-
- protected:
-  void DrawUpButton(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
-  void DrawDownButton(CFX_Graphics* pGraphics,
-                      IFWL_ThemeProvider* pTheme,
-                      const CFX_Matrix* pMatrix);
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtUpButton;
-  CFX_RectF m_rtDnButton;
-  FX_DWORD m_dwUpState;
-  FX_DWORD m_dwDnState;
-  int32_t m_iButtonIndex;
-  FX_BOOL m_bLButtonDwn;
-  FWL_HTIMER m_hTimer;
-  friend class CFWL_SpinButtonImpDelegate;
-};
-class CFWL_SpinButtonImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_SpinButtonImpDelegate(CFWL_SpinButtonImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  CFWL_SpinButtonImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_SPINBUTTONIMP_H_
diff --git a/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.cpp b/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.cpp
deleted file mode 100644
index 696a2e2..0000000
--- a/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_ToolTip* IFWL_ToolTip::Create(const CFWL_WidgetImpProperties& properties,
-                                   IFWL_Widget* pOuter) {
-  IFWL_ToolTip* pToolTip = new IFWL_ToolTip;
-  CFWL_ToolTipImp* pToolTipImpl = new CFWL_ToolTipImp(properties, pOuter);
-  pToolTip->SetImpl(pToolTipImpl);
-  pToolTipImpl->SetInterface(pToolTip);
-  return pToolTip;
-}
-FWL_ERR IFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
-  return static_cast<CFWL_ToolTipImp*>(GetImpl())->SetAnchor(rtAnchor);
-}
-FWL_ERR IFWL_ToolTip::Show() {
-  return static_cast<CFWL_ToolTipImp*>(GetImpl())->Show();
-}
-FWL_ERR IFWL_ToolTip::Hide() {
-  return static_cast<CFWL_ToolTipImp*>(GetImpl())->Hide();
-}
-IFWL_ToolTip::IFWL_ToolTip() {}
-CFWL_ToolTipImp::CFWL_ToolTipImp(const CFWL_WidgetImpProperties& properties,
-                                 IFWL_Widget* pOuter)
-    : CFWL_FormImp(properties, pOuter),
-      m_bBtnDown(FALSE),
-      m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
-      m_iTTOAlign(FDE_TTOALIGNMENT_Center),
-      m_hTimerShow(NULL),
-      m_hTimerHide(NULL),
-      m_pTimer(NULL) {
-  m_rtClient.Set(0, 0, 0, 0);
-  m_rtCaption.Set(0, 0, 0, 0);
-  m_rtAnchor.Set(0, 0, 0, 0);
-  m_TimerShow.m_pToolTip = this;
-  m_TimerHide.m_pToolTip = this;
-}
-CFWL_ToolTipImp::~CFWL_ToolTipImp() {
-  if (m_pTimer) {
-    delete m_pTimer;
-    m_pTimer = NULL;
-  }
-}
-FWL_ERR CFWL_ToolTipImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_ToolTip;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_ToolTipImp::GetClassID() const {
-  return FWL_CLASSHASH_ToolTip;
-}
-FWL_ERR CFWL_ToolTipImp::Initialize() {
-  m_pProperties->m_dwStyles |= FWL_WGTSTYLE_Popup;
-  m_pProperties->m_dwStyles &= ~FWL_WGTSTYLE_Child;
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_ToolTipImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTipImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_ToolTipImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (m_pProperties->m_pThemeProvider == NULL) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_WideString wsCaption;
-    IFWL_ToolTipDP* pData =
-        static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
-    if (pData) {
-      pData->GetCaption(m_pInterface, wsCaption);
-    }
-    int32_t iLen = wsCaption.GetLength();
-    if (iLen > 0) {
-      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
-      rect.Set(0, 0, sz.x, sz.y);
-      rect.width += FWL_WGTCAPACITY_CXBorder * 25;
-      rect.height += FWL_WGTCAPACITY_CYBorder * 8;
-    }
-    CFWL_WidgetImp::GetWidgetRect(rect, TRUE);
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTipImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  UpdateTextOutStyles();
-  GetClientRect(m_rtClient);
-  m_rtCaption = m_rtClient;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTipImp::GetClientRect(CFX_RectF& rect) {
-  FX_FLOAT x = 0;
-  FX_FLOAT y = 0;
-  FX_FLOAT t = 0;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (pTheme) {
-    CFWL_ThemePart part;
-    part.m_pWidget = m_pInterface;
-    x = *static_cast<FX_FLOAT*>(
-        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder));
-    y = *static_cast<FX_FLOAT*>(
-        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder));
-  }
-  rect = m_pProperties->m_rtWidget;
-  rect.Offset(-rect.left, -rect.top);
-  rect.Deflate(x, t, x, y);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTipImp::DrawWidget(CFX_Graphics* pGraphics,
-                                    const CFX_Matrix* pMatrix) {
-  IFWL_ToolTipTarget* toolTipTarget =
-      CFWL_ToolTipContainer::getInstance()->GetCurrentToolTipTarget();
-  if (toolTipTarget && !toolTipTarget->UseDefaultTheme()) {
-    return toolTipTarget->DrawToolTip(pGraphics, pMatrix, m_pInterface);
-  }
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  DrawBkground(pGraphics, pTheme, pMatrix);
-  DrawText(pGraphics, pTheme, pMatrix);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_ToolTipImp::DrawBkground(CFX_Graphics* pGraphics,
-                                   IFWL_ThemeProvider* pTheme,
-                                   const CFX_Matrix* pMatrix) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_TTP_Background;
-  param.m_dwStates = m_pProperties->m_dwStates;
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  param.m_rtPart = m_rtClient;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    param.m_pData = &m_rtCaption;
-  }
-  pTheme->DrawBackground(&param);
-}
-void CFWL_ToolTipImp::DrawText(CFX_Graphics* pGraphics,
-                               IFWL_ThemeProvider* pTheme,
-                               const CFX_Matrix* pMatrix) {
-  if (!m_pProperties->m_pDataProvider)
-    return;
-  CFX_WideString wsCaption;
-  m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsCaption);
-  if (wsCaption.IsEmpty()) {
-    return;
-  }
-  CFWL_ThemeText param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_TTP_Caption;
-  param.m_dwStates = m_pProperties->m_dwStates;
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  param.m_rtPart = m_rtCaption;
-  param.m_wsText = wsCaption;
-  param.m_dwTTOStyles = m_dwTTOStyles;
-  param.m_iTTOAlign = m_iTTOAlign;
-  pTheme->DrawText(&param);
-}
-void CFWL_ToolTipImp::UpdateTextOutStyles() {
-  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
-    m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_Multiline) {
-    m_dwTTOStyles &= ~FDE_TTOSTYLE_SingleLine;
-  }
-}
-FWL_ERR CFWL_ToolTipImp::SetAnchor(const CFX_RectF& rtAnchor) {
-  m_rtAnchor = rtAnchor;
-  return TRUE;
-}
-FWL_ERR CFWL_ToolTipImp::Show() {
-  IFWL_ToolTipDP* pData =
-      static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
-  int32_t nInitDelay = pData->GetInitialDelay(m_pInterface);
-  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible)) {
-    m_hTimerShow = FWL_StartTimer(&m_TimerShow, nInitDelay, FALSE);
-  }
-  return TRUE;
-}
-FWL_ERR CFWL_ToolTipImp::Hide() {
-  SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  if (m_hTimerHide) {
-    FWL_StopTimer(m_hTimerHide);
-    m_hTimerHide = NULL;
-  }
-  if (m_hTimerShow) {
-    FWL_StopTimer(m_hTimerShow);
-    m_hTimerShow = NULL;
-  }
-  return TRUE;
-}
-FWL_ERR CFWL_ToolTipImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  if ((dwStates & FWL_WGTSTATE_Invisible) && !bSet) {
-    IFWL_ToolTipDP* pData =
-        static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
-    int32_t nAutoPopDelay = pData->GetAutoPopDelay(m_pInterface);
-    m_hTimerHide = FWL_StartTimer(&m_TimerHide, nAutoPopDelay, FALSE);
-  }
-  return CFWL_WidgetImp::SetStates(dwStates, bSet);
-}
-void CFWL_ToolTipImp::RefreshToolTipPos() {
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_NoAnchor) == 0) {
-    CFX_RectF rtPopup;
-    CFX_RectF rtWidget(m_pProperties->m_rtWidget);
-    CFX_RectF rtAnchor(m_rtAnchor);
-    rtPopup.Set(0, 0, 0, 0);
-    FX_FLOAT fx = rtAnchor.Center().x + 20;
-    FX_FLOAT fy = rtAnchor.Center().y + 20;
-    rtPopup.Set(fx, fy, rtWidget.Width(), rtWidget.Height());
-    FX_FLOAT fScreenWidth = 0;
-    FX_FLOAT fScreenHeight = 0;
-    GetScreenSize(fScreenWidth, fScreenHeight);
-    if (rtPopup.bottom() > fScreenHeight) {
-      rtPopup.Offset(0, fScreenHeight - rtPopup.bottom());
-    }
-    if (rtPopup.right() > fScreenWidth) {
-      rtPopup.Offset(fScreenWidth - rtPopup.right(), 0);
-    }
-    if (rtPopup.left < 0) {
-      rtPopup.Offset(0 - rtPopup.left, 0);
-    }
-    if (rtPopup.top < 0) {
-      rtPopup.Offset(0, 0 - rtPopup.top);
-    }
-    SetWidgetRect(rtPopup);
-    Update();
-  }
-}
-CFWL_ToolTipImp::CFWL_ToolTipTimer::CFWL_ToolTipTimer(CFWL_ToolTipImp* pToolTip)
-    : m_pToolTip(pToolTip) {}
-int32_t CFWL_ToolTipImp::CFWL_ToolTipTimer::Run(FWL_HTIMER hTimer) {
-  if (m_pToolTip->m_hTimerShow == hTimer && m_pToolTip->m_hTimerShow) {
-    if (m_pToolTip->GetStates() & FWL_WGTSTATE_Invisible) {
-      m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, FALSE);
-      m_pToolTip->RefreshToolTipPos();
-      FWL_StopTimer(m_pToolTip->m_hTimerShow);
-      m_pToolTip->m_hTimerShow = NULL;
-      return TRUE;
-    }
-  }
-  if (m_pToolTip->m_hTimerHide == hTimer && m_pToolTip->m_hTimerHide) {
-    m_pToolTip->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-    FWL_StopTimer(m_pToolTip->m_hTimerHide);
-    m_pToolTip->m_hTimerHide = NULL;
-    return TRUE;
-  }
-  return TRUE;
-}
-CFWL_ToolTipImpDelegate::CFWL_ToolTipImpDelegate(CFWL_ToolTipImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_ToolTipImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  return CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-FWL_ERR CFWL_ToolTipImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTipImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h b/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h
deleted file mode 100644
index 08fb7b0..0000000
--- a/xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
-
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class CFWL_ToolTipImpDelegate;
-
-class CFWL_ToolTipImp : public CFWL_FormImp {
- public:
-  CFWL_ToolTipImp(const CFWL_WidgetImpProperties& properties,
-                  IFWL_Widget* pOuter);
-  virtual ~CFWL_ToolTipImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet);
-  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
-  FWL_ERR SetAnchor(const CFX_RectF& rtAnchor);
-  FWL_ERR Show();
-  FWL_ERR Hide();
-
- protected:
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
-  void DrawText(CFX_Graphics* pGraphics,
-                IFWL_ThemeProvider* pTheme,
-                const CFX_Matrix* pMatrix);
-  void UpdateTextOutStyles();
-  void RefreshToolTipPos();
-  class CFWL_ToolTipTimer : public IFWL_Timer {
-   public:
-    CFWL_ToolTipTimer() {}
-    ~CFWL_ToolTipTimer() {}
-    CFWL_ToolTipTimer(CFWL_ToolTipImp* pToolTip);
-    virtual int32_t Run(FWL_HTIMER hTimer);
-    CFWL_ToolTipImp* m_pToolTip;
-  };
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtCaption;
-  FX_BOOL m_bBtnDown;
-  FX_DWORD m_dwTTOStyles;
-  int32_t m_iTTOAlign;
-  CFX_RectF m_rtAnchor;
-  FWL_HTIMER m_hTimerShow;
-  FWL_HTIMER m_hTimerHide;
-  CFWL_ToolTipTimer* m_pTimer;
-  CFWL_ToolTipTimer m_TimerShow;
-  CFWL_ToolTipTimer m_TimerHide;
-  friend class CFWL_ToolTipImpDelegate;
-  friend class CFWL_ToolTipTimer;
-};
-class CFWL_ToolTipImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ToolTipImpDelegate(CFWL_ToolTipImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnKeyDown(CFWL_MsgKey* pMsg);
-  CFWL_ToolTipImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FWL_TOOLTIPCTRLIMP_H_
diff --git a/xfa/src/fwl/basewidget/fxmath_barcodeimp.cpp b/xfa/src/fwl/basewidget/fxmath_barcodeimp.cpp
deleted file mode 100644
index 8c9bfe4..0000000
--- a/xfa/src/fwl/basewidget/fxmath_barcodeimp.cpp
+++ /dev/null
@@ -1,385 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/basewidget/fxmath_barcodeimp.h"
-
-static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type) {
-  switch (type) {
-    case BC_CODE39:
-      return new CBC_Code39();
-    case BC_CODABAR:
-      return new CBC_Codabar();
-    case BC_CODE128:
-      return new CBC_Code128(BC_CODE128_B);
-    case BC_CODE128_B:
-      return new CBC_Code128(BC_CODE128_B);
-    case BC_CODE128_C:
-      return new CBC_Code128(BC_CODE128_C);
-    case BC_EAN8:
-      return new CBC_EAN8();
-    case BC_UPCA:
-      return new CBC_UPCA();
-    case BC_EAN13:
-      return new CBC_EAN13();
-    case BC_QR_CODE:
-      return new CBC_QRCode();
-    case BC_PDF417:
-      return new CBC_PDF417I();
-    case BC_DATAMATRIX:
-      return new CBC_DataMatrix();
-    case BC_UNKNOWN:
-    default:
-      return NULL;
-  }
-}
-CFX_Barcode::CFX_Barcode() {}
-CFX_Barcode::~CFX_Barcode() {
-  if (m_pBCEngine) {
-    delete m_pBCEngine;
-    m_pBCEngine = NULL;
-  }
-}
-FX_BOOL CFX_Barcode::Crreate(BC_TYPE type) {
-  m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type);
-  return m_pBCEngine != NULL;
-}
-void CFX_Barcode::Release() {
-  delete this;
-}
-BC_TYPE CFX_Barcode::GetType() {
-  return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN;
-}
-FX_BOOL CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) {
-  return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetModuleHeight(int32_t moduleHeight) {
-  return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetModuleWidth(int32_t moduleWidth) {
-  return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetHeight(int32_t height) {
-  return m_pBCEngine ? m_pBCEngine->SetHeight(height) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetWidth(int32_t width) {
-  return m_pBCEngine ? m_pBCEngine->SetWidth(width) : FALSE;
-}
-FX_BOOL CFX_Barcode::CheckContentValidity(const CFX_WideStringC& contents) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine
-                 ? static_cast<CBC_OneCode*>(m_pBCEngine)
-                       ->CheckContentValidity(contents)
-                 : TRUE;
-    default:
-      return TRUE;
-  }
-}
-FX_BOOL CFX_Barcode::SetPrintChecksum(FX_BOOL checksum) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
-                                ->SetPrintChecksum(checksum),
-                            TRUE)
-                         : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetDataLength(int32_t length) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
-                                ->SetDataLength(length),
-                            TRUE)
-                         : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetCalChecksum(int32_t state) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
-                                ->SetCalChecksum(state),
-                            TRUE)
-                         : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetFont(CFX_Font* pFont) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine
-                 ? static_cast<CBC_OneCode*>(m_pBCEngine)->SetFont(pFont)
-                 : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetFontSize(FX_FLOAT size) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontSize(size),
-                    TRUE)
-                 : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetFontStyle(int32_t style) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontStyle(style),
-                    TRUE)
-                 : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetFontColor(FX_ARGB color) {
-  switch (GetType()) {
-    case BC_CODE39:
-    case BC_CODABAR:
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-    case BC_EAN8:
-    case BC_EAN13:
-    case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontColor(color),
-                    TRUE)
-                 : FALSE;
-    default:
-      return FALSE;
-  }
-}
-FX_BOOL CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_CODE39:
-      memptr = (memptrtype)&CBC_Code39::SetTextLocation;
-      break;
-    case BC_CODABAR:
-      memptr = (memptrtype)&CBC_Codabar::SetTextLocation;
-      break;
-    case BC_CODE128:
-    case BC_CODE128_B:
-    case BC_CODE128_C:
-      memptr = (memptrtype)&CBC_Code128::SetTextLocation;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetWideNarrowRatio(int32_t ratio) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_CODE39:
-      memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio;
-      break;
-    case BC_CODABAR:
-      memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_CODABAR:
-      memptr = (memptrtype)&CBC_Codabar::SetStartChar;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_CODABAR:
-      memptr = (memptrtype)&CBC_Codabar::SetEndChar;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetVersion(int32_t version) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_QR_CODE:
-      memptr = (memptrtype)&CBC_QRCode::SetVersion;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(int32_t level) {
-  typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_QR_CODE:
-      memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel;
-      break;
-    case BC_PDF417:
-      memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel;
-      break;
-    default:
-      return FALSE;
-  }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level) : FALSE;
-}
-FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated) {
-  typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL);
-  memptrtype memptr = NULL;
-  switch (GetType()) {
-    case BC_PDF417:
-      memptr = (memptrtype)&CBC_PDF417I::SetTruncated;
-      break;
-    default:
-      break;
-  }
-  return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE)
-                               : FALSE;
-}
-#ifndef BCExceptionNO
-#define BCExceptionNO 0
-#endif
-#ifndef BCExceptionFormatException
-#define BCExceptionFormatException 8
-#endif
-#ifndef BCExceptionUnSupportedBarcode
-#define BCExceptionUnSupportedBarcode 18
-#endif
-FX_BOOL CFX_Barcode::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->Encode(contents, isDevice, e);
-}
-FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->RenderDevice(device, matirx, e);
-}
-FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->RenderBitmap(pOutBitmap, e);
-}
-#define BC_TYPE_MIN BC_CODE39
-#define BC_TYPE_MAX BC_DATAMATRIX
-CFX_WideString CFX_Barcode::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t height,
-                                   int32_t& errorCode) {
-  for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX;
-       t = (BC_TYPE)((int32_t)t + 1)) {
-    CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);
-    if (!pTmpEngine) {
-      continue;
-    }
-    CFX_WideString ret = pTmpEngine->Decode(buf, width, height, errorCode);
-    if (errorCode == BCExceptionNO) {
-      return ret;
-    }
-  }
-  errorCode = BCExceptionUnSupportedBarcode;
-  return CFX_WideString();
-}
-CFX_WideString CFX_Barcode::Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode) {
-  for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX;
-       t = (BC_TYPE)((int32_t)t + 1)) {
-    CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);
-    if (!pTmpEngine) {
-      continue;
-    }
-    CFX_WideString ret = pTmpEngine->Decode(pBitmap, errorCode);
-    if (errorCode == BCExceptionNO) {
-      return ret;
-    }
-  }
-  errorCode = BCExceptionUnSupportedBarcode;
-  return CFX_WideString();
-}
-IFX_Barcode* FX_Barcode_Create(BC_TYPE type) {
-  CFX_Barcode* pBarcode = new CFX_Barcode;
-  if (pBarcode->Crreate(type)) {
-    return pBarcode;
-  }
-  pBarcode->Release();
-  return NULL;
-}
diff --git a/xfa/src/fwl/basewidget/fxmath_barcodeimp.h b/xfa/src/fwl/basewidget/fxmath_barcodeimp.h
deleted file mode 100644
index 22cb97b..0000000
--- a/xfa/src/fwl/basewidget/fxmath_barcodeimp.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
-#define XFA_SRC_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
-
-#include "xfa/include/fwl/basewidget/fxmath_barcode.h"
-
-class CFX_Barcode : public IFX_Barcode {
- public:
-  CFX_Barcode();
-  ~CFX_Barcode();
-  FX_BOOL Crreate(BC_TYPE type);
-  virtual void Release();
-  virtual BC_TYPE GetType();
-  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e);
-  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e);
-  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  virtual CFX_WideString Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t height,
-                                int32_t& errorCode);
-  virtual CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode);
-  virtual FX_BOOL SetCharEncoding(BC_CHAR_ENCODING encoding);
-  virtual FX_BOOL SetModuleHeight(int32_t moduleHeight);
-  virtual FX_BOOL SetModuleWidth(int32_t moduleWidth);
-  virtual FX_BOOL SetHeight(int32_t height);
-  virtual FX_BOOL SetWidth(int32_t width);
-  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  virtual FX_BOOL SetPrintChecksum(FX_BOOL checksum);
-  virtual FX_BOOL SetDataLength(int32_t length);
-  virtual FX_BOOL SetCalChecksum(int32_t state);
-  virtual FX_BOOL SetFont(CFX_Font* pFont);
-  virtual FX_BOOL SetFontSize(FX_FLOAT size);
-  virtual FX_BOOL SetFontStyle(int32_t style);
-  virtual FX_BOOL SetFontColor(FX_ARGB color);
-  virtual FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  virtual FX_BOOL SetWideNarrowRatio(int32_t ratio);
-  virtual FX_BOOL SetStartChar(FX_CHAR start);
-  virtual FX_BOOL SetEndChar(FX_CHAR end);
-  virtual FX_BOOL SetVersion(int32_t version);
-  virtual FX_BOOL SetErrorCorrectionLevel(int32_t level);
-  virtual FX_BOOL SetTruncated(FX_BOOL truncated);
-
- protected:
-  CBC_CodeBase* m_pBCEngine;
-};
-
-#endif  // XFA_SRC_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
diff --git a/xfa/src/fwl/core/fwl_appimp.cpp b/xfa/src/fwl/core/fwl_appimp.cpp
deleted file mode 100644
index 43a3d0b..0000000
--- a/xfa/src/fwl/core/fwl_appimp.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_appimp.h"
-
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-IFWL_App* IFWL_App::Create(IFWL_AdapterNative* pAdapter) {
-  IFWL_App* pApp = new IFWL_App;
-  pApp->SetImpl(new CFWL_AppImp(pApp, pAdapter));
-  return pApp;
-}
-FWL_ERR IFWL_App::Initialize() {
-  return static_cast<CFWL_AppImp*>(GetImpl())->Initialize();
-}
-FWL_ERR IFWL_App::Finalize() {
-  return static_cast<CFWL_AppImp*>(GetImpl())->Finalize();
-}
-IFWL_AdapterNative* IFWL_App::GetAdapterNative() {
-  return static_cast<CFWL_AppImp*>(GetImpl())->GetAdapterNative();
-}
-IFWL_WidgetMgr* IFWL_App::GetWidgetMgr() {
-  return static_cast<CFWL_AppImp*>(GetImpl())->GetWidgetMgr();
-}
-IFWL_ThemeProvider* IFWL_App::GetThemeProvider() {
-  return static_cast<CFWL_AppImp*>(GetImpl())->GetThemeProvider();
-}
-FWL_ERR IFWL_App::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  return static_cast<CFWL_AppImp*>(GetImpl())->SetThemeProvider(pThemeProvider);
-}
-FWL_ERR IFWL_App::Exit(int32_t iExitCode) {
-  return static_cast<CFWL_AppImp*>(GetImpl())->Exit(iExitCode);
-}
-
-CFWL_AppImp::CFWL_AppImp(IFWL_App* pIface, IFWL_AdapterNative* pAdapter)
-    : CFWL_NoteThreadImp(pIface),
-      m_pAdapterNative(pAdapter),
-      m_pThemeProvider(nullptr) {}
-
-CFWL_AppImp::~CFWL_AppImp() {
-  CFWL_ToolTipContainer::DeleteInstance();
-}
-
-FWL_ERR CFWL_AppImp::Initialize() {
-  if (!m_pWidgetMgr) {
-    m_pWidgetMgr.reset(new CFWL_WidgetMgr(m_pAdapterNative));
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_AppImp::Finalize() {
-  m_pWidgetMgr.reset();
-  return FWL_ERR_Succeeded;
-}
-IFWL_AdapterNative* CFWL_AppImp::GetAdapterNative() const {
-  return m_pAdapterNative;
-}
-IFWL_AdapterWidgetMgr* FWL_GetAdapterWidgetMgr() {
-  return static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr())
-      ->GetAdapterWidgetMgr();
-}
-IFWL_WidgetMgr* CFWL_AppImp::GetWidgetMgr() const {
-  return m_pWidgetMgr.get();
-}
-FWL_ERR CFWL_AppImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  m_pThemeProvider = pThemeProvider;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_AppImp::Exit(int32_t iExitCode) {
-  while (m_pNoteDriver->PopNoteLoop()) {
-    continue;
-  }
-  return m_pWidgetMgr->GetAdapterWidgetMgr()->Exit(0);
-}
-IFWL_ThemeProvider* CFWL_AppImp::GetThemeProvider() const {
-  return m_pThemeProvider;
-}
-IFWL_AdapterNative* FWL_GetAdapterNative() {
-  IFWL_App* pApp = FWL_GetApp();
-  if (!pApp)
-    return NULL;
-  return pApp->GetAdapterNative();
-}
-IFWL_ThemeProvider* FWL_GetThemeProvider() {
-  return NULL;
-}
-static IFWL_App* _theApp = NULL;
-IFWL_App* FWL_GetApp() {
-  return _theApp;
-}
-void FWL_SetApp(IFWL_App* pApp) {
-  _theApp = pApp;
-}
-FWL_ERR FWL_SetFullScreen(IFWL_Widget* pWidget, FX_BOOL bFullScreen) {
-  if (!pWidget)
-    return FWL_ERR_Succeeded;
-  IFWL_NoteThread* pNoteTread = pWidget->GetOwnerThread();
-  if (!pNoteTread)
-    return FWL_ERR_Succeeded;
-  CFWL_NoteDriver* pNoteDriver =
-      static_cast<CFWL_NoteDriver*>(pNoteTread->GetNoteDriver());
-  if (!pNoteTread)
-    return FWL_ERR_Succeeded;
-  pNoteDriver->NotifyFullScreenMode(pWidget, bFullScreen);
-  return FWL_GetAdapterWidgetMgr()->SetFullScreen(pWidget, bFullScreen);
-}
diff --git a/xfa/src/fwl/core/fwl_appimp.h b/xfa/src/fwl/core/fwl_appimp.h
deleted file mode 100644
index fa4ffec..0000000
--- a/xfa/src/fwl/core/fwl_appimp.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_APPIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_APPIMP_H_
-
-#include <memory>
-
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-
-class CFWL_WidgetMgr;
-class IFWL_AdapterNative;
-class IFWL_WidgetMgr;
-class IFWL_ThemeProvider;
-class IFWL_App;
-
-class CFWL_AppImp : public CFWL_NoteThreadImp {
- public:
-  CFWL_AppImp(IFWL_App* pIface, IFWL_AdapterNative* pAdapter);
-  virtual ~CFWL_AppImp();
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual IFWL_AdapterNative* GetAdapterNative() const;
-  virtual IFWL_WidgetMgr* GetWidgetMgr() const;
-  virtual IFWL_ThemeProvider* GetThemeProvider() const;
-  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
-  virtual FWL_ERR Exit(int32_t iExitCode = 0);
-
- protected:
-  IFWL_AdapterNative* const m_pAdapterNative;
-  std::unique_ptr<CFWL_WidgetMgr> m_pWidgetMgr;
-  IFWL_ThemeProvider* m_pThemeProvider;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_APPIMP_H_
diff --git a/xfa/src/fwl/core/fwl_contentimp.cpp b/xfa/src/fwl/core/fwl_contentimp.cpp
deleted file mode 100644
index d415e33..0000000
--- a/xfa/src/fwl/core/fwl_contentimp.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_contentimp.h"
-
-#include "xfa/include/fwl/core/fwl_content.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-FWL_ERR IFWL_Content::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->InsertWidget(pChild, nIndex);
-}
-FWL_ERR IFWL_Content::RemoveWidget(IFWL_Widget* pWidget) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->RemoveWidget(pWidget);
-}
-FWL_ERR IFWL_Content::RemoveAllWidgets() {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->RemoveAllWidgets();
-}
-FWL_ERR IFWL_Content::GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->GetMinSize(fWidth, fHeight);
-}
-FWL_ERR IFWL_Content::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->SetMinSize(fWidth, fHeight);
-}
-FWL_ERR IFWL_Content::GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->GetMaxSize(fWidth, fHeight);
-}
-FWL_ERR IFWL_Content::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
-  return static_cast<CFWL_ContentImp*>(GetImpl())->SetMaxSize(fWidth, fHeight);
-}
-IFWL_Content::IFWL_Content() {}
-CFWL_ContentImp::CFWL_ContentImp(const CFWL_WidgetImpProperties& properties,
-                                 IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_fWidthMin(0),
-      m_fWidthMax(10000),
-      m_fHeightMin(0),
-      m_fHeightMax(10000) {}
-CFWL_ContentImp::~CFWL_ContentImp() {}
-FWL_ERR CFWL_ContentImp::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
-  if (!pChild)
-    return FWL_ERR_Indefinite;
-  pChild->SetParent(m_pInterface);
-  if (nIndex == -1) {
-    return FWL_ERR_Succeeded;
-  }
-  CFWL_WidgetMgr* pMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pMgr)
-    return FWL_ERR_Indefinite;
-  pMgr->SetWidgetIndex(pChild, nIndex);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::RemoveWidget(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FWL_ERR_Indefinite;
-  pWidget->SetParent(NULL);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::RemoveAllWidgets() {
-  CFWL_WidgetMgr* pMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pMgr)
-    return FWL_ERR_Indefinite;
-  while (IFWL_Widget* widget =
-             pMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild)) {
-    pMgr->SetParent(NULL, widget);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
-  fWidth = m_fWidthMin;
-  fHeight = m_fHeightMin;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
-  m_fWidthMin = fWidth;
-  m_fHeightMin = fHeight;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) {
-  fWidth = m_fWidthMax;
-  fHeight = m_fHeightMax;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ContentImp::SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight) {
-  m_fWidthMax = fWidth;
-  m_fHeightMax = fHeight;
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/core/fwl_contentimp.h b/xfa/src/fwl/core/fwl_contentimp.h
deleted file mode 100644
index d2b0277..0000000
--- a/xfa/src/fwl/core/fwl_contentimp.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_CONTENTIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_CONTENTIMP_H_
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class IFWL_Widget;
-
-class CFWL_ContentImp : public CFWL_WidgetImp {
- public:
-  CFWL_ContentImp(const CFWL_WidgetImpProperties& properties,
-                  IFWL_Widget* pOuter);
-
-  virtual ~CFWL_ContentImp();
-  virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
-  virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
-  virtual FWL_ERR RemoveAllWidgets();
-  FWL_ERR GetMinSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
-  FWL_ERR SetMinSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
-  FWL_ERR GetMaxSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
-  FWL_ERR SetMaxSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
-
- protected:
-  FX_FLOAT m_fWidthMin;
-  FX_FLOAT m_fWidthMax;
-  FX_FLOAT m_fHeightMin;
-  FX_FLOAT m_fHeightMax;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_CONTENTIMP_H_
diff --git a/xfa/src/fwl/core/fwl_formimp.cpp b/xfa/src/fwl/core/fwl_formimp.cpp
deleted file mode 100644
index 558ee00..0000000
--- a/xfa/src/fwl/core/fwl_formimp.cpp
+++ /dev/null
@@ -1,1175 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_formimp.h"
-
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_content.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/basewidget/fwl_formproxyimp.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-#define FWL_SYSBTNSIZE 21
-#define FWL_SYSBTNMARGIN 5
-#define FWL_SYSBTNSPAN 2
-#define FWL_CornerEnlarge 10
-
-// static
-IFWL_Form* IFWL_Form::CreateFormProxy(CFWL_WidgetImpProperties& properties,
-                                      CFX_WideString* classname,
-                                      IFWL_Widget* pOuter) {
-  IFWL_Form* pForm = new IFWL_Form;
-  CFWL_FormProxyImp* pFormProxyImpl = new CFWL_FormProxyImp(properties, pOuter);
-  pForm->SetImpl(pFormProxyImpl);
-  pFormProxyImpl->SetInterface(pForm);
-  return pForm;
-}
-IFWL_Form::IFWL_Form() {}
-FWL_FORMSIZE IFWL_Form::GetFormSize() {
-  return static_cast<CFWL_FormImp*>(GetImpl())->GetFormSize();
-}
-FWL_ERR IFWL_Form::SetFormSize(FWL_FORMSIZE eFormSize) {
-  return static_cast<CFWL_FormImp*>(GetImpl())->SetFormSize(eFormSize);
-}
-IFWL_Widget* IFWL_Form::DoModal() {
-  return static_cast<CFWL_FormImp*>(GetImpl())->DoModal();
-}
-IFWL_Widget* IFWL_Form::DoModal(FX_DWORD& dwCommandID) {
-  return static_cast<CFWL_FormImp*>(GetImpl())->DoModal(dwCommandID);
-}
-FWL_ERR IFWL_Form::EndDoModal() {
-  return static_cast<CFWL_FormImp*>(GetImpl())->EndDoModal();
-}
-FWL_ERR IFWL_Form::SetBorderRegion(CFX_Path* pPath) {
-  return static_cast<CFWL_FormImp*>(GetImpl())->SetBorderRegion(pPath);
-}
-
-CFWL_FormImp::CFWL_FormImp(const CFWL_WidgetImpProperties& properties,
-                           IFWL_Widget* pOuter)
-    : CFWL_PanelImp(properties, pOuter),
-      m_pCloseBox(NULL),
-      m_pMinBox(NULL),
-      m_pMaxBox(NULL),
-      m_pCaptionBox(NULL),
-      m_pNoteLoop(NULL),
-      m_pSubFocus(NULL),
-      m_fCXBorder(0),
-      m_fCYBorder(0),
-      m_iCaptureBtn(-1),
-      m_iSysBox(0),
-      m_eResizeType(FORM_RESIZETYPE_None),
-      m_bLButtonDown(FALSE),
-      m_bMaximized(FALSE),
-      m_bSetMaximize(FALSE),
-      m_bCustomizeLayout(FALSE),
-      m_eFormSize(FWL_FORMSIZE_Manual),
-      m_bDoModalFlag(FALSE),
-      m_pBigIcon(NULL),
-      m_pSmallIcon(NULL),
-      m_bMouseIn(FALSE) {
-  m_rtRelative.Reset();
-  m_rtCaption.Reset();
-  m_rtRestore.Reset();
-  m_rtCaptionText.Reset();
-  m_rtIcon.Reset();
-}
-CFWL_FormImp::~CFWL_FormImp() {
-  RemoveSysButtons();
-  delete m_pNoteLoop;
-}
-FWL_ERR CFWL_FormImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Form;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_FormImp::GetClassID() const {
-  return FWL_CLASSHASH_Form;
-}
-FX_BOOL CFWL_FormImp::IsInstance(const CFX_WideStringC& wsClass) const {
-  if (wsClass == CFX_WideStringC(FWL_CLASS_Form)) {
-    return TRUE;
-  }
-  return CFWL_PanelImp::IsInstance(wsClass);
-}
-FWL_ERR CFWL_FormImp::Initialize() {
-  if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  RegisterForm();
-  RegisterEventTarget();
-  m_pDelegate = new CFWL_FormImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_FormImp::Finalize() {
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  UnregisterEventTarget();
-  UnRegisterForm();
-  return CFWL_WidgetImp::Finalize();
-}
-FWL_ERR CFWL_FormImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.Reset();
-    FX_FLOAT fCapHeight = GetCaptionHeight();
-    FX_FLOAT fCXBorder = GetBorderSize(TRUE);
-    FX_FLOAT fCYBorder = GetBorderSize(FALSE);
-    FX_FLOAT fEdge = GetEdgeWidth();
-    if (m_pContent) {
-      m_pContent->GetWidgetRect(rect, TRUE);
-    }
-    rect.height += fCapHeight + fCYBorder + fEdge + fEdge;
-    rect.width += fCXBorder + fCXBorder + fEdge + fEdge;
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_FormImp::GetClientRect(CFX_RectF& rect) {
-  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) == 0) {
-    rect = m_pProperties->m_rtWidget;
-    rect.Offset(-rect.left, -rect.top);
-    return FWL_ERR_Succeeded;
-  }
-#ifdef FWL_UseMacSystemBorder
-  rect = m_rtRelative;
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return FWL_ERR_Indefinite;
-  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
-  FX_FLOAT l, t, r, b;
-  l = t = r = b = 0;
-  adapterWidgetMgr->GetSystemBorder(l, t, r, b);
-  rect.Deflate(l, t, r, b);
-  rect.left = rect.top = 0;
-  return FWL_ERR_Succeeded;
-#else
-  FX_FLOAT x = 0;
-  FX_FLOAT y = 0;
-  FX_FLOAT t = 0;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (pTheme) {
-    CFWL_ThemePart part;
-    part.m_pWidget = m_pInterface;
-    x = *static_cast<FX_FLOAT*>(
-        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CXBorder));
-    y = *static_cast<FX_FLOAT*>(
-        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_CYBorder));
-    t = *static_cast<FX_FLOAT*>(
-        pTheme->GetCapacity(&part, FWL_WGTCAPACITY_FRM_CYCaption));
-  }
-  rect = m_pProperties->m_rtWidget;
-  rect.Offset(-rect.left, -rect.top);
-  rect.Deflate(x, t, x, y);
-  return FWL_ERR_Succeeded;
-#endif
-}
-FWL_ERR CFWL_FormImp::Update() {
-  if (m_iLock > 0) {
-    return FWL_ERR_Succeeded;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
-    m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-#ifdef FWL_UseMacSystemBorder
-#else
-  SetThemeData();
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
-    UpdateIcon();
-  }
-#endif
-  UpdateCaption();
-  Layout();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_FormImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  (void)GetAvailableTheme();
-  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_CloseBox;
-  }
-  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_MaxBox;
-  }
-  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_MinBox;
-  }
-  CFX_RectF rtCap;
-  rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
-            m_rtCaption.width - FWL_SYSBTNSIZE * m_iSysBox - 2 * m_fCYBorder,
-            m_rtCaption.height - m_fCXBorder);
-  if (rtCap.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Titlebar;
-  }
-  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize)) {
-    FX_FLOAT fWidth =
-        m_rtRelative.width - 2 * (m_fCYBorder + FWL_CornerEnlarge);
-    FX_FLOAT fHeight =
-        m_rtRelative.height - 2 * (m_fCXBorder + FWL_CornerEnlarge);
-    CFX_RectF rt;
-    rt.Set(0, m_fCXBorder + FWL_CornerEnlarge, m_fCYBorder, fHeight);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Left;
-    }
-    rt.Set(m_rtRelative.width - m_fCYBorder, m_fCXBorder + FWL_CornerEnlarge,
-           m_fCYBorder, fHeight);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Right;
-    }
-    rt.Set(m_fCYBorder + FWL_CornerEnlarge, 0, fWidth, m_fCXBorder);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Top;
-    }
-    rt.Set(m_fCYBorder + FWL_CornerEnlarge, m_rtRelative.height - m_fCXBorder,
-           fWidth, m_fCXBorder);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Bottom;
-    }
-    rt.Set(0, 0, m_fCYBorder + FWL_CornerEnlarge,
-           m_fCXBorder + FWL_CornerEnlarge);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_LeftTop;
-    }
-    rt.Set(0, m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge,
-           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_LeftBottom;
-    }
-    rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge, 0,
-           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_RightTop;
-    }
-    rt.Set(m_rtRelative.width - m_fCYBorder - FWL_CornerEnlarge,
-           m_rtRelative.height - m_fCXBorder - FWL_CornerEnlarge,
-           m_fCYBorder + FWL_CornerEnlarge, m_fCXBorder + FWL_CornerEnlarge);
-    if (rt.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_RightBottom;
-    }
-  }
-  return FWL_WGTHITTEST_Client;
-}
-FWL_ERR CFWL_FormImp::DrawWidget(CFX_Graphics* pGraphics,
-                                 const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_ERR_Indefinite;
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  FX_BOOL bInactive = !IsActive();
-  int32_t iState =
-      bInactive ? FWL_PARTSTATE_FRM_Inactive : FWL_PARTSTATE_FRM_Normal;
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0) {
-    DrawBackground(pGraphics, pTheme);
-  }
-#ifdef FWL_UseMacSystemBorder
-  return FWL_ERR_Succeeded;
-#endif
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_dwStates = iState;
-  param.m_pGraphics = pGraphics;
-  param.m_rtPart = m_rtRelative;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
-    param.m_iPart = FWL_PART_FRM_Border;
-    pTheme->DrawBackground(&param);
-  }
-  if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) !=
-      FWL_WGTSTYLE_EdgeNone) {
-    CFX_RectF rtEdge;
-    GetEdgeRect(rtEdge);
-    param.m_iPart = FWL_PART_FRM_Edge;
-    param.m_rtPart = rtEdge;
-    param.m_dwStates = iState;
-    pTheme->DrawBackground(&param);
-  }
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
-    param.m_iPart = FWL_PART_FRM_Caption;
-    param.m_dwStates = iState;
-    param.m_rtPart = m_rtCaption;
-    pTheme->DrawBackground(&param);
-    DrawCaptionText(pGraphics, pTheme, pMatrix);
-  } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
-    param.m_iPart = FWL_PART_FRM_NarrowCaption;
-    param.m_dwStates = iState;
-    param.m_rtPart = m_rtCaption;
-    pTheme->DrawBackground(&param);
-    DrawCaptionText(pGraphics, pTheme, pMatrix);
-  }
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
-    param.m_iPart = FWL_PART_FRM_Icon;
-    if (HasIcon()) {
-      DrawIconImage(pGraphics, pTheme, pMatrix);
-    }
-  }
-#if (_FX_OS_ == _FX_MACOSX_)
-  {
-    if (m_pCloseBox) {
-      param.m_iPart = FWL_PART_FRM_CloseBox;
-      param.m_dwStates = m_pCloseBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
-      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
-      }
-      param.m_rtPart = m_pCloseBox->m_rtBtn;
-      pTheme->DrawBackground(&param);
-    }
-    if (m_pMaxBox) {
-      param.m_iPart = FWL_PART_FRM_MaximizeBox;
-      param.m_dwStates = m_pMaxBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
-      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
-      }
-      param.m_rtPart = m_pMaxBox->m_rtBtn;
-      param.m_dwData = m_bMaximized;
-      pTheme->DrawBackground(&param);
-    }
-    if (m_pMinBox) {
-      param.m_iPart = FWL_PART_FRM_MinimizeBox;
-      param.m_dwStates = m_pMinBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Disabled;
-      } else if (FWL_PARTSTATE_FRM_Normal == param.m_dwStates && m_bMouseIn) {
-        param.m_dwStates = FWL_PARTSTATE_FRM_Hover;
-      }
-      param.m_rtPart = m_pMinBox->m_rtBtn;
-      pTheme->DrawBackground(&param);
-    }
-    m_bMouseIn = FALSE;
-  }
-#else
-  {
-    if (m_pCloseBox) {
-      param.m_iPart = FWL_PART_FRM_CloseBox;
-      param.m_dwStates = m_pCloseBox->GetPartState();
-      param.m_rtPart = m_pCloseBox->m_rtBtn;
-      pTheme->DrawBackground(&param);
-    }
-    if (m_pMaxBox) {
-      param.m_iPart = FWL_PART_FRM_MaximizeBox;
-      param.m_dwStates = m_pMaxBox->GetPartState();
-      param.m_rtPart = m_pMaxBox->m_rtBtn;
-      param.m_dwData = m_bMaximized;
-      pTheme->DrawBackground(&param);
-    }
-    if (m_pMinBox) {
-      param.m_iPart = FWL_PART_FRM_MinimizeBox;
-      param.m_dwStates = m_pMinBox->GetPartState();
-      param.m_rtPart = m_pMinBox->m_rtBtn;
-      pTheme->DrawBackground(&param);
-    }
-  }
-#endif
-  return FWL_ERR_Succeeded;
-}
-FWL_FORMSIZE CFWL_FormImp::GetFormSize() {
-  return m_eFormSize;
-}
-FWL_ERR CFWL_FormImp::SetFormSize(FWL_FORMSIZE eFormSize) {
-  m_eFormSize = eFormSize;
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_FormImp::DoModal() {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return NULL;
-  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
-  if (!pDriver)
-    return NULL;
-  m_pNoteLoop = new CFWL_NoteLoop(this);
-  pDriver->PushNoteLoop(m_pNoteLoop);
-  m_bDoModalFlag = TRUE;
-  SetStates(FWL_WGTSTATE_Invisible, FALSE);
-  pDriver->Run();
-#if (_FX_OS_ == _FX_MACOSX_)
-#else
-  pDriver->PopNoteLoop();
-#endif
-  delete m_pNoteLoop;
-  m_pNoteLoop = NULL;
-  return NULL;
-}
-IFWL_Widget* CFWL_FormImp::DoModal(FX_DWORD& dwCommandID) {
-  return DoModal();
-}
-FWL_ERR CFWL_FormImp::EndDoModal() {
-  if (!m_pNoteLoop)
-    return FWL_ERR_Indefinite;
-  m_bDoModalFlag = FALSE;
-#if (_FX_OS_ == _FX_MACOSX_)
-  m_pNoteLoop->EndModalLoop();
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return FWL_ERR_Indefinite;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  if (!pDriver)
-    return FWL_ERR_Indefinite;
-  pDriver->PopNoteLoop();
-  SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  return FWL_ERR_Succeeded;
-#else
-  SetStates(FWL_WGTSTATE_Invisible, TRUE);
-  return m_pNoteLoop->EndModalLoop();
-#endif
-}
-FWL_ERR CFWL_FormImp::SetBorderRegion(CFX_Path* pPath) {
-  return FWL_ERR_Succeeded;
-}
-void CFWL_FormImp::DrawBackground(CFX_Graphics* pGraphics,
-                                  IFWL_ThemeProvider* pTheme) {
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_FRM_Background;
-  param.m_pGraphics = pGraphics;
-  param.m_rtPart = m_rtRelative;
-  param.m_rtPart.Deflate(m_fCYBorder, m_rtCaption.height, m_fCYBorder,
-                         m_fCXBorder);
-  pTheme->DrawBackground(&param);
-}
-CFWL_WidgetImp* CFWL_FormImp::GetSubFocus() {
-  return m_pSubFocus;
-}
-void CFWL_FormImp::SetSubFocus(CFWL_WidgetImp* pWidget) {
-  m_pSubFocus = pWidget;
-}
-CFX_MapAccelerators& CFWL_FormImp::GetAccelerator() {
-  return m_mapAccelerators;
-}
-void CFWL_FormImp::SetAccelerator(CFX_MapAccelerators* pAccelerators) {
-  if (!pAccelerators)
-    return;
-  m_mapAccelerators.RemoveAll();
-  FX_DWORD vrKey, rValue;
-  FX_POSITION pos = pAccelerators->GetStartPosition();
-  while (pos) {
-    pAccelerators->GetNextAssoc(pos, vrKey, rValue);
-    m_mapAccelerators.SetAt(vrKey, rValue);
-  }
-}
-void CFWL_FormImp::ShowChildWidget(IFWL_Widget* pParent) {
-  IFWL_App* pApp = FWL_GetApp();
-  if (!pApp)
-    return;
-  CFWL_WidgetMgr* pWidgetMgr =
-      static_cast<CFWL_WidgetMgr*>(pApp->GetWidgetMgr());
-  if (!pWidgetMgr)
-    return;
-  IFWL_Widget* pChild =
-      pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
-  while (pChild) {
-    pWidgetMgr->ShowWidget_Native(pChild);
-    ShowChildWidget(pChild);
-    pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
-  }
-}
-void CFWL_FormImp::RemoveSysButtons() {
-  m_rtCaption.Reset();
-  if (m_pCloseBox) {
-    delete m_pCloseBox;
-    m_pCloseBox = NULL;
-  }
-  if (m_pMinBox) {
-    delete m_pMinBox;
-    m_pMinBox = NULL;
-  }
-  if (m_pMaxBox) {
-    delete m_pMaxBox;
-    m_pMaxBox = NULL;
-  }
-  if (m_pCaptionBox) {
-    delete m_pCaptionBox;
-    m_pCaptionBox = NULL;
-  }
-}
-void CFWL_FormImp::CalcContentRect(CFX_RectF& rtContent) {
-#ifdef FWL_UseMacSystemBorder
-  rtContent = m_rtRelative;
-#else
-  GetEdgeRect(rtContent);
-  if (HasEdge()) {
-    FX_FLOAT fEdge = GetEdgeWidth();
-    rtContent.Deflate(fEdge, fEdge);
-  }
-#endif
-}
-CFWL_SysBtn* CFWL_FormImp::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
-    return m_pCloseBox;
-  }
-  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
-    return m_pMaxBox;
-  }
-  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
-    return m_pMinBox;
-  }
-  if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy)) {
-    return m_pCaptionBox;
-  }
-  return NULL;
-}
-CFWL_SysBtn* CFWL_FormImp::GetSysBtnByState(FX_DWORD dwState) {
-  if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) {
-    return m_pCloseBox;
-  }
-  if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) {
-    return m_pMaxBox;
-  }
-  if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) {
-    return m_pMinBox;
-  }
-  if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState)) {
-    return m_pCaptionBox;
-  }
-  return NULL;
-}
-CFWL_SysBtn* CFWL_FormImp::GetSysBtnByIndex(int32_t nIndex) {
-  if (nIndex < 0) {
-    return NULL;
-  }
-  CFX_PtrArray arrBtn;
-  if (m_pMinBox) {
-    arrBtn.Add(m_pMinBox);
-  }
-  if (m_pMaxBox) {
-    arrBtn.Add(m_pMaxBox);
-  }
-  if (m_pCloseBox) {
-    arrBtn.Add(m_pCloseBox);
-  }
-  return static_cast<CFWL_SysBtn*>(arrBtn[nIndex]);
-}
-int32_t CFWL_FormImp::GetSysBtnIndex(CFWL_SysBtn* pBtn) {
-  CFX_PtrArray arrBtn;
-  if (m_pMinBox) {
-    arrBtn.Add(m_pMinBox);
-  }
-  if (m_pMaxBox) {
-    arrBtn.Add(m_pMaxBox);
-  }
-  if (m_pCloseBox) {
-    arrBtn.Add(m_pCloseBox);
-  }
-  return arrBtn.Find(pBtn);
-}
-FX_FLOAT CFWL_FormImp::GetCaptionHeight() {
-  FX_DWORD dwCapacity = 0;
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
-    dwCapacity = FWL_WGTCAPACITY_FRM_CYCaption;
-  } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
-    dwCapacity = FWL_WGTCAPACITY_FRM_CYNarrowCaption;
-  }
-  if (dwCapacity > 0) {
-    FX_FLOAT* pfCapHeight =
-        static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
-    return pfCapHeight ? *pfCapHeight : 0;
-  }
-  return 0;
-}
-void CFWL_FormImp::DrawCaptionText(CFX_Graphics* pGs,
-                                   IFWL_ThemeProvider* pTheme,
-                                   const CFX_Matrix* pMatrix) {
-  CFX_WideString wsText;
-  IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
-  pData->GetCaption(m_pInterface, wsText);
-  if (wsText.IsEmpty()) {
-    return;
-  }
-  CFWL_ThemeText textParam;
-  textParam.m_pWidget = m_pInterface;
-  textParam.m_iPart = FWL_PART_FRM_Caption;
-  textParam.m_dwStates = FWL_PARTSTATE_FRM_Normal;
-  textParam.m_pGraphics = pGs;
-  if (pMatrix) {
-    textParam.m_matrix.Concat(*pMatrix);
-  }
-  CFX_RectF rtText;
-  if (m_bCustomizeLayout) {
-    rtText = m_rtCaptionText;
-    rtText.top -= 5;
-  } else {
-    rtText = m_rtCaption;
-    FX_FLOAT fpos;
-    fpos = HasIcon() ? 29.0f : 13.0f;
-    rtText.left += fpos;
-  }
-  textParam.m_rtPart = rtText;
-  textParam.m_wsText = wsText;
-  textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine | FDE_TTOSTYLE_Ellipsis;
-  textParam.m_iTTOAlign = m_bCustomizeLayout ? FDE_TTOALIGNMENT_Center
-                                             : FDE_TTOALIGNMENT_CenterLeft;
-  pTheme->DrawText(&textParam);
-}
-void CFWL_FormImp::DrawIconImage(CFX_Graphics* pGs,
-                                 IFWL_ThemeProvider* pTheme,
-                                 const CFX_Matrix* pMatrix) {
-  IFWL_FormDP* pData =
-      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = FWL_PART_FRM_Icon;
-  param.m_pGraphics = pGs;
-  param.m_pImage = pData->GetIcon(m_pInterface, FALSE);
-  param.m_rtPart = m_rtIcon;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix);
-  }
-  pTheme->DrawBackground(&param);
-}
-void CFWL_FormImp::GetEdgeRect(CFX_RectF& rtEdge) {
-  rtEdge = m_rtRelative;
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
-    FX_FLOAT fCX = GetBorderSize();
-    FX_FLOAT fCY = GetBorderSize(FALSE);
-    rtEdge.Deflate(fCX, m_rtCaption.Height(), fCX, fCY);
-  }
-}
-void CFWL_FormImp::SetWorkAreaRect() {
-  m_rtRestore = m_pProperties->m_rtWidget;
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return;
-  m_bSetMaximize = TRUE;
-  pWidgetMgr->SetMaximize_Native(m_pInterface);
-  Repaint(&m_rtRelative);
-}
-void CFWL_FormImp::SetCursor(FX_FLOAT fx, FX_FLOAT fy) {}
-void CFWL_FormImp::Layout() {
-  GetRelativeRect(m_rtRelative);
-#ifndef FWL_UseMacSystemBorder
-  ReSetSysBtn();
-#endif
-  if (m_pContent) {
-    CFX_RectF rtClient;
-    GetClientRect(rtClient);
-    m_pContent->SetWidgetRect(rtClient);
-    m_pContent->Update();
-  }
-}
-void CFWL_FormImp::ReSetSysBtn() {
-  m_fCXBorder =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_CXBorder));
-  m_fCYBorder =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_CYBorder));
-  RemoveSysButtons();
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  m_bCustomizeLayout = pTheme->IsCustomizedLayout(m_pInterface);
-  FX_FLOAT fCapHeight = GetCaptionHeight();
-  if (fCapHeight > 0) {
-    m_rtCaption = m_rtRelative;
-    m_rtCaption.height = fCapHeight;
-  }
-  m_iSysBox = 0;
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) {
-    m_pCloseBox = new CFWL_SysBtn;
-    if (m_bCustomizeLayout) {
-      CFWL_ThemeBackground param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_FRM_CloseBox;
-      pTheme->GetPartRect(&param, m_pCloseBox->m_rtBtn);
-    } else {
-      m_pCloseBox->m_rtBtn.Set(
-          m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
-          FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-    }
-    m_iSysBox++;
-  }
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MaximizeBox) {
-    m_pMaxBox = new CFWL_SysBtn;
-    if (m_bCustomizeLayout) {
-      CFWL_ThemeBackground param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_FRM_MaximizeBox;
-      pTheme->GetPartRect(&param, m_pMaxBox->m_rtBtn);
-    } else {
-      if (m_pCloseBox) {
-        m_pMaxBox->m_rtBtn.Set(
-            m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
-            m_pCloseBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-      } else {
-        m_pMaxBox->m_rtBtn.Set(
-            m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
-            FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-      }
-    }
-    m_iSysBox++;
-  }
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MinimizeBox) {
-    m_pMinBox = new CFWL_SysBtn;
-    if (m_bCustomizeLayout) {
-      CFWL_ThemeBackground param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_FRM_MinimizeBox;
-      pTheme->GetPartRect(&param, m_pMinBox->m_rtBtn);
-    } else {
-      if (m_pMaxBox) {
-        m_pMinBox->m_rtBtn.Set(
-            m_pMaxBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
-            m_pMaxBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-      } else if (m_pCloseBox) {
-        m_pMinBox->m_rtBtn.Set(
-            m_pCloseBox->m_rtBtn.left - FWL_SYSBTNSPAN - FWL_SYSBTNSIZE,
-            m_pCloseBox->m_rtBtn.top, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-      } else {
-        m_pMinBox->m_rtBtn.Set(
-            m_rtRelative.right() - FWL_SYSBTNMARGIN - FWL_SYSBTNSIZE,
-            FWL_SYSBTNMARGIN, FWL_SYSBTNSIZE, FWL_SYSBTNSIZE);
-      }
-    }
-    m_iSysBox++;
-  }
-  IFWL_FormDP* pData =
-      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon &&
-      pData->GetIcon(m_pInterface, FALSE)) {
-    if (m_bCustomizeLayout) {
-      CFWL_ThemeBackground param;
-      param.m_pWidget = m_pInterface;
-      param.m_iPart = FWL_PART_FRM_Icon;
-      CFX_WideString wsText;
-      m_pProperties->m_pDataProvider->GetCaption(m_pInterface, wsText);
-      param.m_pData = &wsText;
-      pTheme->GetPartRect(&param, m_rtIcon);
-    } else {
-      m_rtIcon.Set(5, (m_rtCaption.height - m_fSmallIconSz) / 2, m_fSmallIconSz,
-                   m_fSmallIconSz);
-    }
-  }
-  if (m_bCustomizeLayout) {
-    CFWL_ThemeText parma;
-    parma.m_pWidget = m_pInterface;
-    parma.m_iPart = FWL_PART_FRM_HeadText;
-    m_pProperties->m_pDataProvider->GetCaption(m_pInterface, parma.m_wsText);
-    pTheme->GetPartRect(&parma, m_rtCaptionText);
-  }
-}
-void CFWL_FormImp::RegisterForm() {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  if (!pDriver)
-    return;
-  pDriver->RegisterForm(this);
-}
-void CFWL_FormImp::UnRegisterForm() {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  if (!pDriver)
-    return;
-  pDriver->UnRegisterForm(this);
-}
-FX_BOOL CFWL_FormImp::IsDoModal() {
-  return m_bDoModalFlag;
-}
-void CFWL_FormImp::SetThemeData() {
-  m_fSmallIconSz =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FRM_SmallIcon));
-  m_fBigIconSz =
-      *static_cast<FX_FLOAT*>(GetThemeCapacity(FWL_WGTCAPACITY_FRM_BigIcon));
-}
-FX_BOOL CFWL_FormImp::HasIcon() {
-  IFWL_FormDP* pData =
-      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
-  return !!pData->GetIcon(m_pInterface, FALSE);
-}
-void CFWL_FormImp::UpdateIcon() {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return;
-  IFWL_FormDP* pData =
-      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
-  CFX_DIBitmap* pBigIcon = pData->GetIcon(m_pInterface, TRUE);
-  CFX_DIBitmap* pSmallIcon = pData->GetIcon(m_pInterface, FALSE);
-  if (pBigIcon && pBigIcon != m_pBigIcon) {
-    m_pBigIcon = pBigIcon;
-    pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, TRUE);
-  }
-  if (pSmallIcon && pSmallIcon != m_pSmallIcon) {
-    m_pSmallIcon = pSmallIcon;
-    pWidgetMgr->SetWidgetIcon_Native(m_pInterface, m_pBigIcon, FALSE);
-  }
-}
-void CFWL_FormImp::UpdateCaption() {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return;
-  IFWL_FormDP* pData =
-      static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
-  if (!pData)
-    return;
-  CFX_WideString text;
-  pData->GetCaption(m_pInterface, text);
-  pWidgetMgr->SetWidgetCaption_Native(m_pInterface, text);
-}
-void CFWL_FormImp::DoWidthLimit(FX_FLOAT& fLeft,
-                                FX_FLOAT& fWidth,
-                                FX_FLOAT fCurX,
-                                FX_FLOAT fSpace,
-                                FX_FLOAT fLimitMin,
-                                FX_FLOAT fLimitMax,
-                                FX_BOOL bLeft) {
-  FX_FLOAT fx = fCurX;
-  FX_FLOAT fy = 0;
-  TransformTo(NULL, fx, fy);
-  FX_FLOAT fTemp =
-      bLeft ? (fWidth - fx + fLeft + fSpace) : (fx - fLeft + fSpace);
-  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
-    fWidth = fTemp;
-    fLeft += bLeft ? (fx - fLeft - fSpace) : 0;
-  } else {
-    if (fTemp < fLimitMin && fWidth > fLimitMin) {
-      fLeft += bLeft ? (fWidth - fLimitMin) : 0;
-      fWidth = fLimitMin;
-    } else if (fTemp > fLimitMax && fWidth < fLimitMax) {
-      fLeft -= bLeft ? (fLimitMax - fWidth) : 0;
-      fWidth = fLimitMax;
-    }
-  }
-}
-void CFWL_FormImp::DoHeightLimit(FX_FLOAT& fTop,
-                                 FX_FLOAT& fHeight,
-                                 FX_FLOAT fCurY,
-                                 FX_FLOAT fSpace,
-                                 FX_FLOAT fLimitMin,
-                                 FX_FLOAT fLimitMax,
-                                 FX_BOOL bTop) {
-  FX_FLOAT fx = 0;
-  FX_FLOAT fy = fCurY;
-  TransformTo(NULL, fx, fy);
-  FX_FLOAT fTemp = bTop ? (fHeight - fy + fTop + fSpace) : (fy - fTop + fSpace);
-  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
-    fHeight = fTemp;
-    fTop += bTop ? (fy - fTop - fSpace) : 0;
-  } else {
-    if (fTemp < fLimitMin && fHeight > fLimitMin) {
-      fTop += bTop ? (fHeight - fLimitMin) : 0;
-      fHeight = fLimitMin;
-    } else if (fTemp > fLimitMax && fHeight < fLimitMax) {
-      fTop -= bTop ? (fLimitMax - fHeight) : 0;
-      fHeight = fLimitMax;
-    }
-  }
-}
-CFWL_FormImpDelegate::CFWL_FormImpDelegate(CFWL_FormImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-#ifdef FWL_UseMacSystemBorder
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_Activate: {
-      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
-      break;
-    }
-    case FWL_MSGHASH_Deactivate: {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
-      break;
-    }
-  }
-  return FWL_ERR_Succeeded;
-#else
-  if (!pMessage)
-    return 0;
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  int32_t iRet = 1;
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_Activate: {
-      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-      IFWL_NoteThread* pThread = m_pOwner->GetOwnerThread();
-      CFWL_NoteDriver* pDriver =
-          static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-      CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
-      IFWL_Widget* pSubFocus =
-          pSubFocusImp ? pSubFocusImp->GetInterface() : NULL;
-      if (pSubFocus && pSubFocus != pDriver->GetFocus()) {
-        pDriver->SetFocus(pSubFocus);
-      }
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
-      break;
-    }
-    case FWL_MSGHASH_Deactivate: {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
-      IFWL_NoteThread* pThread = m_pOwner->GetOwnerThread();
-      CFWL_NoteDriver* pDriver =
-          static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-      CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
-      IFWL_Widget* pSubFocus =
-          pSubFocusImp ? pSubFocusImp->GetInterface() : NULL;
-      if (pSubFocus) {
-        if (pSubFocus == pDriver->GetFocus()) {
-          pDriver->SetFocus(NULL);
-        } else if (pSubFocus->GetStates() & FWL_WGTSTATE_Focused) {
-          CFWL_MsgKillFocus ms;
-          IFWL_WidgetDelegate* pDelegate = pSubFocus->SetDelegate(NULL);
-          if (pDelegate) {
-            pDelegate->OnProcessMessage(&ms);
-          }
-        }
-      }
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      switch (pMsg->m_dwCmd) {
-        case FWL_MSGMOUSECMD_LButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseMove: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseHover: {
-          OnMouseHover(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_MouseLeave: {
-          OnMouseLeave(pMsg);
-          break;
-        }
-        case FWL_MSGMOUSECMD_LButtonDblClk: {
-          OnLButtonDblClk(pMsg);
-          break;
-        }
-      }
-      break;
-    }
-    case FWL_MSGHASH_Size: {
-      CFWL_WidgetMgr* pWidgetMgr =
-          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-      if (!pWidgetMgr)
-        return 0;
-      pWidgetMgr->AddRedrawCounts(m_pOwner->m_pInterface);
-      if (!m_pOwner->m_bSetMaximize) {
-        break;
-      }
-      m_pOwner->m_bSetMaximize = FALSE;
-      CFWL_MsgSize* pMsg = static_cast<CFWL_MsgSize*>(pMessage);
-      CFX_RectF rt;
-      pWidgetMgr->GetWidgetRect_Native(m_pOwner->m_pInterface, rt);
-      m_pOwner->m_pProperties->m_rtWidget.left = rt.left;
-      m_pOwner->m_pProperties->m_rtWidget.top = rt.top;
-      m_pOwner->m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth;
-      m_pOwner->m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight;
-      m_pOwner->Update();
-      break;
-    }
-    case FWL_MSGHASH_WindowMove: {
-      OnWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage));
-      break;
-    }
-    case FWL_MSGHASH_Close: {
-      OnClose(static_cast<CFWL_MsgClose*>(pMessage));
-      break;
-    }
-    default: { iRet = 0; }
-  }
-  return iRet;
-#endif
-}
-FWL_ERR CFWL_FormImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  if (!pEvent)
-    return FWL_ERR_Indefinite;
-  if (pEvent->GetClassID() == FWL_EVTHASH_Close &&
-      pEvent->m_pSrcTarget == m_pOwner->m_pInterface) {
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_FormImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
-void CFWL_FormImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->m_bLButtonDown = TRUE;
-  m_pOwner->m_eResizeType = FORM_RESIZETYPE_None;
-  CFWL_SysBtn* pPressBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->m_iCaptureBtn = m_pOwner->GetSysBtnIndex(pPressBtn);
-  CFX_RectF rtCap;
-  rtCap.Set(m_pOwner->m_rtCaption.left + m_pOwner->m_fCYBorder,
-            m_pOwner->m_rtCaption.top + m_pOwner->m_fCXBorder,
-            m_pOwner->m_rtCaption.width - FWL_SYSBTNSIZE * m_pOwner->m_iSysBox -
-                2 * m_pOwner->m_fCYBorder,
-            m_pOwner->m_rtCaption.height - m_pOwner->m_fCXBorder);
-  if (pPressBtn) {
-    pPressBtn->SetPressed();
-    m_pOwner->Repaint(&pPressBtn->m_rtBtn);
-  } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_eResizeType = FORM_RESIZETYPE_Cap;
-  } else if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-             (m_pOwner->m_pProperties->m_dwStyleExes &
-              FWL_STYLEEXT_FRM_Resize) &&
-             !m_pOwner->m_bMaximized) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
-  }
-  m_pOwner->m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->m_InfoStart.m_szStart =
-      CFX_SizeF(m_pOwner->m_pProperties->m_rtWidget.width,
-                m_pOwner->m_pProperties->m_rtWidget.height);
-}
-void CFWL_FormImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetGrab(FALSE);
-  m_pOwner->m_bLButtonDown = FALSE;
-  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  CFWL_SysBtn* pPressedBtn =
-      m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn);
-  if (!pPressedBtn || pPointBtn != pPressedBtn) {
-    return;
-  }
-  if (pPressedBtn == m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) {
-    pPressedBtn->SetNormal();
-  }
-  if (pPressedBtn == m_pOwner->m_pMaxBox) {
-    if (m_pOwner->m_bMaximized) {
-      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
-      m_pOwner->Update();
-      m_pOwner->Repaint();
-    } else {
-      m_pOwner->SetWorkAreaRect();
-      m_pOwner->Update();
-    }
-    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
-  } else if (pPressedBtn == m_pOwner->m_pMinBox) {
-    CFWL_WidgetMgr* pWidgetMgr =
-        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-    if (!pWidgetMgr)
-      return;
-    pWidgetMgr->SetMinimize_Native(m_pOwner->m_pInterface);
-  } else {
-    CFWL_EvtClose eClose;
-    eClose.m_pSrcTarget = m_pOwner->m_pInterface;
-    m_pOwner->DispatchEvent(&eClose);
-  }
-}
-void CFWL_FormImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bLButtonDown) {
-    return;
-  }
-  if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-      (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-      !m_pOwner->m_bMaximized) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
-  }
-  CFX_RectF rtInvalidate;
-  rtInvalidate.Reset();
-  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  CFWL_SysBtn* pOldHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
-#if (_FX_OS_ == _FX_MACOSX_)
-  {
-    if (pOldHover && pPointBtn != pOldHover) {
-      pOldHover->SetNormal();
-    }
-    if (pPointBtn && pPointBtn != pOldHover) {
-      pPointBtn->SetHover();
-    }
-    if (m_pOwner->m_pCloseBox) {
-      rtInvalidate = m_pOwner->m_pCloseBox->m_rtBtn;
-    }
-    if (m_pOwner->m_pMaxBox) {
-      if (rtInvalidate.IsEmpty()) {
-        rtInvalidate = m_pOwner->m_pMaxBox->m_rtBtn;
-      } else {
-        rtInvalidate.Union(m_pOwner->m_pMaxBox->m_rtBtn);
-      }
-    }
-    if (m_pOwner->m_pMinBox) {
-      if (rtInvalidate.IsEmpty()) {
-        rtInvalidate = m_pOwner->m_pMinBox->m_rtBtn;
-      } else {
-        rtInvalidate.Union(m_pOwner->m_pMinBox->m_rtBtn);
-      }
-    }
-    if (!rtInvalidate.IsEmpty() &&
-        rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      m_pOwner->m_bMouseIn = TRUE;
-    }
-  }
-#else
-  {
-    if (pOldHover && pPointBtn != pOldHover) {
-      pOldHover->SetNormal();
-      rtInvalidate = pOldHover->m_rtBtn;
-    }
-    if (pPointBtn && pPointBtn != pOldHover) {
-      pPointBtn->SetHover();
-      if (rtInvalidate.IsEmpty()) {
-        rtInvalidate = pPointBtn->m_rtBtn;
-      } else {
-        rtInvalidate.Union(pPointBtn->m_rtBtn);
-      }
-    }
-  }
-#endif
-  if (!rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
-}
-void CFWL_FormImpDelegate::OnMouseHover(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
-}
-void CFWL_FormImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  CFWL_SysBtn* pHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
-  if (pHover) {
-    pHover->SetNormal();
-    m_pOwner->Repaint(&pHover->m_rtBtn);
-  }
-  if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave &&
-      !m_pOwner->m_bLButtonDown) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
-  }
-}
-void CFWL_FormImpDelegate::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-      m_pOwner->HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WGTHITTEST_Titlebar) {
-    if (m_pOwner->m_bMaximized) {
-      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
-    } else {
-      m_pOwner->SetWorkAreaRect();
-    }
-    m_pOwner->Update();
-    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
-  }
-}
-void CFWL_FormImpDelegate::OnWindowMove(CFWL_MsgWindowMove* pMsg) {
-  m_pOwner->m_pProperties->m_rtWidget.left = pMsg->m_fx;
-  m_pOwner->m_pProperties->m_rtWidget.top = pMsg->m_fy;
-}
-void CFWL_FormImpDelegate::OnClose(CFWL_MsgClose* pMsg) {
-  CFWL_EvtClose eClose;
-  eClose.m_pSrcTarget = m_pOwner->m_pInterface;
-  m_pOwner->DispatchEvent(&eClose);
-}
-FWL_ERR FWL_Accelerator_SetForm(IFWL_Form* pFrom,
-                                CFX_MapAccelerators* pMapAccel) {
-  CFWL_FormImp* pImp = static_cast<CFWL_FormImp*>(pFrom->GetImpl());
-  if (!pImp)
-    return FWL_ERR_Indefinite;
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/core/fwl_formimp.h b/xfa/src/fwl/core/fwl_formimp.h
deleted file mode 100644
index ad31da8..0000000
--- a/xfa/src/fwl/core/fwl_formimp.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_FORMIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_FORMIMP_H_
-
-#include "xfa/include/fwl/core/fwl_form.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_NoteLoop;
-class CFWL_WidgetImpProperties;
-class CFWL_MsgMouse;
-class IFWL_Widget;
-class IFWL_ThemeProvider;
-class CFWL_SysBtn;
-class CFWL_FormImp;
-class CFWL_FormImpDelegate;
-
-#define FWL_SYSBUTTONSTATE_Hover 0x0001
-#define FWL_SYSBUTTONSTATE_Pressed 0x0002
-#define FWL_SYSBUTTONSTATE_Disabled 0x0010
-class CFWL_SysBtn {
- public:
-  CFWL_SysBtn() {
-    m_rtBtn.Set(0, 0, 0, 0);
-    m_dwState = 0;
-  }
-
-  FX_BOOL IsHover() { return m_dwState & FWL_SYSBUTTONSTATE_Hover; }
-  FX_BOOL IsPressed() { return m_dwState & FWL_SYSBUTTONSTATE_Pressed; }
-  FX_BOOL IsDisabled() { return m_dwState & FWL_SYSBUTTONSTATE_Disabled; }
-  void SetNormal() { m_dwState &= 0xFFF0; }
-  void SetPressed() {
-    SetNormal();
-    m_dwState |= FWL_SYSBUTTONSTATE_Pressed;
-  }
-  void SetHover() {
-    SetNormal();
-    m_dwState |= FWL_SYSBUTTONSTATE_Hover;
-  }
-  void SetDisabled(FX_BOOL bDisabled) {
-    bDisabled ? m_dwState |= FWL_SYSBUTTONSTATE_Disabled
-              : m_dwState &= ~FWL_SYSBUTTONSTATE_Disabled;
-  }
-  int32_t GetPartState() {
-    return (IsDisabled() ? FWL_PARTSTATE_FRM_Disabled : (m_dwState + 1));
-  }
-
-  CFX_RectF m_rtBtn;
-  FX_DWORD m_dwState;
-};
-enum FORM_RESIZETYPE {
-  FORM_RESIZETYPE_None = 0,
-  FORM_RESIZETYPE_Cap,
-  FORM_RESIZETYPE_Left,
-  FORM_RESIZETYPE_Top,
-  FORM_RESIZETYPE_Right,
-  FORM_RESIZETYPE_Bottom,
-  FORM_RESIZETYPE_LeftTop,
-  FORM_RESIZETYPE_LeftBottom,
-  FORM_RESIZETYPE_RightTop,
-  FORM_RESIZETYPE_RightBottom
-};
-typedef struct RestoreResizeInfo {
-  CFX_PointF m_ptStart;
-  CFX_SizeF m_szStart;
-} RestoreInfo;
-class CFWL_FormImp : public CFWL_PanelImp {
- public:
-  CFWL_FormImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
-  virtual ~CFWL_FormImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
-  virtual FWL_ERR Update();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual FWL_FORMSIZE GetFormSize();
-  virtual FWL_ERR SetFormSize(FWL_FORMSIZE eFormSize);
-  virtual IFWL_Widget* DoModal();
-  virtual IFWL_Widget* DoModal(FX_DWORD& dwCommandID);
-  virtual FWL_ERR EndDoModal();
-  virtual FWL_ERR SetBorderRegion(CFX_Path* pPath);
-  virtual void DrawBackground(CFX_Graphics* pGraphics,
-                              IFWL_ThemeProvider* pTheme);
-  CFWL_WidgetImp* GetSubFocus();
-  void SetSubFocus(CFWL_WidgetImp* pWidget);
-  CFX_MapAccelerators& GetAccelerator();
-  void SetAccelerator(CFX_MapAccelerators* pAccelerators);
-
- protected:
-  void ShowChildWidget(IFWL_Widget* pParent);
-  void RemoveSysButtons();
-  void CalcContentRect(CFX_RectF& rtContent);
-  CFWL_SysBtn* GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy);
-  CFWL_SysBtn* GetSysBtnByState(FX_DWORD dwState);
-  CFWL_SysBtn* GetSysBtnByIndex(int32_t nIndex);
-  int32_t GetSysBtnIndex(CFWL_SysBtn* pBtn);
-  FX_FLOAT GetCaptionHeight();
-  void DrawCaptionText(CFX_Graphics* pGs,
-                       IFWL_ThemeProvider* pTheme,
-                       const CFX_Matrix* pMatrix = NULL);
-  void DrawIconImage(CFX_Graphics* pGs,
-                     IFWL_ThemeProvider* pTheme,
-                     const CFX_Matrix* pMatrix = NULL);
-  void GetEdgeRect(CFX_RectF& rtEdge);
-  void SetWorkAreaRect();
-  void SetCursor(FX_FLOAT fx, FX_FLOAT fy);
-  void Layout();
-  void ReSetSysBtn();
-  void RegisterForm();
-  void UnRegisterForm();
-  FX_BOOL IsDoModal();
-  void SetThemeData();
-  FX_BOOL HasIcon();
-  void UpdateIcon();
-  void UpdateCaption();
-  void DoWidthLimit(FX_FLOAT& fLeft,
-                    FX_FLOAT& fWidth,
-                    FX_FLOAT fCurX,
-                    FX_FLOAT fSpace,
-                    FX_FLOAT fLimitMin,
-                    FX_FLOAT fLimitMax,
-                    FX_BOOL bLeft);
-  void DoHeightLimit(FX_FLOAT& fTop,
-                     FX_FLOAT& fHeight,
-                     FX_FLOAT fCurY,
-                     FX_FLOAT fSpace,
-                     FX_FLOAT fLimitMin,
-                     FX_FLOAT fLimitMax,
-                     FX_BOOL bTop);
-  CFX_MapAccelerators m_mapAccelerators;
-  CFX_RectF m_rtRestore;
-  CFX_RectF m_rtCaptionText;
-  CFX_RectF m_rtRelative;
-  CFX_RectF m_rtCaption;
-  CFX_RectF m_rtIcon;
-  CFWL_SysBtn* m_pCloseBox;
-  CFWL_SysBtn* m_pMinBox;
-  CFWL_SysBtn* m_pMaxBox;
-  CFWL_SysBtn* m_pCaptionBox;
-  CFWL_NoteLoop* m_pNoteLoop;
-  CFWL_WidgetImp* m_pSubFocus;
-  RestoreInfo m_InfoStart;
-  FX_FLOAT m_fCXBorder;
-  FX_FLOAT m_fCYBorder;
-  int32_t m_iCaptureBtn;
-  int32_t m_iSysBox;
-  int32_t m_eResizeType;
-  FX_BOOL m_bLButtonDown;
-  FX_BOOL m_bMaximized;
-  FX_BOOL m_bSetMaximize;
-  FX_BOOL m_bCustomizeLayout;
-  FWL_FORMSIZE m_eFormSize;
-  FX_BOOL m_bDoModalFlag;
-  FX_FLOAT m_fSmallIconSz;
-  FX_FLOAT m_fBigIconSz;
-  CFX_DIBitmap* m_pBigIcon;
-  CFX_DIBitmap* m_pSmallIcon;
-  FX_BOOL m_bMouseIn;
-  friend class CFWL_FormImpDelegate;
-};
-class CFWL_FormImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_FormImpDelegate(CFWL_FormImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseHover(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnLButtonDblClk(CFWL_MsgMouse* pMsg);
-  void OnWindowMove(CFWL_MsgWindowMove* pMsg);
-  void OnClose(CFWL_MsgClose* pMsg);
-  CFWL_FormImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_FORMIMP_H_
diff --git a/xfa/src/fwl/core/fwl_gridimp.cpp b/xfa/src/fwl/core/fwl_gridimp.cpp
deleted file mode 100644
index 1230fa2..0000000
--- a/xfa/src/fwl/core/fwl_gridimp.cpp
+++ /dev/null
@@ -1,1378 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_gridimp.h"
-
-#include "xfa/src/fwl/core/fwl_contentimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-// static
-IFWL_Grid* IFWL_Grid::Create(const CFWL_WidgetImpProperties& properties) {
-  IFWL_Grid* pGrid = new IFWL_Grid;
-  CFWL_GridImp* pGridImpl = new CFWL_GridImp(properties, nullptr);
-  pGrid->SetImpl(pGridImpl);
-  pGridImpl->SetInterface(pGrid);
-  return pGrid;
-}
-IFWL_Grid::IFWL_Grid() {}
-FWL_HGRIDCOLROW IFWL_Grid::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->InsertColRow(bColumn, nIndex);
-}
-int32_t IFWL_Grid::CountColRows(FX_BOOL bColumn) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->CountColRows(bColumn);
-}
-FWL_HGRIDCOLROW IFWL_Grid::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetColRow(bColumn, nIndex);
-}
-int32_t IFWL_Grid::GetIndex(FWL_HGRIDCOLROW hColRow) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetIndex(hColRow);
-}
-FX_FLOAT IFWL_Grid::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetSize(hColRow, eUnit);
-}
-FWL_ERR IFWL_Grid::SetSize(FWL_HGRIDCOLROW hColRow,
-                           FX_FLOAT fSize,
-                           FWL_GRIDUNIT eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->SetSize(hColRow, fSize, eUnit);
-}
-FX_FLOAT IFWL_Grid::GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetMinSize(hColRow, eUnit);
-}
-FWL_ERR IFWL_Grid::SetMinSize(FWL_HGRIDCOLROW hColRow,
-                              FX_FLOAT fSize,
-                              FWL_GRIDUNIT eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetMinSize(hColRow, fSize, eUnit);
-}
-FX_FLOAT IFWL_Grid::GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetMaxSize(hColRow, eUnit);
-}
-FWL_ERR IFWL_Grid::SetMaxSize(FWL_HGRIDCOLROW hColRow,
-                              FX_FLOAT fSize,
-                              FWL_GRIDUNIT eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetMaxSize(hColRow, fSize, eUnit);
-}
-FX_BOOL IFWL_Grid::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->DeleteColRow(hColRow);
-}
-FX_BOOL IFWL_Grid::IsColumn(FWL_HGRIDCOLROW hColRow) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->IsColumn(hColRow);
-}
-int32_t IFWL_Grid::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetPos(pWidget, bColumn);
-}
-FWL_ERR IFWL_Grid::SetWidgetPos(IFWL_Widget* pWidget,
-                                int32_t iPos,
-                                FX_BOOL bColumn) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetWidgetPos(pWidget, iPos, bColumn);
-}
-int32_t IFWL_Grid::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetWidgetSpan(pWidget, bColumn);
-}
-FWL_ERR IFWL_Grid::SetWidgetSpan(IFWL_Widget* pWidget,
-                                 int32_t iSpan,
-                                 FX_BOOL bColumn) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetWidgetSpan(pWidget, iSpan, bColumn);
-}
-FX_FLOAT IFWL_Grid::GetWidgetSize(IFWL_Widget* pWidget,
-                                  FWL_GRIDSIZE eSize,
-                                  FWL_GRIDUNIT& eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->GetWidgetSize(pWidget, eSize, eUnit);
-}
-FWL_ERR IFWL_Grid::SetWidgetSize(IFWL_Widget* pWidget,
-                                 FWL_GRIDSIZE eSize,
-                                 FX_FLOAT fSize,
-                                 FWL_GRIDUNIT eUit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetWidgetSize(pWidget, eSize, fSize, eUit);
-}
-FX_BOOL IFWL_Grid::GetWidgetMargin(IFWL_Widget* pWidget,
-                                   FWL_GRIDMARGIN eMargin,
-                                   FX_FLOAT& fMargin) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->GetWidgetMargin(pWidget, eMargin, fMargin);
-}
-FWL_ERR IFWL_Grid::SetWidgetMargin(IFWL_Widget* pWidget,
-                                   FWL_GRIDMARGIN eMargin,
-                                   FX_FLOAT fMargin) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->SetWidgetMargin(pWidget, eMargin, fMargin);
-}
-FWL_ERR IFWL_Grid::RemoveWidgetMargin(IFWL_Widget* pWidget,
-                                      FWL_GRIDMARGIN eMargin) {
-  return static_cast<CFWL_GridImp*>(GetImpl())
-      ->RemoveWidgetMargin(pWidget, eMargin);
-}
-FX_FLOAT IFWL_Grid::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->GetGridSize(eSize, eUnit);
-}
-FWL_ERR IFWL_Grid::SetGridSize(FWL_GRIDSIZE eSize,
-                               FX_FLOAT fSize,
-                               FWL_GRIDUNIT eUit) {
-  return static_cast<CFWL_GridImp*>(GetImpl())->SetGridSize(eSize, fSize, eUit);
-}
-
-CFWL_GridImp::CFWL_GridImp(const CFWL_WidgetImpProperties& properties,
-                           IFWL_Widget* pOuter)
-    : CFWL_ContentImp(properties, pOuter) {
-  m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
-  m_Size[FWL_GRIDSIZE_Width].fLength = 0;
-  m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
-  m_Size[FWL_GRIDSIZE_Height].fLength = 0;
-  m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
-  m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
-  m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
-  m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
-  m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
-  m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
-  m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
-  m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
-}
-CFWL_GridImp::~CFWL_GridImp() {
-  int32_t iCount = m_Columns.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    delete static_cast<CFWL_GridColRow*>(m_Columns[i]);
-  }
-  m_Columns.RemoveAll();
-  iCount = m_Rows.GetSize();
-  for (int32_t j = 0; j < iCount; j++) {
-    delete static_cast<CFWL_GridColRow*>(m_Rows[j]);
-  }
-  m_Rows.RemoveAll();
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget;
-    CFWL_GridWidgetInfo* pInfo;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    delete pInfo;
-  }
-  m_mapWidgetInfo.RemoveAll();
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-}
-FWL_ERR CFWL_GridImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Grid;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_GridImp::GetClassID() const {
-  return FWL_CLASSHASH_Grid;
-}
-FWL_ERR CFWL_GridImp::Initialize() {
-  if (CFWL_ContentImp::Initialize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  m_pDelegate = new CFWL_GridImpDelegate(this);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::Finalize() {
-  if (CFWL_ContentImp::Finalize() != FWL_ERR_Succeeded)
-    return FWL_ERR_Indefinite;
-  delete m_pDelegate;
-  m_pDelegate = nullptr;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    rect.left = 0;
-    rect.top = 0;
-    rect.width = ProcessUnCertainColumns();
-    rect.height = ProcessUnCertainRows();
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::SetWidgetRect(const CFX_RectF& rect) {
-  CFWL_WidgetImp::SetWidgetRect(rect);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::Update() {
-  if (IsLocked()) {
-    return FWL_ERR_Indefinite;
-  }
-  ProcessColumns(m_pProperties->m_rtWidget.width);
-  ProcessRows(m_pProperties->m_rtWidget.height);
-  SetAllWidgetsRect();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::DrawWidget(CFX_Graphics* pGraphics,
-                                 const CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  if ((m_pProperties->m_dwStyleExes & FWL_GRIDSTYLEEXT_ShowGridLines) == 0) {
-    return FWL_ERR_Succeeded;
-  }
-  pGraphics->SaveGraphState();
-  if (pMatrix) {
-    pGraphics->ConcatMatrix(pMatrix);
-  }
-  {
-    FX_BOOL bDrawLine = FALSE;
-    CFX_Path path;
-    path.Create();
-    int32_t iColumns = m_Columns.GetSize();
-    for (int32_t i = 1; i < iColumns; i++) {
-      CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
-      if (!pColRow) {
-        continue;
-      }
-      bDrawLine = TRUE;
-      path.AddLine(pColRow->m_fActualPos, 0, pColRow->m_fActualPos,
-                   m_pProperties->m_rtWidget.height);
-    }
-    int32_t iRows = m_Rows.GetSize();
-    for (int32_t j = 1; j < iRows; j++) {
-      CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
-      if (!pColRow) {
-        continue;
-      }
-      bDrawLine = TRUE;
-      path.AddLine(0, pColRow->m_fActualPos, m_pProperties->m_rtWidget.width,
-                   pColRow->m_fActualPos);
-    }
-    if (bDrawLine) {
-      CFX_Color cr(0xFFFF0000);
-      pGraphics->SetStrokeColor(&cr);
-      pGraphics->StrokePath(&path);
-    }
-  }
-  pGraphics->RestoreGraphState();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::InsertWidget(IFWL_Widget* pChild, int32_t nIndex) {
-  if (!pChild)
-    return FWL_ERR_Indefinite;
-  CFWL_ContentImp::InsertWidget(pChild, nIndex);
-  if (!m_mapWidgetInfo.GetValueAt(pChild)) {
-    CFWL_GridWidgetInfo* pInfo = new CFWL_GridWidgetInfo;
-    m_mapWidgetInfo.SetAt(pChild, pInfo);
-    m_Widgets.Add(pChild);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::RemoveWidget(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FWL_ERR_Indefinite;
-  CFWL_ContentImp::RemoveWidget(pWidget);
-  if (CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(
-          m_mapWidgetInfo.GetValueAt(pWidget))) {
-    m_mapWidgetInfo.RemoveKey(pWidget);
-    delete pInfo;
-    int32_t nIndex = m_Widgets.Find(pWidget);
-    m_Widgets.RemoveAt(nIndex, 1);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_HGRIDCOLROW CFWL_GridImp::InsertColRow(FX_BOOL bColumn, int32_t nIndex) {
-  if (bColumn) {
-    if (nIndex < 0 || nIndex > m_Columns.GetSize()) {
-      nIndex = m_Columns.GetSize();
-    }
-    CFWL_GridColRow* pColumn = new CFWL_GridColRow;
-    m_Columns.InsertAt(nIndex, pColumn, 1);
-    return (FWL_HGRIDCOLROW)pColumn;
-  }
-  if (nIndex < 0 || nIndex > m_Rows.GetSize()) {
-    nIndex = m_Rows.GetSize();
-  }
-  CFWL_GridColRow* pRow = new CFWL_GridColRow;
-  m_Rows.InsertAt(nIndex, pRow, 1);
-  return (FWL_HGRIDCOLROW)pRow;
-}
-int32_t CFWL_GridImp::CountColRows(FX_BOOL bColumn) {
-  if (bColumn) {
-    return m_Columns.GetSize();
-  }
-  return m_Rows.GetSize();
-}
-FWL_HGRIDCOLROW CFWL_GridImp::GetColRow(FX_BOOL bColumn, int32_t nIndex) {
-  if (bColumn) {
-    if (nIndex < 0 || nIndex >= m_Columns.GetSize()) {
-      return NULL;
-    }
-    return (FWL_HGRIDCOLROW)m_Columns[nIndex];
-  }
-  if (nIndex < 0 || nIndex >= m_Rows.GetSize()) {
-    return NULL;
-  }
-  return (FWL_HGRIDCOLROW)m_Rows[nIndex];
-}
-int32_t CFWL_GridImp::GetIndex(FWL_HGRIDCOLROW hColRow) {
-  if (IsColumn(hColRow)) {
-    return m_Columns.Find(hColRow);
-  }
-  return m_Rows.Find(hColRow);
-}
-FX_FLOAT CFWL_GridImp::GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit) {
-  if (!hColRow)
-    return -1;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  eUnit = pColRow->m_Size.eUnit;
-  return pColRow->m_Size.fLength;
-}
-FWL_ERR CFWL_GridImp::SetSize(FWL_HGRIDCOLROW hColRow,
-                              FX_FLOAT fSize,
-                              FWL_GRIDUNIT eUnit) {
-  if (!hColRow)
-    return FWL_ERR_Indefinite;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  pColRow->m_Size.eUnit = eUnit;
-  pColRow->m_Size.fLength = fSize;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_GridImp::GetMinSize(FWL_HGRIDCOLROW hColRow,
-                                  FWL_GRIDUNIT& eUnit) {
-  if (!hColRow)
-    return -1;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  eUnit = pColRow->m_MinSize.eUnit;
-  return pColRow->m_MinSize.fLength;
-}
-FWL_ERR CFWL_GridImp::SetMinSize(FWL_HGRIDCOLROW hColRow,
-                                 FX_FLOAT fSize,
-                                 FWL_GRIDUNIT eUnit) {
-  if (!hColRow)
-    return FWL_ERR_Indefinite;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  pColRow->m_MinSize.eUnit = eUnit;
-  pColRow->m_MinSize.fLength = fSize;
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_GridImp::GetMaxSize(FWL_HGRIDCOLROW hColRow,
-                                  FWL_GRIDUNIT& eUnit) {
-  if (!hColRow)
-    return -1;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  eUnit = pColRow->m_MaxSize.eUnit;
-  return pColRow->m_MaxSize.fLength;
-}
-FWL_ERR CFWL_GridImp::SetMaxSize(FWL_HGRIDCOLROW hColRow,
-                                 FX_FLOAT fSize,
-                                 FWL_GRIDUNIT eUnit) {
-  if (!hColRow)
-    return FWL_ERR_Indefinite;
-  CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(hColRow);
-  pColRow->m_MaxSize.eUnit = eUnit;
-  pColRow->m_MaxSize.fLength = fSize;
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_GridImp::DeleteColRow(FWL_HGRIDCOLROW hColRow) {
-  int32_t nIndex = m_Columns.Find(hColRow);
-  if (nIndex >= 0) {
-    m_Columns.RemoveAt(nIndex);
-    delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
-    return TRUE;
-  }
-  nIndex = m_Rows.Find(hColRow);
-  if (nIndex >= 0) {
-    delete reinterpret_cast<CFWL_GridColRow*>(hColRow);
-    m_Rows.RemoveAt(nIndex);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_GridImp::IsColumn(FWL_HGRIDCOLROW hColRow) {
-  return m_Columns.Find(hColRow) != -1;
-}
-int32_t CFWL_GridImp::GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    return bColumn ? pInfo->m_iColumn : pInfo->m_iRow;
-  }
-  return -1;
-}
-FWL_ERR CFWL_GridImp::SetWidgetPos(IFWL_Widget* pWidget,
-                                   int32_t iPos,
-                                   FX_BOOL bColumn) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    bColumn ? pInfo->m_iColumn = iPos : pInfo->m_iRow = iPos;
-  }
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_GridImp::GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    return bColumn ? pInfo->m_iColumnSpan : pInfo->m_iRowSpan;
-  }
-  return 0;
-}
-FWL_ERR CFWL_GridImp::SetWidgetSpan(IFWL_Widget* pWidget,
-                                    int32_t iSpan,
-                                    FX_BOOL bColumn) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    bColumn ? pInfo->m_iColumnSpan = iSpan : pInfo->m_iRowSpan = iSpan;
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_GridImp::GetWidgetSize(IFWL_Widget* pWidget,
-                                     FWL_GRIDSIZE eSize,
-                                     FWL_GRIDUNIT& eUnit) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    eUnit = pInfo->m_Size[eSize].eUnit;
-    return pInfo->m_Size[eSize].fLength;
-  }
-  return 0;
-}
-FWL_ERR CFWL_GridImp::SetWidgetSize(IFWL_Widget* pWidget,
-                                    FWL_GRIDSIZE eSize,
-                                    FX_FLOAT fSize,
-                                    FWL_GRIDUNIT eUit) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    pInfo->m_Size[eSize].fLength = fSize;
-    pInfo->m_Size[eSize].eUnit = eUit;
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_GridImp::GetWidgetMargin(IFWL_Widget* pWidget,
-                                      FWL_GRIDMARGIN eMargin,
-                                      FX_FLOAT& fMargin) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    fMargin = pInfo->m_Margin[eMargin];
-    return (pInfo->m_dwMarginFlag & (1 << eMargin)) != 0;
-  }
-  return FALSE;
-}
-FWL_ERR CFWL_GridImp::SetWidgetMargin(IFWL_Widget* pWidget,
-                                      FWL_GRIDMARGIN eMargin,
-                                      FX_FLOAT fMargin) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    pInfo->m_Margin[eMargin] = fMargin;
-    pInfo->m_dwMarginFlag |= (1 << eMargin);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_GridImp::RemoveWidgetMargin(IFWL_Widget* pWidget,
-                                         FWL_GRIDMARGIN eMargin) {
-  CFWL_GridWidgetInfo* pInfo =
-      static_cast<CFWL_GridWidgetInfo*>(GetWidgetInfo(pWidget));
-  if (pInfo) {
-    pInfo->m_dwMarginFlag &= ~(1 << eMargin);
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_FLOAT CFWL_GridImp::GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit) {
-  eUnit = m_Size[eSize].eUnit;
-  return m_Size[eSize].fLength;
-}
-FWL_ERR CFWL_GridImp::SetGridSize(FWL_GRIDSIZE eSize,
-                                  FX_FLOAT fSize,
-                                  FWL_GRIDUNIT eUit) {
-  m_Size[eSize].fLength = fSize;
-  m_Size[eSize].eUnit = eUit;
-  return FWL_ERR_Succeeded;
-}
-CFWL_GridWidgetInfo* CFWL_GridImp::GetWidgetInfo(IFWL_Widget* pWidget) {
-  return static_cast<CFWL_GridWidgetInfo*>(m_mapWidgetInfo.GetValueAt(pWidget));
-}
-void CFWL_GridImp::ProcFixedColRow(CFWL_GridColRow* pColRow,
-                                   int32_t nIndex,
-                                   FX_FLOAT fColRowSize,
-                                   FX_BOOL bColumn) {
-  pColRow->m_fActualSize = fColRowSize;
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    void* key = nullptr;
-    void* value = nullptr;
-    m_mapWidgetInfo.GetNextAssoc(ps, key, value);
-    IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
-    CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
-    if (bColumn) {
-      if (pInfo->m_iColumn == nIndex && pInfo->m_iColumnSpan == 1) {
-        CalcWidgetWidth(pWidget, pInfo, pColRow->m_fActualSize);
-      }
-    } else {
-      if (pInfo->m_iRow == nIndex && pInfo->m_iRowSpan == 1) {
-        CalcWidgetHeigt(pWidget, pInfo, pColRow->m_fActualSize);
-      }
-    }
-  }
-}
-void CFWL_GridImp::ProcAutoColRow(CFWL_GridColRow* pColRow,
-                                  int32_t nIndex,
-                                  FX_BOOL bColumn) {
-  if (!pColRow)
-    return;
-  FX_FLOAT fMaxSize = 0, fWidgetSize = 0;
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget = NULL;
-    CFWL_GridWidgetInfo* pInfo = NULL;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    if (!pWidget || !pInfo) {
-      continue;
-    }
-    if (bColumn) {
-      if (pInfo->m_iColumn != nIndex || pInfo->m_iColumnSpan != 1) {
-        continue;
-      }
-      fWidgetSize = CalcAutoColumnWidgetWidth(pWidget, pInfo);
-      if (fMaxSize < fWidgetSize) {
-        fMaxSize = fWidgetSize;
-      }
-    } else {
-      if (pInfo->m_iRow != nIndex || pInfo->m_iRowSpan != 1) {
-        continue;
-      }
-      fWidgetSize = CalcAutoColumnWidgetHeight(pWidget, pInfo);
-      if (fMaxSize < fWidgetSize) {
-        fMaxSize = fWidgetSize;
-      }
-    }
-  }
-  SetColRowActualSize(pColRow, fMaxSize);
-}
-void CFWL_GridImp::ProcScaledColRow(CFWL_GridColRow* pColRow,
-                                    int32_t nIndex,
-                                    FX_FLOAT fColRowSize,
-                                    FX_BOOL bColumn) {
-  if (fColRowSize > 0) {
-    ProcFixedColRow(pColRow, nIndex, fColRowSize, bColumn);
-  }
-}
-void CFWL_GridImp::CalcWidgetWidth(IFWL_Widget* pWidget,
-                                   CFWL_GridWidgetInfo* pInfo,
-                                   FX_FLOAT fColunmWidth) {
-  if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
-    SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
-  } else {
-    FX_FLOAT fWidth = 0;
-    FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
-    FX_BOOL bLeftMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
-    FX_BOOL bRightMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
-    if (bLeftMargin && bRightMargin) {
-      fWidth = fColunmWidth - fLeftMargin - fRightMargin;
-    } else {
-      CFX_RectF rtAuto;
-      pWidget->GetWidgetRect(rtAuto, TRUE);
-      fWidth = rtAuto.Width();
-    }
-    SetWidgetActualWidth(pInfo, fWidth);
-  }
-}
-void CFWL_GridImp::CalcWidgetHeigt(IFWL_Widget* pWidget,
-                                   CFWL_GridWidgetInfo* pInfo,
-                                   FX_FLOAT fRowHeigt) {
-  if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
-    SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
-  } else {
-    FX_FLOAT fHeight = 0;
-    FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
-    FX_BOOL bTopMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
-    FX_BOOL bBottomMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
-    if (bTopMargin && bBottomMargin) {
-      fHeight = fRowHeigt - fTopMargin - fBottomMargin;
-    } else {
-      CFX_RectF rtAuto;
-      pWidget->GetWidgetRect(rtAuto, TRUE);
-      fHeight = rtAuto.Height();
-    }
-    SetWidgetActualHeight(pInfo, fHeight);
-  }
-}
-FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
-                                                 CFWL_GridWidgetInfo* pInfo) {
-  FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
-  FX_BOOL bLeftMargin =
-      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
-  FX_BOOL bRightMargin =
-      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
-  if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
-    SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
-  } else {
-    CFX_RectF rtAuto;
-    pWidget->GetWidgetRect(rtAuto, TRUE);
-    FX_FLOAT fWidth = rtAuto.width;
-    SetWidgetActualWidth(pInfo, fWidth);
-  }
-  FX_FLOAT fTotal = pInfo->m_fActualWidth;
-  if (bLeftMargin) {
-    fTotal += fLeftMargin;
-  }
-  if (bRightMargin) {
-    fTotal += fRightMargin;
-  }
-  return fTotal;
-}
-FX_FLOAT CFWL_GridImp::CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
-                                                  CFWL_GridWidgetInfo* pInfo) {
-  FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
-  FX_BOOL bTopMargin = GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
-  FX_BOOL bBottomMargin =
-      GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
-  if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
-    SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
-  } else {
-    CFX_RectF rtAuto;
-    pWidget->GetWidgetRect(rtAuto, TRUE);
-    FX_FLOAT fHeight = rtAuto.height;
-    SetWidgetActualHeight(pInfo, fHeight);
-  }
-  FX_FLOAT fTotal = pInfo->m_fActualHeight;
-  if (bTopMargin) {
-    fTotal += fTopMargin;
-  }
-  if (bBottomMargin) {
-    fTotal += fBottomMargin;
-  }
-  return fTotal;
-}
-FX_FLOAT CFWL_GridImp::ProcessColumns(FX_FLOAT fWidth) {
-  if (fWidth <= 0) {
-    return ProcessUnCertainColumns();
-  }
-  int32_t iColumns = m_Columns.GetSize();
-  if (iColumns < 1) {
-    return fWidth;
-  }
-  FX_FLOAT fFixedWidth = 0;
-  FX_FLOAT fAutoWidth = 0;
-  CFX_PtrArray autoColumns;
-  CFX_PtrArray scaledColumns;
-  FX_FLOAT fScaledColumnNum = 0;
-  for (int32_t i = 0; i < iColumns; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
-    if (!pColRow) {
-      continue;
-    }
-    switch (pColRow->m_Size.eUnit) {
-      case FWL_GRIDUNIT_Fixed: {
-        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
-        fFixedWidth += pColRow->m_fActualSize;
-        break;
-      }
-      case FWL_GRIDUNIT_Auto: {
-        ProcAutoColRow(pColRow, i, TRUE);
-        autoColumns.Add(pColRow);
-        break;
-      }
-      case FWL_GRIDUNIT_Scaled:
-      default: {
-        fScaledColumnNum += pColRow->m_Size.fLength;
-        scaledColumns.Add(pColRow);
-        SetColRowActualSize(pColRow, 0);
-      }
-    }
-  }
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget = NULL;
-    CFWL_GridWidgetInfo* pInfo = NULL;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    if (!pInfo || pInfo->m_iColumnSpan < 2) {
-      continue;
-    }
-    CFX_PtrArray spanAutoColumns;
-    FX_FLOAT fSpanSize = 0;
-    int32_t iAutoColRows = 0;
-    int32_t iScaledColRows = 0;
-    for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
-      CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
-          GetColRow(TRUE, pInfo->m_iColumn + i));
-      if (!pColumn) {
-        break;
-      }
-      fSpanSize += pColumn->m_fActualSize;
-      if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
-        iAutoColRows++;
-        spanAutoColumns.Add(pColumn);
-      } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
-        iScaledColRows++;
-      }
-    }
-    if (iAutoColRows < 1) {
-      continue;
-    }
-    FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
-    if (fWidgetWidth > fSpanSize) {
-      if (iScaledColRows > 0) {
-      } else {
-        SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
-      }
-    }
-  }
-  int32_t iAutoCols = autoColumns.GetSize();
-  for (int32_t k = 0; k < iAutoCols; k++) {
-    fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[k])->m_fActualSize;
-  }
-  FX_FLOAT fScaledWidth = fWidth - fFixedWidth - fAutoWidth;
-  if (fScaledWidth > 0 && fScaledColumnNum > 0) {
-    SetScaledColRowsSize(scaledColumns, fScaledWidth, fScaledColumnNum);
-  }
-  return fWidth;
-}
-FX_FLOAT CFWL_GridImp::ProcessRows(FX_FLOAT fHeight) {
-  if (fHeight <= 0) {
-    return ProcessUnCertainRows();
-  }
-  int32_t iRows = m_Rows.GetSize();
-  if (iRows < 1) {
-    return fHeight;
-  }
-  FX_FLOAT fFixedHeight = 0;
-  FX_FLOAT fAutoHeigt = 0;
-  CFX_PtrArray autoRows;
-  CFX_PtrArray scaledRows;
-  FX_FLOAT fScaledRowNum = 0;
-  for (int32_t i = 0; i < iRows; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
-    if (!pColRow) {
-      continue;
-    }
-    switch (pColRow->m_Size.eUnit) {
-      case FWL_GRIDUNIT_Fixed: {
-        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
-        fFixedHeight += pColRow->m_fActualSize;
-        break;
-      }
-      case FWL_GRIDUNIT_Auto: {
-        ProcAutoColRow(pColRow, i, FALSE);
-        autoRows.Add(pColRow);
-        break;
-      }
-      case FWL_GRIDUNIT_Scaled:
-      default: {
-        fScaledRowNum += pColRow->m_Size.fLength;
-        scaledRows.Add(pColRow);
-        SetColRowActualSize(pColRow, 0);
-        break;
-      }
-    }
-  }
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget = NULL;
-    CFWL_GridWidgetInfo* pInfo = NULL;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    if (!pInfo || pInfo->m_iRowSpan < 2) {
-      continue;
-    }
-    CFX_PtrArray spanAutoRows;
-    FX_FLOAT fSpanSize = 0;
-    int32_t iAutoColRows = 0;
-    int32_t iScaledColRows = 0;
-    for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
-      CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
-          GetColRow(FALSE, pInfo->m_iRow + i));
-      if (!pRow) {
-        break;
-      }
-      fSpanSize += pRow->m_fActualSize;
-      if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
-        iAutoColRows++;
-        spanAutoRows.Add(pRow);
-      } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
-        iScaledColRows++;
-      }
-    }
-    if (iAutoColRows < 1) {
-      continue;
-    }
-    FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
-    if (fWidgetHeight > fSpanSize) {
-      if (iScaledColRows > 0) {
-      } else {
-        SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
-      }
-    }
-  }
-  int32_t iAutoRows = autoRows.GetSize();
-  for (int32_t k = 0; k < iAutoRows; k++) {
-    fAutoHeigt +=
-        reinterpret_cast<CFWL_GridColRow*>(autoRows[k])->m_fActualSize;
-  }
-  FX_FLOAT fScaledHeight = fHeight - fFixedHeight - fAutoHeigt;
-  if (fScaledHeight > 0 && fScaledRowNum > 0) {
-    SetScaledColRowsSize(scaledRows, fScaledHeight, fScaledRowNum);
-  }
-  return fHeight;
-}
-FX_FLOAT CFWL_GridImp::ProcessUnCertainColumns() {
-  int32_t iColumns = m_Columns.GetSize();
-  if (iColumns < 1) {
-    CFWL_GridColRow* pColRow = new CFWL_GridColRow;
-    pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
-    ProcAutoColRow(pColRow, 0, TRUE);
-    FX_FLOAT fWidth = pColRow->m_fActualSize;
-    delete pColRow;
-    return fWidth;
-  }
-  FX_FLOAT fFixedWidth = 0;
-  CFX_PtrArray autoColumns;
-  CFX_PtrArray scaledColumns;
-  FX_FLOAT fScaledColumnNum = 0;
-  FX_FLOAT fScaledMaxPerWidth = 0;
-  for (int32_t i = 0; i < iColumns; i++) {
-    CFWL_GridColRow* pColRow = reinterpret_cast<CFWL_GridColRow*>(m_Columns[i]);
-    if (!pColRow) {
-      continue;
-    }
-    switch (pColRow->m_Size.eUnit) {
-      case FWL_GRIDUNIT_Fixed: {
-        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
-        fFixedWidth += pColRow->m_fActualSize;
-        break;
-      }
-      case FWL_GRIDUNIT_Auto: {
-        ProcAutoColRow(pColRow, i, TRUE);
-        autoColumns.Add(pColRow);
-        break;
-      }
-      case FWL_GRIDUNIT_Scaled:
-      default: {
-        ProcAutoColRow(pColRow, i, TRUE);
-        fScaledColumnNum += pColRow->m_Size.fLength;
-        scaledColumns.Add(pColRow);
-        if (pColRow->m_Size.fLength <= 0) {
-          break;
-        }
-        FX_FLOAT fPerWidth = pColRow->m_fActualSize / pColRow->m_Size.fLength;
-        if (fPerWidth > fScaledMaxPerWidth) {
-          fScaledMaxPerWidth = fPerWidth;
-        }
-      }
-    }
-  }
-  iColumns = scaledColumns.GetSize();
-  for (int32_t j = 0; j < iColumns; j++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledColumns[j]);
-    if (!pColRow) {
-      continue;
-    }
-    SetColRowActualSize(pColRow, fScaledMaxPerWidth * pColRow->m_Size.fLength);
-  }
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget = NULL;
-    CFWL_GridWidgetInfo* pInfo = NULL;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    if (!pInfo || pInfo->m_iColumnSpan < 2) {
-      continue;
-    }
-    CFX_PtrArray spanAutoColumns;
-    CFX_PtrArray spanScaledColumns;
-    FX_FLOAT fSpanSize = 0;
-    FX_FLOAT fScaledSum = 0;
-    int32_t iAutoColRows = 0;
-    int32_t iScaledColRows = 0;
-    for (int32_t i = 0; i < pInfo->m_iColumnSpan; i++) {
-      CFWL_GridColRow* pColumn = reinterpret_cast<CFWL_GridColRow*>(
-          GetColRow(TRUE, pInfo->m_iColumn + i));
-      if (!pColumn) {
-        break;
-      }
-      fSpanSize += pColumn->m_fActualSize;
-      if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
-        iAutoColRows++;
-        spanAutoColumns.Add(pColumn);
-      } else if (pColumn->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
-        iScaledColRows++;
-        fScaledSum += pColumn->m_Size.fLength;
-        spanScaledColumns.Add(pColumn);
-      }
-    }
-    if (iAutoColRows < 1 && iScaledColRows < 1) {
-      continue;
-    }
-    FX_FLOAT fWidgetWidth = CalcAutoColumnWidgetWidth(pWidget, pInfo);
-    if (fWidgetWidth > fSpanSize) {
-      if (iScaledColRows > 0) {
-        if (fScaledSum <= 0) {
-          continue;
-        }
-        SetSpanScaledColRowSize(spanScaledColumns, fWidgetWidth - fSpanSize,
-                                fScaledSum);
-      } else {
-        SetSpanAutoColRowSize(spanAutoColumns, fWidgetWidth - fSpanSize);
-      }
-    }
-  }
-  FX_FLOAT fAutoWidth = 0;
-  int32_t iAutoCols = autoColumns.GetSize();
-  for (int32_t m = 0; m < iAutoCols; m++) {
-    fAutoWidth += static_cast<CFWL_GridColRow*>(autoColumns[m])->m_fActualSize;
-  }
-  FX_FLOAT fScaledWidth = 0;
-  iColumns = scaledColumns.GetSize();
-  for (int32_t n = 0; n < iColumns; n++) {
-    fScaledWidth +=
-        static_cast<CFWL_GridColRow*>(scaledColumns[n])->m_fActualSize;
-  }
-  return fFixedWidth + fAutoWidth + fScaledWidth;
-}
-FX_FLOAT CFWL_GridImp::ProcessUnCertainRows() {
-  int32_t iRows = m_Rows.GetSize();
-  if (iRows < 1) {
-    CFWL_GridColRow* pColRow = new CFWL_GridColRow;
-    pColRow->m_Size.eUnit = FWL_GRIDUNIT_Auto;
-    ProcAutoColRow(pColRow, 0, FALSE);
-    FX_FLOAT fWidth = pColRow->m_fActualSize;
-    delete pColRow;
-    return fWidth;
-  }
-  FX_FLOAT fFixedHeight = 0;
-  CFX_PtrArray autoRows;
-  CFX_PtrArray scaledRows;
-  FX_FLOAT fScaledRowNum = 0;
-  FX_FLOAT fScaledMaxPerHeight = 0;
-  for (int32_t i = 0; i < iRows; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[i]);
-    if (!pColRow) {
-      continue;
-    }
-    switch (pColRow->m_Size.eUnit) {
-      case FWL_GRIDUNIT_Fixed: {
-        SetColRowActualSize(pColRow, pColRow->m_Size.fLength);
-        fFixedHeight += pColRow->m_fActualSize;
-        break;
-      }
-      case FWL_GRIDUNIT_Auto: {
-        ProcAutoColRow(pColRow, i, FALSE);
-        autoRows.Add(pColRow);
-        break;
-      }
-      case FWL_GRIDUNIT_Scaled:
-      default: {
-        ProcAutoColRow(pColRow, i, FALSE);
-        fScaledRowNum += pColRow->m_Size.fLength;
-        scaledRows.Add(pColRow);
-        if (pColRow->m_Size.fLength > 0) {
-          FX_FLOAT fPerHeight =
-              pColRow->m_fActualSize / pColRow->m_Size.fLength;
-          if (fPerHeight > fScaledMaxPerHeight) {
-            fScaledMaxPerHeight = fPerHeight;
-          }
-        }
-        break;
-      }
-    }
-  }
-  iRows = scaledRows.GetSize();
-  for (int32_t j = 0; j < iRows; j++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(scaledRows[j]);
-    if (!pColRow) {
-      continue;
-    }
-    SetColRowActualSize(pColRow, fScaledMaxPerHeight * pColRow->m_Size.fLength);
-  }
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    void* key = nullptr;
-    void* value = nullptr;
-    m_mapWidgetInfo.GetNextAssoc(ps, key, value);
-    IFWL_Widget* pWidget = static_cast<IFWL_Widget*>(key);
-    CFWL_GridWidgetInfo* pInfo = static_cast<CFWL_GridWidgetInfo*>(value);
-    if (pInfo->m_iRowSpan < 2) {
-      continue;
-    }
-    CFX_PtrArray spanAutoRows;
-    CFX_PtrArray spanScaledRows;
-    FX_FLOAT fSpanSize = 0;
-    FX_FLOAT fScaledSum = 0;
-    int32_t iAutoColRows = 0;
-    int32_t iScaledColRows = 0;
-    for (int32_t i = 0; i < pInfo->m_iRowSpan; i++) {
-      CFWL_GridColRow* pRow = reinterpret_cast<CFWL_GridColRow*>(
-          GetColRow(FALSE, pInfo->m_iRow + i));
-      if (!pRow) {
-        break;
-      }
-      fSpanSize += pRow->m_fActualSize;
-      if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Auto) {
-        iAutoColRows++;
-        spanAutoRows.Add(pRow);
-      } else if (pRow->m_Size.eUnit == FWL_GRIDUNIT_Scaled) {
-        iScaledColRows++;
-        fScaledSum += pRow->m_Size.fLength;
-        spanScaledRows.Add(pRow);
-      }
-    }
-    if (iAutoColRows < 1 && iScaledColRows < 1) {
-      continue;
-    }
-    FX_FLOAT fWidgetHeight = CalcAutoColumnWidgetHeight(pWidget, pInfo);
-    if (fWidgetHeight > fSpanSize) {
-      if (iScaledColRows > 0) {
-        if (fScaledSum <= 0) {
-          continue;
-        }
-        SetSpanScaledColRowSize(spanScaledRows, fWidgetHeight - fSpanSize,
-                                fScaledSum);
-      } else {
-        SetSpanAutoColRowSize(spanAutoRows, fWidgetHeight - fSpanSize);
-      }
-    }
-  }
-  FX_FLOAT fAutoHeigt = 0;
-  int32_t iAutoRows = autoRows.GetSize();
-  for (int32_t m = 0; m < iAutoRows; m++) {
-    fAutoHeigt += static_cast<CFWL_GridColRow*>(autoRows[m])->m_fActualSize;
-  }
-  FX_FLOAT fScaledHeight = 0;
-  iRows = scaledRows.GetSize();
-  for (int32_t n = 0; n < iRows; n++) {
-    fScaledHeight +=
-        static_cast<CFWL_GridColRow*>(scaledRows[n])->m_fActualSize;
-  }
-  return fFixedHeight + fAutoHeigt + fScaledHeight;
-}
-FX_BOOL CFWL_GridImp::SetColRowActualSize(CFWL_GridColRow* pColRow,
-                                          FX_FLOAT fSize,
-                                          FX_BOOL bSetBeyond) {
-  if (pColRow->m_MinSize.eUnit == FWL_GRIDUNIT_Fixed &&
-      fSize < pColRow->m_MinSize.fLength) {
-    pColRow->m_fActualSize = pColRow->m_MinSize.fLength;
-    return FALSE;
-  }
-  if (pColRow->m_MaxSize.eUnit == FWL_GRIDUNIT_Fixed &&
-      fSize > pColRow->m_MaxSize.fLength) {
-    pColRow->m_fActualSize = pColRow->m_MaxSize.fLength;
-    return FALSE;
-  }
-  if (bSetBeyond) {
-    return TRUE;
-  }
-  pColRow->m_fActualSize = fSize;
-  return TRUE;
-}
-FX_FLOAT CFWL_GridImp::SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo,
-                                            FX_FLOAT fWidth) {
-  if (pInfo->m_Size[FWL_GRIDSIZE_MinWidth].eUnit == FWL_GRIDUNIT_Fixed &&
-      fWidth < pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength) {
-    fWidth = pInfo->m_Size[FWL_GRIDSIZE_MinWidth].fLength;
-  }
-  if (pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].eUnit == FWL_GRIDUNIT_Fixed &&
-      fWidth > pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength) {
-    fWidth = pInfo->m_Size[FWL_GRIDSIZE_MaxWidth].fLength;
-  }
-  pInfo->m_fActualWidth = fWidth;
-  return fWidth;
-}
-FX_FLOAT CFWL_GridImp::SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo,
-                                             FX_FLOAT fHeight) {
-  if (pInfo->m_Size[FWL_GRIDSIZE_MinHeight].eUnit == FWL_GRIDUNIT_Fixed &&
-      fHeight < pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength) {
-    fHeight = pInfo->m_Size[FWL_GRIDSIZE_MinHeight].fLength;
-  }
-  if (pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].eUnit == FWL_GRIDUNIT_Fixed &&
-      fHeight > pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength) {
-    fHeight = pInfo->m_Size[FWL_GRIDSIZE_MaxHeight].fLength;
-  }
-  pInfo->m_fActualHeight = fHeight;
-  return fHeight;
-}
-void CFWL_GridImp::SetAllWidgetsRect() {
-  FX_FLOAT fStartLeft = 0;
-  int32_t iColumns = m_Columns.GetSize();
-  for (int32_t i = 0; i < iColumns; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Columns[i]);
-    if (!pColRow) {
-      continue;
-    }
-    pColRow->m_fActualPos = fStartLeft;
-    fStartLeft += pColRow->m_fActualSize;
-  }
-  FX_FLOAT fStartTop = 0;
-  int32_t iRows = m_Rows.GetSize();
-  for (int32_t j = 0; j < iRows; j++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(m_Rows[j]);
-    if (!pColRow) {
-      continue;
-    }
-    pColRow->m_fActualPos = fStartTop;
-    fStartTop += pColRow->m_fActualSize;
-  }
-  FX_POSITION ps = m_mapWidgetInfo.GetStartPosition();
-  while (ps) {
-    IFWL_Widget* pWidget = NULL;
-    CFWL_GridWidgetInfo* pInfo = NULL;
-    m_mapWidgetInfo.GetNextAssoc(ps, (void*&)pWidget, (void*&)pInfo);
-    if (!pWidget || !pInfo) {
-      continue;
-    }
-    FX_FLOAT fColumnStart = 0;
-    CFWL_GridColRow* pColumn =
-        reinterpret_cast<CFWL_GridColRow*>(GetColRow(TRUE, pInfo->m_iColumn));
-    if (pColumn) {
-      fColumnStart = pColumn->m_fActualPos;
-    }
-    FX_FLOAT fRowStart = 0;
-    CFWL_GridColRow* pRow =
-        reinterpret_cast<CFWL_GridColRow*>(GetColRow(FALSE, pInfo->m_iRow));
-    if (pRow) {
-      fRowStart = pRow->m_fActualPos;
-    }
-    FX_FLOAT fColumnWidth = 0;
-    if (iColumns > 0) {
-      for (int32_t j = 0; j < pInfo->m_iColumnSpan; j++) {
-        CFWL_GridColRow* pCol = reinterpret_cast<CFWL_GridColRow*>(
-            GetColRow(TRUE, pInfo->m_iColumn + j));
-        if (!pCol) {
-          break;
-        }
-        fColumnWidth += pCol->m_fActualSize;
-      }
-    } else {
-      fColumnWidth = m_pProperties->m_rtWidget.width;
-    }
-    FX_FLOAT fRowHeight = 0;
-    if (iRows > 0) {
-      for (int32_t k = 0; k < pInfo->m_iRowSpan; k++) {
-        CFWL_GridColRow* pR = reinterpret_cast<CFWL_GridColRow*>(
-            GetColRow(FALSE, pInfo->m_iRow + k));
-        if (!pR) {
-          break;
-        }
-        fRowHeight += pR->m_fActualSize;
-      }
-    } else {
-      fRowHeight = m_pProperties->m_rtWidget.height;
-    }
-    FX_FLOAT fLeftMargin = 0, fRightMargin = 0;
-    FX_BOOL bLeftMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Left, fLeftMargin);
-    FX_BOOL bRightMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Right, fRightMargin);
-    FX_FLOAT fTopMargin = 0, fBottomMargin = 0;
-    FX_BOOL bTopMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Top, fTopMargin);
-    FX_BOOL bBottomMargin =
-        GetWidgetMargin(pWidget, FWL_GRIDMARGIN_Bottom, fBottomMargin);
-    if (pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
-      SetWidgetActualWidth(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Width].fLength);
-    } else {
-      if (bLeftMargin && bRightMargin) {
-        SetWidgetActualWidth(pInfo, fColumnWidth - fLeftMargin - fRightMargin);
-      } else {
-        CFX_RectF rtAuto;
-        pWidget->GetWidgetRect(rtAuto, TRUE);
-        SetWidgetActualWidth(pInfo, rtAuto.width);
-      }
-    }
-    if (pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
-      SetWidgetActualHeight(pInfo, pInfo->m_Size[FWL_GRIDSIZE_Height].fLength);
-    } else {
-      if (bTopMargin && bBottomMargin) {
-        SetWidgetActualHeight(pInfo, fRowHeight - fTopMargin - fBottomMargin);
-      } else {
-        CFX_RectF rtAuto;
-        pWidget->GetWidgetRect(rtAuto, TRUE);
-        SetWidgetActualHeight(pInfo, rtAuto.height);
-      }
-    }
-    if (bLeftMargin && bRightMargin &&
-        pInfo->m_Size[FWL_GRIDSIZE_Width].eUnit == FWL_GRIDUNIT_Fixed) {
-      fLeftMargin =
-          fColumnStart + fLeftMargin +
-          (fColumnWidth - fLeftMargin - fRightMargin - pInfo->m_fActualWidth) /
-              2;
-    } else if (bLeftMargin) {
-      fLeftMargin = fColumnStart + fLeftMargin;
-    } else if (bRightMargin) {
-      fLeftMargin =
-          fColumnStart + fColumnWidth - fRightMargin - pInfo->m_fActualWidth;
-    } else {
-      fLeftMargin = fColumnStart;
-    }
-    if (bTopMargin && bBottomMargin &&
-        pInfo->m_Size[FWL_GRIDSIZE_Height].eUnit == FWL_GRIDUNIT_Fixed) {
-      fTopMargin =
-          fRowStart + fTopMargin +
-          (fRowHeight - fTopMargin - fBottomMargin - pInfo->m_fActualHeight) /
-              2;
-    } else if (bTopMargin) {
-      fTopMargin = fRowStart + fTopMargin;
-    } else if (bBottomMargin) {
-      fTopMargin =
-          fRowStart + fRowHeight - fBottomMargin - pInfo->m_fActualHeight;
-    } else {
-      fTopMargin = fRowStart;
-    }
-    CFX_RectF rtWidget, rtOld;
-    rtWidget.Set(fLeftMargin, fTopMargin, pInfo->m_fActualWidth,
-                 pInfo->m_fActualHeight);
-    pWidget->GetWidgetRect(rtOld);
-    if (rtWidget == rtOld) {
-      continue;
-    }
-    pWidget->SetWidgetRect(rtWidget);
-    if (rtWidget.width == rtOld.width && rtWidget.height == rtOld.height) {
-      continue;
-    }
-    pWidget->Update();
-  }
-}
-FX_BOOL CFWL_GridImp::IsGrid(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FALSE;
-  return pWidget->GetClassID() == FWL_CLASSHASH_Grid;
-}
-void CFWL_GridImp::SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
-                                         FX_FLOAT fTotalSize) {
-  int32_t iAutoColRows = spanAutos.GetSize();
-  if (iAutoColRows < 1) {
-    return;
-  }
-  CFX_PtrArray autoNoMinMaxs;
-  FX_FLOAT fAutoPer = fTotalSize / iAutoColRows;
-  for (int32_t j = 0; j < iAutoColRows; j++) {
-    CFWL_GridColRow* pColumn = static_cast<CFWL_GridColRow*>(spanAutos[j]);
-    FX_FLOAT fOrgSize = pColumn->m_fActualSize;
-    if (SetColRowActualSize(pColumn, pColumn->m_fActualSize + fAutoPer, TRUE)) {
-      autoNoMinMaxs.Add(pColumn);
-    } else {
-      fTotalSize -= pColumn->m_fActualSize - fOrgSize;
-      int32_t iNoMinMax = iAutoColRows - (j + 1 - autoNoMinMaxs.GetSize());
-      if (iNoMinMax > 0 && fTotalSize > 0) {
-        fAutoPer = fTotalSize / iNoMinMax;
-      } else {
-        break;
-      }
-    }
-  }
-  int32_t iNormals = autoNoMinMaxs.GetSize();
-  if (fTotalSize > 0) {
-    if (iNormals == iAutoColRows) {
-      fAutoPer = fTotalSize / iNormals;
-      for (int32_t k = 0; k < iNormals; k++) {
-        CFWL_GridColRow* pColumn =
-            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[k]);
-        pColumn->m_fActualSize += fAutoPer;
-      }
-    } else {
-      SetSpanAutoColRowSize(autoNoMinMaxs, fTotalSize);
-    }
-  } else {
-  }
-}
-void CFWL_GridImp::SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
-                                           FX_FLOAT fTotalSize,
-                                           FX_FLOAT fTotalScaledNum) {
-  int32_t iScaledColRows = spanScaleds.GetSize();
-  if (iScaledColRows < 1) {
-    return;
-  }
-  CFX_PtrArray autoNoMinMaxs;
-  FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
-  for (int32_t i = 0; i < iScaledColRows; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
-    if (SetColRowActualSize(pColRow, pColRow->m_fActualSize +
-                                         fPerSize * pColRow->m_Size.fLength,
-                            TRUE)) {
-      autoNoMinMaxs.Add(pColRow);
-    } else {
-      fTotalSize -= pColRow->m_fActualSize;
-      fTotalScaledNum -= pColRow->m_Size.fLength;
-      int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
-      if (iNoMinMax > 0 && fTotalSize > 0) {
-        fPerSize = fTotalSize / fTotalScaledNum;
-      } else {
-        break;
-      }
-    }
-  }
-  int32_t iNormals = autoNoMinMaxs.GetSize();
-  if (fTotalSize > 0) {
-    if (iNormals == iScaledColRows) {
-      fPerSize = fTotalSize / fTotalScaledNum;
-      for (int32_t j = 0; j < iNormals; j++) {
-        CFWL_GridColRow* pColumn =
-            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[j]);
-        pColumn->m_fActualSize += fPerSize * pColumn->m_Size.fLength;
-      }
-    } else {
-      SetSpanScaledColRowSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
-    }
-  } else {
-  }
-}
-void CFWL_GridImp::SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
-                                        FX_FLOAT fTotalSize,
-                                        FX_FLOAT fTotalScaledNum) {
-  int32_t iScaledColRows = spanScaleds.GetSize();
-  if (iScaledColRows < 1) {
-    return;
-  }
-  CFX_PtrArray autoNoMinMaxs;
-  FX_FLOAT fPerSize = fTotalSize / fTotalScaledNum;
-  for (int32_t i = 0; i < iScaledColRows; i++) {
-    CFWL_GridColRow* pColRow = static_cast<CFWL_GridColRow*>(spanScaleds[i]);
-    if (!pColRow) {
-      continue;
-    }
-    FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
-    FX_FLOAT fOrgSize = pColRow->m_fActualSize;
-    if (SetColRowActualSize(pColRow, fSize, TRUE)) {
-      autoNoMinMaxs.Add(pColRow);
-    } else {
-      fTotalSize -= pColRow->m_fActualSize - fOrgSize;
-      fTotalScaledNum -= pColRow->m_Size.fLength;
-      int32_t iNoMinMax = iScaledColRows - (i + 1 - autoNoMinMaxs.GetSize());
-      if (iNoMinMax > 0 && fTotalSize > 0) {
-        fPerSize = fTotalSize / fTotalScaledNum;
-      } else {
-        break;
-      }
-    }
-  }
-  int32_t iNormals = autoNoMinMaxs.GetSize();
-  if (fTotalSize > 0) {
-    if (iNormals == iScaledColRows) {
-      fPerSize = fTotalSize / fTotalScaledNum;
-      for (int32_t i = 0; i < iNormals; i++) {
-        CFWL_GridColRow* pColRow =
-            static_cast<CFWL_GridColRow*>(autoNoMinMaxs[i]);
-        if (!pColRow) {
-          continue;
-        }
-        FX_FLOAT fSize = fPerSize * pColRow->m_Size.fLength;
-        pColRow->m_fActualSize = fSize;
-      }
-    } else {
-      SetScaledColRowsSize(autoNoMinMaxs, fTotalSize, fTotalScaledNum);
-    }
-  } else {
-  }
-}
-CFWL_GridImpDelegate::CFWL_GridImpDelegate(CFWL_GridImp* pOwner)
-    : m_pOwner(pOwner) {}
-int32_t CFWL_GridImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (pMessage->GetClassID() != FWL_MSGHASH_Mouse) {
-    return 0;
-  }
-  CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-  if (pMsg->m_dwCmd != FWL_MSGMOUSECMD_LButtonDown) {
-    return 0;
-  }
-  return 1;
-}
-FWL_ERR CFWL_GridImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  return m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fwl/core/fwl_gridimp.h b/xfa/src/fwl/core/fwl_gridimp.h
deleted file mode 100644
index 326b236..0000000
--- a/xfa/src/fwl/core/fwl_gridimp.h
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_GRIDIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_GRIDIMP_H_
-
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_content.h"
-#include "xfa/include/fwl/core/fwl_grid.h"
-#include "xfa/src/fwl/core/fwl_contentimp.h"
-
-class CFWL_GridLength {
- public:
-  CFWL_GridLength() : fLength(0), eUnit(FWL_GRIDUNIT_Fixed) {}
-  CFWL_GridLength(FX_FLOAT fValue, FWL_GRIDUNIT e)
-      : fLength(fValue), eUnit(e) {}
-  FX_FLOAT fLength;
-  FWL_GRIDUNIT eUnit;
-};
-
-class CFWL_GridColRow {
- public:
-  CFWL_GridColRow()
-      : m_Size(1, FWL_GRIDUNIT_Scaled),
-        m_MinSize(0, FWL_GRIDUNIT_Fixed),
-        m_MaxSize(0, FWL_GRIDUNIT_Infinity),
-        m_fActualSize(0),
-        m_fActualPos(0) {}
-  CFWL_GridLength m_Size;
-  CFWL_GridLength m_MinSize;
-  CFWL_GridLength m_MaxSize;
-  FX_FLOAT m_fActualSize;
-  FX_FLOAT m_fActualPos;
-};
-
-class CFWL_GridWidgetInfo {
- public:
-  CFWL_GridWidgetInfo()
-      : m_iColumn(0),
-        m_iColumnSpan(1),
-        m_iRow(0),
-        m_iRowSpan(1),
-        m_dwMarginFlag(0),
-        m_fActualWidth(0),
-        m_fActualHeight(0) {
-    m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
-    m_Size[FWL_GRIDSIZE_Width].fLength = 0;
-    m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
-    m_Size[FWL_GRIDSIZE_Height].fLength = 0;
-    m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
-    m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
-    m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
-    m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
-    m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
-    m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
-    m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
-    m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
-    m_Margin[0] = m_Margin[1] = m_Margin[2] = m_Margin[3] = 0;
-  }
-  int32_t m_iColumn;
-  int32_t m_iColumnSpan;
-  int32_t m_iRow;
-  int32_t m_iRowSpan;
-  CFWL_GridLength m_Size[6];
-  FX_DWORD m_dwMarginFlag;
-  FX_FLOAT m_Margin[4];
-  FX_FLOAT m_fActualWidth;
-  FX_FLOAT m_fActualHeight;
-};
-
-class CFWL_GridImp : public CFWL_ContentImp {
- public:
-  CFWL_GridImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
-  virtual ~CFWL_GridImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-
-  virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
-  virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
-  virtual FWL_HGRIDCOLROW InsertColRow(FX_BOOL bColumn, int32_t nIndex = -1);
-  virtual int32_t CountColRows(FX_BOOL bColumn);
-  virtual FWL_HGRIDCOLROW GetColRow(FX_BOOL bColumn, int32_t nIndex);
-  virtual int32_t GetIndex(FWL_HGRIDCOLROW hColRow);
-  virtual FX_FLOAT GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
-  virtual FWL_ERR SetSize(FWL_HGRIDCOLROW hColRow,
-                          FX_FLOAT fSize,
-                          FWL_GRIDUNIT eUnit);
-  FX_FLOAT GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
-  FWL_ERR SetMinSize(FWL_HGRIDCOLROW hColRow,
-                     FX_FLOAT fSize,
-                     FWL_GRIDUNIT eUnit);
-  FX_FLOAT GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
-  FWL_ERR SetMaxSize(FWL_HGRIDCOLROW hColRow,
-                     FX_FLOAT fSize,
-                     FWL_GRIDUNIT eUnit);
-  virtual FX_BOOL DeleteColRow(FWL_HGRIDCOLROW hColRow);
-  virtual FX_BOOL IsColumn(FWL_HGRIDCOLROW hColRow);
-  virtual int32_t GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn);
-  virtual FWL_ERR SetWidgetPos(IFWL_Widget* pWidget,
-                               int32_t iPos,
-                               FX_BOOL bColumn);
-  virtual int32_t GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn);
-  virtual FWL_ERR SetWidgetSpan(IFWL_Widget* pWidget,
-                                int32_t iSpan,
-                                FX_BOOL bColumn);
-  virtual FX_FLOAT GetWidgetSize(IFWL_Widget* pWidget,
-                                 FWL_GRIDSIZE eSize,
-                                 FWL_GRIDUNIT& eUnit);
-  virtual FWL_ERR SetWidgetSize(IFWL_Widget* pWidget,
-                                FWL_GRIDSIZE eSize,
-                                FX_FLOAT fSize,
-                                FWL_GRIDUNIT eUit);
-  virtual FX_BOOL GetWidgetMargin(IFWL_Widget* pWidget,
-                                  FWL_GRIDMARGIN eMargin,
-                                  FX_FLOAT& fMargin);
-  virtual FWL_ERR SetWidgetMargin(IFWL_Widget* pWidget,
-                                  FWL_GRIDMARGIN eMargin,
-                                  FX_FLOAT fMargin);
-  virtual FWL_ERR RemoveWidgetMargin(IFWL_Widget* pWidget,
-                                     FWL_GRIDMARGIN eMargin);
-  virtual FX_FLOAT GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit);
-  virtual FWL_ERR SetGridSize(FWL_GRIDSIZE eSize,
-                              FX_FLOAT fSize,
-                              FWL_GRIDUNIT eUit);
-
- protected:
-  CFWL_GridWidgetInfo* GetWidgetInfo(IFWL_Widget* pWidget);
-  void ProcFixedColRow(CFWL_GridColRow* pColRow,
-                       int32_t nIndex,
-                       FX_FLOAT fColRowSize,
-                       FX_BOOL bColumn);
-  void ProcAutoColRow(CFWL_GridColRow* pColRow,
-                      int32_t nIndex,
-                      FX_BOOL bColumn);
-  void ProcScaledColRow(CFWL_GridColRow* pColRow,
-                        int32_t nIndex,
-                        FX_FLOAT fColRowSize,
-                        FX_BOOL bColumn);
-  void CalcWidgetWidth(IFWL_Widget* pWidget,
-                       CFWL_GridWidgetInfo* pInfo,
-                       FX_FLOAT fColunmWidth);
-  void CalcWidgetHeigt(IFWL_Widget* pWidget,
-                       CFWL_GridWidgetInfo* pInfo,
-                       FX_FLOAT fRowHeigt);
-  FX_FLOAT CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
-                                     CFWL_GridWidgetInfo* pInfo);
-  FX_FLOAT CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
-                                      CFWL_GridWidgetInfo* pInfo);
-  FX_FLOAT ProcessColumns(FX_FLOAT fWidth);
-  FX_FLOAT ProcessRows(FX_FLOAT fHeight);
-  FX_FLOAT ProcessUnCertainColumns();
-  FX_FLOAT ProcessUnCertainRows();
-  FX_BOOL SetColRowActualSize(CFWL_GridColRow* pColRow,
-                              FX_FLOAT fSize,
-                              FX_BOOL bSetBeyond = FALSE);
-  FX_FLOAT SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fWidth);
-  FX_FLOAT SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fHeight);
-  void SetAllWidgetsRect();
-  FX_BOOL IsGrid(IFWL_Widget* pWidget);
-  void SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
-                             FX_FLOAT fTotalSize);
-  void SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
-                               FX_FLOAT fTotalSize,
-                               FX_FLOAT fTotalScaledNum);
-  void SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
-                            FX_FLOAT fTotalSize,
-                            FX_FLOAT fTotalScaledNum);
-  CFX_PtrArray m_Rows;
-  CFX_PtrArray m_Columns;
-  CFX_PtrArray m_Widgets;
-  CFX_MapPtrToPtr m_mapWidgetInfo;
-  CFWL_GridLength m_Size[6];
-  friend class CFWL_GridImpDelegate;
-};
-
-class CFWL_GridImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_GridImpDelegate(CFWL_GridImp* pOwner);
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
- protected:
-  CFWL_GridImp* m_pOwner;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_GRIDIMP_H_
diff --git a/xfa/src/fwl/core/fwl_noteimp.cpp b/xfa/src/fwl/core/fwl_noteimp.cpp
deleted file mode 100644
index 3a46446..0000000
--- a/xfa/src/fwl/core/fwl_noteimp.cpp
+++ /dev/null
@@ -1,1097 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_grid.h"
-#include "xfa/src/fwl/basewidget/fwl_tooltipctrlimp.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-CFWL_NoteLoop::CFWL_NoteLoop(CFWL_WidgetImp* pForm)
-    : m_pForm(pForm), m_bContinueModal(TRUE) {}
-FX_BOOL CFWL_NoteLoop::PreProcessMessage(CFWL_Message* pMessage) {
-  if (!m_pForm) {
-    return FALSE;
-  }
-  return TranslateAccelerator(pMessage);
-}
-FWL_ERR CFWL_NoteLoop::Idle(int32_t count) {
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_)
-  if (count <= 0) {
-#endif
-    CFWL_EvtIdle ev;
-    IFWL_App* pApp = FWL_GetApp();
-    if (!pApp)
-      return FWL_ERR_Indefinite;
-    IFWL_NoteDriver* pDriver = pApp->GetNoteDriver();
-    if (!pDriver)
-      return FWL_ERR_Indefinite;
-    pDriver->SendNote(&ev);
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_)
-  }
-#endif
-  return FWL_ERR_Indefinite;
-}
-CFWL_WidgetImp* CFWL_NoteLoop::GetForm() {
-  return m_pForm;
-}
-FX_BOOL CFWL_NoteLoop::ContinueModal() {
-  return m_bContinueModal;
-}
-FWL_ERR CFWL_NoteLoop::EndModalLoop() {
-  m_bContinueModal = FALSE;
-#if (_FX_OS_ == _FX_MACOSX_)
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
-  adapterWidgetMgr->EndLoop();
-#endif
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_NoteLoop::TranslateAccelerator(CFWL_Message* pMessage) {
-  if (pMessage->GetClassID() != FWL_MSGHASH_Key) {
-    return FALSE;
-  }
-  CFWL_MsgKey* pMsgKey = static_cast<CFWL_MsgKey*>(pMessage);
-  if (pMsgKey->m_dwCmd != FWL_MSGKEYCMD_KeyDown) {
-    return FALSE;
-  }
-  CFX_MapAccelerators& accel =
-      static_cast<CFWL_FormImp*>(m_pForm)->GetAccelerator();
-  FX_POSITION pos = accel.GetStartPosition();
-  if (!pos) {
-    return FALSE;
-  }
-  FX_DWORD vrKey, rValue;
-  while (pos) {
-    accel.GetNextAssoc(pos, vrKey, rValue);
-    FX_DWORD dwFlags = (vrKey & 0xFF00) >> 8;
-    FX_DWORD m_dwKeyCode = vrKey & 0x00FF;
-    if (pMsgKey->m_dwFlags == dwFlags && pMsgKey->m_dwKeyCode == m_dwKeyCode) {
-      GenerateCommondEvent(rValue);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FWL_ERR CFWL_NoteLoop::SetMainForm(CFWL_WidgetImp* pForm) {
-  m_pForm = pForm;
-  return FWL_ERR_Succeeded;
-}
-void CFWL_NoteLoop::GenerateCommondEvent(FX_DWORD dwCommand) {
-  CFWL_EvtMenuCommand ev;
-  ev.m_iCommand = dwCommand;
-  IFWL_NoteThread* pThread = m_pForm->GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
-  if (!pDriver)
-    return;
-  pDriver->SendNote(&ev);
-}
-CFWL_NoteDriver::CFWL_NoteDriver()
-    : m_sendEventCalled(0),
-      m_maxSize(500),
-      m_bFullScreen(FALSE),
-      m_pHover(nullptr),
-      m_pFocus(nullptr),
-      m_pGrab(nullptr),
-      m_hook(nullptr) {
-  m_pNoteLoop = new CFWL_NoteLoop;
-  PushNoteLoop(m_pNoteLoop);
-}
-CFWL_NoteDriver::~CFWL_NoteDriver() {
-  delete m_pNoteLoop;
-  ClearInvalidEventTargets(TRUE);
-}
-FX_BOOL CFWL_NoteDriver::SendNote(CFWL_Note* pNote) {
-  if (pNote->IsEvent()) {
-    int32_t iCount = m_eventTargets.GetCount();
-    if (iCount < 1) {
-      return TRUE;
-    }
-    if (FWL_EVTHASH_Mouse == static_cast<CFWL_Event*>(pNote)->GetClassID()) {
-      CFWL_EvtMouse* pMouse = static_cast<CFWL_EvtMouse*>(pNote);
-      if (FWL_MSGMOUSECMD_MouseHover == pMouse->m_dwCmd) {
-        if (m_pNoteLoop->GetForm() &&
-            CFWL_ToolTipContainer::getInstance()->ProcessEnter(
-                pMouse, m_pNoteLoop->GetForm()->GetInterface())) {
-        }
-      } else if (FWL_MSGMOUSECMD_MouseLeave == pMouse->m_dwCmd) {
-        if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
-        }
-      } else if ((FWL_MSGMOUSECMD_LButtonDown <= pMouse->m_dwCmd) &&
-                 (FWL_MSGMOUSECMD_MButtonDblClk >= pMouse->m_dwCmd)) {
-        if (CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse)) {
-        }
-      }
-    }
-    m_sendEventCalled++;
-    FX_POSITION pos = m_eventTargets.GetStartPosition();
-    while (pos) {
-      void* key = NULL;
-      CFWL_EventTarget* pEventTarget;
-      m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
-      if (pEventTarget && !pEventTarget->IsInvalid()) {
-        pEventTarget->ProcessEvent(static_cast<CFWL_Event*>(pNote));
-      }
-    }
-    m_sendEventCalled--;
-  } else {
-    if (!pNote->m_pDstTarget)
-      return FALSE;
-    IFWL_WidgetDelegate* pDelegate = pNote->m_pDstTarget->SetDelegate(NULL);
-    if (pDelegate) {
-      pDelegate->OnProcessMessage(static_cast<CFWL_Message*>(pNote));
-    }
-  }
-  return TRUE;
-}
-extern void FWL_PostMessageToMainRoop(CFWL_Message* pMessage);
-FX_BOOL CFWL_NoteDriver::PostMessage(CFWL_Message* pMessage) {
-  FWL_PostMessageToMainRoop(pMessage);
-  return TRUE;
-}
-#define FWL_NoteDriver_EventKey 1100
-FWL_ERR CFWL_NoteDriver::RegisterEventTarget(IFWL_Widget* pListener,
-                                             IFWL_Widget* pEventSource,
-                                             FX_DWORD dwFilter) {
-  FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
-      (void*)(uintptr_t)FWL_NoteDriver_EventKey);
-  if (dwkey == 0) {
-    void* random = FX_Random_MT_Start(0);
-    dwkey = rand();
-    FX_Random_MT_Close(random);
-    pListener->SetPrivateData((void*)(uintptr_t)FWL_NoteDriver_EventKey,
-                              (void*)(uintptr_t)dwkey, NULL);
-  }
-  CFWL_EventTarget* value = NULL;
-  if (!m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
-    value = new CFWL_EventTarget(this, pListener);
-    m_eventTargets.SetAt((void*)(uintptr_t)dwkey, value);
-  }
-  value->SetEventSource(pEventSource, dwFilter);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_NoteDriver::UnregisterEventTarget(IFWL_Widget* pListener) {
-  FX_DWORD dwkey = (FX_DWORD)(uintptr_t)pListener->GetPrivateData(
-      (void*)(uintptr_t)FWL_NoteDriver_EventKey);
-  if (dwkey == 0) {
-    return FWL_ERR_Indefinite;
-  }
-  CFWL_EventTarget* value = NULL;
-  if (m_eventTargets.Lookup((void*)(uintptr_t)dwkey, (void*&)value)) {
-    value->FlagInvalid();
-  }
-  return FWL_ERR_Succeeded;
-}
-void CFWL_NoteDriver::ClearEventTargets(FX_BOOL bRemoveAll) {
-  ClearInvalidEventTargets(bRemoveAll);
-}
-int32_t CFWL_NoteDriver::GetQueueMaxSize() const {
-  return m_maxSize;
-}
-FWL_ERR CFWL_NoteDriver::SetQueueMaxSize(const int32_t size) {
-  m_maxSize = size;
-  return FWL_ERR_Succeeded;
-}
-IFWL_NoteThread* CFWL_NoteDriver::GetOwnerThread() const {
-  return FWL_GetApp();
-}
-FWL_ERR CFWL_NoteDriver::PushNoteLoop(IFWL_NoteLoop* pNoteLoop) {
-  m_noteLoopQueue.Add(pNoteLoop);
-  return FWL_ERR_Succeeded;
-}
-IFWL_NoteLoop* CFWL_NoteDriver::PopNoteLoop() {
-  int32_t pos = m_noteLoopQueue.GetSize();
-  if (pos <= 0)
-    return NULL;
-  IFWL_NoteLoop* p =
-      static_cast<IFWL_NoteLoop*>(m_noteLoopQueue.GetAt(pos - 1));
-  m_noteLoopQueue.RemoveAt(pos - 1);
-  return p;
-}
-FX_BOOL CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify) {
-  if (m_pFocus == pFocus) {
-    return TRUE;
-  }
-  IFWL_Widget* pPrev = m_pFocus;
-  m_pFocus = pFocus;
-  if (pPrev) {
-    CFWL_MsgKillFocus ms;
-    ms.m_pDstTarget = pPrev;
-    ms.m_pSrcTarget = pPrev;
-    if (bNotify) {
-      ms.m_dwExtend = 1;
-    }
-    IFWL_WidgetDelegate* pDelegate = pPrev->SetDelegate(NULL);
-    if (pDelegate) {
-      pDelegate->OnProcessMessage(&ms);
-    }
-  }
-  if (pFocus) {
-    IFWL_Widget* pWidget =
-        FWL_GetWidgetMgr()->GetWidget(pFocus, FWL_WGTRELATION_SystemForm);
-    CFWL_FormImp* pForm =
-        pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
-    if (pForm) {
-      CFWL_WidgetImp* pNewFocus =
-          static_cast<CFWL_WidgetImp*>(pFocus->GetImpl());
-      pForm->SetSubFocus(pNewFocus);
-    }
-    CFWL_MsgSetFocus ms;
-    ms.m_pDstTarget = pFocus;
-    if (bNotify) {
-      ms.m_dwExtend = 1;
-    }
-    IFWL_WidgetDelegate* pDelegate = pFocus->SetDelegate(NULL);
-    if (pDelegate) {
-      pDelegate->OnProcessMessage(&ms);
-    }
-  }
-  return TRUE;
-}
-FWL_ERR CFWL_NoteDriver::Run() {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return FWL_ERR_Indefinite;
-#if (_FX_OS_ == _FX_MACOSX_)
-  IFWL_AdapterWidgetMgr* adapterWidgetMgr = pWidgetMgr->GetAdapterWidgetMgr();
-  CFWL_NoteLoop* pTopLoop = GetTopLoop();
-  if (pTopLoop) {
-    CFWL_WidgetImp* formImp = pTopLoop->GetForm();
-    if (formImp) {
-      IFWL_Widget* pForm = formImp->GetInterface();
-      adapterWidgetMgr->RunLoop(pForm);
-    }
-  }
-#elif(_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
-    FX_BOOL bIdle = TRUE;
-    int32_t iIdleCount = 0;
-    CFWL_NoteLoop* pTopLoop = NULL;
-    for (;;) {
-      pTopLoop = GetTopLoop();
-      if (!pTopLoop || !pTopLoop->ContinueModal()) {
-        break;
-      }
-      if (UnqueueMessage(pTopLoop)) {
-        continue;
-      }
-      while (bIdle && !(pWidgetMgr->CheckMessage_Native())) {
-        if (FWL_ERR_Indefinite == pTopLoop->Idle(iIdleCount++)) {
-          bIdle = FALSE;
-        }
-      }
-      do {
-        if (FWL_ERR_Indefinite == pWidgetMgr->DispatchMessage_Native()) {
-          break;
-        }
-        if (pWidgetMgr->IsIdleMessage_Native()) {
-          bIdle = TRUE;
-          iIdleCount = 0;
-        }
-      } while (pWidgetMgr->CheckMessage_Native());
-    }
-#elif(_FX_OS_ == _FX_LINUX_DESKTOP_)
-    CFWL_NoteLoop* pTopLoop = NULL;
-    for (;;) {
-      pTopLoop = GetTopLoop();
-      if (!pTopLoop || !pTopLoop->ContinueModal()) {
-        break;
-      }
-      if (UnqueueMessage(pTopLoop)) {
-        continue;
-      }
-      if (pWidgetMgr->CheckMessage_Native()) {
-        pWidgetMgr->DispatchMessage_Native();
-      }
-    }
-#endif
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_NoteDriver::GetFocus() {
-  return m_pFocus;
-}
-IFWL_Widget* CFWL_NoteDriver::GetHover() {
-  return m_pHover;
-}
-void CFWL_NoteDriver::SetHover(IFWL_Widget* pHover) {
-  m_pHover = pHover;
-}
-void CFWL_NoteDriver::SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) {
-  m_pGrab = bSet ? pGrab : NULL;
-}
-void CFWL_NoteDriver::NotifyTargetHide(IFWL_Widget* pNoteTarget) {
-  if (m_pFocus == pNoteTarget) {
-    m_pFocus = NULL;
-  }
-  if (m_pHover == pNoteTarget) {
-    m_pHover = NULL;
-  }
-  if (m_pGrab == pNoteTarget) {
-    m_pGrab = NULL;
-  }
-}
-void CFWL_NoteDriver::NotifyTargetDestroy(IFWL_Widget* pNoteTarget) {
-  if (m_pFocus == pNoteTarget) {
-    m_pFocus = NULL;
-  }
-  if (m_pHover == pNoteTarget) {
-    m_pHover = NULL;
-  }
-  if (m_pGrab == pNoteTarget) {
-    m_pGrab = NULL;
-  }
-  UnregisterEventTarget(pNoteTarget);
-  int32_t count = m_forms.GetSize();
-  for (int32_t nIndex = 0; nIndex < count; nIndex++) {
-    CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[nIndex]);
-    if (!pForm) {
-      continue;
-    }
-    CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
-    if (!pSubFocus)
-      return;
-    if (pSubFocus && pSubFocus->GetInterface() == pNoteTarget) {
-      pForm->SetSubFocus(NULL);
-    }
-  }
-}
-void CFWL_NoteDriver::NotifyFullScreenMode(IFWL_Widget* pNoteTarget,
-                                           FX_BOOL bFullScreen) {
-  m_bFullScreen = bFullScreen;
-}
-FWL_ERR CFWL_NoteDriver::RegisterForm(CFWL_WidgetImp* pForm) {
-  if (!pForm)
-    return FWL_ERR_Indefinite;
-  if (m_forms.Find(pForm) >= 0) {
-    return FWL_ERR_Indefinite;
-  }
-  m_forms.Add(pForm);
-  if (m_forms.GetSize() == 1) {
-    CFWL_NoteLoop* pLoop =
-        static_cast<CFWL_NoteLoop*>(m_noteLoopQueue.GetAt(0));
-    if (!pLoop)
-      return FWL_ERR_Indefinite;
-    pLoop->SetMainForm(pForm);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_NoteDriver::UnRegisterForm(CFWL_WidgetImp* pForm) {
-  if (!pForm)
-    return FWL_ERR_Indefinite;
-  int32_t nIndex = m_forms.Find(pForm);
-  if (nIndex < 0) {
-    return FWL_ERR_Indefinite;
-  }
-  m_forms.RemoveAt(nIndex);
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_NoteDriver::QueueMessage(CFWL_Message* pMessage) {
-  pMessage->Retain();
-  m_noteQueue.Add(pMessage);
-  return TRUE;
-}
-FX_BOOL CFWL_NoteDriver::UnqueueMessage(CFWL_NoteLoop* pNoteLoop) {
-  if (m_noteQueue.GetSize() < 1) {
-    return FALSE;
-  }
-  CFWL_Message* pMessage = static_cast<CFWL_Message*>(m_noteQueue[0]);
-  m_noteQueue.RemoveAt(0);
-  if (!IsValidMessage(pMessage)) {
-    pMessage->Release();
-    return TRUE;
-  }
-  FX_BOOL bHookMessage = FALSE;
-  if (m_hook) {
-    bHookMessage = (*m_hook)(pMessage, m_hookInfo);
-  }
-  if (!bHookMessage && !pNoteLoop->PreProcessMessage(pMessage)) {
-    ProcessMessage(pMessage);
-  }
-  pMessage->Release();
-  return TRUE;
-}
-CFWL_NoteLoop* CFWL_NoteDriver::GetTopLoop() {
-  int32_t size = m_noteLoopQueue.GetSize();
-  if (size <= 0)
-    return NULL;
-  return static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[size - 1]);
-}
-int32_t CFWL_NoteDriver::CountLoop() {
-  return m_noteLoopQueue.GetSize();
-}
-void CFWL_NoteDriver::SetHook(FWLMessageHookCallback callback, void* info) {
-  m_hook = callback;
-  m_hookInfo = info;
-}
-FX_BOOL CFWL_NoteDriver::ProcessMessage(CFWL_Message* pMessage) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  IFWL_Widget* pMessageForm = pWidgetMgr->IsFormDisabled()
-                                  ? pMessage->m_pDstTarget
-                                  : GetMessageForm(pMessage->m_pDstTarget);
-  if (!pMessageForm)
-    return FALSE;
-  if (DispatchMessage(pMessage, pMessageForm)) {
-    if (pMessage->GetClassID() == FWL_MSGHASH_Mouse) {
-      MouseSecondary(static_cast<CFWL_MsgMouse*>(pMessage));
-    }
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage,
-                                         IFWL_Widget* pMessageForm) {
-  FX_BOOL bRet = FALSE;
-  switch (pMessage->GetClassID()) {
-    case FWL_MSGHASH_Activate: {
-      bRet = DoActivate(static_cast<CFWL_MsgActivate*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_Deactivate: {
-      bRet = DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage),
-                          pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_SetFocus: {
-      bRet = DoSetFocus(static_cast<CFWL_MsgSetFocus*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_KillFocus: {
-      bRet =
-          DoKillFocus(static_cast<CFWL_MsgKillFocus*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      bRet = DoKey(static_cast<CFWL_MsgKey*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_Mouse: {
-      bRet = DoMouse(static_cast<CFWL_MsgMouse*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_MouseWheel: {
-      bRet = DoWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage), pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_Size: {
-      bRet = DoSize(static_cast<CFWL_MsgSize*>(pMessage));
-      break;
-    }
-    case FWL_MSGHASH_Cursor: {
-      bRet = TRUE;
-      break;
-    }
-    case FWL_MSGHASH_WindowMove: {
-      bRet = DoWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage),
-                          pMessageForm);
-      break;
-    }
-    case FWL_MSGHASH_DropFiles: {
-      bRet =
-          DoDragFiles(static_cast<CFWL_MsgDropFiles*>(pMessage), pMessageForm);
-      break;
-    }
-    default: {
-      bRet = TRUE;
-      break;
-    }
-  }
-  if (bRet) {
-    IFWL_WidgetDelegate* pDelegate = pMessage->m_pDstTarget->SetDelegate(NULL);
-    if (pDelegate) {
-      pDelegate->OnProcessMessage(pMessage);
-    }
-  }
-  return bRet;
-}
-FX_BOOL CFWL_NoteDriver::DoActivate(CFWL_MsgActivate* pMsg,
-                                    IFWL_Widget* pMessageForm) {
-  if (m_bFullScreen) {
-    return FALSE;
-  }
-  pMsg->m_pDstTarget = pMessageForm;
-  return (pMsg->m_pDstTarget)->GetStates() & FWL_WGTSTATE_Deactivated;
-}
-FX_BOOL CFWL_NoteDriver::DoDeactivate(CFWL_MsgDeactivate* pMsg,
-                                      IFWL_Widget* pMessageForm) {
-  if (m_bFullScreen) {
-    return FALSE;
-  }
-  int32_t iTrackLoop = m_noteLoopQueue.GetSize();
-  if (iTrackLoop <= 0)
-    return FALSE;
-  if (iTrackLoop == 1) {
-    if (pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
-      return FALSE;
-    }
-    if (pMsg->m_pSrcTarget &&
-        pMsg->m_pSrcTarget->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"))) {
-      return FALSE;
-    }
-    if (pMsg->m_pSrcTarget && pMsg->m_pSrcTarget->GetClassID() == 1111984755) {
-      return FALSE;
-    }
-    return TRUE;
-  }
-  IFWL_Widget* pDst = pMsg->m_pDstTarget;
-  if (!pDst)
-    return FALSE;
-#if (_FX_OS_ == _FX_MACOSX_)
-  if (pDst == pMessageForm && pDst->IsInstance(L"FWL_FORMPROXY")) {
-    return TRUE;
-  }
-#endif
-  return pDst != pMessageForm &&
-         !pDst->IsInstance(FX_WSTRC(L"FWL_FORMPROXY")) &&
-         !pMessageForm->IsInstance(FX_WSTRC(L"FWL_FORMPROXY"));
-}
-FX_BOOL CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus* pMsg,
-                                    IFWL_Widget* pMessageForm) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (pWidgetMgr->IsFormDisabled()) {
-    m_pFocus = pMsg->m_pDstTarget;
-    return TRUE;
-  } else {
-    IFWL_Widget* pWidget = pMsg->m_pDstTarget;
-    CFWL_FormImp* pForm =
-        pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
-    if (pForm) {
-      CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
-      if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) {
-        pMsg->m_pDstTarget = pSubFocus->GetInterface();
-        if (m_pFocus != pMsg->m_pDstTarget) {
-          m_pFocus = pMsg->m_pDstTarget;
-          return TRUE;
-        }
-      }
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_NoteDriver::DoKillFocus(CFWL_MsgKillFocus* pMsg,
-                                     IFWL_Widget* pMessageForm) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (pWidgetMgr->IsFormDisabled()) {
-    if (m_pFocus == pMsg->m_pDstTarget) {
-      m_pFocus = NULL;
-    }
-    return TRUE;
-  }
-  IFWL_Widget* pWidget = pMsg->m_pDstTarget;
-  CFWL_FormImp* pForm =
-      pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr;
-  if (pForm) {
-    CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus();
-    if (pSubFocus && (pSubFocus->GetStates() & FWL_WGTSTATE_Focused)) {
-      pMsg->m_pDstTarget = pSubFocus->GetInterface();
-      if (m_pFocus == pMsg->m_pDstTarget) {
-        m_pFocus = NULL;
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_NoteDriver::DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm) {
-#if (_FX_OS_ != _FX_MACOSX_)
-  if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
-      pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
-    CFWL_WidgetMgr* pWidgetMgr =
-        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-    IFWL_Widget* pForm = GetMessageForm(pMsg->m_pDstTarget);
-    IFWL_Widget* pFocus = m_pFocus;
-    if (m_pFocus) {
-      if (pWidgetMgr->GetWidget(m_pFocus, FWL_WGTRELATION_SystemForm) !=
-          pForm) {
-        pFocus = NULL;
-      }
-    }
-    FX_BOOL bFind = FALSE;
-    IFWL_Widget* pNextTabStop = pWidgetMgr->nextTab(pForm, pFocus, bFind);
-    if (!pNextTabStop) {
-      bFind = FALSE;
-      pNextTabStop = pWidgetMgr->nextTab(pForm, NULL, bFind);
-    }
-    if (pNextTabStop == pFocus) {
-      return TRUE;
-    }
-    if (pNextTabStop) {
-      SetFocus(pNextTabStop);
-    }
-    return TRUE;
-  }
-#endif
-  if (!m_pFocus) {
-    if (pMsg->m_dwCmd == FWL_MSGKEYCMD_KeyDown &&
-        pMsg->m_dwKeyCode == FWL_VKEY_Return) {
-      CFWL_WidgetMgr* pWidgetMgr =
-          static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-      IFWL_Widget* defButton = pWidgetMgr->GetDefaultButton(pMessageForm);
-      if (defButton) {
-        pMsg->m_pDstTarget = defButton;
-        return TRUE;
-      }
-    }
-    return FALSE;
-  }
-  pMsg->m_pDstTarget = m_pFocus;
-  return TRUE;
-}
-FX_BOOL CFWL_NoteDriver::DoMouse(CFWL_MsgMouse* pMsg,
-                                 IFWL_Widget* pMessageForm) {
-  if (pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave ||
-      pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseHover ||
-      pMsg->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) {
-    return pMsg->m_pDstTarget != NULL;
-  }
-  if (pMsg->m_pDstTarget != pMessageForm) {
-    pMsg->m_pDstTarget->TransformTo(pMessageForm, pMsg->m_fx, pMsg->m_fy);
-  }
-  if (!DoMouseEx(pMsg, pMessageForm)) {
-    pMsg->m_pDstTarget = pMessageForm;
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_NoteDriver::DoWheel(CFWL_MsgMouseWheel* pMsg,
-                                 IFWL_Widget* pMessageForm) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return FALSE;
-  IFWL_Widget* pDst =
-      pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
-  if (!pDst)
-    return FALSE;
-  while (pDst && pDst->GetClassID() == FWL_CLASSHASH_Grid) {
-    pDst = pDst->GetParent();
-  }
-  pMessageForm->TransformTo(pDst, pMsg->m_fx, pMsg->m_fy);
-  pMsg->m_pDstTarget = pDst;
-  return TRUE;
-}
-FX_BOOL CFWL_NoteDriver::DoSize(CFWL_MsgSize* pMsg) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return FALSE;
-  pWidgetMgr->NotifySizeChanged(pMsg->m_pDstTarget, (FX_FLOAT)pMsg->m_iWidth,
-                                (FX_FLOAT)pMsg->m_iHeight);
-  return TRUE;
-}
-FX_BOOL CFWL_NoteDriver::DoWindowMove(CFWL_MsgWindowMove* pMsg,
-                                      IFWL_Widget* pMessageForm) {
-  return pMsg->m_pDstTarget == pMessageForm;
-}
-FX_BOOL CFWL_NoteDriver::DoDragFiles(CFWL_MsgDropFiles* pMsg,
-                                     IFWL_Widget* pMessageForm) {
-  return pMsg->m_pDstTarget == pMessageForm;
-}
-FX_BOOL CFWL_NoteDriver::DoMouseEx(CFWL_MsgMouse* pMsg,
-                                   IFWL_Widget* pMessageForm) {
-  CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  if (!pWidgetMgr)
-    return FALSE;
-  IFWL_Widget* pTarget = NULL;
-  if (m_pGrab)
-    pTarget = m_pGrab;
-  if (!pTarget) {
-    pTarget =
-        pWidgetMgr->GetWidgetAtPoint(pMessageForm, pMsg->m_fx, pMsg->m_fy);
-    while (pTarget && pTarget->GetClassID() == FWL_CLASSHASH_Grid) {
-      pTarget = pTarget->GetParent();
-    }
-  }
-  if (pTarget) {
-    if (pMessageForm != pTarget) {
-      pMessageForm->TransformTo(pTarget, pMsg->m_fx, pMsg->m_fy);
-    }
-  }
-  if (!pTarget)
-    return FALSE;
-  pMsg->m_pDstTarget = pTarget;
-  return TRUE;
-}
-void CFWL_NoteDriver::MouseSecondary(CFWL_MsgMouse* pMsg) {
-  IFWL_Widget* pTarget = pMsg->m_pDstTarget;
-  if (pTarget == m_pHover) {
-    return;
-  }
-  if (m_pHover) {
-    CFWL_MsgMouse msLeave;
-    msLeave.m_pDstTarget = m_pHover;
-    msLeave.m_fx = pMsg->m_fx;
-    msLeave.m_fy = pMsg->m_fy;
-    pTarget->TransformTo(m_pHover, msLeave.m_fx, msLeave.m_fy);
-    msLeave.m_dwFlags = 0;
-    msLeave.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave;
-    DispatchMessage(&msLeave, NULL);
-  }
-  if (pTarget->GetClassID() == FWL_CLASSHASH_Form) {
-    m_pHover = NULL;
-    return;
-  }
-  m_pHover = pTarget;
-  CFWL_MsgMouse msHover;
-  msHover.m_pDstTarget = pTarget;
-  msHover.m_fx = pMsg->m_fx;
-  msHover.m_fy = pMsg->m_fy;
-  msHover.m_dwFlags = 0;
-  msHover.m_dwCmd = FWL_MSGMOUSECMD_MouseHover;
-  DispatchMessage(&msHover, NULL);
-}
-FX_BOOL CFWL_NoteDriver::IsValidMessage(CFWL_Message* pMessage) {
-  if (pMessage->GetClassID() == FWL_MSGHASH_Post) {
-    return TRUE;
-  }
-  int32_t iCount = m_noteLoopQueue.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CFWL_NoteLoop* pNoteLoop = static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[i]);
-    CFWL_WidgetImp* pForm = pNoteLoop->GetForm();
-    if (pForm && (pForm->GetInterface() == pMessage->m_pDstTarget)) {
-      return TRUE;
-    }
-  }
-  iCount = m_forms.GetSize();
-  for (int32_t j = 0; j < iCount; j++) {
-    CFWL_FormImp* pForm = static_cast<CFWL_FormImp*>(m_forms[j]);
-    if (pForm->GetInterface() == pMessage->m_pDstTarget) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-IFWL_Widget* CFWL_NoteDriver::GetMessageForm(IFWL_Widget* pDstTarget) {
-  int32_t iTrackLoop = m_noteLoopQueue.GetSize();
-  if (iTrackLoop <= 0)
-    return NULL;
-  IFWL_Widget* pMessageForm = NULL;
-  if (iTrackLoop > 1) {
-    CFWL_NoteLoop* pNootLoop =
-        static_cast<CFWL_NoteLoop*>(m_noteLoopQueue[iTrackLoop - 1]);
-    pMessageForm = pNootLoop->GetForm()->GetInterface();
-  } else {
-    pMessageForm = (m_forms.Find(pDstTarget) < 0) ? NULL : pDstTarget;
-  }
-  if (!pMessageForm && pDstTarget) {
-    CFWL_WidgetMgr* pWidgetMgr =
-        static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-    if (!pWidgetMgr)
-      return NULL;
-    pMessageForm =
-        pWidgetMgr->GetWidget(pDstTarget, FWL_WGTRELATION_SystemForm);
-  }
-  return pMessageForm;
-}
-void CFWL_NoteDriver::ClearInvalidEventTargets(FX_BOOL bRemoveAll) {
-  FX_POSITION pos = m_eventTargets.GetStartPosition();
-  while (pos) {
-    void* key = NULL;
-    CFWL_EventTarget* pEventTarget = NULL;
-    m_eventTargets.GetNextAssoc(pos, key, (void*&)pEventTarget);
-    if (pEventTarget && (bRemoveAll || pEventTarget->IsInvalid())) {
-      m_eventTargets.RemoveKey(key);
-      delete pEventTarget;
-    }
-  }
-}
-class CFWL_CoreToopTipDP : public IFWL_ToolTipDP {
- public:
-  FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
-  int32_t GetInitialDelay(IFWL_Widget* pWidget);
-  int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
-  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
-  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
-  CFX_RectF GetAnchor();
-  CFWL_CoreToopTipDP();
-
-  CFX_WideString m_wsCaption;
-  int32_t m_nInitDelayTime;
-  int32_t m_nAutoPopDelayTime;
-  CFX_RectF m_fAnchor;
-};
-CFWL_CoreToopTipDP::CFWL_CoreToopTipDP() {
-  m_nInitDelayTime = 500;
-  m_nAutoPopDelayTime = 50000;
-  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
-}
-FWL_ERR CFWL_CoreToopTipDP::GetCaption(IFWL_Widget* pWidget,
-                                       CFX_WideString& wsCaption) {
-  wsCaption = m_wsCaption;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_CoreToopTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
-  return m_nInitDelayTime;
-}
-int32_t CFWL_CoreToopTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
-  return m_nAutoPopDelayTime;
-}
-CFX_DIBitmap* CFWL_CoreToopTipDP::GetToolTipIcon(IFWL_Widget* pWidget) {
-  return NULL;
-}
-CFX_SizeF CFWL_CoreToopTipDP::GetToolTipIconSize(IFWL_Widget* pWidget) {
-  return CFX_SizeF();
-}
-CFX_RectF CFWL_CoreToopTipDP::GetAnchor() {
-  return m_fAnchor;
-}
-CFWL_EventTarget::~CFWL_EventTarget() {
-  m_eventSources.RemoveAll();
-}
-int32_t CFWL_EventTarget::SetEventSource(IFWL_Widget* pSource,
-                                         FX_DWORD dwFilter) {
-  if (pSource) {
-    m_eventSources.SetAt(pSource, dwFilter);
-    return m_eventSources.GetCount();
-  }
-  return 1;
-}
-FX_BOOL CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) {
-  IFWL_WidgetDelegate* pDelegate = m_pListener->SetDelegate(NULL);
-  if (!pDelegate)
-    return FALSE;
-  if (m_eventSources.GetCount() == 0) {
-    pDelegate->OnProcessEvent(pEvent);
-    return TRUE;
-  }
-  FX_POSITION pos = m_eventSources.GetStartPosition();
-  while (pos) {
-    IFWL_Widget* pSource = NULL;
-    FX_DWORD dwFilter = 0;
-    m_eventSources.GetNextAssoc(pos, (void*&)pSource, dwFilter);
-    if (pSource == pEvent->m_pSrcTarget ||
-        pEvent->GetClassID() == FWL_EVTHASH_Idle) {
-      if (IsFilterEvent(pEvent, dwFilter)) {
-        pDelegate->OnProcessEvent(pEvent);
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_EventTarget::IsFilterEvent(CFWL_Event* pEvent, FX_DWORD dwFilter) {
-  if (dwFilter == FWL_EVENT_ALL_MASK) {
-    return TRUE;
-  }
-  FX_BOOL bRet = FALSE;
-  switch (pEvent->GetClassID()) {
-    case FWL_EVTHASH_Mouse: {
-      bRet = dwFilter & FWL_EVENT_MOUSE_MASK;
-      break;
-    }
-    case FWL_EVTHASH_MouseWheel: {
-      bRet = dwFilter & FWL_EVENT_MOUSEWHEEL_MASK;
-      break;
-    }
-    case FWL_EVTHASH_Key: {
-      bRet = dwFilter & FWL_EVENT_KEY_MASK;
-      break;
-    }
-    case FWL_EVTHASH_SetFocus:
-    case FWL_EVTHASH_KillFocus: {
-      bRet = dwFilter & FWL_EVENT_FOCUSCHANGED_MASK;
-      break;
-    }
-    case FWL_EVTHASH_Draw: {
-      bRet = dwFilter & FWL_EVENT_DRAW_MASK;
-      break;
-    }
-    case FWL_EVTHASH_Close: {
-      bRet = dwFilter & FWL_EVENT_CLOSE_MASK;
-      break;
-    }
-    case FWL_EVTHASH_SizeChanged: {
-      bRet = dwFilter & FWL_EVENT_SIZECHANGED_MASK;
-      break;
-    }
-    case FWL_EVTHASH_Idle: {
-      bRet = dwFilter & FWL_EVENT_IDLE_MASK;
-      break;
-    }
-    default: {
-      bRet = dwFilter & FWL_EVENT_CONTROL_MASK;
-      break;
-    }
-  }
-  return bRet;
-}
-
-CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = NULL;
-
-CFWL_ToolTipContainer::CFWL_ToolTipContainer()
-    : pCurTarget(NULL), m_pToolTipImp(NULL) {
-  m_ToolTipDp = new CFWL_CoreToopTipDP;
-  m_ToolTipDp->m_nInitDelayTime = 0;
-  m_ToolTipDp->m_nAutoPopDelayTime = 2000;
-}
-CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {
-  if (m_pToolTipImp) {
-    IFWL_ToolTip* pToolTip =
-        static_cast<IFWL_ToolTip*>(m_pToolTipImp->GetInterface());
-    pToolTip->Finalize();
-    delete pToolTip;
-  }
-  delete m_ToolTipDp;
-}
-// static
-CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() {
-  if (!s_pInstance) {
-    s_pInstance = new CFWL_ToolTipContainer;
-  }
-  return s_pInstance;
-}
-// static
-void CFWL_ToolTipContainer::DeleteInstance() {
-  if (s_pInstance) {
-    delete s_pInstance;
-    s_pInstance = NULL;
-  }
-}
-FX_ERR CFWL_ToolTipContainer::AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
-  if (m_arrWidget.Find((void*)pTarget) < 0) {
-    m_arrWidget.Add((void*)pTarget);
-    return FWL_ERR_Succeeded;
-  }
-  return FWL_ERR_Indefinite;
-}
-FX_ERR CFWL_ToolTipContainer::RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
-  int index = m_arrWidget.Find((void*)pTarget);
-  if (index >= 0) {
-    m_arrWidget.RemoveAt(index);
-    return FWL_ERR_Succeeded;
-  }
-  return FWL_ERR_Indefinite;
-}
-FX_BOOL CFWL_ToolTipContainer::HasToolTip(IFWL_Widget* pWedget) {
-  int32_t iCount = m_arrWidget.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    IFWL_ToolTipTarget* p = static_cast<IFWL_ToolTipTarget*>(m_arrWidget[i]);
-    if (p->GetWidget() == pWedget) {
-      pCurTarget = p;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_ToolTipContainer::ProcessEnter(CFWL_EvtMouse* pEvt,
-                                            IFWL_Widget* pOwner) {
-  if (HasToolTip(pEvt->m_pDstTarget)) {
-    if (NULL == m_pToolTipImp) {
-      CFWL_WidgetImpProperties prop;
-      prop.m_pDataProvider = m_ToolTipDp;
-      prop.m_pOwner = pOwner;
-      CFX_RectF rtTooltip;
-      rtTooltip.Set(150, 150, 100, 50);
-      prop.m_rtWidget = rtTooltip;
-      IFWL_ToolTip* pToolTip = IFWL_ToolTip::Create(prop, nullptr);
-      pToolTip->Initialize();
-      m_pToolTipImp = static_cast<CFWL_ToolTipImp*>(pToolTip->GetImpl());
-      m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_Multiline, 0);
-      m_pToolTipImp->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-    }
-    if (pCurTarget->IsShowed()) {
-      CFX_WideString wsCaption;
-      pCurTarget->GetCaption(wsCaption);
-      if (!wsCaption.IsEmpty()) {
-        m_ToolTipDp->m_wsCaption = wsCaption;
-      }
-      CFX_RectF rt;
-      CFX_SizeF sz;
-      pCurTarget->GetToolTipSize(sz);
-      if (sz.x > 0 && sz.y > 0) {
-        rt.width = sz.x;
-        rt.height = sz.y;
-      } else {
-        CFX_RectF r;
-        m_pToolTipImp->GetWidgetRect(r, TRUE);
-        rt.width = r.width;
-        rt.height = r.height;
-      }
-      CFX_PointF pt(pEvt->m_fx, pEvt->m_fy);
-      if (pCurTarget->GetToolTipPos(pt) == FWL_ERR_Succeeded) {
-        rt.left = pt.x;
-        rt.top = pt.y;
-        m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_NoAnchor, 0);
-      } else {
-        CFX_RectF rtAnchor;
-        pCurTarget->GetWidget()->GetClientRect(rtAnchor);
-        pCurTarget->GetWidget()->TransformTo(NULL, rtAnchor.left, rtAnchor.top);
-        m_pToolTipImp->SetAnchor(rtAnchor);
-        m_pToolTipImp->ModifyStylesEx(0, FWL_STYLEEXT_TTP_NoAnchor);
-      }
-      m_pToolTipImp->SetWidgetRect(rt);
-      m_pToolTipImp->Update();
-      m_pToolTipImp->Show();
-    }
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_ToolTipContainer::ProcessLeave(CFWL_EvtMouse* pEvt) {
-  if (HasToolTip(pEvt->m_pDstTarget) && NULL != m_pToolTipImp) {
-    m_pToolTipImp->Hide();
-    pCurTarget = NULL;
-    return TRUE;
-  }
-  return FALSE;
-}
-IFWL_ToolTipTarget* CFWL_ToolTipContainer::GetCurrentToolTipTarget() {
-  return pCurTarget;
-}
-FX_ERR CFWL_ToolTipContainer::SetToolTipInitialDelay(int32_t nDelayTime) {
-  m_ToolTipDp->m_nInitDelayTime = nDelayTime;
-  return FWL_ERR_Succeeded;
-}
-FX_ERR CFWL_ToolTipContainer::SetToolTipAutoPopDelay(int32_t nDelayTime) {
-  m_ToolTipDp->m_nAutoPopDelayTime = nDelayTime;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR FWL_AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
-  return CFWL_ToolTipContainer::getInstance()->AddToolTipTarget(pTarget);
-}
-FWL_ERR FWL_RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget) {
-  return CFWL_ToolTipContainer::getInstance()->RemoveToolTipTarget(pTarget);
-}
-FWL_ERR FWL_SetToolTipInitialDelay(int32_t nDelayTime) {
-  return CFWL_ToolTipContainer::getInstance()->SetToolTipInitialDelay(
-      nDelayTime);
-}
-FWL_ERR FWL_SetToolTipAutoPopDelay(int32_t nDelayTime) {
-  return CFWL_ToolTipContainer::getInstance()->SetToolTipAutoPopDelay(
-      nDelayTime);
-}
-IFWL_Widget* FWL_GetCurrentThreadModalWidget(IFWL_NoteThread* pNoteThread) {
-  if (!pNoteThread)
-    return NULL;
-  CFWL_NoteDriver* noteDriver =
-      static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
-  if (!noteDriver)
-    return NULL;
-  if (noteDriver->CountLoop() == 1) {
-    return NULL;
-  }
-  CFWL_NoteLoop* topLoop = noteDriver->GetTopLoop();
-  if (!topLoop)
-    return NULL;
-  CFWL_WidgetImp* widget = topLoop->GetForm();
-  if (!widget)
-    return NULL;
-  return widget->GetInterface();
-}
-FWL_ERR FWL_SetHook(IFWL_NoteDriver* driver,
-                    FWLMessageHookCallback callback,
-                    void* info) {
-  CFWL_NoteDriver* noteDriver = static_cast<CFWL_NoteDriver*>(driver);
-  noteDriver->SetHook(callback, info);
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/core/fwl_noteimp.h b/xfa/src/fwl/core/fwl_noteimp.h
deleted file mode 100644
index 72e1a8e..0000000
--- a/xfa/src/fwl/core/fwl_noteimp.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_NOTEIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_NOTEIMP_H_
-
-#include "xfa/include/fwl/core/fwl_note.h"
-
-class CFWL_WidgetImp;
-class CFWL_ToolTipImp;
-class CFWL_CoreToopTipDP;
-class CFWL_NoteDriver;
-class CFWL_EventTarget;
-class CFWL_ToolTipContainer;
-
-class CFWL_NoteLoop : public IFWL_NoteLoop {
- public:
-  CFWL_NoteLoop(CFWL_WidgetImp* pForm = NULL);
-
-  // IFWL_NoteLoop:
-  ~CFWL_NoteLoop() override {}
-  FX_BOOL PreProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR Idle(int32_t count) override;
-
-  CFWL_WidgetImp* GetForm();
-  FX_BOOL ContinueModal();
-  FWL_ERR EndModalLoop();
-  FX_BOOL TranslateAccelerator(CFWL_Message* pMessage);
-  FWL_ERR SetMainForm(CFWL_WidgetImp* pForm);
-
- protected:
-  void GenerateCommondEvent(FX_DWORD dwCommand);
-
-  CFWL_WidgetImp* m_pForm;
-  FX_BOOL m_bContinueModal;
-};
-class CFWL_NoteDriver : public IFWL_NoteDriver {
- public:
-  CFWL_NoteDriver();
-  ~CFWL_NoteDriver() override;
-
-  // IFWL_NoteDriver:
-  FX_BOOL SendNote(CFWL_Note* pNote) override;
-  FX_BOOL PostMessage(CFWL_Message* pMessage) override;
-  FWL_ERR RegisterEventTarget(IFWL_Widget* pListener,
-                              IFWL_Widget* pEventSource = NULL,
-                              FX_DWORD dwFilter = FWL_EVENT_ALL_MASK) override;
-  FWL_ERR UnregisterEventTarget(IFWL_Widget* pListener) override;
-  void ClearEventTargets(FX_BOOL bRemoveAll) override;
-  int32_t GetQueueMaxSize() const override;
-  FWL_ERR SetQueueMaxSize(const int32_t size) override;
-  IFWL_NoteThread* GetOwnerThread() const override;
-  FWL_ERR PushNoteLoop(IFWL_NoteLoop* pNoteLoop) override;
-  IFWL_NoteLoop* PopNoteLoop() override;
-  IFWL_Widget* GetFocus() override;
-  FX_BOOL SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify = FALSE) override;
-  void SetGrab(IFWL_Widget* pGrab, FX_BOOL bSet) override;
-  FWL_ERR Run() override;
-
-  IFWL_Widget* GetHover();
-  void SetHover(IFWL_Widget* pHover);
-  void NotifyTargetHide(IFWL_Widget* pNoteTarget);
-  void NotifyTargetDestroy(IFWL_Widget* pNoteTarget);
-  void NotifyFullScreenMode(IFWL_Widget* pNoteTarget, FX_BOOL bFullScreen);
-  FWL_ERR RegisterForm(CFWL_WidgetImp* pForm);
-  FWL_ERR UnRegisterForm(CFWL_WidgetImp* pForm);
-  FX_BOOL QueueMessage(CFWL_Message* pMessage);
-  FX_BOOL UnqueueMessage(CFWL_NoteLoop* pNoteLoop);
-  CFWL_NoteLoop* GetTopLoop();
-  int32_t CountLoop();
-  void SetHook(FWLMessageHookCallback callback, void* info);
-  FX_BOOL ProcessMessage(CFWL_Message* pMessage);
-
- protected:
-  FX_BOOL DispatchMessage(CFWL_Message* pMessage, IFWL_Widget* pMessageForm);
-  FX_BOOL DoActivate(CFWL_MsgActivate* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoDeactivate(CFWL_MsgDeactivate* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoSetFocus(CFWL_MsgSetFocus* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoKillFocus(CFWL_MsgKillFocus* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoKey(CFWL_MsgKey* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoMouse(CFWL_MsgMouse* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoWheel(CFWL_MsgMouseWheel* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoSize(CFWL_MsgSize* pMsg);
-  FX_BOOL DoWindowMove(CFWL_MsgWindowMove* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoDragFiles(CFWL_MsgDropFiles* pMsg, IFWL_Widget* pMessageForm);
-  FX_BOOL DoMouseEx(CFWL_MsgMouse* pMsg, IFWL_Widget* pMessageForm);
-  void MouseSecondary(CFWL_MsgMouse* pMsg);
-  FX_BOOL IsValidMessage(CFWL_Message* pMessage);
-  IFWL_Widget* GetMessageForm(IFWL_Widget* pDstTarget);
-  void ClearInvalidEventTargets(FX_BOOL bRemoveAll);
-  CFX_PtrArray m_forms;
-  CFX_PtrArray m_noteQueue;
-  CFX_PtrArray m_noteLoopQueue;
-  CFX_MapPtrToPtr m_eventTargets;
-  int32_t m_sendEventCalled;
-  int32_t m_maxSize;
-  FX_BOOL m_bFullScreen;
-  IFWL_Widget* m_pHover;
-  IFWL_Widget* m_pFocus;
-  IFWL_Widget* m_pGrab;
-  CFWL_NoteLoop* m_pNoteLoop;
-  FWLMessageHookCallback m_hook;
-  void* m_hookInfo;
-};
-typedef CFX_MapPtrTemplate<void*, FX_DWORD> CFWL_EventSource;
-class CFWL_EventTarget {
- public:
-  CFWL_EventTarget(CFWL_NoteDriver* pNoteDriver, IFWL_Widget* pListener)
-      : m_pListener(pListener), m_pNoteDriver(pNoteDriver), m_bInvalid(FALSE) {}
-  ~CFWL_EventTarget();
-  int32_t SetEventSource(IFWL_Widget* pSource,
-                         FX_DWORD dwFilter = FWL_EVENT_ALL_MASK);
-  FX_BOOL ProcessEvent(CFWL_Event* pEvent);
-  FX_BOOL IsFilterEvent(CFWL_Event* pEvent, FX_DWORD dwFilter);
-  FX_BOOL IsInvalid() { return m_bInvalid; }
-  void FlagInvalid() { m_bInvalid = TRUE; }
-
- protected:
-  CFWL_EventSource m_eventSources;
-  IFWL_Widget* m_pListener;
-  CFWL_NoteDriver* m_pNoteDriver;
-  FX_BOOL m_bInvalid;
-};
-class CFWL_ToolTipContainer {
- public:
-  static CFWL_ToolTipContainer* getInstance();
-  static void DeleteInstance();
-
-  FX_ERR AddToolTipTarget(IFWL_ToolTipTarget* pTarget);
-  FX_ERR RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget);
-  IFWL_ToolTipTarget* GetCurrentToolTipTarget();
-
-  FX_BOOL HasToolTip(IFWL_Widget* pWidget);
-
-  FX_BOOL ProcessEnter(CFWL_EvtMouse* pEvt, IFWL_Widget* pOwner);
-  FX_BOOL ProcessLeave(CFWL_EvtMouse* pEvt);
-
-  FX_ERR SetToolTipInitialDelay(int32_t iDelayTime);
-  FX_ERR SetToolTipAutoPopDelay(int32_t iDelayTime);
-
- protected:
-  CFWL_ToolTipContainer();
-  virtual ~CFWL_ToolTipContainer();
-
-  IFWL_ToolTipTarget* pCurTarget;
-  CFWL_ToolTipImp* m_pToolTipImp;
-  CFWL_CoreToopTipDP* m_ToolTipDp;
-  CFX_PtrArray m_arrWidget;
-
- private:
-  static CFWL_ToolTipContainer* s_pInstance;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_NOTEIMP_H_
diff --git a/xfa/src/fwl/core/fwl_panelimp.cpp b/xfa/src/fwl/core/fwl_panelimp.cpp
deleted file mode 100644
index 7d6c8ee..0000000
--- a/xfa/src/fwl/core/fwl_panelimp.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-
-#include "xfa/include/fwl/core/fwl_content.h"
-#include "xfa/include/fwl/core/fwl_grid.h"
-#include "xfa/include/fwl/core/fwl_panel.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-// static
-IFWL_Panel* IFWL_Panel::Create(CFWL_WidgetImpProperties& properties,
-                               IFWL_Widget* pOuter) {
-  IFWL_Panel* pPanel = new IFWL_Panel;
-  CFWL_PanelImp* pPanelImpl = new CFWL_PanelImp(properties, pOuter);
-  pPanel->SetImpl(pPanelImpl);
-  pPanelImpl->SetInterface(pPanel);
-  return pPanel;
-}
-IFWL_Panel::IFWL_Panel() {}
-IFWL_Content* IFWL_Panel::GetContent() {
-  return static_cast<CFWL_PanelImp*>(GetImpl())->GetContent();
-}
-FWL_ERR IFWL_Panel::SetContent(IFWL_Content* pContent) {
-  return static_cast<CFWL_PanelImp*>(GetImpl())->SetContent(pContent);
-}
-
-CFWL_PanelImp::CFWL_PanelImp(const CFWL_WidgetImpProperties& properties,
-                             IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter), m_pContent(nullptr) {}
-CFWL_PanelImp::~CFWL_PanelImp() {}
-FWL_ERR CFWL_PanelImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass = FWL_CLASS_Panel;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_PanelImp::GetClassID() const {
-  return FWL_CLASSHASH_Panel;
-}
-FWL_ERR CFWL_PanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    if (m_pContent) {
-      m_pContent->GetWidgetRect(rect, TRUE);
-    }
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_PanelImp::Update() {
-  if (m_pContent) {
-    CFX_RectF rtClient;
-    GetClientRect(rtClient);
-    FWL_GRIDUNIT eWidth = FWL_GRIDUNIT_Fixed, eHeight = FWL_GRIDUNIT_Fixed;
-    IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
-    if (!pWidgetMgr)
-      return FWL_ERR_Indefinite;
-    IFWL_Widget* pParent =
-        pWidgetMgr->GetWidget(GetInterface(), FWL_WGTRELATION_Parent);
-    if (pParent && pParent->GetClassID() == FWL_CLASSHASH_Grid) {
-      IFWL_Grid* pGrid = static_cast<IFWL_Grid*>(pParent);
-      pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Width, eWidth);
-      pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Height, eHeight);
-    }
-    m_pContent->SetWidgetRect(rtClient);
-    m_pContent->Update();
-  }
-  return FWL_ERR_Succeeded;
-}
-IFWL_Content* CFWL_PanelImp::GetContent() {
-  return m_pContent;
-}
-FWL_ERR CFWL_PanelImp::SetContent(IFWL_Content* pContent) {
-  if (!pContent)
-    return FWL_ERR_Indefinite;
-  m_pContent = pContent;
-  return pContent->SetParent(m_pInterface);
-}
-class CFWL_CustomPanelImp : public CFWL_WidgetImp {
- public:
-  CFWL_CustomPanelImp(const CFWL_WidgetImpProperties& properties,
-                      IFWL_Widget* pOuter);
-  virtual ~CFWL_CustomPanelImp();
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual IFWL_Content* GetContent();
-  virtual FWL_ERR SetContent(IFWL_Content* pContent);
-  FWL_ERR SetProxy(IFWL_Proxy* pProxy);
-
- protected:
-  IFWL_Content* m_pContent;
-  IFWL_Proxy* m_pProxy;
-};
-CFWL_CustomPanelImp::CFWL_CustomPanelImp(
-    const CFWL_WidgetImpProperties& properties,
-    IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter),
-      m_pContent(nullptr),
-      m_pProxy(nullptr) {}
-CFWL_CustomPanelImp::~CFWL_CustomPanelImp() {}
-FWL_ERR CFWL_CustomPanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize && m_pProxy &&
-      (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) {
-    return FWL_ERR_Succeeded;
-  }
-  return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize);
-}
-FWL_ERR CFWL_CustomPanelImp::Update() {
-  if (m_pProxy) {
-    return m_pProxy->Update();
-  }
-  return CFWL_WidgetImp::Update();
-}
-IFWL_Content* CFWL_CustomPanelImp::GetContent() {
-  return m_pContent;
-}
-FWL_ERR CFWL_CustomPanelImp::SetContent(IFWL_Content* pContent) {
-  if (!pContent)
-    return FWL_ERR_Indefinite;
-  m_pContent = pContent;
-  return pContent->SetParent(m_pInterface);
-}
-FWL_ERR CFWL_CustomPanelImp::SetProxy(IFWL_Proxy* pProxy) {
-  m_pProxy = pProxy;
-  return FWL_ERR_Succeeded;
-}
-
-// statuc
-IFWL_CustomPanel* IFWL_CustomPanel::Create(CFWL_WidgetImpProperties& properties,
-                                           IFWL_Widget* pOuter) {
-  IFWL_CustomPanel* pCustomPanel = new IFWL_CustomPanel;
-  CFWL_CustomPanelImp* pCustomPanelImpl =
-      new CFWL_CustomPanelImp(properties, pOuter);
-  pCustomPanel->SetImpl(pCustomPanelImpl);
-  pCustomPanelImpl->SetInterface(pCustomPanel);
-  return pCustomPanel;
-}
-IFWL_CustomPanel::IFWL_CustomPanel() {}
-IFWL_Content* IFWL_CustomPanel::GetContent() {
-  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->GetContent();
-}
-FWL_ERR IFWL_CustomPanel::SetContent(IFWL_Content* pContent) {
-  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetContent(pContent);
-}
-FWL_ERR IFWL_CustomPanel::SetProxy(IFWL_Proxy* pProxy) {
-  return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetProxy(pProxy);
-}
diff --git a/xfa/src/fwl/core/fwl_panelimp.h b/xfa/src/fwl/core/fwl_panelimp.h
deleted file mode 100644
index 1bd7159..0000000
--- a/xfa/src/fwl/core/fwl_panelimp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_PANELIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_PANELIMP_H_
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-class CFWL_WidgetImpProperties;
-class IFWL_Widget;
-class IFWL_Content;
-
-class CFWL_PanelImp : public CFWL_WidgetImp {
- public:
-  CFWL_PanelImp(const CFWL_WidgetImpProperties& properties,
-                IFWL_Widget* pOuter);
-  virtual ~CFWL_PanelImp();
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual IFWL_Content* GetContent();
-  virtual FWL_ERR SetContent(IFWL_Content* pContent);
-
- protected:
-  IFWL_Content* m_pContent;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_PANELIMP_H_
diff --git a/xfa/src/fwl/core/fwl_sdadapterimp.cpp b/xfa/src/fwl/core/fwl_sdadapterimp.cpp
deleted file mode 100644
index fedd6b2..0000000
--- a/xfa/src/fwl/core/fwl_sdadapterimp.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
-
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h"
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-CFWL_SDAdapterWidgetMgr::CFWL_SDAdapterWidgetMgr() {}
-CFWL_SDAdapterWidgetMgr::~CFWL_SDAdapterWidgetMgr() {}
-
-FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidget(IFWL_Widget* pWidget,
-                                              IFWL_Widget* pParent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::DestroyWidget(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetRect(IFWL_Widget* pWidget,
-                                               const CFX_RectF& rect) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetPosition(IFWL_Widget* pWidget,
-                                                   FX_FLOAT fx,
-                                                   FX_FLOAT fy) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetParentWidget(IFWL_Widget* pWidget,
-                                                 IFWL_Widget* pParent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::ShowWidget(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::HideWidget(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetNormal(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetMaximize(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetMinimize(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::RunWidget(IFWL_Widget* pWidget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
-                                               const CFX_RectF* pRect) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::Exit(int32_t iExitCode) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::CreateWidgetWithNativeId(IFWL_Widget* pWidget,
-                                                          void* vp) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetRect(IFWL_Widget* pWidget,
-                                               CFX_RectF& rect) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetIcon(IFWL_Widget* pWidget,
-                                               const CFX_DIBitmap* pIcon,
-                                               FX_BOOL bBig) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetWidgetCaption(
-    IFWL_Widget* pWidget,
-    const CFX_WideStringC& wsCaption) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetBorderRegion(IFWL_Widget* pWidget,
-                                                 CFX_Path* pPath) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetTransparent(IFWL_Widget* pWidget,
-                                                FX_DWORD dwAlpha) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetFullScreen(IFWL_Widget* pWidget,
-                                               FX_BOOL bFullScreen) {
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_SDAdapterWidgetMgr::CheckMessage() {
-  return TRUE;
-}
-FX_BOOL CFWL_SDAdapterWidgetMgr::IsIdleMessage() {
-  return TRUE;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::DispatchMessage() {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::GetWidgetDC(IFWL_Widget* pWidget, void*& pDC) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::ReleaseWidgetDC(IFWL_Widget* pWidget,
-                                                 void* pDC,
-                                                 CFX_RectF* pClip) {
-  return FWL_ERR_Succeeded;
-}
-void* CFWL_SDAdapterWidgetMgr::GetWindow(IFWL_Widget* pWidget) {
-  return NULL;
-}
-FX_DWORD CFWL_SDAdapterWidgetMgr::GetKeyState(FX_DWORD dwVirtKey) {
-  return 0;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::RunLoop(IFWL_Widget* widget) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::EndLoop() {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::InitMenu(IFWL_Menu* pMenu,
-                                          IFWL_MenuDP* pMenuData) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::UpdateMenu(IFWL_Menu* pMenu,
-                                            const void* hItem,
-                                            int32_t iType) {
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_SDAdapterWidgetMgr::TrackPopupMenu(IFWL_Menu* pMenu,
-                                                IFWL_MenuDP* pMenuData) {
-  return 0;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::SetMessageHook(IFWL_AdapterMessageHook* hook) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterWidgetMgr::GetSystemBorder(FX_FLOAT& l,
-                                                 FX_FLOAT& t,
-                                                 FX_FLOAT& r,
-                                                 FX_FLOAT& b) {
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_SDAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget,
-                                             FX_FLOAT fMinHeight,
-                                             FX_FLOAT fMaxHeight,
-                                             const CFX_RectF& rtAnchor,
-                                             CFX_RectF& rtPopup) {
-  return FWL_ERR_Succeeded;
-}
-CFWL_SDAdapterThreadMgr::CFWL_SDAdapterThreadMgr() {}
-CFWL_SDAdapterThreadMgr::~CFWL_SDAdapterThreadMgr() {}
-FWL_ERR CFWL_SDAdapterThreadMgr::Start(IFWL_Thread* pThread,
-                                       FWL_HTHREAD& hThread,
-                                       FX_BOOL bSuspended) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterThreadMgr::Resume(FWL_HTHREAD hThread) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterThreadMgr::Suspend(FWL_HTHREAD hThread) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterThreadMgr::Kill(FWL_HTHREAD hThread, int32_t iExitCode) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_SDAdapterThreadMgr::Stop(FWL_HTHREAD hThread, int32_t iExitCode) {
-  return FWL_ERR_Succeeded;
-}
-IFWL_Thread* CFWL_SDAdapterThreadMgr::GetCurrentThread() {
-  return FWL_GetApp();
-}
diff --git a/xfa/src/fwl/core/fwl_targetimp.cpp b/xfa/src/fwl/core/fwl_targetimp.cpp
deleted file mode 100644
index 0c8d5fb..0000000
--- a/xfa/src/fwl/core/fwl_targetimp.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-
-FWL_ERR IFWL_Target::GetClassName(CFX_WideString& wsClass) const {
-  return m_pImpl->GetClassName(wsClass);
-}
-FX_DWORD IFWL_Target::GetClassID() const {
-  return m_pImpl->GetClassID();
-}
-FX_BOOL IFWL_Target::IsInstance(const CFX_WideStringC& wsClass) const {
-  return m_pImpl->IsInstance(wsClass);
-}
-FWL_ERR IFWL_Target::Initialize() {
-  return m_pImpl->Initialize();
-}
-FWL_ERR IFWL_Target::Finalize() {
-  return m_pImpl->Finalize();
-}
-IFWL_Target::~IFWL_Target() {
-  delete m_pImpl;
-}
-CFWL_TargetImp::CFWL_TargetImp() {}
-CFWL_TargetImp::~CFWL_TargetImp() {}
-FWL_ERR CFWL_TargetImp::GetClassName(CFX_WideString& wsClass) const {
-  wsClass.Empty();
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_TargetImp::GetClassID() const {
-  return 0;
-}
-FX_BOOL CFWL_TargetImp::IsInstance(const CFX_WideStringC& wsClass) const {
-  return FALSE;
-}
-FWL_ERR CFWL_TargetImp::Initialize() {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_TargetImp::Finalize() {
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/core/fwl_targetimp.h b/xfa/src/fwl/core/fwl_targetimp.h
deleted file mode 100644
index e243d39..0000000
--- a/xfa/src/fwl/core/fwl_targetimp.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_TARGETIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_TARGETIMP_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/include/fwl/core/fwl_target.h"
-
-class CFWL_TargetImp {
- public:
-  virtual ~CFWL_TargetImp();
-
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
-  virtual FX_DWORD GetClassID() const;
-  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
- protected:
-  CFWL_TargetImp();
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_TARGETIMP_H_
diff --git a/xfa/src/fwl/core/fwl_threadimp.cpp b/xfa/src/fwl/core/fwl_threadimp.cpp
deleted file mode 100644
index 28df34e..0000000
--- a/xfa/src/fwl/core/fwl_threadimp.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-
-void IFWL_Thread::Release() {
-  delete m_pImpl;
-}
-FWL_ERR IFWL_Thread::Run(FWL_HTHREAD hThread) {
-  return m_pImpl->Run(hThread);
-}
-IFWL_NoteDriver* IFWL_NoteThread::GetNoteDriver() {
-  return static_cast<CFWL_NoteThreadImp*>(GetImpl())->GetNoteDriver();
-}
-
-FWL_ERR CFWL_ThreadImp::Run(FWL_HTHREAD hThread) {
-  return FWL_ERR_Succeeded;
-}
-CFWL_NoteThreadImp::CFWL_NoteThreadImp(IFWL_NoteThread* pIface)
-    : CFWL_ThreadImp(pIface), m_pNoteDriver(new CFWL_NoteDriver) {}
-CFWL_NoteThreadImp::~CFWL_NoteThreadImp() {
-  delete m_pNoteDriver;
-}
-FWL_ERR CFWL_NoteThreadImp::Run(FWL_HTHREAD hThread) {
-  if (!m_pNoteDriver)
-    return FWL_ERR_Indefinite;
-  return m_pNoteDriver->Run();
-}
-IFWL_NoteDriver* CFWL_NoteThreadImp::GetNoteDriver() {
-  return m_pNoteDriver;
-}
diff --git a/xfa/src/fwl/core/fwl_threadimp.h b/xfa/src/fwl/core/fwl_threadimp.h
deleted file mode 100644
index eaf30e6..0000000
--- a/xfa/src/fwl/core/fwl_threadimp.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_THREADIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_THREADIMP_H_
-
-#include "xfa/include/fwl/core/fwl_thread.h"  // For FWL_HTHREAD.
-
-class CFWL_NoteDriver;
-class IFWL_NoteDriver;
-
-class CFWL_ThreadImp {
- public:
-  virtual ~CFWL_ThreadImp() {}
-  IFWL_Thread* GetInterface() const { return m_pIface; }
-  virtual FWL_ERR Run(FWL_HTHREAD hThread);
-
- protected:
-  CFWL_ThreadImp(IFWL_Thread* pIface) : m_pIface(pIface) {}
-
- private:
-  IFWL_Thread* const m_pIface;
-};
-
-class CFWL_NoteThreadImp : public CFWL_ThreadImp {
- public:
-  CFWL_NoteThreadImp(IFWL_NoteThread* pIface);
-  virtual ~CFWL_NoteThreadImp();
-
-  FWL_ERR Run(FWL_HTHREAD hThread) override;
-  virtual IFWL_NoteDriver* GetNoteDriver();
-
- protected:
-  CFWL_NoteDriver* const m_pNoteDriver;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_THREADIMP_H_
diff --git a/xfa/src/fwl/core/fwl_timerimp.cpp b/xfa/src/fwl/core/fwl_timerimp.cpp
deleted file mode 100644
index 503c0f7..0000000
--- a/xfa/src/fwl/core/fwl_timerimp.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/adapter/fwl_adapternative.h"
-#include "xfa/include/fwl/adapter/fwl_adaptertimermgr.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_timer.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-
-FWL_HTIMER FWL_StartTimer(IFWL_Timer* pTimer,
-                          FX_DWORD dwElapse,
-                          FX_BOOL bImmediately) {
-  IFWL_AdapterNative* pAdapterNative = FWL_GetAdapterNative();
-  if (!pAdapterNative)
-    return NULL;
-  IFWL_AdapterTimerMgr* pAdapterTimerMgr = pAdapterNative->GetTimerMgr();
-  if (!pAdapterTimerMgr)
-    return NULL;
-  FWL_HTIMER hTimer = NULL;
-  pAdapterTimerMgr->Start(pTimer, dwElapse, hTimer, bImmediately);
-  return hTimer;
-}
-int32_t FWL_StopTimer(FWL_HTIMER hTimer) {
-  IFWL_AdapterNative* pAdapterNative = FWL_GetAdapterNative();
-  if (!pAdapterNative)
-    return FWL_ERR_Indefinite;
-  IFWL_AdapterTimerMgr* pAdapterTimerMgr = pAdapterNative->GetTimerMgr();
-  if (!pAdapterTimerMgr)
-    return FWL_ERR_Indefinite;
-  return pAdapterTimerMgr->Stop(hTimer);
-}
diff --git a/xfa/src/fwl/core/fwl_widgetimp.cpp b/xfa/src/fwl/core/fwl_widgetimp.cpp
deleted file mode 100644
index 32d80d1..0000000
--- a/xfa/src/fwl/core/fwl_widgetimp.cpp
+++ /dev/null
@@ -1,1101 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-#include <algorithm>
-
-#include "xfa/include/fwl/adapter/fwl_adapternative.h"
-#include "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h"
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/basewidget/fwl_combobox.h"
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-#include "xfa/include/fwl/basewidget/fwl_menu.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_content.h"
-#include "xfa/include/fwl/core/fwl_form.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-FWL_ERR IFWL_Widget::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->GetWidgetRect(rect, bAutoSize);
-}
-FWL_ERR IFWL_Widget::GetGlobalRect(CFX_RectF& rect) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetGlobalRect(rect);
-}
-FWL_ERR IFWL_Widget::SetWidgetRect(const CFX_RectF& rect) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetWidgetRect(rect);
-}
-FWL_ERR IFWL_Widget::GetClientRect(CFX_RectF& rect) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetClientRect(rect);
-}
-IFWL_Widget* IFWL_Widget::GetParent() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetParent();
-}
-FWL_ERR IFWL_Widget::SetParent(IFWL_Widget* pParent) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetParent(pParent);
-}
-IFWL_Widget* IFWL_Widget::GetOwner() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOwner();
-}
-FWL_ERR IFWL_Widget::SetOwner(IFWL_Widget* pOwner) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetOwner(pOwner);
-}
-IFWL_Widget* IFWL_Widget::GetOuter() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOuter();
-}
-FX_DWORD IFWL_Widget::GetStyles() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStyles();
-}
-FWL_ERR IFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded,
-                                  FX_DWORD dwStylesRemoved) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->ModifyStyles(dwStylesAdded, dwStylesRemoved);
-}
-FX_DWORD IFWL_Widget::GetStylesEx() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStylesEx();
-}
-FWL_ERR IFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                    FX_DWORD dwStylesExRemoved) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-FX_DWORD IFWL_Widget::GetStates() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetStates();
-}
-FWL_ERR IFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetStates(dwStates, bSet);
-}
-FWL_ERR IFWL_Widget::SetPrivateData(void* module_id,
-                                    void* pData,
-                                    PD_CALLBACK_FREEDATA callback) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->SetPrivateData(module_id, pData, callback);
-}
-void* IFWL_Widget::GetPrivateData(void* module_id) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetPrivateData(module_id);
-}
-FWL_ERR IFWL_Widget::Update() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->Update();
-}
-FWL_ERR IFWL_Widget::LockUpdate() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->LockUpdate();
-}
-FWL_ERR IFWL_Widget::UnlockUpdate() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->UnlockUpdate();
-}
-FX_DWORD IFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->HitTest(fx, fy);
-}
-FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget* pWidget,
-                                 FX_FLOAT& fx,
-                                 FX_FLOAT& fy) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->TransformTo(pWidget, fx, fy);
-}
-FWL_ERR IFWL_Widget::TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->TransformTo(pWidget, rt);
-}
-FWL_ERR IFWL_Widget::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetMatrix(matrix, bGlobal);
-}
-FWL_ERR IFWL_Widget::SetMatrix(const CFX_Matrix& matrix) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetMatrix(matrix);
-}
-FWL_ERR IFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
-                                const CFX_Matrix* pMatrix) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->DrawWidget(pGraphics, pMatrix);
-}
-IFWL_ThemeProvider* IFWL_Widget::GetThemeProvider() {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetThemeProvider();
-}
-FWL_ERR IFWL_Widget::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->SetThemeProvider(pThemeProvider);
-}
-FWL_ERR IFWL_Widget::SetDataProvider(IFWL_DataProvider* pDataProvider) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())
-      ->SetDataProvider(pDataProvider);
-}
-IFWL_WidgetDelegate* IFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->SetDelegate(pDelegate);
-}
-IFWL_NoteThread* IFWL_Widget::GetOwnerThread() const {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOwnerThread();
-}
-CFX_SizeF IFWL_Widget::GetOffsetFromParent(IFWL_Widget* pParent) {
-  return static_cast<CFWL_WidgetImp*>(GetImpl())->GetOffsetFromParent(pParent);
-}
-FWL_ERR CFWL_WidgetImp::Initialize() {
-  IFWL_App* pApp = FWL_GetApp();
-  if (!pApp)
-    return FWL_ERR_Indefinite;
-  IFWL_AdapterNative* pAdapter = pApp->GetAdapterNative();
-  if (!pAdapter)
-    return FWL_ERR_Indefinite;
-  IFWL_AdapterThreadMgr* pAdapterThread = pAdapter->GetThreadMgr();
-  if (!pAdapterThread)
-    return FWL_ERR_Indefinite;
-  SetOwnerThread(static_cast<CFWL_NoteThreadImp*>(
-      pAdapterThread->GetCurrentThread()->GetImpl()));
-  IFWL_Widget* pParent = m_pProperties->m_pParent;
-  m_pWidgetMgr->InsertWidget(pParent, m_pInterface);
-  if (!IsChild()) {
-    {
-      IFWL_Widget* pOwner = m_pProperties->m_pOwner;
-      if (pOwner) {
-        m_pWidgetMgr->SetOwner(pOwner, m_pInterface);
-      }
-    }
-    m_pWidgetMgr->CreateWidget_Native(m_pInterface);
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::Finalize() {
-  NotifyDriver();
-  IFWL_Form* pForm = static_cast<IFWL_Form*>(
-      FWL_GetWidgetMgr()->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm));
-  if (pForm && pForm != m_pInterface) {
-    IFWL_Content* pContent = pForm->GetContent();
-    if (pContent) {
-      pContent->RemoveWidget(m_pInterface);
-    }
-  }
-  if (!IsChild()) {
-    m_pWidgetMgr->DestroyWidget_Native(m_pInterface);
-  }
-  m_pWidgetMgr->RemoveWidget(m_pInterface);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (bAutoSize) {
-    if (HasEdge()) {
-      FX_FLOAT fEdge = GetEdgeWidth();
-      rect.Inflate(fEdge, fEdge);
-    }
-    if (HasBorder()) {
-      FX_FLOAT fBorder = GetBorderSize();
-      rect.Inflate(fBorder, fBorder);
-    }
-  } else {
-    rect = m_pProperties->m_rtWidget;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::GetGlobalRect(CFX_RectF& rect) {
-  IFWL_Widget* pForm =
-      m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
-  if (!pForm)
-    return FWL_ERR_Indefinite;
-  rect.Set(0, 0, m_pProperties->m_rtWidget.width,
-           m_pProperties->m_rtWidget.height);
-  if (pForm == m_pInterface) {
-    return FWL_ERR_Succeeded;
-  }
-  return TransformTo(pForm, rect);
-}
-FWL_ERR CFWL_WidgetImp::SetWidgetRect(const CFX_RectF& rect) {
-  CFX_RectF rtOld = m_pProperties->m_rtWidget;
-  m_pProperties->m_rtWidget = rect;
-  if (IsChild()) {
-    if (FXSYS_fabs(rtOld.width - rect.width) > 0.5f ||
-        FXSYS_fabs(rtOld.height - rect.height) > 0.5f) {
-      CFWL_EvtSizeChanged ev;
-      ev.m_pSrcTarget = m_pInterface;
-      ev.m_rtOld = rtOld;
-      ev.m_rtNew = rect;
-      IFWL_WidgetDelegate* pDelegate = SetDelegate(NULL);
-      if (pDelegate) {
-        pDelegate->OnProcessEvent(&ev);
-      }
-    }
-    return FWL_ERR_Succeeded;
-  }
-  m_pWidgetMgr->SetWidgetRect_Native(m_pInterface, rect);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::GetClientRect(CFX_RectF& rect) {
-  GetEdgeRect(rect);
-  if (HasEdge()) {
-    FX_FLOAT fEdge = GetEdgeWidth();
-    rect.Deflate(fEdge, fEdge);
-  }
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_WidgetImp::GetParent() {
-  return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Parent);
-}
-FWL_ERR CFWL_WidgetImp::SetParent(IFWL_Widget* pParent) {
-  m_pProperties->m_pParent = pParent;
-  m_pWidgetMgr->SetParent(pParent, m_pInterface);
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_WidgetImp::GetOwner() {
-  return m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_Owner);
-}
-FWL_ERR CFWL_WidgetImp::SetOwner(IFWL_Widget* pOwner) {
-  m_pProperties->m_pOwner = pOwner;
-  m_pWidgetMgr->SetOwner(pOwner, m_pInterface);
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_WidgetImp::GetOuter() {
-  return m_pOuter;
-}
-FX_DWORD CFWL_WidgetImp::GetStyles() {
-  return m_pProperties->m_dwStyles;
-}
-FWL_ERR CFWL_WidgetImp::ModifyStyles(FX_DWORD dwStylesAdded,
-                                     FX_DWORD dwStylesRemoved) {
-  m_pProperties->m_dwStyles =
-      (m_pProperties->m_dwStyles & ~dwStylesRemoved) | dwStylesAdded;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_WidgetImp::GetStylesEx() {
-  return m_pProperties->m_dwStyleExes;
-}
-FWL_ERR CFWL_WidgetImp::ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                       FX_DWORD dwStylesExRemoved) {
-  m_pProperties->m_dwStyleExes =
-      (m_pProperties->m_dwStyleExes & ~dwStylesExRemoved) | dwStylesExAdded;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_WidgetImp::GetStates() {
-  return m_pProperties->m_dwStates;
-}
-static void NotifyHideChildWidget(IFWL_WidgetMgr* widgetMgr,
-                                  IFWL_Widget* widget,
-                                  CFWL_NoteDriver* noteDriver) {
-  IFWL_Widget* child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild);
-  while (child) {
-    noteDriver->NotifyTargetHide(child);
-    NotifyHideChildWidget(widgetMgr, child, noteDriver);
-    child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-}
-FWL_ERR CFWL_WidgetImp::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  bSet ? (m_pProperties->m_dwStates |= dwStates)
-       : (m_pProperties->m_dwStates &= ~dwStates);
-  FWL_ERR ret = FWL_ERR_Succeeded;
-  if (dwStates & FWL_WGTSTATE_Invisible) {
-    if (bSet) {
-      ret = m_pWidgetMgr->HideWidget_Native(m_pInterface);
-      CFWL_NoteDriver* noteDriver =
-          static_cast<CFWL_NoteDriver*>(GetOwnerThread()->GetNoteDriver());
-      IFWL_WidgetMgr* widgetMgr = FWL_GetWidgetMgr();
-      noteDriver->NotifyTargetHide(m_pInterface);
-      IFWL_Widget* child =
-          widgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_FirstChild);
-      while (child) {
-        noteDriver->NotifyTargetHide(child);
-        NotifyHideChildWidget(widgetMgr, child, noteDriver);
-        child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
-      }
-    } else {
-      ret = m_pWidgetMgr->ShowWidget_Native(m_pInterface);
-    }
-  }
-  return ret;
-}
-FWL_ERR CFWL_WidgetImp::SetPrivateData(void* module_id,
-                                       void* pData,
-                                       PD_CALLBACK_FREEDATA callback) {
-  if (!m_pPrivateData) {
-    m_pPrivateData = new CFX_PrivateData;
-  }
-  m_pPrivateData->SetPrivateData(module_id, pData, callback);
-  return FWL_ERR_Succeeded;
-}
-void* CFWL_WidgetImp::GetPrivateData(void* module_id) {
-  if (!m_pPrivateData)
-    return NULL;
-  return m_pPrivateData->GetPrivateData(module_id);
-}
-FWL_ERR CFWL_WidgetImp::Update() {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::LockUpdate() {
-  m_iLock++;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::UnlockUpdate() {
-  if (IsLocked()) {
-    m_iLock--;
-  }
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_WidgetImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rtClient;
-  GetClientRect(rtClient);
-  if (rtClient.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Client;
-  }
-  if (HasEdge()) {
-    CFX_RectF rtEdge;
-    GetEdgeRect(rtEdge);
-    if (rtEdge.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Edge;
-    }
-  }
-  if (HasBorder()) {
-    CFX_RectF rtRelative;
-    GetRelativeRect(rtRelative);
-    if (rtRelative.Contains(fx, fy)) {
-      return FWL_WGTHITTEST_Border;
-    }
-  }
-  return FWL_WGTHITTEST_Unknown;
-}
-FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget* pWidget,
-                                    FX_FLOAT& fx,
-                                    FX_FLOAT& fy) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    CFX_SizeF szOffset;
-    if (IsParent(pWidget)) {
-      szOffset = GetOffsetFromParent(pWidget);
-    } else {
-      szOffset = pWidget->GetOffsetFromParent(m_pInterface);
-      szOffset.x = -szOffset.x;
-      szOffset.y = -szOffset.y;
-    }
-    fx += szOffset.x;
-    fy += szOffset.y;
-    return FWL_ERR_Succeeded;
-  }
-  CFX_RectF r;
-  CFX_Matrix m;
-  IFWL_Widget* parent = GetParent();
-  if (parent) {
-    GetWidgetRect(r);
-    fx += r.left;
-    fy += r.top;
-    GetMatrix(m, TRUE);
-    m.TransformPoint(fx, fy);
-  }
-  IFWL_Widget* form1 =
-      m_pWidgetMgr->GetWidget(m_pInterface, FWL_WGTRELATION_SystemForm);
-  if (!form1)
-    return FWL_ERR_Indefinite;
-  if (!pWidget) {
-    form1->GetWidgetRect(r);
-    fx += r.left;
-    fy += r.top;
-#ifdef FWL_UseMacSystemBorder
-    if (form1->GetStyles() & FWL_WGTSTYLE_Caption) {
-      FX_FLOAT l, t, r, b;
-      l = t = r = b = 0;
-      FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b);
-      fy += t;
-    }
-#endif
-    return FWL_ERR_Succeeded;
-  }
-  IFWL_Widget* form2 =
-      m_pWidgetMgr->GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
-  if (!form2)
-    return FWL_ERR_Indefinite;
-  if (form1 != form2) {
-    form1->GetWidgetRect(r);
-    fx += r.left;
-    fy += r.top;
-    form2->GetWidgetRect(r);
-    fx -= r.left;
-    fy -= r.top;
-#ifdef FWL_UseMacSystemBorder
-    if ((form1->GetStyles() & FWL_WGTSTYLE_Caption) !=
-        (form2->GetStyles() & FWL_WGTSTYLE_Caption)) {
-      FX_FLOAT l, t, r, b;
-      l = t = r = b = 0;
-      FWL_GetAdapterWidgetMgr()->GetSystemBorder(l, t, r, b);
-      (form1->GetStyles() & FWL_WGTSTYLE_Caption) ? (fy += t) : (fy -= t);
-    }
-#endif
-  }
-  parent = pWidget->GetParent();
-  if (parent) {
-    pWidget->GetMatrix(m, TRUE);
-    CFX_Matrix m1;
-    m1.SetIdentity();
-    m1.SetReverse(m);
-    m1.TransformPoint(fx, fy);
-    pWidget->GetWidgetRect(r);
-    fx -= r.left;
-    fy -= r.top;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt) {
-  return TransformTo(pWidget, rt.left, rt.top);
-}
-FWL_ERR CFWL_WidgetImp::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
-  if (!m_pProperties)
-    return FWL_ERR_Indefinite;
-  if (bGlobal) {
-    IFWL_Widget* parent = GetParent();
-    CFX_PtrArray parents;
-    while (parent) {
-      parents.Add(parent);
-      parent = parent->GetParent();
-    }
-    matrix.SetIdentity();
-    CFX_Matrix ctmOnParent;
-    CFX_RectF rect;
-    int32_t count = parents.GetSize();
-    for (int32_t i = count - 2; i >= 0; i--) {
-      parent = static_cast<IFWL_Widget*>(parents.GetAt(i));
-      parent->GetMatrix(ctmOnParent, FALSE);
-      parent->GetWidgetRect(rect);
-      matrix.Concat(ctmOnParent, TRUE);
-      matrix.Translate(rect.left, rect.top, TRUE);
-    }
-    matrix.Concat(m_pProperties->m_ctmOnParent, TRUE);
-    parents.RemoveAll();
-  } else {
-    matrix = m_pProperties->m_ctmOnParent;
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::SetMatrix(const CFX_Matrix& matrix) {
-  if (!m_pProperties)
-    return FWL_ERR_Indefinite;
-  IFWL_Widget* parent = GetParent();
-  if (!parent) {
-    return FWL_ERR_Indefinite;
-  }
-  m_pProperties->m_ctmOnParent = matrix;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::DrawWidget(CFX_Graphics* pGraphics,
-                                   const CFX_Matrix* pMatrix) {
-  return FWL_ERR_Indefinite;
-}
-IFWL_ThemeProvider* CFWL_WidgetImp::GetThemeProvider() {
-  return m_pProperties->m_pThemeProvider;
-}
-FWL_ERR CFWL_WidgetImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
-  m_pProperties->m_pThemeProvider = pThemeProvider;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImp::SetDataProvider(IFWL_DataProvider* pDataProvider) {
-  m_pProperties->m_pDataProvider = pDataProvider;
-  return FWL_ERR_Succeeded;
-}
-IFWL_WidgetDelegate* CFWL_WidgetImp::SetDelegate(
-    IFWL_WidgetDelegate* pDelegate) {
-  if (!m_pCurDelegate) {
-    m_pCurDelegate = m_pDelegate;
-  }
-  if (!pDelegate) {
-    return m_pCurDelegate;
-  }
-  IFWL_WidgetDelegate* pOldDelegate = m_pCurDelegate;
-  m_pCurDelegate = pDelegate;
-  return pOldDelegate;
-}
-IFWL_NoteThread* CFWL_WidgetImp::GetOwnerThread() const {
-  return static_cast<IFWL_NoteThread*>(m_pOwnerThread->GetInterface());
-}
-FWL_ERR CFWL_WidgetImp::SetOwnerThread(CFWL_NoteThreadImp* pOwnerThread) {
-  m_pOwnerThread = pOwnerThread;
-  return FWL_ERR_Succeeded;
-}
-IFWL_Widget* CFWL_WidgetImp::GetInterface() const {
-  return m_pInterface;
-}
-void CFWL_WidgetImp::SetInterface(IFWL_Widget* pInterface) {
-  m_pInterface = pInterface;
-}
-CFWL_WidgetImp::CFWL_WidgetImp(const CFWL_WidgetImpProperties& properties,
-                               IFWL_Widget* pOuter)
-    : m_pProperties(new CFWL_WidgetImpProperties),
-      m_pPrivateData(NULL),
-      m_pDelegate(NULL),
-      m_pCurDelegate(NULL),
-      m_pOuter(pOuter),
-      m_pInterface(NULL),
-      m_iLock(0) {
-  *m_pProperties = properties;
-  m_pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  FXSYS_assert(m_pWidgetMgr != NULL);
-}
-CFWL_WidgetImp::~CFWL_WidgetImp() {
-  if (m_pPrivateData) {
-    delete m_pPrivateData;
-    m_pPrivateData = NULL;
-  }
-  if (m_pProperties) {
-    delete m_pProperties;
-    m_pProperties = NULL;
-  }
-}
-FX_BOOL CFWL_WidgetImp::IsEnabled() const {
-  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == 0;
-}
-FX_BOOL CFWL_WidgetImp::IsVisible() const {
-  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) == 0;
-}
-FX_BOOL CFWL_WidgetImp::IsActive() const {
-  return (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) == 0;
-}
-FX_BOOL CFWL_WidgetImp::IsOverLapper() const {
-  return (m_pProperties->m_dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
-         FWL_WGTSTYLE_OverLapper;
-}
-FX_BOOL CFWL_WidgetImp::IsPopup() const {
-  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Popup);
-}
-FX_BOOL CFWL_WidgetImp::IsChild() const {
-  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Child);
-}
-FX_BOOL CFWL_WidgetImp::IsLocked() const {
-  return m_iLock > 0;
-}
-FX_BOOL CFWL_WidgetImp::IsOffscreen() const {
-  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Offscreen);
-}
-FX_BOOL CFWL_WidgetImp::HasBorder() const {
-  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border);
-}
-FX_BOOL CFWL_WidgetImp::HasEdge() const {
-  return !!(m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask);
-}
-void CFWL_WidgetImp::GetEdgeRect(CFX_RectF& rtEdge) {
-  rtEdge = m_pProperties->m_rtWidget;
-  rtEdge.left = rtEdge.top = 0;
-  if (HasBorder()) {
-    FX_FLOAT fCX = GetBorderSize();
-    FX_FLOAT fCY = GetBorderSize(FALSE);
-    rtEdge.Deflate(fCX, fCY);
-  }
-}
-FX_FLOAT CFWL_WidgetImp::GetBorderSize(FX_BOOL bCX) {
-  FX_FLOAT* pfBorder = static_cast<FX_FLOAT*>(GetThemeCapacity(
-      bCX ? FWL_WGTCAPACITY_CXBorder : FWL_WGTCAPACITY_CYBorder));
-  if (!pfBorder)
-    return 0;
-  return *pfBorder;
-}
-FX_FLOAT CFWL_WidgetImp::GetEdgeWidth() {
-  FX_DWORD dwCapacity = 0;
-  switch (m_pProperties->m_dwStyles & FWL_WGTSTYLE_EdgeMask) {
-    case FWL_WGTSTYLE_EdgeFlat: {
-      dwCapacity = FWL_WGTCAPACITY_EdgeFlat;
-      break;
-    }
-    case FWL_WGTSTYLE_EdgeRaised: {
-      dwCapacity = FWL_WGTCAPACITY_EdgeRaised;
-      break;
-    }
-    case FWL_WGTSTYLE_EdgeSunken: {
-      dwCapacity = FWL_WGTCAPACITY_EdgeSunken;
-      break;
-    }
-  }
-  if (dwCapacity > 0) {
-    FX_FLOAT* fRet = static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
-    return fRet ? *fRet : 0;
-  }
-  return 0;
-}
-void CFWL_WidgetImp::GetRelativeRect(CFX_RectF& rect) {
-  rect = m_pProperties->m_rtWidget;
-  rect.left = rect.top = 0;
-}
-void* CFWL_WidgetImp::GetThemeCapacity(FX_DWORD dwCapacity) {
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (!pTheme)
-    return NULL;
-  CFWL_ThemePart part;
-  part.m_pWidget = m_pInterface;
-  return pTheme->GetCapacity(&part, dwCapacity);
-}
-IFWL_ThemeProvider* CFWL_WidgetImp::GetAvailableTheme() {
-  if (m_pProperties->m_pThemeProvider) {
-    return m_pProperties->m_pThemeProvider;
-  }
-  IFWL_Widget* pUp = m_pInterface;
-  do {
-    FWL_WGTRELATION relation = (pUp->GetStyles() & FWL_WGTSTYLE_Popup)
-                                   ? FWL_WGTRELATION_Owner
-                                   : FWL_WGTRELATION_Parent;
-    pUp = m_pWidgetMgr->GetWidget(pUp, relation);
-    if (pUp) {
-      IFWL_ThemeProvider* pRet = pUp->GetThemeProvider();
-      if (pRet && pRet->IsValidWidget(m_pInterface)) {
-        return pRet;
-      }
-    }
-  } while (pUp);
-  return FWL_GetApp()->GetThemeProvider();
-}
-CFWL_WidgetImp* CFWL_WidgetImp::GetRootOuter() {
-  IFWL_Widget* pRet = m_pOuter;
-  if (!pRet)
-    return nullptr;
-  while (IFWL_Widget* pOuter = pRet->GetOuter()) {
-    pRet = pOuter;
-  }
-  return static_cast<CFWL_WidgetImp*>(pRet->GetImpl());
-}
-#define FWL_WGT_CalcHeight 2048
-#define FWL_WGT_CalcWidth 2048
-#define FWL_WGT_CalcMultiLineDefWidth 120.0f
-CFX_SizeF CFWL_WidgetImp::CalcTextSize(const CFX_WideString& wsText,
-                                       IFWL_ThemeProvider* pTheme,
-                                       FX_BOOL bMultiLine,
-                                       int32_t iLineWidth) {
-  if (!pTheme)
-    return CFX_SizeF();
-
-  CFWL_ThemeText calPart;
-  calPart.m_pWidget = m_pInterface;
-  calPart.m_wsText = wsText;
-  calPart.m_dwTTOStyles =
-      bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;
-  calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
-  CFX_RectF rect;
-  FX_FLOAT fWidth = bMultiLine
-                        ? (iLineWidth > 0 ? (FX_FLOAT)iLineWidth
-                                          : FWL_WGT_CalcMultiLineDefWidth)
-                        : FWL_WGT_CalcWidth;
-  rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight);
-  pTheme->CalcTextRect(&calPart, rect);
-  return CFX_SizeF(rect.width, rect.height);
-}
-void CFWL_WidgetImp::CalcTextRect(const CFX_WideString& wsText,
-                                  IFWL_ThemeProvider* pTheme,
-                                  FX_DWORD dwTTOStyles,
-                                  int32_t iTTOAlign,
-                                  CFX_RectF& rect) {
-  CFWL_ThemeText calPart;
-  calPart.m_pWidget = m_pInterface;
-  calPart.m_wsText = wsText;
-  calPart.m_dwTTOStyles = dwTTOStyles;
-  calPart.m_iTTOAlign = iTTOAlign;
-  pTheme->CalcTextRect(&calPart, rect);
-}
-void CFWL_WidgetImp::SetFocus(FX_BOOL bFocus) {
-  if (m_pWidgetMgr->IsFormDisabled())
-    return;
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  if (!pDriver)
-    return;
-  IFWL_Widget* curFocus = pDriver->GetFocus();
-  if (bFocus && curFocus != m_pInterface) {
-    pDriver->SetFocus(m_pInterface);
-  } else if (!bFocus && curFocus == m_pInterface) {
-    pDriver->SetFocus(NULL);
-  }
-}
-void CFWL_WidgetImp::SetGrab(FX_BOOL bSet) {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  pDriver->SetGrab(m_pInterface, bSet);
-}
-FX_BOOL CFWL_WidgetImp::GetPopupPos(FX_FLOAT fMinHeight,
-                                    FX_FLOAT fMaxHeight,
-                                    const CFX_RectF& rtAnchor,
-                                    CFX_RectF& rtPopup) {
-  if (GetClassID() == FWL_CLASSHASH_Menu) {
-    return GetPopupPosMenu(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
-  } else {
-    if (GetClassID() == FWL_CLASSHASH_ComboBox) {
-      if (m_pWidgetMgr->IsFormDisabled()) {
-        return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight,
-                                                fMaxHeight, rtAnchor, rtPopup);
-      } else {
-        return GetPopupPosComboBox(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
-      }
-    } else if (GetClassID() == FWL_CLASSHASH_DateTimePicker &&
-               m_pWidgetMgr->IsFormDisabled()) {
-      return m_pWidgetMgr->GetAdapterPopupPos(m_pInterface, fMinHeight,
-                                              fMaxHeight, rtAnchor, rtPopup);
-    } else {
-      return GetPopupPosGeneral(fMinHeight, fMaxHeight, rtAnchor, rtPopup);
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_WidgetImp::GetPopupPosMenu(FX_FLOAT fMinHeight,
-                                        FX_FLOAT fMaxHeight,
-                                        const CFX_RectF& rtAnchor,
-                                        CFX_RectF& rtPopup) {
-  FX_FLOAT fx = 0;
-  FX_FLOAT fy = 0;
-  FX_FLOAT fScreenWidth = 0;
-  FX_FLOAT fScreenHeight = 0;
-  GetScreenSize(fScreenWidth, fScreenHeight);
-  if (GetStylesEx() & FWL_STYLEEXT_MNU_Vert) {
-    FX_BOOL bLeft = m_pProperties->m_rtWidget.left < 0;
-    FX_FLOAT fRight = rtAnchor.right() + rtPopup.width;
-    TransformTo(NULL, fx, fy);
-    if (fRight + fx > fScreenWidth || bLeft) {
-      rtPopup.Set(rtAnchor.left - rtPopup.width, rtAnchor.top, rtPopup.width,
-                  rtPopup.height);
-    } else {
-      rtPopup.Set(rtAnchor.right(), rtAnchor.top, rtPopup.width,
-                  rtPopup.height);
-    }
-  } else {
-    FX_FLOAT fBottom = rtAnchor.bottom() + rtPopup.height;
-    TransformTo(NULL, fx, fy);
-    if (fBottom + fy > fScreenHeight) {
-      rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width,
-                  rtPopup.height);
-    } else {
-      rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width,
-                  rtPopup.height);
-    }
-  }
-  rtPopup.Offset(fx, fy);
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetImp::GetPopupPosComboBox(FX_FLOAT fMinHeight,
-                                            FX_FLOAT fMaxHeight,
-                                            const CFX_RectF& rtAnchor,
-                                            CFX_RectF& rtPopup) {
-  FX_FLOAT fx = 0;
-  FX_FLOAT fy = 0;
-  FX_FLOAT fScreenWidth = 0;
-  FX_FLOAT fScreenHeight = 0;
-  GetScreenSize(fScreenWidth, fScreenHeight);
-  FX_FLOAT fPopHeight = rtPopup.height;
-  if (rtPopup.height > fMaxHeight) {
-    fPopHeight = fMaxHeight;
-  } else if (rtPopup.height < fMinHeight) {
-    fPopHeight = fMinHeight;
-  }
-  FX_FLOAT fWidth = std::max(rtAnchor.width, rtPopup.width);
-  FX_FLOAT fBottom = rtAnchor.bottom() + fPopHeight;
-  TransformTo(NULL, fx, fy);
-  if (fBottom + fy > fScreenHeight) {
-    rtPopup.Set(rtAnchor.left, rtAnchor.top - fPopHeight, fWidth, fPopHeight);
-  } else {
-    rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), fWidth, fPopHeight);
-  }
-  rtPopup.Offset(fx, fy);
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetImp::GetPopupPosGeneral(FX_FLOAT fMinHeight,
-                                           FX_FLOAT fMaxHeight,
-                                           const CFX_RectF& rtAnchor,
-                                           CFX_RectF& rtPopup) {
-  FX_FLOAT fx = 0;
-  FX_FLOAT fy = 0;
-  FX_FLOAT fScreenWidth = 0;
-  FX_FLOAT fScreenHeight = 0;
-  GetScreenSize(fScreenWidth, fScreenHeight);
-  TransformTo(NULL, fx, fy);
-  if (rtAnchor.bottom() + fy > fScreenHeight) {
-    rtPopup.Set(rtAnchor.left, rtAnchor.top - rtPopup.height, rtPopup.width,
-                rtPopup.height);
-  } else {
-    rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), rtPopup.width,
-                rtPopup.height);
-  }
-  rtPopup.Offset(fx, fy);
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetImp::GetScreenSize(FX_FLOAT& fx, FX_FLOAT& fy) {
-  return FALSE;
-}
-void CFWL_WidgetImp::RegisterEventTarget(IFWL_Widget* pEventSource,
-                                         FX_DWORD dwFilter) {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
-  if (!pNoteDriver)
-    return;
-  pNoteDriver->RegisterEventTarget(m_pInterface, pEventSource, dwFilter);
-}
-void CFWL_WidgetImp::UnregisterEventTarget() {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
-  if (!pNoteDriver)
-    return;
-  pNoteDriver->UnregisterEventTarget(m_pInterface);
-}
-void CFWL_WidgetImp::DispatchKeyEvent(CFWL_MsgKey* pNote) {
-  if (!pNote)
-    return;
-  CFWL_EvtKey* pEvent = new CFWL_EvtKey;
-  pEvent->m_pSrcTarget = m_pInterface;
-  pEvent->m_dwCmd = pNote->m_dwCmd;
-  pEvent->m_dwKeyCode = pNote->m_dwKeyCode;
-  pEvent->m_dwFlags = pNote->m_dwFlags;
-  DispatchEvent(pEvent);
-  pEvent->Release();
-}
-void CFWL_WidgetImp::DispatchEvent(CFWL_Event* pEvent) {
-  if (m_pOuter) {
-    IFWL_WidgetDelegate* pDelegate = m_pOuter->SetDelegate(NULL);
-    pDelegate->OnProcessEvent(pEvent);
-    return;
-  }
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
-  if (!pNoteDriver)
-    return;
-  pNoteDriver->SendNote(pEvent);
-}
-void CFWL_WidgetImp::Repaint(const CFX_RectF* pRect) {
-  if (pRect) {
-    m_pWidgetMgr->RepaintWidget(m_pInterface, pRect);
-    return;
-  }
-  CFX_RectF rect;
-  rect = m_pProperties->m_rtWidget;
-  rect.left = rect.top = 0;
-  m_pWidgetMgr->RepaintWidget(m_pInterface, &rect);
-}
-void CFWL_WidgetImp::DrawBackground(CFX_Graphics* pGraphics,
-                                    int32_t iPartBk,
-                                    IFWL_ThemeProvider* pTheme,
-                                    const CFX_Matrix* pMatrix) {
-  CFX_RectF rtRelative;
-  GetRelativeRect(rtRelative);
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = iPartBk;
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix, TRUE);
-  }
-  param.m_rtPart = rtRelative;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_WidgetImp::DrawBorder(CFX_Graphics* pGraphics,
-                                int32_t iPartBorder,
-                                IFWL_ThemeProvider* pTheme,
-                                const CFX_Matrix* pMatrix) {
-  CFX_RectF rtRelative;
-  GetRelativeRect(rtRelative);
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = iPartBorder;
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix, TRUE);
-  }
-  param.m_rtPart = rtRelative;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_WidgetImp::DrawEdge(CFX_Graphics* pGraphics,
-                              int32_t iPartEdge,
-                              IFWL_ThemeProvider* pTheme,
-                              const CFX_Matrix* pMatrix) {
-  CFX_RectF rtEdge;
-  GetEdgeRect(rtEdge);
-  CFWL_ThemeBackground param;
-  param.m_pWidget = m_pInterface;
-  param.m_iPart = iPartEdge;
-  param.m_pGraphics = pGraphics;
-  if (pMatrix) {
-    param.m_matrix.Concat(*pMatrix, TRUE);
-  }
-  param.m_rtPart = rtEdge;
-  pTheme->DrawBackground(&param);
-}
-void CFWL_WidgetImp::NotifyDriver() {
-  IFWL_NoteThread* pThread = GetOwnerThread();
-  if (!pThread)
-    return;
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pThread->GetNoteDriver());
-  if (!pDriver)
-    return;
-  pDriver->NotifyTargetDestroy(m_pInterface);
-}
-CFX_SizeF CFWL_WidgetImp::GetOffsetFromParent(IFWL_Widget* pParent) {
-  if (pParent == GetInterface())
-    return CFX_SizeF();
-
-  IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
-  if (!pWidgetMgr)
-    return CFX_SizeF();
-
-  CFX_SizeF szRet(m_pProperties->m_rtWidget.left,
-                  m_pProperties->m_rtWidget.top);
-
-  IFWL_Widget* pDstWidget = GetParent();
-  while (pDstWidget && pDstWidget != pParent) {
-    CFX_RectF rtDst;
-    pDstWidget->GetWidgetRect(rtDst);
-    szRet += CFX_SizeF(rtDst.left, rtDst.top);
-    pDstWidget = pWidgetMgr->GetWidget(pDstWidget, FWL_WGTRELATION_Parent);
-  }
-  return szRet;
-}
-FX_BOOL CFWL_WidgetImp::IsParent(IFWL_Widget* pParent) {
-  IFWL_Widget* pUpWidget = GetParent();
-  while (pUpWidget) {
-    if (pUpWidget == pParent)
-      return TRUE;
-    pUpWidget = pUpWidget->GetParent();
-  }
-  return FALSE;
-}
-CFWL_WidgetImpDelegate::CFWL_WidgetImpDelegate() {}
-int32_t CFWL_WidgetImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage->m_pDstTarget)
-    return 0;
-  CFWL_WidgetImp* pWidget =
-      static_cast<CFWL_WidgetImp*>(pMessage->m_pDstTarget->GetImpl());
-  FX_DWORD dwMsgCode = pMessage->GetClassID();
-  switch (dwMsgCode) {
-    case FWL_MSGHASH_Mouse: {
-      CFWL_MsgMouse* pMsgMouse = static_cast<CFWL_MsgMouse*>(pMessage);
-      CFWL_EvtMouse evt;
-      evt.m_pSrcTarget = pWidget->m_pInterface;
-      evt.m_pDstTarget = pWidget->m_pInterface;
-      evt.m_dwCmd = pMsgMouse->m_dwCmd;
-      evt.m_dwFlags = pMsgMouse->m_dwFlags;
-      evt.m_fx = pMsgMouse->m_fx;
-      evt.m_fy = pMsgMouse->m_fy;
-      pWidget->DispatchEvent(&evt);
-      break;
-    }
-    case FWL_MSGHASH_MouseWheel: {
-      CFWL_MsgMouseWheel* pMsgMouseWheel =
-          static_cast<CFWL_MsgMouseWheel*>(pMessage);
-      CFWL_EvtMouseWheel evt;
-      evt.m_pSrcTarget = pWidget->m_pInterface;
-      evt.m_pDstTarget = pWidget->m_pInterface;
-      evt.m_dwFlags = pMsgMouseWheel->m_dwFlags;
-      evt.m_fDeltaX = pMsgMouseWheel->m_fDeltaX;
-      evt.m_fDeltaY = pMsgMouseWheel->m_fDeltaY;
-      evt.m_fx = pMsgMouseWheel->m_fx;
-      evt.m_fy = pMsgMouseWheel->m_fy;
-      pWidget->DispatchEvent(&evt);
-      break;
-    }
-    case FWL_MSGHASH_Key: {
-      CFWL_MsgKey* pMsgKey = static_cast<CFWL_MsgKey*>(pMessage);
-      CFWL_EvtKey evt;
-      evt.m_pSrcTarget = pWidget->m_pInterface;
-      evt.m_pDstTarget = pWidget->m_pInterface;
-      evt.m_dwKeyCode = pMsgKey->m_dwKeyCode;
-      evt.m_dwFlags = pMsgKey->m_dwFlags;
-      evt.m_dwCmd = pMsgKey->m_dwCmd;
-      pWidget->DispatchEvent(&evt);
-      break;
-    }
-    case FWL_MSGHASH_SetFocus: {
-      CFWL_MsgSetFocus* pMsgSetFocus = static_cast<CFWL_MsgSetFocus*>(pMessage);
-      CFWL_EvtSetFocus evt;
-      evt.m_pSrcTarget = pMsgSetFocus->m_pDstTarget;
-      evt.m_pDstTarget = pMsgSetFocus->m_pDstTarget;
-      evt.m_pSetFocus = pWidget->m_pInterface;
-      pWidget->DispatchEvent(&evt);
-      break;
-    }
-    case FWL_MSGHASH_KillFocus: {
-      CFWL_MsgKillFocus* pMsgKillFocus =
-          static_cast<CFWL_MsgKillFocus*>(pMessage);
-      CFWL_EvtKillFocus evt;
-      evt.m_pSrcTarget = pMsgKillFocus->m_pDstTarget;
-      evt.m_pDstTarget = pMsgKillFocus->m_pDstTarget;
-      evt.m_pKillFocus = pWidget->m_pInterface;
-      pWidget->DispatchEvent(&evt);
-      break;
-    }
-    default: {}
-  }
-  return 1;
-}
-FWL_ERR CFWL_WidgetImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                             const CFX_Matrix* pMatrix) {
-  CFWL_EvtDraw evt;
-  evt.m_pGraphics = pGraphics;
-  return FWL_ERR_Succeeded;
-}
-class CFWL_CustomImp : public CFWL_WidgetImp {
- public:
-  CFWL_CustomImp(const CFWL_WidgetImpProperties& properties,
-                 IFWL_Widget* pOuter);
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR SetProxy(IFWL_Proxy* pProxy);
-
- protected:
-  IFWL_Proxy* m_pProxy;
-};
-CFWL_CustomImp::CFWL_CustomImp(const CFWL_WidgetImpProperties& properties,
-                               IFWL_Widget* pOuter)
-    : CFWL_WidgetImp(properties, pOuter), m_pProxy(NULL) {}
-FWL_ERR CFWL_CustomImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (m_pProxy &&
-      (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) {
-    return FWL_ERR_Succeeded;
-  }
-  return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize);
-}
-FWL_ERR CFWL_CustomImp::Update() {
-  if (m_pProxy) {
-    return m_pProxy->Update();
-  }
-  return CFWL_WidgetImp::Update();
-}
-FWL_ERR CFWL_CustomImp::SetProxy(IFWL_Proxy* pProxy) {
-  m_pProxy = pProxy;
-  return FWL_ERR_Succeeded;
-}
-
-// static
-IFWL_Custom* IFWL_Custom::Create(const CFWL_WidgetImpProperties& properties,
-                                 IFWL_Widget* pOuter) {
-  IFWL_Custom* pCustom = new IFWL_Custom;
-  CFWL_CustomImp* pCustomImpl = new CFWL_CustomImp(properties, pOuter);
-  pCustom->SetImpl(pCustomImpl);
-  pCustomImpl->SetInterface(pCustom);
-  return pCustom;
-}
-IFWL_Custom::IFWL_Custom() {}
-FWL_ERR IFWL_Custom::SetProxy(IFWL_Proxy* pProxy) {
-  return static_cast<CFWL_CustomImp*>(GetImpl())->SetProxy(pProxy);
-}
-void FWL_SetWidgetRect(IFWL_Widget* widget, const CFX_RectF& rect) {
-  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_rtWidget =
-      rect;
-}
-void FWL_SetWidgetStates(IFWL_Widget* widget, FX_DWORD dwStates) {
-  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_dwStates =
-      dwStates;
-}
-void FWL_SetWidgetStyles(IFWL_Widget* widget, FX_DWORD dwStyles) {
-  static_cast<CFWL_WidgetImp*>(widget->GetImpl())->m_pProperties->m_dwStyles =
-      dwStyles;
-}
-FWL_ERR FWL_EnabelWidget(IFWL_Widget* widget, FX_BOOL bEnable) {
-  widget->SetStates(FWL_WGTSTATE_Disabled, !bEnable);
-  IFWL_WidgetMgr* widgetMgr = FWL_GetWidgetMgr();
-  IFWL_Widget* child = widgetMgr->GetWidget(widget, FWL_WGTRELATION_FirstChild);
-  while (child) {
-    FWL_EnabelWidget(child, bEnable);
-    child = widgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/core/fwl_widgetimp.h b/xfa/src/fwl/core/fwl_widgetimp.h
deleted file mode 100644
index d0dcf3c..0000000
--- a/xfa/src/fwl/core/fwl_widgetimp.h
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_WIDGETIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_WIDGETIMP_H_
-
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-
-class CFWL_NoteThreadImp;
-class CFWL_WidgetImpProperties;
-class CFWL_WidgetMgr;
-class IFWL_DataProvider;
-class IFWL_ThemeProvider;
-class IFWL_Widget;
-class IFWL_WidgetDelegate;
-
-class CFWL_WidgetImp : public CFWL_TargetImp {
- public:
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-
-  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
-  virtual FWL_ERR GetGlobalRect(CFX_RectF& rect);
-  virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
-  virtual FWL_ERR GetClientRect(CFX_RectF& rect);
-  virtual IFWL_Widget* GetParent();
-  virtual FWL_ERR SetParent(IFWL_Widget* pParent);
-  virtual IFWL_Widget* GetOwner();
-  virtual FWL_ERR SetOwner(IFWL_Widget* pOwner);
-  virtual IFWL_Widget* GetOuter();
-  virtual FX_DWORD GetStyles();
-  virtual FWL_ERR ModifyStyles(FX_DWORD dwStylesAdded,
-                               FX_DWORD dwStylesRemoved);
-  virtual FX_DWORD GetStylesEx();
-  virtual FWL_ERR ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                 FX_DWORD dwStylesExRemoved);
-  virtual FX_DWORD GetStates();
-  virtual FWL_ERR SetStates(FX_DWORD dwStates, FX_BOOL bSet = TRUE);
-  virtual FWL_ERR SetPrivateData(void* module_id,
-                                 void* pData,
-                                 PD_CALLBACK_FREEDATA callback);
-  virtual void* GetPrivateData(void* module_id);
-  virtual FWL_ERR Update();
-  virtual FWL_ERR LockUpdate();
-  virtual FWL_ERR UnlockUpdate();
-  virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_ERR TransformTo(IFWL_Widget* pWidget, FX_FLOAT& fx, FX_FLOAT& fy);
-  virtual FWL_ERR TransformTo(IFWL_Widget* pWidget, CFX_RectF& rt);
-  virtual FWL_ERR GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal = FALSE);
-  virtual FWL_ERR SetMatrix(const CFX_Matrix& matrix);
-  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
-                             const CFX_Matrix* pMatrix = NULL);
-  virtual IFWL_ThemeProvider* GetThemeProvider();
-  virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
-  virtual FWL_ERR SetDataProvider(IFWL_DataProvider* pDataProvider);
-  virtual IFWL_WidgetDelegate* SetDelegate(IFWL_WidgetDelegate* pDelegate);
-  virtual IFWL_NoteThread* GetOwnerThread() const;
-  FWL_ERR SetOwnerThread(CFWL_NoteThreadImp* pOwnerThread);
-  IFWL_Widget* GetInterface() const;
-  void SetInterface(IFWL_Widget* pInterface);
-  CFX_SizeF GetOffsetFromParent(IFWL_Widget* pParent);
-
- protected:
-  CFWL_WidgetImp(const CFWL_WidgetImpProperties& properties,
-                 IFWL_Widget* pOuter);
-  virtual ~CFWL_WidgetImp();
-  FX_BOOL IsEnabled() const;
-  FX_BOOL IsVisible() const;
-  FX_BOOL IsActive() const;
-  FX_BOOL IsOverLapper() const;
-  FX_BOOL IsPopup() const;
-  FX_BOOL IsChild() const;
-  FX_BOOL IsLocked() const;
-  FX_BOOL IsOffscreen() const;
-  FX_BOOL HasBorder() const;
-  FX_BOOL HasEdge() const;
-  void GetEdgeRect(CFX_RectF& rtEdge);
-  FX_FLOAT GetBorderSize(FX_BOOL bCX = TRUE);
-  FX_FLOAT GetEdgeWidth();
-  void GetRelativeRect(CFX_RectF& rect);
-  void* GetThemeCapacity(FX_DWORD dwCapacity);
-  IFWL_ThemeProvider* GetAvailableTheme();
-  CFWL_WidgetImp* GetRootOuter();
-  CFX_SizeF CalcTextSize(const CFX_WideString& wsText,
-                         IFWL_ThemeProvider* pTheme,
-                         FX_BOOL bMultiLine = FALSE,
-                         int32_t iLineWidth = -1);
-  void CalcTextRect(const CFX_WideString& wsText,
-                    IFWL_ThemeProvider* pTheme,
-                    FX_DWORD dwTTOStyles,
-                    int32_t iTTOAlign,
-                    CFX_RectF& rect);
-  void SetFocus(FX_BOOL bFocus);
-  void SetGrab(FX_BOOL bSet);
-  FX_BOOL GetPopupPos(FX_FLOAT fMinHeight,
-                      FX_FLOAT fMaxHeight,
-                      const CFX_RectF& rtAnchor,
-                      CFX_RectF& rtPopup);
-  FX_BOOL GetPopupPosMenu(FX_FLOAT fMinHeight,
-                          FX_FLOAT fMaxHeight,
-                          const CFX_RectF& rtAnchor,
-                          CFX_RectF& rtPopup);
-  FX_BOOL GetPopupPosComboBox(FX_FLOAT fMinHeight,
-                              FX_FLOAT fMaxHeight,
-                              const CFX_RectF& rtAnchor,
-                              CFX_RectF& rtPopup);
-  FX_BOOL GetPopupPosGeneral(FX_FLOAT fMinHeight,
-                             FX_FLOAT fMaxHeight,
-                             const CFX_RectF& rtAnchor,
-                             CFX_RectF& rtPopup);
-  FX_BOOL GetScreenSize(FX_FLOAT& fx, FX_FLOAT& fy);
-  void RegisterEventTarget(IFWL_Widget* pEventSource = NULL,
-                           FX_DWORD dwFilter = FWL_EVENT_ALL_MASK);
-  void UnregisterEventTarget();
-  void DispatchKeyEvent(CFWL_MsgKey* pNote);
-  void DispatchEvent(CFWL_Event* pEvent);
-  void Repaint(const CFX_RectF* pRect = NULL);
-  void DrawBackground(CFX_Graphics* pGraphics,
-                      int32_t iPartBk,
-                      IFWL_ThemeProvider* pTheme,
-                      const CFX_Matrix* pMatrix = NULL);
-  void DrawBorder(CFX_Graphics* pGraphics,
-                  int32_t iPartBorder,
-                  IFWL_ThemeProvider* pTheme,
-                  const CFX_Matrix* pMatrix = NULL);
-  void DrawEdge(CFX_Graphics* pGraphics,
-                int32_t iPartEdge,
-                IFWL_ThemeProvider* pTheme,
-                const CFX_Matrix* pMatrix = NULL);
-  void NotifyDriver();
-
-  FX_BOOL IsParent(IFWL_Widget* pParent);
-  CFWL_WidgetMgr* m_pWidgetMgr;
-  CFWL_NoteThreadImp* m_pOwnerThread;
-  CFWL_WidgetImpProperties* m_pProperties;
-  CFX_PrivateData* m_pPrivateData;
-  IFWL_WidgetDelegate* m_pDelegate;
-  IFWL_WidgetDelegate* m_pCurDelegate;
-  IFWL_Widget* m_pOuter;
-  IFWL_Widget* m_pInterface;
-  int32_t m_iLock;
-  friend class CFWL_WidgetImpDelegate;
-  friend void FWL_SetWidgetRect(IFWL_Widget* widget, const CFX_RectF& rect);
-  friend void FWL_SetWidgetStates(IFWL_Widget* widget, FX_DWORD dwStates);
-  friend void FWL_SetWidgetStyles(IFWL_Widget* widget, FX_DWORD dwStyles);
-};
-
-class CFWL_WidgetImpDelegate : public IFWL_WidgetDelegate {
- public:
-  CFWL_WidgetImpDelegate();
-  ~CFWL_WidgetImpDelegate() override {}
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_WIDGETIMP_H_
diff --git a/xfa/src/fwl/core/fwl_widgetmgrimp.cpp b/xfa/src/fwl/core/fwl_widgetmgrimp.cpp
deleted file mode 100644
index aeb655b..0000000
--- a/xfa/src/fwl/core/fwl_widgetmgrimp.cpp
+++ /dev/null
@@ -1,1075 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-#include "xfa/include/fwl/adapter/fwl_adapternative.h"
-#include "xfa/include/fwl/adapter/fwl_adapterwidgetmgr.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/core/fwl_form.h"
-#include "xfa/src/fwl/core/fwl_appimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
-#if (_FX_OS_ == _FX_MACOSX_)
-  return FALSE;
-#else
-  return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen;
-#endif
-}
-IFWL_WidgetMgr* FWL_GetWidgetMgr() {
-  IFWL_App* pApp = FWL_GetApp();
-  if (!pApp)
-    return NULL;
-  return pApp->GetWidgetMgr();
-}
-CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
-    : m_dwCapability(0) {
-  m_pDelegate = new CFWL_WidgetMgrDelegate(this);
-  m_pAdapter = pAdapterNative->GetWidgetMgr(m_pDelegate);
-  FXSYS_assert(m_pAdapter);
-  CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
-  m_mapWidgetItem.SetAt(NULL, pRoot);
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-  m_rtScreen.Reset();
-#endif
-}
-CFWL_WidgetMgr::~CFWL_WidgetMgr() {
-  FX_POSITION ps = m_mapWidgetItem.GetStartPosition();
-  while (ps) {
-    void* pWidget;
-    CFWL_WidgetMgrItem* pItem;
-    m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem);
-    delete pItem;
-  }
-  m_mapWidgetItem.RemoveAll();
-  if (m_pDelegate) {
-    delete m_pDelegate;
-    m_pDelegate = NULL;
-  }
-}
-int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
-  return TravelWidgetMgr(pParentItem, NULL, NULL);
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidget(int32_t nIndex, IFWL_Widget* pParent) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
-  IFWL_Widget* pWidget = NULL;
-  TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget);
-  return pWidget;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget* pWidget,
-                                       FWL_WGTRELATION eRelation) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  if (!pItem) {
-    return NULL;
-  }
-  IFWL_Widget* pRet = NULL;
-  switch (eRelation) {
-    case FWL_WGTRELATION_Parent: {
-      pRet = pItem->pParent ? pItem->pParent->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_Owner: {
-      pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_FirstSibling: {
-      pItem = pItem->pPrevious;
-      while (pItem && pItem->pPrevious) {
-        pItem = pItem->pPrevious;
-      }
-      pRet = pItem ? pItem->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_PriorSibling: {
-      pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_NextSibling: {
-      pRet = pItem->pNext ? pItem->pNext->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_LastSibling: {
-      pItem = pItem->pNext;
-      while (pItem && pItem->pNext) {
-        pItem = pItem->pNext;
-      }
-      pRet = pItem ? pItem->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_FirstChild: {
-      pRet = pItem->pChild ? pItem->pChild->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_LastChild: {
-      pItem = pItem->pChild;
-      while (pItem && pItem->pNext) {
-        pItem = pItem->pNext;
-      }
-      pRet = pItem ? pItem->pWidget : NULL;
-      break;
-    }
-    case FWL_WGTRELATION_SystemForm: {
-      while (pItem) {
-        if (IsAbleNative(pItem->pWidget)) {
-          pRet = pItem->pWidget;
-          break;
-        }
-        pItem = pItem->pParent;
-      }
-      break;
-    }
-    default: {}
-  }
-  return pRet;
-}
-int32_t CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  if (!pItem)
-    return -1;
-  return TravelWidgetMgr(pItem->pParent, NULL, pItem);
-}
-FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  if (!pItem)
-    return FALSE;
-  if (!pItem->pParent)
-    return FALSE;
-  CFWL_WidgetMgrItem* pChild = pItem->pParent->pChild;
-  int32_t i = 0;
-  while (pChild) {
-    if (pChild == pItem) {
-      if (i == nIndex) {
-        return TRUE;
-      }
-      if (pChild->pPrevious) {
-        pChild->pPrevious->pNext = pChild->pNext;
-      }
-      if (pChild->pNext) {
-        pChild->pNext->pPrevious = pChild->pPrevious;
-      }
-      if (pItem->pParent->pChild == pItem) {
-        pItem->pParent->pChild = pItem->pNext;
-      }
-      pItem->pNext = NULL;
-      pItem->pPrevious = NULL;
-      break;
-    }
-    if (!pChild->pNext) {
-      break;
-    }
-    pChild = pChild->pNext;
-    ++i;
-  }
-  pChild = pItem->pParent->pChild;
-  if (pChild) {
-    if (nIndex < 0) {
-      while (pChild->pNext) {
-        pChild = pChild->pNext;
-      }
-      pChild->pNext = pItem;
-      pItem->pPrevious = pChild;
-      pItem->pNext = NULL;
-      return TRUE;
-    }
-    i = 0;
-    while (i < nIndex && pChild->pNext) {
-      pChild = pChild->pNext;
-      ++i;
-    }
-    if (!pChild->pNext) {
-      pChild->pNext = pItem;
-      pItem->pPrevious = pChild;
-      pItem->pNext = NULL;
-      return TRUE;
-    }
-    if (pChild->pPrevious) {
-      pItem->pPrevious = pChild->pPrevious;
-      pChild->pPrevious->pNext = pItem;
-    }
-    pChild->pPrevious = pItem;
-    pItem->pNext = pChild;
-    if (pItem->pParent->pChild == pChild) {
-      pItem->pParent->pChild = pItem;
-    }
-  } else {
-    pItem->pParent->pChild = pItem;
-    pItem->pPrevious = NULL;
-    pItem->pNext = NULL;
-  }
-  return TRUE;
-}
-FWL_ERR CFWL_WidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
-                                      const CFX_RectF* pRect) {
-  if (!m_pAdapter)
-    return FWL_ERR_Indefinite;
-  IFWL_Widget* pNative = pWidget;
-  CFX_RectF rect(*pRect);
-  if (IsFormDisabled()) {
-    IFWL_Widget* pOuter = pWidget->GetOuter();
-    while (pOuter) {
-      CFX_RectF rtTemp;
-      pNative->GetWidgetRect(rtTemp);
-      rect.left += rtTemp.left;
-      rect.top += rtTemp.top;
-      pNative = pOuter;
-      pOuter = pOuter->GetOuter();
-    }
-  } else if (!IsAbleNative(pWidget)) {
-    pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
-    if (!pNative)
-      return FWL_ERR_Indefinite;
-    pWidget->TransformTo(pNative, rect.left, rect.top);
-  }
-  AddRedrawCounts(pNative);
-  return m_pAdapter->RepaintWidget(pNative, &rect);
-}
-void CFWL_WidgetMgr::AddWidget(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(NULL);
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pWidget;
-    m_mapWidgetItem.SetAt(pWidget, pItem);
-  }
-  if (pItem->pParent && pItem->pParent != pParentItem) {
-    if (pItem->pPrevious) {
-      pItem->pPrevious->pNext = pItem->pNext;
-    }
-    if (pItem->pNext) {
-      pItem->pNext->pPrevious = pItem->pPrevious;
-    }
-    if (pItem->pParent->pChild == pItem) {
-      pItem->pParent->pChild = pItem->pNext;
-    }
-  }
-  pItem->pParent = pParentItem;
-  SetWidgetIndex(pWidget, -1);
-}
-void CFWL_WidgetMgr::InsertWidget(IFWL_Widget* pParent,
-                                  IFWL_Widget* pChild,
-                                  int32_t nIndex) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
-  if (!pParentItem) {
-    pParentItem = new CFWL_WidgetMgrItem;
-    pParentItem->pWidget = pParent;
-    m_mapWidgetItem.SetAt(pParent, pParentItem);
-    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
-    pParentItem->pParent = pRoot;
-    SetWidgetIndex(pParent, -1);
-  }
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
-  if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pChild;
-    m_mapWidgetItem.SetAt(pChild, pItem);
-  }
-  if (pItem->pParent && pItem->pParent != pParentItem) {
-    if (pItem->pPrevious) {
-      pItem->pPrevious->pNext = pItem->pNext;
-    }
-    if (pItem->pNext) {
-      pItem->pNext->pPrevious = pItem->pPrevious;
-    }
-    if (pItem->pParent->pChild == pItem) {
-      pItem->pParent->pChild = pItem->pNext;
-    }
-  }
-  pItem->pParent = pParentItem;
-  SetWidgetIndex(pChild, nIndex);
-}
-void CFWL_WidgetMgr::RemoveWidget(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  if (!pItem) {
-    return;
-  }
-  if (pItem->pPrevious) {
-    pItem->pPrevious->pNext = pItem->pNext;
-  }
-  if (pItem->pNext) {
-    pItem->pNext->pPrevious = pItem->pPrevious;
-  }
-  if (pItem->pParent && pItem->pParent->pChild == pItem) {
-    pItem->pParent->pChild = pItem->pNext;
-  }
-  CFWL_WidgetMgrItem* pChild = pItem->pChild;
-  while (pChild) {
-    CFWL_WidgetMgrItem* pNext = pChild->pNext;
-    RemoveWidget(pChild->pWidget);
-    pChild = pNext;
-  }
-  m_mapWidgetItem.RemoveKey(pWidget);
-  delete pItem;
-}
-void CFWL_WidgetMgr::SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pOwner);
-  if (!pParentItem) {
-    pParentItem = new CFWL_WidgetMgrItem;
-    pParentItem->pWidget = pOwner;
-    m_mapWidgetItem.SetAt(pOwner, pParentItem);
-    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
-    pParentItem->pParent = pRoot;
-    SetWidgetIndex(pOwner, -1);
-  }
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pOwned);
-  if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pOwned;
-    m_mapWidgetItem.SetAt(pOwned, pItem);
-  }
-  pItem->pOwner = pParentItem;
-}
-void CFWL_WidgetMgr::SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild) {
-  CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
-  if (!pItem)
-    return;
-  if (pItem->pParent && pItem->pParent != pParentItem) {
-    if (pItem->pPrevious) {
-      pItem->pPrevious->pNext = pItem->pNext;
-    }
-    if (pItem->pNext) {
-      pItem->pNext->pPrevious = pItem->pPrevious;
-    }
-    if (pItem->pParent->pChild == pItem) {
-      pItem->pParent->pChild = pItem->pNext;
-    }
-    pItem->pNext = NULL;
-    pItem->pPrevious = NULL;
-  }
-  pItem->pParent = pParentItem;
-  SetWidgetIndex(pChild, -1);
-  if (!m_pAdapter)
-    return;
-  m_pAdapter->SetParentWidget(pChild, pParent);
-}
-FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent) {
-  IFWL_Widget* pTemp = pChild;
-  do {
-    if (pTemp == pParent) {
-      return TRUE;
-    }
-    pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent);
-  } while (pTemp);
-  return FALSE;
-}
-FWL_ERR CFWL_WidgetMgr::CreateWidget_Native(IFWL_Widget* pWidget) {
-  if (!IsAbleNative(pWidget)) {
-    return FWL_ERR_Succeeded;
-  }
-  return m_pAdapter->CreateWidget(pWidget, pWidget->GetOwner());
-}
-FWL_ERR CFWL_WidgetMgr::DestroyWidget_Native(IFWL_Widget* pWidget) {
-  if (!IsAbleNative(pWidget)) {
-    return FWL_ERR_Succeeded;
-  }
-  return m_pAdapter->DestroyWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::GetWidgetRect_Native(IFWL_Widget* pWidget,
-                                             CFX_RectF& rect) {
-  if (!IsAbleNative(pWidget)) {
-    return FWL_ERR_Succeeded;
-  }
-  return m_pAdapter->GetWidgetRect(pWidget, rect);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetRect_Native(IFWL_Widget* pWidget,
-                                             const CFX_RectF& rect) {
-  if (FWL_UseOffscreen(pWidget)) {
-    CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-    pItem->iRedrawCounter++;
-    if (pItem->pOffscreen) {
-      CFX_RenderDevice* pDevice = pItem->pOffscreen->GetRenderDevice();
-      if (pDevice && pDevice->GetBitmap()) {
-        CFX_DIBitmap* pBitmap = pDevice->GetBitmap();
-        if (pBitmap->GetWidth() - rect.width > 1 ||
-            pBitmap->GetHeight() - rect.height > 1) {
-          delete pItem->pOffscreen;
-          pItem->pOffscreen = NULL;
-        }
-      }
-    }
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-    pItem->bOutsideChanged = !m_rtScreen.Contains(rect);
-#endif
-  }
-  return m_pAdapter->SetWidgetRect(pWidget, rect);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetPosition_Native(IFWL_Widget* pWidget,
-                                                 FX_FLOAT fx,
-                                                 FX_FLOAT fy) {
-  return m_pAdapter->SetWidgetPosition(pWidget, fx, fy);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetIcon_Native(IFWL_Widget* pWidget,
-                                             const CFX_DIBitmap* pIcon,
-                                             FX_BOOL bBig) {
-  return m_pAdapter->SetWidgetIcon(pWidget, pIcon, bBig);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetCaption_Native(
-    IFWL_Widget* pWidget,
-    const CFX_WideStringC& wsCaption) {
-  return m_pAdapter->SetWidgetCaption(pWidget, wsCaption);
-}
-FWL_ERR CFWL_WidgetMgr::SetBorderRegion_Native(IFWL_Widget* pWidget,
-                                               CFX_Path* pPath) {
-  return m_pAdapter->SetBorderRegion(pWidget, pPath);
-}
-FWL_ERR CFWL_WidgetMgr::ShowWidget_Native(IFWL_Widget* pWidget) {
-  return m_pAdapter->ShowWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::HideWidget_Native(IFWL_Widget* pWidget) {
-  return m_pAdapter->HideWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetNormal_Native(IFWL_Widget* pWidget) {
-  return m_pAdapter->SetNormal(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetMaximize_Native(IFWL_Widget* pWidget) {
-  return m_pAdapter->SetMaximize(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetMinimize_Native(IFWL_Widget* pWidget) {
-  return m_pAdapter->SetMinimize(pWidget);
-}
-FX_BOOL CFWL_WidgetMgr::CheckMessage_Native() {
-  return m_pAdapter->CheckMessage();
-}
-FWL_ERR CFWL_WidgetMgr::DispatchMessage_Native() {
-  return m_pAdapter->DispatchMessage();
-}
-FX_BOOL CFWL_WidgetMgr::IsIdleMessage_Native() {
-  return m_pAdapter->IsIdleMessage();
-}
-FWL_ERR CFWL_WidgetMgr::Exit_Native(int32_t iExitCode) {
-  return m_pAdapter->Exit(iExitCode);
-}
-FWL_ERR CFWL_WidgetMgr::CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget,
-                                                        void* vp) {
-  return m_pAdapter->CreateWidgetWithNativeId(pWidget, vp);
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
-                                              FX_FLOAT x,
-                                              FX_FLOAT y) {
-  if (!parent)
-    return NULL;
-  FX_FLOAT x1;
-  FX_FLOAT y1;
-  IFWL_Widget* child = GetWidget(parent, FWL_WGTRELATION_LastChild);
-  while (child) {
-    if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
-      x1 = x;
-      y1 = y;
-      CFX_Matrix matrixOnParent;
-      child->GetMatrix(matrixOnParent);
-      CFX_Matrix m;
-      m.SetIdentity();
-      m.SetReverse(matrixOnParent);
-      m.TransformPoint(x1, y1);
-      CFX_RectF bounds;
-      child->GetWidgetRect(bounds);
-      if (bounds.Contains(x1, y1)) {
-        x1 -= bounds.left;
-        y1 -= bounds.top;
-        return GetWidgetAtPoint(child, x1, y1);
-      }
-    }
-    child = GetWidget(child, FWL_WGTRELATION_PriorSibling);
-  }
-  return parent;
-}
-void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  if (!FWL_UseOffscreen(pForm)) {
-    return;
-  }
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pForm);
-  if (pItem->pOffscreen) {
-    delete pItem->pOffscreen;
-    pItem->pOffscreen = NULL;
-  }
-}
-IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
-                                     IFWL_Widget* focus,
-                                     FX_BOOL& bFind) {
-  IFWL_Widget* child =
-      FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
-  while (child) {
-    if (focus == child) {
-      bFind = TRUE;
-    }
-    if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) &&
-        (!focus || (focus != child && bFind))) {
-      return child;
-    }
-    IFWL_Widget* bRet = nextTab(child, focus, bFind);
-    if (bRet) {
-      return bRet;
-    }
-    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-  return NULL;
-}
-int32_t CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget* pFirst) {
-  int32_t iRet = 0;
-  IFWL_Widget* pChild = pFirst;
-  while (pChild) {
-    if ((pChild->GetStyles() & FWL_WGTSTYLE_Group) &&
-        pChild->GetClassID() == 3811304691) {
-      iRet++;
-    }
-    pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling);
-  }
-  return iRet;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget* pWidget,
-                                                   FX_BOOL bNext) {
-  while ((pWidget = GetWidget(pWidget, bNext ? FWL_WGTRELATION_NextSibling
-                                             : FWL_WGTRELATION_PriorSibling)) !=
-         NULL) {
-    if (pWidget->GetClassID() == 3811304691) {
-      return pWidget;
-    }
-  }
-  return NULL;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(
-    IFWL_Widget* pRadioButton) {
-  if (pRadioButton->GetStyles() & FWL_WGTSTYLE_Group) {
-    return pRadioButton;
-  }
-  IFWL_Widget* pNext = pRadioButton;
-  while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != NULL) {
-    if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
-      return pNext;
-    }
-  }
-  pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling);
-  if ((pNext->GetStyles() & FWL_WGTSTYLE_Group) &&
-      pNext->GetClassID() == 3811304691) {
-    return pNext;
-  }
-  while ((pNext = GetSiblingRadioButton(pNext, FALSE)) && pNext &&
-         pNext != pRadioButton) {
-    if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
-      return pNext;
-    }
-  }
-  pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
-  if (pNext && (pNext->GetStyles() == FWL_WGTSTYLE_Group) &&
-      pNext->GetClassID() == 3811304691) {
-    return pNext;
-  }
-  return GetSiblingRadioButton(pNext, TRUE);
-}
-void CFWL_WidgetMgr::GetSameGroupRadioButton(IFWL_Widget* pRadioButton,
-                                             CFX_PtrArray& group) {
-  IFWL_Widget* pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
-  if (!pFirst) {
-    pFirst = pRadioButton;
-  }
-  int32_t iGroup = CountRadioButtonGroup(pFirst);
-  if (iGroup < 2) {
-    if (pFirst->GetClassID() == 3811304691) {
-      group.Add(pFirst);
-    }
-    IFWL_Widget* pNext = pFirst;
-    while ((pNext = GetSiblingRadioButton(pNext, TRUE)) != NULL) {
-      group.Add(pNext);
-    }
-    return;
-  }
-  IFWL_Widget* pNext = GetRadioButtonGroupHeader(pRadioButton);
-  do {
-    group.Add(pNext);
-    pNext = GetSiblingRadioButton(pNext, TRUE);
-    if (!pNext) {
-      if (pFirst->GetClassID() == 3811304691) {
-        pNext = pFirst;
-      } else {
-        pNext = GetSiblingRadioButton(pFirst, TRUE);
-      }
-    }
-  } while (pNext && ((pNext->GetStyles() & FWL_WGTSTYLE_Group) == 0));
-}
-IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
-  if ((pParent->GetClassID() == 3521614244) &&
-      (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
-    return pParent;
-  }
-  IFWL_Widget* child =
-      FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
-  while (child) {
-    if ((child->GetClassID() == 3521614244) &&
-        (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
-      return child;
-    }
-    IFWL_Widget* find = GetDefaultButton(child);
-    if (find) {
-      return find;
-    }
-    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-  return NULL;
-}
-void CFWL_WidgetMgr::AddRedrawCounts(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  (pItem->iRedrawCounter)++;
-}
-void CFWL_WidgetMgr::ResetRedrawCounts(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
-  pItem->iRedrawCounter = 0;
-}
-CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget* pWidget) {
-  return static_cast<CFWL_WidgetMgrItem*>(m_mapWidgetItem.GetValueAt(pWidget));
-}
-int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
-                                        int32_t* pIndex,
-                                        CFWL_WidgetMgrItem* pItem,
-                                        IFWL_Widget** pWidget) {
-  if (!pParent) {
-    return 0;
-  }
-  int32_t iCount = 0;
-  CFWL_WidgetMgrItem* pChild = pParent->pChild;
-  while (pChild) {
-    iCount++;
-    if (pIndex) {
-      if (*pIndex == 0) {
-        *pWidget = pChild->pWidget;
-        return iCount;
-      }
-      pIndex--;
-    }
-    if (pItem && pItem == pChild) {
-      return iCount - 1;
-    }
-    pChild = pChild->pNext;
-  }
-  if (pIndex) {
-    return 0;
-  } else if (pItem) {
-    return -1;
-  }
-  return iCount - 1;
-}
-FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FALSE;
-  if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) {
-    return FALSE;
-  }
-  FX_DWORD dwStyles = pWidget->GetStyles();
-  return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
-          FWL_WGTSTYLE_OverLapper) ||
-         (dwStyles & FWL_WGTSTYLE_Popup);
-}
-FX_BOOL CFWL_WidgetMgr::IsThreadEnabled() {
-  return !(m_dwCapability & FWL_WGTMGR_DisableThread);
-}
-FX_BOOL CFWL_WidgetMgr::IsFormDisabled() {
-  return m_dwCapability & FWL_WGTMGR_DisableForm;
-}
-FX_BOOL CFWL_WidgetMgr::GetAdapterPopupPos(IFWL_Widget* pWidget,
-                                           FX_FLOAT fMinHeight,
-                                           FX_FLOAT fMaxHeight,
-                                           const CFX_RectF& rtAnchor,
-                                           CFX_RectF& rtPopup) {
-  IFWL_AdapterWidgetMgr* pSDApapter = GetAdapterWidgetMgr();
-  return pSDApapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor,
-                                 rtPopup);
-}
-CFWL_WidgetMgrDelegate::CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr)
-    : m_pWidgetMgr(pWidgetMgr) {}
-FWL_ERR CFWL_WidgetMgrDelegate::OnSetCapability(FX_DWORD dwCapability) {
-  m_pWidgetMgr->m_dwCapability = dwCapability;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return 0;
-  if (!pMessage->m_pDstTarget)
-    return 0;
-  IFWL_Widget* pDstWidget = pMessage->m_pDstTarget;
-  IFWL_NoteThread* pNoteThread = pDstWidget->GetOwnerThread();
-  if (!pNoteThread)
-    return 0;
-  CFWL_NoteDriver* pNoteDriver =
-      static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
-  if (!pNoteDriver)
-    return 0;
-  if (m_pWidgetMgr->IsThreadEnabled()) {
-    pMessage = static_cast<CFWL_Message*>(pMessage->Clone());
-  }
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    pNoteDriver->ProcessMessage(pMessage);
-  } else {
-    pNoteDriver->QueueMessage(pMessage);
-  }
-#if (_FX_OS_ == _FX_MACOSX_)
-  CFWL_NoteLoop* pTopLoop = pNoteDriver->GetTopLoop();
-  if (pTopLoop) {
-    pNoteDriver->UnqueueMessage(pTopLoop);
-  }
-#endif
-  if (m_pWidgetMgr->IsThreadEnabled()) {
-    pMessage->Release();
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
-                                             CFX_Graphics* pGraphics,
-                                             const CFX_Matrix* pMatrix) {
-  if (!pWidget)
-    return FWL_ERR_Indefinite;
-  if (!pGraphics)
-    return FWL_ERR_Indefinite;
-  CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix);
-  CFX_RectF clipCopy;
-  pWidget->GetWidgetRect(clipCopy);
-  clipCopy.left = clipCopy.top = 0;
-  if (bUseOffscreenDirect(pWidget)) {
-    DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
-    return FWL_ERR_Succeeded;
-  }
-  CFX_RectF clipBounds;
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) || \
-    (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_ANDROID_)
-  IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
-  pDelegate->OnDrawWidget(pTemp, pMatrix);
-  pGraphics->GetClipRect(clipBounds);
-  clipCopy = clipBounds;
-#elif(_FX_OS_ == _FX_MACOSX_)
-  if (m_pWidgetMgr->IsFormDisabled()) {
-    IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
-    pDelegate->OnDrawWidget(pTemp, pMatrix);
-    pGraphics->GetClipRect(clipBounds);
-    clipCopy = clipBounds;
-  } else {
-    clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
-    const_cast<CFX_Matrix*>(pMatrix)->SetIdentity();  // FIXME: const cast.
-#ifdef FWL_UseMacSystemBorder
-#else
-#endif
-    {
-      IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
-      pDelegate->OnDrawWidget(pTemp, pMatrix);
-    }
-  }
-#endif
-  if (!m_pWidgetMgr->IsFormDisabled()) {
-    CFX_RectF rtClient;
-    pWidget->GetClientRect(rtClient);
-    clipBounds.Intersect(rtClient);
-  }
-  if (!clipBounds.IsEmpty()) {
-    DrawChild(pWidget, clipBounds, pTemp, pMatrix);
-  }
-  DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
-  m_pWidgetMgr->ResetRedrawCounts(pWidget);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
-                                       const CFX_RectF& rtClip,
-                                       CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {
-  if (!parent)
-    return;
-  FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
-  IFWL_Widget* pNextChild =
-      m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
-  while (pNextChild) {
-    IFWL_Widget* child = pNextChild;
-    pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
-    if (child->GetStates() & FWL_WGTSTATE_Invisible) {
-      continue;
-    }
-    CFX_RectF rtWidget;
-    child->GetWidgetRect(rtWidget);
-    if (rtWidget.IsEmpty()) {
-      continue;
-    }
-    CFX_Matrix widgetMatrix;
-    CFX_RectF clipBounds(rtWidget);
-    if (!bFormDisable) {
-      child->GetMatrix(widgetMatrix, TRUE);
-    }
-    if (pMatrix) {
-      widgetMatrix.Concat(*pMatrix);
-    }
-    if (!bFormDisable) {
-      widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top);
-      clipBounds.Intersect(rtClip);
-      if (clipBounds.IsEmpty()) {
-        continue;
-      }
-      pGraphics->SaveGraphState();
-      pGraphics->SetClipRect(clipBounds);
-    }
-    widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE);
-    IFWL_WidgetDelegate* pDelegate = child->SetDelegate(NULL);
-    if (pDelegate) {
-      if (m_pWidgetMgr->IsFormDisabled() ||
-          IsNeedRepaint(child, &widgetMatrix, rtClip)) {
-        pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
-      }
-    }
-    if (!bFormDisable) {
-      pGraphics->RestoreGraphState();
-    }
-    DrawChild(child, clipBounds, pGraphics,
-              bFormDisable ? &widgetMatrix : pMatrix);
-    child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-}
-CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
-    IFWL_Widget* pWidget,
-    CFX_Graphics* pGraphics,
-    const CFX_Matrix* pMatrix) {
-  if (!FWL_UseOffscreen(pWidget)) {
-    return pGraphics;
-  }
-  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-  if (!pItem->pOffscreen) {
-    pItem->pOffscreen = new CFX_Graphics;
-    CFX_RectF rect;
-    pWidget->GetWidgetRect(rect);
-    pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height,
-                              FXDIB_Argb);
-  }
-  CFX_RectF rect;
-  pGraphics->GetClipRect(rect);
-  pItem->pOffscreen->SetClipRect(rect);
-  return pItem->pOffscreen;
-}
-void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
-                                             CFX_Graphics* pGraphics,
-                                             CFX_RectF& rtClip,
-                                             const CFX_Matrix* pMatrix) {
-  if (FWL_UseOffscreen(pWidget)) {
-    CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-    pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip,
-                        pMatrix);
-#ifdef _WIN32
-    pItem->pOffscreen->ClearClip();
-#endif
-  }
-  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-  pItem->iRedrawCounter = 0;
-}
-
-#define FWL_NEEDREPAINTHIT_Point 12
-#define FWL_NEEDREPAINTHIT_Piece 3
-struct FWL_NEEDREPAINTHITDATA {
-  CFX_PointF hitPoint;
-  FX_BOOL bNotNeedRepaint;
-  FX_BOOL bNotContainByDirty;
-};
-
-FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
-                                              CFX_Matrix* pMatrix,
-                                              const CFX_RectF& rtDirty) {
-  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-  if (pItem && pItem->iRedrawCounter > 0) {
-    pItem->iRedrawCounter = 0;
-    return TRUE;
-  }
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.left = rtWidget.top = 0;
-  pMatrix->TransformRect(rtWidget);
-  if (!rtWidget.IntersectWith(rtDirty)) {
-    return FALSE;
-  }
-  IFWL_Widget* pChild =
-      FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
-  if (!pChild) {
-    return TRUE;
-  }
-  if (pChild->GetClassID() == 3150298670) {
-    CFX_RectF rtTemp;
-    pChild->GetWidgetRect(rtTemp);
-    if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) {
-      pChild =
-          FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild);
-      if (!pChild) {
-        return TRUE;
-      }
-    }
-  }
-  CFX_RectF rtChilds;
-  rtChilds.Empty();
-  FX_BOOL bChildIntersectWithDirty = FALSE;
-  FX_BOOL bOrginPtIntersectWidthChild = FALSE;
-  FX_BOOL bOrginPtIntersectWidthDirty =
-      rtDirty.Contains(rtWidget.left, rtWidget.top);
-  static FWL_NEEDREPAINTHITDATA hitPoint[FWL_NEEDREPAINTHIT_Point];
-  int32_t iSize = sizeof(FWL_NEEDREPAINTHITDATA);
-  FXSYS_memset(hitPoint, 0, iSize);
-  FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece;
-  FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece;
-  hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left;
-  hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x =
-      hitPoint[10].hitPoint.x = fxPiece + rtWidget.left;
-  hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x =
-      hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left;
-  hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x =
-      rtWidget.width + rtWidget.left;
-  hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top;
-  hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y =
-      hitPoint[5].hitPoint.y = fyPiece + rtWidget.top;
-  hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y =
-      hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top;
-  hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y =
-      rtWidget.height + rtWidget.top;
-  do {
-    CFX_RectF rect;
-    pChild->GetWidgetRect(rect);
-    CFX_RectF r = rect;
-    r.left += rtWidget.left;
-    r.top += rtWidget.top;
-    if (r.IsEmpty()) {
-      continue;
-    }
-    if (r.Contains(rtDirty)) {
-      return FALSE;
-    }
-    if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) {
-      bChildIntersectWithDirty = TRUE;
-    }
-    if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
-      bOrginPtIntersectWidthChild = rect.Contains(0, 0);
-    }
-    if (rtChilds.IsEmpty()) {
-      rtChilds = rect;
-    } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) {
-      rtChilds.Union(rect);
-    }
-    for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
-      if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) {
-        continue;
-      }
-      if (!rtDirty.Contains(hitPoint[i].hitPoint)) {
-        hitPoint[i].bNotContainByDirty = TRUE;
-        continue;
-      }
-      if (r.Contains(hitPoint[i].hitPoint)) {
-        hitPoint[i].bNotNeedRepaint = TRUE;
-      }
-    }
-  } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
-                pChild, FWL_WGTRELATION_NextSibling)) != NULL);
-  if (!bChildIntersectWithDirty) {
-    return TRUE;
-  }
-  if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
-    return TRUE;
-  }
-  if (rtChilds.IsEmpty()) {
-    return TRUE;
-  }
-  int32_t repaintPoint = FWL_NEEDREPAINTHIT_Point;
-  for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
-    if (hitPoint[i].bNotNeedRepaint) {
-      repaintPoint--;
-    }
-  }
-  if (repaintPoint > 0) {
-    return TRUE;
-  }
-  pMatrix->TransformRect(rtChilds);
-  if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) {
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget* pWidget) {
-  CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-  if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) {
-    return FALSE;
-  }
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-  if (pItem->bOutsideChanged) {
-    CFX_RectF r;
-    pWidget->GetWidgetRect(r);
-    CFX_RectF temp(m_pWidgetMgr->m_rtScreen);
-    temp.Deflate(50, 50);
-    if (!temp.Contains(r)) {
-      return FALSE;
-    }
-    pItem->bOutsideChanged = FALSE;
-  }
-#endif
-  return pItem->iRedrawCounter == 0;
-}
-static void FWL_WriteBMP(CFX_DIBitmap* pBitmap, const FX_CHAR* filename) {
-  FILE* file = fopen(filename, "wb");
-  if (file == NULL) {
-    return;
-  }
-  int size = 14 + 40 + pBitmap->GetPitch() * pBitmap->GetHeight();
-  unsigned char buffer[40];
-  buffer[0] = 'B';
-  buffer[1] = 'M';
-  buffer[2] = (unsigned char)size;
-  buffer[3] = (unsigned char)(size >> 8);
-  buffer[4] = (unsigned char)(size >> 16);
-  buffer[5] = (unsigned char)(size >> 24);
-  buffer[6] = buffer[7] = buffer[8] = buffer[9] = 0;
-  buffer[10] = 54;
-  buffer[11] = buffer[12] = buffer[13] = 0;
-  fwrite(buffer, 14, 1, file);
-  memset(buffer, 0, 40);
-  buffer[0] = 40;
-  buffer[4] = (unsigned char)pBitmap->GetWidth();
-  buffer[5] = (unsigned char)(pBitmap->GetWidth() >> 8);
-  buffer[6] = (unsigned char)(pBitmap->GetWidth() >> 16);
-  buffer[7] = (unsigned char)(pBitmap->GetWidth() >> 24);
-  buffer[8] = (unsigned char)(-pBitmap->GetHeight());
-  buffer[9] = (unsigned char)((-pBitmap->GetHeight()) >> 8);
-  buffer[10] = (unsigned char)((-pBitmap->GetHeight()) >> 16);
-  buffer[11] = (unsigned char)((-pBitmap->GetHeight()) >> 24);
-  buffer[12] = 1;
-  buffer[14] = pBitmap->GetBPP();
-  fwrite(buffer, 40, 1, file);
-  for (int row = 0; row < pBitmap->GetHeight(); row++) {
-    uint8_t* scan_line = pBitmap->GetBuffer() + row * pBitmap->GetPitch();
-    fwrite(scan_line, pBitmap->GetPitch(), 1, file);
-  }
-  fclose(file);
-}
-FWL_ERR FWL_WidgetMgrSnapshot(IFWL_Widget* pWidget,
-                              const CFX_WideString* saveFile,
-                              const CFX_Matrix* pMatrix) {
-  CFX_RectF r;
-  pWidget->GetWidgetRect(r);
-  CFX_Graphics gs;
-  gs.Create((int32_t)r.width, (int32_t)r.height, FXDIB_Argb);
-  CFWL_WidgetMgr* widgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  CFWL_WidgetMgrDelegate* delegate = widgetMgr->GetDelegate();
-  delegate->OnDrawWidget(pWidget, &gs, pMatrix);
-  CFX_DIBitmap* dib = gs.GetRenderDevice()->GetBitmap();
-  FWL_WriteBMP(dib, saveFile->UTF8Encode());
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL FWL_WidgetIsChild(IFWL_Widget* parent, IFWL_Widget* find) {
-  if (!find) {
-    return FALSE;
-  }
-  IFWL_Widget* child =
-      FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
-  while (child) {
-    if (child == find) {
-      return TRUE;
-    }
-    if (FWL_WidgetIsChild(child, find)) {
-      return TRUE;
-    }
-    child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
-  }
-  return FALSE;
-}
diff --git a/xfa/src/fwl/core/fwl_widgetmgrimp.h b/xfa/src/fwl/core/fwl_widgetmgrimp.h
deleted file mode 100644
index f3dfb36..0000000
--- a/xfa/src/fwl/core/fwl_widgetmgrimp.h
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FWL_CORE_FWL_WIDGETMGRIMP_H_
-#define XFA_SRC_FWL_CORE_FWL_WIDGETMGRIMP_H_
-
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-
-class IFWL_Widget;
-class IFWL_AdapterWidgetMgr;
-class CFWL_WidgetMgrDelegate;
-class IFWL_AdapterNative;
-
-class CFWL_WidgetMgrItem {
- public:
-  CFWL_WidgetMgrItem()
-      : pParent(NULL),
-        pOwner(NULL),
-        pChild(NULL),
-        pPrevious(NULL),
-        pNext(NULL),
-        pWidget(NULL),
-        pOffscreen(NULL),
-        iRedrawCounter(0)
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-        ,
-        bOutsideChanged(FALSE)
-#endif
-  {
-  }
-  ~CFWL_WidgetMgrItem() {
-    if (pOffscreen) {
-      delete pOffscreen;
-      pOffscreen = NULL;
-    }
-  }
-  CFWL_WidgetMgrItem* pParent;
-  CFWL_WidgetMgrItem* pOwner;
-  CFWL_WidgetMgrItem* pChild;
-  CFWL_WidgetMgrItem* pPrevious;
-  CFWL_WidgetMgrItem* pNext;
-  IFWL_Widget* pWidget;
-  CFX_Graphics* pOffscreen;
-  int32_t iRedrawCounter;
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-  FX_BOOL bOutsideChanged;
-#endif
-};
-
-class CFWL_WidgetMgr : public IFWL_WidgetMgr {
- public:
-  CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative);
-  ~CFWL_WidgetMgr() override;
-
-  // IFWL_WidgetMgr:
-  int32_t CountWidgets(IFWL_Widget* pParent = NULL) override;
-  IFWL_Widget* GetWidget(int32_t nIndex, IFWL_Widget* pParent = NULL) override;
-  IFWL_Widget* GetWidget(IFWL_Widget* pWidget,
-                         FWL_WGTRELATION eRelation) override;
-  int32_t GetWidgetIndex(IFWL_Widget* pWidget) override;
-  FX_BOOL SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) override;
-  FWL_ERR RepaintWidget(IFWL_Widget* pWidget,
-                        const CFX_RectF* pRect = NULL) override;
-  FX_DWORD GetCapability() override { return m_dwCapability; }
-
-  void AddWidget(IFWL_Widget* pWidget);
-  void InsertWidget(IFWL_Widget* pParent,
-                    IFWL_Widget* pChild,
-                    int32_t nIndex = -1);
-  void RemoveWidget(IFWL_Widget* pWidget);
-  void SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned);
-  void SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild);
-  FX_BOOL IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent);
-  FWL_ERR CreateWidget_Native(IFWL_Widget* pWidget);
-  FWL_ERR DestroyWidget_Native(IFWL_Widget* pWidget);
-  FWL_ERR GetWidgetRect_Native(IFWL_Widget* pWidget, CFX_RectF& rect);
-  FWL_ERR SetWidgetRect_Native(IFWL_Widget* pWidget, const CFX_RectF& rect);
-  FWL_ERR SetWidgetPosition_Native(IFWL_Widget* pWidget,
-                                   FX_FLOAT fx,
-                                   FX_FLOAT fy);
-  FWL_ERR SetWidgetIcon_Native(IFWL_Widget* pWidget,
-                               const CFX_DIBitmap* pIcon,
-                               FX_BOOL bBig);
-  FWL_ERR SetWidgetCaption_Native(IFWL_Widget* pWidget,
-                                  const CFX_WideStringC& wsCaption);
-  FWL_ERR SetBorderRegion_Native(IFWL_Widget* pWidget, CFX_Path* pPath);
-  FWL_ERR ShowWidget_Native(IFWL_Widget* pWidget);
-  FWL_ERR HideWidget_Native(IFWL_Widget* pWidget);
-  FWL_ERR SetNormal_Native(IFWL_Widget* pWidget);
-  FWL_ERR SetMaximize_Native(IFWL_Widget* pWidget);
-  FWL_ERR SetMinimize_Native(IFWL_Widget* pWidget);
-  FX_BOOL CheckMessage_Native();
-  FWL_ERR DispatchMessage_Native();
-  FX_BOOL IsIdleMessage_Native();
-  FWL_ERR Exit_Native(int32_t iExitCode);
-  FWL_ERR CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget, void* vp);
-  IFWL_Widget* GetWidgetAtPoint(IFWL_Widget* pParent, FX_FLOAT fx, FX_FLOAT fy);
-  void NotifySizeChanged(IFWL_Widget* pForm, FX_FLOAT fx, FX_FLOAT fy);
-  IFWL_Widget* nextTab(IFWL_Widget* parent, IFWL_Widget* focus, FX_BOOL& bFind);
-  int32_t CountRadioButtonGroup(IFWL_Widget* pFirst);
-  IFWL_Widget* GetSiblingRadioButton(IFWL_Widget* pWidget, FX_BOOL bNext);
-  IFWL_Widget* GetRadioButtonGroupHeader(IFWL_Widget* pRadioButton);
-  void GetSameGroupRadioButton(IFWL_Widget* pRadioButton, CFX_PtrArray& group);
-  IFWL_Widget* GetDefaultButton(IFWL_Widget* pParent);
-  void AddRedrawCounts(IFWL_Widget* pWidget);
-  void ResetRedrawCounts(IFWL_Widget* pWidget);
-  IFWL_AdapterWidgetMgr* GetAdapterWidgetMgr() { return m_pAdapter; }
-  CFWL_WidgetMgrDelegate* GetDelegate() { return m_pDelegate; }
-  CFWL_WidgetMgrItem* GetWidgetMgrItem(IFWL_Widget* pWidget);
-  FX_BOOL IsThreadEnabled();
-  FX_BOOL IsFormDisabled();
-  FX_BOOL GetAdapterPopupPos(IFWL_Widget* pWidget,
-                             FX_FLOAT fMinHeight,
-                             FX_FLOAT fMaxHeight,
-                             const CFX_RectF& rtAnchor,
-                             CFX_RectF& rtPopup);
-
- protected:
-  int32_t TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
-                          int32_t* pIndex,
-                          CFWL_WidgetMgrItem* pItem,
-                          IFWL_Widget** pWidget = NULL);
-  FX_BOOL IsAbleNative(IFWL_Widget* pWidget);
-  CFX_MapPtrToPtr m_mapWidgetItem;
-  IFWL_AdapterWidgetMgr* m_pAdapter;
-  CFWL_WidgetMgrDelegate* m_pDelegate;
-  friend class CFWL_WidgetMgrDelegate;
-  FX_DWORD m_dwCapability;
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
-  CFX_RectF m_rtScreen;
-#endif
-};
-
-class CFWL_WidgetMgrDelegate : public IFWL_WidgetMgrDelegate {
- public:
-  CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr);
-  ~CFWL_WidgetMgrDelegate() override {}
-
-  // IFWL_WidgetMgrDelegate:
-  FWL_ERR OnSetCapability(
-      FX_DWORD dwCapability = FWL_WGTMGR_DisableThread) override;
-  int32_t OnProcessMessageToForm(CFWL_Message* pMessage) override;
-  FWL_ERR OnDrawWidget(IFWL_Widget* pWidget,
-                       CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix) override;
-
- protected:
-  void DrawChild(IFWL_Widget* pParent,
-                 const CFX_RectF& rtClip,
-                 CFX_Graphics* pGraphics,
-                 const CFX_Matrix* pMatrix);
-  CFX_Graphics* DrawWidgetBefore(IFWL_Widget* pWidget,
-                                 CFX_Graphics* pGraphics,
-                                 const CFX_Matrix* pMatrix);
-  void DrawWidgetAfter(IFWL_Widget* pWidget,
-                       CFX_Graphics* pGraphics,
-                       CFX_RectF& rtClip,
-                       const CFX_Matrix* pMatrix);
-  FX_BOOL IsNeedRepaint(IFWL_Widget* pWidget,
-                        CFX_Matrix* pMatrix,
-                        const CFX_RectF& rtDirty);
-  FX_BOOL bUseOffscreenDirect(IFWL_Widget* pWidget);
-
-  CFWL_WidgetMgr* m_pWidgetMgr;
-};
-
-#endif  // XFA_SRC_FWL_CORE_FWL_WIDGETMGRIMP_H_
diff --git a/xfa/src/fwl/lightwidget/caret.cpp b/xfa/src/fwl/lightwidget/caret.cpp
deleted file mode 100644
index bb5fd4c..0000000
--- a/xfa/src/fwl/lightwidget/caret.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/lightwidget/caret.h"
-
-#include <memory>
-
-#include "xfa/include/fwl/basewidget/fwl_caret.h"
-#include "xfa/include/fwl/lightwidget/edit.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-
-CFWL_Caret* CFWL_Caret::Create() {
-  return new CFWL_Caret;
-}
-FWL_ERR CFWL_Caret::Initialize(const CFWL_WidgetProperties* pProperties) {
-  if (m_pIface)
-    return FWL_ERR_Indefinite;
-  if (pProperties) {
-    *m_pProperties = *pProperties;
-  }
-  std::unique_ptr<IFWL_Caret> pCaret(IFWL_Caret::Create(
-      m_pProperties->MakeWidgetImpProperties(nullptr), nullptr));
-  FWL_ERR ret = pCaret->Initialize();
-  if (ret != FWL_ERR_Succeeded) {
-    return ret;
-  }
-  m_pIface = pCaret.release();
-  CFWL_Widget::Initialize();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_Caret::ShowCaret(FX_BOOL bFlag) {
-  return static_cast<IFWL_Caret*>(m_pIface)->ShowCaret(bFlag);
-}
-FWL_ERR CFWL_Caret::GetFrequency(FX_DWORD& elapse) {
-  return static_cast<IFWL_Caret*>(m_pIface)->GetFrequency(elapse);
-}
-FWL_ERR CFWL_Caret::SetFrequency(FX_DWORD elapse) {
-  return static_cast<IFWL_Caret*>(m_pIface)->SetFrequency(elapse);
-}
-FWL_ERR CFWL_Caret::SetColor(CFX_Color crFill) {
-  return static_cast<IFWL_Caret*>(m_pIface)->SetColor(crFill);
-}
-CFWL_Caret::CFWL_Caret() {}
-CFWL_Caret::~CFWL_Caret() {}
diff --git a/xfa/src/fwl/lightwidget/datetimepicker.cpp b/xfa/src/fwl/lightwidget/datetimepicker.cpp
deleted file mode 100644
index 957ed87..0000000
--- a/xfa/src/fwl/lightwidget/datetimepicker.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/lightwidget/datetimepicker.h"
-
-#include <memory>
-
-#include "xfa/include/fwl/core/fwl_error.h"
-#include "xfa/include/fwl/core/fwl_note.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-
-CFWL_DateTimePicker* CFWL_DateTimePicker::Create() {
-  return new CFWL_DateTimePicker;
-}
-FWL_ERR CFWL_DateTimePicker::Initialize(
-    const CFWL_WidgetProperties* pProperties) {
-  if (m_pIface)
-    return FWL_ERR_Indefinite;
-  if (pProperties) {
-    *m_pProperties = *pProperties;
-  }
-  std::unique_ptr<IFWL_DateTimePicker> pDateTimePicker(
-      IFWL_DateTimePicker::Create(
-          m_pProperties->MakeWidgetImpProperties(&m_DateTimePickerDP),
-          nullptr));
-  FWL_ERR ret = pDateTimePicker->Initialize();
-  if (ret != FWL_ERR_Succeeded) {
-    return ret;
-  }
-  m_pIface = pDateTimePicker.release();
-  CFWL_Widget::Initialize();
-  return FWL_ERR_Succeeded;
-}
-
-FWL_ERR CFWL_DateTimePicker::SetToday(int32_t iYear,
-                                      int32_t iMonth,
-                                      int32_t iDay) {
-  m_DateTimePickerDP.m_iYear = iYear;
-  m_DateTimePickerDP.m_iMonth = iMonth;
-  m_DateTimePickerDP.m_iDay = iDay;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_DateTimePicker::CountSelRanges() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CountSelRanges();
-}
-int32_t CFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->GetSelRange(nIndex, nStart);
-}
-FWL_ERR CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetEditText(wsText);
-}
-FWL_ERR CFWL_DateTimePicker::SetEditText(const CFX_WideStringC& wsText) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditText(wsText);
-}
-FWL_ERR CFWL_DateTimePicker::GetCurSel(int32_t& iYear,
-                                       int32_t& iMonth,
-                                       int32_t& iDay) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->GetCurSel(iYear, iMonth, iDay);
-}
-FWL_ERR CFWL_DateTimePicker::SetCurSel(int32_t iYear,
-                                       int32_t iMonth,
-                                       int32_t iDay) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->SetCurSel(iYear, iMonth, iDay);
-}
-CFWL_DateTimePicker::CFWL_DateTimePicker() {}
-CFWL_DateTimePicker::~CFWL_DateTimePicker() {}
-CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() {
-  m_iYear = 2011;
-  m_iMonth = 1;
-  m_iDay = 1;
-}
-FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
-  wsCaption = m_wsData;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(
-    IFWL_Widget* pWidget,
-    int32_t& iYear,
-    int32_t& iMonth,
-    int32_t& iDay) {
-  iYear = m_iYear;
-  iMonth = m_iMonth;
-  iDay = m_iDay;
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_DateTimePicker::CanUndo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanUndo();
-}
-FX_BOOL CFWL_DateTimePicker::CanRedo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanRedo();
-}
-FX_BOOL CFWL_DateTimePicker::Undo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Undo();
-}
-FX_BOOL CFWL_DateTimePicker::Redo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Redo();
-}
-FX_BOOL CFWL_DateTimePicker::CanCopy() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCopy();
-}
-FX_BOOL CFWL_DateTimePicker::CanCut() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCut();
-}
-FX_BOOL CFWL_DateTimePicker::CanSelectAll() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanSelectAll();
-}
-FX_BOOL CFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCopy);
-}
-FX_BOOL CFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCut);
-}
-FX_BOOL CFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Paste(wsPaste);
-}
-FX_BOOL CFWL_DateTimePicker::SelectAll() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SelectAll();
-}
-FX_BOOL CFWL_DateTimePicker::Delete() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Delete();
-}
-FX_BOOL CFWL_DateTimePicker::DeSelect() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->DeSelect();
-}
-FWL_ERR CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetBBox(rect);
-}
-FWL_ERR CFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditLimit(nLimit);
-}
-FWL_ERR CFWL_DateTimePicker::ModifyEditStylesEx(FX_DWORD dwStylesExAdded,
-                                                FX_DWORD dwStylesExRemoved) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
diff --git a/xfa/src/fwl/lightwidget/tooltipctrl.cpp b/xfa/src/fwl/lightwidget/tooltipctrl.cpp
deleted file mode 100644
index 5a308c4..0000000
--- a/xfa/src/fwl/lightwidget/tooltipctrl.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/lightwidget/tooltipctrl.h"
-
-#include <memory>
-
-#include "xfa/src/fwl/core/fwl_formimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_panelimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_threadimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-
-CFWL_ToolTip* CFWL_ToolTip::Create() {
-  return new CFWL_ToolTip;
-}
-FWL_ERR CFWL_ToolTip::Initialize(const CFWL_WidgetProperties* pProperties) {
-  if (m_pIface)
-    return FWL_ERR_Indefinite;
-  if (pProperties) {
-    *m_pProperties = *pProperties;
-  }
-  std::unique_ptr<IFWL_ToolTip> pToolTip(IFWL_ToolTip::Create(
-      m_pProperties->MakeWidgetImpProperties(&m_tooltipData), nullptr));
-  FWL_ERR ret = pToolTip->Initialize();
-  if (ret != FWL_ERR_Succeeded) {
-    return ret;
-  }
-  m_pIface = pToolTip.release();
-  CFWL_Widget::Initialize();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTip::GetCaption(CFX_WideString& wsCaption) {
-  wsCaption = m_tooltipData.m_wsCaption;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTip::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_tooltipData.m_wsCaption = wsCaption;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ToolTip::GetInitialDelay() {
-  return m_tooltipData.m_nInitDelayTime;
-}
-int32_t CFWL_ToolTip::SetInitialDelay(int32_t nDelayTime) {
-  m_tooltipData.m_nInitDelayTime = nDelayTime;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ToolTip::GetAutoPopDelay() {
-  return m_tooltipData.m_nAutoPopDelayTime;
-}
-int32_t CFWL_ToolTip::SetAutoPopDelay(int32_t nDelayTime) {
-  m_tooltipData.m_nAutoPopDelayTime = nDelayTime;
-  return FWL_ERR_Succeeded;
-}
-CFX_DIBitmap* CFWL_ToolTip::GetToolTipIcon() {
-  return m_tooltipData.m_pBitmap;
-}
-FWL_ERR CFWL_ToolTip::SetToolTipIcon(CFX_DIBitmap* pBitmap) {
-  m_tooltipData.m_pBitmap = pBitmap;
-  return FWL_ERR_Succeeded;
-}
-CFX_SizeF CFWL_ToolTip::GetToolTipIconSize() {
-  return m_tooltipData.m_fIconSize;
-}
-FWL_ERR CFWL_ToolTip::SetToolTipIconSize(CFX_SizeF fSize) {
-  m_tooltipData.m_fIconSize = fSize;
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
-  return static_cast<IFWL_ToolTip*>(m_pIface)->SetAnchor(rtAnchor);
-}
-FWL_ERR CFWL_ToolTip::Show() {
-  return static_cast<IFWL_ToolTip*>(m_pIface)->Show();
-}
-FWL_ERR CFWL_ToolTip::Hide() {
-  return static_cast<IFWL_ToolTip*>(m_pIface)->Hide();
-}
-CFWL_ToolTip::CFWL_ToolTip() {}
-CFWL_ToolTip::~CFWL_ToolTip() {}
-CFWL_ToolTip::CFWL_ToolTipDP::CFWL_ToolTipDP() : m_pBitmap(NULL) {
-  m_wsCaption = L"";
-  m_nInitDelayTime = 500;
-  m_nAutoPopDelayTime = 50000;
-  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
-}
-FWL_ERR CFWL_ToolTip::CFWL_ToolTipDP::GetCaption(IFWL_Widget* pWidget,
-                                                 CFX_WideString& wsCaption) {
-  wsCaption = m_wsCaption;
-  return FWL_ERR_Succeeded;
-}
-int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
-  return m_nInitDelayTime;
-}
-int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
-  return m_nAutoPopDelayTime;
-}
-CFX_DIBitmap* CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIcon(
-    IFWL_Widget* pWidget) {
-  return m_pBitmap;
-}
-CFX_SizeF CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIconSize(
-    IFWL_Widget* pWidget) {
-  return m_fIconSize;
-}
-CFX_RectF CFWL_ToolTip::CFWL_ToolTipDP::GetAnchor() {
-  return m_fAnchor;
-}
diff --git a/xfa/src/fwl/lightwidget/widget.cpp b/xfa/src/fwl/lightwidget/widget.cpp
deleted file mode 100644
index 58fb2a7..0000000
--- a/xfa/src/fwl/lightwidget/widget.cpp
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/lightwidget/widget.h"
-
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/include/fwl/core/fwl_thread.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_noteimp.h"
-#include "xfa/src/fwl/core/fwl_targetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetimp.h"
-#include "xfa/src/fwl/core/fwl_widgetmgrimp.h"
-
-CFWL_WidgetImpProperties CFWL_WidgetProperties::MakeWidgetImpProperties(
-    IFWL_DataProvider* pDataProvider) const {
-  CFWL_WidgetImpProperties result;
-  result.m_ctmOnParent = m_ctmOnParent;
-  result.m_rtWidget = m_rtWidget;
-  result.m_dwStyles = m_dwStyles;
-  result.m_dwStyleExes = m_dwStyleExes;
-  result.m_dwStates = m_dwStates;
-  if (m_pParent)
-    result.m_pParent = m_pParent->GetWidget();
-  if (m_pOwner)
-    result.m_pOwner = m_pOwner->GetWidget();
-  result.m_pDataProvider = pDataProvider;
-  return result;
-}
-IFWL_Widget* CFWL_Widget::GetWidget() {
-  return m_pIface;
-}
-FWL_ERR CFWL_Widget::GetClassName(CFX_WideString& wsClass) const {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetClassName(wsClass);
-}
-FX_DWORD CFWL_Widget::GetClassID() const {
-  if (!m_pIface)
-    return 0;
-  return m_pIface->GetClassID();
-}
-FX_BOOL CFWL_Widget::IsInstance(const CFX_WideStringC& wsClass) const {
-  if (!m_pIface)
-    return FALSE;
-  return m_pIface->IsInstance(wsClass);
-}
-static void* gs_pFWLWidget = (void*)FXBSTR_ID('l', 'i', 'g', 't');
-FWL_ERR CFWL_Widget::Initialize(const CFWL_WidgetProperties* pProperties) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetPrivateData(gs_pFWLWidget, this, NULL);
-}
-FWL_ERR CFWL_Widget::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetWidgetRect(rect, bAutoSize);
-}
-FWL_ERR CFWL_Widget::GetGlobalRect(CFX_RectF& rect) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetGlobalRect(rect);
-}
-FWL_ERR CFWL_Widget::SetWidgetRect(const CFX_RectF& rect) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetWidgetRect(rect);
-}
-FWL_ERR CFWL_Widget::GetClientRect(CFX_RectF& rect) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetClientRect(rect);
-}
-CFWL_Widget* CFWL_Widget::GetParent() {
-  if (!m_pIface)
-    return NULL;
-  IFWL_Widget* parent = m_pIface->GetParent();
-  if (parent) {
-    return static_cast<CFWL_Widget*>(parent->GetPrivateData(gs_pFWLWidget));
-  }
-  return NULL;
-}
-FWL_ERR CFWL_Widget::SetParent(CFWL_Widget* pParent) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetParent(pParent ? pParent->GetWidget() : NULL);
-}
-CFWL_Widget* CFWL_Widget::GetOwner() {
-  if (!m_pIface)
-    return NULL;
-  return NULL;
-}
-FWL_ERR CFWL_Widget::SetOwner(CFWL_Widget* pOwner) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return FWL_ERR_Succeeded;
-}
-FX_DWORD CFWL_Widget::GetStyles() {
-  if (!m_pIface)
-    return 0;
-  return m_pIface->GetStyles();
-}
-FWL_ERR CFWL_Widget::ModifyStyles(FX_DWORD dwStylesAdded,
-                                  FX_DWORD dwStylesRemoved) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->ModifyStyles(dwStylesAdded, dwStylesRemoved);
-}
-FX_DWORD CFWL_Widget::GetStylesEx() {
-  if (!m_pIface)
-    return 0;
-  return m_pIface->GetStylesEx();
-}
-FWL_ERR CFWL_Widget::ModifyStylesEx(FX_DWORD dwStylesExAdded,
-                                    FX_DWORD dwStylesExRemoved) {
-  return m_pIface->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
-}
-FX_DWORD CFWL_Widget::GetStates() {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetStates();
-}
-FWL_ERR CFWL_Widget::SetStates(FX_DWORD dwStates, FX_BOOL bSet) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetStates(dwStates, bSet);
-}
-FWL_ERR CFWL_Widget::SetPrivateData(void* module_id,
-                                    void* pData,
-                                    PD_CALLBACK_FREEDATA callback) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetPrivateData(module_id, pData, callback);
-}
-void* CFWL_Widget::GetPrivateData(void* module_id) {
-  if (!m_pIface)
-    return NULL;
-  return m_pIface->GetPrivateData(module_id);
-}
-FWL_ERR CFWL_Widget::Update() {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->Update();
-}
-FWL_ERR CFWL_Widget::LockUpdate() {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->LockUpdate();
-}
-FWL_ERR CFWL_Widget::UnlockUpdate() {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->UnlockUpdate();
-}
-FX_DWORD CFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pIface)
-    return 0;
-  return m_pIface->HitTest(fx, fy);
-}
-FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget,
-                                 FX_FLOAT& fx,
-                                 FX_FLOAT& fy) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, fx, fy);
-}
-FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget, CFX_RectF& rt) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, rt);
-}
-FWL_ERR CFWL_Widget::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->GetMatrix(matrix, bGlobal);
-}
-FWL_ERR CFWL_Widget::SetMatrix(const CFX_Matrix& matrix) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->SetMatrix(matrix);
-}
-FWL_ERR CFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
-                                const CFX_Matrix* pMatrix) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  return m_pIface->DrawWidget(pGraphics, pMatrix);
-}
-IFWL_WidgetDelegate* CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
-  if (!m_pIface)
-    return NULL;
-  m_pDelegate = m_pIface->SetDelegate(pDelegate);
-  return m_pDelegate;
-}
-CFWL_Widget::CFWL_Widget()
-    : m_pIface(NULL), m_pDelegate(NULL), m_pProperties(NULL) {
-  m_pProperties = new CFWL_WidgetProperties;
-  m_pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
-  FXSYS_assert(m_pWidgetMgr != NULL);
-}
-CFWL_Widget::~CFWL_Widget() {
-  delete m_pProperties;
-  if (m_pIface) {
-    m_pIface->Finalize();
-    delete m_pIface;
-  }
-}
-FWL_ERR CFWL_Widget::Repaint(const CFX_RectF* pRect) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  CFX_RectF rect;
-  if (pRect) {
-    rect = *pRect;
-  } else {
-    m_pIface->GetWidgetRect(rect);
-    rect.left = rect.top = 0;
-  }
-  return m_pWidgetMgr->RepaintWidget(m_pIface, &rect);
-}
-FWL_ERR CFWL_Widget::SetFocus(FX_BOOL bFocus) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
-  if (!pThread)
-    return FWL_ERR_Indefinite;
-  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
-  if (!pDriver)
-    return FWL_ERR_Indefinite;
-  if (bFocus) {
-    pDriver->SetFocus(m_pIface);
-  } else {
-    if (pDriver->GetFocus() == m_pIface) {
-      pDriver->SetFocus(NULL);
-    }
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_Widget::SetGrab(FX_BOOL bSet) {
-  if (!m_pIface)
-    return FWL_ERR_Indefinite;
-  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
-  if (!pThread)
-    return FWL_ERR_Indefinite;
-  IFWL_NoteDriver* pDriver = pThread->GetNoteDriver();
-  if (!pDriver)
-    return FWL_ERR_Indefinite;
-  pDriver->SetGrab(m_pIface, bSet);
-  return FWL_ERR_Succeeded;
-}
-void CFWL_Widget::RegisterEventTarget(CFWL_Widget* pEventSource,
-                                      FX_DWORD dwFilter) {
-  if (!m_pIface)
-    return;
-  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
-  if (!pNoteDriver)
-    return;
-  IFWL_Widget* pEventSourceImp =
-      !pEventSource ? NULL : pEventSource->GetWidget();
-  pNoteDriver->RegisterEventTarget(GetWidget(), pEventSourceImp, dwFilter);
-}
-void CFWL_Widget::DispatchEvent(CFWL_Event* pEvent) {
-  if (!m_pIface)
-    return;
-  if (m_pIface->GetOuter()) {
-    return;
-  }
-  IFWL_NoteThread* pThread = m_pIface->GetOwnerThread();
-  if (!pThread)
-    return;
-  IFWL_NoteDriver* pNoteDriver = pThread->GetNoteDriver();
-  if (!pNoteDriver)
-    return;
-  pNoteDriver->SendNote(pEvent);
-}
-#define FWL_WGT_CalcHeight 2048
-#define FWL_WGT_CalcWidth 2048
-#define FWL_WGT_CalcMultiLineDefWidth 120.0f
-CFX_SizeF CFWL_Widget::CalcTextSize(const CFX_WideString& wsText,
-                                    FX_BOOL bMultiLine,
-                                    int32_t iLineWidth) {
-  if (!m_pIface)
-    return CFX_SizeF();
-  IFWL_ThemeProvider* pTheme = m_pIface->GetThemeProvider();
-  if (!pTheme)
-    return CFX_SizeF();
-
-  CFWL_ThemeText calPart;
-  calPart.m_pWidget = m_pIface;
-  calPart.m_wsText = wsText;
-  calPart.m_dwTTOStyles =
-      bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;
-  calPart.m_iTTOAlign = FDE_TTOALIGNMENT_TopLeft;
-  CFX_RectF rect;
-  FX_FLOAT fWidth = bMultiLine
-                        ? (iLineWidth > 0 ? (FX_FLOAT)iLineWidth
-                                          : FWL_WGT_CalcMultiLineDefWidth)
-                        : FWL_WGT_CalcWidth;
-  rect.Set(0, 0, fWidth, FWL_WGT_CalcHeight);
-  pTheme->CalcTextRect(&calPart, rect);
-  return CFX_SizeF(rect.width, rect.height);
-}
-CFWL_WidgetDelegate::CFWL_WidgetDelegate() {}
-CFWL_WidgetDelegate::~CFWL_WidgetDelegate() {}
-int32_t CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  return 1;
-}
-FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                          const CFX_Matrix* pMatrix) {
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fwl/theme/checkboxtp.cpp b/xfa/src/fwl/theme/checkboxtp.cpp
deleted file mode 100644
index ccad2bc..0000000
--- a/xfa/src/fwl/theme/checkboxtp.cpp
+++ /dev/null
@@ -1,532 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/theme/checkboxtp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-
-#define CHECKBOX_SIZE_SIGNMARGIN 3
-#define CHECKBOX_SIZE_SIGNBORDER 2
-#define CHECKBOX_SIZE_SIGNPATH 100
-#define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153))
-#define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100))
-#define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226))
-#define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255))
-#define CHECKBOX_FXGE_CoordinatesAdjust
-
-CFWL_CheckBoxTP::CFWL_CheckBoxTP() : m_pCheckPath(NULL) {
-  m_pThemeData = new CKBThemeData;
-  SetThemeData(0);
-}
-CFWL_CheckBoxTP::~CFWL_CheckBoxTP() {
-  if (m_pThemeData) {
-    delete m_pThemeData;
-    m_pThemeData = NULL;
-  }
-  if (m_pCheckPath) {
-    m_pCheckPath->Clear();
-    delete m_pCheckPath;
-    m_pCheckPath = NULL;
-  }
-}
-FX_BOOL CFWL_CheckBoxTP::IsValidWidget(IFWL_Widget* pWidget) {
-  return pWidget && pWidget->GetClassID() == FWL_CLASSHASH_CheckBox;
-}
-FX_DWORD CFWL_CheckBoxTP::SetThemeID(IFWL_Widget* pWidget,
-                                     FX_DWORD dwThemeID,
-                                     FX_BOOL bChildren) {
-  if (m_pThemeData) {
-    SetThemeData(FWL_GetThemeColor(dwThemeID));
-  }
-  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
-}
-FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText* pParams) {
-  if (!m_pTextOut)
-    return FALSE;
-  m_pTextOut->SetTextColor((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) ==
-                                   FWL_PARTSTATE_CKB_Disabled
-                               ? FWLTHEME_CAPACITY_TextDisColor
-                               : FWLTHEME_CAPACITY_TextColor);
-  return CFWL_WidgetTP::DrawText(pParams);
-}
-FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (!pParams)
-    return FALSE;
-  switch (pParams->m_iPart) {
-    case FWL_PART_CKB_Border: {
-      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_CKB_Edge: {
-      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
-               &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_CKB_Background: {
-      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
-                     &pParams->m_matrix);
-      if (pParams->m_dwStates & FWL_PARTSTATE_CKB_Focused) {
-        pParams->m_rtPart = *(CFX_RectF*)pParams->m_pData;
-        DrawFocus(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
-      }
-      break;
-    }
-    case FWL_PART_CKB_CheckBox: {
-      DrawBoxBk(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
-                pParams->m_dwStates, &pParams->m_matrix);
-      if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-           FWL_PARTSTATE_CKB_Checked) |
-          ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-           FWL_PARTSTATE_CKB_Neutral)) {
-        DrawSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
-                 pParams->m_dwStates, &pParams->m_matrix);
-      }
-      FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) ==
-                         FWL_PARTSTATE_CKB_Disabled;
-      DrawSignBorder(pParams->m_pWidget, pParams->m_pGraphics,
-                     &pParams->m_rtPart, bDisable, &pParams->m_matrix);
-      break;
-    }
-    default: { return FALSE; }
-  }
-  return TRUE;
-}
-FWL_ERR CFWL_CheckBoxTP::Initialize() {
-  InitTTO();
-  return CFWL_WidgetTP::Initialize();
-}
-FWL_ERR CFWL_CheckBoxTP::Finalize() {
-  FinalizeTTO();
-  return CFWL_WidgetTP::Finalize();
-}
-void CFWL_CheckBoxTP::DrawBoxBk(IFWL_Widget* pWidget,
-                                CFX_Graphics* pGraphics,
-                                const CFX_RectF* pRect,
-                                FX_DWORD dwStates,
-                                CFX_Matrix* pMatrix) {
-  dwStates &= 0x03;
-  int32_t fillMode = FXFILL_WINDING;
-  FX_DWORD dwStyleEx = pWidget->GetStylesEx();
-  dwStyleEx &= FWL_STYLEEXT_CKB_ShapeMask;
-  CFX_Path path;
-  path.Create();
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  FX_BOOL bClipSign =
-      (dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered;
-  if ((dwStyleEx == FWL_STYLEEXT_CKB_ShapeSolidSquare) ||
-      (dwStyleEx == FWL_STYLEEXT_CKB_ShapeSunkenSquare)) {
-    path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-    if (bClipSign) {
-      fillMode = FXFILL_ALTERNATE;
-      path.AddRectangle(pRect->left + CHECKBOX_SIZE_SIGNMARGIN,
-                        pRect->top + CHECKBOX_SIZE_SIGNMARGIN,
-                        pRect->width - CHECKBOX_SIZE_SIGNMARGIN * 2,
-                        pRect->height - CHECKBOX_SIZE_SIGNMARGIN * 2);
-    }
-  } else {
-#ifdef CHECKBOX_FXGE_CoordinatesAdjust
-    CFX_RectF rect(*pRect);
-    rect.Deflate(0, 0, 1, 1);
-    path.AddEllipse(rect);
-#else
-    path.AddEllipse(*pRect);
-#endif
-    if (bClipSign) {
-      fillMode = FXFILL_ALTERNATE;
-#ifdef CHECKBOX_FXGE_CoordinatesAdjust
-      CFX_RectF rtClip(rect);
-#else
-      CFX_RectF rtClip(*pRect);
-#endif
-      rtClip.Deflate(CHECKBOX_SIZE_SIGNMARGIN - 1,
-                     CHECKBOX_SIZE_SIGNMARGIN - 1);
-      path.AddEllipse(rtClip);
-    }
-  }
-  int32_t iTheme = 1;
-  if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered) {
-    iTheme = 2;
-  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) ==
-             FWL_PARTSTATE_CKB_Pressed) {
-    iTheme = 3;
-  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) ==
-             FWL_PARTSTATE_CKB_Disabled) {
-    iTheme = 4;
-  }
-  if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) {
-    iTheme += 4;
-  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-             FWL_PARTSTATE_CKB_Neutral) {
-    iTheme += 8;
-  }
-  DrawAxialShading(pGraphics, pRect->left - 1, pRect->top - 1, fRight, fBottom,
-                   m_pThemeData->clrBoxBk[iTheme][0],
-                   m_pThemeData->clrBoxBk[iTheme][1], &path, fillMode, pMatrix);
-}
-void CFWL_CheckBoxTP::DrawSign(IFWL_Widget* pWidget,
-                               CFX_Graphics* pGraphics,
-                               const CFX_RectF* pRtBox,
-                               FX_DWORD dwStates,
-                               CFX_Matrix* pMatrix) {
-  CFX_RectF rtSign(*pRtBox);
-  rtSign.Deflate(CHECKBOX_SIZE_SIGNMARGIN, CHECKBOX_SIZE_SIGNMARGIN);
-  FX_DWORD dwColor = m_pThemeData->clrSignCheck;
-  FX_BOOL bCheck = TRUE;
-  if (((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled) &&
-      ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked)) {
-    dwColor = m_pThemeData->clrSignBorderDisable;
-  } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-             FWL_PARTSTATE_CKB_Neutral) {
-    switch (dwStates & FWL_PARTSTATE_CKB_Mask1) {
-      case FWL_PARTSTATE_CKB_Normal: {
-        bCheck = FALSE;
-        dwColor = m_pThemeData->clrSignNeutralNormal;
-        break;
-      }
-      case FWL_PARTSTATE_CKB_Hovered: {
-        bCheck = FALSE;
-        dwColor = m_pThemeData->clrSignNeutralHover;
-        break;
-      }
-      case FWL_PARTSTATE_CKB_Pressed: {
-        bCheck = FALSE, dwColor = m_pThemeData->clrSignNeutralPressed;
-        break;
-      }
-      case FWL_PARTSTATE_CKB_Disabled: {
-        bCheck = FALSE, dwColor = m_pThemeData->clrSignBorderDisable;
-        break;
-      }
-    }
-  }
-  if (bCheck) {
-    FX_DWORD dwStyle = pWidget->GetStylesEx();
-    switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) {
-      case FWL_STYLEEXT_CKB_SignShapeCheck: {
-        DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-      case FWL_STYLEEXT_CKB_SignShapeCircle: {
-        rtSign.Deflate(1, 1);
-        DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-      case FWL_STYLEEXT_CKB_SignShapeCross: {
-        DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-      case FWL_STYLEEXT_CKB_SignShapeDiamond: {
-        DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-      case FWL_STYLEEXT_CKB_SignShapeSquare: {
-        DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-      case FWL_STYLEEXT_CKB_SignShapeStar: {
-        DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      }
-    }
-  } else {
-    FillSoildRect(pGraphics, ArgbEncode(255, 33, 161, 33), &rtSign, pMatrix);
-  }
-}
-void CFWL_CheckBoxTP::DrawSignNeutral(CFX_Graphics* pGraphics,
-                                      const CFX_RectF* pRtSign,
-                                      CFX_Matrix* pMatrix) {
-  ((CFX_RectF*)pRtSign)->Inflate(-3, -3);
-  FillSoildRect(pGraphics, m_pThemeData->clrSignNeutral, pRtSign, pMatrix);
-}
-void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics* pGraphics,
-                                    const CFX_RectF* pRtSign,
-                                    FX_ARGB argbFill,
-                                    CFX_Matrix* pMatrix) {
-  if (!m_pCheckPath) {
-    initCheckPath(pRtSign->width);
-  }
-  CFX_Matrix mt;
-  mt.SetIdentity();
-  mt.Translate(pRtSign->left, pRtSign->top);
-  mt.Concat(*pMatrix);
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(m_pCheckPath, FXFILL_WINDING, &mt);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignCircle(CFX_Graphics* pGraphics,
-                                     const CFX_RectF* pRtSign,
-                                     FX_ARGB argbFill,
-                                     CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  path.AddEllipse(*pRtSign);
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignCross(CFX_Graphics* pGraphics,
-                                    const CFX_RectF* pRtSign,
-                                    FX_ARGB argbFill,
-                                    CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  FX_FLOAT fRight = pRtSign->right();
-  FX_FLOAT fBottom = pRtSign->bottom();
-  path.AddLine(pRtSign->left, pRtSign->top, fRight, fBottom);
-  path.AddLine(pRtSign->left, fBottom, fRight, pRtSign->top);
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetStrokeColor(&crFill);
-  pGraphics->SetLineWidth(1.0f);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignDiamond(CFX_Graphics* pGraphics,
-                                      const CFX_RectF* pRtSign,
-                                      FX_ARGB argbFill,
-                                      CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  FX_FLOAT fWidth = pRtSign->width;
-  FX_FLOAT fHeight = pRtSign->height;
-  FX_FLOAT fBottom = pRtSign->bottom();
-  path.MoveTo(pRtSign->left + fWidth / 2, pRtSign->top);
-  path.LineTo(pRtSign->left, pRtSign->top + fHeight / 2);
-  path.LineTo(pRtSign->left + fWidth / 2, fBottom);
-  path.LineTo(pRtSign->right(), pRtSign->top + fHeight / 2);
-  path.LineTo(pRtSign->left + fWidth / 2, pRtSign->top);
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignSquare(CFX_Graphics* pGraphics,
-                                     const CFX_RectF* pRtSign,
-                                     FX_ARGB argbFill,
-                                     CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(pRtSign->left, pRtSign->top, pRtSign->width,
-                    pRtSign->height);
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignStar(CFX_Graphics* pGraphics,
-                                   const CFX_RectF* pRtSign,
-                                   FX_ARGB argbFill,
-                                   CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  FX_FLOAT fBottom = pRtSign->bottom();
-  FX_FLOAT fRadius =
-      (pRtSign->top - fBottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f));
-  CFX_PointF ptCenter((pRtSign->left + pRtSign->right()) / 2.0f,
-                      (pRtSign->top + fBottom) / 2.0f);
-  FX_FLOAT px[5], py[5];
-  FX_FLOAT fAngel = FX_PI / 10.0f;
-  for (int32_t i = 0; i < 5; i++) {
-    px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
-    py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
-    fAngel += FX_PI * 2 / 5.0f;
-  }
-  path.MoveTo(px[0], py[0]);
-  int32_t nNext = 0;
-  for (int32_t j = 0; j < 5; j++) {
-    nNext += 2;
-    if (nNext >= 5) {
-      nNext -= 5;
-    }
-    path.LineTo(px[nNext], py[nNext]);
-  }
-  CFX_Color crFill(argbFill);
-  pGraphics->SaveGraphState();
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_CheckBoxTP::DrawSignBorder(IFWL_Widget* pWidget,
-                                     CFX_Graphics* pGraphics,
-                                     const CFX_RectF* pRtBox,
-                                     FX_BOOL bDisable,
-                                     CFX_Matrix* pMatrix) {
-  switch (pWidget->GetStylesEx() & FWL_STYLEEXT_CKB_ShapeMask) {
-    case FWL_STYLEEXT_CKB_ShapeSolidSquare: {
-      DrawAnnulusRect(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable
-                                          : m_pThemeData->clrSignBorderNormal,
-                      pRtBox, 1, pMatrix);
-      break;
-    }
-    case FWL_STYLEEXT_CKB_ShapeSunkenSquare: {
-      Draw3DRect(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER,
-                 pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2,
-                 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix);
-      break;
-    }
-    case FWL_STYLEEXT_CKB_ShapeSolidCircle: {
-      DrawAnnulusCircle(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable
-                                            : m_pThemeData->clrSignBorderNormal,
-                        pRtBox, 1, pMatrix);
-      break;
-    }
-    case FWL_STYLEEXT_CKB_ShapeSunkenCircle: {
-      Draw3DCircle(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER,
-                   pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2,
-                   CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix);
-      break;
-    }
-  }
-}
-void CFWL_CheckBoxTP::SetThemeData(FX_DWORD dwID) {
-  FX_DWORD* pData = (FX_DWORD*)&m_pThemeData->clrBoxBk;
-  if (dwID) {
-    *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255);
-    m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 154, 167, 114);
-    m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187);
-    m_pThemeData->clrSignCheck = ArgbEncode(255, 164, 180, 138);
-    m_pThemeData->clrSignNeutral = ArgbEncode(2255, 28, 134, 26);
-    m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113);
-    m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33);
-    m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26);
-  } else {
-    *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 220, 220, 215),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 240, 207),
-    *pData++ = ArgbEncode(255, 248, 179, 48),
-    *pData++ = ArgbEncode(255, 176, 176, 167),
-    *pData++ = ArgbEncode(255, 241, 239, 239),
-    *pData++ = ArgbEncode(255, 255, 255, 255),
-    *pData++ = ArgbEncode(255, 255, 255, 255);
-    m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 28, 81, 128);
-    m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187);
-    m_pThemeData->clrSignCheck = ArgbEncode(255, 28, 81, 128);
-    m_pThemeData->clrSignNeutral = ArgbEncode(255, 28, 134, 26);
-    m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113);
-    m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33);
-    m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26);
-  }
-}
-void CFWL_CheckBoxTP::initCheckPath(FX_FLOAT fCheckLen) {
-  if (!m_pCheckPath) {
-    m_pCheckPath = new CFX_Path;
-    m_pCheckPath->Create();
-    FX_FLOAT fWidth = CHECKBOX_SIZE_SIGNPATH;
-    FX_FLOAT fHeight = -CHECKBOX_SIZE_SIGNPATH;
-    FX_FLOAT fBottom = CHECKBOX_SIZE_SIGNPATH;
-    CFX_PointF pt1(fWidth / 15.0f, fBottom + fHeight * 2 / 5.0f);
-    CFX_PointF pt2(fWidth / 4.5f, fBottom + fHeight / 16.0f);
-    CFX_PointF pt3(fWidth / 3.0f, fBottom);
-    CFX_PointF pt4(fWidth * 14 / 15.0f, fBottom + fHeight * 15 / 16.0f);
-    CFX_PointF pt5(fWidth / 3.6f, fBottom + fHeight / 3.5f);
-    CFX_PointF pt12(fWidth / 7.0f, fBottom + fHeight * 2 / 7.0f);
-    CFX_PointF pt21(fWidth / 5.0f, fBottom + fHeight / 5.0f);
-    CFX_PointF pt23(fWidth / 4.4f, fBottom + fHeight * 0 / 16.0f);
-    CFX_PointF pt32(fWidth / 4.0f, fBottom);
-    CFX_PointF pt34(fWidth * (1 / 7.0f + 7 / 15.0f),
-                    fBottom + fHeight * 4 / 5.0f);
-    CFX_PointF pt43(fWidth * (1 / 7.0f + 7 / 15.0f),
-                    fBottom + fHeight * 4 / 5.0f);
-    CFX_PointF pt45(fWidth * 7 / 15.0f, fBottom + fHeight * 8 / 7.0f);
-    CFX_PointF pt54(fWidth / 3.4f, fBottom + fHeight / 3.5f);
-    CFX_PointF pt51(fWidth / 3.6f, fBottom + fHeight / 4.0f);
-    CFX_PointF pt15(fWidth / 3.5f, fBottom + fHeight * 3.5f / 5.0f);
-    m_pCheckPath->MoveTo(pt1.x, pt1.y);
-    FX_FLOAT px1 = pt12.x - pt1.x;
-    FX_FLOAT py1 = pt12.y - pt1.y;
-    FX_FLOAT px2 = pt21.x - pt2.x;
-    FX_FLOAT py2 = pt21.y - pt2.y;
-    m_pCheckPath->BezierTo(pt1.x + px1 * FWLTHEME_BEZIER,
-                           pt1.y + py1 * FWLTHEME_BEZIER,
-                           pt2.x + px2 * FWLTHEME_BEZIER,
-                           pt2.y + py2 * FWLTHEME_BEZIER, pt2.x, pt2.y);
-    px1 = pt23.x - pt2.x;
-    py1 = pt23.y - pt2.y;
-    px2 = pt32.x - pt3.x;
-    py2 = pt32.y - pt3.y;
-    m_pCheckPath->BezierTo(pt2.x + px1 * FWLTHEME_BEZIER,
-                           pt2.y + py1 * FWLTHEME_BEZIER,
-                           pt3.x + px2 * FWLTHEME_BEZIER,
-                           pt3.y + py2 * FWLTHEME_BEZIER, pt3.x, pt3.y);
-    px1 = pt34.x - pt3.x;
-    py1 = pt34.y - pt3.y;
-    px2 = pt43.x - pt4.x;
-    py2 = pt43.y - pt4.y;
-    m_pCheckPath->BezierTo(pt3.x + px1 * FWLTHEME_BEZIER,
-                           pt3.y + py1 * FWLTHEME_BEZIER,
-                           pt4.x + px2 * FWLTHEME_BEZIER,
-                           pt4.y + py2 * FWLTHEME_BEZIER, pt4.x, pt4.y);
-    px1 = pt45.x - pt4.x;
-    py1 = pt45.y - pt4.y;
-    px2 = pt54.x - pt5.x;
-    py2 = pt54.y - pt5.y;
-    m_pCheckPath->BezierTo(pt4.x + px1 * FWLTHEME_BEZIER,
-                           pt4.y + py1 * FWLTHEME_BEZIER,
-                           pt5.x + px2 * FWLTHEME_BEZIER,
-                           pt5.y + py2 * FWLTHEME_BEZIER, pt5.x, pt5.y);
-    px1 = pt51.x - pt5.x;
-    py1 = pt51.y - pt5.y;
-    px2 = pt15.x - pt1.x;
-    py2 = pt15.y - pt1.y;
-    m_pCheckPath->BezierTo(pt5.x + px1 * FWLTHEME_BEZIER,
-                           pt5.y + py1 * FWLTHEME_BEZIER,
-                           pt1.x + px2 * FWLTHEME_BEZIER,
-                           pt1.y + py2 * FWLTHEME_BEZIER, pt1.x, pt1.y);
-    FX_FLOAT fScale = fCheckLen / CHECKBOX_SIZE_SIGNPATH;
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, 0, 0);
-    mt.Scale(fScale, fScale);
-    CFX_PathData* pData = m_pCheckPath->GetPathData();
-    pData->Transform(&mt);
-  }
-}
diff --git a/xfa/src/fwl/theme/formtp.cpp b/xfa/src/fwl/theme/formtp.cpp
deleted file mode 100644
index e8f3b6a..0000000
--- a/xfa/src/fwl/theme/formtp.cpp
+++ /dev/null
@@ -1,893 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/theme/formtp.h"
-
-#include "xfa/include/fwl/core/fwl_form.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-
-#define FWLTHEME_CAPACITY_CXFormBorder 3
-#define FWLTHEME_CAPACITY_CYFormBorder 3
-#define FWLTHEME_CAPACITY_CYNarrowCaption 18
-#define FWLTHEME_CAPACITY_CYCaption 29
-#define FWLTHEME_CAPACITY_BigIconSize 32
-#define FWLTHEME_CAPACITY_SmallIconSize 16
-#define FWLTHEME_CAPACITY_FormTextColor 0xFFFFFFFF
-#define FWLTHEME_FORMBTN_Margin 5
-#define FWLTHEME_FORMBTN_Span 2
-#define FWLTHEME_FORMBTN_Size 21
-
-CFWL_FormTP::CFWL_FormTP() : m_pActiveBitmap(NULL), m_pDeactivebitmap(NULL) {
-  m_pThemeData = new SBThemeData;
-  SetThemeData(0);
-  m_rtDisLBorder.Reset();
-  m_rtDisRBorder.Reset();
-  m_rtDisBBorder.Reset();
-  m_rtDisCaption.Reset();
-}
-CFWL_FormTP::~CFWL_FormTP() {
-  if (m_pThemeData) {
-    delete m_pThemeData;
-    m_pThemeData = NULL;
-  }
-}
-FWL_ERR CFWL_FormTP::Initialize() {
-  InitTTO();
-  InitCaption(TRUE);
-  InitCaption(FALSE);
-  return CFWL_WidgetTP::Initialize();
-}
-FWL_ERR CFWL_FormTP::Finalize() {
-  FinalizeTTO();
-  if (m_pActiveBitmap) {
-    delete m_pActiveBitmap;
-    m_pActiveBitmap = NULL;
-  }
-  if (m_pDeactivebitmap) {
-    delete m_pDeactivebitmap;
-    m_pDeactivebitmap = NULL;
-  }
-  return CFWL_WidgetTP::Finalize();
-}
-FX_BOOL CFWL_FormTP::IsValidWidget(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FALSE;
-  FX_DWORD dwHash = pWidget->GetClassID();
-  return dwHash == FWL_CLASSHASH_Form;
-}
-FX_DWORD CFWL_FormTP::SetThemeID(IFWL_Widget* pWidget,
-                                 FX_DWORD dwThemeID,
-                                 FX_BOOL bChildren) {
-  if (m_pThemeData) {
-    SetThemeData(FWL_GetThemeColor(dwThemeID));
-  }
-  InitCaption(TRUE);
-  InitCaption(FALSE);
-  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
-}
-FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (!pParams)
-    return FALSE;
-  int32_t iActive = 0;
-  if (pParams->m_dwStates & FWL_PARTSTATE_FRM_Inactive) {
-    iActive = 1;
-  }
-  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
-  switch (pParams->m_dwStates & 0x03) {
-    case FWL_PARTSTATE_FRM_Hover: {
-      eState = FWLTHEME_STATE_Hover;
-      break;
-    }
-    case FWL_PARTSTATE_FRM_Pressed: {
-      eState = FWLTHEME_STATE_Pressed;
-      break;
-    }
-    case FWL_PARTSTATE_FRM_Disabled: {
-      eState = FWLTHEME_STATE_Disabale;
-      break;
-    }
-    default: {}
-  }
-  switch (pParams->m_iPart) {
-    case FWL_PART_FRM_Border: {
-      DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                     &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_Edge: {
-      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
-               &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_FRM_Background: {
-      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
-                     &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_FRM_Caption: {
-      DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                  &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_NarrowCaption: {
-      DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                        &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_CloseBox: {
-      DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                   &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_MinimizeBox: {
-      DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                      &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_MaximizeBox: {
-      DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                      pParams->m_dwData, &pParams->m_matrix, iActive);
-      break;
-    }
-    case FWL_PART_FRM_Icon: {
-      DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart,
-                    eState, &pParams->m_matrix, iActive);
-      break;
-    }
-    default: {}
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText* pParams) {
-  if (!m_pTextOut)
-    return FALSE;
-  if (pParams->m_iPart == FWL_PART_FRM_Caption) {
-    m_pTextOut->SetTextColor(0xFFFFFFFF);
-  } else {
-    m_pTextOut->SetTextColor(0xFF000000);
-  }
-  return CFWL_WidgetTP::DrawText(pParams);
-}
-void* CFWL_FormTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                               FX_DWORD dwCapacity) {
-  FX_BOOL bDefPro = FALSE;
-  FX_BOOL bDwordVal = FALSE;
-  switch (dwCapacity) {
-    case FWL_WGTCAPACITY_CXBorder: {
-      m_fValue = FWLTHEME_CAPACITY_CXFormBorder;
-      break;
-    }
-    case FWL_WGTCAPACITY_CYBorder: {
-      m_fValue = FWLTHEME_CAPACITY_CYFormBorder;
-      break;
-    }
-    case FWL_WGTCAPACITY_FRM_CYCaption: {
-      m_fValue = FWLTHEME_CAPACITY_CYCaption;
-      break;
-    }
-    case FWL_WGTCAPACITY_FRM_CYNarrowCaption: {
-      m_fValue = FWLTHEME_CAPACITY_CYCaption;
-      break;
-    }
-    case FWL_WGTCAPACITY_TextColor: {
-      bDwordVal = TRUE;
-      m_dwValue = FWLTHEME_CAPACITY_FormTextColor;
-      break;
-    }
-    case FWL_WGTCAPACITY_FRM_BigIcon: {
-      m_fValue = FWLTHEME_CAPACITY_BigIconSize;
-      break;
-    }
-    case FWL_WGTCAPACITY_FRM_SmallIcon: {
-      m_fValue = FWLTHEME_CAPACITY_SmallIconSize;
-      break;
-    }
-    default: { bDefPro = TRUE; }
-  }
-  if (!bDefPro) {
-    if (bDwordVal) {
-      return &m_dwValue;
-    }
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-FWL_ERR CFWL_FormTP::GetPartRect(CFWL_ThemePart* pThemePart,
-                                 CFX_RectF& rtPart) {
-  switch (pThemePart->m_iPart) {
-    case FWL_PART_FRM_CloseBox: {
-      CalCloseBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case FWL_PART_FRM_MaximizeBox: {
-      CalMaxBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case FWL_PART_FRM_MinimizeBox: {
-      CalMinBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case FWL_PART_FRM_HeadText: {
-      CalCaption(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case FWL_PART_FRM_Icon: {
-      CalIcon(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    default: {}
-  }
-  return FWL_ERR_Succeeded;
-}
-void CFWL_FormTP::CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  FX_DWORD dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_CloseBox) {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
-             FWLTHEME_FORMBTN_Size);
-  } else {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  FX_DWORD dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_MaximizeBox) {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
-                 FWLTHEME_FORMBTN_Span * 2,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
-             FWLTHEME_FORMBTN_Size);
-  } else {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
-                 FWLTHEME_FORMBTN_Span * 2,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  FX_DWORD dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_MinimizeBox) {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
-                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
-             FWLTHEME_FORMBTN_Size);
-  } else {
-    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
-                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
-             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin,
-           rtWidget.top + FWLTHEME_FORMBTN_Margin - 2,
-           rtWidget.width - FWLTHEME_FORMBTN_Margin * 2,
-           FWLTHEME_FORMBTN_Size + 2 * FWLTHEME_FORMBTN_Margin + 4);
-}
-void CFWL_FormTP::CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect) {}
-void CFWL_FormTP::DrawFormBorder(CFX_Graphics* pGraphics,
-                                 const CFX_RectF* pRect,
-                                 FWLTHEME_STATE eState,
-                                 CFX_Matrix* pMatrix,
-                                 int32_t iActive) {
-  CFX_RectF rt;
-  rt.Set(pRect->left, pRect->top, 1, pRect->height);
-  FX_FLOAT fBottom, fRight;
-  fBottom = pRect->bottom();
-  fRight = pRect->right();
-  CFX_Path path;
-  path.Create();
-  CFX_Color clrLine;
-  path.Clear();
-  path.MoveTo(pRect->left, pRect->top);
-  path.LineTo(pRect->left, fBottom - 1);
-  path.LineTo(fRight - 1, fBottom - 1);
-  path.LineTo(fRight - 1, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][2];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 1, pRect->top);
-  path.LineTo(pRect->left + 1, fBottom - 2);
-  path.LineTo(fRight - 2, fBottom - 2);
-  path.LineTo(fRight - 2, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][1];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 2, pRect->top);
-  path.LineTo(pRect->left + 2, fBottom - 3);
-  path.LineTo(fRight - 3, fBottom - 3);
-  path.LineTo(fRight - 3, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][0];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 3, pRect->top);
-  path.LineTo(pRect->left + 3, fBottom - 4);
-  path.LineTo(fRight - 4, fBottom - 4);
-  path.LineTo(fRight - 4, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][4];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29);
-  m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4,
-                     pRect->height - 29);
-  m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4);
-  m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29);
-}
-void CFWL_FormTP::DrawCaption(CFX_Graphics* pGraphics,
-                              const CFX_RectF* pRect,
-                              FWLTHEME_STATE eState,
-                              CFX_Matrix* pMatrix,
-                              int32_t iActive) {
-  CFX_RectF rt;
-  FX_FLOAT fBottom, fRight;
-  fBottom = pRect->bottom();
-  fRight = pRect->right();
-  rt.Set(pRect->left, pRect->top, pRect->width, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt,
-                pMatrix);
-  rt.Offset(0, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt,
-                pMatrix);
-  rt.Offset(0, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt,
-                pMatrix);
-  rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt,
-                pMatrix);
-  rt.Offset(0, -1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt,
-                pMatrix);
-  rt.Set(pRect->left, pRect->top, 1, pRect->height);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt,
-                pMatrix);
-  rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt,
-                pMatrix);
-  rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt,
-                pMatrix);
-  rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt,
-                pMatrix);
-  rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt,
-                pMatrix);
-  rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt,
-                pMatrix);
-  CFX_RectF rect(*pRect);
-  rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5);
-  if (iActive == 0) {
-    pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix);
-  } else {
-    pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix);
-  }
-}
-void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics* pGraphics,
-                                    const CFX_RectF* pRect,
-                                    FWLTHEME_STATE eState,
-                                    CFX_Matrix* pMatrix,
-                                    int32_t iActive) {}
-void CFWL_FormTP::DrawCloseBox(CFX_Graphics* pGraphics,
-                               const CFX_RectF* pRect,
-                               FWLTHEME_STATE eState,
-                               CFX_Matrix* pMatrix,
-                               int32_t iActive) {
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  pGraphics->SaveGraphState();
-  CFX_RectF rt(*pRect);
-  pGraphics->SetLineWidth(1.0f);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
-  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
-  CFX_Color crFill;
-  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
-  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
-  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
-  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
-  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
-  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
-  crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
-  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
-  crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
-  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
-                   fBottom - 2,
-                   m_pThemeData->clrCloseBtBKStart[iActive][eState - 1],
-                   m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], &path,
-                   FXFILL_WINDING, pMatrix);
-  CFX_RectF rtX(*pRect);
-  rtX.Inflate(-5, -5);
-  path.Clear();
-  FX_FLOAT frtXRight = rtX.right();
-  FX_FLOAT frtXBottom = rtX.bottom();
-  path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom);
-  path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom);
-  path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1);
-  path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top);
-  path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top);
-  path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1);
-  CFX_Color clrLine(0xffffffff);
-  pGraphics->SetLineWidth(1.0f);
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
-                                      const CFX_RectF* pRect,
-                                      FWLTHEME_STATE eState,
-                                      CFX_Matrix* pMatrix,
-                                      int32_t iActive) {
-  pGraphics->SaveGraphState();
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  CFX_RectF rt(*pRect);
-  pGraphics->SetLineWidth(1.0f);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
-  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
-  CFX_Color crFill;
-  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
-  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
-  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
-  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
-  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
-  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
-  crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
-  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
-  crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-  path.Clear();
-  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
-  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
-                   fBottom - 2,
-                   m_pThemeData->clrNormalBtBKStart[iActive][eState - 1],
-                   m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], &path,
-                   FXFILL_WINDING, pMatrix);
-}
-void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics* pGraphics,
-                                  const CFX_RectF* pRect,
-                                  FWLTHEME_STATE eState,
-                                  CFX_Matrix* pMatrix,
-                                  int32_t iActive) {
-  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
-  CFX_RectF rtMin;
-  rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14,
-            pRect->height - 18);
-  FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix);
-}
-void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics* pGraphics,
-                                  const CFX_RectF* pRect,
-                                  FWLTHEME_STATE eState,
-                                  FX_BOOL bMax,
-                                  CFX_Matrix* pMatrix,
-                                  int32_t iActive) {
-  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  if (bMax) {
-    CFX_Path path;
-    path.Create();
-    path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14,
-                 pRect->top + 6);
-    path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11,
-                 pRect->top + 9);
-    pGraphics->SaveGraphState();
-    pGraphics->SetLineWidth(2);
-    CFX_Color crStroke(0xFFFFFFFF);
-    pGraphics->SetStrokeColor(&crStroke);
-    pGraphics->StrokePath(&path, pMatrix);
-    pGraphics->SetLineWidth(1);
-    path.Clear();
-    path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13,
-                 pRect->top + 11);
-    path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12,
-                 pRect->top + 11);
-    pGraphics->StrokePath(&path, pMatrix);
-    pGraphics->RestoreGraphState();
-  } else {
-    CFX_RectF rtMax(*pRect);
-    rtMax.Inflate(-5, -5);
-    CFX_Path path;
-    path.Create();
-    path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10,
-                      fHeight - 10);
-    path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12,
-                      fHeight - 14);
-    pGraphics->SaveGraphState();
-    CFX_Color crFill(0xFFFFFFFF);
-    pGraphics->SetFillColor(&crFill);
-    pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-    pGraphics->RestoreGraphState();
-  }
-}
-void CFWL_FormTP::DrawIconImage(CFX_Graphics* pGraphics,
-                                CFX_DIBitmap* pDIBitmap,
-                                const CFX_RectF* pRect,
-                                FWLTHEME_STATE eState,
-                                CFX_Matrix* pMatrix,
-                                int32_t iActive) {
-  pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix);
-}
-void CFWL_FormTP::SetThemeData(FX_DWORD dwID) {
-  m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255);
-  m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148);
-  m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5);
-  m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176);
-  m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71);
-  m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20);
-  m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33);
-  m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107);
-  m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54);
-  m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74);
-  m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51);
-  m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28);
-  m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13);
-  if (dwID) {
-    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131);
-    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128);
-    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94);
-    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133);
-    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125);
-    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103);
-    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79);
-    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201);
-    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133);
-    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121);
-    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103);
-    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162);
-    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84);
-    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208);
-    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112);
-    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190);
-    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88);
-    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137);
-    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83);
-    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123);
-    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
-    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
-    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94);
-    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133);
-    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127);
-    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133);
-  } else {
-    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226);
-    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226);
-    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200);
-    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220);
-    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210);
-    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234);
-    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193);
-    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139);
-    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238);
-    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255);
-    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252);
-    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255);
-    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207);
-    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112);
-    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188);
-    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250);
-    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248);
-    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255);
-    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255);
-    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245);
-    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187);
-    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245);
-    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195);
-    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244);
-    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185);
-    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
-    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
-    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241);
-    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220);
-    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160);
-    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140);
-    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239);
-  }
-  m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0];
-  m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0];
-  m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1];
-  m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1];
-  m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2];
-  m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2];
-  m_pThemeData->clrCloseBtEdgeLight[1][0] =
-      m_pThemeData->clrCloseBtEdgeLight[0][0];
-  m_pThemeData->clrCloseBtEdgeDark[1][0] =
-      m_pThemeData->clrCloseBtEdgeDark[0][0];
-  m_pThemeData->clrCloseBtEdgeLight[1][1] =
-      m_pThemeData->clrCloseBtEdgeLight[0][1];
-  m_pThemeData->clrCloseBtEdgeDark[1][1] =
-      m_pThemeData->clrCloseBtEdgeDark[0][1];
-  m_pThemeData->clrCloseBtEdgeLight[1][2] =
-      m_pThemeData->clrCloseBtEdgeLight[0][2];
-  m_pThemeData->clrCloseBtEdgeDark[1][2] =
-      m_pThemeData->clrCloseBtEdgeDark[0][2];
-  m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0];
-  m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1];
-  m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2];
-  m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3];
-  m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2];
-  m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1];
-  m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0];
-  m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0];
-  m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1];
-  m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2];
-  m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0];
-  m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1];
-  m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2];
-  m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0];
-  m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1];
-  m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2];
-  m_pThemeData->clrNormalBtBKStart[1][2] =
-      m_pThemeData->clrNormalBtBKStart[0][2];
-  m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2];
-  m_pThemeData->clrNormalBtBKStart[1][0] =
-      m_pThemeData->clrNormalBtBKStart[0][0];
-  m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0];
-  m_pThemeData->clrNormalBtBKStart[1][1] =
-      m_pThemeData->clrNormalBtBKStart[0][1];
-  m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1];
-  m_pThemeData->clrNormalBtEdgeLight[1][0] =
-      m_pThemeData->clrNormalBtEdgeLight[0][0];
-  m_pThemeData->clrNormalBtEdgeDark[1][0] =
-      m_pThemeData->clrNormalBtEdgeDark[0][0];
-  m_pThemeData->clrNormalBtEdgeLight[1][1] =
-      m_pThemeData->clrNormalBtEdgeLight[0][1];
-  m_pThemeData->clrNormalBtEdgeDark[1][1] =
-      m_pThemeData->clrNormalBtEdgeDark[0][1];
-  m_pThemeData->clrNormalBtEdgeLight[1][2] =
-      m_pThemeData->clrNormalBtEdgeLight[0][2];
-  m_pThemeData->clrNormalBtEdgeDark[1][2] =
-      m_pThemeData->clrNormalBtEdgeDark[0][2];
-  m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0];
-  m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1];
-  m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2];
-  m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0];
-  m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0];
-  m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1];
-  m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2];
-  m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3];
-  m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4];
-  m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0];
-  DeactiveForm();
-}
-void CFWL_FormTP::DeactiveForm() {
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][3]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][4]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorderLight[1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][2]);
-}
-void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack) {
-  int32_t iAlfaF, iRF, iGF, iBF;
-  int32_t iAlfaB, iRB, iGB, iBB;
-  ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF);
-  ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB);
-  clrBack = ArgbEncode(0xff, iRB + (iRF - iRB) * iAlfaF / 255,
-                       iGB + (iGF - iGB) * iAlfaF / 255,
-                       iBB + (iBF - iBB) * iAlfaF / 255);
-}
-void CFWL_FormTP::InitCaption(FX_BOOL bActive) {
-  if (bActive) {
-    CFX_FxgeDevice dev;
-    CFX_Graphics gs;
-    CFX_Path path;
-    path.Create();
-    if (m_pActiveBitmap) {
-      delete m_pActiveBitmap;
-      m_pActiveBitmap = NULL;
-    }
-    m_pActiveBitmap = new CFX_DIBitmap;
-    m_pActiveBitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
-    dev.Attach(m_pActiveBitmap);
-    gs.Create(&dev);
-    path.AddRectangle(0, 0, 1, 5);
-    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0],
-                     m_pThemeData->clrHeadBK[0][1], &path);
-    path.Clear();
-    path.AddRectangle(0, 5, 1, 15);
-    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1],
-                     m_pThemeData->clrHeadBK[0][2], &path);
-    path.Clear();
-    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
-    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
-                     m_pThemeData->clrHeadBK[0][2],
-                     m_pThemeData->clrHeadBK[0][3], &path);
-  } else {
-    CFX_FxgeDevice dev;
-    CFX_Graphics gs;
-    CFX_Path path;
-    path.Create();
-    if (m_pDeactivebitmap) {
-      delete m_pDeactivebitmap;
-      m_pDeactivebitmap = NULL;
-    }
-    m_pDeactivebitmap = new CFX_DIBitmap;
-    m_pDeactivebitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
-    dev.Attach(m_pDeactivebitmap);
-    gs.Create(&dev);
-    path.AddRectangle(0, 0, 1, 5);
-    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0],
-                     m_pThemeData->clrHeadBK[1][1], &path);
-    path.Clear();
-    path.AddRectangle(0, 5, 1, 15);
-    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1],
-                     m_pThemeData->clrHeadBK[1][2], &path);
-    path.Clear();
-    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
-    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
-                     m_pThemeData->clrHeadBK[1][2],
-                     m_pThemeData->clrHeadBK[1][3], &path);
-  }
-}
diff --git a/xfa/src/fwl/theme/monthcalendartp.cpp b/xfa/src/fwl/theme/monthcalendartp.cpp
deleted file mode 100644
index 0dea73f..0000000
--- a/xfa/src/fwl/theme/monthcalendartp.cpp
+++ /dev/null
@@ -1,582 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/theme/monthcalendartp.h"
-
-#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-
-#define FWL_THEMECAPACITY_MC_HEADER_WIDTH 200
-#define FWL_THEMECAPACITY_MC_HEADER_HEIGHT 30
-#define FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH 18
-#define FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT 16
-#define FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN 5
-#define FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN \
-  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -         \
-   FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT) /    \
-      2
-#define FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT 100
-#define FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT 20
-#define FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN \
-  (FWL_THEMECAPACITY_MC_HEADER_WIDTH -           \
-   FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT) /      \
-      2
-#define FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN \
-  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -          \
-   FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT) /     \
-      2
-#define FWL_THEMECAPACITY_MC_HSEP_WIDTH (FWL_THEMECAPACITY_MC_WEEK_WIDTH - 10)
-#define FWL_THEMECAPACITY_MC_HSEP_HEIGHT 1
-#define FWL_THEMECAPACITY_MC_VSEP_WIDTH 1
-#define FWL_THEMECAPACITY_MC_VSEP_HEIGHT FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT
-#define FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH 26
-#define FWL_THEMECAPACITY_MC_SEP_DOFFSET -4
-#define FWL_THEMECAPACITY_MC_SEP_X 3
-#define FWL_THEMECAPACITY_MC_SEP_Y                                         \
-  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT + FWL_THEMECAPACITY_MC_WEEK_HEIGHT + \
-   FWL_THEMECAPACITY_MC_SEP_DOFFSET)
-#define FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT \
-  (6 * FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT)
-#define FWL_THEMECAPACITY_MC_WEEK_WIDTH \
-  (FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH * 7)
-#define FWL_THEMECAPACITY_MC_WEEK_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
-#define FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH \
-  (FWL_THEMECAPACITY_MC_HEADER_WIDTH / 7)
-#define FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT 16
-#define FWL_THEMECAPACITY_MC_TODAY_WIDHT FWL_THEMECAPACITY_MC_HEADER_WIDTH
-#define FWL_THEMECAPACITY_MC_TODAY_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
-#define FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT \
-  FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH
-#define FWL_MC_WIDTH 200
-#define FWL_MC_HEIGHT 160
-
-CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() {
-  m_pThemeData = new MCThemeData;
-  SetThemeData(0);
-}
-CFWL_MonthCalendarTP::~CFWL_MonthCalendarTP() {
-  delete m_pThemeData;
-}
-FX_BOOL CFWL_MonthCalendarTP::IsValidWidget(IFWL_Widget* pWidget) {
-  if (!pWidget)
-    return FALSE;
-  return pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar;
-}
-FX_DWORD CFWL_MonthCalendarTP::SetThemeID(IFWL_Widget* pWidget,
-                                          FX_DWORD dwThemeID,
-                                          FX_BOOL bChildren) {
-  if (m_pThemeData) {
-    SetThemeData(FWL_GetThemeColor(dwThemeID));
-  }
-  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (!pParams)
-    return FALSE;
-  switch (pParams->m_iPart) {
-    case FWL_PART_MCD_Border: {
-      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_Edge: {
-      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
-               &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_Background: {
-      DrawTotalBK(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_Header: {
-      DrawHeadBk(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_LBtn: {
-#ifdef THEME_XPSimilar
-      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
-      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
-                   FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix);
-#else
-      DrawLButton(pParams, &pParams->m_matrix);
-#endif
-      break;
-    }
-    case FWL_PART_MCD_RBtn: {
-#ifdef THEME_XPSimilar
-      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
-      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
-                   FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix);
-#else
-      DrawRButton(pParams, &pParams->m_matrix);
-#endif
-      break;
-    }
-    case FWL_PART_MCD_HSeparator: {
-      DrawHSeperator(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_DatesIn: {
-      DrawDatesInBK(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_TodayCircle: {
-      DrawTodayCircle(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_DateInCircle: {
-      DrawDatesInCircle(pParams, &pParams->m_matrix);
-      break;
-    }
-    case FWL_PART_MCD_WeekNumSep: {
-      DrawWeekNumSep(pParams, &pParams->m_matrix);
-      break;
-    }
-    default: {}
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawText(CFWL_ThemeText* pParams) {
-  if (!m_pTextOut)
-    return FALSE;
-  if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) &&
-      !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
-      (pParams->m_dwStates &
-       (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) {
-    m_pTextOut->SetTextColor(0xFFFFFFFF);
-  } else if (pParams->m_iPart == FWL_PART_MCD_Caption) {
-    m_pTextOut->SetTextColor(m_pThemeData->clrCaption);
-  } else {
-    m_pTextOut->SetTextColor(0xFF000000);
-  }
-  return CFWL_WidgetTP::DrawText(pParams);
-}
-void* CFWL_MonthCalendarTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                        FX_DWORD dwCapacity) {
-  FX_BOOL bDefPro = FALSE;
-  FX_BOOL bDwordVal = FALSE;
-  switch (dwCapacity) {
-    case FWL_WGTCAPACITY_MC_HEADER_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_Height: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN: {
-      bDwordVal = TRUE;
-      m_dwValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN: {
-      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HSEP_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_HSEP_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HSEP_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_HSEP_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_VSEP_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_VSEP_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_VSEP_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_VSEP_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_WEEK_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_WEEK_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_WEEK_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_WEEK_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_SEP_DOFFSET: {
-      m_fValue = FWL_THEMECAPACITY_MC_SEP_DOFFSET;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_SEP_X: {
-      m_fValue = FWL_THEMECAPACITY_MC_SEP_X;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_SEP_Y: {
-      m_fValue = FWL_THEMECAPACITY_MC_SEP_Y;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH: {
-      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_TODAY_WIDHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_TODAY_WIDHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_TODAY_HEIGHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_TODAY_HEIGHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT: {
-      m_fValue = FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_WIDTH: {
-      m_fValue = FWL_MC_WIDTH;
-      break;
-    }
-    case FWL_WGTCAPACITY_MC_HEIGHT: {
-      m_fValue = FWL_MC_HEIGHT;
-      break;
-    }
-    case FWL_MCCAPACITY_Sun: {
-      wsResource = L"Sun";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Mon: {
-      wsResource = L"Mon";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Tue: {
-      wsResource = L"Tue";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Wed: {
-      wsResource = L"Wed";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Thu: {
-      wsResource = L"Thu";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Fri: {
-      wsResource = L"Fri";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Sat: {
-      wsResource = L"Sat";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_January: {
-      wsResource = L"January";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_February: {
-      wsResource = L"February";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_March: {
-      wsResource = L"March";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_April: {
-      wsResource = L"April";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_May: {
-      wsResource = L"May";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_June: {
-      wsResource = L"June";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_July: {
-      wsResource = L"July";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_August: {
-      wsResource = L"August";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_September: {
-      wsResource = L"September";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_October: {
-      wsResource = L"October";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_November: {
-      wsResource = L"November";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_December: {
-      wsResource = L"December";
-      return &wsResource;
-    }
-    case FWL_MCCAPACITY_Today: {
-      wsResource = L"Today";
-      return &wsResource;
-    }
-    default: { bDefPro = TRUE; }
-  }
-  if (!bDefPro) {
-    if (bDwordVal) {
-      return &m_dwValue;
-    }
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-FWL_ERR CFWL_MonthCalendarTP::Initialize() {
-  InitTTO();
-  return CFWL_WidgetTP::Initialize();
-}
-FWL_ERR CFWL_MonthCalendarTP::Finalize() {
-  FinalizeTTO();
-  return CFWL_WidgetTP::Finalize();
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground* pParams,
-                                          CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtTotal(pParams->m_rtPart);
-  path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrBK(m_pThemeData->clrBK);
-  pParams->m_pGraphics->SetFillColor(&clrBK);
-  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground* pParams,
-                                         CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtHead = pParams->m_rtPart;
-  path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrHeadBK(m_pThemeData->clrBK);
-  pParams->m_pGraphics->SetFillColor(&clrHeadBK);
-  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground* pParams,
-                                          CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtLBtn;
-  rtLBtn = pParams->m_rtPart;
-  path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrLBtnEdge(ArgbEncode(0xff, 205, 219, 243));
-  pParams->m_pGraphics->SetStrokeColor(&clrLBtnEdge);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
-      FWL_PARTSTATE_MCD_Pressed) {
-    CFX_Color clrLBtnFill(ArgbEncode(0xff, 174, 198, 242));
-    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  } else {
-    CFX_Color clrLBtnFill(ArgbEncode(0xff, 227, 235, 249));
-    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  }
-  path.Clear();
-  path.MoveTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
-              rtLBtn.top + rtLBtn.height / 4);
-  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3, rtLBtn.top + rtLBtn.height / 2);
-  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
-              rtLBtn.bottom() - rtLBtn.height / 4);
-  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
-  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground* pParams,
-                                          CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtRBtn;
-  rtRBtn = pParams->m_rtPart;
-  path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrRBtnEdge(ArgbEncode(0xff, 205, 219, 243));
-  pParams->m_pGraphics->SetStrokeColor(&clrRBtnEdge);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
-      FWL_PARTSTATE_MCD_Pressed) {
-    CFX_Color clrRBtnFill(ArgbEncode(0xff, 174, 198, 242));
-    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  } else {
-    CFX_Color clrRBtnFill(ArgbEncode(0xff, 227, 235, 249));
-    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  }
-  path.Clear();
-  path.MoveTo(rtRBtn.left + rtRBtn.Width() / 3, rtRBtn.top + rtRBtn.height / 4);
-  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3 * 2,
-              rtRBtn.top + rtRBtn.height / 2);
-  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3,
-              rtRBtn.bottom() - rtRBtn.height / 4);
-  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
-  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground* pParams,
-                                             CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtHSep;
-  rtHSep = pParams->m_rtPart;
-  path.MoveTo(rtHSep.left, rtHSep.top + rtHSep.height / 2);
-  path.LineTo(rtHSep.right(), rtHSep.top + rtHSep.height / 2);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrHSep(m_pThemeData->clrSeperator);
-  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground* pParams,
-                                             CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtWeekSep;
-  rtWeekSep = pParams->m_rtPart;
-  path.MoveTo(rtWeekSep.left, rtWeekSep.top);
-  path.LineTo(rtWeekSep.left, rtWeekSep.bottom());
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrHSep(m_pThemeData->clrSeperator);
-  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawDatesInBK(CFWL_ThemeBackground* pParams,
-                                            CFX_Matrix* pMatrix) {
-  pParams->m_pGraphics->SaveGraphState();
-  if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Selected) {
-    CFX_Path path;
-    path.Create();
-    CFX_RectF rtSelDay;
-    rtSelDay = pParams->m_rtPart;
-    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
-                      rtSelDay.height);
-    CFX_Color clrSelDayBK;
-    clrSelDayBK = m_pThemeData->clrDatesSelectedBK;
-    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  } else if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Hovered) {
-    CFX_Path path;
-    path.Create();
-    CFX_RectF rtSelDay;
-    rtSelDay = pParams->m_rtPart;
-    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
-                      rtSelDay.height);
-    CFX_Color clrSelDayBK;
-    clrSelDayBK = m_pThemeData->clrDatesHoverBK;
-    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
-    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  }
-  pParams->m_pGraphics->RestoreGraphState();
-  return FALSE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground* pParams,
-                                                CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtSelDay;
-  rtSelDay = pParams->m_rtPart;
-  path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
-                    rtSelDay.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrSelDayBK;
-  clrSelDayBK = m_pThemeData->clrDatesCircle;
-  pParams->m_pGraphics->SetStrokeColor(&clrSelDayBK);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FX_BOOL CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground* pParams,
-                                              CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtTodayCircle;
-  rtTodayCircle = pParams->m_rtPart;
-  path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width,
-                    rtTodayCircle.height);
-  pParams->m_pGraphics->SaveGraphState();
-  CFX_Color clrTodayCircle;
-  clrTodayCircle = m_pThemeData->clrDatesCircle;
-  pParams->m_pGraphics->SetStrokeColor(&clrTodayCircle);
-  pParams->m_pGraphics->StrokePath(&path, pMatrix);
-  pParams->m_pGraphics->RestoreGraphState();
-  return TRUE;
-}
-FWLTHEME_STATE CFWL_MonthCalendarTP::GetState(FX_DWORD dwFWLStates) {
-  if (dwFWLStates & FWL_PARTSTATE_MCD_Hovered) {
-    return FWLTHEME_STATE_Hover;
-  } else if (dwFWLStates & FWL_PARTSTATE_MCD_Pressed) {
-    return FWLTHEME_STATE_Pressed;
-  }
-  return FWLTHEME_STATE_Normal;
-}
-void CFWL_MonthCalendarTP::SetThemeData(FX_DWORD dwThemeID) {
-  if (dwThemeID == 0) {
-    m_pThemeData->clrCaption = ArgbEncode(0xff, 0, 153, 255);
-    m_pThemeData->clrSeperator = ArgbEncode(0xff, 141, 161, 239);
-    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 193, 211, 251);
-    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 173, 188, 239);
-    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 103, 144, 209);
-    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
-    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
-  } else {
-    m_pThemeData->clrCaption = ArgbEncode(0xff, 128, 128, 0);
-    m_pThemeData->clrSeperator = ArgbEncode(0xff, 128, 128, 64);
-    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 217, 220, 191);
-    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 204, 208, 183);
-    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 128, 128, 0);
-    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
-    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
-  }
-}
diff --git a/xfa/src/fwl/theme/widgettp.cpp b/xfa/src/fwl/theme/widgettp.cpp
deleted file mode 100644
index c26a62c..0000000
--- a/xfa/src/fwl/theme/widgettp.cpp
+++ /dev/null
@@ -1,840 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fwl/theme/widgettp.h"
-
-#include <algorithm>
-
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-
-static void FWL_SetChildThemeID(IFWL_Widget* pParent, FX_DWORD dwThemeID) {
-  IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
-  IFWL_Widget* pChild =
-      pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
-  while (pChild) {
-    IFWL_ThemeProvider* pTheme = pChild->GetThemeProvider();
-    if (pTheme) {
-      pTheme->SetThemeID(pChild, dwThemeID, FALSE);
-    }
-    FWL_SetChildThemeID(pChild, dwThemeID);
-    pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
-  }
-}
-FX_BOOL CFWL_WidgetTP::IsValidWidget(IFWL_Widget* pWidget) {
-  return FALSE;
-}
-FX_DWORD CFWL_WidgetTP::GetThemeID(IFWL_Widget* pWidget) {
-  return m_dwThemeID;
-}
-FX_DWORD CFWL_WidgetTP::SetThemeID(IFWL_Widget* pWidget,
-                                   FX_DWORD dwThemeID,
-                                   FX_BOOL bChildren) {
-  FX_DWORD dwOld = m_dwThemeID;
-  m_dwThemeID = dwThemeID;
-  if (CFWL_ArrowData::IsInstance()) {
-    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(dwThemeID));
-  }
-  if (bChildren) {
-    FWL_SetChildThemeID(pWidget, dwThemeID);
-  }
-  return dwOld;
-}
-FWL_ERR CFWL_WidgetTP::GetThemeMatrix(IFWL_Widget* pWidget,
-                                      CFX_Matrix& matrix) {
-  matrix.Set(_ctm.a, _ctm.b, _ctm.c, _ctm.d, _ctm.e, _ctm.f);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetTP::SetThemeMatrix(IFWL_Widget* pWidget,
-                                      const CFX_Matrix& matrix) {
-  _ctm.Set(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_WidgetTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetTP::DrawText(CFWL_ThemeText* pParams) {
-  if (!m_pTextOut) {
-    InitTTO();
-  }
-  int32_t iLen = pParams->m_wsText.GetLength();
-  if (iLen <= 0)
-    return FALSE;
-  CFX_Graphics* pGraphics = pParams->m_pGraphics;
-  m_pTextOut->SetRenderDevice(pGraphics->GetRenderDevice());
-  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
-  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-  CFX_Matrix* pMatrix = &pParams->m_matrix;
-  pMatrix->Concat(*pGraphics->GetMatrix());
-  m_pTextOut->SetMatrix(*pMatrix);
-  m_pTextOut->DrawLogicText(pParams->m_wsText, iLen, pParams->m_rtPart);
-  return TRUE;
-}
-void* CFWL_WidgetTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                                 FX_DWORD dwCapacity) {
-  switch (dwCapacity) {
-    case FWL_WGTCAPACITY_CXBorder: {
-      m_fValue = FWLTHEME_CAPACITY_CXBorder;
-      break;
-    }
-    case FWL_WGTCAPACITY_CYBorder: {
-      m_fValue = FWLTHEME_CAPACITY_CYBorder;
-      break;
-    }
-    case FWL_WGTCAPACITY_EdgeFlat: {
-      m_fValue = FWLTHEME_CAPACITY_EdgeFlat;
-      break;
-    }
-    case FWL_WGTCAPACITY_EdgeRaised: {
-      m_fValue = FWLTHEME_CAPACITY_EdgeRaised;
-      break;
-    }
-    case FWL_WGTCAPACITY_EdgeSunken: {
-      m_fValue = FWLTHEME_CAPACITY_EdgeSunken;
-      break;
-    }
-    case FWL_WGTCAPACITY_FontSize: {
-      m_fValue = FWLTHEME_CAPACITY_FontSize;
-      break;
-    }
-    case FWL_WGTCAPACITY_TextColor: {
-      m_dwValue = FWLTHEME_CAPACITY_TextColor;
-      return &m_dwValue;
-    }
-    case FWL_WGTCAPACITY_ScrollBarWidth: {
-      m_fValue = FWLTHEME_CAPACITY_ScrollBarWidth;
-      break;
-    }
-    case FWL_WGTCAPACITY_Font: {
-      return m_pFDEFont;
-    }
-    case FWL_WGTCAPACITY_TextSelColor: {
-      m_dwValue = (m_dwThemeID == 0) ? FWLTHEME_CAPACITY_TextSelColor
-                                     : FWLTHEME_COLOR_Green_BKSelected;
-      return &m_dwValue;
-    }
-    case FWL_WGTCAPACITY_LineHeight: {
-      m_fValue = FWLTHEME_CAPACITY_LineHeight;
-      break;
-    }
-    case FWL_WGTCAPACITY_UIMargin: {
-      m_rtMargin.Set(0, 0, 0, 0);
-      return &m_rtMargin;
-    }
-    default: { return NULL; }
-  }
-  return &m_fValue;
-}
-FX_BOOL CFWL_WidgetTP::IsCustomizedLayout(IFWL_Widget* pWidget) {
-  return FWL_GetThemeLayout(m_dwThemeID);
-}
-FWL_ERR CFWL_WidgetTP::GetPartRect(CFWL_ThemePart* pThemePart,
-                                   CFX_RectF& rect) {
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CFWL_WidgetTP::IsInPart(CFWL_ThemePart* pThemePart,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy) {
-  return TRUE;
-}
-FX_BOOL CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
-  if (!pParams)
-    return FALSE;
-  if (!m_pTextOut)
-    return FALSE;
-  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-  m_pTextOut->SetStyles(pParams->m_dwTTOStyles | FDE_TTOSTYLE_ArabicContext);
-  m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
-                            rect);
-  return TRUE;
-}
-FWL_ERR CFWL_WidgetTP::Initialize() {
-  m_dwThemeID = 0;
-  _ctm.SetIdentity();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetTP::Finalize() {
-  if (!m_pTextOut) {
-    FinalizeTTO();
-  }
-  return FWL_ERR_Succeeded;
-}
-CFWL_WidgetTP::~CFWL_WidgetTP() {}
-FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
-                               const FX_WCHAR* strFont,
-                               FX_FLOAT fFontSize,
-                               FX_ARGB rgbFont) {
-  if (!m_pTextOut) {
-    return FWL_ERR_Succeeded;
-  }
-  m_pFDEFont = CFWL_FontManager::GetInstance()->FindFont(strFont, 0, 0);
-  m_pTextOut->SetFont(m_pFDEFont);
-  m_pTextOut->SetFontSize(fFontSize);
-  m_pTextOut->SetTextColor(rgbFont);
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
-                               IFX_Font* pFont,
-                               FX_FLOAT fFontSize,
-                               FX_ARGB rgbFont) {
-  if (!m_pTextOut) {
-    return FWL_ERR_Succeeded;
-  }
-  m_pTextOut->SetFont(pFont);
-  m_pTextOut->SetFontSize(fFontSize);
-  m_pTextOut->SetTextColor(rgbFont);
-  return FWL_ERR_Succeeded;
-}
-IFX_Font* CFWL_WidgetTP::GetFont(IFWL_Widget* pWidget) {
-  return m_pFDEFont;
-}
-CFWL_WidgetTP::CFWL_WidgetTP()
-    : m_dwRefCount(1), m_pTextOut(NULL), m_pFDEFont(NULL), m_dwThemeID(0) {}
-FX_ERR CFWL_WidgetTP::InitTTO() {
-  if (m_pTextOut) {
-    return FWL_ERR_Succeeded;
-  }
-  m_pFDEFont =
-      CFWL_FontManager::GetInstance()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0);
-  m_pTextOut = IFDE_TextOut::Create();
-  m_pTextOut->SetFont(m_pFDEFont);
-  m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
-  m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
-  m_pTextOut->SetEllipsisString(L"...");
-  return FWL_ERR_Succeeded;
-}
-FX_ERR CFWL_WidgetTP::FinalizeTTO() {
-  if (m_pTextOut) {
-    m_pTextOut->Release();
-    m_pTextOut = NULL;
-  }
-  return FWL_ERR_Succeeded;
-}
-#ifdef THEME_XPSimilar
-void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
-                             FX_DWORD dwStyles,
-                             const CFX_RectF* pRect,
-                             CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  CFX_Color crStroke(FWL_GetThemeColor(m_dwThemeID) == 0
-                         ? ArgbEncode(255, 127, 157, 185)
-                         : FWLTHEME_COLOR_Green_BKSelected);
-  pGraphics->SetStrokeColor(&crStroke);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(pRect->left, pRect->top, pRect->width - 1,
-                    pRect->height - 1);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  crStroke = ArgbEncode(255, 255, 255, 255);
-  pGraphics->SetStrokeColor(&crStroke);
-  path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 3,
-                    pRect->height - 3);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-#else
-void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
-                             FX_DWORD dwStyles,
-                             const CFX_RectF* pRect,
-                             CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  FWLTHEME_EDGE eType;
-  FX_FLOAT fWidth;
-  switch (dwStyles & FWL_WGTSTYLE_EdgeMask) {
-    case FWL_WGTSTYLE_EdgeRaised: {
-      eType = FWLTHEME_EDGE_Raised, fWidth = FWLTHEME_CAPACITY_EdgeRaised;
-      break;
-    }
-    case FWL_WGTSTYLE_EdgeSunken: {
-      eType = FWLTHEME_EDGE_Sunken, fWidth = FWLTHEME_CAPACITY_EdgeSunken;
-      break;
-    }
-    case FWL_WGTSTYLE_EdgeFlat:
-    default: { return; }
-  }
-  Draw3DRect(pGraphics, eType, fWidth, pRect, FWLTHEME_COLOR_EDGELT1,
-             FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1,
-             FWLTHEME_COLOR_EDGERB2, pMatrix);
-}
-#endif
-void CFWL_WidgetTP::Draw3DRect(CFX_Graphics* pGraphics,
-                               FWLTHEME_EDGE eType,
-                               FX_FLOAT fWidth,
-                               const CFX_RectF* pRect,
-                               FX_ARGB cr1,
-                               FX_ARGB cr2,
-                               FX_ARGB cr3,
-                               FX_ARGB cr4,
-                               CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  if (eType == FWLTHEME_EDGE_Flat) {
-    CFX_Path path;
-    path.Create();
-    path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-    path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
-                      pRect->height - 2);
-    CFX_Color cr(ArgbEncode(255, 100, 100, 100));
-    pGraphics->SetFillColor(&cr);
-    pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-    path.Clear();
-    path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
-                      pRect->height - 2);
-    path.AddRectangle(pRect->left + 2, pRect->top + 2, pRect->width - 4,
-                      pRect->height - 4);
-    cr.Set(0xFFFFFFFF);
-    pGraphics->SetFillColor(&cr);
-    pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  } else {
-    FX_FLOAT fLeft = pRect->left;
-    FX_FLOAT fRight = pRect->right();
-    FX_FLOAT fTop = pRect->top;
-    FX_FLOAT fBottom = pRect->bottom();
-    FX_FLOAT fHalfWidth = fWidth / 2.0f;
-    CFX_Color crLT(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
-    pGraphics->SetFillColor(&crLT);
-    CFX_Path pathLT;
-    pathLT.Create();
-    pathLT.MoveTo(fLeft, fBottom - fHalfWidth);
-    pathLT.LineTo(fLeft, fTop);
-    pathLT.LineTo(fRight - fHalfWidth, fTop);
-    pathLT.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
-    pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
-    pathLT.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
-    pathLT.LineTo(fLeft, fBottom - fHalfWidth);
-    pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
-    crLT = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
-    pGraphics->SetFillColor(&crLT);
-    pathLT.Clear();
-    pathLT.MoveTo(fLeft + fHalfWidth, fBottom - fWidth);
-    pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
-    pathLT.LineTo(fRight - fWidth, fTop + fHalfWidth);
-    pathLT.LineTo(fRight - fWidth, fTop + fWidth);
-    pathLT.LineTo(fLeft + fWidth, fTop + fWidth);
-    pathLT.LineTo(fLeft + fWidth, fBottom - fWidth);
-    pathLT.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
-    pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
-    CFX_Color crRB(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
-    pGraphics->SetFillColor(&crRB);
-    CFX_Path pathRB;
-    pathRB.Create();
-    pathRB.MoveTo(fRight - fHalfWidth, fTop + fHalfWidth);
-    pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
-    pathRB.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
-    pathRB.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
-    pathRB.LineTo(fRight - fWidth, fBottom - fWidth);
-    pathRB.LineTo(fRight - fWidth, fTop + fHalfWidth);
-    pathRB.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
-    pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
-    crRB = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
-    pGraphics->SetFillColor(&crRB);
-    pathRB.Clear();
-    pathRB.MoveTo(fRight, fTop);
-    pathRB.LineTo(fRight, fBottom);
-    pathRB.LineTo(fLeft, fBottom);
-    pathRB.LineTo(fLeft, fBottom - fHalfWidth);
-    pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
-    pathRB.LineTo(fRight - fHalfWidth, fTop);
-    pathRB.LineTo(fRight, fTop);
-    pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
-  }
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::Draw3DCircle(CFX_Graphics* pGraphics,
-                                 FWLTHEME_EDGE eType,
-                                 FX_FLOAT fWidth,
-                                 const CFX_RectF* pRect,
-                                 FX_ARGB cr1,
-                                 FX_ARGB cr2,
-                                 FX_ARGB cr3,
-                                 FX_ARGB cr4,
-                                 CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  CFX_Path path;
-  path.Create();
-  path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
-              FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
-  CFX_Color crFill1(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
-  pGraphics->SetStrokeColor(&crFill1);
-  pGraphics->StrokePath(&path, pMatrix);
-  CFX_RectF rtInner(*pRect);
-  rtInner.Deflate(pRect->width / 4, pRect->height / 4);
-  path.Clear();
-  path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
-              FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
-  CFX_Color crFill2(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
-  pGraphics->SetStrokeColor(&crFill2);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
-              FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
-  CFX_Color crFill3(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
-  pGraphics->SetStrokeColor(&crFill3);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
-              FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
-  CFX_Color crFill4(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
-  pGraphics->SetStrokeColor(&crFill4);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawBorder(CFX_Graphics* pGraphics,
-                               const CFX_RectF* pRect,
-                               CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-  path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
-                    pRect->height - 2);
-  pGraphics->SaveGraphState();
-  CFX_Color crFill(ArgbEncode(255, 0, 0, 0));
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::FillBackground(CFX_Graphics* pGraphics,
-                                   const CFX_RectF* pRect,
-                                   CFX_Matrix* pMatrix) {
-  FillSoildRect(pGraphics, FWLTHEME_COLOR_Background, pRect, pMatrix);
-}
-void CFWL_WidgetTP::FillSoildRect(CFX_Graphics* pGraphics,
-                                  FX_ARGB fillColor,
-                                  const CFX_RectF* pRect,
-                                  CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  CFX_Color crFill(fillColor);
-  pGraphics->SetFillColor(&crFill);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawAxialShading(CFX_Graphics* pGraphics,
-                                     FX_FLOAT fx1,
-                                     FX_FLOAT fy1,
-                                     FX_FLOAT fx2,
-                                     FX_FLOAT fy2,
-                                     FX_ARGB beginColor,
-                                     FX_ARGB endColor,
-                                     CFX_Path* path,
-                                     int32_t fillMode,
-                                     CFX_Matrix* pMatrix) {
-  if (!pGraphics || !path)
-    return;
-
-  CFX_PointF begPoint(fx1, fy1);
-  CFX_PointF endPoint(fx2, fy2);
-  CFX_Shading shading;
-  shading.CreateAxial(begPoint, endPoint, FALSE, FALSE, beginColor, endColor);
-  pGraphics->SaveGraphState();
-  CFX_Color color1(&shading);
-  pGraphics->SetFillColor(&color1);
-  pGraphics->FillPath(path, fillMode, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawAnnulusRect(CFX_Graphics* pGraphics,
-                                    FX_ARGB fillColor,
-                                    const CFX_RectF* pRect,
-                                    FX_FLOAT fRingWidth,
-                                    CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  CFX_Color cr(fillColor);
-  pGraphics->SetFillColor(&cr);
-  CFX_Path path;
-  path.Create();
-  CFX_RectF rtInner(*pRect);
-  rtInner.Deflate(fRingWidth, fRingWidth);
-  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
-  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawAnnulusCircle(CFX_Graphics* pGraphics,
-                                      FX_ARGB fillColor,
-                                      const CFX_RectF* pRect,
-                                      FX_FLOAT fWidth,
-                                      CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  if (fWidth > pRect->width / 2) {
-    return;
-  }
-  pGraphics->SaveGraphState();
-  CFX_Color cr(fillColor);
-  pGraphics->SetFillColor(&cr);
-  CFX_Path path;
-  path.Create();
-  path.AddEllipse(*pRect);
-  CFX_RectF rtIn(*pRect);
-  rtIn.Inflate(-fWidth, -fWidth);
-  path.AddEllipse(rtIn);
-  pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawFocus(CFX_Graphics* pGraphics,
-                              const CFX_RectF* pRect,
-                              CFX_Matrix* pMatrix) {
-  if (!pGraphics)
-    return;
-  if (!pRect)
-    return;
-  pGraphics->SaveGraphState();
-  CFX_Color cr(0xFF000000);
-  pGraphics->SetStrokeColor(&cr);
-  FX_FLOAT DashPattern[2] = {1, 1};
-  pGraphics->SetLineDash(0.0f, DashPattern, 2);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-#define FWLTHEME_ARROW_Denominator 3
-void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
-                              const CFX_RectF* pRect,
-                              FWLTHEME_DIRECTION eDict,
-                              FX_ARGB argbFill,
-                              FX_BOOL bPressed,
-                              CFX_Matrix* pMatrix) {
-  CFX_RectF rtArrow(*pRect);
-  CFX_Path path;
-  path.Create();
-  FX_FLOAT fBtn =
-      std::min(pRect->width, pRect->height) / FWLTHEME_ARROW_Denominator;
-  rtArrow.left = pRect->left + (pRect->width - fBtn) / 2;
-  rtArrow.top = pRect->top + (pRect->height - fBtn) / 2;
-  rtArrow.width = fBtn;
-  rtArrow.height = fBtn;
-  if (bPressed) {
-    rtArrow.Offset(1, 1);
-  }
-  switch (eDict) {
-    case FWLTHEME_DIRECTION_Up: {
-      path.MoveTo(rtArrow.left, rtArrow.bottom());
-      path.LineTo(rtArrow.right(), rtArrow.bottom());
-      path.LineTo(rtArrow.left + fBtn / 2, rtArrow.top);
-      path.LineTo(rtArrow.left, rtArrow.bottom());
-      break;
-    }
-    case FWLTHEME_DIRECTION_Left: {
-      path.MoveTo(rtArrow.right(), rtArrow.top);
-      path.LineTo(rtArrow.right(), rtArrow.bottom());
-      path.LineTo(rtArrow.left, rtArrow.top + fBtn / 2);
-      path.LineTo(rtArrow.right(), rtArrow.top);
-      break;
-    }
-    case FWLTHEME_DIRECTION_Right: {
-      path.MoveTo(rtArrow.left, rtArrow.top);
-      path.LineTo(rtArrow.left, rtArrow.bottom());
-      path.LineTo(rtArrow.right(), rtArrow.top + fBtn / 2);
-      path.LineTo(rtArrow.left, rtArrow.top);
-      break;
-    }
-    case FWLTHEME_DIRECTION_Down:
-    default: {
-      path.MoveTo(rtArrow.left, rtArrow.top);
-      path.LineTo(rtArrow.right(), rtArrow.top);
-      path.LineTo(rtArrow.left + fBtn / 2, rtArrow.bottom());
-      path.LineTo(rtArrow.left, rtArrow.top);
-    }
-  }
-  pGraphics->SaveGraphState();
-  CFX_Color cr(argbFill);
-  pGraphics->SetFillColor(&cr);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
-                              const CFX_RectF* pRect,
-                              FWLTHEME_DIRECTION eDict,
-                              FX_ARGB argSign,
-                              CFX_Matrix* pMatrix) {
-  FX_BOOL bVert =
-      (eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down);
-  FX_FLOAT fLeft =
-      (FX_FLOAT)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5);
-  FX_FLOAT fTop =
-      (FX_FLOAT)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5);
-  CFX_Path path;
-  path.Create();
-  switch (eDict) {
-    case FWLTHEME_DIRECTION_Down: {
-      path.MoveTo(fLeft, fTop + 1);
-      path.LineTo(fLeft + 4, fTop + 5);
-      path.LineTo(fLeft + 8, fTop + 1);
-      path.LineTo(fLeft + 7, fTop);
-      path.LineTo(fLeft + 4, fTop + 3);
-      path.LineTo(fLeft + 1, fTop);
-      break;
-    }
-    case FWLTHEME_DIRECTION_Up: {
-      path.MoveTo(fLeft, fTop + 4);
-      path.LineTo(fLeft + 4, fTop);
-      path.LineTo(fLeft + 8, fTop + 4);
-      path.LineTo(fLeft + 7, fTop + 5);
-      path.LineTo(fLeft + 4, fTop + 2);
-      path.LineTo(fLeft + 1, fTop + 5);
-      break;
-    }
-    case FWLTHEME_DIRECTION_Right: {
-      path.MoveTo(fLeft + 1, fTop);
-      path.LineTo(fLeft + 5, fTop + 4);
-      path.LineTo(fLeft + 1, fTop + 8);
-      path.LineTo(fLeft, fTop + 7);
-      path.LineTo(fLeft + 3, fTop + 4);
-      path.LineTo(fLeft, fTop + 1);
-      break;
-    }
-    case FWLTHEME_DIRECTION_Left: {
-      path.MoveTo(fLeft, fTop + 4);
-      path.LineTo(fLeft + 4, fTop);
-      path.LineTo(fLeft + 5, fTop + 1);
-      path.LineTo(fLeft + 2, fTop + 4);
-      path.LineTo(fLeft + 5, fTop + 7);
-      path.LineTo(fLeft + 4, fTop + 8);
-      break;
-    }
-  }
-  CFX_Color cr(argSign);
-  pGraphics->SetFillColor(&cr);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-}
-void CFWL_WidgetTP::DrawBtn(CFX_Graphics* pGraphics,
-                            const CFX_RectF* pRect,
-                            FWLTHEME_STATE eState,
-                            CFX_Matrix* pMatrix) {
-  CFX_Path path;
-  path.Create();
-  if (!CFWL_ArrowData::IsInstance()) {
-    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
-  }
-  CFWL_ArrowData::CColorData* pColorData =
-      CFWL_ArrowData::GetInstance()->m_pColorData;
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
-  DrawAxialShading(pGraphics, pRect->left, pRect->top, fRight, fBottom,
-                   pColorData->clrStart[eState - 1],
-                   pColorData->clrEnd[eState - 1], &path, FXFILL_WINDING,
-                   pMatrix);
-  CFX_Color rcStroke;
-  rcStroke.Set(pColorData->clrBorder[eState - 1]);
-  pGraphics->SetStrokeColor(&rcStroke);
-  pGraphics->StrokePath(&path, pMatrix);
-}
-void CFWL_WidgetTP::DrawArrowBtn(CFX_Graphics* pGraphics,
-                                 const CFX_RectF* pRect,
-                                 FWLTHEME_DIRECTION eDict,
-                                 FWLTHEME_STATE eState,
-                                 CFX_Matrix* pMatrix) {
-  DrawBtn(pGraphics, pRect, eState, pMatrix);
-  if (!CFWL_ArrowData::IsInstance()) {
-    CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
-  }
-  CFWL_ArrowData::CColorData* pColorData =
-      CFWL_ArrowData::GetInstance()->m_pColorData;
-  DrawArrow(pGraphics, pRect, eDict, pColorData->clrSign[eState - 1], pMatrix);
-}
-FWLCOLOR CFWL_WidgetTP::BlendColor(FWLCOLOR srcColor,
-                                   FWLCOLOR renderColor,
-                                   uint8_t scale) {
-  FWLCOLOR dstColor;
-  uint8_t n = 255 - scale;
-  dstColor.a = (uint8_t)(
-      ((FX_WORD)srcColor.a * n + (FX_WORD)renderColor.a * scale) >> 8);
-  dstColor.r = (uint8_t)(
-      ((FX_WORD)srcColor.r * n + (FX_WORD)renderColor.r * scale) >> 8);
-  dstColor.g = (uint8_t)(
-      ((FX_WORD)srcColor.g * n + (FX_WORD)renderColor.g * scale) >> 8);
-  dstColor.b = (uint8_t)(
-      ((FX_WORD)srcColor.b * n + (FX_WORD)renderColor.b * scale) >> 8);
-  return dstColor;
-}
-CFWL_ArrowData::CFWL_ArrowData() : m_pColorData(NULL) {
-  SetColorData(0);
-}
-CFWL_FontData::CFWL_FontData()
-    : m_dwStyles(0),
-      m_dwCodePage(0),
-      m_pFont(0),
-      m_pFontMgr(NULL)
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      ,
-      m_pFontSource(NULL)
-#endif
-{
-}
-CFWL_FontData::~CFWL_FontData() {
-  if (m_pFont) {
-    m_pFont->Release();
-  }
-  if (m_pFontMgr) {
-    m_pFontMgr->Release();
-  }
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (m_pFontSource != NULL) {
-    m_pFontSource->Release();
-  }
-#endif
-}
-FX_BOOL CFWL_FontData::Equal(const CFX_WideStringC& wsFontFamily,
-                             FX_DWORD dwFontStyles,
-                             FX_WORD wCodePage) {
-  return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
-         m_dwCodePage == wCodePage;
-}
-FX_BOOL CFWL_FontData::LoadFont(const CFX_WideStringC& wsFontFamily,
-                                FX_DWORD dwFontStyles,
-                                FX_WORD dwCodePage) {
-  m_wsFamily = wsFontFamily;
-  m_dwStyles = dwFontStyles;
-  m_dwCodePage = dwCodePage;
-  if (!m_pFontMgr) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-    m_pFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
-#else
-    m_pFontSource = FX_CreateDefaultFontSourceEnum();
-    m_pFontMgr = IFX_FontMgr::Create(m_pFontSource);
-#endif
-  }
-  m_pFont = IFX_Font::LoadFont(wsFontFamily.GetPtr(), dwFontStyles, dwCodePage,
-                               m_pFontMgr);
-  return m_pFont != NULL;
-}
-
-CFWL_FontManager* CFWL_FontManager::s_FontManager = nullptr;
-CFWL_FontManager* CFWL_FontManager::GetInstance() {
-  if (!s_FontManager)
-    s_FontManager = new CFWL_FontManager;
-  return s_FontManager;
-}
-void CFWL_FontManager::DestroyInstance() {
-  delete s_FontManager;
-  s_FontManager = nullptr;
-}
-CFWL_FontManager::CFWL_FontManager() {}
-CFWL_FontManager::~CFWL_FontManager() {}
-IFX_Font* CFWL_FontManager::FindFont(const CFX_WideStringC& wsFontFamily,
-                                     FX_DWORD dwFontStyles,
-                                     FX_WORD wCodePage) {
-  for (const auto& pData : m_FontsArray) {
-    if (pData->Equal(wsFontFamily, dwFontStyles, wCodePage))
-      return pData->GetFont();
-  }
-  std::unique_ptr<CFWL_FontData> pFontData(new CFWL_FontData);
-  if (!pFontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage))
-    return nullptr;
-  m_FontsArray.push_back(std::move(pFontData));
-  return m_FontsArray.back()->GetFont();
-}
-FX_BOOL FWLTHEME_Init() {
-  return TRUE;
-}
-void FWLTHEME_Release() {
-  CFWL_ArrowData::DestroyInstance();
-  CFWL_FontManager::DestroyInstance();
-}
-FX_DWORD FWL_GetThemeLayout(FX_DWORD dwThemeID) {
-  return 0xffff0000 & dwThemeID;
-}
-FX_DWORD FWL_GetThemeColor(FX_DWORD dwThemeID) {
-  return 0x0000ffff & dwThemeID;
-}
-FX_DWORD FWL_MakeThemeID(FX_DWORD dwLayout, FX_DWORD dwColor) {
-  return (dwLayout << 16) | (0x0000FFFF & dwColor);
-}
-CFWL_ArrowData* CFWL_ArrowData::m_pInstance = NULL;
-CFWL_ArrowData* CFWL_ArrowData::GetInstance() {
-  if (!m_pInstance) {
-    m_pInstance = new CFWL_ArrowData;
-  }
-  return m_pInstance;
-}
-FX_BOOL CFWL_ArrowData::IsInstance() {
-  return (m_pInstance != NULL);
-}
-void CFWL_ArrowData::DestroyInstance() {
-  if (m_pInstance) {
-    delete m_pInstance;
-    m_pInstance = NULL;
-  }
-}
-CFWL_ArrowData::~CFWL_ArrowData() {
-  if (m_pColorData) {
-    delete m_pColorData;
-    m_pColorData = NULL;
-  }
-}
-void CFWL_ArrowData::SetColorData(FX_DWORD dwID) {
-  if (!m_pColorData) {
-    m_pColorData = new CColorData;
-  }
-  if (dwID) {
-    m_pColorData->clrBorder[0] = ArgbEncode(255, 142, 153, 125);
-    m_pColorData->clrBorder[1] = ArgbEncode(255, 157, 171, 119);
-    m_pColorData->clrBorder[2] = ArgbEncode(255, 118, 131, 97);
-    m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
-    m_pColorData->clrStart[0] = ArgbEncode(255, 203, 215, 186);
-    m_pColorData->clrStart[1] = ArgbEncode(255, 218, 232, 185);
-    m_pColorData->clrStart[2] = ArgbEncode(255, 203, 215, 186);
-    m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
-    m_pColorData->clrEnd[0] = ArgbEncode(255, 149, 167, 117);
-    m_pColorData->clrEnd[1] = ArgbEncode(255, 198, 211, 155);
-    m_pColorData->clrEnd[2] = ArgbEncode(255, 149, 167, 117);
-    m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
-    m_pColorData->clrSign[0] = ArgbEncode(255, 255, 255, 255);
-    m_pColorData->clrSign[1] = ArgbEncode(255, 255, 255, 255);
-    m_pColorData->clrSign[2] = ArgbEncode(255, 255, 255, 255);
-    m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
-  } else {
-    m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249);
-    m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233);
-    m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219);
-    m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
-    m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254);
-    m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255);
-    m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241);
-    m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
-    m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251);
-    m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251);
-    m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235);
-    m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
-    m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133);
-    m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133);
-    m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133);
-    m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
-  }
-}
diff --git a/xfa/src/fxbarcode/BC_BarCode.cpp b/xfa/src/fxbarcode/BC_BarCode.cpp
deleted file mode 100644
index 644ead3..0000000
--- a/xfa/src/fxbarcode/BC_BarCode.cpp
+++ /dev/null
@@ -1,877 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_DecoderResult.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h"
-
-CBC_CodeBase::CBC_CodeBase() {}
-CBC_CodeBase::~CBC_CodeBase() {}
-FX_BOOL CBC_CodeBase::SetCharEncoding(int32_t encoding) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetCharEncoding(encoding);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetModuleHeight(int32_t moduleHeight) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetModuleHeight(moduleHeight);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetModuleWidth(int32_t moduleWidth) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetModuleWidth(moduleWidth);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetHeight(int32_t height) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetHeight(height);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetWidth(int32_t width) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetWidth(width);
-  }
-  return FALSE;
-}
-void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) {
-  if (m_pBCWriter) {
-    m_pBCWriter->SetBackgroundColor(backgroundColor);
-  }
-}
-void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) {
-  if (m_pBCWriter) {
-    m_pBCWriter->SetBarcodeColor(foregroundColor);
-  }
-}
-CBC_OneCode::CBC_OneCode() {}
-CBC_OneCode::~CBC_OneCode() {}
-FX_BOOL CBC_OneCode::CheckContentValidity(const CFX_WideStringC& contents) {
-  if (m_pBCWriter) {
-    return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents);
-  }
-  return FALSE;
-}
-CFX_WideString CBC_OneCode::FilterContents(const CFX_WideStringC& contents) {
-  CFX_WideString tmp;
-  if (m_pBCWriter == NULL) {
-    return tmp;
-  }
-  return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
-}
-void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum);
-  }
-}
-void CBC_OneCode::SetDataLength(int32_t length) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length);
-  }
-}
-void CBC_OneCode::SetCalChecksum(FX_BOOL calc) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc);
-  }
-}
-FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) {
-  if (m_pBCWriter) {
-    return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont);
-  }
-  return FALSE;
-}
-void CBC_OneCode::SetFontSize(FX_FLOAT size) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size);
-  }
-}
-void CBC_OneCode::SetFontStyle(int32_t style) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style);
-  }
-}
-void CBC_OneCode::SetFontColor(FX_ARGB color) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color);
-  }
-}
-CBC_Code39::CBC_Code39() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode39Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCode39Writer);
-}
-CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) {
-  m_pBCReader = (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer;
-}
-CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) {
-  m_pBCReader =
-      (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit, extendedMode);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer(extendedMode);
-}
-CBC_Code39::~CBC_Code39() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Code39::Encode(const CFX_WideStringC& contents,
-                           FX_BOOL isDevice,
-                           int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODE_39;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString filtercontents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents);
-  CFX_WideString renderContents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents);
-  m_renderContents = renderContents;
-  CFX_ByteString byteString = filtercontents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(renderContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device,
-                                 const CFX_Matrix* matirx,
-                                 int32_t& e) {
-  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
-                                 ->encodedContents(m_renderContents, e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
-                                 ->encodedContents(m_renderContents, e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Code39::Decode(uint8_t* buf,
-                                  int32_t width,
-                                  int32_t hight,
-                                  int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Code39::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Code39::SetWideNarrowRatio(int32_t ratio) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio);
-  }
-  return FALSE;
-}
-CBC_Codabar::CBC_Codabar() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCodaBarReader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCodaBarWriter);
-}
-CBC_Codabar::~CBC_Codabar() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
-  return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetTextLocation(location);
-}
-FX_BOOL CBC_Codabar::SetWideNarrowRatio(int32_t ratio) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetWideNarrowRatio(ratio);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODABAR;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString filtercontents =
-      ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
-  CFX_ByteString byteString = filtercontents.UTF8Encode();
-  m_renderContents = filtercontents;
-  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(filtercontents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Codabar::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_Code128::CBC_Code128(BC_TYPE type) {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode128Reader);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode128Writer(type);
-}
-CBC_Code128::~CBC_Code128() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Code128::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODE_128;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString content = contents;
-  if (contents.GetLength() % 2 &&
-      ((CBC_OnedCode128Writer*)m_pBCWriter)->GetType() == BC_CODE128_C) {
-    content += '0';
-  }
-  CFX_WideString encodeContents =
-      ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content);
-  m_renderContents = encodeContents;
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Code128::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Code128::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_EAN8::CBC_EAN8() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN8Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN8Writer);
-}
-CBC_EAN8::~CBC_EAN8() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_EAN8::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
-  int32_t length = encodeContents.GetLength();
-  if (length <= 7) {
-    for (int32_t i = 0; i < 7 - length; i++) {
-      encodeContents = FX_WCHAR('0') + encodeContents;
-    }
-    CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedEAN8Writer*)m_pBCWriter)->CalcChecksum(byteString);
-    encodeContents += FX_WCHAR(checksum - 0 + '0');
-  }
-  if (length > 8) {
-    encodeContents = encodeContents.Mid(0, 8);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_EAN8::Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_EAN_8;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString encodeContents = Preprocess(contents);
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_EAN8::Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_EAN13::CBC_EAN13() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN13Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN13Writer);
-}
-CBC_EAN13::~CBC_EAN13() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_EAN13::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
-  int32_t length = encodeContents.GetLength();
-  if (length <= 12) {
-    for (int32_t i = 0; i < 12 - length; i++) {
-      encodeContents = FX_WCHAR('0') + encodeContents;
-    }
-    CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedEAN13Writer*)m_pBCWriter)->CalcChecksum(byteString);
-    byteString += checksum - 0 + '0';
-    encodeContents = byteString.UTF8Decode();
-  }
-  if (length > 13) {
-    encodeContents = encodeContents.Mid(0, 13);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_EAN13::Encode(const CFX_WideStringC& contents,
-                          FX_BOOL isDevice,
-                          int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_EAN_13;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString encodeContents = Preprocess(contents);
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
-                                const CFX_Matrix* matirx,
-                                int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_EAN13::Decode(uint8_t* buf,
-                                 int32_t width,
-                                 int32_t hight,
-                                 int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_UPCA::CBC_UPCA() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedUPCAReader);
-  ((CBC_OnedUPCAReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedUPCAWriter);
-}
-CBC_UPCA::~CBC_UPCA() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_UPCA::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
-  int32_t length = encodeContents.GetLength();
-  if (length <= 11) {
-    for (int32_t i = 0; i < 11 - length; i++) {
-      encodeContents = FX_WCHAR('0') + encodeContents;
-    }
-    CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedUPCAWriter*)m_pBCWriter)->CalcChecksum(byteString);
-    byteString += checksum - 0 + '0';
-    encodeContents = byteString.UTF8Decode();
-  }
-  if (length > 12) {
-    encodeContents = encodeContents.Mid(0, 12);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_UPCA::Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_UPC_A;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString encodeContents = Preprocess(contents);
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  m_renderContents = encodeContents;
-  ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init();
-  uint8_t* data = static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_UPCA::Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_QRCode::CBC_QRCode() {
-  m_pBCReader = (CBC_Reader*)new (CBC_QRCodeReader);
-  ((CBC_QRCodeReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_QRCodeWriter);
-}
-CBC_QRCode::~CBC_QRCode() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_QRCode::SetVersion(int32_t version) {
-  if (version < 0 || version > 40) {
-    return FALSE;
-  }
-  if (m_pBCWriter == NULL) {
-    return FALSE;
-  }
-  return ((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version);
-}
-FX_BOOL CBC_QRCode::SetErrorCorrectionLevel(int32_t level) {
-  if (level < 0 || level > 3) {
-    return FALSE;
-  }
-  if (m_pBCWriter == NULL) {
-    return FALSE;
-  }
-  return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level);
-}
-FX_BOOL CBC_QRCode::Encode(const CFX_WideStringC& contents,
-                           FX_BOOL isDevice,
-                           int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_QRCodeWriter*)m_pBCWriter)
-                      ->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)
-                                             ->GetErrorCorrectionLevel(),
-                               outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device,
-                                 const CFX_Matrix* matirx,
-                                 int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_QRCode::Decode(uint8_t* buf,
-                                  int32_t width,
-                                  int32_t hight,
-                                  int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
-}
-CBC_PDF417I::CBC_PDF417I() {
-  m_pBCReader = (CBC_Reader*)new (CBC_PDF417Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_PDF417Writer);
-}
-CBC_PDF417I::~CBC_PDF417I() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel(int32_t level) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level);
-  return TRUE;
-}
-void CBC_PDF417I::SetTruncated(FX_BOOL truncated) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated);
-}
-FX_BOOL CBC_PDF417I::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_PDF417Writer*)m_pBCWriter)
-                      ->Encode(contents, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_PDF417I::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength());
-}
-CBC_DataMatrix::CBC_DataMatrix() {
-  m_pBCReader = (CBC_Reader*)new (CBC_DataMatrixReader);
-  ((CBC_DataMatrixReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_DataMatrixWriter);
-}
-CBC_DataMatrix::~CBC_DataMatrix() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_DataMatrix::Encode(const CFX_WideStringC& contents,
-                               FX_BOOL isDevice,
-                               int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_DataMatrixWriter*)m_pBCWriter)
-                      ->Encode(contents, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device,
-                                     const CFX_Matrix* matirx,
-                                     int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_DataMatrix::Decode(uint8_t* buf,
-                                      int32_t width,
-                                      int32_t hight,
-                                      int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
-}
diff --git a/xfa/src/fxbarcode/BC_Binarizer.cpp b/xfa/src/fxbarcode/BC_Binarizer.cpp
deleted file mode 100644
index 8e21456..0000000
--- a/xfa/src/fxbarcode/BC_Binarizer.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-
-CBC_Binarizer::CBC_Binarizer(CBC_LuminanceSource* source) {
-  m_source = source;
-}
-CBC_Binarizer::~CBC_Binarizer() {}
-CBC_LuminanceSource* CBC_Binarizer::GetLuminanceSource() {
-  return m_source;
-}
diff --git a/xfa/src/fxbarcode/BC_Binarizer.h b/xfa/src/fxbarcode/BC_Binarizer.h
deleted file mode 100644
index ed1ac9c..0000000
--- a/xfa/src/fxbarcode/BC_Binarizer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_BINARIZER_H_
-#define XFA_SRC_FXBARCODE_BC_BINARIZER_H_
-
-#include <cstdint>
-
-class CBC_LuminanceSource;
-class CBC_CommonBitMatrix;
-class CBC_CommonBitArray;
-
-class CBC_Binarizer {
- public:
-  CBC_Binarizer(CBC_LuminanceSource* source);
-  virtual ~CBC_Binarizer();
-  CBC_LuminanceSource* GetLuminanceSource();
-  virtual CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e) = 0;
-  virtual CBC_CommonBitArray* GetBlackRow(int32_t y,
-                                          CBC_CommonBitArray* row,
-                                          int32_t& e) = 0;
-
- private:
-  CBC_LuminanceSource* m_source;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_BINARIZER_H_
diff --git a/xfa/src/fxbarcode/BC_BinaryBitmap.cpp b/xfa/src/fxbarcode/BC_BinaryBitmap.cpp
deleted file mode 100644
index be6258e..0000000
--- a/xfa/src/fxbarcode/BC_BinaryBitmap.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_BinaryBitmap::CBC_BinaryBitmap(CBC_Binarizer* binarizer)
-    : m_binarizer(binarizer), m_matrix(NULL) {}
-CBC_BinaryBitmap::~CBC_BinaryBitmap() {
-  delete m_matrix;
-}
-int32_t CBC_BinaryBitmap::GetHeight() {
-  return m_binarizer->GetLuminanceSource()->GetHeight();
-}
-int32_t CBC_BinaryBitmap::GetWidth() {
-  return m_binarizer->GetLuminanceSource()->GetWidth();
-}
-CBC_CommonBitMatrix* CBC_BinaryBitmap::GetMatrix(int32_t& e) {
-  if (m_matrix == NULL) {
-    m_matrix = m_binarizer->GetBlackMatrix(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return m_matrix;
-}
-CBC_CommonBitArray* CBC_BinaryBitmap::GetBlackRow(int32_t y,
-                                                  CBC_CommonBitArray* row,
-                                                  int32_t& e) {
-  CBC_CommonBitArray* temp = m_binarizer->GetBlackRow(y, row, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CBC_CommonBitMatrix* CBC_BinaryBitmap::GetBlackMatrix(int32_t& e) {
-  if (m_matrix == NULL) {
-    m_matrix = m_binarizer->GetBlackMatrix(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return m_matrix;
-}
diff --git a/xfa/src/fxbarcode/BC_BinaryBitmap.h b/xfa/src/fxbarcode/BC_BinaryBitmap.h
deleted file mode 100644
index 5d34c54..0000000
--- a/xfa/src/fxbarcode/BC_BinaryBitmap.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_BINARYBITMAP_H_
-#define XFA_SRC_FXBARCODE_BC_BINARYBITMAP_H_
-
-#include <cstdint>
-
-class CBC_Binarizer;
-class CBC_CommonBitMatrix;
-class CBC_CommonBitArray;
-
-class CBC_BinaryBitmap {
- public:
-  CBC_BinaryBitmap(CBC_Binarizer* binarizer);
-  virtual ~CBC_BinaryBitmap();
-  int32_t GetWidth();
-  int32_t GetHeight();
-  CBC_CommonBitMatrix* GetMatrix(int32_t& e);
-  CBC_CommonBitArray* GetBlackRow(int32_t y,
-                                  CBC_CommonBitArray* row,
-                                  int32_t& e);
-  CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e);
-
- private:
-  CBC_Binarizer* m_binarizer;
-  CBC_CommonBitMatrix* m_matrix;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_BINARYBITMAP_H_
diff --git a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp
deleted file mode 100644
index b2fc8a5..0000000
--- a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcodec/fx_codec.h"
-#include "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_Pause : public IFX_Pause {
- public:
-  virtual FX_BOOL NeedToPauseNow() { return TRUE; }
-};
-static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread) {
-  CFX_DIBitmap* bitmap = NULL;
-  CCodec_ModuleMgr* pCodecMgr = NULL;
-  ICodec_ProgressiveDecoder* pImageCodec = NULL;
-  pCodecMgr = new CCodec_ModuleMgr();
-  pImageCodec = pCodecMgr->CreateProgressiveDecoder();
-  FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH;
-  status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN, nullptr);
-  if (status != FXCODEC_STATUS_FRAME_READY) {
-    return NULL;
-  }
-  bitmap = new CFX_DIBitmap;
-  bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb);
-  bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF));
-  CBC_Pause pause;
-  int32_t frames;
-  status = pImageCodec->GetFrames(frames, &pause);
-  while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) {
-    status = pImageCodec->GetFrames(frames, &pause);
-  }
-  if (status != FXCODEC_STATUS_DECODE_READY) {
-    goto except;
-  }
-  status = pImageCodec->StartDecode(bitmap, 0, 0, bitmap->GetWidth(),
-                                    bitmap->GetHeight(), 0, FALSE);
-  if (status == FXCODEC_STATUS_ERR_PARAMS) {
-    goto except;
-  }
-  if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
-    goto except;
-  }
-  while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
-    status = pImageCodec->ContinueDecode(&pause);
-  }
-  if (status != FXCODEC_STATUS_DECODE_FINISH) {
-    goto except;
-  }
-  if (pImageCodec) {
-    delete pImageCodec;
-    pImageCodec = NULL;
-  }
-  delete pCodecMgr;
-  pCodecMgr = NULL;
-  return bitmap;
-except:
-  if (pImageCodec) {
-    delete pImageCodec;
-    pImageCodec = NULL;
-  }
-  delete pCodecMgr;
-  pCodecMgr = NULL;
-  if (bitmap) {
-    delete bitmap;
-  }
-  return NULL;
-}
-CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(
-    const CFX_WideString& filename)
-    : CBC_LuminanceSource(0, 0), m_filename(filename) {
-  m_height = 0;
-  m_width = 0;
-  m_bytesPerLine = 0;
-  m_top = 0;
-  m_left = 0;
-}
-void CBC_BufferedImageLuminanceSource::Init(int32_t& e) {
-  IFX_FileRead* fileread = FX_CreateFileRead(m_filename);
-  m_pBitmap = CreateDIBSource(fileread);
-  if (m_pBitmap == NULL) {
-    e = BCExceptionLoadFile;
-    return;
-  }
-  m_pBitmap->ConvertFormat(FXDIB_Argb);
-  m_height = m_pBitmap->GetHeight();
-  m_width = m_pBitmap->GetWidth();
-  m_rgbData.SetSize(m_height * m_width);
-  m_bytesPerLine = m_width * 4;
-  m_top = 0;
-  m_left = 0;
-}
-CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(
-    CFX_DIBitmap* pBitmap)
-    : CBC_LuminanceSource(0, 0) {
-  m_pBitmap = pBitmap->Clone();
-  m_pBitmap->ConvertFormat(FXDIB_Argb);
-  m_height = m_pBitmap->GetHeight();
-  m_width = m_pBitmap->GetWidth();
-  m_rgbData.SetSize(m_height * m_width);
-  m_bytesPerLine = m_width * 4;
-  m_top = 0;
-  m_left = 0;
-}
-CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource() {
-  delete m_pBitmap;
-  m_pBitmap = NULL;
-}
-CFX_ByteArray* CBC_BufferedImageLuminanceSource::GetRow(int32_t y,
-                                                        CFX_ByteArray& row,
-                                                        int32_t& e) {
-  if (y < 0 || y >= m_height) {
-    e = BCExceptionRequestedRowIsOutSizeTheImage;
-    return NULL;
-  }
-  int32_t width = m_width;
-  if (row.GetSize() == 0 || row.GetSize() < width) {
-    row.SetSize(width);
-  }
-  if (m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) {
-    m_rgbData.SetSize(width);
-  }
-  int32_t* rowLine = (int32_t*)m_pBitmap->GetScanline(y);
-  int32_t x;
-  for (x = 0; x < width; x++) {
-    int32_t pixel = rowLine[x];
-    int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +
-                         601 * ((pixel >> 8) & 0xFF) + 117 * (pixel & 0xFF)) >>
-                        10;
-    row[x] = (uint8_t)luminance;
-  }
-  return &row;
-}
-CFX_ByteArray* CBC_BufferedImageLuminanceSource::GetMatrix() {
-  CFX_ByteArray* matirx = new CFX_ByteArray();
-  matirx->SetSize(m_bytesPerLine * m_height);
-  int32_t* rgb = (int32_t*)m_pBitmap->GetBuffer();
-  int32_t y;
-  for (y = 0; y < m_height; y++) {
-    int32_t offset = y * m_width;
-    int32_t x;
-    for (x = 0; x < m_width; x++) {
-      int32_t pixel = rgb[offset + x];
-      int32_t luminance =
-          (306 * ((pixel >> 16) & 0xFF) + 601 * ((pixel >> 8) & 0xFF) +
-           117 * (pixel & 0xFF)) >>
-          10;
-      (*matirx)[offset + x] = (uint8_t)luminance;
-    }
-  }
-  return matirx;
-}
diff --git a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h
deleted file mode 100644
index 5696d5b..0000000
--- a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
-#define XFA_SRC_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-
-class CBC_BufferedImageLuminanceSource : public CBC_LuminanceSource {
- public:
-  explicit CBC_BufferedImageLuminanceSource(const CFX_WideString& filename);
-  explicit CBC_BufferedImageLuminanceSource(CFX_DIBitmap* pBitmap);
-  virtual ~CBC_BufferedImageLuminanceSource();
-
-  CFX_ByteArray* GetRow(int32_t y, CFX_ByteArray& row, int32_t& e);
-  CFX_ByteArray* GetMatrix();
-  virtual void Init(int32_t& e);
-
- private:
-  int32_t m_bytesPerLine;
-  int32_t m_left;
-  int32_t m_top;
-  CFX_Int32Array m_rgbData;
-  CFX_DIBitmap* m_pBitmap;
-  const CFX_WideString m_filename;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_BUFFEREDIMAGELUMINANCESOURCE_H_
diff --git a/xfa/src/fxbarcode/BC_DecoderResult.h b/xfa/src/fxbarcode/BC_DecoderResult.h
deleted file mode 100644
index fce22a7..0000000
--- a/xfa/src/fxbarcode/BC_DecoderResult.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_DECODERRESULT_H_
-#define XFA_SRC_FXBARCODE_BC_DECODERRESULT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_DecoderResult {
- public:
-  CBC_DecoderResult(CFX_ByteArray* rawBytes,
-                    CFX_ByteString text,
-                    CFX_ByteString ecLevel);
-  virtual ~CBC_DecoderResult();
-  CFX_ByteArray* getRawBytes();
-  CFX_ByteString getText();
-  CFX_ByteString getECLevel();
-  int32_t getErrorsCorrected();
-  void setErrorsCorrected(int32_t errorsCorrected);
-  int32_t getErasures();
-  void setErasures(int32_t erasures);
-  void* getOther();
-  void setOther(void* other);
-
- private:
-  CFX_ByteArray* m_rawBytes;
-  CFX_ByteString m_text;
-  CFX_ByteString m_ecLevel;
-  int32_t m_errorsCorrected;
-  int32_t m_erasures;
-  void* m_other;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_DECODERRESULT_H_
diff --git a/xfa/src/fxbarcode/BC_Dimension.cpp b/xfa/src/fxbarcode/BC_Dimension.cpp
deleted file mode 100644
index 253a4ea..0000000
--- a/xfa/src/fxbarcode/BC_Dimension.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-CBC_Dimension::CBC_Dimension() {}
-CBC_Dimension::CBC_Dimension(int32_t width, int32_t height, int32_t& e) {
-  if (width < 0 || height < 0) {
-    e = BCExceptionHeightAndWidthMustBeAtLeast1;
-  }
-  m_width = width;
-  m_height = height;
-}
-CBC_Dimension::~CBC_Dimension() {}
-int32_t CBC_Dimension::getWidth() {
-  return m_width;
-}
-int32_t CBC_Dimension::getHeight() {
-  return m_height;
-}
-int32_t CBC_Dimension::hashCode() {
-  return m_width * 32713 + m_height;
-}
-CFX_WideString CBC_Dimension::toString() {
-  return (FX_WCHAR)(m_width + (FX_WCHAR)'x' + m_height);
-}
diff --git a/xfa/src/fxbarcode/BC_Dimension.h b/xfa/src/fxbarcode/BC_Dimension.h
deleted file mode 100644
index d6780f0..0000000
--- a/xfa/src/fxbarcode/BC_Dimension.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_DIMENSION_H_
-#define XFA_SRC_FXBARCODE_BC_DIMENSION_H_
-
-#include <cstdint>
-
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_Dimension {
- public:
-  CBC_Dimension();
-  CBC_Dimension(int32_t width, int32_t height, int32_t& e);
-  virtual ~CBC_Dimension();
-  int32_t getWidth();
-  int32_t getHeight();
-  int32_t hashCode();
-  CFX_WideString toString();
-
- private:
-  int32_t m_width;
-  int32_t m_height;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_DIMENSION_H_
diff --git a/xfa/src/fxbarcode/BC_Library.cpp b/xfa/src/fxbarcode/BC_Library.cpp
deleted file mode 100644
index a5ec431..0000000
--- a/xfa/src/fxbarcode/BC_Library.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_DecoderResult.h"
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
-
-void BC_Library_Init() {
-  CBC_QRCoderErrorCorrectionLevel::Initialize();
-  CBC_QRCoderMode::Initialize();
-  CBC_QRCoderVersion::Initialize();
-  CBC_QRDataMask::Initialize();
-  CBC_ReedSolomonGF256::Initialize();
-  CBC_DataMatrixVersion::Initialize();
-  CBC_SymbolInfo::Initialize();
-  CBC_ErrorCorrection::Initialize();
-  CBC_PDF417HighLevelEncoder::Initialize();
-  int32_t e = 0;
-  CBC_PDF417ECModulusGF::Initialize(e);
-  CBC_DecodedBitStreamPaser::Initialize();
-  CBC_PDF417CodewordDecoder::Initialize();
-  CBC_PDF417ECErrorCorrection::Initialize(e);
-  CBC_PDF417ScanningDecoder::Initialize();
-}
-void BC_Library_Destory() {
-  CBC_QRCoderErrorCorrectionLevel::Finalize();
-  CBC_QRCoderMode::Finalize();
-  CBC_QRCoderVersion::Finalize();
-  CBC_QRDataMask::Finalize();
-  CBC_ReedSolomonGF256::Finalize();
-  CBC_DataMatrixVersion::Finalize();
-  CBC_SymbolInfo::Finalize();
-  CBC_ErrorCorrection::Finalize();
-  CBC_PDF417HighLevelEncoder::Finalize();
-  CBC_DecodedBitStreamPaser::Finalize();
-  CBC_PDF417CodewordDecoder::Finalize();
-  CBC_PDF417ECErrorCorrection::Finalize();
-  CBC_PDF417ECModulusGF::Finalize();
-  CBC_PDF417ScanningDecoder::Finalize();
-}
diff --git a/xfa/src/fxbarcode/BC_LuminanceSource.cpp b/xfa/src/fxbarcode/BC_LuminanceSource.cpp
deleted file mode 100644
index 02ff694..0000000
--- a/xfa/src/fxbarcode/BC_LuminanceSource.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-
-CBC_LuminanceSource::CBC_LuminanceSource(int32_t width, int32_t height)
-    : m_width(width), m_height(height) {}
-CBC_LuminanceSource::~CBC_LuminanceSource() {}
-int32_t CBC_LuminanceSource::GetWidth() {
-  return m_width;
-}
-int32_t CBC_LuminanceSource::GetHeight() {
-  return m_height;
-}
diff --git a/xfa/src/fxbarcode/BC_LuminanceSource.h b/xfa/src/fxbarcode/BC_LuminanceSource.h
deleted file mode 100644
index 862fa24..0000000
--- a/xfa/src/fxbarcode/BC_LuminanceSource.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_LUMINANCESOURCE_H_
-#define XFA_SRC_FXBARCODE_BC_LUMINANCESOURCE_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_LuminanceSource {
- public:
-  CBC_LuminanceSource(int32_t width, int32_t height);
-  virtual ~CBC_LuminanceSource();
-  int32_t GetWidth();
-  int32_t GetHeight();
-
-  virtual CFX_ByteArray* GetRow(int32_t y, CFX_ByteArray& row, int32_t& e) = 0;
-  virtual CFX_ByteArray* GetMatrix() = 0;
-
- protected:
-  int32_t m_width;
-  int32_t m_height;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_LUMINANCESOURCE_H_
diff --git a/xfa/src/fxbarcode/BC_Reader.cpp b/xfa/src/fxbarcode/BC_Reader.cpp
deleted file mode 100644
index 15d161f..0000000
--- a/xfa/src/fxbarcode/BC_Reader.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-
-CBC_Reader::CBC_Reader() {}
-CBC_Reader::~CBC_Reader() {}
diff --git a/xfa/src/fxbarcode/BC_Reader.h b/xfa/src/fxbarcode/BC_Reader.h
deleted file mode 100644
index 062268a..0000000
--- a/xfa/src/fxbarcode/BC_Reader.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_READER_H_
-#define XFA_SRC_FXBARCODE_BC_READER_H_
-
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_BinaryBitmap;
-
-class CBC_Reader {
- public:
-  CBC_Reader();
-  virtual ~CBC_Reader();
-  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e) = 0;
-  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image,
-                                int32_t hints,
-                                int32_t& e) = 0;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_READER_H_
diff --git a/xfa/src/fxbarcode/BC_ResultPoint.cpp b/xfa/src/fxbarcode/BC_ResultPoint.cpp
deleted file mode 100644
index 492f156..0000000
--- a/xfa/src/fxbarcode/BC_ResultPoint.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-
-CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y) : m_x(x), m_y(y) {}
-FX_FLOAT CBC_ResultPoint::GetX() {
-  return m_x;
-}
-FX_FLOAT CBC_ResultPoint::GetY() {
-  return m_y;
-}
diff --git a/xfa/src/fxbarcode/BC_ResultPoint.h b/xfa/src/fxbarcode/BC_ResultPoint.h
deleted file mode 100644
index 6e00a26..0000000
--- a/xfa/src/fxbarcode/BC_ResultPoint.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_RESULTPOINT_H_
-#define XFA_SRC_FXBARCODE_BC_RESULTPOINT_H_
-
-#include "core/include/fxcrt/fx_system.h"
-
-class CBC_ResultPoint {
- public:
-  CBC_ResultPoint();
-  CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y);
-  virtual ~CBC_ResultPoint() {}
-  virtual FX_FLOAT GetX();
-  virtual FX_FLOAT GetY();
-
- protected:
-  FX_FLOAT m_x;
-  FX_FLOAT m_y;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_RESULTPOINT_H_
diff --git a/xfa/src/fxbarcode/BC_TwoDimWriter.cpp b/xfa/src/fxbarcode/BC_TwoDimWriter.cpp
deleted file mode 100644
index a548302..0000000
--- a/xfa/src/fxbarcode/BC_TwoDimWriter.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include <algorithm>
-
-#include "third_party/base/numerics/safe_math.h"
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-
-CBC_TwoDimWriter::CBC_TwoDimWriter() {
-  m_iCorrectLevel = 1;
-  m_bFixedSize = TRUE;
-  m_output = NULL;
-}
-CBC_TwoDimWriter::~CBC_TwoDimWriter() {
-  delete m_output;
-}
-void CBC_TwoDimWriter::RenderDeviceResult(CFX_RenderDevice* device,
-                                          const CFX_Matrix* matrix) {
-  CFX_GraphStateData stateData;
-  CFX_PathData path;
-  path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height);
-  device->DrawPath(&path, matrix, &stateData, m_backgroundColor,
-                   m_backgroundColor, FXFILL_ALTERNATE);
-  int32_t leftPos = 0;
-  int32_t topPos = 0;
-  if (m_bFixedSize) {
-    leftPos = (m_Width - m_output->GetWidth()) / 2;
-    topPos = (m_Height - m_output->GetHeight()) / 2;
-  }
-  CFX_Matrix matri = *matrix;
-  if (m_Width < m_output->GetWidth() && m_Height < m_output->GetHeight()) {
-    CFX_Matrix matriScale(
-        (FX_FLOAT)m_Width / (FX_FLOAT)m_output->GetWidth(), 0.0, 0.0,
-        (FX_FLOAT)m_Height / (FX_FLOAT)m_output->GetHeight(), 0.0, 0.0);
-    matriScale.Concat(*matrix);
-    matri = matriScale;
-  }
-  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
-    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
-      CFX_PathData rect;
-      rect.AppendRect((FX_FLOAT)leftPos + x, (FX_FLOAT)topPos + y,
-                      (FX_FLOAT)(leftPos + x + 1), (FX_FLOAT)(topPos + y + 1));
-      CFX_GraphStateData stateData;
-      if (m_output->Get(x, y)) {
-        device->DrawPath(&rect, &matri, &stateData, m_barColor, 0,
-                         FXFILL_WINDING);
-      }
-    }
-  }
-}
-void CBC_TwoDimWriter::RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
-                                          int32_t& e) {
-  if (m_bFixedSize) {
-    pOutBitmap = CreateDIBitmap(m_Width, m_Height);
-  } else {
-    pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight());
-  }
-  if (!pOutBitmap) {
-    e = BCExceptionFailToCreateBitmap;
-    return;
-  }
-  pOutBitmap->Clear(m_backgroundColor);
-  int32_t leftPos = 0;
-  int32_t topPos = 0;
-  if (m_bFixedSize) {
-    leftPos = (m_Width - m_output->GetWidth()) / 2;
-    topPos = (m_Height - m_output->GetHeight()) / 2;
-  }
-  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
-    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
-      if (m_output->Get(x, y)) {
-        pOutBitmap->SetPixel(leftPos + x, topPos + y, m_barColor);
-      }
-    }
-  }
-  if (!m_bFixedSize) {
-    CFX_DIBitmap* pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height);
-    if (pOutBitmap) {
-      delete pOutBitmap;
-    }
-    pOutBitmap = pStretchBitmap;
-  }
-}
-void CBC_TwoDimWriter::RenderResult(uint8_t* code,
-                                    int32_t codeWidth,
-                                    int32_t codeHeight,
-                                    int32_t& e) {
-  int32_t inputWidth = codeWidth;
-  int32_t inputHeight = codeHeight;
-  int32_t tempWidth = inputWidth + 2;
-  int32_t tempHeight = inputHeight + 2;
-  FX_FLOAT moduleHSize = std::min(m_ModuleWidth, m_ModuleHeight);
-  moduleHSize = std::min(moduleHSize, 8.0f);
-  moduleHSize = std::max(moduleHSize, 1.0f);
-  pdfium::base::CheckedNumeric<int32_t> scaledWidth = tempWidth;
-  pdfium::base::CheckedNumeric<int32_t> scaledHeight = tempHeight;
-  scaledWidth *= moduleHSize;
-  scaledHeight *= moduleHSize;
-
-  int32_t outputWidth = scaledWidth.ValueOrDie();
-  int32_t outputHeight = scaledHeight.ValueOrDie();
-  if (m_bFixedSize) {
-    if (m_Width < outputWidth || m_Height < outputHeight) {
-      e = BCExceptionBitmapSizeError;
-      return;
-    }
-  } else {
-    if (m_Width > outputWidth || m_Height > outputHeight) {
-      outputWidth = (int32_t)(outputWidth *
-                              ceil((FX_FLOAT)m_Width / (FX_FLOAT)outputWidth));
-      outputHeight = (int32_t)(
-          outputHeight * ceil((FX_FLOAT)m_Height / (FX_FLOAT)outputHeight));
-    }
-  }
-  int32_t multiX = (int32_t)ceil((FX_FLOAT)outputWidth / (FX_FLOAT)tempWidth);
-  int32_t multiY = (int32_t)ceil((FX_FLOAT)outputHeight / (FX_FLOAT)tempHeight);
-  if (m_bFixedSize) {
-    multiX = std::min(multiX, multiY);
-    multiY = multiX;
-  }
-  int32_t leftPadding = (outputWidth - (inputWidth * multiX)) / 2;
-  int32_t topPadding = (outputHeight - (inputHeight * multiY)) / 2;
-  if (leftPadding < 0) {
-    leftPadding = 0;
-  }
-  if (topPadding < 0) {
-    topPadding = 0;
-  }
-  m_output = new CBC_CommonBitMatrix;
-  m_output->Init(outputWidth, outputHeight);
-  for (int32_t inputY = 0, outputY = topPadding;
-       (inputY < inputHeight) && (outputY < outputHeight - multiY);
-       inputY++, outputY += multiY) {
-    for (int32_t inputX = 0, outputX = leftPadding;
-         (inputX < inputWidth) && (outputX < outputWidth - multiX);
-         inputX++, outputX += multiX) {
-      if (code[inputX + inputY * inputWidth] == 1) {
-        m_output->SetRegion(outputX, outputY, multiX, multiY, e);
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-    }
-  }
-}
diff --git a/xfa/src/fxbarcode/BC_TwoDimWriter.h b/xfa/src/fxbarcode/BC_TwoDimWriter.h
deleted file mode 100644
index c46691c..0000000
--- a/xfa/src/fxbarcode/BC_TwoDimWriter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_TWODIMWRITER_H_
-#define XFA_SRC_FXBARCODE_BC_TWODIMWRITER_H_
-
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-
-class CBC_CommonBitMatrix;
-
-class CBC_TwoDimWriter : public CBC_Writer {
- public:
-  CBC_TwoDimWriter();
-  virtual ~CBC_TwoDimWriter();
-  virtual void RenderResult(uint8_t* code,
-                            int32_t codeWidth,
-                            int32_t codeHeight,
-                            int32_t& e);
-  virtual void RenderBitmapResult(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  virtual void RenderDeviceResult(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matrix);
-  virtual FX_BOOL SetErrorCorrectionLevel(int32_t level) = 0;
-  virtual int32_t GetErrorCorrectionLevel() { return m_iCorrectLevel; }
-
- protected:
-  int32_t m_iCorrectLevel;
-  FX_BOOL m_bFixedSize;
-  CBC_CommonBitMatrix* m_output;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_TWODIMWRITER_H_
diff --git a/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp b/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp
deleted file mode 100644
index dd42cdb..0000000
--- a/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-
-CBC_UtilCodingConvert::CBC_UtilCodingConvert() {}
-
-CBC_UtilCodingConvert::~CBC_UtilCodingConvert() {}
-
-void CBC_UtilCodingConvert::UnicodeToLocale(const CFX_WideString& src,
-                                            CFX_ByteString& dst) {
-  dst = CFX_ByteString::FromUnicode(src);
-}
-
-void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString& src,
-                                         CFX_ByteString& dst) {
-  CFX_WideString unicode = CFX_WideString::FromLocal(src);
-  dst = unicode.UTF8Encode();
-}
-
-void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString& src,
-                                         CFX_ByteArray& dst) {
-  CFX_WideString unicode = CFX_WideString::FromLocal(src);
-  CFX_ByteString utf8 = unicode.UTF8Encode();
-  for (int32_t i = 0; i < utf8.GetLength(); i++) {
-    dst.Add(utf8[i]);
-  }
-}
-
-void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray& src,
-                                         CFX_ByteString& dst) {
-  CFX_ByteString utf8;
-  for (int32_t i = 0; i < src.GetSize(); i++) {
-    utf8 += src[i];
-  }
-  CFX_WideString unicode = CFX_WideString::FromUTF8(utf8, utf8.GetLength());
-  dst = CFX_ByteString::FromUnicode(unicode);
-}
-
-void CBC_UtilCodingConvert::Utf8ToLocale(const uint8_t* src,
-                                         int32_t count,
-                                         CFX_ByteString& dst) {
-  CFX_WideString unicode = CFX_WideString::FromUTF8((const char*)src, count);
-  dst = CFX_ByteString::FromUnicode(unicode);
-}
-
-void CBC_UtilCodingConvert::UnicodeToUTF8(const CFX_WideString& src,
-                                          CFX_ByteString& dst) {
-  dst = src.UTF8Encode();
-}
diff --git a/xfa/src/fxbarcode/BC_UtilCodingConvert.h b/xfa/src/fxbarcode/BC_UtilCodingConvert.h
deleted file mode 100644
index 2cfd81a..0000000
--- a/xfa/src/fxbarcode/BC_UtilCodingConvert.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_UTILCODINGCONVERT_H_
-#define XFA_SRC_FXBARCODE_BC_UTILCODINGCONVERT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_UtilCodingConvert {
- public:
-  CBC_UtilCodingConvert();
-  virtual ~CBC_UtilCodingConvert();
-  static void UnicodeToLocale(const CFX_WideString& source,
-                              CFX_ByteString& result);
-  static void LocaleToUtf8(const CFX_ByteString& source,
-                           CFX_ByteString& result);
-  static void LocaleToUtf8(const CFX_ByteString& source, CFX_ByteArray& result);
-  static void Utf8ToLocale(const CFX_ByteArray& source, CFX_ByteString& result);
-  static void Utf8ToLocale(const uint8_t* source,
-                           int32_t count,
-                           CFX_ByteString& result);
-  static void UnicodeToUTF8(const CFX_WideString& source,
-                            CFX_ByteString& result);
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_UTILCODINGCONVERT_H_
diff --git a/xfa/src/fxbarcode/BC_UtilRSS.cpp b/xfa/src/fxbarcode/BC_UtilRSS.cpp
deleted file mode 100644
index dcc12e2..0000000
--- a/xfa/src/fxbarcode/BC_UtilRSS.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_UtilRSS.h"
-
-#include <memory>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_UtilRSS::CBC_UtilRSS() {}
-CBC_UtilRSS::~CBC_UtilRSS() {}
-CFX_Int32Array* CBC_UtilRSS::GetRssWidths(int32_t val,
-                                          int32_t n,
-                                          int32_t elements,
-                                          int32_t maxWidth,
-                                          FX_BOOL noNarrow) {
-  std::unique_ptr<CFX_Int32Array> widths(new CFX_Int32Array);
-  widths->SetSize(elements);
-  int32_t bar;
-  int32_t narrowMask = 0;
-  for (bar = 0; bar < elements - 1; bar++) {
-    narrowMask |= (1 << bar);
-    int32_t elmWidth = 1;
-    int32_t subVal;
-    while (TRUE) {
-      subVal = Combins(n - elmWidth - 1, elements - bar - 2);
-      if (noNarrow && (narrowMask == 0) &&
-          (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
-        subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2);
-      }
-      if (elements - bar - 1 > 1) {
-        int32_t lessVal = 0;
-        for (int32_t mxwElement = n - elmWidth - (elements - bar - 2);
-             mxwElement > maxWidth; mxwElement--) {
-          lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
-        }
-        subVal -= lessVal * (elements - 1 - bar);
-      } else if (n - elmWidth > maxWidth) {
-        subVal--;
-      }
-      val -= subVal;
-      if (val < 0) {
-        break;
-      }
-      elmWidth++;
-      narrowMask &= ~(1 << bar);
-    }
-    val += subVal;
-    n -= elmWidth;
-    (*widths)[bar] = elmWidth;
-  }
-  (*widths)[bar] = n;
-  return widths.release();
-}
-int32_t CBC_UtilRSS::GetRSSvalue(CFX_Int32Array& widths,
-                                 int32_t maxWidth,
-                                 FX_BOOL noNarrow) {
-  int32_t elements = widths.GetSize();
-  int32_t n = 0;
-  for (int32_t i = 0; i < elements; i++) {
-    n += widths[i];
-  }
-  int32_t val = 0;
-  int32_t narrowMask = 0;
-  for (int32_t bar = 0; bar < elements - 1; bar++) {
-    int32_t elmWidth;
-    for (elmWidth = 1, narrowMask |= (1 << bar); elmWidth < widths[bar];
-         elmWidth++, narrowMask &= ~(1 << bar)) {
-      int32_t subVal = Combins(n - elmWidth - 1, elements - bar - 2);
-      if (noNarrow && (narrowMask == 0) &&
-          (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
-        subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2);
-      }
-      if (elements - bar - 1 > 1) {
-        int32_t lessVal = 0;
-        for (int32_t mxwElement = n - elmWidth - (elements - bar - 2);
-             mxwElement > maxWidth; mxwElement--) {
-          lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
-        }
-        subVal -= lessVal * (elements - 1 - bar);
-      } else if (n - elmWidth > maxWidth) {
-        subVal--;
-      }
-      val += subVal;
-    }
-    n -= elmWidth;
-  }
-  return val;
-}
-int32_t CBC_UtilRSS::Combins(int32_t n, int32_t r) {
-  int32_t maxDenom;
-  int32_t minDenom;
-  if (n - r > r) {
-    minDenom = r;
-    maxDenom = n - r;
-  } else {
-    minDenom = n - r;
-    maxDenom = r;
-  }
-  int32_t val = 1;
-  int32_t j = 1;
-  for (int32_t i = n; i > maxDenom; i--) {
-    val *= i;
-    if (j <= minDenom) {
-      val /= j;
-      j++;
-    }
-  }
-  while (j <= minDenom) {
-    val /= j;
-    j++;
-  }
-  return val;
-}
-CFX_Int32Array* CBC_UtilRSS::Elements(CFX_Int32Array& eDist,
-                                      int32_t N,
-                                      int32_t K) {
-  CFX_Int32Array* widths = new CFX_Int32Array;
-  widths->SetSize(eDist.GetSize() + 2);
-  int32_t twoK = K << 1;
-  (*widths)[0] = 1;
-  int32_t i;
-  int32_t minEven = 10;
-  int32_t barSum = 1;
-  for (i = 1; i < twoK - 2; i += 2) {
-    (*widths)[i] = eDist[i - 1] - (*widths)[i - 1];
-    (*widths)[i + 1] = eDist[i] - (*widths)[i];
-    barSum += (*widths)[i] + (*widths)[i + 1];
-    if ((*widths)[i] < minEven) {
-      minEven = (*widths)[i];
-    }
-  }
-  (*widths)[twoK - 1] = N - barSum;
-  if ((*widths)[twoK - 1] < minEven) {
-    minEven = (*widths)[twoK - 1];
-  }
-  if (minEven > 1) {
-    for (i = 0; i < twoK; i += 2) {
-      (*widths)[i] += minEven - 1;
-      (*widths)[i + 1] -= minEven - 1;
-    }
-  }
-  return widths;
-}
diff --git a/xfa/src/fxbarcode/BC_UtilRSS.h b/xfa/src/fxbarcode/BC_UtilRSS.h
deleted file mode 100644
index 825a555..0000000
--- a/xfa/src/fxbarcode/BC_UtilRSS.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_UTILRSS_H_
-#define XFA_SRC_FXBARCODE_BC_UTILRSS_H_
-
-#include <cstdint>
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_UtilRSS {
- public:
-  virtual ~CBC_UtilRSS();
-  static int32_t GetRSSvalue(CFX_Int32Array& widths,
-                             int32_t maxWidth,
-                             FX_BOOL noNarrow);
-
- protected:
-  static CFX_Int32Array* GetRssWidths(int32_t val,
-                                      int32_t n,
-                                      int32_t elements,
-                                      int32_t maxWidth,
-                                      FX_BOOL noNarrow);
-  static int32_t Combins(int32_t n, int32_t r);
-  static CFX_Int32Array* Elements(CFX_Int32Array& eDist, int32_t N, int32_t K);
-
- private:
-  CBC_UtilRSS();
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_UTILRSS_H_
diff --git a/xfa/src/fxbarcode/BC_Utils.cpp b/xfa/src/fxbarcode/BC_Utils.cpp
deleted file mode 100644
index 5c681a9..0000000
--- a/xfa/src/fxbarcode/BC_Utils.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString& dst,
-                                 FX_DWORD first,
-                                 FX_DWORD last,
-                                 int32_t count,
-                                 FX_CHAR c) {
-  if (first > last || count <= 0) {
-    return FALSE;
-  }
-  dst.Delete(first, last - first);
-  for (int32_t i = 0; i < count; i++) {
-    dst.Insert(0, c);
-  }
-  return TRUE;
-}
-void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c) {
-  for (int32_t i = 0; i < count; i++) {
-    dst += c;
-  }
-}
-void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba) {
-  for (int32_t i = 0; i < ba.GetSize(); i++) {
-    dst += ba[i];
-  }
-}
-void BC_FX_PtrArray_Sort(CFX_PtrArray& src, BC_PtrArrayCompareCallback fun) {
-  int32_t nLength = src.GetSize();
-  FX_BOOL changed = true;
-  do {
-    changed = false;
-    for (int32_t i = 0; i < nLength - 1; i++) {
-      if (fun(src[i + 1], src[i])) {
-        void* temp = src[i];
-        src.SetAt(i, src[i + 1]);
-        src.SetAt(i + 1, temp);
-        changed = true;
-      }
-    }
-  } while (changed);
-}
diff --git a/xfa/src/fxbarcode/BC_Writer.cpp b/xfa/src/fxbarcode/BC_Writer.cpp
deleted file mode 100644
index 87b856a..0000000
--- a/xfa/src/fxbarcode/BC_Writer.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxbarcode/BC_Writer.h"
-
-CBC_Writer::CBC_Writer() {
-  m_CharEncoding = 0;
-  m_ModuleHeight = 1;
-  m_ModuleWidth = 1;
-  m_Height = 320;
-  m_Width = 640;
-  m_colorSpace = FXDIB_Argb;
-  m_barColor = 0xff000000;
-  m_backgroundColor = 0xffffffff;
-}
-CBC_Writer::~CBC_Writer() {}
-FX_BOOL CBC_Writer::SetCharEncoding(int32_t encoding) {
-  m_CharEncoding = encoding;
-  return TRUE;
-}
-FX_BOOL CBC_Writer::SetModuleHeight(int32_t moduleHeight) {
-  if (moduleHeight > 10 || moduleHeight < 1) {
-    return FALSE;
-  }
-  m_ModuleHeight = moduleHeight;
-  return TRUE;
-}
-FX_BOOL CBC_Writer::SetModuleWidth(int32_t moduleWidth) {
-  if (moduleWidth > 10 || moduleWidth < 1) {
-    return FALSE;
-  }
-  m_ModuleWidth = moduleWidth;
-  return TRUE;
-}
-FX_BOOL CBC_Writer::SetHeight(int32_t height) {
-  m_Height = height;
-  return TRUE;
-}
-FX_BOOL CBC_Writer::SetWidth(int32_t width) {
-  m_Width = width;
-  return TRUE;
-}
-void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) {
-  m_backgroundColor = backgroundColor;
-}
-void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) {
-  m_barColor = foregroundColor;
-}
-CFX_DIBitmap* CBC_Writer::CreateDIBitmap(int32_t width, int32_t height) {
-  CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
-  pDIBitmap->Create(width, height, m_colorSpace);
-  return pDIBitmap;
-}
diff --git a/xfa/src/fxbarcode/BC_Writer.h b/xfa/src/fxbarcode/BC_Writer.h
deleted file mode 100644
index a1ebfd0..0000000
--- a/xfa/src/fxbarcode/BC_Writer.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_BC_WRITER_H_
-#define XFA_SRC_FXBARCODE_BC_WRITER_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxge/fx_dib.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_Writer {
- public:
-  CBC_Writer();
-  virtual ~CBC_Writer();
-  virtual FX_BOOL SetCharEncoding(int32_t encoding);
-  virtual FX_BOOL SetModuleHeight(int32_t moduleHeight);
-  virtual FX_BOOL SetModuleWidth(int32_t moduleWidth);
-  virtual FX_BOOL SetHeight(int32_t height);
-  virtual FX_BOOL SetWidth(int32_t width);
-  virtual void SetBackgroundColor(FX_ARGB backgroundColor);
-  virtual void SetBarcodeColor(FX_ARGB foregroundColor);
-
- protected:
-  CFX_DIBitmap* CreateDIBitmap(int32_t width, int32_t height);
-  int32_t m_CharEncoding;
-  int32_t m_ModuleHeight;
-  int32_t m_ModuleWidth;
-  int32_t m_Height;
-  int32_t m_Width;
-  FXDIB_Format m_colorSpace;
-  FX_ARGB m_barColor;
-  FX_ARGB m_backgroundColor;
-};
-
-#endif  // XFA_SRC_FXBARCODE_BC_WRITER_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp b/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp
deleted file mode 100644
index 43f1758..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array) {
-  m_size = array->GetSize();
-  m_bits.Copy(array->GetBits());
-}
-CBC_CommonBitArray::CBC_CommonBitArray() {
-  m_bits.SetSize(1);
-  m_size = 0;
-}
-CBC_CommonBitArray::CBC_CommonBitArray(int32_t size) {
-  m_bits.SetSize((size + 31) >> 5);
-  m_size = size;
-}
-CBC_CommonBitArray::~CBC_CommonBitArray() {
-  m_size = 0;
-}
-int32_t CBC_CommonBitArray::GetSize() {
-  return m_size;
-}
-CFX_Int32Array& CBC_CommonBitArray::GetBits() {
-  return m_bits;
-}
-int32_t CBC_CommonBitArray::GetSizeInBytes() {
-  return (m_size + 7) >> 3;
-}
-FX_BOOL CBC_CommonBitArray::Get(int32_t i) {
-  return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0;
-}
-void CBC_CommonBitArray::Set(int32_t i) {
-  m_bits[i >> 5] |= 1 << (i & 0x1F);
-}
-void CBC_CommonBitArray::Flip(int32_t i) {
-  m_bits[i >> 5] ^= 1 << (i & 0x1F);
-}
-void CBC_CommonBitArray::SetBulk(int32_t i, int32_t newBits) {
-  m_bits[i >> 5] = newBits;
-}
-void CBC_CommonBitArray::Clear() {
-  FXSYS_memset(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(int32_t));
-}
-FX_BOOL CBC_CommonBitArray::IsRange(int32_t start,
-                                    int32_t end,
-                                    FX_BOOL value,
-                                    int32_t& e) {
-  if (end < start) {
-    e = BCExceptionEndLessThanStart;
-    return FALSE;
-  }
-  if (end == start) {
-    return TRUE;
-  }
-  end--;
-  int32_t firstInt = start >> 5;
-  int32_t lastInt = end >> 5;
-  int32_t i;
-  for (i = firstInt; i <= lastInt; i++) {
-    int32_t firstBit = i > firstInt ? 0 : start & 0x1F;
-    int32_t lastBit = i < lastInt ? 31 : end & 0x1F;
-    int32_t mask;
-    if (firstBit == 0 && lastBit == 31) {
-      mask = -1;
-    } else {
-      mask = 0;
-      for (int32_t j = firstBit; j <= lastBit; j++) {
-        mask |= 1 << j;
-      }
-    }
-    if ((m_bits[i] & mask) != (value ? mask : 0)) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-int32_t* CBC_CommonBitArray::GetBitArray() {
-  return &m_bits[0];
-}
-void CBC_CommonBitArray::Reverse() {
-  int32_t* newBits = FX_Alloc(int32_t, m_bits.GetSize());
-  FXSYS_memset(newBits, 0x00, m_bits.GetSize() * sizeof(int32_t));
-  int32_t size = m_size;
-  int32_t i;
-  for (i = 0; i < size; i++) {
-    if (Get(size - i - 1)) {
-      newBits[i >> 5] |= 1 << (i & 0x1F);
-    }
-  }
-  FXSYS_memcpy(&m_bits[0], newBits, m_bits.GetSize() * sizeof(int32_t));
-  FX_Free(newBits);
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitArray.h b/xfa/src/fxbarcode/common/BC_CommonBitArray.h
deleted file mode 100644
index bf2b355..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitArray.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitArray {
- public:
-  CBC_CommonBitArray(CBC_CommonBitArray* array);
-  CBC_CommonBitArray(int32_t size);
-  CBC_CommonBitArray();
-  virtual ~CBC_CommonBitArray();
-  int32_t GetSize();
-  CFX_Int32Array& GetBits();
-  int32_t GetSizeInBytes();
-  FX_BOOL Get(int32_t i);
-  void Set(int32_t i);
-  void Flip(int32_t i);
-  void SetBulk(int32_t i, int32_t newBits);
-  FX_BOOL IsRange(int32_t start, int32_t end, FX_BOOL value, int32_t& e);
-  int32_t* GetBitArray();
-  void Reverse();
-  void Clear();
-
- private:
-  int32_t m_size;
-  CFX_Int32Array m_bits;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp
deleted file mode 100644
index 3a8fa15..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_CommonBitMatrix::CBC_CommonBitMatrix() {
-  m_width = 0;
-  m_height = 0;
-  m_rowSize = 0;
-  m_bits = NULL;
-}
-void CBC_CommonBitMatrix::Init(int32_t dimension) {
-  m_width = dimension;
-  m_height = dimension;
-  int32_t rowSize = (m_height + 31) >> 5;
-  m_rowSize = rowSize;
-  m_bits = FX_Alloc2D(int32_t, m_rowSize, m_height);
-  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
-}
-void CBC_CommonBitMatrix::Init(int32_t width, int32_t height) {
-  m_width = width;
-  m_height = height;
-  int32_t rowSize = (width + 31) >> 5;
-  m_rowSize = rowSize;
-  m_bits = FX_Alloc2D(int32_t, m_rowSize, m_height);
-  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
-}
-CBC_CommonBitMatrix::~CBC_CommonBitMatrix() {
-  FX_Free(m_bits);
-}
-FX_BOOL CBC_CommonBitMatrix::Get(int32_t x, int32_t y) {
-  int32_t offset = y * m_rowSize + (x >> 5);
-  if (offset >= m_rowSize * m_height || offset < 0) {
-    return false;
-  }
-  return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0;
-}
-int32_t* CBC_CommonBitMatrix::GetBits() {
-  return m_bits;
-}
-void CBC_CommonBitMatrix::Set(int32_t x, int32_t y) {
-  int32_t offset = y * m_rowSize + (x >> 5);
-  if (offset >= m_rowSize * m_height || offset < 0) {
-    return;
-  }
-  m_bits[offset] |= 1 << (x & 0x1f);
-}
-void CBC_CommonBitMatrix::Flip(int32_t x, int32_t y) {
-  int32_t offset = y * m_rowSize + (x >> 5);
-  m_bits[offset] ^= 1 << (x & 0x1f);
-}
-void CBC_CommonBitMatrix::Clear() {
-  FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));
-}
-void CBC_CommonBitMatrix::SetRegion(int32_t left,
-                                    int32_t top,
-                                    int32_t width,
-                                    int32_t height,
-                                    int32_t& e) {
-  if (top < 0 || left < 0) {
-    e = BCExceptionLeftAndTopMustBeNonnegative;
-    return;
-  }
-  if (height < 1 || width < 1) {
-    e = BCExceptionHeightAndWidthMustBeAtLeast1;
-    return;
-  }
-  int32_t right = left + width;
-  int32_t bottom = top + height;
-  if (m_height < bottom || m_width < right) {
-    e = BCExceptionRegionMustFitInsideMatrix;
-    return;
-  }
-  int32_t y;
-  for (y = top; y < bottom; y++) {
-    int32_t offset = y * m_rowSize;
-    int32_t x;
-    for (x = left; x < right; x++) {
-      m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f);
-    }
-  }
-}
-CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(int32_t y,
-                                                CBC_CommonBitArray* row) {
-  CBC_CommonBitArray* rowArray = NULL;
-  if (row == NULL || row->GetSize() < m_width) {
-    rowArray = new CBC_CommonBitArray(m_width);
-  } else {
-    rowArray = new CBC_CommonBitArray(row);
-  }
-  int32_t offset = y * m_rowSize;
-  int32_t x;
-  for (x = 0; x < m_rowSize; x++) {
-    rowArray->SetBulk(x << 5, m_bits[offset + x]);
-  }
-  return rowArray;
-}
-void CBC_CommonBitMatrix::SetRow(int32_t y, CBC_CommonBitArray* row) {
-  int32_t l = y * m_rowSize;
-  for (int32_t i = 0; i < m_rowSize; i++) {
-    m_bits[l] = row->GetBitArray()[i];
-    l++;
-  }
-}
-void CBC_CommonBitMatrix::SetCol(int32_t y, CBC_CommonBitArray* col) {
-  for (int32_t i = 0; i < col->GetBits().GetSize(); i++) {
-    m_bits[i * m_rowSize + y] = col->GetBitArray()[i];
-  }
-}
-int32_t CBC_CommonBitMatrix::GetWidth() {
-  return m_width;
-}
-int32_t CBC_CommonBitMatrix::GetHeight() {
-  return m_height;
-}
-int32_t CBC_CommonBitMatrix::GetRowSize() {
-  return m_rowSize;
-}
-int32_t CBC_CommonBitMatrix::GetDimension(int32_t& e) {
-  if (m_width != m_height) {
-    e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;
-    return 0;
-  }
-  return m_width;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h
deleted file mode 100644
index 86838a1..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
-
-#include "core/include/fxcrt/fx_system.h"
-
-class CBC_CommonBitArray;
-
-class CBC_CommonBitMatrix {
- public:
-  CBC_CommonBitMatrix();
-  virtual ~CBC_CommonBitMatrix();
-  FX_BOOL Get(int32_t x, int32_t y);
-  void Set(int32_t x, int32_t y);
-  void Flip(int32_t x, int32_t y);
-  void Clear();
-  void SetRegion(int32_t left,
-                 int32_t top,
-                 int32_t width,
-                 int32_t height,
-                 int32_t& e);
-  CBC_CommonBitArray* GetRow(int32_t y, CBC_CommonBitArray* row);
-  void SetRow(int32_t y, CBC_CommonBitArray* row);
-  CBC_CommonBitArray* GetCol(int32_t y, CBC_CommonBitArray* row);
-  void SetCol(int32_t y, CBC_CommonBitArray* col);
-  int32_t GetWidth();
-  int32_t GetHeight();
-  int32_t GetRowSize();
-  int32_t GetDimension(int32_t& e);
-  virtual void Init(int32_t dimension);
-  virtual void Init(int32_t width, int32_t height);
-  int32_t* GetBits();
-
- private:
-  int32_t m_width;
-  int32_t m_height;
-  int32_t m_rowSize;
-  int32_t* m_bits;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITMATRIX_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp b/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp
deleted file mode 100644
index dc10002..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitSource.h"
-
-CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) {
-  m_bytes.Copy((*bytes));
-  m_bitOffset = 0;
-  m_byteOffset = 0;
-}
-CBC_CommonBitSource::~CBC_CommonBitSource() {}
-int32_t CBC_CommonBitSource::ReadBits(int32_t numBits, int32_t& e) {
-  if (numBits < 1 || numBits > 32) {
-    e = BCExceptionIllegalArgument;
-    return 0;
-  }
-  int32_t result = 0;
-  if (m_bitOffset > 0) {
-    int32_t bitsLeft = 8 - m_bitOffset;
-    int32_t toRead = numBits < bitsLeft ? numBits : bitsLeft;
-    int32_t bitsToNotRead = bitsLeft - toRead;
-    int32_t mask = (0xff >> (8 - toRead)) << bitsToNotRead;
-    result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead;
-    numBits -= toRead;
-    m_bitOffset += toRead;
-    if (m_bitOffset == 8) {
-      m_bitOffset = 0;
-      m_byteOffset++;
-    }
-  }
-  if (numBits > 0) {
-    while (numBits >= 8) {
-      result = (result << 8) | (m_bytes[m_byteOffset] & 0xff);
-      m_byteOffset++;
-      numBits -= 8;
-    }
-    if (numBits > 0) {
-      int32_t bitsToNotRead = 8 - numBits;
-      int32_t mask = (0xff >> bitsToNotRead) << bitsToNotRead;
-      result = (result << numBits) |
-               ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead);
-      m_bitOffset += numBits;
-    }
-  }
-  return result;
-}
-int32_t CBC_CommonBitSource::Available() {
-  return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset;
-}
-int32_t CBC_CommonBitSource::getByteOffset() {
-  return m_byteOffset;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonBitSource.h b/xfa/src/fxbarcode/common/BC_CommonBitSource.h
deleted file mode 100644
index 0e2a4bf..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonBitSource.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_CommonBitSource {
- public:
-  CBC_CommonBitSource(CFX_ByteArray* bytes);
-  virtual ~CBC_CommonBitSource();
-  int32_t ReadBits(int32_t numBits, int32_t& e);
-  int32_t Available();
-  int32_t getByteOffset();
-
- private:
-  CFX_ByteArray m_bytes;
-  int32_t m_byteOffset;
-  int32_t m_bitOffset;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp b/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp
deleted file mode 100644
index 1a6ef9f..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <algorithm>
-
-#include "xfa/src/fxbarcode/common/BC_CommonByteArray.h"
-
-CBC_CommonByteArray::CBC_CommonByteArray() {
-  m_bytes = NULL;
-  m_size = 0;
-  m_index = 0;
-}
-CBC_CommonByteArray::CBC_CommonByteArray(int32_t size) {
-  m_size = size;
-  m_bytes = FX_Alloc(uint8_t, size);
-  FXSYS_memset(m_bytes, 0, size);
-  m_index = 0;
-}
-CBC_CommonByteArray::CBC_CommonByteArray(uint8_t* byteArray, int32_t size) {
-  m_size = size;
-  m_bytes = FX_Alloc(uint8_t, size);
-  FXSYS_memcpy(m_bytes, byteArray, size);
-  m_index = size;
-}
-CBC_CommonByteArray::~CBC_CommonByteArray() {
-  FX_Free(m_bytes);
-}
-int32_t CBC_CommonByteArray::At(int32_t index) {
-  return m_bytes[index] & 0xff;
-}
-void CBC_CommonByteArray::Set(int32_t index, int32_t value) {
-  m_bytes[index] = (uint8_t)value;
-}
-int32_t CBC_CommonByteArray::Size() {
-  return m_size;
-}
-FX_BOOL CBC_CommonByteArray::IsEmpty() {
-  return m_size == 0;
-}
-void CBC_CommonByteArray::AppendByte(int32_t value) {
-  if (m_size == 0 || m_index >= m_size) {
-    int32_t newSize = std::max(32, m_size << 1);
-    Reserve(newSize);
-  }
-  m_bytes[m_index] = (uint8_t)value;
-  m_index++;
-}
-void CBC_CommonByteArray::Reserve(int32_t capacity) {
-  if (m_bytes == NULL || m_size < capacity) {
-    uint8_t* newArray = FX_Alloc(uint8_t, capacity);
-    if (m_bytes) {
-      FXSYS_memcpy(newArray, m_bytes, m_size);
-      FXSYS_memset(newArray + m_size, 0, capacity - m_size);
-    } else {
-      FXSYS_memset(newArray, 0, capacity);
-    }
-    FX_Free(m_bytes);
-    m_bytes = newArray;
-    m_size = capacity;
-  }
-}
-void CBC_CommonByteArray::Set(uint8_t* source, int32_t offset, int32_t count) {
-  FX_Free(m_bytes);
-  m_bytes = FX_Alloc(uint8_t, count);
-  m_size = count;
-  FXSYS_memcpy(m_bytes, source + offset, count);
-  m_index = count;
-}
-void CBC_CommonByteArray::Set(CFX_ByteArray* source,
-                              int32_t offset,
-                              int32_t count) {
-  FX_Free(m_bytes);
-  m_bytes = FX_Alloc(uint8_t, count);
-  m_size = count;
-  int32_t i;
-  for (i = 0; i < count; i++) {
-    m_bytes[i] = source->operator[](i + offset);
-  }
-  m_index = m_size;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonByteArray.h b/xfa/src/fxbarcode/common/BC_CommonByteArray.h
deleted file mode 100644
index c8fb05d..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonByteArray.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonByteArray {
- private:
-  int32_t m_size;
-  int32_t m_index;
-  uint8_t* m_bytes;
-
- public:
-  CBC_CommonByteArray();
-  CBC_CommonByteArray(int32_t size);
-  CBC_CommonByteArray(uint8_t* byteArray, int32_t size);
-  virtual ~CBC_CommonByteArray();
-  int32_t At(int32_t index);
-  void Set(int32_t index, int32_t value);
-  int32_t Size();
-  FX_BOOL IsEmpty();
-  void AppendByte(int32_t value);
-  void Reserve(int32_t capacity);
-  void Set(uint8_t* source, int32_t offset, int32_t count);
-  void Set(CFX_ByteArray* source, int32_t offset, int32_t count);
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp
deleted file mode 100644
index 69c39a7..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcrt/fx_memory.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-
-CBC_CommonByteMatrix::CBC_CommonByteMatrix(int32_t width, int32_t height) {
-  m_height = height;
-  m_width = width;
-  m_bytes = NULL;
-}
-void CBC_CommonByteMatrix::Init() {
-  m_bytes = FX_Alloc2D(uint8_t, m_height, m_width);
-  FXSYS_memset(m_bytes, 0xff, m_height * m_width);
-}
-CBC_CommonByteMatrix::~CBC_CommonByteMatrix() {
-  FX_Free(m_bytes);
-}
-int32_t CBC_CommonByteMatrix::GetHeight() {
-  return m_height;
-}
-int32_t CBC_CommonByteMatrix::GetWidth() {
-  return m_width;
-}
-uint8_t CBC_CommonByteMatrix::Get(int32_t x, int32_t y) {
-  return m_bytes[y * m_width + x];
-}
-void CBC_CommonByteMatrix::Set(int32_t x, int32_t y, int32_t value) {
-  m_bytes[y * m_width + x] = (uint8_t)value;
-}
-void CBC_CommonByteMatrix::Set(int32_t x, int32_t y, uint8_t value) {
-  m_bytes[y * m_width + x] = value;
-}
-void CBC_CommonByteMatrix::clear(uint8_t value) {
-  int32_t y;
-  for (y = 0; y < m_height; y++) {
-    int32_t x;
-    for (x = 0; x < m_width; x++) {
-      m_bytes[y * m_width + x] = value;
-    }
-  }
-}
-uint8_t* CBC_CommonByteMatrix::GetArray() {
-  return m_bytes;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h
deleted file mode 100644
index d9af45d..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
-
-#include <stdint.h>
-
-#include "core/include/fxcrt/fx_system.h"
-
-class CBC_CommonByteMatrix {
- public:
-  CBC_CommonByteMatrix(int32_t width, int32_t height);
-  virtual ~CBC_CommonByteMatrix();
-  int32_t GetHeight();
-  int32_t GetWidth();
-  uint8_t Get(int32_t x, int32_t y);
-  uint8_t* GetArray();
-
-  void Set(int32_t x, int32_t y, int32_t value);
-  void Set(int32_t x, int32_t y, uint8_t value);
-  void clear(uint8_t value);
-  virtual void Init();
-
- private:
-  uint8_t* m_bytes;
-  int32_t m_width;
-  int32_t m_height;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONBYTEMATRIX_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp
deleted file mode 100644
index 58347c3..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h"
-#include "xfa/src/fxbarcode/common/BC_CommonECI.h"
-
-void CBC_CommonCharacterSetECI::initialize() {}
-CBC_CommonCharacterSetECI::CBC_CommonCharacterSetECI(
-    int32_t value,
-    CFX_ByteString encodingName)
-    : CBC_CommonECI(value), m_encodingName(encodingName) {}
-CBC_CommonCharacterSetECI::~CBC_CommonCharacterSetECI() {}
-CFX_ByteString CBC_CommonCharacterSetECI::GetEncodingName() {
-  return m_encodingName;
-}
-void CBC_CommonCharacterSetECI::AddCharacterSet(int32_t value,
-                                                CFX_ByteString encodingName) {}
-CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(
-    int32_t value) {
-  return NULL;
-}
-CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByName(
-    const CFX_ByteString& name) {
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h
deleted file mode 100644
index c593b94..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fxbarcode/common/BC_CommonECI.h"
-
-class CBC_CommonCharacterSetECI : public CBC_CommonECI {
- public:
-  CBC_CommonCharacterSetECI(int32_t value, CFX_ByteString encodingName);
-  virtual ~CBC_CommonCharacterSetECI();
-  CFX_ByteString GetEncodingName();
-  static void AddCharacterSet(int32_t value, CFX_ByteString encodingName);
-  int32_t GetValue();
-  static CBC_CommonCharacterSetECI* GetCharacterSetECIByValue(int32_t value);
-  static CBC_CommonCharacterSetECI* GetCharacterSetECIByName(
-      const CFX_ByteString& name);
-
- private:
-  CFX_ByteString m_encodingName;
-  static void initialize();
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONCHARACTERSETECI_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp
deleted file mode 100644
index a4ad0c4..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_CommonDecoderResult::CBC_CommonDecoderResult() {}
-void CBC_CommonDecoderResult::Init(const CFX_ByteArray& rawBytes,
-                                   const CFX_ByteString& text,
-                                   const CFX_Int32Array& byteSegments,
-                                   CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                   int32_t& e) {
-  if (text.IsEmpty()) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  m_rawBytes.Copy(rawBytes);
-  m_text = text;
-  m_byteSegments.Copy(byteSegments);
-  m_ecLevel = ecLevel;
-  m_other = NULL;
-}
-void CBC_CommonDecoderResult::Init(const CFX_ByteArray& rawBytes,
-                                   const CFX_ByteString& text,
-                                   const CFX_PtrArray& byteSegments,
-                                   const CFX_ByteString& ecLevel,
-                                   int32_t& e) {
-  if (text.IsEmpty()) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  m_rawBytes.Copy(rawBytes);
-  m_text = text;
-  m_pdf417byteSegments.Copy(byteSegments);
-  m_pdf417ecLevel = ecLevel;
-  m_other = NULL;
-}
-void CBC_CommonDecoderResult::setOther(CBC_PDF417ResultMetadata* other) {
-  m_other = other;
-}
-CBC_CommonDecoderResult::~CBC_CommonDecoderResult() {
-  delete m_other;
-}
-const CFX_ByteArray& CBC_CommonDecoderResult::GetRawBytes() {
-  return m_rawBytes;
-}
-const CFX_Int32Array& CBC_CommonDecoderResult::GetByteSegments() {
-  return m_byteSegments;
-}
-const CFX_ByteString& CBC_CommonDecoderResult::GetText() {
-  return m_text;
-}
-CBC_QRCoderErrorCorrectionLevel* CBC_CommonDecoderResult::GetECLevel() {
-  return m_ecLevel;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h
deleted file mode 100644
index 185f38d..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_PDF417ResultMetadata;
-
-class CBC_CommonDecoderResult {
- public:
-  CBC_CommonDecoderResult();
-  virtual ~CBC_CommonDecoderResult();
-  const CFX_ByteArray& GetRawBytes();
-  const CFX_ByteString& GetText();
-  const CFX_Int32Array& GetByteSegments();
-  CBC_QRCoderErrorCorrectionLevel* GetECLevel();
-  virtual void Init(const CFX_ByteArray& rawBytes,
-                    const CFX_ByteString& text,
-                    const CFX_Int32Array& byteSegments,
-                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                    int32_t& e);
-  virtual void Init(const CFX_ByteArray& rawBytes,
-                    const CFX_ByteString& text,
-                    const CFX_PtrArray& byteSegments,
-                    const CFX_ByteString& ecLevel,
-                    int32_t& e);
-  void setOther(CBC_PDF417ResultMetadata* other);
-
- private:
-  CFX_ByteArray m_rawBytes;
-  CFX_ByteString m_text;
-  CFX_Int32Array m_byteSegments;
-  CFX_PtrArray m_pdf417byteSegments;
-  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
-  CFX_ByteString m_pdf417ecLevel;
-  CBC_PDF417ResultMetadata* m_other;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONDECODERRESULT_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonECI.cpp b/xfa/src/fxbarcode/common/BC_CommonECI.cpp
deleted file mode 100644
index 146c9e2..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonECI.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h"
-#include "xfa/src/fxbarcode/common/BC_CommonECI.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_CommonECI::CBC_CommonECI(int32_t value) {
-  m_value = value;
-}
-CBC_CommonECI::~CBC_CommonECI() {}
-int32_t CBC_CommonECI::GetValue() {
-  return m_value;
-}
-CBC_CommonECI* CBC_CommonECI::GetEICByValue(int32_t value, int32_t& e) {
-  if (value < 0 || value > 999999) {
-    e = BCExceptionBadECI;
-    return NULL;
-  }
-  if (value < 900) {
-  }
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonECI.h b/xfa/src/fxbarcode/common/BC_CommonECI.h
deleted file mode 100644
index e0dc797..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonECI.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONECI_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONECI_H_
-
-#include <stdint.h>
-
-class CBC_CommonECI {
- public:
-  CBC_CommonECI(int32_t value);
-  virtual ~CBC_CommonECI();
-
-  int32_t GetValue();
-  static CBC_CommonECI* GetEICByValue(int32_t value, int32_t& e);
-
- private:
-  int32_t m_value;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONECI_H_
diff --git a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
deleted file mode 100644
index 897d953..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h"
-
-#include <memory>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11,
-                                                               FX_FLOAT a21,
-                                                               FX_FLOAT a31,
-                                                               FX_FLOAT a12,
-                                                               FX_FLOAT a22,
-                                                               FX_FLOAT a32,
-                                                               FX_FLOAT a13,
-                                                               FX_FLOAT a23,
-                                                               FX_FLOAT a33)
-    : m_a11(a11),
-      m_a12(a12),
-      m_a13(a13),
-      m_a21(a21),
-      m_a22(a22),
-      m_a23(a23),
-      m_a31(a31),
-      m_a32(a32),
-      m_a33(a33) {
-}
-CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() {}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0,
-                                                             FX_FLOAT y0,
-                                                             FX_FLOAT x1,
-                                                             FX_FLOAT y1,
-                                                             FX_FLOAT x2,
-                                                             FX_FLOAT y2,
-                                                             FX_FLOAT x3,
-                                                             FX_FLOAT y3,
-                                                             FX_FLOAT x0p,
-                                                             FX_FLOAT y0p,
-                                                             FX_FLOAT x1p,
-                                                             FX_FLOAT y1p,
-                                                             FX_FLOAT x2p,
-                                                             FX_FLOAT y2p,
-                                                             FX_FLOAT x3p,
-                                                             FX_FLOAT y3p) {
-  std::unique_ptr<CBC_CommonPerspectiveTransform> qToS(
-      QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3));
-  std::unique_ptr<CBC_CommonPerspectiveTransform> sToQ(
-      SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p));
-  return sToQ->Times(*(qToS.get()));
-}
-void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray* points) {
-  int32_t max = points->GetSize();
-  FX_FLOAT a11 = m_a11;
-  FX_FLOAT a12 = m_a12;
-  FX_FLOAT a13 = m_a13;
-  FX_FLOAT a21 = m_a21;
-  FX_FLOAT a22 = m_a22;
-  FX_FLOAT a23 = m_a23;
-  FX_FLOAT a31 = m_a31;
-  FX_FLOAT a32 = m_a32;
-  FX_FLOAT a33 = m_a33;
-  int32_t i;
-  for (i = 0; i < max; i += 2) {
-    FX_FLOAT x = (*points)[i];
-    FX_FLOAT y = (*points)[i + 1];
-    FX_FLOAT denominator = a13 * x + a23 * y + a33;
-    (*points)[i] = (a11 * x + a21 * y + a31) / denominator;
-    (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator;
-  }
-}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0,
-                                                      FX_FLOAT y0,
-                                                      FX_FLOAT x1,
-                                                      FX_FLOAT y1,
-                                                      FX_FLOAT x2,
-                                                      FX_FLOAT y2,
-                                                      FX_FLOAT x3,
-                                                      FX_FLOAT y3) {
-  FX_FLOAT dy2 = y3 - y2;
-  FX_FLOAT dy3 = y0 - y1 + y2 - y3;
-  if ((dy2 == 0.0f) && (dy3 == 0.0f)) {
-    return new CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0,
-                                              y2 - y1, y0, 0.0f, 0.0f, 1.0f);
-  } else {
-    FX_FLOAT dx1 = x1 - x2;
-    FX_FLOAT dx2 = x3 - x2;
-    FX_FLOAT dx3 = x0 - x1 + x2 - x3;
-    FX_FLOAT dy1 = y1 - y2;
-    FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1;
-    FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator;
-    FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator;
-    return new CBC_CommonPerspectiveTransform(
-        x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1,
-        y3 - y0 + a23 * y3, y0, a13, a23, 1.0f);
-  }
-}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0,
-                                                      FX_FLOAT y0,
-                                                      FX_FLOAT x1,
-                                                      FX_FLOAT y1,
-                                                      FX_FLOAT x2,
-                                                      FX_FLOAT y2,
-                                                      FX_FLOAT x3,
-                                                      FX_FLOAT y3) {
-  std::unique_ptr<CBC_CommonPerspectiveTransform> temp1(
-      SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3));
-  return temp1->BuildAdjoint();
-}
-CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::BuildAdjoint() {
-  return new CBC_CommonPerspectiveTransform(
-      m_a22 * m_a33 - m_a23 * m_a32, m_a23 * m_a31 - m_a21 * m_a33,
-      m_a21 * m_a32 - m_a22 * m_a31, m_a13 * m_a32 - m_a12 * m_a33,
-      m_a11 * m_a33 - m_a13 * m_a31, m_a12 * m_a31 - m_a11 * m_a32,
-      m_a12 * m_a23 - m_a13 * m_a22, m_a13 * m_a21 - m_a11 * m_a23,
-      m_a11 * m_a22 - m_a12 * m_a21);
-}
-CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::Times(
-    CBC_CommonPerspectiveTransform& other) {
-  return new CBC_CommonPerspectiveTransform(
-      m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13,
-      m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23,
-      m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33,
-      m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13,
-      m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23,
-      m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33,
-      m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13,
-      m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23,
-      m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33);
-}
diff --git a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h
deleted file mode 100644
index dfe0ce1..0000000
--- a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonPerspectiveTransform {
- public:
-  CBC_CommonPerspectiveTransform(FX_FLOAT a11,
-                                 FX_FLOAT a21,
-                                 FX_FLOAT a31,
-                                 FX_FLOAT a12,
-                                 FX_FLOAT a22,
-                                 FX_FLOAT a32,
-                                 FX_FLOAT a13,
-                                 FX_FLOAT a23,
-                                 FX_FLOAT a33);
-  virtual ~CBC_CommonPerspectiveTransform();
-  static CBC_CommonPerspectiveTransform* QuadrilateralToQuadrilateral(
-      FX_FLOAT x0,
-      FX_FLOAT y0,
-      FX_FLOAT x1,
-      FX_FLOAT y1,
-      FX_FLOAT x2,
-      FX_FLOAT y2,
-      FX_FLOAT x3,
-      FX_FLOAT y3,
-      FX_FLOAT x0p,
-      FX_FLOAT y0p,
-      FX_FLOAT x1p,
-      FX_FLOAT y1p,
-      FX_FLOAT x2p,
-      FX_FLOAT y2p,
-      FX_FLOAT x3p,
-      FX_FLOAT y3p);
-  static CBC_CommonPerspectiveTransform* SquareToQuadrilateral(FX_FLOAT x0,
-                                                               FX_FLOAT y0,
-                                                               FX_FLOAT x1,
-                                                               FX_FLOAT y1,
-                                                               FX_FLOAT x2,
-                                                               FX_FLOAT y2,
-                                                               FX_FLOAT x3,
-                                                               FX_FLOAT y3);
-  static CBC_CommonPerspectiveTransform* QuadrilateralToSquare(FX_FLOAT x0,
-                                                               FX_FLOAT y0,
-                                                               FX_FLOAT x1,
-                                                               FX_FLOAT y1,
-                                                               FX_FLOAT x2,
-                                                               FX_FLOAT y2,
-                                                               FX_FLOAT x3,
-                                                               FX_FLOAT y3);
-  CBC_CommonPerspectiveTransform* BuildAdjoint();
-  CBC_CommonPerspectiveTransform* Times(CBC_CommonPerspectiveTransform& other);
-  void TransformPoints(CFX_FloatArray* points);
-
- private:
-  FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
diff --git a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp
deleted file mode 100644
index 8babc9c..0000000
--- a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t LUMINANCE_BITS = 5;
-const int32_t LUMINANCE_SHIFT = 8 - LUMINANCE_BITS;
-const int32_t LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS;
-
-CBC_GlobalHistogramBinarizer::CBC_GlobalHistogramBinarizer(
-    CBC_LuminanceSource* source)
-    : CBC_Binarizer(source) {}
-CBC_GlobalHistogramBinarizer::~CBC_GlobalHistogramBinarizer() {}
-CBC_CommonBitArray* CBC_GlobalHistogramBinarizer::GetBlackRow(
-    int32_t y,
-    CBC_CommonBitArray* row,
-    int32_t& e) {
-  CBC_LuminanceSource* source = GetLuminanceSource();
-  int32_t width = source->GetWidth();
-  std::unique_ptr<CBC_CommonBitArray> result(new CBC_CommonBitArray(width));
-  InitArrays(width);
-  CFX_ByteArray* localLuminances = source->GetRow(y, m_luminance, e);
-  if (e != BCExceptionNO) {
-    return result.release();
-  }
-  CFX_Int32Array localBuckets;
-  localBuckets.Copy(m_buckets);
-  int32_t x;
-  for (x = 0; x < width; x++) {
-    int32_t pixel = (*localLuminances)[x] & 0xff;
-    localBuckets[pixel >> LUMINANCE_SHIFT]++;
-  }
-  int32_t blackPoint = EstimateBlackPoint(localBuckets, e);
-  if (e != BCExceptionNO) {
-    return result.release();
-  }
-  int32_t left = (*localLuminances)[0] & 0xff;
-  int32_t center = (*localLuminances)[1] & 0xff;
-  for (x = 1; x < width - 1; x++) {
-    int32_t right = (*localLuminances)[x + 1] & 0xff;
-    int32_t luminance = ((center << 2) - left - right) >> 1;
-    if (luminance < blackPoint) {
-      result->Set(x);
-    }
-    left = center;
-    center = right;
-  }
-  return result.release();
-}
-CBC_CommonBitMatrix* CBC_GlobalHistogramBinarizer::GetBlackMatrix(int32_t& e) {
-  CBC_LuminanceSource* source = GetLuminanceSource();
-  int32_t width = source->GetWidth();
-  int32_t height = source->GetHeight();
-  std::unique_ptr<CBC_CommonBitMatrix> matrix(new CBC_CommonBitMatrix());
-  matrix->Init(width, height);
-  InitArrays(width);
-  CFX_Int32Array localBuckets;
-  localBuckets.Copy(m_buckets);
-  int32_t y;
-  for (y = 1; y < 5; y++) {
-    int32_t row = height * y / 5;
-    CFX_ByteArray* localLuminances = source->GetRow(row, m_luminance, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    int32_t right = (width << 2) / 5;
-    int32_t x;
-    for (x = width / 5; x < right; x++) {
-      int32_t pixel = (*localLuminances)[x] & 0xff;
-      localBuckets[pixel >> LUMINANCE_SHIFT]++;
-    }
-  }
-  int32_t blackPoint = EstimateBlackPoint(localBuckets, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CFX_ByteArray> localLuminances(source->GetMatrix());
-  for (y = 0; y < height; y++) {
-    int32_t offset = y * width;
-    for (int32_t x = 0; x < width; x++) {
-      int32_t pixel = (*localLuminances)[offset + x] & 0xff;
-      if (pixel < blackPoint) {
-        matrix->Set(x, y);
-      }
-    }
-  }
-  return matrix.release();
-}
-void CBC_GlobalHistogramBinarizer::InitArrays(int32_t luminanceSize) {
-  if (m_luminance.GetSize() < luminanceSize) {
-    m_luminance.SetSize(luminanceSize);
-  }
-  if (m_buckets.GetSize() <= 0) {
-    m_buckets.SetSize(LUMINANCE_BUCKETS);
-  } else {
-    int32_t x;
-    for (x = 0; x < LUMINANCE_BUCKETS; x++) {
-      m_buckets[x] = 0;
-    }
-  }
-}
-int32_t CBC_GlobalHistogramBinarizer::EstimateBlackPoint(
-    CFX_Int32Array& buckets,
-    int32_t& e) {
-  int32_t numBuckets = buckets.GetSize();
-  int32_t maxBucketCount = 0;
-  int32_t firstPeak = 0;
-  int32_t firstPeakSize = 0;
-  int32_t x;
-  for (x = 0; x < numBuckets; x++) {
-    if (buckets[x] > firstPeakSize) {
-      firstPeak = x;
-      firstPeakSize = buckets[x];
-    }
-    if (buckets[x] > maxBucketCount) {
-      maxBucketCount = buckets[x];
-    }
-  }
-  int32_t secondPeak = 0;
-  int32_t secondPeakScore = 0;
-  for (x = 0; x < numBuckets; x++) {
-    int32_t distanceToBiggest = x - firstPeak;
-    int32_t score = buckets[x] * distanceToBiggest * distanceToBiggest;
-    if (score > secondPeakScore) {
-      secondPeak = x;
-      secondPeakScore = score;
-    }
-  }
-  if (firstPeak > secondPeak) {
-    int32_t temp = firstPeak;
-    firstPeak = secondPeak;
-    secondPeak = temp;
-  }
-  if (secondPeak - firstPeak <= numBuckets >> 4) {
-    e = BCExceptionRead;
-    return 0;
-  }
-  int32_t bestValley = secondPeak - 1;
-  int32_t bestValleyScore = -1;
-  for (x = secondPeak - 1; x > firstPeak; x--) {
-    int32_t fromFirst = x - firstPeak;
-    int32_t score = fromFirst * fromFirst * (secondPeak - x) *
-                    (maxBucketCount - buckets[x]);
-    if (score > bestValleyScore) {
-      bestValley = x;
-      bestValleyScore = score;
-    }
-  }
-  return bestValley << LUMINANCE_SHIFT;
-}
diff --git a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h
deleted file mode 100644
index 56c2794..0000000
--- a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-
-class CBC_CommonBitArray;
-class CBC_CommonBitMatrix;
-class CBC_LuminanceSource;
-
-class CBC_GlobalHistogramBinarizer : public CBC_Binarizer {
- public:
-  CBC_GlobalHistogramBinarizer(CBC_LuminanceSource* source);
-  virtual ~CBC_GlobalHistogramBinarizer();
-
-  void InitArrays(int32_t luminanceSize);
-  CBC_CommonBitMatrix* GetBlackMatrix(int32_t& e);
-  CBC_CommonBitArray* GetBlackRow(int32_t y,
-                                  CBC_CommonBitArray* row,
-                                  int32_t& e);
-  static int32_t EstimateBlackPoint(CFX_Int32Array& buckets, int32_t& e);
-
- private:
-  CFX_ByteArray m_luminance;
-  CFX_Int32Array m_buckets;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_GLOBALHISTOGRAMBINARIZER_H_
diff --git a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp
deleted file mode 100644
index 4e33691..0000000
--- a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2010 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(
-    CBC_CommonBitMatrix* image) {
-  m_image = image;
-  m_height = image->GetHeight();
-  m_width = image->GetWidth();
-  m_leftInit = (m_width - INIT_SIZE) >> 1;
-  m_rightInit = (m_width + INIT_SIZE) >> 1;
-  m_upInit = (m_height - INIT_SIZE) >> 1;
-  m_downInit = (m_height + INIT_SIZE) >> 1;
-}
-void CBC_WhiteRectangleDetector::Init(int32_t& e) {
-  if (m_upInit < 0 || m_leftInit < 0 || m_downInit >= m_height ||
-      m_rightInit >= m_width) {
-    e = BCExceptionNotFound;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(
-    CBC_CommonBitMatrix* image,
-    int32_t initSize,
-    int32_t x,
-    int32_t y) {
-  m_image = image;
-  m_height = image->GetHeight();
-  m_width = image->GetWidth();
-  int32_t halfsize = initSize >> 1;
-  m_leftInit = x - halfsize;
-  m_rightInit = x + halfsize;
-  m_upInit = y - halfsize;
-  m_downInit = y + halfsize;
-}
-CBC_WhiteRectangleDetector::~CBC_WhiteRectangleDetector() {}
-CFX_PtrArray* CBC_WhiteRectangleDetector::Detect(int32_t& e) {
-  int32_t left = m_leftInit;
-  int32_t right = m_rightInit;
-  int32_t up = m_upInit;
-  int32_t down = m_downInit;
-  FX_BOOL sizeExceeded = FALSE;
-  FX_BOOL aBlackPointFoundOnBorder = TRUE;
-  FX_BOOL atLeastOneBlackPointFoundOnBorder = FALSE;
-  while (aBlackPointFoundOnBorder) {
-    aBlackPointFoundOnBorder = FALSE;
-    FX_BOOL rightBorderNotWhite = TRUE;
-    while (rightBorderNotWhite && right < m_width) {
-      rightBorderNotWhite = ContainsBlackPoint(up, down, right, FALSE);
-      if (rightBorderNotWhite) {
-        right++;
-        aBlackPointFoundOnBorder = TRUE;
-      }
-    }
-    if (right >= m_width) {
-      sizeExceeded = TRUE;
-      break;
-    }
-    FX_BOOL bottomBorderNotWhite = TRUE;
-    while (bottomBorderNotWhite && down < m_height) {
-      bottomBorderNotWhite = ContainsBlackPoint(left, right, down, TRUE);
-      if (bottomBorderNotWhite) {
-        down++;
-        aBlackPointFoundOnBorder = TRUE;
-      }
-    }
-    if (down >= m_height) {
-      sizeExceeded = TRUE;
-      break;
-    }
-    FX_BOOL leftBorderNotWhite = TRUE;
-    while (leftBorderNotWhite && left >= 0) {
-      leftBorderNotWhite = ContainsBlackPoint(up, down, left, FALSE);
-      if (leftBorderNotWhite) {
-        left--;
-        aBlackPointFoundOnBorder = TRUE;
-      }
-    }
-    if (left < 0) {
-      sizeExceeded = TRUE;
-      break;
-    }
-    FX_BOOL topBorderNotWhite = TRUE;
-    while (topBorderNotWhite && up >= 0) {
-      topBorderNotWhite = ContainsBlackPoint(left, right, up, TRUE);
-      if (topBorderNotWhite) {
-        up--;
-        aBlackPointFoundOnBorder = TRUE;
-      }
-    }
-    if (up < 0) {
-      sizeExceeded = TRUE;
-      break;
-    }
-    if (aBlackPointFoundOnBorder) {
-      atLeastOneBlackPointFoundOnBorder = TRUE;
-    }
-  }
-  if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) {
-    int32_t maxSize = right - left;
-    std::unique_ptr<CBC_ResultPoint> z;
-    for (int32_t i = 1; i < maxSize; i++) {
-      z.reset(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(down - i),
-                                     (FX_FLOAT)(left + i), (FX_FLOAT)(down)));
-      if (z)
-        break;
-    }
-    if (z.get() == NULL) {
-      e = BCExceptionNotFound;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    std::unique_ptr<CBC_ResultPoint> t;
-    for (int32_t j = 1; j < maxSize; j++) {
-      t.reset(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(up + j),
-                                     (FX_FLOAT)(left + j), (FX_FLOAT)up));
-      if (t)
-        break;
-    }
-    if (t.get() == NULL) {
-      e = BCExceptionNotFound;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    std::unique_ptr<CBC_ResultPoint> x;
-    for (int32_t k = 1; k < maxSize; k++) {
-      x.reset(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(up + k),
-                                     (FX_FLOAT)(right - k), (FX_FLOAT)up));
-      if (x)
-        break;
-    }
-    if (x.get() == NULL) {
-      e = BCExceptionNotFound;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    std::unique_ptr<CBC_ResultPoint> y;
-    for (int32_t m = 1; m < maxSize; m++) {
-      y.reset(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(down - m),
-                                     (FX_FLOAT)(right - m), (FX_FLOAT)down));
-      if (y)
-        break;
-    }
-    if (y.get() == NULL) {
-      e = BCExceptionNotFound;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    return CenterEdges(y.get(), z.get(), x.get(), t.get());
-  } else {
-    e = BCExceptionNotFound;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return NULL;
-}
-int32_t CBC_WhiteRectangleDetector::Round(FX_FLOAT d) {
-  return (int32_t)(d + 0.5f);
-}
-CBC_ResultPoint* CBC_WhiteRectangleDetector::GetBlackPointOnSegment(
-    FX_FLOAT aX,
-    FX_FLOAT aY,
-    FX_FLOAT bX,
-    FX_FLOAT bY) {
-  int32_t dist = DistanceL2(aX, aY, bX, bY);
-  float xStep = (bX - aX) / dist;
-  float yStep = (bY - aY) / dist;
-  for (int32_t i = 0; i < dist; i++) {
-    int32_t x = Round(aX + i * xStep);
-    int32_t y = Round(aY + i * yStep);
-    if (m_image->Get(x, y)) {
-      return new CBC_ResultPoint((FX_FLOAT)x, (FX_FLOAT)y);
-    }
-  }
-  return NULL;
-}
-int32_t CBC_WhiteRectangleDetector::DistanceL2(FX_FLOAT aX,
-                                               FX_FLOAT aY,
-                                               FX_FLOAT bX,
-                                               FX_FLOAT bY) {
-  float xDiff = aX - bX;
-  float yDiff = aY - bY;
-  return Round((float)sqrt(xDiff * xDiff + yDiff * yDiff));
-}
-CFX_PtrArray* CBC_WhiteRectangleDetector::CenterEdges(CBC_ResultPoint* y,
-                                                      CBC_ResultPoint* z,
-                                                      CBC_ResultPoint* x,
-                                                      CBC_ResultPoint* t) {
-  float yi = y->GetX();
-  float yj = y->GetY();
-  float zi = z->GetX();
-  float zj = z->GetY();
-  float xi = x->GetX();
-  float xj = x->GetY();
-  float ti = t->GetX();
-  float tj = t->GetY();
-  if (yi < m_width / 2) {
-    CFX_PtrArray* result = new CFX_PtrArray;
-    result->SetSize(4);
-    (*result)[0] = new CBC_ResultPoint(ti - CORR, tj + CORR);
-    (*result)[1] = new CBC_ResultPoint(zi + CORR, zj + CORR);
-    (*result)[2] = new CBC_ResultPoint(xi - CORR, xj - CORR);
-    (*result)[3] = new CBC_ResultPoint(yi + CORR, yj - CORR);
-    return result;
-  } else {
-    CFX_PtrArray* result = new CFX_PtrArray;
-    result->SetSize(4);
-    (*result)[0] = new CBC_ResultPoint(ti + CORR, tj + CORR);
-    (*result)[1] = new CBC_ResultPoint(zi + CORR, zj - CORR);
-    (*result)[2] = new CBC_ResultPoint(xi - CORR, xj + CORR);
-    (*result)[3] = new CBC_ResultPoint(yi - CORR, yj - CORR);
-    return result;
-  }
-}
-FX_BOOL CBC_WhiteRectangleDetector::ContainsBlackPoint(int32_t a,
-                                                       int32_t b,
-                                                       int32_t fixed,
-                                                       FX_BOOL horizontal) {
-  if (horizontal) {
-    for (int32_t x = a; x <= b; x++) {
-      if (m_image->Get(x, fixed)) {
-        return TRUE;
-      }
-    }
-  } else {
-    for (int32_t y = a; y <= b; y++) {
-      if (m_image->Get(fixed, y)) {
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
diff --git a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h
deleted file mode 100644
index 4af04ac..0000000
--- a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
-#define XFA_SRC_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_ResultPoint;
-
-class CBC_WhiteRectangleDetector {
- public:
-  CBC_WhiteRectangleDetector(CBC_CommonBitMatrix* image);
-  CBC_WhiteRectangleDetector(CBC_CommonBitMatrix* image,
-                             int32_t initSize,
-                             int32_t x,
-                             int32_t y);
-  virtual ~CBC_WhiteRectangleDetector();
-  CFX_PtrArray* Detect(int32_t& e);
-  virtual void Init(int32_t& e);
-
- private:
-  int32_t Round(float d);
-  CBC_ResultPoint* GetBlackPointOnSegment(FX_FLOAT aX,
-                                          FX_FLOAT aY,
-                                          FX_FLOAT bX,
-                                          FX_FLOAT bY);
-  int32_t DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY);
-  CFX_PtrArray* CenterEdges(CBC_ResultPoint* y,
-                            CBC_ResultPoint* z,
-                            CBC_ResultPoint* x,
-                            CBC_ResultPoint* t);
-  FX_BOOL ContainsBlackPoint(int32_t a,
-                             int32_t b,
-                             int32_t fixed,
-                             FX_BOOL horizontal);
-
-  static const int32_t INIT_SIZE = 30;
-  static const int32_t CORR = 1;
-
-  CBC_CommonBitMatrix* m_image;
-  int32_t m_height;
-  int32_t m_width;
-  int32_t m_leftInit;
-  int32_t m_rightInit;
-  int32_t m_downInit;
-  int32_t m_upInit;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_BC_WHITERECTANGLEDETECTOR_H_
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
deleted file mode 100644
index 3e6de6e..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
-
-CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) {
-  m_field = field;
-}
-void CBC_ReedSolomonEncoder::Init() {
-  m_cachedGenerators.Add(new CBC_ReedSolomonGF256Poly(m_field, 1));
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(int32_t degree,
-                                                                 int32_t& e) {
-  if (degree >= m_cachedGenerators.GetSize()) {
-    CBC_ReedSolomonGF256Poly* lastGenerator =
-        (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators
-                                        [m_cachedGenerators.GetSize() - 1]);
-    for (int32_t d = m_cachedGenerators.GetSize(); d <= degree; d++) {
-      CFX_Int32Array temp;
-      temp.Add(1);
-      temp.Add(m_field->Exp(d - 1));
-      CBC_ReedSolomonGF256Poly temp_poly;
-      temp_poly.Init(m_field, &temp, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      CBC_ReedSolomonGF256Poly* nextGenerator =
-          lastGenerator->Multiply(&temp_poly, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      m_cachedGenerators.Add(nextGenerator);
-      lastGenerator = nextGenerator;
-    }
-  }
-  return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]);
-}
-void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array* toEncode,
-                                    int32_t ecBytes,
-                                    int32_t& e) {
-  if (ecBytes == 0) {
-    e = BCExceptionNoCorrectionBytes;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t dataBytes = toEncode->GetSize() - ecBytes;
-  if (dataBytes <= 0) {
-    e = BCExceptionNoDataBytesProvided;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CFX_Int32Array infoCoefficients;
-  infoCoefficients.SetSize(dataBytes);
-  for (int32_t x = 0; x < dataBytes; x++) {
-    infoCoefficients[x] = toEncode->operator[](x);
-  }
-  CBC_ReedSolomonGF256Poly info;
-  info.Init(m_field, &infoCoefficients, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> infoTemp(
-      info.MultiplyByMonomial(ecBytes, 1, e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CFX_PtrArray> temp(infoTemp->Divide(generator, e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CBC_ReedSolomonGF256Poly* remainder =
-      (CBC_ReedSolomonGF256Poly*)(temp->operator[](1));
-  CFX_Int32Array* coefficients = remainder->GetCoefficients();
-  int32_t numZeroCoefficients = ecBytes - coefficients->GetSize();
-  for (int32_t i = 0; i < numZeroCoefficients; i++) {
-    (*toEncode)[dataBytes + i] = 0;
-  }
-  for (int32_t y = 0; y < coefficients->GetSize(); y++) {
-    (*toEncode)[dataBytes + numZeroCoefficients + y] =
-        coefficients->operator[](y);
-  }
-  for (int32_t k = 0; k < temp->GetSize(); k++) {
-    delete (CBC_ReedSolomonGF256Poly*)(*temp)[k];
-  }
-}
-CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() {
-  for (int32_t i = 0; i < m_cachedGenerators.GetSize(); i++) {
-    delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i];
-  }
-}
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
deleted file mode 100644
index 71eacc5..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
-#define XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_ReedSolomonGF256;
-class CBC_ReedSolomonGF256Poly;
-
-class CBC_ReedSolomonEncoder {
- private:
-  CBC_ReedSolomonGF256* m_field;
-  CFX_PtrArray m_cachedGenerators;
-  CBC_ReedSolomonGF256Poly* BuildGenerator(int32_t degree, int32_t& e);
-
- public:
-  CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field);
-  virtual ~CBC_ReedSolomonEncoder();
-
-  void Encode(CFX_Int32Array* toEncode, int32_t ecBytes, int32_t& e);
-  virtual void Init();
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMON_H_
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp
deleted file mode 100644
index abdcaf0..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
-
-#include <memory>
-#include <utility>
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
-
-CBC_ReedSolomonDecoder::CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field) {
-  m_field = field;
-}
-CBC_ReedSolomonDecoder::~CBC_ReedSolomonDecoder() {}
-void CBC_ReedSolomonDecoder::Decode(CFX_Int32Array* received,
-                                    int32_t twoS,
-                                    int32_t& e) {
-  CBC_ReedSolomonGF256Poly poly;
-  poly.Init(m_field, received, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CFX_Int32Array syndromeCoefficients;
-  syndromeCoefficients.SetSize(twoS);
-  FX_BOOL dataMatrix = FALSE;
-  FX_BOOL noError = TRUE;
-  for (int32_t i = 0; i < twoS; i++) {
-    int32_t eval = poly.EvaluateAt(m_field->Exp(dataMatrix ? i + 1 : i));
-    syndromeCoefficients[twoS - 1 - i] = eval;
-    if (eval != 0) {
-      noError = FALSE;
-    }
-  }
-  if (noError) {
-    return;
-  }
-  CBC_ReedSolomonGF256Poly syndrome;
-  syndrome.Init(m_field, &syndromeCoefficients, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> temp(
-      m_field->BuildMonomial(twoS, 1, e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CFX_PtrArray> sigmaOmega(
-      RunEuclideanAlgorithm(temp.get(), &syndrome, twoS, e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> sigma(
-      (CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[0]);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> omega(
-      (CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[1]);
-  std::unique_ptr<CFX_Int32Array> errorLocations(
-      FindErrorLocations(sigma.get(), e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CFX_Int32Array> errorMagnitudes(
-      FindErrorMagnitudes(omega.get(), errorLocations.get(), dataMatrix, e));
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  for (int32_t k = 0; k < errorLocations->GetSize(); k++) {
-    int32_t position =
-        received->GetSize() - 1 - m_field->Log((*errorLocations)[k], e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (position < 0) {
-      e = BCExceptionBadErrorLocation;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    (*received)[position] = CBC_ReedSolomonGF256::AddOrSubtract(
-        (*received)[position], (*errorMagnitudes)[k]);
-  }
-}
-CFX_PtrArray* CBC_ReedSolomonDecoder::RunEuclideanAlgorithm(
-    CBC_ReedSolomonGF256Poly* a,
-    CBC_ReedSolomonGF256Poly* b,
-    int32_t R,
-    int32_t& e) {
-  if (a->GetDegree() < b->GetDegree()) {
-    CBC_ReedSolomonGF256Poly* temp = a;
-    a = b;
-    b = temp;
-  }
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> rLast(a->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> r(b->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> sLast(m_field->GetOne()->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> s(m_field->GetZero()->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> tLast(m_field->GetZero()->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> t(m_field->GetOne()->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  while (r->GetDegree() >= R / 2) {
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> rLastLast = std::move(rLast);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> sLastLast = std::move(sLast);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> tLastlast = std::move(tLast);
-    rLast = std::move(r);
-    sLast = std::move(s);
-    tLast = std::move(t);
-    if (rLast->IsZero()) {
-      e = BCExceptionR_I_1IsZero;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    r.reset(rLastLast->Clone(e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> q(m_field->GetZero()->Clone(e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    int32_t denominatorLeadingTerm = rLast->GetCoefficients(rLast->GetDegree());
-    int32_t dltInverse = m_field->Inverse(denominatorLeadingTerm, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    while (r->GetDegree() >= rLast->GetDegree() && !(r->IsZero())) {
-      int32_t degreeDiff = r->GetDegree() - rLast->GetDegree();
-      int32_t scale =
-          m_field->Multiply(r->GetCoefficients(r->GetDegree()), dltInverse);
-      std::unique_ptr<CBC_ReedSolomonGF256Poly> build(
-          m_field->BuildMonomial(degreeDiff, scale, e));
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      q.reset(q->AddOrSubtract(build.get(), e));
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      std::unique_ptr<CBC_ReedSolomonGF256Poly> multiply(
-          rLast->MultiplyByMonomial(degreeDiff, scale, e));
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      r.reset(r->AddOrSubtract(multiply.get(), e));
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> temp1(
-        q->Multiply(sLast.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    s.reset(temp1->AddOrSubtract(sLastLast.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> temp5(
-        q->Multiply(tLast.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    t.reset(temp5->AddOrSubtract(tLastlast.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  int32_t sigmaTildeAtZero = t->GetCoefficients(0);
-  if (sigmaTildeAtZero == 0) {
-    e = BCExceptionIsZero;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  int32_t inverse = m_field->Inverse(sigmaTildeAtZero, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> sigma(t->Multiply(inverse, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> omega(r->Multiply(inverse, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* temp = new CFX_PtrArray;
-  temp->Add(sigma.release());
-  temp->Add(omega.release());
-  return temp;
-}
-CFX_Int32Array* CBC_ReedSolomonDecoder::FindErrorLocations(
-    CBC_ReedSolomonGF256Poly* errorLocator,
-    int32_t& e) {
-  int32_t numErrors = errorLocator->GetDegree();
-  if (numErrors == 1) {
-    std::unique_ptr<CFX_Int32Array> temp(new CFX_Int32Array);
-    temp->Add(errorLocator->GetCoefficients(1));
-    return temp.release();
-  }
-  CFX_Int32Array* tempT = new CFX_Int32Array;
-  tempT->SetSize(numErrors);
-  std::unique_ptr<CFX_Int32Array> result(tempT);
-  int32_t ie = 0;
-  for (int32_t i = 1; i < 256 && ie < numErrors; i++) {
-    if (errorLocator->EvaluateAt(i) == 0) {
-      (*result)[ie] = m_field->Inverse(i, ie);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      ie++;
-    }
-  }
-  if (ie != numErrors) {
-    e = BCExceptionDegreeNotMatchRoots;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return result.release();
-}
-CFX_Int32Array* CBC_ReedSolomonDecoder::FindErrorMagnitudes(
-    CBC_ReedSolomonGF256Poly* errorEvaluator,
-    CFX_Int32Array* errorLocations,
-    FX_BOOL dataMatrix,
-    int32_t& e) {
-  int32_t s = errorLocations->GetSize();
-  CFX_Int32Array* temp = new CFX_Int32Array;
-  temp->SetSize(s);
-  std::unique_ptr<CFX_Int32Array> result(temp);
-  for (int32_t i = 0; i < s; i++) {
-    int32_t xiInverse = m_field->Inverse(errorLocations->operator[](i), e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    int32_t denominator = 1;
-    for (int32_t j = 0; j < s; j++) {
-      if (i != j) {
-        denominator = m_field->Multiply(
-            denominator, CBC_ReedSolomonGF256::AddOrSubtract(
-                             1, m_field->Multiply(errorLocations->operator[](j),
-                                                  xiInverse)));
-      }
-    }
-    int32_t temp = m_field->Inverse(denominator, temp);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    (*result)[i] =
-        m_field->Multiply(errorEvaluator->EvaluateAt(xiInverse), temp);
-  }
-  return result.release();
-}
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h
deleted file mode 100644
index 092033c..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
-#define XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_ReedSolomonGF256;
-class CBC_ReedSolomonGF256Poly;
-
-class CBC_ReedSolomonDecoder {
- private:
-  CBC_ReedSolomonGF256* m_field;
-
- public:
-  CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field);
-  virtual ~CBC_ReedSolomonDecoder();
-  void Decode(CFX_Int32Array* received, int32_t twoS, int32_t& e);
-  CFX_PtrArray* RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a,
-                                      CBC_ReedSolomonGF256Poly* b,
-                                      int32_t R,
-                                      int32_t& e);
-  CFX_Int32Array* FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator,
-                                     int32_t& e);
-  CFX_Int32Array* FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator,
-                                      CFX_Int32Array* errorLocations,
-                                      FX_BOOL dataMatrix,
-                                      int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONDECODER_H_
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
deleted file mode 100644
index e5002ce..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
-
-CBC_ReedSolomonGF256* CBC_ReedSolomonGF256::QRCodeFild = NULL;
-CBC_ReedSolomonGF256* CBC_ReedSolomonGF256::DataMatrixField = NULL;
-void CBC_ReedSolomonGF256::Initialize() {
-  QRCodeFild = new CBC_ReedSolomonGF256(0x011D);
-  QRCodeFild->Init();
-  DataMatrixField = new CBC_ReedSolomonGF256(0x012D);
-  DataMatrixField->Init();
-}
-void CBC_ReedSolomonGF256::Finalize() {
-  if (QRCodeFild) {
-    delete QRCodeFild;
-  }
-  QRCodeFild = NULL;
-  if (DataMatrixField) {
-    delete DataMatrixField;
-  }
-  DataMatrixField = NULL;
-}
-CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(int32_t primitive) {
-  int32_t x = 1;
-  for (int32_t j = 0; j < 256; j++) {
-    m_expTable[j] = x;
-    x <<= 1;
-    if (x >= 0x100) {
-      x ^= primitive;
-    }
-  }
-  for (int32_t i = 0; i < 255; i++) {
-    m_logTable[m_expTable[i]] = i;
-  }
-  m_logTable[0] = 0;
-}
-void CBC_ReedSolomonGF256::Init() {
-  m_zero = new CBC_ReedSolomonGF256Poly(this, 0);
-  m_one = new CBC_ReedSolomonGF256Poly(this, 1);
-}
-CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() {
-  delete m_zero;
-  delete m_one;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero() {
-  return m_zero;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne() {
-  return m_one;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(
-    int32_t degree,
-    int32_t coefficient,
-    int32_t& e) {
-  if (degree < 0) {
-    e = BCExceptionDegreeIsNegative;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  if (coefficient == 0) {
-    CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return temp;
-  }
-  CFX_Int32Array coefficients;
-  coefficients.SetSize(degree + 1);
-  coefficients[0] = coefficient;
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(this, &coefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-int32_t CBC_ReedSolomonGF256::AddOrSubtract(int32_t a, int32_t b) {
-  return a ^ b;
-}
-int32_t CBC_ReedSolomonGF256::Exp(int32_t a) {
-  return m_expTable[a];
-}
-int32_t CBC_ReedSolomonGF256::Log(int32_t a, int32_t& e) {
-  if (a == 0) {
-    e = BCExceptionAIsZero;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  return m_logTable[a];
-}
-int32_t CBC_ReedSolomonGF256::Inverse(int32_t a, int32_t& e) {
-  if (a == 0) {
-    e = BCExceptionAIsZero;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  return m_expTable[255 - m_logTable[a]];
-}
-int32_t CBC_ReedSolomonGF256::Multiply(int32_t a, int32_t b) {
-  if (a == 0 || b == 0) {
-    return 0;
-  }
-  if (a == 1) {
-    return b;
-  }
-  if (b == 1) {
-    return a;
-  }
-  return m_expTable[(m_logTable[a] + m_logTable[b]) % 255];
-}
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h
deleted file mode 100644
index b351a03..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
-#define XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_ReedSolomonGF256Poly;
-class CBC_ReedSolomonGF256 {
- public:
-  static void Initialize();
-  static void Finalize();
-  static CBC_ReedSolomonGF256* QRCodeFild;
-  static CBC_ReedSolomonGF256* DataMatrixField;
-  CBC_ReedSolomonGF256(int32_t primitive);
-  virtual ~CBC_ReedSolomonGF256();
-  CBC_ReedSolomonGF256Poly* GetZero();
-  CBC_ReedSolomonGF256Poly* GetOne();
-  CBC_ReedSolomonGF256Poly* BuildMonomial(int32_t degree,
-                                          int32_t coefficient,
-                                          int32_t& e);
-  static int32_t AddOrSubtract(int32_t a, int32_t b);
-  int32_t Exp(int32_t a);
-  int32_t Log(int32_t a, int32_t& e);
-  int32_t Inverse(int32_t a, int32_t& e);
-  int32_t Multiply(int32_t a, int32_t b);
-  virtual void Init();
-
- private:
-  int32_t m_expTable[256];
-  int32_t m_logTable[256];
-  CBC_ReedSolomonGF256Poly* m_zero;
-  CBC_ReedSolomonGF256Poly* m_one;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256_H_
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
deleted file mode 100644
index f138009..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-
-CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field,
-                                                   int32_t coefficients) {
-  if (field == NULL) {
-    return;
-  }
-  m_field = field;
-  m_coefficients.Add(coefficients);
-}
-CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() {
-  m_field = NULL;
-}
-void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
-                                    CFX_Int32Array* coefficients,
-                                    int32_t& e) {
-  if (coefficients == NULL || coefficients->GetSize() == 0) {
-    e = BCExceptionCoefficientsSizeIsNull;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  m_field = field;
-  int32_t coefficientsLength = coefficients->GetSize();
-  if ((coefficientsLength > 1 && (*coefficients)[0] == 0)) {
-    int32_t firstNonZero = 1;
-    while ((firstNonZero < coefficientsLength) &&
-           ((*coefficients)[firstNonZero] == 0)) {
-      firstNonZero++;
-    }
-    if (firstNonZero == coefficientsLength) {
-      m_coefficients.Copy(*(m_field->GetZero()->GetCoefficients()));
-    } else {
-      m_coefficients.SetSize(coefficientsLength - firstNonZero);
-      for (int32_t i = firstNonZero, j = 0; i < coefficientsLength; i++, j++) {
-        m_coefficients[j] = coefficients->operator[](i);
-      }
-    }
-  } else {
-    m_coefficients.Copy(*coefficients);
-  }
-}
-CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() {
-  return &m_coefficients;
-}
-int32_t CBC_ReedSolomonGF256Poly::GetDegree() {
-  return m_coefficients.GetSize() - 1;
-}
-FX_BOOL CBC_ReedSolomonGF256Poly::IsZero() {
-  return m_coefficients[0] == 0;
-}
-int32_t CBC_ReedSolomonGF256Poly::GetCoefficients(int32_t degree) {
-  return m_coefficients[m_coefficients.GetSize() - 1 - degree];
-}
-int32_t CBC_ReedSolomonGF256Poly::EvaluateAt(int32_t a) {
-  if (a == 0) {
-    return GetCoefficients(0);
-  }
-  int32_t size = m_coefficients.GetSize();
-  if (a == 1) {
-    int32_t result = 0;
-    for (int32_t i = 0; i < size; i++) {
-      result = CBC_ReedSolomonGF256::AddOrSubtract(result, m_coefficients[i]);
-    }
-    return result;
-  }
-  int32_t result = m_coefficients[0];
-  for (int32_t j = 1; j < size; j++) {
-    result = CBC_ReedSolomonGF256::AddOrSubtract(m_field->Multiply(a, result),
-                                                 m_coefficients[j]);
-  }
-  return result;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Clone(int32_t& e) {
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(m_field, &m_coefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::AddOrSubtract(
-    CBC_ReedSolomonGF256Poly* other,
-    int32_t& e) {
-  if (IsZero()) {
-    return other->Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  if (other->IsZero()) {
-    return Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CFX_Int32Array smallerCoefficients;
-  smallerCoefficients.Copy(m_coefficients);
-  CFX_Int32Array largerCoefficients;
-  largerCoefficients.Copy(*(other->GetCoefficients()));
-  if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) {
-    CFX_Int32Array temp;
-    temp.Copy(smallerCoefficients);
-    smallerCoefficients.Copy(largerCoefficients);
-    largerCoefficients.Copy(temp);
-  }
-  CFX_Int32Array sumDiff;
-  sumDiff.SetSize(largerCoefficients.GetSize());
-  int32_t lengthDiff =
-      largerCoefficients.GetSize() - smallerCoefficients.GetSize();
-  for (int32_t i = 0; i < lengthDiff; i++) {
-    sumDiff[i] = largerCoefficients[i];
-  }
-  for (int32_t j = lengthDiff; j < largerCoefficients.GetSize(); j++) {
-    sumDiff[j] = (CBC_ReedSolomonGF256::AddOrSubtract(
-        smallerCoefficients[j - lengthDiff], largerCoefficients[j]));
-  }
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(m_field, &sumDiff, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(
-    CBC_ReedSolomonGF256Poly* other,
-    int32_t& e) {
-  if (IsZero() || other->IsZero()) {
-    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return temp;
-  }
-  CFX_Int32Array aCoefficients;
-  aCoefficients.Copy(m_coefficients);
-  int32_t aLength = m_coefficients.GetSize();
-  CFX_Int32Array bCoefficients;
-  bCoefficients.Copy(*(other->GetCoefficients()));
-  int32_t bLength = other->GetCoefficients()->GetSize();
-  CFX_Int32Array product;
-  product.SetSize(aLength + bLength - 1);
-  for (int32_t i = 0; i < aLength; i++) {
-    int32_t aCoeff = m_coefficients[i];
-    for (int32_t j = 0; j < bLength; j++) {
-      product[i + j] = CBC_ReedSolomonGF256::AddOrSubtract(
-          product[i + j],
-          m_field->Multiply(aCoeff, other->GetCoefficients()->operator[](j)));
-    }
-  }
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(m_field, &product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(int32_t scalar,
-                                                             int32_t& e) {
-  if (scalar == 0) {
-    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return temp;
-  }
-  if (scalar == 1) {
-    return Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
-  product.SetSize(size);
-  for (int32_t i = 0; i < size; i++) {
-    product[i] = m_field->Multiply(m_coefficients[i], scalar);
-  }
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(m_field, &product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::MultiplyByMonomial(
-    int32_t degree,
-    int32_t coefficient,
-    int32_t& e) {
-  if (degree < 0) {
-    e = BCExceptionDegreeIsNegative;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  if (coefficient == 0) {
-    CBC_ReedSolomonGF256Poly* temp = m_field->GetZero()->Clone(e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return temp;
-  }
-  int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
-  product.SetSize(size + degree);
-  for (int32_t i = 0; i < size; i++) {
-    product[i] = (m_field->Multiply(m_coefficients[i], coefficient));
-  }
-  CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
-  temp->Init(m_field, &product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CFX_PtrArray* CBC_ReedSolomonGF256Poly::Divide(CBC_ReedSolomonGF256Poly* other,
-                                               int32_t& e) {
-  if (other->IsZero()) {
-    e = BCExceptionDivideByZero;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> quotient(
-      m_field->GetZero()->Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  std::unique_ptr<CBC_ReedSolomonGF256Poly> remainder(Clone(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t denominatorLeadingTerm = other->GetCoefficients(other->GetDegree());
-  int32_t inverseDenominatorLeadingTeam =
-      m_field->Inverse(denominatorLeadingTerm, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  while (remainder->GetDegree() >= other->GetDegree() && !remainder->IsZero()) {
-    int32_t degreeDifference = remainder->GetDegree() - other->GetDegree();
-    int32_t scale =
-        m_field->Multiply(remainder->GetCoefficients((remainder->GetDegree())),
-                          inverseDenominatorLeadingTeam);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> term(
-        other->MultiplyByMonomial(degreeDifference, scale, e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    std::unique_ptr<CBC_ReedSolomonGF256Poly> iteratorQuotient(
-        m_field->BuildMonomial(degreeDifference, scale, e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    quotient.reset(quotient->AddOrSubtract(iteratorQuotient.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    remainder.reset(remainder->AddOrSubtract(term.get(), e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CFX_PtrArray* tempPtrA = new CFX_PtrArray;
-  tempPtrA->Add(quotient.release());
-  tempPtrA->Add(remainder.release());
-  return tempPtrA;
-}
-CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() {
-  m_coefficients.RemoveAll();
-}
diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
deleted file mode 100644
index 71e4a09..0000000
--- a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
-#define XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_ReedSolomonGF256;
-
-class CBC_ReedSolomonGF256Poly {
- public:
-  CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, int32_t coefficients);
-  CBC_ReedSolomonGF256Poly();
-  virtual ~CBC_ReedSolomonGF256Poly();
-  int32_t GetCoefficients(int32_t degree);
-  CFX_Int32Array* GetCoefficients();
-  int32_t GetDegree();
-  FX_BOOL IsZero();
-  int32_t EvaluateAt(int32_t a);
-  CBC_ReedSolomonGF256Poly* AddOrSubtract(CBC_ReedSolomonGF256Poly* other,
-                                          int32_t& e);
-  CBC_ReedSolomonGF256Poly* Multiply(CBC_ReedSolomonGF256Poly* other,
-                                     int32_t& e);
-  CBC_ReedSolomonGF256Poly* Multiply(int32_t scalar, int32_t& e);
-  CBC_ReedSolomonGF256Poly* MultiplyByMonomial(int32_t degree,
-                                               int32_t coefficient,
-                                               int32_t& e);
-  CFX_PtrArray* Divide(CBC_ReedSolomonGF256Poly* other, int32_t& e);
-  CBC_ReedSolomonGF256Poly* Clone(int32_t& e);
-  virtual void Init(CBC_ReedSolomonGF256* field,
-                    CFX_Int32Array* coefficients,
-                    int32_t& e);
-
- private:
-  CBC_ReedSolomonGF256* m_field;
-  CFX_Int32Array m_coefficients;
-};
-
-#endif  // XFA_SRC_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
deleted file mode 100644
index 6c4633e..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_ASCIIEncoder::CBC_ASCIIEncoder() {}
-CBC_ASCIIEncoder::~CBC_ASCIIEncoder() {}
-int32_t CBC_ASCIIEncoder::getEncodingMode() {
-  return ASCII_ENCODATION;
-}
-void CBC_ASCIIEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
-  int32_t n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(
-      context.m_msg, context.m_pos);
-  if (n >= 2) {
-    FX_WCHAR code =
-        encodeASCIIDigits(context.m_msg.GetAt(context.m_pos),
-                          context.m_msg.GetAt(context.m_pos + 1), e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    context.writeCodeword(code);
-    context.m_pos += 2;
-  } else {
-    FX_WCHAR c = context.getCurrentChar();
-    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-        context.m_msg, context.m_pos, getEncodingMode());
-    if (newMode != getEncodingMode()) {
-      switch (newMode) {
-        case BASE256_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
-          context.signalEncoderChange(BASE256_ENCODATION);
-          return;
-        case C40_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
-          context.signalEncoderChange(C40_ENCODATION);
-          return;
-        case X12_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
-          context.signalEncoderChange(X12_ENCODATION);
-          break;
-        case TEXT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
-          context.signalEncoderChange(TEXT_ENCODATION);
-          break;
-        case EDIFACT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
-          context.signalEncoderChange(EDIFACT_ENCODATION);
-          break;
-        default:
-          e = BCExceptionIllegalStateIllegalMode;
-          return;
-      }
-    } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
-      context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
-      context.writeCodeword((FX_WCHAR)(c - 128 + 1));
-      context.m_pos++;
-    } else {
-      context.writeCodeword((FX_WCHAR)(c + 1));
-      context.m_pos++;
-    }
-  }
-}
-FX_WCHAR CBC_ASCIIEncoder::encodeASCIIDigits(FX_WCHAR digit1,
-                                             FX_WCHAR digit2,
-                                             int32_t& e) {
-  if (CBC_HighLevelEncoder::isDigit(digit1) &&
-      CBC_HighLevelEncoder::isDigit(digit2)) {
-    int32_t num = (digit1 - 48) * 10 + (digit2 - 48);
-    return (FX_WCHAR)(num + 130);
-  }
-  e = BCExceptionIllegalArgumentNotGigits;
-  return 0;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h
deleted file mode 100644
index 932b353..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-class CBC_EncoderContext;
-
-class CBC_ASCIIEncoder : public CBC_Encoder {
- public:
-  CBC_ASCIIEncoder();
-  virtual ~CBC_ASCIIEncoder();
-  int32_t getEncodingMode();
-  void Encode(CBC_EncoderContext& context, int32_t& e);
-
- private:
-  static FX_WCHAR encodeASCIIDigits(FX_WCHAR digit1,
-                                    FX_WCHAR digit2,
-                                    int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp
deleted file mode 100644
index c719fb9..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_Base256Encoder::CBC_Base256Encoder() {}
-CBC_Base256Encoder::~CBC_Base256Encoder() {}
-int32_t CBC_Base256Encoder::getEncodingMode() {
-  return BASE256_ENCODATION;
-}
-void CBC_Base256Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
-  CFX_WideString buffer;
-  buffer += (FX_WCHAR)'\0';
-  while (context.hasMoreCharacters()) {
-    FX_WCHAR c = context.getCurrentChar();
-    buffer += c;
-    context.m_pos++;
-    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-        context.m_msg, context.m_pos, getEncodingMode());
-    if (newMode != getEncodingMode()) {
-      context.signalEncoderChange(newMode);
-      break;
-    }
-  }
-  int32_t dataCount = buffer.GetLength() - 1;
-  FX_CHAR buf[128];
-  FXSYS_itoa(dataCount, buf, 10);
-  buffer.SetAt(0, FX_WCHAR(*buf) - '0');
-  int32_t lengthFieldSize = 1;
-  int32_t currentSize =
-      context.getCodewordCount() + dataCount + lengthFieldSize;
-  context.updateSymbolInfo(currentSize, e);
-  if (e != BCExceptionNO) {
-    return;
-  }
-  FX_BOOL mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0;
-  if (context.hasMoreCharacters() || mustPad) {
-    if (dataCount <= 249) {
-      buffer.SetAt(0, (FX_WCHAR)dataCount);
-    } else if (dataCount > 249 && dataCount <= 1555) {
-      buffer.SetAt(0, (FX_WCHAR)((dataCount / 250) + 249));
-      buffer.Insert(1, (FX_WCHAR)(dataCount % 250));
-    } else {
-      e = BCExceptionIllegalStateMessageLengthInvalid;
-      return;
-    }
-  }
-  for (int32_t i = 0, c = buffer.GetLength(); i < c; i++) {
-    context.writeCodeword(
-        randomize255State(buffer.GetAt(i), context.getCodewordCount() + 1));
-  }
-}
-FX_WCHAR CBC_Base256Encoder::randomize255State(FX_WCHAR ch,
-                                               int32_t codewordPosition) {
-  int32_t pseudoRandom = ((149 * codewordPosition) % 255) + 1;
-  int32_t tempVariable = ch + pseudoRandom;
-  if (tempVariable <= 255) {
-    return (FX_WCHAR)tempVariable;
-  } else {
-    return (FX_WCHAR)(tempVariable - 256);
-  }
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h
deleted file mode 100644
index c7aa18c..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-class CBC_Base256Encoder : public CBC_Encoder {
- public:
-  CBC_Base256Encoder();
-  virtual ~CBC_Base256Encoder();
-  int32_t getEncodingMode();
-  void Encode(CBC_EncoderContext& context, int32_t& e);
-
- private:
-  static FX_WCHAR randomize255State(FX_WCHAR ch, int32_t codewordPosition);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_BASE256ENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp
deleted file mode 100644
index 01ececb..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_C40Encoder::CBC_C40Encoder() {}
-CBC_C40Encoder::~CBC_C40Encoder() {}
-int32_t CBC_C40Encoder::getEncodingMode() {
-  return C40_ENCODATION;
-}
-void CBC_C40Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
-  CFX_WideString buffer;
-  while (context.hasMoreCharacters()) {
-    FX_WCHAR c = context.getCurrentChar();
-    context.m_pos++;
-    int32_t lastCharSize = encodeChar(c, buffer, e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    int32_t unwritten = (buffer.GetLength() / 3) * 2;
-    int32_t curCodewordCount = context.getCodewordCount() + unwritten;
-    context.updateSymbolInfo(curCodewordCount, e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
-    if (!context.hasMoreCharacters()) {
-      CFX_WideString removed;
-      if ((buffer.GetLength() % 3) == 2) {
-        if (available < 2 || available > 2) {
-          lastCharSize =
-              backtrackOneCharacter(context, buffer, removed, lastCharSize, e);
-          if (e != BCExceptionNO) {
-            return;
-          }
-        }
-      }
-      while ((buffer.GetLength() % 3) == 1 &&
-             ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) {
-        lastCharSize =
-            backtrackOneCharacter(context, buffer, removed, lastCharSize, e);
-        if (e != BCExceptionNO) {
-          return;
-        }
-      }
-      break;
-    }
-    int32_t count = buffer.GetLength();
-    if ((count % 3) == 0) {
-      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-          context.m_msg, context.m_pos, getEncodingMode());
-      if (newMode != getEncodingMode()) {
-        context.signalEncoderChange(newMode);
-        break;
-      }
-    }
-  }
-  handleEOD(context, buffer, e);
-}
-void CBC_C40Encoder::writeNextTriplet(CBC_EncoderContext& context,
-                                      CFX_WideString& buffer) {
-  context.writeCodewords(encodeToCodewords(buffer, 0));
-  buffer.Delete(0, 3);
-}
-void CBC_C40Encoder::handleEOD(CBC_EncoderContext& context,
-                               CFX_WideString& buffer,
-                               int32_t& e) {
-  int32_t unwritten = (buffer.GetLength() / 3) * 2;
-  int32_t rest = buffer.GetLength() % 3;
-  int32_t curCodewordCount = context.getCodewordCount() + unwritten;
-  context.updateSymbolInfo(curCodewordCount, e);
-  if (e != BCExceptionNO) {
-    return;
-  }
-  int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
-  if (rest == 2) {
-    buffer += (FX_WCHAR)'\0';
-    while (buffer.GetLength() >= 3) {
-      writeNextTriplet(context, buffer);
-    }
-    if (context.hasMoreCharacters()) {
-      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
-    }
-  } else if (available == 1 && rest == 1) {
-    while (buffer.GetLength() >= 3) {
-      writeNextTriplet(context, buffer);
-    }
-    if (context.hasMoreCharacters()) {
-      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
-    }
-    context.m_pos--;
-  } else if (rest == 0) {
-    while (buffer.GetLength() >= 3) {
-      writeNextTriplet(context, buffer);
-    }
-    if (available > 0 || context.hasMoreCharacters()) {
-      context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH);
-    }
-  } else {
-    e = BCExceptionIllegalStateUnexpectedCase;
-    return;
-  }
-  context.signalEncoderChange(ASCII_ENCODATION);
-}
-int32_t CBC_C40Encoder::encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e) {
-  if (c == ' ') {
-    sb += (FX_WCHAR)'\3';
-    return 1;
-  } else if ((c >= '0') && (c <= '9')) {
-    sb += (FX_WCHAR)(c - 48 + 4);
-    return 1;
-  } else if ((c >= 'A') && (c <= 'Z')) {
-    sb += (FX_WCHAR)(c - 65 + 14);
-    return 1;
-  } else if (c <= 0x1f) {
-    sb += (FX_WCHAR)'\0';
-    sb += c;
-    return 2;
-  } else if ((c >= '!') && (c <= '/')) {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 33);
-    return 2;
-  } else if ((c >= ':') && (c <= '@')) {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 58 + 15);
-    return 2;
-  } else if ((c >= '[') && (c <= '_')) {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 91 + 22);
-    return 2;
-  } else if ((c >= 60) && (c <= 0x7f)) {
-    sb += (FX_WCHAR)'\2';
-    sb += (FX_WCHAR)(c - 96);
-    return 2;
-  } else if (c >= 80) {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)0x001e;
-    int32_t len = 2;
-    len += encodeChar((c - 128), sb, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    return len;
-  } else {
-    e = BCExceptionIllegalArgument;
-    return 0;
-  }
-}
-int32_t CBC_C40Encoder::backtrackOneCharacter(CBC_EncoderContext& context,
-                                              CFX_WideString& buffer,
-                                              CFX_WideString& removed,
-                                              int32_t lastCharSize,
-                                              int32_t& e) {
-  int32_t count = buffer.GetLength();
-  buffer.Delete(count - lastCharSize, count);
-  context.m_pos--;
-  FX_WCHAR c = context.getCurrentChar();
-  lastCharSize = encodeChar(c, removed, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  context.resetSymbolInfo();
-  return lastCharSize;
-}
-CFX_WideString CBC_C40Encoder::encodeToCodewords(CFX_WideString sb,
-                                                 int32_t startPos) {
-  FX_WCHAR c1 = sb.GetAt(startPos);
-  FX_WCHAR c2 = sb.GetAt(startPos + 1);
-  FX_WCHAR c3 = sb.GetAt(startPos + 2);
-  int32_t v = (1600 * c1) + (40 * c2) + c3 + 1;
-  FX_WCHAR cw1 = (FX_WCHAR)(v / 256);
-  FX_WCHAR cw2 = (FX_WCHAR)(v % 256);
-  CFX_WideString b1(cw1);
-  CFX_WideString b2(cw2);
-  return b1 + b2;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h
deleted file mode 100644
index ebc67ef..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-class CBC_C40Encoder : public CBC_Encoder {
- public:
-  CBC_C40Encoder();
-  virtual ~CBC_C40Encoder();
-  virtual int32_t getEncodingMode();
-  virtual void Encode(CBC_EncoderContext& context, int32_t& e);
-  static void writeNextTriplet(CBC_EncoderContext& context,
-                               CFX_WideString& buffer);
-  virtual void handleEOD(CBC_EncoderContext& context,
-                         CFX_WideString& buffer,
-                         int32_t& e);
-  virtual int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
-
- private:
-  int32_t backtrackOneCharacter(CBC_EncoderContext& context,
-                                CFX_WideString& buffer,
-                                CFX_WideString& removed,
-                                int32_t lastCharSize,
-                                int32_t& e);
-  static CFX_WideString encodeToCodewords(CFX_WideString sb, int32_t startPos);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_C40ENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp
deleted file mode 100644
index 9315b16..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_DataMatrixBitMatrixParser::CBC_DataMatrixBitMatrixParser() {
-  m_mappingBitMatrix = NULL;
-  m_version = NULL;
-  m_readMappingMatrix = NULL;
-}
-void CBC_DataMatrixBitMatrixParser::Init(CBC_CommonBitMatrix* bitMatrix,
-                                         int32_t& e) {
-  int32_t dimension = bitMatrix->GetHeight();
-  if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) {
-    e = BCExceptionFormatException;
-    return;
-  }
-  m_version = ReadVersion(bitMatrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  m_mappingBitMatrix = ExtractDataRegion(bitMatrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  m_readMappingMatrix = new CBC_CommonBitMatrix();
-  m_readMappingMatrix->Init(m_mappingBitMatrix->GetWidth(),
-                            m_mappingBitMatrix->GetHeight());
-}
-CBC_DataMatrixBitMatrixParser::~CBC_DataMatrixBitMatrixParser() {
-  delete m_mappingBitMatrix;
-  delete m_readMappingMatrix;
-}
-CBC_DataMatrixVersion* CBC_DataMatrixBitMatrixParser::GetVersion() {
-  return m_version;
-}
-CBC_DataMatrixVersion* CBC_DataMatrixBitMatrixParser::ReadVersion(
-    CBC_CommonBitMatrix* bitMatrix,
-    int32_t& e) {
-  int32_t rows = bitMatrix->GetHeight();
-  int32_t columns = bitMatrix->GetWidth();
-  CBC_DataMatrixVersion* temp =
-      CBC_DataMatrixVersion::GetVersionForDimensions(rows, columns, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return temp;
-}
-CFX_ByteArray* CBC_DataMatrixBitMatrixParser::ReadCodewords(int32_t& e) {
-  std::unique_ptr<CFX_ByteArray> result(new CFX_ByteArray());
-  result->SetSize(m_version->GetTotalCodewords());
-  int32_t resultOffset = 0;
-  int32_t row = 4;
-  int32_t column = 0;
-  int32_t numRows = m_mappingBitMatrix->GetHeight();
-  int32_t numColumns = m_mappingBitMatrix->GetWidth();
-  FX_BOOL corner1Read = FALSE;
-  FX_BOOL corner2Read = FALSE;
-  FX_BOOL corner3Read = FALSE;
-  FX_BOOL corner4Read = FALSE;
-  do {
-    if ((row == numRows) && (column == 0) && !corner1Read) {
-      (*result)[resultOffset++] = (uint8_t)ReadCorner1(numRows, numColumns);
-      row -= 2;
-      column += 2;
-      corner1Read = TRUE;
-    } else if ((row == numRows - 2) && (column == 0) &&
-               ((numColumns & 0x03) != 0) && !corner2Read) {
-      (*result)[resultOffset++] = (uint8_t)ReadCorner2(numRows, numColumns);
-      row -= 2;
-      column += 2;
-      corner2Read = TRUE;
-    } else if ((row == numRows + 4) && (column == 2) &&
-               ((numColumns & 0x07) == 0) && !corner3Read) {
-      (*result)[resultOffset++] = (uint8_t)ReadCorner3(numRows, numColumns);
-      row -= 2;
-      column += 2;
-      corner3Read = TRUE;
-    } else if ((row == numRows - 2) && (column == 0) &&
-               ((numColumns & 0x07) == 4) && !corner4Read) {
-      (*result)[resultOffset++] = (uint8_t)ReadCorner4(numRows, numColumns);
-      row -= 2;
-      column += 2;
-      corner4Read = TRUE;
-    } else {
-      do {
-        if ((row < numRows) && (column >= 0) &&
-            !m_readMappingMatrix->Get(column, row)) {
-          if (resultOffset < (*result).GetSize()) {
-            (*result)[resultOffset++] =
-                (uint8_t)ReadUtah(row, column, numRows, numColumns);
-          }
-        }
-        row -= 2;
-        column += 2;
-      } while ((row >= 0) && (column < numColumns));
-      row += 1;
-      column += 3;
-      do {
-        if ((row >= 0) && (column < numColumns) &&
-            !m_readMappingMatrix->Get(column, row)) {
-          if (resultOffset < (*result).GetSize()) {
-            (*result)[resultOffset++] =
-                (uint8_t)ReadUtah(row, column, numRows, numColumns);
-          }
-        }
-        row += 2;
-        column -= 2;
-      } while ((row < numRows) && (column >= 0));
-      row += 3;
-      column += 1;
-    }
-  } while ((row < numRows) || (column < numColumns));
-  if (resultOffset != m_version->GetTotalCodewords()) {
-    e = BCExceptionFormatException;
-    return NULL;
-  }
-  return result.release();
-}
-FX_BOOL CBC_DataMatrixBitMatrixParser::ReadModule(int32_t row,
-                                                  int32_t column,
-                                                  int32_t numRows,
-                                                  int32_t numColumns) {
-  if (row < 0) {
-    row += numRows;
-    column += 4 - ((numRows + 4) & 0x07);
-  }
-  if (column < 0) {
-    column += numColumns;
-    row += 4 - ((numColumns + 4) & 0x07);
-  }
-  m_readMappingMatrix->Set(column, row);
-  return m_mappingBitMatrix->Get(column, row);
-}
-int32_t CBC_DataMatrixBitMatrixParser::ReadUtah(int32_t row,
-                                                int32_t column,
-                                                int32_t numRows,
-                                                int32_t numColumns) {
-  int32_t currentByte = 0;
-  if (ReadModule(row - 2, column - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row - 2, column - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row - 1, column - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row - 1, column - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row - 1, column, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row, column - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row, column - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(row, column, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  return currentByte;
-}
-int32_t CBC_DataMatrixBitMatrixParser::ReadCorner1(int32_t numRows,
-                                                   int32_t numColumns) {
-  int32_t currentByte = 0;
-  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 1, 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 1, 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(2, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(3, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  return currentByte;
-}
-int32_t CBC_DataMatrixBitMatrixParser::ReadCorner2(int32_t numRows,
-                                                   int32_t numColumns) {
-  int32_t currentByte = 0;
-  if (ReadModule(numRows - 3, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 2, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 4, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 3, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  return currentByte;
-}
-int32_t CBC_DataMatrixBitMatrixParser::ReadCorner3(int32_t numRows,
-                                                   int32_t numColumns) {
-  int32_t currentByte = 0;
-  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 1, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 3, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 3, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  return currentByte;
-}
-int32_t CBC_DataMatrixBitMatrixParser::ReadCorner4(int32_t numRows,
-                                                   int32_t numColumns) {
-  int32_t currentByte = 0;
-  if (ReadModule(numRows - 3, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 2, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(numRows - 1, 0, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 2, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(0, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(1, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(2, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  currentByte <<= 1;
-  if (ReadModule(3, numColumns - 1, numRows, numColumns)) {
-    currentByte |= 1;
-  }
-  return currentByte;
-}
-CBC_CommonBitMatrix* CBC_DataMatrixBitMatrixParser::ExtractDataRegion(
-    CBC_CommonBitMatrix* bitMatrix,
-    int32_t& e) {
-  int32_t symbolSizeRows = m_version->GetSymbolSizeRows();
-  int32_t symbolSizeColumns = m_version->GetSymbolSizeColumns();
-  if (bitMatrix->GetHeight() != symbolSizeRows) {
-    e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;
-    return NULL;
-  }
-  int32_t dataRegionSizeRows = m_version->GetDataRegionSizeRows();
-  int32_t dataRegionSizeColumns = m_version->GetDataRegionSizeColumns();
-  int32_t numDataRegionsRow = symbolSizeRows / dataRegionSizeRows;
-  int32_t numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns;
-  int32_t sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows;
-  int32_t sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns;
-  CBC_CommonBitMatrix* bitMatrixWithoutAlignment = new CBC_CommonBitMatrix();
-  bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow);
-  int32_t dataRegionRow;
-  for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) {
-    int32_t dataRegionRowOffset = dataRegionRow * dataRegionSizeRows;
-    int32_t dataRegionColumn;
-    for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn;
-         ++dataRegionColumn) {
-      int32_t dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns;
-      int32_t i;
-      for (i = 0; i < dataRegionSizeRows; ++i) {
-        int32_t readRowOffset =
-            dataRegionRow * (dataRegionSizeRows + 2) + 1 + i;
-        int32_t writeRowOffset = dataRegionRowOffset + i;
-        int32_t j;
-        for (j = 0; j < dataRegionSizeColumns; ++j) {
-          int32_t readColumnOffset =
-              dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j;
-          if (bitMatrix->Get(readColumnOffset, readRowOffset)) {
-            int32_t writeColumnOffset = dataRegionColumnOffset + j;
-            bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset);
-          }
-        }
-      }
-    }
-  }
-  return bitMatrixWithoutAlignment;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h
deleted file mode 100644
index 967e08d..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_DataMatrixVersion;
-
-class CBC_DataMatrixBitMatrixParser {
- public:
-  CBC_DataMatrixBitMatrixParser();
-  virtual ~CBC_DataMatrixBitMatrixParser();
-  CBC_DataMatrixVersion* GetVersion();
-  CFX_ByteArray* ReadCodewords(int32_t& e);
-  FX_BOOL ReadModule(int32_t row,
-                     int32_t column,
-                     int32_t numRows,
-                     int32_t numColumns);
-  int32_t ReadUtah(int32_t row,
-                   int32_t column,
-                   int32_t numRows,
-                   int32_t numColumns);
-  int32_t ReadCorner1(int32_t numRows, int32_t numColumns);
-  int32_t ReadCorner2(int32_t numRows, int32_t numColumns);
-  int32_t ReadCorner3(int32_t numRows, int32_t numColumns);
-  int32_t ReadCorner4(int32_t numRows, int32_t numColumns);
-  CBC_CommonBitMatrix* ExtractDataRegion(CBC_CommonBitMatrix* bitMatrix,
-                                         int32_t& e);
-  virtual void Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e);
-
- private:
-  static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix* bitMatrix,
-                                            int32_t& e);
-  CBC_CommonBitMatrix* m_mappingBitMatrix;
-  CBC_CommonBitMatrix* m_readMappingMatrix;
-  CBC_DataMatrixVersion* m_version;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp
deleted file mode 100644
index fbd0ea1..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock() {}
-CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(int32_t numDataCodewords,
-                                                 CFX_ByteArray* codewords) {
-  m_codewords.Copy(*codewords);
-  m_numDataCodewords = numDataCodewords;
-}
-CFX_PtrArray* CBC_DataMatrixDataBlock::GetDataBlocks(
-    CFX_ByteArray* rawCodewords,
-    CBC_DataMatrixVersion* version,
-    int32_t& e) {
-  ECBlocks* ecBlocks = version->GetECBlocks();
-  int32_t totalBlocks = 0;
-  const CFX_PtrArray& ecBlockArray = ecBlocks->GetECBlocks();
-  int32_t i;
-  for (i = 0; i < ecBlockArray.GetSize(); i++) {
-    totalBlocks += ((ECB*)ecBlockArray[i])->GetCount();
-  }
-  std::unique_ptr<CFX_PtrArray> result(new CFX_PtrArray());
-  result->SetSize(totalBlocks);
-  int32_t numResultBlocks = 0;
-  int32_t j;
-  for (j = 0; j < ecBlockArray.GetSize(); j++) {
-    for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) {
-      int32_t numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords();
-      int32_t numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords;
-      CFX_ByteArray codewords;
-      codewords.SetSize(numBlockCodewords);
-      (*result)[numResultBlocks++] =
-          new CBC_DataMatrixDataBlock(numDataCodewords, &codewords);
-      codewords.SetSize(0);
-    }
-  }
-  int32_t longerBlocksTotalCodewords =
-      ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();
-  int32_t longerBlocksNumDataCodewords =
-      longerBlocksTotalCodewords - ecBlocks->GetECCodewords();
-  int32_t shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1;
-  int32_t rawCodewordsOffset = 0;
-  for (i = 0; i < shorterBlocksNumDataCodewords; i++) {
-    int32_t j;
-    for (j = 0; j < numResultBlocks; j++) {
-      if (rawCodewordsOffset < rawCodewords->GetSize()) {
-        ((CBC_DataMatrixDataBlock*)(*result)[j])
-            ->GetCodewords()
-            ->
-            operator[](i) = (*rawCodewords)[rawCodewordsOffset++];
-      }
-    }
-  }
-  const bool specialVersion = version->GetVersionNumber() == 24;
-  int32_t numLongerBlocks = specialVersion ? 8 : numResultBlocks;
-  for (j = 0; j < numLongerBlocks; j++) {
-    if (rawCodewordsOffset < rawCodewords->GetSize()) {
-      ((CBC_DataMatrixDataBlock*)(*result)[j])
-          ->GetCodewords()
-          ->
-          operator[](longerBlocksNumDataCodewords - 1) =
-          (*rawCodewords)[rawCodewordsOffset++];
-    }
-  }
-  int32_t max =
-      ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();
-  for (i = longerBlocksNumDataCodewords; i < max; i++) {
-    int32_t j;
-    for (j = 0; j < numResultBlocks; j++) {
-      int32_t iOffset = specialVersion && j > 7 ? i - 1 : i;
-      if (rawCodewordsOffset < rawCodewords->GetSize()) {
-        ((CBC_DataMatrixDataBlock*)(*result)[j])
-            ->GetCodewords()
-            ->
-            operator[](iOffset) = (*rawCodewords)[rawCodewordsOffset++];
-      }
-    }
-  }
-  if (rawCodewordsOffset != rawCodewords->GetSize()) {
-    e = BCExceptionIllegalArgument;
-    return NULL;
-  }
-  return result.release();
-}
-int32_t CBC_DataMatrixDataBlock::GetNumDataCodewords() {
-  return m_numDataCodewords;
-}
-CFX_ByteArray* CBC_DataMatrixDataBlock::GetCodewords() {
-  return &m_codewords;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h
deleted file mode 100644
index 68a4cea..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_DataMatrixVersion;
-
-class CBC_DataMatrixDataBlock {
- public:
-  virtual ~CBC_DataMatrixDataBlock();
-
-  int32_t GetNumDataCodewords();
-  CFX_ByteArray* GetCodewords();
-
-  static CFX_PtrArray* GetDataBlocks(CFX_ByteArray* rawCodewords,
-                                     CBC_DataMatrixVersion* version,
-                                     int32_t& e);
-
- private:
-  int32_t m_numDataCodewords;
-  CFX_ByteArray m_codewords;
-
-  CBC_DataMatrixDataBlock(int32_t numDataCodewords, CFX_ByteArray* codewords);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDATABLOCK_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp
deleted file mode 100644
index f378fff..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitSource.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h"
-
-const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_BASIC_SET_CHARS[] = {
-    '*', '*', '*', ' ', '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'};
-const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = {
-    '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*',  '+', ',', '-', '.',
-    '/', ':', ';', '<', '=', '>', '?',  '@', '[', '\\', ']', '^', '_'};
-const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = {
-    '*', '*', '*', ' ', '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'};
-const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = {
-    '\'', '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', '{', '|', '}', '~', (FX_CHAR)127};
-const int32_t CBC_DataMatrixDecodedBitStreamParser::PAD_ENCODE = 0;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::ASCII_ENCODE = 1;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::C40_ENCODE = 2;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::TEXT_ENCODE = 3;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::ANSIX12_ENCODE = 4;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::EDIFACT_ENCODE = 5;
-const int32_t CBC_DataMatrixDecodedBitStreamParser::BASE256_ENCODE = 6;
-CBC_DataMatrixDecodedBitStreamParser::CBC_DataMatrixDecodedBitStreamParser() {}
-CBC_DataMatrixDecodedBitStreamParser::~CBC_DataMatrixDecodedBitStreamParser() {}
-CBC_CommonDecoderResult* CBC_DataMatrixDecodedBitStreamParser::Decode(
-    CFX_ByteArray& bytes,
-    int32_t& e) {
-  CBC_CommonBitSource bits(&bytes);
-  CFX_ByteString result;
-  CFX_ByteString resultTrailer;
-  CFX_Int32Array byteSegments;
-  int32_t mode = ASCII_ENCODE;
-  do {
-    if (mode == 1) {
-      mode = DecodeAsciiSegment(&bits, result, resultTrailer, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    } else {
-      switch (mode) {
-        case 2:
-          DecodeC40Segment(&bits, result, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          break;
-        case 3:
-          DecodeTextSegment(&bits, result, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          break;
-        case 4:
-          DecodeAnsiX12Segment(&bits, result, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          break;
-        case 5:
-          DecodeEdifactSegment(&bits, result, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          break;
-        case 6:
-          DecodeBase256Segment(&bits, result, byteSegments, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          break;
-        default:
-          e = BCExceptionFormatException;
-          return NULL;
-      }
-      mode = ASCII_ENCODE;
-    }
-  } while (mode != PAD_ENCODE && bits.Available() > 0);
-  if (resultTrailer.GetLength() > 0) {
-    result += resultTrailer;
-  }
-  CBC_CommonDecoderResult* tempCp = new CBC_CommonDecoderResult();
-  tempCp->Init(bytes, result,
-               (byteSegments.GetSize() <= 0) ? CFX_Int32Array() : byteSegments,
-               NULL, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return tempCp;
-}
-int32_t CBC_DataMatrixDecodedBitStreamParser::DecodeAsciiSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    CFX_ByteString& resultTrailer,
-    int32_t& e) {
-  FX_CHAR buffer[128];
-  FX_BOOL upperShift = FALSE;
-  do {
-    int32_t oneByte = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    if (oneByte == 0) {
-      e = BCExceptionFormatException;
-      return 0;
-    } else if (oneByte <= 128) {
-      oneByte = upperShift ? oneByte + 128 : oneByte;
-      upperShift = FALSE;
-      result += ((FX_CHAR)(oneByte - 1));
-      return ASCII_ENCODE;
-    } else if (oneByte == 129) {
-      return PAD_ENCODE;
-    } else if (oneByte <= 229) {
-      int32_t value = oneByte - 130;
-      FXSYS_itoa(value, buffer, 10);
-      if (value < 10) {
-        result += '0';
-        buffer[1] = '\0';
-      } else {
-        buffer[2] = '\0';
-      }
-      result += buffer;
-    } else if (oneByte == 230) {
-      return C40_ENCODE;
-    } else if (oneByte == 231) {
-      return BASE256_ENCODE;
-    } else if (oneByte == 232 || oneByte == 233 || oneByte == 234) {
-    } else if (oneByte == 235) {
-      upperShift = TRUE;
-    } else if (oneByte == 236) {
-      result += "[)>";
-      result += 0x1E;
-      result += "05";
-      result += 0x1D;
-      resultTrailer.Insert(0, 0x1E);
-      resultTrailer.Insert(0 + 1, 0x04);
-    } else if (oneByte == 237) {
-      result += "[)>";
-      result += 0x1E;
-      result += "06";
-      result += 0x1D;
-      resultTrailer.Insert(0, 0x1E);
-      resultTrailer.Insert(0 + 1, 0x04);
-    } else if (oneByte == 238) {
-      return ANSIX12_ENCODE;
-    } else if (oneByte == 239) {
-      return TEXT_ENCODE;
-    } else if (oneByte == 240) {
-      return EDIFACT_ENCODE;
-    } else if (oneByte == 241) {
-    } else if (oneByte >= 242) {
-      if (oneByte == 254 && bits->Available() == 0) {
-      } else {
-        e = BCExceptionFormatException;
-        return 0;
-      }
-    }
-  } while (bits->Available() > 0);
-  return ASCII_ENCODE;
-}
-void CBC_DataMatrixDecodedBitStreamParser::DecodeC40Segment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t& e) {
-  FX_BOOL upperShift = FALSE;
-  CFX_Int32Array cValues;
-  cValues.SetSize(3);
-  do {
-    if (bits->Available() == 8) {
-      return;
-    }
-    int32_t firstByte = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (firstByte == 254) {
-      return;
-    }
-    int32_t tempp = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    ParseTwoBytes(firstByte, tempp, cValues);
-    int32_t shift = 0;
-    int32_t i;
-    for (i = 0; i < 3; i++) {
-      int32_t cValue = cValues[i];
-      switch (shift) {
-        case 0:
-          if (cValue < 3) {
-            shift = cValue + 1;
-          } else if (cValue < 27) {
-            FX_CHAR c40char = C40_BASIC_SET_CHARS[cValue];
-            if (upperShift) {
-              result += (FX_CHAR)(c40char + 128);
-              upperShift = FALSE;
-            } else {
-              result += c40char;
-            }
-          } else {
-            e = BCExceptionFormatException;
-            return;
-          }
-          break;
-        case 1:
-          if (upperShift) {
-            result += (FX_CHAR)(cValue + 128);
-            upperShift = FALSE;
-          } else {
-            result += cValue;
-          }
-          shift = 0;
-          break;
-        case 2:
-          if (cValue < 27) {
-            FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue];
-            if (upperShift) {
-              result += (FX_CHAR)(c40char + 128);
-              upperShift = FALSE;
-            } else {
-              result += c40char;
-            }
-          } else if (cValue == 27) {
-            e = BCExceptionFormatException;
-            return;
-          } else if (cValue == 30) {
-            upperShift = TRUE;
-          } else {
-            e = BCExceptionFormatException;
-            return;
-          }
-          shift = 0;
-          break;
-        case 3:
-          if (upperShift) {
-            result += (FX_CHAR)(cValue + 224);
-            upperShift = FALSE;
-          } else {
-            result += (FX_CHAR)(cValue + 96);
-          }
-          shift = 0;
-          break;
-        default:
-          break;
-          e = BCExceptionFormatException;
-          return;
-      }
-    }
-  } while (bits->Available() > 0);
-}
-void CBC_DataMatrixDecodedBitStreamParser::DecodeTextSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t& e) {
-  FX_BOOL upperShift = FALSE;
-  CFX_Int32Array cValues;
-  cValues.SetSize(3);
-  int32_t shift = 0;
-  do {
-    if (bits->Available() == 8) {
-      return;
-    }
-    int32_t firstByte = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (firstByte == 254) {
-      return;
-    }
-    int32_t inTp = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    ParseTwoBytes(firstByte, inTp, cValues);
-    for (int32_t i = 0; i < 3; i++) {
-      int32_t cValue = cValues[i];
-      switch (shift) {
-        case 0:
-          if (cValue < 3) {
-            shift = cValue + 1;
-          } else if (cValue < 40) {
-            FX_CHAR textChar = TEXT_BASIC_SET_CHARS[cValue];
-            if (upperShift) {
-              result += (FX_CHAR)(textChar + 128);
-              upperShift = FALSE;
-            } else {
-              result += textChar;
-            }
-          } else {
-            e = BCExceptionFormatException;
-            return;
-          }
-          break;
-        case 1:
-          if (upperShift) {
-            result += (FX_CHAR)(cValue + 128);
-            upperShift = FALSE;
-          } else {
-            result += cValue;
-          }
-          shift = 0;
-          break;
-        case 2:
-          if (cValue < 27) {
-            FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue];
-            if (upperShift) {
-              result += (FX_CHAR)(c40char + 128);
-              upperShift = FALSE;
-            } else {
-              result += c40char;
-            }
-          } else if (cValue == 27) {
-            e = BCExceptionFormatException;
-            return;
-          } else if (cValue == 30) {
-            upperShift = TRUE;
-          } else {
-            e = BCExceptionFormatException;
-            return;
-          }
-          shift = 0;
-          break;
-        case 3:
-          if (cValue < 19) {
-            FX_CHAR textChar = TEXT_SHIFT3_SET_CHARS[cValue];
-            if (upperShift) {
-              result += (FX_CHAR)(textChar + 128);
-              upperShift = FALSE;
-            } else {
-              result += textChar;
-            }
-            shift = 0;
-          } else {
-            e = BCExceptionFormatException;
-            return;
-          }
-          break;
-        default:
-          break;
-          e = BCExceptionFormatException;
-          return;
-      }
-    }
-  } while (bits->Available() > 0);
-}
-void CBC_DataMatrixDecodedBitStreamParser::DecodeAnsiX12Segment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t& e) {
-  CFX_Int32Array cValues;
-  cValues.SetSize(3);
-  do {
-    if (bits->Available() == 8) {
-      return;
-    }
-    int32_t firstByte = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (firstByte == 254) {
-      return;
-    }
-    int32_t iTemp1 = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    ParseTwoBytes(firstByte, iTemp1, cValues);
-    int32_t i;
-    for (i = 0; i < 3; i++) {
-      int32_t cValue = cValues[i];
-      if (cValue == 0) {
-        BC_FX_ByteString_Append(result, 1, '\r');
-      } else if (cValue == 1) {
-        BC_FX_ByteString_Append(result, 1, '*');
-      } else if (cValue == 2) {
-        BC_FX_ByteString_Append(result, 1, '>');
-      } else if (cValue == 3) {
-        BC_FX_ByteString_Append(result, 1, ' ');
-      } else if (cValue < 14) {
-        BC_FX_ByteString_Append(result, 1, (FX_CHAR)(cValue + 44));
-      } else if (cValue < 40) {
-        BC_FX_ByteString_Append(result, 1, (FX_CHAR)(cValue + 51));
-      } else {
-        e = BCExceptionFormatException;
-        return;
-      }
-    }
-  } while (bits->Available() > 0);
-}
-void CBC_DataMatrixDecodedBitStreamParser::ParseTwoBytes(
-    int32_t firstByte,
-    int32_t secondByte,
-    CFX_Int32Array& result) {
-  int32_t fullBitValue = (firstByte << 8) + secondByte - 1;
-  int32_t temp = fullBitValue / 1600;
-  result[0] = temp;
-  fullBitValue -= temp * 1600;
-  temp = fullBitValue / 40;
-  result[1] = temp;
-  result[2] = fullBitValue - temp * 40;
-}
-
-void CBC_DataMatrixDecodedBitStreamParser::DecodeEdifactSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t& e) {
-  FX_CHAR buffer[128];
-  FX_BOOL unlatch = FALSE;
-  do {
-    if (bits->Available() <= 16)
-      return;
-
-    for (int32_t i = 0; i < 4; i++) {
-      int32_t edifactValue = bits->ReadBits(6, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      if (edifactValue == 0x1F)
-        unlatch = TRUE;
-
-      if (!unlatch) {
-        if ((edifactValue & 32) == 0)
-          edifactValue |= 64;
-        result += FXSYS_itoa(edifactValue, buffer, 10);
-      }
-    }
-  } while (!unlatch && bits->Available() > 0);
-}
-
-void CBC_DataMatrixDecodedBitStreamParser::DecodeBase256Segment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    CFX_Int32Array& byteSegments,
-    int32_t& e) {
-  int32_t codewordPosition = 1 + bits->getByteOffset();
-  int32_t iTmp = bits->ReadBits(8, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t d1 = Unrandomize255State(iTmp, codewordPosition++);
-  int32_t count;
-  if (d1 == 0) {
-    count = bits->Available() / 8;
-  } else if (d1 < 250) {
-    count = d1;
-  } else {
-    int32_t iTmp3 = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    count = 250 * (d1 - 249) + Unrandomize255State(iTmp3, codewordPosition++);
-  }
-  if (count < 0) {
-    e = BCExceptionFormatException;
-    return;
-  }
-  CFX_ByteArray* bytes = new CFX_ByteArray();
-  bytes->SetSize(count);
-  int32_t i;
-  for (i = 0; i < count; i++) {
-    if (bits->Available() < 8) {
-      e = BCExceptionFormatException;
-      delete bytes;
-      return;
-    }
-    int32_t iTemp5 = bits->ReadBits(8, e);
-    if (e != BCExceptionNO) {
-      delete bytes;
-      return;
-    }
-    bytes->SetAt(i, Unrandomize255State(iTemp5, codewordPosition++));
-  }
-  BC_FX_ByteString_Append(result, *bytes);
-  delete bytes;
-}
-uint8_t CBC_DataMatrixDecodedBitStreamParser::Unrandomize255State(
-    int32_t randomizedBase256Codeword,
-    int32_t base256CodewordPosition) {
-  int32_t pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1;
-  int32_t tempVariable = randomizedBase256Codeword - pseudoRandomNumber;
-  return (uint8_t)(tempVariable >= 0 ? tempVariable : tempVariable + 256);
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h
deleted file mode 100644
index eba1828..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
-class CBC_CommonDecoderResult;
-class CBC_CommonBitSource;
-class CBC_DataMatrixDecodedBitStreamParser {
- public:
-  CBC_DataMatrixDecodedBitStreamParser();
-  virtual ~CBC_DataMatrixDecodedBitStreamParser();
-  static CBC_CommonDecoderResult* Decode(CFX_ByteArray& bytes, int32_t& e);
-
- private:
-  static int32_t DecodeAsciiSegment(CBC_CommonBitSource* bits,
-                                    CFX_ByteString& result,
-                                    CFX_ByteString& resultTrailer,
-                                    int32_t& e);
-  static void DecodeC40Segment(CBC_CommonBitSource* bits,
-                               CFX_ByteString& result,
-                               int32_t& e);
-  static void DecodeTextSegment(CBC_CommonBitSource* bits,
-                                CFX_ByteString& result,
-                                int32_t& e);
-  static void DecodeAnsiX12Segment(CBC_CommonBitSource* bits,
-                                   CFX_ByteString& result,
-                                   int32_t& e);
-  static void ParseTwoBytes(int32_t firstByte,
-                            int32_t secondByte,
-                            CFX_Int32Array& result);
-  static void DecodeEdifactSegment(CBC_CommonBitSource* bits,
-                                   CFX_ByteString& result,
-                                   int32_t& e);
-  static void DecodeBase256Segment(CBC_CommonBitSource* bits,
-                                   CFX_ByteString& result,
-                                   CFX_Int32Array& byteSegments,
-                                   int32_t& e);
-  static uint8_t Unrandomize255State(int32_t randomizedBase256Codeword,
-                                     int32_t base256CodewordPosition);
-
-  static const FX_CHAR C40_BASIC_SET_CHARS[];
-  static const FX_CHAR C40_SHIFT2_SET_CHARS[];
-
-  static const FX_CHAR TEXT_BASIC_SET_CHARS[];
-  static const FX_CHAR TEXT_SHIFT3_SET_CHARS[];
-  static const int32_t PAD_ENCODE;
-  static const int32_t ASCII_ENCODE;
-  static const int32_t C40_ENCODE;
-  static const int32_t TEXT_ENCODE;
-  static const int32_t ANSIX12_ENCODE;
-  static const int32_t EDIFACT_ENCODE;
-  static const int32_t BASE256_ENCODE;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp
deleted file mode 100644
index 423cefc..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-
-CBC_DataMatrixDecoder::CBC_DataMatrixDecoder() {
-  m_rsDecoder = NULL;
-}
-void CBC_DataMatrixDecoder::Init() {
-  m_rsDecoder =
-      new CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField);
-}
-CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder() {
-  delete m_rsDecoder;
-}
-CBC_CommonDecoderResult* CBC_DataMatrixDecoder::Decode(
-    CBC_CommonBitMatrix* bits,
-    int32_t& e) {
-  CBC_DataMatrixBitMatrixParser parser;
-  parser.Init(bits, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_DataMatrixVersion* version = parser.GetVersion();
-  std::unique_ptr<CFX_ByteArray> codewords(parser.ReadCodewords(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* dataBlocks =
-      CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t dataBlocksCount = dataBlocks->GetSize();
-  int32_t totalBytes = 0;
-  int32_t i, j;
-  for (i = 0; i < dataBlocksCount; i++) {
-    totalBytes +=
-        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords();
-  }
-  CFX_ByteArray resultBytes;
-  resultBytes.SetSize(totalBytes);
-  for (j = 0; j < dataBlocksCount; j++) {
-    CFX_ByteArray* codewordBytes =
-        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords();
-    int32_t numDataCodewords =
-        ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords();
-    CorrectErrors(*codewordBytes, numDataCodewords, e);
-    if (e != BCExceptionNO) {
-      for (int32_t i = 0; i < dataBlocks->GetSize(); i++) {
-        delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];
-      }
-      delete dataBlocks;
-      dataBlocks = NULL;
-      return NULL;
-    }
-    int32_t i;
-    for (i = 0; i < numDataCodewords; i++) {
-      resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i];
-    }
-  }
-  for (i = 0; i < (dataBlocks->GetSize()); i++) {
-    delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];
-  }
-  delete dataBlocks;
-  dataBlocks = NULL;
-  CBC_CommonDecoderResult* resultR =
-      CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return resultR;
-}
-void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray& codewordBytes,
-                                          int32_t numDataCodewords,
-                                          int32_t& e) {
-  int32_t numCodewords = codewordBytes.GetSize();
-  CFX_Int32Array codewordsInts;
-  codewordsInts.SetSize(numCodewords);
-  int32_t i;
-  for (i = 0; i < numCodewords; i++) {
-    codewordsInts[i] = codewordBytes[i] & 0xFF;
-  }
-  int32_t numECCodewords = codewordBytes.GetSize() - numDataCodewords;
-  m_rsDecoder->Decode(&codewordsInts, numECCodewords, e);
-  if (e != BCExceptionNO) {
-    e = BCExceptionChecksumException;
-    return;
-  }
-  for (i = 0; i < numDataCodewords; i++) {
-    codewordBytes[i] = (uint8_t)codewordsInts[i];
-  }
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h
deleted file mode 100644
index d80a512..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_ReedSolomonDecoder;
-class CBC_CommonDecoderResult;
-class CBC_CommonBitMatrix;
-
-class CBC_DataMatrixDecoder {
- public:
-  CBC_DataMatrixDecoder();
-  virtual ~CBC_DataMatrixDecoder();
-  CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits, int32_t& e);
-  virtual void Init();
-
- private:
-  void CorrectErrors(CFX_ByteArray& codewordBytes,
-                     int32_t numDataCodewords,
-                     int32_t& e);
-  CBC_ReedSolomonDecoder* m_rsDecoder;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDECODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp
deleted file mode 100644
index c29c648..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_DataMatrixDetector::INTEGERS[5] = {0, 1, 2, 3, 4};
-CBC_DataMatrixDetector::CBC_DataMatrixDetector(CBC_CommonBitMatrix* image)
-    : m_image(image), m_rectangleDetector(NULL) {}
-void CBC_DataMatrixDetector::Init(int32_t& e) {
-  m_rectangleDetector = new CBC_WhiteRectangleDetector(m_image);
-  m_rectangleDetector->Init(e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-CBC_DataMatrixDetector::~CBC_DataMatrixDetector() {
-  delete m_rectangleDetector;
-}
-inline FX_BOOL ResultPointsAndTransitionsComparator(void* a, void* b) {
-  return ((CBC_ResultPointsAndTransitions*)b)->GetTransitions() >
-         ((CBC_ResultPointsAndTransitions*)a)->GetTransitions();
-}
-CBC_QRDetectorResult* CBC_DataMatrixDetector::Detect(int32_t& e) {
-  CFX_PtrArray* cornerPoints = m_rectangleDetector->Detect(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_ResultPoint* pointA = (CBC_ResultPoint*)(*cornerPoints)[0];
-  CBC_ResultPoint* pointB = (CBC_ResultPoint*)(*cornerPoints)[1];
-  CBC_ResultPoint* pointC = (CBC_ResultPoint*)(*cornerPoints)[2];
-  CBC_ResultPoint* pointD = (CBC_ResultPoint*)(*cornerPoints)[3];
-  delete cornerPoints;
-  cornerPoints = NULL;
-  CFX_PtrArray transitions;
-  transitions.Add(TransitionsBetween(pointA, pointB));
-  transitions.Add(TransitionsBetween(pointA, pointC));
-  transitions.Add(TransitionsBetween(pointB, pointD));
-  transitions.Add(TransitionsBetween(pointC, pointD));
-  BC_FX_PtrArray_Sort(transitions, &ResultPointsAndTransitionsComparator);
-  delete ((CBC_ResultPointsAndTransitions*)transitions[2]);
-  delete ((CBC_ResultPointsAndTransitions*)transitions[3]);
-  CBC_ResultPointsAndTransitions* lSideOne =
-      (CBC_ResultPointsAndTransitions*)transitions[0];
-  CBC_ResultPointsAndTransitions* lSideTwo =
-      (CBC_ResultPointsAndTransitions*)transitions[1];
-  CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t> pointCount;
-  Increment(pointCount, lSideOne->GetFrom());
-  Increment(pointCount, lSideOne->GetTo());
-  Increment(pointCount, lSideTwo->GetFrom());
-  Increment(pointCount, lSideTwo->GetTo());
-  delete ((CBC_ResultPointsAndTransitions*)transitions[1]);
-  delete ((CBC_ResultPointsAndTransitions*)transitions[0]);
-  transitions.RemoveAll();
-  CBC_ResultPoint* maybeTopLeft = NULL;
-  CBC_ResultPoint* bottomLeft = NULL;
-  CBC_ResultPoint* maybeBottomRight = NULL;
-  FX_POSITION itBegin = pointCount.GetStartPosition();
-  while (itBegin) {
-    CBC_ResultPoint* key = 0;
-    int32_t value = 0;
-    pointCount.GetNextAssoc(itBegin, key, value);
-    if (value == 2) {
-      bottomLeft = key;
-    } else {
-      if (maybeBottomRight == NULL) {
-        maybeBottomRight = key;
-      } else {
-        maybeTopLeft = key;
-      }
-    }
-  }
-  if (maybeTopLeft == NULL || bottomLeft == NULL || maybeBottomRight == NULL) {
-    delete pointA;
-    delete pointB;
-    delete pointC;
-    delete pointD;
-    e = BCExceptionNotFound;
-    return NULL;
-  }
-  CFX_PtrArray corners;
-  corners.SetSize(3);
-  corners[0] = maybeTopLeft;
-  corners[1] = bottomLeft;
-  corners[2] = maybeBottomRight;
-  OrderBestPatterns(&corners);
-  CBC_ResultPoint* bottomRight = (CBC_ResultPoint*)corners[0];
-  bottomLeft = (CBC_ResultPoint*)corners[1];
-  CBC_ResultPoint* topLeft = (CBC_ResultPoint*)corners[2];
-  CBC_ResultPoint* topRight = NULL;
-  int32_t value;
-  if (!pointCount.Lookup(pointA, value)) {
-    topRight = pointA;
-  } else if (!pointCount.Lookup(pointB, value)) {
-    topRight = pointB;
-  } else if (!pointCount.Lookup(pointC, value)) {
-    topRight = pointC;
-  } else {
-    topRight = pointD;
-  }
-  int32_t dimensionTop = std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(topLeft, topRight))
-                             ->GetTransitions();
-  int32_t dimensionRight = std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                               TransitionsBetween(bottomRight, topRight))
-                               ->GetTransitions();
-  if ((dimensionTop & 0x01) == 1) {
-    dimensionTop++;
-  }
-  dimensionTop += 2;
-  if ((dimensionRight & 0x01) == 1) {
-    dimensionRight++;
-  }
-  dimensionRight += 2;
-  std::unique_ptr<CBC_CommonBitMatrix> bits;
-  std::unique_ptr<CBC_ResultPoint> correctedTopRight;
-  if (4 * dimensionTop >= 7 * dimensionRight ||
-      4 * dimensionRight >= 7 * dimensionTop) {
-    correctedTopRight.reset(
-        CorrectTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight,
-                                   dimensionTop, dimensionRight));
-    if (correctedTopRight.get() == NULL) {
-      correctedTopRight.reset(topRight);
-    } else {
-      delete topRight;
-      topRight = NULL;
-    }
-    dimensionTop = std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                       TransitionsBetween(topLeft, correctedTopRight.get()))
-                       ->GetTransitions();
-    dimensionRight =
-        std::unique_ptr<CBC_ResultPointsAndTransitions>(
-            TransitionsBetween(bottomRight, correctedTopRight.get()))
-            ->GetTransitions();
-    if ((dimensionTop & 0x01) == 1) {
-      dimensionTop++;
-    }
-    if ((dimensionRight & 0x01) == 1) {
-      dimensionRight++;
-    }
-    bits.reset(SampleGrid(m_image, topLeft, bottomLeft, bottomRight,
-                          correctedTopRight.get(), dimensionTop, dimensionRight,
-                          e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  } else {
-    int32_t dimension = std::min(dimensionRight, dimensionTop);
-    correctedTopRight.reset(
-        CorrectTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension));
-    if (correctedTopRight.get() == NULL) {
-      correctedTopRight.reset(topRight);
-    } else {
-      delete topRight;
-      topRight = NULL;
-    }
-    int32_t dimensionCorrected =
-        std::max(std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                     TransitionsBetween(topLeft, correctedTopRight.get()))
-                     ->GetTransitions(),
-                 std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                     TransitionsBetween(bottomRight, correctedTopRight.get()))
-                     ->GetTransitions());
-    dimensionCorrected++;
-    if ((dimensionCorrected & 0x01) == 1) {
-      dimensionCorrected++;
-    }
-    bits.reset(SampleGrid(m_image, topLeft, bottomLeft, bottomRight,
-                          correctedTopRight.get(), dimensionCorrected,
-                          dimensionCorrected, e));
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CFX_PtrArray* result = new CFX_PtrArray;
-  result->SetSize(4);
-  result->Add(topLeft);
-  result->Add(bottomLeft);
-  result->Add(bottomRight);
-  result->Add(correctedTopRight.release());
-  return new CBC_QRDetectorResult(bits.release(), result);
-}
-CBC_ResultPoint* CBC_DataMatrixDetector::CorrectTopRightRectangular(
-    CBC_ResultPoint* bottomLeft,
-    CBC_ResultPoint* bottomRight,
-    CBC_ResultPoint* topLeft,
-    CBC_ResultPoint* topRight,
-    int32_t dimensionTop,
-    int32_t dimensionRight) {
-  FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimensionTop;
-  int32_t norm = Distance(topLeft, topRight);
-  FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm;
-  FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm;
-  std::unique_ptr<CBC_ResultPoint> c1(new CBC_ResultPoint(
-      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
-  corr = Distance(bottomLeft, topLeft) / (FX_FLOAT)dimensionRight;
-  norm = Distance(bottomRight, topRight);
-  cos = (topRight->GetX() - bottomRight->GetX()) / norm;
-  sin = (topRight->GetY() - bottomRight->GetY()) / norm;
-  std::unique_ptr<CBC_ResultPoint> c2(new CBC_ResultPoint(
-      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
-  if (!IsValid(c1.get())) {
-    if (IsValid(c2.get())) {
-      return c2.release();
-    }
-    return NULL;
-  } else if (!IsValid(c2.get())) {
-    return c1.release();
-  }
-  int32_t l1 = FXSYS_abs(dimensionTop -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(topLeft, c1.get()))
-                             ->GetTransitions()) +
-               FXSYS_abs(dimensionRight -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(bottomRight, c1.get()))
-                             ->GetTransitions());
-  int32_t l2 = FXSYS_abs(dimensionTop -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(topLeft, c2.get()))
-                             ->GetTransitions()) +
-               FXSYS_abs(dimensionRight -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(bottomRight, c2.get()))
-                             ->GetTransitions());
-  if (l1 <= l2) {
-    return c1.release();
-  }
-  return c2.release();
-}
-CBC_ResultPoint* CBC_DataMatrixDetector::CorrectTopRight(
-    CBC_ResultPoint* bottomLeft,
-    CBC_ResultPoint* bottomRight,
-    CBC_ResultPoint* topLeft,
-    CBC_ResultPoint* topRight,
-    int32_t dimension) {
-  FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimension;
-  int32_t norm = Distance(topLeft, topRight);
-  FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm;
-  FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm;
-  std::unique_ptr<CBC_ResultPoint> c1(new CBC_ResultPoint(
-      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
-  corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimension;
-  norm = Distance(bottomRight, topRight);
-  cos = (topRight->GetX() - bottomRight->GetX()) / norm;
-  sin = (topRight->GetY() - bottomRight->GetY()) / norm;
-  std::unique_ptr<CBC_ResultPoint> c2(new CBC_ResultPoint(
-      topRight->GetX() + corr * cos, topRight->GetY() + corr * sin));
-  if (!IsValid(c1.get())) {
-    if (IsValid(c2.get())) {
-      return c2.release();
-    }
-    return NULL;
-  } else if (!IsValid(c2.get())) {
-    return c1.release();
-  }
-  int32_t l1 = FXSYS_abs(std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(topLeft, c1.get()))
-                             ->GetTransitions() -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(bottomRight, c1.get()))
-                             ->GetTransitions());
-  int32_t l2 = FXSYS_abs(std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(topLeft, c2.get()))
-                             ->GetTransitions() -
-                         std::unique_ptr<CBC_ResultPointsAndTransitions>(
-                             TransitionsBetween(bottomRight, c2.get()))
-                             ->GetTransitions());
-  return l1 <= l2 ? c1.release() : c2.release();
-}
-FX_BOOL CBC_DataMatrixDetector::IsValid(CBC_ResultPoint* p) {
-  return p->GetX() >= 0 && p->GetX() < m_image->GetWidth() && p->GetY() > 0 &&
-         p->GetY() < m_image->GetHeight();
-}
-int32_t CBC_DataMatrixDetector::Round(FX_FLOAT d) {
-  return (int32_t)(d + 0.5f);
-}
-int32_t CBC_DataMatrixDetector::Distance(CBC_ResultPoint* a,
-                                         CBC_ResultPoint* b) {
-  return Round(
-      (FX_FLOAT)sqrt((a->GetX() - b->GetX()) * (a->GetX() - b->GetX()) +
-                     (a->GetY() - b->GetY()) * (a->GetY() - b->GetY())));
-}
-void CBC_DataMatrixDetector::Increment(
-    CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t>& table,
-    CBC_ResultPoint* key) {
-  int32_t value;
-  if (table.Lookup(key, value)) {
-    table.SetAt(key, INTEGERS[value + 1]);
-  } else {
-    table.SetAt(key, INTEGERS[1]);
-  }
-}
-CBC_CommonBitMatrix* CBC_DataMatrixDetector::SampleGrid(
-    CBC_CommonBitMatrix* image,
-    CBC_ResultPoint* topLeft,
-    CBC_ResultPoint* bottomLeft,
-    CBC_ResultPoint* bottomRight,
-    CBC_ResultPoint* topRight,
-    int32_t dimensionX,
-    int32_t dimensionY,
-    int32_t& e) {
-  CBC_QRGridSampler& sampler = CBC_QRGridSampler::GetInstance();
-  CBC_CommonBitMatrix* cbm = sampler.SampleGrid(
-      image, dimensionX, dimensionY, 0.5f, 0.5f, dimensionX - 0.5f, 0.5f,
-      dimensionX - 0.5f, dimensionY - 0.5f, 0.5f, dimensionY - 0.5f,
-      topLeft->GetX(), topLeft->GetY(), topRight->GetX(), topRight->GetY(),
-      bottomRight->GetX(), bottomRight->GetY(), bottomLeft->GetX(),
-      bottomLeft->GetY(), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return cbm;
-}
-CBC_ResultPointsAndTransitions* CBC_DataMatrixDetector::TransitionsBetween(
-    CBC_ResultPoint* from,
-    CBC_ResultPoint* to) {
-  int32_t fromX = (int32_t)from->GetX();
-  int32_t fromY = (int32_t)from->GetY();
-  int32_t toX = (int32_t)to->GetX();
-  int32_t toY = (int32_t)to->GetY();
-  FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX);
-  if (steep) {
-    int32_t temp = fromX;
-    fromX = fromY;
-    fromY = temp;
-    temp = toX;
-    toX = toY;
-    toY = temp;
-  }
-  int32_t dx = FXSYS_abs(toX - fromX);
-  int32_t dy = FXSYS_abs(toY - fromY);
-  int32_t error = -dx >> 1;
-  int32_t ystep = fromY < toY ? 1 : -1;
-  int32_t xstep = fromX < toX ? 1 : -1;
-  int32_t transitions = 0;
-  FX_BOOL inBlack = m_image->Get(steep ? fromY : fromX, steep ? fromX : fromY);
-  for (int32_t x = fromX, y = fromY; x != toX; x += xstep) {
-    FX_BOOL isBlack = m_image->Get(steep ? y : x, steep ? x : y);
-    if (isBlack != inBlack) {
-      transitions++;
-      inBlack = isBlack;
-    }
-    error += dy;
-    if (error > 0) {
-      if (y == toY) {
-        break;
-      }
-      y += ystep;
-      error -= dx;
-    }
-  }
-  return new CBC_ResultPointsAndTransitions(from, to, transitions);
-}
-void CBC_DataMatrixDetector::OrderBestPatterns(CFX_PtrArray* patterns) {
-  FX_FLOAT abDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0],
-                                           (CBC_ResultPoint*)(*patterns)[1]);
-  FX_FLOAT bcDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[1],
-                                           (CBC_ResultPoint*)(*patterns)[2]);
-  FX_FLOAT acDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0],
-                                           (CBC_ResultPoint*)(*patterns)[2]);
-  CBC_ResultPoint *topLeft, *topRight, *bottomLeft;
-  if (bcDistance >= abDistance && bcDistance >= acDistance) {
-    topLeft = (CBC_ResultPoint*)(*patterns)[0];
-    topRight = (CBC_ResultPoint*)(*patterns)[1];
-    bottomLeft = (CBC_ResultPoint*)(*patterns)[2];
-  } else if (acDistance >= bcDistance && acDistance >= abDistance) {
-    topLeft = (CBC_ResultPoint*)(*patterns)[1];
-    topRight = (CBC_ResultPoint*)(*patterns)[0];
-    bottomLeft = (CBC_ResultPoint*)(*patterns)[2];
-  } else {
-    topLeft = (CBC_ResultPoint*)(*patterns)[2];
-    topRight = (CBC_ResultPoint*)(*patterns)[0];
-    bottomLeft = (CBC_ResultPoint*)(*patterns)[1];
-  }
-  if ((bottomLeft->GetY() - topLeft->GetY()) *
-          (topRight->GetX() - topLeft->GetX()) <
-      (bottomLeft->GetX() - topLeft->GetX()) *
-          (topRight->GetY() - topLeft->GetY())) {
-    CBC_ResultPoint* temp = topRight;
-    topRight = bottomLeft;
-    bottomLeft = temp;
-  }
-  (*patterns)[0] = bottomLeft;
-  (*patterns)[1] = topLeft;
-  (*patterns)[2] = topRight;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h
deleted file mode 100644
index 34cbcb9..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_WhiteRectangleDetector;
-class CBC_ResultPoint;
-class CBC_QRDetectorResult;
-class CBC_DataMatrixDetector;
-class ResultPointsAndTransitions;
-class CBC_ResultPointsAndTransitions {
- public:
-  CBC_ResultPointsAndTransitions(CBC_ResultPoint* from,
-                                 CBC_ResultPoint* to,
-                                 int32_t transitions) {
-    m_from = from;
-    m_to = to;
-    m_transitions = transitions;
-  }
-  ~CBC_ResultPointsAndTransitions() {}
-  CBC_ResultPoint* GetFrom() { return m_from; }
-  CBC_ResultPoint* GetTo() { return m_to; }
-  int32_t GetTransitions() { return m_transitions; }
-
- private:
-  CBC_ResultPoint* m_from;
-  CBC_ResultPoint* m_to;
-  int32_t m_transitions;
-};
-class CBC_DataMatrixDetector {
- public:
-  CBC_DataMatrixDetector(CBC_CommonBitMatrix* image);
-  virtual ~CBC_DataMatrixDetector();
-  CBC_QRDetectorResult* Detect(int32_t& e);
-  CBC_ResultPoint* CorrectTopRightRectangular(CBC_ResultPoint* bottomLeft,
-                                              CBC_ResultPoint* bottomRight,
-                                              CBC_ResultPoint* topLeft,
-                                              CBC_ResultPoint* topRight,
-                                              int32_t dimensionTop,
-                                              int32_t dimensionRight);
-  CBC_ResultPoint* CorrectTopRight(CBC_ResultPoint* bottomLeft,
-                                   CBC_ResultPoint* bottomRight,
-                                   CBC_ResultPoint* topLeft,
-                                   CBC_ResultPoint* topRight,
-                                   int32_t dimension);
-  CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
-                                  CBC_ResultPoint* topLeft,
-                                  CBC_ResultPoint* bottomLeft,
-                                  CBC_ResultPoint* bottomRight,
-                                  CBC_ResultPoint* topRight,
-                                  int32_t dimensionX,
-                                  int32_t dimensionY,
-                                  int32_t& e);
-  CBC_ResultPointsAndTransitions* TransitionsBetween(CBC_ResultPoint* from,
-                                                     CBC_ResultPoint* to);
-  FX_BOOL IsValid(CBC_ResultPoint* p);
-  int32_t Distance(CBC_ResultPoint* a, CBC_ResultPoint* b);
-  void Increment(CFX_MapPtrTemplate<CBC_ResultPoint*, int32_t>& table,
-                 CBC_ResultPoint* key);
-  int32_t Round(FX_FLOAT d);
-  void OrderBestPatterns(CFX_PtrArray* patterns);
-  virtual void Init(int32_t& e);
-
- private:
-  static const int32_t INTEGERS[5];
-
-  CBC_CommonBitMatrix* m_image;
-  CBC_WhiteRectangleDetector* m_rectangleDetector;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXDETECTOR_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp
deleted file mode 100644
index 36a238b..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_DataMatrixReader::CBC_DataMatrixReader() {
-  m_decoder = NULL;
-}
-void CBC_DataMatrixReader::Init() {
-  m_decoder = new CBC_DataMatrixDecoder;
-  m_decoder->Init();
-}
-CBC_DataMatrixReader::~CBC_DataMatrixReader() {
-  delete m_decoder;
-}
-CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap* image,
-                                            int32_t hints,
-                                            int32_t& e) {
-  CBC_CommonBitMatrix* cdr = image->GetBlackMatrix(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CBC_DataMatrixDetector detector(cdr);
-  detector.Init(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  std::unique_ptr<CBC_QRDetectorResult> detectorResult(detector.Detect(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  std::unique_ptr<CBC_CommonDecoderResult> decodeResult(
-      m_decoder->Decode(detectorResult->GetBits(), e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return decodeResult->GetText();
-}
-CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap* image,
-                                            int32_t& e) {
-  CFX_ByteString bs = Decode(image, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return bs;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h
deleted file mode 100644
index 5389c48..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-
-class CBC_BinaryBitmap;
-class CBC_DataMatrixDecoder;
-
-class CBC_DataMatrixReader : public CBC_Reader {
- public:
-  CBC_DataMatrixReader();
-  virtual ~CBC_DataMatrixReader();
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int hints, int32_t& e);
-
-  virtual void Init();
-
- private:
-  CBC_DataMatrixDecoder* m_decoder;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXREADER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
deleted file mode 100644
index 2e7685d..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144()
-    : CBC_SymbolInfo(FALSE, 1558, 620, 22, 22, 36) {
-  m_rsBlockData = -1;
-  m_rsBlockError = 62;
-}
-CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() {}
-int32_t CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() {
-  return 10;
-}
-int32_t CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(
-    int32_t index) {
-  return (index <= 8) ? 156 : 155;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h
deleted file mode 100644
index 607e893..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-
-class CBC_DataMatrixSymbolInfo144 : public CBC_SymbolInfo {
- public:
-  CBC_DataMatrixSymbolInfo144();
-  virtual ~CBC_DataMatrixSymbolInfo144();
-  int32_t getInterleavedBlockCount();
-  int32_t getDataLengthForInterleavedBlock(int32_t index);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXSYMBOLINFO144_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp
deleted file mode 100644
index 4fb3a3f..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdint.h>
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL;
-
-void CBC_DataMatrixVersion::Initialize() {
-  VERSIONS = new CFX_PtrArray();
-}
-void CBC_DataMatrixVersion::Finalize() {
-  for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
-    delete ((CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)));
-  }
-  VERSIONS->RemoveAll();
-  delete VERSIONS;
-}
-CBC_DataMatrixVersion::CBC_DataMatrixVersion(int32_t versionNumber,
-                                             int32_t symbolSizeRows,
-                                             int32_t symbolSizeColumns,
-                                             int32_t dataRegionSizeRows,
-                                             int32_t dataRegionSizeColumns,
-                                             ECBlocks* ecBlocks) {
-  m_versionNumber = versionNumber;
-  m_symbolSizeRows = symbolSizeRows;
-  m_symbolSizeColumns = symbolSizeColumns;
-  m_dataRegionSizeRows = dataRegionSizeRows;
-  m_dataRegionSizeColumns = dataRegionSizeColumns;
-  m_ecBlocks = ecBlocks;
-  int32_t total = 0;
-  int32_t ecCodewords = ecBlocks->GetECCodewords();
-  const CFX_PtrArray& ecbArray = ecBlocks->GetECBlocks();
-  for (int32_t i = 0; i < ecbArray.GetSize(); i++) {
-    total += ((ECB*)ecbArray[i])->GetCount() *
-             (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords);
-  }
-  m_totalCodewords = total;
-}
-CBC_DataMatrixVersion::~CBC_DataMatrixVersion() {
-  delete m_ecBlocks;
-}
-int32_t CBC_DataMatrixVersion::GetVersionNumber() {
-  return m_versionNumber;
-}
-int32_t CBC_DataMatrixVersion::GetSymbolSizeRows() {
-  return m_symbolSizeRows;
-}
-int32_t CBC_DataMatrixVersion::GetSymbolSizeColumns() {
-  return m_symbolSizeColumns;
-}
-int32_t CBC_DataMatrixVersion::GetDataRegionSizeRows() {
-  return m_dataRegionSizeRows;
-}
-int32_t CBC_DataMatrixVersion::GetDataRegionSizeColumns() {
-  return m_dataRegionSizeColumns;
-}
-int32_t CBC_DataMatrixVersion::GetTotalCodewords() {
-  return m_totalCodewords;
-}
-ECBlocks* CBC_DataMatrixVersion::GetECBlocks() {
-  return m_ecBlocks;
-}
-void CBC_DataMatrixVersion::ReleaseAll() {
-  for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
-    delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i);
-  }
-  VERSIONS->RemoveAll();
-}
-CBC_DataMatrixVersion* CBC_DataMatrixVersion::GetVersionForDimensions(
-    int32_t numRows,
-    int32_t numColumns,
-    int32_t& e) {
-  if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
-    e = BCExceptionNotFound;
-    return NULL;
-  }
-  if (VERSIONS->GetSize() == 0) {
-    VERSIONS->Add(new CBC_DataMatrixVersion(1, 10, 10, 8, 8,
-                                            new ECBlocks(5, new ECB(1, 3))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(2, 12, 12, 10, 10,
-                                            new ECBlocks(7, new ECB(1, 5))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(3, 14, 14, 12, 12,
-                                            new ECBlocks(10, new ECB(1, 8))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(4, 16, 16, 14, 14,
-                                            new ECBlocks(12, new ECB(1, 12))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(5, 18, 18, 16, 16,
-                                            new ECBlocks(14, new ECB(1, 18))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(6, 20, 20, 18, 18,
-                                            new ECBlocks(18, new ECB(1, 22))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(7, 22, 22, 20, 20,
-                                            new ECBlocks(20, new ECB(1, 30))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(8, 24, 24, 22, 22,
-                                            new ECBlocks(24, new ECB(1, 36))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(9, 26, 26, 24, 24,
-                                            new ECBlocks(28, new ECB(1, 44))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(10, 32, 32, 14, 14,
-                                            new ECBlocks(36, new ECB(1, 62))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(11, 36, 36, 16, 16,
-                                            new ECBlocks(42, new ECB(1, 86))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(12, 40, 40, 18, 18,
-                                            new ECBlocks(48, new ECB(1, 114))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(13, 44, 44, 20, 20,
-                                            new ECBlocks(56, new ECB(1, 144))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(14, 48, 48, 22, 22,
-                                            new ECBlocks(68, new ECB(1, 174))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(15, 52, 52, 24, 24,
-                                            new ECBlocks(42, new ECB(2, 102))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(16, 64, 64, 14, 14,
-                                            new ECBlocks(56, new ECB(2, 140))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(17, 72, 72, 16, 16,
-                                            new ECBlocks(36, new ECB(4, 92))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(18, 80, 80, 18, 18,
-                                            new ECBlocks(48, new ECB(4, 114))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(19, 88, 88, 20, 20,
-                                            new ECBlocks(56, new ECB(4, 144))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(20, 96, 96, 22, 22,
-                                            new ECBlocks(68, new ECB(4, 174))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(21, 104, 104, 24, 24,
-                                            new ECBlocks(56, new ECB(6, 136))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(22, 120, 120, 18, 18,
-                                            new ECBlocks(68, new ECB(6, 175))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(23, 132, 132, 20, 20,
-                                            new ECBlocks(62, new ECB(8, 163))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(
-        24, 144, 144, 22, 22,
-        new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(25, 8, 18, 6, 16,
-                                            new ECBlocks(7, new ECB(1, 5))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(26, 8, 32, 6, 14,
-                                            new ECBlocks(11, new ECB(1, 10))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(27, 12, 26, 10, 24,
-                                            new ECBlocks(14, new ECB(1, 16))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(28, 12, 36, 10, 16,
-                                            new ECBlocks(18, new ECB(1, 22))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(29, 16, 36, 14, 16,
-                                            new ECBlocks(24, new ECB(1, 32))));
-    VERSIONS->Add(new CBC_DataMatrixVersion(30, 16, 48, 14, 22,
-                                            new ECBlocks(28, new ECB(1, 49))));
-  }
-  int32_t numVersions = VERSIONS->GetSize();
-  for (int32_t i = 0; i < numVersions; ++i) {
-    if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows ==
-            numRows &&
-        ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns ==
-            numColumns) {
-      return (CBC_DataMatrixVersion*)(*VERSIONS)[i];
-    }
-  }
-  e = BCExceptionNotFound;
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h
deleted file mode 100644
index 0a29e2b..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_DataMatrixVersion;
-
-class ECB {
- public:
-  ECB(int32_t count, int32_t dataCodewords) {
-    m_count = count;
-    m_dataCodewords = dataCodewords;
-  }
-
-  int32_t GetCount() { return m_count; }
-
-  int32_t GetDataCodewords() { return m_dataCodewords; }
-
- private:
-  int32_t m_count;
-  int32_t m_dataCodewords;
-};
-
-class ECBlocks {
- public:
-  ECBlocks(int32_t ecCodewords, ECB* ecBlocks) {
-    m_ecCodewords = ecCodewords;
-    m_ecBlocks.Add(ecBlocks);
-  }
-
-  ECBlocks(int32_t ecCodewords, ECB* ecBlocks1, ECB* ecBlocks2) {
-    m_ecCodewords = ecCodewords;
-    m_ecBlocks.Add(ecBlocks1);
-    m_ecBlocks.Add(ecBlocks2);
-  }
-  ~ECBlocks() {
-    for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
-      delete (ECB*)m_ecBlocks[i];
-    }
-    m_ecBlocks.RemoveAll();
-  }
-
-  int32_t GetECCodewords() { return m_ecCodewords; }
-
-  const CFX_PtrArray& GetECBlocks() { return m_ecBlocks; }
-
- private:
-  int32_t m_ecCodewords;
-  CFX_PtrArray m_ecBlocks;
-};
-
-class CBC_DataMatrixVersion {
- public:
-  CBC_DataMatrixVersion(int32_t versionNumber,
-                        int32_t symbolSizeRows,
-                        int32_t symbolSizeColumns,
-                        int32_t dataRegionSizeRows,
-                        int32_t dataRegionSizeColumns,
-                        ECBlocks* ecBlocks);
-  virtual ~CBC_DataMatrixVersion();
-  static void Initialize();
-  static void Finalize();
-  int32_t GetVersionNumber();
-  int32_t GetSymbolSizeRows();
-  int32_t GetSymbolSizeColumns();
-  int32_t GetDataRegionSizeRows();
-  int32_t GetDataRegionSizeColumns();
-  int32_t GetTotalCodewords();
-  ECBlocks* GetECBlocks();
-  static CBC_DataMatrixVersion* GetVersionForDimensions(int32_t numRows,
-                                                        int32_t numColumns,
-                                                        int32_t& e);
-  static void ReleaseAll();
-
- private:
-  int32_t m_versionNumber;
-  int32_t m_symbolSizeRows;
-  int32_t m_symbolSizeColumns;
-  int32_t m_dataRegionSizeRows;
-  int32_t m_dataRegionSizeColumns;
-  ECBlocks* m_ecBlocks;
-  int32_t m_totalCodewords;
-  static CFX_PtrArray* VERSIONS;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXVERSION_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
deleted file mode 100644
index 5a6a082..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h"
-
-CBC_DataMatrixWriter::CBC_DataMatrixWriter() {}
-CBC_DataMatrixWriter::~CBC_DataMatrixWriter() {}
-FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel(int32_t level) {
-  m_iCorrectLevel = level;
-  return TRUE;
-}
-uint8_t* CBC_DataMatrixWriter::Encode(const CFX_WideString& contents,
-                                      int32_t& outWidth,
-                                      int32_t& outHeight,
-                                      int32_t& e) {
-  if (outWidth < 0 || outHeight < 0) {
-    e = BCExceptionHeightAndWidthMustBeAtLeast1;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CBC_SymbolShapeHint::SymbolShapeHint shape =
-      CBC_SymbolShapeHint::FORCE_SQUARE;
-  CBC_Dimension* minSize = NULL;
-  CBC_Dimension* maxSize = NULL;
-  CFX_WideString ecLevel;
-  CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(
-      contents, ecLevel, shape, minSize, maxSize, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(
-      encoded.GetLength(), shape, minSize, maxSize, TRUE, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_WideString codewords =
-      CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_DefaultPlacement* placement =
-      new CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e),
-                               symbolInfo->getSymbolDataHeight(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  placement->place();
-  CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  outWidth = bytematrix->GetWidth();
-  outHeight = bytematrix->GetHeight();
-  uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight);
-  FXSYS_memcpy(result, bytematrix->GetArray(), outWidth * outHeight);
-  delete bytematrix;
-  delete placement;
-  return result;
-}
-CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(
-    CBC_DefaultPlacement* placement,
-    CBC_SymbolInfo* symbolInfo,
-    int32_t& e) {
-  int32_t symbolWidth = symbolInfo->getSymbolDataWidth(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t symbolHeight = symbolInfo->getSymbolDataHeight(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_CommonByteMatrix* matrix = new CBC_CommonByteMatrix(
-      symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  matrix->Init();
-  int32_t matrixY = 0;
-  for (int32_t y = 0; y < symbolHeight; y++) {
-    int32_t matrixX;
-    if ((y % symbolInfo->m_matrixHeight) == 0) {
-      matrixX = 0;
-      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
-        matrix->Set(matrixX, matrixY, (x % 2) == 0);
-        matrixX++;
-      }
-      matrixY++;
-    }
-    matrixX = 0;
-    for (int32_t x = 0; x < symbolWidth; x++) {
-      if ((x % symbolInfo->m_matrixWidth) == 0) {
-        matrix->Set(matrixX, matrixY, TRUE);
-        matrixX++;
-      }
-      matrix->Set(matrixX, matrixY, placement->getBit(x, y));
-      matrixX++;
-      if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) {
-        matrix->Set(matrixX, matrixY, (y % 2) == 0);
-        matrixX++;
-      }
-    }
-    matrixY++;
-    if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) {
-      matrixX = 0;
-      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
-        matrix->Set(matrixX, matrixY, TRUE);
-        matrixX++;
-      }
-      matrixY++;
-    }
-  }
-  return matrix;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h
deleted file mode 100644
index d1abbbc..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
-
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-
-class CBC_CommonByteMatrix;
-class CBC_DefaultPlacement;
-class CBC_SymbolInfo;
-
-class CBC_DataMatrixWriter : public CBC_TwoDimWriter {
- public:
-  CBC_DataMatrixWriter();
-  virtual ~CBC_DataMatrixWriter();
-  uint8_t* Encode(const CFX_WideString& contents,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  FX_BOOL SetErrorCorrectionLevel(int32_t level);
-
- private:
-  static CBC_CommonByteMatrix* encodeLowLevel(CBC_DefaultPlacement* placement,
-                                              CBC_SymbolInfo* symbolInfo,
-                                              int32_t& e);
-  int32_t m_iCorrectLevel;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXWRITER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
deleted file mode 100644
index f021b75..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords,
-                                           int32_t numcols,
-                                           int32_t numrows) {
-  m_codewords = codewords;
-  m_numcols = numcols;
-  m_numrows = numrows;
-  m_bits.SetSize(numcols * numrows);
-  for (int32_t i = 0; i < numcols * numrows; i++) {
-    m_bits[i] = (uint8_t)2;
-  }
-}
-CBC_DefaultPlacement::~CBC_DefaultPlacement() {
-  m_bits.RemoveAll();
-}
-int32_t CBC_DefaultPlacement::getNumrows() {
-  return m_numrows;
-}
-int32_t CBC_DefaultPlacement::getNumcols() {
-  return m_numcols;
-}
-CFX_ByteArray& CBC_DefaultPlacement::getBits() {
-  return m_bits;
-}
-FX_BOOL CBC_DefaultPlacement::getBit(int32_t col, int32_t row) {
-  return m_bits[row * m_numcols + col] == 1;
-}
-void CBC_DefaultPlacement::setBit(int32_t col, int32_t row, FX_BOOL bit) {
-  m_bits[row * m_numcols + col] = bit ? (uint8_t)1 : (uint8_t)0;
-}
-FX_BOOL CBC_DefaultPlacement::hasBit(int32_t col, int32_t row) {
-  return m_bits[row * m_numcols + col] != 2;
-}
-void CBC_DefaultPlacement::place() {
-  int32_t pos = 0;
-  int32_t row = 4;
-  int32_t col = 0;
-  do {
-    if ((row == m_numrows) && (col == 0)) {
-      corner1(pos++);
-    }
-    if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) {
-      corner2(pos++);
-    }
-    if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) {
-      corner3(pos++);
-    }
-    if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) {
-      corner4(pos++);
-    }
-    do {
-      if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) {
-        utah(row, col, pos++);
-      }
-      row -= 2;
-      col += 2;
-    } while (row >= 0 && (col < m_numcols));
-    row++;
-    col += 3;
-    do {
-      if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) {
-        utah(row, col, pos++);
-      }
-      row += 2;
-      col -= 2;
-    } while ((row < m_numrows) && (col >= 0));
-    row += 3;
-    col++;
-  } while ((row < m_numrows) || (col < m_numcols));
-  if (!hasBit(m_numcols - 1, m_numrows - 1)) {
-    setBit(m_numcols - 1, m_numrows - 1, TRUE);
-    setBit(m_numcols - 2, m_numrows - 2, TRUE);
-  }
-}
-void CBC_DefaultPlacement::module(int32_t row,
-                                  int32_t col,
-                                  int32_t pos,
-                                  int32_t bit) {
-  if (row < 0) {
-    row += m_numrows;
-    col += 4 - ((m_numrows + 4) % 8);
-  }
-  if (col < 0) {
-    col += m_numcols;
-    row += 4 - ((m_numcols + 4) % 8);
-  }
-  int32_t v = m_codewords.GetAt(pos);
-  v &= 1 << (8 - bit);
-  setBit(col, row, v != 0);
-}
-void CBC_DefaultPlacement::utah(int32_t row, int32_t col, int32_t pos) {
-  module(row - 2, col - 2, pos, 1);
-  module(row - 2, col - 1, pos, 2);
-  module(row - 1, col - 2, pos, 3);
-  module(row - 1, col - 1, pos, 4);
-  module(row - 1, col, pos, 5);
-  module(row, col - 2, pos, 6);
-  module(row, col - 1, pos, 7);
-  module(row, col, pos, 8);
-}
-void CBC_DefaultPlacement::corner1(int32_t pos) {
-  module(m_numrows - 1, 0, pos, 1);
-  module(m_numrows - 1, 1, pos, 2);
-  module(m_numrows - 1, 2, pos, 3);
-  module(0, m_numcols - 2, pos, 4);
-  module(0, m_numcols - 1, pos, 5);
-  module(1, m_numcols - 1, pos, 6);
-  module(2, m_numcols - 1, pos, 7);
-  module(3, m_numcols - 1, pos, 8);
-}
-void CBC_DefaultPlacement::corner2(int32_t pos) {
-  module(m_numrows - 3, 0, pos, 1);
-  module(m_numrows - 2, 0, pos, 2);
-  module(m_numrows - 1, 0, pos, 3);
-  module(0, m_numcols - 4, pos, 4);
-  module(0, m_numcols - 3, pos, 5);
-  module(0, m_numcols - 2, pos, 6);
-  module(0, m_numcols - 1, pos, 7);
-  module(1, m_numcols - 1, pos, 8);
-}
-void CBC_DefaultPlacement::corner3(int32_t pos) {
-  module(m_numrows - 3, 0, pos, 1);
-  module(m_numrows - 2, 0, pos, 2);
-  module(m_numrows - 1, 0, pos, 3);
-  module(0, m_numcols - 2, pos, 4);
-  module(0, m_numcols - 1, pos, 5);
-  module(1, m_numcols - 1, pos, 6);
-  module(2, m_numcols - 1, pos, 7);
-  module(3, m_numcols - 1, pos, 8);
-}
-void CBC_DefaultPlacement::corner4(int32_t pos) {
-  module(m_numrows - 1, 0, pos, 1);
-  module(m_numrows - 1, m_numcols - 1, pos, 2);
-  module(0, m_numcols - 3, pos, 3);
-  module(0, m_numcols - 2, pos, 4);
-  module(0, m_numcols - 1, pos, 5);
-  module(1, m_numcols - 3, pos, 6);
-  module(1, m_numcols - 2, pos, 7);
-  module(1, m_numcols - 1, pos, 8);
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h
deleted file mode 100644
index be67f3c..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_DefaultPlacement {
- public:
-  CBC_DefaultPlacement(CFX_WideString codewords,
-                       int32_t numcols,
-                       int32_t numrows);
-  virtual ~CBC_DefaultPlacement();
-
-  int32_t getNumrows();
-  int32_t getNumcols();
-  CFX_ByteArray& getBits();
-  FX_BOOL getBit(int32_t col, int32_t row);
-  void setBit(int32_t col, int32_t row, FX_BOOL bit);
-  FX_BOOL hasBit(int32_t col, int32_t row);
-  void place();
-
- private:
-  CFX_WideString m_codewords;
-  int32_t m_numrows;
-  int32_t m_numcols;
-  CFX_ByteArray m_bits;
-  void module(int32_t row, int32_t col, int32_t pos, int32_t bit);
-  void utah(int32_t row, int32_t col, int32_t pos);
-  void corner1(int32_t pos);
-  void corner2(int32_t pos);
-  void corner3(int32_t pos);
-  void corner4(int32_t pos);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DEFAULTPLACEMENT_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
deleted file mode 100644
index 006c851..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_EdifactEncoder::CBC_EdifactEncoder() {}
-CBC_EdifactEncoder::~CBC_EdifactEncoder() {}
-int32_t CBC_EdifactEncoder::getEncodingMode() {
-  return EDIFACT_ENCODATION;
-}
-void CBC_EdifactEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
-  CFX_WideString buffer;
-  while (context.hasMoreCharacters()) {
-    FX_WCHAR c = context.getCurrentChar();
-    encodeChar(c, buffer, e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    context.m_pos++;
-    int32_t count = buffer.GetLength();
-    if (count >= 4) {
-      context.writeCodewords(encodeToCodewords(buffer, 0, e));
-      if (e != BCExceptionNO) {
-        return;
-      }
-      buffer.Delete(0, 4);
-      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-          context.m_msg, context.m_pos, getEncodingMode());
-      if (newMode != getEncodingMode()) {
-        context.signalEncoderChange(ASCII_ENCODATION);
-        break;
-      }
-    }
-  }
-  buffer += (FX_WCHAR)31;
-  handleEOD(context, buffer, e);
-}
-void CBC_EdifactEncoder::handleEOD(CBC_EncoderContext& context,
-                                   CFX_WideString buffer,
-                                   int32_t& e) {
-  int32_t count = buffer.GetLength();
-  if (count == 0) {
-    return;
-  }
-  if (count == 1) {
-    context.updateSymbolInfo(e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    int32_t available =
-        context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
-    int32_t remaining = context.getRemainingCharacters();
-    if (remaining == 0 && available <= 2) {
-      return;
-    }
-  }
-  if (count > 4) {
-    e = BCExceptionIllegalStateCountMustNotExceed4;
-    return;
-  }
-  int32_t restChars = count - 1;
-  CFX_WideString encoded = encodeToCodewords(buffer, 0, e);
-  if (e != BCExceptionNO) {
-    return;
-  }
-  FX_BOOL endOfSymbolReached = !context.hasMoreCharacters();
-  FX_BOOL restInAscii = endOfSymbolReached && restChars <= 2;
-  if (restChars <= 2) {
-    context.updateSymbolInfo(context.getCodewordCount() + restChars, e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    int32_t available =
-        context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
-    if (available >= 3) {
-      restInAscii = FALSE;
-      context.updateSymbolInfo(context.getCodewordCount() + encoded.GetLength(),
-                               e);
-      if (e != BCExceptionNO) {
-        return;
-      }
-    }
-  }
-  if (restInAscii) {
-    context.resetSymbolInfo();
-    context.m_pos -= restChars;
-  } else {
-    context.writeCodewords(encoded);
-  }
-  context.signalEncoderChange(ASCII_ENCODATION);
-}
-void CBC_EdifactEncoder::encodeChar(FX_WCHAR c,
-                                    CFX_WideString& sb,
-                                    int32_t& e) {
-  if (c >= ' ' && c <= '?') {
-    sb += c;
-  } else if (c >= '@' && c <= '^') {
-    sb += (FX_WCHAR)(c - 64);
-  } else {
-    CBC_HighLevelEncoder::illegalCharacter(c, e);
-  }
-}
-CFX_WideString CBC_EdifactEncoder::encodeToCodewords(CFX_WideString sb,
-                                                     int32_t startPos,
-                                                     int32_t& e) {
-  int32_t len = sb.GetLength() - startPos;
-  if (len == 0) {
-    e = BCExceptionNoContents;
-    return (FX_WCHAR*)"";
-  }
-  FX_WCHAR c1 = sb.GetAt(startPos);
-  FX_WCHAR c2 = len >= 2 ? sb.GetAt(startPos + 1) : 0;
-  FX_WCHAR c3 = len >= 3 ? sb.GetAt(startPos + 2) : 0;
-  FX_WCHAR c4 = len >= 4 ? sb.GetAt(startPos + 3) : 0;
-  int32_t v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4;
-  FX_WCHAR cw1 = (FX_WCHAR)((v >> 16) & 255);
-  FX_WCHAR cw2 = (FX_WCHAR)((v >> 8) & 255);
-  FX_WCHAR cw3 = (FX_WCHAR)(v & 255);
-  CFX_WideString res;
-  res += cw1;
-  if (len >= 2) {
-    res += cw2;
-  }
-  if (len >= 3) {
-    res += cw3;
-  }
-  return res;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h
deleted file mode 100644
index 4d905ed..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-class CBC_EdifactEncoder : public CBC_Encoder {
- public:
-  CBC_EdifactEncoder();
-  virtual ~CBC_EdifactEncoder();
-  int32_t getEncodingMode();
-  void Encode(CBC_EncoderContext& context, int32_t& e);
-
- private:
-  static void handleEOD(CBC_EncoderContext& context,
-                        CFX_WideString buffer,
-                        int32_t& e);
-  static void encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
-  static CFX_WideString encodeToCodewords(CFX_WideString sb,
-                                          int32_t startPos,
-                                          int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_EDIFACTENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp
deleted file mode 100644
index 5a5ca3f..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-
-CBC_Encoder::CBC_Encoder() {}
-CBC_Encoder::~CBC_Encoder() {}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_Encoder.h
deleted file mode 100644
index a11b19c..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_Encoder.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
-
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_EncoderContext;
-class CBC_Encoder {
- public:
-  CBC_Encoder();
-  virtual ~CBC_Encoder();
-  virtual int32_t getEncodingMode() = 0;
-  virtual void Encode(CBC_EncoderContext& context, int32_t& e) = 0;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp
deleted file mode 100644
index 54aa534..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg,
-                                       CFX_WideString ecLevel,
-                                       int32_t& e) {
-  CFX_ByteString dststr;
-  CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr);
-  CFX_WideString sb;
-  int32_t c = dststr.GetLength();
-  for (int32_t i = 0; i < c; i++) {
-    FX_WCHAR ch = (FX_WCHAR)(dststr.GetAt(i) & 0xff);
-    if (ch == '?' && dststr.GetAt(i) != '?') {
-      e = BCExceptionCharactersOutsideISO88591Encoding;
-    }
-    sb += ch;
-  }
-  m_msg = sb;
-  m_shape = FORCE_NONE;
-  m_newEncoding = -1;
-  m_pos = 0;
-  m_symbolInfo = NULL;
-  m_skipAtEnd = 0;
-  m_maxSize = NULL;
-  m_minSize = NULL;
-}
-CBC_EncoderContext::~CBC_EncoderContext() {}
-void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape) {
-  m_shape = shape;
-}
-void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize,
-                                            CBC_Dimension* maxSize) {
-  m_maxSize = maxSize;
-  m_minSize = minSize;
-}
-CFX_WideString CBC_EncoderContext::getMessage() {
-  return m_msg;
-}
-void CBC_EncoderContext::setSkipAtEnd(int32_t count) {
-  m_skipAtEnd = count;
-}
-FX_WCHAR CBC_EncoderContext::getCurrentChar() {
-  return m_msg.GetAt(m_pos);
-}
-FX_WCHAR CBC_EncoderContext::getCurrent() {
-  return m_msg.GetAt(m_pos);
-}
-void CBC_EncoderContext::writeCodewords(CFX_WideString codewords) {
-  m_codewords += codewords;
-}
-void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword) {
-  m_codewords += codeword;
-}
-int32_t CBC_EncoderContext::getCodewordCount() {
-  return m_codewords.GetLength();
-}
-void CBC_EncoderContext::signalEncoderChange(int32_t encoding) {
-  m_newEncoding = encoding;
-}
-void CBC_EncoderContext::resetEncoderSignal() {
-  m_newEncoding = -1;
-}
-FX_BOOL CBC_EncoderContext::hasMoreCharacters() {
-  return m_pos < getTotalMessageCharCount();
-}
-int32_t CBC_EncoderContext::getRemainingCharacters() {
-  return getTotalMessageCharCount() - m_pos;
-}
-void CBC_EncoderContext::updateSymbolInfo(int32_t& e) {
-  updateSymbolInfo(getCodewordCount(), e);
-}
-void CBC_EncoderContext::updateSymbolInfo(int32_t len, int32_t& e) {
-  if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) {
-    m_symbolInfo =
-        CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_EncoderContext::resetSymbolInfo() {
-  m_shape = FORCE_NONE;
-}
-int32_t CBC_EncoderContext::getTotalMessageCharCount() {
-  return m_msg.GetLength() - m_skipAtEnd;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h
deleted file mode 100644
index 076581c..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-class CBC_SymbolInfo;
-class CBC_Dimension;
-
-class CBC_EncoderContext : public CBC_SymbolShapeHint {
- public:
-  CBC_EncoderContext(const CFX_WideString msg,
-                     CFX_WideString ecLevel,
-                     int32_t& e);
-  virtual ~CBC_EncoderContext();
-  void setSymbolShape(SymbolShapeHint shape);
-  void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize);
-  CFX_WideString getMessage();
-  void setSkipAtEnd(int32_t count);
-  FX_WCHAR getCurrentChar();
-  FX_WCHAR getCurrent();
-  void writeCodewords(CFX_WideString codewords);
-  void writeCodeword(FX_WCHAR codeword);
-  int32_t getCodewordCount();
-  void signalEncoderChange(int32_t encoding);
-  void resetEncoderSignal();
-  FX_BOOL hasMoreCharacters();
-  int32_t getRemainingCharacters();
-  void updateSymbolInfo(int32_t& e);
-  void updateSymbolInfo(int32_t len, int32_t& e);
-  void resetSymbolInfo();
-
- public:
-  CFX_WideString m_msg;
-  CFX_WideString m_codewords;
-  int32_t m_pos;
-  int32_t m_newEncoding;
-  CBC_SymbolInfo* m_symbolInfo;
-
- private:
-  int32_t getTotalMessageCharCount();
-
- private:
-  SymbolShapeHint m_shape;
-  CBC_Dimension* m_minSize;
-  CBC_Dimension* m_maxSize;
-  int32_t m_skipAtEnd;
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
deleted file mode 100644
index d5ae9bf..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-int32_t CBC_ErrorCorrection::FACTOR_SETS[] = {5,  7,  10, 11, 12, 14, 18, 20,
-                                              24, 28, 36, 42, 48, 56, 62, 68};
-int32_t CBC_ErrorCorrection::FACTORS[][100] = {
-    {228, 48, 15, 111, 62},
-    {23, 68, 144, 134, 240, 92, 254},
-    {28, 24, 185, 166, 223, 248, 116, 255, 110, 61},
-    {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120},
-    {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242},
-    {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185},
-    {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48,
-     90, 188},
-    {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27,
-     174, 186, 172},
-    {52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172,
-     254, 124, 12, 181, 184, 96, 50, 193},
-    {211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, 17,
-     138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255},
-    {245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80,
-     182, 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25,
-     225, 98, 81, 112},
-    {77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, 175,
-     95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, 248, 202,
-     69, 50, 150, 177, 226, 5, 9, 5},
-    {245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87,
-     191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138,
-     186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19},
-    {175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235,
-     150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232,
-     144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28,
-     155, 43, 203, 107, 233, 53, 143, 46},
-    {242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37,
-     185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114,
-     71, 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31,
-     176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204},
-    {220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127,
-     213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227,
-     236, 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136,
-     223, 239, 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153,
-     132, 63, 96, 103, 82, 186}};
-int32_t CBC_ErrorCorrection::MODULO_VALUE = 0x12D;
-int32_t CBC_ErrorCorrection::LOG[256] = {0};
-int32_t CBC_ErrorCorrection::ALOG[256] = {0};
-void CBC_ErrorCorrection::Initialize() {
-  int32_t p = 1;
-  for (int32_t i = 0; i < 255; i++) {
-    ALOG[i] = p;
-    LOG[p] = i;
-    p <<= 1;
-    if (p >= 256) {
-      p ^= MODULO_VALUE;
-    }
-  }
-}
-void CBC_ErrorCorrection::Finalize() {}
-CBC_ErrorCorrection::CBC_ErrorCorrection() {}
-CBC_ErrorCorrection::~CBC_ErrorCorrection() {}
-CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords,
-                                                 CBC_SymbolInfo* symbolInfo,
-                                                 int32_t& e) {
-  if (codewords.GetLength() != symbolInfo->m_dataCapacity) {
-    e = BCExceptionIllegalArgument;
-    return (FX_WCHAR*)"";
-  }
-  CFX_WideString sb;
-  sb += codewords;
-  int32_t blockCount = symbolInfo->getInterleavedBlockCount();
-  if (blockCount == 1) {
-    CFX_WideString ecc =
-        createECCBlock(codewords, symbolInfo->m_errorCodewords, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-    sb += ecc;
-  } else {
-    CFX_Int32Array dataSizes;
-    dataSizes.SetSize(blockCount);
-    CFX_Int32Array errorSizes;
-    errorSizes.SetSize(blockCount);
-    CFX_Int32Array startPos;
-    startPos.SetSize(blockCount);
-    for (int32_t i = 0; i < blockCount; i++) {
-      dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1);
-      errorSizes[i] = symbolInfo->getErrorLengthForInterleavedBlock(i + 1);
-      startPos[i] = 0;
-      if (i > 0) {
-        startPos[i] = startPos[i - 1] + dataSizes[i];
-      }
-    }
-    for (int32_t block = 0; block < blockCount; block++) {
-      CFX_WideString temp;
-      for (int32_t d = block; d < symbolInfo->m_dataCapacity; d += blockCount) {
-        temp += (FX_WCHAR)codewords.GetAt(d);
-      }
-      CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-      int32_t pos = 0;
-      for (int32_t l = block; l < errorSizes[block] * blockCount;
-           l += blockCount) {
-        sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++));
-      }
-    }
-  }
-  return sb;
-}
-CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords,
-                                                   int32_t numECWords,
-                                                   int32_t& e) {
-  return createECCBlock(codewords, 0, codewords.GetLength(), numECWords, e);
-}
-CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords,
-                                                   int32_t start,
-                                                   int32_t len,
-                                                   int32_t numECWords,
-                                                   int32_t& e) {
-  int32_t table = -1;
-  for (int32_t i = 0; i < sizeof(FACTOR_SETS) / sizeof(int32_t); i++) {
-    if (FACTOR_SETS[i] == numECWords) {
-      table = i;
-      break;
-    }
-  }
-  if (table < 0) {
-    e = BCExceptionIllegalArgument;
-    return (FX_WCHAR*)"";
-  }
-  FX_WORD* ecc = FX_Alloc(FX_WORD, numECWords);
-  FXSYS_memset(ecc, 0, numECWords * sizeof(FX_WORD));
-  for (int32_t l = start; l < start + len; l++) {
-    FX_WORD m = ecc[numECWords - 1] ^ codewords.GetAt(l);
-    for (int32_t k = numECWords - 1; k > 0; k--) {
-      if (m != 0 && FACTORS[table][k] != 0) {
-        ecc[k] = (FX_WORD)(ecc[k - 1] ^
-                           ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]);
-      } else {
-        ecc[k] = ecc[k - 1];
-      }
-    }
-    if (m != 0 && FACTORS[table][0] != 0) {
-      ecc[0] = (FX_WORD)ALOG[(LOG[m] + LOG[FACTORS[table][0]]) % 255];
-    } else {
-      ecc[0] = 0;
-    }
-  }
-  CFX_WideString strecc;
-  for (int32_t j = 0; j < numECWords; j++) {
-    strecc += (FX_WCHAR)ecc[numECWords - j - 1];
-  }
-  FX_Free(ecc);
-  return strecc;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h
deleted file mode 100644
index 951b9ea..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
-
-class CBC_SymbolInfo;
-class CBC_ErrorCorrection {
- public:
-  CBC_ErrorCorrection();
-  virtual ~CBC_ErrorCorrection();
-  static void Initialize();
-  static void Finalize();
-  static CFX_WideString encodeECC200(CFX_WideString codewords,
-                                     CBC_SymbolInfo* symbolInfo,
-                                     int32_t& e);
-
- private:
-  static int32_t FACTOR_SETS[];
-  static int32_t FACTORS[][100];
-  static int32_t MODULO_VALUE;
-  static int32_t LOG[256];
-  static int32_t ALOG[256];
-
- private:
-  static CFX_WideString createECCBlock(CFX_WideString codewords,
-                                       int32_t numECWords,
-                                       int32_t& e);
-  static CFX_WideString createECCBlock(CFX_WideString codewords,
-                                       int32_t start,
-                                       int32_t len,
-                                       int32_t numECWords,
-                                       int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_ERRORCORRECTION_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
deleted file mode 100644
index 21e1b6b..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <limits>
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230;
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231;
-FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235;
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238;
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239;
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240;
-FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254;
-FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254;
-FX_WCHAR CBC_HighLevelEncoder::PAD = 129;
-FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236;
-FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237;
-const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05";
-const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06";
-const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004;
-
-CBC_HighLevelEncoder::CBC_HighLevelEncoder() {}
-CBC_HighLevelEncoder::~CBC_HighLevelEncoder() {}
-CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) {
-  CFX_ByteString bytestr;
-  CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr);
-  for (int32_t i = 0; i < bytestr.GetLength(); i++) {
-    m_bytearray.Add(bytestr.GetAt(i));
-  }
-  return m_bytearray;
-}
-CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
-                                                     CFX_WideString ecLevel,
-                                                     int32_t& e) {
-  return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e);
-}
-CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
-                                                     CFX_WideString ecLevel,
-                                                     SymbolShapeHint shape,
-                                                     CBC_Dimension* minSize,
-                                                     CBC_Dimension* maxSize,
-                                                     int32_t& e) {
-  CBC_EncoderContext context(msg, ecLevel, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-  context.setSymbolShape(shape);
-  context.setSizeConstraints(minSize, maxSize);
-  if ((msg.Mid(0, 6) == MACRO_05_HEADER) &&
-      (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
-    context.writeCodeword(MACRO_05);
-    context.setSkipAtEnd(2);
-    context.m_pos += 6;
-  } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) &&
-             (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
-    context.writeCodeword(MACRO_06);
-    context.setSkipAtEnd(2);
-    context.m_pos += 6;
-  }
-  CFX_PtrArray encoders;
-  encoders.Add(new CBC_ASCIIEncoder());
-  encoders.Add(new CBC_C40Encoder());
-  encoders.Add(new CBC_TextEncoder());
-  encoders.Add(new CBC_X12Encoder());
-  encoders.Add(new CBC_EdifactEncoder());
-  encoders.Add(new CBC_Base256Encoder());
-  int32_t encodingMode = ASCII_ENCODATION;
-  while (context.hasMoreCharacters()) {
-    ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e);
-    if (e != BCExceptionNO) {
-      for (int32_t i = 0; i < encoders.GetSize(); i++) {
-        delete (CBC_Encoder*)encoders.GetAt(i);
-      }
-      encoders.RemoveAll();
-      return (FX_WCHAR*)"";
-    }
-    if (context.m_newEncoding >= 0) {
-      encodingMode = context.m_newEncoding;
-      context.resetEncoderSignal();
-    }
-  }
-  int32_t len = context.m_codewords.GetLength();
-  context.updateSymbolInfo(e);
-  if (e != BCExceptionNO) {
-    for (int32_t i = 0; i < encoders.GetSize(); i++) {
-      delete (CBC_Encoder*)encoders.GetAt(i);
-    }
-    encoders.RemoveAll();
-    return (FX_WCHAR*)"";
-  }
-  int32_t capacity = context.m_symbolInfo->m_dataCapacity;
-  if (len < capacity) {
-    if (encodingMode != ASCII_ENCODATION &&
-        encodingMode != BASE256_ENCODATION) {
-      context.writeCodeword(0x00fe);
-    }
-  }
-  CFX_WideString codewords = context.m_codewords;
-  if (codewords.GetLength() < capacity) {
-    codewords += PAD;
-  }
-  while (codewords.GetLength() < capacity) {
-    codewords += (randomize253State(PAD, codewords.GetLength() + 1));
-  }
-  for (int32_t i = 0; i < encoders.GetSize(); i++) {
-    delete (CBC_Encoder*)encoders.GetAt(i);
-  }
-  encoders.RemoveAll();
-  return codewords;
-}
-int32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg,
-                                            int32_t startpos,
-                                            int32_t currentMode) {
-  if (startpos >= msg.GetLength()) {
-    return currentMode;
-  }
-  CFX_FloatArray charCounts;
-  if (currentMode == ASCII_ENCODATION) {
-    charCounts.Add(0);
-    charCounts.Add(1);
-    charCounts.Add(1);
-    charCounts.Add(1);
-    charCounts.Add(1);
-    charCounts.Add(1.25f);
-  } else {
-    charCounts.Add(1);
-    charCounts.Add(2);
-    charCounts.Add(2);
-    charCounts.Add(2);
-    charCounts.Add(2);
-    charCounts.Add(2.25f);
-    charCounts[currentMode] = 0;
-  }
-  int32_t charsProcessed = 0;
-  while (TRUE) {
-    if ((startpos + charsProcessed) == msg.GetLength()) {
-      FX_DWORD min = std::numeric_limits<int32_t>::max();
-      CFX_ByteArray mins;
-      mins.SetSize(6);
-      CFX_Int32Array intCharCounts;
-      intCharCounts.SetSize(6);
-      min = findMinimums(charCounts, intCharCounts, min, mins);
-      int32_t minCount = getMinimumCount(mins);
-      if (intCharCounts[ASCII_ENCODATION] == min) {
-        return ASCII_ENCODATION;
-      }
-      if (minCount == 1 && mins[BASE256_ENCODATION] > 0) {
-        return BASE256_ENCODATION;
-      }
-      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
-        return EDIFACT_ENCODATION;
-      }
-      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
-        return TEXT_ENCODATION;
-      }
-      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
-        return X12_ENCODATION;
-      }
-      return C40_ENCODATION;
-    }
-    FX_WCHAR c = msg.GetAt(startpos + charsProcessed);
-    charsProcessed++;
-    if (isDigit(c)) {
-      charCounts[ASCII_ENCODATION] += 0.5;
-    } else if (isExtendedASCII(c)) {
-      charCounts[ASCII_ENCODATION] =
-          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
-      charCounts[ASCII_ENCODATION] += 2;
-    } else {
-      charCounts[ASCII_ENCODATION] =
-          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
-      charCounts[ASCII_ENCODATION]++;
-    }
-    if (isNativeC40(c)) {
-      charCounts[C40_ENCODATION] += 2.0f / 3.0f;
-    } else if (isExtendedASCII(c)) {
-      charCounts[C40_ENCODATION] += 8.0f / 3.0f;
-    } else {
-      charCounts[C40_ENCODATION] += 4.0f / 3.0f;
-    }
-    if (isNativeText(c)) {
-      charCounts[TEXT_ENCODATION] += 2.0f / 3.0f;
-    } else if (isExtendedASCII(c)) {
-      charCounts[TEXT_ENCODATION] += 8.0f / 3.0f;
-    } else {
-      charCounts[TEXT_ENCODATION] += 4.0f / 3.0f;
-    }
-    if (isNativeX12(c)) {
-      charCounts[X12_ENCODATION] += 2.0f / 3.0f;
-    } else if (isExtendedASCII(c)) {
-      charCounts[X12_ENCODATION] += 13.0f / 3.0f;
-    } else {
-      charCounts[X12_ENCODATION] += 10.0f / 3.0f;
-    }
-    if (isNativeEDIFACT(c)) {
-      charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f;
-    } else if (isExtendedASCII(c)) {
-      charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f;
-    } else {
-      charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f;
-    }
-    if (isSpecialB256(c)) {
-      charCounts[BASE256_ENCODATION] += 4;
-    } else {
-      charCounts[BASE256_ENCODATION]++;
-    }
-    if (charsProcessed >= 4) {
-      CFX_Int32Array intCharCounts;
-      intCharCounts.SetSize(6);
-      CFX_ByteArray mins;
-      mins.SetSize(6);
-      findMinimums(charCounts, intCharCounts,
-                   std::numeric_limits<int32_t>::max(), mins);
-      int32_t minCount = getMinimumCount(mins);
-      if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] &&
-          intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] &&
-          intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] &&
-          intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] &&
-          intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) {
-        return ASCII_ENCODATION;
-      }
-      if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] ||
-          (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] +
-           mins[EDIFACT_ENCODATION]) == 0) {
-        return BASE256_ENCODATION;
-      }
-      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
-        return EDIFACT_ENCODATION;
-      }
-      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
-        return TEXT_ENCODATION;
-      }
-      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
-        return X12_ENCODATION;
-      }
-      if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] &&
-          intCharCounts[C40_ENCODATION] + 1 <
-              intCharCounts[BASE256_ENCODATION] &&
-          intCharCounts[C40_ENCODATION] + 1 <
-              intCharCounts[EDIFACT_ENCODATION] &&
-          intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) {
-        if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) {
-          return C40_ENCODATION;
-        }
-        if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) {
-          int32_t p = startpos + charsProcessed + 1;
-          while (p < msg.GetLength()) {
-            FX_WCHAR tc = msg.GetAt(p);
-            if (isX12TermSep(tc)) {
-              return X12_ENCODATION;
-            }
-            if (!isNativeX12(tc)) {
-              break;
-            }
-            p++;
-          }
-          return C40_ENCODATION;
-        }
-      }
-    }
-  }
-}
-FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) {
-  return ch >= '0' && ch <= '9';
-}
-FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) {
-  return ch >= 128 && ch <= 255;
-}
-int32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg,
-                                                             int32_t startpos) {
-  int32_t count = 0;
-  int32_t len = msg.GetLength();
-  int32_t idx = startpos;
-  if (idx < len) {
-    FX_WCHAR ch = msg.GetAt(idx);
-    while (isDigit(ch) && idx < len) {
-      count++;
-      idx++;
-      if (idx < len) {
-        ch = msg.GetAt(idx);
-      }
-    }
-  }
-  return count;
-}
-void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) {
-  e = BCExceptionIllegalArgument;
-}
-FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch,
-                                                 int32_t codewordPosition) {
-  int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1;
-  int32_t tempVariable = ch + pseudoRandom;
-  return tempVariable <= 254 ? (FX_WCHAR)tempVariable
-                             : (FX_WCHAR)(tempVariable - 254);
-}
-int32_t CBC_HighLevelEncoder::findMinimums(CFX_FloatArray& charCounts,
-                                           CFX_Int32Array& intCharCounts,
-                                           int32_t min,
-                                           CFX_ByteArray& mins) {
-  for (int32_t l = 0; l < mins.GetSize(); l++) {
-    mins[l] = (uint8_t)0;
-  }
-  for (int32_t i = 0; i < 6; i++) {
-    intCharCounts[i] = (int32_t)ceil(charCounts[i]);
-    int32_t current = intCharCounts[i];
-    if (min > current) {
-      min = current;
-      for (int32_t j = 0; j < mins.GetSize(); j++) {
-        mins[j] = (uint8_t)0;
-      }
-    }
-    if (min == current) {
-      mins[i]++;
-    }
-  }
-  return min;
-}
-int32_t CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray& mins) {
-  int32_t minCount = 0;
-  for (int32_t i = 0; i < 6; i++) {
-    minCount += mins[i];
-  }
-  return minCount;
-}
-FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) {
-  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z');
-}
-FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) {
-  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z');
-}
-FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) {
-  return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') ||
-         (ch >= 'A' && ch <= 'Z');
-}
-FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) {
-  return (ch == '\r') || (ch == '*') || (ch == '>');
-}
-FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) {
-  return ch >= ' ' && ch <= '^';
-}
-FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) {
-  return FALSE;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h
deleted file mode 100644
index 2ac6469..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
-
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-#define ASCII_ENCODATION 0
-#define C40_ENCODATION 1
-#define TEXT_ENCODATION 2
-#define X12_ENCODATION 3
-#define EDIFACT_ENCODATION 4
-#define BASE256_ENCODATION 5
-
-class CBC_HighLevelEncoder : public CBC_SymbolShapeHint {
- public:
-  CBC_HighLevelEncoder();
-  virtual ~CBC_HighLevelEncoder();
-  CFX_ByteArray& getBytesForMessage(CFX_WideString msg);
-  static CFX_WideString encodeHighLevel(CFX_WideString msg,
-                                        CFX_WideString ecLevel,
-                                        int32_t& e);
-  static CFX_WideString encodeHighLevel(CFX_WideString msg,
-                                        CFX_WideString ecLevel,
-                                        SymbolShapeHint shape,
-                                        CBC_Dimension* minSize,
-                                        CBC_Dimension* maxSize,
-                                        int32_t& e);
-  static int32_t lookAheadTest(CFX_WideString msg,
-                               int32_t startpos,
-                               int32_t currentMode);
-  static FX_BOOL isDigit(FX_WCHAR ch);
-  static FX_BOOL isExtendedASCII(FX_WCHAR ch);
-  static int32_t determineConsecutiveDigitCount(CFX_WideString msg,
-                                                int32_t startpos);
-  static void illegalCharacter(FX_WCHAR c, int32_t& e);
-
- public:
-  static FX_WCHAR LATCH_TO_C40;
-  static FX_WCHAR LATCH_TO_BASE256;
-  static FX_WCHAR UPPER_SHIFT;
-  static FX_WCHAR LATCH_TO_ANSIX12;
-  static FX_WCHAR LATCH_TO_TEXT;
-  static FX_WCHAR LATCH_TO_EDIFACT;
-  static FX_WCHAR C40_UNLATCH;
-  static FX_WCHAR X12_UNLATCH;
-
- private:
-  static FX_WCHAR PAD;
-  static FX_WCHAR MACRO_05;
-  static FX_WCHAR MACRO_06;
-  static const wchar_t* MACRO_05_HEADER;
-  static const wchar_t* MACRO_06_HEADER;
-  static const wchar_t MACRO_TRAILER;
-  CFX_ByteArray m_bytearray;
-
- private:
-  static FX_WCHAR randomize253State(FX_WCHAR ch, int32_t codewordPosition);
-  static int32_t findMinimums(CFX_FloatArray& charCounts,
-                              CFX_Int32Array& intCharCounts,
-                              int32_t min,
-                              CFX_ByteArray& mins);
-  static int32_t getMinimumCount(CFX_ByteArray& mins);
-  static FX_BOOL isNativeC40(FX_WCHAR ch);
-  static FX_BOOL isNativeText(FX_WCHAR ch);
-  static FX_BOOL isNativeX12(FX_WCHAR ch);
-  static FX_BOOL isX12TermSep(FX_WCHAR ch);
-  static FX_BOOL isNativeEDIFACT(FX_WCHAR ch);
-  static FX_BOOL isSpecialB256(FX_WCHAR ch);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp
deleted file mode 100644
index 7909054..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-#define SYMBOLS_COUNT 30
-
-CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-void CBC_SymbolInfo::Initialize() {
-  m_PROD_SYMBOLS[0] = new CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1);
-  m_PROD_SYMBOLS[1] = new CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1);
-  m_PROD_SYMBOLS[2] = new CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1);
-  m_PROD_SYMBOLS[3] = new CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1);
-  m_PROD_SYMBOLS[4] = new CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2);
-  m_PROD_SYMBOLS[5] = new CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1);
-  m_PROD_SYMBOLS[6] = new CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1);
-  m_PROD_SYMBOLS[7] = new CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1);
-  m_PROD_SYMBOLS[8] = new CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1);
-  m_PROD_SYMBOLS[9] = new CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2);
-  m_PROD_SYMBOLS[10] = new CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1);
-  m_PROD_SYMBOLS[11] = new CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2);
-  m_PROD_SYMBOLS[12] = new CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1);
-  m_PROD_SYMBOLS[13] = new CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1);
-  m_PROD_SYMBOLS[14] = new CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2);
-  m_PROD_SYMBOLS[15] = new CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4);
-  m_PROD_SYMBOLS[16] = new CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4);
-  m_PROD_SYMBOLS[17] = new CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4);
-  m_PROD_SYMBOLS[18] = new CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4);
-  m_PROD_SYMBOLS[19] = new CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4);
-  m_PROD_SYMBOLS[20] = new CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42);
-  m_PROD_SYMBOLS[21] = new CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56);
-  m_PROD_SYMBOLS[22] = new CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36);
-  m_PROD_SYMBOLS[23] = new CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48);
-  m_PROD_SYMBOLS[24] = new CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56);
-  m_PROD_SYMBOLS[25] = new CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68);
-  m_PROD_SYMBOLS[26] = new CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56);
-  m_PROD_SYMBOLS[27] =
-      new CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68);
-  m_PROD_SYMBOLS[28] =
-      new CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62);
-  m_PROD_SYMBOLS[29] = new CBC_DataMatrixSymbolInfo144();
-  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
-    m_symbols[i] = m_PROD_SYMBOLS[i];
-  }
-}
-void CBC_SymbolInfo::Finalize() {
-  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
-    delete m_PROD_SYMBOLS[i];
-    m_PROD_SYMBOLS[i] = NULL;
-    m_symbols[i] = NULL;
-  }
-}
-CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular,
-                               int32_t dataCapacity,
-                               int32_t errorCodewords,
-                               int32_t matrixWidth,
-                               int32_t matrixHeight,
-                               int32_t dataRegions) {
-  m_rectangular = rectangular;
-  m_dataCapacity = dataCapacity;
-  m_errorCodewords = errorCodewords;
-  m_matrixWidth = matrixWidth;
-  m_matrixHeight = matrixHeight;
-  m_dataRegions = dataRegions;
-  m_rsBlockData = dataCapacity;
-  m_rsBlockError = errorCodewords;
-}
-CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular,
-                               int32_t dataCapacity,
-                               int32_t errorCodewords,
-                               int32_t matrixWidth,
-                               int32_t matrixHeight,
-                               int32_t dataRegions,
-                               int32_t rsBlockData,
-                               int32_t rsBlockError) {
-  m_rectangular = rectangular;
-  m_dataCapacity = dataCapacity;
-  m_errorCodewords = errorCodewords;
-  m_matrixWidth = matrixWidth;
-  m_matrixHeight = matrixHeight;
-  m_dataRegions = dataRegions;
-  m_rsBlockData = rsBlockData;
-  m_rsBlockError = rsBlockError;
-}
-CBC_SymbolInfo::~CBC_SymbolInfo() {}
-
-CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, int32_t& e) {
-  return lookup(dataCodewords, FORCE_NONE, TRUE, e);
-}
-CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
-                                       SymbolShapeHint shape,
-                                       int32_t& e) {
-  return lookup(dataCodewords, shape, TRUE, e);
-}
-CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
-                                       FX_BOOL allowRectangular,
-                                       FX_BOOL fail,
-                                       int32_t& e) {
-  SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE;
-  return lookup(dataCodewords, shape, fail, e);
-}
-CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
-                                       SymbolShapeHint shape,
-                                       FX_BOOL fail,
-                                       int32_t& e) {
-  return lookup(dataCodewords, shape, NULL, NULL, fail, e);
-}
-CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
-                                       SymbolShapeHint shape,
-                                       CBC_Dimension* minSize,
-                                       CBC_Dimension* maxSize,
-                                       FX_BOOL fail,
-                                       int32_t& e) {
-  for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {
-    CBC_SymbolInfo* symbol = m_symbols[i];
-    if (shape == FORCE_SQUARE && symbol->m_rectangular) {
-      continue;
-    }
-    if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) {
-      continue;
-    }
-    if (minSize && (symbol->getSymbolWidth(e) < minSize->getWidth() ||
-                    symbol->getSymbolHeight(e) < minSize->getHeight())) {
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      continue;
-    }
-    if (maxSize && (symbol->getSymbolWidth(e) > maxSize->getWidth() ||
-                    symbol->getSymbolHeight(e) > maxSize->getHeight())) {
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      continue;
-    }
-    if (dataCodewords <= symbol->m_dataCapacity) {
-      return symbol;
-    }
-  }
-  if (fail) {
-    e = BCExceptionIllegalDataCodewords;
-    return NULL;
-  }
-  return NULL;
-}
-int32_t CBC_SymbolInfo::getHorizontalDataRegions(int32_t& e) {
-  switch (m_dataRegions) {
-    case 1:
-      return 1;
-    case 2:
-      return 2;
-    case 4:
-      return 2;
-    case 16:
-      return 4;
-    case 36:
-      return 6;
-    default:
-      e = BCExceptionCannotHandleThisNumberOfDataRegions;
-      return 0;
-  }
-}
-int32_t CBC_SymbolInfo::getVerticalDataRegions(int32_t& e) {
-  switch (m_dataRegions) {
-    case 1:
-      return 1;
-    case 2:
-      return 1;
-    case 4:
-      return 2;
-    case 16:
-      return 4;
-    case 36:
-      return 6;
-    default:
-      e = BCExceptionCannotHandleThisNumberOfDataRegions;
-      return 0;
-  }
-}
-int32_t CBC_SymbolInfo::getSymbolDataWidth(int32_t& e) {
-  return getHorizontalDataRegions(e) * m_matrixWidth;
-}
-int32_t CBC_SymbolInfo::getSymbolDataHeight(int32_t& e) {
-  return getVerticalDataRegions(e) * m_matrixHeight;
-}
-int32_t CBC_SymbolInfo::getSymbolWidth(int32_t& e) {
-  return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2);
-}
-int32_t CBC_SymbolInfo::getSymbolHeight(int32_t& e) {
-  return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2);
-}
-int32_t CBC_SymbolInfo::getCodewordCount() {
-  return m_dataCapacity + m_errorCodewords;
-}
-int32_t CBC_SymbolInfo::getInterleavedBlockCount() {
-  return m_dataCapacity / m_rsBlockData;
-}
-int32_t CBC_SymbolInfo::getDataLengthForInterleavedBlock(int32_t index) {
-  return m_rsBlockData;
-}
-int32_t CBC_SymbolInfo::getErrorLengthForInterleavedBlock(int32_t index) {
-  return m_rsBlockError;
-}
-CFX_WideString CBC_SymbolInfo::toString(int32_t& e) {
-  CFX_WideString sb;
-  sb += (FX_WCHAR*)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:");
-  sb += (FX_WCHAR*)" data region ";
-  sb += m_matrixWidth;
-  sb += (FX_WCHAR)'x';
-  sb += m_matrixHeight;
-  sb += (FX_WCHAR*)", symbol size ";
-  sb += getSymbolWidth(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-  sb += (FX_WCHAR)'x';
-  sb += getSymbolHeight(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-  sb += (FX_WCHAR*)", symbol data size ";
-  sb += getSymbolDataWidth(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-  sb += (FX_WCHAR)'x';
-  sb += getSymbolDataHeight(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)"");
-  sb += (FX_WCHAR*)", codewords ";
-  sb += m_dataCapacity;
-  sb += (FX_WCHAR)'+';
-  sb += m_errorCodewords;
-  return sb;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h
deleted file mode 100644
index acbc038..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-class CBC_Dimension;
-
-class CBC_SymbolInfo : public CBC_SymbolShapeHint {
- public:
-  CBC_SymbolInfo(FX_BOOL rectangular,
-                 int32_t dataCapacity,
-                 int32_t errorCodewords,
-                 int32_t matrixWidth,
-                 int32_t matrixHeight,
-                 int32_t dataRegions);
-  virtual ~CBC_SymbolInfo();
-  static void Initialize();
-  static void Finalize();
-  static void overrideSymbolSet(CBC_SymbolInfo* override);
-  static CBC_SymbolInfo* lookup(int32_t dataCodewords, int32_t& e);
-  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
-                                SymbolShapeHint shape,
-                                int32_t& e);
-  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
-                                FX_BOOL allowRectangular,
-                                FX_BOOL fail,
-                                int32_t& e);
-  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
-                                SymbolShapeHint shape,
-                                FX_BOOL fail,
-                                int32_t& e);
-  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
-                                SymbolShapeHint shape,
-                                CBC_Dimension* minSize,
-                                CBC_Dimension* maxSize,
-                                FX_BOOL fail,
-                                int32_t& e);
-  int32_t getHorizontalDataRegions(int32_t& e);
-  int32_t getVerticalDataRegions(int32_t& e);
-  int32_t getSymbolDataWidth(int32_t& e);
-  int32_t getSymbolDataHeight(int32_t& e);
-  int32_t getSymbolWidth(int32_t& e);
-  int32_t getSymbolHeight(int32_t& e);
-  int32_t getCodewordCount();
-  int32_t getInterleavedBlockCount();
-  int32_t getDataLengthForInterleavedBlock(int32_t index);
-  int32_t getErrorLengthForInterleavedBlock(int32_t index);
-  CFX_WideString toString(int32_t& e);
-
- public:
-  int32_t m_dataCapacity;
-  int32_t m_errorCodewords;
-  int32_t m_matrixWidth;
-  int32_t m_matrixHeight;
-  int32_t m_rsBlockData;
-  int32_t m_rsBlockError;
-  static CBC_SymbolInfo* m_PROD_SYMBOLS[30];
-
- private:
-  static CBC_SymbolInfo* m_symbols[30];
-  FX_BOOL m_rectangular;
-  int32_t m_dataRegions;
-
- private:
-  CBC_SymbolInfo(FX_BOOL rectangular,
-                 int32_t dataCapacity,
-                 int32_t errorCodewords,
-                 int32_t matrixWidth,
-                 int32_t matrixHeight,
-                 int32_t dataRegions,
-                 int32_t rsBlockData,
-                 int32_t rsBlockError);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp
deleted file mode 100644
index 52c9960..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-
-CBC_SymbolShapeHint::CBC_SymbolShapeHint() {}
-CBC_SymbolShapeHint::~CBC_SymbolShapeHint() {}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h
deleted file mode 100644
index ea8acdf..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
-
-class CBC_SymbolShapeHint {
- public:
-  CBC_SymbolShapeHint();
-  virtual ~CBC_SymbolShapeHint();
-  enum SymbolShapeHint {
-    FORCE_NONE,
-    FORCE_SQUARE,
-    FORCE_RECTANGLE,
-  };
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_SYMBOLSHAPEHINT_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp
deleted file mode 100644
index ec340f3..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h"
-
-CBC_TextEncoder::CBC_TextEncoder() {}
-CBC_TextEncoder::~CBC_TextEncoder() {}
-int32_t CBC_TextEncoder::getEncodingMode() {
-  return TEXT_ENCODATION;
-}
-int32_t CBC_TextEncoder::encodeChar(FX_WCHAR c,
-                                    CFX_WideString& sb,
-                                    int32_t& e) {
-  if (c == ' ') {
-    sb += (FX_WCHAR)'\3';
-    return 1;
-  }
-  if (c >= '0' && c <= '9') {
-    sb += (FX_WCHAR)(c - 48 + 4);
-    return 1;
-  }
-  if (c >= 'a' && c <= 'z') {
-    sb += (FX_WCHAR)(c - 97 + 14);
-    return 1;
-  }
-  if (c <= 0x1f) {
-    sb += (FX_WCHAR)'\0';
-    sb += c;
-    return 2;
-  }
-  if (c >= '!' && c <= '/') {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 33);
-    return 2;
-  }
-  if (c >= ':' && c <= '@') {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 58 + 15);
-    return 2;
-  }
-  if (c >= '[' && c <= '_') {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)(c - 91 + 22);
-    return 2;
-  }
-  if (c == 0x0060) {
-    sb += (FX_WCHAR)'\2';
-    sb += (FX_WCHAR)(c - 96);
-    return 2;
-  }
-  if (c >= 'A' && c <= 'Z') {
-    sb += (FX_WCHAR)'\2';
-    sb += (FX_WCHAR)(c - 65 + 1);
-    return 2;
-  }
-  if (c >= '{' && c <= 0x007f) {
-    sb += (FX_WCHAR)'\2';
-    sb += (FX_WCHAR)(c - 123 + 27);
-    return 2;
-  }
-  if (c >= 0x0080) {
-    sb += (FX_WCHAR)'\1';
-    sb += (FX_WCHAR)0x001e;
-    int32_t len = 2;
-    len += encodeChar((FX_WCHAR)(c - 128), sb, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-    return len;
-  }
-  CBC_HighLevelEncoder::illegalCharacter(c, e);
-  return -1;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h
deleted file mode 100644
index 399b21b..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
-
-class CBC_TextEncoder;
-class CBC_TextEncoder : public CBC_C40Encoder {
- public:
-  CBC_TextEncoder();
-  virtual ~CBC_TextEncoder();
-  int32_t getEncodingMode();
-  int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_TEXTENCODER_H_
diff --git a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp
deleted file mode 100644
index 759279d..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006-2007 Jeremias Maerki.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Dimension.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h"
-
-CBC_X12Encoder::CBC_X12Encoder() {}
-CBC_X12Encoder::~CBC_X12Encoder() {}
-int32_t CBC_X12Encoder::getEncodingMode() {
-  return X12_ENCODATION;
-}
-void CBC_X12Encoder::Encode(CBC_EncoderContext& context, int32_t& e) {
-  CFX_WideString buffer;
-  while (context.hasMoreCharacters()) {
-    FX_WCHAR c = context.getCurrentChar();
-    context.m_pos++;
-    encodeChar(c, buffer, e);
-    if (e != BCExceptionNO) {
-      return;
-    }
-    int32_t count = buffer.GetLength();
-    if ((count % 3) == 0) {
-      writeNextTriplet(context, buffer);
-      int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-          context.m_msg, context.m_pos, getEncodingMode());
-      if (newMode != getEncodingMode()) {
-        context.signalEncoderChange(newMode);
-        break;
-      }
-    }
-  }
-  handleEOD(context, buffer, e);
-}
-void CBC_X12Encoder::handleEOD(CBC_EncoderContext& context,
-                               CFX_WideString& buffer,
-                               int32_t& e) {
-  context.updateSymbolInfo(e);
-  if (e != BCExceptionNO) {
-    return;
-  }
-  int32_t available =
-      context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
-  int32_t count = buffer.GetLength();
-  if (count == 2) {
-    context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);
-    context.m_pos -= 2;
-    context.signalEncoderChange(ASCII_ENCODATION);
-  } else if (count == 1) {
-    context.m_pos--;
-    if (available > 1) {
-      context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);
-    }
-    context.signalEncoderChange(ASCII_ENCODATION);
-  }
-}
-int32_t CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e) {
-  if (c == '\r') {
-    sb += (FX_WCHAR)'\0';
-  } else if (c == '*') {
-    sb += (FX_WCHAR)'\1';
-  } else if (c == '>') {
-    sb += (FX_WCHAR)'\2';
-  } else if (c == ' ') {
-    sb += (FX_WCHAR)'\3';
-  } else if (c >= '0' && c <= '9') {
-    sb += (FX_WCHAR)(c - 48 + 4);
-  } else if (c >= 'A' && c <= 'Z') {
-    sb += (FX_WCHAR)(c - 65 + 14);
-  } else {
-    CBC_HighLevelEncoder::illegalCharacter(c, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  }
-  return 1;
-}
diff --git a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h
deleted file mode 100644
index 62b35fe..0000000
--- a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
-#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
-
-class CBC_C40Encoder;
-class CBC_X12Encoder;
-class CBC_X12Encoder : public CBC_C40Encoder {
- public:
-  CBC_X12Encoder();
-  virtual ~CBC_X12Encoder();
-  int32_t getEncodingMode();
-  void Encode(CBC_EncoderContext& context, int32_t& e);
-  void handleEOD(CBC_EncoderContext& context,
-                 CFX_WideString& buffer,
-                 int32_t& e);
-  int32_t encodeChar(FX_WCHAR c, CFX_WideString& sb, int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_X12ENCODER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OneDReader.cpp b/xfa/src/fxbarcode/oned/BC_OneDReader.cpp
deleted file mode 100644
index 9ecb20e..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDReader.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_OneDReader::CBC_OneDReader() {}
-CBC_OneDReader::~CBC_OneDReader() {}
-CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
-  CFX_ByteString strtemp = Decode(image, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return strtemp;
-}
-CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap* image,
-                                      int32_t hints,
-                                      int32_t& e) {
-  CFX_ByteString strtemp = DeDecode(image, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return strtemp;
-}
-CFX_ByteString CBC_OneDReader::DeDecode(CBC_BinaryBitmap* image,
-                                        int32_t hints,
-                                        int32_t& e) {
-  int32_t height = image->GetHeight();
-  int32_t middle = height >> 1;
-  FX_BOOL tryHarder = FALSE;
-  int32_t rowStep = std::max(1, height >> (tryHarder ? 8 : 5));
-  int32_t maxLines;
-  if (tryHarder) {
-    maxLines = height;
-  } else {
-    maxLines = 15;
-  }
-  for (int32_t x = 0; x < maxLines; x++) {
-    int32_t rowStepsAboveOrBelow = (x + 1) >> 1;
-    const bool isAbove = (x & 0x01) == 0;
-    int32_t rowNumber =
-        middle +
-        rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow);
-    if (rowNumber < 0 || rowNumber >= height) {
-      break;
-    }
-    std::unique_ptr<CBC_CommonBitArray> row(
-        image->GetBlackRow(rowNumber, nullptr, e));
-    if (e != BCExceptionNO) {
-      e = BCExceptionNO;
-      continue;
-    }
-    for (int32_t attempt = 0; attempt < 2; attempt++) {
-      if (attempt == 1) {
-        row->Reverse();
-      }
-      CFX_ByteString result = DecodeRow(rowNumber, row.get(), hints, e);
-      if (e != BCExceptionNO) {
-        e = BCExceptionNO;
-        continue;
-      }
-      return result;
-    }
-  }
-  e = BCExceptionNotFound;
-  return "";
-}
-void CBC_OneDReader::RecordPattern(CBC_CommonBitArray* row,
-                                   int32_t start,
-                                   CFX_Int32Array* counters,
-                                   int32_t& e) {
-  int32_t numCounters = counters->GetSize();
-  for (int32_t i = 0; i < numCounters; i++) {
-    (*counters)[i] = 0;
-  }
-  int32_t end = row->GetSize();
-  if (start >= end) {
-    e = BCExceptionNotFound;
-    return;
-  }
-  FX_BOOL isWhite = !row->Get(start);
-  int32_t counterPosition = 0;
-  int32_t j = start;
-  while (j < end) {
-    FX_BOOL pixel = row->Get(j);
-    if (pixel ^ isWhite) {
-      (*counters)[counterPosition]++;
-    } else {
-      counterPosition++;
-      if (counterPosition == numCounters) {
-        break;
-      } else {
-        (*counters)[counterPosition] = 1;
-        isWhite = !isWhite;
-      }
-    }
-    j++;
-  }
-  if (!(counterPosition == numCounters ||
-        (counterPosition == numCounters - 1 && j == end))) {
-    e = BCExceptionNotFound;
-    return;
-  }
-}
-void CBC_OneDReader::RecordPatternInReverse(CBC_CommonBitArray* row,
-                                            int32_t start,
-                                            CFX_Int32Array* counters,
-                                            int32_t& e) {
-  int32_t numTransitionsLeft = counters->GetSize();
-  FX_BOOL last = row->Get(start);
-  while (start > 0 && numTransitionsLeft >= 0) {
-    if (row->Get(--start) != last) {
-      numTransitionsLeft--;
-      last = !last;
-    }
-  }
-  if (numTransitionsLeft >= 0) {
-    e = BCExceptionNotFound;
-    return;
-  }
-  RecordPattern(row, start + 1, counters, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-int32_t CBC_OneDReader::PatternMatchVariance(CFX_Int32Array* counters,
-                                             const int32_t* pattern,
-                                             int32_t maxIndividualVariance) {
-  int32_t numCounters = counters->GetSize();
-  int32_t total = 0;
-  int32_t patternLength = 0;
-  for (int32_t i = 0; i < numCounters; i++) {
-    total += (*counters)[i];
-    patternLength += pattern[i];
-  }
-  if (total < patternLength) {
-#undef max
-    return FXSYS_IntMax;
-  }
-  int32_t unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength;
-  maxIndividualVariance =
-      (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT;
-  int32_t totalVariance = 0;
-  for (int32_t x = 0; x < numCounters; x++) {
-    int32_t counter = (*counters)[x] << INTEGER_MATH_SHIFT;
-    int32_t scaledPattern = pattern[x] * unitBarWidth;
-    int32_t variance = counter > scaledPattern ? counter - scaledPattern
-                                               : scaledPattern - counter;
-    if (variance > maxIndividualVariance) {
-#undef max
-      return FXSYS_IntMax;
-    }
-    totalVariance += variance;
-  }
-  return totalVariance / total;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OneDReader.h b/xfa/src/fxbarcode/oned/BC_OneDReader.h
deleted file mode 100644
index bcd7cbc..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDReader.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDREADER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDREADER_H_
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-
-class CBC_BinaryBitmap;
-class CBC_CommonBitArray;
-
-class CBC_OneDReader : public CBC_Reader {
- public:
-  CBC_OneDReader();
-  virtual ~CBC_OneDReader();
-  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
-  virtual CFX_ByteString Decode(CBC_BinaryBitmap* image,
-                                int32_t hints,
-                                int32_t& e);
-  virtual CFX_ByteString DecodeRow(int32_t rowNumber,
-                                   CBC_CommonBitArray* row,
-                                   int32_t hints,
-                                   int32_t& e) {
-    return "";
-  }
-
- private:
-  CFX_ByteString DeDecode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
-
- protected:
-  static const int32_t INTEGER_MATH_SHIFT = 8;
-  static const int32_t PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << 8;
-
-  void RecordPattern(CBC_CommonBitArray* row,
-                     int32_t start,
-                     CFX_Int32Array* counters,
-                     int32_t& e);
-  void RecordPatternInReverse(CBC_CommonBitArray* row,
-                              int32_t start,
-                              CFX_Int32Array* counters,
-                              int32_t& e);
-  int32_t PatternMatchVariance(CFX_Int32Array* counters,
-                               const int32_t* pattern,
-                               int32_t maxIndividualVariance);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDREADER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp b/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp
deleted file mode 100644
index 07b8657..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_OneDimReader::START_END_PATTERN[3] = {1, 1, 1};
-const int32_t CBC_OneDimReader::MIDDLE_PATTERN[5] = {1, 1, 1, 1, 1};
-const int32_t CBC_OneDimReader::L_PATTERNS[10][4] = {
-    {3, 2, 1, 1}, {2, 2, 2, 1}, {2, 1, 2, 2}, {1, 4, 1, 1}, {1, 1, 3, 2},
-    {1, 2, 3, 1}, {1, 1, 1, 4}, {1, 3, 1, 2}, {1, 2, 1, 3}, {3, 1, 1, 2}};
-const int32_t CBC_OneDimReader::L_AND_G_PATTERNS[20][4] = {
-    {3, 2, 1, 1}, {2, 2, 2, 1}, {2, 1, 2, 2}, {1, 4, 1, 1}, {1, 1, 3, 2},
-    {1, 2, 3, 1}, {1, 1, 1, 4}, {1, 3, 1, 2}, {1, 2, 1, 3}, {3, 1, 1, 2},
-    {1, 1, 2, 3}, {1, 2, 2, 2}, {2, 2, 1, 2}, {1, 1, 4, 1}, {2, 3, 1, 1},
-    {1, 3, 2, 1}, {4, 1, 1, 1}, {2, 1, 3, 1}, {3, 1, 2, 1}, {2, 1, 1, 3}};
-
-CBC_OneDimReader::CBC_OneDimReader() {}
-CBC_OneDimReader::~CBC_OneDimReader() {}
-CFX_Int32Array* CBC_OneDimReader::FindStartGuardPattern(CBC_CommonBitArray* row,
-                                                        int32_t& e) {
-  FX_BOOL foundStart = FALSE;
-  CFX_Int32Array* startRange = NULL;
-  CFX_Int32Array startEndPattern;
-  startEndPattern.SetSize(3);
-  startEndPattern[0] = START_END_PATTERN[0];
-  startEndPattern[1] = START_END_PATTERN[1];
-  startEndPattern[2] = START_END_PATTERN[2];
-  int32_t nextStart = 0;
-  while (!foundStart) {
-    delete startRange;
-    startRange = FindGuardPattern(row, nextStart, FALSE, &startEndPattern, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    int32_t start = (*startRange)[0];
-    nextStart = (*startRange)[1];
-    if (start <= 1) {
-      break;
-    }
-    int32_t quietStart = start - (nextStart - start);
-    if (quietStart >= 0) {
-      FX_BOOL booT = row->IsRange(quietStart, start, FALSE, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      foundStart = booT;
-    }
-  }
-  return startRange;
-}
-CFX_ByteString CBC_OneDimReader::DecodeRow(int32_t rowNumber,
-                                           CBC_CommonBitArray* row,
-                                           int32_t hints,
-                                           int32_t& e) {
-  std::unique_ptr<CFX_Int32Array> result(FindStartGuardPattern(row, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CFX_ByteString temp = DecodeRow(rowNumber, row, result.get(), hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return temp;
-}
-CFX_ByteString CBC_OneDimReader::DecodeRow(int32_t rowNumber,
-                                           CBC_CommonBitArray* row,
-                                           CFX_Int32Array* startGuardRange,
-                                           int32_t hints,
-                                           int32_t& e) {
-  CFX_ByteString result;
-  DecodeMiddle(row, startGuardRange, result, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  FX_BOOL b = CheckChecksum(result, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  if (!b) {
-    e = BCExceptionChecksumException;
-    return "";
-  }
-  return result;
-}
-FX_BOOL CBC_OneDimReader::CheckChecksum(CFX_ByteString& s, int32_t& e) {
-  FX_BOOL temp = CheckStandardUPCEANChecksum(s, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return temp;
-}
-FX_BOOL CBC_OneDimReader::CheckStandardUPCEANChecksum(CFX_ByteString& s,
-                                                      int32_t& e) {
-  int32_t length = s.GetLength();
-  if (length == 0) {
-    return FALSE;
-  }
-  int32_t sum = 0;
-  for (int32_t i = length - 2; i >= 0; i -= 2) {
-    int32_t digit = (int32_t)s[i] - (int32_t)'0';
-    if (digit < 0 || digit > 9) {
-      e = BCExceptionFormatException;
-      return FALSE;
-    }
-    sum += digit;
-  }
-  sum *= 3;
-  for (int32_t j = length - 1; j >= 0; j -= 2) {
-    int32_t digit = (int32_t)s[j] - (int32_t)'0';
-    if (digit < 0 || digit > 9) {
-      e = BCExceptionFormatException;
-      return FALSE;
-    }
-    sum += digit;
-  }
-  return sum % 10 == 0;
-}
-CFX_Int32Array* CBC_OneDimReader::DecodeEnd(CBC_CommonBitArray* row,
-                                            int32_t endStart,
-                                            int32_t& e) {
-  CFX_Int32Array startEndPattern;
-  startEndPattern.Add(START_END_PATTERN[0]);
-  startEndPattern.Add(START_END_PATTERN[1]);
-  startEndPattern.Add(START_END_PATTERN[2]);
-  CFX_Int32Array* FindGuard =
-      FindGuardPattern(row, endStart, FALSE, &startEndPattern, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return FindGuard;
-}
-CFX_Int32Array* CBC_OneDimReader::FindGuardPattern(CBC_CommonBitArray* row,
-                                                   int32_t rowOffset,
-                                                   FX_BOOL whiteFirst,
-                                                   CFX_Int32Array* pattern,
-                                                   int32_t& e) {
-  int32_t patternLength = pattern->GetSize();
-  CFX_Int32Array counters;
-  counters.SetSize(patternLength);
-  int32_t width = row->GetSize();
-  FX_BOOL isWhite = FALSE;
-  while (rowOffset < width) {
-    isWhite = !row->Get(rowOffset);
-    if (whiteFirst == isWhite) {
-      break;
-    }
-    rowOffset++;
-  }
-  int32_t counterPosition = 0;
-  int32_t patternStart = rowOffset;
-  for (int32_t x = rowOffset; x < width; x++) {
-    FX_BOOL pixel = row->Get(x);
-    if (pixel ^ isWhite) {
-      counters[counterPosition]++;
-    } else {
-      if (counterPosition == patternLength - 1) {
-        if (PatternMatchVariance(&counters, &(*pattern)[0],
-                                 MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
-          CFX_Int32Array* result = new CFX_Int32Array();
-          result->SetSize(2);
-          (*result)[0] = patternStart;
-          (*result)[1] = x;
-          return result;
-        }
-        patternStart += counters[0] + counters[1];
-        for (int32_t y = 2; y < patternLength; y++) {
-          counters[y - 2] = counters[y];
-        }
-        counters[patternLength - 2] = 0;
-        counters[patternLength - 1] = 0;
-        counterPosition--;
-      } else {
-        counterPosition++;
-      }
-      counters[counterPosition] = 1;
-      isWhite = !isWhite;
-    }
-  }
-  e = BCExceptionNotFound;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return NULL;
-}
-int32_t CBC_OneDimReader::DecodeDigit(CBC_CommonBitArray* row,
-                                      CFX_Int32Array* counters,
-                                      int32_t rowOffset,
-                                      const int32_t* patterns,
-                                      int32_t patternLength,
-                                      int32_t& e) {
-  RecordPattern(row, rowOffset, counters, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  int32_t bestVariance = MAX_AVG_VARIANCE;
-  int32_t bestMatch = -1;
-  int32_t max = patternLength;
-  for (int32_t i = 0; i < max; i++) {
-    int32_t variance = PatternMatchVariance(counters, &patterns[i * 4],
-                                            MAX_INDIVIDUAL_VARIANCE);
-    if (variance < bestVariance) {
-      bestVariance = variance;
-      bestMatch = i;
-    }
-  }
-  if (bestMatch >= 0) {
-    return bestMatch;
-  } else {
-    e = BCExceptionNotFound;
-    return 0;
-  }
-  return 0;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OneDimReader.h b/xfa/src/fxbarcode/oned/BC_OneDimReader.h
deleted file mode 100644
index 9e5789a..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDimReader.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDIMREADER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDIMREADER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-
-class CBC_CommonBitArray;
-
-class CBC_OneDimReader : public CBC_OneDReader {
- private:
-  static const int32_t MAX_AVG_VARIANCE = (int32_t)(256 * 0.48f);
-  static const int32_t MAX_INDIVIDUAL_VARIANCE = (int32_t)(256 * 0.7f);
-
-  FX_BOOL CheckStandardUPCEANChecksum(CFX_ByteString& s, int32_t& e);
-
- public:
-  static const int32_t START_END_PATTERN[3];
-  static const int32_t MIDDLE_PATTERN[5];
-  static const int32_t L_PATTERNS[10][4];
-  static const int32_t L_AND_G_PATTERNS[20][4];
-
-  CBC_OneDimReader();
-  virtual ~CBC_OneDimReader();
-
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           int32_t hints,
-                           int32_t& e);
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           CFX_Int32Array* startGuardRange,
-                           int32_t hints,
-                           int32_t& e);
-
- protected:
-  CFX_Int32Array* FindStartGuardPattern(CBC_CommonBitArray* row, int32_t& e);
-  virtual FX_BOOL CheckChecksum(CFX_ByteString& s, int32_t& e);
-  CFX_Int32Array* FindGuardPattern(CBC_CommonBitArray* row,
-                                   int32_t rowOffset,
-                                   FX_BOOL whiteFirst,
-                                   CFX_Int32Array* pattern,
-                                   int32_t& e);
-  int32_t DecodeDigit(CBC_CommonBitArray* row,
-                      CFX_Int32Array* counters,
-                      int32_t rowOffset,
-                      const int32_t* patterns,
-                      int32_t patternLength,
-                      int32_t& e);
-  virtual int32_t DecodeMiddle(CBC_CommonBitArray* row,
-                               CFX_Int32Array* startRange,
-                               CFX_ByteString& resultResult,
-                               int32_t& e) {
-    return 0;
-  }
-  virtual CFX_Int32Array* DecodeEnd(CBC_CommonBitArray* row,
-                                    int32_t endStart,
-                                    int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDIMREADER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp b/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp
deleted file mode 100644
index 121b72c..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp
+++ /dev/null
@@ -1,437 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-
-CBC_OneDimWriter::CBC_OneDimWriter() {
-  m_locTextLoc = BC_TEXT_LOC_BELOWEMBED;
-  m_bPrintChecksum = TRUE;
-  m_iDataLenth = 0;
-  m_bCalcChecksum = FALSE;
-  m_pFont = NULL;
-  m_fFontSize = 10;
-  m_iFontStyle = 0;
-  m_fontColor = 0xff000000;
-  m_iContentLen = 0;
-  m_bLeftPadding = FALSE;
-  m_bRightPadding = FALSE;
-  m_output = NULL;
-}
-CBC_OneDimWriter::~CBC_OneDimWriter() {
-  delete m_output;
-}
-void CBC_OneDimWriter::SetPrintChecksum(FX_BOOL checksum) {
-  m_bPrintChecksum = checksum;
-}
-void CBC_OneDimWriter::SetDataLength(int32_t length) {
-  m_iDataLenth = length;
-}
-void CBC_OneDimWriter::SetCalcChecksum(int32_t state) {
-  m_bCalcChecksum = state;
-}
-FX_BOOL CBC_OneDimWriter::SetFont(CFX_Font* cFont) {
-  if (cFont == NULL) {
-    return FALSE;
-  }
-  m_pFont = cFont;
-  return TRUE;
-}
-void CBC_OneDimWriter::SetFontSize(FX_FLOAT size) {
-  m_fFontSize = size;
-}
-void CBC_OneDimWriter::SetFontStyle(int32_t style) {
-  m_iFontStyle = style;
-}
-void CBC_OneDimWriter::SetFontColor(FX_ARGB color) {
-  m_fontColor = color;
-}
-FX_WCHAR CBC_OneDimWriter::Upper(FX_WCHAR ch) {
-  if (ch >= 'a' && ch <= 'z') {
-    ch = ch - ('a' - 'A');
-  }
-  return ch;
-}
-uint8_t* CBC_OneDimWriter::Encode(const CFX_ByteString& contents,
-                                  BCFORMAT format,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t hints,
-                                  int32_t& e) {
-  uint8_t* ret = NULL;
-  outHeight = 1;
-  if (m_Width >= 20) {
-    ret = Encode(contents, outWidth, e);
-  } else {
-    ret = Encode(contents, outWidth, e);
-  }
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OneDimWriter::Encode(const CFX_ByteString& contents,
-                                  BCFORMAT format,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-int32_t CBC_OneDimWriter::AppendPattern(uint8_t* target,
-                                        int32_t pos,
-                                        const int32_t* pattern,
-                                        int32_t patternLength,
-                                        int32_t startColor,
-                                        int32_t& e) {
-  if (startColor != 0 && startColor != 1) {
-    e = BCExceptionValueMustBeEither0or1;
-    return 0;
-  }
-  uint8_t color = (uint8_t)startColor;
-  int32_t numAdded = 0;
-  for (int32_t i = 0; i < patternLength; i++) {
-    for (int32_t j = 0; j < pattern[i]; j++) {
-      target[pos] = color;
-      pos += 1;
-      numAdded += 1;
-    }
-    color ^= 1;
-  }
-  return numAdded;
-}
-void CBC_OneDimWriter::CalcTextInfo(const CFX_ByteString& text,
-                                    FXTEXT_CHARPOS* charPos,
-                                    CFX_Font* cFont,
-                                    FX_FLOAT geWidth,
-                                    int32_t fontSize,
-                                    FX_FLOAT& charsLen) {
-  std::unique_ptr<CFX_UnicodeEncodingEx> encoding(
-      FX_CreateFontEncodingEx(cFont));
-
-  int32_t length = text.GetLength();
-  FX_DWORD* pCharCode = FX_Alloc(FX_DWORD, text.GetLength());
-  FX_FLOAT charWidth = 0;
-  for (int32_t j = 0; j < text.GetLength(); j++) {
-    pCharCode[j] = encoding->CharCodeFromUnicode(text[j]);
-    int32_t glyp_code = encoding->GlyphFromCharCode(pCharCode[j]);
-    int32_t glyp_value = cFont->GetGlyphWidth(glyp_code);
-    FX_FLOAT temp = (FX_FLOAT)((glyp_value)*fontSize / 1000.0);
-    charWidth += temp;
-  }
-  charsLen = charWidth;
-  FX_FLOAT leftPositon = (FX_FLOAT)(geWidth - charsLen) / 2.0f;
-  if (leftPositon < 0 && geWidth == 0) {
-    leftPositon = 0;
-  }
-  FX_FLOAT penX = 0.0;
-  FX_FLOAT penY =
-      (FX_FLOAT)FXSYS_abs(cFont->GetDescent()) * (FX_FLOAT)fontSize / 1000.0f;
-  FX_FLOAT left = leftPositon;
-  FX_FLOAT top = 0.0;
-  charPos[0].m_OriginX = penX + left;
-  charPos[0].m_OriginY = penY + top;
-  charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[0]);
-  charPos[0].m_FontCharWidth = cFont->GetGlyphWidth(charPos[0].m_GlyphIndex);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-  charPos[0].m_ExtGID = charPos[0].m_GlyphIndex;
-#endif
-  penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f;
-  for (int32_t i = 1; i < length; i++) {
-    charPos[i].m_OriginX = penX + left;
-    charPos[i].m_OriginY = penY + top;
-    charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[i]);
-    charPos[i].m_FontCharWidth = cFont->GetGlyphWidth(charPos[i].m_GlyphIndex);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-    charPos[i].m_ExtGID = charPos[i].m_GlyphIndex;
-#endif
-    penX +=
-        (FX_FLOAT)(charPos[i].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f;
-  }
-  FX_Free(pCharCode);
-}
-void CBC_OneDimWriter::ShowDeviceChars(CFX_RenderDevice* device,
-                                       const CFX_Matrix* matrix,
-                                       const CFX_ByteString str,
-                                       FX_FLOAT geWidth,
-                                       FXTEXT_CHARPOS* pCharPos,
-                                       FX_FLOAT locX,
-                                       FX_FLOAT locY,
-                                       int32_t barWidth) {
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  CFX_FloatRect rect((FX_FLOAT)locX, (FX_FLOAT)locY, (FX_FLOAT)(locX + geWidth),
-                     (FX_FLOAT)(locY + iTextHeight));
-  if (geWidth != m_Width) {
-    rect.right -= 1;
-  }
-  matrix->TransformRect(rect);
-  FX_RECT re = rect.GetOutterRect();
-  device->FillRect(&re, m_backgroundColor);
-  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)locX,
-                           (FX_FLOAT)(locY + iFontSize));
-  if (matrix) {
-    affine_matrix.Concat(*matrix);
-  }
-  device->DrawNormalText(str.GetLength(), pCharPos, m_pFont,
-                         CFX_GEModule::Get()->GetFontCache(),
-                         (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix,
-                         m_fontColor, FXTEXT_CLEARTYPE);
-}
-void CBC_OneDimWriter::ShowBitmapChars(CFX_DIBitmap* pOutBitmap,
-                                       const CFX_ByteString str,
-                                       FX_FLOAT geWidth,
-                                       FXTEXT_CHARPOS* pCharPos,
-                                       FX_FLOAT locX,
-                                       FX_FLOAT locY,
-                                       int32_t barWidth) {
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  CFX_FxgeDevice ge;
-  ge.Create((int)geWidth, iTextHeight, m_colorSpace);
-  FX_RECT geRect(0, 0, (int)geWidth, iTextHeight);
-  ge.FillRect(&geRect, m_backgroundColor);
-  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
-  ge.DrawNormalText(str.GetLength(), pCharPos, m_pFont,
-                    CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                    (CFX_Matrix*)&affine_matrix, m_fontColor, FXTEXT_CLEARTYPE);
-  CFX_FxgeDevice geBitmap;
-  geBitmap.Attach(pOutBitmap);
-  geBitmap.SetDIBits(ge.GetBitmap(), (int)locX, (int)locY);
-}
-void CBC_OneDimWriter::ShowChars(const CFX_WideStringC& contents,
-                                 CFX_DIBitmap* pOutBitmap,
-                                 CFX_RenderDevice* device,
-                                 const CFX_Matrix* matrix,
-                                 int32_t barWidth,
-                                 int32_t multiple,
-                                 int32_t& e) {
-  if (device == NULL && pOutBitmap == NULL) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  if (m_pFont == NULL) {
-    e = BCExceptionNullPointer;
-    return;
-  }
-  CFX_ByteString str = FX_UTF8Encode(contents);
-  int32_t iLen = str.GetLength();
-  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
-  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
-  FX_FLOAT charsLen = 0;
-  FX_FLOAT geWidth = 0;
-  if (m_locTextLoc == BC_TEXT_LOC_ABOVEEMBED ||
-      m_locTextLoc == BC_TEXT_LOC_BELOWEMBED) {
-    geWidth = 0;
-  } else if (m_locTextLoc == BC_TEXT_LOC_ABOVE ||
-             m_locTextLoc == BC_TEXT_LOC_BELOW) {
-    geWidth = (FX_FLOAT)barWidth;
-  }
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  CalcTextInfo(str, pCharPos, m_pFont, geWidth, iFontSize, charsLen);
-  if (charsLen < 1) {
-    return;
-  }
-  int32_t locX = 0;
-  int32_t locY = 0;
-  switch (m_locTextLoc) {
-    case BC_TEXT_LOC_ABOVEEMBED:
-      locX = (int32_t)(barWidth - charsLen) / 2;
-      locY = 0;
-      geWidth = charsLen;
-      break;
-    case BC_TEXT_LOC_ABOVE:
-      locX = 0;
-      locY = 0;
-      geWidth = (FX_FLOAT)barWidth;
-      break;
-    case BC_TEXT_LOC_BELOWEMBED:
-      locX = (int32_t)(barWidth - charsLen) / 2;
-      locY = m_Height - iTextHeight;
-      geWidth = charsLen;
-      break;
-    case BC_TEXT_LOC_BELOW:
-    default:
-      locX = 0;
-      locY = m_Height - iTextHeight;
-      geWidth = (FX_FLOAT)barWidth;
-      break;
-  }
-  if (device) {
-    ShowDeviceChars(device, matrix, str, geWidth, pCharPos, (FX_FLOAT)locX,
-                    (FX_FLOAT)locY, barWidth);
-  } else {
-    ShowBitmapChars(pOutBitmap, str, geWidth, pCharPos, (FX_FLOAT)locX,
-                    (FX_FLOAT)locY, barWidth);
-  }
-  FX_Free(pCharPos);
-}
-void CBC_OneDimWriter::RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
-                                          const CFX_WideStringC& contents,
-                                          int32_t& e) {
-  if (m_output == NULL) {
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight());
-  pOutBitmap->Clear(m_backgroundColor);
-  if (!pOutBitmap) {
-    e = BCExceptionFailToCreateBitmap;
-    return;
-  }
-  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
-    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
-      if (m_output->Get(x, y)) {
-        pOutBitmap->SetPixel(x, y, m_barColor);
-      }
-    }
-  }
-  int32_t i = 0;
-  for (; i < contents.GetLength(); i++)
-    if (contents.GetAt(i) != ' ') {
-      break;
-    }
-  if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) {
-    ShowChars(contents, pOutBitmap, NULL, NULL, m_barWidth, m_multiple, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  CFX_DIBitmap* pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height);
-  if (pOutBitmap) {
-    delete pOutBitmap;
-  }
-  pOutBitmap = pStretchBitmap;
-}
-void CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device,
-                                          const CFX_Matrix* matrix,
-                                          const CFX_WideStringC& contents,
-                                          int32_t& e) {
-  if (m_output == NULL) {
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  CFX_GraphStateData stateData;
-  CFX_PathData path;
-  path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height);
-  device->DrawPath(&path, matrix, &stateData, m_backgroundColor,
-                   m_backgroundColor, FXFILL_ALTERNATE);
-  CFX_Matrix matri(m_outputHScale, 0.0, 0.0, (FX_FLOAT)m_Height, 0.0, 0.0);
-  matri.Concat(*matrix);
-  for (int32_t x = 0; x < m_output->GetWidth(); x++) {
-    for (int32_t y = 0; y < m_output->GetHeight(); y++) {
-      CFX_PathData rect;
-      rect.AppendRect((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)(x + 1),
-                      (FX_FLOAT)(y + 1));
-      CFX_GraphStateData stateData;
-      if (m_output->Get(x, y)) {
-        device->DrawPath(&rect, &matri, &stateData, m_barColor, 0,
-                         FXFILL_WINDING);
-      }
-    }
-  }
-  int32_t i = 0;
-  for (; i < contents.GetLength(); i++)
-    if (contents.GetAt(i) != ' ') {
-      break;
-    }
-  if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) {
-    ShowChars(contents, NULL, device, matrix, m_barWidth, m_multiple, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_OneDimWriter::RenderResult(const CFX_WideStringC& contents,
-                                    uint8_t* code,
-                                    int32_t codeLength,
-                                    FX_BOOL isDevice,
-                                    int32_t& e) {
-  if (codeLength < 1) {
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if (m_ModuleHeight < 20.0) {
-    m_ModuleHeight = 20;
-  }
-  int32_t codeOldLength = codeLength;
-  int32_t leftPadding = 0;
-  int32_t rightPadding = 0;
-  if (m_bLeftPadding) {
-    leftPadding = 7;
-  }
-  if (m_bRightPadding) {
-    rightPadding = 7;
-  }
-  codeLength += leftPadding;
-  codeLength += rightPadding;
-  m_outputHScale = 1.0;
-  if (m_Width > 0) {
-    m_outputHScale = (FX_FLOAT)m_Width / (FX_FLOAT)codeLength;
-  }
-  if (!isDevice) {
-    m_outputHScale =
-        std::max(m_outputHScale, static_cast<FX_FLOAT>(m_ModuleWidth));
-  }
-  FX_FLOAT dataLengthScale = 1.0;
-  if (m_iDataLenth > 0 && contents.GetLength() != 0) {
-    dataLengthScale = FX_FLOAT(contents.GetLength()) / FX_FLOAT(m_iDataLenth);
-  }
-  if (m_iDataLenth > 0 && contents.GetLength() == 0) {
-    dataLengthScale = FX_FLOAT(1) / FX_FLOAT(m_iDataLenth);
-  }
-  m_multiple = 1;
-  if (!isDevice) {
-    m_multiple = (int32_t)ceil(m_outputHScale * dataLengthScale);
-  }
-  int32_t outputHeight = 1;
-  if (!isDevice) {
-    if (m_Height == 0) {
-      outputHeight = std::max(20, m_ModuleHeight);
-    } else {
-      outputHeight = m_Height;
-    }
-  }
-  int32_t outputWidth = codeLength;
-  if (!isDevice) {
-    outputWidth = (int32_t)(codeLength * m_multiple / dataLengthScale);
-  }
-  m_barWidth = m_Width;
-  if (!isDevice) {
-    m_barWidth = codeLength * m_multiple;
-  }
-  m_output = new CBC_CommonBitMatrix;
-  m_output->Init(outputWidth, outputHeight);
-  int32_t outputX = leftPadding * m_multiple;
-  for (int32_t inputX = 0; inputX < codeOldLength; inputX++) {
-    if (code[inputX] == 1) {
-      if (outputX >= outputWidth) {
-        break;
-      }
-      if (outputX + m_multiple > outputWidth && outputWidth - outputX > 0) {
-        m_output->SetRegion(outputX, 0, outputWidth - outputX, outputHeight, e);
-        break;
-      }
-      m_output->SetRegion(outputX, 0, m_multiple, outputHeight, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    outputX += m_multiple;
-  }
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OneDimWriter.h b/xfa/src/fxbarcode/oned/BC_OneDimWriter.h
deleted file mode 100644
index f8001dc..0000000
--- a/xfa/src/fxbarcode/oned/BC_OneDimWriter.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
-
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-
-class CBC_CommonBitMatrix;
-class CFX_Font;
-class CFX_RenderDevice;
-
-class CBC_OneDimWriter : public CBC_Writer {
- public:
-  CBC_OneDimWriter();
-  virtual ~CBC_OneDimWriter();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  virtual uint8_t* Encode(const CFX_ByteString& contents,
-                          int32_t& outLength,
-                          int32_t& e) {
-    return NULL;
-  }
-  virtual void RenderResult(const CFX_WideStringC& contents,
-                            uint8_t* code,
-                            int32_t codeLength,
-                            FX_BOOL isDevice,
-                            int32_t& e);
-  virtual void RenderBitmapResult(CFX_DIBitmap*& pOutBitmap,
-                                  const CFX_WideStringC& contents,
-                                  int32_t& e);
-  virtual void RenderDeviceResult(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matrix,
-                                  const CFX_WideStringC& contents,
-                                  int32_t& e);
-  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents) {
-    return TRUE;
-  }
-  virtual CFX_WideString FilterContents(const CFX_WideStringC& contents) {
-    return CFX_WideString();
-  }
-  virtual CFX_WideString RenderTextContents(const CFX_WideStringC& contents) {
-    return CFX_WideString();
-  }
-  virtual void SetPrintChecksum(FX_BOOL checksum);
-  virtual void SetDataLength(int32_t length);
-  virtual void SetCalcChecksum(int32_t state);
-  virtual void SetFontSize(FX_FLOAT size);
-  virtual void SetFontStyle(int32_t style);
-  virtual void SetFontColor(FX_ARGB color);
-  virtual FX_BOOL SetFont(CFX_Font* cFont);
-
- protected:
-  FX_BOOL m_bPrintChecksum;
-  int32_t m_iDataLenth;
-  FX_BOOL m_bCalcChecksum;
-  CFX_Font* m_pFont;
-  FX_FLOAT m_fFontSize;
-  int32_t m_iFontStyle;
-  FX_DWORD m_fontColor;
-  BC_TEXT_LOC m_locTextLoc;
-  int32_t m_iContentLen;
-  FX_BOOL m_bLeftPadding;
-  FX_BOOL m_bRightPadding;
-  CBC_CommonBitMatrix* m_output;
-  int32_t m_barWidth;
-  int32_t m_multiple;
-  FX_FLOAT m_outputHScale;
-  void CalcTextInfo(const CFX_ByteString& text,
-                    FXTEXT_CHARPOS* charPos,
-                    CFX_Font* cFont,
-                    FX_FLOAT geWidth,
-                    int32_t fontSize,
-                    FX_FLOAT& charsLen);
-  virtual void ShowChars(const CFX_WideStringC& contents,
-                         CFX_DIBitmap* pOutBitmap,
-                         CFX_RenderDevice* device,
-                         const CFX_Matrix* matrix,
-                         int32_t barWidth,
-                         int32_t multiple,
-                         int32_t& e);
-  virtual void ShowBitmapChars(CFX_DIBitmap* pOutBitmap,
-                               const CFX_ByteString str,
-                               FX_FLOAT geWidth,
-                               FXTEXT_CHARPOS* pCharPos,
-                               FX_FLOAT locX,
-                               FX_FLOAT locY,
-                               int32_t barWidth);
-  virtual void ShowDeviceChars(CFX_RenderDevice* device,
-                               const CFX_Matrix* matrix,
-                               const CFX_ByteString str,
-                               FX_FLOAT geWidth,
-                               FXTEXT_CHARPOS* pCharPos,
-                               FX_FLOAT locX,
-                               FX_FLOAT locY,
-                               int32_t barWidth);
-  int32_t AppendPattern(uint8_t* target,
-                        int32_t pos,
-                        const int32_t* pattern,
-                        int32_t patternLength,
-                        int32_t startColor,
-                        int32_t& e);
-  FX_WCHAR Upper(FX_WCHAR ch);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp
deleted file mode 100644
index 5d2d447..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const FX_CHAR* CBC_OnedCodaBarReader::ALPHABET_STRING =
-    "0123456789-$:/.+ABCDTN";
-const int32_t CBC_OnedCodaBarReader::CHARACTER_ENCODINGS[22] = {
-    0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024,
-    0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015,
-    0x01A, 0x029, 0x00B, 0x00E, 0x01A, 0x029};
-const FX_CHAR CBC_OnedCodaBarReader::STARTEND_ENCODING[8] = {
-    'E', '*', 'A', 'B', 'C', 'D', 'T', 'N'};
-
-CBC_OnedCodaBarReader::CBC_OnedCodaBarReader() {}
-CBC_OnedCodaBarReader::~CBC_OnedCodaBarReader() {}
-CFX_ByteString CBC_OnedCodaBarReader::DecodeRow(int32_t rowNumber,
-                                                CBC_CommonBitArray* row,
-                                                int32_t hints,
-                                                int32_t& e) {
-  std::unique_ptr<CFX_Int32Array> start(FindAsteriskPattern(row, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  (*start)[1] = 0;
-  int32_t nextStart = (*start)[1];
-  int32_t end = row->GetSize();
-  while (nextStart < end && !row->Get(nextStart)) {
-    nextStart++;
-  }
-  CFX_ByteString result;
-  CFX_Int32Array counters;
-  counters.SetSize(7);
-  FX_CHAR decodedChar;
-  int32_t lastStart;
-  do {
-    RecordPattern(row, nextStart, &counters, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, "");
-    decodedChar = ToNarrowWidePattern(&counters);
-    if (decodedChar == '!') {
-      e = BCExceptionNotFound;
-      return "";
-    }
-    result += decodedChar;
-    lastStart = nextStart;
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      nextStart += counters[i];
-    }
-    while (nextStart < end && !row->Get(nextStart)) {
-      nextStart++;
-    }
-  } while (nextStart < end);
-  int32_t lastPatternSize = 0;
-  for (int32_t j = 0; j < counters.GetSize(); j++) {
-    lastPatternSize += counters[j];
-  }
-  int32_t whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
-  if (nextStart != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  if (result.GetLength() < 2) {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  FX_CHAR startchar = result[0];
-  if (!ArrayContains(STARTEND_ENCODING, startchar)) {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  int32_t len = result.GetLength();
-  CFX_ByteString temp = result;
-  for (int32_t k = 1; k < result.GetLength(); k++) {
-    if (ArrayContains(STARTEND_ENCODING, result[k])) {
-      if ((k + 1) != result.GetLength()) {
-        result.Delete(1, k);
-        k = 1;
-      }
-    }
-  }
-  if (result.GetLength() < 5) {
-    int32_t index = temp.Find(result.Mid(1, result.GetLength() - 1));
-    if (index == len - (result.GetLength() - 1)) {
-      e = BCExceptionNotFound;
-      return "";
-    }
-  }
-  if (result.GetLength() > minCharacterLength) {
-    result = result.Mid(1, result.GetLength() - 2);
-  } else {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  return result;
-}
-CFX_Int32Array* CBC_OnedCodaBarReader::FindAsteriskPattern(
-    CBC_CommonBitArray* row,
-    int32_t& e) {
-  int32_t width = row->GetSize();
-  int32_t rowOffset = 0;
-  while (rowOffset < width) {
-    if (row->Get(rowOffset)) {
-      break;
-    }
-    rowOffset++;
-  }
-  int32_t counterPosition = 0;
-  CFX_Int32Array counters;
-  counters.SetSize(7);
-  int32_t patternStart = rowOffset;
-  FX_BOOL isWhite = FALSE;
-  int32_t patternLength = counters.GetSize();
-  for (int32_t i = rowOffset; i < width; i++) {
-    FX_BOOL pixel = row->Get(i);
-    if (pixel ^ isWhite) {
-      counters[counterPosition]++;
-    } else {
-      if (counterPosition == patternLength - 1) {
-        if (ArrayContains(STARTEND_ENCODING, ToNarrowWidePattern(&counters))) {
-          FX_BOOL btemp3 =
-              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
-                           patternStart, FALSE, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          if (btemp3) {
-            CFX_Int32Array* result = new CFX_Int32Array();
-            result->SetSize(2);
-            (*result)[0] = patternStart;
-            (*result)[1] = i;
-            return result;
-          }
-        }
-        patternStart += counters[0] + counters[1];
-        for (int32_t y = 2; y < patternLength; y++) {
-          counters[y - 2] = counters[y];
-        }
-        counters[patternLength - 2] = 0;
-        counters[patternLength - 1] = 0;
-        counterPosition--;
-      } else {
-        counterPosition++;
-      }
-      counters[counterPosition] = 1;
-      isWhite = !isWhite;
-    }
-  }
-  e = BCExceptionNotFound;
-  return NULL;
-}
-FX_BOOL CBC_OnedCodaBarReader::ArrayContains(const FX_CHAR array[],
-                                             FX_CHAR key) {
-  for (int32_t i = 0; i < 8; i++) {
-    if (array[i] == key) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_CHAR CBC_OnedCodaBarReader::ToNarrowWidePattern(CFX_Int32Array* counter) {
-  int32_t numCounters = counter->GetSize();
-  if (numCounters < 1) {
-    return '!';
-  }
-  int32_t averageCounter = 0;
-  int32_t totalCounters = 0;
-  for (int32_t i = 0; i < numCounters; i++) {
-    totalCounters += (*counter)[i];
-  }
-  averageCounter = totalCounters / numCounters;
-  int32_t pattern = 0;
-  int32_t wideCounters = 0;
-  for (int32_t j = 0; j < numCounters; j++) {
-    if ((*counter)[j] > averageCounter) {
-      pattern |= 1 << (numCounters - 1 - j);
-      wideCounters++;
-    }
-  }
-  if ((wideCounters == 2) || (wideCounters == 3)) {
-    for (int32_t k = 0; k < 22; k++) {
-      if (CHARACTER_ENCODINGS[k] == pattern) {
-        return (ALPHABET_STRING)[k];
-      }
-    }
-  }
-  return '!';
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h
deleted file mode 100644
index 49c136f..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-
-class CBC_CommonBitArray;
-class CBC_OneDReader;
-
-class CBC_OnedCodaBarReader : public CBC_OneDReader {
- public:
-  CBC_OnedCodaBarReader();
-  virtual ~CBC_OnedCodaBarReader();
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           int32_t hints,
-                           int32_t& e);
-  CFX_Int32Array* FindAsteriskPattern(CBC_CommonBitArray* row, int32_t& e);
-  FX_BOOL ArrayContains(const FX_CHAR array[], FX_CHAR key);
-  FX_CHAR ToNarrowWidePattern(CFX_Int32Array* counter);
-
-  static const FX_CHAR* ALPHABET_STRING;
-  static const int32_t CHARACTER_ENCODINGS[22];
-
- private:
-  static const int32_t minCharacterLength = 3;
-  static const FX_CHAR STARTEND_ENCODING[8];
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARREADER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
deleted file mode 100644
index 5d36381..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h"
-
-const FX_CHAR CBC_OnedCodaBarWriter::START_END_CHARS[] = {
-    'A', 'B', 'C', 'D', 'T', 'N', '*', 'E', 'a', 'b', 'c', 'd', 't', 'n', 'e'};
-const FX_CHAR CBC_OnedCodaBarWriter::CONTENT_CHARS[] = {
-    '0', '1', '2', '3', '4', '5', '6', '7',
-    '8', '9', '-', '$', '/', ':', '+', '.'};
-
-CBC_OnedCodaBarWriter::CBC_OnedCodaBarWriter() {
-  m_chStart = 'A';
-  m_chEnd = 'B';
-  m_iWideNarrRatio = 2;
-}
-CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() {}
-FX_BOOL CBC_OnedCodaBarWriter::SetStartChar(FX_CHAR start) {
-  for (size_t i = 0; i < FX_ArraySize(START_END_CHARS); ++i) {
-    if (START_END_CHARS[i] == start) {
-      m_chStart = start;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-FX_BOOL CBC_OnedCodaBarWriter::SetEndChar(FX_CHAR end) {
-  for (size_t i = 0; i < FX_ArraySize(START_END_CHARS); ++i) {
-    if (START_END_CHARS[i] == end) {
-      m_chEnd = end;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CBC_OnedCodaBarWriter::SetDataLength(int32_t length) {
-  m_iDataLenth = length + 2;
-}
-FX_BOOL CBC_OnedCodaBarWriter::SetTextLocation(BC_TEXT_LOC location) {
-  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
-    return FALSE;
-  }
-  m_locTextLoc = location;
-  return TRUE;
-}
-FX_BOOL CBC_OnedCodaBarWriter::SetWideNarrowRatio(int32_t ratio) {
-  if (ratio < 2 || ratio > 3) {
-    return FALSE;
-  }
-  m_iWideNarrRatio = ratio;
-  return TRUE;
-}
-FX_BOOL CBC_OnedCodaBarWriter::FindChar(FX_WCHAR ch, FX_BOOL isContent) {
-  if (isContent) {
-    for (size_t i = 0; i < FX_ArraySize(CONTENT_CHARS); ++i) {
-      if (ch == (FX_WCHAR)CONTENT_CHARS[i]) {
-        return TRUE;
-      }
-    }
-    for (size_t j = 0; j < FX_ArraySize(START_END_CHARS); ++j) {
-      if (ch == (FX_WCHAR)START_END_CHARS[j]) {
-        return TRUE;
-      }
-    }
-    return FALSE;
-  } else {
-    for (size_t i = 0; i < FX_ArraySize(CONTENT_CHARS); ++i) {
-      if (ch == (FX_WCHAR)CONTENT_CHARS[i]) {
-        return TRUE;
-      }
-    }
-    return FALSE;
-  }
-}
-FX_BOOL CBC_OnedCodaBarWriter::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  FX_WCHAR ch;
-  int32_t index = 0;
-  for (index = 0; index < contents.GetLength(); index++) {
-    ch = contents.GetAt(index);
-    if (FindChar(ch, FALSE)) {
-      continue;
-    } else {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-CFX_WideString CBC_OnedCodaBarWriter::FilterContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filtercontents;
-  FX_WCHAR ch;
-  for (int32_t index = 0; index < contents.GetLength(); index++) {
-    ch = contents.GetAt(index);
-    if (ch > 175) {
-      index++;
-      continue;
-    }
-    if (FindChar(ch, TRUE)) {
-      filtercontents += ch;
-    } else {
-      continue;
-    }
-  }
-  return filtercontents;
-}
-uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
-                                       BCFORMAT format,
-                                       int32_t& outWidth,
-                                       int32_t& outHeight,
-                                       int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
-                                       BCFORMAT format,
-                                       int32_t& outWidth,
-                                       int32_t& outHeight,
-                                       int32_t hints,
-                                       int32_t& e) {
-  if (format != BCFORMAT_CODABAR) {
-    e = BCExceptionOnlyEncodeCODEBAR;
-    return NULL;
-  }
-  uint8_t* ret =
-      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString& contents,
-                                       int32_t& outLength,
-                                       int32_t& e) {
-  CBC_OnedCodaBarReader CodaBarR;
-  CFX_ByteString data = m_chStart + contents + m_chEnd;
-  m_iContentLen = data.GetLength();
-  uint8_t* result = FX_Alloc2D(uint8_t, m_iWideNarrRatio * 7, data.GetLength());
-  FX_CHAR ch;
-  int32_t position = 0;
-  for (int32_t index = 0; index < data.GetLength(); index++) {
-    ch = data.GetAt(index);
-    if (((ch >= 'a') && (ch <= 'z'))) {
-      ch = ch - 32;
-    }
-    switch (ch) {
-      case 'T':
-        ch = 'A';
-        break;
-      case 'N':
-        ch = 'B';
-        break;
-      case '*':
-        ch = 'C';
-        break;
-      case 'E':
-        ch = 'D';
-        break;
-      default:
-        break;
-    }
-    int32_t code = 0;
-    int32_t len = (int32_t)strlen(CodaBarR.ALPHABET_STRING);
-    for (int32_t i = 0; i < len; i++) {
-      if (ch == CodaBarR.ALPHABET_STRING[i]) {
-        code = CodaBarR.CHARACTER_ENCODINGS[i];
-        break;
-      }
-    }
-    uint8_t color = 1;
-    int32_t counter = 0;
-    int32_t bit = 0;
-    while (bit < 7) {
-      result[position] = color;
-      position++;
-      if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) {
-        color = !color;
-        bit++;
-        counter = 0;
-      } else {
-        counter++;
-      }
-    }
-    if (index < data.GetLength() - 1) {
-      result[position] = 0;
-      position++;
-    }
-  }
-  outLength = position;
-  return result;
-}
-CFX_WideString CBC_OnedCodaBarWriter::encodedContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString strStart(m_chStart);
-  CFX_WideString strEnd(m_chEnd);
-  return strStart + contents + strEnd;
-}
-void CBC_OnedCodaBarWriter::RenderResult(const CFX_WideStringC& contents,
-                                         uint8_t* code,
-                                         int32_t codeLength,
-                                         FX_BOOL isDevice,
-                                         int32_t& e) {
-  CBC_OneDimWriter::RenderResult(encodedContents(contents), code, codeLength,
-                                 isDevice, e);
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h
deleted file mode 100644
index 8f9ca58..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
-
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
-class CBC_OnedCodaBarWriter;
-class CBC_OnedCodaBarWriter : public CBC_OneDimWriter {
- public:
-  CBC_OnedCodaBarWriter();
-  virtual ~CBC_OnedCodaBarWriter();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  CFX_WideString encodedContents(const CFX_WideStringC& contents);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  FX_BOOL SetStartChar(FX_CHAR start);
-  FX_BOOL SetEndChar(FX_CHAR end);
-  void SetDataLength(int32_t length);
-  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  FX_BOOL SetWideNarrowRatio(int32_t ratio);
-  FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent);
-
- private:
-  void RenderResult(const CFX_WideStringC& contents,
-                    uint8_t* code,
-                    int32_t codeLength,
-                    FX_BOOL isDevice,
-                    int32_t& e);
-  static const FX_CHAR START_END_CHARS[];
-  static const FX_CHAR CONTENT_CHARS[];
-  FX_CHAR m_chStart;
-  FX_CHAR m_chEnd;
-  int32_t m_iWideNarrRatio;
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp
deleted file mode 100644
index 41a6ad1..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <algorithm>
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_OnedCode128Reader::CODE_PATTERNS[107][7] = {
-    {2, 1, 2, 2, 2, 2, 0}, {2, 2, 2, 1, 2, 2, 0}, {2, 2, 2, 2, 2, 1, 0},
-    {1, 2, 1, 2, 2, 3, 0}, {1, 2, 1, 3, 2, 2, 0}, {1, 3, 1, 2, 2, 2, 0},
-    {1, 2, 2, 2, 1, 3, 0}, {1, 2, 2, 3, 1, 2, 0}, {1, 3, 2, 2, 1, 2, 0},
-    {2, 2, 1, 2, 1, 3, 0}, {2, 2, 1, 3, 1, 2, 0}, {2, 3, 1, 2, 1, 2, 0},
-    {1, 1, 2, 2, 3, 2, 0}, {1, 2, 2, 1, 3, 2, 0}, {1, 2, 2, 2, 3, 1, 0},
-    {1, 1, 3, 2, 2, 2, 0}, {1, 2, 3, 1, 2, 2, 0}, {1, 2, 3, 2, 2, 1, 0},
-    {2, 2, 3, 2, 1, 1, 0}, {2, 2, 1, 1, 3, 2, 0}, {2, 2, 1, 2, 3, 1, 0},
-    {2, 1, 3, 2, 1, 2, 0}, {2, 2, 3, 1, 1, 2, 0}, {3, 1, 2, 1, 3, 1, 0},
-    {3, 1, 1, 2, 2, 2, 0}, {3, 2, 1, 1, 2, 2, 0}, {3, 2, 1, 2, 2, 1, 0},
-    {3, 1, 2, 2, 1, 2, 0}, {3, 2, 2, 1, 1, 2, 0}, {3, 2, 2, 2, 1, 1, 0},
-    {2, 1, 2, 1, 2, 3, 0}, {2, 1, 2, 3, 2, 1, 0}, {2, 3, 2, 1, 2, 1, 0},
-    {1, 1, 1, 3, 2, 3, 0}, {1, 3, 1, 1, 2, 3, 0}, {1, 3, 1, 3, 2, 1, 0},
-    {1, 1, 2, 3, 1, 3, 0}, {1, 3, 2, 1, 1, 3, 0}, {1, 3, 2, 3, 1, 1, 0},
-    {2, 1, 1, 3, 1, 3, 0}, {2, 3, 1, 1, 1, 3, 0}, {2, 3, 1, 3, 1, 1, 0},
-    {1, 1, 2, 1, 3, 3, 0}, {1, 1, 2, 3, 3, 1, 0}, {1, 3, 2, 1, 3, 1, 0},
-    {1, 1, 3, 1, 2, 3, 0}, {1, 1, 3, 3, 2, 1, 0}, {1, 3, 3, 1, 2, 1, 0},
-    {3, 1, 3, 1, 2, 1, 0}, {2, 1, 1, 3, 3, 1, 0}, {2, 3, 1, 1, 3, 1, 0},
-    {2, 1, 3, 1, 1, 3, 0}, {2, 1, 3, 3, 1, 1, 0}, {2, 1, 3, 1, 3, 1, 0},
-    {3, 1, 1, 1, 2, 3, 0}, {3, 1, 1, 3, 2, 1, 0}, {3, 3, 1, 1, 2, 1, 0},
-    {3, 1, 2, 1, 1, 3, 0}, {3, 1, 2, 3, 1, 1, 0}, {3, 3, 2, 1, 1, 1, 0},
-    {3, 1, 4, 1, 1, 1, 0}, {2, 2, 1, 4, 1, 1, 0}, {4, 3, 1, 1, 1, 1, 0},
-    {1, 1, 1, 2, 2, 4, 0}, {1, 1, 1, 4, 2, 2, 0}, {1, 2, 1, 1, 2, 4, 0},
-    {1, 2, 1, 4, 2, 1, 0}, {1, 4, 1, 1, 2, 2, 0}, {1, 4, 1, 2, 2, 1, 0},
-    {1, 1, 2, 2, 1, 4, 0}, {1, 1, 2, 4, 1, 2, 0}, {1, 2, 2, 1, 1, 4, 0},
-    {1, 2, 2, 4, 1, 1, 0}, {1, 4, 2, 1, 1, 2, 0}, {1, 4, 2, 2, 1, 1, 0},
-    {2, 4, 1, 2, 1, 1, 0}, {2, 2, 1, 1, 1, 4, 0}, {4, 1, 3, 1, 1, 1, 0},
-    {2, 4, 1, 1, 1, 2, 0}, {1, 3, 4, 1, 1, 1, 0}, {1, 1, 1, 2, 4, 2, 0},
-    {1, 2, 1, 1, 4, 2, 0}, {1, 2, 1, 2, 4, 1, 0}, {1, 1, 4, 2, 1, 2, 0},
-    {1, 2, 4, 1, 1, 2, 0}, {1, 2, 4, 2, 1, 1, 0}, {4, 1, 1, 2, 1, 2, 0},
-    {4, 2, 1, 1, 1, 2, 0}, {4, 2, 1, 2, 1, 1, 0}, {2, 1, 2, 1, 4, 1, 0},
-    {2, 1, 4, 1, 2, 1, 0}, {4, 1, 2, 1, 2, 1, 0}, {1, 1, 1, 1, 4, 3, 0},
-    {1, 1, 1, 3, 4, 1, 0}, {1, 3, 1, 1, 4, 1, 0}, {1, 1, 4, 1, 1, 3, 0},
-    {1, 1, 4, 3, 1, 1, 0}, {4, 1, 1, 1, 1, 3, 0}, {4, 1, 1, 3, 1, 1, 0},
-    {1, 1, 3, 1, 4, 1, 0}, {1, 1, 4, 1, 3, 1, 0}, {3, 1, 1, 1, 4, 1, 0},
-    {4, 1, 1, 1, 3, 1, 0}, {2, 1, 1, 4, 1, 2, 0}, {2, 1, 1, 2, 1, 4, 0},
-    {2, 1, 1, 2, 3, 2, 0}, {2, 3, 3, 1, 1, 1, 2}};
-
-CBC_OnedCode128Reader::CBC_OnedCode128Reader() {}
-CBC_OnedCode128Reader::~CBC_OnedCode128Reader() {}
-CFX_Int32Array* CBC_OnedCode128Reader::FindStartPattern(CBC_CommonBitArray* row,
-                                                        int32_t& e) {
-  int32_t width = row->GetSize();
-  int32_t rowOffset = 0;
-  while (rowOffset < width) {
-    if (row->Get(rowOffset)) {
-      break;
-    }
-    rowOffset++;
-  }
-  int32_t counterPosition = 0;
-  CFX_Int32Array counters;
-  counters.SetSize(6);
-  int32_t patternStart = rowOffset;
-  FX_BOOL isWhite = FALSE;
-  int32_t patternLength = counters.GetSize();
-  for (int32_t i = rowOffset; i < width; i++) {
-    FX_BOOL pixel = row->Get(i);
-    if (pixel ^ isWhite) {
-      counters[counterPosition]++;
-    } else {
-      if (counterPosition == patternLength - 1) {
-        int32_t bestVariance = MAX_AVG_VARIANCE;
-        int32_t bestMatch = -1;
-        for (int32_t startCode = CODE_START_A; startCode <= CODE_START_C;
-             startCode++) {
-          int32_t variance = PatternMatchVariance(
-              &counters, &CODE_PATTERNS[startCode][0], MAX_INDIVIDUAL_VARIANCE);
-          if (variance < bestVariance) {
-            bestVariance = variance;
-            bestMatch = startCode;
-          }
-        }
-        if (bestMatch >= 0) {
-          FX_BOOL btemp2 =
-              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
-                           patternStart, FALSE, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          if (btemp2) {
-            CFX_Int32Array* result = new CFX_Int32Array;
-            result->SetSize(3);
-            (*result)[0] = patternStart;
-            (*result)[1] = i;
-            (*result)[2] = bestMatch;
-            return result;
-          }
-        }
-        patternStart += counters[0] + counters[1];
-        for (int32_t y = 2; y < patternLength; y++) {
-          counters[y - 2] = counters[y];
-        }
-        counters[patternLength - 2] = 0;
-        counters[patternLength - 1] = 0;
-        counterPosition--;
-      } else {
-        counterPosition++;
-      }
-      counters[counterPosition] = 1;
-      isWhite = !isWhite;
-    }
-  }
-  e = BCExceptionNotFound;
-  return NULL;
-}
-int32_t CBC_OnedCode128Reader::DecodeCode(CBC_CommonBitArray* row,
-                                          CFX_Int32Array* counters,
-                                          int32_t rowOffset,
-                                          int32_t& e) {
-  RecordPattern(row, rowOffset, counters, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  int32_t bestVariance = MAX_AVG_VARIANCE;
-  int32_t bestMatch = -1;
-  for (int32_t d = 0; d < 107; d++) {
-    int32_t variance = PatternMatchVariance(counters, &CODE_PATTERNS[d][0],
-                                            MAX_INDIVIDUAL_VARIANCE);
-    if (variance < bestVariance) {
-      bestVariance = variance;
-      bestMatch = d;
-    }
-  }
-  if (bestMatch >= 0) {
-    return bestMatch;
-  } else {
-    e = BCExceptionNotFound;
-    return 0;
-  }
-  return 0;
-}
-CFX_ByteString CBC_OnedCode128Reader::DecodeRow(int32_t rowNumber,
-                                                CBC_CommonBitArray* row,
-                                                int32_t hints,
-                                                int32_t& e) {
-  CFX_Int32Array* startPatternInfo = FindStartPattern(row, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  int32_t startCode = (*startPatternInfo)[2];
-  int32_t codeSet;
-  switch (startCode) {
-    case 103:
-      codeSet = CODE_CODE_A;
-      break;
-    case 104:
-      codeSet = CODE_CODE_B;
-      break;
-    case 105:
-      codeSet = CODE_CODE_C;
-      break;
-    default:
-      if (startPatternInfo) {
-        startPatternInfo->RemoveAll();
-        delete startPatternInfo;
-        startPatternInfo = NULL;
-      }
-      e = BCExceptionFormatException;
-      return "";
-  }
-  FX_BOOL done = FALSE;
-  FX_BOOL isNextShifted = FALSE;
-  CFX_ByteString result;
-  int32_t lastStart = (*startPatternInfo)[0];
-  int32_t nextStart = (*startPatternInfo)[1];
-  if (startPatternInfo) {
-    startPatternInfo->RemoveAll();
-    delete startPatternInfo;
-    startPatternInfo = NULL;
-  }
-  CFX_Int32Array counters;
-  counters.SetSize(6);
-  int32_t lastCode = 0;
-  int32_t code = 0;
-  int32_t checksumTotal = startCode;
-  int32_t multiplier = 0;
-  FX_BOOL lastCharacterWasPrintable = TRUE;
-  while (!done) {
-    FX_BOOL unshift = isNextShifted;
-    isNextShifted = FALSE;
-    lastCode = code;
-    code = DecodeCode(row, &counters, nextStart, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, "");
-    if (code != CODE_STOP) {
-      lastCharacterWasPrintable = TRUE;
-    }
-    if (code != CODE_STOP) {
-      multiplier++;
-      checksumTotal += multiplier * code;
-    }
-    lastStart = nextStart;
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      nextStart += counters[i];
-    }
-    switch (code) {
-      case 103:
-      case 104:
-      case 105:
-        e = BCExceptionFormatException;
-        return "";
-    }
-    switch (codeSet) {
-      case 101:
-        if (code < 64) {
-          result += (FX_CHAR)(' ' + code);
-        } else if (code < 96) {
-          result += (FX_CHAR)(code - 64);
-        } else {
-          if (code != CODE_STOP) {
-            lastCharacterWasPrintable = FALSE;
-          }
-          switch (code) {
-            case 102:
-            case 97:
-            case 96:
-            case 101:
-              break;
-            case 98:
-              isNextShifted = TRUE;
-              codeSet = CODE_CODE_B;
-              break;
-            case 100:
-              codeSet = CODE_CODE_B;
-              break;
-            case 99:
-              codeSet = CODE_CODE_C;
-              break;
-            case 106:
-              done = TRUE;
-              break;
-          }
-        }
-        break;
-      case 100:
-        if (code < 96) {
-          result += (FX_CHAR)(' ' + code);
-        } else {
-          if (code != CODE_STOP) {
-            lastCharacterWasPrintable = FALSE;
-          }
-          switch (code) {
-            case 102:
-            case 97:
-            case 96:
-            case 100:
-              break;
-            case 98:
-              isNextShifted = TRUE;
-              codeSet = CODE_CODE_A;
-              break;
-            case 101:
-              codeSet = CODE_CODE_A;
-              break;
-            case 99:
-              codeSet = CODE_CODE_C;
-              break;
-            case 106:
-              done = TRUE;
-              break;
-          }
-        }
-        break;
-      case 99:
-        if (code < 100) {
-          if (code < 10) {
-            result += '0';
-          }
-          FX_CHAR temp[128];
-          // TODO(dsinclair): Should this be snprintf?
-          sprintf(temp, "%d", code);
-          result += temp;
-        } else {
-          if (code != CODE_STOP) {
-            lastCharacterWasPrintable = FALSE;
-          }
-          switch (code) {
-            case 102:
-              break;
-            case 101:
-              codeSet = CODE_CODE_A;
-              break;
-            case 100:
-              codeSet = CODE_CODE_B;
-              break;
-            case 106:
-              done = TRUE;
-              break;
-          }
-        }
-        break;
-    }
-    if (unshift) {
-      codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A;
-    }
-  }
-  int32_t width = row->GetSize();
-  while (nextStart < width && row->Get(nextStart)) {
-    nextStart++;
-  }
-  FX_BOOL boolT1 = row->IsRange(
-      nextStart, std::min(width, nextStart + (nextStart - lastStart) / 2),
-      FALSE, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  if (!boolT1) {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  checksumTotal -= multiplier * lastCode;
-  if (checksumTotal % 103 != lastCode) {
-    e = BCExceptionChecksumException;
-    return "";
-  }
-  int32_t resultLength = result.GetLength();
-  if (resultLength > 0 && lastCharacterWasPrintable) {
-    if (codeSet == CODE_CODE_C) {
-      result = result.Mid(0, result.GetLength() - 2);
-    } else {
-      result = result.Mid(0, result.GetLength() - 1);
-    }
-  }
-  if (result.GetLength() == 0) {
-    e = BCExceptionFormatException;
-    return "";
-  }
-  return result;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h
deleted file mode 100644
index 1d2c6a1..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
-
-class CBC_OneDReader;
-class CBC_CommonBitArray;
-class CBC_OnedCode128Reader : public CBC_OneDReader {
- public:
-  CBC_OnedCode128Reader();
-  virtual ~CBC_OnedCode128Reader();
-  virtual CFX_ByteString DecodeRow(int32_t rowNumber,
-                                   CBC_CommonBitArray* row,
-                                   int32_t hints,
-                                   int32_t& e);
-
-  static const int32_t CODE_PATTERNS[107][7];
-
- private:
-  static const int32_t MAX_AVG_VARIANCE = (int32_t)(256 * 0.25f);
-  static const int32_t MAX_INDIVIDUAL_VARIANCE = (int32_t)(256 * 0.7f);
-
-  static const int32_t CODE_SHIFT = 98;
-  static const int32_t CODE_CODE_C = 99;
-  static const int32_t CODE_CODE_B = 100;
-  static const int32_t CODE_CODE_A = 101;
-  static const int32_t CODE_FNC_1 = 102;
-  static const int32_t CODE_FNC_2 = 97;
-  static const int32_t CODE_FNC_3 = 96;
-  static const int32_t CODE_FNC_4_A = 101;
-  static const int32_t CODE_FNC_4_B = 100;
-
-  static const int32_t CODE_START_A = 103;
-  static const int32_t CODE_START_B = 104;
-  static const int32_t CODE_START_C = 105;
-  static const int32_t CODE_STOP = 106;
-
-  CFX_Int32Array* FindStartPattern(CBC_CommonBitArray* row, int32_t& e);
-  int32_t DecodeCode(CBC_CommonBitArray* row,
-                     CFX_Int32Array* counters,
-                     int32_t rowOffset,
-                     int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp
deleted file mode 100644
index c8977d3..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2010 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h"
-
-const int32_t CBC_OnedCode128Writer::CODE_CODE_B = 100;
-const int32_t CBC_OnedCode128Writer::CODE_CODE_C = 99;
-const int32_t CBC_OnedCode128Writer::CODE_START_B = 104;
-const int32_t CBC_OnedCode128Writer::CODE_START_C = 105;
-const int32_t CBC_OnedCode128Writer::CODE_STOP = 106;
-
-CBC_OnedCode128Writer::CBC_OnedCode128Writer() {
-  m_codeFormat = BC_CODE128_B;
-}
-CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) {
-  m_codeFormat = type;
-}
-CBC_OnedCode128Writer::~CBC_OnedCode128Writer() {}
-BC_TYPE CBC_OnedCode128Writer::GetType() {
-  return m_codeFormat;
-}
-FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  FX_BOOL ret = TRUE;
-  int32_t position = 0;
-  int32_t patternIndex = -1;
-  if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) {
-    while (position < contents.GetLength()) {
-      patternIndex = (int32_t)contents.GetAt(position);
-      if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) {
-        position++;
-        continue;
-      } else {
-        ret = FALSE;
-        break;
-      }
-      position++;
-    }
-  } else {
-    ret = FALSE;
-  }
-  return ret;
-}
-CFX_WideString CBC_OnedCode128Writer::FilterContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filterChineseChar;
-  FX_WCHAR ch;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    ch = contents.GetAt(i);
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    filterChineseChar += ch;
-  }
-  CFX_WideString filtercontents;
-  if (m_codeFormat == BC_CODE128_B) {
-    for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
-      ch = filterChineseChar.GetAt(i);
-      if (ch >= 32 && ch <= 126) {
-        filtercontents += ch;
-      } else {
-        continue;
-      }
-    }
-  } else if (m_codeFormat == BC_CODE128_C) {
-    for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
-      ch = filterChineseChar.GetAt(i);
-      if (ch >= 32 && ch <= 106) {
-        filtercontents += ch;
-      } else {
-        continue;
-      }
-    }
-  } else {
-    filtercontents = contents;
-  }
-  return filtercontents;
-}
-FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) {
-  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
-    return FALSE;
-  }
-  m_locTextLoc = location;
-  return TRUE;
-}
-uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
-                                       BCFORMAT format,
-                                       int32_t& outWidth,
-                                       int32_t& outHeight,
-                                       int32_t hints,
-                                       int32_t& e) {
-  if (format != BCFORMAT_CODE_128) {
-    e = BCExceptionOnlyEncodeCODE_128;
-    return NULL;
-  }
-  uint8_t* ret =
-      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
-                                       BCFORMAT format,
-                                       int32_t& outWidth,
-                                       int32_t& outHeight,
-                                       int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString& contents,
-                                        int32_t start,
-                                        int32_t length) {
-  int32_t end = start + length;
-  for (int32_t i = start; i < end; i++) {
-    if (contents[i] < '0' || contents[i] > '9') {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
-                                       int32_t& outLength,
-                                       int32_t& e) {
-  if (contents.GetLength() < 1 || contents.GetLength() > 80) {
-    e = BCExceptionContentsLengthShouldBetween1and80;
-    return NULL;
-  }
-  CFX_PtrArray patterns;
-  int32_t checkSum = 0;
-  if (m_codeFormat == BC_CODE128_B) {
-    checkSum = Encode128B(contents, patterns);
-  } else if (m_codeFormat == BC_CODE128_C) {
-    checkSum = Encode128C(contents, patterns);
-  } else {
-    e = BCExceptionFormatException;
-    return NULL;
-  }
-  checkSum %= 103;
-  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]);
-  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]);
-  m_iContentLen = contents.GetLength() + 3;
-  int32_t codeWidth = 0;
-  for (int32_t k = 0; k < patterns.GetSize(); k++) {
-    int32_t* pattern = (int32_t*)patterns[k];
-    for (int32_t j = 0; j < 7; j++) {
-      codeWidth += pattern[j];
-    }
-  }
-  outLength = codeWidth;
-  uint8_t* result = FX_Alloc(uint8_t, outLength);
-  int32_t pos = 0;
-  for (int32_t j = 0; j < patterns.GetSize(); j++) {
-    int32_t* pattern = (int32_t*)patterns[j];
-    pos += AppendPattern(result, pos, pattern, 7, 1, e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  return result;
-}
-int32_t CBC_OnedCode128Writer::Encode128B(const CFX_ByteString& contents,
-                                          CFX_PtrArray& patterns) {
-  int32_t checkSum = 0;
-  int32_t checkWeight = 1;
-  int32_t position = 0;
-  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]);
-  checkSum += CODE_START_B * checkWeight;
-  while (position < contents.GetLength()) {
-    int32_t patternIndex = 0;
-    patternIndex = contents[position] - ' ';
-    position += 1;
-    patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
-    checkSum += patternIndex * checkWeight;
-    if (position != 0) {
-      checkWeight++;
-    }
-  }
-  return checkSum;
-}
-int32_t CBC_OnedCode128Writer::Encode128C(const CFX_ByteString& contents,
-                                          CFX_PtrArray& patterns) {
-  int32_t checkSum = 0;
-  int32_t checkWeight = 1;
-  int32_t position = 0;
-  patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]);
-  checkSum += CODE_START_C * checkWeight;
-  while (position < contents.GetLength()) {
-    int32_t patternIndex = 0;
-    FX_CHAR ch = contents.GetAt(position);
-    if (ch < '0' || ch > '9') {
-      patternIndex = (int32_t)ch;
-      position++;
-    } else {
-      patternIndex = FXSYS_atoi(contents.Mid(position, 2));
-      if (contents.GetAt(position + 1) < '0' ||
-          contents.GetAt(position + 1) > '9') {
-        position += 1;
-      } else {
-        position += 2;
-      }
-    }
-    patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
-    checkSum += patternIndex * checkWeight;
-    if (position != 0) {
-      checkWeight++;
-    }
-  }
-  return checkSum;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h
deleted file mode 100644
index 1fbb028..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
-
-class CBC_OneDimWriter;
-class CBC_OnedCode128Writer : public CBC_OneDimWriter {
- public:
-  CBC_OnedCode128Writer();
-  CBC_OnedCode128Writer(BC_TYPE type);
-  virtual ~CBC_OnedCode128Writer();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  BC_TYPE GetType();
-
- private:
-  FX_BOOL IsDigits(const CFX_ByteString& contents,
-                   int32_t start,
-                   int32_t length);
-  int32_t Encode128B(const CFX_ByteString& contents, CFX_PtrArray& patterns);
-  int32_t Encode128C(const CFX_ByteString& contents, CFX_PtrArray& patterns);
-  BC_TYPE m_codeFormat;
-  static const int32_t CODE_START_B;
-  static const int32_t CODE_START_C;
-  static const int32_t CODE_CODE_B;
-  static const int32_t CODE_CODE_C;
-  static const int32_t CODE_STOP;
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp
deleted file mode 100644
index 689cf4c..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <algorithm>
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const FX_CHAR* CBC_OnedCode39Reader::ALPHABET_STRING =
-    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";
-const FX_CHAR* CBC_OnedCode39Reader::CHECKSUM_STRING =
-    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";
-const int32_t CBC_OnedCode39Reader::CHARACTER_ENCODINGS[44] = {
-    0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124,
-    0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C,
-    0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007,
-    0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0,
-    0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A};
-const int32_t CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094;
-
-CBC_OnedCode39Reader::CBC_OnedCode39Reader()
-    : m_usingCheckDigit(FALSE), m_extendedMode(FALSE) {
-}
-CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit)
-    : m_usingCheckDigit(usingCheckDigit), m_extendedMode(FALSE) {
-}
-CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit,
-                                           FX_BOOL extendedMode)
-    : m_usingCheckDigit(usingCheckDigit), m_extendedMode(extendedMode) {
-}
-CBC_OnedCode39Reader::~CBC_OnedCode39Reader() {}
-CFX_ByteString CBC_OnedCode39Reader::DecodeRow(int32_t rowNumber,
-                                               CBC_CommonBitArray* row,
-                                               int32_t hints,
-                                               int32_t& e) {
-  CFX_Int32Array* start = FindAsteriskPattern(row, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  int32_t nextStart = (*start)[1];
-  delete start;
-  int32_t end = row->GetSize();
-  while (nextStart < end && !row->Get(nextStart)) {
-    nextStart++;
-  }
-  CFX_ByteString result;
-  CFX_Int32Array counters;
-  counters.SetSize(9);
-  FX_CHAR decodedChar;
-  do {
-    RecordPattern(row, nextStart, &counters, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, "");
-    int32_t pattern = ToNarrowWidePattern(&counters);
-    if (pattern < 0) {
-      e = BCExceptionNotFound;
-      return "";
-    }
-    decodedChar = PatternToChar(pattern, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, "");
-    result += decodedChar;
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      nextStart += counters[i];
-    }
-    while (nextStart < end && !row->Get(nextStart)) {
-      nextStart++;
-    }
-  } while (decodedChar != '*');
-  result = result.Mid(0, result.GetLength() - 1);
-  int32_t lastPatternSize = 0;
-  for (int32_t j = 0; j < counters.GetSize(); j++) {
-    lastPatternSize += counters[j];
-  }
-  if (m_usingCheckDigit) {
-    int32_t max = result.GetLength() - 1;
-    int32_t total = 0;
-    int32_t len = (int32_t)strlen(ALPHABET_STRING);
-    for (int32_t k = 0; k < max; k++) {
-      for (int32_t j = 0; j < len; j++)
-        if (ALPHABET_STRING[j] == result[k]) {
-          total += j;
-        }
-    }
-    if (result[max] != (ALPHABET_STRING)[total % 43]) {
-      e = BCExceptionChecksumException;
-      return "";
-    }
-    result = result.Mid(0, result.GetLength() - 1);
-  }
-  if (result.GetLength() == 0) {
-    e = BCExceptionNotFound;
-    return "";
-  }
-  if (m_extendedMode) {
-    CFX_ByteString bytestr = DecodeExtended(result, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, "");
-    return bytestr;
-  } else {
-    return result;
-  }
-}
-CFX_Int32Array* CBC_OnedCode39Reader::FindAsteriskPattern(
-    CBC_CommonBitArray* row,
-    int32_t& e) {
-  int32_t width = row->GetSize();
-  int32_t rowOffset = 0;
-  while (rowOffset < width) {
-    if (row->Get(rowOffset)) {
-      break;
-    }
-    rowOffset++;
-  }
-  int32_t counterPosition = 0;
-  CFX_Int32Array counters;
-  counters.SetSize(9);
-  int32_t patternStart = rowOffset;
-  FX_BOOL isWhite = FALSE;
-  int32_t patternLength = counters.GetSize();
-  for (int32_t i = rowOffset; i < width; i++) {
-    FX_BOOL pixel = row->Get(i);
-    if (pixel ^ isWhite) {
-      counters[counterPosition]++;
-    } else {
-      if (counterPosition == patternLength - 1) {
-        if (ToNarrowWidePattern(&counters) == ASTERISK_ENCODING) {
-          FX_BOOL bT1 =
-              row->IsRange(std::max(0, patternStart - (i - patternStart) / 2),
-                           patternStart, FALSE, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-          if (bT1) {
-            CFX_Int32Array* result = new CFX_Int32Array;
-            result->SetSize(2);
-            (*result)[0] = patternStart;
-            (*result)[1] = i;
-            return result;
-          }
-        }
-        patternStart += counters[0] + counters[1];
-        for (int32_t y = 2; y < patternLength; y++) {
-          counters[y - 2] = counters[y];
-        }
-        counters[patternLength - 2] = 0;
-        counters[patternLength - 1] = 0;
-        counterPosition--;
-      } else {
-        counterPosition++;
-      }
-      counters[counterPosition] = 1;
-      isWhite = !isWhite;
-    }
-  }
-  e = BCExceptionNotFound;
-  return NULL;
-}
-int32_t CBC_OnedCode39Reader::ToNarrowWidePattern(CFX_Int32Array* counters) {
-  int32_t numCounters = counters->GetSize();
-  int32_t maxNarrowCounter = 0;
-  int32_t wideCounters;
-  do {
-#undef max
-    int32_t minCounter = FXSYS_IntMax;
-    for (int32_t i = 0; i < numCounters; i++) {
-      int32_t counter = (*counters)[i];
-      if (counter < minCounter && counter > maxNarrowCounter) {
-        minCounter = counter;
-      }
-    }
-    maxNarrowCounter = minCounter;
-    wideCounters = 0;
-    int32_t totalWideCountersWidth = 0;
-    int32_t pattern = 0;
-    for (int32_t j = 0; j < numCounters; j++) {
-      int32_t counter = (*counters)[j];
-      if ((*counters)[j] > maxNarrowCounter) {
-        pattern |= 1 << (numCounters - 1 - j);
-        wideCounters++;
-        totalWideCountersWidth += counter;
-      }
-    }
-    if (wideCounters == 3) {
-      for (int32_t k = 0; k < numCounters && wideCounters > 0; k++) {
-        int32_t counter = (*counters)[k];
-        if ((*counters)[k] > maxNarrowCounter) {
-          wideCounters--;
-          if ((counter << 1) >= totalWideCountersWidth) {
-            return -1;
-          }
-        }
-      }
-      return pattern;
-    }
-  } while (wideCounters > 3);
-  return -1;
-}
-FX_CHAR CBC_OnedCode39Reader::PatternToChar(int32_t pattern, int32_t& e) {
-  for (int32_t i = 0; i < 44; i++) {
-    if (CHARACTER_ENCODINGS[i] == pattern) {
-      return (ALPHABET_STRING)[i];
-    }
-  }
-  e = BCExceptionNotFound;
-  return 0;
-}
-CFX_ByteString CBC_OnedCode39Reader::DecodeExtended(CFX_ByteString& encoded,
-                                                    int32_t& e) {
-  int32_t length = encoded.GetLength();
-  CFX_ByteString decoded;
-  FX_CHAR c, next;
-  for (int32_t i = 0; i < length; i++) {
-    c = encoded[i];
-    if (c == '+' || c == '$' || c == '%' || c == '/') {
-      next = encoded[i + 1];
-      FX_CHAR decodedChar = '\0';
-      switch (c) {
-        case '+':
-          if (next >= 'A' && next <= 'Z') {
-            decodedChar = (FX_CHAR)(next + 32);
-          } else {
-            e = BCExceptionFormatException;
-            return "";
-          }
-          break;
-        case '$':
-          if (next >= 'A' && next <= 'Z') {
-            decodedChar = (FX_CHAR)(next - 64);
-          } else {
-            e = BCExceptionFormatException;
-            return "";
-          }
-          break;
-        case '%':
-          if (next >= 'A' && next <= 'E') {
-            decodedChar = (FX_CHAR)(next - 38);
-          } else if (next >= 'F' && next <= 'J') {
-            decodedChar = (FX_CHAR)(next - 11);
-          } else if (next >= 'K' && next <= 'O' && next != 'M' && next != 'N') {
-            decodedChar = (FX_CHAR)(next + 16);
-          } else if (next >= 'P' && next <= 'S') {
-            decodedChar = (FX_CHAR)(next + 43);
-          } else if (next == 'U') {
-            decodedChar = (FX_CHAR)0;
-          } else if (next == 'V') {
-            decodedChar = (FX_CHAR)64;
-          } else if (next == 'W') {
-            decodedChar = (FX_CHAR)96;
-          } else if (next == 'T' || next == 'X' || next == 'Y' || next == 'Z') {
-            decodedChar = (FX_CHAR)127;
-          } else {
-            e = BCExceptionFormatException;
-            return "";
-          }
-          break;
-        case '/':
-          if (next >= 'A' && next <= 'O') {
-            decodedChar = (FX_CHAR)(next - 32);
-          } else if (next == 'Z') {
-            decodedChar = ':';
-          } else {
-            e = BCExceptionFormatException;
-            return "";
-          }
-          break;
-      }
-      decoded += decodedChar;
-      i++;
-    } else {
-      decoded += c;
-    }
-  }
-  return decoded;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h
deleted file mode 100644
index b5573b1..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
-
-class CBC_OneDReader;
-class CBC_CommonBitArray;
-class CBC_OnedCode39Reader : public CBC_OneDReader {
- public:
-  static const FX_CHAR* ALPHABET_STRING;
-  static const FX_CHAR* CHECKSUM_STRING;
-  static const int32_t CHARACTER_ENCODINGS[44];
-  static const int32_t ASTERISK_ENCODING;
-  CBC_OnedCode39Reader();
-  CBC_OnedCode39Reader(FX_BOOL usingCheckDigit);
-  CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode);
-  virtual ~CBC_OnedCode39Reader();
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           int32_t hints,
-                           int32_t& e);
-
- private:
-  FX_BOOL m_usingCheckDigit;
-  FX_BOOL m_extendedMode;
-  CFX_Int32Array* FindAsteriskPattern(CBC_CommonBitArray* row, int32_t& e);
-  int32_t ToNarrowWidePattern(CFX_Int32Array* counters);
-  FX_CHAR PatternToChar(int32_t pattern, int32_t& e);
-  CFX_ByteString DecodeExtended(CFX_ByteString& encoded, int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp
deleted file mode 100644
index 5b33965..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2010 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h"
-
-CBC_OnedCode39Writer::CBC_OnedCode39Writer() {
-  m_extendedMode = FALSE;
-  m_iWideNarrRatio = 3;
-}
-CBC_OnedCode39Writer::CBC_OnedCode39Writer(FX_BOOL extendedMode) {
-  m_iWideNarrRatio = 3;
-  m_extendedMode = extendedMode;
-}
-CBC_OnedCode39Writer::~CBC_OnedCode39Writer() {}
-FX_BOOL CBC_OnedCode39Writer::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  if (m_extendedMode) {
-    return CheckExtendedContentValidity(contents);
-  }
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
-        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') || ch == (FX_WCHAR)'-' ||
-        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
-        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
-        ch == (FX_WCHAR)'%') {
-      continue;
-    }
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_BOOL CBC_OnedCode39Writer::CheckExtendedContentValidity(
-    const CFX_WideStringC& contents) {
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if (ch > 127) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-CFX_WideString CBC_OnedCode39Writer::FilterContents(
-    const CFX_WideStringC& contents) {
-  if (m_extendedMode) {
-    return FilterExtendedContents(contents);
-  }
-  CFX_WideString filtercontents;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
-      continue;
-    }
-    if (ch > 175) {
-      i++;
-      continue;
-    } else {
-      ch = Upper(ch);
-    }
-    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
-        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') || ch == (FX_WCHAR)'-' ||
-        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
-        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
-        ch == (FX_WCHAR)'%') {
-      filtercontents += ch;
-    }
-  }
-  return filtercontents;
-}
-CFX_WideString CBC_OnedCode39Writer::FilterExtendedContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filtercontents;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
-      continue;
-    }
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if (ch > 127 && ch < 176) {
-      continue;
-    }
-    if (ch == 0) {
-      filtercontents += '%';
-      filtercontents += 'U';
-    } else if (ch >= 1 && ch <= 26) {
-      filtercontents += '$';
-      filtercontents += (ch + 64);
-    } else if (ch >= 27 && ch <= 31) {
-      filtercontents += '%';
-      filtercontents += (ch + 38);
-    } else if (ch >= 33 && ch <= 47 && ch != 45 && ch != 46) {
-      filtercontents += '/';
-      filtercontents += (ch + 32);
-    } else if (ch == 58) {
-      filtercontents += '/';
-      filtercontents += 'Z';
-    } else if (ch >= 59 && ch <= 63) {
-      filtercontents += '%';
-      filtercontents += ch + 11;
-    } else if (ch == 64) {
-      filtercontents += '%';
-      filtercontents += 'V';
-    } else if (ch >= 91 && ch <= 95) {
-      filtercontents += '%';
-      filtercontents += ch - 16;
-    } else if (ch == 96) {
-      filtercontents += '%';
-      filtercontents += 'W';
-    } else if (ch >= 97 && ch <= 122) {
-      filtercontents += '+';
-      filtercontents += ch - 32;
-    } else if (ch >= 123 && ch <= 126) {
-      filtercontents += '%';
-      filtercontents += ch - 43;
-    } else if (ch == 127) {
-      filtercontents += '%';
-      filtercontents += 'T';
-    } else {
-      filtercontents += ch;
-    }
-  }
-  return filtercontents;
-}
-CFX_WideString CBC_OnedCode39Writer::RenderTextContents(
-    const CFX_WideStringC& contents) {
-  if (m_extendedMode) {
-    return RenderExtendedTextContents(contents);
-  }
-  CFX_WideString renderContents;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
-      continue;
-    }
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') ||
-        (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') ||
-        (ch >= (FX_WCHAR)'a' && ch <= (FX_WCHAR)'z') || ch == (FX_WCHAR)'-' ||
-        ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' ||
-        ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' ||
-        ch == (FX_WCHAR)'%') {
-      renderContents += ch;
-    }
-  }
-  return renderContents;
-}
-CFX_WideString CBC_OnedCode39Writer::RenderExtendedTextContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString renderContents;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    FX_WCHAR ch = contents.GetAt(i);
-    if (ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1)) {
-      continue;
-    }
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if (ch > 127 && ch < 176) {
-      continue;
-    }
-    renderContents += ch;
-  }
-  return renderContents;
-}
-FX_BOOL CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) {
-  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
-    return FALSE;
-  }
-  m_locTextLoc = location;
-  return TRUE;
-}
-FX_BOOL CBC_OnedCode39Writer::SetWideNarrowRatio(int32_t ratio) {
-  if (ratio < 2 || ratio > 3) {
-    return FALSE;
-  }
-  m_iWideNarrRatio = ratio;
-  return TRUE;
-}
-uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
-                                      BCFORMAT format,
-                                      int32_t& outWidth,
-                                      int32_t& outHeight,
-                                      int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
-                                      BCFORMAT format,
-                                      int32_t& outWidth,
-                                      int32_t& outHeight,
-                                      int32_t hints,
-                                      int32_t& e) {
-  if (format != BCFORMAT_CODE_39) {
-    e = BCExceptionOnlyEncodeCODE_39;
-    return NULL;
-  }
-  uint8_t* ret =
-      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-void CBC_OnedCode39Writer::ToIntArray(int32_t a, int32_t* toReturn) {
-  for (int32_t i = 0; i < 9; i++) {
-    toReturn[i] = (a & (1 << i)) == 0 ? 1 : m_iWideNarrRatio;
-  }
-}
-FX_CHAR CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString& contents,
-                                           int32_t& e) {
-  int32_t length = contents.GetLength();
-  if (length > 80) {
-    e = BCExceptionContentsLengthShouldBetween1and80;
-    return '*';
-  }
-  int32_t checksum = 0;
-  int32_t len = (int32_t)strlen(CBC_OnedCode39Reader::ALPHABET_STRING);
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    int32_t j = 0;
-    for (; j < len; j++) {
-      if (CBC_OnedCode39Reader::ALPHABET_STRING[j] == contents[i]) {
-        if (contents[i] != '*') {
-          checksum += j;
-          break;
-        } else {
-          break;
-        }
-      }
-    }
-    if (j >= len) {
-      e = BCExceptionUnSupportedString;
-      return '*';
-    }
-  }
-  checksum = checksum % 43;
-  return CBC_OnedCode39Reader::CHECKSUM_STRING[checksum];
-}
-uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
-                                      int32_t& outlength,
-                                      int32_t& e) {
-  FX_CHAR checksum = CalcCheckSum(contents, e);
-  if (checksum == '*') {
-    return NULL;
-  }
-  int32_t widths[9] = {0};
-  int32_t wideStrideNum = 3;
-  int32_t narrStrideNum = 9 - wideStrideNum;
-  CFX_ByteString encodedContents = contents;
-  if (m_bCalcChecksum) {
-    encodedContents += checksum;
-  }
-  m_iContentLen = encodedContents.GetLength();
-  int32_t codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 +
-                      1 + m_iContentLen;
-  int32_t len = (int32_t)strlen(CBC_OnedCode39Reader::ALPHABET_STRING);
-  for (int32_t j = 0; j < m_iContentLen; j++) {
-    for (int32_t i = 0; i < len; i++) {
-      if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[j]) {
-        ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths);
-        for (int32_t k = 0; k < 9; k++) {
-          codeWidth += widths[k];
-        }
-      }
-    }
-  }
-  outlength = codeWidth;
-  uint8_t* result = FX_Alloc(uint8_t, codeWidth);
-  ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths);
-  int32_t pos = AppendPattern(result, 0, widths, 9, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  int32_t narrowWhite[] = {1};
-  pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  for (int32_t l = m_iContentLen - 1; l >= 0; l--) {
-    for (int32_t i = 0; i < len; i++) {
-      if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[l]) {
-        ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths);
-        pos += AppendPattern(result, pos, widths, 9, 1, e);
-        if (e != BCExceptionNO) {
-          FX_Free(result);
-          return NULL;
-        }
-      }
-    }
-    pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths);
-  pos += AppendPattern(result, pos, widths, 9, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  for (int32_t i = 0; i < codeWidth / 2; i++) {
-    result[i] ^= result[codeWidth - 1 - i];
-    result[codeWidth - 1 - i] ^= result[i];
-    result[i] ^= result[codeWidth - 1 - i];
-  }
-  return result;
-}
-CFX_WideString CBC_OnedCode39Writer::encodedContents(
-    const CFX_WideStringC& contents,
-    int32_t& e) {
-  CFX_WideString encodedContents = contents;
-  if (m_bCalcChecksum && m_bPrintChecksum) {
-    CFX_WideString checksumContent = FilterContents(contents);
-    CFX_ByteString str = checksumContent.UTF8Encode();
-    FX_CHAR checksum;
-    checksum = CalcCheckSum(str, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-    str += checksum;
-    encodedContents += checksum;
-  }
-  return encodedContents;
-}
-void CBC_OnedCode39Writer::RenderResult(const CFX_WideStringC& contents,
-                                        uint8_t* code,
-                                        int32_t codeLength,
-                                        FX_BOOL isDevice,
-                                        int32_t& e) {
-  CFX_WideString encodedCon = encodedContents(contents, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CBC_OneDimWriter::RenderResult(encodedCon, code, codeLength, isDevice, e);
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h
deleted file mode 100644
index d453b49..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
-
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
-class CBC_OnedCode39Writer : public CBC_OneDimWriter {
- public:
-  CBC_OnedCode39Writer();
-  CBC_OnedCode39Writer(FX_BOOL extendedMode);
-  virtual ~CBC_OnedCode39Writer();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e);
-  void RenderResult(const CFX_WideStringC& contents,
-                    uint8_t* code,
-                    int32_t codeLength,
-                    FX_BOOL isDevice,
-                    int32_t& e);
-  CFX_WideString encodedContents(const CFX_WideStringC& contents, int32_t& e);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  FX_BOOL CheckExtendedContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  CFX_WideString FilterExtendedContents(const CFX_WideStringC& contents);
-  CFX_WideString RenderTextContents(const CFX_WideStringC& contents);
-  CFX_WideString RenderExtendedTextContents(const CFX_WideStringC& contents);
-  FX_BOOL SetTextLocation(BC_TEXT_LOC loction);
-  FX_BOOL SetWideNarrowRatio(int32_t ratio);
-
- private:
-  void ToIntArray(int32_t a, int32_t* toReturn);
-  FX_CHAR CalcCheckSum(const CFX_ByteString& contents, int32_t& e);
-  int32_t m_iWideNarrRatio;
-  FX_BOOL m_extendedMode;
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp
deleted file mode 100644
index 1cb08cd..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = {
-    0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A};
-
-CBC_OnedEAN13Reader::CBC_OnedEAN13Reader() {}
-CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader() {}
-void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString& result,
-                                              int32_t lgPatternFound,
-                                              int32_t& e) {
-  for (int32_t d = 0; d < 10; d++) {
-    if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
-      result.Insert(0, (FX_CHAR)('0' + d));
-      return;
-    }
-  }
-  e = BCExceptionNotFound;
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-int32_t CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray* row,
-                                          CFX_Int32Array* startRange,
-                                          CFX_ByteString& resultString,
-                                          int32_t& e) {
-  CFX_Int32Array counters;
-  counters.Add(0);
-  counters.Add(0);
-  counters.Add(0);
-  counters.Add(0);
-  int32_t end = row->GetSize();
-  int32_t rowOffset = (*startRange)[1];
-  int32_t lgPatternFound = 0;
-  for (int32_t x = 0; x < 6 && rowOffset < end; x++) {
-    int32_t bestMatch =
-        DecodeDigit(row, &counters, rowOffset,
-                    &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    resultString += (FX_CHAR)('0' + bestMatch % 10);
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      rowOffset += counters[i];
-    }
-    if (bestMatch >= 10) {
-      lgPatternFound |= 1 << (5 - x);
-    }
-  }
-  DetermineFirstDigit(resultString, lgPatternFound, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  CFX_Int32Array result;
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);
-  CFX_Int32Array* middleRange =
-      FindGuardPattern(row, rowOffset, TRUE, &result, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  rowOffset = (*middleRange)[1];
-  delete middleRange;
-  for (int32_t Y = 0; Y < 6 && rowOffset < end; Y++) {
-    int32_t bestMatch =
-        DecodeDigit(row, &counters, rowOffset,
-                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    resultString += (FX_CHAR)('0' + bestMatch);
-    for (int32_t k = 0; k < counters.GetSize(); k++) {
-      rowOffset += counters[k];
-    }
-  }
-  return rowOffset;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h
deleted file mode 100644
index 795cc2f..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
-class CBC_OneDimReader;
-class CBC_CommonBitArray;
-class CBC_OnedEAN13Reader;
-class CBC_OnedEAN13Reader : public CBC_OneDimReader {
- public:
-  static const int32_t FIRST_DIGIT_ENCODINGS[10];
-  CBC_OnedEAN13Reader();
-  virtual ~CBC_OnedEAN13Reader();
-
- private:
-  void DetermineFirstDigit(CFX_ByteString& result,
-                           int32_t lgPatternFound,
-                           int32_t& e);
-
- protected:
-  int32_t DecodeMiddle(CBC_CommonBitArray* row,
-                       CFX_Int32Array* startRange,
-                       CFX_ByteString& resultString,
-                       int32_t& e);
-  friend class CBC_OnedUPCAReader;
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp
deleted file mode 100644
index 1a026da..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h"
-
-CBC_OnedEAN13Writer::CBC_OnedEAN13Writer() {
-  m_bLeftPadding = TRUE;
-  m_codeWidth = 3 + (7 * 6) + 5 + (7 * 6) + 3;
-}
-CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() {}
-FX_BOOL CBC_OnedEAN13Writer::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
-      continue;
-    } else {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-CFX_WideString CBC_OnedEAN13Writer::FilterContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filtercontents;
-  FX_WCHAR ch;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    ch = contents.GetAt(i);
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if (ch >= '0' && ch <= '9') {
-      filtercontents += ch;
-    }
-  }
-  return filtercontents;
-}
-int32_t CBC_OnedEAN13Writer::CalcChecksum(const CFX_ByteString& contents) {
-  int32_t odd = 0;
-  int32_t even = 0;
-  int32_t j = 1;
-  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
-    if (j % 2) {
-      odd += FXSYS_atoi(contents.Mid(i, 1));
-    } else {
-      even += FXSYS_atoi(contents.Mid(i, 1));
-    }
-    j++;
-  }
-  int32_t checksum = (odd * 3 + even) % 10;
-  checksum = (10 - checksum) % 10;
-  return (checksum);
-}
-uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
-                                     BCFORMAT format,
-                                     int32_t& outWidth,
-                                     int32_t& outHeight,
-                                     int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
-                                     BCFORMAT format,
-                                     int32_t& outWidth,
-                                     int32_t& outHeight,
-                                     int32_t hints,
-                                     int32_t& e) {
-  if (format != BCFORMAT_EAN_13) {
-    e = BCExceptionOnlyEncodeEAN_13;
-  }
-  uint8_t* ret =
-      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedEAN13Writer::Encode(const CFX_ByteString& contents,
-                                     int32_t& outLength,
-                                     int32_t& e) {
-  if (contents.GetLength() != 13) {
-    e = BCExceptionDigitLengthShould13;
-    return NULL;
-  }
-  m_iDataLenth = 13;
-  int32_t firstDigit = FXSYS_atoi(contents.Mid(0, 1));
-  int32_t parities = CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[firstDigit];
-  outLength = m_codeWidth;
-  uint8_t* result = FX_Alloc(uint8_t, m_codeWidth);
-  int32_t pos = 0;
-  pos +=
-      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  int32_t i = 0;
-  for (i = 1; i <= 6; i++) {
-    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
-    if ((parities >> (6 - i) & 1) == 1) {
-      digit += 10;
-    }
-    pos += AppendPattern(result, pos, CBC_OneDimReader::L_AND_G_PATTERNS[digit],
-                         4, 0, e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  for (i = 7; i <= 12; i++) {
-    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
-    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1,
-                         e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  pos +=
-      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  return result;
-}
-void CBC_OnedEAN13Writer::ShowChars(const CFX_WideStringC& contents,
-                                    CFX_DIBitmap* pOutBitmap,
-                                    CFX_RenderDevice* device,
-                                    const CFX_Matrix* matrix,
-                                    int32_t barWidth,
-                                    int32_t multiple,
-                                    int32_t& e) {
-  if (device == NULL && pOutBitmap == NULL) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  int32_t leftPadding = 7 * multiple;
-  int32_t leftPosition = 3 * multiple + leftPadding;
-  CFX_ByteString str = FX_UTF8Encode(contents);
-  int32_t iLen = str.GetLength();
-  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
-  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
-  CFX_FxgeDevice geBitmap;
-  if (pOutBitmap) {
-    geBitmap.Attach(pOutBitmap);
-  }
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  CFX_ByteString tempStr = str.Mid(1, 6);
-  int32_t strWidth = multiple * 42;
-  if (pOutBitmap == NULL) {
-    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect(
-        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
-    matr.Concat(*matrix);
-    matr.TransformRect(rect);
-    FX_RECT re = rect.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    CFX_FloatRect rect1(
-        (FX_FLOAT)(leftPosition + 47 * multiple),
-        (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)(leftPosition + 47 * multiple + strWidth - 0.5),
-        (FX_FLOAT)m_Height);
-    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    matr1.Concat(*matrix);
-    matr1.TransformRect(rect1);
-    re = rect1.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    int32_t strWidth1 = multiple * 7;
-    CFX_Matrix matr2(m_outputHScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
-    CFX_FloatRect rect2(0.0f, (FX_FLOAT)(m_Height - iTextHeight),
-                        (FX_FLOAT)strWidth1 - 0.5f, (FX_FLOAT)m_Height);
-    matr2.Concat(*matrix);
-    matr2.TransformRect(rect2);
-    re = rect2.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-  }
-  FX_FLOAT blank = 0.0;
-  iLen = tempStr.GetLength();
-  if (pOutBitmap == NULL) {
-    strWidth = (int32_t)(strWidth * m_outputHScale);
-  }
-  CalcTextInfo(tempStr, pCharPos + 1, m_pFont, (FX_FLOAT)strWidth, iFontSize,
-               blank);
-  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
-  CFX_FxgeDevice ge;
-  if (pOutBitmap) {
-    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
-    FX_RECT rect(0, 0, strWidth, iTextHeight);
-    ge.FillRect(&rect, m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 1, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
-                              (FX_FLOAT)leftPosition * m_outputHScale,
-                              (FX_FLOAT)(m_Height - iTextHeight) + iFontSize);
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 1, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(7, 6);
-  iLen = tempStr.GetLength();
-  CalcTextInfo(tempStr, pCharPos + 7, m_pFont, (FX_FLOAT)strWidth, iFontSize,
-               blank);
-  if (pOutBitmap) {
-    FX_RECT rect1(0, 0, strWidth, iTextHeight);
-    ge.FillRect(&rect1, m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 7, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 47 * multiple,
-                       m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(
-        1.0, 0.0, 0.0, -1.0,
-        (FX_FLOAT)(leftPosition + 47 * multiple) * m_outputHScale,
-        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 7, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(0, 1);
-  iLen = tempStr.GetLength();
-  strWidth = multiple * 7;
-  if (pOutBitmap == NULL) {
-    strWidth = (int32_t)(strWidth * m_outputHScale);
-  }
-  CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize,
-               blank);
-  if (pOutBitmap) {
-    delete ge.GetBitmap();
-    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0.0,
-                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  FX_Free(pCharPos);
-}
-void CBC_OnedEAN13Writer::RenderResult(const CFX_WideStringC& contents,
-                                       uint8_t* code,
-                                       int32_t codeLength,
-                                       FX_BOOL isDevice,
-                                       int32_t& e) {
-  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h
deleted file mode 100644
index 8fd4273..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
-
-class CBC_OneDimWriter;
-class CBC_OnedEAN13Writer;
-class CBC_OnedEAN13Writer : public CBC_OneDimWriter {
- private:
-  int32_t m_codeWidth;
-
- public:
-  CBC_OnedEAN13Writer();
-  virtual ~CBC_OnedEAN13Writer();
-
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e);
-  void RenderResult(const CFX_WideStringC& contents,
-                    uint8_t* code,
-                    int32_t codeLength,
-                    FX_BOOL isDevice,
-                    int32_t& e);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  int32_t CalcChecksum(const CFX_ByteString& contents);
-
- protected:
-  void ShowChars(const CFX_WideStringC& contents,
-                 CFX_DIBitmap* pOutBitmap,
-                 CFX_RenderDevice* device,
-                 const CFX_Matrix* matrix,
-                 int32_t barWidth,
-                 int32_t multiple,
-                 int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp
deleted file mode 100644
index 8d13d26..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() {}
-CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() {}
-int32_t CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray* row,
-                                         CFX_Int32Array* startRange,
-                                         CFX_ByteString& resultResult,
-                                         int32_t& e) {
-  CFX_Int32Array counters;
-  counters.Add(0);
-  counters.Add(0);
-  counters.Add(0);
-  counters.Add(0);
-  int32_t end = row->GetSize();
-  int32_t rowOffset = (*startRange)[1];
-  int32_t rowOffsetLeft = rowOffset;
-  for (int32_t x = 0; x < 4 && rowOffset < end; x++) {
-    int32_t bestMatch =
-        DecodeDigit(row, &counters, rowOffset,
-                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    resultResult += (FX_CHAR)('0' + bestMatch);
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      rowOffset += counters[i];
-    }
-  }
-  int32_t RowOffsetLen = (rowOffset - rowOffsetLeft) / 4;
-  CFX_Int32Array result;
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);
-  result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);
-  CFX_Int32Array* middleRange =
-      FindGuardPattern(row, rowOffset, TRUE, &result, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  int32_t rowOffsetMid = rowOffset;
-  rowOffset = (*middleRange)[1];
-  if ((rowOffset - rowOffsetMid) > RowOffsetLen) {
-    e = BCExceptionNotFound;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  delete middleRange;
-  for (int32_t y = 0; y < 4 && rowOffset < end; y++) {
-    int32_t bestMatch =
-        DecodeDigit(row, &counters, rowOffset,
-                    &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    resultResult += (FX_CHAR)('0' + bestMatch);
-    for (int32_t i = 0; i < counters.GetSize(); i++) {
-      rowOffset += counters[i];
-    }
-  }
-  return rowOffset;
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h
deleted file mode 100644
index b9f14d6..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
-
-class CBC_OneDimReader;
-class CBC_CommonBitArray;
-class CBC_OnedEAN8Reader;
-class CBC_OnedEAN8Reader : public CBC_OneDimReader {
- public:
-  CBC_OnedEAN8Reader();
-  virtual ~CBC_OnedEAN8Reader();
-
- protected:
-  int32_t DecodeMiddle(CBC_CommonBitArray*,
-                       CFX_Int32Array* startRange,
-                       CFX_ByteString& result,
-                       int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp
deleted file mode 100644
index 9981575..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h"
-
-CBC_OnedEAN8Writer::CBC_OnedEAN8Writer() {
-  m_iDataLenth = 8;
-  m_codeWidth = 3 + (7 * 4) + 5 + (7 * 4) + 3;
-}
-CBC_OnedEAN8Writer::~CBC_OnedEAN8Writer() {}
-void CBC_OnedEAN8Writer::SetDataLength(int32_t length) {
-  m_iDataLenth = 8;
-}
-FX_BOOL CBC_OnedEAN8Writer::SetTextLocation(BC_TEXT_LOC location) {
-  if (location == BC_TEXT_LOC_BELOWEMBED) {
-    m_locTextLoc = location;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CBC_OnedEAN8Writer::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
-      continue;
-    } else {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-CFX_WideString CBC_OnedEAN8Writer::FilterContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filtercontents;
-  FX_WCHAR ch;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    ch = contents.GetAt(i);
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if (ch >= '0' && ch <= '9') {
-      filtercontents += ch;
-    }
-  }
-  return filtercontents;
-}
-int32_t CBC_OnedEAN8Writer::CalcChecksum(const CFX_ByteString& contents) {
-  int32_t odd = 0;
-  int32_t even = 0;
-  int32_t j = 1;
-  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
-    if (j % 2) {
-      odd += FXSYS_atoi(contents.Mid(i, 1));
-    } else {
-      even += FXSYS_atoi(contents.Mid(i, 1));
-    }
-    j++;
-  }
-  int32_t checksum = (odd * 3 + even) % 10;
-  checksum = (10 - checksum) % 10;
-  return (checksum);
-}
-uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
-                                    BCFORMAT format,
-                                    int32_t& outWidth,
-                                    int32_t& outHeight,
-                                    int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
-                                    BCFORMAT format,
-                                    int32_t& outWidth,
-                                    int32_t& outHeight,
-                                    int32_t hints,
-                                    int32_t& e) {
-  if (format != BCFORMAT_EAN_8) {
-    e = BCExceptionOnlyEncodeEAN_8;
-    return NULL;
-  }
-  uint8_t* ret =
-      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedEAN8Writer::Encode(const CFX_ByteString& contents,
-                                    int32_t& outLength,
-                                    int32_t& e) {
-  if (contents.GetLength() != 8) {
-    e = BCExceptionDigitLengthMustBe8;
-    return NULL;
-  }
-  outLength = m_codeWidth;
-  uint8_t* result = FX_Alloc(uint8_t, m_codeWidth);
-  int32_t pos = 0;
-  pos +=
-      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  int32_t i = 0;
-  for (i = 0; i <= 3; i++) {
-    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
-    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 0,
-                         e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  for (i = 4; i <= 7; i++) {
-    int32_t digit = FXSYS_atoi(contents.Mid(i, 1));
-    pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1,
-                         e);
-    if (e != BCExceptionNO) {
-      FX_Free(result);
-      return NULL;
-    }
-  }
-  pos +=
-      AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e);
-  if (e != BCExceptionNO) {
-    FX_Free(result);
-    return NULL;
-  }
-  return result;
-}
-void CBC_OnedEAN8Writer::ShowChars(const CFX_WideStringC& contents,
-                                   CFX_DIBitmap* pOutBitmap,
-                                   CFX_RenderDevice* device,
-                                   const CFX_Matrix* matrix,
-                                   int32_t barWidth,
-                                   int32_t multiple,
-                                   int32_t& e) {
-  if (device == NULL && pOutBitmap == NULL) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  int32_t leftPosition = 3 * multiple;
-  CFX_ByteString str = FX_UTF8Encode(contents);
-  int32_t iLength = str.GetLength();
-  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLength);
-  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLength);
-  CFX_ByteString tempStr = str.Mid(0, 4);
-  int32_t iLen = tempStr.GetLength();
-  int32_t strWidth = 7 * multiple * 4;
-  FX_FLOAT blank = 0.0;
-  CFX_FxgeDevice geBitmap;
-  if (pOutBitmap) {
-    geBitmap.Attach(pOutBitmap);
-  }
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  if (pOutBitmap == NULL) {
-    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect(
-        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
-    matr.Concat(*matrix);
-    matr.TransformRect(rect);
-    FX_RECT re = rect.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect1(
-        (FX_FLOAT)(leftPosition + 33 * multiple),
-        (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)(leftPosition + 33 * multiple + strWidth - 0.5),
-        (FX_FLOAT)m_Height);
-    matr1.Concat(*matrix);
-    matr1.TransformRect(rect1);
-    re = rect1.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-  }
-  if (pOutBitmap == NULL) {
-    strWidth = (int32_t)(strWidth * m_outputHScale);
-  }
-  CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize,
-               blank);
-  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
-  CFX_FxgeDevice ge;
-  if (pOutBitmap) {
-    delete ge.GetBitmap();
-    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
-                              (FX_FLOAT)leftPosition * m_outputHScale,
-                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    affine_matrix1.Concat(*matrix);
-    device->DrawNormalText(iLen, pCharPos, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(4, 4);
-  iLen = tempStr.GetLength();
-  CalcTextInfo(tempStr, pCharPos + 4, m_pFont, (FX_FLOAT)strWidth, iFontSize,
-               blank);
-  if (pOutBitmap) {
-    delete ge.GetBitmap();
-    ge.Create(strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 4, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 33 * multiple,
-                       m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(
-        1.0, 0.0, 0.0, -1.0,
-        (FX_FLOAT)(leftPosition + 33 * multiple) * m_outputHScale,
-        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 4, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  FX_Free(pCharPos);
-}
-void CBC_OnedEAN8Writer::RenderResult(const CFX_WideStringC& contents,
-                                      uint8_t* code,
-                                      int32_t codeLength,
-                                      FX_BOOL isDevice,
-                                      int32_t& e) {
-  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h
deleted file mode 100644
index fd858fc..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
-
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
-class CBC_OnedEAN8Writer;
-class CBC_OnedEAN8Writer : public CBC_OneDimWriter {
- private:
-  int32_t m_codeWidth;
-
- public:
-  CBC_OnedEAN8Writer();
-  virtual ~CBC_OnedEAN8Writer();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e);
-  void RenderResult(const CFX_WideStringC& contents,
-                    uint8_t* code,
-                    int32_t codeLength,
-                    FX_BOOL isDevice,
-                    int32_t& e);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  void SetDataLength(int32_t length);
-  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  int32_t CalcChecksum(const CFX_ByteString& contents);
-
- protected:
-  void ShowChars(const CFX_WideStringC& contents,
-                 CFX_DIBitmap* pOutBitmap,
-                 CFX_RenderDevice* device,
-                 const CFX_Matrix* matrix,
-                 int32_t barWidth,
-                 int32_t multiple,
-                 int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp
deleted file mode 100644
index 416b08a..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_OnedUPCAReader::CBC_OnedUPCAReader() {
-  m_ean13Reader = NULL;
-}
-void CBC_OnedUPCAReader::Init() {
-  m_ean13Reader = new CBC_OnedEAN13Reader;
-}
-CBC_OnedUPCAReader::~CBC_OnedUPCAReader() {
-  delete m_ean13Reader;
-}
-CFX_ByteString CBC_OnedUPCAReader::DecodeRow(int32_t rowNumber,
-                                             CBC_CommonBitArray* row,
-                                             int32_t hints,
-                                             int32_t& e) {
-  CFX_ByteString bytestring =
-      m_ean13Reader->DecodeRow(rowNumber, row, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return temp;
-}
-CFX_ByteString CBC_OnedUPCAReader::DecodeRow(int32_t rowNumber,
-                                             CBC_CommonBitArray* row,
-                                             CFX_Int32Array* startGuardRange,
-                                             int32_t hints,
-                                             int32_t& e) {
-  CFX_ByteString bytestring =
-      m_ean13Reader->DecodeRow(rowNumber, row, startGuardRange, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return temp;
-}
-CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
-  CFX_ByteString bytestring = m_ean13Reader->Decode(image, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return temp;
-}
-CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap* image,
-                                          int32_t hints,
-                                          int32_t& e) {
-  CFX_ByteString bytestring = m_ean13Reader->Decode(image, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CFX_ByteString temp = MaybeReturnResult(bytestring, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return temp;
-}
-int32_t CBC_OnedUPCAReader::DecodeMiddle(CBC_CommonBitArray* row,
-                                         CFX_Int32Array* startRange,
-                                         CFX_ByteString& resultString,
-                                         int32_t& e) {
-  int32_t temp = m_ean13Reader->DecodeMiddle(row, startRange, resultString, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  return temp;
-}
-CFX_ByteString CBC_OnedUPCAReader::MaybeReturnResult(CFX_ByteString& result,
-                                                     int32_t& e) {
-  if (result[0] == '0') {
-    result.Delete(0);
-    return result;
-  } else {
-    e = BCExceptionFormatException;
-    return "";
-  }
-  return "";
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h
deleted file mode 100644
index 2b6bd17..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
-
-class CBC_BinaryBitmap;
-class CBC_CommonBitArray;
-class CBC_OneDimReader;
-class CBC_OnedEAN13Reader;
-class CBC_OnedUPCAReader;
-class CBC_OnedUPCAReader : public CBC_OneDimReader {
- private:
-  CBC_OnedEAN13Reader* m_ean13Reader;
-
- public:
-  CBC_OnedUPCAReader();
-  virtual ~CBC_OnedUPCAReader();
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           int32_t hints,
-                           int32_t& e);
-  CFX_ByteString DecodeRow(int32_t rowNumber,
-                           CBC_CommonBitArray* row,
-                           CFX_Int32Array* startGuardRange,
-                           int32_t hints,
-                           int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
-  virtual void Init();
-
- protected:
-  int32_t DecodeMiddle(CBC_CommonBitArray* row,
-                       CFX_Int32Array* startRange,
-                       CFX_ByteString& resultString,
-                       int32_t& e);
-  CFX_ByteString MaybeReturnResult(CFX_ByteString& result, int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp
deleted file mode 100644
index fe4a8e7..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2010 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h"
-#include "xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h"
-
-CBC_OnedUPCAWriter::CBC_OnedUPCAWriter() {
-  m_subWriter = NULL;
-  m_bLeftPadding = TRUE;
-  m_bRightPadding = TRUE;
-}
-void CBC_OnedUPCAWriter::Init() {
-  m_subWriter = new CBC_OnedEAN13Writer;
-}
-CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {
-  delete m_subWriter;
-}
-FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(
-    const CFX_WideStringC& contents) {
-  int32_t i = 0;
-  for (i = 0; i < contents.GetLength(); i++) {
-    if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {
-      continue;
-    } else {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-CFX_WideString CBC_OnedUPCAWriter::FilterContents(
-    const CFX_WideStringC& contents) {
-  CFX_WideString filtercontents;
-  FX_WCHAR ch;
-  for (int32_t i = 0; i < contents.GetLength(); i++) {
-    ch = contents.GetAt(i);
-    if (ch > 175) {
-      i++;
-      continue;
-    }
-    if (ch >= '0' && ch <= '9') {
-      filtercontents += ch;
-    }
-  }
-  return filtercontents;
-}
-int32_t CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString& contents) {
-  int32_t odd = 0;
-  int32_t even = 0;
-  int32_t j = 1;
-  for (int32_t i = contents.GetLength() - 1; i >= 0; i--) {
-    if (j % 2) {
-      odd += FXSYS_atoi(contents.Mid(i, 1));
-    } else {
-      even += FXSYS_atoi(contents.Mid(i, 1));
-    }
-    j++;
-  }
-  int32_t checksum = (odd * 3 + even) % 10;
-  checksum = (10 - checksum) % 10;
-  return (checksum);
-}
-uint8_t* CBC_OnedUPCAWriter::Encode(const CFX_ByteString& contents,
-                                    BCFORMAT format,
-                                    int32_t& outWidth,
-                                    int32_t& outHeight,
-                                    int32_t& e) {
-  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-uint8_t* CBC_OnedUPCAWriter::Encode(const CFX_ByteString& contents,
-                                    BCFORMAT format,
-                                    int32_t& outWidth,
-                                    int32_t& outHeight,
-                                    int32_t hints,
-                                    int32_t& e) {
-  if (format != BCFORMAT_UPC_A) {
-    e = BCExceptionOnlyEncodeUPC_A;
-    return NULL;
-  }
-  CFX_ByteString toEAN13String = '0' + contents;
-  m_iDataLenth = 13;
-  uint8_t* ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth,
-                                     outHeight, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return ret;
-}
-void CBC_OnedUPCAWriter::ShowChars(const CFX_WideStringC& contents,
-                                   CFX_DIBitmap* pOutBitmap,
-                                   CFX_RenderDevice* device,
-                                   const CFX_Matrix* matrix,
-                                   int32_t barWidth,
-                                   int32_t multiple,
-                                   int32_t& e) {
-  if (device == NULL && pOutBitmap == NULL) {
-    e = BCExceptionIllegalArgument;
-    return;
-  }
-  int32_t leftPadding = 7 * multiple;
-  int32_t leftPosition = 10 * multiple + leftPadding;
-  CFX_ByteString str = FX_UTF8Encode(contents);
-  int32_t iLen = str.GetLength();
-  FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);
-  FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);
-  CFX_ByteString tempStr = str.Mid(1, 5);
-  FX_FLOAT strWidth = (FX_FLOAT)35 * multiple;
-  FX_FLOAT blank = 0.0;
-  CFX_FxgeDevice geBitmap;
-  if (pOutBitmap) {
-    geBitmap.Attach(pOutBitmap);
-  }
-  iLen = tempStr.GetLength();
-  int32_t iFontSize = (int32_t)fabs(m_fFontSize);
-  int32_t iTextHeight = iFontSize + 1;
-  if (pOutBitmap == NULL) {
-    CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect(
-        (FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height);
-    matr.Concat(*matrix);
-    matr.TransformRect(rect);
-    FX_RECT re = rect.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect1(
-        (FX_FLOAT)(leftPosition + 40 * multiple),
-        (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5),
-        (FX_FLOAT)m_Height);
-    matr1.Concat(*matrix);
-    matr1.TransformRect(rect1);
-    re = rect1.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7;
-    CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight),
-                        (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height);
-    matr2.Concat(*matrix);
-    matr2.TransformRect(rect2);
-    re = rect2.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-    CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);
-    CFX_FloatRect rect3(
-        (FX_FLOAT)(leftPosition + 85 * multiple),
-        (FX_FLOAT)(m_Height - iTextHeight),
-        (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5),
-        (FX_FLOAT)m_Height);
-    matr3.Concat(*matrix);
-    matr3.TransformRect(rect3);
-    re = rect3.GetOutterRect();
-    device->FillRect(&re, m_backgroundColor);
-  }
-  if (pOutBitmap == NULL) {
-    strWidth = strWidth * m_outputHScale;
-  }
-  CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank);
-  CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);
-  CFX_FxgeDevice ge;
-  if (pOutBitmap) {
-    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 1, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0,
-                              (FX_FLOAT)leftPosition * m_outputHScale,
-                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 1, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(6, 5);
-  iLen = tempStr.GetLength();
-  CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank);
-  if (pOutBitmap) {
-    FX_RECT rect2(0, 0, (int)strWidth, iTextHeight);
-    ge.FillRect(&rect2, m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 6, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple,
-                       m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(
-        1.0, 0.0, 0.0, -1.0,
-        (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale,
-        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 6, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(0, 1);
-  iLen = tempStr.GetLength();
-  strWidth = (FX_FLOAT)multiple * 7;
-  if (pOutBitmap == NULL) {
-    strWidth = strWidth * m_outputHScale;
-  }
-  CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank);
-  if (pOutBitmap) {
-    delete ge.GetBitmap();
-    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0,
-                              (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  tempStr = str.Mid(11, 1);
-  iLen = tempStr.GetLength();
-  CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank);
-  if (pOutBitmap) {
-    delete ge.GetBitmap();
-    ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);
-    ge.GetBitmap()->Clear(m_backgroundColor);
-    ge.DrawNormalText(iLen, pCharPos + 11, m_pFont,
-                      CFX_GEModule::Get()->GetFontCache(), (FX_FLOAT)iFontSize,
-                      (CFX_Matrix*)&affine_matrix, m_fontColor,
-                      FXTEXT_CLEARTYPE);
-    geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple,
-                       m_Height - iTextHeight);
-  } else {
-    CFX_Matrix affine_matrix1(
-        1.0, 0.0, 0.0, -1.0,
-        (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale,
-        (FX_FLOAT)(m_Height - iTextHeight + iFontSize));
-    if (matrix) {
-      affine_matrix1.Concat(*matrix);
-    }
-    device->DrawNormalText(iLen, pCharPos + 11, m_pFont,
-                           CFX_GEModule::Get()->GetFontCache(),
-                           (FX_FLOAT)iFontSize, (CFX_Matrix*)&affine_matrix1,
-                           m_fontColor, FXTEXT_CLEARTYPE);
-  }
-  FX_Free(pCharPos);
-}
-void CBC_OnedUPCAWriter::RenderResult(const CFX_WideStringC& contents,
-                                      uint8_t* code,
-                                      int32_t codeLength,
-                                      FX_BOOL isDevice,
-                                      int32_t& e) {
-  CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);
-}
diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h
deleted file mode 100644
index 6146425..0000000
--- a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
-#define XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
-
-class CBC_OnedEAN13Writer;
-class CBC_OnedUPCAWriter;
-class CBC_OnedUPCAWriter : public CBC_OneDimWriter {
- private:
-  CBC_OnedEAN13Writer* m_subWriter;
-
- public:
-  CBC_OnedUPCAWriter();
-  virtual ~CBC_OnedUPCAWriter();
-  virtual void Init();
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  int32_t& outLength,
-                  int32_t& e) {
-    return nullptr;
-  }
-  void RenderResult(const CFX_WideStringC& contents,
-                    uint8_t* code,
-                    int32_t codeLength,
-                    FX_BOOL isDevice,
-                    int32_t& e);
-  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  int32_t CalcChecksum(const CFX_ByteString& contents);
-
- protected:
-  void ShowChars(const CFX_WideStringC& contents,
-                 CFX_DIBitmap* pOutBitmap,
-                 CFX_RenderDevice* device,
-                 const CFX_Matrix* matrix,
-                 int32_t barWidth,
-                 int32_t multiple,
-                 int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp
deleted file mode 100644
index c06f811..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp
+++ /dev/null
@@ -1,586 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-int32_t CBC_PDF417::START_PATTERN = 0x1fea8;
-int32_t CBC_PDF417::STOP_PATTERN = 0x3fa29;
-int32_t CBC_PDF417::CODEWORD_TABLE[][1000] = {
-    {0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, 0x1a8c0, 0x1d470,
-     0x1a860, 0x15040, 0x1a830, 0x15020, 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0,
-     0x1d678, 0x1eb3e, 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c,
-     0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, 0x1af7c, 0x15e78,
-     0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270,
-     0x1e93c, 0x1a460, 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418,
-     0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, 0x1d33c, 0x14c60,
-     0x1a638, 0x1d31e, 0x14c30, 0x1a61c, 0x14ee0, 0x1a778, 0x1d3be, 0x14e70,
-     0x1a73c, 0x14e38, 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0,
-     0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, 0x1a230, 0x1d11c,
-     0x14420, 0x1a218, 0x14410, 0x14408, 0x146c0, 0x1a370, 0x1d1bc, 0x14660,
-     0x1a338, 0x1d19e, 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc,
-     0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, 0x1e85e, 0x14240,
-     0x1a130, 0x1d09c, 0x14220, 0x1a118, 0x1d08e, 0x14210, 0x1a10c, 0x14208,
-     0x1a106, 0x14360, 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e,
-     0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, 0x1d05c, 0x14120,
-     0x1a098, 0x1d04e, 0x14110, 0x1a08c, 0x14108, 0x1a086, 0x14104, 0x141b0,
-     0x14198, 0x1418c, 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0,
-     0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, 0x1ca38, 0x1e51e,
-     0x12840, 0x19430, 0x12820, 0x196e0, 0x1cb78, 0x1e5be, 0x12cc0, 0x19670,
-     0x1cb3c, 0x12c60, 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe,
-     0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, 0x12f3c, 0x12fbe,
-     0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, 0x1ed38, 0x1f69e, 0x1b440, 0x1da30,
-     0x1ed1c, 0x1b420, 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970,
-     0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, 0x1db38, 0x1ed9e,
-     0x16c40, 0x12420, 0x19218, 0x1c90e, 0x16c20, 0x1b618, 0x16c10, 0x126c0,
-     0x19370, 0x1c9bc, 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738,
-     0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, 0x16f70, 0x12738,
-     0x1939e, 0x16f38, 0x1b79e, 0x16f1c, 0x127bc, 0x16fbc, 0x1279e, 0x16f9e,
-     0x1d960, 0x1ecb8, 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918,
-     0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, 0x1c8b8, 0x1e45e,
-     0x1b360, 0x19130, 0x1c89c, 0x16640, 0x12220, 0x1d99c, 0x1c88e, 0x16620,
-     0x12210, 0x1910c, 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8,
-     0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, 0x1918e, 0x16718,
-     0x1230c, 0x12306, 0x123b8, 0x191de, 0x167b8, 0x1239c, 0x1679c, 0x1238e,
-     0x1678e, 0x167de, 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e,
-     0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, 0x12140, 0x190b0,
-     0x1c85c, 0x16340, 0x12120, 0x19098, 0x1c84e, 0x16320, 0x1b198, 0x1d8ce,
-     0x16310, 0x12108, 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc,
-     0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, 0x12186, 0x16386,
-     0x163dc, 0x163ce, 0x1b0a0, 0x1d858, 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088,
-     0x1d846, 0x1b084, 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090,
-     0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, 0x16184, 0x12082,
-     0x120d8, 0x161d8, 0x161cc, 0x161c6, 0x1d82c, 0x1d826, 0x1b042, 0x1902c,
-     0x12048, 0x160c8, 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60,
-     0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, 0x11410, 0x11408,
-     0x116c0, 0x18b70, 0x1c5bc, 0x11660, 0x18b38, 0x1c59e, 0x11630, 0x18b1c,
-     0x11618, 0x1160c, 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc,
-     0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, 0x1e69c, 0x19a20,
-     0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, 0x19a08, 0x1cd06, 0x18960, 0x1c4b8,
-     0x1e25e, 0x19b60, 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e,
-     0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, 0x11360, 0x189b8,
-     0x1c4de, 0x13760, 0x11330, 0x1cdde, 0x13730, 0x19b9c, 0x1898e, 0x13718,
-     0x1130c, 0x1370c, 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e,
-     0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, 0x1ee98, 0x1f74e,
-     0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c,
-     0x1bb40, 0x19920, 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10,
-     0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, 0x188b0, 0x1c45c,
-     0x13340, 0x11120, 0x18898, 0x1c44e, 0x17740, 0x13320, 0x19998, 0x1ccce,
-     0x17720, 0x1bb98, 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708,
-     0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, 0x177b0, 0x13398,
-     0x199ce, 0x17798, 0x1bbce, 0x11186, 0x13386, 0x111dc, 0x133dc, 0x111ce,
-     0x177dc, 0x133ce, 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88,
-     0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, 0x1b9a0, 0x19890,
-     0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, 0x1b988, 0x19884, 0x1b984, 0x19882,
-     0x1b982, 0x110a0, 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0,
-     0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, 0x17388, 0x13184,
-     0x11082, 0x13182, 0x110d8, 0x1886e, 0x131d8, 0x110cc, 0x173d8, 0x131cc,
-     0x110c6, 0x173cc, 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48,
-     0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, 0x19848, 0x1cc26,
-     0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, 0x1b8c2, 0x11050, 0x1882c, 0x130d0,
-     0x11048, 0x18826, 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042,
-     0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, 0x1ee16, 0x1dc22,
-     0x1cc16, 0x19824, 0x19822, 0x11028, 0x13068, 0x170e8, 0x11022, 0x13062,
-     0x18560, 0x10a40, 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c,
-     0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, 0x1859c, 0x10b18,
-     0x1858e, 0x10b0c, 0x10b06, 0x10bb8, 0x185de, 0x10b9c, 0x10b8e, 0x10bde,
-     0x18d40, 0x1c6b0, 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08,
-     0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, 0x10920, 0x1c6dc,
-     0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, 0x11b10, 0x10908, 0x18486, 0x11b08,
-     0x18d86, 0x10902, 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98,
-     0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, 0x11bce, 0x1cea0,
-     0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82,
-     0x18ca0, 0x1c658, 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646,
-     0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, 0x18458, 0x119a0,
-     0x10890, 0x1c66e, 0x13ba0, 0x11990, 0x18ccc, 0x18446, 0x13b90, 0x19dcc,
-     0x10884, 0x13b88, 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8,
-     0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, 0x108ee, 0x119ee,
-     0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50,
-     0x1e72c, 0x1ded0, 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42,
-     0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, 0x1bdd0, 0x19cc8,
-     0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850,
-     0x1842c, 0x118d0, 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0,
-     0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, 0x17bc4, 0x1086c,
-     0x118ec, 0x10866, 0x139ec, 0x118e6, 0x17bec, 0x139e6, 0x17be6, 0x1ef28,
-     0x1f796, 0x1ef24, 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64,
-     0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, 0x1bce8, 0x19c64,
-     0x18c22, 0x1bce4, 0x19c62, 0x1bce2, 0x10828, 0x18416, 0x11868, 0x18c36,
-     0x138e8, 0x11864, 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2,
-     0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, 0x19c34, 0x1bc74,
-     0x1bc72, 0x11834, 0x13874, 0x178f4, 0x178f2, 0x10540, 0x10520, 0x18298,
-     0x10510, 0x10508, 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc,
-     0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, 0x18684, 0x18682,
-     0x104a0, 0x18258, 0x10da0, 0x186d8, 0x1824c, 0x10d90, 0x186cc, 0x10d88,
-     0x186c6, 0x10d84, 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee,
-     0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, 0x1c748, 0x1c744,
-     0x1c742, 0x18650, 0x18ed0, 0x1c76c, 0x1c326, 0x18ec8, 0x1c766, 0x18ec4,
-     0x18642, 0x18ec2, 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8,
-     0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, 0x1046c, 0x10cec,
-     0x10466, 0x11dec, 0x10ce6, 0x11de6, 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728,
-     0x1cf68, 0x1e7b6, 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68,
-     0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, 0x19ee2, 0x10428,
-     0x18216, 0x10c68, 0x18636, 0x11ce8, 0x10c64, 0x10422, 0x13de8, 0x11ce4,
-     0x10c62, 0x13de4, 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4,
-     0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, 0x1cf34, 0x1c712,
-     0x1df74, 0x1cf32, 0x1df72, 0x18614, 0x18e34, 0x18612, 0x19e74, 0x18e32,
-     0x1bef4},
-    {0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, 0x1f518, 0x1fa8e,
-     0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade,
-     0x1d640, 0x1eb30, 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c,
-     0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, 0x1ae40, 0x1d730,
-     0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706,
-     0x1ae04, 0x1af60, 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20,
-     0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, 0x15f60, 0x1afb8,
-     0x1d7de, 0x15f30, 0x1af9c, 0x15f18, 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde,
-     0x15f9c, 0x15f8e, 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e,
-     0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, 0x1d340, 0x1e9b0,
-     0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, 0x1d310, 0x1e98c, 0x1d308, 0x1e986,
-     0x1d304, 0x1d302, 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce,
-     0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, 0x14f40, 0x1a7b0,
-     0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, 0x14f10, 0x1a78c, 0x14f08, 0x1a786,
-     0x14f04, 0x14fb0, 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc,
-     0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, 0x1e888, 0x1f446,
-     0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188,
-     0x1e8c6, 0x1d184, 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc,
-     0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, 0x1d1ee, 0x14790,
-     0x1a3cc, 0x14788, 0x1a3c6, 0x14784, 0x14782, 0x147d8, 0x1a3ee, 0x147cc,
-     0x147c6, 0x147ee, 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842,
-     0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, 0x1a1d0, 0x1d0ec,
-     0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6,
-     0x143c4, 0x143c2, 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822,
-     0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, 0x1a0e4, 0x1a0e2,
-     0x141e8, 0x1a0f6, 0x141e4, 0x141e2, 0x1e814, 0x1e812, 0x1d034, 0x1d032,
-     0x1a074, 0x1a072, 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e,
-     0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, 0x1cb40, 0x1e5b0,
-     0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586,
-     0x1cb04, 0x1cb02, 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce,
-     0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, 0x12f40, 0x197b0,
-     0x1cbdc, 0x12f20, 0x19798, 0x1cbce, 0x12f10, 0x1978c, 0x12f08, 0x19786,
-     0x12f04, 0x12fb0, 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc,
-     0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, 0x169f8, 0x1f688,
-     0x1fb46, 0x168fc, 0x1f684, 0x1f682, 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0,
-     0x1e490, 0x1fb6e, 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84,
-     0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, 0x1c990, 0x1e4cc,
-     0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, 0x1c984, 0x1db84, 0x1c982, 0x1db82,
-     0x193a0, 0x1c9d8, 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc,
-     0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, 0x127a0, 0x193d8,
-     0x1c9ee, 0x16fa0, 0x12790, 0x193cc, 0x16f90, 0x1b7cc, 0x193c6, 0x16f88,
-     0x12784, 0x16f84, 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc,
-     0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, 0x1f648, 0x1fb26,
-     0x164fc, 0x1f644, 0x1647e, 0x1f642, 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448,
-     0x1f226, 0x1ecc8, 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c,
-     0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, 0x1c8c2, 0x1d9c2,
-     0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4,
-     0x191c2, 0x1b3c2, 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8,
-     0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, 0x123e6, 0x167e6,
-     0x1f628, 0x1fb16, 0x162fc, 0x1f624, 0x1627e, 0x1f622, 0x1e428, 0x1f216,
-     0x1ec68, 0x1f636, 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8,
-     0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, 0x1b1e8, 0x1d8f6,
-     0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, 0x190f6, 0x163e8, 0x121e4, 0x163e4,
-     0x121e2, 0x163e2, 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414,
-     0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, 0x1d872, 0x19074,
-     0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, 0x161f4, 0x120f2, 0x161f2, 0x1f60a,
-     0x1e40a, 0x1ec1a, 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158,
-     0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, 0x1e282, 0x1c5a0,
-     0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, 0x1c588, 0x1e2c6, 0x1c584, 0x1c582,
-     0x18ba0, 0x1c5d8, 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84,
-     0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, 0x11788, 0x18bc6,
-     0x11784, 0x11782, 0x117d8, 0x18bee, 0x117cc, 0x117c6, 0x117ee, 0x1f350,
-     0x1f9ac, 0x135f8, 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342,
-     0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, 0x1f366, 0x1e6c4,
-     0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8,
-     0x1e6e6, 0x1cdc4, 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8,
-     0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, 0x113d0, 0x189ec,
-     0x137d0, 0x113c8, 0x189e6, 0x137c8, 0x19be6, 0x137c4, 0x113c2, 0x137c2,
-     0x113ec, 0x137ec, 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4,
-     0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, 0x1f996, 0x132fc,
-     0x1f768, 0x1fbb6, 0x176fc, 0x1327e, 0x1f764, 0x1f322, 0x1767e, 0x1f762,
-     0x1e228, 0x1f116, 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4,
-     0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, 0x1dde8, 0x1cce4,
-     0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, 0x188e8, 0x1c476, 0x199e8, 0x188e4,
-     0x1bbe8, 0x199e4, 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6,
-     0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, 0x133e2, 0x177e2,
-     0x111f6, 0x133f6, 0x1fb94, 0x172f8, 0x1b97e, 0x1fb92, 0x1727c, 0x1723e,
-     0x1f314, 0x1317e, 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634,
-     0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, 0x1c432, 0x1dcf4,
-     0x1cc72, 0x1dcf2, 0x18874, 0x198f4, 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2,
-     0x110f4, 0x131f4, 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c,
-     0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, 0x1c41a, 0x1cc3a,
-     0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, 0x1107a, 0x130fa, 0x171fa, 0x170be,
-     0x1e150, 0x1f0ac, 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c,
-     0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, 0x185c8, 0x1c2e6,
-     0x185c4, 0x185c2, 0x10bd0, 0x185ec, 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2,
-     0x10bec, 0x10be6, 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2,
-     0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, 0x1e362, 0x1c268,
-     0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, 0x1c262, 0x1c6e2, 0x184e8, 0x1c276,
-     0x18de8, 0x184e4, 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8,
-     0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, 0x1f9d4, 0x13af8,
-     0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, 0x1f194, 0x1197e, 0x1f3b4, 0x1f192,
-     0x13b7e, 0x1f3b2, 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772,
-     0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, 0x18474, 0x18cf4,
-     0x18472, 0x19df4, 0x18cf2, 0x19df2, 0x108f4, 0x119f4, 0x108f2, 0x13bf4,
-     0x119f2, 0x13bf2, 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e,
-     0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, 0x1f18a, 0x1f39a,
-     0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a,
-     0x1defa, 0x1843a, 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa,
-     0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, 0x178bc, 0x1789e,
-     0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, 0x1c168, 0x1e0b6, 0x1c164, 0x1c162,
-     0x182e8, 0x1c176, 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2,
-     0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, 0x1e092, 0x1e1b2,
-     0x1c134, 0x1c374, 0x1c132, 0x1c372, 0x18274, 0x186f4, 0x18272, 0x186f2,
-     0x104f4, 0x10df4, 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca,
-     0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, 0x1c77a, 0x1823a,
-     0x1867a, 0x18efa, 0x1047a, 0x10cfa, 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c,
-     0x13d1e, 0x11cbe, 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c,
-     0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, 0x1be5e, 0x17c9c,
-     0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2,
-     0x18174, 0x18172, 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a,
-     0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, 0x13eb8, 0x19f5e,
-     0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e,
-     0x17e8c, 0x17e86, 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e,
-     0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, 0x10f5e, 0x11f5c,
-     0x11f4e, 0x13f58, 0x19fae, 0x13f4c, 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c,
-     0x13f26},
-    {0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, 0x1a8f8, 0x1d47e,
-     0x150f0, 0x1a87c, 0x15078, 0x1fad0, 0x15be0, 0x1adf8, 0x1fac8, 0x159f0,
-     0x1acfc, 0x1fac4, 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec,
-     0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, 0x1f5c2, 0x1ebd0,
-     0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8,
-     0x1ebe6, 0x1d7c4, 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4,
-     0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, 0x148f0, 0x1a47c,
-     0x14878, 0x1a43e, 0x1483c, 0x1fa68, 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8,
-     0x1a67e, 0x1fa62, 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4,
-     0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, 0x1d3e8, 0x1e9f6,
-     0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8,
-     0x1d17e, 0x144f0, 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34,
-     0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, 0x1477e, 0x1f472,
-     0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c,
-     0x14278, 0x1a13e, 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a,
-     0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, 0x141be, 0x140bc,
-     0x1409e, 0x12bc0, 0x195f0, 0x1cafc, 0x129e0, 0x194f8, 0x1ca7e, 0x128f0,
-     0x1947c, 0x12878, 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964,
-     0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, 0x1f976, 0x12efc,
-     0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8,
-     0x1e5f6, 0x1cbe4, 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0,
-     0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, 0x1b478, 0x1da3e,
-     0x16870, 0x1b43c, 0x16838, 0x1b41e, 0x1681c, 0x125e0, 0x192f8, 0x1c97e,
-     0x16de0, 0x124f0, 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c,
-     0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, 0x1fb74, 0x1f932,
-     0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, 0x1263e, 0x16e3e, 0x1f274, 0x1277e,
-     0x1f6f4, 0x1f272, 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2,
-     0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, 0x165c0, 0x1b2f0,
-     0x1d97c, 0x164e0, 0x1b278, 0x1d93e, 0x16470, 0x1b23c, 0x16438, 0x1b21e,
-     0x1641c, 0x1640e, 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678,
-     0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, 0x1fb3a, 0x1677c,
-     0x1233e, 0x1673e, 0x1f23a, 0x1f67a, 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa,
-     0x191fa, 0x162e0, 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e,
-     0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, 0x1633c, 0x1211e,
-     0x1631e, 0x121be, 0x163be, 0x16170, 0x1b0bc, 0x16138, 0x1b09e, 0x1611c,
-     0x1610e, 0x120bc, 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c,
-     0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, 0x18af8, 0x1c57e,
-     0x114f0, 0x18a7c, 0x11478, 0x18a3e, 0x1143c, 0x1141e, 0x1f8b4, 0x116f8,
-     0x18b7e, 0x1f8b2, 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4,
-     0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, 0x19af0, 0x1cd7c,
-     0x134e0, 0x19a78, 0x1cd3e, 0x13470, 0x19a3c, 0x13438, 0x19a1e, 0x1341c,
-     0x1340e, 0x112f0, 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e,
-     0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, 0x1377c, 0x1133e,
-     0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa,
-     0x1bae0, 0x1dd78, 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38,
-     0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, 0x132e0, 0x19978,
-     0x1ccbe, 0x176e0, 0x13270, 0x1993c, 0x17670, 0x1bb3c, 0x1991e, 0x17638,
-     0x1321c, 0x1761c, 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c,
-     0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, 0x111be, 0x133be,
-     0x177be, 0x172c0, 0x1b970, 0x1dcbc, 0x17260, 0x1b938, 0x1dc9e, 0x17230,
-     0x1b91c, 0x17218, 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370,
-     0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, 0x1730e, 0x110bc,
-     0x131bc, 0x1109e, 0x173bc, 0x1319e, 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e,
-     0x17130, 0x1b89c, 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e,
-     0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, 0x130de, 0x171de,
-     0x170b0, 0x1b85c, 0x17098, 0x1b84e, 0x1708c, 0x17086, 0x1305c, 0x170dc,
-     0x1304e, 0x170ce, 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e,
-     0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, 0x10a3c, 0x10a1e,
-     0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78,
-     0x1c6be, 0x11a70, 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978,
-     0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, 0x109be, 0x11bbe,
-     0x13ac0, 0x19d70, 0x1cebc, 0x13a60, 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c,
-     0x13a18, 0x19d0e, 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938,
-     0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, 0x108bc, 0x119bc,
-     0x1089e, 0x13bbc, 0x1199e, 0x13b9e, 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40,
-     0x1bd30, 0x1de9c, 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08,
-     0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, 0x13930, 0x19c9c,
-     0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, 0x1390c, 0x17b0c, 0x13906, 0x17b06,
-     0x118b8, 0x18c5e, 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c,
-     0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, 0x17940, 0x1bcb0,
-     0x1de5c, 0x17920, 0x1bc98, 0x1de4e, 0x17910, 0x1bc8c, 0x17908, 0x1bc86,
-     0x17904, 0x17902, 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998,
-     0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, 0x1184e, 0x179dc,
-     0x138ce, 0x179ce, 0x178a0, 0x1bc58, 0x1de2e, 0x17890, 0x1bc4c, 0x17888,
-     0x1bc46, 0x17884, 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc,
-     0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, 0x1bc2c, 0x17848,
-     0x1bc26, 0x17844, 0x17842, 0x1382c, 0x1786c, 0x13826, 0x17866, 0x17828,
-     0x1bc16, 0x17824, 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c,
-     0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, 0x10d1c, 0x10d0e,
-     0x104bc, 0x10dbc, 0x1049e, 0x10d9e, 0x11d60, 0x18eb8, 0x1c75e, 0x11d30,
-     0x18e9c, 0x11d18, 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8,
-     0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, 0x11dde, 0x13d40,
-     0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08,
-     0x19e86, 0x13d04, 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e,
-     0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, 0x11cdc, 0x10c4e,
-     0x13ddc, 0x11cce, 0x13dce, 0x1bea0, 0x1df58, 0x1efae, 0x1be90, 0x1df4c,
-     0x1be88, 0x1df46, 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0,
-     0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, 0x13c84, 0x17d84,
-     0x13c82, 0x17d82, 0x11c58, 0x18e2e, 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc,
-     0x11c46, 0x17dcc, 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee,
-     0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, 0x13c50, 0x19e2c,
-     0x17cd0, 0x13c48, 0x19e26, 0x17cc8, 0x1be66, 0x17cc4, 0x13c42, 0x17cc2,
-     0x11c2c, 0x13c6c, 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16,
-     0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, 0x17c64, 0x13c22,
-     0x17c62, 0x11c16, 0x13c36, 0x17c76, 0x1be14, 0x1be12, 0x13c14, 0x17c34,
-     0x13c12, 0x17c32, 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e,
-     0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, 0x10e8c, 0x10e86,
-     0x1065c, 0x10edc, 0x1064e, 0x10ece, 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90,
-     0x18f4c, 0x11e88, 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8,
-     0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, 0x11eee, 0x19f50,
-     0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, 0x19f42, 0x11e50, 0x18f2c, 0x13ed0,
-     0x19f6c, 0x18f26, 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c,
-     0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, 0x1efd6, 0x1dfa4,
-     0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, 0x19f24, 0x1bf64, 0x19f22, 0x1bf62,
-     0x11e28, 0x18f16, 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4,
-     0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, 0x1df94, 0x1df92,
-     0x19f14, 0x1bf34, 0x19f12, 0x1bf32, 0x11e14, 0x13e34, 0x11e12, 0x17e74,
-     0x13e32, 0x17e72, 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a,
-     0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, 0x1032e, 0x1076e,
-     0x10f50, 0x187ac, 0x10f48, 0x187a6, 0x10f44, 0x10f42, 0x1072c, 0x10f6c,
-     0x10726, 0x10f66, 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796,
-     0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, 0x10f36, 0x11f76,
-     0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, 0x18f92, 0x19fb2, 0x10f14, 0x11f34,
-     0x10f12, 0x13f74, 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a,
-     0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, 0x107a4, 0x107a2,
-     0x10396, 0x107b6, 0x187d4, 0x187d2, 0x10794, 0x10fb4, 0x10792, 0x10fb2,
-     0x1c7ea}};
-FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f;
-FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f;
-FX_FLOAT CBC_PDF417::HEIGHT = 2.0f;
-CBC_PDF417::CBC_PDF417() {
-  m_compact = FALSE;
-  m_compaction = AUTO;
-  m_minCols = 1;
-  m_maxCols = 30;
-  m_maxRows = 90;
-  m_minRows = 3;
-  m_barcodeMatrix = NULL;
-}
-CBC_PDF417::CBC_PDF417(FX_BOOL compact) {
-  m_compact = compact;
-  m_compaction = AUTO;
-  m_minCols = 1;
-  m_maxCols = 30;
-  m_maxRows = 90;
-  m_minRows = 3;
-  m_barcodeMatrix = NULL;
-}
-CBC_PDF417::~CBC_PDF417() {
-  if (m_barcodeMatrix) {
-    delete m_barcodeMatrix;
-  }
-}
-CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() {
-  return m_barcodeMatrix;
-}
-void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg,
-                                      int32_t errorCorrectionLevel,
-                                      int32_t& e) {
-  int32_t errorCorrectionCodeWords =
-      CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
-          errorCorrectionLevel, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CFX_WideString highLevel =
-      CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t sourceCodeWords = highLevel.GetLength();
-  CFX_Int32Array* dimension =
-      determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t cols = dimension->GetAt(0);
-  int32_t rows = dimension->GetAt(1);
-  delete dimension;
-  int32_t pad = getNumberOfPadCodewords(sourceCodeWords,
-                                        errorCorrectionCodeWords, cols, rows);
-  if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) {
-    e = BCExceptionEncodedMessageContainsTooManyCodeWords;
-    return;
-  }
-  int32_t n = sourceCodeWords + pad + 1;
-  CFX_WideString sb;
-  sb += (FX_WCHAR)n;
-  sb += highLevel;
-  for (int32_t i = 0; i < pad; i++) {
-    sb += (FX_WCHAR)900;
-  }
-  CFX_WideString dataCodewords(sb);
-  CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(
-      dataCodewords, errorCorrectionLevel, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CFX_WideString fullCodewords = dataCodewords + ec;
-  m_barcodeMatrix = new CBC_BarcodeMatrix(rows, cols);
-  encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel,
-                 m_barcodeMatrix);
-}
-void CBC_PDF417::setDimensions(int32_t maxCols,
-                               int32_t minCols,
-                               int32_t maxRows,
-                               int32_t minRows) {
-  m_maxCols = maxCols;
-  m_minCols = minCols;
-  m_maxRows = maxRows;
-  m_minRows = minRows;
-}
-void CBC_PDF417::setCompaction(Compaction compaction) {
-  m_compaction = compaction;
-}
-void CBC_PDF417::setCompact(FX_BOOL compact) {
-  m_compact = compact;
-}
-int32_t CBC_PDF417::calculateNumberOfRows(int32_t m, int32_t k, int32_t c) {
-  int32_t r = ((m + 1 + k) / c) + 1;
-  if (c * r >= (m + 1 + k + c)) {
-    r--;
-  }
-  return r;
-}
-int32_t CBC_PDF417::getNumberOfPadCodewords(int32_t m,
-                                            int32_t k,
-                                            int32_t c,
-                                            int32_t r) {
-  int32_t n = c * r - k;
-  return n > m + 1 ? n - m - 1 : 0;
-}
-void CBC_PDF417::encodeChar(int32_t pattern,
-                            int32_t len,
-                            CBC_BarcodeRow* logic) {
-  int32_t map = 1 << (len - 1);
-  FX_BOOL last = ((pattern & map) != 0);
-  int32_t width = 0;
-  for (int32_t i = 0; i < len; i++) {
-    FX_BOOL black = ((pattern & map) != 0);
-    if (last == black) {
-      width++;
-    } else {
-      logic->addBar(last, width);
-      last = black;
-      width = 1;
-    }
-    map >>= 1;
-  }
-  logic->addBar(last, width);
-}
-void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords,
-                                int32_t c,
-                                int32_t r,
-                                int32_t errorCorrectionLevel,
-                                CBC_BarcodeMatrix* logic) {
-  int32_t idx = 0;
-  for (int32_t y = 0; y < r; y++) {
-    int32_t cluster = y % 3;
-    logic->startRow();
-    encodeChar(START_PATTERN, 17, logic->getCurrentRow());
-    int32_t left;
-    int32_t right;
-    if (cluster == 0) {
-      left = (30 * (y / 3)) + ((r - 1) / 3);
-      right = (30 * (y / 3)) + (c - 1);
-    } else if (cluster == 1) {
-      left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);
-      right = (30 * (y / 3)) + ((r - 1) / 3);
-    } else {
-      left = (30 * (y / 3)) + (c - 1);
-      right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3);
-    }
-    int32_t pattern = CODEWORD_TABLE[cluster][left];
-    encodeChar(pattern, 17, logic->getCurrentRow());
-    for (int32_t x = 0; x < c; x++) {
-      pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)];
-      encodeChar(pattern, 17, logic->getCurrentRow());
-      idx++;
-    }
-    if (m_compact) {
-      encodeChar(STOP_PATTERN, 1, logic->getCurrentRow());
-    } else {
-      pattern = CODEWORD_TABLE[cluster][right];
-      encodeChar(pattern, 17, logic->getCurrentRow());
-      encodeChar(STOP_PATTERN, 18, logic->getCurrentRow());
-    }
-  }
-}
-CFX_Int32Array* CBC_PDF417::determineDimensions(
-    int32_t sourceCodeWords,
-    int32_t errorCorrectionCodeWords,
-    int32_t& e) {
-  FX_FLOAT ratio = 0.0f;
-  CFX_Int32Array* dimension = NULL;
-  for (int32_t cols = m_minCols; cols <= m_maxCols; cols++) {
-    int32_t rows =
-        calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);
-    if (rows < m_minRows) {
-      break;
-    }
-    if (rows > m_maxRows) {
-      continue;
-    }
-    FX_FLOAT newRatio =
-        ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT);
-    if (dimension &&
-        fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) {
-      continue;
-    }
-    ratio = newRatio;
-    if (dimension) {
-      delete dimension;
-    }
-    dimension = new CFX_Int32Array;
-    dimension->Add(cols);
-    dimension->Add(rows);
-  }
-  if (dimension == NULL) {
-    int32_t rows = calculateNumberOfRows(sourceCodeWords,
-                                         errorCorrectionCodeWords, m_minCols);
-    if (rows < m_minRows) {
-      dimension = new CFX_Int32Array;
-      dimension->Add(m_minCols);
-      dimension->Add(m_minRows);
-    } else if (rows >= 3 && rows <= 90) {
-      dimension = new CFX_Int32Array;
-      dimension->Add(m_minCols);
-      dimension->Add(rows);
-    }
-  }
-  if (dimension == NULL) {
-    e = BCExceptionUnableToFitMessageInColumns;
-    return NULL;
-  }
-  return dimension;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417.h b/xfa/src/fxbarcode/pdf417/BC_PDF417.h
deleted file mode 100644
index a7a4649..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-
-class CBC_BarcodeRow;
-class CBC_BarcodeMatrix;
-
-class CBC_PDF417 {
- public:
-  CBC_PDF417();
-  CBC_PDF417(FX_BOOL compact);
-  virtual ~CBC_PDF417();
-  CBC_BarcodeMatrix* getBarcodeMatrix();
-  void generateBarcodeLogic(CFX_WideString msg,
-                            int32_t errorCorrectionLevel,
-                            int32_t& e);
-  void setDimensions(int32_t maxCols,
-                     int32_t minCols,
-                     int32_t maxRows,
-                     int32_t minRows);
-  void setCompaction(Compaction compaction);
-  void setCompact(FX_BOOL compact);
-
- private:
-  static int32_t START_PATTERN;
-  static int32_t STOP_PATTERN;
-  static int32_t CODEWORD_TABLE[][1000];
-  static FX_FLOAT PREFERRED_RATIO;
-  static FX_FLOAT DEFAULT_MODULE_WIDTH;
-  static FX_FLOAT HEIGHT;
-  CBC_BarcodeMatrix* m_barcodeMatrix;
-  FX_BOOL m_compact;
-  Compaction m_compaction;
-  int32_t m_minCols;
-  int32_t m_maxCols;
-  int32_t m_maxRows;
-  int32_t m_minRows;
-
- private:
-  static int32_t calculateNumberOfRows(int32_t m, int32_t k, int32_t c);
-  static int32_t getNumberOfPadCodewords(int32_t m,
-                                         int32_t k,
-                                         int32_t c,
-                                         int32_t r);
-  static void encodeChar(int32_t pattern, int32_t len, CBC_BarcodeRow* logic);
-  void encodeLowLevel(CFX_WideString fullCodewords,
-                      int32_t c,
-                      int32_t r,
-                      int32_t errorCorrectionLevel,
-                      CBC_BarcodeMatrix* logic);
-  CFX_Int32Array* determineDimensions(int32_t sourceCodeWords,
-                                      int32_t errorCorrectionCodeWords,
-                                      int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
deleted file mode 100644
index fbc252e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
-
-CBC_BarcodeMatrix::CBC_BarcodeMatrix(int32_t height, int32_t width) {
-  m_matrix.SetSize(height + 2);
-  for (int32_t i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength;
-       i++) {
-    m_matrix[i] = new CBC_BarcodeRow((width + 4) * 17 + 1);
-  }
-  m_width = width * 17;
-  m_height = height + 2;
-  m_currentRow = 0;
-  m_outHeight = 0;
-  m_outWidth = 0;
-}
-CBC_BarcodeMatrix::~CBC_BarcodeMatrix() {
-  for (int32_t i = 0; i < m_matrix.GetSize(); i++) {
-    delete (CBC_BarcodeRow*)m_matrix.GetAt(i);
-  }
-  m_matrix.RemoveAll();
-  m_matrixOut.RemoveAll();
-}
-void CBC_BarcodeMatrix::set(int32_t x, int32_t y, uint8_t value) {
-  ((CBC_BarcodeRow*)m_matrix[y])->set(x, value);
-}
-void CBC_BarcodeMatrix::setMatrix(int32_t x, int32_t y, FX_BOOL black) {
-  set(x, y, (uint8_t)(black ? 1 : 0));
-}
-void CBC_BarcodeMatrix::startRow() {
-  ++m_currentRow;
-}
-CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow() {
-  return (CBC_BarcodeRow*)m_matrix[m_currentRow];
-}
-int32_t CBC_BarcodeMatrix::getWidth() {
-  return m_outWidth;
-}
-int32_t CBC_BarcodeMatrix::getHeight() {
-  return m_outHeight;
-}
-CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() {
-  return getScaledMatrix(1, 1);
-}
-CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t scale) {
-  return getScaledMatrix(scale, scale);
-}
-CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t xScale,
-                                                  int32_t yScale) {
-  int32_t yMax = m_height * yScale;
-  CFX_ByteArray bytearray;
-  bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale));
-  int32_t xMax = bytearray.GetSize();
-  m_matrixOut.SetSize(xMax * yMax);
-  m_outWidth = xMax;
-  m_outHeight = yMax;
-  int32_t k = 0;
-  for (int32_t i = 0; i < yMax; i++) {
-    if (i != 0) {
-      bytearray.Copy(
-          ((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale));
-    }
-    k = i * xMax;
-    for (int32_t l = 0; l < xMax; l++) {
-      m_matrixOut[k + l] = bytearray.GetAt(l);
-    }
-  }
-  return m_matrixOut;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
deleted file mode 100644
index 15e1c3f..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_BarcodeRow;
-class CBC_BarcodeMatrix {
- public:
-  CBC_BarcodeMatrix();
-  CBC_BarcodeMatrix(int32_t height, int32_t width);
-  virtual ~CBC_BarcodeMatrix();
-  void set(int32_t x, int32_t y, uint8_t value);
-  void setMatrix(int32_t x, int32_t y, FX_BOOL black);
-  void startRow();
-  CBC_BarcodeRow* getCurrentRow();
-  CFX_ByteArray& getMatrix();
-  CFX_ByteArray& getScaledMatrix(int32_t scale);
-  CFX_ByteArray& getScaledMatrix(int32_t xScale, int32_t yScale);
-  int32_t getWidth();
-  int32_t getHeight();
-
- private:
-  CFX_PtrArray m_matrix;
-  CFX_ByteArray m_matrixOut;
-  int32_t m_currentRow;
-  int32_t m_height;
-  int32_t m_width;
-  int32_t m_outWidth;
-  int32_t m_outHeight;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMATRIX_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp
deleted file mode 100644
index 87aacb1..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-
-CBC_BarcodeMetadata::CBC_BarcodeMetadata(int32_t columnCount,
-                                         int32_t rowCountUpperPart,
-                                         int32_t rowCountLowerPart,
-                                         int32_t errorCorrectionLevel) {
-  m_columnCount = columnCount;
-  m_rowCountUpperPart = rowCountUpperPart;
-  m_rowCountLowerPart = rowCountLowerPart;
-  m_errorCorrectionLevel = errorCorrectionLevel;
-  m_rowCount = m_rowCountUpperPart + m_rowCountLowerPart;
-}
-CBC_BarcodeMetadata::~CBC_BarcodeMetadata() {}
-int32_t CBC_BarcodeMetadata::getColumnCount() {
-  return m_columnCount;
-}
-int32_t CBC_BarcodeMetadata::getErrorCorrectionLevel() {
-  return m_errorCorrectionLevel;
-}
-int32_t CBC_BarcodeMetadata::getRowCount() {
-  return m_rowCount;
-}
-int32_t CBC_BarcodeMetadata::getRowCountUpperPart() {
-  return m_rowCountUpperPart;
-}
-int32_t CBC_BarcodeMetadata::getRowCountLowerPart() {
-  return m_rowCountLowerPart;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h
deleted file mode 100644
index 6d4b95e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
-
-#include <stdint.h>
-
-class CBC_BarcodeMetadata {
- public:
-  CBC_BarcodeMetadata(int32_t columnCount,
-                      int32_t rowCountUpperPart,
-                      int32_t rowCountLowerPart,
-                      int32_t errorCorrectionLevel);
-  virtual ~CBC_BarcodeMetadata();
-  int32_t getColumnCount();
-  int32_t getErrorCorrectionLevel();
-  int32_t getRowCount();
-  int32_t getRowCountUpperPart();
-  int32_t getRowCountLowerPart();
-
- private:
-  int32_t m_columnCount;
-  int32_t m_errorCorrectionLevel;
-  int32_t m_rowCountUpperPart;
-  int32_t m_rowCountLowerPart;
-  int32_t m_rowCount;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEMETADATA_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
deleted file mode 100644
index 41e1955..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h"
-
-CBC_BarcodeRow::CBC_BarcodeRow(int32_t width) {
-  m_row.SetSize(width);
-  m_currentLocation = 0;
-}
-CBC_BarcodeRow::~CBC_BarcodeRow() {
-  m_output.RemoveAll();
-  m_row.RemoveAll();
-}
-void CBC_BarcodeRow::set(int32_t x, uint8_t value) {
-  m_row.SetAt(x, value);
-}
-void CBC_BarcodeRow::set(int32_t x, FX_BOOL black) {
-  m_row.SetAt(x, (uint8_t)(black ? 1 : 0));
-}
-void CBC_BarcodeRow::addBar(FX_BOOL black, int32_t width) {
-  for (int32_t ii = 0; ii < width; ii++) {
-    set(m_currentLocation++, black);
-  }
-}
-CFX_ByteArray& CBC_BarcodeRow::getRow() {
-  return m_row;
-}
-CFX_ByteArray& CBC_BarcodeRow::getScaledRow(int32_t scale) {
-  m_output.SetSize(m_row.GetSize() * scale);
-  for (int32_t i = 0; i < m_output.GetSize(); i++) {
-    m_output[i] = (m_row[i / scale]);
-  }
-  return m_output;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
deleted file mode 100644
index f387a62..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_BarcodeRow {
- public:
-  CBC_BarcodeRow(int32_t width);
-  virtual ~CBC_BarcodeRow();
-  void set(int32_t x, uint8_t value);
-  void set(int32_t x, FX_BOOL black);
-  void addBar(FX_BOOL black, int32_t width);
-  CFX_ByteArray& getRow();
-  CFX_ByteArray& getScaledRow(int32_t scale);
-
- private:
-  CFX_ByteArray m_row;
-  CFX_ByteArray m_output;
-  int32_t m_currentLocation;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEROW_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp
deleted file mode 100644
index 7ecb1a7..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-
-CBC_BarcodeValue::CBC_BarcodeValue() {}
-CBC_BarcodeValue::~CBC_BarcodeValue() {}
-void CBC_BarcodeValue::setValue(int32_t value) {
-  int32_t confidence = 0;
-  for (int32_t i = 0; i < m_keys.GetSize(); i++) {
-    if (m_keys.GetAt(i) == value) {
-      confidence = m_values.GetAt(i);
-      m_values.SetAt(i, confidence + 1);
-      return;
-    }
-  }
-  confidence = 1;
-  m_keys.Add(value);
-  m_values.Add(confidence);
-}
-CFX_Int32Array* CBC_BarcodeValue::getValue() {
-  int32_t maxConfidence = -1;
-  CFX_Int32Array* result = new CFX_Int32Array;
-  for (int32_t i = 0; i < m_keys.GetSize(); i++) {
-    if (m_values.GetAt(i) > maxConfidence) {
-      maxConfidence = m_values.GetAt(i);
-      result->RemoveAll();
-      result->Add(m_keys.GetAt(i));
-    } else if (m_values.GetAt(i) == maxConfidence) {
-      result->Add(m_keys.GetAt(i));
-    }
-  }
-  return result;
-}
-int32_t CBC_BarcodeValue::getConfidence(int32_t value) {
-  for (int32_t i = 0; i < m_keys.GetSize(); i++)
-    if (m_keys.GetAt(i) == value) {
-      return m_values.GetAt(i);
-    }
-  return -1;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
deleted file mode 100644
index 8e567d7..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_BarcodeValue {
- public:
-  CBC_BarcodeValue();
-  virtual ~CBC_BarcodeValue();
-  void setValue(int32_t value);
-  CFX_Int32Array* getValue();
-  int32_t getConfidence(int32_t value);
-
- private:
-  CFX_Int32Array m_keys;
-  CFX_Int32Array m_values;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp
deleted file mode 100644
index 6deef4c..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image,
-                                 CBC_ResultPoint* topLeft,
-                                 CBC_ResultPoint* bottomLeft,
-                                 CBC_ResultPoint* topRight,
-                                 CBC_ResultPoint* bottomRight,
-                                 int32_t& e) {
-  if ((topLeft == NULL && topRight == NULL) ||
-      (bottomLeft == NULL && bottomRight == NULL) ||
-      (topLeft && bottomLeft == NULL) || (topRight && bottomRight == NULL)) {
-    e = BCExceptionNotFoundInstance;
-  }
-  init(image, topLeft, bottomLeft, topRight, bottomRight);
-}
-CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) {
-  init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft,
-       boundingBox->m_topRight, boundingBox->m_bottomRight);
-}
-CBC_BoundingBox::~CBC_BoundingBox() {
-  if (m_topLeft) {
-    delete m_topLeft;
-  }
-  if (m_bottomLeft) {
-    delete m_bottomLeft;
-  }
-  if (m_topRight) {
-    delete m_topRight;
-  }
-  if (m_bottomRight) {
-    delete m_bottomRight;
-  }
-}
-CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox,
-                                        CBC_BoundingBox* rightBox,
-                                        int32_t& e) {
-  CBC_BoundingBox* boundingBox = NULL;
-  if (leftBox == NULL) {
-    boundingBox = new CBC_BoundingBox(rightBox);
-    return boundingBox;
-  }
-  if (rightBox == NULL) {
-    boundingBox = new CBC_BoundingBox(leftBox);
-    return boundingBox;
-  }
-  boundingBox = new CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft,
-                                    leftBox->m_bottomLeft, rightBox->m_topRight,
-                                    rightBox->m_bottomRight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return boundingBox;
-}
-CBC_BoundingBox* CBC_BoundingBox::addMissingRows(int32_t missingStartRows,
-                                                 int32_t missingEndRows,
-                                                 FX_BOOL isLeft,
-                                                 int32_t& e) {
-  CBC_ResultPoint* newTopLeft = m_topLeft;
-  CBC_ResultPoint* newBottomLeft = m_bottomLeft;
-  CBC_ResultPoint* newTopRight = m_topRight;
-  CBC_ResultPoint* newBottomRight = m_bottomRight;
-  CBC_ResultPoint* newTop = NULL;
-  CBC_ResultPoint* newBottom = NULL;
-  if (missingStartRows > 0) {
-    CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight;
-    int32_t newMinY = (int32_t)top->GetY() - missingStartRows;
-    if (newMinY < 0) {
-      newMinY = 0;
-    }
-    newTop = new CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY);
-    if (isLeft) {
-      newTopLeft = newTop;
-    } else {
-      newTopRight = newTop;
-    }
-  }
-  if (missingEndRows > 0) {
-    CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight;
-    int32_t newMaxY = (int32_t)bottom->GetY() + missingEndRows;
-    if (newMaxY >= m_image->GetHeight()) {
-      newMaxY = m_image->GetHeight() - 1;
-    }
-    newBottom =
-        new CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY);
-    if (isLeft) {
-      newBottomLeft = newBottom;
-    } else {
-      newBottomRight = newBottom;
-    }
-  }
-  calculateMinMaxValues();
-  CBC_BoundingBox* boundingBox = new CBC_BoundingBox(
-      m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e);
-  delete newTop;
-  delete newBottom;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return boundingBox;
-}
-void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) {
-  if (m_topRight) {
-    delete m_topRight;
-  }
-  m_topRight = new CBC_ResultPoint(topRight.GetX(), topRight.GetY());
-  calculateMinMaxValues();
-}
-void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) {
-  if (m_bottomRight) {
-    delete m_bottomRight;
-  }
-  m_bottomRight = new CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY());
-  calculateMinMaxValues();
-}
-int32_t CBC_BoundingBox::getMinX() {
-  return m_minX;
-}
-int32_t CBC_BoundingBox::getMaxX() {
-  return m_maxX;
-}
-int32_t CBC_BoundingBox::getMinY() {
-  return m_minY;
-}
-int32_t CBC_BoundingBox::getMaxY() {
-  return m_maxY;
-}
-CBC_ResultPoint* CBC_BoundingBox::getTopLeft() {
-  return m_topLeft;
-}
-CBC_ResultPoint* CBC_BoundingBox::getTopRight() {
-  return m_topRight;
-}
-CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() {
-  return m_bottomLeft;
-}
-CBC_ResultPoint* CBC_BoundingBox::getBottomRight() {
-  return m_bottomRight;
-}
-void CBC_BoundingBox::init(CBC_CommonBitMatrix* image,
-                           CBC_ResultPoint* topLeft,
-                           CBC_ResultPoint* bottomLeft,
-                           CBC_ResultPoint* topRight,
-                           CBC_ResultPoint* bottomRight) {
-  m_topLeft = NULL;
-  m_bottomLeft = NULL;
-  m_topRight = NULL;
-  m_bottomRight = NULL;
-  m_image = image;
-  if (topLeft) {
-    m_topLeft = new CBC_ResultPoint(topLeft->GetX(), topLeft->GetY());
-  }
-  if (bottomLeft) {
-    m_bottomLeft = new CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY());
-  }
-  if (topRight) {
-    m_topRight = new CBC_ResultPoint(topRight->GetX(), topRight->GetY());
-  }
-  if (bottomRight) {
-    m_bottomRight =
-        new CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY());
-  }
-  calculateMinMaxValues();
-}
-void CBC_BoundingBox::calculateMinMaxValues() {
-  if (m_topLeft == NULL) {
-    m_topLeft = new CBC_ResultPoint(0, m_topRight->GetY());
-    m_bottomLeft = new CBC_ResultPoint(0, m_bottomRight->GetY());
-  } else if (m_topRight == NULL) {
-    m_topRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1,
-                                     (FX_FLOAT)m_topLeft->GetY());
-    m_bottomRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1,
-                                        (FX_FLOAT)m_bottomLeft->GetY());
-  }
-  m_minX = (int32_t)(m_topLeft->GetX() < m_bottomLeft->GetX()
-                         ? m_topLeft->GetX()
-                         : m_bottomLeft->GetX());
-  m_maxX = (int32_t)(m_topRight->GetX() > m_bottomRight->GetX()
-                         ? m_topRight->GetX()
-                         : m_bottomRight->GetX());
-  m_minY =
-      (int32_t)(m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY()
-                                                       : m_topRight->GetY());
-  m_maxY = (int32_t)(m_bottomLeft->GetY() > m_bottomRight->GetY()
-                         ? m_bottomLeft->GetY()
-                         : m_bottomRight->GetY());
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h
deleted file mode 100644
index c241572..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
-
-#include "core/include/fxcrt/fx_system.h"
-
-class CBC_CommonBitMatrix;
-class CBC_ResultPoint;
-
-class CBC_BoundingBox {
- public:
-  CBC_BoundingBox(CBC_CommonBitMatrix* image,
-                  CBC_ResultPoint* topLeft,
-                  CBC_ResultPoint* bottomLeft,
-                  CBC_ResultPoint* topRight,
-                  CBC_ResultPoint* bottomRight,
-                  int32_t& e);
-  CBC_BoundingBox(CBC_BoundingBox* boundingBox);
-  virtual ~CBC_BoundingBox();
-  static CBC_BoundingBox* merge(CBC_BoundingBox* leftBox,
-                                CBC_BoundingBox* rightBox,
-                                int32_t& e);
-  CBC_BoundingBox* addMissingRows(int32_t missingStartRows,
-                                  int32_t missingEndRows,
-                                  FX_BOOL isLeft,
-                                  int32_t& e);
-  void setTopRight(CBC_ResultPoint topRight);
-  void setBottomRight(CBC_ResultPoint bottomRight);
-  int32_t getMinX();
-  int32_t getMaxX();
-  int32_t getMinY();
-  int32_t getMaxY();
-  CBC_ResultPoint* getTopLeft();
-  CBC_ResultPoint* getTopRight();
-  CBC_ResultPoint* getBottomLeft();
-  CBC_ResultPoint* getBottomRight();
-
- private:
-  CBC_CommonBitMatrix* m_image;
-  CBC_ResultPoint* m_topLeft;
-  CBC_ResultPoint* m_bottomLeft;
-  CBC_ResultPoint* m_topRight;
-  CBC_ResultPoint* m_bottomRight;
-  int32_t m_minX;
-  int32_t m_maxX;
-  int32_t m_minY;
-  int32_t m_maxY;
-  void init(CBC_CommonBitMatrix* image,
-            CBC_ResultPoint* topLeft,
-            CBC_ResultPoint* bottomLeft,
-            CBC_ResultPoint* topRight,
-            CBC_ResultPoint* bottomRight);
-  void calculateMinMaxValues();
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417BOUNDINGBOX_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp
deleted file mode 100644
index f8b627a..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-
-int32_t CBC_Codeword::BARCODE_ROW_UNKNOWN = -1;
-CBC_Codeword::CBC_Codeword(int32_t startX,
-                           int32_t endX,
-                           int32_t bucket,
-                           int32_t cvalue) {
-  m_startX = startX;
-  m_endX = endX;
-  m_bucket = bucket;
-  m_value = cvalue;
-  m_rowNumber = BARCODE_ROW_UNKNOWN;
-}
-CBC_Codeword::~CBC_Codeword() {}
-FX_BOOL CBC_Codeword::hasValidRowNumber() {
-  return isValidRowNumber(m_rowNumber);
-}
-FX_BOOL CBC_Codeword::isValidRowNumber(int32_t rowNumber) {
-  return m_rowNumber != BARCODE_ROW_UNKNOWN &&
-         m_bucket == (m_rowNumber % 3) * 3;
-}
-void CBC_Codeword::setRowNumberAsRowIndicatorColumn() {
-  m_rowNumber = (m_value / 30) * 3 + m_bucket / 3;
-}
-int32_t CBC_Codeword::getWidth() {
-  return m_endX - m_startX;
-}
-int32_t CBC_Codeword::getStartX() {
-  return m_startX;
-}
-int32_t CBC_Codeword::getEndX() {
-  return m_endX;
-}
-int32_t CBC_Codeword::getBucket() {
-  return m_bucket;
-}
-int32_t CBC_Codeword::getValue() {
-  return m_value;
-}
-int32_t CBC_Codeword::getRowNumber() {
-  return m_rowNumber;
-}
-void CBC_Codeword::setRowNumber(int32_t rowNumber) {
-  m_rowNumber = rowNumber;
-}
-CFX_ByteString CBC_Codeword::toString() {
-  return m_rowNumber + (FX_CHAR)'|' + m_value;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h
deleted file mode 100644
index e2eb52c9..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_Codeword {
- public:
-  CBC_Codeword(int32_t startX, int32_t endX, int32_t bucket, int32_t value);
-  virtual ~CBC_Codeword();
-  FX_BOOL hasValidRowNumber();
-  FX_BOOL isValidRowNumber(int32_t rowNumber);
-  void setRowNumberAsRowIndicatorColumn();
-  int32_t getWidth();
-  int32_t getStartX();
-  int32_t getEndX();
-  int32_t getBucket();
-  int32_t getValue();
-  int32_t getRowNumber();
-  void setRowNumber(int32_t rowNumber);
-  CFX_ByteString toString();
-
- private:
-  static int32_t BARCODE_ROW_UNKNOWN;
-  int32_t m_startX;
-  int32_t m_endX;
-  int32_t m_bucket;
-  int32_t m_value;
-  int32_t m_rowNumber;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp
deleted file mode 100644
index ea1e387..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <limits>
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-
-#define SYMBOL_TABLE_Length 2787
-
-FX_FLOAT CBC_PDF417CodewordDecoder::RATIOS_TABLE[2787][8] = {{0}};
-
-CBC_PDF417CodewordDecoder::CBC_PDF417CodewordDecoder() {}
-CBC_PDF417CodewordDecoder::~CBC_PDF417CodewordDecoder() {}
-void CBC_PDF417CodewordDecoder::Initialize() {
-  for (int32_t i = 0; i < SYMBOL_TABLE_Length; i++) {
-    int32_t currentSymbol = CBC_PDF417Common::SYMBOL_TABLE[i];
-    int32_t currentBit = currentSymbol & 0x1;
-    for (int32_t j = 0; j < CBC_PDF417Common::BARS_IN_MODULE; j++) {
-      FX_FLOAT size = 0.0f;
-      while ((currentSymbol & 0x1) == currentBit) {
-        size += 1.0f;
-        currentSymbol >>= 1;
-      }
-      currentBit = currentSymbol & 0x1;
-      RATIOS_TABLE[i][CBC_PDF417Common::BARS_IN_MODULE - j - 1] =
-          size / CBC_PDF417Common::MODULES_IN_CODEWORD;
-    }
-  }
-}
-void CBC_PDF417CodewordDecoder::Finalize() {}
-int32_t CBC_PDF417CodewordDecoder::getDecodedValue(
-    CFX_Int32Array& moduleBitCount) {
-  CFX_Int32Array* array = sampleBitCounts(moduleBitCount);
-  int32_t decodedValue = getDecodedCodewordValue(*array);
-  delete array;
-  if (decodedValue != -1) {
-    return decodedValue;
-  }
-  return getClosestDecodedValue(moduleBitCount);
-}
-CFX_Int32Array* CBC_PDF417CodewordDecoder::sampleBitCounts(
-    CFX_Int32Array& moduleBitCount) {
-  FX_FLOAT bitCountSum =
-      (FX_FLOAT)CBC_PDF417Common::getBitCountSum(moduleBitCount);
-  CFX_Int32Array* bitCount = new CFX_Int32Array();
-  bitCount->SetSize(CBC_PDF417Common::BARS_IN_MODULE);
-  int32_t bitCountIndex = 0;
-  int32_t sumPreviousBits = 0;
-  for (int32_t i = 0; i < CBC_PDF417Common::MODULES_IN_CODEWORD; i++) {
-    FX_FLOAT sampleIndex =
-        bitCountSum / (2 * CBC_PDF417Common::MODULES_IN_CODEWORD) +
-        (i * bitCountSum) / CBC_PDF417Common::MODULES_IN_CODEWORD;
-    if (sumPreviousBits + moduleBitCount.GetAt(bitCountIndex) <= sampleIndex) {
-      sumPreviousBits += moduleBitCount.GetAt(bitCountIndex);
-      bitCountIndex++;
-    }
-    bitCount->SetAt(bitCountIndex, bitCount->GetAt(bitCountIndex) + 1);
-  }
-  return bitCount;
-}
-int32_t CBC_PDF417CodewordDecoder::getDecodedCodewordValue(
-    CFX_Int32Array& moduleBitCount) {
-  int32_t decodedValue = getBitValue(moduleBitCount);
-  return CBC_PDF417Common::getCodeword(decodedValue) == -1 ? -1 : decodedValue;
-}
-int32_t CBC_PDF417CodewordDecoder::getBitValue(CFX_Int32Array& moduleBitCount) {
-  int64_t result = 0;
-  for (int32_t i = 0; i < moduleBitCount.GetSize(); i++) {
-    for (int32_t bit = 0; bit < moduleBitCount.GetAt(i); bit++) {
-      result = (result << 1) | (i % 2 == 0 ? 1 : 0);
-    }
-  }
-  return (int32_t)result;
-}
-int32_t CBC_PDF417CodewordDecoder::getClosestDecodedValue(
-    CFX_Int32Array& moduleBitCount) {
-  int32_t bitCountSum = CBC_PDF417Common::getBitCountSum(moduleBitCount);
-  CFX_FloatArray bitCountRatios;
-  bitCountRatios.SetSize(CBC_PDF417Common::BARS_IN_MODULE);
-  for (int32_t i = 0; i < bitCountRatios.GetSize(); i++) {
-    bitCountRatios[i] = moduleBitCount.GetAt(i) / (FX_FLOAT)bitCountSum;
-  }
-  FX_FLOAT bestMatchError = std::numeric_limits<int32_t>::max();
-  int32_t bestMatch = -1;
-  for (int32_t j = 0; j < SYMBOL_TABLE_Length; j++) {
-    FX_FLOAT error = 0.0f;
-    for (int32_t k = 0; k < CBC_PDF417Common::BARS_IN_MODULE; k++) {
-      FX_FLOAT diff = RATIOS_TABLE[j][k] - bitCountRatios[k];
-      error += diff * diff;
-    }
-    if (error < bestMatchError) {
-      bestMatchError = error;
-      bestMatch = CBC_PDF417Common::SYMBOL_TABLE[j];
-    }
-  }
-  return bestMatch;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h
deleted file mode 100644
index 149a640..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_PDF417CodewordDecoder {
- public:
-  CBC_PDF417CodewordDecoder();
-  virtual ~CBC_PDF417CodewordDecoder();
-  static void Initialize();
-  static void Finalize();
-  static int32_t getDecodedValue(CFX_Int32Array& moduleBitCount);
-
- private:
-  static FX_FLOAT RATIOS_TABLE[][8];
-  static CFX_Int32Array* sampleBitCounts(CFX_Int32Array& moduleBitCount);
-  static int32_t getDecodedCodewordValue(CFX_Int32Array& moduleBitCount);
-  static int32_t getBitValue(CFX_Int32Array& moduleBitCount);
-  static int32_t getClosestDecodedValue(CFX_Int32Array& moduleBitCount);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417CODEWORDDECODER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp
deleted file mode 100644
index 5bd2daf..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp
+++ /dev/null
@@ -1,651 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-
-int32_t CBC_PDF417Common::NUMBER_OF_CODEWORDS = 929;
-int32_t CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1;
-int32_t CBC_PDF417Common::MIN_ROWS_IN_BARCODE = 3;
-int32_t CBC_PDF417Common::MAX_ROWS_IN_BARCODE = 90;
-int32_t CBC_PDF417Common::MAX_CODEWORDS_IN_ROW = 32;
-int32_t CBC_PDF417Common::MODULES_IN_CODEWORD = 17;
-int32_t CBC_PDF417Common::MODULES_IN_STOP_PATTERN = 18;
-int32_t CBC_PDF417Common::BARS_IN_MODULE = 8;
-CFX_Int32Array* CBC_PDF417Common::EMPTY_INT_ARRAY = NULL;
-int32_t CBC_PDF417Common::SYMBOL_TABLE[] = {
-    0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e,
-    0x1035c, 0x10396, 0x103a6, 0x103ac, 0x10422, 0x10428, 0x10436, 0x10442,
-    0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482,
-    0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4,
-    0x10504, 0x10508, 0x10510, 0x1051e, 0x10520, 0x1053c, 0x10540, 0x10578,
-    0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2,
-    0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c,
-    0x106b8, 0x106de, 0x106fa, 0x10716, 0x10726, 0x1072c, 0x10746, 0x1074c,
-    0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6,
-    0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c,
-    0x1087a, 0x10882, 0x10884, 0x10890, 0x1089e, 0x108a0, 0x108bc, 0x108c6,
-    0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e,
-    0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be,
-    0x109ce, 0x109dc, 0x109e2, 0x109e4, 0x109e8, 0x109f6, 0x10a08, 0x10a10,
-    0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c,
-    0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8,
-    0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, 0x10bde, 0x10be6, 0x10bec, 0x10c2e,
-    0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c,
-    0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec,
-    0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, 0x10d70, 0x10d7e, 0x10d82, 0x10d84,
-    0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8,
-    0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58,
-    0x10e6e, 0x10e86, 0x10e8c, 0x10e98, 0x10eb0, 0x10ebe, 0x10ece, 0x10edc,
-    0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44,
-    0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022,
-    0x11028, 0x11042, 0x11048, 0x11050, 0x1105e, 0x1107a, 0x11082, 0x11084,
-    0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee,
-    0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178,
-    0x11186, 0x11198, 0x111b0, 0x111be, 0x111ce, 0x111dc, 0x111e2, 0x111e4,
-    0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c,
-    0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2,
-    0x113c8, 0x113d0, 0x113de, 0x113e6, 0x113ec, 0x11408, 0x11410, 0x1141e,
-    0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618,
-    0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738,
-    0x11770, 0x1177e, 0x11782, 0x11784, 0x11788, 0x11790, 0x1179e, 0x117a0,
-    0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e,
-    0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8,
-    0x118c2, 0x118c8, 0x118d0, 0x118de, 0x118e6, 0x118ec, 0x118fa, 0x1190e,
-    0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e,
-    0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4,
-    0x11a0e, 0x11a1c, 0x11a38, 0x11a70, 0x11a7e, 0x11ae0, 0x11afc, 0x11b08,
-    0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98,
-    0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6,
-    0x11c16, 0x11c26, 0x11c2c, 0x11c46, 0x11c4c, 0x11c58, 0x11c6e, 0x11c86,
-    0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8,
-    0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c,
-    0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, 0x11dc8, 0x11dd0, 0x11dde, 0x11de6,
-    0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28,
-    0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82,
-    0x11e84, 0x11e88, 0x11e90, 0x11e9e, 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc,
-    0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c,
-    0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084,
-    0x12090, 0x1209e, 0x120a0, 0x120bc, 0x120d8, 0x120f2, 0x120f4, 0x12108,
-    0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0,
-    0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e,
-    0x12220, 0x12278, 0x122f0, 0x12306, 0x1230c, 0x12330, 0x1233e, 0x12360,
-    0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6,
-    0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e,
-    0x12660, 0x1267c, 0x126c0, 0x126f8, 0x12738, 0x12770, 0x1277e, 0x12782,
-    0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8,
-    0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0,
-    0x12c18, 0x12c30, 0x12c3e, 0x12c60, 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0,
-    0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08,
-    0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98,
-    0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, 0x1302e, 0x1304e, 0x1305c, 0x13062,
-    0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de,
-    0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184,
-    0x13190, 0x1319e, 0x131a0, 0x131bc, 0x131c6, 0x131cc, 0x131d8, 0x131f2,
-    0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308,
-    0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0,
-    0x133be, 0x133ce, 0x133dc, 0x133e2, 0x133e4, 0x133e8, 0x133f6, 0x1340e,
-    0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8,
-    0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0,
-    0x1370c, 0x13718, 0x13730, 0x1373e, 0x13760, 0x1377c, 0x1379c, 0x137b8,
-    0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816,
-    0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886,
-    0x13898, 0x138b0, 0x138be, 0x138ce, 0x138dc, 0x138e2, 0x138e4, 0x138e8,
-    0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c,
-    0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06,
-    0x13a0c, 0x13a18, 0x13a30, 0x13a3e, 0x13a60, 0x13a7c, 0x13ac0, 0x13af8,
-    0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e,
-    0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12,
-    0x13c14, 0x13c22, 0x13c24, 0x13c28, 0x13c36, 0x13c42, 0x13c48, 0x13c50,
-    0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0,
-    0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08,
-    0x13d10, 0x13d1e, 0x13d20, 0x13d3c, 0x13d40, 0x13d78, 0x13d86, 0x13d8c,
-    0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6,
-    0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64,
-    0x13e68, 0x13e76, 0x13e8e, 0x13e9c, 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8,
-    0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46,
-    0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0,
-    0x140bc, 0x14104, 0x14108, 0x14110, 0x1411e, 0x14120, 0x1413c, 0x14140,
-    0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8,
-    0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0,
-    0x14306, 0x1430c, 0x14318, 0x14330, 0x1433e, 0x14360, 0x1437c, 0x1438e,
-    0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410,
-    0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c,
-    0x14618, 0x14630, 0x1463e, 0x14660, 0x1467c, 0x146c0, 0x146f8, 0x1471c,
-    0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0,
-    0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c,
-    0x14840, 0x14878, 0x148f0, 0x149e0, 0x14bc0, 0x14c30, 0x14c3e, 0x14c60,
-    0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0,
-    0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40,
-    0x14f78, 0x14f86, 0x14f8c, 0x14f98, 0x14fb0, 0x14fce, 0x14fdc, 0x15020,
-    0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0,
-    0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0,
-    0x15df8, 0x15e08, 0x15e10, 0x15e20, 0x15e40, 0x15e78, 0x15ef0, 0x15f0c,
-    0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e,
-    0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de,
-    0x1610e, 0x1611c, 0x16138, 0x16170, 0x1617e, 0x16184, 0x16188, 0x16190,
-    0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4,
-    0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304,
-    0x16308, 0x16310, 0x1631e, 0x16320, 0x1633c, 0x16340, 0x16378, 0x16386,
-    0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4,
-    0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0,
-    0x164fc, 0x165c0, 0x165f8, 0x16610, 0x1661e, 0x16620, 0x1663c, 0x16640,
-    0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e,
-    0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6,
-    0x167ec, 0x1681c, 0x16838, 0x16870, 0x168e0, 0x168fc, 0x169c0, 0x169f8,
-    0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0,
-    0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8,
-    0x16f1c, 0x16f38, 0x16f70, 0x16f7e, 0x16f84, 0x16f88, 0x16f90, 0x16f9e,
-    0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046,
-    0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be,
-    0x170ce, 0x170dc, 0x170e8, 0x17106, 0x1710c, 0x17118, 0x17130, 0x1713e,
-    0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8,
-    0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218,
-    0x17230, 0x1723e, 0x17260, 0x1727c, 0x172c0, 0x172f8, 0x1730e, 0x1731c,
-    0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc,
-    0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430,
-    0x1743e, 0x17460, 0x1747c, 0x174c0, 0x174f8, 0x175f0, 0x1760e, 0x1761c,
-    0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e,
-    0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc,
-    0x177e2, 0x177e4, 0x177e8, 0x17822, 0x17824, 0x17828, 0x17836, 0x17842,
-    0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884,
-    0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8,
-    0x178ee, 0x178f2, 0x178f4, 0x17902, 0x17904, 0x17908, 0x17910, 0x1791e,
-    0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0,
-    0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04,
-    0x17a08, 0x17a10, 0x17a1e, 0x17a20, 0x17a3c, 0x17a40, 0x17a78, 0x17af0,
-    0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e,
-    0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec,
-    0x17c2e, 0x17c32, 0x17c34, 0x17c4e, 0x17c5c, 0x17c62, 0x17c64, 0x17c68,
-    0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0,
-    0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82,
-    0x17d84, 0x17d88, 0x17d90, 0x17d9e, 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc,
-    0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58,
-    0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece,
-    0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, 0x17ef6, 0x1813a, 0x18172, 0x18174,
-    0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274,
-    0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a,
-    0x183ae, 0x183d6, 0x18416, 0x18426, 0x1842c, 0x1843a, 0x18446, 0x18458,
-    0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc,
-    0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530,
-    0x1853e, 0x18560, 0x1857c, 0x1858e, 0x1859c, 0x185b8, 0x185c2, 0x185c4,
-    0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614,
-    0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682,
-    0x18684, 0x18688, 0x18690, 0x1869e, 0x186a0, 0x186bc, 0x186c6, 0x186cc,
-    0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796,
-    0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846,
-    0x1884c, 0x18858, 0x1886e, 0x18872, 0x18874, 0x18886, 0x18898, 0x188b0,
-    0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c,
-    0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8,
-    0x189d0, 0x189de, 0x189e6, 0x189ec, 0x189fa, 0x18a18, 0x18a30, 0x18a3e,
-    0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e,
-    0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6,
-    0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, 0x18bf4, 0x18c22, 0x18c24, 0x18c28,
-    0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82,
-    0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4,
-    0x18d04, 0x18d08, 0x18d10, 0x18d1e, 0x18d20, 0x18d3c, 0x18d40, 0x18d78,
-    0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32,
-    0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c,
-    0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, 0x18ed0, 0x18efa, 0x18f16, 0x18f26,
-    0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94,
-    0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c,
-    0x19058, 0x19072, 0x19074, 0x19086, 0x19098, 0x190b0, 0x190be, 0x190ce,
-    0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e,
-    0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0,
-    0x191de, 0x191e6, 0x191ec, 0x191fa, 0x19218, 0x1923e, 0x19260, 0x1927c,
-    0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390,
-    0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2,
-    0x193f4, 0x19430, 0x1943e, 0x19460, 0x1947c, 0x194c0, 0x194f8, 0x195f0,
-    0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708,
-    0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798,
-    0x197b0, 0x197be, 0x197ce, 0x197dc, 0x197e2, 0x197e4, 0x197e8, 0x19822,
-    0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882,
-    0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4,
-    0x19902, 0x19908, 0x1991e, 0x19920, 0x1993c, 0x19940, 0x19978, 0x19986,
-    0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e,
-    0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60,
-    0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, 0x19bd0, 0x19be6, 0x19c2e, 0x19c34,
-    0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8,
-    0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38,
-    0x19d70, 0x19d7e, 0x19d82, 0x19d84, 0x19d88, 0x19d90, 0x19da0, 0x19dcc,
-    0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58,
-    0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2,
-    0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, 0x19f14, 0x19f22, 0x19f24, 0x19f28,
-    0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae,
-    0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c,
-    0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106,
-    0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c,
-    0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec,
-    0x1a218, 0x1a230, 0x1a23e, 0x1a260, 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c,
-    0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e,
-    0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4,
-    0x1a418, 0x1a430, 0x1a43e, 0x1a460, 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0,
-    0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704,
-    0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786,
-    0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4,
-    0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0,
-    0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08,
-    0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c,
-    0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8,
-    0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082,
-    0x1b084, 0x1b088, 0x1b090, 0x1b09e, 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2,
-    0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c,
-    0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8,
-    0x1b204, 0x1b208, 0x1b210, 0x1b21e, 0x1b220, 0x1b23c, 0x1b240, 0x1b278,
-    0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8,
-    0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478,
-    0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782,
-    0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e,
-    0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0,
-    0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, 0x1b938, 0x1b970, 0x1b97e, 0x1b982,
-    0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4,
-    0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08,
-    0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4,
-    0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72,
-    0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2,
-    0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60,
-    0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa,
-    0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48,
-    0x1be50, 0x1be5e, 0x1be66, 0x1be82, 0x1be84, 0x1be88, 0x1be90, 0x1be9e,
-    0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34,
-    0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4,
-    0x1c11a, 0x1c132, 0x1c134, 0x1c162, 0x1c164, 0x1c168, 0x1c176, 0x1c1ba,
-    0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268,
-    0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6,
-    0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, 0x1c33a, 0x1c346, 0x1c34c, 0x1c372,
-    0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462,
-    0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8,
-    0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570,
-    0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc,
-    0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626,
-    0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, 0x1c658, 0x1c66e, 0x1c672, 0x1c674,
-    0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2,
-    0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742,
-    0x1c744, 0x1c748, 0x1c750, 0x1c75e, 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae,
-    0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c,
-    0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2,
-    0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938,
-    0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc,
-    0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70,
-    0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20,
-    0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe,
-    0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26,
-    0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0,
-    0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18,
-    0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8,
-    0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50,
-    0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e,
-    0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34,
-    0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac,
-    0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c,
-    0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2,
-    0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c,
-    0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e,
-    0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4,
-    0x1d21c, 0x1d238, 0x1d270, 0x1d27e, 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304,
-    0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386,
-    0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4,
-    0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8,
-    0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706,
-    0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c,
-    0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec,
-    0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874,
-    0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4,
-    0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, 0x1d930, 0x1d93e, 0x1d960, 0x1d97c,
-    0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c,
-    0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38,
-    0x1db82, 0x1db84, 0x1db88, 0x1db90, 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2,
-    0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66,
-    0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc,
-    0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20,
-    0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4,
-    0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64,
-    0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0,
-    0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58,
-    0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8,
-    0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da,
-    0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142,
-    0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2,
-    0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, 0x1e222, 0x1e224, 0x1e228, 0x1e236,
-    0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282,
-    0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8,
-    0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, 0x1e332, 0x1e334, 0x1e35c, 0x1e362,
-    0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428,
-    0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a,
-    0x1e482, 0x1e484, 0x1e490, 0x1e49e, 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc,
-    0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510,
-    0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598,
-    0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6,
-    0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668,
-    0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6,
-    0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, 0x1e73a, 0x1e746, 0x1e74c, 0x1e758,
-    0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6,
-    0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844,
-    0x1e848, 0x1e850, 0x1e85e, 0x1e866, 0x1e86c, 0x1e87a, 0x1e882, 0x1e884,
-    0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8,
-    0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920,
-    0x1e93c, 0x1e940, 0x1e978, 0x1e986, 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be,
-    0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08,
-    0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18,
-    0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2,
-    0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e,
-    0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e,
-    0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa,
-    0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88,
-    0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26,
-    0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74,
-    0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2,
-    0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42,
-    0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae,
-    0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca,
-    0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c,
-    0x1f158, 0x1f16e, 0x1f172, 0x1f174, 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2,
-    0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246,
-    0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0,
-    0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a,
-    0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350,
-    0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416,
-    0x1f426, 0x1f42c, 0x1f43a, 0x1f446, 0x1f44c, 0x1f458, 0x1f46e, 0x1f472,
-    0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc,
-    0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530,
-    0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4,
-    0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612,
-    0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648,
-    0x1f650, 0x1f65e, 0x1f666, 0x1f67a, 0x1f682, 0x1f684, 0x1f688, 0x1f690,
-    0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e,
-    0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776,
-    0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae,
-    0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934,
-    0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6,
-    0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32,
-    0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e,
-    0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6,
-    0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58,
-    0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4,
-    0x1fba8, 0x1fbb6, 0x1fbda};
-int32_t CBC_PDF417Common::CODEWORD_TABLE[] = {
-    2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773,
-    902,  896,  908,  868,  865,  861,  859,  2511, 873,  871,  1780, 835,
-    2493, 825,  2491, 842,  837,  844,  1764, 1762, 811,  810,  809,  2483,
-    807,  2482, 806,  2480, 815,  814,  813,  812,  2484, 817,  816,  1745,
-    1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752,
-    2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780,
-    787,  781,  747,  739,  736,  2413, 754,  752,  1719, 692,  689,  681,
-    2371, 678,  2369, 700,  697,  694,  703,  1688, 1686, 642,  638,  2343,
-    631,  2341, 627,  2338, 651,  646,  643,  2345, 654,  652,  1652, 1650,
-    1647, 1654, 601,  599,  2322, 596,  2321, 594,  2319, 2317, 611,  610,
-    608,  606,  2324, 603,  2323, 615,  614,  612,  1617, 1616, 1614, 1612,
-    616,  1619, 1618, 2575, 2538, 2536, 905,  901,  898,  909,  2509, 2507,
-    2504, 870,  867,  864,  860,  2512, 875,  872,  1781, 2490, 2489, 2487,
-    2485, 1748, 836,  834,  832,  830,  2494, 827,  2492, 843,  841,  839,
-    845,  1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631,
-    2629, 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735,
-    2733, 2731, 1848, 2740, 2738, 2786, 2784, 591,  588,  576,  569,  566,
-    2296, 1590, 537,  534,  526,  2276, 522,  2274, 545,  542,  539,  548,
-    1572, 1570, 481,  2245, 466,  2242, 462,  2239, 492,  485,  482,  2249,
-    496,  494,  1534, 1531, 1528, 1538, 413,  2196, 406,  2191, 2188, 425,
-    419,  2202, 415,  2199, 432,  430,  427,  1472, 1467, 1464, 433,  1476,
-    1474, 368,  367,  2160, 365,  2159, 362,  2157, 2155, 2152, 378,  377,
-    375,  2166, 372,  2165, 369,  2162, 383,  381,  379,  2168, 1419, 1418,
-    1416, 1414, 385,  1411, 384,  1423, 1422, 1420, 1424, 2461, 802,  2441,
-    2439, 790,  786,  783,  794,  2409, 2406, 2403, 750,  742,  738,  2414,
-    756,  753,  1720, 2367, 2365, 2362, 2359, 1663, 693,  691,  684,  2373,
-    680,  2370, 702,  699,  696,  704,  1690, 1687, 2337, 2336, 2334, 2332,
-    1624, 2329, 1622, 640,  637,  2344, 634,  2342, 630,  2340, 650,  648,
-    645,  2346, 655,  653,  1653, 1651, 1649, 1655, 2612, 2597, 2595, 2571,
-    2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907,  904,  900,
-    910,  2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869,
-    866,  863,  2513, 876,  874,  1782, 2720, 2713, 2711, 2697, 2694, 2691,
-    2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823,
-    2639, 1822, 2654, 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849,
-    2751, 2749, 2747, 2754, 353,  2148, 344,  342,  336,  2142, 332,  2140,
-    345,  1375, 1373, 306,  2130, 299,  2128, 295,  2125, 319,  314,  311,
-    2132, 1354, 1352, 1349, 1356, 262,  257,  2101, 253,  2096, 2093, 274,
-    273,  267,  2107, 263,  2104, 280,  278,  275,  1316, 1311, 1308, 1320,
-    1318, 2052, 202,  2050, 2044, 2040, 219,  2063, 212,  2060, 208,  2055,
-    224,  221,  2066, 1260, 1258, 1252, 231,  1248, 229,  1266, 1264, 1261,
-    1268, 155,  1998, 153,  1996, 1994, 1991, 1988, 165,  164,  2007, 162,
-    2006, 159,  2003, 2000, 172,  171,  169,  2012, 166,  2010, 1186, 1184,
-    1182, 1179, 175,  1176, 173,  1192, 1191, 1189, 1187, 176,  1194, 1193,
-    2313, 2307, 2305, 592,  589,  2294, 2292, 2289, 578,  572,  568,  2297,
-    580,  1591, 2272, 2267, 2264, 1547, 538,  536,  529,  2278, 525,  2275,
-    547,  544,  541,  1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478,
-    2247, 470,  2244, 465,  2241, 493,  488,  484,  2250, 498,  495,  1536,
-    1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427,
-    414,  412,  2197, 409,  2195, 405,  2193, 2190, 426,  424,  421,  2203,
-    418,  2201, 431,  429,  1473, 1471, 1469, 1466, 434,  1477, 1475, 2478,
-    2472, 2470, 2459, 2457, 2454, 2462, 803,  2437, 2432, 2429, 1726, 2443,
-    2440, 792,  789,  785,  2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408,
-    2405, 745,  741,  2415, 758,  755,  1721, 2358, 2357, 2355, 2353, 1661,
-    2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690,  687,  2374,
-    683,  2372, 701,  698,  705,  1691, 1689, 2619, 2617, 2610, 2608, 2605,
-    2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551,
-    1795, 2573, 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785,
-    2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, 906,  903,  911,
-    2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826,
-    1824, 2673, 2671, 2669, 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854,
-    1853, 1851, 1856, 2766, 2764, 143,  1987, 139,  1986, 135,  133,  131,
-    1984, 128,  1983, 125,  1981, 138,  137,  136,  1985, 1133, 1132, 1130,
-    112,  110,  1974, 107,  1973, 104,  1971, 1969, 122,  121,  119,  117,
-    1977, 114,  1976, 124,  1115, 1114, 1112, 1110, 1117, 1116, 84,   83,
-    1953, 81,   1952, 78,   1950, 1948, 1945, 94,   93,   91,   1959, 88,
-    1958, 85,   1955, 99,   97,   95,   1961, 1086, 1085, 1083, 1081, 1078,
-    100,  1090, 1089, 1087, 1091, 49,   47,   1917, 44,   1915, 1913, 1910,
-    1907, 59,   1926, 56,   1925, 53,   1922, 1919, 66,   64,   1931, 61,
-    1929, 1042, 1040, 1038, 71,   1035, 70,   1032, 68,   1048, 1047, 1045,
-    1043, 1050, 1049, 12,   10,   1869, 1867, 1864, 1861, 21,   1880, 19,
-    1877, 1874, 1871, 28,   1888, 25,   1886, 22,   1883, 982,  980,  977,
-    974,  32,   30,   991,  989,  987,  984,  34,   995,  994,  992,  2151,
-    2150, 2147, 2146, 2144, 356,  355,  354,  2149, 2139, 2138, 2136, 2134,
-    1359, 343,  341,  338,  2143, 335,  2141, 348,  347,  346,  1376, 1374,
-    2124, 2123, 2121, 2119, 1326, 2116, 1324, 310,  308,  305,  2131, 302,
-    2129, 298,  2127, 320,  318,  316,  313,  2133, 322,  321,  1355, 1353,
-    1351, 1357, 2092, 2091, 2089, 2087, 1276, 2084, 1274, 2081, 1271, 259,
-    2102, 256,  2100, 252,  2098, 2095, 272,  269,  2108, 266,  2106, 281,
-    279,  277,  1317, 1315, 1313, 1310, 282,  1321, 1319, 2039, 2037, 2035,
-    2032, 1203, 2029, 1200, 1197, 207,  2053, 205,  2051, 201,  2049, 2046,
-    2043, 220,  218,  2064, 215,  2062, 211,  2059, 228,  226,  223,  2069,
-    1259, 1257, 1254, 232,  1251, 230,  1267, 1265, 1263, 2316, 2315, 2312,
-    2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590,  2288,
-    2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579,  577,  574,
-    571,  2298, 582,  581,  1592, 2263, 2262, 2260, 2258, 1545, 2255, 1544,
-    2252, 1541, 2273, 2271, 2269, 2266, 1550, 535,  532,  2279, 528,  2277,
-    546,  543,  549,  1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214,
-    1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480,  477,  2248,
-    473,  2246, 469,  2243, 490,  487,  2251, 497,  1537, 1535, 1532, 2477,
-    2476, 2474, 2479, 2469, 2468, 2466, 2464, 1730, 2473, 2471, 2453, 2452,
-    2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805,  804,  2428,
-    2427, 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431,
-    1727, 2444, 2442, 793,  791,  788,  795,  2388, 2386, 2384, 1697, 2381,
-    1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412,
-    2410, 2407, 751,  748,  744,  2416, 759,  757,  1807, 2620, 2618, 1806,
-    1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, 2590, 2587,
-    1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798,
-    2554, 1796, 2574, 2572, 2569, 2578, 1847, 1846, 2722, 1843, 1842, 1840,
-    1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695,
-    2704, 1817, 1811, 1810, 897,  862,  1777, 829,  826,  838,  1760, 1758,
-    808,  2481, 1741, 1740, 1738, 1743, 2624, 1818, 2726, 2776, 782,  740,
-    737,  1715, 686,  679,  695,  1682, 1680, 639,  628,  2339, 647,  644,
-    1645, 1643, 1640, 1648, 602,  600,  597,  595,  2320, 593,  2318, 609,
-    607,  604,  1611, 1610, 1608, 1606, 613,  1615, 1613, 2328, 926,  924,
-    892,  886,  899,  857,  850,  2505, 1778, 824,  823,  821,  819,  2488,
-    818,  2486, 833,  831,  828,  840,  1761, 1759, 2649, 2632, 2630, 2746,
-    2734, 2732, 2782, 2781, 570,  567,  1587, 531,  527,  523,  540,  1566,
-    1564, 476,  467,  463,  2240, 486,  483,  1524, 1521, 1518, 1529, 411,
-    403,  2192, 399,  2189, 423,  416,  1462, 1457, 1454, 428,  1468, 1465,
-    2210, 366,  363,  2158, 360,  2156, 357,  2153, 376,  373,  370,  2163,
-    1410, 1409, 1407, 1405, 382,  1402, 380,  1417, 1415, 1412, 1421, 2175,
-    2174, 777,  774,  771,  784,  732,  725,  722,  2404, 743,  1716, 676,
-    674,  668,  2363, 665,  2360, 685,  1684, 1681, 626,  624,  622,  2335,
-    620,  2333, 617,  2330, 641,  635,  649,  1646, 1644, 1642, 2566, 928,
-    925,  2530, 2527, 894,  891,  888,  2501, 2499, 2496, 858,  856,  854,
-    851,  1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, 2757,
-    2744, 2743, 2741, 2748, 352,  1382, 340,  337,  333,  1371, 1369, 307,
-    300,  296,  2126, 315,  312,  1347, 1342, 1350, 261,  258,  250,  2097,
-    246,  2094, 271,  268,  264,  1306, 1301, 1298, 276,  1312, 1309, 2115,
-    203,  2048, 195,  2045, 191,  2041, 213,  209,  2056, 1246, 1244, 1238,
-    225,  1234, 222,  1256, 1253, 1249, 1262, 2080, 2079, 154,  1997, 150,
-    1995, 147,  1992, 1989, 163,  160,  2004, 156,  2001, 1175, 1174, 1172,
-    1170, 1167, 170,  1164, 167,  1185, 1183, 1180, 1177, 174,  1190, 1188,
-    2025, 2024, 2022, 587,  586,  564,  559,  556,  2290, 573,  1588, 520,
-    518,  512,  2268, 508,  2265, 530,  1568, 1565, 461,  457,  2233, 450,
-    2230, 446,  2226, 479,  471,  489,  1526, 1523, 1520, 397,  395,  2185,
-    392,  2183, 389,  2180, 2177, 410,  2194, 402,  422,  1463, 1461, 1459,
-    1456, 1470, 2455, 799,  2433, 2430, 779,  776,  773,  2397, 2394, 2390,
-    734,  728,  724,  746,  1717, 2356, 2354, 2351, 2348, 1658, 677,  675,
-    673,  670,  667,  688,  1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552,
-    927,  2523, 2521, 2518, 2515, 1784, 2532, 895,  893,  890,  2718, 2709,
-    2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852,
-    2760, 2758, 142,  141,  1139, 1138, 134,  132,  129,  126,  1982, 1129,
-    1128, 1126, 1131, 113,  111,  108,  105,  1972, 101,  1970, 120,  118,
-    115,  1109, 1108, 1106, 1104, 123,  1113, 1111, 82,   79,   1951, 75,
-    1949, 72,   1946, 92,   89,   86,   1956, 1077, 1076, 1074, 1072, 98,
-    1069, 96,   1084, 1082, 1079, 1088, 1968, 1967, 48,   45,   1916, 42,
-    1914, 39,   1911, 1908, 60,   57,   54,   1923, 50,   1920, 1031, 1030,
-    1028, 1026, 67,   1023, 65,   1020, 62,   1041, 1039, 1036, 1033, 69,
-    1046, 1044, 1944, 1943, 1941, 11,   9,    1868, 7,    1865, 1862, 1859,
-    20,   1878, 16,   1875, 13,   1872, 970,  968,  966,  963,  29,   960,
-    26,   23,   983,  981,  978,  975,  33,   971,  31,   990,  988,  985,
-    1906, 1904, 1902, 993,  351,  2145, 1383, 331,  330,  328,  326,  2137,
-    323,  2135, 339,  1372, 1370, 294,  293,  291,  289,  2122, 286,  2120,
-    283,  2117, 309,  303,  317,  1348, 1346, 1344, 245,  244,  242,  2090,
-    239,  2088, 236,  2085, 2082, 260,  2099, 249,  270,  1307, 1305, 1303,
-    1300, 1314, 189,  2038, 186,  2036, 183,  2033, 2030, 2026, 206,  198,
-    2047, 194,  216,  1247, 1245, 1243, 1240, 227,  1237, 1255, 2310, 2302,
-    2300, 2286, 2284, 2281, 565,  563,  561,  558,  575,  1589, 2261, 2259,
-    2256, 2253, 1542, 521,  519,  517,  514,  2270, 511,  533,  1569, 1567,
-    2223, 2221, 2218, 2215, 1483, 2211, 1480, 459,  456,  453,  2232, 449,
-    474,  491,  1527, 1525, 1522, 2475, 2467, 2465, 2451, 2449, 2446, 801,
-    800,  2426, 2424, 2421, 2418, 1723, 2435, 780,  778,  775,  2387, 2385,
-    2382, 2379, 1695, 2375, 1693, 2396, 735,  733,  730,  727,  749,  1718,
-    2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, 1800, 2591, 2550,
-    2549, 2547, 2545, 1792, 2542, 1790, 2558, 929,  2719, 1841, 2710, 2708,
-    1833, 1831, 2690, 2688, 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737,
-    1736, 1734, 1739, 1816, 1711, 1676, 1674, 633,  629,  1638, 1636, 1633,
-    1641, 598,  1605, 1604, 1602, 1600, 605,  1609, 1607, 2327, 887,  853,
-    1775, 822,  820,  1757, 1755, 1584, 524,  1560, 1558, 468,  464,  1514,
-    1511, 1508, 1519, 408,  404,  400,  1452, 1447, 1444, 417,  1458, 1455,
-    2208, 364,  361,  358,  2154, 1401, 1400, 1398, 1396, 374,  1393, 371,
-    1408, 1406, 1403, 1413, 2173, 2172, 772,  726,  723,  1712, 672,  669,
-    666,  682,  1678, 1675, 625,  623,  621,  618,  2331, 636,  632,  1639,
-    1637, 1635, 920,  918,  884,  880,  889,  849,  848,  847,  846,  2497,
-    855,  852,  1776, 2641, 2742, 2787, 1380, 334,  1367, 1365, 301,  297,
-    1340, 1338, 1335, 1343, 255,  251,  247,  1296, 1291, 1288, 265,  1302,
-    1299, 2113, 204,  196,  192,  2042, 1232, 1230, 1224, 214,  1220, 210,
-    1242, 1239, 1235, 1250, 2077, 2075, 151,  148,  1993, 144,  1990, 1163,
-    1162, 1160, 1158, 1155, 161,  1152, 157,  1173, 1171, 1168, 1165, 168,
-    1181, 1178, 2021, 2020, 2018, 2023, 585,  560,  557,  1585, 516,  509,
-    1562, 1559, 458,  447,  2227, 472,  1516, 1513, 1510, 398,  396,  393,
-    390,  2181, 386,  2178, 407,  1453, 1451, 1449, 1446, 420,  1460, 2209,
-    769,  764,  720,  712,  2391, 729,  1713, 664,  663,  661,  659,  2352,
-    656,  2349, 671,  1679, 1677, 2553, 922,  919,  2519, 2516, 885,  883,
-    881,  2685, 2661, 2659, 2767, 2756, 2755, 140,  1137, 1136, 130,  127,
-    1125, 1124, 1122, 1127, 109,  106,  102,  1103, 1102, 1100, 1098, 116,
-    1107, 1105, 1980, 80,   76,   73,   1947, 1068, 1067, 1065, 1063, 90,
-    1060, 87,   1075, 1073, 1070, 1080, 1966, 1965, 46,   43,   40,   1912,
-    36,   1909, 1019, 1018, 1016, 1014, 58,   1011, 55,   1008, 51,   1029,
-    1027, 1024, 1021, 63,   1037, 1034, 1940, 1939, 1937, 1942, 8,    1866,
-    4,    1863, 1,    1860, 956,  954,  952,  949,  946,  17,   14,   969,
-    967,  964,  961,  27,   957,  24,   979,  976,  972,  1901, 1900, 1898,
-    1896, 986,  1905, 1903, 350,  349,  1381, 329,  327,  324,  1368, 1366,
-    292,  290,  287,  284,  2118, 304,  1341, 1339, 1337, 1345, 243,  240,
-    237,  2086, 233,  2083, 254,  1297, 1295, 1293, 1290, 1304, 2114, 190,
-    187,  184,  2034, 180,  2031, 177,  2027, 199,  1233, 1231, 1229, 1226,
-    217,  1223, 1241, 2078, 2076, 584,  555,  554,  552,  550,  2282, 562,
-    1586, 507,  506,  504,  502,  2257, 499,  2254, 515,  1563, 1561, 445,
-    443,  441,  2219, 438,  2216, 435,  2212, 460,  454,  475,  1517, 1515,
-    1512, 2447, 798,  797,  2422, 2419, 770,  768,  766,  2383, 2380, 2376,
-    721,  719,  717,  714,  731,  1714, 2602, 2582, 2580, 2548, 2546, 2543,
-    923,  921,  2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733,
-    1732, 1731, 1735, 1814, 1707, 1670, 1668, 1631, 1629, 1626, 1634, 1599,
-    1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552,
-    1504, 1501, 1498, 1509, 1442, 1437, 1434, 401,  1448, 1445, 2206, 1392,
-    1391, 1389, 1387, 1384, 359,  1399, 1397, 1394, 1404, 2171, 2170, 1708,
-    1672, 1669, 619,  1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328,
-    1336, 1286, 1281, 1278, 248,  1292, 1289, 2111, 1218, 1216, 1210, 197,
-    1206, 193,  1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, 1148, 1146,
-    152,  1143, 149,  1140, 145,  1161, 1159, 1156, 1153, 158,  1169, 1166,
-    2017, 2016, 2014, 2019, 1582, 510,  1556, 1553, 452,  448,  1506, 1500,
-    394,  391,  387,  1443, 1441, 1439, 1436, 1450, 2207, 765,  716,  713,
-    1709, 662,  660,  657,  1673, 1671, 916,  914,  879,  878,  877,  882,
-    1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, 1092, 103,  1101,
-    1099, 1979, 1059, 1058, 1056, 1054, 77,   1051, 74,   1066, 1064, 1061,
-    1071, 1964, 1963, 1007, 1006, 1004, 1002, 999,  41,   996,  37,   1017,
-    1015, 1012, 1009, 52,   1025, 1022, 1936, 1935, 1933, 1938, 942,  940,
-    938,  935,  932,  5,    2,    955,  953,  950,  947,  18,   943,  15,
-    965,  962,  958,  1895, 1894, 1892, 1890, 973,  1899, 1897, 1379, 325,
-    1364, 1362, 288,  285,  1334, 1332, 1330, 241,  238,  234,  1287, 1285,
-    1283, 1280, 1294, 2112, 188,  185,  181,  178,  2028, 1219, 1217, 1215,
-    1212, 200,  1209, 1227, 2074, 2072, 583,  553,  551,  1583, 505,  503,
-    500,  513,  1557, 1555, 444,  442,  439,  436,  2213, 455,  451,  1507,
-    1505, 1502, 796,  763,  762,  760,  767,  711,  710,  708,  706,  2377,
-    718,  715,  1710, 2544, 917,  915,  2681, 1627, 1597, 1595, 2325, 1769,
-    1749, 1747, 1499, 1438, 1435, 2204, 1390, 1388, 1385, 1395, 2169, 2167,
-    1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214,
-    1207, 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146,  1157, 1154, 2013,
-    2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, 1433, 1431, 1428, 1425,
-    388,  1440, 2205, 1705, 658,  1667, 1664, 1119, 1095, 1093, 1978, 1057,
-    1055, 1052, 1062, 1962, 1960, 1005, 1003, 1000, 997,  38,   1013, 1010,
-    1932, 1930, 1927, 1934, 941,  939,  936,  933,  6,    930,  3,    951,
-    948,  944,  1889, 1887, 1884, 1881, 959,  1893, 1891, 35,   1377, 1360,
-    1358, 1327, 1325, 1322, 1331, 1277, 1275, 1272, 1269, 235,  1284, 2110,
-    1205, 1204, 1201, 1198, 182,  1195, 179,  1213, 2070, 2067, 1580, 501,
-    1551, 1548, 440,  437,  1497, 1494, 1490, 1503, 761,  709,  707,  1706,
-    913,  912,  2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, 2058, 2054,
-    1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659,
-    1656, 1975, 1053, 1957, 1954, 1001, 998,  1924, 1921, 1918, 1928, 937,
-    934,  931,  1879, 1876, 1873, 1870, 945,  1885, 1882, 1323, 1273, 1270,
-    2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481,
-    1478, 1491, 1700};
-
-CBC_PDF417Common::CBC_PDF417Common() {}
-CBC_PDF417Common::~CBC_PDF417Common() {}
-int32_t CBC_PDF417Common::getBitCountSum(CFX_Int32Array& moduleBitCount) {
-  int32_t bitCountSum = 0;
-  for (int32_t i = 0; i < moduleBitCount.GetSize(); i++) {
-    int32_t count = moduleBitCount.GetAt(i);
-    bitCountSum += count;
-  }
-  return bitCountSum;
-}
-int32_t CBC_PDF417Common::getCodeword(FX_DWORD symbol) {
-  FX_DWORD sym = symbol & 0x3FFFF;
-  int32_t i = findCodewordIndex(sym);
-  if (i == -1) {
-    return -1;
-  }
-  return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS;
-}
-int32_t CBC_PDF417Common::findCodewordIndex(FX_DWORD symbol) {
-  int32_t first = 0;
-  int32_t upto = sizeof(SYMBOL_TABLE) / sizeof(SYMBOL_TABLE[0]);
-  while (first < upto) {
-    int32_t mid = ((FX_DWORD)(first + upto)) >> 1;
-    if (symbol < (FX_DWORD)SYMBOL_TABLE[mid]) {
-      upto = mid;
-    } else if (symbol > (FX_DWORD)SYMBOL_TABLE[mid]) {
-      first = mid + 1;
-    } else {
-      return mid;
-    }
-  }
-  return -1;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h
deleted file mode 100644
index f145b25..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMMON_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMMON_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_PDF417Common {
- public:
-  CBC_PDF417Common();
-  virtual ~CBC_PDF417Common();
-  static int32_t getBitCountSum(CFX_Int32Array& moduleBitCount);
-  static int32_t getCodeword(FX_DWORD symbol);
-  static int32_t NUMBER_OF_CODEWORDS;
-  static int32_t MAX_CODEWORDS_IN_BARCODE;
-  static int32_t MIN_ROWS_IN_BARCODE;
-  static int32_t MAX_ROWS_IN_BARCODE;
-  static int32_t MAX_CODEWORDS_IN_ROW;
-  static int32_t MODULES_IN_CODEWORD;
-  static int32_t MODULES_IN_STOP_PATTERN;
-  static int32_t BARS_IN_MODULE;
-  static int32_t SYMBOL_TABLE[];
-  static int32_t CODEWORD_TABLE[];
-
- private:
-  static CFX_Int32Array* EMPTY_INT_ARRAY;
-  static int32_t findCodewordIndex(FX_DWORD symbol);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMMON_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp
deleted file mode 100644
index 01e85d6..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-
-CBC_Compaction::CBC_Compaction() {}
-CBC_Compaction::~CBC_Compaction() {}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h
deleted file mode 100644
index 4c60e2d..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
-
-class CBC_Compaction;
-enum Compaction { AUTO, TEXT, BYTES, NUMERIC };
-class CBC_Compaction {
- public:
-  CBC_Compaction();
-  virtual ~CBC_Compaction();
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417COMPACTION_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp
deleted file mode 100644
index 7a04fdd..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp
+++ /dev/null
@@ -1,493 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-
-#include <stdlib.h>
-
-#include "third_party/bigint/BigIntegerLibrary.hh"
-#include "xfa/src/fxbarcode/BC_DecoderResult.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-#define TEXT_COMPACTION_MODE_LATCH 900
-#define BYTE_COMPACTION_MODE_LATCH 901
-#define NUMERIC_COMPACTION_MODE_LATCH 902
-#define BYTE_COMPACTION_MODE_LATCH_6 924
-#define BEGIN_MACRO_PDF417_CONTROL_BLOCK 928
-#define BEGIN_MACRO_PDF417_OPTIONAL_FIELD 923
-#define MACRO_PDF417_TERMINATOR 922
-#define MODE_SHIFT_TO_BYTE_COMPACTION_MODE 913
-
-int32_t CBC_DecodedBitStreamPaser::MAX_NUMERIC_CODEWORDS = 15;
-int32_t CBC_DecodedBitStreamPaser::NUMBER_OF_SEQUENCE_CODEWORDS = 2;
-int32_t CBC_DecodedBitStreamPaser::PL = 25;
-int32_t CBC_DecodedBitStreamPaser::LL = 27;
-int32_t CBC_DecodedBitStreamPaser::AS = 27;
-int32_t CBC_DecodedBitStreamPaser::ML = 28;
-int32_t CBC_DecodedBitStreamPaser::AL = 28;
-int32_t CBC_DecodedBitStreamPaser::PS = 29;
-int32_t CBC_DecodedBitStreamPaser::PAL = 29;
-FX_CHAR CBC_DecodedBitStreamPaser::PUNCT_CHARS[29] = {
-    ';', '<',  '>',  '@', '[', '\\', '}', '_', '`', '~',
-    '!', '\r', '\t', ',', ':', '\n', '-', '.', '$', '/',
-    '"', '|',  '*',  '(', ')', '?',  '{', '}', '\''};
-FX_CHAR CBC_DecodedBitStreamPaser::MIXED_CHARS[30] = {
-    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', '\r', '\t',
-    ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', '=', '^'};
-
-void CBC_DecodedBitStreamPaser::Initialize() {}
-void CBC_DecodedBitStreamPaser::Finalize() {}
-CBC_DecodedBitStreamPaser::CBC_DecodedBitStreamPaser() {}
-CBC_DecodedBitStreamPaser::~CBC_DecodedBitStreamPaser() {}
-CBC_CommonDecoderResult* CBC_DecodedBitStreamPaser::decode(
-    CFX_Int32Array& codewords,
-    CFX_ByteString ecLevel,
-    int32_t& e) {
-  CFX_ByteString result;
-  int32_t codeIndex = 1;
-  int32_t code = codewords.GetAt(codeIndex);
-  codeIndex++;
-  CBC_PDF417ResultMetadata* resultMetadata = new CBC_PDF417ResultMetadata;
-  while (codeIndex < codewords[0]) {
-    switch (code) {
-      case TEXT_COMPACTION_MODE_LATCH:
-        codeIndex = textCompaction(codewords, codeIndex, result);
-        break;
-      case BYTE_COMPACTION_MODE_LATCH:
-        codeIndex = byteCompaction(code, codewords, codeIndex, result);
-        break;
-      case NUMERIC_COMPACTION_MODE_LATCH:
-        codeIndex = numericCompaction(codewords, codeIndex, result, e);
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        break;
-      case MODE_SHIFT_TO_BYTE_COMPACTION_MODE:
-        codeIndex = byteCompaction(code, codewords, codeIndex, result);
-        break;
-      case BYTE_COMPACTION_MODE_LATCH_6:
-        codeIndex = byteCompaction(code, codewords, codeIndex, result);
-        break;
-      case BEGIN_MACRO_PDF417_CONTROL_BLOCK:
-        codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata, e);
-        if (e != BCExceptionNO) {
-          delete resultMetadata;
-          return NULL;
-        }
-        break;
-      default:
-        codeIndex--;
-        codeIndex = textCompaction(codewords, codeIndex, result);
-        break;
-    }
-    if (codeIndex < codewords.GetSize()) {
-      code = codewords[codeIndex++];
-    } else {
-      e = BCExceptionFormatInstance;
-      delete resultMetadata;
-      return NULL;
-    }
-  }
-  if (result.GetLength() == 0) {
-    e = BCExceptionFormatInstance;
-    delete resultMetadata;
-    return NULL;
-  }
-  CFX_ByteArray rawBytes;
-  CFX_PtrArray byteSegments;
-  CBC_CommonDecoderResult* tempCd = new CBC_CommonDecoderResult();
-  tempCd->Init(rawBytes, result, byteSegments, ecLevel, e);
-  if (e != BCExceptionNO) {
-    delete resultMetadata;
-    return NULL;
-  }
-  tempCd->setOther(resultMetadata);
-  return tempCd;
-}
-int32_t CBC_DecodedBitStreamPaser::decodeMacroBlock(
-    CFX_Int32Array& codewords,
-    int32_t codeIndex,
-    CBC_PDF417ResultMetadata* resultMetadata,
-    int32_t& e) {
-  if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) {
-    e = BCExceptionFormatInstance;
-    return -1;
-  }
-  CFX_Int32Array segmentIndexArray;
-  segmentIndexArray.SetSize(NUMBER_OF_SEQUENCE_CODEWORDS);
-  for (int32_t i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) {
-    segmentIndexArray.SetAt(i, codewords[codeIndex]);
-  }
-  CFX_ByteString str =
-      decodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  resultMetadata->setSegmentIndex(atoi(str.GetBuffer(str.GetLength())));
-  CFX_ByteString fileId;
-  codeIndex = textCompaction(codewords, codeIndex, fileId);
-  resultMetadata->setFileId(fileId);
-  if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) {
-    codeIndex++;
-    CFX_Int32Array additionalOptionCodeWords;
-    additionalOptionCodeWords.SetSize(codewords[0] - codeIndex);
-    int32_t additionalOptionCodeWordsIndex = 0;
-    FX_BOOL end = FALSE;
-    while ((codeIndex < codewords[0]) && !end) {
-      int32_t code = codewords[codeIndex++];
-      if (code < TEXT_COMPACTION_MODE_LATCH) {
-        additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code;
-      } else {
-        switch (code) {
-          case MACRO_PDF417_TERMINATOR:
-            resultMetadata->setLastSegment(TRUE);
-            codeIndex++;
-            end = TRUE;
-            break;
-          default:
-            e = BCExceptionFormatInstance;
-            return -1;
-        }
-      }
-    }
-    CFX_Int32Array array;
-    array.SetSize(additionalOptionCodeWordsIndex);
-    array.Copy(additionalOptionCodeWords);
-    resultMetadata->setOptionalData(array);
-  } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) {
-    resultMetadata->setLastSegment(TRUE);
-    codeIndex++;
-  }
-  return codeIndex;
-}
-int32_t CBC_DecodedBitStreamPaser::textCompaction(CFX_Int32Array& codewords,
-                                                  int32_t codeIndex,
-                                                  CFX_ByteString& result) {
-  CFX_Int32Array textCompactionData;
-  textCompactionData.SetSize((codewords[0] - codeIndex) << 1);
-  CFX_Int32Array byteCompactionData;
-  byteCompactionData.SetSize((codewords[0] - codeIndex) << 1);
-  int32_t index = 0;
-  FX_BOOL end = FALSE;
-  while ((codeIndex < codewords[0]) && !end) {
-    int32_t code = codewords[codeIndex++];
-    if (code < TEXT_COMPACTION_MODE_LATCH) {
-      textCompactionData[index] = code / 30;
-      textCompactionData[index + 1] = code % 30;
-      index += 2;
-    } else {
-      switch (code) {
-        case TEXT_COMPACTION_MODE_LATCH:
-          textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH;
-          break;
-        case BYTE_COMPACTION_MODE_LATCH:
-          codeIndex--;
-          end = TRUE;
-          break;
-        case NUMERIC_COMPACTION_MODE_LATCH:
-          codeIndex--;
-          end = TRUE;
-          break;
-        case BEGIN_MACRO_PDF417_CONTROL_BLOCK:
-          codeIndex--;
-          end = TRUE;
-          break;
-        case BEGIN_MACRO_PDF417_OPTIONAL_FIELD:
-          codeIndex--;
-          end = TRUE;
-          break;
-        case MACRO_PDF417_TERMINATOR:
-          codeIndex--;
-          end = TRUE;
-          break;
-        case MODE_SHIFT_TO_BYTE_COMPACTION_MODE:
-          textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE;
-          code = codewords[codeIndex++];
-          byteCompactionData[index] = code;
-          index++;
-          break;
-        case BYTE_COMPACTION_MODE_LATCH_6:
-          codeIndex--;
-          end = TRUE;
-          break;
-      }
-    }
-  }
-  decodeTextCompaction(textCompactionData, byteCompactionData, index, result);
-  return codeIndex;
-}
-void CBC_DecodedBitStreamPaser::decodeTextCompaction(
-    CFX_Int32Array& textCompactionData,
-    CFX_Int32Array& byteCompactionData,
-    int32_t length,
-    CFX_ByteString& result) {
-  Mode subMode = ALPHA;
-  Mode priorToShiftMode = ALPHA;
-  int32_t i = 0;
-  while (i < length) {
-    int32_t subModeCh = textCompactionData[i];
-    FX_CHAR ch = 0;
-    switch (subMode) {
-      case ALPHA:
-        if (subModeCh < 26) {
-          ch = (FX_CHAR)('A' + subModeCh);
-        } else {
-          if (subModeCh == 26) {
-            ch = ' ';
-          } else if (subModeCh == LL) {
-            subMode = LOWER;
-          } else if (subModeCh == ML) {
-            subMode = MIXED;
-          } else if (subModeCh == PS) {
-            priorToShiftMode = subMode;
-            subMode = PUNCT_SHIFT;
-          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
-            result += (FX_CHAR)byteCompactionData[i];
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-      case LOWER:
-        if (subModeCh < 26) {
-          ch = (FX_CHAR)('a' + subModeCh);
-        } else {
-          if (subModeCh == 26) {
-            ch = ' ';
-          } else if (subModeCh == AS) {
-            priorToShiftMode = subMode;
-            subMode = ALPHA_SHIFT;
-          } else if (subModeCh == ML) {
-            subMode = MIXED;
-          } else if (subModeCh == PS) {
-            priorToShiftMode = subMode;
-            subMode = PUNCT_SHIFT;
-          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
-            result += (FX_CHAR)byteCompactionData[i];
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-      case MIXED:
-        if (subModeCh < PL) {
-          ch = MIXED_CHARS[subModeCh];
-        } else {
-          if (subModeCh == PL) {
-            subMode = PUNCT;
-          } else if (subModeCh == 26) {
-            ch = ' ';
-          } else if (subModeCh == LL) {
-            subMode = LOWER;
-          } else if (subModeCh == AL) {
-            subMode = ALPHA;
-          } else if (subModeCh == PS) {
-            priorToShiftMode = subMode;
-            subMode = PUNCT_SHIFT;
-          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
-            result += (FX_CHAR)byteCompactionData[i];
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-      case PUNCT:
-        if (subModeCh < PAL) {
-          ch = PUNCT_CHARS[subModeCh];
-        } else {
-          if (subModeCh == PAL) {
-            subMode = ALPHA;
-          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
-            result += (FX_CHAR)byteCompactionData[i];
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-      case ALPHA_SHIFT:
-        subMode = priorToShiftMode;
-        if (subModeCh < 26) {
-          ch = (FX_CHAR)('A' + subModeCh);
-        } else {
-          if (subModeCh == 26) {
-            ch = ' ';
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-      case PUNCT_SHIFT:
-        subMode = priorToShiftMode;
-        if (subModeCh < PAL) {
-          ch = PUNCT_CHARS[subModeCh];
-        } else {
-          if (subModeCh == PAL) {
-            subMode = ALPHA;
-          } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) {
-            result += (FX_CHAR)byteCompactionData[i];
-          } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) {
-            subMode = ALPHA;
-          }
-        }
-        break;
-    }
-    if (ch != 0) {
-      result += ch;
-    }
-    i++;
-  }
-}
-int32_t CBC_DecodedBitStreamPaser::byteCompaction(int32_t mode,
-                                                  CFX_Int32Array& codewords,
-                                                  int32_t codeIndex,
-                                                  CFX_ByteString& result) {
-  if (mode == BYTE_COMPACTION_MODE_LATCH) {
-    int32_t count = 0;
-    int64_t value = 0;
-    FX_WORD* decodedData = FX_Alloc(FX_WORD, 6);
-    CFX_Int32Array byteCompactedCodewords;
-    byteCompactedCodewords.SetSize(6);
-    FX_BOOL end = FALSE;
-    int32_t nextCode = codewords[codeIndex++];
-    while ((codeIndex < codewords[0]) && !end) {
-      byteCompactedCodewords[count++] = nextCode;
-      value = 900 * value + nextCode;
-      nextCode = codewords[codeIndex++];
-      if (nextCode == TEXT_COMPACTION_MODE_LATCH ||
-          nextCode == BYTE_COMPACTION_MODE_LATCH ||
-          nextCode == NUMERIC_COMPACTION_MODE_LATCH ||
-          nextCode == BYTE_COMPACTION_MODE_LATCH_6 ||
-          nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
-          nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
-          nextCode == MACRO_PDF417_TERMINATOR) {
-        codeIndex--;
-        end = TRUE;
-      } else {
-        if ((count % 5 == 0) && (count > 0)) {
-          int32_t j = 0;
-          for (; j < 6; ++j) {
-            decodedData[5 - j] = (FX_WORD)(value % 256);
-            value >>= 8;
-          }
-          for (j = 0; j < 6; ++j) {
-            result += (FX_CHAR)decodedData[j];
-          }
-          count = 0;
-        }
-      }
-    }
-    FX_Free(decodedData);
-    if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) {
-      byteCompactedCodewords[count++] = nextCode;
-    }
-    for (int32_t i = 0; i < count; i++) {
-      result += (FX_CHAR)(FX_WORD)byteCompactedCodewords[i];
-    }
-  } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) {
-    int32_t count = 0;
-    int64_t value = 0;
-    FX_BOOL end = FALSE;
-    while (codeIndex < codewords[0] && !end) {
-      int32_t code = codewords[codeIndex++];
-      if (code < TEXT_COMPACTION_MODE_LATCH) {
-        count++;
-        value = 900 * value + code;
-      } else {
-        if (code == TEXT_COMPACTION_MODE_LATCH ||
-            code == BYTE_COMPACTION_MODE_LATCH ||
-            code == NUMERIC_COMPACTION_MODE_LATCH ||
-            code == BYTE_COMPACTION_MODE_LATCH_6 ||
-            code == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
-            code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
-            code == MACRO_PDF417_TERMINATOR) {
-          codeIndex--;
-          end = TRUE;
-        }
-      }
-      if ((count % 5 == 0) && (count > 0)) {
-        FX_WORD* decodedData = FX_Alloc(FX_WORD, 6);
-        int32_t j = 0;
-        for (; j < 6; ++j) {
-          decodedData[5 - j] = (FX_WORD)(value & 0xFF);
-          value >>= 8;
-        }
-        for (j = 0; j < 6; ++j) {
-          result += (FX_CHAR)decodedData[j];
-        }
-        count = 0;
-        FX_Free(decodedData);
-      }
-    }
-  }
-  return codeIndex;
-}
-int32_t CBC_DecodedBitStreamPaser::numericCompaction(CFX_Int32Array& codewords,
-                                                     int32_t codeIndex,
-                                                     CFX_ByteString& result,
-                                                     int32_t& e) {
-  int32_t count = 0;
-  FX_BOOL end = FALSE;
-  CFX_Int32Array numericCodewords;
-  numericCodewords.SetSize(MAX_NUMERIC_CODEWORDS);
-  while (codeIndex < codewords[0] && !end) {
-    int32_t code = codewords[codeIndex++];
-    if (codeIndex == codewords[0]) {
-      end = TRUE;
-    }
-    if (code < TEXT_COMPACTION_MODE_LATCH) {
-      numericCodewords[count] = code;
-      count++;
-    } else {
-      if (code == TEXT_COMPACTION_MODE_LATCH ||
-          code == BYTE_COMPACTION_MODE_LATCH ||
-          code == BYTE_COMPACTION_MODE_LATCH_6 ||
-          code == BEGIN_MACRO_PDF417_CONTROL_BLOCK ||
-          code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD ||
-          code == MACRO_PDF417_TERMINATOR) {
-        codeIndex--;
-        end = TRUE;
-      }
-    }
-    if (count % MAX_NUMERIC_CODEWORDS == 0 ||
-        code == NUMERIC_COMPACTION_MODE_LATCH || end) {
-      CFX_ByteString s = decodeBase900toBase10(numericCodewords, count, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-      result += s;
-      count = 0;
-    }
-  }
-  return codeIndex;
-}
-CFX_ByteString CBC_DecodedBitStreamPaser::decodeBase900toBase10(
-    CFX_Int32Array& codewords,
-    int32_t count,
-    int32_t& e) {
-  BigInteger result = 0;
-  BigInteger nineHundred(900);
-  for (int32_t i = 0; i < count; i++) {
-    result = result * nineHundred + BigInteger(codewords[i]);
-  }
-  CFX_ByteString resultString(bigIntegerToString(result).c_str());
-  if (resultString.GetAt(0) != '1') {
-    e = BCExceptionFormatInstance;
-    return ' ';
-  }
-  return resultString.Mid(1, resultString.GetLength() - 1);
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h
deleted file mode 100644
index 52901c6..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_CommonDecoderResult;
-class CBC_PDF417ResultMetadata;
-
-class CBC_DecodedBitStreamPaser {
- public:
-  CBC_DecodedBitStreamPaser();
-  virtual ~CBC_DecodedBitStreamPaser();
-  static void Initialize();
-  static void Finalize();
-  static CBC_CommonDecoderResult* decode(CFX_Int32Array& codewords,
-                                         CFX_ByteString ecLevel,
-                                         int32_t& e);
-
- private:
-  enum Mode { ALPHA, LOWER, MIXED, PUNCT, ALPHA_SHIFT, PUNCT_SHIFT };
-  static int32_t MAX_NUMERIC_CODEWORDS;
-  static int32_t PL;
-  static int32_t LL;
-  static int32_t AS;
-  static int32_t ML;
-  static int32_t AL;
-  static int32_t PS;
-  static int32_t PAL;
-  static FX_CHAR PUNCT_CHARS[29];
-  static FX_CHAR MIXED_CHARS[30];
-  static int32_t NUMBER_OF_SEQUENCE_CODEWORDS;
-  static int32_t decodeMacroBlock(CFX_Int32Array& codewords,
-                                  int32_t codeIndex,
-                                  CBC_PDF417ResultMetadata* resultMetadata,
-                                  int32_t& e);
-  static int32_t textCompaction(CFX_Int32Array& codewords,
-                                int32_t codeIndex,
-                                CFX_ByteString& result);
-  static void decodeTextCompaction(CFX_Int32Array& textCompactionData,
-                                   CFX_Int32Array& byteCompactionData,
-                                   int32_t length,
-                                   CFX_ByteString& result);
-  static int32_t byteCompaction(int32_t mode,
-                                CFX_Int32Array& codewords,
-                                int32_t codeIndex,
-                                CFX_ByteString& result);
-  static int32_t numericCompaction(CFX_Int32Array& codewords,
-                                   int32_t codeIndex,
-                                   CFX_ByteString& result,
-                                   int32_t& e);
-  static CFX_ByteString decodeBase900toBase10(CFX_Int32Array& codewords,
-                                              int32_t count,
-                                              int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp
deleted file mode 100644
index b9eee7c..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-
-int32_t CBC_DetectionResult::ADJUST_ROW_NUMBER_SKIP = 2;
-
-CBC_DetectionResult::CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata,
-                                         CBC_BoundingBox* boundingBox) {
-  m_barcodeMetadata = barcodeMetadata;
-  m_barcodeColumnCount = barcodeMetadata->getColumnCount();
-  m_boundingBox = boundingBox;
-  m_detectionResultColumns.SetSize(m_barcodeColumnCount + 2);
-  for (int32_t i = 0; i < m_barcodeColumnCount + 2; i++) {
-    m_detectionResultColumns[i] = NULL;
-  }
-}
-CBC_DetectionResult::~CBC_DetectionResult() {
-  delete m_boundingBox;
-  delete m_barcodeMetadata;
-  m_detectionResultColumns.RemoveAll();
-}
-CFX_PtrArray& CBC_DetectionResult::getDetectionResultColumns() {
-  adjustIndicatorColumnRowNumbers(
-      (CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0));
-  adjustIndicatorColumnRowNumbers(
-      (CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
-          m_barcodeColumnCount + 1));
-  int32_t unadjustedCodewordCount = CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE;
-  int32_t previousUnadjustedCount;
-  do {
-    previousUnadjustedCount = unadjustedCodewordCount;
-    unadjustedCodewordCount = adjustRowNumbers();
-  } while (unadjustedCodewordCount > 0 &&
-           unadjustedCodewordCount < previousUnadjustedCount);
-  return m_detectionResultColumns;
-}
-void CBC_DetectionResult::setBoundingBox(CBC_BoundingBox* boundingBox) {
-  m_boundingBox = boundingBox;
-}
-CBC_BoundingBox* CBC_DetectionResult::getBoundingBox() {
-  return m_boundingBox;
-}
-void CBC_DetectionResult::setDetectionResultColumn(
-    int32_t barcodeColumn,
-    CBC_DetectionResultColumn* detectionResultColumn) {
-  m_detectionResultColumns[barcodeColumn] = detectionResultColumn;
-}
-CBC_DetectionResultColumn* CBC_DetectionResult::getDetectionResultColumn(
-    int32_t barcodeColumn) {
-  return (CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn];
-}
-CFX_ByteString CBC_DetectionResult::toString() {
-  CBC_DetectionResultColumn* rowIndicatorColumn =
-      (CBC_DetectionResultColumn*)m_detectionResultColumns[0];
-  if (rowIndicatorColumn == NULL) {
-    rowIndicatorColumn = (CBC_DetectionResultColumn*)
-        m_detectionResultColumns[m_barcodeColumnCount + 1];
-  }
-  CFX_ByteString result;
-  for (int32_t codewordsRow = 0;
-       codewordsRow < rowIndicatorColumn->getCodewords()->GetSize();
-       codewordsRow++) {
-    result += (FX_CHAR)codewordsRow;
-    for (int32_t barcodeColumn = 0; barcodeColumn < m_barcodeColumnCount + 2;
-         barcodeColumn++) {
-      if (m_detectionResultColumns[barcodeColumn] == NULL) {
-        result += "    |   ";
-        continue;
-      }
-      CBC_Codeword* codeword =
-          (CBC_Codeword*)((CBC_DetectionResultColumn*)
-                              m_detectionResultColumns[barcodeColumn])
-              ->getCodewords()
-              ->GetAt(codewordsRow);
-      if (codeword == NULL) {
-        result += "    |   ";
-        continue;
-      }
-      result += codeword->getRowNumber();
-      result += codeword->getValue();
-    }
-  }
-  return result;
-}
-void CBC_DetectionResult::adjustIndicatorColumnRowNumbers(
-    CBC_DetectionResultColumn* detectionResultColumn) {
-  if (detectionResultColumn) {
-    ((CBC_DetectionResultRowIndicatorColumn*)detectionResultColumn)
-        ->adjustCompleteIndicatorColumnRowNumbers(*m_barcodeMetadata);
-  }
-}
-int32_t CBC_DetectionResult::adjustRowNumbers() {
-  int32_t unadjustedCount = adjustRowNumbersByRow();
-  if (unadjustedCount == 0) {
-    return 0;
-  }
-  for (int32_t barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1;
-       barcodeColumn++) {
-    CFX_PtrArray* codewords =
-        ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])
-            ->getCodewords();
-    for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
-         codewordsRow++) {
-      if (codewords->GetAt(codewordsRow) == NULL) {
-        continue;
-      }
-      if (!((CBC_Codeword*)codewords->GetAt(codewordsRow))
-               ->hasValidRowNumber()) {
-        adjustRowNumbers(barcodeColumn, codewordsRow, codewords);
-      }
-    }
-  }
-  return unadjustedCount;
-}
-int32_t CBC_DetectionResult::adjustRowNumbersByRow() {
-  adjustRowNumbersFromBothRI();
-  int32_t unadjustedCount = adjustRowNumbersFromLRI();
-  return unadjustedCount + adjustRowNumbersFromRRI();
-}
-int32_t CBC_DetectionResult::adjustRowNumbersFromBothRI() {
-  if (m_detectionResultColumns[0] == NULL ||
-      m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) {
-    return 0;
-  }
-  CFX_PtrArray* LRIcodewords =
-      ((CBC_DetectionResultColumn*)m_detectionResultColumns[0])->getCodewords();
-  CFX_PtrArray* RRIcodewords =
-      ((CBC_DetectionResultColumn*)
-           m_detectionResultColumns[m_barcodeColumnCount + 1])
-          ->getCodewords();
-  for (int32_t codewordsRow = 0; codewordsRow < LRIcodewords->GetSize();
-       codewordsRow++) {
-    if (LRIcodewords->GetAt(codewordsRow) &&
-        RRIcodewords->GetAt(codewordsRow) &&
-        ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber() ==
-            ((CBC_Codeword*)RRIcodewords->GetAt(codewordsRow))
-                ->getRowNumber()) {
-      for (int32_t barcodeColumn = 1; barcodeColumn <= m_barcodeColumnCount;
-           barcodeColumn++) {
-        CBC_Codeword* codeword =
-            (CBC_Codeword*)((CBC_DetectionResultColumn*)
-                                m_detectionResultColumns[barcodeColumn])
-                ->getCodewords()
-                ->GetAt(codewordsRow);
-        if (codeword == NULL) {
-          continue;
-        }
-        codeword->setRowNumber(
-            ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber());
-        if (!codeword->hasValidRowNumber()) {
-          ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])
-              ->getCodewords()
-              ->SetAt(codewordsRow, NULL);
-        }
-      }
-    }
-  }
-  return 0;
-}
-int32_t CBC_DetectionResult::adjustRowNumbersFromRRI() {
-  if (m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) {
-    return 0;
-  }
-  int32_t unadjustedCount = 0;
-  CFX_PtrArray* codewords =
-      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
-           m_barcodeColumnCount + 1))
-          ->getCodewords();
-  for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
-       codewordsRow++) {
-    if (codewords->GetAt(codewordsRow) == NULL) {
-      continue;
-    }
-    int32_t rowIndicatorRowNumber =
-        ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber();
-    int32_t invalidRowCounts = 0;
-    for (int32_t barcodeColumn = m_barcodeColumnCount + 1;
-         barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP;
-         barcodeColumn--) {
-      CBC_Codeword* codeword =
-          (CBC_Codeword*)((CBC_DetectionResultColumn*)
-                              m_detectionResultColumns.GetAt(barcodeColumn))
-              ->getCodewords()
-              ->GetAt(codewordsRow);
-      if (codeword) {
-        invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber,
-                                                  invalidRowCounts, codeword);
-        if (!codeword->hasValidRowNumber()) {
-          unadjustedCount++;
-        }
-      }
-    }
-  }
-  return unadjustedCount;
-}
-int32_t CBC_DetectionResult::adjustRowNumbersFromLRI() {
-  if (m_detectionResultColumns[0] == NULL) {
-    return 0;
-  }
-  int32_t unadjustedCount = 0;
-  CFX_PtrArray* codewords =
-      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0))
-          ->getCodewords();
-  for (int32_t codewordsRow = 0; codewordsRow < codewords->GetSize();
-       codewordsRow++) {
-    if (codewords->GetAt(codewordsRow) == NULL) {
-      continue;
-    }
-    int32_t rowIndicatorRowNumber =
-        ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber();
-    int32_t invalidRowCounts = 0;
-    for (int32_t barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1 &&
-                                    invalidRowCounts < ADJUST_ROW_NUMBER_SKIP;
-         barcodeColumn++) {
-      CBC_Codeword* codeword =
-          (CBC_Codeword*)((CBC_DetectionResultColumn*)
-                              m_detectionResultColumns[barcodeColumn])
-              ->getCodewords()
-              ->GetAt(codewordsRow);
-      if (codeword) {
-        invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber,
-                                                  invalidRowCounts, codeword);
-        if (!codeword->hasValidRowNumber()) {
-          unadjustedCount++;
-        }
-      }
-    }
-  }
-  return unadjustedCount;
-}
-int32_t CBC_DetectionResult::adjustRowNumberIfValid(
-    int32_t rowIndicatorRowNumber,
-    int32_t invalidRowCounts,
-    CBC_Codeword* codeword) {
-  if (codeword == NULL) {
-    return invalidRowCounts;
-  }
-  if (!codeword->hasValidRowNumber()) {
-    if (codeword->isValidRowNumber(rowIndicatorRowNumber)) {
-      codeword->setRowNumber(rowIndicatorRowNumber);
-      invalidRowCounts = 0;
-    } else {
-      ++invalidRowCounts;
-    }
-  }
-  return invalidRowCounts;
-}
-void CBC_DetectionResult::adjustRowNumbers(int32_t barcodeColumn,
-                                           int32_t codewordsRow,
-                                           CFX_PtrArray* codewords) {
-  CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
-  CFX_PtrArray* previousColumnCodewords =
-      ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(
-           barcodeColumn - 1))
-          ->getCodewords();
-  CFX_PtrArray* nextColumnCodewords = previousColumnCodewords;
-  if (m_detectionResultColumns[barcodeColumn + 1]) {
-    nextColumnCodewords = ((CBC_DetectionResultColumn*)
-                               m_detectionResultColumns[barcodeColumn + 1])
-                              ->getCodewords();
-  }
-  CFX_PtrArray otherCodewords;
-  otherCodewords.SetSize(14);
-  otherCodewords[2] = previousColumnCodewords->GetAt(codewordsRow);
-  otherCodewords[3] = nextColumnCodewords->GetAt(codewordsRow);
-  if (codewordsRow > 0) {
-    otherCodewords[0] = codewords->GetAt(codewordsRow - 1);
-    otherCodewords[4] = previousColumnCodewords->GetAt(codewordsRow - 1);
-    otherCodewords[5] = nextColumnCodewords->GetAt(codewordsRow - 1);
-  }
-  if (codewordsRow > 1) {
-    otherCodewords[8] = codewords->GetAt(codewordsRow - 2);
-    otherCodewords[10] = previousColumnCodewords->GetAt(codewordsRow - 2);
-    otherCodewords[11] = nextColumnCodewords->GetAt(codewordsRow - 2);
-  }
-  if (codewordsRow < codewords->GetSize() - 1) {
-    otherCodewords[1] = codewords->GetAt(codewordsRow + 1);
-    otherCodewords[6] = previousColumnCodewords->GetAt(codewordsRow + 1);
-    otherCodewords[7] = nextColumnCodewords->GetAt(codewordsRow + 1);
-  }
-  if (codewordsRow < codewords->GetSize() - 2) {
-    otherCodewords[9] = codewords->GetAt(codewordsRow + 2);
-    otherCodewords[12] = previousColumnCodewords->GetAt(codewordsRow + 2);
-    otherCodewords[13] = nextColumnCodewords->GetAt(codewordsRow + 2);
-  }
-  for (int32_t i = 0; i < otherCodewords.GetSize(); i++) {
-    CBC_Codeword* otherCodeword = (CBC_Codeword*)otherCodewords.GetAt(i);
-    if (adjustRowNumber(codeword, otherCodeword)) {
-      return;
-    }
-  }
-}
-FX_BOOL CBC_DetectionResult::adjustRowNumber(CBC_Codeword* codeword,
-                                             CBC_Codeword* otherCodeword) {
-  if (otherCodeword == NULL) {
-    return FALSE;
-  }
-  if (otherCodeword->hasValidRowNumber() &&
-      otherCodeword->getBucket() == codeword->getBucket()) {
-    codeword->setRowNumber(otherCodeword->getRowNumber());
-    return TRUE;
-  }
-  return FALSE;
-}
-int32_t CBC_DetectionResult::getBarcodeColumnCount() {
-  return m_barcodeColumnCount;
-}
-int32_t CBC_DetectionResult::getBarcodeRowCount() {
-  return m_barcodeMetadata->getRowCount();
-}
-int32_t CBC_DetectionResult::getBarcodeECLevel() {
-  return m_barcodeMetadata->getErrorCorrectionLevel();
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h
deleted file mode 100644
index 969d513..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
-
-class CBC_BarcodeMetadata;
-class CBC_BoundingBox;
-class CBC_Codeword;
-class CBC_DetectionResultColumn;
-class CBC_DetectionResult {
- public:
-  CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata,
-                      CBC_BoundingBox* boundingBox);
-  virtual ~CBC_DetectionResult();
-  CFX_PtrArray& getDetectionResultColumns();
-  void setBoundingBox(CBC_BoundingBox* boundingBox);
-  CBC_BoundingBox* getBoundingBox();
-  void setDetectionResultColumn(
-      int32_t barcodeColumn,
-      CBC_DetectionResultColumn* detectionResultColumn);
-  CBC_DetectionResultColumn* getDetectionResultColumn(int32_t barcodeColumn);
-  CFX_ByteString toString();
-
-  int32_t getBarcodeColumnCount();
-  int32_t getBarcodeRowCount();
-  int32_t getBarcodeECLevel();
-
- private:
-  static int32_t ADJUST_ROW_NUMBER_SKIP;
-  CBC_BarcodeMetadata* m_barcodeMetadata;
-  CFX_PtrArray m_detectionResultColumns;
-  CBC_BoundingBox* m_boundingBox;
-  int32_t m_barcodeColumnCount;
-
- private:
-  void adjustIndicatorColumnRowNumbers(
-      CBC_DetectionResultColumn* detectionResultColumn);
-  int32_t adjustRowNumbers();
-  int32_t adjustRowNumbersByRow();
-  int32_t adjustRowNumbersFromBothRI();
-  int32_t adjustRowNumbersFromRRI();
-  int32_t adjustRowNumbersFromLRI();
-  static int32_t adjustRowNumberIfValid(int32_t rowIndicatorRowNumber,
-                                        int32_t invalidRowCounts,
-                                        CBC_Codeword* codeword);
-  void adjustRowNumbers(int32_t barcodeColumn,
-                        int32_t codewordsRow,
-                        CFX_PtrArray* codewords);
-  static FX_BOOL adjustRowNumber(CBC_Codeword* codeword,
-                                 CBC_Codeword* otherCodeword);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp
deleted file mode 100644
index e375b7c..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-
-int32_t CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5;
-
-CBC_DetectionResultColumn::CBC_DetectionResultColumn(
-    CBC_BoundingBox* boundingBox) {
-  m_boundingBox = boundingBox;
-  m_codewords = new CFX_PtrArray;
-  m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1);
-}
-CBC_DetectionResultColumn::~CBC_DetectionResultColumn() {
-  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
-    delete (CBC_Codeword*)m_codewords->GetAt(i);
-  }
-  m_codewords->RemoveAll();
-  delete m_codewords;
-}
-CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(int32_t imageRow) {
-  CBC_Codeword* codeword = getCodeword(imageRow);
-  if (codeword) {
-    return codeword;
-  }
-  for (int32_t i = 1; i < MAX_NEARBY_DISTANCE; i++) {
-    int32_t nearImageRow = imageRowToCodewordIndex(imageRow) - i;
-    if (nearImageRow >= 0) {
-      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
-      if (codeword) {
-        return codeword;
-      }
-    }
-    nearImageRow = imageRowToCodewordIndex(imageRow) + i;
-    if (nearImageRow < m_codewords->GetSize()) {
-      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
-      if (codeword) {
-        return codeword;
-      }
-    }
-  }
-  return NULL;
-}
-int32_t CBC_DetectionResultColumn::imageRowToCodewordIndex(int32_t imageRow) {
-  return imageRow - m_boundingBox->getMinY();
-}
-int32_t CBC_DetectionResultColumn::codewordIndexToImageRow(
-    int32_t codewordIndex) {
-  return m_boundingBox->getMinY() + codewordIndex;
-}
-void CBC_DetectionResultColumn::setCodeword(int32_t imageRow,
-                                            CBC_Codeword* codeword) {
-  m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword);
-}
-CBC_Codeword* CBC_DetectionResultColumn::getCodeword(int32_t imageRow) {
-  return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow));
-}
-CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() {
-  return m_boundingBox;
-}
-CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() {
-  return m_codewords;
-}
-CFX_ByteString CBC_DetectionResultColumn::toString() {
-  CFX_ByteString result;
-  int32_t row = 0;
-  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
-    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
-    if (codeword == NULL) {
-      result += (FX_CHAR)row;
-      row++;
-      continue;
-    }
-    result += (FX_CHAR)row;
-    result += codeword->getRowNumber();
-    result += codeword->getValue();
-    row++;
-  }
-  return result;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h
deleted file mode 100644
index 279b2c1..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
-
-class CBC_Codeword;
-class CBC_BoundingBox;
-class CBC_DetectionResultColumn {
- public:
-  CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox);
-  virtual ~CBC_DetectionResultColumn();
-  CBC_Codeword* getCodewordNearby(int32_t imageRow);
-  int32_t imageRowToCodewordIndex(int32_t imageRow);
-  int32_t codewordIndexToImageRow(int32_t codewordIndex);
-  void setCodeword(int32_t imageRow, CBC_Codeword* codeword);
-  CBC_Codeword* getCodeword(int32_t imageRow);
-  CBC_BoundingBox* getBoundingBox();
-  CFX_PtrArray* getCodewords();
-  CFX_ByteString toString();
-
- public:
-  CBC_BoundingBox* m_boundingBox;
-  CFX_PtrArray* m_codewords;
-
- private:
-  static int32_t MAX_NEARBY_DISTANCE;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTCOLUMN_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp
deleted file mode 100644
index 403c34c..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn(
-    CBC_BoundingBox* boundingBox,
-    FX_BOOL isLeft)
-    : CBC_DetectionResultColumn(boundingBox) {
-  m_isLeft = isLeft;
-}
-CBC_DetectionResultRowIndicatorColumn::
-    ~CBC_DetectionResultRowIndicatorColumn() {}
-void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() {
-  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
-    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
-    if (codeword) {
-      codeword->setRowNumberAsRowIndicatorColumn();
-    }
-  }
-}
-int32_t
-CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers(
-    CBC_BarcodeMetadata barcodeMetadata) {
-  CFX_PtrArray* codewords = getCodewords();
-  setRowNumbers();
-  removeIncorrectCodewords(codewords, barcodeMetadata);
-  CBC_BoundingBox* boundingBox = getBoundingBox();
-  CBC_ResultPoint* top =
-      m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight();
-  CBC_ResultPoint* bottom =
-      m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight();
-  int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY());
-  int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY());
-  FX_FLOAT averageRowHeight =
-      (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount();
-  int32_t barcodeRow = -1;
-  int32_t maxRowHeight = 1;
-  int32_t currentRowHeight = 0;
-  for (int32_t codewordsRow = firstRow; codewordsRow < lastRow;
-       codewordsRow++) {
-    if (codewords->GetAt(codewordsRow) == NULL) {
-      continue;
-    }
-    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
-    int32_t rowDifference = codeword->getRowNumber() - barcodeRow;
-    if (rowDifference == 0) {
-      currentRowHeight++;
-    } else if (rowDifference == 1) {
-      maxRowHeight =
-          maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight;
-      currentRowHeight = 1;
-      barcodeRow = codeword->getRowNumber();
-    } else if (rowDifference < 0) {
-      codewords->SetAt(codewordsRow, NULL);
-    } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) {
-      codewords->SetAt(codewordsRow, NULL);
-    } else if (rowDifference > codewordsRow) {
-      codewords->SetAt(codewordsRow, NULL);
-    } else {
-      int32_t checkedRows;
-      if (maxRowHeight > 2) {
-        checkedRows = (maxRowHeight - 2) * rowDifference;
-      } else {
-        checkedRows = rowDifference;
-      }
-      FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow;
-      for (int32_t i = 1; i <= checkedRows && !closePreviousCodewordFound;
-           i++) {
-        closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL;
-      }
-      if (closePreviousCodewordFound) {
-        codewords->SetAt(codewordsRow, NULL);
-      } else {
-        barcodeRow = codeword->getRowNumber();
-        currentRowHeight = 1;
-      }
-    }
-  }
-  return (int32_t)(averageRowHeight + 0.5);
-}
-CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights(
-    int32_t& e) {
-  CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata();
-  if (barcodeMetadata == NULL) {
-    e = BCExceptionCannotMetadata;
-    return NULL;
-  }
-  adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata);
-  CFX_Int32Array* result = new CFX_Int32Array;
-  result->SetSize(barcodeMetadata->getRowCount());
-  for (int32_t i = 0; i < getCodewords()->GetSize(); i++) {
-    CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i);
-    if (codeword) {
-      result->SetAt(codeword->getRowNumber(),
-                    result->GetAt(codeword->getRowNumber()) + 1);
-    }
-  }
-  return result;
-}
-int32_t CBC_DetectionResultRowIndicatorColumn::
-    adjustIncompleteIndicatorColumnRowNumbers(
-        CBC_BarcodeMetadata barcodeMetadata) {
-  CBC_BoundingBox* boundingBox = getBoundingBox();
-  CBC_ResultPoint* top =
-      m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight();
-  CBC_ResultPoint* bottom =
-      m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight();
-  int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY());
-  int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY());
-  FX_FLOAT averageRowHeight =
-      (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount();
-  CFX_PtrArray* codewords = getCodewords();
-  int32_t barcodeRow = -1;
-  int32_t maxRowHeight = 1;
-  int32_t currentRowHeight = 0;
-  for (int32_t codewordsRow = firstRow; codewordsRow < lastRow;
-       codewordsRow++) {
-    if (codewords->GetAt(codewordsRow) == NULL) {
-      continue;
-    }
-    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow);
-    codeword->setRowNumberAsRowIndicatorColumn();
-    int32_t rowDifference = codeword->getRowNumber() - barcodeRow;
-    if (rowDifference == 0) {
-      currentRowHeight++;
-    } else if (rowDifference == 1) {
-      maxRowHeight =
-          maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight;
-      currentRowHeight = 1;
-      barcodeRow = codeword->getRowNumber();
-    } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) {
-      codewords->SetAt(codewordsRow, NULL);
-    } else {
-      barcodeRow = codeword->getRowNumber();
-      currentRowHeight = 1;
-    }
-  }
-  return (int32_t)(averageRowHeight + 0.5);
-}
-CBC_BarcodeMetadata*
-CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() {
-  CFX_PtrArray* codewords = getCodewords();
-  CBC_BarcodeValue barcodeColumnCount;
-  CBC_BarcodeValue barcodeRowCountUpperPart;
-  CBC_BarcodeValue barcodeRowCountLowerPart;
-  CBC_BarcodeValue barcodeECLevel;
-  for (int32_t i = 0; i < codewords->GetSize(); i++) {
-    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i);
-    if (codeword == NULL) {
-      continue;
-    }
-    codeword->setRowNumberAsRowIndicatorColumn();
-    int32_t rowIndicatorValue = codeword->getValue() % 30;
-    int32_t codewordRowNumber = codeword->getRowNumber();
-    if (!m_isLeft) {
-      codewordRowNumber += 2;
-    }
-    switch (codewordRowNumber % 3) {
-      case 0:
-        barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1);
-        break;
-      case 1:
-        barcodeECLevel.setValue(rowIndicatorValue / 3);
-        barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3);
-        break;
-      case 2:
-        barcodeColumnCount.setValue(rowIndicatorValue + 1);
-        break;
-    }
-  }
-  if ((barcodeColumnCount.getValue()->GetSize() == 0) ||
-      (barcodeRowCountUpperPart.getValue()->GetSize() == 0) ||
-      (barcodeRowCountLowerPart.getValue()->GetSize() == 0) ||
-      (barcodeECLevel.getValue()->GetSize() == 0) ||
-      barcodeColumnCount.getValue()->GetAt(0) < 1 ||
-      barcodeRowCountUpperPart.getValue()->GetAt(0) +
-              barcodeRowCountLowerPart.getValue()->GetAt(0) <
-          CBC_PDF417Common::MIN_ROWS_IN_BARCODE ||
-      barcodeRowCountUpperPart.getValue()->GetAt(0) +
-              barcodeRowCountLowerPart.getValue()->GetAt(0) >
-          CBC_PDF417Common::MAX_ROWS_IN_BARCODE) {
-    return NULL;
-  }
-  CBC_BarcodeMetadata* barcodeMetadata =
-      new CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0),
-                              barcodeRowCountUpperPart.getValue()->GetAt(0),
-                              barcodeRowCountLowerPart.getValue()->GetAt(0),
-                              barcodeECLevel.getValue()->GetAt(0));
-  removeIncorrectCodewords(codewords, *barcodeMetadata);
-  return barcodeMetadata;
-}
-FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() {
-  return m_isLeft;
-}
-CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() {
-  return (CFX_ByteString) "IsLeft: " + (CFX_ByteString)m_isLeft + '\n' +
-         CBC_DetectionResultColumn::toString();
-}
-void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords(
-    CFX_PtrArray* codewords,
-    CBC_BarcodeMetadata barcodeMetadata) {
-  for (int32_t codewordRow = 0; codewordRow < codewords->GetSize();
-       codewordRow++) {
-    CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow);
-    if (codeword == NULL) {
-      continue;
-    }
-    int32_t rowIndicatorValue = codeword->getValue() % 30;
-    int32_t codewordRowNumber = codeword->getRowNumber();
-    if (codewordRowNumber > barcodeMetadata.getRowCount()) {
-      codewords->SetAt(codewordRow, NULL);
-      continue;
-    }
-    if (!m_isLeft) {
-      codewordRowNumber += 2;
-    }
-    switch (codewordRowNumber % 3) {
-      case 0:
-        if (rowIndicatorValue * 3 + 1 !=
-            barcodeMetadata.getRowCountUpperPart()) {
-          codewords->SetAt(codewordRow, NULL);
-        }
-        break;
-      case 1:
-        if (rowIndicatorValue / 3 !=
-                barcodeMetadata.getErrorCorrectionLevel() ||
-            rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) {
-          codewords->SetAt(codewordRow, NULL);
-        }
-        break;
-      case 2:
-        if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) {
-          codewords->SetAt(codewordRow, NULL);
-        }
-        break;
-    }
-  }
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h
deleted file mode 100644
index e235586..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
-
-class CBC_BarcodeMetadata;
-class CBC_BoundingBox;
-class CBC_DetectionResultRowIndicatorColumn;
-class CBC_DetectionResultRowIndicatorColumn : public CBC_DetectionResultColumn {
- public:
-  CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox,
-                                        FX_BOOL isLeft);
-  virtual ~CBC_DetectionResultRowIndicatorColumn();
-  void setRowNumbers();
-  int32_t adjustCompleteIndicatorColumnRowNumbers(
-      CBC_BarcodeMetadata barcodeMetadata);
-  CFX_Int32Array* getRowHeights(int32_t& e);
-  int32_t adjustIncompleteIndicatorColumnRowNumbers(
-      CBC_BarcodeMetadata barcodeMetadata);
-  CBC_BarcodeMetadata* getBarcodeMetadata();
-  FX_BOOL isLeft();
-  CFX_ByteString toString();
-
- private:
-  FX_BOOL m_isLeft;
-  void removeIncorrectCodewords(CFX_PtrArray* codewords,
-                                CBC_BarcodeMetadata barcodeMetadata);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULTROWINDICATORCOLUMN_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp
deleted file mode 100644
index 54556af..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-#define INTEGER_MAX 2147483647
-
-int32_t CBC_Detector::INDEXES_START_PATTERN[] = {0, 4, 1, 5};
-int32_t CBC_Detector::INDEXES_STOP_PATTERN[] = {6, 2, 7, 3};
-int32_t CBC_Detector::INTEGER_MATH_SHIFT = 8;
-int32_t CBC_Detector::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1
-                                                          << INTEGER_MATH_SHIFT;
-int32_t CBC_Detector::MAX_AVG_VARIANCE =
-    (int32_t)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f);
-int32_t CBC_Detector::MAX_INDIVIDUAL_VARIANCE =
-    (int32_t)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f);
-int32_t CBC_Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3};
-int32_t CBC_Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1};
-int32_t CBC_Detector::MAX_PIXEL_DRIFT = 3;
-int32_t CBC_Detector::MAX_PATTERN_DRIFT = 5;
-int32_t CBC_Detector::SKIPPED_ROW_COUNT_MAX = 25;
-int32_t CBC_Detector::ROW_STEP = 5;
-int32_t CBC_Detector::BARCODE_MIN_HEIGHT = 10;
-
-CBC_Detector::CBC_Detector() {}
-CBC_Detector::~CBC_Detector() {}
-CBC_PDF417DetectorResult* CBC_Detector::detect(CBC_BinaryBitmap* image,
-                                               int32_t hints,
-                                               FX_BOOL multiple,
-                                               int32_t& e) {
-  CBC_CommonBitMatrix* bitMatrix = image->GetBlackMatrix(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* barcodeCoordinates = detect(multiple, bitMatrix);
-  if (barcodeCoordinates->GetSize() == 0) {
-    rotate180(bitMatrix);
-    barcodeCoordinates = detect(multiple, bitMatrix);
-  }
-  if (barcodeCoordinates->GetSize() == 0) {
-    e = BCExceptionUnSupportedBarcode;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CBC_PDF417DetectorResult* detectorResult =
-      new CBC_PDF417DetectorResult(bitMatrix, barcodeCoordinates);
-  return detectorResult;
-}
-void CBC_Detector::rotate180(CBC_CommonBitMatrix* bitMatrix) {
-  int32_t width = bitMatrix->GetWidth();
-  int32_t height = bitMatrix->GetHeight();
-  CBC_CommonBitArray* firstRowBitArray = new CBC_CommonBitArray(width);
-  CBC_CommonBitArray* secondRowBitArray = new CBC_CommonBitArray(width);
-  CBC_CommonBitArray* tmpBitArray = new CBC_CommonBitArray(width);
-  for (int32_t y = 0; y<(height + 1)>> 1; y++) {
-    CBC_CommonBitArray* temp =
-        bitMatrix->GetRow(height - 1 - y, secondRowBitArray);
-    CBC_CommonBitArray* tempfirstRow = firstRowBitArray;
-    firstRowBitArray = bitMatrix->GetRow(y, tempfirstRow);
-    delete tempfirstRow;
-    CBC_CommonBitArray* row = mirror(temp, tmpBitArray);
-    delete temp;
-    bitMatrix->SetRow(y, row);
-    delete row;
-    CBC_CommonBitArray* rowfirstRow = mirror(firstRowBitArray, tmpBitArray);
-    bitMatrix->SetRow(height - 1 - y, rowfirstRow);
-    delete rowfirstRow;
-  }
-  delete tmpBitArray;
-  delete firstRowBitArray;
-  delete secondRowBitArray;
-}
-CBC_CommonBitArray* CBC_Detector::mirror(CBC_CommonBitArray* input,
-                                         CBC_CommonBitArray* result) {
-  CBC_CommonBitArray* array = new CBC_CommonBitArray(result->GetSize());
-  array->Clear();
-  int32_t size = input->GetSize();
-  for (int32_t i = 0; i < size; i++) {
-    if (input->Get(i)) {
-      array->Set(size - 1 - i);
-    }
-  }
-  return array;
-}
-CFX_PtrArray* CBC_Detector::detect(FX_BOOL multiple,
-                                   CBC_CommonBitMatrix* bitMatrix) {
-  CFX_PtrArray* barcodeCoordinates = new CFX_PtrArray;
-  int32_t row = 0;
-  int32_t column = 0;
-  FX_BOOL foundBarcodeInRow = FALSE;
-  while (row < bitMatrix->GetHeight()) {
-    CFX_PtrArray* vertices = findVertices(bitMatrix, row, column);
-    if (vertices->GetAt(0) == NULL && vertices->GetAt(3) == NULL) {
-      if (!foundBarcodeInRow) {
-        if (vertices) {
-          delete (vertices);
-        }
-        break;
-      }
-      foundBarcodeInRow = FALSE;
-      column = 0;
-      for (int32_t i = 0; i < barcodeCoordinates->GetSize(); i++) {
-        CFX_PtrArray* barcodeCoordinate =
-            (CFX_PtrArray*)barcodeCoordinates->GetAt(i);
-        if (barcodeCoordinate->GetAt(1)) {
-          row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY();
-        }
-        if (barcodeCoordinate->GetAt(3)) {
-          row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY();
-        }
-      }
-      row += ROW_STEP;
-      if (vertices) {
-        delete (vertices);
-      }
-      continue;
-    }
-    foundBarcodeInRow = TRUE;
-    barcodeCoordinates->Add(vertices);
-    if (!multiple) {
-      break;
-    }
-    if (vertices->GetAt(2)) {
-      column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetX();
-      row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetY();
-    } else {
-      column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetX();
-      row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetY();
-    }
-  }
-  return barcodeCoordinates;
-}
-CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix,
-                                         int32_t startRow,
-                                         int32_t startColumn) {
-  int32_t height = matrix->GetHeight();
-  int32_t width = matrix->GetWidth();
-  CFX_PtrArray* result = new CFX_PtrArray;
-  result->SetSize(8);
-  CFX_PtrArray* startptr = findRowsWithPattern(
-      matrix, height, width, startRow, startColumn, START_PATTERN,
-      sizeof(START_PATTERN) / sizeof(START_PATTERN[0]));
-  copyToResult(
-      result, startptr, INDEXES_START_PATTERN,
-      sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0]));
-  startptr->RemoveAll();
-  delete startptr;
-  if (result->GetAt(4)) {
-    startColumn = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetX();
-    startRow = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetY();
-  }
-  CFX_PtrArray* stopptr = findRowsWithPattern(
-      matrix, height, width, startRow, startColumn, STOP_PATTERN,
-      sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0]));
-  copyToResult(result, stopptr, INDEXES_STOP_PATTERN,
-               sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0]));
-  stopptr->RemoveAll();
-  delete stopptr;
-  return result;
-}
-void CBC_Detector::copyToResult(CFX_PtrArray* result,
-                                CFX_PtrArray* tmpResult,
-                                int32_t* destinationIndexes,
-                                int32_t destinationLength) {
-  for (int32_t i = 0; i < destinationLength; i++) {
-    result->SetAt(destinationIndexes[i], tmpResult->GetAt(i));
-  }
-}
-CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix,
-                                                int32_t height,
-                                                int32_t width,
-                                                int32_t startRow,
-                                                int32_t startColumn,
-                                                int32_t* pattern,
-                                                int32_t patternLength) {
-  CFX_PtrArray* result = new CFX_PtrArray;
-  result->SetSize(4);
-  FX_BOOL found = FALSE;
-  CFX_Int32Array counters;
-  counters.SetSize(patternLength);
-  for (; startRow < height; startRow += ROW_STEP) {
-    CFX_Int32Array* loc =
-        findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern,
-                         patternLength, counters);
-    if (loc) {
-      while (startRow > 0) {
-        CFX_Int32Array* previousRowLoc =
-            findGuardPattern(matrix, startColumn, --startRow, width, FALSE,
-                             pattern, patternLength, counters);
-        if (previousRowLoc) {
-          delete loc;
-          loc = previousRowLoc;
-        } else {
-          startRow++;
-          break;
-        }
-      }
-      result->SetAt(
-          0, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow));
-      result->SetAt(
-          1, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow));
-      found = TRUE;
-      delete loc;
-      break;
-    }
-  }
-  int32_t stopRow = startRow + 1;
-  if (found) {
-    int32_t skippedRowCount = 0;
-    CFX_Int32Array previousRowLoc;
-    previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(0))->GetX());
-    previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(1))->GetX());
-    for (; stopRow < height; stopRow++) {
-      CFX_Int32Array* loc =
-          findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE,
-                           pattern, patternLength, counters);
-      if (loc && abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT &&
-          abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) {
-        previousRowLoc.Copy(*loc);
-        skippedRowCount = 0;
-      } else {
-        if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) {
-          delete loc;
-          break;
-        } else {
-          skippedRowCount++;
-        }
-      }
-      delete loc;
-    }
-    stopRow -= skippedRowCount + 1;
-    result->SetAt(2, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0),
-                                         (FX_FLOAT)stopRow));
-    result->SetAt(3, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1),
-                                         (FX_FLOAT)stopRow));
-  }
-  if (stopRow - startRow < BARCODE_MIN_HEIGHT) {
-    for (int32_t i = 0; i < result->GetSize(); i++) {
-      result->SetAt(i, NULL);
-    }
-  }
-  return result;
-}
-CFX_Int32Array* CBC_Detector::findGuardPattern(CBC_CommonBitMatrix* matrix,
-                                               int32_t column,
-                                               int32_t row,
-                                               int32_t width,
-                                               FX_BOOL whiteFirst,
-                                               int32_t* pattern,
-                                               int32_t patternLength,
-                                               CFX_Int32Array& counters) {
-  for (int32_t i = 0; i < counters.GetSize(); i++) {
-    counters.SetAt(i, 0);
-  }
-  FX_BOOL isWhite = whiteFirst;
-  int32_t patternStart = column;
-  int32_t pixelDrift = 0;
-  CFX_Int32Array* intarray = new CFX_Int32Array;
-  while (matrix->Get(patternStart, row) && patternStart > 0 &&
-         pixelDrift++ < MAX_PIXEL_DRIFT) {
-    patternStart--;
-  }
-  int32_t x = patternStart;
-  int32_t counterPosition = 0;
-  for (; x < width; x++) {
-    FX_BOOL pixel = matrix->Get(x, row);
-    if (pixel ^ isWhite) {
-      counters[counterPosition]++;
-    } else {
-      if (counterPosition == patternLength - 1) {
-        if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) <
-            MAX_AVG_VARIANCE) {
-          intarray->Add(patternStart);
-          intarray->Add(x);
-          return intarray;
-        }
-        patternStart += counters[0] + counters[1];
-        for (int32_t l = 2, k = 0; l < patternLength; l++, k++) {
-          counters.SetAt(k, counters.GetAt(l));
-        }
-        counters.SetAt(patternLength - 2, 0);
-        counters.SetAt(patternLength - 1, 0);
-        counterPosition--;
-      } else {
-        counterPosition++;
-      }
-      counters[counterPosition] = 1;
-      isWhite = !isWhite;
-    }
-  }
-  if (counterPosition == patternLength - 1) {
-    if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) <
-        MAX_AVG_VARIANCE) {
-      intarray->Add(patternStart);
-      intarray->Add(x - 1);
-      return intarray;
-    }
-  }
-  delete intarray;
-  return NULL;
-}
-int32_t CBC_Detector::patternMatchVariance(CFX_Int32Array& counters,
-                                           int32_t* pattern,
-                                           int32_t maxIndividualVariance) {
-  int32_t numCounters = counters.GetSize();
-  int32_t total = 0;
-  int32_t patternLength = 0;
-  for (int32_t i = 0; i < numCounters; i++) {
-    total += counters[i];
-    patternLength += pattern[i];
-  }
-  if (total < patternLength) {
-    return INTEGER_MAX;
-  }
-  int32_t unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength;
-  maxIndividualVariance =
-      (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT;
-  int32_t totalVariance = 0;
-  for (int32_t x = 0; x < numCounters; x++) {
-    int32_t counter = counters[x] << INTEGER_MATH_SHIFT;
-    int32_t scaledPattern = pattern[x] * unitBarWidth;
-    int32_t variance = counter > scaledPattern ? counter - scaledPattern
-                                               : scaledPattern - counter;
-    if (variance > maxIndividualVariance) {
-      return INTEGER_MAX;
-    }
-    totalVariance += variance;
-  }
-  return totalVariance / total;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h
deleted file mode 100644
index e18a2b5..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
-
-class CBC_PDF417DetectorResult;
-class CBC_BinaryBitmap;
-class CBC_CommonBitMatrix;
-class CBC_CommonBitArray;
-
-class CBC_Detector {
- public:
-  CBC_Detector();
-  virtual ~CBC_Detector();
-  static CBC_PDF417DetectorResult* detect(CBC_BinaryBitmap* image,
-                                          int32_t hints,
-                                          FX_BOOL multiple,
-                                          int32_t& e);
-  static void rotate180(CBC_CommonBitMatrix* bitMatrix);
-  static CBC_CommonBitArray* mirror(CBC_CommonBitArray* input,
-                                    CBC_CommonBitArray* result);
-
- private:
-  static int32_t INDEXES_START_PATTERN[];
-  static int32_t INDEXES_STOP_PATTERN[];
-  static int32_t INTEGER_MATH_SHIFT;
-  static int32_t PATTERN_MATCH_RESULT_SCALE_FACTOR;
-  static int32_t MAX_AVG_VARIANCE;
-  static int32_t MAX_INDIVIDUAL_VARIANCE;
-  static int32_t START_PATTERN[];
-  static int32_t STOP_PATTERN[];
-  static int32_t MAX_PIXEL_DRIFT;
-  static int32_t MAX_PATTERN_DRIFT;
-  static int32_t SKIPPED_ROW_COUNT_MAX;
-  static int32_t ROW_STEP;
-  static int32_t BARCODE_MIN_HEIGHT;
-  static CFX_PtrArray* detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix);
-  static CFX_PtrArray* findVertices(CBC_CommonBitMatrix* matrix,
-                                    int32_t startRow,
-                                    int32_t startColumn);
-  static void copyToResult(CFX_PtrArray* result,
-                           CFX_PtrArray* tmpResult,
-                           int32_t* destinationIndexes,
-                           int32_t destinationLength);
-  static CFX_PtrArray* findRowsWithPattern(CBC_CommonBitMatrix* matrix,
-                                           int32_t height,
-                                           int32_t width,
-                                           int32_t startRow,
-                                           int32_t startColumn,
-                                           int32_t* pattern,
-                                           int32_t patternLength);
-  static CFX_Int32Array* findGuardPattern(CBC_CommonBitMatrix* matrix,
-                                          int32_t column,
-                                          int32_t row,
-                                          int32_t width,
-                                          FX_BOOL whiteFirst,
-                                          int32_t* pattern,
-                                          int32_t patternLength,
-                                          CFX_Int32Array& counters);
-  static int32_t patternMatchVariance(CFX_Int32Array& counters,
-                                      int32_t* pattern,
-                                      int32_t maxIndividualVariance);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTOR_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp
deleted file mode 100644
index 395c539..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-
-CBC_PDF417DetectorResult::CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits,
-                                                   CFX_PtrArray* points) {
-  m_bits = bits;
-  m_points = points;
-}
-CBC_PDF417DetectorResult::~CBC_PDF417DetectorResult() {
-  for (int32_t i = 0; i < m_points->GetSize(); i++) {
-    CFX_PtrArray* temp = (CFX_PtrArray*)m_points->GetAt(i);
-    for (int32_t j = 0; j < temp->GetSize(); j++) {
-      delete (CBC_ResultPoint*)temp->GetAt(j);
-    }
-    temp->RemoveAll();
-    delete temp;
-  }
-  m_points->RemoveAll();
-  delete m_points;
-}
-CBC_CommonBitMatrix* CBC_PDF417DetectorResult::getBits() {
-  return m_bits;
-}
-
-CFX_PtrArray* CBC_PDF417DetectorResult::getPoints() {
-  return m_points;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h
deleted file mode 100644
index b0b365e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-
-class CBC_PDF417DetectorResult {
- public:
-  CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points);
-  virtual ~CBC_PDF417DetectorResult();
-  CBC_CommonBitMatrix* getBits();
-  CFX_PtrArray* getPoints();
-
- private:
-  CBC_CommonBitMatrix* m_bits;
-  CFX_PtrArray* m_points;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DETECTORRESULT_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp
deleted file mode 100644
index 18edeac..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h"
-
-CBC_Dimensions::CBC_Dimensions(int32_t minCols,
-                               int32_t maxCols,
-                               int32_t minRows,
-                               int32_t maxRows) {
-  m_minCols = minCols;
-  m_maxCols = maxCols;
-  m_minRows = minRows;
-  m_maxRows = maxRows;
-}
-CBC_Dimensions::~CBC_Dimensions() {}
-int32_t CBC_Dimensions::getMinCols() {
-  return m_minCols;
-}
-int32_t CBC_Dimensions::getMaxCols() {
-  return m_maxCols;
-}
-int32_t CBC_Dimensions::getMinRows() {
-  return m_minRows;
-}
-int32_t CBC_Dimensions::getMaxRows() {
-  return m_maxRows;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h
deleted file mode 100644
index 9b69fc4..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
-
-#include <stdint.h>
-
-class CBC_Dimensions {
- public:
-  CBC_Dimensions(int32_t minCols,
-                 int32_t maxCols,
-                 int32_t minRows,
-                 int32_t maxRows);
-  virtual ~CBC_Dimensions();
-  int32_t getMinCols();
-  int32_t getMaxCols();
-  int32_t getMinRows();
-  int32_t getMaxRows();
-
- private:
-  int32_t m_minCols;
-  int32_t m_maxCols;
-  int32_t m_minRows;
-  int32_t m_maxRows;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417DIMENSIONS_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
deleted file mode 100644
index aea60df..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL;
-
-void CBC_PDF417ECErrorCorrection::Initialize(int32_t& e) {
-  m_field =
-      new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
-}
-void CBC_PDF417ECErrorCorrection::Finalize() {
-  delete m_field;
-}
-CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() {}
-CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() {}
-int32_t CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array& received,
-                                            int32_t numECCodewords,
-                                            CFX_Int32Array& erasures,
-                                            int32_t& e) {
-  CBC_PDF417ECModulusPoly poly(m_field, received, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  CFX_Int32Array S;
-  S.SetSize(numECCodewords);
-  FX_BOOL error = FALSE;
-  for (int32_t l = numECCodewords; l > 0; l--) {
-    int32_t eval = poly.evaluateAt(m_field->exp(l));
-    S[numECCodewords - l] = eval;
-    if (eval != 0) {
-      error = TRUE;
-    }
-  }
-  if (!error) {
-    return 0;
-  }
-  CBC_PDF417ECModulusPoly* syndrome =
-      new CBC_PDF417ECModulusPoly(m_field, S, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  CBC_PDF417ECModulusPoly* buildmonomial =
-      m_field->buildMonomial(numECCodewords, 1, e);
-  if (e != BCExceptionNO) {
-    delete syndrome;
-    return -1;
-  }
-  CFX_PtrArray* sigmaOmega =
-      runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e);
-  delete buildmonomial;
-  delete syndrome;
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  CBC_PDF417ECModulusPoly* sigma =
-      (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0);
-  CBC_PDF417ECModulusPoly* omega =
-      (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1);
-  CFX_Int32Array* errorLocations = findErrorLocations(sigma, e);
-  if (e != BCExceptionNO) {
-    for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
-      delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
-    }
-    sigmaOmega->RemoveAll();
-    delete sigmaOmega;
-    return -1;
-  }
-  CFX_Int32Array* errorMagnitudes =
-      findErrorMagnitudes(omega, sigma, *errorLocations, e);
-  if (e != BCExceptionNO) {
-    delete errorLocations;
-    for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
-      delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
-    }
-    sigmaOmega->RemoveAll();
-    delete sigmaOmega;
-    return -1;
-  }
-  for (int32_t i = 0; i < errorLocations->GetSize(); i++) {
-    int32_t log = m_field->log(errorLocations->GetAt(i), e);
-
-    BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-    int32_t position = received.GetSize() - 1 - log;
-    if (position < 0) {
-      e = BCExceptionChecksumException;
-      delete errorLocations;
-      delete errorMagnitudes;
-      for (int32_t j = 0; j < sigmaOmega->GetSize(); j++) {
-        delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j);
-      }
-      sigmaOmega->RemoveAll();
-      delete sigmaOmega;
-      return -1;
-    }
-    received[position] =
-        m_field->subtract(received[position], errorMagnitudes->GetAt(i));
-  }
-  int32_t result = errorLocations->GetSize();
-  delete errorLocations;
-  delete errorMagnitudes;
-  for (int32_t k = 0; k < sigmaOmega->GetSize(); k++) {
-    delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k);
-  }
-  sigmaOmega->RemoveAll();
-  delete sigmaOmega;
-  return result;
-}
-CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(
-    CBC_PDF417ECModulusPoly* a,
-    CBC_PDF417ECModulusPoly* b,
-    int32_t R,
-    int32_t& e) {
-  if (a->getDegree() < b->getDegree()) {
-    CBC_PDF417ECModulusPoly* temp = a;
-    a = b;
-    b = temp;
-  }
-  CBC_PDF417ECModulusPoly* rLast = a;
-  CBC_PDF417ECModulusPoly* r = b;
-  CBC_PDF417ECModulusPoly* tLast = m_field->getZero();
-  CBC_PDF417ECModulusPoly* t = m_field->getOne();
-  CBC_PDF417ECModulusPoly* qtemp = NULL;
-  CBC_PDF417ECModulusPoly* rtemp = NULL;
-  CBC_PDF417ECModulusPoly* ttemp = NULL;
-  int32_t i = 0;
-  int32_t j = 0;
-  int32_t m = 0;
-  int32_t n = 0;
-  while (r->getDegree() >= R / 2) {
-    CBC_PDF417ECModulusPoly* rLastLast = rLast;
-    CBC_PDF417ECModulusPoly* tLastLast = tLast;
-    rLast = r;
-    tLast = t;
-    m = i;
-    n = j;
-    if (rLast->isZero()) {
-      e = BCExceptionChecksumException;
-      if (qtemp) {
-        delete qtemp;
-      }
-      if (rtemp) {
-        delete rtemp;
-      }
-      if (ttemp) {
-        delete ttemp;
-      }
-      return NULL;
-    }
-    r = rLastLast;
-    CBC_PDF417ECModulusPoly* q = m_field->getZero();
-    int32_t denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree());
-    int32_t dltInverse = m_field->inverse(denominatorLeadingTerm, e);
-    if (e != BCExceptionNO) {
-      if (qtemp) {
-        delete qtemp;
-      }
-      if (rtemp) {
-        delete rtemp;
-      }
-      if (ttemp) {
-        delete ttemp;
-      }
-      return NULL;
-    }
-    while (r->getDegree() >= rLast->getDegree() && !r->isZero()) {
-      int32_t degreeDiff = r->getDegree() - rLast->getDegree();
-      int32_t scale =
-          m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse);
-      CBC_PDF417ECModulusPoly* buildmonomial =
-          m_field->buildMonomial(degreeDiff, scale, e);
-      if (e != BCExceptionNO) {
-        if (qtemp) {
-          delete qtemp;
-        }
-        if (rtemp) {
-          delete rtemp;
-        }
-        if (ttemp) {
-          delete ttemp;
-        }
-        return NULL;
-      }
-      q = q->add(buildmonomial, e);
-      delete buildmonomial;
-      if (qtemp) {
-        delete qtemp;
-      }
-      if (e != BCExceptionNO) {
-        if (rtemp) {
-          delete rtemp;
-        }
-        if (ttemp) {
-          delete ttemp;
-        }
-        return NULL;
-      }
-      qtemp = q;
-      CBC_PDF417ECModulusPoly* multiply =
-          rLast->multiplyByMonomial(degreeDiff, scale, e);
-      if (e != BCExceptionNO) {
-        if (qtemp) {
-          delete qtemp;
-        }
-        if (rtemp) {
-          delete rtemp;
-        }
-        if (ttemp) {
-          delete ttemp;
-        }
-        return NULL;
-      }
-      CBC_PDF417ECModulusPoly* temp = r;
-      r = temp->subtract(multiply, e);
-      delete multiply;
-      if (m > 1 && i > m) {
-        delete temp;
-        temp = NULL;
-      }
-      if (e != BCExceptionNO) {
-        if (qtemp) {
-          delete qtemp;
-        }
-        if (rtemp) {
-          delete rtemp;
-        }
-        if (ttemp) {
-          delete ttemp;
-        }
-        return NULL;
-      }
-      rtemp = r;
-      i = m + 1;
-    }
-    ttemp = q->multiply(tLast, e);
-    if (qtemp) {
-      delete qtemp;
-      qtemp = NULL;
-    }
-    if (e != BCExceptionNO) {
-      if (rtemp) {
-        delete rtemp;
-      }
-      if (ttemp) {
-        delete ttemp;
-      }
-      return NULL;
-    }
-    t = ttemp->subtract(tLastLast, e);
-    if (n > 1 && j > n) {
-      delete tLastLast;
-    }
-    delete ttemp;
-    if (e != BCExceptionNO) {
-      if (rtemp) {
-        delete rtemp;
-      }
-      return NULL;
-    }
-    ttemp = t;
-    t = ttemp->negative(e);
-    delete ttemp;
-    if (e != BCExceptionNO) {
-      if (rtemp) {
-        delete rtemp;
-      }
-      return NULL;
-    }
-    ttemp = t;
-    j++;
-  }
-  int32_t sigmaTildeAtZero = t->getCoefficient(0);
-  if (sigmaTildeAtZero == 0) {
-    e = BCExceptionChecksumException;
-    if (rtemp) {
-      delete rtemp;
-    }
-    if (ttemp) {
-      delete ttemp;
-    }
-    return NULL;
-  }
-  int32_t inverse = m_field->inverse(sigmaTildeAtZero, e);
-  if (e != BCExceptionNO) {
-    if (rtemp) {
-      delete rtemp;
-    }
-    if (ttemp) {
-      delete ttemp;
-    }
-    return NULL;
-  }
-  CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e);
-  if (ttemp) {
-    delete ttemp;
-  }
-  if (e != BCExceptionNO) {
-    if (rtemp) {
-      delete rtemp;
-    }
-    return NULL;
-  }
-  CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e);
-  if (rtemp) {
-    delete rtemp;
-  }
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* modulusPoly = new CFX_PtrArray;
-  modulusPoly->Add(sigma);
-  modulusPoly->Add(omega);
-  return modulusPoly;
-}
-CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(
-    CBC_PDF417ECModulusPoly* errorLocator,
-    int32_t& e) {
-  int32_t numErrors = errorLocator->getDegree();
-  CFX_Int32Array* result = new CFX_Int32Array;
-  result->SetSize(numErrors);
-  int32_t ee = 0;
-  for (int32_t i = 1; i < m_field->getSize() && ee < numErrors; i++) {
-    if (errorLocator->evaluateAt(i) == 0) {
-      result->SetAt(ee, m_field->inverse(i, e));
-      if (e != BCExceptionNO) {
-        delete result;
-        return NULL;
-      }
-      ee++;
-    }
-  }
-  if (ee != numErrors) {
-    e = BCExceptionChecksumException;
-    delete result;
-    return NULL;
-  }
-  return result;
-}
-CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(
-    CBC_PDF417ECModulusPoly* errorEvaluator,
-    CBC_PDF417ECModulusPoly* errorLocator,
-    CFX_Int32Array& errorLocations,
-    int32_t& e) {
-  int32_t errorLocatorDegree = errorLocator->getDegree();
-  CFX_Int32Array formalDerivativeCoefficients;
-  formalDerivativeCoefficients.SetSize(errorLocatorDegree);
-  for (int32_t l = 1; l <= errorLocatorDegree; l++) {
-    formalDerivativeCoefficients[errorLocatorDegree - l] =
-        m_field->multiply(l, errorLocator->getCoefficient(l));
-  }
-  CBC_PDF417ECModulusPoly formalDerivative(m_field,
-                                           formalDerivativeCoefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t s = errorLocations.GetSize();
-  CFX_Int32Array* result = new CFX_Int32Array;
-  result->SetSize(s);
-  for (int32_t i = 0; i < s; i++) {
-    int32_t xiInverse = m_field->inverse(errorLocations[i], e);
-    if (e != BCExceptionNO) {
-      delete result;
-      return NULL;
-    }
-    int32_t numerator =
-        m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse));
-    int32_t denominator =
-        m_field->inverse(formalDerivative.evaluateAt(xiInverse), e);
-    if (e != BCExceptionNO) {
-      delete result;
-      return NULL;
-    }
-    result->SetAt(i, m_field->multiply(numerator, denominator));
-  }
-  return result;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
deleted file mode 100644
index 8966ae1..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
-
-class CBC_PDF417ECModulusGF;
-class CBC_PDF417ECModulusPoly;
-class CBC_PDF417ECErrorCorrection {
- public:
-  CBC_PDF417ECErrorCorrection();
-  virtual ~CBC_PDF417ECErrorCorrection();
-  static void Initialize(int32_t& e);
-  static void Finalize();
-  static int32_t decode(CFX_Int32Array& received,
-                        int32_t numECCodewords,
-                        CFX_Int32Array& erasures,
-                        int32_t& e);
-
- private:
-  static CBC_PDF417ECModulusGF* m_field;
-  static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a,
-                                             CBC_PDF417ECModulusPoly* b,
-                                             int32_t R,
-                                             int32_t& e);
-  static CFX_Int32Array* findErrorLocations(
-      CBC_PDF417ECModulusPoly* errorLocator,
-      int32_t& e);
-  static CFX_Int32Array* findErrorMagnitudes(
-      CBC_PDF417ECModulusPoly* errorEvaluator,
-      CBC_PDF417ECModulusPoly* errorLocator,
-      CFX_Int32Array& errorLocations,
-      int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECERRORCORRECTION_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp
deleted file mode 100644
index 1ba77da..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL;
-void CBC_PDF417ECModulusGF::Initialize(int32_t& e) {
-  PDF417_GF =
-      new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
-}
-void CBC_PDF417ECModulusGF::Finalize() {
-  delete PDF417_GF;
-}
-CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(int32_t modulus,
-                                             int32_t generator,
-                                             int32_t& e) {
-  m_modulus = modulus;
-  m_expTable.SetSize(modulus);
-  m_logTable.SetSize(modulus);
-  int32_t x = 1;
-  for (int32_t i = 0; i < modulus; i++) {
-    m_expTable[i] = x;
-    x = (x * generator) % modulus;
-  }
-  for (int32_t j = 0; j < modulus - 1; j++) {
-    m_logTable[m_expTable[j]] = j;
-  }
-  CFX_Int32Array zero;
-  zero.Add(0);
-  m_zero = new CBC_PDF417ECModulusPoly(this, zero, e);
-  CFX_Int32Array one;
-  one.Add(1);
-  m_one = new CBC_PDF417ECModulusPoly(this, one, e);
-}
-CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() {
-  delete m_zero;
-  delete m_one;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() {
-  return m_zero;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() {
-  return m_one;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(
-    int32_t degree,
-    int32_t coefficient,
-    int32_t& e) {
-  if (degree < 0) {
-    e = BCExceptionIllegalArgument;
-    return NULL;
-  }
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (coefficient == 0) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(m_zero->getField(),
-                                              m_zero->getCoefficients(), e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  CFX_Int32Array coefficients;
-  coefficients.SetSize(degree + 1);
-  coefficients[0] = coefficient;
-  modulusPoly = new CBC_PDF417ECModulusPoly(this, coefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-int32_t CBC_PDF417ECModulusGF::add(int32_t a, int32_t b) {
-  return (a + b) % m_modulus;
-}
-int32_t CBC_PDF417ECModulusGF::subtract(int32_t a, int32_t b) {
-  return (m_modulus + a - b) % m_modulus;
-}
-int32_t CBC_PDF417ECModulusGF::exp(int32_t a) {
-  return m_expTable[a];
-}
-int32_t CBC_PDF417ECModulusGF::log(int32_t a, int32_t& e) {
-  if (a == 0) {
-    e = BCExceptionIllegalArgument;
-    return -1;
-  }
-  return m_logTable[a];
-}
-int32_t CBC_PDF417ECModulusGF::inverse(int32_t a, int32_t& e) {
-  if (a == 0) {
-    e = BCExceptionIllegalArgument;
-    return -1;
-  }
-  return m_expTable[m_modulus - m_logTable[a] - 1];
-}
-int32_t CBC_PDF417ECModulusGF::multiply(int32_t a, int32_t b) {
-  if (a == 0 || b == 0) {
-    return 0;
-  }
-  return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)];
-}
-int32_t CBC_PDF417ECModulusGF::getSize() {
-  return m_modulus;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h
deleted file mode 100644
index f5d245b..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
-
-class CBC_PDF417ECModulusPoly;
-class CBC_PDF417ECModulusGF {
- public:
-  CBC_PDF417ECModulusGF(int32_t modulus, int32_t generator, int32_t& e);
-  virtual ~CBC_PDF417ECModulusGF();
-  static void Initialize(int32_t& e);
-  static void Finalize();
-  CBC_PDF417ECModulusPoly* getZero();
-  CBC_PDF417ECModulusPoly* getOne();
-  CBC_PDF417ECModulusPoly* buildMonomial(int32_t degree,
-                                         int32_t coefficient,
-                                         int32_t& e);
-  int32_t add(int32_t a, int32_t b);
-  int32_t subtract(int32_t a, int32_t b);
-  int32_t exp(int32_t a);
-  int32_t log(int32_t a, int32_t& e);
-  int32_t inverse(int32_t a, int32_t& e);
-  int32_t multiply(int32_t a, int32_t b);
-  int32_t getSize();
-  static CBC_PDF417ECModulusGF* PDF417_GF;
-
- private:
-  CFX_Int32Array m_expTable;
-  CFX_Int32Array m_logTable;
-  CBC_PDF417ECModulusPoly* m_zero;
-  CBC_PDF417ECModulusPoly* m_one;
-  int32_t m_modulus;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSGF_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp
deleted file mode 100644
index 04f7752..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_PDF417ECModulusPoly::CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field,
-                                                 CFX_Int32Array& coefficients,
-                                                 int32_t& e) {
-  if (coefficients.GetSize() == 0) {
-    e = BCExceptionIllegalArgument;
-  }
-  m_field = field;
-  int32_t coefficientsLength = coefficients.GetSize();
-  if (coefficientsLength > 1 && coefficients[0] == 0) {
-    int32_t firstNonZero = 1;
-    while (firstNonZero < coefficientsLength &&
-           coefficients[firstNonZero] == 0) {
-      firstNonZero++;
-    }
-    if (firstNonZero == coefficientsLength) {
-      m_coefficients = field->getZero()->m_coefficients;
-    } else {
-      m_coefficients.SetSize(coefficientsLength - firstNonZero);
-      int32_t l = 0;
-      for (int32_t i = firstNonZero;
-           i < firstNonZero + m_coefficients.GetSize(); i++) {
-        m_coefficients.SetAt(l, coefficients.GetAt(i));
-        l++;
-      }
-    }
-  } else {
-    m_coefficients.Copy(coefficients);
-  }
-}
-CBC_PDF417ECModulusPoly::~CBC_PDF417ECModulusPoly() {}
-CFX_Int32Array& CBC_PDF417ECModulusPoly::getCoefficients() {
-  return m_coefficients;
-}
-CBC_PDF417ECModulusGF* CBC_PDF417ECModulusPoly::getField() {
-  return m_field;
-}
-int32_t CBC_PDF417ECModulusPoly::getDegree() {
-  return m_coefficients.GetSize() - 1;
-}
-FX_BOOL CBC_PDF417ECModulusPoly::isZero() {
-  return m_coefficients[0] == 0;
-}
-int32_t CBC_PDF417ECModulusPoly::getCoefficient(int32_t degree) {
-  return m_coefficients[m_coefficients.GetSize() - 1 - degree];
-}
-int32_t CBC_PDF417ECModulusPoly::evaluateAt(int32_t a) {
-  if (a == 0) {
-    return getCoefficient(0);
-  }
-  int32_t size = m_coefficients.GetSize();
-  if (a == 1) {
-    int32_t result = 0;
-    for (int32_t l = 0; l < m_coefficients.GetSize(); l++) {
-      int32_t coefficient = m_coefficients.GetAt(l);
-      result = m_field->add(result, coefficient);
-    }
-    return result;
-  }
-  int32_t result = m_coefficients[0];
-  for (int32_t i = 1; i < size; i++) {
-    result = m_field->add(m_field->multiply(a, result), m_coefficients[i]);
-  }
-  return result;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::add(
-    CBC_PDF417ECModulusPoly* other,
-    int32_t& e) {
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (isZero()) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(other->getField(),
-                                              other->getCoefficients(), e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  if (other->isZero()) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  CFX_Int32Array smallerCoefficients;
-  smallerCoefficients.Copy(m_coefficients);
-  CFX_Int32Array largerCoefficients;
-  largerCoefficients.Copy(other->m_coefficients);
-  if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) {
-    CFX_Int32Array temp;
-    temp.Copy(smallerCoefficients);
-    smallerCoefficients.Copy(largerCoefficients);
-    largerCoefficients.Copy(temp);
-  }
-  CFX_Int32Array sumDiff;
-  sumDiff.SetSize(largerCoefficients.GetSize());
-  int32_t lengthDiff =
-      largerCoefficients.GetSize() - smallerCoefficients.GetSize();
-  for (int32_t l = 0; l < lengthDiff; l++) {
-    sumDiff.SetAt(l, largerCoefficients.GetAt(l));
-  }
-  for (int32_t i = lengthDiff; i < largerCoefficients.GetSize(); i++) {
-    sumDiff[i] = m_field->add(smallerCoefficients[i - lengthDiff],
-                              largerCoefficients[i]);
-  }
-  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, sumDiff, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::subtract(
-    CBC_PDF417ECModulusPoly* other,
-    int32_t& e) {
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (other->isZero()) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  CBC_PDF417ECModulusPoly* poly = other->negative(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  modulusPoly = add(poly, e);
-  delete poly;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(
-    CBC_PDF417ECModulusPoly* other,
-    int32_t& e) {
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (isZero() || other->isZero()) {
-    modulusPoly =
-        new CBC_PDF417ECModulusPoly(m_field->getZero()->getField(),
-                                    m_field->getZero()->getCoefficients(), e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  CFX_Int32Array aCoefficients;
-  aCoefficients.Copy(m_coefficients);
-  int32_t aLength = aCoefficients.GetSize();
-  CFX_Int32Array bCoefficients;
-  bCoefficients.Copy(other->m_coefficients);
-  int32_t bLength = bCoefficients.GetSize();
-  CFX_Int32Array product;
-  product.SetSize(aLength + bLength - 1);
-  for (int32_t i = 0; i < aLength; i++) {
-    int32_t aCoeff = aCoefficients[i];
-    for (int32_t j = 0; j < bLength; j++) {
-      product[i + j] = m_field->add(
-          product[i + j], m_field->multiply(aCoeff, bCoefficients[j]));
-    }
-  }
-  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::negative(int32_t& e) {
-  int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array negativeCoefficients;
-  negativeCoefficients.SetSize(size);
-  for (int32_t i = 0; i < size; i++) {
-    negativeCoefficients[i] = m_field->subtract(0, m_coefficients[i]);
-  }
-  CBC_PDF417ECModulusPoly* modulusPoly =
-      new CBC_PDF417ECModulusPoly(m_field, negativeCoefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(int32_t scalar,
-                                                           int32_t& e) {
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (scalar == 0) {
-    modulusPoly =
-        new CBC_PDF417ECModulusPoly(m_field->getZero()->getField(),
-                                    m_field->getZero()->getCoefficients(), e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  if (scalar == 1) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
-  product.SetSize(size);
-  for (int32_t i = 0; i < size; i++) {
-    product[i] = m_field->multiply(m_coefficients[i], scalar);
-  }
-  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiplyByMonomial(
-    int32_t degree,
-    int32_t coefficient,
-    int32_t& e) {
-  if (degree < 0) {
-    e = BCExceptionIllegalArgument;
-    return NULL;
-  }
-  CBC_PDF417ECModulusPoly* modulusPoly = NULL;
-  if (coefficient == 0) {
-    modulusPoly = new CBC_PDF417ECModulusPoly(
-        m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return modulusPoly;
-  }
-  int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
-  product.SetSize(size + degree);
-  for (int32_t i = 0; i < size; i++) {
-    product[i] = m_field->multiply(m_coefficients[i], coefficient);
-  }
-  modulusPoly = new CBC_PDF417ECModulusPoly(m_field, product, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return modulusPoly;
-}
-CFX_PtrArray* CBC_PDF417ECModulusPoly::divide(CBC_PDF417ECModulusPoly* other,
-                                              int32_t& e) {
-  if (other->isZero()) {
-    e = BCExceptionDivideByZero;
-    return NULL;
-  }
-  CBC_PDF417ECModulusPoly* quotient = new CBC_PDF417ECModulusPoly(
-      m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_PDF417ECModulusPoly* remainder =
-      new CBC_PDF417ECModulusPoly(m_field, m_coefficients, e);
-  if (e != BCExceptionNO) {
-    delete quotient;
-    return NULL;
-  }
-  int32_t denominatorLeadingTerm = other->getCoefficient(other->getDegree());
-  int32_t inverseDenominatorLeadingTerm =
-      m_field->inverse(denominatorLeadingTerm, e);
-  if (e != BCExceptionNO) {
-    delete quotient;
-    delete remainder;
-    return NULL;
-  }
-  while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) {
-    int32_t degreeDifference = remainder->getDegree() - other->getDegree();
-    int32_t scale =
-        m_field->multiply(remainder->getCoefficient(remainder->getDegree()),
-                          inverseDenominatorLeadingTerm);
-    CBC_PDF417ECModulusPoly* term =
-        other->multiplyByMonomial(degreeDifference, scale, e);
-    if (e != BCExceptionNO) {
-      delete quotient;
-      delete remainder;
-      return NULL;
-    }
-    CBC_PDF417ECModulusPoly* iterationQuotient =
-        m_field->buildMonomial(degreeDifference, scale, e);
-    if (e != BCExceptionNO) {
-      delete quotient;
-      delete remainder;
-      delete term;
-      return NULL;
-    }
-    CBC_PDF417ECModulusPoly* temp = quotient;
-    quotient = temp->add(iterationQuotient, e);
-    delete iterationQuotient;
-    delete temp;
-    if (e != BCExceptionNO) {
-      delete remainder;
-      return NULL;
-    }
-    temp = remainder;
-    remainder = temp->subtract(term, e);
-    delete term;
-    delete temp;
-    if (e != BCExceptionNO) {
-      delete quotient;
-      return NULL;
-    }
-  }
-  CFX_PtrArray* modulusPoly = new CFX_PtrArray;
-  modulusPoly->Add(quotient);
-  modulusPoly->Add(remainder);
-  return modulusPoly;
-}
-CFX_ByteString CBC_PDF417ECModulusPoly::toString() {
-  CFX_ByteString result;
-  for (int32_t degree = getDegree(); degree >= 0; degree--) {
-    int32_t coefficient = getCoefficient(degree);
-    if (coefficient != 0) {
-      if (coefficient < 0) {
-        result += " - ";
-        coefficient = -coefficient;
-      } else {
-        if (result.GetLength() > 0) {
-          result += " + ";
-        }
-      }
-      if (degree == 0 || coefficient != 1) {
-        result += coefficient;
-      }
-      if (degree != 0) {
-        if (degree == 1) {
-          result += 'x';
-        } else {
-          result += "x^";
-          result += degree;
-        }
-      }
-    }
-  }
-  return result;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h
deleted file mode 100644
index 89384fc..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
-
-class CBC_PDF417ECModulusGF;
-class CBC_PDF417ECModulusPoly {
- public:
-  CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field,
-                          CFX_Int32Array& coefficients,
-                          int32_t& e);
-  virtual ~CBC_PDF417ECModulusPoly();
-  CFX_Int32Array& getCoefficients();
-  CBC_PDF417ECModulusGF* getField();
-  int32_t getDegree();
-  FX_BOOL isZero();
-  int32_t getCoefficient(int32_t degree);
-  int32_t evaluateAt(int32_t a);
-  CBC_PDF417ECModulusPoly* add(CBC_PDF417ECModulusPoly* other, int32_t& e);
-  CBC_PDF417ECModulusPoly* subtract(CBC_PDF417ECModulusPoly* other, int32_t& e);
-  CBC_PDF417ECModulusPoly* multiply(CBC_PDF417ECModulusPoly* other, int32_t& e);
-  CBC_PDF417ECModulusPoly* negative(int32_t& e);
-  CBC_PDF417ECModulusPoly* multiply(int32_t scalar, int32_t& e);
-  CBC_PDF417ECModulusPoly* multiplyByMonomial(int32_t degree,
-                                              int32_t coefficient,
-                                              int32_t& e);
-  CFX_PtrArray* divide(CBC_PDF417ECModulusPoly* other, int32_t& e);
-  CFX_ByteString toString();
-
- private:
-  CBC_PDF417ECModulusGF* m_field;
-  CFX_Int32Array m_coefficients;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417ECMODULUSPOLY_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
deleted file mode 100644
index 5fb2d8e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-int32_t CBC_PDF417ErrorCorrection::EC_COEFFICIENTS[][2500] = {
-    {27, 917},
-    {522, 568, 723, 809},
-    {237, 308, 436, 284, 646, 653, 428, 379},
-    {274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176,
-     65},
-    {361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193,
-     517, 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330,
-     63, 410},
-    {539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381,
-     612, 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762,
-     283, 184, 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651,
-     201, 488, 502, 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843,
-     623, 264, 543},
-    {521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749,
-     415, 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908,
-     490, 704, 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686,
-     606, 860, 569, 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379,
-     712, 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507,
-     48, 228, 821, 808, 898, 784, 663, 627, 378, 382, 262, 380, 602, 754, 336,
-     89, 614, 87, 432, 670, 616, 157, 374, 242, 726, 600, 269, 375, 898, 845,
-     454, 354, 130, 814, 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517,
-     834, 315, 550, 86, 801, 4, 108, 539},
-    {524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138,
-     720, 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280,
-     828, 757, 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801,
-     700, 799, 137, 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257,
-     284, 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684,
-     461, 334, 376, 849, 521, 307, 291, 803, 712, 19, 358, 399, 908, 103, 511,
-     51, 8, 517, 225, 289, 470, 637, 731, 66, 255, 917, 269, 463, 830, 730, 433,
-     848, 585, 136, 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, 580,
-     355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, 71, 263, 318, 374,
-     601, 192, 605, 142, 673, 687, 234, 722, 384, 177, 752, 607, 640, 455, 193,
-     689, 707, 805, 641, 48, 60, 732, 621, 895, 544, 261, 852, 655, 309, 697,
-     755, 756, 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, 144,
-     500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, 914, 342, 126, 32, 681,
-     331, 792, 620, 60, 609, 441, 180, 791, 893, 754, 605, 383, 228, 749, 760,
-     213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20,
-     167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, 251, 688, 95,
-     497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10},
-    {352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350,
-     492, 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193,
-     352, 781, 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640,
-     268, 794, 534, 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37,
-     858, 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761,
-     107, 784, 860, 658, 741, 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20,
-     297, 451, 593, 913, 142, 808, 684, 287, 536, 561, 76, 653, 899, 729, 567,
-     744, 390, 513, 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384,
-     168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, 237, 151, 429,
-     531, 207, 676, 710, 89, 168, 304, 402, 40, 708, 575, 162, 864, 229, 65,
-     861, 841, 512, 164, 477, 221, 92, 358, 785, 288, 357, 850, 836, 827, 736,
-     707, 94, 8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, 361,
-     578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, 45, 902, 452, 167,
-     342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, 37, 124, 298, 332,
-     552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, 283, 711, 472,
-     420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, 383,
-     721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729, 624,
-     59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
-     677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35,
-     777, 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247,
-     184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519,
-     644, 905, 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513,
-     56, 252, 341, 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310,
-     756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590,
-     731, 425, 216, 548, 249, 321, 881, 699, 535, 673, 782, 210, 815, 905, 303,
-     843, 922, 281, 73, 469, 791, 660, 162, 498, 308, 155, 422, 907, 817, 187,
-     62, 16, 425, 535, 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667,
-     751, 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, 5, 39, 923,
-     311, 424, 242, 749, 321, 54, 669, 316, 342, 299, 534, 105, 667, 488, 640,
-     672, 576, 540, 316, 486, 721, 610, 46, 656, 447, 171, 616, 464, 190, 531,
-     297, 321, 762, 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596,
-     284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, 164, 332, 899,
-     165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, 63, 310, 863,
-     251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263}};
-
-CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() {}
-CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() {}
-int32_t CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
-    int32_t errorCorrectionLevel,
-    int32_t& e) {
-  if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {
-    e = BCExceptionErrorCorrectionLevelMustBeBetween0And8;
-    return -1;
-  }
-  return 1 << (errorCorrectionLevel + 1);
-}
-int32_t CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(
-    int32_t n,
-    int32_t& e) {
-  if (n <= 0) {
-    e = BCExceptionIllegalArgumentnMustBeAbove0;
-    return -1;
-  }
-  if (n <= 40) {
-    return 2;
-  }
-  if (n <= 160) {
-    return 3;
-  }
-  if (n <= 320) {
-    return 4;
-  }
-  if (n <= 863) {
-    return 5;
-  }
-  e = BCExceptionNoRecommendationPossible;
-  return -1;
-}
-CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(
-    CFX_WideString dataCodewords,
-    int32_t errorCorrectionLevel,
-    int32_t& e) {
-  int32_t k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' ');
-  FX_WCHAR* ech = FX_Alloc(FX_WCHAR, k);
-  FXSYS_memset(ech, 0, k * sizeof(FX_WCHAR));
-  int32_t sld = dataCodewords.GetLength();
-  for (int32_t i = 0; i < sld; i++) {
-    int32_t t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929;
-    int32_t t2;
-    int32_t t3;
-    for (int32_t j = k - 1; j >= 1; j--) {
-      t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929;
-      t3 = 929 - t2;
-      ech[j] = (FX_WCHAR)((ech[j - 1] + t3) % 929);
-    }
-    t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929;
-    t3 = 929 - t2;
-    ech[0] = (FX_WCHAR)(t3 % 929);
-  }
-  CFX_WideString sb;
-  for (int32_t j = k - 1; j >= 0; j--) {
-    if (ech[j] != 0) {
-      ech[j] = (FX_WCHAR)(929 - ech[j]);
-    }
-    sb += (FX_WCHAR)ech[j];
-  }
-  FX_Free(ech);
-  return sb;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
deleted file mode 100644
index 1c73173..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
-
-#include <stdint.h>
-
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_PDF417ErrorCorrection {
- public:
-  CBC_PDF417ErrorCorrection();
-  virtual ~CBC_PDF417ErrorCorrection();
-  static int32_t getErrorCorrectionCodewordCount(int32_t errorCorrectionLevel,
-                                                 int32_t& e);
-  static int32_t getRecommendedMinimumErrorCorrectionLevel(int32_t n,
-                                                           int32_t& e);
-  static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords,
-                                                int32_t errorCorrectionLevel,
-                                                int32_t& e);
-
- private:
-  static int32_t EC_COEFFICIENTS[][2500];
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
deleted file mode 100644
index 89fed29..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-
-#include "third_party/bigint/BigIntegerLibrary.hh"
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-#define SUBMODE_ALPHA 0
-#define SUBMODE_LOWER 1
-#define SUBMODE_MIXED 2
-
-int32_t CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0;
-int32_t CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1;
-int32_t CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2;
-int32_t CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3;
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900;
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901;
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902;
-int32_t CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913;
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924;
-uint8_t CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = {
-    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58,
-    35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0,  32, 0, 0,  0};
-uint8_t CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = {
-    59, 60, 62, 64, 91, 92, 93,  95, 96, 126, 33, 13,  9,   44, 58,
-    10, 45, 46, 36, 47, 34, 124, 42, 40, 41,  63, 123, 125, 39, 0};
-int32_t CBC_PDF417HighLevelEncoder::MIXED[128] = {0};
-int32_t CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0};
-
-void CBC_PDF417HighLevelEncoder::Initialize() {
-  Inverse();
-}
-void CBC_PDF417HighLevelEncoder::Finalize() {}
-CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel(
-    CFX_WideString wideMsg,
-    Compaction compaction,
-    int32_t& e) {
-  CFX_ByteString bytes;
-  CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes);
-  CFX_WideString msg;
-  int32_t len = bytes.GetLength();
-  for (int32_t i = 0; i < len; i++) {
-    FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff);
-    if (ch == '?' && bytes.GetAt(i) != '?') {
-      e = BCExceptionCharactersOutsideISO88591Encoding;
-      return (FX_WCHAR*)"";
-    }
-    msg += ch;
-  }
-  CFX_ByteArray byteArr;
-  for (int32_t k = 0; k < bytes.GetLength(); k++) {
-    byteArr.Add(bytes.GetAt(k));
-  }
-  CFX_WideString sb;
-  len = msg.GetLength();
-  int32_t p = 0;
-  int32_t textSubMode = SUBMODE_ALPHA;
-  if (compaction == TEXT) {
-    encodeText(msg, p, len, sb, textSubMode);
-  } else if (compaction == BYTES) {
-    encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb);
-  } else if (compaction == NUMERIC) {
-    sb += (FX_WCHAR)LATCH_TO_NUMERIC;
-    encodeNumeric(msg, p, len, sb);
-  } else {
-    int32_t encodingMode = LATCH_TO_TEXT;
-    while (p < len) {
-      int32_t n = determineConsecutiveDigitCount(msg, p);
-      if (n >= 13) {
-        sb += (FX_WCHAR)LATCH_TO_NUMERIC;
-        encodingMode = NUMERIC_COMPACTION;
-        textSubMode = SUBMODE_ALPHA;
-        encodeNumeric(msg, p, n, sb);
-        p += n;
-      } else {
-        int32_t t = determineConsecutiveTextCount(msg, p);
-        if (t >= 5 || n == len) {
-          if (encodingMode != TEXT_COMPACTION) {
-            sb += (FX_WCHAR)LATCH_TO_TEXT;
-            encodingMode = TEXT_COMPACTION;
-            textSubMode = SUBMODE_ALPHA;
-          }
-          textSubMode = encodeText(msg, p, t, sb, textSubMode);
-          p += t;
-        } else {
-          int32_t b = determineConsecutiveBinaryCount(msg, &byteArr, p, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' ');
-          if (b == 0) {
-            b = 1;
-          }
-          if (b == 1 && encodingMode == TEXT_COMPACTION) {
-            encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb);
-          } else {
-            encodeBinary(&byteArr, p, b, encodingMode, sb);
-            encodingMode = BYTE_COMPACTION;
-            textSubMode = SUBMODE_ALPHA;
-          }
-          p += b;
-        }
-      }
-    }
-  }
-  return sb;
-}
-
-void CBC_PDF417HighLevelEncoder::Inverse() {
-  for (size_t l = 0; l < FX_ArraySize(MIXED); ++l)
-    MIXED[l] = -1;
-
-  for (uint8_t i = 0; i < FX_ArraySize(TEXT_MIXED_RAW); ++i) {
-    uint8_t b = TEXT_MIXED_RAW[i];
-    if (b != 0)
-      MIXED[b] = i;
-  }
-
-  for (size_t l = 0; l < FX_ArraySize(PUNCTUATION); ++l)
-    PUNCTUATION[l] = -1;
-
-  for (uint8_t i = 0; i < FX_ArraySize(TEXT_PUNCTUATION_RAW); ++i) {
-    uint8_t b = TEXT_PUNCTUATION_RAW[i];
-    if (b != 0)
-      PUNCTUATION[b] = i;
-  }
-}
-
-int32_t CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg,
-                                               int32_t startpos,
-                                               int32_t count,
-                                               CFX_WideString& sb,
-                                               int32_t initialSubmode) {
-  CFX_WideString tmp;
-  int32_t submode = initialSubmode;
-  int32_t idx = 0;
-  while (TRUE) {
-    FX_WCHAR ch = msg.GetAt(startpos + idx);
-    switch (submode) {
-      case SUBMODE_ALPHA:
-        if (isAlphaUpper(ch)) {
-          if (ch == ' ') {
-            tmp += (FX_WCHAR)26;
-          } else {
-            tmp += (FX_WCHAR)(ch - 65);
-          }
-        } else {
-          if (isAlphaLower(ch)) {
-            submode = SUBMODE_LOWER;
-            tmp += (FX_WCHAR)27;
-            continue;
-          } else if (isMixed(ch)) {
-            submode = SUBMODE_MIXED;
-            tmp += (FX_WCHAR)28;
-            continue;
-          } else {
-            tmp += (FX_WCHAR)29;
-            tmp += PUNCTUATION[ch];
-            break;
-          }
-        }
-        break;
-      case SUBMODE_LOWER:
-        if (isAlphaLower(ch)) {
-          if (ch == ' ') {
-            tmp += (FX_WCHAR)26;
-          } else {
-            tmp += (FX_WCHAR)(ch - 97);
-          }
-        } else {
-          if (isAlphaUpper(ch)) {
-            tmp += (FX_WCHAR)27;
-            tmp += (FX_WCHAR)(ch - 65);
-            break;
-          } else if (isMixed(ch)) {
-            submode = SUBMODE_MIXED;
-            tmp += (FX_WCHAR)28;
-            continue;
-          } else {
-            tmp += (FX_WCHAR)29;
-            tmp += PUNCTUATION[ch];
-            break;
-          }
-        }
-        break;
-      case SUBMODE_MIXED:
-        if (isMixed(ch)) {
-          tmp += MIXED[ch];
-        } else {
-          if (isAlphaUpper(ch)) {
-            submode = SUBMODE_ALPHA;
-            tmp += (FX_WCHAR)28;
-            continue;
-          } else if (isAlphaLower(ch)) {
-            submode = SUBMODE_LOWER;
-            tmp += (FX_WCHAR)27;
-            continue;
-          } else {
-            if (startpos + idx + 1 < count) {
-              FX_WCHAR next = msg.GetAt(startpos + idx + 1);
-              if (isPunctuation(next)) {
-                submode = SUBMODE_PUNCTUATION;
-                tmp += (FX_WCHAR)25;
-                continue;
-              }
-            }
-            tmp += (FX_WCHAR)29;
-            tmp += PUNCTUATION[ch];
-          }
-        }
-        break;
-      default:
-        if (isPunctuation(ch)) {
-          tmp += PUNCTUATION[ch];
-        } else {
-          submode = SUBMODE_ALPHA;
-          tmp += (FX_WCHAR)29;
-          continue;
-        }
-    }
-    idx++;
-    if (idx >= count) {
-      break;
-    }
-  }
-  FX_WCHAR h = 0;
-  int32_t len = tmp.GetLength();
-  for (int32_t i = 0; i < len; i++) {
-    FX_BOOL odd = (i % 2) != 0;
-    if (odd) {
-      h = (FX_WCHAR)((h * 30) + tmp.GetAt(i));
-      sb += h;
-    } else {
-      h = tmp.GetAt(i);
-    }
-  }
-  if ((len % 2) != 0) {
-    sb += (FX_WCHAR)((h * 30) + 29);
-  }
-  return submode;
-}
-void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes,
-                                              int32_t startpos,
-                                              int32_t count,
-                                              int32_t startmode,
-                                              CFX_WideString& sb) {
-  if (count == 1 && startmode == TEXT_COMPACTION) {
-    sb += (FX_WCHAR)SHIFT_TO_BYTE;
-  }
-  int32_t idx = startpos;
-  int32_t i = 0;
-  if (count >= 6) {
-    sb += (FX_WCHAR)LATCH_TO_BYTE;
-    FX_WCHAR chars[5];
-    while ((startpos + count - idx) >= 6) {
-      int64_t t = 0;
-      for (i = 0; i < 6; i++) {
-        t <<= 8;
-        t += bytes->GetAt(idx + i) & 0xff;
-      }
-      for (i = 0; i < 5; i++) {
-        chars[i] = (FX_WCHAR)(t % 900);
-        t /= 900;
-      }
-      for (i = 4; i >= 0; i--) {
-        sb += (chars[i]);
-      }
-      idx += 6;
-    }
-  }
-  if (idx < startpos + count) {
-    sb += (FX_WCHAR)LATCH_TO_BYTE_PADDED;
-  }
-  for (i = idx; i < startpos + count; i++) {
-    int32_t ch = bytes->GetAt(i) & 0xff;
-    sb += (FX_WCHAR)ch;
-  }
-}
-void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg,
-                                               int32_t startpos,
-                                               int32_t count,
-                                               CFX_WideString& sb) {
-  int32_t idx = 0;
-  BigInteger num900 = 900;
-  while (idx < count) {
-    CFX_WideString tmp;
-    int32_t len = 44 < count - idx ? 44 : count - idx;
-    CFX_ByteString part =
-        ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode();
-    BigInteger bigint = stringToBigInteger(part.c_str());
-    do {
-      int32_t c = (bigint % num900).toInt();
-      tmp += (FX_WCHAR)(c);
-      bigint = bigint / num900;
-    } while (!bigint.isZero());
-    for (int32_t i = tmp.GetLength() - 1; i >= 0; i--) {
-      sb += tmp.GetAt(i);
-    }
-    idx += len;
-  }
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) {
-  return ch >= '0' && ch <= '9';
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) {
-  return ch == ' ' || (ch >= 'A' && ch <= 'Z');
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) {
-  return ch == ' ' || (ch >= 'a' && ch <= 'z');
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) {
-  return MIXED[ch] != -1;
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) {
-  return PUNCTUATION[ch] != -1;
-}
-FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) {
-  return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126);
-}
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(
-    CFX_WideString msg,
-    int32_t startpos) {
-  int32_t count = 0;
-  int32_t len = msg.GetLength();
-  int32_t idx = startpos;
-  if (idx < len) {
-    FX_WCHAR ch = msg.GetAt(idx);
-    while (isDigit(ch) && idx < len) {
-      count++;
-      idx++;
-      if (idx < len) {
-        ch = msg.GetAt(idx);
-      }
-    }
-  }
-  return count;
-}
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(
-    CFX_WideString msg,
-    int32_t startpos) {
-  int32_t len = msg.GetLength();
-  int32_t idx = startpos;
-  while (idx < len) {
-    FX_WCHAR ch = msg.GetAt(idx);
-    int32_t numericCount = 0;
-    while (numericCount < 13 && isDigit(ch) && idx < len) {
-      numericCount++;
-      idx++;
-      if (idx < len) {
-        ch = msg.GetAt(idx);
-      }
-    }
-    if (numericCount >= 13) {
-      return idx - startpos - numericCount;
-    }
-    if (numericCount > 0) {
-      continue;
-    }
-    ch = msg.GetAt(idx);
-    if (!isText(ch)) {
-      break;
-    }
-    idx++;
-  }
-  return idx - startpos;
-}
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(
-    CFX_WideString msg,
-    CFX_ByteArray* bytes,
-    int32_t startpos,
-    int32_t& e) {
-  int32_t len = msg.GetLength();
-  int32_t idx = startpos;
-  while (idx < len) {
-    FX_WCHAR ch = msg.GetAt(idx);
-    int32_t numericCount = 0;
-    while (numericCount < 13 && isDigit(ch)) {
-      numericCount++;
-      int32_t i = idx + numericCount;
-      if (i >= len) {
-        break;
-      }
-      ch = msg.GetAt(i);
-    }
-    if (numericCount >= 13) {
-      return idx - startpos;
-    }
-    int32_t textCount = 0;
-    while (textCount < 5 && isText(ch)) {
-      textCount++;
-      int32_t i = idx + textCount;
-      if (i >= len) {
-        break;
-      }
-      ch = msg.GetAt(i);
-    }
-    if (textCount >= 5) {
-      return idx - startpos;
-    }
-    ch = msg.GetAt(idx);
-    if (bytes->GetAt(idx) == 63 && ch != '?') {
-      e = BCExceptionNonEncodableCharacterDetected;
-      return -1;
-    }
-    idx++;
-  }
-  return idx - startpos;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
deleted file mode 100644
index 6ce363d..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-
-class CBC_PDF417HighLevelEncoder {
- public:
-  static CFX_WideString encodeHighLevel(CFX_WideString msg,
-                                        Compaction compaction,
-                                        int32_t& e);
-  static void Inverse();
-  static void Initialize();
-  static void Finalize();
-
- private:
-  static int32_t TEXT_COMPACTION;
-  static int32_t BYTE_COMPACTION;
-  static int32_t NUMERIC_COMPACTION;
-  static int32_t SUBMODE_PUNCTUATION;
-  static int32_t LATCH_TO_TEXT;
-  static int32_t LATCH_TO_BYTE_PADDED;
-  static int32_t LATCH_TO_NUMERIC;
-  static int32_t SHIFT_TO_BYTE;
-  static int32_t LATCH_TO_BYTE;
-  static uint8_t TEXT_MIXED_RAW[];
-  static uint8_t TEXT_PUNCTUATION_RAW[];
-  static int32_t MIXED[128];
-  static int32_t PUNCTUATION[128];
-  static int32_t encodeText(CFX_WideString msg,
-                            int32_t startpos,
-                            int32_t count,
-                            CFX_WideString& sb,
-                            int32_t initialSubmode);
-  static void encodeBinary(CFX_ByteArray* bytes,
-                           int32_t startpos,
-                           int32_t count,
-                           int32_t startmode,
-                           CFX_WideString& sb);
-  static void encodeNumeric(CFX_WideString msg,
-                            int32_t startpos,
-                            int32_t count,
-                            CFX_WideString& sb);
-  static FX_BOOL isDigit(FX_WCHAR ch);
-  static FX_BOOL isAlphaUpper(FX_WCHAR ch);
-  static FX_BOOL isAlphaLower(FX_WCHAR ch);
-  static FX_BOOL isMixed(FX_WCHAR ch);
-  static FX_BOOL isPunctuation(FX_WCHAR ch);
-  static FX_BOOL isText(FX_WCHAR ch);
-  static int32_t determineConsecutiveDigitCount(CFX_WideString msg,
-                                                int32_t startpos);
-  static int32_t determineConsecutiveTextCount(CFX_WideString msg,
-                                               int32_t startpos);
-  static int32_t determineConsecutiveBinaryCount(CFX_WideString msg,
-                                                 CFX_ByteArray* bytes,
-                                                 int32_t startpos,
-                                                 int32_t& e);
-
-  friend class PDF417HighLevelEncoder_EncodeNumeric_Test;
-  friend class PDF417HighLevelEncoder_EncodeBinary_Test;
-  friend class PDF417HighLevelEncoder_EncodeText_Test;
-  friend class PDF417HighLevelEncoder_ConsecutiveDigitCount_Test;
-  friend class PDF417HighLevelEncoder_ConsecutiveTextCount_Test;
-  friend class PDF417HighLevelEncoder_ConsecutiveBinaryCount_Test;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
deleted file mode 100644
index b0f717e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "testing/fx_string_testhelpers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-
-TEST(PDF417HighLevelEncoder, EncodeHighLevel) {
-  // TODO(tsepez): implement test cases.
-}
-
-TEST(PDF417HighLevelEncoder, EncodeText) {
-  // TODO(tsepez): implement test cases.
-}
-
-TEST(PDF417HighLevelEncoder, EncodeBinary) {
-  struct EncodeBinaryCase {
-    const char* input;
-    int offset;
-    int count;
-    int startmode;
-    const wchar_t* expected;
-    int expected_length;
-  } encode_binary_cases[] = {
-      // Empty string encodes as empty string.
-      {"", 0, 0, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"", 0},
-
-      // Fewer than 6 characters encodes as prefix without compaction.
-      {"xxxxx", 0, 5, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION,
-       L"\x0385xxxxx", 6},
-
-      // 6 charcters triggerst text encoding compaction.
-      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION,
-       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
-
-      // Same result if initially in numeric compaction mode.
-      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION,
-       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
-  };
-
-  CBC_PDF417HighLevelEncoder::Initialize();
-  for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) {
-    EncodeBinaryCase* ptr = &encode_binary_cases[i];
-    CFX_ByteArray input_array;
-    size_t input_length = strlen(ptr->input);
-    input_array.SetSize(input_length);
-    for (size_t j = 0; j < input_length; ++j) {
-      input_array.SetAt(j, ptr->input[j]);
-    }
-    CFX_WideString expected(ptr->expected, ptr->expected_length);
-    CFX_WideString result;
-    CBC_PDF417HighLevelEncoder::encodeBinary(
-        &input_array, ptr->offset, ptr->count, ptr->startmode, result);
-    EXPECT_EQ(expected, result) << " for case number " << i;
-  }
-  CBC_PDF417HighLevelEncoder::Finalize();
-}
-
-TEST(PDF417HighLevelEncoder, EncodeNumeric) {
-  struct EncodeNumericCase {
-    const wchar_t* input;
-    int offset;
-    int count;
-    const wchar_t* expected;
-    int expected_length;
-  } encode_numeric_cases[] = {
-      // Empty string encodes as empty string.
-      {L"", 0, 0, L"", 0},
-
-      // Single 0 should encode as 10 base-900 == a.
-      {L"0", 0, 1, L"\x000a", 1},
-
-      // 800 should encode as 1800 base-900 == 2,0.
-      {L"800", 0, 3, L"\x0002\x0000", 2},
-
-      // Test longer strings and sub-strings.
-      {L"123456", 0, 6, L"\x0001\x015c\x0100", 3},
-      {L"123456", 0, 5, L"\x007c\x02e9", 2},
-      {L"123456", 1, 5, L"\x0089\x009c", 2},
-      {L"123456", 2, 2, L"\x0086", 1},
-
-      // Up to 44 characters encodes as 15 base-900 words.
-      {L"00000000000000000000000000000000000000000000",
-       0,
-       44,
-       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
-       L"\x0090\x020b\x019b\x0064",
-       15},
-
-      // 45 characters should encode as same 15 words followed by one additional
-      // word.
-      {L"000000000000000000000000000000000000000000000",
-       0,
-       45,
-       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
-       L"\x0090\x020b\x019b\x0064\x000a",
-       16},
-
-      // 44 characters followed by 800 should encode as 15 words followed by
-      // 1800 base-900 == 2,0.
-      {L"00000000000000000000000000000000000000000000800",
-       0,
-       47,
-       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
-       L"\x0090\x020b\x019b\x0064\x0002\x0000",
-       17},
-
-      // Even longer input.
-      {L"10000000000000000000000000000000000000000000000000",
-       0,
-       50,
-       L"\x01e0\x02f0\x036d\x02ad\x029c\x01ea\x0011\x000b\x02d6\x023c\x0108"
-       L"\x02bb\x0023\x02d2\x00c8\x0001\x00d3\x0064",
-       18},
-  };
-
-  CBC_PDF417HighLevelEncoder::Initialize();
-  for (size_t i = 0; i < FX_ArraySize(encode_numeric_cases); ++i) {
-    EncodeNumericCase* ptr = &encode_numeric_cases[i];
-    CFX_WideString input(ptr->input);
-    CFX_WideString expected(ptr->expected, ptr->expected_length);
-    CFX_WideString result;
-    CBC_PDF417HighLevelEncoder::encodeNumeric(input, ptr->offset, ptr->count,
-                                              result);
-    EXPECT_EQ(expected, result) << " for case number " << i;
-  }
-  CBC_PDF417HighLevelEncoder::Finalize();
-}
-
-TEST(PDF417HighLevelEncoder, ConsecutiveDigitCount) {
-  struct ConsecutiveDigitCase {
-    const wchar_t* input;
-    int offset;
-    int expected_count;
-  } consecutive_digit_cases[] = {
-      // Empty string contains 0 consecuitve digits.
-      {L"", 0, 0},
-
-      // Single non-digit character contains 0 consecutive digits.
-      {L"X", 0, 0},
-
-      // Leading non-digit followed by digits contains 0 consecutive.
-      {L"X123", 0, 0},
-
-      // Single digit contains 1 consecutive digit.
-      {L"1", 0, 1},
-
-      // Single digit followe by non-digit contains 1 consecutive digit.
-      {L"1Z", 0, 1},
-
-      // Test longer strings.
-      {L"123FOO45678", 0, 3},
-
-      // Test subtring starting in digits field.
-      {L"123FOO45678", 3, 0},
-
-      // Test subtring starting in non-digits field.
-      {L"123FOO45678", 3, 0},
-
-      // Test substring starting in digits field following non-digit field.
-      {L"123FOO45678", 6, 5},
-  };
-
-  CBC_PDF417HighLevelEncoder::Initialize();
-  for (size_t i = 0; i < FX_ArraySize(consecutive_digit_cases); ++i) {
-    ConsecutiveDigitCase* ptr = &consecutive_digit_cases[i];
-    CFX_WideString input(ptr->input);
-    int actual_count =
-        CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(input,
-                                                                   ptr->offset);
-    EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
-  }
-  CBC_PDF417HighLevelEncoder::Finalize();
-}
-
-TEST(PDF417HighLevelEncoder, ConsecutiveTextCount) {
-  struct ConsecutiveTextCase {
-    const wchar_t* input;
-    int offset;
-    int expected_count;
-  } consecutive_text_cases[] = {
-      // Empty string contains 0 consecutive text characters.
-      {L"", 0, 0},
-
-      // Single text character is 1 consecutive text characters.
-      {L"X", 0, 1},
-
-      // Trailing numbers count as text characters.
-      {L"X123", 0, 4},
-
-      // Leading numbers count as text characters.
-      {L"123X", 0, 4},
-
-      // Embedded lo-value binary characters terminate text runs.
-      {L"ABC\x0001XXXX", 0, 3},
-
-      // Embedded hi-value binary characters terminate text runs.
-      {L"ABC\x0100XXXX", 0, 3},
-
-      // Text run still found after indexing past lo-value character.
-      {L"ABC\x0001XXXX", 4, 4},
-
-      // Text run still found after indexing past hi-value character.
-      {L"ABC\x0100XXXX", 4, 4},
-
-      // Leading hi-value character results in 0 consecutive characters.
-      {L"\x0100XXX", 0, 0},
-
-      // Up to 12 numbers count as text.
-      {L"123456789012", 0, 12},
-
-      // 13 or more numbers are compresssed using numeric compression, not text.
-      {L"1234567890123", 0, 0},
-
-      // Leading Text character doesn't affect the 12 character case.
-      {L"X123456789012", 0, 13},
-
-      // Leading Text character doesn't affect the 13 character case.
-      {L"X1234567890123", 0, 1},
-
-      // Jumping between numbers and letters works properly.
-      {L"XXX121XXX12345678901234", 0, 9},
-  };
-
-  CBC_PDF417HighLevelEncoder::Initialize();
-  for (size_t i = 0; i < FX_ArraySize(consecutive_text_cases); ++i) {
-    ConsecutiveTextCase* ptr = &consecutive_text_cases[i];
-    CFX_WideString input(ptr->input);
-    int actual_count =
-        CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(input,
-                                                                  ptr->offset);
-    EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
-  }
-  CBC_PDF417HighLevelEncoder::Finalize();
-}
-
-TEST(PDF417HighLevelEncoder, ConsecutiveBinaryCount) {}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp
deleted file mode 100644
index 6365e27..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2009 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <limits>
-
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_DecoderResult.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_PDF417Reader::CBC_PDF417Reader() {}
-CBC_PDF417Reader::~CBC_PDF417Reader() {}
-
-CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
-  return Decode(image, 0, e);
-}
-CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image,
-                                        FX_BOOL multiple,
-                                        int32_t hints,
-                                        int32_t& e) {
-  CFX_ByteString results;
-  CBC_PDF417DetectorResult* detectorResult =
-      CBC_Detector::detect(image, hints, multiple, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  for (int32_t i = 0; i < detectorResult->getPoints()->GetSize(); i++) {
-    CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i);
-    CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(
-        detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4),
-        (CBC_ResultPoint*)points->GetAt(5), (CBC_ResultPoint*)points->GetAt(6),
-        (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points),
-        getMaxCodewordWidth(*points), e);
-    if (ResultTemp == NULL) {
-      delete detectorResult;
-      e = BCExceptiontNotFoundInstance;
-      return "";
-    }
-    results += ResultTemp->GetText();
-    delete ResultTemp;
-  }
-  delete detectorResult;
-  return results;
-}
-CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image,
-                                        int32_t hints,
-                                        int32_t& e) {
-  CFX_ByteString bs = Decode(image, FALSE, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return bs;
-}
-int32_t CBC_PDF417Reader::getMaxWidth(CBC_ResultPoint* p1,
-                                      CBC_ResultPoint* p2) {
-  if (p1 == NULL || p2 == NULL) {
-    return 0;
-  }
-  return (int32_t)FXSYS_fabs(p1->GetX() - p2->GetX());
-}
-int32_t CBC_PDF417Reader::getMinWidth(CBC_ResultPoint* p1,
-                                      CBC_ResultPoint* p2) {
-  if (!p1 || !p2)
-    return std::numeric_limits<int32_t>::max();
-  return (int32_t)FXSYS_fabs(p1->GetX() - p2->GetX());
-}
-int32_t CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) {
-  int32_t a =
-      getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t b =
-      getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
-                          (CBC_ResultPoint*)p.GetAt(4)) < a
-                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
-                                (CBC_ResultPoint*)p.GetAt(4))
-                  : a;
-  int32_t d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
-                          (CBC_ResultPoint*)p.GetAt(5)) < b
-                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
-                                (CBC_ResultPoint*)p.GetAt(5))
-                  : b;
-  return c < d ? c : d;
-}
-int32_t CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) {
-  int32_t a =
-      getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t b =
-      getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t c = getMinWidth((CBC_ResultPoint*)p.GetAt(0),
-                          (CBC_ResultPoint*)p.GetAt(4)) < a
-                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(0),
-                                (CBC_ResultPoint*)p.GetAt(4))
-                  : a;
-  int32_t d = getMinWidth((CBC_ResultPoint*)p.GetAt(1),
-                          (CBC_ResultPoint*)p.GetAt(5)) < b
-                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(1),
-                                (CBC_ResultPoint*)p.GetAt(5))
-                  : b;
-  return c < d ? c : d;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h
deleted file mode 100644
index 5c19d86..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417READER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417READER_H_
-
-class CBC_BinaryBitmap;
-class CBC_ResultPoint;
-class CBC_PDF417Reader;
-class CBC_PDF417Reader : public CBC_Reader {
- public:
-  CBC_PDF417Reader();
-  virtual ~CBC_PDF417Reader();
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image,
-                        FX_BOOL multiple,
-                        int32_t hints,
-                        int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
-
- private:
-  static int32_t getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
-  static int32_t getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
-  static int32_t getMaxCodewordWidth(CFX_PtrArray& p);
-  static int32_t getMinCodewordWidth(CFX_PtrArray& p);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417READER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp
deleted file mode 100644
index 5bfcdee..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h"
-
-CBC_PDF417ResultMetadata::CBC_PDF417ResultMetadata() {}
-CBC_PDF417ResultMetadata::~CBC_PDF417ResultMetadata() {}
-int32_t CBC_PDF417ResultMetadata::getSegmentIndex() {
-  return m_segmentIndex;
-}
-void CBC_PDF417ResultMetadata::setSegmentIndex(int32_t segmentIndex) {
-  m_segmentIndex = segmentIndex;
-}
-CFX_ByteString CBC_PDF417ResultMetadata::getFileId() {
-  return m_fileId;
-}
-void CBC_PDF417ResultMetadata::setFileId(CFX_ByteString fileId) {
-  m_fileId = fileId;
-}
-CFX_Int32Array& CBC_PDF417ResultMetadata::getOptionalData() {
-  return m_optionalData;
-}
-void CBC_PDF417ResultMetadata::setOptionalData(CFX_Int32Array& optionalData) {
-  m_optionalData.Copy(optionalData);
-}
-FX_BOOL CBC_PDF417ResultMetadata::isLastSegment() {
-  return m_lastSegment;
-}
-void CBC_PDF417ResultMetadata::setLastSegment(FX_BOOL lastSegment) {
-  m_lastSegment = lastSegment;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h
deleted file mode 100644
index a70d3ef..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_PDF417ResultMetadata {
- public:
-  CBC_PDF417ResultMetadata();
-  virtual ~CBC_PDF417ResultMetadata();
-  int32_t getSegmentIndex();
-  void setSegmentIndex(int32_t segmentIndex);
-  CFX_ByteString getFileId();
-  void setFileId(CFX_ByteString fileId);
-  CFX_Int32Array& getOptionalData();
-  void setOptionalData(CFX_Int32Array& optionalData);
-  FX_BOOL isLastSegment();
-  void setLastSegment(FX_BOOL lastSegment);
-
- private:
-  int32_t m_segmentIndex;
-  CFX_ByteString m_fileId;
-  CFX_Int32Array m_optionalData;
-  FX_BOOL m_lastSegment;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417RESULTMETADATA_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
deleted file mode 100644
index 820b15e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_DecoderResult.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-int32_t CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2;
-int32_t CBC_PDF417ScanningDecoder::MAX_ERRORS = 3;
-int32_t CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512;
-CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL;
-
-CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() {}
-CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() {}
-void CBC_PDF417ScanningDecoder::Initialize() {
-  errorCorrection = new CBC_PDF417ECErrorCorrection;
-}
-void CBC_PDF417ScanningDecoder::Finalize() {
-  delete errorCorrection;
-}
-CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(
-    CBC_CommonBitMatrix* image,
-    CBC_ResultPoint* imageTopLeft,
-    CBC_ResultPoint* imageBottomLeft,
-    CBC_ResultPoint* imageTopRight,
-    CBC_ResultPoint* imageBottomRight,
-    int32_t minCodewordWidth,
-    int32_t maxCodewordWidth,
-    int32_t& e) {
-  CBC_BoundingBox* boundingBox = new CBC_BoundingBox(
-      image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL;
-  CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL;
-  CBC_DetectionResult* detectionResult = NULL;
-  for (int32_t i = 0; i < 2; i++) {
-    if (imageTopLeft) {
-      leftRowIndicatorColumn =
-          getRowIndicatorColumn(image, boundingBox, *imageTopLeft, TRUE,
-                                minCodewordWidth, maxCodewordWidth);
-    }
-    if (imageTopRight) {
-      rightRowIndicatorColumn =
-          getRowIndicatorColumn(image, boundingBox, *imageTopRight, FALSE,
-                                minCodewordWidth, maxCodewordWidth);
-    }
-    detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn, e);
-    if (e != BCExceptionNO) {
-      e = BCExceptiontNotFoundInstance;
-      delete leftRowIndicatorColumn;
-      delete rightRowIndicatorColumn;
-      delete boundingBox;
-      return NULL;
-    }
-    if (i == 0 && (detectionResult->getBoundingBox()->getMinY() <
-                       boundingBox->getMinY() ||
-                   detectionResult->getBoundingBox()->getMaxY() >
-                       boundingBox->getMaxY())) {
-      delete boundingBox;
-      boundingBox = detectionResult->getBoundingBox();
-    } else {
-      detectionResult->setBoundingBox(boundingBox);
-      break;
-    }
-  }
-  int32_t maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1;
-  detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn);
-  detectionResult->setDetectionResultColumn(maxBarcodeColumn,
-                                            rightRowIndicatorColumn);
-  FX_BOOL leftToRight = leftRowIndicatorColumn != NULL;
-  for (int32_t barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn;
-       barcodeColumnCount++) {
-    int32_t barcodeColumn = leftToRight ? barcodeColumnCount
-                                        : maxBarcodeColumn - barcodeColumnCount;
-    if (detectionResult->getDetectionResultColumn(barcodeColumn)) {
-      continue;
-    }
-    CBC_DetectionResultColumn* detectionResultColumn = NULL;
-    if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) {
-      detectionResultColumn = new CBC_DetectionResultRowIndicatorColumn(
-          boundingBox, barcodeColumn == 0);
-    } else {
-      detectionResultColumn = new CBC_DetectionResultColumn(boundingBox);
-    }
-    detectionResult->setDetectionResultColumn(barcodeColumn,
-                                              detectionResultColumn);
-    int32_t startColumn = -1;
-    int32_t previousStartColumn = startColumn;
-    for (int32_t imageRow = boundingBox->getMinY();
-         imageRow <= boundingBox->getMaxY(); imageRow++) {
-      startColumn =
-          getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight);
-      if (startColumn < 0 || startColumn > boundingBox->getMaxX()) {
-        if (previousStartColumn == -1) {
-          continue;
-        }
-        startColumn = previousStartColumn;
-      }
-      CBC_Codeword* codeword = detectCodeword(
-          image, boundingBox->getMinX(), boundingBox->getMaxX(), leftToRight,
-          startColumn, imageRow, minCodewordWidth, maxCodewordWidth);
-      if (codeword) {
-        detectionResultColumn->setCodeword(imageRow, codeword);
-        previousStartColumn = startColumn;
-        minCodewordWidth = minCodewordWidth < codeword->getWidth()
-                               ? minCodewordWidth
-                               : codeword->getWidth();
-        maxCodewordWidth = maxCodewordWidth > codeword->getWidth()
-                               ? maxCodewordWidth
-                               : codeword->getWidth();
-      }
-    }
-  }
-  CBC_CommonDecoderResult* decoderresult =
-      createDecoderResult(detectionResult, e);
-  if (e != BCExceptionNO) {
-    delete detectionResult;
-    return NULL;
-  }
-  return decoderresult;
-}
-CFX_ByteString CBC_PDF417ScanningDecoder::toString(
-    CFX_PtrArray* barcodeMatrix) {
-  CFX_ByteString result;
-  for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
-    result += row;
-    int32_t l = 0;
-    for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) {
-      CBC_BarcodeValue* barcodeValue =
-          (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
-              ->GetAt(l);
-      if (barcodeValue->getValue()->GetSize() == 0) {
-        result += "";
-      } else {
-        result += barcodeValue->getValue()->GetAt(0);
-        result +=
-            barcodeValue->getConfidence(barcodeValue->getValue()->GetAt(0));
-      }
-    }
-  }
-  return result;
-}
-CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(
-    CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
-    CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
-    int32_t& e) {
-  if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) {
-    e = BCExceptionIllegalArgument;
-    return NULL;
-  }
-  CBC_BarcodeMetadata* barcodeMetadata =
-      getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn);
-  if (barcodeMetadata == NULL) {
-    e = BCExceptionCannotMetadata;
-    return NULL;
-  }
-  CBC_BoundingBox* leftboundingBox =
-      adjustBoundingBox(leftRowIndicatorColumn, e);
-  if (e != BCExceptionNO) {
-    delete barcodeMetadata;
-    return NULL;
-  }
-  CBC_BoundingBox* rightboundingBox =
-      adjustBoundingBox(rightRowIndicatorColumn, e);
-  if (e != BCExceptionNO) {
-    delete barcodeMetadata;
-    return NULL;
-  }
-  CBC_BoundingBox* boundingBox =
-      CBC_BoundingBox::merge(leftboundingBox, rightboundingBox, e);
-  if (e != BCExceptionNO) {
-    delete barcodeMetadata;
-    return NULL;
-  }
-  CBC_DetectionResult* detectionresult =
-      new CBC_DetectionResult(barcodeMetadata, boundingBox);
-  return detectionresult;
-}
-CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(
-    CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
-    int32_t& e) {
-  if (rowIndicatorColumn == NULL) {
-    return NULL;
-  }
-  CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t maxRowHeight = getMax(*rowHeights);
-  int32_t missingStartRows = 0;
-  for (int32_t i = 0; i < rowHeights->GetSize(); i++) {
-    int32_t rowHeight = rowHeights->GetAt(i);
-    missingStartRows += maxRowHeight - rowHeight;
-    if (rowHeight > 0) {
-      break;
-    }
-  }
-  CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords();
-  for (int32_t row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL;
-       row++) {
-    missingStartRows--;
-  }
-  int32_t missingEndRows = 0;
-  for (int32_t row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) {
-    missingEndRows += maxRowHeight - rowHeights->GetAt(row1);
-    if (rowHeights->GetAt(row1) > 0) {
-      break;
-    }
-  }
-  for (int32_t row2 = codewords->GetSize() - 1;
-       missingEndRows > 0 && codewords->GetAt(row2) == NULL; row2--) {
-    missingEndRows--;
-  }
-  CBC_BoundingBox* boundingBox =
-      rowIndicatorColumn->getBoundingBox()->addMissingRows(
-          missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return boundingBox;
-}
-int32_t CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) {
-  int32_t maxValue = -1;
-  for (int32_t i = 0; i < values.GetSize(); i++) {
-    int32_t value = values.GetAt(i);
-    maxValue = maxValue > value ? maxValue : value;
-  }
-  return maxValue;
-}
-CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(
-    CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
-    CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) {
-  CBC_BarcodeMetadata* leftBarcodeMetadata = NULL;
-  CBC_BarcodeMetadata* rightBarcodeMetadata = NULL;
-  if (leftRowIndicatorColumn == NULL ||
-      (leftBarcodeMetadata = leftRowIndicatorColumn->getBarcodeMetadata()) ==
-          NULL) {
-    return rightRowIndicatorColumn == NULL
-               ? NULL
-               : rightRowIndicatorColumn->getBarcodeMetadata();
-  }
-  if (rightRowIndicatorColumn == NULL ||
-      (rightBarcodeMetadata = rightRowIndicatorColumn->getBarcodeMetadata()) ==
-          NULL) {
-    return leftRowIndicatorColumn == NULL
-               ? NULL
-               : leftRowIndicatorColumn->getBarcodeMetadata();
-  }
-  if (leftBarcodeMetadata->getColumnCount() !=
-          rightBarcodeMetadata->getColumnCount() &&
-      leftBarcodeMetadata->getErrorCorrectionLevel() !=
-          rightBarcodeMetadata->getErrorCorrectionLevel() &&
-      leftBarcodeMetadata->getRowCount() !=
-          rightBarcodeMetadata->getRowCount()) {
-    delete leftBarcodeMetadata;
-    delete rightBarcodeMetadata;
-    return NULL;
-  }
-  delete rightBarcodeMetadata;
-  return leftBarcodeMetadata;
-}
-CBC_DetectionResultRowIndicatorColumn*
-CBC_PDF417ScanningDecoder::getRowIndicatorColumn(CBC_CommonBitMatrix* image,
-                                                 CBC_BoundingBox* boundingBox,
-                                                 CBC_ResultPoint startPoint,
-                                                 FX_BOOL leftToRight,
-                                                 int32_t minCodewordWidth,
-                                                 int32_t maxCodewordWidth) {
-  CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn =
-      new CBC_DetectionResultRowIndicatorColumn(boundingBox, leftToRight);
-  for (int32_t i = 0; i < 2; i++) {
-    int32_t increment = i == 0 ? 1 : -1;
-    int32_t startColumn = (int32_t)startPoint.GetX();
-    for (int32_t imageRow = (int32_t)startPoint.GetY();
-         imageRow <= boundingBox->getMaxY() &&
-         imageRow >= boundingBox->getMinY();
-         imageRow += increment) {
-      CBC_Codeword* codeword =
-          detectCodeword(image, 0, image->GetWidth(), leftToRight, startColumn,
-                         imageRow, minCodewordWidth, maxCodewordWidth);
-      if (codeword) {
-        rowIndicatorColumn->setCodeword(imageRow, codeword);
-        if (leftToRight) {
-          startColumn = codeword->getStartX();
-        } else {
-          startColumn = codeword->getEndX();
-        }
-      }
-    }
-  }
-  return rowIndicatorColumn;
-}
-void CBC_PDF417ScanningDecoder::adjustCodewordCount(
-    CBC_DetectionResult* detectionResult,
-    CFX_PtrArray* barcodeMatrix,
-    int32_t& e) {
-  CFX_Int32Array* numberOfCodewords =
-      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-          ->getValue();
-  int32_t calculatedNumberOfCodewords =
-      detectionResult->getBarcodeColumnCount() *
-          detectionResult->getBarcodeRowCount() -
-      getNumberOfECCodeWords(detectionResult->getBarcodeECLevel());
-  if (numberOfCodewords->GetSize() == 0) {
-    if (calculatedNumberOfCodewords < 1 ||
-        calculatedNumberOfCodewords >
-            CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) {
-      e = BCExceptiontNotFoundInstance;
-      delete numberOfCodewords;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-        ->setValue(calculatedNumberOfCodewords);
-  } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) {
-    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-        ->setValue(calculatedNumberOfCodewords);
-  }
-  delete numberOfCodewords;
-}
-CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(
-    CBC_DetectionResult* detectionResult,
-    int32_t& e) {
-  CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult);
-  adjustCodewordCount(detectionResult, barcodeMatrix, e);
-  if (e != BCExceptionNO) {
-    for (int32_t i = 0; i < barcodeMatrix->GetSize(); i++) {
-      CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i);
-      for (int32_t j = 0; j < temp->GetSize(); j++) {
-        delete (CBC_BarcodeValue*)temp->GetAt(j);
-      }
-      temp->RemoveAll();
-      delete temp;
-    }
-    barcodeMatrix->RemoveAll();
-    delete barcodeMatrix;
-    return NULL;
-  }
-  CFX_Int32Array erasures;
-  CFX_Int32Array codewords;
-  codewords.SetSize(detectionResult->getBarcodeRowCount() *
-                    detectionResult->getBarcodeColumnCount());
-  CFX_PtrArray ambiguousIndexValuesList;
-  CFX_Int32Array ambiguousIndexesList;
-  for (int32_t row = 0; row < detectionResult->getBarcodeRowCount(); row++) {
-    for (int32_t l = 0; l < detectionResult->getBarcodeColumnCount(); l++) {
-      CFX_Int32Array* values =
-          ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
-               ->GetAt(l + 1))
-              ->getValue();
-      int32_t codewordIndex =
-          row * detectionResult->getBarcodeColumnCount() + l;
-      if (values->GetSize() == 0) {
-        erasures.Add(codewordIndex);
-      } else if (values->GetSize() == 1) {
-        codewords[codewordIndex] = values->GetAt(0);
-      } else {
-        ambiguousIndexesList.Add(codewordIndex);
-        ambiguousIndexValuesList.Add(values);
-      }
-    }
-  }
-  CFX_PtrArray ambiguousIndexValues;
-  ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize());
-  for (int32_t i = 0; i < ambiguousIndexValues.GetSize(); i++) {
-    ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i));
-  }
-  for (int32_t l = 0; l < barcodeMatrix->GetSize(); l++) {
-    CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l);
-    for (int32_t j = 0; j < temp->GetSize(); j++) {
-      delete (CBC_BarcodeValue*)temp->GetAt(j);
-    }
-    temp->RemoveAll();
-    delete temp;
-  }
-  barcodeMatrix->RemoveAll();
-  delete barcodeMatrix;
-  CBC_CommonDecoderResult* decoderResult =
-      createDecoderResultFromAmbiguousValues(
-          detectionResult->getBarcodeECLevel(), codewords, erasures,
-          ambiguousIndexesList, ambiguousIndexValues, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return decoderResult;
-}
-CBC_CommonDecoderResult*
-CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(
-    int32_t ecLevel,
-    CFX_Int32Array& codewords,
-    CFX_Int32Array& erasureArray,
-    CFX_Int32Array& ambiguousIndexes,
-    CFX_PtrArray& ambiguousIndexValues,
-    int32_t& e) {
-  CFX_Int32Array ambiguousIndexCount;
-  ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize());
-  int32_t tries = 100;
-  while (tries-- > 0) {
-    for (int32_t l = 0; l < ambiguousIndexCount.GetSize(); l++) {
-      codewords[ambiguousIndexes[l]] =
-          ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))
-              ->GetAt(ambiguousIndexCount[l]);
-    }
-    CBC_CommonDecoderResult* decoderResult =
-        decodeCodewords(codewords, ecLevel, erasureArray, e);
-    if (e != BCExceptionNO) {
-      e = BCExceptionNO;
-      continue;
-    } else {
-      return decoderResult;
-    }
-    if (ambiguousIndexCount.GetSize() == 0) {
-      e = BCExceptionChecksumInstance;
-      return NULL;
-    }
-    for (int32_t i = 0; i < ambiguousIndexCount.GetSize(); i++) {
-      if (ambiguousIndexCount[i] <
-          ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) {
-        ambiguousIndexCount[i]++;
-        break;
-      } else {
-        ambiguousIndexCount[i] = 0;
-        if (i == ambiguousIndexCount.GetSize() - 1) {
-          e = BCExceptionChecksumInstance;
-          return NULL;
-        }
-      }
-    }
-  }
-  e = BCExceptionChecksumInstance;
-  return NULL;
-}
-CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(
-    CBC_DetectionResult* detectionResult) {
-  CFX_PtrArray* barcodeMatrix = new CFX_PtrArray;
-  barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount());
-  CFX_PtrArray* temp = NULL;
-  int32_t colume = 0;
-  for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
-    temp = new CFX_PtrArray;
-    temp->SetSize(detectionResult->getBarcodeColumnCount() + 2);
-    for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2;
-         colume++) {
-      temp->SetAt(colume, new CBC_BarcodeValue());
-    }
-    barcodeMatrix->SetAt(row, temp);
-  }
-  colume = -1;
-  for (int32_t i = 0;
-       i < detectionResult->getDetectionResultColumns().GetSize(); i++) {
-    CBC_DetectionResultColumn* detectionResultColumn =
-        (CBC_DetectionResultColumn*)detectionResult->getDetectionResultColumns()
-            .GetAt(i);
-    colume++;
-    if (detectionResultColumn == NULL) {
-      continue;
-    }
-    CFX_PtrArray* temp = detectionResultColumn->getCodewords();
-    for (int32_t l = 0; l < temp->GetSize(); l++) {
-      CBC_Codeword* codeword = (CBC_Codeword*)temp->GetAt(l);
-      if (codeword == NULL || codeword->getRowNumber() == -1) {
-        continue;
-      }
-      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(
-                               codeword->getRowNumber()))
-           ->GetAt(colume))
-          ->setValue(codeword->getValue());
-    }
-  }
-  return barcodeMatrix;
-}
-FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(
-    CBC_DetectionResult* detectionResult,
-    int32_t barcodeColumn) {
-  return barcodeColumn >= 0 &&
-         barcodeColumn <= detectionResult->getBarcodeColumnCount() + 1;
-}
-int32_t CBC_PDF417ScanningDecoder::getStartColumn(
-    CBC_DetectionResult* detectionResult,
-    int32_t barcodeColumn,
-    int32_t imageRow,
-    FX_BOOL leftToRight) {
-  int32_t offset = leftToRight ? 1 : -1;
-  CBC_Codeword* codeword = NULL;
-  if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
-    codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)
-                   ->getCodeword(imageRow);
-  }
-  if (codeword) {
-    return leftToRight ? codeword->getEndX() : codeword->getStartX();
-  }
-  codeword = detectionResult->getDetectionResultColumn(barcodeColumn)
-                 ->getCodewordNearby(imageRow);
-  if (codeword) {
-    return leftToRight ? codeword->getStartX() : codeword->getEndX();
-  }
-  if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
-    codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)
-                   ->getCodewordNearby(imageRow);
-  }
-  if (codeword) {
-    return leftToRight ? codeword->getEndX() : codeword->getStartX();
-  }
-  int32_t skippedColumns = 0;
-  while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) {
-    barcodeColumn -= offset;
-    for (int32_t i = 0;
-         i < detectionResult->getDetectionResultColumn(barcodeColumn)
-                 ->getCodewords()
-                 ->GetSize();
-         i++) {
-      CBC_Codeword* previousRowCodeword =
-          (CBC_Codeword*)detectionResult->getDetectionResultColumn(
-                                            barcodeColumn)
-              ->getCodewords()
-              ->GetAt(i);
-      if (previousRowCodeword) {
-        return (leftToRight ? previousRowCodeword->getEndX()
-                            : previousRowCodeword->getStartX()) +
-               offset * skippedColumns * (previousRowCodeword->getEndX() -
-                                          previousRowCodeword->getStartX());
-      }
-    }
-    skippedColumns++;
-  }
-  return leftToRight ? detectionResult->getBoundingBox()->getMinX()
-                     : detectionResult->getBoundingBox()->getMaxX();
-}
-CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(
-    CBC_CommonBitMatrix* image,
-    int32_t minColumn,
-    int32_t maxColumn,
-    FX_BOOL leftToRight,
-    int32_t startColumn,
-    int32_t imageRow,
-    int32_t minCodewordWidth,
-    int32_t maxCodewordWidth) {
-  startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn,
-                                          leftToRight, startColumn, imageRow);
-  CFX_Int32Array* moduleBitCount = getModuleBitCount(
-      image, minColumn, maxColumn, leftToRight, startColumn, imageRow);
-  if (moduleBitCount == NULL) {
-    return NULL;
-  }
-  int32_t endColumn;
-  int32_t codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount);
-  if (leftToRight) {
-    endColumn = startColumn + codewordBitCount;
-  } else {
-    for (int32_t i = 0; i<moduleBitCount->GetSize()>> 1; i++) {
-      int32_t tmpCount = moduleBitCount->GetAt(i);
-      moduleBitCount->SetAt(
-          i, moduleBitCount->GetAt(moduleBitCount->GetSize() - 1 - i));
-      moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount);
-    }
-    endColumn = startColumn;
-    startColumn = endColumn - codewordBitCount;
-  }
-  int32_t decodedValue =
-      CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBitCount);
-  int32_t codeword = CBC_PDF417Common::getCodeword(decodedValue);
-  delete moduleBitCount;
-  if (codeword == -1) {
-    return NULL;
-  }
-  return new CBC_Codeword(startColumn, endColumn,
-                          getCodewordBucketNumber(decodedValue), codeword);
-}
-CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(
-    CBC_CommonBitMatrix* image,
-    int32_t minColumn,
-    int32_t maxColumn,
-    FX_BOOL leftToRight,
-    int32_t startColumn,
-    int32_t imageRow) {
-  int32_t imageColumn = startColumn;
-  CFX_Int32Array* moduleBitCount = new CFX_Int32Array;
-  moduleBitCount->SetSize(8);
-  int32_t moduleNumber = 0;
-  int32_t increment = leftToRight ? 1 : -1;
-  FX_BOOL previousPixelValue = leftToRight;
-  while (((leftToRight && imageColumn < maxColumn) ||
-          (!leftToRight && imageColumn >= minColumn)) &&
-         moduleNumber < moduleBitCount->GetSize()) {
-    if (image->Get(imageColumn, imageRow) == previousPixelValue) {
-      moduleBitCount->SetAt(moduleNumber,
-                            moduleBitCount->GetAt(moduleNumber) + 1);
-      imageColumn += increment;
-    } else {
-      moduleNumber++;
-      previousPixelValue = !previousPixelValue;
-    }
-  }
-  if (moduleNumber == moduleBitCount->GetSize() ||
-      (((leftToRight && imageColumn == maxColumn) ||
-        (!leftToRight && imageColumn == minColumn)) &&
-       moduleNumber == moduleBitCount->GetSize() - 1)) {
-    return moduleBitCount;
-  }
-  delete moduleBitCount;
-  return NULL;
-}
-int32_t CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(
-    int32_t barcodeECLevel) {
-  return 2 << barcodeECLevel;
-}
-int32_t CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(
-    CBC_CommonBitMatrix* image,
-    int32_t minColumn,
-    int32_t maxColumn,
-    FX_BOOL leftToRight,
-    int32_t codewordStartColumn,
-    int32_t imageRow) {
-  int32_t correctedStartColumn = codewordStartColumn;
-  int32_t increment = leftToRight ? -1 : 1;
-  for (int32_t i = 0; i < 2; i++) {
-    while (((leftToRight && correctedStartColumn >= minColumn) ||
-            (!leftToRight && correctedStartColumn < maxColumn)) &&
-           leftToRight == image->Get(correctedStartColumn, imageRow)) {
-      if (abs(codewordStartColumn - correctedStartColumn) >
-          CODEWORD_SKEW_SIZE) {
-        return codewordStartColumn;
-      }
-      correctedStartColumn += increment;
-    }
-    increment = -increment;
-    leftToRight = !leftToRight;
-  }
-  return correctedStartColumn;
-}
-FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(int32_t codewordSize,
-                                                     int32_t minCodewordWidth,
-                                                     int32_t maxCodewordWidth) {
-  return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize &&
-         codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE;
-}
-CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(
-    CFX_Int32Array& codewords,
-    int32_t ecLevel,
-    CFX_Int32Array& erasures,
-    int32_t& e) {
-  if (codewords.GetSize() == 0) {
-    e = BCExceptionFormatInstance;
-    return NULL;
-  }
-  int32_t numECCodewords = 1 << (ecLevel + 1);
-  correctErrors(codewords, erasures, numECCodewords, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  verifyCodewordCount(codewords, numECCodewords, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_ByteString bytestring;
-  CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(
-      codewords, bytestring.FormatInteger(ecLevel), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return decoderResult;
-}
-int32_t CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array& codewords,
-                                                 CFX_Int32Array& erasures,
-                                                 int32_t numECCodewords,
-                                                 int32_t& e) {
-  if ((erasures.GetSize() != 0 &&
-       erasures.GetSize() > (numECCodewords / 2 + MAX_ERRORS)) ||
-      numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) {
-    e = BCExceptionChecksumInstance;
-    return -1;
-  }
-  int32_t result = CBC_PDF417ECErrorCorrection::decode(
-      codewords, numECCodewords, erasures, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, -1);
-  return result;
-}
-void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array& codewords,
-                                                    int32_t numECCodewords,
-                                                    int32_t& e) {
-  if (codewords.GetSize() < 4) {
-    e = BCExceptionFormatInstance;
-    return;
-  }
-  int32_t numberOfCodewords = codewords.GetAt(0);
-  if (numberOfCodewords > codewords.GetSize()) {
-    e = BCExceptionFormatInstance;
-    return;
-  }
-  if (numberOfCodewords == 0) {
-    if (numECCodewords < codewords.GetSize()) {
-      codewords[0] = codewords.GetSize() - numECCodewords;
-    } else {
-      e = BCExceptionFormatInstance;
-      return;
-    }
-  }
-}
-CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(
-    int32_t codeword) {
-  CFX_Int32Array* result = new CFX_Int32Array;
-  result->SetSize(8);
-  int32_t previousValue = 0;
-  int32_t i = result->GetSize() - 1;
-  while (TRUE) {
-    if ((codeword & 0x1) != previousValue) {
-      previousValue = codeword & 0x1;
-      i--;
-      if (i < 0) {
-        break;
-      }
-    }
-    result->SetAt(i, result->GetAt(i) + 1);
-    codeword >>= 1;
-  }
-  return result;
-}
-int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(int32_t codeword) {
-  CFX_Int32Array* array = getBitCountForCodeword(codeword);
-  int32_t result = getCodewordBucketNumber(*array);
-  delete array;
-  return result;
-}
-int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(
-    CFX_Int32Array& moduleBitCount) {
-  return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) +
-          moduleBitCount.GetAt(4) - moduleBitCount.GetAt(6) + 9) %
-         9;
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
deleted file mode 100644
index ca310d2..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
-
-class CBC_CommonDecoderResult;
-class CBC_CommonBitMatrix;
-class CBC_Codeword;
-class CBC_BoundingBox;
-class CBC_ResultPoint;
-class CBC_BarcodeMetadata;
-class CBC_DetectionResult;
-class CBC_DetectionResultRowIndicatorColumn;
-
-class CBC_PDF417ScanningDecoder {
- public:
-  CBC_PDF417ScanningDecoder();
-  virtual ~CBC_PDF417ScanningDecoder();
-  static void Initialize();
-  static void Finalize();
-  static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image,
-                                         CBC_ResultPoint* imageTopLeft,
-                                         CBC_ResultPoint* imageBottomLeft,
-                                         CBC_ResultPoint* imageTopRight,
-                                         CBC_ResultPoint* imageBottomRight,
-                                         int32_t minCodewordWidth,
-                                         int32_t maxCodewordWidth,
-                                         int32_t& e);
-  static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix);
-
- private:
-  static int32_t CODEWORD_SKEW_SIZE;
-  static int32_t MAX_ERRORS;
-  static int32_t MAX_EC_CODEWORDS;
-  static CBC_PDF417ECErrorCorrection* errorCorrection;
-  static CBC_DetectionResult* merge(
-      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
-      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
-      int32_t& e);
-  static CBC_BoundingBox* adjustBoundingBox(
-      CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
-      int32_t& e);
-  static int32_t getMax(CFX_Int32Array& values);
-  static CBC_BarcodeMetadata* getBarcodeMetadata(
-      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
-      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn);
-  static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(
-      CBC_CommonBitMatrix* image,
-      CBC_BoundingBox* boundingBox,
-      CBC_ResultPoint startPoint,
-      FX_BOOL leftToRight,
-      int32_t minCodewordWidth,
-      int32_t maxCodewordWidth);
-  static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
-                                  CFX_PtrArray* barcodeMatrix,
-                                  int32_t& e);
-  static CBC_CommonDecoderResult* createDecoderResult(
-      CBC_DetectionResult* detectionResult,
-      int32_t& e);
-  static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(
-      int32_t ecLevel,
-      CFX_Int32Array& codewords,
-      CFX_Int32Array& erasureArray,
-      CFX_Int32Array& ambiguousIndexes,
-      CFX_PtrArray& ambiguousIndexValues,
-      int32_t& e);
-  static CFX_PtrArray* createBarcodeMatrix(
-      CBC_DetectionResult* detectionResult);
-  static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
-                                      int32_t barcodeColumn);
-  static int32_t getStartColumn(CBC_DetectionResult* detectionResult,
-                                int32_t barcodeColumn,
-                                int32_t imageRow,
-                                FX_BOOL leftToRight);
-  static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image,
-                                      int32_t minColumn,
-                                      int32_t maxColumn,
-                                      FX_BOOL leftToRight,
-                                      int32_t startColumn,
-                                      int32_t imageRow,
-                                      int32_t minCodewordWidth,
-                                      int32_t maxCodewordWidth);
-  static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image,
-                                           int32_t minColumn,
-                                           int32_t maxColumn,
-                                           FX_BOOL leftToRight,
-                                           int32_t startColumn,
-                                           int32_t imageRow);
-  static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel);
-  static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image,
-                                           int32_t minColumn,
-                                           int32_t maxColumn,
-                                           FX_BOOL leftToRight,
-                                           int32_t codewordStartColumn,
-                                           int32_t imageRow);
-  static FX_BOOL checkCodewordSkew(int32_t codewordSize,
-                                   int32_t minCodewordWidth,
-                                   int32_t maxCodewordWidth);
-  static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords,
-                                                  int32_t ecLevel,
-                                                  CFX_Int32Array& erasures,
-                                                  int32_t& e);
-  static int32_t correctErrors(CFX_Int32Array& codewords,
-                               CFX_Int32Array& erasures,
-                               int32_t numECCodewords,
-                               int32_t& e);
-  static void verifyCodewordCount(CFX_Int32Array& codewords,
-                                  int32_t numECCodewords,
-                                  int32_t& e);
-  static CFX_Int32Array* getBitCountForCodeword(int32_t codeword);
-  static int32_t getCodewordBucketNumber(int32_t codeword);
-  static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount);
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp
deleted file mode 100644
index 97cd9d8..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h"
-
-CBC_PDF417Writer::CBC_PDF417Writer() {
-  m_bFixedSize = FALSE;
-}
-CBC_PDF417Writer::~CBC_PDF417Writer() {
-  m_bTruncated = TRUE;
-}
-FX_BOOL CBC_PDF417Writer::SetErrorCorrectionLevel(int32_t level) {
-  if (level < 0 || level > 8) {
-    return FALSE;
-  }
-  m_iCorrectLevel = level;
-  return TRUE;
-}
-void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) {
-  m_bTruncated = truncated;
-}
-uint8_t* CBC_PDF417Writer::Encode(const CFX_WideString& contents,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t& e) {
-  CBC_PDF417 encoder;
-  int32_t col = (m_Width / m_ModuleWidth - 69) / 17;
-  int32_t row = m_Height / (m_ModuleWidth * 20);
-  if (row >= 3 && row <= 90 && col >= 1 && col <= 30) {
-    encoder.setDimensions(col, col, row, row);
-  } else if (col >= 1 && col <= 30) {
-    encoder.setDimensions(col, col, 90, 3);
-  } else if (row >= 3 && row <= 90) {
-    encoder.setDimensions(30, 1, row, row);
-  }
-  encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t lineThickness = 2;
-  int32_t aspectRatio = 4;
-  CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix();
-  CFX_ByteArray originalScale;
-  originalScale.Copy(barcodeMatrix->getScaledMatrix(
-      lineThickness, aspectRatio * lineThickness));
-  int32_t width = outWidth;
-  int32_t height = outHeight;
-  outWidth = barcodeMatrix->getWidth();
-  outHeight = barcodeMatrix->getHeight();
-  FX_BOOL rotated = FALSE;
-  if ((height > width) ^ (outWidth < outHeight)) {
-    rotateArray(originalScale, outHeight, outWidth);
-    rotated = TRUE;
-    int32_t temp = outHeight;
-    outHeight = outWidth;
-    outWidth = temp;
-  }
-  int32_t scaleX = width / outWidth;
-  int32_t scaleY = height / outHeight;
-  int32_t scale;
-  if (scaleX < scaleY) {
-    scale = scaleX;
-  } else {
-    scale = scaleY;
-  }
-  if (scale > 1) {
-    originalScale.RemoveAll();
-    originalScale.Copy(barcodeMatrix->getScaledMatrix(
-        scale * lineThickness, scale * aspectRatio * lineThickness));
-    if (rotated) {
-      rotateArray(originalScale, outHeight, outWidth);
-      int32_t temp = outHeight;
-      outHeight = outWidth;
-      outWidth = temp;
-    }
-  }
-  uint8_t* result = FX_Alloc2D(uint8_t, outHeight, outWidth);
-  FXSYS_memcpy(result, originalScale.GetData(), outHeight * outWidth);
-  return result;
-}
-void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray,
-                                   int32_t height,
-                                   int32_t width) {
-  CFX_ByteArray temp;
-  temp.Copy(bitarray);
-  for (int32_t ii = 0; ii < height; ii++) {
-    int32_t inverseii = height - ii - 1;
-    for (int32_t jj = 0; jj < width; jj++) {
-      bitarray[jj * height + inverseii] = temp[ii * width + jj];
-    }
-  }
-}
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h
deleted file mode 100644
index 3bfae5e..0000000
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_PDF417_BC_PDF417WRITER_H_
-#define XFA_SRC_FXBARCODE_PDF417_BC_PDF417WRITER_H_
-
-class CBC_TwoDimWriter;
-class CBC_PDF417Writer;
-class CBC_PDF417Writer : public CBC_TwoDimWriter {
- public:
-  CBC_PDF417Writer();
-  virtual ~CBC_PDF417Writer();
-  uint8_t* Encode(const CFX_WideString& contents,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  FX_BOOL SetErrorCorrectionLevel(int32_t level);
-  void SetTruncated(FX_BOOL truncated);
-
- private:
-  void rotateArray(CFX_ByteArray& bitarray, int32_t width, int32_t height);
-  FX_BOOL m_bTruncated;
-};
-
-#endif  // XFA_SRC_FXBARCODE_PDF417_BC_PDF417WRITER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp
deleted file mode 100644
index 1a20690..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h"
-
-CBC_QRFinderPatternInfo::CBC_QRFinderPatternInfo(CFX_PtrArray* patternCenters) {
-  m_bottomLeft = (CBC_QRFinderPattern*)(*patternCenters)[0];
-  m_topLeft = (CBC_QRFinderPattern*)(*patternCenters)[1];
-  m_topRight = (CBC_QRFinderPattern*)(*patternCenters)[2];
-}
-CBC_QRFinderPatternInfo::~CBC_QRFinderPatternInfo() {}
-CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetBottomLeft() {
-  return m_bottomLeft;
-}
-CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopLeft() {
-  return m_topLeft;
-}
-CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopRight() {
-  return m_topRight;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h
deleted file mode 100644
index 14316e5..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_QRFinderPattern;
-
-class CBC_QRFinderPatternInfo {
- private:
-  CBC_QRFinderPattern* m_bottomLeft;
-  CBC_QRFinderPattern* m_topLeft;
-  CBC_QRFinderPattern* m_topRight;
-
- public:
-  CBC_QRFinderPatternInfo(CFX_PtrArray* patternCenters);
-  virtual ~CBC_QRFinderPatternInfo();
-  CBC_QRFinderPattern* GetBottomLeft();
-  CBC_QRFinderPattern* GetTopLeft();
-  CBC_QRFinderPattern* GetTopRight();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_FINDERPATTERNINFO_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp
deleted file mode 100644
index 50b25f8..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h"
-
-CBC_QRAlignmentPattern::CBC_QRAlignmentPattern(FX_FLOAT posX,
-                                               FX_FLOAT posY,
-                                               FX_FLOAT estimateModuleSize)
-    : CBC_ResultPoint(posX, posY), m_moduleSize(estimateModuleSize) {}
-CBC_QRAlignmentPattern::~CBC_QRAlignmentPattern() {}
-FX_FLOAT CBC_QRAlignmentPattern::GetX() {
-  return m_x;
-}
-FX_FLOAT CBC_QRAlignmentPattern::GetY() {
-  return m_y;
-}
-FX_BOOL CBC_QRAlignmentPattern::AboutEquals(FX_FLOAT moduleSize,
-                                            FX_FLOAT i,
-                                            FX_FLOAT j) {
-  if ((FXSYS_fabs(i - GetY()) <= moduleSize) &&
-      (FXSYS_fabs(j - GetX()) <= moduleSize)) {
-    FX_FLOAT moduleSizeDiff = FXSYS_fabs(moduleSize - m_moduleSize);
-    return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_moduleSize <= 1.0f);
-  }
-  return FALSE;
-}
-CBC_QRAlignmentPattern* CBC_QRAlignmentPattern::Clone() {
-  return new CBC_QRAlignmentPattern(m_x, m_y, m_moduleSize);
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h
deleted file mode 100644
index f40d371..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
-class CBC_ResultPoint;
-class CBC_QRAlignmentPattern : public CBC_ResultPoint {
- private:
-  FX_FLOAT m_moduleSize;
-
- public:
-  CBC_QRAlignmentPattern(FX_FLOAT posX,
-                         FX_FLOAT posY,
-                         FX_FLOAT estimateModuleSize);
-  virtual ~CBC_QRAlignmentPattern();
-  FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j);
-  FX_FLOAT GetX();
-  FX_FLOAT GetY();
-  CBC_QRAlignmentPattern* Clone();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERN_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp
deleted file mode 100644
index 2d1aa43..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h"
-
-CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(
-    CBC_CommonBitMatrix* image,
-    int32_t startX,
-    int32_t startY,
-    int32_t width,
-    int32_t height,
-    FX_FLOAT moduleSize)
-    : m_image(image),
-      m_startX(startX),
-      m_startY(startY),
-      m_width(width),
-      m_height(height),
-      m_moduleSize(moduleSize) {
-  m_crossCheckStateCount.SetSize(3);
-}
-CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() {
-  for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) {
-    delete (CBC_QRAlignmentPattern*)m_possibleCenters[i];
-  }
-  m_possibleCenters.RemoveAll();
-}
-CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::Find(int32_t& e) {
-  int32_t startX = m_startX;
-  int32_t height = m_height;
-  int32_t maxJ = startX + m_width;
-  int32_t middleI = m_startY + (height >> 1);
-  CFX_Int32Array stateCount;
-  stateCount.SetSize(3);
-  for (int32_t iGen = 0; iGen < height; iGen++) {
-    int32_t i =
-        middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));
-    stateCount[0] = 0;
-    stateCount[1] = 0;
-    stateCount[2] = 0;
-    int32_t j = startX;
-    while (j < maxJ && !m_image->Get(j, i)) {
-      j++;
-    }
-    int32_t currentState = 0;
-    while (j < maxJ) {
-      if (m_image->Get(j, i)) {
-        if (currentState == 1) {
-          stateCount[currentState]++;
-        } else {
-          if (currentState == 2) {
-            if (FoundPatternCross(stateCount)) {
-              CBC_QRAlignmentPattern* confirmed =
-                  HandlePossibleCenter(stateCount, i, j);
-              if (confirmed) {
-                return confirmed;
-              }
-            }
-            stateCount[0] = stateCount[2];
-            stateCount[1] = 1;
-            stateCount[2] = 0;
-            currentState = 1;
-          } else {
-            stateCount[++currentState]++;
-          }
-        }
-      } else {
-        if (currentState == 1) {
-          currentState++;
-        }
-        stateCount[currentState]++;
-      }
-      j++;
-    }
-    if (FoundPatternCross(stateCount)) {
-      CBC_QRAlignmentPattern* confirmed =
-          HandlePossibleCenter(stateCount, i, maxJ);
-      if (confirmed) {
-        return confirmed;
-      }
-    }
-  }
-  if (m_possibleCenters.GetSize() != 0) {
-    return ((CBC_QRAlignmentPattern*)(m_possibleCenters[0]))->Clone();
-  }
-  e = BCExceptionRead;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return NULL;
-}
-FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(
-    const CFX_Int32Array& stateCount,
-    int32_t end) {
-  return (FX_FLOAT)(end - stateCount[2]) - stateCount[1] / 2.0f;
-}
-FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(
-    const CFX_Int32Array& stateCount) {
-  FX_FLOAT moduleSize = m_moduleSize;
-  FX_FLOAT maxVariance = moduleSize / 2.0f;
-  for (int32_t i = 0; i < 3; i++) {
-    if (fabs(moduleSize - stateCount[i]) >= maxVariance) {
-      return false;
-    }
-  }
-  return TRUE;
-}
-FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(
-    int32_t startI,
-    int32_t centerJ,
-    int32_t maxCount,
-    int32_t originalStateCountTotal) {
-  int32_t maxI = m_image->GetHeight();
-  CFX_Int32Array stateCount;
-  stateCount.Copy(m_crossCheckStateCount);
-  stateCount[0] = 0;
-  stateCount[1] = 0;
-  stateCount[2] = 0;
-  int32_t i = startI;
-  while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
-    stateCount[1]++;
-    i--;
-  }
-  if (i < 0 || stateCount[1] > maxCount) {
-    return FXSYS_nan();
-  }
-  while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) {
-    stateCount[0]++;
-    i--;
-  }
-  if (stateCount[0] > maxCount) {
-    return FXSYS_nan();
-  }
-  i = startI + 1;
-  while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
-    stateCount[1]++;
-    i++;
-  }
-  if (i == maxI || stateCount[1] > maxCount) {
-    return FXSYS_nan();
-  }
-  while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) {
-    stateCount[2]++;
-    i++;
-  }
-  if (stateCount[2] > maxCount) {
-    return FXSYS_nan();
-  }
-  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
-  if (5 * abs(stateCountTotal - originalStateCountTotal) >=
-      originalStateCountTotal) {
-    return FXSYS_nan();
-  }
-  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i)
-                                       : FXSYS_nan();
-}
-CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::HandlePossibleCenter(
-    const CFX_Int32Array& stateCount,
-    int32_t i,
-    int32_t j) {
-  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
-  FX_FLOAT centerJ = CenterFromEnd(stateCount, j);
-  FX_FLOAT centerI = CrossCheckVertical(i, (int32_t)centerJ, 2 * stateCount[1],
-                                        stateCountTotal);
-  if (!FXSYS_isnan(centerI)) {
-    FX_FLOAT estimatedModuleSize =
-        (FX_FLOAT)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f;
-    int32_t max = m_possibleCenters.GetSize();
-    for (int32_t index = 0; index < max; index++) {
-      CBC_QRAlignmentPattern* center =
-          (CBC_QRAlignmentPattern*)(m_possibleCenters[index]);
-      if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) {
-        return new CBC_QRAlignmentPattern(centerJ, centerI,
-                                          estimatedModuleSize);
-      }
-    }
-    m_possibleCenters.Add(
-        new CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize));
-  }
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h
deleted file mode 100644
index d1fff0a..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-class CBC_CommonBitMatrix;
-class CBC_QRAlignmentPattern;
-
-class CBC_QRAlignmentPatternFinder {
- private:
-  CBC_CommonBitMatrix* m_image;
-  CFX_PtrArray m_possibleCenters;
-  int32_t m_startX;
-  int32_t m_startY;
-  int32_t m_width;
-  int32_t m_height;
-  FX_FLOAT m_moduleSize;
-  CFX_Int32Array m_crossCheckStateCount;
-
- public:
-  CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix* image,
-                               int32_t startX,
-                               int32_t startY,
-                               int32_t width,
-                               int32_t height,
-                               FX_FLOAT moduleSize);
-  virtual ~CBC_QRAlignmentPatternFinder();
-  FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
-  FX_FLOAT CrossCheckVertical(int32_t startI,
-                              int32_t startJ,
-                              int32_t maxCount,
-                              int32_t originalStateCountTotal);
-  CBC_QRAlignmentPattern* Find(int32_t& e);
-  CBC_QRAlignmentPattern* HandlePossibleCenter(const CFX_Int32Array& stateCount,
-                                               int32_t i,
-                                               int32_t j);
-  static FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp
deleted file mode 100644
index 7426d95..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRBitMatrixParser::CBC_QRBitMatrixParser() {}
-void CBC_QRBitMatrixParser::Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e) {
-  m_dimension = bitMatrix->GetDimension(e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  m_tempBitMatrix = bitMatrix;
-  if (m_dimension < 21 || (m_dimension & 0x03) != 1) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  m_bitMatrix = m_tempBitMatrix;
-  m_parsedFormatInfo = NULL;
-  m_version = NULL;
-}
-CBC_QRBitMatrixParser::~CBC_QRBitMatrixParser() {
-  delete m_parsedFormatInfo;
-}
-CBC_QRCoderFormatInformation* CBC_QRBitMatrixParser::ReadFormatInformation(
-    int32_t& e) {
-  if (m_parsedFormatInfo) {
-    return m_parsedFormatInfo;
-  }
-  int32_t formatInfoBits = 0;
-  int32_t j;
-  for (j = 0; j < 6; j++) {
-    formatInfoBits = CopyBit(8, j, formatInfoBits);
-  }
-  formatInfoBits = CopyBit(8, 7, formatInfoBits);
-  formatInfoBits = CopyBit(8, 8, formatInfoBits);
-  formatInfoBits = CopyBit(7, 8, formatInfoBits);
-  for (int32_t i = 5; i >= 0; i--) {
-    formatInfoBits = CopyBit(i, 8, formatInfoBits);
-  }
-  m_parsedFormatInfo =
-      CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits);
-  if (m_parsedFormatInfo) {
-    return m_parsedFormatInfo;
-  }
-  int32_t dimension = m_bitMatrix->GetDimension(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  formatInfoBits = 0;
-  int32_t iMin = dimension - 8;
-  for (j = dimension - 1; j >= iMin; j--) {
-    formatInfoBits = CopyBit(j, 8, formatInfoBits);
-  }
-  for (int32_t k = dimension - 7; k < dimension; k++) {
-    formatInfoBits = CopyBit(8, k, formatInfoBits);
-  }
-  m_parsedFormatInfo =
-      CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits);
-  if (m_parsedFormatInfo) {
-    return m_parsedFormatInfo;
-  }
-  e = BCExceptionRead;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return NULL;
-}
-CBC_QRCoderVersion* CBC_QRBitMatrixParser::ReadVersion(int32_t& e) {
-  if (m_version) {
-    return m_version;
-  }
-  int32_t dimension = m_bitMatrix->GetDimension(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t provisionVersion = (dimension - 17) >> 2;
-  if (provisionVersion <= 6) {
-    CBC_QRCoderVersion* qrv =
-        CBC_QRCoderVersion::GetVersionForNumber(provisionVersion, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return qrv;
-  }
-  int32_t versionBits = 0;
-  for (int32_t i = 5; i >= 0; i--) {
-    int32_t jMin = dimension - 11;
-    for (int32_t j = dimension - 9; j >= jMin; j--) {
-      versionBits = CopyBit(i, j, versionBits);
-    }
-  }
-  m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  if (m_version && m_version->GetDimensionForVersion() == dimension) {
-    return m_version;
-  }
-  versionBits = 0;
-  for (int32_t j = 5; j >= 0; j--) {
-    int32_t iMin = dimension - 11;
-    for (int32_t i = dimension - 9; i >= iMin; i--) {
-      versionBits = CopyBit(i, j, versionBits);
-    }
-  }
-  m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  if (m_version && m_version->GetDimensionForVersion() == dimension) {
-    return m_version;
-  }
-  e = BCExceptionRead;
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return NULL;
-}
-int32_t CBC_QRBitMatrixParser::CopyBit(int32_t i,
-                                       int32_t j,
-                                       int32_t versionBits) {
-  return m_bitMatrix->Get(j, i) ? (versionBits << 1) | 0x1 : versionBits << 1;
-}
-CFX_ByteArray* CBC_QRBitMatrixParser::ReadCodewords(int32_t& e) {
-  CBC_QRCoderFormatInformation* formatInfo = ReadFormatInformation(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL) CBC_QRCoderVersion* version =
-      ReadVersion(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRDataMask* dataMask =
-      CBC_QRDataMask::ForReference((int32_t)(formatInfo->GetDataMask()), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t dimension = m_bitMatrix->GetDimension(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  dataMask->UnmaskBitMatirx(m_bitMatrix, dimension);
-  std::unique_ptr<CBC_CommonBitMatrix> functionPattern(
-      version->BuildFunctionPattern(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  FX_BOOL readingUp = TRUE;
-  std::unique_ptr<CFX_ByteArray> result(new CFX_ByteArray);
-  result->SetSize(version->GetTotalCodeWords());
-  int32_t resultOffset = 0;
-  int32_t currentByte = 0;
-  int32_t bitsRead = 0;
-  for (int32_t j = dimension - 1; j > 0; j -= 2) {
-    if (j == 6) {
-      j--;
-    }
-    for (int32_t count = 0; count < dimension; count++) {
-      int32_t i = readingUp ? dimension - 1 - count : count;
-      for (int32_t col = 0; col < 2; col++) {
-        if (!functionPattern->Get(j - col, i)) {
-          bitsRead++;
-          currentByte <<= 1;
-          if (m_bitMatrix->Get(j - col, i)) {
-            currentByte |= 1;
-          }
-          if (bitsRead == 8) {
-            (*result)[resultOffset++] = (uint8_t)currentByte;
-            bitsRead = 0;
-            currentByte = 0;
-          }
-        }
-      }
-    }
-    readingUp ^= TRUE;
-  }
-  if (resultOffset != version->GetTotalCodeWords()) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return result.release();
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h
deleted file mode 100644
index c93be6d..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_QRCoderVersion;
-class CBC_QRCoderFormatInformation;
-
-class CBC_QRBitMatrixParser {
- private:
-  CBC_CommonBitMatrix* m_bitMatrix;
-  CBC_CommonBitMatrix* m_tempBitMatrix;
-  CBC_QRCoderVersion* m_version;
-  CBC_QRCoderFormatInformation* m_parsedFormatInfo;
-  int32_t m_dimension;
-
- public:
-  CBC_QRBitMatrixParser();
-  virtual ~CBC_QRBitMatrixParser();
-  CBC_QRCoderFormatInformation* ReadFormatInformation(int32_t& e);
-  CBC_QRCoderVersion* ReadVersion(int32_t& e);
-  int32_t CopyBit(int32_t i, int32_t j, int32_t versionBits);
-  CFX_ByteArray* ReadCodewords(int32_t& e);
-  virtual void Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRBITMATRIXPARSER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp
deleted file mode 100644
index 896a3a1..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_Binarizer.h"
-#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h"
-
-CBC_QRCodeReader::CBC_QRCodeReader() : m_decoder(NULL) {}
-void CBC_QRCodeReader::Init() {
-  m_decoder = new CBC_QRCoderDecoder;
-  m_decoder->Init();
-}
-CBC_QRCodeReader::~CBC_QRCodeReader() {
-  delete m_decoder;
-}
-CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image,
-                                        int32_t hints,
-                                        int32_t& e) {
-  CBC_CommonBitMatrix* matrix = image->GetMatrix(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CBC_QRDetector detector(matrix);
-  std::unique_ptr<CBC_QRDetectorResult> detectorResult(
-      detector.Detect(hints, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  std::unique_ptr<CBC_CommonDecoderResult> decodeResult(
-      m_decoder->Decode(detectorResult->GetBits(), 0, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return (decodeResult->GetText());
-}
-CFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString& filename,
-                                        int32_t hints,
-                                        int32_t byteModeDecode,
-                                        int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(filename);
-  source.Init(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString bs = Decode(&bitmap, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return bs;
-}
-CFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap* pBitmap,
-                                        int32_t hints,
-                                        int32_t byteModeDecode,
-                                        int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString bs = Decode(&bitmap, hints, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return bs;
-}
-CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
-  CFX_ByteString bs = Decode(image, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, "");
-  return bs;
-}
-void CBC_QRCodeReader::ReleaseAll() {
-  if (CBC_ReedSolomonGF256::QRCodeFild) {
-    delete CBC_ReedSolomonGF256::QRCodeFild;
-    CBC_ReedSolomonGF256::QRCodeFild = NULL;
-  }
-  if (CBC_ReedSolomonGF256::DataMatrixField) {
-    delete CBC_ReedSolomonGF256::DataMatrixField;
-    CBC_ReedSolomonGF256::DataMatrixField = NULL;
-  }
-  CBC_QRCoderMode::Destroy();
-  CBC_QRCoderErrorCorrectionLevel::Destroy();
-  CBC_QRDataMask::Destroy();
-  CBC_QRCoderVersion::Destroy();
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h
deleted file mode 100644
index 7edb12b..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
-
-#include <stdint.h>
-
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fxbarcode/BC_Reader.h"
-
-class CBC_BinaryBitmap;
-class CBC_QRCoderDecoder;
-class CFX_DIBitmap;
-
-class CBC_QRCodeReader : public CBC_Reader {
- private:
-  CBC_QRCoderDecoder* m_decoder;
-
- public:
-  CBC_QRCodeReader();
-  virtual ~CBC_QRCodeReader();
-  CFX_ByteString Decode(CFX_DIBitmap* pBitmap,
-                        int32_t hints,
-                        int32_t byteModeDecode,
-                        int32_t& e);
-  CFX_ByteString Decode(const CFX_WideString& filename,
-                        int32_t hints,
-                        int32_t byteModeDecode,
-                        int32_t& e);
-  static void ReleaseAll();
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
-  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
-  virtual void Init();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEREADER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp
deleted file mode 100644
index e51b926..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_Reader.h"
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-
-CBC_QRCodeWriter::CBC_QRCodeWriter() {
-  m_bFixedSize = TRUE;
-  m_iCorrectLevel = 1;
-  m_iVersion = 0;
-}
-CBC_QRCodeWriter::~CBC_QRCodeWriter() {}
-void CBC_QRCodeWriter::ReleaseAll() {
-  CBC_QRCodeReader::ReleaseAll();
-}
-FX_BOOL CBC_QRCodeWriter::SetVersion(int32_t version) {
-  if (version < 0 || version > 40) {
-    return FALSE;
-  }
-  m_iVersion = version;
-  return TRUE;
-}
-FX_BOOL CBC_QRCodeWriter::SetErrorCorrectionLevel(int32_t level) {
-  if (level < 0 || level > 3) {
-    return FALSE;
-  }
-  m_iCorrectLevel = level;
-  return TRUE;
-}
-uint8_t* CBC_QRCodeWriter::Encode(const CFX_WideString& contents,
-                                  int32_t ecLevel,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t& e) {
-  CBC_QRCoderErrorCorrectionLevel* ec = NULL;
-  switch (ecLevel) {
-    case 0:
-      ec = CBC_QRCoderErrorCorrectionLevel::L;
-      break;
-    case 1:
-      ec = CBC_QRCoderErrorCorrectionLevel::M;
-      break;
-    case 2:
-      ec = CBC_QRCoderErrorCorrectionLevel::Q;
-      break;
-    case 3:
-      ec = CBC_QRCoderErrorCorrectionLevel::H;
-      break;
-    default: {
-      e = BCExceptionUnSupportEclevel;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-  }
-  CBC_QRCoder qr;
-  if (m_iVersion > 0 && m_iVersion < 41) {
-    CFX_ByteString byteStr = contents.UTF8Encode();
-    CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion);
-  } else {
-    CBC_QRCoderEncoder::Encode(contents, ec, &qr, e);
-  }
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  outWidth = qr.GetMatrixWidth();
-  outHeight = qr.GetMatrixWidth();
-  uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight);
-  FXSYS_memcpy(result, qr.GetMatrix()->GetArray(), outWidth * outHeight);
-  return result;
-}
-uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents,
-                                  BCFORMAT format,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t hints,
-                                  int32_t& e) {
-  return NULL;
-}
-uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents,
-                                  BCFORMAT format,
-                                  int32_t& outWidth,
-                                  int32_t& outHeight,
-                                  int32_t& e) {
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h
deleted file mode 100644
index ceb6547..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
-
-#include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
-
-class CBC_TwoDimWriter;
-class CBC_QRCodeWriter : public CBC_TwoDimWriter {
- public:
-  CBC_QRCodeWriter();
-  virtual ~CBC_QRCodeWriter();
-  uint8_t* Encode(const CFX_WideString& contents,
-                  int32_t ecLevel,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t hints,
-                  int32_t& e);
-  uint8_t* Encode(const CFX_ByteString& contents,
-                  BCFORMAT format,
-                  int32_t& outWidth,
-                  int32_t& outHeight,
-                  int32_t& e);
-  FX_BOOL SetVersion(int32_t version);
-  FX_BOOL SetErrorCorrectionLevel(int32_t level);
-  static void ReleaseAll();
-
- private:
-  int32_t m_iVersion;
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODEWRITER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp
deleted file mode 100644
index be46f2d..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRCoder::CBC_QRCoder() {
-  m_mode = NULL;
-  m_ecLevel = NULL;
-  m_version = -1;
-  m_matrixWidth = -1;
-  m_maskPattern = -1;
-  m_numTotalBytes = -1;
-  m_numDataBytes = -1;
-  m_numECBytes = -1;
-  m_numRSBlocks = -1;
-  m_matrix = NULL;
-}
-CBC_QRCoder::~CBC_QRCoder() {
-  delete m_matrix;
-}
-CBC_QRCoderMode* CBC_QRCoder::GetMode() {
-  return m_mode;
-}
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoder::GetECLevel() {
-  return m_ecLevel;
-}
-int32_t CBC_QRCoder::GetVersion() {
-  return m_version;
-}
-int32_t CBC_QRCoder::GetMatrixWidth() {
-  return m_matrixWidth;
-}
-int32_t CBC_QRCoder::GetMaskPattern() {
-  return m_maskPattern;
-}
-int32_t CBC_QRCoder::GetNumTotalBytes() {
-  return m_numTotalBytes;
-}
-int32_t CBC_QRCoder::GetNumDataBytes() {
-  return m_numDataBytes;
-}
-int32_t CBC_QRCoder::GetNumECBytes() {
-  return m_numECBytes;
-}
-int32_t CBC_QRCoder::GetNumRSBlocks() {
-  return m_numRSBlocks;
-}
-CBC_CommonByteMatrix* CBC_QRCoder::GetMatrix() {
-  return m_matrix;
-}
-int32_t CBC_QRCoder::At(int32_t x, int32_t y, int32_t& e) {
-  int32_t value = m_matrix->Get(x, y);
-  if (!(value == 0 || value == 1)) {
-    e = BCExceptionValueMustBeEither0or1;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  return value;
-}
-FX_BOOL CBC_QRCoder::IsValid() {
-  return m_mode && m_ecLevel && m_version != -1 && m_matrixWidth != -1 &&
-         m_maskPattern != -1 && m_numTotalBytes != -1 && m_numDataBytes != -1 &&
-         m_numECBytes != -1 && m_numRSBlocks != -1 &&
-         IsValidMaskPattern(m_maskPattern) &&
-         m_numTotalBytes == m_numDataBytes + m_numECBytes && m_matrix &&
-         m_matrixWidth == m_matrix->GetWidth() &&
-         m_matrix->GetWidth() == m_matrix->GetHeight();
-}
-void CBC_QRCoder::SetMode(CBC_QRCoderMode* value) {
-  m_mode = value;
-}
-void CBC_QRCoder::SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel) {
-  m_ecLevel = ecLevel;
-}
-void CBC_QRCoder::SetVersion(int32_t version) {
-  m_version = version;
-}
-void CBC_QRCoder::SetMatrixWidth(int32_t width) {
-  m_matrixWidth = width;
-}
-void CBC_QRCoder::SetMaskPattern(int32_t pattern) {
-  m_maskPattern = pattern;
-}
-void CBC_QRCoder::SetNumDataBytes(int32_t bytes) {
-  m_numDataBytes = bytes;
-}
-void CBC_QRCoder::SetNumTotalBytes(int32_t value) {
-  m_numTotalBytes = value;
-}
-void CBC_QRCoder::SetNumRSBlocks(int32_t block) {
-  m_numRSBlocks = block;
-}
-void CBC_QRCoder::SetNumECBytes(int32_t value) {
-  m_numECBytes = value;
-}
-FX_BOOL CBC_QRCoder::IsValidMaskPattern(int32_t maskPattern) {
-  return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS;
-}
-void CBC_QRCoder::SetMatrix(CBC_CommonByteMatrix* value) {
-  m_matrix = value;
-}
-const int32_t CBC_QRCoder::NUM_MASK_PATTERNS = 8;
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoder.h
deleted file mode 100644
index 6a44b53..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODER_H_
-
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_QRCoderMode;
-class CBC_CommonByteMatrix;
-
-class CBC_QRCoder {
- private:
-  CBC_QRCoderMode* m_mode;
-  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
-  int32_t m_version;
-  int32_t m_matrixWidth;
-  int32_t m_maskPattern;
-  int32_t m_numTotalBytes;
-  int32_t m_numDataBytes;
-  int32_t m_numECBytes;
-  int32_t m_numRSBlocks;
-  CBC_CommonByteMatrix* m_matrix;
-
- public:
-  static const int32_t NUM_MASK_PATTERNS;
-  CBC_QRCoder();
-  virtual ~CBC_QRCoder();
-  CBC_QRCoderMode* GetMode();
-  CBC_QRCoderErrorCorrectionLevel* GetECLevel();
-  int32_t GetVersion();
-  int32_t GetMatrixWidth();
-  int32_t GetMaskPattern();
-  int32_t GetNumTotalBytes();
-  int32_t GetNumDataBytes();
-  int32_t GetNumECBytes();
-  int32_t GetNumRSBlocks();
-  CBC_CommonByteMatrix* GetMatrix();
-  int32_t At(int32_t x, int32_t y, int32_t& e);
-  FX_BOOL IsValid();
-
-  void SetMode(CBC_QRCoderMode* value);
-  void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel);
-  void SetVersion(int32_t version);
-  void SetMatrixWidth(int32_t width);
-  void SetMaskPattern(int32_t pattern);
-  void SetNumDataBytes(int32_t bytes);
-  void SetNumTotalBytes(int32_t value);
-  void SetNumECBytes(int32_t value);
-  void SetNumRSBlocks(int32_t block);
-  void SetMatrix(CBC_CommonByteMatrix* value);
-  static FX_BOOL IsValidMaskPattern(int32_t maskPattern);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp
deleted file mode 100644
index ad1b320..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "core/include/fxcrt/fx_memory.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRCoderBitVector::CBC_QRCoderBitVector() {
-  m_sizeInBits = 0;
-  m_size = 32;
-}
-void CBC_QRCoderBitVector::Init() {
-  m_array = FX_Alloc(uint8_t, m_size);
-}
-CBC_QRCoderBitVector::~CBC_QRCoderBitVector() {
-  FX_Free(m_array);
-}
-void CBC_QRCoderBitVector::Clear() {
-  FX_Free(m_array);
-  m_sizeInBits = 0;
-  m_size = 32;
-  m_array = FX_Alloc(uint8_t, m_size);
-}
-int32_t CBC_QRCoderBitVector::At(int32_t index, int32_t& e) {
-  if (index < 0 || index >= m_sizeInBits) {
-    e = BCExceptionBadIndexException;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  int32_t value = m_array[index >> 3] & 0xff;
-  return (value >> (7 - (index & 0x7))) & 1;
-}
-int32_t CBC_QRCoderBitVector::sizeInBytes() {
-  return (m_sizeInBits + 7) >> 3;
-}
-int32_t CBC_QRCoderBitVector::Size() {
-  return m_sizeInBits;
-}
-void CBC_QRCoderBitVector::AppendBit(int32_t bit, int32_t& e) {
-  if (!(bit == 0 || bit == 1)) {
-    e = BCExceptionBadValueException;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t numBitsInLastByte = m_sizeInBits & 0x7;
-  if (numBitsInLastByte == 0) {
-    AppendByte(0);
-    m_sizeInBits -= 8;
-  }
-  m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte));
-  ++m_sizeInBits;
-}
-void CBC_QRCoderBitVector::AppendBits(int32_t value,
-                                      int32_t numBits,
-                                      int32_t& e) {
-  if (numBits < 0 || numBits > 32) {
-    e = BCExceptionBadNumBitsException;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t numBitsLeft = numBits;
-  while (numBitsLeft > 0) {
-    if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) {
-      int32_t newByte = (value >> (numBitsLeft - 8)) & 0xff;
-      AppendByte(newByte);
-      numBitsLeft -= 8;
-    } else {
-      int32_t bit = (value >> (numBitsLeft - 1)) & 1;
-      AppendBit(bit, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      --numBitsLeft;
-    }
-  }
-}
-void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector* bits,
-                                           int32_t& e) {
-  int32_t size = bits->Size();
-  for (int32_t i = 0; i < size; i++) {
-    int32_t num = bits->At(i, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    AppendBit(num, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e)
-  }
-}
-void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector* other, int32_t& e) {
-  if (m_sizeInBits != other->Size()) {
-    e = BCExceptioncanNotOperatexorOperator;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t sizeInBytes = (m_sizeInBits + 7) >> 3;
-  for (int32_t i = 0; i < sizeInBytes; ++i) {
-    m_array[i] ^= (other->GetArray())[i];
-  }
-}
-uint8_t* CBC_QRCoderBitVector::GetArray() {
-  return m_array;
-}
-void CBC_QRCoderBitVector::AppendByte(int32_t value) {
-  if ((m_sizeInBits >> 3) == m_size) {
-    uint8_t* newArray = FX_Alloc(uint8_t, m_size << 1);
-    FXSYS_memcpy(newArray, m_array, m_size);
-    FX_Free(m_array);
-    m_array = newArray;
-    m_size = m_size << 1;
-  }
-  m_array[m_sizeInBits >> 3] = (uint8_t)value;
-  m_sizeInBits += 8;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h
deleted file mode 100644
index 86c4052..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
-
-#include <stdint.h>
-
-class CBC_QRCoderBitVector {
- private:
-  int32_t m_sizeInBits;
-  uint8_t* m_array;
-  int32_t m_size;
-
-  void AppendByte(int32_t value);
-
- public:
-  CBC_QRCoderBitVector();
-  virtual ~CBC_QRCoderBitVector();
-  int32_t At(int32_t index, int32_t& e);
-  int32_t Size();
-  int32_t sizeInBytes();
-  void AppendBit(int32_t bit, int32_t& e);
-  void AppendBits(int32_t value, int32_t numBits, int32_t& e);
-  void AppendBitVector(CBC_QRCoderBitVector* bits, int32_t& e);
-  void XOR(CBC_QRCoderBitVector* other, int32_t& e);
-  uint8_t* GetArray();
-  void Clear();
-  virtual void Init();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBITVECTOR_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp
deleted file mode 100644
index b9accd6..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonByteArray.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h"
-
-CBC_QRCoderBlockPair::CBC_QRCoderBlockPair(
-    CBC_CommonByteArray* data,
-    CBC_CommonByteArray* errorCorrection) {
-  m_dataBytes = data;
-  m_errorCorrectionBytes = errorCorrection;
-}
-CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() {
-  delete m_dataBytes;
-  delete m_errorCorrectionBytes;
-}
-CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() {
-  return m_dataBytes;
-}
-CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() {
-  return m_errorCorrectionBytes;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h
deleted file mode 100644
index 30551fe..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
-
-class CBC_CommonByteArray;
-class CBC_QRCoderBlockPair {
- private:
-  CBC_CommonByteArray* m_dataBytes;
-  CBC_CommonByteArray* m_errorCorrectionBytes;
-
- public:
-  CBC_QRCoderBlockPair(CBC_CommonByteArray* data,
-                       CBC_CommonByteArray* errorCorrection);
-  virtual ~CBC_QRCoderBlockPair();
-
-  CBC_CommonByteArray* GetDataBytes();
-  CBC_CommonByteArray* GetErrorCorrectionBytes();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp
deleted file mode 100644
index dd31021..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
-
-CBC_QRCoderDecoder::CBC_QRCoderDecoder() {
-  m_rsDecoder = NULL;
-}
-
-void CBC_QRCoderDecoder::Init() {
-  m_rsDecoder = new CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::QRCodeFild);
-}
-CBC_QRCoderDecoder::~CBC_QRCoderDecoder() {
-  delete m_rsDecoder;
-}
-CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image,
-                                                    int32_t width,
-                                                    int32_t height,
-                                                    int32_t& e) {
-  CBC_CommonBitMatrix bits;
-  bits.Init(width);
-  for (int32_t i = 0; i < width; i++) {
-    for (int32_t j = 0; j < height; j++) {
-      if (image[i * width + j]) {
-        bits.Set(j, i);
-      }
-    }
-  }
-  CBC_CommonDecoderResult* cdr = Decode(&bits, height, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return cdr;
-}
-CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits,
-                                                    int32_t byteModeDecode,
-                                                    int32_t& e) {
-  CBC_QRBitMatrixParser parser;
-  parser.Init(bits, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRCoderVersion* version = parser.ReadVersion(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel();
-  std::unique_ptr<CFX_ByteArray> codewords(parser.ReadCodewords(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* dataBlocks =
-      CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t totalBytes = 0;
-  for (int32_t i = 0; i < dataBlocks->GetSize(); i++) {
-    totalBytes += ((CBC_QRDataBlock*)((*dataBlocks)[i]))->GetNumDataCodewords();
-  }
-  CFX_ByteArray resultBytes;
-  for (int32_t j = 0; j < dataBlocks->GetSize(); j++) {
-    CBC_QRDataBlock* dataBlock = (CBC_QRDataBlock*)((*dataBlocks)[j]);
-    CFX_ByteArray* codewordBytes = dataBlock->GetCodewords();
-    int32_t numDataCodewords = dataBlock->GetNumDataCodewords();
-    CorrectErrors(codewordBytes, numDataCodewords, e);
-    if (e != BCExceptionNO) {
-      for (int32_t k = 0; k < dataBlocks->GetSize(); k++) {
-        delete (CBC_QRDataBlock*)(*dataBlocks)[k];
-      }
-      dataBlocks->RemoveAll();
-      delete dataBlocks;
-      dataBlocks = NULL;
-      return NULL;
-    }
-    for (int32_t i = 0; i < numDataCodewords; i++) {
-      resultBytes.Add((*codewordBytes)[i]);
-    }
-  }
-  for (int32_t k = 0; k < dataBlocks->GetSize(); k++) {
-    delete (CBC_QRDataBlock*)(*dataBlocks)[k];
-  }
-  dataBlocks->RemoveAll();
-  delete dataBlocks;
-  dataBlocks = NULL;
-  CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode(
-      &resultBytes, version, ecLevel, byteModeDecode, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return cdr;
-}
-void CBC_QRCoderDecoder::CorrectErrors(CFX_ByteArray* codewordBytes,
-                                       int32_t numDataCodewords,
-                                       int32_t& e) {
-  int32_t numCodewords = codewordBytes->GetSize();
-  CFX_Int32Array codewordsInts;
-  codewordsInts.SetSize(numCodewords);
-  for (int32_t i = 0; i < numCodewords; i++) {
-    codewordsInts[i] = (int32_t)((*codewordBytes)[i] & 0xff);
-  }
-  int32_t numECCodewords = codewordBytes->GetSize() - numDataCodewords;
-  m_rsDecoder->Decode(&codewordsInts, numECCodewords, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  for (int32_t k = 0; k < numDataCodewords; k++) {
-    (*codewordBytes)[k] = (uint8_t)codewordsInts[k];
-  }
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h
deleted file mode 100644
index e2e53a7..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_ReedSolomonDecoder;
-class CBC_CommonDecoderResult;
-
-class CBC_QRCoderDecoder {
- private:
-  CBC_ReedSolomonDecoder* m_rsDecoder;
-
- public:
-  CBC_QRCoderDecoder();
-  virtual ~CBC_QRCoderDecoder();
-
-  CBC_CommonDecoderResult* Decode(FX_BOOL* image,
-                                  int32_t width,
-                                  int32_t height,
-                                  int32_t& e);
-  CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits,
-                                  int32_t byteModeDecode,
-                                  int32_t& e);
-  void CorrectErrors(CFX_ByteArray* codewordBytes,
-                     int32_t numDataCodewords,
-                     int32_t& e);
-  virtual void Init();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERDECODER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp
deleted file mode 100644
index 4dc394d..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h"
-
-CBC_QRCoderECB::CBC_QRCoderECB(int32_t count, int32_t dataCodeWords) {
-  m_dataCodeWords = dataCodeWords;
-  m_count = count;
-}
-CBC_QRCoderECB::~CBC_QRCoderECB() {}
-int32_t CBC_QRCoderECB::GetCount() {
-  return m_count;
-}
-int32_t CBC_QRCoderECB::GetDataCodeWords() {
-  return m_dataCodeWords;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h
deleted file mode 100644
index c269e38..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECB_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECB_H_
-
-#include <stdint.h>
-
-class CBC_QRCoderECB {
- private:
-  int32_t m_count;
-  int32_t m_dataCodeWords;
-
- public:
-  CBC_QRCoderECB(int32_t count, int32_t dataCodeWords);
-  virtual ~CBC_QRCoderECB();
-  int32_t GetCount();
-  int32_t GetDataCodeWords();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECB_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp
deleted file mode 100644
index c418651..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
-
-CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
-                                         CBC_QRCoderECB* ecBlocks) {
-  m_ecCodeWordsPerBlock = ecCodeWordsPerBlock;
-  m_ecBlocks.Add(ecBlocks);
-}
-CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
-                                         CBC_QRCoderECB* ecBlocks1,
-                                         CBC_QRCoderECB* ecBlocks2) {
-  m_ecCodeWordsPerBlock = ecCodeWordsPerBlock;
-  m_ecBlocks.Add(ecBlocks1);
-  m_ecBlocks.Add(ecBlocks2);
-}
-CBC_QRCoderECBlocks::~CBC_QRCoderECBlocks() {
-  for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
-    delete ((CBC_QRCoderECB*)(m_ecBlocks[i]));
-  }
-  m_ecBlocks.RemoveAll();
-}
-int32_t CBC_QRCoderECBlocks::GetECCodeWordsPerBlock() {
-  return m_ecCodeWordsPerBlock;
-}
-int32_t CBC_QRCoderECBlocks::GetNumBlocks() {
-  int32_t total = 0;
-  for (int32_t i = 0; i < m_ecBlocks.GetSize(); i++) {
-    total += ((CBC_QRCoderECB*)(m_ecBlocks[i]))->GetCount();
-  }
-  return total;
-}
-int32_t CBC_QRCoderECBlocks::GetTotalECCodeWords() {
-  return m_ecCodeWordsPerBlock * GetNumBlocks();
-}
-CFX_PtrArray* CBC_QRCoderECBlocks::GetECBlocks() {
-  return &m_ecBlocks;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h
deleted file mode 100644
index 7d25eee..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_QRCoderECB;
-
-class CBC_QRCoderECBlocks {
- private:
-  int32_t m_ecCodeWordsPerBlock;
-  CFX_PtrArray m_ecBlocks;
-
- public:
-  CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks);
-  CBC_QRCoderECBlocks(int32_t ecCodeWordsPerBlock,
-                      CBC_QRCoderECB* ecBlocks1,
-                      CBC_QRCoderECB* ecBlocks2);
-  virtual ~CBC_QRCoderECBlocks();
-  int32_t GetECCodeWordsPerBlock();
-  int32_t GetNumBlocks();
-  int32_t GetTotalECCodeWords();
-  CFX_PtrArray* GetECBlocks();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERECBLOCKS_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
deleted file mode 100644
index eb31ddc..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ /dev/null
@@ -1,961 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteArray.h"
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h"
-#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-
-const int32_t CBC_QRCoderEncoder::m_alphaNumbericTable[] = {
-    -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,
-    36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  44, -1, -1, -1, -1, -1,
-    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1};
-
-CBC_QRCoderEncoder::CBC_QRCoderEncoder() {}
-CBC_QRCoderEncoder::~CBC_QRCoderEncoder() {}
-class Make_Pair {
- public:
-  CBC_QRCoderMode* m_mode;
-  CFX_ByteString m_string;
-
- private:
-  Make_Pair(const Make_Pair& mode_string) {}
-  Make_Pair& operator=(Make_Pair& mode_string) {
-    if (this == &mode_string) {
-      return *this;
-    }
-    m_mode = mode_string.m_mode;
-    m_string = mode_string.m_string;
-    return *this;
-  }
-
- public:
-  Make_Pair(CBC_QRCoderMode* mode, const CFX_ByteString& str)
-      : m_mode(mode), m_string(str) {}
-  ~Make_Pair() {}
-};
-void CBC_QRCoderEncoder::Encode(const CFX_ByteString& content,
-                                CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                CBC_QRCoder* qrCode,
-                                int32_t& e,
-                                int32_t versionSpecify) {
-  if (versionSpecify == 0) {
-    EncodeWithAutoVersion(content, ecLevel, qrCode, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e)
-  } else if (versionSpecify > 0 && versionSpecify <= 40) {
-    EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else {
-    e = BCExceptionVersionMust1_40;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) {}
-void CBC_QRCoderEncoder::AppendDataModeLenghInfo(
-    CFX_PtrArray& splitResult,
-    CBC_QRCoderBitVector& headerAndDataBits,
-    CBC_QRCoderMode* tempMode,
-    CBC_QRCoder* qrCode,
-    CFX_ByteString& encoding,
-    int32_t& e) {
-  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
-    tempMode = ((Make_Pair*)splitResult[i])->m_mode;
-    if (tempMode == CBC_QRCoderMode::sGBK) {
-      AppendModeInfo(tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
-                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
-                  &headerAndDataBits, encoding, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    } else if (tempMode == CBC_QRCoderMode::sBYTE) {
-      CFX_ByteArray bytes;
-      CBC_UtilCodingConvert::LocaleToUtf8(
-          ((Make_Pair*)splitResult[i])->m_string, bytes);
-      AppendModeInfo(tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode,
-                       &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      Append8BitBytes(bytes, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    } else if (tempMode == CBC_QRCoderMode::sALPHANUMERIC) {
-      AppendModeInfo(tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
-                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
-                  &headerAndDataBits, encoding, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    } else if (tempMode == CBC_QRCoderMode::sNUMERIC) {
-      AppendModeInfo(tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(),
-                       qrCode->GetVersion(), tempMode, &headerAndDataBits, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode,
-                  &headerAndDataBits, encoding, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    } else {
-      e = BCExceptionUnknown;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-  }
-}
-void CBC_QRCoderEncoder::SplitString(const CFX_ByteString& content,
-                                     CFX_PtrArray& result) {
-  int32_t index = 0, flag = 0;
-  while (
-      (((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
-       ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
-      (index < content.GetLength())) {
-    index += 2;
-  }
-  if (index != flag) {
-    result.Add(
-        new Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag)));
-  }
-  flag = index;
-  if (index >= content.GetLength()) {
-    return;
-  }
-  while (
-      GetAlphaNumericCode((uint8_t)content[index]) == -1 &&
-      !(((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
-        ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
-      (index < content.GetLength())) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-    if (IsDBCSLeadByte((uint8_t)content[index]))
-#else
-    if ((uint8_t)content[index] > 127)
-#endif
-    {
-      index += 2;
-    } else {
-      index++;
-    }
-  }
-  if (index != flag) {
-    result.Add(
-        new Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag)));
-  }
-  flag = index;
-  if (index >= content.GetLength()) {
-    return;
-  }
-  while (FXSYS_Isdigit((uint8_t)content[index]) &&
-         (index < content.GetLength())) {
-    index++;
-  }
-  if (index != flag) {
-    result.Add(new Make_Pair(CBC_QRCoderMode::sNUMERIC,
-                             content.Mid(flag, index - flag)));
-  }
-  flag = index;
-  if (index >= content.GetLength()) {
-    return;
-  }
-  while (GetAlphaNumericCode((uint8_t)content[index]) != -1 &&
-         (index < content.GetLength())) {
-    index++;
-  }
-  if (index != flag) {
-    result.Add(new Make_Pair(CBC_QRCoderMode::sALPHANUMERIC,
-                             content.Mid(flag, index - flag)));
-  }
-  flag = index;
-  if (index >= content.GetLength()) {
-    return;
-  }
-  SplitString(content.Mid(index, content.GetLength() - index), result);
-}
-int32_t CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode* modeFirst,
-                                             CBC_QRCoderMode* modeSecond,
-                                             int32_t versionNum,
-                                             int32_t& e) {
-  if (versionNum == 0) {
-    return 0;
-  }
-  if ((modeFirst == CBC_QRCoderMode::sALPHANUMERIC) &&
-      (modeSecond == CBC_QRCoderMode::sBYTE)) {
-    if (versionNum >= 1 && versionNum <= 9) {
-      return 11;
-    } else if (versionNum >= 10 && versionNum <= 26) {
-      return 15;
-    } else if (versionNum >= 27 && versionNum <= 40) {
-      return 16;
-    } else {
-      e = BCExceptionNoSuchVersion;
-      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    }
-  } else if ((modeSecond == CBC_QRCoderMode::sALPHANUMERIC) &&
-             (modeFirst == CBC_QRCoderMode::sNUMERIC)) {
-    if (versionNum >= 1 && versionNum <= 9) {
-      return 13;
-    } else if (versionNum >= 10 && versionNum <= 26) {
-      return 15;
-    } else if (versionNum >= 27 && versionNum <= 40) {
-      return 17;
-    } else {
-      e = BCExceptionNoSuchVersion;
-      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    }
-  } else if ((modeSecond == CBC_QRCoderMode::sBYTE) &&
-             (modeFirst == CBC_QRCoderMode::sNUMERIC)) {
-    if (versionNum >= 1 && versionNum <= 9) {
-      return 6;
-    } else if (versionNum >= 10 && versionNum <= 26) {
-      return 8;
-    } else if (versionNum >= 27 && versionNum <= 40) {
-      return 9;
-    } else {
-      e = BCExceptionNoSuchVersion;
-      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    }
-  }
-  return -1;
-}
-void CBC_QRCoderEncoder::MergeString(CFX_PtrArray& result,
-                                     int32_t versionNum,
-                                     int32_t& e) {
-  Make_Pair* first = NULL;
-  Make_Pair* second = NULL;
-  size_t mergeNum = 0;
-  int32_t i;
-  for (i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) {
-    first = (Make_Pair*)result[i];
-    second = (Make_Pair*)result[i + 1];
-    if (first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) {
-      int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC,
-                                     CBC_QRCoderMode::sBYTE, versionNum, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      if ((second->m_mode == CBC_QRCoderMode::sBYTE) &&
-          (first->m_string.GetLength() < tmp)) {
-        CFX_ByteString str = first->m_string + second->m_string;
-        second->m_string = str;
-        delete first;
-        result.RemoveAt(i);
-        i--;
-        mergeNum++;
-      }
-    } else if (first->m_mode == CBC_QRCoderMode::sBYTE) {
-      if (second->m_mode == CBC_QRCoderMode::sBYTE) {
-        first->m_string += second->m_string;
-        delete second;
-        result.RemoveAt(i + 1);
-        i--;
-        mergeNum++;
-      }
-    } else if (first->m_mode == CBC_QRCoderMode::sNUMERIC) {
-      int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
-                                     CBC_QRCoderMode::sBYTE, versionNum, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      if ((second->m_mode == CBC_QRCoderMode::sBYTE) &&
-          (first->m_string.GetLength() < tmp)) {
-        CFX_ByteString str = first->m_string + second->m_string;
-        second->m_string = str;
-        delete first;
-        result.RemoveAt(i);
-        i--;
-        mergeNum++;
-      }
-      tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
-                             CBC_QRCoderMode::sALPHANUMERIC, versionNum, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      if ((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) &&
-          (first->m_string.GetLength() < tmp)) {
-        CFX_ByteString str = first->m_string + second->m_string;
-        second->m_string = str;
-        delete first;
-        result.RemoveAt(i);
-        i--;
-        mergeNum++;
-      }
-    }
-  }
-  if (mergeNum == 0) {
-    return;
-  }
-  MergeString(result, versionNum, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderEncoder::InitQRCode(int32_t numInputBytes,
-                                    int32_t versionNumber,
-                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                    CBC_QRCoderMode* mode,
-                                    CBC_QRCoder* qrCode,
-                                    int32_t& e) {
-  qrCode->SetECLevel(ecLevel);
-  qrCode->SetMode(mode);
-  CBC_QRCoderVersion* version =
-      CBC_QRCoderVersion::GetVersionForNumber(versionNumber, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t numBytes = version->GetTotalCodeWords();
-  CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
-  int32_t numEcBytes = ecBlocks->GetTotalECCodeWords();
-  int32_t numRSBlocks = ecBlocks->GetNumBlocks();
-  int32_t numDataBytes = numBytes - numEcBytes;
-  if (numDataBytes >= numInputBytes + 3) {
-    qrCode->SetVersion(versionNumber);
-    qrCode->SetNumTotalBytes(numBytes);
-    qrCode->SetNumDataBytes(numDataBytes);
-    qrCode->SetNumRSBlocks(numRSBlocks);
-    qrCode->SetNumECBytes(numEcBytes);
-    qrCode->SetMatrixWidth(version->GetDimensionForVersion());
-    return;
-  }
-  e = BCExceptionCannotFindBlockInfo;
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(
-    const CFX_ByteString& content,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    CBC_QRCoder* qrCode,
-    int32_t versionSpecify,
-    int32_t& e) {
-  CFX_ByteString encoding = "utf8";
-  CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
-  CFX_PtrArray splitResult;
-  CBC_QRCoderBitVector dataBits;
-  dataBits.Init();
-  SplitString(content, splitResult);
-  MergeString(splitResult, versionSpecify, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderMode* tempMode = NULL;
-  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
-    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
-                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
-    if (e != BCExceptionNO) {
-      for (int32_t y = 0; y < splitResult.GetSize(); y++) {
-        delete (Make_Pair*)splitResult[y];
-      }
-      splitResult.RemoveAll();
-      return;
-    }
-  }
-  int32_t numInputBytes = dataBits.sizeInBytes();
-  CBC_QRCoderBitVector headerAndDataBits;
-  headerAndDataBits.Init();
-  InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e);
-  if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
-    return;
-  }
-  AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
-                          encoding, e);
-  if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
-    return;
-  }
-  numInputBytes = headerAndDataBits.sizeInBytes();
-  TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
-  if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
-    return;
-  }
-  for (int32_t j = 0; j < splitResult.GetSize(); j++) {
-    delete (Make_Pair*)splitResult[j];
-  }
-  splitResult.RemoveAll();
-  CBC_QRCoderBitVector finalBits;
-  finalBits.Init();
-  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
-                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
-                        &finalBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
-  matrix->Init();
-  int32_t maskPattern = ChooseMaskPattern(
-      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  qrCode->SetMaskPattern(maskPattern);
-  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
-                                     qrCode->GetVersion(),
-                                     qrCode->GetMaskPattern(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  qrCode->SetMatrix(matrix.release());
-  if (!qrCode->IsValid()) {
-    e = BCExceptionInvalidQRCode;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::EncodeWithAutoVersion(
-    const CFX_ByteString& content,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    CBC_QRCoder* qrCode,
-    int32_t& e) {
-  CFX_ByteString encoding = "utf8";
-  CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
-  CFX_PtrArray splitResult;
-  CBC_QRCoderBitVector dataBits;
-  dataBits.Init();
-  SplitString(content, splitResult);
-  MergeString(splitResult, 8, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CBC_QRCoderMode* tempMode = NULL;
-  for (int32_t i = 0; i < splitResult.GetSize(); i++) {
-    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
-                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
-    if (e != BCExceptionNO) {
-      for (int32_t l = 0; l < splitResult.GetSize(); l++) {
-        delete (Make_Pair*)splitResult[l];
-      }
-      splitResult.RemoveAll();
-      return;
-    }
-  }
-  int32_t numInputBytes = dataBits.sizeInBytes();
-  InitQRCode(numInputBytes, ecLevel, mode, qrCode, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderBitVector headerAndDataBits;
-  headerAndDataBits.Init();
-  tempMode = NULL;
-  int32_t versionNum = qrCode->GetVersion();
-sign:
-  AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
-                          encoding, e);
-  if (e != BCExceptionNO) {
-    goto catchException;
-  }
-  numInputBytes = headerAndDataBits.sizeInBytes();
-  TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
-  if (e != BCExceptionNO) {
-    goto catchException;
-  }
-catchException:
-  if (e != BCExceptionNO) {
-    int32_t e1 = BCExceptionNO;
-    InitQRCode(numInputBytes, ecLevel, mode, qrCode, e1);
-    if (e1 != BCExceptionNO) {
-      e = e1;
-      return;
-    }
-    versionNum++;
-    if (versionNum <= 40) {
-      headerAndDataBits.Clear();
-      e = BCExceptionNO;
-      goto sign;
-    } else {
-      for (int32_t j = 0; j < splitResult.GetSize(); j++) {
-        delete (Make_Pair*)splitResult[j];
-      }
-      splitResult.RemoveAll();
-      return;
-    }
-  }
-  for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-    delete (Make_Pair*)splitResult[k];
-  }
-  splitResult.RemoveAll();
-  CBC_QRCoderBitVector finalBits;
-  finalBits.Init();
-  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
-                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
-                        &finalBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
-  matrix->Init();
-  int32_t maskPattern = ChooseMaskPattern(
-      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  qrCode->SetMaskPattern(maskPattern);
-  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
-                                     qrCode->GetVersion(),
-                                     qrCode->GetMaskPattern(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release());
-  if (!qrCode->IsValid()) {
-    e = BCExceptionInvalidQRCode;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::Encode(const CFX_WideString& content,
-                                CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                CBC_QRCoder* qrCode,
-                                int32_t& e) {
-  CFX_ByteString encoding = "utf8";
-  CFX_ByteString utf8Data;
-  CBC_UtilCodingConvert::UnicodeToUTF8(content, utf8Data);
-  CBC_QRCoderMode* mode = ChooseMode(utf8Data, encoding);
-  CBC_QRCoderBitVector dataBits;
-  dataBits.Init();
-  AppendBytes(utf8Data, mode, &dataBits, encoding, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t numInputBytes = dataBits.sizeInBytes();
-  InitQRCode(numInputBytes, ecLevel, mode, qrCode, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CBC_QRCoderBitVector headerAndDataBits;
-  headerAndDataBits.Init();
-  AppendModeInfo(mode, &headerAndDataBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t numLetters = mode == CBC_QRCoderMode::sBYTE ? dataBits.sizeInBytes()
-                                                      : content.GetLength();
-  AppendLengthInfo(numLetters, qrCode->GetVersion(), mode, &headerAndDataBits,
-                   e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  headerAndDataBits.AppendBitVector(&dataBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e)
-      TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CBC_QRCoderBitVector finalBits;
-  finalBits.Init();
-  InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
-                        qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
-                        &finalBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
-      qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
-  matrix->Init();
-  int32_t maskPattern = ChooseMaskPattern(
-      &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  qrCode->SetMaskPattern(maskPattern);
-  CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(),
-                                     qrCode->GetVersion(),
-                                     qrCode->GetMaskPattern(), matrix.get(), e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release());
-  if (!qrCode->IsValid()) {
-    e = BCExceptionInvalidQRCode;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::TerminateBits(int32_t numDataBytes,
-                                       CBC_QRCoderBitVector* bits,
-                                       int32_t& e) {
-  int32_t capacity = numDataBytes << 3;
-  if (bits->Size() > capacity) {
-    e = BCExceptionDataTooMany;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t i = 0; i < 4 && bits->Size() < capacity; ++i) {
-    bits->AppendBit(0, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t numBitsInLastByte = bits->Size() % 8;
-  if (numBitsInLastByte > 0) {
-    int32_t numPaddingBits = 8 - numBitsInLastByte;
-    for (int32_t j = 0; j < numPaddingBits; ++j) {
-      bits->AppendBit(0, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e)
-    }
-  }
-  if (bits->Size() % 8 != 0) {
-    e = BCExceptionDigitLengthMustBe8;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t numPaddingBytes = numDataBytes - bits->sizeInBytes();
-  for (int32_t k = 0; k < numPaddingBytes; ++k) {
-    if (k % 2 == 0) {
-      bits->AppendBits(0xec, 8, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    } else {
-      bits->AppendBits(0x11, 8, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-  }
-  if (bits->Size() != capacity) {
-    e = BCExceptionBitsNotEqualCacity;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-int32_t CBC_QRCoderEncoder::ChooseMaskPattern(
-    CBC_QRCoderBitVector* bits,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t version,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  int32_t minPenalty = 65535;
-  int32_t bestMaskPattern = -1;
-  for (int32_t maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS;
-       maskPattern++) {
-    CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern,
-                                       matrix, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    int32_t penalty = CalculateMaskPenalty(matrix);
-    if (penalty < minPenalty) {
-      minPenalty = penalty;
-      bestMaskPattern = maskPattern;
-    }
-  }
-  return bestMaskPattern;
-}
-int32_t CBC_QRCoderEncoder::CalculateMaskPenalty(CBC_CommonByteMatrix* matrix) {
-  int32_t penalty = 0;
-  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(matrix);
-  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(matrix);
-  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(matrix);
-  penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(matrix);
-  return penalty;
-}
-CBC_QRCoderMode* CBC_QRCoderEncoder::ChooseMode(const CFX_ByteString& content,
-                                                CFX_ByteString encoding) {
-  if (encoding.Compare("SHIFT_JIS") == 0) {
-    return CBC_QRCoderMode::sKANJI;
-  }
-  FX_BOOL hasNumeric = FALSE;
-  FX_BOOL hasAlphaNumeric = FALSE;
-  for (int32_t i = 0; i < content.GetLength(); i++) {
-    if (isdigit((uint8_t)content[i])) {
-      hasNumeric = TRUE;
-    } else if (GetAlphaNumericCode((uint8_t)content[i]) != -1) {
-      hasAlphaNumeric = TRUE;
-    } else {
-      return CBC_QRCoderMode::sBYTE;
-    }
-  }
-  if (hasAlphaNumeric) {
-    return CBC_QRCoderMode::sALPHANUMERIC;
-  } else if (hasNumeric) {
-    return CBC_QRCoderMode::sNUMERIC;
-  }
-  return CBC_QRCoderMode::sBYTE;
-}
-int32_t CBC_QRCoderEncoder::GetAlphaNumericCode(int32_t code) {
-  if (code < 96 && code >= 0) {
-    return m_alphaNumbericTable[code];
-  }
-  return -1;
-}
-void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString& content,
-                                     CBC_QRCoderMode* mode,
-                                     CBC_QRCoderBitVector* bits,
-                                     CFX_ByteString encoding,
-                                     int32_t& e) {
-  if (mode == CBC_QRCoderMode::sNUMERIC) {
-    AppendNumericBytes(content, bits, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else if (mode == CBC_QRCoderMode::sALPHANUMERIC) {
-    AppendAlphaNumericBytes(content, bits, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else if (mode == CBC_QRCoderMode::sBYTE) {
-    Append8BitBytes(content, bits, encoding, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else if (mode == CBC_QRCoderMode::sKANJI) {
-    AppendKanjiBytes(content, bits, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else if (mode == CBC_QRCoderMode::sGBK) {
-    AppendGBKBytes(content, bits, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  } else {
-    e = BCExceptionUnsupportedMode;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::AppendNumericBytes(const CFX_ByteString& content,
-                                            CBC_QRCoderBitVector* bits,
-                                            int32_t& e) {
-  int32_t length = content.GetLength();
-  int32_t i = 0;
-  while (i < length) {
-    int32_t num1 = content[i] - '0';
-    if (i + 2 < length) {
-      int32_t num2 = content[i + 1] - '0';
-      int32_t num3 = content[i + 2] - '0';
-      bits->AppendBits(num1 * 100 + num2 * 10 + num3, 10, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e) i += 3;
-    } else if (i + 1 < length) {
-      int32_t num2 = content[i + 1] - '0';
-      bits->AppendBits(num1 * 10 + num2, 7, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e) i += 2;
-    } else {
-      bits->AppendBits(num1, 4, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      i++;
-    }
-  }
-}
-void CBC_QRCoderEncoder::AppendAlphaNumericBytes(const CFX_ByteString& content,
-                                                 CBC_QRCoderBitVector* bits,
-                                                 int32_t& e) {
-  int32_t length = content.GetLength();
-  int32_t i = 0;
-  while (i < length) {
-    int32_t code1 = GetAlphaNumericCode(content[i]);
-    if (code1 == -1) {
-      e = BCExceptionInvalidateCharacter;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    if (i + 1 < length) {
-      int32_t code2 = GetAlphaNumericCode(content[i + 1]);
-      if (code2 == -1) {
-        e = BCExceptionInvalidateCharacter;
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-      bits->AppendBits(code1 * 45 + code2, 11, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      i += 2;
-    } else {
-      bits->AppendBits(code1, 6, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e) i++;
-    }
-  }
-}
-void CBC_QRCoderEncoder::AppendGBKBytes(const CFX_ByteString& content,
-                                        CBC_QRCoderBitVector* bits,
-                                        int32_t& e) {
-  int32_t length = content.GetLength();
-  FX_DWORD value = 0;
-  for (int32_t i = 0; i < length; i += 2) {
-    value = (FX_DWORD)((uint8_t)content[i] << 8 | (uint8_t)content[i + 1]);
-    if (value <= 0xAAFE && value >= 0xA1A1) {
-      value -= 0xA1A1;
-    } else if (value <= 0xFAFE && value >= 0xB0A1) {
-      value -= 0xA6A1;
-    } else {
-      e = BCExceptionInvalidateCharacter;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    value = (FX_DWORD)((value >> 8) * 0x60) + (FX_DWORD)(value & 0xff);
-    bits->AppendBits(value, 13, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::Append8BitBytes(const CFX_ByteString& content,
-                                         CBC_QRCoderBitVector* bits,
-                                         CFX_ByteString encoding,
-                                         int32_t& e) {
-  for (int32_t i = 0; i < content.GetLength(); i++) {
-    bits->AppendBits(content[i], 8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray& bytes,
-                                         CBC_QRCoderBitVector* bits,
-                                         int32_t& e) {
-  for (int32_t i = 0; i < bytes.GetSize(); i++) {
-    bits->AppendBits(bytes[i], 8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString& content,
-                                          CBC_QRCoderBitVector* bits,
-                                          int32_t& e) {
-  CFX_ByteArray bytes;
-  FX_DWORD value = 0;
-  for (int32_t i = 0; i < bytes.GetSize(); i += 2) {
-    value = (FX_DWORD)((uint8_t)(content[i] << 8) | (uint8_t)content[i + 1]);
-    if (value <= 0x9ffc && value >= 0x8140) {
-      value -= 0x8140;
-    } else if (value <= 0xebbf && value >= 0xe040) {
-      value -= 0xc140;
-    } else {
-      e = BCExceptionInvalidateCharacter;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    value = (FX_DWORD)((value >> 8) * 0xc0) + (FX_DWORD)(value & 0xff);
-    bits->AppendBits(value, 13, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::InitQRCode(int32_t numInputBytes,
-                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                    CBC_QRCoderMode* mode,
-                                    CBC_QRCoder* qrCode,
-                                    int32_t& e) {
-  qrCode->SetECLevel(ecLevel);
-  qrCode->SetMode(mode);
-  for (int32_t versionNum = 1; versionNum <= 40; versionNum++) {
-    CBC_QRCoderVersion* version =
-        CBC_QRCoderVersion::GetVersionForNumber(versionNum, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    int32_t numBytes = version->GetTotalCodeWords();
-    CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
-    int32_t numEcBytes = ecBlocks->GetTotalECCodeWords();
-    int32_t numRSBlocks = ecBlocks->GetNumBlocks();
-    int32_t numDataBytes = numBytes - numEcBytes;
-    if (numDataBytes >= numInputBytes + 3) {
-      qrCode->SetVersion(versionNum);
-      qrCode->SetNumTotalBytes(numBytes);
-      qrCode->SetNumDataBytes(numDataBytes);
-      qrCode->SetNumRSBlocks(numRSBlocks);
-      qrCode->SetNumECBytes(numEcBytes);
-      qrCode->SetMatrixWidth(version->GetDimensionForVersion());
-      return;
-    }
-  }
-  e = BCExceptionCannotFindBlockInfo;
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderEncoder::AppendModeInfo(CBC_QRCoderMode* mode,
-                                        CBC_QRCoderBitVector* bits,
-                                        int32_t& e) {
-  bits->AppendBits(mode->GetBits(), 4, e);
-  if (mode == CBC_QRCoderMode::sGBK) {
-    bits->AppendBits(1, 4, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::AppendLengthInfo(int32_t numLetters,
-                                          int32_t version,
-                                          CBC_QRCoderMode* mode,
-                                          CBC_QRCoderBitVector* bits,
-                                          int32_t& e) {
-  CBC_QRCoderVersion* qcv = CBC_QRCoderVersion::GetVersionForNumber(version, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t numBits = mode->GetCharacterCountBits(qcv, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  if (numBits > ((1 << numBits) - 1)) {
-    return;
-  }
-  if (mode == CBC_QRCoderMode::sGBK) {
-    bits->AppendBits(numLetters / 2, numBits, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  bits->AppendBits(numLetters, numBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderEncoder::InterleaveWithECBytes(CBC_QRCoderBitVector* bits,
-                                               int32_t numTotalBytes,
-                                               int32_t numDataBytes,
-                                               int32_t numRSBlocks,
-                                               CBC_QRCoderBitVector* result,
-                                               int32_t& e) {
-  if (bits->sizeInBytes() != numDataBytes) {
-    e = BCExceptionBitsBytesNotMatch;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t dataBytesOffset = 0;
-  int32_t maxNumDataBytes = 0;
-  int32_t maxNumEcBytes = 0;
-  CFX_PtrArray blocks;
-  int32_t i;
-  for (i = 0; i < numRSBlocks; i++) {
-    int32_t numDataBytesInBlock;
-    int32_t numEcBytesInBlosk;
-    GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes,
-                                           numRSBlocks, i, numDataBytesInBlock,
-                                           numEcBytesInBlosk);
-    CBC_CommonByteArray* dataBytes = new CBC_CommonByteArray;
-    dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock);
-    CBC_CommonByteArray* ecBytes =
-        GenerateECBytes(dataBytes, numEcBytesInBlosk, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    blocks.Add(new CBC_QRCoderBlockPair(dataBytes, ecBytes));
-    maxNumDataBytes = std::max(maxNumDataBytes, dataBytes->Size());
-    maxNumEcBytes = std::max(maxNumEcBytes, ecBytes->Size());
-    dataBytesOffset += numDataBytesInBlock;
-  }
-  if (numDataBytes != dataBytesOffset) {
-    e = BCExceptionBytesNotMatchOffset;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t x = 0; x < maxNumDataBytes; x++) {
-    for (int32_t j = 0; j < blocks.GetSize(); j++) {
-      CBC_CommonByteArray* dataBytes =
-          ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes();
-      if (x < dataBytes->Size()) {
-        result->AppendBits(dataBytes->At(x), 8, e);
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-    }
-  }
-  for (int32_t y = 0; y < maxNumEcBytes; y++) {
-    for (int32_t l = 0; l < blocks.GetSize(); l++) {
-      CBC_CommonByteArray* ecBytes =
-          ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes();
-      if (y < ecBytes->Size()) {
-        result->AppendBits(ecBytes->At(y), 8, e);
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-    }
-  }
-  for (int32_t k = 0; k < blocks.GetSize(); k++) {
-    delete (CBC_QRCoderBlockPair*)blocks[k];
-  }
-  if (numTotalBytes != result->sizeInBytes()) {
-    e = BCExceptionSizeInBytesDiffer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderEncoder::GetNumDataBytesAndNumECBytesForBlockID(
-    int32_t numTotalBytes,
-    int32_t numDataBytes,
-    int32_t numRSBlocks,
-    int32_t blockID,
-    int32_t& numDataBytesInBlock,
-    int32_t& numECBytesInBlock) {
-  if (blockID >= numRSBlocks) {
-    return;
-  }
-  int32_t numRsBlocksInGroup2 = numTotalBytes % numRSBlocks;
-  int32_t numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2;
-  int32_t numTotalBytesInGroup1 = numTotalBytes / numRSBlocks;
-  int32_t numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1;
-  int32_t numDataBytesInGroup1 = numDataBytes / numRSBlocks;
-  int32_t numDataBytesInGroup2 = numDataBytesInGroup1 + 1;
-  int32_t numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1;
-  int32_t numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2;
-  if (blockID < numRsBlocksInGroup1) {
-    numDataBytesInBlock = numDataBytesInGroup1;
-    numECBytesInBlock = numEcBytesInGroup1;
-  } else {
-    numDataBytesInBlock = numDataBytesInGroup2;
-    numECBytesInBlock = numEcBytesInGroup2;
-  }
-}
-CBC_CommonByteArray* CBC_QRCoderEncoder::GenerateECBytes(
-    CBC_CommonByteArray* dataBytes,
-    int32_t numEcBytesInBlock,
-    int32_t& e) {
-  int32_t numDataBytes = dataBytes->Size();
-  CFX_Int32Array toEncode;
-  toEncode.SetSize(numDataBytes + numEcBytesInBlock);
-  for (int32_t i = 0; i < numDataBytes; i++) {
-    toEncode[i] = (dataBytes->At(i));
-  }
-  CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild);
-  encode.Init();
-  encode.Encode(&toEncode, numEcBytesInBlock, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock);
-  for (int32_t j = 0; j < numEcBytesInBlock; j++) {
-    ecBytes->Set(j, toEncode[numDataBytes + j]);
-  }
-  return ecBytes;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h
deleted file mode 100644
index f1b6504..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_QRCoder;
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_QRCoderMode;
-class CBC_QRCoderBitVector;
-class CBC_CommonByteArray;
-class CBC_CommonByteMatrix;
-
-class CBC_QRCoderEncoder {
- private:
-  static const int32_t m_alphaNumbericTable[96];
-
- public:
-  CBC_QRCoderEncoder();
-  virtual ~CBC_QRCoderEncoder();
-
-  static void Encode(const CFX_ByteString& content,
-                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                     CBC_QRCoder* qrCode,
-                     int32_t& e,
-                     int32_t versionSpecify = 0);
-  static void Encode(const CFX_WideString& content,
-                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                     CBC_QRCoder* qrCode,
-                     int32_t& e);
-  static void EncodeWithSpecifyVersion(const CFX_ByteString& content,
-                                       CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                       CBC_QRCoder* qrCode,
-                                       int32_t versionSpecify,
-                                       int32_t& e);
-  static void EncodeWithAutoVersion(const CFX_ByteString& content,
-                                    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                    CBC_QRCoder* qrCode,
-                                    int32_t& e);
-  static CBC_QRCoderMode* ChooseMode(const CFX_ByteString& content,
-                                     CFX_ByteString encoding);
-  static int32_t GetAlphaNumericCode(int32_t code);
-  static void AppendECI(CBC_QRCoderBitVector* bits);
-  static void AppendBytes(const CFX_ByteString& content,
-                          CBC_QRCoderMode* mode,
-                          CBC_QRCoderBitVector* bits,
-                          CFX_ByteString encoding,
-                          int32_t& e);
-  static void AppendNumericBytes(const CFX_ByteString& content,
-                                 CBC_QRCoderBitVector* bits,
-                                 int32_t& e);
-  static void AppendAlphaNumericBytes(const CFX_ByteString& content,
-                                      CBC_QRCoderBitVector* bits,
-                                      int32_t& e);
-  static void Append8BitBytes(const CFX_ByteString& content,
-                              CBC_QRCoderBitVector* bits,
-                              CFX_ByteString encoding,
-                              int32_t& e);
-  static void Append8BitBytes(CFX_ByteArray& bytes,
-                              CBC_QRCoderBitVector* bits,
-                              int32_t& e);
-  static void AppendKanjiBytes(const CFX_ByteString& content,
-                               CBC_QRCoderBitVector* bits,
-                               int32_t& e);
-  static void AppendGBKBytes(const CFX_ByteString& content,
-                             CBC_QRCoderBitVector* bits,
-                             int32_t& e);
-  static void InitQRCode(int32_t numInputBytes,
-                         int32_t versionNumber,
-                         CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                         CBC_QRCoderMode* mode,
-                         CBC_QRCoder* qrCode,
-                         int32_t& e);
-  static void InitQRCode(int32_t numInputBytes,
-                         CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                         CBC_QRCoderMode* mode,
-                         CBC_QRCoder* qrCode,
-                         int32_t& e);
-  static void AppendModeInfo(CBC_QRCoderMode* mode,
-                             CBC_QRCoderBitVector* bits,
-                             int32_t& e);
-  static void AppendLengthInfo(int32_t numLetters,
-                               int32_t version,
-                               CBC_QRCoderMode* mode,
-                               CBC_QRCoderBitVector* bits,
-                               int32_t& e);
-
-  static void InterleaveWithECBytes(CBC_QRCoderBitVector* bits,
-                                    int32_t numTotalBytes,
-                                    int32_t numDataBytes,
-                                    int32_t numRSBlocks,
-                                    CBC_QRCoderBitVector* result,
-                                    int32_t& e);
-  static void GetNumDataBytesAndNumECBytesForBlockID(
-      int32_t numTotalBytes,
-      int32_t numDataBytes,
-      int32_t numRSBlocks,
-      int32_t blockID,
-      int32_t& numDataBytesInBlock,
-      int32_t& numECBytesInBlocks);
-  static CBC_CommonByteArray* GenerateECBytes(CBC_CommonByteArray* dataBytes,
-                                              int32_t numEcBytesInBlock,
-                                              int32_t& e);
-  static int32_t ChooseMaskPattern(CBC_QRCoderBitVector* bits,
-                                   CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                   int32_t version,
-                                   CBC_CommonByteMatrix* matrix,
-                                   int32_t& e);
-  static int32_t CalculateMaskPenalty(CBC_CommonByteMatrix* matrix);
-  static void TerminateBits(int32_t numDataBytes,
-                            CBC_QRCoderBitVector* bits,
-                            int32_t& e);
-  static int32_t GetSpanByVersion(CBC_QRCoderMode* modeFirst,
-                                  CBC_QRCoderMode* modeSecond,
-                                  int32_t versionNum,
-                                  int32_t& e);
-  static void MergeString(CFX_PtrArray& result, int32_t versionNum, int32_t& e);
-  static void SplitString(const CFX_ByteString& content, CFX_PtrArray& result);
-  static void AppendDataModeLenghInfo(CFX_PtrArray& splitResult,
-                                      CBC_QRCoderBitVector& headerAndDataBits,
-                                      CBC_QRCoderMode* tempMode,
-                                      CBC_QRCoder* qrCode,
-                                      CFX_ByteString& encoding,
-                                      int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp
deleted file mode 100644
index ea239bd..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::L = NULL;
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::M = NULL;
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::Q = NULL;
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::H = NULL;
-
-CBC_QRCoderErrorCorrectionLevel::CBC_QRCoderErrorCorrectionLevel(
-    int32_t ordinal,
-    int32_t bits,
-    FX_CHAR* name) {
-  m_name += name;
-  m_ordinal = ordinal;
-  m_bits = bits;
-}
-CBC_QRCoderErrorCorrectionLevel::~CBC_QRCoderErrorCorrectionLevel() {}
-void CBC_QRCoderErrorCorrectionLevel::Initialize() {
-  L = new CBC_QRCoderErrorCorrectionLevel(0, 0x01, (FX_CHAR*)"L");
-  M = new CBC_QRCoderErrorCorrectionLevel(1, 0x00, (FX_CHAR*)"M");
-  Q = new CBC_QRCoderErrorCorrectionLevel(2, 0x03, (FX_CHAR*)"Q");
-  H = new CBC_QRCoderErrorCorrectionLevel(3, 0x02, (FX_CHAR*)"H");
-}
-void CBC_QRCoderErrorCorrectionLevel::Finalize() {
-  delete L;
-  delete M;
-  delete Q;
-  delete H;
-}
-int32_t CBC_QRCoderErrorCorrectionLevel::Ordinal() {
-  return m_ordinal;
-}
-int32_t CBC_QRCoderErrorCorrectionLevel::GetBits() {
-  return m_bits;
-}
-CFX_ByteString CBC_QRCoderErrorCorrectionLevel::GetName() {
-  return m_name;
-}
-CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::ForBits(
-    int32_t bits) {
-  switch (bits) {
-    case 0x00:
-      return M;
-    case 0x01:
-      return L;
-    case 0x02:
-      return H;
-    case 0x03:
-      return Q;
-    default:
-      return NULL;
-  }
-}
-void CBC_QRCoderErrorCorrectionLevel::Destroy() {
-  if (L) {
-    delete CBC_QRCoderErrorCorrectionLevel::L;
-    L = NULL;
-  }
-  if (M) {
-    delete CBC_QRCoderErrorCorrectionLevel::M;
-    M = NULL;
-  }
-  if (H) {
-    delete CBC_QRCoderErrorCorrectionLevel::H;
-    H = NULL;
-  }
-  if (Q) {
-    delete CBC_QRCoderErrorCorrectionLevel::Q;
-    Q = NULL;
-  }
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h
deleted file mode 100644
index 7714242..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
-
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_QRCoderErrorCorrectionLevel {
- private:
-  int32_t m_ordinal;
-  int32_t m_bits;
-  CFX_ByteString m_name;
-  CBC_QRCoderErrorCorrectionLevel(int32_t ordinal, int32_t bits, FX_CHAR* name);
-  CBC_QRCoderErrorCorrectionLevel();
-
- public:
-  static CBC_QRCoderErrorCorrectionLevel* L;
-  static CBC_QRCoderErrorCorrectionLevel* M;
-  static CBC_QRCoderErrorCorrectionLevel* Q;
-  static CBC_QRCoderErrorCorrectionLevel* H;
-  virtual ~CBC_QRCoderErrorCorrectionLevel();
-  static void Initialize();
-  static void Finalize();
-  int32_t Ordinal();
-  int32_t GetBits();
-  CFX_ByteString GetName();
-  static void Destroy();
-  static CBC_QRCoderErrorCorrectionLevel* ForBits(int32_t bits);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERERRORCORRECTIONLEVEL_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp
deleted file mode 100644
index 97c6c2a..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_QRCoderFormatInformation::FORMAT_INFO_MASK_QR = 0X5412;
-const int32_t CBC_QRCoderFormatInformation::FORMAT_INFO_DECODE_LOOKUP[32][2] = {
-    {0x5412, 0x00}, {0x5125, 0x01}, {0x5E7C, 0x02}, {0x5B4B, 0x03},
-    {0x45F9, 0x04}, {0x40CE, 0x05}, {0x4F97, 0x06}, {0x4AA0, 0x07},
-    {0x77C4, 0x08}, {0x72F3, 0x09}, {0x7DAA, 0x0A}, {0x789D, 0x0B},
-    {0x662F, 0x0C}, {0x6318, 0x0D}, {0x6C41, 0x0E}, {0x6976, 0x0F},
-    {0x1689, 0x10}, {0x13BE, 0x11}, {0x1CE7, 0x12}, {0x19D0, 0x13},
-    {0x0762, 0x14}, {0x0255, 0x15}, {0x0D0C, 0x16}, {0x083B, 0x17},
-    {0x355F, 0x18}, {0x3068, 0x19}, {0x3F31, 0x1A}, {0x3A06, 0x1B},
-    {0x24B4, 0x1C}, {0x2183, 0x1D}, {0x2EDA, 0x1E}, {0x2BED, 0x1F},
-};
-const int32_t CBC_QRCoderFormatInformation::BITS_SET_IN_HALF_BYTE[] = {
-    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
-
-CBC_QRCoderFormatInformation::CBC_QRCoderFormatInformation(int32_t formatInfo) {
-  m_errorCorrectLevl =
-      CBC_QRCoderErrorCorrectionLevel::ForBits((formatInfo >> 3) & 0x03);
-  m_dataMask = (uint8_t)(formatInfo & 0x07);
-}
-CBC_QRCoderFormatInformation::~CBC_QRCoderFormatInformation() {}
-int32_t CBC_QRCoderFormatInformation::NumBitsDiffering(int32_t a, int32_t b) {
-  a ^= b;
-  return BITS_SET_IN_HALF_BYTE[a & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] +
-         BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F];
-}
-uint8_t CBC_QRCoderFormatInformation::GetDataMask() {
-  return m_dataMask;
-}
-CBC_QRCoderErrorCorrectionLevel*
-CBC_QRCoderFormatInformation::GetErrorCorrectionLevel() {
-  return m_errorCorrectLevl;
-}
-CBC_QRCoderFormatInformation*
-CBC_QRCoderFormatInformation::DecodeFormatInformation(
-    int32_t maskedFormatInfo) {
-  CBC_QRCoderFormatInformation* formatInfo =
-      DoDecodeFormatInformation(maskedFormatInfo);
-  if (formatInfo)
-    return formatInfo;
-  return DoDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR);
-}
-CBC_QRCoderFormatInformation*
-CBC_QRCoderFormatInformation::DoDecodeFormatInformation(
-    int32_t maskedFormatInfo) {
-  int32_t bestDifference = (int32_t)FXSYS_nan();
-  int32_t bestFormatInfo = 0;
-  for (int32_t i = 0; i < 32; i++) {
-    int32_t const* decodeInfo = &FORMAT_INFO_DECODE_LOOKUP[i][0];
-    int32_t targetInfo = decodeInfo[0];
-    if (targetInfo == maskedFormatInfo) {
-      return new CBC_QRCoderFormatInformation(decodeInfo[1]);
-    }
-    int32_t bitsDifference = NumBitsDiffering(maskedFormatInfo, targetInfo);
-    if (bitsDifference < bestDifference) {
-      bestFormatInfo = decodeInfo[1];
-      bestDifference = bitsDifference;
-    }
-  }
-  if (bestDifference <= 3) {
-    return new CBC_QRCoderFormatInformation(bestFormatInfo);
-  }
-  return NULL;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h
deleted file mode 100644
index 61870d7..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
-
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_QRCoderFormatInformation {
- private:
-  static const int32_t FORMAT_INFO_MASK_QR;
-  static const int32_t FORMAT_INFO_DECODE_LOOKUP[32][2];
-  static const int32_t BITS_SET_IN_HALF_BYTE[16];
-  CBC_QRCoderErrorCorrectionLevel* m_errorCorrectLevl;
-  uint8_t m_dataMask;
-
- public:
-  CBC_QRCoderFormatInformation(int32_t formatInfo);
-  virtual ~CBC_QRCoderFormatInformation();
-  uint8_t GetDataMask();
-  CBC_QRCoderErrorCorrectionLevel* GetErrorCorrectionLevel();
-
-  static int32_t NumBitsDiffering(int32_t a, int32_t b);
-  static CBC_QRCoderFormatInformation* DecodeFormatInformation(
-      int32_t maskedFormatInfo);
-  static CBC_QRCoderFormatInformation* DoDecodeFormatInformation(
-      int32_t maskedFormatInfo);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERFORMATINFORMATION_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp
deleted file mode 100644
index 840d542..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRCoderMaskUtil::CBC_QRCoderMaskUtil() {}
-CBC_QRCoderMaskUtil::~CBC_QRCoderMaskUtil() {}
-int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(
-    CBC_CommonByteMatrix* matrix) {
-  return ApplyMaskPenaltyRule1Internal(matrix, TRUE) +
-         ApplyMaskPenaltyRule1Internal(matrix, FALSE);
-}
-
-int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(
-    CBC_CommonByteMatrix* matrix) {
-  int32_t penalty = 0;
-  uint8_t* array = matrix->GetArray();
-  int32_t width = matrix->GetWidth();
-  int32_t height = matrix->GetHeight();
-  for (int32_t y = 0; y < height - 1; y++) {
-    for (int32_t x = 0; x < width - 1; x++) {
-      int32_t value = array[y * width + x];
-      if (value == array[y * width + x + 1] &&
-          value == array[(y + 1) * width + x] &&
-          value == array[(y + 1) * width + x + 1]) {
-        penalty++;
-      }
-    }
-  }
-  return 3 * penalty;
-}
-
-int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(
-    CBC_CommonByteMatrix* matrix) {
-  int32_t penalty = 0;
-  uint8_t* array = matrix->GetArray();
-  int32_t width = matrix->GetWidth();
-  int32_t height = matrix->GetHeight();
-  for (int32_t y = 0; y < height; ++y) {
-    for (int32_t x = 0; x < width; ++x) {
-      if (x == 0 &&
-          ((y >= 0 && y <= 6) || (y >= height - 7 && y <= height - 1))) {
-        continue;
-      }
-      if (x == width - 7 && (y >= 0 && y <= 6)) {
-        continue;
-      }
-      if (y == 0 &&
-          ((x >= 0 && x <= 6) || (x >= width - 7 && x <= width - 1))) {
-        continue;
-      }
-      if (y == height - 7 && (x >= 0 && x <= 6)) {
-        continue;
-      }
-      if (x + 6 < width && array[y * width + x] == 1 &&
-          array[y * width + x + 1] == 0 && array[y * width + x + 2] == 1 &&
-          array[y * width + x + 3] == 1 && array[y * width + x + 4] == 1 &&
-          array[y * width + x + 5] == 0 && array[y * width + x + 6] == 1 &&
-          ((x + 10 < width && array[y * width + x + 7] == 0 &&
-            array[y * width + x + 8] == 0 && array[y * width + x + 9] == 0 &&
-            array[y * width + x + 10] == 0) ||
-           (x - 4 >= 0 && array[y * width + x - 1] == 0 &&
-            array[y * width + x - 2] == 0 && array[y * width + x - 3] == 0 &&
-            array[y * width + x - 4] == 0))) {
-        penalty += 40;
-      }
-      if (y + 6 < height && array[y * width + x] == 1 &&
-          array[(y + 1) * width + x] == 0 && array[(y + 2) * width + x] == 1 &&
-          array[(y + 3) * width + x] == 1 && array[(y + 4) * width + x] == 1 &&
-          array[(y + 5) * width + x] == 0 && array[(y + 6) * width + x] == 1 &&
-          ((y + 10 < height && array[(y + 7) * width + x] == 0 &&
-            array[(y + 8) * width + x] == 0 &&
-            array[(y + 9) * width + x] == 0 &&
-            array[(y + 10) * width + x] == 0) ||
-           (y - 4 >= 0 && array[(y - 1) * width + x] == 0 &&
-            array[(y - 2) * width + x] == 0 &&
-            array[(y - 3) * width + x] == 0 &&
-            array[(y - 4) * width + x] == 0))) {
-        penalty += 40;
-      }
-    }
-  }
-  return penalty;
-}
-int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(
-    CBC_CommonByteMatrix* matrix) {
-  int32_t numDarkCells = 0;
-  uint8_t* array = matrix->GetArray();
-  int32_t width = matrix->GetWidth();
-  int32_t height = matrix->GetHeight();
-  for (int32_t y = 0; y < height; ++y) {
-    for (int32_t x = 0; x < width; ++x) {
-      if (array[y * width + x] == 1) {
-        numDarkCells += 1;
-      }
-    }
-  }
-  int32_t numTotalCells = matrix->GetHeight() * matrix->GetWidth();
-  double darkRatio = (double)numDarkCells / numTotalCells;
-  return abs((int32_t)(darkRatio * 100 - 50) / 5) * 5 * 10;
-}
-FX_BOOL CBC_QRCoderMaskUtil::GetDataMaskBit(int32_t maskPattern,
-                                            int32_t x,
-                                            int32_t y,
-                                            int32_t& e) {
-  if (!CBC_QRCoder::IsValidMaskPattern(maskPattern)) {
-    e = (BCExceptionInvalidateMaskPattern);
-    BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  }
-  int32_t intermediate = 0, temp = 0;
-  switch (maskPattern) {
-    case 0:
-      intermediate = (y + x) & 0x1;
-      break;
-    case 1:
-      intermediate = y & 0x1;
-      break;
-    case 2:
-      intermediate = x % 3;
-      break;
-    case 3:
-      intermediate = (y + x) % 3;
-      break;
-    case 4:
-      intermediate = ((y >> 1) + (x / 3)) & 0x1;
-      break;
-    case 5:
-      temp = y * x;
-      intermediate = (temp & 0x1) + (temp % 3);
-      break;
-    case 6:
-      temp = y * x;
-      intermediate = (((temp & 0x1) + (temp % 3)) & 0x1);
-      break;
-    case 7:
-      temp = y * x;
-      intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1);
-      break;
-    default: {
-      e = BCExceptionInvalidateMaskPattern;
-      BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-    }
-  }
-  return intermediate == 0;
-}
-int32_t CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1Internal(
-    CBC_CommonByteMatrix* matrix,
-    FX_BOOL isHorizontal) {
-  int32_t penalty = 0;
-  int32_t numSameBitCells = 0;
-  int32_t prevBit = -1;
-  int32_t width = matrix->GetWidth();
-  int32_t height = matrix->GetHeight();
-  int32_t iLimit = isHorizontal ? height : width;
-  int32_t jLimit = isHorizontal ? width : height;
-  uint8_t* array = matrix->GetArray();
-  for (int32_t i = 0; i < iLimit; ++i) {
-    for (int32_t j = 0; j < jLimit; ++j) {
-      int32_t bit = isHorizontal ? array[i * width + j] : array[j * width + i];
-      if (bit == prevBit) {
-        numSameBitCells += 1;
-        if (numSameBitCells == 5) {
-          penalty += 3;
-        } else if (numSameBitCells > 5) {
-          penalty += 1;
-        }
-      } else {
-        numSameBitCells = 1;
-        prevBit = bit;
-      }
-    }
-    numSameBitCells = 0;
-  }
-  return penalty;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h
deleted file mode 100644
index ad6274c..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
-class CBC_CommonByteMatrix;
-class CBC_QRCoderMaskUtil {
- public:
-  CBC_QRCoderMaskUtil();
-  virtual ~CBC_QRCoderMaskUtil();
-  static FX_BOOL GetDataMaskBit(int32_t maskPattern,
-                                int32_t x,
-                                int32_t y,
-                                int32_t& e);
-
-  static int32_t ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix);
-  static int32_t ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix);
-  static int32_t ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix);
-  static int32_t ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix);
-  static int32_t ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix,
-                                               FX_BOOL isHorizontal);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMASKUTIL_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp
deleted file mode 100644
index bf1d258..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2008 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_QRCoderMatrixUtil::POSITION_DETECTION_PATTERN[7][7] = {
-    {1, 1, 1, 1, 1, 1, 1},
-    {1, 0, 0, 0, 0, 0, 1},
-    {1, 0, 1, 1, 1, 0, 1},
-    {1, 0, 1, 1, 1, 0, 1},
-    {1, 0, 1, 1, 1, 0, 1},
-    {1, 0, 0, 0, 0, 0, 1},
-    {1, 1, 1, 1, 1, 1, 1}};
-const int32_t CBC_QRCoderMatrixUtil::HORIZONTAL_SEPARATION_PATTERN[1][8] = {
-    {0, 0, 0, 0, 0, 0, 0, 0}};
-const int32_t CBC_QRCoderMatrixUtil::VERTICAL_SEPARATION_PATTERN[7][1] =
-    {{0}, {0}, {0}, {0}, {0}, {0}, {0}};
-const int32_t CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN[5][5] = {
-    {1, 1, 1, 1, 1},
-    {1, 0, 0, 0, 1},
-    {1, 0, 1, 0, 1},
-    {1, 0, 0, 0, 1},
-    {1, 1, 1, 1, 1}};
-const int32_t
-    CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7] =
-        // NOLINTNEXTLINE
-    {
-        {-1, -1, -1, -1, -1, -1, -1},   {6, 18, -1, -1, -1, -1, -1},
-        {6, 22, -1, -1, -1, -1, -1},    {6, 26, -1, -1, -1, -1, -1},
-        {6, 30, -1, -1, -1, -1, -1},    {6, 34, -1, -1, -1, -1, -1},
-        {6, 22, 38, -1, -1, -1, -1},    {6, 24, 42, -1, -1, -1, -1},
-        {6, 26, 46, -1, -1, -1, -1},    {6, 28, 50, -1, -1, -1, -1},
-        {6, 30, 54, -1, -1, -1, -1},    {6, 32, 58, -1, -1, -1, -1},
-        {6, 34, 62, -1, -1, -1, -1},    {6, 26, 46, 66, -1, -1, -1},
-        {6, 26, 48, 70, -1, -1, -1},    {6, 26, 50, 74, -1, -1, -1},
-        {6, 30, 54, 78, -1, -1, -1},    {6, 30, 56, 82, -1, -1, -1},
-        {6, 30, 58, 86, -1, -1, -1},    {6, 34, 62, 90, -1, -1, -1},
-        {6, 28, 50, 72, 94, -1, -1},    {6, 26, 50, 74, 98, -1, -1},
-        {6, 30, 54, 78, 102, -1, -1},   {6, 28, 54, 80, 106, -1, -1},
-        {6, 32, 58, 84, 110, -1, -1},   {6, 30, 58, 86, 114, -1, -1},
-        {6, 34, 62, 90, 118, -1, -1},   {6, 26, 50, 74, 98, 122, -1},
-        {6, 30, 54, 78, 102, 126, -1},  {6, 26, 52, 78, 104, 130, -1},
-        {6, 30, 56, 82, 108, 134, -1},  {6, 34, 60, 86, 112, 138, -1},
-        {6, 30, 58, 86, 114, 142, -1},  {6, 34, 62, 90, 118, 146, -1},
-        {6, 30, 54, 78, 102, 126, 150}, {6, 24, 50, 76, 102, 128, 154},
-        {6, 28, 54, 80, 106, 132, 158}, {6, 32, 58, 84, 110, 136, 162},
-        {6, 26, 54, 82, 110, 138, 166}, {6, 30, 58, 86, 114, 142, 170},
-};
-const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_COORDINATES[15][2] = {
-    {8, 0}, {8, 1}, {8, 2}, {8, 3}, {8, 4}, {8, 5}, {8, 7}, {8, 8},
-    {7, 8}, {5, 8}, {4, 8}, {3, 8}, {2, 8}, {1, 8}, {0, 8},
-};
-const int32_t CBC_QRCoderMatrixUtil::VERSION_INFO_POLY = 0x1f25;
-const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_POLY = 0x0537;
-const int32_t CBC_QRCoderMatrixUtil::TYPE_INFO_MASK_PATTERN = 0x5412;
-
-void CBC_QRCoderMatrixUtil::ClearMatrix(CBC_CommonByteMatrix* matrix,
-                                        int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  matrix->clear((uint8_t)-1);
-}
-void CBC_QRCoderMatrixUtil::BuildMatrix(
-    CBC_QRCoderBitVector* dataBits,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t version,
-    int32_t maskPattern,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  ClearMatrix(matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedBasicPatterns(version, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedTypeInfo(ecLevel, maskPattern, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  MaybeEmbedVersionInfo(version, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedDataBits(dataBits, maskPattern, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderMatrixUtil::EmbedBasicPatterns(int32_t version,
-                                               CBC_CommonByteMatrix* matrix,
-                                               int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  EmbedPositionDetectionPatternsAndSeparators(matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedDarkDotAtLeftBottomCorner(matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  MaybeEmbedPositionAdjustmentPatterns(version, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedTimingPatterns(matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderMatrixUtil::EmbedTypeInfo(
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t maskPattern,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  CBC_QRCoderBitVector typeInfoBits;
-  typeInfoBits.Init();
-  MakeTypeInfoBits(ecLevel, maskPattern, &typeInfoBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  for (int32_t i = 0; i < typeInfoBits.Size(); i++) {
-    int32_t bit = typeInfoBits.At(typeInfoBits.Size() - 1 - i, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    int32_t x1 = TYPE_INFO_COORDINATES[i][0];
-    int32_t y1 = TYPE_INFO_COORDINATES[i][1];
-    matrix->Set(x1, y1, bit);
-    if (i < 8) {
-      int32_t x2 = matrix->GetWidth() - i - 1;
-      int32_t y2 = 8;
-      matrix->Set(x2, y2, bit);
-    } else {
-      int32_t x2 = 8;
-      int32_t y2 = matrix->GetHeight() - 7 + (i - 8);
-      matrix->Set(x2, y2, bit);
-    }
-  }
-}
-void CBC_QRCoderMatrixUtil::MaybeEmbedVersionInfo(int32_t version,
-                                                  CBC_CommonByteMatrix* matrix,
-                                                  int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if (version < 7) {
-    return;
-  }
-  CBC_QRCoderBitVector versionInfoBits;
-  versionInfoBits.Init();
-  MakeVersionInfoBits(version, &versionInfoBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t bitIndex = 6 * 3 - 1;
-  for (int32_t i = 0; i < 6; i++) {
-    for (int32_t j = 0; j < 3; j++) {
-      int32_t bit = versionInfoBits.At(bitIndex, e);
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-      bitIndex--;
-      matrix->Set(i, matrix->GetHeight() - 11 + j, bit);
-      matrix->Set(matrix->GetHeight() - 11 + j, i, bit);
-    }
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedDataBits(CBC_QRCoderBitVector* dataBits,
-                                          int32_t maskPattern,
-                                          CBC_CommonByteMatrix* matrix,
-                                          int32_t& e) {
-  if (matrix == NULL || dataBits == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t bitIndex = 0;
-  int32_t direction = -1;
-  int32_t x = matrix->GetWidth() - 1;
-  int32_t y = matrix->GetHeight() - 1;
-  while (x > 0) {
-    if (x == 6) {
-      x -= 1;
-    }
-    while (y >= 0 && y < matrix->GetHeight()) {
-      if (y == 6) {
-        y += direction;
-        continue;
-      }
-      for (int32_t i = 0; i < 2; i++) {
-        int32_t xx = x - i;
-        if (!IsEmpty(matrix->Get(xx, y))) {
-          continue;
-        }
-        int32_t bit;
-        if (bitIndex < dataBits->Size()) {
-          bit = dataBits->At(bitIndex, e);
-          BC_EXCEPTION_CHECK_ReturnVoid(e);
-          bitIndex++;
-        } else {
-          bit = 0;
-        }
-        if (maskPattern != -1) {
-          FX_BOOL bol =
-              CBC_QRCoderMaskUtil::GetDataMaskBit(maskPattern, xx, y, e);
-          BC_EXCEPTION_CHECK_ReturnVoid(e);
-          if (bol) {
-            bit ^= 0x01;
-          }
-        }
-        matrix->Set(xx, y, bit);
-      }
-      y += direction;
-    }
-    direction = -direction;
-    y += direction;
-    x -= 2;
-  }
-  if (bitIndex != dataBits->Size()) {
-    return;
-  }
-}
-int32_t CBC_QRCoderMatrixUtil::CalculateBCHCode(int32_t value, int32_t poly) {
-  int32_t msbSetInPoly = FindMSBSet(poly);
-  value <<= msbSetInPoly - 1;
-  while (FindMSBSet(value) >= msbSetInPoly) {
-    value ^= poly << (FindMSBSet(value) - msbSetInPoly);
-  }
-  return value;
-}
-void CBC_QRCoderMatrixUtil::MakeTypeInfoBits(
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t maskPattern,
-    CBC_QRCoderBitVector* bits,
-    int32_t& e) {
-  if (bits == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if (!CBC_QRCoder::IsValidMaskPattern(maskPattern)) {
-    e = BCExceptionBadMask;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t typeInfo = (ecLevel->GetBits() << 3) | maskPattern;
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  bits->AppendBits(typeInfo, 5, e);
-  int32_t bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  bits->AppendBits(bchCode, 10, e);
-  CBC_QRCoderBitVector maskBits;
-  maskBits.Init();
-  maskBits.AppendBits(TYPE_INFO_MASK_PATTERN, 15, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  bits->XOR(&maskBits, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  if (bits->Size() != 15) {
-    e = BCExceptionBitSizeNot15;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-void CBC_QRCoderMatrixUtil::MakeVersionInfoBits(int32_t version,
-                                                CBC_QRCoderBitVector* bits,
-                                                int32_t& e) {
-  if (bits == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  bits->AppendBits(version, 6, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t bchCode = CalculateBCHCode(version, VERSION_INFO_POLY);
-  bits->AppendBits(bchCode, 12, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  if (bits->Size() != 18) {
-    e = BCExceptionBitSizeNot18;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-}
-FX_BOOL CBC_QRCoderMatrixUtil::IsEmpty(int32_t value) {
-  return (uint8_t)value == 0xff;
-}
-FX_BOOL CBC_QRCoderMatrixUtil::IsValidValue(int32_t value) {
-  return ((uint8_t)value == 0xff || (uint8_t)value == 0x00 ||
-          (uint8_t)value == 0x01);
-}
-void CBC_QRCoderMatrixUtil::EmbedTimingPatterns(CBC_CommonByteMatrix* matrix,
-                                                int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t i = 8; i < matrix->GetWidth() - 8; i++) {
-    int32_t bit = (i + 1) % 2;
-    if (!IsValidValue(matrix->Get(i, 6))) {
-      e = BCExceptionInvalidateImageData;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    if (IsEmpty(matrix->Get(i, 6))) {
-      matrix->Set(i, 6, bit);
-    }
-    if (!IsValidValue(matrix->Get(6, i))) {
-      e = BCExceptionInvalidateImageData;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    if (IsEmpty(matrix->Get(6, i))) {
-      matrix->Set(6, i, bit);
-    }
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedDarkDotAtLeftBottomCorner(
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if (matrix->Get(8, matrix->GetHeight() - 8) == 0) {
-    e = BCExceptionHeight_8BeZero;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  matrix->Set(8, matrix->GetHeight() - 8, 1);
-}
-void CBC_QRCoderMatrixUtil::EmbedHorizontalSeparationPattern(
-    int32_t xStart,
-    int32_t yStart,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t x = 0; x < 8; x++) {
-    if (!IsEmpty(matrix->Get(xStart + x, yStart))) {
-      e = BCExceptionInvalidateData;
-      BC_EXCEPTION_CHECK_ReturnVoid(e)
-    }
-    matrix->Set(xStart + x, yStart, HORIZONTAL_SEPARATION_PATTERN[0][x]);
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedVerticalSeparationPattern(
-    int32_t xStart,
-    int32_t yStart,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t y = 0; y < 7; y++) {
-    if (!IsEmpty(matrix->Get(xStart, yStart + y))) {
-      e = BCExceptionInvalidateData;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    matrix->Set(xStart, yStart + y, VERTICAL_SEPARATION_PATTERN[y][0]);
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedPositionAdjustmentPattern(
-    int32_t xStart,
-    int32_t yStart,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t y = 0; y < 5; y++) {
-    for (int32_t x = 0; x < 5; x++) {
-      if (!IsEmpty(matrix->Get(xStart + x, y + yStart))) {
-        e = BCExceptionInvalidateData;
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-      matrix->Set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]);
-    }
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPattern(
-    int32_t xStart,
-    int32_t yStart,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  for (int32_t y = 0; y < 7; y++) {
-    for (int32_t x = 0; x < 7; x++) {
-      if (!IsEmpty(matrix->Get(xStart + x, yStart + y))) {
-        e = BCExceptionInvalidateData;
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-      matrix->Set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]);
-    }
-  }
-}
-void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPatternsAndSeparators(
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  int32_t pdpWidth = 7;
-  EmbedPositionDetectionPattern(0, 0, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedPositionDetectionPattern(matrix->GetWidth() - pdpWidth, 0, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedPositionDetectionPattern(0, matrix->GetWidth() - pdpWidth, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t hspWidth = 8;
-  EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedHorizontalSeparationPattern(matrix->GetWidth() - hspWidth, hspWidth - 1,
-                                   matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedHorizontalSeparationPattern(0, matrix->GetWidth() - hspWidth, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  int32_t vspSize = 7;
-  EmbedVerticalSeparationPattern(vspSize, 0, matrix, e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedVerticalSeparationPattern(matrix->GetHeight() - vspSize - 1, 0, matrix,
-                                 e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-  EmbedVerticalSeparationPattern(vspSize, matrix->GetHeight() - vspSize, matrix,
-                                 e);
-  BC_EXCEPTION_CHECK_ReturnVoid(e);
-}
-void CBC_QRCoderMatrixUtil::MaybeEmbedPositionAdjustmentPatterns(
-    int32_t version,
-    CBC_CommonByteMatrix* matrix,
-    int32_t& e) {
-  if (matrix == NULL) {
-    e = BCExceptionNullPointer;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if (version < 2) {
-    return;
-  }
-  int32_t index = version - 1;
-  int32_t const* coordinates =
-      &(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][0]);
-  int32_t numCoordinate = 7;
-  for (int32_t i = 0; i < numCoordinate; i++) {
-    for (int32_t j = 0; j < numCoordinate; j++) {
-      int32_t y = coordinates[i];
-      int32_t x = coordinates[j];
-      if (x == -1 || y == -1) {
-        continue;
-      }
-      if (IsEmpty(matrix->Get(x, y))) {
-        EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix, e);
-        BC_EXCEPTION_CHECK_ReturnVoid(e);
-      }
-    }
-  }
-}
-int32_t CBC_QRCoderMatrixUtil::FindMSBSet(int32_t value) {
-  int32_t numDigits = 0;
-  while (value != 0) {
-    value >>= 1;
-    ++numDigits;
-  }
-  return numDigits;
-}
-CBC_QRCoderMatrixUtil::CBC_QRCoderMatrixUtil() {}
-CBC_QRCoderMatrixUtil::~CBC_QRCoderMatrixUtil() {}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h
deleted file mode 100644
index 6676b83..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
-
-class CBC_CommonByteMatrix;
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_QRCoderBitVector;
-class CBC_QRCoderMatrixUtil {
- private:
-  static const int32_t POSITION_DETECTION_PATTERN[7][7];
-  static const int32_t VERTICAL_SEPARATION_PATTERN[7][1];
-  static const int32_t HORIZONTAL_SEPARATION_PATTERN[1][8];
-  static const int32_t POSITION_ADJUSTMENT_PATTERN[5][5];
-  static const int32_t POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7];
-  static const int32_t TYPE_INFO_COORDINATES[15][2];
-  static const int32_t VERSION_INFO_POLY;
-  static const int32_t TYPE_INFO_POLY;
-  static const int32_t TYPE_INFO_MASK_PATTERN;
-
- public:
-  CBC_QRCoderMatrixUtil();
-  virtual ~CBC_QRCoderMatrixUtil();
-  static void ClearMatrix(CBC_CommonByteMatrix* matrix, int32_t& e);
-  static void BuildMatrix(CBC_QRCoderBitVector* dataBits,
-                          CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                          int32_t version,
-                          int32_t maskPattern,
-                          CBC_CommonByteMatrix* matrix,
-                          int32_t& e);
-  static void EmbedBasicPatterns(int32_t version,
-                                 CBC_CommonByteMatrix* matrix,
-                                 int32_t& e);
-  static void EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                            int32_t maskPattern,
-                            CBC_CommonByteMatrix* matrix,
-                            int32_t& e);
-  static void EmbedDataBits(CBC_QRCoderBitVector* dataBits,
-                            int32_t maskPattern,
-                            CBC_CommonByteMatrix* matrix,
-                            int32_t& e);
-  static void MaybeEmbedVersionInfo(int32_t version,
-                                    CBC_CommonByteMatrix* matrix,
-                                    int32_t& e);
-  static int32_t FindMSBSet(int32_t value);
-  static int32_t CalculateBCHCode(int32_t code, int32_t poly);
-  static void MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                               int32_t maskPattern,
-                               CBC_QRCoderBitVector* bits,
-                               int32_t& e);
-  static void MakeVersionInfoBits(int32_t version,
-                                  CBC_QRCoderBitVector* bits,
-                                  int32_t& e);
-  static FX_BOOL IsEmpty(int32_t value);
-  static FX_BOOL IsValidValue(int32_t value);
-  static void EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, int32_t& e);
-  static void EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix,
-                                             int32_t& e);
-  static void EmbedHorizontalSeparationPattern(int32_t xStart,
-                                               int32_t yStart,
-                                               CBC_CommonByteMatrix* matrix,
-                                               int32_t& e);
-  static void EmbedVerticalSeparationPattern(int32_t xStart,
-                                             int32_t yStart,
-                                             CBC_CommonByteMatrix* matrix,
-                                             int32_t& e);
-  static void EmbedPositionAdjustmentPattern(int32_t xStart,
-                                             int32_t yStart,
-                                             CBC_CommonByteMatrix* matrix,
-                                             int32_t& e);
-  static void EmbedPositionDetectionPattern(int32_t xStart,
-                                            int32_t yStart,
-                                            CBC_CommonByteMatrix* matrix,
-                                            int32_t& e);
-  static void EmbedPositionDetectionPatternsAndSeparators(
-      CBC_CommonByteMatrix* matrix,
-      int32_t& e);
-  static void MaybeEmbedPositionAdjustmentPatterns(int32_t version,
-                                                   CBC_CommonByteMatrix* matrix,
-                                                   int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMATRIXUTIL_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp
deleted file mode 100644
index 337d21a..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL;
-CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL;
-
-CBC_QRCoderMode::CBC_QRCoderMode(int32_t* characterCountBitsForVersions,
-                                 int32_t x1,
-                                 int32_t x2,
-                                 int32_t x3,
-                                 int32_t bits,
-                                 CFX_ByteString name) {
-  m_characterCountBitsForVersions = characterCountBitsForVersions;
-  if (m_characterCountBitsForVersions) {
-    m_characterCountBitsForVersions[0] = x1;
-    m_characterCountBitsForVersions[1] = x2;
-    m_characterCountBitsForVersions[2] = x3;
-  }
-  m_name += name;
-  m_bits = bits;
-}
-CBC_QRCoderMode::~CBC_QRCoderMode() {
-  FX_Free(m_characterCountBitsForVersions);
-}
-void CBC_QRCoderMode::Initialize() {
-  sBYTE = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 16, 16, 0x4, "BYTE");
-  sALPHANUMERIC =
-      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 9, 11, 13, 0x2, "ALPHANUMERIC");
-  sECI = new CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI");
-  sKANJI = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x8, "KANJI");
-  sNUMERIC =
-      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 10, 12, 14, 0x1, "NUMERIC");
-  sGBK = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x0D, "GBK");
-  sTERMINATOR =
-      new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x00, "TERMINATOR");
-  sFNC1_FIRST_POSITION =
-      new CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION");
-  sFNC1_SECOND_POSITION =
-      new CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION");
-  sSTRUCTURED_APPEND = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x03,
-                                           "STRUCTURED_APPEND");
-}
-void CBC_QRCoderMode::Finalize() {
-  delete sBYTE;
-  delete sALPHANUMERIC;
-  delete sECI;
-  delete sKANJI;
-  delete sNUMERIC;
-  delete sGBK;
-  delete sTERMINATOR;
-  delete sFNC1_FIRST_POSITION;
-  delete sFNC1_SECOND_POSITION;
-  delete sSTRUCTURED_APPEND;
-}
-CBC_QRCoderMode* CBC_QRCoderMode::ForBits(int32_t bits, int32_t& e) {
-  switch (bits) {
-    case 0x0:
-      return sTERMINATOR;
-    case 0x1:
-      return sNUMERIC;
-    case 0x2:
-      return sALPHANUMERIC;
-    case 0x3:
-      return sSTRUCTURED_APPEND;
-    case 0x4:
-      return sBYTE;
-    case 0x5:
-      return sFNC1_FIRST_POSITION;
-    case 0x7:
-      return sECI;
-    case 0x8:
-      return sKANJI;
-    case 0x9:
-      return sFNC1_SECOND_POSITION;
-    case 0x0D:
-      return sGBK;
-    default: {
-      e = BCExceptionUnsupportedMode;
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-  }
-  return NULL;
-}
-int32_t CBC_QRCoderMode::GetBits() {
-  return m_bits;
-}
-CFX_ByteString CBC_QRCoderMode::GetName() {
-  return m_name;
-}
-int32_t CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version,
-                                               int32_t& e) {
-  if (m_characterCountBitsForVersions == NULL) {
-    e = BCExceptionCharacterNotThisMode;
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  }
-  int32_t number = version->GetVersionNumber();
-  int32_t offset;
-  if (number <= 9) {
-    offset = 0;
-  } else if (number <= 26) {
-    offset = 1;
-  } else {
-    offset = 2;
-  }
-  return m_characterCountBitsForVersions[offset];
-}
-void CBC_QRCoderMode::Destroy() {
-  if (sBYTE) {
-    delete CBC_QRCoderMode::sBYTE;
-    sBYTE = NULL;
-  }
-  if (sNUMERIC) {
-    delete CBC_QRCoderMode::sNUMERIC;
-    sNUMERIC = NULL;
-  }
-  if (sALPHANUMERIC) {
-    delete CBC_QRCoderMode::sALPHANUMERIC;
-    sALPHANUMERIC = NULL;
-  }
-  if (sKANJI) {
-    delete CBC_QRCoderMode::sKANJI;
-    sKANJI = NULL;
-  }
-  if (sECI) {
-    delete CBC_QRCoderMode::sECI;
-    sECI = NULL;
-  }
-  if (sGBK) {
-    delete CBC_QRCoderMode::sGBK;
-    sGBK = NULL;
-  }
-  if (sTERMINATOR) {
-    delete CBC_QRCoderMode::sTERMINATOR;
-    sTERMINATOR = NULL;
-  }
-  if (sFNC1_FIRST_POSITION) {
-    delete CBC_QRCoderMode::sFNC1_FIRST_POSITION;
-    sFNC1_FIRST_POSITION = NULL;
-  }
-  if (sFNC1_SECOND_POSITION) {
-    delete CBC_QRCoderMode::sFNC1_SECOND_POSITION;
-    sFNC1_SECOND_POSITION = NULL;
-  }
-  if (sSTRUCTURED_APPEND) {
-    delete CBC_QRCoderMode::sSTRUCTURED_APPEND;
-    sSTRUCTURED_APPEND = NULL;
-  }
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h
deleted file mode 100644
index 9098b35..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
-
-#include <stdint.h>
-
-#include "core/include/fxcrt/fx_string.h"
-
-class CBC_QRCoderVersion;
-
-class CBC_QRCoderMode {
- private:
-  int32_t* m_characterCountBitsForVersions;
-  int32_t m_bits;
-  CFX_ByteString m_name;
-  CBC_QRCoderMode(int32_t* characterCountBitsForVersions,
-                  int32_t x1,
-                  int32_t x2,
-                  int32_t x3,
-                  int32_t bits,
-                  CFX_ByteString name);
-  CBC_QRCoderMode();
-
- public:
-  static CBC_QRCoderMode* sBYTE;
-  static CBC_QRCoderMode* sNUMERIC;
-  static CBC_QRCoderMode* sALPHANUMERIC;
-  static CBC_QRCoderMode* sKANJI;
-  static CBC_QRCoderMode* sECI;
-  static CBC_QRCoderMode* sGBK;
-  static CBC_QRCoderMode* sTERMINATOR;
-  static CBC_QRCoderMode* sFNC1_FIRST_POSITION;
-  static CBC_QRCoderMode* sFNC1_SECOND_POSITION;
-  static CBC_QRCoderMode* sSTRUCTURED_APPEND;
-  virtual ~CBC_QRCoderMode();
-
-  static void Initialize();
-  static void Finalize();
-  static CBC_QRCoderMode* ForBits(int32_t bits, int32_t& e);
-  int32_t GetCharacterCountBits(CBC_QRCoderVersion* version, int32_t& e);
-  int32_t GetBits();
-  CFX_ByteString GetName();
-  static void Destroy();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERMODE_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp
deleted file mode 100644
index 86e08c9..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp
+++ /dev/null
@@ -1,769 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_QRCoderVersion::VERSION_DECODE_INFO[] = {
-    0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847,
-    0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6,
-    0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E,
-    0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA,
-    0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69};
-CFX_PtrArray* CBC_QRCoderVersion::VERSION = NULL;
-
-void CBC_QRCoderVersion::Initialize() {
-  VERSION = new CFX_PtrArray();
-}
-void CBC_QRCoderVersion::Finalize() {
-  for (int32_t i = 0; i < VERSION->GetSize(); i++) {
-    CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i));
-    delete v;
-  }
-  delete VERSION;
-}
-CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber,
-                                       CBC_QRCoderECBlocks* ecBlocks1,
-                                       CBC_QRCoderECBlocks* ecBlocks2,
-                                       CBC_QRCoderECBlocks* ecBlocks3,
-                                       CBC_QRCoderECBlocks* ecBlocks4) {
-  m_versionNumber = versionNumber;
-  m_ecBlocks.Add(ecBlocks1);
-  m_ecBlocks.Add(ecBlocks2);
-  m_ecBlocks.Add(ecBlocks3);
-  m_ecBlocks.Add(ecBlocks4);
-  int32_t total = 0;
-  int32_t ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock();
-  CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks();
-  for (int32_t i = 0; i < ecbArray->GetSize(); i++) {
-    CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]);
-    total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords);
-  }
-  m_totalCodeWords = total;
-  switch (versionNumber) {
-    case 1:
-      break;
-    case 2:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(18);
-      break;
-    case 3:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(22);
-      break;
-    case 4:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      break;
-    case 5:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      break;
-    case 6:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      break;
-    case 7:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(22);
-      m_alignmentPatternCenters.Add(38);
-      break;
-    case 8:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(24);
-      m_alignmentPatternCenters.Add(42);
-      break;
-    case 9:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(46);
-      break;
-    case 10:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(28);
-      m_alignmentPatternCenters.Add(50);
-      break;
-    case 11:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(54);
-      break;
-    case 12:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(32);
-      m_alignmentPatternCenters.Add(58);
-      break;
-    case 13:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      m_alignmentPatternCenters.Add(62);
-      break;
-    case 14:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(46);
-      m_alignmentPatternCenters.Add(66);
-      break;
-    case 15:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(48);
-      m_alignmentPatternCenters.Add(70);
-      break;
-    case 16:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(50);
-      m_alignmentPatternCenters.Add(74);
-      break;
-    case 17:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(78);
-      break;
-    case 18:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(56);
-      m_alignmentPatternCenters.Add(82);
-      break;
-    case 19:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(86);
-      break;
-    case 20:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      m_alignmentPatternCenters.Add(62);
-      m_alignmentPatternCenters.Add(90);
-      break;
-    case 21:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(28);
-      m_alignmentPatternCenters.Add(50);
-      m_alignmentPatternCenters.Add(72);
-      m_alignmentPatternCenters.Add(94);
-      break;
-    case 22:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(50);
-      m_alignmentPatternCenters.Add(74);
-      m_alignmentPatternCenters.Add(98);
-      break;
-    case 23:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(74);
-      m_alignmentPatternCenters.Add(102);
-      break;
-    case 24:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(28);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(80);
-      m_alignmentPatternCenters.Add(106);
-      break;
-    case 25:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(32);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(84);
-      m_alignmentPatternCenters.Add(110);
-      break;
-    case 26:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(86);
-      m_alignmentPatternCenters.Add(114);
-      break;
-    case 27:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      m_alignmentPatternCenters.Add(62);
-      m_alignmentPatternCenters.Add(90);
-      m_alignmentPatternCenters.Add(118);
-      break;
-    case 28:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(50);
-      m_alignmentPatternCenters.Add(74);
-      m_alignmentPatternCenters.Add(98);
-      m_alignmentPatternCenters.Add(122);
-      break;
-    case 29:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(78);
-      m_alignmentPatternCenters.Add(102);
-      m_alignmentPatternCenters.Add(126);
-      break;
-    case 30:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(52);
-      m_alignmentPatternCenters.Add(78);
-      m_alignmentPatternCenters.Add(104);
-      m_alignmentPatternCenters.Add(130);
-      break;
-    case 31:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(56);
-      m_alignmentPatternCenters.Add(82);
-      m_alignmentPatternCenters.Add(108);
-      m_alignmentPatternCenters.Add(134);
-      break;
-    case 32:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      m_alignmentPatternCenters.Add(60);
-      m_alignmentPatternCenters.Add(86);
-      m_alignmentPatternCenters.Add(112);
-      m_alignmentPatternCenters.Add(138);
-      break;
-    case 33:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(86);
-      m_alignmentPatternCenters.Add(114);
-      m_alignmentPatternCenters.Add(142);
-      break;
-    case 34:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(34);
-      m_alignmentPatternCenters.Add(62);
-      m_alignmentPatternCenters.Add(90);
-      m_alignmentPatternCenters.Add(118);
-      m_alignmentPatternCenters.Add(146);
-      break;
-    case 35:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(78);
-      m_alignmentPatternCenters.Add(102);
-      m_alignmentPatternCenters.Add(126);
-      m_alignmentPatternCenters.Add(150);
-      break;
-    case 36:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(24);
-      m_alignmentPatternCenters.Add(50);
-      m_alignmentPatternCenters.Add(76);
-      m_alignmentPatternCenters.Add(102);
-      m_alignmentPatternCenters.Add(128);
-      m_alignmentPatternCenters.Add(154);
-      break;
-    case 37:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(28);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(80);
-      m_alignmentPatternCenters.Add(106);
-      m_alignmentPatternCenters.Add(132);
-      m_alignmentPatternCenters.Add(158);
-      break;
-    case 38:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(32);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(84);
-      m_alignmentPatternCenters.Add(110);
-      m_alignmentPatternCenters.Add(136);
-      m_alignmentPatternCenters.Add(162);
-      break;
-    case 39:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(26);
-      m_alignmentPatternCenters.Add(54);
-      m_alignmentPatternCenters.Add(82);
-      m_alignmentPatternCenters.Add(110);
-      m_alignmentPatternCenters.Add(138);
-      m_alignmentPatternCenters.Add(166);
-      break;
-    case 40:
-      m_alignmentPatternCenters.Add(6);
-      m_alignmentPatternCenters.Add(30);
-      m_alignmentPatternCenters.Add(58);
-      m_alignmentPatternCenters.Add(86);
-      m_alignmentPatternCenters.Add(114);
-      m_alignmentPatternCenters.Add(142);
-      m_alignmentPatternCenters.Add(170);
-      break;
-  }
-}
-CBC_QRCoderVersion::~CBC_QRCoderVersion() {
-  if (m_ecBlocks.GetSize() != 0) {
-    int32_t itBeg = 0;
-    int32_t itEnd = m_ecBlocks.GetSize();
-    while (itBeg != itEnd) {
-      delete ((CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg]));
-      itBeg++;
-    }
-  }
-}
-int32_t CBC_QRCoderVersion::GetVersionNumber() {
-  return m_versionNumber;
-}
-CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
-  return &m_alignmentPatternCenters;
-}
-int32_t CBC_QRCoderVersion::GetTotalCodeWords() {
-  return m_totalCodeWords;
-}
-int32_t CBC_QRCoderVersion::GetDimensionForVersion() {
-  return 17 + 4 * m_versionNumber;
-}
-CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(
-    CBC_QRCoderErrorCorrectionLevel* ecLevel) {
-  return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()];
-}
-CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(
-    int32_t dimension,
-    int32_t& e) {
-  if ((dimension % 4) != 1) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return qcv;
-}
-CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(
-    int32_t versionBits,
-    int32_t& e) {
-  int32_t bestDifference = FXSYS_IntMax;
-  int32_t bestVersion = 0;
-  for (int32_t i = 0; i < 34; i++) {
-    int32_t targetVersion = VERSION_DECODE_INFO[i];
-    if (targetVersion == versionBits) {
-      CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      return qcv;
-    }
-    int32_t bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(
-        versionBits, targetVersion);
-    if (bitsDifference < bestDifference) {
-      bestVersion = i + 7;
-      bestDifference = bitsDifference;
-    }
-  }
-  if (bestDifference <= 3) {
-    CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    return qcv;
-  }
-  return NULL;
-}
-CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(int32_t& e) {
-  int32_t dimension = GetDimensionForVersion();
-  CBC_CommonBitMatrix* bitMatrix = new CBC_CommonBitMatrix();
-  bitMatrix->Init(dimension);
-  bitMatrix->SetRegion(0, 0, 9, 9, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  bitMatrix->SetRegion(0, dimension - 8, 9, 8, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t max = m_alignmentPatternCenters.GetSize();
-  for (int32_t x = 0; x < max; x++) {
-    int32_t i = m_alignmentPatternCenters[x] - 2;
-    for (int32_t y = 0; y < max; y++) {
-      if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) {
-        continue;
-      }
-      bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    }
-  }
-  bitMatrix->SetRegion(6, 9, 1, dimension - 17, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  bitMatrix->SetRegion(9, 6, dimension - 17, 1, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  if (m_versionNumber > 6) {
-    bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    bitMatrix->SetRegion(0, dimension - 11, 6, 3, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return bitMatrix;
-}
-CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(
-    int32_t versionNumber,
-    int32_t& e) {
-  if (VERSION->GetSize() == 0) {
-    VERSION->Add(new CBC_QRCoderVersion(
-        1, new CBC_QRCoderECBlocks(7, new CBC_QRCoderECB(1, 19)),
-        new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 16)),
-        new CBC_QRCoderECBlocks(13, new CBC_QRCoderECB(1, 13)),
-        new CBC_QRCoderECBlocks(17, new CBC_QRCoderECB(1, 9))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        2, new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 34)),
-        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(1, 28)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(1, 22)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        3, new CBC_QRCoderECBlocks(15, new CBC_QRCoderECB(1, 55)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 44)),
-        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 17)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        4, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(1, 80)),
-        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 32)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(2, 24)),
-        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 9))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        5, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 108)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 43)),
-        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 15),
-                                new CBC_QRCoderECB(2, 16)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 11),
-                                new CBC_QRCoderECB(2, 12))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        6, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68)),
-        new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 27)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 19)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 15))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        7, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(2, 78)),
-        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(4, 31)),
-        new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 14),
-                                new CBC_QRCoderECB(4, 15)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 13),
-                                new CBC_QRCoderECB(1, 14))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        8, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 97)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 38),
-                                new CBC_QRCoderECB(2, 39)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(4, 18),
-                                new CBC_QRCoderECB(2, 19)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 14),
-                                new CBC_QRCoderECB(2, 15))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        9, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 116)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(3, 36),
-                                new CBC_QRCoderECB(2, 37)),
-        new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 16),
-                                new CBC_QRCoderECB(4, 17)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 12),
-                                new CBC_QRCoderECB(4, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        10, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68),
-                                    new CBC_QRCoderECB(2, 69)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 43),
-                                new CBC_QRCoderECB(1, 44)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(6, 19),
-                                new CBC_QRCoderECB(2, 20)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 15),
-                                new CBC_QRCoderECB(2, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        11, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 81)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 50),
-                                new CBC_QRCoderECB(4, 51)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 22),
-                                new CBC_QRCoderECB(4, 23)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(3, 12),
-                                new CBC_QRCoderECB(8, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        12, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 92),
-                                    new CBC_QRCoderECB(2, 93)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(6, 36),
-                                new CBC_QRCoderECB(2, 37)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 20),
-                                new CBC_QRCoderECB(6, 21)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 14),
-                                new CBC_QRCoderECB(4, 15))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        13, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 107)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(8, 37),
-                                new CBC_QRCoderECB(1, 38)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(8, 20),
-                                new CBC_QRCoderECB(4, 21)),
-        new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(12, 11),
-                                new CBC_QRCoderECB(4, 12))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        14, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 115),
-                                    new CBC_QRCoderECB(1, 116)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 40),
-                                new CBC_QRCoderECB(5, 41)),
-        new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(11, 16),
-                                new CBC_QRCoderECB(5, 17)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
-                                new CBC_QRCoderECB(5, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        15, new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(5, 87),
-                                    new CBC_QRCoderECB(1, 88)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 41),
-                                new CBC_QRCoderECB(5, 42)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 24),
-                                new CBC_QRCoderECB(7, 25)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
-                                new CBC_QRCoderECB(7, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        16, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 98),
-                                    new CBC_QRCoderECB(1, 99)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 45),
-                                new CBC_QRCoderECB(3, 46)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(15, 19),
-                                new CBC_QRCoderECB(2, 20)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 15),
-                                new CBC_QRCoderECB(13, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        17, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 107),
-                                    new CBC_QRCoderECB(5, 108)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
-                                new CBC_QRCoderECB(1, 47)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 22),
-                                new CBC_QRCoderECB(15, 23)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
-                                new CBC_QRCoderECB(17, 15))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        18, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 120),
-                                    new CBC_QRCoderECB(1, 121)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 43),
-                                new CBC_QRCoderECB(4, 44)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
-                                new CBC_QRCoderECB(1, 23)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
-                                new CBC_QRCoderECB(19, 15))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        19, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 113),
-                                    new CBC_QRCoderECB(4, 114)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 44),
-                                new CBC_QRCoderECB(11, 45)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 21),
-                                new CBC_QRCoderECB(4, 22)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 13),
-                                new CBC_QRCoderECB(16, 14))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        20, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 107),
-                                    new CBC_QRCoderECB(5, 108)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 41),
-                                new CBC_QRCoderECB(13, 42)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
-                                new CBC_QRCoderECB(5, 25)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(15, 15),
-                                new CBC_QRCoderECB(10, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        21, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 116),
-                                    new CBC_QRCoderECB(4, 117)),
-        new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 42)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
-                                new CBC_QRCoderECB(6, 23)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 16),
-                                new CBC_QRCoderECB(6, 17))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        22, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 111),
-                                    new CBC_QRCoderECB(7, 112)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 46)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
-                                new CBC_QRCoderECB(16, 25)),
-        new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(34, 13))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        23, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 121),
-                                    new CBC_QRCoderECB(5, 122)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 47),
-                                new CBC_QRCoderECB(14, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
-                                new CBC_QRCoderECB(14, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(16, 15),
-                                new CBC_QRCoderECB(14, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        24, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 117),
-                                    new CBC_QRCoderECB(4, 118)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 45),
-                                new CBC_QRCoderECB(14, 46)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
-                                new CBC_QRCoderECB(16, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(30, 16),
-                                new CBC_QRCoderECB(2, 17))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        25, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(8, 106),
-                                    new CBC_QRCoderECB(4, 107)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(8, 47),
-                                new CBC_QRCoderECB(13, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
-                                new CBC_QRCoderECB(22, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
-                                new CBC_QRCoderECB(13, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        26, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 114),
-                                    new CBC_QRCoderECB(2, 115)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 46),
-                                new CBC_QRCoderECB(4, 47)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(28, 22),
-                                new CBC_QRCoderECB(6, 23)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(33, 16),
-                                new CBC_QRCoderECB(4, 17))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        27, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 122),
-                                    new CBC_QRCoderECB(4, 123)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(22, 45),
-                                new CBC_QRCoderECB(3, 46)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 23),
-                                new CBC_QRCoderECB(26, 24)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 15),
-                                new CBC_QRCoderECB(28, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        28, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 117),
-                                    new CBC_QRCoderECB(10, 118)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 45),
-                                new CBC_QRCoderECB(23, 46)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 24),
-                                new CBC_QRCoderECB(31, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
-                                new CBC_QRCoderECB(31, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        29, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 116),
-                                    new CBC_QRCoderECB(7, 117)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(21, 45),
-                                new CBC_QRCoderECB(7, 46)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 23),
-                                new CBC_QRCoderECB(37, 24)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
-                                new CBC_QRCoderECB(26, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        30, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 115),
-                                    new CBC_QRCoderECB(10, 116)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 47),
-                                new CBC_QRCoderECB(10, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
-                                new CBC_QRCoderECB(25, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
-                                new CBC_QRCoderECB(25, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        31, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
-                                    new CBC_QRCoderECB(3, 116)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 46),
-                                new CBC_QRCoderECB(29, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 24),
-                                new CBC_QRCoderECB(1, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
-                                new CBC_QRCoderECB(28, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        32, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
-                                new CBC_QRCoderECB(23, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 24),
-                                new CBC_QRCoderECB(35, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
-                                new CBC_QRCoderECB(35, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        33, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115),
-                                    new CBC_QRCoderECB(1, 116)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
-                                new CBC_QRCoderECB(21, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(29, 24),
-                                new CBC_QRCoderECB(19, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
-                                new CBC_QRCoderECB(46, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        34, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
-                                    new CBC_QRCoderECB(6, 116)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
-                                new CBC_QRCoderECB(23, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(44, 24),
-                                new CBC_QRCoderECB(7, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(59, 16),
-                                new CBC_QRCoderECB(1, 17))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        35, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 121),
-                                    new CBC_QRCoderECB(7, 122)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(12, 47),
-                                new CBC_QRCoderECB(26, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(39, 24),
-                                new CBC_QRCoderECB(14, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
-                                new CBC_QRCoderECB(41, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        36, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 121),
-                                    new CBC_QRCoderECB(14, 122)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 47),
-                                new CBC_QRCoderECB(34, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(46, 24),
-                                new CBC_QRCoderECB(10, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 15),
-                                new CBC_QRCoderECB(64, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        37, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 122),
-                                    new CBC_QRCoderECB(4, 123)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(29, 46),
-                                new CBC_QRCoderECB(14, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(49, 24),
-                                new CBC_QRCoderECB(10, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(24, 15),
-                                new CBC_QRCoderECB(46, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        38, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 122),
-                                    new CBC_QRCoderECB(18, 123)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(13, 46),
-                                new CBC_QRCoderECB(32, 47)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(48, 24),
-                                new CBC_QRCoderECB(14, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 15),
-                                new CBC_QRCoderECB(32, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        39, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 117),
-                                    new CBC_QRCoderECB(4, 118)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(40, 47),
-                                new CBC_QRCoderECB(7, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(43, 24),
-                                new CBC_QRCoderECB(22, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 15),
-                                new CBC_QRCoderECB(67, 16))));
-    VERSION->Add(new CBC_QRCoderVersion(
-        40, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 118),
-                                    new CBC_QRCoderECB(6, 119)),
-        new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(18, 47),
-                                new CBC_QRCoderECB(31, 48)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(34, 24),
-                                new CBC_QRCoderECB(34, 25)),
-        new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 15),
-                                new CBC_QRCoderECB(61, 16))));
-  }
-  if (versionNumber < 1 || versionNumber > 40) {
-    e = BCExceptionIllegalArgument;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1];
-}
-void CBC_QRCoderVersion::Destroy() {
-  int32_t i;
-  for (i = 0; i < VERSION->GetSize(); i++) {
-    delete ((CBC_QRCoderVersion*)(*VERSION)[i]);
-  }
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h
deleted file mode 100644
index ceb6f91..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_QRCoderECBlocks;
-class CBC_CommonBitMatrix;
-class CBC_QRCoderErrorCorrectionLevel;
-
-class CBC_QRCoderVersion {
- private:
-  static const int32_t VERSION_DECODE_INFO[34];
-  static CFX_PtrArray* VERSION;
-  int32_t m_versionNumber;
-  int32_t m_totalCodeWords;
-  CFX_Int32Array m_alignmentPatternCenters;
-  CFX_PtrArray m_ecBlocks;
-
-  CBC_QRCoderVersion();
-  CBC_QRCoderVersion(int32_t versionNumber,
-                     CBC_QRCoderECBlocks* ecBlocks1,
-                     CBC_QRCoderECBlocks* ecBlocks2,
-                     CBC_QRCoderECBlocks* ecBlocks3,
-                     CBC_QRCoderECBlocks* ecBlocks4);
-
- public:
-  virtual ~CBC_QRCoderVersion();
-  static void Initialize();
-  static void Finalize();
-
-  int32_t GetVersionNumber();
-  int32_t GetTotalCodeWords();
-  int32_t GetDimensionForVersion();
-  CBC_CommonBitMatrix* BuildFunctionPattern(int32_t& e);
-  CFX_Int32Array* GetAlignmentPatternCenters();
-  CBC_QRCoderECBlocks* GetECBlocksForLevel(
-      CBC_QRCoderErrorCorrectionLevel* ecLevel);
-  static CBC_QRCoderVersion* GetVersionForNumber(int32_t versionNumber,
-                                                 int32_t& e);
-  static CBC_QRCoderVersion* GetProvisionalVersionForDimension(
-      int32_t dimension,
-      int32_t& e);
-  static CBC_QRCoderVersion* DecodeVersionInformation(int32_t versionBits,
-                                                      int32_t& e);
-  static void Destroy();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp
deleted file mode 100644
index 185e16c..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRDataBlock::CBC_QRDataBlock(int32_t numDataCodewords,
-                                 CFX_ByteArray* codewords)
-    : m_numDataCodewords(numDataCodewords), m_codewords(codewords) {}
-CBC_QRDataBlock::~CBC_QRDataBlock() {
-  delete m_codewords;
-}
-int32_t CBC_QRDataBlock::GetNumDataCodewords() {
-  return m_numDataCodewords;
-}
-CFX_ByteArray* CBC_QRDataBlock::GetCodewords() {
-  return m_codewords;
-}
-CFX_PtrArray* CBC_QRDataBlock::GetDataBlocks(
-    CFX_ByteArray* rawCodewords,
-    CBC_QRCoderVersion* version,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t& e) {
-  if (rawCodewords->GetSize() != version->GetTotalCodeWords()) {
-    e = BCExceptionIllegalArgument;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel);
-  int32_t totalBlocks = 0;
-  CFX_PtrArray* ecBlockArray = ecBlocks->GetECBlocks();
-  int32_t i = 0;
-  for (i = 0; i < ecBlockArray->GetSize(); i++) {
-    totalBlocks += ((CBC_QRCoderECB*)(*ecBlockArray)[i])->GetCount();
-  }
-  std::unique_ptr<CFX_PtrArray> result(new CFX_PtrArray());
-  result->SetSize(totalBlocks);
-  int32_t numResultBlocks = 0;
-  for (int32_t j = 0; j < ecBlockArray->GetSize(); j++) {
-    CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)(*ecBlockArray)[j];
-    for (int32_t k = 0; k < ecBlock->GetCount(); k++) {
-      int32_t numDataCodewords = ecBlock->GetDataCodeWords();
-      int32_t numBlockCodewords =
-          ecBlocks->GetECCodeWordsPerBlock() + numDataCodewords;
-      CFX_ByteArray* bytearray = new CFX_ByteArray();
-      bytearray->SetSize(numBlockCodewords);
-      (*result)[numResultBlocks++] =
-          new CBC_QRDataBlock(numDataCodewords, bytearray);
-    }
-  }
-  int32_t shorterBlocksTotalCodewords =
-      ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize();
-  int32_t longerBlocksStartAt = result->GetSize() - 1;
-  while (longerBlocksStartAt >= 0) {
-    int32_t numCodewords = ((CBC_QRDataBlock*)(*result)[longerBlocksStartAt])
-                               ->m_codewords->GetSize();
-    if (numCodewords == shorterBlocksTotalCodewords) {
-      break;
-    }
-    longerBlocksStartAt--;
-  }
-  longerBlocksStartAt++;
-  int32_t shorterBlocksNumDataCodewords =
-      shorterBlocksTotalCodewords - ecBlocks->GetECCodeWordsPerBlock();
-  int32_t rawCodewordsOffset = 0;
-  int32_t x = 0;
-  for (int32_t k = 0; k < shorterBlocksNumDataCodewords; k++) {
-    for (x = 0; x < numResultBlocks; x++) {
-      (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[k] =
-          (*rawCodewords)[rawCodewordsOffset++];
-    }
-  }
-  for (x = longerBlocksStartAt; x < numResultBlocks; x++) {
-    (*(((CBC_QRDataBlock*)(*result)[x])
-           ->m_codewords))[shorterBlocksNumDataCodewords] =
-        (*rawCodewords)[rawCodewordsOffset++];
-  }
-  int32_t max = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize();
-  for (i = shorterBlocksNumDataCodewords; i < max; i++) {
-    for (int32_t y = 0; y < numResultBlocks; y++) {
-      int32_t iOffset = y < longerBlocksStartAt ? i : i + 1;
-      (*(((CBC_QRDataBlock*)(*result)[y])->m_codewords))[iOffset] =
-          (*rawCodewords)[rawCodewordsOffset++];
-    }
-  }
-  return result.release();
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h
deleted file mode 100644
index de53ca4..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_QRCoderVersion;
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_QRDataBlock {
- private:
-  int32_t m_numDataCodewords;
-  CFX_ByteArray* m_codewords;
-  CBC_QRDataBlock(int32_t numDataCodewords, CFX_ByteArray* codewords);
-
- public:
-  virtual ~CBC_QRDataBlock();
-  int32_t GetNumDataCodewords();
-  CFX_ByteArray* GetCodewords();
-  static CFX_PtrArray* GetDataBlocks(CFX_ByteArray* rawCodewords,
-                                     CBC_QRCoderVersion* version,
-                                     CBC_QRCoderErrorCorrectionLevel* ecLevel,
-                                     int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRDATABLOCK_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp
deleted file mode 100644
index a5a8a3a..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDataMask.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-static int32_t N_DATA_MASKS = 0;
-CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL;
-
-void CBC_QRDataMask::Initialize() {
-  DATA_MASKS = new CFX_PtrArray();
-  N_DATA_MASKS = BuildDataMasks();
-}
-void CBC_QRDataMask::Finalize() {
-  Destroy();
-  delete DATA_MASKS;
-}
-void CBC_QRDataMask::Destroy() {
-  int32_t i;
-  for (i = 0; i < N_DATA_MASKS; i++) {
-    CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i];
-    if (p) {
-      delete p;
-    }
-  }
-}
-void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix* bits,
-                                     int32_t dimension) {
-  for (int32_t i = 0; i < dimension; i++) {
-    for (int32_t j = 0; j < dimension; j++) {
-      if (IsMasked(i, j)) {
-        bits->Flip(j, i);
-      }
-    }
-  }
-}
-CBC_QRDataMask* CBC_QRDataMask::ForReference(int32_t reference, int32_t& e) {
-  if (reference < 0 || reference > 7) {
-    e = BCExceptionReferenceMustBeBetween0And7;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  return (CBC_QRDataMask*)(*DATA_MASKS)[reference];
-}
-class DataMask000 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) { return ((x + y) % 2) == 0; }
-};
-class DataMask001 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x % 2) == 0; }
-};
-class DataMask010 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) { return y % 3 == 0; }
-};
-class DataMask011 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) { return (x + y) % 3 == 0; }
-};
-class DataMask100 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) {
-    return (((x >> 1) + (y / 3)) % 2) == 0;
-  }
-};
-class DataMask101 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) {
-    size_t temp = x * y;
-    return (temp % 2) + (temp % 3) == 0;
-  }
-};
-class DataMask110 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) {
-    size_t temp = x * y;
-    return (((temp % 2) + (temp % 3)) % 2) == 0;
-  }
-};
-class DataMask111 : public CBC_QRDataMask {
- public:
-  FX_BOOL IsMasked(int32_t x, int32_t y) {
-    return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
-  }
-};
-int32_t CBC_QRDataMask::BuildDataMasks() {
-  DATA_MASKS->Add(new DataMask000);
-  DATA_MASKS->Add(new DataMask001);
-  DATA_MASKS->Add(new DataMask010);
-  DATA_MASKS->Add(new DataMask011);
-  DATA_MASKS->Add(new DataMask100);
-  DATA_MASKS->Add(new DataMask101);
-  DATA_MASKS->Add(new DataMask110);
-  DATA_MASKS->Add(new DataMask111);
-  return DATA_MASKS->GetSize();
-}
-CBC_QRDataMask::CBC_QRDataMask() {}
-CBC_QRDataMask::~CBC_QRDataMask() {}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h
deleted file mode 100644
index cbf8d47..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-
-class CBC_QRDataMask {
- public:
-  static CFX_PtrArray* DATA_MASKS;
-  CBC_QRDataMask();
-  virtual ~CBC_QRDataMask();
-  static void Initialize();
-  static void Finalize();
-  virtual FX_BOOL IsMasked(int32_t i, int32_t j) = 0;
-  void UnmaskBitMatirx(CBC_CommonBitMatrix* bits, int32_t dimension);
-  static CBC_QRDataMask* ForReference(int32_t reference, int32_t& e);
-  static int32_t BuildDataMasks();
-  static void Destroy();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRDATAMASK_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp
deleted file mode 100644
index ed97280..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitSource.h"
-#include "xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h"
-#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/src/fxbarcode/common/BC_CommonECI.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
-
-const FX_CHAR* CBC_QRDecodedBitStreamParser::UTF_8 = "utf8";
-const FX_CHAR CBC_QRDecodedBitStreamParser::ALPHANUMERIC_CHARS[45] = {
-    '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', ' ', '$', '%', '*', '+', '-', '.', '/', ':'};
-
-CBC_QRDecodedBitStreamParser::CBC_QRDecodedBitStreamParser() {}
-CBC_QRDecodedBitStreamParser::~CBC_QRDecodedBitStreamParser() {}
-CBC_CommonDecoderResult* CBC_QRDecodedBitStreamParser::Decode(
-    CFX_ByteArray* bytes,
-    CBC_QRCoderVersion* version,
-    CBC_QRCoderErrorCorrectionLevel* ecLevel,
-    int32_t byteModeDecode,
-    int32_t& e) {
-  CBC_CommonBitSource bits(bytes);
-  CFX_ByteString result;
-  CBC_CommonCharacterSetECI* currentCharacterSetECI = NULL;
-  FX_BOOL fc1Infact = FALSE;
-  CFX_Int32Array byteSegments;
-  CBC_QRCoderMode* mode = NULL;
-  do {
-    if (bits.Available() < 4) {
-      mode = CBC_QRCoderMode::sTERMINATOR;
-    } else {
-      int32_t iTemp1 = bits.ReadBits(4, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      mode = CBC_QRCoderMode::ForBits(iTemp1, e);
-      BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      if (mode == NULL) {
-        e = BCExceptionUnSupportMode;
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      }
-    }
-    if (!(mode == CBC_QRCoderMode::sTERMINATOR)) {
-      if (mode == CBC_QRCoderMode::sFNC1_FIRST_POSITION ||
-          mode == CBC_QRCoderMode::sFNC1_SECOND_POSITION) {
-        fc1Infact = TRUE;
-      } else if (mode == CBC_QRCoderMode::sSTRUCTURED_APPEND) {
-        bits.ReadBits(16, e);
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-      } else if (mode == CBC_QRCoderMode::sECI) {
-        int32_t value = ParseECIValue(&bits, e);
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        currentCharacterSetECI =
-            CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(value);
-      } else {
-        if (mode == CBC_QRCoderMode::sGBK) {
-          bits.ReadBits(4, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        }
-        int32_t numBits = mode->GetCharacterCountBits(version, e);
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        int32_t count = bits.ReadBits(numBits, e);
-        BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        if (mode == CBC_QRCoderMode::sNUMERIC) {
-          DecodeNumericSegment(&bits, result, count, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        } else if (mode == CBC_QRCoderMode::sALPHANUMERIC) {
-          DecodeAlphanumericSegment(&bits, result, count, fc1Infact, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        } else if (mode == CBC_QRCoderMode::sBYTE) {
-          DecodeByteSegment(&bits, result, count, currentCharacterSetECI,
-                            &byteSegments, byteModeDecode, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        } else if (mode == CBC_QRCoderMode::sGBK) {
-          DecodeGBKSegment(&bits, result, count, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        } else if (mode == CBC_QRCoderMode::sKANJI) {
-          DecodeKanjiSegment(&bits, result, count, e);
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        } else {
-          e = BCExceptionUnSupportMode;
-          BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-        }
-      }
-    }
-  } while (!(mode == CBC_QRCoderMode::sTERMINATOR));
-  CBC_CommonDecoderResult* tempCd = new CBC_CommonDecoderResult();
-  tempCd->Init(*bytes, result, byteSegments, ecLevel, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return tempCd;
-}
-void CBC_QRDecodedBitStreamParser::DecodeGBKSegment(CBC_CommonBitSource* bits,
-                                                    CFX_ByteString& result,
-                                                    int32_t count,
-                                                    int32_t& e) {
-  CFX_ByteString buffer;
-  while (count > 0) {
-    int32_t twoBytes = bits->ReadBits(13, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    int32_t assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060);
-    if (assembledTwoBytes <= 0x0095d) {
-      assembledTwoBytes += 0x0a1a1;
-    } else {
-      assembledTwoBytes += 0x0a6a1;
-    }
-    buffer += (uint8_t)(assembledTwoBytes >> 8);
-    buffer += (uint8_t)assembledTwoBytes;
-    count--;
-  }
-  CBC_UtilCodingConvert::LocaleToUtf8(buffer, result);
-}
-void CBC_QRDecodedBitStreamParser::DecodeKanjiSegment(CBC_CommonBitSource* bits,
-                                                      CFX_ByteString& result,
-                                                      int32_t count,
-                                                      int32_t& e) {
-  CFX_ByteString buffer;
-  while (count > 0) {
-    int32_t twoBytes = bits->ReadBits(13, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    int32_t assembledTwoBytes = ((twoBytes / 0x0c0) << 8) | (twoBytes % 0x0c0);
-    if (assembledTwoBytes <= 0x01f00) {
-      assembledTwoBytes += 0x08140;
-    } else {
-      assembledTwoBytes += 0x0c140;
-    }
-    buffer += (uint8_t)(assembledTwoBytes >> 8);
-    buffer += (uint8_t)assembledTwoBytes;
-    count--;
-  }
-  CBC_UtilCodingConvert::LocaleToUtf8(buffer, result);
-}
-void CBC_QRDecodedBitStreamParser::DecodeByteSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t count,
-    CBC_CommonCharacterSetECI* currentCharacterSetECI,
-    CFX_Int32Array* byteSegments,
-    int32_t byteModeDecode,
-    int32_t& e) {
-  if (count < 0) {
-    e = BCExceptionNotFound;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  if ((count << 3) > bits->Available()) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  uint8_t* readBytes = FX_Alloc(uint8_t, count);
-  FXSYS_memset(readBytes, 0x00, count);
-  for (int32_t i = 0; i < count; i++) {
-    readBytes[i] = (uint8_t)bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-  }
-  CFX_ByteString bs(readBytes, count);
-  result += bs;
-  FX_Free(readBytes);
-}
-void CBC_QRDecodedBitStreamParser::DecodeAlphanumericSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t count,
-    FX_BOOL fac1InEffect,
-    int32_t& e) {
-  int32_t start = result.GetLength();
-  while (count > 1) {
-    int32_t nextTwoCharsBits = bits->ReadBits(11, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    BC_FX_ByteString_Append(result, 1,
-                            ALPHANUMERIC_CHARS[nextTwoCharsBits / 45]);
-    BC_FX_ByteString_Append(result, 1,
-                            ALPHANUMERIC_CHARS[nextTwoCharsBits % 45]);
-    count -= 2;
-  }
-  if (count == 1) {
-    int32_t itemp = bits->ReadBits(6, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[itemp]);
-  }
-  if (fac1InEffect) {
-    for (int32_t i = start; i < result.GetLength(); i++) {
-      if (result[i] == '%') {
-        if ((i < result.GetLength() - 1) && result[i + 1] == '%') {
-          result.Delete(i + 1, 1);
-        } else {
-          result.SetAt(i, (FX_CHAR)0x1d);
-        }
-      }
-    }
-  }
-}
-void CBC_QRDecodedBitStreamParser::DecodeNumericSegment(
-    CBC_CommonBitSource* bits,
-    CFX_ByteString& result,
-    int32_t count,
-    int32_t& e) {
-  while (count >= 3) {
-    int32_t threeDigitsBits = bits->ReadBits(10, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (threeDigitsBits >= 1000) {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    BC_FX_ByteString_Append(result, 1,
-                            ALPHANUMERIC_CHARS[threeDigitsBits / 100]);
-    BC_FX_ByteString_Append(result, 1,
-                            ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]);
-    BC_FX_ByteString_Append(result, 1,
-                            ALPHANUMERIC_CHARS[threeDigitsBits % 10]);
-    count -= 3;
-  }
-  if (count == 2) {
-    int32_t twoDigitBits = bits->ReadBits(7, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (twoDigitBits >= 100) {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits / 10]);
-    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits % 10]);
-  } else if (count == 1) {
-    int32_t digitBits = bits->ReadBits(4, e);
-    BC_EXCEPTION_CHECK_ReturnVoid(e);
-    if (digitBits >= 10) {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[digitBits]);
-  }
-}
-const CFX_ByteString CBC_QRDecodedBitStreamParser::GuessEncoding(
-    CFX_ByteArray* bytes) {
-  return *UTF_8;
-}
-int32_t CBC_QRDecodedBitStreamParser::ParseECIValue(CBC_CommonBitSource* bits,
-                                                    int32_t& e) {
-  int32_t firstByte = bits->ReadBits(8, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  if ((firstByte & 0x80) == 0) {
-    return firstByte & 0x7f;
-  } else if ((firstByte & 0xc0) == 0x80) {
-    int32_t secondByte = bits->ReadBits(8, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    return ((firstByte & 0x3f) << 8) | secondByte;
-  } else if ((firstByte & 0xe0) == 0xc0) {
-    int32_t secondThirdByte = bits->ReadBits(16, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    return ((firstByte & 0x1f) << 16) | secondThirdByte;
-  }
-  e = BCExceptionBadECI;
-  BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-  return 0;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h
deleted file mode 100644
index ca64ab0..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
-
-class CBC_CommonDecoderResult;
-class CBC_QRCoderErrorCorrectionLevel;
-class CBC_CommonBitSource;
-class CBC_QRCoderVersion;
-class CBC_CommonCharacterSetECI;
-class CBC_QRDecodedBitStreamParser {
- private:
-  static const FX_CHAR ALPHANUMERIC_CHARS[45];
-  static const FX_CHAR* UTF_8;
-  CBC_QRDecodedBitStreamParser();
-
- public:
-  virtual ~CBC_QRDecodedBitStreamParser();
-  static CBC_CommonDecoderResult* Decode(
-      CFX_ByteArray* bytes,
-      CBC_QRCoderVersion* version,
-      CBC_QRCoderErrorCorrectionLevel* ecLevel,
-      int32_t byteModeDecode,
-      int32_t& e);
-
-  static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes);
-  static int32_t ParseECIValue(CBC_CommonBitSource* bits, int32_t& e);
-  static void DecodeGBKSegment(CBC_CommonBitSource* bits,
-                               CFX_ByteString& result,
-                               int32_t count,
-                               int32_t& e);
-  static void DecodeKanjiSegment(CBC_CommonBitSource* bits,
-                                 CFX_ByteString& result,
-                                 int32_t count,
-                                 int32_t& e);
-  static void DecodeNumericSegment(CBC_CommonBitSource* bits,
-                                   CFX_ByteString& result,
-                                   int32_t count,
-                                   int32_t& e);
-  static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits,
-                                        CFX_ByteString& result,
-                                        int32_t count,
-                                        FX_BOOL fac1InEffect,
-                                        int32_t& e);
-  static void DecodeByteSegment(
-      CBC_CommonBitSource* bits,
-      CFX_ByteString& result,
-      int32_t count,
-      CBC_CommonCharacterSetECI* currentCharacterSetECI,
-      CFX_Int32Array* byteSegments,
-      int32_t byteModeDecode,
-      int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp
deleted file mode 100644
index 72ce42f..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetector.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h"
-
-CBC_QRDetector::CBC_QRDetector(CBC_CommonBitMatrix* image) : m_image(image) {}
-CBC_QRDetector::~CBC_QRDetector() {}
-CBC_QRDetectorResult* CBC_QRDetector::Detect(int32_t hints, int32_t& e) {
-  CBC_QRFinderPatternFinder finder(m_image);
-  std::unique_ptr<CBC_QRFinderPatternInfo> info(finder.Find(hints, e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRDetectorResult* qdr = ProcessFinderPatternInfo(info.get(), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return qdr;
-}
-CBC_QRDetectorResult* CBC_QRDetector::ProcessFinderPatternInfo(
-    CBC_QRFinderPatternInfo* info,
-    int32_t& e) {
-  std::unique_ptr<CBC_QRFinderPattern> topLeft(info->GetTopLeft());
-  std::unique_ptr<CBC_QRFinderPattern> topRight(info->GetTopRight());
-  std::unique_ptr<CBC_QRFinderPattern> bottomLeft(info->GetBottomLeft());
-  FX_FLOAT moduleSize =
-      CalculateModuleSize(topLeft.get(), topRight.get(), bottomLeft.get());
-  if (moduleSize < 1.0f) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  int32_t dimension = ComputeDimension(topLeft.get(), topRight.get(),
-                                       bottomLeft.get(), moduleSize, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CBC_QRCoderVersion* provisionalVersion =
-      CBC_QRCoderVersion::GetProvisionalVersionForDimension(dimension, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  int32_t modulesBetweenFPCenters =
-      provisionalVersion->GetDimensionForVersion() - 7;
-  CBC_QRAlignmentPattern* alignmentPattern = NULL;
-  if (provisionalVersion->GetAlignmentPatternCenters()->GetSize() > 0) {
-    FX_FLOAT bottomRightX =
-        topRight->GetX() - topLeft->GetX() + bottomLeft->GetX();
-    FX_FLOAT bottomRightY =
-        topRight->GetY() - topLeft->GetY() + bottomLeft->GetY();
-    FX_FLOAT correctionToTopLeft =
-        1.0f - 3.0f / (FX_FLOAT)modulesBetweenFPCenters;
-    FX_FLOAT xtemp = (topLeft->GetX() +
-                      correctionToTopLeft * (bottomRightX - topLeft->GetX()));
-    int32_t estAlignmentX = (int32_t)xtemp;
-    FX_FLOAT ytemp = (topLeft->GetY() +
-                      correctionToTopLeft * (bottomRightY - topLeft->GetY()));
-    int32_t estAlignmentY = (int32_t)ytemp;
-    for (int32_t i = 4; i <= 16; i <<= 1) {
-      CBC_QRAlignmentPattern* temp = FindAlignmentInRegion(
-          moduleSize, estAlignmentX, estAlignmentY, (FX_FLOAT)i, e);
-      alignmentPattern = temp;
-      break;
-    }
-  }
-  CBC_CommonBitMatrix* bits =
-      SampleGrid(m_image, topLeft.get(), topRight.get(), bottomLeft.get(),
-                 (CBC_ResultPoint*)(alignmentPattern), dimension, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* points = new CFX_PtrArray;
-  if (alignmentPattern == NULL) {
-    points->Add(bottomLeft.release());
-    points->Add(topLeft.release());
-    points->Add(topRight.release());
-  } else {
-    points->Add(bottomLeft.release());
-    points->Add(topLeft.release());
-    points->Add(topRight.release());
-    points->Add(alignmentPattern);
-  }
-  return new CBC_QRDetectorResult(bits, points);
-}
-CBC_CommonBitMatrix* CBC_QRDetector::SampleGrid(
-    CBC_CommonBitMatrix* image,
-    CBC_ResultPoint* topLeft,
-    CBC_ResultPoint* topRight,
-    CBC_ResultPoint* bottomLeft,
-    CBC_ResultPoint* alignmentPattern,
-    int32_t dimension,
-    int32_t& e) {
-  FX_FLOAT dimMinusThree = (FX_FLOAT)dimension - 3.5f;
-  FX_FLOAT bottomRightX;
-  FX_FLOAT bottomRightY;
-  FX_FLOAT sourceBottomRightX;
-  FX_FLOAT sourceBottomRightY;
-  if (alignmentPattern) {
-    bottomRightX = alignmentPattern->GetX();
-    bottomRightY = alignmentPattern->GetY();
-    sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f;
-  } else {
-    bottomRightX = (topRight->GetX() - topLeft->GetX()) + bottomLeft->GetX();
-    bottomRightY = (topRight->GetY() - topLeft->GetY()) + bottomLeft->GetY();
-    sourceBottomRightX = sourceBottomRightY = dimMinusThree;
-  }
-  CBC_QRGridSampler& sampler = CBC_QRGridSampler::GetInstance();
-  CBC_CommonBitMatrix* cbm = sampler.SampleGrid(
-      image, dimension, dimension, 3.5f, 3.5f, dimMinusThree, 3.5f,
-      sourceBottomRightX, sourceBottomRightY, 3.5f, dimMinusThree,
-      topLeft->GetX(), topLeft->GetY(), topRight->GetX(), topRight->GetY(),
-      bottomRightX, bottomRightY, bottomLeft->GetX(), bottomLeft->GetY(), e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return cbm;
-}
-int32_t CBC_QRDetector::ComputeDimension(CBC_ResultPoint* topLeft,
-                                         CBC_ResultPoint* topRight,
-                                         CBC_ResultPoint* bottomLeft,
-                                         FX_FLOAT moduleSize,
-                                         int32_t& e) {
-  int32_t tltrCentersDimension = Round(
-      CBC_QRFinderPatternFinder::Distance(topLeft, topRight) / moduleSize);
-  int32_t tlblCentersDimension = Round(
-      CBC_QRFinderPatternFinder::Distance(topLeft, bottomLeft) / moduleSize);
-  int32_t dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;
-  switch (dimension & 0x03) {
-    case 0:
-      dimension++;
-      break;
-    case 2:
-      dimension--;
-      break;
-    case 3: {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnValue(e, 0);
-    }
-  }
-  return dimension;
-}
-FX_FLOAT CBC_QRDetector::CalculateModuleSize(CBC_ResultPoint* topLeft,
-                                             CBC_ResultPoint* topRight,
-                                             CBC_ResultPoint* bottomLeft) {
-  return (CalculateModuleSizeOneWay(topLeft, topRight) +
-          CalculateModuleSizeOneWay(topLeft, bottomLeft)) /
-         2.0f;
-}
-FX_FLOAT CBC_QRDetector::CalculateModuleSizeOneWay(
-    CBC_ResultPoint* pattern,
-    CBC_ResultPoint* otherPattern) {
-  FX_FLOAT moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays(
-      (int32_t)pattern->GetX(), (int32_t)pattern->GetY(),
-      (int32_t)otherPattern->GetX(), (int32_t)otherPattern->GetY());
-  FX_FLOAT moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays(
-      (int32_t)otherPattern->GetX(), (int32_t)otherPattern->GetY(),
-      (int32_t)pattern->GetX(), (int32_t)pattern->GetY());
-  if (FXSYS_isnan(moduleSizeEst1)) {
-    return moduleSizeEst2;
-  }
-  if (FXSYS_isnan(moduleSizeEst2)) {
-    return moduleSizeEst1;
-  }
-  return (moduleSizeEst1 + moduleSizeEst2) / 14.0f;
-}
-int32_t CBC_QRDetector::Round(FX_FLOAT d) {
-  return (int32_t)(d + 0.5f);
-}
-FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRunBothWays(int32_t fromX,
-                                                          int32_t fromY,
-                                                          int32_t toX,
-                                                          int32_t toY) {
-  FX_FLOAT result = SizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY);
-  int32_t otherToX = fromX - (toX - fromX);
-  if (otherToX < 0) {
-    otherToX = -1;
-  } else if (otherToX >= m_image->GetWidth()) {
-    otherToX = m_image->GetWidth();
-  }
-  int32_t otherToY = fromY - (toY - fromY);
-  if (otherToY < 0) {
-    otherToY = -1;
-  } else if (otherToY >= m_image->GetHeight()) {
-    otherToY = m_image->GetHeight();
-  }
-  result += SizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY);
-  return result - 1.0f;
-}
-FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRun(int32_t fromX,
-                                                  int32_t fromY,
-                                                  int32_t toX,
-                                                  int32_t toY) {
-  FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX);
-  if (steep) {
-    int32_t temp = fromX;
-    fromX = fromY;
-    fromY = temp;
-    temp = toX;
-    toX = toY;
-    toY = temp;
-  }
-  int32_t dx = FXSYS_abs(toX - fromX);
-  int32_t dy = FXSYS_abs(toY - fromY);
-  int32_t error = -dx >> 1;
-  int32_t ystep = fromY < toY ? 1 : -1;
-  int32_t xstep = fromX < toX ? 1 : -1;
-  int32_t state = 0;
-  for (int32_t x = fromX, y = fromY; x != toX; x += xstep) {
-    int32_t realX = steep ? y : x;
-    int32_t realY = steep ? x : y;
-    if (state == 1) {
-      if (m_image->Get(realX, realY)) {
-        state++;
-      }
-    } else {
-      if (!m_image->Get(realX, realY)) {
-        state++;
-      }
-    }
-    if (state == 3) {
-      int32_t diffX = x - fromX;
-      int32_t diffY = y - fromY;
-      return (FX_FLOAT)sqrt((double)(diffX * diffX + diffY * diffY));
-    }
-    error += dy;
-    if (error > 0) {
-      y += ystep;
-      error -= dx;
-    }
-  }
-  int32_t diffX = toX - fromX;
-  int32_t diffY = toY - fromY;
-  return (FX_FLOAT)sqrt((double)(diffX * diffX + diffY * diffY));
-}
-CBC_QRAlignmentPattern* CBC_QRDetector::FindAlignmentInRegion(
-    FX_FLOAT overallEstModuleSize,
-    int32_t estAlignmentX,
-    int32_t estAlignmentY,
-    FX_FLOAT allowanceFactor,
-    int32_t& e) {
-  int32_t allowance = (int32_t)(allowanceFactor * overallEstModuleSize);
-  int32_t alignmentAreaLeftX = std::max(0, estAlignmentX - allowance);
-  int32_t alignmentAreaRightX =
-      std::min(m_image->GetWidth() - 1, estAlignmentX + allowance);
-  if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  int32_t alignmentAreaTopY = std::max(0, estAlignmentY - allowance);
-  int32_t alignmentAreaBottomY =
-      std::min(m_image->GetHeight() - 1, estAlignmentY + allowance);
-  CBC_QRAlignmentPatternFinder alignmentFinder(
-      m_image, alignmentAreaLeftX, alignmentAreaTopY,
-      alignmentAreaRightX - alignmentAreaLeftX,
-      alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize);
-  CBC_QRAlignmentPattern* qap = alignmentFinder.Find(e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  return qap;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetector.h b/xfa/src/fxbarcode/qrcode/BC_QRDetector.h
deleted file mode 100644
index 67cbeb4..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDetector.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_ResultPoint;
-class CBC_CommonBitMatrix;
-class CBC_QRDetectorResult;
-class CBC_QRFinderPatternInfo;
-class CBC_QRAlignmentPattern;
-
-class CBC_QRDetector {
- private:
-  CBC_CommonBitMatrix* m_image;
-
- public:
-  CBC_QRDetector(CBC_CommonBitMatrix* image);
-  virtual ~CBC_QRDetector();
-
-  CBC_CommonBitMatrix* GetImage();
-  CBC_QRDetectorResult* Detect(int32_t hints, int32_t& e);
-  CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo* info,
-                                                 int32_t& e);
-  FX_FLOAT CalculateModuleSize(CBC_ResultPoint* topLeft,
-                               CBC_ResultPoint* topRight,
-                               CBC_ResultPoint* bottomLeft);
-  FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint* pattern,
-                                     CBC_ResultPoint* otherPattern);
-  FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(int32_t fromX,
-                                            int32_t fromY,
-                                            int32_t toX,
-                                            int32_t toY);
-  FX_FLOAT SizeOfBlackWhiteBlackRun(int32_t fromX,
-                                    int32_t fromY,
-                                    int32_t toX,
-                                    int32_t toY);
-  CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize,
-                                                int32_t estAlignmentX,
-                                                int32_t estAlignmentY,
-                                                FX_FLOAT allowanceFactor,
-                                                int32_t& e);
-  static int32_t Round(FX_FLOAT d);
-  static int32_t ComputeDimension(CBC_ResultPoint* topLeft,
-                                  CBC_ResultPoint* topRight,
-                                  CBC_ResultPoint* bottomLeft,
-                                  FX_FLOAT moduleSize,
-                                  int32_t& e);
-  static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
-                                         CBC_ResultPoint* topLeft,
-                                         CBC_ResultPoint* topRight,
-                                         CBC_ResultPoint* bottomLeft,
-                                         CBC_ResultPoint* alignmentPattern,
-                                         int32_t dimension,
-                                         int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp
deleted file mode 100644
index df83d35..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h"
-
-CBC_QRDetectorResult::CBC_QRDetectorResult(CBC_CommonBitMatrix* bits,
-                                           CFX_PtrArray* points)
-    : m_bits(bits), m_points(points) {}
-CBC_QRDetectorResult::~CBC_QRDetectorResult() {
-  for (int32_t i = 0; i < m_points->GetSize(); i++) {
-    delete (CBC_ResultPoint*)(*m_points)[i];
-  }
-  m_points->RemoveAll();
-  delete m_points;
-  delete m_bits;
-}
-CBC_CommonBitMatrix* CBC_QRDetectorResult::GetBits() {
-  return m_bits;
-}
-CFX_PtrArray* CBC_QRDetectorResult::GetPoints() {
-  return m_points;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h
deleted file mode 100644
index e2397db..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-
-class CBC_QRDetectorResult {
- private:
-  CBC_CommonBitMatrix* m_bits;
-  CFX_PtrArray* m_points;
-
- public:
-  CBC_QRDetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points);
-  virtual ~CBC_QRDetectorResult();
-  CBC_CommonBitMatrix* GetBits();
-  CFX_PtrArray* GetPoints();
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRDETECTORRESULT_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp
deleted file mode 100644
index b4482ca..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h"
-
-CBC_QRFinderPattern::CBC_QRFinderPattern(FX_FLOAT x,
-                                         FX_FLOAT posY,
-                                         FX_FLOAT estimatedModuleSize)
-    : CBC_ResultPoint(x, posY),
-      m_estimatedModuleSize(estimatedModuleSize),
-      m_count(1) {}
-CBC_QRFinderPattern::~CBC_QRFinderPattern() {
-  m_count = 0;
-  m_x = 0.0f;
-  m_y = 0.0f;
-  m_estimatedModuleSize = 0.0f;
-}
-CBC_QRFinderPattern* CBC_QRFinderPattern::Clone() {
-  CBC_QRFinderPattern* temp =
-      new CBC_QRFinderPattern(m_x, m_y, m_estimatedModuleSize);
-  temp->m_count = m_count;
-  return temp;
-}
-FX_FLOAT CBC_QRFinderPattern::GetEstimatedModuleSize() {
-  return m_estimatedModuleSize;
-}
-int32_t CBC_QRFinderPattern::GetCount() {
-  return m_count;
-}
-void CBC_QRFinderPattern::IncrementCount() {
-  m_count++;
-}
-FX_BOOL CBC_QRFinderPattern::AboutEquals(FX_FLOAT moduleSize,
-                                         FX_FLOAT i,
-                                         FX_FLOAT j) {
-  if ((fabs(i - GetY()) <= moduleSize) && (fabs(j - GetX()) <= moduleSize)) {
-    FX_FLOAT moduleSizeDiff = fabs(moduleSize - m_estimatedModuleSize);
-    return (moduleSizeDiff <= 1.0f) ||
-           (moduleSizeDiff / m_estimatedModuleSize <= 1.0f);
-  }
-  return false;
-}
-FX_FLOAT CBC_QRFinderPattern::GetX() {
-  return m_x;
-}
-FX_FLOAT CBC_QRFinderPattern::GetY() {
-  return m_y;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h
deleted file mode 100644
index 3e71034..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
-
-class CBC_ResultPoint;
-class CBC_QRFinderPattern;
-class CBC_QRFinderPattern : public CBC_ResultPoint {
- private:
-  FX_FLOAT m_estimatedModuleSize;
-  int32_t m_count;
-
- public:
-  CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize);
-  virtual ~CBC_QRFinderPattern();
-
-  int32_t GetCount();
-  FX_FLOAT GetX();
-  FX_FLOAT GetY();
-  FX_FLOAT GetEstimatedModuleSize();
-  void IncrementCount();
-  FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j);
-  CBC_QRFinderPattern* Clone();
-};
-typedef CBC_QRFinderPattern FinderPattern;
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERN_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp
deleted file mode 100644
index f5a3c7a..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp
+++ /dev/null
@@ -1,477 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h"
-
-#include <memory>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxbarcode/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h"
-#include "xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-const int32_t CBC_QRFinderPatternFinder::CENTER_QUORUM = 2;
-const int32_t CBC_QRFinderPatternFinder::MIN_SKIP = 3;
-const int32_t CBC_QRFinderPatternFinder::MAX_MODULES = 57;
-const int32_t CBC_QRFinderPatternFinder::INTEGER_MATH_SHIFT = 8;
-
-CBC_QRFinderPatternFinder::CBC_QRFinderPatternFinder(
-    CBC_CommonBitMatrix* image) {
-  m_image = image;
-  m_crossCheckStateCount.SetSize(5);
-  m_hasSkipped = FALSE;
-}
-CBC_QRFinderPatternFinder::~CBC_QRFinderPatternFinder() {
-  for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) {
-    delete (CBC_QRFinderPattern*)m_possibleCenters[i];
-  }
-  m_possibleCenters.RemoveAll();
-}
-class ClosestToAverageComparator {
- private:
-  FX_FLOAT m_averageModuleSize;
-
- public:
-  ClosestToAverageComparator(FX_FLOAT averageModuleSize)
-      : m_averageModuleSize(averageModuleSize) {}
-  int32_t operator()(FinderPattern* a, FinderPattern* b) {
-    FX_FLOAT dA =
-        (FX_FLOAT)fabs(a->GetEstimatedModuleSize() - m_averageModuleSize);
-    FX_FLOAT dB =
-        (FX_FLOAT)fabs(b->GetEstimatedModuleSize() - m_averageModuleSize);
-    return dA < dB ? -1 : dA > dB ? 1 : 0;
-  }
-};
-class CenterComparator {
- public:
-  int32_t operator()(FinderPattern* a, FinderPattern* b) {
-    return b->GetCount() - a->GetCount();
-  }
-};
-CBC_CommonBitMatrix* CBC_QRFinderPatternFinder::GetImage() {
-  return m_image;
-}
-CFX_Int32Array& CBC_QRFinderPatternFinder::GetCrossCheckStateCount() {
-  m_crossCheckStateCount[0] = 0;
-  m_crossCheckStateCount[1] = 0;
-  m_crossCheckStateCount[2] = 0;
-  m_crossCheckStateCount[3] = 0;
-  m_crossCheckStateCount[4] = 0;
-  return m_crossCheckStateCount;
-}
-CFX_PtrArray* CBC_QRFinderPatternFinder::GetPossibleCenters() {
-  return &m_possibleCenters;
-}
-CBC_QRFinderPatternInfo* CBC_QRFinderPatternFinder::Find(int32_t hint,
-                                                         int32_t& e) {
-  int32_t maxI = m_image->GetHeight();
-  int32_t maxJ = m_image->GetWidth();
-  int32_t iSkip = (3 * maxI) / (4 * MAX_MODULES);
-  if (iSkip < MIN_SKIP || 0) {
-    iSkip = MIN_SKIP;
-  }
-  FX_BOOL done = FALSE;
-  CFX_Int32Array stateCount;
-  stateCount.SetSize(5);
-  for (int32_t i = iSkip - 1; i < maxI && !done; i += iSkip) {
-    stateCount[0] = 0;
-    stateCount[1] = 0;
-    stateCount[2] = 0;
-    stateCount[3] = 0;
-    stateCount[4] = 0;
-    int32_t currentState = 0;
-    for (int32_t j = 0; j < maxJ; j++) {
-      if (m_image->Get(j, i)) {
-        if ((currentState & 1) == 1) {
-          currentState++;
-        }
-        stateCount[currentState]++;
-      } else {
-        if ((currentState & 1) == 0) {
-          if (currentState == 4) {
-            if (FoundPatternCross(stateCount)) {
-              FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, j);
-              if (confirmed) {
-                iSkip = 2;
-                if (m_hasSkipped) {
-                  done = HaveMultiplyConfirmedCenters();
-                } else {
-                  int32_t rowSkip = FindRowSkip();
-                  if (rowSkip > stateCount[2]) {
-                    i += rowSkip - stateCount[2] - iSkip;
-                    j = maxJ - 1;
-                  }
-                }
-              } else {
-                do {
-                  j++;
-                } while (j < maxJ && !m_image->Get(j, i));
-                j--;
-              }
-              currentState = 0;
-              stateCount[0] = 0;
-              stateCount[1] = 0;
-              stateCount[2] = 0;
-              stateCount[3] = 0;
-              stateCount[4] = 0;
-            } else {
-              stateCount[0] = stateCount[2];
-              stateCount[1] = stateCount[3];
-              stateCount[2] = stateCount[4];
-              stateCount[3] = 1;
-              stateCount[4] = 0;
-              currentState = 3;
-            }
-          } else {
-            stateCount[++currentState]++;
-          }
-        } else {
-          stateCount[currentState]++;
-        }
-      }
-    }
-    if (FoundPatternCross(stateCount)) {
-      FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, maxJ);
-      if (confirmed) {
-        iSkip = stateCount[0];
-        if (m_hasSkipped) {
-          done = HaveMultiplyConfirmedCenters();
-        }
-      }
-    }
-  }
-  std::unique_ptr<CFX_PtrArray> patternInfo(SelectBestpatterns(e));
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  OrderBestPatterns(patternInfo.get());
-  return new CBC_QRFinderPatternInfo(patternInfo.get());
-}
-void CBC_QRFinderPatternFinder::OrderBestPatterns(CFX_PtrArray* patterns) {
-  FX_FLOAT abDistance = Distance((CBC_ResultPoint*)(*patterns)[0],
-                                 (CBC_ResultPoint*)(*patterns)[1]);
-  FX_FLOAT bcDistance = Distance((CBC_ResultPoint*)(*patterns)[1],
-                                 (CBC_ResultPoint*)(*patterns)[2]);
-  FX_FLOAT acDistance = Distance((CBC_ResultPoint*)(*patterns)[0],
-                                 (CBC_ResultPoint*)(*patterns)[2]);
-  CBC_QRFinderPattern *topLeft, *topRight, *bottomLeft;
-  if (bcDistance >= abDistance && bcDistance >= acDistance) {
-    topLeft = (CBC_QRFinderPattern*)(*patterns)[0];
-    topRight = (CBC_QRFinderPattern*)(*patterns)[1];
-    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[2];
-  } else if (acDistance >= bcDistance && acDistance >= abDistance) {
-    topLeft = (CBC_QRFinderPattern*)(*patterns)[1];
-    topRight = (CBC_QRFinderPattern*)(*patterns)[0];
-    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[2];
-  } else {
-    topLeft = (CBC_QRFinderPattern*)(*patterns)[2];
-    topRight = (CBC_QRFinderPattern*)(*patterns)[0];
-    bottomLeft = (CBC_QRFinderPattern*)(*patterns)[1];
-  }
-  if ((bottomLeft->GetY() - topLeft->GetY()) *
-          (topRight->GetX() - topLeft->GetX()) <
-      (bottomLeft->GetX() - topLeft->GetX()) *
-          (topRight->GetY() - topLeft->GetY())) {
-    CBC_QRFinderPattern* temp = topRight;
-    topRight = bottomLeft;
-    bottomLeft = temp;
-  }
-  (*patterns)[0] = bottomLeft;
-  (*patterns)[1] = topLeft;
-  (*patterns)[2] = topRight;
-}
-FX_FLOAT CBC_QRFinderPatternFinder::Distance(CBC_ResultPoint* point1,
-                                             CBC_ResultPoint* point2) {
-  FX_FLOAT dx = point1->GetX() - point2->GetX();
-  FX_FLOAT dy = point1->GetY() - point2->GetY();
-  return (FX_FLOAT)FXSYS_sqrt(dx * dx + dy * dy);
-}
-FX_FLOAT CBC_QRFinderPatternFinder::CenterFromEnd(
-    const CFX_Int32Array& stateCount,
-    int32_t end) {
-  return (FX_FLOAT)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f;
-}
-FX_BOOL CBC_QRFinderPatternFinder::FoundPatternCross(
-    const CFX_Int32Array& stateCount) {
-  int32_t totalModuleSize = 0;
-  for (int32_t i = 0; i < 5; i++) {
-    int32_t count = stateCount[i];
-    if (count == 0) {
-      return FALSE;
-    }
-    totalModuleSize += count;
-  }
-  if (totalModuleSize < 7) {
-    return FALSE;
-  }
-  int32_t moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7;
-  int32_t maxVariance = moduleSize / 2;
-  return FXSYS_abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) <
-             maxVariance &&
-         FXSYS_abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) <
-             maxVariance &&
-         FXSYS_abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) <
-             3 * maxVariance &&
-         FXSYS_abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) <
-             maxVariance &&
-         FXSYS_abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) <
-             maxVariance;
-}
-FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckVertical(
-    int32_t startI,
-    int32_t centerJ,
-    int32_t maxCount,
-    int32_t originalStateCountTotal) {
-  CBC_CommonBitMatrix* image = m_image;
-  int32_t maxI = image->GetHeight();
-  CFX_Int32Array& stateCount = GetCrossCheckStateCount();
-  int32_t i = startI;
-  while (i >= 0 && image->Get(centerJ, i)) {
-    stateCount[2]++;
-    i--;
-  }
-  if (i < 0) {
-    return FXSYS_nan();
-  }
-  while (i >= 0 && !image->Get(centerJ, i) && stateCount[1] <= maxCount) {
-    stateCount[1]++;
-    i--;
-  }
-  if (i < 0 || stateCount[1] > maxCount) {
-    return FXSYS_nan();
-  }
-  while (i >= 0 && image->Get(centerJ, i) && stateCount[0] <= maxCount) {
-    stateCount[0]++;
-    i--;
-  }
-  if (stateCount[0] > maxCount) {
-    return FXSYS_nan();
-  }
-  i = startI + 1;
-  while (i < maxI && image->Get(centerJ, i)) {
-    stateCount[2]++;
-    i++;
-  }
-  if (i == maxI) {
-    return FXSYS_nan();
-  }
-  while (i < maxI && !image->Get(centerJ, i) && stateCount[3] < maxCount) {
-    stateCount[3]++;
-    i++;
-  }
-  if (i == maxI || stateCount[3] >= maxCount) {
-    return FXSYS_nan();
-  }
-  while (i < maxI && image->Get(centerJ, i) && stateCount[4] < maxCount) {
-    stateCount[4]++;
-    i++;
-  }
-  if (stateCount[4] >= maxCount) {
-    return FXSYS_nan();
-  }
-  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
-                            stateCount[3] + stateCount[4];
-  if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >=
-      originalStateCountTotal) {
-    return FXSYS_nan();
-  }
-  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i)
-                                       : FXSYS_nan();
-}
-FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckHorizontal(
-    int32_t startJ,
-    int32_t centerI,
-    int32_t maxCount,
-    int32_t originalStateCountTotal) {
-  CBC_CommonBitMatrix* image = m_image;
-  int32_t maxJ = image->GetWidth();
-  CFX_Int32Array& stateCount = GetCrossCheckStateCount();
-  int32_t j = startJ;
-  while (j >= 0 && image->Get(j, centerI)) {
-    stateCount[2]++;
-    j--;
-  }
-  if (j < 0) {
-    return FXSYS_nan();
-  }
-  while (j >= 0 && !image->Get(j, centerI) && stateCount[1] <= maxCount) {
-    stateCount[1]++;
-    j--;
-  }
-  if (j < 0 || stateCount[1] > maxCount) {
-    return FXSYS_nan();
-  }
-  while (j >= 0 && image->Get(j, centerI) && stateCount[0] <= maxCount) {
-    stateCount[0]++;
-    j--;
-  }
-  if (stateCount[0] > maxCount) {
-    return FXSYS_nan();
-  }
-  j = startJ + 1;
-  while (j < maxJ && image->Get(j, centerI)) {
-    stateCount[2]++;
-    j++;
-  }
-  if (j == maxJ) {
-    return FXSYS_nan();
-  }
-  while (j < maxJ && !image->Get(j, centerI) && stateCount[3] < maxCount) {
-    stateCount[3]++;
-    j++;
-  }
-  if (j == maxJ || stateCount[3] >= maxCount) {
-    return FXSYS_nan();
-  }
-  while (j < maxJ && image->Get(j, centerI) && stateCount[4] < maxCount) {
-    stateCount[4]++;
-    j++;
-  }
-  if (stateCount[4] >= maxCount) {
-    return FXSYS_nan();
-  }
-  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
-                            stateCount[3] + stateCount[4];
-  if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >=
-      originalStateCountTotal) {
-    return FXSYS_nan();
-  }
-  return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j)
-                                       : FXSYS_nan();
-}
-FX_BOOL CBC_QRFinderPatternFinder::HandlePossibleCenter(
-    const CFX_Int32Array& stateCount,
-    int32_t i,
-    int32_t j) {
-  int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] +
-                            stateCount[3] + stateCount[4];
-  FX_FLOAT centerJ = CenterFromEnd(stateCount, j);
-  FX_FLOAT centerI =
-      CrossCheckVertical(i, (int32_t)centerJ, stateCount[2], stateCountTotal);
-  if (!FXSYS_isnan(centerI)) {
-    centerJ = CrossCheckHorizontal((int32_t)centerJ, (int32_t)centerI,
-                                   stateCount[2], stateCountTotal);
-    if (!FXSYS_isnan(centerJ)) {
-      FX_FLOAT estimatedModuleSize = (FX_FLOAT)stateCountTotal / 7.0f;
-      FX_BOOL found = FALSE;
-      int32_t max = m_possibleCenters.GetSize();
-      for (int32_t index = 0; index < max; index++) {
-        CBC_QRFinderPattern* center =
-            (CBC_QRFinderPattern*)(m_possibleCenters[index]);
-        if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) {
-          center->IncrementCount();
-          found = TRUE;
-          break;
-        }
-      }
-      if (!found) {
-        m_possibleCenters.Add(
-            new CBC_QRFinderPattern(centerJ, centerI, estimatedModuleSize));
-      }
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-int32_t CBC_QRFinderPatternFinder::FindRowSkip() {
-  int32_t max = m_possibleCenters.GetSize();
-  if (max <= 1) {
-    return 0;
-  }
-  FinderPattern* firstConfirmedCenter = NULL;
-  for (int32_t i = 0; i < max; i++) {
-    CBC_QRFinderPattern* center = (CBC_QRFinderPattern*)m_possibleCenters[i];
-    if (center->GetCount() >= CENTER_QUORUM) {
-      if (firstConfirmedCenter == NULL) {
-        firstConfirmedCenter = center;
-      } else {
-        m_hasSkipped = TRUE;
-        return (int32_t)((fabs(firstConfirmedCenter->GetX() - center->GetX()) -
-                          fabs(firstConfirmedCenter->GetY() - center->GetY())) /
-                         2);
-      }
-    }
-  }
-  return 0;
-}
-FX_BOOL CBC_QRFinderPatternFinder::HaveMultiplyConfirmedCenters() {
-  int32_t confirmedCount = 0;
-  FX_FLOAT totalModuleSize = 0.0f;
-  int32_t max = m_possibleCenters.GetSize();
-  int32_t i;
-  for (i = 0; i < max; i++) {
-    CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[i];
-    if (pattern->GetCount() >= CENTER_QUORUM) {
-      confirmedCount++;
-      totalModuleSize += pattern->GetEstimatedModuleSize();
-    }
-  }
-  if (confirmedCount < 3) {
-    return FALSE;
-  }
-  FX_FLOAT average = totalModuleSize / (FX_FLOAT)max;
-  FX_FLOAT totalDeviation = 0.0f;
-  for (i = 0; i < max; i++) {
-    CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[i];
-    totalDeviation += fabs(pattern->GetEstimatedModuleSize() - average);
-  }
-  return totalDeviation <= 0.05f * totalModuleSize;
-}
-inline FX_BOOL centerComparator(void* a, void* b) {
-  return ((CBC_QRFinderPattern*)b)->GetCount() <
-         ((CBC_QRFinderPattern*)a)->GetCount();
-}
-CFX_PtrArray* CBC_QRFinderPatternFinder::SelectBestpatterns(int32_t& e) {
-  int32_t startSize = m_possibleCenters.GetSize();
-  if (m_possibleCenters.GetSize() < 3) {
-    e = BCExceptionRead;
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  }
-  FX_FLOAT average = 0.0f;
-  if (startSize > 3) {
-    FX_FLOAT totalModuleSize = 0.0f;
-    for (int32_t i = 0; i < startSize; i++) {
-      totalModuleSize += ((CBC_QRFinderPattern*)m_possibleCenters[i])
-                             ->GetEstimatedModuleSize();
-    }
-    average = totalModuleSize / (FX_FLOAT)startSize;
-    for (int32_t j = 0;
-         j < m_possibleCenters.GetSize() && m_possibleCenters.GetSize() > 3;
-         j++) {
-      CBC_QRFinderPattern* pattern = (CBC_QRFinderPattern*)m_possibleCenters[j];
-      if (fabs(pattern->GetEstimatedModuleSize() - average) > 0.2f * average) {
-        delete pattern;
-        m_possibleCenters.RemoveAt(j);
-        j--;
-      }
-    }
-  }
-  if (m_possibleCenters.GetSize() > 3) {
-    BC_FX_PtrArray_Sort(m_possibleCenters, centerComparator);
-  }
-  CFX_PtrArray* vec = new CFX_PtrArray();
-  vec->SetSize(3);
-  (*vec)[0] = ((CBC_QRFinderPattern*)m_possibleCenters[0])->Clone();
-  (*vec)[1] = ((CBC_QRFinderPattern*)m_possibleCenters[1])->Clone();
-  (*vec)[2] = ((CBC_QRFinderPattern*)m_possibleCenters[2])->Clone();
-  return vec;
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h
deleted file mode 100644
index b764049..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-class CBC_QRFinderPattern;
-class CBC_ResultPoint;
-class CBC_QRFinderPatternInfo;
-
-class CBC_QRFinderPatternFinder {
- private:
-  static const int32_t CENTER_QUORUM;
-  static const int32_t MIN_SKIP;
-  static const int32_t MAX_MODULES;
-  static const int32_t INTEGER_MATH_SHIFT;
-  FX_BOOL m_hasSkipped;
-  CBC_CommonBitMatrix* m_image;
-  CFX_Int32Array m_crossCheckStateCount;
-  CFX_PtrArray m_possibleCenters;
-
- public:
-  CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image);
-  virtual ~CBC_QRFinderPatternFinder();
-  int32_t FindRowSkip();
-  CBC_CommonBitMatrix* GetImage();
-  CBC_QRFinderPatternInfo* Find(int32_t hint, int32_t& e);
-
-  CFX_Int32Array& GetCrossCheckStateCount();
-  CFX_PtrArray* GetPossibleCenters();
-  CFX_PtrArray* SelectBestpatterns(int32_t& e);
-
-  FX_BOOL HandlePossibleCenter(const CFX_Int32Array& stateCount,
-                               int32_t i,
-                               int32_t j);
-  FX_BOOL HaveMultiplyConfirmedCenters();
-  FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);
-  FX_FLOAT CrossCheckVertical(int32_t startI,
-                              int32_t centerJ,
-                              int32_t maxCount,
-                              int32_t originalStateCountTotal);
-  FX_FLOAT CrossCheckHorizontal(int32_t startJ,
-                                int32_t CenterI,
-                                int32_t maxCOunt,
-                                int32_t originalStateCountTotal);
-  static void OrderBestPatterns(CFX_PtrArray* patterns);
-  static FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
-  static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRFINDERPATTERNFINDER_H_
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp
deleted file mode 100644
index 87f0fd0..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h"
-
-#include <memory>
-
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h"
-#include "xfa/src/fxbarcode/utils.h"
-
-CBC_QRGridSampler CBC_QRGridSampler::m_gridSampler;
-
-CBC_QRGridSampler::CBC_QRGridSampler() {}
-CBC_QRGridSampler::~CBC_QRGridSampler() {}
-CBC_QRGridSampler& CBC_QRGridSampler::GetInstance() {
-  return m_gridSampler;
-}
-void CBC_QRGridSampler::CheckAndNudgePoints(CBC_CommonBitMatrix* image,
-                                            CFX_FloatArray* points,
-                                            int32_t& e) {
-  int32_t width = image->GetWidth();
-  int32_t height = image->GetHeight();
-  FX_BOOL nudged = TRUE;
-  int32_t offset;
-  for (offset = 0; offset < points->GetSize() && nudged; offset += 2) {
-    int32_t x = (int32_t)(*points)[offset];
-    int32_t y = (int32_t)(*points)[offset + 1];
-    if (x < -1 || x > width || y < -1 || y > height) {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    nudged = FALSE;
-    if (x == -1) {
-      (*points)[offset] = 0.0f;
-      nudged = TRUE;
-    } else if (x == width) {
-      (*points)[offset] = (FX_FLOAT)(width - 1);
-      nudged = TRUE;
-    }
-    if (y == -1) {
-      (*points)[offset + 1] = 0.0f;
-      nudged = TRUE;
-    } else if (y == height) {
-      (*points)[offset + 1] = (FX_FLOAT)(height - 1);
-      nudged = TRUE;
-    }
-  }
-  nudged = TRUE;
-  for (offset = (*points).GetSize() - 2; offset >= 0 && nudged; offset -= 2) {
-    int32_t x = (int32_t)(*points)[offset];
-    int32_t y = (int32_t)(*points)[offset + 1];
-    if (x < -1 || x > width || y < -1 || y > height) {
-      e = BCExceptionRead;
-      BC_EXCEPTION_CHECK_ReturnVoid(e);
-    }
-    nudged = FALSE;
-    if (x == -1) {
-      (*points)[offset] = 0.0f;
-      nudged = TRUE;
-    } else if (x == width) {
-      (*points)[offset] = (FX_FLOAT)(width - 1);
-      nudged = TRUE;
-    }
-    if (y == -1) {
-      (*points)[offset + 1] = 0.0f;
-      nudged = TRUE;
-    } else if (y == height) {
-      (*points)[offset + 1] = (FX_FLOAT)(height - 1);
-      nudged = TRUE;
-    }
-  }
-}
-CBC_CommonBitMatrix* CBC_QRGridSampler::SampleGrid(CBC_CommonBitMatrix* image,
-                                                   int32_t dimensionX,
-                                                   int32_t dimensionY,
-                                                   FX_FLOAT p1ToX,
-                                                   FX_FLOAT p1ToY,
-                                                   FX_FLOAT p2ToX,
-                                                   FX_FLOAT p2ToY,
-                                                   FX_FLOAT p3ToX,
-                                                   FX_FLOAT p3ToY,
-                                                   FX_FLOAT p4ToX,
-                                                   FX_FLOAT p4ToY,
-                                                   FX_FLOAT p1FromX,
-                                                   FX_FLOAT p1FromY,
-                                                   FX_FLOAT p2FromX,
-                                                   FX_FLOAT p2FromY,
-                                                   FX_FLOAT p3FromX,
-                                                   FX_FLOAT p3FromY,
-                                                   FX_FLOAT p4FromX,
-                                                   FX_FLOAT p4FromY,
-                                                   int32_t& e) {
-  std::unique_ptr<CBC_CommonPerspectiveTransform> transform(
-      CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(
-          p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX,
-          p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY));
-  std::unique_ptr<CBC_CommonBitMatrix> bits(new CBC_CommonBitMatrix());
-  bits->Init(dimensionX, dimensionY);
-  CFX_FloatArray points;
-  points.SetSize(dimensionX << 1);
-  for (int32_t y = 0; y < dimensionY; y++) {
-    int32_t max = points.GetSize();
-    FX_FLOAT iValue = (FX_FLOAT)(y + 0.5f);
-    int32_t x;
-    for (x = 0; x < max; x += 2) {
-      points[x] = (FX_FLOAT)((x >> 1) + 0.5f);
-      points[x + 1] = iValue;
-    }
-    transform->TransformPoints(&points);
-    CheckAndNudgePoints(image, &points, e);
-    BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-    for (x = 0; x < max; x += 2) {
-      if (image->Get((int32_t)points[x], (int32_t)points[x + 1])) {
-        bits->Set(x >> 1, y);
-      }
-    }
-  }
-  return bits.release();
-}
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h
deleted file mode 100644
index ce75ac8..0000000
--- a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
-#define XFA_SRC_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-class CBC_CommonBitMatrix;
-
-class CBC_QRGridSampler {
- private:
-  static CBC_QRGridSampler m_gridSampler;
-
- public:
-  CBC_QRGridSampler();
-  virtual ~CBC_QRGridSampler();
-  virtual CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
-                                          int32_t dimensionX,
-                                          int32_t dimensionY,
-                                          FX_FLOAT p1ToX,
-                                          FX_FLOAT p1ToY,
-                                          FX_FLOAT p2ToX,
-                                          FX_FLOAT p2ToY,
-                                          FX_FLOAT p3ToX,
-                                          FX_FLOAT p3ToY,
-                                          FX_FLOAT p4ToX,
-                                          FX_FLOAT p4ToY,
-                                          FX_FLOAT p1FromX,
-                                          FX_FLOAT p1FromY,
-                                          FX_FLOAT p2FromX,
-                                          FX_FLOAT p2FromY,
-                                          FX_FLOAT p3FromX,
-                                          FX_FLOAT p3FromY,
-                                          FX_FLOAT p4FromX,
-                                          FX_FLOAT p4FromY,
-                                          int32_t& e);
-
-  static CBC_QRGridSampler& GetInstance();
-  static void CheckAndNudgePoints(CBC_CommonBitMatrix* image,
-                                  CFX_FloatArray* points,
-                                  int32_t& e);
-};
-
-#endif  // XFA_SRC_FXBARCODE_QRCODE_BC_QRGRIDSAMPLER_H_
diff --git a/xfa/src/fxbarcode/utils.h b/xfa/src/fxbarcode/utils.h
deleted file mode 100644
index 23830d5..0000000
--- a/xfa/src/fxbarcode/utils.h
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXBARCODE_UTILS_H_
-#define XFA_SRC_FXBARCODE_UTILS_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-
-typedef CFX_MapPtrTemplate<void*, int32_t> CFX_PtrToInt32;
-FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString& dst,
-                                 FX_DWORD first,
-                                 FX_DWORD last,
-                                 int32_t count,
-                                 FX_CHAR c);
-void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c);
-void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba);
-typedef FX_BOOL (*BC_PtrArrayCompareCallback)(void* l, void* r);
-void BC_FX_PtrArray_Sort(CFX_PtrArray& src, BC_PtrArrayCompareCallback fun);
-
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
-#include <limits>
-#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
-      _FX_OS_ == _FX_IOS_)
-#include <limits.h>
-#endif
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
-#define FXSYS_isnan(x) _isnan(x)
-#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_)
-#include <cmath>
-#define FXSYS_isnan(x) std::isnan(x)
-#elif(_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_)
-#include <math.h>
-#define FXSYS_isnan(x) isnan(x)
-#endif
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
-#define FXSYS_nan() (std::numeric_limits<float>::quiet_NaN())
-#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
-      _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_)
-#define FXSYS_nan() NAN
-#endif
-enum BCFORMAT {
-  BCFORMAT_UNSPECIFY = -1,
-  BCFORMAT_CODABAR,
-  BCFORMAT_CODE_39,
-  BCFORMAT_CODE_128,
-  BCFORMAT_CODE_128B,
-  BCFORMAT_CODE_128C,
-  BCFORMAT_EAN_8,
-  BCFORMAT_UPC_A,
-  BCFORMAT_EAN_13,
-  BCFORMAT_PDF_417,
-  BCFORMAT_DATAMATRIX,
-  BCFORMAT_QR_CODE
-};
-#define BCFORMAT_ECLEVEL_L 0
-#define BCFORMAT_ECLEVEL_M 1
-#define BCFORMAT_ECLEVEL_Q 2
-#define BCFORMAT_ECLEVEL_H 3
-#include <ctype.h>
-#define FXSYS_IntMax INT_MAX
-#define FXSYS_Isdigit isdigit
-#define BCExceptionNO 0
-#define BCExceptionNotFound 1
-#define BCExceptionEndLessThanStart 2
-#define BCExceptionUnknownDecoder 3
-#define BCExceptionRotateNotSupported 4
-#define BCExceptionHeightAndWidthMustBeAtLeast1 5
-#define BCExceptionRegionMustFitInsideMatrix 6
-#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7
-#define BCExceptionFormatException 8
-#define BCExceptionIllegalArgumentMustMatchVersionSize 9
-#define BCExceptionChecksumException 10
-#define BCExceptionIllegalArgumentInvalidFirstDigit 11
-#define BCExceptionIllegalArgumentInvalidSecondDigit 12
-#define BCExceptionRuntimeDecodingInvalidISO_IEC 13
-#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14
-#define BCExceptionLeftAndTopMustBeNonnegative 15
-#define BCExceptionIllegalArgument 16
-#define BCExceptionBadECI 17
-#define BCExceptionUnSupportedBarcode 18
-#define BCExceptionUnSupportedString 19
-#define BCExceptionDigitLengthMustBe8 20
-#define BCExceptionDataCheckException 21
-#define BCExceptionExtractNumberValueFromBitArray 22
-#define BCExceptionRead 23
-#define BCExceptionRequestedRowIsOutSizeTheImage 24
-#define BCExceptionNoContents 26
-#define BCExceptionUnSupportEclevel 27
-#define BCExceptionUnSupportMode 28
-#define BCExceptionReferenceMustBeBetween0And7 29
-#define BCExceptionBadErrorLocation 30
-#define BCExceptionDegreeIsNegative 31
-#define BCExceptionDivideByZero 32
-#define BCExceptionCoefficientsSizeIsNull 33
-#define BCExceptionNoCorrectionBytes 34
-#define BCExceptionNoDataBytesProvided 35
-#define BCExceptionR_I_1IsZero 36
-#define BCExceptionAIsZero 37
-#define BCExceptionIsZero 38
-#define BCExceptionDegreeNotMatchRoots 39
-#define BCExceptionContentsLengthShouldBetween1and80 40
-#define BCExceptionOnlyEncodeCODE_128 41
-#define BCExceptionOnlyEncodeCODE_39 42
-#define BCExceptionOnlyEncodeEAN_13 43
-#define BCExceptionOnlyEncodeEAN_8 44
-#define BCExceptionOnlyEncodeITF 45
-#define BCExceptionDigitLengthShould13 46
-#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47
-#define BCExceptionOnlyEncodeUPC_A 48
-#define BCExceptionDigitLengthShouldBe12 49
-#define BCExceptionValueMustBeEither0or1 50
-#define BCExceptionReedsolomnDecodeException 51
-#define BCExceptionBadIndexException 52
-#define BCExceptionBadValueException 53
-#define BCExceptionBadNumBitsException 54
-#define BCExceptioncanNotOperatexorOperator 55
-#define BCExceptionVersionMust1_40 56
-#define BCExceptionUnknown 57
-#define BCExceptionNoSuchVersion 58
-#define BCExceptionCannotFindBlockInfo 59
-#define BCExceptionDataTooBig 60
-#define BCExceptionInvalidQRCode 61
-#define BCExceptionDataTooMany 62
-#define BCExceptionBitsNotEqualCacity 63
-#define BCExceptionUnsupportedMode 64
-#define BCExceptionInvalidateCharacter 65
-#define BCExceptionBytesNotMatchOffset 66
-#define BCExceptionSizeInBytesDiffer 67
-#define BCExceptionInvalidateMaskPattern 68
-#define BCExceptionNullPointer 69
-#define BCExceptionBadMask 70
-#define BCExceptionBitSizeNot15 71
-#define BCExceptionBitSizeNot18 72
-#define BCExceptionInvalidateImageData 73
-#define BCExceptionHeight_8BeZero 74
-#define BCExceptionCharacterNotThisMode 75
-#define BCExceptionBitsBytesNotMatch 76
-#define BCExceptionInvalidateData 77
-#define BCExceptionLoadFile 78
-#define BCExceptionPDF417EncodeFail 79
-#define BCExceptionFailToCreateBitmap 80
-#define BCExceptionLoadFontFail 81
-#define BCExceptionOnlyEncodeCODEBAR 82
-#define BCExceptionCodabarShouldStartWithOneOfABCD 83
-#define BCExceptionCodabarShouldEndWithOneOfTNE 84
-#define BCExceptionCodabarEncodeCharsInvalid 85
-#define BCExceptionOnlyEncodeDATAMATRIX 86
-#define BCExceptionCharactersOutsideISO88591Encoding 87
-#define BCExceptionIllegalDataCodewords 88
-#define BCExceptionCannotHandleThisNumberOfDataRegions 89
-#define BCExceptionIllegalStateUnexpectedCase 90
-#define BCExceptionIllegalStateCountMustNotExceed4 91
-#define BCExceptionIllegalStateMessageLengthInvalid 92
-#define BCExceptionIllegalArgumentNotGigits 93
-#define BCExceptionIllegalStateIllegalMode 94
-#define BCExceptionOnlyEncodePDF417 95
-#define BCExceptionNonEncodableCharacterDetected 96
-#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97
-#define BCExceptionNoRecommendationPossible 98
-#define BCExceptionIllegalArgumentnMustBeAbove0 99
-#define BCExceptionUnableToFitMessageInColumns 100
-#define BCExceptionEncodedMessageContainsTooManyCodeWords 101
-#define BCExceptionBitmapSizeError 102
-#define BCExceptionFormatInstance 102
-#define BCExceptionChecksumInstance 103
-#define BCExceptiontNotFoundInstance 104
-#define BCExceptionNotFoundInstance 105
-#define BCExceptionCannotMetadata 106
-#define TWO_DIGIT_DATA_LENGTH_SIZE 24
-#define THREE_DIGIT_DATA_LENGTH_SIZE 23
-#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57
-#define FOUR_DIGIT_DATA_LENGTH_SIZE 17
-#define BC_EXCEPTION_CHECK_ReturnVoid(e) \
-  if (e != BCExceptionNO)                \
-    return;
-#define BC_EXCEPTION_CHECK_ReturnValue(e, v) \
-  if (e != BCExceptionNO)                    \
-    return v;
-
-#endif  // XFA_SRC_FXBARCODE_UTILS_H_
diff --git a/xfa/src/fxfa/app/xfa_checksum.cpp b/xfa/src/fxfa/app/xfa_checksum.cpp
deleted file mode 100644
index 3df37cf..0000000
--- a/xfa/src/fxfa/app/xfa_checksum.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_checksum.h"
-
-#include "core/include/fdrm/fx_crypt.h"
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-
-CXFA_SAXReaderHandler::CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext)
-    : m_pContext(pContext) {
-  FXSYS_assert(m_pContext);
-}
-CXFA_SAXReaderHandler::~CXFA_SAXReaderHandler() {}
-void* CXFA_SAXReaderHandler::OnTagEnter(const CFX_ByteStringC& bsTagName,
-                                        FX_SAXNODE eType,
-                                        FX_DWORD dwStartPos) {
-  UpdateChecksum(TRUE);
-  if (eType != FX_SAXNODE_Tag && eType != FX_SAXNODE_Instruction) {
-    return NULL;
-  }
-  m_SAXContext.m_eNode = eType;
-  CFX_ByteTextBuf& textBuf = m_SAXContext.m_TextBuf;
-  textBuf << "<";
-  if (eType == FX_SAXNODE_Instruction) {
-    textBuf << "?";
-  }
-  textBuf << bsTagName;
-  m_SAXContext.m_bsTagName = bsTagName;
-  return &m_SAXContext;
-}
-void CXFA_SAXReaderHandler::OnTagAttribute(void* pTag,
-                                           const CFX_ByteStringC& bsAttri,
-                                           const CFX_ByteStringC& bsValue) {
-  if (pTag == NULL) {
-    return;
-  }
-  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
-  textBuf << " " << bsAttri << "=\"" << bsValue << "\"";
-}
-void CXFA_SAXReaderHandler::OnTagBreak(void* pTag) {
-  if (pTag == NULL) {
-    return;
-  }
-  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
-  textBuf << ">";
-  UpdateChecksum(FALSE);
-}
-void CXFA_SAXReaderHandler::OnTagData(void* pTag,
-                                      FX_SAXNODE eType,
-                                      const CFX_ByteStringC& bsData,
-                                      FX_DWORD dwStartPos) {
-  if (pTag == NULL) {
-    return;
-  }
-  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
-  if (eType == FX_SAXNODE_CharData) {
-    textBuf << "<![CDATA[";
-  }
-  textBuf << bsData;
-  if (eType == FX_SAXNODE_CharData) {
-    textBuf << "]]>";
-  }
-}
-void CXFA_SAXReaderHandler::OnTagClose(void* pTag, FX_DWORD dwEndPos) {
-  if (pTag == NULL) {
-    return;
-  }
-  CXFA_SAXContext* pSAXContext = (CXFA_SAXContext*)pTag;
-  CFX_ByteTextBuf& textBuf = pSAXContext->m_TextBuf;
-  if (pSAXContext->m_eNode == FX_SAXNODE_Instruction) {
-    textBuf << "?>";
-  } else if (pSAXContext->m_eNode == FX_SAXNODE_Tag) {
-    textBuf << "></" << pSAXContext->m_bsTagName << ">";
-  }
-  UpdateChecksum(FALSE);
-}
-void CXFA_SAXReaderHandler::OnTagEnd(void* pTag,
-                                     const CFX_ByteStringC& bsTagName,
-                                     FX_DWORD dwEndPos) {
-  if (pTag == NULL) {
-    return;
-  }
-  CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
-  textBuf << "</" << bsTagName << ">";
-  UpdateChecksum(FALSE);
-}
-void CXFA_SAXReaderHandler::OnTargetData(void* pTag,
-                                         FX_SAXNODE eType,
-                                         const CFX_ByteStringC& bsData,
-                                         FX_DWORD dwStartPos) {
-  if (pTag == NULL && eType != FX_SAXNODE_Comment) {
-    return;
-  }
-  if (eType == FX_SAXNODE_Comment) {
-    CFX_ByteTextBuf& textBuf = m_SAXContext.m_TextBuf;
-    textBuf << "<!--" << bsData << "-->";
-    UpdateChecksum(FALSE);
-  } else {
-    CFX_ByteTextBuf& textBuf = ((CXFA_SAXContext*)pTag)->m_TextBuf;
-    textBuf << " " << bsData;
-  }
-}
-void CXFA_SAXReaderHandler::UpdateChecksum(FX_BOOL bCheckSpace) {
-  int32_t iLength = m_SAXContext.m_TextBuf.GetLength();
-  if (iLength < 1) {
-    return;
-  }
-  uint8_t* pBuffer = m_SAXContext.m_TextBuf.GetBuffer();
-  FX_BOOL bUpdata = TRUE;
-  if (bCheckSpace) {
-    bUpdata = FALSE;
-    for (int32_t i = 0; i < iLength; i++) {
-      bUpdata = (pBuffer[i] > 0x20);
-      if (bUpdata) {
-        break;
-      }
-    }
-  }
-  if (bUpdata) {
-    m_pContext->Update(CFX_ByteStringC(pBuffer, iLength));
-  }
-  m_SAXContext.m_TextBuf.Clear();
-}
-IXFA_ChecksumContext* XFA_Checksum_Create() {
-  return new CXFA_ChecksumContext;
-}
-CXFA_ChecksumContext::CXFA_ChecksumContext()
-    : m_pSAXReader(NULL), m_pByteContext(NULL) {}
-CXFA_ChecksumContext::~CXFA_ChecksumContext() {
-  FinishChecksum();
-}
-FX_BOOL CXFA_ChecksumContext::StartChecksum() {
-  FinishChecksum();
-  m_pByteContext = FX_Alloc(uint8_t, 128);
-  CRYPT_SHA1Start(m_pByteContext);
-  m_bsChecksum.Empty();
-  m_pSAXReader = FX_SAXReader_Create();
-  return m_pSAXReader != NULL;
-}
-FX_BOOL CXFA_ChecksumContext::UpdateChecksum(IFX_FileRead* pSrcFile,
-                                             FX_FILESIZE offset,
-                                             size_t size) {
-  if (m_pSAXReader == NULL) {
-    return FALSE;
-  }
-  if (pSrcFile == NULL) {
-    return FALSE;
-  }
-  if (size < 1) {
-    size = pSrcFile->GetSize();
-  }
-  CXFA_SAXReaderHandler handler(this);
-  m_pSAXReader->SetHandler(&handler);
-  if (m_pSAXReader->StartParse(
-          pSrcFile, (FX_DWORD)offset, (FX_DWORD)size,
-          FX_SAXPARSEMODE_NotSkipSpace | FX_SAXPARSEMODE_NotConvert_amp |
-              FX_SAXPARSEMODE_NotConvert_lt | FX_SAXPARSEMODE_NotConvert_gt |
-              FX_SAXPARSEMODE_NotConvert_sharp) < 0) {
-    return FALSE;
-  }
-  return m_pSAXReader->ContinueParse(NULL) > 99;
-}
-void CXFA_ChecksumContext::FinishChecksum() {
-  if (m_pSAXReader) {
-    m_pSAXReader->Release();
-    m_pSAXReader = NULL;
-  }
-  if (m_pByteContext) {
-    uint8_t digest[20];
-    FXSYS_memset(digest, 0, 20);
-    CRYPT_SHA1Finish(m_pByteContext, digest);
-    int32_t nLen = FX_Base64EncodeA(digest, 20, NULL);
-    FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen);
-    FX_Base64EncodeA(digest, 20, pBuffer);
-    m_bsChecksum.ReleaseBuffer(nLen);
-    FX_Free(m_pByteContext);
-    m_pByteContext = NULL;
-  }
-}
-void CXFA_ChecksumContext::GetChecksum(CFX_ByteString& bsChecksum) {
-  bsChecksum = m_bsChecksum;
-}
-void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) {
-  if (m_pByteContext) {
-    CRYPT_SHA1Update(m_pByteContext, bsText.GetPtr(), bsText.GetLength());
-  }
-}
diff --git a/xfa/src/fxfa/app/xfa_checksum.h b/xfa/src/fxfa/app/xfa_checksum.h
deleted file mode 100644
index fb004d3..0000000
--- a/xfa/src/fxfa/app/xfa_checksum.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_CHECKSUM_H_
-#define XFA_SRC_FXFA_APP_XFA_CHECKSUM_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fgas/xml/fgas_sax.h"
-
-class CXFA_SAXReaderHandler;
-class CXFA_ChecksumContext;
-
-class CXFA_SAXContext {
- public:
-  CXFA_SAXContext() : m_eNode(FX_SAXNODE_Unknown) {}
-  CFX_ByteTextBuf m_TextBuf;
-  CFX_ByteString m_bsTagName;
-  FX_SAXNODE m_eNode;
-};
-class CXFA_SAXReaderHandler : public IFX_SAXReaderHandler {
- public:
-  CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext);
-  virtual ~CXFA_SAXReaderHandler();
-  virtual void* OnTagEnter(const CFX_ByteStringC& bsTagName,
-                           FX_SAXNODE eType,
-                           FX_DWORD dwStartPos);
-  virtual void OnTagAttribute(void* pTag,
-                              const CFX_ByteStringC& bsAttri,
-                              const CFX_ByteStringC& bsValue);
-  virtual void OnTagBreak(void* pTag);
-  virtual void OnTagData(void* pTag,
-                         FX_SAXNODE eType,
-                         const CFX_ByteStringC& bsData,
-                         FX_DWORD dwStartPos);
-  virtual void OnTagClose(void* pTag, FX_DWORD dwEndPos);
-  virtual void OnTagEnd(void* pTag,
-                        const CFX_ByteStringC& bsTagName,
-                        FX_DWORD dwEndPos);
-
-  virtual void OnTargetData(void* pTag,
-                            FX_SAXNODE eType,
-                            const CFX_ByteStringC& bsData,
-                            FX_DWORD dwStartPos);
-
- protected:
-  void UpdateChecksum(FX_BOOL bCheckSpace);
-  CXFA_ChecksumContext* m_pContext;
-  CXFA_SAXContext m_SAXContext;
-};
-
-class CXFA_ChecksumContext : public IXFA_ChecksumContext {
- public:
-  CXFA_ChecksumContext();
-  virtual ~CXFA_ChecksumContext();
-  virtual void Release() { delete this; }
-  virtual FX_BOOL StartChecksum();
-  virtual FX_BOOL UpdateChecksum(IFX_FileRead* pSrcFile,
-                                 FX_FILESIZE offset = 0,
-                                 size_t size = 0);
-  virtual void FinishChecksum();
-  virtual void GetChecksum(CFX_ByteString& bsChecksum);
-  void Update(const CFX_ByteStringC& bsText);
-
- protected:
-  IFX_SAXReader* m_pSAXReader;
-  uint8_t* m_pByteContext;
-  CFX_ByteString m_bsChecksum;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_CHECKSUM_H_
diff --git a/xfa/src/fxfa/app/xfa_ffapp.cpp b/xfa/src/fxfa/app/xfa_ffapp.cpp
deleted file mode 100644
index d37eaf5..0000000
--- a/xfa/src/fxfa/app/xfa_ffapp.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-
-#include <algorithm>
-
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdochandler.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgethandler.h"
-#include "xfa/src/fxfa/app/xfa_fontmgr.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/app/xfa_fwltheme.h"
-
-CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams) {
-  int32_t iCount = streams.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CPDF_StreamAcc& acc = m_Data.Add();
-    acc.LoadAllData(streams[i]);
-  }
-}
-FX_FILESIZE CXFA_FileRead::GetSize() {
-  FX_DWORD dwSize = 0;
-  int32_t iCount = m_Data.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CPDF_StreamAcc& acc = m_Data[i];
-    dwSize += acc.GetSize();
-  }
-  return dwSize;
-}
-FX_BOOL CXFA_FileRead::ReadBlock(void* buffer,
-                                 FX_FILESIZE offset,
-                                 size_t size) {
-  int32_t iCount = m_Data.GetSize();
-  int32_t index = 0;
-  while (index < iCount) {
-    CPDF_StreamAcc& acc = m_Data[index];
-    FX_FILESIZE dwSize = acc.GetSize();
-    if (offset < dwSize) {
-      break;
-    }
-    offset -= dwSize;
-    index++;
-  }
-  while (index < iCount) {
-    CPDF_StreamAcc& acc = m_Data[index];
-    FX_DWORD dwSize = acc.GetSize();
-    size_t dwRead = std::min(size, static_cast<size_t>(dwSize - offset));
-    FXSYS_memcpy(buffer, acc.GetData() + offset, dwRead);
-    size -= dwRead;
-    if (size == 0) {
-      return TRUE;
-    }
-    buffer = (uint8_t*)buffer + dwRead;
-    offset = 0;
-    index++;
-  }
-  return FALSE;
-}
-// static
-IXFA_App* IXFA_App::Create(IXFA_AppProvider* pProvider) {
-  return new CXFA_FFApp(pProvider);
-}
-// virtual
-IXFA_App::~IXFA_App() {}
-CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider)
-    : m_pDocHandler(nullptr),
-      m_pFWLTheme(nullptr),
-      m_pProvider(pProvider),
-      m_pFontMgr(nullptr),
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-      m_pFontSource(nullptr),
-#endif
-      m_pAdapterWidgetMgr(nullptr),
-      m_pWidgetMgrDelegate(nullptr),
-      m_pFDEFontMgr(nullptr),
-      m_pMenuHandler(nullptr),
-      m_pAdapterThreadMgr(nullptr) {
-  m_pFWLApp = IFWL_App::Create(this);
-  FWL_SetApp(m_pFWLApp);
-  m_pFWLApp->Initialize();
-  IXFA_TimeZoneProvider::Create();
-}
-CXFA_FFApp::~CXFA_FFApp() {
-  delete m_pDocHandler;
-  if (m_pFWLApp) {
-    m_pFWLApp->Finalize();
-    m_pFWLApp->Release();
-    delete m_pFWLApp;
-  }
-  if (m_pFWLTheme)
-    m_pFWLTheme->Release();
-  delete m_pAdapterWidgetMgr;
-  delete m_pAdapterThreadMgr;
-  delete m_pMenuHandler;
-  IXFA_TimeZoneProvider::Destroy();
-  delete m_pFontMgr;
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  if (m_pFontSource)
-    m_pFontSource->Release();
-#endif
-  if (m_pFDEFontMgr)
-    m_pFDEFontMgr->Release();
-}
-IXFA_MenuHandler* CXFA_FFApp::GetMenuHandler() {
-  if (!m_pMenuHandler) {
-    m_pMenuHandler = new CXFA_FFMenuHandler;
-  }
-  return m_pMenuHandler;
-}
-IXFA_DocHandler* CXFA_FFApp::GetDocHandler() {
-  if (!m_pDocHandler) {
-    m_pDocHandler = new CXFA_FFDocHandler;
-  }
-  return m_pDocHandler;
-}
-IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider,
-                                IFX_FileRead* pStream,
-                                FX_BOOL bTakeOverFile) {
-  CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider);
-  FX_BOOL bSuccess = pDoc->OpenDoc(pStream, bTakeOverFile);
-  if (!bSuccess) {
-    delete pDoc;
-    pDoc = NULL;
-  }
-  return pDoc;
-}
-IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider,
-                                CPDF_Document* pPDFDoc) {
-  if (pPDFDoc == NULL) {
-    return NULL;
-  }
-  CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider);
-  FX_BOOL bSuccess = pDoc->OpenDoc(pPDFDoc);
-  if (!bSuccess) {
-    delete pDoc;
-    pDoc = NULL;
-  }
-  return pDoc;
-}
-
-void CXFA_FFApp::SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) {
-  if (!m_pFontMgr) {
-    m_pFontMgr = new CXFA_FontMgr();
-  }
-  m_pFontMgr->SetDefFontMgr(pFontMgr);
-}
-CXFA_FontMgr* CXFA_FFApp::GetXFAFontMgr() {
-  return m_pFontMgr;
-}
-IFX_FontMgr* CXFA_FFApp::GetFDEFontMgr() {
-  if (!m_pFDEFontMgr) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-    m_pFDEFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
-#else
-    m_pFontSource = FX_CreateDefaultFontSourceEnum();
-    m_pFDEFontMgr = IFX_FontMgr::Create(m_pFontSource);
-#endif
-  }
-  return m_pFDEFontMgr;
-}
-CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme() {
-  if (!m_pFWLTheme) {
-    m_pFWLTheme = new CXFA_FWLTheme(this);
-  }
-  return m_pFWLTheme;
-}
-IFWL_AdapterWidgetMgr* CXFA_FFApp::GetWidgetMgr(
-    IFWL_WidgetMgrDelegate* pDelegate) {
-  if (!m_pAdapterWidgetMgr) {
-    m_pAdapterWidgetMgr = new CXFA_FWLAdapterWidgetMgr;
-    pDelegate->OnSetCapability(FWL_WGTMGR_DisableThread |
-                               FWL_WGTMGR_DisableForm);
-    m_pWidgetMgrDelegate = pDelegate;
-  }
-  return m_pAdapterWidgetMgr;
-}
-IFWL_AdapterThreadMgr* CXFA_FFApp::GetThreadMgr() {
-  if (!m_pAdapterThreadMgr) {
-    m_pAdapterThreadMgr = new CFWL_SDAdapterThreadMgr;
-  }
-  return m_pAdapterThreadMgr;
-}
-IFWL_AdapterTimerMgr* CXFA_FFApp::GetTimerMgr() {
-  return m_pProvider->GetTimerMgr();
-}
diff --git a/xfa/src/fxfa/app/xfa_ffapp.h b/xfa/src/fxfa/app/xfa_ffapp.h
deleted file mode 100644
index ba6a0f2..0000000
--- a/xfa/src/fxfa/app/xfa_ffapp.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFAPP_H_
-#define XFA_SRC_FXFA_APP_XFA_FFAPP_H_
-
-#include "core/include/fpdfapi/cpdf_stream.h"
-#include "xfa/include/fwl/adapter/fwl_adapternative.h"
-#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-class CXFA_FWLAdapterWidgetMgr;
-class CXFA_FWLTheme;
-class CXFA_FFDocHandler;
-class CXFA_FFMenuHandler;
-class CXFA_FontMgr;
-
-class CXFA_FileRead : public IFX_FileRead {
- public:
-  explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);
-
-  virtual FX_FILESIZE GetSize();
-  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
-
-  virtual void Release() { delete this; }
-
- protected:
-  CFX_ObjectArray<CPDF_StreamAcc> m_Data;
-};
-
-class CXFA_FFApp : public IXFA_App, public IFWL_AdapterNative {
- public:
-  CXFA_FFApp(IXFA_AppProvider* pProvider);
-  ~CXFA_FFApp() override;
-
-  // IFXFA_App:
-  IXFA_DocHandler* GetDocHandler() override;
-  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
-                      IFX_FileRead* pStream,
-                      FX_BOOL bTakeOverFile) override;
-  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
-                      CPDF_Document* pPDFDoc) override;
-  IXFA_AppProvider* GetAppProvider() override { return m_pProvider; }
-  void SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) override;
-  IXFA_MenuHandler* GetMenuHandler() override;
-
-  // IFWL_AdapterNative:
-  IFWL_AdapterWidgetMgr* GetWidgetMgr(
-      IFWL_WidgetMgrDelegate* pDelegate) override;
-  IFWL_AdapterThreadMgr* GetThreadMgr() override;
-  IFWL_AdapterTimerMgr* GetTimerMgr() override;
-
-  CXFA_FontMgr* GetXFAFontMgr();
-  IFX_FontMgr* GetFDEFontMgr();
-  CXFA_FWLTheme* GetFWLTheme();
-  IFWL_WidgetMgrDelegate* GetWidgetMgrDelegate() {
-    return m_pWidgetMgrDelegate;
-  }
-
- protected:
-  CXFA_FFDocHandler* m_pDocHandler;
-  IFWL_App* m_pFWLApp;
-  CXFA_FWLTheme* m_pFWLTheme;
-  IXFA_AppProvider* m_pProvider;
-  CXFA_FontMgr* m_pFontMgr;
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-  IFX_FontSourceEnum* m_pFontSource;
-#endif
-  CXFA_FWLAdapterWidgetMgr* m_pAdapterWidgetMgr;
-  IFWL_WidgetMgrDelegate* m_pWidgetMgrDelegate;
-  IFX_FontMgr* m_pFDEFontMgr;
-  CXFA_FFMenuHandler* m_pMenuHandler;
-  CFWL_SDAdapterThreadMgr* m_pAdapterThreadMgr;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFAPP_H_
diff --git a/xfa/src/fxfa/app/xfa_ffbarcode.cpp b/xfa/src/fxfa/app/xfa_ffbarcode.cpp
deleted file mode 100644
index e1d4aa1..0000000
--- a/xfa/src/fxfa/app/xfa_ffbarcode.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffbarcode.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/lightwidget/barcode.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-
-static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(
-    const CFX_WideStringC& wsName);
-CXFA_FFBarcode::CXFA_FFBarcode(CXFA_FFPageView* pPageView,
-                               CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
-CXFA_FFBarcode::~CXFA_FFBarcode() {}
-FX_BOOL CXFA_FFBarcode::LoadWidget() {
-  CFWL_Barcode* pFWLBarcode = CFWL_Barcode::Create();
-  if (pFWLBarcode) {
-    pFWLBarcode->Initialize();
-  }
-  m_pNormalWidget = pFWLBarcode;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
-  pFWLBarcode->SetText(wsText);
-  UpdateWidgetProperty();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFBarcode::RenderWidget(CFX_Graphics* pGS,
-                                  CFX_Matrix* pMatrix,
-                                  FX_DWORD dwStatus,
-                                  int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
-  RenderCaption(pGS, &mtRotate);
-  CFX_RectF rtWidget;
-  m_pNormalWidget->GetWidgetRect(rtWidget);
-  CFX_Matrix mt;
-  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
-  mt.Concat(mtRotate);
-  m_pNormalWidget->DrawWidget(pGS, &mt);
-}
-void CXFA_FFBarcode::UpdateWidgetProperty() {
-  CXFA_FFTextEdit::UpdateWidgetProperty();
-  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
-  CFX_WideString wsType = GetDataAcc()->GetBarcodeType();
-  XFA_LPCBARCODETYPEENUMINFO pBarcodeTypeInfo =
-      XFA_GetBarcodeTypeByName(wsType);
-  pBarCodeWidget->SetType(pBarcodeTypeInfo->eBCType);
-  CXFA_WidgetAcc* pAcc = GetDataAcc();
-  int32_t intVal;
-  FX_CHAR charVal;
-  FX_BOOL boolVal;
-  FX_FLOAT floatVal;
-  if (pAcc->GetBarcodeAttribute_CharEncoding(intVal)) {
-    pBarCodeWidget->SetCharEncoding((BC_CHAR_ENCODING)intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_Checksum(intVal)) {
-    pBarCodeWidget->SetCalChecksum(intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_DataLength(intVal)) {
-    pBarCodeWidget->SetDataLength(intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_StartChar(charVal)) {
-    pBarCodeWidget->SetStartChar(charVal);
-  }
-  if (pAcc->GetBarcodeAttribute_EndChar(charVal)) {
-    pBarCodeWidget->SetEndChar(charVal);
-  }
-  if (pAcc->GetBarcodeAttribute_ECLevel(intVal)) {
-    pBarCodeWidget->SetErrorCorrectionLevel(intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_ModuleWidth(intVal)) {
-    pBarCodeWidget->SetModuleWidth(intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_ModuleHeight(intVal)) {
-    pBarCodeWidget->SetModuleHeight(intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_PrintChecksum(boolVal)) {
-    pBarCodeWidget->SetPrintChecksum(boolVal);
-  }
-  if (pAcc->GetBarcodeAttribute_TextLocation(intVal)) {
-    pBarCodeWidget->SetTextLocation((BC_TEXT_LOC)intVal);
-  }
-  if (pAcc->GetBarcodeAttribute_Truncate(boolVal)) {
-    pBarCodeWidget->SetTruncated(boolVal);
-  }
-  if (pAcc->GetBarcodeAttribute_WideNarrowRatio(floatVal)) {
-    pBarCodeWidget->SetWideNarrowRatio((int32_t)floatVal);
-  }
-  if (pBarcodeTypeInfo->eName == XFA_BARCODETYPE_code3Of9 ||
-      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean8 ||
-      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_ean13 ||
-      pBarcodeTypeInfo->eName == XFA_BARCODETYPE_upcA) {
-    pBarCodeWidget->SetPrintChecksum(TRUE);
-  }
-}
-FX_BOOL CXFA_FFBarcode::OnLButtonDown(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
-  if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) {
-    return FALSE;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  return CXFA_FFTextEdit::OnLButtonDown(dwFlags, fx, fy);
-}
-FX_BOOL CXFA_FFBarcode::OnRButtonDown(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  CFWL_Barcode* pBarCodeWidget = (CFWL_Barcode*)m_pNormalWidget;
-  if (!pBarCodeWidget || pBarCodeWidget->IsProtectedType()) {
-    return FALSE;
-  }
-  return CXFA_FFTextEdit::OnRButtonDown(dwFlags, fx, fy);
-}
-extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[] = {
-    {0x7fb4a18, L"ean13", XFA_BARCODETYPE_ean13, BC_EAN13},
-    {0x8d13a3d, L"code11", XFA_BARCODETYPE_code11, BC_UNKNOWN},
-    {0x8d149a8, L"code49", XFA_BARCODETYPE_code49, BC_UNKNOWN},
-    {0x8d16347, L"code93", XFA_BARCODETYPE_code93, BC_UNKNOWN},
-    {0x91a92e2, L"upsMaxicode", XFA_BARCODETYPE_upsMaxicode, BC_UNKNOWN},
-    {0xa7d48dc, L"fim", XFA_BARCODETYPE_fim, BC_UNKNOWN},
-    {0xb359fe9, L"msi", XFA_BARCODETYPE_msi, BC_UNKNOWN},
-    {0x121f738c, L"code2Of5Matrix", XFA_BARCODETYPE_code2Of5Matrix, BC_UNKNOWN},
-    {0x15358616, L"ucc128", XFA_BARCODETYPE_ucc128, BC_UNKNOWN},
-    {0x1f4bfa05, L"rfid", XFA_BARCODETYPE_rfid, BC_UNKNOWN},
-    {0x1fda71bc, L"rss14Stacked", XFA_BARCODETYPE_rss14Stacked, BC_UNKNOWN},
-    {0x22065087, L"ean8add2", XFA_BARCODETYPE_ean8add2, BC_UNKNOWN},
-    {0x2206508a, L"ean8add5", XFA_BARCODETYPE_ean8add5, BC_UNKNOWN},
-    {0x2278366c, L"codabar", XFA_BARCODETYPE_codabar, BC_CODABAR},
-    {0x2a039a8d, L"telepen", XFA_BARCODETYPE_telepen, BC_UNKNOWN},
-    {0x323ed337, L"upcApwcd", XFA_BARCODETYPE_upcApwcd, BC_UNKNOWN},
-    {0x347a1846, L"postUSIMB", XFA_BARCODETYPE_postUSIMB, BC_UNKNOWN},
-    {0x391bb836, L"code128", XFA_BARCODETYPE_code128, BC_CODE128},
-    {0x398eddaf, L"dataMatrix", XFA_BARCODETYPE_dataMatrix, BC_DATAMATRIX},
-    {0x3cff60a8, L"upcEadd2", XFA_BARCODETYPE_upcEadd2, BC_UNKNOWN},
-    {0x3cff60ab, L"upcEadd5", XFA_BARCODETYPE_upcEadd5, BC_UNKNOWN},
-    {0x402cb188, L"code2Of5Standard", XFA_BARCODETYPE_code2Of5Standard,
-     BC_UNKNOWN},
-    {0x411764f7, L"aztec", XFA_BARCODETYPE_aztec, BC_UNKNOWN},
-    {0x44d4e84c, L"ean8", XFA_BARCODETYPE_ean8, BC_EAN8},
-    {0x48468902, L"ucc128sscc", XFA_BARCODETYPE_ucc128sscc, BC_UNKNOWN},
-    {0x4880aea4, L"upcAadd2", XFA_BARCODETYPE_upcAadd2, BC_UNKNOWN},
-    {0x4880aea7, L"upcAadd5", XFA_BARCODETYPE_upcAadd5, BC_UNKNOWN},
-    {0x54f18256, L"code2Of5Industrial", XFA_BARCODETYPE_code2Of5Industrial,
-     BC_UNKNOWN},
-    {0x58e15f25, L"rss14Limited", XFA_BARCODETYPE_rss14Limited, BC_UNKNOWN},
-    {0x5c08d1b9, L"postAUSReplyPaid", XFA_BARCODETYPE_postAUSReplyPaid,
-     BC_UNKNOWN},
-    {0x5fa700bd, L"rss14", XFA_BARCODETYPE_rss14, BC_UNKNOWN},
-    {0x631a7e35, L"logmars", XFA_BARCODETYPE_logmars, BC_UNKNOWN},
-    {0x6a236236, L"pdf417", XFA_BARCODETYPE_pdf417, BC_PDF417},
-    {0x6d098ece, L"upcean2", XFA_BARCODETYPE_upcean2, BC_UNKNOWN},
-    {0x6d098ed1, L"upcean5", XFA_BARCODETYPE_upcean5, BC_UNKNOWN},
-    {0x76b04eed, L"code3Of9extended", XFA_BARCODETYPE_code3Of9extended,
-     BC_UNKNOWN},
-    {0x7c7db84a, L"maxicode", XFA_BARCODETYPE_maxicode, BC_UNKNOWN},
-    {0x8266f7f7, L"ucc128random", XFA_BARCODETYPE_ucc128random, BC_UNKNOWN},
-    {0x83eca147, L"postUSDPBC", XFA_BARCODETYPE_postUSDPBC, BC_UNKNOWN},
-    {0x8dd71de0, L"postAUSStandard", XFA_BARCODETYPE_postAUSStandard,
-     BC_UNKNOWN},
-    {0x98adad85, L"plessey", XFA_BARCODETYPE_plessey, BC_UNKNOWN},
-    {0x9f84cce6, L"ean13pwcd", XFA_BARCODETYPE_ean13pwcd, BC_UNKNOWN},
-    {0xb514fbe9, L"upcA", XFA_BARCODETYPE_upcA, BC_UPCA},
-    {0xb514fbed, L"upcE", XFA_BARCODETYPE_upcE, BC_UNKNOWN},
-    {0xb5c6a853, L"ean13add2", XFA_BARCODETYPE_ean13add2, BC_UNKNOWN},
-    {0xb5c6a856, L"ean13add5", XFA_BARCODETYPE_ean13add5, BC_UNKNOWN},
-    {0xb81fc512, L"postUKRM4SCC", XFA_BARCODETYPE_postUKRM4SCC, BC_UNKNOWN},
-    {0xbad34b22, L"code128SSCC", XFA_BARCODETYPE_code128SSCC, BC_UNKNOWN},
-    {0xbfbe0cf6, L"postUS5Zip", XFA_BARCODETYPE_postUS5Zip, BC_UNKNOWN},
-    {0xc56618e8, L"pdf417macro", XFA_BARCODETYPE_pdf417macro, BC_UNKNOWN},
-    {0xca730f8a, L"code2Of5Interleaved", XFA_BARCODETYPE_code2Of5Interleaved,
-     BC_UNKNOWN},
-    {0xd0097ac6, L"rss14Expanded", XFA_BARCODETYPE_rss14Expanded, BC_UNKNOWN},
-    {0xd25a0240, L"postAUSCust2", XFA_BARCODETYPE_postAUSCust2, BC_UNKNOWN},
-    {0xd25a0241, L"postAUSCust3", XFA_BARCODETYPE_postAUSCust3, BC_UNKNOWN},
-    {0xd53ed3e7, L"rss14Truncated", XFA_BARCODETYPE_rss14Truncated, BC_UNKNOWN},
-    {0xe72bcd57, L"code128A", XFA_BARCODETYPE_code128A, BC_UNKNOWN},
-    {0xe72bcd58, L"code128B", XFA_BARCODETYPE_code128B, BC_CODE128_B},
-    {0xe72bcd59, L"code128C", XFA_BARCODETYPE_code128C, BC_CODE128_C},
-    {0xee83c50f, L"rss14StackedOmni", XFA_BARCODETYPE_rss14StackedOmni,
-     BC_UNKNOWN},
-    {0xf2a18f7e, L"QRCode", XFA_BARCODETYPE_QRCode, BC_QR_CODE},
-    {0xfaeaf37f, L"postUSStandard", XFA_BARCODETYPE_postUSStandard, BC_UNKNOWN},
-    {0xfb48155c, L"code3Of9", XFA_BARCODETYPE_code3Of9, BC_CODE39},
-};
-extern const int32_t g_iXFABarcodeTypeCount =
-    sizeof(g_XFABarCodeTypeEnumData) / sizeof(XFA_BARCODETYPEENUMINFO);
-static XFA_LPCBARCODETYPEENUMINFO XFA_GetBarcodeTypeByName(
-    const CFX_WideStringC& wsName) {
-  int32_t iLength = wsName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength, TRUE);
-  int32_t iStart = 0, iEnd = g_iXFABarcodeTypeCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    XFA_LPCBARCODETYPEENUMINFO pInfo = g_XFABarCodeTypeEnumData + iMid;
-    if (uHash == pInfo->uHash) {
-      return pInfo;
-    } else if (uHash < pInfo->uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffbarcode.h b/xfa/src/fxfa/app/xfa_ffbarcode.h
deleted file mode 100644
index d2f8058..0000000
--- a/xfa/src/fxfa/app/xfa_ffbarcode.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFBARCODE_H_
-#define XFA_SRC_FXFA_APP_XFA_FFBARCODE_H_
-
-#include "xfa/include/fxbarcode/BC_BarCode.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-
-class CXFA_FFBarcode : public CXFA_FFTextEdit {
- public:
-  CXFA_FFBarcode(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFBarcode();
-  virtual FX_BOOL LoadWidget();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-};
-
-enum XFA_BARCODETYPEENUM {
-  XFA_BARCODETYPE_aztec,
-  XFA_BARCODETYPE_codabar,
-  XFA_BARCODETYPE_code11,
-  XFA_BARCODETYPE_code128,
-  XFA_BARCODETYPE_code128A,
-  XFA_BARCODETYPE_code128B,
-  XFA_BARCODETYPE_code128C,
-  XFA_BARCODETYPE_code128SSCC,
-  XFA_BARCODETYPE_code2Of5Industrial,
-  XFA_BARCODETYPE_code2Of5Interleaved,
-  XFA_BARCODETYPE_code2Of5Matrix,
-  XFA_BARCODETYPE_code2Of5Standard,
-  XFA_BARCODETYPE_code3Of9,
-  XFA_BARCODETYPE_code3Of9extended,
-  XFA_BARCODETYPE_code49,
-  XFA_BARCODETYPE_code93,
-  XFA_BARCODETYPE_dataMatrix,
-  XFA_BARCODETYPE_ean13,
-  XFA_BARCODETYPE_ean13add2,
-  XFA_BARCODETYPE_ean13add5,
-  XFA_BARCODETYPE_ean13pwcd,
-  XFA_BARCODETYPE_ean8,
-  XFA_BARCODETYPE_ean8add2,
-  XFA_BARCODETYPE_ean8add5,
-  XFA_BARCODETYPE_fim,
-  XFA_BARCODETYPE_logmars,
-  XFA_BARCODETYPE_maxicode,
-  XFA_BARCODETYPE_msi,
-  XFA_BARCODETYPE_pdf417,
-  XFA_BARCODETYPE_pdf417macro,
-  XFA_BARCODETYPE_plessey,
-  XFA_BARCODETYPE_postAUSCust2,
-  XFA_BARCODETYPE_postAUSCust3,
-  XFA_BARCODETYPE_postAUSReplyPaid,
-  XFA_BARCODETYPE_postAUSStandard,
-  XFA_BARCODETYPE_postUKRM4SCC,
-  XFA_BARCODETYPE_postUS5Zip,
-  XFA_BARCODETYPE_postUSDPBC,
-  XFA_BARCODETYPE_postUSIMB,
-  XFA_BARCODETYPE_postUSStandard,
-  XFA_BARCODETYPE_QRCode,
-  XFA_BARCODETYPE_rfid,
-  XFA_BARCODETYPE_rss14,
-  XFA_BARCODETYPE_rss14Expanded,
-  XFA_BARCODETYPE_rss14Limited,
-  XFA_BARCODETYPE_rss14Stacked,
-  XFA_BARCODETYPE_rss14StackedOmni,
-  XFA_BARCODETYPE_rss14Truncated,
-  XFA_BARCODETYPE_telepen,
-  XFA_BARCODETYPE_ucc128,
-  XFA_BARCODETYPE_ucc128random,
-  XFA_BARCODETYPE_ucc128sscc,
-  XFA_BARCODETYPE_upcA,
-  XFA_BARCODETYPE_upcAadd2,
-  XFA_BARCODETYPE_upcAadd5,
-  XFA_BARCODETYPE_upcApwcd,
-  XFA_BARCODETYPE_upcE,
-  XFA_BARCODETYPE_upcEadd2,
-  XFA_BARCODETYPE_upcEadd5,
-  XFA_BARCODETYPE_upcean2,
-  XFA_BARCODETYPE_upcean5,
-  XFA_BARCODETYPE_upsMaxicode
-};
-struct XFA_BARCODETYPEENUMINFO {
-  uint32_t uHash;
-  const FX_WCHAR* pName;
-  XFA_BARCODETYPEENUM eName;
-  BC_TYPE eBCType;
-};
-typedef XFA_BARCODETYPEENUMINFO const* XFA_LPCBARCODETYPEENUMINFO;
-extern const XFA_BARCODETYPEENUMINFO g_XFABarCodeTypeEnumData[];
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFBARCODE_H_
diff --git a/xfa/src/fxfa/app/xfa_ffcheckbutton.cpp b/xfa/src/fxfa/app/xfa_ffcheckbutton.cpp
deleted file mode 100644
index e5a6e80..0000000
--- a/xfa/src/fxfa/app/xfa_ffcheckbutton.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
-
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-#include "xfa/include/fwl/lightwidget/checkbox.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_ffexclgroup.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFCheckButton::CXFA_FFCheckButton(CXFA_FFPageView* pPageView,
-                                       CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {
-  m_rtCheckBox.Set(0, 0, 0, 0);
-}
-CXFA_FFCheckButton::~CXFA_FFCheckButton() {}
-FX_BOOL CXFA_FFCheckButton::LoadWidget() {
-  CFWL_CheckBox* pCheckBox = CFWL_CheckBox::Create();
-  pCheckBox->Initialize();
-  m_pNormalWidget = pCheckBox;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  if (m_pDataAcc->IsRadioButton()) {
-    pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF);
-  }
-  m_pNormalWidget = (CFWL_Widget*)pCheckBox;
-  m_pNormalWidget->SetPrivateData(m_pNormalWidget->GetWidget(), this, NULL);
-  m_pNormalWidget->LockUpdate();
-  UpdateWidgetProperty();
-  XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState();
-  SetFWLCheckState(eState);
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFCheckButton::UpdateWidgetProperty() {
-  CFWL_CheckBox* pCheckBox = (CFWL_CheckBox*)m_pNormalWidget;
-  if (!m_pNormalWidget) {
-    return;
-  }
-  FX_FLOAT fSize = m_pDataAcc->GetCheckButtonSize();
-  pCheckBox->SetBoxSize(fSize);
-  FX_DWORD dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCross;
-  int32_t iCheckMark = m_pDataAcc->GetCheckButtonMark();
-  switch (iCheckMark) {
-    case XFA_ATTRIBUTEENUM_Check:
-      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCheck;
-      break;
-    case XFA_ATTRIBUTEENUM_Circle:
-      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
-      break;
-    case XFA_ATTRIBUTEENUM_Cross:
-      break;
-    case XFA_ATTRIBUTEENUM_Diamond:
-      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeDiamond;
-      break;
-    case XFA_ATTRIBUTEENUM_Square:
-      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeSquare;
-      break;
-    case XFA_ATTRIBUTEENUM_Star:
-      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeStar;
-      break;
-    default: {
-      int32_t iShape = m_pDataAcc->GetCheckButtonShape();
-      if (iShape == XFA_ATTRIBUTEENUM_Round) {
-        dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
-      }
-    } break;
-  }
-  if (m_pDataAcc->IsAllowNeutral()) {
-    dwStyleEx |= FWL_STYLEEXT_CKB_3State;
-  }
-  pCheckBox->ModifyStylesEx(
-      dwStyleEx, FWL_STYLEEXT_CKB_SignShapeMask | FWL_STYLEEXT_CKB_3State);
-}
-FX_BOOL CXFA_FFCheckButton::PerformLayout() {
-  CXFA_FFWidget::PerformLayout();
-  FX_FLOAT fCheckSize = m_pDataAcc->GetCheckButtonSize();
-  CXFA_Margin mgWidget = m_pDataAcc->GetMargin();
-  CFX_RectF rtWidget;
-  GetRectWithoutRotate(rtWidget);
-  if (mgWidget) {
-    XFA_RectWidthoutMargin(rtWidget, mgWidget);
-  }
-  int32_t iCapPlacement = -1;
-  FX_FLOAT fCapReserve = 0;
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  if (caption && caption.GetPresence()) {
-    m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width,
-                    rtWidget.height);
-    iCapPlacement = caption.GetPlacementType();
-    fCapReserve = caption.GetReserve();
-    if (fCapReserve <= 0) {
-      if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
-          iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
-        fCapReserve = rtWidget.height - fCheckSize;
-      } else {
-        fCapReserve = rtWidget.width - fCheckSize;
-      }
-    }
-  }
-  int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
-  int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
-  if (CXFA_Para para = m_pDataAcc->GetPara()) {
-    iHorzAlign = para.GetHorizontalAlign();
-    iVertAlign = para.GetVerticalAlign();
-  }
-  m_rtUI = rtWidget;
-  CXFA_Margin mgCap = caption.GetMargin();
-  switch (iCapPlacement) {
-    case XFA_ATTRIBUTEENUM_Left: {
-      m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(mgCap);
-      m_rtUI.width -= fCapReserve;
-      m_rtUI.left += fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Top: {
-      m_rtCaption.height = fCapReserve;
-      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-      m_rtUI.height -= fCapReserve;
-      m_rtUI.top += fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Right: {
-      m_rtCaption.left = m_rtCaption.right() - fCapReserve;
-      m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(mgCap);
-      m_rtUI.width -= fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Bottom: {
-      m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
-      m_rtCaption.height = fCapReserve;
-      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-      m_rtUI.height -= fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Inline:
-      break;
-    default:
-      iHorzAlign = XFA_ATTRIBUTEENUM_Right;
-      break;
-  }
-  if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) {
-    m_rtUI.left += (m_rtUI.width - fCheckSize) / 2;
-  } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) {
-    m_rtUI.left = m_rtUI.right() - fCheckSize;
-  }
-  if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) {
-    m_rtUI.top += (m_rtUI.height - fCheckSize) / 2;
-  } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) {
-    m_rtUI.top = m_rtUI.bottom() - fCheckSize;
-  }
-  m_rtUI.width = fCheckSize;
-  m_rtUI.height = fCheckSize;
-  AddUIMargin(iCapPlacement);
-  m_rtCheckBox = m_rtUI;
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  if (borderUI) {
-    CXFA_Margin margin = borderUI.GetMargin();
-    if (margin) {
-      XFA_RectWidthoutMargin(m_rtUI, margin);
-    }
-  }
-  m_rtUI.Normalize();
-  LayoutCaption();
-  SetFWLRect();
-  if (m_pNormalWidget) {
-    m_pNormalWidget->Update();
-  }
-  return TRUE;
-}
-void CXFA_FFCheckButton::CapLeftRightPlacement(CXFA_Margin mgCap) {
-  XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-  if (m_rtCaption.height < 0) {
-    m_rtCaption.top += m_rtCaption.height;
-  }
-  if (m_rtCaption.width < 0) {
-    m_rtCaption.left += m_rtCaption.width;
-    m_rtCaption.width = -m_rtCaption.width;
-  }
-}
-void CXFA_FFCheckButton::AddUIMargin(int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
-  m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2;
-  FX_FLOAT fLeftAddRight = rtUIMargin.left + rtUIMargin.width;
-  FX_FLOAT fTopAddBottom = rtUIMargin.top + rtUIMargin.height;
-  if (m_rtUI.width < fLeftAddRight) {
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right ||
-        iCapPlacement == XFA_ATTRIBUTEENUM_Left) {
-      m_rtUI.left -= fLeftAddRight - m_rtUI.width;
-    } else {
-      m_rtUI.left -= 2 * (fLeftAddRight - m_rtUI.width);
-    }
-    m_rtUI.width += 2 * (fLeftAddRight - m_rtUI.width);
-  }
-  if (m_rtUI.height < fTopAddBottom) {
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) {
-      m_rtUI.left -= fTopAddBottom - m_rtUI.height;
-    }
-    m_rtUI.top -= fTopAddBottom - m_rtUI.height;
-    m_rtUI.height += 2 * (fTopAddBottom - m_rtUI.height);
-  }
-}
-void CXFA_FFCheckButton::RenderWidget(CFX_Graphics* pGS,
-                                      CFX_Matrix* pMatrix,
-                                      FX_DWORD dwStatus,
-                                      int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate,
-             m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round
-                 ? XFA_DRAWBOX_ForceRound
-                 : 0);
-  RenderCaption(pGS, &mtRotate);
-  DrawHighlight(pGS, &mtRotate, dwStatus,
-                m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round);
-  CFX_Matrix mt;
-  mt.Set(1, 0, 0, 1, m_rtCheckBox.left, m_rtCheckBox.top);
-  mt.Concat(mtRotate);
-  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
-                                                 pGS, &mt);
-}
-FX_BOOL CXFA_FFCheckButton::OnLButtonUp(FX_DWORD dwFlags,
-                                        FX_FLOAT fx,
-                                        FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (!IsButtonDown()) {
-    return FALSE;
-  }
-  SetButtonDown(FALSE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-XFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() {
-  XFA_CHECKSTATE eCheckState = XFA_CHECKSTATE_Off;
-  FX_DWORD dwState = m_pNormalWidget->GetStates();
-  if (dwState & FWL_STATE_CKB_Checked) {
-    eCheckState = XFA_CHECKSTATE_On;
-  } else if (dwState & FWL_STATE_CKB_Neutral) {
-    eCheckState = XFA_CHECKSTATE_Neutral;
-  }
-  return eCheckState;
-}
-FX_BOOL CXFA_FFCheckButton::CommitData() {
-  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
-  m_pDataAcc->SetCheckState(eCheckState, TRUE);
-  return TRUE;
-}
-FX_BOOL CXFA_FFCheckButton::IsDataChanged() {
-  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
-  return m_pDataAcc->GetCheckState() != eCheckState;
-}
-void CXFA_FFCheckButton::SetFWLCheckState(XFA_CHECKSTATE eCheckState) {
-  if (eCheckState == XFA_CHECKSTATE_Neutral) {
-    m_pNormalWidget->SetStates(FWL_STATE_CKB_Neutral, TRUE);
-  } else {
-    m_pNormalWidget->SetStates(FWL_STATE_CKB_Checked,
-                               eCheckState == XFA_CHECKSTATE_On);
-  }
-}
-FX_BOOL CXFA_FFCheckButton::UpdateFWLData() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState();
-  SetFWLCheckState(eState);
-  m_pNormalWidget->Update();
-  return TRUE;
-}
-int32_t CXFA_FFCheckButton::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFCheckButton::OnProcessEvent(CFWL_Event* pEvent) {
-  CXFA_FFField::OnProcessEvent(pEvent);
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  switch (dwEventID) {
-    case FWL_EVTHASH_CKB_CheckStateChanged: {
-      CXFA_EventParam eParam;
-      eParam.m_eType = XFA_EVENT_Change;
-      m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
-      CXFA_WidgetAcc* pFFExclGroup = m_pDataAcc->GetExclGroup();
-      if (ProcessCommittedData()) {
-        eParam.m_pTarget = pFFExclGroup;
-        if (pFFExclGroup) {
-          m_pDocView->AddValidateWidget(pFFExclGroup);
-          m_pDocView->AddCalculateWidgetAcc(pFFExclGroup);
-          pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
-        }
-        eParam.m_pTarget = m_pDataAcc;
-        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
-      } else {
-        SetFWLCheckState(m_pDataAcc->GetCheckState());
-      }
-      if (pFFExclGroup) {
-        eParam.m_pTarget = pFFExclGroup;
-        pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
-      }
-      eParam.m_pTarget = m_pDataAcc;
-      m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
-      break;
-    }
-    default: {}
-  }
-  return m_pOldDelegate->OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFCheckButton::OnDrawWidget(CFX_Graphics* pGraphics,
-                                         const CFX_Matrix* pMatrix) {
-  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffcheckbutton.h b/xfa/src/fxfa/app/xfa_ffcheckbutton.h
deleted file mode 100644
index 9731d4d..0000000
--- a/xfa/src/fxfa/app/xfa_ffcheckbutton.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFCHECKBUTTON_H_
-#define XFA_SRC_FXFA_APP_XFA_FFCHECKBUTTON_H_
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-
-class CXFA_FFCheckButton : public CXFA_FFField {
- public:
-  CXFA_FFCheckButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFCheckButton();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual FX_BOOL UpdateFWLData();
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  void SetFWLCheckState(XFA_CHECKSTATE eCheckState);
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL IsDataChanged();
-  void CapLeftRightPlacement(CXFA_Margin mgCap);
-  void AddUIMargin(int32_t iCapPlacement);
-  XFA_CHECKSTATE FWLState2XFAState();
-  IFWL_WidgetDelegate* m_pOldDelegate;
-  CFX_RectF m_rtCheckBox;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFCHECKBUTTON_H_
diff --git a/xfa/src/fxfa/app/xfa_ffchoicelist.cpp b/xfa/src/fxfa/app/xfa_ffchoicelist.cpp
deleted file mode 100644
index cb481f5..0000000
--- a/xfa/src/fxfa/app/xfa_ffchoicelist.cpp
+++ /dev/null
@@ -1,530 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/lightwidget/combobox.h"
-#include "xfa/include/fwl/lightwidget/listbox.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-
-CXFA_FFListBox::CXFA_FFListBox(CXFA_FFPageView* pPageView,
-                               CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
-CXFA_FFListBox::~CXFA_FFListBox() {
-  if (m_pNormalWidget) {
-    IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-    IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-    pNoteDriver->UnregisterEventTarget(pWidget);
-  }
-}
-FX_BOOL CXFA_FFListBox::LoadWidget() {
-  CFWL_ListBox* pListBox = CFWL_ListBox::Create();
-  pListBox->Initialize();
-  pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll | FWL_WGTSTYLE_NoBackground,
-                         0xFFFFFFFF);
-  m_pNormalWidget = (CFWL_Widget*)pListBox;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideStringArray wsLabelArray;
-  m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE);
-  int32_t iItems = wsLabelArray.GetSize();
-  for (int32_t i = 0; i < iItems; i++) {
-    pListBox->AddString(wsLabelArray[i]);
-  }
-  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus;
-  if (m_pDataAcc->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection;
-  }
-  dwExtendedStyle |= GetAlignment();
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-  CFX_Int32Array iSelArray;
-  m_pDataAcc->GetSelectedItems(iSelArray);
-  int32_t iSelCount = iSelArray.GetSize();
-  for (int32_t j = 0; j < iSelCount; j++) {
-    FWL_HLISTITEM item = pListBox->GetItem(iSelArray[j]);
-    pListBox->SetSelItem(item, TRUE);
-  }
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-FX_BOOL CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
-  FX_BOOL flag = ProcessCommittedData();
-  if (!flag) {
-    UpdateFWLData();
-  }
-  CXFA_FFField::OnKillFocus(pNewFocus);
-  return TRUE;
-}
-FX_BOOL CXFA_FFListBox::CommitData() {
-  CFWL_ListBox* pListBox = static_cast<CFWL_ListBox*>(m_pNormalWidget);
-  int32_t iSels = pListBox->CountSelItems();
-  CFX_Int32Array iSelArray;
-  for (int32_t i = 0; i < iSels; i++) {
-    iSelArray.Add(pListBox->GetSelIndex(i));
-  }
-  m_pDataAcc->SetSelectdItems(iSelArray, TRUE);
-  return TRUE;
-}
-FX_BOOL CXFA_FFListBox::IsDataChanged() {
-  CFX_Int32Array iSelArray;
-  m_pDataAcc->GetSelectedItems(iSelArray);
-  int32_t iOldSels = iSelArray.GetSize();
-  CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
-  int32_t iSels = pListBox->CountSelItems();
-  if (iOldSels == iSels) {
-    int32_t iIndex = 0;
-    for (; iIndex < iSels; iIndex++) {
-      FWL_HLISTITEM hlistItem = pListBox->GetItem(iSelArray[iIndex]);
-      if (!(pListBox->GetItemStates(hlistItem) && FWL_ITEMSTATE_LTB_Selected)) {
-        break;
-      }
-    }
-    if (iIndex == iSels) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-FX_DWORD CXFA_FFListBox::GetAlignment() {
-  FX_DWORD dwExtendedStyle = 0;
-  if (CXFA_Para para = m_pDataAcc->GetPara()) {
-    int32_t iHorz = para.GetHorizontalAlign();
-    switch (iHorz) {
-      case XFA_ATTRIBUTEENUM_Center:
-        dwExtendedStyle |= FWL_STYLEEXT_LTB_CenterAlign;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        break;
-      case XFA_ATTRIBUTEENUM_Radix:
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        dwExtendedStyle |= FWL_STYLEEXT_LTB_RightAlign;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_LTB_LeftAlign;
-        break;
-    }
-  }
-  return dwExtendedStyle;
-}
-FX_BOOL CXFA_FFListBox::UpdateFWLData() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_ListBox* pListBox = ((CFWL_ListBox*)m_pNormalWidget);
-  CFX_ArrayTemplate<FWL_HLISTITEM> selItemArray;
-  CFX_Int32Array iSelArray;
-  m_pDataAcc->GetSelectedItems(iSelArray);
-  int32_t iSelCount = iSelArray.GetSize();
-  for (int32_t j = 0; j < iSelCount; j++) {
-    FWL_HLISTITEM lpItemSel = pListBox->GetSelItem(iSelArray[j]);
-    selItemArray.Add(lpItemSel);
-  }
-  pListBox->SetSelItem(pListBox->GetSelItem(-1), FALSE);
-  for (int32_t i = 0; i < iSelCount; i++) {
-    ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(selItemArray[i], TRUE);
-  }
-  m_pNormalWidget->Update();
-  return TRUE;
-}
-void CXFA_FFListBox::OnSelectChanged(IFWL_Widget* pWidget,
-                                     const CFX_Int32Array& arrSels) {
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Change;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
-  CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
-  int32_t iSels = pListBox->CountSelItems();
-  if (iSels > 0) {
-    pListBox->GetItemText(pListBox->GetSelItem(0), eParam.m_wsNewText);
-  }
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
-}
-void CXFA_FFListBox::SetItemState(int32_t nIndex, FX_BOOL bSelected) {
-  FWL_HLISTITEM item = ((CFWL_ListBox*)m_pNormalWidget)->GetSelItem(nIndex);
-  ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(item, bSelected);
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-void CXFA_FFListBox::InsertItem(const CFX_WideStringC& wsLabel,
-                                int32_t nIndex) {
-  CFX_WideString wsTemp(wsLabel);
-  ((CFWL_ListBox*)m_pNormalWidget)->AddString(wsTemp);
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-void CXFA_FFListBox::DeleteItem(int32_t nIndex) {
-  if (nIndex < 0) {
-    ((CFWL_ListBox*)m_pNormalWidget)->DeleteAll();
-  } else {
-    ((CFWL_ListBox*)m_pNormalWidget)
-        ->DeleteString(((CFWL_ListBox*)m_pNormalWidget)->GetItem(nIndex));
-  }
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-int32_t CXFA_FFListBox::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFListBox::OnProcessEvent(CFWL_Event* pEvent) {
-  CXFA_FFField::OnProcessEvent(pEvent);
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  switch (dwEventID) {
-    case FWL_EVTHASH_LTB_SelChanged: {
-      CFX_Int32Array arrSels;
-      OnSelectChanged(m_pNormalWidget->GetWidget(), arrSels);
-      break;
-    }
-    default: {}
-  }
-  return m_pOldDelegate->OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFListBox::OnDrawWidget(CFX_Graphics* pGraphics,
-                                     const CFX_Matrix* pMatrix) {
-  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
-}
-
-CXFA_FFComboBox::CXFA_FFComboBox(CXFA_FFPageView* pPageView,
-                                 CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
-
-CXFA_FFComboBox::~CXFA_FFComboBox() {}
-
-FX_BOOL CXFA_FFComboBox::GetBBox(CFX_RectF& rtBox,
-                                 FX_DWORD dwStatus,
-                                 FX_BOOL bDrawFocus) {
-  if (bDrawFocus)
-    return FALSE;
-  return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
-}
-
-FX_BOOL CXFA_FFComboBox::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFX_RectF rtWidget;
-  ((CFWL_ComboBox*)m_pNormalWidget)->GetBBox(rtWidget);
-  if (rtWidget.Contains(fx, fy)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_FFComboBox::LoadWidget() {
-  CFWL_ComboBox* pComboBox = CFWL_ComboBox::Create();
-  pComboBox->Initialize();
-  m_pNormalWidget = (CFWL_Widget*)pComboBox;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideStringArray wsLabelArray;
-  m_pDataAcc->GetChoiceListItems(wsLabelArray, FALSE);
-  int32_t iItems = wsLabelArray.GetSize();
-  for (int32_t i = 0; i < iItems; i++) {
-    pComboBox->AddString(wsLabelArray[i]);
-  }
-  CFX_Int32Array iSelArray;
-  m_pDataAcc->GetSelectedItems(iSelArray);
-  int32_t iSelCount = iSelArray.GetSize();
-  if (iSelCount > 0) {
-    pComboBox->SetCurSel(iSelArray[0]);
-  } else {
-    CFX_WideString wsText;
-    m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
-    pComboBox->SetEditText(wsText);
-  }
-  UpdateWidgetProperty();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFComboBox::UpdateWidgetProperty() {
-  CFWL_ComboBox* pComboBox = (CFWL_ComboBox*)m_pNormalWidget;
-  if (!pComboBox) {
-    return;
-  }
-  FX_DWORD dwExtendedStyle = 0;
-  FX_DWORD dwEditStyles =
-      FWL_STYLEEXT_EDT_ReadOnly | FWL_STYLEEXT_EDT_LastLineHeight;
-  dwExtendedStyle |= UpdateUIProperty();
-  if (m_pDataAcc->IsChoiceListAllowTextEntry()) {
-    dwEditStyles &= ~FWL_STYLEEXT_EDT_ReadOnly;
-    dwExtendedStyle |= FWL_STYLEEXT_CMB_DropDown;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
-    dwExtendedStyle |= FWL_STYLEEXT_CMB_ReadOnly;
-  }
-  dwExtendedStyle |= GetAlignment();
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-    dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
-  }
-  pComboBox->EditModifyStylesEx(dwEditStyles, 0xFFFFFFFF);
-}
-FX_BOOL CXFA_FFComboBox::OnRButtonUp(FX_DWORD dwFlags,
-                                     FX_FLOAT fx,
-                                     FX_FLOAT fy) {
-  if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy))
-    return FALSE;
-
-  GetDoc()->GetDocProvider()->PopupMenu(this, CFX_PointF(fx, fy), nullptr);
-  return TRUE;
-}
-FX_BOOL CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
-  FX_BOOL flag = ProcessCommittedData();
-  if (!flag) {
-    UpdateFWLData();
-  }
-  CXFA_FFField::OnKillFocus(pNewWidget);
-  return TRUE;
-}
-void CXFA_FFComboBox::OpenDropDownList() {
-  ((CFWL_ComboBox*)m_pNormalWidget)->OpenDropDownList(TRUE);
-}
-FX_BOOL CXFA_FFComboBox::CommitData() {
-  return m_pDataAcc->SetValue(m_wsNewValue, XFA_VALUEPICTURE_Raw);
-}
-FX_BOOL CXFA_FFComboBox::IsDataChanged() {
-  CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
-  CFX_WideString wsText;
-  pFWLcombobox->GetEditText(wsText);
-  int32_t iCursel = pFWLcombobox->GetCurSel();
-  if (iCursel >= 0) {
-    CFX_WideString wsSel;
-    pFWLcombobox->GetTextByIndex(iCursel, wsSel);
-    if (wsSel == wsText) {
-      m_pDataAcc->GetChoiceListItem(wsText, iCursel, TRUE);
-    }
-  }
-  CFX_WideString wsOldValue;
-  m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Raw);
-  if (wsOldValue != wsText) {
-    m_wsNewValue = wsText;
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_FFComboBox::FWLEventSelChange(CXFA_EventParam* pParam) {
-  pParam->m_eType = XFA_EVENT_Change;
-  pParam->m_pTarget = m_pDataAcc;
-  CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
-  pFWLcombobox->GetEditText(pParam->m_wsNewText);
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, pParam);
-}
-FX_DWORD CXFA_FFComboBox::GetAlignment() {
-  FX_DWORD dwExtendedStyle = 0;
-  if (CXFA_Para para = m_pDataAcc->GetPara()) {
-    int32_t iHorz = para.GetHorizontalAlign();
-    switch (iHorz) {
-      case XFA_ATTRIBUTEENUM_Center:
-        dwExtendedStyle |=
-            FWL_STYLEEXT_CMB_EditHCenter | FWL_STYLEEXT_CMB_ListItemCenterAlign;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditJustified;
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        break;
-      case XFA_ATTRIBUTEENUM_Radix:
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        break;
-      default:
-        dwExtendedStyle |=
-            FWL_STYLEEXT_CMB_EditHNear | FWL_STYLEEXT_CMB_ListItemLeftAlign;
-        break;
-    }
-    int32_t iVert = para.GetVerticalAlign();
-    switch (iVert) {
-      case XFA_ATTRIBUTEENUM_Middle:
-        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVCenter;
-        break;
-      case XFA_ATTRIBUTEENUM_Bottom:
-        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVFar;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVNear;
-        break;
-    }
-  }
-  return dwExtendedStyle;
-}
-FX_BOOL CXFA_FFComboBox::UpdateFWLData() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFX_Int32Array iSelArray;
-  m_pDataAcc->GetSelectedItems(iSelArray);
-  int32_t iSelCount = iSelArray.GetSize();
-  if (iSelCount > 0) {
-    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(iSelArray[0]);
-  } else {
-    CFX_WideString wsText;
-    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
-    m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
-    ((CFWL_ComboBox*)m_pNormalWidget)->SetEditText(wsText);
-  }
-  m_pNormalWidget->Update();
-  return TRUE;
-}
-FX_BOOL CXFA_FFComboBox::CanUndo() {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanUndo();
-}
-FX_BOOL CXFA_FFComboBox::CanRedo() {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanRedo();
-}
-FX_BOOL CXFA_FFComboBox::Undo() {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditUndo();
-}
-FX_BOOL CXFA_FFComboBox::Redo() {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditRedo();
-}
-FX_BOOL CXFA_FFComboBox::CanCopy() {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCopy();
-}
-FX_BOOL CXFA_FFComboBox::CanCut() {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCut();
-}
-FX_BOOL CXFA_FFComboBox::CanPaste() {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         (m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open);
-}
-FX_BOOL CXFA_FFComboBox::CanSelectAll() {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanSelectAll();
-}
-FX_BOOL CXFA_FFComboBox::Copy(CFX_WideString& wsCopy) {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditCopy(wsCopy);
-}
-FX_BOOL CXFA_FFComboBox::Cut(CFX_WideString& wsCut) {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditCut(wsCut);
-}
-FX_BOOL CXFA_FFComboBox::Paste(const CFX_WideString& wsPaste) {
-  return m_pDataAcc->IsChoiceListAllowTextEntry() &&
-         ((CFWL_ComboBox*)m_pNormalWidget)->EditPaste(wsPaste);
-}
-FX_BOOL CXFA_FFComboBox::SelectAll() {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditSelectAll();
-}
-FX_BOOL CXFA_FFComboBox::Delete() {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditDelete();
-}
-FX_BOOL CXFA_FFComboBox::DeSelect() {
-  return ((CFWL_ComboBox*)m_pNormalWidget)->EditDeSelect();
-}
-void CXFA_FFComboBox::SetItemState(int32_t nIndex, FX_BOOL bSelected) {
-  if (bSelected) {
-    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(nIndex);
-  } else {
-    ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
-  }
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-void CXFA_FFComboBox::InsertItem(const CFX_WideStringC& wsLabel,
-                                 int32_t nIndex) {
-  ((CFWL_ComboBox*)m_pNormalWidget)->AddString(wsLabel);
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-void CXFA_FFComboBox::DeleteItem(int32_t nIndex) {
-  if (nIndex < 0) {
-    ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAll();
-  } else {
-    ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAt(nIndex);
-  }
-  m_pNormalWidget->Update();
-  AddInvalidateRect();
-}
-void CXFA_FFComboBox::OnTextChanged(IFWL_Widget* pWidget,
-                                    const CFX_WideString& wsChanged) {
-  CXFA_EventParam eParam;
-  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
-  eParam.m_wsChange = wsChanged;
-  FWLEventSelChange(&eParam);
-}
-void CXFA_FFComboBox::OnSelectChanged(IFWL_Widget* pWidget,
-                                      const CFX_Int32Array& arrSels,
-                                      FX_BOOL bLButtonUp) {
-  CXFA_EventParam eParam;
-  m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
-  FWLEventSelChange(&eParam);
-  if (m_pDataAcc->GetChoiceListCommitOn() == XFA_ATTRIBUTEENUM_Select &&
-      bLButtonUp) {
-    m_pDocView->SetFocusWidgetAcc(NULL);
-  }
-}
-void CXFA_FFComboBox::OnPreOpen(IFWL_Widget* pWidget) {
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_PreOpen;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PreOpen, &eParam);
-}
-void CXFA_FFComboBox::OnPostOpen(IFWL_Widget* pWidget) {
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_PostOpen;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PostOpen, &eParam);
-}
-
-int32_t CXFA_FFComboBox::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFComboBox::OnProcessEvent(CFWL_Event* pEvent) {
-  CXFA_FFField::OnProcessEvent(pEvent);
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  switch (dwEventID) {
-    case FWL_EVTHASH_CMB_SelChanged: {
-      CFWL_EvtCmbSelChanged* postEvent = (CFWL_EvtCmbSelChanged*)pEvent;
-      OnSelectChanged(m_pNormalWidget->GetWidget(), postEvent->iArraySels,
-                      postEvent->bLButtonUp);
-      break;
-    }
-    case FWL_EVTHASH_CMB_EditChanged: {
-      CFX_WideString wsChanged;
-      OnTextChanged(m_pNormalWidget->GetWidget(), wsChanged);
-      break;
-    }
-    case FWL_EVTHASH_CMB_PreDropDown: {
-      OnPreOpen(m_pNormalWidget->GetWidget());
-      break;
-    }
-    case FWL_EVTHASH_CMB_PostDropDown: {
-      OnPostOpen(m_pNormalWidget->GetWidget());
-      break;
-    }
-    default: {}
-  }
-  return m_pOldDelegate->OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFComboBox::OnDrawWidget(CFX_Graphics* pGraphics,
-                                      const CFX_Matrix* pMatrix) {
-  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffchoicelist.h b/xfa/src/fxfa/app/xfa_ffchoicelist.h
deleted file mode 100644
index 781360f..0000000
--- a/xfa/src/fxfa/app/xfa_ffchoicelist.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFCHOICELIST_H_
-#define XFA_SRC_FXFA_APP_XFA_FFCHOICELIST_H_
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-
-class CXFA_FFListBox : public CXFA_FFField {
- public:
-  CXFA_FFListBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFListBox();
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-
- protected:
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-  FX_DWORD GetAlignment();
-
- public:
-  void OnSelectChanged(IFWL_Widget* pWidget, const CFX_Int32Array& arrSels);
-  void SetItemState(int32_t nIndex, FX_BOOL bSelected);
-  void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
-  void DeleteItem(int32_t nIndex);
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  IFWL_WidgetDelegate* m_pOldDelegate;
-};
-class CXFA_FFComboBox : public CXFA_FFField {
- public:
-  CXFA_FFComboBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFComboBox();
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          FX_DWORD dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-
-  virtual FX_BOOL CanCopy();
-  virtual FX_BOOL CanCut();
-  virtual FX_BOOL CanPaste();
-  virtual FX_BOOL CanSelectAll();
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL SelectAll();
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL DeSelect();
-  void OpenDropDownList();
-
- protected:
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-  FX_DWORD GetAlignment();
-  void FWLEventSelChange(CXFA_EventParam* pParam);
-
-  CFX_WideString m_wsNewValue;
-
- public:
-  void OnTextChanged(IFWL_Widget* pWidget, const CFX_WideString& wsChanged);
-  void OnSelectChanged(IFWL_Widget* pWidget,
-                       const CFX_Int32Array& arrSels,
-                       FX_BOOL bLButtonUp);
-  void OnPreOpen(IFWL_Widget* pWidget);
-  void OnPostOpen(IFWL_Widget* pWidget);
-  void SetItemState(int32_t nIndex, FX_BOOL bSelected);
-  void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
-  void DeleteItem(int32_t nIndex);
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  IFWL_WidgetDelegate* m_pOldDelegate;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFCHOICELIST_H_
diff --git a/xfa/src/fxfa/app/xfa_ffdoc.cpp b/xfa/src/fxfa/app/xfa_ffdoc.cpp
deleted file mode 100644
index 0e45417..0000000
--- a/xfa/src/fxfa/app/xfa_ffdoc.cpp
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-
-#include "core/include/fpdfapi/cpdf_array.h"
-#include "core/include/fpdfapi/cpdf_document.h"
-#include "core/include/fpdfdoc/fpdf_doc.h"
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/include/fwl/core/fwl_note.h"
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_ffnotify.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fontmgr.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-
-CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider)
-    : m_pDocProvider(pDocProvider),
-      m_pDocument(nullptr),
-      m_pStream(nullptr),
-      m_pApp(pApp),
-      m_pNotify(nullptr),
-      m_pPDFDoc(nullptr),
-      m_dwDocType(XFA_DOCTYPE_Static),
-      m_bOwnStream(TRUE) {}
-CXFA_FFDoc::~CXFA_FFDoc() {
-  CloseDoc();
-}
-FX_DWORD CXFA_FFDoc::GetDocType() {
-  return m_dwDocType;
-}
-int32_t CXFA_FFDoc::StartLoad() {
-  m_pNotify = new CXFA_FFNotify(this);
-  IXFA_DocParser* pDocParser = IXFA_DocParser::Create(m_pNotify);
-  int32_t iStatus = pDocParser->StartParse(m_pStream);
-  m_pDocument = pDocParser->GetDocument();
-  return iStatus;
-}
-FX_BOOL XFA_GetPDFContentsFromPDFXML(IFDE_XMLNode* pPDFElement,
-                                     uint8_t*& pByteBuffer,
-                                     int32_t& iBufferSize) {
-  IFDE_XMLElement* pDocumentElement = NULL;
-  for (IFDE_XMLNode* pXMLNode =
-           pPDFElement->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      CFX_WideString wsTagName;
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      pXMLElement->GetTagName(wsTagName);
-      if (wsTagName.Equal(FX_WSTRC(L"document"))) {
-        pDocumentElement = pXMLElement;
-        break;
-      }
-    }
-  }
-  if (!pDocumentElement) {
-    return FALSE;
-  }
-  IFDE_XMLElement* pChunkElement = NULL;
-  for (IFDE_XMLNode* pXMLNode =
-           pDocumentElement->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      CFX_WideString wsTagName;
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      pXMLElement->GetTagName(wsTagName);
-      if (wsTagName.Equal(FX_WSTRC(L"chunk"))) {
-        pChunkElement = pXMLElement;
-        break;
-      }
-    }
-  }
-  if (!pChunkElement) {
-    return FALSE;
-  }
-  CFX_WideString wsPDFContent;
-  pChunkElement->GetTextData(wsPDFContent);
-  iBufferSize = FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), NULL);
-  pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1);
-  pByteBuffer[iBufferSize] = '0';  // FIXME: I bet this is wrong.
-  FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), pByteBuffer);
-  return TRUE;
-}
-void XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) {
-  CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChildNode) {
-    CXFA_Node* pOriginChild =
-        pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash());
-    if (pOriginChild) {
-      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    } else {
-      CXFA_Node* pNextSibling =
-          pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      pNewRoot->RemoveChild(pChildNode);
-      pOriginRoot->InsertChild(pChildNode);
-      pChildNode = pNextSibling;
-      pNextSibling = NULL;
-    }
-  }
-}
-int32_t CXFA_FFDoc::DoLoad(IFX_Pause* pPause) {
-  int32_t iStatus = m_pDocument->GetParser()->DoParse(pPause);
-  if (iStatus == XFA_PARSESTATUS_Done && !m_pPDFDoc) {
-    CXFA_Node* pPDFNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Pdf));
-    if (!pPDFNode) {
-      return XFA_PARSESTATUS_SyntaxErr;
-    }
-    IFDE_XMLNode* pPDFXML = pPDFNode->GetXMLMappingNode();
-    if (pPDFXML->GetType() != FDE_XMLNODE_Element) {
-      return XFA_PARSESTATUS_SyntaxErr;
-    }
-    int32_t iBufferSize = 0;
-    uint8_t* pByteBuffer = NULL;
-    IFX_FileRead* pXFAReader = NULL;
-    if (XFA_GetPDFContentsFromPDFXML(pPDFXML, pByteBuffer, iBufferSize)) {
-      pXFAReader = FX_CreateMemoryStream(pByteBuffer, iBufferSize, TRUE);
-    } else {
-      CFX_WideString wsHref;
-      ((IFDE_XMLElement*)pPDFXML)->GetString(L"href", wsHref);
-      if (!wsHref.IsEmpty()) {
-        pXFAReader = GetDocProvider()->OpenLinkedFile(this, wsHref);
-      }
-    }
-    if (!pXFAReader) {
-      return XFA_PARSESTATUS_SyntaxErr;
-    }
-    CPDF_Document* pPDFDocument =
-        GetDocProvider()->OpenPDF(this, pXFAReader, TRUE);
-    FXSYS_assert(!m_pPDFDoc);
-    if (!OpenDoc(pPDFDocument)) {
-      return XFA_PARSESTATUS_SyntaxErr;
-    }
-    IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument, TRUE);
-    if (!pParser) {
-      return XFA_PARSESTATUS_SyntaxErr;
-    }
-    CXFA_Node* pRootNode = NULL;
-    if (pParser->StartParse(m_pStream) == XFA_PARSESTATUS_Ready &&
-        pParser->DoParse(NULL) == XFA_PARSESTATUS_Done) {
-      pRootNode = pParser->GetRootNode();
-    }
-    if (pRootNode && m_pDocument->GetRoot()) {
-      XFA_XPDPacket_MergeRootNode(m_pDocument->GetRoot(), pRootNode);
-      iStatus = XFA_PARSESTATUS_Done;
-    } else {
-      iStatus = XFA_PARSESTATUS_StatusErr;
-    }
-    pParser->Release();
-    pParser = NULL;
-  }
-  return iStatus;
-}
-void CXFA_FFDoc::StopLoad() {
-  m_pApp->GetXFAFontMgr()->LoadDocFonts(this);
-  m_dwDocType = XFA_DOCTYPE_Static;
-  CXFA_Node* pConfig = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
-  if (!pConfig) {
-    return;
-  }
-  CXFA_Node* pAcrobat = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
-  if (!pAcrobat) {
-    return;
-  }
-  CXFA_Node* pAcrobat7 = pAcrobat->GetFirstChildByClass(XFA_ELEMENT_Acrobat7);
-  if (!pAcrobat7) {
-    return;
-  }
-  CXFA_Node* pDynamicRender =
-      pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender);
-  if (!pDynamicRender) {
-    return;
-  }
-  CFX_WideString wsType;
-  if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) {
-    m_dwDocType = XFA_DOCTYPE_Dynamic;
-  }
-}
-IXFA_DocView* CXFA_FFDoc::CreateDocView(FX_DWORD dwView) {
-  CXFA_FFDocView* pDocView =
-      (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView);
-  if (!pDocView) {
-    pDocView = new CXFA_FFDocView(this);
-    m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView);
-  }
-  return pDocView;
-}
-CXFA_FFDocView* CXFA_FFDoc::GetDocView(IXFA_DocLayout* pLayout) {
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  while (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    if (pDocView->GetXFALayout() == pLayout) {
-      return pDocView;
-    }
-  }
-  return NULL;
-}
-CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  if (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    return pDocView;
-  }
-  return NULL;
-}
-FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
-  m_bOwnStream = bTakeOverFile;
-  m_pStream = pStream;
-  return TRUE;
-}
-FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) {
-  if (pPDFDoc == NULL) {
-    return FALSE;
-  }
-  CPDF_Dictionary* pRoot = pPDFDoc->GetRoot();
-  if (pRoot == NULL) {
-    return FALSE;
-  }
-  CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
-  if (pAcroForm == NULL) {
-    return FALSE;
-  }
-  CPDF_Object* pElementXFA = pAcroForm->GetElementValue("XFA");
-  if (pElementXFA == NULL) {
-    return FALSE;
-  }
-  CFX_ArrayTemplate<CPDF_Stream*> xfaStreams;
-  if (pElementXFA->IsArray()) {
-    CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA;
-    FX_DWORD count = pXFAArray->GetCount() / 2;
-    for (FX_DWORD i = 0; i < count; i++) {
-      if (CPDF_Stream* pStream = pXFAArray->GetStreamAt(i * 2 + 1))
-        xfaStreams.Add(pStream);
-    }
-  } else if (pElementXFA->IsStream()) {
-    xfaStreams.Add((CPDF_Stream*)pElementXFA);
-  }
-  if (xfaStreams.GetSize() < 1) {
-    return FALSE;
-  }
-  IFX_FileRead* pFileRead = new CXFA_FileRead(xfaStreams);
-  m_pPDFDoc = pPDFDoc;
-  if (m_pStream) {
-    m_pStream->Release();
-    m_pStream = NULL;
-  }
-  m_pStream = pFileRead;
-  m_bOwnStream = TRUE;
-  return TRUE;
-}
-FX_BOOL CXFA_FFDoc::CloseDoc() {
-  FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition();
-  while (psClose) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView);
-    pDocView->RunDocClose();
-  }
-  if (m_pDocument) {
-    m_pDocument->ClearLayoutData();
-  }
-  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
-  while (ps) {
-    void* pType;
-    CXFA_FFDocView* pDocView;
-    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
-    delete pDocView;
-  }
-  m_mapTypeToDocView.RemoveAll();
-  if (m_pDocument) {
-    IXFA_Parser* pParser = m_pDocument->GetParser();
-    pParser->Release();
-    m_pDocument = NULL;
-  }
-  if (m_pNotify) {
-    delete m_pNotify;
-    m_pNotify = NULL;
-  }
-  m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
-  if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
-    m_pStream->Release();
-    m_pStream = NULL;
-  }
-  ps = m_mapNamedImages.GetStartPosition();
-  while (ps) {
-    void* pName;
-    FX_IMAGEDIB_AND_DPI* pImage = NULL;
-    m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage);
-    if (pImage) {
-      delete pImage->pDibSource;
-      pImage->pDibSource = NULL;
-      FX_Free(pImage);
-      pImage = NULL;
-    }
-  }
-  m_mapNamedImages.RemoveAll();
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->ClearEventTargets(FALSE);
-  return TRUE;
-}
-void CXFA_FFDoc::SetDocType(FX_DWORD dwType) {
-  m_dwDocType = dwType;
-}
-CPDF_Document* CXFA_FFDoc::GetPDFDoc() {
-  return m_pPDFDoc;
-}
-
-CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName,
-                                           int32_t& iImageXDpi,
-                                           int32_t& iImageYDpi) {
-  if (!m_pPDFDoc)
-    return nullptr;
-
-  FX_DWORD dwHash =
-      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), FALSE);
-  FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr;
-  if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) {
-    iImageXDpi = imageDIBDpi->iImageXDpi;
-    iImageYDpi = imageDIBDpi->iImageYDpi;
-    return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource);
-  }
-
-  CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
-  if (!pRoot)
-    return nullptr;
-
-  CPDF_Dictionary* pNames = pRoot->GetDictBy("Names");
-  if (!pNames)
-    return nullptr;
-
-  CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages");
-  if (!pXFAImages)
-    return nullptr;
-
-  CPDF_NameTree nametree(pXFAImages);
-  CFX_ByteString bsName = PDF_EncodeText(wsName.GetPtr(), wsName.GetLength());
-  CPDF_Object* pObject = nametree.LookupValue(bsName);
-  if (!pObject) {
-    int32_t iCount = nametree.GetCount();
-    for (int32_t i = 0; i < iCount; i++) {
-      CFX_ByteString bsTemp;
-      CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp);
-      if (bsTemp == bsName) {
-        pObject = pTempObject;
-        break;
-      }
-    }
-  }
-
-  if (!pObject || !pObject->IsStream())
-    return nullptr;
-
-  if (!imageDIBDpi) {
-    imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1);
-    imageDIBDpi->pDibSource = nullptr;
-    imageDIBDpi->iImageXDpi = 0;
-    imageDIBDpi->iImageYDpi = 0;
-    CPDF_StreamAcc streamAcc;
-    streamAcc.LoadAllData((CPDF_Stream*)pObject);
-    IFX_FileRead* pImageFileRead = FX_CreateMemoryStream(
-        (uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
-    imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(
-        pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
-    imageDIBDpi->iImageXDpi = iImageXDpi;
-    imageDIBDpi->iImageYDpi = iImageYDpi;
-    pImageFileRead->Release();
-  }
-  m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
-  return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
-}
-
-IFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
-  FX_DWORD packetHash =
-      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
-  CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
-  if (!pNode) {
-    return NULL;
-  }
-  IFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode();
-  return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element)
-             ? (IFDE_XMLElement*)pXMLNode
-             : NULL;
-}
-FX_BOOL CXFA_FFDoc::SavePackage(const CFX_WideStringC& wsPackage,
-                                IFX_FileWrite* pFile,
-                                IXFA_ChecksumContext* pCSContext) {
-  IXFA_PacketExport* pExport = IXFA_PacketExport::Create(m_pDocument);
-  if (!pExport) {
-    return FALSE;
-  }
-  FX_DWORD packetHash =
-      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
-  CXFA_Node* pNode = NULL;
-  if (packetHash == XFA_HASHCODE_Xfa) {
-    pNode = m_pDocument->GetRoot();
-  } else {
-    pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
-  }
-  FX_BOOL bFlags = FALSE;
-  if (pNode) {
-    CFX_ByteString bsChecksum;
-    if (pCSContext) {
-      pCSContext->GetChecksum(bsChecksum);
-    }
-    bFlags = pExport->Export(pFile, pNode, 0, bsChecksum.GetLength()
-                                                  ? (const FX_CHAR*)bsChecksum
-                                                  : NULL);
-  } else {
-    bFlags = pExport->Export(pFile);
-  }
-  pExport->Release();
-  return bFlags;
-}
-FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) {
-  FX_BOOL bRet = FALSE;
-  IXFA_PacketImport* pImport = IXFA_PacketImport::Create(m_pDocument);
-  if (pImport) {
-    bRet = pImport->ImportData(pStream);
-    pImport->Release();
-  }
-  return bRet;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffdoc.h b/xfa/src/fxfa/app/xfa_ffdoc.h
deleted file mode 100644
index c598013..0000000
--- a/xfa/src/fxfa/app/xfa_ffdoc.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFDOC_H_
-#define XFA_SRC_FXFA_APP_XFA_FFDOC_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-class CXFA_FFApp;
-class CXFA_FFNotify;
-class CXFA_FFDocView;
-
-struct FX_IMAGEDIB_AND_DPI {
-  CFX_DIBSource* pDibSource;
-  int32_t iImageXDpi;
-  int32_t iImageYDpi;
-};
-
-class CXFA_FFDoc : public IXFA_Doc {
- public:
-  CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider);
-  ~CXFA_FFDoc();
-  IXFA_DocProvider* GetDocProvider() { return m_pDocProvider; }
-  FX_DWORD GetDocType();
-  int32_t StartLoad();
-  int32_t DoLoad(IFX_Pause* pPause = NULL);
-  void StopLoad();
-  IXFA_DocView* CreateDocView(FX_DWORD dwView = 0);
-  FX_BOOL OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile);
-  FX_BOOL OpenDoc(CPDF_Document* pPDFDoc);
-  FX_BOOL CloseDoc();
-  void SetDocType(FX_DWORD dwType);
-  CXFA_Document* GetXFADoc() { return m_pDocument; }
-  CXFA_FFApp* GetApp() { return m_pApp; }
-  CXFA_FFDocView* GetDocView(IXFA_DocLayout* pLayout);
-  CXFA_FFDocView* GetDocView();
-  CPDF_Document* GetPDFDoc();
-  CFX_DIBitmap* GetPDFNamedImage(const CFX_WideStringC& wsName,
-                                 int32_t& iImageXDpi,
-                                 int32_t& iImageYDpi);
-  IFDE_XMLElement* GetPackageData(const CFX_WideStringC& wsPackage);
-  FX_BOOL SavePackage(const CFX_WideStringC& wsPackage,
-                      IFX_FileWrite* pFile,
-                      IXFA_ChecksumContext* pCSContext = NULL);
-  FX_BOOL ImportData(IFX_FileRead* pStream, FX_BOOL bXDP = TRUE);
-
- protected:
-  IXFA_DocProvider* m_pDocProvider;
-  CXFA_Document* m_pDocument;
-  IFX_FileRead* m_pStream;
-  CXFA_FFApp* m_pApp;
-  CXFA_FFNotify* m_pNotify;
-  CPDF_Document* m_pPDFDoc;
-  CFX_MapPtrToPtr m_mapNamedImages;
-  CFX_MapPtrToPtr m_mapTypeToDocView;
-  FX_DWORD m_dwDocType;
-  FX_BOOL m_bOwnStream;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFDOC_H_
diff --git a/xfa/src/fxfa/app/xfa_ffdochandler.cpp b/xfa/src/fxfa/app/xfa_ffdochandler.cpp
deleted file mode 100644
index f247365..0000000
--- a/xfa/src/fxfa/app/xfa_ffdochandler.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffdochandler.h"
-
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-CXFA_FFDocHandler::CXFA_FFDocHandler() {}
-CXFA_FFDocHandler::~CXFA_FFDocHandler() {}
-void CXFA_FFDocHandler::ReleaseDoc(IXFA_Doc* hDoc) {
-  delete hDoc;  // virtual dtor.
-}
-IXFA_DocProvider* CXFA_FFDocHandler::GetDocProvider(IXFA_Doc* hDoc) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocProvider();
-}
-FX_DWORD CXFA_FFDocHandler::GetDocType(IXFA_Doc* hDoc) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->GetDocType();
-}
-int32_t CXFA_FFDocHandler::StartLoad(IXFA_Doc* hDoc) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->StartLoad();
-}
-int32_t CXFA_FFDocHandler::DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->DoLoad(pPause);
-}
-void CXFA_FFDocHandler::StopLoad(IXFA_Doc* hDoc) {
-  static_cast<CXFA_FFDoc*>(hDoc)->StopLoad();
-}
-
-IXFA_DocView* CXFA_FFDocHandler::CreateDocView(IXFA_Doc* hDoc,
-                                               FX_DWORD dwView) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->CreateDocView(dwView);
-}
-int32_t CXFA_FFDocHandler::CountPackages(IXFA_Doc* hDoc) {
-  return 0;
-}
-void CXFA_FFDocHandler::GetPackageName(IXFA_Doc* hDoc,
-                                       int32_t iPackage,
-                                       CFX_WideStringC& wsPackage) {}
-IFDE_XMLElement* CXFA_FFDocHandler::GetPackageData(
-    IXFA_Doc* hDoc,
-    const CFX_WideStringC& wsPackage) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->GetPackageData(wsPackage);
-}
-FX_BOOL CXFA_FFDocHandler::SavePackage(IXFA_Doc* hDoc,
-                                       const CFX_WideStringC& wsPackage,
-                                       IFX_FileWrite* pFile,
-                                       IXFA_ChecksumContext* pCSContext) {
-  return static_cast<CXFA_FFDoc*>(hDoc)
-      ->SavePackage(wsPackage, pFile, pCSContext);
-}
-FX_BOOL CXFA_FFDocHandler::CloseDoc(IXFA_Doc* hDoc) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->CloseDoc();
-}
-
-FX_BOOL CXFA_FFDocHandler::ImportData(IXFA_Doc* hDoc,
-                                      IFX_FileRead* pStream,
-                                      FX_BOOL bXDP) {
-  return static_cast<CXFA_FFDoc*>(hDoc)->ImportData(pStream, bXDP);
-}
-void CXFA_FFDocHandler::SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime) {
-  static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc()->InitScriptContext(hRuntime);
-}
-FXJSE_HVALUE CXFA_FFDocHandler::GetXFAScriptObject(IXFA_Doc* hDoc) {
-  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
-  if (!pXFADoc) {
-    return NULL;
-  }
-  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
-  if (!pScriptContext) {
-    return NULL;
-  }
-  return pScriptContext->GetJSValueFromMap(pXFADoc->GetRoot());
-}
-XFA_ATTRIBUTEENUM CXFA_FFDocHandler::GetRestoreState(IXFA_Doc* hDoc) {
-  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
-  if (!pXFADoc) {
-    return XFA_ATTRIBUTEENUM_Unknown;
-  }
-  CXFA_Node* pForm = ToNode(pXFADoc->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pForm) {
-    return XFA_ATTRIBUTEENUM_Unknown;
-  }
-  CXFA_Node* pSubForm = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
-  if (!pSubForm) {
-    return XFA_ATTRIBUTEENUM_Unknown;
-  }
-  return pSubForm->GetEnum(XFA_ATTRIBUTE_RestoreState);
-}
-FX_BOOL CXFA_FFDocHandler::RunDocScript(IXFA_Doc* hDoc,
-                                        XFA_SCRIPTTYPE eScriptType,
-                                        const CFX_WideStringC& wsScript,
-                                        FXJSE_HVALUE hRetValue,
-                                        FXJSE_HVALUE hThisObject) {
-  CXFA_Document* pXFADoc = static_cast<CXFA_FFDoc*>(hDoc)->GetXFADoc();
-  if (!pXFADoc) {
-    return FALSE;
-  }
-  IXFA_ScriptContext* pScriptContext = pXFADoc->GetScriptContext();
-  if (!pScriptContext) {
-    return FALSE;
-  }
-  return pScriptContext->RunScript(
-      (XFA_SCRIPTLANGTYPE)eScriptType, wsScript, hRetValue,
-      hThisObject ? (CXFA_Object*)FXJSE_Value_ToObject(hThisObject, NULL)
-                  : NULL);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffdochandler.h b/xfa/src/fxfa/app/xfa_ffdochandler.h
deleted file mode 100644
index e324bff..0000000
--- a/xfa/src/fxfa/app/xfa_ffdochandler.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFDOCHANDLER_H_
-#define XFA_SRC_FXFA_APP_XFA_FFDOCHANDLER_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-
-class CXFA_FFDocHandler : public IXFA_DocHandler {
- public:
-  CXFA_FFDocHandler();
-  ~CXFA_FFDocHandler();
-  virtual void ReleaseDoc(IXFA_Doc* hDoc);
-  virtual IXFA_DocProvider* GetDocProvider(IXFA_Doc* hDoc);
-  virtual FX_DWORD GetDocType(IXFA_Doc* hDoc);
-  virtual int32_t StartLoad(IXFA_Doc* hDoc);
-  virtual int32_t DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause = NULL);
-  virtual void StopLoad(IXFA_Doc* hDoc);
-
-  virtual IXFA_DocView* CreateDocView(IXFA_Doc* hDoc, FX_DWORD dwView = 0);
-  virtual int32_t CountPackages(IXFA_Doc* hDoc);
-  virtual void GetPackageName(IXFA_Doc* hDoc,
-                              int32_t iPackage,
-                              CFX_WideStringC& wsPackage);
-  virtual IFDE_XMLElement* GetPackageData(IXFA_Doc* hDoc,
-                                          const CFX_WideStringC& wsPackage);
-  virtual FX_BOOL SavePackage(IXFA_Doc* hDoc,
-                              const CFX_WideStringC& wsPackage,
-                              IFX_FileWrite* pFile,
-                              IXFA_ChecksumContext* pCSContext = NULL);
-  virtual FX_BOOL CloseDoc(IXFA_Doc* hDoc);
-  virtual FX_BOOL ImportData(IXFA_Doc* hDoc,
-                             IFX_FileRead* pStream,
-                             FX_BOOL bXDP = TRUE);
-  virtual void SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime);
-  virtual FXJSE_HVALUE GetXFAScriptObject(IXFA_Doc* hDoc);
-  virtual XFA_ATTRIBUTEENUM GetRestoreState(IXFA_Doc* hDoc);
-  virtual FX_BOOL RunDocScript(IXFA_Doc* hDoc,
-                               XFA_SCRIPTTYPE eScriptType,
-                               const CFX_WideStringC& wsScript,
-                               FXJSE_HVALUE hRetValue,
-                               FXJSE_HVALUE hThisObject);
-
- protected:
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFDOCHANDLER_H_
diff --git a/xfa/src/fxfa/app/xfa_ffdocview.cpp b/xfa/src/fxfa/app/xfa_ffdocview.cpp
deleted file mode 100644
index 3c94a69..0000000
--- a/xfa/src/fxfa/app/xfa_ffdocview.cpp
+++ /dev/null
@@ -1,932 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffbarcode.h"
-#include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-#include "xfa/src/fxfa/app/xfa_ffexclgroup.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffimage.h"
-#include "xfa/src/fxfa/app/xfa_ffimageedit.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffpath.h"
-#include "xfa/src/fxfa/app/xfa_ffpushbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffsignature.h"
-#include "xfa/src/fxfa/app/xfa_ffsubform.h"
-#include "xfa/src/fxfa/app/xfa_fftext.h"
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgetacc.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgethandler.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = {
-    XFA_ATTRIBUTEENUM_Click,      XFA_ATTRIBUTEENUM_Change,
-    XFA_ATTRIBUTEENUM_DocClose,   XFA_ATTRIBUTEENUM_DocReady,
-    XFA_ATTRIBUTEENUM_Enter,      XFA_ATTRIBUTEENUM_Exit,
-    XFA_ATTRIBUTEENUM_Full,       XFA_ATTRIBUTEENUM_IndexChange,
-    XFA_ATTRIBUTEENUM_Initialize, XFA_ATTRIBUTEENUM_MouseDown,
-    XFA_ATTRIBUTEENUM_MouseEnter, XFA_ATTRIBUTEENUM_MouseExit,
-    XFA_ATTRIBUTEENUM_MouseUp,    XFA_ATTRIBUTEENUM_PostExecute,
-    XFA_ATTRIBUTEENUM_PostOpen,   XFA_ATTRIBUTEENUM_PostPrint,
-    XFA_ATTRIBUTEENUM_PostSave,   XFA_ATTRIBUTEENUM_PostSign,
-    XFA_ATTRIBUTEENUM_PostSubmit, XFA_ATTRIBUTEENUM_PreExecute,
-    XFA_ATTRIBUTEENUM_PreOpen,    XFA_ATTRIBUTEENUM_PrePrint,
-    XFA_ATTRIBUTEENUM_PreSave,    XFA_ATTRIBUTEENUM_PreSign,
-    XFA_ATTRIBUTEENUM_PreSubmit,  XFA_ATTRIBUTEENUM_Ready,
-    XFA_ATTRIBUTEENUM_Unknown,
-};
-CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc)
-    : m_bLayoutEvent(FALSE),
-      m_pListFocusWidget(nullptr),
-      m_bInLayoutStatus(FALSE),
-      m_pDoc(pDoc),
-      m_pWidgetHandler(nullptr),
-      m_pXFADocLayout(nullptr),
-      m_pFocusAcc(nullptr),
-      m_pFocusWidget(nullptr),
-      m_pOldFocusWidget(nullptr),
-      m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None),
-      m_iLock(0) {}
-CXFA_FFDocView::~CXFA_FFDocView() {
-  DestroyDocView();
-  if (m_pWidgetHandler) {
-    delete m_pWidgetHandler;
-  }
-  m_pWidgetHandler = NULL;
-}
-void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
-  RunBindItems();
-  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize);
-  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange);
-}
-int32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) {
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
-  m_pDoc->GetXFADoc()->DoProtoMerge();
-  m_pDoc->GetXFADoc()->DoDataMerge();
-  m_pXFADocLayout = GetXFALayout();
-  int32_t iStatus = m_pXFADocLayout->StartLayout();
-  if (iStatus < 0) {
-    return iStatus;
-  }
-  CXFA_Node* pRootItem =
-      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pRootItem) {
-    return iStatus;
-  }
-  InitLayout(pRootItem);
-  InitCalculate(pRootItem);
-  InitValidate(pRootItem);
-  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE);
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
-  return iStatus;
-}
-int32_t CXFA_FFDocView::DoLayout(IFX_Pause* pPause) {
-  int32_t iStatus = 100;
-  iStatus = m_pXFADocLayout->DoLayout(pPause);
-  if (iStatus != 100) {
-    return iStatus;
-  }
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing;
-  return iStatus;
-}
-void CXFA_FFDocView::StopLayout() {
-  CXFA_Node* pRootItem =
-      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pRootItem) {
-    return;
-  }
-  CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
-  if (!pSubformNode) {
-    return;
-  }
-  CXFA_Node* pPageSetNode =
-      pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet);
-  if (!pPageSetNode) {
-    return;
-  }
-  RunCalculateWidgets();
-  RunValidate();
-  InitLayout(pPageSetNode);
-  InitCalculate(pPageSetNode);
-  InitValidate(pPageSetNode);
-  ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE);
-  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
-  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady);
-  RunCalculateWidgets();
-  RunValidate();
-  if (RunLayout()) {
-    ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
-  }
-  m_CalculateAccs.RemoveAll();
-  if (m_pFocusAcc && !m_pFocusWidget) {
-    SetFocusWidgetAcc(m_pFocusAcc);
-  }
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End;
-}
-int32_t CXFA_FFDocView::GetLayoutStatus() {
-  return m_iStatus;
-}
-void CXFA_FFDocView::ShowNullTestMsg() {
-  int32_t iCount = m_arrNullTestMsg.GetSize();
-  CXFA_FFApp* pApp = m_pDoc->GetApp();
-  IXFA_AppProvider* pAppProvider = pApp->GetAppProvider();
-  if (pAppProvider && iCount) {
-    int32_t iRemain = iCount > 7 ? iCount - 7 : 0;
-    iCount -= iRemain;
-    CFX_WideString wsMsg;
-    for (int32_t i = 0; i < iCount; i++) {
-      wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n");
-    }
-    if (iRemain > 0) {
-      CFX_WideString wsLimit;
-      pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit);
-      if (!wsLimit.IsEmpty()) {
-        CFX_WideString wsTemp;
-        wsTemp.Format((const FX_WCHAR*)wsLimit, iRemain);
-        wsMsg += FX_WSTRC(L"\n") + wsTemp;
-      }
-    }
-    CFX_WideString wsTitle;
-    pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
-    pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
-  }
-  m_arrNullTestMsg.RemoveAll();
-}
-void CXFA_FFDocView::UpdateDocView() {
-  if (IsUpdateLocked()) {
-    return;
-  }
-  LockUpdate();
-  int32_t iNewAdds = m_NewAddedNodes.GetSize();
-  for (int32_t i = 0; i < iNewAdds; i++) {
-    CXFA_Node* pNode = reinterpret_cast<CXFA_Node*>(m_NewAddedNodes[i]);
-    InitCalculate(pNode);
-    InitValidate(pNode);
-    ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE);
-  }
-  m_NewAddedNodes.RemoveAll();
-  RunSubformIndexChange();
-  RunCalculateWidgets();
-  RunValidate();
-  ShowNullTestMsg();
-  if (RunLayout() && m_bLayoutEvent) {
-    RunEventLayoutReady();
-  }
-  m_bLayoutEvent = FALSE;
-  m_CalculateAccs.RemoveAll();
-  RunInvalidate();
-  UnlockUpdate();
-}
-int32_t CXFA_FFDocView::CountPageViews() {
-  if (!m_pXFADocLayout) {
-    return 0;
-  }
-  return m_pXFADocLayout->CountPages();
-}
-IXFA_PageView* CXFA_FFDocView::GetPageView(int32_t nIndex) {
-  if (!m_pXFADocLayout) {
-    return NULL;
-  }
-  return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex));
-}
-IXFA_Widget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName) {
-  return GetWidgetByName(wsName, NULL);
-}
-CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
-    const CFX_WideStringC& wsName) {
-  return GetWidgetAccByName(wsName, NULL);
-}
-IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const {
-  return m_pDoc->GetXFADoc()->GetDocLayout();
-}
-FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) {
-  CXFA_Node* pNode = pWidgetAcc->GetNode();
-  XFA_ELEMENT eType = pNode->GetClassID();
-  if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) {
-    return FALSE;
-  }
-  FX_BOOL bNotify = IsStaticNotify();
-  pWidgetAcc->ResetData();
-  pWidgetAcc->UpdateUIDisplay();
-  if (bNotify) {
-    pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL,
-                            NULL);
-  }
-  if (CXFA_Validate validate = pWidgetAcc->GetValidate()) {
-    AddValidateWidget(pWidgetAcc);
-    validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
-  }
-  return TRUE;
-}
-void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) {
-  m_bLayoutEvent = TRUE;
-  FX_BOOL bChanged = FALSE;
-  CXFA_Node* pFormNode = NULL;
-  if (pWidgetAcc) {
-    bChanged = ResetSingleWidgetAccData(pWidgetAcc);
-    pFormNode = pWidgetAcc->GetNode();
-  } else {
-    pFormNode = GetRootSubform();
-  }
-  if (!pFormNode) {
-    return;
-  }
-  if (pFormNode->GetClassID() != XFA_ELEMENT_Field &&
-      pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) {
-    CXFA_WidgetAccIterator Iterator(this, pFormNode);
-    while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) {
-      bChanged |= ResetSingleWidgetAccData(pAcc);
-      if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) {
-        Iterator.SkipTree();
-      }
-    }
-  }
-  if (bChanged) {
-    m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
-  }
-}
-int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam,
-                                           CXFA_WidgetAcc* pWidgetAcc) {
-  if (pParam == NULL) {
-    return XFA_EVENTERROR_Error;
-  }
-  if (pParam->m_eType == XFA_EVENT_Validate) {
-    CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit");
-    CXFA_Node* pConfigItem =
-        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Config));
-    if (pConfigItem) {
-      CXFA_Node* pValidateNode = NULL;
-      CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat);
-      pValidateNode =
-          pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL;
-      if (!pValidateNode) {
-        CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present);
-        pValidateNode = pPresentNode
-                            ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate)
-                            : NULL;
-      }
-      if (pValidateNode) {
-        wsValidateStr = pValidateNode->GetContent();
-      }
-    }
-    FX_BOOL bValidate = FALSE;
-    switch (pParam->m_iValidateActivities) {
-      case XFA_VALIDATE_preSubmit:
-        bValidate = wsValidateStr.Find(L"preSubmit") != -1;
-        break;
-      case XFA_VALIDATE_prePrint:
-        bValidate = wsValidateStr.Find(L"prePrint") != -1;
-        break;
-      case XFA_VALIDATE_preExecute:
-        bValidate = wsValidateStr.Find(L"preExecute") != -1;
-        break;
-      case XFA_VALIDATE_preSave:
-        bValidate = wsValidateStr.Find(L"preSave") != -1;
-        break;
-    }
-    if (!bValidate) {
-      return XFA_EVENTERROR_Sucess;
-    }
-  }
-  CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL;
-  if (!pNode) {
-    CXFA_Node* pRootItem =
-        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-    if (!pRootItem) {
-      return XFA_EVENTERROR_Error;
-    }
-    pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
-  }
-  ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady);
-  return XFA_EVENTERROR_Sucess;
-}
-IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() {
-  if (!m_pWidgetHandler) {
-    m_pWidgetHandler = new CXFA_FFWidgetHandler(this);
-  }
-  return m_pWidgetHandler;
-}
-IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() {
-  CXFA_Node* pFormRoot = GetRootSubform();
-  if (!pFormRoot) {
-    return NULL;
-  }
-  return new CXFA_FFDocWidgetIterator(this, pFormRoot);
-}
-IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator(
-    XFA_WIDGETORDER eOrder) {
-  CXFA_Node* pFormRoot = GetRootSubform();
-  if (!pFormRoot) {
-    return NULL;
-  }
-  return new CXFA_WidgetAccIterator(this, pFormRoot);
-}
-IXFA_Widget* CXFA_FFDocView::GetFocusWidget() {
-  return m_pFocusWidget;
-}
-void CXFA_FFDocView::KillFocus() {
-  if (m_pFocusWidget &&
-      (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
-    (m_pFocusWidget)->OnKillFocus(NULL);
-  }
-  m_pFocusAcc = NULL;
-  m_pFocusWidget = NULL;
-  m_pOldFocusWidget = NULL;
-}
-FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) {
-  CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget;
-  if (m_pOldFocusWidget == pNewFocus) {
-    return FALSE;
-  }
-  CXFA_FFWidget* pOldFocus = m_pOldFocusWidget;
-  m_pOldFocusWidget = pNewFocus;
-  if (pOldFocus) {
-    if (m_pFocusWidget != m_pOldFocusWidget &&
-        (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
-      m_pFocusWidget = pOldFocus;
-      pOldFocus->OnKillFocus(pNewFocus);
-    } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
-      if (!pOldFocus->IsLoaded()) {
-        pOldFocus->LoadWidget();
-      }
-      pOldFocus->OnSetFocus(m_pFocusWidget);
-      m_pFocusWidget = pOldFocus;
-      pOldFocus->OnKillFocus(pNewFocus);
-    }
-  }
-  if (m_pFocusWidget == m_pOldFocusWidget) {
-    return FALSE;
-  }
-  pNewFocus = m_pOldFocusWidget;
-  if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) {
-    m_pFocusAcc = NULL;
-    m_pFocusWidget = NULL;
-    m_pListFocusWidget = NULL;
-    m_pOldFocusWidget = NULL;
-    return FALSE;
-  }
-  if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
-    if (!pNewFocus->IsLoaded()) {
-      pNewFocus->LoadWidget();
-    }
-    pNewFocus->OnSetFocus(m_pFocusWidget);
-  }
-  m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL;
-  m_pFocusWidget = pNewFocus;
-  m_pOldFocusWidget = m_pFocusWidget;
-  return TRUE;
-}
-CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() {
-  return m_pFocusAcc;
-}
-void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
-  CXFA_FFWidget* pNewFocus =
-      pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL;
-  if (SetFocus(pNewFocus)) {
-    m_pFocusAcc = pWidgetAcc;
-    if (m_iStatus == XFA_DOCVIEW_LAYOUTSTATUS_End) {
-      m_pDoc->GetDocProvider()->SetFocusWidget(m_pDoc, m_pFocusWidget);
-    }
-  }
-}
-void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) {
-  if (m_pFocusAcc == pWidget->GetDataAcc()) {
-    m_pFocusAcc = NULL;
-    m_pFocusWidget = NULL;
-    m_pOldFocusWidget = NULL;
-  }
-}
-static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView,
-                                CXFA_WidgetAcc* pWidgetAcc,
-                                CXFA_EventParam* pParam) {
-  if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  switch (pParam->m_eType) {
-    case XFA_EVENT_Calculate:
-      return pWidgetAcc->ProcessCalculate();
-    case XFA_EVENT_Validate:
-      if (((CXFA_FFDoc*)pDocView->GetDoc())
-              ->GetDocProvider()
-              ->IsValidationsEnabled(pDocView->GetDoc())) {
-        return pWidgetAcc->ProcessValidate(0x01);
-      }
-      return XFA_EVENTERROR_Disabled;
-    case XFA_EVENT_InitCalculate: {
-      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
-      if (!calc) {
-        return XFA_EVENTERROR_NotExist;
-      }
-      if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-        return XFA_EVENTERROR_Disabled;
-      }
-      CXFA_Script script = calc.GetScript();
-      return pWidgetAcc->ExecuteScript(script, pParam);
-    }
-    default:
-      break;
-  }
-  int32_t iRet =
-      pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
-  return iRet;
-}
-int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
-                                                     XFA_EVENTTYPE eEventType,
-                                                     FX_BOOL bIsFormReady,
-                                                     FX_BOOL bRecursive,
-                                                     CXFA_Node* pExclude) {
-  int32_t iRet = XFA_EVENTERROR_NotExist;
-  if (pFormNode == pExclude) {
-    return iRet;
-  }
-  XFA_ELEMENT elementType = pFormNode->GetClassID();
-  if (elementType == XFA_ELEMENT_Field) {
-    if (eEventType == XFA_EVENT_IndexChange) {
-      return iRet;
-    }
-    CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
-    if (pWidgetAcc == NULL) {
-      return iRet;
-    }
-    CXFA_EventParam eParam;
-    eParam.m_eType = eEventType;
-    eParam.m_pTarget = pWidgetAcc;
-    eParam.m_bIsFormReady = bIsFormReady;
-    return XFA_ProcessEvent(this, pWidgetAcc, &eParam);
-  }
-  if (bRecursive) {
-    for (CXFA_Node* pNode = pFormNode->GetNodeItem(
-             XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
-         pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling,
-                                           XFA_OBJECTTYPE_ContainerNode)) {
-      elementType = pNode->GetClassID();
-      if (elementType != XFA_ELEMENT_Variables &&
-          elementType != XFA_ELEMENT_Draw) {
-        iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady,
-                                             bRecursive, pExclude);
-      }
-    }
-  }
-  CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
-  if (pWidgetAcc == NULL) {
-    return iRet;
-  }
-  CXFA_EventParam eParam;
-  eParam.m_eType = eEventType;
-  eParam.m_pTarget = pWidgetAcc;
-  eParam.m_bIsFormReady = bIsFormReady;
-  iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam);
-  return iRet;
-}
-CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName,
-                                               CXFA_FFWidget* pRefWidget) {
-  CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL;
-  if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) {
-    return pAcc->GetNextWidget(NULL);
-  }
-  return NULL;
-}
-CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
-    const CFX_WideStringC& wsName,
-    CXFA_WidgetAcc* pRefWidgetAcc) {
-  CFX_WideString wsExpression;
-  FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
-  IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext();
-  if (!pScriptContext) {
-    return NULL;
-  }
-  CXFA_Node* refNode = NULL;
-  if (pRefWidgetAcc) {
-    refNode = pRefWidgetAcc->GetNode();
-    wsExpression = wsName;
-  } else {
-    wsExpression = L"$form." + wsName;
-  }
-  XFA_RESOLVENODE_RS resoveNodeRS;
-  int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
-                                                resoveNodeRS, dwStyle);
-  if (iRet < 1) {
-    return NULL;
-  }
-  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    CXFA_Node* pNode = resoveNodeRS.nodes[0]->AsNode();
-    if (pNode) {
-      return (CXFA_WidgetAcc*)pNode->GetWidgetData();
-    }
-  }
-  return NULL;
-}
-void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage* pSender,
-                                 XFA_PAGEEVENT eEvent,
-                                 int32_t iPageIndex) {
-  CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender);
-  if (eEvent == XFA_PAGEEVENT_PageRemoved) {
-    m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
-                                            XFA_PAGEVIEWEVENT_PostRemoved);
-    return;
-  }
-  m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
-                                          XFA_PAGEVIEWEVENT_PostAdded);
-  pFFPageView->LoadPageView();
-}
-void CXFA_FFDocView::LockUpdate() {
-  m_iLock++;
-}
-void CXFA_FFDocView::UnlockUpdate() {
-  m_iLock--;
-}
-FX_BOOL CXFA_FFDocView::IsUpdateLocked() {
-  return m_iLock;
-}
-void CXFA_FFDocView::ClearInvalidateList() {
-  FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
-  while (ps) {
-    void* pPageView = NULL;
-    CFX_RectF* pRect = NULL;
-    m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect);
-    delete pRect;
-  }
-  m_mapPageInvalidate.RemoveAll();
-}
-void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget,
-                                       const CFX_RectF& rtInvalidate) {
-  AddInvalidateRect(pWidget->GetPageView(), rtInvalidate);
-}
-void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView,
-                                       const CFX_RectF& rtInvalidate) {
-  CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView);
-  if (!pRect) {
-    pRect = new CFX_RectF;
-    pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width,
-               rtInvalidate.height);
-    m_mapPageInvalidate.SetAt(pPageView, pRect);
-  } else {
-    pRect->Union(rtInvalidate);
-  }
-}
-void CXFA_FFDocView::RunInvalidate() {
-  FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
-  while (ps) {
-    IXFA_PageView* pPageView = NULL;
-    CFX_RectF* pRect = NULL;
-    m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect);
-    m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect);
-    delete pRect;
-  }
-  m_mapPageInvalidate.RemoveAll();
-}
-FX_BOOL CXFA_FFDocView::RunLayout() {
-  LockUpdate();
-  m_bInLayoutStatus = TRUE;
-  if (!m_pXFADocLayout->IncrementLayout() &&
-      m_pXFADocLayout->StartLayout() < 100) {
-    m_pXFADocLayout->DoLayout();
-    UnlockUpdate();
-    m_bInLayoutStatus = FALSE;
-    return TRUE;
-  }
-  m_bInLayoutStatus = FALSE;
-  UnlockUpdate();
-  return FALSE;
-}
-void CXFA_FFDocView::RunSubformIndexChange() {
-  int32_t iSubforms = m_IndexChangedSubforms.GetSize();
-  for (int32_t i = 0; i < iSubforms; i++) {
-    CXFA_Node* pSubformNode =
-        reinterpret_cast<CXFA_Node*>(m_IndexChangedSubforms[i]);
-    CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData();
-    if (!pWidgetAcc) {
-      continue;
-    }
-    CXFA_EventParam eParam;
-    eParam.m_eType = XFA_EVENT_IndexChange;
-    eParam.m_pTarget = pWidgetAcc;
-    pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam);
-  }
-  m_IndexChangedSubforms.RemoveAll();
-}
-void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) {
-  m_NewAddedNodes.Add(pNode);
-  InitLayout(pNode);
-}
-void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) {
-  FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform);
-  m_IndexChangedSubforms.Add(pNode);
-}
-void CXFA_FFDocView::RunDocClose() {
-  CXFA_Node* pRootItem =
-      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pRootItem) {
-    return;
-  }
-  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose);
-}
-void CXFA_FFDocView::DestroyDocView() {
-  ClearInvalidateList();
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
-  m_iLock = 0;
-  m_ValidateAccs.RemoveAll();
-  m_bindItems.RemoveAll();
-  m_CalculateAccs.RemoveAll();
-}
-FX_BOOL CXFA_FFDocView::IsStaticNotify() {
-  return m_pDoc->GetDocType() == XFA_DOCTYPE_Static;
-}
-void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
-  int32_t iAccs = m_CalculateAccs.GetSize();
-  CXFA_WidgetAcc* pCurrentAcc =
-      (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
-                  : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
-  if (pCurrentAcc != pWidgetAcc) {
-    m_CalculateAccs.Add(pWidgetAcc);
-  }
-}
-void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) {
-  CXFA_CalcData* pGlobalData =
-      (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData);
-  int32_t iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0;
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i];
-    if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-      continue;
-    }
-    int32_t iAccs = m_CalculateAccs.GetSize();
-    CXFA_WidgetAcc* pCurrentAcc =
-        (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
-                    : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
-    if (pCurrentAcc != pResultAcc) {
-      m_CalculateAccs.Add(pResultAcc);
-    }
-  }
-}
-void CXFA_FFDocView::RunCalculateRecursive(int32_t& iIndex) {
-  while (iIndex < m_CalculateAccs.GetSize()) {
-    CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex];
-    AddCalculateNodeNotify(pCurAcc->GetNode());
-    int32_t iRefCount =
-        (int32_t)(uintptr_t)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount);
-    iRefCount++;
-    pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount,
-                                    (void*)(uintptr_t)iRefCount);
-    if (iRefCount > 11) {
-      break;
-    }
-    if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) {
-      AddValidateWidget(pCurAcc);
-    }
-    iIndex++;
-    RunCalculateRecursive(iIndex);
-  }
-}
-int32_t CXFA_FFDocView::RunCalculateWidgets() {
-  if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled(m_pDoc)) {
-    return XFA_EVENTERROR_Disabled;
-  }
-  int32_t iCounts = m_CalculateAccs.GetSize();
-  int32_t iIndex = 0;
-  if (iCounts > 0) {
-    RunCalculateRecursive(iIndex);
-  }
-  for (int32_t i = 0; i < m_CalculateAccs.GetSize(); i++) {
-    CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i];
-    pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (void*)(uintptr_t)0);
-  }
-  m_CalculateAccs.RemoveAll();
-  return XFA_EVENTERROR_Sucess;
-}
-void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) {
-  if (m_ValidateAccs.Find(pWidget) < 0) {
-    m_ValidateAccs.Add(pWidget);
-  }
-}
-FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) {
-  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate);
-  return TRUE;
-}
-FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) {
-  if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
-    return FALSE;
-  }
-  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate);
-  m_ValidateAccs.RemoveAll();
-  return TRUE;
-}
-FX_BOOL CXFA_FFDocView::RunValidate() {
-  if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
-    return FALSE;
-  }
-  int32_t iCounts = m_ValidateAccs.GetSize();
-  for (int32_t i = 0; i < iCounts; i++) {
-    CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i];
-    if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-      continue;
-    }
-    pAcc->ProcessValidate();
-  }
-  m_ValidateAccs.RemoveAll();
-  return TRUE;
-}
-FX_BOOL CXFA_FFDocView::RunEventLayoutReady() {
-  CXFA_Node* pRootItem =
-      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pRootItem) {
-    return FALSE;
-  }
-  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
-  RunLayout();
-  return TRUE;
-}
-void CXFA_FFDocView::RunBindItems() {
-  int32_t iCount = m_bindItems.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    if (reinterpret_cast<CXFA_Node*>(m_bindItems[i])
-            ->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-      continue;
-    }
-    CXFA_Node* pWidgetNode = reinterpret_cast<CXFA_Node*>(m_bindItems[i])
-                                 ->GetNodeItem(XFA_NODEITEM_Parent);
-    CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData();
-    if (!pAcc) {
-      continue;
-    }
-    CXFA_BindItems binditems(reinterpret_cast<CXFA_Node*>(m_bindItems[i]));
-    IXFA_ScriptContext* pScriptContext =
-        pWidgetNode->GetDocument()->GetScriptContext();
-    CFX_WideStringC wsRef;
-    binditems.GetRef(wsRef);
-    FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                       XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
-                       XFA_RESOLVENODE_ALL;
-    XFA_RESOLVENODE_RS rs;
-    pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle);
-    int32_t iCount = rs.nodes.GetSize();
-    pAcc->DeleteItem(-1);
-    if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) {
-      continue;
-    }
-    CFX_WideStringC wsValueRef, wsLabelRef;
-    binditems.GetValueRef(wsValueRef);
-    binditems.GetLabelRef(wsLabelRef);
-    const bool bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef;
-    const bool bLabelUseContent =
-        wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$");
-    const bool bValueUseContent =
-        wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$");
-    CFX_WideString wsValue, wsLabel;
-    FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef),
-                                                  wsValueRef.GetLength());
-    for (int32_t i = 0; i < iCount; i++) {
-      CXFA_Object* refObj = rs.nodes[i];
-      if (!refObj->IsNode()) {
-        continue;
-      }
-      CXFA_Node* refNode = refObj->AsNode();
-      if (bValueUseContent) {
-        wsValue = refNode->GetContent();
-      } else {
-        CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash);
-        if (nodeValue == NULL) {
-          wsValue = refNode->GetContent();
-        } else {
-          wsValue = nodeValue->GetContent();
-        }
-      }
-      if (!bUseValue) {
-        if (bLabelUseContent) {
-          wsLabel = refNode->GetContent();
-        } else {
-          CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef);
-          if (nodeLabel)
-            wsLabel = nodeLabel->GetContent();
-        }
-      } else {
-        wsLabel = wsValue;
-      }
-      pAcc->InsertItem(wsLabel, wsValue);
-    }
-  }
-  m_bindItems.RemoveAll();
-}
-void CXFA_FFDocView::SetChangeMark() {
-  if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) {
-    return;
-  }
-  m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
-}
-CXFA_Node* CXFA_FFDocView::GetRootSubform() {
-  CXFA_Node* pFormPacketNode =
-      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pFormPacketNode) {
-    return NULL;
-  }
-  return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform);
-}
-CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView,
-                                                   CXFA_Node* pTravelRoot)
-    : m_ContentIterator(pTravelRoot) {
-  m_pDocView = pDocView;
-  m_pCurWidget = NULL;
-}
-CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() {}
-void CXFA_FFDocWidgetIterator::Reset() {
-  m_ContentIterator.Reset();
-  m_pCurWidget = NULL;
-}
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToFirst() {
-  return NULL;
-}
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToLast() {
-  return NULL;
-}
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToNext() {
-  CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext()
-                                  : m_ContentIterator.GetCurrent();
-  while (pItem) {
-    if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) {
-      while ((m_pCurWidget = pAcc->GetNextWidget(NULL))) {
-        if (!m_pCurWidget->IsLoaded() &&
-            (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
-          m_pCurWidget->LoadWidget();
-        }
-        return m_pCurWidget;
-      }
-    }
-    pItem = m_ContentIterator.MoveToNext();
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToPrevious() {
-  return NULL;
-}
-IXFA_Widget* CXFA_FFDocWidgetIterator::GetCurrentWidget() {
-  return NULL;
-}
-FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
-  return FALSE;
-}
-IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(
-    CXFA_WidgetAcc* pTravelRoot,
-    XFA_WIDGETORDER eOrder) {
-  if (!pTravelRoot) {
-    return NULL;
-  }
-  return new CXFA_WidgetAccIterator(pTravelRoot->GetDocView(),
-                                    pTravelRoot->GetNode());
-}
-CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView,
-                                               CXFA_Node* pTravelRoot)
-    : m_ContentIterator(pTravelRoot) {
-  m_pDocView = pDocView;
-  m_pCurWidgetAcc = NULL;
-}
-CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() {}
-void CXFA_WidgetAccIterator::Reset() {
-  m_pCurWidgetAcc = NULL;
-  m_ContentIterator.Reset();
-}
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() {
-  return NULL;
-}
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() {
-  return NULL;
-}
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() {
-  CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext()
-                                     : m_ContentIterator.GetCurrent();
-  while (pItem) {
-    if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData())) {
-      return m_pCurWidgetAcc;
-    }
-    pItem = m_ContentIterator.MoveToNext();
-  }
-  return NULL;
-}
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() {
-  return NULL;
-}
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() {
-  return NULL;
-}
-FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) {
-  return FALSE;
-}
-void CXFA_WidgetAccIterator::SkipTree() {
-  m_ContentIterator.SkipChildrenAndMoveToNext();
-  m_pCurWidgetAcc = NULL;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffdocview.h b/xfa/src/fxfa/app/xfa_ffdocview.h
deleted file mode 100644
index 6ca9d2d..0000000
--- a/xfa/src/fxfa/app/xfa_ffdocview.h
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFDOCVIEW_H_
-#define XFA_SRC_FXFA_APP_XFA_FFDOCVIEW_H_
-
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-
-class CXFA_FFWidgetHandler;
-class CXFA_FFDoc;
-class CXFA_FFWidget;
-extern const XFA_ATTRIBUTEENUM gs_EventActivity[];
-enum XFA_DOCVIEW_LAYOUTSTATUS {
-  XFA_DOCVIEW_LAYOUTSTATUS_None,
-  XFA_DOCVIEW_LAYOUTSTATUS_Start,
-  XFA_DOCVIEW_LAYOUTSTATUS_FormInitialize,
-  XFA_DOCVIEW_LAYOUTSTATUS_FormInitCalculate,
-  XFA_DOCVIEW_LAYOUTSTATUS_FormInitValidate,
-  XFA_DOCVIEW_LAYOUTSTATUS_FormFormReady,
-  XFA_DOCVIEW_LAYOUTSTATUS_Doing,
-  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitialize,
-  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitCalculate,
-  XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitValidate,
-  XFA_DOCVIEW_LAYOUTSTATUS_PagesetFormReady,
-  XFA_DOCVIEW_LAYOUTSTATUS_LayoutReady,
-  XFA_DOCVIEW_LAYOUTSTATUS_DocReady,
-  XFA_DOCVIEW_LAYOUTSTATUS_End
-};
-class CXFA_FFDocView : public IXFA_DocView {
- public:
-  CXFA_FFDocView(CXFA_FFDoc* pDoc);
-  ~CXFA_FFDocView();
-
-  virtual IXFA_Doc* GetDoc() { return m_pDoc; }
-  virtual int32_t StartLayout(int32_t iStartPage = 0);
-  virtual int32_t DoLayout(IFX_Pause* pPause = NULL);
-  virtual void StopLayout();
-  virtual int32_t GetLayoutStatus();
-  virtual void UpdateDocView();
-  virtual int32_t CountPageViews();
-  virtual IXFA_PageView* GetPageView(int32_t nIndex);
-  virtual IXFA_Widget* GetWidgetByName(const CFX_WideStringC& wsName);
-  virtual CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName);
-  virtual void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = NULL);
-  virtual int32_t ProcessWidgetEvent(CXFA_EventParam* pParam,
-                                     CXFA_WidgetAcc* pWidgetAcc = NULL);
-  virtual IXFA_WidgetHandler* GetWidgetHandler();
-  virtual IXFA_WidgetIterator* CreateWidgetIterator();
-  virtual IXFA_WidgetAccIterator* CreateWidgetAccIterator(
-      XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder);
-  virtual IXFA_Widget* GetFocusWidget();
-  virtual void KillFocus();
-  virtual FX_BOOL SetFocus(IXFA_Widget* hWidget);
-  CXFA_FFWidget* GetWidgetByName(const CFX_WideStringC& wsName,
-                                 CXFA_FFWidget* pRefWidget = NULL);
-  CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideStringC& wsName,
-                                     CXFA_WidgetAcc* pRefWidgetAcc = NULL);
-  IXFA_DocLayout* GetXFALayout() const;
-  void OnPageEvent(IXFA_LayoutPage* pSender,
-                   XFA_PAGEEVENT eEvent,
-                   int32_t iPageIndex);
-  void LockUpdate();
-  void UnlockUpdate();
-  FX_BOOL IsUpdateLocked();
-  void ClearInvalidateList();
-  void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate);
-  void AddInvalidateRect(IXFA_PageView* pPageView,
-                         const CFX_RectF& rtInvalidate);
-  void RunInvalidate();
-  void RunDocClose();
-  void DestroyDocView();
-
-  FX_BOOL InitValidate(CXFA_Node* pNode);
-  FX_BOOL RunValidate();
-
-  void SetChangeMark();
-
-  void AddValidateWidget(CXFA_WidgetAcc* pWidget);
-  void AddCalculateNodeNotify(CXFA_Node* pNodeChange);
-  void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
-  int32_t RunCalculateWidgets();
-  FX_BOOL IsStaticNotify();
-  FX_BOOL RunLayout();
-  void RunSubformIndexChange();
-  void AddNewFormNode(CXFA_Node* pNode);
-  void AddIndexChangedSubform(CXFA_Node* pNode);
-  CXFA_WidgetAcc* GetFocusWidgetAcc();
-  void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
-  void DeleteLayoutItem(CXFA_FFWidget* pWidget);
-  int32_t ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
-                                       XFA_EVENTTYPE eEventType,
-                                       FX_BOOL bIsFormReady = FALSE,
-                                       FX_BOOL bRecursive = TRUE,
-                                       CXFA_Node* pExclude = NULL);
-  FX_BOOL m_bLayoutEvent;
-  CFX_WideStringArray m_arrNullTestMsg;
-  CXFA_FFWidget* m_pListFocusWidget;
-  FX_BOOL m_bInLayoutStatus;
-
- protected:
-  FX_BOOL RunEventLayoutReady();
-  void RunBindItems();
-  FX_BOOL InitCalculate(CXFA_Node* pNode);
-  void InitLayout(CXFA_Node* pNode);
-  void RunCalculateRecursive(int32_t& iIndex);
-  void ShowNullTestMsg();
-  FX_BOOL ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc);
-  CXFA_Node* GetRootSubform();
-
-  CXFA_FFDoc* m_pDoc;
-  CXFA_FFWidgetHandler* m_pWidgetHandler;
-  IXFA_DocLayout* m_pXFADocLayout;
-  CXFA_WidgetAcc* m_pFocusAcc;
-  CXFA_FFWidget* m_pFocusWidget;
-  CXFA_FFWidget* m_pOldFocusWidget;
-  CFX_MapPtrToPtr m_mapPageInvalidate;
-  CFX_PtrArray m_ValidateAccs;
-  CFX_PtrArray m_bindItems;
-  CFX_PtrArray m_CalculateAccs;
-
-  CFX_PtrArray m_NewAddedNodes;
-  CFX_PtrArray m_IndexChangedSubforms;
-  XFA_DOCVIEW_LAYOUTSTATUS m_iStatus;
-  int32_t m_iLock;
-  friend class CXFA_FFNotify;
-};
-class CXFA_FFDocWidgetIterator : public IXFA_WidgetIterator {
- public:
-  CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
-  virtual ~CXFA_FFDocWidgetIterator();
-
-  virtual void Release() { delete this; }
-
-  virtual void Reset();
-  virtual IXFA_Widget* MoveToFirst();
-  virtual IXFA_Widget* MoveToLast();
-  virtual IXFA_Widget* MoveToNext();
-  virtual IXFA_Widget* MoveToPrevious();
-  virtual IXFA_Widget* GetCurrentWidget();
-  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
-
- protected:
-  CXFA_ContainerIterator m_ContentIterator;
-  CXFA_FFDocView* m_pDocView;
-  CXFA_FFWidget* m_pCurWidget;
-};
-class CXFA_WidgetAccIterator : public IXFA_WidgetAccIterator {
- public:
-  CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot);
-  virtual ~CXFA_WidgetAccIterator();
-  virtual void Release() { delete this; }
-  virtual void Reset();
-  virtual CXFA_WidgetAcc* MoveToFirst();
-  virtual CXFA_WidgetAcc* MoveToLast();
-  virtual CXFA_WidgetAcc* MoveToNext();
-  virtual CXFA_WidgetAcc* MoveToPrevious();
-  virtual CXFA_WidgetAcc* GetCurrentWidgetAcc();
-  virtual FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget);
-  virtual void SkipTree();
-
- protected:
-  CXFA_ContainerIterator m_ContentIterator;
-  CXFA_FFDocView* m_pDocView;
-  CXFA_WidgetAcc* m_pCurWidgetAcc;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFDOCVIEW_H_
diff --git a/xfa/src/fxfa/app/xfa_ffdraw.cpp b/xfa/src/fxfa/app/xfa_ffdraw.cpp
deleted file mode 100644
index e3be99b..0000000
--- a/xfa/src/fxfa/app/xfa_ffdraw.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFDraw::CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFWidget(pPageView, pDataAcc) {}
-CXFA_FFDraw::~CXFA_FFDraw() {}
diff --git a/xfa/src/fxfa/app/xfa_ffdraw.h b/xfa/src/fxfa/app/xfa_ffdraw.h
deleted file mode 100644
index 467c072..0000000
--- a/xfa/src/fxfa/app/xfa_ffdraw.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFDRAW_H_
-#define XFA_SRC_FXFA_APP_XFA_FFDRAW_H_
-
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-class CXFA_FFDraw : public CXFA_FFWidget {
- public:
-  CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFDraw();
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFDRAW_H_
diff --git a/xfa/src/fxfa/app/xfa_ffexclgroup.cpp b/xfa/src/fxfa/app/xfa_ffexclgroup.cpp
deleted file mode 100644
index 4fde5ef..0000000
--- a/xfa/src/fxfa/app/xfa_ffexclgroup.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffexclgroup.h"
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFExclGroup::CXFA_FFExclGroup(CXFA_FFPageView* pPageView,
-                                   CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFWidget(pPageView, pDataAcc) {}
-CXFA_FFExclGroup::~CXFA_FFExclGroup() {}
-void CXFA_FFExclGroup::RenderWidget(CFX_Graphics* pGS,
-                                    CFX_Matrix* pMatrix,
-                                    FX_DWORD dwStatus,
-                                    int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffexclgroup.h b/xfa/src/fxfa/app/xfa_ffexclgroup.h
deleted file mode 100644
index 52416f9..0000000
--- a/xfa/src/fxfa/app/xfa_ffexclgroup.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFEXCLGROUP_H_
-#define XFA_SRC_FXFA_APP_XFA_FFEXCLGROUP_H_
-
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-class CXFA_FFExclGroup : public CXFA_FFWidget {
- public:
-  CXFA_FFExclGroup(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFExclGroup();
-
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFEXCLGROUP_H_
diff --git a/xfa/src/fxfa/app/xfa_fffield.cpp b/xfa/src/fxfa/app/xfa_fffield.cpp
deleted file mode 100644
index 607434c..0000000
--- a/xfa/src/fxfa/app/xfa_fffield.cpp
+++ /dev/null
@@ -1,835 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-#include "xfa/include/fwl/lightwidget/edit.h"
-#include "xfa/include/fwl/lightwidget/picturebox.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwltheme.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-CXFA_FFField::CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFWidget(pPageView, pDataAcc), m_pNormalWidget(NULL) {
-  m_rtUI.Set(0, 0, 0, 0);
-  m_rtCaption.Set(0, 0, 0, 0);
-}
-CXFA_FFField::~CXFA_FFField() {
-  CXFA_FFField::UnloadWidget();
-}
-
-FX_BOOL CXFA_FFField::GetBBox(CFX_RectF& rtBox,
-                              FX_DWORD dwStatus,
-                              FX_BOOL bDrawFocus) {
-  if (!bDrawFocus)
-    return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
-
-  XFA_ELEMENT type = (XFA_ELEMENT)m_pDataAcc->GetUIType();
-  if (type == XFA_ELEMENT_Button || type == XFA_ELEMENT_CheckButton ||
-      type == XFA_ELEMENT_ImageEdit || type == XFA_ELEMENT_Signature ||
-      type == XFA_ELEMENT_ChoiceList) {
-    rtBox = m_rtUI;
-    CFX_Matrix mt;
-    GetRotateMatrix(mt);
-    mt.TransformRect(rtBox);
-    return TRUE;
-  }
-  return FALSE;
-}
-
-void CXFA_FFField::RenderWidget(CFX_Graphics* pGS,
-                                CFX_Matrix* pMatrix,
-                                FX_DWORD dwStatus,
-                                int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
-  RenderCaption(pGS, &mtRotate);
-  DrawHighlight(pGS, &mtRotate, dwStatus, FALSE);
-  CFX_RectF rtWidget;
-  m_pNormalWidget->GetWidgetRect(rtWidget);
-  CFX_Matrix mt;
-  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
-  mt.Concat(mtRotate);
-  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
-                                                 pGS, &mt);
-}
-void CXFA_FFField::DrawHighlight(CFX_Graphics* pGS,
-                                 CFX_Matrix* pMatrix,
-                                 FX_DWORD dwStatus,
-                                 FX_BOOL bEllipse) {
-  if (m_rtUI.IsEmpty() || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return;
-  }
-  if ((dwStatus & XFA_WIDGETSTATUS_Highlight) &&
-      m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open) {
-    CXFA_FFDoc* pDoc = GetDoc();
-    CFX_Color crHighlight(pDoc->GetDocProvider()->GetHighlightColor(pDoc));
-    pGS->SetFillColor(&crHighlight);
-    CFX_Path path;
-    path.Create();
-    if (bEllipse) {
-      path.AddEllipse(m_rtUI);
-    } else {
-      path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height);
-    }
-    pGS->FillPath(&path, FXFILL_WINDING, pMatrix);
-  }
-}
-void CXFA_FFField::DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix) {
-  if (m_dwStatus & XFA_WIDGETSTATUS_Focused) {
-    CFX_Color cr(0xFF000000);
-    pGS->SetStrokeColor(&cr);
-    FX_FLOAT DashPattern[2] = {1, 1};
-    pGS->SetLineDash(0.0f, DashPattern, 2);
-    pGS->SetLineWidth(0, FALSE);
-    CFX_Path path;
-    path.Create();
-    path.AddRectangle(m_rtUI.left, m_rtUI.top, m_rtUI.width, m_rtUI.height);
-    pGS->StrokePath(&path, pMatrix);
-  }
-}
-void CXFA_FFField::SetFWLThemeProvider() {
-  if (m_pNormalWidget) {
-    m_pNormalWidget->m_pIface->SetThemeProvider(GetApp()->GetFWLTheme());
-  }
-}
-FX_BOOL CXFA_FFField::IsLoaded() {
-  return m_pNormalWidget && CXFA_FFWidget::IsLoaded();
-}
-FX_BOOL CXFA_FFField::LoadWidget() {
-  SetFWLThemeProvider();
-  m_pDataAcc->LoadCaption();
-  PerformLayout();
-  return TRUE;
-}
-void CXFA_FFField::UnloadWidget() {
-  delete m_pNormalWidget;
-  m_pNormalWidget = nullptr;
-}
-void CXFA_FFField::SetEditScrollOffset() {
-  XFA_ELEMENT eType = m_pDataAcc->GetUIType();
-  if (eType == XFA_ELEMENT_TextEdit || eType == XFA_ELEMENT_NumericEdit ||
-      eType == XFA_ELEMENT_PasswordEdit) {
-    FX_FLOAT fScrollOffset = 0;
-    CXFA_FFField* pPrev = static_cast<CXFA_FFField*>(GetPrev());
-    if (pPrev) {
-      CFX_RectF rtMargin;
-      m_pDataAcc->GetUIMargin(rtMargin);
-      fScrollOffset = -rtMargin.top;
-    }
-    while (pPrev) {
-      fScrollOffset += pPrev->m_rtUI.height;
-      pPrev = static_cast<CXFA_FFField*>(pPrev->GetPrev());
-    }
-    ((CFWL_Edit*)m_pNormalWidget)->SetScrollOffset(fScrollOffset);
-  }
-}
-FX_BOOL CXFA_FFField::PerformLayout() {
-  CXFA_FFWidget::PerformLayout();
-  CapPlacement();
-  LayoutCaption();
-  SetFWLRect();
-  SetEditScrollOffset();
-  if (m_pNormalWidget) {
-    m_pNormalWidget->Update();
-  }
-  return TRUE;
-}
-void CXFA_FFField::CapPlacement() {
-  CFX_RectF rtWidget;
-  GetRectWithoutRotate(rtWidget);
-  CXFA_Margin mgWidget = m_pDataAcc->GetMargin();
-  if (mgWidget) {
-    CXFA_LayoutItem* pItem = this;
-    FX_FLOAT fLeftInset = 0, fRightInset = 0, fTopInset = 0, fBottomInset = 0;
-    mgWidget.GetLeftInset(fLeftInset);
-    mgWidget.GetRightInset(fRightInset);
-    mgWidget.GetTopInset(fTopInset);
-    mgWidget.GetBottomInset(fBottomInset);
-    if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
-      rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
-    } else {
-      if (pItem->GetPrev() == NULL) {
-        rtWidget.Deflate(fLeftInset, fTopInset, fRightInset, 0);
-      } else if (pItem->GetNext() == NULL) {
-        rtWidget.Deflate(fLeftInset, 0, fRightInset, fBottomInset);
-      } else {
-        rtWidget.Deflate(fLeftInset, 0, fRightInset, 0);
-      }
-    }
-  }
-  XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
-  FX_FLOAT fCapReserve = 0;
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
-    iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType();
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Top && GetPrev()) {
-      m_rtCaption.Set(0, 0, 0, 0);
-    } else if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom && GetNext()) {
-      m_rtCaption.Set(0, 0, 0, 0);
-    } else {
-      fCapReserve = caption.GetReserve();
-      CXFA_LayoutItem* pItem = this;
-      if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
-        m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width,
-                        rtWidget.height);
-      } else {
-        pItem = pItem->GetFirst();
-        pItem->GetRect(m_rtCaption);
-        pItem = pItem->GetNext();
-        while (pItem) {
-          CFX_RectF rtRect;
-          pItem->GetRect(rtRect);
-          m_rtCaption.height += rtRect.Height();
-          pItem = pItem->GetNext();
-        }
-        XFA_RectWidthoutMargin(m_rtCaption, mgWidget);
-      }
-      CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
-      if (fCapReserve <= 0 && pCapTextLayout) {
-        CFX_SizeF size;
-        CFX_SizeF minSize;
-        CFX_SizeF maxSize;
-        pCapTextLayout->CalcSize(minSize, maxSize, size);
-        if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
-            iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
-          fCapReserve = size.y;
-        } else {
-          fCapReserve = size.x;
-        }
-      }
-    }
-  }
-  m_rtUI = rtWidget;
-  switch (iCapPlacement) {
-    case XFA_ATTRIBUTEENUM_Left: {
-      m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(caption, rtWidget, iCapPlacement);
-      m_rtUI.width -= fCapReserve;
-      m_rtUI.left += fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Top: {
-      m_rtCaption.height = fCapReserve;
-      CapTopBottomPlacement(caption, rtWidget, iCapPlacement);
-      m_rtUI.top += fCapReserve;
-      m_rtUI.height -= fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Right: {
-      m_rtCaption.left = m_rtCaption.right() - fCapReserve;
-      m_rtCaption.width = fCapReserve;
-      CapLeftRightPlacement(caption, rtWidget, iCapPlacement);
-      m_rtUI.width -= fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Bottom: {
-      m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
-      m_rtCaption.height = fCapReserve;
-      CapTopBottomPlacement(caption, rtWidget, iCapPlacement);
-      m_rtUI.height -= fCapReserve;
-    } break;
-    case XFA_ATTRIBUTEENUM_Inline:
-      break;
-    default:
-      break;
-  }
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  if (borderUI) {
-    CXFA_Margin margin = borderUI.GetMargin();
-    if (margin) {
-      XFA_RectWidthoutMargin(m_rtUI, margin);
-    }
-  }
-  m_rtUI.Normalize();
-}
-void CXFA_FFField::CapTopBottomPlacement(CXFA_Caption caption,
-                                         const CFX_RectF& rtWidget,
-                                         int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
-  m_rtCaption.left += rtUIMargin.left;
-  if (CXFA_Margin mgCap = caption.GetMargin()) {
-    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-    if (m_rtCaption.height < 0) {
-      m_rtCaption.top += m_rtCaption.height;
-    }
-  }
-  FX_FLOAT fWidth = rtUIMargin.left + rtUIMargin.width;
-  FX_FLOAT fHeight = m_rtCaption.height + rtUIMargin.top + rtUIMargin.height;
-  if (fWidth > rtWidget.width) {
-    m_rtUI.width += fWidth - rtWidget.width;
-  }
-  if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) {
-    m_rtUI.height = XFA_MINUI_HEIGHT;
-    m_rtCaption.top += rtUIMargin.top + rtUIMargin.height;
-  } else if (fHeight > rtWidget.height) {
-    m_rtUI.height += fHeight - rtWidget.height;
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
-      m_rtCaption.top += fHeight - rtWidget.height;
-    }
-  }
-}
-void CXFA_FFField::CapLeftRightPlacement(CXFA_Caption caption,
-                                         const CFX_RectF& rtWidget,
-                                         int32_t iCapPlacement) {
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
-  m_rtCaption.top += rtUIMargin.top;
-  m_rtCaption.height -= rtUIMargin.top;
-  if (CXFA_Margin mgCap = caption.GetMargin()) {
-    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-    if (m_rtCaption.height < 0) {
-      m_rtCaption.top += m_rtCaption.height;
-    }
-  }
-  FX_FLOAT fWidth = m_rtCaption.width + rtUIMargin.left + rtUIMargin.width;
-  FX_FLOAT fHeight = rtUIMargin.top + rtUIMargin.height;
-  if (fWidth > rtWidget.width) {
-    m_rtUI.width += fWidth - rtWidget.width;
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) {
-      m_rtCaption.left += fWidth - rtWidget.width;
-    }
-  }
-  if (fHeight == XFA_DEFAULTUI_HEIGHT && m_rtUI.height < XFA_MINUI_HEIGHT) {
-    m_rtUI.height = XFA_MINUI_HEIGHT;
-    m_rtCaption.top += rtUIMargin.top + rtUIMargin.height;
-  } else if (fHeight > rtWidget.height) {
-    m_rtUI.height += fHeight - rtWidget.height;
-  }
-}
-void CXFA_FFField::UpdateFWL() {
-  if (m_pNormalWidget) {
-    m_pNormalWidget->Update();
-  }
-}
-FX_DWORD CXFA_FFField::UpdateUIProperty() {
-  CXFA_Node* pUiNode = m_pDataAcc->GetUIChild();
-  FX_DWORD dwStyle = 0;
-  if (pUiNode && pUiNode->GetClassID() == XFA_ELEMENT_DefaultUi) {
-    dwStyle = FWL_STYLEEXT_EDT_ReadOnly;
-  }
-  return dwStyle;
-}
-void CXFA_FFField::SetFWLRect() {
-  if (!m_pNormalWidget) {
-    return;
-  }
-  CFX_RectF rtUi = m_rtUI;
-  if (rtUi.width < 1.0) {
-    FXSYS_assert(rtUi.width < 1.0);
-    rtUi.width = 1.0;
-  }
-  if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    FX_FLOAT fFontSize = m_pDataAcc->GetFontSize();
-    if (rtUi.height < fFontSize) {
-      rtUi.height = fFontSize;
-    }
-  }
-  m_pNormalWidget->SetWidgetRect(rtUi);
-}
-FX_BOOL CXFA_FFField::OnMouseEnter() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseEnter;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnMouseExit() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseLeave;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-void CXFA_FFField::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
-  if (!m_pNormalWidget) {
-    return;
-  }
-  CFX_RectF rtWidget;
-  m_pNormalWidget->GetWidgetRect(rtWidget);
-  fx -= rtWidget.left;
-  fy -= rtWidget.top;
-}
-FX_BOOL CXFA_FFField::OnLButtonDown(FX_DWORD dwFlags,
-                                    FX_FLOAT fx,
-                                    FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return FALSE;
-  }
-  if (!PtInActiveRect(fx, fy)) {
-    return FALSE;
-  }
-  SetButtonDown(TRUE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (!IsButtonDown()) {
-    return FALSE;
-  }
-  SetButtonDown(FALSE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonUp;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnLButtonDblClk(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDblClk;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_MouseMove;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnMouseWheel(FX_DWORD dwFlags,
-                                   int16_t zDelta,
-                                   FX_FLOAT fx,
-                                   FX_FLOAT fy) {
-  return FALSE;
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouseWheel ms;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_fDeltaX = zDelta;
-  ms.m_fDeltaY = 0;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnRButtonDown(FX_DWORD dwFlags,
-                                    FX_FLOAT fx,
-                                    FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return FALSE;
-  }
-  if (!PtInActiveRect(fx, fy)) {
-    return FALSE;
-  }
-  SetButtonDown(TRUE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (!IsButtonDown()) {
-    return FALSE;
-  }
-  SetButtonDown(FALSE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonUp;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnRButtonDblClk(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDblClk;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-
-FX_BOOL CXFA_FFField::OnSetFocus(CXFA_FFWidget* pOldWidget) {
-  CXFA_FFWidget::OnSetFocus(pOldWidget);
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFWL_MsgSetFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  m_dwStatus |= XFA_WIDGETSTATUS_Focused;
-  AddInvalidateRect();
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnKillFocus(CXFA_FFWidget* pNewWidget) {
-  if (!m_pNormalWidget) {
-    return CXFA_FFWidget::OnKillFocus(pNewWidget);
-  }
-  CFWL_MsgKillFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
-  AddInvalidateRect();
-  CXFA_FFWidget::OnKillFocus(pNewWidget);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return FALSE;
-  }
-  CFWL_MsgKey ms;
-  ms.m_dwCmd = FWL_MSGKEYCMD_KeyDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_dwKeyCode = dwKeyCode;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  if (!m_pNormalWidget || !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return FALSE;
-  }
-  CFWL_MsgKey ms;
-  ms.m_dwCmd = FWL_MSGKEYCMD_KeyUp;
-  ms.m_dwFlags = dwFlags;
-  ms.m_dwKeyCode = dwKeyCode;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
-  if (!m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    return FALSE;
-  }
-  if (dwChar == FWL_VKEY_Tab) {
-    return TRUE;
-  }
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  CFWL_MsgKey ms;
-  ms.m_dwCmd = FWL_MSGKEYCMD_Char;
-  ms.m_dwFlags = dwFlags;
-  ms.m_dwKeyCode = dwChar;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_DWORD CXFA_FFField::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pNormalWidget) {
-    FX_FLOAT ffx = fx, ffy = fy;
-    FWLToClient(ffx, ffy);
-    FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy);
-    if (dwWidgetHit != FWL_WGTHITTEST_Unknown) {
-      return FWL_WGTHITTEST_Client;
-    }
-  }
-  CFX_RectF rtBox;
-  GetRectWithoutRotate(rtBox);
-  if (!rtBox.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Unknown;
-  }
-  if (m_rtCaption.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Titlebar;
-  }
-  return FWL_WGTHITTEST_Border;
-}
-FX_BOOL CXFA_FFField::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
-  return TRUE;
-}
-FX_BOOL CXFA_FFField::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFX_RectF rtWidget;
-  m_pNormalWidget->GetWidgetRect(rtWidget);
-  if (rtWidget.Contains(fx, fy)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_FFField::LayoutCaption() {
-  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
-  if (!pCapTextLayout)
-    return;
-
-  FX_FLOAT fHeight = 0;
-  pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height),
-                         &fHeight);
-  if (m_rtCaption.height < fHeight)
-    m_rtCaption.height = fHeight;
-}
-void CXFA_FFField::RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix) {
-  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
-  if (!pCapTextLayout) {
-    return;
-  }
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  if (caption && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
-    if (!pCapTextLayout->IsLoaded()) {
-      pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height));
-    }
-    CFX_RectF rtWidget;
-    GetRectWithoutRotate(rtWidget);
-    CFX_RectF rtClip = m_rtCaption;
-    rtClip.Intersect(rtWidget);
-    CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top);
-    if (pMatrix) {
-      pMatrix->TransformRect(rtClip);
-      mt.Concat(*pMatrix);
-    }
-    pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
-  }
-}
-FX_BOOL CXFA_FFField::ProcessCommittedData() {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  if (!IsDataChanged()) {
-    return FALSE;
-  }
-  if (CalculateOverride() != 1) {
-    return FALSE;
-  }
-  if (!CommitData()) {
-    return FALSE;
-  }
-  m_pDocView->SetChangeMark();
-  m_pDocView->AddValidateWidget(m_pDataAcc);
-  return TRUE;
-}
-int32_t CXFA_FFField::CalculateOverride() {
-  CXFA_WidgetAcc* pAcc = m_pDataAcc->GetExclGroup();
-  if (!pAcc) {
-    return CalculateWidgetAcc(m_pDataAcc);
-  }
-  if (CalculateWidgetAcc(pAcc) == 0) {
-    return 0;
-  }
-  CXFA_Node* pNode = pAcc->GetExclGroupFirstMember();
-  if (!pNode) {
-    return 1;
-  }
-  CXFA_WidgetAcc* pWidgetAcc = NULL;
-  while (pNode) {
-    pWidgetAcc = (CXFA_WidgetAcc*)pNode->GetWidgetData();
-    if (!pWidgetAcc) {
-      return 1;
-    }
-    if (CalculateWidgetAcc(pWidgetAcc) == 0) {
-      return 0;
-    }
-    pNode = pWidgetAcc->GetExclGroupNextMember(pNode);
-  }
-  return 1;
-}
-int32_t CXFA_FFField::CalculateWidgetAcc(CXFA_WidgetAcc* pAcc) {
-  CXFA_Calculate calc = pAcc->GetCalculate();
-  if (!calc) {
-    return 1;
-  }
-  XFA_VERSION version = pAcc->GetDoc()->GetXFADoc()->GetCurVersionMode();
-  if (calc) {
-    int32_t iOverride = calc.GetOverride();
-    switch (iOverride) {
-      case XFA_ATTRIBUTEENUM_Error: {
-        if (version <= XFA_VERSION_204) {
-          return 1;
-        }
-        IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
-        if (pAppProvider) {
-          CFX_WideString wsMessage;
-          CFX_WideString wsWarning;
-          pAppProvider->LoadString(XFA_IDS_NotModifyField, wsWarning);
-          wsMessage += wsWarning;
-          CFX_WideString wsTitle;
-          pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle);
-          pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning,
-                               XFA_MB_OK);
-        }
-      }
-        return 0;
-      case XFA_ATTRIBUTEENUM_Warning: {
-        if (version <= XFA_VERSION_204) {
-          CXFA_Script script = calc.GetScript();
-          if (!script) {
-            return 1;
-          }
-          CFX_WideString wsExpression;
-          script.GetExpression(wsExpression);
-          if (wsExpression.IsEmpty()) {
-            return 1;
-          }
-        }
-        if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-          return 1;
-        }
-        IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
-        if (pAppProvider) {
-          CFX_WideString wsMessage;
-          calc.GetMessageText(wsMessage);
-          if (!wsMessage.IsEmpty()) {
-            wsMessage += L"\r\n";
-          }
-          CFX_WideString wsWarning;
-          pAppProvider->LoadString(XFA_IDS_ModifyField, wsWarning);
-          wsMessage += wsWarning;
-          CFX_WideString wsTitle;
-          pAppProvider->LoadString(XFA_IDS_CalcOverride, wsTitle);
-          if (pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Warning,
-                                   XFA_MB_YesNo) == XFA_IDYes) {
-            pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
-            return 1;
-          }
-        }
-        return 0;
-      }
-      case XFA_ATTRIBUTEENUM_Ignore:
-        return 0;
-      case XFA_ATTRIBUTEENUM_Disabled:
-        pAcc->GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
-      default:
-        return 1;
-    }
-  }
-  return 1;
-}
-FX_BOOL CXFA_FFField::CommitData() {
-  return FALSE;
-}
-FX_BOOL CXFA_FFField::IsDataChanged() {
-  return FALSE;
-}
-void CXFA_FFField::TranslateFWLMessage(CFWL_Message* pMessage) {
-  GetApp()->GetWidgetMgrDelegate()->OnProcessMessageToForm(pMessage);
-}
-int32_t CXFA_FFField::OnProcessMessage(CFWL_Message* pMessage) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CXFA_FFField::OnProcessEvent(CFWL_Event* pEvent) {
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  switch (dwEventID) {
-    case FWL_EVTHASH_Mouse: {
-      CFWL_EvtMouse* event = (CFWL_EvtMouse*)pEvent;
-      if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseEnter) {
-        CXFA_EventParam eParam;
-        eParam.m_eType = XFA_EVENT_MouseEnter;
-        eParam.m_pTarget = m_pDataAcc;
-        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseEnter, &eParam);
-      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_MouseLeave) {
-        CXFA_EventParam eParam;
-        eParam.m_eType = XFA_EVENT_MouseExit;
-        eParam.m_pTarget = m_pDataAcc;
-        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseExit, &eParam);
-      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonDown) {
-        CXFA_EventParam eParam;
-        eParam.m_eType = XFA_EVENT_MouseDown;
-        eParam.m_pTarget = m_pDataAcc;
-        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseDown, &eParam);
-      } else if (event->m_dwCmd == FWL_MSGMOUSECMD_LButtonUp) {
-        CXFA_EventParam eParam;
-        eParam.m_eType = XFA_EVENT_MouseUp;
-        eParam.m_pTarget = m_pDataAcc;
-        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_MouseUp, &eParam);
-      }
-      break;
-    }
-    case FWL_EVTHASH_Click: {
-      CXFA_EventParam eParam;
-      eParam.m_eType = XFA_EVENT_Click;
-      eParam.m_pTarget = m_pDataAcc;
-      m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
-      break;
-    }
-    default: {}
-  }
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CXFA_FFField::OnDrawWidget(CFX_Graphics* pGraphics,
-                                   const CFX_Matrix* pMatrix) {
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fxfa/app/xfa_fffield.h b/xfa/src/fxfa/app/xfa_fffield.h
deleted file mode 100644
index e2699c9..0000000
--- a/xfa/src/fxfa/app/xfa_fffield.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFFIELD_H_
-#define XFA_SRC_FXFA_APP_XFA_FFFIELD_H_
-
-#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
-#include "xfa/include/fwl/core/fwl_widget.h"
-#include "xfa/include/fwl/lightwidget/widget.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-#define XFA_MINUI_HEIGHT 4.32f
-#define XFA_DEFAULTUI_HEIGHT 2.0f
-
-class CXFA_FFField : public CXFA_FFWidget, public IFWL_WidgetDelegate {
- public:
-  CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFField();
-
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          FX_DWORD dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual void UpdateFWL();
-  FX_DWORD UpdateUIProperty();
-  virtual FX_BOOL OnMouseEnter();
-  virtual FX_BOOL OnMouseExit();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-
-  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
-  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
-
- protected:
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  virtual void SetFWLRect();
-  void SetFWLThemeProvider();
-  CFWL_Widget* GetNormalWidget() { return m_pNormalWidget; }
-  void FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy);
-  void LayoutCaption();
-  void RenderCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL);
-
-  int32_t CalculateOverride();
-  int32_t CalculateWidgetAcc(CXFA_WidgetAcc* pAcc);
-  FX_BOOL ProcessCommittedData();
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL IsDataChanged();
-  void DrawHighlight(CFX_Graphics* pGS,
-                     CFX_Matrix* pMatrix,
-                     FX_DWORD dwStatus,
-                     FX_BOOL bEllipse = FALSE);
-  void DrawFocus(CFX_Graphics* pGS, CFX_Matrix* pMatrix);
-  void TranslateFWLMessage(CFWL_Message* pMessage);
-  void CapPlacement();
-  void CapTopBottomPlacement(CXFA_Caption caption,
-                             const CFX_RectF& rtWidget,
-                             int32_t iCapPlacement);
-  void CapLeftRightPlacement(CXFA_Caption caption,
-                             const CFX_RectF& rtWidget,
-                             int32_t iCapPlacement);
-  void SetEditScrollOffset();
-
- public:
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  CFWL_Widget* m_pNormalWidget;
-  CFX_RectF m_rtUI;
-  CFX_RectF m_rtCaption;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFFIELD_H_
diff --git a/xfa/src/fxfa/app/xfa_ffimage.cpp b/xfa/src/fxfa/app/xfa_ffimage.cpp
deleted file mode 100644
index 37c5991..0000000
--- a/xfa/src/fxfa/app/xfa_ffimage.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffimage.h"
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFImage::CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFDraw(pPageView, pDataAcc) {}
-CXFA_FFImage::~CXFA_FFImage() {
-  CXFA_FFImage::UnloadWidget();
-}
-FX_BOOL CXFA_FFImage::IsLoaded() {
-  return GetDataAcc()->GetImageImage() != NULL;
-}
-FX_BOOL CXFA_FFImage::LoadWidget() {
-  if (GetDataAcc()->GetImageImage()) {
-    return TRUE;
-  }
-  GetDataAcc()->LoadImageImage();
-  return CXFA_FFDraw::LoadWidget();
-}
-void CXFA_FFImage::UnloadWidget() {
-  GetDataAcc()->SetImageImage(NULL);
-}
-void CXFA_FFImage::RenderWidget(CFX_Graphics* pGS,
-                                CFX_Matrix* pMatrix,
-                                FX_DWORD dwStatus,
-                                int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  if (CFX_DIBitmap* pDIBitmap = GetDataAcc()->GetImageImage()) {
-    CFX_RectF rtImage;
-    GetRectWithoutRotate(rtImage);
-    if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-      XFA_RectWidthoutMargin(rtImage, mgWidget);
-    }
-    int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
-    int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
-    if (CXFA_Para para = m_pDataAcc->GetPara()) {
-      iHorzAlign = para.GetHorizontalAlign();
-      iVertAlign = para.GetVerticalAlign();
-    }
-    CXFA_Value value = m_pDataAcc->GetFormValue();
-    CXFA_Image imageObj = value.GetImage();
-    int32_t iAspect = imageObj.GetAspect();
-    int32_t iImageXDpi = 0;
-    int32_t iImageYDpi = 0;
-    m_pDataAcc->GetImageDpi(iImageXDpi, iImageYDpi);
-    XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi,
-                  iImageYDpi, iHorzAlign, iVertAlign);
-  }
-}
diff --git a/xfa/src/fxfa/app/xfa_ffimage.h b/xfa/src/fxfa/app/xfa_ffimage.h
deleted file mode 100644
index 5767e16..0000000
--- a/xfa/src/fxfa/app/xfa_ffimage.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFIMAGE_H_
-#define XFA_SRC_FXFA_APP_XFA_FFIMAGE_H_
-
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-
-class CXFA_FFImage : public CXFA_FFDraw {
- public:
-  CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFImage();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFIMAGE_H_
diff --git a/xfa/src/fxfa/app/xfa_ffimageedit.cpp b/xfa/src/fxfa/app/xfa_ffimageedit.cpp
deleted file mode 100644
index 68e4009..0000000
--- a/xfa/src/fxfa/app/xfa_ffimageedit.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffimageedit.h"
-
-#include "xfa/include/fwl/core/fwl_app.h"
-#include "xfa/include/fwl/lightwidget/picturebox.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_FFPageView* pPageView,
-                                   CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
-CXFA_FFImageEdit::~CXFA_FFImageEdit() {
-  CXFA_FFImageEdit::UnloadWidget();
-}
-FX_BOOL CXFA_FFImageEdit::LoadWidget() {
-  CFWL_PictureBox* pPictureBox = new CFWL_PictureBox;
-  if (pPictureBox) {
-    pPictureBox->Initialize();
-  }
-  m_pNormalWidget = (CFWL_Widget*)pPictureBox;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = pPictureBox->SetDelegate(this);
-  CXFA_FFField::LoadWidget();
-  if (m_pDataAcc->GetImageEditImage()) {
-    return TRUE;
-  }
-  UpdateFWLData();
-  return TRUE;
-}
-void CXFA_FFImageEdit::UnloadWidget() {
-  m_pDataAcc->SetImageEditImage(NULL);
-  CXFA_FFField::UnloadWidget();
-}
-void CXFA_FFImageEdit::RenderWidget(CFX_Graphics* pGS,
-                                    CFX_Matrix* pMatrix,
-                                    FX_DWORD dwStatus,
-                                    int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
-  RenderCaption(pGS, &mtRotate);
-  if (CFX_DIBitmap* pDIBitmap = m_pDataAcc->GetImageEditImage()) {
-    CFX_RectF rtImage;
-    m_pNormalWidget->GetWidgetRect(rtImage);
-    int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
-    int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
-    if (CXFA_Para para = m_pDataAcc->GetPara()) {
-      iHorzAlign = para.GetHorizontalAlign();
-      iVertAlign = para.GetVerticalAlign();
-    }
-    int32_t iAspect = XFA_ATTRIBUTEENUM_Fit;
-    if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
-      if (CXFA_Image imageObj = value.GetImage()) {
-        iAspect = imageObj.GetAspect();
-      }
-    }
-    int32_t iImageXDpi = 0;
-    int32_t iImageYDpi = 0;
-    m_pDataAcc->GetImageEditDpi(iImageXDpi, iImageYDpi);
-    XFA_DrawImage(pGS, rtImage, &mtRotate, pDIBitmap, iAspect, iImageXDpi,
-                  iImageYDpi, iHorzAlign, iVertAlign);
-  }
-}
-FX_BOOL CXFA_FFImageEdit::OnLButtonDown(FX_DWORD dwFlags,
-                                        FX_FLOAT fx,
-                                        FX_FLOAT fy) {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  if (!PtInActiveRect(fx, fy)) {
-    return FALSE;
-  }
-  SetButtonDown(TRUE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  TranslateFWLMessage(&ms);
-  IXFA_AppProvider* pAppProvider = GetAppProvider();
-  if (!pAppProvider) {
-    return TRUE;
-  }
-  CFX_WideString wsTitle;
-  CFX_WideString wsFilter;
-  pAppProvider->LoadString(XFA_IDS_ImageFilter, wsFilter);
-  CFX_WideStringArray wsPathArray;
-  pAppProvider->ShowFileDialog(wsTitle, wsFilter, wsPathArray);
-  int32_t iSize = wsPathArray.GetSize();
-  if (iSize < 1) {
-    return TRUE;
-  }
-  CFX_WideString wsFilePath = wsPathArray[0];
-  FX_STRSIZE nLen = wsFilePath.GetLength();
-  FX_STRSIZE nIndex = nLen - 1;
-  while (nIndex > 0 && wsFilePath[nIndex] != '.') {
-    nIndex--;
-  }
-  if (nIndex <= 0) {
-    return TRUE;
-  }
-  CFX_WideString wsContentType(L"image/");
-  wsContentType += wsFilePath.Right(nLen - nIndex - 1);
-  wsContentType.MakeLower();
-  FXCODEC_IMAGE_TYPE eImageType = XFA_GetImageType(wsContentType);
-  if (eImageType == FXCODEC_IMAGE_UNKNOWN) {
-    return TRUE;
-  }
-  CFX_WideString wsImage;
-  IFX_FileRead* pFileRead = FX_CreateFileRead(wsFilePath);
-  if (pFileRead) {
-    int32_t nDataSize = pFileRead->GetSize();
-    if (nDataSize > 0) {
-      CFX_ByteString bsBuf;
-      FX_CHAR* pImageBuffer = bsBuf.GetBuffer(nDataSize);
-      pFileRead->ReadBlock(pImageBuffer, 0, nDataSize);
-      bsBuf.ReleaseBuffer();
-      if (!bsBuf.IsEmpty()) {
-        FX_CHAR* pData = XFA_Base64Encode(bsBuf, nDataSize);
-        wsImage = CFX_WideString::FromLocal(pData);
-        FX_Free(pData);
-      }
-    }
-    m_pDataAcc->SetImageEditImage(NULL);
-    pFileRead->Release();
-  }
-  m_pDataAcc->SetImageEdit(wsContentType, CFX_WideStringC(), wsImage);
-  m_pDataAcc->LoadImageEditImage();
-  AddInvalidateRect();
-  m_pDocView->SetChangeMark();
-  return TRUE;
-}
-void CXFA_FFImageEdit::SetFWLRect() {
-  if (!m_pNormalWidget) {
-    return;
-  }
-  CFX_RectF rtUIMargin;
-  m_pDataAcc->GetUIMargin(rtUIMargin);
-  CFX_RectF rtImage(m_rtUI);
-  rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width,
-                  rtUIMargin.height);
-  m_pNormalWidget->SetWidgetRect(rtImage);
-}
-FX_BOOL CXFA_FFImageEdit::CommitData() {
-  return TRUE;
-}
-FX_BOOL CXFA_FFImageEdit::UpdateFWLData() {
-  m_pDataAcc->SetImageEditImage(NULL);
-  m_pDataAcc->LoadImageEditImage();
-  return TRUE;
-}
-int32_t CXFA_FFImageEdit::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFImageEdit::OnProcessEvent(CFWL_Event* pEvent) {
-  CXFA_FFField::OnProcessEvent(pEvent);
-  return m_pOldDelegate->OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFImageEdit::OnDrawWidget(CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {
-  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffimageedit.h b/xfa/src/fxfa/app/xfa_ffimageedit.h
deleted file mode 100644
index d7438ae..0000000
--- a/xfa/src/fxfa/app/xfa_ffimageedit.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFIMAGEEDIT_H_
-#define XFA_SRC_FXFA_APP_XFA_FFIMAGEEDIT_H_
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-
-class CXFA_FFImageEdit : public CXFA_FFField {
- public:
-  CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFImageEdit();
-
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  virtual void SetFWLRect();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL CommitData();
-  IFWL_WidgetDelegate* m_pOldDelegate;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFIMAGEEDIT_H_
diff --git a/xfa/src/fxfa/app/xfa_ffnotify.cpp b/xfa/src/fxfa/app/xfa_ffnotify.cpp
deleted file mode 100644
index 6b9094c..0000000
--- a/xfa/src/fxfa/app/xfa_ffnotify.cpp
+++ /dev/null
@@ -1,648 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffnotify.h"
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffbarcode.h"
-#include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-#include "xfa/src/fxfa/app/xfa_ffexclgroup.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffimage.h"
-#include "xfa/src/fxfa/app/xfa_ffimageedit.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffpath.h"
-#include "xfa/src/fxfa/app/xfa_ffpushbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffsignature.h"
-#include "xfa/src/fxfa/app/xfa_ffsubform.h"
-#include "xfa/src/fxfa/app/xfa_fftext.h"
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgetacc.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgethandler.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-static void XFA_FFDeleteWidgetAcc(void* pData) {
-  delete static_cast<CXFA_WidgetAcc*>(pData);
-}
-static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteWidgetAcc = {
-    XFA_FFDeleteWidgetAcc, NULL};
-CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
-CXFA_FFNotify::~CXFA_FFNotify() {}
-void CXFA_FFNotify::OnPageEvent(IXFA_LayoutPage* pSender,
-                                XFA_PAGEEVENT eEvent,
-                                void* pParam) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout());
-  if (!pDocView) {
-    return;
-  }
-  pDocView->OnPageEvent(pSender, eEvent, (int32_t)(uintptr_t)pParam);
-}
-void CXFA_FFNotify::OnNodeEvent(CXFA_Node* pSender,
-                                XFA_NODEEVENT eEvent,
-                                void* pParam,
-                                void* pParam2,
-                                void* pParam3,
-                                void* pParam4) {
-  switch (eEvent) {
-    case XFA_NODEEVENT_Ready:
-      OnNodeReady(pSender);
-      break;
-    case XFA_NODEEVENT_ValueChanging:
-      OnValueChanging(pSender, pParam, pParam2);
-      break;
-    case XFA_NODEEVENT_ValueChanged:
-      OnValueChanged(pSender, pParam, pParam2, pParam3, pParam4);
-      break;
-    case XFA_NODEEVENT_ChildAdded:
-      OnChildAdded(pSender, pParam, pParam2);
-      break;
-    case XFA_NODEEVENT_ChildRemoved:
-      OnChildRemoved(pSender, pParam, pParam2);
-      break;
-  }
-}
-void CXFA_FFNotify::OnWidgetDataEvent(CXFA_WidgetData* pSender,
-                                      FX_DWORD dwEvent,
-                                      void* pParam,
-                                      void* pAdditional,
-                                      void* pAdditional2) {
-  CXFA_WidgetAcc* pWidgetAcc = static_cast<CXFA_WidgetAcc*>(pSender);
-  switch (dwEvent) {
-    case XFA_WIDGETEVENT_ListItemAdded: {
-      if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
-        return;
-      }
-      FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify();
-      CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
-      if (!pWidget) {
-        if (bStaticNotify) {
-          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
-              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
-              pAdditional);
-        }
-        return;
-      }
-      while (pWidget) {
-        if (pWidget->IsLoaded()) {
-          if (pWidgetAcc->IsListBox()) {
-            static_cast<CXFA_FFListBox*>(pWidget)
-                ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
-                             (int32_t)(uintptr_t)pAdditional2);
-          } else {
-            static_cast<CXFA_FFComboBox*>(pWidget)
-                ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
-                             (int32_t)(uintptr_t)pAdditional2);
-          }
-        }
-        if (bStaticNotify) {
-          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
-              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
-              pAdditional);
-        }
-        pWidget = pWidgetAcc->GetNextWidget(pWidget);
-      }
-    } break;
-    case XFA_WIDGETEVENT_ListItemRemoved: {
-      if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
-        return;
-      }
-      FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify();
-      CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
-      if (!pWidget) {
-        if (bStaticNotify) {
-          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
-              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
-              pAdditional);
-        }
-        return;
-      }
-      while (pWidget) {
-        if (pWidget->IsLoaded()) {
-          if (pWidgetAcc->IsListBox()) {
-            static_cast<CXFA_FFListBox*>(pWidget)
-                ->DeleteItem((int32_t)(uintptr_t)pParam);
-          } else {
-            static_cast<CXFA_FFComboBox*>(pWidget)
-                ->DeleteItem((int32_t)(uintptr_t)pParam);
-          }
-        }
-        if (bStaticNotify) {
-          pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
-              pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
-              pAdditional);
-        }
-        pWidget = pWidgetAcc->GetNextWidget(pWidget);
-      }
-    } break;
-  }
-}
-CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) {
-  IXFA_DocLayout* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
-  XFA_ELEMENT eType = pNode->GetClassID();
-  if (eType == XFA_ELEMENT_PageArea) {
-    return new CXFA_FFPageView(pDocView, pNode);
-  }
-  if (eType == XFA_ELEMENT_ContentArea) {
-    return new CXFA_ContainerLayoutItem(pNode);
-  }
-  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData());
-  if (!pAcc) {
-    return new CXFA_ContentLayoutItem(pNode);
-  }
-  CXFA_FFPageView* pPageView = NULL;
-  CXFA_FFWidget* pWidget = NULL;
-  switch (pAcc->GetUIType()) {
-    case XFA_ELEMENT_Barcode:
-      pWidget = new CXFA_FFBarcode(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Button:
-      pWidget = new CXFA_FFPushButton(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_CheckButton:
-      pWidget = new CXFA_FFCheckButton(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_ChoiceList: {
-      if (pAcc->IsListBox()) {
-        pWidget = new CXFA_FFListBox(pPageView, pAcc);
-      } else {
-        pWidget = new CXFA_FFComboBox(pPageView, pAcc);
-      }
-    } break;
-    case XFA_ELEMENT_DateTimeEdit:
-      pWidget = new CXFA_FFDateTimeEdit(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_ImageEdit:
-      pWidget = new CXFA_FFImageEdit(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_NumericEdit:
-      pWidget = new CXFA_FFNumericEdit(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_PasswordEdit:
-      pWidget = new CXFA_FFPasswordEdit(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Signature:
-      pWidget = new CXFA_FFSignature(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_TextEdit:
-      pWidget = new CXFA_FFTextEdit(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Arc:
-      pWidget = new CXFA_FFArc(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Line:
-      pWidget = new CXFA_FFLine(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Rectangle:
-      pWidget = new CXFA_FFRectangle(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Text:
-      pWidget = new CXFA_FFText(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Image:
-      pWidget = new CXFA_FFImage(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Draw:
-      pWidget = new CXFA_FFDraw(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_Subform:
-      pWidget = new CXFA_FFSubForm(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_ExclGroup:
-      pWidget = new CXFA_FFExclGroup(pPageView, pAcc);
-      break;
-    case XFA_ELEMENT_DefaultUi:
-    default:
-      pWidget = NULL;
-      break;
-  }
-  if (!pWidget) {
-    return NULL;
-  }
-  pWidget->SetDocView(pDocView);
-  return pWidget;
-}
-void CXFA_FFNotify::OnLayoutEvent(IXFA_DocLayout* pLayout,
-                                  CXFA_LayoutItem* pSender,
-                                  XFA_LAYOUTEVENT eEvent,
-                                  void* pParam,
-                                  void* pParam2) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
-  if (!pDocView || !XFA_GetWidgetFromLayoutItem(pSender)) {
-    return;
-  }
-  switch (eEvent) {
-    case XFA_LAYOUTEVENT_ItemAdded:
-      OnLayoutItemAdd(pDocView, pLayout, pSender, pParam, pParam2);
-      break;
-    case XFA_LAYOUTEVENT_ItemRemoving:
-      OnLayoutItemRemoving(pDocView, pLayout, pSender, pParam, pParam2);
-      break;
-    case XFA_LAYOUTEVENT_RectChanged:
-      OnLayoutItemRectChanged(pDocView, pLayout, pSender, pParam, pParam2);
-      break;
-    case XFA_LAYOUTEVENT_StatusChanged:
-      OnLayoutItemStatustChanged(pDocView, pLayout, pSender, pParam, pParam2);
-      break;
-  }
-}
-void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node* pItem,
-                                         FX_FLOAT& fCalcWidth,
-                                         FX_FLOAT& fCalcHeight) {
-  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData());
-  if (!pAcc) {
-    return;
-  }
-  pAcc->StartWidgetLayout(fCalcWidth, fCalcHeight);
-}
-FX_BOOL CXFA_FFNotify::FindSplitPos(CXFA_Node* pItem,
-                                    int32_t iBlockIndex,
-                                    FX_FLOAT& fCalcHeightPos) {
-  CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData());
-  if (!pAcc) {
-    return FALSE;
-  }
-  return (XFA_LAYOUTRESULT)pAcc->FindSplitPos(iBlockIndex, fCalcHeightPos);
-}
-FX_BOOL CXFA_FFNotify::RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) {
-  FX_BOOL bRet = FALSE;
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return bRet;
-  }
-  CXFA_WidgetAcc* pWidgetAcc =
-      static_cast<CXFA_WidgetAcc*>(pFormItem->GetWidgetData());
-  if (!pWidgetAcc) {
-    return bRet;
-  }
-  CXFA_EventParam EventParam;
-  EventParam.m_eType = XFA_EVENT_Unknown;
-  FXJSE_HVALUE pRetValue = NULL;
-  int32_t iRet =
-      pWidgetAcc->ExecuteScript(CXFA_Script(pScript), &EventParam, &pRetValue);
-  if (iRet == XFA_EVENTERROR_Sucess && pRetValue) {
-    bRet = FXJSE_Value_ToBoolean(pRetValue);
-    FXJSE_Value_Release(pRetValue);
-  }
-  return bRet;
-}
-int32_t CXFA_FFNotify::ExecEventByDeepFirst(CXFA_Node* pFormNode,
-                                            XFA_EVENTTYPE eEventType,
-                                            FX_BOOL bIsFormReady,
-                                            FX_BOOL bRecursive,
-                                            CXFA_WidgetAcc* pExclude) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  return pDocView->ExecEventActivityByDeepFirst(
-      pFormNode, eEventType, bIsFormReady, bRecursive,
-      pExclude ? pExclude->GetNode() : NULL);
-}
-void CXFA_FFNotify::AddCalcValidate(CXFA_Node* pNode) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  CXFA_WidgetAcc* pWidgetAcc =
-      static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData());
-  if (!pWidgetAcc) {
-    return;
-  }
-  pDocView->AddCalculateWidgetAcc(pWidgetAcc);
-  pDocView->AddValidateWidget(pWidgetAcc);
-}
-IXFA_Doc* CXFA_FFNotify::GetHDOC() {
-  return m_pDoc;
-}
-IXFA_DocProvider* CXFA_FFNotify::GetDocProvider() {
-  return m_pDoc->GetDocProvider();
-}
-IXFA_AppProvider* CXFA_FFNotify::GetAppProvider() {
-  return m_pDoc->GetApp()->GetAppProvider();
-}
-IXFA_WidgetHandler* CXFA_FFNotify::GetWidgetHandler() {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  return pDocView ? pDocView->GetWidgetHandler() : NULL;
-}
-IXFA_Widget* CXFA_FFNotify::GetHWidget(CXFA_LayoutItem* pLayoutItem) {
-  return XFA_GetWidgetFromLayoutItem(pLayoutItem);
-}
-void CXFA_FFNotify::OpenDropDownList(IXFA_Widget* hWidget) {
-  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
-  if (pWidget->GetDataAcc()->GetUIType() != XFA_ELEMENT_ChoiceList) {
-    return;
-  }
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  pDocView->LockUpdate();
-  static_cast<CXFA_FFComboBox*>(pWidget)->OpenDropDownList();
-  pDocView->UnlockUpdate();
-  pDocView->UpdateDocView();
-}
-CFX_WideString CXFA_FFNotify::GetCurrentDateTime() {
-  CFX_Unitime dataTime;
-  dataTime.Now();
-  CFX_WideString wsDateTime;
-  wsDateTime.Format(L"%d%02d%02dT%02d%02d%02d", dataTime.GetYear(),
-                    dataTime.GetMonth(), dataTime.GetDay(), dataTime.GetHour(),
-                    dataTime.GetMinute(), dataTime.GetSecond());
-  return wsDateTime;
-}
-void CXFA_FFNotify::ResetData(CXFA_WidgetData* pWidgetData) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  pDocView->ResetWidgetData(static_cast<CXFA_WidgetAcc*>(pWidgetData));
-}
-int32_t CXFA_FFNotify::GetLayoutStatus() {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  return pDocView ? pDocView->GetLayoutStatus() : 0;
-}
-void CXFA_FFNotify::RunNodeInitialize(CXFA_Node* pNode) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  pDocView->AddNewFormNode(pNode);
-}
-void CXFA_FFNotify::RunSubformIndexChange(CXFA_Node* pSubformNode) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  pDocView->AddIndexChangedSubform(pSubformNode);
-}
-CXFA_Node* CXFA_FFNotify::GetFocusWidgetNode() {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return NULL;
-  }
-  CXFA_WidgetAcc* pAcc = pDocView->GetFocusWidgetAcc();
-  return pAcc ? pAcc->GetNode() : NULL;
-}
-void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  CXFA_WidgetAcc* pAcc =
-      pNode ? static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData()) : nullptr;
-  pDocView->SetFocusWidgetAcc(pAcc);
-}
-void CXFA_FFNotify::OnNodeReady(CXFA_Node* pNode) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  XFA_ELEMENT iType = pNode->GetClassID();
-  if (XFA_IsCreateWidget(iType)) {
-    CXFA_WidgetAcc* pAcc =
-        new CXFA_WidgetAcc(pDocView, static_cast<CXFA_Node*>(pNode));
-    pNode->SetObject(XFA_ATTRIBUTE_WidgetData, pAcc, &gs_XFADeleteWidgetAcc);
-    return;
-  }
-  switch (iType) {
-    case XFA_ELEMENT_BindItems:
-      pDocView->m_bindItems.Add(pNode);
-      break;
-    case XFA_ELEMENT_Validate: {
-      pNode->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
-    } break;
-    default:
-      break;
-  }
-}
-void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender,
-                                    void* pParam,
-                                    void* pParam2) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End) {
-    return;
-  }
-  FX_DWORD dwPacket = pSender->GetPacketID();
-  if (dwPacket & XFA_XDPPACKET_Datasets) {
-  } else if (pSender->IsFormContainer()) {
-    XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam;
-    if (eAttr == XFA_ATTRIBUTE_Presence) {
-      CXFA_WidgetAcc* pWidgetAcc =
-          static_cast<CXFA_WidgetAcc*>(pSender->GetWidgetData());
-      if (!pWidgetAcc) {
-        return;
-      }
-      CXFA_FFWidget* pWidget = NULL;
-      while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
-        if (pWidget->IsLoaded()) {
-          pWidget->AddInvalidateRect();
-        }
-      }
-    }
-  }
-}
-void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender,
-                                   void* pParam,
-                                   void* pParam2,
-                                   void* pParam3,
-                                   void* pParam4) {
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  FX_DWORD dwPacket = pSender->GetPacketID();
-  XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam;
-  if (dwPacket & XFA_XDPPACKET_Form) {
-    CXFA_Node* pParentNode = static_cast<CXFA_Node*>(pParam3);
-    CXFA_Node* pWidgetNode = static_cast<CXFA_Node*>(pParam4);
-    XFA_ELEMENT ePType = pParentNode->GetClassID();
-    FX_BOOL bIsContainerNode = pParentNode->IsContainerNode();
-    CXFA_WidgetAcc* pWidgetAcc =
-        static_cast<CXFA_WidgetAcc*>(pWidgetNode->GetWidgetData());
-    if (!pWidgetAcc) {
-      return;
-    }
-    FX_BOOL bUpdateProperty = FALSE;
-    pDocView->SetChangeMark();
-    switch (ePType) {
-      case XFA_ELEMENT_Caption: {
-        CXFA_TextLayout* pCapOut = pWidgetAcc->GetCaptionTextLayout();
-        if (!pCapOut) {
-          return;
-        }
-        pCapOut->Unload();
-      } break;
-      case XFA_ELEMENT_Ui:
-      case XFA_ELEMENT_Para:
-        bUpdateProperty = TRUE;
-        break;
-      case XFA_ELEMENT_Font:
-      case XFA_ELEMENT_Margin:
-      case XFA_ELEMENT_Value:
-      case XFA_ELEMENT_Items:
-        break;
-      default:
-        break;
-    }
-    if (bIsContainerNode && eAttr == XFA_ATTRIBUTE_Access) {
-      bUpdateProperty = TRUE;
-      FX_BOOL bNotify = pDocView->IsStaticNotify();
-      if (bNotify) {
-        pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_AccessChanged, NULL, pParam2,
-                                NULL);
-      }
-    }
-    if (eAttr == XFA_ATTRIBUTE_Value) {
-      pDocView->AddCalculateNodeNotify(pSender);
-      if (ePType == XFA_ELEMENT_Value || bIsContainerNode) {
-        FX_BOOL bNotify = pDocView->IsStaticNotify();
-        if (bIsContainerNode) {
-          pWidgetAcc->UpdateUIDisplay();
-          pDocView->AddCalculateWidgetAcc(pWidgetAcc);
-          pDocView->AddValidateWidget(pWidgetAcc);
-        } else if (pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent)
-                       ->GetClassID() == XFA_ELEMENT_ExclGroup) {
-          pWidgetAcc->UpdateUIDisplay();
-        }
-        if (bNotify) {
-          pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL,
-                                  NULL, NULL);
-        }
-        return;
-      }
-    }
-    CXFA_FFWidget* pWidget = NULL;
-    while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
-      if (!pWidget->IsLoaded()) {
-        continue;
-      }
-      if (bUpdateProperty) {
-        pWidget->UpdateWidgetProperty();
-      }
-      pWidget->PerformLayout();
-      pWidget->AddInvalidateRect();
-    }
-  } else {
-    if (eAttr == XFA_ATTRIBUTE_Value) {
-      pDocView->AddCalculateNodeNotify(pSender);
-    }
-  }
-}
-void CXFA_FFNotify::OnChildAdded(CXFA_Node* pSender,
-                                 void* pParam,
-                                 void* pParam2) {
-  if (!pSender->IsFormContainer()) {
-    return;
-  }
-  CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
-  if (!pDocView) {
-    return;
-  }
-  FX_BOOL bLayoutReady =
-      !(pDocView->m_bInLayoutStatus) &&
-      (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
-  if (bLayoutReady) {
-    m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
-  }
-}
-void CXFA_FFNotify::OnChildRemoved(CXFA_Node* pSender,
-                                   void* pParam,
-                                   void* pParam2) {
-  if (CXFA_FFDocView* pDocView = m_pDoc->GetDocView()) {
-    FX_BOOL bLayoutReady =
-        !(pDocView->m_bInLayoutStatus) &&
-        (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
-    if (bLayoutReady) {
-      m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
-    }
-  }
-}
-void CXFA_FFNotify::OnLayoutItemAdd(CXFA_FFDocView* pDocView,
-                                    IXFA_DocLayout* pLayout,
-                                    CXFA_LayoutItem* pSender,
-                                    void* pParam,
-                                    void* pParam2) {
-  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
-  int32_t iPageIdx = (int32_t)(uintptr_t)pParam;
-  IXFA_PageView* pNewPageView = pDocView->GetPageView(iPageIdx);
-  FX_DWORD dwStatus = (FX_DWORD)(uintptr_t)pParam2;
-  FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
-                      XFA_WIDGETSTATUS_Printable;
-  pWidget->ModifyStatus(dwStatus, dwFilter);
-  IXFA_PageView* pPrePageView = pWidget->GetPageView();
-  if (pPrePageView != pNewPageView ||
-      (dwStatus & (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) ==
-          (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) {
-    pWidget->SetPageView(pNewPageView);
-    m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
-                                          XFA_WIDGETEVENT_PostAdded,
-                                          pNewPageView, pPrePageView);
-  }
-  if (pDocView->GetLayoutStatus() != XFA_DOCVIEW_LAYOUTSTATUS_End ||
-      !(dwStatus & XFA_WIDGETSTATUS_Visible)) {
-    return;
-  }
-  if (pWidget->IsLoaded()) {
-    CFX_RectF rtOld;
-    pWidget->GetWidgetRect(rtOld);
-    if (rtOld != pWidget->ReCacheWidgetRect())
-      pWidget->PerformLayout();
-  } else {
-    pWidget->LoadWidget();
-  }
-  pWidget->AddInvalidateRect(nullptr);
-}
-void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_FFDocView* pDocView,
-                                         IXFA_DocLayout* pLayout,
-                                         CXFA_LayoutItem* pSender,
-                                         void* pParam,
-                                         void* pParam2) {
-  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
-  pDocView->DeleteLayoutItem(pWidget);
-  m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
-                                        XFA_WIDGETEVENT_PreRemoved, nullptr,
-                                        pWidget->GetPageView());
-  pWidget->AddInvalidateRect(nullptr);
-}
-void CXFA_FFNotify::OnLayoutItemRectChanged(CXFA_FFDocView* pDocView,
-                                            IXFA_DocLayout* pLayout,
-                                            CXFA_LayoutItem* pSender,
-                                            void* pParam,
-                                            void* pParam2) {}
-void CXFA_FFNotify::OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView,
-                                               IXFA_DocLayout* pLayout,
-                                               CXFA_LayoutItem* pSender,
-                                               void* pParam,
-                                               void* pParam2) {
-  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
-  if (!pWidget) {
-    return;
-  }
-  FX_DWORD dwStatus = (FX_DWORD)(uintptr_t)pParam;
-  if (dwStatus == 0) {
-    CXFA_LayoutItem* pPreItem = pSender->GetPrev();
-    if (pPreItem) {
-      CXFA_FFWidget* pPreWidget = static_cast<CXFA_FFWidget*>(pPreItem);
-      if (pPreWidget) {
-        dwStatus = pPreWidget->GetStatus();
-      }
-    }
-  }
-  FX_DWORD dwOldStatus = pWidget->GetStatus();
-  FX_DWORD dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
-                      XFA_WIDGETSTATUS_Printable;
-  if ((dwOldStatus & dwFilter) == dwStatus) {
-    return;
-  }
-  pWidget->ModifyStatus(dwStatus, dwFilter);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffnotify.h b/xfa/src/fxfa/app/xfa_ffnotify.h
deleted file mode 100644
index 0e0b77b..0000000
--- a/xfa/src/fxfa/app/xfa_ffnotify.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFNOTIFY_H_
-#define XFA_SRC_FXFA_APP_XFA_FFNOTIFY_H_
-
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-class CXFA_FFNotify : public IXFA_Notify {
- public:
-  CXFA_FFNotify(CXFA_FFDoc* pDoc);
-  ~CXFA_FFNotify();
-
-  virtual void OnPageEvent(IXFA_LayoutPage* pSender,
-                           XFA_PAGEEVENT eEvent,
-                           void* pParam = NULL);
-
-  virtual void OnNodeEvent(CXFA_Node* pSender,
-                           XFA_NODEEVENT eEvent,
-                           void* pParam = NULL,
-                           void* pParam2 = NULL,
-                           void* pParam3 = NULL,
-                           void* pParam4 = NULL);
-  virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
-                                 FX_DWORD dwEvent,
-                                 void* pParam = NULL,
-                                 void* pAdditional = NULL,
-                                 void* pAdditional2 = NULL);
-  virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode);
-  virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
-                             CXFA_LayoutItem* pSender,
-                             XFA_LAYOUTEVENT eEvent,
-                             void* pParam = NULL,
-                             void* pParam2 = NULL);
-
-  virtual void StartFieldDrawLayout(CXFA_Node* pItem,
-                                    FX_FLOAT& fCalcWidth,
-                                    FX_FLOAT& fCalcHeight);
-  virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
-                               int32_t iBlockIndex,
-                               FX_FLOAT& fCalcHeightPos);
-  virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem);
-  virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
-                                       XFA_EVENTTYPE eEventType,
-                                       FX_BOOL bIsFormReady = FALSE,
-                                       FX_BOOL bRecursive = TRUE,
-                                       CXFA_WidgetAcc* pExclude = NULL);
-  virtual void AddCalcValidate(CXFA_Node* pNode);
-  virtual IXFA_Doc* GetHDOC();
-  virtual IXFA_DocProvider* GetDocProvider();
-  virtual IXFA_AppProvider* GetAppProvider();
-  virtual IXFA_WidgetHandler* GetWidgetHandler();
-  virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem);
-  virtual void OpenDropDownList(IXFA_Widget* hWidget);
-  virtual CFX_WideString GetCurrentDateTime();
-  virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL);
-  virtual int32_t GetLayoutStatus();
-  virtual void RunNodeInitialize(CXFA_Node* pNode);
-  virtual void RunSubformIndexChange(CXFA_Node* pSubformNode);
-  virtual CXFA_Node* GetFocusWidgetNode();
-  virtual void SetFocusWidgetNode(CXFA_Node* pNode);
-
- protected:
-  void OnNodeReady(CXFA_Node* pNode);
-  void OnValueChanging(CXFA_Node* pSender, void* pParam, void* pParam2);
-  void OnValueChanged(CXFA_Node* pSender,
-                      void* pParam,
-                      void* pParam2,
-                      void* pParam3,
-                      void* pParam4);
-  void OnChildAdded(CXFA_Node* pSender, void* pParam, void* pParam2);
-  void OnChildRemoved(CXFA_Node* pSender, void* pParam, void* pParam2);
-  void OnLayoutItemAdd(CXFA_FFDocView* pDocView,
-                       IXFA_DocLayout* pLayout,
-                       CXFA_LayoutItem* pSender,
-                       void* pParam,
-                       void* pParam2);
-  void OnLayoutItemRemoving(CXFA_FFDocView* pDocView,
-                            IXFA_DocLayout* pLayout,
-                            CXFA_LayoutItem* pSender,
-                            void* pParam,
-                            void* pParam2);
-  void OnLayoutItemRectChanged(CXFA_FFDocView* pDocView,
-                               IXFA_DocLayout* pLayout,
-                               CXFA_LayoutItem* pSender,
-                               void* pParam,
-                               void* pParam2);
-  void OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView,
-                                  IXFA_DocLayout* pLayout,
-                                  CXFA_LayoutItem* pSender,
-                                  void* pParam,
-                                  void* pParam2);
-  CXFA_FFDoc* m_pDoc;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFNOTIFY_H_
diff --git a/xfa/src/fxfa/app/xfa_ffpageview.cpp b/xfa/src/fxfa/app/xfa_ffpageview.cpp
deleted file mode 100644
index ba4c970..0000000
--- a/xfa/src/fxfa/app/xfa_ffpageview.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-
-#include "xfa/src/fde/fde_render.h"
-#include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffimageedit.h"
-#include "xfa/src/fxfa/app/xfa_ffpushbutton.h"
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-
-CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
-    : CXFA_ContainerLayoutItem(pPageArea),
-      m_pDocView(pDocView),
-      m_bLoaded(FALSE) {}
-CXFA_FFPageView::~CXFA_FFPageView() {}
-IXFA_DocView* CXFA_FFPageView::GetDocView() {
-  return m_pDocView;
-}
-int32_t CXFA_FFPageView::GetPageViewIndex() {
-  return GetPageIndex();
-}
-void CXFA_FFPageView::GetPageViewRect(CFX_RectF& rtPage) {
-  CFX_SizeF sz;
-  GetPageSize(sz);
-  rtPage.Set(0, 0, sz);
-}
-void CXFA_FFPageView::GetDisplayMatrix(CFX_Matrix& mt,
-                                       const CFX_Rect& rtDisp,
-                                       int32_t iRotate) {
-  CFX_SizeF sz;
-  GetPageSize(sz);
-  CFX_RectF fdePage;
-  fdePage.Set(0, 0, sz.x, sz.y);
-  FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
-}
-int32_t CXFA_FFPageView::LoadPageView(IFX_Pause* pPause) {
-  if (m_bLoaded) {
-    return 100;
-  }
-  m_bLoaded = TRUE;
-  return 100;
-}
-void CXFA_FFPageView::UnloadPageView() {
-  if (!m_bLoaded) {
-    return;
-  }
-}
-FX_BOOL CXFA_FFPageView::IsPageViewLoaded() {
-  return m_bLoaded;
-}
-IXFA_Widget* CXFA_FFPageView::GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_bLoaded) {
-    return nullptr;
-  }
-  IXFA_WidgetIterator* pIterator = CreateWidgetIterator();
-  CXFA_FFWidget* pWidget = nullptr;
-  while ((pWidget = static_cast<CXFA_FFWidget*>(pIterator->MoveToNext()))) {
-    if (!(pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
-      continue;
-    }
-    CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
-    int32_t type = pAcc->GetClassID();
-    if (type != XFA_ELEMENT_Field && type != XFA_ELEMENT_Draw) {
-      continue;
-    }
-    FX_FLOAT fWidgetx = fx;
-    FX_FLOAT fWidgety = fy;
-    pWidget->Rotate2Normal(fWidgetx, fWidgety);
-    FX_DWORD dwFlag = pWidget->OnHitTest(fWidgetx, fWidgety);
-    if ((FWL_WGTHITTEST_Client == dwFlag ||
-         FWL_WGTHITTEST_HyperLink == dwFlag)) {
-      break;
-    }
-  }
-  pIterator->Release();
-  return pWidget;
-}
-IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(
-    FX_DWORD dwTraverseWay,
-    FX_DWORD dwWidgetFilter) {
-  switch (dwTraverseWay) {
-    case XFA_TRAVERSEWAY_Tranvalse:
-      return new CXFA_FFTabOrderPageWidgetIterator(this, dwWidgetFilter);
-    case XFA_TRAVERSEWAY_Form:
-      return new CXFA_FFPageWidgetIterator(this, dwWidgetFilter);
-  }
-  return NULL;
-}
-static FX_BOOL XFA_PageWidgetFilter(CXFA_FFWidget* pWidget,
-                                    FX_DWORD dwFilter,
-                                    FX_BOOL bTraversal,
-                                    FX_BOOL bIgnorerelevant) {
-  CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
-  FX_DWORD dwType = dwFilter & XFA_WIDGETFILTER_AllType;
-  if ((dwType == XFA_WIDGETFILTER_Field) &&
-      (pWidgetAcc->GetClassID() != XFA_ELEMENT_Field)) {
-    return FALSE;
-  }
-  FX_DWORD dwStatus = pWidget->GetStatus();
-  if (bTraversal && (dwStatus & XFA_WIDGETSTATUS_Disabled)) {
-    return FALSE;
-  }
-  if (bIgnorerelevant) {
-    return (dwStatus & XFA_WIDGETFILTER_Visible) != 0;
-  }
-  dwFilter &= (XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable |
-               XFA_WIDGETFILTER_Printable);
-  return (dwFilter & dwStatus) == dwFilter;
-}
-CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
-                                                     FX_DWORD dwFilter) {
-  m_pPageView = pPageView;
-  m_dwFilter = dwFilter;
-  m_sIterator.Init(pPageView);
-  m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
-                          ->GetXFADoc()
-                          ->GetCurVersionMode() < XFA_VERSION_205;
-}
-CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() {}
-void CXFA_FFPageWidgetIterator::Reset() {
-  m_sIterator.Reset();
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToFirst() {
-  m_sIterator.Reset();
-  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
-       pLayoutItem = m_sIterator.MoveToNext()) {
-    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
-      return hWidget;
-    }
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToLast() {
-  m_sIterator.SetCurrent(NULL);
-  return MoveToPrevious();
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToNext() {
-  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
-       pLayoutItem = m_sIterator.MoveToNext()) {
-    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
-      return hWidget;
-    }
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
-  for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
-       pLayoutItem = m_sIterator.MoveToPrev()) {
-    if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
-      return hWidget;
-    }
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::GetCurrentWidget() {
-  CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent();
-  return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : NULL;
-}
-FX_BOOL CXFA_FFPageWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
-  CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
-  return pWidget && m_sIterator.SetCurrent(pWidget);
-}
-IXFA_Widget* CXFA_FFPageWidgetIterator::GetWidget(
-    CXFA_LayoutItem* pLayoutItem) {
-  if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
-    if (!XFA_PageWidgetFilter(pWidget, m_dwFilter, FALSE, m_bIgnorerelevant)) {
-      return NULL;
-    }
-    if (!pWidget->IsLoaded() &&
-        (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible) != 0) {
-      pWidget->LoadWidget();
-    }
-    return pWidget;
-  }
-  return NULL;
-}
-CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
-    CXFA_FFPageView* pPageView,
-    FX_DWORD dwFilter)
-    : m_pPageView(pPageView), m_dwFilter(dwFilter), m_iCurWidget(-1) {
-  m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
-                          ->GetXFADoc()
-                          ->GetCurVersionMode() < XFA_VERSION_205;
-  Reset();
-}
-CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {}
-void CXFA_FFTabOrderPageWidgetIterator::Release() {
-  delete this;
-}
-void CXFA_FFTabOrderPageWidgetIterator::Reset() {
-  CreateTabOrderWidgetArray();
-  m_iCurWidget = -1;
-}
-IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
-  if (m_TabOrderWidgetArray.GetSize() > 0) {
-    for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) {
-      if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
-                               m_bIgnorerelevant)) {
-        m_iCurWidget = i;
-        return m_TabOrderWidgetArray[m_iCurWidget];
-      }
-    }
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
-  if (m_TabOrderWidgetArray.GetSize() > 0) {
-    for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) {
-      if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
-                               m_bIgnorerelevant)) {
-        m_iCurWidget = i;
-        return m_TabOrderWidgetArray[m_iCurWidget];
-      }
-    }
-  }
-  return NULL;
-}
-IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
-  for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) {
-    if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
-                             m_bIgnorerelevant)) {
-      m_iCurWidget = i;
-      return m_TabOrderWidgetArray[m_iCurWidget];
-    }
-  }
-  m_iCurWidget = -1;
-  return NULL;
-}
-IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
-  for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
-    if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
-                             m_bIgnorerelevant)) {
-      m_iCurWidget = i;
-      return m_TabOrderWidgetArray[m_iCurWidget];
-    }
-  }
-  m_iCurWidget = -1;
-  return NULL;
-}
-IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
-  if (m_iCurWidget >= 0) {
-    return m_TabOrderWidgetArray[m_iCurWidget];
-  }
-  return NULL;
-}
-FX_BOOL CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
-    IXFA_Widget* hWidget) {
-  int32_t iWidgetIndex =
-      m_TabOrderWidgetArray.Find(static_cast<CXFA_FFWidget*>(hWidget));
-  if (iWidgetIndex >= 0) {
-    m_iCurWidget = iWidgetIndex;
-    return TRUE;
-  }
-  return FALSE;
-}
-CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
-    CXFA_FFWidget* pWidget) {
-  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
-  CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_ELEMENT_Traversal);
-  if (pTraversal) {
-    CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_ELEMENT_Traverse);
-    if (pTraverse) {
-      CFX_WideString wsTraverseWidgetName;
-      if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) {
-        return FindWidgetByName(wsTraverseWidgetName, pWidget);
-      }
-    }
-  }
-  return NULL;
-}
-CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
-    const CFX_WideStringC& wsWidgetName,
-    CXFA_FFWidget* pRefWidget) {
-  return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
-}
-void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
-  m_TabOrderWidgetArray.RemoveAll();
-  CXFA_WidgetArray SpaceOrderWidgetArray;
-  CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray);
-  int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize();
-  if (nWidgetCount < 1) {
-    return;
-  }
-  CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
-  for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) {
-    if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
-      m_TabOrderWidgetArray.Add(hWidget);
-      CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
-      if (pWidgetAcc->GetUIType() == XFA_ELEMENT_ExclGroup) {
-        int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1;
-        while (TRUE) {
-          CXFA_FFWidget* pRadio =
-              SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount];
-          if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
-            break;
-          }
-          if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
-            m_TabOrderWidgetArray.Add(pRadio);
-          }
-          iWidgetIndex++;
-        }
-      }
-      if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) {
-        hWidget = hTraverseWidget;
-        continue;
-      }
-    }
-    int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget);
-    hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount];
-  }
-}
-static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
-                                            const void* phWidget2) {
-  CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
-  CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget;
-  CFX_RectF rt1, rt2;
-  pWidget1->GetWidgetRect(rt1);
-  pWidget2->GetWidgetRect(rt2);
-  FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top;
-  if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) {
-    return -1;
-  }
-  return 1;
-}
-void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(
-    CXFA_LayoutItemIterator* sIterator,
-    CXFA_LayoutItem* pContainerItem,
-    CXFA_TabParam* pContainer,
-    FX_BOOL& bCurrentItem,
-    FX_BOOL& bContentArea,
-    FX_BOOL bMarsterPage) {
-  CFX_PtrArray tabParams;
-  CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
-  while (pSearchItem) {
-    if (!pSearchItem->IsContentLayoutItem()) {
-      bContentArea = TRUE;
-      pSearchItem = sIterator->MoveToNext();
-      continue;
-    }
-    if (bMarsterPage && bContentArea) {
-      break;
-    }
-    if (bMarsterPage || bContentArea) {
-      CXFA_FFWidget* hWidget = GetWidget(pSearchItem);
-      if (!hWidget) {
-        pSearchItem = sIterator->MoveToNext();
-        continue;
-      }
-      if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) {
-        bCurrentItem = TRUE;
-        break;
-      }
-      CXFA_TabParam* pParam = new CXFA_TabParam;
-      pParam->m_pWidget = hWidget;
-      tabParams.Add(pParam);
-      if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetClassID(), TRUE)) {
-        OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem,
-                       bContentArea, bMarsterPage);
-      }
-    }
-    if (bCurrentItem) {
-      pSearchItem = sIterator->GetCurrent();
-      bCurrentItem = FALSE;
-    } else {
-      pSearchItem = sIterator->MoveToNext();
-    }
-  }
-  int32_t iChildren = tabParams.GetSize();
-  if (iChildren > 1) {
-    FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*),
-                XFA_TabOrderWidgetComparator);
-  }
-  for (int32_t iStart = 0; iStart < iChildren; iStart++) {
-    CXFA_TabParam* pParam = (CXFA_TabParam*)tabParams[iStart];
-    pContainer->m_Children.Add(pParam->m_pWidget);
-    if (pParam->m_Children.GetSize() > 0) {
-      pContainer->m_Children.Append(pParam->m_Children);
-    }
-    delete pParam;
-  }
-  tabParams.RemoveAll();
-}
-void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
-    CXFA_WidgetArray& WidgetArray) {
-  CXFA_LayoutItemIterator sIterator;
-  sIterator.Init(m_pPageView);
-  CXFA_TabParam* pParam = new CXFA_TabParam;
-  FX_BOOL bCurrentItem = FALSE;
-  FX_BOOL bContentArea = FALSE;
-  OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea);
-  if (pParam->m_Children.GetSize() > 0) {
-    WidgetArray.Append(pParam->m_Children);
-  }
-  sIterator.Reset();
-  bCurrentItem = FALSE;
-  bContentArea = FALSE;
-  pParam->m_Children.RemoveAll();
-  OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea, TRUE);
-  if (pParam->m_Children.GetSize() > 0) {
-    WidgetArray.Append(pParam->m_Children);
-  }
-  delete pParam;
-}
-CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
-    CXFA_LayoutItem* pLayoutItem) {
-  if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
-    if (!pWidget->IsLoaded() &&
-        (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
-      pWidget->LoadWidget();
-    }
-    return pWidget;
-  }
-  return NULL;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffpageview.h b/xfa/src/fxfa/app/xfa_ffpageview.h
deleted file mode 100644
index 58e6377..0000000
--- a/xfa/src/fxfa/app/xfa_ffpageview.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFPAGEVIEW_H_
-#define XFA_SRC_FXFA_APP_XFA_FFPAGEVIEW_H_
-
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-
-class CXFA_FFWidget;
-class CXFA_FFDocView;
-class CXFA_FFPageView : public CXFA_ContainerLayoutItem, public IXFA_PageView {
- public:
-  CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
-  ~CXFA_FFPageView() override;
-
-  // IFXA_PageView:
-  IXFA_DocView* GetDocView() override;
-  int32_t GetPageViewIndex() override;
-  void GetPageViewRect(CFX_RectF& rtPage) override;
-  void GetDisplayMatrix(CFX_Matrix& mt,
-                        const CFX_Rect& rtDisp,
-                        int32_t iRotate) override;
-  int32_t LoadPageView(IFX_Pause* pPause = NULL) override;
-  void UnloadPageView() override;
-  IXFA_Widget* GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) override;
-  IXFA_WidgetIterator* CreateWidgetIterator(
-      FX_DWORD dwTraverseWay = XFA_TRAVERSEWAY_Form,
-      FX_DWORD dwWidgetFilter = XFA_WIDGETFILTER_Visible |
-                                XFA_WIDGETFILTER_Viewable |
-                                XFA_WIDGETFILTER_AllType) override;
-
-  FX_BOOL IsPageViewLoaded();
-
- protected:
-  CXFA_FFDocView* m_pDocView;
-  FX_BOOL m_bLoaded;
-};
-typedef CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
-                                  CXFA_TraverseStrategy_LayoutItem>
-    CXFA_LayoutItemIterator;
-class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
- public:
-  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter);
-  virtual ~CXFA_FFPageWidgetIterator();
-  virtual void Release() { delete this; }
-
-  virtual void Reset();
-  virtual IXFA_Widget* MoveToFirst();
-  virtual IXFA_Widget* MoveToLast();
-  virtual IXFA_Widget* MoveToNext();
-  virtual IXFA_Widget* MoveToPrevious();
-  virtual IXFA_Widget* GetCurrentWidget();
-  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
-
- protected:
-  IXFA_Widget* GetWidget(CXFA_LayoutItem* pLayoutItem);
-  CXFA_FFPageView* m_pPageView;
-  IXFA_Widget* m_hCurWidget;
-  FX_DWORD m_dwFilter;
-  FX_BOOL m_bIgnorerelevant;
-  CXFA_LayoutItemIterator m_sIterator;
-};
-typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
-class CXFA_TabParam {
- public:
-  CXFA_TabParam() : m_pWidget(NULL) {}
-  ~CXFA_TabParam() {}
-
-  CXFA_FFWidget* m_pWidget;
-  CXFA_WidgetArray m_Children;
-};
-class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
- public:
-  CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
-                                    FX_DWORD dwFilter);
-  virtual ~CXFA_FFTabOrderPageWidgetIterator();
-
-  virtual void Release();
-
-  virtual void Reset();
-  virtual IXFA_Widget* MoveToFirst();
-  virtual IXFA_Widget* MoveToLast();
-  virtual IXFA_Widget* MoveToNext();
-  virtual IXFA_Widget* MoveToPrevious();
-  virtual IXFA_Widget* GetCurrentWidget();
-  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);
-
- protected:
-  CXFA_WidgetArray m_TabOrderWidgetArray;
-  CXFA_FFPageView* m_pPageView;
-  FX_DWORD m_dwFilter;
-  int32_t m_iCurWidget;
-  FX_BOOL m_bIgnorerelevant;
-  CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
-  CXFA_FFWidget* FindWidgetByName(const CFX_WideStringC& wsWidgetName,
-                                  CXFA_FFWidget* pRefWidget);
-  void CreateTabOrderWidgetArray();
-  void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
-  CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
-  void OrderContainer(CXFA_LayoutItemIterator* sIterator,
-                      CXFA_LayoutItem* pContainerItem,
-                      CXFA_TabParam* pContainer,
-                      FX_BOOL& bCurrentItem,
-                      FX_BOOL& bContentArea,
-                      FX_BOOL bMarsterPage = FALSE);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFPAGEVIEW_H_
diff --git a/xfa/src/fxfa/app/xfa_ffpath.cpp b/xfa/src/fxfa/app/xfa_ffpath.cpp
deleted file mode 100644
index 6f744c9..0000000
--- a/xfa/src/fxfa/app/xfa_ffpath.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffpath.h"
-
-#include "xfa/include/fxgraphics/fx_graphics.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFLine::CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFDraw(pPageView, pDataAcc) {}
-CXFA_FFLine::~CXFA_FFLine() {}
-void CXFA_FFLine::GetRectFromHand(CFX_RectF& rect,
-                                  int32_t iHand,
-                                  FX_FLOAT fLineWidth) {
-  FX_FLOAT fHalfWidth = fLineWidth / 2.0f;
-  if (rect.height < 1.0f) {
-    switch (iHand) {
-      case XFA_ATTRIBUTEENUM_Left:
-        rect.top -= fHalfWidth;
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        rect.top += fHalfWidth;
-    }
-  } else if (rect.width < 1.0f) {
-    switch (iHand) {
-      case XFA_ATTRIBUTEENUM_Left:
-        rect.left += fHalfWidth;
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        rect.left += fHalfWidth;
-        break;
-    }
-  } else {
-    switch (iHand) {
-      case XFA_ATTRIBUTEENUM_Left:
-        rect.Inflate(fHalfWidth, fHalfWidth);
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        rect.Deflate(fHalfWidth, fHalfWidth);
-        break;
-    }
-  }
-}
-void CXFA_FFLine::RenderWidget(CFX_Graphics* pGS,
-                               CFX_Matrix* pMatrix,
-                               FX_DWORD dwStatus,
-                               int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value) {
-    return;
-  }
-  CXFA_Line lineObj = value.GetLine();
-  FX_ARGB lineColor = 0xFF000000;
-  int32_t iStrokeType = 0;
-  FX_FLOAT fLineWidth = 1.0f;
-  FX_BOOL bSlope = lineObj.GetSlop();
-  int32_t iCap = 0;
-  CXFA_Edge edge = lineObj.GetEdge();
-  if (edge) {
-    if (edge.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-      return;
-    }
-    lineColor = edge.GetColor();
-    iStrokeType = edge.GetStrokeType();
-    fLineWidth = edge.GetThickness();
-    iCap = edge.GetCapType();
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CFX_RectF rtLine;
-  GetRectWithoutRotate(rtLine);
-  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-    XFA_RectWidthoutMargin(rtLine, mgWidget);
-  }
-  GetRectFromHand(rtLine, lineObj.GetHand(), fLineWidth);
-  CFX_Path linePath;
-  linePath.Create();
-  if (bSlope && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f) {
-    linePath.AddLine(rtLine.right(), rtLine.top, rtLine.left, rtLine.bottom());
-  } else {
-    linePath.AddLine(rtLine.left, rtLine.top, rtLine.right(), rtLine.bottom());
-  }
-  CFX_Color color(lineColor);
-  pGS->SaveGraphState();
-  pGS->SetLineWidth(fLineWidth, TRUE);
-  XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap);
-  pGS->SetStrokeColor(&color);
-  pGS->SetLineCap(XFA_LineCapToFXGE(iCap));
-  pGS->StrokePath(&linePath, &mtRotate);
-  pGS->RestoreGraphState();
-}
-CXFA_FFArc::CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFDraw(pPageView, pDataAcc) {}
-CXFA_FFArc::~CXFA_FFArc() {}
-void CXFA_FFArc::RenderWidget(CFX_Graphics* pGS,
-                              CFX_Matrix* pMatrix,
-                              FX_DWORD dwStatus,
-                              int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value) {
-    return;
-  }
-  CXFA_Arc arcObj = value.GetArc();
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CFX_RectF rtArc;
-  GetRectWithoutRotate(rtArc);
-  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-    XFA_RectWidthoutMargin(rtArc, mgWidget);
-  }
-  DrawBorder(pGS, arcObj, rtArc, &mtRotate);
-}
-CXFA_FFRectangle::CXFA_FFRectangle(CXFA_FFPageView* pPageView,
-                                   CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFDraw(pPageView, pDataAcc) {}
-CXFA_FFRectangle::~CXFA_FFRectangle() {}
-void CXFA_FFRectangle::RenderWidget(CFX_Graphics* pGS,
-                                    CFX_Matrix* pMatrix,
-                                    FX_DWORD dwStatus,
-                                    int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value) {
-    return;
-  }
-  CXFA_Rectangle rtObj = value.GetRectangle();
-  CFX_RectF rect;
-  GetRectWithoutRotate(rect);
-  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-    XFA_RectWidthoutMargin(rect, mgWidget);
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  DrawBorder(pGS, rtObj, rect, &mtRotate);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffpath.h b/xfa/src/fxfa/app/xfa_ffpath.h
deleted file mode 100644
index a215812..0000000
--- a/xfa/src/fxfa/app/xfa_ffpath.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFPATH_H_
-#define XFA_SRC_FXFA_APP_XFA_FFPATH_H_
-
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-
-class CXFA_FFLine : public CXFA_FFDraw {
- public:
-  CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFLine();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-
- private:
-  void GetRectFromHand(CFX_RectF& rect, int32_t iHand, FX_FLOAT fLineWidth);
-};
-class CXFA_FFArc : public CXFA_FFDraw {
- public:
-  CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFArc();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-};
-class CXFA_FFRectangle : public CXFA_FFDraw {
- public:
-  CXFA_FFRectangle(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFRectangle();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFPATH_H_
diff --git a/xfa/src/fxfa/app/xfa_ffpushbutton.cpp b/xfa/src/fxfa/app/xfa_ffpushbutton.cpp
deleted file mode 100644
index 492a135..0000000
--- a/xfa/src/fxfa/app/xfa_ffpushbutton.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffpushbutton.h"
-
-#include "xfa/include/fwl/core/fwl_widgetmgr.h"
-#include "xfa/include/fwl/lightwidget/pushbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_ffwidgetacc.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-CXFA_FFPushButton::CXFA_FFPushButton(CXFA_FFPageView* pPageView,
-                                     CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc),
-      m_pRolloverTextLayout(NULL),
-      m_pDownTextLayout(NULL),
-      m_pDownProvider(NULL),
-      m_pRollProvider(NULL),
-      m_pOldDelegate(NULL) {}
-CXFA_FFPushButton::~CXFA_FFPushButton() {
-  CXFA_FFPushButton::UnloadWidget();
-}
-void CXFA_FFPushButton::RenderWidget(CFX_Graphics* pGS,
-                                     CFX_Matrix* pMatrix,
-                                     FX_DWORD dwStatus,
-                                     int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  RenderHighlightCaption(pGS, &mtRotate);
-  CFX_RectF rtWidget;
-  GetRectWithoutRotate(rtWidget);
-  CFX_Matrix mt;
-  mt.Set(1, 0, 0, 1, rtWidget.left, rtWidget.top);
-  mt.Concat(mtRotate);
-  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget->GetWidget(),
-                                                 pGS, &mt);
-}
-FX_BOOL CXFA_FFPushButton::LoadWidget() {
-  FXSYS_assert(m_pNormalWidget == NULL);
-  CFWL_PushButton* pPushButton = CFWL_PushButton::Create();
-  if (pPushButton) {
-    pPushButton->Initialize();
-  }
-  m_pOldDelegate = pPushButton->SetDelegate(this);
-  m_pNormalWidget = (CFWL_Widget*)pPushButton;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pNormalWidget->LockUpdate();
-  UpdateWidgetProperty();
-  LoadHighlightCaption();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFPushButton::UpdateWidgetProperty() {
-  FX_DWORD dwStyleEx = 0;
-  switch (m_pDataAcc->GetButtonHighlight()) {
-    case XFA_ATTRIBUTEENUM_Inverted:
-      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteInverted;
-      break;
-    case XFA_ATTRIBUTEENUM_Outline:
-      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HiliteOutLine;
-      break;
-    case XFA_ATTRIBUTEENUM_Push:
-      dwStyleEx = XFA_FWL_PSBSTYLEEXT_HilitePush;
-      break;
-    default:
-      break;
-  }
-  m_pNormalWidget->ModifyStylesEx(dwStyleEx, 0xFFFFFFFF);
-}
-void CXFA_FFPushButton::UnloadWidget() {
-  if (m_pRolloverTextLayout) {
-    delete m_pRolloverTextLayout;
-    m_pRolloverTextLayout = NULL;
-  }
-  if (m_pDownTextLayout) {
-    delete m_pDownTextLayout;
-    m_pDownTextLayout = NULL;
-  }
-  if (m_pDownProvider) {
-    delete m_pDownProvider;
-    m_pDownProvider = NULL;
-  }
-  if (m_pRollProvider) {
-    delete m_pRollProvider;
-    m_pRollProvider = NULL;
-  }
-  CXFA_FFField::UnloadWidget();
-}
-FX_BOOL CXFA_FFPushButton::PerformLayout() {
-  CXFA_FFWidget::PerformLayout();
-  CFX_RectF rtWidget;
-  GetRectWithoutRotate(rtWidget);
-  m_rtUI = rtWidget;
-  if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-    XFA_RectWidthoutMargin(rtWidget, mgWidget);
-  }
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  m_rtCaption.Set(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height);
-  if (CXFA_Margin mgCap = caption.GetMargin()) {
-    XFA_RectWidthoutMargin(m_rtCaption, mgCap);
-  }
-  LayoutHighlightCaption();
-  SetFWLRect();
-  if (m_pNormalWidget) {
-    m_pNormalWidget->Update();
-  }
-  return TRUE;
-}
-FX_FLOAT CXFA_FFPushButton::GetLineWidth() {
-  CXFA_Border border = m_pDataAcc->GetBorder();
-  if (border && border.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
-    CXFA_Edge edge = border.GetEdge(0);
-    return edge.GetThickness();
-  }
-  return 0;
-}
-FX_ARGB CXFA_FFPushButton::GetLineColor() {
-  return 0xFF000000;
-}
-FX_ARGB CXFA_FFPushButton::GetFillColor() {
-  return 0xFFFFFFFF;
-}
-void CXFA_FFPushButton::LoadHighlightCaption() {
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
-    {
-      CFX_WideString wsRollover;
-      FX_BOOL bRichText;
-      if (m_pDataAcc->GetButtonRollover(wsRollover, bRichText)) {
-        if (m_pRollProvider == NULL) {
-          m_pRollProvider =
-              new CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Rollover);
-        }
-        m_pRolloverTextLayout = new CXFA_TextLayout(m_pRollProvider);
-      }
-      CFX_WideString wsDown;
-      if (m_pDataAcc->GetButtonDown(wsDown, bRichText)) {
-        if (m_pDownProvider == NULL) {
-          m_pDownProvider =
-              new CXFA_TextProvider(m_pDataAcc, XFA_TEXTPROVIDERTYPE_Down);
-        }
-        m_pDownTextLayout = new CXFA_TextLayout(m_pDownProvider);
-      }
-    }
-  }
-}
-void CXFA_FFPushButton::LayoutHighlightCaption() {
-  CFX_SizeF sz(m_rtCaption.width, m_rtCaption.height);
-  LayoutCaption();
-  if (m_pRolloverTextLayout) {
-    m_pRolloverTextLayout->Layout(sz);
-  }
-  if (m_pDownTextLayout) {
-    m_pDownTextLayout->Layout(sz);
-  }
-}
-void CXFA_FFPushButton::RenderHighlightCaption(CFX_Graphics* pGS,
-                                               CFX_Matrix* pMatrix) {
-  CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
-  CXFA_Caption caption = m_pDataAcc->GetCaption();
-  if (caption && caption.GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
-    CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
-    CFX_RectF rtWidget;
-    GetRectWithoutRotate(rtWidget);
-    CFX_RectF rtClip = m_rtCaption;
-    rtClip.Intersect(rtWidget);
-    CFX_Matrix mt;
-    mt.Set(1, 0, 0, 1, m_rtCaption.left, m_rtCaption.top);
-    if (pMatrix) {
-      pMatrix->TransformRect(rtClip);
-      mt.Concat(*pMatrix);
-    }
-    {
-      FX_DWORD dwState = m_pNormalWidget->GetStates();
-      if (m_pDownTextLayout && (dwState & FWL_STATE_PSB_Pressed) &&
-          (dwState & FWL_STATE_PSB_Hovered)) {
-        if (m_pDownTextLayout->DrawString(pRenderDevice, mt, rtClip)) {
-          return;
-        }
-      } else if (m_pRolloverTextLayout && (dwState & FWL_STATE_PSB_Hovered)) {
-        if (m_pRolloverTextLayout->DrawString(pRenderDevice, mt, rtClip)) {
-          return;
-        }
-      }
-    }
-    if (pCapTextLayout) {
-      pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
-    }
-  }
-}
-int32_t CXFA_FFPushButton::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFPushButton::OnProcessEvent(CFWL_Event* pEvent) {
-  m_pOldDelegate->OnProcessEvent(pEvent);
-  return CXFA_FFField::OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFPushButton::OnDrawWidget(CFX_Graphics* pGraphics,
-                                        const CFX_Matrix* pMatrix) {
-  if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HiliteInverted) {
-    if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
-        (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) {
-      CFX_RectF rtFill;
-      m_pNormalWidget->GetWidgetRect(rtFill);
-      rtFill.left = rtFill.top = 0;
-      FX_FLOAT fLineWith = GetLineWidth();
-      rtFill.Deflate(fLineWith, fLineWith);
-      CFX_Color cr(FXARGB_MAKE(128, 128, 255, 255));
-      pGraphics->SetFillColor(&cr);
-      CFX_Path path;
-      path.Create();
-      path.AddRectangle(rtFill.left, rtFill.top, rtFill.width, rtFill.height);
-      pGraphics->FillPath(&path, FXFILL_WINDING, (CFX_Matrix*)pMatrix);
-    }
-  } else if (m_pNormalWidget->GetStylesEx() &
-             XFA_FWL_PSBSTYLEEXT_HiliteOutLine) {
-    if ((m_pNormalWidget->GetStates() & FWL_STATE_PSB_Pressed) &&
-        (m_pNormalWidget->GetStates() & FWL_STATE_PSB_Hovered)) {
-      FX_FLOAT fLineWidth = GetLineWidth();
-      CFX_Color cr(FXARGB_MAKE(255, 128, 255, 255));
-      pGraphics->SetStrokeColor(&cr);
-      pGraphics->SetLineWidth(fLineWidth);
-      CFX_Path path;
-      path.Create();
-      CFX_RectF rect;
-      m_pNormalWidget->GetWidgetRect(rect);
-      path.AddRectangle(0, 0, rect.width, rect.height);
-      pGraphics->StrokePath(&path, (CFX_Matrix*)pMatrix);
-    }
-  } else if (m_pNormalWidget->GetStylesEx() & XFA_FWL_PSBSTYLEEXT_HilitePush) {
-  }
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffpushbutton.h b/xfa/src/fxfa/app/xfa_ffpushbutton.h
deleted file mode 100644
index 19e72a7..0000000
--- a/xfa/src/fxfa/app/xfa_ffpushbutton.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFPUSHBUTTON_H_
-#define XFA_SRC_FXFA_APP_XFA_FFPUSHBUTTON_H_
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-
-#define XFA_FWL_PSBSTYLEEXT_HiliteNone (0L << 0)
-#define XFA_FWL_PSBSTYLEEXT_HiliteInverted (1L << 0)
-#define XFA_FWL_PSBSTYLEEXT_HilitePush (2L << 0)
-#define XFA_FWL_PSBSTYLEEXT_HiliteOutLine (4L << 0)
-
-class CXFA_TextProvider;
-
-class CXFA_FFPushButton : public CXFA_FFField {
- public:
-  CXFA_FFPushButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFPushButton();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual void UpdateWidgetProperty();
-  virtual int32_t OnProcessMessage(CFWL_Message* pMessage);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-  virtual FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                               const CFX_Matrix* pMatrix = NULL);
-
- protected:
-  void LoadHighlightCaption();
-  void LayoutHighlightCaption();
-  void RenderHighlightCaption(CFX_Graphics* pGS, CFX_Matrix* pMatrix = NULL);
-  FX_FLOAT GetLineWidth();
-  FX_ARGB GetLineColor();
-  FX_ARGB GetFillColor();
-  CXFA_TextLayout* m_pRolloverTextLayout;
-  CXFA_TextLayout* m_pDownTextLayout;
-  CXFA_TextProvider* m_pDownProvider;
-  CXFA_TextProvider* m_pRollProvider;
-  IFWL_WidgetDelegate* m_pOldDelegate;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFPUSHBUTTON_H_
diff --git a/xfa/src/fxfa/app/xfa_ffsignature.cpp b/xfa/src/fxfa/app/xfa_ffsignature.cpp
deleted file mode 100644
index 9c4d31b..0000000
--- a/xfa/src/fxfa/app/xfa_ffsignature.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffsignature.h"
-
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFSignature::CXFA_FFSignature(CXFA_FFPageView* pPageView,
-                                   CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc) {}
-CXFA_FFSignature::~CXFA_FFSignature() {}
-FX_BOOL CXFA_FFSignature::LoadWidget() {
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFSignature::RenderWidget(CFX_Graphics* pGS,
-                                    CFX_Matrix* pMatrix,
-                                    FX_DWORD dwStatus,
-                                    int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CFX_Matrix mtRotate;
-  GetRotateMatrix(mtRotate);
-  if (pMatrix) {
-    mtRotate.Concat(*pMatrix);
-  }
-  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
-  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
-  RenderCaption(pGS, &mtRotate);
-  DrawHighlight(pGS, &mtRotate, dwStatus, FALSE);
-  CFX_RectF rtWidget = m_rtUI;
-  IXFA_DocProvider* pDocProvider = m_pDataAcc->GetDoc()->GetDocProvider();
-  FXSYS_assert(pDocProvider);
-  pDocProvider->RenderCustomWidget(this, pGS, &mtRotate, rtWidget);
-}
-FX_BOOL CXFA_FFSignature::OnMouseEnter() {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnMouseExit() {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnLButtonDown(FX_DWORD dwFlags,
-                                        FX_FLOAT fx,
-                                        FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnLButtonUp(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnLButtonDblClk(FX_DWORD dwFlags,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnMouseMove(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnMouseWheel(FX_DWORD dwFlags,
-                                       int16_t zDelta,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnRButtonDown(FX_DWORD dwFlags,
-                                        FX_FLOAT fx,
-                                        FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnRButtonUp(FX_DWORD dwFlags,
-                                      FX_FLOAT fx,
-                                      FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnRButtonDblClk(FX_DWORD dwFlags,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFSignature::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_DWORD CXFA_FFSignature::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pNormalWidget) {
-    FX_FLOAT ffx = fx, ffy = fy;
-    FWLToClient(ffx, ffy);
-    FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy);
-    if (dwWidgetHit != FWL_WGTHITTEST_Unknown) {
-      return FWL_WGTHITTEST_Client;
-    }
-  }
-  CFX_RectF rtBox;
-  GetRectWithoutRotate(rtBox);
-  if (!rtBox.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Unknown;
-  }
-  if (m_rtCaption.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Titlebar;
-  }
-  return FWL_WGTHITTEST_Client;
-}
-FX_BOOL CXFA_FFSignature::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffsignature.h b/xfa/src/fxfa/app/xfa_ffsignature.h
deleted file mode 100644
index 6c7a614..0000000
--- a/xfa/src/fxfa/app/xfa_ffsignature.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFSIGNATURE_H_
-#define XFA_SRC_FXFA_APP_XFA_FFSIGNATURE_H_
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-
-class CXFA_FFSignature final : public CXFA_FFField {
- public:
-  CXFA_FFSignature(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFSignature();
-
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL OnMouseEnter();
-  virtual FX_BOOL OnMouseExit();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-
-  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
-  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFSIGNATURE_H_
diff --git a/xfa/src/fxfa/app/xfa_ffsubform.cpp b/xfa/src/fxfa/app/xfa_ffsubform.cpp
deleted file mode 100644
index 8845a36..0000000
--- a/xfa/src/fxfa/app/xfa_ffsubform.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffsubform.h"
-
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFSubForm::CXFA_FFSubForm(CXFA_FFPageView* pPageView,
-                               CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFWidget(pPageView, pDataAcc) {}
-CXFA_FFSubForm::~CXFA_FFSubForm() {}
diff --git a/xfa/src/fxfa/app/xfa_ffsubform.h b/xfa/src/fxfa/app/xfa_ffsubform.h
deleted file mode 100644
index cb82f91..0000000
--- a/xfa/src/fxfa/app/xfa_ffsubform.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFSUBFORM_H_
-#define XFA_SRC_FXFA_APP_XFA_FFSUBFORM_H_
-
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-class CXFA_FFSubForm : public CXFA_FFWidget {
- public:
-  CXFA_FFSubForm(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFSubForm();
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFSUBFORM_H_
diff --git a/xfa/src/fxfa/app/xfa_fftext.cpp b/xfa/src/fxfa/app/xfa_fftext.cpp
deleted file mode 100644
index 95d408c..0000000
--- a/xfa/src/fxfa/app/xfa_fftext.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fftext.h"
-
-#include "xfa/include/fwl/core/fwl_widgetdef.h"
-#include "xfa/include/fxgraphics/fx_graphics.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-CXFA_FFText::CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFDraw(pPageView, pDataAcc) {}
-CXFA_FFText::~CXFA_FFText() {}
-void CXFA_FFText::RenderWidget(CFX_Graphics* pGS,
-                               CFX_Matrix* pMatrix,
-                               FX_DWORD dwStatus,
-                               int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  {
-    CFX_Matrix mtRotate;
-    GetRotateMatrix(mtRotate);
-    if (pMatrix) {
-      mtRotate.Concat(*pMatrix);
-    }
-    CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
-    CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
-    if (pTextLayout) {
-      CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
-      CFX_RectF rtText;
-      GetRectWithoutRotate(rtText);
-      if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-        CXFA_LayoutItem* pItem = this;
-        if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
-          XFA_RectWidthoutMargin(rtText, mgWidget);
-        } else {
-          FX_FLOAT fLeftInset, fRightInset, fTopInset = 0, fBottomInset = 0;
-          mgWidget.GetLeftInset(fLeftInset);
-          mgWidget.GetRightInset(fRightInset);
-          if (pItem->GetPrev() == NULL) {
-            mgWidget.GetTopInset(fTopInset);
-          } else if (pItem->GetNext() == NULL) {
-            mgWidget.GetBottomInset(fBottomInset);
-          }
-          rtText.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
-        }
-      }
-      CFX_Matrix mt;
-      mt.Set(1, 0, 0, 1, rtText.left, rtText.top);
-      CFX_RectF rtClip = rtText;
-      mtRotate.TransformRect(rtClip);
-      mt.Concat(mtRotate);
-      pTextLayout->DrawString(pRenderDevice, mt, rtClip, GetIndex());
-    }
-  }
-}
-FX_BOOL CXFA_FFText::IsLoaded() {
-  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
-  return pTextLayout && !pTextLayout->m_bHasBlock;
-}
-FX_BOOL CXFA_FFText::PerformLayout() {
-  CXFA_FFDraw::PerformLayout();
-  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
-  if (!pTextLayout) {
-    return FALSE;
-  }
-  if (!pTextLayout->m_bHasBlock) {
-    return TRUE;
-  }
-  pTextLayout->m_Blocks.RemoveAll();
-  CXFA_LayoutItem* pItem = this;
-  if (pItem->GetPrev() == NULL && pItem->GetNext() == NULL) {
-    return TRUE;
-  }
-  pItem = pItem->GetFirst();
-  while (pItem) {
-    CFX_RectF rtText;
-    pItem->GetRect(rtText);
-    if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin()) {
-      if (pItem->GetPrev() == NULL) {
-        FX_FLOAT fTopInset;
-        mgWidget.GetTopInset(fTopInset);
-        rtText.height -= fTopInset;
-      } else if (pItem->GetNext() == NULL) {
-        FX_FLOAT fBottomInset;
-        mgWidget.GetBottomInset(fBottomInset);
-        rtText.height -= fBottomInset;
-      }
-    }
-    pTextLayout->ItemBlocks(rtText, pItem->GetIndex());
-    pItem = pItem->GetNext();
-  }
-  pTextLayout->m_bHasBlock = FALSE;
-  return TRUE;
-}
-FX_BOOL CXFA_FFText::OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rtBox;
-  GetRectWithoutRotate(rtBox);
-  if (!rtBox.Contains(fx, fy)) {
-    return FALSE;
-  }
-  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
-  if (NULL == wsURLContent) {
-    return FALSE;
-  }
-  SetButtonDown(TRUE);
-  return TRUE;
-}
-FX_BOOL CXFA_FFText::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rtBox;
-  GetRectWithoutRotate(rtBox);
-  if (!rtBox.Contains(fx, fy)) {
-    return FALSE;
-  }
-  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
-  if (NULL == wsURLContent) {
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_FFText::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  if (!IsButtonDown()) {
-    return FALSE;
-  }
-  SetButtonDown(FALSE);
-  const FX_WCHAR* wsURLContent = GetLinkURLAtPoint(fx, fy);
-  if (NULL == wsURLContent) {
-    return FALSE;
-  }
-  CXFA_FFDoc* pDoc = GetDoc();
-  pDoc->GetDocProvider()->GotoURL(pDoc, CFX_WideStringC(wsURLContent), FALSE);
-  return TRUE;
-}
-FX_DWORD CXFA_FFText::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rtBox;
-  GetRectWithoutRotate(rtBox);
-  if (!rtBox.Contains(fx, fy)) {
-    return FWL_WGTHITTEST_Unknown;
-  }
-  if (!GetLinkURLAtPoint(fx, fy)) {
-    return FWL_WGTHITTEST_Unknown;
-  }
-  return FWL_WGTHITTEST_HyperLink;
-}
-const FX_WCHAR* CXFA_FFText::GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
-  CXFA_TextLayout* pTextLayout = m_pDataAcc->GetTextLayout();
-  if (NULL == pTextLayout) {
-    return NULL;
-  }
-  FX_FLOAT x(fx), y(fy);
-  FWLToClient(x, y);
-  const CXFA_PieceLineArray* pPieceLines = pTextLayout->GetPieceLines();
-  int32_t iCount = pPieceLines->GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_PieceLine* pPieceLine = pPieceLines->GetAt(i);
-    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
-    for (int32_t j = 0; j < iPieces; j++) {
-      XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
-      if (pPiece->pLinkData && pPiece->rtPiece.Contains(x, y)) {
-        return pPiece->pLinkData->GetLinkURL();
-      }
-    }
-  }
-  return NULL;
-}
-void CXFA_FFText::FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy) {
-  CFX_RectF rtWidget;
-  GetRectWithoutRotate(rtWidget);
-  fx -= rtWidget.left;
-  fy -= rtWidget.top;
-}
diff --git a/xfa/src/fxfa/app/xfa_fftext.h b/xfa/src/fxfa/app/xfa_fftext.h
deleted file mode 100644
index 673d157..0000000
--- a/xfa/src/fxfa/app/xfa_fftext.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFTEXT_H_
-#define XFA_SRC_FXFA_APP_XFA_FFTEXT_H_
-
-#include "xfa/src/fxfa/app/xfa_ffdraw.h"
-
-class CXFA_FFText : public CXFA_FFDraw {
- public:
-  CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFText();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL PerformLayout();
-
- private:
-  virtual const FX_WCHAR* GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy);
-  void FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFTEXT_H_
diff --git a/xfa/src/fxfa/app/xfa_fftextedit.cpp b/xfa/src/fxfa/app/xfa_fftextedit.cpp
deleted file mode 100644
index f828939..0000000
--- a/xfa/src/fxfa/app/xfa_fftextedit.cpp
+++ /dev/null
@@ -1,796 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fftextedit.h"
-
-#include <vector>
-
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/lightwidget/datetimepicker.h"
-#include "xfa/include/fwl/lightwidget/edit.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-
-CXFA_FFTextEdit::CXFA_FFTextEdit(CXFA_FFPageView* pPageView,
-                                 CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
-CXFA_FFTextEdit::~CXFA_FFTextEdit() {
-  if (m_pNormalWidget) {
-    IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-    IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-    pNoteDriver->UnregisterEventTarget(pWidget);
-  }
-}
-FX_BOOL CXFA_FFTextEdit::LoadWidget() {
-  CFWL_Edit* pFWLEdit = CFWL_Edit::Create();
-  pFWLEdit->Initialize();
-  m_pNormalWidget = pFWLEdit;
-  IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pWidget, pWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  UpdateWidgetProperty();
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
-  pFWLEdit->SetText(wsText);
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFTextEdit::UpdateWidgetProperty() {
-  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
-  if (!pWidget) {
-    return;
-  }
-  FX_DWORD dwStyle = 0;
-  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus |
-                             FWL_STYLEEXT_EDT_OuterScrollbar |
-                             FWL_STYLEEXT_EDT_LastLineHeight;
-  dwExtendedStyle |= UpdateUIProperty();
-  if (m_pDataAcc->IsMultiLine()) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine | FWL_STYLEEXT_EDT_WantReturn;
-    if (m_pDataAcc->GetVerticalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-      dwStyle |= FWL_WGTSTYLE_VScroll;
-      dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoVScroll;
-    }
-  } else if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine;
-  }
-  XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
-  int32_t iMaxChars = m_pDataAcc->GetMaxChars(eType);
-  if (eType == XFA_ELEMENT_ExData) {
-    iMaxChars = 0;
-  }
-  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
-  if (iNumCells == 0) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetLimit(iMaxChars > 0 ? iMaxChars : 1);
-  } else if (iNumCells > 0) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetLimit(iNumCells);
-  } else {
-    pWidget->SetLimit(iMaxChars);
-  }
-  dwExtendedStyle |= GetAlignment();
-  m_pNormalWidget->ModifyStyles(dwStyle, 0xFFFFFFFF);
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-}
-FX_BOOL CXFA_FFTextEdit::OnLButtonDown(FX_DWORD dwFlags,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  if (!PtInActiveRect(fx, fy)) {
-    return FALSE;
-  }
-  if (!IsFocused()) {
-    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
-    UpdateFWLData();
-    AddInvalidateRect();
-  }
-  SetButtonDown(TRUE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::OnRButtonDown(FX_DWORD dwFlags,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  if (!PtInActiveRect(fx, fy)) {
-    return FALSE;
-  }
-  if (!IsFocused()) {
-    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
-    UpdateFWLData();
-    AddInvalidateRect();
-  }
-  SetButtonDown(TRUE);
-  CFWL_MsgMouse ms;
-  ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown;
-  ms.m_dwFlags = dwFlags;
-  ms.m_fx = fx;
-  ms.m_fy = fy;
-  FWLToClient(ms.m_fx, ms.m_fy);
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::OnRButtonUp(FX_DWORD dwFlags,
-                                     FX_FLOAT fx,
-                                     FX_FLOAT fy) {
-  if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy))
-    return FALSE;
-
-  GetDoc()->GetDocProvider()->PopupMenu(this, CFX_PointF(fx, fy), nullptr);
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
-  m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
-  if (!IsFocused()) {
-    m_dwStatus |= XFA_WIDGETSTATUS_Focused;
-    UpdateFWLData();
-    AddInvalidateRect();
-  }
-  CXFA_FFWidget::OnSetFocus(pOldWidget);
-  CFWL_MsgSetFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
-  CFWL_MsgKillFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
-  ms.m_pSrcTarget = NULL;
-  TranslateFWLMessage(&ms);
-  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
-  SetEditScrollOffset();
-  ProcessCommittedData();
-  UpdateFWLData();
-  AddInvalidateRect();
-  CXFA_FFWidget::OnKillFocus(pNewWidget);
-  m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::CommitData() {
-  CFX_WideString wsText;
-  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsText);
-  if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
-    m_pDataAcc->UpdateUIDisplay(this);
-    return TRUE;
-  }
-  ValidateNumberField(wsText);
-  return FALSE;
-}
-void CXFA_FFTextEdit::ValidateNumberField(const CFX_WideString& wsText) {
-  CXFA_WidgetAcc* pAcc = GetDataAcc();
-  if (pAcc && pAcc->GetUIType() == XFA_ELEMENT_NumericEdit) {
-    IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
-    if (pAppProvider) {
-      CFX_WideString wsTitle;
-      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
-      CFX_WideString wsMessage;
-      CFX_WideString wsError;
-      pAppProvider->LoadString(XFA_IDS_ValidateNumberError, wsError);
-      CFX_WideString wsSomField;
-      pAcc->GetNode()->GetSOMExpression(wsSomField);
-      wsMessage.Format(wsError, (const FX_WCHAR*)wsText,
-                       (const FX_WCHAR*)wsSomField);
-      pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
-    }
-  }
-}
-FX_BOOL CXFA_FFTextEdit::IsDataChanged() {
-  return (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) != 0;
-}
-FX_DWORD CXFA_FFTextEdit::GetAlignment() {
-  FX_DWORD dwExtendedStyle = 0;
-  if (CXFA_Para para = m_pDataAcc->GetPara()) {
-    int32_t iHorz = para.GetHorizontalAlign();
-    switch (iHorz) {
-      case XFA_ATTRIBUTEENUM_Center:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_HCenter;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_Justified;
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        break;
-      case XFA_ATTRIBUTEENUM_Radix:
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_HFar;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_HNear;
-        break;
-    }
-    int32_t iVert = para.GetVerticalAlign();
-    switch (iVert) {
-      case XFA_ATTRIBUTEENUM_Middle:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_VCenter;
-        break;
-      case XFA_ATTRIBUTEENUM_Bottom:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_VFar;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_EDT_VNear;
-        break;
-    }
-  }
-  return dwExtendedStyle;
-}
-FX_BOOL CXFA_FFTextEdit::UpdateFWLData() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
-  if (IsFocused()) {
-    eType = XFA_VALUEPICTURE_Edit;
-  }
-  FX_BOOL bUpdate = FALSE;
-  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_TextEdit &&
-      m_pDataAcc->GetNumberOfCells() < 0) {
-    XFA_ELEMENT elementType = XFA_ELEMENT_UNKNOWN;
-    int32_t iMaxChars = m_pDataAcc->GetMaxChars(elementType);
-    if (elementType == XFA_ELEMENT_ExData) {
-      iMaxChars = eType == XFA_VALUEPICTURE_Edit ? iMaxChars : 0;
-    }
-    if (((CFWL_Edit*)m_pNormalWidget)->GetLimit() != iMaxChars) {
-      ((CFWL_Edit*)m_pNormalWidget)->SetLimit(iMaxChars);
-      bUpdate = TRUE;
-    }
-  }
-  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_Barcode) {
-    int32_t nDataLen = 0;
-    if (eType == XFA_VALUEPICTURE_Edit)
-      m_pDataAcc->GetBarcodeAttribute_DataLength(nDataLen);
-    static_cast<CFWL_Edit*>(m_pNormalWidget)->SetLimit(nDataLen);
-    bUpdate = TRUE;
-  }
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, eType);
-  CFX_WideString wsOldText;
-  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsOldText);
-  if (wsText != wsOldText || (eType == XFA_VALUEPICTURE_Edit && bUpdate)) {
-    ((CFWL_Edit*)m_pNormalWidget)->SetText(wsText);
-    bUpdate = TRUE;
-  }
-  if (bUpdate) {
-    m_pNormalWidget->Update();
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_FFTextEdit::CanUndo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->CanUndo();
-}
-FX_BOOL CXFA_FFTextEdit::CanRedo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->CanRedo();
-}
-FX_BOOL CXFA_FFTextEdit::Undo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Undo();
-}
-FX_BOOL CXFA_FFTextEdit::Redo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Redo();
-}
-FX_BOOL CXFA_FFTextEdit::CanCopy() {
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
-  return nCount > 0;
-}
-FX_BOOL CXFA_FFTextEdit::CanCut() {
-  if (m_pNormalWidget->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
-    return FALSE;
-  }
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
-  return nCount > 0;
-}
-FX_BOOL CXFA_FFTextEdit::CanPaste() {
-  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
-}
-FX_BOOL CXFA_FFTextEdit::CanSelectAll() {
-  return ((CFWL_Edit*)m_pNormalWidget)->GetTextLength() > 0;
-}
-FX_BOOL CXFA_FFTextEdit::Copy(CFX_WideString& wsCopy) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Copy(wsCopy);
-}
-FX_BOOL CXFA_FFTextEdit::Cut(CFX_WideString& wsCut) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Cut(wsCut);
-}
-FX_BOOL CXFA_FFTextEdit::Paste(const CFX_WideString& wsPaste) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Paste(wsPaste);
-}
-FX_BOOL CXFA_FFTextEdit::SelectAll() {
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->GetTextLength();
-  return ((CFWL_Edit*)m_pNormalWidget)->AddSelRange(0, nCount);
-}
-FX_BOOL CXFA_FFTextEdit::Delete() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Delete();
-}
-FX_BOOL CXFA_FFTextEdit::DeSelect() {
-  return ((CFWL_Edit*)m_pNormalWidget)->ClearSelections();
-}
-FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
-    CFX_PointF pointf,
-    std::vector<CFX_ByteString>& sSuggest) {
-  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
-    return FALSE;
-  }
-  FWLToClient(pointf.x, pointf.y);
-  return ((CFWL_Edit*)m_pNormalWidget)->GetSuggestWords(pointf, sSuggest);
-}
-FX_BOOL CXFA_FFTextEdit::ReplaceSpellCheckWord(
-    CFX_PointF pointf,
-    const CFX_ByteStringC& bsReplace) {
-  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
-    return FALSE;
-  }
-  FWLToClient(pointf.x, pointf.y);
-  return ((CFWL_Edit*)m_pNormalWidget)
-      ->ReplaceSpellCheckWord(pointf, bsReplace);
-}
-void CXFA_FFTextEdit::OnTextChanged(IFWL_Widget* pWidget,
-                                    const CFX_WideString& wsChanged,
-                                    const CFX_WideString& wsPrevText) {
-  m_dwStatus |= XFA_WIDGETSTATUS_TextEditValueChanged;
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Change;
-  eParam.m_wsChange = wsChanged;
-  eParam.m_pTarget = m_pDataAcc;
-  eParam.m_wsPrevText = wsPrevText;
-  CFWL_Edit* pEdit = ((CFWL_Edit*)m_pNormalWidget);
-  if (m_pDataAcc->GetUIType() == XFA_ELEMENT_DateTimeEdit) {
-    CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit;
-    pDateTime->GetEditText(eParam.m_wsNewText);
-    int32_t iSels = pDateTime->CountSelRanges();
-    if (iSels) {
-      eParam.m_iSelEnd = pDateTime->GetSelRange(0, eParam.m_iSelStart);
-    }
-  } else {
-    pEdit->GetText(eParam.m_wsNewText);
-    int32_t iSels = pEdit->CountSelRanges();
-    if (iSels) {
-      eParam.m_iSelEnd = pEdit->GetSelRange(0, eParam.m_iSelStart);
-    }
-  }
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
-}
-void CXFA_FFTextEdit::OnTextFull(IFWL_Widget* pWidget) {
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Full;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Full, &eParam);
-}
-
-FX_BOOL CXFA_FFTextEdit::CheckWord(const CFX_ByteStringC& sWord) {
-  if (sWord.IsEmpty() || m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
-    return TRUE;
-  }
-  return GetDoc()->GetDocProvider()->CheckWord(GetDoc(), sWord);
-}
-FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
-    const CFX_ByteStringC& sWord,
-    std::vector<CFX_ByteString>& sSuggest) {
-  if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
-    return FALSE;
-  }
-  return GetDoc()->GetDocProvider()->GetSuggestWords(GetDoc(), sWord, sSuggest);
-}
-int32_t CXFA_FFTextEdit::OnProcessMessage(CFWL_Message* pMessage) {
-  return m_pOldDelegate->OnProcessMessage(pMessage);
-}
-FWL_ERR CXFA_FFTextEdit::OnProcessEvent(CFWL_Event* pEvent) {
-  CXFA_FFField::OnProcessEvent(pEvent);
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  switch (dwEventID) {
-    case FWL_EVTHASH_EDT_TextChanged: {
-      CFWL_EvtEdtTextChanged* event = (CFWL_EvtEdtTextChanged*)pEvent;
-      CFX_WideString wsChange;
-      OnTextChanged(m_pNormalWidget->GetWidget(), wsChange, event->wsPrevText);
-      break;
-    }
-    case FWL_EVTHASH_EDT_TextFull: {
-      OnTextFull(m_pNormalWidget->GetWidget());
-      break;
-    }
-    case FWL_EVTHASH_EDT_CheckWord: {
-      CFX_WideString wstr(L"FWL_EVENT_DTP_SelectChanged");
-      CFWL_EvtEdtCheckWord* event = (CFWL_EvtEdtCheckWord*)pEvent;
-      event->bCheckWord = CheckWord(event->bsWord);
-      break;
-    }
-    case FWL_EVTHASH_EDT_GetSuggestWords: {
-      CFWL_EvtEdtGetSuggestWords* event = (CFWL_EvtEdtGetSuggestWords*)pEvent;
-      event->bSuggestWords =
-          GetSuggestWords(event->bsWord, event->bsArraySuggestWords);
-      break;
-    }
-    default: {}
-  }
-  return m_pOldDelegate->OnProcessEvent(pEvent);
-}
-FWL_ERR CXFA_FFTextEdit::OnDrawWidget(CFX_Graphics* pGraphics,
-                                      const CFX_Matrix* pMatrix) {
-  return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
-}
-CXFA_FFNumericEdit::CXFA_FFNumericEdit(CXFA_FFPageView* pPageView,
-                                       CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
-CXFA_FFNumericEdit::~CXFA_FFNumericEdit() {}
-FX_BOOL CXFA_FFNumericEdit::LoadWidget() {
-  CFWL_Edit* pWidget = CFWL_Edit::Create();
-  pWidget->Initialize();
-  m_pNormalWidget = (CFWL_Widget*)pWidget;
-  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
-  pWidget->SetText(wsText);
-  UpdateWidgetProperty();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFNumericEdit::UpdateWidgetProperty() {
-  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
-  if (!pWidget) {
-    return;
-  }
-  FX_DWORD dwExtendedStyle =
-      FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
-      FWL_STYLEEXT_EDT_Validate | FWL_STYLEEXT_EDT_Number |
-      FWL_STYLEEXT_EDT_LastLineHeight;
-  dwExtendedStyle |= UpdateUIProperty();
-  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
-  }
-  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
-  if (iNumCells > 0) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetLimit(iNumCells);
-  }
-  dwExtendedStyle |= GetAlignment();
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
-  }
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-}
-FWL_ERR CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event* pEvent) {
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  if (dwEventID == FWL_EVTHASH_EDT_Validate) {
-    CFWL_EvtEdtValidate* event = (CFWL_EvtEdtValidate*)pEvent;
-    CFX_WideString wsChange = event->wsInsert;
-    event->bValidate = OnValidate(m_pNormalWidget->GetWidget(), wsChange);
-    return event->bValidate;
-  } else {
-    return CXFA_FFTextEdit::OnProcessEvent(pEvent);
-  }
-}
-FX_BOOL CXFA_FFNumericEdit::OnValidate(IFWL_Widget* pWidget,
-                                       CFX_WideString& wsText) {
-  CFX_WideString wsPattern;
-  m_pDataAcc->GetPictureContent(wsPattern, XFA_VALUEPICTURE_Edit);
-  if (!wsPattern.IsEmpty()) {
-    return TRUE;
-  }
-  int32_t iLeads = 0;
-  m_pDataAcc->GetLeadDigits(iLeads);
-  int32_t iFracs = 0;
-  m_pDataAcc->GetFracDigits(iFracs);
-  CFX_WideString wsFormat;
-  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(m_pDataAcc);
-  widgetValue.GetNumbericFormat(wsFormat, iLeads, iFracs);
-  return widgetValue.ValidateNumericTemp(wsText, wsFormat,
-                                         m_pDataAcc->GetLocal());
-}
-CXFA_FFPasswordEdit::CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView,
-                                         CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
-CXFA_FFPasswordEdit::~CXFA_FFPasswordEdit() {}
-FX_BOOL CXFA_FFPasswordEdit::LoadWidget() {
-  CFWL_Edit* pWidget = CFWL_Edit::Create();
-  pWidget->Initialize();
-  m_pNormalWidget = (CFWL_Widget*)pWidget;
-  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
-  pWidget->SetText(wsText);
-  UpdateWidgetProperty();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFPasswordEdit::UpdateWidgetProperty() {
-  CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
-  if (!pWidget) {
-    return;
-  }
-  FX_DWORD dwExtendedStyle =
-      FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
-      FWL_STYLEEXT_EDT_Password | FWL_STYLEEXT_EDT_LastLineHeight;
-  dwExtendedStyle |= UpdateUIProperty();
-  CFX_WideString wsPassWord;
-  m_pDataAcc->GetPasswordChar(wsPassWord);
-  if (!wsPassWord.IsEmpty()) {
-    pWidget->SetAliasChar(wsPassWord.GetAt(0));
-  }
-  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
-  }
-  dwExtendedStyle |= GetAlignment();
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-}
-CXFA_FFDateTimeEdit::CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView,
-                                         CXFA_WidgetAcc* pDataAcc)
-    : CXFA_FFTextEdit(pPageView, pDataAcc) {}
-
-CXFA_FFDateTimeEdit::~CXFA_FFDateTimeEdit() {}
-
-FX_BOOL CXFA_FFDateTimeEdit::GetBBox(CFX_RectF& rtBox,
-                                     FX_DWORD dwStatus,
-                                     FX_BOOL bDrawFocus) {
-  if (bDrawFocus)
-    return FALSE;
-  return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
-}
-
-FX_BOOL CXFA_FFDateTimeEdit::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  CFX_RectF rtWidget;
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetBBox(rtWidget);
-  if (rtWidget.Contains(fx, fy)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_FFDateTimeEdit::LoadWidget() {
-  CFWL_DateTimePicker* pWidget = CFWL_DateTimePicker::Create();
-  pWidget->Initialize();
-  m_pNormalWidget = (CFWL_Widget*)pWidget;
-  IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
-  m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
-  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
-  pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
-  m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
-  m_pNormalWidget->LockUpdate();
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
-  pWidget->SetEditText(wsText);
-  if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
-    switch (value.GetChildValueClassID()) {
-      case XFA_ELEMENT_Date: {
-        if (!wsText.IsEmpty()) {
-          CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
-          CFX_Unitime date = lcValue.GetDate();
-          if ((FX_UNITIME)date != 0) {
-            pWidget->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
-          }
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  UpdateWidgetProperty();
-  m_pNormalWidget->UnlockUpdate();
-  return CXFA_FFField::LoadWidget();
-}
-void CXFA_FFDateTimeEdit::UpdateWidgetProperty() {
-  CFWL_DateTimePicker* pWidget = (CFWL_DateTimePicker*)m_pNormalWidget;
-  if (!pWidget) {
-    return;
-  }
-  FX_DWORD dwExtendedStyle = FWL_STYLEEXT_DTP_ShortDateFormat;
-  dwExtendedStyle |= UpdateUIProperty();
-  dwExtendedStyle |= GetAlignment();
-  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-  FX_DWORD dwEditStyles = FWL_STYLEEXT_EDT_LastLineHeight;
-  int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
-  if (iNumCells > 0) {
-    dwEditStyles |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetEditLimit(iNumCells);
-  }
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
-      !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
-    dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
-  }
-  if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
-    dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
-  }
-  pWidget->ModifyEditStylesEx(dwEditStyles, 0xFFFFFFFF);
-}
-FX_DWORD CXFA_FFDateTimeEdit::GetAlignment() {
-  FX_DWORD dwExtendedStyle = 0;
-  if (CXFA_Para para = m_pDataAcc->GetPara()) {
-    int32_t iHorz = para.GetHorizontalAlign();
-    switch (iHorz) {
-      case XFA_ATTRIBUTEENUM_Center:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHCenter;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditJustified;
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        break;
-      case XFA_ATTRIBUTEENUM_Radix:
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHFar;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHNear;
-        break;
-    }
-    int32_t iVert = para.GetVerticalAlign();
-    switch (iVert) {
-      case XFA_ATTRIBUTEENUM_Middle:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVCenter;
-        break;
-      case XFA_ATTRIBUTEENUM_Bottom:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVFar;
-        break;
-      default:
-        dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVNear;
-        break;
-    }
-  }
-  return dwExtendedStyle;
-}
-FX_BOOL CXFA_FFDateTimeEdit::CommitData() {
-  CFX_WideString wsText;
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
-  if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
-    m_pDataAcc->UpdateUIDisplay(this);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_FFDateTimeEdit::UpdateFWLData() {
-  if (!m_pNormalWidget) {
-    return FALSE;
-  }
-  XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
-  if (IsFocused()) {
-    eType = XFA_VALUEPICTURE_Edit;
-  }
-  CFX_WideString wsText;
-  m_pDataAcc->GetValue(wsText, eType);
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->SetEditText(wsText);
-  if (IsFocused() && !wsText.IsEmpty()) {
-    CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
-    CFX_Unitime date = lcValue.GetDate();
-    if (lcValue.IsValid()) {
-      if ((FX_UNITIME)date != 0) {
-        ((CFWL_DateTimePicker*)m_pNormalWidget)
-            ->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
-      }
-    }
-  }
-  m_pNormalWidget->Update();
-  return TRUE;
-}
-FX_BOOL CXFA_FFDateTimeEdit::IsDataChanged() {
-  if (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) {
-    return TRUE;
-  }
-  CFX_WideString wsText;
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
-  CFX_WideString wsOldValue;
-  m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit);
-  return wsOldValue != wsText;
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanUndo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanUndo();
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanRedo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanRedo();
-}
-FX_BOOL CXFA_FFDateTimeEdit::Undo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Undo();
-}
-FX_BOOL CXFA_FFDateTimeEdit::Redo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Redo();
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanCopy() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCopy();
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanCut() {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return FALSE;
-  }
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCut();
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanPaste() {
-  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
-}
-FX_BOOL CXFA_FFDateTimeEdit::CanSelectAll() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanSelectAll();
-}
-FX_BOOL CXFA_FFDateTimeEdit::Copy(CFX_WideString& wsCopy) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Copy(wsCopy);
-}
-FX_BOOL CXFA_FFDateTimeEdit::Cut(CFX_WideString& wsCut) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Cut(wsCut);
-}
-FX_BOOL CXFA_FFDateTimeEdit::Paste(const CFX_WideString& wsPaste) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Paste(wsPaste);
-}
-FX_BOOL CXFA_FFDateTimeEdit::SelectAll() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->SelectAll();
-}
-FX_BOOL CXFA_FFDateTimeEdit::Delete() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Delete();
-}
-FX_BOOL CXFA_FFDateTimeEdit::DeSelect() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->DeSelect();
-}
-void CXFA_FFDateTimeEdit::OnSelectChanged(IFWL_Widget* pWidget,
-                                          int32_t iYear,
-                                          int32_t iMonth,
-                                          int32_t iDay) {
-  CFX_WideString wsPicture;
-  m_pDataAcc->GetPictureContent(wsPicture, XFA_VALUEPICTURE_Edit);
-  CXFA_LocaleValue date(XFA_VT_DATE, GetDoc()->GetXFADoc()->GetLocalMgr());
-  CFX_Unitime dt;
-  dt.Set(iYear, iMonth, iDay);
-  date.SetDate(dt);
-  CFX_WideString wsDate;
-  date.FormatPatterns(wsDate, wsPicture, m_pDataAcc->GetLocal(),
-                      XFA_VALUEPICTURE_Edit);
-  CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)m_pNormalWidget;
-  pDateTime->SetEditText(wsDate);
-  pDateTime->Update();
-  GetDoc()->GetDocProvider()->SetFocusWidget(GetDoc(), NULL);
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Change;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
-}
-FWL_ERR CXFA_FFDateTimeEdit::OnProcessEvent(CFWL_Event* pEvent) {
-  FX_DWORD dwEventID = pEvent->GetClassID();
-  if (dwEventID == FWL_EVTHASH_DTP_SelectChanged) {
-    CFWL_Event_DtpSelectChanged* event = (CFWL_Event_DtpSelectChanged*)pEvent;
-    OnSelectChanged(m_pNormalWidget->GetWidget(), event->iYear, event->iMonth,
-                    event->iDay);
-    return TRUE;
-  } else {
-    return CXFA_FFTextEdit::OnProcessEvent(pEvent);
-  }
-}
diff --git a/xfa/src/fxfa/app/xfa_fftextedit.h b/xfa/src/fxfa/app/xfa_fftextedit.h
deleted file mode 100644
index a87300de..0000000
--- a/xfa/src/fxfa/app/xfa_fftextedit.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFTEXTEDIT_H_
-#define XFA_SRC_FXFA_APP_XFA_FFTEXTEDIT_H_
-
-#include <vector>
-
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-
-class CXFA_FFTextEdit : public CXFA_FFField {
- public:
-  CXFA_FFTextEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  ~CXFA_FFTextEdit() override;
-
-  // CXFA_FFField:
-  FX_BOOL LoadWidget() override;
-  void UpdateWidgetProperty() override;
-  FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
-  FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
-  FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
-  FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget) override;
-  FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget) override;
-  FX_BOOL CanUndo() override;
-  FX_BOOL CanRedo() override;
-  FX_BOOL Undo() override;
-  FX_BOOL Redo() override;
-  FX_BOOL CanCopy() override;
-  FX_BOOL CanCut() override;
-  FX_BOOL CanPaste() override;
-  FX_BOOL CanSelectAll() override;
-  FX_BOOL Copy(CFX_WideString& wsCopy) override;
-  FX_BOOL Cut(CFX_WideString& wsCut) override;
-  FX_BOOL Paste(const CFX_WideString& wsPaste) override;
-  FX_BOOL SelectAll() override;
-  FX_BOOL Delete() override;
-  FX_BOOL DeSelect() override;
-  FX_BOOL GetSuggestWords(CFX_PointF pointf,
-                          std::vector<CFX_ByteString>& sSuggest) override;
-  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
-                                const CFX_ByteStringC& bsReplace) override;
-
-  // IFWL_WidgetDelegate:
-  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
-  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
-  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
-                       const CFX_Matrix* pMatrix = NULL) override;
-
-  void OnTextChanged(IFWL_Widget* pWidget,
-                     const CFX_WideString& wsChanged,
-                     const CFX_WideString& wsPrevText);
-  void OnTextFull(IFWL_Widget* pWidget);
-  FX_BOOL CheckWord(const CFX_ByteStringC& sWord);
-  FX_BOOL GetSuggestWords(const CFX_ByteStringC& sWord,
-                          std::vector<CFX_ByteString>& sSuggest);
-
- protected:
-  FX_DWORD GetAlignment();
-  FX_BOOL CommitData() override;
-  FX_BOOL UpdateFWLData() override;
-  FX_BOOL IsDataChanged() override;
-  void ValidateNumberField(const CFX_WideString& wsText);
-
-  IFWL_WidgetDelegate* m_pOldDelegate;
-};
-
-class CXFA_FFNumericEdit : public CXFA_FFTextEdit {
- public:
-  CXFA_FFNumericEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFNumericEdit();
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-
- public:
-  FX_BOOL OnValidate(IFWL_Widget* pWidget, CFX_WideString& wsText);
-};
-class CXFA_FFPasswordEdit : public CXFA_FFTextEdit {
- public:
-  CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFPasswordEdit();
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-
- protected:
-};
-enum XFA_DATETIMETYPE {
-  XFA_DATETIMETYPE_Date = 0,
-  XFA_DATETIMETYPE_Time,
-  XFA_DATETIMETYPE_DateAndTime
-};
-class CXFA_FFDateTimeEdit : public CXFA_FFTextEdit {
- public:
-  CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFDateTimeEdit();
-
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          FX_DWORD dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
-
-  virtual FX_BOOL CanCopy();
-  virtual FX_BOOL CanCut();
-  virtual FX_BOOL CanPaste();
-  virtual FX_BOOL CanSelectAll();
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL SelectAll();
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL DeSelect();
-
- protected:
-  FX_DWORD GetAlignment();
-
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-
- public:
-  void OnSelectChanged(IFWL_Widget* pWidget,
-                       int32_t iYear,
-                       int32_t iMonth,
-                       int32_t iDay);
-  virtual FWL_ERR OnProcessEvent(CFWL_Event* pEvent);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFTEXTEDIT_H_
diff --git a/xfa/src/fxfa/app/xfa_ffwidget.cpp b/xfa/src/fxfa/app/xfa_ffwidget.cpp
deleted file mode 100644
index cc947b0..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidget.cpp
+++ /dev/null
@@ -1,1961 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-#include <algorithm>
-
-#include "core/include/fpdfapi/fpdf_page.h"
-#include "core/include/fxcodec/fx_codec.h"
-#include "xfa/include/fxgraphics/fx_graphics.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-CXFA_FFWidget::CXFA_FFWidget(CXFA_FFPageView* pPageView,
-                             CXFA_WidgetAcc* pDataAcc)
-    : CXFA_ContentLayoutItem(pDataAcc->GetNode()),
-      m_pPageView(pPageView),
-      m_pDataAcc(pDataAcc) {
-  m_rtWidget.Set(0, 0, 0, 0);
-}
-CXFA_FFWidget::~CXFA_FFWidget() {}
-IXFA_PageView* CXFA_FFWidget::GetPageView() {
-  return m_pPageView;
-}
-void CXFA_FFWidget::SetPageView(IXFA_PageView* pPageView) {
-  m_pPageView = static_cast<CXFA_FFPageView*>(pPageView);
-}
-void CXFA_FFWidget::GetWidgetRect(CFX_RectF& rtWidget) {
-  if ((m_dwStatus & XFA_WIDGETSTATUS_RectCached) == 0) {
-    m_dwStatus |= XFA_WIDGETSTATUS_RectCached;
-    GetRect(m_rtWidget);
-  }
-  rtWidget = m_rtWidget;
-}
-CFX_RectF CXFA_FFWidget::ReCacheWidgetRect() {
-  m_dwStatus |= XFA_WIDGETSTATUS_RectCached;
-  GetRect(m_rtWidget);
-  return m_rtWidget;
-}
-void CXFA_FFWidget::GetRectWithoutRotate(CFX_RectF& rtWidget) {
-  GetWidgetRect(rtWidget);
-  FX_FLOAT fValue = 0;
-  switch (m_pDataAcc->GetRotate()) {
-    case 90:
-      rtWidget.top = rtWidget.bottom();
-      fValue = rtWidget.width;
-      rtWidget.width = rtWidget.height;
-      rtWidget.height = fValue;
-      break;
-    case 180:
-      rtWidget.left = rtWidget.right();
-      rtWidget.top = rtWidget.bottom();
-      break;
-    case 270:
-      rtWidget.left = rtWidget.right();
-      fValue = rtWidget.width;
-      rtWidget.width = rtWidget.height;
-      rtWidget.height = fValue;
-      break;
-  }
-}
-FX_DWORD CXFA_FFWidget::GetStatus() {
-  return m_dwStatus;
-}
-
-void CXFA_FFWidget::ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved) {
-  m_dwStatus = (m_dwStatus & ~dwRemoved) | dwAdded;
-}
-
-FX_BOOL CXFA_FFWidget::GetBBox(CFX_RectF& rtBox,
-                               FX_DWORD dwStatus,
-                               FX_BOOL bDrawFocus) {
-  if (bDrawFocus)
-    return FALSE;
-  if (m_pPageView)
-    m_pPageView->GetPageViewRect(rtBox);
-  return TRUE;
-}
-
-CXFA_WidgetAcc* CXFA_FFWidget::GetDataAcc() {
-  return m_pDataAcc;
-}
-FX_BOOL CXFA_FFWidget::GetToolTip(CFX_WideString& wsToolTip) {
-  if (CXFA_Assist assist = m_pDataAcc->GetAssist()) {
-    if (CXFA_ToolTip toolTip = assist.GetToolTip()) {
-      return toolTip.GetTip(wsToolTip);
-    }
-  }
-  return GetCaptionText(wsToolTip);
-}
-void CXFA_FFWidget::RenderWidget(CFX_Graphics* pGS,
-                                 CFX_Matrix* pMatrix,
-                                 FX_DWORD dwStatus,
-                                 int32_t iRotate) {
-  if (!IsMatchVisibleStatus(dwStatus)) {
-    return;
-  }
-  CXFA_Border border = m_pDataAcc->GetBorder();
-  if (border) {
-    CFX_RectF rtBorder;
-    GetRectWithoutRotate(rtBorder);
-    CXFA_Margin margin = border.GetMargin();
-    if (margin) {
-      XFA_RectWidthoutMargin(rtBorder, margin);
-    }
-    rtBorder.Normalize();
-    DrawBorder(pGS, border, rtBorder, pMatrix);
-  }
-}
-FX_BOOL CXFA_FFWidget::IsLoaded() {
-  return m_pPageView != NULL;
-}
-FX_BOOL CXFA_FFWidget::LoadWidget() {
-  PerformLayout();
-  return TRUE;
-}
-void CXFA_FFWidget::UnloadWidget() {}
-FX_BOOL CXFA_FFWidget::PerformLayout() {
-  ReCacheWidgetRect();
-  return TRUE;
-}
-FX_BOOL CXFA_FFWidget::UpdateFWLData() {
-  return FALSE;
-}
-void CXFA_FFWidget::UpdateWidgetProperty() {}
-void CXFA_FFWidget::DrawBorder(CFX_Graphics* pGS,
-                               CXFA_Box box,
-                               const CFX_RectF& rtBorder,
-                               CFX_Matrix* pMatrix,
-                               FX_DWORD dwFlags) {
-  XFA_DrawBox(box, pGS, rtBorder, pMatrix, dwFlags);
-}
-void CXFA_FFWidget::InvalidateWidget(const CFX_RectF* pRect) {
-  if (!pRect) {
-    CFX_RectF rtWidget;
-    GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused);
-    rtWidget.Inflate(2, 2);
-    GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, rtWidget,
-                                               XFA_INVALIDATE_CurrentPage);
-  } else {
-    GetDoc()->GetDocProvider()->InvalidateRect(m_pPageView, *pRect,
-                                               XFA_INVALIDATE_CurrentPage);
-  }
-}
-void CXFA_FFWidget::AddInvalidateRect(const CFX_RectF* pRect) {
-  CFX_RectF rtWidget;
-  if (pRect) {
-    rtWidget = *pRect;
-  } else {
-    GetBBox(rtWidget, XFA_WIDGETSTATUS_Focused);
-    rtWidget.Inflate(2, 2);
-  }
-  m_pDocView->AddInvalidateRect(m_pPageView, rtWidget);
-}
-FX_BOOL CXFA_FFWidget::GetCaptionText(CFX_WideString& wsCap) {
-  CXFA_TextLayout* pCapTextlayout = m_pDataAcc->GetCaptionTextLayout();
-  if (!pCapTextlayout) {
-    return FALSE;
-  }
-  pCapTextlayout->GetText(wsCap);
-  return TRUE;
-}
-FX_BOOL CXFA_FFWidget::IsFocused() {
-  return m_dwStatus & XFA_WIDGETSTATUS_Focused;
-}
-FX_BOOL CXFA_FFWidget::OnMouseEnter() {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnMouseExit() {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnLButtonDown(FX_DWORD dwFlags,
-                                     FX_FLOAT fx,
-                                     FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnLButtonDblClk(FX_DWORD dwFlags,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnMouseWheel(FX_DWORD dwFlags,
-                                    int16_t zDelta,
-                                    FX_FLOAT fx,
-                                    FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnRButtonDown(FX_DWORD dwFlags,
-                                     FX_FLOAT fx,
-                                     FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnRButtonDblClk(FX_DWORD dwFlags,
-                                       FX_FLOAT fx,
-                                       FX_FLOAT fy) {
-  return FALSE;
-}
-
-FX_BOOL CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) {
-  CXFA_FFWidget* pParent = GetParent();
-  if (pParent && !pParent->IsAncestorOf(pOldWidget)) {
-    pParent->OnSetFocus(pOldWidget);
-  }
-  m_dwStatus |= XFA_WIDGETSTATUS_Focused;
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Enter;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Enter, &eParam);
-  return TRUE;
-}
-FX_BOOL CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
-  m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
-  EventKillFocus();
-  if (pNewWidget) {
-    CXFA_FFWidget* pParent = GetParent();
-    if (pParent && !pParent->IsAncestorOf(pNewWidget)) {
-      pParent->OnKillFocus(pNewWidget);
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_FFWidget::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
-  return FALSE;
-}
-FX_DWORD CXFA_FFWidget::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
-  return FALSE;
-}
-void CXFA_FFWidget::Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy) {
-  CFX_Matrix mt;
-  GetRotateMatrix(mt);
-  if (mt.IsIdentity()) {
-    return;
-  }
-  CFX_Matrix mtReverse;
-  mtReverse.SetReverse(mt);
-  mtReverse.TransformPoint(fx, fy);
-}
-static void XFA_GetMatrix(CFX_Matrix& m,
-                          int32_t iRotate,
-                          int32_t at,
-                          const CFX_RectF& rt) {
-  if (!iRotate) {
-    return;
-  }
-  FX_FLOAT fAnchorX, fAnchorY;
-  switch (at) {
-    case XFA_ATTRIBUTEENUM_TopLeft:
-      fAnchorX = rt.left, fAnchorY = rt.top;
-      break;
-    case XFA_ATTRIBUTEENUM_TopCenter:
-      fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.top;
-      break;
-    case XFA_ATTRIBUTEENUM_TopRight:
-      fAnchorX = rt.right(), fAnchorY = rt.top;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleLeft:
-      fAnchorX = rt.left, fAnchorY = (rt.top + rt.bottom()) / 2;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleCenter:
-      fAnchorX = (rt.left + rt.right()) / 2,
-      fAnchorY = (rt.top + rt.bottom()) / 2;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleRight:
-      fAnchorX = rt.right(), fAnchorY = (rt.top + rt.bottom()) / 2;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomLeft:
-      fAnchorX = rt.left, fAnchorY = rt.bottom();
-      break;
-    case XFA_ATTRIBUTEENUM_BottomCenter:
-      fAnchorX = (rt.left + rt.right()) / 2, fAnchorY = rt.bottom();
-      break;
-    case XFA_ATTRIBUTEENUM_BottomRight:
-      fAnchorX = rt.right(), fAnchorY = rt.bottom();
-      break;
-  }
-  switch (iRotate) {
-    case 90:
-      m.a = 0, m.b = -1, m.c = 1, m.d = 0, m.e = fAnchorX - fAnchorY,
-      m.f = fAnchorX + fAnchorY;
-      break;
-    case 180:
-      m.a = -1, m.b = 0, m.c = 0, m.d = -1, m.e = fAnchorX * 2,
-      m.f = fAnchorY * 2;
-      break;
-    case 270:
-      m.a = 0, m.b = 1, m.c = -1, m.d = 0, m.e = fAnchorX + fAnchorY,
-      m.f = fAnchorY - fAnchorX;
-      break;
-  }
-}
-void CXFA_FFWidget::GetRotateMatrix(CFX_Matrix& mt) {
-  mt.Set(1, 0, 0, 1, 0, 0);
-  int32_t iRotate = m_pDataAcc->GetRotate();
-  if (!iRotate) {
-    return;
-  }
-  CFX_RectF rcWidget;
-  GetRectWithoutRotate(rcWidget);
-  XFA_ATTRIBUTEENUM at = XFA_ATTRIBUTEENUM_TopLeft;
-  XFA_GetMatrix(mt, iRotate, at, rcWidget);
-}
-FX_BOOL CXFA_FFWidget::IsLayoutRectEmpty() {
-  CFX_RectF rtLayout;
-  GetRectWithoutRotate(rtLayout);
-  return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
-}
-CXFA_FFWidget* CXFA_FFWidget::GetParent() {
-  CXFA_Node* pParentNode =
-      m_pDataAcc->GetNode()->GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParentNode) {
-    CXFA_WidgetAcc* pParentWidgetAcc =
-        (CXFA_WidgetAcc*)pParentNode->GetWidgetData();
-    if (pParentWidgetAcc) {
-      return pParentWidgetAcc->GetNextWidget(NULL);
-    }
-  }
-  return NULL;
-}
-FX_BOOL CXFA_FFWidget::IsAncestorOf(CXFA_FFWidget* pWidget) {
-  if (!pWidget) {
-    return FALSE;
-  }
-  CXFA_Node* pNode = m_pDataAcc->GetNode();
-  CXFA_Node* pChildNode = pWidget->GetDataAcc()->GetNode();
-  while (pChildNode) {
-    if (pChildNode == pNode) {
-      return TRUE;
-    }
-    pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_FFWidget::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
-  CFX_RectF rtWidget;
-  GetWidgetRect(rtWidget);
-  if (rtWidget.Contains(fx, fy)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-CXFA_FFDocView* CXFA_FFWidget::GetDocView() {
-  return m_pDocView;
-}
-CXFA_FFDoc* CXFA_FFWidget::GetDoc() {
-  return (CXFA_FFDoc*)m_pDocView->GetDoc();
-}
-CXFA_FFApp* CXFA_FFWidget::GetApp() {
-  return GetDoc()->GetApp();
-}
-IXFA_AppProvider* CXFA_FFWidget::GetAppProvider() {
-  return GetApp()->GetAppProvider();
-}
-void CXFA_FFWidget::GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth) {
-  fMinWidth = fMaxWidth = 0;
-  FX_FLOAT fWidth = 0;
-  if (m_pDataAcc->GetWidth(fWidth)) {
-    fMinWidth = fMaxWidth = fWidth;
-  } else {
-    m_pDataAcc->GetMinWidth(fMinWidth);
-    m_pDataAcc->GetMaxWidth(fMaxWidth);
-  }
-}
-void CXFA_FFWidget::GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight) {
-  fMinHeight = fMaxHeight = 0;
-  FX_FLOAT fHeight = 0;
-  if (m_pDataAcc->GetHeight(fHeight)) {
-    fMinHeight = fMaxHeight = fHeight;
-  } else {
-    m_pDataAcc->GetMinHeight(fMinHeight);
-    m_pDataAcc->GetMaxHeight(fMaxHeight);
-  }
-}
-FX_BOOL CXFA_FFWidget::IsMatchVisibleStatus(FX_DWORD dwStatus) {
-  return m_dwStatus & XFA_WIDGETSTATUS_Visible;
-}
-void CXFA_FFWidget::EventKillFocus() {
-  if (m_dwStatus & XFA_WIDGETSTATUS_Access) {
-    m_dwStatus &= ~XFA_WIDGETSTATUS_Access;
-    return;
-  }
-  CXFA_EventParam eParam;
-  eParam.m_eType = XFA_EVENT_Exit;
-  eParam.m_pTarget = m_pDataAcc;
-  m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Exit, &eParam);
-}
-FX_BOOL CXFA_FFWidget::IsButtonDown() {
-  return (m_dwStatus & XFA_WIDGETSTATUS_ButtonDown) != 0;
-}
-void CXFA_FFWidget::SetButtonDown(FX_BOOL bSet) {
-  bSet ? m_dwStatus |= XFA_WIDGETSTATUS_ButtonDown
-       : m_dwStatus &= ~XFA_WIDGETSTATUS_ButtonDown;
-}
-int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
-                                  int32_t iStrokeType,
-                                  int32_t iCapType) {
-  switch (iStrokeType) {
-    case XFA_ATTRIBUTEENUM_DashDot: {
-      FX_FLOAT dashArray[] = {4, 1, 2, 1};
-      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
-        dashArray[1] = 2;
-        dashArray[3] = 2;
-      }
-      pGraphics->SetLineDash(0, dashArray, 4);
-      return FX_DASHSTYLE_DashDot;
-    }
-    case XFA_ATTRIBUTEENUM_DashDotDot: {
-      FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1};
-      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
-        dashArray[1] = 2;
-        dashArray[3] = 2;
-        dashArray[5] = 2;
-      }
-      pGraphics->SetLineDash(0, dashArray, 6);
-      return FX_DASHSTYLE_DashDotDot;
-    }
-    case XFA_ATTRIBUTEENUM_Dashed: {
-      FX_FLOAT dashArray[] = {5, 1};
-      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
-        dashArray[1] = 2;
-      }
-      pGraphics->SetLineDash(0, dashArray, 2);
-      return FX_DASHSTYLE_Dash;
-    }
-    case XFA_ATTRIBUTEENUM_Dotted: {
-      FX_FLOAT dashArray[] = {2, 1};
-      if (iCapType != XFA_ATTRIBUTEENUM_Butt) {
-        dashArray[1] = 2;
-      }
-      pGraphics->SetLineDash(0, dashArray, 2);
-      return FX_DASHSTYLE_Dot;
-    }
-    default:
-      break;
-  }
-  pGraphics->SetLineDash(FX_DASHSTYLE_Solid);
-  return FX_DASHSTYLE_Solid;
-}
-CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap) {
-  switch (iLineCap) {
-    case XFA_ATTRIBUTEENUM_Round:
-      return CFX_GraphStateData::LineCapRound;
-    case XFA_ATTRIBUTEENUM_Butt:
-      return CFX_GraphStateData::LineCapButt;
-    default:
-      break;
-  }
-  return CFX_GraphStateData::LineCapSquare;
-}
-class CXFA_ImageRenderer {
- public:
-  CXFA_ImageRenderer();
-  ~CXFA_ImageRenderer();
-  FX_BOOL Start(CFX_RenderDevice* pDevice,
-                CFX_DIBSource* pDIBSource,
-                FX_ARGB bitmap_argb,
-                int bitmap_alpha,
-                const CFX_Matrix* pImage2Device,
-                FX_DWORD flags,
-                int blendType = FXDIB_BLEND_NORMAL);
-  FX_BOOL Continue(IFX_Pause* pPause);
-
- protected:
-  CFX_RenderDevice* m_pDevice;
-  int m_Status;
-  CFX_Matrix m_ImageMatrix;
-  CFX_DIBSource* m_pDIBSource;
-  CFX_DIBitmap* m_pCloneConvert;
-  int m_BitmapAlpha;
-  FX_ARGB m_FillArgb;
-  FX_DWORD m_Flags;
-  CFX_ImageTransformer* m_pTransformer;
-  void* m_DeviceHandle;
-  int32_t m_BlendType;
-  FX_BOOL m_Result;
-  FX_BOOL m_bPrint;
-  FX_BOOL StartDIBSource();
-  void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
-                         int left,
-                         int top,
-                         FX_ARGB mask_argb,
-                         int bitmap_alpha,
-                         int blend_mode,
-                         int Transparency);
-};
-CXFA_ImageRenderer::CXFA_ImageRenderer() {
-  m_pDevice = NULL;
-  m_Status = 0;
-  m_pDIBSource = NULL;
-  m_pCloneConvert = NULL;
-  m_BitmapAlpha = 255;
-  m_FillArgb = 0;
-  m_Flags = 0;
-  m_pTransformer = NULL;
-  m_DeviceHandle = NULL;
-  m_BlendType = FXDIB_BLEND_NORMAL;
-  m_Result = TRUE;
-  m_bPrint = FALSE;
-}
-CXFA_ImageRenderer::~CXFA_ImageRenderer() {
-  if (m_pCloneConvert) {
-    delete m_pCloneConvert;
-  }
-  if (m_pTransformer) {
-    delete m_pTransformer;
-  }
-  if (m_DeviceHandle) {
-    m_pDevice->CancelDIBits(m_DeviceHandle);
-  }
-}
-FX_BOOL CXFA_ImageRenderer::Start(CFX_RenderDevice* pDevice,
-                                  CFX_DIBSource* pDIBSource,
-                                  FX_ARGB bitmap_argb,
-                                  int bitmap_alpha,
-                                  const CFX_Matrix* pImage2Device,
-                                  FX_DWORD flags,
-                                  int blendType) {
-  m_pDevice = pDevice;
-  m_pDIBSource = pDIBSource;
-  m_FillArgb = bitmap_argb;
-  m_BitmapAlpha = bitmap_alpha;
-  m_ImageMatrix = *pImage2Device;
-  m_Flags = flags;
-  m_BlendType = blendType;
-  return StartDIBSource();
-}
-FX_BOOL CXFA_ImageRenderer::StartDIBSource() {
-  if (m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
-                             &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL,
-                             m_BlendType)) {
-    if (m_DeviceHandle) {
-      m_Status = 3;
-      return TRUE;
-    }
-    return FALSE;
-  }
-  CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
-  FX_RECT image_rect = image_rect_f.GetOutterRect();
-  int dest_width = image_rect.Width();
-  int dest_height = image_rect.Height();
-  if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
-      (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) {
-    if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
-      m_Result = FALSE;
-      return FALSE;
-    }
-    CFX_DIBSource* pDib = m_pDIBSource;
-    if (m_pDIBSource->HasAlpha() &&
-        !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) &&
-        !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
-      m_pCloneConvert = m_pDIBSource->CloneConvert(FXDIB_Rgb);
-      if (!m_pCloneConvert) {
-        m_Result = FALSE;
-        return FALSE;
-      }
-      pDib = m_pCloneConvert;
-    }
-    FX_RECT clip_box = m_pDevice->GetClipBox();
-    clip_box.Intersect(image_rect);
-    m_Status = 2;
-    m_pTransformer = new CFX_ImageTransformer;
-    m_pTransformer->Start(pDib, &m_ImageMatrix, m_Flags, &clip_box);
-    return TRUE;
-  }
-  if (m_ImageMatrix.a < 0) {
-    dest_width = -dest_width;
-  }
-  if (m_ImageMatrix.d > 0) {
-    dest_height = -dest_height;
-  }
-  int dest_left, dest_top;
-  dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
-  dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
-  if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
-    if (m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top, dest_width,
-                                 dest_height, m_Flags, NULL, m_BlendType)) {
-      return FALSE;
-    }
-  }
-  if (m_pDIBSource->IsAlphaMask()) {
-    if (m_BitmapAlpha != 255) {
-      m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
-    }
-    if (m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width,
-                                  dest_height, m_FillArgb, m_Flags)) {
-      return FALSE;
-    }
-  }
-  if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
-    m_Result = FALSE;
-    return TRUE;
-  }
-  FX_RECT clip_box = m_pDevice->GetClipBox();
-  FX_RECT dest_rect = clip_box;
-  dest_rect.Intersect(image_rect);
-  FX_RECT dest_clip(
-      dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
-      dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
-  CFX_DIBitmap* pStretched =
-      m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
-  if (pStretched) {
-    CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,
-                      m_BitmapAlpha, m_BlendType, FALSE);
-    delete pStretched;
-    pStretched = NULL;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_ImageRenderer::Continue(IFX_Pause* pPause) {
-  if (m_Status == 2) {
-    if (m_pTransformer->Continue(pPause)) {
-      return TRUE;
-    }
-    CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
-    if (pBitmap == NULL) {
-      return FALSE;
-    }
-    if (pBitmap->IsAlphaMask()) {
-      if (m_BitmapAlpha != 255) {
-        m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
-      }
-      m_Result = m_pDevice->SetBitMask(pBitmap, m_pTransformer->m_ResultLeft,
-                                       m_pTransformer->m_ResultTop, m_FillArgb);
-    } else {
-      if (m_BitmapAlpha != 255) {
-        pBitmap->MultiplyAlpha(m_BitmapAlpha);
-      }
-      m_Result = m_pDevice->SetDIBits(pBitmap, m_pTransformer->m_ResultLeft,
-                                      m_pTransformer->m_ResultTop, m_BlendType);
-    }
-    delete pBitmap;
-    return FALSE;
-  } else if (m_Status == 3) {
-    return m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
-  }
-  return FALSE;
-}
-void CXFA_ImageRenderer::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap,
-                                           int left,
-                                           int top,
-                                           FX_ARGB mask_argb,
-                                           int bitmap_alpha,
-                                           int blend_mode,
-                                           int Transparency) {
-  if (pDIBitmap == NULL) {
-    return;
-  }
-  FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;
-  FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;
-  if (blend_mode == FXDIB_BLEND_NORMAL) {
-    if (!pDIBitmap->IsAlphaMask()) {
-      if (bitmap_alpha < 255) {
-        pDIBitmap->MultiplyAlpha(bitmap_alpha);
-      }
-      if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
-        return;
-      }
-    } else {
-      FX_DWORD fill_argb = (mask_argb);
-      if (bitmap_alpha < 255) {
-        ((uint8_t*)&fill_argb)[3] =
-            ((uint8_t*)&fill_argb)[3] * bitmap_alpha / 255;
-      }
-      if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {
-        return;
-      }
-    }
-  }
-  FX_BOOL bBackAlphaRequired = blend_mode && bIsolated;
-  FX_BOOL bGetBackGround =
-      ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||
-      (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) &&
-       (m_pDevice->GetRenderCaps() & FXRC_GET_BITS) && !bBackAlphaRequired);
-  if (bGetBackGround) {
-    if (bIsolated || !bGroup) {
-      if (pDIBitmap->IsAlphaMask()) {
-        return;
-      }
-      m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);
-    } else {
-      FX_RECT rect(left, top, left + pDIBitmap->GetWidth(),
-                   top + pDIBitmap->GetHeight());
-      rect.Intersect(m_pDevice->GetClipBox());
-      CFX_DIBitmap* pClone = NULL;
-      FX_BOOL bClone = FALSE;
-      if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
-        bClone = TRUE;
-        pClone = m_pDevice->GetBackDrop()->Clone(&rect);
-        CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap();
-        pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(),
-                                pForeBitmap, rect.left, rect.top);
-        left = left >= 0 ? 0 : left;
-        top = top >= 0 ? 0 : top;
-        if (!pDIBitmap->IsAlphaMask())
-          pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(),
-                                  pDIBitmap, left, top, blend_mode);
-        else
-          pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(),
-                                pDIBitmap, mask_argb, left, top, blend_mode);
-      } else {
-        pClone = pDIBitmap;
-      }
-      if (m_pDevice->GetBackDrop()) {
-        m_pDevice->SetDIBits(pClone, rect.left, rect.top);
-      } else {
-        if (pDIBitmap->IsAlphaMask()) {
-          return;
-        }
-        m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);
-      }
-      if (bClone) {
-        delete pClone;
-      }
-    }
-    return;
-  }
-  if (pDIBitmap->HasAlpha() &&
-      !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) {
-    CFX_DIBitmap* pCloneConvert = pDIBitmap->CloneConvert(FXDIB_Rgb);
-    if (!pCloneConvert) {
-      return;
-    }
-    CXFA_ImageRenderer imageRender;
-    FX_BOOL bRet = imageRender.Start(m_pDevice, pCloneConvert, m_FillArgb,
-                                     m_BitmapAlpha, &m_ImageMatrix, m_Flags);
-    while (bRet) {
-      bRet = imageRender.Continue(NULL);
-    }
-    delete pCloneConvert;
-    return;
-  }
-}
-void XFA_DrawImage(CFX_Graphics* pGS,
-                   const CFX_RectF& rtImage,
-                   CFX_Matrix* pMatrix,
-                   CFX_DIBitmap* pDIBitmap,
-                   int32_t iAspect,
-                   int32_t iImageXDpi,
-                   int32_t iImageYDpi,
-                   int32_t iHorzAlign,
-                   int32_t iVertAlign) {
-  if (rtImage.IsEmpty()) {
-    return;
-  }
-  if (!pDIBitmap || !pDIBitmap->GetBuffer()) {
-    return;
-  }
-  FX_FLOAT fWidth =
-      XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
-  FX_FLOAT fHeight =
-      XFA_UnitPx2Pt((FX_FLOAT)pDIBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
-  CFX_RectF rtFit;
-  rtFit.Set(rtImage.left, rtImage.top, fWidth, fHeight);
-  switch (iAspect) {
-    case XFA_ATTRIBUTEENUM_Fit: {
-      FX_FLOAT f1 = rtImage.height / rtFit.height;
-      FX_FLOAT f2 = rtImage.width / rtFit.width;
-      f1 = std::min(f1, f2);
-      rtFit.height = rtFit.height * f1;
-      rtFit.width = rtFit.width * f1;
-    } break;
-    case XFA_ATTRIBUTEENUM_Actual:
-      break;
-    case XFA_ATTRIBUTEENUM_Height: {
-      FX_FLOAT f1 = rtImage.height / rtFit.height;
-      rtFit.height = rtImage.height;
-      rtFit.width = f1 * rtFit.width;
-    } break;
-    case XFA_ATTRIBUTEENUM_None:
-      rtFit.height = rtImage.height;
-      rtFit.width = rtImage.width;
-      break;
-    case XFA_ATTRIBUTEENUM_Width: {
-      FX_FLOAT f1 = rtImage.width / rtFit.width;
-      rtFit.width = rtImage.width;
-      rtFit.height = rtFit.height * f1;
-    } break;
-  }
-  if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) {
-    rtFit.left += (rtImage.width - rtFit.width) / 2;
-  } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) {
-    rtFit.left = rtImage.right() - rtFit.width;
-  }
-  if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) {
-    rtFit.top += (rtImage.height - rtFit.height) / 2;
-  } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) {
-    rtFit.top = rtImage.bottom() - rtImage.height;
-  }
-  CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
-  pRenderDevice->SaveState();
-  CFX_PathData path;
-  path.AppendRect(rtImage.left, rtImage.bottom(), rtImage.right(), rtImage.top);
-  pRenderDevice->SetClip_PathFill(&path, pMatrix, FXFILL_WINDING);
-  CFX_Matrix mtImage(1, 0, 0, -1, 0, 1);
-  mtImage.Concat(rtFit.width, 0, 0, rtFit.height, rtFit.left, rtFit.top);
-  mtImage.Concat(*pMatrix);
-  CXFA_ImageRenderer imageRender;
-  FX_BOOL bRet = imageRender.Start(pRenderDevice, pDIBitmap, 0, 255, &mtImage,
-                                   FXDIB_INTERPOL);
-  while (bRet) {
-    bRet = imageRender.Continue(NULL);
-  }
-  pRenderDevice->RestoreState();
-}
-
-static const uint8_t g_inv_base64[128] = {
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62,  255,
-    255, 255, 63,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  255, 255,
-    255, 255, 255, 255, 255, 0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
-    10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
-    25,  255, 255, 255, 255, 255, 255, 26,  27,  28,  29,  30,  31,  32,  33,
-    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
-    49,  50,  51,  255, 255, 255, 255, 255,
-};
-
-static uint8_t* XFA_RemoveBase64Whitespace(const uint8_t* pStr, int32_t iLen) {
-  uint8_t* pCP;
-  int32_t i = 0, j = 0;
-  if (iLen == 0) {
-    iLen = FXSYS_strlen((FX_CHAR*)pStr);
-  }
-  pCP = FX_Alloc(uint8_t, iLen + 1);
-  for (; i < iLen; i++) {
-    if ((pStr[i] & 128) == 0) {
-      if (g_inv_base64[pStr[i]] != 0xFF || pStr[i] == '=') {
-        pCP[j++] = pStr[i];
-      }
-    }
-  }
-  pCP[j] = '\0';
-  return pCP;
-}
-static int32_t XFA_Base64Decode(const FX_CHAR* pStr, uint8_t* pOutBuffer) {
-  if (pStr == NULL) {
-    return 0;
-  }
-  uint8_t* pBuffer =
-      XFA_RemoveBase64Whitespace((uint8_t*)pStr, FXSYS_strlen((FX_CHAR*)pStr));
-  if (pBuffer == NULL) {
-    return 0;
-  }
-  int32_t iLen = FXSYS_strlen((FX_CHAR*)pBuffer);
-  int32_t i = 0, j = 0;
-  FX_DWORD dwLimb = 0;
-  for (; i + 3 < iLen; i += 4) {
-    if (pBuffer[i] == '=' || pBuffer[i + 1] == '=' || pBuffer[i + 2] == '=' ||
-        pBuffer[i + 3] == '=') {
-      if (pBuffer[i] == '=' || pBuffer[i + 1] == '=') {
-        break;
-      }
-      if (pBuffer[i + 2] == '=') {
-        dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 6) |
-                 ((FX_DWORD)g_inv_base64[pBuffer[i + 1]]);
-        pOutBuffer[j] = (uint8_t)(dwLimb >> 4) & 0xFF;
-        j++;
-      } else {
-        dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 12) |
-                 ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 6) |
-                 ((FX_DWORD)g_inv_base64[pBuffer[i + 2]]);
-        pOutBuffer[j] = (uint8_t)(dwLimb >> 10) & 0xFF;
-        pOutBuffer[j + 1] = (uint8_t)(dwLimb >> 2) & 0xFF;
-        j += 2;
-      }
-    } else {
-      dwLimb = ((FX_DWORD)g_inv_base64[pBuffer[i]] << 18) |
-               ((FX_DWORD)g_inv_base64[pBuffer[i + 1]] << 12) |
-               ((FX_DWORD)g_inv_base64[pBuffer[i + 2]] << 6) |
-               ((FX_DWORD)g_inv_base64[pBuffer[i + 3]]);
-      pOutBuffer[j] = (uint8_t)(dwLimb >> 16) & 0xff;
-      pOutBuffer[j + 1] = (uint8_t)(dwLimb >> 8) & 0xff;
-      pOutBuffer[j + 2] = (uint8_t)(dwLimb)&0xff;
-      j += 3;
-    }
-  }
-  FX_Free(pBuffer);
-  return j;
-}
-static FX_CHAR g_base64_chars[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len) {
-  FX_CHAR* out = NULL;
-  int i, j;
-  FX_DWORD limb;
-  out = FX_Alloc(FX_CHAR, ((buf_len * 8 + 5) / 6) + 5);
-  for (i = 0, j = 0, limb = 0; i + 2 < buf_len; i += 3, j += 4) {
-    limb = ((FX_DWORD)buf[i] << 16) | ((FX_DWORD)buf[i + 1] << 8) |
-           ((FX_DWORD)buf[i + 2]);
-    out[j] = g_base64_chars[(limb >> 18) & 63];
-    out[j + 1] = g_base64_chars[(limb >> 12) & 63];
-    out[j + 2] = g_base64_chars[(limb >> 6) & 63];
-    out[j + 3] = g_base64_chars[(limb)&63];
-  }
-  switch (buf_len - i) {
-    case 0:
-      break;
-    case 1:
-      limb = ((FX_DWORD)buf[i]);
-      out[j++] = g_base64_chars[(limb >> 2) & 63];
-      out[j++] = g_base64_chars[(limb << 4) & 63];
-      out[j++] = '=';
-      out[j++] = '=';
-      break;
-    case 2:
-      limb = ((FX_DWORD)buf[i] << 8) | ((FX_DWORD)buf[i + 1]);
-      out[j++] = g_base64_chars[(limb >> 10) & 63];
-      out[j++] = g_base64_chars[(limb >> 4) & 63];
-      out[j++] = g_base64_chars[(limb << 2) & 63];
-      out[j++] = '=';
-      break;
-    default:
-      break;
-  }
-  out[j] = '\0';
-  return out;
-}
-FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType) {
-  CFX_WideString wsContentType(wsType);
-  wsContentType.MakeLower();
-  if (wsContentType == FX_WSTRC(L"image/jpg")) {
-    return FXCODEC_IMAGE_JPG;
-  }
-  if (wsContentType == FX_WSTRC(L"image/png")) {
-    return FXCODEC_IMAGE_PNG;
-  }
-  if (wsContentType == FX_WSTRC(L"image/gif")) {
-    return FXCODEC_IMAGE_GIF;
-  }
-  if (wsContentType == FX_WSTRC(L"image/bmp")) {
-    return FXCODEC_IMAGE_BMP;
-  }
-  if (wsContentType == FX_WSTRC(L"image/tif")) {
-    return FXCODEC_IMAGE_TIF;
-  }
-  return FXCODEC_IMAGE_UNKNOWN;
-}
-CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc,
-                                CXFA_Image* pImage,
-                                FX_BOOL& bNameImage,
-                                int32_t& iImageXDpi,
-                                int32_t& iImageYDpi) {
-  CFX_WideString wsHref;
-  pImage->GetHref(wsHref);
-  CFX_WideString wsImage;
-  pImage->GetContent(wsImage);
-  if (wsHref.IsEmpty() && wsImage.IsEmpty()) {
-    return NULL;
-  }
-  CFX_WideString wsContentType;
-  pImage->GetContentType(wsContentType);
-  FXCODEC_IMAGE_TYPE type = XFA_GetImageType(wsContentType);
-  CFX_ByteString bsContent;
-  uint8_t* pImageBuffer = NULL;
-  IFX_FileRead* pImageFileRead = NULL;
-  if (wsImage.GetLength() > 0) {
-    XFA_ATTRIBUTEENUM iEncoding =
-        (XFA_ATTRIBUTEENUM)pImage->GetTransferEncoding();
-    if (iEncoding == XFA_ATTRIBUTEENUM_Base64) {
-      CFX_ByteString bsData = wsImage.UTF8Encode();
-      int32_t iLength = bsData.GetLength();
-      pImageBuffer = FX_Alloc(uint8_t, iLength);
-      int32_t iRead = XFA_Base64Decode((const FX_CHAR*)bsData, pImageBuffer);
-      if (iRead > 0) {
-        pImageFileRead = FX_CreateMemoryStream(pImageBuffer, iRead);
-      }
-    } else {
-      bsContent = CFX_ByteString::FromUnicode(wsImage);
-      pImageFileRead = FX_CreateMemoryStream(
-          (uint8_t*)(const uint8_t*)bsContent, bsContent.GetLength());
-    }
-  } else {
-    CFX_WideString wsURL = wsHref;
-    if (wsURL.Left(7) != FX_WSTRC(L"http://") &&
-        wsURL.Left(6) != FX_WSTRC(L"ftp://")) {
-      CFX_DIBitmap* pBitmap =
-          pDoc->GetPDFNamedImage(wsURL, iImageXDpi, iImageYDpi);
-      if (pBitmap) {
-        bNameImage = TRUE;
-        return pBitmap;
-      }
-    }
-    pImageFileRead = pDoc->GetDocProvider()->OpenLinkedFile(pDoc, wsURL);
-  }
-  if (!pImageFileRead) {
-    FX_Free(pImageBuffer);
-    return NULL;
-  }
-  bNameImage = FALSE;
-  CFX_DIBitmap* pBitmap =
-      XFA_LoadImageFromBuffer(pImageFileRead, type, iImageXDpi, iImageYDpi);
-  FX_Free(pImageBuffer);
-  pImageFileRead->Release();
-  return pBitmap;
-}
-static FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type,
-                                     int32_t iComponents,
-                                     int32_t iBitsPerComponent) {
-  FXDIB_Format dibFormat = FXDIB_Argb;
-  switch (type) {
-    case FXCODEC_IMAGE_BMP:
-    case FXCODEC_IMAGE_JPG:
-    case FXCODEC_IMAGE_TIF: {
-      dibFormat = FXDIB_Rgb32;
-      int32_t bpp = iComponents * iBitsPerComponent;
-      if (bpp <= 24) {
-        dibFormat = FXDIB_Rgb;
-      }
-    } break;
-    case FXCODEC_IMAGE_PNG:
-    default:
-      break;
-  }
-  return dibFormat;
-}
-CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead,
-                                      FXCODEC_IMAGE_TYPE type,
-                                      int32_t& iImageXDpi,
-                                      int32_t& iImageYDpi) {
-  CFX_GEModule* pGeModule = CFX_GEModule::Get();
-  if (!pGeModule) {
-    return NULL;
-  }
-  CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule();
-  if (!pCodecMgr) {
-    return NULL;
-  }
-  CFX_DIBAttribute dibAttr;
-  CFX_DIBitmap* pBitmap = NULL;
-  ICodec_ProgressiveDecoder* pProgressiveDecoder =
-      pCodecMgr->CreateProgressiveDecoder();
-  pProgressiveDecoder->LoadImageInfo(pImageFileRead, type, &dibAttr);
-  switch (dibAttr.m_wDPIUnit) {
-    case FXCODEC_RESUNIT_CENTIMETER:
-      dibAttr.m_nXDPI = (int32_t)(dibAttr.m_nXDPI * 2.54f);
-      dibAttr.m_nYDPI = (int32_t)(dibAttr.m_nYDPI * 2.54f);
-      break;
-    case FXCODEC_RESUNIT_METER:
-      dibAttr.m_nXDPI = (int32_t)(dibAttr.m_nXDPI / (FX_FLOAT)100 * 2.54f);
-      dibAttr.m_nYDPI = (int32_t)(dibAttr.m_nYDPI / (FX_FLOAT)100 * 2.54f);
-      break;
-    default:
-      break;
-  }
-  iImageXDpi = dibAttr.m_nXDPI > 1 ? dibAttr.m_nXDPI : (96);
-  iImageYDpi = dibAttr.m_nYDPI > 1 ? dibAttr.m_nYDPI : (96);
-  if (pProgressiveDecoder->GetWidth() > 0 &&
-      pProgressiveDecoder->GetHeight() > 0) {
-    type = pProgressiveDecoder->GetType();
-    int32_t iComponents = pProgressiveDecoder->GetNumComponents();
-    int32_t iBpc = pProgressiveDecoder->GetBPC();
-    FXDIB_Format dibFormat = XFA_GetDIBFormat(type, iComponents, iBpc);
-    pBitmap = new CFX_DIBitmap();
-    pBitmap->Create(pProgressiveDecoder->GetWidth(),
-                    pProgressiveDecoder->GetHeight(), dibFormat);
-    pBitmap->Clear(0xffffffff);
-    int32_t nFrames;
-    if ((pProgressiveDecoder->GetFrames(nFrames) ==
-         FXCODEC_STATUS_DECODE_READY) &&
-        (nFrames > 0)) {
-      pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(),
-                                       pBitmap->GetHeight());
-      pProgressiveDecoder->ContinueDecode();
-    }
-  }
-  delete pProgressiveDecoder;
-  return pBitmap;
-}
-void XFA_RectWidthoutMargin(CFX_RectF& rt, const CXFA_Margin& mg, FX_BOOL bUI) {
-  if (!mg) {
-    return;
-  }
-  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
-  mg.GetLeftInset(fLeftInset);
-  mg.GetTopInset(fTopInset);
-  mg.GetRightInset(fRightInset);
-  mg.GetBottomInset(fBottomInset);
-  rt.Deflate(fLeftInset, fTopInset, fRightInset, fBottomInset);
-}
-CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
-  XFA_ELEMENT iType = pLayoutItem->GetFormNode()->GetClassID();
-  if (XFA_IsCreateWidget(iType)) {
-    return static_cast<CXFA_FFWidget*>(pLayoutItem);
-  }
-  return nullptr;
-}
-FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType) {
-  return iType == XFA_ELEMENT_Field || iType == XFA_ELEMENT_Draw ||
-         iType == XFA_ELEMENT_Subform || iType == XFA_ELEMENT_ExclGroup;
-}
-static void XFA_BOX_GetPath_Arc(CXFA_Box box,
-                                CFX_RectF rtDraw,
-                                CFX_Path& fillPath,
-                                FX_DWORD dwFlags) {
-  FX_FLOAT a, b;
-  a = rtDraw.width / 2.0f;
-  b = rtDraw.height / 2.0f;
-  if (box.IsCircular() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
-    a = b = std::min(a, b);
-  }
-  CFX_PointF center = rtDraw.Center();
-  rtDraw.left = center.x - a;
-  rtDraw.top = center.y - b;
-  rtDraw.width = a + a;
-  rtDraw.height = b + b;
-  FX_FLOAT startAngle = 0, sweepAngle = 360;
-  FX_BOOL bStart = box.GetStartAngle(startAngle);
-  FX_BOOL bEnd = box.GetSweepAngle(sweepAngle);
-  if (!bStart && !bEnd) {
-    fillPath.AddEllipse(rtDraw);
-    return;
-  }
-  startAngle = -startAngle * FX_PI / 180.0f;
-  sweepAngle = -sweepAngle * FX_PI / 180.0f;
-  fillPath.AddArc(rtDraw.left, rtDraw.top, rtDraw.width, rtDraw.height,
-                  startAngle, sweepAngle);
-}
-static void XFA_BOX_GetPath(CXFA_Box box,
-                            const CXFA_StrokeArray& strokes,
-                            CFX_RectF rtWidget,
-                            CFX_Path& path,
-                            int32_t nIndex,
-                            FX_BOOL bStart,
-                            FX_BOOL bCorner) {
-  FXSYS_assert(nIndex >= 0 && nIndex < 8);
-  FX_BOOL bInverted, bRound;
-  FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny, offsetY, offsetX,
-      offsetEX, offsetEY;
-  CFX_PointF cpStart, cp, cp1, cp2;
-  CFX_RectF rtRadius;
-  int32_t n = (nIndex & 1) ? nIndex - 1 : nIndex;
-  CXFA_Corner corner1(strokes[n].GetNode());
-  CXFA_Corner corner2(strokes[(n + 2) % 8].GetNode());
-  fRadius1 = bCorner ? corner1.GetRadius() : 0;
-  fRadius2 = bCorner ? corner2.GetRadius() : 0;
-  bInverted = corner1.IsInverted();
-  offsetY = 0.0f;
-  offsetX = 0.0f;
-  bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round;
-  FX_FLOAT halfAfter = 0.0f;
-  FX_FLOAT halfBefore = 0.0f;
-  CXFA_Stroke stroke = strokes[nIndex];
-  if (stroke.IsCorner()) {
-    CXFA_Stroke edgeBefore = strokes[(nIndex + 1 * 8 - 1) % 8];
-    CXFA_Stroke edgeAfter = strokes[nIndex + 1];
-    if (stroke.IsInverted()) {
-      if (!stroke.SameStyles(edgeBefore)) {
-        halfBefore = edgeBefore.GetThickness() / 2;
-      }
-      if (!stroke.SameStyles(edgeAfter)) {
-        halfAfter = edgeAfter.GetThickness() / 2;
-      }
-    }
-  } else {
-    CXFA_Stroke edgeBefore = strokes[(nIndex + 8 - 2) % 8];
-    CXFA_Stroke edgeAfter = strokes[(nIndex + 2) % 8];
-    if (!bRound && !bInverted) {
-      { halfBefore = edgeBefore.GetThickness() / 2; }
-      { halfAfter = edgeAfter.GetThickness() / 2; }
-    }
-  }
-  offsetEX = 0.0f;
-  offsetEY = 0.0f;
-  if (bRound) {
-    sy = FX_PI / 2;
-  }
-  switch (nIndex) {
-    case 0:
-    case 1:
-      cp1 = rtWidget.TopLeft();
-      cp2 = rtWidget.TopRight();
-      if (nIndex == 0) {
-        cpStart.x = cp1.x - halfBefore;
-        cpStart.y = cp1.y + fRadius1, offsetY = -halfAfter;
-      } else {
-        cpStart.x = cp1.x + fRadius1 - halfBefore, cpStart.y = cp1.y,
-        offsetEX = halfAfter;
-      }
-      vx = 1, vy = 1;
-      nx = -1, ny = 0;
-      if (bRound) {
-        sx = bInverted ? FX_PI / 2 : FX_PI;
-      } else {
-        sx = 1, sy = 0;
-      }
-      break;
-    case 2:
-    case 3:
-      cp1 = rtWidget.TopRight();
-      cp2 = rtWidget.BottomRight();
-      if (nIndex == 2) {
-        cpStart.x = cp1.x - fRadius1, cpStart.y = cp1.y - halfBefore,
-        offsetX = halfAfter;
-      } else {
-        cpStart.x = cp1.x, cpStart.y = cp1.y + fRadius1 - halfBefore,
-        offsetEY = halfAfter;
-      }
-      vx = -1, vy = 1;
-      nx = 0, ny = -1;
-      if (bRound) {
-        sx = bInverted ? FX_PI : FX_PI * 3 / 2;
-      } else {
-        sx = 0, sy = 1;
-      }
-      break;
-    case 4:
-    case 5:
-      cp1 = rtWidget.BottomRight();
-      cp2 = rtWidget.BottomLeft();
-      if (nIndex == 4) {
-        cpStart.x = cp1.x + halfBefore, cpStart.y = cp1.y - fRadius1,
-        offsetY = halfAfter;
-      } else {
-        cpStart.x = cp1.x - fRadius1 + halfBefore, cpStart.y = cp1.y,
-        offsetEX = -halfAfter;
-      }
-      vx = -1, vy = -1;
-      nx = 1, ny = 0;
-      if (bRound) {
-        sx = bInverted ? FX_PI * 3 / 2 : 0;
-      } else {
-        sx = -1, sy = 0;
-      }
-      break;
-    case 6:
-    case 7:
-      cp1 = rtWidget.BottomLeft();
-      cp2 = rtWidget.TopLeft();
-      if (nIndex == 6) {
-        cpStart.x = cp1.x + fRadius1, cpStart.y = cp1.y + halfBefore,
-        offsetX = -halfAfter;
-      } else {
-        cpStart.x = cp1.x, cpStart.y = cp1.y - fRadius1 + halfBefore,
-        offsetEY = -halfAfter;
-      }
-      vx = 1, vy = -1;
-      nx = 0, ny = 1;
-      if (bRound) {
-        sx = bInverted ? 0 : FX_PI / 2;
-      } else {
-        sx = 0, sy = -1;
-      }
-      break;
-  }
-  if (bStart) {
-    path.MoveTo(cpStart.x, cpStart.y);
-  }
-  if (nIndex & 1) {
-    path.LineTo(cp2.x + fRadius2 * nx + offsetEX,
-                cp2.y + fRadius2 * ny + offsetEY);
-    return;
-  }
-  if (bRound) {
-    if (fRadius1 < 0) {
-      sx -= FX_PI;
-    }
-    if (bInverted) {
-      sy *= -1;
-    }
-    rtRadius.Set(cp1.x + offsetX * 2, cp1.y + offsetY * 2,
-                 fRadius1 * 2 * vx - offsetX * 2,
-                 fRadius1 * 2 * vy - offsetY * 2);
-    rtRadius.Normalize();
-    if (bInverted) {
-      rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy);
-    }
-    path.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width, rtRadius.height, sx,
-               sy);
-  } else {
-    if (bInverted) {
-      cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy;
-    } else {
-      cp = cp1;
-    }
-    path.LineTo(cp.x, cp.y);
-    path.LineTo(cp1.x + fRadius1 * sx + offsetX,
-                cp1.y + fRadius1 * sy + offsetY);
-  }
-}
-static void XFA_BOX_GetFillPath(CXFA_Box box,
-                                const CXFA_StrokeArray& strokes,
-                                CFX_RectF rtWidget,
-                                CFX_Path& fillPath,
-                                FX_WORD dwFlags) {
-  if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
-    CXFA_Edge edge = box.GetEdge(0);
-    FX_FLOAT fThickness = edge.GetThickness();
-    if (fThickness < 0) {
-      fThickness = 0;
-    }
-    FX_FLOAT fHalf = fThickness / 2;
-    int32_t iHand = box.GetHand();
-    if (iHand == XFA_ATTRIBUTEENUM_Left) {
-      rtWidget.Inflate(fHalf, fHalf);
-    } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-      rtWidget.Deflate(fHalf, fHalf);
-    }
-    XFA_BOX_GetPath_Arc(box, rtWidget, fillPath, dwFlags);
-    return;
-  }
-  FX_BOOL bSameStyles = TRUE;
-  int32_t i;
-  CXFA_Stroke stroke1 = strokes[0];
-  for (i = 1; i < 8; i++) {
-    CXFA_Stroke stroke2 = strokes[i];
-    if (!stroke1.SameStyles(stroke2)) {
-      bSameStyles = FALSE;
-      break;
-    }
-    stroke1 = stroke2;
-  }
-  if (bSameStyles) {
-    stroke1 = strokes[0];
-    for (i = 2; i < 8; i += 2) {
-      CXFA_Stroke stroke2 = strokes[i];
-      if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence |
-                                           XFA_STROKE_SAMESTYLE_Corner)) {
-        bSameStyles = FALSE;
-        break;
-      }
-      stroke1 = stroke2;
-    }
-    if (bSameStyles) {
-      stroke1 = strokes[0];
-      if (stroke1.IsInverted()) {
-        bSameStyles = FALSE;
-      }
-      if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) {
-        bSameStyles = FALSE;
-      }
-    }
-  }
-  if (bSameStyles) {
-    fillPath.AddRectangle(rtWidget.left, rtWidget.top, rtWidget.width,
-                          rtWidget.height);
-    return;
-  }
-  FX_BOOL bInverted, bRound;
-  FX_FLOAT fRadius1, fRadius2, sx, sy, vx, vy, nx, ny;
-  CFX_PointF cp, cp1, cp2;
-  CFX_RectF rtRadius;
-  for (int32_t i = 0; i < 8; i += 2) {
-    CXFA_Corner corner1(strokes[i].GetNode());
-    CXFA_Corner corner2(strokes[(i + 2) % 8].GetNode());
-    fRadius1 = corner1.GetRadius();
-    fRadius2 = corner2.GetRadius();
-    bInverted = corner1.IsInverted();
-    bRound = corner1.GetJoinType() == XFA_ATTRIBUTEENUM_Round;
-    if (bRound) {
-      sy = FX_PI / 2;
-    }
-    switch (i) {
-      case 0:
-        cp1 = rtWidget.TopLeft();
-        cp2 = rtWidget.TopRight();
-        vx = 1, vy = 1;
-        nx = -1, ny = 0;
-        if (bRound) {
-          sx = bInverted ? FX_PI / 2 : FX_PI;
-        } else {
-          sx = 1, sy = 0;
-        }
-        break;
-      case 2:
-        cp1 = rtWidget.TopRight();
-        cp2 = rtWidget.BottomRight();
-        vx = -1, vy = 1;
-        nx = 0, ny = -1;
-        if (bRound) {
-          sx = bInverted ? FX_PI : FX_PI * 3 / 2;
-        } else {
-          sx = 0, sy = 1;
-        }
-        break;
-      case 4:
-        cp1 = rtWidget.BottomRight();
-        cp2 = rtWidget.BottomLeft();
-        vx = -1, vy = -1;
-        nx = 1, ny = 0;
-        if (bRound) {
-          sx = bInverted ? FX_PI * 3 / 2 : 0;
-        } else {
-          sx = -1, sy = 0;
-        }
-        break;
-      case 6:
-        cp1 = rtWidget.BottomLeft();
-        cp2 = rtWidget.TopLeft();
-        vx = 1, vy = -1;
-        nx = 0, ny = 1;
-        if (bRound) {
-          sx = bInverted ? 0 : FX_PI / 2;
-        } else {
-          sx = 0, sy = -1;
-        }
-        break;
-    }
-    if (i == 0) {
-      fillPath.MoveTo(cp1.x, cp1.y + fRadius1);
-    }
-    if (bRound) {
-      if (fRadius1 < 0) {
-        sx -= FX_PI;
-      }
-      if (bInverted) {
-        sy *= -1;
-      }
-      rtRadius.Set(cp1.x, cp1.y, fRadius1 * 2 * vx, fRadius1 * 2 * vy);
-      rtRadius.Normalize();
-      if (bInverted) {
-        rtRadius.Offset(-fRadius1 * vx, -fRadius1 * vy);
-      }
-      fillPath.ArcTo(rtRadius.left, rtRadius.top, rtRadius.width,
-                     rtRadius.height, sx, sy);
-    } else {
-      if (bInverted) {
-        cp.x = cp1.x + fRadius1 * vx, cp.y = cp1.y + fRadius1 * vy;
-      } else {
-        cp = cp1;
-      }
-      fillPath.LineTo(cp.x, cp.y);
-      fillPath.LineTo(cp1.x + fRadius1 * sx, cp1.y + fRadius1 * sy);
-    }
-    fillPath.LineTo(cp2.x + fRadius2 * nx, cp2.y + fRadius2 * ny);
-  }
-}
-static void XFA_BOX_Fill_Radial(CXFA_Box box,
-                                CFX_Graphics* pGS,
-                                CFX_Path& fillPath,
-                                CFX_RectF rtFill,
-                                CFX_Matrix* pMatrix) {
-  CXFA_Fill fill = box.GetFill();
-  FX_ARGB crStart, crEnd;
-  crStart = fill.GetColor();
-  int32_t iType = fill.GetRadial(crEnd);
-  CFX_Shading shading;
-  if (iType != XFA_ATTRIBUTEENUM_ToEdge) {
-    FX_ARGB temp = crEnd;
-    crEnd = crStart;
-    crStart = temp;
-  }
-  shading.CreateRadial(rtFill.Center(), rtFill.Center(), 0,
-                       FXSYS_sqrt(rtFill.Width() * rtFill.Width() +
-                                  rtFill.Height() * rtFill.Height()) /
-                           2,
-                       TRUE, TRUE, crStart, crEnd);
-  CFX_Color cr(&shading);
-  pGS->SetFillColor(&cr);
-  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
-}
-static void XFA_BOX_Fill_Pattern(CXFA_Box box,
-                                 CFX_Graphics* pGS,
-                                 CFX_Path& fillPath,
-                                 CFX_RectF rtFill,
-                                 CFX_Matrix* pMatrix) {
-  CXFA_Fill fill = box.GetFill();
-  FX_ARGB crStart, crEnd;
-  crStart = fill.GetColor();
-  int32_t iType = fill.GetPattern(crEnd);
-  int32_t iHatch = FX_HATCHSTYLE_Cross;
-  switch (iType) {
-    case XFA_ATTRIBUTEENUM_CrossDiagonal:
-      iHatch = FX_HATCHSTYLE_DiagonalCross;
-      break;
-    case XFA_ATTRIBUTEENUM_DiagonalLeft:
-      iHatch = FX_HATCHSTYLE_ForwardDiagonal;
-      break;
-    case XFA_ATTRIBUTEENUM_DiagonalRight:
-      iHatch = FX_HATCHSTYLE_BackwardDiagonal;
-      break;
-    case XFA_ATTRIBUTEENUM_Horizontal:
-      iHatch = FX_HATCHSTYLE_Horizontal;
-      break;
-    case XFA_ATTRIBUTEENUM_Vertical:
-      iHatch = FX_HATCHSTYLE_Vertical;
-      break;
-    default:
-      break;
-  }
-  CFX_Pattern pattern;
-  pattern.Create(iHatch, crEnd, crStart);
-  CFX_Color cr(&pattern);
-  pGS->SetFillColor(&cr);
-  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
-}
-static void XFA_BOX_Fill_Linear(CXFA_Box box,
-                                CFX_Graphics* pGS,
-                                CFX_Path& fillPath,
-                                CFX_RectF rtFill,
-                                CFX_Matrix* pMatrix) {
-  CXFA_Fill fill = box.GetFill();
-  FX_ARGB crStart = fill.GetColor();
-  FX_ARGB crEnd;
-  int32_t iType = fill.GetLinear(crEnd);
-  CFX_PointF ptStart;
-  CFX_PointF ptEnd;
-  switch (iType) {
-    case XFA_ATTRIBUTEENUM_ToRight:
-      ptStart = CFX_PointF(rtFill.left, rtFill.top);
-      ptEnd = CFX_PointF(rtFill.right(), rtFill.top);
-      break;
-    case XFA_ATTRIBUTEENUM_ToBottom:
-      ptStart = CFX_PointF(rtFill.left, rtFill.top);
-      ptEnd = CFX_PointF(rtFill.left, rtFill.bottom());
-      break;
-    case XFA_ATTRIBUTEENUM_ToLeft:
-      ptStart = CFX_PointF(rtFill.right(), rtFill.top);
-      ptEnd = CFX_PointF(rtFill.left, rtFill.top);
-      break;
-    case XFA_ATTRIBUTEENUM_ToTop:
-      ptStart = CFX_PointF(rtFill.left, rtFill.bottom());
-      ptEnd = CFX_PointF(rtFill.left, rtFill.top);
-      break;
-    default:
-      break;
-  }
-  CFX_Shading shading;
-  shading.CreateAxial(ptStart, ptEnd, FALSE, FALSE, crStart, crEnd);
-  CFX_Color cr(&shading);
-  pGS->SetFillColor(&cr);
-  pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
-}
-static void XFA_BOX_Fill(CXFA_Box box,
-                         const CXFA_StrokeArray& strokes,
-                         CFX_Graphics* pGS,
-                         const CFX_RectF& rtWidget,
-                         CFX_Matrix* pMatrix,
-                         FX_DWORD dwFlags) {
-  CXFA_Fill fill = box.GetFill();
-  if (!fill || fill.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-    return;
-  }
-  pGS->SaveGraphState();
-  CFX_Path fillPath;
-  fillPath.Create();
-  XFA_BOX_GetFillPath(box, strokes, rtWidget, fillPath,
-                      (dwFlags & XFA_DRAWBOX_ForceRound) != 0);
-  fillPath.Close();
-  int32_t eType = fill.GetFillType();
-  switch (eType) {
-    case XFA_ELEMENT_Radial:
-      XFA_BOX_Fill_Radial(box, pGS, fillPath, rtWidget, pMatrix);
-      break;
-    case XFA_ELEMENT_Pattern:
-      XFA_BOX_Fill_Pattern(box, pGS, fillPath, rtWidget, pMatrix);
-      break;
-    case XFA_ELEMENT_Linear:
-      XFA_BOX_Fill_Linear(box, pGS, fillPath, rtWidget, pMatrix);
-      break;
-    default: {
-      FX_ARGB cr;
-      if (eType == XFA_ELEMENT_Stipple) {
-        int32_t iRate = fill.GetStipple(cr);
-        if (iRate == 0) {
-          iRate = 100;
-        }
-        int32_t a = 0;
-        FX_COLORREF rgb;
-        ArgbDecode(cr, a, rgb);
-        cr = ArgbEncode(iRate * a / 100, rgb);
-      } else {
-        cr = fill.GetColor();
-      }
-      CFX_Color fillColor(cr);
-      pGS->SetFillColor(&fillColor);
-      pGS->FillPath(&fillPath, FXFILL_WINDING, pMatrix);
-    } break;
-  }
-  pGS->RestoreGraphState();
-}
-static void XFA_BOX_StrokePath(CXFA_Stroke stroke,
-                               CFX_Path* pPath,
-                               CFX_Graphics* pGS,
-                               CFX_Matrix* pMatrix) {
-  if (!stroke || !stroke.IsVisible()) {
-    return;
-  }
-  FX_FLOAT fThickness = stroke.GetThickness();
-  if (fThickness < 0.001f) {
-    return;
-  }
-  pGS->SaveGraphState();
-  if (stroke.IsCorner() && fThickness > 2 * stroke.GetRadius()) {
-    fThickness = 2 * stroke.GetRadius();
-  }
-  pGS->SetLineWidth(fThickness, TRUE);
-  pGS->SetLineCap(CFX_GraphStateData::LineCapButt);
-  XFA_StrokeTypeSetLineDash(pGS, stroke.GetStrokeType(),
-                            XFA_ATTRIBUTEENUM_Butt);
-  CFX_Color fxColor(stroke.GetColor());
-  pGS->SetStrokeColor(&fxColor);
-  pGS->StrokePath(pPath, pMatrix);
-  pGS->RestoreGraphState();
-}
-static void XFA_BOX_StrokeArc(CXFA_Box box,
-                              CFX_Graphics* pGS,
-                              CFX_RectF rtWidget,
-                              CFX_Matrix* pMatrix,
-                              FX_DWORD dwFlags) {
-  CXFA_Edge edge = box.GetEdge(0);
-  if (!edge || !edge.IsVisible()) {
-    return;
-  }
-  FX_BOOL bVisible = FALSE;
-  FX_FLOAT fThickness = 0;
-  int32_t i3DType = box.Get3DStyle(bVisible, fThickness);
-  if (i3DType) {
-    if (bVisible && fThickness >= 0.001f) {
-      dwFlags |= XFA_DRAWBOX_Lowered3D;
-    }
-  }
-  FX_FLOAT fHalf = edge.GetThickness() / 2;
-  if (fHalf < 0) {
-    fHalf = 0;
-  }
-  int32_t iHand = box.GetHand();
-  if (iHand == XFA_ATTRIBUTEENUM_Left) {
-    rtWidget.Inflate(fHalf, fHalf);
-  } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-    rtWidget.Deflate(fHalf, fHalf);
-  }
-  if ((dwFlags & XFA_DRAWBOX_ForceRound) == 0 ||
-      (dwFlags & XFA_DRAWBOX_Lowered3D) == 0) {
-    if (fHalf < 0.001f) {
-      return;
-    }
-    CFX_Path arcPath;
-    arcPath.Create();
-    XFA_BOX_GetPath_Arc(box, rtWidget, arcPath, dwFlags);
-    XFA_BOX_StrokePath(edge, &arcPath, pGS, pMatrix);
-    return;
-  }
-  pGS->SaveGraphState();
-  pGS->SetLineWidth(fHalf);
-  FX_FLOAT a, b;
-  a = rtWidget.width / 2.0f;
-  b = rtWidget.height / 2.0f;
-  if (dwFlags & XFA_DRAWBOX_ForceRound) {
-    a = b = std::min(a, b);
-  }
-  CFX_PointF center = rtWidget.Center();
-  rtWidget.left = center.x - a;
-  rtWidget.top = center.y - b;
-  rtWidget.width = a + a;
-  rtWidget.height = b + b;
-  FX_FLOAT startAngle = 0, sweepAngle = 360;
-  startAngle = startAngle * FX_PI / 180.0f;
-  sweepAngle = -sweepAngle * FX_PI / 180.0f;
-  CFX_Path arcPath;
-  arcPath.Create();
-  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
-                 3.0f * FX_PI / 4.0f, FX_PI);
-  CFX_Color cr(0xFF808080);
-  pGS->SetStrokeColor(&cr);
-  pGS->StrokePath(&arcPath, pMatrix);
-  arcPath.Clear();
-  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
-                 -1.0f * FX_PI / 4.0f, FX_PI);
-  cr.Set(0xFFFFFFFF);
-  pGS->SetStrokeColor(&cr);
-  pGS->StrokePath(&arcPath, pMatrix);
-  rtWidget.Deflate(fHalf, fHalf);
-  arcPath.Clear();
-  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
-                 3.0f * FX_PI / 4.0f, FX_PI);
-  cr.Set(0xFF404040);
-  pGS->SetStrokeColor(&cr);
-  pGS->StrokePath(&arcPath, pMatrix);
-  arcPath.Clear();
-  arcPath.AddArc(rtWidget.left, rtWidget.top, rtWidget.width, rtWidget.height,
-                 -1.0f * FX_PI / 4.0f, FX_PI);
-  cr.Set(0xFFC0C0C0);
-  pGS->SetStrokeColor(&cr);
-  pGS->StrokePath(&arcPath, pMatrix);
-  pGS->RestoreGraphState();
-}
-static void XFA_Draw3DRect(CFX_Graphics* pGraphic,
-                           const CFX_RectF& rt,
-                           FX_FLOAT fLineWidth,
-                           CFX_Matrix* pMatrix,
-                           FX_ARGB argbTopLeft,
-                           FX_ARGB argbBottomRight) {
-  CFX_Color crLT(argbTopLeft);
-  pGraphic->SetFillColor(&crLT);
-  FX_FLOAT fBottom = rt.bottom();
-  FX_FLOAT fRight = rt.right();
-  CFX_Path pathLT;
-  pathLT.Create();
-  pathLT.MoveTo(rt.left, fBottom);
-  pathLT.LineTo(rt.left, rt.top);
-  pathLT.LineTo(fRight, rt.top);
-  pathLT.LineTo(fRight - fLineWidth, rt.top + fLineWidth);
-  pathLT.LineTo(rt.left + fLineWidth, rt.top + fLineWidth);
-  pathLT.LineTo(rt.left + fLineWidth, fBottom - fLineWidth);
-  pathLT.LineTo(rt.left, fBottom);
-  pGraphic->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
-  CFX_Color crRB(argbBottomRight);
-  pGraphic->SetFillColor(&crRB);
-  CFX_Path pathRB;
-  pathRB.Create();
-  pathRB.MoveTo(fRight, rt.top);
-  pathRB.LineTo(fRight, fBottom);
-  pathRB.LineTo(rt.left, fBottom);
-  pathRB.LineTo(rt.left + fLineWidth, fBottom - fLineWidth);
-  pathRB.LineTo(fRight - fLineWidth, fBottom - fLineWidth);
-  pathRB.LineTo(fRight - fLineWidth, rt.top + fLineWidth);
-  pathRB.LineTo(fRight, rt.top);
-  pGraphic->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
-}
-static void XFA_BOX_Stroke_3DRect_Lowered(CFX_Graphics* pGS,
-                                          CFX_RectF rt,
-                                          FX_FLOAT fThickness,
-                                          CFX_Matrix* pMatrix) {
-  FX_FLOAT fHalfWidth = fThickness / 2.0f;
-  CFX_RectF rtInner(rt);
-  rtInner.Deflate(fHalfWidth, fHalfWidth);
-  CFX_Color cr(0xFF000000);
-  pGS->SetFillColor(&cr);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
-  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
-  pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF808080, 0xFFC0C0C0);
-}
-static void XFA_BOX_Stroke_3DRect_Raised(CFX_Graphics* pGS,
-                                         CFX_RectF rt,
-                                         FX_FLOAT fThickness,
-                                         CFX_Matrix* pMatrix) {
-  FX_FLOAT fHalfWidth = fThickness / 2.0f;
-  CFX_RectF rtInner(rt);
-  rtInner.Deflate(fHalfWidth, fHalfWidth);
-  CFX_Color cr(0xFF000000);
-  pGS->SetFillColor(&cr);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left, rt.top, rt.width, rt.height);
-  path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
-  pGS->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080);
-}
-static void XFA_BOX_Stroke_3DRect_Etched(CFX_Graphics* pGS,
-                                         CFX_RectF rt,
-                                         FX_FLOAT fThickness,
-                                         CFX_Matrix* pMatrix) {
-  FX_FLOAT fHalfWidth = fThickness / 2.0f;
-  XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFFFFFFFF);
-  CFX_RectF rtInner(rt);
-  rtInner.Deflate(fHalfWidth, fHalfWidth);
-  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFFFFFFFF, 0xFF808080);
-}
-static void XFA_BOX_Stroke_3DRect_Embossed(CFX_Graphics* pGS,
-                                           CFX_RectF rt,
-                                           FX_FLOAT fThickness,
-                                           CFX_Matrix* pMatrix) {
-  FX_FLOAT fHalfWidth = fThickness / 2.0f;
-  XFA_Draw3DRect(pGS, rt, fThickness, pMatrix, 0xFF808080, 0xFF000000);
-  CFX_RectF rtInner(rt);
-  rtInner.Deflate(fHalfWidth, fHalfWidth);
-  XFA_Draw3DRect(pGS, rtInner, fHalfWidth, pMatrix, 0xFF000000, 0xFF808080);
-}
-static void XFA_BOX_Stroke_Rect(CXFA_Box box,
-                                const CXFA_StrokeArray& strokes,
-                                CFX_Graphics* pGS,
-                                CFX_RectF rtWidget,
-                                CFX_Matrix* pMatrix) {
-  FX_BOOL bVisible = FALSE;
-  FX_FLOAT fThickness = 0;
-  int32_t i3DType = box.Get3DStyle(bVisible, fThickness);
-  if (i3DType) {
-    if (!bVisible || fThickness < 0.001f) {
-      return;
-    }
-    switch (i3DType) {
-      case XFA_ATTRIBUTEENUM_Lowered:
-        XFA_BOX_Stroke_3DRect_Lowered(pGS, rtWidget, fThickness, pMatrix);
-        break;
-      case XFA_ATTRIBUTEENUM_Raised:
-        XFA_BOX_Stroke_3DRect_Raised(pGS, rtWidget, fThickness, pMatrix);
-        break;
-      case XFA_ATTRIBUTEENUM_Etched:
-        XFA_BOX_Stroke_3DRect_Etched(pGS, rtWidget, fThickness, pMatrix);
-        break;
-      case XFA_ATTRIBUTEENUM_Embossed:
-        XFA_BOX_Stroke_3DRect_Embossed(pGS, rtWidget, fThickness, pMatrix);
-        break;
-    }
-    return;
-  }
-  FX_BOOL bClose = FALSE;
-  FX_BOOL bSameStyles = TRUE;
-  int32_t i;
-  CXFA_Stroke stroke1 = strokes[0];
-  for (i = 1; i < 8; i++) {
-    CXFA_Stroke stroke2 = strokes[i];
-    if (!stroke1.SameStyles(stroke2)) {
-      bSameStyles = FALSE;
-      break;
-    }
-    stroke1 = stroke2;
-  }
-  if (bSameStyles) {
-    stroke1 = strokes[0];
-    bClose = TRUE;
-    for (i = 2; i < 8; i += 2) {
-      CXFA_Stroke stroke2 = strokes[i];
-      if (!stroke1.SameStyles(stroke2, XFA_STROKE_SAMESTYLE_NoPresence |
-                                           XFA_STROKE_SAMESTYLE_Corner)) {
-        bSameStyles = FALSE;
-        break;
-      }
-      stroke1 = stroke2;
-    }
-    if (bSameStyles) {
-      stroke1 = strokes[0];
-      if (stroke1.IsInverted()) {
-        bSameStyles = FALSE;
-      }
-      if (stroke1.GetJoinType() != XFA_ATTRIBUTEENUM_Square) {
-        bSameStyles = FALSE;
-      }
-    }
-  }
-  FX_BOOL bStart = TRUE;
-  CFX_Path path;
-  path.Create();
-  for (i = 0; i < 8; i++) {
-    CXFA_Stroke stroke1 = strokes[i];
-    if ((i % 1) == 0 && stroke1.GetRadius() < 0) {
-      FX_BOOL bEmpty = path.IsEmpty();
-      if (!bEmpty) {
-        XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix);
-        path.Clear();
-      }
-      bStart = TRUE;
-      continue;
-    }
-    XFA_BOX_GetPath(box, strokes, rtWidget, path, i, bStart, !bSameStyles);
-    CXFA_Stroke stroke2 = strokes[(i + 1) % 8];
-    bStart = !stroke1.SameStyles(stroke2);
-    if (bStart) {
-      XFA_BOX_StrokePath(stroke1, &path, pGS, pMatrix);
-      path.Clear();
-    }
-  }
-  FX_BOOL bEmpty = path.IsEmpty();
-  if (!bEmpty) {
-    if (bClose) {
-      path.Close();
-    }
-    XFA_BOX_StrokePath(strokes[7], &path, pGS, pMatrix);
-  }
-}
-static void XFA_BOX_Stroke(CXFA_Box box,
-                           const CXFA_StrokeArray& strokes,
-                           CFX_Graphics* pGS,
-                           CFX_RectF rtWidget,
-                           CFX_Matrix* pMatrix,
-                           FX_DWORD dwFlags) {
-  if (box.IsArc() || (dwFlags & XFA_DRAWBOX_ForceRound) != 0) {
-    XFA_BOX_StrokeArc(box, pGS, rtWidget, pMatrix, dwFlags);
-    return;
-  }
-  bool bVisible = false;
-  for (int32_t j = 0; j < 4; j++) {
-    if (strokes[j * 2 + 1].IsVisible()) {
-      bVisible = true;
-      break;
-    }
-  }
-  if (!bVisible) {
-    return;
-  }
-  for (int32_t i = 1; i < 8; i += 2) {
-    CXFA_Edge edge(strokes[i].GetNode());
-    FX_FLOAT fThickness = edge.GetThickness();
-    if (fThickness < 0) {
-      fThickness = 0;
-    }
-    FX_FLOAT fHalf = fThickness / 2;
-    int32_t iHand = box.GetHand();
-    switch (i) {
-      case 1:
-        if (iHand == XFA_ATTRIBUTEENUM_Left) {
-          rtWidget.top -= fHalf;
-          rtWidget.height += fHalf;
-        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-          rtWidget.top += fHalf;
-          rtWidget.height -= fHalf;
-        }
-        break;
-      case 3:
-        if (iHand == XFA_ATTRIBUTEENUM_Left) {
-          rtWidget.width += fHalf;
-        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-          rtWidget.width -= fHalf;
-        }
-        break;
-      case 5:
-        if (iHand == XFA_ATTRIBUTEENUM_Left) {
-          rtWidget.height += fHalf;
-        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-          rtWidget.height -= fHalf;
-        }
-        break;
-      case 7:
-        if (iHand == XFA_ATTRIBUTEENUM_Left) {
-          rtWidget.left -= fHalf;
-          rtWidget.width += fHalf;
-        } else if (iHand == XFA_ATTRIBUTEENUM_Right) {
-          rtWidget.left += fHalf;
-          rtWidget.width -= fHalf;
-        }
-        break;
-    }
-  }
-  XFA_BOX_Stroke_Rect(box, strokes, pGS, rtWidget, pMatrix);
-}
-void XFA_DrawBox(CXFA_Box box,
-                 CFX_Graphics* pGS,
-                 const CFX_RectF& rtWidget,
-                 CFX_Matrix* pMatrix,
-                 FX_DWORD dwFlags) {
-  if (!box || box.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-    return;
-  }
-  int32_t iType = box.GetClassID();
-  if (iType != XFA_ELEMENT_Arc && iType != XFA_ELEMENT_Border &&
-      iType != XFA_ELEMENT_Rectangle) {
-    return;
-  }
-  CXFA_StrokeArray strokes;
-  if (!(dwFlags & XFA_DRAWBOX_ForceRound) && iType != XFA_ELEMENT_Arc) {
-    box.GetStrokes(strokes);
-  }
-  XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
-  XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffwidget.h b/xfa/src/fxfa/app/xfa_ffwidget.h
deleted file mode 100644
index 5ff4295..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidget.h
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFWIDGET_H_
-#define XFA_SRC_FXFA_APP_XFA_FFWIDGET_H_
-
-#include <vector>
-
-#include "core/include/fxcodec/fx_codec_def.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-
-class CXFA_FFPageView;
-class CXFA_FFDocView;
-class CXFA_FFDoc;
-class CXFA_FFApp;
-
-inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) {
-  return fPx * 72.0f / fDpi;
-}
-#define XFA_FLOAT_PERCISION 0.001f
-enum XFA_WIDGETITEM {
-  XFA_WIDGETITEM_Parent,
-  XFA_WIDGETITEM_FirstChild,
-  XFA_WIDGETITEM_NextSibling,
-  XFA_WIDGETITEM_PrevSibling,
-};
-class CXFA_CalcData {
- public:
-  CXFA_CalcData() : m_iRefCount(0) {}
-  ~CXFA_CalcData() { m_Globals.RemoveAll(); }
-  CFX_PtrArray m_Globals;
-  int32_t m_iRefCount;
-};
-class CXFA_FFWidget : public IXFA_Widget,
-                      public CFX_PrivateData,
-                      public CXFA_ContentLayoutItem {
- public:
-  CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFWidget();
-  IXFA_PageView* GetPageView();
-  void SetPageView(IXFA_PageView* pPageView);
-  void GetWidgetRect(CFX_RectF& rtWidget);
-  CFX_RectF ReCacheWidgetRect();
-  FX_DWORD GetStatus();
-  void ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved);
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          FX_DWORD dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  CXFA_WidgetAcc* GetDataAcc();
-  FX_BOOL GetToolTip(CFX_WideString& wsToolTip);
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_DWORD dwStatus = 0,
-                            int32_t iRotate = 0);
-
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual FX_BOOL UpdateFWLData();
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnMouseEnter();
-  virtual FX_BOOL OnMouseExit();
-  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-
-  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
-  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
-  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CanUndo() { return FALSE; }
-  virtual FX_BOOL CanRedo() { return FALSE; }
-  virtual FX_BOOL Undo() { return FALSE; }
-  virtual FX_BOOL Redo() { return FALSE; }
-  virtual FX_BOOL CanCopy() { return FALSE; }
-  virtual FX_BOOL CanCut() { return FALSE; }
-  virtual FX_BOOL CanPaste() { return FALSE; }
-  virtual FX_BOOL CanSelectAll() { return FALSE; }
-  virtual FX_BOOL CanDelete() { return CanCut(); }
-  virtual FX_BOOL CanDeSelect() { return CanCopy(); }
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy) { return FALSE; }
-  virtual FX_BOOL Cut(CFX_WideString& wsCut) { return FALSE; }
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste) { return FALSE; }
-  virtual FX_BOOL SelectAll() { return FALSE; }
-  virtual FX_BOOL Delete() { return FALSE; }
-  virtual FX_BOOL DeSelect() { return FALSE; }
-  virtual FX_BOOL GetSuggestWords(CFX_PointF pointf,
-                                  std::vector<CFX_ByteString>& sSuggest) {
-    return FALSE;
-  }
-  virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
-                                        const CFX_ByteStringC& bsReplace) {
-    return FALSE;
-  }
-  CXFA_FFDocView* GetDocView();
-  void SetDocView(CXFA_FFDocView* pDocView) { m_pDocView = pDocView; }
-  CXFA_FFDoc* GetDoc();
-  CXFA_FFApp* GetApp();
-  IXFA_AppProvider* GetAppProvider();
-  void InvalidateWidget(const CFX_RectF* pRect = NULL);
-  void AddInvalidateRect(const CFX_RectF* pRect = NULL);
-  FX_BOOL GetCaptionText(CFX_WideString& wsCap);
-  FX_BOOL IsFocused();
-  void Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy);
-  void GetRotateMatrix(CFX_Matrix& mt);
-  FX_BOOL IsLayoutRectEmpty();
-  CXFA_FFWidget* GetParent();
-  FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget);
-
- protected:
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  void DrawBorder(CFX_Graphics* pGS,
-                  CXFA_Box box,
-                  const CFX_RectF& rtBorder,
-                  CFX_Matrix* pMatrix,
-                  FX_DWORD dwFlags = 0);
-  void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth);
-  void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight);
-  void GetRectWithoutRotate(CFX_RectF& rtWidget);
-  FX_BOOL IsMatchVisibleStatus(FX_DWORD dwStatus);
-
-  void EventKillFocus();
-  FX_BOOL IsButtonDown();
-  void SetButtonDown(FX_BOOL bSet);
-  CXFA_FFDocView* m_pDocView;
-  CXFA_FFPageView* m_pPageView;
-  CXFA_WidgetAcc* m_pDataAcc;
-  CFX_RectF m_rtWidget;
-};
-int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
-                                  int32_t iStrokeType,
-                                  int32_t iCapType);
-CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap);
-void XFA_DrawImage(CFX_Graphics* pGS,
-                   const CFX_RectF& rtImage,
-                   CFX_Matrix* pMatrix,
-                   CFX_DIBitmap* pDIBitmap,
-                   int32_t iAspect,
-                   int32_t iImageXDpi,
-                   int32_t iImageYDpi,
-                   int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left,
-                   int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top);
-CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc,
-                                CXFA_Image* pImage,
-                                FX_BOOL& bNameImage,
-                                int32_t& iImageXDpi,
-                                int32_t& iImageYDpi);
-CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead,
-                                      FXCODEC_IMAGE_TYPE type,
-                                      int32_t& iImageXDpi,
-                                      int32_t& iImageYDpi);
-FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType);
-FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len);
-void XFA_RectWidthoutMargin(CFX_RectF& rt,
-                            const CXFA_Margin& mg,
-                            FX_BOOL bUI = FALSE);
-FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
-                              FX_BOOL b3DStyle,
-                              int32_t nIndex);
-CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem);
-FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType);
-#define XFA_DRAWBOX_ForceRound 1
-#define XFA_DRAWBOX_Lowered3D 2
-void XFA_DrawBox(CXFA_Box box,
-                 CFX_Graphics* pGS,
-                 const CFX_RectF& rtWidget,
-                 CFX_Matrix* pMatrix,
-                 FX_DWORD dwFlags = 0);
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFWIDGET_H_
diff --git a/xfa/src/fxfa/app/xfa_ffwidgetacc.cpp b/xfa/src/fxfa/app/xfa_ffwidgetacc.cpp
deleted file mode 100644
index 10aaad0..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidgetacc.cpp
+++ /dev/null
@@ -1,1714 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffwidgetacc.h"
-
-#include <algorithm>
-
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffpageview.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fontmgr.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-static void XFA_FFDeleteCalcData(void* pData) {
-  if (pData) {
-    delete ((CXFA_CalcData*)pData);
-  }
-}
-static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteCalcData = {
-    XFA_FFDeleteCalcData, NULL};
-class CXFA_WidgetLayoutData {
- public:
-  CXFA_WidgetLayoutData() : m_fWidgetHeight(-1) {}
-  virtual ~CXFA_WidgetLayoutData() {}
-  virtual void Release() { delete this; }
-  FX_FLOAT m_fWidgetHeight;
-};
-class CXFA_TextLayoutData : public CXFA_WidgetLayoutData {
- public:
-  CXFA_TextLayoutData() : m_pTextLayout(NULL), m_pTextProvider(NULL) {}
-  ~CXFA_TextLayoutData() {
-    if (m_pTextLayout) {
-      delete m_pTextLayout;
-    }
-    m_pTextLayout = NULL;
-    if (m_pTextProvider) {
-      delete m_pTextProvider;
-    }
-    m_pTextProvider = NULL;
-  }
-  void LoadText(CXFA_WidgetAcc* pAcc) {
-    if (m_pTextLayout)
-      return;
-
-    m_pTextProvider = new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Text);
-    m_pTextLayout = new CXFA_TextLayout(m_pTextProvider);
-  }
-  CXFA_TextLayout* m_pTextLayout;
-  CXFA_TextProvider* m_pTextProvider;
-};
-class CXFA_ImageLayoutData : public CXFA_WidgetLayoutData {
- public:
-  CXFA_ImageLayoutData()
-      : m_pDIBitmap(NULL),
-        m_bNamedImage(FALSE),
-        m_iImageXDpi(0),
-        m_iImageYDpi(0) {}
-
-  ~CXFA_ImageLayoutData() {
-    if (m_pDIBitmap && !m_bNamedImage) {
-      delete m_pDIBitmap;
-    }
-    m_pDIBitmap = NULL;
-  }
-
-  FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
-    if (m_pDIBitmap) {
-      return TRUE;
-    }
-    CXFA_Value value = pAcc->GetFormValue();
-    if (!value) {
-      return FALSE;
-    }
-    CXFA_Image imageObj = value.GetImage();
-    if (!imageObj) {
-      return FALSE;
-    }
-    CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
-    pAcc->SetImageImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
-                                          m_iImageXDpi, m_iImageYDpi));
-    return m_pDIBitmap != NULL;
-  }
-
-  CFX_DIBitmap* m_pDIBitmap;
-  FX_BOOL m_bNamedImage;
-  int32_t m_iImageXDpi;
-  int32_t m_iImageYDpi;
-};
-class CXFA_FieldLayoutData : public CXFA_WidgetLayoutData {
- public:
-  CXFA_FieldLayoutData()
-      : m_pCapTextLayout(NULL),
-        m_pCapTextProvider(NULL),
-        m_pTextOut(NULL),
-        m_pFieldSplitArray(NULL) {}
-  ~CXFA_FieldLayoutData() {
-    if (m_pCapTextLayout) {
-      delete m_pCapTextLayout;
-    }
-    m_pCapTextLayout = NULL;
-    if (m_pCapTextProvider) {
-      delete m_pCapTextProvider;
-    }
-    m_pCapTextProvider = NULL;
-    if (m_pTextOut) {
-      m_pTextOut->Release();
-    }
-    m_pTextOut = NULL;
-    if (m_pFieldSplitArray) {
-      m_pFieldSplitArray->RemoveAll();
-      delete m_pFieldSplitArray;
-      m_pFieldSplitArray = NULL;
-    }
-  }
-  FX_BOOL LoadCaption(CXFA_WidgetAcc* pAcc) {
-    if (m_pCapTextLayout) {
-      return TRUE;
-    }
-    CXFA_Caption caption = pAcc->GetCaption();
-    if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
-      m_pCapTextProvider =
-          new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Caption);
-      m_pCapTextLayout = new CXFA_TextLayout(m_pCapTextProvider);
-      return TRUE;
-    }
-    return FALSE;
-  }
-  CXFA_TextLayout* m_pCapTextLayout;
-  CXFA_TextProvider* m_pCapTextProvider;
-  IFDE_TextOut* m_pTextOut;
-  CFX_FloatArray* m_pFieldSplitArray;
-};
-class CXFA_TextEditData : public CXFA_FieldLayoutData {
- public:
-};
-class CXFA_ImageEditData : public CXFA_FieldLayoutData {
- public:
-  CXFA_ImageEditData()
-      : m_pDIBitmap(NULL),
-        m_bNamedImage(FALSE),
-        m_iImageXDpi(0),
-        m_iImageYDpi(0) {}
-
-  ~CXFA_ImageEditData() {
-    if (m_pDIBitmap && !m_bNamedImage) {
-      delete m_pDIBitmap;
-    }
-    m_pDIBitmap = NULL;
-  }
-  FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
-    if (m_pDIBitmap) {
-      return TRUE;
-    }
-    CXFA_Value value = pAcc->GetFormValue();
-    if (!value) {
-      return FALSE;
-    }
-    CXFA_Image imageObj = value.GetImage();
-    CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
-    pAcc->SetImageEditImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
-                                              m_iImageXDpi, m_iImageYDpi));
-    return m_pDIBitmap != NULL;
-  }
-  CFX_DIBitmap* m_pDIBitmap;
-  FX_BOOL m_bNamedImage;
-  int32_t m_iImageXDpi;
-  int32_t m_iImageYDpi;
-};
-CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode)
-    : CXFA_WidgetData(pNode),
-      m_pDocView(pDocView),
-      m_pLayoutData(NULL),
-      m_nRecursionDepth(0) {}
-CXFA_WidgetAcc::~CXFA_WidgetAcc() {
-  if (m_pLayoutData) {
-    m_pLayoutData->Release();
-    m_pLayoutData = NULL;
-  }
-}
-FX_BOOL CXFA_WidgetAcc::GetName(CFX_WideString& wsName, int32_t iNameType) {
-  if (iNameType == 0) {
-    m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-    return !wsName.IsEmpty();
-  }
-  m_pNode->GetSOMExpression(wsName);
-  if (iNameType == 2 && wsName.GetLength() >= 15) {
-    CFX_WideStringC wsPre = FX_WSTRC(L"xfa[0].form[0].");
-    if (wsPre == CFX_WideStringC(wsName, wsPre.GetLength())) {
-      wsName.Delete(0, wsPre.GetLength());
-    }
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_WidgetAcc::GetDatasets() {
-  return m_pNode->GetBindData();
-}
-FX_BOOL CXFA_WidgetAcc::ProcessValueChanged() {
-  m_pDocView->AddValidateWidget(this);
-  m_pDocView->AddCalculateWidgetAcc(this);
-  m_pDocView->RunCalculateWidgets();
-  m_pDocView->RunValidate();
-  return TRUE;
-}
-void CXFA_WidgetAcc::ResetData() {
-  CFX_WideString wsValue;
-  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
-  switch (eUIType) {
-    case XFA_ELEMENT_ImageEdit: {
-      CXFA_Value imageValue = GetDefaultValue();
-      CXFA_Image image = imageValue.GetImage();
-      CFX_WideString wsContentType, wsHref;
-      if (image) {
-        image.GetContent(wsValue);
-        image.GetContentType(wsContentType);
-        image.GetHref(wsHref);
-      }
-      SetImageEdit(wsContentType, wsHref, wsValue);
-    } break;
-    case XFA_ELEMENT_ExclGroup: {
-      CXFA_Node* pNextChild = m_pNode->GetNodeItem(
-          XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
-      while (pNextChild) {
-        CXFA_Node* pChild = pNextChild;
-        CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pChild->GetWidgetData();
-        if (!pAcc) {
-          continue;
-        }
-        CXFA_Value defValue(NULL);
-        if (wsValue.IsEmpty() && (defValue = pAcc->GetDefaultValue())) {
-          defValue.GetChildValueContent(wsValue);
-          SetValue(wsValue, XFA_VALUEPICTURE_Raw);
-          pAcc->SetValue(wsValue, XFA_VALUEPICTURE_Raw);
-        } else {
-          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
-          if (!pItems) {
-            continue;
-          }
-          CFX_WideString itemText;
-          if (pItems->CountChildren(XFA_ELEMENT_UNKNOWN) > 1) {
-            itemText = pItems->GetChild(1, XFA_ELEMENT_UNKNOWN)->GetContent();
-          }
-          pAcc->SetValue(itemText, XFA_VALUEPICTURE_Raw);
-        }
-        pNextChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling,
-                                         XFA_OBJECTTYPE_ContainerNode);
-      }
-    } break;
-    case XFA_ELEMENT_ChoiceList:
-      ClearAllSelections();
-    default:
-      if (CXFA_Value defValue = GetDefaultValue()) {
-        defValue.GetChildValueContent(wsValue);
-      }
-      SetValue(wsValue, XFA_VALUEPICTURE_Raw);
-      break;
-  }
-}
-void CXFA_WidgetAcc::SetImageEdit(const CFX_WideStringC& wsContentType,
-                                  const CFX_WideStringC& wsHref,
-                                  const CFX_WideStringC& wsData) {
-  CXFA_Image image = GetFormValue().GetImage();
-  if (image) {
-    image.SetContentType(wsContentType);
-    image.SetHref(wsHref);
-  }
-  CFX_WideString wsFormatValue(wsData);
-  GetFormatDataValue(wsData, wsFormatValue);
-  m_pNode->SetContent(wsData, wsFormatValue, TRUE);
-  CXFA_Node* pBind = GetDatasets();
-  if (!pBind) {
-    image.SetTransferEncoding(XFA_ATTRIBUTEENUM_Base64);
-    return;
-  }
-  pBind->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-  CXFA_Node* pHrefNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (pHrefNode) {
-    pHrefNode->SetCData(XFA_ATTRIBUTE_Value, wsHref);
-  } else {
-    IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
-    FXSYS_assert(pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element);
-    ((IFDE_XMLElement*)pXMLNode)->SetString(FX_WSTRC(L"href"), wsHref);
-  }
-}
-
-CXFA_WidgetAcc* CXFA_WidgetAcc::GetExclGroup() {
-  CXFA_Node* pExcl = m_pNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
-  return (CXFA_WidgetAcc*)pExcl->GetWidgetData();
-}
-CXFA_FFDocView* CXFA_WidgetAcc::GetDocView() {
-  return m_pDocView;
-}
-CXFA_FFDoc* CXFA_WidgetAcc::GetDoc() {
-  return (CXFA_FFDoc*)m_pDocView->GetDoc();
-}
-CXFA_FFApp* CXFA_WidgetAcc::GetApp() {
-  return GetDoc()->GetApp();
-}
-IXFA_AppProvider* CXFA_WidgetAcc::GetAppProvider() {
-  return GetApp()->GetAppProvider();
-}
-int32_t CXFA_WidgetAcc::ProcessEvent(int32_t iActivity,
-                                     CXFA_EventParam* pEventParam) {
-  if (GetClassID() == XFA_ELEMENT_Draw) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  int32_t iRet = XFA_EVENTERROR_NotExist;
-  CXFA_NodeArray eventArray;
-  int32_t iCounts =
-      GetEventByActivity(iActivity, eventArray, pEventParam->m_bIsFormReady);
-  for (int32_t i = 0; i < iCounts; i++) {
-    CXFA_Event event(eventArray[i]);
-    int32_t result = ProcessEvent(event, pEventParam);
-    if (i == 0) {
-      iRet = result;
-    } else if (result == XFA_EVENTERROR_Sucess) {
-      iRet = result;
-    }
-  }
-  return iRet;
-}
-int32_t CXFA_WidgetAcc::ProcessEvent(CXFA_Event& event,
-                                     CXFA_EventParam* pEventParam) {
-  if (!event) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  switch (event.GetEventType()) {
-    case XFA_ELEMENT_Execute:
-      break;
-    case XFA_ELEMENT_Script: {
-      CXFA_Script script = event.GetScript();
-      return ExecuteScript(script, pEventParam);
-    } break;
-    case XFA_ELEMENT_SignData:
-      break;
-    case XFA_ELEMENT_Submit: {
-      CXFA_Submit submit = event.GetSubmit();
-      return GetDoc()->GetDocProvider()->SubmitData(GetDoc(), submit);
-    }
-    default:
-      break;
-  }
-  return XFA_EVENTERROR_NotExist;
-}
-int32_t CXFA_WidgetAcc::ProcessCalculate() {
-  if (GetClassID() == XFA_ELEMENT_Draw) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  CXFA_Calculate calc = GetCalculate();
-  if (!calc) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-    return XFA_EVENTERROR_Disabled;
-  }
-  CXFA_EventParam EventParam;
-  EventParam.m_eType = XFA_EVENT_Calculate;
-  CXFA_Script script = calc.GetScript();
-  int32_t iRet = ExecuteScript(script, &EventParam);
-  if (iRet == XFA_EVENTERROR_Sucess) {
-    if (GetRawValue() != EventParam.m_wsResult) {
-      const bool bNotify = GetDoc()->GetDocType() == XFA_DOCTYPE_Static;
-      SetValue(EventParam.m_wsResult, XFA_VALUEPICTURE_Raw);
-      UpdateUIDisplay();
-      if (bNotify) {
-        NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL);
-      }
-      iRet = XFA_EVENTERROR_Sucess;
-    }
-  }
-  return iRet;
-}
-void CXFA_WidgetAcc::ProcessScriptTestValidate(CXFA_Validate validate,
-                                               int32_t iRet,
-                                               FXJSE_HVALUE pRetValue,
-                                               FX_BOOL bVersionFlag) {
-  if (iRet == XFA_EVENTERROR_Sucess && pRetValue) {
-    if (FXJSE_Value_IsBoolean(pRetValue) && !FXJSE_Value_ToBoolean(pRetValue)) {
-      IXFA_AppProvider* pAppProvider = GetAppProvider();
-      if (!pAppProvider) {
-        return;
-      }
-      CFX_WideString wsTitle;
-      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
-      CFX_WideString wsScriptMsg;
-      validate.GetScriptMessageText(wsScriptMsg);
-      int32_t eScriptTest = validate.GetScriptTest();
-      if (eScriptTest == XFA_ATTRIBUTEENUM_Warning) {
-        if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-          return;
-        }
-        if (wsScriptMsg.IsEmpty()) {
-          GetValidateMessage(pAppProvider, wsScriptMsg, FALSE, bVersionFlag);
-        }
-        if (bVersionFlag) {
-          pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
-                               XFA_MB_OK);
-          return;
-        }
-        if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
-                                 XFA_MB_YesNo) == XFA_IDYes) {
-          GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
-        }
-      } else {
-        if (wsScriptMsg.IsEmpty()) {
-          GetValidateMessage(pAppProvider, wsScriptMsg, TRUE, bVersionFlag);
-        }
-        pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
-      }
-    }
-  }
-}
-int32_t CXFA_WidgetAcc::ProcessFormatTestValidate(CXFA_Validate validate,
-                                                  FX_BOOL bVersionFlag) {
-  CFX_WideString wsRawValue = GetRawValue();
-  if (!wsRawValue.IsEmpty()) {
-    CFX_WideString wsPicture;
-    validate.GetPicture(wsPicture);
-    if (wsPicture.IsEmpty()) {
-      return XFA_EVENTERROR_NotExist;
-    }
-    IFX_Locale* pLocale = GetLocal();
-    if (!pLocale) {
-      return XFA_EVENTERROR_NotExist;
-    }
-    CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this);
-    if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale)) {
-      IXFA_AppProvider* pAppProvider = GetAppProvider();
-      if (!pAppProvider) {
-        return XFA_EVENTERROR_NotExist;
-      }
-      CFX_WideString wsFormatMsg;
-      validate.GetFormatMessageText(wsFormatMsg);
-      CFX_WideString wsTitle;
-      pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
-      int32_t eFormatTest = validate.GetFormatTest();
-      if (eFormatTest == XFA_ATTRIBUTEENUM_Error) {
-        if (wsFormatMsg.IsEmpty()) {
-          GetValidateMessage(pAppProvider, wsFormatMsg, TRUE, bVersionFlag);
-        }
-        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
-        return XFA_EVENTERROR_Sucess;
-      }
-      if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-        return XFA_EVENTERROR_NotExist;
-      }
-      if (wsFormatMsg.IsEmpty()) {
-        GetValidateMessage(pAppProvider, wsFormatMsg, FALSE, bVersionFlag);
-      }
-      if (bVersionFlag) {
-        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
-                             XFA_MB_OK);
-        return XFA_EVENTERROR_Sucess;
-      }
-      if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
-                               XFA_MB_YesNo) == XFA_IDYes) {
-        GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
-      }
-      return XFA_EVENTERROR_Sucess;
-    }
-  }
-  return XFA_EVENTERROR_NotExist;
-}
-int32_t CXFA_WidgetAcc::ProcessNullTestValidate(CXFA_Validate validate,
-                                                int32_t iFlags,
-                                                FX_BOOL bVersionFlag) {
-  CFX_WideString wsValue;
-  GetValue(wsValue, XFA_VALUEPICTURE_Raw);
-  if (!wsValue.IsEmpty()) {
-    return XFA_EVENTERROR_Sucess;
-  }
-  if (m_bIsNull && (m_bPreNull == m_bIsNull)) {
-    return XFA_EVENTERROR_Sucess;
-  }
-  int32_t eNullTest = validate.GetNullTest();
-  CFX_WideString wsNullMsg;
-  validate.GetNullMessageText(wsNullMsg);
-  if (iFlags & 0x01) {
-    int32_t iRet = XFA_EVENTERROR_Sucess;
-    if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
-      iRet = XFA_EVENTERROR_Error;
-    }
-    if (!wsNullMsg.IsEmpty()) {
-      if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
-        m_pDocView->m_arrNullTestMsg.Add(wsNullMsg);
-        return XFA_EVENTERROR_Error;
-      }
-      return XFA_EVENTERROR_Sucess;
-    }
-    return iRet;
-  }
-  if (wsNullMsg.IsEmpty() && bVersionFlag &&
-      eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
-    return XFA_EVENTERROR_Error;
-  }
-  IXFA_AppProvider* pAppProvider = GetAppProvider();
-  if (!pAppProvider) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  CFX_WideString wsCaptionName;
-  CFX_WideString wsTitle;
-  pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
-  switch (eNullTest) {
-    case XFA_ATTRIBUTEENUM_Error: {
-      if (wsNullMsg.IsEmpty()) {
-        GetValidateCaptionName(wsCaptionName, bVersionFlag);
-        CFX_WideString wsError;
-        pAppProvider->LoadString(XFA_IDS_ValidateNullError, wsError);
-        wsNullMsg.Format(wsError, (const FX_WCHAR*)wsCaptionName);
-      }
-      pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
-      return XFA_EVENTERROR_Error;
-    }
-    case XFA_ATTRIBUTEENUM_Warning: {
-      if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-        return TRUE;
-      }
-      if (wsNullMsg.IsEmpty()) {
-        GetValidateCaptionName(wsCaptionName, bVersionFlag);
-        CFX_WideString wsWarning;
-        pAppProvider->LoadString(XFA_IDS_ValidateNullWarning, wsWarning);
-        wsNullMsg.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
-                         (const FX_WCHAR*)wsCaptionName);
-      }
-      if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning,
-                               XFA_MB_YesNo) == XFA_IDYes) {
-        GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
-      }
-      return XFA_EVENTERROR_Error;
-    }
-    case XFA_ATTRIBUTEENUM_Disabled:
-    default:
-      break;
-  }
-  return XFA_EVENTERROR_Sucess;
-}
-void CXFA_WidgetAcc::GetValidateCaptionName(CFX_WideString& wsCaptionName,
-                                            FX_BOOL bVersionFlag) {
-  if (!bVersionFlag) {
-    CXFA_Caption caption = GetCaption();
-    if (caption) {
-      CXFA_Value capValue = caption.GetValue();
-      if (capValue) {
-        CXFA_Text capText = capValue.GetText();
-        if (capText) {
-          capText.GetContent(wsCaptionName);
-        }
-      }
-    }
-  }
-  if (wsCaptionName.IsEmpty()) {
-    GetName(wsCaptionName);
-  }
-}
-void CXFA_WidgetAcc::GetValidateMessage(IXFA_AppProvider* pAppProvider,
-                                        CFX_WideString& wsMessage,
-                                        FX_BOOL bError,
-                                        FX_BOOL bVersionFlag) {
-  CFX_WideString wsCaptionName;
-  GetValidateCaptionName(wsCaptionName, bVersionFlag);
-  CFX_WideString wsError;
-  if (bVersionFlag) {
-    pAppProvider->LoadString(XFA_IDS_ValidateFailed, wsError);
-    wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
-    return;
-  }
-  if (bError) {
-    pAppProvider->LoadString(XFA_IDS_ValidateError, wsError);
-    wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
-    return;
-  }
-  CFX_WideString wsWarning;
-  pAppProvider->LoadString(XFA_IDS_ValidateWarning, wsWarning);
-  wsMessage.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
-                   (const FX_WCHAR*)wsCaptionName);
-}
-int32_t CXFA_WidgetAcc::ProcessValidate(int32_t iFlags) {
-  if (GetClassID() == XFA_ELEMENT_Draw) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  CXFA_Validate validate = GetValidate();
-  if (!validate) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  FX_BOOL bInitDoc = validate.GetNode()->HasFlag(XFA_NODEFLAG_NeedsInitApp);
-  FX_BOOL bStatus =
-      m_pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End;
-  int32_t iFormat = 0;
-  FXJSE_HVALUE pRetValue = NULL;
-  int32_t iRet = XFA_EVENTERROR_NotExist;
-  CXFA_Script script = validate.GetScript();
-  if (script) {
-    CXFA_EventParam eParam;
-    eParam.m_eType = XFA_EVENT_Validate;
-    eParam.m_pTarget = this;
-    iRet = ExecuteScript(script, &eParam,
-                         ((bInitDoc || bStatus) && GetRawValue().IsEmpty())
-                             ? nullptr
-                             : &pRetValue);
-  }
-  XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
-  FX_BOOL bVersionFlag = FALSE;
-  if (version < XFA_VERSION_208) {
-    bVersionFlag = TRUE;
-  }
-  if (bInitDoc) {
-    validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, FALSE, FALSE);
-  } else {
-    iFormat = ProcessFormatTestValidate(validate, bVersionFlag);
-    if (!bVersionFlag) {
-      bVersionFlag = GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting);
-    }
-    iRet |= ProcessNullTestValidate(validate, iFlags, bVersionFlag);
-  }
-  if (iFormat != XFA_EVENTERROR_Sucess) {
-    ProcessScriptTestValidate(validate, iRet, pRetValue, bVersionFlag);
-  }
-  if (pRetValue) {
-    FXJSE_Value_Release(pRetValue);
-  }
-  return iRet | iFormat;
-}
-int32_t CXFA_WidgetAcc::ExecuteScript(CXFA_Script script,
-                                      CXFA_EventParam* pEventParam,
-                                      FXJSE_HVALUE* pRetValue) {
-  static const uint32_t MAX_RECURSION_DEPTH = 2;
-  if (m_nRecursionDepth > MAX_RECURSION_DEPTH)
-    return XFA_EVENTERROR_Sucess;
-  FXSYS_assert(pEventParam);
-  if (!script) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  if (script.GetRunAt() == XFA_ATTRIBUTEENUM_Server) {
-    return XFA_EVENTERROR_Disabled;
-  }
-  CFX_WideString wsExpression;
-  script.GetExpression(wsExpression);
-  if (wsExpression.IsEmpty()) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  XFA_SCRIPTTYPE eScriptType = script.GetContentType();
-  if (eScriptType == XFA_SCRIPTTYPE_Unkown) {
-    return XFA_EVENTERROR_Sucess;
-  }
-  CXFA_FFDoc* pDoc = GetDoc();
-  IXFA_ScriptContext* pContext = pDoc->GetXFADoc()->GetScriptContext();
-  pContext->SetEventParam(*pEventParam);
-  pContext->SetRunAtType((XFA_ATTRIBUTEENUM)script.GetRunAt());
-  CXFA_NodeArray refNodes;
-  if (pEventParam->m_eType == XFA_EVENT_InitCalculate ||
-      pEventParam->m_eType == XFA_EVENT_Calculate) {
-    pContext->SetNodesOfRunScript(&refNodes);
-  }
-  FXJSE_HVALUE hRetValue = FXJSE_Value_Create(pContext->GetRuntime());
-  ++m_nRecursionDepth;
-  FX_BOOL bRet = pContext->RunScript((XFA_SCRIPTLANGTYPE)eScriptType,
-                                     wsExpression, hRetValue, m_pNode);
-  --m_nRecursionDepth;
-  int32_t iRet = XFA_EVENTERROR_Error;
-  if (bRet) {
-    iRet = XFA_EVENTERROR_Sucess;
-    if (pEventParam->m_eType == XFA_EVENT_Calculate ||
-        pEventParam->m_eType == XFA_EVENT_InitCalculate) {
-      if (!FXJSE_Value_IsUndefined(hRetValue)) {
-        if (!FXJSE_Value_IsNull(hRetValue)) {
-          CFX_ByteString bsString;
-          FXJSE_Value_ToUTF8String(hRetValue, bsString);
-          pEventParam->m_wsResult =
-              CFX_WideString::FromUTF8(bsString, bsString.GetLength());
-        }
-        iRet = XFA_EVENTERROR_Sucess;
-      } else {
-        iRet = XFA_EVENTERROR_Error;
-      }
-      if (pEventParam->m_eType == XFA_EVENT_InitCalculate) {
-        if ((iRet == XFA_EVENTERROR_Sucess) &&
-            (GetRawValue() != pEventParam->m_wsResult)) {
-          SetValue(pEventParam->m_wsResult, XFA_VALUEPICTURE_Raw);
-          m_pDocView->AddValidateWidget(this);
-        }
-      }
-      int32_t iRefs = refNodes.GetSize();
-      for (int32_t r = 0; r < iRefs; r++) {
-        CXFA_WidgetAcc* pRefAcc = (CXFA_WidgetAcc*)refNodes[r]->GetWidgetData();
-        if (pRefAcc && pRefAcc == this) {
-          continue;
-        }
-        CXFA_Node* pRefNode = refNodes[r];
-        CXFA_CalcData* pGlobalData =
-            (CXFA_CalcData*)pRefNode->GetUserData(XFA_CalcData);
-        if (!pGlobalData) {
-          pGlobalData = new CXFA_CalcData;
-          pRefNode->SetUserData(XFA_CalcData, pGlobalData,
-                                &gs_XFADeleteCalcData);
-        }
-        if (pGlobalData->m_Globals.Find(this) < 0) {
-          pGlobalData->m_Globals.Add(this);
-        }
-      }
-    }
-  }
-  if (pRetValue) {
-    *pRetValue = hRetValue;
-  } else {
-    FXJSE_Value_Release(hRetValue);
-  }
-  pContext->SetNodesOfRunScript(NULL);
-  return iRet;
-}
-CXFA_FFWidget* CXFA_WidgetAcc::GetNextWidget(CXFA_FFWidget* pWidget) {
-  CXFA_LayoutItem* pLayout = nullptr;
-  if (pWidget) {
-    pLayout = pWidget->GetNext();
-  } else {
-    pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(m_pNode);
-  }
-  return static_cast<CXFA_FFWidget*>(pLayout);
-}
-void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFWidget* pExcept) {
-  CXFA_FFWidget* pWidget = NULL;
-  while ((pWidget = GetNextWidget(pWidget))) {
-    if (pWidget == pExcept || !pWidget->IsLoaded() ||
-        (GetUIType() != XFA_ELEMENT_CheckButton && pWidget->IsFocused())) {
-      continue;
-    }
-    pWidget->UpdateFWLData();
-    pWidget->AddInvalidateRect();
-  }
-}
-void CXFA_WidgetAcc::NotifyEvent(FX_DWORD dwEvent,
-                                 CXFA_FFWidget* pWidget,
-                                 void* pParam,
-                                 void* pAdditional) {
-  IXFA_DocProvider* pDocProvider = GetDoc()->GetDocProvider();
-  if (pWidget) {
-    pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
-  } else {
-    pWidget = GetNextWidget(pWidget);
-    if (pWidget == NULL) {
-      pDocProvider->WidgetEvent(NULL, this, dwEvent, pParam, pAdditional);
-      return;
-    }
-    while (pWidget) {
-      pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
-      pWidget = GetNextWidget(pWidget);
-    }
-  }
-}
-void CXFA_WidgetAcc::CalcCaptionSize(CFX_SizeF& szCap) {
-  CXFA_Caption caption = GetCaption();
-  if (!caption || caption.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-    return;
-  }
-  LoadCaption();
-  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
-  int32_t iCapPlacement = caption.GetPlacementType();
-  FX_FLOAT fCapReserve = caption.GetReserve();
-  const bool bVert = iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
-                     iCapPlacement == XFA_ATTRIBUTEENUM_Bottom;
-  const bool bReserveExit = fCapReserve > 0.01;
-  CXFA_TextLayout* pCapTextLayout =
-      ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout;
-  if (pCapTextLayout) {
-    if (!bVert && eUIType != XFA_ELEMENT_Button) {
-      szCap.x = fCapReserve;
-    }
-    CFX_SizeF minSize;
-    pCapTextLayout->CalcSize(minSize, szCap, szCap);
-    if (bReserveExit) {
-      bVert ? szCap.y = fCapReserve : szCap.x = fCapReserve;
-    }
-  } else {
-    FX_FLOAT fFontSize = 10.0f;
-    if (CXFA_Font font = caption.GetFont()) {
-      fFontSize = font.GetFontSize();
-    } else if (CXFA_Font widgetfont = GetFont()) {
-      fFontSize = widgetfont.GetFontSize();
-    }
-    if (bVert) {
-      szCap.y = fCapReserve > 0 ? fCapReserve : fFontSize;
-    } else {
-      szCap.x = fCapReserve > 0 ? fCapReserve : 0;
-      szCap.y = fFontSize;
-    }
-  }
-  if (CXFA_Margin mgCap = caption.GetMargin()) {
-    FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
-    mgCap.GetLeftInset(fLeftInset);
-    mgCap.GetTopInset(fTopInset);
-    mgCap.GetRightInset(fRightInset);
-    mgCap.GetBottomInset(fBottomInset);
-    if (bReserveExit) {
-      bVert ? (szCap.x += fLeftInset + fRightInset)
-            : (szCap.y += fTopInset + fBottomInset);
-    } else {
-      szCap.x += fLeftInset + fRightInset;
-      szCap.y += fTopInset + fBottomInset;
-    }
-  }
-}
-FX_BOOL CXFA_WidgetAcc::CalculateFieldAutoSize(CFX_SizeF& size) {
-  CFX_SizeF szCap;
-  CalcCaptionSize(szCap);
-  CFX_RectF rtUIMargin;
-  GetUIMargin(rtUIMargin);
-  size.x += rtUIMargin.left + rtUIMargin.width;
-  size.y += rtUIMargin.top + rtUIMargin.height;
-  if (szCap.x > 0 && szCap.y > 0) {
-    int32_t iCapPlacement = GetCaption().GetPlacementType();
-    switch (iCapPlacement) {
-      case XFA_ATTRIBUTEENUM_Left:
-      case XFA_ATTRIBUTEENUM_Right:
-      case XFA_ATTRIBUTEENUM_Inline: {
-        size.x += szCap.x;
-        size.y = std::max(size.y, szCap.y);
-      } break;
-      case XFA_ATTRIBUTEENUM_Top:
-      case XFA_ATTRIBUTEENUM_Bottom: {
-        size.y += szCap.y;
-        size.x = std::max(size.x, szCap.x);
-      }
-      default:
-        break;
-    }
-  }
-  return CalculateWidgetAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculateWidgetAutoSize(CFX_SizeF& size) {
-  CXFA_Margin mgWidget = GetMargin();
-  if (mgWidget) {
-    FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
-    mgWidget.GetLeftInset(fLeftInset);
-    mgWidget.GetTopInset(fTopInset);
-    mgWidget.GetRightInset(fRightInset);
-    mgWidget.GetBottomInset(fBottomInset);
-    size.x += fLeftInset + fRightInset;
-    size.y += fTopInset + fBottomInset;
-  }
-  CXFA_Para para = GetPara();
-  if (para) {
-    size.x += para.GetMarginLeft();
-    size.x += para.GetTextIndent();
-  }
-  FX_FLOAT fVal = 0, fMin = 0, fMax = 0;
-  if (GetWidth(fVal)) {
-    size.x = fVal;
-  } else {
-    if (GetMinWidth(fMin)) {
-      size.x = std::max(size.x, fMin);
-    }
-    if (GetMaxWidth(fMax) && fMax > 0) {
-      size.x = std::min(size.x, fMax);
-    }
-  }
-  fVal = 0, fMin = 0, fMax = 0;
-  if (GetHeight(fVal)) {
-    size.y = fVal;
-  } else {
-    if (GetMinHeight(fMin)) {
-      size.y = std::max(size.y, fMin);
-    }
-    if (GetMaxHeight(fMax) && fMax > 0) {
-      size.y = std::min(size.y, fMax);
-    }
-  }
-  return TRUE;
-}
-void CXFA_WidgetAcc::CalculateTextContentSize(CFX_SizeF& size) {
-  FX_FLOAT fFontSize = GetFontSize();
-  CFX_WideString wsText;
-  GetValue(wsText, XFA_VALUEPICTURE_Display);
-  if (wsText.IsEmpty()) {
-    size.y += fFontSize;
-    return;
-  }
-  FX_WCHAR wcEnter = '\n';
-  FX_WCHAR wsLast = wsText.GetAt(wsText.GetLength() - 1);
-  if (wsLast == wcEnter) {
-    wsText = wsText + wcEnter;
-  }
-  if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
-    ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut = IFDE_TextOut::Create();
-    IFDE_TextOut* pTextOut = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut;
-    pTextOut->SetFont(GetFDEFont());
-    pTextOut->SetFontSize(fFontSize);
-    pTextOut->SetLineBreakTolerance(fFontSize * 0.2f);
-    pTextOut->SetLineSpace(GetLineHeight());
-    FX_DWORD dwStyles = FDE_TTOSTYLE_LastLineHeight;
-    if (GetUIType() == XFA_ELEMENT_TextEdit && IsMultiLine()) {
-      dwStyles |= FDE_TTOSTYLE_LineWrap;
-    }
-    pTextOut->SetStyles(dwStyles);
-  }
-  ((CXFA_FieldLayoutData*)m_pLayoutData)
-      ->m_pTextOut->CalcLogicSize(wsText, wsText.GetLength(), size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculateTextEditAutoSize(CFX_SizeF& size) {
-  if (size.x > 0) {
-    CFX_SizeF szOrz = size;
-    CFX_SizeF szCap;
-    CalcCaptionSize(szCap);
-    FX_BOOL bCapExit = szCap.x > 0.01 && szCap.y > 0.01;
-    int32_t iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
-    if (bCapExit) {
-      iCapPlacement = GetCaption().GetPlacementType();
-      switch (iCapPlacement) {
-        case XFA_ATTRIBUTEENUM_Left:
-        case XFA_ATTRIBUTEENUM_Right:
-        case XFA_ATTRIBUTEENUM_Inline: {
-          size.x -= szCap.x;
-        }
-        default:
-          break;
-      }
-    }
-    CFX_RectF rtUIMargin;
-    GetUIMargin(rtUIMargin);
-    size.x -= rtUIMargin.left + rtUIMargin.width;
-    CXFA_Margin mgWidget = GetMargin();
-    if (mgWidget) {
-      FX_FLOAT fLeftInset, fRightInset;
-      mgWidget.GetLeftInset(fLeftInset);
-      mgWidget.GetRightInset(fRightInset);
-      size.x -= fLeftInset + fRightInset;
-    }
-    CalculateTextContentSize(size);
-    size.y += rtUIMargin.top + rtUIMargin.height;
-    if (bCapExit) {
-      switch (iCapPlacement) {
-        case XFA_ATTRIBUTEENUM_Left:
-        case XFA_ATTRIBUTEENUM_Right:
-        case XFA_ATTRIBUTEENUM_Inline: {
-          size.y = std::max(size.y, szCap.y);
-        } break;
-        case XFA_ATTRIBUTEENUM_Top:
-        case XFA_ATTRIBUTEENUM_Bottom: {
-          size.y += szCap.y;
-        }
-        default:
-          break;
-      }
-    }
-    size.x = szOrz.x;
-    return CalculateWidgetAutoSize(size);
-  }
-  CalculateTextContentSize(size);
-  return CalculateFieldAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculateCheckButtonAutoSize(CFX_SizeF& size) {
-  FX_FLOAT fCheckSize = GetCheckButtonSize();
-  size.x = size.y = fCheckSize;
-  return CalculateFieldAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculatePushButtonAutoSize(CFX_SizeF& size) {
-  CalcCaptionSize(size);
-  return CalculateWidgetAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculateImageAutoSize(CFX_SizeF& size) {
-  if (!GetImageImage()) {
-    LoadImageImage();
-  }
-  size.clear();
-  if (CFX_DIBitmap* pBitmap = GetImageImage()) {
-    CFX_RectF rtImage, rtFit;
-    rtImage.Set(0, 0, 0, 0);
-    rtFit.Set(0, 0, 0, 0);
-    int32_t iImageXDpi = 0;
-    int32_t iImageYDpi = 0;
-    GetImageDpi(iImageXDpi, iImageYDpi);
-    rtImage.width =
-        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
-    rtImage.height =
-        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
-    if (GetWidth(rtFit.width)) {
-      GetWidthWithoutMargin(rtFit.width);
-    } else {
-      rtFit.width = rtImage.width;
-    }
-    if (GetHeight(rtFit.height)) {
-      GetHeightWithoutMargin(rtFit.height);
-    } else {
-      rtFit.height = rtImage.height;
-    }
-    size.x = rtFit.width;
-    size.y = rtFit.height;
-  }
-  return CalculateWidgetAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::CalculateImageEditAutoSize(CFX_SizeF& size) {
-  if (!GetImageEditImage()) {
-    LoadImageEditImage();
-  }
-  size.clear();
-  if (CFX_DIBitmap* pBitmap = GetImageEditImage()) {
-    CFX_RectF rtImage, rtFit;
-    rtImage.Set(0, 0, 0, 0);
-    rtFit.Set(0, 0, 0, 0);
-    int32_t iImageXDpi = 0;
-    int32_t iImageYDpi = 0;
-    GetImageEditDpi(iImageXDpi, iImageYDpi);
-    rtImage.width =
-        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
-    rtImage.height =
-        XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
-    if (GetWidth(rtFit.width)) {
-      GetWidthWithoutMargin(rtFit.width);
-    } else {
-      rtFit.width = rtImage.width;
-    }
-    if (GetHeight(rtFit.height)) {
-      GetHeightWithoutMargin(rtFit.height);
-    } else {
-      rtFit.height = rtImage.height;
-    }
-    size.x = rtFit.width;
-    size.y = rtFit.height;
-  }
-  return CalculateFieldAutoSize(size);
-}
-FX_BOOL CXFA_WidgetAcc::LoadImageImage() {
-  InitLayoutData();
-  return ((CXFA_ImageLayoutData*)m_pLayoutData)->LoadImageData(this);
-}
-FX_BOOL CXFA_WidgetAcc::LoadImageEditImage() {
-  InitLayoutData();
-  return ((CXFA_ImageEditData*)m_pLayoutData)->LoadImageData(this);
-}
-void CXFA_WidgetAcc::GetImageDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
-  iImageXDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageXDpi;
-  iImageYDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageYDpi;
-}
-void CXFA_WidgetAcc::GetImageEditDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
-  iImageXDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageXDpi;
-  iImageYDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageYDpi;
-}
-FX_BOOL CXFA_WidgetAcc::CalculateTextAutoSize(CFX_SizeF& size) {
-  LoadText();
-  CXFA_TextLayout* pTextLayout =
-      ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
-  if (pTextLayout) {
-    size.x = pTextLayout->StartLayout(size.x);
-    size.y = pTextLayout->GetLayoutHeight();
-  }
-  return CalculateWidgetAutoSize(size);
-}
-void CXFA_WidgetAcc::LoadText() {
-  InitLayoutData();
-  ((CXFA_TextLayoutData*)m_pLayoutData)->LoadText(this);
-}
-FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoWidth(FX_FLOAT fWidthCalc) {
-  CXFA_Margin mgWidget = GetMargin();
-  if (mgWidget) {
-    FX_FLOAT fLeftInset, fRightInset;
-    mgWidget.GetLeftInset(fLeftInset);
-    mgWidget.GetRightInset(fRightInset);
-    fWidthCalc += fLeftInset + fRightInset;
-  }
-  FX_FLOAT fMin = 0, fMax = 0;
-  if (GetMinWidth(fMin)) {
-    fWidthCalc = std::max(fWidthCalc, fMin);
-  }
-  if (GetMaxWidth(fMax) && fMax > 0) {
-    fWidthCalc = std::min(fWidthCalc, fMax);
-  }
-  return fWidthCalc;
-}
-FX_FLOAT CXFA_WidgetAcc::GetWidthWithoutMargin(FX_FLOAT fWidthCalc) {
-  CXFA_Margin mgWidget = GetMargin();
-  if (mgWidget) {
-    FX_FLOAT fLeftInset, fRightInset;
-    mgWidget.GetLeftInset(fLeftInset);
-    mgWidget.GetRightInset(fRightInset);
-    fWidthCalc -= fLeftInset + fRightInset;
-  }
-  return fWidthCalc;
-}
-FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoHeight(FX_FLOAT fHeightCalc) {
-  CXFA_Margin mgWidget = GetMargin();
-  if (mgWidget) {
-    FX_FLOAT fTopInset, fBottomInset;
-    mgWidget.GetTopInset(fTopInset);
-    mgWidget.GetBottomInset(fBottomInset);
-    fHeightCalc += fTopInset + fBottomInset;
-  }
-  FX_FLOAT fMin = 0, fMax = 0;
-  if (GetMinHeight(fMin)) {
-    fHeightCalc = std::max(fHeightCalc, fMin);
-  }
-  if (GetMaxHeight(fMax) && fMax > 0) {
-    fHeightCalc = std::min(fHeightCalc, fMax);
-  }
-  return fHeightCalc;
-}
-FX_FLOAT CXFA_WidgetAcc::GetHeightWithoutMargin(FX_FLOAT fHeightCalc) {
-  CXFA_Margin mgWidget = GetMargin();
-  if (mgWidget) {
-    FX_FLOAT fTopInset, fBottomInset;
-    mgWidget.GetTopInset(fTopInset);
-    mgWidget.GetBottomInset(fBottomInset);
-    fHeightCalc -= fTopInset + fBottomInset;
-  }
-  return fHeightCalc;
-}
-void CXFA_WidgetAcc::StartWidgetLayout(FX_FLOAT& fCalcWidth,
-                                       FX_FLOAT& fCalcHeight) {
-  InitLayoutData();
-  XFA_ELEMENT eUIType = GetUIType();
-  if (eUIType == XFA_ELEMENT_Text) {
-    m_pLayoutData->m_fWidgetHeight = -1;
-    GetHeight(m_pLayoutData->m_fWidgetHeight);
-    StartTextLayout(fCalcWidth, fCalcHeight);
-    return;
-  }
-  if (fCalcWidth > 0 && fCalcHeight > 0) {
-    return;
-  }
-  m_pLayoutData->m_fWidgetHeight = -1;
-  FX_FLOAT fWidth = 0;
-  if (fCalcWidth > 0 && fCalcHeight < 0) {
-    if (!GetHeight(fCalcHeight)) {
-      CalculateAccWidthAndHeight(eUIType, fCalcWidth, fCalcHeight);
-    }
-    m_pLayoutData->m_fWidgetHeight = fCalcHeight;
-    return;
-  }
-  if (fCalcWidth < 0 && fCalcHeight < 0) {
-    if (!GetWidth(fWidth) || !GetHeight(fCalcHeight)) {
-      CalculateAccWidthAndHeight(eUIType, fWidth, fCalcHeight);
-    }
-    fCalcWidth = fWidth;
-  }
-  m_pLayoutData->m_fWidgetHeight = fCalcHeight;
-}
-void CXFA_WidgetAcc::CalculateAccWidthAndHeight(XFA_ELEMENT eUIType,
-                                                FX_FLOAT& fWidth,
-                                                FX_FLOAT& fCalcHeight) {
-  CFX_SizeF sz(fWidth, m_pLayoutData->m_fWidgetHeight);
-  switch (eUIType) {
-    case XFA_ELEMENT_Barcode:
-    case XFA_ELEMENT_ChoiceList:
-    case XFA_ELEMENT_Signature:
-      CalculateFieldAutoSize(sz);
-      break;
-    case XFA_ELEMENT_ImageEdit:
-      CalculateImageEditAutoSize(sz);
-      break;
-    case XFA_ELEMENT_Button:
-      CalculatePushButtonAutoSize(sz);
-      break;
-    case XFA_ELEMENT_CheckButton:
-      CalculateCheckButtonAutoSize(sz);
-      break;
-    case XFA_ELEMENT_DateTimeEdit:
-    case XFA_ELEMENT_NumericEdit:
-    case XFA_ELEMENT_PasswordEdit:
-    case XFA_ELEMENT_TextEdit:
-      CalculateTextEditAutoSize(sz);
-      break;
-    case XFA_ELEMENT_Image:
-      CalculateImageAutoSize(sz);
-      break;
-    case XFA_ELEMENT_Arc:
-    case XFA_ELEMENT_Line:
-    case XFA_ELEMENT_Rectangle:
-    case XFA_ELEMENT_Subform:
-    case XFA_ELEMENT_ExclGroup:
-      CalculateWidgetAutoSize(sz);
-      break;
-    default:
-      break;
-  }
-  fWidth = sz.x;
-  m_pLayoutData->m_fWidgetHeight = sz.y;
-  fCalcHeight = sz.y;
-}
-FX_BOOL CXFA_WidgetAcc::FindSplitPos(int32_t iBlockIndex,
-                                     FX_FLOAT& fCalcHeight) {
-  XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
-  if (eUIType == XFA_ELEMENT_Subform) {
-    return FALSE;
-  }
-  if (eUIType != XFA_ELEMENT_Text && eUIType != XFA_ELEMENT_TextEdit &&
-      eUIType != XFA_ELEMENT_NumericEdit &&
-      eUIType != XFA_ELEMENT_PasswordEdit) {
-    fCalcHeight = 0;
-    return TRUE;
-  }
-  FX_FLOAT fTopInset = 0;
-  FX_FLOAT fBottomInset = 0;
-  if (iBlockIndex == 0) {
-    CXFA_Margin mgWidget = GetMargin();
-    if (mgWidget) {
-      mgWidget.GetTopInset(fTopInset);
-      mgWidget.GetBottomInset(fBottomInset);
-    }
-    CFX_RectF rtUIMargin;
-    GetUIMargin(rtUIMargin);
-    fTopInset += rtUIMargin.top;
-    fBottomInset += rtUIMargin.width;
-  }
-  if (eUIType == XFA_ELEMENT_Text) {
-    FX_FLOAT fHeight = fCalcHeight;
-    if (iBlockIndex == 0) {
-      fCalcHeight = fCalcHeight - fTopInset;
-      if (fCalcHeight < 0) {
-        fCalcHeight = 0;
-      }
-    }
-    CXFA_TextLayout* pTextLayout =
-        ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
-    pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight,
-                          m_pLayoutData->m_fWidgetHeight - fTopInset);
-    if (fCalcHeight != 0) {
-      if (iBlockIndex == 0) {
-        fCalcHeight = fCalcHeight + fTopInset;
-      }
-      if (fabs(fHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
-        return FALSE;
-      }
-    }
-    return TRUE;
-  }
-  XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
-  FX_FLOAT fCapReserve = 0;
-  if (iBlockIndex == 0) {
-    CXFA_Caption caption = GetCaption();
-    if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
-      iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType();
-      fCapReserve = caption.GetReserve();
-    }
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Top &&
-        fCalcHeight < fCapReserve + fTopInset) {
-      fCalcHeight = 0;
-      return TRUE;
-    }
-    if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom &&
-        m_pLayoutData->m_fWidgetHeight - fCapReserve - fBottomInset) {
-      fCalcHeight = 0;
-      return TRUE;
-    }
-    if (iCapPlacement != XFA_ATTRIBUTEENUM_Top) {
-      fCapReserve = 0;
-    }
-  }
-  int32_t iLinesCount = 0;
-  FX_FLOAT fHeight = m_pLayoutData->m_fWidgetHeight;
-  CFX_WideString wsText;
-  GetValue(wsText, XFA_VALUEPICTURE_Display);
-  if (wsText.IsEmpty()) {
-    iLinesCount = 1;
-  } else {
-    if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
-      FX_FLOAT fWidth = 0;
-      GetWidth(fWidth);
-      CalculateAccWidthAndHeight(eUIType, fWidth, fHeight);
-    }
-    iLinesCount =
-        ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut->GetTotalLines();
-  }
-  if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray) {
-    ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray =
-        new CFX_FloatArray;
-  }
-  CFX_FloatArray* pFieldArray =
-      ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray;
-  int32_t iFieldSplitCount = pFieldArray->GetSize();
-  for (int32_t i = 0; i < iBlockIndex * 3; i += 3) {
-    iLinesCount -= (int32_t)pFieldArray->GetAt(i + 1);
-    fHeight -= pFieldArray->GetAt(i + 2);
-  }
-  if (iLinesCount == 0) {
-    return FALSE;
-  }
-  FX_FLOAT fLineHeight = GetLineHeight();
-  FX_FLOAT fFontSize = GetFontSize();
-  FX_FLOAT fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize;
-  FX_FLOAT fSpaceAbove = 0;
-  FX_FLOAT fStartOffset = 0;
-  if (fHeight > 0.1f && iBlockIndex == 0) {
-    fStartOffset = fTopInset;
-    fHeight -= (fTopInset + fBottomInset);
-    if (CXFA_Para para = GetPara()) {
-      fSpaceAbove = para.GetSpaceAbove();
-      FX_FLOAT fSpaceBelow = para.GetSpaceBelow();
-      fHeight -= (fSpaceAbove + fSpaceBelow);
-      switch (para.GetVerticalAlign()) {
-        case XFA_ATTRIBUTEENUM_Top:
-          fStartOffset += fSpaceAbove;
-          break;
-        case XFA_ATTRIBUTEENUM_Middle:
-          fStartOffset += ((fHeight - fTextHeight) / 2 + fSpaceAbove);
-          break;
-        case XFA_ATTRIBUTEENUM_Bottom:
-          fStartOffset += (fHeight - fTextHeight + fSpaceAbove);
-          break;
-      }
-    }
-    if (fStartOffset < 0.1f) {
-      fStartOffset = 0;
-    }
-  }
-  for (int32_t i = iBlockIndex - 1; iBlockIndex > 0 && i < iBlockIndex; i++) {
-    fStartOffset = pFieldArray->GetAt(i * 3) - pFieldArray->GetAt(i * 3 + 2);
-    if (fStartOffset < 0.1f) {
-      fStartOffset = 0;
-    }
-  }
-  if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-    pFieldArray->SetAt(0, fStartOffset);
-  } else {
-    pFieldArray->Add(fStartOffset);
-  }
-  XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
-  FX_BOOL bCanSplitNoContent = FALSE;
-  XFA_ATTRIBUTEENUM eLayoutMode;
-  GetNode()
-      ->GetNodeItem(XFA_NODEITEM_Parent)
-      ->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, TRUE);
-  if ((eLayoutMode == XFA_ATTRIBUTEENUM_Position ||
-       eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
-       eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
-       eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
-      version > XFA_VERSION_208) {
-    bCanSplitNoContent = TRUE;
-  }
-  if ((eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
-       eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
-       eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
-      version <= XFA_VERSION_208) {
-    if (fStartOffset < fCalcHeight) {
-      bCanSplitNoContent = TRUE;
-    } else {
-      fCalcHeight = 0;
-      return TRUE;
-    }
-  }
-  if (bCanSplitNoContent) {
-    if ((fCalcHeight - fTopInset - fSpaceAbove < fLineHeight)) {
-      fCalcHeight = 0;
-      return TRUE;
-    }
-    if (fStartOffset + XFA_FLOAT_PERCISION >= fCalcHeight) {
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
-        pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
-      } else {
-        pFieldArray->Add(0);
-        pFieldArray->Add(fCalcHeight);
-      }
-      return FALSE;
-    }
-    if (fCalcHeight - fStartOffset < fLineHeight) {
-      fCalcHeight = fStartOffset;
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
-        pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
-      } else {
-        pFieldArray->Add(0);
-        pFieldArray->Add(fCalcHeight);
-      }
-      return TRUE;
-    }
-    FX_FLOAT fTextNum =
-        fCalcHeight + XFA_FLOAT_PERCISION - fCapReserve - fStartOffset;
-    int32_t iLineNum =
-        (int32_t)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
-    if (iLineNum >= iLinesCount) {
-      if (fCalcHeight - fStartOffset - fTextHeight >= fFontSize) {
-        if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-          pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLinesCount);
-          pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
-        } else {
-          pFieldArray->Add((FX_FLOAT)iLinesCount);
-          pFieldArray->Add(fCalcHeight);
-        }
-        return FALSE;
-      }
-      if (fHeight - fStartOffset - fTextHeight < fFontSize) {
-        iLineNum -= 1;
-        if (iLineNum == 0) {
-          fCalcHeight = 0;
-          return TRUE;
-        }
-      } else {
-        iLineNum = (int32_t)(fTextNum / fLineHeight);
-      }
-    }
-    if (iLineNum > 0) {
-      FX_FLOAT fSplitHeight =
-          iLineNum * fLineHeight + fCapReserve + fStartOffset;
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLineNum);
-        pFieldArray->SetAt(iBlockIndex * 3 + 2, fSplitHeight);
-      } else {
-        pFieldArray->Add((FX_FLOAT)iLineNum);
-        pFieldArray->Add(fSplitHeight);
-      }
-      if (fabs(fSplitHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
-        return FALSE;
-      }
-      fCalcHeight = fSplitHeight;
-      return TRUE;
-    }
-  }
-  fCalcHeight = 0;
-  return TRUE;
-}
-void CXFA_WidgetAcc::InitLayoutData() {
-  if (m_pLayoutData) {
-    return;
-  }
-  switch (GetUIType()) {
-    case XFA_ELEMENT_Text:
-      m_pLayoutData = new CXFA_TextLayoutData;
-      return;
-    case XFA_ELEMENT_TextEdit:
-      m_pLayoutData = new CXFA_TextEditData;
-      return;
-    case XFA_ELEMENT_Image:
-      m_pLayoutData = new CXFA_ImageLayoutData;
-      return;
-    case XFA_ELEMENT_ImageEdit:
-      m_pLayoutData = new CXFA_ImageEditData;
-      return;
-    default:
-      break;
-  }
-  if (GetClassID() == XFA_ELEMENT_Field) {
-    m_pLayoutData = new CXFA_FieldLayoutData;
-  } else {
-    m_pLayoutData = new CXFA_WidgetLayoutData;
-  }
-}
-void CXFA_WidgetAcc::StartTextLayout(FX_FLOAT& fCalcWidth,
-                                     FX_FLOAT& fCalcHeight) {
-  LoadText();
-  CXFA_TextLayout* pTextLayout =
-      ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
-  FX_FLOAT fTextHeight = 0;
-  if (fCalcWidth > 0 && fCalcHeight > 0) {
-    FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
-    pTextLayout->StartLayout(fWidth);
-    fTextHeight = fCalcHeight;
-    fTextHeight = GetHeightWithoutMargin(fTextHeight);
-    pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
-    return;
-  }
-  if (fCalcWidth > 0 && fCalcHeight < 0) {
-    FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
-    pTextLayout->StartLayout(fWidth);
-  }
-  if (fCalcWidth < 0 && fCalcHeight < 0) {
-    FX_FLOAT fMaxWidth = -1;
-    FX_BOOL bRet = GetWidth(fMaxWidth);
-    if (bRet) {
-      FX_FLOAT fWidth = GetWidthWithoutMargin(fMaxWidth);
-      pTextLayout->StartLayout(fWidth);
-    } else {
-      FX_FLOAT fWidth = pTextLayout->StartLayout(fMaxWidth);
-      fMaxWidth = CalculateWidgetAutoWidth(fWidth);
-      fWidth = GetWidthWithoutMargin(fMaxWidth);
-      pTextLayout->StartLayout(fWidth);
-    }
-    fCalcWidth = fMaxWidth;
-  }
-  if (m_pLayoutData->m_fWidgetHeight < 0) {
-    m_pLayoutData->m_fWidgetHeight = pTextLayout->GetLayoutHeight();
-    m_pLayoutData->m_fWidgetHeight =
-        CalculateWidgetAutoHeight(m_pLayoutData->m_fWidgetHeight);
-  }
-  fTextHeight = m_pLayoutData->m_fWidgetHeight;
-  fTextHeight = GetHeightWithoutMargin(fTextHeight);
-  pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
-  fCalcHeight = m_pLayoutData->m_fWidgetHeight;
-}
-FX_BOOL CXFA_WidgetAcc::LoadCaption() {
-  InitLayoutData();
-  return ((CXFA_FieldLayoutData*)m_pLayoutData)->LoadCaption(this);
-}
-CXFA_TextLayout* CXFA_WidgetAcc::GetCaptionTextLayout() {
-  return m_pLayoutData
-             ? ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout
-             : NULL;
-}
-CXFA_TextLayout* CXFA_WidgetAcc::GetTextLayout() {
-  return m_pLayoutData ? ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout
-                       : NULL;
-}
-CFX_DIBitmap* CXFA_WidgetAcc::GetImageImage() {
-  return m_pLayoutData ? ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap
-                       : NULL;
-}
-CFX_DIBitmap* CXFA_WidgetAcc::GetImageEditImage() {
-  return m_pLayoutData ? ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap
-                       : NULL;
-}
-void CXFA_WidgetAcc::SetImageImage(CFX_DIBitmap* newImage) {
-  if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap == newImage) {
-    return;
-  }
-  if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap &&
-      !((CXFA_ImageLayoutData*)m_pLayoutData)->m_bNamedImage) {
-    delete ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap;
-    ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = NULL;
-  }
-  ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = newImage;
-}
-void CXFA_WidgetAcc::SetImageEditImage(CFX_DIBitmap* newImage) {
-  if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap == newImage) {
-    return;
-  }
-  if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap &&
-      !((CXFA_ImageEditData*)m_pLayoutData)->m_bNamedImage) {
-    delete ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap;
-    ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = NULL;
-  }
-  ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = newImage;
-}
-CXFA_WidgetLayoutData* CXFA_WidgetAcc::GetWidgetLayoutData() {
-  return m_pLayoutData;
-}
-IFX_Font* CXFA_WidgetAcc::GetFDEFont() {
-  CFX_WideStringC wsFontName = FX_WSTRC(L"Courier");
-  FX_DWORD dwFontStyle = 0;
-  if (CXFA_Font font = GetFont()) {
-    if (font.IsBold()) {
-      dwFontStyle |= FX_FONTSTYLE_Bold;
-    }
-    if (font.IsItalic()) {
-      dwFontStyle |= FX_FONTSTYLE_Italic;
-    }
-    font.GetTypeface(wsFontName);
-  }
-  CXFA_FFDoc* pDoc = GetDoc();
-  return pDoc->GetApp()->GetXFAFontMgr()->GetFont(pDoc, wsFontName,
-                                                  dwFontStyle);
-}
-FX_FLOAT CXFA_WidgetAcc::GetFontSize() {
-  FX_FLOAT fFontSize = 10.0f;
-  if (CXFA_Font font = GetFont()) {
-    fFontSize = font.GetFontSize();
-  }
-  return fFontSize < 0.1f ? 10.0f : fFontSize;
-}
-FX_FLOAT CXFA_WidgetAcc::GetLineHeight() {
-  FX_FLOAT fLineHeight = 0;
-  if (CXFA_Para para = GetPara()) {
-    fLineHeight = para.GetLineHeight();
-  }
-  if (fLineHeight < 1) {
-    fLineHeight = GetFontSize() * 1.2f;
-  }
-  return fLineHeight;
-}
-FX_ARGB CXFA_WidgetAcc::GetTextColor() {
-  if (CXFA_Font font = GetFont()) {
-    return font.GetColor();
-  }
-  return 0xFF000000;
-}
-CXFA_Node* CXFA_TextProvider::GetTextNode(FX_BOOL& bRichText) {
-  bRichText = FALSE;
-  if (m_pTextNode) {
-    if (m_pTextNode->GetClassID() == XFA_ELEMENT_ExData) {
-      CFX_WideString wsContentType;
-      m_pTextNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
-                                FALSE);
-      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-        bRichText = TRUE;
-      }
-    }
-    return m_pTextNode;
-  }
-  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
-    CXFA_Node* pElementNode = m_pWidgetAcc->GetNode();
-    CXFA_Node* pValueNode = pElementNode->GetChild(0, XFA_ELEMENT_Value);
-    if (!pValueNode) {
-      return NULL;
-    }
-    CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
-      CFX_WideString wsContentType;
-      pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
-      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-        bRichText = TRUE;
-      }
-    }
-    return pChildNode;
-  } else if (m_eType == XFA_TEXTPROVIDERTYPE_Datasets) {
-    CXFA_Node* pBind = m_pWidgetAcc->GetDatasets();
-    IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
-    FXSYS_assert(pXMLNode);
-    for (IFDE_XMLNode* pXMLChild =
-             pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-         pXMLChild;
-         pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-      if (pXMLChild->GetType() == FDE_XMLNODE_Element) {
-        IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLChild;
-        if (XFA_RecognizeRichText(pElement)) {
-          bRichText = TRUE;
-        }
-      }
-    }
-    return pBind;
-  } else if (m_eType == XFA_TEXTPROVIDERTYPE_Caption) {
-    CXFA_Node* pCaptionNode =
-        m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
-    if (pCaptionNode == NULL) {
-      return NULL;
-    }
-    CXFA_Node* pValueNode = pCaptionNode->GetChild(0, XFA_ELEMENT_Value);
-    if (pValueNode == NULL) {
-      return NULL;
-    }
-    CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
-      CFX_WideString wsContentType;
-      pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
-      if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-        bRichText = TRUE;
-      }
-    }
-    return pChildNode;
-  }
-  CXFA_Node* pItemNode =
-      m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Items);
-  if (pItemNode == NULL) {
-    return NULL;
-  }
-  CXFA_Node* pNode = pItemNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pNode) {
-    CFX_WideStringC wsName;
-    pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-    if (m_eType == XFA_TEXTPROVIDERTYPE_Rollover &&
-        wsName == FX_WSTRC(L"rollover")) {
-      return pNode;
-    }
-    if (m_eType == XFA_TEXTPROVIDERTYPE_Down && wsName == FX_WSTRC(L"down")) {
-      return pNode;
-    }
-    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-CXFA_Para CXFA_TextProvider::GetParaNode() {
-  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
-    return m_pWidgetAcc->GetPara();
-  }
-  CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
-  return CXFA_Para(pNode->GetChild(0, XFA_ELEMENT_Para));
-}
-CXFA_Font CXFA_TextProvider::GetFontNode() {
-  if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
-    return m_pWidgetAcc->GetFont();
-  }
-  CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
-  pNode = pNode->GetChild(0, XFA_ELEMENT_Font);
-  if (pNode) {
-    return CXFA_Font(pNode);
-  }
-  return m_pWidgetAcc->GetFont();
-}
-FX_BOOL CXFA_TextProvider::IsCheckButtonAndAutoWidth() {
-  XFA_ELEMENT eType = m_pWidgetAcc->GetUIType();
-  if (eType == XFA_ELEMENT_CheckButton) {
-    FX_FLOAT fWidth = 0;
-    return !m_pWidgetAcc->GetWidth(fWidth);
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_TextProvider::GetEmbbedObj(FX_BOOL bURI,
-                                        FX_BOOL bRaw,
-                                        const CFX_WideString& wsAttr,
-                                        CFX_WideString& wsValue) {
-  if (m_eType != XFA_TEXTPROVIDERTYPE_Text) {
-    return FALSE;
-  }
-  if (bURI) {
-    CXFA_Node* pWidgetNode = m_pWidgetAcc->GetNode();
-    CXFA_Node* pParent = pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent);
-    CXFA_Document* pDocument = pWidgetNode->GetDocument();
-    CXFA_Node* pIDNode = NULL;
-    CXFA_WidgetAcc* pEmbAcc = NULL;
-    if (pParent) {
-      pIDNode = pDocument->GetNodeByID(pParent, wsAttr);
-    }
-    if (!pIDNode) {
-      pIDNode = pDocument->GetNodeByID(
-          ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Form)), wsAttr);
-    }
-    if (pIDNode) {
-      pEmbAcc = (CXFA_WidgetAcc*)pIDNode->GetWidgetData();
-    }
-    if (pEmbAcc) {
-      pEmbAcc->GetValue(wsValue, XFA_VALUEPICTURE_Display);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
diff --git a/xfa/src/fxfa/app/xfa_ffwidgetacc.h b/xfa/src/fxfa/app/xfa_ffwidgetacc.h
deleted file mode 100644
index 19bd28d..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidgetacc.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFWIDGETACC_H_
-#define XFA_SRC_FXFA_APP_XFA_FFWIDGETACC_H_
-
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-enum XFA_TEXTPROVIDERTYPE {
-  XFA_TEXTPROVIDERTYPE_Text,
-  XFA_TEXTPROVIDERTYPE_Datasets,
-  XFA_TEXTPROVIDERTYPE_Caption,
-  XFA_TEXTPROVIDERTYPE_Rollover,
-  XFA_TEXTPROVIDERTYPE_Down,
-};
-class CXFA_TextProvider : public IXFA_TextProvider {
- public:
-  CXFA_TextProvider(CXFA_WidgetAcc* pWidgetAcc,
-                    XFA_TEXTPROVIDERTYPE eType,
-                    CXFA_Node* pTextNode = NULL)
-      : m_pWidgetAcc(pWidgetAcc), m_eType(eType), m_pTextNode(pTextNode) {
-    FXSYS_assert(m_pWidgetAcc);
-  }
-  virtual ~CXFA_TextProvider() {}
-  virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText);
-  virtual CXFA_Para GetParaNode();
-  virtual CXFA_Font GetFontNode();
-  virtual FX_BOOL IsCheckButtonAndAutoWidth();
-  virtual CXFA_FFDoc* GetDocNode() { return m_pWidgetAcc->GetDoc(); }
-  virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
-                               FX_BOOL bRaw,
-                               const CFX_WideString& wsAttr,
-                               CFX_WideString& wsValue);
-
- protected:
-  CXFA_WidgetAcc* m_pWidgetAcc;
-  XFA_TEXTPROVIDERTYPE m_eType;
-  CXFA_Node* m_pTextNode;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FFWIDGETACC_H_
diff --git a/xfa/src/fxfa/app/xfa_ffwidgethandler.cpp b/xfa/src/fxfa/app/xfa_ffwidgethandler.cpp
deleted file mode 100644
index bea7586..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidgethandler.cpp
+++ /dev/null
@@ -1,634 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_ffwidgethandler.h"
-
-#include <vector>
-
-#include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_ffdocview.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-
-CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView)
-    : m_pDocView(pDocView) {}
-CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() {}
-IXFA_PageView* CXFA_FFWidgetHandler::GetPageView(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->GetPageView();
-}
-void CXFA_FFWidgetHandler::GetRect(IXFA_Widget* hWidget, CFX_RectF& rt) {
-  static_cast<CXFA_FFWidget*>(hWidget)->GetWidgetRect(rt);
-}
-FX_DWORD CXFA_FFWidgetHandler::GetStatus(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->GetStatus();
-}
-FX_BOOL CXFA_FFWidgetHandler::GetBBox(IXFA_Widget* hWidget,
-                                      CFX_RectF& rtBox,
-                                      FX_DWORD dwStatus,
-                                      FX_BOOL bDrawFocus) {
-  return static_cast<CXFA_FFWidget*>(hWidget)
-      ->GetBBox(rtBox, dwStatus, bDrawFocus);
-}
-CXFA_WidgetAcc* CXFA_FFWidgetHandler::GetDataAcc(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->GetDataAcc();
-}
-void CXFA_FFWidgetHandler::GetName(IXFA_Widget* hWidget,
-                                   CFX_WideString& wsName,
-                                   int32_t iNameType) {
-  static_cast<CXFA_FFWidget*>(hWidget)->GetDataAcc()->GetName(wsName,
-                                                              iNameType);
-}
-FX_BOOL CXFA_FFWidgetHandler::GetToolTip(IXFA_Widget* hWidget,
-                                         CFX_WideString& wsToolTip) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->GetToolTip(wsToolTip);
-}
-void CXFA_FFWidgetHandler::SetPrivateData(IXFA_Widget* hWidget,
-                                          void* module_id,
-                                          void* pData,
-                                          PD_CALLBACK_FREEDATA callback) {
-  static_cast<CXFA_FFWidget*>(hWidget)
-      ->SetPrivateData(module_id, pData, callback);
-}
-void* CXFA_FFWidgetHandler::GetPrivateData(IXFA_Widget* hWidget,
-                                           void* module_id) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->GetPrivateData(module_id);
-}
-FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(IXFA_Widget* hWidget) {
-  m_pDocView->LockUpdate();
-  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnMouseEnter();
-  m_pDocView->UnlockUpdate();
-  m_pDocView->UpdateDocView();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(IXFA_Widget* hWidget) {
-  m_pDocView->LockUpdate();
-  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnMouseExit();
-  m_pDocView->UnlockUpdate();
-  m_pDocView->UpdateDocView();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(IXFA_Widget* hWidget,
-                                            FX_DWORD dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  m_pDocView->LockUpdate();
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonDown(dwFlags, fx, fy);
-  if (bRet && m_pDocView->SetFocus(hWidget)) {
-    ((CXFA_FFDoc*)m_pDocView->GetDoc())
-        ->GetDocProvider()
-        ->SetFocusWidget(m_pDocView->GetDoc(), (IXFA_Widget*)hWidget);
-  }
-  m_pDocView->UnlockUpdate();
-  m_pDocView->UpdateDocView();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(IXFA_Widget* hWidget,
-                                          FX_DWORD dwFlags,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  m_pDocView->LockUpdate();
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  m_pDocView->m_bLayoutEvent = TRUE;
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonUp(dwFlags, fx, fy);
-  m_pDocView->UnlockUpdate();
-  m_pDocView->UpdateDocView();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(IXFA_Widget* hWidget,
-                                              FX_DWORD dwFlags,
-                                              FX_FLOAT fx,
-                                              FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnLButtonDblClk(dwFlags, fx, fy);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(IXFA_Widget* hWidget,
-                                          FX_DWORD dwFlags,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnMouseMove(dwFlags, fx, fy);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(IXFA_Widget* hWidget,
-                                           FX_DWORD dwFlags,
-                                           int16_t zDelta,
-                                           FX_FLOAT fx,
-                                           FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)
-                     ->OnMouseWheel(dwFlags, zDelta, fx, fy);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(IXFA_Widget* hWidget,
-                                            FX_DWORD dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonDown(dwFlags, fx, fy);
-  if (bRet && m_pDocView->SetFocus(hWidget)) {
-    ((CXFA_FFDoc*)m_pDocView->GetDoc())
-        ->GetDocProvider()
-        ->SetFocusWidget(m_pDocView->GetDoc(), (IXFA_Widget*)hWidget);
-  }
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(IXFA_Widget* hWidget,
-                                          FX_DWORD dwFlags,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonUp(dwFlags, fx, fy);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(IXFA_Widget* hWidget,
-                                              FX_DWORD dwFlags,
-                                              FX_FLOAT fx,
-                                              FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnRButtonDblClk(dwFlags, fx, fy);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(IXFA_Widget* hWidget,
-                                        FX_DWORD dwKeyCode,
-                                        FX_DWORD dwFlags) {
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnKeyDown(dwKeyCode, dwFlags);
-  m_pDocView->RunInvalidate();
-  m_pDocView->UpdateDocView();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(IXFA_Widget* hWidget,
-                                      FX_DWORD dwKeyCode,
-                                      FX_DWORD dwFlags) {
-  FX_BOOL bRet =
-      static_cast<CXFA_FFWidget*>(hWidget)->OnKeyUp(dwKeyCode, dwFlags);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_BOOL CXFA_FFWidgetHandler::OnChar(IXFA_Widget* hWidget,
-                                     FX_DWORD dwChar,
-                                     FX_DWORD dwFlags) {
-  FX_BOOL bRet = static_cast<CXFA_FFWidget*>(hWidget)->OnChar(dwChar, dwFlags);
-  m_pDocView->RunInvalidate();
-  return bRet;
-}
-FX_DWORD CXFA_FFWidgetHandler::OnHitTest(IXFA_Widget* hWidget,
-                                         FX_FLOAT fx,
-                                         FX_FLOAT fy) {
-  if (!(static_cast<CXFA_FFWidget*>(hWidget)->GetStatus() &
-        XFA_WIDGETSTATUS_Visible)) {
-    return FWL_WGTHITTEST_Unknown;
-  }
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  return static_cast<CXFA_FFWidget*>(hWidget)->OnHitTest(fx, fy);
-}
-FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(IXFA_Widget* hWidget,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
-  static_cast<CXFA_FFWidget*>(hWidget)->Rotate2Normal(fx, fy);
-  return static_cast<CXFA_FFWidget*>(hWidget)->OnSetCursor(fx, fy);
-}
-void CXFA_FFWidgetHandler::RenderWidget(IXFA_Widget* hWidget,
-                                        CFX_Graphics* pGS,
-                                        CFX_Matrix* pMatrix,
-                                        FX_BOOL bHighlight) {
-  static_cast<CXFA_FFWidget*>(hWidget)->RenderWidget(
-      pGS, pMatrix, bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0);
-}
-FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
-                                       XFA_EVENTTYPE eEventType) {
-  if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) {
-    return FALSE;
-  }
-  if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
-    return FALSE;
-  }
-  switch (eEventType) {
-    case XFA_EVENT_Calculate: {
-      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
-      if (!calc) {
-        return FALSE;
-      }
-      if (calc.GetScript()) {
-        return TRUE;
-      }
-      return FALSE;
-    }
-    case XFA_EVENT_Validate: {
-      CXFA_Validate val = pWidgetAcc->GetValidate();
-      if (!val) {
-        return FALSE;
-      }
-      if (val.GetScript()) {
-        return TRUE;
-      }
-      return FALSE;
-    }
-    default:
-      break;
-  }
-  CXFA_NodeArray eventArray;
-  return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
-                                        eventArray);
-}
-int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
-                                           CXFA_EventParam* pParam) {
-  if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
-    return XFA_EVENTERROR_NotExist;
-  }
-  switch (pParam->m_eType) {
-    case XFA_EVENT_Calculate:
-      return pWidgetAcc->ProcessCalculate();
-    case XFA_EVENT_Validate:
-      if (((CXFA_FFDoc*)m_pDocView->GetDoc())
-              ->GetDocProvider()
-              ->IsValidationsEnabled(m_pDocView->GetDoc())) {
-        return pWidgetAcc->ProcessValidate();
-      }
-      return XFA_EVENTERROR_Disabled;
-    case XFA_EVENT_InitCalculate: {
-      CXFA_Calculate calc = pWidgetAcc->GetCalculate();
-      if (!calc) {
-        return XFA_EVENTERROR_NotExist;
-      }
-      if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
-        return XFA_EVENTERROR_Disabled;
-      }
-      CXFA_Script script = calc.GetScript();
-      return pWidgetAcc->ExecuteScript(script, pParam);
-    }
-    default:
-      break;
-  }
-  int32_t iRet =
-      pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
-  return iRet;
-}
-IXFA_Widget* CXFA_FFWidgetHandler::CreateWidget(IXFA_Widget* hParent,
-                                                XFA_WIDGETTYPE eType,
-                                                IXFA_Widget* hBefore) {
-  CXFA_Node* pParentFormItem =
-      hParent ? static_cast<CXFA_FFWidget*>(hParent)->GetDataAcc()->GetNode()
-              : NULL;
-  CXFA_Node* pBeforeFormItem =
-      hBefore ? static_cast<CXFA_FFWidget*>(hBefore)->GetDataAcc()->GetNode()
-              : NULL;
-  CXFA_Node* pNewFormItem =
-      CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
-  if (pNewFormItem == NULL) {
-    return NULL;
-  }
-  pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized);
-  pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized);
-  m_pDocView->RunLayout();
-  CXFA_LayoutItem* pLayout =
-      m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
-  return (IXFA_Widget*)pLayout;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
-    XFA_WIDGETTYPE eType,
-    CXFA_Node* pParent,
-    CXFA_Node* pBefore) const {
-  switch (eType) {
-    case XFA_WIDGETTYPE_Barcode:
-      return NULL;
-    case XFA_WIDGETTYPE_PushButton:
-      return CreatePushButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_CheckButton:
-      return CreateCheckButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_ExcludeGroup:
-      return CreateExclGroup(pParent, pBefore);
-    case XFA_WIDGETTYPE_RadioButton:
-      return CreateRadioButton(pParent, pBefore);
-    case XFA_WIDGETTYPE_Arc:
-      return CreateArc(pParent, pBefore);
-    case XFA_WIDGETTYPE_Rectangle:
-      return CreateRectangle(pParent, pBefore);
-    case XFA_WIDGETTYPE_Image:
-      return CreateImage(pParent, pBefore);
-    case XFA_WIDGETTYPE_Line:
-      return CreateLine(pParent, pBefore);
-    case XFA_WIDGETTYPE_Text:
-      return CreateText(pParent, pBefore);
-    case XFA_WIDGETTYPE_DatetimeEdit:
-      return CreateDatetimeEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_DecimalField:
-      return CreateDecimalField(pParent, pBefore);
-    case XFA_WIDGETTYPE_NumericField:
-      return CreateNumericField(pParent, pBefore);
-    case XFA_WIDGETTYPE_Signature:
-      return CreateSignature(pParent, pBefore);
-    case XFA_WIDGETTYPE_TextEdit:
-      return CreateTextEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_DropdownList:
-      return CreateDropdownList(pParent, pBefore);
-    case XFA_WIDGETTYPE_ListBox:
-      return CreateListBox(pParent, pBefore);
-    case XFA_WIDGETTYPE_ImageField:
-      return CreateImageField(pParent, pBefore);
-    case XFA_WIDGETTYPE_PasswordEdit:
-      return CreatePasswordEdit(pParent, pBefore);
-    case XFA_WIDGETTYPE_Subform:
-      return CreateSubform(pParent, pBefore);
-    default:
-      break;
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
-                                                  CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore);
-  CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField);
-  CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption);
-  CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue);
-  pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE);
-  CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption);
-  pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
-  pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
-  CreateFontNode(pCaption);
-  CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField);
-  pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
-  CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder);
-  pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
-  CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder);
-  CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill);
-  pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE);
-  CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
-  pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
-                                                   CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore);
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
-                                                   CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
-  CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui);
-  CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton);
-  pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore);
-  CreateValueNode(XFA_ELEMENT_Date, pField);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateNumericField(pParent, pBefore);
-  CreateValueNode(XFA_ELEMENT_Decimal, pField);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_Signature, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
-                                               CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
-  CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
-  CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
-  pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
-  pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
-                                                  CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore);
-  CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
-  pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement,
-                                             CXFA_Node* pParent,
-                                             CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore);
-  CreateCopyNode(eElement, CreateCopyNode(XFA_ELEMENT_Ui, pField));
-  CreateFontNode(pField);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
-                                           CXFA_Node* pBefore) const {
-  return CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore);
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
-                                                 CXFA_Node* pBefore) const {
-  return CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore);
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
-                                             CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore);
-  CreateCopyNode(XFA_ELEMENT_ImageEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Line, pParent, pBefore);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore);
-  CreateCopyNode(XFA_ELEMENT_TextEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
-  CreateFontNode(pField);
-  return pField;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement,
-                                            CXFA_Node* pParent,
-                                            CXFA_Node* pBefore) const {
-  CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore);
-  CreateValueNode(eElement, pDraw);
-  return pDraw;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
-                                               CXFA_Node* pBefore) const {
-  CXFA_Node* pSubform = CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore);
-  return pSubform;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement,
-                                                CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
-  CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
-  if (pParent)
-    pParent->InsertChild(pNewFormItem, pBefore);
-  return pNewFormItem;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement,
-                                                CXFA_Node* pParent,
-                                                CXFA_Node* pBefore) const {
-  CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
-  CXFA_Node* pNewNode =
-      CreateTemplateNode(eElement, pTemplateParent,
-                         pBefore ? pBefore->GetTemplateNode() : NULL)
-          ->Clone(FALSE);
-  if (pParent)
-    pParent->InsertChild(pNewNode, pBefore);
-  return pNewNode;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement,
-                                                    CXFA_Node* pParent,
-                                                    CXFA_Node* pBefore) const {
-  CXFA_Document* pXFADoc = GetXFADoc();
-  CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(
-      XFA_XDPPACKET_Template, eElement);
-  if (pParent)
-    pParent->InsertChild(pNewTemplateNode, pBefore);
-  return pNewTemplateNode;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
-  CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent);
-  pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE);
-  return pFont;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
-                                                  FX_DWORD dwFlags,
-                                                  FX_FLOAT fInsets[4]) const {
-  CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent);
-  if (dwFlags & 0x01) {
-    pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
-                        CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
-  }
-  if (dwFlags & 0x02) {
-    pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
-                        CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
-  }
-  if (dwFlags & 0x04) {
-    pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
-                        CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
-  }
-  if (dwFlags & 0x08) {
-    pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
-                        CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
-  }
-  return pMargin;
-}
-CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue,
-                                                 CXFA_Node* pParent) const {
-  CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent);
-  CreateCopyNode(eValue, pValue);
-  return pValue;
-}
-IXFA_ObjFactory* CXFA_FFWidgetHandler::GetObjFactory() const {
-  return GetXFADoc()->GetParser()->GetFactory();
-}
-CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
-  return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc();
-}
-CXFA_FFMenuHandler::CXFA_FFMenuHandler() {}
-CXFA_FFMenuHandler::~CXFA_FFMenuHandler() {}
-FX_BOOL CXFA_FFMenuHandler::CanCopy(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanCopy();
-}
-FX_BOOL CXFA_FFMenuHandler::CanCut(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanCut();
-}
-FX_BOOL CXFA_FFMenuHandler::CanPaste(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanPaste();
-}
-FX_BOOL CXFA_FFMenuHandler::CanSelectAll(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanSelectAll();
-}
-FX_BOOL CXFA_FFMenuHandler::CanDelete(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanDelete();
-}
-FX_BOOL CXFA_FFMenuHandler::CanDeSelect(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanDeSelect();
-}
-FX_BOOL CXFA_FFMenuHandler::Copy(IXFA_Widget* hWidget, CFX_WideString& wsText) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Copy(wsText);
-}
-FX_BOOL CXFA_FFMenuHandler::Cut(IXFA_Widget* hWidget, CFX_WideString& wsText) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Cut(wsText);
-}
-FX_BOOL CXFA_FFMenuHandler::Paste(IXFA_Widget* hWidget,
-                                  const CFX_WideString& wsText) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Paste(wsText);
-}
-FX_BOOL CXFA_FFMenuHandler::SelectAll(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->SelectAll();
-}
-FX_BOOL CXFA_FFMenuHandler::Delete(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Delete();
-}
-FX_BOOL CXFA_FFMenuHandler::DeSelect(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->DeSelect();
-}
-FX_BOOL CXFA_FFMenuHandler::CanUndo(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanUndo();
-}
-FX_BOOL CXFA_FFMenuHandler::CanRedo(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->CanRedo();
-}
-FX_BOOL CXFA_FFMenuHandler::Undo(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Undo();
-}
-FX_BOOL CXFA_FFMenuHandler::Redo(IXFA_Widget* hWidget) {
-  return static_cast<CXFA_FFWidget*>(hWidget)->Redo();
-}
-FX_BOOL CXFA_FFMenuHandler::GetSuggestWords(
-    IXFA_Widget* hWidget,
-    CFX_PointF pointf,
-    std::vector<CFX_ByteString>& sSuggest) {
-  return static_cast<CXFA_FFWidget*>(hWidget)
-      ->GetSuggestWords(pointf, sSuggest);
-}
-FX_BOOL CXFA_FFMenuHandler::ReplaceSpellCheckWord(
-    IXFA_Widget* hWidget,
-    CFX_PointF pointf,
-    const CFX_ByteStringC& bsReplace) {
-  return static_cast<CXFA_FFWidget*>(hWidget)
-      ->ReplaceSpellCheckWord(pointf, bsReplace);
-}
diff --git a/xfa/src/fxfa/app/xfa_ffwidgethandler.h b/xfa/src/fxfa/app/xfa_ffwidgethandler.h
deleted file mode 100644
index 73de9e2..0000000
--- a/xfa/src/fxfa/app/xfa_ffwidgethandler.h
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FFWIDGETHANDLER_H_
-#define XFA_SRC_FXFA_APP_XFA_FFWIDGETHANDLER_H_
-
-#include <vector>
-
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-class CXFA_FFDocView;
-
-class CXFA_FFWidgetHandler : public IXFA_WidgetHandler {
- public:
-  CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView);
-  ~CXFA_FFWidgetHandler();
-  virtual IXFA_Widget* CreateWidget(IXFA_Widget* hParent,
-                                    XFA_WIDGETTYPE eType,
-                                    IXFA_Widget* hBefore = NULL);
-  virtual IXFA_PageView* GetPageView(IXFA_Widget* hWidget);
-  virtual void GetRect(IXFA_Widget* hWidget, CFX_RectF& rt);
-  virtual FX_DWORD GetStatus(IXFA_Widget* hWidget);
-  virtual FX_BOOL GetBBox(IXFA_Widget* hWidget,
-                          CFX_RectF& rtBox,
-                          FX_DWORD dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual CXFA_WidgetAcc* GetDataAcc(IXFA_Widget* hWidget);
-  virtual void GetName(IXFA_Widget* hWidget,
-                       CFX_WideString& wsName,
-                       int32_t iNameType = 0);
-  virtual FX_BOOL GetToolTip(IXFA_Widget* hWidget, CFX_WideString& wsToolTip);
-  virtual void SetPrivateData(IXFA_Widget* hWidget,
-                              void* module_id,
-                              void* pData,
-                              PD_CALLBACK_FREEDATA callback);
-  virtual void* GetPrivateData(IXFA_Widget* hWidget, void* module_id);
-  virtual FX_BOOL OnMouseEnter(IXFA_Widget* hWidget);
-  virtual FX_BOOL OnMouseExit(IXFA_Widget* hWidget);
-  virtual FX_BOOL OnLButtonDown(IXFA_Widget* hWidget,
-                                FX_DWORD dwFlags,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(IXFA_Widget* hWidget,
-                              FX_DWORD dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(IXFA_Widget* hWidget,
-                                  FX_DWORD dwFlags,
-                                  FX_FLOAT fx,
-                                  FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(IXFA_Widget* hWidget,
-                              FX_DWORD dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(IXFA_Widget* hWidget,
-                               FX_DWORD dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(IXFA_Widget* hWidget,
-                                FX_DWORD dwFlags,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(IXFA_Widget* hWidget,
-                              FX_DWORD dwFlags,
-                              FX_FLOAT fx,
-                              FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(IXFA_Widget* hWidget,
-                                  FX_DWORD dwFlags,
-                                  FX_FLOAT fx,
-                                  FX_FLOAT fy);
-
-  virtual FX_BOOL OnKeyDown(IXFA_Widget* hWidget,
-                            FX_DWORD dwKeyCode,
-                            FX_DWORD dwFlags);
-  virtual FX_BOOL OnKeyUp(IXFA_Widget* hWidget,
-                          FX_DWORD dwKeyCode,
-                          FX_DWORD dwFlags);
-  virtual FX_BOOL OnChar(IXFA_Widget* hWidget,
-                         FX_DWORD dwChar,
-                         FX_DWORD dwFlags);
-  virtual FX_DWORD OnHitTest(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(IXFA_Widget* hWidget, FX_FLOAT fx, FX_FLOAT fy);
-  virtual void RenderWidget(IXFA_Widget* hWidget,
-                            CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            FX_BOOL bHighlight = FALSE);
-  virtual FX_BOOL HasEvent(CXFA_WidgetAcc* pWidgetAcc,
-                           XFA_EVENTTYPE eEventType);
-  virtual int32_t ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
-                               CXFA_EventParam* pParam);
-
- protected:
-  CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType,
-                                  CXFA_Node* pParent,
-                                  CXFA_Node* pBefore) const;
-
-  CXFA_Node* CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateField(XFA_ELEMENT eElement,
-                         CXFA_Node* pParent,
-                         CXFA_Node* pBefore) const;
-  CXFA_Node* CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateDraw(XFA_ELEMENT eElement,
-                        CXFA_Node* pParent,
-                        CXFA_Node* pBefore) const;
-
-  CXFA_Node* CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const;
-  CXFA_Node* CreateFormItem(XFA_ELEMENT eElement,
-                            CXFA_Node* pParent,
-                            CXFA_Node* pBefore) const;
-  CXFA_Node* CreateCopyNode(XFA_ELEMENT eElement,
-                            CXFA_Node* pParent,
-                            CXFA_Node* pBefore = NULL) const;
-  CXFA_Node* CreateTemplateNode(XFA_ELEMENT eElement,
-                                CXFA_Node* pParent,
-                                CXFA_Node* pBefore) const;
-  CXFA_Node* CreateFontNode(CXFA_Node* pParent) const;
-  CXFA_Node* CreateMarginNode(CXFA_Node* pParent,
-                              FX_DWORD dwFlags,
-                              FX_FLOAT fInsets[4]) const;
-  CXFA_Node* CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const;
-  IXFA_ObjFactory* GetObjFactory() const;
-  CXFA_Document* GetXFADoc() const;
-
-  CXFA_FFDocView* m_pDocView;
-};
-
-class CXFA_FFMenuHandler : public IXFA_MenuHandler {
- public:
-  CXFA_FFMenuHandler();
-  ~CXFA_FFMenuHandler();
-  virtual FX_BOOL CanCopy(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanCut(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanPaste(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanSelectAll(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanDelete(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanDeSelect(IXFA_Widget* hWidget);
-  virtual FX_BOOL Copy(IXFA_Widget* hWidget, CFX_WideString& wsText);
-  virtual FX_BOOL Cut(IXFA_Widget* hWidget, CFX_WideString& wsText);
-  virtual FX_BOOL Paste(IXFA_Widget* hWidget, const CFX_WideString& wsText);
-  virtual FX_BOOL SelectAll(IXFA_Widget* hWidget);
-  virtual FX_BOOL Delete(IXFA_Widget* hWidget);
-  virtual FX_BOOL DeSelect(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanUndo(IXFA_Widget* hWidget);
-  virtual FX_BOOL CanRedo(IXFA_Widget* hWidget);
-  virtual FX_BOOL Undo(IXFA_Widget* hWidget);
-  virtual FX_BOOL Redo(IXFA_Widget* hWidget);
-  virtual FX_BOOL GetSuggestWords(IXFA_Widget* hWidget,
-                                  CFX_PointF pointf,
-                                  std::vector<CFX_ByteString>& sSuggest);
-  virtual FX_BOOL ReplaceSpellCheckWord(IXFA_Widget* hWidget,
-                                        CFX_PointF pointf,
-                                        const CFX_ByteStringC& bsReplace);
-};
-
-#endif  //  XFA_SRC_FXFA_APP_XFA_FFWIDGETHANDLER_H_
diff --git a/xfa/src/fxfa/app/xfa_fontmgr.cpp b/xfa/src/fxfa/app/xfa_fontmgr.cpp
deleted file mode 100644
index 3c7b1cb..0000000
--- a/xfa/src/fxfa/app/xfa_fontmgr.cpp
+++ /dev/null
@@ -1,2089 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fontmgr.h"
-
-#include <algorithm>
-
-#include "core/include/fpdfapi/cpdf_dictionary.h"
-#include "core/include/fpdfapi/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_resource.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-static const XFA_FONTINFO g_XFAFontsMap[] = {
-    {0x01d5d33e, L"SimSun", L"Arial", 0, 936},
-    {0x01e4f102, L"YouYuan", L"Arial", 1, 936},
-    {0x030549dc, L"LiSu", L"Arial", 1, 936},
-    {0x032edd44, L"Simhei", L"Arial", 1, 936},
-    {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252},
-    {0x03ed90e6, L"Nina", L"Arial", 0, 1252},
-    {0x077b56b3, L"KingsoftPhoneticPlain", L"Arial", 0, 1252},
-    {0x078ed524, L"MicrosoftSansSerif", L"Arial", 0, 1252},
-    {0x089b18a9, L"Arial", L"Arial", 0, 1252},
-    {0x0b2cad72, L"MonotypeCorsiva", L"Arial", 8, 1252},
-    {0x0bb003e7, L"Kartika", L"Arial", 2, 1252},
-    {0x0bb469df, L"VinerHandITC", L"Arial", 8, 1252},
-    {0x0bc1a851, L"SegoeUI", L"Arial", 0, 1252},
-    {0x0c112ebd, L"KozukaGothicPro-VIM", L"Arial", 0, 1252},
-    {0x0cfcb9c1, L"AdobeThai", L"Kokila,Arial Narrow", 0, 847},
-    {0x0e7de0f9, L"Playbill", L"Arial", 0, 1252},
-    {0x0eff47c3, L"STHupo", L"Arial", 0, 936},
-    {0x107ad374, L"Constantia", L"Arial", 2, 1252},
-    {0x12194c2d, L"KunstlerScript", L"Arial", 8, 1252},
-    {0x135ef6a1, L"MinionProSmBd",
-     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
-    {0x158c4049, L"Garamond", L"Arial", 2, 1252},
-    {0x160ecb24, L"STZhongsong", L"Arial", 0, 936},
-    {0x161ed07e, L"MSGothic", L"Arial", 1, 1252},
-    {0x171d1ed1, L"SnapITC-Regular", L"Arial", 0, 1252},
-    {0x18d1188f, L"Cambria", L"Arial", 2, 1252},
-    {0x18eaf350, L"ArialUnicodeMS", L"Arial", 0, 936},
-    {0x1a92d115, L"MingLiU", L"Arial", 1, 1252},
-    {0x1cc217c6, L"TrebuchetMS", L"Arial", 0, 1252},
-    {0x1d649596, L"BasemicTimes", L"Arial", 0, 1252},
-    {0x1e34ee60, L"BellMT", L"Arial", 2, 1252},
-    {0x1eb36945, L"CooperBlack", L"Arial", 2, 1252},
-    {0x1ef7787d, L"BatangChe", L"Arial", 1, 1252},
-    {0x20b3bd3a, L"BrushScriptMT", L"Arial", 8, 1252},
-    {0x220877aa, L"Candara", L"Arial", 0, 1252},
-    {0x22135007, L"FreestyleScript-Regular", L"Arial", 8, 1252},
-    {0x251059c3, L"Chiller", L"Arial", 0, 1252},
-    {0x25bed6dd, L"MSReferenceSansSerif", L"Arial", 0, 1252},
-    {0x28154c81, L"Parchment-Regular", L"Arial", 8, 1252},
-    {0x29711eb9, L"STLiti", L"Arial", 0, 936},
-    {0x2b1993b4, L"Basemic", L"Arial", 0, 1252},
-    {0x2b316339, L"NiagaraSolid-Reg", L"Arial", 0, 1252},
-    {0x2c147529, L"FootlightMTLight", L"Arial", 0, 1252},
-    {0x2c198928, L"HarlowSolid", L"Arial", 0, 1252},
-    {0x2c6ac6b2, L"LucidaBright", L"Arial", 2, 1252},
-    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"Arial", 0, 1252},
-    {0x2d5a47b0, L"STCaiyun", L"Arial", 0, 936},
-    {0x2def26bf, L"BernardMT-Condensed", L"Arial", 0, 1252},
-    {0x2fd8930b, L"KozukaMinchoPr6NR", L"Arial", 0, 1252},
-    {0x3115525a, L"FangSong_GB2312", L"Arial", 0, 1252},
-    {0x31327817, L"MyriadPro",
-     L"Calibri,Corbel,Candara,Cambria Math,Franklin Gothic Medium,Arial "
-     L"Narrow,Times New Roman",
-     0, 1252},
-    {0x32244975, L"Helvetica", L"Arial", 0, 1252},
-    {0x32ac995c, L"Terminal", L"Arial", 0, 1252},
-    {0x338d648a, L"NiagaraEngraved-Reg", L"Arial", 0, 1252},
-    {0x33bb65f2, L"Sylfaen", L"Arial", 2, 1252},
-    {0x3402c30e, L"MSPMincho", L"Arial", 2, 1252},
-    {0x3412bf31, L"SimSun-PUA", L"Arial", 0, 936},
-    {0x36eb39b9, L"BerlinSansFB", L"Arial", 0, 1252},
-    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
-    {0x3864c4f6, L"HighTowerText", L"Arial", 2, 1252},
-    {0x3a257d03, L"FangSong_GB2312", L"Arial", 0, 1252},
-    {0x3cdae668, L"FreestyleScript", L"Arial", 8, 1252},
-    {0x3d55aed7, L"Jokerman", L"Arial", 0, 1252},
-    {0x3d5b4385, L"PMingLiU", L"Arial", 2, 1252},
-    {0x3d9b7669, L"EstrangeloEdessa", L"Arial", 0, 1252},
-    {0x3e532d74, L"FranklinGothicMedium", L"Arial", 0, 1252},
-    {0x3e6aa32d, L"NSimSun", L"Arial", 1, 936},
-    {0x3f6c36a8, L"Gautami", L"Arial", 0, 1252},
-    {0x3ff32662, L"Chiller-Regular", L"Arial", 0, 1252},
-    {0x409de312, L"ModernNo.20", L"Arial", 2, 1252},
-    {0x41443c5e, L"Georgia", L"Arial", 2, 1252},
-    {0x4160ade5, L"BellGothicStdBlack",
-     L"Arial,Arial Unicode MS,Book Antiqua,Dotum,Georgia", 0, 1252},
-    {0x421976c4, L"Modern-Regular", L"Arial", 2, 1252},
-    {0x422a7252, L"Stencil", L"Arial", 0, 1252},
-    {0x42c8554f, L"Fixedsys", L"Arial", 0, 1252},
-    {0x435cb41d, L"Roman", L"Arial", 0, 1252},
-    {0x47882383, L"CourierNew", L"Arial", 1, 1252},
-    {0x480a2338, L"BerlinSansFBDemi", L"Arial", 0, 1252},
-    {0x480bf7a4, L"CourierStd", L"Courier New,Verdana", 0, 1252},
-    {0x481ad6ed, L"VladimirScript", L"Arial", 8, 1252},
-    {0x4911577a, L"YouYuan", L"Arial", 1, 936},
-    {0x4a788d72, L"STXingkai", L"Arial", 0, 936},
-    {0x4bf88566, L"SegoeCondensed", L"Arial", 0, 1252},
-    {0x4ccf51a4, L"BerlinSansFB-Reg", L"Arial", 0, 1252},
-    {0x4ea967ce, L"GulimChe", L"Arial", 1, 1252},
-    {0x4f68bd79, L"LetterGothicStd", L"Courier New,Verdana", 0, 1252},
-    {0x51a0d0e6, L"KozukaGothicPr6NM", L"Arial", 0, 1252},
-    {0x531b3dea, L"BasemicSymbol", L"Arial", 0, 1252},
-    {0x5333fd39, L"CalifornianFB-Reg", L"Arial", 2, 1252},
-    {0x53561a54, L"FZYTK--GBK1-0", L"Arial", 0, 936},
-    {0x55e0dde6, L"LucidaSansTypewriter", L"Arial", 0, 1252},
-    {0x574d4d3d, L"AdobeArabic", L"Arial Narrow", 0, 1252},
-    {0x5792e759, L"STKaiti", L"Arial", 0, 936},
-    {0x5921978e, L"LucidaSansUnicode", L"Arial", 0, 1252},
-    {0x594e2da4, L"Vrinda", L"Arial", 0, 1252},
-    {0x59baa9a2, L"KaiTi_GB2312", L"Arial", 0, 1252},
-    {0x5cfedf4f, L"BaskOldFace", L"Arial", 0, 1252},
-    {0x5f97921c, L"AdobeMyungjoStdM",
-     L"Batang,Bookman Old Style,Consolas,STZhongsong", 0, 936},
-    {0x5fefbfad, L"Batang", L"Arial", 2, 1252},
-    {0x605342b9, L"DotumChe", L"Arial", 1, 1252},
-    {0x608c5f9a, L"KaiTi_GB2312", L"Arial", 0, 936},
-    {0x61efd0d1, L"MaturaMTScriptCapitals", L"Arial", 0, 1252},
-    {0x626608a9, L"MVBoli", L"Arial", 0, 1252},
-    {0x630501a3, L"SmallFonts", L"Arial", 0, 1252},
-    {0x65d0e2a9, L"FZYTK--GBK1-0", L"Arial", 0, 936},
-    {0x669f29e1, L"FZSTK--GBK1-0", L"Arial", 0, 936},
-    {0x673a9e5f, L"Tunga", L"Arial", 0, 1252},
-    {0x691aa4ce, L"NiagaraSolid", L"Arial", 0, 1252},
-    {0x696259b7, L"Corbel", L"Arial", 0, 1252},
-    {0x696ee9be, L"STXihei", L"Arial", 0, 936},
-    {0x6c59cf69, L"Dotum", L"Arial", 0, 1252},
-    {0x707fa561, L"Gungsuh", L"Arial", 2, 1252},
-    {0x71416bb2, L"ZWAdobeF", L"Arial", 0, 1252},
-    {0x71b41801, L"Verdana", L"Arial", 0, 1252},
-    {0x73f25e4c, L"PalatinoLinotype", L"Arial", 0, 1252},
-    {0x73f4d19f, L"NiagaraEngraved", L"Arial", 0, 1252},
-    {0x74001694, L"MyriadProBlack", L"Book Antiqua,Constantia,Dotum,Georgia", 0,
-     1252},
-    {0x74b14d8f, L"Haettenschweiler", L"Arial", 0, 1252},
-    {0x74cb44ee, L"NSimSun", L"Arial", 1, 936},
-    {0x76b4d7ff, L"Shruti", L"Arial", 0, 1252},
-    {0x788b3533, L"Webdings", L"Arial", 6, 42},
-    {0x797dde99, L"MSSerif", L"Arial", 0, 1252},
-    {0x7a0f9e9e, L"MSMincho", L"Arial", 1, 1252},
-    {0x7b439caf, L"OldEnglishTextMT", L"Arial", 0, 1252},
-    {0x8213a433, L"LucidaSans-Typewriter", L"Arial", 0, 1252},
-    {0x82fec929, L"AdobeSongStdL",
-     L"Centaur,Calibri,STSong,Bell MT,Garamond,Times New Roman", 0, 936},
-    {0x83581825, L"Modern", L"Arial", 0, 1252},
-    {0x835a2823, L"Algerian", L"Arial", 0, 1252},
-    {0x83dab9f5, L"Script", L"Arial", 0, 1252},
-    {0x847b56da, L"Tahoma", L"Arial", 0, 1252},
-    {0x8a783cb2, L"SimSun-PUA", L"Arial", 0, 1252},
-    {0x8b5cac0e, L"Onyx", L"Arial", 0, 1252},
-    {0x8c6a499e, L"Gulim", L"Arial", 0, 1252},
-    {0x8e0af790, L"JuiceITC", L"Arial", 0, 1252},
-    {0x8e8d43b2, L"Centaur", L"Arial", 2, 1252},
-    {0x8ee4dcca, L"BookshelfSymbol7", L"Arial", 0, 1252},
-    {0x90794800, L"BellGothicStdLight", L"Bell MT,Calibri,Times New Roman", 0,
-     1252},
-    {0x909b516a, L"Century", L"Arial", 2, 1252},
-    {0x92ae370d, L"MSOutlook", L"Arial", 4, 42},
-    {0x93c9fbf1, L"LucidaFax", L"Arial", 2, 1252},
-    {0x9565085e, L"BookAntiqua", L"Arial", 2, 1252},
-    {0x9856d95d, L"AdobeMingStdL", L"Arial,Arial Unicode MS,Cambria,BatangChe",
-     0, 949},
-    {0x9bbadd6b, L"ColonnaMT", L"Arial", 0, 1252},
-    {0x9cbd16a4, L"ShowcardGothic-Reg", L"Arial", 0, 1252},
-    {0x9d73008e, L"MSSansSerif", L"Arial", 0, 1252},
-    {0xa0607db1, L"GungsuhChe", L"Arial", 1, 1252},
-    {0xa0bcf6a1, L"LatinWide", L"Arial", 2, 1252},
-    {0xa1429b36, L"Symbol", L"Arial", 6, 42},
-    {0xa1fa5abc, L"Wingdings2", L"Arial", 6, 42},
-    {0xa1fa5abd, L"Wingdings3", L"Arial", 6, 42},
-    {0xa427bad4, L"InformalRoman-Regular", L"Arial", 8, 1252},
-    {0xa8b92ece, L"FZSTK--GBK1-0", L"Arial", 0, 936},
-    {0xa8d83ece, L"CalifornianFB", L"Arial", 2, 1252},
-    {0xaa3e082c, L"Kingsoft-Phonetic", L"Arial", 0, 1252},
-    {0xaa6bcabe, L"HarlowSolidItalic", L"Arial", 0, 1252},
-    {0xade5337c, L"MSUIGothic", L"Arial", 0, 1252},
-    {0xb08dd941, L"WideLatin", L"Arial", 2, 1252},
-    {0xb207f05d, L"PoorRichard", L"Arial", 2, 1252},
-    {0xb3bc492f, L"JuiceITC-Regular", L"Arial", 0, 1252},
-    {0xb5545399, L"Marlett", L"Arial", 4, 42},
-    {0xb5dd1ebb, L"BritannicBold", L"Arial", 0, 1252},
-    {0xb699c1c5, L"LucidaCalligraphy-Italic", L"Arial", 0, 1252},
-    {0xb725d629, L"TimesNewRoman", L"Arial", 2, 1252},
-    {0xb7eaebeb, L"AdobeHeitiStdR", L"Batang,Century,Dotum", 0, 936},
-    {0xbd29c486, L"BerlinSansFBDemi-Bold", L"Arial", 0, 1252},
-    {0xbe8a8db4, L"BookshelfSymbolSeven", L"Arial", 0, 1252},
-    {0xc16c0118, L"AdobeHebrew", L"Bell MT,Berlin Sans FB,Calibri", 0, 1252},
-    {0xc318b0af, L"MyriadProLight", L"Calibri,STFangsong,Times New Roman", 0,
-     1252},
-    {0xc65e5659, L"CambriaMath", L"Arial", 2, 1252},
-    {0xc75c8f05, L"LucidaConsole", L"Arial", 1, 1252},
-    {0xca7c35d6, L"Calibri", L"Arial", 0, 1252},
-    {0xcb053f53, L"MicrosoftYaHei", L"Arial", 0, 936},
-    {0xcb7190f9, L"Magneto-Bold", L"Arial", 0, 1252},
-    {0xcca00cc5, L"System", L"Arial", 0, 1252},
-    {0xccad6f76, L"Jokerman-Regular", L"Arial", 0, 1252},
-    {0xccc5818c, L"EuroSign", L"Arial", 0, 1252},
-    {0xcf3d7234, L"LucidaHandwriting-Italic", L"Arial", 0, 1252},
-    {0xcf7b8fdb, L"MinionPro",
-     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
-    {0xcfe5755f, L"Simhei", L"Arial", 1, 936},
-    {0xd011f4ee, L"MSPGothic", L"Arial", 0, 1252},
-    {0xd060e7ef, L"Vivaldi", L"Arial", 8, 1252},
-    {0xd07edec1, L"FranklinGothic-Medium", L"Arial", 0, 1252},
-    {0xd107243f, L"SimSun", L"Arial", 0, 936},
-    {0xd1881562, L"ArialNarrow", L"Arial Narrow", 0, 1252},
-    {0xd22b7dce, L"BodoniMTPosterCompressed", L"Arial", 0, 1252},
-    {0xd22bfa60, L"ComicSansMS", L"Arial", 8, 1252},
-    {0xd3bd0e35, L"Bauhaus93", L"Arial", 0, 1252},
-    {0xd429ee7a, L"STFangsong", L"Arial", 0, 936},
-    {0xd6679c12, L"BernardMTCondensed", L"Arial", 0, 1252},
-    {0xd8e8a027, L"LucidaSans", L"Arial", 0, 1252},
-    {0xd9fe7761, L"HighTowerText-Reg", L"Arial", 2, 1252},
-    {0xda7e551e, L"STSong", L"Arial", 0, 936},
-    {0xdaa6842d, L"STZhongsong", L"Arial", 0, 936},
-    {0xdaaab93f, L"STFangsong", L"Arial", 0, 936},
-    {0xdaeb0713, L"STSong", L"Arial", 0, 936},
-    {0xdafedbef, L"STCaiyun", L"Arial", 0, 936},
-    {0xdb00a3d9, L"Broadway", L"Arial", 0, 1252},
-    {0xdb1f5ad4, L"STXinwei", L"Arial", 0, 936},
-    {0xdb326e7f, L"STKaiti", L"Arial", 0, 936},
-    {0xdb69595a, L"STHupo", L"Arial", 0, 936},
-    {0xdba0082c, L"STXihei", L"Arial", 0, 936},
-    {0xdbd0ab18, L"STXingkai", L"Arial", 0, 936},
-    {0xdc1a7db1, L"STLiti", L"Arial", 0, 936},
-    {0xdc33075f, L"KristenITC-Regular", L"Arial", 8, 1252},
-    {0xdcc7009c, L"Harrington", L"Arial", 0, 1252},
-    {0xdd712466, L"ArialBlack", L"Arial", 0, 1252},
-    {0xdde87b3e, L"Impact", L"Arial", 0, 1252},
-    {0xdf69fb32, L"SnapITC", L"Arial", 0, 1252},
-    {0xdf8b25e8, L"CenturyGothic", L"Arial", 0, 1252},
-    {0xe0f705c0, L"KristenITC", L"Arial", 8, 1252},
-    {0xe1427573, L"Raavi", L"Arial", 0, 1252},
-    {0xe2cea0cb, L"Magneto", L"Arial", 0, 1252},
-    {0xe36a9e17, L"Ravie", L"Arial", 0, 1252},
-    {0xe433f8e2, L"Parchment", L"Arial", 8, 1252},
-    {0xe43dff4a, L"Wingdings", L"Arial", 4, 42},
-    {0xe4e2c405, L"MTExtra", L"Arial", 6, 42},
-    {0xe618cc35, L"InformalRoman", L"Arial", 8, 1252},
-    {0xe6c27ffc, L"Mistral", L"Arial", 8, 1252},
-    {0xe7ebf4b9, L"Courier", L"Courier New", 0, 1252},
-    {0xe8bc4a9d, L"MSReferenceSpecialty", L"Arial", 0, 1252},
-    {0xe90fb013, L"TempusSansITC", L"Arial", 0, 1252},
-    {0xec637b42, L"Consolas", L"Verdana", 1, 1252},
-    {0xed3a683b, L"STXinwei", L"Arial", 0, 936},
-    {0xef264cd1, L"LucidaHandwriting", L"Arial", 0, 1252},
-    {0xf086bca2, L"BaskervilleOldFace", L"Arial", 0, 1252},
-    {0xf1028030, L"Mangal", L"Arial", 2, 1252},
-    {0xf1da7eb9, L"ShowcardGothic", L"Arial", 0, 1252},
-    {0xf210f06a, L"ArialMT", L"Arial", 0, 1252},
-    {0xf477f16a, L"Latha", L"Arial", 0, 1252},
-    {0xf616f3dd, L"LiSu", L"Arial", 1, 936},
-    {0xfa479aa6, L"MicrosoftYaHei", L"Arial", 0, 936},
-    {0xfcd19697, L"BookmanOldStyle", L"Arial", 0, 1252},
-    {0xfe209a82, L"LucidaCalligraphy", L"Arial", 0, 1252},
-    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Batang,Century,Dotum", 0, 936},
-};
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
-static const XFA_FONTINFO g_XFAFontsMap[] = {
-    {0x01d5d33e, L"SimSun",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE",
-     0, 936},
-    {0x01e4f102, L"YouYuan",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE",
-     1, 936},
-    {0x030549dc, L"LiSu",
-     L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei "
-     L"Mono,WenQuanYi Micro Hei",
-     1, 936},
-    {0x032edd44, L"Simhei",
-     L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei "
-     L"Mono,WenQuanYi Micro Hei",
-     1, 936},
-    {0x03eac6fc, L"PoorRichard-Regular", L"Droid Sans Japanese,FreeSerif", 2,
-     1252},
-    {0x03ed90e6, L"Nina", L"FreeSerif", 0, 1252},
-    {0x077b56b3, L"KingsoftPhoneticPlain",
-     L"Tibetan Machine Uni,LKLUG,Samyak Gujarati,Droid Sans Thai,Droid Sans "
-     L"Armenian,Untitled1,utkal,Lohit Oriya",
-     0, 1252},
-    {0x078ed524, L"MicrosoftSansSerif",
-     L"Droid Sans Japanese,FreeSerif,WenQuanYi Micro Hei", 0, 1252},
-    {0x089b18a9, L"Arial",
-     L"Droid Sans Japanese,DejaVu Sans Condensed,FreeSerif,WenQuanYi Micro Hei",
-     0, 1252},
-    {0x0b2cad72, L"MonotypeCorsiva", L"Droid Sans Japanese,FreeSerif", 8, 1252},
-    {0x0bb003e7, L"Kartika",
-     L"FreeSans,Liberation Sans,Liberation Sans Narrow,Nimbus Sans "
-     L"L,Garuda,FreeSerif,WenQuanYi Micro Hei",
-     2, 1252},
-    {0x0bb469df, L"VinerHandITC",
-     L"Droid Sans Japanese,Ubuntu,Liberation Sans,Liberation Serif", 8, 1252},
-    {0x0bc1a851, L"SegoeUI", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0x0c112ebd, L"KozukaGothicPro-VIM", L"FreeSerif", 0, 1252},
-    {0x0cfcb9c1, L"AdobeThai", L"Droid Sans Japanese,Waree", 0, 847},
-    {0x0e7de0f9, L"Playbill",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Ethiopic,Droid Sans Japanese,FreeSerif",
-     0, 1252},
-    {0x0eff47c3, L"STHupo", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0x107ad374, L"Constantia",
-     L"Droid Sans Japanese,FreeSerif,WenQuanYi Micro Hei,Ubuntu", 2, 1252},
-    {0x12194c2d, L"KunstlerScript", L"Droid Sans Japanese,Liberation Serif", 8,
-     1252},
-    {0x135ef6a1, L"MinionProSmBd", L"Liberation Serif", 0, 1252},
-    {0x158c4049, L"Garamond",
-     L"Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 2, 1252},
-    {0x160ecb24, L"STZhongsong",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x161ed07e, L"MSGothic",
-     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,AR PL "
-     L"UMing CN,AR PL UMing HK,AR PL UMing TW",
-     1, 1252},
-    {0x171d1ed1, L"SnapITC-Regular",
-     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans L,DejaVu Sans", 0,
-     1252},
-    {0x18d1188f, L"Cambria", L"Droid Sans Japanese,FreeSerif,FreeMono", 2,
-     1252},
-    {0x18eaf350, L"ArialUnicodeMS",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x1a92d115, L"MingLiU",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     1, 1252},
-    {0x1cc217c6, L"TrebuchetMS",
-     L"Droid Sans Japanese,Liberation Serif,FreeSerif,Ubuntu", 0, 1252},
-    {0x1d649596, L"BasemicTimes",
-     L"Liberation Serif,Times New Roman,Droid Sans Japanese,FreeSerif,Ubuntu",
-     0, 1252},
-    {0x1e34ee60, L"BellMT",
-     L"KacstQurn,Droid Sans Japanese,Ubuntu,Liberation Serif", 2, 1252},
-    {0x1eb36945, L"CooperBlack",
-     L"KacstQurn,Droid Sans Japanese,FreeMono,Liberation Mono, WenQuanYi Micro "
-     L"Hei Mono",
-     2, 1252},
-    {0x1ef7787d, L"BatangChe",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing "
-     L"TW,WenQuanYi Zen Hei,WenQuanYi Micro Hei",
-     1, 1252},
-    {0x20b3bd3a, L"BrushScriptMT",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
-     L"Japanese,URW Chancery L,Liberation Sans",
-     8, 1252},
-    {0x220877aa, L"Candara", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0x22135007, L"FreestyleScript-Regular",
-     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 8, 1252},
-    {0x251059c3, L"Chiller",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
-     L"Japanese,Liberation Sans",
-     0, 1252},
-    {0x25bed6dd, L"MSReferenceSansSerif",
-     L"DejaVu Sans Condensed,Ubuntu Condensed,Droid Sans Japanese,AR PL UKai "
-     L"HK",
-     0, 1252},
-    {0x28154c81, L"Parchment-Regular", L"Droid Sans Japanese,Liberation Sans",
-     8, 1252},
-    {0x29711eb9, L"STLiti", L"AR PL UKai HK", 0, 936},
-    {0x2b1993b4, L"Basemic",
-     L"Liberation Serif,Droid Sans Japanese,Liberation Sans", 0, 1252},
-    {0x2b316339, L"NiagaraSolid-Reg", L"Droid Sans Japanese,Liberation Sans", 0,
-     1252},
-    {0x2c147529, L"FootlightMTLight",
-     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 0, 1252},
-    {0x2c198928, L"HarlowSolid",
-     L"KacstQurn,Droid Sans Japanese,Liberation Sans", 0, 1252},
-    {0x2c6ac6b2, L"LucidaBright",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Japanese,Liberation Sans",
-     2, 1252},
-    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"DejaVu Sans", 0, 1252},
-    {0x2d5a47b0, L"STCaiyun", L"AR PL UKai HK", 0, 936},
-    {0x2def26bf, L"BernardMT-Condensed",
-     L"KacstQurn,Droid Sans Japanese,DejaVu Serif", 0, 1252},
-    {0x2fd8930b, L"KozukaMinchoPr6NR", L"DejaVu Serif", 0, 1252},
-    {0x3115525a, L"FangSong_GB2312",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 1252},
-    {0x31327817, L"MyriadPro",
-     L"Ubuntu Condensed,Droid Sans Japanese, FreeSerif", 0, 1252},
-    {0x32244975, L"Helvetica",
-     L"Ubuntu,DejaVu Sans Condensed,Liberation Sans,Liberation Sans "
-     L"Narrow,Nimbus Sans L",
-     0, 1252},
-    {0x32ac995c, L"Terminal", L"DejaVu Serif", 0, 1252},
-    {0x338d648a, L"NiagaraEngraved-Reg", L"Droid Sans Japanese,DejaVu Serif", 0,
-     1252},
-    {0x33bb65f2, L"Sylfaen", L"Droid Sans Japanese,DejaVu Sans", 2, 1252},
-    {0x3402c30e, L"MSPMincho",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 2,
-     1252},
-    {0x3412bf31, L"SimSun-PUA",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing CN,AR PL UMing HK", 0,
-     936},
-    {0x36eb39b9, L"BerlinSansFB",
-     L"Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 0, 1252},
-    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
-    {0x3864c4f6, L"HighTowerText", L"Droid Sans Japanese,DejaVu Serif", 2,
-     1252},
-    {0x3a257d03, L"FangSong_GB2312",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei", 0, 1252},
-    {0x3c7d1d07, L"Garamond3LTStd",
-     L"Droid Sans Japanese,Ubuntu Condensed,DejaVu Sans Condensed,Liberation "
-     L"Serif,Ubuntu,FreeSerif",
-     2, 1252},
-    {0x3cdae668, L"FreestyleScript",
-     L"KacstQurn,Droid Sans Japanese,DejaVu Sans", 8, 1252},
-    {0x3d55aed7, L"Jokerman", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0x3d5b4385, L"PMingLiU",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     2, 1252},
-    {0x3d9b7669, L"EstrangeloEdessa", L"Droid Sans Japanese,DejaVu Sans", 0,
-     1252},
-    {0x3e532d74, L"FranklinGothicMedium", L"Droid Sans Japanese,Ubuntu", 0,
-     1252},
-    {0x3e6aa32d, L"NSimSun",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     1, 936},
-    {0x3f6c36a8, L"Gautami",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic, mry_KacstQurn,Droid Sans "
-     L"Japanese,FreeSans",
-     0, 1252},
-    {0x3ff32662, L"Chiller-Regular",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,FreeSans", 0, 1252},
-    {0x409de312, L"ModernNo.20",
-     L"KacstQurn,Droid Sans Japanese,Nimbus Sans L,Nimbus Sans L,FreeSans", 2,
-     1252},
-    {0x41443c5e, L"Georgia", L"Droid Sans Japanese,FreeSans", 2, 1252},
-    {0x4160ade5, L"BellGothicStdBlack", L"FreeSans", 0, 1252},
-    {0x421976c4, L"Modern-Regular", L"FreeSans", 2, 1252},
-    {0x422a7252, L"Stencil", L"Droid Sans Japanese,FreeSans,Liberation Sans", 0,
-     1252},
-    {0x42c8554f, L"Fixedsys", L"FreeSerif", 0, 1252},
-    {0x435cb41d, L"Roman", L"FreeSerif", 0, 1252},
-    {0x47882383, L"CourierNew",
-     L"FreeMono,WenQuanYi Micro Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL "
-     L"UKai TW,AR PL UKai TW MBE,DejaVu Sans",
-     1, 1252},
-    {0x480a2338, L"BerlinSansFBDemi", L"Droid Sans Japanese,Liberation Serif",
-     0, 1252},
-    {0x480bf7a4, L"CourierStd", L"DejaVu Sans", 0, 1252},
-    {0x481ad6ed, L"VladimirScript", L"Droid Sans Japanese,DejaVu Serif", 8,
-     1252},
-    {0x4911577a, L"YouYuan",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 1,
-     936},
-    {0x4a788d72, L"STXingkai", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0x4bf88566, L"SegoeCondensed", L"FreeSerif", 0, 1252},
-    {0x4ccf51a4, L"BerlinSansFB-Reg", L"Droid Sans Japanese,Liberation Serif",
-     0, 1252},
-    {0x4ea967ce, L"GulimChe",
-     L"WenQuanYi Zen Hei Mono,AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL "
-     L"UKai TW MBE",
-     1, 1252},
-    {0x4f68bd79, L"LetterGothicStd",
-     L"FreeMono,Liberation Mono,Andale Mono,WenQuanYi Micro Hei Mono", 0, 1252},
-    {0x51a0d0e6, L"KozukaGothicPr6NM", L"FreeSerif", 0, 1252},
-    {0x531b3dea, L"BasemicSymbol", L"FreeSerif", 0, 1252},
-    {0x5333fd39, L"CalifornianFB-Reg",
-     L"Droid Sans Japanese,URW Chancery L,FreeSerif", 2, 1252},
-    {0x53561a54, L"FZYTK--GBK1-0",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x55e0dde6, L"LucidaSansTypewriter",
-     L"Ubuntu Mono,DejaVu Sans Mono,Nimbus Mono L,Liberation Mono,Courier 10 "
-     L"Pitch,FreeMono",
-     0, 1252},
-    {0x574d4d3d, L"AdobeArabic", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0x5792e759, L"STKaiti", L"WenQuanYi Micro Hei Mono", 0, 936},
-    {0x5921978e, L"LucidaSansUnicode", L"Droid Sans Japanese,DejaVu Sans", 0,
-     1252},
-    {0x594e2da4, L"Vrinda",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Arabic "
-     L"Naskh,mry_KacstQurn,Droid Sans Japanese,FreeSans,FreeSerif",
-     0, 1252},
-    {0x59baa9a2, L"KaiTi_GB2312",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 1252},
-    {0x5cfedf4f, L"BaskOldFace",
-     L"KacstQurn,Droid Sans Japanese,Ubuntu,Liberation Serif", 0, 1252},
-    {0x5e16ac91, L"TrajanPro",
-     L"Nimbus Sans L,AR PL UMing HK,AR PL UKai HK,AR PL UMing TW,AR PL UMing "
-     L"TW MBE,DejaVu Sans,DejaVu Serif",
-     0, 1252},
-    {0x5f388196, L"ITCLegacySansStdMedium",
-     L"Liberation Serif,FreeSerif,FreeSans,Ubuntu", 0, 1252},
-    {0x5f97921c, L"AdobeMyungjoStdM",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x5fefbfad, L"Batang",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     2, 1252},
-    {0x605342b9, L"DotumChe",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 1,
-     1252},
-    {0x608c5f9a, L"KaiTi_GB2312",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x61efd0d1, L"MaturaMTScriptCapitals",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Japanese,DejaVu Serif,DejaVu Sans",
-     0, 1252},
-    {0x626608a9, L"MVBoli",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Ethiopic,Droid Sans Japanese,DejaVu Sans",
-     0, 1252},
-    {0x630501a3, L"SmallFonts", L"DejaVu Serif", 0, 1252},
-    {0x65d0e2a9, L"FZYTK--GBK1-0",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x669f29e1, L"FZSTK--GBK1-0",
-     L"AR PL UMing CN,AR PL UKai CN, AR PL UMing HK", 0, 936},
-    {0x673a9e5f, L"Tunga",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Japanese,DejaVu Serif",
-     0, 1252},
-    {0x691aa4ce, L"NiagaraSolid", L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
-    {0x696259b7, L"Corbel", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0x696ee9be, L"STXihei", L"WenQuanYi Micro Hei Mono", 0, 936},
-    {0x6c59cf69, L"Dotum", L"WenQuanYi Zen Hei Mono", 0, 1252},
-    {0x707fa561, L"Gungsuh", L"WenQuanYi Zen Hei Mono", 2, 1252},
-    {0x71416bb2, L"ZWAdobeF",
-     L"KacstArt,KacstBookm,KacstDecorative,KacstDigital,KacstFarsi,KacstLetter,"
-     L"KacstOffice,Dingbats,FreeSerif",
-     0, 1252},
-    {0x71b41801, L"Verdana",
-     L"DejaVu Sans Condensed,Ubuntu Condensed,Droid Sans Japanese,DejaVu Sans",
-     0, 1252},
-    {0x73f25e4c, L"PalatinoLinotype", L"Droid Sans Japanese,FreeSerif", 0,
-     1252},
-    {0x73f4d19f, L"NiagaraEngraved", L"Droid Sans Japanese,FreeSerif", 0, 1252},
-    {0x74001694, L"MyriadProBlack", L"Droid Sans Japanese,AR PL UKai HK", 0,
-     1252},
-    {0x74b14d8f, L"Haettenschweiler", L"Droid Sans Japanese,DejaVu Serif", 0,
-     1252},
-    {0x74cb44ee, L"NSimSun", L"WenQuanYi Zen Hei Mono", 1, 936},
-    {0x76b4d7ff, L"Shruti",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Japanese,FreeSans",
-     0, 1252},
-    {0x788b3533, L"Webdings", L"FreeSans", 6, 42},
-    {0x797dde99, L"MSSerif", L"FreeSans", 0, 1252},
-    {0x7a0f9e9e, L"MSMincho",
-     L"WenQuanYi Micro Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW",
-     1, 1252},
-    {0x7b439caf, L"OldEnglishTextMT",
-     L"Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
-    {0x8213a433, L"LucidaSans-Typewriter",
-     L"Ubuntu Mono,Liberation Mono,DejaVu Sans Mono", 0, 1252},
-    {0x82fec929, L"AdobeSongStdL",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0x83581825, L"Modern", L"FreeSans", 0, 1252},
-    {0x835a2823, L"Algerian",
-     L"KacstQurn,Droid Sans Japanese,FreeSans,Liberation Sans,Ubuntu", 0, 1252},
-    {0x83dab9f5, L"Script", L"FreeSans", 0, 1252},
-    {0x847b56da, L"Tahoma",
-     L"Droid Sans Japanese,DejaVu Sans Condensed,FreeSerif", 0, 1252},
-    {0x8a783cb2, L"SimSun-PUA",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 1252},
-    {0x8b5cac0e, L"Onyx", L"Droid Sans Japanese,Liberation Sans", 0, 1252},
-    {0x8c6a499e, L"Gulim",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 1252},
-    {0x8e0af790, L"JuiceITC", L"Droid Sans Japanese,Liberation Sans", 0, 1252},
-    {0x8e8d43b2, L"Centaur",
-     L"KacstQurn,Droid Sans Japanese,Khmer OS,Khmer OS System", 2, 1252},
-    {0x8ee4dcca, L"BookshelfSymbol7", L"Liberation Sans", 0, 1252},
-    {0x90794800, L"BellGothicStdLight", L"Liberation Sans", 0, 1252},
-    {0x909b516a, L"Century",
-     L"Droid Sans Japanese,Liberation Sans,Liberation Mono,Liberation Serif", 2,
-     1252},
-    {0x92ae370d, L"MSOutlook", L"Liberation Sans", 4, 42},
-    {0x93c9fbf1, L"LucidaFax",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans "
-     L"Ethiopic,mry_KacstQurn,Liberation Sans",
-     2, 1252},
-    {0x9565085e, L"BookAntiqua",
-     L"Droid Sans Japanese,Liberation Sans,Liberation Serif", 2, 1252},
-    {0x9856d95d, L"AdobeMingStdL", L"AR PL UMing HK", 0, 949},
-    {0x9bbadd6b, L"ColonnaMT",
-     L"KacstQurn,Droid Sans Japanese,Khmer OS,Khmer OS System", 0, 1252},
-    {0x9cbd16a4, L"ShowcardGothic-Reg",
-     L"Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
-    {0x9d73008e, L"MSSansSerif", L"FreeSerif", 0, 1252},
-    {0xa0607db1, L"GungsuhChe",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     1, 1252},
-    {0xa0bcf6a1, L"LatinWide", L"FreeSerif", 2, 1252},
-    {0xa1429b36, L"Symbol", L"FreeSerif", 6, 42},
-    {0xa1fa5abc, L"Wingdings2", L"FreeSerif", 6, 42},
-    {0xa1fa5abd, L"Wingdings3", L"FreeSerif", 6, 42},
-    {0xa427bad4, L"InformalRoman-Regular",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Japanese,FreeSerif",
-     8, 1252},
-    {0xa8b92ece, L"FZSTK--GBK1-0", L"AR PL UMing CN", 0, 936},
-    {0xa8d83ece, L"CalifornianFB", L"Droid Sans Japanese,FreeSerif", 2, 1252},
-    {0xaa3e082c, L"Kingsoft-Phonetic",
-     L"Tibetan Machine Uni,LKLUG,Samyak Gujarati,Droid Sans "
-     L"Thai,utkal,Kedage,Mallige,AR PL UKai CN",
-     0, 1252},
-    {0xaa6bcabe, L"HarlowSolidItalic",
-     L"KacstQurn,Droid Sans Japanese,Liberation Serif", 0, 1252},
-    {0xade5337c, L"MSUIGothic",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 1252},
-    {0xb08dd941, L"WideLatin",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Japanese,Liberation Serif",
-     2, 1252},
-    {0xb12765e0, L"ITCLegacySansStdBook",
-     L"AR PL UMing HK,AR PL UKai HK,FreeSerif,Ubuntu,FreeSans", 0, 1252},
-    {0xb207f05d, L"PoorRichard", L"Droid Sans Japanese,Liberation Serif", 2,
-     1252},
-    {0xb3bc492f, L"JuiceITC-Regular", L"Droid Sans Japanese,Liberation Serif",
-     0, 1252},
-    {0xb5545399, L"Marlett", L"Liberation Serif", 4, 42},
-    {0xb5dd1ebb, L"BritannicBold",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans "
-     L"Ethiopic,mry_KacstQurn,Liberation Serif",
-     0, 1252},
-    {0xb699c1c5, L"LucidaCalligraphy-Italic",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Japanese,DejaVu Serif",
-     0, 1252},
-    {0xb725d629, L"TimesNewRoman", L"Droid Sans Japanese,Liberation Sans", 2,
-     1252},
-    {0xb7eaebeb, L"AdobeHeitiStdR",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0xbd29c486, L"BerlinSansFBDemi-Bold", L"Droid Sans Japanese,DejaVu Serif",
-     0, 1252},
-    {0xbe8a8db4, L"BookshelfSymbolSeven", L"DejaVu Sans", 0, 1252},
-    {0xc16c0118, L"AdobeHebrew", L"Droid Sans Japanese,Ubuntu,Liberation Serif",
-     0, 1252},
-    {0xc318b0af, L"MyriadProLight",
-     L"Droid Sans Japanese,AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     1252},
-    {0xc65e5659, L"CambriaMath", L"Droid Sans Japanese,FreeSerif,FreeMono", 2,
-     1252},
-    {0xc75c8f05, L"LucidaConsole",
-     L"Liberation Mono,DejaVu Sans Mono,FreeMono,WenQuanYi Micro Hei Mono", 1,
-     1252},
-    {0xca7c35d6, L"Calibri", L"Droid Sans Japanese,DejaVu Sans", 0, 1252},
-    {0xcb053f53, L"MicrosoftYaHei",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0xcb7190f9, L"Magneto-Bold",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Japanese,DejaVu Serif",
-     0, 1252},
-    {0xcca00cc5, L"System", L"DejaVu Sans", 0, 1252},
-    {0xccad6f76, L"Jokerman-Regular", L"Droid Sans Japanese,DejaVu Sans", 0,
-     1252},
-    {0xccc5818c, L"EuroSign", L"DejaVu Serif", 0, 1252},
-    {0xcf3d7234, L"LucidaHandwriting-Italic",
-     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans L,DejaVu Serif", 0,
-     1252},
-    {0xcf7b8fdb, L"MinionPro", L"DejaVu Sans", 0, 1252},
-    {0xcfe5755f, L"Simhei",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     1, 936},
-    {0xd011f4ee, L"MSPGothic",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW", 0,
-     1252},
-    {0xd060e7ef, L"Vivaldi",
-     L"KacstQurn,Droid Sans Japanese,Liberation Sans,Ubuntu", 8, 1252},
-    {0xd07edec1, L"FranklinGothic-Medium", L"Droid Sans Japanese,Ubuntu", 0,
-     1252},
-    {0xd107243f, L"SimSun", L"WenQuanYi Zen Hei Mono", 0, 936},
-    {0xd1881562, L"ArialNarrow",
-     L"Liberation Sans Narrow,Droid Sans Japanese,FreeSerif", 0, 1252},
-    {0xd22b7dce, L"BodoniMTPosterCompressed",
-     L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
-    {0xd22bfa60, L"ComicSansMS",
-     L"Droid Sans Japanese,FreeMono,Liberation Mono", 8, 1252},
-    {0xd3bd0e35, L"Bauhaus93",
-     L"KacstQurn,Droid Sans Japanese,Liberation Sans,Ubuntu", 0, 1252},
-    {0xd429ee7a, L"STFangsong", L"WenQuanYi Micro Hei Mono", 0, 936},
-    {0xd6679c12, L"BernardMTCondensed",
-     L"KacstQurn,Droid Sans Japanese,Nimbus Sans L,URW Chancery "
-     L"L,KacstOne,Liberation Sans",
-     0, 1252},
-    {0xd8e8a027, L"LucidaSans",
-     L"Liberation Sans Narrow,Nimbus Sans L,KacstQurn,Droid Arabic Naskh,Droid "
-     L"Sans Ethiopic,DejaVu Serif Condensed,Liberation Mono,Ubuntu",
-     0, 1252},
-    {0xd9fe7761, L"HighTowerText-Reg",
-     L"Droid Sans Japanese,Ubuntu,Liberation Serif", 2, 1252},
-    {0xda7e551e, L"STSong", L"WenQuanYi Micro Hei Mono", 0, 936},
-    {0xdaa6842d, L"STZhongsong",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0xdaaab93f, L"STFangsong",
-     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
-     L"Hei,WenQuanYi Zen Hei Sharp",
-     0, 936},
-    {0xdaeb0713, L"STSong",
-     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
-     L"Hei,WenQuanYi Zen Hei Sharp",
-     0, 936},
-    {0xdafedbef, L"STCaiyun", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0xdb00a3d9, L"Broadway",
-     L"KacstQurn,Droid Sans Japanese,DejaVu Sans,FreeMono,Liberation Mono", 0,
-     1252},
-    {0xdb1f5ad4, L"STXinwei", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0xdb326e7f, L"STKaiti",
-     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
-     L"Hei,WenQuanYi Zen Hei Sharp",
-     0, 936},
-    {0xdb69595a, L"STHupo",
-     L"WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
-     L"Hei,WenQuanYi Zen Hei Sharp",
-     0, 936},
-    {0xdba0082c, L"STXihei",
-     L" WenQuanYi Micro Hei Mono,WenQuanYi Zen Hei Mono,WenQuanYi Zen "
-     L"Hei,WenQuanYi Zen Hei Sharp",
-     0, 936},
-    {0xdbd0ab18, L"STXingkai", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0xdc1a7db1, L"STLiti", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0xdc33075f, L"KristenITC-Regular",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu Sans "
-     L"Condensed,Ubuntu,Liberation Sans",
-     8, 1252},
-    {0xdcc7009c, L"Harrington",
-     L"KacstQurn,Droid Sans Japanese,Liberation Serif,FreeSerif,Ubuntu", 0,
-     1252},
-    {0xdd712466, L"ArialBlack",
-     L"Droid Sans Japanese,DejaVu Sans,DejaVu Serif,FreeMono", 0, 1252},
-    {0xdde87b3e, L"Impact", L"Droid Sans Japanese,DejaVu Serif", 0, 1252},
-    {0xdf69fb32, L"SnapITC",
-     L"Liberation Sans Narrow,Ubuntu Condensed,DejaVu Sans,DejaVu "
-     L"Serif,FreeMono",
-     0, 1252},
-    {0xdf8b25e8, L"CenturyGothic",
-     L"Droid Sans Japanese,Liberation Mono,Liberation Sans,Liberation Serif", 0,
-     1252},
-    {0xe0f705c0, L"KristenITC",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu Sans "
-     L"Condensed,Ubuntu,Liberation Sans",
-     8, 1252},
-    {0xe1427573, L"Raavi",
-     L"Droid Arabic Naskh,Droid Sans "
-     L"Ethiopic,mry_KacstQurn,FreeSerif,Liberation Serif,Khmer OS",
-     0, 1252},
-    {0xe2cea0cb, L"Magneto",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu "
-     L"Serif,DejaVu Serif Condensed,DejaVu Sans",
-     0, 1252},
-    {0xe36a9e17, L"Ravie",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,DejaVu "
-     L"Serif,DejaVu Sans,FreeMono",
-     0, 1252},
-    {0xe433f8e2, L"Parchment", L"Droid Sans Japanese,DejaVu Serif", 8, 1252},
-    {0xe43dff4a, L"Wingdings", L"DejaVu Serif", 4, 42},
-    {0xe4e2c405, L"MTExtra", L"DejaVu Serif", 6, 42},
-    {0xe618cc35, L"InformalRoman",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid Sans "
-     L"Japanese,Nimbus Sans L,DejaVu Sans Condensed,Ubuntu,Liberation Sans",
-     8, 1252},
-    {0xe6c27ffc, L"Mistral", L"Droid Sans Japanese,DejaVu Serif", 8, 1252},
-    {0xe7ebf4b9, L"Courier", L"DejaVu Sans,DejaVu Sans Condensed,FreeSerif", 0,
-     1252},
-    {0xe8bc4a9d, L"MSReferenceSpecialty", L"DejaVu Serif", 0, 1252},
-    {0xe90fb013, L"TempusSansITC",
-     L"Droid Sans Japanese,Ubuntu,Liberation Serif,FreeSerif", 0, 1252},
-    {0xec637b42, L"Consolas",
-     L"DejaVu Sans Condensed,AR PL UKai CN,AR PL UKai HK,AR PL UKai "
-     L"TW,FreeSerif,FreeSans",
-     1, 1252},
-    {0xed3a683b, L"STXinwei", L"AR PL UKai HK,AR PL UMing HK,AR PL UKai CN", 0,
-     936},
-    {0xef264cd1, L"LucidaHandwriting",
-     L"Liberation Sans Narrow,Ubuntu Condensed,Nimbus Sans "
-     L"L,KacstQurn,Liberation Mono",
-     0, 1252},
-    {0xf086bca2, L"BaskervilleOldFace",
-     L"KacstQurn,Droid Sans Japanese,Liberation Serif,Ubuntu,FreeSerif", 0,
-     1252},
-    {0xf1028030, L"Mangal",
-     L"FreeSans,TSCu_Paranar,Garuda,Liberation Sans,Liberation Sans "
-     L"Narrow,Nimbus Sans L",
-     2, 1252},
-    {0xf1da7eb9, L"ShowcardGothic",
-     L"Droid Sans Japanese,DejaVu Serif Condensed,DejaVu Sans "
-     L"Condensed,Liberation Sans,Ubuntu",
-     0, 1252},
-    {0xf210f06a, L"ArialMT",
-     L"Liberation Sans,Liberation Sans Narrow,FreeSans,Nimbus Sans L,Khmer OS "
-     L"System,Khmer OS",
-     0, 1252},
-    {0xf477f16a, L"Latha",
-     L"Liberation Sans Narrow,Nimbus Sans L,Droid Arabic "
-     L"Naskh,mry_KacstQurn,FreeSerif,Nimbus Sans L",
-     0, 1252},
-    {0xf616f3dd, L"LiSu",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE",
-     1, 936},
-    {0xfa479aa6, L"MicrosoftYaHei",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-    {0xfcd19697, L"BookmanOldStyle",
-     L"Droid Sans Japanese,Liberation Mono,Liberation Sans,Liberation Serif", 0,
-     1252},
-    {0xfe209a82, L"LucidaCalligraphy",
-     L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid "
-     L"Sans Japanese,DejaVu Serif,DejaVu Sans,FreeMono",
-     0, 1252},
-    {0xfef135f8, L"AdobeHeitiStd-Regular",
-     L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei "
-     L"Sharp,WenQuanYi Micro Hei",
-     0, 936},
-};
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-static const XFA_FONTINFO g_XFAFontsMap[] = {
-    {0x01d5d33e, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936},
-    {0x01e4f102, L"YouYuan", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0x030549dc, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0x032edd44, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0x03eac6fc, L"PoorRichard-Regular",
-     L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252},
-    {0x03ed90e6, L"Nina", L"Microsoft Sans Serif", 0, 1252},
-    {0x077b56b3, L"KingsoftPhoneticPlain",
-     L"LastResort,Apple "
-     L"Chancery,STIXVariants,STIXSizeOneSym,STIXSizeOneSym,Apple Braille",
-     0, 1252},
-    {0x078ed524, L"MicrosoftSansSerif", L"Songti SC,Apple Symbols", 0, 1252},
-    {0x089b18a9, L"Arial",
-     L"Arial Unicode MS,Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x0b2cad72, L"MonotypeCorsiva", L"Arial Narrow,Impact", 8, 1252},
-    {0x0bb003e7, L"Kartika",
-     L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Damascus", 2, 1252},
-    {0x0bb469df, L"VinerHandITC", L"Comic Sans MS,Songti SC,STSong", 8, 1252},
-    {0x0bc1a851, L"SegoeUI", L"Apple Symbols", 0, 1252},
-    {0x0c112ebd, L"KozukaGothicPro-VIM", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0x0cfcb9c1, L"AdobeThai", L"Avenir Next Condensed Ultra Light", 0, 847},
-    {0x0e7de0f9, L"Playbill", L"STIXNonUnicode", 0, 1252},
-    {0x0eff47c3, L"STHupo", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
-    {0x107ad374, L"Constantia", L"Arial Unicode MS,Palatino,Baskerville", 2,
-     1252},
-    {0x12194c2d, L"KunstlerScript",
-     L"Avenir Next Condensed Demi Bold,Arial Narrow", 8, 1252},
-    {0x135ef6a1, L"MinionProSmBd", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x158c4049, L"Garamond", L"Impact,Arial Narrow", 2, 1252},
-    {0x160ecb24, L"STZhongsong", L"STFangsong,Songti SC", 0, 936},
-    {0x161ed07e, L"MSGothic",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing "
-     L"TW,Microsoft Sans Serif,Apple Symbols",
-     1, 1252},
-    {0x171d1ed1, L"SnapITC-Regular", L"STHeiti,Arial Black", 0, 1252},
-    {0x18d1188f, L"Cambria", L"Arial Unicode MS", 2, 1252},
-    {0x18eaf350, L"ArialUnicodeMS", L"Microsoft Sans Serif,Apple Symbols", 0,
-     936},
-    {0x1a92d115, L"MingLiU", L"Heiti SC,STHeiti", 1, 1252},
-    {0x1cc217c6, L"TrebuchetMS", L"Damascus,Impact,Arial Narrow", 0, 1252},
-    {0x1d649596, L"BasemicTimes", L"Liberation Serif,Impact,Arial Narrow", 0,
-     1252},
-    {0x1e34ee60, L"BellMT",
-     L"Papyrus,STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 2, 1252},
-    {0x1eb36945, L"CooperBlack",
-     L"Marion,STIXNonUnicode,Arial Rounded MT Bold,Lucida Grande", 2, 1252},
-    {0x1ef7787d, L"BatangChe",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE,Arial Unicode MS,Heiti TC",
-     1, 1252},
-    {0x20b3bd3a, L"BrushScriptMT",
-     L"STIXNonUnicode,Damascus,Arial Narrow,Avenir Next Condensed,Cochin", 8,
-     1252},
-    {0x220877aa, L"Candara", L"Cochin,Baskerville,Marion", 0, 1252},
-    {0x22135007, L"FreestyleScript-Regular",
-     L"STIXNonUnicode,Nadeem,Zapf Dingbats", 8, 1252},
-    {0x251059c3, L"Chiller",
-     L"Zapf Dingbats,Damascus,STIXNonUnicode,Papyrus,KufiStandardGK,Baghdad", 0,
-     1252},
-    {0x25bed6dd, L"MSReferenceSansSerif",
-     L"Tahoma,Apple Symbols,Apple LiGothic,Arial Unicode MS,Lucida "
-     L"Grande,Microsoft Sans Serif",
-     0, 1252},
-    {0x28154c81, L"Parchment-Regular", L"Microsoft Sans Serif,Apple Symbols", 8,
-     1252},
-    {0x29711eb9, L"STLiti", L"Kaiti SC,Songti SC", 0, 936},
-    {0x2b1993b4, L"Basemic", L"Impact,Arial Narrow", 0, 1252},
-    {0x2b316339, L"NiagaraSolid-Reg", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x2c147529, L"FootlightMTLight",
-     L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans,Noteworthy", 0, 1252},
-    {0x2c198928, L"HarlowSolid",
-     L"Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0, 1252},
-    {0x2c6ac6b2, L"LucidaBright",
-     L"PT Sans Narrow,Papyrus,Damascus,STIXNonUnicode,Arial Rounded MT "
-     L"Bold,Comic Sans MS,Avenir Next",
-     2, 1252},
-    {0x2c9f38e2, L"KozukaMinchoPro-VIR", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0x2d5a47b0, L"STCaiyun", L"Kaiti SC,Songti SC", 0, 936},
-    {0x2def26bf, L"BernardMT-Condensed",
-     L"Impact,Avenir Next Condensed Demi Bold,American Typewriter", 0, 1252},
-    {0x2fd8930b, L"KozukaMinchoPr6NR", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x3115525a, L"FangSong_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
-    {0x31327817, L"MyriadPro", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x32244975, L"Helvetica",
-     L"Arial Narrow,Arial Unicode MS,Damascus,STIXNonUnicode", 0, 1252},
-    {0x32ac995c, L"Terminal", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x338d648a, L"NiagaraEngraved-Reg", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0x33bb65f2, L"Sylfaen", L"Arial Unicode MS,Marion", 2, 1252},
-    {0x3402c30e, L"MSPMincho", L"Arial Unicode MS,Apple SD Gothic Neo", 2,
-     1252},
-    {0x3412bf31, L"SimSun-PUA", L"STHeiti,Heiti TC,STFangsong", 0, 936},
-    {0x36eb39b9, L"BerlinSansFB", L"American Typewriter,Impact", 0, 1252},
-    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
-    {0x3864c4f6, L"HighTowerText", L"STIXGeneral,.Helvetica Neue Desk UI", 2,
-     1252},
-    {0x3a257d03, L"FangSong_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
-    {0x3cdae668, L"FreestyleScript", L"Nadeem,Zapf Dingbats,STIXNonUnicode", 8,
-     1252},
-    {0x3d55aed7, L"Jokerman",
-     L"Papyrus,Lucida Grande,Heiti TC,American Typewriter", 0, 1252},
-    {0x3d5b4385, L"PMingLiU", L"Heiti SC,STHeiti", 2, 1252},
-    {0x3d9b7669, L"EstrangeloEdessa", L"American Typewriter,Marion", 0, 1252},
-    {0x3e532d74, L"FranklinGothicMedium", L"Impact,Arial Narrow", 0, 1252},
-    {0x3e6aa32d, L"NSimSun", L"STHeiti,STFangsong", 1, 936},
-    {0x3f6c36a8, L"Gautami",
-     L"Damascus,STIXNonUnicode,STIXGeneral,American Typewriter", 0, 1252},
-    {0x3ff32662, L"Chiller-Regular", L"Papyrus,KufiStandardGK,Baghdad", 0,
-     1252},
-    {0x409de312, L"ModernNo.20", L"Avenir Next Condensed,Impact", 2, 1252},
-    {0x41443c5e, L"Georgia", L".Helvetica Neue Desk UI,Arial Unicode MS", 2,
-     1252},
-    {0x4160ade5, L"BellGothicStdBlack", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0x421976c4, L"Modern-Regular", L"Impact", 2, 1252},
-    {0x422a7252, L"Stencil", L"STIXNonUnicode,Songti SC,Georgia,Baskerville", 0,
-     1252},
-    {0x42c8554f, L"Fixedsys", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x435cb41d, L"Roman", L"Arial Narrow", 0, 1252},
-    {0x47882383, L"CourierNew", L"PCMyungjo,Osaka,Arial Unicode MS,Songti SC",
-     1, 1252},
-    {0x480a2338, L"BerlinSansFBDemi",
-     L"STIXNonUnicode,American Typewriter,Avenir Next Condensed Heavy", 0,
-     1252},
-    {0x480bf7a4, L"CourierStd", L"Courier New", 0, 1252},
-    {0x481ad6ed, L"VladimirScript",
-     L"STIXNonUnicode,Avenir Next Condensed,Impact", 8, 1252},
-    {0x4911577a, L"YouYuan", L"STHeiti,Heiti TC", 1, 936},
-    {0x4a788d72, L"STXingkai", L"Kaiti SC,Songti SC", 0, 936},
-    {0x4bf88566, L"SegoeCondensed", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x4ccf51a4, L"BerlinSansFB-Reg",
-     L"STIXNonUnicode,American Typewriter,Impact", 0, 1252},
-    {0x4ea967ce, L"GulimChe", L"Arial Unicode MS,Heiti TC,STFangsong", 1, 1252},
-    {0x4f68bd79, L"LetterGothicStd",
-     L"Courier New,Andale Mono,Ayuthaya,PCMyungjo,Osaka", 0, 1252},
-    {0x51a0d0e6, L"KozukaGothicPr6NM", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x531b3dea, L"BasemicSymbol", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x5333fd39, L"CalifornianFB-Reg",
-     L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252},
-    {0x53561a54, L"FZYTK--GBK1-0", L"STFangsong,Songti SC,STSong", 0, 936},
-    {0x55e0dde6, L"LucidaSansTypewriter", L"Menlo,Courier New,Andale Mono", 0,
-     1252},
-    {0x574d4d3d, L"AdobeArabic", L"Arial Narrow", 0, 1252},
-    {0x5792e759, L"STKaiti", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0x5921978e, L"LucidaSansUnicode", L"Lucida Grande,Arial Unicode MS,Menlo",
-     0, 1252},
-    {0x594e2da4, L"Vrinda", L"Geeza Pro,Damascus,STIXGeneral,Gill Sans", 0,
-     1252},
-    {0x59baa9a2, L"KaiTi_GB2312", L"Hiragino Sans GB,STHeiti", 0, 1252},
-    {0x5cfedf4f, L"BaskOldFace",
-     L"Avenir Next Condensed Heavy,PT Sans,Avenir Next Condensed", 0, 1252},
-    {0x5e16ac91, L"TrajanPro", L"Arial Narrow,PT Sans Narrow,Damascus", 0,
-     1252},
-    {0x5f97921c, L"AdobeMyungjoStdM",
-     L"AppleMyungjo,AppleGothic,Arial Unicode MS", 0, 936},
-    {0x5fefbfad, L"Batang", L"Arial Unicode MS,Songti SC", 2, 1252},
-    {0x605342b9, L"DotumChe", L"Arial Unicode MS,Heiti TC", 1, 1252},
-    {0x608c5f9a, L"KaiTi_GB2312", L"Hiragino Sans GB,STHeiti,Heiti TC", 0, 936},
-    {0x61efd0d1, L"MaturaMTScriptCapitals",
-     L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black,Avenir Next Heavy",
-     0, 1252},
-    {0x626608a9, L"MVBoli",
-     L"Apple Braille,Geeza Pro,Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x630501a3, L"SmallFonts", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x65d0e2a9, L"FZYTK--GBK1-0", L"STFangsong,Songti SC,STSong", 0, 936},
-    {0x669f29e1, L"FZSTK--GBK1-0", L"STHeiti,Heiti TC", 0, 936},
-    {0x673a9e5f, L"Tunga",
-     L"Damascus,STIXNonUnicode,Avenir Next Condensed,Avenir Next Condensed "
-     L"Ultra Light,Futura",
-     0, 1252},
-    {0x691aa4ce, L"NiagaraSolid", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x696259b7, L"Corbel", L"Cochin,Baskerville,Marion", 0, 1252},
-    {0x696ee9be, L"STXihei", L"STHeiti,Heiti TC,Songti SC,Arial Unicode MS", 0,
-     936},
-    {0x6c59cf69, L"Dotum", L"Arial Unicode MS,Songti SC", 0, 1252},
-    {0x707fa561, L"Gungsuh", L"Arial Unicode MS,Heiti TC", 2, 1252},
-    {0x71416bb2, L"ZWAdobeF",
-     L"STIXSizeFourSym,STIXSizeThreeSym,STIXSizeTwoSym,STIXSizeOneSym", 0,
-     1252},
-    {0x71b41801, L"Verdana",
-     L"Tahoma,Marion,Apple Symbols,.Helvetica Neue Desk UI,Lucida "
-     L"Grande,Courier New",
-     0, 1252},
-    {0x73f25e4c, L"PalatinoLinotype", L"Palatino,Arial Unicode MS", 0, 1252},
-    {0x73f4d19f, L"NiagaraEngraved", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x74001694, L"MyriadProBlack", L"Palatino,Baskerville,Marion,Cochin", 0,
-     1252},
-    {0x74b14d8f, L"Haettenschweiler", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x74cb44ee, L"NSimSun", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0x76b4d7ff, L"Shruti",
-     L"Damascus,STIXNonUnicode,Arial Unicode MS,American Typewriter", 0, 1252},
-    {0x788b3533, L"Webdings", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
-    {0x797dde99, L"MSSerif", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x7a0f9e9e, L"MSMincho",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE,Arial Unicode MS,Apple SD Gothic Neo",
-     1, 1252},
-    {0x7b439caf, L"OldEnglishTextMT",
-     L"STIXNonUnicode,Arial Unicode MS,Baskerville,Avenir Next Medium", 0,
-     1252},
-    {0x8213a433, L"LucidaSans-Typewriter",
-     L"Comic Sans MS,Avenir Next,Arial Rounded MT Bold", 0, 1252},
-    {0x82fec929, L"AdobeSongStdL", L"Heiti TC,STHeiti", 0, 936},
-    {0x83581825, L"Modern", L"Avenir Next Condensed,Impact", 0, 1252},
-    {0x835a2823, L"Algerian",
-     L"STIXNonUnicode,Baskerville,Avenir Next Medium,American Typewriter", 0,
-     1252},
-    {0x83dab9f5, L"Script", L"Arial Narrow", 0, 1252},
-    {0x847b56da, L"Tahoma", L"Songti SC,Apple Symbols", 0, 1252},
-    {0x8a783cb2, L"SimSun-PUA", L"STHeiti,Heiti TC,STFangsong", 0, 1252},
-    {0x8b5cac0e, L"Onyx", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0x8c6a499e, L"Gulim", L"Arial Unicode MS,Songti SC", 0, 1252},
-    {0x8e0af790, L"JuiceITC", L"Nadeem,Al Bayan", 0, 1252},
-    {0x8e8d43b2, L"Centaur", L"Avenir Next Condensed,Noteworthy,Impact", 2,
-     1252},
-    {0x8ee4dcca, L"BookshelfSymbol7", L"Microsoft Sans Serif,Apple Symbols", 0,
-     1252},
-    {0x90794800, L"BellGothicStdLight", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0x909b516a, L"Century", L"Damascus,Andale Mono,Songti SC,Arial Unicode MS",
-     2, 1252},
-    {0x92ae370d, L"MSOutlook", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
-    {0x93c9fbf1, L"LucidaFax",
-     L"PT Sans Narrow,Papyrus,Kokonor,Geeza Pro,Arial Rounded MT Bold,Lucida "
-     L"Grande,Futura",
-     2, 1252},
-    {0x9565085e, L"BookAntiqua", L"Palatino,Microsoft Sans Serif,Apple Symbols",
-     2, 1252},
-    {0x9856d95d, L"AdobeMingStdL", L"AHiragino Sans GB,Heiti TC,STHeiti", 0,
-     949},
-    {0x9bbadd6b, L"ColonnaMT", L"Noteworthy,Avenir Next Condensed,Impact", 0,
-     1252},
-    {0x9cbd16a4, L"ShowcardGothic-Reg",
-     L"Arial Unicode MS,Georgia,American Typewriter", 0, 1252},
-    {0x9d73008e, L"MSSansSerif", L"Songti SC,Apple Symbols", 0, 1252},
-    {0xa0607db1, L"GungsuhChe",
-     L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
-     L"PL UMing TW MBE,Arial Unicode MS,Heiti TC,STFangsong",
-     1, 1252},
-    {0xa0bcf6a1, L"LatinWide", L"Zapfino,Arial Black,STHeiti", 2, 1252},
-    {0xa1429b36, L"Symbol", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
-    {0xa1fa5abc, L"Wingdings2", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
-    {0xa1fa5abd, L"Wingdings3", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
-    {0xa427bad4, L"InformalRoman-Regular",
-     L"STIXNonUnicode,Arial Narrow,Avenir Next Condensed Demi Bold", 8, 1252},
-    {0xa8b92ece, L"FZSTK--GBK1-0", L"STHeiti,Heiti TC,STFangsong", 0, 936},
-    {0xa8d83ece, L"CalifornianFB",
-     L"American Typewriter,Avenir Next Condensed,Impact", 2, 1252},
-    {0xaa3e082c, L"Kingsoft-Phonetic",
-     L"STIXVariants,STIXSizeOneSym,Apple Braille", 0, 1252},
-    {0xaa6bcabe, L"HarlowSolidItalic",
-     L"STIXNonUnicode,Avenir Medium,Avenir Next Medium,Arial Unicode MS", 0,
-     1252},
-    {0xade5337c, L"MSUIGothic", L"Arial Unicode MS,Apple SD Gothic Neo", 0,
-     1252},
-    {0xb08dd941, L"WideLatin",
-     L"Marion,Papyrus,Nanum Pen Script,Zapf Dingbats,Damascus,Zapfino,Arial "
-     L"Black,STHeiti",
-     2, 1252},
-    {0xb12765e0, L"ITCLegacySansStdBook",
-     L"LastResort,.Helvetica Neue Desk UI,Arial Unicode MS,Palatino", 0, 1252},
-    {0xb207f05d, L"PoorRichard", L"Noteworthy,Avenir Next Condensed,Impact", 2,
-     1252},
-    {0xb3bc492f, L"JuiceITC-Regular", L"Nadeem,Al Bayan,STIXNonUnicode", 0,
-     1252},
-    {0xb5545399, L"Marlett", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
-    {0xb5dd1ebb, L"BritannicBold",
-     L"Damascus,STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252},
-    {0xb699c1c5, L"LucidaCalligraphy-Italic", L"STHeiti,Arial Black", 0, 1252},
-    {0xb725d629, L"TimesNewRoman", L"Microsoft Sans Serif,Apple Symbols", 2,
-     1252},
-    {0xb7eaebeb, L"AdobeHeitiStdR", L"Heiti TC,STHeiti", 0, 936},
-    {0xbd29c486, L"BerlinSansFBDemi-Bold",
-     L"American Typewriter,Avenir Next Condensed Heavy", 0, 1252},
-    {0xbe8a8db4, L"BookshelfSymbolSeven", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0xc16c0118, L"AdobeHebrew",
-     L".Helvetica Neue Desk UI,Palatino,American Typewriter", 0, 1252},
-    {0xc318b0af, L"MyriadProLight", L"Palatino,Baskerville,Marion", 0, 1252},
-    {0xc65e5659, L"CambriaMath", L"Arial Unicode MS", 2, 1252},
-    {0xc75c8f05, L"LucidaConsole", L"Courier New,Menlo,Andale Mono", 1, 1252},
-    {0xca7c35d6, L"Calibri", L"Apple Symbols,HeadLineA", 0, 1252},
-    {0xcb053f53, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936},
-    {0xcb7190f9, L"Magneto-Bold", L"Lucida Grande", 0, 1252},
-    {0xcca00cc5, L"System", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0xccad6f76, L"Jokerman-Regular", L"Lucida Grande", 0, 1252},
-    {0xccc5818c, L"EuroSign", L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0xcf3d7234, L"LucidaHandwriting-Italic",
-     L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0xcf7b8fdb, L"MinionPro",
-     L"Bell MT,Corbel,Times New Roman,Cambria,Berlin Sans FB", 0, 1252},
-    {0xcfe5755f, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0xd011f4ee, L"MSPGothic", L"Arial Unicode MS,Apple SD Gothic Neo", 0,
-     1252},
-    {0xd060e7ef, L"Vivaldi",
-     L"STIXNonUnicode,Arial Unicode MS,Avenir Medium,Avenir Next Medium", 8,
-     1252},
-    {0xd07edec1, L"FranklinGothic-Medium", L"Impact,Arial Narrow", 0, 1252},
-    {0xd107243f, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936},
-    {0xd1881562, L"ArialNarrow", L"PT Sans Narrow,Apple Symbols", 0, 1252},
-    {0xd22b7dce, L"BodoniMTPosterCompressed",
-     L"Microsoft Sans Serif,Apple Symbols", 0, 1252},
-    {0xd22bfa60, L"ComicSansMS",
-     L"Damascus,Georgia,.Helvetica Neue Desk UI,Lucida Grande,Arial Unicode MS",
-     8, 1252},
-    {0xd3bd0e35, L"Bauhaus93",
-     L"STIXNonUnicode,Arial Unicode MS,Avenir Next,Avenir", 0, 1252},
-    {0xd429ee7a, L"STFangsong", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0xd6679c12, L"BernardMTCondensed",
-     L"Impact,Avenir Next Condensed Demi Bold", 0, 1252},
-    {0xd8e8a027, L"LucidaSans",
-     L"Arial Narrow,Khmer MN,Kokonor,Damascus,Microsoft Sans Serif,Apple "
-     L"Symbols",
-     0, 1252},
-    {0xd9fe7761, L"HighTowerText-Reg",
-     L"STIXGeneral,.Helvetica Neue Desk UI,Trebuchet MS", 2, 1252},
-    {0xda7e551e, L"STSong", L"Arial Unicode MS", 0, 936},
-    {0xdaa6842d, L"STZhongsong", L"STFangsong,Songti SC,STSong", 0, 936},
-    {0xdaaab93f, L"STFangsong", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0xdaeb0713, L"STSong", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0xdafedbef, L"STCaiyun", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
-    {0xdb00a3d9, L"Broadway",
-     L"Papyrus,STIXNonUnicode,Arial Black,Avenir Next Heavy,Heiti TC", 0, 1252},
-    {0xdb1f5ad4, L"STXinwei", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
-    {0xdb326e7f, L"STKaiti", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0xdb69595a, L"STHupo", L"Kaiti SC,Songti SC,STHeiti", 0, 936},
-    {0xdba0082c, L"STXihei", L"Songti SC,Arial Unicode MS", 0, 936},
-    {0xdbd0ab18, L"STXingkai", L"Kaiti SC,Songti SC", 0, 936},
-    {0xdc1a7db1, L"STLiti", L"Kaiti SC,Songti SC", 0, 936},
-    {0xdc33075f, L"KristenITC-Regular",
-     L"STIXNonUnicode,Damascus,Songti SC,STSong", 8, 1252},
-    {0xdcc7009c, L"Harrington",
-     L"STIXNonUnicode,Avenir Next Condensed Heavy,Noteworthy", 0, 1252},
-    {0xdd712466, L"ArialBlack", L"Geeza Pro,Damascus,Songti SC,STSong", 0,
-     1252},
-    {0xdde87b3e, L"Impact", L"Arial Narrow,Marion", 0, 1252},
-    {0xdf69fb32, L"SnapITC",
-     L"Arial Narrow,PT Sans Narrow,Marion,STHeiti,Arial Black", 0, 1252},
-    {0xdf8b25e8, L"CenturyGothic",
-     L"Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252},
-    {0xe0f705c0, L"KristenITC", L"Songti SC,STSong", 8, 1252},
-    {0xe1427573, L"Raavi",
-     L"Damascus,STIXNonUnicode,Marion,Papyrus,Avenir Next Condensed "
-     L"Heavy,American Typewriter",
-     0, 1252},
-    {0xe2cea0cb, L"Magneto",
-     L"STIXNonUnicode,Damascus,Geeza Pro,Lucida Grande,Georgia,Heiti TC", 0,
-     1252},
-    {0xe36a9e17, L"Ravie", L"STHeiti,Arial Black", 0, 1252},
-    {0xe433f8e2, L"Parchment", L"Microsoft Sans Serif,Apple Symbols", 8, 1252},
-    {0xe43dff4a, L"Wingdings", L"Microsoft Sans Serif,Apple Symbols", 4, 42},
-    {0xe4e2c405, L"MTExtra", L"Microsoft Sans Serif,Apple Symbols", 6, 42},
-    {0xe618cc35, L"InformalRoman", L"Arial Narrow", 8, 1252},
-    {0xe6c27ffc, L"Mistral", L"Apple Symbols", 8, 1252},
-    {0xe7ebf4b9, L"Courier", L"Courier New", 0, 1252},
-    {0xe8bc4a9d, L"MSReferenceSpecialty", L"Microsoft Sans Serif,Apple Symbols",
-     0, 1252},
-    {0xe90fb013, L"TempusSansITC",
-     L"STIXNonUnicode,Microsoft Sans Serif,Avenir Light", 0, 1252},
-    {0xec637b42, L"Consolas",
-     L"AR PL UKai CN,AR PL UKai HK,AR PL UKai TW,AR PL UKai TW MBE,AR PL UMing "
-     L"CN,AR PL UMing HK,Microsoft Sans Serif,Tahoma",
-     1, 1252},
-    {0xed3a683b, L"STXinwei", L"Kaiti SC,Songti SC,", 0, 936},
-    {0xef264cd1, L"LucidaHandwriting",
-     L"Arial Narrow,Avenir Next Condensed Demi Bold,Avenir Next "
-     L"Condensed,Avenir Next Condensed Medium,STHeiti,Arial Black",
-     0, 1252},
-    {0xf086bca2, L"BaskervilleOldFace",
-     L"STIXNonUnicode,Avenir Next Condensed Heavy,PT Sans", 0, 1252},
-    {0xf1028030, L"Mangal",
-     L"Arial Unicode MS,Microsoft Sans Serif,Arial Narrow,Tahoma", 2, 1252},
-    {0xf1da7eb9, L"ShowcardGothic",
-     L"Papyrus,Arial Unicode MS,Georgia,American Typewriter", 0, 1252},
-    {0xf210f06a, L"ArialMT",
-     L"Arial Unicode MS,Arial Narrow,STIXNonUnicode,Damascus,Avenir Next "
-     L"Condensed Demi Bold,Avenir Next Condensed Medium,Avenir Next Condensed",
-     0, 1252},
-    {0xf477f16a, L"Latha",
-     L"Arial Narrow,Damascus,STIXNonUnicode,American Typewriter", 0, 1252},
-    {0xf616f3dd, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936},
-    {0xfa479aa6, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936},
-    {0xfcd19697, L"BookmanOldStyle",
-     L"Geeza Pro,Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252},
-    {0xfe209a82, L"LucidaCalligraphy",
-     L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black", 0, 1252},
-    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Heiti TC,STHeiti", 0, 936},
-};
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-static const XFA_FONTINFO g_XFAFontsMap[] = {
-    {0x01d5d33e, L"SimSun", L"Droid Sans Fallback", 0, 936},
-    {0x01e4f102, L"YouYuan", L"Droid Sans Fallback", 1, 936},
-    {0x030549dc, L"LiSu", L"Droid Sans Fallback", 1, 936},
-    {0x032edd44, L"Simhei", L"Droid Sans Fallback", 1, 936},
-    {0x03eac6fc, L"PoorRichard-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic "
-     L"Naskh,Droid Sans Ethiopic",
-     2, 1252},
-    {0x03ed90e6, L"Nina",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x077b56b3, L"KingsoftPhoneticPlain",
-     L"Droid Sans Thai,Droid Sans Armenian,Droid Arabic Naskh,Droid Sans "
-     L"Ethiopic,Droid Sans Fallback",
-     0, 1252},
-    {0x078ed524, L"MicrosoftSansSerif", L"Droid Sans Fallback", 0, 1252},
-    {0x089b18a9, L"Arial", L"Droid Sans Fallback", 0, 1252},
-    {0x0b2cad72, L"MonotypeCorsiva",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x0bb003e7, L"Kartika",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     2, 1252},
-    {0x0bb469df, L"VinerHandITC",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x0bc1a851, L"SegoeUI", L"Droid Sans Fallback", 0, 1252},
-    {0x0c112ebd, L"KozukaGothicPro-VIM",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x0cfcb9c1, L"AdobeThai",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 847},
-    {0x0e7de0f9, L"Playbill",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0x0eff47c3, L"STHupo", L"Droid Sans Fallback", 0, 936},
-    {0x107ad374, L"Constantia",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x12194c2d, L"KunstlerScript",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x135ef6a1, L"MinionProSmBd",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x158c4049, L"Garamond",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x160ecb24, L"STZhongsong", L"Droid Sans Fallback", 0, 936},
-    {0x161ed07e, L"MSGothic", L"Droid Sans Fallback", 1, 1252},
-    {0x171d1ed1, L"SnapITC-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x18d1188f, L"Cambria", L"Droid Sans Fallback", 2, 1252},
-    {0x18eaf350, L"ArialUnicodeMS", L"Droid Sans Fallback", 0, 936},
-    {0x1a92d115, L"MingLiU", L"Droid Sans Fallback", 1, 1252},
-    {0x1cc217c6, L"TrebuchetMS",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x1d649596, L"BasemicTimes",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x1e34ee60, L"BellMT",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x1eb36945, L"CooperBlack",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x1ef7787d, L"BatangChe", L"Droid Sans Fallback", 1, 1252},
-    {0x20b3bd3a, L"BrushScriptMT", L"Droid Arabic Naskh,Droid Sans Ethiopic", 8,
-     1252},
-    {0x220877aa, L"Candara",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x22135007, L"FreestyleScript-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x251059c3, L"Chiller",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252},
-    {0x25bed6dd, L"MSReferenceSansSerif", L"Droid Sans Fallback", 0, 1252},
-    {0x28154c81, L"Parchment-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x29711eb9, L"STLiti", L"Droid Sans Fallback", 0, 936},
-    {0x2b1993b4, L"Basemic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2b316339, L"NiagaraSolid-Reg",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2c147529, L"FootlightMTLight",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2c198928, L"HarlowSolid",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2c6ac6b2, L"LucidaBright",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 2, 1252},
-    {0x2c9f38e2, L"KozukaMinchoPro-VIR",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2d5a47b0, L"STCaiyun", L"Droid Sans Fallback", 0, 936},
-    {0x2def26bf, L"BernardMT-Condensed",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x2fd8930b, L"KozukaMinchoPr6NR",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x3115525a, L"FangSong_GB2312", L"Droid Sans Fallback", 0, 1252},
-    {0x31327817, L"MyriadPro",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x32244975, L"Helvetica",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252},
-    {0x32ac995c, L"Terminal",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x338d648a, L"NiagaraEngraved-Reg",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x33bb65f2, L"Sylfaen",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x3402c30e, L"MSPMincho", L"Droid Sans Fallback", 2, 1252},
-    {0x3412bf31, L"SimSun-PUA", L"Droid Sans Fallback", 0, 936},
-    {0x36eb39b9, L"BerlinSansFB",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x36f42055, L"UniversATT", L"Microsoft Sans Serif", 0, 1252},
-    {0x3864c4f6, L"HighTowerText",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x3a257d03, L"FangSong_GB2312", L"Droid Sans Fallback", 0, 1252},
-    {0x3cdae668, L"FreestyleScript",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x3d55aed7, L"Jokerman",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x3d5b4385, L"PMingLiU", L"Droid Sans Fallback", 2, 1252},
-    {0x3d9b7669, L"EstrangeloEdessa",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x3e532d74, L"FranklinGothicMedium",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x3e6aa32d, L"NSimSun", L"Droid Sans Fallback", 1, 936},
-    {0x3f6c36a8, L"Gautami",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono,Droid Sans Fallback",
-     0, 1252},
-    {0x3ff32662, L"Chiller-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x409de312, L"ModernNo.20",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x41443c5e, L"Georgia",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x4160ade5, L"BellGothicStdBlack",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x421976c4, L"Modern-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x422a7252, L"Stencil",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x42c8554f, L"Fixedsys",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x435cb41d, L"Roman",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x47882383, L"CourierNew", L"Droid Sans Fallback", 1, 1252},
-    {0x480a2338, L"BerlinSansFBDemi",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x480bf7a4, L"CourierStd", L"Droid Sans Fallback", 0, 1252},
-    {0x481ad6ed, L"VladimirScript",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0x4911577a, L"YouYuan", L"Droid Sans Fallback", 1, 936},
-    {0x4a788d72, L"STXingkai", L"Droid Sans Fallback", 0, 936},
-    {0x4bf88566, L"SegoeCondensed",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x4ccf51a4, L"BerlinSansFB-Reg",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x4ea967ce, L"GulimChe", L"Droid Sans Fallback", 1, 1252},
-    {0x4f68bd79, L"LetterGothicStd",
-     L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic,Droid Sans "
-     L"Mono,Droid Serif,Droid Sans Fallback",
-     0, 1252},
-    {0x51a0d0e6, L"KozukaGothicPr6NM",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x531b3dea, L"BasemicSymbol",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x5333fd39, L"CalifornianFB-Reg",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x53561a54, L"FZYTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
-    {0x55e0dde6, L"LucidaSansTypewriter",
-     L"Droid Sans Mono,Droid Arabic Naskh,Droid Sans Ethiopic", 0, 1252},
-    {0x574d4d3d, L"AdobeArabic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x5792e759, L"STKaiti", L"Droid Sans Fallback", 0, 936},
-    {0x5921978e, L"LucidaSansUnicode", L"Droid Sans Fallback", 0, 1252},
-    {0x594e2da4, L"Vrinda",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0x59baa9a2, L"KaiTi_GB2312", L"Droid Sans Fallback", 0, 1252},
-    {0x5cfedf4f, L"BaskOldFace",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x5f97921c, L"AdobeMyungjoStdM", L"Droid Sans Fallback", 0, 936},
-    {0x5fefbfad, L"Batang", L"Droid Sans Fallback", 2, 1252},
-    {0x605342b9, L"DotumChe", L"Droid Sans Fallback", 1, 1252},
-    {0x608c5f9a, L"KaiTi_GB2312", L"Droid Sans Fallback", 0, 936},
-    {0x61efd0d1, L"MaturaMTScriptCapitals",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0x626608a9, L"MVBoli",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0x630501a3, L"SmallFonts",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x65d0e2a9, L"FZYTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
-    {0x669f29e1, L"FZSTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
-    {0x673a9e5f, L"Tunga",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono,Droid Sans Fallback",
-     0, 1252},
-    {0x691aa4ce, L"NiagaraSolid",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x696259b7, L"Corbel",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x696ee9be, L"STXihei", L"Droid Sans Fallback", 0, 936},
-    {0x6c59cf69, L"Dotum", L"Droid Sans Fallback", 0, 1252},
-    {0x707fa561, L"Gungsuh", L"Droid Sans Fallback", 2, 1252},
-    {0x71416bb2, L"ZWAdobeF",
-     L"Droid Arabic Naskh,Droid Sans Armenian,Droid Sans Ethiopic,Droid Sans "
-     L"Georgian,Droid Sans Hebrew,Droid Sans Thai",
-     0, 1252},
-    {0x71b41801, L"Verdana",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x73f25e4c, L"PalatinoLinotype", L"Droid Sans Fallback", 0, 1252},
-    {0x73f4d19f, L"NiagaraEngraved",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x74001694, L"MyriadProBlack", L"Book Antiqua,Constantia,Dotum,Georgia", 0,
-     1252},
-    {0x74b14d8f, L"Haettenschweiler",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x74cb44ee, L"NSimSun", L"Droid Sans Fallback", 1, 936},
-    {0x76b4d7ff, L"Shruti",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0x788b3533, L"Webdings",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
-    {0x797dde99, L"MSSerif",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x7a0f9e9e, L"MSMincho", L"Droid Sans Fallback", 1, 1252},
-    {0x7b439caf, L"OldEnglishTextMT",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x8213a433, L"LucidaSans-Typewriter",
-     L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 0, 1252},
-    {0x82fec929, L"AdobeSongStdL", L"Droid Sans Fallback", 0, 936},
-    {0x83581825, L"Modern",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x835a2823, L"Algerian",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x83dab9f5, L"Script",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x847b56da, L"Tahoma", L"Droid Sans Fallback", 0, 1252},
-    {0x8a783cb2, L"SimSun-PUA", L"Droid Sans Fallback", 0, 1252},
-    {0x8b5cac0e, L"Onyx",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x8c6a499e, L"Gulim", L"Droid Sans Fallback", 0, 1252},
-    {0x8e0af790, L"JuiceITC",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x8e8d43b2, L"Centaur",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x8ee4dcca, L"BookshelfSymbol7",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x90794800, L"BellGothicStdLight",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x909b516a, L"Century",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x92ae370d, L"MSOutlook",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
-    {0x93c9fbf1, L"LucidaFax",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     2, 1252},
-    {0x9565085e, L"BookAntiqua",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0x9856d95d, L"AdobeMingStdL", L"Droid Sans Fallback", 0, 949},
-    {0x9bbadd6b, L"ColonnaMT",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0x9cbd16a4, L"ShowcardGothic-Reg",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252},
-    {0x9d73008e, L"MSSansSerif",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xa0607db1, L"GungsuhChe", L"Droid Sans Fallback", 1, 1252},
-    {0xa0bcf6a1, L"LatinWide",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0xa1429b36, L"Symbol",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
-    {0xa1fa5abc, L"Wingdings2",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
-    {0xa1fa5abd, L"Wingdings3",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
-    {0xa427bad4, L"InformalRoman-Regular",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic", 8, 1252},
-    {0xa8b92ece, L"FZSTK--GBK1-0", L"Droid Sans Fallback", 0, 936},
-    {0xa8d83ece, L"CalifornianFB",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0xaa3e082c, L"Kingsoft-Phonetic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xaa6bcabe, L"HarlowSolidItalic",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xade5337c, L"MSUIGothic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xb08dd941, L"WideLatin",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     2, 1252},
-    {0xb207f05d, L"PoorRichard",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0xb3bc492f, L"JuiceITC-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xb5545399, L"Marlett",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
-    {0xb5dd1ebb, L"BritannicBold", L"Droid Arabic Naskh,Droid Sans Ethiopic", 0,
-     1252},
-    {0xb699c1c5, L"LucidaCalligraphy-Italic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xb725d629, L"TimesNewRoman", L"Droid Sans Fallback", 2, 1252},
-    {0xb7eaebeb, L"AdobeHeitiStdR", L"Droid Sans Fallback", 0, 936},
-    {0xbd29c486, L"BerlinSansFBDemi-Bold",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xbe8a8db4, L"BookshelfSymbolSeven",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xc16c0118, L"AdobeHebrew",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic "
-     L"Naskh,Droid Sans Ethiopic",
-     0, 1252},
-    {0xc318b0af, L"MyriadProLight",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xc65e5659, L"CambriaMath", L"Droid Sans Fallback", 2, 1252},
-    {0xc75c8f05, L"LucidaConsole",
-     L"Droid Sans Mono,Droid Serif,Roboto,Droid Sans Fallback", 1, 1252},
-    {0xca7c35d6, L"Calibri", L"Droid Sans Fallback", 0, 1252},
-    {0xcb053f53, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936},
-    {0xcb7190f9, L"Magneto-Bold",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xcca00cc5, L"System",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xccad6f76, L"Jokerman-Regular",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xccc5818c, L"EuroSign",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xcf3d7234, L"LucidaHandwriting-Italic",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xcf7b8fdb, L"MinionPro",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xcfe5755f, L"Simhei", L"Droid Sans Fallback", 1, 936},
-    {0xd011f4ee, L"MSPGothic", L"Droid Sans Fallback", 0, 1252},
-    {0xd060e7ef, L"Vivaldi",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0xd07edec1, L"FranklinGothic-Medium",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xd107243f, L"SimSun", L"Droid Sans Fallback", 0, 936},
-    {0xd1881562, L"ArialNarrow",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xd22b7dce, L"BodoniMTPosterCompressed",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xd22bfa60, L"ComicSansMS", L"Droid Serif,Roboto,Droid Sans Fallback", 8,
-     1252},
-    {0xd3bd0e35, L"Bauhaus93",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xd429ee7a, L"STFangsong", L"Droid Sans Fallback", 0, 936},
-    {0xd6679c12, L"BernardMTCondensed",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xd8e8a027, L"LucidaSans",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 0, 1252},
-    {0xd9fe7761, L"HighTowerText-Reg",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 2, 1252},
-    {0xda7e551e, L"STSong", L"Droid Sans Fallback", 0, 936},
-    {0xdaa6842d, L"STZhongsong", L"Droid Sans Fallback", 0, 936},
-    {0xdaaab93f, L"STFangsong", L"Droid Sans Fallback", 0, 936},
-    {0xdaeb0713, L"STSong",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 936},
-    {0xdafedbef, L"STCaiyun", L"Droid Sans Fallback", 0, 936},
-    {0xdb00a3d9, L"Broadway",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xdb1f5ad4, L"STXinwei", L"Droid Sans Fallback", 0, 936},
-    {0xdb326e7f, L"STKaiti", L"Droid Sans Fallback", 0, 936},
-    {0xdb69595a, L"STHupo", L"Droid Sans Fallback", 0, 936},
-    {0xdba0082c, L"STXihei", L"Droid Sans Fallback", 0, 936},
-    {0xdbd0ab18, L"STXingkai", L"Droid Sans Fallback", 0, 936},
-    {0xdc1a7db1, L"STLiti", L"Droid Sans Fallback", 0, 936},
-    {0xdc33075f, L"KristenITC-Regular",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252},
-    {0xdcc7009c, L"Harrington",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xdd712466, L"ArialBlack",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xdde87b3e, L"Impact",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xdf69fb32, L"SnapITC",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xdf8b25e8, L"CenturyGothic",
-     L"Droid Serif,Roboto,Droid Serif,Droid Sans Mono", 0, 1252},
-    {0xe0f705c0, L"KristenITC",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto", 8, 1252},
-    {0xe1427573, L"Raavi",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xe2cea0cb, L"Magneto",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xe36a9e17, L"Ravie",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xe433f8e2, L"Parchment",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0xe43dff4a, L"Wingdings",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 4, 42},
-    {0xe4e2c405, L"MTExtra",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 6, 42},
-    {0xe618cc35, L"InformalRoman",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 8, 1252},
-    {0xe6c27ffc, L"Mistral",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 8, 1252},
-    {0xe7ebf4b9, L"Courier", L"Droid Sans Fallback", 0, 1252},
-    {0xe8bc4a9d, L"MSReferenceSpecialty",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xe90fb013, L"TempusSansITC",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xec637b42, L"Consolas", L"Droid Sans Fallback", 1, 1252},
-    {0xed3a683b, L"STXinwei", L"Droid Sans Fallback", 0, 936},
-    {0xef264cd1, L"LucidaHandwriting",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xf086bca2, L"BaskervilleOldFace",
-     L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xf1028030, L"Mangal",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     2, 1252},
-    {0xf1da7eb9, L"ShowcardGothic",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallbac", 0, 1252},
-    {0xf210f06a, L"ArialMT",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif", 0, 1252},
-    {0xf477f16a, L"Latha",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Roboto,Droid Serif,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xf616f3dd, L"LiSu", L"Droid Sans Fallback", 1, 936},
-    {0xfa479aa6, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936},
-    {0xfcd19697, L"BookmanOldStyle",
-     L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252},
-    {0xfe209a82, L"LucidaCalligraphy",
-     L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans "
-     L"Mono",
-     0, 1252},
-    {0xfef135f8, L"AdobeHeitiStd-Regular", L"Droid Sans Fallback", 0, 936},
-};
-#endif
-void XFA_LocalFontNameToEnglishName(const CFX_WideStringC& wsLocalName,
-                                    CFX_WideString& wsEnglishName) {
-  wsEnglishName = wsLocalName;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ ||   \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ||   \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-  FX_DWORD dwLocalNameHash = FX_HashCode_String_GetW(
-      wsLocalName.GetPtr(), wsLocalName.GetLength(), TRUE);
-  int32_t iStart = 0;
-  int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
-  int32_t iMid = 0;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
-    if (dwFontNameHash == dwLocalNameHash) {
-      wsEnglishName = g_XFAFontsMap[iMid].pPsName;
-      break;
-    } else if (dwFontNameHash < dwLocalNameHash) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iEnd >= iStart);
-#endif
-}
-const XFA_FONTINFO* XFA_GetFontINFOByFontName(
-    const CFX_WideStringC& wsFontName) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ ||   \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ||   \
-    _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-  CFX_WideString wsFontNameTemp = wsFontName;
-  wsFontNameTemp.Remove(L' ');
-  FX_DWORD dwCurFontNameHash =
-      FX_HashCode_String_GetW(wsFontNameTemp, wsFontNameTemp.GetLength(), TRUE);
-  int32_t iStart = 0;
-  int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
-  int32_t iMid = 0;
-  const XFA_FONTINFO* pFontInfo = NULL;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    FX_DWORD dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
-    if (dwFontNameHash == dwCurFontNameHash) {
-      pFontInfo = &g_XFAFontsMap[iMid];
-      break;
-    } else if (dwFontNameHash < dwCurFontNameHash) {
-      iStart = iMid + 1;
-    } else {
-      iEnd = iMid - 1;
-    }
-  } while (iEnd >= iStart);
-  return pFontInfo;
-#else
-  return NULL;
-#endif
-}
-// static
-IXFA_FontMgr* IXFA_FontMgr::CreateDefault() {
-  return new CXFA_DefFontMgr;
-}
-// virtual
-IXFA_FontMgr::~IXFA_FontMgr() {}
-CXFA_DefFontMgr::~CXFA_DefFontMgr() {
-  int32_t iCounts = m_CacheFonts.GetSize();
-  for (int32_t i = 0; i < iCounts; i++) {
-    ((IFX_Font*)m_CacheFonts[i])->Release();
-  }
-  m_CacheFonts.RemoveAll();
-}
-
-IFX_Font* CXFA_DefFontMgr::GetFont(IXFA_Doc* hDoc,
-                                   const CFX_WideStringC& wsFontFamily,
-                                   FX_DWORD dwFontStyles,
-                                   FX_WORD wCodePage) {
-  CFX_WideString wsFontName = wsFontFamily;
-  IFX_FontMgr* pFDEFontMgr =
-      static_cast<CXFA_FFDoc*>(hDoc)->GetApp()->GetFDEFontMgr();
-  IFX_Font* pFont = pFDEFontMgr->LoadFont(wsFontName, dwFontStyles, wCodePage);
-  if (!pFont) {
-    const XFA_FONTINFO* pCurFont = XFA_GetFontINFOByFontName(wsFontName);
-    if (pCurFont && pCurFont->pReplaceFont) {
-      FX_DWORD dwStyle = 0;
-      if (dwFontStyles & FX_FONTSTYLE_Bold) {
-        dwStyle |= FX_FONTSTYLE_Bold;
-      }
-      if (dwFontStyles & FX_FONTSTYLE_Italic) {
-        dwStyle |= FX_FONTSTYLE_Italic;
-      }
-      const FX_WCHAR* pReplace = pCurFont->pReplaceFont;
-      int32_t iLength = FXSYS_wcslen(pReplace);
-      while (iLength > 0) {
-        const FX_WCHAR* pNameText = pReplace;
-        while (*pNameText != L',' && iLength > 0) {
-          pNameText++;
-          iLength--;
-        }
-        CFX_WideString wsReplace =
-            CFX_WideString(pReplace, pNameText - pReplace);
-        pFont = pFDEFontMgr->LoadFont(wsReplace, dwStyle, wCodePage);
-        if (pFont) {
-          break;
-        }
-        iLength--;
-        pNameText++;
-        pReplace = pNameText;
-      }
-    }
-  }
-  if (pFont) {
-    m_CacheFonts.Add(pFont);
-  }
-  return pFont;
-}
-
-IFX_Font* CXFA_DefFontMgr::GetDefaultFont(IXFA_Doc* hDoc,
-                                          const CFX_WideStringC& wsFontFamily,
-                                          FX_DWORD dwFontStyles,
-                                          FX_WORD wCodePage) {
-  IFX_FontMgr* pFDEFontMgr = ((CXFA_FFDoc*)hDoc)->GetApp()->GetFDEFontMgr();
-  IFX_Font* pFont =
-      pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage);
-  if (!pFont)
-    pFont =
-        pFDEFontMgr->LoadFont((const FX_WCHAR*)NULL, dwFontStyles, wCodePage);
-  FXSYS_assert(pFont);
-  if (pFont) {
-    m_CacheFonts.Add(pFont);
-  }
-  return pFont;
-}
-struct XFA_PDFFONTNAME {
-  const FX_CHAR* lpPsName;
-  const FX_CHAR* lpNormal;
-  const FX_CHAR* lpBold;
-  const FX_CHAR* lpItalic;
-  const FX_CHAR* lpBoldItalic;
-};
-const XFA_PDFFONTNAME g_XFAPDFFontName[] = {
-    {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"},
-    {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold",
-     "MyriadPro-LightIt", "MyriadPro-SemiboldIt"},
-};
-CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) {
-  m_pDoc = pDoc;
-}
-CXFA_PDFFontMgr::~CXFA_PDFFontMgr() {
-  m_FDE2PDFFont.RemoveAll();
-  for (const auto& pair : m_FontMap) {
-    if (pair.second)
-      pair.second->Release();
-  }
-}
-IFX_Font* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName,
-                                    FX_BOOL bBold,
-                                    FX_BOOL bItalic,
-                                    CPDF_Font** pDstPDFFont,
-                                    FX_BOOL bStrictMatch) {
-  CPDF_Document* pDoc = m_pDoc->GetPDFDoc();
-  if (pDoc == NULL) {
-    return NULL;
-  }
-  CPDF_Dictionary* pFontSetDict =
-      pDoc->GetRoot()->GetDictBy("AcroForm")->GetDictBy("DR");
-  if (!pFontSetDict) {
-    return NULL;
-  }
-  pFontSetDict = (CPDF_Dictionary*)pFontSetDict->GetDictBy("Font");
-  if (!pFontSetDict) {
-    return NULL;
-  }
-  strPsName.Remove(' ');
-  IFX_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr();
-  for (const auto& it : *pFontSetDict) {
-    const CFX_ByteString& key = it.first;
-    CPDF_Object* pObj = it.second;
-    if (!PsNameMatchDRFontName(strPsName, bBold, bItalic, key, bStrictMatch)) {
-      continue;
-    }
-    CPDF_Object* pDirect = pObj->GetDirect();
-    if (!pDirect || !pDirect->IsDictionary()) {
-      return NULL;
-    }
-    CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)pDirect;
-    if (pFontDict->GetStringBy("Type") != "Font") {
-      return NULL;
-    }
-    CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict);
-    if (!pPDFFont) {
-      return NULL;
-    }
-    if (!pPDFFont->IsEmbedded()) {
-      *pDstPDFFont = pPDFFont;
-      return NULL;
-    }
-    return IFX_Font::LoadFont(&pPDFFont->m_Font, pFDEFontMgr);
-  }
-  return NULL;
-}
-IFX_Font* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily,
-                                   FX_DWORD dwFontStyles,
-                                   CPDF_Font** pPDFFont,
-                                   FX_BOOL bStrictMatch) {
-  FX_DWORD dwHashCode =
-      FX_HashCode_String_GetW(wsFontFamily.GetPtr(), wsFontFamily.GetLength());
-  CFX_ByteString strKey;
-  strKey.Format("%u%u", dwHashCode, dwFontStyles);
-  auto it = m_FontMap.find(strKey);
-  if (it != m_FontMap.end())
-    return it->second;
-  CFX_ByteString bsPsName = CFX_ByteString::FromUnicode(wsFontFamily);
-  FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
-  FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
-  CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic);
-  IFX_Font* pFont =
-      FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch);
-  if (pFont)
-    m_FontMap[strKey] = pFont;
-  return pFont;
-}
-CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName(
-    const CFX_ByteString& strPsName,
-    FX_BOOL bBold,
-    FX_BOOL bItalic) {
-  int32_t nCount = sizeof(g_XFAPDFFontName) / sizeof(XFA_PDFFONTNAME);
-  for (int32_t i = 0; i < nCount; i++) {
-    if (strPsName == g_XFAPDFFontName[i].lpPsName) {
-      int32_t index = 1 + ((bItalic << 1) | bBold);
-      return *(&g_XFAPDFFontName[i].lpPsName + index);
-    }
-  }
-  return strPsName;
-}
-FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(
-    const CFX_ByteStringC& bsPsName,
-    FX_BOOL bBold,
-    FX_BOOL bItalic,
-    const CFX_ByteString& bsDRFontName,
-    FX_BOOL bStrictMatch) {
-  CFX_ByteString bsDRName = bsDRFontName;
-  bsDRName.Remove('-');
-  int32_t iPsLen = bsPsName.GetLength();
-  int32_t nIndex = bsDRName.Find(bsPsName);
-  if (nIndex != -1 && !bStrictMatch) {
-    return TRUE;
-  }
-  if (nIndex != 0) {
-    return FALSE;
-  }
-  int32_t iDifferLength = bsDRName.GetLength() - iPsLen;
-  if (iDifferLength > 1 || (bBold || bItalic)) {
-    int32_t iBoldIndex = bsDRName.Find("Bold");
-    FX_BOOL bBoldFont = iBoldIndex > 0;
-    if (bBold ^ bBoldFont) {
-      return FALSE;
-    }
-    if (bBoldFont) {
-      iDifferLength =
-          std::min(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4);
-    }
-    FX_BOOL bItalicFont = TRUE;
-    if (bsDRName.Find("Italic") > 0) {
-      iDifferLength -= 6;
-    } else if (bsDRName.Find("It") > 0) {
-      iDifferLength -= 2;
-    } else if (bsDRName.Find("Oblique") > 0) {
-      iDifferLength -= 7;
-    } else {
-      bItalicFont = FALSE;
-    }
-    if (bItalic ^ bItalicFont) {
-      return FALSE;
-    }
-    if (iDifferLength > 1) {
-      CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength);
-      if (bsDRTailer.Equal("MT") || bsDRTailer.Equal("PSMT") ||
-          bsDRTailer.Equal("Regular") || bsDRTailer.Equal("Reg")) {
-        return TRUE;
-      }
-      if (bBoldFont || bItalicFont) {
-        return FALSE;
-      }
-      FX_BOOL bMatch = FALSE;
-      switch (bsPsName.GetAt(iPsLen - 1)) {
-        case 'L': {
-          if (bsDRName.Right(5).Equal("Light")) {
-            bMatch = TRUE;
-          }
-        } break;
-        case 'R': {
-          if (bsDRName.Right(7).Equal("Regular") ||
-              bsDRName.Right(3).Equal("Reg")) {
-            bMatch = TRUE;
-          }
-        } break;
-        case 'M': {
-          if (bsDRName.Right(5).Equal("Medium")) {
-            bMatch = TRUE;
-          }
-        } break;
-        default:
-          break;
-      }
-      return bMatch;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_PDFFontMgr::GetCharWidth(IFX_Font* pFont,
-                                      FX_WCHAR wUnicode,
-                                      int32_t& iWidth,
-                                      FX_BOOL bCharCode) {
-  if (wUnicode != 0x20 || bCharCode) {
-    return FALSE;
-  }
-  CPDF_Font* pPDFFont = (CPDF_Font*)m_FDE2PDFFont.GetValueAt(pFont);
-  if (!pPDFFont) {
-    return FALSE;
-  }
-  wUnicode = (FX_WCHAR)pPDFFont->CharCodeFromUnicode(wUnicode);
-  iWidth = pPDFFont->GetCharWidthF(wUnicode);
-  return TRUE;
-}
-CXFA_FontMgr::CXFA_FontMgr() : m_pDefFontMgr(NULL) {}
-CXFA_FontMgr::~CXFA_FontMgr() {
-  DelAllMgrMap();
-}
-IFX_Font* CXFA_FontMgr::GetFont(IXFA_Doc* hDoc,
-                                const CFX_WideStringC& wsFontFamily,
-                                FX_DWORD dwFontStyles,
-                                FX_WORD wCodePage) {
-  FX_DWORD dwHash = FX_HashCode_String_GetW(wsFontFamily.GetPtr(),
-                                            wsFontFamily.GetLength(), FALSE);
-  CFX_ByteString bsKey;
-  bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage);
-  auto it = m_FontMap.find(bsKey);
-  if (it != m_FontMap.end())
-    return it->second;
-  CFX_WideString wsEnglishName;
-  XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName);
-  CXFA_PDFFontMgr* pMgr = (CXFA_PDFFontMgr*)m_PDFFontMgrArray.GetValueAt(hDoc);
-  CPDF_Font* pPDFFont = NULL;
-  IFX_Font* pFont = NULL;
-  if (pMgr) {
-    pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont);
-    if (pFont)
-      return pFont;
-  }
-  if (!pFont && m_pDefFontMgr) {
-    pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage);
-  }
-  if (!pFont && pMgr) {
-    pPDFFont = NULL;
-    pFont = pMgr->GetFont(wsEnglishName, dwFontStyles, &pPDFFont, FALSE);
-    if (pFont)
-      return pFont;
-  }
-  if (!pFont && m_pDefFontMgr) {
-    pFont = m_pDefFontMgr->GetDefaultFont(hDoc, wsFontFamily, dwFontStyles,
-                                          wCodePage);
-  }
-  if (pFont) {
-    if (pPDFFont) {
-      pMgr->m_FDE2PDFFont.SetAt(pFont, pPDFFont);
-      pFont->SetFontProvider(pMgr);
-    }
-    m_FontMap[bsKey] = pFont;
-  }
-  return pFont;
-}
-void CXFA_FontMgr::LoadDocFonts(IXFA_Doc* hDoc) {
-  if (!m_PDFFontMgrArray.GetValueAt(hDoc)) {
-    m_PDFFontMgrArray.SetAt(hDoc, new CXFA_PDFFontMgr((CXFA_FFDoc*)hDoc));
-  }
-}
-void CXFA_FontMgr::ReleaseDocFonts(IXFA_Doc* hDoc) {
-  CXFA_PDFFontMgr* pMgr = NULL;
-  if (m_PDFFontMgrArray.Lookup(hDoc, (void*&)pMgr)) {
-    delete pMgr;
-    m_PDFFontMgrArray.RemoveKey(hDoc);
-  }
-}
-void CXFA_FontMgr::DelAllMgrMap() {
-  FX_POSITION ps = m_PDFFontMgrArray.GetStartPosition();
-  while (ps) {
-    IXFA_Doc* hDoc = NULL;
-    CXFA_PDFFontMgr* pMgr = NULL;
-    m_PDFFontMgrArray.GetNextAssoc(ps, (void*&)hDoc, (void*&)pMgr);
-    delete pMgr;
-  }
-  m_PDFFontMgrArray.RemoveAll();
-  m_FontMap.clear();
-}
-void CXFA_FontMgr::SetDefFontMgr(IXFA_FontMgr* pFontMgr) {
-  m_pDefFontMgr = pFontMgr;
-}
diff --git a/xfa/src/fxfa/app/xfa_fontmgr.h b/xfa/src/fxfa/app/xfa_fontmgr.h
deleted file mode 100644
index c77e96d..0000000
--- a/xfa/src/fxfa/app/xfa_fontmgr.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FONTMGR_H_
-#define XFA_SRC_FXFA_APP_XFA_FONTMGR_H_
-
-#include <map>
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fgas/font/fgas_font.h"
-
-class CPDF_Font;
-
-struct XFA_FONTINFO {
-  FX_DWORD dwFontNameHash;
-  const FX_WCHAR* pPsName;
-  const FX_WCHAR* pReplaceFont;
-  FX_WORD dwStyles;
-  FX_WORD wCodePage;
-};
-
-class CXFA_DefFontMgr : public IXFA_FontMgr {
- public:
-  CXFA_DefFontMgr() {}
-  ~CXFA_DefFontMgr() override;
-
-  // IXFA_FontMgr:
-  IFX_Font* GetFont(IXFA_Doc* hDoc,
-                    const CFX_WideStringC& wsFontFamily,
-                    FX_DWORD dwFontStyles,
-                    FX_WORD wCodePage = 0xFFFF) override;
-  IFX_Font* GetDefaultFont(IXFA_Doc* hDoc,
-                           const CFX_WideStringC& wsFontFamily,
-                           FX_DWORD dwFontStyles,
-                           FX_WORD wCodePage = 0xFFFF) override;
-
- protected:
-  CFX_PtrArray m_CacheFonts;
-};
-
-class CXFA_PDFFontMgr : public IFX_FontProvider {
- public:
-  CXFA_PDFFontMgr(CXFA_FFDoc* pDoc);
-  ~CXFA_PDFFontMgr();
-  IFX_Font* GetFont(const CFX_WideStringC& wsFontFamily,
-                    FX_DWORD dwFontStyles,
-                    CPDF_Font** pPDFFont,
-                    FX_BOOL bStrictMatch = TRUE);
-  FX_BOOL GetCharWidth(IFX_Font* pFont,
-                       FX_WCHAR wUnicode,
-                       int32_t& iWidth,
-                       FX_BOOL bCharCode);
-  CFX_MapPtrToPtr m_FDE2PDFFont;
-
- protected:
-  IFX_Font* FindFont(CFX_ByteString strFamilyName,
-                     FX_BOOL bBold,
-                     FX_BOOL bItalic,
-                     CPDF_Font** pPDFFont,
-                     FX_BOOL bStrictMatch = TRUE);
-  CFX_ByteString PsNameToFontName(const CFX_ByteString& strPsName,
-                                  FX_BOOL bBold,
-                                  FX_BOOL bItalic);
-  FX_BOOL PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName,
-                                FX_BOOL bBold,
-                                FX_BOOL bItalic,
-                                const CFX_ByteString& bsDRFontName,
-                                FX_BOOL bStrictMatch = TRUE);
-
-  CXFA_FFDoc* m_pDoc;
-  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
-};
-
-class CXFA_FontMgr {
- public:
-  CXFA_FontMgr();
-  ~CXFA_FontMgr();
-  IFX_Font* GetFont(IXFA_Doc* hDoc,
-                    const CFX_WideStringC& wsFontFamily,
-                    FX_DWORD dwFontStyles,
-                    FX_WORD wCodePage = 0xFFFF);
-  void LoadDocFonts(IXFA_Doc* hDoc);
-  void ReleaseDocFonts(IXFA_Doc* hDoc);
-
-  void SetDefFontMgr(IXFA_FontMgr* pFontMgr);
-
- protected:
-  void DelAllMgrMap();
-
-  CFX_MapPtrToPtr m_PDFFontMgrArray;
-  IXFA_FontMgr* m_pDefFontMgr;
-  std::map<CFX_ByteString, IFX_Font*> m_FontMap;
-};
-
-#endif  //  XFA_SRC_FXFA_APP_XFA_FONTMGR_H_
diff --git a/xfa/src/fxfa/app/xfa_fwladapter.cpp b/xfa/src/fxfa/app/xfa_fwladapter.cpp
deleted file mode 100644
index a43cd9c..0000000
--- a/xfa/src/fxfa/app/xfa_fwladapter.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fwladapter.h"
-
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_fffield.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-void FWL_PostMessageToMainRoop(CFWL_Message* pMessage) {}
-FX_BOOL FWL_ShowCaret(IFWL_Widget* pWidget,
-                      FX_BOOL bVisible,
-                      const CFX_RectF* pRtAnchor) {
-  CXFA_FFWidget* pXFAWidget = (CXFA_FFWidget*)pWidget->GetPrivateData(pWidget);
-  if (!pXFAWidget) {
-    return FALSE;
-  }
-  IXFA_DocProvider* pDocProvider = pXFAWidget->GetDoc()->GetDocProvider();
-  if (!pDocProvider) {
-    return FALSE;
-  }
-  if (bVisible) {
-    CFX_Matrix mt;
-    pXFAWidget->GetRotateMatrix(mt);
-    CFX_RectF rt(*pRtAnchor);
-    mt.TransformRect(rt);
-    pDocProvider->DisplayCaret(pXFAWidget, bVisible, &rt);
-    return TRUE;
-  }
-  pDocProvider->DisplayCaret(pXFAWidget, bVisible, pRtAnchor);
-  return TRUE;
-}
-
-FWL_ERR CXFA_FWLAdapterWidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
-                                                const CFX_RectF* pRect) {
-  if (!pWidget)
-    return FWL_ERR_Indefinite;
-  CXFA_FFField* pField = (CXFA_FFField*)pWidget->GetPrivateData(pWidget);
-  if (!pField)
-    return FWL_ERR_Indefinite;
-  pField->AddInvalidateRect(nullptr);
-  return FWL_ERR_Succeeded;
-}
-
-FX_BOOL CXFA_FWLAdapterWidgetMgr::GetPopupPos(IFWL_Widget* pWidget,
-                                              FX_FLOAT fMinHeight,
-                                              FX_FLOAT fMaxHeight,
-                                              const CFX_RectF& rtAnchor,
-                                              CFX_RectF& rtPopup) {
-  CXFA_FFWidget* pFFWidget = (CXFA_FFWidget*)(pWidget->GetPrivateData(pWidget));
-  CFX_Matrix mt;
-  pFFWidget->GetRotateMatrix(mt);
-  CFX_RectF rtRotateAnchor(rtAnchor);
-  mt.TransformRect(rtRotateAnchor);
-  pFFWidget->GetDoc()->GetDocProvider()->GetPopupPos(
-      pFFWidget, fMinHeight, fMaxHeight, rtRotateAnchor, rtPopup);
-  return TRUE;
-}
diff --git a/xfa/src/fxfa/app/xfa_fwladapter.h b/xfa/src/fxfa/app/xfa_fwladapter.h
deleted file mode 100644
index daa8413..0000000
--- a/xfa/src/fxfa/app/xfa_fwladapter.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FWLADAPTER_H_
-#define XFA_SRC_FXFA_APP_XFA_FWLADAPTER_H_
-
-#include "xfa/include/fwl/adapter/fwl_sdadapterimp.h"
-
-class CXFA_FWLAdapterWidgetMgr : public CFWL_SDAdapterWidgetMgr {
- public:
-  virtual FWL_ERR RepaintWidget(IFWL_Widget* pWidget, const CFX_RectF* pRect);
-  virtual FX_BOOL GetPopupPos(IFWL_Widget* pWidget,
-                              FX_FLOAT fMinHeight,
-                              FX_FLOAT fMaxHeight,
-                              const CFX_RectF& rtAnchor,
-                              CFX_RectF& rtPopup);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FWLADAPTER_H_
diff --git a/xfa/src/fxfa/app/xfa_fwltheme.cpp b/xfa/src/fxfa/app/xfa_fwltheme.cpp
deleted file mode 100644
index e13917b..0000000
--- a/xfa/src/fxfa/app/xfa_fwltheme.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_fwltheme.h"
-
-#include "xfa/include/fwl/basewidget/fwl_barcode.h"
-#include "xfa/include/fwl/basewidget/fwl_caret.h"
-#include "xfa/include/fwl/basewidget/fwl_checkbox.h"
-#include "xfa/include/fwl/basewidget/fwl_combobox.h"
-#include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
-#include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fwl/basewidget/fwl_listbox.h"
-#include "xfa/include/fwl/basewidget/fwl_monthcalendar.h"
-#include "xfa/include/fwl/basewidget/fwl_picturebox.h"
-#include "xfa/include/fwl/basewidget/fwl_pushbutton.h"
-#include "xfa/include/fwl/basewidget/fwl_scrollbar.h"
-#include "xfa/src/fde/tto/fde_textout.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-CXFA_FFWidget* XFA_ThemeGetOuterWidget(IFWL_Widget* pWidget) {
-  IFWL_Widget* pOuter = pWidget;
-  while (pOuter->GetOuter()) {
-    pOuter = pOuter->GetOuter();
-  }
-  if (pOuter) {
-    return (CXFA_FFWidget*)pOuter->GetPrivateData(pOuter);
-  }
-  return NULL;
-}
-CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp) : m_pApp(pApp) {
-  m_pTextOut = NULL;
-  m_dwCapacity = 0;
-  m_fCapacity = 0;
-  m_pCalendarFont = NULL;
-  m_Rect.Set(0, 0, 0, 0);
-  m_pCheckBoxTP = new CXFA_FWLCheckBoxTP;
-  m_pListBoxTP = new CFWL_ListBoxTP;
-  m_pPictureBoxTP = new CFWL_PictureBoxTP;
-  m_pSrollBarTP = new CFWL_ScrollBarTP;
-  m_pEditTP = new CXFA_FWLEditTP;
-  m_pComboBoxTP = new CFWL_ComboBoxTP;
-  m_pMonthCalendarTP = new CFWL_MonthCalendarTP;
-  m_pDateTimePickerTP = new CFWL_DateTimePickerTP;
-  m_pPushButtonTP = new CFWL_PushButtonTP;
-  m_pCaretTP = new CFWL_CaretTP;
-  m_pBarcodeTP = new CFWL_BarcodeTP;
-  Initialize();
-}
-CXFA_FWLTheme::~CXFA_FWLTheme() {
-  Finalize();
-  delete m_pCheckBoxTP;
-  delete m_pListBoxTP;
-  delete m_pPictureBoxTP;
-  delete m_pSrollBarTP;
-  delete m_pEditTP;
-  delete m_pComboBoxTP;
-  delete m_pMonthCalendarTP;
-  delete m_pDateTimePickerTP;
-  delete m_pPushButtonTP;
-  delete m_pCaretTP;
-  delete m_pBarcodeTP;
-}
-static const FX_WCHAR* g_FWLTheme_CalFonts[] = {
-    L"Arial", L"Courier New", L"DejaVu Sans",
-};
-FWL_ERR CXFA_FWLTheme::Initialize() {
-  m_pTextOut = IFDE_TextOut::Create();
-  for (size_t i = 0; !m_pCalendarFont && i < FX_ArraySize(g_FWLTheme_CalFonts);
-       ++i) {
-    m_pCalendarFont = IFX_Font::LoadFont(g_FWLTheme_CalFonts[i], 0, 0,
-                                         m_pApp->GetFDEFontMgr());
-  }
-  if (!m_pCalendarFont) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-    m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetDefFontByCodePage(
-        FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL);
-#else
-    m_pCalendarFont = m_pApp->GetFDEFontMgr()->GetFontByCodePage(
-        FX_CODEPAGE_MSWin_WesternEuropean, 0, NULL);
-#endif
-  }
-
-  FXSYS_assert(NULL != m_pCalendarFont);
-  FWLTHEME_Init();
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CXFA_FWLTheme::Finalize() {
-  if (m_pTextOut) {
-    m_pTextOut->Release();
-    m_pTextOut = NULL;
-  }
-  if (m_pCalendarFont) {
-    m_pCalendarFont->Release();
-    m_pCalendarFont = NULL;
-  }
-  FWLTHEME_Release();
-  return FWL_ERR_Succeeded;
-}
-FX_BOOL CXFA_FWLTheme::IsValidWidget(IFWL_Widget* pWidget) {
-  return TRUE;
-}
-FX_DWORD CXFA_FWLTheme::GetThemeID(IFWL_Widget* pWidget) {
-  return 0;
-}
-FX_DWORD CXFA_FWLTheme::SetThemeID(IFWL_Widget* pWidget,
-                                   FX_DWORD dwThemeID,
-                                   FX_BOOL bChildren) {
-  return 0;
-}
-FX_BOOL CXFA_FWLTheme::DrawBackground(CFWL_ThemeBackground* pParams) {
-  return GetTheme(pParams->m_pWidget)->DrawBackground(pParams);
-}
-FX_BOOL CXFA_FWLTheme::DrawText(CFWL_ThemeText* pParams) {
-  if (pParams->m_wsText.IsEmpty()) {
-    return FWL_ERR_Indefinite;
-  }
-  if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) {
-    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
-    if (!pWidget) {
-      return FWL_ERR_Indefinite;
-    }
-    m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
-    m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-    m_pTextOut->SetFont(m_pCalendarFont);
-    m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
-    m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
-    if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) &&
-        !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
-        (pParams->m_dwStates &
-         (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) {
-      m_pTextOut->SetTextColor(0xFFFFFFFF);
-    }
-    if (pParams->m_iPart == FWL_PART_MCD_Caption) {
-      if (m_pMonthCalendarTP->GetThemeID(pParams->m_pWidget) == 0) {
-        m_pTextOut->SetTextColor(ArgbEncode(0xff, 0, 153, 255));
-      } else {
-        m_pTextOut->SetTextColor(ArgbEncode(0xff, 128, 128, 0));
-      }
-    }
-    CFX_Graphics* pGraphics = pParams->m_pGraphics;
-    CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
-    if (!pRenderDevice)
-      return FALSE;
-    m_pTextOut->SetRenderDevice(pRenderDevice);
-    CFX_Matrix mtPart = pParams->m_matrix;
-    CFX_Matrix* pMatrix = pGraphics->GetMatrix();
-    if (pMatrix) {
-      mtPart.Concat(*pMatrix);
-    }
-    m_pTextOut->SetMatrix(mtPart);
-    m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(),
-                              pParams->m_rtPart);
-    return TRUE;
-  }
-  CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
-  if (!pWidget) {
-    return FWL_ERR_Indefinite;
-  }
-  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
-  CFX_Graphics* pGraphics = pParams->m_pGraphics;
-  CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
-  if (!pRenderDevice)
-    return FALSE;
-  m_pTextOut->SetRenderDevice(pRenderDevice);
-  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
-  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-  m_pTextOut->SetFont(pAcc->GetFDEFont());
-  m_pTextOut->SetFontSize(pAcc->GetFontSize());
-  m_pTextOut->SetTextColor(pAcc->GetTextColor());
-  CFX_Matrix mtPart = pParams->m_matrix;
-  CFX_Matrix* pMatrix = pGraphics->GetMatrix();
-  if (pMatrix) {
-    mtPart.Concat(*pMatrix);
-  }
-  m_pTextOut->SetMatrix(mtPart);
-  m_pTextOut->DrawLogicText(pParams->m_wsText, pParams->m_wsText.GetLength(),
-                            pParams->m_rtPart);
-  return TRUE;
-}
-void* CXFA_FWLTheme::GetCapacity(CFWL_ThemePart* pThemePart,
-                                 FX_DWORD dwCapacity) {
-  switch (dwCapacity) {
-    case FWL_WGTCAPACITY_Font: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        return pWidget->GetDataAcc()->GetFDEFont();
-      }
-    } break;
-    case FWL_WGTCAPACITY_FontSize: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_fCapacity = pWidget->GetDataAcc()->GetFontSize();
-        return &m_fCapacity;
-      }
-    } break;
-    case FWL_WGTCAPACITY_TextColor: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_dwCapacity = pWidget->GetDataAcc()->GetTextColor();
-        return &m_dwCapacity;
-      }
-    } break;
-    case FWL_WGTCAPACITY_LineHeight: {
-      if (CXFA_FFWidget* pWidget =
-              XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-        m_fCapacity = pWidget->GetDataAcc()->GetLineHeight();
-        return &m_fCapacity;
-      }
-    } break;
-    case FWL_WGTCAPACITY_ScrollBarWidth: {
-      m_fCapacity = 9;
-      return &m_fCapacity;
-    } break;
-    case FWL_WGTCAPACITY_UIMargin: {
-      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
-      if (pWidget) {
-        CXFA_LayoutItem* pItem = pWidget;
-        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
-        pWidgetAcc->GetUIMargin(m_Rect);
-        if (CXFA_Para para = pWidgetAcc->GetPara()) {
-          m_Rect.left += para.GetMarginLeft();
-          if (pWidgetAcc->IsMultiLine()) {
-            m_Rect.width += para.GetMarginRight();
-          }
-        }
-        if (pItem->GetPrev() == NULL) {
-          if (pItem->GetNext()) {
-            m_Rect.height = 0;
-          }
-        } else if (pItem->GetNext() == NULL) {
-          m_Rect.top = 0;
-        } else {
-          m_Rect.top = 0;
-          m_Rect.height = 0;
-        }
-      }
-      return &m_Rect;
-    } break;
-    case FWL_WGTCAPACITY_SpaceAboveBelow: {
-      CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pThemePart->m_pWidget);
-      if (pWidget) {
-        CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
-        if (CXFA_Para para = pWidgetAcc->GetPara()) {
-          m_SizeAboveBelow.x = para.GetSpaceAbove();
-          m_SizeAboveBelow.y = para.GetSpaceBelow();
-        }
-      }
-      return &m_SizeAboveBelow;
-    } break;
-    default:
-      break;
-  }
-  if (pThemePart->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar &&
-      dwCapacity >= FWL_MCCAPACITY_Sun && dwCapacity <= FWL_MCCAPACITY_Today) {
-    if (CXFA_FFWidget* pWidget =
-            XFA_ThemeGetOuterWidget(pThemePart->m_pWidget)) {
-      IXFA_AppProvider* pAppProvider = pWidget->GetAppProvider();
-      m_wsResource.Empty();
-      pAppProvider->LoadString(
-          XFA_IDS_StringWeekDay_Sun + dwCapacity - FWL_WGTCAPACITY_MAX - 5,
-          m_wsResource);
-      if (!m_wsResource.IsEmpty()) {
-        return &m_wsResource;
-      }
-    }
-  }
-  return GetTheme(pThemePart->m_pWidget)->GetCapacity(pThemePart, dwCapacity);
-}
-FX_BOOL CXFA_FWLTheme::IsCustomizedLayout(IFWL_Widget* pWidget) {
-  return GetTheme(pWidget)->IsCustomizedLayout(pWidget);
-}
-FWL_ERR CXFA_FWLTheme::GetPartRect(CFWL_ThemePart* pThemePart) {
-  CFX_RectF rect;
-  return GetTheme(pThemePart->m_pWidget)->GetPartRect(pThemePart, rect);
-}
-FX_BOOL CXFA_FWLTheme::IsInPart(CFWL_ThemePart* pThemePart,
-                                FX_FLOAT fx,
-                                FX_FLOAT fy) {
-  return GetTheme(pThemePart->m_pWidget)->IsInPart(pThemePart, fx, fy);
-}
-FX_BOOL CXFA_FWLTheme::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
-  if (pParams->m_pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar) {
-    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
-    if (!pWidget) {
-      return FWL_ERR_Indefinite;
-    }
-    if (!pParams)
-      return FALSE;
-    if (!m_pTextOut)
-      return FALSE;
-    m_pTextOut->SetFont(m_pCalendarFont);
-    m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
-    m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
-    m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-    m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
-    m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
-                              rect);
-    return TRUE;
-  }
-  CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
-  if (!pWidget) {
-    return FWL_ERR_Indefinite;
-  }
-  CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
-  m_pTextOut->SetFont(pAcc->GetFDEFont());
-  m_pTextOut->SetFontSize(pAcc->GetFontSize());
-  m_pTextOut->SetTextColor(pAcc->GetTextColor());
-  if (!pParams)
-    return FALSE;
-  if (!m_pTextOut)
-    return FALSE;
-  m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
-  m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
-  m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
-                            rect);
-  return TRUE;
-}
-CFWL_WidgetTP* CXFA_FWLTheme::GetTheme(IFWL_Widget* pWidget) {
-  switch (pWidget->GetClassID()) {
-    case FWL_CLASSHASH_CheckBox:
-      return m_pCheckBoxTP;
-    case FWL_CLASSHASH_ListBox:
-      return m_pListBoxTP;
-    case FWL_CLASSHASH_PictureBox:
-      return m_pPictureBoxTP;
-    case FWL_CLASSHASH_ScrollBar:
-      return m_pSrollBarTP;
-    case FWL_CLASSHASH_Edit:
-      return m_pEditTP;
-    case FWL_CLASSHASH_ComboBox:
-      return m_pComboBoxTP;
-    case FWL_CLASSHASH_MonthCalendar:
-      return m_pMonthCalendarTP;
-    case FWL_CLASSHASH_DateTimePicker:
-      return m_pDateTimePickerTP;
-    case FWL_CLASSHASH_PushButton:
-      return m_pPushButtonTP;
-    case FWL_CLASSHASH_Caret:
-      return m_pCaretTP;
-    case FWL_CLASSHASH_Barcode:
-      return m_pBarcodeTP;
-    default:
-      break;
-  }
-  return NULL;
-}
-CXFA_FWLCheckBoxTP::CXFA_FWLCheckBoxTP() {}
-FX_BOOL CXFA_FWLCheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (pParams->m_iPart != FWL_PART_CKB_CheckBox) {
-    return TRUE;
-  }
-  if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-       FWL_PARTSTATE_CKB_Checked) ||
-      ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) ==
-       FWL_PARTSTATE_CKB_Neutral)) {
-    DrawCheckSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart,
-                  pParams->m_dwStates, &pParams->m_matrix);
-  }
-  return TRUE;
-}
-void CXFA_FWLCheckBoxTP::DrawCheckSign(IFWL_Widget* pWidget,
-                                       CFX_Graphics* pGraphics,
-                                       const CFX_RectF* pRtBox,
-                                       int32_t iState,
-                                       CFX_Matrix* pMatrix) {
-  CFX_RectF rtSign(*pRtBox);
-  FX_DWORD dwColor = 0xFF000000;
-  if ((iState & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Neutral) {
-    dwColor = 0xFFA9A9A9;
-  }
-  {
-    FX_DWORD dwStyle = pWidget->GetStylesEx();
-    rtSign.Deflate(rtSign.width / 4, rtSign.height / 4);
-    switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) {
-      case FWL_STYLEEXT_CKB_SignShapeCheck:
-        DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      case FWL_STYLEEXT_CKB_SignShapeCircle:
-        DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      case FWL_STYLEEXT_CKB_SignShapeCross:
-        DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      case FWL_STYLEEXT_CKB_SignShapeDiamond:
-        DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      case FWL_STYLEEXT_CKB_SignShapeSquare:
-        DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      case FWL_STYLEEXT_CKB_SignShapeStar:
-        DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix);
-        break;
-      default:
-        break;
-    }
-  }
-}
-CXFA_FWLEditTP::CXFA_FWLEditTP() {}
-CXFA_FWLEditTP::~CXFA_FWLEditTP() {}
-FX_BOOL CXFA_FWLEditTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (FWL_PART_EDT_CombTextLine == pParams->m_iPart) {
-    CXFA_FFWidget* pWidget = XFA_ThemeGetOuterWidget(pParams->m_pWidget);
-    FX_ARGB cr = 0xFF000000;
-    FX_FLOAT fWidth = 1.0f;
-    if (CXFA_Border borderUI = pWidget->GetDataAcc()->GetUIBorder()) {
-      CXFA_Edge edge = borderUI.GetEdge(0);
-      if (edge) {
-        cr = edge.GetColor();
-        fWidth = edge.GetThickness();
-      }
-    }
-    CFX_Color crLine(cr);
-    pParams->m_pGraphics->SetStrokeColor(&crLine);
-    pParams->m_pGraphics->SetLineWidth(fWidth);
-    pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix);
-    return TRUE;
-  }
-  return CFWL_EditTP::DrawBackground(pParams);
-}
diff --git a/xfa/src/fxfa/app/xfa_fwltheme.h b/xfa/src/fxfa/app/xfa_fwltheme.h
deleted file mode 100644
index 1882311..0000000
--- a/xfa/src/fxfa/app/xfa_fwltheme.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_FWLTHEME_H_
-#define XFA_SRC_FXFA_APP_XFA_FWLTHEME_H_
-
-#include "xfa/include/fwl/core/fwl_target.h"
-#include "xfa/include/fwl/core/fwl_theme.h"
-#include "xfa/include/fwl/theme/barcodetp.h"
-#include "xfa/include/fwl/theme/carettp.h"
-#include "xfa/include/fwl/theme/checkboxtp.h"
-#include "xfa/include/fwl/theme/comboboxtp.h"
-#include "xfa/include/fwl/theme/datetimepickertp.h"
-#include "xfa/include/fwl/theme/edittp.h"
-#include "xfa/include/fwl/theme/listboxtp.h"
-#include "xfa/include/fwl/theme/monthcalendartp.h"
-#include "xfa/include/fwl/theme/pictureboxtp.h"
-#include "xfa/include/fwl/theme/pushbuttontp.h"
-#include "xfa/include/fwl/theme/scrollbartp.h"
-#include "xfa/include/fwl/theme/widgettp.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-
-class CXFA_FWLTheme : public IFWL_ThemeProvider {
- public:
-  CXFA_FWLTheme(CXFA_FFApp* pApp);
-  virtual ~CXFA_FWLTheme();
-  virtual FWL_ERR Release() {
-    delete this;
-    return FWL_ERR_Succeeded;
-  }
-  virtual IFWL_Target* Retain() { return NULL; }
-  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const {
-    return FWL_ERR_Succeeded;
-  }
-  virtual FX_DWORD GetHashCode() const { return 0; }
-  virtual FWL_ERR Initialize();
-  virtual FWL_ERR Finalize();
-  virtual FX_BOOL IsValidWidget(IFWL_Widget* pWidget);
-  virtual FX_DWORD GetThemeID(IFWL_Widget* pWidget);
-  virtual FX_DWORD SetThemeID(IFWL_Widget* pWidget,
-                              FX_DWORD dwThemeID,
-                              FX_BOOL bChildren = TRUE);
-  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
-  virtual FX_BOOL DrawText(CFWL_ThemeText* pParams);
-  virtual void* GetCapacity(CFWL_ThemePart* pThemePart, FX_DWORD dwCapacity);
-  virtual FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget);
-  virtual FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart);
-  virtual FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
-                           FX_FLOAT fx,
-                           FX_FLOAT fy);
-
-  virtual FX_BOOL CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect);
-  virtual FWL_ERR GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) {
-    return FWL_ERR_Succeeded;
-  }
-  virtual FWL_ERR SetThemeMatrix(IFWL_Widget* pWidget,
-                                 const CFX_Matrix& matrix) {
-    return FWL_ERR_Succeeded;
-  }
-  virtual FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) {
-    return FWL_ERR_Succeeded;
-  }
-
- protected:
-  CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget);
-  CFWL_CheckBoxTP* m_pCheckBoxTP;
-  CFWL_ListBoxTP* m_pListBoxTP;
-  CFWL_PictureBoxTP* m_pPictureBoxTP;
-  CFWL_ScrollBarTP* m_pSrollBarTP;
-  CFWL_EditTP* m_pEditTP;
-  CFWL_ComboBoxTP* m_pComboBoxTP;
-  CFWL_MonthCalendarTP* m_pMonthCalendarTP;
-  CFWL_DateTimePickerTP* m_pDateTimePickerTP;
-  CFWL_PushButtonTP* m_pPushButtonTP;
-  CFWL_CaretTP* m_pCaretTP;
-  CFWL_BarcodeTP* m_pBarcodeTP;
-  IFDE_TextOut* m_pTextOut;
-  FX_FLOAT m_fCapacity;
-  FX_DWORD m_dwCapacity;
-  IFX_Font* m_pCalendarFont;
-  CFX_WideString m_wsResource;
-  CXFA_FFApp* m_pApp;
-  CFX_RectF m_Rect;
-  CFX_SizeF m_SizeAboveBelow;
-};
-class CXFA_FWLCheckBoxTP : public CFWL_CheckBoxTP {
- public:
-  CXFA_FWLCheckBoxTP();
-  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
-
- protected:
-  void DrawCheckSign(IFWL_Widget* pWidget,
-                     CFX_Graphics* pGraphics,
-                     const CFX_RectF* pRtBox,
-                     int32_t iState,
-                     CFX_Matrix* pMatrix);
-};
-class CXFA_FWLEditTP : public CFWL_EditTP {
- public:
-  CXFA_FWLEditTP();
-  virtual ~CXFA_FWLEditTP();
-
- public:
-  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_FWLTHEME_H_
diff --git a/xfa/src/fxfa/app/xfa_rendercontext.cpp b/xfa/src/fxfa/app/xfa_rendercontext.cpp
deleted file mode 100644
index cc5402e..0000000
--- a/xfa/src/fxfa/app/xfa_rendercontext.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_rendercontext.h"
-
-#include "xfa/include/fxgraphics/fx_graphics.h"
-#include "xfa/src/fxfa/app/xfa_ffwidget.h"
-
-#define XFA_RENDERCONTEXT_MaxCount 30
-
-IXFA_RenderContext* XFA_RenderContext_Create() {
-  return new CXFA_RenderContext;
-}
-CXFA_RenderContext::CXFA_RenderContext() {
-  m_pWidgetIterator = NULL;
-  m_pWidget = NULL;
-  m_pPageView = NULL;
-  m_pGS = NULL;
-  m_dwStatus = 0;
-  m_matrix.SetIdentity();
-  m_rtClipRect.Reset();
-}
-CXFA_RenderContext::~CXFA_RenderContext() {
-  StopRender();
-}
-int32_t CXFA_RenderContext::StartRender(IXFA_PageView* pPageView,
-                                        CFX_Graphics* pGS,
-                                        const CFX_Matrix& matrix,
-                                        const CXFA_RenderOptions& options) {
-  m_pPageView = pPageView;
-  m_pGS = pGS;
-  m_matrix = matrix;
-  m_options = options;
-  CFX_RectF rtPage;
-  pGS->GetClipRect(rtPage);
-  CFX_Matrix mtRes;
-  mtRes.SetReverse(matrix);
-  m_rtClipRect.Set(rtPage.left, rtPage.top, rtPage.width, rtPage.height);
-  mtRes.TransformRect(m_rtClipRect);
-  m_dwStatus = m_options.m_bHighlight ? XFA_WIDGETSTATUS_Highlight : 0;
-  FX_DWORD dwFilterType = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_AllType |
-                          (m_options.m_bPrint ? XFA_WIDGETSTATUS_Printable
-                                              : XFA_WIDGETSTATUS_Viewable);
-  m_pWidgetIterator =
-      m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType);
-  m_pWidget = m_pWidgetIterator->MoveToNext();
-  return XFA_RENDERSTATUS_Ready;
-}
-int32_t CXFA_RenderContext::DoRender(IFX_Pause* pPause) {
-  int32_t iCount = 0;
-  while (m_pWidget) {
-    CXFA_FFWidget* pWidget = (CXFA_FFWidget*)m_pWidget;
-    CFX_RectF rtWidgetBox;
-    pWidget->GetBBox(rtWidgetBox, XFA_WIDGETSTATUS_Visible);
-    rtWidgetBox.width += 1;
-    rtWidgetBox.height += 1;
-    if (rtWidgetBox.IntersectWith(m_rtClipRect)) {
-      pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);
-    }
-    m_pWidget = m_pWidgetIterator->MoveToNext();
-    iCount++;
-    if (iCount > XFA_RENDERCONTEXT_MaxCount && pPause &&
-        pPause->NeedToPauseNow()) {
-      return XFA_RENDERSTATUS_ToBeContinued;
-    }
-  }
-  return XFA_RENDERSTATUS_Done;
-}
-void CXFA_RenderContext::StopRender() {
-  if (m_pWidgetIterator) {
-    m_pWidgetIterator->Release();
-    m_pWidgetIterator = NULL;
-  }
-}
diff --git a/xfa/src/fxfa/app/xfa_rendercontext.h b/xfa/src/fxfa/app/xfa_rendercontext.h
deleted file mode 100644
index 9ed975c..0000000
--- a/xfa/src/fxfa/app/xfa_rendercontext.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_RENDERCONTEXT_H_
-#define XFA_SRC_FXFA_APP_XFA_RENDERCONTEXT_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-
-class CXFA_RenderContext : public IXFA_RenderContext {
- public:
-  CXFA_RenderContext();
-  virtual ~CXFA_RenderContext();
-  virtual void Release() { delete this; }
-  virtual int32_t StartRender(IXFA_PageView* pPageView,
-                              CFX_Graphics* pGS,
-                              const CFX_Matrix& matrix,
-                              const CXFA_RenderOptions& options);
-  virtual int32_t DoRender(IFX_Pause* pPause = NULL);
-  virtual void StopRender();
-
- protected:
-  IXFA_WidgetIterator* m_pWidgetIterator;
-  IXFA_Widget* m_pWidget;
-  IXFA_PageView* m_pPageView;
-  CFX_Graphics* m_pGS;
-  CFX_Matrix m_matrix;
-  CXFA_RenderOptions m_options;
-  FX_DWORD m_dwStatus;
-  CFX_RectF m_rtClipRect;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_RENDERCONTEXT_H_
diff --git a/xfa/src/fxfa/app/xfa_textlayout.cpp b/xfa/src/fxfa/app/xfa_textlayout.cpp
deleted file mode 100644
index b8a9ec4..0000000
--- a/xfa/src/fxfa/app/xfa_textlayout.cpp
+++ /dev/null
@@ -1,2001 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/app/xfa_textlayout.h"
-
-#include <algorithm>
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fde/fde_pen.h"
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fxfa/app/xfa_ffapp.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/app/xfa_fontmgr.h"
-
-CXFA_CSSTagProvider::~CXFA_CSSTagProvider() {
-  FX_POSITION pos = m_Attributes.GetStartPosition();
-  while (pos) {
-    CFX_WideString *pName = NULL, *pValue = NULL;
-    m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue);
-    delete pName;
-    delete pValue;
-  }
-}
-void CXFA_CSSTagProvider::GetNextAttribute(FX_POSITION& pos,
-                                           CFX_WideStringC& wsAttr,
-                                           CFX_WideStringC& wsValue) {
-  if (pos == NULL) {
-    return;
-  }
-  CFX_WideString* pName = NULL;
-  CFX_WideString* pValue = NULL;
-  m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue);
-  wsAttr = *pName;
-  wsValue = *pValue;
-}
-void CXFA_CSSTagProvider::SetAttribute(const CFX_WideString& wsAttr,
-                                       const CFX_WideString& wsValue) {
-  CFX_WideString* pName = new CFX_WideString();
-  CFX_WideString* pValue = new CFX_WideString();
-  *pName = wsAttr;
-  *pValue = wsValue;
-  m_Attributes.SetAt(pName, pValue);
-}
-void CXFA_TextParseContext::SetDecls(const IFDE_CSSDeclaration** ppDeclArray,
-                                     int32_t iDeclCount) {
-  if (iDeclCount <= 0 || ppDeclArray == NULL) {
-    return;
-  }
-  m_dwMatchedDecls = iDeclCount;
-  m_ppMatchedDecls = FX_Alloc(IFDE_CSSDeclaration*, iDeclCount);
-  FXSYS_memcpy(m_ppMatchedDecls, ppDeclArray,
-               iDeclCount * sizeof(IFDE_CSSDeclaration*));
-}
-CXFA_TextParser::~CXFA_TextParser() {
-  if (m_pUASheet)
-    m_pUASheet->Release();
-  if (m_pSelector)
-    m_pSelector->Release();
-  if (m_pAllocator)
-    m_pAllocator->Release();
-  FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition();
-  while (ps) {
-    IFDE_XMLNode* pXMLNode;
-    CXFA_TextParseContext* pParseContext;
-    m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext);
-    if (pParseContext)
-      FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext);
-  }
-  m_mapXMLNodeToParseContext.RemoveAll();
-}
-void CXFA_TextParser::Reset() {
-  FX_POSITION ps = m_mapXMLNodeToParseContext.GetStartPosition();
-  while (ps) {
-    IFDE_XMLNode* pXMLNode;
-    CXFA_TextParseContext* pParseContext;
-    m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext);
-    if (pParseContext)
-      FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext);
-  }
-  m_mapXMLNodeToParseContext.RemoveAll();
-  if (m_pAllocator) {
-    m_pAllocator->Release();
-    m_pAllocator = NULL;
-  }
-}
-void CXFA_TextParser::InitCSSData(IXFA_TextProvider* pTextProvider) {
-  if (pTextProvider == NULL) {
-    return;
-  }
-  if (m_pSelector == NULL) {
-    CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
-    IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr();
-    FXSYS_assert(pFontMgr);
-    m_pSelector = IFDE_CSSStyleSelector::Create();
-    m_pSelector->SetFontMgr(pFontMgr);
-    FX_FLOAT fFontSize = 10;
-    CXFA_Font font = pTextProvider->GetFontNode();
-    if (font) {
-      fFontSize = font.GetFontSize();
-    }
-    m_pSelector->SetDefFontSize(fFontSize);
-  }
-  if (m_pUASheet == NULL) {
-    m_pUASheet = LoadDefaultSheetStyle();
-    m_pSelector->SetStyleSheet(FDE_CSSSTYLESHEETGROUP_UserAgent, m_pUASheet);
-    m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL);
-  }
-}
-IFDE_CSSStyleSheet* CXFA_TextParser::LoadDefaultSheetStyle() {
-  static const FX_WCHAR s_pStyle[] =
-      L"html,body,ol,p,ul{display:block}"
-      L"li{display:list-item}"
-      L"ol,ul{padding-left:33px}ol{list-style-type:decimal}ol,ul{margin-top:0;"
-      L"margin-bottom:0}ul,ol{margin:1.12em 0}"
-      L"a{color:#0000ff;text-decoration:underline}b{font-weight:bolder}i{font-"
-      L"style:italic}"
-      L"sup{vertical-align:+15em;font-size:.66em}sub{vertical-align:-15em;font-"
-      L"size:.66em}";
-  return IFDE_CSSStyleSheet::LoadFromBuffer(
-      CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8);
-}
-IFDE_CSSComputedStyle* CXFA_TextParser::CreateRootStyle(
-    IXFA_TextProvider* pTextProvider) {
-  CXFA_Font font = pTextProvider->GetFontNode();
-  CXFA_Para para = pTextProvider->GetParaNode();
-  IFDE_CSSComputedStyle* pStyle = m_pSelector->CreateComputedStyle(NULL);
-  IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles();
-  IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
-  FX_FLOAT fLineHeight = 0, fFontSize = 10;
-  if (para) {
-    fLineHeight = para.GetLineHeight();
-    FDE_CSSLENGTH indent;
-    indent.Set(FDE_CSSLENGTHUNIT_Point, para.GetTextIndent());
-    pParaStyle->SetTextIndent(indent);
-    FDE_CSSTEXTALIGN hAlgin = FDE_CSSTEXTALIGN_Left;
-    switch (para.GetHorizontalAlign()) {
-      case XFA_ATTRIBUTEENUM_Center:
-        hAlgin = FDE_CSSTEXTALIGN_Center;
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        hAlgin = FDE_CSSTEXTALIGN_Right;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        hAlgin = FDE_CSSTEXTALIGN_Justify;
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        hAlgin = FDE_CSSTEXTALIGN_JustifyAll;
-        break;
-    }
-    pParaStyle->SetTextAlign(hAlgin);
-    FDE_CSSRECT rtMarginWidth;
-    rtMarginWidth.left.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginLeft());
-    rtMarginWidth.top.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceAbove());
-    rtMarginWidth.right.Set(FDE_CSSLENGTHUNIT_Point, para.GetMarginRight());
-    rtMarginWidth.bottom.Set(FDE_CSSLENGTHUNIT_Point, para.GetSpaceBelow());
-    pStyle->GetBoundaryStyles()->SetMarginWidth(rtMarginWidth);
-  }
-  if (font) {
-    pFontStyle->SetColor(font.GetColor());
-    pFontStyle->SetFontStyle(font.IsItalic() ? FDE_CSSFONTSTYLE_Italic
-                                             : FDE_CSSFONTSTYLE_Normal);
-    pFontStyle->SetFontWeight(font.IsBold() ? FXFONT_FW_BOLD
-                                            : FXFONT_FW_NORMAL);
-    pParaStyle->SetNumberVerticalAlign(-font.GetBaselineShift());
-    fFontSize = font.GetFontSize();
-    FDE_CSSLENGTH letterSpacing;
-    letterSpacing.Set(FDE_CSSLENGTHUNIT_Point, font.GetLetterSpacing());
-    pParaStyle->SetLetterSpacing(letterSpacing);
-    FX_DWORD dwDecoration = 0;
-    if (font.GetLineThrough() > 0) {
-      dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough;
-    }
-    if (font.GetUnderline() > 1) {
-      dwDecoration |= FDE_CSSTEXTDECORATION_Double;
-    } else if (font.GetUnderline() > 0) {
-      dwDecoration |= FDE_CSSTEXTDECORATION_Underline;
-    }
-    pParaStyle->SetTextDecoration(dwDecoration);
-  }
-  pParaStyle->SetLineHeight(fLineHeight);
-  pFontStyle->SetFontSize(fFontSize);
-  return pStyle;
-}
-IFDE_CSSComputedStyle* CXFA_TextParser::CreateStyle(
-    IFDE_CSSComputedStyle* pParentStyle) {
-  IFDE_CSSComputedStyle* pNewStyle =
-      m_pSelector->CreateComputedStyle(pParentStyle);
-  FXSYS_assert(pNewStyle);
-  if (pParentStyle) {
-    IFDE_CSSParagraphStyle* pParaStyle = pParentStyle->GetParagraphStyles();
-    FX_DWORD dwDecoration = pParaStyle->GetTextDecoration();
-    FX_FLOAT fBaseLine = 0;
-    if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) {
-      fBaseLine = pParaStyle->GetNumberVerticalAlign();
-    }
-    pParaStyle = pNewStyle->GetParagraphStyles();
-    pParaStyle->SetTextDecoration(dwDecoration);
-    pParaStyle->SetNumberVerticalAlign(fBaseLine);
-    IFDE_CSSBoundaryStyle* pBoundarytyle = pParentStyle->GetBoundaryStyles();
-    const FDE_CSSRECT* pRect = pBoundarytyle->GetMarginWidth();
-    if (pRect) {
-      pBoundarytyle = pNewStyle->GetBoundaryStyles();
-      pBoundarytyle->SetMarginWidth(*pRect);
-    }
-  }
-  return pNewStyle;
-}
-IFDE_CSSComputedStyle* CXFA_TextParser::ComputeStyle(
-    IFDE_XMLNode* pXMLNode,
-    IFDE_CSSComputedStyle* pParentStyle) {
-  CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>(
-      m_mapXMLNodeToParseContext.GetValueAt(pXMLNode));
-  if (!pContext)
-    return nullptr;
-  pContext->m_pParentStyle = pParentStyle;
-  pParentStyle->AddRef();
-  CXFA_CSSTagProvider tagProvider;
-  ParseTagInfo(pXMLNode, tagProvider);
-  if (tagProvider.m_bContent)
-    return nullptr;
-  IFDE_CSSComputedStyle* pStyle = CreateStyle(pParentStyle);
-  IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
-  pCSSAccel->OnEnterTag(&tagProvider);
-  m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(),
-                            pContext->CountDecls(), pStyle);
-  pCSSAccel->OnLeaveTag(&tagProvider);
-  return pStyle;
-}
-void CXFA_TextParser::DoParse(IFDE_XMLNode* pXMLContainer,
-                              IXFA_TextProvider* pTextProvider) {
-  if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) {
-    return;
-  }
-  m_pAllocator =
-      FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 32, sizeof(CXFA_CSSTagProvider));
-  InitCSSData(pTextProvider);
-  IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider);
-  ParseRichText(pXMLContainer, pRootStyle);
-  pRootStyle->Release();
-}
-void CXFA_TextParser::ParseRichText(IFDE_XMLNode* pXMLNode,
-                                    IFDE_CSSComputedStyle* pParentStyle) {
-  if (pXMLNode == NULL) {
-    return;
-  }
-  CXFA_CSSTagProvider tagProvider;
-  ParseTagInfo(pXMLNode, tagProvider);
-  if (!tagProvider.m_bTagAviliable) {
-    return;
-  }
-  IFDE_CSSComputedStyle* pNewStyle = NULL;
-  if ((tagProvider.GetTagName() != FX_WSTRC(L"body")) ||
-      (tagProvider.GetTagName() != FX_WSTRC(L"html"))) {
-    CXFA_TextParseContext* pTextContext =
-        FXTARGET_NewWith(m_pAllocator) CXFA_TextParseContext;
-    FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_Inline;
-    if (!tagProvider.m_bContent) {
-      pNewStyle = CreateStyle(pParentStyle);
-      IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator();
-      pCSSAccel->OnEnterTag(&tagProvider);
-      CFDE_CSSDeclarationArray DeclArray;
-      int32_t iMatchedDecls =
-          m_pSelector->MatchDeclarations(&tagProvider, DeclArray);
-      const IFDE_CSSDeclaration** ppMatchDecls =
-          (const IFDE_CSSDeclaration**)DeclArray.GetData();
-      m_pSelector->ComputeStyle(&tagProvider, ppMatchDecls, iMatchedDecls,
-                                pNewStyle);
-      pCSSAccel->OnLeaveTag(&tagProvider);
-      if (iMatchedDecls > 0) {
-        pTextContext->SetDecls(ppMatchDecls, iMatchedDecls);
-      }
-      eDisplay = pNewStyle->GetPositionStyles()->GetDisplay();
-    }
-    pTextContext->SetDisplay(eDisplay);
-    m_mapXMLNodeToParseContext.SetAt(pXMLNode, pTextContext);
-  }
-  for (IFDE_XMLNode* pXMLChild =
-           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    ParseRichText(pXMLChild, pNewStyle);
-  }
-  if (pNewStyle)
-    pNewStyle->Release();
-}
-void CXFA_TextParser::ParseTagInfo(IFDE_XMLNode* pXMLNode,
-                                   CXFA_CSSTagProvider& tagProvider) {
-  static const FX_DWORD s_XFATagName[] = {
-      0x61,       0x62,       0x69,       0x70,       0x0001f714,
-      0x00022a55, 0x000239bb, 0x00025881, 0x0bd37faa, 0x0bd37fb8,
-      0xa73e3af2, 0xb182eaae, 0xdb8ac455,
-  };
-  CFX_WideString wsName;
-  if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-    IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-    pXMLElement->GetLocalTagName(wsName);
-    tagProvider.SetTagNameObj(wsName);
-    FX_DWORD dwHashCode =
-        FX_HashCode_String_GetW(wsName, wsName.GetLength(), TRUE);
-    static const int32_t s_iCount = sizeof(s_XFATagName) / sizeof(FX_DWORD);
-    CFX_DSPATemplate<FX_DWORD> lookup;
-    tagProvider.m_bTagAviliable =
-        lookup.Lookup(dwHashCode, s_XFATagName, s_iCount) > -1;
-    CFX_WideString wsValue;
-    pXMLElement->GetString(FX_WSTRC(L"style").GetPtr(), wsValue);
-    if (!wsValue.IsEmpty()) {
-      tagProvider.SetAttribute(FX_WSTRC(L"style"), wsValue);
-    }
-  } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
-    tagProvider.m_bTagAviliable = TRUE;
-    tagProvider.m_bContent = TRUE;
-  }
-}
-int32_t CXFA_TextParser::GetVAlgin(IXFA_TextProvider* pTextProvider) const {
-  int32_t iAlign = XFA_ATTRIBUTEENUM_Top;
-  CXFA_Para para = pTextProvider->GetParaNode();
-  if (para) {
-    iAlign = para.GetVerticalAlign();
-  }
-  return iAlign;
-}
-FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const {
-  CFX_WideString wsValue;
-  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) {
-    CXFA_Measurement ms(wsValue);
-    return ms.ToUnit(XFA_UNIT_Pt);
-  }
-  return 36;
-}
-int32_t CXFA_TextParser::CountTabs(IFDE_CSSComputedStyle* pStyle) const {
-  CFX_WideString wsValue;
-  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue)) {
-    return wsValue.GetInteger();
-  }
-  return 0;
-}
-FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const {
-  CFX_WideString wsValue;
-  if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) {
-    wsValue.MakeLower();
-    return wsValue == FX_WSTRC(L"yes");
-  }
-  return FALSE;
-}
-IFX_Font* CXFA_TextParser::GetFont(IXFA_TextProvider* pTextProvider,
-                                   IFDE_CSSComputedStyle* pStyle) const {
-  CFX_WideStringC wsFamily = FX_WSTRC(L"Courier");
-  FX_DWORD dwStyle = 0;
-  CXFA_Font font = pTextProvider->GetFontNode();
-  if (font) {
-    font.GetTypeface(wsFamily);
-    if (font.IsBold()) {
-      dwStyle |= FX_FONTSTYLE_Bold;
-    }
-    if (font.IsItalic()) {
-      dwStyle |= FX_FONTSTYLE_Italic;
-    }
-  }
-  if (pStyle) {
-    IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles();
-    int32_t iCount = pFontStyle->CountFontFamilies();
-    if (iCount > 0) {
-      wsFamily = pFontStyle->GetFontFamily(iCount - 1);
-    }
-    dwStyle = 0;
-    if (pFontStyle->GetFontWeight() > FXFONT_FW_NORMAL) {
-      dwStyle |= FX_FONTSTYLE_Bold;
-    }
-    if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) {
-      dwStyle |= FX_FONTSTYLE_Italic;
-    }
-  }
-  CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
-  CXFA_FontMgr* pFontMgr = pDoc->GetApp()->GetXFAFontMgr();
-  return pFontMgr->GetFont(pDoc, wsFamily, dwStyle);
-}
-FX_FLOAT CXFA_TextParser::GetFontSize(IXFA_TextProvider* pTextProvider,
-                                      IFDE_CSSComputedStyle* pStyle) const {
-  if (pStyle)
-    return pStyle->GetFontStyles()->GetFontSize();
-
-  CXFA_Font font = pTextProvider->GetFontNode();
-  if (font) {
-    return font.GetFontSize();
-  }
-  return 10;
-}
-int32_t CXFA_TextParser::GetHorScale(IXFA_TextProvider* pTextProvider,
-                                     IFDE_CSSComputedStyle* pStyle,
-                                     IFDE_XMLNode* pXMLNode) const {
-  if (pStyle) {
-    CFX_WideString wsValue;
-    if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"),
-                               wsValue)) {
-      return wsValue.GetInteger();
-    }
-    while (pXMLNode) {
-      CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>(
-          m_mapXMLNodeToParseContext.GetValueAt(pXMLNode));
-      if (pContext && pContext->m_pParentStyle &&
-          pContext->m_pParentStyle->GetCustomStyle(
-              FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) {
-        return wsValue.GetInteger();
-      }
-      pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
-    }
-  }
-  if (CXFA_Font font = pTextProvider->GetFontNode()) {
-    return static_cast<int32_t>(font.GetHorizontalScale());
-  }
-  return 100;
-}
-int32_t CXFA_TextParser::GetVerScale(IXFA_TextProvider* pTextProvider,
-                                     IFDE_CSSComputedStyle* pStyle) const {
-  if (pStyle) {
-    CFX_WideString wsValue;
-    if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue)) {
-      return wsValue.GetInteger();
-    }
-  }
-  if (CXFA_Font font = pTextProvider->GetFontNode()) {
-    return (int32_t)font.GetVerticalScale();
-  }
-  return 100;
-}
-void CXFA_TextParser::GetUnderline(IXFA_TextProvider* pTextProvider,
-                                   IFDE_CSSComputedStyle* pStyle,
-                                   int32_t& iUnderline,
-                                   int32_t& iPeriod) const {
-  iUnderline = 0;
-  iPeriod = XFA_ATTRIBUTEENUM_All;
-  if (pStyle) {
-    FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration();
-    if (dwDecoration & FDE_CSSTEXTDECORATION_Double) {
-      iUnderline = 2;
-    } else if (dwDecoration & FDE_CSSTEXTDECORATION_Underline) {
-      iUnderline = 1;
-    }
-    CFX_WideString wsValue;
-    if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) {
-      if (wsValue == FX_WSTRC(L"word")) {
-        iPeriod = XFA_ATTRIBUTEENUM_Word;
-      }
-    } else if (CXFA_Font font = pTextProvider->GetFontNode()) {
-      iPeriod = font.GetUnderlinePeriod();
-    }
-  } else {
-    CXFA_Font font = pTextProvider->GetFontNode();
-    if (font) {
-      iUnderline = font.GetUnderline();
-      iPeriod = font.GetUnderlinePeriod();
-    }
-  }
-}
-void CXFA_TextParser::GetLinethrough(IXFA_TextProvider* pTextProvider,
-                                     IFDE_CSSComputedStyle* pStyle,
-                                     int32_t& iLinethrough) const {
-  if (pStyle) {
-    FX_DWORD dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration();
-    iLinethrough = (dwDecoration & FDE_CSSTEXTDECORATION_LineThrough) ? 1 : 0;
-  } else {
-    CXFA_Font font = pTextProvider->GetFontNode();
-    if (font) {
-      iLinethrough = font.GetLineThrough();
-    }
-  }
-}
-FX_ARGB CXFA_TextParser::GetColor(IXFA_TextProvider* pTextProvider,
-                                  IFDE_CSSComputedStyle* pStyle) const {
-  if (pStyle)
-    return pStyle->GetFontStyles()->GetColor();
-
-  if (CXFA_Font font = pTextProvider->GetFontNode())
-    return font.GetColor();
-
-  return 0xFF000000;
-}
-FX_FLOAT CXFA_TextParser::GetBaseline(IXFA_TextProvider* pTextProvider,
-                                      IFDE_CSSComputedStyle* pStyle) const {
-  if (pStyle) {
-    IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
-    if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) {
-      return pParaStyle->GetNumberVerticalAlign();
-    }
-  } else if (CXFA_Font font = pTextProvider->GetFontNode()) {
-    return font.GetBaselineShift();
-  }
-  return 0;
-}
-FX_FLOAT CXFA_TextParser::GetLineHeight(IXFA_TextProvider* pTextProvider,
-                                        IFDE_CSSComputedStyle* pStyle,
-                                        FX_BOOL bFirst,
-                                        FX_FLOAT fVerScale) const {
-  FX_FLOAT fLineHeight = 0;
-  if (pStyle) {
-    fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight();
-  } else if (CXFA_Para para = pTextProvider->GetParaNode()) {
-    fLineHeight = para.GetLineHeight();
-  }
-  if (bFirst) {
-    FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle);
-    if (fLineHeight < 0.1f) {
-      fLineHeight = fFontSize;
-    } else {
-      fLineHeight = std::min(fLineHeight, fFontSize);
-    }
-  } else if (fLineHeight < 0.1f) {
-    fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f;
-  }
-  fLineHeight *= fVerScale;
-  return fLineHeight;
-}
-FX_BOOL CXFA_TextParser::GetEmbbedObj(IXFA_TextProvider* pTextProvider,
-                                      IFDE_XMLNode* pXMLNode,
-                                      CFX_WideString& wsValue) {
-  wsValue.Empty();
-  if (pXMLNode == NULL) {
-    return FALSE;
-  }
-  FX_BOOL bRet = FALSE;
-  if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-    IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLNode;
-    CFX_WideString wsAttr;
-    pElement->GetString(FX_WSTRC(L"xfa:embed").GetPtr(), wsAttr);
-    if (wsAttr.IsEmpty()) {
-      return FALSE;
-    }
-    if (wsAttr.GetAt(0) == L'#') {
-      wsAttr.Delete(0);
-    }
-    CFX_WideString ws;
-    pElement->GetString(FX_WSTRC(L"xfa:embedType").GetPtr(), ws);
-    if (ws.IsEmpty()) {
-      ws = L"som";
-    } else {
-      ws.MakeLower();
-    }
-    FX_BOOL bURI = (ws == FX_WSTRC(L"uri"));
-    if (!bURI && ws != FX_WSTRC(L"som")) {
-      return FALSE;
-    }
-    ws.Empty();
-    pElement->GetString(FX_WSTRC(L"xfa:embedMode").GetPtr(), ws);
-    if (ws.IsEmpty()) {
-      ws = L"formatted";
-    } else {
-      ws.MakeLower();
-    }
-    FX_BOOL bRaw = (ws == FX_WSTRC(L"raw"));
-    if (!bRaw && ws != FX_WSTRC(L"formatted")) {
-      return FALSE;
-    }
-    bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue);
-  }
-  return bRet;
-}
-CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap(
-    IFDE_XMLNode* pXMLNode) {
-  return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(
-      pXMLNode);
-}
-enum XFA_TABSTOPSSTATUS {
-  XFA_TABSTOPSSTATUS_Error,
-  XFA_TABSTOPSSTATUS_EOS,
-  XFA_TABSTOPSSTATUS_None,
-  XFA_TABSTOPSSTATUS_Alignment,
-  XFA_TABSTOPSSTATUS_StartLeader,
-  XFA_TABSTOPSSTATUS_Leader,
-  XFA_TABSTOPSSTATUS_Location,
-};
-FX_BOOL CXFA_TextParser::GetTabstops(
-    IFDE_CSSComputedStyle* pStyle,
-    CXFA_TextTabstopsContext* pTabstopContext) {
-  if (pStyle == NULL || pTabstopContext == NULL) {
-    return FALSE;
-  }
-  CFX_WideString wsValue;
-  if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) &&
-      !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) {
-    return FALSE;
-  }
-  int32_t iLength = wsValue.GetLength();
-  const FX_WCHAR* pTabStops = wsValue;
-  int32_t iCur = 0;
-  int32_t iLast = 0;
-  CFX_WideString wsAlign;
-  XFA_TABSTOPSSTATUS eStatus = XFA_TABSTOPSSTATUS_None;
-  FX_WCHAR ch;
-  while (iCur < iLength) {
-    ch = pTabStops[iCur];
-    switch (eStatus) {
-      case XFA_TABSTOPSSTATUS_None:
-        if (ch <= ' ') {
-          iCur++;
-        } else {
-          eStatus = XFA_TABSTOPSSTATUS_Alignment;
-          iLast = iCur;
-        }
-        break;
-      case XFA_TABSTOPSSTATUS_Alignment:
-        if (ch == ' ') {
-          wsAlign = CFX_WideStringC(pTabStops + iLast, iCur - iLast);
-          eStatus = XFA_TABSTOPSSTATUS_StartLeader;
-          iCur++;
-          while (iCur < iLength && pTabStops[iCur] <= ' ') {
-            iCur++;
-          }
-          iLast = iCur;
-        } else {
-          iCur++;
-        }
-        break;
-      case XFA_TABSTOPSSTATUS_StartLeader:
-        if (ch != 'l') {
-          eStatus = XFA_TABSTOPSSTATUS_Location;
-        } else {
-          int32_t iCount = 0;
-          while (iCur < iLength) {
-            ch = pTabStops[iCur];
-            iCur++;
-            if (ch == '(') {
-              iCount++;
-            } else if (ch == ')') {
-              iCount--;
-              if (iCount == 0) {
-                break;
-              }
-            }
-          }
-          while (iCur < iLength && pTabStops[iCur] <= ' ') {
-            iCur++;
-          }
-          iLast = iCur;
-          eStatus = XFA_TABSTOPSSTATUS_Location;
-        }
-        break;
-      case XFA_TABSTOPSSTATUS_Location:
-        if (ch == ' ') {
-          FX_DWORD dwHashCode =
-              FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE);
-          CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast));
-          FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt);
-          pTabstopContext->Append(dwHashCode, fPos);
-          wsAlign.Empty();
-          eStatus = XFA_TABSTOPSSTATUS_None;
-        }
-        iCur++;
-        break;
-      default:
-        break;
-    }
-  }
-  if (!wsAlign.IsEmpty()) {
-    FX_DWORD dwHashCode =
-        FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE);
-    CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast));
-    FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt);
-    pTabstopContext->Append(dwHashCode, fPos);
-  }
-  return TRUE;
-}
-CXFA_TextLayout::CXFA_TextLayout(IXFA_TextProvider* pTextProvider)
-    : m_bHasBlock(FALSE),
-      m_pTextProvider(pTextProvider),
-      m_pTextDataNode(nullptr),
-      m_bRichText(FALSE),
-      m_pAllocator(nullptr),
-      m_pBreak(nullptr),
-      m_pLoader(nullptr),
-      m_iLines(0),
-      m_fMaxWidth(0),
-      m_pTabstopContext(nullptr),
-      m_bBlockContinue(TRUE) {
-  FXSYS_assert(m_pTextProvider);
-}
-CXFA_TextLayout::~CXFA_TextLayout() {
-  m_textParser.Reset();
-  delete m_pLoader;
-  delete m_pTabstopContext;
-  Unload();
-}
-void CXFA_TextLayout::Unload() {
-  int32_t iCount = m_pieceLines.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_PieceLine* pLine = m_pieceLines.GetAt(i);
-    FXTARGET_DeleteWith(CXFA_PieceLine, m_pAllocator, pLine);
-  }
-  m_pieceLines.RemoveAll();
-  if (m_pBreak) {
-    m_pBreak->Release();
-    m_pBreak = NULL;
-  }
-  if (m_pAllocator) {
-    m_pAllocator->Release();
-    m_pAllocator = NULL;
-  }
-}
-const CXFA_PieceLineArray* CXFA_TextLayout::GetPieceLines() {
-  return &m_pieceLines;
-}
-void CXFA_TextLayout::GetTextDataNode() {
-  if (m_pTextProvider == NULL) {
-    return;
-  }
-  CXFA_Node* pNode = m_pTextProvider->GetTextNode(m_bRichText);
-  if (pNode && m_bRichText) {
-    m_textParser.Reset();
-  }
-  m_pTextDataNode = pNode;
-}
-IFDE_XMLNode* CXFA_TextLayout::GetXMLContainerNode() {
-  IFDE_XMLNode* pXMLContainer = NULL;
-  if (m_bRichText) {
-    IFDE_XMLNode* pXMLRoot = m_pTextDataNode->GetXMLMappingNode();
-    if (!pXMLRoot) {
-      return pXMLContainer;
-    }
-    for (IFDE_XMLNode* pXMLChild =
-             pXMLRoot->GetNodeItem(IFDE_XMLNode::FirstChild);
-         pXMLChild;
-         pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-      if (pXMLChild->GetType() == FDE_XMLNODE_Element) {
-        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
-        CFX_WideString wsTag;
-        pXMLElement->GetLocalTagName(wsTag);
-        if (wsTag.Equal(FX_WSTRC(L"body")) || wsTag.Equal(FX_WSTRC(L"html"))) {
-          pXMLContainer = pXMLChild;
-          break;
-        }
-      }
-    }
-  }
-  return pXMLContainer;
-}
-IFX_RTFBreak* CXFA_TextLayout::CreateBreak(FX_BOOL bDefault) {
-  FX_DWORD dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab;
-  if (!bDefault) {
-    dwStyle |= FX_RTFLAYOUTSTYLE_Pagination;
-  }
-  IFX_RTFBreak* pBreak = IFX_RTFBreak::Create(0);
-  pBreak->SetLayoutStyles(dwStyle);
-  pBreak->SetLineBreakChar(L'\n');
-  pBreak->SetLineBreakTolerance(1);
-  pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL));
-  pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, NULL));
-  return pBreak;
-}
-void CXFA_TextLayout::InitBreak(FX_FLOAT fLineWidth) {
-  CXFA_Font font = m_pTextProvider->GetFontNode();
-  CXFA_Para para = m_pTextProvider->GetParaNode();
-  FX_FLOAT fStart = 0;
-  FX_FLOAT fStartPos = 0;
-  if (para) {
-    int32_t iAlign = FX_RTFLINEALIGNMENT_Left;
-    switch (para.GetHorizontalAlign()) {
-      case XFA_ATTRIBUTEENUM_Center:
-        iAlign = FX_RTFLINEALIGNMENT_Center;
-        break;
-      case XFA_ATTRIBUTEENUM_Right:
-        iAlign = FX_RTFLINEALIGNMENT_Right;
-        break;
-      case XFA_ATTRIBUTEENUM_Justify:
-        iAlign = FX_RTFLINEALIGNMENT_Justified;
-        break;
-      case XFA_ATTRIBUTEENUM_JustifyAll:
-        iAlign = FX_RTFLINEALIGNMENT_Distributed;
-        break;
-    }
-    m_pBreak->SetAlignment(iAlign);
-    fStart = para.GetMarginLeft();
-    if (m_pTextProvider->IsCheckButtonAndAutoWidth()) {
-      if (iAlign != FX_RTFLINEALIGNMENT_Left) {
-        fLineWidth -= para.GetMarginRight();
-      }
-    } else {
-      fLineWidth -= para.GetMarginRight();
-    }
-    if (fLineWidth < 0) {
-      fLineWidth = fStart;
-    }
-    fStartPos = fStart;
-    FX_FLOAT fIndent = para.GetTextIndent();
-    if (fIndent > 0) {
-      fStartPos += fIndent;
-    }
-  }
-  m_pBreak->SetLineBoundary(fStart, fLineWidth);
-  m_pBreak->SetLineStartPos(fStartPos);
-  if (font) {
-    m_pBreak->SetHorizontalScale((int32_t)font.GetHorizontalScale());
-    m_pBreak->SetVerticalScale((int32_t)font.GetVerticalScale());
-    m_pBreak->SetCharSpace(font.GetLetterSpacing());
-  }
-  FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, NULL);
-  m_pBreak->SetFontSize(fFontSize);
-  m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, NULL));
-  m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f);
-}
-void CXFA_TextLayout::InitBreak(IFDE_CSSComputedStyle* pStyle,
-                                FDE_CSSDISPLAY eDisplay,
-                                FX_FLOAT fLineWidth,
-                                IFDE_XMLNode* pXMLNode,
-                                IFDE_CSSComputedStyle* pParentStyle) {
-  if (pStyle == NULL) {
-    InitBreak(fLineWidth);
-    return;
-  }
-  IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles();
-  if (eDisplay == FDE_CSSDISPLAY_Block || eDisplay == FDE_CSSDISPLAY_ListItem) {
-    int32_t iAlign = FX_RTFLINEALIGNMENT_Left;
-    switch (pParaStyle->GetTextAlign()) {
-      case FDE_CSSTEXTALIGN_Right:
-        iAlign = FX_RTFLINEALIGNMENT_Right;
-        break;
-      case FDE_CSSTEXTALIGN_Center:
-        iAlign = FX_RTFLINEALIGNMENT_Center;
-        break;
-      case FDE_CSSTEXTALIGN_Justify:
-        iAlign = FX_RTFLINEALIGNMENT_Justified;
-        break;
-      case FDE_CSSTEXTALIGN_JustifyAll:
-        iAlign = FX_RTFLINEALIGNMENT_Distributed;
-        break;
-      default:
-        break;
-    }
-    m_pBreak->SetAlignment(iAlign);
-    FX_FLOAT fStart = 0;
-    const FDE_CSSRECT* pRect = pStyle->GetBoundaryStyles()->GetMarginWidth();
-    const FDE_CSSRECT* pPaddingRect =
-        pStyle->GetBoundaryStyles()->GetPaddingWidth();
-    if (pRect) {
-      fStart = pRect->left.GetValue();
-      fLineWidth -= pRect->right.GetValue();
-      if (pPaddingRect) {
-        fStart += pPaddingRect->left.GetValue();
-        fLineWidth -= pPaddingRect->right.GetValue();
-      }
-      if (eDisplay == FDE_CSSDISPLAY_ListItem) {
-        const FDE_CSSRECT* pParRect =
-            pParentStyle->GetBoundaryStyles()->GetMarginWidth();
-        const FDE_CSSRECT* pParPaddingRect =
-            pParentStyle->GetBoundaryStyles()->GetPaddingWidth();
-        if (pParRect) {
-          fStart += pParRect->left.GetValue();
-          fLineWidth -= pParRect->right.GetValue();
-          if (pParPaddingRect) {
-            fStart += pParPaddingRect->left.GetValue();
-            fLineWidth -= pParPaddingRect->right.GetValue();
-          }
-        }
-        FDE_CSSRECT pNewRect;
-        pNewRect.left.Set(FDE_CSSLENGTHUNIT_Point, fStart);
-        pNewRect.right.Set(FDE_CSSLENGTHUNIT_Point, pRect->right.GetValue());
-        pNewRect.top.Set(FDE_CSSLENGTHUNIT_Point, pRect->top.GetValue());
-        pNewRect.bottom.Set(FDE_CSSLENGTHUNIT_Point, pRect->bottom.GetValue());
-        pStyle->GetBoundaryStyles()->SetMarginWidth(pNewRect);
-      }
-    }
-    m_pBreak->SetLineBoundary(fStart, fLineWidth);
-    FX_FLOAT fIndent = pParaStyle->GetTextIndent().GetValue();
-    if (fIndent > 0) {
-      fStart += fIndent;
-    }
-    m_pBreak->SetLineStartPos(fStart);
-    m_pBreak->SetTabWidth(m_textParser.GetTabInterval(pStyle));
-    if (m_pTabstopContext == NULL) {
-      m_pTabstopContext = new CXFA_TextTabstopsContext;
-    }
-    m_textParser.GetTabstops(pStyle, m_pTabstopContext);
-    for (int32_t i = 0; i < m_pTabstopContext->m_iTabCount; i++) {
-      XFA_TABSTOPS* pTab = m_pTabstopContext->m_tabstops.GetDataPtr(i);
-      m_pBreak->AddPositionedTab(pTab->fTabstops);
-    }
-  }
-  FX_FLOAT fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle);
-  m_pBreak->SetFontSize(fFontSize);
-  m_pBreak->SetLineBreakTolerance(fFontSize * 0.2f);
-  m_pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, pStyle));
-  m_pBreak->SetHorizontalScale(
-      m_textParser.GetHorScale(m_pTextProvider, pStyle, pXMLNode));
-  m_pBreak->SetVerticalScale(m_textParser.GetVerScale(m_pTextProvider, pStyle));
-  m_pBreak->SetCharSpace(pParaStyle->GetLetterSpacing().GetValue());
-}
-int32_t CXFA_TextLayout::GetText(CFX_WideString& wsText) {
-  GetTextDataNode();
-  wsText.Empty();
-  if (m_bRichText) {
-  } else {
-    wsText = m_pTextDataNode->GetContent();
-  }
-  return wsText.GetLength();
-}
-FX_FLOAT CXFA_TextLayout::GetLayoutHeight() {
-  if (m_pLoader == NULL) {
-    return 0;
-  }
-  int32_t iCount = m_pLoader->m_lineHeights.GetSize();
-  if (iCount == 0 && m_pLoader->m_fWidth > 0) {
-    CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
-    CFX_SizeF szDef;
-    m_pLoader->m_bSaveLineHeight = TRUE;
-    m_pLoader->m_fLastPos = 0;
-    CalcSize(szMax, szMax, szDef);
-    m_pLoader->m_bSaveLineHeight = FALSE;
-    return szDef.y;
-  }
-  FX_FLOAT fHeight = m_pLoader->m_fHeight;
-  if (fHeight < 0.1f) {
-    fHeight = 0;
-    for (int32_t i = 0; i < iCount; i++) {
-      fHeight += m_pLoader->m_lineHeights.ElementAt(i);
-    }
-  }
-  return fHeight;
-}
-FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) {
-  if (m_pLoader == NULL) {
-    m_pLoader = new CXFA_LoaderContext;
-  }
-  if (fWidth < 0 || (m_pLoader->m_fWidth > -1 &&
-                     FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) {
-    m_pLoader->m_lineHeights.RemoveAll();
-    m_Blocks.RemoveAll();
-    Unload();
-    m_pLoader->m_fStartLineOffset = 0;
-  }
-  m_pLoader->m_fWidth = fWidth;
-  if (fWidth < 0) {
-    CFX_SizeF szMax;
-    CFX_SizeF szDef;
-    m_pLoader->m_bSaveLineHeight = TRUE;
-    m_pLoader->m_fLastPos = 0;
-    CalcSize(szMax, szMax, szDef);
-    m_pLoader->m_bSaveLineHeight = FALSE;
-    fWidth = szDef.x;
-  }
-  return fWidth;
-}
-FX_BOOL CXFA_TextLayout::DoLayout(int32_t iBlockIndex,
-                                  FX_FLOAT& fCalcHeight,
-                                  FX_FLOAT fContentAreaHeight,
-                                  FX_FLOAT fTextHeight) {
-  if (m_pLoader == NULL) {
-    return FALSE;
-  }
-  int32_t iBlockCount = m_Blocks.GetSize();
-  FX_FLOAT fHeight = fTextHeight;
-  if (fHeight < 0) {
-    fHeight = GetLayoutHeight();
-  }
-  m_pLoader->m_fHeight = fHeight;
-  if (fContentAreaHeight < 0) {
-    return FALSE;
-  }
-  m_bHasBlock = TRUE;
-  if (iBlockCount == 0 && fHeight > 0) {
-    fHeight = fTextHeight - GetLayoutHeight();
-    if (fHeight > 0) {
-      int32_t iAlign = m_textParser.GetVAlgin(m_pTextProvider);
-      if (iAlign == XFA_ATTRIBUTEENUM_Middle) {
-        fHeight /= 2.0f;
-      } else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) {
-        fHeight = 0;
-      }
-      m_pLoader->m_fStartLineOffset = fHeight;
-    }
-  }
-  FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset;
-  int32_t iLineIndex = 0;
-  if (iBlockCount > 1) {
-    if (iBlockCount >= (iBlockIndex + 1) * 2) {
-      iLineIndex = m_Blocks.ElementAt(iBlockIndex * 2);
-    } else {
-      iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) +
-                   m_Blocks.ElementAt(iBlockCount - 2);
-    }
-    if (m_pLoader->m_BlocksHeight.GetSize() > 0) {
-      for (int32_t i = 0; i < iBlockIndex; i++) {
-        fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
-      }
-    }
-  }
-  int32_t iCount = m_pLoader->m_lineHeights.GetSize();
-  int32_t i = 0;
-  for (i = iLineIndex; i < iCount; i++) {
-    FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
-    if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) {
-      fCalcHeight = 0;
-      return TRUE;
-    }
-    if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) {
-      if (iBlockCount >= (iBlockIndex + 1) * 2) {
-        m_Blocks.SetAt(iBlockIndex * 2, iLineIndex);
-        m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex);
-      } else {
-        m_Blocks.Add(iLineIndex);
-        m_Blocks.Add(i - iLineIndex);
-      }
-      if (i == iLineIndex) {
-        if (fCalcHeight <= fLinePos) {
-          if (m_pLoader->m_BlocksHeight.GetSize() > iBlockIndex * 2 &&
-              (m_pLoader->m_BlocksHeight.GetAt(iBlockIndex * 2) ==
-               iBlockIndex)) {
-            m_pLoader->m_BlocksHeight.SetAt(iBlockIndex * 2 + 1, fCalcHeight);
-          } else {
-            m_pLoader->m_BlocksHeight.Add((FX_FLOAT)iBlockIndex);
-            m_pLoader->m_BlocksHeight.Add(fCalcHeight);
-          }
-        }
-        return TRUE;
-      }
-      fCalcHeight = fLinePos;
-      return TRUE;
-    }
-    fLinePos += fLineHeight;
-  }
-  return FALSE;
-}
-int32_t CXFA_TextLayout::CountBlocks() const {
-  int32_t iCount = m_Blocks.GetSize() / 2;
-  return iCount > 0 ? iCount : 1;
-}
-FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize,
-                                  const CFX_SizeF& maxSize,
-                                  CFX_SizeF& defaultSize) {
-  defaultSize.x = maxSize.x;
-  if (defaultSize.x < 1) {
-    defaultSize.x = 0xFFFF;
-  }
-  if (m_pBreak)
-    m_pBreak->Release();
-
-  m_pBreak = CreateBreak(FALSE);
-  FX_FLOAT fLinePos = 0;
-  m_iLines = 0;
-  m_fMaxWidth = 0;
-  Loader(defaultSize, fLinePos, FALSE);
-  if (fLinePos < 0.1f) {
-    fLinePos = m_textParser.GetFontSize(m_pTextProvider, NULL);
-  }
-  if (m_pTabstopContext) {
-    delete m_pTabstopContext;
-    m_pTabstopContext = NULL;
-  }
-  defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos);
-  return TRUE;
-}
-FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) {
-  if (size.x < 1) {
-    return FALSE;
-  }
-  Unload();
-  m_pBreak = CreateBreak(TRUE);
-  if (m_pLoader) {
-    m_pLoader->m_iTotalLines = -1;
-    m_pLoader->m_iChar = 0;
-  }
-  m_iLines = 0;
-  FX_FLOAT fLinePos = 0;
-  Loader(size, fLinePos, TRUE);
-  UpdateAlign(size.y, fLinePos);
-  if (m_pTabstopContext) {
-    delete m_pTabstopContext;
-    m_pTabstopContext = NULL;
-  }
-  if (fHeight) {
-    *fHeight = fLinePos;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_TextLayout::Layout(int32_t iBlock) {
-  if (m_pLoader == NULL || iBlock < 0 || iBlock >= CountBlocks()) {
-    return FALSE;
-  }
-  if (m_pLoader->m_fWidth < 1) {
-    return FALSE;
-  }
-  m_pLoader->m_iTotalLines = -1;
-  m_iLines = 0;
-  FX_FLOAT fLinePos = 0;
-  CXFA_Node* pNode = NULL;
-  CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
-  int32_t iCount = m_Blocks.GetSize();
-  int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize();
-  iBlocksHeightCount /= 2;
-  if (iBlock < iBlocksHeightCount) {
-    return TRUE;
-  }
-  if (iBlock == iBlocksHeightCount) {
-    Unload();
-    m_pBreak = CreateBreak(TRUE);
-    fLinePos = m_pLoader->m_fStartLineOffset;
-    for (int32_t i = 0; i < iBlocksHeightCount; i++) {
-      fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
-    }
-    m_pLoader->m_iChar = 0;
-    if (iCount > 1) {
-      m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1);
-    }
-    Loader(szText, fLinePos, TRUE);
-    if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) {
-      UpdateAlign(szText.y, fLinePos);
-    }
-  } else if (m_pTextDataNode) {
-    iBlock *= 2;
-    if (iBlock < iCount - 2) {
-      m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1);
-    }
-    m_pBreak->Reset();
-    if (m_bRichText) {
-      IFDE_XMLNode* pContainerNode = GetXMLContainerNode();
-      if (!pContainerNode) {
-        return TRUE;
-      }
-      IFDE_XMLNode* pXMLNode = m_pLoader->m_pXMLNode;
-      if (pXMLNode == NULL) {
-        return TRUE;
-      }
-      IFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode;
-      for (; pXMLNode;
-           pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-        FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos,
-                                     m_pLoader->m_pParentStyle, TRUE);
-        if (!bFlag) {
-          break;
-        }
-      }
-      while (pXMLNode == NULL) {
-        pXMLNode = pSaveXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
-        if (pXMLNode == pContainerNode) {
-          break;
-        }
-        FX_BOOL bFlag =
-            LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
-                         TRUE, NULL, FALSE);
-        if (!bFlag) {
-          break;
-        }
-        pSaveXMLNode = pXMLNode;
-        pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
-        if (!pXMLNode) {
-          continue;
-        }
-        for (; pXMLNode;
-             pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-          FX_BOOL bFlag = LoadRichText(pXMLNode, szText, fLinePos,
-                                       m_pLoader->m_pParentStyle, TRUE);
-          if (!bFlag) {
-            break;
-          }
-        }
-      }
-    } else {
-      pNode = m_pLoader->m_pNode;
-      if (pNode == NULL) {
-        return TRUE;
-      }
-      LoadText(pNode, szText, fLinePos, TRUE);
-    }
-  }
-  if (iBlock == iCount) {
-    delete m_pTabstopContext;
-    m_pTabstopContext = nullptr;
-    delete m_pLoader;
-    m_pLoader = nullptr;
-  }
-  return TRUE;
-}
-void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) {
-  if (!m_pLoader) {
-    return;
-  }
-  int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize();
-  if (iCountHeight == 0) {
-    return;
-  }
-  FX_BOOL bEndItem = TRUE;
-  int32_t iBlockCount = m_Blocks.GetSize();
-  FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset;
-  int32_t iLineIndex = 0;
-  if (iBlockIndex > 0) {
-    int32_t iBlockHeightCount = m_pLoader->m_BlocksHeight.GetSize();
-    iBlockHeightCount /= 2;
-    if (iBlockHeightCount >= iBlockIndex) {
-      for (int32_t i = 0; i < iBlockIndex; i++) {
-        fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
-      }
-    } else {
-      fLinePos = 0;
-    }
-    iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) +
-                 m_Blocks.ElementAt(iBlockCount - 2);
-  }
-  int32_t i = 0;
-  for (i = iLineIndex; i < iCountHeight; i++) {
-    FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
-    if (fLinePos + fLineHeight - rtText.height > 0.001) {
-      m_Blocks.Add(iLineIndex);
-      m_Blocks.Add(i - iLineIndex);
-      bEndItem = FALSE;
-      break;
-    }
-    fLinePos += fLineHeight;
-  }
-  if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) {
-    m_Blocks.Add(iLineIndex);
-    m_Blocks.Add(i - iLineIndex);
-  }
-}
-FX_BOOL CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
-                                    const CFX_Matrix& tmDoc2Device,
-                                    const CFX_RectF& rtClip,
-                                    int32_t iBlock) {
-  IFDE_RenderDevice* pDevice = IFDE_RenderDevice::Create(pFxDevice);
-  if (pDevice == NULL) {
-    return FALSE;
-  }
-  FDE_HDEVICESTATE state = pDevice->SaveState();
-  pDevice->SetClipRect(rtClip);
-  IFDE_SolidBrush* pSolidBrush =
-      (IFDE_SolidBrush*)IFDE_Brush::Create(FDE_BRUSHTYPE_Solid);
-  IFDE_Pen* pPen = IFDE_Pen::Create();
-  FXSYS_assert(pDevice);
-  FXSYS_assert(pSolidBrush);
-  FXSYS_assert(pPen);
-  if (m_pieceLines.GetSize() == 0) {
-    int32_t iBlockCount = CountBlocks();
-    for (int32_t i = 0; i < iBlockCount; i++) {
-      Layout(i);
-    }
-  }
-  FXTEXT_CHARPOS* pCharPos = NULL;
-  int32_t iCharCount = 0;
-  int32_t iLineStart = 0;
-  int32_t iPieceLines = m_pieceLines.GetSize();
-  int32_t iCount = m_Blocks.GetSize();
-  if (iCount > 0) {
-    iBlock *= 2;
-    if (iBlock < iCount) {
-      iLineStart = m_Blocks.ElementAt(iBlock);
-      iPieceLines = m_Blocks.ElementAt(iBlock + 1);
-    } else {
-      iPieceLines = 0;
-    }
-  }
-  for (int32_t i = 0; i < iPieceLines; i++) {
-    if (i + iLineStart >= m_pieceLines.GetSize()) {
-      break;
-    }
-    CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i + iLineStart);
-    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
-    int32_t j = 0;
-    for (j = 0; j < iPieces; j++) {
-      const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
-      int32_t iChars = pPiece->iChars;
-      if (iCharCount < iChars) {
-        FX_Free(pCharPos);
-        pCharPos = FX_Alloc(FXTEXT_CHARPOS, iChars);
-        iCharCount = iChars;
-      }
-      FXSYS_memset(pCharPos, 0, iCharCount * sizeof(FXTEXT_CHARPOS));
-      RenderString(pDevice, pSolidBrush, pPieceLine, j, pCharPos, tmDoc2Device);
-    }
-    for (j = 0; j < iPieces; j++) {
-      RenderPath(pDevice, pPen, pPieceLine, j, pCharPos, tmDoc2Device);
-    }
-  }
-  pDevice->RestoreState(state);
-  FX_Free(pCharPos);
-  pSolidBrush->Release();
-  pPen->Release();
-  pDevice->Release();
-  return iPieceLines;
-}
-void CXFA_TextLayout::UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom) {
-  fHeight -= fBottom;
-  if (fHeight < 0.1f) {
-    return;
-  }
-  switch (m_textParser.GetVAlgin(m_pTextProvider)) {
-    case XFA_ATTRIBUTEENUM_Middle:
-      fHeight /= 2.0f;
-      break;
-    case XFA_ATTRIBUTEENUM_Bottom:
-      break;
-    default:
-      return;
-  }
-  int32_t iCount = m_pieceLines.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i);
-    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
-    for (int32_t j = 0; j < iPieces; j++) {
-      XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
-      CFX_RectF& rect = pPiece->rtPiece;
-      rect.top += fHeight;
-    }
-  }
-}
-FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF& szText,
-                                FX_FLOAT& fLinePos,
-                                FX_BOOL bSavePieces) {
-  if (m_pAllocator == NULL) {
-    m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Static, 256, 0);
-  }
-  GetTextDataNode();
-  if (m_pTextDataNode == NULL) {
-    return TRUE;
-  }
-  if (m_bRichText) {
-    IFDE_XMLNode* pXMLContainer = GetXMLContainerNode();
-    if (pXMLContainer) {
-      if (!m_textParser.IsParsed()) {
-        m_textParser.DoParse(pXMLContainer, m_pTextProvider);
-      }
-      IFDE_CSSComputedStyle* pRootStyle =
-          m_textParser.CreateRootStyle(m_pTextProvider);
-      LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces);
-      pRootStyle->Release();
-    }
-  } else {
-    LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces);
-  }
-  return TRUE;
-}
-void CXFA_TextLayout::LoadText(CXFA_Node* pNode,
-                               const CFX_SizeF& szText,
-                               FX_FLOAT& fLinePos,
-                               FX_BOOL bSavePieces) {
-  InitBreak(szText.x);
-  CXFA_Para para = m_pTextProvider->GetParaNode();
-  FX_FLOAT fSpaceAbove = 0;
-  if (para) {
-    fSpaceAbove = para.GetSpaceAbove();
-    if (fSpaceAbove < 0.1f) {
-      fSpaceAbove = 0;
-    }
-    int32_t verAlign = para.GetVerticalAlign();
-    switch (verAlign) {
-      case XFA_ATTRIBUTEENUM_Top:
-      case XFA_ATTRIBUTEENUM_Middle:
-      case XFA_ATTRIBUTEENUM_Bottom: {
-        fLinePos += fSpaceAbove;
-        break;
-      }
-    }
-  }
-  CFX_WideString wsText = pNode->GetContent();
-  wsText.TrimRight(L" ");
-  FX_BOOL bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces);
-  if (bRet && m_pLoader) {
-    m_pLoader->m_pNode = pNode;
-  } else {
-    EndBreak(FX_RTFBREAK_ParagraphBreak, fLinePos, bSavePieces);
-  }
-}
-FX_BOOL CXFA_TextLayout::LoadRichText(IFDE_XMLNode* pXMLNode,
-                                      const CFX_SizeF& szText,
-                                      FX_FLOAT& fLinePos,
-                                      IFDE_CSSComputedStyle* pParentStyle,
-                                      FX_BOOL bSavePieces,
-                                      CXFA_LinkUserData* pLinkData,
-                                      FX_BOOL bEndBreak,
-                                      FX_BOOL bIsOl,
-                                      int32_t iLiCount) {
-  if (pXMLNode == NULL) {
-    return FALSE;
-  }
-  CXFA_TextParseContext* pContext =
-      m_textParser.GetParseContextFromMap(pXMLNode);
-  FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_None;
-  FX_BOOL bContentNode = FALSE;
-  FX_FLOAT fSpaceBelow = 0;
-  IFDE_CSSComputedStyle* pStyle = NULL;
-  CFX_WideString wsName;
-  if (bEndBreak) {
-    FX_BOOL bCurOl = FALSE;
-    FX_BOOL bCurLi = FALSE;
-    IFDE_XMLElement* pElement = NULL;
-    if (pContext) {
-      if (m_bBlockContinue ||
-          (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) {
-        m_bBlockContinue = TRUE;
-      }
-      if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
-        bContentNode = TRUE;
-      } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-        pElement = (IFDE_XMLElement*)pXMLNode;
-        pElement->GetLocalTagName(wsName);
-      }
-      if (wsName == FX_WSTRC(L"ol")) {
-        bIsOl = TRUE;
-        bCurOl = TRUE;
-      }
-      if (m_bBlockContinue || bContentNode == FALSE) {
-        eDisplay = pContext->GetDisplay();
-        if (eDisplay != FDE_CSSDISPLAY_Block &&
-            eDisplay != FDE_CSSDISPLAY_Inline &&
-            eDisplay != FDE_CSSDISPLAY_ListItem) {
-          return TRUE;
-        }
-        pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle);
-        InitBreak(bContentNode ? pParentStyle : pStyle, eDisplay, szText.x,
-                  pXMLNode, pParentStyle);
-        if ((eDisplay == FDE_CSSDISPLAY_Block ||
-             eDisplay == FDE_CSSDISPLAY_ListItem) &&
-            pStyle &&
-            (wsName.IsEmpty() ||
-             (wsName != FX_WSTRC(L"body") && wsName != FX_WSTRC(L"html") &&
-              wsName != FX_WSTRC(L"ol") && wsName != FX_WSTRC(L"ul")))) {
-          const FDE_CSSRECT* pRect =
-              pStyle->GetBoundaryStyles()->GetMarginWidth();
-          if (pRect) {
-            fLinePos += pRect->top.GetValue();
-            fSpaceBelow = pRect->bottom.GetValue();
-          }
-        }
-        if (wsName == FX_WSTRC(L"a")) {
-          CFX_WideString wsLinkContent;
-          FXSYS_assert(pElement);
-          pElement->GetString(FX_WSTRC(L"href").GetPtr(), wsLinkContent);
-          if (!wsLinkContent.IsEmpty()) {
-            pLinkData = FXTARGET_NewWith(m_pAllocator) CXFA_LinkUserData(
-                m_pAllocator,
-                wsLinkContent.GetBuffer(wsLinkContent.GetLength()));
-            wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength());
-          }
-        }
-        int32_t iTabCount =
-            m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle);
-        FX_BOOL bSpaceRun =
-            m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle);
-        CFX_WideString wsText;
-        if (bContentNode && iTabCount == 0) {
-          ((IFDE_XMLText*)pXMLNode)->GetText(wsText);
-        } else if (wsName == FX_WSTRC(L"br")) {
-          wsText = L'\n';
-        } else if (wsName == FX_WSTRC(L"li")) {
-          bCurLi = TRUE;
-          if (bIsOl) {
-            wsText.Format(L"%d.  ", iLiCount);
-          } else {
-            wsText = 0x00B7 + FX_WSTRC(L"  ");
-          }
-        } else if (!bContentNode) {
-          if (iTabCount > 0) {
-            while (iTabCount-- > 0)
-              wsText += L'\t';
-          } else {
-            m_textParser.GetEmbbedObj(m_pTextProvider, pXMLNode, wsText);
-          }
-        }
-        int32_t iLength = wsText.GetLength();
-        if (iLength > 0 && bContentNode && !bSpaceRun) {
-          ProcessText(wsText);
-        }
-        if (m_pLoader) {
-          if (wsText.GetLength() > 0 &&
-              (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) {
-            wsText.TrimLeft(0x20);
-          }
-          if (FDE_CSSDISPLAY_Block == eDisplay) {
-            m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
-          } else if (FDE_CSSDISPLAY_Inline == eDisplay &&
-                     (m_pLoader->m_dwFlags & XFA_LOADERCNTXTFLG_FILTERSPACE)) {
-            m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
-          } else if (wsText.GetLength() > 0 &&
-                     (0x20 == wsText.GetAt(wsText.GetLength() - 1))) {
-            m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
-          } else if (wsText.GetLength() != 0) {
-            m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
-          }
-        }
-        if (wsText.GetLength() > 0) {
-          if (m_pLoader == NULL || m_pLoader->m_iChar == 0) {
-            if (pLinkData) {
-              pLinkData->AddRef();
-            }
-            CXFA_TextUserData* pUserData = FXTARGET_NewWith(m_pAllocator)
-                CXFA_TextUserData(m_pAllocator,
-                                  bContentNode ? pParentStyle : pStyle,
-                                  pLinkData);
-            m_pBreak->SetUserData(pUserData);
-          }
-          if (AppendChar(wsText, fLinePos, 0, bSavePieces)) {
-            if (m_pLoader) {
-              m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
-            }
-            if (IsEnd(bSavePieces)) {
-              if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
-                m_pLoader->m_pXMLNode = pXMLNode;
-                m_pLoader->m_pParentStyle = pParentStyle;
-              }
-              if (pStyle)
-                pStyle->Release();
-              return FALSE;
-            }
-            return TRUE;
-          }
-        }
-      }
-    }
-    FX_BOOL ret = TRUE;
-    for (IFDE_XMLNode* pChildNode =
-             pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-         pChildNode;
-         pChildNode = pChildNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-      if (bCurOl) {
-        iLiCount++;
-      }
-      ret = LoadRichText(pChildNode, szText, fLinePos,
-                         pContext ? pStyle : pParentStyle, bSavePieces,
-                         pLinkData, TRUE, bIsOl, iLiCount);
-      if (ret == FALSE) {
-        return FALSE;
-      }
-    }
-    if (m_pLoader) {
-      if (FDE_CSSDISPLAY_Block == eDisplay) {
-        m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
-      }
-    }
-    if (bCurLi) {
-      EndBreak(FX_RTFBREAK_LineBreak, fLinePos, bSavePieces);
-    }
-  } else {
-    if (pContext) {
-      eDisplay = pContext->GetDisplay();
-    }
-  }
-  if (m_bBlockContinue) {
-    if (pContext && !bContentNode) {
-      FX_DWORD dwStatus = (eDisplay == FDE_CSSDISPLAY_Block)
-                              ? FX_RTFBREAK_ParagraphBreak
-                              : FX_RTFBREAK_PieceBreak;
-      EndBreak(dwStatus, fLinePos, bSavePieces);
-      if (eDisplay == FDE_CSSDISPLAY_Block) {
-        fLinePos += fSpaceBelow;
-        if (m_pTabstopContext) {
-          m_pTabstopContext->RemoveAll();
-        }
-      }
-      if (wsName == FX_WSTRC(L"a")) {
-        if (pLinkData) {
-          pLinkData->Release();
-          pLinkData = nullptr;
-        }
-      }
-      if (IsEnd(bSavePieces)) {
-        if (pStyle) {
-          pStyle->Release();
-        }
-        if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
-          m_pLoader->m_pXMLNode =
-              pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
-          m_pLoader->m_pParentStyle = pParentStyle;
-        }
-        return FALSE;
-      }
-    }
-  }
-  if (pStyle)
-    pStyle->Release();
-  return TRUE;
-}
-FX_BOOL CXFA_TextLayout::AppendChar(const CFX_WideString& wsText,
-                                    FX_FLOAT& fLinePos,
-                                    FX_FLOAT fSpaceAbove,
-                                    FX_BOOL bSavePieces) {
-  FX_DWORD dwStatus = 0;
-  int32_t iChar = 0;
-  if (m_pLoader) {
-    iChar = m_pLoader->m_iChar;
-  }
-  int32_t iLength = wsText.GetLength();
-  for (int32_t i = iChar; i < iLength; i++) {
-    FX_WCHAR wch = wsText.GetAt(i);
-    if (wch == 0xA0) {
-      wch = 0x20;
-    }
-    if ((dwStatus = m_pBreak->AppendChar(wch)) > FX_RTFBREAK_PieceBreak) {
-      AppendTextLine(dwStatus, fLinePos, bSavePieces);
-      if (IsEnd(bSavePieces)) {
-        if (m_pLoader)
-          m_pLoader->m_iChar = i;
-        return TRUE;
-      }
-      if (dwStatus == FX_RTFBREAK_ParagraphBreak && m_bRichText) {
-        fLinePos += fSpaceAbove;
-      }
-    }
-  }
-  if (m_pLoader) {
-    m_pLoader->m_iChar = 0;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_TextLayout::IsEnd(FX_BOOL bSavePieces) {
-  if (!bSavePieces) {
-    return FALSE;
-  }
-  if (m_pLoader && m_pLoader->m_iTotalLines > 0) {
-    return m_iLines >= m_pLoader->m_iTotalLines;
-  }
-  return FALSE;
-}
-void CXFA_TextLayout::ProcessText(CFX_WideString& wsText) {
-  int32_t iLen = wsText.GetLength();
-  if (iLen == 0) {
-    return;
-  }
-  FX_WCHAR* psz = wsText.GetBuffer(iLen);
-  int32_t iTrimLeft = 0;
-  FX_WCHAR wch = 0, wPrev = 0;
-  for (int32_t i = 0; i < iLen; i++) {
-    wch = psz[i];
-    if (wch < 0x20) {
-      wch = 0x20;
-    }
-    if (wch == 0x20 && wPrev == 0x20) {
-      continue;
-    }
-    wPrev = wch;
-    psz[iTrimLeft++] = wch;
-  }
-  wsText.ReleaseBuffer(iLen);
-  wsText = wsText.Left(iTrimLeft);
-}
-void CXFA_TextLayout::EndBreak(FX_DWORD dwStatus,
-                               FX_FLOAT& fLinePos,
-                               FX_BOOL bSavePieces) {
-  dwStatus = m_pBreak->EndBreak(dwStatus);
-  if (dwStatus > FX_RTFBREAK_PieceBreak) {
-    AppendTextLine(dwStatus, fLinePos, bSavePieces, TRUE);
-  }
-}
-void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle,
-                                 CXFA_PieceLine* pPieceLine) {
-  if (m_pTabstopContext == NULL || m_pTabstopContext->m_iTabCount == 0) {
-    return;
-  }
-  if (pStyle == NULL || pPieceLine == NULL) {
-    return;
-  }
-  int32_t iPieces = pPieceLine->m_textPieces.GetSize();
-  if (iPieces == 0) {
-    return;
-  }
-  XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1);
-  int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex;
-  int32_t iCount = m_textParser.CountTabs(pStyle);
-  if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) {
-    return;
-  }
-  if (iCount > 0) {
-    iTabstopsIndex++;
-    m_pTabstopContext->m_bTabstops = TRUE;
-    FX_FLOAT fRight = 0;
-    if (iPieces > 1) {
-      XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2);
-      fRight = p->rtPiece.right();
-    }
-    m_pTabstopContext->m_fTabWidth =
-        pPiece->rtPiece.width + pPiece->rtPiece.left - fRight;
-  } else if (iTabstopsIndex > -1) {
-    FX_FLOAT fLeft = 0;
-    if (m_pTabstopContext->m_bTabstops) {
-      XFA_TABSTOPS* pTabstops =
-          m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex);
-      FX_DWORD dwAlgin = pTabstops->dwAlign;
-      if (dwAlgin == FX_HashCode_String_GetW(L"center", 6)) {
-        fLeft = pPiece->rtPiece.width / 2.0f;
-      } else if (dwAlgin == FX_HashCode_String_GetW(L"right", 5) ||
-                 dwAlgin == FX_HashCode_String_GetW(L"before", 6)) {
-        fLeft = pPiece->rtPiece.width;
-      } else if (dwAlgin == FX_HashCode_String_GetW(L"decimal", 7)) {
-        int32_t iChars = pPiece->iChars;
-        for (int32_t i = 0; i < iChars; i++) {
-          if (pPiece->pszText[i] == L'.') {
-            break;
-          }
-          fLeft += pPiece->pWidths[i] / 20000.0f;
-        }
-      }
-      m_pTabstopContext->m_fLeft =
-          std::min(fLeft, m_pTabstopContext->m_fTabWidth);
-      m_pTabstopContext->m_bTabstops = FALSE;
-      m_pTabstopContext->m_fTabWidth = 0;
-    }
-    pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft;
-  }
-}
-void CXFA_TextLayout::AppendTextLine(FX_DWORD dwStatus,
-                                     FX_FLOAT& fLinePos,
-                                     FX_BOOL bSavePieces,
-                                     FX_BOOL bEndBreak) {
-  int32_t iPieces = m_pBreak->CountBreakPieces();
-  if (iPieces < 1) {
-    return;
-  }
-  IFDE_CSSComputedStyle* pStyle = NULL;
-  if (bSavePieces) {
-    CXFA_PieceLine* pPieceLine = FXTARGET_NewWith(m_pAllocator) CXFA_PieceLine;
-    m_pieceLines.Add(pPieceLine);
-    if (m_pTabstopContext) {
-      m_pTabstopContext->Reset();
-    }
-    FX_FLOAT fLineStep = 0, fBaseLine = 0;
-    int32_t i = 0;
-    for (i = 0; i < iPieces; i++) {
-      const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i);
-      CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData;
-      if (pUserData)
-        pStyle = pUserData->m_pStyle;
-      FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f;
-      XFA_TextPiece* pTP = FXTARGET_NewWith(m_pAllocator) XFA_TextPiece();
-      pTP->pszText =
-          (FX_WCHAR*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(FX_WCHAR));
-      pTP->pWidths =
-          (int32_t*)m_pAllocator->Alloc(pPiece->m_iChars * sizeof(int32_t));
-      pTP->iChars = pPiece->m_iChars;
-      pPiece->GetString(pTP->pszText);
-      pPiece->GetWidths(pTP->pWidths);
-      pTP->iBidiLevel = pPiece->m_iBidiLevel;
-      pTP->iHorScale = pPiece->m_iHorizontalScale;
-      pTP->iVerScale = pPiece->m_iVerticalScale;
-      m_textParser.GetUnderline(m_pTextProvider, pStyle, pTP->iUnderline,
-                                pTP->iPeriod);
-      m_textParser.GetLinethrough(m_pTextProvider, pStyle, pTP->iLineThrough);
-      pTP->dwColor = m_textParser.GetColor(m_pTextProvider, pStyle);
-      pTP->pFont = m_textParser.GetFont(m_pTextProvider, pStyle);
-      pTP->fFontSize = m_textParser.GetFontSize(m_pTextProvider, pStyle);
-      pTP->rtPiece.left = pPiece->m_iStartPos / 20000.0f;
-      pTP->rtPiece.width = pPiece->m_iWidth / 20000.0f;
-      pTP->rtPiece.height = (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f;
-      FX_FLOAT fBaseLineTemp =
-          m_textParser.GetBaseline(m_pTextProvider, pStyle);
-      pTP->rtPiece.top = fBaseLineTemp;
-      pPieceLine->m_textPieces.Add(pTP);
-      FX_FLOAT fLineHeight = m_textParser.GetLineHeight(
-          m_pTextProvider, pStyle, m_iLines == 0, fVerScale);
-      if (fBaseLineTemp > 0) {
-        FX_FLOAT fLineHeightTmp = fBaseLineTemp + pTP->rtPiece.height;
-        if (fLineHeight < fLineHeightTmp) {
-          fLineHeight = fLineHeightTmp;
-        } else {
-          fBaseLineTemp = 0;
-        }
-      } else if (fBaseLine < -fBaseLineTemp) {
-        fBaseLine = -fBaseLineTemp;
-      }
-      fLineStep = std::max(fLineStep, fLineHeight);
-      if (pUserData && pUserData->m_pLinkData) {
-        pUserData->m_pLinkData->AddRef();
-        pTP->pLinkData = pUserData->m_pLinkData;
-      } else {
-        pTP->pLinkData = NULL;
-      }
-      DoTabstops(pStyle, pPieceLine);
-    }
-    for (i = 0; i < iPieces; i++) {
-      XFA_TextPiece* pTP = pPieceLine->m_textPieces.GetAt(i);
-      FX_FLOAT& fTop = pTP->rtPiece.top;
-      FX_FLOAT fBaseLineTemp = fTop;
-      fTop = fLinePos + fLineStep - pTP->rtPiece.height - fBaseLineTemp;
-      fTop = std::max(0.0f, fTop);
-    }
-    fLinePos += fLineStep + fBaseLine;
-  } else {
-    FX_FLOAT fLineStep = 0;
-    FX_FLOAT fLineWidth = 0;
-    for (int32_t i = 0; i < iPieces; i++) {
-      const CFX_RTFPiece* pPiece = m_pBreak->GetBreakPiece(i);
-      CXFA_TextUserData* pUserData = (CXFA_TextUserData*)pPiece->m_pUserData;
-      if (pUserData)
-        pStyle = pUserData->m_pStyle;
-      FX_FLOAT fVerScale = pPiece->m_iVerticalScale / 100.0f;
-      FX_FLOAT fBaseLine = m_textParser.GetBaseline(m_pTextProvider, pStyle);
-      FX_FLOAT fLineHeight = m_textParser.GetLineHeight(
-          m_pTextProvider, pStyle, m_iLines == 0, fVerScale);
-      if (fBaseLine > 0) {
-        FX_FLOAT fLineHeightTmp =
-            fBaseLine + (FX_FLOAT)pPiece->m_iFontSize * fVerScale / 20.0f;
-        if (fLineHeight < fLineHeightTmp) {
-          fLineHeight = fLineHeightTmp;
-        }
-      }
-      fLineStep = std::max(fLineStep, fLineHeight);
-      fLineWidth += pPiece->m_iWidth / 20000.0f;
-    }
-    fLinePos += fLineStep;
-    m_fMaxWidth = std::max(m_fMaxWidth, fLineWidth);
-    if (m_pLoader && m_pLoader->m_bSaveLineHeight) {
-      FX_FLOAT fHeight = fLinePos - m_pLoader->m_fLastPos;
-      m_pLoader->m_fLastPos = fLinePos;
-      m_pLoader->m_lineHeights.Add(fHeight);
-    }
-  }
-  if (pStyle) {
-    pStyle->AddRef();
-  }
-  m_pBreak->ClearBreakPieces();
-  if (dwStatus == FX_RTFBREAK_ParagraphBreak) {
-    m_pBreak->Reset();
-    if (!pStyle && bEndBreak) {
-      CXFA_Para para = m_pTextProvider->GetParaNode();
-      if (para) {
-        FX_FLOAT fStartPos = para.GetMarginLeft();
-        FX_FLOAT fIndent = para.GetTextIndent();
-        if (fIndent > 0) {
-          fStartPos += fIndent;
-        }
-        FX_FLOAT fSpaceBelow = para.GetSpaceBelow();
-        if (fSpaceBelow < 0.1f) {
-          fSpaceBelow = 0;
-        }
-        m_pBreak->SetLineStartPos(fStartPos);
-        fLinePos += fSpaceBelow;
-      }
-    }
-  }
-  if (pStyle) {
-    FX_FLOAT fStart = 0;
-    const FDE_CSSRECT* pRect = pStyle->GetBoundaryStyles()->GetMarginWidth();
-    if (pRect) {
-      fStart = pRect->left.GetValue();
-    }
-    FX_FLOAT fTextIndent =
-        pStyle->GetParagraphStyles()->GetTextIndent().GetValue();
-    if (fTextIndent < 0) {
-      fStart -= fTextIndent;
-    }
-    m_pBreak->SetLineStartPos(fStart);
-    pStyle->Release();
-  }
-  m_iLines++;
-}
-void CXFA_TextLayout::RenderString(IFDE_RenderDevice* pDevice,
-                                   IFDE_SolidBrush* pBrush,
-                                   CXFA_PieceLine* pPieceLine,
-                                   int32_t iPiece,
-                                   FXTEXT_CHARPOS* pCharPos,
-                                   const CFX_Matrix& tmDoc2Device) {
-  const XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
-  int32_t iCount = GetDisplayPos(pPiece, pCharPos);
-  if (iCount > 0) {
-    pBrush->SetColor(pPiece->dwColor);
-    pDevice->DrawString(pBrush, pPiece->pFont, pCharPos, iCount,
-                        pPiece->fFontSize, &tmDoc2Device);
-  }
-  pPieceLine->m_charCounts.Add(iCount);
-}
-void CXFA_TextLayout::RenderPath(IFDE_RenderDevice* pDevice,
-                                 IFDE_Pen* pPen,
-                                 CXFA_PieceLine* pPieceLine,
-                                 int32_t iPiece,
-                                 FXTEXT_CHARPOS* pCharPos,
-                                 const CFX_Matrix& tmDoc2Device) {
-  XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
-  FX_BOOL bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2;
-  FX_BOOL bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2;
-  if (bNoUnderline && bNoLineThrough) {
-    return;
-  }
-  pPen->SetColor(pPiece->dwColor);
-  IFDE_Path* pPath = IFDE_Path::Create();
-  int32_t iChars = GetDisplayPos(pPiece, pCharPos);
-  if (iChars > 0) {
-    CFX_PointF pt1, pt2;
-    FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f;
-    int32_t i = 0;
-    if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) {
-      for (int32_t i = 0; i < pPiece->iUnderline; i++) {
-        for (int32_t j = 0; j < iChars; j++) {
-          pt1.x = pCharPos[j].m_OriginX;
-          pt2.x =
-              pt1.x + pCharPos[j].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
-          pt1.y = pt2.y = fEndY;
-          pPath->AddLine(pt1, pt2);
-        }
-        fEndY += 2.0f;
-      }
-    } else {
-      pt1.x = pCharPos[0].m_OriginX;
-      pt2.x =
-          pCharPos[iChars - 1].m_OriginX +
-          pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
-      for (int32_t i = 0; i < pPiece->iUnderline; i++) {
-        pt1.y = pt2.y = fEndY;
-        pPath->AddLine(pt1, pt2);
-        fEndY += 2.0f;
-      }
-    }
-    fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f;
-    pt1.x = pCharPos[0].m_OriginX;
-    pt2.x = pCharPos[iChars - 1].m_OriginX +
-            pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
-    for (i = 0; i < pPiece->iLineThrough; i++) {
-      pt1.y = pt2.y = fEndY;
-      pPath->AddLine(pt1, pt2);
-      fEndY += 2.0f;
-    }
-  } else {
-    if (bNoLineThrough &&
-        (bNoUnderline || pPiece->iPeriod != XFA_ATTRIBUTEENUM_All)) {
-      goto XFA_RenderPathRet;
-    }
-    int32_t iCharsTmp = 0;
-    int32_t iPiecePrev = iPiece, iPieceNext = iPiece;
-    while (iPiecePrev > 0) {
-      iPiecePrev--;
-      iCharsTmp = pPieceLine->m_charCounts.GetAt(iPiecePrev);
-      if (iCharsTmp > 0) {
-        break;
-      }
-    }
-    if (iCharsTmp == 0) {
-      goto XFA_RenderPathRet;
-    }
-    iCharsTmp = 0;
-    int32_t iPieces = pPieceLine->m_textPieces.GetSize();
-    while (iPieceNext < iPieces - 1) {
-      iPieceNext++;
-      iCharsTmp = pPieceLine->m_charCounts.GetAt(iPieceNext);
-      if (iCharsTmp > 0) {
-        break;
-      }
-    }
-    if (iCharsTmp == 0) {
-      goto XFA_RenderPathRet;
-    }
-    FX_FLOAT fOrgX = 0.0f, fEndX = 0.0f;
-    pPiece = pPieceLine->m_textPieces.GetAt(iPiecePrev);
-    iChars = GetDisplayPos(pPiece, pCharPos);
-    if (iChars < 1) {
-      goto XFA_RenderPathRet;
-    }
-    fOrgX = pCharPos[iChars - 1].m_OriginX +
-            pCharPos[iChars - 1].m_FontCharWidth * pPiece->fFontSize / 1000.0f;
-    pPiece = pPieceLine->m_textPieces.GetAt(iPieceNext);
-    iChars = GetDisplayPos(pPiece, pCharPos);
-    if (iChars < 1) {
-      goto XFA_RenderPathRet;
-    }
-    fEndX = pCharPos[0].m_OriginX;
-    CFX_PointF pt1, pt2;
-    pt1.x = fOrgX, pt2.x = fEndX;
-    FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f;
-    int32_t i = 0;
-    for (i = 0; i < pPiece->iUnderline; i++) {
-      pt1.y = pt2.y = fEndY;
-      pPath->AddLine(pt1, pt2);
-      fEndY += 2.0f;
-    }
-    fEndY = pCharPos[0].m_OriginY - pPiece->rtPiece.height * 0.25f;
-    for (i = 0; i < pPiece->iLineThrough; i++) {
-      pt1.y = pt2.y = fEndY;
-      pPath->AddLine(pt1, pt2);
-      fEndY += 2.0f;
-    }
-  }
-  pDevice->DrawPath(pPen, 1, pPath, &tmDoc2Device);
-XFA_RenderPathRet:
-  pPath->Release();
-}
-int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece,
-                                       FXTEXT_CHARPOS* pCharPos,
-                                       FX_BOOL bCharCode) {
-  if (pPiece == NULL) {
-    return 0;
-  }
-  FX_RTFTEXTOBJ tr;
-  if (!ToRun(pPiece, tr)) {
-    return 0;
-  }
-  return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode);
-}
-FX_BOOL CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) {
-  int32_t iLength = pPiece->iChars;
-  if (iLength < 1) {
-    return FALSE;
-  }
-  tr.pStr = pPiece->pszText;
-  tr.pFont = pPiece->pFont;
-  tr.pRect = &pPiece->rtPiece;
-  tr.pWidths = pPiece->pWidths;
-  tr.iLength = iLength;
-  tr.fFontSize = pPiece->fFontSize;
-  tr.iBidiLevel = pPiece->iBidiLevel;
-  tr.iCharRotation = 0;
-  tr.wLineBreakChar = L'\n';
-  tr.iVerticalScale = pPiece->iVerScale;
-  tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab;
-  tr.iHorizontalScale = pPiece->iHorScale;
-  return TRUE;
-}
diff --git a/xfa/src/fxfa/app/xfa_textlayout.h b/xfa/src/fxfa/app/xfa_textlayout.h
deleted file mode 100644
index 2d8d1bf..0000000
--- a/xfa/src/fxfa/app/xfa_textlayout.h
+++ /dev/null
@@ -1,425 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_APP_XFA_TEXTLAYOUT_H_
-#define XFA_SRC_FXFA_APP_XFA_TEXTLAYOUT_H_
-
-#include "xfa/src/fde/css/fde_css.h"
-#include "xfa/src/fde/fde_brush.h"
-#include "xfa/src/fde/fde_renderdevice.h"
-#include "xfa/src/fgas/layout/fgas_rtfbreak.h"
-#include "xfa/src/fxfa/app/xfa_ffdoc.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-#define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001
-
-class CXFA_Para;
-class CXFA_Font;
-class CXFA_TextTabstopsContext;
-
-class IXFA_TextProvider {
- public:
-  virtual ~IXFA_TextProvider() {}
-  virtual CXFA_Node* GetTextNode(FX_BOOL& bRichText) = 0;
-  virtual CXFA_Para GetParaNode() = 0;
-  virtual CXFA_Font GetFontNode() = 0;
-  virtual FX_BOOL IsCheckButtonAndAutoWidth() = 0;
-  virtual CXFA_FFDoc* GetDocNode() = 0;
-  virtual FX_BOOL GetEmbbedObj(FX_BOOL bURI,
-                               FX_BOOL bRaw,
-                               const CFX_WideString& wsAttr,
-                               CFX_WideString& wsValue) = 0;
-};
-
-class CXFA_CSSTagProvider : public IFDE_CSSTagProvider {
- public:
-  CXFA_CSSTagProvider() : m_bTagAviliable(FALSE), m_bContent(FALSE) {}
-  virtual ~CXFA_CSSTagProvider();
-  virtual CFX_WideStringC GetTagName() { return m_wsTagName; }
-  virtual FX_POSITION GetFirstAttribute() {
-    return m_Attributes.GetStartPosition();
-  }
-  virtual void GetNextAttribute(FX_POSITION& pos,
-                                CFX_WideStringC& wsAttr,
-                                CFX_WideStringC& wsValue);
-  void SetTagNameObj(const CFX_WideString& wsName) { m_wsTagName = wsName; }
-  void SetAttribute(const CFX_WideString& wsAttr,
-                    const CFX_WideString& wsValue);
-  FX_BOOL m_bTagAviliable;
-  FX_BOOL m_bContent;
-
- protected:
-  CFX_WideString m_wsTagName;
-  CFX_MapPtrToPtr m_Attributes;
-};
-
-class CXFA_TextParseContext : public CFX_Target {
- public:
-  CXFA_TextParseContext()
-      : m_pParentStyle(nullptr),
-        m_ppMatchedDecls(nullptr),
-        m_dwMatchedDecls(0),
-        m_eDisplay(FDE_CSSDISPLAY_None) {}
-  ~CXFA_TextParseContext() {
-    if (m_pParentStyle)
-      m_pParentStyle->Release();
-    FX_Free(m_ppMatchedDecls);
-  }
-  void SetDisplay(FDE_CSSDISPLAY eDisplay) { m_eDisplay = eDisplay; }
-  FDE_CSSDISPLAY GetDisplay() const { return m_eDisplay; }
-  void SetDecls(const IFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount);
-  const IFDE_CSSDeclaration** GetDecls() {
-    return (const IFDE_CSSDeclaration**)m_ppMatchedDecls;
-  }
-  FX_DWORD CountDecls() const { return m_dwMatchedDecls; }
-  IFDE_CSSComputedStyle* m_pParentStyle;
-
- protected:
-  IFDE_CSSDeclaration** m_ppMatchedDecls;
-  FX_DWORD m_dwMatchedDecls;
-  FDE_CSSDISPLAY m_eDisplay;
-};
-
-class CXFA_TextParser {
- public:
-  CXFA_TextParser() : m_pAllocator(NULL), m_pSelector(NULL), m_pUASheet(NULL) {}
-  virtual ~CXFA_TextParser();
-  void Reset();
-  void DoParse(IFDE_XMLNode* pXMLContainer, IXFA_TextProvider* pTextProvider);
-  IFDE_CSSComputedStyle* CreateRootStyle(IXFA_TextProvider* pTextProvider);
-  IFDE_CSSComputedStyle* ComputeStyle(IFDE_XMLNode* pXMLNode,
-                                      IFDE_CSSComputedStyle* pParentStyle);
-  FX_BOOL IsParsed() const { return m_pAllocator != NULL; }
-
-  int32_t GetVAlgin(IXFA_TextProvider* pTextProvider) const;
-  FX_FLOAT GetTabInterval(IFDE_CSSComputedStyle* pStyle) const;
-  int32_t CountTabs(IFDE_CSSComputedStyle* pStyle) const;
-  FX_BOOL IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const;
-  FX_BOOL GetTabstops(IFDE_CSSComputedStyle* pStyle,
-                      CXFA_TextTabstopsContext* pTabstopContext);
-  IFX_Font* GetFont(IXFA_TextProvider* pTextProvider,
-                    IFDE_CSSComputedStyle* pStyle) const;
-  FX_FLOAT GetFontSize(IXFA_TextProvider* pTextProvider,
-                       IFDE_CSSComputedStyle* pStyle) const;
-  int32_t GetHorScale(IXFA_TextProvider* pTextProvider,
-                      IFDE_CSSComputedStyle* pStyle,
-                      IFDE_XMLNode* pXMLNode) const;
-  int32_t GetVerScale(IXFA_TextProvider* pTextProvider,
-                      IFDE_CSSComputedStyle* pStyle) const;
-  void GetUnderline(IXFA_TextProvider* pTextProvider,
-                    IFDE_CSSComputedStyle* pStyle,
-                    int32_t& iUnderline,
-                    int32_t& iPeriod) const;
-  void GetLinethrough(IXFA_TextProvider* pTextProvider,
-                      IFDE_CSSComputedStyle* pStyle,
-                      int32_t& iLinethrough) const;
-  FX_ARGB GetColor(IXFA_TextProvider* pTextProvider,
-                   IFDE_CSSComputedStyle* pStyle) const;
-  FX_FLOAT GetBaseline(IXFA_TextProvider* pTextProvider,
-                       IFDE_CSSComputedStyle* pStyle) const;
-  FX_FLOAT GetLineHeight(IXFA_TextProvider* pTextProvider,
-                         IFDE_CSSComputedStyle* pStyle,
-                         FX_BOOL bFirst,
-                         FX_FLOAT fVerScale) const;
-  FX_BOOL GetEmbbedObj(IXFA_TextProvider* pTextProvider,
-                       IFDE_XMLNode* pXMLNode,
-                       CFX_WideString& wsValue);
-  CXFA_TextParseContext* GetParseContextFromMap(IFDE_XMLNode* pXMLNode);
-
- private:
-  void InitCSSData(IXFA_TextProvider* pTextProvider);
-  void ParseRichText(IFDE_XMLNode* pXMLNode,
-                     IFDE_CSSComputedStyle* pParentStyle);
-  void ParseTagInfo(IFDE_XMLNode* pXMLNode, CXFA_CSSTagProvider& tagProvider);
-  IFDE_CSSStyleSheet* LoadDefaultSheetStyle();
-  IFDE_CSSComputedStyle* CreateStyle(IFDE_CSSComputedStyle* pParentStyle);
-  IFX_MEMAllocator* m_pAllocator;
-  IFDE_CSSStyleSelector* m_pSelector;
-  IFDE_CSSStyleSheet* m_pUASheet;
-  CFX_MapPtrTemplate<IFDE_XMLNode*, CXFA_TextParseContext*>
-      m_mapXMLNodeToParseContext;
-};
-
-class CXFA_LoaderContext {
- public:
-  CXFA_LoaderContext()
-      : m_bSaveLineHeight(FALSE),
-        m_fWidth(0),
-        m_fHeight(0),
-        m_fLastPos(0),
-        m_fStartLineOffset(0),
-        m_iChar(0),
-        m_iTotalLines(-1),
-        m_pXMLNode(NULL),
-        m_pNode(NULL),
-        m_pParentStyle(NULL),
-        m_dwFlags(0) {}
-  FX_BOOL m_bSaveLineHeight;
-  FX_FLOAT m_fWidth;
-  FX_FLOAT m_fHeight;
-  FX_FLOAT m_fLastPos;
-  FX_FLOAT m_fStartLineOffset;
-  int32_t m_iChar;
-  int32_t m_iLines;
-  int32_t m_iTotalLines;
-  IFDE_XMLNode* m_pXMLNode;
-  CXFA_Node* m_pNode;
-  IFDE_CSSComputedStyle* m_pParentStyle;
-  CFX_ArrayTemplate<FX_FLOAT> m_lineHeights;
-  FX_DWORD m_dwFlags;
-  CFX_FloatArray m_BlocksHeight;
-};
-
-class CXFA_LinkUserData : public IFX_Unknown, public CFX_Target {
- public:
-  CXFA_LinkUserData(IFX_MEMAllocator* pAllocator, FX_WCHAR* pszText)
-      : m_pAllocator(pAllocator), m_dwRefCount(1) {
-    m_pszURLContent = pszText;
-  }
-  ~CXFA_LinkUserData() {}
-  virtual FX_DWORD Release() {
-    FX_DWORD dwRefCount = --m_dwRefCount;
-    if (dwRefCount <= 0) {
-      FXTARGET_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
-    }
-    return dwRefCount;
-  }
-  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
-
- public:
-  const FX_WCHAR* GetLinkURL() { return m_pszURLContent; }
-
- protected:
-  IFX_MEMAllocator* m_pAllocator;
-  FX_DWORD m_dwRefCount;
-  CFX_WideString m_pszURLContent;
-};
-
-class CXFA_TextUserData : public IFX_Unknown, public CFX_Target {
- public:
-  CXFA_TextUserData(IFX_MEMAllocator* pAllocator, IFDE_CSSComputedStyle* pStyle)
-      : m_pStyle(pStyle),
-        m_pLinkData(nullptr),
-        m_pAllocator(pAllocator),
-        m_dwRefCount(0) {
-    FXSYS_assert(m_pAllocator);
-    if (m_pStyle)
-      m_pStyle->AddRef();
-  }
-  CXFA_TextUserData(IFX_MEMAllocator* pAllocator,
-                    IFDE_CSSComputedStyle* pStyle,
-                    CXFA_LinkUserData* pLinkData)
-      : m_pStyle(pStyle),
-        m_pLinkData(pLinkData),
-        m_pAllocator(pAllocator),
-        m_dwRefCount(0) {
-    FXSYS_assert(m_pAllocator);
-    if (m_pStyle)
-      m_pStyle->AddRef();
-  }
-  ~CXFA_TextUserData() {
-    if (m_pStyle)
-      m_pStyle->Release();
-    if (m_pLinkData)
-      m_pLinkData->Release();
-  }
-  virtual FX_DWORD Release() {
-    FX_DWORD dwRefCount = --m_dwRefCount;
-    if (dwRefCount == 0) {
-      FXTARGET_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
-    }
-    return dwRefCount;
-  }
-  virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
-
-  IFDE_CSSComputedStyle* m_pStyle;
-  CXFA_LinkUserData* m_pLinkData;
-
- protected:
-  IFX_MEMAllocator* m_pAllocator;
-  FX_DWORD m_dwRefCount;
-};
-
-class XFA_TextPiece : public CFX_Target {
- public:
-  XFA_TextPiece() : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {}
-  ~XFA_TextPiece() {
-    if (pLinkData)
-      pLinkData->Release();
-  }
-
-  FX_WCHAR* pszText;
-  int32_t iChars;
-  int32_t* pWidths;
-  int32_t iHorScale;
-  int32_t iVerScale;
-  int32_t iBidiLevel;
-  int32_t iUnderline;
-  int32_t iPeriod;
-  int32_t iLineThrough;
-  IFX_Font* pFont;
-  FX_ARGB dwColor;
-  FX_FLOAT fFontSize;
-  CFX_RectF rtPiece;
-  CXFA_LinkUserData* pLinkData;
-};
-typedef CFX_ArrayTemplate<XFA_TextPiece*> CXFA_PieceArray;
-
-class CXFA_PieceLine : public CFX_Target {
- public:
-  CXFA_PieceLine() {}
-  CXFA_PieceArray m_textPieces;
-  CFX_Int32Array m_charCounts;
-};
-typedef CFX_ArrayTemplate<CXFA_PieceLine*> CXFA_PieceLineArray;
-
-struct XFA_TABSTOPS {
-  FX_DWORD dwAlign;
-  FX_FLOAT fTabstops;
-};
-
-class CXFA_TextTabstopsContext {
- public:
-  CXFA_TextTabstopsContext()
-      : m_iTabCount(0),
-        m_iTabIndex(-1),
-        m_bTabstops(FALSE),
-        m_fTabWidth(0),
-        m_fLeft(0) {}
-  void Append(FX_DWORD dwAlign, FX_FLOAT fTabstops) {
-    int32_t i = 0;
-    for (i = 0; i < m_iTabCount; i++) {
-      XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
-      if (fTabstops < pTabstop->fTabstops) {
-        break;
-      }
-    }
-    m_tabstops.InsertSpaceAt(i, 1);
-    XFA_TABSTOPS tabstop;
-    tabstop.dwAlign = dwAlign;
-    tabstop.fTabstops = fTabstops;
-    m_tabstops.SetAt(i, tabstop);
-    m_iTabCount++;
-  }
-  void RemoveAll() {
-    m_tabstops.RemoveAll();
-    m_iTabCount = 0;
-  }
-  void Reset() {
-    m_iTabIndex = -1;
-    m_bTabstops = FALSE;
-    m_fTabWidth = 0;
-    m_fLeft = 0;
-  }
-  CFX_ArrayTemplate<XFA_TABSTOPS> m_tabstops;
-  int32_t m_iTabCount;
-  int32_t m_iTabIndex;
-  FX_BOOL m_bTabstops;
-  FX_FLOAT m_fTabWidth;
-  FX_FLOAT m_fLeft;
-};
-
-class CXFA_TextLayout {
- public:
-  CXFA_TextLayout(IXFA_TextProvider* pTextProvider);
-  virtual ~CXFA_TextLayout();
-  int32_t GetText(CFX_WideString& wsText);
-  FX_FLOAT GetLayoutHeight();
-  FX_FLOAT StartLayout(FX_FLOAT fWidth = -1);
-  FX_BOOL DoLayout(int32_t iBlockIndex,
-                   FX_FLOAT& fCalcHeight,
-                   FX_FLOAT fContentAreaHeight = -1,
-                   FX_FLOAT fTextHeight = -1);
-
-  FX_BOOL CalcSize(const CFX_SizeF& minSize,
-                   const CFX_SizeF& maxSize,
-                   CFX_SizeF& defaultSize);
-  FX_BOOL Layout(const CFX_SizeF& size, FX_FLOAT* fHeight = NULL);
-  void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
-  FX_BOOL DrawString(CFX_RenderDevice* pFxDevice,
-                     const CFX_Matrix& tmDoc2Device,
-                     const CFX_RectF& rtClip,
-                     int32_t iBlock = 0);
-  FX_BOOL IsLoaded() const { return m_pieceLines.GetSize() > 0; }
-  void Unload();
-  const CXFA_PieceLineArray* GetPieceLines();
-
-  FX_BOOL m_bHasBlock;
-  CFX_Int32Array m_Blocks;
-
- private:
-  void GetTextDataNode();
-  IFDE_XMLNode* GetXMLContainerNode();
-  IFX_RTFBreak* CreateBreak(FX_BOOL bDefault);
-  void InitBreak(FX_FLOAT fLineWidth);
-  void InitBreak(IFDE_CSSComputedStyle* pStyle,
-                 FDE_CSSDISPLAY eDisplay,
-                 FX_FLOAT fLineWidth,
-                 IFDE_XMLNode* pXMLNode,
-                 IFDE_CSSComputedStyle* pParentStyle = NULL);
-  FX_BOOL Loader(const CFX_SizeF& szText,
-                 FX_FLOAT& fLinePos,
-                 FX_BOOL bSavePieces = TRUE);
-  void LoadText(CXFA_Node* pNode,
-                const CFX_SizeF& szText,
-                FX_FLOAT& fLinePos,
-                FX_BOOL bSavePieces);
-  FX_BOOL LoadRichText(IFDE_XMLNode* pXMLNode,
-                       const CFX_SizeF& szText,
-                       FX_FLOAT& fLinePos,
-                       IFDE_CSSComputedStyle* pParentStyle,
-                       FX_BOOL bSavePieces,
-                       CXFA_LinkUserData* pLinkData = NULL,
-                       FX_BOOL bEndBreak = TRUE,
-                       FX_BOOL bIsOl = FALSE,
-                       int32_t iLiCount = 0);
-  FX_BOOL AppendChar(const CFX_WideString& wsText,
-                     FX_FLOAT& fLinePos,
-                     FX_FLOAT fSpaceAbove,
-                     FX_BOOL bSavePieces);
-  void AppendTextLine(FX_DWORD dwStatus,
-                      FX_FLOAT& fLinePos,
-                      FX_BOOL bSavePieces,
-                      FX_BOOL bEndBreak = FALSE);
-  void EndBreak(FX_DWORD dwStatus, FX_FLOAT& fLinePos, FX_BOOL bDefault);
-  FX_BOOL IsEnd(FX_BOOL bSavePieces);
-  void ProcessText(CFX_WideString& wsText);
-  void UpdateAlign(FX_FLOAT fHeight, FX_FLOAT fBottom);
-  void RenderString(IFDE_RenderDevice* pDevice,
-                    IFDE_SolidBrush* pBrush,
-                    CXFA_PieceLine* pPieceLine,
-                    int32_t iPiece,
-                    FXTEXT_CHARPOS* pCharPos,
-                    const CFX_Matrix& tmDoc2Device);
-  void RenderPath(IFDE_RenderDevice* pDevice,
-                  IFDE_Pen* pPen,
-                  CXFA_PieceLine* pPieceLine,
-                  int32_t iPiece,
-                  FXTEXT_CHARPOS* pCharPos,
-                  const CFX_Matrix& tmDoc2Device);
-  int32_t GetDisplayPos(const XFA_TextPiece* pPiece,
-                        FXTEXT_CHARPOS* pCharPos,
-                        FX_BOOL bCharCode = FALSE);
-  FX_BOOL ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr);
-  void DoTabstops(IFDE_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine);
-  FX_BOOL Layout(int32_t iBlock);
-  int32_t CountBlocks() const;
-
-  IXFA_TextProvider* m_pTextProvider;
-  CXFA_Node* m_pTextDataNode;
-  FX_BOOL m_bRichText;
-  IFX_MEMAllocator* m_pAllocator;
-  IFX_RTFBreak* m_pBreak;
-  CXFA_LoaderContext* m_pLoader;
-  int32_t m_iLines;
-  FX_FLOAT m_fMaxWidth;
-  CXFA_TextParser m_textParser;
-  CXFA_PieceLineArray m_pieceLines;
-  CXFA_TextTabstopsContext* m_pTabstopContext;
-  FX_BOOL m_bBlockContinue;
-};
-
-#endif  // XFA_SRC_FXFA_APP_XFA_TEXTLAYOUT_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_error.cpp b/xfa/src/fxfa/fm2js/xfa_error.cpp
deleted file mode 100644
index 71706df..0000000
--- a/xfa/src/fxfa/fm2js/xfa_error.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_error.h"
-
-static const FX_WCHAR* const gs_lpStrErrorMsgInfo[] = {
-    L"unsupported char '%c'",         L"bad suffix on number",
-    L"invalidate char '%c'",          L"expected identifier instead of '%s'",
-    L"expected '%s' instead of '%s'", L"expected 'endif' instead of '%s'",
-    L"unexpected expression '%s'",    L"expected operator '%s' instead of '%s'",
-    L"expected non-empty expression",
-};
-
-const FX_WCHAR* XFA_FM_ErrorMsg(XFA_FM_ERRMSG msg) {
-  if (msg < FMERR_MAXIMUM)
-    return gs_lpStrErrorMsgInfo[msg];
-  return L"";
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_error.h b/xfa/src/fxfa/fm2js/xfa_error.h
deleted file mode 100644
index 7c11080..0000000
--- a/xfa/src/fxfa/fm2js/xfa_error.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_ERROR_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_ERROR_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxcrt/fx_system.h"
-
-enum XFA_FM_ERRMSG {
-  FMERR_UNSUPPORTED_CHAR,
-  FMERR_BAD_SUFFIX_NUMBER,
-  FMERR_INVALIDATE_CHAR,
-  FMERR_EXPECTED_IDENTIFIER,
-  FMERR_EXPECTED_TOKEN,
-  FMERR_EXPECTED_IFEND,
-  FMERR_UNEXPECTED_EXPRESSION,
-  FMERR_EXPTECTED_OPERATOR,
-  FMERR_EXPECTED_NON_EMPTY_EXPRESSION,
-  FMERR_MAXIMUM
-};
-
-class CXFA_FMErrorInfo {
- public:
-  CXFA_FMErrorInfo() : linenum(0) {}
-  ~CXFA_FMErrorInfo() {}
-  FX_DWORD linenum;
-  CFX_WideString message;
-};
-const FX_WCHAR* XFA_FM_ErrorMsg(XFA_FM_ERRMSG msg);
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_ERROR_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_expression.cpp b/xfa/src/fxfa/fm2js/xfa_expression.cpp
deleted file mode 100644
index 25c5b4b..0000000
--- a/xfa/src/fxfa/fm2js/xfa_expression.cpp
+++ /dev/null
@@ -1,627 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_expression.h"
-
-#include "core/include/fxcrt/fx_basic.h"
-
-namespace {
-
-const CFX_WideStringC RUNTIMEBLOCKTEMPARRAY =
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array");
-
-const CFX_WideStringC RUNTIMEBLOCKTEMPARRAYINDEX =
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array_index");
-
-}  // namespace
-
-CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line)
-    : m_type(XFA_FM_EXPTYPE_UNKNOWN), m_line(line) {}
-
-CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type)
-    : m_type(type), m_line(line) {}
-
-void CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-
-void CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
-
-CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
-    FX_DWORD line,
-    FX_BOOL isGlobal,
-    const CFX_WideStringC& wsName,
-    CFX_WideStringCArray* pArguments,
-    CFX_PtrArray* pExpressions)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC),
-      m_wsName(wsName),
-      m_pArguments(pArguments),
-      m_pExpressions(pExpressions),
-      m_isGlobal(isGlobal) {}
-
-CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition() {
-  if (m_pArguments) {
-    m_pArguments->RemoveAll();
-    delete m_pArguments;
-  }
-  if (m_pExpressions) {
-    for (int i = 0; i < m_pExpressions->GetSize(); ++i) {
-      delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i));
-    }
-    m_pExpressions->RemoveAll();
-    delete m_pExpressions;
-  }
-}
-
-void CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript) {
-  if (m_isGlobal && (!m_pExpressions || m_pExpressions->GetSize() == 0)) {
-    javascript << FX_WSTRC(L"// comments only");
-    return;
-  }
-  if (m_isGlobal) {
-    javascript << FX_WSTRC(L"(\n");
-  }
-  javascript << FX_WSTRC(L"function ");
-  if (m_wsName.GetAt(0) == L'!') {
-    CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
-    javascript << tempName;
-  } else {
-    javascript << m_wsName;
-  }
-  javascript << FX_WSTRC(L"(");
-  if (m_pArguments != 0) {
-    CFX_WideStringC identifier = 0;
-    for (int i = 0; i < m_pArguments->GetSize(); ++i) {
-      identifier = m_pArguments->GetAt(i);
-      if (identifier.GetAt(0) == L'!') {
-        CFX_WideString tempIdentifier =
-            EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1);
-        javascript << tempIdentifier;
-      } else {
-        javascript << identifier;
-      }
-      if (i + 1 < m_pArguments->GetSize()) {
-        javascript << FX_WSTRC(L", ");
-      }
-    }
-  }
-  javascript << FX_WSTRC(L")\n{\n");
-  javascript << FX_WSTRC(L"var ");
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = null;\n");
-  if (m_pExpressions) {
-    for (int i = 0; i < m_pExpressions->GetSize(); ++i) {
-      CXFA_FMExpression* e =
-          reinterpret_cast<CXFA_FMExpression*>(m_pExpressions->GetAt(i));
-      if (i + 1 < m_pExpressions->GetSize()) {
-        e->ToJavaScript(javascript);
-      } else {
-        e->ToImpliedReturnJS(javascript);
-      }
-    }
-  }
-  javascript << FX_WSTRC(L"return ");
-  if (m_isGlobal) {
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    javascript << RUNTIMEFUNCTIONRETURNVALUE;
-    javascript << FX_WSTRC(L")");
-  } else {
-    javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  }
-  javascript << FX_WSTRC(L";\n}\n");
-  if (m_isGlobal) {
-    javascript << FX_WSTRC(L").call(this);\n");
-  }
-}
-
-void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&) {}
-
-CXFA_FMVarExpression::CXFA_FMVarExpression(FX_DWORD line,
-                                           const CFX_WideStringC& wsName,
-                                           CXFA_FMExpression* pInit)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR),
-      m_wsName(wsName),
-      m_pInit(pInit) {}
-
-void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"var ");
-  CFX_WideString tempName = m_wsName;
-  if (m_wsName.GetAt(0) == L'!') {
-    tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
-  }
-  javascript << tempName;
-  javascript << FX_WSTRC(L" = ");
-  if (m_pInit) {
-    m_pInit->ToJavaScript(javascript);
-    javascript << tempName;
-    javascript << FX_WSTRC(L" = ");
-    javascript << XFA_FM_EXPTypeToString(VARFILTER);
-    javascript << FX_WSTRC(L"(");
-    javascript << tempName;
-    javascript << FX_WSTRC(L");\n");
-  } else {
-    javascript << FX_WSTRC(L"\"\";\n");
-  }
-}
-
-void CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"var ");
-  CFX_WideString tempName = m_wsName;
-  if (m_wsName.GetAt(0) == L'!') {
-    tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);
-  }
-  javascript << tempName;
-  javascript << FX_WSTRC(L" = ");
-  if (m_pInit) {
-    m_pInit->ToJavaScript(javascript);
-    javascript << tempName;
-    javascript << FX_WSTRC(L" = ");
-    javascript << XFA_FM_EXPTypeToString(VARFILTER);
-    javascript << FX_WSTRC(L"(");
-    javascript << tempName;
-    javascript << FX_WSTRC(L");\n");
-  } else {
-    javascript << FX_WSTRC(L"\"\";\n");
-  }
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = ");
-  javascript << tempName;
-  javascript << FX_WSTRC(L";\n");
-}
-
-CXFA_FMExpExpression::CXFA_FMExpExpression(FX_DWORD line,
-                                           CXFA_FMSimpleExpression* pExpression)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) {}
-
-void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  if (m_pExpression->GetOperatorToken() == TOKassign) {
-    m_pExpression->ToJavaScript(javascript);
-  } else {
-    m_pExpression->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L";\n");
-  }
-}
-
-void CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  if (m_pExpression->GetOperatorToken() == TOKassign) {
-    m_pExpression->ToImpliedReturnJS(javascript);
-  } else {
-    if (m_pExpression->GetOperatorToken() == TOKstar ||
-        m_pExpression->GetOperatorToken() == TOKdotstar ||
-        m_pExpression->GetOperatorToken() == TOKdotscream ||
-        m_pExpression->GetOperatorToken() == TOKdotdot ||
-        m_pExpression->GetOperatorToken() == TOKdot) {
-      javascript << RUNTIMEFUNCTIONRETURNVALUE;
-      javascript << FX_WSTRC(L" = ");
-      javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-      javascript << FX_WSTRC(L"(");
-      m_pExpression->ToJavaScript(javascript);
-      javascript << FX_WSTRC(L");\n");
-    } else {
-      javascript << RUNTIMEFUNCTIONRETURNVALUE;
-      javascript << FX_WSTRC(L" = ");
-      m_pExpression->ToJavaScript(javascript);
-      javascript << FX_WSTRC(L";\n");
-    }
-  }
-}
-
-CXFA_FMBlockExpression::CXFA_FMBlockExpression(FX_DWORD line,
-                                               CFX_PtrArray* pExpressionList)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK),
-      m_pExpressionList(pExpressionList) {}
-
-CXFA_FMBlockExpression::~CXFA_FMBlockExpression() {
-  if (m_pExpressionList) {
-    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
-      delete reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
-    }
-    m_pExpressionList->RemoveAll();
-    delete m_pExpressionList;
-  }
-}
-
-void CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"{\n");
-  if (m_pExpressionList) {
-    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
-      CXFA_FMExpression* e =
-          reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
-      e->ToJavaScript(javascript);
-    }
-  }
-  javascript << FX_WSTRC(L"}\n");
-}
-
-void CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"{\n");
-  if (m_pExpressionList) {
-    for (int i = 0; i < m_pExpressionList->GetSize(); ++i) {
-      CXFA_FMExpression* e =
-          reinterpret_cast<CXFA_FMExpression*>(m_pExpressionList->GetAt(i));
-      if (i + 1 == m_pExpressionList->GetSize()) {
-        e->ToImpliedReturnJS(javascript);
-      } else {
-        e->ToJavaScript(javascript);
-      }
-    }
-  }
-  javascript << FX_WSTRC(L"}\n");
-}
-
-CXFA_FMDoExpression::CXFA_FMDoExpression(FX_DWORD line,
-                                         CXFA_FMExpression* pList)
-    : CXFA_FMExpression(line), m_pList(pList) {}
-
-void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  m_pList->ToJavaScript(javascript);
-}
-
-void CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  m_pList->ToImpliedReturnJS(javascript);
-}
-
-CXFA_FMIfExpression::CXFA_FMIfExpression(FX_DWORD line,
-                                         CXFA_FMSimpleExpression* pExpression,
-                                         CXFA_FMExpression* pIfExpression,
-                                         CXFA_FMExpression* pElseExpression)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF),
-      m_pExpression(pExpression),
-      m_pIfExpression(pIfExpression),
-      m_pElseExpression(pElseExpression) {}
-
-void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"if (");
-  if (m_pExpression) {
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pExpression->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L")");
-  }
-  javascript << FX_WSTRC(L")\n");
-  if (m_pIfExpression) {
-    m_pIfExpression->ToJavaScript(javascript);
-  }
-  if (m_pElseExpression) {
-    if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
-      javascript << FX_WSTRC(L"else\n");
-      javascript << FX_WSTRC(L"{\n");
-      m_pElseExpression->ToJavaScript(javascript);
-      javascript << FX_WSTRC(L"}\n");
-    } else {
-      javascript << FX_WSTRC(L"else\n");
-      m_pElseExpression->ToJavaScript(javascript);
-    }
-  }
-}
-
-void CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"if (");
-  if (m_pExpression) {
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pExpression->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L")");
-  }
-  javascript << FX_WSTRC(L")\n");
-  if (m_pIfExpression) {
-    m_pIfExpression->ToImpliedReturnJS(javascript);
-  }
-  if (m_pElseExpression) {
-    if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {
-      javascript << FX_WSTRC(L"else\n");
-      javascript << FX_WSTRC(L"{\n");
-      m_pElseExpression->ToImpliedReturnJS(javascript);
-      javascript << FX_WSTRC(L"}\n");
-    } else {
-      javascript << FX_WSTRC(L"else\n");
-      m_pElseExpression->ToImpliedReturnJS(javascript);
-    }
-  }
-}
-
-CXFA_FMLoopExpression::~CXFA_FMLoopExpression() {}
-
-void CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-
-void CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&) {}
-
-CXFA_FMWhileExpression::CXFA_FMWhileExpression(
-    FX_DWORD line,
-    CXFA_FMSimpleExpression* pCondition,
-    CXFA_FMExpression* pExpression)
-    : CXFA_FMLoopExpression(line),
-      m_pCondition(pCondition),
-      m_pExpression(pExpression) {}
-
-void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"while (");
-  m_pCondition->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")\n");
-  m_pExpression->ToJavaScript(javascript);
-}
-
-void CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"while (");
-  m_pCondition->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")\n");
-  m_pExpression->ToImpliedReturnJS(javascript);
-}
-
-CXFA_FMBreakExpression::CXFA_FMBreakExpression(FX_DWORD line)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK) {}
-
-CXFA_FMBreakExpression::~CXFA_FMBreakExpression() {}
-
-void CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"break;\n");
-}
-
-void CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"break;\n");
-}
-
-CXFA_FMContinueExpression::CXFA_FMContinueExpression(FX_DWORD line)
-    : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE) {}
-
-CXFA_FMContinueExpression::~CXFA_FMContinueExpression() {}
-
-void CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"continue;\n");
-}
-
-void CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"continue;\n");
-}
-
-CXFA_FMForExpression::CXFA_FMForExpression(FX_DWORD line,
-                                           const CFX_WideStringC& wsVariant,
-                                           CXFA_FMSimpleExpression* pAssignment,
-                                           CXFA_FMSimpleExpression* pAccessor,
-                                           int32_t iDirection,
-                                           CXFA_FMSimpleExpression* pStep,
-                                           CXFA_FMExpression* pList)
-    : CXFA_FMLoopExpression(line),
-      m_wsVariant(wsVariant),
-      m_pAssignment(pAssignment),
-      m_pAccessor(pAccessor),
-      m_iDirection(iDirection),
-      m_pStep(pStep),
-      m_pList(pList) {}
-
-void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"{\nvar ");
-  CFX_WideString tempVariant;
-  if (m_wsVariant.GetAt(0) == L'!') {
-    tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
-    javascript << tempVariant;
-  } else {
-    tempVariant = m_wsVariant;
-    javascript << m_wsVariant;
-  }
-  javascript << FX_WSTRC(L" = null;\n");
-  javascript << FX_WSTRC(L"for (");
-  javascript << tempVariant;
-  javascript << FX_WSTRC(L" = ");
-  javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-  javascript << FX_WSTRC(L"(");
-  m_pAssignment->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"); ");
-  javascript << tempVariant;
-  if (m_iDirection == 1) {
-    javascript << FX_WSTRC(L" <= ");
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pAccessor->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L"); ");
-    javascript << tempVariant;
-    javascript << FX_WSTRC(L" += ");
-  } else {
-    javascript << FX_WSTRC(L" >= ");
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pAccessor->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L"); ");
-    javascript << tempVariant;
-    javascript << FX_WSTRC(L" -= ");
-  }
-  if (m_pStep) {
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pStep->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L")");
-  } else {
-    javascript << FX_WSTRC(L"1");
-  }
-  javascript << FX_WSTRC(L")\n");
-  m_pList->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"}\n");
-}
-
-void CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"{\nvar ");
-  CFX_WideString tempVariant;
-  if (m_wsVariant.GetAt(0) == L'!') {
-    tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);
-    javascript << tempVariant;
-  } else {
-    tempVariant = m_wsVariant;
-    javascript << m_wsVariant;
-  }
-  javascript << FX_WSTRC(L" = null;\n");
-  javascript << FX_WSTRC(L"for (");
-  javascript << tempVariant;
-  javascript << FX_WSTRC(L" = ");
-  javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-  javascript << FX_WSTRC(L"(");
-  m_pAssignment->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"); ");
-  javascript << tempVariant;
-  if (m_iDirection == 1) {
-    javascript << FX_WSTRC(L" <= ");
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pAccessor->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L"); ");
-    javascript << tempVariant;
-    javascript << FX_WSTRC(L" += ");
-  } else {
-    javascript << FX_WSTRC(L" >= ");
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pAccessor->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L"); ");
-    javascript << tempVariant;
-    javascript << FX_WSTRC(L" -= ");
-  }
-  if (m_pStep) {
-    javascript << XFA_FM_EXPTypeToString(GETFMVALUE);
-    javascript << FX_WSTRC(L"(");
-    m_pStep->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L")");
-  } else {
-    javascript << FX_WSTRC(L"1");
-  }
-  javascript << FX_WSTRC(L")\n");
-  m_pList->ToImpliedReturnJS(javascript);
-  javascript << FX_WSTRC(L"}\n");
-}
-
-CXFA_FMForeachExpression::CXFA_FMForeachExpression(
-    FX_DWORD line,
-    const CFX_WideStringC& wsIdentifier,
-    CFX_PtrArray* pAccessors,
-    CXFA_FMExpression* pList)
-    : CXFA_FMLoopExpression(line),
-      m_wsIdentifier(wsIdentifier),
-      m_pAccessors(pAccessors),
-      m_pList(pList) {}
-
-CXFA_FMForeachExpression::~CXFA_FMForeachExpression() {
-  if (m_pAccessors) {
-    for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
-      delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
-    }
-    m_pAccessors->RemoveAll();
-    delete m_pAccessors;
-  }
-}
-
-void CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"{\n");
-  javascript << FX_WSTRC(L"var ");
-  if (m_wsIdentifier.GetAt(0) == L'!') {
-    CFX_WideString tempIdentifier =
-        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
-    javascript << tempIdentifier;
-  } else {
-    javascript << m_wsIdentifier;
-  }
-  javascript << FX_WSTRC(L" = null;\n");
-  javascript << FX_WSTRC(L"var ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L" = ");
-  javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
-  javascript << FX_WSTRC(L"(");
-
-  for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
-    CXFA_FMSimpleExpression* s =
-        reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
-    s->ToJavaScript(javascript);
-    if (i + 1 < m_pAccessors->GetSize()) {
-      javascript << FX_WSTRC(L", ");
-    }
-  }
-  javascript << FX_WSTRC(L");\n");
-  javascript << FX_WSTRC(L"var ");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"while(");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L" < ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L".length)\n{\n");
-  if (m_wsIdentifier.GetAt(0) == L'!') {
-    CFX_WideString tempIdentifier =
-        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
-    javascript << tempIdentifier;
-  } else {
-    javascript << m_wsIdentifier;
-  }
-  javascript << FX_WSTRC(L" = ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L"[");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L"++];\n");
-  m_pList->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"}\n");
-  javascript << FX_WSTRC(L"}\n");
-}
-
-void CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"{\n");
-  javascript << FX_WSTRC(L"var ");
-  if (m_wsIdentifier.GetAt(0) == L'!') {
-    CFX_WideString tempIdentifier =
-        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
-    javascript << tempIdentifier;
-  } else {
-    javascript << m_wsIdentifier;
-  }
-  javascript << FX_WSTRC(L" = null;\n");
-  javascript << FX_WSTRC(L"var ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L" = ");
-  javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);
-  javascript << FX_WSTRC(L"(");
-  for (int i = 0; i < m_pAccessors->GetSize(); ++i) {
-    CXFA_FMSimpleExpression* s =
-        reinterpret_cast<CXFA_FMSimpleExpression*>(m_pAccessors->GetAt(i));
-    s->ToJavaScript(javascript);
-    if (i + 1 < m_pAccessors->GetSize()) {
-      javascript << FX_WSTRC(L", ");
-    }
-  }
-  javascript << FX_WSTRC(L");\n");
-  javascript << FX_WSTRC(L"var ");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L" = 0;\n");
-  javascript << FX_WSTRC(L"while(");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L" < ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L".length)\n{\n");
-  if (m_wsIdentifier.GetAt(0) == L'!') {
-    CFX_WideString tempIdentifier =
-        EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);
-    javascript << tempIdentifier;
-  } else {
-    javascript << m_wsIdentifier;
-  }
-  javascript << FX_WSTRC(L" = ");
-  javascript << RUNTIMEBLOCKTEMPARRAY;
-  javascript << FX_WSTRC(L"[");
-  javascript << RUNTIMEBLOCKTEMPARRAYINDEX;
-  javascript << FX_WSTRC(L"++];\n");
-  m_pList->ToImpliedReturnJS(javascript);
-  javascript << FX_WSTRC(L"}\n");
-  javascript << FX_WSTRC(L"}\n");
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_expression.h b/xfa/src/fxfa/fm2js/xfa_expression.h
deleted file mode 100644
index ffcce1c..0000000
--- a/xfa/src/fxfa/fm2js/xfa_expression.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_EXPRESSION_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_EXPRESSION_H_
-
-#include <memory>
-
-#include "xfa/src/fxfa/fm2js/xfa_simpleexpression.h"
-
-enum XFA_FM_EXPTYPE {
-  XFA_FM_EXPTYPE_UNKNOWN,
-  XFA_FM_EXPTYPE_FUNC,
-  XFA_FM_EXPTYPE_VAR,
-  XFA_FM_EXPTYPE_EXP,
-  XFA_FM_EXPTYPE_BLOCK,
-  XFA_FM_EXPTYPE_IF,
-  XFA_FM_EXPTYPE_BREAK,
-  XFA_FM_EXPTYPE_CONTINUE,
-};
-
-class CXFA_FMExpression {
- public:
-  explicit CXFA_FMExpression(FX_DWORD line);
-  CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type);
-  virtual ~CXFA_FMExpression() {}
-  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
-  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
-  FX_DWORD GetLine() { return m_line; }
-  XFA_FM_EXPTYPE GetExpType() const { return m_type; }
-
- protected:
-  XFA_FM_EXPTYPE m_type;
-  FX_DWORD m_line;
-};
-
-class CXFA_FMFunctionDefinition : public CXFA_FMExpression {
- public:
-  CXFA_FMFunctionDefinition(FX_DWORD line,
-                            FX_BOOL isGlobal,
-                            const CFX_WideStringC& wsName,
-                            CFX_WideStringCArray* pArguments,
-                            CFX_PtrArray* pExpressions);
-  ~CXFA_FMFunctionDefinition() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  CFX_WideStringC m_wsName;
-  CFX_WideStringCArray* m_pArguments;
-  CFX_PtrArray* m_pExpressions;
-  FX_BOOL m_isGlobal;
-};
-
-class CXFA_FMVarExpression : public CXFA_FMExpression {
- public:
-  CXFA_FMVarExpression(FX_DWORD line,
-                       const CFX_WideStringC& wsName,
-                       CXFA_FMExpression* pInit);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  CFX_WideStringC m_wsName;
-  std::unique_ptr<CXFA_FMExpression> m_pInit;
-};
-
-class CXFA_FMExpExpression : public CXFA_FMExpression {
- public:
-  CXFA_FMExpExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExpression);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pExpression;
-};
-
-class CXFA_FMBlockExpression : public CXFA_FMExpression {
- public:
-  CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray* pExpressionList);
-  ~CXFA_FMBlockExpression() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  CFX_PtrArray* m_pExpressionList;
-};
-
-class CXFA_FMDoExpression : public CXFA_FMExpression {
- public:
-  CXFA_FMDoExpression(FX_DWORD line, CXFA_FMExpression* pList);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  std::unique_ptr<CXFA_FMExpression> m_pList;
-};
-
-class CXFA_FMIfExpression : public CXFA_FMExpression {
- public:
-  CXFA_FMIfExpression(FX_DWORD line,
-                      CXFA_FMSimpleExpression* pExpression,
-                      CXFA_FMExpression* pIfExpression,
-                      CXFA_FMExpression* pElseExpression);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pExpression;
-  std::unique_ptr<CXFA_FMExpression> m_pIfExpression;
-  std::unique_ptr<CXFA_FMExpression> m_pElseExpression;
-};
-
-class CXFA_FMLoopExpression : public CXFA_FMExpression {
- public:
-  explicit CXFA_FMLoopExpression(FX_DWORD line) : CXFA_FMExpression(line) {}
-  ~CXFA_FMLoopExpression() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-};
-
-class CXFA_FMWhileExpression : public CXFA_FMLoopExpression {
- public:
-  CXFA_FMWhileExpression(FX_DWORD line,
-                         CXFA_FMSimpleExpression* pCodition,
-                         CXFA_FMExpression* pExpression);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pCondition;
-  std::unique_ptr<CXFA_FMExpression> m_pExpression;
-};
-
-class CXFA_FMBreakExpression : public CXFA_FMExpression {
- public:
-  explicit CXFA_FMBreakExpression(FX_DWORD line);
-  ~CXFA_FMBreakExpression() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-};
-
-class CXFA_FMContinueExpression : public CXFA_FMExpression {
- public:
-  explicit CXFA_FMContinueExpression(FX_DWORD line);
-  ~CXFA_FMContinueExpression() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-};
-
-class CXFA_FMForExpression : public CXFA_FMLoopExpression {
- public:
-  CXFA_FMForExpression(FX_DWORD line,
-                       const CFX_WideStringC& wsVariant,
-                       CXFA_FMSimpleExpression* pAssignment,
-                       CXFA_FMSimpleExpression* pAccessor,
-                       int32_t iDirection,
-                       CXFA_FMSimpleExpression* pStep,
-                       CXFA_FMExpression* pList);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  CFX_WideStringC m_wsVariant;
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pAssignment;
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pAccessor;
-  int32_t m_iDirection;
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pStep;
-  std::unique_ptr<CXFA_FMExpression> m_pList;
-};
-
-class CXFA_FMForeachExpression : public CXFA_FMLoopExpression {
- public:
-  CXFA_FMForeachExpression(FX_DWORD line,
-                           const CFX_WideStringC& wsIdentifier,
-                           CFX_PtrArray* pAccessors,
-                           CXFA_FMExpression* pList);
-  ~CXFA_FMForeachExpression() override;
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf&) override;
-
- private:
-  CFX_WideStringC m_wsIdentifier;
-  CFX_PtrArray* m_pAccessors;
-  std::unique_ptr<CXFA_FMExpression> m_pList;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_EXPRESSION_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_fm2jsapi.cpp b/xfa/src/fxfa/fm2js/xfa_fm2jsapi.cpp
deleted file mode 100644
index c59aedc..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fm2jsapi.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jscontext.h"
-#include "xfa/src/fxfa/fm2js/xfa_program.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int32_t XFA_FM2JS_Translate(const CFX_WideStringC& wsFormcalc,
-                            CFX_WideTextBuf& wsJavascript,
-                            CFX_WideString& wsError) {
-  if (wsFormcalc.IsEmpty()) {
-    wsJavascript.Clear();
-    wsError.Empty();
-    return 0;
-  }
-  int32_t status = 0;
-  CXFA_FMProgram program;
-  status = program.Init(wsFormcalc);
-  if (status) {
-    wsError = program.GetError().message;
-    return status;
-  }
-  status = program.ParseProgram();
-  if (status) {
-    wsError = program.GetError().message;
-    return status;
-  }
-  program.TranslateProgram(wsJavascript);
-  return 0;
-}
-XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate() {
-  return (XFA_HFM2JSCONTEXT)CXFA_FM2JSContext::Create();
-}
-void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext,
-                                 FXJSE_HRUNTIME hScriptRuntime,
-                                 FXJSE_HCONTEXT hScriptContext,
-                                 CXFA_Document* pDocument) {
-  CXFA_FM2JSContext* pContext =
-      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
-  pContext->Initialize(hScriptRuntime, hScriptContext, pDocument);
-}
-void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext,
-                                    FXJSE_HVALUE hValue) {
-  CXFA_FM2JSContext* pContext =
-      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
-  pContext->GlobalPropertyGetter(hValue);
-}
-void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext) {
-  CXFA_FM2JSContext* pContext =
-      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
-  pContext->Release();
-}
-#ifdef __cplusplus
-}
-#endif
diff --git a/xfa/src/fxfa/fm2js/xfa_fm2jsapi.h b/xfa/src/fxfa/fm2js/xfa_fm2jsapi.h
deleted file mode 100644
index ce6d7c9..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fm2jsapi.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_FM2JSAPI_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_FM2JSAPI_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/include/fxjse/fxjse.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-#define FOXIT_XFA_FM2JS_FORMCALC_RUNTIME "foxit_xfa_formcalc_runtime"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct XFA_HFM2JSCONTEXT_ { void** pData; } * XFA_HFM2JSCONTEXT;
-int32_t XFA_FM2JS_Translate(const CFX_WideStringC& wsFormcalc,
-                            CFX_WideTextBuf& wsJavascript,
-                            CFX_WideString& wsError);
-XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate();
-void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext,
-                                 FXJSE_HRUNTIME hScriptRuntime,
-                                 FXJSE_HCONTEXT hScriptContext,
-                                 CXFA_Document* pDocument);
-void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext,
-                                    FXJSE_HVALUE hValue);
-void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_FM2JSAPI_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/src/fxfa/fm2js/xfa_fm2jscontext.cpp
deleted file mode 100644
index c27223a..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ /dev/null
@@ -1,7223 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jscontext.h"
-
-#include <time.h>
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/localization/fgas_locale.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-
-#define FINANCIAL_PRECISION 0.00000001
-
-namespace {
-
-struct XFA_FMHtmlReserveCode {
-  uint32_t m_uCode;
-  const FX_WCHAR* m_htmlReserve;
-};
-struct XFA_FMHtmlHashedReserveCode {
-  uint32_t m_uHash;
-  const FX_WCHAR* m_htmlReserve;
-  uint32_t m_uCode;
-};
-
-const XFA_FMHtmlHashedReserveCode reservesForDecode[] = {
-    {0x00018b62, L"Mu", 924},       {0x00019083, L"Nu", 925},
-    {0x00019ab9, L"Pi", 928},       {0x0001c3c1, L"Xi", 926},
-    {0x000210ac, L"ge", 8805},      {0x000210bb, L"gt", 62},
-    {0x00022a51, L"le", 8804},      {0x00022a60, L"lt", 60},
-    {0x00022f82, L"mu", 956},       {0x00023493, L"ne", 8800},
-    {0x00023497, L"ni", 8715},      {0x000234a3, L"nu", 957},
-    {0x000239c1, L"or", 8744},      {0x00023ed9, L"pi", 960},
-    {0x000267e1, L"xi", 958},       {0x00c41789, L"lceil", 8968},
-    {0x00eef34f, L"thetasym", 977}, {0x012d7ead, L"lcirc", 206},
-    {0x01637b56, L"agrave", 224},   {0x020856da, L"crarr", 8629},
-    {0x022188c3, L"gamma", 947},    {0x033586d3, L"nbsp", 160},
-    {0x04f4c358, L"nsub", 8836},    {0x0581466a, L"dagger", 8224},
-    {0x06b1f790, L"oelig", 339},    {0x06e490d4, L"Chi", 935},
-    {0x0718c6a1, L"ETH", 208},      {0x07196ada, L"Eta", 919},
-    {0x07f667ca, L"Ugrave", 217},   {0x083a8a21, L"Phi", 934},
-    {0x083ac28c, L"Psi", 936},      {0x086f26a9, L"Rho", 929},
-    {0x089b5b51, L"aring", 229},    {0x08a39f4a, L"Tau", 932},
-    {0x08b6188b, L"THORN", 222},    {0x09ce792a, L"icirc", 238},
-    {0x09f9d61e, L"amp", 38},       {0x09f9db33, L"and", 8743},
-    {0x09f9db36, L"ang", 8736},     {0x0a2e3514, L"cap", 8745},
-    {0x0a2e58f4, L"chi", 967},      {0x0a2e9ba8, L"cup", 8746},
-    {0x0a4897d0, L"deg", 176},      {0x0a6332fa, L"eta", 951},
-    {0x0a633301, L"eth", 240},      {0x0acc4d4b, L"int", 8747},
-    {0x0b1b3d35, L"loz", 9674},     {0x0b1b4c8b, L"lrm", 8206},
-    {0x0b4fd9b1, L"not", 172},      {0x0b845241, L"phi", 966},
-    {0x0b84576f, L"piv", 982},      {0x0b848aac, L"psi", 968},
-    {0x0bb8df5e, L"reg", 174},      {0x0bb8eec9, L"rho", 961},
-    {0x0bb9034b, L"rlm", 8207},     {0x0bd33d14, L"shy", 173},
-    {0x0bd34229, L"sim", 8764},     {0x0bd37faa, L"sub", 8834},
-    {0x0bd37fb5, L"sum", 8721},     {0x0bd37fb8, L"sup", 8835},
-    {0x0bed676a, L"tau", 964},      {0x0c07f32e, L"uml", 168},
-    {0x0c71032c, L"yen", 165},      {0x0c7f2889, L"szlig", 223},
-    {0x0c8badbb, L"zwj", 8205},     {0x10ba4dba, L"Egrave", 200},
-    {0x10f1ea24, L"para", 182},     {0x10f1ea37, L"part", 8706},
-    {0x115b2337, L"perp", 8869},    {0x12b10d15, L"prod", 8719},
-    {0x12b10d21, L"prop", 8733},    {0x12dfa9f4, L"rfloor", 8971},
-    {0x12eb4736, L"Agrave", 192},   {0x12fff2b7, L"pund", 163},
-    {0x13fda9f2, L"tilde", 732},    {0x1417fd62, L"times", 215},
-    {0x154fc726, L"ecirc", 234},    {0x165aa451, L"sigma", 963},
-    {0x1709124a, L"Dagger", 8225},  {0x192f78d5, L"iexcl", 161},
-    {0x1b7ed8d7, L"rArr", 8658},    {0x1ec88c68, L"rang", 9002},
-    {0x1ec8a0f7, L"rarr", 8594},    {0x1eda07f3, L"atilde", 227},
-    {0x1f3182c4, L"real", 8476},    {0x1fc34f8b, L"yacute", 253},
-    {0x20d11522, L"acirc", 226},    {0x21933a9b, L"rsaquo", 8250},
-    {0x21f44907, L"uacute", 250},   {0x220cca72, L"acute", 180},
-    {0x242cded1, L"alefsym", 8501}, {0x2655c66a, L"delta", 948},
-    {0x269e4b4d, L"exist", 8707},   {0x273379fa, L"micro", 181},
-    {0x27a37440, L"forall", 8704},  {0x2854e62c, L"minus", 8722},
-    {0x28636f81, L"cedil", 184},    {0x2887357b, L"iacute", 237},
-    {0x2994d5ff, L"frac12", 189},   {0x2994d601, L"frac14", 188},
-    {0x2994e043, L"frac34", 190},   {0x2a1feb41, L"lambda", 955},
-    {0x2ab215f3, L"apos", 39},      {0x2ab82ef7, L"eacute", 233},
-    {0x2b3592ef, L"auml", 228},     {0x2ce92873, L"aacute", 225},
-    {0x2daff48a, L"oslash", 248},   {0x2ef68882, L"aelig", 230},
-    {0x3061d3d3, L"Atilde", 195},   {0x314b1b6b, L"Yacute", 221},
-    {0x337c14e7, L"Uacute", 218},   {0x37676aca, L"cent", 162},
-    {0x37d0b841, L"circ", 710},     {0x386e7947, L"cong", 8773},
-    {0x386e839b, L"copy", 169},     {0x3a0e225a, L"Epsilon", 917},
-    {0x3ba7b721, L"Lambda", 923},   {0x3bd9abe6, L"Alpha", 913},
-    {0x3c3ffad7, L"Eacute", 201},   {0x3cfaf69f, L"brvbar", 166},
-    {0x3d54a489, L"omega", 969},    {0x3e70f453, L"Aacute", 193},
-    {0x3f37c06a, L"Oslash", 216},   {0x40e1b34e, L"diams", 9830},
-    {0x416596df, L"plusmn", 177},   {0x4354ff16, L"Ucirc", 219},
-    {0x454fce6a, L"Upsilon", 933},  {0x4610ad35, L"emsp", 8195},
-    {0x462afb76, L"ensp", 8194},    {0x46e30073, L"euml", 235},
-    {0x46e31a1b, L"euro", 8364},    {0x46f2eada, L"lowast", 8727},
-    {0x4dca26cf, L"Auml", 196},     {0x4e2d6083, L"image", 8465},
-    {0x4f964ee8, L"notin", 8713},   {0x50917a7a, L"epsilon", 949},
-    {0x52f9a4cd, L"Kappa", 922},    {0x5496f410, L"Ocirc", 212},
-    {0x568cbf34, L"zeta", 950},     {0x57badd20, L"ntilde", 241},
-    {0x58662109, L"zwnj", 8204},    {0x5b39870f, L"empty", 8709},
-    {0x5bd3268a, L"upsilon", 965},  {0x5e2bf8a3, L"Gamma", 915},
-    {0x5f73c13a, L"rsquo", 8217},   {0x61f2bc4d, L"iota", 953},
-    {0x625bbcf3, L"isin", 8712},    {0x62906df7, L"iuml", 239},
-    {0x64a5cb31, L"Aring", 197},    {0x66f25c4a, L"sbquo", 8218},
-    {0x6851ab60, L"spades", 9824},  {0x6942a900, L"Ntilde", 209},
-    {0x69779453, L"Euml", 203},     {0x6cda6e23, L"current", 164},
-    {0x70b5b634, L"lsquo", 8216},   {0x715a3706, L"Ecirc", 202},
-    {0x71e8bf8d, L"tdquo", 8221},   {0x72651431, L"Sigma", 931},
-    {0x7569813b, L"iquest", 191},   {0x776a436a, L"equiv", 8801},
-    {0x79215314, L"Zeta", 918},     {0x79b81224, L"ograve", 242},
-    {0x7c2f8b23, L"macr", 175},     {0x7cdb8502, L"Acirc", 194},
-    {0x8185c62e, L"ndash", 8211},   {0x8260364a, L"Delta", 916},
-    {0x846619ad, L"mdash", 8212},   {0x8550fb50, L"OElig", 338},
-    {0x88eb5b85, L"ldquo", 8220},   {0x8b3fde04, L"Ograve", 210},
-    {0x8bc5794b, L"ordf", 170},     {0x8bc57952, L"ordm", 186},
-    {0x8c14923d, L"ouml", 246},     {0x8c5a7cd6, L"theta", 952},
-    {0x8d61812b, L"thorn", 254},    {0x912b95aa, L"asymp", 8776},
-    {0x947faf81, L"middot", 183},   {0x9629202e, L"lfloor", 8970},
-    {0x972e9ec1, L"otilde", 245},   {0x9748f231, L"otimes", 8855},
-    {0x995f1469, L"Omega", 937},    {0x99eb5349, L"quot", 34},
-    {0x9aeb639e, L"hellip", 8230},  {0xa0ae2f86, L"Scaron", 352},
-    {0xa4dcb0d5, L"lsaquo", 8249},  {0xa53dbf41, L"oacute", 243},
-    {0xa5ae9e7b, L"bdquo", 8222},   {0xa602d7ba, L"sdot", 8901},
-    {0xa61ce86f, L"sect", 167},     {0xa6e4c3d7, L"sigmaf", 962},
-    {0xa7c1c74f, L"sube", 8838},    {0xa7c20ee9, L"sup1", 185},
-    {0xa7c20eea, L"sup2", 178},     {0xa7c20eeb, L"sup3", 179},
-    {0xa7c20f1d, L"supe", 8839},    {0xa8b66aa1, L"Otilde", 213},
-    {0xad958c42, L"AElig", 198},    {0xaea9261d, L"Ouml", 214},
-    {0xb040eafa, L"uArr", 8657},    {0xb07c2e1c, L"beta", 946},
-    {0xb220e92f, L"bull", 8226},    {0xb22750c4, L"ccedil", 231},
-    {0xb38ab31a, L"uarr", 8593},    {0xb598b683, L"uuml", 252},
-    {0xb6c58b21, L"Oacute", 211},   {0xb6d2a617, L"oline", 8254},
-    {0xba9fd989, L"dArr", 8659},    {0xbb5ccd41, L"lgrave", 204},
-    {0xbd39b44c, L"weierp", 8472},  {0xbde9a1a9, L"darr", 8595},
-    {0xc027e329, L"permil", 8240},  {0xc2451389, L"upsih", 978},
-    {0xc3af1ca4, L"Ccedil", 199},   {0xcd164249, L"fnof", 402},
-    {0xcf6c8467, L"hearts", 9829},  {0xd1228390, L"trade", 8482},
-    {0xd1462407, L"yuml", 255},     {0xd2cf2253, L"oplus", 8853},
-    {0xd310c1fc, L"Beta", 914},     {0xd59c4d74, L"infin", 8734},
-    {0xd64d470d, L"hArr", 8660},    {0xd67d9c75, L"divide", 247},
-    {0xd698dd37, L"Omicron", 927},  {0xd82d4a63, L"Uuml", 220},
-    {0xd9970f2d, L"harr", 8596},    {0xda91fd99, L"clubs", 9827},
-    {0xdbe5bdcc, L"there4", 8756},  {0xdd7671bd, L"prime", 8242},
-    {0xdfcf3c06, L"alpha", 945},    {0xe0213063, L"saron", 353},
-    {0xe1911d83, L"radic", 8730},   {0xe2e75468, L"raquo", 187},
-    {0xe6e27a5e, L"lacute", 205},   {0xe74a8f36, L"ucirc", 251},
-    {0xe864ecb6, L"Theta", 920},    {0xecddde5e, L"nabla", 8711},
-    {0xed1c3557, L"omicron", 959},  {0xef82228f, L"rceil", 8969},
-    {0xf1fab491, L"lArr", 8656},    {0xf3dab7e7, L"Yuml", 376},
-    {0xf4294962, L"laquo", 171},    {0xf5446822, L"lang", 9001},
-    {0xf5447cb1, L"larr", 8592},    {0xf66e9bea, L"ugrave", 249},
-    {0xf6b4ce70, L"lota", 921},     {0xf6ef34ed, L"kappa", 954},
-    {0xf72a3a56, L"thinsp", 8201},  {0xf752801a, L"luml", 207},
-    {0xf88c8430, L"ocirc", 244},    {0xf9676178, L"frasl", 8260},
-    {0xfd01885e, L"igrave", 236},   {0xff3281da, L"egrave", 232},
-};
-
-const XFA_FMHtmlReserveCode reservesForEncode[] = {
-    {34, L"quot"},     {38, L"amp"},      {39, L"apos"},
-    {60, L"lt"},       {62, L"gt"},       {160, L"nbsp"},
-    {161, L"iexcl"},   {162, L"cent"},    {163, L"pund"},
-    {164, L"current"}, {165, L"yen"},     {166, L"brvbar"},
-    {167, L"sect"},    {168, L"uml"},     {169, L"copy"},
-    {170, L"ordf"},    {171, L"laquo"},   {172, L"not"},
-    {173, L"shy"},     {174, L"reg"},     {175, L"macr"},
-    {176, L"deg"},     {177, L"plusmn"},  {178, L"sup2"},
-    {179, L"sup3"},    {180, L"acute"},   {181, L"micro"},
-    {182, L"para"},    {183, L"middot"},  {184, L"cedil"},
-    {185, L"sup1"},    {186, L"ordm"},    {187, L"raquo"},
-    {188, L"frac14"},  {189, L"frac12"},  {190, L"frac34"},
-    {191, L"iquest"},  {192, L"Agrave"},  {193, L"Aacute"},
-    {194, L"Acirc"},   {195, L"Atilde"},  {196, L"Auml"},
-    {197, L"Aring"},   {198, L"AElig"},   {199, L"Ccedil"},
-    {200, L"Egrave"},  {201, L"Eacute"},  {202, L"Ecirc"},
-    {203, L"Euml"},    {204, L"lgrave"},  {205, L"lacute"},
-    {206, L"lcirc"},   {207, L"luml"},    {208, L"ETH"},
-    {209, L"Ntilde"},  {210, L"Ograve"},  {211, L"Oacute"},
-    {212, L"Ocirc"},   {213, L"Otilde"},  {214, L"Ouml"},
-    {215, L"times"},   {216, L"Oslash"},  {217, L"Ugrave"},
-    {218, L"Uacute"},  {219, L"Ucirc"},   {220, L"Uuml"},
-    {221, L"Yacute"},  {222, L"THORN"},   {223, L"szlig"},
-    {224, L"agrave"},  {225, L"aacute"},  {226, L"acirc"},
-    {227, L"atilde"},  {228, L"auml"},    {229, L"aring"},
-    {230, L"aelig"},   {231, L"ccedil"},  {232, L"egrave"},
-    {233, L"eacute"},  {234, L"ecirc"},   {235, L"euml"},
-    {236, L"igrave"},  {237, L"iacute"},  {238, L"icirc"},
-    {239, L"iuml"},    {240, L"eth"},     {241, L"ntilde"},
-    {242, L"ograve"},  {243, L"oacute"},  {244, L"ocirc"},
-    {245, L"otilde"},  {246, L"ouml"},    {247, L"divide"},
-    {248, L"oslash"},  {249, L"ugrave"},  {250, L"uacute"},
-    {251, L"ucirc"},   {252, L"uuml"},    {253, L"yacute"},
-    {254, L"thorn"},   {255, L"yuml"},    {338, L"OElig"},
-    {339, L"oelig"},   {352, L"Scaron"},  {353, L"saron"},
-    {376, L"Yuml"},    {402, L"fnof"},    {710, L"circ"},
-    {732, L"tilde"},   {913, L"Alpha"},   {914, L"Beta"},
-    {915, L"Gamma"},   {916, L"Delta"},   {917, L"Epsilon"},
-    {918, L"Zeta"},    {919, L"Eta"},     {920, L"Theta"},
-    {921, L"lota"},    {922, L"Kappa"},   {923, L"Lambda"},
-    {924, L"Mu"},      {925, L"Nu"},      {926, L"Xi"},
-    {927, L"Omicron"}, {928, L"Pi"},      {929, L"Rho"},
-    {931, L"Sigma"},   {932, L"Tau"},     {933, L"Upsilon"},
-    {934, L"Phi"},     {935, L"Chi"},     {936, L"Psi"},
-    {937, L"Omega"},   {945, L"alpha"},   {946, L"beta"},
-    {947, L"gamma"},   {948, L"delta"},   {949, L"epsilon"},
-    {950, L"zeta"},    {951, L"eta"},     {952, L"theta"},
-    {953, L"iota"},    {954, L"kappa"},   {955, L"lambda"},
-    {956, L"mu"},      {957, L"nu"},      {958, L"xi"},
-    {959, L"omicron"}, {960, L"pi"},      {961, L"rho"},
-    {962, L"sigmaf"},  {963, L"sigma"},   {964, L"tau"},
-    {965, L"upsilon"}, {966, L"phi"},     {967, L"chi"},
-    {968, L"psi"},     {969, L"omega"},   {977, L"thetasym"},
-    {978, L"upsih"},   {982, L"piv"},     {8194, L"ensp"},
-    {8195, L"emsp"},   {8201, L"thinsp"}, {8204, L"zwnj"},
-    {8205, L"zwj"},    {8206, L"lrm"},    {8207, L"rlm"},
-    {8211, L"ndash"},  {8212, L"mdash"},  {8216, L"lsquo"},
-    {8217, L"rsquo"},  {8218, L"sbquo"},  {8220, L"ldquo"},
-    {8221, L"tdquo"},  {8222, L"bdquo"},  {8224, L"dagger"},
-    {8225, L"Dagger"}, {8226, L"bull"},   {8230, L"hellip"},
-    {8240, L"permil"}, {8242, L"prime"},  {8249, L"lsaquo"},
-    {8250, L"rsaquo"}, {8254, L"oline"},  {8260, L"frasl"},
-    {8364, L"euro"},   {8465, L"image"},  {8472, L"weierp"},
-    {8476, L"real"},   {8482, L"trade"},  {8501, L"alefsym"},
-    {8592, L"larr"},   {8593, L"uarr"},   {8594, L"rarr"},
-    {8595, L"darr"},   {8596, L"harr"},   {8629, L"crarr"},
-    {8656, L"lArr"},   {8657, L"uArr"},   {8658, L"rArr"},
-    {8659, L"dArr"},   {8660, L"hArr"},   {8704, L"forall"},
-    {8706, L"part"},   {8707, L"exist"},  {8709, L"empty"},
-    {8711, L"nabla"},  {8712, L"isin"},   {8713, L"notin"},
-    {8715, L"ni"},     {8719, L"prod"},   {8721, L"sum"},
-    {8722, L"minus"},  {8727, L"lowast"}, {8730, L"radic"},
-    {8733, L"prop"},   {8734, L"infin"},  {8736, L"ang"},
-    {8743, L"and"},    {8744, L"or"},     {8745, L"cap"},
-    {8746, L"cup"},    {8747, L"int"},    {8756, L"there4"},
-    {8764, L"sim"},    {8773, L"cong"},   {8776, L"asymp"},
-    {8800, L"ne"},     {8801, L"equiv"},  {8804, L"le"},
-    {8805, L"ge"},     {8834, L"sub"},    {8835, L"sup"},
-    {8836, L"nsub"},   {8838, L"sube"},   {8839, L"supe"},
-    {8853, L"oplus"},  {8855, L"otimes"}, {8869, L"perp"},
-    {8901, L"sdot"},   {8968, L"lceil"},  {8969, L"rceil"},
-    {8970, L"lfloor"}, {8971, L"rfloor"}, {9001, L"lang"},
-    {9002, L"rang"},   {9674, L"loz"},    {9824, L"spades"},
-    {9827, L"clubs"},  {9829, L"hearts"}, {9830, L"diams"},
-};
-
-}  // namespace
-
-void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE dValue = HValueToDouble(hThis, argOne);
-      if (dValue < 0) {
-        dValue = -dValue;
-      }
-      FXJSE_Value_SetDouble(args.GetReturnValue(), dValue);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Abs");
-  }
-}
-void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint32_t uCount = 0;
-  FX_DOUBLE dSum = 0.0;
-  if (argc >= 1) {
-    FXJSE_HVALUE argValue = 0;
-    for (int32_t i = 0; i < argc; i++) {
-      argValue = args.GetValue(i);
-      if (FXJSE_Value_IsNull(argValue)) {
-        FXJSE_Value_Release(argValue);
-        continue;
-      } else if (FXJSE_Value_IsArray(argValue)) {
-        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
-        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-        FXJSE_Value_Release(lengthValue);
-        if (iLength > 2) {
-          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
-          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-          if (FXJSE_Value_IsNull(propertyValue)) {
-            for (int32_t j = 2; j < iLength; j++) {
-              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
-              FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime);
-              GetObjectDefaultValue(jsObjectValue, defaultPropValue);
-              if (!FXJSE_Value_IsNull(defaultPropValue)) {
-                dSum += HValueToDouble(hThis, defaultPropValue);
-                uCount++;
-              }
-              FXJSE_Value_Release(defaultPropValue);
-            }
-          } else {
-            CFX_ByteString propertyStr;
-            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-            for (int32_t j = 2; j < iLength; j++) {
-              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
-              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                        newPropertyValue);
-              if (!FXJSE_Value_IsNull(newPropertyValue)) {
-                dSum += HValueToDouble(hThis, newPropertyValue);
-                uCount++;
-              }
-            }
-            FXJSE_Value_Release(newPropertyValue);
-          }
-          FXJSE_Value_Release(jsObjectValue);
-          FXJSE_Value_Release(propertyValue);
-        }
-      } else {
-        dSum += HValueToDouble(hThis, argValue);
-        uCount++;
-      }
-      FXJSE_Value_Release(argValue);
-    }
-    argValue = 0;
-  }
-  if (0 == uCount) {
-    FXJSE_Value_SetNull(args.GetReturnValue());
-  } else {
-    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount);
-  }
-}
-void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argValue)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FXJSE_Value_SetFloat(args.GetReturnValue(),
-                           FXSYS_ceil(HValueToFloat(hThis, argValue)));
-    }
-    FXJSE_Value_Release(argValue);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Ceil");
-  }
-}
-void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint32_t uCount = 0;
-  FXJSE_HVALUE argValue = 0;
-  for (int32_t i = 0; i < argc; i++) {
-    argValue = args.GetValue(i);
-    if (FXJSE_Value_IsNull(argValue)) {
-      FXJSE_Value_Release(argValue);
-      continue;
-    } else if (FXJSE_Value_IsArray(argValue)) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-      FXJSE_Value_Release(lengthValue);
-      if (iLength > 2) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
-            if (!FXJSE_Value_IsNull(newPropertyValue)) {
-              uCount++;
-            }
-          }
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                      newPropertyValue);
-            uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1);
-          }
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-        FXJSE_Value_Release(newPropertyValue);
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      }
-    } else if (FXJSE_Value_IsObject(argValue)) {
-      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-      GetObjectDefaultValue(argValue, newPropertyValue);
-      if (!FXJSE_Value_IsNull(newPropertyValue)) {
-        uCount++;
-      }
-      FXJSE_Value_Release(newPropertyValue);
-    } else {
-      uCount++;
-    }
-    FXJSE_Value_Release(argValue);
-  }
-  argValue = 0;
-  FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)uCount);
-}
-void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argValue)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FXJSE_Value_SetFloat(args.GetReturnValue(),
-                           FXSYS_floor(HValueToFloat(hThis, argValue)));
-    }
-    FXJSE_Value_Release(argValue);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Floor");
-  }
-}
-void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint32_t uCount = 0;
-  FX_DOUBLE dMaxValue = 0.0;
-  FXJSE_HVALUE argValue = 0;
-  for (int32_t i = 0; i < argc; i++) {
-    argValue = args.GetValue(i);
-    if (FXJSE_Value_IsNull(argValue)) {
-      FXJSE_Value_Release(argValue);
-      continue;
-    } else if (FXJSE_Value_IsArray(argValue)) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-      FXJSE_Value_Release(lengthValue);
-      if (iLength > 2) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
-            if (!FXJSE_Value_IsNull(newPropertyValue)) {
-              uCount++;
-              if (uCount == 1) {
-                dMaxValue = HValueToDouble(hThis, newPropertyValue);
-              } else {
-                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-                if (dMaxValue < dValue) {
-                  dMaxValue = dValue;
-                }
-              }
-            }
-          }
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                      newPropertyValue);
-            if (!FXJSE_Value_IsNull(newPropertyValue)) {
-              uCount++;
-              if (uCount == 1) {
-                dMaxValue = HValueToDouble(hThis, newPropertyValue);
-              } else {
-                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-                if (dMaxValue < dValue) {
-                  dMaxValue = dValue;
-                }
-              }
-            }
-          }
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-        FXJSE_Value_Release(newPropertyValue);
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      }
-    } else if (FXJSE_Value_IsObject(argValue)) {
-      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-      GetObjectDefaultValue(argValue, newPropertyValue);
-      if (!FXJSE_Value_IsNull(newPropertyValue)) {
-        uCount++;
-        if (uCount == 1) {
-          dMaxValue = HValueToDouble(hThis, newPropertyValue);
-        } else {
-          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-          if (dMaxValue < dValue) {
-            dMaxValue = dValue;
-          }
-        }
-      }
-      FXJSE_Value_Release(newPropertyValue);
-    } else {
-      uCount++;
-      if (uCount == 1) {
-        dMaxValue = HValueToDouble(hThis, argValue);
-      } else {
-        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
-        if (dMaxValue < dValue) {
-          dMaxValue = dValue;
-        }
-      }
-    }
-    FXJSE_Value_Release(argValue);
-  }
-  argValue = 0;
-  if (uCount) {
-    FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue);
-  } else {
-    FXJSE_Value_SetNull(args.GetReturnValue());
-  }
-}
-void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint32_t uCount = 0;
-  FX_DOUBLE dMinValue = 0.0;
-  FXJSE_HVALUE argValue = 0;
-  for (int32_t i = 0; i < argc; i++) {
-    argValue = args.GetValue(i);
-    if (FXJSE_Value_IsNull(argValue)) {
-      FXJSE_Value_Release(argValue);
-      continue;
-    } else if (FXJSE_Value_IsArray(argValue)) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-      FXJSE_Value_Release(lengthValue);
-      if (iLength > 2) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
-            if (!FXJSE_Value_IsNull(newPropertyValue)) {
-              uCount++;
-              if (uCount == 1) {
-                dMinValue = HValueToDouble(hThis, newPropertyValue);
-              } else {
-                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-                if (dMinValue > dValue) {
-                  dMinValue = dValue;
-                }
-              }
-            }
-          }
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          for (int32_t i = 2; i < iLength; i++) {
-            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                      newPropertyValue);
-            if (!FXJSE_Value_IsNull(newPropertyValue)) {
-              uCount++;
-              if (uCount == 1) {
-                dMinValue = HValueToDouble(hThis, newPropertyValue);
-              } else {
-                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-                if (dMinValue > dValue) {
-                  dMinValue = dValue;
-                }
-              }
-            }
-          }
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-        FXJSE_Value_Release(newPropertyValue);
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      }
-    } else if (FXJSE_Value_IsObject(argValue)) {
-      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-      GetObjectDefaultValue(argValue, newPropertyValue);
-      if (!FXJSE_Value_IsNull(newPropertyValue)) {
-        uCount++;
-        if (uCount == 1) {
-          dMinValue = HValueToDouble(hThis, newPropertyValue);
-        } else {
-          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
-          if (dMinValue > dValue) {
-            dMinValue = dValue;
-          }
-        }
-      }
-      FXJSE_Value_Release(newPropertyValue);
-    } else {
-      uCount++;
-      if (uCount == 1) {
-        dMinValue = HValueToDouble(hThis, argValue);
-      } else {
-        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
-        if (dMinValue > dValue) {
-          dMinValue = dValue;
-        }
-      }
-    }
-    FXJSE_Value_Release(argValue);
-  }
-  argValue = 0;
-  if (uCount) {
-    FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue);
-  } else {
-    FXJSE_Value_SetNull(args.GetReturnValue());
-  }
-}
-void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FXJSE_HVALUE argTwo = args.GetValue(1);
-    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE dDividend = 0.0;
-      FX_DOUBLE dDividor = 0.0;
-      if (FXJSE_Value_IsArray(argOne)) {
-        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
-        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-        FXJSE_Value_Release(lengthValue);
-        if (iLength > 2) {
-          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
-          FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
-          if (FXJSE_Value_IsNull(propertyValue)) {
-            dDividend = HValueToDouble(hThis, jsObjectValue);
-          } else {
-            CFX_ByteString propertyStr;
-            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                      newPropertyValue);
-            dDividend = HValueToDouble(hThis, newPropertyValue);
-            FXJSE_Value_Release(newPropertyValue);
-          }
-          FXJSE_Value_Release(propertyValue);
-          FXJSE_Value_Release(jsObjectValue);
-        } else {
-          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-        }
-      } else {
-        dDividend = HValueToDouble(hThis, argOne);
-      }
-      if (FXJSE_Value_IsArray(argTwo)) {
-        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectProp(argTwo, "length", lengthValue);
-        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-        FXJSE_Value_Release(lengthValue);
-        if (iLength > 2) {
-          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
-          FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
-          if (FXJSE_Value_IsNull(propertyValue)) {
-            dDividor = HValueToDouble(hThis, jsObjectValue);
-          } else {
-            CFX_ByteString propertyStr;
-            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                      newPropertyValue);
-            dDividor = HValueToDouble(hThis, newPropertyValue);
-            FXJSE_Value_Release(newPropertyValue);
-          }
-          FXJSE_Value_Release(propertyValue);
-          FXJSE_Value_Release(jsObjectValue);
-        } else {
-          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-        }
-      } else {
-        dDividor = HValueToDouble(hThis, argTwo);
-      }
-      if (dDividor) {
-        FXJSE_Value_SetDouble(
-            args.GetReturnValue(),
-            dDividend - dDividor * (int32_t)(dDividend / dDividor));
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Mod");
-  }
-}
-void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint8_t uPrecision = 0;
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE dValue = 0.0;
-      if (FXJSE_Value_IsArray(argOne)) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          dValue = HValueToDouble(hThis, jsObjectValue);
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                    newPropertyValue);
-          dValue = HValueToDouble(hThis, newPropertyValue);
-          FXJSE_Value_Release(newPropertyValue);
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-      } else {
-        dValue = HValueToDouble(hThis, argOne);
-      }
-      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
-      CFX_WideString wsValue = decimalValue;
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());
-    }
-    FXJSE_Value_Release(argOne);
-  } else if (argc == 2) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FXJSE_HVALUE argTwo = args.GetValue(1);
-    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE dValue = 0.0;
-      if (FXJSE_Value_IsArray(argOne)) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          dValue = HValueToDouble(hThis, jsObjectValue);
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                    newPropertyValue);
-          dValue = HValueToDouble(hThis, newPropertyValue);
-          FXJSE_Value_Release(newPropertyValue);
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-      } else {
-        dValue = HValueToDouble(hThis, argOne);
-      }
-      FX_DOUBLE dPrecision = 0.0;
-      if (FXJSE_Value_IsArray(argTwo)) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
-        FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          dPrecision = HValueToDouble(hThis, jsObjectValue);
-        } else {
-          CFX_ByteString propertyStr;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                    newPropertyValue);
-          dPrecision = HValueToDouble(hThis, newPropertyValue);
-          FXJSE_Value_Release(newPropertyValue);
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-      } else {
-        dPrecision = HValueToDouble(hThis, argTwo);
-      }
-      if (dPrecision < 0) {
-        uPrecision = 0;
-      } else if (dPrecision > 12.0) {
-        uPrecision = 12;
-      } else {
-        uPrecision = (uint8_t)dPrecision;
-      }
-      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
-      CFX_WideString wsValue = decimalValue;
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Round");
-  }
-}
-void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  uint32_t uCount = 0;
-  FX_DOUBLE dSum = 0.0;
-  if (argc) {
-    FXJSE_HVALUE argValue = 0;
-    for (int32_t i = 0; i < argc; i++) {
-      argValue = args.GetValue(i);
-      if (FXJSE_Value_IsNull(argValue)) {
-        FXJSE_Value_Release(argValue);
-        continue;
-      } else if (FXJSE_Value_IsArray(argValue)) {
-        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
-        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-        FXJSE_Value_Release(lengthValue);
-        if (iLength > 2) {
-          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
-          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-          if (FXJSE_Value_IsNull(propertyValue)) {
-            for (int32_t j = 2; j < iLength; j++) {
-              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
-              GetObjectDefaultValue(jsObjectValue, newPropertyValue);
-              if (!FXJSE_Value_IsNull(newPropertyValue)) {
-                dSum += HValueToDouble(hThis, jsObjectValue);
-                uCount++;
-              }
-            }
-          } else {
-            CFX_ByteString propertyStr;
-            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-            for (int32_t j = 2; j < iLength; j++) {
-              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
-              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr,
-                                        newPropertyValue);
-              if (!FXJSE_Value_IsNull(newPropertyValue)) {
-                dSum += HValueToDouble(hThis, newPropertyValue);
-                uCount++;
-              }
-            }
-          }
-          FXJSE_Value_Release(newPropertyValue);
-          FXJSE_Value_Release(jsObjectValue);
-          FXJSE_Value_Release(propertyValue);
-        } else {
-          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-        }
-      } else if (FXJSE_Value_IsObject(argValue)) {
-        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-        GetObjectDefaultValue(argValue, newPropertyValue);
-        if (!FXJSE_Value_IsNull(newPropertyValue)) {
-          dSum += HValueToDouble(hThis, argValue);
-          uCount++;
-        }
-        FXJSE_Value_Release(newPropertyValue);
-      } else {
-        dSum += HValueToDouble(hThis, argValue);
-        uCount++;
-      }
-      FXJSE_Value_Release(argValue);
-    }
-    argValue = 0;
-  }
-  if (uCount < 1) {
-    FXJSE_Value_SetNull(args.GetReturnValue());
-  } else {
-    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum);
-  }
-}
-void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  if (args.GetLength() == 0) {
-    struct tm* pTmStruct = 0;
-    time_t currentTime;
-    time(&currentTime);
-    pTmStruct = gmtime(&currentTime);
-    CFX_ByteString bufferYear;
-    CFX_ByteString bufferMon;
-    CFX_ByteString bufferDay;
-    bufferYear.Format("%d", pTmStruct->tm_year + 1900);
-    bufferMon.Format("%02d", pTmStruct->tm_mon + 1);
-    bufferDay.Format("%02d", pTmStruct->tm_mday);
-    CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay;
-    int32_t dDays = DateString2Num(bufferCurrent);
-    FXJSE_Value_SetInteger(args.GetReturnValue(), dDays);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Date");
-  }
-}
-void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    CFX_ByteString dateString;
-    CFX_ByteString formatString;
-    CFX_ByteString localString;
-    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE formatValue = 0;
-    FXJSE_HVALUE localValue = 0;
-    if (HValueIsNull(hThis, dateValue)) {
-      bFlags = TRUE;
-    } else {
-      HValueToUTF8String(dateValue, dateString);
-    }
-    if (argc > 1) {
-      formatValue = GetSimpleHValue(hThis, args, 1);
-      if (HValueIsNull(hThis, formatValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(formatValue, formatString);
-      }
-    }
-    if (argc == 3) {
-      localValue = GetSimpleHValue(hThis, args, 2);
-      if (HValueIsNull(hThis, localValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localValue, localString);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString szIsoDateString;
-      FX_BOOL bRet = Local2IsoDate(hThis, dateString, formatString, localString,
-                                   szIsoDateString);
-      if (bRet) {
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               DateString2Num(szIsoDateString));
-      } else {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-      }
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(dateValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(formatValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Date2Num");
-  }
-}
-void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc < 3) {
-    FX_BOOL bFlags = FALSE;
-    int32_t iStyle = 0;
-    CFX_ByteString szLocal;
-    FXJSE_HVALUE argStyle = 0;
-    FXJSE_HVALUE argLocal = 0;
-    if (argc > 0) {
-      argStyle = GetSimpleHValue(hThis, args, 0);
-      if (FXJSE_Value_IsNull(argStyle)) {
-        bFlags = TRUE;
-      }
-      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
-      if (iStyle > 4 || iStyle < 0) {
-        iStyle = 0;
-      }
-    }
-    if (argc == 2) {
-      argLocal = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argLocal)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(argLocal, szLocal);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString formatStr;
-      GetStandardDateFormat(hThis, iStyle, szLocal, formatStr);
-      if (formatStr.IsEmpty()) {
-        formatStr = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    if (argc > 0) {
-      FXJSE_Value_Release(argStyle);
-      if (argc == 2) {
-        FXJSE_Value_Release(argLocal);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Date2Num");
-  }
-}
-void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis,
-                                    const CFX_ByteStringC& szFuncName,
-                                    CFXJSE_Arguments& args) {
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString szArgString;
-      HValueToUTF8String(argOne, szArgString);
-      int32_t dDays = DateString2Num(szArgString);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"IsoDate2Num");
-  }
-}
-void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis,
-                                    const CFX_ByteStringC& szFuncName,
-                                    CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CXFA_Document* pDoc = pContext->GetDocument();
-      FXSYS_assert(pDoc);
-      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-      CFX_ByteString szArgString;
-      HValueToUTF8String(argOne, szArgString);
-      szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1);
-      if (szArgString.IsEmpty()) {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-        FXJSE_Value_Release(argOne);
-        return;
-      }
-      CXFA_LocaleValue timeValue(
-          XFA_VT_TIME,
-          CFX_WideString::FromUTF8(szArgString, szArgString.GetLength()),
-          (CXFA_LocaleMgr*)pMgr);
-      if (timeValue.IsValid()) {
-        CFX_Unitime uniTime = timeValue.GetTime();
-        int32_t hour = uniTime.GetHour();
-        int32_t min = uniTime.GetMinute();
-        int32_t second = uniTime.GetSecond();
-        int32_t milSecond = uniTime.GetMillisecond();
-        IFX_Locale* pDefLocale = pMgr->GetDefLocale();
-        FXSYS_assert(pDefLocale);
-        FX_TIMEZONE tzLocale;
-        pDefLocale->GetTimeZone(tzLocale);
-        int32_t mins = hour * 60 + min;
-        mins -= (tzLocale.tzHour * 60);
-        while (mins > 1440) {
-          mins -= 1440;
-        }
-        while (mins < 0) {
-          mins += 1440;
-        }
-        hour = mins / 60;
-        min = mins % 60;
-        int32_t iResult =
-            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
-        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
-      } else {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"IsoTime2Num");
-  }
-}
-void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc < 3) {
-    FX_BOOL bFlags = FALSE;
-    int32_t iStyle = 0;
-    CFX_ByteString szLocal;
-    FXJSE_HVALUE argStyle = 0;
-    FXJSE_HVALUE argLocal = 0;
-    if (argc > 0) {
-      argStyle = GetSimpleHValue(hThis, args, 0);
-      if (FXJSE_Value_IsNull(argStyle)) {
-        bFlags = TRUE;
-      }
-      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
-      if (iStyle > 4 || iStyle < 0) {
-        iStyle = 0;
-      }
-    }
-    if (argc == 2) {
-      argLocal = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argLocal)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(argLocal, szLocal);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString formatStr;
-      GetLocalDateFormat(hThis, iStyle, szLocal, formatStr, FALSE);
-      if (formatStr.IsEmpty()) {
-        formatStr = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    if (argc > 0) {
-      FXJSE_Value_Release(argStyle);
-      if (argc == 2) {
-        FXJSE_Value_Release(argLocal);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"LocalDateFmt");
-  }
-}
-void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc < 3) {
-    FX_BOOL bFlags = FALSE;
-    int32_t iStyle = 0;
-    CFX_ByteString szLocal;
-    FXJSE_HVALUE argStyle = 0;
-    FXJSE_HVALUE argLocal = 0;
-    if (argc > 0) {
-      argStyle = GetSimpleHValue(hThis, args, 0);
-      if (FXJSE_Value_IsNull(argStyle)) {
-        bFlags = TRUE;
-      }
-      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
-      if (iStyle > 4 || iStyle < 0) {
-        iStyle = 0;
-      }
-    }
-    if (argc == 2) {
-      argLocal = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argLocal)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(argLocal, szLocal);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString formatStr;
-      GetLocalTimeFormat(hThis, iStyle, szLocal, formatStr, FALSE);
-      if (formatStr.IsEmpty()) {
-        formatStr = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    if (argc > 0) {
-      FXJSE_Value_Release(argStyle);
-      if (argc == 2) {
-        FXJSE_Value_Release(argLocal);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"LocalTimeFmt");
-  }
-}
-void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    int32_t dDate;
-    CFX_ByteString formatString;
-    CFX_ByteString localString;
-    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE formatValue = 0;
-    FXJSE_HVALUE localValue = 0;
-    if (HValueIsNull(hThis, dateValue)) {
-      bFlags = TRUE;
-    } else {
-      dDate = (int32_t)HValueToFloat(hThis, dateValue);
-      bFlags = dDate < 1;
-    }
-    if (argc > 1) {
-      formatValue = GetSimpleHValue(hThis, args, 1);
-      if (HValueIsNull(hThis, formatValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(formatValue, formatString);
-      }
-    }
-    if (argc == 3) {
-      localValue = GetSimpleHValue(hThis, args, 2);
-      if (HValueIsNull(hThis, localValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localValue, localString);
-      }
-    }
-    if (!bFlags) {
-      int32_t iYear = 1900;
-      int32_t iMonth = 1;
-      int32_t iDay = 1;
-      int32_t i = 0;
-      while (dDate > 0) {
-        if (iMonth == 2) {
-          if ((!((iYear + i) % 4) && ((iYear + i) % 100)) ||
-              !((iYear + i) % 400)) {
-            if (dDate > 29) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 29;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          } else {
-            if (dDate > 28) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 28;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          }
-        } else if (iMonth < 8) {
-          if ((iMonth % 2 == 0)) {
-            if (dDate > 30) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 30;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          } else {
-            if (dDate > 31) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 31;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          }
-        } else {
-          if (iMonth % 2 != 0) {
-            if (dDate > 30) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 30;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          } else {
-            if (dDate > 31) {
-              ++iMonth;
-              if (iMonth > 12) {
-                iMonth = 1;
-                ++i;
-              }
-              iDay = 1;
-              dDate -= 31;
-            } else {
-              iDay += static_cast<int32_t>(dDate) - 1;
-              dDate = 0;
-            }
-          }
-        }
-      }
-      CFX_ByteString szIsoDateString;
-      szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay);
-      CFX_ByteString szLocalDateString;
-      IsoDate2Local(hThis, szIsoDateString, formatString, localString,
-                    szLocalDateString);
-      if (szLocalDateString.IsEmpty()) {
-        szLocalDateString = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalDateString);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(dateValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(formatValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Num2Date");
-  }
-}
-void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis,
-                                   const CFX_ByteStringC& szFuncName,
-                                   CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    int32_t iTime;
-    CFX_ByteString formatString;
-    CFX_ByteString localString;
-    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE formatValue = 0;
-    FXJSE_HVALUE localValue = 0;
-    if (FXJSE_Value_IsNull(timeValue)) {
-      bFlags = TRUE;
-    } else {
-      iTime = (int32_t)HValueToFloat(hThis, timeValue);
-      if (FXSYS_abs(iTime) < 1.0) {
-        bFlags = TRUE;
-      }
-    }
-    if (argc > 1) {
-      formatValue = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(formatValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(formatValue, formatString);
-      }
-    }
-    if (argc == 3) {
-      localValue = GetSimpleHValue(hThis, args, 2);
-      if (FXJSE_Value_IsNull(localValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localValue, localString);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString szGMTTimeString;
-      Num2AllTime(hThis, iTime, formatString, localString, TRUE,
-                  szGMTTimeString);
-      if (szGMTTimeString.IsEmpty()) {
-        szGMTTimeString = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szGMTTimeString);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(timeValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(formatValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Num2GMTime");
-  }
-}
-void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT fTime;
-    CFX_ByteString formatString;
-    CFX_ByteString localString;
-    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE formatValue = 0;
-    FXJSE_HVALUE localValue = 0;
-    if (FXJSE_Value_IsNull(timeValue)) {
-      bFlags = TRUE;
-    } else {
-      fTime = HValueToFloat(hThis, timeValue);
-      if (FXSYS_fabs(fTime) < 1.0) {
-        bFlags = TRUE;
-      }
-    }
-    if (argc > 1) {
-      formatValue = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(formatValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(formatValue, formatString);
-      }
-    }
-    if (argc == 3) {
-      localValue = GetSimpleHValue(hThis, args, 2);
-      if (FXJSE_Value_IsNull(localValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localValue, localString);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString szLocalTimeString;
-      Num2AllTime(hThis, (int32_t)fTime, formatString, localString, FALSE,
-                  szLocalTimeString);
-      if (szLocalTimeString.IsEmpty()) {
-        szLocalTimeString = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalTimeString);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(timeValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(formatValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Num2Time");
-  }
-}
-void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  if (args.GetLength() == 0) {
-    time_t now;
-    time(&now);
-    struct tm* pGmt = gmtime(&now);
-    int32_t iGMHour = pGmt->tm_hour;
-    int32_t iGMMin = pGmt->tm_min;
-    int32_t iGMSec = pGmt->tm_sec;
-    FXJSE_Value_SetInteger(args.GetReturnValue(),
-                           ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000));
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Time");
-  }
-}
-void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    CFX_ByteString timeString;
-    CFX_ByteString formatString;
-    CFX_ByteString localString;
-    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE formatValue = 0;
-    FXJSE_HVALUE localValue = 0;
-    if (HValueIsNull(hThis, timeValue)) {
-      bFlags = TRUE;
-    } else {
-      HValueToUTF8String(timeValue, timeString);
-    }
-    if (argc > 1) {
-      formatValue = GetSimpleHValue(hThis, args, 1);
-      if (HValueIsNull(hThis, formatValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(formatValue, formatString);
-      }
-    }
-    if (argc == 3) {
-      localValue = GetSimpleHValue(hThis, args, 2);
-      if (HValueIsNull(hThis, localValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localValue, localString);
-      }
-    }
-    if (!bFlags) {
-      CXFA_FM2JSContext* pContext =
-          (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-      CXFA_Document* pDoc = pContext->GetDocument();
-      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-      IFX_Locale* pLocale = NULL;
-      if (localString.IsEmpty()) {
-        CXFA_Node* pThisNode =
-            ToNode(pDoc->GetScriptContext()->GetThisObject());
-        FXSYS_assert(pThisNode);
-        CXFA_WidgetData widgetData(pThisNode);
-        pLocale = widgetData.GetLocal();
-      } else {
-        pLocale = pMgr->GetLocaleByName(
-            CFX_WideString::FromUTF8(localString, localString.GetLength()));
-      }
-      CFX_WideString wsFormat;
-      if (formatString.IsEmpty()) {
-        pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-      } else {
-        wsFormat =
-            CFX_WideString::FromUTF8(formatString, formatString.GetLength());
-      }
-      wsFormat = FX_WSTRC(L"time{") + wsFormat;
-      wsFormat += FX_WSTRC(L"}");
-      CXFA_LocaleValue timeValue(
-          XFA_VT_TIME,
-          CFX_WideString::FromUTF8(timeString, timeString.GetLength()),
-          wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);
-      if (timeValue.IsValid()) {
-        CFX_Unitime uniTime = timeValue.GetTime();
-        int32_t hour = uniTime.GetHour();
-        int32_t min = uniTime.GetMinute();
-        int32_t second = uniTime.GetSecond();
-        int32_t milSecond = uniTime.GetMillisecond();
-        int32_t mins = hour * 60 + min;
-        IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
-        if (pProvider) {
-          FX_TIMEZONE tz;
-          pProvider->GetTimeZone(tz);
-          mins -= (tz.tzHour * 60);
-          while (mins > 1440) {
-            mins -= 1440;
-          }
-          while (mins < 0) {
-            mins += 1440;
-          }
-          hour = mins / 60;
-          min = mins % 60;
-        }
-        int32_t iResult =
-            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
-        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
-      } else {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-      }
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(timeValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(formatValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Time2Num");
-  }
-}
-void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc < 3) {
-    FX_BOOL bFlags = FALSE;
-    int32_t iStyle = 0;
-    CFX_ByteString szLocal;
-    FXJSE_HVALUE argStyle = 0;
-    FXJSE_HVALUE argLocal = 0;
-    if (argc > 0) {
-      argStyle = GetSimpleHValue(hThis, args, 0);
-      if (FXJSE_Value_IsNull(argStyle)) {
-        bFlags = TRUE;
-      }
-      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
-      if (iStyle > 4 || iStyle < 0) {
-        iStyle = 0;
-      }
-    }
-    if (argc == 2) {
-      argLocal = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argLocal)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(argLocal, szLocal);
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString formatStr;
-      GetStandardTimeFormat(hThis, iStyle, szLocal, formatStr);
-      if (formatStr.IsEmpty()) {
-        formatStr = "";
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    if (argc > 0) {
-      FXJSE_Value_Release(argStyle);
-      if (argc == 2) {
-        FXJSE_Value_Release(argLocal);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"TimeFmt");
-  }
-}
-FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(const FX_CHAR* pData,
-                                           int32_t iLength,
-                                           int32_t& iStyle,
-                                           int32_t& iYear,
-                                           int32_t& iMonth,
-                                           int32_t& iDay) {
-  iYear = 0;
-  iMonth = 1;
-  iDay = 1;
-  FX_BOOL iRet = FALSE;
-  if (iLength < 4) {
-    return iRet;
-  }
-  FX_CHAR strYear[5];
-  strYear[4] = '\0';
-  for (int32_t i = 0; i < 4; ++i) {
-    if (*(pData + i) <= '9' && *(pData + i) >= '0') {
-      strYear[i] = *(pData + i);
-    } else {
-      return iRet;
-    }
-  }
-  iYear = FXSYS_atoi(strYear);
-  iStyle = 0;
-  if (iLength > 4) {
-    if (*(pData + 4) == '-') {
-      iStyle = 1;
-    } else {
-      iStyle = 0;
-    }
-  } else {
-    iRet = TRUE;
-    return iRet;
-  }
-  FX_CHAR strTemp[3];
-  strTemp[2] = '\0';
-  int32_t iPosOff = 0;
-  if (iStyle == 0) {
-    iPosOff = 4;
-    if (iLength == 4) {
-      iRet = TRUE;
-      return iRet;
-    }
-  } else {
-    iPosOff = 5;
-    if (iLength == 4) {
-      iRet = TRUE;
-      return iRet;
-    }
-  }
-  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
-      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
-    return iRet;
-  }
-  strTemp[0] = *(pData + iPosOff);
-  strTemp[1] = *(pData + iPosOff + 1);
-  iMonth = FXSYS_atoi(strTemp);
-  if (iMonth > 12 || iMonth < 1) {
-    return iRet;
-  }
-  if (iStyle == 0) {
-    iPosOff += 2;
-    if (iLength == 6) {
-      iRet = 1;
-      return iRet;
-    }
-  } else {
-    iPosOff += 3;
-    if (iLength == 7) {
-      iRet = 1;
-      return iRet;
-    }
-  }
-  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
-      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
-    return iRet;
-  }
-  strTemp[0] = *(pData + iPosOff);
-  strTemp[1] = *(pData + iPosOff + 1);
-  iDay = FXSYS_atoi(strTemp);
-  if (iPosOff + 2 < iLength) {
-    return iRet;
-  }
-  if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
-    if (iMonth == 2) {
-      if (iDay > 29) {
-        return iRet;
-      }
-    } else {
-      if (iMonth < 8) {
-        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
-          return iRet;
-        }
-      } else {
-        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
-          return iRet;
-        }
-      }
-    }
-  } else {
-    if (iMonth == 2) {
-      if (iDay > 28) {
-        return iRet;
-      }
-    } else {
-      if (iMonth < 8) {
-        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
-          return iRet;
-        }
-      } else {
-        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
-          return iRet;
-        }
-      }
-    }
-  }
-  iRet = TRUE;
-  return iRet;
-}
-FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(const FX_CHAR* pData,
-                                           int32_t iLength,
-                                           int32_t& iHour,
-                                           int32_t& iMinute,
-                                           int32_t& iSecond,
-                                           int32_t& iMilliSecond,
-                                           int32_t& iZoneHour,
-                                           int32_t& iZoneMinute) {
-  iHour = 0;
-  iMinute = 0;
-  iSecond = 0;
-  iMilliSecond = 0;
-  iZoneHour = 0;
-  iZoneMinute = 0;
-  if (!pData) {
-    return FALSE;
-  }
-  int32_t iRet = FALSE;
-  FX_CHAR strTemp[3];
-  strTemp[2] = '\0';
-  int32_t iIndex = 0;
-  int32_t iZone = 0;
-  int32_t i = iIndex;
-  while (i < iLength) {
-    if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':') {
-      iZone = i;
-      break;
-    }
-    ++i;
-  }
-  if (i == iLength) {
-    iZone = iLength;
-  }
-  int32_t iPos = 0;
-  while (iIndex < iZone) {
-    if (iIndex >= iZone) {
-      break;
-    }
-    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
-      return iRet;
-    }
-    strTemp[0] = *(pData + iIndex);
-    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
-      return iRet;
-    }
-    strTemp[1] = *(pData + iIndex + 1);
-    if (FXSYS_atoi(strTemp) > 60) {
-      return iRet;
-    }
-    if (*(pData + 2) == ':') {
-      if (iPos == 0) {
-        iHour = FXSYS_atoi(strTemp);
-        ++iPos;
-      } else if (iPos == 1) {
-        iMinute = FXSYS_atoi(strTemp);
-        ++iPos;
-      } else {
-        iSecond = FXSYS_atoi(strTemp);
-      }
-      iIndex += 3;
-    } else {
-      if (iPos == 0) {
-        iHour = FXSYS_atoi(strTemp);
-        ++iPos;
-      } else if (iPos == 1) {
-        iMinute = FXSYS_atoi(strTemp);
-        ++iPos;
-      } else if (iPos == 2) {
-        iSecond = FXSYS_atoi(strTemp);
-        ++iPos;
-      }
-      iIndex += 2;
-    }
-  }
-  if (*(pData + iIndex) == '.') {
-    ++iIndex;
-    FX_CHAR strTemp[4];
-    strTemp[3] = '\0';
-    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
-      return iRet;
-    }
-    strTemp[0] = *(pData + iIndex);
-    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
-      return iRet;
-    }
-    strTemp[1] = *(pData + iIndex + 1);
-    if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') {
-      return iRet;
-    }
-    strTemp[2] = *(pData + iIndex + 2);
-    iMilliSecond = FXSYS_atoi(strTemp);
-    if (iMilliSecond > 100) {
-      iMilliSecond = 0;
-      return iRet;
-    }
-    iIndex += 3;
-  }
-  int32_t iSign = 1;
-  if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') {
-    iRet = 1;
-    return iRet;
-  } else if (*(pData + iIndex) == '+') {
-    ++iIndex;
-  } else if (*(pData + iIndex) == '-') {
-    iSign = -1;
-    ++iIndex;
-  }
-  iPos = 0;
-  while (iIndex < iLength) {
-    if (iIndex >= iLength) {
-      return iRet;
-    }
-    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
-      return iRet;
-    }
-    strTemp[0] = *(pData + iIndex);
-    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
-      return iRet;
-    }
-    strTemp[1] = *(pData + iIndex + 1);
-    if (FXSYS_atoi(strTemp) > 60) {
-      return iRet;
-    }
-    if (*(pData + 2) == ':') {
-      if (iPos == 0) {
-        iZoneHour = FXSYS_atoi(strTemp);
-      } else if (iPos == 1) {
-        iZoneMinute = FXSYS_atoi(strTemp);
-      }
-      iIndex += 3;
-    } else {
-      if (!iPos) {
-        iZoneHour = FXSYS_atoi(strTemp);
-        ++iPos;
-      } else if (iPos == 1) {
-        iZoneMinute = FXSYS_atoi(strTemp);
-        ++iPos;
-      }
-      iIndex += 2;
-    }
-  }
-  if (iIndex < iLength) {
-    return iRet;
-  }
-  iZoneHour *= iSign;
-  iRet = TRUE;
-  return iRet;
-}
-FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(const FX_CHAR* pData,
-                                               int32_t iLength,
-                                               int32_t& iYear,
-                                               int32_t& iMonth,
-                                               int32_t& iDay,
-                                               int32_t& iHour,
-                                               int32_t& iMinute,
-                                               int32_t& iSecond,
-                                               int32_t& iMillionSecond,
-                                               int32_t& iZoneHour,
-                                               int32_t& iZoneMinute) {
-  iYear = 0;
-  iMonth = 0;
-  iDay = 0;
-  iHour = 0;
-  iMinute = 0;
-  iSecond = 0;
-  if (!pData) {
-    return FALSE;
-  }
-  int32_t iRet = FALSE;
-  int32_t iIndex = 0;
-  while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
-    if (iIndex >= iLength) {
-      return iRet;
-    }
-    ++iIndex;
-  }
-  if (iIndex != 8 && iIndex != 10) {
-    return iRet;
-  }
-  int32_t iStyle = -1;
-  iRet = IsIsoDateFormat(pData, iIndex, iStyle, iYear, iMonth, iDay);
-  if (!iRet) {
-    return iRet;
-  }
-  if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
-    return iRet;
-  }
-  ++iIndex;
-  if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) &&
-      (iLength - iIndex != 15)) {
-    return iRet;
-  }
-  iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute,
-                         iSecond, iMillionSecond, iZoneHour, iZoneMinute);
-  if (!iRet) {
-    return iRet;
-  }
-  iRet = TRUE;
-  return iRet;
-}
-FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szDate,
-                                         const CFX_ByteStringC& szFormat,
-                                         const CFX_ByteStringC& szLocale,
-                                         CFX_ByteString& strIsoDate) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return FALSE;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocale.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
-  }
-  if (!pLocale) {
-    return FALSE;
-  }
-  CFX_WideString wsFormat;
-  if (szFormat.IsEmpty()) {
-    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-  } else {
-    wsFormat =
-        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
-  }
-  CXFA_LocaleValue widgetValue(
-      XFA_VT_DATE,
-      CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), wsFormat,
-      pLocale, (CXFA_LocaleMgr*)pMgr);
-  CFX_Unitime dt = widgetValue.GetDate();
-  strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay());
-  return TRUE;
-}
-FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szTime,
-                                         const CFX_ByteStringC& szFormat,
-                                         const CFX_ByteStringC& szLocale,
-                                         CFX_ByteString& strIsoTime) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return FALSE;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocale.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
-  }
-  if (!pLocale) {
-    return FALSE;
-  }
-  CFX_WideString wsFormat;
-  if (szFormat.IsEmpty()) {
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-  } else {
-    wsFormat =
-        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
-  }
-  wsFormat = FX_WSTRC(L"time{") + wsFormat;
-  wsFormat += FX_WSTRC(L"}");
-  CXFA_LocaleValue widgetValue(
-      XFA_VT_TIME,
-      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), wsFormat,
-      pLocale, (CXFA_LocaleMgr*)pMgr);
-  CFX_Unitime utime = widgetValue.GetTime();
-  strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(),
-                    utime.GetSecond(), utime.GetMillisecond());
-  return TRUE;
-}
-FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szDate,
-                                         const CFX_ByteStringC& szFormat,
-                                         const CFX_ByteStringC& szLocale,
-                                         CFX_ByteString& strLocalDate) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return FALSE;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocale.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
-  }
-  if (!pLocale) {
-    return FALSE;
-  }
-  CFX_WideString wsFormat;
-  if (szFormat.IsEmpty()) {
-    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-  } else {
-    wsFormat =
-        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
-  }
-  CXFA_LocaleValue widgetValue(
-      XFA_VT_DATE,
-      CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()),
-      (CXFA_LocaleMgr*)pMgr);
-  CFX_WideString wsRet;
-  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
-                             XFA_VALUEPICTURE_Display);
-  strLocalDate = FX_UTF8Encode(wsRet, wsRet.GetLength());
-  return TRUE;
-}
-FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szTime,
-                                         const CFX_ByteStringC& szFormat,
-                                         const CFX_ByteStringC& szLocale,
-                                         CFX_ByteString& strLocalTime) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return FALSE;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocale.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
-  }
-  if (!pLocale) {
-    return FALSE;
-  }
-  CFX_WideString wsFormat;
-  if (szFormat.IsEmpty()) {
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-  } else {
-    wsFormat =
-        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
-  }
-  wsFormat = FX_WSTRC(L"time{") + wsFormat;
-  wsFormat += FX_WSTRC(L"}");
-  CXFA_LocaleValue widgetValue(
-      XFA_VT_TIME,
-      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()),
-      (CXFA_LocaleMgr*)pMgr);
-  CFX_WideString wsRet;
-  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
-                             XFA_VALUEPICTURE_Display);
-  strLocalTime = FX_UTF8Encode(wsRet, wsRet.GetLength());
-  return TRUE;
-}
-FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis,
-                                      const CFX_ByteStringC& szTime,
-                                      const CFX_ByteStringC& szFormat,
-                                      const CFX_ByteStringC& szLocale,
-                                      CFX_ByteString& strGMTTime) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return FALSE;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocale.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));
-  }
-  if (!pLocale) {
-    return FALSE;
-  }
-  CFX_WideString wsFormat;
-  if (szFormat.IsEmpty()) {
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
-  } else {
-    wsFormat =
-        CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());
-  }
-  wsFormat = FX_WSTRC(L"time{") + wsFormat;
-  wsFormat += FX_WSTRC(L"}");
-  CXFA_LocaleValue widgetValue(
-      XFA_VT_TIME,
-      CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()),
-      (CXFA_LocaleMgr*)pMgr);
-  CFX_WideString wsRet;
-  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
-                             XFA_VALUEPICTURE_Display);
-  strGMTTime = FX_UTF8Encode(wsRet, wsRet.GetLength());
-  return TRUE;
-}
-int32_t CXFA_FM2JSContext::DateString2Num(const CFX_ByteStringC& szDateString) {
-  FX_BOOL bFlags = FALSE;
-  int32_t iLength = szDateString.GetLength();
-  FX_BOOL iRet = FALSE;
-  int32_t iStyle = -1;
-  int32_t iYear = 0;
-  int32_t iMonth = 0;
-  int32_t iDay = 0;
-  int32_t iHour = 0;
-  int32_t iMinute = 0;
-  int32_t iSecond = 0;
-  int32_t iMillionSecond = 0;
-  int32_t iZoneHour = 0;
-  int32_t iZoneMinute = 0;
-  if (iLength <= 10) {
-    iRet = IsIsoDateFormat(szDateString.GetCStr(), iLength, iStyle, iYear,
-                           iMonth, iDay);
-  } else {
-    iRet = IsIsoDateTimeFormat(szDateString.GetCStr(), iLength, iYear, iMonth,
-                               iDay, iHour, iMinute, iSecond, iMillionSecond,
-                               iZoneHour, iZoneMinute);
-  }
-  if (!iRet) {
-    bFlags = TRUE;
-  }
-  FX_FLOAT dDays = 0;
-  int32_t i = 1;
-  if (iYear < 1900) {
-    bFlags = TRUE;
-  }
-  if (!bFlags) {
-    while (iYear - i >= 1900) {
-      if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) {
-        dDays += 366;
-      } else {
-        dDays += 365;
-      }
-      ++i;
-    }
-    i = 1;
-    while (i < iMonth) {
-      if (i == 2) {
-        if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
-          dDays += 29;
-        } else {
-          dDays += 28;
-        }
-      } else if (i <= 7) {
-        if (i % 2 == 0) {
-          dDays += 30;
-        } else {
-          dDays += 31;
-        }
-      } else {
-        if (i % 2 == 0) {
-          dDays += 31;
-        } else {
-          dDays += 30;
-        }
-      }
-      ++i;
-    }
-    i = 0;
-    while (iDay - i > 0) {
-      dDays += 1;
-      ++i;
-    }
-  } else {
-    dDays = 0;
-  }
-  return (int32_t)dDays;
-}
-#define XFA_N 19
-static uint8_t g_sAltTable_Date[] = {
-    XFA_N, XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, 2,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, 1,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-};
-static uint8_t g_sAltTable_Time[] = {
-    14,    XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N,
-    XFA_N, 6,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 7,     XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, 1,     17,    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
-};
-static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString& wsPattern,
-                                            const CFX_WideString& wsAltSymbols,
-                                            uint8_t* pAltTable) {
-  int32_t nLength = wsPattern.GetLength();
-  FX_BOOL bInConstRange = FALSE;
-  FX_BOOL bEscape = FALSE;
-  int32_t i = 0, n = 0;
-  while (i < nLength) {
-    FX_WCHAR wc = wsPattern[i];
-    if (wc == L'\'') {
-      bInConstRange = !bInConstRange;
-      if (bEscape) {
-        i++;
-      } else {
-        wsPattern.Delete(i);
-        nLength--;
-      }
-      bEscape = !bEscape;
-      continue;
-    }
-    if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) {
-      int32_t nAlt = (int32_t)pAltTable[n];
-      if (nAlt != XFA_N) {
-        wsPattern.SetAt(i, wsAltSymbols[nAlt]);
-      }
-    }
-    i++;
-    bEscape = FALSE;
-  }
-}
-#undef XFA_N
-void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis,
-                                           int32_t iStyle,
-                                           const CFX_ByteStringC& szLocalStr,
-                                           CFX_ByteString& strFormat,
-                                           FX_BOOL bStandard) {
-  FX_LOCALEDATETIMESUBCATEGORY strStyle;
-  switch (iStyle) {
-    case 0:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-    case 1:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
-      break;
-    case 2:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-    case 3:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
-      break;
-    case 4:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
-      break;
-    default:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-  }
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocalStr.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));
-  }
-  if (!pLocale) {
-    return;
-  }
-  CFX_WideString strRet;
-  pLocale->GetDatePattern(strStyle, strRet);
-  if (!bStandard) {
-    CFX_WideString wsSymbols;
-    pLocale->GetDateTimeSymbols(wsSymbols);
-    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date);
-  }
-  strFormat = FX_UTF8Encode(strRet, strRet.GetLength());
-}
-void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis,
-                                           int32_t iStyle,
-                                           const CFX_ByteStringC& szLocalStr,
-                                           CFX_ByteString& strFormat,
-                                           FX_BOOL bStandard) {
-  FX_LOCALEDATETIMESUBCATEGORY strStyle;
-  switch (iStyle) {
-    case 0:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-    case 1:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
-      break;
-    case 2:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-    case 3:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
-      break;
-    case 4:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
-      break;
-    default:
-      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
-      break;
-  }
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return;
-  }
-  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-  IFX_Locale* pLocale = NULL;
-  if (szLocalStr.IsEmpty()) {
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    pLocale = widgetData.GetLocal();
-  } else {
-    pLocale = pMgr->GetLocaleByName(
-        CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));
-  }
-  if (!pLocale) {
-    return;
-  }
-  CFX_WideString strRet;
-  pLocale->GetTimePattern(strStyle, strRet);
-  if (!bStandard) {
-    CFX_WideString wsSymbols;
-    pLocale->GetDateTimeSymbols(wsSymbols);
-    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time);
-  }
-  strFormat = FX_UTF8Encode(strRet, strRet.GetLength());
-}
-void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis,
-                                              int32_t iStyle,
-                                              const CFX_ByteStringC& szLocalStr,
-                                              CFX_ByteString& strFormat) {
-  GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
-}
-void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis,
-                                              int32_t iStyle,
-                                              const CFX_ByteStringC& szLocalStr,
-                                              CFX_ByteString& strFormat) {
-  GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
-}
-void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis,
-                                    int32_t iTime,
-                                    const CFX_ByteStringC& szFormat,
-                                    const CFX_ByteStringC& szLocale,
-                                    FX_BOOL bGM,
-                                    CFX_ByteString& strTime) {
-  int32_t iHour = 0;
-  int32_t iMin = 0;
-  int32_t iSec = 0;
-  int32_t iZoneHour = 0;
-  int32_t iZoneMin = 0;
-  int32_t iZoneSec = 0;
-  iHour = static_cast<int>(iTime) / 3600000;
-  iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000;
-  iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000;
-  if (!bGM) {
-    GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec);
-    iHour += iZoneHour;
-    iMin += iZoneMin;
-    iSec += iZoneSec;
-  }
-  int32_t iRet = 0;
-  CFX_ByteString strIsoTime;
-  strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec);
-  if (bGM) {
-    iRet = GetGMTTime(hThis, strIsoTime, szFormat, szLocale, strTime);
-  } else {
-    iRet = IsoTime2Local(hThis, strIsoTime, szFormat, szLocale, strTime);
-  }
-  if (!iRet) {
-    strTime = "";
-  }
-}
-
-void CXFA_FM2JSContext::GetLocalTimeZone(int32_t& iHour,
-                                         int32_t& iMin,
-                                         int32_t& iSec) {
-  time_t now;
-  time(&now);
-  struct tm* pGmt = gmtime(&now);
-  int32_t iGMHour = pGmt->tm_hour;
-  int32_t iGMMin = pGmt->tm_min;
-  int32_t iGMSec = pGmt->tm_sec;
-  struct tm* pLocal = localtime(&now);
-  int32_t iLocalHour = pLocal->tm_hour;
-  int32_t iLocalMin = pLocal->tm_min;
-  int32_t iLocalSec = pLocal->tm_sec;
-  iHour = iLocalHour - iGMHour;
-  iMin = iLocalMin - iGMMin;
-  iSec = iLocalSec - iGMSec;
-}
-void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_DOUBLE nPrincipal = 0;
-    FX_DOUBLE nPayment = 0;
-    FX_DOUBLE nPeriods = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nPrincipal = HValueToDouble(hThis, argOne);
-      nPayment = HValueToDouble(hThis, argTwo);
-      nPeriods = HValueToDouble(hThis, argThree);
-      bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_DOUBLE r =
-            2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);
-        FX_DOUBLE nTemp = 1;
-        for (int32_t i = 0; i < nPeriods; ++i) {
-          nTemp *= (1 + r);
-        }
-        FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
-        while ((nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) &&
-               (!bFlags)) {
-          FX_DOUBLE nDerivative = 0;
-          nDerivative =
-              ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) -
-               (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
-              ((nTemp - 1) * (nTemp - 1));
-          if (nDerivative == 0) {
-            bFlags = TRUE;
-            continue;
-          }
-          r = r - nRet / nDerivative;
-          nTemp = 1;
-          for (int32_t i = 0; i < nPeriods; ++i) {
-            nTemp *= (1 + r);
-          }
-          nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
-        }
-        if (bFlags) {
-          FXJSE_Value_SetNull(args.GetReturnValue());
-        } else {
-          r = r * 12;
-          FXJSE_Value_SetDouble(args.GetReturnValue(), r);
-        }
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Apr");
-  }
-}
-void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nRate = 0;
-    FX_FLOAT nFutureValue = 0;
-    FX_FLOAT nInitAmount = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nRate = HValueToFloat(hThis, argOne);
-      nFutureValue = HValueToFloat(hThis, argTwo);
-      nInitAmount = HValueToFloat(hThis, argThree);
-      bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FXJSE_Value_SetFloat(args.GetReturnValue(),
-                             FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) /
-                                 FXSYS_log((FX_FLOAT)(1 + nRate)));
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"CTerm");
-  }
-}
-void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_DOUBLE nAmount = 0;
-    FX_DOUBLE nRate = 0;
-    FX_DOUBLE nPeriod = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nAmount = HValueToDouble(hThis, argOne);
-      nRate = HValueToDouble(hThis, argTwo);
-      nPeriod = HValueToDouble(hThis, argThree);
-      bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_DOUBLE dResult = 0;
-        if (!nRate) {
-          dResult = nAmount * nPeriod;
-        } else {
-          FX_DOUBLE nTemp = 1;
-          for (int i = 0; i < nPeriod; ++i) {
-            nTemp *= 1 + nRate;
-          }
-          dResult = nAmount * (nTemp - 1) / nRate;
-        }
-        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"FV");
-  }
-}
-void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 5) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nPrincpalAmount = 0;
-    FX_FLOAT nRate = 0;
-    FX_FLOAT nPayment = 0;
-    FX_FLOAT nFirstMonth = 0;
-    FX_FLOAT nNumberOfMonths = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
-    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
-              HValueIsNull(hThis, argFive));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nPrincpalAmount = HValueToFloat(hThis, argOne);
-      nRate = HValueToFloat(hThis, argTwo);
-      nPayment = HValueToFloat(hThis, argThree);
-      nFirstMonth = HValueToFloat(hThis, argFour);
-      nNumberOfMonths = HValueToFloat(hThis, argFive);
-      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
-                (nFirstMonth < 0) || (nNumberOfMonths < 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_FLOAT fResult = 0;
-        FX_FLOAT nRateOfMonth = nRate / 12;
-        int32_t iNums =
-            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
-                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
-                                              nRateOfMonth))) /
-                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
-        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
-        if (iEnd > iNums) {
-          iEnd = iNums;
-        }
-        FX_FLOAT nSum = 0;
-        if (nPayment < nPrincpalAmount * nRateOfMonth) {
-          bFlags = TRUE;
-          fResult = 0;
-        }
-        if (!bFlags) {
-          int32_t i = 0;
-          for (i = 0; i < nFirstMonth - 1; ++i) {
-            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
-          }
-          for (; i < iEnd; ++i) {
-            nSum += nPrincpalAmount * nRateOfMonth;
-            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
-          }
-          fResult = nSum;
-        }
-        FXJSE_Value_SetFloat(args.GetReturnValue(), fResult);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-    FXJSE_Value_Release(argFour);
-    FXJSE_Value_Release(argFive);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"IPmt");
-  }
-}
-void CXFA_FM2JSContext::NPV(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc > 2) {
-    FX_BOOL bFlags = FALSE;
-    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
-    for (int32_t i = 0; i < argc; i++) {
-      argValues[i] = GetSimpleHValue(hThis, args, i);
-      if (HValueIsNull(hThis, argValues[i])) {
-        bFlags = TRUE;
-      }
-    }
-    if (!bFlags) {
-      FX_DOUBLE nRate = 0;
-      nRate = HValueToDouble(hThis, argValues[0]);
-      if (nRate <= 0) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_DOUBLE* pData = FX_Alloc(FX_DOUBLE, argc - 1);
-        for (int32_t i = 1; i < argc; i++) {
-          pData[i - 1] = HValueToDouble(hThis, argValues[i]);
-        }
-        FX_DOUBLE nSum = 0;
-        int32_t iIndex = 0;
-        for (int32_t i = 0; i < argc - 1; i++) {
-          FX_DOUBLE nTemp = 1;
-          for (int32_t j = 0; j <= i; j++) {
-            nTemp *= 1 + nRate;
-          }
-          FX_DOUBLE nNum = *(pData + iIndex++);
-          nSum += nNum / nTemp;
-        }
-        FXJSE_Value_SetDouble(args.GetReturnValue(), nSum);
-        FX_Free(pData);
-        pData = 0;
-      }
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    for (int32_t i = 0; i < argc; i++) {
-      FXJSE_Value_Release(argValues[i]);
-    }
-    FX_Free(argValues);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"NPV");
-  }
-}
-void CXFA_FM2JSContext::Pmt(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nPrincipal = 0;
-    FX_FLOAT nRate = 0;
-    FX_FLOAT nPeriods = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nPrincipal = HValueToFloat(hThis, argOne);
-      nRate = HValueToFloat(hThis, argTwo);
-      nPeriods = HValueToFloat(hThis, argThree);
-      bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_FLOAT nSum = 0;
-        FX_FLOAT nTmp = 1 + nRate;
-        nSum = nTmp;
-        for (int32_t i = 0; i < nPeriods - 1; ++i) {
-          nSum *= nTmp;
-        }
-        FXJSE_Value_SetFloat(args.GetReturnValue(),
-                             (nPrincipal * nRate * nSum) / (nSum - 1));
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Pmt");
-  }
-}
-void CXFA_FM2JSContext::PPmt(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 5) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nPrincpalAmount = 0;
-    FX_FLOAT nRate = 0;
-    FX_FLOAT nPayment = 0;
-    FX_FLOAT nFirstMonth = 0;
-    FX_FLOAT nNumberOfMonths = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
-    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
-              HValueIsNull(hThis, argFive));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nPrincpalAmount = HValueToFloat(hThis, argOne);
-      nRate = HValueToFloat(hThis, argTwo);
-      nPayment = HValueToFloat(hThis, argThree);
-      nFirstMonth = HValueToFloat(hThis, argFour);
-      nNumberOfMonths = HValueToFloat(hThis, argFive);
-      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
-                (nFirstMonth < 0) || (nNumberOfMonths < 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
-        FX_FLOAT nSum = 0;
-        FX_FLOAT nRateOfMonth = nRate / 12;
-        int32_t iNums =
-            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
-                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
-                                              nRateOfMonth))) /
-                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
-        if (iEnd > iNums) {
-          iEnd = iNums;
-        }
-        if (nPayment < nPrincpalAmount * nRateOfMonth) {
-          bFlags = TRUE;
-        }
-        if (!bFlags) {
-          int32_t i = 0;
-          for (i = 0; i < nFirstMonth - 1; ++i) {
-            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
-          }
-          FX_FLOAT nTemp = 0;
-          for (; i < iEnd; ++i) {
-            nTemp = nPayment - nPrincpalAmount * nRateOfMonth;
-            nSum += nTemp;
-            nPrincpalAmount -= nTemp;
-          }
-          FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
-        } else {
-          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-        }
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-    FXJSE_Value_Release(argFour);
-    FXJSE_Value_Release(argFive);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"PPmt");
-  }
-}
-void CXFA_FM2JSContext::PV(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_DOUBLE nAmount = 0;
-    FX_DOUBLE nRate = 0;
-    FX_DOUBLE nPeriod = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nAmount = HValueToDouble(hThis, argOne);
-      nRate = HValueToDouble(hThis, argTwo);
-      nPeriod = HValueToDouble(hThis, argThree);
-      bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FX_DOUBLE nTemp = 1;
-        for (int32_t i = 0; i < nPeriod; ++i) {
-          nTemp *= 1 + nRate;
-        }
-        nTemp = 1 / nTemp;
-        FXJSE_Value_SetDouble(args.GetReturnValue(),
-                              nAmount * ((1 - nTemp) / nRate));
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"PV");
-  }
-}
-void CXFA_FM2JSContext::Rate(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nFuture = 0;
-    FX_FLOAT nPresent = 0;
-    FX_FLOAT nTotalNumber = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
-              HValueIsNull(hThis, argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nFuture = HValueToFloat(hThis, argOne);
-      nPresent = HValueToFloat(hThis, argTwo);
-      nTotalNumber = HValueToFloat(hThis, argThree);
-      bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FXJSE_Value_SetFloat(args.GetReturnValue(),
-                             (FXSYS_pow((FX_FLOAT)(nFuture / nPresent),
-                                        (FX_FLOAT)(1 / nTotalNumber)) -
-                              1));
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Rate");
-  }
-}
-void CXFA_FM2JSContext::Term(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 3) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT nMount = 0;
-    FX_FLOAT nRate = 0;
-    FX_FLOAT nFuture = 0;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
-    bFlags = (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo) ||
-              FXJSE_Value_IsNull(argThree));
-    if (bFlags) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      nMount = HValueToFloat(hThis, argOne);
-      nRate = HValueToFloat(hThis, argTwo);
-      nFuture = HValueToFloat(hThis, argThree);
-      bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0));
-      if (bFlags) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else {
-        FXJSE_Value_SetFloat(
-            args.GetReturnValue(),
-            (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) /
-             FXSYS_log((FX_FLOAT)(1 + nRate))));
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    FXJSE_Value_Release(argThree);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Term");
-  }
-}
-void CXFA_FM2JSContext::Choose(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  if (argc > 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FX_BOOL argOneIsNull = FALSE;
-    int32_t iIndex = 0;
-    argOneIsNull = HValueIsNull(hThis, argOne);
-    if (!argOneIsNull) {
-      iIndex = (int32_t)HValueToFloat(hThis, argOne);
-    }
-    FXJSE_Value_Release(argOne);
-    if (argOneIsNull) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else if (iIndex < 1) {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-    } else {
-      FX_BOOL bFound = FALSE;
-      FX_BOOL bStopCounterFlags = FALSE;
-      int32_t iArgIndex = 1;
-      int32_t iValueIndex = 0;
-      while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
-        FXJSE_HVALUE argIndexValue = args.GetValue(iArgIndex);
-        if (FXJSE_Value_IsArray(argIndexValue)) {
-          FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-          FXJSE_Value_GetObjectProp(argIndexValue, "length", lengthValue);
-          int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-          FXJSE_Value_Release(lengthValue);
-          if (iLength > 3) {
-            bStopCounterFlags = TRUE;
-          }
-          iValueIndex += (iLength - 2);
-          if (iValueIndex >= iIndex) {
-            FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-            FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-            FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-            FXJSE_Value_GetObjectPropByIdx(argIndexValue, 1, propertyValue);
-            FXJSE_Value_GetObjectPropByIdx(
-                argIndexValue, ((iLength - 1) - (iValueIndex - iIndex)),
-                jsobjectValue);
-            if (FXJSE_Value_IsNull(propertyValue)) {
-              GetObjectDefaultValue(jsobjectValue, newProperty);
-            } else {
-              CFX_ByteString propStr;
-              FXJSE_Value_ToUTF8String(propertyValue, propStr);
-              FXJSE_Value_GetObjectProp(jsobjectValue, propStr, newProperty);
-            }
-            CFX_ByteString bsChoosed;
-            HValueToUTF8String(newProperty, bsChoosed);
-            FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed);
-            FXJSE_Value_Release(newProperty);
-            FXJSE_Value_Release(jsobjectValue);
-            FXJSE_Value_Release(propertyValue);
-            bFound = TRUE;
-          }
-        } else {
-          iValueIndex++;
-          if (iValueIndex == iIndex) {
-            CFX_ByteString bsChoosed;
-            HValueToUTF8String(argIndexValue, bsChoosed);
-            FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed);
-            bFound = TRUE;
-          }
-        }
-        FXJSE_Value_Release(argIndexValue);
-        iArgIndex++;
-      }
-      if (!bFound) {
-        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Choose");
-  }
-}
-void CXFA_FM2JSContext::Exists(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FXJSE_Value_SetInteger(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Exists");
-  }
-}
-void CXFA_FM2JSContext::HasValue(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsUTF8String(argOne)) {
-      CFX_ByteString valueStr;
-      FXJSE_Value_ToUTF8String(argOne, valueStr);
-      valueStr.TrimLeft();
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty()));
-    } else if (FXJSE_Value_IsNumber(argOne) || FXJSE_Value_IsBoolean(argOne)) {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE);
-    } else {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"HasValue");
-  }
-}
-void CXFA_FM2JSContext::Oneof(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc > 1) {
-    FX_BOOL bFlags = FALSE;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE* parametersValue = 0;
-    int32_t iCount = 0;
-    unfoldArgs(hThis, args, parametersValue, iCount, 1);
-    for (int32_t i = 0; i < iCount; i++) {
-      if (simpleValueCompare(hThis, argOne, parametersValue[i])) {
-        bFlags = TRUE;
-        break;
-      }
-    }
-    FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
-    FXJSE_Value_Release(argOne);
-    for (int32_t i = 0; i < iCount; i++) {
-      FXJSE_Value_Release(parametersValue[i]);
-    }
-    FX_Free(parametersValue);
-    parametersValue = 0;
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Oneof");
-  }
-}
-void CXFA_FM2JSContext::Within(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc == 3) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetUndefined(args.GetReturnValue());
-    } else {
-      FXJSE_HVALUE argLow = GetSimpleHValue(hThis, args, 1);
-      FXJSE_HVALUE argHeight = GetSimpleHValue(hThis, args, 2);
-      if (FXJSE_Value_IsNumber(argOne)) {
-        FX_FLOAT oneNumber = HValueToFloat(hThis, argOne);
-        FX_FLOAT lowNumber = HValueToFloat(hThis, argLow);
-        FX_FLOAT heightNumber = HValueToFloat(hThis, argHeight);
-        FXJSE_Value_SetInteger(
-            args.GetReturnValue(),
-            ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)));
-      } else {
-        CFX_ByteString oneString;
-        CFX_ByteString lowString;
-        CFX_ByteString heightString;
-        HValueToUTF8String(argOne, oneString);
-        HValueToUTF8String(argLow, lowString);
-        HValueToUTF8String(argHeight, heightString);
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               ((oneString.Compare(lowString) >= 0) &&
-                                (oneString.Compare(heightString) <= 0)));
-      }
-      FXJSE_Value_Release(argLow);
-      FXJSE_Value_Release(argHeight);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Within");
-  }
-}
-void CXFA_FM2JSContext::If(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args) {
-  if (args.GetLength() == 3) {
-    FXJSE_HVALUE argCondition = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argFirstValue = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argSecondValue = GetSimpleHValue(hThis, args, 2);
-    FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition);
-    FXJSE_Value_Set(args.GetReturnValue(),
-                    bCondition ? argFirstValue : argSecondValue);
-    FXJSE_Value_Release(argSecondValue);
-    FXJSE_Value_Release(argFirstValue);
-    FXJSE_Value_Release(argCondition);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"If");
-  }
-}
-void CXFA_FM2JSContext::Eval(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE scriptValue = GetSimpleHValue(hThis, args, 0);
-    CFX_ByteString utf8ScriptString;
-    HValueToUTF8String(scriptValue, utf8ScriptString);
-    if (utf8ScriptString.IsEmpty()) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_WideTextBuf wsJavaScriptBuf;
-      CFX_WideString javaScript;
-      CFX_WideString wsError;
-      XFA_FM2JS_Translate(CFX_WideString::FromUTF8(
-                              utf8ScriptString, utf8ScriptString.GetLength()),
-                          wsJavaScriptBuf, wsError);
-      FXJSE_HCONTEXT hContext = FXJSE_Context_Create(hruntime);
-      FXJSE_HVALUE returnValue = FXJSE_Value_Create(hruntime);
-      javaScript = wsJavaScriptBuf.GetWideString();
-      FXJSE_ExecuteScript(hContext,
-                          FX_UTF8Encode(javaScript, javaScript.GetLength()),
-                          returnValue);
-      FXJSE_Value_Set(args.GetReturnValue(), returnValue);
-      FXJSE_Value_Release(returnValue);
-      FXJSE_Context_Release(hContext);
-    }
-    FXJSE_Value_Release(scriptValue);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Eval");
-  }
-}
-void CXFA_FM2JSContext::Ref(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_HVALUE rgValues[3];
-      for (int32_t i = 0; i < 3; i++) {
-        rgValues[i] = FXJSE_Value_Create(hruntime);
-      }
-      FXJSE_Value_SetInteger(rgValues[0], 4);
-      FXJSE_Value_SetNull(rgValues[1]);
-      FXJSE_Value_SetNull(rgValues[2]);
-      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
-      for (int32_t i = 0; i < 3; i++) {
-        FXJSE_Value_Release(rgValues[i]);
-      }
-    } else if (FXJSE_Value_IsArray(argOne)) {
-#ifndef NDEBUG
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
-      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
-      FXJSE_Value_Release(lengthValue);
-#endif
-      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
-      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
-      if (FXJSE_Value_IsNull(jsObjectValue)) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      } else if (FXJSE_Value_IsNull(propertyValue) &&
-                 (!FXJSE_Value_IsNull(jsObjectValue))) {
-        FXJSE_HVALUE rgValues[3];
-        for (int32_t i = 0; i < 3; i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 3);
-        FXJSE_Value_SetNull(rgValues[1]);
-        FXJSE_Value_Set(rgValues[2], jsObjectValue);
-        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
-        for (int32_t i = 0; i < 3; i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      }
-      FXJSE_Value_Release(jsObjectValue);
-      FXJSE_Value_Release(propertyValue);
-    } else if (FXJSE_Value_IsObject(argOne)) {
-      FXJSE_HVALUE rgValues[3];
-      for (int32_t i = 0; i < 3; i++) {
-        rgValues[i] = FXJSE_Value_Create(hruntime);
-      }
-      FXJSE_Value_SetInteger(rgValues[0], 3);
-      FXJSE_Value_SetNull(rgValues[1]);
-      FXJSE_Value_Set(rgValues[2], argOne);
-      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
-      for (int32_t i = 0; i < 3; i++) {
-        FXJSE_Value_Release(rgValues[i]);
-      }
-    } else if (FXJSE_Value_IsBoolean(argOne) ||
-               FXJSE_Value_IsUTF8String(argOne) ||
-               FXJSE_Value_IsNumber(argOne)) {
-      FXJSE_Value_Set(args.GetReturnValue(), argOne);
-    } else {
-      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Ref");
-  }
-}
-void CXFA_FM2JSContext::UnitType(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args) {
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(unitspanValue)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-      FXJSE_Value_Release(unitspanValue);
-      return;
-    }
-    CFX_ByteString unitspanString;
-    HValueToUTF8String(unitspanValue, unitspanString);
-    if (unitspanString.IsEmpty()) {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
-    } else {
-      enum XFA_FM2JS_VALUETYPE_ParserStatus {
-        VALUETYPE_START,
-        VALUETYPE_HAVEINVALIDCHAR,
-        VALUETYPE_HAVEDIGIT,
-        VALUETYPE_HAVEDIGITWHITE,
-        VALUETYPE_ISCM,
-        VALUETYPE_ISMM,
-        VALUETYPE_ISPT,
-        VALUETYPE_ISMP,
-        VALUETYPE_ISIN,
-      };
-      unitspanString.MakeLower();
-      CFX_WideString wsTypeString =
-          CFX_WideString::FromUTF8(unitspanString, unitspanString.GetLength());
-      const FX_WCHAR* pData = wsTypeString;
-      int32_t u = 0;
-      int32_t uLen = wsTypeString.GetLength();
-      while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
-             *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
-             *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
-        u++;
-      }
-      XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START;
-      FX_WCHAR typeChar;
-      while (u < uLen) {
-        typeChar = *(pData + u);
-        if (typeChar == 0x20 || typeChar == 0x09 || typeChar == 0x0B ||
-            typeChar == 0x0C || typeChar == 0x0A || typeChar == 0x0D) {
-          if (eParserStatus == VALUETYPE_HAVEDIGIT ||
-              eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
-            eParserStatus = VALUETYPE_HAVEDIGITWHITE;
-          } else {
-            eParserStatus = VALUETYPE_ISIN;
-            break;
-          }
-        } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' ||
-                   typeChar == '.') {
-          if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
-            eParserStatus = VALUETYPE_ISIN;
-            break;
-          } else {
-            eParserStatus = VALUETYPE_HAVEDIGIT;
-          }
-        } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) {
-          FX_WCHAR nextChar = *(pData + u + 1);
-          if ((eParserStatus == VALUETYPE_START ||
-               eParserStatus == VALUETYPE_HAVEDIGIT ||
-               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
-              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
-              nextChar != '-') {
-            eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT;
-            break;
-          } else {
-            eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
-          }
-        } else if (typeChar == 'm' && (u + 1 < uLen)) {
-          FX_WCHAR nextChar = *(pData + u + 1);
-          if ((eParserStatus == VALUETYPE_START ||
-               eParserStatus == VALUETYPE_HAVEDIGIT ||
-               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
-              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
-              nextChar != '-') {
-            eParserStatus = VALUETYPE_ISMM;
-            if (nextChar == 'p' ||
-                ((u + 5 < uLen) && *(pData + u + 1) == 'i' &&
-                 *(pData + u + 2) == 'l' && *(pData + u + 3) == 'l' &&
-                 *(pData + u + 4) == 'i' && *(pData + u + 5) == 'p')) {
-              eParserStatus = VALUETYPE_ISMP;
-            }
-            break;
-          }
-        } else {
-          eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
-        }
-        u++;
-      }
-      switch (eParserStatus) {
-        case VALUETYPE_ISCM:
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm");
-          break;
-        case VALUETYPE_ISMM:
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm");
-          break;
-        case VALUETYPE_ISPT:
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt");
-          break;
-        case VALUETYPE_ISMP:
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp");
-          break;
-        default:
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
-          break;
-      }
-    }
-    FXJSE_Value_Release(unitspanValue);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"UnitType");
-  }
-}
-void CXFA_FM2JSContext::UnitValue(FXJSE_HOBJECT hThis,
-                                  const CFX_ByteStringC& szFuncName,
-                                  CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc == 1) || (argc == 2)) {
-    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE unitValue = 0;
-    CFX_ByteString unitspanString;
-    FX_DOUBLE dFirstNumber = 0;
-    CFX_ByteString strFirstUnit;
-    CFX_ByteString strUnit;
-    if (FXJSE_Value_IsNull(unitspanValue)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      HValueToUTF8String(unitspanValue, unitspanString);
-      const FX_CHAR* pData = unitspanString;
-      if (pData) {
-        int32_t u = 0;
-        while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
-               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
-               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
-          ++u;
-        }
-        while (u < unitspanString.GetLength()) {
-          if ((*(pData + u) > '9' || *(pData + u) < '0') &&
-              *(pData + u) != '.' && *(pData + u) != '-') {
-            break;
-          }
-          ++u;
-        }
-        FX_CHAR* pTemp = NULL;
-        dFirstNumber = strtod(pData, &pTemp);
-        while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
-               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
-               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
-          ++u;
-        }
-        int32_t uLen = unitspanString.GetLength();
-        while (u < uLen) {
-          if (*(pData + u) == ' ') {
-            break;
-          }
-          strFirstUnit += (*(pData + u));
-          ++u;
-        }
-        strFirstUnit.MakeLower();
-        if (argc == 2) {
-          unitValue = GetSimpleHValue(hThis, args, 1);
-          CFX_ByteString unitTempString;
-          HValueToUTF8String(unitValue, unitTempString);
-          const FX_CHAR* pData = unitTempString;
-          int32_t u = 0;
-          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
-                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
-                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
-            ++u;
-          }
-          while (u < unitTempString.GetLength()) {
-            if ((*(pData + u) > '9' || *(pData + u) < '0') &&
-                *(pData + u) != '.') {
-              break;
-            }
-            ++u;
-          }
-          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
-                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
-                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
-            ++u;
-          }
-          int32_t uLen = unitTempString.GetLength();
-          while (u < uLen) {
-            if (*(pData + u) == ' ') {
-              break;
-            }
-            strUnit += (*(pData + u));
-            ++u;
-          }
-          strUnit.MakeLower();
-        } else {
-          strUnit = strFirstUnit;
-        }
-        FX_DOUBLE dResult = 0;
-        if (strFirstUnit.Equal("in") || strFirstUnit.Equal("inches")) {
-          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
-            dResult = dFirstNumber * 25.4;
-          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
-            dResult = dFirstNumber * 2.54;
-          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
-            dResult = dFirstNumber / 72;
-          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
-            dResult = dFirstNumber / 72000;
-          } else {
-            dResult = dFirstNumber;
-          }
-        } else if (strFirstUnit.Equal("mm") ||
-                   strFirstUnit.Equal("millimeters")) {
-          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
-            dResult = dFirstNumber;
-          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
-            dResult = dFirstNumber / 10;
-          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
-            dResult = dFirstNumber / 25.4 / 72;
-          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
-            dResult = dFirstNumber / 25.4 / 72000;
-          } else {
-            dResult = dFirstNumber / 25.4;
-          }
-        } else if (strFirstUnit.Equal("cm") ||
-                   strFirstUnit.Equal("centimeters")) {
-          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
-            dResult = dFirstNumber * 10;
-          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
-            dResult = dFirstNumber;
-          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
-            dResult = dFirstNumber / 2.54 / 72;
-          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
-            dResult = dFirstNumber / 2.54 / 72000;
-          } else {
-            dResult = dFirstNumber / 2.54;
-          }
-        } else if (strFirstUnit.Equal("pt") || strFirstUnit.Equal("points")) {
-          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
-            dResult = dFirstNumber / 72 * 25.4;
-          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
-            dResult = dFirstNumber / 72 * 2.54;
-          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
-            dResult = dFirstNumber;
-          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
-            dResult = dFirstNumber * 1000;
-          } else {
-            dResult = dFirstNumber / 72;
-          }
-        } else if (strFirstUnit.Equal("mp") ||
-                   strFirstUnit.Equal("millipoints")) {
-          if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) {
-            dResult = dFirstNumber / 72000 * 25.4;
-          } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) {
-            dResult = dFirstNumber / 72000 * 2.54;
-          } else if (strUnit.Equal("pt") || strUnit.Equal("points")) {
-            dResult = dFirstNumber / 1000;
-          } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) {
-            dResult = dFirstNumber;
-          } else {
-            dResult = dFirstNumber / 72000;
-          }
-        }
-        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
-      } else {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-      }
-    }
-    FXJSE_Value_Release(unitspanValue);
-    if (argc == 2) {
-      FXJSE_Value_Release(unitValue);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"UnitValue");
-  }
-}
-void CXFA_FM2JSContext::At(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString stringTwo;
-      HValueToUTF8String(argTwo, stringTwo);
-      if (stringTwo.IsEmpty()) {
-        FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
-      } else {
-        CFX_ByteString stringOne;
-        HValueToUTF8String(argOne, stringOne);
-        FX_STRSIZE iPosition = stringOne.Find(stringTwo);
-        FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"At");
-  }
-}
-void CXFA_FM2JSContext::Concat(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc >= 1) {
-    CFX_ByteString resultString;
-    FX_BOOL bAllNull = TRUE;
-    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
-    for (int32_t i = 0; i < argc; i++) {
-      argValues[i] = GetSimpleHValue(hThis, args, i);
-      if (!HValueIsNull(hThis, argValues[i])) {
-        CFX_ByteString valueStr;
-        HValueToUTF8String(argValues[i], valueStr);
-        resultString += valueStr;
-        bAllNull = FALSE;
-      }
-    }
-    for (int32_t i = 0; i < argc; i++) {
-      FXJSE_Value_Release(argValues[i]);
-    }
-    FX_Free(argValues);
-    if (bAllNull) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString);
-    }
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Concat");
-  }
-}
-void CXFA_FM2JSContext::Decode(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString toDecodeString;
-      HValueToUTF8String(argOne, toDecodeString);
-      CFX_ByteTextBuf resultBuf;
-      DecodeURL(toDecodeString, resultBuf);
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                resultBuf.GetByteString());
-    }
-    FXJSE_Value_Release(argOne);
-  } else if (argc == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString toDecodeString;
-      HValueToUTF8String(argOne, toDecodeString);
-      CFX_ByteString identifyString;
-      HValueToUTF8String(argTwo, identifyString);
-      CFX_ByteTextBuf resultBuf;
-      if (identifyString.EqualNoCase("html")) {
-        DecodeHTML(toDecodeString, resultBuf);
-      } else if (identifyString.EqualNoCase("xml")) {
-        DecodeXML(toDecodeString, resultBuf);
-      } else {
-        DecodeURL(toDecodeString, resultBuf);
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                resultBuf.GetByteString());
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Decode");
-  }
-}
-void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString,
-                                  CFX_ByteTextBuf& szResultString) {
-  CFX_WideString wsURLString =
-      CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength());
-  const FX_WCHAR* pData = wsURLString;
-  int32_t iLen = wsURLString.GetLength();
-  int32_t i = 0;
-  FX_WCHAR ch = 0;
-  FX_WCHAR chTemp = 0;
-  CFX_WideTextBuf wsResultBuf;
-  while (i < iLen) {
-    ch = *(pData + i);
-    if ('%' == ch) {
-      chTemp = 0;
-      int32_t iCount = 0;
-      while (iCount < 2) {
-        ++i;
-        ch = *(pData + i);
-        if (ch <= '9' && ch >= '0') {
-          if (!iCount) {
-            chTemp += (ch - '0') * 16;
-          } else {
-            chTemp += (ch - '0');
-          }
-        } else {
-          if (ch <= 'F' && ch >= 'A') {
-            if (!iCount) {
-              chTemp += (ch - 'A' + 10) * 16;
-            } else {
-              chTemp += (ch - 'A' + 10);
-            }
-          } else if (ch <= 'f' && ch >= 'a') {
-            if (!iCount) {
-              chTemp += (ch - 'a' + 10) * 16;
-            } else {
-              chTemp += (ch - 'a' + 10);
-            }
-          } else {
-            wsResultBuf.Clear();
-            return;
-          }
-        }
-        ++iCount;
-      }
-      wsResultBuf.AppendChar(chTemp);
-    } else {
-      wsResultBuf.AppendChar(ch);
-    }
-    ++i;
-  }
-  wsResultBuf.AppendChar(0);
-  szResultString.Clear();
-  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
-                                  wsResultBuf.GetLength());
-}
-void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString,
-                                   CFX_ByteTextBuf& szResultString) {
-  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(
-      szHTMLString.GetCStr(), szHTMLString.GetLength());
-  FX_WCHAR strString[9];
-  int32_t iStrIndex = 0;
-  int32_t iLen = wsHTMLString.GetLength();
-  int32_t i = 0;
-  int32_t iCode = 0;
-  FX_WCHAR ch = 0;
-  const FX_WCHAR* pData = wsHTMLString;
-  CFX_WideTextBuf wsResultBuf;
-  while (i < iLen) {
-    ch = *(pData + i);
-    if (ch == '&') {
-      ++i;
-      ch = *(pData + i);
-      if (ch == '#') {
-        ++i;
-        ch = *(pData + i);
-        if (ch == 'x' || ch == 'X') {
-          ++i;
-          ch = *(pData + i);
-          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
-              (ch <= 'F' && ch >= 'A')) {
-            while (ch != ';' && i < iLen) {
-              if (ch >= '0' && ch <= '9') {
-                iCode += ch - '0';
-              } else if (ch <= 'f' && ch >= 'a') {
-                iCode += ch - 'a' + 10;
-              } else if (ch <= 'F' && ch >= 'A') {
-                iCode += ch - 'A' + 10;
-              } else {
-                wsResultBuf.Clear();
-                return;
-              }
-              ++i;
-              iCode *= 16;
-              ch = *(pData + i);
-            }
-            iCode /= 16;
-          }
-        } else {
-          wsResultBuf.Clear();
-          return;
-        }
-      } else {
-        while (ch != ';' && i < iLen) {
-          strString[iStrIndex++] = ch;
-          ++i;
-          ch = *(pData + i);
-        }
-        strString[iStrIndex] = 0;
-      }
-    } else {
-      wsResultBuf.AppendChar(ch);
-      ++i;
-      continue;
-    }
-    uint32_t iData = 0;
-    if (HTMLSTR2Code(strString, iData)) {
-      wsResultBuf.AppendChar((FX_WCHAR)iData);
-    } else {
-      wsResultBuf.AppendChar(iCode);
-    }
-    iStrIndex = 0;
-    strString[iStrIndex] = 0;
-    ++i;
-  }
-  wsResultBuf.AppendChar(0);
-  szResultString.Clear();
-  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
-                                  wsResultBuf.GetLength());
-}
-void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString,
-                                  CFX_ByteTextBuf& szResultString) {
-  CFX_WideString wsXMLString =
-      CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength());
-  FX_WCHAR strString[9];
-  int32_t iStrIndex = 0;
-  int32_t iLen = wsXMLString.GetLength();
-  int32_t i = 0;
-  int32_t iCode = 0;
-  FX_WCHAR ch = 0;
-  const FX_WCHAR* pData = wsXMLString;
-  CFX_WideTextBuf wsXMLBuf;
-  while (i < iLen) {
-    ch = *(pData + i);
-    if (ch == '&') {
-      ++i;
-      ch = *(pData + i);
-      if (ch == '#') {
-        ++i;
-        ch = *(pData + i);
-        if (ch == 'x' || ch == 'X') {
-          ++i;
-          ch = *(pData + i);
-          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
-              (ch <= 'F' && ch >= 'A')) {
-            while (ch != ';') {
-              if (ch >= '0' && ch <= '9') {
-                iCode += ch - '0';
-              } else if (ch <= 'f' && ch >= 'a') {
-                iCode += ch - 'a' + 10;
-              } else if (ch <= 'F' && ch >= 'A') {
-                iCode += ch - 'A' + 10;
-              } else {
-                wsXMLBuf.Clear();
-                return;
-              }
-              ++i;
-              iCode *= 16;
-              ch = *(pData + i);
-            }
-            iCode /= 16;
-          }
-        } else {
-          wsXMLBuf.Clear();
-          return;
-        }
-      } else {
-        while (ch != ';' && i < iLen) {
-          strString[iStrIndex++] = ch;
-          ++i;
-          ch = *(pData + i);
-        }
-        strString[iStrIndex] = 0;
-      }
-    } else {
-      wsXMLBuf.AppendChar(ch);
-      ++i;
-      continue;
-    }
-    const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
-    int32_t iIndex = 0;
-    while (iIndex < 5) {
-      if (FXSYS_memcmp(strString, strName[iIndex],
-                       FXSYS_wcslen(strName[iIndex])) == 0) {
-        break;
-      }
-      ++iIndex;
-    }
-    switch (iIndex) {
-      case 0:
-        wsXMLBuf.AppendChar('"');
-        break;
-      case 1:
-        wsXMLBuf.AppendChar('&');
-        break;
-      case 2:
-        wsXMLBuf.AppendChar('\'');
-        break;
-      case 3:
-        wsXMLBuf.AppendChar('<');
-        break;
-      case 4:
-        wsXMLBuf.AppendChar('>');
-        break;
-      default:
-        wsXMLBuf.AppendChar(iCode);
-        break;
-    }
-    iStrIndex = 0;
-    strString[iStrIndex] = 0;
-    ++i;
-    iCode = 0;
-  }
-  wsXMLBuf.AppendChar(0);
-  szResultString.Clear();
-  szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength());
-}
-void CXFA_FM2JSContext::Encode(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString toEncodeString;
-      HValueToUTF8String(argOne, toEncodeString);
-      CFX_ByteTextBuf resultBuf;
-      EncodeURL(toEncodeString, resultBuf);
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                resultBuf.GetByteString());
-    }
-    FXJSE_Value_Release(argOne);
-  } else if (argc == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString toEncodeString;
-      HValueToUTF8String(argOne, toEncodeString);
-      CFX_ByteString identifyString;
-      HValueToUTF8String(argTwo, identifyString);
-      CFX_ByteTextBuf resultBuf;
-      if (identifyString.EqualNoCase("html")) {
-        EncodeHTML(toEncodeString, resultBuf);
-      } else if (identifyString.EqualNoCase("xml")) {
-        EncodeXML(toEncodeString, resultBuf);
-      } else {
-        EncodeURL(toEncodeString, resultBuf);
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                resultBuf.GetByteString());
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Encode");
-  }
-}
-void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString,
-                                  CFX_ByteTextBuf& szResultBuf) {
-  CFX_WideString wsURLString =
-      CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength());
-  CFX_WideTextBuf wsResultBuf;
-  FX_WCHAR ch = 0;
-  int32_t iLength = wsURLString.GetLength();
-  FX_WCHAR strEncode[4];
-  strEncode[0] = '%';
-  strEncode[3] = 0;
-  FX_WCHAR strUnsafe[] = {' ', '<',  '>', '"', '#', '%', '{', '}',
-                          '|', '\\', '^', '~', '[', ']', '`'};
-  FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'};
-  FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','};
-  const FX_WCHAR* strCode = L"0123456789abcdef";
-  for (int32_t u = 0; u < iLength; ++u) {
-    ch = wsURLString.GetAt(u);
-    int32_t i = 0;
-    int32_t iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]);
-    while (i < iCount) {
-      if (ch == strUnsafe[i]) {
-        int32_t iIndex = ch / 16;
-        strEncode[1] = strCode[iIndex];
-        strEncode[2] = strCode[ch - iIndex * 16];
-        wsResultBuf << FX_WSTRC(strEncode);
-        break;
-      }
-      ++i;
-    }
-    if (i < iCount) {
-      continue;
-    }
-    i = 0;
-    iCount = sizeof(strReserved) / sizeof(strReserved[0]);
-    while (i < iCount) {
-      if (ch == strReserved[i]) {
-        int32_t iIndex = ch / 16;
-        strEncode[1] = strCode[iIndex];
-        strEncode[2] = strCode[ch - iIndex * 16];
-        wsResultBuf << FX_WSTRC(strEncode);
-        break;
-      }
-      ++i;
-    }
-    if (i < iCount) {
-      continue;
-    }
-    i = 0;
-    iCount = sizeof(strSpecial) / sizeof(strSpecial[0]);
-    while (i < iCount) {
-      if (ch == strSpecial[i]) {
-        wsResultBuf.AppendChar(ch);
-        break;
-      }
-      ++i;
-    }
-    if (i < iCount) {
-      continue;
-    }
-    if (ch >= 0x80 && ch <= 0xff) {
-      int32_t iIndex = ch / 16;
-      strEncode[1] = strCode[iIndex];
-      strEncode[2] = strCode[ch - iIndex * 16];
-      wsResultBuf << FX_WSTRC(strEncode);
-    } else if (ch <= 0x1f || ch == 0x7f) {
-      int32_t iIndex = ch / 16;
-      strEncode[1] = strCode[iIndex];
-      strEncode[2] = strCode[ch - iIndex * 16];
-      wsResultBuf << FX_WSTRC(strEncode);
-    } else if (ch >= 0x20 && ch <= 0x7e) {
-      wsResultBuf.AppendChar(ch);
-    } else {
-      int32_t iRadix = 16;
-      CFX_WideString strTmp;
-      while (ch >= iRadix) {
-        FX_WCHAR tmp = strCode[ch % iRadix];
-        ch /= iRadix;
-        strTmp += tmp;
-      }
-      strTmp += strCode[ch];
-      int32_t iLen = strTmp.GetLength();
-      if (iLen < 2) {
-        break;
-      }
-      int32_t iIndex = 0;
-      if (iLen % 2 != 0) {
-        strEncode[1] = '0';
-        strEncode[2] = strTmp.GetAt(iLen - 1);
-        iIndex = iLen - 2;
-      } else {
-        strEncode[1] = strTmp.GetAt(iLen - 1);
-        strEncode[2] = strTmp.GetAt(iLen - 2);
-        iIndex = iLen - 3;
-      }
-      wsResultBuf << FX_WSTRC(strEncode);
-      while (iIndex > 0) {
-        strEncode[1] = strTmp.GetAt(iIndex);
-        strEncode[2] = strTmp.GetAt(iIndex - 1);
-        iIndex -= 2;
-        wsResultBuf << FX_WSTRC(strEncode);
-      }
-    }
-  }
-  wsResultBuf.AppendChar(0);
-  szResultBuf.Clear();
-  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
-                               wsResultBuf.GetLength());
-}
-void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString,
-                                   CFX_ByteTextBuf& szResultBuf) {
-  CFX_ByteString str = szHTMLString.GetCStr();
-  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str, str.GetLength());
-  const FX_WCHAR* strCode = L"0123456789abcdef";
-  FX_WCHAR strEncode[9];
-  strEncode[0] = '&';
-  strEncode[1] = '#';
-  strEncode[2] = 'x';
-  strEncode[5] = ';';
-  strEncode[6] = 0;
-  strEncode[7] = ';';
-  strEncode[8] = 0;
-  CFX_WideTextBuf wsResultBuf;
-  uint32_t ch = 0;
-  int32_t iLen = wsHTMLString.GetLength();
-  int32_t i = 0;
-  const FX_WCHAR* pData = wsHTMLString;
-  int32_t iIndex = 0;
-  CFX_WideString htmlReserve;
-  while (i < iLen) {
-    ch = *(pData + i);
-    htmlReserve.Empty();
-    if (HTMLCode2STR(ch, htmlReserve)) {
-      wsResultBuf.AppendChar(L'&');
-      wsResultBuf << htmlReserve;
-      wsResultBuf.AppendChar(L';');
-    } else {
-      if (ch >= 32 && ch <= 126) {
-        wsResultBuf.AppendChar((FX_WCHAR)ch);
-      } else if (ch < 256) {
-        iIndex = ch / 16;
-        strEncode[3] = strCode[iIndex];
-        strEncode[4] = strCode[ch - iIndex * 16];
-        strEncode[5] = ';';
-        strEncode[6] = 0;
-        wsResultBuf << FX_WSTRC(strEncode);
-      } else {
-        int32_t iBigByte = ch / 256;
-        int32_t iLittleByte = ch % 256;
-        strEncode[3] = strCode[iBigByte / 16];
-        strEncode[4] = strCode[iBigByte % 16];
-        strEncode[5] = strCode[iLittleByte / 16];
-        strEncode[6] = strCode[iLittleByte % 16];
-        wsResultBuf << FX_WSTRC(strEncode);
-      }
-    }
-    ++i;
-  }
-  wsResultBuf.AppendChar(0);
-  szResultBuf.Clear();
-  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
-                               wsResultBuf.GetLength());
-}
-void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString,
-                                  CFX_ByteTextBuf& szResultBuf) {
-  CFX_WideString wsXMLString =
-      CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength());
-  CFX_WideTextBuf wsResultBuf;
-  enum {
-    QUOT,
-    AMP,
-    APOS,
-    LT,
-    GT,
-  };
-  FX_WCHAR strEncode[9];
-  strEncode[0] = '&';
-  strEncode[1] = '#';
-  strEncode[2] = 'x';
-  strEncode[5] = ';';
-  strEncode[6] = 0;
-  strEncode[7] = ';';
-  strEncode[8] = 0;
-  const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
-  const FX_WCHAR* strCode = L"0123456789abcdef";
-  FX_WCHAR ch = 0;
-  int32_t iLength = wsXMLString.GetLength();
-  int32_t iIndex = 0;
-  int32_t u = 0;
-  const FX_WCHAR* pData = wsXMLString;
-  for (u = 0; u < iLength; ++u) {
-    ch = *(pData + u);
-    switch (ch) {
-      case '"':
-        wsResultBuf.AppendChar('&');
-        wsResultBuf << CFX_WideStringC(strName[QUOT]);
-        wsResultBuf.AppendChar(';');
-        break;
-      case '&':
-        wsResultBuf.AppendChar('&');
-        wsResultBuf << CFX_WideStringC(strName[AMP]);
-        wsResultBuf.AppendChar(';');
-        break;
-      case '\'':
-        wsResultBuf.AppendChar('&');
-        wsResultBuf << CFX_WideStringC(strName[APOS]);
-        wsResultBuf.AppendChar(';');
-        break;
-      case '<':
-        wsResultBuf.AppendChar('&');
-        wsResultBuf << CFX_WideStringC(strName[LT]);
-        wsResultBuf.AppendChar(';');
-        break;
-      case '>':
-        wsResultBuf.AppendChar('&');
-        wsResultBuf << CFX_WideStringC(strName[GT]);
-        wsResultBuf.AppendChar(';');
-        break;
-      default: {
-        if (ch >= 32 && ch <= 126) {
-          wsResultBuf.AppendChar(ch);
-        } else if (ch < 256) {
-          iIndex = ch / 16;
-          strEncode[3] = strCode[iIndex];
-          strEncode[4] = strCode[ch - iIndex * 16];
-          strEncode[5] = ';';
-          strEncode[6] = 0;
-          wsResultBuf << FX_WSTRC(strEncode);
-        } else {
-          int32_t iBigByte = ch / 256;
-          int32_t iLittleByte = ch % 256;
-          strEncode[3] = strCode[iBigByte / 16];
-          strEncode[4] = strCode[iBigByte % 16];
-          strEncode[5] = strCode[iLittleByte / 16];
-          strEncode[6] = strCode[iLittleByte % 16];
-          wsResultBuf << FX_WSTRC(strEncode);
-        }
-      } break;
-    }
-  }
-  wsResultBuf.AppendChar(0);
-  szResultBuf.Clear();
-  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(),
-                               wsResultBuf.GetLength());
-}
-FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData,
-                                        uint32_t& iCode) {
-  int32_t iLength = pData.GetLength();
-  uint32_t uHash = FX_HashCode_String_GetW(pData.GetPtr(), iLength);
-  XFA_FMHtmlHashedReserveCode htmlhashedreservecode;
-  int32_t iStart = 0,
-          iEnd = (sizeof(reservesForDecode) / sizeof(reservesForDecode[0])) - 1;
-  int32_t iMid = (iStart + iEnd) / 2;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    htmlhashedreservecode = reservesForDecode[iMid];
-    if (uHash == htmlhashedreservecode.m_uHash) {
-      iCode = htmlhashedreservecode.m_uCode;
-      return TRUE;
-    } else if (uHash < htmlhashedreservecode.m_uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return FALSE;
-}
-FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode,
-                                        CFX_WideString& wsHTMLReserve) {
-  XFA_FMHtmlReserveCode htmlreservecode;
-  int32_t iStart = 0,
-          iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1;
-  int32_t iMid = (iStart + iEnd) / 2;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    htmlreservecode = reservesForEncode[iMid];
-    if (iCode == htmlreservecode.m_uCode) {
-      wsHTMLReserve = htmlreservecode.m_htmlReserve;
-      return TRUE;
-    } else if (iCode < htmlreservecode.m_uCode) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return FALSE;
-}
-static FX_BOOL XFA_PATTERN_STRING_Type(const CFX_ByteStringC& szPattern,
-                                       FX_DWORD& patternType) {
-  CFX_WideString wsPattern =
-      CFX_WideString::FromUTF8(szPattern.GetCStr(), szPattern.GetLength());
-  if (FX_WSTRC(L"datetime") == wsPattern.Left(8)) {
-    patternType = XFA_VT_DATETIME;
-    return TRUE;
-  } else if (FX_WSTRC(L"date") == wsPattern.Left(4)) {
-    patternType = wsPattern.Find(L"time") > 0 ? XFA_VT_DATETIME : XFA_VT_DATE;
-    return TRUE;
-  } else if (FX_WSTRC(L"time") == wsPattern.Left(4)) {
-    patternType = XFA_VT_TIME;
-    return TRUE;
-  } else if (FX_WSTRC(L"text") == wsPattern.Left(4)) {
-    patternType = XFA_VT_TEXT;
-    return TRUE;
-  } else if (FX_WSTRC(L"num") == wsPattern.Left(3)) {
-    if (FX_WSTRC(L"integer") == wsPattern.Mid(4, 7)) {
-      patternType = XFA_VT_INTEGER;
-    } else if (FX_WSTRC(L"decimal") == wsPattern.Mid(4, 7)) {
-      patternType = XFA_VT_DECIMAL;
-    } else if (FX_WSTRC(L"currency") == wsPattern.Mid(4, 8)) {
-      patternType = XFA_VT_FLOAT;
-    } else if (FX_WSTRC(L"percent") == wsPattern.Mid(4, 7)) {
-      patternType = XFA_VT_FLOAT;
-    } else {
-      patternType = XFA_VT_FLOAT;
-    }
-    return TRUE;
-  }
-  patternType = XFA_VT_NULL;
-  wsPattern.MakeLower();
-  const FX_WCHAR* pData = wsPattern;
-  int32_t iLength = wsPattern.GetLength();
-  int32_t iIndex = 0;
-  FX_BOOL bSingleQuotation = FALSE;
-  FX_WCHAR patternChar;
-  while (iIndex < iLength) {
-    patternChar = *(pData + iIndex);
-    if (patternChar == 0x27) {
-      bSingleQuotation = !bSingleQuotation;
-    } else if (!bSingleQuotation &&
-               (patternChar == 'y' || patternChar == 'j')) {
-      patternType = XFA_VT_DATE;
-      iIndex++;
-      FX_WCHAR timePatternChar;
-      while (iIndex < iLength) {
-        timePatternChar = *(pData + iIndex);
-        if (timePatternChar == 0x27) {
-          bSingleQuotation = !bSingleQuotation;
-        } else if (!bSingleQuotation && timePatternChar == 't') {
-          patternType = XFA_VT_DATETIME;
-          break;
-        }
-        iIndex++;
-      }
-      break;
-    } else if (!bSingleQuotation &&
-               (patternChar == 'h' || patternChar == 'k')) {
-      patternType = XFA_VT_TIME;
-      break;
-    } else if (!bSingleQuotation &&
-               (patternChar == 'a' || patternChar == 'x' ||
-                patternChar == 'o' || patternChar == '0')) {
-      patternType = XFA_VT_TEXT;
-      if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') {
-        break;
-      }
-    } else if (!bSingleQuotation &&
-               (patternChar == 'z' || patternChar == 's' ||
-                patternChar == 'e' || patternChar == 'v' ||
-                patternChar == '8' || patternChar == ',' ||
-                patternChar == '.' || patternChar == '$')) {
-      patternType = XFA_VT_FLOAT;
-      if (patternChar == 'v' || patternChar == '8' || patternChar == '$') {
-        break;
-      }
-    }
-    iIndex++;
-  }
-  if (patternType == XFA_VT_NULL) {
-    patternType = XFA_VT_TEXT | XFA_VT_FLOAT;
-  }
-  return FALSE;
-}
-void CXFA_FM2JSContext::Format(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc >= 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    CFX_ByteString szPattern;
-    HValueToUTF8String(argOne, szPattern);
-    CFX_ByteString szValue;
-    HValueToUTF8String(argTwo, szValue);
-    CXFA_Document* pDoc = pContext->GetDocument();
-    IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-    FXSYS_assert(pThisNode);
-    CXFA_WidgetData widgetData(pThisNode);
-    IFX_Locale* pLocale = widgetData.GetLocal();
-    FX_DWORD patternType;
-    FX_BOOL bCompelte = XFA_PATTERN_STRING_Type(szPattern, patternType);
-    CFX_WideString wsPattern =
-        CFX_WideString::FromUTF8(szPattern, szPattern.GetLength());
-    CFX_WideString wsValue =
-        CFX_WideString::FromUTF8(szValue, szValue.GetLength());
-    if (!bCompelte) {
-      switch (patternType) {
-        case XFA_VT_DATETIME: {
-          FX_STRSIZE iTChar = wsPattern.Find(L'T');
-          CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
-          wsDatePattern += wsPattern.Left(iTChar);
-          wsDatePattern += FX_WSTRC(L"} ");
-          CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
-          wsTimePattern += wsPattern.Mid(iTChar + 1);
-          wsTimePattern += FX_WSTRC(L"}");
-          wsPattern = wsDatePattern + wsTimePattern;
-        } break;
-        case XFA_VT_DATE: {
-          wsPattern = FX_WSTRC(L"date{") + wsPattern;
-          wsPattern += FX_WSTRC(L"}");
-        } break;
-        case XFA_VT_TIME: {
-          wsPattern = FX_WSTRC(L"time{") + wsPattern;
-          wsPattern += FX_WSTRC(L"}");
-        } break;
-        case XFA_VT_TEXT: {
-          wsPattern = FX_WSTRC(L"text{") + wsPattern;
-          wsPattern += FX_WSTRC(L"}");
-        } break;
-        case XFA_VT_FLOAT: {
-          wsPattern = FX_WSTRC(L"num{") + wsPattern;
-          wsPattern += FX_WSTRC(L"}");
-        } break;
-        default: {
-          CFX_WideString wsTestPattern;
-          wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
-          wsTestPattern += FX_WSTRC(L"}");
-          CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
-                                           pLocale, (CXFA_LocaleMgr*)pMgr);
-          if (tempLocaleValue.IsValid()) {
-            wsPattern = wsTestPattern;
-            patternType = XFA_VT_FLOAT;
-          } else {
-            wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
-            wsTestPattern += FX_WSTRC(L"}");
-            wsPattern = wsTestPattern;
-            patternType = XFA_VT_TEXT;
-          }
-        } break;
-      }
-    }
-    CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
-                                 (CXFA_LocaleMgr*)pMgr);
-    CFX_WideString wsRet;
-    if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale,
-                                   XFA_VALUEPICTURE_Display)) {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                FX_UTF8Encode(wsRet, wsRet.GetLength()));
-    } else {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Format");
-  }
-}
-void CXFA_FM2JSContext::Left(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FX_BOOL argIsNull = FALSE;
-    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
-      argIsNull = TRUE;
-    }
-    if (argIsNull) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString sourceString;
-      HValueToUTF8String(argOne, sourceString);
-      int32_t count = HValueToInteger(hThis, argTwo);
-      if (count < 0) {
-        count = 0;
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                sourceString.Left(count));
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Left");
-  }
-}
-void CXFA_FM2JSContext::Len(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString sourceString;
-      HValueToUTF8String(argOne, sourceString);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), sourceString.GetLength());
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Len");
-  }
-}
-void CXFA_FM2JSContext::Lower(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 3)) {
-    CFX_ByteString argString;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE localeValue = 0;
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      if (argc == 2) {
-        localeValue = GetSimpleHValue(hThis, args, 1);
-      }
-      HValueToUTF8String(argOne, argString);
-      CFX_WideTextBuf lowStringBuf;
-      CFX_WideString wsArgString =
-          CFX_WideString::FromUTF8(argString, argString.GetLength());
-      const FX_WCHAR* pData = wsArgString;
-      int32_t iLen = argString.GetLength();
-      int32_t i = 0;
-      int32_t ch = 0;
-      while (i < iLen) {
-        ch = *(pData + i);
-        if (ch >= 0x41 && ch <= 0x5A) {
-          ch += 32;
-        } else if (ch >= 0xC0 && ch <= 0xDE) {
-          ch += 32;
-        } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) {
-          ch += 1;
-        }
-        lowStringBuf.AppendChar(ch);
-        ++i;
-      }
-      lowStringBuf.AppendChar(0);
-      FXJSE_Value_SetUTF8String(
-          args.GetReturnValue(),
-          FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength()));
-      if (argc == 2) {
-        FXJSE_Value_Release(localeValue);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Lower");
-  }
-}
-void CXFA_FM2JSContext::Ltrim(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString sourceString;
-      HValueToUTF8String(argOne, sourceString);
-      sourceString.TrimLeft();
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Ltrim");
-  }
-}
-void CXFA_FM2JSContext::Parse(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    if (HValueIsNull(hThis, argTwo)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString szPattern;
-      HValueToUTF8String(argOne, szPattern);
-      CFX_ByteString szValue;
-      HValueToUTF8String(argTwo, szValue);
-      CXFA_Document* pDoc = pContext->GetDocument();
-      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
-      CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
-      FXSYS_assert(pThisNode);
-      CXFA_WidgetData widgetData(pThisNode);
-      IFX_Locale* pLocale = widgetData.GetLocal();
-      FX_DWORD patternType;
-      FX_BOOL bCompletePattern =
-          XFA_PATTERN_STRING_Type(szPattern, patternType);
-      CFX_WideString wsPattern =
-          CFX_WideString::FromUTF8(szPattern, szPattern.GetLength());
-      CFX_WideString wsValue =
-          CFX_WideString::FromUTF8(szValue, szValue.GetLength());
-      CFX_ByteString szParsedValue;
-      if (bCompletePattern) {
-        CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
-                                     (CXFA_LocaleMgr*)pMgr);
-        if (localeValue.IsValid()) {
-          szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-        } else {
-          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-        }
-      } else {
-        switch (patternType) {
-          case XFA_VT_DATETIME: {
-            FX_STRSIZE iTChar = wsPattern.Find(L'T');
-            CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
-            wsDatePattern += wsPattern.Left(iTChar);
-            wsDatePattern += FX_WSTRC(L"} ");
-            CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
-            wsTimePattern += wsPattern.Mid(iTChar + 1);
-            wsTimePattern += FX_WSTRC(L"}");
-            wsPattern = wsDatePattern + wsTimePattern;
-            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-            } else {
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-            }
-          } break;
-          case XFA_VT_DATE: {
-            wsPattern = FX_WSTRC(L"date{") + wsPattern;
-            wsPattern += FX_WSTRC(L"}");
-            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-            } else {
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-            }
-          } break;
-          case XFA_VT_TIME: {
-            wsPattern = FX_WSTRC(L"time{") + wsPattern;
-            wsPattern += FX_WSTRC(L"}");
-            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-            } else {
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-            }
-          } break;
-          case XFA_VT_TEXT: {
-            wsPattern = FX_WSTRC(L"text{") + wsPattern;
-            wsPattern += FX_WSTRC(L"}");
-            CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-            } else {
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-            }
-          } break;
-          case XFA_VT_FLOAT: {
-            wsPattern = FX_WSTRC(L"num{") + wsPattern;
-            wsPattern += FX_WSTRC(L"}");
-            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              FXJSE_Value_SetDouble(args.GetReturnValue(),
-                                    localeValue.GetDoubleNum());
-            } else {
-              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-            }
-          } break;
-          default: {
-            CFX_WideString wsTestPattern;
-            wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
-            wsTestPattern += FX_WSTRC(L"}");
-            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
-                                         pLocale, (CXFA_LocaleMgr*)pMgr);
-            if (localeValue.IsValid()) {
-              FXJSE_Value_SetDouble(args.GetReturnValue(),
-                                    localeValue.GetDoubleNum());
-            } else {
-              wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
-              wsTestPattern += FX_WSTRC(L"}");
-              CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
-                                           pLocale, (CXFA_LocaleMgr*)pMgr);
-              if (localeValue.IsValid()) {
-                szParsedValue = FX_UTF8Encode(localeValue.GetValue());
-                FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue);
-              } else {
-                FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-              }
-            }
-          } break;
-        }
-      }
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Parse");
-  }
-}
-void CXFA_FM2JSContext::Replace(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc == 2) || (argc == 3)) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE argThree = 0;
-    CFX_ByteString oneString;
-    CFX_ByteString twoString;
-    CFX_ByteString threeString;
-    if (!HValueIsNull(hThis, argOne) && !HValueIsNull(hThis, argTwo)) {
-      HValueToUTF8String(argOne, oneString);
-      HValueToUTF8String(argTwo, twoString);
-    }
-    if (argc == 3) {
-      argThree = GetSimpleHValue(hThis, args, 2);
-      HValueToUTF8String(argThree, threeString);
-    }
-    int32_t iSrcLen = oneString.GetLength();
-    int32_t iFindLen = twoString.GetLength();
-    CFX_ByteTextBuf resultString;
-    int32_t iFindIndex = 0;
-    uint8_t ch = 0;
-    for (int32_t u = 0; u < iSrcLen; ++u) {
-      ch = oneString.GetAt(u);
-      if (ch == twoString.GetAt(iFindIndex)) {
-        int32_t iTemp = u + 1;
-        ++iFindIndex;
-        uint8_t chTemp = 0;
-        while (iFindIndex < iFindLen) {
-          chTemp = oneString.GetAt(iTemp);
-          if (chTemp == twoString.GetAt(iFindIndex)) {
-            ++iTemp;
-            ++iFindIndex;
-          } else {
-            iFindIndex = 0;
-            break;
-          }
-        }
-        if (iFindIndex == iFindLen) {
-          resultString << threeString;
-          u += iFindLen - 1;
-          iFindIndex = 0;
-        } else {
-          resultString.AppendChar(ch);
-        }
-      } else {
-        resultString.AppendChar(ch);
-      }
-    }
-    resultString.AppendChar(0);
-    FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                              resultString.GetByteString());
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    if (argc == 3) {
-      FXJSE_Value_Release(argThree);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Replace");
-  }
-}
-void CXFA_FM2JSContext::Right(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
-    FX_BOOL argIsNull = FALSE;
-    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
-      argIsNull = TRUE;
-    }
-    if (argIsNull) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString sourceString;
-      HValueToUTF8String(argOne, sourceString);
-      int32_t count = HValueToInteger(hThis, argTwo);
-      if (count < 0) {
-        count = 0;
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                sourceString.Right(count));
-    }
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Right");
-  }
-}
-void CXFA_FM2JSContext::Rtrim(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString sourceString;
-      HValueToUTF8String(argOne, sourceString);
-      sourceString.TrimRight();
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Rtrim");
-  }
-}
-void CXFA_FM2JSContext::Space(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      int32_t count = 0;
-      count = HValueToInteger(hThis, argOne);
-      count = (count < 0) ? 0 : count;
-      CFX_ByteTextBuf spaceString;
-      int32_t index = 0;
-      while (index < count) {
-        spaceString.AppendByte(' ');
-        index++;
-      }
-      spaceString.AppendByte(0);
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                spaceString.GetByteString());
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Space");
-  }
-}
-void CXFA_FM2JSContext::Str(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT fNumber;
-    int32_t iWidth = 10;
-    int32_t iPrecision = 0;
-    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE widthValue = 0;
-    FXJSE_HVALUE precisionValue = 0;
-    if (FXJSE_Value_IsNull(numberValue)) {
-      bFlags = TRUE;
-    } else {
-      fNumber = HValueToFloat(hThis, numberValue);
-    }
-    if (argc > 1) {
-      widthValue = GetSimpleHValue(hThis, args, 1);
-      iWidth = (int32_t)HValueToFloat(hThis, widthValue);
-    }
-    if (argc == 3) {
-      precisionValue = GetSimpleHValue(hThis, args, 2);
-      iPrecision = (int32_t)HValueToFloat(hThis, precisionValue);
-      if (iPrecision < 0) {
-        iPrecision = 0;
-      }
-    }
-    if (!bFlags) {
-      CFX_ByteString numberString;
-      CFX_ByteString formatStr = "%";
-      if (iPrecision) {
-        formatStr += ".";
-        formatStr += CFX_ByteString::FormatInteger(iPrecision);
-      }
-      formatStr += "f";
-      numberString.Format(formatStr, fNumber);
-      const FX_CHAR* pData = numberString;
-      int32_t iLength = numberString.GetLength();
-      int32_t u = 0;
-      while (u < iLength) {
-        if (*(pData + u) == '.') {
-          break;
-        }
-        ++u;
-      }
-      CFX_ByteTextBuf resultBuf;
-      if (u > iWidth || (iPrecision + u) >= iWidth) {
-        int32_t i = 0;
-        while (i < iWidth) {
-          resultBuf.AppendChar('*');
-          ++i;
-        }
-        resultBuf.AppendChar(0);
-      } else {
-        if (u == iLength) {
-          if (iLength > iWidth) {
-            int32_t i = 0;
-            while (i < iWidth) {
-              resultBuf.AppendChar('*');
-              ++i;
-            }
-          } else {
-            int32_t i = 0;
-            int32_t iSpace = iWidth - iLength;
-            while (i < iSpace) {
-              resultBuf.AppendChar(' ');
-              ++i;
-            }
-            resultBuf << pData;
-          }
-        } else {
-          int32_t iLeavingSpace = 0;
-          if (iPrecision == 0) {
-            iLeavingSpace = iWidth - (u + iPrecision);
-          } else {
-            iLeavingSpace = iWidth - (u + iPrecision + 1);
-          }
-          int32_t i = 0;
-          while (i < iLeavingSpace) {
-            resultBuf.AppendChar(' ');
-            ++i;
-          }
-          i = 0;
-          while (i < u) {
-            resultBuf.AppendChar(*(pData + i));
-            ++i;
-          }
-          if (iPrecision != 0) {
-            resultBuf.AppendChar('.');
-          }
-          u++;
-          i = 0;
-          while (u < iLength) {
-            if (i >= iPrecision) {
-              break;
-            }
-            resultBuf.AppendChar(*(pData + u));
-            ++i;
-            ++u;
-          }
-          while (i < iPrecision) {
-            resultBuf.AppendChar('0');
-            ++i;
-          }
-          resultBuf.AppendChar(0);
-        }
-      }
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                resultBuf.GetByteString());
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(numberValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(widthValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(precisionValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Str");
-  }
-}
-void CXFA_FM2JSContext::Stuff(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc == 3) || (argc == 4)) {
-    CFX_ByteString sourceString;
-    CFX_ByteString insertString;
-    int32_t iLength = 0;
-    int32_t iStart = 0;
-    int32_t iDelete = 0;
-    FXJSE_HVALUE sourceValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE deleteValue = GetSimpleHValue(hThis, args, 2);
-    FXJSE_HVALUE insertValue = 0;
-    if (!FXJSE_Value_IsNull(sourceValue) && !FXJSE_Value_IsNull(startValue) &&
-        !FXJSE_Value_IsNull(deleteValue)) {
-      HValueToUTF8String(sourceValue, sourceString);
-      iLength = sourceString.GetLength();
-      iStart = (int32_t)HValueToFloat(hThis, startValue);
-      if (iStart < 1) {
-        iStart = 1;
-      }
-      if (iStart > iLength) {
-        iStart = iLength;
-      }
-      iDelete = (int32_t)HValueToFloat(hThis, deleteValue);
-      if (iDelete <= 0) {
-        iDelete = 0;
-      }
-    }
-    if (argc == 4) {
-      insertValue = GetSimpleHValue(hThis, args, 3);
-      HValueToUTF8String(insertValue, insertString);
-    }
-    iStart -= 1;
-    CFX_ByteTextBuf resultString;
-    int32_t i = 0;
-    while (i < iStart) {
-      resultString.AppendChar(sourceString.GetAt(i));
-      ++i;
-    }
-    resultString << insertString;
-    i = iStart + iDelete;
-    while (i < iLength) {
-      resultString.AppendChar(sourceString.GetAt(i));
-      ++i;
-    }
-    resultString.AppendChar(0);
-    FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                              resultString.GetByteString());
-    FXJSE_Value_Release(sourceValue);
-    FXJSE_Value_Release(startValue);
-    FXJSE_Value_Release(deleteValue);
-    if (argc == 4) {
-      FXJSE_Value_Release(insertValue);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Stuff");
-  }
-}
-void CXFA_FM2JSContext::Substr(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if (argc == 3) {
-    FXJSE_HVALUE stringValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
-    FXJSE_HVALUE endValue = GetSimpleHValue(hThis, args, 2);
-    if (HValueIsNull(hThis, stringValue) || (HValueIsNull(hThis, startValue)) ||
-        (HValueIsNull(hThis, endValue))) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      CFX_ByteString szSourceStr;
-      int32_t iStart = 0;
-      int32_t iCount = 0;
-      HValueToUTF8String(stringValue, szSourceStr);
-      int32_t iLength = szSourceStr.GetLength();
-      if (iLength == 0) {
-        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-      } else {
-        iStart = (int32_t)HValueToFloat(hThis, startValue);
-        iCount = (int32_t)HValueToFloat(hThis, endValue);
-        if (iStart < 1) {
-          iStart = 1;
-        }
-        if (iStart > iLength) {
-          iStart = iLength;
-        }
-        if (iCount <= 0) {
-          iCount = 0;
-        }
-        iStart -= 1;
-        FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                  szSourceStr.Mid(iStart, iCount));
-      }
-    }
-    FXJSE_Value_Release(stringValue);
-    FXJSE_Value_Release(startValue);
-    FXJSE_Value_Release(endValue);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Substr");
-  }
-}
-void CXFA_FM2JSContext::Uuid(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    int32_t iNum = 0;
-    FXJSE_HVALUE argOne = 0;
-    if (argc == 1) {
-      argOne = GetSimpleHValue(hThis, args, 0);
-      iNum = (int32_t)HValueToFloat(hThis, argOne);
-    }
-    FX_GUID guid;
-    FX_GUID_CreateV4(&guid);
-    CFX_ByteString bsUId;
-    FX_GUID_ToString(&guid, bsUId, iNum);
-    FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsUId);
-    if (argc == 1) {
-      FXJSE_Value_Release(argOne);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Uuid");
-  }
-}
-void CXFA_FM2JSContext::Upper(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 3)) {
-    CFX_ByteString argString;
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE localeValue = 0;
-    if (HValueIsNull(hThis, argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      if (argc == 2) {
-        localeValue = GetSimpleHValue(hThis, args, 1);
-      }
-      HValueToUTF8String(argOne, argString);
-      CFX_WideTextBuf upperStringBuf;
-      CFX_WideString wsArgString =
-          CFX_WideString::FromUTF8(argString, argString.GetLength());
-      const FX_WCHAR* pData = wsArgString;
-      int32_t iLen = wsArgString.GetLength();
-      int32_t i = 0;
-      int32_t ch = 0;
-      while (i < iLen) {
-        ch = *(pData + i);
-        if (ch >= 0x61 && ch <= 0x7A) {
-          ch -= 32;
-        } else if (ch >= 0xE0 && ch <= 0xFE) {
-          ch -= 32;
-        } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) {
-          ch -= 1;
-        }
-        upperStringBuf.AppendChar(ch);
-        ++i;
-      }
-      upperStringBuf.AppendChar(0);
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                FX_UTF8Encode(upperStringBuf.GetBuffer(),
-                                              upperStringBuf.GetLength()));
-      if (argc == 2) {
-        FXJSE_Value_Release(localeValue);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Upper");
-  }
-}
-void CXFA_FM2JSContext::WordNum(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args) {
-  int32_t argc = args.GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    FX_BOOL bFlags = FALSE;
-    FX_FLOAT fNumber;
-    int32_t iIdentifier = 0;
-    CFX_ByteString localeString;
-    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE identifierValue = 0;
-    FXJSE_HVALUE localeValue = 0;
-    if (FXJSE_Value_IsNull(numberValue)) {
-      bFlags = TRUE;
-    } else {
-      fNumber = HValueToFloat(hThis, numberValue);
-    }
-    if (argc > 1) {
-      identifierValue = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(identifierValue)) {
-        bFlags = TRUE;
-      } else {
-        iIdentifier = (int32_t)HValueToFloat(hThis, identifierValue);
-      }
-    }
-    if (argc == 3) {
-      localeValue = GetSimpleHValue(hThis, args, 2);
-      if (FXJSE_Value_IsNull(localeValue)) {
-        bFlags = TRUE;
-      } else {
-        HValueToUTF8String(localeValue, localeString);
-      }
-    }
-    if (!bFlags) {
-      if ((fNumber < 0) || (fNumber > 922337203685477550)) {
-        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "*");
-      } else {
-        CFX_ByteTextBuf resultBuf;
-        CFX_ByteString numberString;
-        numberString.Format("%.2f", fNumber);
-        WordUS(numberString, iIdentifier, resultBuf);
-        FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                  resultBuf.GetByteString());
-      }
-    } else {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    }
-    FXJSE_Value_Release(numberValue);
-    if (argc > 1) {
-      FXJSE_Value_Release(identifierValue);
-      if (argc == 3) {
-        FXJSE_Value_Release(localeValue);
-      }
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"WordNum");
-  }
-}
-void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData,
-                                   CFX_ByteTextBuf& strBuf) {
-  CFX_ByteStringC pUnits[] = {"zero", "one", "two",   "three", "four",
-                              "five", "six", "seven", "eight", "nine"};
-  CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two",   "Three", "Four",
-                                 "Five", "Six", "Seven", "Eight", "Nine"};
-  CFX_ByteStringC pTens[] = {"Ten",      "Eleven",  "Twelve",  "Thirteen",
-                             "Fourteen", "Fifteen", "Sixteen", "Seventeen",
-                             "Eighteen", "Nineteen"};
-  CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty",  "Forty",  "Fifty",
-                                 "Sixty",  "Seventy", "Eighty", "Ninety"};
-  CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ",
-                             " Billion ", "Trillion"};
-  int32_t iComm = 0;
-  const FX_CHAR* pData = szData.GetCStr();
-  int32_t iLength = szData.GetLength();
-  if (iLength > 12) {
-    iComm = 4;
-  } else if (iLength > 9) {
-    iComm = 3;
-  } else if (iLength > 6) {
-    iComm = 2;
-  } else if (iLength > 3) {
-    iComm = 1;
-  }
-  int32_t iIndex = 0;
-  int32_t iFirstCount = iLength % 3;
-  if (iFirstCount == 0) {
-    iFirstCount = 3;
-  }
-  if (iFirstCount == 3) {
-    if (*(pData + iIndex) != '0') {
-      strBuf << pCapUnits[*(pData + iIndex) - '0'];
-      strBuf << pComm[0];
-    }
-    if (*(pData + iIndex + 1) == '0') {
-      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
-    } else {
-      if (*(pData + iIndex + 1) > '1') {
-        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
-        strBuf << "-";
-        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
-      } else if (*(pData + iIndex + 1) == '1') {
-        strBuf << pTens[*(pData + iIndex + 2) - '0'];
-      } else if (*(pData + iIndex + 1) == '0') {
-        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
-      }
-    }
-    iIndex += 3;
-  } else if (iFirstCount == 2) {
-    if (*(pData + iIndex) == '0') {
-      strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
-    } else {
-      if (*(pData + iIndex) > '1') {
-        strBuf << pLastTens[*(pData + iIndex) - '2'];
-        strBuf << "-";
-        strBuf << pUnits[*(pData + iIndex + 1) - '0'];
-      } else if (*(pData + iIndex) == '1') {
-        strBuf << pTens[*(pData + iIndex + 1) - '0'];
-      } else if (*(pData + iIndex) == '0') {
-        strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
-      }
-    }
-    iIndex += 2;
-  } else if (iFirstCount == 1) {
-    strBuf << pCapUnits[*(pData + iIndex) - '0'];
-    iIndex += 1;
-  }
-  if (iLength > 3 && iFirstCount > 0) {
-    strBuf << pComm[iComm];
-    --iComm;
-  }
-  while (iIndex < iLength) {
-    if (*(pData + iIndex) != '0') {
-      strBuf << pCapUnits[*(pData + iIndex) - '0'];
-      strBuf << pComm[0];
-    }
-    if (*(pData + iIndex + 1) == '0') {
-      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
-    } else {
-      if (*(pData + iIndex + 1) > '1') {
-        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
-        strBuf << "-";
-        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
-      } else if (*(pData + iIndex + 1) == '1') {
-        strBuf << pTens[*(pData + iIndex + 2) - '0'];
-      } else if (*(pData + iIndex + 1) == '0') {
-        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
-      }
-    }
-    if (iIndex < iLength - 3) {
-      strBuf << pComm[iComm];
-      --iComm;
-    }
-    iIndex += 3;
-  }
-}
-void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData,
-                               int32_t iStyle,
-                               CFX_ByteTextBuf& strBuf) {
-  const FX_CHAR* pData = szData.GetCStr();
-  int32_t iLength = szData.GetLength();
-  switch (iStyle) {
-    case 0: {
-      int32_t iIndex = 0;
-      while (iIndex < iLength) {
-        if (*(pData + iIndex) == '.') {
-          break;
-        }
-        ++iIndex;
-      }
-      iLength = iIndex;
-      iIndex = 0;
-      int32_t iCount = 0;
-      while (iIndex < iLength) {
-        iCount = (iLength - iIndex) % 12;
-        if (!iCount && iLength - iIndex > 0) {
-          iCount = 12;
-        }
-        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
-        iIndex += iCount;
-        if (iIndex < iLength) {
-          strBuf << " Trillion ";
-        }
-      }
-    } break;
-    case 1: {
-      int32_t iIndex = 0;
-      while (iIndex < iLength) {
-        if (*(pData + iIndex) == '.') {
-          break;
-        }
-        ++iIndex;
-      }
-      iLength = iIndex;
-      iIndex = 0;
-      int32_t iCount = 0;
-      while (iIndex < iLength) {
-        iCount = (iLength - iIndex) % 12;
-        if (!iCount && iLength - iIndex > 0) {
-          iCount = 12;
-        }
-        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
-        iIndex += iCount;
-        if (iIndex < iLength) {
-          strBuf << " Trillion ";
-        }
-      }
-      strBuf << " Dollars";
-    } break;
-    case 2: {
-      int32_t iIndex = 0;
-      while (iIndex < iLength) {
-        if (*(pData + iIndex) == '.') {
-          break;
-        }
-        ++iIndex;
-      }
-      int32_t iInteger = iIndex;
-      iIndex = 0;
-      int32_t iCount = 0;
-      while (iIndex < iInteger) {
-        iCount = (iInteger - iIndex) % 12;
-        if (!iCount && iLength - iIndex > 0) {
-          iCount = 12;
-        }
-        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
-        iIndex += iCount;
-        if (iIndex < iInteger) {
-          strBuf << " Trillion ";
-        }
-      }
-      strBuf << " Dollars";
-      if (iInteger < iLength) {
-        strBuf << " And ";
-        iIndex = iInteger + 1;
-        int32_t iCount = 0;
-        while (iIndex < iLength) {
-          iCount = (iLength - iIndex) % 12;
-          if (!iCount && iLength - iIndex > 0) {
-            iCount = 12;
-          }
-          TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
-          iIndex += iCount;
-          if (iIndex < iLength) {
-            strBuf << " Trillion ";
-          }
-        }
-        strBuf << " Cents";
-      }
-    } break;
-    default:
-      break;
-  }
-}
-void CXFA_FM2JSContext::Get(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    CXFA_Document* pDoc = pContext->GetDocument();
-    if (!pDoc) {
-      return;
-    }
-    IXFA_AppProvider* pAppProvider =
-        pDoc->GetParser()->GetNotify()->GetAppProvider();
-    if (!pAppProvider) {
-      return;
-    }
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    CFX_ByteString urlString;
-    HValueToUTF8String(argOne, urlString);
-    IFX_FileRead* pFile = pAppProvider->DownloadURL(
-        CFX_WideString::FromUTF8(urlString, urlString.GetLength()));
-    if (pFile) {
-      int32_t size = pFile->GetSize();
-      uint8_t* pData = FX_Alloc(uint8_t, size);
-      pFile->ReadBlock(pData, size);
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
-                                CFX_ByteStringC(pData, size));
-      FX_Free(pData);
-      pFile->Release();
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Get");
-  }
-}
-void CXFA_FM2JSContext::Post(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if ((argc >= 2) && (argc <= 5)) {
-    CXFA_Document* pDoc = pContext->GetDocument();
-    if (!pDoc) {
-      return;
-    }
-    IXFA_AppProvider* pAppProvider =
-        pDoc->GetParser()->GetNotify()->GetAppProvider();
-    if (!pAppProvider) {
-      return;
-    }
-    CFX_ByteString bsURL;
-    CFX_ByteString bsData;
-    CFX_ByteString bsContentType;
-    CFX_ByteString bsEncode;
-    CFX_ByteString bsHeader;
-    FXJSE_HVALUE argOne;
-    FXJSE_HVALUE argTwo;
-    FXJSE_HVALUE argThree;
-    FXJSE_HVALUE argFour;
-    FXJSE_HVALUE argFive;
-    argOne = GetSimpleHValue(hThis, args, 0);
-    HValueToUTF8String(argOne, bsURL);
-    argTwo = GetSimpleHValue(hThis, args, 1);
-    HValueToUTF8String(argTwo, bsData);
-    if (argc > 2) {
-      argThree = GetSimpleHValue(hThis, args, 2);
-      HValueToUTF8String(argThree, bsContentType);
-    }
-    if (argc > 3) {
-      argFour = GetSimpleHValue(hThis, args, 3);
-      HValueToUTF8String(argFour, bsEncode);
-    }
-    if (argc > 4) {
-      argFive = GetSimpleHValue(hThis, args, 4);
-      HValueToUTF8String(argFive, bsHeader);
-    }
-    CFX_WideString decodedResponse;
-    FX_BOOL bFlags = pAppProvider->PostRequestURL(
-        CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()),
-        CFX_WideString::FromUTF8(bsData, bsData.GetLength()),
-        CFX_WideString::FromUTF8(bsContentType, bsContentType.GetLength()),
-        CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()),
-        CFX_WideString::FromUTF8(bsHeader, bsHeader.GetLength()),
-        decodedResponse);
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    if (argc > 2) {
-      FXJSE_Value_Release(argThree);
-    }
-    if (argc > 3) {
-      FXJSE_Value_Release(argFour);
-    }
-    if (argc > 4) {
-      FXJSE_Value_Release(argFive);
-    }
-    if (bFlags) {
-      FXJSE_Value_SetUTF8String(
-          args.GetReturnValue(),
-          FX_UTF8Encode(decodedResponse, decodedResponse.GetLength()));
-    } else {
-      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
-    }
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Post");
-  }
-}
-void CXFA_FM2JSContext::Put(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if ((argc == 2) || (argc == 3)) {
-    CXFA_Document* pDoc = pContext->GetDocument();
-    if (!pDoc) {
-      return;
-    }
-    IXFA_AppProvider* pAppProvider =
-        pDoc->GetParser()->GetNotify()->GetAppProvider();
-    if (!pAppProvider) {
-      return;
-    }
-    CFX_ByteString bsURL;
-    CFX_ByteString bsData;
-    CFX_ByteString bsEncode;
-    FXJSE_HVALUE argOne;
-    FXJSE_HVALUE argTwo;
-    FXJSE_HVALUE argThree;
-    argOne = GetSimpleHValue(hThis, args, 0);
-    HValueToUTF8String(argOne, bsURL);
-    argTwo = GetSimpleHValue(hThis, args, 1);
-    HValueToUTF8String(argTwo, bsData);
-    if (argc > 2) {
-      argThree = GetSimpleHValue(hThis, args, 2);
-      HValueToUTF8String(argThree, bsEncode);
-    }
-    FX_BOOL bFlags = pAppProvider->PutRequestURL(
-        CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()),
-        CFX_WideString::FromUTF8(bsData, bsData.GetLength()),
-        CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()));
-    FXJSE_Value_Release(argOne);
-    FXJSE_Value_Release(argTwo);
-    if (argc > 2) {
-      FXJSE_Value_Release(argThree);
-    }
-    if (bFlags) {
-      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
-    } else {
-      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
-    }
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Put");
-  }
-}
-void CXFA_FM2JSContext::assign_value_operator(FXJSE_HOBJECT hThis,
-                                              const CFX_ByteStringC& szFuncName,
-                                              CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE lValue = args.GetValue(0);
-    FXJSE_HVALUE rValue = GetSimpleHValue(hThis, args, 1);
-    FX_BOOL bSetStatus = TRUE;
-    if (FXJSE_Value_IsArray(lValue)) {
-      FXJSE_HVALUE leftLengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(lValue, "length", leftLengthValue);
-      int32_t iLeftLength = FXJSE_Value_ToInteger(leftLengthValue);
-      FXJSE_Value_Release(leftLengthValue);
-      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(lValue, 1, propertyValue);
-      if (FXJSE_Value_IsNull(propertyValue)) {
-        for (int32_t i = 2; i < iLeftLength; i++) {
-          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
-          bSetStatus = SetObjectDefaultValue(jsObjectValue, rValue);
-          if (!bSetStatus) {
-            pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
-            break;
-          }
-        }
-      } else {
-        CFX_ByteString propertyStr;
-        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-        for (int32_t i = 2; i < iLeftLength; i++) {
-          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
-          FXJSE_Value_SetObjectProp(jsObjectValue, propertyStr, rValue);
-        }
-      }
-      FXJSE_Value_Release(jsObjectValue);
-      FXJSE_Value_Release(propertyValue);
-    } else if (FXJSE_Value_IsObject(lValue)) {
-      bSetStatus = SetObjectDefaultValue(lValue, rValue);
-      if (!bSetStatus) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
-      }
-    }
-    FXJSE_Value_Set(args.GetReturnValue(), rValue);
-    FXJSE_Value_Release(lValue);
-    FXJSE_Value_Release(rValue);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::logical_or_operator(FXJSE_HOBJECT hThis,
-                                            const CFX_ByteStringC& szFuncName,
-                                            CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_FLOAT first = HValueToFloat(hThis, argFirst);
-      FX_FLOAT second = HValueToFloat(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first || second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::logical_and_operator(FXJSE_HOBJECT hThis,
-                                             const CFX_ByteStringC& szFuncName,
-                                             CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_FLOAT first = HValueToFloat(hThis, argFirst);
-      FX_FLOAT second = HValueToFloat(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first && second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::equality_operator(FXJSE_HOBJECT hThis,
-                                          const CFX_ByteStringC& szFuncName,
-                                          CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    if (fm_ref_equal(hThis, args)) {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
-    } else {
-      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-        FXJSE_Value_SetInteger(
-            args.GetReturnValue(),
-            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
-                ? 1
-                : 0);
-      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-                 FXJSE_Value_IsUTF8String(argSecond)) {
-        CFX_ByteString firstOutput;
-        CFX_ByteString secondOutput;
-        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               firstOutput.Equal(secondOutput) ? 1 : 0);
-      } else {
-        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               (first == second) ? 1 : 0);
-      }
-      FXJSE_Value_Release(argFirst);
-      FXJSE_Value_Release(argSecond);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::notequality_operator(FXJSE_HOBJECT hThis,
-                                             const CFX_ByteStringC& szFuncName,
-                                             CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    if (fm_ref_equal(hThis, args)) {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-    } else {
-      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-        FXJSE_Value_SetInteger(
-            args.GetReturnValue(),
-            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
-                ? 0
-                : 1);
-      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-                 FXJSE_Value_IsUTF8String(argSecond)) {
-        CFX_ByteString firstOutput;
-        CFX_ByteString secondOutput;
-        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               firstOutput.Equal(secondOutput) ? 0 : 1);
-      } else {
-        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-        FXJSE_Value_SetInteger(args.GetReturnValue(),
-                               (first == second) ? 0 : 1);
-      }
-      FXJSE_Value_Release(argFirst);
-      FXJSE_Value_Release(argSecond);
-    }
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-FX_BOOL CXFA_FM2JSContext::fm_ref_equal(FXJSE_HOBJECT hThis,
-                                        CFXJSE_Arguments& args) {
-  FX_BOOL bRet = FALSE;
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  FXJSE_HVALUE argFirst = args.GetValue(0);
-  FXJSE_HVALUE argSecond = args.GetValue(0);
-  if (FXJSE_Value_IsArray(argFirst) && FXJSE_Value_IsArray(argSecond)) {
-    FXJSE_HVALUE firstFlagValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE secondFlagValue = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectPropByIdx(argFirst, 0, firstFlagValue);
-    FXJSE_Value_GetObjectPropByIdx(argSecond, 0, secondFlagValue);
-    if ((FXJSE_Value_ToInteger(firstFlagValue) == 3) &&
-        (FXJSE_Value_ToInteger(secondFlagValue) == 3)) {
-      FXJSE_HVALUE firstJSObject = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE secondJSObject = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(argFirst, 2, firstJSObject);
-      FXJSE_Value_GetObjectPropByIdx(argSecond, 2, secondJSObject);
-      if (!FXJSE_Value_IsNull(firstJSObject) &&
-          !FXJSE_Value_IsNull(secondJSObject)) {
-        bRet = (FXJSE_Value_ToObject(firstJSObject, NULL) ==
-                FXJSE_Value_ToObject(secondJSObject, NULL));
-      }
-      FXJSE_Value_Release(firstJSObject);
-      FXJSE_Value_Release(secondJSObject);
-    }
-    FXJSE_Value_Release(firstFlagValue);
-    FXJSE_Value_Release(secondFlagValue);
-  }
-  FXJSE_Value_Release(argFirst);
-  FXJSE_Value_Release(argSecond);
-  return bRet;
-}
-void CXFA_FM2JSContext::less_operator(FXJSE_HOBJECT hThis,
-                                      const CFX_ByteStringC& szFuncName,
-                                      CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-               FXJSE_Value_IsUTF8String(argSecond)) {
-      CFX_ByteString firstOutput;
-      CFX_ByteString secondOutput;
-      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-      FXJSE_Value_SetInteger(args.GetReturnValue(),
-                             (firstOutput.Compare(secondOutput) == -1) ? 1 : 0);
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first < second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::lessequal_operator(FXJSE_HOBJECT hThis,
-                                           const CFX_ByteStringC& szFuncName,
-                                           CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetInteger(
-          args.GetReturnValue(),
-          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
-                                                                          : 0);
-    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-               FXJSE_Value_IsUTF8String(argSecond)) {
-      CFX_ByteString firstOutput;
-      CFX_ByteString secondOutput;
-      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-      FXJSE_Value_SetInteger(args.GetReturnValue(),
-                             (firstOutput.Compare(secondOutput) != 1) ? 1 : 0);
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first <= second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::greater_operator(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szFuncName,
-                                         CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
-    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-               FXJSE_Value_IsUTF8String(argSecond)) {
-      CFX_ByteString firstOutput;
-      CFX_ByteString secondOutput;
-      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-      FXJSE_Value_SetInteger(args.GetReturnValue(),
-                             (firstOutput.Compare(secondOutput) == 1) ? 1 : 0);
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first > second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::greaterequal_operator(FXJSE_HOBJECT hThis,
-                                              const CFX_ByteStringC& szFuncName,
-                                              CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetInteger(
-          args.GetReturnValue(),
-          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
-                                                                          : 0);
-    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
-               FXJSE_Value_IsUTF8String(argSecond)) {
-      CFX_ByteString firstOutput;
-      CFX_ByteString secondOutput;
-      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
-      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
-      FXJSE_Value_SetInteger(args.GetReturnValue(),
-                             (firstOutput.Compare(secondOutput) != -1) ? 1 : 0);
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first >= second) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::plus_operator(FXJSE_HOBJECT hThis,
-                                      const CFX_ByteStringC& szFuncName,
-                                      CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = args.GetValue(0);
-    FXJSE_HVALUE argSecond = args.GetValue(1);
-    if (HValueIsNull(hThis, argFirst) && HValueIsNull(hThis, argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetDouble(args.GetReturnValue(), first + second);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::minus_operator(FXJSE_HOBJECT hThis,
-                                       const CFX_ByteStringC& szFuncName,
-                                       CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetDouble(args.GetReturnValue(), first - second);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::multiple_operator(FXJSE_HOBJECT hThis,
-                                          const CFX_ByteStringC& szFuncName,
-                                          CFXJSE_Arguments& args) {
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      FXJSE_Value_SetDouble(args.GetReturnValue(), first * second);
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::divide_operator(FXJSE_HOBJECT hThis,
-                                        const CFX_ByteStringC& szFuncName,
-                                        CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  if (args.GetLength() == 2) {
-    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
-    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
-    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
-      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
-      if (second == 0.0) {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
-      } else {
-        FXJSE_Value_SetDouble(args.GetReturnValue(), first / second);
-      }
-    }
-    FXJSE_Value_Release(argFirst);
-    FXJSE_Value_Release(argSecond);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::positive_operator(FXJSE_HOBJECT hThis,
-                                          const CFX_ByteStringC& szFuncName,
-                                          CFXJSE_Arguments& args) {
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FXJSE_Value_SetDouble(args.GetReturnValue(),
-                            0.0 + HValueToDouble(hThis, argOne));
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::negative_operator(FXJSE_HOBJECT hThis,
-                                          const CFX_ByteStringC& szFuncName,
-                                          CFXJSE_Arguments& args) {
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FXJSE_Value_SetDouble(args.GetReturnValue(),
-                            0.0 - HValueToDouble(hThis, argOne));
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::logical_not_operator(FXJSE_HOBJECT hThis,
-                                             const CFX_ByteStringC& szFuncName,
-                                             CFXJSE_Arguments& args) {
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    if (FXJSE_Value_IsNull(argOne)) {
-      FXJSE_Value_SetNull(args.GetReturnValue());
-    } else {
-      FX_DOUBLE first = HValueToDouble(hThis, argOne);
-      FXJSE_Value_SetInteger(args.GetReturnValue(), (first == 0.0) ? 1 : 0);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    CXFA_FM2JSContext* pContext =
-        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::dot_accessor(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  if ((argc == 4) || (argc == 5)) {
-    FX_BOOL bIsStar = TRUE;
-    FXJSE_HVALUE argAccessor = args.GetValue(0);
-    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
-    CFX_ByteString szName = args.GetUTF8String(2);
-    int32_t iIndexFlags = args.GetInt32(3);
-    int32_t iIndexValue = 0;
-    FXJSE_HVALUE argIndex = NULL;
-    if (argc == 5) {
-      bIsStar = FALSE;
-      argIndex = args.GetValue(4);
-      iIndexValue = HValueToInteger(hThis, argIndex);
-    }
-    CFX_ByteString szSomExp;
-    GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp);
-    if (FXJSE_Value_IsArray(argAccessor)) {
-      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
-      FXJSE_Value_Release(hLengthValue);
-      int32_t iCounter = 0;
-      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
-      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
-      for (int32_t i = 0; i < (iLength - 2); i++) {
-        iSizes[i] = 0;
-      }
-      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
-      FX_BOOL bAttribute = FALSE;
-      for (int32_t i = 2; i < iLength; i++) {
-        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
-        XFA_RESOLVENODE_RS resoveNodeRS;
-        int32_t iRet = ResolveObjects(hThis, hJSObjValue, szSomExp,
-                                      resoveNodeRS, TRUE, szName.IsEmpty());
-        if (iRet > 0) {
-          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
-                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
-          iCounter += iSizes[i - 2];
-        }
-      }
-      FXJSE_Value_Release(hJSObjValue);
-      if (iCounter > 0) {
-        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
-        for (int32_t i = 0; i < (iCounter + 2); i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 1);
-        if (bAttribute) {
-          FXJSE_Value_SetUTF8String(rgValues[1], szName);
-        } else {
-          FXJSE_Value_SetNull(rgValues[1]);
-        }
-        int32_t iIndex = 2;
-        for (int32_t i = 0; i < iLength - 2; i++) {
-          for (int32_t j = 0; j < iSizes[i]; j++) {
-            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
-            iIndex++;
-          }
-        }
-        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
-        for (int32_t i = 0; i < (iCounter + 2); i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-        FX_Free(rgValues);
-      } else {
-        CFX_WideString wsPropertyName =
-            CFX_WideString::FromUTF8(szName, szName.GetLength());
-        CFX_WideString wsSomExpression =
-            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                                          (const FX_WCHAR*)wsPropertyName,
-                                          (const FX_WCHAR*)wsSomExpression);
-      }
-      for (int32_t i = 0; i < iLength - 2; i++) {
-        for (int32_t j = 0; j < iSizes[i]; j++) {
-          FXJSE_Value_Release(hResolveValues[i][j]);
-        }
-        if (iSizes[i] > 0) {
-          FX_Free(hResolveValues[i]);
-        }
-      }
-      FX_Free(hResolveValues);
-      FX_Free(iSizes);
-    } else {
-      XFA_RESOLVENODE_RS resoveNodeRS;
-      int32_t iRet = 0;
-      if (FXJSE_Value_IsObject(argAccessor) ||
-          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
-        iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, TRUE,
-                              szName.IsEmpty());
-      } else if (!FXJSE_Value_IsObject(argAccessor) &&
-                 !bsAccessorName.IsEmpty()) {
-        FX_BOOL bGetObject =
-            GetObjectByName(hThis, argAccessor, bsAccessorName);
-        if (bGetObject) {
-          iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS,
-                                TRUE, szName.IsEmpty());
-        }
-      }
-      if (iRet > 0) {
-        FXJSE_HVALUE* hResolveValues;
-        int32_t iSize = 0;
-        FX_BOOL bAttribute = FALSE;
-        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
-                           iSize, bAttribute);
-        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
-        for (int32_t i = 0; i < (iSize + 2); i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 1);
-        if (bAttribute) {
-          FXJSE_Value_SetUTF8String(rgValues[1], szName);
-        } else {
-          FXJSE_Value_SetNull(rgValues[1]);
-        }
-        for (int32_t i = 0; i < iSize; i++) {
-          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
-        }
-        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
-        for (int32_t i = 0; i < (iSize + 2); i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-        FX_Free(rgValues);
-        for (int32_t i = 0; i < iSize; i++) {
-          FXJSE_Value_Release(hResolveValues[i]);
-        }
-        FX_Free(hResolveValues);
-      } else {
-        CFX_WideString wsPropertyName =
-            CFX_WideString::FromUTF8(szName, szName.GetLength());
-        CFX_WideString wsSomExpression =
-            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                                          (const FX_WCHAR*)wsPropertyName,
-                                          (const FX_WCHAR*)wsSomExpression);
-      }
-    }
-    if (argc == 5) {
-      FXJSE_Value_Release(argIndex);
-    }
-    FXJSE_Value_Release(argAccessor);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::dotdot_accessor(FXJSE_HOBJECT hThis,
-                                        const CFX_ByteStringC& szFuncName,
-                                        CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  if ((argc == 4) || (argc == 5)) {
-    FX_BOOL bIsStar = TRUE;
-    FXJSE_HVALUE argAccessor = args.GetValue(0);
-    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
-    CFX_ByteString szName = args.GetUTF8String(2);
-    int32_t iIndexFlags = args.GetInt32(3);
-    int32_t iIndexValue = 0;
-    FXJSE_HVALUE argIndex = NULL;
-    if (argc == 5) {
-      bIsStar = FALSE;
-      argIndex = args.GetValue(4);
-      iIndexValue = HValueToInteger(hThis, argIndex);
-    }
-    CFX_ByteString szSomExp;
-    GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp);
-    if (FXJSE_Value_IsArray(argAccessor)) {
-      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
-      int32_t iCounter = 0;
-      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
-      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
-      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
-      FX_BOOL bAttribute = FALSE;
-      for (int32_t i = 2; i < iLength; i++) {
-        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
-        XFA_RESOLVENODE_RS resoveNodeRS;
-        int32_t iRet =
-            ResolveObjects(hThis, hJSObjValue, szSomExp, resoveNodeRS, FALSE);
-        if (iRet > 0) {
-          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
-                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
-          iCounter += iSizes[i - 2];
-        }
-      }
-      FXJSE_Value_Release(hJSObjValue);
-      if (iCounter > 0) {
-        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
-        for (int32_t i = 0; i < (iCounter + 2); i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 1);
-        if (bAttribute) {
-          FXJSE_Value_SetUTF8String(rgValues[1], szName);
-        } else {
-          FXJSE_Value_SetNull(rgValues[1]);
-        }
-        int32_t iIndex = 2;
-        for (int32_t i = 0; i < iLength - 2; i++) {
-          for (int32_t j = 0; j < iSizes[i]; j++) {
-            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
-            iIndex++;
-          }
-        }
-        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
-        for (int32_t i = 0; i < (iCounter + 2); i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-        FX_Free(rgValues);
-      } else {
-        CFX_WideString wsPropertyName =
-            CFX_WideString::FromUTF8(szName, szName.GetLength());
-        CFX_WideString wsSomExpression =
-            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                                          (const FX_WCHAR*)wsPropertyName,
-                                          (const FX_WCHAR*)wsSomExpression);
-      }
-      for (int32_t i = 0; i < iLength - 2; i++) {
-        for (int32_t j = 0; j < iSizes[i]; j++) {
-          FXJSE_Value_Release(hResolveValues[i][j]);
-        }
-        FX_Free(hResolveValues[i]);
-      }
-      FX_Free(hResolveValues);
-      FX_Free(iSizes);
-      FXJSE_Value_Release(hLengthValue);
-    } else {
-      XFA_RESOLVENODE_RS resoveNodeRS;
-      int32_t iRet = 0;
-      if (FXJSE_Value_IsObject(argAccessor) ||
-          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
-        iRet =
-            ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE);
-      } else if (!FXJSE_Value_IsObject(argAccessor) &&
-                 !bsAccessorName.IsEmpty()) {
-        FX_BOOL bGetObject =
-            GetObjectByName(hThis, argAccessor, bsAccessorName);
-        if (bGetObject) {
-          iRet =
-              ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE);
-        }
-      }
-      if (iRet > 0) {
-        FXJSE_HVALUE* hResolveValues;
-        int32_t iSize = 0;
-        FX_BOOL bAttribute = FALSE;
-        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
-                           iSize, bAttribute);
-        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
-        for (int32_t i = 0; i < (iSize + 2); i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 1);
-        if (bAttribute) {
-          FXJSE_Value_SetUTF8String(rgValues[1], szName);
-        } else {
-          FXJSE_Value_SetNull(rgValues[1]);
-        }
-        for (int32_t i = 0; i < iSize; i++) {
-          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
-        }
-        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
-        for (int32_t i = 0; i < (iSize + 2); i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-        FX_Free(rgValues);
-        for (int32_t i = 0; i < iSize; i++) {
-          FXJSE_Value_Release(hResolveValues[i]);
-        }
-        FX_Free(hResolveValues);
-      } else {
-        CFX_WideString wsPropertyName =
-            CFX_WideString::FromUTF8(szName, szName.GetLength());
-        CFX_WideString wsSomExpression =
-            CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength());
-        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                                          (const FX_WCHAR*)wsPropertyName,
-                                          (const FX_WCHAR*)wsSomExpression);
-      }
-    }
-    if (argc == 5) {
-      FXJSE_Value_Release(argIndex);
-    }
-    FXJSE_Value_Release(argAccessor);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::eval_translation(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szFuncName,
-                                         CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
-    CFX_ByteString argString;
-    HValueToUTF8String(argOne, argString);
-    if (argString.IsEmpty()) {
-      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    } else {
-      CFX_WideString scriptString =
-          CFX_WideString::FromUTF8(argString, argString.GetLength());
-      CFX_WideTextBuf wsJavaScriptBuf;
-      CFX_WideString wsError;
-      XFA_FM2JS_Translate(scriptString, wsJavaScriptBuf, wsError);
-      if (wsError.IsEmpty()) {
-        CFX_WideString javaScript = wsJavaScriptBuf.GetWideString();
-        FXJSE_Value_SetUTF8String(
-            args.GetReturnValue(),
-            FX_UTF8Encode(javaScript, javaScript.GetLength()));
-      } else {
-        pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-      }
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                                      L"Eval");
-  }
-}
-void CXFA_FM2JSContext::is_fm_object(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FXJSE_Value_SetBoolean(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
-    FXJSE_Value_Release(argOne);
-  } else {
-    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
-  }
-}
-void CXFA_FM2JSContext::is_fm_array(FXJSE_HOBJECT hThis,
-                                    const CFX_ByteStringC& szFuncName,
-                                    CFXJSE_Arguments& args) {
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    FX_BOOL bIsArray = FXJSE_Value_IsArray(argOne);
-    FXJSE_Value_SetBoolean(args.GetReturnValue(), bIsArray);
-    FXJSE_Value_Release(argOne);
-  } else {
-    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
-  }
-}
-void CXFA_FM2JSContext::get_fm_value(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t iLength = args.GetLength();
-  if (iLength == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (FXJSE_Value_IsArray(argOne)) {
-      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
-      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsobjectValue);
-      if (FXJSE_Value_IsNull(propertyValue)) {
-        GetObjectDefaultValue(jsobjectValue, args.GetReturnValue());
-      } else {
-        CFX_ByteString propertyStr;
-        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr,
-                                  args.GetReturnValue());
-      }
-      FXJSE_Value_Release(propertyValue);
-      FXJSE_Value_Release(jsobjectValue);
-    } else if (FXJSE_Value_IsObject(argOne)) {
-      GetObjectDefaultValue(argOne, args.GetReturnValue());
-    } else {
-      FXJSE_Value_Set(args.GetReturnValue(), argOne);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::get_fm_jsobj(FXJSE_HOBJECT hThis,
-                                     const CFX_ByteStringC& szFuncName,
-                                     CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(hThis, nullptr));
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (FXJSE_Value_IsArray(argOne)) {
-#ifndef NDEBUG
-      FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
-      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
-      FXJSE_Value_Release(lengthValue);
-#endif
-      FXJSE_Value_GetObjectPropByIdx(argOne, 2, args.GetReturnValue());
-    } else {
-      FXJSE_Value_Set(args.GetReturnValue(), argOne);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::fm_var_filter(FXJSE_HOBJECT hThis,
-                                      const CFX_ByteStringC& szFuncName,
-                                      CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t argc = args.GetLength();
-  if (argc == 1) {
-    FXJSE_HVALUE argOne = args.GetValue(0);
-    if (FXJSE_Value_IsArray(argOne)) {
-#ifndef NDEBUG
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
-      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
-      FXJSE_Value_Release(lengthValue);
-#endif
-      FXJSE_HVALUE flagsValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(argOne, 0, flagsValue);
-      int32_t iFlags = FXJSE_Value_ToInteger(flagsValue);
-      FXJSE_Value_Release(flagsValue);
-      if (iFlags == 4) {
-        FXJSE_HVALUE rgValues[3];
-        for (int32_t i = 0; i < 3; i++) {
-          rgValues[i] = FXJSE_Value_Create(hruntime);
-        }
-        FXJSE_Value_SetInteger(rgValues[0], 3);
-        FXJSE_Value_SetNull(rgValues[1]);
-        FXJSE_Value_SetNull(rgValues[2]);
-        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
-        for (int32_t i = 0; i < 3; i++) {
-          FXJSE_Value_Release(rgValues[i]);
-        }
-      } else if (iFlags == 3) {
-        FXJSE_HVALUE objectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argOne, 2, objectValue);
-        if (!FXJSE_Value_IsNull(objectValue)) {
-          FXJSE_Value_Set(args.GetReturnValue(), argOne);
-        } else {
-          pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-        }
-        FXJSE_Value_Release(objectValue);
-      } else {
-        FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
-        FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
-        FXJSE_Value_Release(simpleValue);
-      }
-    } else {
-      FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
-      FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
-      FXJSE_Value_Release(simpleValue);
-    }
-    FXJSE_Value_Release(argOne);
-  } else {
-    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
-  }
-}
-void CXFA_FM2JSContext::concat_fm_object(FXJSE_HOBJECT hThis,
-                                         const CFX_ByteStringC& szFuncName,
-                                         CFXJSE_Arguments& args) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  uint32_t iLength = 0;
-  int32_t argCount = args.GetLength();
-  FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argCount);
-  for (int32_t i = 0; i < argCount; i++) {
-    argValues[i] = args.GetValue(i);
-    if (FXJSE_Value_IsArray(argValues[i])) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
-      int32_t length = FXJSE_Value_ToInteger(lengthValue);
-      iLength = iLength + ((length > 2) ? (length - 2) : 0);
-      FXJSE_Value_Release(lengthValue);
-    }
-    iLength += 1;
-  }
-  FXJSE_HVALUE* returnValues = FX_Alloc(FXJSE_HVALUE, iLength);
-  for (int32_t i = 0; i < (int32_t)iLength; i++) {
-    returnValues[i] = FXJSE_Value_Create(hruntime);
-  }
-  int32_t index = 0;
-  for (int32_t i = 0; i < argCount; i++) {
-    if (FXJSE_Value_IsArray(argValues[i])) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
-      int32_t length = FXJSE_Value_ToInteger(lengthValue);
-      for (int32_t j = 2; j < length; j++) {
-        FXJSE_Value_GetObjectPropByIdx(argValues[i], j, returnValues[index]);
-        index++;
-      }
-      FXJSE_Value_Release(lengthValue);
-    }
-    FXJSE_Value_Set(returnValues[index], argValues[i]);
-    index++;
-  }
-  FXJSE_Value_SetArray(args.GetReturnValue(), iLength, returnValues);
-  for (int32_t i = 0; i < argCount; i++) {
-    FXJSE_Value_Release(argValues[i]);
-  }
-  FX_Free(argValues);
-  for (int32_t i = 0; i < (int32_t)iLength; i++) {
-    FXJSE_Value_Release(returnValues[i]);
-  }
-  FX_Free(returnValues);
-}
-FXJSE_HVALUE CXFA_FM2JSContext::GetSimpleHValue(FXJSE_HOBJECT hThis,
-                                                CFXJSE_Arguments& args,
-                                                uint32_t index) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  FXSYS_assert(index < (uint32_t)args.GetLength());
-  FXJSE_HVALUE argIndex = args.GetValue(index);
-  if (FXJSE_Value_IsArray(argIndex)) {
-    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectProp(argIndex, "length", lengthValue);
-    int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-    FXJSE_Value_Release(lengthValue);
-    FXJSE_HVALUE simpleValue = FXJSE_Value_Create(hruntime);
-    if (iLength > 2) {
-      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(argIndex, 1, propertyValue);
-      FXJSE_Value_GetObjectPropByIdx(argIndex, 2, jsobjectValue);
-      if (FXJSE_Value_IsNull(propertyValue)) {
-        GetObjectDefaultValue(jsobjectValue, simpleValue);
-      } else {
-        CFX_ByteString propertyStr;
-        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, simpleValue);
-      }
-      FXJSE_Value_Release(propertyValue);
-      FXJSE_Value_Release(jsobjectValue);
-    } else {
-      FXJSE_Value_SetUndefined(simpleValue);
-    }
-    FXJSE_Value_Release(argIndex);
-    return simpleValue;
-  } else if (FXJSE_Value_IsObject(argIndex)) {
-    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
-    GetObjectDefaultValue(argIndex, defaultValue);
-    FXJSE_Value_Release(argIndex);
-    return defaultValue;
-  } else {
-    return argIndex;
-  }
-}
-FX_BOOL CXFA_FM2JSContext::HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  FX_BOOL isNull = FALSE;
-  if (FXJSE_Value_IsNull(arg)) {
-    isNull = TRUE;
-  } else if (FXJSE_Value_IsArray(arg)) {
-    int32_t iLength = hvalue_get_array_length(hThis, arg);
-    if (iLength > 2) {
-      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
-      FXJSE_Value_GetObjectPropByIdx(arg, 2, jsObjectValue);
-      if (FXJSE_Value_IsNull(propertyValue)) {
-        FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
-        GetObjectDefaultValue(jsObjectValue, defaultValue);
-        if (FXJSE_Value_IsNull(defaultValue)) {
-          isNull = TRUE;
-        }
-        FXJSE_Value_Release(defaultValue);
-      } else {
-        CFX_ByteString propertyStr;
-        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);
-        if (FXJSE_Value_IsNull(newPropertyValue)) {
-          isNull = TRUE;
-        }
-        FXJSE_Value_Release(newPropertyValue);
-      }
-      FXJSE_Value_Release(propertyValue);
-      FXJSE_Value_Release(jsObjectValue);
-    } else {
-      isNull = TRUE;
-    }
-  } else if (FXJSE_Value_IsObject(arg)) {
-    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
-    GetObjectDefaultValue(arg, defaultValue);
-    if (FXJSE_Value_IsNull(defaultValue)) {
-      isNull = TRUE;
-    }
-    FXJSE_Value_Release(defaultValue);
-  }
-  return isNull;
-}
-int32_t CXFA_FM2JSContext::hvalue_get_array_length(FXJSE_HOBJECT hThis,
-                                                   FXJSE_HVALUE arg) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t iLength = 0;
-  if (FXJSE_Value_IsArray(arg)) {
-    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectProp(arg, "length", lengthValue);
-    iLength = FXJSE_Value_ToInteger(lengthValue);
-    FXJSE_Value_Release(lengthValue);
-  }
-  return iLength;
-}
-FX_BOOL CXFA_FM2JSContext::simpleValueCompare(FXJSE_HOBJECT hThis,
-                                              FXJSE_HVALUE firstValue,
-                                              FXJSE_HVALUE secondValue) {
-  FX_BOOL bReturn = FALSE;
-  if (FXJSE_Value_IsUTF8String(firstValue)) {
-    CFX_ByteString firstString, secondString;
-    HValueToUTF8String(firstValue, firstString);
-    HValueToUTF8String(secondValue, secondString);
-    bReturn = firstString.Equal(secondString);
-  } else if (FXJSE_Value_IsNumber(firstValue)) {
-    FX_FLOAT first = HValueToFloat(hThis, firstValue);
-    FX_FLOAT second = HValueToFloat(hThis, secondValue);
-    bReturn = (first == second);
-  } else if (FXJSE_Value_IsBoolean(firstValue)) {
-    bReturn = (FXJSE_Value_ToBoolean(firstValue) ==
-               FXJSE_Value_ToBoolean(secondValue));
-  } else if (FXJSE_Value_IsNull(firstValue) &&
-             FXJSE_Value_IsNull(secondValue)) {
-    bReturn = TRUE;
-  }
-  return bReturn;
-}
-void CXFA_FM2JSContext::unfoldArgs(FXJSE_HOBJECT hThis,
-                                   CFXJSE_Arguments& args,
-                                   FXJSE_HVALUE*& resultValues,
-                                   int32_t& iCount,
-                                   int32_t iStart) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  iCount = 0;
-  int32_t argc = args.GetLength();
-  FXJSE_HVALUE* argsValue = FX_Alloc(FXJSE_HVALUE, argc);
-  for (int32_t i = iStart; i < argc; i++) {
-    argsValue[i] = args.GetValue(i);
-    if (FXJSE_Value_IsArray(argsValue[i])) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-      FXJSE_Value_Release(lengthValue);
-      iCount += ((iLength > 2) ? (iLength - 2) : 0);
-    } else {
-      iCount += 1;
-    }
-  }
-  resultValues = FX_Alloc(FXJSE_HVALUE, iCount);
-  for (int32_t i = 0; i < iCount; i++) {
-    resultValues[i] = FXJSE_Value_Create(hruntime);
-  }
-  int32_t index = 0;
-  for (int32_t i = iStart; i < argc; i++) {
-    if (FXJSE_Value_IsArray(argsValue[i])) {
-      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
-      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
-      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
-      FXJSE_Value_Release(lengthValue);
-      if (iLength > 2) {
-        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
-        FXJSE_Value_GetObjectPropByIdx(argsValue[i], 1, propertyValue);
-        if (FXJSE_Value_IsNull(propertyValue)) {
-          for (int32_t j = 2; j < iLength; j++) {
-            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
-            GetObjectDefaultValue(jsObjectValue, resultValues[index]);
-            index++;
-          }
-        } else {
-          CFX_ByteString propertyString;
-          FXJSE_Value_ToUTF8String(propertyValue, propertyString);
-          for (int32_t j = 2; j < iLength; j++) {
-            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
-            FXJSE_Value_GetObjectProp(jsObjectValue, propertyString,
-                                      resultValues[index]);
-            index++;
-          }
-        }
-        FXJSE_Value_Release(propertyValue);
-        FXJSE_Value_Release(jsObjectValue);
-      }
-    } else if (FXJSE_Value_IsObject(argsValue[i])) {
-      GetObjectDefaultValue(argsValue[i], resultValues[index]);
-      index++;
-    } else {
-      FXJSE_Value_Set(resultValues[index], argsValue[i]);
-      index++;
-    }
-  }
-  for (int32_t i = iStart; i < argc; i++) {
-    FXJSE_Value_Release(argsValue[i]);
-  }
-  FX_Free(argsValue);
-}
-void CXFA_FM2JSContext::GetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
-                                              FXJSE_HVALUE hDefaultValue) {
-  CXFA_Node* pNode =
-      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
-  if (pNode) {
-    pNode->Script_Som_DefaultValue(hDefaultValue, FALSE, (XFA_ATTRIBUTE)-1);
-  } else {
-    FXJSE_Value_SetNull(hDefaultValue);
-  }
-}
-FX_BOOL CXFA_FM2JSContext::SetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
-                                                 FXJSE_HVALUE hNewValue) {
-  CXFA_Node* pNode =
-      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
-  if (pNode) {
-    pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1);
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName,
-                                              int32_t iIndexFlags,
-                                              int32_t iIndexValue,
-                                              FX_BOOL bIsStar,
-                                              CFX_ByteString& szSomExp) {
-  if (bIsStar) {
-    szSomExp = szName + "[*]";
-    return;
-  }
-  if (iIndexFlags == 0) {
-    szSomExp = szName;
-    return;
-  }
-  if (iIndexFlags == 1 || iIndexValue == 0) {
-    szSomExp = szName + "[" +
-               CFX_ByteString::FormatInteger(iIndexValue, FXFORMAT_SIGNED) +
-               "]";
-  } else if (iIndexFlags == 2) {
-    szSomExp = (iIndexValue < 0) ? (szName + "[-") : (szName + "[+");
-    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
-    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
-    szSomExp += "]";
-  } else {
-    szSomExp = (iIndexValue < 0) ? (szName + "[") : (szName + "[-");
-    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
-    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
-    szSomExp += "]";
-  }
-}
-FX_BOOL CXFA_FM2JSContext::GetObjectByName(
-    FXJSE_HOBJECT hThis,
-    FXJSE_HVALUE accessorValue,
-    const CFX_ByteStringC& szAccessorName) {
-  FX_BOOL bFlags = FALSE;
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return bFlags;
-  }
-  IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
-  XFA_RESOLVENODE_RS resoveNodeRS;
-  FX_DWORD dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
-  int32_t iRet = pScriptContext->ResolveObjects(
-      pScriptContext->GetThisObject(),
-      CFX_WideString::FromUTF8(szAccessorName.GetCStr(),
-                               szAccessorName.GetLength()),
-      resoveNodeRS, dwFlags);
-  if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    FXJSE_Value_Set(accessorValue, pScriptContext->GetJSValueFromMap(
-                                       resoveNodeRS.nodes.GetAt(0)));
-    bFlags = TRUE;
-  }
-  return bFlags;
-}
-int32_t CXFA_FM2JSContext::ResolveObjects(FXJSE_HOBJECT hThis,
-                                          FXJSE_HVALUE hRefValue,
-                                          const CFX_ByteStringC& bsSomExp,
-                                          XFA_RESOLVENODE_RS& resoveNodeRS,
-                                          FX_BOOL bdotAccessor,
-                                          FX_BOOL bHasNoResolveName) {
-  CFX_WideString wsSomExpression =
-      CFX_WideString::FromUTF8(bsSomExp.GetCStr(), bsSomExp.GetLength());
-  int32_t iRet = -1;
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  CXFA_Document* pDoc = pContext->GetDocument();
-  if (!pDoc) {
-    return iRet;
-  }
-  IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
-  CXFA_Object* pNode = NULL;
-  FX_DWORD dFlags = 0UL;
-  if (bdotAccessor) {
-    if (FXJSE_Value_IsNull(hRefValue)) {
-      pNode = pScriptContext->GetThisObject();
-      dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
-    } else {
-      pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
-      FXSYS_assert(pNode);
-      if (bHasNoResolveName) {
-        CFX_WideString wsName;
-        if (CXFA_Node* pXFANode = pNode->AsNode()) {
-          pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
-        }
-        if (wsName.IsEmpty()) {
-          CFX_WideStringC className;
-          pNode->GetClassName(className);
-          wsName = FX_WSTRC(L"#") + className;
-        }
-        wsSomExpression = wsName + wsSomExpression;
-        dFlags = XFA_RESOLVENODE_Siblings;
-      } else {
-        dFlags = (bsSomExp == "*")
-                     ? (XFA_RESOLVENODE_Children)
-                     : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
-                        XFA_RESOLVENODE_Properties);
-      }
-    }
-  } else {
-    pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
-    dFlags = XFA_RESOLVENODE_AnyChild;
-  }
-  iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression, resoveNodeRS,
-                                        dFlags);
-  return iRet;
-}
-void CXFA_FM2JSContext::ParseResolveResult(
-    FXJSE_HOBJECT hThis,
-    const XFA_RESOLVENODE_RS& resoveNodeRS,
-    FXJSE_HVALUE hParentValue,
-    FXJSE_HVALUE*& resultValues,
-    int32_t& iSize,
-    FX_BOOL& bAttribute) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hRuntime = pContext->GetScriptRuntime();
-  iSize = 0;
-  resultValues = NULL;
-  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    bAttribute = FALSE;
-    iSize = resoveNodeRS.nodes.GetSize();
-    resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
-    for (int32_t i = 0; i < iSize; i++) {
-      resultValues[i] = FXJSE_Value_Create(hRuntime);
-      FXJSE_Value_Set(
-          resultValues[i],
-          pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap(
-              resoveNodeRS.nodes.GetAt(i)));
-    }
-  } else {
-    CXFA_HVALUEArray objectProperties(hRuntime);
-    int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties);
-    bAttribute = (iRet == 0);
-    if (bAttribute) {
-      if (FXJSE_Value_IsObject(hParentValue)) {
-        iSize = 1;
-        resultValues = FX_Alloc(FXJSE_HVALUE, 1);
-        resultValues[0] = FXJSE_Value_Create(hRuntime);
-        FXJSE_Value_Set(resultValues[0], hParentValue);
-      }
-    } else {
-      iSize = iRet;
-      resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
-      for (int32_t i = 0; i < iSize; i++) {
-        resultValues[i] = FXJSE_Value_Create(hRuntime);
-        FXJSE_Value_Set(resultValues[i], objectProperties[i]);
-      }
-    }
-  }
-}
-int32_t CXFA_FM2JSContext::HValueToInteger(FXJSE_HOBJECT hThis,
-                                           FXJSE_HVALUE hValue) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  int32_t iValue = 0;
-  if (FXJSE_Value_IsArray(hValue)) {
-    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectPropByIdx(hValue, 1, propertyValue);
-    FXJSE_Value_GetObjectPropByIdx(hValue, 2, jsobjectValue);
-    if (FXJSE_Value_IsNull(propertyValue)) {
-      GetObjectDefaultValue(jsobjectValue, newProperty);
-    } else {
-      CFX_ByteString propertyStr;
-      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
-    }
-    iValue = HValueToInteger(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-    FXJSE_Value_Release(jsobjectValue);
-    FXJSE_Value_Release(propertyValue);
-    return iValue;
-  } else if (FXJSE_Value_IsObject(hValue)) {
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    GetObjectDefaultValue(hValue, newProperty);
-    iValue = HValueToInteger(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-    return iValue;
-  } else if (FXJSE_Value_IsUTF8String(hValue)) {
-    CFX_ByteString szValue;
-    FXJSE_Value_ToUTF8String(hValue, szValue);
-    iValue = FXSYS_atoi(szValue);
-  } else {
-    iValue = FXJSE_Value_ToInteger(hValue);
-  }
-  return iValue;
-}
-FX_DOUBLE CXFA_FM2JSContext::StringToDouble(
-    const CFX_ByteStringC& szStringVal) {
-  return XFA_ByteStringToDouble(szStringVal);
-}
-FX_FLOAT CXFA_FM2JSContext::HValueToFloat(FXJSE_HOBJECT hThis,
-                                          FXJSE_HVALUE arg) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  FX_FLOAT fRet = 0.0f;
-  if (FXJSE_Value_IsArray(arg)) {
-    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
-    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
-    if (FXJSE_Value_IsNull(propertyValue)) {
-      GetObjectDefaultValue(jsobjectValue, newProperty);
-    } else {
-      CFX_ByteString propertyStr;
-      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
-    }
-    fRet = HValueToFloat(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-    FXJSE_Value_Release(jsobjectValue);
-    FXJSE_Value_Release(propertyValue);
-  } else if (FXJSE_Value_IsObject(arg)) {
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    GetObjectDefaultValue(arg, newProperty);
-    fRet = HValueToFloat(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-  } else if (FXJSE_Value_IsUTF8String(arg)) {
-    CFX_ByteString bsOutput;
-    FXJSE_Value_ToUTF8String(arg, bsOutput);
-    fRet = (FX_FLOAT)StringToDouble(bsOutput);
-  } else if (FXJSE_Value_IsUndefined(arg)) {
-    fRet = 0;
-  } else {
-    fRet = FXJSE_Value_ToFloat(arg);
-  }
-  return fRet;
-}
-FX_DOUBLE CXFA_FM2JSContext::HValueToDouble(FXJSE_HOBJECT hThis,
-                                            FXJSE_HVALUE arg) {
-  CXFA_FM2JSContext* pContext =
-      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
-  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
-  FX_DOUBLE dRet = 0;
-  if (FXJSE_Value_IsArray(arg)) {
-    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
-    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
-    if (FXJSE_Value_IsNull(propertyValue)) {
-      GetObjectDefaultValue(jsobjectValue, newProperty);
-    } else {
-      CFX_ByteString propertyStr;
-      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
-      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty);
-    }
-    dRet = HValueToDouble(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-    FXJSE_Value_Release(jsobjectValue);
-    FXJSE_Value_Release(propertyValue);
-  } else if (FXJSE_Value_IsObject(arg)) {
-    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
-    GetObjectDefaultValue(arg, newProperty);
-    dRet = HValueToDouble(hThis, newProperty);
-    FXJSE_Value_Release(newProperty);
-  } else if (FXJSE_Value_IsUTF8String(arg)) {
-    CFX_ByteString bsOutput;
-    FXJSE_Value_ToUTF8String(arg, bsOutput);
-    dRet = StringToDouble(bsOutput);
-  } else if (FXJSE_Value_IsUndefined(arg)) {
-    dRet = 0;
-  } else {
-    dRet = FXJSE_Value_ToDouble(arg);
-  }
-  return dRet;
-}
-void CXFA_FM2JSContext::HValueToUTF8String(FXJSE_HVALUE arg,
-                                           CFX_ByteString& szOutputString) {
-  if (FXJSE_Value_IsNull(arg) || FXJSE_Value_IsUndefined(arg)) {
-    szOutputString = "";
-  } else if (FXJSE_Value_IsBoolean(arg)) {
-    szOutputString = FXJSE_Value_ToBoolean(arg) ? "1" : "0";
-  } else {
-    szOutputString = "";
-    FXJSE_Value_ToUTF8String(arg, szOutputString);
-  }
-}
-static FXJSE_FUNCTION formcalc_fm2js_functions[] = {
-    {"Abs", CXFA_FM2JSContext::Abs},
-    {"Avg", CXFA_FM2JSContext::Avg},
-    {"Ceil", CXFA_FM2JSContext::Ceil},
-    {"Count", CXFA_FM2JSContext::Count},
-    {"Floor", CXFA_FM2JSContext::Floor},
-    {"Max", CXFA_FM2JSContext::Max},
-    {"Min", CXFA_FM2JSContext::Min},
-    {"Mod", CXFA_FM2JSContext::Mod},
-    {"Round", CXFA_FM2JSContext::Round},
-    {"Sum", CXFA_FM2JSContext::Sum},
-    {"Date", CXFA_FM2JSContext::Date},
-    {"Date2Num", CXFA_FM2JSContext::Date2Num},
-    {"DateFmt", CXFA_FM2JSContext::DateFmt},
-    {"IsoDate2Num", CXFA_FM2JSContext::IsoDate2Num},
-    {"IsoTime2Num", CXFA_FM2JSContext::IsoTime2Num},
-    {"LocalDateFmt", CXFA_FM2JSContext::LocalDateFmt},
-    {"LocalTimeFmt", CXFA_FM2JSContext::LocalTimeFmt},
-    {"Num2Date", CXFA_FM2JSContext::Num2Date},
-    {"Num2GMTime", CXFA_FM2JSContext::Num2GMTime},
-    {"Num2Time", CXFA_FM2JSContext::Num2Time},
-    {"Time", CXFA_FM2JSContext::Time},
-    {"Time2Num", CXFA_FM2JSContext::Time2Num},
-    {"TimeFmt", CXFA_FM2JSContext::TimeFmt},
-    {"Apr", CXFA_FM2JSContext::Apr},
-    {"Cterm", CXFA_FM2JSContext::CTerm},
-    {"FV", CXFA_FM2JSContext::FV},
-    {"Ipmt", CXFA_FM2JSContext::IPmt},
-    {"NPV", CXFA_FM2JSContext::NPV},
-    {"Pmt", CXFA_FM2JSContext::Pmt},
-    {"PPmt", CXFA_FM2JSContext::PPmt},
-    {"PV", CXFA_FM2JSContext::PV},
-    {"Rate", CXFA_FM2JSContext::Rate},
-    {"Term", CXFA_FM2JSContext::Term},
-    {"Choose", CXFA_FM2JSContext::Choose},
-    {"Exists", CXFA_FM2JSContext::Exists},
-    {"HasValue", CXFA_FM2JSContext::HasValue},
-    {"Oneof", CXFA_FM2JSContext::Oneof},
-    {"Within", CXFA_FM2JSContext::Within},
-    {"If", CXFA_FM2JSContext::If},
-    {"Eval", CXFA_FM2JSContext::Eval},
-    {"Translate", CXFA_FM2JSContext::eval_translation},
-    {"Ref", CXFA_FM2JSContext::Ref},
-    {"UnitType", CXFA_FM2JSContext::UnitType},
-    {"UnitValue", CXFA_FM2JSContext::UnitValue},
-    {"At", CXFA_FM2JSContext::At},
-    {"Concat", CXFA_FM2JSContext::Concat},
-    {"Decode", CXFA_FM2JSContext::Decode},
-    {"Encode", CXFA_FM2JSContext::Encode},
-    {"Format", CXFA_FM2JSContext::Format},
-    {"Left", CXFA_FM2JSContext::Left},
-    {"Len", CXFA_FM2JSContext::Len},
-    {"Lower", CXFA_FM2JSContext::Lower},
-    {"Ltrim", CXFA_FM2JSContext::Ltrim},
-    {"Parse", CXFA_FM2JSContext::Parse},
-    {"Replace", CXFA_FM2JSContext::Replace},
-    {"Right", CXFA_FM2JSContext::Right},
-    {"Rtrim", CXFA_FM2JSContext::Rtrim},
-    {"Space", CXFA_FM2JSContext::Space},
-    {"Str", CXFA_FM2JSContext::Str},
-    {"Stuff", CXFA_FM2JSContext::Stuff},
-    {"Substr", CXFA_FM2JSContext::Substr},
-    {"Uuid", CXFA_FM2JSContext::Uuid},
-    {"Upper", CXFA_FM2JSContext::Upper},
-    {"WordNum", CXFA_FM2JSContext::WordNum},
-    {"Get", CXFA_FM2JSContext::Get},
-    {"Post", CXFA_FM2JSContext::Post},
-    {"Put", CXFA_FM2JSContext::Put},
-    {"positive_operator", CXFA_FM2JSContext::positive_operator},
-    {"negative_operator", CXFA_FM2JSContext::negative_operator},
-    {"logical_or_operator", CXFA_FM2JSContext::logical_or_operator},
-    {"logical_and_operator", CXFA_FM2JSContext::logical_and_operator},
-    {"logical_not_operator", CXFA_FM2JSContext::logical_not_operator},
-    {"equality_operator", CXFA_FM2JSContext::equality_operator},
-    {"notequality_operator", CXFA_FM2JSContext::notequality_operator},
-    {"less_operator", CXFA_FM2JSContext::less_operator},
-    {"lessequal_operator", CXFA_FM2JSContext::lessequal_operator},
-    {"greater_operator", CXFA_FM2JSContext::greater_operator},
-    {"greaterequal_operator", CXFA_FM2JSContext::greaterequal_operator},
-    {"plus_operator", CXFA_FM2JSContext::plus_operator},
-    {"minus_operator", CXFA_FM2JSContext::minus_operator},
-    {"multiple_operator", CXFA_FM2JSContext::multiple_operator},
-    {"divide_operator", CXFA_FM2JSContext::divide_operator},
-    {"assign_value_operator", CXFA_FM2JSContext::assign_value_operator},
-    {"dot_accessor", CXFA_FM2JSContext::dot_accessor},
-    {"dotdot_accessor", CXFA_FM2JSContext::dotdot_accessor},
-    {"concat_fm_object", CXFA_FM2JSContext::concat_fm_object},
-    {"is_fm_object", CXFA_FM2JSContext::is_fm_object},
-    {"is_fm_array", CXFA_FM2JSContext::is_fm_array},
-    {"get_fm_value", CXFA_FM2JSContext::get_fm_value},
-    {"get_fm_jsobj", CXFA_FM2JSContext::get_fm_jsobj},
-    {"fm_var_filter", CXFA_FM2JSContext::fm_var_filter},
-};
-CXFA_FM2JSContext::CXFA_FM2JSContext()
-    : m_hFMClass(nullptr), m_pDocument(nullptr) {
-  FXSYS_memset(&m_fmClass, 0, sizeof(FXJSE_CLASS));
-}
-CXFA_FM2JSContext::~CXFA_FM2JSContext() {
-  m_pDocument = NULL;
-  if (m_hValue) {
-    FXJSE_Value_Release(m_hValue);
-    m_hValue = NULL;
-  }
-  m_hScriptRuntime = NULL;
-}
-CXFA_FM2JSContext* CXFA_FM2JSContext::Create() {
-  return new CXFA_FM2JSContext;
-}
-void CXFA_FM2JSContext::Initialize(FXJSE_HRUNTIME hScriptRuntime,
-                                   FXJSE_HCONTEXT hScriptContext,
-                                   CXFA_Document* pDoc) {
-  m_pDocument = pDoc;
-  m_hScriptRuntime = hScriptRuntime;
-  m_fmClass.name = "XFA_FM2JS_FormCalcClass";
-  m_fmClass.constructor = NULL;
-  m_fmClass.properties = NULL;
-  m_fmClass.methods = formcalc_fm2js_functions;
-  m_fmClass.propNum = 0;
-  m_fmClass.methNum =
-      sizeof(formcalc_fm2js_functions) / sizeof(formcalc_fm2js_functions[0]);
-  m_hFMClass = FXJSE_DefineClass(hScriptContext, &m_fmClass);
-  m_hValue = FXJSE_Value_Create(hScriptRuntime);
-  FXJSE_Value_SetNull(m_hValue);
-  FXJSE_Value_SetObject(m_hValue, this, m_hFMClass);
-}
-void CXFA_FM2JSContext::GlobalPropertyGetter(FXJSE_HVALUE hValue) {
-  FXJSE_Value_Set(hValue, m_hValue);
-}
-void CXFA_FM2JSContext::Release() {
-  delete this;
-}
-void CXFA_FM2JSContext::ThrowScriptErrorMessage(int32_t iStringID, ...) {
-  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
-  FXSYS_assert(pAppProvider);
-  CFX_WideString wsFormat;
-  pAppProvider->LoadString(iStringID, wsFormat);
-  CFX_WideString wsMessage;
-  va_list arg_ptr;
-  va_start(arg_ptr, iStringID);
-  wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr);
-  va_end(arg_ptr);
-  FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_fm2jscontext.h b/xfa/src/fxfa/fm2js/xfa_fm2jscontext.h
deleted file mode 100644
index 62c2a1e..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fm2jscontext.h
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
-
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-class CXFA_FM2JSContext {
- public:
-  static void Abs(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Avg(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Ceil(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Count(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Floor(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Max(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Min(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Mod(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Round(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Sum(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Date(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Date2Num(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void DateFmt(FXJSE_HOBJECT hThis,
-                      const CFX_ByteStringC& szFuncName,
-                      CFXJSE_Arguments& args);
-  static void IsoDate2Num(FXJSE_HOBJECT hThis,
-                          const CFX_ByteStringC& szFuncName,
-                          CFXJSE_Arguments& args);
-  static void IsoTime2Num(FXJSE_HOBJECT hThis,
-                          const CFX_ByteStringC& szFuncName,
-                          CFXJSE_Arguments& args);
-  static void LocalDateFmt(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void LocalTimeFmt(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void Num2Date(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void Num2GMTime(FXJSE_HOBJECT hThis,
-                         const CFX_ByteStringC& szFuncName,
-                         CFXJSE_Arguments& args);
-  static void Num2Time(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void Time(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Time2Num(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void TimeFmt(FXJSE_HOBJECT hThis,
-                      const CFX_ByteStringC& szFuncName,
-                      CFXJSE_Arguments& args);
-
-  static FX_BOOL IsIsoDateFormat(const FX_CHAR* pData,
-                                 int32_t iLength,
-                                 int32_t& iStyle,
-                                 int32_t& iYear,
-                                 int32_t& iMonth,
-                                 int32_t& iDay);
-  static FX_BOOL IsIsoTimeFormat(const FX_CHAR* pData,
-                                 int32_t iLength,
-                                 int32_t& iHour,
-                                 int32_t& iMinute,
-                                 int32_t& iSecond,
-                                 int32_t& iMilliSecond,
-                                 int32_t& iZoneHour,
-                                 int32_t& iZoneMinute);
-  static FX_BOOL IsIsoDateTimeFormat(const FX_CHAR* pData,
-                                     int32_t iLength,
-                                     int32_t& iYear,
-                                     int32_t& iMonth,
-                                     int32_t& iDay,
-                                     int32_t& iHour,
-                                     int32_t& iMinute,
-                                     int32_t& iSecond,
-                                     int32_t& iMillionSecond,
-                                     int32_t& iZoneHour,
-                                     int32_t& iZoneMinute);
-  static FX_BOOL Local2IsoDate(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szDate,
-                               const CFX_ByteStringC& szFormat,
-                               const CFX_ByteStringC& szLocale,
-                               CFX_ByteString& strIsoDate);
-  static FX_BOOL Local2IsoTime(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szTime,
-                               const CFX_ByteStringC& szFormat,
-                               const CFX_ByteStringC& szLocale,
-                               CFX_ByteString& strIsoTime);
-  static FX_BOOL IsoDate2Local(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szDate,
-                               const CFX_ByteStringC& szFormat,
-                               const CFX_ByteStringC& szLocale,
-                               CFX_ByteString& strLocalDate);
-  static FX_BOOL IsoTime2Local(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szTime,
-                               const CFX_ByteStringC& szFormat,
-                               const CFX_ByteStringC& szLocale,
-                               CFX_ByteString& strLocalTime);
-  static FX_BOOL GetGMTTime(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szTime,
-                            const CFX_ByteStringC& szFormat,
-                            const CFX_ByteStringC& szLocale,
-                            CFX_ByteString& strGMTTime);
-  static int32_t DateString2Num(const CFX_ByteStringC& szDateString);
-  static void GetLocalDateFormat(FXJSE_HOBJECT hThis,
-                                 int32_t iStyle,
-                                 const CFX_ByteStringC& szLocalStr,
-                                 CFX_ByteString& strFormat,
-                                 FX_BOOL bStandard);
-  static void GetLocalTimeFormat(FXJSE_HOBJECT hThis,
-                                 int32_t iStyle,
-                                 const CFX_ByteStringC& szLocalStr,
-                                 CFX_ByteString& strFormat,
-                                 FX_BOOL bStandard);
-  static void GetStandardDateFormat(FXJSE_HOBJECT hThis,
-                                    int32_t iStyle,
-                                    const CFX_ByteStringC& szLocalStr,
-                                    CFX_ByteString& strFormat);
-  static void GetStandardTimeFormat(FXJSE_HOBJECT hThis,
-                                    int32_t iStyle,
-                                    const CFX_ByteStringC& szLocalStr,
-                                    CFX_ByteString& strFormat);
-
-  static void Num2AllTime(FXJSE_HOBJECT hThis,
-                          int32_t iTime,
-                          const CFX_ByteStringC& szFormat,
-                          const CFX_ByteStringC& szLocale,
-                          FX_BOOL bGM,
-                          CFX_ByteString& strTime);
-  static void GetLocalTimeZone(int32_t& iHour, int32_t& iMin, int32_t& iSec);
-
-  static void Apr(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void CTerm(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void FV(FXJSE_HOBJECT hThis,
-                 const CFX_ByteStringC& szFuncName,
-                 CFXJSE_Arguments& args);
-  static void IPmt(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void NPV(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Pmt(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void PPmt(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void PV(FXJSE_HOBJECT hThis,
-                 const CFX_ByteStringC& szFuncName,
-                 CFXJSE_Arguments& args);
-  static void Rate(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Term(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Choose(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void Exists(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void HasValue(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void Oneof(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Within(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void If(FXJSE_HOBJECT hThis,
-                 const CFX_ByteStringC& szFuncName,
-                 CFXJSE_Arguments& args);
-  static void Eval(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Ref(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void UnitType(FXJSE_HOBJECT hThis,
-                       const CFX_ByteStringC& szFuncName,
-                       CFXJSE_Arguments& args);
-  static void UnitValue(FXJSE_HOBJECT hThis,
-                        const CFX_ByteStringC& szFuncName,
-                        CFXJSE_Arguments& args);
-
-  static void At(FXJSE_HOBJECT hThis,
-                 const CFX_ByteStringC& szFuncName,
-                 CFXJSE_Arguments& args);
-  static void Concat(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void Decode(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void DecodeURL(const CFX_ByteStringC& szURLString,
-                        CFX_ByteTextBuf& szResultBuf);
-  static void DecodeHTML(const CFX_ByteStringC& szHTMLString,
-                         CFX_ByteTextBuf& szResultBuf);
-  static void DecodeXML(const CFX_ByteStringC& szXMLString,
-                        CFX_ByteTextBuf& szResultBuf);
-  static void Encode(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void EncodeURL(const CFX_ByteStringC& szURLString,
-                        CFX_ByteTextBuf& szResultBuf);
-  static void EncodeHTML(const CFX_ByteStringC& szHTMLString,
-                         CFX_ByteTextBuf& szResultBuf);
-  static void EncodeXML(const CFX_ByteStringC& szXMLString,
-                        CFX_ByteTextBuf& szResultBuf);
-  static FX_BOOL HTMLSTR2Code(const CFX_WideStringC& pData, uint32_t& iCode);
-  static FX_BOOL HTMLCode2STR(uint32_t iCode, CFX_WideString& wsHTMLReserve);
-  static void Format(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void Left(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Len(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Lower(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Ltrim(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Parse(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Replace(FXJSE_HOBJECT hThis,
-                      const CFX_ByteStringC& szFuncName,
-                      CFXJSE_Arguments& args);
-  static void Right(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Rtrim(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Space(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Str(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Stuff(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void Substr(FXJSE_HOBJECT hThis,
-                     const CFX_ByteStringC& szFuncName,
-                     CFXJSE_Arguments& args);
-  static void Uuid(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Upper(FXJSE_HOBJECT hThis,
-                    const CFX_ByteStringC& szFuncName,
-                    CFXJSE_Arguments& args);
-  static void WordNum(FXJSE_HOBJECT hThis,
-                      const CFX_ByteStringC& szFuncName,
-                      CFXJSE_Arguments& args);
-  static void TrillionUS(const CFX_ByteStringC& szData,
-                         CFX_ByteTextBuf& strBuf);
-  static void WordUS(const CFX_ByteStringC& szData,
-                     int32_t iStyle,
-                     CFX_ByteTextBuf& strBuf);
-
-  static void Get(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void Post(FXJSE_HOBJECT hThis,
-                   const CFX_ByteStringC& szFuncName,
-                   CFXJSE_Arguments& args);
-  static void Put(FXJSE_HOBJECT hThis,
-                  const CFX_ByteStringC& szFuncName,
-                  CFXJSE_Arguments& args);
-  static void assign_value_operator(FXJSE_HOBJECT hThis,
-                                    const CFX_ByteStringC& szFuncName,
-                                    CFXJSE_Arguments& args);
-  static void logical_or_operator(FXJSE_HOBJECT hThis,
-                                  const CFX_ByteStringC& szFuncName,
-                                  CFXJSE_Arguments& args);
-  static void logical_and_operator(FXJSE_HOBJECT hThis,
-                                   const CFX_ByteStringC& szFuncName,
-                                   CFXJSE_Arguments& args);
-  static void equality_operator(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args);
-  static void notequality_operator(FXJSE_HOBJECT hThis,
-                                   const CFX_ByteStringC& szFuncName,
-                                   CFXJSE_Arguments& args);
-  static FX_BOOL fm_ref_equal(FXJSE_HOBJECT hThis, CFXJSE_Arguments& args);
-  static void less_operator(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args);
-  static void lessequal_operator(FXJSE_HOBJECT hThis,
-                                 const CFX_ByteStringC& szFuncName,
-                                 CFXJSE_Arguments& args);
-  static void greater_operator(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args);
-  static void greaterequal_operator(FXJSE_HOBJECT hThis,
-                                    const CFX_ByteStringC& szFuncName,
-                                    CFXJSE_Arguments& args);
-  static void plus_operator(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args);
-  static void minus_operator(FXJSE_HOBJECT hThis,
-                             const CFX_ByteStringC& szFuncName,
-                             CFXJSE_Arguments& args);
-  static void multiple_operator(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args);
-  static void divide_operator(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args);
-  static void positive_operator(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args);
-  static void negative_operator(FXJSE_HOBJECT hThis,
-                                const CFX_ByteStringC& szFuncName,
-                                CFXJSE_Arguments& args);
-  static void logical_not_operator(FXJSE_HOBJECT hThis,
-                                   const CFX_ByteStringC& szFuncName,
-                                   CFXJSE_Arguments& args);
-  static void dot_accessor(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void dotdot_accessor(FXJSE_HOBJECT hThis,
-                              const CFX_ByteStringC& szFuncName,
-                              CFXJSE_Arguments& args);
-  static void eval_translation(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args);
-  static void is_fm_object(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void is_fm_array(FXJSE_HOBJECT hThis,
-                          const CFX_ByteStringC& szFuncName,
-                          CFXJSE_Arguments& args);
-  static void get_fm_value(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void get_fm_jsobj(FXJSE_HOBJECT hThis,
-                           const CFX_ByteStringC& szFuncName,
-                           CFXJSE_Arguments& args);
-  static void fm_var_filter(FXJSE_HOBJECT hThis,
-                            const CFX_ByteStringC& szFuncName,
-                            CFXJSE_Arguments& args);
-  static void concat_fm_object(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args);
-
-  static int32_t hvalue_get_array_length(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg);
-  static FX_BOOL simpleValueCompare(FXJSE_HOBJECT hThis,
-                                    FXJSE_HVALUE firstValue,
-                                    FXJSE_HVALUE secondValue);
-  static void unfoldArgs(FXJSE_HOBJECT hThis,
-                         CFXJSE_Arguments& args,
-                         FXJSE_HVALUE*& resultValues,
-                         int32_t& iCount,
-                         int32_t iStart = 0);
-  static void GetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
-                                    FXJSE_HVALUE hDefaultValue);
-  static FX_BOOL SetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
-                                       FXJSE_HVALUE hNewValue);
-  static void GenerateSomExpression(const CFX_ByteStringC& szName,
-                                    int32_t iIndexFlags,
-                                    int32_t iIndexValue,
-                                    FX_BOOL bIsStar,
-                                    CFX_ByteString& szSomExp);
-  static FX_BOOL GetObjectByName(FXJSE_HOBJECT hThis,
-                                 FXJSE_HVALUE accessorValue,
-                                 const CFX_ByteStringC& szAccessorName);
-  static int32_t ResolveObjects(FXJSE_HOBJECT hThis,
-                                FXJSE_HVALUE hParentValue,
-                                const CFX_ByteStringC& bsSomExp,
-                                XFA_RESOLVENODE_RS& resoveNodeRS,
-                                FX_BOOL bdotAccessor = TRUE,
-                                FX_BOOL bHasNoResolveName = FALSE);
-  static void ParseResolveResult(FXJSE_HOBJECT hThis,
-                                 const XFA_RESOLVENODE_RS& resoveNodeRS,
-                                 FXJSE_HVALUE hParentValue,
-                                 FXJSE_HVALUE*& resultValues,
-                                 int32_t& iSize,
-                                 FX_BOOL& bAttribute);
-
-  static FXJSE_HVALUE GetSimpleHValue(FXJSE_HOBJECT hThis,
-                                      CFXJSE_Arguments& args,
-                                      uint32_t index);
-  static FX_BOOL HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
-  static int32_t HValueToInteger(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
-  static FX_DOUBLE StringToDouble(const CFX_ByteStringC& szStringVal);
-  static FX_FLOAT HValueToFloat(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
-  static FX_DOUBLE HValueToDouble(FXJSE_HOBJECT hThis, FXJSE_HVALUE hValue);
-  static void HValueToUTF8String(FXJSE_HVALUE hValue,
-                                 CFX_ByteString& outputValue);
-  CXFA_FM2JSContext();
-  ~CXFA_FM2JSContext();
-  static CXFA_FM2JSContext* Create();
-  void Initialize(FXJSE_HRUNTIME hScriptRuntime,
-                  FXJSE_HCONTEXT hScriptContext,
-                  CXFA_Document* pDoc);
-  void GlobalPropertyGetter(FXJSE_HVALUE hValue);
-  void Release();
-  FXJSE_HRUNTIME GetScriptRuntime() const { return m_hScriptRuntime; }
-  CXFA_Document* GetDocument() const { return m_pDocument; }
-  void ThrowScriptErrorMessage(int32_t iStringID, ...);
-
- private:
-  FXJSE_HRUNTIME m_hScriptRuntime;
-  FXJSE_CLASS m_fmClass;
-  FXJSE_HCLASS m_hFMClass;
-  FXJSE_HVALUE m_hValue;
-  CXFA_Document* m_pDocument;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_FM2JSCONTEXT_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_fmparse.cpp b/xfa/src/fxfa/fm2js/xfa_fmparse.cpp
deleted file mode 100644
index 7950abb..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fmparse.cpp
+++ /dev/null
@@ -1,1051 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_fmparse.h"
-
-#include <memory>
-
-CXFA_FMParse::CXFA_FMParse() : m_pToken(nullptr), m_pErrorInfo(0) {}
-
-int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc,
-                           CXFA_FMErrorInfo* pErrorInfo) {
-  m_pErrorInfo = pErrorInfo;
-  m_lexer.reset(new CXFA_FMLexer(wsFormcalc, m_pErrorInfo));
-  return 0;
-}
-
-void CXFA_FMParse::NextToken() {
-  m_pToken = m_lexer->NextToken();
-  while (m_pToken->m_type == TOKreserver) {
-    if (m_lexer->HasError()) {
-      break;
-    }
-    m_pToken = m_lexer->NextToken();
-  }
-}
-
-void CXFA_FMParse::Check(XFA_FM_TOKEN op) {
-  if (m_pToken->m_type != op) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-          XFA_FM_KeywordToString(op), ws_TempString.c_str());
-  }
-  NextToken();
-}
-
-void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) {
-  m_pErrorInfo->linenum = lineNum;
-  const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg);
-  va_list ap;
-  va_start(ap, msg);
-  m_pErrorInfo->message.FormatV(lpMessageInfo, ap);
-  va_end(ap);
-}
-
-CFX_PtrArray* CXFA_FMParse::ParseTopExpression() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  CFX_PtrArray* expression = new CFX_PtrArray();
-  while (1) {
-    if (m_pToken->m_type == TOKeof || m_pToken->m_type == TOKendfunc ||
-        m_pToken->m_type == TOKendif || m_pToken->m_type == TOKelseif ||
-        m_pToken->m_type == TOKelse || m_pToken->m_type == TOKreserver) {
-      return expression;
-    }
-
-    if (m_pToken->m_type == TOKfunc) {
-      e.reset(ParseFunction());
-      if (e) {
-        expression->Add(e.release());
-      } else {
-        break;
-      }
-    } else {
-      e.reset(ParseExpression());
-      if (e) {
-        expression->Add(e.release());
-      } else {
-        break;
-      }
-    }
-  }
-  return expression;
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseFunction() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  CFX_WideStringC ident;
-  std::unique_ptr<CFX_WideStringCArray> pArguments;
-  std::unique_ptr<CFX_PtrArray> pExpressions;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  if (m_pToken->m_type != TOKidentifier) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-          ws_TempString.c_str());
-  } else {
-    ident = m_pToken->m_wstring;
-    NextToken();
-  }
-  Check(TOKlparen);
-  if (m_pToken->m_type == TOKrparen) {
-    NextToken();
-  } else {
-    pArguments.reset(new CFX_WideStringCArray());
-    CFX_WideStringC p;
-    while (1) {
-      if (m_pToken->m_type == TOKidentifier) {
-        p = m_pToken->m_wstring;
-        pArguments->Add(p);
-        NextToken();
-        if (m_pToken->m_type == TOKcomma) {
-          NextToken();
-          continue;
-        } else if (m_pToken->m_type == TOKrparen) {
-          NextToken();
-          break;
-        } else {
-          Check(TOKrparen);
-          break;
-        }
-      } else {
-        CFX_WideString ws_TempString = m_pToken->m_wstring;
-        Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-              ws_TempString.c_str());
-        NextToken();
-        break;
-      }
-    }
-  }
-  Check(TOKdo);
-  if (m_pToken->m_type == TOKendfunc) {
-    NextToken();
-  } else {
-    pExpressions.reset(ParseTopExpression());
-    Check(TOKendfunc);
-  }
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMFunctionDefinition(line, 0, ident, pArguments.release(),
-                                          pExpressions.release()));
-  } else {
-    if (pArguments)
-      pArguments->RemoveAll();
-    if (pExpressions) {
-      for (int i = 0; i < pExpressions->GetSize(); ++i)
-        delete static_cast<CXFA_FMExpression*>(pExpressions->GetAt(i));
-    }
-  }
-  return e.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseExpression() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  switch (m_pToken->m_type) {
-    case TOKvar:
-      e.reset(ParseVarExpression());
-      break;
-    case TOKnull:
-    case TOKnumber:
-    case TOKstring:
-    case TOKplus:
-    case TOKminus:
-    case TOKksnot:
-    case TOKidentifier:
-    case TOKlparen:
-      e.reset(ParseExpExpression());
-      break;
-    case TOKif:
-      e.reset(ParseIfExpression());
-      break;
-    case TOKwhile:
-      e.reset(ParseWhileExpression());
-      break;
-    case TOKfor:
-      e.reset(ParseForExpression());
-      break;
-    case TOKforeach:
-      e.reset(ParseForeachExpression());
-      break;
-    case TOKdo:
-      e.reset(ParseDoExpression());
-      break;
-    case TOKbreak:
-      e.reset(new CXFA_FMBreakExpression(line));
-      NextToken();
-      break;
-    case TOKcontinue:
-      e.reset(new CXFA_FMContinueExpression(line));
-      NextToken();
-      break;
-    default:
-      CFX_WideString ws_TempString = m_pToken->m_wstring;
-      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
-            ws_TempString.c_str());
-      NextToken();
-      break;
-  }
-  return e.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  CFX_WideStringC ident;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  if (m_pToken->m_type != TOKidentifier) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-          ws_TempString.c_str());
-  } else {
-    ident = m_pToken->m_wstring;
-    NextToken();
-  }
-  if (m_pToken->m_type == TOKassign) {
-    NextToken();
-    e.reset(ParseExpExpression());
-  }
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMVarExpression(line, ident, e.release()));
-  } else {
-    e.reset();
-  }
-  return e.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseLogicalOrExpression());
-  while (m_pToken->m_type == TOKassign) {
-    NextToken();
-    std::unique_ptr<CXFA_FMSimpleExpression> pExp2(ParseLogicalOrExpression());
-    if (m_pErrorInfo->message.IsEmpty()) {
-      pExp1.reset(new CXFA_FMAssignExpression(line, TOKassign, pExp1.release(),
-                                              pExp2.release()));
-    } else {
-      pExp1.reset();
-    }
-  }
-  return pExp1.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseSimpleExpression());
-  std::unique_ptr<CXFA_FMExpression> e;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMExpExpression(line, pExp1.release()));
-  } else {
-    e.reset();
-  }
-  return e.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseLogicalAndExpression());
-  for (;;) {
-    switch (m_pToken->m_type) {
-      case TOKor:
-      case TOKksor: {
-        NextToken();
-        std::unique_ptr<CXFA_FMSimpleExpression> e2(
-            ParseLogicalAndExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMLogicalOrExpression(line, TOKor, e1.release(),
-                                                  e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      }
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseEqualityExpression());
-  for (;;) {
-    switch (m_pToken->m_type) {
-      case TOKand:
-      case TOKksand: {
-        NextToken();
-        std::unique_ptr<CXFA_FMSimpleExpression> e2(ParseEqualityExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMLogicalAndExpression(line, TOKand, e1.release(),
-                                                   e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      }
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseRelationalExpression());
-  for (;;) {
-    std::unique_ptr<CXFA_FMSimpleExpression> e2;
-    switch (m_pToken->m_type) {
-      case TOKeq:
-      case TOKkseq:
-        NextToken();
-        e2.reset(ParseRelationalExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMEqualityExpression(line, TOKeq, e1.release(),
-                                                 e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKne:
-      case TOKksne:
-        NextToken();
-        e2.reset(ParseRelationalExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMEqualityExpression(line, TOKne, e1.release(),
-                                                 e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseAddtiveExpression());
-  for (;;) {
-    std::unique_ptr<CXFA_FMSimpleExpression> e2;
-    switch (m_pToken->m_type) {
-      case TOKlt:
-      case TOKkslt:
-        NextToken();
-        e2.reset(ParseAddtiveExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMRelationalExpression(line, TOKlt, e1.release(),
-                                                   e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKgt:
-      case TOKksgt:
-        NextToken();
-        e2.reset(ParseAddtiveExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMRelationalExpression(line, TOKgt, e1.release(),
-                                                   e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKle:
-      case TOKksle:
-        NextToken();
-        e2.reset(ParseAddtiveExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMRelationalExpression(line, TOKle, e1.release(),
-                                                   e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKge:
-      case TOKksge:
-        NextToken();
-        e2.reset(ParseAddtiveExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMRelationalExpression(line, TOKge, e1.release(),
-                                                   e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseMultiplicativeExpression());
-  for (;;) {
-    std::unique_ptr<CXFA_FMSimpleExpression> e2;
-    switch (m_pToken->m_type) {
-      case TOKplus:
-        NextToken();
-        e2.reset(ParseMultiplicativeExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMAdditiveExpression(line, TOKplus, e1.release(),
-                                                 e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKminus:
-        NextToken();
-        e2.reset(ParseMultiplicativeExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMAdditiveExpression(line, TOKminus, e1.release(),
-                                                 e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> e1(ParseUnaryExpression());
-  for (;;) {
-    std::unique_ptr<CXFA_FMSimpleExpression> e2;
-    switch (m_pToken->m_type) {
-      case TOKmul:
-        NextToken();
-        e2.reset(ParseUnaryExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMMultiplicativeExpression(
-              line, TOKmul, e1.release(), e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      case TOKdiv:
-        NextToken();
-        e2.reset(ParseUnaryExpression());
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e1.reset(new CXFA_FMMultiplicativeExpression(
-              line, TOKdiv, e1.release(), e2.release()));
-        } else {
-          e1.reset();
-        }
-        continue;
-      default:
-        break;
-    }
-    break;
-  }
-  return e1.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() {
-  std::unique_ptr<CXFA_FMSimpleExpression> e;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  switch (m_pToken->m_type) {
-    case TOKplus:
-      NextToken();
-      e.reset(ParseUnaryExpression());
-      if (m_pErrorInfo->message.IsEmpty()) {
-        e.reset(new CXFA_FMPosExpression(line, e.release()));
-      } else {
-        e.reset();
-      }
-      break;
-    case TOKminus:
-      NextToken();
-      e.reset(ParseUnaryExpression());
-      if (m_pErrorInfo->message.IsEmpty()) {
-        e.reset(new CXFA_FMNegExpression(line, e.release()));
-      } else {
-        e.reset();
-      }
-      break;
-    case TOKksnot:
-      NextToken();
-      e.reset(ParseUnaryExpression());
-      if (m_pErrorInfo->message.IsEmpty()) {
-        e.reset(new CXFA_FMNotExpression(line, e.release()));
-      } else {
-        e.reset();
-      }
-      break;
-    default:
-      e.reset(ParsePrimaryExpression());
-      break;
-  }
-  return e.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() {
-  std::unique_ptr<CXFA_FMSimpleExpression> e;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  switch (m_pToken->m_type) {
-    case TOKnumber:
-      e.reset(new CXFA_FMNumberExpression(line, m_pToken->m_wstring));
-      NextToken();
-      break;
-    case TOKstring:
-      e.reset(new CXFA_FMStringExpression(line, m_pToken->m_wstring));
-      NextToken();
-      break;
-    case TOKidentifier: {
-      CFX_WideStringC wsIdentifier(m_pToken->m_wstring);
-      NextToken();
-      if (m_pToken->m_type == TOKlbracket) {
-        CXFA_FMSimpleExpression* s = ParseIndexExpression();
-        if (s) {
-          e.reset(new CXFA_FMDotAccessorExpression(line, NULL, TOKdot,
-                                                   wsIdentifier, s));
-        }
-        NextToken();
-      } else {
-        e.reset(new CXFA_FMIdentifierExpressionn(line, wsIdentifier));
-      }
-    } break;
-    case TOKif:
-      e.reset(new CXFA_FMIdentifierExpressionn(line, m_pToken->m_wstring));
-      NextToken();
-      break;
-    case TOKnull:
-      e.reset(new CXFA_FMNullExpression(line));
-      NextToken();
-      break;
-    case TOKlparen:
-      e.reset(ParseParenExpression());
-      break;
-    default:
-      CFX_WideString ws_TempString = m_pToken->m_wstring;
-      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
-            ws_TempString.c_str());
-      NextToken();
-      break;
-  }
-  e.reset(ParsePostExpression(e.release()));
-  if (!(m_pErrorInfo->message.IsEmpty()))
-    e.reset();
-  return e.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
-    CXFA_FMSimpleExpression* e) {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  while (1) {
-    switch (m_pToken->m_type) {
-      case TOKlparen: {
-        NextToken();
-        std::unique_ptr<CFX_PtrArray> pArray;
-        if (m_pToken->m_type != TOKrparen) {
-          pArray.reset(new CFX_PtrArray());
-          while (m_pToken->m_type != TOKrparen) {
-            CXFA_FMSimpleExpression* e = ParseSimpleExpression();
-            if (e) {
-              pArray->Add(e);
-            }
-            if (m_pToken->m_type == TOKcomma) {
-              NextToken();
-            } else if (m_pToken->m_type == TOKeof ||
-                       m_pToken->m_type == TOKreserver) {
-              break;
-            }
-          }
-          if (m_pToken->m_type != TOKrparen) {
-            CFX_WideString ws_TempString = m_pToken->m_wstring;
-            Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-                  XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
-          }
-        }
-        if (m_pErrorInfo->message.IsEmpty()) {
-          e = new CXFA_FMCallExpression(line, e, pArray.release(), FALSE);
-          NextToken();
-          if (m_pToken->m_type != TOKlbracket) {
-            continue;
-          }
-          CXFA_FMSimpleExpression* s = ParseIndexExpression();
-          if (s) {
-            e = new CXFA_FMDotAccessorExpression(line, e, TOKcall,
-                                                 FX_WSTRC(L""), s);
-          } else {
-            delete e;
-            e = nullptr;
-          }
-        } else {
-          if (pArray) {
-            for (int32_t i = 0; i < pArray->GetSize(); ++i)
-              delete static_cast<CXFA_FMSimpleExpression*>(pArray->GetAt(i));
-          }
-          delete e;
-          e = nullptr;
-        }
-      } break;
-      case TOKdot:
-        NextToken();
-        if (m_pToken->m_type == TOKidentifier) {
-          CFX_WideStringC tempStr = m_pToken->m_wstring;
-          FX_DWORD tempLine = m_pToken->m_uLinenum;
-          NextToken();
-          if (m_pToken->m_type == TOKlparen) {
-            CXFA_FMSimpleExpression* pExpAccessor;
-            CXFA_FMSimpleExpression* pExpCall;
-            pExpAccessor = e;
-            NextToken();
-            std::unique_ptr<CFX_PtrArray> pArray;
-            if (m_pToken->m_type != TOKrparen) {
-              pArray.reset(new CFX_PtrArray());
-              while (m_pToken->m_type != TOKrparen) {
-                CXFA_FMSimpleExpression* exp = ParseSimpleExpression();
-                pArray->Add(exp);
-                if (m_pToken->m_type == TOKcomma) {
-                  NextToken();
-                } else if (m_pToken->m_type == TOKeof ||
-                           m_pToken->m_type == TOKreserver) {
-                  break;
-                }
-              }
-              if (m_pToken->m_type != TOKrparen) {
-                CFX_WideString ws_TempString = m_pToken->m_wstring;
-                Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-                      XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
-              }
-            }
-            if (m_pErrorInfo->message.IsEmpty()) {
-              CXFA_FMSimpleExpression* pIdentifier =
-                  new CXFA_FMIdentifierExpressionn(tempLine, tempStr);
-              pExpCall = new CXFA_FMCallExpression(line, pIdentifier,
-                                                   pArray.release(), TRUE);
-              e = new CXFA_FMMethodCallExpression(line, pExpAccessor, pExpCall);
-              NextToken();
-              if (m_pToken->m_type != TOKlbracket) {
-                continue;
-              }
-              CXFA_FMSimpleExpression* s = ParseIndexExpression();
-              if (s) {
-                e = new CXFA_FMDotAccessorExpression(line, e, TOKcall,
-                                                     FX_WSTRC(L""), s);
-              } else {
-                delete e;
-                e = nullptr;
-              }
-            } else {
-              if (pArray) {
-                for (int32_t i = 0; i < pArray->GetSize(); ++i) {
-                  delete static_cast<CXFA_FMSimpleExpression*>(
-                      pArray->GetAt(i));
-                }
-              }
-              delete e;
-              e = nullptr;
-            }
-          } else if (m_pToken->m_type == TOKlbracket) {
-            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
-            if (!(m_pErrorInfo->message.IsEmpty())) {
-              delete e;
-              return nullptr;
-            }
-            e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdot, tempStr,
-                                                 s.release());
-          } else {
-            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
-                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
-            e = new CXFA_FMDotAccessorExpression(line, e, TOKdot, tempStr, s);
-            continue;
-          }
-        } else {
-          CFX_WideString ws_TempString = m_pToken->m_wstring;
-          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-                ws_TempString.c_str());
-          return e;
-        }
-        break;
-      case TOKdotdot:
-        NextToken();
-        if (m_pToken->m_type == TOKidentifier) {
-          CFX_WideStringC tempStr = m_pToken->m_wstring;
-          FX_DWORD tempLine = m_pToken->m_uLinenum;
-          NextToken();
-          if (m_pToken->m_type == TOKlbracket) {
-            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
-            if (!(m_pErrorInfo->message.IsEmpty())) {
-              delete e;
-              return nullptr;
-            }
-            e = new CXFA_FMDotDotAccessorExpression(tempLine, e, TOKdotdot,
-                                                    tempStr, s.release());
-          } else {
-            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
-                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
-            e = new CXFA_FMDotDotAccessorExpression(line, e, TOKdotdot, tempStr,
-                                                    s);
-            continue;
-          }
-        } else {
-          CFX_WideString ws_TempString = m_pToken->m_wstring;
-          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-                ws_TempString.c_str());
-          return e;
-        }
-        break;
-      case TOKdotscream:
-        NextToken();
-        if (m_pToken->m_type == TOKidentifier) {
-          CFX_WideStringC tempStr = m_pToken->m_wstring;
-          FX_DWORD tempLine = m_pToken->m_uLinenum;
-          NextToken();
-          if (m_pToken->m_type == TOKlbracket) {
-            std::unique_ptr<CXFA_FMSimpleExpression> s(ParseIndexExpression());
-            if (!(m_pErrorInfo->message.IsEmpty())) {
-              delete e;
-              return nullptr;
-            }
-            e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdotscream,
-                                                 tempStr, s.release());
-          } else {
-            CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression(
-                tempLine, ACCESSOR_NO_INDEX, NULL, FALSE);
-            e = new CXFA_FMDotAccessorExpression(line, e, TOKdotscream, tempStr,
-                                                 s);
-            continue;
-          }
-        } else {
-          CFX_WideString ws_TempString = m_pToken->m_wstring;
-          Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER,
-                ws_TempString.c_str());
-          return e;
-        }
-        break;
-      case TOKdotstar: {
-        CXFA_FMSimpleExpression* s =
-            new CXFA_FMIndexExpression(line, ACCESSOR_NO_INDEX, NULL, FALSE);
-        e = new CXFA_FMDotAccessorExpression(line, e, TOKdotstar,
-                                             FX_WSTRC(L"*"), s);
-      } break;
-      default:
-        return e;
-    }
-    NextToken();
-  }
-  return e;
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() {
-  std::unique_ptr<CXFA_FMSimpleExpression> pExp;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  std::unique_ptr<CXFA_FMSimpleExpression> s;
-  XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX;
-  if (m_pToken->m_type == TOKmul) {
-    pExp.reset(
-        new CXFA_FMIndexExpression(line, accessorIndex, s.release(), TRUE));
-    NextToken();
-    if (m_pToken->m_type != TOKrbracket) {
-      CFX_WideString ws_TempString = m_pToken->m_wstring;
-      Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-            XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
-      pExp.reset();
-    }
-    return pExp.release();
-  }
-  if (m_pToken->m_type == TOKplus) {
-    accessorIndex = ACCESSOR_POSITIVE_INDEX;
-    NextToken();
-  } else if (m_pToken->m_type == TOKminus) {
-    accessorIndex = ACCESSOR_NEGATIVE_INDEX;
-    NextToken();
-  }
-  s.reset(ParseSimpleExpression());
-  if (m_pToken->m_type != TOKrbracket) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-          XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str());
-  } else {
-    pExp.reset(
-        new CXFA_FMIndexExpression(line, accessorIndex, s.release(), FALSE));
-  }
-  return pExp.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() {
-  Check(TOKlparen);
-
-  if (m_pToken->m_type == TOKrparen) {
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_NON_EMPTY_EXPRESSION);
-    NextToken();
-    return nullptr;
-  }
-
-  FX_DWORD line = m_pToken->m_uLinenum;
-  std::unique_ptr<CXFA_FMSimpleExpression> pExp1(ParseLogicalOrExpression());
-
-  while (m_pToken->m_type == TOKassign) {
-    NextToken();
-    std::unique_ptr<CXFA_FMSimpleExpression> pExp2(ParseLogicalOrExpression());
-    if (m_pErrorInfo->message.IsEmpty()) {
-      pExp1.reset(new CXFA_FMAssignExpression(line, TOKassign, pExp1.release(),
-                                              pExp2.release()));
-    } else {
-      pExp1.reset();
-    }
-  }
-  Check(TOKrparen);
-  return pExp1.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  CXFA_FMExpression* e = nullptr;
-  std::unique_ptr<CFX_PtrArray> expression(new CFX_PtrArray());
-  while (1) {
-    switch (m_pToken->m_type) {
-      case TOKeof:
-      case TOKendif:
-      case TOKelseif:
-      case TOKelse:
-      case TOKendwhile:
-      case TOKendfor:
-      case TOKend:
-      case TOKendfunc:
-      case TOKreserver:
-        break;
-      case TOKfunc:
-        e = ParseFunction();
-        if (e) {
-          expression->Add(e);
-        }
-        continue;
-      default:
-        e = ParseExpression();
-        if (e) {
-          expression->Add(e);
-        }
-        continue;
-    }
-    break;
-  }
-  std::unique_ptr<CXFA_FMBlockExpression> pExp;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    pExp.reset(new CXFA_FMBlockExpression(line, expression.release()));
-  } else {
-    for (int i = 0; i < expression->GetSize(); ++i)
-      delete static_cast<CXFA_FMExpression*>(expression->GetAt(i));
-  }
-  return pExp.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  const FX_WCHAR* pStartPos = m_lexer->SavePos();
-  NextToken();
-  Check(TOKlparen);
-  std::unique_ptr<CXFA_FMSimpleExpression> pExpression;
-  while (m_pToken->m_type != TOKrparen) {
-    pExpression.reset(ParseSimpleExpression());
-    if (m_pToken->m_type != TOKcomma)
-      break;
-    NextToken();
-  }
-  Check(TOKrparen);
-  if (m_pToken->m_type != TOKthen) {
-    m_lexer->SetCurrentLine(line);
-    m_pToken = new CXFA_FMToken(line);
-    m_pToken->m_type = TOKidentifier;
-    m_pToken->m_wstring = FX_WSTRC(L"if");
-    m_lexer->SetToken(m_pToken);
-    m_lexer->RestorePos(pStartPos);
-    return ParseExpExpression();
-  }
-  Check(TOKthen);
-  std::unique_ptr<CXFA_FMExpression> pIfExpression(ParseBlockExpression());
-  std::unique_ptr<CXFA_FMExpression> pElseExpression;
-  switch (m_pToken->m_type) {
-    case TOKeof:
-    case TOKendif:
-      Check(TOKendif);
-      break;
-    case TOKif:
-      pElseExpression.reset(ParseIfExpression());
-      Check(TOKendif);
-      break;
-    case TOKelseif:
-      pElseExpression.reset(ParseIfExpression());
-      break;
-    case TOKelse:
-      NextToken();
-      pElseExpression.reset(ParseBlockExpression());
-      Check(TOKendif);
-      break;
-    default:
-      CFX_WideString ws_TempString = m_pToken->m_wstring;
-      Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IFEND, ws_TempString.c_str());
-      NextToken();
-      break;
-  }
-  std::unique_ptr<CXFA_FMIfExpression> pExp;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    pExp.reset(new CXFA_FMIfExpression(line, pExpression.release(),
-                                       pIfExpression.release(),
-                                       pElseExpression.release()));
-  }
-  return pExp.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() {
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  std::unique_ptr<CXFA_FMSimpleExpression> pCondition(ParseParenExpression());
-  Check(TOKdo);
-  std::unique_ptr<CXFA_FMExpression> pExpression(ParseBlockExpression());
-  Check(TOKendwhile);
-  std::unique_ptr<CXFA_FMExpression> e;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMWhileExpression(line, pCondition.release(),
-                                       pExpression.release()));
-  }
-  return e.release();
-}
-
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() {
-  std::unique_ptr<CXFA_FMSimpleExpression> e;
-  switch (m_pToken->m_type) {
-    case TOKidentifier:
-      e.reset(ParseSimpleExpression());
-      break;
-    default:
-      CFX_WideString ws_TempString = m_pToken->m_wstring;
-      Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
-            ws_TempString.c_str());
-      NextToken();
-      break;
-  }
-  return e.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseForExpression() {
-  CFX_WideStringC wsVariant;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  if (m_pToken->m_type != TOKidentifier) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
-  }
-  wsVariant = m_pToken->m_wstring;
-  NextToken();
-  std::unique_ptr<CXFA_FMSimpleExpression> pAssignment;
-  if (m_pToken->m_type == TOKassign) {
-    NextToken();
-    pAssignment.reset(ParseSimpleExpression());
-  } else {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
-  }
-  int32_t iDirection = 0;
-  if (m_pToken->m_type == TOKupto) {
-    iDirection = 1;
-  } else if (m_pToken->m_type == TOKdownto) {
-    iDirection = -1;
-  } else {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, L"upto or downto",
-          (const FX_WCHAR*)ws_TempString);
-  }
-  NextToken();
-  std::unique_ptr<CXFA_FMSimpleExpression> pAccessor(ParseSimpleExpression());
-  std::unique_ptr<CXFA_FMSimpleExpression> pStep;
-  if (m_pToken->m_type == TOKstep) {
-    NextToken();
-    pStep.reset(ParseSimpleExpression());
-  }
-  Check(TOKdo);
-  std::unique_ptr<CXFA_FMExpression> pList(ParseBlockExpression());
-  Check(TOKendfor);
-  std::unique_ptr<CXFA_FMExpression> e;
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMForExpression(line, wsVariant, pAssignment.release(),
-                                     pAccessor.release(), iDirection,
-                                     pStep.release(), pList.release()));
-  }
-  return e.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  CFX_WideStringC wsIdentifier;
-  std::unique_ptr<CFX_PtrArray> pAccessors;
-  std::unique_ptr<CXFA_FMExpression> pList;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  if (m_pToken->m_type != TOKidentifier) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN,
-          XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str());
-  }
-  wsIdentifier = m_pToken->m_wstring;
-  NextToken();
-  Check(TOKin);
-  Check(TOKlparen);
-  if (m_pToken->m_type == TOKrparen) {
-    CFX_WideString ws_TempString = m_pToken->m_wstring;
-    Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION,
-          ws_TempString.c_str());
-    NextToken();
-  } else {
-    pAccessors.reset(new CFX_PtrArray());
-    while (m_pToken->m_type != TOKrparen) {
-      CXFA_FMSimpleExpression* s = ParseSimpleExpression();
-      if (s) {
-        pAccessors->Add(s);
-      }
-      if (m_pToken->m_type == TOKcomma) {
-        NextToken();
-      } else {
-        break;
-      }
-    }
-    Check(TOKrparen);
-  }
-  Check(TOKdo);
-  pList.reset(ParseBlockExpression());
-  Check(TOKendfor);
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMForeachExpression(
-        line, wsIdentifier, pAccessors.release(), pList.release()));
-  } else {
-    if (pAccessors) {
-      for (int i = 0; i < pAccessors->GetSize(); ++i)
-        delete static_cast<CXFA_FMSimpleExpression*>(pAccessors->GetAt(i));
-    }
-  }
-  return e.release();
-}
-
-CXFA_FMExpression* CXFA_FMParse::ParseDoExpression() {
-  std::unique_ptr<CXFA_FMExpression> e;
-  FX_DWORD line = m_pToken->m_uLinenum;
-  NextToken();
-  e.reset(ParseBlockExpression());
-  Check(TOKend);
-  if (m_pErrorInfo->message.IsEmpty()) {
-    e.reset(new CXFA_FMDoExpression(line, e.release()));
-  } else {
-    e.reset();
-  }
-  return e.release();
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_fmparse.h b/xfa/src/fxfa/fm2js/xfa_fmparse.h
deleted file mode 100644
index 7494cd0..0000000
--- a/xfa/src/fxfa/fm2js/xfa_fmparse.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_FMPARSE_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_FMPARSE_H_
-
-#include <memory>
-
-#include "xfa/src/fxfa/fm2js/xfa_expression.h"
-#include "xfa/src/fxfa/fm2js/xfa_lexer.h"
-
-class CXFA_FMParse {
- public:
-  CXFA_FMParse();
-  int32_t Init(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
-  void NextToken();
-  void Check(XFA_FM_TOKEN op);
-  void Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...);
-  CFX_PtrArray* ParseTopExpression();
-  CXFA_FMExpression* ParseFunction();
-  CXFA_FMExpression* ParseExpression();
-  CXFA_FMExpression* ParseVarExpression();
-  CXFA_FMExpression* ParseExpExpression();
-  CXFA_FMExpression* ParseBlockExpression();
-  CXFA_FMExpression* ParseIfExpression();
-  CXFA_FMExpression* ParseWhileExpression();
-  CXFA_FMExpression* ParseForExpression();
-  CXFA_FMExpression* ParseForeachExpression();
-  CXFA_FMExpression* ParseDoExpression();
-  CXFA_FMSimpleExpression* ParseParenExpression();
-  CXFA_FMSimpleExpression* ParseSimpleExpression();
-  CXFA_FMSimpleExpression* ParseSubassignmentInForExpression();
-  CXFA_FMSimpleExpression* ParseLogicalOrExpression();
-  CXFA_FMSimpleExpression* ParseLogicalAndExpression();
-  CXFA_FMSimpleExpression* ParseEqualityExpression();
-  CXFA_FMSimpleExpression* ParseRelationalExpression();
-  CXFA_FMSimpleExpression* ParseAddtiveExpression();
-  CXFA_FMSimpleExpression* ParseMultiplicativeExpression();
-  CXFA_FMSimpleExpression* ParseUnaryExpression();
-  CXFA_FMSimpleExpression* ParsePrimaryExpression();
-  CXFA_FMSimpleExpression* ParsePostExpression(CXFA_FMSimpleExpression* e);
-  CXFA_FMSimpleExpression* ParseIndexExpression();
-
- private:
-  std::unique_ptr<CXFA_FMLexer> m_lexer;
-  CXFA_FMToken* m_pToken;
-  CXFA_FMErrorInfo* m_pErrorInfo;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_FMPARSE_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_lexer.cpp b/xfa/src/fxfa/fm2js/xfa_lexer.cpp
deleted file mode 100644
index f93fa83..0000000
--- a/xfa/src/fxfa/fm2js/xfa_lexer.cpp
+++ /dev/null
@@ -1,552 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_lexer.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-
-namespace {
-
-struct XFA_FMDChar {
-  static const FX_WCHAR* inc(const FX_WCHAR*& p) {
-    ++p;
-    return p;
-  }
-  static const FX_WCHAR* dec(const FX_WCHAR*& p) {
-    --p;
-    return p;
-  }
-  static uint16_t get(const FX_WCHAR* p) { return *p; }
-  static FX_BOOL isWhiteSpace(const FX_WCHAR* p) {
-    return (*p) == 0x09 || (*p) == 0x0b || (*p) == 0x0c || (*p) == 0x20;
-  }
-  static FX_BOOL isLineTerminator(const FX_WCHAR* p) {
-    return *p == 0x0A || *p == 0x0D;
-  }
-  static FX_BOOL isBinary(const FX_WCHAR* p) {
-    return (*p) >= '0' && (*p) <= '1';
-  }
-  static FX_BOOL isOctal(const FX_WCHAR* p) {
-    return (*p) >= '0' && (*p) <= '7';
-  }
-  static FX_BOOL isDigital(const FX_WCHAR* p) {
-    return (*p) >= '0' && (*p) <= '9';
-  }
-  static FX_BOOL isHex(const FX_WCHAR* p) {
-    return isDigital(p) || ((*p) >= 'a' && (*p) <= 'f') ||
-           ((*p) >= 'A' && (*p) <= 'F');
-  }
-  static FX_BOOL isAlpha(const FX_WCHAR* p) {
-    return ((*p) <= 'z' && (*p) >= 'a') || ((*p) <= 'Z' && (*p) >= 'A');
-  }
-  static FX_BOOL isAvalid(const FX_WCHAR* p, FX_BOOL flag = 0);
-  static FX_BOOL string2number(const FX_WCHAR* s,
-                               FX_DOUBLE* pValue,
-                               const FX_WCHAR*& pEnd);
-  static FX_BOOL isUnicodeAlpha(uint16_t ch);
-};
-
-inline FX_BOOL XFA_FMDChar::isAvalid(const FX_WCHAR* p, FX_BOOL flag) {
-  if (*p == 0) {
-    return 1;
-  }
-  if ((*p <= 0x0A && *p >= 0x09) || *p == 0x0D ||
-      (*p <= 0xd7ff && *p >= 0x20) || (*p <= 0xfffd && *p >= 0xe000)) {
-    return 1;
-  }
-  if (!flag) {
-    if (*p == 0x0B || *p == 0x0C) {
-      return 1;
-    }
-  }
-  return 0;
-}
-
-inline FX_BOOL XFA_FMDChar::string2number(const FX_WCHAR* s,
-                                          FX_DOUBLE* pValue,
-                                          const FX_WCHAR*& pEnd) {
-  if (s) {
-    *pValue = wcstod((wchar_t*)s, (wchar_t**)&pEnd);
-  }
-  return 0;
-}
-
-inline FX_BOOL XFA_FMDChar::isUnicodeAlpha(uint16_t ch) {
-  if (ch == 0 || ch == 0x0A || ch == 0x0D || ch == 0x09 || ch == 0x0B ||
-      ch == 0x0C || ch == 0x20 || ch == '.' || ch == ';' || ch == '"' ||
-      ch == '=' || ch == '<' || ch == '>' || ch == ',' || ch == '(' ||
-      ch == ')' || ch == ']' || ch == '[' || ch == '&' || ch == '|' ||
-      ch == '+' || ch == '-' || ch == '*' || ch == '/') {
-    return FALSE;
-  }
-  return TRUE;
-}
-
-const XFA_FMKeyword keyWords[] = {
-    {TOKand, 0x00000026, L"&"},
-    {TOKlparen, 0x00000028, L"("},
-    {TOKrparen, 0x00000029, L")"},
-    {TOKmul, 0x0000002a, L"*"},
-    {TOKplus, 0x0000002b, L"+"},
-    {TOKcomma, 0x0000002c, L","},
-    {TOKminus, 0x0000002d, L"-"},
-    {TOKdot, 0x0000002e, L"."},
-    {TOKdiv, 0x0000002f, L"/"},
-    {TOKlt, 0x0000003c, L"<"},
-    {TOKassign, 0x0000003d, L"="},
-    {TOKgt, 0x0000003e, L">"},
-    {TOKlbracket, 0x0000005b, L"["},
-    {TOKrbracket, 0x0000005d, L"]"},
-    {TOKor, 0x0000007c, L"|"},
-    {TOKdotscream, 0x0000ec11, L".#"},
-    {TOKdotstar, 0x0000ec18, L".*"},
-    {TOKdotdot, 0x0000ec1c, L".."},
-    {TOKle, 0x000133f9, L"<="},
-    {TOKne, 0x000133fa, L"<>"},
-    {TOKeq, 0x0001391a, L"=="},
-    {TOKge, 0x00013e3b, L">="},
-    {TOKdo, 0x00020153, L"do"},
-    {TOKkseq, 0x00020676, L"eq"},
-    {TOKksge, 0x000210ac, L"ge"},
-    {TOKksgt, 0x000210bb, L"gt"},
-    {TOKif, 0x00021aef, L"if"},
-    {TOKin, 0x00021af7, L"in"},
-    {TOKksle, 0x00022a51, L"le"},
-    {TOKkslt, 0x00022a60, L"lt"},
-    {TOKksne, 0x00023493, L"ne"},
-    {TOKksor, 0x000239c1, L"or"},
-    {TOKnull, 0x052931bb, L"null"},
-    {TOKbreak, 0x05518c25, L"break"},
-    {TOKksand, 0x09f9db33, L"and"},
-    {TOKend, 0x0a631437, L"end"},
-    {TOKeof, 0x0a63195a, L"eof"},
-    {TOKfor, 0x0a7d67a7, L"for"},
-    {TOKnan, 0x0b4f91dd, L"nan"},
-    {TOKksnot, 0x0b4fd9b1, L"not"},
-    {TOKvar, 0x0c2203e9, L"var"},
-    {TOKthen, 0x2d5738cf, L"then"},
-    {TOKelse, 0x45f65ee9, L"else"},
-    {TOKexit, 0x4731d6ba, L"exit"},
-    {TOKdownto, 0x4caadc3b, L"downto"},
-    {TOKreturn, 0x4db8bd60, L"return"},
-    {TOKinfinity, 0x5c0a010a, L"infinity"},
-    {TOKendwhile, 0x5c64bff0, L"endwhile"},
-    {TOKforeach, 0x67e31f38, L"foreach"},
-    {TOKendfunc, 0x68f984a3, L"endfunc"},
-    {TOKelseif, 0x78253218, L"elseif"},
-    {TOKwhile, 0x84229259, L"while"},
-    {TOKendfor, 0x8ab49d7e, L"endfor"},
-    {TOKthrow, 0x8db05c94, L"throw"},
-    {TOKstep, 0xa7a7887c, L"step"},
-    {TOKupto, 0xb5155328, L"upto"},
-    {TOKcontinue, 0xc0340685, L"continue"},
-    {TOKfunc, 0xcdce60ec, L"func"},
-    {TOKendif, 0xe0e8fee6, L"endif"},
-};
-
-const XFA_FM_TOKEN KEYWORD_START = TOKdo;
-const XFA_FM_TOKEN KEYWORD_END = TOKendif;
-
-}  // namespace
-
-const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op) {
-  if (op < KEYWORD_START || op > KEYWORD_END)
-    return L"";
-  return keyWords[op].m_keyword;
-}
-
-CXFA_FMToken::CXFA_FMToken() : m_type(TOKreserver), m_uLinenum(1) {}
-
-CXFA_FMToken::CXFA_FMToken(FX_DWORD uLineNum)
-    : m_type(TOKreserver), m_uLinenum(uLineNum) {}
-
-CXFA_FMLexer::CXFA_FMLexer(const CFX_WideStringC& wsFormCalc,
-                           CXFA_FMErrorInfo* pErrorInfo)
-    : m_ptr(wsFormCalc.GetPtr()), m_uCurrentLine(1), m_pErrorInfo(pErrorInfo) {}
-
-CXFA_FMToken* CXFA_FMLexer::NextToken() {
-  m_pToken.reset(Scan());
-  return m_pToken.get();
-}
-
-CXFA_FMToken* CXFA_FMLexer::Scan() {
-  uint16_t ch = 0;
-  CXFA_FMToken* p = new CXFA_FMToken(m_uCurrentLine);
-  if (!XFA_FMDChar::isAvalid(m_ptr)) {
-    ch = XFA_FMDChar::get(m_ptr);
-    Error(FMERR_UNSUPPORTED_CHAR, ch);
-    return p;
-  }
-  int iRet = 0;
-  while (1) {
-    if (!XFA_FMDChar::isAvalid(m_ptr)) {
-      ch = XFA_FMDChar::get(m_ptr);
-      Error(FMERR_UNSUPPORTED_CHAR, ch);
-      return p;
-    }
-    ch = XFA_FMDChar::get(m_ptr);
-    switch (ch) {
-      case 0:
-        p->m_type = TOKeof;
-        return p;
-      case 0x0A:
-        ++m_uCurrentLine;
-        p->m_uLinenum = m_uCurrentLine;
-        XFA_FMDChar::inc(m_ptr);
-        break;
-      case 0x0D:
-        XFA_FMDChar::inc(m_ptr);
-        break;
-      case ';': {
-        const FX_WCHAR* pTemp = 0;
-        Comment(m_ptr, pTemp);
-        m_ptr = pTemp;
-      } break;
-      case '"': {
-        const FX_WCHAR* pTemp = 0;
-        p->m_type = TOKstring;
-        iRet = String(p, m_ptr, pTemp);
-        m_ptr = pTemp;
-      }
-        return p;
-      case '0':
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9': {
-        p->m_type = TOKnumber;
-        const FX_WCHAR* pTemp = 0;
-        iRet = Number(p, m_ptr, pTemp);
-        m_ptr = pTemp;
-        if (iRet) {
-          Error(FMERR_BAD_SUFFIX_NUMBER);
-          return p;
-        }
-      }
-        return p;
-      case '=':
-        XFA_FMDChar::inc(m_ptr);
-        if (XFA_FMDChar::isAvalid(m_ptr)) {
-          ch = XFA_FMDChar::get(m_ptr);
-          if (ch == '=') {
-            p->m_type = TOKeq;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else {
-            p->m_type = TOKassign;
-            return p;
-          }
-        } else {
-          ch = XFA_FMDChar::get(m_ptr);
-          Error(FMERR_UNSUPPORTED_CHAR, ch);
-          return p;
-        }
-        break;
-      case '<':
-        XFA_FMDChar::inc(m_ptr);
-        if (XFA_FMDChar::isAvalid(m_ptr)) {
-          ch = XFA_FMDChar::get(m_ptr);
-          if (ch == '=') {
-            p->m_type = TOKle;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else if (ch == '>') {
-            p->m_type = TOKne;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else {
-            p->m_type = TOKlt;
-            return p;
-          }
-        } else {
-          ch = XFA_FMDChar::get(m_ptr);
-          Error(FMERR_UNSUPPORTED_CHAR, ch);
-          return p;
-        }
-        break;
-      case '>':
-        XFA_FMDChar::inc(m_ptr);
-        if (XFA_FMDChar::isAvalid(m_ptr)) {
-          ch = XFA_FMDChar::get(m_ptr);
-          if (ch == '=') {
-            p->m_type = TOKge;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else {
-            p->m_type = TOKgt;
-            return p;
-          }
-        } else {
-          ch = XFA_FMDChar::get(m_ptr);
-          Error(FMERR_UNSUPPORTED_CHAR, ch);
-          return p;
-        }
-        break;
-      case ',':
-        p->m_type = TOKcomma;
-        XFA_FMDChar::inc(m_ptr);
-        return p;
-      case '(':
-        p->m_type = TOKlparen;
-        XFA_FMDChar::inc(m_ptr);
-        return p;
-      case ')':
-        p->m_type = TOKrparen;
-        XFA_FMDChar::inc(m_ptr);
-        return p;
-      case '[':
-        p->m_type = TOKlbracket;
-        XFA_FMDChar::inc(m_ptr);
-        return p;
-      case ']':
-        p->m_type = TOKrbracket;
-        XFA_FMDChar::inc(m_ptr);
-        return p;
-      case '&':
-        XFA_FMDChar::inc(m_ptr);
-        p->m_type = TOKand;
-        return p;
-      case '|':
-        XFA_FMDChar::inc(m_ptr);
-        p->m_type = TOKor;
-        return p;
-      case '+':
-        XFA_FMDChar::inc(m_ptr);
-        p->m_type = TOKplus;
-        return p;
-      case '-':
-        XFA_FMDChar::inc(m_ptr);
-        p->m_type = TOKminus;
-        return p;
-      case '*':
-        XFA_FMDChar::inc(m_ptr);
-        p->m_type = TOKmul;
-        return p;
-      case '/':
-        XFA_FMDChar::inc(m_ptr);
-        if (XFA_FMDChar::isAvalid(m_ptr)) {
-          ch = XFA_FMDChar::get(m_ptr);
-          if (ch == '/') {
-            const FX_WCHAR* pTemp = 0;
-            Comment(m_ptr, pTemp);
-            m_ptr = pTemp;
-            break;
-          } else {
-            p->m_type = TOKdiv;
-            return p;
-          }
-        } else {
-          ch = XFA_FMDChar::get(m_ptr);
-          Error(FMERR_UNSUPPORTED_CHAR, ch);
-          return p;
-        }
-        break;
-      case '.':
-        XFA_FMDChar::inc(m_ptr);
-        if (XFA_FMDChar::isAvalid(m_ptr)) {
-          ch = XFA_FMDChar::get(m_ptr);
-          if (ch == '.') {
-            p->m_type = TOKdotdot;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else if (ch == '*') {
-            p->m_type = TOKdotstar;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else if (ch == '#') {
-            p->m_type = TOKdotscream;
-            XFA_FMDChar::inc(m_ptr);
-            return p;
-          } else if (ch <= '9' && ch >= '0') {
-            p->m_type = TOKnumber;
-            const FX_WCHAR* pTemp = 0;
-            XFA_FMDChar::dec(m_ptr);
-            iRet = Number(p, m_ptr, pTemp);
-            m_ptr = pTemp;
-            if (iRet) {
-              Error(FMERR_BAD_SUFFIX_NUMBER);
-            }
-            return p;
-          } else {
-            p->m_type = TOKdot;
-            return p;
-          }
-        } else {
-          ch = XFA_FMDChar::get(m_ptr);
-          Error(FMERR_UNSUPPORTED_CHAR, ch);
-          return p;
-        }
-      case 0x09:
-      case 0x0B:
-      case 0x0C:
-      case 0x20:
-        XFA_FMDChar::inc(m_ptr);
-        break;
-      default: {
-        const FX_WCHAR* pTemp = 0;
-        iRet = Identifiers(p, m_ptr, pTemp);
-        m_ptr = pTemp;
-        if (iRet) {
-          return p;
-        }
-        p->m_type = IsKeyword(p->m_wstring);
-      }
-        return p;
-    }
-  }
-}
-
-FX_DWORD CXFA_FMLexer::Number(CXFA_FMToken* t,
-                              const FX_WCHAR* p,
-                              const FX_WCHAR*& pEnd) {
-  FX_DOUBLE number = 0;
-  if (XFA_FMDChar::string2number(p, &number, pEnd)) {
-    return 1;
-  }
-  if (pEnd && XFA_FMDChar::isAlpha(pEnd)) {
-    return 1;
-  }
-  t->m_wstring = CFX_WideStringC(p, (pEnd - p));
-  return 0;
-}
-
-FX_DWORD CXFA_FMLexer::String(CXFA_FMToken* t,
-                              const FX_WCHAR* p,
-                              const FX_WCHAR*& pEnd) {
-  const FX_WCHAR* pStart = p;
-  uint16_t ch = 0;
-  XFA_FMDChar::inc(p);
-  ch = XFA_FMDChar::get(p);
-  while (ch) {
-    if (!XFA_FMDChar::isAvalid(p)) {
-      ch = XFA_FMDChar::get(p);
-      pEnd = p;
-      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-      Error(FMERR_UNSUPPORTED_CHAR, ch);
-      return 1;
-    }
-    if (ch == '"') {
-      XFA_FMDChar::inc(p);
-      if (!XFA_FMDChar::isAvalid(p)) {
-        ch = XFA_FMDChar::get(p);
-        pEnd = p;
-        t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-        Error(FMERR_UNSUPPORTED_CHAR, ch);
-        return 1;
-      }
-      ch = XFA_FMDChar::get(p);
-      if (ch == '"') {
-        goto NEXT;
-      } else {
-        break;
-      }
-    }
-  NEXT:
-    XFA_FMDChar::inc(p);
-    ch = XFA_FMDChar::get(p);
-  }
-  pEnd = p;
-  t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-  return 0;
-}
-
-FX_DWORD CXFA_FMLexer::Identifiers(CXFA_FMToken* t,
-                                   const FX_WCHAR* p,
-                                   const FX_WCHAR*& pEnd) {
-  const FX_WCHAR* pStart = p;
-  uint16_t ch = 0;
-  ch = XFA_FMDChar::get(p);
-  XFA_FMDChar::inc(p);
-  if (!XFA_FMDChar::isAvalid(p)) {
-    pEnd = p;
-    t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-    Error(FMERR_UNSUPPORTED_CHAR, ch);
-    return 1;
-  }
-  ch = XFA_FMDChar::get(p);
-  while (ch) {
-    if (!XFA_FMDChar::isAvalid(p)) {
-      pEnd = p;
-      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-      Error(FMERR_UNSUPPORTED_CHAR, ch);
-      return 1;
-    }
-    ch = XFA_FMDChar::get(p);
-    if (XFA_FMDChar::isUnicodeAlpha(ch)) {
-      XFA_FMDChar::inc(p);
-    } else {
-      pEnd = p;
-      t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-      return 0;
-    }
-  }
-  pEnd = p;
-  t->m_wstring = CFX_WideStringC(pStart, (pEnd - pStart));
-  return 0;
-}
-
-void CXFA_FMLexer::Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd) {
-  unsigned ch = 0;
-  XFA_FMDChar::inc(p);
-  ch = XFA_FMDChar::get(p);
-  while (ch) {
-    if (ch == 0x0D) {
-      XFA_FMDChar::inc(p);
-      pEnd = p;
-      return;
-    }
-    if (ch == 0x0A) {
-      ++m_uCurrentLine;
-      XFA_FMDChar::inc(p);
-      pEnd = p;
-      return;
-    }
-    XFA_FMDChar::inc(p);
-    ch = XFA_FMDChar::get(p);
-  }
-  pEnd = p;
-}
-
-XFA_FM_TOKEN CXFA_FMLexer::IsKeyword(const CFX_WideStringC& str) {
-  int32_t iLength = str.GetLength();
-  uint32_t uHash = FX_HashCode_String_GetW(str.GetPtr(), iLength, TRUE);
-  int32_t iStart = KEYWORD_START, iEnd = KEYWORD_END;
-  int32_t iMid = (iStart + iEnd) / 2;
-  XFA_FMKeyword keyword;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    keyword = keyWords[iMid];
-    if (uHash == keyword.m_uHash) {
-      return keyword.m_type;
-    } else if (uHash < keyword.m_uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return TOKidentifier;
-}
-
-void CXFA_FMLexer::Error(XFA_FM_ERRMSG msg, ...) {
-  m_pErrorInfo->linenum = m_uCurrentLine;
-  const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg);
-  va_list ap;
-  va_start(ap, msg);
-  m_pErrorInfo->message.FormatV(lpMessageInfo, ap);
-  va_end(ap);
-}
-
-FX_BOOL CXFA_FMLexer::HasError() const {
-  if (m_pErrorInfo->message.IsEmpty()) {
-    return FALSE;
-  }
-  return TRUE;
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_lexer.h b/xfa/src/fxfa/fm2js/xfa_lexer.h
deleted file mode 100644
index f45f639..0000000
--- a/xfa/src/fxfa/fm2js/xfa_lexer.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_LEXER_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_LEXER_H_
-
-#include <memory>
-
-#include "core/include/fxcrt/fx_string.h"
-#include "xfa/src/fxfa/fm2js/xfa_error.h"
-
-enum XFA_FM_TOKEN {
-  TOKand,
-  TOKlparen,
-  TOKrparen,
-  TOKmul,
-  TOKplus,
-  TOKcomma,
-  TOKminus,
-  TOKdot,
-  TOKdiv,
-  TOKlt,
-  TOKassign,
-  TOKgt,
-  TOKlbracket,
-  TOKrbracket,
-  TOKor,
-  TOKdotscream,
-  TOKdotstar,
-  TOKdotdot,
-  TOKle,
-  TOKne,
-  TOKeq,
-  TOKge,
-  TOKdo,
-  TOKkseq,
-  TOKksge,
-  TOKksgt,
-  TOKif,
-  TOKin,
-  TOKksle,
-  TOKkslt,
-  TOKksne,
-  TOKksor,
-  TOKnull,
-  TOKbreak,
-  TOKksand,
-  TOKend,
-  TOKeof,
-  TOKfor,
-  TOKnan,
-  TOKksnot,
-  TOKvar,
-  TOKthen,
-  TOKelse,
-  TOKexit,
-  TOKdownto,
-  TOKreturn,
-  TOKinfinity,
-  TOKendwhile,
-  TOKforeach,
-  TOKendfunc,
-  TOKelseif,
-  TOKwhile,
-  TOKendfor,
-  TOKthrow,
-  TOKstep,
-  TOKupto,
-  TOKcontinue,
-  TOKfunc,
-  TOKendif,
-  TOKstar,
-  TOKidentifier,
-  TOKunderscore,
-  TOKdollar,
-  TOKexclamation,
-  TOKcall,
-  TOKstring,
-  TOKnumber,
-  TOKreserver
-};
-
-struct XFA_FMKeyword {
-  XFA_FM_TOKEN m_type;
-  uint32_t m_uHash;
-  const FX_WCHAR* m_keyword;
-};
-
-const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op);
-
-class CXFA_FMToken {
- public:
-  CXFA_FMToken();
-  explicit CXFA_FMToken(FX_DWORD uLineNum);
-
-  CFX_WideStringC m_wstring;
-  XFA_FM_TOKEN m_type;
-  FX_DWORD m_uLinenum;
-};
-
-class CXFA_FMLexer {
- public:
-  CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
-  CXFA_FMToken* NextToken();
-  FX_DWORD Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
-  FX_DWORD String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
-  FX_DWORD Identifiers(CXFA_FMToken* t,
-                       const FX_WCHAR* p,
-                       const FX_WCHAR*& pEnd);
-  void Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd);
-  XFA_FM_TOKEN IsKeyword(const CFX_WideStringC& p);
-  void SetCurrentLine(FX_DWORD line) { m_uCurrentLine = line; }
-  void SetToken(CXFA_FMToken* pToken) {
-    if (m_pToken.get() != pToken)
-      m_pToken.reset(pToken);
-  }
-  const FX_WCHAR* SavePos() { return m_ptr; }
-  void RestorePos(const FX_WCHAR* pPos) { m_ptr = pPos; }
-  void Error(XFA_FM_ERRMSG msg, ...);
-  FX_BOOL HasError() const;
-
- protected:
-  CXFA_FMToken* Scan();
-
-  const FX_WCHAR* m_ptr;
-  FX_DWORD m_uCurrentLine;
-  std::unique_ptr<CXFA_FMToken> m_pToken;
-  CXFA_FMErrorInfo* m_pErrorInfo;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_LEXER_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_program.cpp b/xfa/src/fxfa/fm2js/xfa_program.cpp
deleted file mode 100644
index ce06c4d..0000000
--- a/xfa/src/fxfa/fm2js/xfa_program.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_program.h"
-
-CXFA_FMProgram::CXFA_FMProgram() : m_globalFunction(0) {}
-CXFA_FMProgram::~CXFA_FMProgram() {
-  if (m_globalFunction != 0) {
-    delete m_globalFunction;
-    m_globalFunction = 0;
-  }
-}
-int32_t CXFA_FMProgram::Init(const CFX_WideStringC& wsFormcalc) {
-  return m_parse.Init(wsFormcalc, &m_pErrorInfo);
-}
-int32_t CXFA_FMProgram::ParseProgram() {
-  CFX_PtrArray* expressions = 0;
-  m_parse.NextToken();
-  if (!m_pErrorInfo.message.IsEmpty()) {
-    return -1;
-  }
-  expressions = m_parse.ParseTopExpression();
-  if (!m_pErrorInfo.message.IsEmpty()) {
-    CXFA_FMExpression* e = 0;
-    for (int32_t u = 0; u < expressions->GetSize(); ++u) {
-      e = (CXFA_FMExpression*)expressions->GetAt(u);
-      if (e) {
-        delete e;
-      }
-    }
-    delete expressions;
-    return -1;
-  }
-  m_globalFunction =
-      new CXFA_FMFunctionDefinition(1, 1, FX_WSTRC(L""), 0, expressions);
-  return 0;
-}
-int32_t CXFA_FMProgram::TranslateProgram(CFX_WideTextBuf& wsJavaScript) {
-  m_globalFunction->ToJavaScript(wsJavaScript);
-  wsJavaScript.AppendChar(0);
-  return 0;
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_program.h b/xfa/src/fxfa/fm2js/xfa_program.h
deleted file mode 100644
index 3cd7cc4..0000000
--- a/xfa/src/fxfa/fm2js/xfa_program.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_PROGRAM_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_PROGRAM_H_
-
-#include "xfa/src/fxfa/fm2js/xfa_error.h"
-#include "xfa/src/fxfa/fm2js/xfa_fmparse.h"
-
-class CXFA_FMProgram {
- public:
-  CXFA_FMProgram();
-  ~CXFA_FMProgram();
-  int32_t Init(const CFX_WideStringC& wsFormcalc);
-  int32_t ParseProgram();
-  int32_t TranslateProgram(CFX_WideTextBuf& wsJavaScript);
-  CXFA_FMErrorInfo& GetError() { return m_pErrorInfo; }
-
- private:
-  CXFA_FMErrorInfo m_pErrorInfo;
-  CXFA_FMParse m_parse;
-  CXFA_FMFunctionDefinition* m_globalFunction;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_PROGRAM_H_
diff --git a/xfa/src/fxfa/fm2js/xfa_simpleexpression.cpp b/xfa/src/fxfa/fm2js/xfa_simpleexpression.cpp
deleted file mode 100644
index 376a8f7..0000000
--- a/xfa/src/fxfa/fm2js/xfa_simpleexpression.cpp
+++ /dev/null
@@ -1,745 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_simpleexpression.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-
-namespace {
-
-const CFX_WideStringC gs_lpStrExpFuncName[] = {
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime."),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"),
-    FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"),
-};
-
-struct XFA_FMBuildInFunc {
-  uint32_t m_uHash;
-  const FX_WCHAR* m_buildinfunc;
-};
-const XFA_FMBuildInFunc g_BuildInFuncs[] = {
-    {0x0001f1f5, L"At"},           {0x00020b9c, L"FV"},
-    {0x00021aef, L"If"},           {0x00023ee6, L"PV"},
-    {0x04b5c9ee, L"Encode"},       {0x08e96685, L"DateFmt"},
-    {0x09f99db6, L"Abs"},          {0x09f9e583, L"Apr"},
-    {0x09fa043e, L"Avg"},          {0x0a9782a0, L"Get"},
-    {0x0b1b09df, L"Len"},          {0x0b3543a6, L"Max"},
-    {0x0b356ca4, L"Min"},          {0x0b358b60, L"Mod"},
-    {0x0b4fded4, L"NPV"},          {0x0b846bf1, L"Pmt"},
-    {0x0b8494f9, L"Put"},          {0x0bb8df5d, L"Ref"},
-    {0x0bd37a99, L"Str"},          {0x0bd37fb5, L"Sum"},
-    {0x1048469b, L"Cterm"},        {0x11e03660, L"Exists"},
-    {0x126236e6, L"Post"},         {0x127c6661, L"PPmt"},
-    {0x193ade3e, L"Right"},        {0x1ec8ab2c, L"Rate"},
-    {0x20e476dc, L"IsoTime2Num"},  {0x23eb6816, L"TimeFmt"},
-    {0x24fb17b0, L"LocalDateFmt"}, {0x28dee6e9, L"Format"},
-    {0x2d0890b8, L"Term"},         {0x2d71b00f, L"Time"},
-    {0x2f890fb1, L"Num2Time"},     {0x3767511d, L"Ceil"},
-    {0x3ffd1941, L"LocalTimeFmt"}, {0x442f68c8, L"Round"},
-    {0x46fd1128, L"Eval"},         {0x4d629440, L"Date2Num"},
-    {0x4dcf25f8, L"Concat"},       {0x4e00255d, L"UnitValue"},
-    {0x55a5cc29, L"Lower"},        {0x5e43e04c, L"WordNum"},
-    {0x620ce6ba, L"Ipmt"},         {0x6f544d49, L"Count"},
-    {0x7e241013, L"Within"},       {0x9b9a6e2b, L"IsoDate2Num"},
-    {0xb2c941c2, L"UnitType"},     {0xb598a1f7, L"Uuid"},
-    {0xbde9abde, L"Date"},         {0xc0010b80, L"Num2Date"},
-    {0xc1f6144c, L"Upper"},        {0xc44028f7, L"Oneof"},
-    {0xc62c1b2c, L"Space"},        {0xd0ff50f9, L"HasValue"},
-    {0xd1537042, L"Floor"},        {0xd2ac9cf1, L"Time2Num"},
-    {0xd907aee5, L"Num2GMTime"},   {0xdf24f7c4, L"Decode"},
-    {0xe2664803, L"Substr"},       {0xe3e7b528, L"Stuff"},
-    {0xe6792d4e, L"Rtrim"},        {0xe8c23f5b, L"Parse"},
-    {0xea18d121, L"Choose"},       {0xebfef69c, L"Replace"},
-    {0xf5ad782b, L"Left"},         {0xf7bb2248, L"Ltrim"},
-};
-
-struct XFA_FMSOMMethod {
-  uint32_t m_uHash;
-  const FX_WCHAR* m_wsSomMethodName;
-  FX_DWORD m_dParameters;
-};
-const XFA_FMSOMMethod gs_FMSomMethods[] = {
-    {0x00000068, L"h", 0x01},
-    {0x00000077, L"w", 0x01},
-    {0x00000078, L"x", 0x01},
-    {0x00000079, L"y", 0x01},
-    {0x05eb5b0f, L"pageSpan", 0x01},
-    {0x10f1b1bd, L"page", 0x01},
-    {0x3bf1c2a5, L"absPageSpan", 0x01},
-    {0x3c752495, L"verify", 0x0d},
-    {0x44c352ad, L"formNodes", 0x01},
-    {0x5775c2cc, L"absPageInBatch", 0x01},
-    {0x5ee00996, L"setElement", 0x01},
-    {0x7033bfd5, L"insert", 0x03},
-    {0x8c5feb32, L"sheetInBatch", 0x01},
-    {0x8f3a8379, L"sheet", 0x01},
-    {0x92dada4f, L"saveFilteredXML", 0x01},
-    {0x9cab7cae, L"remove", 0x01},
-    {0xa68635f1, L"sign", 0x61},
-    {0xaac241c8, L"isRecordGroup", 0x01},
-    {0xd8ed1467, L"clear", 0x01},
-    {0xda12e518, L"append", 0x01},
-    {0xe74f0653, L"absPage", 0x01},
-};
-
-}  // namespace
-
-CFX_WideStringC XFA_FM_EXPTypeToString(
-    XFA_FM_SimpleExpressionType simpleExpType) {
-  return gs_lpStrExpFuncName[simpleExpType];
-}
-
-CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op)
-    : m_line(line), m_op(op) {}
-
-void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-
-void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
-
-XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const {
-  return m_op;
-}
-
-CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line)
-    : CXFA_FMSimpleExpression(line, TOKnull) {}
-
-void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"null");
-}
-
-CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line,
-                                                 CFX_WideStringC wsNumber)
-    : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {}
-
-void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << m_wsNumber;
-}
-
-CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line,
-                                                 CFX_WideStringC wsString)
-    : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {}
-
-void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  CFX_WideString tempStr = m_wsString;
-  if (tempStr.GetLength() > 2) {
-    javascript.AppendChar(L'\"');
-    FX_WCHAR oneChar;
-    for (int16_t i = 1; i < tempStr.GetLength() - 1; i++) {
-      oneChar = tempStr[i];
-      switch (oneChar) {
-        case L'\"': {
-          i++;
-          javascript << FX_WSTRC(L"\\\"");
-        } break;
-        case 0x0d:
-          break;
-        case 0x0a: {
-          javascript << FX_WSTRC(L"\\n");
-        } break;
-        default: { javascript.AppendChar(oneChar); } break;
-      }
-    }
-    javascript.AppendChar(L'\"');
-  } else {
-    javascript << tempStr;
-  }
-}
-
-CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn(
-    FX_DWORD line,
-    CFX_WideStringC wsIdentifier)
-    : CXFA_FMSimpleExpression(line, TOKidentifier),
-      m_wsIdentifier(wsIdentifier) {}
-
-void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) {
-  CFX_WideString tempStr = m_wsIdentifier;
-  if (tempStr.Equal(FX_WSTRC(L"$"))) {
-    tempStr = FX_WSTRC(L"this");
-  } else if (tempStr.Equal(FX_WSTRC(L"!"))) {
-    tempStr = FX_WSTRC(L"xfa.datasets");
-  } else if (tempStr.Equal(FX_WSTRC(L"$data"))) {
-    tempStr = FX_WSTRC(L"xfa.datasets.data");
-  } else if (tempStr.Equal(FX_WSTRC(L"$event"))) {
-    tempStr = FX_WSTRC(L"xfa.event");
-  } else if (tempStr.Equal(FX_WSTRC(L"$form"))) {
-    tempStr = FX_WSTRC(L"xfa.form");
-  } else if (tempStr.Equal(FX_WSTRC(L"$host"))) {
-    tempStr = FX_WSTRC(L"xfa.host");
-  } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) {
-    tempStr = FX_WSTRC(L"xfa.layout");
-  } else if (tempStr.Equal(FX_WSTRC(L"$template"))) {
-    tempStr = FX_WSTRC(L"xfa.template");
-  } else if (tempStr[0] == L'!') {
-    tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1);
-  }
-  javascript << tempStr;
-}
-
-CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line,
-                                               XFA_FM_TOKEN op,
-                                               CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
-
-void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-
-CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
-                                           XFA_FM_TOKEN op,
-                                           CXFA_FMSimpleExpression* pExp1,
-                                           CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
-
-void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-
-CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line,
-                                                 XFA_FM_TOKEN op,
-                                                 CXFA_FMSimpleExpression* pExp1,
-                                                 CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"if (");
-  javascript << gs_lpStrExpFuncName[ISFMOBJECT];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"))\n{\n");
-  javascript << gs_lpStrExpFuncName[ASSIGN];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L");\n}\n");
-  CFX_WideTextBuf tempExp1;
-  m_pExp1->ToJavaScript(tempExp1);
-  if (m_pExp1->GetOperatorToken() == TOKidentifier &&
-      tempExp1.GetWideString() != FX_WSTRC(L"this")) {
-    javascript << FX_WSTRC(L"else\n{\n");
-    javascript << tempExp1;
-    javascript << FX_WSTRC(L" = ");
-    javascript << gs_lpStrExpFuncName[ASSIGN];
-    javascript << FX_WSTRC(L"(");
-    m_pExp1->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L", ");
-    m_pExp2->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L");\n}\n");
-  }
-}
-
-void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"if (");
-  javascript << gs_lpStrExpFuncName[ISFMOBJECT];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L"))\n{\n");
-  javascript << RUNTIMEFUNCTIONRETURNVALUE;
-  javascript << FX_WSTRC(L" = ");
-  javascript << gs_lpStrExpFuncName[ASSIGN];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L");\n}\n");
-  CFX_WideTextBuf tempExp1;
-  m_pExp1->ToJavaScript(tempExp1);
-  if (m_pExp1->GetOperatorToken() == TOKidentifier &&
-      tempExp1.GetWideString() != FX_WSTRC(L"this")) {
-    javascript << FX_WSTRC(L"else\n{\n");
-    javascript << RUNTIMEFUNCTIONRETURNVALUE;
-    javascript << FX_WSTRC(L" = ");
-    javascript << tempExp1;
-    javascript << FX_WSTRC(L" = ");
-    javascript << gs_lpStrExpFuncName[ASSIGN];
-    javascript << FX_WSTRC(L"(");
-    m_pExp1->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L", ");
-    m_pExp2->ToJavaScript(javascript);
-    javascript << FX_WSTRC(L");\n}\n");
-  }
-}
-
-CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[LOGICALOR];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[LOGICALAND];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  switch (m_op) {
-    case TOKeq:
-    case TOKkseq:
-      javascript << gs_lpStrExpFuncName[EQUALITY];
-      break;
-    case TOKne:
-    case TOKksne:
-      javascript << gs_lpStrExpFuncName[NOTEQUALITY];
-      break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  switch (m_op) {
-    case TOKlt:
-    case TOKkslt:
-      javascript << gs_lpStrExpFuncName[LESS];
-      break;
-    case TOKgt:
-    case TOKksgt:
-      javascript << gs_lpStrExpFuncName[GREATER];
-      break;
-    case TOKle:
-    case TOKksle:
-      javascript << gs_lpStrExpFuncName[LESSEQUAL];
-      break;
-    case TOKge:
-    case TOKksge:
-      javascript << gs_lpStrExpFuncName[GREATEREQUAL];
-      break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  switch (m_op) {
-    case TOKplus:
-      javascript << gs_lpStrExpFuncName[PLUS];
-      break;
-    case TOKminus:
-      javascript << gs_lpStrExpFuncName[MINUS];
-      break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(
-    FX_DWORD line,
-    XFA_FM_TOKEN op,
-    CXFA_FMSimpleExpression* pExp1,
-    CXFA_FMSimpleExpression* pExp2)
-    : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-
-void CXFA_FMMultiplicativeExpression::ToJavaScript(
-    CFX_WideTextBuf& javascript) {
-  switch (m_op) {
-    case TOKmul:
-      javascript << gs_lpStrExpFuncName[MULTIPLE];
-      break;
-    case TOKdiv:
-      javascript << gs_lpStrExpFuncName[DIVIDE];
-      break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKplus, pExp) {}
-
-void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[POSITIVE];
-  javascript << FX_WSTRC(L"(");
-  m_pExp->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKminus, pExp) {}
-
-void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[NEGATIVE];
-  javascript << FX_WSTRC(L"(");
-  m_pExp->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line,
-                                           CXFA_FMSimpleExpression* pExp)
-    : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {}
-
-void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[NOT];
-  javascript << FX_WSTRC(L"(");
-  m_pExp->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line,
-                                             CXFA_FMSimpleExpression* pExp,
-                                             CFX_PtrArray* pArguments,
-                                             FX_BOOL bIsSomMethod)
-    : CXFA_FMUnaryExpression(line, TOKcall, pExp),
-      m_bIsSomMethod(bIsSomMethod),
-      m_pArguments(pArguments) {}
-
-CXFA_FMCallExpression::~CXFA_FMCallExpression() {
-  if (m_pArguments) {
-    for (int i = 0; i < m_pArguments->GetSize(); ++i) {
-      delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i));
-    }
-    m_pArguments->RemoveAll();
-    delete m_pArguments;
-  }
-}
-
-bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) {
-  uint32_t uHash = FX_HashCode_String_GetW(funcName->GetBuffer(),
-                                           funcName->GetLength(), TRUE);
-  const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs);
-  const XFA_FMBuildInFunc* pFunc =
-      std::lower_bound(g_BuildInFuncs, pEnd, uHash,
-                       [](const XFA_FMBuildInFunc& func, uint32_t hash) {
-                         return func.m_uHash < hash;
-                       });
-  if (pFunc < pEnd && uHash == pFunc->m_uHash) {
-    funcName->Clear();
-    *funcName << pFunc->m_buildinfunc;
-    return true;
-  }
-  return false;
-}
-
-FX_DWORD CXFA_FMCallExpression::IsMethodWithObjParam(
-    const CFX_WideStringC& methodName) {
-  int32_t iLength = methodName.GetLength();
-  uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength);
-  XFA_FMSOMMethod somMethodWithObjPara;
-  FX_DWORD parameters = 0x00;
-  int32_t iStart = 0,
-          iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1;
-  int32_t iMid = (iStart + iEnd) / 2;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    somMethodWithObjPara = gs_FMSomMethods[iMid];
-    if (uHash == somMethodWithObjPara.m_uHash) {
-      parameters = somMethodWithObjPara.m_dParameters;
-      break;
-    } else if (uHash < somMethodWithObjPara.m_uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return parameters;
-}
-
-void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  CFX_WideTextBuf funcName;
-  m_pExp->ToJavaScript(funcName);
-  if (m_bIsSomMethod) {
-    javascript << funcName;
-    javascript << FX_WSTRC(L"(");
-    if (m_pArguments) {
-      FX_DWORD methodPara = IsMethodWithObjParam(funcName.GetWideString());
-      if (methodPara > 0) {
-        for (int i = 0; i < m_pArguments->GetSize(); ++i) {
-          if ((methodPara & (0x01 << i)) > 0) {
-            javascript << gs_lpStrExpFuncName[GETFMJSOBJ];
-          } else {
-            javascript << gs_lpStrExpFuncName[GETFMVALUE];
-          }
-          javascript << FX_WSTRC(L"(");
-          CXFA_FMSimpleExpression* e =
-              reinterpret_cast<CXFA_FMSimpleExpression*>(
-                  m_pArguments->GetAt(i));
-          e->ToJavaScript(javascript);
-          javascript << FX_WSTRC(L")");
-          if (i + 1 < m_pArguments->GetSize()) {
-            javascript << FX_WSTRC(L", ");
-          }
-        }
-      } else {
-        for (int i = 0; i < m_pArguments->GetSize(); ++i) {
-          javascript << gs_lpStrExpFuncName[GETFMVALUE];
-          javascript << FX_WSTRC(L"(");
-          CXFA_FMSimpleExpression* e =
-              reinterpret_cast<CXFA_FMSimpleExpression*>(
-                  m_pArguments->GetAt(i));
-          e->ToJavaScript(javascript);
-          javascript << FX_WSTRC(L")");
-          if (i + 1 < m_pArguments->GetSize()) {
-            javascript << FX_WSTRC(L", ");
-          }
-        }
-      }
-    }
-    javascript << FX_WSTRC(L")");
-  } else {
-    bool isEvalFunc = false;
-    bool isExistsFunc = false;
-    if (IsBuildInFunc(&funcName)) {
-      if (funcName.GetWideString() == FX_WSTRC(L"Eval")) {
-        isEvalFunc = true;
-        javascript << FX_WSTRC(L"eval.call(this, ");
-        javascript << gs_lpStrExpFuncName[CALL];
-        javascript << FX_WSTRC(L"Translate");
-      } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) {
-        isExistsFunc = true;
-        javascript << gs_lpStrExpFuncName[CALL];
-        javascript << funcName;
-      } else {
-        javascript << gs_lpStrExpFuncName[CALL];
-        javascript << funcName;
-      }
-    } else {
-      javascript << funcName;
-    }
-    javascript << FX_WSTRC(L"(");
-    if (isExistsFunc) {
-      javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n");
-      if (m_pArguments && m_pArguments->GetSize() > 0) {
-        CXFA_FMSimpleExpression* e =
-            reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(0));
-        javascript << FX_WSTRC(L"return ");
-        e->ToJavaScript(javascript);
-        javascript << FX_WSTRC(L";\n}\n");
-      } else {
-        javascript << FX_WSTRC(L"return 0;\n}\n");
-      }
-      javascript << FX_WSTRC(
-          L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n");
-    } else if (m_pArguments) {
-      for (int i = 0; i < m_pArguments->GetSize(); ++i) {
-        CXFA_FMSimpleExpression* e =
-            reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i));
-        e->ToJavaScript(javascript);
-        if (i + 1 < m_pArguments->GetSize()) {
-          javascript << FX_WSTRC(L", ");
-        }
-      }
-    }
-    javascript << FX_WSTRC(L")");
-    if (isEvalFunc) {
-      javascript << FX_WSTRC(L")");
-    }
-  }
-}
-
-CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
-    FX_DWORD line,
-    CXFA_FMSimpleExpression* pAccessor,
-    XFA_FM_TOKEN op,
-    CFX_WideStringC wsIdentifier,
-    CXFA_FMSimpleExpression* pIndexExp)
-    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
-      m_wsIdentifier(wsIdentifier) {}
-
-void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[DOT];
-  javascript << FX_WSTRC(L"(");
-  if (m_pExp1) {
-    m_pExp1->ToJavaScript(javascript);
-  } else {
-    javascript << FX_WSTRC(L"null");
-  }
-  javascript << FX_WSTRC(L", ");
-  javascript << FX_WSTRC(L"\"");
-  if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
-    m_pExp1->ToJavaScript(javascript);
-  }
-  javascript << FX_WSTRC(L"\", ");
-  if (m_op == TOKdotscream) {
-    javascript << FX_WSTRC(L"\"#");
-    javascript << m_wsIdentifier;
-    javascript << FX_WSTRC(L"\", ");
-  } else if (m_op == TOKdotstar) {
-    javascript << FX_WSTRC(L"\"*\", ");
-  } else if (m_op == TOKcall) {
-    javascript << FX_WSTRC(L"\"\", ");
-  } else {
-    javascript << FX_WSTRC(L"\"");
-    javascript << m_wsIdentifier;
-    javascript << FX_WSTRC(L"\", ");
-  }
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMIndexExpression::CXFA_FMIndexExpression(
-    FX_DWORD line,
-    XFA_FM_AccessorIndex accessorIndex,
-    CXFA_FMSimpleExpression* pIndexExp,
-    FX_BOOL bIsStarIndex)
-    : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp),
-      m_accessorIndex(accessorIndex),
-      m_bIsStarIndex(bIsStarIndex) {}
-
-void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  switch (m_accessorIndex) {
-    case ACCESSOR_NO_INDEX:
-      javascript << FX_WSTRC(L"0");
-      break;
-    case ACCESSOR_NO_RELATIVEINDEX:
-      javascript << FX_WSTRC(L"1");
-      break;
-    case ACCESSOR_POSITIVE_INDEX:
-      javascript << FX_WSTRC(L"2");
-      break;
-    case ACCESSOR_NEGATIVE_INDEX:
-      javascript << FX_WSTRC(L"3");
-      break;
-    default:
-      javascript << FX_WSTRC(L"0");
-  }
-  if (!m_bIsStarIndex) {
-    javascript << FX_WSTRC(L", ");
-    if (m_pExp) {
-      m_pExp->ToJavaScript(javascript);
-    } else {
-      javascript << FX_WSTRC(L"0");
-    }
-  }
-}
-
-CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
-    FX_DWORD line,
-    CXFA_FMSimpleExpression* pAccessor,
-    XFA_FM_TOKEN op,
-    CFX_WideStringC wsIdentifier,
-    CXFA_FMSimpleExpression* pIndexExp)
-    : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
-      m_wsIdentifier(wsIdentifier) {}
-
-void CXFA_FMDotDotAccessorExpression::ToJavaScript(
-    CFX_WideTextBuf& javascript) {
-  javascript << gs_lpStrExpFuncName[DOTDOT];
-  javascript << FX_WSTRC(L"(");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L", ");
-  javascript << FX_WSTRC(L"\"");
-  if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
-    m_pExp1->ToJavaScript(javascript);
-  }
-  javascript << FX_WSTRC(L"\", ");
-  javascript << FX_WSTRC(L"\"");
-  javascript << m_wsIdentifier;
-  javascript << FX_WSTRC(L"\", ");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L")");
-}
-
-CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
-    FX_DWORD line,
-    CXFA_FMSimpleExpression* pAccessorExp1,
-    CXFA_FMSimpleExpression* pCallExp)
-    : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {}
-
-void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
-  javascript << FX_WSTRC(L"(\nfunction ()\n{\n");
-  javascript << FX_WSTRC(L"var method_return_value = null;\n");
-  javascript << FX_WSTRC(L"var accessor_object = ");
-  m_pExp1->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L";\n");
-  javascript << FX_WSTRC(L"if (");
-  javascript << gs_lpStrExpFuncName[ISFMARRAY];
-  javascript << FX_WSTRC(L"(accessor_object))\n{\n");
-  javascript << FX_WSTRC(
-      L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n");
-  javascript << FX_WSTRC(L"method_return_value = accessor_object[index].");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L";\n}\n}\n");
-  javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object.");
-  m_pExp2->ToJavaScript(javascript);
-  javascript << FX_WSTRC(L";\n}\n");
-  javascript << FX_WSTRC(L"return method_return_value;\n");
-  javascript << FX_WSTRC(L"}\n).call(this)");
-}
diff --git a/xfa/src/fxfa/fm2js/xfa_simpleexpression.h b/xfa/src/fxfa/fm2js/xfa_simpleexpression.h
deleted file mode 100644
index 152fe3d..0000000
--- a/xfa/src/fxfa/fm2js/xfa_simpleexpression.h
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
-#define XFA_SRC_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
-
-#include <memory>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxfa/fm2js/xfa_lexer.h"
-
-#define RUNTIMEFUNCTIONRETURNVALUE \
-  (FX_WSTRC(L"foxit_xfa_formcalc_runtime_func_return_value"))
-#define EXCLAMATION_IN_IDENTIFIER \
-  (FX_WSTRC(L"foxit_xfa_formcalc__exclamation__"))
-
-enum XFA_FM_SimpleExpressionType {
-  ASSIGN,
-  LOGICALOR,
-  LOGICALAND,
-  EQUALITY,
-  NOTEQUALITY,
-  LESS,
-  LESSEQUAL,
-  GREATER,
-  GREATEREQUAL,
-  PLUS,
-  MINUS,
-  MULTIPLE,
-  DIVIDE,
-  POSITIVE,
-  NEGATIVE,
-  NOT,
-  CALL,
-  DOT,
-  DOTDOT,
-  CONCATFMOBJECT,
-  ISFMOBJECT,
-  ISFMARRAY,
-  GETFMVALUE,
-  GETFMJSOBJ,
-  VARFILTER
-};
-
-CFX_WideStringC XFA_FM_EXPTypeToString(
-    XFA_FM_SimpleExpressionType simpleExpType);
-
-enum XFA_FM_AccessorIndex {
-  ACCESSOR_NO_INDEX,
-  ACCESSOR_NO_RELATIVEINDEX,
-  ACCESSOR_POSITIVE_INDEX,
-  ACCESSOR_NEGATIVE_INDEX
-};
-
-class CXFA_FMSimpleExpression {
- public:
-  CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op);
-  virtual ~CXFA_FMSimpleExpression() {}
-  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
-  virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
-
-  XFA_FM_TOKEN GetOperatorToken() const;
-
- protected:
-  FX_DWORD m_line;
-  XFA_FM_TOKEN m_op;
-};
-
-class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
- public:
-  explicit CXFA_FMNullExpression(FX_DWORD line);
-  ~CXFA_FMNullExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
- public:
-  CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber);
-  ~CXFA_FMNumberExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  CFX_WideStringC m_wsNumber;
-};
-
-class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
- public:
-  CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString);
-  ~CXFA_FMStringExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  CFX_WideStringC m_wsString;
-};
-
-class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression {
- public:
-  CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier);
-  ~CXFA_FMIdentifierExpressionn() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  CFX_WideStringC m_wsIdentifier;
-};
-
-class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
- public:
-  CXFA_FMUnaryExpression(FX_DWORD line,
-                         XFA_FM_TOKEN op,
-                         CXFA_FMSimpleExpression* pExp);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- protected:
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
-};
-
-class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
- public:
-  CXFA_FMBinExpression(FX_DWORD line,
-                       XFA_FM_TOKEN op,
-                       CXFA_FMSimpleExpression* pExp1,
-                       CXFA_FMSimpleExpression* pExp2);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- protected:
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
-  std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
-};
-
-class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMAssignExpression(FX_DWORD line,
-                          XFA_FM_TOKEN op,
-                          CXFA_FMSimpleExpression* pExp1,
-                          CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMAssignExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-  void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMLogicalOrExpression(FX_DWORD line,
-                             XFA_FM_TOKEN op,
-                             CXFA_FMSimpleExpression* pExp1,
-                             CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMLogicalOrExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMLogicalAndExpression(FX_DWORD line,
-                              XFA_FM_TOKEN op,
-                              CXFA_FMSimpleExpression* pExp1,
-                              CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMLogicalAndExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMEqualityExpression(FX_DWORD line,
-                            XFA_FM_TOKEN op,
-                            CXFA_FMSimpleExpression* pExp1,
-                            CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMEqualityExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMRelationalExpression(FX_DWORD line,
-                              XFA_FM_TOKEN op,
-                              CXFA_FMSimpleExpression* pExp1,
-                              CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMRelationalExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMAdditiveExpression(FX_DWORD line,
-                            XFA_FM_TOKEN op,
-                            CXFA_FMSimpleExpression* pExp1,
-                            CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMAdditiveExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMMultiplicativeExpression(FX_DWORD line,
-                                  XFA_FM_TOKEN op,
-                                  CXFA_FMSimpleExpression* pExp1,
-                                  CXFA_FMSimpleExpression* pExp2);
-  ~CXFA_FMMultiplicativeExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
- public:
-  CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
-  ~CXFA_FMPosExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
- public:
-  CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
-  ~CXFA_FMNegExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
- public:
-  CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
-  ~CXFA_FMNotExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
- public:
-  CXFA_FMCallExpression(FX_DWORD line,
-                        CXFA_FMSimpleExpression* pExp,
-                        CFX_PtrArray* pArguments,
-                        FX_BOOL bIsSomMethod);
-  ~CXFA_FMCallExpression() override;
-  bool IsBuildInFunc(CFX_WideTextBuf* funcName);
-  FX_DWORD IsMethodWithObjParam(const CFX_WideStringC& methodName);
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  FX_BOOL m_bIsSomMethod;
-  CFX_PtrArray* m_pArguments;
-};
-
-class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMDotAccessorExpression(FX_DWORD line,
-                               CXFA_FMSimpleExpression* pAccessor,
-                               XFA_FM_TOKEN op,
-                               CFX_WideStringC wsIdentifier,
-                               CXFA_FMSimpleExpression* pIndexExp);
-  ~CXFA_FMDotAccessorExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  CFX_WideStringC m_wsIdentifier;
-};
-
-class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
- public:
-  CXFA_FMIndexExpression(FX_DWORD line,
-                         XFA_FM_AccessorIndex accessorIndex,
-                         CXFA_FMSimpleExpression* pIndexExp,
-                         FX_BOOL bIsStarIndex);
-  ~CXFA_FMIndexExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  XFA_FM_AccessorIndex m_accessorIndex;
-  FX_BOOL m_bIsStarIndex;
-};
-
-class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMDotDotAccessorExpression(FX_DWORD line,
-                                  CXFA_FMSimpleExpression* pAccessor,
-                                  XFA_FM_TOKEN op,
-                                  CFX_WideStringC wsIdentifier,
-                                  CXFA_FMSimpleExpression* pIndexExp);
-  ~CXFA_FMDotDotAccessorExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-
- private:
-  CFX_WideStringC m_wsIdentifier;
-};
-
-class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
- public:
-  CXFA_FMMethodCallExpression(FX_DWORD line,
-                              CXFA_FMSimpleExpression* pAccessorExp1,
-                              CXFA_FMSimpleExpression* pCallExp);
-  ~CXFA_FMMethodCallExpression() override {}
-  void ToJavaScript(CFX_WideTextBuf& javascript) override;
-};
-
-#endif  // XFA_SRC_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
diff --git a/xfa/src/fxfa/parser/xfa_basic_data.cpp b/xfa/src/fxfa/parser/xfa_basic_data.cpp
deleted file mode 100644
index 418ebf3..0000000
--- a/xfa/src/fxfa/parser/xfa_basic_data.cpp
+++ /dev/null
@@ -1,7333 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_basic_data.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_script_datawindow.h"
-#include "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_logpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[] = {
-    {0x2a, L"*", XFA_ATTRIBUTEENUM_Asterisk},
-    {0x2f, L"/", XFA_ATTRIBUTEENUM_Slash},
-    {0x5c, L"\\", XFA_ATTRIBUTEENUM_Backslash},
-    {0x239bd, L"on", XFA_ATTRIBUTEENUM_On},
-    {0x25356, L"tb", XFA_ATTRIBUTEENUM_Tb},
-    {0x25885, L"up", XFA_ATTRIBUTEENUM_Up},
-    {0x91b281, L"metaData", XFA_ATTRIBUTEENUM_MetaData},
-    {0x1f8dedb, L"delegate", XFA_ATTRIBUTEENUM_Delegate},
-    {0x2a6c55a, L"postSubmit", XFA_ATTRIBUTEENUM_PostSubmit},
-    {0x31b19c1, L"name", XFA_ATTRIBUTEENUM_Name},
-    {0x378a38a, L"cross", XFA_ATTRIBUTEENUM_Cross},
-    {0x3848b3f, L"next", XFA_ATTRIBUTEENUM_Next},
-    {0x48b6670, L"none", XFA_ATTRIBUTEENUM_None},
-    {0x51aafe5, L"shortEdge", XFA_ATTRIBUTEENUM_ShortEdge},
-    {0x55264c4, L"1mod10_1mod11", XFA_ATTRIBUTEENUM_1mod10_1mod11},
-    {0x5a5c519, L"height", XFA_ATTRIBUTEENUM_Height},
-    {0x89ce549, L"crossDiagonal", XFA_ATTRIBUTEENUM_CrossDiagonal},
-    {0x9f9d0f9, L"all", XFA_ATTRIBUTEENUM_All},
-    {0x9f9db48, L"any", XFA_ATTRIBUTEENUM_Any},
-    {0xa126261, L"toRight", XFA_ATTRIBUTEENUM_ToRight},
-    {0xa36de29, L"matchTemplate", XFA_ATTRIBUTEENUM_MatchTemplate},
-    {0xa48d040, L"dpl", XFA_ATTRIBUTEENUM_Dpl},
-    {0xa559c05, L"invisible", XFA_ATTRIBUTEENUM_Invisible},
-    {0xa7d48e3, L"fit", XFA_ATTRIBUTEENUM_Fit},
-    {0xa8a8f80, L"width", XFA_ATTRIBUTEENUM_Width},
-    {0xab466bb, L"preSubmit", XFA_ATTRIBUTEENUM_PreSubmit},
-    {0xacc5785, L"ipl", XFA_ATTRIBUTEENUM_Ipl},
-    {0xafab0f8, L"flateCompress", XFA_ATTRIBUTEENUM_FlateCompress},
-    {0xb355816, L"med", XFA_ATTRIBUTEENUM_Med},
-    {0xb69ef77, L"odd", XFA_ATTRIBUTEENUM_Odd},
-    {0xb69f9bb, L"off", XFA_ATTRIBUTEENUM_Off},
-    {0xb843dba, L"pdf", XFA_ATTRIBUTEENUM_Pdf},
-    {0xbb912b8, L"row", XFA_ATTRIBUTEENUM_Row},
-    {0xbedaf33, L"top", XFA_ATTRIBUTEENUM_Top},
-    {0xc56afcc, L"xdp", XFA_ATTRIBUTEENUM_Xdp},
-    {0xc56ba02, L"xfd", XFA_ATTRIBUTEENUM_Xfd},
-    {0xc56ddf1, L"xml", XFA_ATTRIBUTEENUM_Xml},
-    {0xc8b65f3, L"zip", XFA_ATTRIBUTEENUM_Zip},
-    {0xc8b89d6, L"zpl", XFA_ATTRIBUTEENUM_Zpl},
-    {0xf55d7ee, L"visible", XFA_ATTRIBUTEENUM_Visible},
-    {0xfe3596a, L"exclude", XFA_ATTRIBUTEENUM_Exclude},
-    {0x109d7ce7, L"mouseEnter", XFA_ATTRIBUTEENUM_MouseEnter},
-    {0x10f1bc0c, L"pair", XFA_ATTRIBUTEENUM_Pair},
-    {0x1154efe6, L"filter", XFA_ATTRIBUTEENUM_Filter},
-    {0x125bc94b, L"moveLast", XFA_ATTRIBUTEENUM_MoveLast},
-    {0x12e1f1f0, L"exportAndImport", XFA_ATTRIBUTEENUM_ExportAndImport},
-    {0x13000c60, L"push", XFA_ATTRIBUTEENUM_Push},
-    {0x138ee315, L"portrait", XFA_ATTRIBUTEENUM_Portrait},
-    {0x14da2125, L"default", XFA_ATTRIBUTEENUM_Default},
-    {0x157749a5, L"storedProc", XFA_ATTRIBUTEENUM_StoredProc},
-    {0x16641198, L"stayBOF", XFA_ATTRIBUTEENUM_StayBOF},
-    {0x16b2fc5b, L"stayEOF", XFA_ATTRIBUTEENUM_StayEOF},
-    {0x17fad373, L"postPrint", XFA_ATTRIBUTEENUM_PostPrint},
-    {0x193207d0, L"usCarrier", XFA_ATTRIBUTEENUM_UsCarrier},
-    {0x193ade3e, L"right", XFA_ATTRIBUTEENUM_Right},
-    {0x1bfc72d9, L"preOpen", XFA_ATTRIBUTEENUM_PreOpen},
-    {0x1cc9317a, L"actual", XFA_ATTRIBUTEENUM_Actual},
-    {0x1f31df1e, L"rest", XFA_ATTRIBUTEENUM_Rest},
-    {0x1fb1bf14, L"topCenter", XFA_ATTRIBUTEENUM_TopCenter},
-    {0x207de667, L"standardSymbol", XFA_ATTRIBUTEENUM_StandardSymbol},
-    {0x2196a452, L"initialize", XFA_ATTRIBUTEENUM_Initialize},
-    {0x23bd40c7, L"justifyAll", XFA_ATTRIBUTEENUM_JustifyAll},
-    {0x247cf3e9, L"normal", XFA_ATTRIBUTEENUM_Normal},
-    {0x25aa946b, L"landscape", XFA_ATTRIBUTEENUM_Landscape},
-    {0x2739b5c9, L"nonInteractive", XFA_ATTRIBUTEENUM_NonInteractive},
-    {0x27410f03, L"mouseExit", XFA_ATTRIBUTEENUM_MouseExit},
-    {0x2854e62c, L"minus", XFA_ATTRIBUTEENUM_Minus},
-    {0x287e936a, L"diagonalLeft", XFA_ATTRIBUTEENUM_DiagonalLeft},
-    {0x2972a98f, L"simplexPaginated", XFA_ATTRIBUTEENUM_SimplexPaginated},
-    {0x29d8225f, L"document", XFA_ATTRIBUTEENUM_Document},
-    {0x2a9d3016, L"warning", XFA_ATTRIBUTEENUM_Warning},
-    {0x2b35b6d9, L"auto", XFA_ATTRIBUTEENUM_Auto},
-    {0x2c1653d9, L"below", XFA_ATTRIBUTEENUM_Below},
-    {0x2c1f0540, L"bottomLeft", XFA_ATTRIBUTEENUM_BottomLeft},
-    {0x2c44e816, L"bottomCenter", XFA_ATTRIBUTEENUM_BottomCenter},
-    {0x2cd3e9f3, L"tcpl", XFA_ATTRIBUTEENUM_Tcpl},
-    {0x2d08af85, L"text", XFA_ATTRIBUTEENUM_Text},
-    {0x2dc478eb, L"grouping", XFA_ATTRIBUTEENUM_Grouping},
-    {0x2ef3afdd, L"secureSymbol", XFA_ATTRIBUTEENUM_SecureSymbol},
-    {0x2f2dd29a, L"preExecute", XFA_ATTRIBUTEENUM_PreExecute},
-    {0x33c43dec, L"docClose", XFA_ATTRIBUTEENUM_DocClose},
-    {0x33f25bb5, L"keyset", XFA_ATTRIBUTEENUM_Keyset},
-    {0x34e363da, L"vertical", XFA_ATTRIBUTEENUM_Vertical},
-    {0x361fa1b6, L"preSave", XFA_ATTRIBUTEENUM_PreSave},
-    {0x36f1c6d8, L"preSign", XFA_ATTRIBUTEENUM_PreSign},
-    {0x399f02b5, L"bottom", XFA_ATTRIBUTEENUM_Bottom},
-    {0x3b0ab096, L"toTop", XFA_ATTRIBUTEENUM_ToTop},
-    {0x3c752495, L"verify", XFA_ATTRIBUTEENUM_Verify},
-    {0x3ce05d68, L"first", XFA_ATTRIBUTEENUM_First},
-    {0x3ecead94, L"contentArea", XFA_ATTRIBUTEENUM_ContentArea},
-    {0x40623b5b, L"solid", XFA_ATTRIBUTEENUM_Solid},
-    {0x42c6cd8d, L"pessimistic", XFA_ATTRIBUTEENUM_Pessimistic},
-    {0x43ddc6bf, L"duplexPaginated", XFA_ATTRIBUTEENUM_DuplexPaginated},
-    {0x442f68c8, L"round", XFA_ATTRIBUTEENUM_Round},
-    {0x45efb847, L"remerge", XFA_ATTRIBUTEENUM_Remerge},
-    {0x46972265, L"ordered", XFA_ATTRIBUTEENUM_Ordered},
-    {0x46f95531, L"percent", XFA_ATTRIBUTEENUM_Percent},
-    {0x46fd25ae, L"even", XFA_ATTRIBUTEENUM_Even},
-    {0x4731d6ba, L"exit", XFA_ATTRIBUTEENUM_Exit},
-    {0x4977356b, L"toolTip", XFA_ATTRIBUTEENUM_ToolTip},
-    {0x49b980ee, L"orderedOccurrence", XFA_ATTRIBUTEENUM_OrderedOccurrence},
-    {0x4a7e2dfe, L"readOnly", XFA_ATTRIBUTEENUM_ReadOnly},
-    {0x4c4e8acb, L"currency", XFA_ATTRIBUTEENUM_Currency},
-    {0x4dcf25f8, L"concat", XFA_ATTRIBUTEENUM_Concat},
-    {0x4febb826, L"Thai", XFA_ATTRIBUTEENUM_Thai},
-    {0x50ef95b2, L"embossed", XFA_ATTRIBUTEENUM_Embossed},
-    {0x516e35ce, L"formdata", XFA_ATTRIBUTEENUM_Formdata},
-    {0x52fa6f0e, L"Greek", XFA_ATTRIBUTEENUM_Greek},
-    {0x54034c2f, L"decimal", XFA_ATTRIBUTEENUM_Decimal},
-    {0x542c7300, L"select", XFA_ATTRIBUTEENUM_Select},
-    {0x551f0ae5, L"longEdge", XFA_ATTRIBUTEENUM_LongEdge},
-    {0x55520a8a, L"protected", XFA_ATTRIBUTEENUM_Protected},
-    {0x559f76f3, L"bottomRight", XFA_ATTRIBUTEENUM_BottomRight},
-    {0x568cb500, L"zero", XFA_ATTRIBUTEENUM_Zero},
-    {0x56bcecb7, L"forwardOnly", XFA_ATTRIBUTEENUM_ForwardOnly},
-    {0x56bf456b, L"docReady", XFA_ATTRIBUTEENUM_DocReady},
-    {0x573cb40c, L"hidden", XFA_ATTRIBUTEENUM_Hidden},
-    {0x582e3424, L"include", XFA_ATTRIBUTEENUM_Include},
-    {0x58a3dd29, L"dashed", XFA_ATTRIBUTEENUM_Dashed},
-    {0x5955b22b, L"multiSelect", XFA_ATTRIBUTEENUM_MultiSelect},
-    {0x598d5c53, L"inactive", XFA_ATTRIBUTEENUM_Inactive},
-    {0x59c8f27d, L"embed", XFA_ATTRIBUTEENUM_Embed},
-    {0x5e7555e8, L"static", XFA_ATTRIBUTEENUM_Static},
-    {0x606d4def, L"onEntry", XFA_ATTRIBUTEENUM_OnEntry},
-    {0x6195eafb, L"Cyrillic", XFA_ATTRIBUTEENUM_Cyrillic},
-    {0x6491b0f3, L"nonBlank", XFA_ATTRIBUTEENUM_NonBlank},
-    {0x67bef031, L"topRight", XFA_ATTRIBUTEENUM_TopRight},
-    {0x67df5ebd, L"Hebrew", XFA_ATTRIBUTEENUM_Hebrew},
-    {0x6aea98be, L"topLeft", XFA_ATTRIBUTEENUM_TopLeft},
-    {0x6c51afc1, L"center", XFA_ATTRIBUTEENUM_Center},
-    {0x7145e6bf, L"moveFirst", XFA_ATTRIBUTEENUM_MoveFirst},
-    {0x7375465c, L"diamond", XFA_ATTRIBUTEENUM_Diamond},
-    {0x7461aef4, L"pageOdd", XFA_ATTRIBUTEENUM_PageOdd},
-    {0x75f8aeb2, L"1mod10", XFA_ATTRIBUTEENUM_1mod10},
-    {0x76d708e0, L"Korean", XFA_ATTRIBUTEENUM_Korean},
-    {0x789f14d7, L"aboveEmbedded", XFA_ATTRIBUTEENUM_AboveEmbedded},
-    {0x792ea39f, L"zipCompress", XFA_ATTRIBUTEENUM_ZipCompress},
-    {0x7a5b7193, L"numeric", XFA_ATTRIBUTEENUM_Numeric},
-    {0x7abec0d2, L"circle", XFA_ATTRIBUTEENUM_Circle},
-    {0x7afbba38, L"toBottom", XFA_ATTRIBUTEENUM_ToBottom},
-    {0x7b95e661, L"inverted", XFA_ATTRIBUTEENUM_Inverted},
-    {0x7baca2e3, L"update", XFA_ATTRIBUTEENUM_Update},
-    {0x7eb5da2c, L"isoname", XFA_ATTRIBUTEENUM_Isoname},
-    {0x7f6fd3d7, L"server", XFA_ATTRIBUTEENUM_Server},
-    {0x814f82b5, L"position", XFA_ATTRIBUTEENUM_Position},
-    {0x82deacf0, L"middleCenter", XFA_ATTRIBUTEENUM_MiddleCenter},
-    {0x83a49dc6, L"optional", XFA_ATTRIBUTEENUM_Optional},
-    {0x861a116f, L"usePrinterSetting", XFA_ATTRIBUTEENUM_UsePrinterSetting},
-    {0x86701ce0, L"outline", XFA_ATTRIBUTEENUM_Outline},
-    {0x8808385e, L"indexChange", XFA_ATTRIBUTEENUM_IndexChange},
-    {0x891f4606, L"change", XFA_ATTRIBUTEENUM_Change},
-    {0x89939f36, L"pageArea", XFA_ATTRIBUTEENUM_PageArea},
-    {0x8b5c3b25, L"once", XFA_ATTRIBUTEENUM_Once},
-    {0x8b5c6962, L"only", XFA_ATTRIBUTEENUM_Only},
-    {0x8b90e1f2, L"open", XFA_ATTRIBUTEENUM_Open},
-    {0x8bcfe96e, L"caption", XFA_ATTRIBUTEENUM_Caption},
-    {0x8ce83ef8, L"raised", XFA_ATTRIBUTEENUM_Raised},
-    {0x8d269cae, L"justify", XFA_ATTRIBUTEENUM_Justify},
-    {0x8fd520dc, L"refAndDescendants", XFA_ATTRIBUTEENUM_RefAndDescendants},
-    {0x9041d4b0, L"short", XFA_ATTRIBUTEENUM_Short},
-    {0x90c94426, L"pageFront", XFA_ATTRIBUTEENUM_PageFront},
-    {0x936beee5, L"monospace", XFA_ATTRIBUTEENUM_Monospace},
-    {0x947fa00f, L"middle", XFA_ATTRIBUTEENUM_Middle},
-    {0x9528a7b4, L"prePrint", XFA_ATTRIBUTEENUM_PrePrint},
-    {0x959ab231, L"always", XFA_ATTRIBUTEENUM_Always},
-    {0x96d61bf0, L"unknown", XFA_ATTRIBUTEENUM_Unknown},
-    {0x997194ee, L"toLeft", XFA_ATTRIBUTEENUM_ToLeft},
-    {0x9a83a3cd, L"above", XFA_ATTRIBUTEENUM_Above},
-    {0x9d0d71c7, L"dashDot", XFA_ATTRIBUTEENUM_DashDot},
-    {0x9df56f3e, L"gregorian", XFA_ATTRIBUTEENUM_Gregorian},
-    {0x9f6723fd, L"Roman", XFA_ATTRIBUTEENUM_Roman},
-    {0x9f693b21, L"mouseDown", XFA_ATTRIBUTEENUM_MouseDown},
-    {0xa1429b36, L"symbol", XFA_ATTRIBUTEENUM_Symbol},
-    {0xa5aa45cb, L"pageEven", XFA_ATTRIBUTEENUM_PageEven},
-    {0xa68635f1, L"sign", XFA_ATTRIBUTEENUM_Sign},
-    {0xa7315093, L"addNew", XFA_ATTRIBUTEENUM_AddNew},
-    {0xa7a773fa, L"star", XFA_ATTRIBUTEENUM_Star},
-    {0xa7d57b45, L"optimistic", XFA_ATTRIBUTEENUM_Optimistic},
-    {0xa8077321, L"rl-tb", XFA_ATTRIBUTEENUM_Rl_tb},
-    {0xa8f1468d, L"middleRight", XFA_ATTRIBUTEENUM_MiddleRight},
-    {0xaa84a1f1, L"maintain", XFA_ATTRIBUTEENUM_Maintain},
-    {0xab40b12c, L"package", XFA_ATTRIBUTEENUM_Package},
-    {0xac8b4d85, L"SimplifiedChinese", XFA_ATTRIBUTEENUM_SimplifiedChinese},
-    {0xadae6744, L"toCenter", XFA_ATTRIBUTEENUM_ToCenter},
-    {0xb0129df1, L"back", XFA_ATTRIBUTEENUM_Back},
-    {0xb0f088cf, L"unspecified", XFA_ATTRIBUTEENUM_Unspecified},
-    {0xb1271067, L"batchOptimistic", XFA_ATTRIBUTEENUM_BatchOptimistic},
-    {0xb18313a1, L"bold", XFA_ATTRIBUTEENUM_Bold},
-    {0xb1833cad, L"both", XFA_ATTRIBUTEENUM_Both},
-    {0xb221123f, L"butt", XFA_ATTRIBUTEENUM_Butt},
-    {0xb40c36bf, L"client", XFA_ATTRIBUTEENUM_Client},
-    {0xb56c7053, L"2mod10", XFA_ATTRIBUTEENUM_2mod10},
-    {0xb683a345, L"imageOnly", XFA_ATTRIBUTEENUM_ImageOnly},
-    {0xb7732dea, L"horizontal", XFA_ATTRIBUTEENUM_Horizontal},
-    {0xb88652a4, L"dotted", XFA_ATTRIBUTEENUM_Dotted},
-    {0xbb2f2880, L"userControl", XFA_ATTRIBUTEENUM_UserControl},
-    {0xbbb79c5d, L"diagonalRight", XFA_ATTRIBUTEENUM_DiagonalRight},
-    {0xbd077154, L"consumeData", XFA_ATTRIBUTEENUM_ConsumeData},
-    {0xbd3fb11e, L"check", XFA_ATTRIBUTEENUM_Check},
-    {0xbde9abda, L"data", XFA_ATTRIBUTEENUM_Data},
-    {0xbf5a02d8, L"down", XFA_ATTRIBUTEENUM_Down},
-    {0xbf7450ee, L"sansSerif", XFA_ATTRIBUTEENUM_SansSerif},
-    {0xc02d649f, L"inline", XFA_ATTRIBUTEENUM_Inline},
-    {0xc11a9e3a, L"TraditionalChinese", XFA_ATTRIBUTEENUM_TraditionalChinese},
-    {0xc16169d8, L"warn", XFA_ATTRIBUTEENUM_Warn},
-    {0xc16f071f, L"refOnly", XFA_ATTRIBUTEENUM_RefOnly},
-    {0xc27c8ba5, L"interactiveForms", XFA_ATTRIBUTEENUM_InteractiveForms},
-    {0xc2d1b15c, L"word", XFA_ATTRIBUTEENUM_Word},
-    {0xc3621288, L"unordered", XFA_ATTRIBUTEENUM_Unordered},
-    {0xc5251981, L"required", XFA_ATTRIBUTEENUM_Required},
-    {0xc7088e7d, L"importOnly", XFA_ATTRIBUTEENUM_ImportOnly},
-    {0xc72cf0e3, L"belowEmbedded", XFA_ATTRIBUTEENUM_BelowEmbedded},
-    {0xc819cf07, L"Japanese", XFA_ATTRIBUTEENUM_Japanese},
-    {0xcdce56b3, L"full", XFA_ATTRIBUTEENUM_Full},
-    {0xce0122e3, L"rl-row", XFA_ATTRIBUTEENUM_Rl_row},
-    {0xcf7d71f1, L"Vietnamese", XFA_ATTRIBUTEENUM_Vietnamese},
-    {0xcfde3e09, L"EastEuropeanRoman", XFA_ATTRIBUTEENUM_EastEuropeanRoman},
-    {0xd576d08e, L"mouseUp", XFA_ATTRIBUTEENUM_MouseUp},
-    {0xd7a92904, L"exportOnly", XFA_ATTRIBUTEENUM_ExportOnly},
-    {0xd8ed1467, L"clear", XFA_ATTRIBUTEENUM_Clear},
-    {0xd95657a6, L"click", XFA_ATTRIBUTEENUM_Click},
-    {0xd96c7de5, L"base64", XFA_ATTRIBUTEENUM_Base64},
-    {0xd9f47f36, L"close", XFA_ATTRIBUTEENUM_Close},
-    {0xdb075bde, L"host", XFA_ATTRIBUTEENUM_Host},
-    {0xdb103411, L"global", XFA_ATTRIBUTEENUM_Global},
-    {0xdb647188, L"blank", XFA_ATTRIBUTEENUM_Blank},
-    {0xdb9be968, L"table", XFA_ATTRIBUTEENUM_Table},
-    {0xdf590fbb, L"import", XFA_ATTRIBUTEENUM_Import},
-    {0xe0e573fb, L"custom", XFA_ATTRIBUTEENUM_Custom},
-    {0xe0ecc79a, L"middleLeft", XFA_ATTRIBUTEENUM_MiddleLeft},
-    {0xe1452019, L"postExecute", XFA_ATTRIBUTEENUM_PostExecute},
-    {0xe1911d98, L"radix", XFA_ATTRIBUTEENUM_Radix},
-    {0xe25fa7b8, L"postOpen", XFA_ATTRIBUTEENUM_PostOpen},
-    {0xe28dce7e, L"enter", XFA_ATTRIBUTEENUM_Enter},
-    {0xe2c44de4, L"ignore", XFA_ATTRIBUTEENUM_Ignore},
-    {0xe2cd8c61, L"lr-tb", XFA_ATTRIBUTEENUM_Lr_tb},
-    {0xe2da8336, L"fantasy", XFA_ATTRIBUTEENUM_Fantasy},
-    {0xe31d5396, L"italic", XFA_ATTRIBUTEENUM_Italic},
-    {0xe7ada113, L"author", XFA_ATTRIBUTEENUM_Author},
-    {0xe8e7cc18, L"toEdge", XFA_ATTRIBUTEENUM_ToEdge},
-    {0xe97aa98b, L"choice", XFA_ATTRIBUTEENUM_Choice},
-    {0xeafd2a38, L"disabled", XFA_ATTRIBUTEENUM_Disabled},
-    {0xeb2b7972, L"crossHatch", XFA_ATTRIBUTEENUM_CrossHatch},
-    {0xeb2db2d7, L"dataRef", XFA_ATTRIBUTEENUM_DataRef},
-    {0xec35dc6e, L"dashDotDot", XFA_ATTRIBUTEENUM_DashDotDot},
-    {0xef85d351, L"square", XFA_ATTRIBUTEENUM_Square},
-    {0xf2102445, L"dynamic", XFA_ATTRIBUTEENUM_Dynamic},
-    {0xf272c7be, L"manual", XFA_ATTRIBUTEENUM_Manual},
-    {0xf2bbb64d, L"etched", XFA_ATTRIBUTEENUM_Etched},
-    {0xf3b8fc6c, L"validationState", XFA_ATTRIBUTEENUM_ValidationState},
-    {0xf42f2b81, L"cursive", XFA_ATTRIBUTEENUM_Cursive},
-    {0xf54481d4, L"last", XFA_ATTRIBUTEENUM_Last},
-    {0xf5ad782b, L"left", XFA_ATTRIBUTEENUM_Left},
-    {0xf616da2e, L"link", XFA_ATTRIBUTEENUM_Link},
-    {0xf6b4afb0, L"long", XFA_ATTRIBUTEENUM_Long},
-    {0xf8636460, L"internationalCarrier",
-     XFA_ATTRIBUTEENUM_InternationalCarrier},
-    {0xf9fb37ac, L"PDF1.3", XFA_ATTRIBUTEENUM_PDF1_3},
-    {0xf9fb37af, L"PDF1.6", XFA_ATTRIBUTEENUM_PDF1_6},
-    {0xfbce7f19, L"serif", XFA_ATTRIBUTEENUM_Serif},
-    {0xfc82d695, L"postSave", XFA_ATTRIBUTEENUM_PostSave},
-    {0xfcef86b5, L"ready", XFA_ATTRIBUTEENUM_Ready},
-    {0xfd54fbb7, L"postSign", XFA_ATTRIBUTEENUM_PostSign},
-    {0xfdc0aae2, L"Arabic", XFA_ATTRIBUTEENUM_Arabic},
-    {0xfe06d2ca, L"error", XFA_ATTRIBUTEENUM_Error},
-    {0xfefc4885, L"urlencoded", XFA_ATTRIBUTEENUM_Urlencoded},
-    {0xff795ad2, L"lowered", XFA_ATTRIBUTEENUM_Lowered},
-};
-const int32_t g_iXFAEnumCount =
-    sizeof(g_XFAEnumData) / sizeof(XFA_ATTRIBUTEENUMINFO);
-static const CXFA_Measurement g_XFAMeasurementData[] = {
-    CXFA_Measurement(0, XFA_UNIT_In),
-    CXFA_Measurement(0, XFA_UNIT_Pt),
-    CXFA_Measurement(5, XFA_UNIT_Mm),
-    CXFA_Measurement(0.25, XFA_UNIT_Mm),
-    CXFA_Measurement(-1, XFA_UNIT_Unknown),
-    CXFA_Measurement(0, XFA_UNIT_Angle),
-    CXFA_Measurement(10, XFA_UNIT_Pt),
-    CXFA_Measurement(360, XFA_UNIT_Angle),
-    CXFA_Measurement(0.5, XFA_UNIT_Pt),
-};
-const XFA_ATTRIBUTEINFO g_XFAAttributeData[] = {
-    {0x68, L"h", XFA_ATTRIBUTE_H, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x77, L"w", XFA_ATTRIBUTE_W, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x78, L"x", XFA_ATTRIBUTE_X, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x79, L"y", XFA_ATTRIBUTE_Y, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x21aed, L"id", XFA_ATTRIBUTE_Id, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x25363, L"to", XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Config, (void*)NULL},
-    {0xcb0ac9, L"lineThrough", XFA_ATTRIBUTE_LineThrough,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x2282c73, L"hAlign", XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Left},
-    {0x2c1c7f1, L"typeface", XFA_ATTRIBUTE_Typeface, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"Courier"},
-    {0x3106c3a, L"beforeTarget", XFA_ATTRIBUTE_BeforeTarget,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x31b19c1, L"name", XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
-         XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x3848b3f, L"next", XFA_ATTRIBUTE_Next, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {0x43e349b, L"dataRowCount", XFA_ATTRIBUTE_DataRowCount,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x5518c25, L"break", XFA_ATTRIBUTE_Break, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Close},
-    {0x5ce6195, L"vScrollPolicy", XFA_ATTRIBUTE_VScrollPolicy,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0x8c74ae9, L"fontHorizontalScale", XFA_ATTRIBUTE_FontHorizontalScale,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"100%"},
-    {0x8d4f1c7, L"textIndent", XFA_ATTRIBUTE_TextIndent,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x97c1c65, L"context", XFA_ATTRIBUTE_Context, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_UNKNOWN, (void*)0},
-    {0x9876578, L"trayOut", XFA_ATTRIBUTE_TrayOut, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xa2e3514, L"cap", XFA_ATTRIBUTE_Cap, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Square},
-    {0xb3543a6, L"max", XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xb356ca4, L"min", XFA_ATTRIBUTE_Min, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
-    {0xbb8df5d, L"ref", XFA_ATTRIBUTE_Ref, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_Template |
-         XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xbb8f3df, L"rid", XFA_ATTRIBUTE_Rid, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xc080cd3, L"url", XFA_ATTRIBUTE_Url, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xc0811ed, L"use", XFA_ATTRIBUTE_Use, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xcfea02e, L"leftInset", XFA_ATTRIBUTE_LeftInset,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x1026c59d, L"widows", XFA_ATTRIBUTE_Widows, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x1059ec18, L"level", XFA_ATTRIBUTE_Level, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Config, (void*)0},
-    {0x1356caf8, L"bottomInset", XFA_ATTRIBUTE_BottomInset,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x13a08bdb, L"overflowTarget", XFA_ATTRIBUTE_OverflowTarget,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x1414d431, L"allowMacro", XFA_ATTRIBUTE_AllowMacro,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x14a32d52, L"pagePosition", XFA_ATTRIBUTE_PagePosition,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Any},
-    {0x1517dfa1, L"columnWidths", XFA_ATTRIBUTE_ColumnWidths,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x169134a1, L"overflowLeader", XFA_ATTRIBUTE_OverflowLeader,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x1b8dce3e, L"action", XFA_ATTRIBUTE_Action, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Include},
-    {0x1e459b8f, L"nonRepudiation", XFA_ATTRIBUTE_NonRepudiation,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x1ec8ab2c, L"rate", XFA_ATTRIBUTE_Rate, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)50},
-    {0x1ef3a64a, L"allowRichText", XFA_ATTRIBUTE_AllowRichText,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x2038c9b2, L"role", XFA_ATTRIBUTE_Role, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x20914367, L"overflowTrailer", XFA_ATTRIBUTE_OverflowTrailer,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x226ca8f1, L"operation", XFA_ATTRIBUTE_Operation,
-     XFA_ATTRIBUTETYPE_NOTSURE, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x24d85167, L"timeout", XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_SourceSet, (void*)NULL},
-    {0x25764436, L"topInset", XFA_ATTRIBUTE_TopInset, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x25839852, L"access", XFA_ATTRIBUTE_Access, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Open},
-    {0x268b7ec1, L"commandType", XFA_ATTRIBUTE_CommandType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
-     (void*)XFA_ATTRIBUTEENUM_Unknown},
-    {0x28dee6e9, L"format", XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x28e17e91, L"dataPrep", XFA_ATTRIBUTE_DataPrep, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {0x292b88fe, L"widgetData", XFA_ATTRIBUTE_WidgetData,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
-    {0x29418bb7, L"abbr", XFA_ATTRIBUTE_Abbr, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_LocaleSet, (void*)0},
-    {0x2a82d99c, L"marginRight", XFA_ATTRIBUTE_MarginRight,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x2b5df51e, L"dataDescription", XFA_ATTRIBUTE_DataDescription,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_ConnectionSet, (void*)NULL},
-    {0x2bb3f470, L"encipherOnly", XFA_ATTRIBUTE_EncipherOnly,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x2cd79033, L"kerningMode", XFA_ATTRIBUTE_KerningMode,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {0x2ee7678f, L"rotate", XFA_ATTRIBUTE_Rotate, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 5)},
-    {0x2f105f72, L"wordCharacterCount", XFA_ATTRIBUTE_WordCharacterCount,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)7},
-    {0x2f16a382, L"type", XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x34ae103c, L"reserve", XFA_ATTRIBUTE_Reserve, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 4)},
-    {0x3650557e, L"textLocation", XFA_ATTRIBUTE_TextLocation,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Below},
-    {0x39cdb0a2, L"priority", XFA_ATTRIBUTE_Priority, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Custom},
-    {0x3a0273a6, L"underline", XFA_ATTRIBUTE_Underline,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x3b582286, L"moduleWidth", XFA_ATTRIBUTE_ModuleWidth,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 3)},
-    {0x3d123c26, L"hyphenate", XFA_ATTRIBUTE_Hyphenate,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x3e7af94f, L"listen", XFA_ATTRIBUTE_Listen, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_RefOnly},
-    {0x4156ee3f, L"delimiter", XFA_ATTRIBUTE_Delimiter, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x42fed1fd, L"contentType", XFA_ATTRIBUTE_ContentType,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
-                                  XFA_XDPPACKET_Datasets | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x453eaf38, L"startNew", XFA_ATTRIBUTE_StartNew, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x45a6daf8, L"eofAction", XFA_ATTRIBUTE_EofAction, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_MoveLast},
-    {0x47cfa43a, L"allowNeutral", XFA_ATTRIBUTE_AllowNeutral,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x47d03490, L"connection", XFA_ATTRIBUTE_Connection,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x4873c601, L"baselineShift", XFA_ATTRIBUTE_BaselineShift,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x4b319767, L"overlinePeriod", XFA_ATTRIBUTE_OverlinePeriod,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_All},
-    {0x4b8bc840, L"fracDigits", XFA_ATTRIBUTE_FracDigits,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)2},
-    {0x4ef3d02c, L"orientation", XFA_ATTRIBUTE_Orientation,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Portrait},
-    {0x4fdc3454, L"timeStamp", XFA_ATTRIBUTE_TimeStamp, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_XDP, (void*)NULL},
-    {0x52666f1c, L"printCheckDigit", XFA_ATTRIBUTE_PrintCheckDigit,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x534729c9, L"marginLeft", XFA_ATTRIBUTE_MarginLeft,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x5392ea58, L"stroke", XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Solid},
-    {0x5404d6df, L"moduleHeight", XFA_ATTRIBUTE_ModuleHeight,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 2)},
-    {0x54fa722c, L"transferEncoding", XFA_ATTRIBUTE_TransferEncoding,
-     XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x552d9ad5, L"usage", XFA_ATTRIBUTE_Usage, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_ExportAndImport},
-    {0x570ce835, L"presence", XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Visible},
-    {0x5739d1ff, L"radixOffset", XFA_ATTRIBUTE_RadixOffset,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x577682ac, L"preserve", XFA_ATTRIBUTE_Preserve, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x58be2870, L"aliasNode", XFA_ATTRIBUTE_AliasNode,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
-    {0x5a32e493, L"multiLine", XFA_ATTRIBUTE_MultiLine,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x5a50e9e6, L"version", XFA_ATTRIBUTE_Version, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x5ab23b6c, L"startChar", XFA_ATTRIBUTE_StartChar, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x5b707a35, L"scriptTest", XFA_ATTRIBUTE_ScriptTest,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Error},
-    {0x5c054755, L"startAngle", XFA_ATTRIBUTE_StartAngle,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 5)},
-    {0x5ec958c0, L"cursorType", XFA_ATTRIBUTE_CursorType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
-     (void*)XFA_ATTRIBUTEENUM_ForwardOnly},
-    {0x5f760b50, L"digitalSignature", XFA_ATTRIBUTE_DigitalSignature,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x60a61edd, L"codeType", XFA_ATTRIBUTE_CodeType, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x60d4c8b1, L"output", XFA_ATTRIBUTE_Output, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_ConnectionSet, (void*)NULL},
-    {0x64110ab5, L"bookendTrailer", XFA_ATTRIBUTE_BookendTrailer,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x65e30c67, L"imagingBBox", XFA_ATTRIBUTE_ImagingBBox,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"none"},
-    {0x66539c48, L"excludeInitialCap", XFA_ATTRIBUTE_ExcludeInitialCap,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x66642f8f, L"force", XFA_ATTRIBUTE_Force, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Config, (void*)NULL},
-    {0x69aa2292, L"crlSign", XFA_ATTRIBUTE_CrlSign, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x6a3405dd, L"previous", XFA_ATTRIBUTE_Previous, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {0x6a95c976, L"pushCharacterCount", XFA_ATTRIBUTE_PushCharacterCount,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)3},
-    {0x6b6ddcfb, L"nullTest", XFA_ATTRIBUTE_NullTest, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Disabled},
-    {0x6cfa828a, L"runAt", XFA_ATTRIBUTE_RunAt, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Client},
-    {0x731e0665, L"spaceBelow", XFA_ATTRIBUTE_SpaceBelow,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x74788f8b, L"sweepAngle", XFA_ATTRIBUTE_SweepAngle,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 7)},
-    {0x78bff531, L"numberOfCells", XFA_ATTRIBUTE_NumberOfCells,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0x79543055, L"letterSpacing", XFA_ATTRIBUTE_LetterSpacing,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x79975f2b, L"lockType", XFA_ATTRIBUTE_LockType, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_ReadOnly},
-    {0x7a0cc471, L"passwordChar", XFA_ATTRIBUTE_PasswordChar,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"*"},
-    {0x7a7cc341, L"vAlign", XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Top},
-    {0x7b29630a, L"sourceBelow", XFA_ATTRIBUTE_SourceBelow,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
-     (void*)XFA_ATTRIBUTEENUM_Update},
-    {0x7b95e661, L"inverted", XFA_ATTRIBUTE_Inverted, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x7c2fd80b, L"mark", XFA_ATTRIBUTE_Mark, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Default},
-    {0x7c2ff6ae, L"maxH", XFA_ATTRIBUTE_MaxH, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x7c2ff6bd, L"maxW", XFA_ATTRIBUTE_MaxW, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x7c732a66, L"truncate", XFA_ATTRIBUTE_Truncate, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x7d02356c, L"minH", XFA_ATTRIBUTE_MinH, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x7d02357b, L"minW", XFA_ATTRIBUTE_MinW, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x7d0b5fca, L"initial", XFA_ATTRIBUTE_Initial, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
-    {0x7d9fd7c5, L"mode", XFA_ATTRIBUTE_Mode, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Config, (void*)XFA_ATTRIBUTEENUM_UsePrinterSetting},
-    {0x7e7e845e, L"layout", XFA_ATTRIBUTE_Layout, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Position},
-    {0x7f6fd3d7, L"server", XFA_ATTRIBUTE_Server, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x824f21b7, L"embedPDF", XFA_ATTRIBUTE_EmbedPDF, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x8340ea66, L"oddOrEven", XFA_ATTRIBUTE_OddOrEven, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Any},
-    {0x836d4d7c, L"tabDefault", XFA_ATTRIBUTE_TabDefault,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x8855805f, L"contains", XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Datasets, (void*)XFA_ATTRIBUTEENUM_Data},
-    {0x8a692521, L"rightInset", XFA_ATTRIBUTE_RightInset,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x8af2e657, L"maxChars", XFA_ATTRIBUTE_MaxChars, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x8b90e1f2, L"open", XFA_ATTRIBUTE_Open, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_UserControl},
-    {0x8c99377e, L"relation", XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x8d181d61, L"wideNarrowRatio", XFA_ATTRIBUTE_WideNarrowRatio,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"3:1"},
-    {0x8e1c2921, L"relevant", XFA_ATTRIBUTE_Relevant, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x8e29d794, L"signatureType", XFA_ATTRIBUTE_SignatureType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Filter},
-    {0x8ec6204c, L"lineThroughPeriod", XFA_ATTRIBUTE_LineThroughPeriod,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_All},
-    {0x8ed182d1, L"shape", XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Square},
-    {0x8fa01790, L"tabStops", XFA_ATTRIBUTE_TabStops, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0x8fc36c0a, L"outputBelow", XFA_ATTRIBUTE_OutputBelow,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
-     (void*)XFA_ATTRIBUTEENUM_Warn},
-    {0x9041d4b0, L"short", XFA_ATTRIBUTE_Short, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0x907c7719, L"fontVerticalScale", XFA_ATTRIBUTE_FontVerticalScale,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"100%"},
-    {0x94446dcc, L"thickness", XFA_ATTRIBUTE_Thickness,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 8)},
-    {0x957fa006, L"commitOn", XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Select},
-    {0x982bd892, L"remainCharacterCount", XFA_ATTRIBUTE_RemainCharacterCount,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)3},
-    {0x98fd4d81, L"keyAgreement", XFA_ATTRIBUTE_KeyAgreement,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x99800d7a, L"errorCorrectionLevel", XFA_ATTRIBUTE_ErrorCorrectionLevel,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0x9a63da3d, L"upsMode", XFA_ATTRIBUTE_UpsMode, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_UsCarrier},
-    {0x9cc17d75, L"mergeMode", XFA_ATTRIBUTE_MergeMode, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_ConsumeData},
-    {0x9d833d75, L"circular", XFA_ATTRIBUTE_Circular, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0x9d8ee204, L"psName", XFA_ATTRIBUTE_PsName, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Config, (void*)NULL},
-    {0x9dcc3ab3, L"trailer", XFA_ATTRIBUTE_Trailer, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xa0933954, L"unicodeRange", XFA_ATTRIBUTE_UnicodeRange,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Config, (void*)NULL},
-    {0xa1b0d2f5, L"executeType", XFA_ATTRIBUTE_ExecuteType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Import},
-    {0xa25a883d, L"duplexImposition", XFA_ATTRIBUTE_DuplexImposition,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_LongEdge},
-    {0xa42ca1b7, L"trayIn", XFA_ATTRIBUTE_TrayIn, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xa433f001, L"bindingNode", XFA_ATTRIBUTE_BindingNode,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_UNKNOWN, (void*)0},
-    {0xa5340ff5, L"bofAction", XFA_ATTRIBUTE_BofAction, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_SourceSet, (void*)XFA_ATTRIBUTEENUM_MoveFirst},
-    {0xa5b410cf, L"save", XFA_ATTRIBUTE_Save, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0xa6118c89, L"targetType", XFA_ATTRIBUTE_TargetType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xa66404cb, L"keyEncipherment", XFA_ATTRIBUTE_KeyEncipherment,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xa6710262, L"credentialServerPolicy",
-     XFA_ATTRIBUTE_CredentialServerPolicy, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {0xa686975b, L"size", XFA_ATTRIBUTE_Size, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 6)},
-    {0xa85e74f3, L"initialNumber", XFA_ATTRIBUTE_InitialNumber,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)1},
-    {0xabef37e3, L"slope", XFA_ATTRIBUTE_Slope, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Backslash},
-    {0xabfa6c4f, L"cSpace", XFA_ATTRIBUTE_CSpace, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)L"SRGB"},
-    {0xac06e2b0, L"colSpan", XFA_ATTRIBUTE_ColSpan, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
-    {0xadc4c77b, L"binding", XFA_ATTRIBUTE_Binding, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xaf754613, L"checksum", XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xb045fbc5, L"charEncoding", XFA_ATTRIBUTE_CharEncoding,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)L"UTF-8"},
-    {0xb0e5485d, L"bind", XFA_ATTRIBUTE_Bind, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet, (void*)NULL},
-    {0xb12128b7, L"textEntry", XFA_ATTRIBUTE_TextEntry,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0xb373a862, L"archive", XFA_ATTRIBUTE_Archive, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xb598a1f7, L"uuid", XFA_ATTRIBUTE_Uuid, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_XDP, (void*)NULL},
-    {0xb5e49bf2, L"posture", XFA_ATTRIBUTE_Posture, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Normal},
-    {0xb6b44172, L"after", XFA_ATTRIBUTE_After, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xb716467b, L"orphans", XFA_ATTRIBUTE_Orphans, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0xbc0c4695, L"qualifiedName", XFA_ATTRIBUTE_QualifiedName,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_UNKNOWN, (void*)NULL},
-    {0xbc254332, L"usehref", XFA_ATTRIBUTE_Usehref, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xbc8fa350, L"locale", XFA_ATTRIBUTE_Locale, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xbd6e1d88, L"weight", XFA_ATTRIBUTE_Weight, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Normal},
-    {0xbd96a0e9, L"underlinePeriod", XFA_ATTRIBUTE_UnderlinePeriod,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_All},
-    {0xbde9abda, L"data", XFA_ATTRIBUTE_Data, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Link},
-    {0xbe52dfbf, L"desc", XFA_ATTRIBUTE_Desc, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, (void*)NULL},
-    {0xbe9ba472, L"numbered", XFA_ATTRIBUTE_Numbered, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)1},
-    {0xc035c6b1, L"dataColumnCount", XFA_ATTRIBUTE_DataColumnCount,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xc0ec9fa4, L"overline", XFA_ATTRIBUTE_Overline, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0xc2ba0923, L"urlPolicy", XFA_ATTRIBUTE_UrlPolicy, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xc2bd40fd, L"anchorType", XFA_ATTRIBUTE_AnchorType,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_TopLeft},
-    {0xc39a88bd, L"labelRef", XFA_ATTRIBUTE_LabelRef, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xc3c1442f, L"bookendLeader", XFA_ATTRIBUTE_BookendLeader,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xc4547a08, L"maxLength", XFA_ATTRIBUTE_MaxLength,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*) - 1},
-    {0xc4fed09b, L"accessKey", XFA_ATTRIBUTE_AccessKey, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xc5762157, L"cursorLocation", XFA_ATTRIBUTE_CursorLocation,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_SourceSet,
-     (void*)XFA_ATTRIBUTEENUM_Client},
-    {0xc860f30a, L"delayedOpen", XFA_ATTRIBUTE_DelayedOpen,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_SourceSet, (void*)NULL},
-    {0xc8da4da7, L"target", XFA_ATTRIBUTE_Target, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xca5dc27c, L"dataEncipherment", XFA_ATTRIBUTE_DataEncipherment,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xcb150479, L"afterTarget", XFA_ATTRIBUTE_AfterTarget,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xcbcaf66d, L"leader", XFA_ATTRIBUTE_Leader, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xcca7897e, L"picker", XFA_ATTRIBUTE_Picker, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Host},
-    {0xcd7f7b54, L"from", XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config, (void*)NULL},
-    {0xcea5e62c, L"baseProfile", XFA_ATTRIBUTE_BaseProfile,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Full},
-    {0xd171b240, L"aspect", XFA_ATTRIBUTE_Aspect, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)XFA_ATTRIBUTEENUM_Fit},
-    {0xd3c84d25, L"rowColumnRatio", XFA_ATTRIBUTE_RowColumnRatio,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xd4b01921, L"lineHeight", XFA_ATTRIBUTE_LineHeight,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 1)},
-    {0xd4cc53f8, L"highlight", XFA_ATTRIBUTE_Highlight, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Inverted},
-    {0xd50f903a, L"valueRef", XFA_ATTRIBUTE_ValueRef, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xd52482e0, L"maxEntries", XFA_ATTRIBUTE_MaxEntries,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Config, (void*)5},
-    {0xd57c513c, L"dataLength", XFA_ATTRIBUTE_DataLength,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xd6128d8d, L"activity", XFA_ATTRIBUTE_Activity, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Click},
-    {0xd6a39990, L"input", XFA_ATTRIBUTE_Input, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_ConnectionSet, (void*)NULL},
-    {0xd6e27f1d, L"value", XFA_ATTRIBUTE_Value, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
-         XFA_XDPPACKET_Template | XFA_XDPPACKET_Datasets |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xd70798c2, L"blankOrNotBlank", XFA_ATTRIBUTE_BlankOrNotBlank,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Any},
-    {0xd861f8af, L"addRevocationInfo", XFA_ATTRIBUTE_AddRevocationInfo,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xd8f982bf, L"genericFamily", XFA_ATTRIBUTE_GenericFamily,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
-     (void*)XFA_ATTRIBUTEENUM_Serif},
-    {0xd996fa9b, L"hand", XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Even},
-    {0xdb55fec5, L"href", XFA_ATTRIBUTE_Href, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xdc75676c, L"textEncoding", XFA_ATTRIBUTE_TextEncoding,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xde7f92ba, L"leadDigits", XFA_ATTRIBUTE_LeadDigits,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*) - 1},
-    {0xe11a2cbc, L"permissions", XFA_ATTRIBUTE_Permissions,
-     XFA_ATTRIBUTETYPE_Integer, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)2},
-    {0xe18b5659, L"spaceAbove", XFA_ATTRIBUTE_SpaceAbove,
-     XFA_ATTRIBUTETYPE_Measure, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0xe1a26b56, L"codeBase", XFA_ATTRIBUTE_CodeBase, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xe349d044, L"stock", XFA_ATTRIBUTE_Stock, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xe372ae97, L"isNull", XFA_ATTRIBUTE_IsNull, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Datasets, (void*)0},
-    {0xe4c3a5e5, L"restoreState", XFA_ATTRIBUTE_RestoreState,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Manual},
-    {0xe5c96d6a, L"excludeAllCaps", XFA_ATTRIBUTE_ExcludeAllCaps,
-     XFA_ATTRIBUTETYPE_Boolean, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)0},
-    {0xe64b1129, L"formatTest", XFA_ATTRIBUTE_FormatTest,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Warning},
-    {0xe6f99487, L"hScrollPolicy", XFA_ATTRIBUTE_HScrollPolicy,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xe8dddf50, L"join", XFA_ATTRIBUTE_Join, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Square},
-    {0xe8f118a8, L"keyCertSign", XFA_ATTRIBUTE_KeyCertSign,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xe948b9a8, L"radius", XFA_ATTRIBUTE_Radius, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0xe996b2fe, L"sourceAbove", XFA_ATTRIBUTE_SourceAbove,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
-     (void*)XFA_ATTRIBUTEENUM_Warn},
-    {0xea7090a0, L"override", XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xeb091003, L"classId", XFA_ATTRIBUTE_ClassId, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xeb511b54, L"disable", XFA_ATTRIBUTE_Disable, XFA_ATTRIBUTETYPE_Boolean,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)0},
-    {0xeda9017a, L"scope", XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_NOTSURE,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xf197844d, L"match", XFA_ATTRIBUTE_Match, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Once},
-    {0xf2009339, L"placement", XFA_ATTRIBUTE_Placement, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Left},
-    {0xf4ffce73, L"before", XFA_ATTRIBUTE_Before, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_Auto},
-    {0xf531b059, L"writingScript", XFA_ATTRIBUTE_WritingScript,
-     XFA_ATTRIBUTETYPE_Enum, XFA_XDPPACKET_Config,
-     (void*)XFA_ATTRIBUTEENUM_Asterisk},
-    {0xf575ca75, L"endChar", XFA_ATTRIBUTE_EndChar, XFA_ATTRIBUTETYPE_Cdata,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, (void*)NULL},
-    {0xf6b47749, L"lock", XFA_ATTRIBUTE_Lock, XFA_ATTRIBUTETYPE_Integer,
-     XFA_XDPPACKET_Config, (void*)0},
-    {0xf6b4afb0, L"long", XFA_ATTRIBUTE_Long, XFA_ATTRIBUTETYPE_Measure,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)(g_XFAMeasurementData + 0)},
-    {0xf6b59543, L"intact", XFA_ATTRIBUTE_Intact, XFA_ATTRIBUTETYPE_Enum,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {0xf889e747, L"xdpContent", XFA_ATTRIBUTE_XdpContent,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-    {0xfea53ec6, L"decipherOnly", XFA_ATTRIBUTE_DecipherOnly,
-     XFA_ATTRIBUTETYPE_Cdata, XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     (void*)NULL},
-};
-const int32_t g_iXFAAttributeCount =
-    sizeof(g_XFAAttributeData) / sizeof(XFA_ATTRIBUTEINFO);
-const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[] = {
-    {XFA_ELEMENT_SubformSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Ordered},
-    {XFA_ELEMENT_NumberPattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Numeric},
-    {XFA_ELEMENT_KeyUsage, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_LabelPrinter, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Zpl},
-    {XFA_ELEMENT_CalendarSymbols, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Gregorian},
-    {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_Barcode, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {XFA_ELEMENT_TimePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Med},
-    {XFA_ELEMENT_BatchOutput, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {XFA_ELEMENT_SubjectDNs, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Issuers, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_EncryptionMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Pattern, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_CrossHatch},
-    {XFA_ELEMENT_Compress, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_ImageOnly},
-    {XFA_ELEMENT_Image, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Base64},
-    {XFA_ELEMENT_TimeStamp, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Subform, XFA_ATTRIBUTE_Scope, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Name},
-    {XFA_ELEMENT_Handler, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Record, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer,
-     (void*)0},
-    {XFA_ELEMENT_Command, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer,
-     (void*)30},
-    {XFA_ELEMENT_DigestMethods, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_PageSet, XFA_ATTRIBUTE_Relation, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_OrderedOccurrence},
-    {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_Equate, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_Traverse, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Next},
-    {XFA_ELEMENT_Encodings, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Signing, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Oids, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Signature, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_PDF1_3},
-    {XFA_ELEMENT_ExData, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {XFA_ELEMENT_Linear, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_ToRight},
-    {XFA_ELEMENT_CurrencySymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Symbol},
-    {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_From, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_EquateRange, XFA_ATTRIBUTE_To, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_SignData, XFA_ATTRIBUTE_Operation, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Sign},
-    {XFA_ELEMENT_DatePattern, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Med},
-    {XFA_ELEMENT_Bind, XFA_ATTRIBUTE_TransferEncoding, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_None},
-    {XFA_ELEMENT_Reasons, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_AppearanceFilter, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Form, XFA_ATTRIBUTE_Checksum, XFA_ATTRIBUTETYPE_Cdata,
-     (void*)NULL},
-    {XFA_ELEMENT_Value, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Boolean,
-     (void*)0},
-    {XFA_ELEMENT_Calculate, XFA_ATTRIBUTE_Override, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Error},
-    {XFA_ELEMENT_Connect, XFA_ATTRIBUTE_Timeout, XFA_ATTRIBUTETYPE_Integer,
-     (void*)15},
-    {XFA_ELEMENT_Submit, XFA_ATTRIBUTE_Format, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Xdp},
-    {XFA_ELEMENT_Radial, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_ToEdge},
-    {XFA_ELEMENT_LockDocument, XFA_ATTRIBUTE_Type, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Optional},
-    {XFA_ELEMENT_Occur, XFA_ATTRIBUTE_Max, XFA_ATTRIBUTETYPE_Integer, (void*)1},
-    {XFA_ELEMENT_NumberSymbol, XFA_ATTRIBUTE_Name, XFA_ATTRIBUTETYPE_Enum,
-     (void*)XFA_ATTRIBUTEENUM_Decimal},
-};
-const int32_t g_iXFANotsureCount =
-    sizeof(g_XFANotsureAttributes) / sizeof(XFA_NOTSUREATTRIBUTE);
-const XFA_ELEMENTINFO g_XFAElementData[] = {
-    {0x23ee3, L"ps", XFA_ELEMENT_Ps, XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
-    {0x25363, L"to", XFA_ELEMENT_To, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x2587e, L"ui", XFA_ELEMENT_Ui,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x1c648b, L"recordSet", XFA_ELEMENT_RecordSet, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_Node},
-    {0x171428f, L"subsetBelow", XFA_ELEMENT_SubsetBelow, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x1a0776a, L"subformSet", XFA_ELEMENT_SubformSet,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x2340d70, L"adobeExtensionLevel", XFA_ELEMENT_AdobeExtensionLevel,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x2c1c7f1, L"typeface", XFA_ELEMENT_Typeface, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_Node},
-    {0x5518c25, L"break", XFA_ELEMENT_Break,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x5fff523, L"fontInfo", XFA_ELEMENT_FontInfo, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x653a227, L"numberPattern", XFA_ELEMENT_NumberPattern,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0x65b4a05, L"dynamicRender", XFA_ELEMENT_DynamicRender,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x7e4362e, L"printScaling", XFA_ELEMENT_PrintScaling, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x7fe6d3a, L"checkButton", XFA_ELEMENT_CheckButton,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x80cf58f, L"datePatterns", XFA_ELEMENT_DatePatterns,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0x811929d, L"sourceSet", XFA_ELEMENT_SourceSet, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_ModelNode},
-    {0x9f9d612, L"amd", XFA_ELEMENT_Amd, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x9f9efb6, L"arc", XFA_ELEMENT_Arc,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xa48835e, L"day", XFA_ELEMENT_Day, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xa6328b8, L"era", XFA_ELEMENT_Era, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xae6a0a0, L"jog", XFA_ELEMENT_Jog, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xb1b3d22, L"log", XFA_ELEMENT_Log, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xb35439e, L"map", XFA_ELEMENT_Map,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_Node},
-    {0xb355301, L"mdp", XFA_ELEMENT_Mdp,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xb420438, L"breakBefore", XFA_ELEMENT_BreakBefore,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xb6a091c, L"oid", XFA_ELEMENT_Oid,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0xb84389f, L"pcl", XFA_ELEMENT_Pcl, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xb843dba, L"pdf", XFA_ELEMENT_Pdf, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xbb8df5d, L"ref", XFA_ELEMENT_Ref,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0xc080cd0, L"uri", XFA_ELEMENT_Uri,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_ConnectionSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0xc56afbf, L"xdc", XFA_ELEMENT_Xdc,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Xdc, XFA_OBJECTTYPE_ModelNode},
-    {0xc56afcc, L"xdp", XFA_ELEMENT_Xdp, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc56b9ff, L"xfa", XFA_ELEMENT_Xfa, XFA_XDPPACKET_XDP,
-     XFA_OBJECTTYPE_ModelNode},
-    {0xc56fcb7, L"xsl", XFA_ELEMENT_Xsl, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc8b89d6, L"zpl", XFA_ELEMENT_Zpl, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc9bae94, L"cache", XFA_ELEMENT_Cache, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xcb016be, L"margin", XFA_ELEMENT_Margin,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xe1378fe, L"keyUsage", XFA_ELEMENT_KeyUsage,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xfe3596a, L"exclude", XFA_ELEMENT_Exclude, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x10395ac7, L"choiceList", XFA_ELEMENT_ChoiceList,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x1059ec18, L"level", XFA_ELEMENT_Level, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x10874804, L"labelPrinter", XFA_ELEMENT_LabelPrinter,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
-    {0x10c40e03, L"calendarSymbols", XFA_ELEMENT_CalendarSymbols,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0x10f1ea24, L"para", XFA_ELEMENT_Para,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x10f1ea37, L"part", XFA_ELEMENT_Part, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x1140975b, L"pdfa", XFA_ELEMENT_Pdfa, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x1154efe6, L"filter", XFA_ELEMENT_Filter,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x13f41de1, L"present", XFA_ELEMENT_Present, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x1827e6ea, L"pagination", XFA_ELEMENT_Pagination, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x18463707, L"encoding", XFA_ELEMENT_Encoding,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
-    {0x185e41e2, L"event", XFA_ELEMENT_Event,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x1adb142d, L"whitespace", XFA_ELEMENT_Whitespace, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x1f3f64c3, L"defaultUi", XFA_ELEMENT_DefaultUi,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x204e87cb, L"dataModel", XFA_ELEMENT_DataModel, XFA_XDPPACKET_Datasets,
-     XFA_OBJECTTYPE_ModelNode},
-    {0x2057b350, L"barcode", XFA_ELEMENT_Barcode,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x20596bad, L"timePattern", XFA_ELEMENT_TimePattern,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0x210b74d3, L"batchOutput", XFA_ELEMENT_BatchOutput, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x212ff0e2, L"enforce", XFA_ELEMENT_Enforce, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x21d351b4, L"currencySymbols", XFA_ELEMENT_CurrencySymbols,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0x21db83c5, L"addSilentPrint", XFA_ELEMENT_AddSilentPrint,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x22266258, L"rename", XFA_ELEMENT_Rename, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x226ca8f1, L"operation", XFA_ELEMENT_Operation,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
-    {0x23e27b84, L"typefaces", XFA_ELEMENT_Typefaces, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_Node},
-    {0x23f4aa75, L"subjectDNs", XFA_ELEMENT_SubjectDNs,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x240d5e8e, L"issuers", XFA_ELEMENT_Issuers,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x2457a033, L"signaturePseudoModel", XFA_ELEMENT_SignaturePseudoModel,
-     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
-    {0x24a52f8a, L"wsdlConnection", XFA_ELEMENT_WsdlConnection,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
-    {0x254ebd07, L"debug", XFA_ELEMENT_Debug, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x2655c66a, L"delta", XFA_ELEMENT_Delta, XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_OrdinaryObject},
-    {0x26c0daec, L"eraNames", XFA_ELEMENT_EraNames, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_Node},
-    {0x273ab03b, L"modifyAnnots", XFA_ELEMENT_ModifyAnnots,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x27875bb4, L"startNode", XFA_ELEMENT_StartNode, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x285d0dbc, L"button", XFA_ELEMENT_Button,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x28dee6e9, L"format", XFA_ELEMENT_Format,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x2a23349e, L"border", XFA_ELEMENT_Border,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x2ae67f19, L"area", XFA_ELEMENT_Area,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContainerNode},
-    {0x2c3c4c67, L"hyphenation", XFA_ELEMENT_Hyphenation,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x2d08af85, L"text", XFA_ELEMENT_Text,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x2d71b00f, L"time", XFA_ELEMENT_Time,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0x2f16a382, L"type", XFA_ELEMENT_Type, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x2fe057e9, L"overprint", XFA_ELEMENT_Overprint, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x302aee16, L"certificates", XFA_ELEMENT_Certificates,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x30b227df, L"encryptionMethods", XFA_ELEMENT_EncryptionMethods,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x32b900d1, L"setProperty", XFA_ELEMENT_SetProperty,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x337d9e45, L"printerName", XFA_ELEMENT_PrinterName, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x33edda4b, L"startPage", XFA_ELEMENT_StartPage, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x381943e4, L"pageOffset", XFA_ELEMENT_PageOffset, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x382106cd, L"dateTime", XFA_ELEMENT_DateTime,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0x386e7421, L"comb", XFA_ELEMENT_Comb,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x390acd9e, L"pattern", XFA_ELEMENT_Pattern,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x3942163e, L"ifEmpty", XFA_ELEMENT_IfEmpty, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x39944a7b, L"suppressBanner", XFA_ELEMENT_SuppressBanner,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x3b3c3dca, L"outputBin", XFA_ELEMENT_OutputBin, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x3b8a4024, L"field", XFA_ELEMENT_Field,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x3c15352f, L"agent", XFA_ELEMENT_Agent, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x3d7e8668, L"outputXSL", XFA_ELEMENT_OutputXSL, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x3e1c91c5, L"adjustData", XFA_ELEMENT_AdjustData, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x3e7a9408, L"autoSave", XFA_ELEMENT_AutoSave, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x3ecead94, L"contentArea", XFA_ELEMENT_ContentArea,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x3ef334e3, L"eventPseudoModel", XFA_ELEMENT_EventPseudoModel,
-     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
-    {0x3fadaec0, L"wsdlAddress", XFA_ELEMENT_WsdlAddress,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
-    {0x40623b5b, L"solid", XFA_ELEMENT_Solid,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x41f0bd76, L"dateTimeSymbols", XFA_ELEMENT_DateTimeSymbols,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0x444e7523, L"encryptionLevel", XFA_ELEMENT_EncryptionLevel,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x4523af55, L"edge", XFA_ELEMENT_Edge,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x45d5e3c1, L"stipple", XFA_ELEMENT_Stipple,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x475e4e87, L"attributes", XFA_ELEMENT_Attributes, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x487a8c87, L"versionControl", XFA_ELEMENT_VersionControl,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
-    {0x48e5248c, L"meridiem", XFA_ELEMENT_Meridiem, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x48f36719, L"exclGroup", XFA_ELEMENT_ExclGroup,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x4977356b, L"toolTip", XFA_ELEMENT_ToolTip,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0x499afecc, L"compress", XFA_ELEMENT_Compress, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x4a0c4948, L"reason", XFA_ELEMENT_Reason,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0x4bdcce13, L"execute", XFA_ELEMENT_Execute,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x4c56b216, L"contentCopy", XFA_ELEMENT_ContentCopy, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x4cc176d3, L"dateTimeEdit", XFA_ELEMENT_DateTimeEdit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x4e1e39b6, L"config", XFA_ELEMENT_Config, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ModelNode},
-    {0x4e2d6083, L"image", XFA_ELEMENT_Image,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0x4e814150, L"#xHTML", XFA_ELEMENT_SharpxHTML,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet |
-         XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_NodeV},
-    {0x4f2388c1, L"numberOfCopies", XFA_ELEMENT_NumberOfCopies,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x4f512e30, L"behaviorOverride", XFA_ELEMENT_BehaviorOverride,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x4fdc3454, L"timeStamp", XFA_ELEMENT_TimeStamp,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x51d90546, L"month", XFA_ELEMENT_Month, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x523437e4, L"viewerPreferences", XFA_ELEMENT_ViewerPreferences,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
-    {0x53abc1c6, L"scriptModel", XFA_ELEMENT_ScriptModel, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x54034c2f, L"decimal", XFA_ELEMENT_Decimal,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0x54202c9e, L"subform", XFA_ELEMENT_Subform,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x542c7300, L"select", XFA_ELEMENT_Select, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0x5436d198, L"window", XFA_ELEMENT_Window, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x5473b6dc, L"localeSet", XFA_ELEMENT_LocaleSet,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ModelNode},
-    {0x56ae179e, L"handler", XFA_ELEMENT_Handler,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0x5700bd5f, L"hostPseudoModel", XFA_ELEMENT_HostPseudoModel,
-     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
-    {0x570ce835, L"presence", XFA_ELEMENT_Presence, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x5779d65f, L"record", XFA_ELEMENT_Record, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x59c8f27d, L"embed", XFA_ELEMENT_Embed, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x5a50e9e6, L"version", XFA_ELEMENT_Version, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x5b8383df, L"command", XFA_ELEMENT_Command, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_Node},
-    {0x5c43c6c3, L"copies", XFA_ELEMENT_Copies, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x5e0c2c49, L"staple", XFA_ELEMENT_Staple, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x5e5083dd, L"submitFormat", XFA_ELEMENT_SubmitFormat,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x5e8c5d20, L"boolean", XFA_ELEMENT_Boolean,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x60490a85, L"message", XFA_ELEMENT_Message,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_Node},
-    {0x60d4c8b1, L"output", XFA_ELEMENT_Output, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x61810081, L"psMap", XFA_ELEMENT_PsMap, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x62bd904b, L"excludeNS", XFA_ELEMENT_ExcludeNS, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x669d4f77, L"assist", XFA_ELEMENT_Assist,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x67334a1c, L"picture", XFA_ELEMENT_Picture,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x67fe7334, L"traversal", XFA_ELEMENT_Traversal,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x6894589c, L"silentPrint", XFA_ELEMENT_SilentPrint, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x68a16bbd, L"webClient", XFA_ELEMENT_WebClient, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x69f115df, L"layoutPseudoModel", XFA_ELEMENT_LayoutPseudoModel,
-     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
-    {0x6a4bc084, L"producer", XFA_ELEMENT_Producer, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x6a9e04c9, L"corner", XFA_ELEMENT_Corner,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x6ccd7274, L"msgId", XFA_ELEMENT_MsgId, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x6e67921f, L"color", XFA_ELEMENT_Color,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x6ec217a5, L"keep", XFA_ELEMENT_Keep,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x6eef1116, L"query", XFA_ELEMENT_Query, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_Node},
-    {0x7033bfd5, L"insert", XFA_ELEMENT_Insert, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0x704af389, L"imageEdit", XFA_ELEMENT_ImageEdit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x7233018a, L"validate", XFA_ELEMENT_Validate,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x72ba47b4, L"digestMethods", XFA_ELEMENT_DigestMethods,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x72f2aa7a, L"numberPatterns", XFA_ELEMENT_NumberPatterns,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0x74caed29, L"pageSet", XFA_ELEMENT_PageSet,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x7568e6ae, L"integer", XFA_ELEMENT_Integer,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x76182db9, L"soapAddress", XFA_ELEMENT_SoapAddress,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
-    {0x773146c5, L"equate", XFA_ELEMENT_Equate, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x77d449dd, L"formFieldFilling", XFA_ELEMENT_FormFieldFilling,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x7889d68a, L"pageRange", XFA_ELEMENT_PageRange, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x7baca2e3, L"update", XFA_ELEMENT_Update, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0x7ce89001, L"connectString", XFA_ELEMENT_ConnectString,
-     XFA_XDPPACKET_SourceSet, XFA_OBJECTTYPE_TextNode},
-    {0x7d9fd7c5, L"mode", XFA_ELEMENT_Mode, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x7e7e845e, L"layout", XFA_ELEMENT_Layout, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x7e845c34, L"#xml", XFA_ELEMENT_Sharpxml,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeV},
-    {0x7fb341df, L"xsdConnection", XFA_ELEMENT_XsdConnection,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
-    {0x7ffb51cc, L"traverse", XFA_ELEMENT_Traverse,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x80203b5a, L"encodings", XFA_ELEMENT_Encodings,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x803550fc, L"template", XFA_ELEMENT_Template,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ModelNode},
-    {0x803d5bbc, L"acrobat", XFA_ELEMENT_Acrobat, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0x821d6569, L"validationMessaging", XFA_ELEMENT_ValidationMessaging,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
-    {0x830e688f, L"signing", XFA_ELEMENT_Signing,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x83a550d2, L"dataWindow", XFA_ELEMENT_DataWindow, XFA_XDPPACKET_Datasets,
-     XFA_OBJECTTYPE_OrdinaryObject},
-    {0x83dab9f5, L"script", XFA_ELEMENT_Script,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x8411ebcd, L"addViewerPreferences", XFA_ELEMENT_AddViewerPreferences,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x8777642e, L"alwaysEmbed", XFA_ELEMENT_AlwaysEmbed, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x877a6b39, L"passwordEdit", XFA_ELEMENT_PasswordEdit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x87e84c99, L"numericEdit", XFA_ELEMENT_NumericEdit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x8852cdec, L"encryptionMethod", XFA_ELEMENT_EncryptionMethod,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
-    {0x891f4606, L"change", XFA_ELEMENT_Change, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x89939f36, L"pageArea", XFA_ELEMENT_PageArea,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0x8a9d6247, L"submitUrl", XFA_ELEMENT_SubmitUrl, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0x8ad8b90f, L"oids", XFA_ELEMENT_Oids,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x8b036f32, L"signature", XFA_ELEMENT_Signature,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x8b128efb, L"ADBE_JSConsole", XFA_ELEMENT_ADBE_JSConsole,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0x8bcfe96e, L"caption", XFA_ELEMENT_Caption,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x8e1c2921, L"relevant", XFA_ELEMENT_Relevant, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x8e3f0a4b, L"flipLabel", XFA_ELEMENT_FlipLabel, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0x900280b7, L"exData", XFA_ELEMENT_ExData,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0x91e80352, L"dayNames", XFA_ELEMENT_DayNames, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_Node},
-    {0x93113b11, L"soapAction", XFA_ELEMENT_SoapAction,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
-    {0x938b09f6, L"defaultTypeface", XFA_ELEMENT_DefaultTypeface,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
-    {0x95b37897, L"manifest", XFA_ELEMENT_Manifest,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x97b76b54, L"overflow", XFA_ELEMENT_Overflow,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x9a57861b, L"linear", XFA_ELEMENT_Linear,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0x9ad5a821, L"currencySymbol", XFA_ELEMENT_CurrencySymbol,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0x9c6471b3, L"delete", XFA_ELEMENT_Delete, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0x9deea61d, L"deltas", XFA_ELEMENT_Deltas, XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_OrdinaryObject},
-    {0x9e67de21, L"digestMethod", XFA_ELEMENT_DigestMethod,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
-    {0x9f3e9510, L"instanceManager", XFA_ELEMENT_InstanceManager,
-     XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xa0799892, L"equateRange", XFA_ELEMENT_EquateRange, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xa084a381, L"medium", XFA_ELEMENT_Medium,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xa1211b8b, L"textEdit", XFA_ELEMENT_TextEdit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xa17008f0, L"templateCache", XFA_ELEMENT_TemplateCache,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_Node},
-    {0xa4f7b88f, L"compressObjectStream", XFA_ELEMENT_CompressObjectStream,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xa65f5d17, L"dataValue", XFA_ELEMENT_DataValue, XFA_XDPPACKET_Datasets,
-     XFA_OBJECTTYPE_Node},
-    {0xa6caaa89, L"accessibleContent", XFA_ELEMENT_AccessibleContent,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xa8c7d5e2, L"nodeList", XFA_ELEMENT_NodeList, XFA_XDPPACKET_XDP,
-     XFA_OBJECTTYPE_NodeList},
-    {0xa94cc00b, L"includeXDPContent", XFA_ELEMENT_IncludeXDPContent,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xa9b081a1, L"xmlConnection", XFA_ELEMENT_XmlConnection,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
-    {0xab2a3b74, L"validateApprovalSignatures",
-     XFA_ELEMENT_ValidateApprovalSignatures, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xab8c5a2b, L"signData", XFA_ELEMENT_SignData,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xabaa2ceb, L"packets", XFA_ELEMENT_Packets, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xadba359c, L"datePattern", XFA_ELEMENT_DatePattern,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0xae222b2b, L"duplexOption", XFA_ELEMENT_DuplexOption,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xb012effb, L"base", XFA_ELEMENT_Base, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xb0e5485d, L"bind", XFA_ELEMENT_Bind,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_Node},
-    {0xb45d61b2, L"compression", XFA_ELEMENT_Compression, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xb563f0ff, L"user", XFA_ELEMENT_User, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0xb5848ad5, L"rectangle", XFA_ELEMENT_Rectangle,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xb6dacb72, L"effectiveOutputPolicy", XFA_ELEMENT_EffectiveOutputPolicy,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
-    {0xb7d7654d, L"ADBE_JSDebugger", XFA_ELEMENT_ADBE_JSDebugger,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xbab37f73, L"acrobat7", XFA_ELEMENT_Acrobat7, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xbc70081e, L"interactive", XFA_ELEMENT_Interactive, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xbc8fa350, L"locale", XFA_ELEMENT_Locale,
-     XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0xbcd44940, L"currentPage", XFA_ELEMENT_CurrentPage, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xbde9abda, L"data", XFA_ELEMENT_Data, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xbde9abde, L"date", XFA_ELEMENT_Date,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0xbe52dfbf, L"desc", XFA_ELEMENT_Desc,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xbf4b6405, L"encrypt", XFA_ELEMENT_Encrypt,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xbfa87cce, L"draw", XFA_ELEMENT_Draw,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0xc181ff4b, L"encryption", XFA_ELEMENT_Encryption, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc1970f40, L"meridiemNames", XFA_ELEMENT_MeridiemNames,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0xc5ad9f5e, L"messaging", XFA_ELEMENT_Messaging, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc69549f4, L"speak", XFA_ELEMENT_Speak,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0xc7743dc7, L"dataGroup", XFA_ELEMENT_DataGroup, XFA_XDPPACKET_Datasets,
-     XFA_OBJECTTYPE_Node},
-    {0xc7eb20e9, L"common", XFA_ELEMENT_Common, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xc85d4528, L"#text", XFA_ELEMENT_Sharptext,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_LocaleSet |
-         XFA_XDPPACKET_ConnectionSet | XFA_XDPPACKET_SourceSet |
-         XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_NodeV},
-    {0xc861556a, L"paginationOverride", XFA_ELEMENT_PaginationOverride,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xc903dabb, L"reasons", XFA_ELEMENT_Reasons,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xc9a8127f, L"signatureProperties", XFA_ELEMENT_SignatureProperties,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xca010c2d, L"threshold", XFA_ELEMENT_Threshold, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xcb4c5e96, L"appearanceFilter", XFA_ELEMENT_AppearanceFilter,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
-    {0xcc92aba7, L"fill", XFA_ELEMENT_Fill,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xcd308b77, L"font", XFA_ELEMENT_Font,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Config | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_Node},
-    {0xcd309ff4, L"form", XFA_ELEMENT_Form, XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_ModelNode},
-    {0xcebcca2d, L"mediumInfo", XFA_ELEMENT_MediumInfo, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xcfe0d643, L"certificate", XFA_ELEMENT_Certificate,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_TextNode},
-    {0xd012c033, L"password", XFA_ELEMENT_Password, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_TextNode},
-    {0xd01604bd, L"runScripts", XFA_ELEMENT_RunScripts, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xd1227e6f, L"trace", XFA_ELEMENT_Trace, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xd1532876, L"float", XFA_ELEMENT_Float,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0xd17a6c30, L"renderPolicy", XFA_ELEMENT_RenderPolicy,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xd4bf6823, L"logPseudoModel", XFA_ELEMENT_LogPseudoModel,
-     XFA_XDPPACKET_XDP, XFA_OBJECTTYPE_OrdinaryObject},
-    {0xd58aa962, L"destination", XFA_ELEMENT_Destination, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xd6e27f1d, L"value", XFA_ELEMENT_Value,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xd7a14462, L"bookend", XFA_ELEMENT_Bookend,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xd8c31254, L"exObject", XFA_ELEMENT_ExObject,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xda6a8590, L"openAction", XFA_ELEMENT_OpenAction, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xdab4fb7d, L"neverEmbed", XFA_ELEMENT_NeverEmbed, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xdb98475f, L"bindItems", XFA_ELEMENT_BindItems,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xdbfbe02e, L"calculate", XFA_ELEMENT_Calculate,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xdd7676ed, L"print", XFA_ELEMENT_Print, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xdde273d7, L"extras", XFA_ELEMENT_Extras,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_Node},
-    {0xde146b34, L"proto", XFA_ELEMENT_Proto,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xdf059321, L"dSigData", XFA_ELEMENT_DSigData,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xdfccf030, L"creator", XFA_ELEMENT_Creator, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xdff78c6a, L"connect", XFA_ELEMENT_Connect,
-     XFA_XDPPACKET_SourceSet | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form,
-     XFA_OBJECTTYPE_Node},
-    {0xe11a2cbc, L"permissions", XFA_ELEMENT_Permissions, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xe14c801c, L"connectionSet", XFA_ELEMENT_ConnectionSet,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_ModelNode},
-    {0xe1c83a14, L"submit", XFA_ELEMENT_Submit,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xe29821cd, L"range", XFA_ELEMENT_Range, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xe38d83c7, L"linearized", XFA_ELEMENT_Linearized, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xe3aa2578, L"packet", XFA_ELEMENT_Packet, XFA_XDPPACKET_XDP,
-     XFA_OBJECTTYPE_NodeC},
-    {0xe3aa860e, L"rootElement", XFA_ELEMENT_RootElement,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_TextNode},
-    {0xe3e553fa, L"plaintextMetadata", XFA_ELEMENT_PlaintextMetadata,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xe3e6e4f2, L"numberSymbols", XFA_ELEMENT_NumberSymbols,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0xe3f067f6, L"printHighQuality", XFA_ELEMENT_PrintHighQuality,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xe3fd078c, L"driver", XFA_ELEMENT_Driver, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xe48b34f2, L"incrementalLoad", XFA_ELEMENT_IncrementalLoad,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_NodeV},
-    {0xe550e7c2, L"subjectDN", XFA_ELEMENT_SubjectDN,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_NodeC},
-    {0xe6669a78, L"compressLogicalStructure",
-     XFA_ELEMENT_CompressLogicalStructure, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xe7a7ea02, L"incrementalMerge", XFA_ELEMENT_IncrementalMerge,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xe948530d, L"radial", XFA_ELEMENT_Radial,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xea8d6999, L"variables", XFA_ELEMENT_Variables,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContainerNode},
-    {0xeaa142c0, L"timePatterns", XFA_ELEMENT_TimePatterns,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_Node},
-    {0xeb943a71, L"effectiveInputPolicy", XFA_ELEMENT_EffectiveInputPolicy,
-     XFA_XDPPACKET_ConnectionSet, XFA_OBJECTTYPE_Node},
-    {0xef04a2bc, L"nameAttr", XFA_ELEMENT_NameAttr, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xf07222ab, L"conformance", XFA_ELEMENT_Conformance, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xf0aaaadc, L"transform", XFA_ELEMENT_Transform, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_Node},
-    {0xf1433e88, L"lockDocument", XFA_ELEMENT_LockDocument,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_ContentNode},
-    {0xf54eb997, L"breakAfter", XFA_ELEMENT_BreakAfter,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xf616da28, L"line", XFA_ELEMENT_Line,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xf616f3dc, L"list", XFA_ELEMENT_List, XFA_XDPPACKET_XDP,
-     XFA_OBJECTTYPE_OrdinaryList},
-    {0xf7055fb1, L"source", XFA_ELEMENT_Source, XFA_XDPPACKET_SourceSet,
-     XFA_OBJECTTYPE_Node},
-    {0xf7eebe1c, L"occur", XFA_ELEMENT_Occur,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-    {0xf8d10d97, L"pickTrayByPDFSize", XFA_ELEMENT_PickTrayByPDFSize,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xf8f19e3a, L"monthNames", XFA_ELEMENT_MonthNames, XFA_XDPPACKET_LocaleSet,
-     XFA_OBJECTTYPE_Node},
-    {0xf984149b, L"severity", XFA_ELEMENT_Severity, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xf9bcb037, L"groupParent", XFA_ELEMENT_GroupParent, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_NodeV},
-    {0xfbc42fff, L"documentAssembly", XFA_ELEMENT_DocumentAssembly,
-     XFA_XDPPACKET_Config, XFA_OBJECTTYPE_ContentNode},
-    {0xfc78159f, L"numberSymbol", XFA_ELEMENT_NumberSymbol,
-     XFA_XDPPACKET_LocaleSet, XFA_OBJECTTYPE_ContentNode},
-    {0xfcbd606c, L"tagged", XFA_ELEMENT_Tagged, XFA_XDPPACKET_Config,
-     XFA_OBJECTTYPE_ContentNode},
-    {0xff063802, L"items", XFA_ELEMENT_Items,
-     XFA_XDPPACKET_Template | XFA_XDPPACKET_Form, XFA_OBJECTTYPE_Node},
-};
-const int32_t g_iXFAElementCount =
-    sizeof(g_XFAElementData) / sizeof(XFA_ELEMENTINFO);
-const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[] = {
-    {0, 8},    {8, 0},   {8, 14},   {22, 0},   {22, 0},   {22, 6},   {28, 0},
-    {28, 0},   {28, 1},  {29, 3},   {32, 0},   {32, 0},   {32, 0},   {32, 3},
-    {35, 1},   {36, 0},  {36, 0},   {36, 2},   {38, 0},   {38, 0},   {38, 0},
-    {38, 4},   {42, 0},  {42, 0},   {42, 1},   {43, 0},   {43, 8},   {51, 19},
-    {70, 0},   {70, 0},  {70, 2},   {72, 1},   {73, 0},   {73, 2},   {75, 4},
-    {79, 1},   {80, 1},  {81, 0},   {81, 0},   {81, 3},   {84, 0},   {84, 4},
-    {88, 4},   {92, 1},  {93, 0},   {93, 4},   {97, 9},   {106, 14}, {120, 0},
-    {120, 0},  {120, 5}, {125, 0},  {125, 1},  {126, 0},  {126, 0},  {126, 0},
-    {126, 0},  {126, 0}, {126, 1},  {127, 0},  {127, 0},  {127, 0},  {127, 0},
-    {127, 0},  {127, 0}, {127, 0},  {127, 6},  {133, 1},  {134, 0},  {134, 1},
-    {135, 0},  {135, 0}, {135, 1},  {136, 2},  {138, 5},  {143, 2},  {145, 0},
-    {145, 0},  {145, 0}, {145, 0},  {145, 0},  {145, 5},  {150, 0},  {150, 0},
-    {150, 0},  {150, 0}, {150, 0},  {150, 0},  {150, 0},  {150, 2},  {152, 0},
-    {152, 0},  {152, 0}, {152, 17}, {169, 0},  {169, 1},  {170, 0},  {170, 0},
-    {170, 2},  {172, 0}, {172, 0},  {172, 1},  {173, 0},  {173, 0},  {173, 2},
-    {175, 2},  {177, 0}, {177, 0},  {177, 0},  {177, 11}, {188, 0},  {188, 0},
-    {188, 0},  {188, 0}, {188, 0},  {188, 4},  {192, 3},  {195, 0},  {195, 0},
-    {195, 0},  {195, 0}, {195, 0},  {195, 0},  {195, 9},  {204, 0},  {204, 0},
-    {204, 17}, {221, 0}, {221, 0},  {221, 0},  {221, 0},  {221, 0},  {221, 0},
-    {221, 0},  {221, 0}, {221, 0},  {221, 4},  {225, 0},  {225, 0},  {225, 0},
-    {225, 0},  {225, 2}, {227, 3},  {230, 0},  {230, 0},  {230, 2},  {232, 0},
-    {232, 1},  {233, 2}, {235, 2},  {237, 0},  {237, 0},  {237, 2},  {239, 0},
-    {239, 1},  {240, 1}, {241, 2},  {243, 0},  {243, 3},  {246, 4},  {250, 0},
-    {250, 1},  {251, 2}, {253, 0},  {253, 0},  {253, 0},  {253, 0},  {253, 0},
-    {253, 0},  {253, 0}, {253, 0},  {253, 0},  {253, 0},  {253, 2},  {255, 2},
-    {257, 0},  {257, 6}, {263, 5},  {268, 0},  {268, 0},  {268, 0},  {268, 3},
-    {271, 0},  {271, 0}, {271, 3},  {274, 4},  {278, 0},  {278, 0},  {278, 4},
-    {282, 0},  {282, 0}, {282, 5},  {287, 0},  {287, 5},  {292, 0},  {292, 0},
-    {292, 0},  {292, 1}, {293, 0},  {293, 0},  {293, 1},  {294, 0},  {294, 2},
-    {296, 0},  {296, 0}, {296, 0},  {296, 0},  {296, 1},  {297, 0},  {297, 0},
-    {297, 4},  {301, 0}, {301, 0},  {301, 0},  {301, 0},  {301, 0},  {301, 0},
-    {301, 1},  {302, 0}, {302, 2},  {304, 0},  {304, 0},  {304, 0},  {304, 0},
-    {304, 1},  {305, 4}, {309, 0},  {309, 3},  {312, 0},  {312, 0},  {312, 1},
-    {313, 0},  {313, 8}, {321, 0},  {321, 10}, {331, 0},  {331, 10}, {341, 1},
-    {342, 12}, {354, 3}, {357, 1},  {358, 0},  {358, 0},  {358, 0},  {358, 8},
-    {366, 0},  {366, 0}, {366, 0},  {366, 0},  {366, 0},  {366, 0},  {366, 7},
-    {373, 2},  {375, 0}, {375, 1},  {376, 0},  {376, 0},  {376, 0},  {376, 0},
-    {376, 0},  {376, 0}, {376, 0},  {376, 0},  {376, 13}, {389, 0},  {389, 1},
-    {390, 1},  {391, 0}, {391, 0},  {391, 3},  {394, 0},  {394, 0},  {394, 0},
-    {394, 0},  {394, 0}, {394, 4},  {398, 9},  {407, 0},  {407, 1},  {408, 0},
-    {408, 0},  {408, 0}, {408, 0},  {408, 0},  {408, 1},  {409, 0},  {409, 2},
-    {411, 0},  {411, 0}, {411, 0},  {411, 0},  {411, 2},  {413, 0},  {413, 1},
-    {414, 0},  {414, 0}, {414, 0},  {414, 7},  {421, 0},  {421, 1},  {422, 1},
-    {423, 0},  {423, 1}, {424, 1},  {425, 0},  {425, 1},  {426, 0},  {426, 0},
-    {426, 0},  {426, 0}, {426, 0},  {426, 0},
-};
-const XFA_PROPERTY g_XFAElementPropertyData[] = {
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Jog, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_BatchOutput, 1, 0},
-    {XFA_ELEMENT_OutputBin, 1, 0},
-    {XFA_ELEMENT_Compress, 1, 0},
-    {XFA_ELEMENT_Staple, 1, 0},
-    {XFA_ELEMENT_MediumInfo, 1, 0},
-    {XFA_ELEMENT_CheckButton, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_ChoiceList, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_DefaultUi, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Barcode, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Button, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_DateTimeEdit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_ImageEdit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_PasswordEdit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_NumericEdit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Signature, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_TextEdit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_ExObject, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Break, 1, 0},
-    {XFA_ELEMENT_Overflow, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Bookend, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Occur, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_SubsetBelow, 1, 0},
-    {XFA_ELEMENT_Map, 1, 0},
-    {XFA_ELEMENT_Embed, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_DatePattern, 4, 0},
-    {XFA_ELEMENT_Edge, 1, 0},
-    {XFA_ELEMENT_Fill, 1, 0},
-    {XFA_ELEMENT_To, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Mode, 1, 0},
-    {XFA_ELEMENT_Threshold, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Jog, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_BatchOutput, 1, 0},
-    {XFA_ELEMENT_PageOffset, 1, 0},
-    {XFA_ELEMENT_OutputBin, 1, 0},
-    {XFA_ELEMENT_Staple, 1, 0},
-    {XFA_ELEMENT_MediumInfo, 1, 0},
-    {XFA_ELEMENT_AdobeExtensionLevel, 1, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_Pdfa, 1, 0},
-    {XFA_ELEMENT_BatchOutput, 1, 0},
-    {XFA_ELEMENT_ViewerPreferences, 1, 0},
-    {XFA_ELEMENT_ScriptModel, 1, 0},
-    {XFA_ELEMENT_Version, 1, 0},
-    {XFA_ELEMENT_SubmitFormat, 1, 0},
-    {XFA_ELEMENT_SilentPrint, 1, 0},
-    {XFA_ELEMENT_Producer, 1, 0},
-    {XFA_ELEMENT_Compression, 1, 0},
-    {XFA_ELEMENT_Interactive, 1, 0},
-    {XFA_ELEMENT_Encryption, 1, 0},
-    {XFA_ELEMENT_RenderPolicy, 1, 0},
-    {XFA_ELEMENT_OpenAction, 1, 0},
-    {XFA_ELEMENT_Creator, 1, 0},
-    {XFA_ELEMENT_Linearized, 1, 0},
-    {XFA_ELEMENT_Tagged, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Xsl, 1, 0},
-    {XFA_ELEMENT_Packets, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Debug, 1, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_BatchOutput, 1, 0},
-    {XFA_ELEMENT_FlipLabel, 1, 0},
-    {XFA_ELEMENT_TemplateCache, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_BatchOutput, 1, 0},
-    {XFA_ELEMENT_FlipLabel, 1, 0},
-    {XFA_ELEMENT_EraNames, 1, 0},
-    {XFA_ELEMENT_DayNames, 2, 0},
-    {XFA_ELEMENT_MeridiemNames, 1, 0},
-    {XFA_ELEMENT_MonthNames, 2, 0},
-    {XFA_ELEMENT_Hyphenation, 1, 0},
-    {XFA_ELEMENT_Amd, 1, 0},
-    {XFA_ELEMENT_Part, 1, 0},
-    {XFA_ELEMENT_IncludeXDPContent, 1, 0},
-    {XFA_ELEMENT_Conformance, 1, 0},
-    {XFA_ELEMENT_Mdp, 1, 0},
-    {XFA_ELEMENT_Certificates, 1, 0},
-    {XFA_ELEMENT_TimeStamp, 1, 0},
-    {XFA_ELEMENT_Handler, 1, 0},
-    {XFA_ELEMENT_DigestMethods, 1, 0},
-    {XFA_ELEMENT_Encodings, 1, 0},
-    {XFA_ELEMENT_Reasons, 1, 0},
-    {XFA_ELEMENT_AppearanceFilter, 1, 0},
-    {XFA_ELEMENT_LockDocument, 1, 0},
-    {XFA_ELEMENT_Xdp, 1, 0},
-    {XFA_ELEMENT_Cache, 1, 0},
-    {XFA_ELEMENT_Pagination, 1, 0},
-    {XFA_ELEMENT_Overprint, 1, 0},
-    {XFA_ELEMENT_BehaviorOverride, 1, 0},
-    {XFA_ELEMENT_Copies, 1, 0},
-    {XFA_ELEMENT_Output, 1, 0},
-    {XFA_ELEMENT_Validate, 1, 0},
-    {XFA_ELEMENT_Layout, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_Common, 1, 0},
-    {XFA_ELEMENT_PaginationOverride, 1, 0},
-    {XFA_ELEMENT_Destination, 1, 0},
-    {XFA_ELEMENT_IncrementalMerge, 1, 0},
-    {XFA_ELEMENT_Execute, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Script, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_SignData, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Submit, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_CurrencySymbol, 3, 0},
-    {XFA_ELEMENT_Operation, 1, 0},
-    {XFA_ELEMENT_WsdlAddress, 1, 0},
-    {XFA_ELEMENT_SoapAddress, 1, 0},
-    {XFA_ELEMENT_SoapAction, 1, 0},
-    {XFA_ELEMENT_EffectiveOutputPolicy, 1, 0},
-    {XFA_ELEMENT_EffectiveInputPolicy, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Era, 2, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Edge, 4, 0},
-    {XFA_ELEMENT_Corner, 4, 0},
-    {XFA_ELEMENT_Fill, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_KeyUsage, 1, 0},
-    {XFA_ELEMENT_SubjectDNs, 1, 0},
-    {XFA_ELEMENT_Issuers, 1, 0},
-    {XFA_ELEMENT_Signing, 1, 0},
-    {XFA_ELEMENT_Oids, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Ui, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Para, 1, 0},
-    {XFA_ELEMENT_Format, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Assist, 1, 0},
-    {XFA_ELEMENT_Traversal, 1, 0},
-    {XFA_ELEMENT_Keep, 1, 0},
-    {XFA_ELEMENT_Validate, 1, 0},
-    {XFA_ELEMENT_Caption, 1, 0},
-    {XFA_ELEMENT_Bind, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Font, 1, 0},
-    {XFA_ELEMENT_Value, 1, 0},
-    {XFA_ELEMENT_Calculate, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Items, 2, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Para, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Assist, 1, 0},
-    {XFA_ELEMENT_Traversal, 1, 0},
-    {XFA_ELEMENT_Validate, 1, 0},
-    {XFA_ELEMENT_Caption, 1, 0},
-    {XFA_ELEMENT_Bind, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Calculate, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Comb, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Present, 1, 0},
-    {XFA_ELEMENT_Acrobat, 1, 0},
-    {XFA_ELEMENT_Trace, 1, 0},
-    {XFA_ELEMENT_PrintScaling, 1, 0},
-    {XFA_ELEMENT_Enforce, 1, 0},
-    {XFA_ELEMENT_NumberOfCopies, 1, 0},
-    {XFA_ELEMENT_PageRange, 1, 0},
-    {XFA_ELEMENT_AddViewerPreferences, 1, 0},
-    {XFA_ELEMENT_ADBE_JSConsole, 1, 0},
-    {XFA_ELEMENT_DuplexOption, 1, 0},
-    {XFA_ELEMENT_ADBE_JSDebugger, 1, 0},
-    {XFA_ELEMENT_PickTrayByPDFSize, 1, 0},
-    {XFA_ELEMENT_Break, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Para, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Assist, 1, 0},
-    {XFA_ELEMENT_Traversal, 1, 0},
-    {XFA_ELEMENT_Keep, 1, 0},
-    {XFA_ELEMENT_Validate, 1, 0},
-    {XFA_ELEMENT_PageSet, 1, 0},
-    {XFA_ELEMENT_Overflow, 1, 0},
-    {XFA_ELEMENT_Bind, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Bookend, 1, 0},
-    {XFA_ELEMENT_Calculate, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Variables, 1, 0},
-    {XFA_ELEMENT_Occur, 1, 0},
-    {XFA_ELEMENT_Query, 1, 0},
-    {XFA_ELEMENT_Insert, 1, 0},
-    {XFA_ELEMENT_Update, 1, 0},
-    {XFA_ELEMENT_Delete, 1, 0},
-    {XFA_ELEMENT_MsgId, 1, 0},
-    {XFA_ELEMENT_Severity, 1, 0},
-    {XFA_ELEMENT_To, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Type, 1, 0},
-    {XFA_ELEMENT_ToolTip, 1, 0},
-    {XFA_ELEMENT_Speak, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_AddSilentPrint, 1, 0},
-    {XFA_ELEMENT_PrinterName, 1, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_RecordSet, 1, 0},
-    {XFA_ELEMENT_Select, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Message, 1, 0},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_NumberPattern, 4, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Occur, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_RootElement, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Xsl, 1, 0},
-    {XFA_ELEMENT_StartPage, 1, 0},
-    {XFA_ELEMENT_Relevant, 1, 0},
-    {XFA_ELEMENT_Base, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_AutoSave, 1, 0},
-    {XFA_ELEMENT_Validate, 1, 0},
-    {XFA_ELEMENT_ValidateApprovalSignatures, 1, 0},
-    {XFA_ELEMENT_Acrobat7, 1, 0},
-    {XFA_ELEMENT_Common, 1, 0},
-    {XFA_ELEMENT_Exclude, 1, 0},
-    {XFA_ELEMENT_CurrentPage, 1, 0},
-    {XFA_ELEMENT_RunScripts, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Comb, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Medium, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Occur, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Filter, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Manifest, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Para, 1, 0},
-    {XFA_ELEMENT_Font, 1, 0},
-    {XFA_ELEMENT_Value, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Day, 7, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Occur, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Comb, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Filter, 1, 0},
-    {XFA_ELEMENT_Manifest, 1, 0},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_Level, 1, 0},
-    {XFA_ELEMENT_Type, 1, 0},
-    {XFA_ELEMENT_CompressObjectStream, 1, 0},
-    {XFA_ELEMENT_CompressLogicalStructure, 1, 0},
-    {XFA_ELEMENT_Edge, 4, 0},
-    {XFA_ELEMENT_Corner, 4, 0},
-    {XFA_ELEMENT_Fill, 1, 0},
-    {XFA_ELEMENT_DynamicRender, 1, 0},
-    {XFA_ELEMENT_DatePatterns, 1, 0},
-    {XFA_ELEMENT_CalendarSymbols, 1, 0},
-    {XFA_ELEMENT_CurrencySymbols, 1, 0},
-    {XFA_ELEMENT_Typefaces, 1, 0},
-    {XFA_ELEMENT_DateTimeSymbols, 1, 0},
-    {XFA_ELEMENT_NumberPatterns, 1, 0},
-    {XFA_ELEMENT_NumberSymbols, 1, 0},
-    {XFA_ELEMENT_TimePatterns, 1, 0},
-    {XFA_ELEMENT_Uri, 1, 0},
-    {XFA_ELEMENT_Xsl, 1, 0},
-    {XFA_ELEMENT_StartNode, 1, 0},
-    {XFA_ELEMENT_OutputXSL, 1, 0},
-    {XFA_ELEMENT_AdjustData, 1, 0},
-    {XFA_ELEMENT_Attributes, 1, 0},
-    {XFA_ELEMENT_Window, 1, 0},
-    {XFA_ELEMENT_Record, 1, 0},
-    {XFA_ELEMENT_Range, 1, 0},
-    {XFA_ELEMENT_IncrementalLoad, 1, 0},
-    {XFA_ELEMENT_Text, 1, 0},
-    {XFA_ELEMENT_Time, 1, 0},
-    {XFA_ELEMENT_DateTime, 1, 0},
-    {XFA_ELEMENT_Image, 1, 0},
-    {XFA_ELEMENT_Decimal, 1, 0},
-    {XFA_ELEMENT_Boolean, 1, 0},
-    {XFA_ELEMENT_Integer, 1, 0},
-    {XFA_ELEMENT_ExData, 1, 0},
-    {XFA_ELEMENT_Date, 1, 0},
-    {XFA_ELEMENT_Float, 1, 0},
-    {XFA_ELEMENT_Certificate, 1, 0},
-    {XFA_ELEMENT_Ui, 1, 0},
-    {XFA_ELEMENT_Margin, 1, 0},
-    {XFA_ELEMENT_Para, 1, 0},
-    {XFA_ELEMENT_Border, 1, 0},
-    {XFA_ELEMENT_Assist, 1, 0},
-    {XFA_ELEMENT_Traversal, 1, 0},
-    {XFA_ELEMENT_Keep, 1, 0},
-    {XFA_ELEMENT_Caption, 1, 0},
-    {XFA_ELEMENT_Desc, 1, 0},
-    {XFA_ELEMENT_Font, 1, 0},
-    {XFA_ELEMENT_Value, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_EncryptionLevel, 1, 0},
-    {XFA_ELEMENT_Encrypt, 1, 0},
-    {XFA_ELEMENT_Permissions, 1, 0},
-    {XFA_ELEMENT_Meridiem, 2, 0},
-    {XFA_ELEMENT_SuppressBanner, 1, 0},
-    {XFA_ELEMENT_VersionControl, 1, 0},
-    {XFA_ELEMENT_LocaleSet, 1, 0},
-    {XFA_ELEMENT_Template, 1, 0},
-    {XFA_ELEMENT_ValidationMessaging, 1, 0},
-    {XFA_ELEMENT_Locale, 1, 0},
-    {XFA_ELEMENT_Data, 1, 0},
-    {XFA_ELEMENT_Messaging, 1, 0},
-    {XFA_ELEMENT_Pattern, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Solid, 1,
-     XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf},
-    {XFA_ELEMENT_Stipple, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Linear, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Radial, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Fill, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Map, 1, 0},
-    {XFA_ELEMENT_Arc, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Text, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Time, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_DateTime, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Image, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Decimal, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Boolean, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Integer, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_ExData, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Rectangle, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Date, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Float, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Line, 1, XFA_PROPERTYFLAG_OneOf},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Destination, 1, 0},
-    {XFA_ELEMENT_Message, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_ConnectString, 1, 0},
-    {XFA_ELEMENT_User, 1, 0},
-    {XFA_ELEMENT_Password, 1, 0},
-    {XFA_ELEMENT_ModifyAnnots, 1, 0},
-    {XFA_ELEMENT_ContentCopy, 1, 0},
-    {XFA_ELEMENT_FormFieldFilling, 1, 0},
-    {XFA_ELEMENT_Change, 1, 0},
-    {XFA_ELEMENT_AccessibleContent, 1, 0},
-    {XFA_ELEMENT_Print, 1, 0},
-    {XFA_ELEMENT_PlaintextMetadata, 1, 0},
-    {XFA_ELEMENT_PrintHighQuality, 1, 0},
-    {XFA_ELEMENT_DocumentAssembly, 1, 0},
-    {XFA_ELEMENT_Encrypt, 1, 0},
-    {XFA_ELEMENT_NumberSymbol, 5, 0},
-    {XFA_ELEMENT_FontInfo, 1, 0},
-    {XFA_ELEMENT_Xdc, 1, 0},
-    {XFA_ELEMENT_Color, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_TimePattern, 4, 0},
-    {XFA_ELEMENT_Whitespace, 1, 0},
-    {XFA_ELEMENT_Rename, 1, 0},
-    {XFA_ELEMENT_IfEmpty, 1, 0},
-    {XFA_ELEMENT_Presence, 1, 0},
-    {XFA_ELEMENT_Picture, 1, 0},
-    {XFA_ELEMENT_NameAttr, 1, 0},
-    {XFA_ELEMENT_GroupParent, 1, 0},
-    {XFA_ELEMENT_Script, 1, 0},
-    {XFA_ELEMENT_Edge, 1, 0},
-    {XFA_ELEMENT_Connect, 1, 0},
-    {XFA_ELEMENT_Extras, 1, 0},
-    {XFA_ELEMENT_Month, 12, 0},
-};
-const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[] = {
-    {0, 0},   {0, 0},   {0, 0},   {0, 1},    {1, 0},   {1, 4},    {5, 0},
-    {5, 0},   {5, 0},   {5, 3},   {8, 0},    {8, 0},   {8, 0},    {8, 0},
-    {8, 0},   {8, 1},   {9, 0},   {9, 0},    {9, 0},   {9, 0},    {9, 0},
-    {9, 0},   {9, 2},   {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
-    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
-    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 0},   {11, 0},
-    {11, 0},  {11, 0},  {11, 0},  {11, 0},   {11, 0},  {11, 8},   {19, 0},
-    {19, 0},  {19, 0},  {19, 0},  {19, 0},   {19, 0},  {19, 0},   {19, 0},
-    {19, 0},  {19, 0},  {19, 0},  {19, 0},   {19, 0},  {19, 0},   {19, 1},
-    {20, 1},  {21, 1},  {22, 0},  {22, 0},   {22, 0},  {22, 0},   {22, 0},
-    {22, 0},  {22, 0},  {22, 0},  {22, 0},   {22, 0},  {22, 7},   {29, 0},
-    {29, 0},  {29, 0},  {29, 0},  {29, 0},   {29, 0},  {29, 1},   {30, 1},
-    {31, 0},  {31, 0},  {31, 0},  {31, 0},   {31, 0},  {31, 0},   {31, 0},
-    {31, 0},  {31, 0},  {31, 4},  {35, 2},   {37, 0},  {37, 0},   {37, 0},
-    {37, 0},  {37, 0},  {37, 0},  {37, 0},   {37, 0},  {37, 0},   {37, 0},
-    {37, 0},  {37, 0},  {37, 0},  {37, 0},   {37, 4},  {41, 0},   {41, 0},
-    {41, 0},  {41, 0},  {41, 0},  {41, 0},   {41, 2},  {43, 0},   {43, 0},
-    {43, 0},  {43, 0},  {43, 0},  {43, 0},   {43, 0},  {43, 0},   {43, 0},
-    {43, 13}, {56, 0},  {56, 0},  {56, 1},   {57, 0},  {57, 0},   {57, 0},
-    {57, 0},  {57, 0},  {57, 0},  {57, 0},   {57, 0},  {57, 0},   {57, 0},
-    {57, 0},  {57, 1},  {58, 0},  {58, 1},   {59, 0},  {59, 0},   {59, 0},
-    {59, 1},  {60, 0},  {60, 0},  {60, 0},   {60, 0},  {60, 0},   {60, 0},
-    {60, 0},  {60, 0},  {60, 1},  {61, 0},   {61, 0},  {61, 0},   {61, 1},
-    {62, 0},  {62, 2},  {64, 0},  {64, 0},   {64, 0},  {64, 0},   {64, 0},
-    {64, 0},  {64, 0},  {64, 0},  {64, 0},   {64, 0},  {64, 0},   {64, 0},
-    {64, 1},  {65, 1},  {66, 1},  {67, 0},   {67, 1},  {68, 0},   {68, 0},
-    {68, 0},  {68, 0},  {68, 0},  {68, 0},   {68, 0},  {68, 0},   {68, 6},
-    {74, 0},  {74, 1},  {75, 0},  {75, 0},   {75, 0},  {75, 0},   {75, 0},
-    {75, 0},  {75, 0},  {75, 0},  {75, 0},   {75, 1},  {76, 0},   {76, 0},
-    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
-    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
-    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
-    {76, 0},  {76, 0},  {76, 0},  {76, 0},   {76, 0},  {76, 0},   {76, 0},
-    {76, 0},  {76, 0},  {76, 0},  {76, 2},   {78, 0},  {78, 0},   {78, 0},
-    {78, 1},  {79, 0},  {79, 0},  {79, 1},   {80, 0},  {80, 0},   {80, 1},
-    {81, 0},  {81, 0},  {81, 1},  {82, 0},   {82, 0},  {82, 0},   {82, 0},
-    {82, 0},  {82, 0},  {82, 0},  {82, 0},   {82, 0},  {82, 0},   {82, 1},
-    {83, 0},  {83, 0},  {83, 0},  {83, 0},   {83, 0},  {83, 0},   {83, 11},
-    {94, 0},  {94, 0},  {94, 0},  {94, 0},   {94, 0},  {94, 11},  {105, 106},
-    {211, 0}, {211, 0}, {211, 1}, {212, 0},  {212, 3}, {215, 1},  {216, 0},
-    {216, 0}, {216, 0}, {216, 0}, {216, 0},  {216, 0}, {216, 0},  {216, 0},
-    {216, 0}, {216, 0}, {216, 0}, {216, 0},  {216, 0}, {216, 12}, {228, 0},
-    {228, 0}, {228, 0}, {228, 0}, {228, 0},  {228, 0}, {228, 0},  {228, 0},
-    {228, 0}, {228, 2}, {230, 0}, {230, 0},  {230, 0}, {230, 0},  {230, 0},
-    {230, 0}, {230, 0}, {230, 0}, {230, 10},
-};
-const FX_WORD g_XFAElementChildrenData[] = {
-    XFA_ELEMENT_Extras,
-    XFA_ELEMENT_SubformSet,
-    XFA_ELEMENT_BreakBefore,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_BreakAfter,
-    XFA_ELEMENT_AlwaysEmbed,
-    XFA_ELEMENT_DefaultTypeface,
-    XFA_ELEMENT_NeverEmbed,
-    XFA_ELEMENT_Source,
-    XFA_ELEMENT_Equate,
-    XFA_ELEMENT_EquateRange,
-    XFA_ELEMENT_Ps,
-    XFA_ELEMENT_Pcl,
-    XFA_ELEMENT_Pdf,
-    XFA_ELEMENT_Zpl,
-    XFA_ELEMENT_LabelPrinter,
-    XFA_ELEMENT_WebClient,
-    XFA_ELEMENT_SubmitUrl,
-    XFA_ELEMENT_Driver,
-    XFA_ELEMENT_Typeface,
-    XFA_ELEMENT_SubjectDN,
-    XFA_ELEMENT_Certificate,
-    XFA_ELEMENT_SubformSet,
-    XFA_ELEMENT_Area,
-    XFA_ELEMENT_Field,
-    XFA_ELEMENT_ExclGroup,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_Draw,
-    XFA_ELEMENT_ExObject,
-    XFA_ELEMENT_EncryptionMethod,
-    XFA_ELEMENT_Ref,
-    XFA_ELEMENT_Event,
-    XFA_ELEMENT_SetProperty,
-    XFA_ELEMENT_BindItems,
-    XFA_ELEMENT_Connect,
-    XFA_ELEMENT_Pdf,
-    XFA_ELEMENT_Destination,
-    XFA_ELEMENT_Event,
-    XFA_ELEMENT_SetProperty,
-    XFA_ELEMENT_Field,
-    XFA_ELEMENT_Connect,
-    XFA_ELEMENT_Agent,
-    XFA_ELEMENT_PsMap,
-    XFA_ELEMENT_SubformSet,
-    XFA_ELEMENT_BreakBefore,
-    XFA_ELEMENT_Event,
-    XFA_ELEMENT_Area,
-    XFA_ELEMENT_SetProperty,
-    XFA_ELEMENT_Field,
-    XFA_ELEMENT_ExclGroup,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_Draw,
-    XFA_ELEMENT_ExObject,
-    XFA_ELEMENT_Proto,
-    XFA_ELEMENT_Connect,
-    XFA_ELEMENT_BreakAfter,
-    XFA_ELEMENT_Locale,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Font,
-    XFA_ELEMENT_Traverse,
-    XFA_ELEMENT_Map,
-    XFA_ELEMENT_DigestMethod,
-    XFA_ELEMENT_PageSet,
-    XFA_ELEMENT_PageArea,
-    XFA_ELEMENT_Encoding,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_SubmitUrl,
-    XFA_ELEMENT_Certificate,
-    XFA_ELEMENT_Area,
-    XFA_ELEMENT_Field,
-    XFA_ELEMENT_ContentArea,
-    XFA_ELEMENT_ExclGroup,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_Draw,
-    XFA_ELEMENT_Oid,
-    XFA_ELEMENT_Ref,
-    XFA_ELEMENT_ExcludeNS,
-    XFA_ELEMENT_Transform,
-    XFA_ELEMENT_SetProperty,
-    XFA_ELEMENT_Message,
-    XFA_ELEMENT_Log,
-    XFA_ELEMENT_Reason,
-    XFA_ELEMENT_Area,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Time,
-    XFA_ELEMENT_DateTime,
-    XFA_ELEMENT_Image,
-    XFA_ELEMENT_Decimal,
-    XFA_ELEMENT_Boolean,
-    XFA_ELEMENT_Integer,
-    XFA_ELEMENT_ExData,
-    XFA_ELEMENT_Date,
-    XFA_ELEMENT_Float,
-    XFA_ELEMENT_ExObject,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Time,
-    XFA_ELEMENT_DateTime,
-    XFA_ELEMENT_Image,
-    XFA_ELEMENT_Decimal,
-    XFA_ELEMENT_Boolean,
-    XFA_ELEMENT_Integer,
-    XFA_ELEMENT_ExData,
-    XFA_ELEMENT_Date,
-    XFA_ELEMENT_Float,
-    XFA_ELEMENT_Extras,
-    XFA_ELEMENT_Ui,
-    XFA_ELEMENT_SubformSet,
-    XFA_ELEMENT_Break,
-    XFA_ELEMENT_CheckButton,
-    XFA_ELEMENT_Arc,
-    XFA_ELEMENT_Mdp,
-    XFA_ELEMENT_BreakBefore,
-    XFA_ELEMENT_Oid,
-    XFA_ELEMENT_Ref,
-    XFA_ELEMENT_Margin,
-    XFA_ELEMENT_KeyUsage,
-    XFA_ELEMENT_ChoiceList,
-    XFA_ELEMENT_Para,
-    XFA_ELEMENT_Filter,
-    XFA_ELEMENT_Encoding,
-    XFA_ELEMENT_Event,
-    XFA_ELEMENT_DefaultUi,
-    XFA_ELEMENT_Barcode,
-    XFA_ELEMENT_SubjectDNs,
-    XFA_ELEMENT_Issuers,
-    XFA_ELEMENT_Button,
-    XFA_ELEMENT_Format,
-    XFA_ELEMENT_Border,
-    XFA_ELEMENT_Area,
-    XFA_ELEMENT_Hyphenation,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Time,
-    XFA_ELEMENT_Certificates,
-    XFA_ELEMENT_SetProperty,
-    XFA_ELEMENT_DateTime,
-    XFA_ELEMENT_Comb,
-    XFA_ELEMENT_Pattern,
-    XFA_ELEMENT_Field,
-    XFA_ELEMENT_ContentArea,
-    XFA_ELEMENT_Solid,
-    XFA_ELEMENT_Edge,
-    XFA_ELEMENT_Stipple,
-    XFA_ELEMENT_ExclGroup,
-    XFA_ELEMENT_ToolTip,
-    XFA_ELEMENT_Reason,
-    XFA_ELEMENT_Execute,
-    XFA_ELEMENT_DateTimeEdit,
-    XFA_ELEMENT_Image,
-    XFA_ELEMENT_TimeStamp,
-    XFA_ELEMENT_Decimal,
-    XFA_ELEMENT_Subform,
-    XFA_ELEMENT_Handler,
-    XFA_ELEMENT_Boolean,
-    XFA_ELEMENT_Message,
-    XFA_ELEMENT_Assist,
-    XFA_ELEMENT_Picture,
-    XFA_ELEMENT_Traversal,
-    XFA_ELEMENT_Corner,
-    XFA_ELEMENT_Color,
-    XFA_ELEMENT_Keep,
-    XFA_ELEMENT_ImageEdit,
-    XFA_ELEMENT_Validate,
-    XFA_ELEMENT_DigestMethods,
-    XFA_ELEMENT_PageSet,
-    XFA_ELEMENT_Integer,
-    XFA_ELEMENT_Traverse,
-    XFA_ELEMENT_Encodings,
-    XFA_ELEMENT_Signing,
-    XFA_ELEMENT_Script,
-    XFA_ELEMENT_PasswordEdit,
-    XFA_ELEMENT_NumericEdit,
-    XFA_ELEMENT_PageArea,
-    XFA_ELEMENT_Oids,
-    XFA_ELEMENT_Signature,
-    XFA_ELEMENT_Caption,
-    XFA_ELEMENT_ExData,
-    XFA_ELEMENT_Manifest,
-    XFA_ELEMENT_Overflow,
-    XFA_ELEMENT_Linear,
-    XFA_ELEMENT_DigestMethod,
-    XFA_ELEMENT_Medium,
-    XFA_ELEMENT_TextEdit,
-    XFA_ELEMENT_SignData,
-    XFA_ELEMENT_Rectangle,
-    XFA_ELEMENT_Date,
-    XFA_ELEMENT_Desc,
-    XFA_ELEMENT_Encrypt,
-    XFA_ELEMENT_Draw,
-    XFA_ELEMENT_Speak,
-    XFA_ELEMENT_Reasons,
-    XFA_ELEMENT_AppearanceFilter,
-    XFA_ELEMENT_Fill,
-    XFA_ELEMENT_Font,
-    XFA_ELEMENT_Certificate,
-    XFA_ELEMENT_Float,
-    XFA_ELEMENT_Value,
-    XFA_ELEMENT_Bookend,
-    XFA_ELEMENT_ExObject,
-    XFA_ELEMENT_BindItems,
-    XFA_ELEMENT_Calculate,
-    XFA_ELEMENT_Extras,
-    XFA_ELEMENT_Connect,
-    XFA_ELEMENT_Submit,
-    XFA_ELEMENT_SubjectDN,
-    XFA_ELEMENT_Radial,
-    XFA_ELEMENT_Variables,
-    XFA_ELEMENT_LockDocument,
-    XFA_ELEMENT_BreakAfter,
-    XFA_ELEMENT_Line,
-    XFA_ELEMENT_Occur,
-    XFA_ELEMENT_Items,
-    XFA_ELEMENT_Extras,
-    XFA_ELEMENT_WsdlConnection,
-    XFA_ELEMENT_XsdConnection,
-    XFA_ELEMENT_XmlConnection,
-    XFA_ELEMENT_SignData,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Time,
-    XFA_ELEMENT_DateTime,
-    XFA_ELEMENT_Image,
-    XFA_ELEMENT_Decimal,
-    XFA_ELEMENT_Boolean,
-    XFA_ELEMENT_Integer,
-    XFA_ELEMENT_Script,
-    XFA_ELEMENT_ExData,
-    XFA_ELEMENT_Manifest,
-    XFA_ELEMENT_Date,
-    XFA_ELEMENT_Float,
-    XFA_ELEMENT_Command,
-    XFA_ELEMENT_Bind,
-    XFA_ELEMENT_Text,
-    XFA_ELEMENT_Time,
-    XFA_ELEMENT_DateTime,
-    XFA_ELEMENT_Image,
-    XFA_ELEMENT_Decimal,
-    XFA_ELEMENT_Boolean,
-    XFA_ELEMENT_Integer,
-    XFA_ELEMENT_ExData,
-    XFA_ELEMENT_Date,
-    XFA_ELEMENT_Float,
-};
-const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[] = {
-    {0, 3},    {3, 2},    {5, 3},    {8, 10},   {18, 2},   {20, 6},   {26, 2},
-    {28, 1},   {29, 13},  {42, 2},   {44, 1},   {45, 2},   {47, 2},   {49, 7},
-    {56, 0},   {56, 4},   {60, 2},   {62, 7},   {69, 0},   {69, 0},   {69, 2},
-    {71, 2},   {73, 8},   {81, 5},   {86, 8},   {94, 4},   {98, 3},   {101, 3},
-    {104, 3},  {107, 6},  {113, 2},  {115, 2},  {117, 2},  {119, 2},  {121, 3},
-    {124, 2},  {126, 7},  {133, 13}, {146, 2},  {148, 6},  {154, 2},  {156, 3},
-    {159, 1},  {160, 17}, {177, 2},  {179, 2},  {181, 6},  {187, 2},  {189, 2},
-    {191, 3},  {194, 7},  {201, 2},  {203, 3},  {206, 0},  {206, 21}, {227, 1},
-    {228, 3},  {231, 2},  {233, 0},  {233, 2},  {235, 2},  {237, 6},  {243, 0},
-    {243, 4},  {247, 4},  {251, 0},  {251, 2},  {253, 2},  {255, 0},  {255, 0},
-    {255, 2},  {257, 2},  {259, 4},  {263, 3},  {266, 7},  {273, 10}, {283, 9},
-    {292, 6},  {298, 4},  {302, 2},  {304, 2},  {306, 6},  {312, 4},  {316, 3},
-    {319, 2},  {321, 2},  {323, 4},  {327, 4},  {331, 4},  {335, 4},  {339, 2},
-    {341, 2},  {343, 2},  {345, 22}, {367, 3},  {370, 2},  {372, 2},  {374, 2},
-    {376, 9},  {385, 0},  {385, 4},  {389, 3},  {392, 0},  {392, 2},  {394, 7},
-    {401, 4},  {405, 2},  {407, 4},  {411, 0},  {411, 21}, {432, 4},  {436, 3},
-    {439, 4},  {443, 6},  {449, 2},  {451, 5},  {456, 2},  {458, 8},  {466, 1},
-    {467, 2},  {469, 2},  {471, 5},  {476, 0},  {476, 2},  {478, 2},  {480, 6},
-    {486, 26}, {512, 4},  {516, 2},  {518, 2},  {520, 4},  {524, 0},  {524, 2},
-    {526, 2},  {528, 2},  {530, 2},  {532, 5},  {537, 2},  {539, 3},  {542, 2},
-    {544, 4},  {548, 5},  {553, 2},  {555, 0},  {555, 2},  {557, 4},  {561, 5},
-    {566, 3},  {569, 2},  {571, 3},  {574, 0},  {574, 2},  {576, 9},  {585, 2},
-    {587, 5},  {592, 6},  {598, 5},  {603, 4},  {607, 4},  {611, 8},  {619, 4},
-    {623, 0},  {623, 7},  {630, 4},  {634, 4},  {638, 5},  {643, 2},  {645, 2},
-    {647, 4},  {651, 4},  {655, 2},  {657, 2},  {659, 1},  {660, 2},  {662, 5},
-    {667, 4},  {671, 3},  {674, 2},  {676, 2},  {678, 4},  {682, 0},  {682, 9},
-    {691, 2},  {693, 2},  {695, 5},  {700, 4},  {704, 3},  {707, 2},  {709, 10},
-    {719, 2},  {721, 4},  {725, 4},  {729, 2},  {731, 6},  {737, 2},  {739, 2},
-    {741, 9},  {750, 1},  {751, 4},  {755, 3},  {758, 5},  {763, 6},  {769, 4},
-    {773, 1},  {774, 4},  {778, 0},  {778, 3},  {781, 1},  {782, 5},  {787, 10},
-    {797, 7},  {804, 3},  {807, 2},  {809, 5},  {814, 2},  {816, 0},  {816, 2},
-    {818, 2},  {820, 2},  {822, 6},  {828, 2},  {830, 1},  {831, 2},  {833, 2},
-    {835, 8},  {843, 2},  {845, 4},  {849, 4},  {853, 4},  {857, 2},  {859, 2},
-    {861, 2},  {863, 3},  {866, 2},  {868, 2},  {870, 4},  {874, 3},  {877, 5},
-    {882, 20}, {902, 2},  {904, 0},  {904, 2},  {906, 6},  {912, 1},  {913, 2},
-    {915, 1},  {916, 2},  {918, 4},  {922, 2},  {924, 2},  {926, 4},  {930, 4},
-    {934, 20}, {954, 1},  {955, 2},  {957, 4},  {961, 4},  {965, 2},  {967, 2},
-    {969, 4},  {973, 2},  {975, 0},  {975, 2},  {977, 5},  {982, 5},  {987, 8},
-    {995, 2},  {997, 2},  {999, 4},  {1003, 4}, {1007, 2}, {1009, 4}, {1013, 0},
-    {1013, 1}, {1014, 2}, {1016, 9}, {1025, 2}, {1027, 0}, {1027, 8}, {1035, 2},
-    {1037, 2}, {1039, 0}, {1039, 4}, {1043, 2}, {1045, 0}, {1045, 2}, {1047, 3},
-    {1050, 2}, {1052, 5}, {1057, 2}, {1059, 2}, {1061, 4}, {1065, 3}, {1068, 0},
-    {1068, 4}, {1072, 2}, {1074, 2}, {1076, 3}, {1079, 4}, {1083, 8}, {1091, 5},
-    {1096, 0}, {1096, 4}, {1100, 6}, {1106, 2}, {1108, 1}, {1109, 2}, {1111, 2},
-    {1113, 2}, {1115, 1}, {1116, 2}, {1118, 7},
-};
-const uint8_t g_XFAElementAttributeData[] = {
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Max,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_EofAction,
-    XFA_ATTRIBUTE_CursorType,
-    XFA_ATTRIBUTE_LockType,
-    XFA_ATTRIBUTE_BofAction,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_CursorLocation,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Relation,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_BeforeTarget,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_OverflowTarget,
-    XFA_ATTRIBUTE_OverflowLeader,
-    XFA_ATTRIBUTE_OverflowTrailer,
-    XFA_ATTRIBUTE_StartNew,
-    XFA_ATTRIBUTE_BookendTrailer,
-    XFA_ATTRIBUTE_After,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_BookendLeader,
-    XFA_ATTRIBUTE_AfterTarget,
-    XFA_ATTRIBUTE_Before,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_AllowNeutral,
-    XFA_ATTRIBUTE_Mark,
-    XFA_ATTRIBUTE_Shape,
-    XFA_ATTRIBUTE_Size,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_StartAngle,
-    XFA_ATTRIBUTE_SweepAngle,
-    XFA_ATTRIBUTE_Circular,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Hand,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Bind,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_From,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_SignatureType,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Permissions,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_StartNew,
-    XFA_ATTRIBUTE_Trailer,
-    XFA_ATTRIBUTE_TargetType,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_Leader,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_TimeStamp,
-    XFA_ATTRIBUTE_Uuid,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_LeftInset,
-    XFA_ATTRIBUTE_BottomInset,
-    XFA_ATTRIBUTE_TopInset,
-    XFA_ATTRIBUTE_RightInset,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_NonRepudiation,
-    XFA_ATTRIBUTE_EncipherOnly,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_DigitalSignature,
-    XFA_ATTRIBUTE_CrlSign,
-    XFA_ATTRIBUTE_KeyAgreement,
-    XFA_ATTRIBUTE_KeyEncipherment,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_DataEncipherment,
-    XFA_ATTRIBUTE_KeyCertSign,
-    XFA_ATTRIBUTE_DecipherOnly,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Open,
-    XFA_ATTRIBUTE_CommitOn,
-    XFA_ATTRIBUTE_TextEntry,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_HAlign,
-    XFA_ATTRIBUTE_TextIndent,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Widows,
-    XFA_ATTRIBUTE_MarginRight,
-    XFA_ATTRIBUTE_MarginLeft,
-    XFA_ATTRIBUTE_RadixOffset,
-    XFA_ATTRIBUTE_Preserve,
-    XFA_ATTRIBUTE_SpaceBelow,
-    XFA_ATTRIBUTE_VAlign,
-    XFA_ATTRIBUTE_TabDefault,
-    XFA_ATTRIBUTE_TabStops,
-    XFA_ATTRIBUTE_Orphans,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_LineHeight,
-    XFA_ATTRIBUTE_SpaceAbove,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Version,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_AddRevocationInfo,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Listen,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Activity,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_DataRowCount,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_DataPrep,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_TextLocation,
-    XFA_ATTRIBUTE_ModuleWidth,
-    XFA_ATTRIBUTE_PrintCheckDigit,
-    XFA_ATTRIBUTE_ModuleHeight,
-    XFA_ATTRIBUTE_StartChar,
-    XFA_ATTRIBUTE_Truncate,
-    XFA_ATTRIBUTE_WideNarrowRatio,
-    XFA_ATTRIBUTE_ErrorCorrectionLevel,
-    XFA_ATTRIBUTE_UpsMode,
-    XFA_ATTRIBUTE_Checksum,
-    XFA_ATTRIBUTE_CharEncoding,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_DataColumnCount,
-    XFA_ATTRIBUTE_RowColumnRatio,
-    XFA_ATTRIBUTE_DataLength,
-    XFA_ATTRIBUTE_EndChar,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Format,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Output,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Input,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_DataDescription,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Highlight,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Break,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Hand,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Level,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_ColSpan,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_WordCharacterCount,
-    XFA_ATTRIBUTE_Hyphenate,
-    XFA_ATTRIBUTE_ExcludeInitialCap,
-    XFA_ATTRIBUTE_PushCharacterCount,
-    XFA_ATTRIBUTE_RemainCharacterCount,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_ExcludeAllCaps,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Rid,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_MaxChars,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Url,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_CredentialServerPolicy,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_UrlPolicy,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Connection,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_NumberOfCells,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_H,
-    XFA_ATTRIBUTE_W,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_HAlign,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Access,
-    XFA_ATTRIBUTE_Rotate,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_VAlign,
-    XFA_ATTRIBUTE_MaxH,
-    XFA_ATTRIBUTE_MaxW,
-    XFA_ATTRIBUTE_MinH,
-    XFA_ATTRIBUTE_MinW,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_ColSpan,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Locale,
-    XFA_ATTRIBUTE_AnchorType,
-    XFA_ATTRIBUTE_AccessKey,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_H,
-    XFA_ATTRIBUTE_W,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Cap,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Stroke,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Thickness,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Rate,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_SourceBelow,
-    XFA_ATTRIBUTE_OutputBelow,
-    XFA_ATTRIBUTE_SourceAbove,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_H,
-    XFA_ATTRIBUTE_W,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_HAlign,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Access,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_VAlign,
-    XFA_ATTRIBUTE_MaxH,
-    XFA_ATTRIBUTE_MaxW,
-    XFA_ATTRIBUTE_MinH,
-    XFA_ATTRIBUTE_MinW,
-    XFA_ATTRIBUTE_Layout,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_ColSpan,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_AnchorType,
-    XFA_ATTRIBUTE_AccessKey,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Rid,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Scope,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Connection,
-    XFA_ATTRIBUTE_RunAt,
-    XFA_ATTRIBUTE_ExecuteType,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Picker,
-    XFA_ATTRIBUTE_HScrollPolicy,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_ContentType,
-    XFA_ATTRIBUTE_TransferEncoding,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Aspect,
-    XFA_ATTRIBUTE_Href,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Server,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_FracDigits,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_LeadDigits,
-    XFA_ATTRIBUTE_H,
-    XFA_ATTRIBUTE_W,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_HAlign,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_AllowMacro,
-    XFA_ATTRIBUTE_ColumnWidths,
-    XFA_ATTRIBUTE_Access,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_VAlign,
-    XFA_ATTRIBUTE_MaxH,
-    XFA_ATTRIBUTE_MaxW,
-    XFA_ATTRIBUTE_MinH,
-    XFA_ATTRIBUTE_MinW,
-    XFA_ATTRIBUTE_Layout,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_MergeMode,
-    XFA_ATTRIBUTE_ColSpan,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Locale,
-    XFA_ATTRIBUTE_AnchorType,
-    XFA_ATTRIBUTE_RestoreState,
-    XFA_ATTRIBUTE_Scope,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Timeout,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Mode,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Role,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Stroke,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Inverted,
-    XFA_ATTRIBUTE_Thickness,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Join,
-    XFA_ATTRIBUTE_Radius,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_CSpace,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Next,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Previous,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Intact,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_CommandType,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Data,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_ScriptTest,
-    XFA_ATTRIBUTE_NullTest,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_FormatTest,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Relation,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_DuplexImposition,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_To,
-    XFA_ATTRIBUTE_Force,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_From,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_DataDescription,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Operation,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_BaseProfile,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_ContentType,
-    XFA_ATTRIBUTE_RunAt,
-    XFA_ATTRIBUTE_Binding,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_PasswordChar,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_HScrollPolicy,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_HScrollPolicy,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_PagePosition,
-    XFA_ATTRIBUTE_OddOrEven,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_InitialNumber,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Numbered,
-    XFA_ATTRIBUTE_BlankOrNotBlank,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Reserve,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Placement,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Rid,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_ContentType,
-    XFA_ATTRIBUTE_TransferEncoding,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_MaxLength,
-    XFA_ATTRIBUTE_Href,
-    XFA_ATTRIBUTE_Abbr,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_WritingScript,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Action,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Trailer,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_Leader,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_To,
-    XFA_ATTRIBUTE_UnicodeRange,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_From,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_TrayOut,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Orientation,
-    XFA_ATTRIBUTE_ImagingBBox,
-    XFA_ATTRIBUTE_Short,
-    XFA_ATTRIBUTE_TrayIn,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Stock,
-    XFA_ATTRIBUTE_Long,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_VScrollPolicy,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_AllowRichText,
-    XFA_ATTRIBUTE_MultiLine,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_HScrollPolicy,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_MaxEntries,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_ContentType,
-    XFA_ATTRIBUTE_Contains,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_IsNull,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_DataDescription,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Operation,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_ContentType,
-    XFA_ATTRIBUTE_TransferEncoding,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Match,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Hand,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_H,
-    XFA_ATTRIBUTE_W,
-    XFA_ATTRIBUTE_X,
-    XFA_ATTRIBUTE_Y,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_HAlign,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Rotate,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_VAlign,
-    XFA_ATTRIBUTE_MaxH,
-    XFA_ATTRIBUTE_MaxW,
-    XFA_ATTRIBUTE_MinH,
-    XFA_ATTRIBUTE_MinW,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_ColSpan,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Locale,
-    XFA_ATTRIBUTE_AnchorType,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Rid,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Priority,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Disable,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_LineThrough,
-    XFA_ATTRIBUTE_Typeface,
-    XFA_ATTRIBUTE_FontHorizontalScale,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_KerningMode,
-    XFA_ATTRIBUTE_Underline,
-    XFA_ATTRIBUTE_BaselineShift,
-    XFA_ATTRIBUTE_OverlinePeriod,
-    XFA_ATTRIBUTE_LetterSpacing,
-    XFA_ATTRIBUTE_LineThroughPeriod,
-    XFA_ATTRIBUTE_FontVerticalScale,
-    XFA_ATTRIBUTE_PsName,
-    XFA_ATTRIBUTE_Size,
-    XFA_ATTRIBUTE_Posture,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Weight,
-    XFA_ATTRIBUTE_UnderlinePeriod,
-    XFA_ATTRIBUTE_Overline,
-    XFA_ATTRIBUTE_GenericFamily,
-    XFA_ATTRIBUTE_Checksum,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Relevant,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Override,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Trailer,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Leader,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_CodeType,
-    XFA_ATTRIBUTE_Archive,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_CodeBase,
-    XFA_ATTRIBUTE_ClassId,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Connection,
-    XFA_ATTRIBUTE_LabelRef,
-    XFA_ATTRIBUTE_ValueRef,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Override,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Value,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Timeout,
-    XFA_ATTRIBUTE_Connection,
-    XFA_ATTRIBUTE_Usage,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_DelayedOpen,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Format,
-    XFA_ATTRIBUTE_EmbedPDF,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_TextEncoding,
-    XFA_ATTRIBUTE_XdpContent,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Delimiter,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_StartNew,
-    XFA_ATTRIBUTE_Trailer,
-    XFA_ATTRIBUTE_TargetType,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Target,
-    XFA_ATTRIBUTE_Leader,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Slope,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Hand,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Max,
-    XFA_ATTRIBUTE_Min,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Initial,
-    XFA_ATTRIBUTE_Usehref,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Abbr,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Desc,
-    XFA_ATTRIBUTE_Lock,
-    XFA_ATTRIBUTE_Id,
-    XFA_ATTRIBUTE_Name,
-    XFA_ATTRIBUTE_Ref,
-    XFA_ATTRIBUTE_Use,
-    XFA_ATTRIBUTE_Presence,
-    XFA_ATTRIBUTE_Save,
-    XFA_ATTRIBUTE_Usehref,
-};
-const XFA_PACKETINFO g_XFAPacketData[] = {
-    {0x0, NULL, XFA_XDPPACKET_USER, NULL,
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
-    {0x811929d, L"sourceSet", XFA_XDPPACKET_SourceSet,
-     L"http://www.xfa.org/schema/xfa-source-set/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0xb843dba, L"pdf", XFA_XDPPACKET_Pdf, L"http://ns.adobe.com/xdp/pdf/",
-     XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0xc56afbf, L"xdc", XFA_XDPPACKET_Xdc, L"http://www.xfa.org/schema/xdc/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0xc56afcc, L"xdp", XFA_XDPPACKET_XDP, L"http://ns.adobe.com/xdp/",
-     XFA_XDPPACKET_FLAGS_COMPLETEMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x132a8fbc, L"xmpmeta", XFA_XDPPACKET_Xmpmeta,
-     L"http://ns.adobe.com/xmpmeta/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
-    {0x48d004a8, L"xfdf", XFA_XDPPACKET_Xfdf, L"http://ns.adobe.com/xfdf/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x4e1e39b6, L"config", XFA_XDPPACKET_Config,
-     L"http://www.xfa.org/schema/xci/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x5473b6dc, L"localeSet", XFA_XDPPACKET_LocaleSet,
-     L"http://www.xfa.org/schema/xfa-locale-set/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x6038580a, L"stylesheet", XFA_XDPPACKET_Stylesheet,
-     L"http://www.w3.org/1999/XSL/Transform",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTMANY},
-    {0x803550fc, L"template", XFA_XDPPACKET_Template,
-     L"http://www.xfa.org/schema/xfa-template/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x8b036f32, L"signature", XFA_XDPPACKET_Signature,
-     L"http://www.w3.org/2000/09/xmldsig#",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0x99b95079, L"datasets", XFA_XDPPACKET_Datasets,
-     L"http://www.xfa.org/schema/xfa-data/",
-     XFA_XDPPACKET_FLAGS_PREFIXMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0xcd309ff4, L"form", XFA_XDPPACKET_Form,
-     L"http://www.xfa.org/schema/xfa-form/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-    {0xe14c801c, L"connectionSet", XFA_XDPPACKET_ConnectionSet,
-     L"http://www.xfa.org/schema/xfa-connection-set/",
-     XFA_XDPPACKET_FLAGS_NOMATCH | XFA_XDPPACKET_FLAGS_SUPPORTONE},
-};
-const int32_t g_iXFAPacketCount =
-    sizeof(g_XFAPacketData) / sizeof(XFA_PACKETINFO);
-const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[] = {
-    {0, 0, 0, 2, 316},      {0, 0, 2, 2, 316},       {0, 0, 4, 2, 316},
-    {0, 0, 6, 8, 316},      {0, 0, 14, 4, 316},      {0, 0, 18, 5, 317},
-    {0, 0, 23, 2, 316},     {0, 0, 25, 1, 316},      {0, 0, 26, 12, 316},
-    {0, 0, 38, 2, 316},     {0, 0, 40, 1, 316},      {0, 0, 41, 3, 316},
-    {0, 0, 44, 2, 316},     {0, 0, 46, 6, 316},      {0, 0, 52, 0, 316},
-    {0, 0, 52, 2, 319},     {0, 0, 54, 2, 316},      {0, 0, 56, 6, 316},
-    {0, 0, 62, 0, 316},     {0, 0, 62, 0, 316},      {0, 0, 62, 2, 316},
-    {0, 0, 64, 2, 316},     {0, 0, 66, 6, 316},      {0, 0, 72, 4, 316},
-    {0, 0, 76, 7, 316},     {0, 0, 83, 2, 320},      {0, 0, 85, 3, 316},
-    {0, 0, 88, 3, 316},     {0, 0, 91, 2, 320},      {0, 0, 93, 6, 320},
-    {0, 0, 99, 4, 316},     {0, 0, 103, 2, 316},     {0, 0, 105, 3, 319},
-    {0, 0, 108, 4, 316},    {0, 0, 112, 3, 316},     {0, 0, 115, 2, 316},
-    {0, 0, 117, 6, 316},    {0, 0, 123, 12, 316},    {0, 0, 135, 2, 316},
-    {0, 0, 137, 5, 316},    {0, 0, 142, 2, 316},     {0, 0, 144, 3, 316},
-    {0, 0, 147, 1, 316},    {0, 0, 148, 14, 316},    {0, 0, 162, 2, 316},
-    {0, 0, 164, 2, 316},    {0, 0, 166, 3, 316},     {0, 0, 169, 2, 316},
-    {0, 0, 171, 2, 316},    {0, 0, 173, 2, 316},     {0, 0, 175, 4, 316},
-    {0, 0, 179, 2, 316},    {0, 0, 181, 2, 316},     {0, 0, 183, 0, 319},
-    {0, 0, 183, 20, 316},   {0, 0, 203, 1, 316},     {0, 0, 204, 3, 316},
-    {0, 0, 207, 2, 316},    {0, 0, 209, 0, 316},     {0, 0, 209, 2, 316},
-    {0, 0, 211, 2, 316},    {0, 0, 213, 4, 320},     {0, 0, 217, 0, 316},
-    {0, 0, 217, 1, 316},    {0, 0, 218, 3, 316},     {0, 4, 221, 0, 312},
-    {4, 1, 221, 1, 316},    {5, 0, 222, 2, 316},     {5, 1, 224, 3, -1},
-    {6, 0, 227, 0, 316},    {6, 0, 227, 2, 316},     {6, 0, 229, 2, 316},
-    {6, 0, 231, 3, 316},    {6, 0, 234, 2, 316},     {6, 0, 236, 6, 316},
-    {6, 0, 242, 10, 317},   {6, 0, 252, 9, 316},     {6, 0, 261, 5, 318},
-    {6, 0, 266, 4, 318},    {6, 0, 270, 2, 316},     {6, 0, 272, 2, 316},
-    {6, 0, 274, 5, 316},    {6, 0, 279, 3, 316},     {6, 0, 282, 2, 316},
-    {6, 0, 284, 2, 316},    {6, 0, 286, 2, 316},     {6, 0, 288, 2, 316},
-    {6, 0, 290, 4, 316},    {6, 0, 294, 3, 316},     {6, 0, 297, 3, 316},
-    {6, 0, 300, 2, 316},    {6, 0, 302, 2, 316},     {6, 0, 304, 2, 316},
-    {6, 13, 306, 36, 317},  {19, 0, 342, 3, 316},    {19, 0, 345, 2, 316},
-    {19, 0, 347, 2, 316},   {19, 0, 349, 2, 316},    {19, 0, 351, 7, 317},
-    {19, 2, 358, 16, 312},  {21, 0, 374, 2, 320},    {21, 0, 376, 2, 316},
-    {21, 0, 378, 0, 316},   {21, 0, 378, 2, 316},    {21, 0, 380, 6, 316},
-    {21, 0, 386, 3, 316},   {21, 0, 389, 2, 316},    {21, 0, 391, 4, 316},
-    {21, 0, 395, 0, 316},   {21, 5, 395, 30, 316},   {26, 0, 425, 2, 320},
-    {26, 0, 427, 3, 316},   {26, 0, 430, 2, 320},    {26, 0, 432, 5, 316},
-    {26, 0, 437, 2, 316},   {26, 0, 439, 3, 316},    {26, 0, 442, 2, 316},
-    {26, 0, 444, 8, 316},   {26, 0, 452, 1, 316},    {26, 0, 453, 2, 316},
-    {26, 0, 455, 2, 316},   {26, 0, 457, 4, 316},    {26, 0, 461, 0, 316},
-    {26, 0, 461, 2, 316},   {26, 0, 463, 2, 316},    {26, 0, 465, 6, 318},
-    {26, 5, 471, 31, 317},  {31, 0, 502, 2, 320},    {31, 0, 504, 2, 316},
-    {31, 0, 506, 2, 316},   {31, 0, 508, 4, 320},    {31, 16, 512, 14, 312},
-    {47, 0, 526, 2, 316},   {47, 0, 528, 2, 316},    {47, 0, 530, 2, 316},
-    {47, 0, 532, 2, 316},   {47, 0, 534, 3, 316},    {47, 0, 537, 2, 316},
-    {47, 0, 539, 3, 316},   {47, 0, 542, 3, 316},    {47, 0, 545, 4, 318},
-    {47, 0, 549, 4, 316},   {47, 0, 553, 2, 316},    {47, 0, 555, 0, 316},
-    {47, 0, 555, 2, 316},   {47, 0, 557, 3, 316},    {47, 0, 560, 6, 316},
-    {47, 0, 566, 2, 316},   {47, 0, 568, 2, 316},    {47, 0, 570, 3, 316},
-    {47, 19, 573, 1, 312},  {66, 0, 574, 2, 316},    {66, 0, 576, 8, 316},
-    {66, 0, 584, 2, 316},   {66, 0, 586, 4, 316},    {66, 0, 590, 5, 316},
-    {66, 0, 595, 3, 316},   {66, 0, 598, 2, 320},    {66, 0, 600, 3, 316},
-    {66, 0, 603, 7, 316},   {66, 0, 610, 3, 316},    {66, 0, 613, 0, 316},
-    {66, 0, 613, 4, 317},   {66, 0, 617, 4, 318},    {66, 0, 621, 2, 320},
-    {66, 0, 623, 5, 316},   {66, 0, 628, 2, 316},    {66, 0, 630, 2, 316},
-    {66, 0, 632, 2, 320},   {66, 0, 634, 2, 320},    {66, 0, 636, 4, 316},
-    {66, 0, 640, 2, 316},   {66, 0, 642, 1, 316},    {66, 0, 643, 1, 316},
-    {66, 0, 644, 4, 316},   {66, 0, 648, 3, 316},    {66, 7, 651, 2, 319},
-    {73, 0, 653, 2, 316},   {73, 0, 655, 2, 316},    {73, 0, 657, 3, 316},
-    {73, 4, 660, 4, 312},   {77, 0, 664, 10, 316},   {77, 0, 674, 2, 316},
-    {77, 0, 676, 4, 316},   {77, 0, 680, 4, 316},    {77, 0, 684, 3, 316},
-    {77, 0, 687, 2, 316},   {77, 0, 689, 2, 316},    {77, 0, 691, 8, 317},
-    {77, 0, 699, 3, 316},   {77, 0, 702, 3, 316},    {77, 0, 705, 2, 316},
-    {77, 0, 707, 2, 316},   {77, 0, 709, 5, 316},    {77, 0, 714, 4, 316},
-    {77, 0, 718, 2, 316},   {77, 0, 720, 8, 318},    {77, 0, 728, 1, 316},
-    {77, 0, 729, 2, 320},   {77, 0, 731, 3, 316},    {77, 1, 734, 4, 316},
-    {78, 0, 738, 5, 316},   {78, 0, 743, 3, 316},    {78, 0, 746, 1, 316},
-    {78, 0, 747, 2, 320},   {78, 0, 749, 0, 313},    {78, 0, 749, 2, 316},
-    {78, 5, 751, 3, 316},   {83, 0, 754, 5, 316},    {83, 0, 759, 7, 316},
-    {83, 0, 766, 6, 316},   {83, 0, 772, 3, 316},    {83, 0, 775, 2, 316},
-    {83, 0, 777, 5, 316},   {83, 0, 782, 2, 316},    {83, 0, 784, 0, 314},
-    {83, 0, 784, 2, 316},   {83, 0, 786, 1, 316},    {83, 0, 787, 2, 316},
-    {83, 0, 789, 5, 316},   {83, 0, 794, 2, 316},    {83, 0, 796, 1, 316},
-    {83, 0, 797, 2, 316},   {83, 0, 799, 2, 316},    {83, 0, 801, 6, 316},
-    {83, 0, 807, 2, 316},   {83, 0, 809, 2, 320},    {83, 0, 811, 3, 316},
-    {83, 0, 814, 4, 316},   {83, 0, 818, 2, 316},    {83, 0, 820, 2, 316},
-    {83, 0, 822, 2, 316},   {83, 0, 824, 2, 316},    {83, 0, 826, 2, 316},
-    {83, 0, 828, 2, 316},   {83, 0, 830, 4, 318},    {83, 1, 834, 2, 316},
-    {84, 0, 836, 5, 316},   {84, 0, 841, 20, 317},   {84, 0, 861, 2, 316},
-    {84, 0, 863, 0, 316},   {84, 0, 863, 2, 316},    {84, 0, 865, 4, 320},
-    {84, 0, 869, 0, 316},   {84, 0, 869, 2, 316},    {84, 0, 871, 1, 316},
-    {84, 0, 872, 2, 316},   {84, 0, 874, 3, 316},    {84, 0, 877, 2, 316},
-    {84, 0, 879, 2, 316},   {84, 0, 881, 4, 316},    {84, 0, 885, 3, 316},
-    {84, 0, 888, 17, 316},  {84, 6, 905, 1, 319},    {90, 0, 906, 2, 316},
-    {90, 0, 908, 2, 320},   {90, 0, 910, 2, 320},    {90, 0, 912, 2, 316},
-    {90, 0, 914, 2, 316},   {90, 0, 916, 4, 318},    {90, 0, 920, 2, 316},
-    {90, 5, 922, 0, 312},   {95, 0, 922, 2, 316},    {95, 0, 924, 4, 316},
-    {95, 0, 928, 4, 316},   {95, 0, 932, 6, 316},    {95, 0, 938, 2, 316},
-    {95, 0, 940, 4, 316},   {95, 0, 944, 3, 316},    {95, 0, 947, 3, 316},
-    {95, 0, 950, 2, 316},   {95, 0, 952, 3, 316},    {95, 0, 955, 0, 316},
-    {95, 0, 955, 0, 316},   {95, 0, 955, 2, 316},    {95, 0, 957, 7, 316},
-    {95, 0, 964, 2, 316},   {95, 0, 966, 0, 319},    {95, 0, 966, 7, 316},
-    {95, 0, 973, 2, 316},   {95, 0, 975, 2, 316},    {95, 3, 977, 1, 316},
-    {98, 0, 978, 2, 320},   {98, 0, 980, 4, 316},    {98, 0, 984, 0, 316},
-    {98, 0, 984, 2, 316},   {98, 0, 986, 2, 316},    {98, 0, 988, 4, 316},
-    {98, 0, 992, 1, 316},   {98, 0, 993, 2, 316},    {98, 0, 995, 2, 316},
-    {98, 0, 997, 3, 316},   {98, 0, 1000, 2, 317},   {98, 0, 1002, 0, 316},
-    {98, 0, 1002, 4, 316},  {98, 0, 1006, 4, 316},   {98, 0, 1010, 2, 316},
-    {98, 0, 1012, 3, 316},  {98, 0, 1015, 4, 316},   {98, 0, 1019, 7, 316},
-    {98, 0, 1026, 4, 316},  {98, 0, 1030, 1, 313},   {98, 17, 1031, 3, 316},
-    {115, 0, 1034, 5, 316}, {115, 0, 1039, 2, 316},  {115, 0, 1041, 1, 316},
-    {115, 0, 1042, 4, 316}, {115, 0, 1046, 2, 316},  {115, 0, 1048, 2, 316},
-    {115, 0, 1050, 1, 316}, {115, 0, 1051, 2, 316},  {115, 0, 1053, 5, 316},
-    {115, 0, 1058, 1, -1},  {115, 4, 1059, 1, 312},  {119, 1, 1060, 0, 313},
-    {120, 2, 1060, 8, 312}, {122, 11, 1068, 6, 315}, {133, 2, 1074, 0, 316},
-    {135, 0, 1074, 0, 316}, {135, 3, 1074, 2, 316},  {138, 0, 1076, 2, 316},
-};
-const XFA_METHODINFO g_SomMethodData[] = {
-    {0x3c752495, L"verify", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
-                                Script_SignaturePseudoModel_Verify},
-    {0xa68635f1, L"sign", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
-                              Script_SignaturePseudoModel_Sign},
-    {0xa7f2c5e6, L"enumerate",
-     (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
-         Script_SignaturePseudoModel_Enumerate},
-    {0xd8ed1467, L"clear", (XFA_METHOD_CALLBACK)&CScript_SignaturePseudoModel::
-                               Script_SignaturePseudoModel_Clear},
-    {0x4bdcce13, L"execute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_WsdlConnection_Execute},
-    {0x1c296ba4, L"restore",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Delta_Restore},
-    {0x7d123a9, L"clearItems",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ClearItems},
-    {0xfb0b007, L"execEvent",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecEvent},
-    {0x6716ce97, L"execInitialize",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecInitialize},
-    {0x7bb919c2, L"deleteItem",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_DeleteItem},
-    {0x9f053d5e, L"getSaveItem",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetSaveItem},
-    {0xbbd32747, L"boundItem",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_BoundItem},
-    {0xc492d950, L"getItemState",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetItemState},
-    {0xc6013cd3, L"execCalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecCalculate},
-    {0xd8930d0e, L"setItems",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItems},
-    {0xe0f15045, L"getDisplayItem",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_GetDisplayItem},
-    {0xe23acddc, L"setItemState",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_SetItemState},
-    {0xe2dfb2f8, L"addItem",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_AddItem},
-    {0xef8ce48f, L"execValidate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Field_ExecValidate},
-    {0x461079ef, L"emit", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::
-                              Script_EventPseudoModel_Emit},
-    {0xfec90c63, L"reset", (XFA_METHOD_CALLBACK)&CScript_EventPseudoModel::
-                               Script_EventPseudoModel_Reset},
-    {0xfb0b007, L"execEvent",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecEvent},
-    {0x3d832221, L"selectedMember",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_SelectedMember},
-    {0x6716ce97, L"execInitialize",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecInitialize},
-    {0xc6013cd3, L"execCalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecCalculate},
-    {0xef8ce48f, L"execValidate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ExclGroup_ExecValidate},
-    {0xfb0b007, L"execEvent",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecEvent},
-    {0x6716ce97, L"execInitialize",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecInitialize},
-    {0xc6013cd3, L"execCalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecCalculate},
-    {0xd9b9b1f1, L"getInvalidObjects",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_GetInvalidObjects},
-    {0xef8ce48f, L"execValidate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Subform_ExecValidate},
-    {0xa366b7c, L"exportData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                   Script_HostPseudoModel_ExportData},
-    {0x16cc226c, L"gotoURL", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                 Script_HostPseudoModel_GotoURL},
-    {0x1e0722f5, L"pageDown", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_PageDown},
-    {0x3e66cb2c, L"setFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_SetFocus},
-    {0x4ac9faae, L"openList", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_OpenList},
-    {0x7b89714f, L"response", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_Response},
-    {0x7fd9fd58, L"documentInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_DocumentInBatch},
-    {0xaf1d019d, L"resetData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                   Script_HostPseudoModel_ResetData},
-    {0xb07be13c, L"beep", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                              Script_HostPseudoModel_Beep},
-    {0xb1882ca0, L"getFocus", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_GetFocus},
-    {0xbf4ba9ee, L"messageBox", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                    Script_HostPseudoModel_MessageBox},
-    {0xd6d4dbc1, L"documentCountInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_DocumentCountInBatch},
-    {0xdd7676ed, L"print", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                               Script_HostPseudoModel_Print},
-    {0xe2f863d0, L"currentDateTime",
-     (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_CurrentDateTime},
-    {0xf995d0f5, L"importData", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                    Script_HostPseudoModel_ImportData},
-    {0xfeb96b62, L"pageUp", (XFA_METHOD_CALLBACK)&CScript_HostPseudoModel::
-                                Script_HostPseudoModel_PageUp},
-    {0x68, L"h", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                     Script_LayoutPseudoModel_H},
-    {0x77, L"w", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                     Script_LayoutPseudoModel_W},
-    {0x78, L"x", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                     Script_LayoutPseudoModel_X},
-    {0x79, L"y", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                     Script_LayoutPseudoModel_Y},
-    {0x5460206, L"pageCount", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                                  Script_LayoutPseudoModel_PageCount},
-    {0x5eb5b0f, L"pageSpan", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                                 Script_LayoutPseudoModel_PageSpan},
-    {0x10f1b1bd, L"page", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                              Script_LayoutPseudoModel_Page},
-    {0x1c1e6318, L"pageContent",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_PageContent},
-    {0x1c1f4a5c, L"absPageCount",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_AbsPageCount},
-    {0x1ec47db5, L"absPageCountInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_AbsPageCountInBatch},
-    {0x2e4ecbdb, L"sheetCountInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_SheetCountInBatch},
-    {0x2fcff4b5, L"relayout", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                                  Script_LayoutPseudoModel_Relayout},
-    {0x3bf1c2a5, L"absPageSpan",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_AbsPageSpan},
-    {0x5775c2cc, L"absPageInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_AbsPageInBatch},
-    {0x8c5feb32, L"sheetInBatch",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_SheetInBatch},
-    {0x8f3a8379, L"sheet", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                               Script_LayoutPseudoModel_Sheet},
-    {0x96f3c4cb, L"relayoutPageArea",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_RelayoutPageArea},
-    {0xd2a4a542, L"sheetCount",
-     (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-         Script_LayoutPseudoModel_SheetCount},
-    {0xe74f0653, L"absPage", (XFA_METHOD_CALLBACK)&CScript_LayoutPseudoModel::
-                                 Script_LayoutPseudoModel_AbsPage},
-    {0x44c352ad, L"formNodes",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_FormNodes},
-    {0x45efb847, L"remerge",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Remerge},
-    {0x6716ce97, L"execInitialize",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecInitialize},
-    {0x712c6afa, L"createNode",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_CreateNode},
-    {0xa8a35e25, L"recalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_Recalculate},
-    {0xc6013cd3, L"execCalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecCalculate},
-    {0xef8ce48f, L"execValidate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Template_ExecValidate},
-    {0x4cc1c0f9, L"moveCurrentRecord",
-     (XFA_METHOD_CALLBACK)&CScript_DataWindow::
-         Script_DataWindow_MoveCurrentRecord},
-    {0x5779d65f, L"record",
-     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_Record},
-    {0x8a476498, L"gotoRecord",
-     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_GotoRecord},
-    {0xaac241c8, L"isRecordGroup",
-     (XFA_METHOD_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsRecordGroup},
-    {0x1c6f4277, L"evaluate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Manifest_Evaluate},
-    {0x2afec2cc, L"moveInstance",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_MoveInstance},
-    {0x2bf94a63, L"removeInstance",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_RemoveInstance},
-    {0x303adaf4, L"setInstances",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_SetInstances},
-    {0x4d76b89e, L"addInstance",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_AddInstance},
-    {0xc660dc8a, L"insertInstance",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_InstanceManager_InsertInstance},
-    {0xddfd1ea1, L"metadata",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Desc_Metadata},
-    {0x44c352ad, L"formNodes",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_FormNodes},
-    {0x45efb847, L"remerge",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Remerge},
-    {0x6716ce97, L"execInitialize",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecInitialize},
-    {0xa8a35e25, L"recalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_Recalculate},
-    {0xc6013cd3, L"execCalculate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecCalculate},
-    {0xef8ce48f, L"execValidate",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Form_ExecValidate},
-    {0x60490a85, L"message", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
-                                 Script_LogPseudoModel_Message},
-    {0x60ecfcc9, L"traceDeactivate",
-     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
-         Script_LogPseudoModel_TraceDeactivate},
-    {0x86a0f4c0, L"traceActivate",
-     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
-         Script_LogPseudoModel_TraceActivate},
-    {0x93eac39a, L"traceEnabled", (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::
-                                      Script_LogPseudoModel_TraceEnabled},
-    {0xd1227e6f, L"trace",
-     (XFA_METHOD_CALLBACK)&CScript_LogPseudoModel::Script_LogPseudoModel_Trace},
-    {0x36c0ee14, L"getAttribute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_GetAttribute},
-    {0x5468e2a0, L"setAttribute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_SetAttribute},
-    {0xadc48de2, L"removeAttribute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Packet_RemoveAttribute},
-    {0x3848b3f, L"next", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Next},
-    {0x14e25bc8, L"cancelBatch",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_CancelBatch},
-    {0x3ce05d68, L"first",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_First},
-    {0x649e1e65, L"updateBatch",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_UpdateBatch},
-    {0x6a3405dd, L"previous",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Previous},
-    {0x74818fb3, L"isBOF",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsBOF},
-    {0x74d07a76, L"isEOF",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_IsEOF},
-    {0x7613cb66, L"cancel",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Cancel},
-    {0x7baca2e3, L"update",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Update},
-    {0x8b90e1f2, L"open", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Open},
-    {0x9c6471b3, L"delete",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Delete},
-    {0xa7315093, L"addNew",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_AddNew},
-    {0xa7ce5f8d, L"requery",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Requery},
-    {0xc7368674, L"resync",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Resync},
-    {0xd9f47f36, L"close",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Close},
-    {0xf54481d4, L"last", (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_Last},
-    {0xf7965460, L"hasDataChanged",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_Source_HasDataChanged},
-    {0x6275f6af, L"item",
-     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Item},
-    {0x7033bfd5, L"insert",
-     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Insert},
-    {0x9cab7cae, L"remove",
-     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Remove},
-    {0xda12e518, L"append",
-     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_ListClass_Append},
-    {0xd892a054, L"namedItem",
-     (XFA_METHOD_CALLBACK)&CXFA_NodeList::Script_TreelistClass_NamedItem},
-    {0xba2dd386, L"resolveNode",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNode},
-    {0xe509e2b9, L"resolveNodes",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_TreeClass_ResolveNodes},
-    {0x1bca1ebd, L"applyXSL",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_ApplyXSL},
-    {0x36c0ee14, L"getAttribute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetAttribute},
-    {0x5468e2a0, L"setAttribute",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetAttribute},
-    {0x5ee00996, L"setElement",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SetElement},
-    {0x92dada4f, L"saveFilteredXML",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveFilteredXML},
-    {0x9c456500, L"saveXML",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_SaveXML},
-    {0xabd3200a, L"getElement",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_GetElement},
-    {0xb269c60d, L"isPropertySpecified",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_IsPropertySpecified},
-    {0xb528be91, L"loadXML",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_LoadXML},
-    {0xd9f46591, L"clone",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_Clone},
-    {0xe006a76b, L"assignNode",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_NodeClass_AssignNode},
-    {0x7303fcea, L"getDelta",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDelta},
-    {0xe7742c9d, L"getDeltas",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ContainerClass_GetDeltas},
-    {0x30ff6aad, L"clearErrorList",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_ClearErrorList},
-    {0x712c6afa, L"createNode",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_CreateNode},
-    {0x83a6411d, L"isCompatibleNS",
-     (XFA_METHOD_CALLBACK)&CXFA_Node::Script_ModelClass_IsCompatibleNS},
-};
-const int32_t g_iSomMethodCount =
-    sizeof(g_SomMethodData) / sizeof(XFA_METHODINFO);
-const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[] = {
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xb3543a6, L"max",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Max, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x45a6daf8, L"eofAction",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_EofAction, XFA_SCRIPT_Basic},
-    {0x5ec958c0, L"cursorType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CursorType, XFA_SCRIPT_Basic},
-    {0x79975f2b, L"lockType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LockType, XFA_SCRIPT_Basic},
-    {0xa5340ff5, L"bofAction",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BofAction, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc5762157, L"cursorLocation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CursorLocation, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1ee2d24d, L"instanceIndex",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1,
-     XFA_SCRIPT_Basic},
-    {0x8c99377e, L"relation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0x3106c3a, L"beforeTarget",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BeforeTarget, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x13a08bdb, L"overflowTarget",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OverflowTarget, XFA_SCRIPT_Basic},
-    {0x169134a1, L"overflowLeader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OverflowLeader, XFA_SCRIPT_Basic},
-    {0x20914367, L"overflowTrailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OverflowTrailer, XFA_SCRIPT_Basic},
-    {0x453eaf38, L"startNew",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
-    {0x64110ab5, L"bookendTrailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BookendTrailer, XFA_SCRIPT_Basic},
-    {0xb6b44172, L"after",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_After, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc3c1442f, L"bookendLeader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BookendLeader, XFA_SCRIPT_Basic},
-    {0xcb150479, L"afterTarget",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AfterTarget, XFA_SCRIPT_Basic},
-    {0xf4ffce73, L"before",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Before, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
-     XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x47cfa43a, L"allowNeutral",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AllowNeutral, XFA_SCRIPT_Basic},
-    {0x7c2fd80b, L"mark",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Mark, XFA_SCRIPT_Basic},
-    {0x8ed182d1, L"shape",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Shape, XFA_SCRIPT_Basic},
-    {0xa686975b, L"size",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x5c054755, L"startAngle",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_StartAngle, XFA_SCRIPT_Basic},
-    {0x74788f8b, L"sweepAngle",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SweepAngle, XFA_SCRIPT_Basic},
-    {0x9d833d75, L"circular",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Circular, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd996fa9b, L"hand",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xb0e5485d, L"bind",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Bind, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xcd7f7b54, L"from",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8e29d794, L"signatureType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SignatureType, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe11a2cbc, L"permissions",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Permissions, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x453eaf38, L"startNew",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
-    {0x9dcc3ab3, L"trailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
-    {0xa6118c89, L"targetType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xcbcaf66d, L"leader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x2d574d58, L"this", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Xfa_This,
-     -1, XFA_SCRIPT_Object},
-    {0x4fdc3454, L"timeStamp",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TimeStamp, XFA_SCRIPT_Basic},
-    {0xb598a1f7, L"uuid",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Uuid, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xcfea02e, L"leftInset",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LeftInset, XFA_SCRIPT_Basic},
-    {0x1356caf8, L"bottomInset",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BottomInset, XFA_SCRIPT_Basic},
-    {0x25764436, L"topInset",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TopInset, XFA_SCRIPT_Basic},
-    {0x8a692521, L"rightInset",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RightInset, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1e459b8f, L"nonRepudiation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_NonRepudiation, XFA_SCRIPT_Basic},
-    {0x2bb3f470, L"encipherOnly",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_EncipherOnly, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0x5f760b50, L"digitalSignature",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DigitalSignature, XFA_SCRIPT_Basic},
-    {0x69aa2292, L"crlSign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CrlSign, XFA_SCRIPT_Basic},
-    {0x98fd4d81, L"keyAgreement",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_KeyAgreement, XFA_SCRIPT_Basic},
-    {0xa66404cb, L"keyEncipherment",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_KeyEncipherment, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xca5dc27c, L"dataEncipherment",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataEncipherment, XFA_SCRIPT_Basic},
-    {0xe8f118a8, L"keyCertSign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_KeyCertSign, XFA_SCRIPT_Basic},
-    {0xfea53ec6, L"decipherOnly",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DecipherOnly, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8b90e1f2, L"open",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Open, XFA_SCRIPT_Basic},
-    {0x957fa006, L"commitOn",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CommitOn, XFA_SCRIPT_Basic},
-    {0xb12128b7, L"textEntry",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TextEntry, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0x2282c73, L"hAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
-    {0x8d4f1c7, L"textIndent",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TextIndent, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2a82d99c, L"marginRight",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MarginRight, XFA_SCRIPT_Basic},
-    {0x534729c9, L"marginLeft",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MarginLeft, XFA_SCRIPT_Basic},
-    {0x5739d1ff, L"radixOffset",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RadixOffset, XFA_SCRIPT_Basic},
-    {0x577682ac, L"preserve",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Preserve, XFA_SCRIPT_Basic},
-    {0x731e0665, L"spaceBelow",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SpaceBelow, XFA_SCRIPT_Basic},
-    {0x7a7cc341, L"vAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
-    {0x836d4d7c, L"tabDefault",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TabDefault, XFA_SCRIPT_Basic},
-    {0x8fa01790, L"tabStops",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TabStops, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd4b01921, L"lineHeight",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LineHeight, XFA_SCRIPT_Basic},
-    {0xe18b5659, L"spaceAbove",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SpaceAbove, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd861f8af, L"addRevocationInfo",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AddRevocationInfo, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6128d8d, L"activity",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Activity, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x43e349b, L"dataRowCount",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataRowCount, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x28e17e91, L"dataPrep",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataPrep, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0x3650557e, L"textLocation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TextLocation, XFA_SCRIPT_Basic},
-    {0x3b582286, L"moduleWidth",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ModuleWidth, XFA_SCRIPT_Basic},
-    {0x52666f1c, L"printCheckDigit",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_PrintCheckDigit, XFA_SCRIPT_Basic},
-    {0x5404d6df, L"moduleHeight",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ModuleHeight, XFA_SCRIPT_Basic},
-    {0x5ab23b6c, L"startChar",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_StartChar, XFA_SCRIPT_Basic},
-    {0x7c732a66, L"truncate",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Truncate, XFA_SCRIPT_Basic},
-    {0x8d181d61, L"wideNarrowRatio",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_WideNarrowRatio, XFA_SCRIPT_Basic},
-    {0x99800d7a, L"errorCorrectionLevel",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ErrorCorrectionLevel, XFA_SCRIPT_Basic},
-    {0x9a63da3d, L"upsMode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_UpsMode, XFA_SCRIPT_Basic},
-    {0xaf754613, L"checksum",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Checksum, XFA_SCRIPT_Basic},
-    {0xb045fbc5, L"charEncoding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CharEncoding, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc035c6b1, L"dataColumnCount",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataColumnCount, XFA_SCRIPT_Basic},
-    {0xd3c84d25, L"rowColumnRatio",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RowColumnRatio, XFA_SCRIPT_Basic},
-    {0xd57c513c, L"dataLength",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataLength, XFA_SCRIPT_Basic},
-    {0xf575ca75, L"endChar",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_EndChar, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0x28dee6e9, L"format",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x60d4c8b1, L"output",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Output, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6a39990, L"input",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Input, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x2b5df51e, L"dataDescription",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x6c0d9600, L"currentValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_CurrentValue, -1,
-     XFA_SCRIPT_Basic},
-    {0x942643f0, L"savedValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_SavedValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Delta_Target, -1,
-     XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd4cc53f8, L"highlight",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Highlight, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x5518c25, L"break",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Break, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd996fa9b, L"hand",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1059ec18, L"level",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer,
-     XFA_ATTRIBUTE_Level, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xac06e2b0, L"colSpan",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f105f72, L"wordCharacterCount",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_WordCharacterCount, XFA_SCRIPT_Basic},
-    {0x3d123c26, L"hyphenate",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Hyphenate, XFA_SCRIPT_Basic},
-    {0x66539c48, L"excludeInitialCap",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ExcludeInitialCap, XFA_SCRIPT_Basic},
-    {0x6a95c976, L"pushCharacterCount",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_PushCharacterCount, XFA_SCRIPT_Basic},
-    {0x982bd892, L"remainCharacterCount",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RemainCharacterCount, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe5c96d6a, L"excludeAllCaps",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ExcludeAllCaps, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8af2e657, L"maxChars",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxChars, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc080cd3, L"url",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Url, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa6710262, L"credentialServerPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CredentialServerPolicy, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc2ba0923, L"urlPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_UrlPolicy, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x47d03490, L"connection",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x78bff531, L"numberOfCells",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_Integer,
-     XFA_ATTRIBUTE_NumberOfCells, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
-    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0x2282c73, L"hAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1abbd7e0, L"dataNode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
-     XFA_SCRIPT_Object},
-    {0x25839852, L"access",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
-    {0x2ee7678f, L"rotate",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic},
-    {0x3b1ddd06, L"fillColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x54c399e3, L"formattedValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormattedValue, -1,
-     XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x5a3b375d, L"borderColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x5e936ed6, L"fontColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FontColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x6826c408, L"parentSubform",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_ParentSubform, -1,
-     XFA_SCRIPT_Basic},
-    {0x79b67434, L"mandatoryMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0x7a7cc341, L"vAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
-    {0x7c2ff6ae, L"maxH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
-    {0x7c2ff6bd, L"maxW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
-    {0x7d02356c, L"minH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
-    {0x7d02357b, L"minW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
-    {0x85fd6faf, L"mandatory",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1,
-     XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0x964fb42e, L"formatMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_FormatMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0xa03cf627, L"rawValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xa60dd202, L"length",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_Length, -1,
-     XFA_SCRIPT_Basic},
-    {0xac06e2b0, L"colSpan",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbc8fa350, L"locale",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic},
-    {0xc2bd40fd, L"anchorType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
-    {0xc4fed09b, L"accessKey",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic},
-    {0xcabfa3d0, L"validationMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0xdcecd663, L"editValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_EditValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xe07e5061, L"selectedIndex",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Field_SelectedIndex, -1,
-     XFA_SCRIPT_Basic},
-    {0xf65e34be, L"borderWidth",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
-     XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
-    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd843798, L"fullText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                 Script_EventPseudoModel_FullText,
-     -1, XFA_SCRIPT_Basic},
-    {0x1b6d1cf5, L"reenter", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                 Script_EventPseudoModel_Reenter,
-     -1, XFA_SCRIPT_Basic},
-    {0x1e6ffa9a, L"prevContentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_PrevContentType,
-     -1, XFA_SCRIPT_Basic},
-    {0x25a3c206, L"soapFaultString",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_SoapFaultString,
-     -1, XFA_SCRIPT_Basic},
-    {0x2e00c007, L"newContentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_NewContentType,
-     -1, XFA_SCRIPT_Basic},
-    {0x4570500f, L"modifier",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_Modifier,
-     -1, XFA_SCRIPT_Basic},
-    {0x50e2e33b, L"selEnd", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                Script_EventPseudoModel_SelEnd,
-     -1, XFA_SCRIPT_Basic},
-    {0x57de87c2, L"prevText",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_PrevText,
-     -1, XFA_SCRIPT_Basic},
-    {0x6ea04e0a, L"soapFaultCode",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_SoapFaultCode,
-     -1, XFA_SCRIPT_Basic},
-    {0x6f6556cf, L"newText", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                 Script_EventPseudoModel_NewText,
-     -1, XFA_SCRIPT_Basic},
-    {0x891f4606, L"change", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                Script_EventPseudoModel_Change,
-     -1, XFA_SCRIPT_Basic},
-    {0x8fa3c19e, L"shift", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                               Script_EventPseudoModel_Shift,
-     -1, XFA_SCRIPT_Basic},
-    {0xa9d9b2e1, L"keyDown", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                 Script_EventPseudoModel_KeyDown,
-     -1, XFA_SCRIPT_Basic},
-    {0xbfc89db2, L"selStart",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_SelStart,
-     -1, XFA_SCRIPT_Basic},
-    {0xc32a5812, L"commitKey",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-         Script_EventPseudoModel_CommitKey,
-     -1, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target", (XFA_ATTRIBUTE_CALLBACK)&CScript_EventPseudoModel::
-                                Script_EventPseudoModel_Target,
-     -1, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xa2e3514, L"cap",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Cap, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x5392ea58, L"stroke",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x94446dcc, L"thickness",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1ec8ab2c, L"rate",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Rate, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x7b29630a, L"sourceBelow",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SourceBelow, XFA_SCRIPT_Basic},
-    {0x8fc36c0a, L"outputBelow",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OutputBelow, XFA_SCRIPT_Basic},
-    {0xe996b2fe, L"sourceAbove",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_SourceAbove, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
-    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0x2282c73, L"hAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xf23332f, L"errorText",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_ErrorText, -1,
-     XFA_SCRIPT_Basic},
-    {0x1abbd7e0, L"dataNode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
-     XFA_SCRIPT_Object},
-    {0x25839852, L"access",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
-    {0x3b1ddd06, L"fillColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x5a3b375d, L"borderColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x79b67434, L"mandatoryMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_MandatoryMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0x7a7cc341, L"vAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
-    {0x7c2ff6ae, L"maxH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
-    {0x7c2ff6bd, L"maxW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
-    {0x7d02356c, L"minH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
-    {0x7d02357b, L"minW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
-    {0x7e7e845e, L"layout",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic},
-    {0x846599f8, L"transient",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_Transient, -1,
-     XFA_SCRIPT_Basic},
-    {0x85fd6faf, L"mandatory",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_Mandatory, -1,
-     XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xa03cf627, L"rawValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue,
-     -1, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ExclGroup_DefaultAndRawValue,
-     -1, XFA_SCRIPT_Basic},
-    {0xac06e2b0, L"colSpan",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc2bd40fd, L"anchorType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
-    {0xc4fed09b, L"accessKey",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AccessKey, XFA_SCRIPT_Basic},
-    {0xcabfa3d0, L"validationMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0xf65e34be, L"borderWidth",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xeda9017a, L"scope",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x47d03490, L"connection",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
-    {0x6cfa828a, L"runAt",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic},
-    {0xa1b0d2f5, L"executeType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ExecuteType, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe6f99487, L"hScrollPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x42fed1fd, L"contentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
-    {0x54fa722c, L"transferEncoding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd171b240, L"aspect",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Aspect, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue_Read, -1,
-     XFA_SCRIPT_Basic},
-    {0xdb55fec5, L"href",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0x7f6fd3d7, L"server",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Server, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x4b8bc840, L"fracDigits",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_FracDigits, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xde7f92ba, L"leadDigits",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LeadDigits, XFA_SCRIPT_Basic},
-    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
-    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0x2282c73, L"hAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1414d431, L"allowMacro",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AllowMacro, XFA_SCRIPT_Basic},
-    {0x1517dfa1, L"columnWidths",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColumnWidths, XFA_SCRIPT_Basic},
-    {0x1abbd7e0, L"dataNode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DataNode, -1,
-     XFA_SCRIPT_Object},
-    {0x1ee2d24d, L"instanceIndex",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_InstanceIndex, -1,
-     XFA_SCRIPT_Basic},
-    {0x25839852, L"access",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Access, XFA_SCRIPT_Basic},
-    {0x3b1ddd06, L"fillColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_FillColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x5a3b375d, L"borderColor",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderColor, -1,
-     XFA_SCRIPT_Basic},
-    {0x7a7cc341, L"vAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
-    {0x7c2ff6ae, L"maxH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
-    {0x7c2ff6bd, L"maxW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
-    {0x7d02356c, L"minH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
-    {0x7d02357b, L"minW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
-    {0x7e7e845e, L"layout",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Layout, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0x9cc17d75, L"mergeMode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MergeMode, XFA_SCRIPT_Basic},
-    {0x9f3e9510, L"instanceManager",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_InstanceManager, -1,
-     XFA_SCRIPT_Object},
-    {0xac06e2b0, L"colSpan",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbc8fa350, L"locale",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Subform_Locale, -1,
-     XFA_SCRIPT_Basic},
-    {0xc2bd40fd, L"anchorType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
-    {0xcabfa3d0, L"validationMessage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_ValidationMessage, -1,
-     XFA_SCRIPT_Basic},
-    {0xe4c3a5e5, L"restoreState",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RestoreState, XFA_SCRIPT_Basic},
-    {0xeda9017a, L"scope",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Scope, XFA_SCRIPT_Basic},
-    {0xf65e34be, L"borderWidth",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_BorderWidth, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0x5a50e9e6, L"version",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Handler_Version, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x4107ed, L"foxitAppType",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_FoxitAppType,
-     -1, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                             Script_HostPseudoModel_Name,
-     -1, XFA_SCRIPT_Basic},
-    {0x66c1ae9, L"validationsEnabled",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_ValidationsEnabled,
-     -1, XFA_SCRIPT_Basic},
-    {0x14d04502, L"title", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                               Script_HostPseudoModel_Title,
-     -1, XFA_SCRIPT_Basic},
-    {0x193afe8b, L"foxitName",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_FoxitName,
-     -1, XFA_SCRIPT_Basic},
-    {0x392ae445, L"platform", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_Platform,
-     -1, XFA_SCRIPT_Basic},
-    {0x5a50e9e6, L"version", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                                 Script_HostPseudoModel_Version,
-     -1, XFA_SCRIPT_Basic},
-    {0x66cb1eed, L"variation",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_Variation,
-     -1, XFA_SCRIPT_Basic},
-    {0x7717cbc4, L"language", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_Language,
-     -1, XFA_SCRIPT_Basic},
-    {0x86698963, L"appType", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                                 Script_HostPseudoModel_AppType,
-     -1, XFA_SCRIPT_Basic},
-    {0x94ff9e8d, L"calculationsEnabled",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_CalculationsEnabled,
-     -1, XFA_SCRIPT_Basic},
-    {0xbcd44940, L"currentPage",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_CurrentPage,
-     -1, XFA_SCRIPT_Basic},
-    {0xd4286870, L"foxitVersion",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-         Script_HostPseudoModel_FoxitVersion,
-     -1, XFA_SCRIPT_Basic},
-    {0xd592b920, L"numPages", (XFA_ATTRIBUTE_CALLBACK)&CScript_HostPseudoModel::
-                                  Script_HostPseudoModel_NumPages,
-     -1, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x24d85167, L"timeout",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x7d9fd7c5, L"mode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Mode, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x7d9fd7c5, L"mode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_SubmitFormat_Mode, -1,
-     XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2038c9b2, L"role",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Role, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xfcef86b5, L"ready", (XFA_ATTRIBUTE_CALLBACK)&CScript_LayoutPseudoModel::
-                               Script_LayoutPseudoModel_Ready,
-     -1, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x5392ea58, L"stroke",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Stroke, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x7b95e661, L"inverted",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Inverted, XFA_SCRIPT_Basic},
-    {0x94446dcc, L"thickness",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Thickness, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe8dddf50, L"join",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Join, XFA_SCRIPT_Basic},
-    {0xe948b9a8, L"radius",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Radius, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xabfa6c4f, L"cSpace",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CSpace, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
-    {0x3848b3f, L"next",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Next, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x6a3405dd, L"previous",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Previous, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xf6b59543, L"intact",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Intact, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x268b7ec1, L"commandType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CommandType, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbde9abda, L"data",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Data, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x5b707a35, L"scriptTest",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ScriptTest, XFA_SCRIPT_Basic},
-    {0x6b6ddcfb, L"nullTest",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_NullTest, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xe64b1129, L"formatTest",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_FormatTest, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8c99377e, L"relation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relation, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x25363, L"to",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic},
-    {0x66642f8f, L"force",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Force, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xcd7f7b54, L"from",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
-    {0x2b5df51e, L"dataDescription",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x226ca8f1, L"operation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xfb67185, L"recordsBefore", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
-                                      Script_DataWindow_RecordsBefore,
-     -1, XFA_SCRIPT_Basic},
-    {0x21d5dfcb, L"currentRecordNumber",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
-         Script_DataWindow_CurrentRecordNumber,
-     -1, XFA_SCRIPT_Basic},
-    {0x312af044, L"recordsAfter", (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::
-                                      Script_DataWindow_RecordsAfter,
-     -1, XFA_SCRIPT_Basic},
-    {0x6aab37cb, L"isDefined",
-     (XFA_ATTRIBUTE_CALLBACK)&CScript_DataWindow::Script_DataWindow_IsDefined,
-     -1, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x42fed1fd, L"contentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
-    {0x6cfa828a, L"runAt",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_RunAt, XFA_SCRIPT_Basic},
-    {0xa021b738, L"stateless",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Script_Stateless, -1,
-     XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xadc4c77b, L"binding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Binding, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x7a0cc471, L"passwordChar",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_PasswordChar, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe6f99487, L"hScrollPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe6f99487, L"hScrollPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x14a32d52, L"pagePosition",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_PagePosition, XFA_SCRIPT_Basic},
-    {0x8340ea66, L"oddOrEven",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OddOrEven, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xa85e74f3, L"initialNumber",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_InitialNumber, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe9ba472, L"numbered",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Numbered, XFA_SCRIPT_Basic},
-    {0xd70798c2, L"blankOrNotBlank",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BlankOrNotBlank, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x34ae103c, L"reserve",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Reserve, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xf2009339, L"placement",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Placement, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x42fed1fd, L"contentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
-    {0x54fa722c, L"transferEncoding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc4547a08, L"maxLength",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxLength, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xdb55fec5, L"href",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Href, XFA_SCRIPT_Basic},
-    {0x29418bb7, L"abbr",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf531b059, L"writingScript",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_WritingScript, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1b8dce3e, L"action",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Action, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x9dcc3ab3, L"trailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xcbcaf66d, L"leader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xb3543a6, L"max",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Max, -1,
-     XFA_SCRIPT_Basic},
-    {0xb356ca4, L"min",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Min, -1,
-     XFA_SCRIPT_Basic},
-    {0x6f544d49, L"count",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_InstanceManager_Count, -1,
-     XFA_SCRIPT_Basic},
-    {0x25363, L"to",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_To, XFA_SCRIPT_Basic},
-    {0xa0933954, L"unicodeRange",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_UnicodeRange, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xcd7f7b54, L"from",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_From, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x4ef3d02c, L"orientation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Orientation, XFA_SCRIPT_Basic},
-    {0x65e30c67, L"imagingBBox",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ImagingBBox, XFA_SCRIPT_Basic},
-    {0x9041d4b0, L"short",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Short, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe349d044, L"stock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Stock, XFA_SCRIPT_Basic},
-    {0xf6b4afb0, L"long",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Long, XFA_SCRIPT_Basic},
-    {0x5ce6195, L"vScrollPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VScrollPolicy, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x1ef3a64a, L"allowRichText",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AllowRichText, XFA_SCRIPT_Basic},
-    {0x5a32e493, L"multiLine",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MultiLine, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe6f99487, L"hScrollPolicy",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HScrollPolicy, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xd52482e0, L"maxEntries",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxEntries, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x42fed1fd, L"contentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
-    {0x8855805f, L"contains",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Contains, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xe372ae97, L"isNull",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_IsNull, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x2b5df51e, L"dataDescription",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DataDescription, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x226ca8f1, L"operation",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Operation, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x42fed1fd, L"contentType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ContentType, XFA_SCRIPT_Basic},
-    {0x54fa722c, L"transferEncoding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TransferEncoding, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xf197844d, L"match",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Match, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd996fa9b, L"hand",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x28dee6e9, L"format",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Encrypt_Format, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x68, L"h", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_H, XFA_SCRIPT_Basic},
-    {0x77, L"w", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_W, XFA_SCRIPT_Basic},
-    {0x78, L"x", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_X, XFA_SCRIPT_Basic},
-    {0x79, L"y", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Y, XFA_SCRIPT_Basic},
-    {0x2282c73, L"hAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_HAlign, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2ee7678f, L"rotate",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Rotate, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0x7a7cc341, L"vAlign",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_VAlign, XFA_SCRIPT_Basic},
-    {0x7c2ff6ae, L"maxH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxH, XFA_SCRIPT_Basic},
-    {0x7c2ff6bd, L"maxW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MaxW, XFA_SCRIPT_Basic},
-    {0x7d02356c, L"minH",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinH, XFA_SCRIPT_Basic},
-    {0x7d02357b, L"minW",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_MinW, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xa03cf627, L"rawValue",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xac06e2b0, L"colSpan",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ColSpan, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbc8fa350, L"locale",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Locale, XFA_SCRIPT_Basic},
-    {0xc2bd40fd, L"anchorType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_AnchorType, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x39cdb0a2, L"priority",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Priority, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xeb511b54, L"disable",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Disable, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Value, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xcb0ac9, L"lineThrough",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LineThrough, XFA_SCRIPT_Basic},
-    {0x2c1c7f1, L"typeface",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Typeface, XFA_SCRIPT_Basic},
-    {0x8c74ae9, L"fontHorizontalScale",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_FontHorizontalScale, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2cd79033, L"kerningMode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_KerningMode, XFA_SCRIPT_Basic},
-    {0x3a0273a6, L"underline",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Underline, XFA_SCRIPT_Basic},
-    {0x4873c601, L"baselineShift",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_BaselineShift, XFA_SCRIPT_Basic},
-    {0x4b319767, L"overlinePeriod",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_OverlinePeriod, XFA_SCRIPT_Basic},
-    {0x79543055, L"letterSpacing",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LetterSpacing, XFA_SCRIPT_Basic},
-    {0x8ec6204c, L"lineThroughPeriod",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LineThroughPeriod, XFA_SCRIPT_Basic},
-    {0x907c7719, L"fontVerticalScale",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_FontVerticalScale, XFA_SCRIPT_Basic},
-    {0xa686975b, L"size",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Size, XFA_SCRIPT_Basic},
-    {0xb5e49bf2, L"posture",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Posture, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbd6e1d88, L"weight",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Weight, XFA_SCRIPT_Basic},
-    {0xbd96a0e9, L"underlinePeriod",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_UnderlinePeriod, XFA_SCRIPT_Basic},
-    {0xc0ec9fa4, L"overline",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Overline, XFA_SCRIPT_Basic},
-    {0xaf754613, L"checksum",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Form_Checksum, -1,
-     XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x8e1c2921, L"relevant",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Relevant, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xea7090a0, L"override",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x9dcc3ab3, L"trailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xcbcaf66d, L"leader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x60a61edd, L"codeType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CodeType, XFA_SCRIPT_Basic},
-    {0xb373a862, L"archive",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Archive, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xe1a26b56, L"codeBase",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_CodeBase, XFA_SCRIPT_Basic},
-    {0xeb091003, L"classId",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ClassId, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x47d03490, L"connection",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
-    {0xc39a88bd, L"labelRef",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_LabelRef, XFA_SCRIPT_Basic},
-    {0xd50f903a, L"valueRef",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_ValueRef, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xea7090a0, L"override",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Override, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Extras_Type, -1,
-     XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x24d85167, L"timeout",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Timeout, XFA_SCRIPT_Basic},
-    {0x47d03490, L"connection",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Connection, XFA_SCRIPT_Basic},
-    {0x552d9ad5, L"usage",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usage, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc860f30a, L"delayedOpen",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_DelayedOpen, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x28dee6e9, L"format",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Format, XFA_SCRIPT_Basic},
-    {0x824f21b7, L"embedPDF",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_EmbedPDF, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xdc75676c, L"textEncoding",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TextEncoding, XFA_SCRIPT_Basic},
-    {0xf889e747, L"xdpContent",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_XdpContent, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x97be91b, L"content",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Packet_Content, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x4156ee3f, L"delimiter",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Delimiter, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x2f16a382, L"type",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Type, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x453eaf38, L"startNew",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_StartNew, XFA_SCRIPT_Basic},
-    {0x9dcc3ab3, L"trailer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Trailer, XFA_SCRIPT_Basic},
-    {0xa6118c89, L"targetType",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_TargetType, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xc8da4da7, L"target",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Target, XFA_SCRIPT_Basic},
-    {0xcbcaf66d, L"leader",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Leader, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xabef37e3, L"slope",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Slope, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xd996fa9b, L"hand",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Hand, XFA_SCRIPT_Basic},
-    {0xa60dd202, L"length",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1,
-     XFA_SCRIPT_Basic},
-    {0x20146, L"db", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Source_Db, -1,
-     XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xb3543a6, L"max", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Max,
-     -1, XFA_SCRIPT_Basic},
-    {0xb356ca4, L"min", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Occur_Min,
-     -1, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x7d0b5fca, L"initial",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Initial, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x29418bb7, L"abbr",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Abbr, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0xbe52dfbf, L"desc",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Desc, XFA_SCRIPT_Basic},
-    {0xf6b47749, L"lock",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_BOOL,
-     XFA_ATTRIBUTE_Lock, XFA_SCRIPT_Basic},
-    {0xbb8df5d, L"ref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Ref, XFA_SCRIPT_Basic},
-    {0xc0811ed, L"use",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Use, XFA_SCRIPT_Basic},
-    {0x570ce835, L"presence",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Presence, XFA_SCRIPT_Basic},
-    {0xa5b410cf, L"save",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Save, XFA_SCRIPT_Basic},
-    {0xbc254332, L"usehref",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Usehref, XFA_SCRIPT_Basic},
-    {0xb2c80857, L"className",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Object::Script_ObjectClass_ClassName, -1,
-     XFA_SCRIPT_Basic},
-    {0xa60dd202, L"length",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_NodeList::Script_ListClass_Length, -1,
-     XFA_SCRIPT_Basic},
-    {0x31b19c1, L"name",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Name, XFA_SCRIPT_Basic},
-    {0x9f9d0f9, L"all",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_All, -1,
-     XFA_SCRIPT_Object},
-    {0x4df15659, L"nodes",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Nodes, -1,
-     XFA_SCRIPT_Object},
-    {0x78a8d6cf, L"classAll",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassAll, -1,
-     XFA_SCRIPT_Object},
-    {0xcad6d8ca, L"parent",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Parent, -1,
-     XFA_SCRIPT_Object},
-    {0xd5679c78, L"index",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_Index, -1,
-     XFA_SCRIPT_Basic},
-    {0xdb5b4bce, L"classIndex",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_ClassIndex, -1,
-     XFA_SCRIPT_Basic},
-    {0xe4989adf, L"somExpression",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_TreeClass_SomExpression, -1,
-     XFA_SCRIPT_Basic},
-    {0x21aed, L"id",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Attribute_String,
-     XFA_ATTRIBUTE_Id, XFA_SCRIPT_Basic},
-    {0x234a1, L"ns", (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Ns,
-     -1, XFA_SCRIPT_Basic},
-    {0x50d1a9d1, L"model",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_Model, -1,
-     XFA_SCRIPT_Object},
-    {0xacb4823f, L"isContainer",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsContainer, -1,
-     XFA_SCRIPT_Basic},
-    {0xe372ae97, L"isNull",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_IsNull, -1,
-     XFA_SCRIPT_Basic},
-    {0xfe612a5b, L"oneOfChild",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_NodeClass_OneOfChild, -1,
-     XFA_SCRIPT_Object},
-    {0x97c1c65, L"context",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_Context, -1,
-     XFA_SCRIPT_Object},
-    {0x58be2870, L"aliasNode",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_ModelClass_AliasNode, -1,
-     XFA_SCRIPT_Object},
-    {0xa52682bd, L"{default}",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-    {0xd6e27f1d, L"value",
-     (XFA_ATTRIBUTE_CALLBACK)&CXFA_Node::Script_Som_DefaultValue, -1,
-     XFA_SCRIPT_Basic},
-};
-const int32_t g_iSomAttributeCount =
-    sizeof(g_SomAttributeData) / sizeof(XFA_ATTRIBUTEINFO);
diff --git a/xfa/src/fxfa/parser/xfa_basic_data.h b/xfa/src/fxfa/parser/xfa_basic_data.h
deleted file mode 100644
index 4ccdd1c..0000000
--- a/xfa/src/fxfa/parser/xfa_basic_data.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_BASIC_DATA_H_
-#define XFA_SRC_FXFA_PARSER_XFA_BASIC_DATA_H_
-
-#include "xfa/include/fxfa/fxfa_basic.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-
-extern const XFA_PACKETINFO g_XFAPacketData[];
-extern const int32_t g_iXFAPacketCount;
-
-extern const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[];
-extern const int32_t g_iXFAEnumCount;
-
-extern const XFA_ATTRIBUTEINFO g_XFAAttributeData[];
-extern const int32_t g_iXFAAttributeCount;
-
-extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[];
-extern const int32_t g_iXFANotsureCount;
-
-extern const XFA_ELEMENTINFO g_XFAElementData[];
-extern const int32_t g_iXFAElementCount;
-
-extern const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[];
-extern const FX_WORD g_XFAElementChildrenData[];
-
-extern const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[];
-extern const uint8_t g_XFAElementAttributeData[];
-
-extern const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[];
-extern const XFA_PROPERTY g_XFAElementPropertyData[];
-
-extern const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[];
-
-extern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[];
-extern const int32_t g_iXFANotsureCount;
-
-extern const XFA_METHODINFO g_SomMethodData[];
-extern const int32_t g_iSomMethodCount;
-
-extern const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[];
-extern const int32_t g_iSomAttributeCount;
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_BASIC_DATA_H_
diff --git a/xfa/src/fxfa/parser/xfa_basic_imp.cpp b/xfa/src/fxfa/parser/xfa_basic_imp.cpp
deleted file mode 100644
index a0aa56d..0000000
--- a/xfa/src/fxfa/parser/xfa_basic_imp.cpp
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/crt/fgas_system.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_data.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-const XFA_PACKETINFO* XFA_GetPacketByName(const CFX_WideStringC& wsName) {
-  int32_t iLength = wsName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
-  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    const XFA_PACKETINFO* pInfo = g_XFAPacketData + iMid;
-    if (uHash == pInfo->uHash) {
-      return pInfo;
-    } else if (uHash < pInfo->uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-
-const XFA_PACKETINFO* XFA_GetPacketByID(FX_DWORD dwPacket) {
-  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    FX_DWORD dwFind = (g_XFAPacketData + iMid)->eName;
-    if (dwPacket == dwFind) {
-      return g_XFAPacketData + iMid;
-    } else if (dwPacket < dwFind) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-
-const XFA_PACKETINFO* XFA_GetPacketByIndex(XFA_PACKET ePacket) {
-  return g_XFAPacketData + ePacket;
-}
-
-const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByName(
-    const CFX_WideStringC& wsName) {
-  int32_t iLength = wsName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
-  int32_t iStart = 0, iEnd = g_iXFAEnumCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    const XFA_ATTRIBUTEENUMINFO* pInfo = g_XFAEnumData + iMid;
-    if (uHash == pInfo->uHash) {
-      return pInfo;
-    } else if (uHash < pInfo->uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByID(XFA_ATTRIBUTEENUM eName) {
-  return g_XFAEnumData + eName;
-}
-int32_t XFA_GetAttributeCount() {
-  return g_iXFAAttributeCount;
-}
-const XFA_ATTRIBUTEINFO* XFA_GetAttributeByName(const CFX_WideStringC& wsName) {
-  int32_t iLength = wsName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
-  int32_t iStart = 0, iEnd = g_iXFAAttributeCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    const XFA_ATTRIBUTEINFO* pInfo = g_XFAAttributeData + iMid;
-    if (uHash == pInfo->uHash) {
-      return pInfo;
-    } else if (uHash < pInfo->uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-const XFA_ATTRIBUTEINFO* XFA_GetAttributeByID(XFA_ATTRIBUTE eName) {
-  return (eName < g_iXFAAttributeCount) ? (g_XFAAttributeData + eName) : NULL;
-}
-FX_BOOL XFA_GetAttributeDefaultValue(void*& pValue,
-                                     XFA_ELEMENT eElement,
-                                     XFA_ATTRIBUTE eAttribute,
-                                     XFA_ATTRIBUTETYPE eType,
-                                     FX_DWORD dwPacket) {
-  const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttribute);
-  if (pInfo == NULL) {
-    return FALSE;
-  }
-  if (dwPacket && (dwPacket & pInfo->dwPackets) == 0) {
-    return FALSE;
-  }
-  if (pInfo->eType == eType) {
-    pValue = pInfo->pDefValue;
-    return TRUE;
-  } else if (pInfo->eType == XFA_ATTRIBUTETYPE_NOTSURE) {
-    const XFA_NOTSUREATTRIBUTE* pAttr =
-        XFA_GetNotsureAttribute(eElement, eAttribute, eType);
-    if (pAttr) {
-      pValue = pAttr->pValue;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-XFA_ATTRIBUTEENUM XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT eElement,
-                                                    XFA_ATTRIBUTE eAttribute,
-                                                    FX_DWORD dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_ATTRIBUTETYPE_Enum, dwPacket)) {
-    return (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
-  }
-  return XFA_ATTRIBUTEENUM_Unknown;
-}
-CFX_WideStringC XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT eElement,
-                                                   XFA_ATTRIBUTE eAttribute,
-                                                   FX_DWORD dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_ATTRIBUTETYPE_Cdata, dwPacket)) {
-    return (const FX_WCHAR*)pValue;
-  }
-  return NULL;
-}
-FX_BOOL XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT eElement,
-                                             XFA_ATTRIBUTE eAttribute,
-                                             FX_DWORD dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_ATTRIBUTETYPE_Boolean, dwPacket)) {
-    return (FX_BOOL)(uintptr_t)pValue;
-  }
-  return FALSE;
-}
-int32_t XFA_GetAttributeDefaultValue_Integer(XFA_ELEMENT eElement,
-                                             XFA_ATTRIBUTE eAttribute,
-                                             FX_DWORD dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_ATTRIBUTETYPE_Integer, dwPacket)) {
-    return (int32_t)(uintptr_t)pValue;
-  }
-  return 0;
-}
-CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT eElement,
-                                                      XFA_ATTRIBUTE eAttribute,
-                                                      FX_DWORD dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_ATTRIBUTETYPE_Measure, dwPacket)) {
-    return *(CXFA_Measurement*)pValue;
-  }
-  return CXFA_Measurement();
-}
-int32_t XFA_GetElementCount() {
-  return g_iXFAElementCount;
-}
-const XFA_ELEMENTINFO* XFA_GetElementByName(const CFX_WideStringC& wsName) {
-  int32_t iLength = wsName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
-  int32_t iStart = 0, iEnd = g_iXFAElementCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    const XFA_ELEMENTINFO* pInfo = g_XFAElementData + iMid;
-    if (uHash == pInfo->uHash) {
-      return pInfo;
-    } else if (uHash < pInfo->uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-const XFA_ELEMENTINFO* XFA_GetElementByID(XFA_ELEMENT eName) {
-  return (eName < g_iXFAElementCount) ? (g_XFAElementData + eName) : NULL;
-}
-const FX_WORD* XFA_GetElementChildren(XFA_ELEMENT eElement, int32_t& iCount) {
-  if (eElement >= g_iXFAElementCount) {
-    return NULL;
-  }
-  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementChildrenIndex + eElement;
-  iCount = pElement->wCount;
-  return g_XFAElementChildrenData + pElement->wStart;
-}
-const uint8_t* XFA_GetElementAttributes(XFA_ELEMENT eElement, int32_t& iCount) {
-  if (eElement >= g_iXFAElementCount) {
-    return NULL;
-  }
-  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementAttributeIndex + eElement;
-  iCount = pElement->wCount;
-  return g_XFAElementAttributeData + pElement->wStart;
-}
-const XFA_ATTRIBUTEINFO* XFA_GetAttributeOfElement(XFA_ELEMENT eElement,
-                                                   XFA_ATTRIBUTE eAttribute,
-                                                   FX_DWORD dwPacket) {
-  int32_t iCount = 0;
-  const uint8_t* pAttr = XFA_GetElementAttributes(eElement, iCount);
-  if (pAttr == NULL || iCount < 1) {
-    return NULL;
-  }
-  CFX_DSPATemplate<uint8_t> search;
-  int32_t index = search.Lookup(eAttribute, pAttr, iCount);
-  if (index < 0) {
-    return NULL;
-  }
-  const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttribute);
-  ASSERT(pInfo);
-  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
-    return pInfo;
-  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
-}
-const XFA_ELEMENTINFO* XFA_GetChildOfElement(XFA_ELEMENT eElement,
-                                             XFA_ELEMENT eChild,
-                                             FX_DWORD dwPacket) {
-  int32_t iCount = 0;
-  const FX_WORD* pChild = XFA_GetElementChildren(eElement, iCount);
-  if (pChild == NULL || iCount < 1) {
-    return NULL;
-  }
-  CFX_DSPATemplate<FX_WORD> search;
-  int32_t index = search.Lookup(eChild, pChild, iCount);
-  if (index < 0) {
-    return NULL;
-  }
-  const XFA_ELEMENTINFO* pInfo = XFA_GetElementByID(eChild);
-  ASSERT(pInfo);
-  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
-    return pInfo;
-  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
-}
-const XFA_PROPERTY* XFA_GetElementProperties(XFA_ELEMENT eElement,
-                                             int32_t& iCount) {
-  if (eElement >= g_iXFAElementCount) {
-    return NULL;
-  }
-  const XFA_ELEMENTHIERARCHY* pElement = g_XFAElementPropertyIndex + eElement;
-  iCount = pElement->wCount;
-  return g_XFAElementPropertyData + pElement->wStart;
-}
-const XFA_PROPERTY* XFA_GetPropertyOfElement(XFA_ELEMENT eElement,
-                                             XFA_ELEMENT eProperty,
-                                             FX_DWORD dwPacket) {
-  int32_t iCount = 0;
-  const XFA_PROPERTY* pProperty = XFA_GetElementProperties(eElement, iCount);
-  if (pProperty == NULL || iCount < 1) {
-    return NULL;
-  }
-  int32_t iStart = 0, iEnd = iCount - 1, iMid;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    XFA_ELEMENT eName = (XFA_ELEMENT)pProperty[iMid].eName;
-    if (eProperty == eName) {
-      break;
-    } else if (eProperty < eName) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  if (iStart > iEnd) {
-    return NULL;
-  }
-  const XFA_ELEMENTINFO* pInfo = XFA_GetElementByID(eProperty);
-  ASSERT(pInfo);
-  if (dwPacket == XFA_XDPPACKET_UNKNOWN)
-    return pProperty + iMid;
-  return (dwPacket & pInfo->dwPackets) ? (pProperty + iMid) : NULL;
-}
-const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(XFA_ELEMENT eElement,
-                                                    XFA_ATTRIBUTE eAttribute,
-                                                    XFA_ATTRIBUTETYPE eType) {
-  int32_t iStart = 0, iEnd = g_iXFANotsureCount - 1;
-  do {
-    int32_t iMid = (iStart + iEnd) / 2;
-    const XFA_NOTSUREATTRIBUTE* pAttr = g_XFANotsureAttributes + iMid;
-    if (eElement == pAttr->eElement) {
-      if (pAttr->eAttribute == eAttribute) {
-        if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
-          return pAttr;
-        }
-        return NULL;
-      } else {
-        int32_t iBefore = iMid - 1;
-        if (iBefore >= 0) {
-          pAttr = g_XFANotsureAttributes + iBefore;
-          while (eElement == pAttr->eElement) {
-            if (pAttr->eAttribute == eAttribute) {
-              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
-                return pAttr;
-              }
-              return NULL;
-            }
-            iBefore--;
-            if (iBefore < 0) {
-              break;
-            }
-            pAttr = g_XFANotsureAttributes + iBefore;
-          }
-        }
-        int32_t iAfter = iMid + 1;
-        if (iAfter <= g_iXFANotsureCount - 1) {
-          pAttr = g_XFANotsureAttributes + iAfter;
-          while (eElement == pAttr->eElement) {
-            if (pAttr->eAttribute == eAttribute) {
-              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
-                return pAttr;
-              }
-              return NULL;
-            }
-            iAfter++;
-            if (iAfter > g_iXFANotsureCount - 1) {
-              break;
-            }
-            pAttr = g_XFANotsureAttributes + iAfter;
-          }
-        }
-        return NULL;
-      }
-    } else if (eElement < pAttr->eElement) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-int32_t XFA_GetMethodCount() {
-  return g_iSomMethodCount;
-}
-const XFA_METHODINFO* XFA_GetMethodByName(XFA_ELEMENT eElement,
-                                          const CFX_WideStringC& wsMethodName) {
-  int32_t iLength = wsMethodName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  int32_t iElementIndex = eElement;
-  while (iElementIndex != -1) {
-    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
-    int32_t icount = scriptIndex->wMethodCount;
-    if (icount == 0) {
-      iElementIndex = scriptIndex->wParentIndex;
-      continue;
-    }
-    uint32_t uHash = FX_HashCode_String_GetW(wsMethodName.GetPtr(), iLength);
-    int32_t iStart = scriptIndex->wMethodStart, iEnd = iStart + icount - 1;
-    do {
-      int32_t iMid = (iStart + iEnd) / 2;
-      const XFA_METHODINFO* pInfo = g_SomMethodData + iMid;
-      if (uHash == pInfo->uHash) {
-        return pInfo;
-      } else if (uHash < pInfo->uHash) {
-        iEnd = iMid - 1;
-      } else {
-        iStart = iMid + 1;
-      }
-    } while (iStart <= iEnd);
-    iElementIndex = scriptIndex->wParentIndex;
-  }
-  return NULL;
-}
-const XFA_SCRIPTATTRIBUTEINFO* XFA_GetScriptAttributeByName(
-    XFA_ELEMENT eElement,
-    const CFX_WideStringC& wsAttributeName) {
-  int32_t iLength = wsAttributeName.GetLength();
-  if (iLength == 0) {
-    return NULL;
-  }
-  int32_t iElementIndex = eElement;
-  while (iElementIndex != -1) {
-    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
-    int32_t icount = scriptIndex->wAttributeCount;
-    if (icount == 0) {
-      iElementIndex = scriptIndex->wParentIndex;
-      continue;
-    }
-    uint32_t uHash = FX_HashCode_String_GetW(wsAttributeName.GetPtr(), iLength);
-    int32_t iStart = scriptIndex->wAttributeStart, iEnd = iStart + icount - 1;
-    do {
-      int32_t iMid = (iStart + iEnd) / 2;
-      const XFA_SCRIPTATTRIBUTEINFO* pInfo = g_SomAttributeData + iMid;
-      if (uHash == pInfo->uHash) {
-        return pInfo;
-      } else if (uHash < pInfo->uHash) {
-        iEnd = iMid - 1;
-      } else {
-        iStart = iMid + 1;
-      }
-    } while (iStart <= iEnd);
-    iElementIndex = scriptIndex->wParentIndex;
-  }
-  return NULL;
-}
-void CXFA_Measurement::Set(const CFX_WideStringC& wsMeasure) {
-  if (wsMeasure.IsEmpty()) {
-    m_fValue = 0;
-    m_eUnit = XFA_UNIT_Unknown;
-    return;
-  }
-  int32_t iUsedLen = 0;
-  int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0;
-  FX_FLOAT fValue = FX_wcstof(wsMeasure.GetPtr() + iOffset,
-                              wsMeasure.GetLength() - iOffset, &iUsedLen);
-  XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen));
-  Set(fValue, eUnit);
-}
-FX_BOOL CXFA_Measurement::ToString(CFX_WideString& wsMeasure) const {
-  switch (GetUnit()) {
-    case XFA_UNIT_Mm:
-      wsMeasure.Format(L"%.8gmm", GetValue());
-      return TRUE;
-    case XFA_UNIT_Pt:
-      wsMeasure.Format(L"%.8gpt", GetValue());
-      return TRUE;
-    case XFA_UNIT_In:
-      wsMeasure.Format(L"%.8gin", GetValue());
-      return TRUE;
-    case XFA_UNIT_Cm:
-      wsMeasure.Format(L"%.8gcm", GetValue());
-      return TRUE;
-    case XFA_UNIT_Mp:
-      wsMeasure.Format(L"%.8gmp", GetValue());
-      return TRUE;
-    case XFA_UNIT_Pc:
-      wsMeasure.Format(L"%.8gpc", GetValue());
-      return TRUE;
-    case XFA_UNIT_Em:
-      wsMeasure.Format(L"%.8gem", GetValue());
-      return TRUE;
-    case XFA_UNIT_Percent:
-      wsMeasure.Format(L"%.8g%%", GetValue());
-      return TRUE;
-    default:
-      wsMeasure.Format(L"%.8g", GetValue());
-      return FALSE;
-  }
-}
-FX_BOOL CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT& fValue) const {
-  fValue = GetValue();
-  XFA_UNIT eFrom = GetUnit();
-  if (eFrom == eUnit) {
-    return TRUE;
-  }
-  switch (eFrom) {
-    case XFA_UNIT_Pt:
-      break;
-    case XFA_UNIT_Mm:
-      fValue *= 72 / 2.54f / 10;
-      break;
-    case XFA_UNIT_In:
-      fValue *= 72;
-      break;
-    case XFA_UNIT_Cm:
-      fValue *= 72 / 2.54f;
-      break;
-    case XFA_UNIT_Mp:
-      fValue *= 0.001f;
-      break;
-    case XFA_UNIT_Pc:
-      fValue *= 12.0f;
-      break;
-    default:
-      fValue = 0;
-      return FALSE;
-  }
-  switch (eUnit) {
-    case XFA_UNIT_Pt:
-      return TRUE;
-    case XFA_UNIT_Mm:
-      fValue /= 72 / 2.54f / 10;
-      return TRUE;
-    case XFA_UNIT_In:
-      fValue /= 72;
-      return TRUE;
-    case XFA_UNIT_Cm:
-      fValue /= 72 / 2.54f;
-      return TRUE;
-    case XFA_UNIT_Mp:
-      fValue /= 0.001f;
-      return TRUE;
-    case XFA_UNIT_Pc:
-      fValue /= 12.0f;
-      return TRUE;
-    default:
-      fValue = 0;
-      return FALSE;
-  }
-  return FALSE;
-}
-XFA_UNIT CXFA_Measurement::GetUnit(const CFX_WideStringC& wsUnit) {
-  if (wsUnit == FX_WSTRC(L"mm")) {
-    return XFA_UNIT_Mm;
-  } else if (wsUnit == FX_WSTRC(L"pt")) {
-    return XFA_UNIT_Pt;
-  } else if (wsUnit == FX_WSTRC(L"in")) {
-    return XFA_UNIT_In;
-  } else if (wsUnit == FX_WSTRC(L"cm")) {
-    return XFA_UNIT_Cm;
-  } else if (wsUnit == FX_WSTRC(L"pc")) {
-    return XFA_UNIT_Pc;
-  } else if (wsUnit == FX_WSTRC(L"mp")) {
-    return XFA_UNIT_Mp;
-  } else if (wsUnit == FX_WSTRC(L"em")) {
-    return XFA_UNIT_Em;
-  } else if (wsUnit == FX_WSTRC(L"%")) {
-    return XFA_UNIT_Percent;
-  } else {
-    return XFA_UNIT_Unknown;
-  }
-}
-IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString& wsBuffer) {
-  return new CXFA_WideTextRead(wsBuffer);
-}
-CXFA_WideTextRead::CXFA_WideTextRead(const CFX_WideString& wsBuffer)
-    : m_wsBuffer(wsBuffer), m_iPosition(0), m_iRefCount(1) {}
-void CXFA_WideTextRead::Release() {
-  if (--m_iRefCount < 1) {
-    delete this;
-  }
-}
-IFX_Stream* CXFA_WideTextRead::Retain() {
-  m_iRefCount++;
-  return this;
-}
-FX_DWORD CXFA_WideTextRead::GetAccessModes() const {
-  return FX_STREAMACCESS_Read | FX_STREAMACCESS_Text;
-}
-int32_t CXFA_WideTextRead::GetLength() const {
-  return m_wsBuffer.GetLength() * sizeof(FX_WCHAR);
-}
-int32_t CXFA_WideTextRead::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
-  switch (eSeek) {
-    case FX_STREAMSEEK_Begin:
-      m_iPosition = iOffset;
-      break;
-    case FX_STREAMSEEK_Current:
-      m_iPosition += iOffset;
-      break;
-    case FX_STREAMSEEK_End:
-      m_iPosition = m_wsBuffer.GetLength() + iOffset;
-      break;
-  }
-  if (m_iPosition < 0) {
-    m_iPosition = 0;
-  }
-  if (m_iPosition > m_wsBuffer.GetLength()) {
-    m_iPosition = m_wsBuffer.GetLength();
-  }
-  return GetPosition();
-}
-int32_t CXFA_WideTextRead::GetPosition() {
-  return m_iPosition * sizeof(FX_WCHAR);
-}
-FX_BOOL CXFA_WideTextRead::IsEOF() const {
-  return m_iPosition >= m_wsBuffer.GetLength();
-}
-int32_t CXFA_WideTextRead::ReadString(FX_WCHAR* pStr,
-                                      int32_t iMaxLength,
-                                      FX_BOOL& bEOS,
-                                      int32_t const* pByteSize) {
-  if (iMaxLength > m_wsBuffer.GetLength() - m_iPosition) {
-    iMaxLength = m_wsBuffer.GetLength() - m_iPosition;
-  }
-  FXSYS_wcsncpy(pStr, (const FX_WCHAR*)m_wsBuffer + m_iPosition, iMaxLength);
-  m_iPosition += iMaxLength;
-  bEOS = IsEOF();
-  return iMaxLength;
-}
-FX_WORD CXFA_WideTextRead::GetCodePage() const {
-  return (sizeof(FX_WCHAR) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE;
-}
-FX_WORD CXFA_WideTextRead::SetCodePage(FX_WORD wCodePage) {
-  return GetCodePage();
-}
diff --git a/xfa/src/fxfa/parser/xfa_basic_imp.h b/xfa/src/fxfa/parser/xfa_basic_imp.h
deleted file mode 100644
index 562cf15..0000000
--- a/xfa/src/fxfa/parser/xfa_basic_imp.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_BASIC_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_BASIC_IMP_H_
-
-#include "xfa/include/fxfa/fxfa_basic.h"
-#include "xfa/src/fgas/crt/fgas_stream.h"
-
-struct XFA_NOTSUREATTRIBUTE {
-  XFA_ELEMENT eElement;
-  XFA_ATTRIBUTE eAttribute;
-  XFA_ATTRIBUTETYPE eType;
-  void* pValue;
-};
-const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(
-    XFA_ELEMENT eElement,
-    XFA_ATTRIBUTE eAttribute,
-    XFA_ATTRIBUTETYPE eType = XFA_ATTRIBUTETYPE_NOTSURE);
-
-class CXFA_WideTextRead : public IFX_Stream {
- public:
-  CXFA_WideTextRead(const CFX_WideString& wsBuffer);
-  virtual void Release();
-  virtual IFX_Stream* Retain();
-
-  virtual FX_DWORD GetAccessModes() const;
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
-
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS,
-                             int32_t const* pByteSize = NULL);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-    return 0;
-  }
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-    return 0;
-  }
-  virtual void Flush() {}
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
-
-  virtual int32_t GetBOM(uint8_t bom[4]) const { return 0; }
-  virtual FX_WORD GetCodePage() const;
-  virtual FX_WORD SetCodePage(FX_WORD wCodePage);
-
-  virtual void Lock() {}
-  virtual void Unlock() {}
-
-  virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
-                                         int32_t iOffset,
-                                         int32_t iLength) {
-    return NULL;
-  }
-
-  CFX_WideString GetSrcText() const { return m_wsBuffer; }
-
- protected:
-  CFX_WideString m_wsBuffer;
-  int32_t m_iPosition;
-  int32_t m_iRefCount;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_BASIC_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_docdata.h b/xfa/src/fxfa/parser/xfa_docdata.h
deleted file mode 100644
index 5c6cf13..0000000
--- a/xfa/src/fxfa/parser/xfa_docdata.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCDATA_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCDATA_H_
-
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-enum XFA_DATAFORMAT {
-  XFA_DATAFORMAT_XDP,
-};
-
-class IXFA_PacketExport {
- public:
-  static IXFA_PacketExport* Create(CXFA_Document* pDocument,
-                                   XFA_DATAFORMAT eFormat = XFA_DATAFORMAT_XDP);
-  virtual ~IXFA_PacketExport() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL Export(IFX_FileWrite* pWrite) = 0;
-  virtual FX_BOOL Export(IFX_FileWrite* pWrite,
-                         CXFA_Node* pNode,
-                         FX_DWORD dwFlag = 0,
-                         const FX_CHAR* pChecksum = NULL) = 0;
-};
-class IXFA_PacketImport {
- public:
-  static IXFA_PacketImport* Create(CXFA_Document* pDstDoc);
-  virtual ~IXFA_PacketImport() {}
-  virtual void Release() = 0;
-  virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument) = 0;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCDATA_H_
diff --git a/xfa/src/fxfa/parser/xfa_doclayout.h b/xfa/src/fxfa/parser/xfa_doclayout.h
deleted file mode 100644
index 1ebe412..0000000
--- a/xfa/src/fxfa/parser/xfa_doclayout.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCLAYOUT_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCLAYOUT_H_
-
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-class CXFA_ContainerLayoutItem;
-class CXFA_ContentLayoutItem;
-class IXFA_DocLayout;
-
-class IXFA_LayoutPage {
- public:
-  virtual ~IXFA_LayoutPage() {}
-  virtual IXFA_DocLayout* GetLayout() const = 0;
-  virtual int32_t GetPageIndex() const = 0;
-  virtual void GetPageSize(CFX_SizeF& size) = 0;
-  virtual CXFA_Node* GetMasterPage() const = 0;
-};
-
-class CXFA_LayoutItem {
- public:
-  virtual ~CXFA_LayoutItem();
-
-  FX_BOOL IsContainerLayoutItem() const { return !m_bIsContentLayoutItem; }
-  FX_BOOL IsContentLayoutItem() const { return m_bIsContentLayoutItem; }
-  inline CXFA_ContainerLayoutItem* AsContainerLayoutItem();
-  inline CXFA_ContentLayoutItem* AsContentLayoutItem();
-
-  IXFA_LayoutPage* GetPage() const;
-  CXFA_Node* GetFormNode() const;
-  void GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative = FALSE) const;
-  int32_t GetIndex() const;
-  int32_t GetCount() const;
-  CXFA_LayoutItem* GetParent() const;
-  const CXFA_LayoutItem* GetFirst() const;
-  CXFA_LayoutItem* GetFirst();
-  const CXFA_LayoutItem* GetLast() const;
-  CXFA_LayoutItem* GetLast();
-  CXFA_LayoutItem* GetPrev() const;
-  CXFA_LayoutItem* GetNext() const;
-
-  void AddChild(CXFA_LayoutItem* pChildItem);
-  void AddHeadChild(CXFA_LayoutItem* pChildItem);
-  void RemoveChild(CXFA_LayoutItem* pChildItem);
-  void InsertChild(CXFA_LayoutItem* pBeforeItem, CXFA_LayoutItem* pChildItem);
-
-  CXFA_Node* m_pFormNode;
-  CXFA_LayoutItem* m_pParent;
-  CXFA_LayoutItem* m_pNextSibling;
-  CXFA_LayoutItem* m_pFirstChild;
-
- protected:
-  CXFA_LayoutItem(CXFA_Node* pNode, FX_BOOL bIsContentLayoutItem);
-
-  FX_BOOL m_bIsContentLayoutItem;
-};
-
-class CXFA_ContainerLayoutItem : public CXFA_LayoutItem,
-                                 public IXFA_LayoutPage {
- public:
-  CXFA_ContainerLayoutItem(CXFA_Node* pNode);
-
-  // IXFA_LayoutPage:
-  IXFA_DocLayout* GetLayout() const override;
-  int32_t GetPageIndex() const override;
-  void GetPageSize(CFX_SizeF& size) override;
-  CXFA_Node* GetMasterPage() const override;
-
-  CXFA_Node* m_pOldSubform;
-};
-
-#define XFA_WIDGETSTATUS_Access 0x80000000
-#define XFA_WIDGETSTATUS_Disabled 0x40000000
-#define XFA_WIDGETSTATUS_RectCached 0x20000000
-#define XFA_WIDGETSTATUS_ButtonDown 0x10000000
-#define XFA_WIDGETSTATUS_Highlight 0x08000000
-#define XFA_WIDGETSTATUS_TextEditValueChanged 0x04000000
-
-class CXFA_ContentLayoutItem : public CXFA_LayoutItem {
- public:
-  CXFA_ContentLayoutItem(CXFA_Node* pNode);
-  virtual ~CXFA_ContentLayoutItem();
-
-  CXFA_ContentLayoutItem* m_pPrev;
-  CXFA_ContentLayoutItem* m_pNext;
-  CFX_PointF m_sPos;
-  CFX_SizeF m_sSize;
-  FX_DWORD m_dwStatus;
-};
-
-CXFA_ContainerLayoutItem* CXFA_LayoutItem::AsContainerLayoutItem() {
-  return IsContainerLayoutItem() ? static_cast<CXFA_ContainerLayoutItem*>(this)
-                                 : nullptr;
-}
-CXFA_ContentLayoutItem* CXFA_LayoutItem::AsContentLayoutItem() {
-  return IsContentLayoutItem() ? static_cast<CXFA_ContentLayoutItem*>(this)
-                               : nullptr;
-}
-inline CXFA_ContainerLayoutItem* ToContainerLayoutItem(CXFA_LayoutItem* pItem) {
-  return pItem ? pItem->AsContainerLayoutItem() : nullptr;
-}
-inline CXFA_ContentLayoutItem* ToContentLayoutItem(CXFA_LayoutItem* pItem) {
-  return pItem ? pItem->AsContentLayoutItem() : nullptr;
-}
-
-class CXFA_TraverseStrategy_LayoutItem {
- public:
-  static inline CXFA_LayoutItem* GetFirstChild(CXFA_LayoutItem* pLayoutItem) {
-    return pLayoutItem->m_pFirstChild;
-  }
-  static inline CXFA_LayoutItem* GetNextSibling(CXFA_LayoutItem* pLayoutItem) {
-    return pLayoutItem->m_pNextSibling;
-  }
-  static inline CXFA_LayoutItem* GetParent(CXFA_LayoutItem* pLayoutItem) {
-    return pLayoutItem->m_pParent;
-  }
-};
-
-class IXFA_DocLayout {
- public:
-  virtual ~IXFA_DocLayout() {}
-  virtual CXFA_Document* GetDocument() const = 0;
-  virtual int32_t StartLayout(FX_BOOL bForceRestart = FALSE) = 0;
-  virtual int32_t DoLayout(IFX_Pause* pPause = NULL) = 0;
-  virtual FX_BOOL IncrementLayout() = 0;
-  virtual int32_t CountPages() const = 0;
-  virtual IXFA_LayoutPage* GetPage(int32_t index) const = 0;
-  virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem) = 0;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCLAYOUT_H_
diff --git a/xfa/src/fxfa/parser/xfa_document.h b/xfa/src/fxfa/parser/xfa_document.h
deleted file mode 100644
index d17c988..0000000
--- a/xfa/src/fxfa/parser/xfa_document.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CXFA_Document;
-class CXFA_LayoutItem;
-class CXFA_LayoutProcessor;
-class CXFA_Node;
-class IXFA_DocLayout;
-class IXFA_DocParser;
-class IXFA_LayoutPage;
-class IXFA_Notify;
-class IXFA_ObjFactory;
-class IXFA_ScriptContext;
-
-enum XFA_VERSION {
-  XFA_VERSION_UNKNOWN = 0,
-  XFA_VERSION_200 = 200,
-  XFA_VERSION_202 = 202,
-  XFA_VERSION_204 = 204,
-  XFA_VERSION_205 = 205,
-  XFA_VERSION_206 = 206,
-  XFA_VERSION_207 = 207,
-  XFA_VERSION_208 = 208,
-  XFA_VERSION_300 = 300,
-  XFA_VERSION_301 = 301,
-  XFA_VERSION_303 = 303,
-  XFA_VERSION_306 = 306,
-  XFA_VERSION_DEFAULT = XFA_VERSION_303,
-  XFA_VERSION_MIN = 200,
-  XFA_VERSION_MAX = 400,
-};
-
-#define XFA_LAYOUTSTATUS_Visible 0x0001
-#define XFA_LAYOUTSTATUS_Viewable 0x0010
-#define XFA_LAYOUTSTATUS_Printable 0x0020
-enum XFA_NODEEVENT {
-  XFA_NODEEVENT_Ready,
-  XFA_NODEEVENT_ValueChanging,
-  XFA_NODEEVENT_ValueChanged,
-  XFA_NODEEVENT_ChildAdded,
-  XFA_NODEEVENT_ChildRemoved,
-};
-enum XFA_PAGEEVENT {
-  XFA_PAGEEVENT_PageAdded,
-  XFA_PAGEEVENT_PageRemoved,
-};
-enum XFA_LAYOUTEVENT {
-  XFA_LAYOUTEVENT_ItemAdded,
-  XFA_LAYOUTEVENT_ItemRemoving,
-  XFA_LAYOUTEVENT_RectChanged,
-  XFA_LAYOUTEVENT_StatusChanged,
-};
-enum XFA_LAYOUTRESULT {
-  XFA_LAYOUTRESULT_Continue,
-  XFA_LAYOUTRESULT_Done,
-  XFA_LAYOUTRESULT_NextContent,
-};
-#define XFA_LAYOUTNOTIFY_StrictHeight 0x0001
-#define XFA_LAYOUTNOTIFY_NoParentBreak 0x0002
-
-class IXFA_Notify {
- public:
-  virtual ~IXFA_Notify() {}
-  virtual void OnPageEvent(IXFA_LayoutPage* pSender,
-                           XFA_PAGEEVENT eEvent,
-                           void* pParam = NULL) = 0;
-
-  virtual void OnNodeEvent(CXFA_Node* pSender,
-                           XFA_NODEEVENT eEvent,
-                           void* pParam = NULL,
-                           void* pParam2 = NULL,
-                           void* pParam3 = NULL,
-                           void* pParam4 = NULL) = 0;
-  virtual void OnWidgetDataEvent(CXFA_WidgetData* pSender,
-                                 FX_DWORD dwEvent,
-                                 void* pParam = NULL,
-                                 void* pAdditional = NULL,
-                                 void* pAdditional2 = NULL) = 0;
-
-  virtual CXFA_LayoutItem* OnCreateLayoutItem(CXFA_Node* pNode) = 0;
-  virtual void OnLayoutEvent(IXFA_DocLayout* pLayout,
-                             CXFA_LayoutItem* pSender,
-                             XFA_LAYOUTEVENT eEvent,
-                             void* pParam = NULL,
-                             void* pParam2 = NULL) = 0;
-  virtual void StartFieldDrawLayout(CXFA_Node* pItem,
-                                    FX_FLOAT& fCalcWidth,
-                                    FX_FLOAT& fCalcHeight) = 0;
-  virtual FX_BOOL FindSplitPos(CXFA_Node* pItem,
-                               int32_t iBlockIndex,
-                               FX_FLOAT& fCalcHeightPos) = 0;
-  virtual FX_BOOL RunScript(CXFA_Node* pScript, CXFA_Node* pFormItem) = 0;
-  virtual int32_t ExecEventByDeepFirst(CXFA_Node* pFormNode,
-                                       XFA_EVENTTYPE eEventType,
-                                       FX_BOOL bIsFormReady = FALSE,
-                                       FX_BOOL bRecursive = TRUE,
-                                       CXFA_WidgetAcc* pExclude = NULL) = 0;
-  virtual void AddCalcValidate(CXFA_Node* pNode) = 0;
-  virtual IXFA_Doc* GetHDOC() = 0;
-  virtual IXFA_DocProvider* GetDocProvider() = 0;
-  virtual IXFA_AppProvider* GetAppProvider() = 0;
-  virtual IXFA_WidgetHandler* GetWidgetHandler() = 0;
-  virtual IXFA_Widget* GetHWidget(CXFA_LayoutItem* pLayoutItem) = 0;
-  virtual void OpenDropDownList(IXFA_Widget* hWidget) = 0;
-  virtual CFX_WideString GetCurrentDateTime() = 0;
-  virtual void ResetData(CXFA_WidgetData* pWidgetData = NULL) = 0;
-  virtual int32_t GetLayoutStatus() = 0;
-  virtual void RunNodeInitialize(CXFA_Node* pNode) = 0;
-  virtual void RunSubformIndexChange(CXFA_Node* pSubformNode) = 0;
-  virtual CXFA_Node* GetFocusWidgetNode() = 0;
-  virtual void SetFocusWidgetNode(CXFA_Node* pNode) = 0;
-};
-class IXFA_ObjFactory {
- public:
-  virtual ~IXFA_ObjFactory() {}
-  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) = 0;
-  virtual CXFA_Node* CreateNode(const XFA_PACKETINFO* pPacket,
-                                XFA_ELEMENT eElement) = 0;
-};
-#define XFA_DOCFLAG_StrictScoping 0x0001
-#define XFA_DOCFLAG_HasInteractive 0x0002
-#define XFA_DOCFLAG_Interactive 0x0004
-#define XFA_DOCFLAG_Scripting 0x0008
-class CScript_DataWindow;
-class CScript_EventPseudoModel;
-class CScript_HostPseudoModel;
-class CScript_LogPseudoModel;
-class CScript_LayoutPseudoModel;
-class CScript_SignaturePseudoModel;
-class CXFA_Document : public IXFA_ObjFactory {
- public:
-  CXFA_Document(IXFA_DocParser* pParser);
-  ~CXFA_Document();
-  CXFA_Node* GetRoot() const { return m_pRootNode; }
-  IXFA_DocParser* GetParser() const { return m_pParser; }
-  IXFA_Notify* GetNotify() const;
-  void SetRoot(CXFA_Node* pNewRoot);
-  CXFA_Object* GetXFAObject(const CFX_WideStringC& wsNodeName);
-  CXFA_Object* GetXFAObject(FX_DWORD wsNodeNameHash);
-  void AddPurgeNode(CXFA_Node* pNode);
-  FX_BOOL RemovePurgeNode(CXFA_Node* pNode);
-  void PurgeNodes();
-  bool HasFlag(FX_DWORD dwFlag) { return (m_dwDocFlags & dwFlag) == dwFlag; }
-  void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE);
-  FX_BOOL IsInteractive();
-  XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; }
-  XFA_VERSION RecognizeXFAVersionNumber(CFX_WideString& wsTemplateNS);
-  CXFA_LocaleMgr* GetLocalMgr();
-  virtual CXFA_Node* CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement);
-  virtual CXFA_Node* CreateNode(const XFA_PACKETINFO* pPacket,
-                                XFA_ELEMENT eElement);
-  void DoProtoMerge();
-  CXFA_Node* GetNodeByID(CXFA_Node* pRoot, const CFX_WideStringC& wsID);
-  void DoDataMerge();
-  void DoDataRemerge(FX_BOOL bDoDataMerge);
-  CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
-                                     CXFA_Node* pFormNode,
-                                     CXFA_Node* pDataScope,
-                                     FX_BOOL bOneInstance = FALSE,
-                                     FX_BOOL bDataMerge = TRUE,
-                                     FX_BOOL bUpLevel = TRUE);
-  void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot);
-  CXFA_Node* GetNotBindNode(CXFA_ObjArray& arrayNodes);
-  CXFA_LayoutProcessor* GetLayoutProcessor();
-  IXFA_DocLayout* GetDocLayout();
-  IXFA_ScriptContext* InitScriptContext(FXJSE_HRUNTIME hRuntime);
-  IXFA_ScriptContext* GetScriptContext();
-  void ClearLayoutData();
-
-  CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> m_rgGlobalBinding;
-  CXFA_NodeArray m_pPendingPageSet;
-
- protected:
-  IXFA_DocParser* m_pParser;
-  IXFA_ScriptContext* m_pScriptContext;
-  CXFA_LayoutProcessor* m_pLayoutProcessor;
-  CXFA_Node* m_pRootNode;
-  CXFA_LocaleMgr* m_pLocalMgr;
-  CScript_DataWindow* m_pScriptDataWindow;
-  CScript_EventPseudoModel* m_pScriptEvent;
-  CScript_HostPseudoModel* m_pScriptHost;
-  CScript_LogPseudoModel* m_pScriptLog;
-  CScript_LayoutPseudoModel* m_pScriptLayout;
-  CScript_SignaturePseudoModel* m_pScriptSignature;
-  CXFA_NodeSet m_rgPurgeNodes;
-  XFA_VERSION m_eCurVersionMode;
-  FX_DWORD m_dwDocFlags;
-  friend class CXFA_SimpleParser;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_H_
diff --git a/xfa/src/fxfa/parser/xfa_document_datadescription_imp.cpp b/xfa/src/fxfa/parser/xfa_document_datadescription_imp.cpp
deleted file mode 100644
index 321fbbd..0000000
--- a/xfa/src/fxfa/parser/xfa_document_datadescription_imp.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-#define XFA_HASHCODE_Group 0xf7f75fcd
-
-class CXFA_TraverseStrategy_DDGroup {
- public:
-  static inline CXFA_Node* GetFirstChild(CXFA_Node* pDDGroupNode) {
-    return pDDGroupNode->GetFirstChildByName(XFA_HASHCODE_Group);
-  }
-  static inline CXFA_Node* GetNextSibling(CXFA_Node* pDDGroupNode) {
-    return pDDGroupNode->GetNextSameNameSibling(XFA_HASHCODE_Group);
-  }
-  static inline CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) {
-    return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-};
-void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode,
-                                            CXFA_Node* pDataDescriptionNode) {
-  FXSYS_assert(pDataDescriptionNode);
-  for (CXFA_Node* pDataChild = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pDataChild;
-       pDataChild = pDataChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    FX_DWORD dwNameHash = pDataChild->GetNameHash();
-    XFA_ELEMENT eType = pDataChild->GetClassID();
-    if (!dwNameHash) {
-      continue;
-    }
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup>
-        sIterator(pDataDescriptionNode);
-    for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode;
-         pDDGroupNode = sIterator.MoveToNext()) {
-      if (pDDGroupNode != pDataDescriptionNode) {
-        if (pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) {
-          continue;
-        }
-        CFX_WideString wsNamespace;
-        if (!pDDGroupNode->TryNamespace(wsNamespace) ||
-            wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
-          continue;
-        }
-      }
-      CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(dwNameHash);
-      if (!pDDNode) {
-        continue;
-      }
-      if (pDDNode->GetClassID() != eType) {
-        break;
-      }
-      pDataChild->SetDataDescriptionNode(pDDNode);
-      XFA_DataDescription_UpdateDataRelation(pDataChild, pDDNode);
-      break;
-    }
-  }
-}
-CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(
-    CXFA_Document* pDocument,
-    CXFA_Node* pDataParent,
-    XFA_ELEMENT eNodeType,
-    const CFX_WideStringC& wsName) {
-  if (!pDataParent) {
-    return NULL;
-  }
-  CXFA_Node* pParentDDNode = pDataParent->GetDataDescriptionNode();
-  if (!pParentDDNode) {
-    CXFA_Node* pDataNode =
-        pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
-    FXSYS_assert(pDataNode);
-    pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
-    pDataNode->CreateXMLMappingNode();
-    pDataParent->InsertChild(pDataNode);
-    pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-    return pDataNode;
-  } else {
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup>
-        sIterator(pParentDDNode);
-    for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode;
-         pDDGroupNode = sIterator.MoveToNext()) {
-      if (pDDGroupNode != pParentDDNode) {
-        if (pDDGroupNode->GetClassID() != XFA_ELEMENT_DataGroup) {
-          continue;
-        }
-        CFX_WideString wsNamespace;
-        if (!pDDGroupNode->TryNamespace(wsNamespace) ||
-            wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
-          continue;
-        }
-      }
-      CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(wsName);
-      if (!pDDNode) {
-        continue;
-      }
-      if (pDDNode->GetClassID() != eNodeType) {
-        break;
-      }
-      CXFA_Node* pDataNode =
-          pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
-      FXSYS_assert(pDataNode);
-      pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
-      pDataNode->CreateXMLMappingNode();
-      if (eNodeType == XFA_ELEMENT_DataValue &&
-          pDDNode->GetEnum(XFA_ATTRIBUTE_Contains) ==
-              XFA_ATTRIBUTEENUM_MetaData) {
-        pDataNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_MetaData);
-      }
-      pDataParent->InsertChild(pDataNode);
-      pDataNode->SetDataDescriptionNode(pDDNode);
-      pDataNode->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      return pDataNode;
-    }
-    return NULL;
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_document_datadescription_imp.h b/xfa/src/fxfa/parser/xfa_document_datadescription_imp.h
deleted file mode 100644
index bf0b1a4..0000000
--- a/xfa/src/fxfa/parser/xfa_document_datadescription_imp.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
-
-void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode,
-                                            CXFA_Node* pDataDescriptionNode);
-CXFA_Node* XFA_DataDescription_MaybeCreateDataNode(
-    CXFA_Document* pDocument,
-    CXFA_Node* pDataParent,
-    XFA_ELEMENT eNodeType,
-    const CFX_WideStringC& wsName);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/src/fxfa/parser/xfa_document_datamerger_imp.cpp
deleted file mode 100644
index ecbbba7..0000000
--- a/xfa/src/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ /dev/null
@@ -1,1429 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_document_datamerger_imp.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_datadescription_imp.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-static FX_BOOL XFA_GetOccurInfo(CXFA_Node* pOccurNode,
-                                int32_t& iMin,
-                                int32_t& iMax,
-                                int32_t& iInit) {
-  if (!pOccurNode) {
-    return FALSE;
-  }
-  CXFA_Occur occur(pOccurNode);
-  return occur.GetOccurInfo(iMin, iMax, iInit);
-}
-struct XFA_DataMerge_RecurseRecord {
-  CXFA_Node* pTemplateChild;
-  CXFA_Node* pDataChild;
-};
-static CXFA_Node* XFA_DataMerge_FormValueNode_CreateChild(
-    CXFA_Node* pValueNode,
-    XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) {
-  CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (!pChildNode) {
-    if (iType == XFA_ELEMENT_UNKNOWN) {
-      return FALSE;
-    }
-    pChildNode = pValueNode->GetProperty(0, iType);
-  }
-  return pChildNode;
-}
-static void XFA_DataMerge_FormValueNode_MatchNoneCreateChild(
-    CXFA_Node* pFormNode) {
-  CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData();
-  FXSYS_assert(pWidgetData);
-  pWidgetData->GetUIType();
-}
-static FX_BOOL XFA_DataMerge_FormValueNode_SetChildContent(
-    CXFA_Node* pValueNode,
-    const CFX_WideString& wsContent,
-    XFA_ELEMENT iType = XFA_ELEMENT_UNKNOWN) {
-  if (!pValueNode) {
-    return FALSE;
-  }
-  FXSYS_assert(pValueNode->GetPacketID() == XFA_XDPPACKET_Form);
-  CXFA_Node* pChildNode =
-      XFA_DataMerge_FormValueNode_CreateChild(pValueNode, iType);
-  if (!pChildNode) {
-    return FALSE;
-  }
-  XFA_OBJECTTYPE objectType = pChildNode->GetObjectType();
-  switch (objectType) {
-    case XFA_OBJECTTYPE_ContentNode: {
-      CXFA_Node* pContentRawDataNode =
-          pChildNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!pContentRawDataNode) {
-        XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
-        if (pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
-          CFX_WideString wsContentType;
-          pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
-                                   FALSE);
-          if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-            element = XFA_ELEMENT_SharpxHTML;
-          } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
-            element = XFA_ELEMENT_Sharpxml;
-          }
-        }
-        pContentRawDataNode = pChildNode->CreateSamePacketNode(element);
-        pChildNode->InsertChild(pContentRawDataNode);
-      }
-      pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
-    } break;
-    case XFA_OBJECTTYPE_NodeC:
-    case XFA_OBJECTTYPE_TextNode:
-    case XFA_OBJECTTYPE_NodeV: {
-      pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
-    } break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  return TRUE;
-}
-static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode,
-                                            CXFA_Node* pDataNode,
-                                            FX_BOOL bDataToForm = TRUE) {
-  pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode);
-  pDataNode->AddBindItem(pFormNode);
-  XFA_ELEMENT eClass = pFormNode->GetClassID();
-  if (eClass != XFA_ELEMENT_Field && eClass != XFA_ELEMENT_ExclGroup) {
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData();
-  FXSYS_assert(pWidgetData);
-  FX_BOOL bNotify = FALSE;
-  XFA_ELEMENT eUIType = pWidgetData->GetUIType();
-  CXFA_Value defValue(pFormNode->GetProperty(0, XFA_ELEMENT_Value));
-  if (!bDataToForm) {
-    CFX_WideString wsValue;
-    CFX_WideString wsFormatedValue;
-    switch (eUIType) {
-      case XFA_ELEMENT_ImageEdit: {
-        CXFA_Image image = defValue.GetImage();
-        CFX_WideString wsContentType;
-        CFX_WideString wsHref;
-        if (image) {
-          image.GetContent(wsValue);
-          image.GetContentType(wsContentType);
-          image.GetHref(wsHref);
-        }
-        IFDE_XMLElement* pXMLDataElement =
-            (IFDE_XMLElement*)(pDataNode->GetXMLMappingNode());
-        FXSYS_assert(pXMLDataElement);
-        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
-        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-        pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-        if (!wsHref.IsEmpty()) {
-          pXMLDataElement->SetString(FX_WSTRC(L"href"), wsHref);
-        }
-      } break;
-      case XFA_ELEMENT_ChoiceList:
-        defValue.GetChildValueContent(wsValue);
-        if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-          CFX_WideStringArray wsSelTextArray;
-          pWidgetData->GetSelectedItemsValue(wsSelTextArray);
-          int32_t iSize = wsSelTextArray.GetSize();
-          if (iSize >= 1) {
-            CXFA_Node* pValue = NULL;
-            for (int32_t i = 0; i < iSize; i++) {
-              pValue = pDataNode->CreateSamePacketNode(XFA_ELEMENT_DataValue);
-              pValue->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value"));
-              pValue->CreateXMLMappingNode();
-              pDataNode->InsertChild(pValue);
-              pValue->SetCData(XFA_ATTRIBUTE_Value, wsSelTextArray[i]);
-            }
-          } else {
-            IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
-            FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
-            ((IFDE_XMLElement*)pXMLNode)
-                ->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup"));
-          }
-        } else if (!wsValue.IsEmpty()) {
-          pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
-          pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-        }
-        break;
-      case XFA_ELEMENT_CheckButton:
-        defValue.GetChildValueContent(wsValue);
-        if (wsValue.IsEmpty()) {
-          break;
-        }
-        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
-        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-        break;
-      case XFA_ELEMENT_ExclGroup: {
-        CXFA_Node* pChecked = NULL;
-        CXFA_Node* pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-        for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-          if (pChild->GetClassID() != XFA_ELEMENT_Field) {
-            continue;
-          }
-          CXFA_Node* pValue = pChild->GetChild(0, XFA_ELEMENT_Value);
-          if (!pValue) {
-            continue;
-          }
-          CXFA_Value valueChild(pValue);
-          valueChild.GetChildValueContent(wsValue);
-          if (wsValue.IsEmpty()) {
-            continue;
-          }
-          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
-          if (!pItems) {
-            continue;
-          }
-          CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-          if (!pText) {
-            continue;
-          }
-          CFX_WideString wsContent;
-          if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
-            pChecked = pChild;
-            wsFormatedValue = wsValue;
-            pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-            pFormNode->SetCData(XFA_ATTRIBUTE_Value, wsContent);
-            break;
-          }
-        }
-        if (!pChecked) {
-          break;
-        }
-        pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-        for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-          if (pChild == pChecked) {
-            continue;
-          }
-          if (pChild->GetClassID() != XFA_ELEMENT_Field) {
-            continue;
-          }
-          CXFA_Node* pValue = pChild->GetProperty(0, XFA_ELEMENT_Value);
-          CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
-          CXFA_Node* pText =
-              pItems ? pItems->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL;
-          if (pText) {
-            pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-          }
-          CFX_WideString wsContent;
-          if (pText) {
-            pText->TryContent(wsContent);
-          }
-          XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsContent,
-                                                      XFA_ELEMENT_Text);
-        }
-      } break;
-      case XFA_ELEMENT_NumericEdit: {
-        defValue.GetChildValueContent(wsValue);
-        if (wsValue.IsEmpty()) {
-          break;
-        }
-        CFX_WideString wsOutput;
-        pWidgetData->NormalizeNumStr(wsValue, wsOutput);
-        wsValue = wsOutput;
-        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
-        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-        CXFA_Node* pValue = pFormNode->GetProperty(0, XFA_ELEMENT_Value);
-        XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsValue,
-                                                    XFA_ELEMENT_Float);
-      } break;
-      default:
-        defValue.GetChildValueContent(wsValue);
-        if (wsValue.IsEmpty()) {
-          break;
-        }
-        pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue);
-        pDataNode->SetAttributeValue(wsValue, wsFormatedValue);
-        break;
-    }
-  } else {
-    CFX_WideString wsXMLValue;
-    pDataNode->TryContent(wsXMLValue);
-    CFX_WideString wsNormailizeValue;
-    pWidgetData->GetNormalizeDataValue(wsXMLValue, wsNormailizeValue);
-    pDataNode->SetAttributeValue(wsNormailizeValue, wsXMLValue);
-    switch (eUIType) {
-      case XFA_ELEMENT_ImageEdit: {
-        XFA_DataMerge_FormValueNode_SetChildContent(
-            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Image);
-        CXFA_Image image = defValue.GetImage();
-        if (image) {
-          IFDE_XMLElement* pXMLDataElement =
-              (IFDE_XMLElement*)(pDataNode->GetXMLMappingNode());
-          FXSYS_assert(pXMLDataElement);
-          CFX_WideString wsContentType;
-          CFX_WideString wsHref;
-          pXMLDataElement->GetString(L"xfa:contentType", wsContentType);
-          if (!wsContentType.IsEmpty()) {
-            pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-            image.SetContentType(wsContentType);
-          }
-          pXMLDataElement->GetString(L"href", wsHref);
-          if (!wsHref.IsEmpty()) {
-            image.SetHref(wsHref);
-          }
-        }
-      } break;
-      case XFA_ELEMENT_ChoiceList:
-        if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-          CXFA_NodeArray items;
-          pDataNode->GetNodeList(items);
-          int32_t iCounts = items.GetSize();
-          if (iCounts > 0) {
-            wsNormailizeValue.Empty();
-            CFX_WideString wsItem;
-            for (int32_t i = 0; i < iCounts; i++) {
-              items[i]->TryContent(wsItem);
-              wsItem = (iCounts == 1) ? wsItem : wsItem + FX_WSTRC(L"\n");
-              wsNormailizeValue += wsItem;
-            }
-            CXFA_ExData exData = defValue.GetExData();
-            FXSYS_assert(exData);
-            exData.SetContentType((iCounts == 1) ? FX_WSTRC(L"text/plain")
-                                                 : FX_WSTRC(L"text/xml"));
-          }
-          XFA_DataMerge_FormValueNode_SetChildContent(
-              defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_ExData);
-        } else {
-          XFA_DataMerge_FormValueNode_SetChildContent(
-              defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
-        }
-        break;
-      case XFA_ELEMENT_CheckButton:
-        XFA_DataMerge_FormValueNode_SetChildContent(
-            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
-        break;
-      case XFA_ELEMENT_ExclGroup: {
-        pWidgetData->SetSelectedMemberByValue(wsNormailizeValue, bNotify, FALSE,
-                                              FALSE);
-      } break;
-      case XFA_ELEMENT_DateTimeEdit:
-        XFA_DataMerge_FormValueNode_SetChildContent(
-            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_DateTime);
-        break;
-      case XFA_ELEMENT_NumericEdit: {
-        CFX_WideString wsPicture;
-        pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
-        if (wsPicture.IsEmpty()) {
-          CFX_WideString wsOutput;
-          pWidgetData->NormalizeNumStr(wsNormailizeValue, wsOutput);
-          wsNormailizeValue = wsOutput;
-        }
-        XFA_DataMerge_FormValueNode_SetChildContent(
-            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Float);
-      } break;
-      case XFA_ELEMENT_Barcode:
-      case XFA_ELEMENT_Button:
-      case XFA_ELEMENT_PasswordEdit:
-      case XFA_ELEMENT_Signature:
-      case XFA_ELEMENT_TextEdit:
-      default:
-        XFA_DataMerge_FormValueNode_SetChildContent(
-            defValue.GetNode(), wsNormailizeValue, XFA_ELEMENT_Text);
-        break;
-    }
-  }
-}
-static CXFA_Node* XFA_DataMerge_GetGlobalBinding(CXFA_Document* pDocument,
-                                                 FX_DWORD dwNameHash) {
-  CXFA_Node* pNode = NULL;
-  pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode);
-  return pNode;
-}
-static void XFA_DataMerge_RegisterGlobalBinding(CXFA_Document* pDocument,
-                                                FX_DWORD dwNameHash,
-                                                CXFA_Node* pDataNode) {
-  pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode);
-}
-static void XFA_DataMerge_ClearGlobalBinding(CXFA_Document* pDocument) {
-  pDocument->m_rgGlobalBinding.RemoveAll();
-}
-static CXFA_Node* XFA_DataMerge_ScopeMatchGlobalBinding(
-    CXFA_Node* pDataScope,
-    FX_DWORD dwNameHash,
-    XFA_ELEMENT eMatchDataNodeType,
-    FX_BOOL bUpLevel = TRUE) {
-  for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL;
-       pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets;
-       pLastDataScope = pCurDataScope,
-                 pCurDataScope =
-                     pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) {
-    for (CXFA_Node* pDataChild = pCurDataScope->GetFirstChildByName(dwNameHash);
-         pDataChild;
-         pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) {
-      if (pDataChild == pLastDataScope ||
-          (eMatchDataNodeType != XFA_ELEMENT_DataModel &&
-           pDataChild->GetClassID() != eMatchDataNodeType) ||
-          pDataChild->HasBindItem()) {
-        continue;
-      }
-      return pDataChild;
-    }
-    for (CXFA_Node* pDataChild =
-             pCurDataScope->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
-         pDataChild; pDataChild = pDataChild->GetNextSameClassSibling(
-                         XFA_ELEMENT_DataGroup)) {
-      CXFA_Node* pDataNode = XFA_DataMerge_ScopeMatchGlobalBinding(
-          pDataChild, dwNameHash, eMatchDataNodeType, FALSE);
-      if (pDataNode) {
-        return pDataNode;
-      }
-    }
-    if (!bUpLevel) {
-      break;
-    }
-  }
-  return NULL;
-}
-static CXFA_Node* XFA_DataMerge_FindGlobalDataNode(CXFA_Document* pDocument,
-                                                   CFX_WideStringC wsName,
-                                                   CXFA_Node* pDataScope,
-                                                   XFA_ELEMENT eMatchNodeType) {
-  FX_DWORD dwNameHash =
-      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
-                                                     wsName.GetLength());
-  if (dwNameHash != 0) {
-    CXFA_Node* pBounded = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash);
-    if (!pBounded) {
-      pBounded = XFA_DataMerge_ScopeMatchGlobalBinding(pDataScope, dwNameHash,
-                                                       eMatchNodeType);
-      if (pBounded) {
-        XFA_DataMerge_RegisterGlobalBinding(pDocument, dwNameHash, pBounded);
-      }
-    }
-    return pBounded;
-  }
-  return NULL;
-}
-static CXFA_Node* XFA_DataMerge_FindOnceDataNode(CXFA_Document* pDocument,
-                                                 CFX_WideStringC wsName,
-                                                 CXFA_Node* pDataScope,
-                                                 XFA_ELEMENT eMatchNodeType) {
-  FX_DWORD dwNameHash =
-      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
-                                                     wsName.GetLength());
-  if (dwNameHash != 0) {
-    for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = NULL;
-         pCurDataScope &&
-         pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets;
-         pLastDataScope = pCurDataScope,
-                   pCurDataScope =
-                       pCurDataScope->GetNodeItem(XFA_NODEITEM_Parent)) {
-      for (CXFA_Node* pDataChild =
-               pCurDataScope->GetFirstChildByName(dwNameHash);
-           pDataChild;
-           pDataChild = pDataChild->GetNextSameNameSibling(dwNameHash)) {
-        if (pDataChild == pLastDataScope ||
-            (eMatchNodeType != XFA_ELEMENT_DataModel &&
-             pDataChild->GetClassID() != eMatchNodeType) ||
-            pDataChild->HasBindItem()) {
-          continue;
-        }
-        return pDataChild;
-      }
-    }
-  }
-  return NULL;
-}
-static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument,
-                                                    CFX_WideStringC wsRef,
-                                                    CXFA_Node* pDataScope,
-                                                    XFA_ELEMENT eMatchNodeType,
-                                                    CXFA_Node* pTemplateNode,
-                                                    FX_BOOL bForceBind,
-                                                    FX_BOOL bUpLevel = TRUE) {
-  FX_DWORD dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew;
-  if (bUpLevel || wsRef != FX_WSTRC(L"name")) {
-    dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
-  }
-  XFA_RESOLVENODE_RS rs;
-  pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags,
-                                                pTemplateNode);
-  if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll ||
-      rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll ||
-      rs.nodes.GetSize() > 1) {
-    return pDocument->GetNotBindNode(rs.nodes);
-  }
-  if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
-    CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
-    CXFA_Node* pNode = ToNode(pObject);
-    if (!bForceBind && pNode && pNode->HasBindItem()) {
-      pNode = NULL;
-    }
-    return pNode;
-  }
-  return NULL;
-}
-CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument,
-                                             XFA_ELEMENT eClassID,
-                                             FX_DWORD dwNameHash,
-                                             CXFA_Node* pFormParent) {
-  CXFA_Node* pFormChild = pFormParent->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pFormChild;
-       pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pFormChild->GetClassID() == eClassID &&
-        pFormChild->GetNameHash() == dwNameHash &&
-        pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-      return pFormChild;
-    }
-  }
-  return NULL;
-}
-static FX_BOOL XFA_NeedGenerateForm(CXFA_Node* pTemplateChild,
-                                    FX_BOOL bUseInstanceManager = TRUE) {
-  XFA_ELEMENT eType = pTemplateChild->GetClassID();
-  if (eType == XFA_ELEMENT_Variables) {
-    return TRUE;
-  }
-  if (pTemplateChild->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
-    return FALSE;
-  }
-  if (eType == XFA_ELEMENT_Proto ||
-      (bUseInstanceManager && eType == XFA_ELEMENT_Occur)) {
-    return FALSE;
-  }
-  return TRUE;
-}
-CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument,
-                                               CXFA_Node* pFormParent,
-                                               CXFA_Node* pTemplateNode,
-                                               FX_BOOL bRecursive,
-                                               CXFA_NodeArray* pSubformArray) {
-  CXFA_Node* pExistingNode = NULL;
-  if (pSubformArray == NULL) {
-    pExistingNode = XFA_DataMerge_FindFormDOMInstance(
-        pDocument, pTemplateNode->GetClassID(), pTemplateNode->GetNameHash(),
-        pFormParent);
-  } else if (pSubformArray->GetSize() > 0) {
-    pExistingNode = pSubformArray->GetAt(0);
-    pSubformArray->RemoveAt(0);
-  }
-  if (pExistingNode) {
-    if (pSubformArray) {
-      pFormParent->InsertChild(pExistingNode);
-    } else if (pExistingNode->IsContainerNode()) {
-      pFormParent->RemoveChild(pExistingNode);
-      pFormParent->InsertChild(pExistingNode);
-    }
-    pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-    pExistingNode->SetTemplateNode(pTemplateNode);
-    if (bRecursive && pExistingNode->GetClassID() != XFA_ELEMENT_Items) {
-      for (CXFA_Node* pTemplateChild =
-               pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-           pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                               XFA_NODEITEM_NextSibling)) {
-        if (XFA_NeedGenerateForm(pTemplateChild)) {
-          XFA_NodeMerge_CloneOrMergeContainer(pDocument, pExistingNode,
-                                              pTemplateChild, bRecursive);
-        }
-      }
-    }
-    pExistingNode->SetFlag(XFA_NODEFLAG_Initialized);
-    return pExistingNode;
-  }
-  CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE);
-  pFormParent->InsertChild(pNewNode, NULL);
-  if (bRecursive) {
-    for (CXFA_Node* pTemplateChild =
-             pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                             XFA_NODEITEM_NextSibling)) {
-      if (XFA_NeedGenerateForm(pTemplateChild)) {
-        CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE);
-        pNewNode->InsertChild(pNewChild, NULL);
-      }
-    }
-  }
-  return pNewNode;
-}
-static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager(
-    CXFA_Document* pDocument,
-    CXFA_Node* pFormParent,
-    CXFA_Node* pTemplateNode,
-    CXFA_NodeArray& subforms) {
-  CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name);
-  CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName;
-  FX_DWORD dwInstNameHash =
-      FX_HashCode_String_GetW(wsInstMgrNodeName, wsInstMgrNodeName.GetLength());
-  CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
-      pDocument, XFA_ELEMENT_InstanceManager, dwInstNameHash, pFormParent);
-  if (pExistingNode) {
-    FX_DWORD dwNameHash = pTemplateNode->GetNameHash();
-    for (CXFA_Node* pNode =
-             pExistingNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-         pNode;) {
-      XFA_ELEMENT eCurType = pNode->GetClassID();
-      if (eCurType == XFA_ELEMENT_InstanceManager) {
-        break;
-      }
-      if ((eCurType != XFA_ELEMENT_Subform) &&
-          (eCurType != XFA_ELEMENT_SubformSet)) {
-        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-        continue;
-      }
-      if (dwNameHash != pNode->GetNameHash()) {
-        break;
-      }
-      CXFA_Node* pNextNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      pFormParent->RemoveChild(pNode);
-      subforms.Add(pNode);
-      pNode = pNextNode;
-    }
-    pFormParent->RemoveChild(pExistingNode);
-    pFormParent->InsertChild(pExistingNode);
-    pExistingNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-    pExistingNode->SetTemplateNode(pTemplateNode);
-    return pExistingNode;
-  }
-  CXFA_Node* pNewNode = pDocument->GetParser()->GetFactory()->CreateNode(
-      XFA_XDPPACKET_Form, XFA_ELEMENT_InstanceManager);
-  FXSYS_assert(pNewNode);
-  wsInstMgrNodeName =
-      FX_WSTRC(L"_") + pTemplateNode->GetCData(XFA_ATTRIBUTE_Name);
-  pNewNode->SetCData(XFA_ATTRIBUTE_Name, wsInstMgrNodeName);
-  pFormParent->InsertChild(pNewNode, NULL);
-  pNewNode->SetTemplateNode(pTemplateNode);
-  return pNewNode;
-}
-static CXFA_Node* XFA_DataMerge_FindMatchingDataNode(
-    CXFA_Document* pDocument,
-    CXFA_Node* pTemplateNode,
-    CXFA_Node* pDataScope,
-    FX_BOOL& bAccessedDataDOM,
-    FX_BOOL bForceBind,
-    CXFA_NodeIteratorTemplate<CXFA_Node,
-                              CXFA_TraverseStrategy_XFAContainerNode>*
-        pIterator,
-    FX_BOOL& bSelfMatch,
-    XFA_ATTRIBUTEENUM& eBindMatch,
-    FX_BOOL bUpLevel = TRUE) {
-  FX_BOOL bOwnIterator = FALSE;
-  if (!pIterator) {
-    bOwnIterator = TRUE;
-    pIterator = new CXFA_NodeIteratorTemplate<
-        CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>(pTemplateNode);
-  }
-  CXFA_Node* pResult = NULL;
-  for (CXFA_Node* pCurTemplateNode = pIterator->GetCurrent();
-       pCurTemplateNode;) {
-    XFA_ELEMENT eMatchNodeType;
-    switch (pCurTemplateNode->GetClassID()) {
-      case XFA_ELEMENT_Subform:
-        eMatchNodeType = XFA_ELEMENT_DataGroup;
-        break;
-      case XFA_ELEMENT_Field: {
-        eMatchNodeType = XFA_FieldIsMultiListBox(pCurTemplateNode)
-                             ? XFA_ELEMENT_DataGroup
-                             : XFA_ELEMENT_DataValue;
-      } break;
-      case XFA_ELEMENT_ExclGroup:
-        eMatchNodeType = XFA_ELEMENT_DataValue;
-        break;
-      default:
-        pCurTemplateNode = pIterator->MoveToNext();
-        continue;
-    }
-    CXFA_Node* pTemplateNodeOccur =
-        pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
-    int32_t iMin, iMax, iInit;
-    if (pTemplateNodeOccur &&
-        XFA_GetOccurInfo(pTemplateNodeOccur, iMin, iMax, iInit) && iMax == 0) {
-      pCurTemplateNode = pIterator->MoveToNext();
-      continue;
-    }
-    CXFA_Node* pTemplateNodeBind =
-        pCurTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind);
-    XFA_ATTRIBUTEENUM eMatch =
-        pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match)
-                          : XFA_ATTRIBUTEENUM_Once;
-    eBindMatch = eMatch;
-    switch (eMatch) {
-      case XFA_ATTRIBUTEENUM_None:
-        pCurTemplateNode = pIterator->MoveToNext();
-        continue;
-      case XFA_ATTRIBUTEENUM_Global:
-        bAccessedDataDOM = TRUE;
-        if (!bForceBind) {
-          pCurTemplateNode = pIterator->MoveToNext();
-          continue;
-        }
-        if (eMatchNodeType == XFA_ELEMENT_DataValue ||
-            (eMatchNodeType == XFA_ELEMENT_DataGroup &&
-             XFA_FieldIsMultiListBox(pTemplateNodeBind))) {
-          CXFA_Node* pGlobalBindNode = XFA_DataMerge_FindGlobalDataNode(
-              pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name),
-              pDataScope, eMatchNodeType);
-          if (!pGlobalBindNode) {
-            pCurTemplateNode = pIterator->MoveToNext();
-            continue;
-          }
-          pResult = pGlobalBindNode;
-          break;
-        }
-      case XFA_ATTRIBUTEENUM_Once: {
-        bAccessedDataDOM = TRUE;
-        CXFA_Node* pOnceBindNode = XFA_DataMerge_FindOnceDataNode(
-            pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name),
-            pDataScope, eMatchNodeType);
-        if (!pOnceBindNode) {
-          pCurTemplateNode = pIterator->MoveToNext();
-          continue;
-        }
-        pResult = pOnceBindNode;
-      } break;
-      case XFA_ATTRIBUTEENUM_DataRef: {
-        bAccessedDataDOM = TRUE;
-        CXFA_Node* pDataRefBindNode = XFA_DataMerge_FindDataRefDataNode(
-            pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref),
-            pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel);
-        if (pDataRefBindNode &&
-            pDataRefBindNode->GetClassID() == eMatchNodeType) {
-          pResult = pDataRefBindNode;
-        }
-        if (!pResult) {
-          pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext();
-          continue;
-        }
-      } break;
-      default:
-        break;
-    }
-    if (pCurTemplateNode == pTemplateNode && pResult) {
-      bSelfMatch = TRUE;
-    }
-    break;
-  }
-  if (bOwnIterator) {
-    delete pIterator;
-  }
-  return pResult;
-}
-static void XFA_DataMerge_SortRecurseRecord(
-    CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord>& rgRecords,
-    CXFA_Node* pDataScope,
-    FX_BOOL bChoiceMode = FALSE) {
-  int32_t iCount = rgRecords.GetSize();
-  CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgResultRecord;
-  for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pChildNode;
-       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    for (int32_t i = 0; i < iCount; i++) {
-      CXFA_Node* pNode = rgRecords[i].pDataChild;
-      if (pChildNode == pNode) {
-        XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild,
-                                                  pNode};
-        rgResultRecord.Add(sNewRecord);
-        rgRecords.RemoveAt(i);
-        iCount--;
-        break;
-      }
-    }
-    if (bChoiceMode && rgResultRecord.GetSize() > 0) {
-      break;
-    }
-  }
-  if (rgResultRecord.GetSize() > 0) {
-    if (!bChoiceMode) {
-      for (int32_t i = 0; i < iCount; i++) {
-        XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild,
-                                                  rgRecords[i].pDataChild};
-        rgResultRecord.Add(sNewRecord);
-      }
-    }
-    rgRecords.RemoveAll();
-    rgRecords.Copy(rgResultRecord);
-  }
-}
-static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet(
-    CXFA_Document* pDocument,
-    CXFA_Node* pTemplateNode,
-    CXFA_Node* pFormParentNode,
-    CXFA_Node* pDataScope,
-    FX_BOOL bOneInstance,
-    FX_BOOL bDataMerge) {
-  XFA_ELEMENT eElement = pTemplateNode->GetClassID();
-  CXFA_Node* pOccurNode = NULL;
-  CXFA_Node* pFirstInstance = NULL;
-  FX_BOOL bUseInstanceManager =
-      pFormParentNode->GetClassID() != XFA_ELEMENT_Area;
-  CXFA_Node* pInstMgrNode = NULL;
-  CXFA_NodeArray subformArray;
-  CXFA_NodeArray* pSearchArray = NULL;
-  if (!bOneInstance &&
-      (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Subform)) {
-    pInstMgrNode =
-        bUseInstanceManager
-            ? XFA_NodeMerge_CloneOrMergeInstanceManager(
-                  pDocument, pFormParentNode, pTemplateNode, subformArray)
-            : NULL;
-    if (CXFA_Node* pOccurTemplateNode =
-            pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Occur)) {
-      pOccurNode = pInstMgrNode
-                       ? XFA_NodeMerge_CloneOrMergeContainer(
-                             pDocument, pInstMgrNode, pOccurTemplateNode, FALSE)
-                       : pOccurTemplateNode;
-    } else if (pInstMgrNode) {
-      pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
-      if (pOccurNode) {
-        pOccurNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-      }
-    }
-    if (pInstMgrNode) {
-      pInstMgrNode->SetFlag(XFA_NODEFLAG_Initialized);
-      pSearchArray = &subformArray;
-      if (pFormParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
-        bOneInstance = TRUE;
-        if (subformArray.GetSize() < 1) {
-          pSearchArray = NULL;
-        }
-      } else if ((pTemplateNode->GetNameHash() == 0) &&
-                 (subformArray.GetSize() < 1)) {
-        pSearchArray = NULL;
-      }
-    }
-  }
-  int32_t iMax = 1, iInit = 1, iMin = 1;
-  if (!bOneInstance) {
-    XFA_GetOccurInfo(pOccurNode, iMin, iMax, iInit);
-  }
-  XFA_ATTRIBUTEENUM eRelation =
-      eElement == XFA_ELEMENT_SubformSet
-          ? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation)
-          : XFA_ATTRIBUTEENUM_Ordered;
-  int32_t iCurRepeatIndex = 0;
-  XFA_ATTRIBUTEENUM eParentBindMatch = XFA_ATTRIBUTEENUM_None;
-  if (bDataMerge) {
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
-        sNodeIterator(pTemplateNode);
-    FX_BOOL bAccessedDataDOM = FALSE;
-    if (eElement == XFA_ELEMENT_SubformSet || eElement == XFA_ELEMENT_Area) {
-      sNodeIterator.MoveToNext();
-    } else {
-      CFX_MapPtrTemplate<CXFA_Node*, CXFA_Node*> subformMapArray;
-      CXFA_NodeArray subformArray;
-      for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) {
-        FX_BOOL bSelfMatch = FALSE;
-        XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None;
-        CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(
-            pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE,
-            &sNodeIterator, bSelfMatch, eBindMatch);
-        if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) {
-          break;
-        }
-        eParentBindMatch = eBindMatch;
-        CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(
-            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
-        if (!pFirstInstance) {
-          pFirstInstance = pSubformNode;
-        }
-        XFA_DataMerge_CreateDataBinding(pSubformNode, pDataNode);
-        FXSYS_assert(pSubformNode);
-        subformMapArray.SetAt(pSubformNode, pDataNode);
-        subformArray.Add(pSubformNode);
-      }
-      subformMapArray.GetStartPosition();
-      for (int32_t iIndex = 0; iIndex < subformArray.GetSize(); iIndex++) {
-        CXFA_Node* pSubform = subformArray[iIndex];
-        CXFA_Node* pDataNode =
-            reinterpret_cast<CXFA_Node*>(subformMapArray.GetValueAt(pSubform));
-        for (CXFA_Node* pTemplateChild =
-                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                                 XFA_NODEITEM_NextSibling)) {
-          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
-            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform,
-                                                pTemplateChild, TRUE);
-          } else if (pTemplateChild->GetObjectType() ==
-                     XFA_OBJECTTYPE_ContainerNode) {
-            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform,
-                                               pDataNode, FALSE, TRUE, FALSE);
-          }
-        }
-      }
-      subformMapArray.RemoveAll();
-    }
-    for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) {
-      FX_BOOL bSelfMatch = FALSE;
-      XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None;
-      if (!XFA_DataMerge_FindMatchingDataNode(
-              pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE,
-              &sNodeIterator, bSelfMatch, eBindMatch)) {
-        break;
-      }
-      if (eBindMatch == XFA_ATTRIBUTEENUM_DataRef &&
-          eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) {
-        break;
-      }
-      if (eRelation == XFA_ATTRIBUTEENUM_Choice ||
-          eRelation == XFA_ATTRIBUTEENUM_Unordered) {
-        CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
-            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
-        FXSYS_assert(pSubformSetNode);
-        if (!pFirstInstance) {
-          pFirstInstance = pSubformSetNode;
-        }
-        CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgItemMatchList;
-        CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList;
-        for (CXFA_Node* pTemplateChild =
-                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                                 XFA_NODEITEM_NextSibling)) {
-          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
-            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
-                                                pTemplateChild, TRUE);
-          } else if (pTemplateChild->GetObjectType() ==
-                     XFA_OBJECTTYPE_ContainerNode) {
-            CXFA_Node* pDataMatch;
-            bSelfMatch = FALSE;
-            eBindMatch = XFA_ATTRIBUTEENUM_None;
-            if (eRelation != XFA_ATTRIBUTEENUM_Ordered &&
-                (pDataMatch = XFA_DataMerge_FindMatchingDataNode(
-                     pDocument, pTemplateChild, pDataScope, bAccessedDataDOM,
-                     FALSE, NULL, bSelfMatch, eBindMatch))) {
-              XFA_DataMerge_RecurseRecord sNewRecord = {pTemplateChild,
-                                                        pDataMatch};
-              if (bSelfMatch) {
-                rgItemMatchList.InsertAt(0, sNewRecord);
-              } else {
-                rgItemMatchList.Add(sNewRecord);
-              }
-            } else {
-              rgItemUnmatchList.Add(pTemplateChild);
-            }
-          }
-        }
-        switch (eRelation) {
-          case XFA_ATTRIBUTEENUM_Choice: {
-            FXSYS_assert(rgItemMatchList.GetSize());
-            XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope, TRUE);
-            pDocument->DataMerge_CopyContainer(
-                rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope);
-          } break;
-          case XFA_ATTRIBUTEENUM_Unordered: {
-            if (rgItemMatchList.GetSize()) {
-              XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope);
-              for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count;
-                   i++) {
-                pDocument->DataMerge_CopyContainer(
-                    rgItemMatchList[i].pTemplateChild, pSubformSetNode,
-                    pDataScope);
-              }
-            }
-            for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count;
-                 i++) {
-              pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i],
-                                                 pSubformSetNode, pDataScope);
-            }
-          } break;
-          default:
-            break;
-        }
-      } else {
-        CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
-            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
-        FXSYS_assert(pSubformSetNode);
-        if (!pFirstInstance) {
-          pFirstInstance = pSubformSetNode;
-        }
-        for (CXFA_Node* pTemplateChild =
-                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                                 XFA_NODEITEM_NextSibling)) {
-          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
-            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
-                                                pTemplateChild, TRUE);
-          } else if (pTemplateChild->GetObjectType() ==
-                     XFA_OBJECTTYPE_ContainerNode) {
-            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode,
-                                               pDataScope);
-          }
-        }
-      }
-    }
-    if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) {
-      int32_t iLimit = iMax;
-      if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) {
-        iLimit = subformArray.GetSize();
-        if (iLimit < iMin) {
-          iLimit = iInit;
-        }
-      }
-      for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) {
-        if (pInstMgrNode) {
-          if (pSearchArray && pSearchArray->GetSize() < 1) {
-            if (pTemplateNode->GetNameHash() != 0) {
-              break;
-            }
-            pSearchArray = NULL;
-          }
-        } else if (!XFA_DataMerge_FindFormDOMInstance(
-                       pDocument, pTemplateNode->GetClassID(),
-                       pTemplateNode->GetNameHash(), pFormParentNode)) {
-          break;
-        }
-        CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer(
-            pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
-        FXSYS_assert(pSubformNode);
-        if (!pFirstInstance) {
-          pFirstInstance = pSubformNode;
-        }
-        for (CXFA_Node* pTemplateChild =
-                 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                                 XFA_NODEITEM_NextSibling)) {
-          if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
-            XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode,
-                                                pTemplateChild, TRUE);
-          } else if (pTemplateChild->GetObjectType() ==
-                     XFA_OBJECTTYPE_ContainerNode) {
-            pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode,
-                                               pDataScope);
-          }
-        }
-      }
-    }
-  }
-  int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin;
-  for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) {
-    CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
-        pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray);
-    FXSYS_assert(pSubformSetNode);
-    if (!pFirstInstance) {
-      pFirstInstance = pSubformSetNode;
-    }
-    FX_BOOL bFound = FALSE;
-    for (CXFA_Node* pTemplateChild =
-             pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                             XFA_NODEITEM_NextSibling)) {
-      if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
-        XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
-                                            pTemplateChild, TRUE);
-      } else if (pTemplateChild->GetObjectType() ==
-                 XFA_OBJECTTYPE_ContainerNode) {
-        if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) {
-          continue;
-        }
-        pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode,
-                                           pDataScope, FALSE, bDataMerge);
-        bFound = TRUE;
-      }
-    }
-  }
-  return pFirstInstance;
-}
-static CXFA_Node* XFA_DataMerge_CopyContainer_Field(CXFA_Document* pDocument,
-                                                    CXFA_Node* pTemplateNode,
-                                                    CXFA_Node* pFormNode,
-                                                    CXFA_Node* pDataScope,
-                                                    FX_BOOL bDataMerge,
-                                                    FX_BOOL bUpLevel = TRUE) {
-  CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer(
-      pDocument, pFormNode, pTemplateNode, FALSE);
-  FXSYS_assert(pFieldNode);
-  for (CXFA_Node* pTemplateChildNode =
-           pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem(
-                               XFA_NODEITEM_NextSibling)) {
-    if (XFA_NeedGenerateForm(pTemplateChildNode)) {
-      XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode,
-                                          pTemplateChildNode, TRUE);
-    } else if (pTemplateNode->GetClassID() == XFA_ELEMENT_ExclGroup &&
-               pTemplateChildNode->IsContainerNode()) {
-      if (pTemplateChildNode->GetClassID() == XFA_ELEMENT_Field) {
-        XFA_DataMerge_CopyContainer_Field(pDocument, pTemplateChildNode,
-                                          pFieldNode, NULL, FALSE);
-      }
-    }
-  }
-  if (bDataMerge) {
-    FX_BOOL bAccessedDataDOM = FALSE;
-    FX_BOOL bSelfMatch = FALSE;
-    XFA_ATTRIBUTEENUM eBindMatch;
-    CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode(
-        pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, TRUE, NULL,
-        bSelfMatch, eBindMatch, bUpLevel);
-    if (pDataNode) {
-      XFA_DataMerge_CreateDataBinding(pFieldNode, pDataNode);
-    }
-  } else {
-    XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFieldNode);
-  }
-  return pFieldNode;
-}
-CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
-                                                  CXFA_Node* pFormNode,
-                                                  CXFA_Node* pDataScope,
-                                                  FX_BOOL bOneInstance,
-                                                  FX_BOOL bDataMerge,
-                                                  FX_BOOL bUpLevel) {
-  switch (pTemplateNode->GetClassID()) {
-    case XFA_ELEMENT_SubformSet:
-    case XFA_ELEMENT_Subform:
-    case XFA_ELEMENT_Area:
-    case XFA_ELEMENT_PageArea:
-      return XFA_DataMerge_CopyContainer_SubformSet(
-          this, pTemplateNode, pFormNode, pDataScope, bOneInstance, bDataMerge);
-    case XFA_ELEMENT_ExclGroup:
-    case XFA_ELEMENT_Field:
-    case XFA_ELEMENT_Draw:
-    case XFA_ELEMENT_ContentArea:
-      return XFA_DataMerge_CopyContainer_Field(
-          this, pTemplateNode, pFormNode, pDataScope, bDataMerge, bUpLevel);
-    case XFA_ELEMENT_PageSet:
-      break;
-    case XFA_ELEMENT_Variables:
-      break;
-    default:
-      FXSYS_assert(FALSE);
-      break;
-  }
-  return NULL;
-}
-
-static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument,
-                                                 CXFA_Node* pFormNode,
-                                                 CXFA_Node* pDataScope,
-                                                 FX_BOOL bDataRef,
-                                                 FX_BOOL bParentDataRef) {
-  FX_BOOL bMatchRef = TRUE;
-  XFA_ELEMENT eClassID = pFormNode->GetClassID();
-  CXFA_Node* pDataNode = pFormNode->GetBindData();
-  if (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup ||
-      eClassID == XFA_ELEMENT_Field) {
-    CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
-    CXFA_Node* pTemplateNodeBind =
-        pTemplateNode ? pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Bind)
-                      : NULL;
-    XFA_ATTRIBUTEENUM eMatch =
-        pTemplateNodeBind ? pTemplateNodeBind->GetEnum(XFA_ATTRIBUTE_Match)
-                          : XFA_ATTRIBUTEENUM_Once;
-    switch (eMatch) {
-      case XFA_ATTRIBUTEENUM_None:
-        if (!bDataRef || bParentDataRef) {
-          XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
-        }
-        break;
-      case XFA_ATTRIBUTEENUM_Once:
-        if (!bDataRef || bParentDataRef) {
-          if (!pDataNode) {
-            if (pFormNode->GetNameHash() != 0 &&
-                pFormNode->GetEnum(XFA_ATTRIBUTE_Scope) !=
-                    XFA_ATTRIBUTEENUM_None) {
-              XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform ||
-                                           XFA_FieldIsMultiListBox(pFormNode))
-                                              ? XFA_ELEMENT_DataGroup
-                                              : XFA_ELEMENT_DataValue;
-              pDataNode = XFA_DataDescription_MaybeCreateDataNode(
-                  pDocument, pDataScope, eDataNodeType,
-                  pFormNode->GetCData(XFA_ATTRIBUTE_Name));
-              if (pDataNode) {
-                XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE);
-              }
-            }
-            if (!pDataNode) {
-              XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
-            }
-          } else {
-            CXFA_Node* pDataParent =
-                pDataNode->GetNodeItem(XFA_NODEITEM_Parent);
-            if (pDataParent != pDataScope) {
-              FXSYS_assert(pDataParent);
-              pDataParent->RemoveChild(pDataNode);
-              pDataScope->InsertChild(pDataNode);
-            }
-          }
-        }
-        break;
-      case XFA_ATTRIBUTEENUM_Global:
-        if (!bDataRef || bParentDataRef) {
-          FX_DWORD dwNameHash = pFormNode->GetNameHash();
-          if (dwNameHash != 0 && !pDataNode) {
-            pDataNode = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash);
-            if (!pDataNode) {
-              XFA_ELEMENT eDataNodeType = (eClassID == XFA_ELEMENT_Subform ||
-                                           XFA_FieldIsMultiListBox(pFormNode))
-                                              ? XFA_ELEMENT_DataGroup
-                                              : XFA_ELEMENT_DataValue;
-              CXFA_Node* pRecordNode =
-                  ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
-              pDataNode = XFA_DataDescription_MaybeCreateDataNode(
-                  pDocument, pRecordNode, eDataNodeType,
-                  pFormNode->GetCData(XFA_ATTRIBUTE_Name));
-              if (pDataNode) {
-                XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE);
-                XFA_DataMerge_RegisterGlobalBinding(
-                    pDocument, pFormNode->GetNameHash(), pDataNode);
-              }
-            } else {
-              XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode);
-            }
-          }
-          if (!pDataNode) {
-            XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
-          }
-        }
-        break;
-      case XFA_ATTRIBUTEENUM_DataRef: {
-        bMatchRef = bDataRef;
-        bParentDataRef = TRUE;
-        if (!pDataNode && bDataRef) {
-          CFX_WideStringC wsRef =
-              pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref);
-          FX_DWORD dFlags =
-              XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode;
-          XFA_RESOLVENODE_RS rs;
-          pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs,
-                                                        dFlags, pTemplateNode);
-          CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : NULL;
-          pDataNode = ToNode(pObject);
-          if (pDataNode) {
-            XFA_DataMerge_CreateDataBinding(
-                pFormNode, pDataNode,
-                rs.dwFlags == XFA_RESOVENODE_RSTYPE_ExistNodes);
-          } else {
-            XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode);
-          }
-        }
-      } break;
-      default:
-        break;
-    }
-  }
-  if (bMatchRef &&
-      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_SubformSet ||
-       eClassID == XFA_ELEMENT_Area || eClassID == XFA_ELEMENT_PageArea ||
-       eClassID == XFA_ELEMENT_PageSet)) {
-    for (CXFA_Node* pFormChild =
-             pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pFormChild;
-         pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pFormChild->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) {
-        continue;
-      }
-      if (pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-        continue;
-      }
-      XFA_DataMerge_UpdateBindingRelations(pDocument, pFormChild,
-                                           pDataNode ? pDataNode : pDataScope,
-                                           bDataRef, bParentDataRef);
-    }
-  }
-}
-CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) {
-  for (CXFA_Node* pRootBoundNode = pParentFormNode;
-       pRootBoundNode &&
-       pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
-       pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) {
-    CXFA_Node* pDataScope = pRootBoundNode->GetBindData();
-    if (pDataScope) {
-      return pDataScope;
-    }
-  }
-  return ToNode(
-      pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data));
-}
-void CXFA_Document::DataMerge_UpdateBindingRelations(
-    CXFA_Node* pFormUpdateRoot) {
-  CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope(
-      pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent));
-  if (!pDataScope) {
-    return;
-  }
-  XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE,
-                                       FALSE);
-  XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE,
-                                       FALSE);
-}
-CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) {
-  for (int32_t i = 0; i < arrayNodes.GetSize(); i++) {
-    CXFA_Node* pNode = arrayNodes[i]->AsNode();
-    if (pNode && !pNode->HasBindItem())
-      return pNode;
-  }
-  return nullptr;
-}
-void CXFA_Document::DoDataMerge() {
-  CXFA_Node* pDatasetsRoot = ToNode(GetXFAObject(XFA_HASHCODE_Datasets));
-  if (!pDatasetsRoot) {
-    IFDE_XMLElement* pDatasetsXMLNode =
-        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:datasets"));
-    FXSYS_assert(pDatasetsXMLNode);
-    pDatasetsXMLNode->SetString(
-        FX_WSTRC(L"xmlns:xfa"),
-        FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"));
-    pDatasetsRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel);
-    pDatasetsRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"datasets"));
-    m_pRootNode->GetXMLMappingNode()->InsertChildNode(pDatasetsXMLNode);
-    m_pRootNode->InsertChild(pDatasetsRoot);
-    pDatasetsRoot->SetXMLMappingNode(pDatasetsXMLNode);
-  }
-  CXFA_Node *pDataRoot = NULL, *pDDRoot = NULL;
-  CFX_WideString wsDatasetsURI;
-  pDatasetsRoot->TryNamespace(wsDatasetsURI);
-  for (CXFA_Node* pChildNode =
-           pDatasetsRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pChildNode;
-       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pChildNode->GetClassID() != XFA_ELEMENT_DataGroup) {
-      continue;
-    }
-    CFX_WideString wsNamespaceURI;
-    if (!pDDRoot && pChildNode->GetNameHash() == XFA_HASHCODE_DataDescription) {
-      if (!pChildNode->TryNamespace(wsNamespaceURI)) {
-        continue;
-      }
-      if (wsNamespaceURI ==
-          FX_WSTRC(L"http://ns.adobe.com/data-description/")) {
-        pDDRoot = pChildNode;
-      }
-    } else if (!pDataRoot && pChildNode->GetNameHash() == XFA_HASHCODE_Data) {
-      if (!pChildNode->TryNamespace(wsNamespaceURI)) {
-        continue;
-      }
-      if (wsNamespaceURI == wsDatasetsURI) {
-        pDataRoot = pChildNode;
-      }
-    }
-    if (pDataRoot && pDDRoot) {
-      break;
-    }
-  }
-  if (!pDataRoot) {
-    IFDE_XMLElement* pDataRootXMLNode =
-        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data"));
-    FXSYS_assert(pDataRootXMLNode);
-    pDataRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
-    pDataRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"data"));
-    pDataRoot->SetXMLMappingNode(pDataRootXMLNode);
-    pDatasetsRoot->InsertChild(pDataRoot);
-  }
-  CXFA_Node* pDataTopLevel =
-      pDataRoot->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
-  FX_DWORD dwNameHash = pDataTopLevel ? pDataTopLevel->GetNameHash() : 0;
-  CXFA_Node* pTemplateRoot =
-      m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template);
-  if (!pTemplateRoot) {
-    return;
-  }
-  CXFA_Node* pTemplateChosen =
-      dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) : NULL;
-  if (!pTemplateChosen ||
-      pTemplateChosen->GetClassID() != XFA_ELEMENT_Subform) {
-    pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform);
-  }
-  if (!pTemplateChosen) {
-    return;
-  }
-  CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form);
-  FX_BOOL bEmptyForm = FALSE;
-  if (!pFormRoot) {
-    bEmptyForm = TRUE;
-    pFormRoot = CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form);
-    FXSYS_assert(pFormRoot);
-    pFormRoot->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"form"));
-    m_pRootNode->InsertChild(pFormRoot, NULL);
-  } else {
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-        sIterator(pFormRoot);
-    for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode;
-         pNode = sIterator.MoveToNext()) {
-      pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
-    }
-  }
-  CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer(
-      this, pFormRoot, pTemplateChosen, FALSE);
-  FXSYS_assert(pSubformSetNode);
-  if (!pDataTopLevel) {
-    CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name);
-    CFX_WideString wsDataTopLevelName =
-        wsFormName.IsEmpty() ? FX_WSTRC(L"form") : wsFormName;
-    IFDE_XMLElement* pDataTopLevelXMLNode =
-        IFDE_XMLElement::Create(wsDataTopLevelName);
-    FXSYS_assert(pDataTopLevelXMLNode);
-    pDataTopLevel = CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
-    pDataTopLevel->SetCData(XFA_ATTRIBUTE_Name, wsDataTopLevelName);
-    pDataTopLevel->SetXMLMappingNode(pDataTopLevelXMLNode);
-    CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-    pDataRoot->InsertChild(pDataTopLevel, pBeforeNode);
-  }
-  FXSYS_assert(pDataTopLevel);
-  XFA_DataMerge_CreateDataBinding(pSubformSetNode, pDataTopLevel);
-  for (CXFA_Node* pTemplateChild =
-           pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pTemplateChild;
-       pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (XFA_NeedGenerateForm(pTemplateChild)) {
-      XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild,
-                                          TRUE);
-    } else if (pTemplateChild->GetObjectType() ==
-               XFA_OBJECTTYPE_ContainerNode) {
-      DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel);
-    }
-  }
-  if (pDDRoot) {
-    XFA_DataDescription_UpdateDataRelation(pDataRoot, pDDRoot);
-  }
-  DataMerge_UpdateBindingRelations(pSubformSetNode);
-  CXFA_Node* pPageSetNode =
-      pSubformSetNode->GetFirstChildByClass(XFA_ELEMENT_PageSet);
-  while (pPageSetNode) {
-    m_pPendingPageSet.Add(pPageSetNode);
-    CXFA_Node* pNextPageSetNode =
-        pPageSetNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
-    pSubformSetNode->RemoveChild(pPageSetNode);
-    pPageSetNode = pNextPageSetNode;
-  }
-  if (!bEmptyForm) {
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-        sIterator(pFormRoot);
-    CXFA_Node* pNode = sIterator.MoveToNext();
-    while (pNode) {
-      if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-        if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode ||
-            pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
-          CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
-          pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
-          pNode = pNext;
-        } else {
-          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-          pNode->SetFlag(XFA_NODEFLAG_Initialized);
-          pNode = sIterator.MoveToNext();
-        }
-      } else {
-        pNode->SetFlag(XFA_NODEFLAG_Initialized);
-        pNode = sIterator.MoveToNext();
-      }
-    }
-  }
-}
-void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) {
-  CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form));
-  if (pFormRoot) {
-    while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      pFormRoot->RemoveChild(pNode);
-    }
-    pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-  }
-  XFA_DataMerge_ClearGlobalBinding(this);
-  if (bDoDataMerge) {
-    DoDataMerge();
-  }
-  CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor();
-  pLayoutProcessor->SetForceReLayout(TRUE);
-}
diff --git a/xfa/src/fxfa/parser/xfa_document_datamerger_imp.h b/xfa/src/fxfa/parser/xfa_document_datamerger_imp.h
deleted file mode 100644
index 57ac638..0000000
--- a/xfa/src/fxfa/parser/xfa_document_datamerger_imp.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(
-    CXFA_Document* pDocument,
-    CXFA_Node* pFormParent,
-    CXFA_Node* pTemplateNode,
-    FX_BOOL bRecursive,
-    CXFA_NodeArray* pSubformArray = NULL);
-CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode);
-CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument,
-                                             XFA_ELEMENT eClassID,
-                                             FX_DWORD dwNameHash,
-                                             CXFA_Node* pFormParent);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_DATAMERGER_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_document_imp.cpp b/xfa/src/fxfa/parser/xfa_document_imp.cpp
deleted file mode 100644
index 980b4e4..0000000
--- a/xfa/src/fxfa/parser/xfa_document_imp.cpp
+++ /dev/null
@@ -1,441 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_script_datawindow.h"
-#include "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_logpseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_Document::CXFA_Document(IXFA_DocParser* pParser)
-    : m_pParser(pParser),
-      m_pScriptContext(nullptr),
-      m_pLayoutProcessor(nullptr),
-      m_pRootNode(nullptr),
-      m_pLocalMgr(nullptr),
-      m_pScriptDataWindow(nullptr),
-      m_pScriptEvent(nullptr),
-      m_pScriptHost(nullptr),
-      m_pScriptLog(nullptr),
-      m_pScriptLayout(nullptr),
-      m_pScriptSignature(nullptr),
-      m_eCurVersionMode(XFA_VERSION_DEFAULT),
-      m_dwDocFlags(0) {
-  ASSERT(m_pParser);
-}
-CXFA_Document::~CXFA_Document() {
-  delete m_pRootNode;
-  PurgeNodes();
-}
-void CXFA_Document::ClearLayoutData() {
-  if (m_pLayoutProcessor) {
-    delete m_pLayoutProcessor;
-    m_pLayoutProcessor = NULL;
-  }
-  if (m_pScriptContext) {
-    m_pScriptContext->Release();
-    m_pScriptContext = NULL;
-  }
-  if (m_pLocalMgr) {
-    delete m_pLocalMgr;
-    m_pLocalMgr = NULL;
-  }
-  if (m_pScriptDataWindow) {
-    delete m_pScriptDataWindow;
-    m_pScriptDataWindow = NULL;
-  }
-  if (m_pScriptEvent) {
-    delete m_pScriptEvent;
-    m_pScriptEvent = NULL;
-  }
-  if (m_pScriptHost) {
-    delete m_pScriptHost;
-    m_pScriptHost = NULL;
-  }
-  if (m_pScriptLog) {
-    delete m_pScriptLog;
-    m_pScriptLog = NULL;
-  }
-  if (m_pScriptLayout) {
-    delete m_pScriptLayout;
-    m_pScriptLayout = NULL;
-  }
-  if (m_pScriptSignature) {
-    delete m_pScriptSignature;
-    m_pScriptSignature = NULL;
-  }
-}
-void CXFA_Document::SetRoot(CXFA_Node* pNewRoot) {
-  if (m_pRootNode) {
-    AddPurgeNode(m_pRootNode);
-  }
-  m_pRootNode = pNewRoot;
-  RemovePurgeNode(pNewRoot);
-}
-IXFA_Notify* CXFA_Document::GetNotify() const {
-  return m_pParser->GetNotify();
-}
-CXFA_Object* CXFA_Document::GetXFAObject(const CFX_WideStringC& wsNodeName) {
-  return GetXFAObject(
-      FX_HashCode_String_GetW(wsNodeName.GetPtr(), wsNodeName.GetLength()));
-}
-CXFA_Object* CXFA_Document::GetXFAObject(FX_DWORD dwNodeNameHash) {
-  switch (dwNodeNameHash) {
-    case XFA_HASHCODE_Data: {
-      CXFA_Node* pDatasetsNode = ToNode(GetXFAObject(XFA_HASHCODE_Datasets));
-      if (!pDatasetsNode) {
-        return NULL;
-      }
-      for (CXFA_Node* pDatasetsChild =
-               pDatasetsNode->GetFirstChildByClass(XFA_ELEMENT_DataGroup);
-           pDatasetsChild;
-           pDatasetsChild =
-               pDatasetsChild->GetNextSameClassSibling(XFA_ELEMENT_DataGroup)) {
-        if (pDatasetsChild->GetNameHash() != XFA_HASHCODE_Data) {
-          continue;
-        }
-        CFX_WideString wsNamespaceURI;
-        if (!pDatasetsChild->TryNamespace(wsNamespaceURI)) {
-          continue;
-        }
-        CFX_WideString wsDatasetsURI;
-        if (!pDatasetsNode->TryNamespace(wsDatasetsURI)) {
-          continue;
-        }
-        if (wsNamespaceURI == wsDatasetsURI) {
-          return pDatasetsChild;
-        }
-      }
-    }
-      return NULL;
-    case XFA_HASHCODE_Record: {
-      CXFA_Node* pData = ToNode(GetXFAObject(XFA_HASHCODE_Data));
-      return pData ? pData->GetFirstChildByClass(XFA_ELEMENT_DataGroup) : NULL;
-    }
-    case XFA_HASHCODE_DataWindow: {
-      if (m_pScriptDataWindow == NULL) {
-        m_pScriptDataWindow = new CScript_DataWindow(this);
-      }
-      return m_pScriptDataWindow;
-    }
-    case XFA_HASHCODE_Event: {
-      if (m_pScriptEvent == NULL) {
-        m_pScriptEvent = new CScript_EventPseudoModel(this);
-      }
-      return m_pScriptEvent;
-    }
-    case XFA_HASHCODE_Host: {
-      if (m_pScriptHost == NULL) {
-        m_pScriptHost = new CScript_HostPseudoModel(this);
-      }
-      return m_pScriptHost;
-    }
-    case XFA_HASHCODE_Log: {
-      if (m_pScriptLog == NULL) {
-        m_pScriptLog = new CScript_LogPseudoModel(this);
-      }
-      return m_pScriptLog;
-    }
-    case XFA_HASHCODE_Signature: {
-      if (m_pScriptSignature == NULL) {
-        m_pScriptSignature = new CScript_SignaturePseudoModel(this);
-      }
-      return m_pScriptSignature;
-    }
-    case XFA_HASHCODE_Layout: {
-      if (m_pScriptLayout == NULL) {
-        m_pScriptLayout = new CScript_LayoutPseudoModel(this);
-      }
-      return m_pScriptLayout;
-    }
-    default:
-      return m_pRootNode->GetFirstChildByName(dwNodeNameHash);
-  }
-}
-CXFA_Node* CXFA_Document::CreateNode(FX_DWORD dwPacket, XFA_ELEMENT eElement) {
-  return CreateNode(XFA_GetPacketByID(dwPacket), eElement);
-}
-CXFA_Node* CXFA_Document::CreateNode(const XFA_PACKETINFO* pPacket,
-                                     XFA_ELEMENT eElement) {
-  if (pPacket == NULL) {
-    return NULL;
-  }
-  const XFA_ELEMENTINFO* pElement = XFA_GetElementByID(eElement);
-  if (pElement && (pElement->dwPackets & pPacket->eName)) {
-    CXFA_Node* pNode = new CXFA_Node(this, pPacket->eName, pElement->eName);
-    if (pNode) {
-      AddPurgeNode(pNode);
-    }
-    return pNode;
-  }
-  return NULL;
-}
-void CXFA_Document::AddPurgeNode(CXFA_Node* pNode) {
-  m_rgPurgeNodes.Add(pNode);
-}
-FX_BOOL CXFA_Document::RemovePurgeNode(CXFA_Node* pNode) {
-  return m_rgPurgeNodes.RemoveKey(pNode);
-}
-void CXFA_Document::PurgeNodes() {
-  FX_POSITION psNode = m_rgPurgeNodes.GetStartPosition();
-  while (psNode) {
-    CXFA_Node* pNode;
-    m_rgPurgeNodes.GetNextAssoc(psNode, pNode);
-    delete pNode;
-  }
-  m_rgPurgeNodes.RemoveAll();
-}
-void CXFA_Document::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn) {
-  if (bOn) {
-    m_dwDocFlags |= dwFlag;
-  } else {
-    m_dwDocFlags &= ~dwFlag;
-  }
-}
-FX_BOOL CXFA_Document::IsInteractive() {
-  if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive) {
-    return m_dwDocFlags & XFA_DOCFLAG_Interactive;
-  }
-  CXFA_Node* pConfig = ToNode(GetXFAObject(XFA_HASHCODE_Config));
-  if (!pConfig) {
-    return FALSE;
-  }
-  CFX_WideString wsInteractive;
-  CXFA_Node* pPresent = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present);
-  if (!pPresent) {
-    return FALSE;
-  }
-  CXFA_Node* pPDF = pPresent->GetFirstChildByClass(XFA_ELEMENT_Pdf);
-  if (!pPDF) {
-    return FALSE;
-  }
-  CXFA_Node* pInteractive = pPDF->GetChild(0, XFA_ELEMENT_Interactive);
-  if (pInteractive) {
-    m_dwDocFlags |= XFA_DOCFLAG_HasInteractive;
-    if (pInteractive->TryContent(wsInteractive) &&
-        wsInteractive == FX_WSTRC(L"1")) {
-      m_dwDocFlags |= XFA_DOCFLAG_Interactive;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-CXFA_LocaleMgr* CXFA_Document::GetLocalMgr() {
-  if (!m_pLocalMgr) {
-    CFX_WideString wsLanguage;
-    GetParser()->GetNotify()->GetAppProvider()->GetLanguage(wsLanguage);
-    m_pLocalMgr = new CXFA_LocaleMgr(
-        ToNode(GetXFAObject(XFA_HASHCODE_LocaleSet)), wsLanguage);
-  }
-  return m_pLocalMgr;
-}
-IXFA_ScriptContext* CXFA_Document::InitScriptContext(FXJSE_HRUNTIME hRuntime) {
-  if (!m_pScriptContext) {
-    m_pScriptContext = XFA_ScriptContext_Create(this);
-  }
-  m_pScriptContext->Initialize(hRuntime);
-  return m_pScriptContext;
-}
-IXFA_ScriptContext* CXFA_Document::GetScriptContext() {
-  if (!m_pScriptContext) {
-    m_pScriptContext = XFA_ScriptContext_Create(this);
-  }
-  return m_pScriptContext;
-}
-XFA_VERSION CXFA_Document::RecognizeXFAVersionNumber(
-    CFX_WideString& wsTemplateNS) {
-  CFX_WideStringC wsTemplateURIPrefix =
-      XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI;
-  FX_STRSIZE nPrefixLength = wsTemplateURIPrefix.GetLength();
-  if (CFX_WideStringC(wsTemplateNS, wsTemplateNS.GetLength()) !=
-      wsTemplateURIPrefix) {
-    return XFA_VERSION_UNKNOWN;
-  }
-  FX_STRSIZE nDotPos = wsTemplateNS.Find('.', nPrefixLength);
-  if (nDotPos == (FX_STRSIZE)-1) {
-    return XFA_VERSION_UNKNOWN;
-  }
-  int8_t iMajor =
-      FXSYS_wtoi(wsTemplateNS.Mid(nPrefixLength, nDotPos - nPrefixLength));
-  int8_t iMinor = FXSYS_wtoi(
-      wsTemplateNS.Mid(nDotPos + 1, wsTemplateNS.GetLength() - nDotPos - 2));
-  XFA_VERSION eVersion = (XFA_VERSION)((int32_t)iMajor * 100 + iMinor);
-  if (eVersion < XFA_VERSION_MIN || eVersion > XFA_VERSION_MAX) {
-    return XFA_VERSION_UNKNOWN;
-  }
-  m_eCurVersionMode = eVersion;
-  return eVersion;
-}
-CXFA_Node* CXFA_Document::GetNodeByID(CXFA_Node* pRoot,
-                                      const CFX_WideStringC& wsID) {
-  if (!pRoot || wsID.IsEmpty()) {
-    return NULL;
-  }
-  CXFA_NodeIterator sIterator(pRoot);
-  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-       pNode = sIterator.MoveToNext()) {
-    CFX_WideStringC wsIDVal;
-    if (pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) {
-      if (wsIDVal == wsID) {
-        return pNode;
-      }
-    }
-  }
-  return NULL;
-}
-static void XFA_ProtoMerge_MergeNodeRecurse(CXFA_Document* pDocument,
-                                            CXFA_Node* pDestNodeParent,
-                                            CXFA_Node* pProtoNode) {
-  CXFA_Node* pExistingNode = NULL;
-  for (CXFA_Node* pFormChild =
-           pDestNodeParent->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pFormChild;
-       pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pFormChild->GetClassID() == pProtoNode->GetClassID() &&
-        pFormChild->GetNameHash() == pProtoNode->GetNameHash() &&
-        pFormChild->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-      pFormChild->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-      pExistingNode = pFormChild;
-      break;
-    }
-  }
-  if (pExistingNode) {
-    pExistingNode->SetTemplateNode(pProtoNode);
-    for (CXFA_Node* pTemplateChild =
-             pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem(
-                             XFA_NODEITEM_NextSibling)) {
-      XFA_ProtoMerge_MergeNodeRecurse(pDocument, pExistingNode, pTemplateChild);
-    }
-    return;
-  }
-  CXFA_Node* pNewNode = pProtoNode->Clone(TRUE);
-  pNewNode->SetTemplateNode(pProtoNode);
-  pDestNodeParent->InsertChild(pNewNode, NULL);
-}
-static void XFA_ProtoMerge_MergeNode(CXFA_Document* pDocument,
-                                     CXFA_Node* pDestNode,
-                                     CXFA_Node* pProtoNode) {
-  {
-    CXFA_NodeIterator sIterator(pDestNode);
-    for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-         pNode = sIterator.MoveToNext()) {
-      pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
-    }
-  }
-  pDestNode->SetTemplateNode(pProtoNode);
-  for (CXFA_Node* pTemplateChild =
-           pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pTemplateChild;
-       pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    XFA_ProtoMerge_MergeNodeRecurse(pDocument, pDestNode, pTemplateChild);
-  }
-  {
-    CXFA_NodeIterator sIterator(pDestNode);
-    for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-         pNode = sIterator.MoveToNext()) {
-      pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-    }
-  }
-}
-void CXFA_Document::DoProtoMerge() {
-  CXFA_Node* pTemplateRoot = ToNode(GetXFAObject(XFA_HASHCODE_Template));
-  if (!pTemplateRoot) {
-    return;
-  }
-  CFX_MapPtrTemplate<FX_DWORD, CXFA_Node*> mIDMap;
-  CXFA_NodeSet sUseNodes;
-  CXFA_NodeIterator sIterator(pTemplateRoot);
-  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-       pNode = sIterator.MoveToNext()) {
-    CFX_WideStringC wsIDVal;
-    if (pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) {
-      mIDMap[FX_HashCode_String_GetW(wsIDVal.GetPtr(), wsIDVal.GetLength())] =
-          pNode;
-    }
-    CFX_WideStringC wsUseVal;
-    if (pNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) && !wsUseVal.IsEmpty()) {
-      sUseNodes.Add(pNode);
-    } else if (pNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) &&
-               !wsUseVal.IsEmpty()) {
-      sUseNodes.Add(pNode);
-    }
-  }
-  FX_POSITION pos = sUseNodes.GetStartPosition();
-  while (pos) {
-    CXFA_Node* pUseHrefNode = NULL;
-    sUseNodes.GetNextAssoc(pos, pUseHrefNode);
-    CFX_WideString wsUseVal;
-    CFX_WideStringC wsURI, wsID, wsSOM;
-    if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Usehref, wsUseVal) &&
-        !wsUseVal.IsEmpty()) {
-      FX_STRSIZE uSharpPos = wsUseVal.Find('#');
-      if (uSharpPos < 0) {
-        wsURI = wsUseVal;
-      } else {
-        wsURI = CFX_WideStringC((const FX_WCHAR*)wsUseVal, uSharpPos);
-        FX_STRSIZE uLen = wsUseVal.GetLength();
-        if (uLen >= uSharpPos + 5 &&
-            CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos, 5) ==
-                FX_WSTRC(L"#som(") &&
-            wsUseVal[uLen - 1] == ')') {
-          wsSOM = CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos + 5,
-                                  uLen - 1 - uSharpPos - 5);
-        } else {
-          wsID = CFX_WideStringC((const FX_WCHAR*)wsUseVal + uSharpPos + 1,
-                                 uLen - uSharpPos - 1);
-        }
-      }
-    } else if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) &&
-               !wsUseVal.IsEmpty()) {
-      if (wsUseVal[0] == '#') {
-        wsID = CFX_WideStringC((const FX_WCHAR*)wsUseVal + 1,
-                               wsUseVal.GetLength() - 1);
-      } else {
-        wsSOM =
-            CFX_WideStringC((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength());
-      }
-    }
-    if (!wsURI.IsEmpty() && wsURI != FX_WSTRC(L".")) {
-      continue;
-    }
-    CXFA_Node* pProtoNode = NULL;
-    if (!wsSOM.IsEmpty()) {
-      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
-                        XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
-                        XFA_RESOLVENODE_Siblings;
-      XFA_RESOLVENODE_RS resoveNodeRS;
-      int32_t iRet = m_pScriptContext->ResolveObjects(pUseHrefNode, wsSOM,
-                                                      resoveNodeRS, dwFlag);
-      if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) {
-        pProtoNode = resoveNodeRS.nodes[0]->AsNode();
-      }
-    } else if (!wsID.IsEmpty()) {
-      if (!mIDMap.Lookup(
-              FX_HashCode_String_GetW(wsID.GetPtr(), wsID.GetLength()),
-              pProtoNode)) {
-        continue;
-      }
-    }
-    if (!pProtoNode) {
-      continue;
-    }
-    XFA_ProtoMerge_MergeNode(this, pUseHrefNode, pProtoNode);
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_document_layout_imp.cpp b/xfa/src/fxfa/parser/xfa_document_layout_imp.cpp
deleted file mode 100644
index 2ac2bd6..0000000
--- a/xfa/src/fxfa/parser/xfa_document_layout_imp.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_datamerger_imp.h"
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h"
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h"
-#include "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() {
-  if (!m_pLayoutProcessor) {
-    m_pLayoutProcessor = new CXFA_LayoutProcessor(this);
-    ASSERT(m_pLayoutProcessor);
-  }
-  return m_pLayoutProcessor;
-}
-IXFA_DocLayout* CXFA_Document::GetDocLayout() {
-  return GetLayoutProcessor();
-}
-CXFA_LayoutProcessor::CXFA_LayoutProcessor(CXFA_Document* pDocument)
-    : m_pDocument(pDocument),
-      m_pRootItemLayoutProcessor(NULL),
-      m_pLayoutPageMgr(NULL),
-      m_nProgressCounter(0),
-      m_bNeeLayout(TRUE) {}
-CXFA_LayoutProcessor::~CXFA_LayoutProcessor() {
-  ClearLayoutData();
-}
-CXFA_Document* CXFA_LayoutProcessor::GetDocument() const {
-  return m_pDocument;
-}
-int32_t CXFA_LayoutProcessor::StartLayout(FX_BOOL bForceRestart) {
-  if (!bForceRestart && !IsNeedLayout()) {
-    return 100;
-  }
-  if (m_pRootItemLayoutProcessor) {
-    delete m_pRootItemLayoutProcessor;
-    m_pRootItemLayoutProcessor = NULL;
-  }
-  m_nProgressCounter = 0;
-  CXFA_Node* pFormPacketNode =
-      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
-  if (!pFormPacketNode) {
-    return -1;
-  }
-  CXFA_Node* pFormRoot =
-      pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform);
-  if (!pFormRoot) {
-    return -1;
-  }
-  if (!m_pLayoutPageMgr) {
-    m_pLayoutPageMgr = new CXFA_LayoutPageMgr(this);
-  }
-  if (!m_pLayoutPageMgr->InitLayoutPage(pFormRoot)) {
-    return -1;
-  }
-  if (!m_pLayoutPageMgr->PrepareFirstPage(pFormRoot)) {
-    return -1;
-  }
-  m_pRootItemLayoutProcessor =
-      new CXFA_ItemLayoutProcessor(pFormRoot, m_pLayoutPageMgr);
-  m_nProgressCounter = 1;
-  return 0;
-}
-int32_t CXFA_LayoutProcessor::DoLayout(IFX_Pause* pPause) {
-  if (m_nProgressCounter < 1) {
-    return -1;
-  }
-  XFA_ItemLayoutProcessorResult eStatus;
-  CXFA_Node* pFormNode = m_pRootItemLayoutProcessor->GetFormNode();
-  FX_FLOAT fPosX = pFormNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
-  FX_FLOAT fPosY = pFormNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
-  do {
-    FX_FLOAT fAvailHeight = m_pLayoutPageMgr->GetAvailHeight();
-    eStatus =
-        m_pRootItemLayoutProcessor->DoLayout(TRUE, fAvailHeight, fAvailHeight);
-    if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
-      m_nProgressCounter++;
-    }
-    CXFA_ContentLayoutItem* pLayoutItem =
-        m_pRootItemLayoutProcessor->ExtractLayoutItem();
-    if (pLayoutItem) {
-      pLayoutItem->m_sPos = CFX_PointF(fPosX, fPosY);
-    }
-    m_pLayoutPageMgr->SubmitContentItem(pLayoutItem, eStatus);
-  } while (eStatus != XFA_ItemLayoutProcessorResult_Done &&
-           (!pPause || !pPause->NeedToPauseNow()));
-  if (eStatus == XFA_ItemLayoutProcessorResult_Done) {
-    m_pLayoutPageMgr->FinishPaginatedPageSets();
-    m_pLayoutPageMgr->SyncLayoutData();
-    m_bNeeLayout = FALSE;
-    m_rgChangedContainers.RemoveAll();
-  }
-  return 100 * (eStatus == XFA_ItemLayoutProcessorResult_Done
-                    ? m_nProgressCounter
-                    : m_nProgressCounter - 1) /
-         m_nProgressCounter;
-}
-FX_BOOL CXFA_LayoutProcessor::IncrementLayout() {
-  if (m_bNeeLayout) {
-    StartLayout(TRUE);
-    return DoLayout(NULL) == 100;
-  }
-  for (int32_t i = 0, c = m_rgChangedContainers.GetSize(); i < c; i++) {
-    CXFA_Node* pNode = m_rgChangedContainers[i];
-    CXFA_Node* pParentNode =
-        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-    if (!pParentNode) {
-      return FALSE;
-    }
-    if (!CXFA_ItemLayoutProcessor::IncrementRelayoutNode(this, pNode,
-                                                         pParentNode)) {
-      return FALSE;
-    }
-  }
-  m_rgChangedContainers.RemoveAll();
-  return TRUE;
-}
-int32_t CXFA_LayoutProcessor::CountPages() const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPageCount() : 0;
-}
-IXFA_LayoutPage* CXFA_LayoutProcessor::GetPage(int32_t index) const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPage(index) : NULL;
-}
-CXFA_LayoutItem* CXFA_LayoutProcessor::GetLayoutItem(CXFA_Node* pFormItem) {
-  return static_cast<CXFA_LayoutItem*>(
-      pFormItem->GetUserData(XFA_LAYOUTITEMKEY));
-}
-void CXFA_LayoutProcessor::AddChangedContainer(CXFA_Node* pContainer) {
-  if (m_rgChangedContainers.Find(pContainer) < 0) {
-    m_rgChangedContainers.Add(pContainer);
-  }
-}
-CXFA_ContainerLayoutItem* CXFA_LayoutProcessor::GetRootLayoutItem() const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetRootLayoutItem() : NULL;
-}
-void CXFA_LayoutProcessor::ClearLayoutData() {
-  if (m_pLayoutPageMgr) {
-    delete m_pLayoutPageMgr;
-    m_pLayoutPageMgr = NULL;
-  }
-  if (m_pRootItemLayoutProcessor) {
-    delete m_pRootItemLayoutProcessor;
-    m_pRootItemLayoutProcessor = NULL;
-  }
-  m_nProgressCounter = 0;
-}
-FX_BOOL CXFA_LayoutProcessor::IsNeedLayout() {
-  return m_bNeeLayout || m_rgChangedContainers.GetSize() > 0;
-}
-CXFA_LayoutItem::CXFA_LayoutItem(CXFA_Node* pNode, FX_BOOL bIsContentLayoutItem)
-    : m_pFormNode(pNode),
-      m_pParent(NULL),
-      m_pNextSibling(NULL),
-      m_pFirstChild(NULL),
-      m_bIsContentLayoutItem(bIsContentLayoutItem) {}
-CXFA_LayoutItem::~CXFA_LayoutItem() {}
-CXFA_ContainerLayoutItem::CXFA_ContainerLayoutItem(CXFA_Node* pNode)
-    : CXFA_LayoutItem(pNode, FALSE), m_pOldSubform(NULL) {}
-IXFA_DocLayout* CXFA_ContainerLayoutItem::GetLayout() const {
-  return m_pFormNode->GetDocument()->GetLayoutProcessor();
-}
-int32_t CXFA_ContainerLayoutItem::GetPageIndex() const {
-  return m_pFormNode->GetDocument()
-      ->GetLayoutProcessor()
-      ->GetLayoutPageMgr()
-      ->GetPageIndex(this);
-}
-void CXFA_ContainerLayoutItem::GetPageSize(CFX_SizeF& size) {
-  size.clear();
-  CXFA_Node* pMedium = m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Medium);
-  if (!pMedium)
-    return;
-
-  size = CFX_SizeF(pMedium->GetMeasure(XFA_ATTRIBUTE_Short).ToUnit(XFA_UNIT_Pt),
-                   pMedium->GetMeasure(XFA_ATTRIBUTE_Long).ToUnit(XFA_UNIT_Pt));
-  if (pMedium->GetEnum(XFA_ATTRIBUTE_Orientation) ==
-      XFA_ATTRIBUTEENUM_Landscape) {
-    size = CFX_SizeF(size.y, size.x);
-  }
-}
-CXFA_Node* CXFA_ContainerLayoutItem::GetMasterPage() const {
-  return m_pFormNode;
-}
-CXFA_ContentLayoutItem::CXFA_ContentLayoutItem(CXFA_Node* pNode)
-    : CXFA_LayoutItem(pNode, TRUE),
-      m_pPrev(NULL),
-      m_pNext(NULL),
-      m_dwStatus(0) {}
-CXFA_ContentLayoutItem::~CXFA_ContentLayoutItem() {
-  if (m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY) == this) {
-    m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL);
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_document_layout_imp.h b/xfa/src/fxfa/parser/xfa_document_layout_imp.h
deleted file mode 100644
index c471588..0000000
--- a/xfa/src/fxfa/parser/xfa_document_layout_imp.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
-
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-
-class CXFA_ItemLayoutProcessor;
-class CXFA_LayoutPageMgr;
-class CXFA_ContainerLayoutItem;
-
-class CXFA_LayoutProcessor : public IXFA_DocLayout {
- public:
-  CXFA_LayoutProcessor(CXFA_Document* pDocument);
-  ~CXFA_LayoutProcessor();
-  virtual CXFA_Document* GetDocument() const;
-  virtual int32_t StartLayout(FX_BOOL bForceRestart = FALSE);
-  virtual int32_t DoLayout(IFX_Pause* pPause = NULL);
-  virtual FX_BOOL IncrementLayout();
-  virtual int32_t CountPages() const;
-  virtual IXFA_LayoutPage* GetPage(int32_t index) const;
-  virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem);
-
-  void AddChangedContainer(CXFA_Node* pContainer);
-  void SetForceReLayout(FX_BOOL bForceRestart) { m_bNeeLayout = bForceRestart; }
-  CXFA_ContainerLayoutItem* GetRootLayoutItem() const;
-  CXFA_ItemLayoutProcessor* GetRootRootItemLayoutProcessor() {
-    return m_pRootItemLayoutProcessor;
-  }
-  CXFA_LayoutPageMgr* GetLayoutPageMgr() { return m_pLayoutPageMgr; }
-
- protected:
-  void ClearLayoutData();
-
-  FX_BOOL IsNeedLayout();
-
-  CXFA_Document* m_pDocument;
-  CXFA_ItemLayoutProcessor* m_pRootItemLayoutProcessor;
-  CXFA_LayoutPageMgr* m_pLayoutPageMgr;
-  CXFA_NodeArray m_rgChangedContainers;
-  uint32_t m_nProgressCounter;
-  FX_BOOL m_bNeeLayout;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_LAYOUT_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_document_serialize.cpp b/xfa/src/fxfa/parser/xfa_document_serialize.cpp
deleted file mode 100644
index 66a9b75..0000000
--- a/xfa/src/fxfa/parser/xfa_document_serialize.cpp
+++ /dev/null
@@ -1,590 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_document_serialize.h"
-
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-IXFA_PacketImport* IXFA_PacketImport::Create(CXFA_Document* pDocument) {
-  return new CXFA_DataImporter(pDocument);
-}
-CXFA_DataImporter::CXFA_DataImporter(CXFA_Document* pDocument)
-    : m_pDocument(pDocument) {
-  ASSERT(m_pDocument);
-}
-FX_BOOL CXFA_DataImporter::ImportData(IFX_FileRead* pDataDocument) {
-  IXFA_Parser* pDataDocumentParser = IXFA_Parser::Create(m_pDocument);
-  if (!pDataDocumentParser) {
-    return FALSE;
-  }
-  if (pDataDocumentParser->StartParse(pDataDocument, XFA_XDPPACKET_Datasets) !=
-      XFA_PARSESTATUS_Ready) {
-    pDataDocumentParser->Release();
-    return FALSE;
-  }
-  if (pDataDocumentParser->DoParse(NULL) < XFA_PARSESTATUS_Done) {
-    pDataDocumentParser->Release();
-    return FALSE;
-  }
-  CXFA_Node* pImportDataRoot = pDataDocumentParser->GetRootNode();
-  if (!pImportDataRoot) {
-    pDataDocumentParser->Release();
-    return FALSE;
-  }
-  CXFA_Node* pDataModel =
-      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
-  if (!pDataModel) {
-    pDataDocumentParser->Release();
-    return FALSE;
-  }
-  CXFA_Node* pDataNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Data));
-  if (pDataNode) {
-    pDataModel->RemoveChild(pDataNode);
-  }
-  if (pImportDataRoot->GetClassID() == XFA_ELEMENT_DataModel) {
-    while (CXFA_Node* pChildNode =
-               pImportDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      pImportDataRoot->RemoveChild(pChildNode);
-      pDataModel->InsertChild(pChildNode);
-    }
-  } else {
-    IFDE_XMLNode* pXMLNode = pImportDataRoot->GetXMLMappingNode();
-    IFDE_XMLNode* pParentXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
-    if (pParentXMLNode) {
-      pParentXMLNode->RemoveChildNode(pXMLNode);
-    }
-    pDataModel->InsertChild(pImportDataRoot);
-  }
-  m_pDocument->DoDataRemerge(FALSE);
-  pDataDocumentParser->Release();
-  return TRUE;
-}
-CFX_WideString XFA_ExportEncodeAttribute(const CFX_WideString& str) {
-  CFX_WideTextBuf textBuf;
-  int32_t iLen = str.GetLength();
-  for (int32_t i = 0; i < iLen; i++) {
-    switch (str[i]) {
-      case '&':
-        textBuf << FX_WSTRC(L"&amp;");
-        break;
-      case '<':
-        textBuf << FX_WSTRC(L"&lt;");
-        break;
-      case '>':
-        textBuf << FX_WSTRC(L"&gt;");
-        break;
-      case '\'':
-        textBuf << FX_WSTRC(L"&apos;");
-        break;
-      case '\"':
-        textBuf << FX_WSTRC(L"&quot;");
-        break;
-      default:
-        textBuf.AppendChar(str[i]);
-    }
-  }
-  return textBuf.GetWideString();
-}
-CFX_WideString XFA_ExportEncodeContent(const CFX_WideStringC& str) {
-  CFX_WideTextBuf textBuf;
-  int32_t iLen = str.GetLength();
-  for (int32_t i = 0; i < iLen; i++) {
-    FX_WCHAR ch = str.GetAt(i);
-    if (!FDE_IsXMLValidChar(ch)) {
-      continue;
-    }
-    if (ch == '&') {
-      textBuf << FX_WSTRC(L"&amp;");
-    } else if (ch == '<') {
-      textBuf << FX_WSTRC(L"&lt;");
-    } else if (ch == '>') {
-      textBuf << FX_WSTRC(L"&gt;");
-    } else if (ch == '\'') {
-      textBuf << FX_WSTRC(L"&apos;");
-    } else if (ch == '\"') {
-      textBuf << FX_WSTRC(L"&quot;");
-    } else if (ch == ' ') {
-      if (i && str.GetAt(i - 1) != ' ') {
-        textBuf.AppendChar(' ');
-      } else {
-        textBuf << FX_WSTRC(L"&#x20;");
-      }
-    } else {
-      textBuf.AppendChar(str.GetAt(i));
-    }
-  }
-  return textBuf.GetWideString();
-}
-static void XFA_SaveAttribute(CXFA_Node* pNode,
-                              XFA_ATTRIBUTE eName,
-                              const CFX_WideStringC& wsName,
-                              FX_BOOL bProto,
-                              CFX_WideString& wsOutput) {
-  CFX_WideString wsValue;
-  if ((!bProto && !pNode->HasAttribute((XFA_ATTRIBUTE)eName, bProto)) ||
-      !pNode->GetAttribute((XFA_ATTRIBUTE)eName, wsValue, FALSE)) {
-    return;
-  }
-  wsValue = XFA_ExportEncodeAttribute(wsValue);
-  wsOutput += FX_WSTRC(L" ");
-  wsOutput += wsName;
-  wsOutput += FX_WSTRC(L"=\"");
-  wsOutput += wsValue;
-  wsOutput += FX_WSTRC(L"\"");
-}
-static FX_BOOL XFA_DataExporter_AttributeSaveInDataModel(
-    CXFA_Node* pNode,
-    XFA_ATTRIBUTE eAttribute) {
-  FX_BOOL bSaveInDataModel = FALSE;
-  if (pNode->GetClassID() != XFA_ELEMENT_Image) {
-    return bSaveInDataModel;
-  }
-  CXFA_Node* pValueNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (!pValueNode || pValueNode->GetClassID() != XFA_ELEMENT_Value) {
-    return bSaveInDataModel;
-  }
-  CXFA_Node* pFieldNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (pFieldNode && pFieldNode->GetBindData() &&
-      eAttribute == XFA_ATTRIBUTE_Href) {
-    bSaveInDataModel = TRUE;
-  }
-  return bSaveInDataModel;
-}
-FX_BOOL XFA_DataExporter_ContentNodeNeedtoExport(CXFA_Node* pContentNode) {
-  CFX_WideString wsContent;
-  if (!pContentNode->TryContent(wsContent, FALSE, FALSE)) {
-    return FALSE;
-  }
-  FXSYS_assert(pContentNode->GetObjectType() == XFA_OBJECTTYPE_ContentNode);
-  CXFA_Node* pParentNode = pContentNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Value) {
-    return TRUE;
-  }
-  CXFA_Node* pGrandParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (!pGrandParentNode ||
-      pGrandParentNode->GetObjectType() != XFA_OBJECTTYPE_ContainerNode) {
-    return TRUE;
-  }
-  if (pGrandParentNode->GetBindData()) {
-    return FALSE;
-  }
-  CXFA_WidgetData* pWidgetData = pGrandParentNode->GetWidgetData();
-  XFA_ELEMENT eUIType = pWidgetData->GetUIType();
-  if (eUIType == XFA_ELEMENT_PasswordEdit) {
-    return FALSE;
-  }
-  return TRUE;
-}
-static void XFA_DataExporter_RecognizeXFAVersionNumber(
-    CXFA_Node* pTemplateRoot,
-    CFX_WideString& wsVersionNumber) {
-  wsVersionNumber.Empty();
-  if (!pTemplateRoot) {
-    return;
-  }
-  CFX_WideString wsTemplateNS;
-  if (!pTemplateRoot->TryNamespace(wsTemplateNS)) {
-    return;
-  }
-  XFA_VERSION eVersion =
-      pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(wsTemplateNS);
-  if (eVersion == XFA_VERSION_UNKNOWN) {
-    eVersion = XFA_VERSION_DEFAULT;
-  }
-  wsVersionNumber.Format(L"%i.%i", eVersion / 100, eVersion % 100);
-}
-static void XFA_DataExporter_RegenerateFormFile_Changed(
-    CXFA_Node* pNode,
-    CFX_WideTextBuf& buf,
-    FX_BOOL bSaveXML = FALSE) {
-  CFX_WideString wsAttrs;
-  int32_t iAttrs = 0;
-  const uint8_t* pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs);
-  while (iAttrs--) {
-    const XFA_ATTRIBUTEINFO* pAttr =
-        XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]);
-    if (pAttr->eName == XFA_ATTRIBUTE_Name ||
-        (XFA_DataExporter_AttributeSaveInDataModel(pNode, pAttr->eName) &&
-         !bSaveXML)) {
-      continue;
-    }
-    CFX_WideString wsAttr;
-    XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr);
-    wsAttrs += wsAttr;
-  }
-  CFX_WideString wsChildren;
-  switch (pNode->GetObjectType()) {
-    case XFA_OBJECTTYPE_ContentNode: {
-      if (!bSaveXML && !XFA_DataExporter_ContentNodeNeedtoExport(pNode)) {
-        break;
-      }
-      CXFA_Node* pRawValueNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-      while (pRawValueNode &&
-             pRawValueNode->GetClassID() != XFA_ELEMENT_SharpxHTML &&
-             pRawValueNode->GetClassID() != XFA_ELEMENT_Sharptext &&
-             pRawValueNode->GetClassID() != XFA_ELEMENT_Sharpxml) {
-        pRawValueNode = pRawValueNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      }
-      if (!pRawValueNode) {
-        break;
-      }
-      CFX_WideString wsContentType;
-      pNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
-      if (pRawValueNode->GetClassID() == XFA_ELEMENT_SharpxHTML &&
-          wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-        IFDE_XMLNode* pExDataXML = pNode->GetXMLMappingNode();
-        if (!pExDataXML) {
-          break;
-        }
-        IFDE_XMLNode* pRichTextXML =
-            pExDataXML->GetNodeItem(IFDE_XMLNode::FirstChild);
-        if (!pRichTextXML) {
-          break;
-        }
-        IFX_MemoryStream* pMemStream = FX_CreateMemoryStream(TRUE);
-        IFX_Stream* pTempStream = IFX_Stream::CreateStream(
-            (IFX_FileWrite*)pMemStream, FX_STREAMACCESS_Text |
-                                            FX_STREAMACCESS_Write |
-                                            FX_STREAMACCESS_Append);
-        pTempStream->SetCodePage(FX_CODEPAGE_UTF8);
-        pRichTextXML->SaveXMLNode(pTempStream);
-        wsChildren += CFX_WideString::FromUTF8(
-            (const FX_CHAR*)pMemStream->GetBuffer(), pMemStream->GetSize());
-        pTempStream->Release();
-        pMemStream->Release();
-      } else if (pRawValueNode->GetClassID() == XFA_ELEMENT_Sharpxml &&
-                 wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
-        CFX_WideString wsRawValue;
-        pRawValueNode->GetAttribute(XFA_ATTRIBUTE_Value, wsRawValue, FALSE);
-        if (wsRawValue.IsEmpty()) {
-          break;
-        }
-        CFX_WideStringArray wsSelTextArray;
-        int32_t iStart = 0;
-        int32_t iEnd = wsRawValue.Find(L'\n', iStart);
-        iEnd = (iEnd == -1) ? wsRawValue.GetLength() : iEnd;
-        while (iEnd >= iStart) {
-          wsSelTextArray.Add(wsRawValue.Mid(iStart, iEnd - iStart));
-          iStart = iEnd + 1;
-          if (iStart >= wsRawValue.GetLength()) {
-            break;
-          }
-          iEnd = wsRawValue.Find(L'\n', iStart);
-        }
-        CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-        FXSYS_assert(pParentNode);
-        CXFA_Node* pGrandparentNode =
-            pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
-        FXSYS_assert(pGrandparentNode);
-        CFX_WideString bodyTagName;
-        bodyTagName = pGrandparentNode->GetCData(XFA_ATTRIBUTE_Name);
-        if (bodyTagName.IsEmpty()) {
-          bodyTagName = FX_WSTRC(L"ListBox1");
-        }
-        buf << FX_WSTRC(L"<");
-        buf << bodyTagName;
-        buf << FX_WSTRC(L" xmlns=\"\"\n>");
-        for (int32_t i = 0; i < wsSelTextArray.GetSize(); i++) {
-          buf << FX_WSTRC(L"<value\n>");
-          buf << XFA_ExportEncodeContent(wsSelTextArray[i]);
-          buf << FX_WSTRC(L"</value\n>");
-        }
-        buf << FX_WSTRC(L"</");
-        buf << bodyTagName;
-        buf << FX_WSTRC(L"\n>");
-        wsChildren += buf.GetWideString();
-        buf.Clear();
-      } else {
-        CFX_WideStringC wsValue = pRawValueNode->GetCData(XFA_ATTRIBUTE_Value);
-        wsChildren += XFA_ExportEncodeContent(wsValue);
-      }
-    } break;
-    case XFA_OBJECTTYPE_TextNode:
-    case XFA_OBJECTTYPE_NodeC:
-    case XFA_OBJECTTYPE_NodeV: {
-      CFX_WideStringC wsValue = pNode->GetCData(XFA_ATTRIBUTE_Value);
-      wsChildren += XFA_ExportEncodeContent(wsValue);
-    } break;
-    default:
-      if (pNode->GetClassID() == XFA_ELEMENT_Items) {
-        CXFA_Node* pTemplateNode = pNode->GetTemplateNode();
-        if (!pTemplateNode ||
-            pTemplateNode->CountChildren(XFA_ELEMENT_UNKNOWN) !=
-                pNode->CountChildren(XFA_ELEMENT_UNKNOWN)) {
-          bSaveXML = TRUE;
-        }
-      }
-      CFX_WideTextBuf newBuf;
-      CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-      while (pChildNode) {
-        XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf,
-                                                    bSaveXML);
-        wsChildren += newBuf.GetWideString();
-        newBuf.Clear();
-        pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      }
-      if (!bSaveXML && !wsChildren.IsEmpty() &&
-          pNode->GetClassID() == XFA_ELEMENT_Items) {
-        wsChildren.Empty();
-        bSaveXML = TRUE;
-        CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-        while (pChildNode) {
-          XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf,
-                                                      bSaveXML);
-          wsChildren += newBuf.GetWideString();
-          newBuf.Clear();
-          pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-        }
-      }
-      break;
-  }
-  if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() ||
-      pNode->HasAttribute(XFA_ATTRIBUTE_Name)) {
-    CFX_WideStringC wsElement;
-    pNode->GetClassName(wsElement);
-    CFX_WideString wsName;
-    XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE,
-                      wsName);
-    buf << FX_WSTRC(L"<");
-    buf << wsElement;
-    buf << wsName;
-    buf << wsAttrs;
-    if (wsChildren.IsEmpty()) {
-      buf << FX_WSTRC(L"\n/>");
-    } else {
-      buf << FX_WSTRC(L"\n>");
-      buf << wsChildren;
-      buf << FX_WSTRC(L"</");
-      buf << wsElement;
-      buf << FX_WSTRC(L"\n>");
-    }
-  }
-}
-static void XFA_DataExporter_RegenerateFormFile_Container(
-    CXFA_Node* pNode,
-    IFX_Stream* pStream,
-    FX_BOOL bSaveXML = FALSE) {
-  XFA_ELEMENT eElement = pNode->GetClassID();
-  if (eElement == XFA_ELEMENT_Field || eElement == XFA_ELEMENT_Draw ||
-      !pNode->IsContainerNode()) {
-    CFX_WideTextBuf buf;
-    XFA_DataExporter_RegenerateFormFile_Changed(pNode, buf, bSaveXML);
-    FX_STRSIZE nLen = buf.GetLength();
-    if (nLen > 0) {
-      pStream->WriteString((const FX_WCHAR*)buf.GetBuffer(), nLen);
-    }
-    return;
-  }
-  CFX_WideStringC wsElement;
-  pNode->GetClassName(wsElement);
-  pStream->WriteString(L"<", 1);
-  pStream->WriteString(wsElement.GetPtr(), wsElement.GetLength());
-  CFX_WideString wsOutput;
-  XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE,
-                    wsOutput);
-  CFX_WideString wsAttrs;
-  int32_t iAttrs = 0;
-  const uint8_t* pAttrs = XFA_GetElementAttributes(pNode->GetClassID(), iAttrs);
-  while (iAttrs--) {
-    const XFA_ATTRIBUTEINFO* pAttr =
-        XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]);
-    if (pAttr->eName == XFA_ATTRIBUTE_Name) {
-      continue;
-    }
-    CFX_WideString wsAttr;
-    XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, FALSE, wsAttr);
-    wsOutput += wsAttr;
-  }
-  if (!wsOutput.IsEmpty()) {
-    pStream->WriteString((const FX_WCHAR*)wsOutput, wsOutput.GetLength());
-  }
-  CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (pChildNode) {
-    pStream->WriteString(L"\n>", 2);
-    while (pChildNode) {
-      XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream,
-                                                    bSaveXML);
-      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    pStream->WriteString(L"</", 2);
-    pStream->WriteString(wsElement.GetPtr(), wsElement.GetLength());
-    pStream->WriteString(L"\n>", 2);
-  } else {
-    pStream->WriteString(L"\n/>", 3);
-  }
-}
-void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode,
-                                         IFX_Stream* pStream,
-                                         const FX_CHAR* pChecksum,
-                                         FX_BOOL bSaveXML) {
-  if (pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) {
-    static const FX_WCHAR* s_pwsTagName = L"<form";
-    static const FX_WCHAR* s_pwsClose = L"</form\n>";
-    pStream->WriteString(s_pwsTagName, FXSYS_wcslen(s_pwsTagName));
-    if (pChecksum) {
-      static const FX_WCHAR* s_pwChecksum = L" checksum=\"";
-      CFX_WideString wsChecksum =
-          CFX_WideString::FromUTF8(pChecksum, FXSYS_strlen(pChecksum));
-      pStream->WriteString(s_pwChecksum, FXSYS_wcslen(s_pwChecksum));
-      pStream->WriteString((const FX_WCHAR*)wsChecksum, wsChecksum.GetLength());
-      pStream->WriteString(L"\"", 1);
-    }
-    pStream->WriteString(L" xmlns=\"", FXSYS_wcslen(L" xmlns=\""));
-    const FX_WCHAR* pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI;
-    pStream->WriteString(pURI, FXSYS_wcslen(pURI));
-    CFX_WideString wsVersionNumber;
-    XFA_DataExporter_RecognizeXFAVersionNumber(
-        ToNode(pNode->GetDocument()->GetXFAObject(XFA_XDPPACKET_Template)),
-        wsVersionNumber);
-    if (wsVersionNumber.IsEmpty()) {
-      wsVersionNumber = FX_WSTRC(L"2.8");
-    }
-    wsVersionNumber += FX_WSTRC(L"/\"\n>");
-    pStream->WriteString((const FX_WCHAR*)wsVersionNumber,
-                         wsVersionNumber.GetLength());
-    CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    while (pChildNode) {
-      XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream);
-      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    pStream->WriteString(s_pwsClose, FXSYS_wcslen(s_pwsClose));
-  } else {
-    XFA_DataExporter_RegenerateFormFile_Container(pNode, pStream, bSaveXML);
-  }
-}
-IXFA_PacketExport* IXFA_PacketExport::Create(CXFA_Document* pDocument,
-                                             XFA_DATAFORMAT eFormat) {
-  return new CXFA_DataExporter(pDocument);
-}
-CXFA_DataExporter::CXFA_DataExporter(CXFA_Document* pDocument)
-    : m_pDocument(pDocument) {
-  ASSERT(m_pDocument);
-}
-FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite) {
-  return Export(pWrite, m_pDocument->GetRoot());
-}
-FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite,
-                                  CXFA_Node* pNode,
-                                  FX_DWORD dwFlag,
-                                  const FX_CHAR* pChecksum) {
-  if (!pWrite) {
-    ASSERT(false);
-    return FALSE;
-  }
-  IFX_Stream* pStream = IFX_Stream::CreateStream(
-      pWrite,
-      FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
-  if (pStream == NULL) {
-    return FALSE;
-  }
-  pStream->SetCodePage(FX_CODEPAGE_UTF8);
-  FX_BOOL bRet = Export(pStream, pNode, dwFlag, pChecksum);
-  pStream->Release();
-  return bRet;
-}
-FX_BOOL CXFA_DataExporter::Export(IFX_Stream* pStream,
-                                  CXFA_Node* pNode,
-                                  FX_DWORD dwFlag,
-                                  const FX_CHAR* pChecksum) {
-  IFDE_XMLDoc* pXMLDoc = m_pDocument->GetParser()->GetXMLDoc();
-  if (pNode->GetObjectType() == XFA_OBJECTTYPE_ModelNode) {
-    switch (pNode->GetPacketID()) {
-      case XFA_XDPPACKET_XDP: {
-        static const FX_WCHAR* s_pwsPreamble =
-            L"<xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\">";
-        pStream->WriteString(s_pwsPreamble, FXSYS_wcslen(s_pwsPreamble));
-        for (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-          Export(pStream, pChild, dwFlag, pChecksum);
-        }
-        static const FX_WCHAR* s_pwsPostamble = L"</xdp:xdp\n>";
-        pStream->WriteString(s_pwsPostamble, FXSYS_wcslen(s_pwsPostamble));
-      } break;
-      case XFA_XDPPACKET_Datasets: {
-        IFDE_XMLElement* pElement =
-            (IFDE_XMLElement*)pNode->GetXMLMappingNode();
-        if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
-          return FALSE;
-        }
-        CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-        FXSYS_assert(pDataNode);
-        XFA_DataExporter_DealWithDataGroupNode(pDataNode);
-        pXMLDoc->SaveXMLNode(pStream, pElement);
-      } break;
-      case XFA_XDPPACKET_Form: {
-        XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum);
-      } break;
-      case XFA_XDPPACKET_Template:
-      default: {
-        IFDE_XMLElement* pElement =
-            (IFDE_XMLElement*)pNode->GetXMLMappingNode();
-        if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
-          return FALSE;
-        }
-        pXMLDoc->SaveXMLNode(pStream, pElement);
-      } break;
-    }
-  } else {
-    CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-    CXFA_Node* pExportNode = pNode;
-    for (CXFA_Node* pChildNode =
-             pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pChildNode;
-         pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pChildNode != pNode) {
-        pExportNode = pDataNode;
-        break;
-      }
-    }
-    IFDE_XMLElement* pElement =
-        (IFDE_XMLElement*)pExportNode->GetXMLMappingNode();
-    if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
-      return FALSE;
-    }
-    XFA_DataExporter_DealWithDataGroupNode(pExportNode);
-    pElement->SetString(FX_WSTRC(L"xmlns:xfa"),
-                        FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"));
-    pXMLDoc->SaveXMLNode(pStream, pElement);
-    pElement->RemoveAttribute(L"xmlns:xfa");
-  }
-  return TRUE;
-}
-void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) {
-  if (!pDataNode || pDataNode->GetClassID() == XFA_ELEMENT_DataValue) {
-    return;
-  }
-  int32_t iChildNum = 0;
-  for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pChildNode;
-       pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    iChildNum++;
-    XFA_DataExporter_DealWithDataGroupNode(pChildNode);
-  }
-  if (pDataNode->GetClassID() == XFA_ELEMENT_DataGroup) {
-    if (iChildNum > 0) {
-      IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
-      FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      if (pXMLElement->HasAttribute(L"xfa:dataNode")) {
-        pXMLElement->RemoveAttribute(L"xfa:dataNode");
-      }
-    } else {
-      IFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode();
-      FXSYS_assert(pXMLNode->GetType() == FDE_XMLNODE_Element);
-      ((IFDE_XMLElement*)pXMLNode)
-          ->SetString(FX_WSTRC(L"xfa:dataNode"), FX_WSTRC(L"dataGroup"));
-    }
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_document_serialize.h b/xfa/src/fxfa/parser/xfa_document_serialize.h
deleted file mode 100644
index 37dbb9a..0000000
--- a/xfa/src/fxfa/parser/xfa_document_serialize.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
-#define XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
-
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-
-class CXFA_DataImporter : public IXFA_PacketImport {
- public:
-  CXFA_DataImporter(CXFA_Document* pDocument);
-  virtual void Release() { delete this; }
-  virtual FX_BOOL ImportData(IFX_FileRead* pDataDocument);
-
- protected:
-  CXFA_Document* m_pDocument;
-};
-
-class CXFA_DataExporter : public IXFA_PacketExport {
- public:
-  CXFA_DataExporter(CXFA_Document* pDocument);
-  virtual void Release() { delete this; }
-  virtual FX_BOOL Export(IFX_FileWrite* pWrite);
-  virtual FX_BOOL Export(IFX_FileWrite* pWrite,
-                         CXFA_Node* pNode,
-                         FX_DWORD dwFlag = 0,
-                         const FX_CHAR* pChecksum = NULL);
-
- protected:
-  FX_BOOL Export(IFX_Stream* pStream,
-                 CXFA_Node* pNode,
-                 FX_DWORD dwFlag,
-                 const FX_CHAR* pChecksum);
-  CXFA_Document* m_pDocument;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_DOCUMENT_SERIALIZE_H_
diff --git a/xfa/src/fxfa/parser/xfa_layout_appadapter.cpp b/xfa/src/fxfa/parser/xfa_layout_appadapter.cpp
deleted file mode 100644
index bf79c83..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_appadapter.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h"
-#include "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant) {
-  FX_DWORD dwRelevant = XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
-  CFX_WideStringC wsRelevant;
-  if (pFormItem->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant)) {
-    if (wsRelevant == FX_WSTRC(L"+print") || wsRelevant == FX_WSTRC(L"print")) {
-      dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable;
-    } else if (wsRelevant == FX_WSTRC(L"-print")) {
-      dwRelevant &= ~XFA_LAYOUTSTATUS_Printable;
-    }
-  }
-  if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Viewable) &&
-      (dwRelevant != XFA_LAYOUTSTATUS_Viewable)) {
-    dwRelevant &= ~XFA_LAYOUTSTATUS_Viewable;
-  }
-  if (!(dwParentRelvant & XFA_LAYOUTSTATUS_Printable) &&
-      (dwRelevant != XFA_LAYOUTSTATUS_Printable)) {
-    dwRelevant &= ~XFA_LAYOUTSTATUS_Printable;
-  }
-  return dwRelevant;
-}
-void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem) {
-  CXFA_LayoutItem* pNode = pLayoutItem->m_pFirstChild;
-  IXFA_Notify* pNotify =
-      pLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify();
-  IXFA_DocLayout* pDocLayout =
-      pLayoutItem->m_pFormNode->GetDocument()->GetDocLayout();
-  while (pNode) {
-    CXFA_LayoutItem* pNext = pNode->m_pNextSibling;
-    pNode->m_pParent = nullptr;
-    pNotify->OnLayoutEvent(pDocLayout, static_cast<CXFA_LayoutItem*>(pNode),
-                           XFA_LAYOUTEVENT_ItemRemoving);
-    XFA_ReleaseLayoutItem(pNode);
-    pNode = pNext;
-  }
-  pNotify->OnLayoutEvent(pDocLayout, pLayoutItem, XFA_LAYOUTEVENT_ItemRemoving);
-  if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea) {
-    pNotify->OnPageEvent(static_cast<CXFA_ContainerLayoutItem*>(pLayoutItem),
-                         XFA_PAGEEVENT_PageRemoved);
-  }
-  delete pLayoutItem;
-}
diff --git a/xfa/src/fxfa/parser/xfa_layout_appadapter.h b/xfa/src/fxfa/parser/xfa_layout_appadapter.h
deleted file mode 100644
index 94012fa..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_appadapter.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
-
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-
-class CXFA_TraverseStrategy_PageAreaContainerLayoutItem {
- public:
-  static inline CXFA_ContainerLayoutItem* GetFirstChild(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
-    }
-    return NULL;
-  }
-  static inline CXFA_ContainerLayoutItem* GetNextSibling(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
-  }
-  static inline CXFA_ContainerLayoutItem* GetParent(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
-  }
-};
-class CXFA_TraverseStrategy_ContentAreaContainerLayoutItem {
- public:
-  static inline CXFA_ContainerLayoutItem* GetFirstChild(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    for (CXFA_LayoutItem* pChildItem = pLayoutItem->m_pFirstChild; pChildItem;
-         pChildItem = pChildItem->m_pNextSibling) {
-      if (CXFA_ContainerLayoutItem* pContainer =
-              pChildItem->AsContainerLayoutItem()) {
-        return pContainer;
-      }
-    }
-    return nullptr;
-  }
-  static inline CXFA_ContainerLayoutItem* GetNextSibling(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    for (CXFA_LayoutItem* pChildItem = pLayoutItem->m_pNextSibling; pChildItem;
-         pChildItem = pChildItem->m_pNextSibling) {
-      if (CXFA_ContainerLayoutItem* pContainer =
-              pChildItem->AsContainerLayoutItem()) {
-        return pContainer;
-      }
-    }
-    return nullptr;
-  }
-  static inline CXFA_ContainerLayoutItem* GetParent(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
-  }
-};
-class CXFA_TraverseStrategy_ContentLayoutItem {
- public:
-  static inline CXFA_ContentLayoutItem* GetFirstChild(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
-  }
-  static inline CXFA_ContentLayoutItem* GetNextSibling(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pNextSibling;
-  }
-  static inline CXFA_ContentLayoutItem* GetParent(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return (CXFA_ContentLayoutItem*)pLayoutItem->m_pParent;
-  }
-};
-FX_DWORD XFA_GetRelevant(CXFA_Node* pFormItem, FX_DWORD dwParentRelvant);
-void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LAYOUT_APPADAPTER_H_
diff --git a/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp
deleted file mode 100644
index cdf3278..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp
+++ /dev/null
@@ -1,2968 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "xfa/src/fgas/crt/fgas_algorithm.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h"
-#include "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
-                                                   CXFA_LayoutPageMgr* pPageMgr)
-    : m_bKeepBreakFinish(FALSE),
-      m_bIsProcessKeep(FALSE),
-      m_pKeepHeadNode(nullptr),
-      m_pKeepTailNode(nullptr),
-      m_pFormNode(pNode),
-      m_pLayoutItem(nullptr),
-      m_pOldLayoutItem(nullptr),
-      m_pCurChildNode(XFA_LAYOUT_INVALIDNODE),
-      m_pCurChildPreprocessor(nullptr),
-      m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages_None),
-      m_fUsedSize(0),
-      m_pPageMgr(pPageMgr),
-      m_bBreakPending(TRUE),
-      m_fLastRowWidth(0),
-      m_fLastRowY(0),
-      m_fWidthLimite(0),
-      m_bUseInheriated(FALSE),
-      m_ePreProcessRs(XFA_ItemLayoutProcessorResult_Done),
-      m_bHasAvailHeight(TRUE) {
-  FXSYS_assert(m_pFormNode && (m_pFormNode->IsContainerNode() ||
-                               m_pFormNode->GetClassID() == XFA_ELEMENT_Form));
-  m_pOldLayoutItem =
-      (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
-}
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
-    CXFA_Node* pFormNode) {
-  if (!pFormNode) {
-    return NULL;
-  }
-  CXFA_ContentLayoutItem* pLayoutItem = NULL;
-  if (m_pOldLayoutItem) {
-    pLayoutItem = m_pOldLayoutItem;
-    m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
-    return pLayoutItem;
-  }
-  pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument()
-                    ->GetParser()
-                    ->GetNotify()
-                    ->OnCreateLayoutItem(pFormNode);
-  CXFA_ContentLayoutItem* pPrevLayoutItem =
-      (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
-  if (pPrevLayoutItem) {
-    while (pPrevLayoutItem->m_pNext) {
-      pPrevLayoutItem = pPrevLayoutItem->m_pNext;
-    }
-    pPrevLayoutItem->m_pNext = pLayoutItem;
-    pLayoutItem->m_pPrev = pPrevLayoutItem;
-  } else {
-    pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem);
-  }
-  return pLayoutItem;
-}
-FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos(
-    CXFA_ContentLayoutItem* pLayoutItem,
-    FX_FLOAT fCurVerticalOffset,
-    FX_FLOAT& fProposedSplitPos,
-    FX_BOOL& bAppChange,
-    FX_BOOL bCalculateMargin) {
-  CXFA_Node* pFormNode = pLayoutItem->m_pFormNode;
-  if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION &&
-      fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y -
-                               XFA_LAYOUT_FLOAT_PERCISION) {
-    switch (pFormNode->GetIntact()) {
-      case XFA_ATTRIBUTEENUM_None: {
-        FX_BOOL bAnyChanged = FALSE;
-        CXFA_Document* pDocument = pFormNode->GetDocument();
-        IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
-        FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0;
-        CXFA_Node* pMarginNode =
-            pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-        if (pMarginNode && bCalculateMargin) {
-          fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset)
-                              .ToUnit(XFA_UNIT_Pt);
-          fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset)
-                                 .ToUnit(XFA_UNIT_Pt);
-        }
-        FX_BOOL bChanged = TRUE;
-        while (bChanged) {
-          bChanged = FALSE;
-          {
-            FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurVerticalOffset;
-            if (pNotify->FindSplitPos(pFormNode, pLayoutItem->GetIndex(),
-                                      fRelSplitPos)) {
-              bAnyChanged = TRUE;
-              bChanged = TRUE;
-              fProposedSplitPos = fCurVerticalOffset + fRelSplitPos;
-              bAppChange = TRUE;
-              if (fProposedSplitPos <=
-                  fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
-                return TRUE;
-              }
-            }
-          }
-          FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurBottomMargin;
-          for (CXFA_ContentLayoutItem* pChildItem =
-                   (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
-               pChildItem;
-               pChildItem =
-                   (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) {
-            FX_FLOAT fChildOffset =
-                fCurVerticalOffset + fCurTopMargin + pChildItem->m_sPos.y;
-            FX_BOOL bAppChange = FALSE;
-            if (FindLayoutItemSplitPos(pChildItem, fChildOffset, fRelSplitPos,
-                                       bAppChange, bCalculateMargin)) {
-              if (fRelSplitPos - fChildOffset < XFA_LAYOUT_FLOAT_PERCISION &&
-                  bAppChange) {
-                fProposedSplitPos = fRelSplitPos - fCurTopMargin;
-              } else {
-                fProposedSplitPos = fRelSplitPos + fCurBottomMargin;
-              }
-              bAnyChanged = TRUE;
-              bChanged = TRUE;
-              if (fProposedSplitPos <=
-                  fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
-                return TRUE;
-              }
-              if (bAnyChanged) {
-                break;
-              }
-            }
-          }
-        }
-        return bAnyChanged;
-      } break;
-      case XFA_ATTRIBUTEENUM_ContentArea:
-      case XFA_ATTRIBUTEENUM_PageArea: {
-        fProposedSplitPos = fCurVerticalOffset;
-        return TRUE;
-      }
-      default:
-        return FALSE;
-    }
-  }
-  return FALSE;
-}
-static XFA_ATTRIBUTEENUM XFA_ItemLayoutProcessor_GetLayout(
-    CXFA_Node* pFormNode,
-    FX_BOOL& bRootForceTb) {
-  bRootForceTb = FALSE;
-  XFA_ATTRIBUTEENUM eLayoutMode;
-  if (pFormNode->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, FALSE)) {
-    return eLayoutMode;
-  }
-  CXFA_Node* pParentNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Form) {
-    bRootForceTb = TRUE;
-    return XFA_ATTRIBUTEENUM_Tb;
-  }
-  return XFA_ATTRIBUTEENUM_Position;
-}
-static FX_BOOL XFA_ExistContainerKeep(CXFA_Node* pCurNode, FX_BOOL bPreFind) {
-  if (pCurNode == NULL || !XFA_ItemLayoutProcessor_IsTakingSpace(pCurNode)) {
-    return FALSE;
-  }
-  XFA_NODEITEM eItemType = XFA_NODEITEM_PrevSibling;
-  if (!bPreFind) {
-    eItemType = XFA_NODEITEM_NextSibling;
-  }
-  CXFA_Node* pPreContainer =
-      pCurNode->GetNodeItem(eItemType, XFA_OBJECTTYPE_ContainerNode);
-  if (pPreContainer == NULL) {
-    return FALSE;
-  }
-  CXFA_Node* pKeep = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Keep);
-  if (pKeep) {
-    XFA_ATTRIBUTEENUM ePrevious;
-    XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Previous;
-    if (!bPreFind) {
-      eKeepType = XFA_ATTRIBUTE_Next;
-    }
-    if (pKeep->TryEnum(eKeepType, ePrevious, FALSE)) {
-      if (ePrevious == XFA_ATTRIBUTEENUM_ContentArea ||
-          ePrevious == XFA_ATTRIBUTEENUM_PageArea) {
-        return TRUE;
-      }
-    }
-  }
-  pKeep = pPreContainer->GetFirstChildByClass(XFA_ELEMENT_Keep);
-  if (!pKeep) {
-    return FALSE;
-  }
-  XFA_ATTRIBUTEENUM eNext;
-  XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Next;
-  if (!bPreFind) {
-    eKeepType = XFA_ATTRIBUTE_Previous;
-  }
-  if (!pKeep->TryEnum(eKeepType, eNext, FALSE)) {
-    return FALSE;
-  }
-  if (eNext == XFA_ATTRIBUTEENUM_ContentArea ||
-      eNext == XFA_ATTRIBUTEENUM_PageArea) {
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_FLOAT CXFA_ItemLayoutProcessor::FindSplitPos(FX_FLOAT fProposedSplitPos) {
-  ASSERT(m_pLayoutItem);
-  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-  FX_BOOL bCalculateMargin = TRUE;
-  if (eLayout == XFA_ATTRIBUTEENUM_Position) {
-    bCalculateMargin = FALSE;
-  }
-  while (fProposedSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
-    FX_BOOL bAppChange = FALSE;
-    if (!FindLayoutItemSplitPos(m_pLayoutItem, 0, fProposedSplitPos, bAppChange,
-                                bCalculateMargin)) {
-      break;
-    }
-  }
-  return fProposedSplitPos;
-}
-void CXFA_ItemLayoutProcessor::SplitLayoutItem(
-    CXFA_ContentLayoutItem* pLayoutItem,
-    CXFA_ContentLayoutItem* pSecondParent,
-    FX_FLOAT fSplitPos) {
-  FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0;
-  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-  FX_BOOL bCalculateMargin = TRUE;
-  if (eLayout == XFA_ATTRIBUTEENUM_Position) {
-    bCalculateMargin = FALSE;
-  }
-  CXFA_Node* pMarginNode =
-      pLayoutItem->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  if (pMarginNode && bCalculateMargin) {
-    fCurTopMargin =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
-    fCurBottomMargin =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
-  }
-  CXFA_ContentLayoutItem* pSecondLayoutItem = NULL;
-  if (m_pCurChildPreprocessor &&
-      m_pCurChildPreprocessor->m_pFormNode == pLayoutItem->m_pFormNode) {
-    pSecondLayoutItem = m_pCurChildPreprocessor->CreateContentLayoutItem(
-        pLayoutItem->m_pFormNode);
-  } else {
-    pSecondLayoutItem = CreateContentLayoutItem(pLayoutItem->m_pFormNode);
-  }
-  pSecondLayoutItem->m_sPos.x = pLayoutItem->m_sPos.x;
-  pSecondLayoutItem->m_sSize.x = pLayoutItem->m_sSize.x;
-  pSecondLayoutItem->m_sPos.y = 0;
-  pSecondLayoutItem->m_sSize.y = pLayoutItem->m_sSize.y - fSplitPos;
-  pLayoutItem->m_sSize.y -= pSecondLayoutItem->m_sSize.y;
-  if (pLayoutItem->m_pFirstChild) {
-    pSecondLayoutItem->m_sSize.y += fCurTopMargin;
-  }
-  if (pSecondParent) {
-    pSecondParent->AddChild(pSecondLayoutItem);
-    if (fCurTopMargin > 0 && pLayoutItem->m_pFirstChild) {
-      pSecondParent->m_sSize.y += fCurTopMargin;
-      CXFA_ContentLayoutItem* pParentItem =
-          (CXFA_ContentLayoutItem*)pSecondParent->m_pParent;
-      while (pParentItem) {
-        pParentItem->m_sSize.y += fCurTopMargin;
-        pParentItem = (CXFA_ContentLayoutItem*)pParentItem->m_pParent;
-      }
-    }
-  } else {
-    pSecondLayoutItem->m_pParent = pLayoutItem->m_pParent;
-    pSecondLayoutItem->m_pNextSibling = pLayoutItem->m_pNextSibling;
-    pLayoutItem->m_pNextSibling = pSecondLayoutItem;
-  }
-  CXFA_ContentLayoutItem* pChildren =
-      (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild;
-  pLayoutItem->m_pFirstChild = NULL;
-  FX_FLOAT lHeightForKeep = 0;
-  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems;
-  FX_FLOAT fAddMarginHeight = 0;
-  for (CXFA_ContentLayoutItem *pChildItem = pChildren, *pChildNext = NULL;
-       pChildItem; pChildItem = pChildNext) {
-    pChildNext = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling;
-    pChildItem->m_pNextSibling = NULL;
-    if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin +
-                         XFA_LAYOUT_FLOAT_PERCISION) {
-      if (!XFA_ExistContainerKeep(pChildItem->m_pFormNode, TRUE)) {
-        pChildItem->m_sPos.y -= fSplitPos - fCurBottomMargin;
-        pChildItem->m_sPos.y += lHeightForKeep;
-        pChildItem->m_sPos.y += fAddMarginHeight;
-        pSecondLayoutItem->AddChild(pChildItem);
-      } else {
-        if (lHeightForKeep < XFA_LAYOUT_FLOAT_PERCISION) {
-          for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize();
-               iIndex++) {
-            CXFA_ContentLayoutItem* pPreItem = keepLayoutItems[iIndex];
-            pLayoutItem->RemoveChild(pPreItem);
-            pPreItem->m_sPos.y -= fSplitPos;
-            if (pPreItem->m_sPos.y < 0) {
-              pPreItem->m_sPos.y = 0;
-            }
-            if (pPreItem->m_sPos.y + pPreItem->m_sSize.y > lHeightForKeep) {
-              pPreItem->m_sPos.y = lHeightForKeep;
-              lHeightForKeep += pPreItem->m_sSize.y;
-              pSecondLayoutItem->m_sSize.y += pPreItem->m_sSize.y;
-              if (pSecondParent) {
-                pSecondParent->m_sSize.y += pPreItem->m_sSize.y;
-              }
-            }
-            pSecondLayoutItem->AddChild(pPreItem);
-          }
-        }
-        pChildItem->m_sPos.y -= fSplitPos;
-        pChildItem->m_sPos.y += lHeightForKeep;
-        pChildItem->m_sPos.y += fAddMarginHeight;
-        pSecondLayoutItem->AddChild(pChildItem);
-      }
-    } else if (fSplitPos + XFA_LAYOUT_FLOAT_PERCISION >=
-               fCurTopMargin + fCurBottomMargin + pChildItem->m_sPos.y +
-                   pChildItem->m_sSize.y) {
-      pLayoutItem->AddChild(pChildItem);
-      if (XFA_ExistContainerKeep(pChildItem->m_pFormNode, FALSE)) {
-        keepLayoutItems.Add(pChildItem);
-      } else {
-        keepLayoutItems.RemoveAll();
-      }
-    } else {
-      FX_FLOAT fOldHeight = pSecondLayoutItem->m_sSize.y;
-      SplitLayoutItem(
-          pChildItem, pSecondLayoutItem,
-          fSplitPos - fCurTopMargin - fCurBottomMargin - pChildItem->m_sPos.y);
-      fAddMarginHeight = pSecondLayoutItem->m_sSize.y - fOldHeight;
-      pLayoutItem->AddChild(pChildItem);
-    }
-  }
-}
-void CXFA_ItemLayoutProcessor::SplitLayoutItem(FX_FLOAT fSplitPos) {
-  ASSERT(m_pLayoutItem);
-  SplitLayoutItem(m_pLayoutItem, NULL, fSplitPos);
-}
-
-IXFA_LayoutPage* CXFA_LayoutItem::GetPage() const {
-  for (CXFA_LayoutItem* pCurNode = const_cast<CXFA_LayoutItem*>(this); pCurNode;
-       pCurNode = pCurNode->m_pParent) {
-    if (pCurNode->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea)
-      return static_cast<CXFA_ContainerLayoutItem*>(pCurNode);
-  }
-  return nullptr;
-}
-
-CXFA_Node* CXFA_LayoutItem::GetFormNode() const {
-  return m_pFormNode;
-}
-
-void CXFA_LayoutItem::GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative) const {
-  ASSERT(m_bIsContentLayoutItem);
-  const CXFA_ContentLayoutItem* pThis =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  CFX_PointF sPos = pThis->m_sPos;
-  CFX_SizeF sSize = pThis->m_sSize;
-  if (!bRelative) {
-    for (CXFA_LayoutItem* pLayoutItem = pThis->m_pParent; pLayoutItem;
-         pLayoutItem = pLayoutItem->m_pParent) {
-      if (CXFA_ContentLayoutItem* pContent =
-              pLayoutItem->AsContentLayoutItem()) {
-        sPos += pContent->m_sPos;
-        if (CXFA_Node* pMarginNode =
-                pLayoutItem->m_pFormNode->GetFirstChildByClass(
-                    XFA_ELEMENT_Margin)) {
-          sPos += CFX_PointF(pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset)
-                                 .ToUnit(XFA_UNIT_Pt),
-                             pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset)
-                                 .ToUnit(XFA_UNIT_Pt));
-        }
-      } else {
-        if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
-          sPos +=
-              CFX_PointF(pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_X)
-                             .ToUnit(XFA_UNIT_Pt),
-                         pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Y)
-                             .ToUnit(XFA_UNIT_Pt));
-          break;
-        } else if (pLayoutItem->m_pFormNode->GetClassID() ==
-                   XFA_ELEMENT_PageArea) {
-          break;
-        }
-      }
-    }
-  }
-  rtLayout.Set(sPos.x, sPos.y, sSize.x, sSize.y);
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetParent() const {
-  return m_pParent;
-}
-
-const CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() const {
-  ASSERT(m_bIsContentLayoutItem);
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pPrev) {
-    pCurNode = pCurNode->m_pPrev;
-  }
-  return pCurNode;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() {
-  ASSERT(m_bIsContentLayoutItem);
-  CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pPrev) {
-    pCurNode = pCurNode->m_pPrev;
-  }
-  return pCurNode;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetLast() {
-  ASSERT(m_bIsContentLayoutItem);
-  CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pNext) {
-    pCurNode = pCurNode->m_pNext;
-  }
-  return pCurNode;
-}
-
-const CXFA_LayoutItem* CXFA_LayoutItem::GetLast() const {
-  ASSERT(m_bIsContentLayoutItem);
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pNext) {
-    pCurNode = pCurNode->m_pNext;
-  }
-  return pCurNode;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetPrev() const {
-  ASSERT(m_bIsContentLayoutItem);
-  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pPrev;
-}
-
-CXFA_LayoutItem* CXFA_LayoutItem::GetNext() const {
-  ASSERT(m_bIsContentLayoutItem);
-  return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pNext;
-}
-
-int32_t CXFA_LayoutItem::GetIndex() const {
-  ASSERT(m_bIsContentLayoutItem);
-  int32_t iIndex = 0;
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pPrev) {
-    pCurNode = pCurNode->m_pPrev;
-    ++iIndex;
-  }
-  return iIndex;
-}
-
-int32_t CXFA_LayoutItem::GetCount() const {
-  ASSERT(m_bIsContentLayoutItem);
-  int32_t iCount = GetIndex() + 1;
-  const CXFA_ContentLayoutItem* pCurNode =
-      static_cast<const CXFA_ContentLayoutItem*>(this);
-  while (pCurNode->m_pNext) {
-    pCurNode = pCurNode->m_pNext;
-    iCount++;
-  }
-  return iCount;
-}
-
-void CXFA_LayoutItem::AddChild(CXFA_LayoutItem* pChildItem) {
-  if (pChildItem->m_pParent) {
-    pChildItem->m_pParent->RemoveChild(pChildItem);
-  }
-  pChildItem->m_pParent = this;
-  if (m_pFirstChild == NULL) {
-    m_pFirstChild = pChildItem;
-  } else {
-    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
-    while (pExistingChildItem->m_pNextSibling) {
-      pExistingChildItem = pExistingChildItem->m_pNextSibling;
-    }
-    pExistingChildItem->m_pNextSibling = pChildItem;
-  }
-}
-void CXFA_LayoutItem::AddHeadChild(CXFA_LayoutItem* pChildItem) {
-  if (pChildItem->m_pParent) {
-    pChildItem->m_pParent->RemoveChild(pChildItem);
-  }
-  pChildItem->m_pParent = this;
-  if (m_pFirstChild == NULL) {
-    m_pFirstChild = pChildItem;
-  } else {
-    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
-    m_pFirstChild = pChildItem;
-    m_pFirstChild->m_pNextSibling = pExistingChildItem;
-  }
-}
-void CXFA_LayoutItem::InsertChild(CXFA_LayoutItem* pBeforeItem,
-                                  CXFA_LayoutItem* pChildItem) {
-  if (pBeforeItem->m_pParent != this) {
-    return;
-  }
-  if (pChildItem->m_pParent) {
-    pChildItem->m_pParent = NULL;
-  }
-  pChildItem->m_pParent = this;
-  CXFA_LayoutItem* pExistingChildItem = pBeforeItem->m_pNextSibling;
-  pBeforeItem->m_pNextSibling = pChildItem;
-  pChildItem->m_pNextSibling = pExistingChildItem;
-}
-void CXFA_LayoutItem::RemoveChild(CXFA_LayoutItem* pChildItem) {
-  if (pChildItem->m_pParent != this) {
-    return;
-  }
-  if (m_pFirstChild == pChildItem) {
-    m_pFirstChild = pChildItem->m_pNextSibling;
-  } else {
-    CXFA_LayoutItem* pExistingChildItem = m_pFirstChild;
-    while (pExistingChildItem &&
-           pExistingChildItem->m_pNextSibling != pChildItem) {
-      pExistingChildItem = pExistingChildItem->m_pNextSibling;
-    }
-    if (pExistingChildItem) {
-      pExistingChildItem->m_pNextSibling = pChildItem->m_pNextSibling;
-    }
-  }
-  pChildItem->m_pNextSibling = NULL;
-  pChildItem->m_pParent = NULL;
-}
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::ExtractLayoutItem() {
-  CXFA_ContentLayoutItem* pLayoutItem = m_pLayoutItem;
-  if (pLayoutItem) {
-    m_pLayoutItem = (CXFA_ContentLayoutItem*)pLayoutItem->m_pNextSibling;
-    pLayoutItem->m_pNextSibling = NULL;
-  }
-  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done &&
-      ToContentLayoutItem(m_pOldLayoutItem)) {
-    if (m_pOldLayoutItem->m_pPrev) {
-      m_pOldLayoutItem->m_pPrev->m_pNext = NULL;
-    }
-    IXFA_Notify* pNotify =
-        m_pOldLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify();
-    IXFA_DocLayout* pDocLayout =
-        m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout();
-    CXFA_ContentLayoutItem* pOldLayoutItem = m_pOldLayoutItem;
-    while (pOldLayoutItem) {
-      CXFA_ContentLayoutItem* pNextOldLayoutItem = pOldLayoutItem->m_pNext;
-      pNotify->OnLayoutEvent(pDocLayout, pOldLayoutItem,
-                             XFA_LAYOUTEVENT_ItemRemoving);
-      delete pOldLayoutItem;
-      pOldLayoutItem = pNextOldLayoutItem;
-    }
-    m_pOldLayoutItem = NULL;
-  }
-  return pLayoutItem;
-}
-static FX_BOOL XFA_ItemLayoutProcessor_FindBreakNode(
-    CXFA_Node* pContainerNode,
-    CXFA_Node*& pCurActionNode,
-    XFA_ItemLayoutProcessorStages& nCurStage,
-    FX_BOOL bBreakBefore) {
-  FX_BOOL bFindRs = FALSE;
-  for (CXFA_Node* pBreakNode = pContainerNode; pBreakNode;
-       pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    XFA_ATTRIBUTE eAttributeType = XFA_ATTRIBUTE_Before;
-    if (!bBreakBefore) {
-      eAttributeType = XFA_ATTRIBUTE_After;
-    }
-    switch (pBreakNode->GetClassID()) {
-      case XFA_ELEMENT_BreakBefore: {
-        if (bBreakBefore) {
-          pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
-          bFindRs = TRUE;
-        }
-      } break;
-      case XFA_ELEMENT_BreakAfter: {
-        if (!bBreakBefore) {
-          pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
-          bFindRs = TRUE;
-        }
-      } break;
-      case XFA_ELEMENT_Break:
-        if (pBreakNode->GetEnum(eAttributeType) != XFA_ATTRIBUTEENUM_Auto) {
-          pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
-          if (!bBreakBefore) {
-            nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
-          }
-          bFindRs = TRUE;
-          break;
-        }
-      default:
-        break;
-    }
-    if (bFindRs) {
-      break;
-    }
-  }
-  return bFindRs;
-}
-static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) {
-  IXFA_Notify* pNotify = pGenerateNode->GetDocument()->GetParser()->GetNotify();
-  IXFA_DocLayout* pDocLayout = pGenerateNode->GetDocument()->GetDocLayout();
-  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
-      pGenerateNode);
-  for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-       pNode = sIterator.MoveToNext()) {
-    CXFA_ContentLayoutItem* pCurLayoutItem =
-        (CXFA_ContentLayoutItem*)pNode->GetUserData(XFA_LAYOUTITEMKEY);
-    CXFA_ContentLayoutItem* pNextLayoutItem = NULL;
-    while (pCurLayoutItem) {
-      pNextLayoutItem = pCurLayoutItem->m_pNext;
-      pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
-                             XFA_LAYOUTEVENT_ItemRemoving);
-      delete pCurLayoutItem;
-      pCurLayoutItem = pNextLayoutItem;
-    }
-  }
-  pGenerateNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pGenerateNode);
-}
-void CXFA_ItemLayoutProcessor::XFA_ItemLayoutProcessor_GotoNextContainerNode(
-    CXFA_Node*& pCurActionNode,
-    XFA_ItemLayoutProcessorStages& nCurStage,
-    CXFA_Node* pParentContainer,
-    FX_BOOL bUsePageBreak) {
-  CXFA_Node* pEntireContainer = pParentContainer;
-  CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE;
-  switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages_BreakBefore:
-    case XFA_ItemLayoutProcessorStages_BreakAfter: {
-      pChildContainer = pCurActionNode->GetNodeItem(XFA_NODEITEM_Parent);
-    } break;
-    case XFA_ItemLayoutProcessorStages_Keep:
-    case XFA_ItemLayoutProcessorStages_Container:
-      pChildContainer = pCurActionNode;
-      break;
-    default:
-      pChildContainer = XFA_LAYOUT_INVALIDNODE;
-      break;
-  }
-  switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages_Keep: {
-      CXFA_Node* pBreakAfterNode =
-          pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!m_bKeepBreakFinish &&
-          XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode,
-                                                nCurStage, FALSE)) {
-        return;
-      }
-      goto CheckNextChildContainer;
-    }
-    case XFA_ItemLayoutProcessorStages_None: {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BookendLeader:
-        for (CXFA_Node* pBookendNode =
-                 pCurActionNode == XFA_LAYOUT_INVALIDNODE
-                     ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
-                     : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-             pBookendNode; pBookendNode = pBookendNode->GetNodeItem(
-                               XFA_NODEITEM_NextSibling)) {
-          switch (pBookendNode->GetClassID()) {
-            case XFA_ELEMENT_Bookend:
-            case XFA_ELEMENT_Break:
-              pCurActionNode = pBookendNode;
-              nCurStage = XFA_ItemLayoutProcessorStages_BookendLeader;
-              return;
-            default:
-              break;
-          }
-        }
-    }
-      {
-        pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-        case XFA_ItemLayoutProcessorStages_BreakBefore:
-          if (pCurActionNode != XFA_LAYOUT_INVALIDNODE) {
-            CXFA_Node* pBreakBeforeNode =
-                pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-            if (!m_bKeepBreakFinish &&
-                XFA_ItemLayoutProcessor_FindBreakNode(
-                    pBreakBeforeNode, pCurActionNode, nCurStage, TRUE)) {
-              return;
-            }
-            if (m_bIsProcessKeep) {
-              if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
-                                                 pChildContainer)) {
-                return;
-              }
-              goto CheckNextChildContainer;
-            }
-            pCurActionNode = pChildContainer;
-            nCurStage = XFA_ItemLayoutProcessorStages_Container;
-            return;
-          }
-          goto CheckNextChildContainer;
-      }
-    case XFA_ItemLayoutProcessorStages_Container: {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BreakAfter: {
-        if (pCurActionNode == XFA_LAYOUT_INVALIDNODE) {
-          CXFA_Node* pBreakAfterNode =
-              pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
-          if (!m_bKeepBreakFinish &&
-              XFA_ItemLayoutProcessor_FindBreakNode(
-                  pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) {
-            return;
-          }
-        } else {
-          CXFA_Node* pBreakAfterNode =
-              pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-          if (XFA_ItemLayoutProcessor_FindBreakNode(
-                  pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) {
-            return;
-          }
-        }
-        goto CheckNextChildContainer;
-      }
-    }
-    CheckNextChildContainer : {
-      CXFA_Node* pNextChildContainer =
-          pChildContainer == XFA_LAYOUT_INVALIDNODE
-              ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild,
-                                              XFA_OBJECTTYPE_ContainerNode)
-              : pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling,
-                                             XFA_OBJECTTYPE_ContainerNode);
-      while (pNextChildContainer &&
-             pNextChildContainer->HasFlag(XFA_NODEFLAG_LayoutGeneratedNode)) {
-        CXFA_Node* pSaveNode = pNextChildContainer;
-        pNextChildContainer = pNextChildContainer->GetNodeItem(
-            XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode);
-        if (pSaveNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-          XFA_DeleteLayoutGeneratedNode(pSaveNode);
-        }
-      }
-      if (!pNextChildContainer) {
-        goto NoMoreChildContainer;
-      }
-      FX_BOOL bLastKeep = FALSE;
-      if (ProcessKeepNodesForCheckNext(pCurActionNode, nCurStage,
-                                       pNextChildContainer, bLastKeep)) {
-        return;
-      }
-      if (!m_bKeepBreakFinish && !bLastKeep &&
-          XFA_ItemLayoutProcessor_FindBreakNode(
-              pNextChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild),
-              pCurActionNode, nCurStage, TRUE)) {
-        return;
-      }
-      pCurActionNode = pNextChildContainer;
-      if (m_bIsProcessKeep) {
-        nCurStage = XFA_ItemLayoutProcessorStages_Keep;
-      } else {
-        nCurStage = XFA_ItemLayoutProcessorStages_Container;
-      }
-      return;
-    }
-    NoMoreChildContainer : {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BookendTrailer:
-        for (CXFA_Node* pBookendNode =
-                 pCurActionNode == XFA_LAYOUT_INVALIDNODE
-                     ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
-                     : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-             pBookendNode; pBookendNode = pBookendNode->GetNodeItem(
-                               XFA_NODEITEM_NextSibling)) {
-          switch (pBookendNode->GetClassID()) {
-            case XFA_ELEMENT_Bookend:
-            case XFA_ELEMENT_Break:
-              pCurActionNode = pBookendNode;
-              nCurStage = XFA_ItemLayoutProcessorStages_BookendTrailer;
-              return;
-            default:
-              break;
-          }
-        }
-    }
-    default:
-      pCurActionNode = NULL;
-      nCurStage = XFA_ItemLayoutProcessorStages_Done;
-  }
-}
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext(
-    CXFA_Node*& pCurActionNode,
-    XFA_ItemLayoutProcessorStages& nCurStage,
-    CXFA_Node*& pNextContainer,
-    FX_BOOL& bLastKeepNode) {
-  const bool bCanSplit = pNextContainer->GetIntact() == XFA_ATTRIBUTEENUM_None;
-  FX_BOOL bNextKeep = FALSE;
-  if (XFA_ExistContainerKeep(pNextContainer, FALSE)) {
-    bNextKeep = TRUE;
-  }
-  if (bNextKeep && !bCanSplit) {
-    if (!m_bIsProcessKeep && !m_bKeepBreakFinish) {
-      m_pKeepHeadNode = pNextContainer;
-      m_bIsProcessKeep = TRUE;
-    }
-  } else {
-    if (m_bIsProcessKeep && m_pKeepHeadNode) {
-      m_pKeepTailNode = pNextContainer;
-      if (!m_bKeepBreakFinish &&
-          XFA_ItemLayoutProcessor_FindBreakNode(
-              pNextContainer->GetNodeItem(XFA_NODEITEM_FirstChild),
-              pCurActionNode, nCurStage, TRUE)) {
-        return TRUE;
-      } else {
-        pNextContainer = m_pKeepHeadNode;
-        m_bKeepBreakFinish = TRUE;
-        m_pKeepHeadNode = NULL;
-        m_pKeepTailNode = NULL;
-        m_bIsProcessKeep = FALSE;
-      }
-    } else {
-      if (m_bKeepBreakFinish) {
-        bLastKeepNode = TRUE;
-      }
-      m_bKeepBreakFinish = FALSE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore(
-    CXFA_Node*& pCurActionNode,
-    XFA_ItemLayoutProcessorStages& nCurStage,
-    CXFA_Node* pContainerNode) {
-  if (m_pKeepTailNode == pContainerNode) {
-    pCurActionNode = m_pKeepHeadNode;
-    m_bKeepBreakFinish = TRUE;
-    m_pKeepHeadNode = NULL;
-    m_pKeepTailNode = NULL;
-    m_bIsProcessKeep = FALSE;
-    nCurStage = XFA_ItemLayoutProcessorStages_Container;
-    return TRUE;
-  }
-  CXFA_Node* pBreakAfterNode =
-      pContainerNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode,
-                                            nCurStage, FALSE)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode) {
-  XFA_ATTRIBUTEENUM ePresence = pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-  return ePresence == XFA_ATTRIBUTEENUM_Visible ||
-         ePresence == XFA_ATTRIBUTEENUM_Invisible;
-}
-static inline void XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
-    CXFA_Node* pFormNode,
-    FX_FLOAT& fContainerWidth,
-    FX_FLOAT& fContainerHeight,
-    FX_BOOL& bContainerWidthAutoSize,
-    FX_BOOL& bContainerHeightAutoSize) {
-  fContainerWidth = 0;
-  fContainerHeight = 0;
-  bContainerWidthAutoSize = TRUE;
-  bContainerHeightAutoSize = TRUE;
-  XFA_ELEMENT eClassID = pFormNode->GetClassID();
-  CXFA_Measurement mTmpValue;
-  if (bContainerWidthAutoSize &&
-      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) &&
-      pFormNode->TryMeasure(XFA_ATTRIBUTE_W, mTmpValue, FALSE) &&
-      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
-    fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt);
-    bContainerWidthAutoSize = FALSE;
-  }
-  if (bContainerHeightAutoSize &&
-      (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) &&
-      pFormNode->TryMeasure(XFA_ATTRIBUTE_H, mTmpValue, FALSE) &&
-      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
-    fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt);
-    bContainerHeightAutoSize = FALSE;
-  }
-  if (bContainerWidthAutoSize && eClassID == XFA_ELEMENT_Subform &&
-      pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxW, mTmpValue, FALSE) &&
-      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
-    fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt);
-    bContainerWidthAutoSize = FALSE;
-  }
-  if (bContainerHeightAutoSize && eClassID == XFA_ELEMENT_Subform &&
-      pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxH, mTmpValue, FALSE) &&
-      mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
-    fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt);
-    bContainerHeightAutoSize = FALSE;
-  }
-}
-static inline void
-XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
-    CXFA_Node* pFormNode,
-    FX_BOOL bContainerWidthAutoSize,
-    FX_FLOAT fContentCalculatedWidth,
-    FX_FLOAT& fContainerWidth,
-    FX_BOOL bContainerHeightAutoSize,
-    FX_FLOAT fContentCalculatedHeight,
-    FX_FLOAT& fContainerHeight) {
-  CXFA_Node* pMarginNode = pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  CXFA_Measurement mTmpValue;
-  if (bContainerWidthAutoSize) {
-    fContainerWidth = fContentCalculatedWidth;
-    if (pMarginNode) {
-      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_LeftInset, mTmpValue, FALSE)) {
-        fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt);
-      }
-      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_RightInset, mTmpValue, FALSE)) {
-        fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt);
-      }
-    }
-  }
-  if (bContainerHeightAutoSize) {
-    fContainerHeight = fContentCalculatedHeight;
-    if (pMarginNode) {
-      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_TopInset, mTmpValue, FALSE)) {
-        fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt);
-      }
-      if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_BottomInset, mTmpValue,
-                                  FALSE)) {
-        fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt);
-      }
-    }
-  }
-}
-void CXFA_ItemLayoutProcessor::CalculatePositionedContainerPos(
-    CXFA_Node* pNode,
-    FX_FLOAT fWidth,
-    FX_FLOAT fHeight,
-    FX_FLOAT& fAbsoluteX,
-    FX_FLOAT& fAbsoluteY) {
-  XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
-  int32_t nAnchorType = 0;
-  switch (eAnchorType) {
-    case XFA_ATTRIBUTEENUM_TopLeft:
-      nAnchorType = 0;
-      break;
-    case XFA_ATTRIBUTEENUM_TopCenter:
-      nAnchorType = 1;
-      break;
-    case XFA_ATTRIBUTEENUM_TopRight:
-      nAnchorType = 2;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleLeft:
-      nAnchorType = 3;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleCenter:
-      nAnchorType = 4;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleRight:
-      nAnchorType = 5;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomLeft:
-      nAnchorType = 6;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomCenter:
-      nAnchorType = 7;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomRight:
-      nAnchorType = 8;
-      break;
-    default:
-      break;
-  }
-  static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8},
-                                         {6, 3, 0, 7, 4, 1, 8, 5, 2},
-                                         {8, 7, 6, 5, 4, 3, 2, 1, 0},
-                                         {2, 5, 8, 1, 4, 7, 0, 3, 6}};
-
-  FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
-  FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
-  int32_t nRotate =
-      FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
-  nRotate = XFA_MapRotation(nRotate) / 90;
-  int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType];
-  fAbsoluteX = fAnchorX;
-  fAbsoluteY = fAnchorY;
-  switch (nAbsoluteAnchorType / 3) {
-    case 1:
-      fAbsoluteY -= fHeight / 2;
-      break;
-    case 2:
-      fAbsoluteY -= fHeight;
-      break;
-    default:
-      break;
-  }
-  switch (nAbsoluteAnchorType % 3) {
-    case 1:
-      fAbsoluteX -= fWidth / 2;
-      break;
-    case 2:
-      fAbsoluteX -= fWidth;
-      break;
-    default:
-      break;
-  }
-}
-FX_BOOL CXFA_ItemLayoutProcessor::IncrementRelayoutNode(
-    CXFA_LayoutProcessor* pLayoutProcessor,
-    CXFA_Node* pNode,
-    CXFA_Node* pParentNode) {
-  return FALSE;
-}
-void CXFA_ItemLayoutProcessor::DoLayoutPageArea(
-    CXFA_ContainerLayoutItem* pPageAreaLayoutItem) {
-  CXFA_Node* pFormNode = pPageAreaLayoutItem->m_pFormNode;
-  CXFA_Node* pCurChildNode = XFA_LAYOUT_INVALIDNODE;
-  XFA_ItemLayoutProcessorStages nCurChildNodeStage =
-      XFA_ItemLayoutProcessorStages_None;
-  CXFA_LayoutItem* pBeforeItem = NULL;
-  for (XFA_ItemLayoutProcessor_GotoNextContainerNode(
-           pCurChildNode, nCurChildNodeStage, pFormNode, FALSE);
-       pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
-           pCurChildNode, nCurChildNodeStage, pFormNode, FALSE)) {
-    if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
-      continue;
-    }
-    if (pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
-      continue;
-    }
-    CXFA_ItemLayoutProcessor* pProcessor =
-        new CXFA_ItemLayoutProcessor(pCurChildNode, NULL);
-    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
-    if (!pProcessor->HasLayoutItem()) {
-      delete pProcessor;
-      continue;
-    }
-    FX_FLOAT fWidth, fHeight;
-    pProcessor->GetCurrentComponentSize(fWidth, fHeight);
-    FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0;
-    CalculatePositionedContainerPos(pCurChildNode, fWidth, fHeight, fAbsoluteX,
-                                    fAbsoluteY);
-    pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY);
-    CXFA_LayoutItem* pProcessItem = pProcessor->ExtractLayoutItem();
-    if (pBeforeItem == NULL) {
-      pPageAreaLayoutItem->AddHeadChild(pProcessItem);
-    } else {
-      pPageAreaLayoutItem->InsertChild(pBeforeItem, pProcessItem);
-    }
-    pBeforeItem = pProcessItem;
-    delete pProcessor;
-  }
-  pBeforeItem = NULL;
-  CXFA_LayoutItem* pLayoutItem = pPageAreaLayoutItem->m_pFirstChild;
-  while (pLayoutItem) {
-    if (!pLayoutItem->IsContentLayoutItem() ||
-        pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_Draw) {
-      pLayoutItem = pLayoutItem->m_pNextSibling;
-      continue;
-    }
-    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_Draw) {
-      CXFA_LayoutItem* pNextLayoutItem = pLayoutItem->m_pNextSibling;
-      pPageAreaLayoutItem->RemoveChild(pLayoutItem);
-      if (pBeforeItem == NULL) {
-        pPageAreaLayoutItem->AddHeadChild(pLayoutItem);
-      } else {
-        pPageAreaLayoutItem->InsertChild(pBeforeItem, pLayoutItem);
-      }
-      pBeforeItem = pLayoutItem;
-      pLayoutItem = pNextLayoutItem;
-    }
-  }
-}
-void CXFA_ItemLayoutProcessor::DoLayoutPositionedContainer(
-    CXFA_LayoutContext* pContext) {
-  if (m_pLayoutItem)
-    return;
-
-  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-  FX_BOOL bIgnoreXY = (m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) !=
-                       XFA_ATTRIBUTEENUM_Position);
-  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
-  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
-  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
-      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
-      bContainerHeightAutoSize);
-  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
-  FX_FLOAT fHiddenContentCalculatedWidth = 0,
-           fHiddenContentCalculatedHeight = 0;
-  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
-    XFA_ItemLayoutProcessor_GotoNextContainerNode(
-        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE);
-  }
-  int32_t iColIndex = 0;
-  for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
-           m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
-      continue;
-    }
-    if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
-      continue;
-    }
-    CXFA_ItemLayoutProcessor* pProcessor =
-        new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
-    if (pContext && pContext->m_prgSpecifiedColumnWidths) {
-      int32_t iColSpan = m_pCurChildNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
-      if (iColSpan <=
-          pContext->m_prgSpecifiedColumnWidths->GetSize() - iColIndex) {
-        pContext->m_fCurColumnWidth = 0;
-        pContext->m_bCurColumnWidthAvaiable = TRUE;
-        if (iColSpan == -1)
-          iColSpan = pContext->m_prgSpecifiedColumnWidths->GetSize();
-        for (int32_t i = 0; iColIndex + i < iColSpan; ++i) {
-          pContext->m_fCurColumnWidth +=
-              pContext->m_prgSpecifiedColumnWidths->GetAt(iColIndex + i);
-        }
-        if (pContext->m_fCurColumnWidth == 0)
-          pContext->m_bCurColumnWidthAvaiable = FALSE;
-        iColIndex += iColSpan >= 0 ? iColSpan : 0;
-      }
-    }
-    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
-                         pContext);
-    if (!pProcessor->HasLayoutItem()) {
-      delete pProcessor;
-      continue;
-    }
-    FX_FLOAT fWidth, fHeight;
-    pProcessor->GetCurrentComponentSize(fWidth, fHeight);
-    FX_BOOL bChangeParentSize = FALSE;
-    if (XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) {
-      bChangeParentSize = TRUE;
-    }
-    FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0;
-    if (!bIgnoreXY) {
-      CalculatePositionedContainerPos(m_pCurChildNode, fWidth, fHeight,
-                                      fAbsoluteX, fAbsoluteY);
-    }
-    pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY);
-    if (bContainerWidthAutoSize) {
-      FX_FLOAT fChildSuppliedWidth = fAbsoluteX + fWidth;
-      if (bChangeParentSize) {
-        if (fContentCalculatedWidth < fChildSuppliedWidth) {
-          fContentCalculatedWidth = fChildSuppliedWidth;
-        }
-      } else {
-        if (fHiddenContentCalculatedWidth < fChildSuppliedWidth &&
-            m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) {
-          fHiddenContentCalculatedWidth = fChildSuppliedWidth;
-        }
-      }
-    }
-    if (bContainerHeightAutoSize) {
-      FX_FLOAT fChildSuppliedHeight = fAbsoluteY + fHeight;
-      if (bChangeParentSize) {
-        if (fContentCalculatedHeight < fChildSuppliedHeight) {
-          fContentCalculatedHeight = fChildSuppliedHeight;
-        }
-      } else {
-        if (fHiddenContentCalculatedHeight < fChildSuppliedHeight &&
-            m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) {
-          fHiddenContentCalculatedHeight = fChildSuppliedHeight;
-        }
-      }
-    }
-    m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem());
-    delete pProcessor;
-  }
-  XFA_VERSION eVersion = m_pFormNode->GetDocument()->GetCurVersionMode();
-  if (fContentCalculatedWidth == 0 && eVersion < XFA_VERSION_207) {
-    fContentCalculatedWidth = fHiddenContentCalculatedWidth;
-  }
-  if (fContentCalculatedHeight == 0 && eVersion < XFA_VERSION_207) {
-    fContentCalculatedHeight = fHiddenContentCalculatedHeight;
-  }
-  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
-      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
-      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
-      fContainerHeight);
-  SetCurrentComponentSize(fContainerWidth, fContainerHeight);
-}
-static inline void XFA_ItemLayoutProcessor_UpdateWidgetSize(
-    CXFA_ContentLayoutItem* pLayoutItem,
-    FX_FLOAT& fWidth,
-    FX_FLOAT& fHeight) {
-  CXFA_Node* pNode = pLayoutItem->m_pFormNode;
-  ASSERT(pNode);
-  XFA_ELEMENT eClassID = pNode->GetClassID();
-  switch (eClassID) {
-    case XFA_ELEMENT_Subform:
-    case XFA_ELEMENT_Area:
-    case XFA_ELEMENT_ExclGroup:
-    case XFA_ELEMENT_SubformSet: {
-      if (fWidth < -XFA_LAYOUT_FLOAT_PERCISION) {
-        fWidth = pLayoutItem->m_sSize.x;
-      }
-      if (fHeight < -XFA_LAYOUT_FLOAT_PERCISION) {
-        fHeight = pLayoutItem->m_sSize.y;
-      }
-      break;
-    }
-    case XFA_ELEMENT_Draw:
-    case XFA_ELEMENT_Field: {
-      pNode->GetDocument()->GetParser()->GetNotify()->StartFieldDrawLayout(
-          pNode, fWidth, fHeight);
-      break;
-    }
-    default:
-      ASSERT(FALSE);
-  }
-}
-static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells(
-    CXFA_ContentLayoutItem* pLayoutRow,
-    const CFX_ArrayTemplate<FX_FLOAT>& rgSpecifiedColumnWidths,
-    XFA_ATTRIBUTEENUM eLayout) {
-  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
-  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
-  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
-      pLayoutRow->m_pFormNode, fContainerWidth, fContainerHeight,
-      bContainerWidthAutoSize, bContainerHeightAutoSize);
-  CXFA_Node* pMarginNode =
-      pLayoutRow->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
-    fTopInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
-    fRightInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
-    fBottomInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
-  }
-  FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
-                              : fContainerWidth - fLeftInset - fRightInset;
-  FX_FLOAT fContentCurrentHeight =
-      pLayoutRow->m_sSize.y - fTopInset - fBottomInset;
-  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
-  FX_FLOAT fCurrentColX = 0;
-  int32_t nCurrentColIdx = 0;
-  FX_BOOL bMetWholeRowCell = FALSE;
-  for (CXFA_ContentLayoutItem* pLayoutChild =
-           (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
-       pLayoutChild;
-       pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
-    int32_t nOriginalColSpan =
-        pLayoutChild->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
-    int32_t nColSpan = nOriginalColSpan;
-    FX_FLOAT fColSpanWidth = 0;
-    if (nColSpan == -1 ||
-        nCurrentColIdx + nColSpan > rgSpecifiedColumnWidths.GetSize()) {
-      nColSpan = rgSpecifiedColumnWidths.GetSize() - nCurrentColIdx;
-    }
-    for (int32_t i = 0; i < nColSpan; i++) {
-      fColSpanWidth += rgSpecifiedColumnWidths[nCurrentColIdx + i];
-    }
-    if (nColSpan != nOriginalColSpan) {
-      fColSpanWidth = bMetWholeRowCell ? 0 : std::max(fColSpanWidth,
-                                                      pLayoutChild->m_sSize.y);
-    }
-    if (nOriginalColSpan == -1) {
-      bMetWholeRowCell = TRUE;
-    }
-    pLayoutChild->m_sPos = CFX_PointF(fCurrentColX, 0);
-    pLayoutChild->m_sSize.x = fColSpanWidth;
-    if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
-      fCurrentColX += fColSpanWidth;
-      nCurrentColIdx += nColSpan;
-      FX_FLOAT fNewHeight =
-          bContainerHeightAutoSize ? -1 : fContentCurrentHeight;
-      XFA_ItemLayoutProcessor_UpdateWidgetSize(pLayoutChild, fColSpanWidth,
-                                               fNewHeight);
-      pLayoutChild->m_sSize.y = fNewHeight;
-      if (bContainerHeightAutoSize) {
-        FX_FLOAT fChildSuppliedHeight = pLayoutChild->m_sSize.y;
-        if (fContentCalculatedHeight < fChildSuppliedHeight) {
-          fContentCalculatedHeight = fChildSuppliedHeight;
-        }
-      }
-    }
-  }
-  if (bContainerHeightAutoSize) {
-    for (CXFA_ContentLayoutItem* pLayoutChild =
-             (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
-         pLayoutChild;
-         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
-      XFA_ItemLayoutProcessor_UpdateWidgetSize(
-          pLayoutChild, pLayoutChild->m_sSize.x, fContentCalculatedHeight);
-      FX_FLOAT fOldChildHeight = pLayoutChild->m_sSize.y;
-      pLayoutChild->m_sSize.y = fContentCalculatedHeight;
-      CXFA_Node* pParaNode =
-          pLayoutChild->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Para);
-      if (pParaNode && pLayoutChild->m_pFirstChild) {
-        FX_FLOAT fOffHeight = fContentCalculatedHeight - fOldChildHeight;
-        XFA_ATTRIBUTEENUM eVType = pParaNode->GetEnum(XFA_ATTRIBUTE_VAlign);
-        switch (eVType) {
-          case XFA_ATTRIBUTEENUM_Middle:
-            fOffHeight = fOffHeight / 2;
-            break;
-          case XFA_ATTRIBUTEENUM_Bottom:
-            break;
-          case XFA_ATTRIBUTEENUM_Top:
-          default:
-            fOffHeight = 0;
-            break;
-        }
-        if (fOffHeight > 0) {
-          for (CXFA_ContentLayoutItem* pInnerLayoutChild =
-                   (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild;
-               pInnerLayoutChild;
-               pInnerLayoutChild =
-                   (CXFA_ContentLayoutItem*)pInnerLayoutChild->m_pNextSibling) {
-            pInnerLayoutChild->m_sPos.y += fOffHeight;
-          }
-        }
-      }
-    }
-  }
-  if (bContainerWidthAutoSize) {
-    FX_FLOAT fChildSuppliedWidth = fCurrentColX;
-    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
-        fContentWidthLimit > fChildSuppliedWidth) {
-      fChildSuppliedWidth = fContentWidthLimit;
-    }
-    if (fContentCalculatedWidth < fChildSuppliedWidth) {
-      fContentCalculatedWidth = fChildSuppliedWidth;
-    }
-  } else {
-    fContentCalculatedWidth = fContainerWidth - fLeftInset - fRightInset;
-  }
-  if (pLayoutRow->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) ==
-      XFA_ATTRIBUTEENUM_Rl_row) {
-    for (CXFA_ContentLayoutItem* pLayoutChild =
-             (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild;
-         pLayoutChild;
-         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
-      pLayoutChild->m_sPos.x = fContentCalculatedWidth -
-                               pLayoutChild->m_sPos.x - pLayoutChild->m_sSize.x;
-    }
-  }
-  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
-      pLayoutRow->m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
-      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
-      fContainerHeight);
-  pLayoutRow->m_sSize = CFX_SizeF(fContainerWidth, fContainerHeight);
-}
-void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
-  if (m_pLayoutItem)
-    return;
-
-  if (pLayoutNode == NULL) {
-    pLayoutNode = m_pFormNode;
-  }
-  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
-  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
-  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
-  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
-      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
-      bContainerHeightAutoSize);
-  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
-  CXFA_Node* pMarginNode =
-      m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  FX_FLOAT fLeftInset = 0;
-  FX_FLOAT fRightInset = 0;
-  if (pMarginNode) {
-    fLeftInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
-    fRightInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
-  }
-  FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
-                              : fContainerWidth - fLeftInset - fRightInset;
-  CFX_WideStringC wsColumnWidths;
-  if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) {
-    CFX_WideStringArray widths;
-    if (FX_SeparateStringW(wsColumnWidths.GetPtr(), wsColumnWidths.GetLength(),
-                           L' ', widths) > 0) {
-      int32_t iCols = widths.GetSize();
-      CFX_WideString wsWidth;
-      for (int32_t i = 0; i < iCols; i++) {
-        wsWidth = widths[i];
-        wsWidth.TrimLeft(L' ');
-        if (!wsWidth.IsEmpty()) {
-          CXFA_Measurement measure(wsWidth);
-          m_rgSpecifiedColumnWidths.Add(measure.ToUnit(XFA_UNIT_Pt));
-        }
-      }
-    }
-  }
-  int32_t iSpecifiedColumnCount = m_rgSpecifiedColumnWidths.GetSize();
-  CXFA_LayoutContext layoutContext;
-  layoutContext.m_prgSpecifiedColumnWidths = &m_rgSpecifiedColumnWidths;
-  CXFA_LayoutContext* pLayoutContext =
-      iSpecifiedColumnCount > 0 ? &layoutContext : NULL;
-  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
-    XFA_ItemLayoutProcessor_GotoNextContainerNode(
-        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE);
-  }
-  for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode(
-           m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) {
-    layoutContext.m_bCurColumnWidthAvaiable = FALSE;
-    layoutContext.m_fCurColumnWidth = 0;
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) {
-      continue;
-    }
-    CXFA_ItemLayoutProcessor* pProcessor =
-        new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
-    pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
-                         pLayoutContext);
-    if (!pProcessor->HasLayoutItem()) {
-      delete pProcessor;
-      continue;
-    }
-    m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem());
-    delete pProcessor;
-  }
-  int32_t iRowCount = 0, iColCount = 0;
-  {
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgRowItems;
-    CFX_ArrayTemplate<int32_t> rgRowItemsSpan;
-    CFX_ArrayTemplate<FX_FLOAT> rgRowItemsWidth;
-    for (CXFA_ContentLayoutItem* pLayoutChild =
-             (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
-         pLayoutChild;
-         pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
-      if (pLayoutChild->m_pFormNode->GetClassID() != XFA_ELEMENT_Subform) {
-        continue;
-      }
-      if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
-        continue;
-      }
-      XFA_ATTRIBUTEENUM eLayout =
-          pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-      if (eLayout != XFA_ATTRIBUTEENUM_Row &&
-          eLayout != XFA_ATTRIBUTEENUM_Rl_row) {
-        continue;
-      }
-      if (CXFA_ContentLayoutItem* pRowLayoutCell =
-              (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild) {
-        rgRowItems.Add(pRowLayoutCell);
-        int32_t iColSpan =
-            pRowLayoutCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
-        rgRowItemsSpan.Add(iColSpan);
-        rgRowItemsWidth.Add(pRowLayoutCell->m_sSize.x);
-      }
-    }
-    iRowCount = rgRowItems.GetSize();
-    iColCount = 0;
-    FX_BOOL bMoreColumns = TRUE;
-    while (bMoreColumns) {
-      bMoreColumns = FALSE;
-      FX_BOOL bAutoCol = FALSE;
-      for (int32_t i = 0; i < iRowCount; i++) {
-        while (rgRowItems[i] && (rgRowItemsSpan[i] <= 0 ||
-                                 !XFA_ItemLayoutProcessor_IsTakingSpace(
-                                     rgRowItems[i]->m_pFormNode))) {
-          CXFA_ContentLayoutItem* pNewCell =
-              (CXFA_ContentLayoutItem*)rgRowItems[i]->m_pNextSibling;
-          if (rgRowItemsSpan[i] < 0 && XFA_ItemLayoutProcessor_IsTakingSpace(
-                                           rgRowItems[i]->m_pFormNode)) {
-            pNewCell = NULL;
-          }
-          rgRowItems[i] = pNewCell;
-          rgRowItemsSpan[i] =
-              pNewCell
-                  ? pNewCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan)
-                  : 0;
-          rgRowItemsWidth[i] = pNewCell ? pNewCell->m_sSize.x : 0;
-        }
-        CXFA_ContentLayoutItem* pCell = rgRowItems[i];
-        if (!pCell) {
-          continue;
-        }
-        bMoreColumns = TRUE;
-        if (rgRowItemsSpan[i] == 1) {
-          if (iColCount >= iSpecifiedColumnCount) {
-            for (int32_t j = 0, c = iColCount + 1 -
-                                    m_rgSpecifiedColumnWidths.GetSize();
-                 j < c; j++) {
-              m_rgSpecifiedColumnWidths.Add(0);
-            }
-          }
-          if (m_rgSpecifiedColumnWidths[iColCount] <
-              XFA_LAYOUT_FLOAT_PERCISION) {
-            bAutoCol = TRUE;
-          }
-          if (bAutoCol &&
-              m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) {
-            m_rgSpecifiedColumnWidths[iColCount] = rgRowItemsWidth[i];
-          }
-        }
-      }
-      if (bMoreColumns) {
-        FX_FLOAT fFinalColumnWidth = 0.0f;
-        if (iColCount < m_rgSpecifiedColumnWidths.GetSize())
-          fFinalColumnWidth = m_rgSpecifiedColumnWidths[iColCount];
-        for (int32_t i = 0; i < iRowCount; ++i) {
-          if (!rgRowItems[i])
-            continue;
-          --rgRowItemsSpan[i];
-          rgRowItemsWidth[i] -= fFinalColumnWidth;
-        }
-        ++iColCount;
-      }
-    }
-  }
-  FX_FLOAT fCurrentRowY = 0;
-  for (CXFA_ContentLayoutItem* pLayoutChild =
-           (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
-       pLayoutChild;
-       pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) {
-    if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) {
-      continue;
-    }
-    if (pLayoutChild->m_pFormNode->GetClassID() == XFA_ELEMENT_Subform) {
-      XFA_ATTRIBUTEENUM eSubformLayout =
-          pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-      if (eSubformLayout == XFA_ATTRIBUTEENUM_Row ||
-          eSubformLayout == XFA_ATTRIBUTEENUM_Rl_row) {
-        XFA_ItemLayoutProcessor_RelocateTableRowCells(
-            pLayoutChild, m_rgSpecifiedColumnWidths, eSubformLayout);
-      }
-    }
-    pLayoutChild->m_sPos.y = fCurrentRowY;
-    if (bContainerWidthAutoSize) {
-      pLayoutChild->m_sPos.x = 0;
-    } else {
-      switch (pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
-        case XFA_ATTRIBUTEENUM_Left:
-        default:
-          pLayoutChild->m_sPos.x = 0;
-          break;
-        case XFA_ATTRIBUTEENUM_Center:
-          pLayoutChild->m_sPos.x =
-              (fContentWidthLimit - pLayoutChild->m_sSize.x) / 2;
-          break;
-        case XFA_ATTRIBUTEENUM_Right:
-          pLayoutChild->m_sPos.x = fContentWidthLimit - pLayoutChild->m_sSize.x;
-          break;
-      }
-    }
-    if (bContainerWidthAutoSize) {
-      FX_FLOAT fChildSuppliedWidth =
-          pLayoutChild->m_sPos.x + pLayoutChild->m_sSize.x;
-      if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
-          fContentWidthLimit > fChildSuppliedWidth) {
-        fChildSuppliedWidth = fContentWidthLimit;
-      }
-      if (fContentCalculatedWidth < fChildSuppliedWidth) {
-        fContentCalculatedWidth = fChildSuppliedWidth;
-      }
-    }
-    fCurrentRowY += pLayoutChild->m_sSize.y;
-  }
-  if (bContainerHeightAutoSize) {
-    FX_FLOAT fChildSuppliedHeight = fCurrentRowY;
-    if (fContentCalculatedHeight < fChildSuppliedHeight) {
-      fContentCalculatedHeight = fChildSuppliedHeight;
-    }
-  }
-  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
-      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
-      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
-      fContainerHeight);
-  SetCurrentComponentSize(fContainerWidth, fContainerHeight);
-}
-static uint8_t XFA_ItemLayoutProcessor_HAlignEnumToInt(
-    XFA_ATTRIBUTEENUM eHAlign) {
-  switch (eHAlign) {
-    case XFA_ATTRIBUTEENUM_Center:
-      return 1;
-    case XFA_ATTRIBUTEENUM_Right:
-      return 2;
-    case XFA_ATTRIBUTEENUM_Left:
-    default:
-      return 0;
-  }
-}
-static void XFA_ItemLayoutProcessor_UpdatePendedItemLayout(
-    CXFA_ItemLayoutProcessor* pProcessor,
-    CXFA_ContentLayoutItem* pLayoutItem) {
-  XFA_ATTRIBUTEENUM eLayout =
-      pLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-  switch (eLayout) {
-    case XFA_ATTRIBUTEENUM_Row:
-    case XFA_ATTRIBUTEENUM_Rl_row:
-      XFA_ItemLayoutProcessor_RelocateTableRowCells(
-          pLayoutItem, pProcessor->m_rgSpecifiedColumnWidths, eLayout);
-      break;
-    default:
-      break;
-  }
-}
-FX_BOOL CXFA_ItemLayoutProcessor::IsAddNewRowForTrailer(
-    CXFA_ContentLayoutItem* pTrailerItem) {
-  if (!pTrailerItem) {
-    return FALSE;
-  }
-  FX_FLOAT fWidth = pTrailerItem->m_sSize.x;
-  XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-  if (eLayout != XFA_ATTRIBUTEENUM_Tb && m_fWidthLimite > fWidth) {
-    return FALSE;
-  }
-  return TRUE;
-}
-static void XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
-    CXFA_ItemLayoutProcessor* pProcessor,
-    FX_FLOAT fSplitPos,
-    CXFA_ContentLayoutItem* pTrailerLayoutItem,
-    FX_BOOL bUseInherited = FALSE) {
-  if (!pTrailerLayoutItem) {
-    return;
-  }
-  FX_FLOAT fHeight = pTrailerLayoutItem->m_sSize.y;
-  if (bUseInherited) {
-    FX_FLOAT fNewSplitPos = 0;
-    if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) {
-      fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight);
-    }
-    if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
-      pProcessor->SplitLayoutItem(fNewSplitPos);
-    }
-    return;
-  }
-  XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor,
-                                                 pTrailerLayoutItem);
-  CXFA_Node* pMarginNode =
-      pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
-    fTopInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
-    fRightInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
-    fBottomInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
-  }
-  if (!pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem)) {
-    pTrailerLayoutItem->m_sPos.y = pProcessor->m_fLastRowY;
-    pTrailerLayoutItem->m_sPos.x = pProcessor->m_fLastRowWidth;
-    pProcessor->m_pLayoutItem->m_sSize.x += pTrailerLayoutItem->m_sSize.x;
-    pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem);
-    return;
-  }
-  FX_FLOAT fNewSplitPos = 0;
-  if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) {
-    fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight);
-  }
-  if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
-    pProcessor->SplitLayoutItem(fNewSplitPos);
-    pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset;
-  } else {
-    pTrailerLayoutItem->m_sPos.y = fSplitPos - fTopInset - fBottomInset;
-  }
-  switch (pTrailerLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
-    case XFA_ATTRIBUTEENUM_Left:
-    default:
-      pTrailerLayoutItem->m_sPos.x = fLeftInset;
-      break;
-    case XFA_ATTRIBUTEENUM_Right:
-      pTrailerLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x -
-                                     fRightInset -
-                                     pTrailerLayoutItem->m_sSize.x;
-      break;
-    case XFA_ATTRIBUTEENUM_Center:
-      pTrailerLayoutItem->m_sPos.x =
-          (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset -
-           pTrailerLayoutItem->m_sSize.x) /
-          2;
-      break;
-  }
-  pProcessor->m_pLayoutItem->m_sSize.y += fHeight;
-  pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem);
-}
-static void XFA_ItemLayoutProcessor_AddLeaderAfterSplit(
-    CXFA_ItemLayoutProcessor* pProcessor,
-    CXFA_ContentLayoutItem* pLeaderLayoutItem) {
-  XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, pLeaderLayoutItem);
-  CXFA_Node* pMarginNode =
-      pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  FX_FLOAT fLeftInset = 0;
-  FX_FLOAT fRightInset = 0;
-  if (pMarginNode) {
-    fLeftInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
-    fRightInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
-  }
-  FX_FLOAT fHeight = pLeaderLayoutItem->m_sSize.y;
-  for (CXFA_ContentLayoutItem* pChildItem =
-           (CXFA_ContentLayoutItem*)pProcessor->m_pLayoutItem->m_pFirstChild;
-       pChildItem;
-       pChildItem = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) {
-    pChildItem->m_sPos.y += fHeight;
-  }
-  pLeaderLayoutItem->m_sPos.y = 0;
-  switch (pLeaderLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) {
-    case XFA_ATTRIBUTEENUM_Left:
-    default:
-      pLeaderLayoutItem->m_sPos.x = fLeftInset;
-      break;
-    case XFA_ATTRIBUTEENUM_Right:
-      pLeaderLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x -
-                                    fRightInset - pLeaderLayoutItem->m_sSize.x;
-      break;
-    case XFA_ATTRIBUTEENUM_Center:
-      pLeaderLayoutItem->m_sPos.x =
-          (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset -
-           pLeaderLayoutItem->m_sSize.x) /
-          2;
-      break;
-  }
-  pProcessor->m_pLayoutItem->m_sSize.y += fHeight;
-  pProcessor->m_pLayoutItem->AddChild(pLeaderLayoutItem);
-}
-static void XFA_ItemLayoutProcessor_AddPendingNode(
-    CXFA_ItemLayoutProcessor* pProcessor,
-    CXFA_Node* pPendingNode,
-    FX_BOOL bBreakPending) {
-  pProcessor->m_PendingNodes.push_back(pPendingNode);
-  pProcessor->m_bBreakPending = bBreakPending;
-}
-static FX_FLOAT XFA_ItemLayoutProcessor_InsertPendingItems(
-    CXFA_ItemLayoutProcessor* pProcessor,
-    CXFA_Node* pCurChildNode) {
-  FX_FLOAT fTotalHeight = 0;
-  if (pProcessor->m_PendingNodes.empty()) {
-    return fTotalHeight;
-  }
-  if (!pProcessor->m_pLayoutItem) {
-    pProcessor->m_pLayoutItem =
-        pProcessor->CreateContentLayoutItem(pCurChildNode);
-    pProcessor->m_pLayoutItem->m_sSize.clear();
-  }
-  while (!pProcessor->m_PendingNodes.empty()) {
-    std::unique_ptr<CXFA_ItemLayoutProcessor> pPendingProcessor(
-        new CXFA_ItemLayoutProcessor(pProcessor->m_PendingNodes.front(),
-                                     nullptr));
-    pProcessor->m_PendingNodes.pop_front();
-    pPendingProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
-    CXFA_ContentLayoutItem* pPendingLayoutItem =
-        pPendingProcessor->HasLayoutItem()
-            ? pPendingProcessor->ExtractLayoutItem()
-            : nullptr;
-    if (pPendingLayoutItem) {
-      XFA_ItemLayoutProcessor_AddLeaderAfterSplit(pProcessor,
-                                                  pPendingLayoutItem);
-      if (pProcessor->m_bBreakPending) {
-        fTotalHeight += pPendingLayoutItem->m_sSize.y;
-      }
-    }
-  }
-  return fTotalHeight;
-}
-FX_FLOAT CXFA_ItemLayoutProcessor::InsertKeepLayoutItems() {
-  FX_FLOAT fTotalHeight = 0;
-  if (m_arrayKeepItems.GetSize()) {
-    if (!m_pLayoutItem) {
-      m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-      m_pLayoutItem->m_sSize.clear();
-    }
-    for (int32_t iIndex = m_arrayKeepItems.GetSize() - 1; iIndex >= 0;
-         iIndex--) {
-      XFA_ItemLayoutProcessor_AddLeaderAfterSplit(this,
-                                                  m_arrayKeepItems[iIndex]);
-      fTotalHeight += m_arrayKeepItems[iIndex]->m_sSize.y;
-    }
-    m_arrayKeepItems.RemoveAll();
-  }
-  return fTotalHeight;
-}
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepForSplite(
-    CXFA_ItemLayoutProcessor* pParentProcessor,
-    CXFA_ItemLayoutProcessor* pChildProcessor,
-    XFA_ItemLayoutProcessorResult eRetValue,
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& rgCurLineLayoutItem,
-    FX_FLOAT& fContentCurRowAvailWidth,
-    FX_FLOAT& fContentCurRowHeight,
-    FX_FLOAT& fContentCurRowY,
-    FX_BOOL& bAddedItemInRow,
-    FX_BOOL& bForceEndPage,
-    XFA_ItemLayoutProcessorResult& result) {
-  if (pParentProcessor == NULL || pChildProcessor == NULL) {
-    return FALSE;
-  }
-  if (pParentProcessor->m_pCurChildNode->GetIntact() !=
-          XFA_ATTRIBUTEENUM_None ||
-      !pChildProcessor->m_bHasAvailHeight) {
-    if (XFA_ExistContainerKeep(pParentProcessor->m_pCurChildNode, TRUE)) {
-      FX_FLOAT fChildWidth, fChildHeight;
-      pChildProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
-      CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems;
-      if (pParentProcessor->JudgePutNextPage(pParentProcessor->m_pLayoutItem,
-                                             fChildHeight, keepLayoutItems)) {
-        m_arrayKeepItems.RemoveAll();
-        for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize(); iIndex++) {
-          CXFA_ContentLayoutItem* pItem = keepLayoutItems.GetAt(iIndex);
-          pParentProcessor->m_pLayoutItem->RemoveChild(pItem);
-          fContentCurRowY -= pItem->m_sSize.y;
-          m_arrayKeepItems.Add(pItem);
-        }
-        bAddedItemInRow = TRUE;
-        bForceEndPage = TRUE;
-        result = XFA_ItemLayoutProcessorResult_PageFullBreak;
-        return TRUE;
-      }
-      rgCurLineLayoutItem.Add(pChildProcessor->ExtractLayoutItem());
-      bAddedItemInRow = TRUE;
-      fContentCurRowAvailWidth -= fChildWidth;
-      if (fContentCurRowHeight < fChildHeight) {
-        fContentCurRowHeight = fChildHeight;
-      }
-      result = eRetValue;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_ItemLayoutProcessor::JudgePutNextPage(
-    CXFA_ContentLayoutItem* pParentLayoutItem,
-    FX_FLOAT fChildHeight,
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems) {
-  if (pParentLayoutItem == NULL) {
-    return FALSE;
-  }
-  FX_FLOAT fItemsHeight = 0;
-  for (CXFA_ContentLayoutItem* pChildLayoutItem =
-           (CXFA_ContentLayoutItem*)pParentLayoutItem->m_pFirstChild;
-       pChildLayoutItem;
-       pChildLayoutItem =
-           (CXFA_ContentLayoutItem*)pChildLayoutItem->m_pNextSibling) {
-    if (XFA_ExistContainerKeep(pChildLayoutItem->m_pFormNode, FALSE)) {
-      pKeepItems.Add(pChildLayoutItem);
-      fItemsHeight += pChildLayoutItem->m_sSize.y;
-    } else {
-      pKeepItems.RemoveAll();
-      fItemsHeight = 0;
-    }
-  }
-  fItemsHeight += fChildHeight;
-  if (m_pPageMgr->GetNextAvailContentHeight(fItemsHeight)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) {
-  if (!pFormNode) {
-    return;
-  }
-  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator(
-      pFormNode);
-  for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode;
-       pNode = sIterator.MoveToNext()) {
-    if (pNode->IsContainerNode()) {
-      CXFA_Node* pBindNode = pNode->GetBindData();
-      if (pBindNode) {
-        pBindNode->RemoveBindItem(pNode);
-        pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-      }
-    }
-    pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
-  }
-}
-void CXFA_ItemLayoutProcessor::ProcessUnUseOverFlow(
-    CXFA_Node* pLeaderNode,
-    CXFA_Node* pTrailerNode,
-    CXFA_ContentLayoutItem* pTrailerItem,
-    CXFA_Node* pFormNode) {
-  ProcessUnUseBinds(pLeaderNode);
-  ProcessUnUseBinds(pTrailerNode);
-  if (pFormNode == NULL) {
-    return;
-  }
-  if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
-      pFormNode->GetClassID() == XFA_ELEMENT_Break) {
-    pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-  if (pLeaderNode && pFormNode) {
-    pFormNode->RemoveChild(pLeaderNode);
-  }
-  if (pTrailerNode && pFormNode) {
-    pFormNode->RemoveChild(pTrailerNode);
-  }
-  if (pTrailerItem) {
-    XFA_ReleaseLayoutItem(pTrailerItem);
-  }
-}
-static XFA_ItemLayoutProcessorResult XFA_ItemLayoutProcessor_InsertFlowedItem(
-    CXFA_ItemLayoutProcessor* pThis,
-    CXFA_ItemLayoutProcessor*& pProcessor,
-    FX_BOOL bContainerWidthAutoSize,
-    FX_BOOL bContainerHeightAutoSize,
-    FX_FLOAT fContainerHeight,
-    XFA_ATTRIBUTEENUM eFlowStrategy,
-    uint8_t& uCurHAlignState,
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
-    FX_BOOL bUseBreakControl,
-    FX_FLOAT fAvailHeight,
-    FX_FLOAT fRealHeight,
-    FX_FLOAT& fContentCurRowY,
-    FX_FLOAT& fContentWidthLimit,
-    FX_FLOAT& fContentCurRowAvailWidth,
-    FX_FLOAT& fContentCurRowHeight,
-    FX_BOOL& bAddedItemInRow,
-    FX_BOOL& bForceEndPage,
-    CXFA_LayoutContext* pLayoutContext = NULL,
-    FX_BOOL bNewRow = FALSE) {
-  FX_BOOL bTakeSpace =
-      XFA_ItemLayoutProcessor_IsTakingSpace(pProcessor->m_pFormNode);
-  uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(
-      pThis->m_pCurChildNode->GetEnum(XFA_ATTRIBUTE_HAlign));
-  if (bContainerWidthAutoSize) {
-    uHAlign = 0;
-  }
-  if ((eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb && uHAlign < uCurHAlignState) ||
-      (eFlowStrategy == XFA_ATTRIBUTEENUM_Rl_tb && uHAlign > uCurHAlignState)) {
-    return XFA_ItemLayoutProcessorResult_RowFullBreak;
-  }
-  uCurHAlignState = uHAlign;
-  FX_BOOL bIsOwnSplite =
-      pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None;
-  FX_BOOL bUseRealHeight =
-      bTakeSpace && bContainerHeightAutoSize && bIsOwnSplite &&
-      pProcessor->m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetIntact() ==
-          XFA_ATTRIBUTEENUM_None;
-  FX_BOOL bIsTransHeight = bTakeSpace;
-  if (bIsTransHeight && !bIsOwnSplite) {
-    FX_BOOL bRootForceTb = FALSE;
-    XFA_ATTRIBUTEENUM eLayoutStrategy = XFA_ItemLayoutProcessor_GetLayout(
-        pProcessor->m_pFormNode, bRootForceTb);
-    if (eLayoutStrategy == XFA_ATTRIBUTEENUM_Lr_tb ||
-        eLayoutStrategy == XFA_ATTRIBUTEENUM_Rl_tb) {
-      bIsTransHeight = FALSE;
-    }
-  }
-  FX_BOOL bUseInherited = FALSE;
-  CXFA_LayoutContext layoutContext;
-  if (pThis->m_pPageMgr) {
-    CXFA_Node* pOverflowNode =
-        pThis->m_pPageMgr->QueryOverflow(pThis->m_pFormNode);
-    if (pOverflowNode) {
-      layoutContext.m_pOverflowNode = pOverflowNode;
-      layoutContext.m_pOverflowProcessor = pThis;
-      pLayoutContext = &layoutContext;
-    }
-  }
-  XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult_Done;
-  if (!bNewRow ||
-      pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult_Done) {
-    eRetValue = pProcessor->DoLayout(
-        bTakeSpace ? bUseBreakControl : FALSE,
-        bUseRealHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
-        bIsTransHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
-        pLayoutContext);
-    pProcessor->m_ePreProcessRs = eRetValue;
-  } else {
-    eRetValue = pProcessor->m_ePreProcessRs;
-    pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done;
-  }
-  if (pProcessor->HasLayoutItem() == FALSE) {
-    return eRetValue;
-  }
-  FX_FLOAT fChildWidth, fChildHeight;
-  pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
-  if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) {
-    fRealHeight = XFA_LAYOUT_FLOAT_MAX;
-    fAvailHeight = XFA_LAYOUT_FLOAT_MAX;
-  }
-  if (!bTakeSpace ||
-      (fChildWidth <= fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) ||
-      (fContentWidthLimit - fContentCurRowAvailWidth <=
-       XFA_LAYOUT_FLOAT_PERCISION)) {
-    CXFA_Node *pOverflowLeaderNode = NULL, *pOverflowTrailerNode = NULL,
-              *pFormNode = NULL;
-    CXFA_ContentLayoutItem* pTrailerLayoutItem = NULL;
-    FX_BOOL bIsAddTrailerHeight = FALSE;
-    if (pThis->m_pPageMgr &&
-        pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
-      pFormNode = pThis->m_pPageMgr->QueryOverflow(pProcessor->m_pFormNode);
-      if (pFormNode == NULL && pLayoutContext &&
-          pLayoutContext->m_pOverflowProcessor) {
-        pFormNode = pLayoutContext->m_pOverflowNode;
-        bUseInherited = TRUE;
-      }
-      if (pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
-                                             pOverflowTrailerNode, FALSE,
-                                             FALSE)) {
-        if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowTrailerNode)) {
-          if (pOverflowTrailerNode) {
-            CXFA_ItemLayoutProcessor* pOverflowLeaderProcessor =
-                new CXFA_ItemLayoutProcessor(pOverflowTrailerNode, NULL);
-            pOverflowLeaderProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX);
-            pTrailerLayoutItem =
-                pOverflowLeaderProcessor->HasLayoutItem()
-                    ? pOverflowLeaderProcessor->ExtractLayoutItem()
-                    : NULL;
-            delete pOverflowLeaderProcessor;
-          }
-          if (bUseInherited) {
-            bIsAddTrailerHeight =
-                pThis->IsAddNewRowForTrailer(pTrailerLayoutItem);
-          } else {
-            bIsAddTrailerHeight =
-                pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem);
-          }
-          if (bIsAddTrailerHeight) {
-            FX_FLOAT fTrailerHeight = pTrailerLayoutItem->m_sSize.y;
-            fChildHeight += fTrailerHeight;
-            bIsAddTrailerHeight = TRUE;
-          }
-        }
-      }
-    }
-    if (!bTakeSpace ||
-        fContentCurRowY + fChildHeight <=
-            fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION ||
-        (!bContainerHeightAutoSize &&
-         pThis->m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >=
-             fContainerHeight)) {
-      if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult_Done) {
-        if (pProcessor->m_bUseInheriated) {
-          if (pTrailerLayoutItem) {
-            XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
-                pProcessor, fChildHeight, pTrailerLayoutItem);
-          }
-          if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
-            XFA_ItemLayoutProcessor_AddPendingNode(pProcessor,
-                                                   pOverflowLeaderNode, FALSE);
-          }
-          pProcessor->m_bUseInheriated = FALSE;
-        } else {
-          if (bIsAddTrailerHeight) {
-            fChildHeight -= pTrailerLayoutItem->m_sSize.y;
-          }
-          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                           pOverflowTrailerNode,
-                                           pTrailerLayoutItem, pFormNode);
-        }
-        CXFA_ContentLayoutItem* pChildLayoutItem =
-            pProcessor->ExtractLayoutItem();
-        if (XFA_ExistContainerKeep(pProcessor->m_pFormNode, FALSE) &&
-            pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
-          pThis->m_arrayKeepItems.Add(pChildLayoutItem);
-        } else {
-          pThis->m_arrayKeepItems.RemoveAll();
-        }
-        rgCurLineLayoutItems[uHAlign].Add(pChildLayoutItem);
-        bAddedItemInRow = TRUE;
-        if (bTakeSpace) {
-          fContentCurRowAvailWidth -= fChildWidth;
-          if (fContentCurRowHeight < fChildHeight) {
-            fContentCurRowHeight = fChildHeight;
-          }
-        }
-        return XFA_ItemLayoutProcessorResult_Done;
-      } else {
-        if (eRetValue == XFA_ItemLayoutProcessorResult_PageFullBreak) {
-          if (pProcessor->m_bUseInheriated) {
-            if (pTrailerLayoutItem) {
-              XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
-                  pProcessor, fChildHeight, pTrailerLayoutItem);
-            }
-            if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
-              XFA_ItemLayoutProcessor_AddPendingNode(
-                  pProcessor, pOverflowLeaderNode, FALSE);
-            }
-            pProcessor->m_bUseInheriated = FALSE;
-          } else {
-            if (bIsAddTrailerHeight) {
-              fChildHeight -= pTrailerLayoutItem->m_sSize.y;
-            }
-            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                             pOverflowTrailerNode,
-                                             pTrailerLayoutItem, pFormNode);
-          }
-        }
-        rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
-        bAddedItemInRow = TRUE;
-        fContentCurRowAvailWidth -= fChildWidth;
-        if (fContentCurRowHeight < fChildHeight) {
-          fContentCurRowHeight = fChildHeight;
-        }
-        return eRetValue;
-      }
-    } else {
-      XFA_ItemLayoutProcessorResult eResult;
-      if (pThis->ProcessKeepForSplite(
-              pThis, pProcessor, eRetValue, rgCurLineLayoutItems[uHAlign],
-              fContentCurRowAvailWidth, fContentCurRowHeight, fContentCurRowY,
-              bAddedItemInRow, bForceEndPage, eResult)) {
-        return eResult;
-      }
-      bForceEndPage = TRUE;
-      FX_FLOAT fSplitPos =
-          pProcessor->FindSplitPos(fAvailHeight - fContentCurRowY);
-      if (fSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
-        XFA_ATTRIBUTEENUM eLayout =
-            pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-        if (eLayout == XFA_ATTRIBUTEENUM_Tb &&
-            eRetValue == XFA_ItemLayoutProcessorResult_Done) {
-          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                           pOverflowTrailerNode,
-                                           pTrailerLayoutItem, pFormNode);
-          rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
-          bAddedItemInRow = TRUE;
-          if (bTakeSpace) {
-            fContentCurRowAvailWidth -= fChildWidth;
-            if (fContentCurRowHeight < fChildHeight) {
-              fContentCurRowHeight = fChildHeight;
-            }
-          }
-          return XFA_ItemLayoutProcessorResult_PageFullBreak;
-        }
-        CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL;
-        if (pThis->m_pPageMgr && !pProcessor->m_bUseInheriated &&
-            eRetValue != XFA_ItemLayoutProcessorResult_PageFullBreak) {
-          pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode,
-                                             pTempTrailerNode, FALSE, TRUE);
-        }
-        if (pTrailerLayoutItem && bIsAddTrailerHeight) {
-          XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(
-              pProcessor, fSplitPos, pTrailerLayoutItem, bUseInherited);
-        } else {
-          pProcessor->SplitLayoutItem(fSplitPos);
-        }
-        if (bUseInherited) {
-          pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                           pOverflowTrailerNode,
-                                           pTrailerLayoutItem, pFormNode);
-          pThis->m_bUseInheriated = TRUE;
-        } else {
-          if (pProcessor->m_pLayoutItem->m_pFirstChild &&
-              pProcessor->m_pLayoutItem->m_pFirstChild->m_pNextSibling ==
-                  NULL &&
-              pProcessor->m_pLayoutItem->m_pFirstChild->m_pFormNode->HasFlag(
-                  XFA_NODEFLAG_LayoutGeneratedNode)) {
-            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                             pOverflowTrailerNode,
-                                             pTrailerLayoutItem, pFormNode);
-          } else {
-            if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
-              XFA_ItemLayoutProcessor_AddPendingNode(
-                  pProcessor, pOverflowLeaderNode, FALSE);
-            }
-          }
-        }
-        if (pProcessor->m_pLayoutItem->m_pNextSibling) {
-          pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
-          rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
-          bAddedItemInRow = TRUE;
-          if (bTakeSpace) {
-            fContentCurRowAvailWidth -= fChildWidth;
-            if (fContentCurRowHeight < fChildHeight) {
-              fContentCurRowHeight = fChildHeight;
-            }
-          }
-        }
-        return XFA_ItemLayoutProcessorResult_PageFullBreak;
-      } else if (fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) {
-        pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
-        if (pProcessor->m_pPageMgr->GetNextAvailContentHeight(fChildHeight)) {
-          CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL;
-          if (pThis->m_pPageMgr) {
-            if (pFormNode == NULL && pLayoutContext) {
-              pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode;
-            }
-            pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode,
-                                               pTempTrailerNode, FALSE, TRUE);
-          }
-          if (bUseInherited) {
-            pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                             pOverflowTrailerNode,
-                                             pTrailerLayoutItem, pFormNode);
-            pThis->m_bUseInheriated = TRUE;
-          }
-          return XFA_ItemLayoutProcessorResult_PageFullBreak;
-        }
-        rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
-        bAddedItemInRow = TRUE;
-        if (bTakeSpace) {
-          fContentCurRowAvailWidth -= fChildWidth;
-          if (fContentCurRowHeight < fChildHeight) {
-            fContentCurRowHeight = fChildHeight;
-          }
-        }
-        if (eRetValue == XFA_ItemLayoutProcessorResult_Done) {
-          bForceEndPage = FALSE;
-        }
-        return eRetValue;
-      } else {
-        XFA_ATTRIBUTEENUM eLayout =
-            pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
-        if (pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None &&
-            eLayout == XFA_ATTRIBUTEENUM_Tb) {
-          if (pThis->m_pPageMgr) {
-            pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
-                                               pOverflowTrailerNode, FALSE,
-                                               TRUE);
-          }
-          if (pTrailerLayoutItem) {
-            XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fSplitPos,
-                                                          pTrailerLayoutItem);
-          }
-          if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) {
-            XFA_ItemLayoutProcessor_AddPendingNode(pProcessor,
-                                                   pOverflowLeaderNode, FALSE);
-          }
-        } else {
-          if (eRetValue == XFA_ItemLayoutProcessorResult_Done) {
-            if (pFormNode == NULL && pLayoutContext) {
-              pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode;
-            }
-            if (pThis->m_pPageMgr) {
-              pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode,
-                                                 pOverflowTrailerNode, FALSE,
-                                                 TRUE);
-            }
-            if (bUseInherited) {
-              pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
-                                               pOverflowTrailerNode,
-                                               pTrailerLayoutItem, pFormNode);
-              pThis->m_bUseInheriated = TRUE;
-            }
-          }
-        }
-        return XFA_ItemLayoutProcessorResult_PageFullBreak;
-      }
-    }
-  } else {
-    return XFA_ItemLayoutProcessorResult_RowFullBreak;
-  }
-  return XFA_ItemLayoutProcessorResult_Done;
-}
-XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
-    FX_BOOL bUseBreakControl,
-    XFA_ATTRIBUTEENUM eFlowStrategy,
-    FX_FLOAT fHeightLimit,
-    FX_FLOAT fRealHeight,
-    CXFA_LayoutContext* pContext,
-    FX_BOOL bRootForceTb) {
-  m_bHasAvailHeight = TRUE;
-  FX_FLOAT fContainerWidth = 0, fContainerHeight = 0;
-  FX_BOOL bBreakDone = FALSE;
-  FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE;
-  FX_BOOL bForceEndPage = FALSE;
-  FX_BOOL bIsManualBreak = FALSE;
-  if (m_pCurChildPreprocessor) {
-    m_pCurChildPreprocessor->m_ePreProcessRs =
-        XFA_ItemLayoutProcessorResult_Done;
-  }
-  XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize(
-      m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize,
-      bContainerHeightAutoSize);
-  if (pContext && pContext->m_bCurColumnWidthAvaiable) {
-    bContainerWidthAutoSize = FALSE;
-    fContainerWidth = pContext->m_fCurColumnWidth;
-  }
-  if (!bContainerHeightAutoSize) {
-    fContainerHeight -= m_fUsedSize;
-  }
-  if (!bContainerHeightAutoSize) {
-    CXFA_Node* pParentNode = m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent);
-    FX_BOOL bFocrTb = FALSE;
-    if (pParentNode &&
-        XFA_ItemLayoutProcessor_GetLayout(pParentNode, bFocrTb) ==
-            XFA_ATTRIBUTEENUM_Row) {
-      CXFA_Node* pChildContainer = m_pFormNode->GetNodeItem(
-          XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
-      if (pChildContainer &&
-          pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling,
-                                       XFA_OBJECTTYPE_ContainerNode)) {
-        fContainerHeight = 0;
-        bContainerHeightAutoSize = TRUE;
-      }
-    }
-  }
-  CXFA_Node* pMarginNode =
-      m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin);
-  FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt);
-    fTopInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt);
-    fRightInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt);
-    fBottomInset =
-        pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
-  }
-  FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
-                              : fContainerWidth - fLeftInset - fRightInset;
-  FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0;
-  FX_FLOAT fAvailHeight = fHeightLimit - fTopInset - fBottomInset;
-  if (fAvailHeight < 0) {
-    m_bHasAvailHeight = FALSE;
-  }
-  fRealHeight = fRealHeight - fTopInset - fBottomInset;
-  FX_FLOAT fContentCurRowY = 0;
-  CXFA_ContentLayoutItem* pLayoutChild = NULL;
-  if (m_pLayoutItem) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done &&
-        eFlowStrategy != XFA_ATTRIBUTEENUM_Tb) {
-      pLayoutChild = (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
-      for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
-           pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
-        if (pLayoutNext->m_sPos.y != pLayoutChild->m_sPos.y) {
-          pLayoutChild = pLayoutNext;
-        }
-      }
-    }
-    for (CXFA_ContentLayoutItem* pLayoutTempChild =
-             (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
-         pLayoutTempChild != pLayoutChild;
-         pLayoutTempChild =
-             (CXFA_ContentLayoutItem*)pLayoutTempChild->m_pNextSibling) {
-      if (XFA_ItemLayoutProcessor_IsTakingSpace(
-              pLayoutTempChild->m_pFormNode)) {
-        FX_FLOAT fChildContentWidth =
-            pLayoutTempChild->m_sPos.x + pLayoutTempChild->m_sSize.x;
-        FX_FLOAT fChildContentHeight =
-            pLayoutTempChild->m_sPos.y + pLayoutTempChild->m_sSize.y;
-        if (fContentCalculatedWidth < fChildContentWidth) {
-          fContentCalculatedWidth = fChildContentWidth;
-        }
-        if (fContentCalculatedHeight < fChildContentHeight) {
-          fContentCalculatedHeight = fChildContentHeight;
-        }
-      }
-    }
-    if (pLayoutChild) {
-      fContentCurRowY = pLayoutChild->m_sPos.y;
-    } else {
-      fContentCurRowY = fContentCalculatedHeight;
-    }
-  }
-  fContentCurRowY += InsertKeepLayoutItems();
-  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_None) {
-    XFA_ItemLayoutProcessor_GotoNextContainerNode(
-        m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
-  }
-  fContentCurRowY +=
-      XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode);
-  if (m_pCurChildPreprocessor &&
-      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Container) {
-    if (XFA_ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), FALSE)) {
-      m_pKeepHeadNode = m_pCurChildNode;
-      m_bIsProcessKeep = TRUE;
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Keep;
-    }
-  }
-  while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done) {
-    FX_FLOAT fContentCurRowHeight = 0;
-    FX_FLOAT fContentCurRowAvailWidth = fContentWidthLimit;
-    m_fWidthLimite = fContentCurRowAvailWidth;
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgCurLineLayoutItems[3];
-    uint8_t uCurHAlignState =
-        (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb ? 0 : 2);
-    if (pLayoutChild) {
-      for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
-           pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
-        if (pLayoutNext->m_pNextSibling == NULL && m_pCurChildPreprocessor &&
-            m_pCurChildPreprocessor->m_pFormNode == pLayoutNext->m_pFormNode) {
-          pLayoutNext->m_pNext = m_pCurChildPreprocessor->m_pLayoutItem;
-          m_pCurChildPreprocessor->m_pLayoutItem = pLayoutNext;
-          break;
-        }
-        uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt(
-            pLayoutNext->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign));
-        rgCurLineLayoutItems[uHAlign].Add(pLayoutNext);
-        if (eFlowStrategy == XFA_ATTRIBUTEENUM_Lr_tb) {
-          if (uHAlign > uCurHAlignState) {
-            uCurHAlignState = uHAlign;
-          }
-        } else if (uHAlign < uCurHAlignState) {
-          uCurHAlignState = uHAlign;
-        }
-        if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutNext->m_pFormNode)) {
-          if (pLayoutNext->m_sSize.y > fContentCurRowHeight) {
-            fContentCurRowHeight = pLayoutNext->m_sSize.y;
-          }
-          fContentCurRowAvailWidth -= pLayoutNext->m_sSize.x;
-        }
-      }
-      if ((CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild ==
-          pLayoutChild) {
-        m_pLayoutItem->m_pFirstChild = NULL;
-      } else {
-        CXFA_ContentLayoutItem* pLayoutNext =
-            (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
-        for (; pLayoutNext;
-             pLayoutNext =
-                 (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) {
-          if ((CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling ==
-              pLayoutChild) {
-            pLayoutNext->m_pNextSibling = NULL;
-            break;
-          }
-        }
-      }
-      CXFA_ContentLayoutItem* pLayoutNextTemp =
-          (CXFA_ContentLayoutItem*)pLayoutChild;
-      while (pLayoutNextTemp) {
-        pLayoutNextTemp->m_pParent = NULL;
-        CXFA_ContentLayoutItem* pSaveLayoutNext =
-            (CXFA_ContentLayoutItem*)pLayoutNextTemp->m_pNextSibling;
-        pLayoutNextTemp->m_pNextSibling = NULL;
-        pLayoutNextTemp = pSaveLayoutNext;
-      }
-      pLayoutChild = NULL;
-    }
-    while (m_pCurChildNode) {
-      CXFA_ItemLayoutProcessor* pProcessor = NULL;
-      FX_BOOL bAddedItemInRow = FALSE;
-      fContentCurRowY +=
-          XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode);
-      switch (m_nCurChildNodeStage) {
-        case XFA_ItemLayoutProcessorStages_Keep:
-        case XFA_ItemLayoutProcessorStages_None:
-          break;
-        case XFA_ItemLayoutProcessorStages_BreakBefore: {
-          for (int32_t iIndex = 0; iIndex < m_arrayKeepItems.GetSize();
-               iIndex++) {
-            CXFA_ContentLayoutItem* pItem = m_arrayKeepItems.GetAt(iIndex);
-            m_pLayoutItem->RemoveChild(pItem);
-            fContentCalculatedHeight -= pItem->m_sSize.y;
-          }
-          CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL;
-          FX_BOOL bCreatePage = FALSE;
-          if (bUseBreakControl && m_pPageMgr &&
-              m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, TRUE,
-                                                    pLeaderNode, pTrailerNode,
-                                                    bCreatePage) &&
-              m_pFormNode->GetClassID() != XFA_ELEMENT_Form && bCreatePage) {
-            if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
-              XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE);
-            }
-            if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
-              if (m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() ==
-                      XFA_ELEMENT_Form &&
-                  m_pLayoutItem == NULL) {
-                XFA_ItemLayoutProcessor_AddPendingNode(this, pTrailerNode,
-                                                       TRUE);
-              } else {
-                CXFA_ItemLayoutProcessor* pProcessor =
-                    new CXFA_ItemLayoutProcessor(pTrailerNode, NULL);
-                XFA_ItemLayoutProcessor_InsertFlowedItem(
-                    this, pProcessor, bContainerWidthAutoSize,
-                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                    uCurHAlignState, rgCurLineLayoutItems, FALSE,
-                    XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                    fContentWidthLimit, fContentCurRowAvailWidth,
-                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext);
-                delete pProcessor;
-                pProcessor = NULL;
-              }
-            }
-            XFA_ItemLayoutProcessor_GotoNextContainerNode(
-                m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
-            bForceEndPage = TRUE;
-            bIsManualBreak = TRUE;
-            goto SuspendAndCreateNewRow;
-          }
-        } break;
-        case XFA_ItemLayoutProcessorStages_BreakAfter: {
-          CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL;
-          FX_BOOL bCreatePage = FALSE;
-          if (bUseBreakControl && m_pPageMgr &&
-              m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, FALSE,
-                                                    pLeaderNode, pTrailerNode,
-                                                    bCreatePage) &&
-              m_pFormNode->GetClassID() != XFA_ELEMENT_Form) {
-            if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
-              CXFA_ItemLayoutProcessor* pProcessor =
-                  new CXFA_ItemLayoutProcessor(pTrailerNode, NULL);
-              XFA_ItemLayoutProcessor_InsertFlowedItem(
-                  this, pProcessor, bContainerWidthAutoSize,
-                  bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                  uCurHAlignState, rgCurLineLayoutItems, FALSE,
-                  XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                  fContentWidthLimit, fContentCurRowAvailWidth,
-                  fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                  pContext);
-              delete pProcessor;
-              pProcessor = NULL;
-            }
-            if (!bCreatePage) {
-              if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
-                CalculateRowChildPosition(
-                    rgCurLineLayoutItems, eFlowStrategy,
-                    bContainerHeightAutoSize, bContainerWidthAutoSize,
-                    fContentCalculatedWidth, fContentCalculatedHeight,
-                    fContentCurRowY, fContentCurRowHeight, fContentWidthLimit);
-                rgCurLineLayoutItems->RemoveAll();
-                CXFA_ItemLayoutProcessor* pProcessor =
-                    new CXFA_ItemLayoutProcessor(pLeaderNode, NULL);
-                XFA_ItemLayoutProcessor_InsertFlowedItem(
-                    this, pProcessor, bContainerWidthAutoSize,
-                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                    uCurHAlignState, rgCurLineLayoutItems, FALSE,
-                    XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                    fContentWidthLimit, fContentCurRowAvailWidth,
-                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext);
-                delete pProcessor;
-                pProcessor = NULL;
-              }
-            } else {
-              if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
-                XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE);
-              }
-            }
-            XFA_ItemLayoutProcessor_GotoNextContainerNode(
-                m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
-            if (bCreatePage) {
-              bForceEndPage = TRUE;
-              bIsManualBreak = TRUE;
-              if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done) {
-                bBreakDone = TRUE;
-              }
-            }
-            goto SuspendAndCreateNewRow;
-          }
-        } break;
-        case XFA_ItemLayoutProcessorStages_BookendLeader: {
-          CXFA_Node* pLeaderNode = NULL;
-          if (m_pCurChildPreprocessor) {
-            pProcessor = m_pCurChildPreprocessor;
-            m_pCurChildPreprocessor = NULL;
-          } else if (m_pPageMgr &&
-                     m_pPageMgr->ProcessBookendLeaderOrTrailer(
-                         m_pCurChildNode, TRUE, pLeaderNode)) {
-            pProcessor = new CXFA_ItemLayoutProcessor(pLeaderNode, m_pPageMgr);
-          }
-          if (pProcessor) {
-            if (XFA_ItemLayoutProcessor_InsertFlowedItem(
-                    this, pProcessor, bContainerWidthAutoSize,
-                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
-                    fAvailHeight, fRealHeight, fContentCurRowY,
-                    fContentWidthLimit, fContentCurRowAvailWidth,
-                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
-              goto SuspendAndCreateNewRow;
-            } else {
-              delete pProcessor;
-              pProcessor = NULL;
-            }
-          }
-        } break;
-        case XFA_ItemLayoutProcessorStages_BookendTrailer: {
-          CXFA_Node* pTrailerNode = NULL;
-          if (m_pCurChildPreprocessor) {
-            pProcessor = m_pCurChildPreprocessor;
-            m_pCurChildPreprocessor = NULL;
-          } else if (m_pPageMgr &&
-                     m_pPageMgr->ProcessBookendLeaderOrTrailer(
-                         m_pCurChildNode, FALSE, pTrailerNode)) {
-            pProcessor = new CXFA_ItemLayoutProcessor(pTrailerNode, m_pPageMgr);
-          }
-          if (pProcessor) {
-            if (XFA_ItemLayoutProcessor_InsertFlowedItem(
-                    this, pProcessor, bContainerWidthAutoSize,
-                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
-                    fAvailHeight, fRealHeight, fContentCurRowY,
-                    fContentWidthLimit, fContentCurRowAvailWidth,
-                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
-              goto SuspendAndCreateNewRow;
-            } else {
-              delete pProcessor;
-              pProcessor = NULL;
-            }
-          }
-        } break;
-        case XFA_ItemLayoutProcessorStages_Container:
-          ASSERT(m_pCurChildNode->IsContainerNode());
-          if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) {
-            break;
-          }
-          if (fContentCurRowY >= fHeightLimit + XFA_LAYOUT_FLOAT_PERCISION &&
-              XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) {
-            bForceEndPage = TRUE;
-            goto SuspendAndCreateNewRow;
-          }
-          if (m_pCurChildNode->IsContainerNode()) {
-            FX_BOOL bNewRow = FALSE;
-            if (m_pCurChildPreprocessor) {
-              pProcessor = m_pCurChildPreprocessor;
-              m_pCurChildPreprocessor = NULL;
-              bNewRow = TRUE;
-            } else {
-              pProcessor =
-                  new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr);
-            }
-            XFA_ItemLayoutProcessor_InsertPendingItems(pProcessor,
-                                                       m_pCurChildNode);
-            XFA_ItemLayoutProcessorResult rs =
-                XFA_ItemLayoutProcessor_InsertFlowedItem(
-                    this, pProcessor, bContainerWidthAutoSize,
-                    bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                    uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
-                    fAvailHeight, fRealHeight, fContentCurRowY,
-                    fContentWidthLimit, fContentCurRowAvailWidth,
-                    fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext, bNewRow);
-            switch (rs) {
-              case XFA_ItemLayoutProcessorResult_ManualBreak:
-                bIsManualBreak = TRUE;
-              case XFA_ItemLayoutProcessorResult_PageFullBreak:
-                bForceEndPage = TRUE;
-              case XFA_ItemLayoutProcessorResult_RowFullBreak:
-                goto SuspendAndCreateNewRow;
-              case XFA_ItemLayoutProcessorResult_Done:
-              default:
-                fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems(
-                    pProcessor, m_pCurChildNode);
-                delete pProcessor;
-                pProcessor = NULL;
-            }
-          }
-          break;
-        case XFA_ItemLayoutProcessorStages_Done:
-          break;
-        default:
-          break;
-      }
-      XFA_ItemLayoutProcessor_GotoNextContainerNode(
-          m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE);
-      if (bAddedItemInRow && eFlowStrategy == XFA_ATTRIBUTEENUM_Tb) {
-        break;
-      } else {
-        continue;
-      }
-    SuspendAndCreateNewRow:
-      if (pProcessor) {
-        m_pCurChildPreprocessor = pProcessor;
-      }
-      break;
-    }
-    CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy,
-                              bContainerHeightAutoSize, bContainerWidthAutoSize,
-                              fContentCalculatedWidth, fContentCalculatedHeight,
-                              fContentCurRowY, fContentCurRowHeight,
-                              fContentWidthLimit, bRootForceTb);
-    m_fWidthLimite = fContentCurRowAvailWidth;
-    if (bForceEndPage) {
-      break;
-    }
-  }
-  FX_BOOL bRetValue =
-      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done &&
-      m_PendingNodes.empty();
-  if (bBreakDone) {
-    bRetValue = FALSE;
-  }
-  XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize(
-      m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth,
-      fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight,
-      fContainerHeight);
-  if (fContainerHeight >= XFA_LAYOUT_FLOAT_PERCISION || m_pLayoutItem ||
-      bRetValue) {
-    if (m_pLayoutItem == NULL) {
-      m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-    }
-    if (fContainerHeight < 0) {
-      fContainerHeight = 0;
-    }
-    SetCurrentComponentSize(fContainerWidth, fContainerHeight);
-    if (bForceEndPage) {
-      m_fUsedSize = 0;
-    } else {
-      m_fUsedSize += m_pLayoutItem->m_sSize.y;
-    }
-  }
-  return bRetValue
-             ? XFA_ItemLayoutProcessorResult_Done
-             : (bIsManualBreak ? XFA_ItemLayoutProcessorResult_ManualBreak
-                               : XFA_ItemLayoutProcessorResult_PageFullBreak);
-}
-FX_BOOL CXFA_ItemLayoutProcessor::CalculateRowChildPosition(
-    CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
-    XFA_ATTRIBUTEENUM eFlowStrategy,
-    FX_BOOL bContainerHeightAutoSize,
-    FX_BOOL bContainerWidthAutoSize,
-    FX_FLOAT& fContentCalculatedWidth,
-    FX_FLOAT& fContentCalculatedHeight,
-    FX_FLOAT& fContentCurRowY,
-    FX_FLOAT fContentCurRowHeight,
-    FX_FLOAT fContentWidthLimit,
-    FX_BOOL bRootForceTb) {
-  int32_t nGroupLengths[3] = {0, 0, 0};
-  FX_FLOAT fGroupWidths[3] = {0, 0, 0};
-  int32_t nTotalLength = 0;
-  for (int32_t i = 0; i < 3; i++) {
-    nGroupLengths[i] = rgCurLineLayoutItems[i].GetSize();
-    for (int32_t c = nGroupLengths[i], j = 0; j < c; j++) {
-      nTotalLength++;
-      if (XFA_ItemLayoutProcessor_IsTakingSpace(
-              rgCurLineLayoutItems[i][j]->m_pFormNode)) {
-        fGroupWidths[i] += rgCurLineLayoutItems[i][j]->m_sSize.x;
-      }
-    }
-  }
-  if (!nTotalLength) {
-    if (bContainerHeightAutoSize) {
-      FX_FLOAT fNewHeight = fContentCurRowY;
-      if (fContentCalculatedHeight > fNewHeight) {
-        fContentCalculatedHeight = fNewHeight;
-      }
-    }
-    return FALSE;
-  }
-  if (m_pLayoutItem == NULL) {
-    m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-  }
-  if (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb) {
-    FX_FLOAT fCurPos;
-    fCurPos = 0;
-    for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) {
-      if (bRootForceTb) {
-        FX_FLOAT fAbsoluteX, fAbsoluteY;
-        CalculatePositionedContainerPos(rgCurLineLayoutItems[0][j]->m_pFormNode,
-                                        rgCurLineLayoutItems[0][j]->m_sSize.x,
-                                        rgCurLineLayoutItems[0][j]->m_sSize.y,
-                                        fAbsoluteX, fAbsoluteY);
-        rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
-      } else {
-        rgCurLineLayoutItems[0][j]->m_sPos =
-            CFX_PointF(fCurPos, fContentCurRowY);
-        if (XFA_ItemLayoutProcessor_IsTakingSpace(
-                rgCurLineLayoutItems[0][j]->m_pFormNode)) {
-          fCurPos += rgCurLineLayoutItems[0][j]->m_sSize.x;
-        }
-      }
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-    fCurPos = (fContentWidthLimit + fGroupWidths[0] - fGroupWidths[1] -
-               fGroupWidths[2]) /
-              2;
-    for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) {
-      if (bRootForceTb) {
-        FX_FLOAT fAbsoluteX, fAbsoluteY;
-        CalculatePositionedContainerPos(rgCurLineLayoutItems[1][j]->m_pFormNode,
-                                        rgCurLineLayoutItems[1][j]->m_sSize.x,
-                                        rgCurLineLayoutItems[1][j]->m_sSize.y,
-                                        fAbsoluteX, fAbsoluteY);
-        rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
-      } else {
-        rgCurLineLayoutItems[1][j]->m_sPos =
-            CFX_PointF(fCurPos, fContentCurRowY);
-        if (XFA_ItemLayoutProcessor_IsTakingSpace(
-                rgCurLineLayoutItems[1][j]->m_pFormNode)) {
-          fCurPos += rgCurLineLayoutItems[1][j]->m_sSize.x;
-        }
-      }
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-    fCurPos = fContentWidthLimit - fGroupWidths[2];
-    for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) {
-      if (bRootForceTb) {
-        FX_FLOAT fAbsoluteX, fAbsoluteY;
-        CalculatePositionedContainerPos(rgCurLineLayoutItems[2][j]->m_pFormNode,
-                                        rgCurLineLayoutItems[2][j]->m_sSize.x,
-                                        rgCurLineLayoutItems[2][j]->m_sSize.y,
-                                        fAbsoluteX, fAbsoluteY);
-        rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
-      } else {
-        rgCurLineLayoutItems[2][j]->m_sPos =
-            CFX_PointF(fCurPos, fContentCurRowY);
-        if (XFA_ItemLayoutProcessor_IsTakingSpace(
-                rgCurLineLayoutItems[2][j]->m_pFormNode)) {
-          fCurPos += rgCurLineLayoutItems[2][j]->m_sSize.x;
-        }
-      }
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-  } else {
-    FX_FLOAT fCurPos;
-    fCurPos = fGroupWidths[0];
-    for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) {
-      if (XFA_ItemLayoutProcessor_IsTakingSpace(
-              rgCurLineLayoutItems[0][j]->m_pFormNode)) {
-        fCurPos -= rgCurLineLayoutItems[0][j]->m_sSize.x;
-      }
-      rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-    fCurPos = (fContentWidthLimit + fGroupWidths[0] + fGroupWidths[1] -
-               fGroupWidths[2]) /
-              2;
-    for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) {
-      if (XFA_ItemLayoutProcessor_IsTakingSpace(
-              rgCurLineLayoutItems[1][j]->m_pFormNode)) {
-        fCurPos -= rgCurLineLayoutItems[1][j]->m_sSize.x;
-      }
-      rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-    fCurPos = fContentWidthLimit;
-    for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) {
-      if (XFA_ItemLayoutProcessor_IsTakingSpace(
-              rgCurLineLayoutItems[2][j]->m_pFormNode)) {
-        fCurPos -= rgCurLineLayoutItems[2][j]->m_sSize.x;
-      }
-      rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY);
-      m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]);
-      m_fLastRowWidth = fCurPos;
-    }
-  }
-  m_fLastRowY = fContentCurRowY;
-  fContentCurRowY += fContentCurRowHeight;
-  if (bContainerWidthAutoSize) {
-    FX_FLOAT fChildSuppliedWidth = fGroupWidths[0];
-    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
-        fContentWidthLimit > fChildSuppliedWidth) {
-      fChildSuppliedWidth = fContentWidthLimit;
-    }
-    if (fContentCalculatedWidth < fChildSuppliedWidth) {
-      fContentCalculatedWidth = fChildSuppliedWidth;
-    }
-  }
-  if (bContainerHeightAutoSize) {
-    FX_FLOAT fChildSuppliedHeight = fContentCurRowY;
-    if (fContentCalculatedHeight < fChildSuppliedHeight) {
-      fContentCalculatedHeight = fChildSuppliedHeight;
-    }
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_ItemLayoutProcessor::GetSubformSetParent(
-    CXFA_Node* pSubformSet) {
-  if (pSubformSet && pSubformSet->GetClassID() == XFA_ELEMENT_SubformSet) {
-    CXFA_Node* pParent = pSubformSet->GetNodeItem(XFA_NODEITEM_Parent);
-    while (pParent) {
-      if (pParent->GetClassID() != XFA_ELEMENT_SubformSet) {
-        return pParent;
-      }
-      pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
-    }
-  }
-  return pSubformSet;
-}
-void CXFA_ItemLayoutProcessor::DoLayoutField() {
-  if (m_pLayoutItem)
-    return;
-
-  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
-  m_pLayoutItem = CreateContentLayoutItem(m_pFormNode);
-  if (!m_pLayoutItem) {
-    return;
-  }
-  CXFA_Document* pDocument = m_pFormNode->GetDocument();
-  IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
-  FX_FLOAT fHeight = -1;
-  FX_FLOAT fWidth = -1;
-  pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight);
-  int32_t nRotate =
-      FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
-  nRotate = XFA_MapRotation(nRotate);
-  if (nRotate == 90 || nRotate == 270) {
-    FX_FLOAT fTmp = fWidth;
-    fWidth = fHeight;
-    fHeight = fTmp;
-  }
-  SetCurrentComponentSize(fWidth, fHeight);
-}
-XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayout(
-    FX_BOOL bUseBreakControl,
-    FX_FLOAT fHeightLimit,
-    FX_FLOAT fRealHeight,
-    CXFA_LayoutContext* pContext) {
-  XFA_ELEMENT eClassID = m_pFormNode->GetClassID();
-  switch (eClassID) {
-    case XFA_ELEMENT_Subform:
-    case XFA_ELEMENT_Area:
-    case XFA_ELEMENT_ExclGroup:
-    case XFA_ELEMENT_SubformSet: {
-      FX_BOOL bRootForceTb = FALSE;
-      CXFA_Node* pLayoutNode = GetSubformSetParent(m_pFormNode);
-      XFA_ATTRIBUTEENUM eLayoutStrategy =
-          XFA_ItemLayoutProcessor_GetLayout(pLayoutNode, bRootForceTb);
-      switch (eLayoutStrategy) {
-        case XFA_ATTRIBUTEENUM_Tb:
-        case XFA_ATTRIBUTEENUM_Lr_tb:
-        case XFA_ATTRIBUTEENUM_Rl_tb:
-          return DoLayoutFlowedContainer(bUseBreakControl, eLayoutStrategy,
-                                         fHeightLimit, fRealHeight, pContext,
-                                         bRootForceTb);
-        case XFA_ATTRIBUTEENUM_Position:
-        case XFA_ATTRIBUTEENUM_Row:
-        case XFA_ATTRIBUTEENUM_Rl_row:
-        default:
-          DoLayoutPositionedContainer(pContext);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-          return XFA_ItemLayoutProcessorResult_Done;
-        case XFA_ATTRIBUTEENUM_Table:
-          DoLayoutTableContainer(pLayoutNode);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-          return XFA_ItemLayoutProcessorResult_Done;
-      }
-    }
-    case XFA_ELEMENT_Draw:
-    case XFA_ELEMENT_Field:
-      DoLayoutField();
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-      return XFA_ItemLayoutProcessorResult_Done;
-    case XFA_ELEMENT_ContentArea:
-      return XFA_ItemLayoutProcessorResult_Done;
-    default:
-      return XFA_ItemLayoutProcessorResult_Done;
-  }
-}
-void CXFA_ItemLayoutProcessor::GetCurrentComponentPos(FX_FLOAT& fAbsoluteX,
-                                                      FX_FLOAT& fAbsoluteY) {
-  ASSERT(m_pLayoutItem);
-  fAbsoluteX = m_pLayoutItem->m_sPos.x;
-  fAbsoluteY = m_pLayoutItem->m_sPos.y;
-}
-void CXFA_ItemLayoutProcessor::GetCurrentComponentSize(FX_FLOAT& fWidth,
-                                                       FX_FLOAT& fHeight) {
-  ASSERT(m_pLayoutItem);
-  fWidth = m_pLayoutItem->m_sSize.x;
-  fHeight = m_pLayoutItem->m_sSize.y;
-}
-void CXFA_ItemLayoutProcessor::SetCurrentComponentPos(FX_FLOAT fAbsoluteX,
-                                                      FX_FLOAT fAbsoluteY) {
-  m_pLayoutItem->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY);
-}
-void CXFA_ItemLayoutProcessor::SetCurrentComponentSize(FX_FLOAT fWidth,
-                                                       FX_FLOAT fHeight) {
-  m_pLayoutItem->m_sSize = CFX_SizeF(fWidth, fHeight);
-}
-FX_BOOL CXFA_ItemLayoutProcessor::JudgeLeaderOrTrailerForOccur(
-    CXFA_Node* pFormNode) {
-  if (pFormNode == NULL) {
-    return FALSE;
-  }
-  CXFA_Node* pTemplate = pFormNode->GetTemplateNode();
-  if (!pTemplate) {
-    pTemplate = pFormNode;
-  }
-  CXFA_Occur NodeOccur(pTemplate->GetFirstChildByClass(XFA_ELEMENT_Occur));
-  int32_t iMax = NodeOccur.GetMax();
-  if (iMax > -1) {
-    int32_t iCount =
-        (int32_t)(uintptr_t)m_PendingNodesCount.GetValueAt(pTemplate);
-    if (iCount >= iMax) {
-      return FALSE;
-    }
-    iCount++;
-    m_PendingNodesCount.SetAt(pTemplate, (void*)(uintptr_t)(iCount));
-    return TRUE;
-  }
-  return TRUE;
-}
diff --git a/xfa/src/fxfa/parser/xfa_layout_itemlayout.h b/xfa/src/fxfa/parser/xfa_layout_itemlayout.h
deleted file mode 100644
index 16a91d4..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_itemlayout.h
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
-
-#include <float.h>
-
-#include <list>
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-
-#define XFA_LAYOUT_INVALIDNODE ((CXFA_Node*)(intptr_t)-1)
-#define XFA_LAYOUT_FLOAT_PERCISION (0.0005f)
-#define XFA_LAYOUT_FLOAT_MAX FLT_MAX
-
-class CXFA_ContainerLayoutItem;
-class CXFA_ContentLayoutItem;
-class CXFA_ItemLayoutProcessor;
-class CXFA_LayoutPageMgr;
-class CXFA_Node;
-
-enum XFA_ItemLayoutProcessorResult {
-  XFA_ItemLayoutProcessorResult_Done,
-  XFA_ItemLayoutProcessorResult_PageFullBreak,
-  XFA_ItemLayoutProcessorResult_RowFullBreak,
-  XFA_ItemLayoutProcessorResult_ManualBreak,
-};
-
-enum XFA_ItemLayoutProcessorStages {
-  XFA_ItemLayoutProcessorStages_None,
-  XFA_ItemLayoutProcessorStages_BookendLeader,
-  XFA_ItemLayoutProcessorStages_BreakBefore,
-  XFA_ItemLayoutProcessorStages_Keep,
-  XFA_ItemLayoutProcessorStages_Container,
-  XFA_ItemLayoutProcessorStages_BreakAfter,
-  XFA_ItemLayoutProcessorStages_BookendTrailer,
-  XFA_ItemLayoutProcessorStages_Done,
-};
-
-class CXFA_LayoutContext {
- public:
-  CXFA_LayoutContext()
-      : m_prgSpecifiedColumnWidths(NULL),
-        m_fCurColumnWidth(0),
-        m_bCurColumnWidthAvaiable(FALSE),
-        m_pOverflowProcessor(NULL),
-        m_pOverflowNode(NULL) {}
-  ~CXFA_LayoutContext() { m_pOverflowProcessor = NULL; }
-  CFX_ArrayTemplate<FX_FLOAT>* m_prgSpecifiedColumnWidths;
-  FX_FLOAT m_fCurColumnWidth;
-  FX_BOOL m_bCurColumnWidthAvaiable;
-  CXFA_ItemLayoutProcessor* m_pOverflowProcessor;
-  CXFA_Node* m_pOverflowNode;
-};
-
-class CXFA_ItemLayoutProcessor {
- public:
-  CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
-
-  XFA_ItemLayoutProcessorResult DoLayout(
-      FX_BOOL bUseBreakControl,
-      FX_FLOAT fHeightLimit,
-      FX_FLOAT fRealHeight = XFA_LAYOUT_FLOAT_MAX,
-      CXFA_LayoutContext* pContext = NULL);
-
-  void GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY);
-
-  void GetCurrentComponentSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
-
-  void SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY);
-
-  void SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
-  inline CXFA_Node* GetFormNode() { return m_pFormNode; }
-  inline FX_BOOL HasLayoutItem() { return m_pLayoutItem != NULL; }
-  CXFA_ContentLayoutItem* ExtractLayoutItem();
-
-  static FX_BOOL IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor,
-                                       CXFA_Node* pNode,
-                                       CXFA_Node* pParentNode);
-  static void CalculatePositionedContainerPos(CXFA_Node* pNode,
-                                              FX_FLOAT fWidth,
-                                              FX_FLOAT fHeight,
-                                              FX_FLOAT& fAbsoluteX,
-                                              FX_FLOAT& fAbsoluteY);
-  static FX_BOOL FindLayoutItemSplitPos(CXFA_ContentLayoutItem* pLayoutItem,
-                                        FX_FLOAT fCurVerticalOffset,
-                                        FX_FLOAT& fProposedSplitPos,
-                                        FX_BOOL& bAppChange,
-                                        FX_BOOL bCalculateMargin = TRUE);
-  FX_FLOAT FindSplitPos(FX_FLOAT fProposedSplitPos);
-  void SplitLayoutItem(CXFA_ContentLayoutItem* pLayoutItem,
-                       CXFA_ContentLayoutItem* pSecondParent,
-                       FX_FLOAT fSplitPos);
-  void SplitLayoutItem(FX_FLOAT fSplitPos);
-  FX_BOOL JudgePutNextPage(
-      CXFA_ContentLayoutItem* pParentLayoutItem,
-      FX_FLOAT fChildHeight,
-      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems);
-  FX_BOOL ProcessKeepForSplite(
-      CXFA_ItemLayoutProcessor* pParentProcessor,
-      CXFA_ItemLayoutProcessor* pChildProcessor,
-      XFA_ItemLayoutProcessorResult eRetValue,
-      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& rgCurLineLayoutItem,
-      FX_FLOAT& fContentCurRowAvailWidth,
-      FX_FLOAT& fContentCurRowHeight,
-      FX_FLOAT& fContentCurRowY,
-      FX_BOOL& bAddedItemInRow,
-      FX_BOOL& bForceEndPage,
-      XFA_ItemLayoutProcessorResult& result);
-  FX_FLOAT InsertKeepLayoutItems();
-  void DoLayoutPageArea(CXFA_ContainerLayoutItem* pPageAreaLayoutItem);
-  FX_BOOL CalculateRowChildPosition(
-      CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3],
-      XFA_ATTRIBUTEENUM eFlowStrategy,
-      FX_BOOL bContainerHeightAutoSize,
-      FX_BOOL bContainerWidthAutoSize,
-      FX_FLOAT& fContentCalculatedWidth,
-      FX_FLOAT& fContentCalculatedHeight,
-      FX_FLOAT& fContentCurRowY,
-      FX_FLOAT fContentCurRowHeight,
-      FX_FLOAT fContentWidthLimit,
-      FX_BOOL bRootForceTb = FALSE);
-
-  void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode,
-                            CXFA_Node* pTrailerNode,
-                            CXFA_ContentLayoutItem* pTrailerItem,
-                            CXFA_Node* pFormNode);
-  void ProcessUnUseBinds(CXFA_Node* pFormNode);
-  FX_BOOL IsAddNewRowForTrailer(CXFA_ContentLayoutItem* pTrailerItem);
-  FX_BOOL JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode);
-  CXFA_ContentLayoutItem* CreateContentLayoutItem(CXFA_Node* pFormNode);
-
- protected:
-  void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext = NULL);
-  void DoLayoutTableContainer(CXFA_Node* pLayoutNode);
-  XFA_ItemLayoutProcessorResult DoLayoutFlowedContainer(
-      FX_BOOL bUseBreakControl,
-      XFA_ATTRIBUTEENUM eFlowStrategy,
-      FX_FLOAT fHeightLimit,
-      FX_FLOAT fRealHeight,
-      CXFA_LayoutContext* pContext = NULL,
-      FX_BOOL bRootForceTb = FALSE);
-  void DoLayoutField();
-  void XFA_ItemLayoutProcessor_GotoNextContainerNode(
-      CXFA_Node*& pCurActionNode,
-      XFA_ItemLayoutProcessorStages& nCurStage,
-      CXFA_Node* pParentContainer,
-      FX_BOOL bUsePageBreak);
-
-  FX_BOOL ProcessKeepNodesForCheckNext(CXFA_Node*& pCurActionNode,
-                                       XFA_ItemLayoutProcessorStages& nCurStage,
-                                       CXFA_Node*& pNextContainer,
-                                       FX_BOOL& bLastKeepNode);
-
-  FX_BOOL ProcessKeepNodesForBreakBefore(
-      CXFA_Node*& pCurActionNode,
-      XFA_ItemLayoutProcessorStages& nCurStage,
-      CXFA_Node* pContainerNode);
-
-  CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet);
-
- public:
-  FX_BOOL m_bKeepBreakFinish;
-  FX_BOOL m_bIsProcessKeep;
-  CXFA_Node* m_pKeepHeadNode;
-  CXFA_Node* m_pKeepTailNode;
-  CXFA_Node* m_pFormNode;
-  CXFA_ContentLayoutItem* m_pLayoutItem;
-  CXFA_ContentLayoutItem* m_pOldLayoutItem;
-  CXFA_Node* m_pCurChildNode;
-  CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor;
-  XFA_ItemLayoutProcessorStages m_nCurChildNodeStage;
-  FX_FLOAT m_fUsedSize;
-  CXFA_LayoutPageMgr* m_pPageMgr;
-  std::list<CXFA_Node*> m_PendingNodes;
-  FX_BOOL m_bBreakPending;
-  CFX_ArrayTemplate<FX_FLOAT> m_rgSpecifiedColumnWidths;
-  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> m_arrayKeepItems;
-  CFX_MapPtrToPtr m_PendingNodesCount;
-  FX_FLOAT m_fLastRowWidth;
-  FX_FLOAT m_fLastRowY;
-  FX_FLOAT m_fWidthLimite;
-  FX_BOOL m_bUseInheriated;
-  XFA_ItemLayoutProcessorResult m_ePreProcessRs;
-  FX_BOOL m_bHasAvailHeight;
-};
-FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LAYOUT_ITEMLAYOUT_H_
diff --git a/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.cpp b/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.cpp
deleted file mode 100644
index 0ca5af5..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.cpp
+++ /dev/null
@@ -1,1931 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_datamerger_imp.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h"
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor)
-    : m_pLayoutProcessor(pLayoutProcessor),
-      m_pTemplatePageSetRoot(nullptr),
-      m_pPageSetLayoutItemRoot(nullptr),
-      m_pPageSetCurRoot(nullptr),
-      m_pCurrentContainerRecord(nullptr),
-      m_pCurPageArea(nullptr),
-      m_nAvailPages(0),
-      m_nCurPageCount(0),
-      m_ePageSetMode(XFA_ATTRIBUTEENUM_OrderedOccurrence),
-      m_bCreateOverFlowPage(FALSE) {}
-CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() {
-  ClearData();
-  CXFA_LayoutItem* pLayoutItem = GetRootLayoutItem();
-  CXFA_LayoutItem* pNextLayout = NULL;
-  for (; pLayoutItem; pLayoutItem = pNextLayout) {
-    pNextLayout = pLayoutItem->m_pNextSibling;
-    XFA_ReleaseLayoutItem(pLayoutItem);
-  }
-}
-FX_BOOL CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) {
-  PrepareLayout();
-  CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
-  if (!pTemplateNode) {
-    return FALSE;
-  }
-  m_pTemplatePageSetRoot = pTemplateNode->GetProperty(0, XFA_ELEMENT_PageSet);
-  ASSERT(m_pTemplatePageSetRoot);
-  if (m_pPageSetLayoutItemRoot) {
-    m_pPageSetLayoutItemRoot->m_pParent = NULL;
-    m_pPageSetLayoutItemRoot->m_pFirstChild = NULL;
-    m_pPageSetLayoutItemRoot->m_pNextSibling = NULL;
-    m_pPageSetLayoutItemRoot->m_pFormNode = m_pTemplatePageSetRoot;
-  } else {
-    m_pPageSetLayoutItemRoot =
-        new CXFA_ContainerLayoutItem(m_pTemplatePageSetRoot);
-  }
-  m_pPageSetCurRoot = m_pPageSetLayoutItemRoot;
-  m_pTemplatePageSetRoot->SetUserData(XFA_LAYOUTITEMKEY,
-                                      (void*)m_pPageSetLayoutItemRoot);
-  XFA_ATTRIBUTEENUM eRelation =
-      m_pTemplatePageSetRoot->GetEnum(XFA_ATTRIBUTE_Relation);
-  if (eRelation != XFA_ATTRIBUTEENUM_Unknown) {
-    m_ePageSetMode = eRelation;
-  }
-  InitPageSetMap();
-  CXFA_Node* pPageArea = NULL;
-  int32_t iCount = 0;
-  for (pPageArea = m_pTemplatePageSetRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pPageArea;
-       pPageArea = pPageArea->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pPageArea->GetClassID() == XFA_ELEMENT_PageArea) {
-      iCount++;
-      if (pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea)) {
-        return TRUE;
-      }
-    }
-  }
-  if (iCount > 0) {
-    return FALSE;
-  }
-  CXFA_Document* pDocument = pTemplateNode->GetDocument();
-  IXFA_ObjFactory* pObjFactory = pDocument->GetParser()->GetFactory();
-  pPageArea = m_pTemplatePageSetRoot->GetChild(0, XFA_ELEMENT_PageArea);
-  if (!pPageArea) {
-    pPageArea = pObjFactory->CreateNode(m_pTemplatePageSetRoot->GetPacketID(),
-                                        XFA_ELEMENT_PageArea);
-    if (!pPageArea) {
-      return FALSE;
-    }
-    m_pTemplatePageSetRoot->InsertChild(pPageArea, NULL);
-    pPageArea->SetFlag(XFA_NODEFLAG_Initialized);
-  }
-  CXFA_Node* pContentArea = pPageArea->GetChild(0, XFA_ELEMENT_ContentArea);
-  if (!pContentArea) {
-    pContentArea = pObjFactory->CreateNode(pPageArea->GetPacketID(),
-                                           XFA_ELEMENT_ContentArea);
-    if (!pContentArea) {
-      return FALSE;
-    }
-    pPageArea->InsertChild(pContentArea, NULL);
-    pContentArea->SetFlag(XFA_NODEFLAG_Initialized);
-    pContentArea->SetMeasure(XFA_ATTRIBUTE_X,
-                             CXFA_Measurement(0.25f, XFA_UNIT_In));
-    pContentArea->SetMeasure(XFA_ATTRIBUTE_Y,
-                             CXFA_Measurement(0.25f, XFA_UNIT_In));
-    pContentArea->SetMeasure(XFA_ATTRIBUTE_W,
-                             CXFA_Measurement(8.0f, XFA_UNIT_In));
-    pContentArea->SetMeasure(XFA_ATTRIBUTE_H,
-                             CXFA_Measurement(10.5f, XFA_UNIT_In));
-  }
-  CXFA_Node* pMedium = pPageArea->GetChild(0, XFA_ELEMENT_Medium);
-  if (!pMedium) {
-    pMedium =
-        pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_Medium);
-    if (!pContentArea) {
-      return FALSE;
-    }
-    pPageArea->InsertChild(pMedium, NULL);
-    pMedium->SetFlag(XFA_NODEFLAG_Initialized);
-    pMedium->SetMeasure(XFA_ATTRIBUTE_Short,
-                        CXFA_Measurement(8.5f, XFA_UNIT_In));
-    pMedium->SetMeasure(XFA_ATTRIBUTE_Long,
-                        CXFA_Measurement(11.0f, XFA_UNIT_In));
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) {
-  FX_BOOL bProBreakBefore = FALSE;
-  CXFA_Node* pBreakBeforeNode = NULL;
-  while (pRootSubform) {
-    for (CXFA_Node* pBreakNode =
-             pRootSubform->GetNodeItem(XFA_NODEITEM_FirstChild);
-         pBreakNode;
-         pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      XFA_ELEMENT eType = pBreakNode->GetClassID();
-      if (eType == XFA_ELEMENT_BreakBefore ||
-          (eType == XFA_ELEMENT_Break &&
-           pBreakNode->GetEnum(XFA_ATTRIBUTE_Before) !=
-               XFA_ATTRIBUTEENUM_Auto)) {
-        bProBreakBefore = TRUE;
-        pBreakBeforeNode = pBreakNode;
-        break;
-      }
-    }
-    if (bProBreakBefore) {
-      break;
-    }
-    bProBreakBefore = TRUE;
-    pRootSubform = pRootSubform->GetFirstChildByClass(XFA_ELEMENT_Subform);
-    while (pRootSubform &&
-           !XFA_ItemLayoutProcessor_IsTakingSpace(pRootSubform)) {
-      pRootSubform = pRootSubform->GetNextSameClassSibling(XFA_ELEMENT_Subform);
-    }
-  }
-  CXFA_Node *pLeader, *pTrailer;
-  if (pBreakBeforeNode &&
-      ExecuteBreakBeforeOrAfter(pBreakBeforeNode, TRUE, pLeader, pTrailer)) {
-    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
-    return TRUE;
-  }
-  return AppendNewPage(TRUE);
-}
-FX_BOOL CXFA_LayoutPageMgr::AppendNewPage(FX_BOOL bFirstTemPage) {
-  if (m_pCurrentContainerRecord !=
-      m_rgProposedContainerRecord.GetTailPosition()) {
-    return TRUE;
-  }
-  CXFA_Node* pPageNode = GetNextAvailPageArea(NULL);
-  if (!pPageNode) {
-    return FALSE;
-  }
-  if (bFirstTemPage && m_pCurrentContainerRecord == NULL) {
-    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
-  }
-  return !bFirstTemPage || m_pCurrentContainerRecord;
-}
-static void XFA_LayoutItemMgr_ReorderLayoutItemToTail(
-    CXFA_ContainerLayoutItem* pLayoutItem) {
-  CXFA_ContainerLayoutItem* pParentLayoutItem =
-      (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
-  if (!pParentLayoutItem) {
-    return;
-  }
-  pParentLayoutItem->RemoveChild(pLayoutItem);
-  pParentLayoutItem->AddChild(pLayoutItem);
-}
-static void XFA_LayoutItemMgr_RemoveLayoutItem(
-    CXFA_ContainerLayoutItem* pLayoutItem) {
-  CXFA_ContainerLayoutItem* pParentLayoutItem =
-      (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
-  if (!pParentLayoutItem) {
-    return;
-  }
-  pParentLayoutItem->RemoveChild(pLayoutItem);
-}
-void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
-                                            CXFA_ContainerRecord* pPrevRecord) {
-  if (!pNewRecord || !pPrevRecord) {
-    return;
-  }
-  if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
-    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageSet);
-    return;
-  }
-  if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
-    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageArea);
-    return;
-  }
-  if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
-    XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurContentArea);
-    return;
-  }
-}
-void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(
-    CXFA_ContainerRecord* pNewRecord,
-    CXFA_ContainerRecord* pPrevRecord) {
-  if (!pNewRecord || !pPrevRecord) {
-    return;
-  }
-  if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
-    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageSet);
-    return;
-  }
-  if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
-    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageArea);
-    return;
-  }
-  if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
-    XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurContentArea);
-    return;
-  }
-}
-void CXFA_LayoutPageMgr::SubmitContentItem(
-    CXFA_ContentLayoutItem* pContentLayoutItem,
-    XFA_ItemLayoutProcessorResult eStatus) {
-  if (pContentLayoutItem) {
-    GetCurrentContainerRecord()->pCurContentArea->AddChild(pContentLayoutItem);
-    m_bCreateOverFlowPage = FALSE;
-  }
-  if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
-    if (eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak &&
-        m_pCurrentContainerRecord ==
-            m_rgProposedContainerRecord.GetTailPosition()) {
-      AppendNewPage();
-    }
-    m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetTailPosition();
-    m_pCurPageArea = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
-  }
-}
-FX_FLOAT CXFA_LayoutPageMgr::GetAvailHeight() {
-  CXFA_ContainerLayoutItem* pLayoutItem =
-      GetCurrentContainerRecord()->pCurContentArea;
-  if (!pLayoutItem || !pLayoutItem->m_pFormNode)
-    return 0.0f;
-  FX_FLOAT fAvailHeight =
-      pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
-  if (fAvailHeight >= XFA_LAYOUT_FLOAT_PERCISION)
-    return fAvailHeight;
-  if (m_pCurrentContainerRecord ==
-      m_rgProposedContainerRecord.GetHeadPosition()) {
-    return 0.0f;
-  }
-  return XFA_LAYOUT_FLOAT_MAX;
-}
-static CXFA_Node* XFA_ResolveBreakTarget(CXFA_Node* pPageSetRoot,
-                                         FX_BOOL bNewExprStyle,
-                                         CFX_WideStringC& wsTargetExpr) {
-  CXFA_Document* pDocument = pPageSetRoot->GetDocument();
-  if (wsTargetExpr.IsEmpty()) {
-    return NULL;
-  }
-  CFX_WideString wsTargetAll = wsTargetExpr;
-  wsTargetAll.TrimLeft();
-  wsTargetAll.TrimRight();
-  int32_t iSpliteIndex = 0;
-  FX_BOOL bTargetAllFind = TRUE;
-  while (iSpliteIndex != -1) {
-    CFX_WideString wsTargetExpr;
-    int32_t iSpliteNextIndex = 0;
-    if (!bTargetAllFind) {
-      iSpliteNextIndex = wsTargetAll.Find(' ', iSpliteIndex);
-      wsTargetExpr =
-          wsTargetAll.Mid(iSpliteIndex, iSpliteNextIndex - iSpliteIndex);
-    } else {
-      wsTargetExpr = wsTargetAll;
-    }
-    if (wsTargetExpr.IsEmpty()) {
-      return NULL;
-    }
-    bTargetAllFind = FALSE;
-    if (wsTargetExpr.GetAt(0) == '#') {
-      CXFA_Node* pNode = pDocument->GetNodeByID(
-          ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Template)),
-          wsTargetExpr.Mid(1));
-      if (pNode) {
-        return pNode;
-      }
-    } else if (bNewExprStyle) {
-      CFX_WideString wsProcessedTarget = wsTargetExpr;
-      if (wsTargetExpr.Left(4) == FX_WSTRC(L"som(") &&
-          wsTargetExpr.Right(1) == FX_WSTRC(L")")) {
-        wsProcessedTarget = wsTargetExpr.Mid(4, wsTargetExpr.GetLength() - 5);
-      }
-      XFA_RESOLVENODE_RS rs;
-      int32_t iCount = pDocument->GetScriptContext()->ResolveObjects(
-          pPageSetRoot, wsProcessedTarget, rs,
-          XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-              XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings |
-              XFA_RESOLVENODE_Parent);
-      if (iCount > 0 && rs.nodes[0]->IsNode()) {
-        return rs.nodes[0]->AsNode();
-      }
-    }
-    iSpliteIndex = iSpliteNextIndex;
-  }
-  return NULL;
-}
-
-FX_BOOL XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) {
-  CFX_WideString wsExpression;
-  pTestScript->TryContent(wsExpression);
-  if (wsExpression.IsEmpty()) {
-    return TRUE;
-  }
-  return pTestScript->GetDocument()->GetParser()->GetNotify()->RunScript(
-      pTestScript, pTestScript->GetNodeItem(XFA_NODEITEM_Parent,
-                                            XFA_OBJECTTYPE_ContainerNode));
-}
-CXFA_ContainerRecord* CXFA_LayoutPageMgr::CreateContainerRecord(
-    CXFA_Node* pPageNode,
-    FX_BOOL bCreateNew) {
-  CXFA_ContainerRecord* pNewRecord = new CXFA_ContainerRecord();
-  if (m_pCurrentContainerRecord) {
-    if (!IsPageSetRootOrderedOccurrence() || pPageNode == NULL) {
-      *pNewRecord = *GetCurrentContainerRecord();
-      m_rgProposedContainerRecord.AddTail(pNewRecord);
-      return pNewRecord;
-    }
-    CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
-    if (!bCreateNew) {
-      if (pPageSet == m_pTemplatePageSetRoot) {
-        pNewRecord->pCurPageSet = m_pPageSetCurRoot;
-      } else {
-        CXFA_ContainerLayoutItem* pParentLayoutItem =
-            (CXFA_ContainerLayoutItem*)pPageSet->GetUserData(XFA_LAYOUTITEMKEY);
-        if (pParentLayoutItem == NULL) {
-          pParentLayoutItem = m_pPageSetCurRoot;
-        }
-        pNewRecord->pCurPageSet = pParentLayoutItem;
-      }
-    } else {
-      CXFA_ContainerLayoutItem* pParentPageSetLayout = NULL;
-      if (pPageSet == GetCurrentContainerRecord()->pCurPageSet->m_pFormNode) {
-        pParentPageSetLayout =
-            (CXFA_ContainerLayoutItem*)GetCurrentContainerRecord()
-                ->pCurPageSet->m_pParent;
-      } else {
-        pParentPageSetLayout =
-            (CXFA_ContainerLayoutItem*)pPageSet->GetNodeItem(
-                                                   XFA_NODEITEM_Parent)
-                ->GetUserData(XFA_LAYOUTITEMKEY);
-      }
-      CXFA_ContainerLayoutItem* pPageSetLayoutItem =
-          new CXFA_ContainerLayoutItem(pPageSet);
-      pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
-      if (pParentPageSetLayout == NULL) {
-        CXFA_ContainerLayoutItem* pPrePageSet = m_pPageSetLayoutItemRoot;
-        while (pPrePageSet->m_pNextSibling) {
-          pPrePageSet = (CXFA_ContainerLayoutItem*)pPrePageSet->m_pNextSibling;
-        }
-        pPrePageSet->m_pNextSibling = pPageSetLayoutItem;
-        m_pPageSetCurRoot = pPageSetLayoutItem;
-      } else {
-        pParentPageSetLayout->AddChild(pPageSetLayoutItem);
-      }
-      pNewRecord->pCurPageSet = pPageSetLayoutItem;
-    }
-  } else {
-    if (pPageNode) {
-      CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
-      if (pPageSet == m_pTemplatePageSetRoot) {
-        pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
-      } else {
-        CXFA_ContainerLayoutItem* pPageSetLayoutItem =
-            new CXFA_ContainerLayoutItem(pPageSet);
-        pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
-        m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
-        pNewRecord->pCurPageSet = pPageSetLayoutItem;
-      }
-    } else {
-      pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
-    }
-  }
-  m_rgProposedContainerRecord.AddTail(pNewRecord);
-  return pNewRecord;
-}
-void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
-                                               CXFA_Node* pNewPageArea) {
-  CXFA_ContainerLayoutItem* pNewPageAreaLayoutItem = NULL;
-  if (m_PageArray.GetSize() > m_nAvailPages) {
-    CXFA_ContainerLayoutItem* pContainerItem = m_PageArray[m_nAvailPages];
-    pContainerItem->m_pFormNode = pNewPageArea;
-    m_nAvailPages++;
-    pNewPageAreaLayoutItem = pContainerItem;
-  } else {
-    IXFA_Notify* pNotify =
-        pNewPageArea->GetDocument()->GetParser()->GetNotify();
-    CXFA_ContainerLayoutItem* pContainerItem =
-        (CXFA_ContainerLayoutItem*)pNotify->OnCreateLayoutItem(pNewPageArea);
-    m_PageArray.Add(pContainerItem);
-    m_nAvailPages++;
-    pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageAdded,
-                         (void*)(uintptr_t)m_nAvailPages);
-    pNewPageAreaLayoutItem = pContainerItem;
-  }
-  pNewRecord->pCurPageSet->AddChild(pNewPageAreaLayoutItem);
-  pNewRecord->pCurPageArea = pNewPageAreaLayoutItem;
-  pNewRecord->pCurContentArea = NULL;
-}
-void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(
-    CXFA_ContainerRecord* pNewRecord,
-    CXFA_Node* pContentArea) {
-  if (pContentArea == NULL) {
-    pNewRecord->pCurContentArea = NULL;
-    return;
-  }
-  CXFA_ContainerLayoutItem* pNewContentAreaLayoutItem =
-      new CXFA_ContainerLayoutItem(pContentArea);
-  ASSERT(pNewRecord->pCurPageArea);
-  pNewRecord->pCurPageArea->AddChild(pNewContentAreaLayoutItem);
-  pNewRecord->pCurContentArea = pNewContentAreaLayoutItem;
-}
-class CXFA_TraverseStrategy_PageSetContainerLayoutItem {
- public:
-  static inline CXFA_ContainerLayoutItem* GetFirstChild(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      CXFA_ContainerLayoutItem* pChildItem =
-          (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
-      while (pChildItem &&
-             pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
-        pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
-      }
-      return pChildItem;
-    }
-    return NULL;
-  }
-  static inline CXFA_ContainerLayoutItem* GetNextSibling(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    CXFA_ContainerLayoutItem* pChildItem =
-        (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
-    while (pChildItem &&
-           pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
-      pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
-    }
-    return pChildItem;
-  }
-  static inline CXFA_ContainerLayoutItem* GetParent(
-      CXFA_ContainerLayoutItem* pLayoutItem) {
-    return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
-  }
-};
-void CXFA_LayoutPageMgr::FinishPaginatedPageSets() {
-  CXFA_ContainerLayoutItem* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot;
-  for (; pRootPageSetLayoutItem;
-       pRootPageSetLayoutItem =
-           (CXFA_ContainerLayoutItem*)pRootPageSetLayoutItem->m_pNextSibling) {
-    CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
-                              CXFA_TraverseStrategy_PageSetContainerLayoutItem>
-        sIterator(pRootPageSetLayoutItem);
-    for (CXFA_ContainerLayoutItem* pPageSetLayoutItem = sIterator.GetCurrent();
-         pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) {
-      XFA_ATTRIBUTEENUM ePageRelation =
-          pPageSetLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Relation);
-      switch (ePageRelation) {
-        case XFA_ATTRIBUTEENUM_OrderedOccurrence:
-        default: { ProcessLastPageSet(); } break;
-        case XFA_ATTRIBUTEENUM_SimplexPaginated:
-        case XFA_ATTRIBUTEENUM_DuplexPaginated: {
-          CXFA_LayoutItem* pLastPageAreaLayoutItem = NULL;
-          int32_t nPageAreaCount = 0;
-          for (CXFA_LayoutItem* pPageAreaLayoutItem =
-                   pPageSetLayoutItem->m_pFirstChild;
-               pPageAreaLayoutItem;
-               pPageAreaLayoutItem = pPageAreaLayoutItem->m_pNextSibling) {
-            if (pPageAreaLayoutItem->m_pFormNode->GetClassID() !=
-                XFA_ELEMENT_PageArea) {
-              continue;
-            }
-            nPageAreaCount++;
-            pLastPageAreaLayoutItem = pPageAreaLayoutItem;
-          }
-          if (!pLastPageAreaLayoutItem) {
-            break;
-          }
-          if (!FindPageAreaFromPageSet_SimplexDuplex(
-                  pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE,
-                  nPageAreaCount == 1 ? XFA_ATTRIBUTEENUM_Only
-                                      : XFA_ATTRIBUTEENUM_Last) &&
-              (nPageAreaCount == 1 &&
-               !FindPageAreaFromPageSet_SimplexDuplex(
-                   pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE,
-                   TRUE, XFA_ATTRIBUTEENUM_Last))) {
-            break;
-          }
-          CXFA_Node* pNode = m_pCurPageArea;
-          XFA_ATTRIBUTEENUM eCurChoice =
-              pNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
-          if (eCurChoice == XFA_ATTRIBUTEENUM_Last) {
-            XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
-            pNode->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
-            XFA_ATTRIBUTEENUM eLastChoice =
-                pLastPageAreaLayoutItem->m_pFormNode->GetEnum(
-                    XFA_ATTRIBUTE_PagePosition);
-            if (eLastChoice == XFA_ATTRIBUTEENUM_First &&
-                (ePageRelation == XFA_ATTRIBUTEENUM_SimplexPaginated ||
-                 eOddOrEven != XFA_ATTRIBUTEENUM_Odd)) {
-              CXFA_ContainerRecord* pRecord = CreateContainerRecord();
-              AddPageAreaLayoutItem(pRecord, pNode);
-              break;
-            }
-          }
-          FX_BOOL bUsable = TRUE;
-          CFX_ArrayTemplate<FX_FLOAT> rgUsedHeights;
-          for (CXFA_LayoutItem* pChildLayoutItem =
-                   pLastPageAreaLayoutItem->m_pFirstChild;
-               pChildLayoutItem;
-               pChildLayoutItem = pChildLayoutItem->m_pNextSibling) {
-            if (pChildLayoutItem->m_pFormNode->GetClassID() !=
-                XFA_ELEMENT_ContentArea) {
-              continue;
-            }
-            FX_FLOAT fUsedHeight = 0;
-            for (CXFA_LayoutItem* pContentChildLayoutItem =
-                     pChildLayoutItem->m_pFirstChild;
-                 pContentChildLayoutItem;
-                 pContentChildLayoutItem =
-                     pContentChildLayoutItem->m_pNextSibling) {
-              if (CXFA_ContentLayoutItem* pContent =
-                      pContentChildLayoutItem->AsContentLayoutItem()) {
-                fUsedHeight += pContent->m_sSize.y;
-              }
-            }
-            rgUsedHeights.Add(fUsedHeight);
-          }
-          int32_t iCurContentAreaIndex = -1;
-          for (CXFA_Node* pContentAreaNode =
-                   pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-               pContentAreaNode;
-               pContentAreaNode =
-                   pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-            if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
-              continue;
-            }
-            iCurContentAreaIndex++;
-            if (rgUsedHeights[iCurContentAreaIndex] >
-                pContentAreaNode->GetMeasure(XFA_ATTRIBUTE_H)
-                        .ToUnit(XFA_UNIT_Pt) +
-                    XFA_LAYOUT_FLOAT_PERCISION) {
-              bUsable = FALSE;
-              break;
-            }
-          }
-          if (bUsable) {
-            CXFA_LayoutItem* pChildLayoutItem =
-                pLastPageAreaLayoutItem->m_pFirstChild;
-            CXFA_Node* pContentAreaNode =
-                pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-            pLastPageAreaLayoutItem->m_pFormNode = pNode;
-            while (pChildLayoutItem && pContentAreaNode) {
-              if (pChildLayoutItem->m_pFormNode->GetClassID() !=
-                  XFA_ELEMENT_ContentArea) {
-                pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
-                continue;
-              }
-              if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
-                pContentAreaNode =
-                    pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-                continue;
-              }
-              pChildLayoutItem->m_pFormNode = pContentAreaNode;
-              pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
-              pContentAreaNode =
-                  pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-            }
-          } else if (pNode->GetEnum(XFA_ATTRIBUTE_PagePosition) ==
-                     XFA_ATTRIBUTEENUM_Last) {
-            CXFA_ContainerRecord* pRecord = CreateContainerRecord();
-            AddPageAreaLayoutItem(pRecord, pNode);
-          }
-        } break;
-      }
-    }
-  }
-}
-int32_t CXFA_LayoutPageMgr::GetPageCount() const {
-  return m_PageArray.GetSize();
-}
-IXFA_LayoutPage* CXFA_LayoutPageMgr::GetPage(int32_t index) const {
-  if (index < 0 || index >= m_PageArray.GetSize())
-    return nullptr;
-  return m_PageArray[index];
-}
-int32_t CXFA_LayoutPageMgr::GetPageIndex(const IXFA_LayoutPage* pPage) const {
-  // FIXME: Find() method should take const.
-  return m_PageArray.Find(static_cast<CXFA_ContainerLayoutItem*>(
-      const_cast<IXFA_LayoutPage*>(pPage)));
-}
-FX_BOOL CXFA_LayoutPageMgr::RunBreak(XFA_ELEMENT eBreakType,
-                                     XFA_ATTRIBUTEENUM eTargetType,
-                                     CXFA_Node* pTarget,
-                                     FX_BOOL bStartNew) {
-  FX_BOOL bRet = FALSE;
-  switch (eTargetType) {
-    case XFA_ATTRIBUTEENUM_ContentArea:
-      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_ContentArea) {
-        pTarget = NULL;
-      }
-      if (!pTarget || !m_pCurrentContainerRecord ||
-          pTarget !=
-              GetCurrentContainerRecord()->pCurContentArea->m_pFormNode ||
-          bStartNew) {
-        CXFA_Node* pPageArea = NULL;
-        if (pTarget) {
-          pPageArea = pTarget->GetNodeItem(XFA_NODEITEM_Parent);
-        }
-        pPageArea = GetNextAvailPageArea(pPageArea, pTarget);
-        bRet = pPageArea != NULL;
-      }
-      break;
-    case XFA_ATTRIBUTEENUM_PageArea:
-      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
-        pTarget = NULL;
-      }
-      if (!pTarget || !m_pCurrentContainerRecord ||
-          pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode ||
-          bStartNew) {
-        CXFA_Node* pPageArea = GetNextAvailPageArea(pTarget, NULL, TRUE);
-        bRet = pPageArea != NULL;
-      }
-      break;
-    case XFA_ATTRIBUTEENUM_PageOdd:
-      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
-        pTarget = NULL;
-      }
-      if (m_nAvailPages % 2 != 1 || !m_pCurrentContainerRecord ||
-          (pTarget &&
-           pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
-          bStartNew) {
-        if (m_nAvailPages % 2 == 1) {
-        }
-      }
-      break;
-    case XFA_ATTRIBUTEENUM_PageEven:
-      if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
-        pTarget = NULL;
-      }
-      if (m_nAvailPages % 2 != 0 || !m_pCurrentContainerRecord ||
-          (pTarget &&
-           pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
-          bStartNew) {
-        if (m_nAvailPages % 2 == 0) {
-        }
-      }
-      break;
-    case XFA_ATTRIBUTEENUM_Auto:
-    default:
-      break;
-  }
-  return bRet;
-}
-FX_BOOL CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(
-    CXFA_Node* pCurNode,
-    FX_BOOL bBefore,
-    CXFA_Node*& pBreakLeaderTemplate,
-    CXFA_Node*& pBreakTrailerTemplate) {
-  XFA_ELEMENT eType = pCurNode->GetClassID();
-  switch (eType) {
-    case XFA_ELEMENT_BreakBefore:
-    case XFA_ELEMENT_BreakAfter: {
-      CFX_WideStringC wsBreakLeader, wsBreakTrailer;
-      CXFA_Node* pFormNode = pCurNode->GetNodeItem(
-          XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-      CXFA_Node* pContainer = pFormNode->GetTemplateNode();
-      FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
-      CXFA_Node* pScript = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Script);
-      if (pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript)) {
-        return FALSE;
-      }
-      CFX_WideStringC wsTarget = pCurNode->GetCData(XFA_ATTRIBUTE_Target);
-      CXFA_Node* pTarget =
-          XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
-      wsBreakTrailer = pCurNode->GetCData(XFA_ATTRIBUTE_Trailer);
-      wsBreakLeader = pCurNode->GetCData(XFA_ATTRIBUTE_Leader);
-      pBreakLeaderTemplate =
-          XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakLeader);
-      pBreakTrailerTemplate =
-          XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakTrailer);
-      if (RunBreak(eType, pCurNode->GetEnum(XFA_ATTRIBUTE_TargetType), pTarget,
-                   bStartNew)) {
-        return TRUE;
-      } else {
-        if (m_rgProposedContainerRecord.GetCount() > 0 &&
-            m_pCurrentContainerRecord ==
-                m_rgProposedContainerRecord.GetHeadPosition() &&
-            eType == XFA_ELEMENT_BreakBefore) {
-          CXFA_Node* pParentNode = pFormNode->GetNodeItem(
-              XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-          if (!pParentNode ||
-              pFormNode !=
-                  pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild,
-                                           XFA_OBJECTTYPE_ContainerNode)) {
-            break;
-          }
-          pParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
-          if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Form) {
-            break;
-          }
-          return TRUE;
-        }
-      }
-    } break;
-    case XFA_ELEMENT_Break: {
-      FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
-      CFX_WideStringC wsTarget = pCurNode->GetCData(
-          bBefore ? XFA_ATTRIBUTE_BeforeTarget : XFA_ATTRIBUTE_AfterTarget);
-      CXFA_Node* pTarget =
-          XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
-      if (RunBreak(bBefore ? XFA_ELEMENT_BreakBefore : XFA_ELEMENT_BreakAfter,
-                   pCurNode->GetEnum(bBefore ? XFA_ATTRIBUTE_Before
-                                             : XFA_ATTRIBUTE_After),
-                   pTarget, bStartNew)) {
-        return TRUE;
-      }
-    } break;
-    default:
-      break;
-  }
-  return FALSE;
-}
-static void XFA_SetLayoutGeneratedNodeFlag(CXFA_Node* pNode) {
-  pNode->SetFlag(XFA_NODEFLAG_LayoutGeneratedNode, TRUE, FALSE);
-  pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE, FALSE);
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(
-    CXFA_Node* pBreakNode,
-    FX_BOOL bBefore,
-    CXFA_Node*& pBreakLeaderNode,
-    CXFA_Node*& pBreakTrailerNode,
-    FX_BOOL& bCreatePage) {
-  CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
-  CXFA_Node* pFormNode = pBreakNode->GetNodeItem(XFA_NODEITEM_Parent,
-                                                 XFA_OBJECTTYPE_ContainerNode);
-  if (XFA_ItemLayoutProcessor_IsTakingSpace(pFormNode)) {
-    bCreatePage = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore,
-                                            pLeaderTemplate, pTrailerTemplate);
-    CXFA_Document* pDocument = pBreakNode->GetDocument();
-    CXFA_Node* pDataScope = NULL;
-    pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent,
-                                       XFA_OBJECTTYPE_ContainerNode);
-    if (pLeaderTemplate) {
-      if (!pDataScope) {
-        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
-      }
-      pBreakLeaderNode = pDocument->DataMerge_CopyContainer(
-          pLeaderTemplate, pFormNode, pDataScope, TRUE);
-      pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode);
-      XFA_SetLayoutGeneratedNodeFlag(pBreakLeaderNode);
-    }
-    if (pTrailerTemplate) {
-      if (!pDataScope) {
-        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
-      }
-      pBreakTrailerNode = pDocument->DataMerge_CopyContainer(
-          pTrailerTemplate, pFormNode, pDataScope, TRUE);
-      pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode);
-      XFA_SetLayoutGeneratedNodeFlag(pBreakTrailerNode);
-    }
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(
-    CXFA_Node* pBookendNode,
-    FX_BOOL bLeader,
-    CXFA_Node*& pBookendAppendNode) {
-  CXFA_Node* pLeaderTemplate = NULL;
-  CXFA_Node* pFormNode = pBookendNode->GetNodeItem(
-      XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-  if (ResolveBookendLeaderOrTrailer(pBookendNode, bLeader, pLeaderTemplate)) {
-    CXFA_Document* pDocument = pBookendNode->GetDocument();
-    CXFA_Node* pDataScope = NULL;
-    if (pLeaderTemplate) {
-      if (!pDataScope) {
-        pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
-      }
-      pBookendAppendNode = pDocument->DataMerge_CopyContainer(
-          pLeaderTemplate, pFormNode, pDataScope, TRUE);
-      pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode);
-      XFA_SetLayoutGeneratedNodeFlag(pBookendAppendNode);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-CXFA_Node* CXFA_LayoutPageMgr::BreakOverflow(CXFA_Node* pOverflowNode,
-                                             CXFA_Node*& pLeaderTemplate,
-                                             CXFA_Node*& pTrailerTemplate,
-                                             FX_BOOL bCreatePage) {
-  CFX_WideStringC wsOverflowLeader, wsOverflowTrailer;
-  CXFA_Node* pContainer =
-      pOverflowNode->GetNodeItem(XFA_NODEITEM_Parent,
-                                 XFA_OBJECTTYPE_ContainerNode)
-          ->GetTemplateNode();
-  if (pOverflowNode->GetClassID() == XFA_ELEMENT_Break) {
-    CFX_WideStringC wsOverflowLeader;
-    CFX_WideStringC wsOverflowTarget;
-    CFX_WideStringC wsOverflowTrailer;
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
-    if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
-        !wsOverflowTarget.IsEmpty()) {
-      if (!wsOverflowTarget.IsEmpty() && bCreatePage &&
-          !m_bCreateOverFlowPage) {
-        CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot,
-                                                    TRUE, wsOverflowTarget);
-        if (pTarget) {
-          m_bCreateOverFlowPage = TRUE;
-          switch (pTarget->GetClassID()) {
-            case XFA_ELEMENT_PageArea:
-              RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea,
-                       pTarget, TRUE);
-              break;
-            case XFA_ELEMENT_ContentArea:
-              RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
-                       pTarget, TRUE);
-              break;
-            default:
-              break;
-          }
-        }
-      }
-      if (!bCreatePage) {
-        pLeaderTemplate =
-            XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
-        pTrailerTemplate =
-            XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
-      }
-      return pOverflowNode;
-    }
-    return NULL;
-  } else if (pOverflowNode->GetClassID() == XFA_ELEMENT_Overflow) {
-    CFX_WideStringC wsOverflowTarget;
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_Leader, wsOverflowLeader);
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_Trailer, wsOverflowTrailer);
-    pOverflowNode->TryCData(XFA_ATTRIBUTE_Target, wsOverflowTarget);
-    if (!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
-      CXFA_Node* pTarget = XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE,
-                                                  wsOverflowTarget);
-      if (pTarget) {
-        m_bCreateOverFlowPage = TRUE;
-        switch (pTarget->GetClassID()) {
-          case XFA_ELEMENT_PageArea:
-            RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget,
-                     TRUE);
-            break;
-          case XFA_ELEMENT_ContentArea:
-            RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
-                     pTarget, TRUE);
-            break;
-          default:
-            break;
-        }
-      }
-    }
-    if (!bCreatePage) {
-      pLeaderTemplate =
-          XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
-      pTrailerTemplate =
-          XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
-    }
-    return pOverflowNode;
-  }
-  return NULL;
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessOverflow(CXFA_Node* pFormNode,
-                                            CXFA_Node*& pLeaderNode,
-                                            CXFA_Node*& pTrailerNode,
-                                            FX_BOOL bDataMerge,
-                                            FX_BOOL bCreatePage) {
-  if (pFormNode == NULL) {
-    return FALSE;
-  }
-  CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
-  FX_BOOL bIsOverflowNode = FALSE;
-  if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
-      pFormNode->GetClassID() == XFA_ELEMENT_Break) {
-    bIsOverflowNode = TRUE;
-  }
-  for (CXFA_Node* pCurNode =
-           bIsOverflowNode ? pFormNode
-                           : pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
-    if (BreakOverflow(pCurNode, pLeaderTemplate, pTrailerTemplate,
-                      bCreatePage)) {
-      if (bIsOverflowNode) {
-        pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent);
-      }
-      CXFA_Document* pDocument = pCurNode->GetDocument();
-      CXFA_Node* pDataScope = NULL;
-      if (pLeaderTemplate) {
-        if (!pDataScope) {
-          pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
-        }
-        pLeaderNode = pDocument->DataMerge_CopyContainer(
-            pLeaderTemplate, pFormNode, pDataScope, TRUE);
-        pDocument->DataMerge_UpdateBindingRelations(pLeaderNode);
-        XFA_SetLayoutGeneratedNodeFlag(pLeaderNode);
-      }
-      if (pTrailerTemplate) {
-        if (!pDataScope) {
-          pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
-        }
-        pTrailerNode = pDocument->DataMerge_CopyContainer(
-            pTrailerTemplate, pFormNode, pDataScope, TRUE);
-        pDocument->DataMerge_UpdateBindingRelations(pTrailerNode);
-        XFA_SetLayoutGeneratedNodeFlag(pTrailerNode);
-      }
-      return TRUE;
-    }
-    if (bIsOverflowNode) {
-      break;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(
-    CXFA_Node* pBookendNode,
-    FX_BOOL bLeader,
-    CXFA_Node*& pBookendAppendTemplate) {
-  CFX_WideStringC wsBookendLeader;
-  CXFA_Node* pContainer =
-      pBookendNode->GetNodeItem(XFA_NODEITEM_Parent,
-                                XFA_OBJECTTYPE_ContainerNode)
-          ->GetTemplateNode();
-  if (pBookendNode->GetClassID() == XFA_ELEMENT_Break) {
-    pBookendNode->TryCData(
-        bLeader ? XFA_ATTRIBUTE_BookendLeader : XFA_ATTRIBUTE_BookendTrailer,
-        wsBookendLeader);
-    if (!wsBookendLeader.IsEmpty()) {
-      pBookendAppendTemplate =
-          XFA_ResolveBreakTarget(pContainer, FALSE, wsBookendLeader);
-      return TRUE;
-    }
-    return FALSE;
-  } else if (pBookendNode->GetClassID() == XFA_ELEMENT_Bookend) {
-    pBookendNode->TryCData(
-        bLeader ? XFA_ATTRIBUTE_Leader : XFA_ATTRIBUTE_Trailer,
-        wsBookendLeader);
-    pBookendAppendTemplate =
-        XFA_ResolveBreakTarget(pContainer, TRUE, wsBookendLeader);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet(
-    CXFA_Node* pPageSet,
-    CXFA_Node* pStartChild,
-    CXFA_Node* pTargetPageArea,
-    CXFA_Node* pTargetContentArea,
-    FX_BOOL bNewPage,
-    FX_BOOL bQuery) {
-  if (pPageSet == NULL && pStartChild == NULL) {
-    return FALSE;
-  }
-  if (IsPageSetRootOrderedOccurrence()) {
-    return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild,
-                                           pTargetPageArea, pTargetContentArea,
-                                           bNewPage, bQuery);
-  }
-  XFA_ATTRIBUTEENUM ePreferredPosition = m_pCurrentContainerRecord
-                                             ? XFA_ATTRIBUTEENUM_Rest
-                                             : XFA_ATTRIBUTEENUM_First;
-  return FindPageAreaFromPageSet_SimplexDuplex(
-      pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage,
-      bQuery, ePreferredPosition);
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(
-    CXFA_Node* pPageSet,
-    CXFA_Node* pStartChild,
-    CXFA_Node* pTargetPageArea,
-    CXFA_Node* pTargetContentArea,
-    FX_BOOL bNewPage,
-    FX_BOOL bQuery) {
-  int32_t iPageSetCount = 0;
-  if (!pStartChild && !bQuery) {
-    m_pPageSetMap.Lookup(pPageSet, iPageSetCount);
-    int32_t iMax = -1;
-    CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
-    if (pOccurNode) {
-      pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-    }
-    if (iMax >= 0 && iMax <= iPageSetCount) {
-      return FALSE;
-    }
-  }
-  FX_BOOL bRes = FALSE;
-  CXFA_Node* pCurrentNode =
-      pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling)
-                  : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pCurrentNode;
-       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
-      if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
-        if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
-            NULL) {
-          if (pTargetPageArea == pCurrentNode) {
-            CreateMinPageRecord(pCurrentNode, TRUE);
-            pTargetPageArea = NULL;
-          }
-          continue;
-        }
-        if (!bQuery) {
-          CXFA_ContainerRecord* pNewRecord =
-              CreateContainerRecord(pCurrentNode, pStartChild == NULL);
-          AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
-          if (pTargetContentArea == NULL) {
-            pTargetContentArea =
-                pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-          }
-          AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
-        }
-        m_pCurPageArea = pCurrentNode;
-        m_nCurPageCount = 1;
-        bRes = TRUE;
-        break;
-      }
-      if (!bQuery) {
-        CreateMinPageRecord(pCurrentNode, FALSE);
-      }
-    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      if (FindPageAreaFromPageSet_Ordered(pCurrentNode, NULL, pTargetPageArea,
-                                          pTargetContentArea, bNewPage,
-                                          bQuery)) {
-        bRes = TRUE;
-        break;
-      }
-      if (!bQuery) {
-        CreateMinPageSetRecord(pCurrentNode, TRUE);
-      }
-    }
-  }
-  if (!pStartChild && bRes && !bQuery) {
-    m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount);
-  }
-  return bRes;
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(
-    CXFA_Node* pPageSet,
-    CXFA_Node* pStartChild,
-    CXFA_Node* pTargetPageArea,
-    CXFA_Node* pTargetContentArea,
-    FX_BOOL bNewPage,
-    FX_BOOL bQuery,
-    XFA_ATTRIBUTEENUM ePreferredPosition) {
-  const XFA_ATTRIBUTEENUM eFallbackPosition = XFA_ATTRIBUTEENUM_Any;
-  CXFA_Node *pPreferredPageArea = NULL, *pFallbackPageArea = NULL;
-  CXFA_Node* pCurrentNode = NULL;
-  if (!pStartChild || pStartChild->GetClassID() == XFA_ELEMENT_PageArea) {
-    pCurrentNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
-  } else {
-    pCurrentNode = pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  for (; pCurrentNode;
-       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
-      if (!MatchPageAreaOddOrEven(pCurrentNode, FALSE)) {
-        continue;
-      }
-      XFA_ATTRIBUTEENUM eCurPagePosition =
-          pCurrentNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
-      if (ePreferredPosition == XFA_ATTRIBUTEENUM_Last) {
-        if (eCurPagePosition != ePreferredPosition) {
-          continue;
-        }
-        if (m_ePageSetMode == XFA_ATTRIBUTEENUM_SimplexPaginated ||
-            pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
-                XFA_ATTRIBUTEENUM_Any) {
-          pPreferredPageArea = pCurrentNode;
-          break;
-        }
-        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-        AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
-        AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
-                                                 XFA_ELEMENT_ContentArea));
-        pPreferredPageArea = pCurrentNode;
-        return FALSE;
-      } else if (ePreferredPosition == XFA_ATTRIBUTEENUM_Only) {
-        if (eCurPagePosition != ePreferredPosition) {
-          continue;
-        }
-        if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated ||
-            pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
-                XFA_ATTRIBUTEENUM_Any) {
-          pPreferredPageArea = pCurrentNode;
-          break;
-        }
-        return FALSE;
-      }
-      if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
-        if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
-            NULL) {
-          if (pTargetPageArea == pCurrentNode) {
-            CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-            AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
-            pTargetPageArea = NULL;
-          }
-          continue;
-        }
-        if ((ePreferredPosition == XFA_ATTRIBUTEENUM_Rest &&
-             eCurPagePosition == XFA_ATTRIBUTEENUM_Any) ||
-            eCurPagePosition == ePreferredPosition) {
-          pPreferredPageArea = pCurrentNode;
-          break;
-        } else if (eCurPagePosition == eFallbackPosition &&
-                   !pFallbackPageArea) {
-          pFallbackPageArea = pCurrentNode;
-        }
-      } else if (pTargetPageArea &&
-                 !MatchPageAreaOddOrEven(pTargetPageArea, FALSE)) {
-        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-        AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
-        AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
-                                                 XFA_ELEMENT_ContentArea));
-      }
-    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      if (FindPageAreaFromPageSet_SimplexDuplex(
-              pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage,
-              bQuery, ePreferredPosition)) {
-        break;
-      }
-    }
-  }
-  CXFA_Node* pCurPageArea = NULL;
-  if (pPreferredPageArea) {
-    pCurPageArea = pPreferredPageArea;
-  } else if (pFallbackPageArea) {
-    pCurPageArea = pFallbackPageArea;
-  }
-  if (!pCurPageArea) {
-    return FALSE;
-  }
-  if (!bQuery) {
-    CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-    AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
-    if (pTargetContentArea == NULL) {
-      pTargetContentArea =
-          pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-    }
-    AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
-  }
-  m_pCurPageArea = pCurPageArea;
-  return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea,
-                                                   FX_BOOL bLastMatch) {
-  if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated) {
-    return TRUE;
-  }
-  XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
-  pPageArea->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
-  if (eOddOrEven != XFA_ATTRIBUTEENUM_Any) {
-    int32_t iPageCount = GetPageCount();
-    if (bLastMatch) {
-      return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 1
-                                                 : iPageCount % 2 == 0;
-    }
-    return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 0
-                                               : iPageCount % 2 == 1;
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(
-    CXFA_Node* pTargetPageArea,
-    CXFA_Node* pTargetContentArea,
-    FX_BOOL bNewPage,
-    FX_BOOL bQuery) {
-  if (m_pCurPageArea == NULL) {
-    FindPageAreaFromPageSet(m_pTemplatePageSetRoot, NULL, pTargetPageArea,
-                            pTargetContentArea, bNewPage, bQuery);
-    ASSERT(m_pCurPageArea);
-    return m_pCurPageArea;
-  }
-  if (pTargetPageArea == NULL || pTargetPageArea == m_pCurPageArea) {
-    if (!bNewPage && GetNextContentArea(pTargetContentArea)) {
-      return m_pCurPageArea;
-    }
-    if (IsPageSetRootOrderedOccurrence()) {
-      int32_t iMax = -1;
-      CXFA_Node* pOccurNode =
-          m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
-      if (pOccurNode) {
-        pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-      }
-      if ((iMax < 0 || m_nCurPageCount < iMax)) {
-        if (!bQuery) {
-          CXFA_ContainerRecord* pNewRecord =
-              CreateContainerRecord(m_pCurPageArea);
-          AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea);
-          if (pTargetContentArea == NULL) {
-            pTargetContentArea =
-                m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-          }
-          AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
-        }
-        m_nCurPageCount++;
-        return m_pCurPageArea;
-      }
-    }
-  }
-  if (!bQuery && IsPageSetRootOrderedOccurrence()) {
-    CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
-  }
-  if (FindPageAreaFromPageSet(m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent),
-                              m_pCurPageArea, pTargetPageArea,
-                              pTargetContentArea, bNewPage, bQuery)) {
-    return m_pCurPageArea;
-  }
-  CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
-  while (TRUE) {
-    if (FindPageAreaFromPageSet(pPageSet, NULL, pTargetPageArea,
-                                pTargetContentArea, bNewPage, bQuery)) {
-      return m_pCurPageArea;
-    }
-    if (!bQuery && IsPageSetRootOrderedOccurrence()) {
-      CreateMinPageSetRecord(pPageSet);
-    }
-    if (FindPageAreaFromPageSet(NULL, pPageSet, pTargetPageArea,
-                                pTargetContentArea, bNewPage, bQuery)) {
-      return m_pCurPageArea;
-    }
-    if (pPageSet == m_pTemplatePageSetRoot) {
-      break;
-    }
-    pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-  return NULL;
-}
-static FX_BOOL XFA_LayoutPageMgr_CheckContentAreaNotUsed(
-    CXFA_ContainerLayoutItem* pPageAreaLayoutItem,
-    CXFA_Node* pContentArea,
-    CXFA_ContainerLayoutItem*& pContentAreaLayoutItem) {
-  for (CXFA_ContainerLayoutItem* pLayoutItem =
-           (CXFA_ContainerLayoutItem*)pPageAreaLayoutItem->m_pFirstChild;
-       pLayoutItem;
-       pLayoutItem = (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling) {
-    if (pLayoutItem->m_pFormNode == pContentArea) {
-      if (pLayoutItem->m_pFirstChild == NULL) {
-        pContentAreaLayoutItem = pLayoutItem;
-        return TRUE;
-      }
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) {
-  CXFA_Node* pCurContentNode =
-      GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
-  if (pContentArea == NULL) {
-    pContentArea =
-        pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
-    if (pContentArea == NULL) {
-      return FALSE;
-    }
-  } else {
-    if (pContentArea->GetNodeItem(XFA_NODEITEM_Parent) != m_pCurPageArea) {
-      return FALSE;
-    }
-    CXFA_ContainerLayoutItem* pContentAreaLayout = NULL;
-    if (!XFA_LayoutPageMgr_CheckContentAreaNotUsed(
-            GetCurrentContainerRecord()->pCurPageArea, pContentArea,
-            pContentAreaLayout)) {
-      return FALSE;
-    }
-    if (pContentAreaLayout) {
-      if (pContentAreaLayout->m_pFormNode != pCurContentNode) {
-        CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-        pNewRecord->pCurContentArea = pContentAreaLayout;
-        return TRUE;
-      } else {
-        return FALSE;
-      }
-    }
-  }
-  CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-  AddContentAreaLayoutItem(pNewRecord, pContentArea);
-  return TRUE;
-}
-void CXFA_LayoutPageMgr::InitPageSetMap() {
-  if (!IsPageSetRootOrderedOccurrence()) {
-    return;
-  }
-  CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot);
-  for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode;
-       pPageSetNode = sIterator.MoveToNext()) {
-    if (pPageSetNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      XFA_ATTRIBUTEENUM eRelation =
-          pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation);
-      if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) {
-        m_pPageSetMap.SetAt(pPageSetNode, 0);
-      }
-    }
-  }
-}
-int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea,
-                                                FX_BOOL bTargetPageArea,
-                                                FX_BOOL bCreateLast) {
-  if (pPageArea == NULL) {
-    return 0;
-  }
-  CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
-  int32_t iMin = 0;
-  if ((pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) ||
-      bTargetPageArea) {
-    CXFA_Node* pContentArea =
-        pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-    if (iMin < 1 && bTargetPageArea && !pContentArea) {
-      iMin = 1;
-    }
-    int32_t i = 0;
-    if (bCreateLast) {
-      i = m_nCurPageCount;
-    }
-    for (; i < iMin; i++) {
-      CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
-      AddPageAreaLayoutItem(pNewRecord, pPageArea);
-      AddContentAreaLayoutItem(pNewRecord, pContentArea);
-    }
-  }
-  return iMin;
-}
-void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet,
-                                                FX_BOOL bCreateAll) {
-  if (pPageSet == NULL) {
-    return;
-  }
-  int32_t iCurSetCount = 0;
-  if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) {
-    return;
-  }
-  if (bCreateAll) {
-    iCurSetCount = 0;
-  }
-  CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
-  int32_t iMin = 0;
-  if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) {
-    if (iCurSetCount < iMin) {
-      for (int32_t i = 0; i < iMin - iCurSetCount; i++) {
-        for (CXFA_Node* pCurrentPageNode =
-                 pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
-             pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem(
-                                   XFA_NODEITEM_NextSibling)) {
-          if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageArea) {
-            CreateMinPageRecord(pCurrentPageNode, FALSE);
-          } else if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageSet) {
-            CreateMinPageSetRecord(pCurrentPageNode, TRUE);
-          }
-        }
-      }
-      m_pPageSetMap.SetAt(pPageSet, iMin);
-    }
-  }
-}
-void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) {
-  if (pRecordNode == NULL) {
-    return;
-  }
-  for (CXFA_Node* pCurrentNode =
-           pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-       pCurrentNode;
-       pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
-      CreateMinPageRecord(pCurrentNode, FALSE);
-    } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
-      CreateMinPageSetRecord(pCurrentNode, TRUE);
-    }
-  }
-}
-void CXFA_LayoutPageMgr::ProcessLastPageSet() {
-  CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
-  CreateNextMinRecord(m_pCurPageArea);
-  CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
-  while (TRUE) {
-    CreateMinPageSetRecord(pPageSet);
-    if (pPageSet == m_pTemplatePageSetRoot) {
-      break;
-    }
-    CreateNextMinRecord(pPageSet);
-    pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-}
-FX_BOOL CXFA_LayoutPageMgr::GetNextAvailContentHeight(FX_FLOAT fChildHeight) {
-  CXFA_Node* pCurContentNode =
-      GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
-  if (pCurContentNode == NULL) {
-    return FALSE;
-  }
-  pCurContentNode =
-      pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
-  if (pCurContentNode) {
-    FX_FLOAT fNextContentHeight =
-        pCurContentNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
-    return fNextContentHeight > fChildHeight;
-  }
-  CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
-  CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
-  int32_t iMax = 0;
-  if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
-    if (m_nCurPageCount == iMax) {
-      CXFA_Node* pSrcPage = m_pCurPageArea;
-      int32_t nSrcPageCount = m_nCurPageCount;
-      FX_POSITION psSrcRecord = m_rgProposedContainerRecord.GetTailPosition();
-      CXFA_Node* pNextPage = GetNextAvailPageArea(NULL, NULL, FALSE, TRUE);
-      m_pCurPageArea = pSrcPage;
-      m_nCurPageCount = nSrcPageCount;
-      CXFA_ContainerRecord* pPrevRecord =
-          (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
-              psSrcRecord);
-      while (psSrcRecord) {
-        FX_POSITION psSaveRecord = psSrcRecord;
-        CXFA_ContainerRecord* pInsertRecord =
-            (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
-                psSrcRecord);
-        RemoveLayoutRecord(pInsertRecord, pPrevRecord);
-        delete pInsertRecord;
-        m_rgProposedContainerRecord.RemoveAt(psSaveRecord);
-      }
-      if (pNextPage) {
-        CXFA_Node* pContentArea =
-            pNextPage->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-        if (pContentArea) {
-          FX_FLOAT fNextContentHeight =
-              pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
-          if (fNextContentHeight > fChildHeight) {
-            return TRUE;
-          }
-        }
-      }
-      return FALSE;
-    }
-  }
-  CXFA_Node* pContentArea =
-      pPageNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
-  FX_FLOAT fNextContentHeight =
-      pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
-  if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION) {
-    return TRUE;
-  }
-  if (fNextContentHeight > fChildHeight) {
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_LayoutPageMgr::ClearData() {
-  ClearRecordList();
-}
-void CXFA_LayoutPageMgr::ClearRecordList() {
-  if (!m_pTemplatePageSetRoot) {
-    return;
-  }
-  if (m_rgProposedContainerRecord.GetCount() > 0) {
-    FX_POSITION sPos;
-    sPos = m_rgProposedContainerRecord.GetHeadPosition();
-    while (sPos) {
-      CXFA_ContainerRecord* pRecord =
-          (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(sPos);
-      delete pRecord;
-    }
-    m_rgProposedContainerRecord.RemoveAll();
-  }
-  m_pCurrentContainerRecord = NULL;
-  m_pCurPageArea = NULL;
-  m_nCurPageCount = 0;
-  m_bCreateOverFlowPage = FALSE;
-  m_pPageSetMap.RemoveAll();
-}
-CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem(
-    CXFA_Node* pFormNode) {
-  return pFormNode->GetDocument()->GetParser()->GetNotify()->OnCreateLayoutItem(
-      pFormNode);
-}
-static void XFA_SyncRemoveLayoutItem(CXFA_LayoutItem* pParentLayoutItem,
-                                     IXFA_Notify* pNotify,
-                                     IXFA_DocLayout* pDocLayout) {
-  CXFA_LayoutItem* pNextLayoutItem;
-  CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
-  while (pCurLayoutItem) {
-    pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
-    if (pCurLayoutItem->m_pFirstChild) {
-      XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
-    }
-    pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
-                           XFA_LAYOUTEVENT_ItemRemoving);
-    delete pCurLayoutItem;
-    pCurLayoutItem = pNextLayoutItem;
-  }
-}
-void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
-  CXFA_LayoutItem* pNextLayoutItem;
-  CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
-  while (pCurLayoutItem) {
-    pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
-    if (pCurLayoutItem->IsContentLayoutItem()) {
-      FX_DWORD dwFlag = pCurLayoutItem->m_pFormNode->GetFlag();
-      if (dwFlag & (XFA_NODEFLAG_HasRemoved)) {
-        IXFA_Notify* pNotify =
-            m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
-        IXFA_DocLayout* pDocLayout =
-            m_pTemplatePageSetRoot->GetDocument()->GetDocLayout();
-        if (pCurLayoutItem->m_pFirstChild) {
-          XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
-        }
-        pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
-                               XFA_LAYOUTEVENT_ItemRemoving);
-        delete pCurLayoutItem;
-        pCurLayoutItem = pNextLayoutItem;
-        continue;
-      }
-      if (dwFlag & XFA_NODEFLAG_LayoutGeneratedNode) {
-        CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-            sIterator(pCurLayoutItem->m_pFormNode);
-        for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-             pNode = sIterator.MoveToNext()) {
-          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, TRUE, FALSE);
-        }
-      }
-    }
-    if (pCurLayoutItem->m_pFirstChild) {
-      SaveLayoutItem(pCurLayoutItem);
-    }
-    pCurLayoutItem->m_pParent = NULL;
-    pCurLayoutItem->m_pNextSibling = NULL;
-    pCurLayoutItem->m_pFirstChild = NULL;
-    if (!pCurLayoutItem->IsContentLayoutItem() &&
-        pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
-      delete pCurLayoutItem;
-    }
-    pCurLayoutItem = pNextLayoutItem;
-  }
-}
-CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(
-    CXFA_Node* pFormNode,
-    CXFA_LayoutContext* pLayoutContext) {
-  for (CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
-    if (pCurNode->GetClassID() == XFA_ELEMENT_Break) {
-      CFX_WideStringC wsOverflowLeader;
-      CFX_WideStringC wsOverflowTarget;
-      CFX_WideStringC wsOverflowTrailer;
-      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
-      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
-      pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
-      if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
-          !wsOverflowTarget.IsEmpty()) {
-        return pCurNode;
-      }
-      return NULL;
-    } else if (pCurNode->GetClassID() == XFA_ELEMENT_Overflow) {
-      return pCurNode;
-    }
-  }
-  return NULL;
-}
-void CXFA_LayoutPageMgr::MergePageSetContents() {
-  CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
-  IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
-  IXFA_DocLayout* pDocLayout = pDocument->GetDocLayout();
-  CXFA_ContainerLayoutItem* pRootLayout = GetRootLayoutItem();
-  {
-    for (int32_t iIndex = 0; iIndex < pDocument->m_pPendingPageSet.GetSize();
-         iIndex++) {
-      CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-          sIterator(pDocument->m_pPendingPageSet.GetAt(iIndex));
-      for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-           pNode = sIterator.MoveToNext()) {
-        if (pNode->IsContainerNode()) {
-          CXFA_Node* pBindNode = pNode->GetBindData();
-          if (pBindNode) {
-            pBindNode->RemoveBindItem(pNode);
-            pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-          }
-        }
-        pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
-      }
-    }
-  }
-  int32_t iIndex = 0;
-  CXFA_Node* pPendingPageSet = NULL;
-  for (; pRootLayout;
-       pRootLayout = (CXFA_ContainerLayoutItem*)pRootLayout->m_pNextSibling) {
-    pPendingPageSet = NULL;
-    CXFA_NodeIteratorTemplate<
-        CXFA_ContainerLayoutItem,
-        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
-        iterator(pRootLayout);
-    CXFA_ContainerLayoutItem* pRootPageSetContainerItem = iterator.GetCurrent();
-    ASSERT(pRootPageSetContainerItem->m_pFormNode->GetClassID() ==
-           XFA_ELEMENT_PageSet);
-    if (iIndex < pDocument->m_pPendingPageSet.GetSize()) {
-      pPendingPageSet = pDocument->m_pPendingPageSet.GetAt(iIndex);
-      iIndex++;
-    }
-    if (!pPendingPageSet) {
-      if (pRootPageSetContainerItem->m_pFormNode->GetPacketID() ==
-          XFA_XDPPACKET_Template) {
-        pPendingPageSet =
-            pRootPageSetContainerItem->m_pFormNode->CloneTemplateToForm(FALSE);
-      } else {
-        pPendingPageSet = pRootPageSetContainerItem->m_pFormNode;
-      }
-    }
-    if (pRootPageSetContainerItem->m_pFormNode->GetUserData(
-            XFA_LAYOUTITEMKEY) == pRootPageSetContainerItem) {
-      pRootPageSetContainerItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY,
-                                                          NULL);
-    }
-    pRootPageSetContainerItem->m_pFormNode = pPendingPageSet;
-    pPendingPageSet->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-    for (CXFA_ContainerLayoutItem* pContainerItem = iterator.MoveToNext();
-         pContainerItem; pContainerItem = iterator.MoveToNext()) {
-      CXFA_Node* pNode = pContainerItem->m_pFormNode;
-      if (pNode->GetPacketID() != XFA_XDPPACKET_Template) {
-        continue;
-      }
-      switch (pNode->GetClassID()) {
-        case XFA_ELEMENT_PageSet: {
-          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
-          pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer(
-              pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE);
-        } break;
-        case XFA_ELEMENT_PageArea: {
-          CXFA_ContainerLayoutItem* pFormLayout = pContainerItem;
-          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
-          FX_BOOL bIsExistForm = TRUE;
-          for (int32_t iLevel = 0; iLevel < 3; iLevel++) {
-            pFormLayout = (CXFA_ContainerLayoutItem*)pFormLayout->m_pFirstChild;
-            if (iLevel == 2) {
-              while (pFormLayout &&
-                     !XFA_ItemLayoutProcessor_IsTakingSpace(
-                         pFormLayout->m_pFormNode)) {
-                pFormLayout =
-                    (CXFA_ContainerLayoutItem*)pFormLayout->m_pNextSibling;
-              }
-            }
-            if (pFormLayout == NULL) {
-              bIsExistForm = FALSE;
-              break;
-            }
-          }
-          if (bIsExistForm) {
-            CXFA_Node* pNewSubform = pFormLayout->m_pFormNode;
-            if (pContainerItem->m_pOldSubform &&
-                pContainerItem->m_pOldSubform != pNewSubform) {
-              CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
-                  pDocument, pContainerItem->m_pFormNode->GetClassID(),
-                  pContainerItem->m_pFormNode->GetNameHash(), pParentNode);
-              CXFA_ContainerIterator sIterator(pExistingNode);
-              for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
-                   pNode = sIterator.MoveToNext()) {
-                if (pNode->GetClassID() != XFA_ELEMENT_ContentArea) {
-                  CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
-                      pNode->GetUserData(XFA_LAYOUTITEMKEY));
-                  if (pLayoutItem) {
-                    pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
-                                           XFA_LAYOUTEVENT_ItemRemoving);
-                    delete pLayoutItem;
-                  }
-                }
-              }
-              if (pExistingNode) {
-                pParentNode->RemoveChild(pExistingNode);
-              }
-            }
-            pContainerItem->m_pOldSubform = pNewSubform;
-          }
-          pContainerItem->m_pFormNode = pDocument->DataMerge_CopyContainer(
-              pContainerItem->m_pFormNode, pParentNode,
-              ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)), TRUE);
-        } break;
-        case XFA_ELEMENT_ContentArea: {
-          CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
-          for (CXFA_Node* pChildNode =
-                   pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-               pChildNode;
-               pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-            if (pChildNode->GetTemplateNode() != pContainerItem->m_pFormNode) {
-              continue;
-            }
-            pContainerItem->m_pFormNode = pChildNode;
-            break;
-          }
-        } break;
-        default:
-          break;
-      }
-    }
-    if (!pPendingPageSet->GetNodeItem(XFA_NODEITEM_Parent)) {
-      CXFA_Node* pFormToplevelSubform =
-          pDocument->GetXFAObject(XFA_HASHCODE_Form)
-              ->AsNode()
-              ->GetFirstChildByClass(XFA_ELEMENT_Subform);
-      pFormToplevelSubform->InsertChild(pPendingPageSet);
-    }
-    pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet);
-    pPendingPageSet->SetFlag(XFA_NODEFLAG_Initialized);
-  }
-  pPendingPageSet = GetRootLayoutItem()->m_pFormNode;
-  while (pPendingPageSet) {
-    CXFA_Node* pNextPendingPageSet =
-        pPendingPageSet->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
-    CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-        sIterator(pPendingPageSet);
-    CXFA_Node* pNode = sIterator.GetCurrent();
-    while (pNode) {
-      if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
-        if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
-          XFA_ELEMENT eCurId = pNode->GetClassID();
-          if (eCurId == XFA_ELEMENT_PageArea || eCurId == XFA_ELEMENT_PageSet) {
-            CXFA_ContainerIterator iteChild(pNode);
-            CXFA_Node* pChildNode = iteChild.MoveToNext();
-            for (; pChildNode; pChildNode = iteChild.MoveToNext()) {
-              CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
-                  pChildNode->GetUserData(XFA_LAYOUTITEMKEY));
-              if (pLayoutItem) {
-                pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
-                                       XFA_LAYOUTEVENT_ItemRemoving);
-                delete pLayoutItem;
-              }
-            }
-          } else if (eCurId != XFA_ELEMENT_ContentArea) {
-            CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
-                pNode->GetUserData(XFA_LAYOUTITEMKEY));
-            if (pLayoutItem) {
-              pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
-                                     XFA_LAYOUTEVENT_ItemRemoving);
-              delete pLayoutItem;
-            }
-          }
-          CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
-          pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
-          pNode = pNext;
-        } else {
-          pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
-          pNode->SetFlag(XFA_NODEFLAG_Initialized);
-          pNode = sIterator.MoveToNext();
-        }
-      } else {
-        pNode->SetFlag(XFA_NODEFLAG_Initialized);
-        pNode = sIterator.MoveToNext();
-      }
-    }
-    pPendingPageSet = pNextPendingPageSet;
-  }
-}
-void CXFA_LayoutPageMgr::LayoutPageSetContents() {
-  CXFA_ContainerLayoutItem* pRootLayoutItem = GetRootLayoutItem();
-  for (; pRootLayoutItem;
-       pRootLayoutItem =
-           (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
-    CXFA_NodeIteratorTemplate<
-        CXFA_ContainerLayoutItem,
-        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
-        iterator(pRootLayoutItem);
-    for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
-         pContainerItem; pContainerItem = iterator.MoveToNext()) {
-      CXFA_Node* pNode = pContainerItem->m_pFormNode;
-      switch (pNode->GetClassID()) {
-        case XFA_ELEMENT_PageArea:
-          m_pLayoutProcessor->GetRootRootItemLayoutProcessor()
-              ->DoLayoutPageArea(pContainerItem);
-          break;
-        default:
-          break;
-      }
-    }
-  }
-}
-void XFA_SyncContainer(IXFA_Notify* pNotify,
-                       IXFA_DocLayout* pDocLayout,
-                       CXFA_LayoutItem* pContainerItem,
-                       FX_DWORD dwRelevant,
-                       FX_BOOL bVisible,
-                       int32_t nPageIndex) {
-  FX_BOOL bVisibleItem = FALSE;
-  FX_DWORD dwStatus = 0;
-  FX_DWORD dwRelevantContainer = 0;
-  if (bVisible) {
-    XFA_ATTRIBUTEENUM eAttributeValue =
-        pContainerItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence);
-    if (eAttributeValue == XFA_ATTRIBUTEENUM_Visible ||
-        eAttributeValue == XFA_ATTRIBUTEENUM_Unknown) {
-      bVisibleItem = TRUE;
-    }
-    dwRelevantContainer =
-        XFA_GetRelevant(pContainerItem->m_pFormNode, dwRelevant);
-    dwStatus =
-        (bVisibleItem ? XFA_LAYOUTSTATUS_Visible : 0) | dwRelevantContainer;
-  }
-  pNotify->OnLayoutEvent(pDocLayout, pContainerItem, XFA_LAYOUTEVENT_ItemAdded,
-                         (void*)(uintptr_t)nPageIndex,
-                         (void*)(uintptr_t)dwStatus);
-  for (CXFA_LayoutItem* pChild = pContainerItem->m_pFirstChild; pChild;
-       pChild = pChild->m_pNextSibling) {
-    if (pChild->IsContentLayoutItem()) {
-      XFA_SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer,
-                        bVisibleItem, nPageIndex);
-    }
-  }
-}
-void CXFA_LayoutPageMgr::SyncLayoutData() {
-  MergePageSetContents();
-  LayoutPageSetContents();
-  IXFA_Notify* pNotify =
-      m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
-  int32_t nPageIdx = -1;
-  CXFA_ContainerLayoutItem* pRootLayoutItem = GetRootLayoutItem();
-  for (; pRootLayoutItem;
-       pRootLayoutItem =
-           (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
-    CXFA_NodeIteratorTemplate<
-        CXFA_ContainerLayoutItem,
-        CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
-        iteratorParent(pRootLayoutItem);
-    for (CXFA_ContainerLayoutItem* pContainerItem = iteratorParent.GetCurrent();
-         pContainerItem; pContainerItem = iteratorParent.MoveToNext()) {
-      switch (pContainerItem->m_pFormNode->GetClassID()) {
-        case XFA_ELEMENT_PageArea: {
-          nPageIdx++;
-          FX_DWORD dwRelevant =
-              XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
-          CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
-                                    CXFA_TraverseStrategy_LayoutItem>
-              iterator(pContainerItem);
-          CXFA_LayoutItem* pChildLayoutItem = iterator.GetCurrent();
-          while (pChildLayoutItem) {
-            CXFA_ContentLayoutItem* pContentItem =
-                pChildLayoutItem->AsContentLayoutItem();
-            if (!pContentItem) {
-              pChildLayoutItem = iterator.MoveToNext();
-              continue;
-            }
-            FX_BOOL bVisible =
-                (pContentItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence) ==
-                 XFA_ATTRIBUTEENUM_Visible);
-            FX_DWORD dwRelevantChild =
-                XFA_GetRelevant(pContentItem->m_pFormNode, dwRelevant);
-            XFA_SyncContainer(pNotify, m_pLayoutProcessor, pContentItem,
-                              dwRelevantChild, bVisible, nPageIdx);
-            pChildLayoutItem = iterator.SkipChildrenAndMoveToNext();
-          }
-        } break;
-        default:
-          break;
-      }
-    }
-  }
-  int32_t nPage = m_PageArray.GetSize();
-  for (int32_t i = nPage - 1; i >= m_nAvailPages; i--) {
-    CXFA_ContainerLayoutItem* pPage = m_PageArray[i];
-    m_PageArray.RemoveAt(i);
-    pNotify->OnPageEvent(pPage, XFA_PAGEEVENT_PageRemoved);
-    delete pPage;
-  }
-  ClearRecordList();
-}
-void XFA_ReleaseLayoutItem_NoPageArea(CXFA_LayoutItem* pLayoutItem) {
-  CXFA_LayoutItem *pNext, *pNode = pLayoutItem->m_pFirstChild;
-  while (pNode) {
-    pNext = pNode->m_pNextSibling;
-    pNode->m_pParent = NULL;
-    XFA_ReleaseLayoutItem_NoPageArea(pNode);
-    pNode = pNext;
-  }
-  if (pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
-    delete pLayoutItem;
-  }
-}
-void CXFA_LayoutPageMgr::PrepareLayout() {
-  m_pPageSetCurRoot = NULL;
-  m_ePageSetMode = XFA_ATTRIBUTEENUM_OrderedOccurrence;
-  m_nAvailPages = 0;
-  ClearRecordList();
-  if (!m_pPageSetLayoutItemRoot) {
-    return;
-  }
-  CXFA_ContainerLayoutItem* pRootLayoutItem = m_pPageSetLayoutItemRoot;
-  if (pRootLayoutItem &&
-      pRootLayoutItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Form) {
-    CXFA_Node* pPageSetFormNode = pRootLayoutItem->m_pFormNode;
-    pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.RemoveAll();
-    if (pPageSetFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-      XFA_ReleaseLayoutItem(pRootLayoutItem);
-      m_pPageSetLayoutItemRoot = NULL;
-      pRootLayoutItem = NULL;
-      pPageSetFormNode = NULL;
-      m_PageArray.RemoveAll();
-    }
-    while (pPageSetFormNode) {
-      CXFA_Node* pNextPageSet =
-          pPageSetFormNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
-      pPageSetFormNode->GetNodeItem(XFA_NODEITEM_Parent)
-          ->RemoveChild(pPageSetFormNode, FALSE);
-      pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.Add(
-          pPageSetFormNode);
-      pPageSetFormNode = pNextPageSet;
-    }
-  }
-  pRootLayoutItem = m_pPageSetLayoutItemRoot;
-  CXFA_ContainerLayoutItem* pNextLayout = NULL;
-  for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
-    pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
-    SaveLayoutItem(pRootLayoutItem);
-    delete pRootLayoutItem;
-  }
-  m_pPageSetLayoutItemRoot = NULL;
-}
diff --git a/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h b/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h
deleted file mode 100644
index 5f6607f..0000000
--- a/xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
-
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h"
-
-class CXFA_ContainerRecord {
- public:
-  CXFA_ContainerRecord(CXFA_ContainerLayoutItem* pPageSet = NULL,
-                       CXFA_ContainerLayoutItem* pPageArea = NULL,
-                       CXFA_ContainerLayoutItem* pContentArea = NULL)
-      : pCurPageSet(pPageSet),
-        pCurPageArea(pPageArea),
-        pCurContentArea(pContentArea) {}
-  CXFA_ContainerLayoutItem* pCurPageSet;
-  CXFA_ContainerLayoutItem* pCurPageArea;
-  CXFA_ContainerLayoutItem* pCurContentArea;
-};
-class CXFA_LayoutPageMgr {
- public:
-  CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor);
-  ~CXFA_LayoutPageMgr();
-  FX_BOOL InitLayoutPage(CXFA_Node* pFormNode);
-  FX_BOOL PrepareFirstPage(CXFA_Node* pRootSubform);
-  FX_FLOAT GetAvailHeight();
-  FX_BOOL GetNextAvailContentHeight(FX_FLOAT fChildHeight);
-  void SubmitContentItem(CXFA_ContentLayoutItem* pContentLayoutItem,
-                         XFA_ItemLayoutProcessorResult eStatus);
-  void FinishPaginatedPageSets();
-  void SyncLayoutData();
-  int32_t GetPageCount() const;
-  IXFA_LayoutPage* GetPage(int32_t index) const;
-  int32_t GetPageIndex(const IXFA_LayoutPage* pPage) const;
-  inline CXFA_ContainerLayoutItem* GetRootLayoutItem() const {
-    return m_pPageSetLayoutItemRoot;
-  }
-  FX_BOOL ProcessBreakBeforeOrAfter(CXFA_Node* pBreakNode,
-                                    FX_BOOL bBefore,
-                                    CXFA_Node*& pBreakLeaderNode,
-                                    CXFA_Node*& pBreakTrailerNode,
-                                    FX_BOOL& bCreatePage);
-  FX_BOOL ProcessOverflow(CXFA_Node* pFormNode,
-                          CXFA_Node*& pLeaderNode,
-                          CXFA_Node*& pTrailerNode,
-                          FX_BOOL bDataMerge = FALSE,
-                          FX_BOOL bCreatePage = TRUE);
-  CXFA_Node* QueryOverflow(CXFA_Node* pFormNode,
-                           CXFA_LayoutContext* pLayoutContext = NULL);
-  FX_BOOL ProcessBookendLeaderOrTrailer(CXFA_Node* pBookendNode,
-                                        FX_BOOL bLeader,
-                                        CXFA_Node*& pBookendAppendNode);
-  CXFA_LayoutItem* FindOrCreateLayoutItem(CXFA_Node* pFormNode);
-
- protected:
-  FX_BOOL AppendNewPage(FX_BOOL bFirstTemPage = FALSE);
-  void ReorderPendingLayoutRecordToTail(CXFA_ContainerRecord* pNewRecord,
-                                        CXFA_ContainerRecord* pPrevRecord);
-  void RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
-                          CXFA_ContainerRecord* pPrevRecord);
-  inline CXFA_ContainerRecord* GetCurrentContainerRecord() {
-    CXFA_ContainerRecord* result =
-        ((CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetAt(
-            m_pCurrentContainerRecord));
-    ASSERT(result);
-    return result;
-  }
-  CXFA_ContainerRecord* CreateContainerRecord(CXFA_Node* pPageNode = NULL,
-                                              FX_BOOL bCreateNew = FALSE);
-  void AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
-                             CXFA_Node* pNewPageArea);
-  void AddContentAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
-                                CXFA_Node* pContentArea);
-  FX_BOOL RunBreak(XFA_ELEMENT eBreakType,
-                   XFA_ATTRIBUTEENUM eTargetType,
-                   CXFA_Node* pTarget,
-                   FX_BOOL bStartNew);
-  CXFA_Node* BreakOverflow(CXFA_Node* pOverflowNode,
-                           CXFA_Node*& pLeaderTemplate,
-                           CXFA_Node*& pTrailerTemplate,
-                           FX_BOOL bCreatePage = TRUE);
-  FX_BOOL ResolveBookendLeaderOrTrailer(CXFA_Node* pBookendNode,
-                                        FX_BOOL bLeader,
-                                        CXFA_Node*& pBookendAppendTemplate);
-  FX_BOOL ExecuteBreakBeforeOrAfter(CXFA_Node* pCurNode,
-                                    FX_BOOL bBefore,
-                                    CXFA_Node*& pBreakLeaderTemplate,
-                                    CXFA_Node*& pBreakTrailerTemplate);
-
-  int32_t CreateMinPageRecord(CXFA_Node* pPageArea,
-                              FX_BOOL bTargetPageArea,
-                              FX_BOOL bCreateLast = FALSE);
-  void CreateMinPageSetRecord(CXFA_Node* pPageSet, FX_BOOL bCreateAll = FALSE);
-  void CreateNextMinRecord(CXFA_Node* pRecordNode);
-  FX_BOOL FindPageAreaFromPageSet(CXFA_Node* pPageSet,
-                                  CXFA_Node* pStartChild,
-                                  CXFA_Node* pTargetPageArea = NULL,
-                                  CXFA_Node* pTargetContentArea = NULL,
-                                  FX_BOOL bNewPage = FALSE,
-                                  FX_BOOL bQuery = FALSE);
-  FX_BOOL FindPageAreaFromPageSet_Ordered(CXFA_Node* pPageSet,
-                                          CXFA_Node* pStartChild,
-                                          CXFA_Node* pTargetPageArea = NULL,
-                                          CXFA_Node* pTargetContentArea = NULL,
-                                          FX_BOOL bNewPage = FALSE,
-                                          FX_BOOL bQuery = FALSE);
-  FX_BOOL FindPageAreaFromPageSet_SimplexDuplex(
-      CXFA_Node* pPageSet,
-      CXFA_Node* pStartChild,
-      CXFA_Node* pTargetPageArea = NULL,
-      CXFA_Node* pTargetContentArea = NULL,
-      FX_BOOL bNewPage = FALSE,
-      FX_BOOL bQuery = FALSE,
-      XFA_ATTRIBUTEENUM ePreferredPosition = XFA_ATTRIBUTEENUM_First);
-  FX_BOOL MatchPageAreaOddOrEven(CXFA_Node* pPageArea, FX_BOOL bLastMatch);
-  CXFA_Node* GetNextAvailPageArea(CXFA_Node* pTargetPageArea,
-                                  CXFA_Node* pTargetContentArea = NULL,
-                                  FX_BOOL bNewPage = FALSE,
-                                  FX_BOOL bQuery = FALSE);
-  FX_BOOL GetNextContentArea(CXFA_Node* pTargetContentArea);
-  void InitPageSetMap();
-  void ProcessLastPageSet();
-  inline FX_BOOL IsPageSetRootOrderedOccurrence() {
-    return m_ePageSetMode == XFA_ATTRIBUTEENUM_OrderedOccurrence;
-  }
-  void ClearData();
-  void ClearRecordList();
-  void MergePageSetContents();
-  void LayoutPageSetContents();
-  void PrepareLayout();
-  void SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem);
-  CXFA_LayoutProcessor* m_pLayoutProcessor;
-  CXFA_Node* m_pTemplatePageSetRoot;
-  CXFA_ContainerLayoutItem* m_pPageSetLayoutItemRoot;
-  CXFA_ContainerLayoutItem* m_pPageSetCurRoot;
-  FX_POSITION m_pCurrentContainerRecord;
-  CFX_PtrList m_rgProposedContainerRecord;
-  CXFA_Node* m_pCurPageArea;
-  int32_t m_nAvailPages;
-  int32_t m_nCurPageCount;
-  XFA_ATTRIBUTEENUM m_ePageSetMode;
-  FX_BOOL m_bCreateOverFlowPage;
-  CFX_MapPtrTemplate<CXFA_Node*, int32_t> m_pPageSetMap;
-  CFX_ArrayTemplate<CXFA_ContainerLayoutItem*> m_PageArray;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_
diff --git a/xfa/src/fxfa/parser/xfa_locale.cpp b/xfa/src/fxfa/parser/xfa_locale.cpp
deleted file mode 100644
index 5fc465f..0000000
--- a/xfa/src/fxfa/parser/xfa_locale.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_locale.h"
-
-#include "core/include/fxcrt/fx_xml.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-static const FX_WCHAR g_FX_Percent[] = L"z,zzz,zzz,zzz,zzz,zzz%";
-static const FX_WCHAR g_FX_Currency[] = L"$z,zzz,zzz,zzz,zzz,zz9.99";
-static const FX_WCHAR g_FX_Decimal[] = L"z,zzz,zzz,zzz,zzz,zz9.zzz";
-static const FX_WCHAR g_FX_Integer[] = L"z,zzz,zzz,zzz,zzz,zzz";
-
-CXFA_XMLLocale::CXFA_XMLLocale(CXML_Element* pLocaleData) {
-  m_pLocaleData = pLocaleData;
-}
-CXFA_XMLLocale::~CXFA_XMLLocale() {
-  if (m_pLocaleData) {
-    delete m_pLocaleData;
-  }
-}
-void CXFA_XMLLocale::Release() {
-  delete this;
-}
-CFX_WideString CXFA_XMLLocale::GetName() {
-  return m_pLocaleData ? m_pLocaleData->GetAttrValue("name") : CFX_WideString();
-}
-void CXFA_XMLLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                       CFX_WideString& wsNumSymbol) const {
-  CFX_ByteString bsSymbols;
-  CFX_WideString wsName;
-  switch (eType) {
-    case FX_LOCALENUMSYMBOL_Decimal:
-      bsSymbols = "numberSymbols";
-      wsName = FX_WSTRC(L"decimal");
-      break;
-    case FX_LOCALENUMSYMBOL_Grouping:
-      bsSymbols = "numberSymbols";
-      wsName = FX_WSTRC(L"grouping");
-      break;
-    case FX_LOCALENUMSYMBOL_Percent:
-      bsSymbols = "numberSymbols";
-      wsName = FX_WSTRC(L"percent");
-      break;
-    case FX_LOCALENUMSYMBOL_Minus:
-      bsSymbols = "numberSymbols";
-      wsName = FX_WSTRC(L"minus");
-      break;
-    case FX_LOCALENUMSYMBOL_Zero:
-      bsSymbols = "numberSymbols";
-      wsName = FX_WSTRC(L"zero");
-      break;
-    case FX_LOCALENUMSYMBOL_CurrencySymbol:
-      bsSymbols = "currencySymbols";
-      wsName = FX_WSTRC(L"symbol");
-      break;
-    case FX_LOCALENUMSYMBOL_CurrencyName:
-      bsSymbols = "currencySymbols";
-      wsName = FX_WSTRC(L"isoname");
-      break;
-    default:
-      return;
-  }
-  CXML_Element* pElement = m_pLocaleData->GetElement("", bsSymbols);
-  if (!pElement) {
-    return;
-  }
-  GetPattern(pElement, CFX_ByteStringC((const FX_CHAR*)bsSymbols,
-                                       bsSymbols.GetLength() - 1),
-             wsName, wsNumSymbol);
-}
-void CXFA_XMLLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
-  if (!m_pLocaleData) {
-    return;
-  }
-  CFX_ByteString bsSpace;
-  CXML_Element* pNumberSymbols =
-      m_pLocaleData->GetElement(bsSpace, "dateTimeSymbols");
-  if (!pNumberSymbols) {
-    return;
-  }
-  wsDtSymbol = pNumberSymbols->GetContent(0);
-}
-void CXFA_XMLLocale::GetMonthName(int32_t nMonth,
-                                  CFX_WideString& wsMonthName,
-                                  FX_BOOL bAbbr) const {
-  wsMonthName = GetCalendarSymbol("month", nMonth, bAbbr);
-}
-void CXFA_XMLLocale::GetDayName(int32_t nWeek,
-                                CFX_WideString& wsDayName,
-                                FX_BOOL bAbbr) const {
-  wsDayName = GetCalendarSymbol("day", nWeek, bAbbr);
-}
-void CXFA_XMLLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
-                                     FX_BOOL bAM) const {
-  wsMeridiemName = GetCalendarSymbol("meridiem", bAM ? 0 : 1, FALSE);
-}
-void CXFA_XMLLocale::GetTimeZone(FX_TIMEZONE& tz) const {
-  IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
-  pProvider->GetTimeZone(tz);
-}
-void CXFA_XMLLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
-  wsEraName = GetCalendarSymbol("era", bAD ? 1 : 0, FALSE);
-}
-CFX_WideString CXFA_XMLLocale::GetCalendarSymbol(const CFX_ByteStringC& symbol,
-                                                 int index,
-                                                 FX_BOOL bAbbr) const {
-  CFX_ByteString pstrSymbolNames = symbol + "Names";
-  CFX_WideString wsSymbolName = L"";
-  if (m_pLocaleData) {
-    CXML_Element* pChild = m_pLocaleData->GetElement("", "calendarSymbols");
-    if (pChild) {
-      CXML_Element* pSymbolNames = pChild->GetElement("", pstrSymbolNames);
-      if (pSymbolNames) {
-        if (pSymbolNames->GetAttrInteger("abbr") != bAbbr) {
-          pSymbolNames = pChild->GetElement("", pstrSymbolNames, 1);
-        }
-        if (pSymbolNames && pSymbolNames->GetAttrInteger("abbr") == bAbbr) {
-          CXML_Element* pSymbolName =
-              pSymbolNames->GetElement("", symbol, index);
-          if (pSymbolName) {
-            wsSymbolName = pSymbolName->GetContent(0);
-          }
-        }
-      }
-    }
-  }
-  return wsSymbolName;
-}
-void CXFA_XMLLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
-  CXML_Element* pElement = m_pLocaleData->GetElement("", "datePatterns");
-  if (pElement == NULL) {
-    return;
-  }
-  CFX_WideString wsName;
-  switch (eType) {
-    case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsName = L"short";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Default:
-    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
-      wsName = L"med";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsName = L"full";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsName = L"long";
-      break;
-  }
-  GetPattern(pElement, "datePattern", wsName, wsPattern);
-}
-void CXFA_XMLLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
-  CXML_Element* pElement = m_pLocaleData->GetElement("", "timePatterns");
-  if (pElement == NULL) {
-    return;
-  }
-  CFX_WideString wsName;
-  switch (eType) {
-    case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsName = L"short";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Default:
-    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
-      wsName = L"med";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsName = L"full";
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsName = L"long";
-      break;
-  }
-  GetPattern(pElement, "timePattern", wsName, wsPattern);
-}
-void CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                                   CFX_WideString& wsPattern) const {
-  CXML_Element* pElement = m_pLocaleData->GetElement("", "numberPatterns");
-  if (pElement == NULL) {
-    return;
-  }
-  switch (eType) {
-    case FX_LOCALENUMPATTERN_Percent:
-      wsPattern = g_FX_Percent;
-      break;
-    case FX_LOCALENUMPATTERN_Currency:
-      wsPattern = g_FX_Currency;
-      break;
-    case FX_LOCALENUMPATTERN_Decimal:
-      wsPattern = g_FX_Decimal;
-      break;
-    case FX_LOCALENUMPATTERN_Integer:
-      wsPattern = g_FX_Integer;
-      break;
-  }
-}
-void CXFA_XMLLocale::GetPattern(CXML_Element* pElement,
-                                const CFX_ByteStringC& bsTag,
-                                const CFX_WideStringC& wsName,
-                                CFX_WideString& wsPattern) const {
-  int32_t iCount = pElement->CountElements("", bsTag);
-  for (int32_t i = 0; i < iCount; i++) {
-    CXML_Element* pChild = pElement->GetElement("", bsTag, i);
-    if (pChild->GetAttrValue("name") == wsName) {
-      wsPattern = pChild->GetContent(0);
-      return;
-    }
-  }
-}
-CXFA_NodeLocale::CXFA_NodeLocale(CXFA_Node* pLocale) {
-  m_pLocale = pLocale;
-}
-CXFA_NodeLocale::~CXFA_NodeLocale() {}
-void CXFA_NodeLocale::Release() {
-  delete this;
-}
-CFX_WideString CXFA_NodeLocale::GetName() {
-  return m_pLocale ? m_pLocale->GetCData(XFA_ATTRIBUTE_Name) : NULL;
-}
-void CXFA_NodeLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                        CFX_WideString& wsNumSymbol) const {
-  switch (eType) {
-    case FX_LOCALENUMSYMBOL_Decimal:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"decimal"));
-      break;
-    case FX_LOCALENUMSYMBOL_Grouping:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"grouping"));
-      break;
-    case FX_LOCALENUMSYMBOL_Percent:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"percent"));
-      break;
-    case FX_LOCALENUMSYMBOL_Minus:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"minus"));
-      break;
-    case FX_LOCALENUMSYMBOL_Zero:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_NumberSymbols, FX_WSTRC(L"zero"));
-      break;
-    case FX_LOCALENUMSYMBOL_CurrencySymbol:
-      wsNumSymbol = GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"symbol"));
-      break;
-    case FX_LOCALENUMSYMBOL_CurrencyName:
-      wsNumSymbol =
-          GetSymbol(XFA_ELEMENT_CurrencySymbols, FX_WSTRC(L"isoname"));
-      break;
-  }
-}
-void CXFA_NodeLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
-  CXFA_Node* pSymbols =
-      m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_DateTimeSymbols) : NULL;
-  wsDtSymbol = pSymbols ? pSymbols->GetContent() : CFX_WideString();
-}
-void CXFA_NodeLocale::GetMonthName(int32_t nMonth,
-                                   CFX_WideString& wsMonthName,
-                                   FX_BOOL bAbbr) const {
-  wsMonthName = GetCalendarSymbol(XFA_ELEMENT_MonthNames, nMonth, bAbbr);
-}
-void CXFA_NodeLocale::GetDayName(int32_t nWeek,
-                                 CFX_WideString& wsDayName,
-                                 FX_BOOL bAbbr) const {
-  wsDayName = GetCalendarSymbol(XFA_ELEMENT_DayNames, nWeek, bAbbr);
-}
-void CXFA_NodeLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
-                                      FX_BOOL bAM) const {
-  wsMeridiemName =
-      GetCalendarSymbol(XFA_ELEMENT_MeridiemNames, bAM ? 0 : 1, FALSE);
-}
-void CXFA_NodeLocale::GetTimeZone(FX_TIMEZONE& tz) const {
-  IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();
-  pProvider->GetTimeZone(tz);
-}
-void CXFA_NodeLocale::GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD) const {
-  wsEraName = GetCalendarSymbol(XFA_ELEMENT_EraNames, bAD ? 1 : 0, FALSE);
-}
-void CXFA_NodeLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                     CFX_WideString& wsPattern) const {
-  switch (eType) {
-    case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"short"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
-    case FX_LOCALEDATETIMESUBCATEGORY_Default:
-      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"med"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"full"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsPattern = GetSymbol(XFA_ELEMENT_DatePatterns, FX_WSTRC(L"long"));
-      break;
-  }
-}
-void CXFA_NodeLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                     CFX_WideString& wsPattern) const {
-  switch (eType) {
-    case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"short"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Medium:
-    case FX_LOCALEDATETIMESUBCATEGORY_Default:
-      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"med"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"full"));
-      break;
-    case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsPattern = GetSymbol(XFA_ELEMENT_TimePatterns, FX_WSTRC(L"long"));
-      break;
-  }
-}
-void CXFA_NodeLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
-  switch (eType) {
-    case FX_LOCALENUMPATTERN_Percent:
-      wsPattern = g_FX_Percent;
-      break;
-    case FX_LOCALENUMPATTERN_Currency:
-      wsPattern = g_FX_Currency;
-      break;
-    case FX_LOCALENUMPATTERN_Decimal:
-      wsPattern = g_FX_Decimal;
-      break;
-    case FX_LOCALENUMPATTERN_Integer:
-      wsPattern = g_FX_Integer;
-      break;
-  }
-}
-CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node* pParent,
-                                          const CFX_WideStringC& wsName) const {
-  CXFA_Node* pChild =
-      pParent ? pParent->GetNodeItem(XFA_NODEITEM_FirstChild) : NULL;
-  while (pChild) {
-    CFX_WideString wsChild;
-    if (pChild->GetAttribute(XFA_ATTRIBUTE_Name, wsChild)) {
-      if (wsChild == wsName) {
-        return pChild;
-      }
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-CFX_WideString CXFA_NodeLocale::GetSymbol(
-    XFA_ELEMENT eElement,
-    const CFX_WideStringC& symbol_type) const {
-  CXFA_Node* pSymbols = m_pLocale ? m_pLocale->GetChild(0, eElement) : NULL;
-  CXFA_Node* pSymbol = GetNodeByName(pSymbols, symbol_type);
-  return pSymbol ? pSymbol->GetContent() : CFX_WideString();
-}
-CFX_WideString CXFA_NodeLocale::GetCalendarSymbol(XFA_ELEMENT eElement,
-                                                  int index,
-                                                  FX_BOOL bAbbr) const {
-  CXFA_Node* pCalendar =
-      m_pLocale ? m_pLocale->GetChild(0, XFA_ELEMENT_CalendarSymbols) : NULL;
-  if (pCalendar) {
-    CXFA_Node* pNode = pCalendar->GetFirstChildByClass(eElement);
-    for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) {
-      if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) {
-        CXFA_Node* pSymbol = pNode->GetChild(index, XFA_ELEMENT_UNKNOWN);
-        return pSymbol ? pSymbol->GetContent() : CFX_WideString();
-      }
-    }
-  }
-  return CFX_WideString();
-}
diff --git a/xfa/src/fxfa/parser/xfa_locale.h b/xfa/src/fxfa/parser/xfa_locale.h
deleted file mode 100644
index f4b128e..0000000
--- a/xfa/src/fxfa/parser/xfa_locale.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LOCALE_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LOCALE_H_
-
-#include "xfa/src/fgas/localization/fgas_locale.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CXFA_XMLLocale : public IFX_Locale {
- public:
-  CXFA_XMLLocale(CXML_Element* pLocaleData);
-  virtual void Release();
-  virtual CFX_WideString GetName();
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const;
-
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
-  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
-
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const;
-
- protected:
-  ~CXFA_XMLLocale();
-  void GetPattern(CXML_Element* pElement,
-                  const CFX_ByteStringC& bsTag,
-                  const CFX_WideStringC& wsName,
-                  CFX_WideString& wsPattern) const;
-  CFX_WideString GetCalendarSymbol(const CFX_ByteStringC& symbol,
-                                   int index,
-                                   FX_BOOL bAbbr) const;
-
- private:
-  CXML_Element* m_pLocaleData;
-};
-class CXFA_NodeLocale : public IFX_Locale {
- public:
-  CXFA_NodeLocale(CXFA_Node* pLocale);
-  virtual void Release();
-  virtual CFX_WideString GetName();
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const;
-
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
-  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
-
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const;
-
- protected:
-  ~CXFA_NodeLocale();
-  CXFA_Node* GetNodeByName(CXFA_Node* pParent,
-                           const CFX_WideStringC& wsName) const;
-  CFX_WideString GetSymbol(XFA_ELEMENT eElement,
-                           const CFX_WideStringC& symbol_type) const;
-  CFX_WideString GetCalendarSymbol(XFA_ELEMENT eElement,
-                                   int index,
-                                   FX_BOOL bAbbr) const;
-
-  CXFA_Node* m_pLocale;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LOCALE_H_
diff --git a/xfa/src/fxfa/parser/xfa_localemgr.cpp b/xfa/src/fxfa/parser/xfa_localemgr.cpp
deleted file mode 100644
index bb27c9c..0000000
--- a/xfa/src/fxfa/parser/xfa_localemgr.cpp
+++ /dev/null
@@ -1,1305 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-
-#include "core/include/fxcodec/fx_codec.h"
-#include "core/include/fxcrt/fx_xml.h"
-#include "core/include/fxge/fx_ge.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_locale.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-const uint8_t g_enUS_Locale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0x9B, 0x30, 0x14, 0x7D, 0x9F, 0xB4,
-    0x7F, 0x40, 0xD6, 0x2A, 0xB5, 0x52, 0x56, 0x6F, 0x8F, 0xA9, 0x88, 0xA5,
-    0x6C, 0x24, 0x9B, 0x3A, 0xD1, 0x55, 0x22, 0x55, 0xB5, 0xBE, 0x4C, 0x0E,
-    0xDC, 0x05, 0x34, 0xB0, 0x23, 0x83, 0x37, 0x05, 0xED, 0xE3, 0x67, 0x07,
-    0xC3, 0xC0, 0xF6, 0x24, 0xC2, 0x4B, 0x7C, 0xCF, 0x3D, 0xE7, 0xE6, 0xDE,
-    0x63, 0x30, 0x84, 0x25, 0x4F, 0x69, 0x09, 0x01, 0xA3, 0x15, 0xAC, 0x10,
-    0xB0, 0xEF, 0x4F, 0x09, 0x0A, 0x32, 0xA8, 0xD3, 0x15, 0xDA, 0xB0, 0x43,
-    0x59, 0xD4, 0xF9, 0xF5, 0xBA, 0x02, 0x51, 0xA4, 0xF4, 0x06, 0x91, 0x50,
-    0x53, 0x59, 0x46, 0x45, 0x72, 0xAA, 0xF6, 0xBC, 0xAC, 0x8D, 0xEA, 0x20,
-    0xE0, 0xC0, 0x45, 0x41, 0x99, 0x62, 0x54, 0x9C, 0x35, 0xF9, 0x83, 0x82,
-    0x6B, 0xB3, 0x26, 0xF7, 0x94, 0x49, 0x2A, 0x4E, 0x21, 0xEE, 0xC2, 0xD7,
-    0xAF, 0x0C, 0xBE, 0x85, 0xBD, 0xF0, 0x26, 0x62, 0x2A, 0xD2, 0xDC, 0x41,
-    0xD7, 0x47, 0x51, 0x94, 0x1E, 0xAE, 0xAB, 0xBF, 0x97, 0x0C, 0x3C, 0x60,
-    0xE9, 0x32, 0xD7, 0xF2, 0x20, 0xEB, 0xC6, 0x81, 0x13, 0x38, 0x36, 0x50,
-    0xED, 0x41, 0x38, 0x99, 0xAF, 0x69, 0xC3, 0x7D, 0xF8, 0x03, 0xFF, 0xE5,
-    0x17, 0x44, 0x90, 0xDA, 0x09, 0x3C, 0xB2, 0xA8, 0xE7, 0x9D, 0xA3, 0x80,
-    0xEE, 0xF7, 0x62, 0x85, 0xDE, 0xA3, 0x91, 0x73, 0x3E, 0xD7, 0x7C, 0x86,
-    0xF9, 0xEC, 0x9A, 0x6B, 0x96, 0xCF, 0x2B, 0x9F, 0x55, 0x3E, 0x9F, 0x7C,
-    0x0E, 0xF9, 0xDC, 0xF1, 0x19, 0xF3, 0x7F, 0x4F, 0x32, 0x7A, 0x32, 0xB7,
-    0x90, 0x5A, 0x91, 0x44, 0xAA, 0x5B, 0x4E, 0x75, 0xAE, 0xD7, 0x5D, 0x92,
-    0xC4, 0xDC, 0x81, 0x76, 0x12, 0x6A, 0x1B, 0x7B, 0x86, 0x8C, 0xB9, 0xE8,
-    0x2E, 0x97, 0xC2, 0x01, 0xB7, 0xA2, 0xB0, 0xA1, 0x84, 0x36, 0x52, 0x8C,
-    0x41, 0x3C, 0xF4, 0x35, 0xEA, 0x71, 0xB4, 0x6B, 0xA6, 0x59, 0xBB, 0x53,
-    0xBB, 0x4D, 0xBB, 0x45, 0xBB, 0x39, 0xBB, 0x2F, 0xBB, 0x29, 0x7F, 0x3F,
-    0xFA, 0x21, 0xCD, 0x0A, 0xA8, 0xFA, 0x67, 0xCF, 0x84, 0x64, 0x1D, 0x2B,
-    0x77, 0xFB, 0x60, 0xC4, 0x23, 0x8F, 0x56, 0x02, 0x4F, 0x2B, 0x28, 0x04,
-    0x04, 0x35, 0xD5, 0xD4, 0x8A, 0x7C, 0xF8, 0x18, 0x62, 0xFD, 0xDB, 0x25,
-    0xC8, 0x3A, 0x1A, 0x42, 0x3C, 0x10, 0x75, 0x60, 0x9D, 0x11, 0x5D, 0xE3,
-    0x0D, 0x3C, 0xD2, 0xA6, 0x01, 0xC1, 0xCE, 0x7B, 0x3A, 0x44, 0xE6, 0x00,
-    0xF9, 0x21, 0xCB, 0x12, 0x91, 0x8D, 0xBA, 0x16, 0x41, 0xAC, 0xAE, 0x20,
-    0x5A, 0x04, 0xDF, 0xD4, 0xA5, 0x27, 0x1C, 0xB8, 0x56, 0x21, 0x23, 0x2D,
-    0x39, 0x3B, 0x20, 0x72, 0xA1, 0xA8, 0x82, 0xEC, 0xAC, 0xB9, 0x40, 0x52,
-    0xE7, 0x5C, 0x34, 0x4A, 0x84, 0x23, 0xEC, 0xE1, 0xE3, 0xC9, 0x84, 0x0A,
-    0x68, 0x8A, 0x6A, 0x34, 0xF1, 0x28, 0x9A, 0x4C, 0x9C, 0xDF, 0xC5, 0xF1,
-    0x5D, 0x92, 0x04, 0xEB, 0xE0, 0x25, 0xC4, 0x23, 0x92, 0x55, 0x61, 0x32,
-    0xEA, 0x65, 0x9A, 0xF3, 0xA4, 0x83, 0x64, 0x86, 0xC0, 0xCC, 0xA9, 0x25,
-    0x1E, 0x3E, 0x9E, 0xCC, 0x65, 0x8C, 0xDA, 0x29, 0xAC, 0xDF, 0xEC, 0x4F,
-    0xA7, 0x38, 0xFB, 0xF9, 0xB9, 0xAA, 0x93, 0x4D, 0xB4, 0xFD, 0xFD, 0x4C,
-    0xF3, 0x2F, 0xED, 0x4B, 0x67, 0xCE, 0x98, 0xA4, 0x74, 0x4C, 0xEA, 0x53,
-    0xF1, 0x9F, 0x43, 0x93, 0xD8, 0xB4, 0xA2, 0x30, 0xFD, 0xE2, 0x41, 0xA4,
-    0x5D, 0xB4, 0xED, 0xF2, 0xB6, 0x6D, 0xDB, 0x10, 0x4F, 0x78, 0x4E, 0x21,
-    0x23, 0x4C, 0xA5, 0x10, 0xC0, 0xD2, 0x13, 0x22, 0x6F, 0x3A, 0xE9, 0x72,
-    0xF9, 0xE7, 0x7A, 0x58, 0xDE, 0xCC, 0xAC, 0x72, 0x04, 0x91, 0x02, 0x6B,
-    0xCC, 0xDF, 0x5F, 0x79, 0x54, 0xD8, 0x9A, 0x62, 0x28, 0xD4, 0x0F, 0x3A,
-    0x09, 0x4D, 0xD9, 0x0C, 0xD2, 0xA2, 0xA2, 0x6A, 0xF3, 0x6F, 0x7B, 0x7D,
-    0x97, 0xB6, 0xD5, 0xC3, 0xBB, 0x95, 0xCB, 0x63, 0xA1, 0x37, 0x7E, 0x31,
-    0x8B, 0x3F, 0x74, 0x7D, 0x35, 0x8B, 0x5E, 0x15, 0x4C, 0xD6, 0x88, 0xBC,
-    0x9D, 0x45, 0x6E, 0x41, 0x70, 0x44, 0xDE, 0xB9, 0x5C, 0x3C, 0x1D, 0x5B,
-    0x21, 0xFD, 0x16, 0x0C, 0x4E, 0x4C, 0x81, 0xFE, 0x66, 0x3B, 0x07, 0x6A,
-    0x9B, 0xD4, 0xA9, 0x31, 0xC9, 0xBB, 0x25, 0x8C, 0xA2, 0xA8, 0xB9, 0x5E,
-    0x20, 0xF2, 0x94, 0x44, 0xB3, 0x45, 0x63, 0xCB, 0x5D, 0x09, 0xB6, 0x7B,
-    0xD5, 0x58, 0xF7, 0x55, 0xA4, 0x96, 0x7F, 0x01, 0x75, 0x37, 0x1B, 0x8B,
-};
-const uint8_t g_enGB_Locale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6E, 0xD3, 0x30, 0x14, 0x7D, 0x47, 0xE2,
-    0x1F, 0xA2, 0x88, 0x49, 0x20, 0x6D, 0x33, 0x3C, 0x6E, 0xEA, 0x2C, 0x75,
-    0xEB, 0xD6, 0x32, 0xC8, 0xA8, 0x48, 0xC5, 0xC4, 0x5E, 0x90, 0x9B, 0x78,
-    0x8D, 0x59, 0x62, 0x57, 0x4E, 0xCC, 0x94, 0xFC, 0x02, 0x9F, 0xC0, 0x23,
-    0xCF, 0x08, 0xF1, 0x01, 0xBC, 0xF0, 0x2F, 0x48, 0xFB, 0x0C, 0x6E, 0x1A,
-    0x27, 0x4B, 0x1C, 0xAF, 0x64, 0x79, 0x89, 0xEF, 0xB9, 0xE7, 0xDC, 0xDE,
-    0x7B, 0x9C, 0xB8, 0x19, 0xC5, 0x22, 0x20, 0x31, 0x75, 0x38, 0x49, 0xE8,
-    0x91, 0x4B, 0xF9, 0xA7, 0xE9, 0xB1, 0xEB, 0x84, 0x34, 0x0D, 0x8E, 0xDC,
-    0xBB, 0xAF, 0xBF, 0xEE, 0x7E, 0xFE, 0x78, 0x0E, 0xB7, 0xBF, 0xDF, 0x7E,
-    0xBF, 0x70, 0xF1, 0xA8, 0x24, 0xF2, 0x90, 0x48, 0x3F, 0x4F, 0x96, 0x22,
-    0x4E, 0xB5, 0x66, 0x25, 0xE9, 0x4A, 0x48, 0x46, 0x38, 0x30, 0x12, 0xC1,
-    0xB3, 0xE8, 0x02, 0xE0, 0x54, 0xAF, 0xF1, 0x39, 0xE1, 0x8A, 0xC8, 0x7C,
-    0x84, 0xAA, 0xF0, 0xE9, 0x13, 0x8D, 0x9F, 0xD1, 0xA5, 0xB4, 0x26, 0x3C,
-    0x22, 0x83, 0xA8, 0x87, 0x8E, 0xD7, 0x92, 0xC5, 0x16, 0x6E, 0x5F, 0x7F,
-    0xAE, 0x38, 0xB5, 0x80, 0x71, 0x9F, 0x39, 0x56, 0x2B, 0x95, 0x66, 0x3D,
-    0xD8, 0xA7, 0xEB, 0x8C, 0x26, 0x4B, 0x2A, 0x7B, 0x99, 0x77, 0x41, 0x26,
-    0x6C, 0xF8, 0x85, 0xF8, 0x62, 0x17, 0x4C, 0x68, 0x60, 0x26, 0x50, 0xCB,
-    0xA2, 0x9A, 0xB7, 0x89, 0x1C, 0xB2, 0x5C, 0xCA, 0x23, 0xF7, 0x95, 0xDB,
-    0x72, 0xCE, 0xE6, 0x9A, 0xCD, 0x30, 0x9B, 0x5D, 0x43, 0xCD, 0xB2, 0x79,
-    0x65, 0xB3, 0xCA, 0xE6, 0x93, 0xCD, 0x21, 0x9B, 0x3B, 0x36, 0x63, 0x1E,
-    0xF6, 0x24, 0x24, 0xB9, 0x7E, 0x84, 0x60, 0x85, 0x7D, 0x05, 0x8F, 0x1C,
-    0x74, 0x5E, 0xAE, 0xAB, 0x24, 0xF6, 0x44, 0x0F, 0x5A, 0x28, 0x9A, 0x9A,
-    0xD8, 0x25, 0x0D, 0x79, 0x1F, 0x5D, 0x44, 0x4A, 0xF6, 0xC0, 0x33, 0xC9,
-    0x4C, 0xC8, 0x27, 0x99, 0x92, 0x6D, 0x10, 0x35, 0x7D, 0xB5, 0x7A, 0x6C,
-    0xED, 0x9A, 0x6E, 0xD6, 0xEC, 0xD4, 0x6C, 0xD3, 0x6C, 0xD1, 0x6C, 0xCE,
-    0xEC, 0xCB, 0x6C, 0xCA, 0xDE, 0x4F, 0x42, 0x61, 0x02, 0x46, 0x93, 0xFA,
-    0xDD, 0xD3, 0x21, 0x1E, 0x7B, 0xE0, 0x6E, 0x1D, 0xB4, 0x78, 0x78, 0x6E,
-    0x24, 0x50, 0xB7, 0x02, 0x20, 0x54, 0x12, 0x5D, 0x0D, 0x56, 0xF8, 0xF8,
-    0x64, 0x84, 0xCA, 0x7B, 0x95, 0xC0, 0xE3, 0x49, 0x13, 0xA2, 0x86, 0x58,
-    0x06, 0xC6, 0x19, 0x51, 0x35, 0x9E, 0xD1, 0x39, 0xC9, 0x32, 0x2A, 0xF9,
-    0x66, 0x4F, 0x9B, 0x48, 0x1F, 0x20, 0xD7, 0x2A, 0x8E, 0x5D, 0x7C, 0x0A,
-    0xD7, 0xAE, 0x33, 0x71, 0x3C, 0xB8, 0x9C, 0x8F, 0x70, 0x95, 0x03, 0x36,
-    0x54, 0xA3, 0x8E, 0x56, 0xC6, 0x82, 0xAF, 0x5C, 0xFC, 0x38, 0x4D, 0x42,
-    0x43, 0x2D, 0x19, 0xAA, 0x48, 0x23, 0x21, 0x33, 0xD0, 0x4C, 0x90, 0xE7,
-    0x21, 0xAB, 0x06, 0x75, 0x46, 0x04, 0x20, 0x63, 0x49, 0x6B, 0xE4, 0x56,
-    0xD4, 0x19, 0x79, 0x36, 0x3B, 0xF4, 0xBC, 0x43, 0xDF, 0x77, 0xAE, 0x46,
-    0xA8, 0xC5, 0x31, 0x0A, 0x74, 0x66, 0x7D, 0x94, 0x64, 0x33, 0x6A, 0xAD,
-    0x18, 0xC0, 0xD7, 0x83, 0x6E, 0x14, 0x3D, 0x3A, 0xEA, 0xCC, 0xA4, 0x8D,
-    0x5A, 0x00, 0x56, 0xEF, 0xF4, 0x34, 0xF7, 0xC2, 0x9B, 0x59, 0x92, 0xFA,
-    0xA7, 0x93, 0xB3, 0xDB, 0x4B, 0x12, 0xBD, 0x29, 0xAE, 0x2A, 0x63, 0xDA,
-    0x24, 0xD0, 0x71, 0x55, 0x1E, 0x89, 0xF7, 0xEE, 0x74, 0x62, 0xDD, 0x09,
-    0x60, 0xF0, 0x38, 0x06, 0x2E, 0x2E, 0x76, 0x8B, 0xE2, 0x60, 0xBF, 0x28,
-    0x8A, 0x11, 0xEA, 0xF0, 0x7A, 0x85, 0xB4, 0x30, 0x50, 0x52, 0x52, 0x1E,
-    0xE4, 0x2E, 0x7E, 0x56, 0x49, 0x0F, 0x0E, 0x06, 0x2A, 0xD7, 0x54, 0x06,
-    0x94, 0x67, 0xFA, 0x27, 0x77, 0x2C, 0x2A, 0x64, 0x74, 0xDE, 0x14, 0xAA,
-    0x87, 0xEB, 0x84, 0xBA, 0x6C, 0x48, 0x03, 0x96, 0x10, 0xD8, 0xEC, 0xFD,
-    0x5A, 0x5F, 0xA5, 0x4D, 0x75, 0xF3, 0x67, 0x2A, 0xD4, 0x9A, 0x95, 0x3B,
-    0xBD, 0x3B, 0x88, 0xDF, 0x74, 0xBD, 0x33, 0x88, 0x9E, 0x30, 0xAE, 0x52,
-    0x17, 0xEF, 0x0D, 0x22, 0x17, 0x54, 0x0A, 0x17, 0xBF, 0xEC, 0x73, 0x51,
-    0x77, 0x6C, 0x40, 0x6A, 0xDB, 0x1B, 0x27, 0xBA, 0x40, 0xFD, 0x7C, 0x6D,
-    0x02, 0x17, 0xFF, 0xF9, 0x0E, 0xE7, 0x44, 0x87, 0xD0, 0xAF, 0xA1, 0x25,
-    0x2C, 0x15, 0xE5, 0xC2, 0xC5, 0xD3, 0xE3, 0xF9, 0x60, 0x51, 0xDB, 0xF3,
-    0xBE, 0x04, 0x99, 0xCD, 0x96, 0xEF, 0x42, 0xBE, 0xA6, 0xD7, 0x24, 0x28,
-    0x0F, 0xBB, 0x7A, 0xA9, 0x6B, 0x79, 0x39, 0x7C, 0xDA, 0x84, 0xCE, 0x1C,
-    0xAC, 0x40, 0x6D, 0x66, 0x9D, 0x66, 0x9C, 0x09, 0xFE, 0x60, 0xFA, 0x44,
-    0x28, 0xC9, 0xA8, 0x74, 0xFC, 0x2C, 0xB4, 0xE6, 0xC7, 0x21, 0x7C, 0x50,
-    0x38, 0x73, 0xF6, 0x1F, 0xC2, 0x0C, 0x3E, 0x96, 0xE8, 0xED, 0x16, 0xC2,
-    0x58, 0x92, 0x25, 0xBC, 0x2E, 0x0F, 0x13, 0x16, 0x11, 0x61, 0xD6, 0xF4,
-    0x1B, 0x51, 0xA8, 0x1B, 0xE2, 0x4C, 0x45, 0x16, 0xB1, 0xA0, 0x9C, 0x63,
-    0xEF, 0xC3, 0x6B, 0xC7, 0xDB, 0x46, 0x85, 0x91, 0x83, 0x48, 0xD4, 0xD4,
-    0xF7, 0x5B, 0x7E, 0x14, 0x98, 0xAB, 0x72, 0x32, 0xE7, 0xED, 0x16, 0x92,
-    0x2F, 0x06, 0x90, 0xBC, 0x5C, 0xF1, 0xD5, 0x67, 0xB1, 0xE1, 0xE9, 0xE6,
-    0xD0, 0xFD, 0x9E, 0x95, 0x51, 0xF5, 0x19, 0x0B, 0xCB, 0x7F, 0x8E, 0x69,
-    0xAC, 0xD0};
-const uint8_t g_zhCN_Locale[] = {
-    0x78, 0x9C, 0xED, 0x56, 0x41, 0x4F, 0xD4, 0x40, 0x14, 0xBE, 0x9B, 0xF8,
-    0x1F, 0x9A, 0x46, 0x52, 0x4D, 0x58, 0x46, 0x8F, 0x90, 0xD2, 0x64, 0x03,
-    0x08, 0x06, 0xBB, 0x21, 0x96, 0x68, 0xE0, 0x62, 0xBA, 0xED, 0xB0, 0x2D,
-    0x6C, 0x3B, 0x64, 0xB6, 0x0D, 0x6E, 0x4F, 0x18, 0x82, 0x82, 0xC2, 0x45,
-    0x89, 0x9A, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x9E, 0x8C, 0x01, 0x22, 0xF1,
-    0xCF, 0xB0, 0xCB, 0x91, 0xBF, 0xE0, 0x9B, 0xED, 0xB4, 0xB4, 0xDD, 0xD9,
-    0xB5, 0x3F, 0xC0, 0x3D, 0xCD, 0xFB, 0xDE, 0xF7, 0x7D, 0xF3, 0xDE, 0xEB,
-    0x74, 0xB6, 0x6A, 0x93, 0x58, 0x66, 0x13, 0x4B, 0xBE, 0xE9, 0xE1, 0x49,
-    0x39, 0x72, 0x9E, 0x4F, 0xD5, 0x64, 0xC9, 0xC6, 0x2D, 0x6B, 0x52, 0xBE,
-    0x3C, 0x3D, 0xE9, 0x7E, 0x78, 0x7D, 0xF7, 0xEA, 0xC7, 0xE6, 0xE5, 0xC5,
-    0xFB, 0xEB, 0xDF, 0x7B, 0x10, 0x77, 0x0E, 0x2F, 0xEE, 0xC9, 0x9A, 0xCA,
-    0x14, 0xBE, 0x6D, 0x52, 0xA3, 0xED, 0xD5, 0x49, 0xB3, 0xC5, 0xC5, 0x0D,
-    0x8A, 0x1B, 0x84, 0xBA, 0xA6, 0x0F, 0x0C, 0x8F, 0xF8, 0x81, 0x53, 0x03,
-    0xB8, 0xC5, 0xD7, 0xDA, 0xE5, 0xE9, 0x66, 0xF7, 0x68, 0x47, 0x45, 0x71,
-    0x74, 0xFB, 0x56, 0x02, 0x9F, 0xEF, 0x09, 0xE1, 0xD3, 0x5D, 0x11, 0xDC,
-    0x39, 0x3C, 0x14, 0x9B, 0x1C, 0x08, 0xD9, 0xDB, 0x27, 0x62, 0xEF, 0x2D,
-    0x31, 0xFB, 0x9B, 0x90, 0x7D, 0xF6, 0x59, 0xC8, 0xDE, 0x7F, 0x39, 0x00,
-    0x1E, 0xD0, 0x28, 0xCB, 0x14, 0x7B, 0x45, 0x99, 0x31, 0x25, 0xC4, 0x5E,
-    0x24, 0x99, 0xF5, 0x3A, 0x9D, 0x94, 0x1F, 0xC8, 0xFF, 0xA7, 0x57, 0x7A,
-    0x7A, 0xB6, 0xD9, 0xE6, 0x07, 0x0E, 0x56, 0x5A, 0xF7, 0xD3, 0x71, 0xF7,
-    0xE8, 0xB8, 0xFB, 0xF1, 0x8B, 0x8A, 0x58, 0x18, 0xE7, 0x39, 0x0A, 0x7B,
-    0x88, 0xD0, 0xF3, 0x3D, 0x21, 0x77, 0x57, 0x80, 0xC2, 0x24, 0x85, 0x0E,
-    0x07, 0x22, 0xEE, 0xF6, 0x49, 0x8A, 0xA2, 0xB4, 0xC8, 0x4C, 0xC1, 0x99,
-    0x87, 0xDD, 0x53, 0x15, 0x6A, 0x2E, 0x56, 0x5B, 0xAC, 0xB3, 0x58, 0x61,
-    0xB1, 0xB6, 0x62, 0x55, 0x03, 0xEB, 0xF1, 0x30, 0x75, 0x6D, 0x17, 0x7B,
-    0xC9, 0x6B, 0xCB, 0x43, 0xD8, 0xE0, 0x4D, 0x67, 0x9F, 0x0D, 0x3E, 0x01,
-    0x32, 0x5C, 0x48, 0xBE, 0xED, 0x4B, 0xA2, 0xBC, 0x13, 0x20, 0x98, 0x9A,
-    0xDC, 0x15, 0x56, 0x50, 0xC1, 0xF7, 0xCE, 0xF6, 0x56, 0x67, 0x77, 0x5F,
-    0x45, 0x2C, 0x8C, 0xF3, 0x1C, 0x4D, 0x21, 0x94, 0x6A, 0x58, 0x50, 0xB8,
-    0x71, 0xE2, 0x5E, 0x02, 0xBC, 0x60, 0x06, 0x01, 0xA6, 0x7E, 0xEF, 0x99,
-    0xA7, 0x11, 0xBF, 0x8E, 0x56, 0xC2, 0x66, 0x53, 0xD6, 0x96, 0xE0, 0xA7,
-    0x74, 0xCE, 0x7E, 0x2A, 0xBA, 0x02, 0xA7, 0x47, 0x99, 0x56, 0x60, 0xBC,
-    0xCA, 0x0C, 0xFC, 0x58, 0xEF, 0xA9, 0xA4, 0xE0, 0xC7, 0x1D, 0x9A, 0xC4,
-    0x6F, 0x0C, 0x70, 0x28, 0xA1, 0xF6, 0xB0, 0x1D, 0x8B, 0x2B, 0x7A, 0x65,
-    0xBA, 0x04, 0xBF, 0xE5, 0x10, 0x1A, 0x30, 0x85, 0x90, 0x8F, 0x72, 0xED,
-    0x02, 0x10, 0xB8, 0x5E, 0xA6, 0xFD, 0x4C, 0x94, 0x6B, 0xBF, 0xEA, 0x38,
-    0x50, 0xEF, 0x2F, 0x45, 0xD7, 0x95, 0xCE, 0xCE, 0x2B, 0xC5, 0x30, 0x94,
-    0xAB, 0xAF, 0xEF, 0x14, 0x69, 0x59, 0x45, 0x19, 0x45, 0xC1, 0x2E, 0xD7,
-    0xBD, 0xD8, 0xA0, 0x84, 0xBC, 0xD7, 0x3E, 0xA8, 0x27, 0x74, 0x7D, 0xC2,
-    0x30, 0x4A, 0x08, 0x78, 0xFF, 0x55, 0xA6, 0xE8, 0xA3, 0xA3, 0x5C, 0xBB,
-    0x7C, 0x7E, 0x8B, 0x80, 0x25, 0x07, 0x62, 0xD6, 0xF4, 0x57, 0xD7, 0xE6,
-    0xBC, 0x96, 0x31, 0x33, 0xFD, 0x70, 0xE3, 0xD9, 0x0B, 0x67, 0x3E, 0x5A,
-    0x8E, 0x67, 0x96, 0x25, 0x81, 0xCE, 0x0F, 0xBD, 0x3A, 0xA6, 0x37, 0x83,
-    0xCB, 0xC5, 0xBC, 0x12, 0xC0, 0xE0, 0x00, 0x5B, 0xB2, 0x16, 0x8D, 0x46,
-    0xD1, 0xF8, 0x58, 0x14, 0x45, 0x2A, 0xCA, 0xF1, 0xFA, 0x8C, 0xB8, 0xD0,
-    0x0A, 0x29, 0xC5, 0xBE, 0xD5, 0x96, 0xB5, 0x3B, 0xB1, 0x74, 0x7C, 0xBC,
-    0xA4, 0x72, 0x1D, 0x53, 0x0B, 0xFB, 0x01, 0xDF, 0x72, 0x44, 0xA0, 0x42,
-    0x85, 0xCA, 0x53, 0xA3, 0xA4, 0xB9, 0x5C, 0xC8, 0x6D, 0x6D, 0x6C, 0xB9,
-    0x9E, 0x09, 0xE7, 0x60, 0x2C, 0xD1, 0xC7, 0xE9, 0xA2, 0x3A, 0xFD, 0x07,
-    0x27, 0xE1, 0xBA, 0xCB, 0x1E, 0xFB, 0x68, 0x29, 0x7E, 0x5A, 0xF5, 0x48,
-    0x29, 0xBA, 0xE7, 0xFA, 0x61, 0x4B, 0xD6, 0x2A, 0xA5, 0xC8, 0x11, 0xA6,
-    0x44, 0xD6, 0xEE, 0xF7, 0x73, 0x51, 0xBE, 0x6D, 0x40, 0x92, 0xB1, 0xA7,
-    0x93, 0xC8, 0x03, 0xC9, 0xF9, 0xEA, 0x05, 0xB2, 0x76, 0xFD, 0x07, 0xEE,
-    0xD7, 0x3C, 0xA3, 0xDF, 0x84, 0x6B, 0xDC, 0x16, 0x61, 0x0B, 0x59, 0x9B,
-    0xAA, 0x2D, 0x95, 0x16, 0x65, 0x87, 0xDE, 0x2F, 0x41, 0xC5, 0x6A, 0xD9,
-    0xCB, 0xD0, 0x5E, 0xC7, 0x2B, 0xA6, 0xC5, 0xEE, 0xC7, 0x64, 0xC9, 0xBD,
-    0xAA, 0x36, 0xA9, 0x63, 0xC9, 0x80, 0x57, 0x51, 0x32, 0x02, 0x5B, 0x7A,
-    0x2C, 0xA3, 0x2C, 0x9F, 0x93, 0xF4, 0x36, 0x7C, 0x75, 0xD9, 0xD2, 0x02,
-    0x0C, 0x4C, 0x98, 0x76, 0x7D, 0x97, 0xF8, 0x03, 0xD3, 0x53, 0x24, 0xA4,
-    0x2E, 0xA6, 0xCC, 0x5F, 0x98, 0x8F, 0x4B, 0x58, 0x70, 0xFF, 0x41, 0x98,
-    0xC3, 0x75, 0x8A, 0x37, 0x86, 0x10, 0xAA, 0xD4, 0xAC, 0xC3, 0x4B, 0x35,
-    0x98, 0xB0, 0xE8, 0x98, 0xAE, 0x30, 0x3D, 0x4F, 0xA2, 0x70, 0xCD, 0x94,
-    0x66, 0x49, 0xE0, 0xB8, 0x16, 0xEB, 0xA3, 0xF2, 0xF4, 0x91, 0xA4, 0x0F,
-    0xA3, 0x42, 0xCB, 0x96, 0x43, 0x12, 0xEA, 0x93, 0x21, 0x9B, 0x02, 0x73,
-    0xD8, 0x68, 0x39, 0xA9, 0x1D, 0xFA, 0x8D, 0x55, 0xD2, 0xE3, 0xF1, 0x7D,
-    0xD1, 0xCD, 0x33, 0x63, 0x51, 0xFC, 0x15, 0x0D, 0xCB, 0xBF, 0xC0, 0xE4,
-    0x3D, 0x40};
-const uint8_t g_zhTW_Locale[] = {
-    0x78, 0x9C, 0xED, 0x57, 0xCD, 0x4F, 0xD4, 0x40, 0x14, 0x3F, 0x63, 0xE2,
-    0xFF, 0x30, 0x69, 0x20, 0xD5, 0x04, 0xA8, 0x1E, 0x21, 0xA5, 0xC9, 0xC6,
-    0x45, 0x30, 0x58, 0x42, 0xEC, 0x46, 0x22, 0x17, 0x33, 0xDB, 0x0E, 0xDB,
-    0xC2, 0xB6, 0x43, 0x66, 0xDB, 0xC0, 0xF6, 0x24, 0x12, 0x14, 0x14, 0x62,
-    0xA2, 0xC4, 0x8F, 0x80, 0xE1, 0x64, 0x3C, 0x28, 0x89, 0x07, 0x0F, 0x2C,
-    0x51, 0xFF, 0x1A, 0x76, 0x39, 0xFA, 0x2F, 0x38, 0xD3, 0x2F, 0xFA, 0xB1,
-    0xB3, 0xD4, 0xC4, 0xA3, 0x7B, 0x9A, 0xF7, 0xDE, 0xEF, 0xF7, 0xE6, 0xBD,
-    0xDF, 0xBC, 0x7D, 0xD9, 0x95, 0x9B, 0x58, 0x87, 0x4D, 0x04, 0x1C, 0x68,
-    0xA3, 0x29, 0xC1, 0x37, 0x1F, 0xD7, 0x16, 0x05, 0x60, 0xA0, 0x96, 0x3E,
-    0x25, 0x9C, 0x9F, 0x9E, 0xF4, 0xDE, 0x3E, 0xBF, 0x71, 0xD1, 0xD9, 0x3C,
-    0xFF, 0xF9, 0xE6, 0xF7, 0x8F, 0xBD, 0xEE, 0xAB, 0x6F, 0xBD, 0xCE, 0xAF,
-    0x9B, 0x82, 0x72, 0xFD, 0x1A, 0x00, 0x32, 0x63, 0x39, 0x06, 0x24, 0x5A,
-    0xDB, 0xAE, 0xE3, 0x66, 0x2B, 0x4A, 0xD0, 0x20, 0xA8, 0x81, 0x89, 0x05,
-    0x1D, 0x86, 0x1A, 0x02, 0xB2, 0x8D, 0x1D, 0xD7, 0x9C, 0xA7, 0xA1, 0x16,
-    0xB3, 0x87, 0x42, 0x5B, 0x39, 0x3F, 0x7D, 0xD2, 0x3B, 0xDA, 0x91, 0xA5,
-    0xD0, 0x4A, 0x07, 0xCE, 0xF6, 0x38, 0x81, 0xD3, 0xDD, 0xFE, 0x81, 0xEE,
-    0xE1, 0x21, 0x2F, 0xD5, 0x01, 0x87, 0xB1, 0x7D, 0xC2, 0xBB, 0x63, 0x8B,
-    0xC7, 0xF8, 0xC2, 0x61, 0x74, 0x3E, 0x72, 0x18, 0xFB, 0x9B, 0xDC, 0x00,
-    0xB7, 0x79, 0x16, 0xCB, 0xF7, 0x0F, 0xA2, 0x73, 0x22, 0x61, 0x5A, 0x52,
-    0x00, 0xEB, 0x75, 0x32, 0x25, 0xDC, 0x16, 0xFE, 0x6B, 0xFB, 0x8F, 0xB4,
-    0x35, 0x60, 0x3B, 0x35, 0xAC, 0xD4, 0x52, 0x7A, 0xEF, 0x8F, 0x7B, 0x47,
-    0xC7, 0xBD, 0x77, 0x9F, 0x64, 0x89, 0x99, 0x39, 0x3F, 0xBD, 0xAF, 0xBF,
-    0xFF, 0x6C, 0x8F, 0x83, 0xDF, 0xED, 0xEB, 0xA7, 0x4A, 0x73, 0xF2, 0x1C,
-    0xF4, 0xC7, 0x6F, 0x9F, 0x24, 0x7E, 0x10, 0x9C, 0xFA, 0x34, 0x91, 0x1B,
-    0x8F, 0x80, 0x5D, 0xE8, 0xA3, 0xD8, 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5,
-    0x7A, 0x8B, 0x95, 0x0E, 0xAC, 0xD1, 0x46, 0xC4, 0x32, 0x2C, 0x64, 0xA7,
-    0x57, 0x43, 0xE4, 0xA2, 0xD7, 0xBD, 0xE8, 0xEE, 0xB3, 0x87, 0x8A, 0x1D,
-    0xF9, 0xF0, 0xCB, 0x42, 0x18, 0x5C, 0x9A, 0xA9, 0x4B, 0x10, 0x81, 0xA9,
-    0xFC, 0xD4, 0xA2, 0x35, 0x7D, 0xED, 0x6E, 0x6F, 0x75, 0x77, 0xF7, 0x65,
-    0x89, 0x99, 0x39, 0x7F, 0xE2, 0x04, 0xC1, 0x29, 0xE6, 0xD2, 0x65, 0x27,
-    0xE5, 0xB6, 0x5D, 0xE8, 0x35, 0xA0, 0x8B, 0x16, 0xA0, 0xEB, 0x22, 0xE2,
-    0x24, 0xD2, 0x27, 0x9E, 0x68, 0x21, 0x2E, 0x7B, 0xCD, 0xA6, 0xA0, 0x3C,
-    0xA2, 0x1F, 0xB1, 0xDB, 0xF9, 0x2E, 0xAA, 0x22, 0x9D, 0x41, 0xB1, 0x2A,
-    0xD2, 0x87, 0x10, 0xA7, 0xE9, 0x87, 0xE9, 0x92, 0x50, 0x78, 0x39, 0x9A,
-    0xD8, 0x69, 0x70, 0x72, 0x94, 0xE2, 0xDB, 0xC8, 0x08, 0xE9, 0x92, 0x2A,
-    0x55, 0x4B, 0x31, 0x5A, 0x26, 0x26, 0x2E, 0x9F, 0x03, 0x40, 0xC6, 0x13,
-    0xC9, 0xE1, 0x5A, 0x76, 0x4E, 0x8E, 0x94, 0x27, 0x23, 0x47, 0xC5, 0x34,
-    0xC5, 0xDE, 0x87, 0xA7, 0xA2, 0xAA, 0x8A, 0xDD, 0x9D, 0x67, 0xA2, 0xA6,
-    0x89, 0x17, 0x9F, 0x5F, 0x8B, 0x60, 0x49, 0x96, 0x52, 0x0C, 0x5E, 0x8A,
-    0x50, 0x8D, 0xFE, 0x29, 0x4A, 0x25, 0x08, 0xE4, 0xA8, 0x00, 0x73, 0x52,
-    0x55, 0x27, 0x35, 0xAD, 0x14, 0x25, 0xD2, 0x23, 0x24, 0xE5, 0x19, 0x4C,
-    0x8D, 0x5C, 0xEF, 0xD1, 0x70, 0xD4, 0xA8, 0x37, 0x9E, 0x98, 0x19, 0xE8,
-    0xAC, 0xAC, 0xCE, 0xDA, 0x2D, 0x6D, 0xBA, 0x7A, 0x77, 0x7D, 0x71, 0xC3,
-    0x9C, 0xF3, 0x97, 0x42, 0x11, 0xD3, 0xA0, 0x80, 0xE9, 0x78, 0x76, 0x1D,
-    0x91, 0xAC, 0x92, 0x19, 0x5F, 0x54, 0x14, 0xF5, 0xD1, 0x99, 0xD7, 0x05,
-    0xC5, 0x1F, 0xF5, 0xFD, 0x89, 0x71, 0xDF, 0xF7, 0x65, 0x29, 0x83, 0xE3,
-    0x53, 0x75, 0x8F, 0x10, 0xE4, 0xE8, 0x6D, 0x41, 0x19, 0x0E, 0xC9, 0x13,
-    0x13, 0xA5, 0xB9, 0x6B, 0x88, 0xE8, 0xC8, 0x71, 0xA3, 0x6B, 0x47, 0x8A,
-    0x3C, 0xA6, 0x47, 0xA1, 0x87, 0xA4, 0xAF, 0xCB, 0x56, 0x87, 0xB2, 0xAE,
-    0x28, 0xBD, 0x81, 0x74, 0xCB, 0x86, 0x74, 0x48, 0xC6, 0xE3, 0x2C, 0x61,
-    0x98, 0x4B, 0x68, 0x10, 0xEC, 0xAD, 0x59, 0x6C, 0x26, 0x46, 0x4B, 0x32,
-    0x92, 0x0E, 0x46, 0x4A, 0x12, 0x6C, 0xCB, 0xF1, 0x5A, 0x82, 0x32, 0x56,
-    0x12, 0xEE, 0x23, 0x82, 0x05, 0xE5, 0x56, 0x01, 0x7D, 0x29, 0x4C, 0xE6,
-    0xBD, 0xE3, 0xC7, 0xC8, 0x28, 0x93, 0x75, 0xC6, 0x63, 0x18, 0x18, 0x82,
-    0x32, 0x5F, 0x1B, 0xA6, 0x2B, 0x29, 0x83, 0x18, 0xC0, 0xB2, 0x5A, 0x98,
-    0x1D, 0x04, 0xA5, 0xB6, 0x58, 0xFD, 0x0B, 0x5A, 0xFA, 0x21, 0x0A, 0xA4,
-    0x60, 0x27, 0x16, 0xEA, 0x66, 0x4B, 0xA0, 0xBD, 0x86, 0x96, 0xA1, 0x1E,
-    0xAF, 0xE0, 0xD8, 0x8C, 0x72, 0x56, 0x0C, 0x5C, 0x47, 0x40, 0xA5, 0xAF,
-    0x05, 0x34, 0xD7, 0x00, 0xF7, 0x05, 0xA9, 0x2F, 0x4C, 0x6D, 0xD3, 0x9F,
-    0x90, 0x06, 0x58, 0xA0, 0x32, 0x72, 0x00, 0x96, 0x63, 0x61, 0x67, 0x00,
-    0xE0, 0x0E, 0xF6, 0x88, 0x85, 0x08, 0xBB, 0x85, 0x83, 0x08, 0x4B, 0x59,
-    0xB0, 0xAE, 0x84, 0xCC, 0xA2, 0x3A, 0x41, 0xEB, 0x03, 0x21, 0x15, 0x02,
-    0xEB, 0xF4, 0x8B, 0x38, 0x08, 0x52, 0x33, 0xA1, 0xC5, 0x01, 0xCC, 0x61,
-    0xDF, 0x5B, 0x85, 0x60, 0x06, 0xBB, 0xA6, 0xA5, 0xB3, 0x9E, 0xC6, 0x1E,
-    0xDE, 0x03, 0xEA, 0x60, 0x30, 0x15, 0x40, 0x37, 0x71, 0x0C, 0x7E, 0x30,
-    0xF0, 0x6A, 0x0D, 0x5F, 0x21, 0x77, 0xF4, 0x2A, 0x6D, 0xCF, 0x69, 0xAC,
-    0xE0, 0x00, 0x19, 0xDE, 0x1E, 0x2C, 0xB6, 0xD4, 0x7B, 0xCA, 0x52, 0xF8,
-    0x67, 0x41, 0xF9, 0x03, 0x11, 0xC2, 0x4A, 0xC9};
-const uint8_t g_zhHK_Locale[] = {
-    0x78, 0x9C, 0xA5, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2,
-    0x7F, 0x98, 0x6C, 0x20, 0x0B, 0x09, 0x50, 0x8A, 0x9F, 0x25, 0xCB, 0x26,
-    0x44, 0x90, 0x9A, 0x5A, 0x43, 0x2C, 0xD1, 0xC8, 0xC5, 0x6C, 0x77, 0x87,
-    0xEE, 0x42, 0x77, 0x87, 0x4C, 0xB7, 0xC1, 0x6E, 0x3C, 0x88, 0x04, 0xA5,
-    0x5A, 0x2E, 0x4A, 0x54, 0x02, 0x86, 0x78, 0x50, 0x0F, 0x48, 0xBC, 0x78,
-    0x68, 0x89, 0xC6, 0x3F, 0x43, 0x8B, 0x9E, 0xFC, 0x0B, 0xCE, 0xEC, 0x17,
-    0xFB, 0x35, 0x6D, 0x8D, 0x3D, 0xCD, 0xFB, 0xBC, 0xCF, 0xF3, 0xCE, 0xFB,
-    0x3E, 0x33, 0x3B, 0x01, 0xA1, 0x8C, 0x64, 0xA9, 0x0C, 0x81, 0x21, 0xE9,
-    0x70, 0x9A, 0xB3, 0xD4, 0x87, 0xD9, 0x1C, 0x07, 0x14, 0x58, 0x91, 0xA7,
-    0xB9, 0xD3, 0xE6, 0x71, 0xE7, 0xCD, 0xF3, 0xE1, 0xB3, 0xD6, 0xC6, 0xE9,
-    0x8F, 0xD7, 0x7F, 0xBE, 0x37, 0x7E, 0x7F, 0xDA, 0xEB, 0x34, 0xBF, 0x9E,
-    0xD5, 0x5B, 0xED, 0xED, 0xA3, 0x5F, 0x1F, 0x1A, 0x9D, 0xDD, 0x9F, 0xED,
-    0xC6, 0xC9, 0x08, 0x27, 0x5E, 0xBC, 0x00, 0x80, 0x40, 0x8B, 0x18, 0x8A,
-    0x84, 0x0B, 0x35, 0xBD, 0x88, 0xCA, 0x15, 0xB7, 0x5E, 0x09, 0xC3, 0x12,
-    0xC2, 0x9A, 0x64, 0x50, 0xD6, 0x00, 0x10, 0x74, 0x64, 0x98, 0xEA, 0x1D,
-    0x92, 0xAA, 0xD0, 0x78, 0xC0, 0x89, 0xC5, 0xD3, 0xE6, 0x93, 0xCE, 0xC1,
-    0xB6, 0x90, 0x72, 0xA2, 0x60, 0xE2, 0xA4, 0xC1, 0x48, 0x34, 0xEB, 0xC9,
-    0x89, 0xF6, 0xFE, 0x3E, 0xAB, 0xD4, 0x2E, 0x43, 0xB1, 0x75, 0xCC, 0xDA,
-    0x63, 0x93, 0xA5, 0x38, 0x62, 0x28, 0x5A, 0xEF, 0x19, 0x8A, 0x9D, 0x0D,
-    0x66, 0x82, 0x39, 0x3C, 0xCD, 0x45, 0xE7, 0x07, 0xEE, 0xDA, 0xB7, 0x30,
-    0x68, 0x29, 0x90, 0x8A, 0x45, 0x3C, 0xCD, 0xA5, 0xB9, 0x60, 0x95, 0x74,
-    0x72, 0xF1, 0xC9, 0x64, 0xF8, 0x52, 0x32, 0x7C, 0x39, 0x19, 0xBE, 0x92,
-    0x0C, 0x5F, 0x4D, 0x86, 0xAF, 0x25, 0xC3, 0xD7, 0x93, 0xE1, 0x4C, 0x32,
-    0x9C, 0x9E, 0x60, 0xE0, 0x8C, 0x39, 0xD3, 0x93, 0x3D, 0x0D, 0x54, 0xA4,
-    0x5A, 0xE0, 0x46, 0x92, 0x48, 0xEC, 0xBC, 0x3B, 0xEC, 0x1C, 0x1C, 0x76,
-    0xDE, 0x7E, 0x14, 0x52, 0x34, 0x8C, 0xE0, 0xE4, 0xC0, 0x92, 0xF1, 0x93,
-    0x06, 0x83, 0x5F, 0x4F, 0xC4, 0xC9, 0x55, 0x65, 0xD4, 0xD9, 0x4D, 0xE6,
-    0x6F, 0x1D, 0xFB, 0x38, 0xB0, 0x57, 0x09, 0x43, 0x44, 0xEE, 0x80, 0xAD,
-    0x8E, 0xCD, 0x11, 0x9F, 0x20, 0xDE, 0x7B, 0xBC, 0xEB, 0x78, 0xBF, 0xF1,
-    0x4E, 0xBB, 0xF6, 0xA8, 0x43, 0xAC, 0x29, 0x1A, 0xD4, 0x83, 0xDF, 0xBF,
-    0x0B, 0x91, 0xED, 0x5E, 0xB4, 0x77, 0xE8, 0x41, 0x79, 0x40, 0x34, 0xFD,
-    0x32, 0x96, 0x06, 0xE7, 0x61, 0x60, 0x13, 0x88, 0xA5, 0x40, 0x7D, 0x12,
-    0x91, 0x9E, 0xBE, 0xB4, 0xB7, 0x36, 0xDB, 0xF5, 0x1D, 0x21, 0x45, 0xC3,
-    0x08, 0xEE, 0x83, 0xC0, 0x5E, 0x79, 0x5A, 0xF2, 0xA2, 0xA5, 0x22, 0x4F,
-    0x9A, 0x83, 0x2A, 0x92, 0x09, 0x17, 0x24, 0xD3, 0x84, 0xD8, 0xF0, 0xAD,
-    0xF7, 0x11, 0xF7, 0xD5, 0x5B, 0xAE, 0x96, 0xCB, 0x9C, 0xF8, 0x80, 0xFC,
-    0xF8, 0x76, 0xEB, 0x1B, 0x9F, 0xE7, 0xC9, 0x1D, 0xE4, 0x67, 0x79, 0x72,
-    0x10, 0x3C, 0x98, 0x23, 0x3F, 0x6A, 0x8C, 0xAF, 0x61, 0x15, 0x29, 0x23,
-    0xA3, 0xC4, 0x28, 0xD2, 0x97, 0x5E, 0x87, 0xCA, 0xFF, 0xC8, 0x2B, 0x2A,
-    0xC2, 0x26, 0x2D, 0xD0, 0x53, 0x0E, 0x40, 0x08, 0x71, 0x7D, 0x32, 0x35,
-    0x3D, 0xE2, 0x53, 0x00, 0x09, 0xF9, 0x34, 0xA3, 0xAA, 0x7C, 0x67, 0xEF,
-    0x29, 0x9F, 0xCF, 0xF3, 0xED, 0xED, 0x67, 0x7C, 0xA1, 0xC0, 0x9F, 0x7D,
-    0x7E, 0xC5, 0x83, 0x25, 0x21, 0x15, 0x50, 0xB0, 0x4A, 0x38, 0x2E, 0x25,
-    0x97, 0xE8, 0xAB, 0x80, 0x6D, 0x13, 0xD1, 0x4F, 0xE5, 0xF3, 0x53, 0x85,
-    0x42, 0x5F, 0x12, 0xD7, 0x9A, 0x19, 0xAA, 0x89, 0x0A, 0xA8, 0x19, 0x91,
-    0xD1, 0xDD, 0x4B, 0xB3, 0x48, 0x50, 0xEF, 0x26, 0xCD, 0x4B, 0xC6, 0xCA,
-    0x6A, 0x56, 0xAF, 0x14, 0xE6, 0x66, 0x6F, 0xAE, 0xDF, 0x7F, 0xA4, 0xE6,
-    0xAC, 0x25, 0xC7, 0xC3, 0x20, 0xC9, 0x56, 0x1A, 0x55, 0xBD, 0x08, 0x71,
-    0xD8, 0xC8, 0x10, 0xE6, 0xF6, 0x44, 0x30, 0xF2, 0x2D, 0xC8, 0x9C, 0x68,
-    0x8D, 0x5A, 0x56, 0x66, 0xDC, 0xB2, 0x2C, 0x21, 0x15, 0xE2, 0xB1, 0xA5,
-    0x72, 0x15, 0x63, 0x68, 0xC8, 0x35, 0x4E, 0x1C, 0x74, 0xC4, 0x99, 0xCC,
-    0xE3, 0x61, 0x7F, 0x39, 0xD2, 0x77, 0x9D, 0x35, 0x88, 0x65, 0x68, 0x98,
-    0x6E, 0x0B, 0x43, 0x71, 0x1D, 0xF5, 0x26, 0x36, 0x8F, 0x3F, 0xE3, 0xF9,
-    0xD8, 0x03, 0x61, 0xC8, 0x2D, 0xAF, 0x40, 0x59, 0xD3, 0x25, 0x72, 0x5F,
-    0xC6, 0xBD, 0x2A, 0x4E, 0x9A, 0x29, 0x28, 0x61, 0x54, 0x5D, 0xD3, 0xE8,
-    0xF5, 0x18, 0xED, 0x53, 0xE1, 0x4F, 0x30, 0xD4, 0xA7, 0x40, 0xD7, 0x8C,
-    0x6A, 0x85, 0x13, 0xC7, 0xFA, 0xA4, 0x5B, 0x10, 0x23, 0x4E, 0x9C, 0x88,
-    0xB1, 0xCF, 0x8D, 0x09, 0x9D, 0xBD, 0x77, 0x30, 0x21, 0x67, 0xC2, 0xA0,
-    0x77, 0x23, 0xED, 0x80, 0x13, 0xB3, 0xB9, 0x41, 0xF2, 0x6C, 0x85, 0x18,
-    0x5D, 0x54, 0x5A, 0x05, 0xD1, 0x05, 0x95, 0xCD, 0xFE, 0x83, 0x2C, 0x78,
-    0x10, 0x31, 0x91, 0xFD, 0x6E, 0xC6, 0xFA, 0xA6, 0xEF, 0x41, 0x6D, 0x0D,
-    0x2E, 0x4B, 0xB2, 0xF7, 0x4C, 0x7B, 0xA1, 0x5B, 0x73, 0x46, 0x41, 0x45,
-    0x08, 0xF2, 0xE4, 0xB4, 0x40, 0xC1, 0x54, 0xC0, 0x6D, 0x2E, 0x95, 0x48,
-    0xCB, 0xD7, 0xC8, 0xDF, 0x92, 0x0A, 0x58, 0x20, 0x36, 0x32, 0x08, 0x9A,
-    0xA1, 0x21, 0xA3, 0x0B, 0xE1, 0x06, 0xAA, 0x62, 0x0D, 0x62, 0xBA, 0x0B,
-    0x83, 0xE1, 0xB4, 0xB2, 0xA0, 0xF5, 0xA4, 0x64, 0x61, 0x11, 0xC3, 0xF5,
-    0xAE, 0x94, 0x19, 0x2C, 0x15, 0xC9, 0x47, 0xD9, 0x8D, 0xB2, 0xA8, 0x4A,
-    0x1A, 0x83, 0x90, 0x43, 0x56, 0x75, 0x55, 0x02, 0xF3, 0xC8, 0x54, 0x35,
-    0x99, 0xCE, 0x34, 0x76, 0xEF, 0x16, 0xC8, 0x77, 0x27, 0x13, 0x03, 0x64,
-    0x15, 0x79, 0xE4, 0xBB, 0x5D, 0xB7, 0x2E, 0xA0, 0x1E, 0x76, 0xBB, 0xA7,
-    0x52, 0xAB, 0x1A, 0xA5, 0x15, 0x64, 0x33, 0x9D, 0xDD, 0xED, 0x47, 0x2E,
-    0x70, 0x9E, 0x42, 0xCA, 0xF9, 0x27, 0x42, 0xFC, 0x0B, 0xD9, 0x0E, 0x4B,
-    0xED};
-const uint8_t g_jaJP_Locale[] = {
-    0x78, 0x9C, 0xED, 0x56, 0xCB, 0x6E, 0xD3, 0x40, 0x14, 0x5D, 0x17, 0x89,
-    0x7F, 0x18, 0x59, 0x20, 0x83, 0xD4, 0xD6, 0x0D, 0xEF, 0x56, 0xAE, 0xA5,
-    0x8A, 0x96, 0x86, 0x16, 0xA3, 0x08, 0x57, 0xA0, 0x76, 0x83, 0x26, 0xF6,
-    0x34, 0x99, 0x36, 0x9E, 0xA9, 0x26, 0xB6, 0x4A, 0xBC, 0xE2, 0x21, 0x20,
-    0x48, 0x74, 0x01, 0x1B, 0x04, 0x44, 0x62, 0x55, 0x40, 0x02, 0x04, 0x8B,
-    0x6E, 0xD8, 0xD0, 0xAF, 0x49, 0x5A, 0x56, 0xFC, 0x02, 0x33, 0x7E, 0xC5,
-    0x8E, 0xED, 0xE0, 0xEE, 0xF1, 0x22, 0x99, 0x7B, 0x7C, 0xCE, 0xF5, 0xBD,
-    0xE7, 0x8E, 0x47, 0x56, 0x5B, 0xD4, 0x84, 0x2D, 0x04, 0x08, 0xB4, 0xD1,
-    0xBC, 0xB4, 0x05, 0xEF, 0xAF, 0xD4, 0x24, 0x60, 0xA1, 0xB6, 0x39, 0x2F,
-    0x0D, 0xDE, 0xEC, 0x1F, 0x7F, 0xFF, 0x76, 0x8E, 0xFF, 0x0D, 0x7A, 0x5F,
-    0xCF, 0x4B, 0xDA, 0xE9, 0x53, 0x00, 0xA8, 0x82, 0x4C, 0x2C, 0xC8, 0x8C,
-    0x8E, 0x5D, 0xA7, 0xAD, 0x76, 0xA8, 0x6B, 0x30, 0xD4, 0xA0, 0x0C, 0x43,
-    0x22, 0x58, 0x13, 0x40, 0xB5, 0x29, 0x71, 0x9A, 0xB7, 0xF9, 0xAD, 0xB6,
-    0x88, 0x27, 0x82, 0x58, 0xAB, 0x0C, 0x7A, 0x5D, 0x55, 0x09, 0xD6, 0x09,
-    0xF8, 0x42, 0x3E, 0x7C, 0x31, 0x1F, 0xBE, 0x94, 0x0F, 0x5F, 0xCE, 0x87,
-    0xAF, 0xE4, 0xC3, 0x57, 0xF3, 0xE1, 0x6B, 0xF9, 0xF0, 0x6C, 0x3E, 0x5C,
-    0x99, 0x29, 0xC0, 0x0B, 0xFA, 0xAC, 0x8C, 0x34, 0x0A, 0xC2, 0x75, 0xEC,
-    0x53, 0xD2, 0x37, 0x00, 0xEB, 0x75, 0x36, 0x2F, 0x55, 0xA4, 0xFF, 0x06,
-    0x9E, 0xC4, 0x40, 0x0B, 0x76, 0x12, 0xDB, 0x8E, 0x47, 0x9A, 0xD8, 0xBE,
-    0xEF, 0x7B, 0xFC, 0x57, 0x55, 0x44, 0x38, 0xC4, 0x7B, 0xDD, 0x5C, 0xFC,
-    0xE8, 0xD1, 0x97, 0x7C, 0xFE, 0x8F, 0x83, 0x82, 0x3C, 0x9F, 0x73, 0xF1,
-    0xDF, 0xCF, 0x5F, 0xE5, 0xE2, 0xFD, 0xDE, 0x87, 0x11, 0x1C, 0xF8, 0xAB,
-    0x9C, 0x26, 0x46, 0xF6, 0x40, 0xD8, 0x4D, 0xB6, 0x8F, 0x6C, 0x07, 0xD9,
-    0xDA, 0xB3, 0x55, 0x67, 0xEB, 0xCD, 0x56, 0x5A, 0x5C, 0xA3, 0x8D, 0x18,
-    0xB6, 0x30, 0xB2, 0x93, 0x2F, 0x79, 0x08, 0x69, 0xFD, 0xBD, 0x6E, 0xFF,
-    0xC5, 0x1E, 0x1F, 0x4E, 0x04, 0x64, 0x6F, 0xFF, 0x7A, 0x99, 0xBE, 0x0D,
-    0x86, 0x61, 0xE2, 0x21, 0x88, 0xC1, 0x44, 0x7E, 0x1E, 0x69, 0x47, 0x07,
-    0x0F, 0xFB, 0x4F, 0x9F, 0xF8, 0xD9, 0x45, 0x18, 0xE3, 0xC7, 0xFB, 0x87,
-    0x83, 0x77, 0x1F, 0x63, 0x10, 0xF8, 0xAB, 0x48, 0xCB, 0x8F, 0x2D, 0x65,
-    0xE4, 0xDC, 0x0A, 0x50, 0x0B, 0x3A, 0xA8, 0x06, 0x1D, 0x07, 0x31, 0x12,
-    0x5B, 0x1F, 0x23, 0xE1, 0xD1, 0xB6, 0xE9, 0xB6, 0x5A, 0x92, 0xB6, 0xCE,
-    0x2F, 0xB9, 0xFF, 0xF3, 0x40, 0xD6, 0x65, 0x6E, 0xB8, 0xBC, 0x28, 0xF3,
-    0x41, 0xC8, 0x4B, 0xFC, 0x12, 0xBE, 0xC4, 0x92, 0xA2, 0x1C, 0x2D, 0x4A,
-    0x1A, 0x05, 0x39, 0x4A, 0xE9, 0x6D, 0x64, 0x05, 0x72, 0x45, 0xD7, 0x95,
-    0xC5, 0xC5, 0x52, 0x9A, 0x76, 0x93, 0x32, 0x47, 0xA8, 0xF2, 0x35, 0x00,
-    0xA4, 0x90, 0xD0, 0x10, 0x07, 0xDB, 0x23, 0x86, 0x24, 0x90, 0x94, 0x21,
-    0x55, 0x79, 0xF0, 0xF6, 0xB1, 0xAC, 0xEB, 0x72, 0xBF, 0xFB, 0x4C, 0x36,
-    0x0C, 0xF9, 0xE8, 0xD3, 0x6B, 0x79, 0x43, 0x55, 0x12, 0xF4, 0x22, 0x7D,
-    0x60, 0x46, 0x75, 0x4E, 0xD7, 0xE7, 0x0C, 0x63, 0xAE, 0x9C, 0xC6, 0x37,
-    0x20, 0x94, 0x94, 0x12, 0x84, 0xDD, 0x0B, 0xC9, 0x28, 0x5F, 0x74, 0x3E,
-    0xD2, 0x67, 0xB8, 0x15, 0xD6, 0x38, 0x1A, 0xED, 0x8F, 0x65, 0x48, 0xB6,
-    0xB6, 0xAB, 0x76, 0xDB, 0x58, 0x5A, 0xBC, 0xB1, 0x7B, 0xEF, 0x41, 0x73,
-    0xD5, 0xDB, 0x08, 0x0C, 0x4B, 0x92, 0x7C, 0x25, 0x71, 0xED, 0x3A, 0x62,
-    0x69, 0xD7, 0x52, 0x58, 0x58, 0x12, 0xC7, 0xF8, 0x0E, 0x37, 0x25, 0xCD,
-    0x9B, 0xF4, 0xBC, 0xD9, 0x69, 0xCF, 0xF3, 0x54, 0x25, 0xC5, 0x2B, 0x96,
-    0x9A, 0x2E, 0x63, 0x88, 0x98, 0x1D, 0x49, 0x3B, 0xE3, 0x8B, 0x4B, 0x0B,
-    0x77, 0x10, 0x33, 0x11, 0x71, 0xC2, 0x67, 0x9E, 0xCD, 0xEA, 0x84, 0x19,
-    0x99, 0x06, 0xE2, 0xA6, 0x86, 0x7D, 0x4E, 0xA4, 0xA1, 0x30, 0xBD, 0x85,
-    0x4C, 0x6C, 0x43, 0xBE, 0x1B, 0xA6, 0xA3, 0x2C, 0xC1, 0xED, 0x42, 0x41,
-    0x83, 0x51, 0x77, 0x07, 0x8B, 0xF9, 0x4F, 0x96, 0x54, 0xC4, 0x1D, 0x9C,
-    0x2D, 0x29, 0xB0, 0x31, 0x71, 0xDB, 0x92, 0x36, 0x55, 0x92, 0xEE, 0x21,
-    0x46, 0x25, 0x6D, 0x26, 0xC3, 0x1E, 0x1A, 0x93, 0x1A, 0x76, 0x34, 0x89,
-    0x94, 0x33, 0x69, 0x30, 0xDA, 0x81, 0x7E, 0x20, 0x69, 0x7F, 0x0E, 0xF9,
-    0x89, 0x9D, 0x66, 0x8C, 0x51, 0xE1, 0x36, 0x15, 0x0B, 0x49, 0x5B, 0xA9,
-    0xAD, 0x9F, 0x40, 0x96, 0x1C, 0x44, 0x46, 0xE4, 0x1F, 0x7F, 0x99, 0xBA,
-    0xC5, 0xDB, 0xDE, 0xD9, 0x41, 0x9B, 0xD0, 0x8C, 0x4E, 0xDB, 0x28, 0x0C,
-    0x73, 0xAE, 0x52, 0xCF, 0xDD, 0x86, 0x60, 0x99, 0x3A, 0x4D, 0x6C, 0x82,
-    0x1A, 0xA3, 0x53, 0x77, 0x6F, 0x02, 0x5D, 0x52, 0xC6, 0x91, 0x75, 0x4C,
-    0xCC, 0x26, 0x8D, 0xC8, 0x77, 0x0A, 0xC8, 0x7A, 0x87, 0x7F, 0x2A, 0x5A,
-    0x82, 0x55, 0x44, 0xC0, 0x04, 0x53, 0x32, 0x86, 0x70, 0x9D, 0xBA, 0x0C,
-    0x23, 0x06, 0x0C, 0xC7, 0x2A, 0x60, 0x2C, 0x58, 0xB4, 0x8E, 0x40, 0x0D,
-    0xFF, 0x93, 0x52, 0x45, 0x75, 0x86, 0x76, 0xC7, 0x52, 0x16, 0x18, 0xAC,
-    0xF3, 0x17, 0x77, 0x1C, 0x65, 0xAD, 0x09, 0xF1, 0x58, 0x02, 0x6F, 0xA9,
-    0x21, 0x6A, 0x01, 0xB7, 0xC6, 0xD2, 0x0C, 0x5A, 0x8A, 0xA6, 0x77, 0x5C,
-    0xD2, 0xD8, 0xA2, 0x3E, 0x33, 0x18, 0x89, 0x7F, 0xAA, 0x25, 0xE6, 0xA9,
-    0x2A, 0xC1, 0x87, 0xBD, 0xF6, 0x17, 0x6C, 0x42, 0x08, 0x21};
-const uint8_t g_koKR_Locale[] = {
-    0x78, 0x9C, 0xED, 0x56, 0x4D, 0x6B, 0xD4, 0x40, 0x18, 0x3E, 0x57, 0xF0,
-    0x3F, 0x0C, 0xC1, 0x12, 0x85, 0x76, 0xB7, 0xEB, 0x77, 0x4B, 0x1A, 0x28,
-    0x6E, 0x6D, 0x65, 0x8D, 0x94, 0xA6, 0x58, 0xEC, 0x45, 0x66, 0x93, 0xE9,
-    0x26, 0xED, 0x26, 0x53, 0x26, 0x09, 0x75, 0x73, 0xAE, 0x52, 0xF0, 0xE2,
-    0xA1, 0x87, 0xEA, 0x6E, 0xB1, 0x07, 0x11, 0x2A, 0x88, 0x22, 0x22, 0x1E,
-    0x14, 0x7F, 0x8D, 0x62, 0x6D, 0x8A, 0x7F, 0xC1, 0xC9, 0xE7, 0xE6, 0x63,
-    0xB2, 0x4D, 0xEF, 0xEE, 0x61, 0x99, 0xF7, 0x99, 0xE7, 0x79, 0xF3, 0xBE,
-    0xCF, 0x4C, 0x5E, 0x22, 0x74, 0xB1, 0x02, 0xBB, 0x08, 0x98, 0xD0, 0x40,
-    0xB3, 0xDC, 0x26, 0x7E, 0xDC, 0x5A, 0xE6, 0x80, 0x8A, 0x2C, 0x65, 0x96,
-    0xFB, 0x35, 0x38, 0x38, 0xFE, 0x34, 0xF8, 0xFD, 0xE1, 0xFD, 0xE5, 0xE3,
-    0xD7, 0x47, 0x3F, 0xFB, 0xDF, 0xAF, 0x70, 0xE2, 0xC5, 0x0B, 0x00, 0x08,
-    0x3E, 0xDF, 0x54, 0x21, 0x91, 0x7B, 0x46, 0x1B, 0x77, 0xAD, 0x48, 0xDA,
-    0x21, 0xA8, 0x83, 0x89, 0x0E, 0x4D, 0x9F, 0x35, 0x06, 0x04, 0x03, 0x9B,
-    0xB6, 0xF6, 0x80, 0x6E, 0x59, 0x7E, 0x3C, 0x16, 0xC6, 0x62, 0xC3, 0xEB,
-    0xEF, 0x09, 0xF5, 0x70, 0x9D, 0x82, 0xAF, 0xB2, 0xE1, 0x6B, 0x6C, 0xF8,
-    0x3A, 0x1B, 0xBE, 0xC1, 0x86, 0x6F, 0xB2, 0xE1, 0x5B, 0x6C, 0xF8, 0x36,
-    0x1B, 0x9E, 0x66, 0xC3, 0x8D, 0xA9, 0x12, 0xBC, 0xA4, 0xCF, 0x46, 0xAE,
-    0x51, 0x10, 0xAD, 0x13, 0x9F, 0xD2, 0xBE, 0x01, 0xD8, 0x6E, 0x93, 0x59,
-    0xAE, 0xC1, 0xFD, 0x37, 0xF0, 0x3C, 0x06, 0xAA, 0xB0, 0x97, 0xBA, 0x76,
-    0x34, 0x12, 0xBD, 0x83, 0x6F, 0xDE, 0xAB, 0x3D, 0xFA, 0x2F, 0xD4, 0xFD,
-    0x70, 0x88, 0xF7, 0xF7, 0x98, 0xF8, 0xE9, 0x4B, 0x36, 0xEE, 0xED, 0xEE,
-    0x33, 0xF1, 0x93, 0x77, 0x47, 0x4C, 0xFC, 0xCF, 0xD7, 0x5D, 0x76, 0xFE,
-    0x67, 0x87, 0x39, 0x1C, 0x04, 0x2B, 0x46, 0x13, 0xB9, 0x3B, 0x10, 0x75,
-    0x53, 0xEC, 0xA3, 0xD8, 0x41, 0xB1, 0xF6, 0x62, 0xD5, 0xC5, 0x7A, 0x8B,
-    0x95, 0x96, 0xD7, 0x68, 0x20, 0xA2, 0xAB, 0x3A, 0x32, 0xD2, 0x2F, 0x79,
-    0x04, 0x89, 0xDE, 0xFE, 0x1B, 0xEF, 0x70, 0x87, 0x1E, 0x4E, 0x0C, 0x14,
-    0xB6, 0x4F, 0xFB, 0xB9, 0x6D, 0x30, 0x0C, 0x53, 0x0F, 0x41, 0x04, 0xA6,
-    0xF2, 0xD3, 0x88, 0x56, 0xF9, 0xD1, 0xEB, 0xBF, 0x08, 0xB2, 0xFB, 0x61,
-    0x82, 0x7B, 0x3B, 0x03, 0xBA, 0x95, 0x80, 0x20, 0x58, 0xC5, 0x5A, 0x3A,
-    0xB6, 0xEA, 0xB9, 0xB9, 0x15, 0xA2, 0x2A, 0xB4, 0xD1, 0x12, 0xB4, 0x6D,
-    0x44, 0xCC, 0xC4, 0xFA, 0x04, 0x89, 0x46, 0xDB, 0xBA, 0xD3, 0xED, 0x72,
-    0xE2, 0x23, 0xFA, 0xE3, 0x4F, 0x9E, 0xEE, 0xF0, 0x40, 0xE2, 0xA9, 0xE3,
-    0x3C, 0x68, 0xF2, 0xF4, 0x28, 0x78, 0x30, 0x4F, 0x7F, 0xBE, 0x35, 0x89,
-    0xAA, 0x2C, 0x4D, 0x17, 0x9B, 0x9D, 0xD2, 0x34, 0x95, 0x32, 0x18, 0x48,
-    0x0D, 0x13, 0xD4, 0x80, 0x24, 0xD5, 0x40, 0xB3, 0x59, 0x49, 0x65, 0x69,
-    0x98, 0xD8, 0xBE, 0xAE, 0x4C, 0x05, 0x40, 0x06, 0x89, 0x9C, 0xB1, 0x75,
-    0x23, 0xE7, 0x4C, 0x0A, 0xC9, 0x38, 0x33, 0x07, 0x34, 0x8D, 0xF7, 0x9E,
-    0x0F, 0x68, 0x4B, 0x12, 0x7F, 0xF2, 0x85, 0xB6, 0x26, 0xCB, 0xBC, 0xF7,
-    0x79, 0x97, 0x07, 0x6B, 0x42, 0x3D, 0x25, 0x2A, 0xCB, 0x12, 0x1A, 0x53,
-    0x9A, 0xA5, 0x52, 0x8E, 0xC0, 0x1A, 0x9A, 0x62, 0x46, 0x92, 0x66, 0x64,
-    0xB9, 0x92, 0x24, 0xF2, 0x25, 0x14, 0xE5, 0x15, 0xBE, 0x27, 0x39, 0x07,
-    0xA2, 0xDB, 0xB2, 0x42, 0xD1, 0xF8, 0x0A, 0x2D, 0x40, 0x73, 0x63, 0x73,
-    0xD1, 0xB0, 0xE4, 0xF9, 0xE6, 0xDD, 0xED, 0xD5, 0x27, 0x5A, 0xCB, 0x5D,
-    0x0B, 0xAD, 0x4C, 0x93, 0x02, 0xA5, 0xE9, 0x18, 0x6D, 0x44, 0xB2, 0x7E,
-    0x66, 0xB0, 0xA8, 0x28, 0x8A, 0xD1, 0x97, 0x40, 0xE1, 0x44, 0x77, 0xC2,
-    0x75, 0xA7, 0x6B, 0xAE, 0xEB, 0x0A, 0xF5, 0x0C, 0xAF, 0x5C, 0xAA, 0x38,
-    0x84, 0x20, 0x53, 0xE9, 0x71, 0xE2, 0xA5, 0x40, 0x5C, 0x59, 0xB8, 0x85,
-    0x88, 0x82, 0x4C, 0x3B, 0x7A, 0xE6, 0x78, 0x51, 0xE7, 0x9B, 0x51, 0x68,
-    0x20, 0x69, 0x6A, 0xD8, 0xE7, 0x58, 0x16, 0x8A, 0xD2, 0xAB, 0x48, 0xD1,
-    0x0D, 0x48, 0xEF, 0x49, 0x2D, 0xCE, 0x12, 0x6E, 0x97, 0x0A, 0x3A, 0x04,
-    0x3B, 0x5B, 0xBA, 0x7F, 0x27, 0x26, 0x2A, 0x2A, 0x92, 0x0E, 0xC6, 0x2B,
-    0x0A, 0x0C, 0xDD, 0x74, 0x2C, 0x4E, 0x9C, 0xAC, 0x48, 0x77, 0x11, 0xC1,
-    0x9C, 0x38, 0x55, 0x60, 0x0F, 0x8D, 0xC9, 0x1C, 0x76, 0x7C, 0x12, 0x19,
-    0x67, 0xB2, 0x60, 0x7C, 0x07, 0x83, 0x80, 0x13, 0xFF, 0xFE, 0x78, 0x4B,
-    0x07, 0x54, 0x86, 0x31, 0x42, 0xA5, 0x5B, 0xD8, 0x5F, 0x70, 0x62, 0x6B,
-    0x79, 0xF5, 0x1C, 0xB2, 0xF4, 0x41, 0x14, 0x44, 0xC1, 0x84, 0x2C, 0xD4,
-    0xED, 0xCF, 0x81, 0xDE, 0x16, 0x5A, 0x87, 0x4A, 0x3C, 0x90, 0xE3, 0x30,
-    0xCA, 0x39, 0xA7, 0xE2, 0x36, 0x02, 0x52, 0xCF, 0x31, 0x3B, 0x1B, 0x18,
-    0xC8, 0xB6, 0x0A, 0x24, 0xAE, 0xCE, 0x64, 0x4A, 0x3D, 0xFA, 0x75, 0xA8,
-    0x82, 0x25, 0xEA, 0x64, 0x09, 0x41, 0x37, 0x75, 0x6C, 0x8E, 0x20, 0xDC,
-    0xC1, 0x0E, 0xD1, 0x11, 0xF1, 0x9F, 0x52, 0xC2, 0x08, 0xAB, 0x59, 0xD2,
-    0xCF, 0xA4, 0x2C, 0xA2, 0x36, 0x41, 0xDB, 0x23, 0x29, 0x73, 0x04, 0xB6,
-    0xE9, 0x8B, 0x38, 0x8A, 0xB2, 0xA2, 0x41, 0xBD, 0x84, 0xD0, 0xC2, 0xAE,
-    0xB3, 0x09, 0xC1, 0x02, 0xB6, 0x35, 0x5D, 0xF1, 0x7B, 0x9A, 0x7C, 0x78,
-    0xAF, 0xD4, 0x9A, 0x88, 0x4C, 0x0D, 0x50, 0x34, 0x1C, 0x93, 0x97, 0x47,
-    0x3E, 0x9A, 0x72, 0x3B, 0x81, 0xDD, 0xF7, 0x47, 0xD2, 0x64, 0x9C, 0xA1,
-    0x05, 0x53, 0x2D, 0x75, 0x9E, 0x42, 0x3D, 0xFC, 0xFC, 0x17, 0xFF, 0x01,
-    0xDC, 0xF1, 0x18, 0xD3};
-const uint8_t g_esES_Locale[] = {
-    0x78, 0x9C, 0x9D, 0x56, 0xCF, 0x6B, 0xD4, 0x40, 0x14, 0xBE, 0x0B, 0xFE,
-    0x0F, 0x21, 0x58, 0x56, 0xA1, 0xDD, 0xD1, 0x63, 0xCB, 0x36, 0x50, 0xDA,
-    0xDA, 0x95, 0x1A, 0x59, 0x9A, 0xAA, 0xD8, 0x8B, 0x4C, 0x92, 0xE9, 0xEE,
-    0xB4, 0xC9, 0xCC, 0x32, 0x49, 0x2C, 0x9B, 0xA3, 0xE0, 0x41, 0x10, 0x0B,
-    0xDE, 0x8A, 0x27, 0x0F, 0x1E, 0x04, 0x8B, 0x77, 0x51, 0x3C, 0xF4, 0x3F,
-    0x11, 0x6A, 0xEB, 0xC9, 0x7F, 0xC1, 0x37, 0x9B, 0x49, 0x36, 0x3F, 0x66,
-    0xD7, 0x60, 0x4E, 0xF3, 0xBE, 0xF7, 0x7D, 0x2F, 0xEF, 0x7D, 0x93, 0x4C,
-    0xD2, 0x0B, 0xB8, 0x87, 0x03, 0x62, 0x30, 0x1C, 0x92, 0x75, 0x93, 0x44,
-    0xCF, 0xB7, 0x1D, 0xD3, 0xF0, 0x49, 0xE4, 0xAD, 0x9B, 0xD7, 0x1F, 0x7F,
-    0x5C, 0x9D, 0x9E, 0x5F, 0xBD, 0x3E, 0xBB, 0xFE, 0x72, 0x7E, 0xBB, 0x08,
-    0xFE, 0x7C, 0x7B, 0x73, 0xF9, 0xFE, 0xFB, 0xEF, 0xB3, 0x57, 0xBF, 0xDE,
-    0xBE, 0xBB, 0xFC, 0x7A, 0x7A, 0xC7, 0xB4, 0x7A, 0xB2, 0x00, 0xF3, 0xB1,
-    0x70, 0x26, 0xA1, 0xCB, 0x83, 0x48, 0xD5, 0x1A, 0x0A, 0x32, 0xE4, 0x82,
-    0x62, 0x06, 0x8C, 0x90, 0xB3, 0x78, 0xF4, 0x08, 0xE0, 0x48, 0xAD, 0x2D,
-    0xC2, 0x88, 0xE0, 0x3D, 0x94, 0x05, 0x37, 0x6F, 0x28, 0xF4, 0x90, 0xB8,
-    0x42, 0x87, 0x87, 0x58, 0xA4, 0x4D, 0x14, 0xBB, 0x82, 0x06, 0x1A, 0xEE,
-    0xA4, 0x49, 0x3D, 0x4A, 0x18, 0xD5, 0xA1, 0x81, 0x06, 0xC5, 0x43, 0x1E,
-    0xC5, 0x4D, 0x38, 0x22, 0xE3, 0x98, 0x92, 0x10, 0x1A, 0x6C, 0xA4, 0xB8,
-    0x17, 0x27, 0x3A, 0x9C, 0xF1, 0x17, 0x73, 0x14, 0x3E, 0xF5, 0x1A, 0x19,
-    0x54, 0x72, 0x29, 0x27, 0x4E, 0x23, 0x03, 0xBB, 0xAE, 0x58, 0x37, 0xEF,
-    0x99, 0x25, 0xF3, 0x74, 0xD6, 0xE9, 0x6C, 0xD3, 0x99, 0xA6, 0xB3, 0x4C,
-    0xE7, 0x98, 0xCE, 0x2F, 0x9D, 0x5B, 0x3A, 0xAB, 0x74, 0x1E, 0xE9, 0xFC,
-    0xD1, 0x39, 0x33, 0xDF, 0x13, 0x1F, 0x4F, 0xD4, 0x53, 0x04, 0x2B, 0xCB,
-    0xE7, 0x21, 0x65, 0xF2, 0xF6, 0x32, 0xC8, 0xB2, 0x56, 0x90, 0x30, 0x12,
-    0x55, 0x10, 0x30, 0x21, 0xAE, 0x43, 0xF4, 0xE2, 0x93, 0xF0, 0x78, 0x50,
-    0x83, 0x8F, 0x12, 0xF2, 0xA2, 0x06, 0xC1, 0xFE, 0x89, 0x7A, 0xC1, 0xE8,
-    0xE2, 0x83, 0x8B, 0xFD, 0xD9, 0x6D, 0x51, 0xD1, 0x55, 0xA9, 0xC3, 0xD2,
-    0x9E, 0xA9, 0x56, 0xEB, 0x6D, 0xD6, 0x9B, 0x6C, 0x74, 0x58, 0xEF, 0xAD,
-    0xDE, 0x58, 0xA3, 0x29, 0x7D, 0x47, 0x21, 0x11, 0xD4, 0x87, 0x87, 0x2D,
-    0x7F, 0xFD, 0x54, 0x68, 0x6D, 0xD8, 0xE0, 0x6E, 0x1E, 0x94, 0x78, 0xD6,
-    0xA0, 0x96, 0x40, 0xD5, 0x0A, 0x80, 0x10, 0x81, 0x55, 0x35, 0x58, 0x59,
-    0xB8, 0xBB, 0xD9, 0xED, 0x21, 0xB9, 0xCA, 0x52, 0x96, 0x5F, 0x06, 0x50,
-    0x41, 0x96, 0x41, 0xED, 0xA8, 0xC8, 0xBA, 0x8F, 0xC9, 0x00, 0xC7, 0x31,
-    0x18, 0x3D, 0xDD, 0xD7, 0x22, 0x52, 0xE7, 0xC8, 0x61, 0x12, 0x04, 0xA6,
-    0xB5, 0x0D, 0x97, 0xB1, 0xD5, 0x81, 0xA3, 0xC9, 0xE8, 0xD8, 0x70, 0x65,
-    0xAB, 0x67, 0x70, 0xC9, 0x69, 0x0B, 0x4D, 0xAD, 0xA0, 0x2A, 0x11, 0x70,
-    0x36, 0x34, 0xAD, 0xFF, 0x55, 0x87, 0xC4, 0x07, 0xF1, 0x16, 0xB2, 0x6D,
-    0xD4, 0x52, 0x11, 0x8D, 0xB8, 0x88, 0x67, 0x9A, 0x86, 0x02, 0x55, 0x66,
-    0x06, 0x20, 0xA6, 0x61, 0xC9, 0x83, 0x52, 0x54, 0xF1, 0xA0, 0xDF, 0xEF,
-    0xF4, 0xA1, 0xFD, 0x0E, 0x5C, 0x0E, 0x9C, 0xD2, 0x07, 0x3D, 0x54, 0x62,
-    0xD6, 0xCA, 0x54, 0x26, 0xEF, 0xF7, 0xD7, 0x6C, 0x7B, 0xCD, 0x71, 0x5A,
-    0x49, 0xA6, 0xE3, 0x2A, 0x41, 0x0B, 0xBA, 0x9A, 0x55, 0x0A, 0x1A, 0x6C,
-    0x54, 0x99, 0x4B, 0x59, 0xB5, 0x0F, 0x58, 0xBE, 0xFD, 0x3B, 0x89, 0x1D,
-    0x1F, 0x8F, 0xC2, 0xC8, 0xD9, 0xDE, 0xBA, 0x7F, 0xF2, 0x14, 0x8F, 0x76,
-    0xD3, 0x83, 0xCC, 0x9C, 0x32, 0x09, 0x74, 0x2C, 0x09, 0x5D, 0x22, 0x66,
-    0x0E, 0x55, 0x62, 0xD5, 0x08, 0x60, 0xF0, 0x9C, 0x7A, 0xA6, 0x95, 0x2E,
-    0xA7, 0xE9, 0x6A, 0x37, 0x4D, 0xD3, 0x1E, 0xAA, 0xF0, 0x1A, 0x85, 0x94,
-    0xD0, 0x4B, 0x84, 0x20, 0xCC, 0x9B, 0xE4, 0xCA, 0xD5, 0x55, 0xE3, 0x56,
-    0x4B, 0xE9, 0x98, 0x08, 0x8F, 0xB0, 0x58, 0x29, 0x97, 0x34, 0x2A, 0x54,
-    0x6B, 0xBD, 0x28, 0x94, 0x4F, 0x57, 0x09, 0x55, 0x59, 0x9F, 0x78, 0x34,
-    0xC4, 0xB0, 0xE3, 0xCB, 0xB9, 0x3E, 0x4B, 0xD7, 0xD5, 0xC5, 0x97, 0x96,
-    0x27, 0x63, 0x2A, 0x37, 0xBA, 0xDB, 0x8A, 0x5F, 0x74, 0xBD, 0xD4, 0x8A,
-    0x0E, 0x87, 0x6C, 0x12, 0x99, 0xD6, 0x4A, 0x2B, 0x72, 0x0A, 0x9F, 0x6F,
-    0xD3, 0xBA, 0xDB, 0xE4, 0xA2, 0xEA, 0xD8, 0x80, 0xE4, 0xBE, 0x17, 0x4E,
-    0x54, 0x81, 0xFC, 0xF9, 0x9A, 0x06, 0xA6, 0xF5, 0xF3, 0xE5, 0x67, 0x38,
-    0x3E, 0x2A, 0x8C, 0x66, 0x11, 0xA5, 0xA1, 0x11, 0x97, 0x0B, 0x38, 0x35,
-    0x1E, 0xEF, 0xB5, 0x16, 0x95, 0x4D, 0x6F, 0x4A, 0x50, 0xBD, 0x5B, 0xF9,
-    0x32, 0x4C, 0xC6, 0xE4, 0x10, 0x7B, 0xF2, 0x1C, 0xCC, 0x97, 0xAA, 0x96,
-    0x3D, 0x81, 0x1F, 0x1F, 0xDF, 0x18, 0x80, 0x17, 0xA8, 0xCC, 0xCC, 0xD3,
-    0x14, 0xFE, 0x46, 0xD8, 0xDC, 0xF4, 0x26, 0x4F, 0x04, 0x7C, 0x77, 0x0C,
-    0x27, 0xF6, 0xB5, 0xF9, 0x0D, 0x9F, 0xBB, 0xC4, 0x18, 0xD0, 0x7F, 0x10,
-    0xFA, 0xF2, 0x67, 0xEA, 0x64, 0x01, 0x61, 0x43, 0x60, 0x17, 0x5E, 0x98,
-    0xF9, 0x84, 0xFD, 0x11, 0xA6, 0xDA, 0xF4, 0x2E, 0x4F, 0x93, 0x63, 0x6C,
-    0xEC, 0xF0, 0x78, 0x44, 0x3D, 0x39, 0xC7, 0xCA, 0x93, 0x07, 0x86, 0xBD,
-    0x88, 0x0A, 0x23, 0x7B, 0x23, 0x9E, 0x53, 0xF7, 0x16, 0xDC, 0x14, 0x98,
-    0x43, 0x39, 0x99, 0xF1, 0x70, 0x01, 0xC9, 0xE1, 0x2D, 0x48, 0xF6, 0x24,
-    0x61, 0xC3, 0x23, 0x3E, 0xE5, 0xA9, 0xE6, 0xD0, 0x6C, 0xCF, 0x64, 0x94,
-    0xFD, 0xFC, 0xC2, 0xF2, 0x2F, 0x7C, 0xDC, 0xCC, 0x2F,
-};
-const uint8_t g_esLA_Locale[] = {
-    0x78, 0x9C, 0x9D, 0x56, 0xCD, 0x4E, 0xDC, 0x30, 0x10, 0x3E, 0x53, 0xA9,
-    0xEF, 0x60, 0x45, 0x45, 0x80, 0x04, 0x9B, 0xF6, 0xB8, 0x28, 0x44, 0x5A,
-    0x01, 0xA5, 0x15, 0x0D, 0x5A, 0x75, 0x51, 0x4B, 0xB9, 0x54, 0x4E, 0x62,
-    0x36, 0x86, 0xC4, 0x5E, 0x39, 0x09, 0x68, 0xA3, 0xBE, 0x40, 0x4F, 0x3D,
-    0xF4, 0xD4, 0x63, 0x2B, 0x21, 0xB5, 0x07, 0xD4, 0x47, 0xE8, 0x81, 0x67,
-    0x41, 0xF0, 0x18, 0x9D, 0xFC, 0x6E, 0x12, 0x3B, 0xE9, 0xD2, 0x9C, 0x3C,
-    0xDF, 0x7C, 0x9F, 0x77, 0xE6, 0xB3, 0x33, 0x1B, 0xC3, 0xE7, 0x0E, 0xF6,
-    0x09, 0x62, 0x38, 0x20, 0x3B, 0x1A, 0x09, 0x3F, 0x5A, 0x27, 0x1A, 0x72,
-    0x49, 0xE8, 0xEC, 0x68, 0x0F, 0xD7, 0x7F, 0xEE, 0xBF, 0xDC, 0xDC, 0x7F,
-    0xFE, 0xF6, 0xF0, 0xFB, 0x66, 0xFD, 0xEE, 0xC7, 0x4F, 0x88, 0xEF, 0xBE,
-    0x5E, 0x6F, 0x68, 0xE6, 0xD3, 0x27, 0x08, 0x19, 0xA9, 0x8A, 0xB9, 0x58,
-    0x4C, 0xE6, 0x81, 0xCD, 0xFD, 0xB0, 0xD8, 0x60, 0x2A, 0xC8, 0x94, 0x0B,
-    0x8A, 0x59, 0xCA, 0x5A, 0x41, 0x46, 0xC0, 0x59, 0xE4, 0x1D, 0x41, 0x2A,
-    0x4C, 0xE3, 0x95, 0x3C, 0x36, 0x09, 0x23, 0x82, 0x1B, 0x7A, 0x1E, 0xD4,
-    0xF0, 0x33, 0x62, 0x0B, 0x75, 0x26, 0xC0, 0x22, 0x51, 0xE1, 0xD8, 0x16,
-    0xD4, 0x57, 0xF2, 0xE7, 0x2A, 0xFA, 0x79, 0xCC, 0xA8, 0x1A, 0xF7, 0x95,
-    0x38, 0x9E, 0xF2, 0x30, 0x52, 0x25, 0x42, 0x32, 0x8B, 0x28, 0x09, 0xA0,
-    0x5C, 0x45, 0x92, 0x3B, 0x51, 0xAC, 0xCE, 0x30, 0x7E, 0xD9, 0xA9, 0x72,
-    0xA9, 0x23, 0xE5, 0x50, 0xB1, 0xAE, 0x1C, 0xAC, 0x3B, 0x8A, 0xB0, 0x6D,
-    0x8B, 0x1D, 0xED, 0x85, 0xD6, 0xB2, 0x56, 0x6D, 0xAC, 0xDA, 0x54, 0xB5,
-    0xA5, 0x6A, 0x43, 0xD5, 0x7E, 0xAA, 0xDD, 0x54, 0x7B, 0xA9, 0x36, 0x52,
-    0xED, 0xA0, 0xDA, 0x3D, 0xB5, 0x6F, 0xFD, 0x8E, 0xB9, 0x78, 0x5E, 0xBB,
-    0x81, 0x10, 0x99, 0x2E, 0x0F, 0x28, 0x4B, 0xCB, 0x49, 0x83, 0x0A, 0xF5,
-    0x63, 0x46, 0xC2, 0x16, 0x06, 0x16, 0x45, 0x32, 0x48, 0x6F, 0x7F, 0x09,
-    0x87, 0xFB, 0x52, 0xE2, 0x3C, 0x26, 0x97, 0x12, 0x08, 0x27, 0x2E, 0xE4,
-    0x8D, 0xC3, 0xDB, 0xEF, 0x36, 0x76, 0x17, 0x25, 0xA0, 0x6C, 0xA5, 0xA8,
-    0xBA, 0x75, 0xCA, 0x45, 0xF9, 0x72, 0xE9, 0x72, 0xE1, 0x8A, 0xAA, 0xE5,
-    0x7A, 0xE5, 0x62, 0x15, 0x85, 0x76, 0x57, 0x19, 0x10, 0x41, 0x5D, 0xB8,
-    0xB6, 0xF5, 0x57, 0xBC, 0x80, 0xCC, 0x91, 0x05, 0x67, 0x51, 0x06, 0xCD,
-    0xD4, 0xB8, 0x95, 0x42, 0x8B, 0xB0, 0xB6, 0x39, 0x11, 0xB8, 0xB6, 0x2F,
-    0x44, 0x26, 0x1E, 0xEC, 0x0E, 0x0C, 0x3D, 0x5D, 0x55, 0x90, 0x5B, 0x87,
-    0x50, 0xB6, 0x2A, 0x45, 0x30, 0xA5, 0xF4, 0xD6, 0x98, 0xCA, 0x51, 0x17,
-    0x47, 0x64, 0x8C, 0xA3, 0x08, 0x0E, 0xA6, 0x72, 0xBB, 0x42, 0x8A, 0x49,
-    0x76, 0x16, 0xFB, 0xBE, 0x66, 0xEE, 0xC3, 0x83, 0xF6, 0xD6, 0x60, 0x22,
-    0xA2, 0x35, 0x0B, 0x9E, 0x7C, 0xF5, 0x01, 0x9E, 0xD4, 0x89, 0x4A, 0xD3,
-    0xB5, 0x89, 0xCF, 0xD9, 0x54, 0x33, 0xFF, 0x5F, 0x1F, 0x10, 0x17, 0xE4,
-    0x7B, 0xBA, 0x65, 0xE9, 0x4B, 0x6B, 0x42, 0x8F, 0x8B, 0x68, 0xA1, 0x6A,
-    0x6B, 0x10, 0x6A, 0x20, 0x85, 0x23, 0x11, 0x0D, 0x5A, 0x8E, 0xD4, 0x90,
-    0x86, 0x23, 0x9E, 0xB7, 0x6D, 0x59, 0xDB, 0x93, 0x09, 0x1A, 0xA1, 0x53,
-    0x43, 0xAF, 0xB1, 0xBA, 0x64, 0xB9, 0x07, 0x8F, 0x96, 0x65, 0xAD, 0x2F,
-    0x54, 0x4B, 0x69, 0x8A, 0xD6, 0x33, 0x95, 0x2C, 0x49, 0x3B, 0x6F, 0xF5,
-    0x59, 0xDC, 0x85, 0x63, 0x40, 0xCB, 0x0B, 0x72, 0x10, 0x5B, 0xD1, 0x85,
-    0x17, 0x84, 0x93, 0xFD, 0xBD, 0x97, 0x57, 0xEF, 0xB1, 0x77, 0x98, 0x9C,
-    0xE6, 0x86, 0xD5, 0x49, 0x99, 0x92, 0xC5, 0x81, 0x4D, 0x44, 0xD3, 0xB5,
-    0x06, 0x56, 0x54, 0x05, 0x18, 0xDC, 0x6D, 0x47, 0x33, 0x93, 0xCD, 0x24,
-    0x19, 0x0E, 0x92, 0x24, 0x31, 0xF4, 0x06, 0xAF, 0x5B, 0xEA, 0xC4, 0x42,
-    0x10, 0xE6, 0xCC, 0x35, 0xF3, 0x59, 0x2E, 0x1E, 0x0E, 0x3F, 0xAD, 0x57,
-    0xCB, 0x8D, 0xA5, 0xF7, 0x99, 0x11, 0xE1, 0x10, 0x16, 0x15, 0x25, 0xAC,
-    0xCA, 0xBA, 0xD4, 0x1B, 0xA9, 0x9F, 0xAA, 0xC7, 0x45, 0xDB, 0x2B, 0x4D,
-    0xA8, 0xD8, 0xDE, 0x25, 0x0E, 0x0D, 0x30, 0x5C, 0x8E, 0x41, 0xB9, 0x4B,
-    0x9E, 0xEE, 0x14, 0x4C, 0x05, 0x8F, 0x67, 0x34, 0xBD, 0x17, 0x9B, 0x4B,
-    0x2A, 0xAA, 0x0E, 0x56, 0x97, 0x14, 0xC0, 0x84, 0x8F, 0x43, 0xCD, 0xDC,
-    0x5A, 0x92, 0x9E, 0xC0, 0x77, 0x87, 0x66, 0x3E, 0x97, 0xD8, 0x0B, 0x63,
-    0x1A, 0x67, 0x5F, 0x1E, 0x4C, 0xC3, 0x99, 0x26, 0x58, 0xDE, 0xC9, 0x2C,
-    0x80, 0x03, 0x84, 0x59, 0xD4, 0xC8, 0xF7, 0x68, 0x68, 0xC8, 0xD3, 0x85,
-    0x66, 0x5A, 0x27, 0x47, 0x8F, 0x90, 0xD5, 0x8F, 0x41, 0x12, 0x65, 0xC3,
-    0x50, 0xAA, 0x3A, 0x7D, 0xF5, 0xE7, 0x33, 0x72, 0x86, 0x9D, 0x72, 0xE8,
-    0x96, 0x61, 0xB1, 0xA7, 0x35, 0x87, 0xAF, 0x39, 0x17, 0x8D, 0xC1, 0x1D,
-    0x5D, 0x4D, 0xA0, 0xF0, 0x49, 0xC5, 0x7A, 0x08, 0xBB, 0x3C, 0x16, 0xF0,
-    0x17, 0x88, 0x26, 0x91, 0xDB, 0xC1, 0x18, 0xB9, 0xDC, 0x26, 0x68, 0x4C,
-    0xFF, 0x49, 0x79, 0x95, 0x7E, 0x1F, 0x5E, 0xF5, 0x52, 0x46, 0x02, 0xDB,
-    0xF0, 0xAE, 0xF5, 0x51, 0x8E, 0x3D, 0x4C, 0x3B, 0x08, 0x87, 0x3C, 0x89,
-    0x2F, 0x30, 0x3A, 0xE0, 0x91, 0x47, 0x9D, 0xB4, 0xA7, 0xAD, 0x77, 0xAF,
-    0x91, 0xD5, 0x4F, 0x06, 0x03, 0x1C, 0x8F, 0x97, 0xE4, 0xB7, 0xBD, 0x3F,
-    0x0D, 0xDC, 0x69, 0xDA, 0x25, 0x7A, 0xD3, 0x4B, 0x9B, 0xF0, 0xA5, 0x68,
-    0xD6, 0x3C, 0x66, 0xD3, 0x73, 0x9E, 0x31, 0xF3, 0x22, 0xB3, 0x11, 0x57,
-    0x3B, 0x4F, 0x43, 0xCF, 0x3F, 0xEF, 0xCD, 0xBF, 0xC4, 0xB5, 0xD4, 0x04};
-const uint8_t g_deDE_Loacale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD4, 0x30, 0x10, 0xBD, 0x23, 0xF1,
-    0x1F, 0xAC, 0x88, 0xAA, 0x20, 0xB5, 0x1B, 0x38, 0xB6, 0xDA, 0x46, 0x5A,
-    0x75, 0xFB, 0x41, 0x4B, 0xCA, 0xAA, 0x69, 0x41, 0xF4, 0x82, 0xBC, 0x89,
-    0xBB, 0x71, 0x9B, 0xD8, 0x2B, 0xC7, 0x69, 0xB5, 0x39, 0xF2, 0x37, 0xB8,
-    0x72, 0x04, 0x71, 0xE4, 0x04, 0x17, 0xFE, 0x09, 0x52, 0x25, 0x7E, 0x06,
-    0x93, 0x8D, 0x93, 0x26, 0xB6, 0xBB, 0x0D, 0xB9, 0xAC, 0xE7, 0xCD, 0x7B,
-    0xB3, 0x33, 0xCF, 0x89, 0x93, 0x61, 0xC2, 0x43, 0x9C, 0x10, 0xC4, 0x70,
-    0x4A, 0x76, 0x9C, 0x88, 0x7C, 0x1C, 0xEF, 0x39, 0x28, 0x22, 0x59, 0xB8,
-    0xE3, 0xDC, 0xFD, 0xFA, 0xF1, 0xF7, 0xFB, 0xB7, 0xE7, 0xF0, 0x73, 0xF7,
-    0xF9, 0xE7, 0x0B, 0xC7, 0x1B, 0x96, 0x44, 0x16, 0x61, 0x11, 0x2C, 0xD2,
-    0x29, 0x4F, 0x32, 0xA5, 0x99, 0x09, 0x32, 0xE3, 0x82, 0x62, 0x06, 0x8C,
-    0x94, 0x33, 0x19, 0x9F, 0x00, 0x9C, 0xA9, 0xB5, 0x77, 0x84, 0x59, 0x8E,
-    0xC5, 0xD0, 0xAD, 0xA2, 0xA7, 0x4F, 0x14, 0xBC, 0x4F, 0xA6, 0xC2, 0x86,
-    0xFB, 0xBF, 0xBF, 0x88, 0xC2, 0x40, 0x47, 0x73, 0x41, 0x13, 0x93, 0x8B,
-    0xA9, 0x81, 0x1D, 0xE5, 0xCC, 0x06, 0x26, 0x26, 0x38, 0xCA, 0x67, 0x79,
-    0x26, 0x0D, 0x38, 0x20, 0x73, 0x49, 0xD2, 0x29, 0x31, 0x5B, 0x7B, 0x7B,
-    0x2D, 0xB9, 0x0D, 0x3F, 0xE1, 0x37, 0x76, 0xC1, 0x98, 0x14, 0x7A, 0xC2,
-    0x6D, 0x19, 0x54, 0xF3, 0x96, 0x11, 0xC2, 0xD3, 0xA9, 0xD8, 0x71, 0x5E,
-    0x39, 0x2D, 0xDF, 0x6C, 0xA6, 0x99, 0x26, 0xD8, 0xED, 0xEA, 0x6B, 0x96,
-    0xCD, 0x2B, 0x9B, 0x55, 0x36, 0x9F, 0x6C, 0x0E, 0xD9, 0xDC, 0xB1, 0x19,
-    0xF3, 0xB0, 0x27, 0x11, 0x5E, 0xA8, 0x1B, 0x08, 0x56, 0x5E, 0xC0, 0x19,
-    0x93, 0x18, 0xFE, 0xBE, 0x0C, 0xAA, 0xAC, 0xE7, 0x73, 0x03, 0x1A, 0x53,
-    0xC2, 0x32, 0x83, 0x47, 0xA5, 0xBC, 0xE5, 0x61, 0xDC, 0x65, 0x42, 0x41,
-    0x22, 0x0C, 0xEE, 0xBE, 0x20, 0x54, 0xC7, 0x02, 0x9C, 0x76, 0x78, 0x6E,
-    0xD3, 0x5A, 0xAB, 0xCD, 0xD6, 0xC6, 0x55, 0xFD, 0x6A, 0xAD, 0x6A, 0x6D,
-    0x6A, 0x0D, 0x6A, 0xAD, 0x69, 0x2D, 0x69, 0xDD, 0xD8, 0x1B, 0x49, 0x89,
-    0xA0, 0x11, 0x25, 0x69, 0xFD, 0xD4, 0xA9, 0xD0, 0x1B, 0xF9, 0xE0, 0x6C,
-    0x1D, 0xB4, 0x78, 0xDE, 0x44, 0x4B, 0xB8, 0xDD, 0x0A, 0x80, 0x10, 0x81,
-    0x55, 0x35, 0x58, 0x79, 0x37, 0x03, 0xB4, 0x1B, 0x8B, 0xC1, 0xD0, 0x2D,
-    0x83, 0x2A, 0xEB, 0x31, 0x0D, 0x73, 0x1B, 0x49, 0x19, 0x68, 0xE7, 0x44,
-    0x35, 0x81, 0x24, 0x13, 0x2C, 0x25, 0x11, 0x6C, 0xB9, 0xB3, 0x4D, 0xA4,
-    0x0E, 0x91, 0xCB, 0x3C, 0x49, 0x1C, 0x6F, 0x0F, 0xAE, 0x0D, 0x34, 0x1E,
-    0x20, 0x1F, 0x2E, 0xF4, 0x01, 0xAE, 0x72, 0xD6, 0x86, 0xAB, 0x15, 0x52,
-    0xD2, 0x84, 0xB3, 0x99, 0xE3, 0xFD, 0xA7, 0x28, 0x25, 0x11, 0x68, 0xC6,
-    0x03, 0xDF, 0x1F, 0xF4, 0x54, 0x64, 0x31, 0x17, 0xF2, 0x5E, 0x63, 0x28,
-    0xDC, 0xCE, 0x88, 0x00, 0x48, 0x9A, 0xB6, 0x46, 0x6E, 0x45, 0x9D, 0x91,
-    0x0F, 0xB7, 0x7D, 0x7F, 0x1D, 0x9D, 0xC7, 0x02, 0xAD, 0x5F, 0x0C, 0xDD,
-    0x16, 0x4B, 0x2B, 0xD1, 0x19, 0xF6, 0xB0, 0x54, 0x6D, 0x07, 0x01, 0xEA,
-    0x23, 0x59, 0x8E, 0x5A, 0x2B, 0x7A, 0xF0, 0xD5, 0xA0, 0x4B, 0x85, 0x41,
-    0x77, 0x3B, 0x53, 0x29, 0xA3, 0xCE, 0x00, 0xAB, 0xF7, 0xFA, 0xE0, 0xCA,
-    0x97, 0xD7, 0x87, 0x69, 0x16, 0xEC, 0x8D, 0xF7, 0x6F, 0xDF, 0xE3, 0xF8,
-    0xB8, 0xB8, 0xA8, 0xAC, 0x69, 0x93, 0x40, 0xC7, 0xF2, 0xF2, 0x68, 0xBC,
-    0xF7, 0xA7, 0x13, 0xAB, 0x4E, 0x00, 0x83, 0x5B, 0x33, 0x74, 0xBC, 0x62,
-    0xA3, 0x28, 0xB6, 0x06, 0x45, 0x01, 0xC7, 0x46, 0x87, 0x67, 0x14, 0x52,
-    0xC2, 0x30, 0x17, 0x82, 0xB0, 0x70, 0x51, 0x2B, 0xB7, 0xB6, 0xD0, 0xB3,
-    0x9E, 0xD2, 0x39, 0x11, 0x21, 0x61, 0x52, 0x29, 0xD7, 0x2C, 0x2A, 0x57,
-    0x6B, 0xBD, 0x29, 0x54, 0x4F, 0xD7, 0x09, 0x9B, 0x17, 0x6B, 0x48, 0x53,
-    0x0C, 0xFB, 0xBD, 0x51, 0xEB, 0xAB, 0xB4, 0xAE, 0x6E, 0xDE, 0xA9, 0x3C,
-    0x9F, 0xD3, 0x72, 0xAB, 0x07, 0xBD, 0xF8, 0x4D, 0xD7, 0x6B, 0xBD, 0xE8,
-    0x29, 0x65, 0x79, 0xE6, 0x78, 0x9B, 0xBD, 0xC8, 0x05, 0x11, 0xDC, 0xF1,
-    0x5E, 0x9A, 0x5C, 0xB7, 0x3B, 0x36, 0x20, 0xB5, 0xEF, 0x8D, 0x13, 0x5D,
-    0xA0, 0xBE, 0xC1, 0x96, 0x81, 0xE3, 0xFD, 0xF9, 0xF4, 0x15, 0xCE, 0x8A,
-    0x0E, 0xC3, 0x2C, 0xA2, 0x34, 0x34, 0xE3, 0xE5, 0x02, 0x8E, 0x88, 0xF3,
-    0xD3, 0xDE, 0xA2, 0xB6, 0xE9, 0xA6, 0xC4, 0xD5, 0xBB, 0x2D, 0x9F, 0x86,
-    0xC5, 0x9C, 0x5C, 0xE2, 0xB0, 0x3C, 0xFA, 0xEA, 0xA5, 0xAA, 0xE5, 0x2F,
-    0xE0, 0x13, 0x27, 0x42, 0x13, 0xF0, 0xC2, 0x6D, 0x33, 0xEB, 0x34, 0x65,
-    0x94, 0xB3, 0x07, 0xD3, 0xBB, 0x3C, 0x17, 0x94, 0x08, 0x14, 0xC8, 0xC8,
-    0x9A, 0x1F, 0x45, 0xF0, 0x69, 0x81, 0x26, 0xF4, 0x11, 0xC2, 0x21, 0x7C,
-    0x35, 0x91, 0xDB, 0x15, 0x84, 0x91, 0xC0, 0x53, 0x78, 0x60, 0x1E, 0x26,
-    0x9C, 0xC5, 0x98, 0x5A, 0xD3, 0xC7, 0xBC, 0xC8, 0xAF, 0x31, 0x3A, 0xE0,
-    0x32, 0xA6, 0x61, 0x39, 0xC7, 0xE6, 0xBB, 0xD7, 0xC8, 0x5F, 0x45, 0x85,
-    0x91, 0xC3, 0x98, 0xD7, 0xD4, 0xD3, 0x15, 0x7F, 0x0A, 0xCC, 0x59, 0x39,
-    0x19, 0x7A, 0xB3, 0x82, 0x04, 0x6F, 0xFA, 0xC7, 0x49, 0xFE, 0x22, 0x67,
-    0xB3, 0x2B, 0xBE, 0xE4, 0xA9, 0xE6, 0xDC, 0xFB, 0x3D, 0x2B, 0xA3, 0xEA,
-    0x73, 0x16, 0x96, 0xFF, 0x00, 0x29, 0x27, 0xAF, 0x17,
-};
-const uint8_t g_frFR_Locale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x6F, 0xD3, 0x40, 0x10, 0xBD, 0x23, 0xF1,
-    0x1F, 0x56, 0x16, 0x55, 0x41, 0x6A, 0xBD, 0x70, 0x4C, 0x95, 0x5A, 0xAA,
-    0xFA, 0x15, 0x28, 0x46, 0x51, 0x53, 0x40, 0xF4, 0x82, 0x36, 0xF6, 0x36,
-    0xDE, 0xD4, 0xDE, 0x8D, 0xD6, 0x76, 0x4A, 0x7C, 0xE4, 0x3F, 0x70, 0xE2,
-    0xC2, 0xB5, 0x12, 0x88, 0x03, 0x47, 0xC4, 0x85, 0xFE, 0x13, 0x24, 0x10,
-    0x3F, 0x83, 0x71, 0xBC, 0x76, 0xED, 0x5D, 0x27, 0xB8, 0xBE, 0x64, 0xE7,
-    0xCD, 0x7B, 0xE3, 0x99, 0xB7, 0xF6, 0xC6, 0xFD, 0x50, 0x78, 0x24, 0xA4,
-    0x88, 0x93, 0x88, 0xEE, 0x5A, 0x17, 0xF2, 0xED, 0xD1, 0xA9, 0x85, 0x7C,
-    0x1A, 0x7B, 0xBB, 0xD6, 0x9F, 0x6F, 0x1F, 0xFE, 0x7E, 0xFD, 0xF2, 0x10,
-    0x7E, 0x7E, 0x7F, 0xFC, 0xF1, 0xC8, 0x72, 0xFA, 0x39, 0x91, 0xFB, 0x44,
-    0x8E, 0x16, 0xD1, 0x58, 0x84, 0xB1, 0xD2, 0x4C, 0x24, 0x9D, 0x08, 0xC9,
-    0x08, 0x07, 0x46, 0x24, 0x78, 0x12, 0xBC, 0x00, 0x38, 0x56, 0x6B, 0x67,
-    0x4A, 0xF8, 0x9C, 0x51, 0xD9, 0xC7, 0x45, 0x78, 0xFF, 0x9E, 0xC2, 0x2F,
-    0x6E, 0xAE, 0xE7, 0xB2, 0x2D, 0x11, 0x11, 0x19, 0x1B, 0x20, 0x01, 0x6E,
-    0xD8, 0x42, 0x65, 0x06, 0x36, 0x4D, 0x19, 0x6F, 0x03, 0xC3, 0x90, 0x26,
-    0x66, 0x59, 0x71, 0xF3, 0xDD, 0x44, 0x63, 0x3A, 0x4B, 0x68, 0x34, 0x96,
-    0xD4, 0xC8, 0x08, 0x2F, 0x11, 0x6D, 0x38, 0x17, 0xF3, 0x76, 0x81, 0x7F,
-    0x73, 0xED, 0xE9, 0x19, 0x5C, 0x33, 0xA9, 0x24, 0x2E, 0x23, 0x44, 0xC6,
-    0x63, 0xB9, 0x6B, 0x3D, 0xB1, 0xEA, 0xDE, 0xD9, 0xED, 0xCE, 0x99, 0xF0,
-    0x2A, 0xDF, 0xDA, 0x98, 0x77, 0xB0, 0xCD, 0x94, 0xAF, 0x36, 0xCD, 0xE4,
-    0x82, 0x61, 0x26, 0x08, 0x6E, 0x99, 0x60, 0xEE, 0x94, 0xBD, 0xDA, 0x25,
-    0x9F, 0x2C, 0xD4, 0x63, 0x05, 0x2B, 0xC7, 0x67, 0x11, 0xE1, 0x5E, 0x00,
-    0xAE, 0xE6, 0x51, 0x91, 0x76, 0xC2, 0x94, 0xFB, 0xAC, 0x81, 0x80, 0x25,
-    0x3A, 0x42, 0xA5, 0x27, 0xA9, 0x06, 0x4E, 0x69, 0xAA, 0x21, 0x73, 0x78,
-    0xCC, 0x0D, 0x5A, 0x0C, 0xF7, 0xAF, 0x41, 0xB8, 0x6A, 0xA9, 0xD6, 0x5E,
-    0x6D, 0x0B, 0x55, 0x9F, 0xB6, 0xDE, 0xA3, 0xAD, 0xB7, 0x68, 0xEB, 0x1D,
-    0xDA, 0x7A, 0x77, 0xB6, 0xDE, 0x9C, 0xAD, 0x37, 0x66, 0xB7, 0xB7, 0x05,
-    0xC5, 0x98, 0xCF, 0x68, 0x54, 0xBE, 0x91, 0x2A, 0x74, 0xF6, 0x5C, 0xF0,
-    0xB7, 0x0C, 0x6A, 0x3C, 0x67, 0xA8, 0x25, 0x70, 0xB3, 0x02, 0x20, 0x54,
-    0x12, 0x55, 0x0D, 0x56, 0xF0, 0x7C, 0xD9, 0xE8, 0x99, 0xBD, 0xBD, 0x0F,
-    0xF7, 0xCF, 0xC3, 0x22, 0xEF, 0x90, 0x99, 0x8E, 0xE2, 0x4A, 0x96, 0x07,
-    0xDA, 0x39, 0x52, 0xCC, 0x91, 0xD0, 0x21, 0x49, 0x12, 0x2A, 0xF9, 0x72,
-    0x8F, 0xAB, 0xA8, 0x3C, 0x98, 0xD2, 0x30, 0xB4, 0x9C, 0x43, 0xB8, 0xD0,
-    0x01, 0x72, 0xE1, 0x42, 0x6F, 0xE0, 0xCA, 0xA7, 0xAD, 0x98, 0x5A, 0x19,
-    0x25, 0x0C, 0x05, 0x9F, 0x58, 0xCE, 0xDD, 0x34, 0xB0, 0xCF, 0x4A, 0x82,
-    0x3A, 0xF1, 0xE3, 0x40, 0xC8, 0x04, 0x14, 0x07, 0xD8, 0x75, 0x71, 0x8B,
-    0x02, 0x37, 0xA6, 0x03, 0x20, 0x61, 0x51, 0x6D, 0xDA, 0x5A, 0xD4, 0x98,
-    0x76, 0x30, 0xD8, 0x44, 0x01, 0xDA, 0x84, 0x2E, 0xCE, 0xFB, 0xB8, 0x46,
-    0xD2, 0x2A, 0x34, 0x06, 0x1D, 0x0C, 0x76, 0x5C, 0x77, 0x67, 0x34, 0xEA,
-    0x24, 0x59, 0xCE, 0x59, 0x2A, 0x3A, 0xF0, 0xD5, 0x9C, 0x4B, 0x85, 0x41,
-    0xC7, 0x8D, 0xA1, 0x94, 0x4F, 0x67, 0x80, 0x95, 0xBB, 0x7C, 0x4C, 0xDC,
-    0xE9, 0xE5, 0x20, 0x8A, 0x47, 0x87, 0x07, 0x47, 0x57, 0xAF, 0xDF, 0x05,
-    0x27, 0xD9, 0x79, 0xE1, 0x4C, 0x9D, 0x04, 0x3A, 0x9E, 0x46, 0x63, 0x2A,
-    0x6F, 0xED, 0x69, 0xC4, 0xAA, 0x13, 0xC0, 0xE0, 0xC1, 0xF4, 0x2C, 0x27,
-    0xDB, 0xCA, 0xB2, 0x9E, 0x9D, 0x65, 0x59, 0x1F, 0x37, 0x78, 0x46, 0x21,
-    0x25, 0xF4, 0x52, 0x29, 0x29, 0xF7, 0x16, 0xA5, 0xB2, 0xD7, 0x43, 0x0F,
-    0x3A, 0x4A, 0x67, 0x70, 0x76, 0x50, 0x9E, 0x28, 0xE5, 0x46, 0x8B, 0x0A,
-    0x6B, 0xAD, 0x57, 0x85, 0xCA, 0xE9, 0x1A, 0xA1, 0x2A, 0xEB, 0x53, 0x0F,
-    0x4E, 0x33, 0xD8, 0xEE, 0xAD, 0x52, 0x5F, 0xA4, 0x75, 0x75, 0xF5, 0x6F,
-    0x2B, 0xD2, 0x19, 0xCB, 0xB7, 0xFA, 0xE7, 0xA7, 0x4E, 0x82, 0xAA, 0xED,
-    0x8D, 0x4E, 0xF4, 0x88, 0xF1, 0x34, 0xB6, 0x9C, 0xED, 0x4E, 0xE4, 0x8C,
-    0x4A, 0x61, 0x39, 0x8F, 0x4D, 0x2E, 0x6E, 0xCE, 0x0D, 0x48, 0x69, 0x7C,
-    0x65, 0x45, 0x13, 0x28, 0x9F, 0xB0, 0x65, 0x60, 0x39, 0xBF, 0xDE, 0x7F,
-    0x86, 0x63, 0xA2, 0xC1, 0x30, 0x8B, 0x28, 0x0D, 0x8B, 0x45, 0xBE, 0x80,
-    0xD3, 0xE1, 0xE5, 0x69, 0x67, 0x51, 0xDD, 0x75, 0x53, 0x82, 0xF5, 0x6E,
-    0xF3, 0xD7, 0x61, 0x31, 0xA3, 0x17, 0xC4, 0xCB, 0x4F, 0xBE, 0x72, 0xA9,
-    0x6A, 0xB9, 0x0B, 0xF8, 0xFA, 0xF1, 0xD1, 0x10, 0xBC, 0xC0, 0x75, 0x66,
-    0x99, 0x66, 0x9C, 0x09, 0xBE, 0x32, 0xBD, 0x2F, 0xD2, 0xFC, 0x3B, 0x08,
-    0x8D, 0x12, 0xBF, 0x35, 0xBF, 0xE7, 0x8B, 0x31, 0x45, 0x43, 0xF6, 0x1F,
-    0xC2, 0x80, 0xC2, 0x57, 0xC6, 0xD5, 0x1A, 0xC2, 0x9E, 0x24, 0x63, 0x78,
-    0x63, 0x56, 0x13, 0xCE, 0x02, 0xC2, 0x5A, 0xD3, 0x27, 0x22, 0x4B, 0x2F,
-    0x09, 0x3A, 0x16, 0x49, 0xC0, 0xBC, 0x7C, 0x8E, 0xED, 0x57, 0x4F, 0x91,
-    0xBB, 0x8E, 0x0A, 0x23, 0x7B, 0x81, 0x28, 0xA9, 0xA7, 0x6B, 0x6E, 0x0A,
-    0xCC, 0x49, 0x3E, 0x19, 0x7A, 0xBE, 0x86, 0x34, 0x12, 0x1D, 0x48, 0xEE,
-    0x22, 0xE5, 0x93, 0xA9, 0x58, 0xF2, 0x54, 0x73, 0xF8, 0x76, 0xCF, 0xF2,
-    0xA8, 0xF8, 0xD2, 0x85, 0xE5, 0x3F, 0x5D, 0x49, 0xBE, 0x1B};
-const uint8_t g_itIT_Locale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0xD1, 0x6A, 0xD4, 0x40, 0x14, 0x7D, 0x17, 0xFC,
-    0x87, 0x21, 0x58, 0x50, 0x68, 0x3B, 0xFA, 0xD8, 0x92, 0x06, 0x4A, 0x5B,
-    0xBB, 0xA5, 0x46, 0x96, 0xEE, 0xAA, 0xD8, 0x17, 0x99, 0x64, 0xA6, 0xD9,
-    0xB1, 0xC9, 0xCC, 0x32, 0x49, 0x5A, 0x92, 0x47, 0xF1, 0xC1, 0x37, 0x7F,
-    0x42, 0x10, 0x41, 0xF1, 0x23, 0xFC, 0x13, 0xA1, 0xE2, 0x67, 0x78, 0xB3,
-    0x99, 0xA4, 0xC9, 0x64, 0xBA, 0xA6, 0x79, 0xD9, 0xB9, 0xE7, 0x9E, 0x73,
-    0x73, 0xEF, 0x99, 0x64, 0x36, 0x6E, 0x2C, 0x43, 0x12, 0x33, 0x24, 0x48,
-    0xC2, 0xF6, 0x1C, 0x9E, 0xBD, 0x3B, 0x99, 0x3B, 0x88, 0xB2, 0x34, 0xDC,
-    0x73, 0xFE, 0x7C, 0xFC, 0x7C, 0xF3, 0xE5, 0xEB, 0xCD, 0xA7, 0x6F, 0x7F,
-    0x7F, 0xFE, 0x78, 0xDC, 0x06, 0x4F, 0x1C, 0xCF, 0xAD, 0x14, 0x82, 0x12,
-    0x35, 0x2B, 0x92, 0x40, 0xC6, 0xA9, 0x16, 0x47, 0x8A, 0x45, 0x52, 0x71,
-    0x22, 0x80, 0x91, 0x48, 0x91, 0x2D, 0x5E, 0x02, 0x9C, 0xEA, 0xB5, 0x17,
-    0x31, 0x21, 0x08, 0x97, 0x2E, 0xAE, 0xC3, 0x87, 0x0F, 0x34, 0x7E, 0xC1,
-    0x82, 0x40, 0xD9, 0x12, 0x09, 0x51, 0xE5, 0x10, 0x25, 0x4B, 0xC5, 0x63,
-    0x66, 0x21, 0x47, 0x91, 0xA5, 0x46, 0xC4, 0xF3, 0x48, 0x0C, 0xE1, 0x38,
-    0x8F, 0x62, 0x0B, 0x9B, 0x44, 0x32, 0xCD, 0x86, 0x70, 0xCA, 0xB2, 0x8C,
-    0x25, 0x81, 0x1A, 0xDE, 0x55, 0x66, 0x99, 0xB4, 0xE1, 0x42, 0x5E, 0xD9,
-    0x05, 0x94, 0x87, 0x66, 0x02, 0x77, 0xAC, 0x6A, 0x78, 0xAB, 0x08, 0x11,
-    0x30, 0x66, 0xCF, 0x79, 0xE6, 0x74, 0x1C, 0xB4, 0xB9, 0x67, 0x33, 0xCE,
-    0x66, 0x9B, 0xCD, 0x33, 0x9B, 0x61, 0x36, 0xB7, 0x6C, 0x56, 0xD9, 0x7C,
-    0xB2, 0x39, 0x64, 0x73, 0xC7, 0x66, 0xCC, 0xDD, 0x9E, 0x50, 0x52, 0xE8,
-    0x47, 0x09, 0x56, 0x1E, 0x95, 0x09, 0x13, 0x3C, 0x24, 0x2E, 0xAE, 0xA2,
-    0x3A, 0x0D, 0x3D, 0x0A, 0x46, 0x7F, 0x7D, 0xEF, 0x61, 0xE0, 0x43, 0x36,
-    0x04, 0x99, 0x0A, 0x65, 0x3C, 0x80, 0xE1, 0xE1, 0xB9, 0x1A, 0x80, 0x57,
-    0x4C, 0x30, 0x65, 0x82, 0x29, 0x09, 0x48, 0xF5, 0x90, 0x68, 0x08, 0xB7,
-    0xCD, 0x75, 0x1A, 0xED, 0x6C, 0x9D, 0xEE, 0xD8, 0x6C, 0xD6, 0x6C, 0xD4,
-    0xEC, 0xD1, 0x6C, 0xCE, 0xEC, 0xCB, 0x6C, 0xC9, 0xDE, 0x0F, 0x14, 0xE2,
-    0x94, 0xB3, 0xA4, 0x79, 0x11, 0x75, 0xE8, 0xED, 0xFB, 0x60, 0x71, 0x13,
-    0x74, 0x78, 0xDE, 0xD4, 0x48, 0xE0, 0x7E, 0x05, 0x40, 0x98, 0x22, 0xBA,
-    0x1A, 0xAC, 0x3C, 0x72, 0xE0, 0xE2, 0xEA, 0xB7, 0x4E, 0x78, 0xF4, 0x36,
-    0xC4, 0x2D, 0xB1, 0x0A, 0x8C, 0x03, 0xA3, 0x6E, 0x3C, 0x63, 0x53, 0x02,
-    0x6F, 0x96, 0x12, 0xAB, 0x8D, 0x6D, 0x23, 0x7D, 0x9A, 0x5C, 0xE4, 0x71,
-    0xEC, 0x78, 0x47, 0x70, 0xA1, 0x43, 0xE4, 0xC3, 0x85, 0xDE, 0xC2, 0x55,
-    0xCD, 0xD7, 0x32, 0x8D, 0x32, 0x5A, 0x18, 0x4B, 0x11, 0x39, 0xDE, 0xE1,
-    0xFD, 0x44, 0x09, 0xA3, 0x95, 0x06, 0x83, 0x04, 0x8F, 0x12, 0xA4, 0x0B,
-    0xA9, 0x32, 0x2D, 0xB1, 0x29, 0x70, 0x6F, 0x3E, 0x00, 0x32, 0x9E, 0x74,
-    0xE6, 0xED, 0x44, 0xBD, 0x79, 0x27, 0x93, 0x5D, 0xDF, 0xDF, 0x9D, 0xCD,
-    0xD0, 0xB9, 0x8B, 0x3B, 0x1C, 0xA3, 0x40, 0x6F, 0xD2, 0xFB, 0x28, 0x56,
-    0x63, 0x36, 0xF7, 0x18, 0xC1, 0xD7, 0x53, 0xAE, 0x14, 0x03, 0x3A, 0xEE,
-    0x8D, 0xA4, 0x5D, 0x9A, 0x03, 0xD6, 0xEC, 0xF2, 0x71, 0xE1, 0xD3, 0xCB,
-    0x49, 0x92, 0xCE, 0x8E, 0x0E, 0x9F, 0x5F, 0xBF, 0x21, 0x8B, 0xD3, 0xF2,
-    0xBC, 0xF6, 0xA5, 0x4B, 0x02, 0x9D, 0xC8, 0x93, 0x80, 0xA9, 0x5B, 0x73,
-    0x7A, 0xB1, 0xEE, 0x04, 0x30, 0x78, 0x14, 0x43, 0xC7, 0x2B, 0x37, 0xCB,
-    0x72, 0x67, 0xBB, 0x2C, 0x4B, 0x17, 0xF7, 0x78, 0x83, 0x42, 0x5A, 0x18,
-    0xE6, 0x4A, 0x31, 0x11, 0x16, 0x8E, 0xF7, 0x08, 0xD5, 0xDA, 0x9D, 0x9D,
-    0x91, 0xD2, 0x25, 0x9C, 0x15, 0x4C, 0x64, 0xFA, 0x9E, 0x1B, 0x16, 0x15,
-    0x36, 0x5A, 0x6F, 0x0B, 0x35, 0xD3, 0xF5, 0x42, 0x5D, 0x96, 0xB2, 0x90,
-    0x27, 0x04, 0x36, 0x7B, 0xB3, 0xD1, 0xD7, 0x69, 0x53, 0xDD, 0xFE, 0xAD,
-    0xCA, 0x7C, 0xC9, 0xAB, 0x9D, 0xDE, 0x1E, 0xC5, 0x6F, 0xBB, 0xDE, 0x18,
-    0x45, 0x4F, 0xB8, 0xC8, 0x53, 0xC7, 0xDB, 0x1A, 0x45, 0x2E, 0x99, 0x92,
-    0x8E, 0xF7, 0x74, 0xC8, 0xC5, 0xFD, 0xB1, 0x01, 0x69, 0x7C, 0x6F, 0x9D,
-    0xE8, 0x03, 0xCD, 0x03, 0xB6, 0x0A, 0x1C, 0xEF, 0xF7, 0x07, 0x38, 0x65,
-    0xFB, 0x8C, 0x61, 0x91, 0xE6, 0x23, 0x25, 0x95, 0xD5, 0x02, 0x0E, 0x87,
-    0x57, 0x67, 0xA3, 0x45, 0x5D, 0xD3, 0x87, 0x12, 0x6C, 0x76, 0x5B, 0xBD,
-    0x0D, 0xC5, 0x92, 0x5D, 0x90, 0xB0, 0x3A, 0xEA, 0x9A, 0xA5, 0xAE, 0xE5,
-    0x17, 0xF0, 0x95, 0x43, 0xD1, 0x14, 0xBC, 0xC0, 0x5D, 0x66, 0x93, 0xE6,
-    0x82, 0x4B, 0x71, 0x67, 0xFA, 0x40, 0xE6, 0x8A, 0x33, 0x85, 0x66, 0x19,
-    0xB5, 0xE6, 0xF7, 0xA9, 0x0C, 0x18, 0x9A, 0xF2, 0xFF, 0x10, 0x26, 0x0C,
-    0xBE, 0x23, 0xAE, 0xD7, 0x10, 0xF6, 0x15, 0x09, 0xE0, 0x85, 0xB9, 0x9B,
-    0x30, 0x5F, 0x10, 0x6E, 0x4D, 0x9F, 0xCA, 0x32, 0xBF, 0x24, 0xE8, 0x58,
-    0x66, 0x0B, 0x1E, 0x56, 0x73, 0x6C, 0xBD, 0x3E, 0x41, 0xFE, 0x3A, 0x2A,
-    0x8C, 0x1C, 0x2E, 0x64, 0x43, 0x3D, 0x5B, 0x73, 0x53, 0x60, 0x46, 0xD5,
-    0x64, 0xE8, 0xC5, 0x1A, 0xD2, 0x4C, 0x8E, 0x20, 0xF9, 0x45, 0x2E, 0xA2,
-    0xF7, 0x72, 0xC5, 0xD3, 0xCD, 0xE1, 0xDB, 0x3D, 0xAB, 0xA2, 0xFA, 0xD3,
-    0x16, 0x96, 0xFF, 0x00, 0x20, 0x8B, 0xBE, 0xF7};
-const uint8_t g_ptBR_Locale[] = {
-    0x78, 0x9C, 0x9D, 0x56, 0x3D, 0x6F, 0xD4, 0x40, 0x10, 0xAD, 0x83, 0xC4,
-    0x7F, 0x58, 0x59, 0x89, 0x0E, 0xA4, 0x24, 0x86, 0x92, 0xC8, 0x67, 0xE9,
-    0x92, 0x0B, 0x39, 0x94, 0x18, 0x9D, 0xCE, 0x11, 0x88, 0x34, 0x68, 0x6D,
-    0xEF, 0xD9, 0x9B, 0xD8, 0xBB, 0xC7, 0xDA, 0x4E, 0xB0, 0x6B, 0x1A, 0x3A,
-    0x28, 0x29, 0x53, 0x20, 0x2A, 0x44, 0x83, 0x44, 0x49, 0x91, 0xDF, 0x82,
-    0xB8, 0x9F, 0xC1, 0xFA, 0xF3, 0xFC, 0xB1, 0x36, 0x06, 0x37, 0xDE, 0x99,
-    0x79, 0x6F, 0x3D, 0xF3, 0x76, 0x76, 0x64, 0xC5, 0xA5, 0x26, 0x74, 0x11,
-    0x20, 0xD0, 0x43, 0x63, 0x69, 0x15, 0xBC, 0x3E, 0x5C, 0x48, 0xC0, 0x42,
-    0xBE, 0x39, 0x96, 0xD6, 0x1F, 0x6F, 0xD7, 0x1F, 0xDE, 0xFD, 0x7E, 0xFF,
-    0x69, 0xFD, 0xED, 0xEB, 0x83, 0x5F, 0x3F, 0xBE, 0xAF, 0x3F, 0xFF, 0x7C,
-    0x28, 0xA9, 0xF7, 0xEF, 0x01, 0xA0, 0x24, 0x14, 0x62, 0x41, 0xA6, 0x47,
-    0x9E, 0x41, 0x5D, 0x3F, 0x67, 0xDB, 0x0C, 0xD9, 0x94, 0x61, 0x48, 0x12,
-    0xD4, 0x16, 0x50, 0x3C, 0x4A, 0x02, 0xE7, 0x39, 0x0F, 0xF9, 0x89, 0xBD,
-    0x95, 0xD9, 0xEA, 0x25, 0x24, 0x08, 0x33, 0xAA, 0xC8, 0x99, 0x59, 0x89,
-    0x2C, 0xD1, 0x35, 0x62, 0x1D, 0x31, 0x0F, 0xB2, 0xBB, 0x2F, 0xA2, 0x00,
-    0x34, 0x18, 0x76, 0x85, 0x04, 0x2C, 0x82, 0x5F, 0x86, 0xC4, 0x11, 0xFB,
-    0x5D, 0xA1, 0x1F, 0xDA, 0xD4, 0x0F, 0x44, 0x01, 0x1F, 0x05, 0xC8, 0x33,
-    0x84, 0xB9, 0xD2, 0x30, 0x08, 0xC5, 0x11, 0x42, 0xAF, 0xBB, 0x48, 0x16,
-    0x8A, 0x9B, 0x21, 0x90, 0xAF, 0x4B, 0x09, 0xAB, 0x92, 0x02, 0x68, 0x18,
-    0x6C, 0x2C, 0x3D, 0x96, 0x1A, 0xDA, 0x8A, 0x75, 0x15, 0x2B, 0x2A, 0x96,
-    0x53, 0x2C, 0xA6, 0x58, 0x4B, 0xB1, 0x92, 0x62, 0x1D, 0xC5, 0x22, 0x8A,
-    0xF5, 0x13, 0x6B, 0x27, 0x96, 0xAD, 0x5F, 0x31, 0x0B, 0x46, 0x95, 0x16,
-    0xE4, 0x96, 0x6A, 0x51, 0x0F, 0x93, 0x24, 0x9D, 0xC4, 0x28, 0xBD, 0x3E,
-    0xB2, 0x43, 0xDE, 0xD2, 0x7B, 0x4B, 0xDE, 0x80, 0xB0, 0x11, 0x0B, 0x10,
-    0x6F, 0x3E, 0x71, 0xE8, 0x4D, 0x08, 0x59, 0xD0, 0x15, 0xC2, 0xA4, 0x23,
-    0xE4, 0xA3, 0xB7, 0x5D, 0x91, 0xBB, 0x5B, 0x03, 0x5A, 0x9B, 0xE4, 0x40,
-    0xBA, 0x12, 0xD4, 0xD3, 0x38, 0xFF, 0xBC, 0xB0, 0x76, 0x51, 0xED, 0x52,
-    0xDA, 0x15, 0xB4, 0x13, 0x6F, 0xE7, 0x2B, 0xC8, 0xB3, 0x3B, 0x49, 0x0F,
-    0x31, 0x6C, 0x61, 0xE4, 0x55, 0x2F, 0x7F, 0xEE, 0x52, 0x27, 0x1A, 0x3F,
-    0xA4, 0xC2, 0xA8, 0x87, 0xE6, 0x8D, 0x10, 0xD8, 0x98, 0x95, 0xCD, 0x11,
-    0x83, 0x95, 0x7D, 0xB9, 0xA5, 0x1E, 0x1E, 0x29, 0x72, 0xF2, 0x2E, 0x1D,
-    0x93, 0x69, 0xE9, 0x00, 0xE9, 0xAA, 0x20, 0xF0, 0xD9, 0x25, 0x37, 0x86,
-    0x57, 0xE6, 0xB5, 0x60, 0x80, 0xE6, 0x30, 0xE0, 0xF2, 0x90, 0x52, 0xE8,
-    0xD2, 0x93, 0xCF, 0xB7, 0x65, 0xE8, 0xBA, 0x92, 0x7A, 0xCC, 0x9F, 0x5D,
-    0x30, 0x1D, 0xF1, 0x29, 0x09, 0x46, 0x1A, 0x7F, 0xB2, 0xD5, 0x2B, 0xFE,
-    0x24, 0x32, 0x94, 0xA4, 0xAE, 0x5D, 0x5C, 0x4A, 0x6C, 0x49, 0xFD, 0x7F,
-    0xBE, 0x87, 0x2C, 0x4E, 0x9F, 0xCA, 0x9A, 0x26, 0x0F, 0xE6, 0xF8, 0x0E,
-    0x65, 0xC1, 0x86, 0xD5, 0xE4, 0x00, 0x50, 0xF3, 0xE4, 0x92, 0x04, 0xD8,
-    0x6B, 0x48, 0x52, 0xF1, 0xD4, 0x24, 0x99, 0xCD, 0x46, 0x0E, 0x2F, 0x65,
-    0xC4, 0xEF, 0xD5, 0x48, 0xD7, 0x47, 0xFE, 0x08, 0x5C, 0x28, 0x72, 0x05,
-    0xDC, 0xC5, 0xCE, 0xA4, 0x48, 0xC9, 0x19, 0x77, 0x38, 0x35, 0x55, 0x61,
-    0x36, 0x3B, 0xD0, 0xB4, 0x03, 0x5D, 0x1F, 0xC4, 0xC8, 0x35, 0x48, 0x39,
-    0x4D, 0x42, 0x22, 0x40, 0xA3, 0xDC, 0xBC, 0x27, 0xCE, 0xB9, 0xB7, 0x68,
-    0x94, 0x93, 0x48, 0xB3, 0xAE, 0x66, 0x9E, 0xAF, 0x1F, 0x4F, 0x9F, 0xDE,
-    0xBC, 0x84, 0xCE, 0x69, 0x7C, 0x91, 0xE9, 0x56, 0x05, 0xA5, 0x4C, 0x12,
-    0x7A, 0x06, 0x62, 0x75, 0xF1, 0x6A, 0xBE, 0x3C, 0x27, 0xEE, 0xE3, 0xFD,
-    0x6D, 0x4A, 0x6A, 0xBC, 0x1B, 0xC7, 0x4F, 0xF6, 0xE3, 0x98, 0x0F, 0xB3,
-    0x1A, 0xAE, 0x9B, 0x6A, 0x86, 0x8C, 0x21, 0x62, 0x46, 0x92, 0xBA, 0x0D,
-    0x0A, 0xF6, 0x60, 0xF2, 0x0A, 0x31, 0x13, 0x91, 0x20, 0xFF, 0xEE, 0x4E,
-    0x9B, 0x97, 0x08, 0xD2, 0x2A, 0xA2, 0x2C, 0x6C, 0x53, 0xEB, 0x56, 0xDD,
-    0x95, 0x6F, 0x6F, 0x21, 0x13, 0x7B, 0x90, 0x37, 0xC6, 0x6E, 0xB1, 0x4B,
-    0x16, 0xEE, 0x24, 0xD8, 0x8C, 0x86, 0x2B, 0x9C, 0x34, 0xC3, 0xFE, 0x40,
-    0x46, 0x59, 0xC1, 0xCE, 0x40, 0x02, 0xEF, 0xAF, 0xD0, 0x97, 0xD4, 0xBD,
-    0x81, 0xF0, 0x18, 0x31, 0x2A, 0xA9, 0x8F, 0x5A, 0xE8, 0x8D, 0x30, 0xB5,
-    0x03, 0x2F, 0x4E, 0xA3, 0xA6, 0x4C, 0xDD, 0x59, 0xB4, 0x61, 0x6A, 0x48,
-    0xEA, 0x62, 0x9B, 0x4F, 0xA2, 0x1A, 0xA0, 0x87, 0x84, 0x7D, 0x9A, 0x2C,
-    0x24, 0xF5, 0x70, 0x71, 0xF6, 0x0F, 0xB4, 0xEA, 0x39, 0xB4, 0x48, 0xE9,
-    0x28, 0x6C, 0xA5, 0x9D, 0xDC, 0xFB, 0x68, 0x85, 0x96, 0xD0, 0x2C, 0xC6,
-    0x6D, 0x61, 0xE6, 0x7B, 0x6A, 0x11, 0xFF, 0xC3, 0xB3, 0xC0, 0x9C, 0xCB,
-    0x23, 0x8B, 0x01, 0x98, 0x60, 0x4A, 0x7A, 0x00, 0x47, 0x34, 0x64, 0x18,
-    0x31, 0xA0, 0x07, 0x56, 0x07, 0x62, 0x62, 0x51, 0x03, 0x81, 0x39, 0xFE,
-    0x2B, 0x64, 0x86, 0x0C, 0x86, 0x6E, 0x7A, 0x21, 0x13, 0x06, 0x0D, 0x7E,
-    0xC3, 0xFA, 0x20, 0xE7, 0x0E, 0xC4, 0x1D, 0x80, 0x53, 0x1A, 0x87, 0x57,
-    0x10, 0x9C, 0xD0, 0xC0, 0xC1, 0x66, 0x52, 0xD3, 0xDE, 0x8B, 0x67, 0x40,
-    0xEB, 0x07, 0x73, 0x01, 0x4C, 0x87, 0x16, 0xE0, 0x45, 0xEF, 0xA7, 0x39,
-    0xD6, 0x4E, 0xAA, 0x04, 0x67, 0xBD, 0x30, 0x9D, 0x0E, 0x82, 0x69, 0x51,
-    0x48, 0xEC, 0x4B, 0x9A, 0x22, 0xB3, 0x24, 0xD3, 0xC1, 0x56, 0x39, 0x4F,
-    0x45, 0xCE, 0xFE, 0xF7, 0xD5, 0x3F, 0x30, 0xBB, 0xD9, 0x9B};
-const uint8_t g_nlNL_Locale[] = {
-    0x78, 0x9C, 0x95, 0x56, 0x4D, 0x4F, 0xDC, 0x30, 0x10, 0x3D, 0x53, 0xA9,
-    0xFF, 0xC1, 0x8A, 0x8A, 0x68, 0x25, 0x96, 0x2D, 0x47, 0x50, 0x88, 0xB4,
-    0x05, 0x0A, 0x15, 0x04, 0xAD, 0x58, 0xDA, 0xAA, 0x5C, 0x2A, 0x6F, 0x62,
-    0x76, 0xBD, 0x24, 0xF6, 0xCA, 0x89, 0x41, 0xC9, 0xB1, 0x52, 0x8F, 0xFD,
-    0x27, 0xAD, 0xDA, 0x5B, 0xFF, 0x4F, 0xA5, 0x4A, 0xFC, 0x8C, 0x8E, 0xF3,
-    0x45, 0x12, 0x3B, 0x69, 0xC8, 0x05, 0xCF, 0x9B, 0xF7, 0xBC, 0x33, 0xCF,
-    0xCE, 0x10, 0x3B, 0xE0, 0x1E, 0x0E, 0x08, 0x62, 0x38, 0x24, 0x07, 0x16,
-    0x0B, 0x3E, 0x5F, 0x9C, 0x5B, 0xC8, 0x27, 0x91, 0x77, 0x60, 0x3D, 0x7C,
-    0xFB, 0xFD, 0xF7, 0xEB, 0xAF, 0x87, 0x9F, 0x3F, 0x5E, 0xE6, 0xAB, 0x57,
-    0x96, 0xF3, 0xFC, 0x19, 0x42, 0xB6, 0xE2, 0x33, 0x1F, 0x8B, 0x59, 0x12,
-    0xCE, 0x79, 0x10, 0x15, 0xD2, 0x85, 0x20, 0x0B, 0x2E, 0x28, 0x66, 0x8A,
-    0xB5, 0x81, 0xEC, 0x90, 0xB3, 0x78, 0x79, 0x01, 0xA9, 0x48, 0xC5, 0x1B,
-    0x79, 0xEC, 0xAC, 0x30, 0x93, 0x58, 0x50, 0x7B, 0x9C, 0x87, 0xB5, 0xCC,
-    0x0D, 0x99, 0x8B, 0x8E, 0x54, 0x88, 0xB1, 0x88, 0x0D, 0x38, 0x5E, 0x0B,
-    0x1A, 0x98, 0xF8, 0xC4, 0xB4, 0xCB, 0x4A, 0x32, 0x33, 0x1C, 0x98, 0x60,
-    0x2C, 0x17, 0x32, 0x8A, 0x65, 0x64, 0x48, 0x45, 0x64, 0x1D, 0x93, 0x70,
-    0x4E, 0x84, 0x21, 0xC7, 0x6F, 0x63, 0x6E, 0xCE, 0x30, 0x7E, 0xD7, 0x25,
-    0xF2, 0x89, 0xD7, 0x4E, 0xA1, 0x62, 0x5D, 0x19, 0x58, 0x37, 0x14, 0xE1,
-    0xF9, 0x5C, 0x1C, 0x58, 0xBB, 0x56, 0xCB, 0x59, 0xB3, 0xAB, 0x26, 0x83,
-    0xBA, 0xEC, 0x7C, 0x8A, 0x99, 0x66, 0x2F, 0xCD, 0x56, 0x9A, 0x5D, 0x34,
-    0xFB, 0x67, 0xF6, 0xCE, 0x6C, 0x5B, 0xBF, 0x63, 0x3E, 0x4E, 0x6A, 0x17,
-    0x10, 0x22, 0x27, 0xE5, 0x70, 0x71, 0xA1, 0x1A, 0xB5, 0xAE, 0x40, 0xB8,
-    0x5E, 0x06, 0xD4, 0xA7, 0x2C, 0xD2, 0xD1, 0x7B, 0x4E, 0x4C, 0xB0, 0x0F,
-    0xFB, 0x12, 0xA1, 0xE3, 0x77, 0x82, 0xAE, 0x74, 0x34, 0xC5, 0x71, 0x93,
-    0x8C, 0xB2, 0x95, 0xA1, 0xF2, 0xD6, 0x49, 0xE7, 0x2D, 0x68, 0xE5, 0x6B,
-    0x95, 0x6B, 0x45, 0x6B, 0xE5, 0x6A, 0x75, 0x6A, 0x25, 0x76, 0x17, 0x17,
-    0x12, 0x41, 0x7D, 0x4A, 0xC2, 0xFA, 0xCB, 0x5D, 0x40, 0xCE, 0xC4, 0x85,
-    0x63, 0x28, 0x83, 0x66, 0x6A, 0xDA, 0x4A, 0xA1, 0xC7, 0xB0, 0xB6, 0x39,
-    0x11, 0xB8, 0xB6, 0x2F, 0x44, 0xCE, 0x9B, 0x43, 0x7B, 0xAC, 0xFE, 0x56,
-    0xC0, 0xE4, 0xA8, 0x02, 0x50, 0xB6, 0x2A, 0x05, 0x30, 0x9B, 0xC6, 0xAD,
-    0xE1, 0x94, 0xA3, 0x3E, 0x18, 0x3E, 0xC5, 0x31, 0xB8, 0xCE, 0x2A, 0x83,
-    0x2B, 0xA4, 0x98, 0x5F, 0x37, 0x32, 0x08, 0x2C, 0xE7, 0x18, 0x1E, 0x74,
-    0x84, 0x5C, 0x78, 0xD0, 0x27, 0x78, 0x54, 0xEF, 0x15, 0xB3, 0x4B, 0x1A,
-    0x70, 0xB6, 0xB0, 0x9C, 0xA7, 0xAA, 0x42, 0xE2, 0x83, 0x68, 0x04, 0x9A,
-    0xD1, 0x60, 0x4D, 0xB4, 0xE4, 0x22, 0xCE, 0x54, 0x23, 0x5D, 0x81, 0x50,
-    0x03, 0x29, 0x7A, 0x8F, 0x69, 0xD8, 0xEA, 0xBD, 0x86, 0x34, 0x7A, 0x3F,
-    0xDD, 0x77, 0xDD, 0xFD, 0xD9, 0x6C, 0x0B, 0x49, 0x29, 0xB6, 0xD0, 0xB5,
-    0x3D, 0xAE, 0x11, 0xBB, 0x94, 0x79, 0xEB, 0x85, 0x72, 0xA0, 0x26, 0x6B,
-    0xBC, 0x90, 0x0C, 0x12, 0x14, 0x5D, 0x2B, 0x49, 0x9B, 0xAF, 0x7A, 0x6E,
-    0x75, 0x58, 0x9C, 0xF7, 0x15, 0xA0, 0xE5, 0x25, 0x38, 0x49, 0x5C, 0xFF,
-    0xF6, 0x34, 0x8C, 0x66, 0xC7, 0x47, 0x6F, 0xEF, 0x3F, 0xE2, 0xE5, 0x59,
-    0x7A, 0x9D, 0x5B, 0x55, 0x27, 0x65, 0x4A, 0x26, 0xD5, 0x20, 0x6E, 0xFA,
-    0xD5, 0xC0, 0xCA, 0x7F, 0x94, 0x52, 0xDD, 0x5D, 0xCF, 0x72, 0xD2, 0xED,
-    0x34, 0xDD, 0xDB, 0x49, 0xD3, 0xD4, 0x1E, 0x37, 0x78, 0xDD, 0x52, 0x4F,
-    0x0A, 0x41, 0x98, 0x97, 0x58, 0xCE, 0x0B, 0x94, 0xAB, 0xF7, 0xF6, 0xA2,
-    0xC1, 0xEA, 0x35, 0x11, 0x1E, 0x61, 0x71, 0xF1, 0xC3, 0x9B, 0xBA, 0x4E,
-    0x39, 0xA2, 0x75, 0x51, 0x75, 0xF6, 0xD8, 0xEC, 0x46, 0x13, 0x2A, 0xB6,
-    0x87, 0x99, 0x4A, 0x43, 0x0C, 0x97, 0x61, 0xBB, 0xDC, 0x25, 0x4F, 0x77,
-    0x0A, 0x16, 0x82, 0xCB, 0x35, 0x55, 0x97, 0x60, 0x67, 0xA0, 0xA2, 0xEA,
-    0x60, 0x73, 0xA0, 0x20, 0xA4, 0x4C, 0x46, 0x96, 0x33, 0x1A, 0x48, 0x4F,
-    0x89, 0xE0, 0x96, 0xF3, 0x5A, 0x63, 0x3F, 0x1A, 0xD3, 0x38, 0xF1, 0xF2,
-    0x38, 0x1A, 0xCE, 0x34, 0xC1, 0xF2, 0x1A, 0x66, 0x81, 0xE5, 0xFC, 0xF9,
-    0xF2, 0x1D, 0xE6, 0x4C, 0x83, 0xD1, 0xA3, 0xA2, 0x11, 0x57, 0x0B, 0x18,
-    0x2D, 0xEF, 0x2F, 0x9F, 0x20, 0xAB, 0x1F, 0x84, 0x26, 0xCA, 0x06, 0x9D,
-    0x56, 0xB7, 0x7A, 0xD9, 0x93, 0x35, 0xB9, 0xC1, 0x5E, 0x39, 0x4C, 0xCB,
-    0xB0, 0xD8, 0xD3, 0x4D, 0xE0, 0xFB, 0xCC, 0x47, 0x53, 0xF0, 0x67, 0x6C,
-    0x26, 0x50, 0x46, 0x39, 0xEB, 0x21, 0x1C, 0x72, 0x29, 0x28, 0x11, 0x68,
-    0x16, 0xFB, 0x1D, 0x8C, 0x89, 0x0F, 0xDF, 0x3F, 0x68, 0x4A, 0xFF, 0x4B,
-    0x39, 0x85, 0xEF, 0x3D, 0x72, 0xDF, 0x4B, 0x99, 0x08, 0x3C, 0x87, 0x77,
-    0xAC, 0x8F, 0x72, 0xB5, 0xC4, 0xB4, 0x83, 0x70, 0xC6, 0x53, 0x79, 0x8B,
-    0xD1, 0x09, 0x8F, 0x97, 0xD4, 0x53, 0x3D, 0x8D, 0x3E, 0xBC, 0x43, 0x6E,
-    0x3F, 0x19, 0x0C, 0xF0, 0x96, 0xBC, 0x24, 0x5F, 0xF6, 0xFE, 0x34, 0x70,
-    0x17, 0xAA, 0x4B, 0x74, 0xDE, 0x4B, 0x9B, 0xF1, 0x41, 0x34, 0x37, 0x91,
-    0x6C, 0xB1, 0xE2, 0x19, 0x33, 0x2F, 0x32, 0x1B, 0x6D, 0xB5, 0xF3, 0xB4,
-    0xC7, 0xF9, 0xA7, 0xBA, 0xF3, 0x0F, 0xD5, 0xFA, 0xC0, 0xFA};
-const uint8_t g_ruRU_Locale[] = {
-    0x78, 0x9C, 0xAD, 0x57, 0x4D, 0x4F, 0x13, 0x41, 0x18, 0x3E, 0x63, 0xE2,
-    0x7F, 0x98, 0x6C, 0x24, 0x68, 0x02, 0xAD, 0x1E, 0x25, 0x65, 0x13, 0x22,
-    0x0A, 0x06, 0xD7, 0x90, 0x16, 0x34, 0x72, 0x31, 0xDB, 0xDD, 0xA1, 0x5D,
-    0xE8, 0xEE, 0x90, 0xE9, 0x6E, 0xB0, 0x7B, 0x2A, 0x85, 0xE8, 0x05, 0x25,
-    0xE1, 0xA0, 0x47, 0xF4, 0xE4, 0xC9, 0x50, 0xBE, 0x12, 0x82, 0xB6, 0x24,
-    0xFE, 0x82, 0xD9, 0xFF, 0x60, 0xD4, 0x9F, 0xE1, 0x3B, 0xFB, 0xD1, 0xEE,
-    0xB7, 0xC5, 0xD8, 0x1E, 0x3A, 0xF3, 0x3E, 0xCF, 0xF3, 0xCE, 0xFB, 0xB5,
-    0xD3, 0xB6, 0xD4, 0x20, 0x8A, 0xDC, 0xC0, 0xC8, 0x90, 0x75, 0x3C, 0x23,
-    0x50, 0xEB, 0x65, 0x79, 0x45, 0x40, 0x2A, 0x6E, 0x2A, 0x33, 0xC2, 0x8F,
-    0xAB, 0xDD, 0xDF, 0x47, 0x5F, 0x6E, 0xC3, 0xC7, 0xAF, 0xDE, 0x87, 0x9F,
-    0xEF, 0x8F, 0xEE, 0x08, 0xE2, 0xCD, 0x1B, 0x08, 0x95, 0x38, 0xDF, 0x50,
-    0x65, 0x5A, 0x69, 0xE9, 0x55, 0xD2, 0x68, 0xFA, 0xD2, 0x1A, 0xC5, 0x35,
-    0x42, 0x35, 0xD9, 0xE0, 0xAC, 0x31, 0x54, 0xD2, 0x89, 0x61, 0xD6, 0x9F,
-    0x02, 0xD4, 0xE4, 0xFB, 0x31, 0x6F, 0x2F, 0x3A, 0xFB, 0xAC, 0xC7, 0x4E,
-    0x58, 0xD7, 0x69, 0x3B, 0xFB, 0xA5, 0xA2, 0x67, 0x0B, 0xC3, 0xBB, 0xEC,
-    0x9C, 0x9D, 0x38, 0x6D, 0xD6, 0x65, 0x5F, 0x53, 0x09, 0xEC, 0x9B, 0xAB,
-    0xED, 0xB0, 0x6E, 0x1A, 0xD8, 0x65, 0x57, 0xA0, 0x3D, 0xCF, 0xD3, 0xA6,
-    0x02, 0x17, 0xCE, 0x3B, 0xD6, 0xCB, 0x86, 0x32, 0xDC, 0x75, 0x21, 0x91,
-    0x53, 0x67, 0xC7, 0xD9, 0xCE, 0x08, 0xC7, 0xD9, 0x86, 0x50, 0x7A, 0x4E,
-    0x07, 0x72, 0x3E, 0xCE, 0xC8, 0x97, 0xF5, 0xD9, 0x65, 0x3E, 0xA1, 0xC7,
-    0xFA, 0x79, 0xF0, 0x19, 0x1C, 0x71, 0x09, 0x91, 0xC4, 0x09, 0xC8, 0x5F,
-    0x0F, 0x1A, 0x10, 0x6E, 0x08, 0x92, 0xAB, 0x55, 0x3A, 0x23, 0xDC, 0x13,
-    0x92, 0x9D, 0x29, 0xE4, 0x34, 0x25, 0x0D, 0x1B, 0xA1, 0x1F, 0x99, 0xB2,
-    0xFF, 0xDD, 0x8A, 0xD4, 0xD8, 0xFD, 0x1E, 0xA4, 0x06, 0xE1, 0x16, 0x3F,
-    0x15, 0xF1, 0xAB, 0x9E, 0x8A, 0xB9, 0x25, 0x2F, 0xE4, 0xD7, 0x5A, 0x95,
-    0x5B, 0xA1, 0xD1, 0x87, 0x9D, 0x08, 0x01, 0xF6, 0x21, 0x98, 0x4B, 0x3E,
-    0x9F, 0x7E, 0x50, 0x7B, 0xEC, 0xBC, 0x54, 0xE4, 0xD8, 0x90, 0x74, 0x05,
-    0x31, 0xF5, 0x00, 0x3C, 0x73, 0x87, 0x78, 0x0F, 0xD6, 0x17, 0xEC, 0x32,
-    0x4E, 0x3A, 0x81, 0x72, 0xF7, 0xC1, 0x4F, 0x1A, 0x08, 0xC3, 0xD8, 0x76,
-    0xF5, 0xDD, 0x38, 0xF0, 0x06, 0xCE, 0xED, 0x40, 0x14, 0xE7, 0x40, 0x38,
-    0x4D, 0x9C, 0xEB, 0xEC, 0x03, 0x08, 0x0E, 0x9D, 0xD7, 0x49, 0xE5, 0xB6,
-    0xB3, 0xC3, 0x8E, 0xE1, 0xDD, 0xF7, 0xDA, 0xEC, 0x83, 0xC8, 0x5D, 0xA5,
-    0xE4, 0x1C, 0x9B, 0x2E, 0xD7, 0xFF, 0x81, 0xB3, 0x1D, 0x3F, 0xF2, 0x90,
-    0xF5, 0xE2, 0xA6, 0x03, 0xA7, 0x13, 0x37, 0x7D, 0x72, 0xDA, 0x71, 0xD3,
-    0xE7, 0x24, 0xEB, 0x30, 0x45, 0xC8, 0x8E, 0xB3, 0x43, 0xD5, 0x31, 0xD5,
-    0x54, 0x0D, 0xEB, 0xE1, 0xEB, 0xC9, 0x37, 0x89, 0xB3, 0x12, 0xB4, 0x33,
-    0xD8, 0x44, 0xA1, 0xA5, 0x18, 0x84, 0x86, 0xDB, 0x90, 0x73, 0x4C, 0xE5,
-    0x90, 0x5F, 0xD8, 0xF1, 0x91, 0xE9, 0x23, 0xD6, 0x2B, 0x38, 0x6F, 0x61,
-    0x6C, 0xB8, 0x61, 0x88, 0x44, 0x8D, 0xC8, 0x5D, 0x05, 0x6A, 0xB8, 0x6A,
-    0x8B, 0xB1, 0xBB, 0xD6, 0xB3, 0xAA, 0xB2, 0x89, 0x97, 0x64, 0xD3, 0xC4,
-    0xD4, 0x18, 0xD4, 0x7E, 0x60, 0xF1, 0xAF, 0xE3, 0x35, 0xAB, 0xD1, 0x10,
-    0xC4, 0x39, 0x24, 0xC1, 0x0B, 0xBD, 0x80, 0x17, 0x9A, 0x80, 0x27, 0x64,
-    0x82, 0x57, 0x62, 0x40, 0xCD, 0xD2, 0x36, 0x88, 0x51, 0xFB, 0x57, 0xAD,
-    0x8E, 0x55, 0x90, 0xCE, 0x15, 0x24, 0xA9, 0xC0, 0x95, 0x23, 0x69, 0x9A,
-    0x75, 0x42, 0xCD, 0xA1, 0x2A, 0xAE, 0x41, 0x28, 0x62, 0xF1, 0x8B, 0x60,
-    0x6A, 0x7A, 0xAC, 0x08, 0x21, 0x4B, 0xA4, 0x08, 0x0B, 0xD3, 0x92, 0x34,
-    0x5D, 0xA9, 0xA0, 0xD5, 0x52, 0x31, 0x44, 0xC9, 0xD2, 0x78, 0xC9, 0x5F,
-    0x4F, 0xE3, 0x26, 0xED, 0x4B, 0x46, 0x12, 0xF8, 0x19, 0x73, 0x49, 0x9C,
-    0xCF, 0xB3, 0x8D, 0xE5, 0xE6, 0xB7, 0x7C, 0x19, 0xAC, 0xC1, 0x1C, 0xCC,
-    0xCB, 0xC6, 0xFA, 0xC6, 0x82, 0xDE, 0xAC, 0x3C, 0x9C, 0x7B, 0xB4, 0xF5,
-    0xFC, 0x55, 0x7D, 0xD1, 0x5E, 0xF5, 0x8A, 0x14, 0x26, 0xB9, 0x4A, 0xC3,
-    0xD2, 0xAB, 0x98, 0x46, 0x2B, 0x15, 0xB1, 0xF9, 0x21, 0x81, 0x0D, 0x66,
-    0x59, 0x11, 0x44, 0x7B, 0xD2, 0xB6, 0xEF, 0x17, 0x6C, 0xDB, 0x2E, 0x15,
-    0x23, 0xBC, 0x6C, 0xA9, 0x62, 0x51, 0x8A, 0x0D, 0xA5, 0x35, 0xD4, 0xDE,
-    0x1A, 0x59, 0xBB, 0x89, 0xA9, 0x82, 0x0D, 0xD3, 0x97, 0x8E, 0x27, 0x75,
-    0xBC, 0x1E, 0x89, 0x1C, 0x06, 0x79, 0x0D, 0x53, 0x1D, 0x8B, 0x9A, 0x7C,
-    0xF7, 0x2A, 0x56, 0x34, 0x5D, 0x86, 0x21, 0x98, 0x0C, 0xBC, 0x78, 0x70,
-    0xA6, 0xA0, 0x46, 0x89, 0xB5, 0xA9, 0xF1, 0x11, 0xF8, 0xFE, 0x71, 0x44,
-    0xC9, 0x20, 0x85, 0xF1, 0x11, 0x05, 0xBA, 0x66, 0x58, 0x4D, 0x41, 0x9C,
-    0x1A, 0x91, 0x6E, 0x63, 0x4A, 0x04, 0xF1, 0x6E, 0x82, 0x3D, 0xAC, 0x4C,
-    0xA4, 0xE1, 0x41, 0x37, 0x22, 0xA5, 0x89, 0x1A, 0x83, 0x29, 0x74, 0x37,
-    0x82, 0xE8, 0x7E, 0x47, 0x47, 0x19, 0x39, 0x2A, 0xAD, 0x49, 0xF8, 0x42,
-    0x10, 0xCB, 0x2B, 0xE5, 0x6B, 0xC8, 0xC2, 0x9D, 0x48, 0x88, 0xDC, 0xAB,
-    0x2E, 0x11, 0x37, 0x7F, 0xCA, 0x5B, 0x9B, 0x78, 0x4D, 0x56, 0x82, 0xBB,
-    0x35, 0xD8, 0xFA, 0x3E, 0xA5, 0x16, 0xFC, 0xE0, 0x54, 0xD1, 0x12, 0xD4,
-    0xA7, 0x98, 0x4E, 0xD0, 0x0C, 0x8D, 0x18, 0x39, 0x84, 0x07, 0xC4, 0xA2,
-    0x1A, 0xA6, 0xA8, 0x62, 0xAA, 0x19, 0x8C, 0x59, 0x95, 0x54, 0x31, 0x5A,
-    0xD2, 0xFE, 0x4A, 0x59, 0xC0, 0x55, 0x8A, 0xB7, 0x72, 0x29, 0xB3, 0x54,
-    0xAE, 0xC2, 0x23, 0x96, 0x47, 0x59, 0xAE, 0xCB, 0x5A, 0x06, 0x61, 0x91,
-    0xD8, 0xD6, 0x86, 0x8C, 0xE6, 0x89, 0x59, 0xD7, 0x14, 0x9E, 0xD3, 0xD4,
-    0xB3, 0xC7, 0x48, 0xCA, 0x27, 0x43, 0x01, 0x94, 0x3A, 0x09, 0xC8, 0xE5,
-    0xDC, 0xA3, 0x81, 0x5B, 0xE3, 0x59, 0xA2, 0x27, 0xB9, 0xB4, 0x0A, 0x19,
-    0x89, 0x26, 0xB5, 0x2C, 0xA3, 0xB6, 0x4E, 0x5C, 0xA6, 0x17, 0xA4, 0x7B,
-    0xB3, 0x85, 0xFA, 0x59, 0x2A, 0x7A, 0xFF, 0x3D, 0xC4, 0x3F, 0xDE, 0xCB,
-    0x8B, 0xC4};
-static IFX_Locale* XFA_GetLocaleFromBuffer(const uint8_t* pBuf, int nBufLen) {
-  if (pBuf == NULL || nBufLen <= 0) {
-    return NULL;
-  }
-  CFX_GEModule* pGeModule = CFX_GEModule::Get();
-  if (!pGeModule) {
-    return NULL;
-  }
-  CCodec_ModuleMgr* pCodecMgr = pGeModule->GetCodecModule();
-  if (!pCodecMgr) {
-    return NULL;
-  }
-  CXML_Element* pLocale = NULL;
-  uint8_t* pOut = NULL;
-  FX_DWORD dwSize;
-  pCodecMgr->GetFlateModule()->FlateOrLZWDecode(FALSE, pBuf, nBufLen, TRUE, 0,
-                                                0, 0, 0, 0, pOut, dwSize);
-  if (pOut) {
-    pLocale = CXML_Element::Parse(pOut, dwSize);
-    FX_Free(pOut);
-  }
-  if (pLocale) {
-    return new CXFA_XMLLocale(pLocale);
-  }
-  return NULL;
-}
-static FX_WORD XFA_GetLanguage(CFX_WideString wsLanguage) {
-  FX_WORD dwLangueID = XFA_LANGID_en_US;
-  if (wsLanguage.GetLength() < 2) {
-    return dwLangueID;
-  }
-  wsLanguage.MakeLower();
-  FX_DWORD dwIDFirst = wsLanguage.GetAt(0) << 8 | wsLanguage.GetAt(1);
-  FX_DWORD dwIDSecond = wsLanguage.GetLength() >= 5
-                            ? wsLanguage.GetAt(3) << 8 | wsLanguage.GetAt(4)
-                            : 0;
-  switch (dwIDFirst) {
-    case FXBSTR_ID(0, 0, 'z', 'h'): {
-      if (dwIDSecond == FXBSTR_ID(0, 0, 'c', 'n')) {
-        dwLangueID = XFA_LANGID_zh_CN;
-      } else if (dwIDSecond == FXBSTR_ID(0, 0, 't', 'w')) {
-        dwLangueID = XFA_LANGID_zh_TW;
-      } else if (dwIDSecond == FXBSTR_ID(0, 0, 'h', 'k')) {
-        dwLangueID = XFA_LANGID_zh_HK;
-      }
-    } break;
-    case FXBSTR_ID(0, 0, 'j', 'a'):
-      dwLangueID = XFA_LANGID_ja_JP;
-      break;
-    case FXBSTR_ID(0, 0, 'k', 'o'):
-      dwLangueID = XFA_LANGID_ko_KR;
-      break;
-    case FXBSTR_ID(0, 0, 'e', 'n'): {
-      if (dwIDSecond == FXBSTR_ID(0, 0, 'g', 'b')) {
-        dwLangueID = XFA_LANGID_en_GB;
-      } else {
-        dwLangueID = XFA_LANGID_en_US;
-      }
-    } break;
-    case FXBSTR_ID(0, 0, 'd', 'e'):
-      dwLangueID = XFA_LANGID_de_DE;
-      break;
-    case FXBSTR_ID(0, 0, 'f', 'r'):
-      dwLangueID = XFA_LANGID_fr_FR;
-      break;
-    case FXBSTR_ID(0, 0, 'e', 's'): {
-      if (dwIDSecond == FXBSTR_ID(0, 0, 'e', 's')) {
-        dwLangueID = XFA_LANGID_es_ES;
-      } else {
-        dwLangueID = XFA_LANGID_es_LA;
-      }
-    } break;
-    case FXBSTR_ID(0, 0, 'i', 't'):
-      dwLangueID = XFA_LANGID_it_IT;
-      break;
-    case FXBSTR_ID(0, 0, 'p', 't'):
-      dwLangueID = XFA_LANGID_pt_BR;
-      break;
-    case FXBSTR_ID(0, 0, 'n', 'l'):
-      dwLangueID = XFA_LANGID_nl_NL;
-      break;
-    case FXBSTR_ID(0, 0, 'r', 'u'):
-      dwLangueID = XFA_LANGID_ru_RU;
-      break;
-  }
-  return dwLangueID;
-}
-CXFA_LocaleMgr::CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid)
-    : m_dwLocaleFlags(0x00) {
-  m_dwDeflcid = XFA_GetLanguage(wsDeflcid);
-  CXFA_Node* pNodeLocale = NULL;
-  if (pLocaleSet &&
-      (pNodeLocale = pLocaleSet->GetNodeItem(XFA_NODEITEM_FirstChild))) {
-    while (pNodeLocale) {
-      m_LocaleArray.Add(new CXFA_NodeLocale(pNodeLocale));
-      pNodeLocale = pNodeLocale->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  m_pDefLocale = GetLocaleByName(wsDeflcid);
-}
-CXFA_LocaleMgr::~CXFA_LocaleMgr() {
-  int32_t iCount = m_LocaleArray.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    ((IFX_Locale*)m_LocaleArray[i])->Release();
-  }
-  int32_t iXmls = m_XMLLocaleArray.GetSize();
-  for (int32_t j = 0; j < iXmls; j++) {
-    ((IFX_Locale*)m_XMLLocaleArray[j])->Release();
-  }
-}
-void CXFA_LocaleMgr::Release() {
-  delete this;
-}
-FX_WORD CXFA_LocaleMgr::GetDefLocaleID() {
-  return m_dwDeflcid;
-}
-IFX_Locale* CXFA_LocaleMgr::GetDefLocale() {
-  if (m_pDefLocale) {
-    return m_pDefLocale;
-  } else if (m_LocaleArray.GetSize()) {
-    return (IFX_Locale*)m_LocaleArray[0];
-  } else if (m_XMLLocaleArray.GetSize()) {
-    return (IFX_Locale*)m_XMLLocaleArray[0];
-  }
-  m_pDefLocale = GetLocale(m_dwDeflcid);
-  if (m_pDefLocale)
-    m_XMLLocaleArray.Add(m_pDefLocale);
-  return m_pDefLocale;
-}
-IFX_Locale* CXFA_LocaleMgr::GetLocale(FX_WORD lcid) {
-  IFX_Locale* pLocal = NULL;
-  switch (lcid) {
-    case XFA_LANGID_zh_CN:
-      pLocal = XFA_GetLocaleFromBuffer(g_zhCN_Locale, sizeof(g_zhCN_Locale));
-      break;
-    case XFA_LANGID_zh_TW:
-      pLocal = XFA_GetLocaleFromBuffer(g_zhTW_Locale, sizeof(g_zhTW_Locale));
-      break;
-    case XFA_LANGID_zh_HK:
-      pLocal = XFA_GetLocaleFromBuffer(g_zhHK_Locale, sizeof(g_zhHK_Locale));
-      break;
-    case XFA_LANGID_ja_JP:
-      pLocal = XFA_GetLocaleFromBuffer(g_jaJP_Locale, sizeof(g_jaJP_Locale));
-      break;
-    case XFA_LANGID_ko_KR:
-      pLocal = XFA_GetLocaleFromBuffer(g_koKR_Locale, sizeof(g_koKR_Locale));
-      break;
-    case XFA_LANGID_en_GB:
-      pLocal = XFA_GetLocaleFromBuffer(g_enGB_Locale, sizeof(g_enGB_Locale));
-      break;
-    case XFA_LANGID_es_LA:
-      pLocal = XFA_GetLocaleFromBuffer(g_esLA_Locale, sizeof(g_esLA_Locale));
-      break;
-    case XFA_LANGID_es_ES:
-      pLocal = XFA_GetLocaleFromBuffer(g_esES_Locale, sizeof(g_esES_Locale));
-      break;
-    case XFA_LANGID_de_DE:
-      pLocal = XFA_GetLocaleFromBuffer(g_deDE_Loacale, sizeof(g_deDE_Loacale));
-      break;
-    case XFA_LANGID_fr_FR:
-      pLocal = XFA_GetLocaleFromBuffer(g_frFR_Locale, sizeof(g_frFR_Locale));
-      break;
-    case XFA_LANGID_it_IT:
-      pLocal = XFA_GetLocaleFromBuffer(g_itIT_Locale, sizeof(g_itIT_Locale));
-      break;
-    case XFA_LANGID_pt_BR:
-      pLocal = XFA_GetLocaleFromBuffer(g_ptBR_Locale, sizeof(g_ptBR_Locale));
-      break;
-    case XFA_LANGID_nl_NL:
-      pLocal = XFA_GetLocaleFromBuffer(g_nlNL_Locale, sizeof(g_nlNL_Locale));
-      break;
-    case XFA_LANGID_ru_RU:
-      pLocal = XFA_GetLocaleFromBuffer(g_ruRU_Locale, sizeof(g_ruRU_Locale));
-      break;
-    case XFA_LANGID_en_US:
-    default:
-      pLocal = XFA_GetLocaleFromBuffer(g_enUS_Locale, sizeof(g_enUS_Locale));
-      break;
-  }
-  return pLocal;
-}
-IFX_Locale* CXFA_LocaleMgr::GetLocaleByName(
-    const CFX_WideStringC& wsLocaleName) {
-  int32_t iCount = m_LocaleArray.GetSize();
-  int32_t i = 0;
-  for (i = 0; i < iCount; i++) {
-    IFX_Locale* pLocale = ((IFX_Locale*)m_LocaleArray[i]);
-    if (pLocale->GetName() == wsLocaleName) {
-      return pLocale;
-    }
-  }
-  int32_t iLen = wsLocaleName.GetLength();
-  if (iLen < 2) {
-    return NULL;
-  }
-  iCount = m_XMLLocaleArray.GetSize();
-  for (i = 0; i < iCount; i++) {
-    IFX_Locale* pLocale = ((IFX_Locale*)m_XMLLocaleArray[i]);
-    if (pLocale->GetName() == wsLocaleName) {
-      return pLocale;
-    }
-  }
-  FX_WORD dwLangueID = XFA_GetLanguage(wsLocaleName);
-  IFX_Locale* pLocale = GetLocale(dwLangueID);
-  if (pLocale)
-    m_XMLLocaleArray.Add(pLocale);
-  return pLocale;
-}
-void CXFA_LocaleMgr::SetDefLocale(IFX_Locale* pLocale) {
-  m_pDefLocale = pLocale;
-}
-CFX_WideStringC CXFA_LocaleMgr::GetConfigLocaleName(CXFA_Node* pConfig) {
-  if (!(m_dwLocaleFlags & 0x01)) {
-    m_wsConfigLocale.Empty();
-    if (pConfig) {
-      CXFA_Node* pChildfConfig =
-          pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
-      if (!pChildfConfig) {
-        pChildfConfig = pConfig->GetFirstChildByClass(XFA_ELEMENT_Present);
-      }
-      CXFA_Node* pCommon =
-          pChildfConfig
-              ? pChildfConfig->GetFirstChildByClass(XFA_ELEMENT_Common)
-              : NULL;
-      CXFA_Node* pLocale =
-          pCommon ? pCommon->GetFirstChildByClass(XFA_ELEMENT_Locale) : NULL;
-      if (pLocale) {
-        pLocale->TryCData(XFA_ATTRIBUTE_Value, m_wsConfigLocale, FALSE);
-      }
-    }
-    m_dwLocaleFlags |= 0x01;
-  }
-  return m_wsConfigLocale;
-}
-static CXFA_TimeZoneProvider* g_pProvider = NULL;
-IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Create() {
-  FXSYS_assert(!g_pProvider);
-  g_pProvider = new CXFA_TimeZoneProvider();
-  return g_pProvider;
-}
-IXFA_TimeZoneProvider* IXFA_TimeZoneProvider::Get() {
-  if (!g_pProvider) {
-    g_pProvider = new CXFA_TimeZoneProvider();
-  }
-  return g_pProvider;
-}
-void IXFA_TimeZoneProvider::Destroy() {
-  delete g_pProvider;
-  g_pProvider = NULL;
-}
-#include <time.h>
-CXFA_TimeZoneProvider::CXFA_TimeZoneProvider() {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-  _tzset();
-  m_tz.tzHour = (int8_t)(_timezone / 3600 * -1);
-  m_tz.tzMinute = (int8_t)((FXSYS_abs(_timezone) % 3600) / 60);
-#else
-  tzset();
-  m_tz.tzHour = (int8_t)(timezone / 3600 * -1);
-  m_tz.tzMinute = (int8_t)((FXSYS_abs((int)timezone) % 3600) / 60);
-#endif
-}
-CXFA_TimeZoneProvider::~CXFA_TimeZoneProvider() {}
-void CXFA_TimeZoneProvider::SetTimeZone(FX_TIMEZONE& tz) {
-  m_tz = tz;
-}
-void CXFA_TimeZoneProvider::GetTimeZone(FX_TIMEZONE& tz) {
-  tz = m_tz;
-}
diff --git a/xfa/src/fxfa/parser/xfa_localemgr.h b/xfa/src/fxfa/parser/xfa_localemgr.h
deleted file mode 100644
index 0af6f5f..0000000
--- a/xfa/src/fxfa/parser/xfa_localemgr.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LOCALEMGR_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LOCALEMGR_H_
-
-#include "xfa/include/fxfa/fxfa_objectacc.h"
-#include "xfa/src/fgas/localization/fgas_datetime.h"
-#include "xfa/src/fgas/localization/fgas_locale.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-
-class CXFA_Node;
-class IFX_Locale;
-
-#define XFA_LANGID_zh_CN 0x0804
-#define XFA_LANGID_zh_TW 0x0404
-#define XFA_LANGID_zh_HK 0x0c04
-#define XFA_LANGID_ja_JP 0x0411
-#define XFA_LANGID_ko_KR 0x0412
-#define XFA_LANGID_en_US 0x0409
-#define XFA_LANGID_en_GB 0x0809
-#define XFA_LANGID_es_ES 0x0c0a
-#define XFA_LANGID_es_LA 0x080a
-#define XFA_LANGID_de_DE 0x0407
-#define XFA_LANGID_fr_FR 0x040c
-#define XFA_LANGID_it_IT 0x0410
-#define XFA_LANGID_pt_BR 0x0416
-#define XFA_LANGID_nl_NL 0x0413
-#define XFA_LANGID_ru_RU 0x0419
-
-class CXFA_LocaleMgr : public IFX_LocaleMgr {
- public:
-  CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid);
-  virtual void Release();
-  virtual FX_WORD GetDefLocaleID();
-  virtual IFX_Locale* GetDefLocale();
-  virtual IFX_Locale* GetLocale(FX_WORD lcid);
-  virtual IFX_Locale* GetLocaleByName(const CFX_WideStringC& wsLocaleName);
-  ~CXFA_LocaleMgr();
-  void SetDefLocale(IFX_Locale* pLocale);
-  CFX_WideStringC GetConfigLocaleName(CXFA_Node* pConfig);
-
- protected:
-  CFX_PtrArray m_LocaleArray;
-  CFX_PtrArray m_XMLLocaleArray;
-  IFX_Locale* m_pDefLocale;
-  CFX_WideString m_wsConfigLocale;
-  FX_WORD m_dwDeflcid;
-  FX_WORD m_dwLocaleFlags;
-};
-
-class IXFA_TimeZoneProvider {
- public:
-  static IXFA_TimeZoneProvider* Create();
-  static IXFA_TimeZoneProvider* Get();
-  static void Destroy();
-
-  virtual ~IXFA_TimeZoneProvider() {}
-
-  virtual void SetTimeZone(FX_TIMEZONE& tz) = 0;
-
-  virtual void GetTimeZone(FX_TIMEZONE& tz) = 0;
-};
-class CXFA_TimeZoneProvider : public IXFA_TimeZoneProvider {
- public:
-  CXFA_TimeZoneProvider();
-  virtual ~CXFA_TimeZoneProvider();
-  virtual void SetTimeZone(FX_TIMEZONE& tz);
-  virtual void GetTimeZone(FX_TIMEZONE& tz);
-
- private:
-  FX_TIMEZONE m_tz;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LOCALEMGR_H_
diff --git a/xfa/src/fxfa/parser/xfa_localevalue.cpp b/xfa/src/fxfa/parser/xfa_localevalue.cpp
deleted file mode 100644
index 5b9dc27..0000000
--- a/xfa/src/fxfa/parser/xfa_localevalue.cpp
+++ /dev/null
@@ -1,981 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-static const FX_DOUBLE fraction_scales[] = {0.1,
-                                            0.01,
-                                            0.001,
-                                            0.0001,
-                                            0.00001,
-                                            0.000001,
-                                            0.0000001,
-                                            0.00000001,
-                                            0.000000001,
-                                            0.0000000001,
-                                            0.00000000001,
-                                            0.000000000001,
-                                            0.0000000000001,
-                                            0.00000000000001,
-                                            0.000000000000001,
-                                            0.0000000000000001};
-CXFA_LocaleValue::CXFA_LocaleValue() {
-  m_dwType = XFA_VT_NULL;
-  m_bValid = TRUE;
-  m_pLocaleMgr = NULL;
-}
-CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) {
-  m_dwType = XFA_VT_NULL;
-  m_bValid = TRUE;
-  m_pLocaleMgr = NULL;
-  *this = value;
-}
-CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
-                                   CXFA_LocaleMgr* pLocaleMgr) {
-  m_dwType = dwType;
-  m_bValid = (m_dwType != XFA_VT_NULL);
-  m_pLocaleMgr = pLocaleMgr;
-}
-CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
-                                   const CFX_WideString& wsValue,
-                                   CXFA_LocaleMgr* pLocaleMgr) {
-  m_wsValue = wsValue;
-  m_dwType = dwType;
-  m_pLocaleMgr = pLocaleMgr;
-  m_bValid = ValidateCanonicalValue(wsValue, dwType);
-}
-CXFA_LocaleValue::CXFA_LocaleValue(FX_DWORD dwType,
-                                   const CFX_WideString& wsValue,
-                                   const CFX_WideString& wsFormat,
-                                   IFX_Locale* pLocale,
-                                   CXFA_LocaleMgr* pLocaleMgr) {
-  m_pLocaleMgr = pLocaleMgr;
-  m_bValid = TRUE;
-  m_dwType = dwType;
-  m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale);
-}
-CXFA_LocaleValue& CXFA_LocaleValue::operator=(const CXFA_LocaleValue& value) {
-  m_wsValue = value.m_wsValue;
-  m_dwType = value.m_dwType;
-  m_bValid = value.m_bValid;
-  m_pLocaleMgr = value.m_pLocaleMgr;
-  return *this;
-}
-CXFA_LocaleValue::~CXFA_LocaleValue() {}
-static FX_LOCALECATEGORY XFA_ValugeCategory(FX_LOCALECATEGORY eCategory,
-                                            FX_DWORD dwValueType) {
-  if (eCategory == FX_LOCALECATEGORY_Unknown) {
-    switch (dwValueType) {
-      case XFA_VT_BOOLEAN:
-      case XFA_VT_INTEGER:
-      case XFA_VT_DECIMAL:
-      case XFA_VT_FLOAT:
-        return FX_LOCALECATEGORY_Num;
-      case XFA_VT_TEXT:
-        return FX_LOCALECATEGORY_Text;
-      case XFA_VT_DATE:
-        return FX_LOCALECATEGORY_Date;
-      case XFA_VT_TIME:
-        return FX_LOCALECATEGORY_Time;
-      case XFA_VT_DATETIME:
-        return FX_LOCALECATEGORY_DateTime;
-    }
-  }
-  return eCategory;
-}
-FX_BOOL CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue,
-                                        const CFX_WideString& wsPattern,
-                                        IFX_Locale* pLocale,
-                                        CFX_WideString* pMatchFormat) {
-  CFX_WideString wsOutput;
-  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(pLocale);
-  }
-  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
-  CFX_WideStringArray wsPatterns;
-  pFormat->SplitFormatString(wsPattern, wsPatterns);
-  FX_BOOL bRet = FALSE;
-  int32_t iCount = wsPatterns.GetSize();
-  int32_t i = 0;
-  for (; i < iCount && !bRet; i++) {
-    CFX_WideString wsFormat = wsPatterns[i];
-    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
-    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
-    switch (eCategory) {
-      case FX_LOCALECATEGORY_Null:
-        bRet = pFormat->ParseNull(wsValue, wsFormat);
-        if (!bRet) {
-          bRet = wsValue.IsEmpty();
-        }
-        break;
-      case FX_LOCALECATEGORY_Zero:
-        bRet = pFormat->ParseZero(wsValue, wsFormat);
-        if (!bRet) {
-          bRet = wsValue == FX_WSTRC(L"0");
-        }
-        break;
-      case FX_LOCALECATEGORY_Num: {
-        CFX_WideString fNum;
-        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
-        if (!bRet) {
-          bRet = pFormat->FormatNum(wsValue, wsFormat, wsOutput);
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_Text:
-        bRet = pFormat->ParseText(wsValue, wsFormat, wsOutput);
-        wsOutput.Empty();
-        if (!bRet) {
-          bRet = pFormat->FormatText(wsValue, wsFormat, wsOutput);
-        }
-        break;
-      case FX_LOCALECATEGORY_Date: {
-        CFX_Unitime dt;
-        bRet = ValidateCanonicalDate(wsValue, dt);
-        if (!bRet) {
-          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
-                                        dt);
-          if (!bRet) {
-            bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                           FX_DATETIMETYPE_Date);
-          }
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_Time: {
-        CFX_Unitime dt;
-        bRet =
-            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
-        if (!bRet) {
-          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                         FX_DATETIMETYPE_Time);
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_DateTime: {
-        CFX_Unitime dt;
-        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
-                                      FX_DATETIMETYPE_DateTime, dt);
-        if (!bRet) {
-          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                         FX_DATETIMETYPE_DateTime);
-        }
-        break;
-      }
-      default:
-        bRet = FALSE;
-        break;
-    }
-  }
-  if (bRet && pMatchFormat) {
-    *pMatchFormat = wsPatterns[i - 1];
-  }
-  pFormat->Release();
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(locale);
-  }
-  return bRet;
-}
-CFX_WideString CXFA_LocaleValue::GetValue() const {
-  return m_wsValue;
-}
-FX_DWORD CXFA_LocaleValue::GetType() const {
-  return m_dwType;
-}
-void CXFA_LocaleValue::SetValue(const CFX_WideString& wsValue,
-                                FX_DWORD dwType) {
-  m_wsValue = wsValue;
-  m_dwType = dwType;
-}
-CFX_WideString CXFA_LocaleValue::GetText() const {
-  if (m_bValid && m_dwType == XFA_VT_TEXT) {
-    return m_wsValue;
-  }
-  return CFX_WideString();
-}
-FX_FLOAT CXFA_LocaleValue::GetNum() const {
-  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
-                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
-    int64_t nIntegral = 0;
-    FX_DWORD dwFractional = 0;
-    int32_t nExponent = 0;
-    int cc = 0;
-    FX_BOOL bNegative = FALSE, bExpSign = FALSE;
-    const FX_WCHAR* str = (const FX_WCHAR*)m_wsValue;
-    int len = m_wsValue.GetLength();
-    while (XFA_IsSpace(str[cc]) && cc < len) {
-      cc++;
-    }
-    if (cc >= len) {
-      return 0;
-    }
-    if (str[0] == '+') {
-      cc++;
-    } else if (str[0] == '-') {
-      bNegative = TRUE;
-      cc++;
-    }
-    int nIntegralLen = 0;
-    while (cc < len) {
-      if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) {
-        break;
-      }
-      nIntegral = nIntegral * 10 + str[cc] - '0';
-      cc++;
-      nIntegralLen++;
-    }
-    nIntegral = bNegative ? -nIntegral : nIntegral;
-    int scale = 0;
-    double fraction = 0.0;
-    if (cc < len && str[cc] == '.') {
-      cc++;
-      while (cc < len) {
-        fraction += fraction_scales[scale] * (str[cc] - '0');
-        scale++;
-        cc++;
-        if (scale == sizeof fraction_scales / sizeof(double) ||
-            !XFA_IsDigit(str[cc])) {
-          break;
-        }
-      }
-      dwFractional = (FX_DWORD)(fraction * 4294967296.0);
-    }
-    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
-      cc++;
-      if (cc < len) {
-        if (str[cc] == '+') {
-          cc++;
-        } else if (str[cc] == '-') {
-          bExpSign = TRUE;
-          cc++;
-        }
-      }
-      while (cc < len) {
-        if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
-          break;
-        }
-        nExponent = nExponent * 10 + str[cc] - '0';
-        cc++;
-      }
-      nExponent = bExpSign ? -nExponent : nExponent;
-    }
-    FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0);
-    fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue);
-    if (nExponent != 0) {
-      fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
-    }
-    return fValue;
-  }
-  return 0;
-}
-FX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const {
-  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
-                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
-    int64_t nIntegral = 0;
-    FX_DWORD dwFractional = 0;
-    int32_t nExponent = 0;
-    int32_t cc = 0;
-    FX_BOOL bNegative = FALSE, bExpSign = FALSE;
-    const FX_WCHAR* str = (const FX_WCHAR*)m_wsValue;
-    int len = m_wsValue.GetLength();
-    while (XFA_IsSpace(str[cc]) && cc < len) {
-      cc++;
-    }
-    if (cc >= len) {
-      return 0;
-    }
-    if (str[0] == '+') {
-      cc++;
-    } else if (str[0] == '-') {
-      bNegative = TRUE;
-      cc++;
-    }
-    int32_t nIntegralLen = 0;
-    while (cc < len) {
-      if (str[cc] == '.' || !XFA_IsDigit(str[cc]) || nIntegralLen > 17) {
-        break;
-      }
-      nIntegral = nIntegral * 10 + str[cc] - '0';
-      cc++;
-      nIntegralLen++;
-    }
-    nIntegral = bNegative ? -nIntegral : nIntegral;
-    int32_t scale = 0;
-    FX_DOUBLE fraction = 0.0;
-    if (cc < len && str[cc] == '.') {
-      cc++;
-      while (cc < len) {
-        fraction += fraction_scales[scale] * (str[cc] - '0');
-        scale++;
-        cc++;
-        if (scale == sizeof fraction_scales / sizeof(FX_DOUBLE) ||
-            !XFA_IsDigit(str[cc])) {
-          break;
-        }
-      }
-      dwFractional = (FX_DWORD)(fraction * 4294967296.0);
-    }
-    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
-      cc++;
-      if (cc < len) {
-        if (str[cc] == '+') {
-          cc++;
-        } else if (str[cc] == '-') {
-          bExpSign = TRUE;
-          cc++;
-        }
-      }
-      while (cc < len) {
-        if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
-          break;
-        }
-        nExponent = nExponent * 10 + str[cc] - '0';
-        cc++;
-      }
-      nExponent = bExpSign ? -nExponent : nExponent;
-    }
-    FX_DOUBLE dValue = (dwFractional / 4294967296.0);
-    dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue);
-    if (nExponent != 0) {
-      dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
-    }
-    return dValue;
-  }
-  return 0;
-}
-CFX_Unitime CXFA_LocaleValue::GetDate() const {
-  if (m_bValid && m_dwType == XFA_VT_DATE) {
-    CFX_Unitime dt;
-    FX_DateFromCanonical(m_wsValue, dt);
-    return dt;
-  }
-  return CFX_Unitime();
-}
-CFX_Unitime CXFA_LocaleValue::GetTime() const {
-  if (m_bValid && m_dwType == XFA_VT_TIME) {
-    CFX_Unitime dt(0);
-    FXSYS_assert(m_pLocaleMgr);
-    FX_TimeFromCanonical(m_wsValue, dt, m_pLocaleMgr->GetDefLocale());
-    return dt;
-  }
-  return CFX_Unitime();
-}
-CFX_Unitime CXFA_LocaleValue::GetDateTime() const {
-  if (m_bValid && m_dwType == XFA_VT_DATETIME) {
-    int32_t index = m_wsValue.Find('T');
-    CFX_Unitime dt;
-    FX_DateFromCanonical(m_wsValue.Left(index), dt);
-    FXSYS_assert(m_pLocaleMgr);
-    FX_TimeFromCanonical(m_wsValue.Right(m_wsValue.GetLength() - index - 1), dt,
-                         m_pLocaleMgr->GetDefLocale());
-    return dt;
-  }
-  return CFX_Unitime();
-}
-FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText) {
-  m_dwType = XFA_VT_TEXT;
-  m_wsValue = wsText;
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText,
-                                  const CFX_WideString& wsFormat,
-                                  IFX_Locale* pLocale) {
-  m_dwType = XFA_VT_TEXT;
-  return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale);
-}
-FX_BOOL CXFA_LocaleValue::SetNum(FX_FLOAT fNum) {
-  m_dwType = XFA_VT_FLOAT;
-  m_wsValue.Format(L"%.8g", (FX_DOUBLE)fNum);
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum,
-                                 const CFX_WideString& wsFormat,
-                                 IFX_Locale* pLocale) {
-  m_dwType = XFA_VT_FLOAT;
-  return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale);
-}
-FX_BOOL CXFA_LocaleValue::SetDate(const CFX_Unitime& d) {
-  m_dwType = XFA_VT_DATE;
-  m_wsValue.Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay());
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate,
-                                  const CFX_WideString& wsFormat,
-                                  IFX_Locale* pLocale) {
-  m_dwType = XFA_VT_DATE;
-  return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale);
-}
-FX_BOOL CXFA_LocaleValue::SetTime(const CFX_Unitime& t) {
-  m_dwType = XFA_VT_TIME;
-  m_wsValue.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(),
-                   t.GetSecond());
-  if (t.GetMillisecond() > 0) {
-    CFX_WideString wsTemp;
-    wsTemp.Format(L"%:03d", t.GetMillisecond());
-    m_wsValue += wsTemp;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime,
-                                  const CFX_WideString& wsFormat,
-                                  IFX_Locale* pLocale) {
-  m_dwType = XFA_VT_TIME;
-  return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale);
-}
-FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) {
-  m_dwType = XFA_VT_DATETIME;
-  m_wsValue.Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(),
-                   dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(),
-                   dt.GetSecond());
-  if (dt.GetMillisecond() > 0) {
-    CFX_WideString wsTemp;
-    wsTemp.Format(L"%:03d", dt.GetMillisecond());
-    m_wsValue += wsTemp;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime,
-                                      const CFX_WideString& wsFormat,
-                                      IFX_Locale* pLocale) {
-  m_dwType = XFA_VT_DATETIME;
-  return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale);
-}
-FX_BOOL CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult,
-                                         const CFX_WideString& wsFormat,
-                                         IFX_Locale* pLocale,
-                                         XFA_VALUEPICTURE eValueType) const {
-  wsResult.Empty();
-  FX_BOOL bRet = FALSE;
-  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
-  CFX_WideStringArray wsPatterns;
-  pFormat->SplitFormatString(wsFormat, wsPatterns);
-  int32_t iCount = wsPatterns.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType);
-    if (bRet) {
-      break;
-    }
-  }
-  pFormat->Release();
-  return bRet;
-}
-FX_BOOL CXFA_LocaleValue::FormatSinglePattern(
-    CFX_WideString& wsResult,
-    const CFX_WideString& wsFormat,
-    IFX_Locale* pLocale,
-    XFA_VALUEPICTURE eValueType) const {
-  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(pLocale);
-  }
-  wsResult.Empty();
-  FX_BOOL bRet = FALSE;
-  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
-  FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
-  eCategory = XFA_ValugeCategory(eCategory, m_dwType);
-  switch (eCategory) {
-    case FX_LOCALECATEGORY_Null:
-      if (m_wsValue.IsEmpty()) {
-        bRet = pFormat->FormatNull(wsFormat, wsResult);
-      }
-      break;
-    case FX_LOCALECATEGORY_Zero:
-      if (m_wsValue == FX_WSTRC(L"0")) {
-        bRet = pFormat->FormatZero(wsFormat, wsResult);
-      }
-      break;
-    case FX_LOCALECATEGORY_Num:
-      bRet = pFormat->FormatNum(m_wsValue, wsFormat, wsResult);
-      break;
-    case FX_LOCALECATEGORY_Text:
-      bRet = pFormat->FormatText(m_wsValue, wsFormat, wsResult);
-      break;
-    case FX_LOCALECATEGORY_Date:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_Date);
-      break;
-    case FX_LOCALECATEGORY_Time:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_Time);
-      break;
-    case FX_LOCALECATEGORY_DateTime:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_DateTime);
-      break;
-    default:
-      wsResult = m_wsValue;
-      bRet = TRUE;
-  }
-  pFormat->Release();
-  if (!bRet && (eCategory != FX_LOCALECATEGORY_Num ||
-                eValueType != XFA_VALUEPICTURE_Display)) {
-    wsResult = m_wsValue;
-  }
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(locale);
-  }
-  return bRet;
-}
-static FX_BOOL XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime,
-                                      CFX_WideString& wsDate,
-                                      CFX_WideString& wsTime) {
-  wsDate = L"";
-  wsTime = L"";
-  if (wsDateTime.IsEmpty()) {
-    return FALSE;
-  }
-  int nSplitIndex = -1;
-  nSplitIndex = wsDateTime.Find('T');
-  if (nSplitIndex < 0) {
-    nSplitIndex = wsDateTime.Find(' ');
-  }
-  if (nSplitIndex < 0) {
-    return FALSE;
-  }
-  wsDate = wsDateTime.Left(nSplitIndex);
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue,
-                                                 FX_DWORD dwVType) {
-  if (wsValue.IsEmpty()) {
-    return TRUE;
-  }
-  CFX_Unitime dt;
-  switch (dwVType) {
-    case XFA_VT_DATE: {
-      if (ValidateCanonicalDate(wsValue, dt)) {
-        return TRUE;
-      }
-      CFX_WideString wsDate, wsTime;
-      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
-          ValidateCanonicalDate(wsDate, dt)) {
-        return TRUE;
-      }
-      return FALSE;
-    }
-    case XFA_VT_TIME: {
-      if (ValidateCanonicalTime(wsValue)) {
-        return TRUE;
-      }
-      CFX_WideString wsDate, wsTime;
-      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
-          ValidateCanonicalTime(wsTime)) {
-        return TRUE;
-      }
-      return FALSE;
-    }
-    case XFA_VT_DATETIME: {
-      CFX_WideString wsDate, wsTime;
-      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
-          ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) {
-        return TRUE;
-      }
-    } break;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate,
-                                                CFX_Unitime& unDate) {
-  const FX_WORD LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-  const FX_WORD wCountY = 4, wCountM = 2, wCountD = 2;
-  int nLen = wsDate.GetLength();
-  if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) {
-    return FALSE;
-  }
-  const bool bSymbol = wsDate.Find(0x2D) != -1;
-  FX_WORD wYear = 0;
-  FX_WORD wMonth = 0;
-  FX_WORD wDay = 0;
-  const FX_WCHAR* pDate = (const FX_WCHAR*)wsDate;
-  int nIndex = 0, nStart = 0;
-  while (pDate[nIndex] != '\0' && nIndex < wCountY) {
-    if (!XFA_IsDigit(pDate[nIndex])) {
-      return FALSE;
-    }
-    wYear = (pDate[nIndex] - '0') + wYear * 10;
-    nIndex++;
-  }
-  if (bSymbol) {
-    if (pDate[nIndex] != 0x2D) {
-      return FALSE;
-    }
-    nIndex++;
-  }
-  nStart = nIndex;
-  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) {
-    if (!XFA_IsDigit(pDate[nIndex])) {
-      return FALSE;
-    }
-    wMonth = (pDate[nIndex] - '0') + wMonth * 10;
-    nIndex++;
-  }
-  if (bSymbol) {
-    if (pDate[nIndex] != 0x2D) {
-      return FALSE;
-    }
-    nIndex++;
-  }
-  nStart = nIndex;
-  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) {
-    if (!XFA_IsDigit(pDate[nIndex])) {
-      return FALSE;
-    }
-    wDay = (pDate[nIndex] - '0') + wDay * 10;
-    nIndex++;
-  }
-  if (nIndex != nLen) {
-    return FALSE;
-  }
-  if (wYear < 1900 || wYear > 2029) {
-    return FALSE;
-  }
-  if (wMonth < 1 || wMonth > 12) {
-    if (wMonth == 0 && nLen == wCountY) {
-      return TRUE;
-    }
-    return FALSE;
-  }
-  if (wDay < 1) {
-    if (wDay == 0 && (nLen == wCountY + wCountM)) {
-      return TRUE;
-    }
-    return FALSE;
-  }
-  if (wMonth == 2) {
-    if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) {
-      if (wDay > 29) {
-        return FALSE;
-      }
-    } else {
-      if (wDay > 28) {
-        return FALSE;
-      }
-    }
-  } else if (wDay > LastDay[wMonth - 1]) {
-    return FALSE;
-  }
-  CFX_Unitime ut;
-  ut.Set(wYear, static_cast<uint8_t>(wMonth), static_cast<uint8_t>(wDay));
-  unDate = unDate + ut;
-  return TRUE;
-}
-FX_BOOL CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) {
-  int nLen = wsTime.GetLength();
-  if (nLen < 2)
-    return FALSE;
-  const FX_WORD wCountH = 2;
-  const FX_WORD wCountM = 2;
-  const FX_WORD wCountS = 2;
-  const FX_WORD wCountF = 3;
-  const bool bSymbol = wsTime.Find(':') != -1;
-  FX_WORD wHour = 0;
-  FX_WORD wMinute = 0;
-  FX_WORD wSecond = 0;
-  FX_WORD wFraction = 0;
-  const FX_WCHAR* pTime = (const FX_WCHAR*)wsTime;
-  int nIndex = 0;
-  int nStart = 0;
-  while (nIndex - nStart < wCountH && pTime[nIndex]) {
-    if (!XFA_IsDigit(pTime[nIndex]))
-      return FALSE;
-    wHour = pTime[nIndex] - '0' + wHour * 10;
-    nIndex++;
-  }
-  if (bSymbol) {
-    if (nIndex < nLen && pTime[nIndex] != ':')
-      return FALSE;
-    nIndex++;
-  }
-  nStart = nIndex;
-  while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
-    if (!XFA_IsDigit(pTime[nIndex]))
-      return FALSE;
-    wMinute = pTime[nIndex] - '0' + wMinute * 10;
-    nIndex++;
-  }
-  if (bSymbol) {
-    if (nIndex < nLen && pTime[nIndex] != ':')
-      return FALSE;
-    nIndex++;
-  }
-  nStart = nIndex;
-  while (nIndex - nStart < wCountS && nIndex < nLen && pTime[nIndex]) {
-    if (!XFA_IsDigit(pTime[nIndex]))
-      return FALSE;
-    wSecond = pTime[nIndex] - '0' + wSecond * 10;
-    nIndex++;
-  }
-  if (wsTime.Find('.') > 0) {
-    if (pTime[nIndex] != '.')
-      return FALSE;
-    nIndex++;
-    nStart = nIndex;
-    while (nIndex - nStart < wCountF && nIndex < nLen && pTime[nIndex]) {
-      if (!XFA_IsDigit(pTime[nIndex]))
-        return FALSE;
-      wFraction = pTime[nIndex] - '0' + wFraction * 10;
-      nIndex++;
-    }
-  }
-  if (nIndex < nLen) {
-    if (pTime[nIndex] == 'Z') {
-      nIndex++;
-    } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') {
-      int16_t nOffsetH = 0;
-      int16_t nOffsetM = 0;
-      nIndex++;
-      nStart = nIndex;
-      while (nIndex - nStart < wCountH && nIndex < nLen && pTime[nIndex]) {
-        if (!XFA_IsDigit(pTime[nIndex]))
-          return FALSE;
-        nOffsetH = pTime[nIndex] - '0' + nOffsetH * 10;
-        nIndex++;
-      }
-      if (bSymbol) {
-        if (nIndex < nLen && pTime[nIndex] != ':')
-          return FALSE;
-        nIndex++;
-      }
-      nStart = nIndex;
-      while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
-        if (!XFA_IsDigit(pTime[nIndex]))
-          return FALSE;
-        nOffsetM = pTime[nIndex] - '0' + nOffsetM * 10;
-        nIndex++;
-      }
-      if (nOffsetH > 12 || nOffsetM >= 60)
-        return FALSE;
-    }
-  }
-  return nIndex == nLen && wHour < 24 && wMinute < 60 && wSecond < 60 &&
-         wFraction <= 999;
-}
-FX_BOOL CXFA_LocaleValue::ValidateCanonicalDateTime(
-    const CFX_WideString& wsDateTime) {
-  CFX_WideString wsDate, wsTime;
-  if (wsDateTime.IsEmpty()) {
-    return FALSE;
-  }
-  int nSplitIndex = -1;
-  nSplitIndex = wsDateTime.Find('T');
-  if (nSplitIndex < 0) {
-    nSplitIndex = wsDateTime.Find(' ');
-  }
-  if (nSplitIndex < 0) {
-    return FALSE;
-  }
-  wsDate = wsDateTime.Left(nSplitIndex);
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
-  CFX_Unitime dt;
-  return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime);
-}
-FX_BOOL CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue,
-                                            const CFX_WideString& wsPattern,
-                                            IFX_Locale* pLocale) {
-  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(pLocale);
-  }
-  IFX_FormatString* pFormat = IFX_FormatString::Create(m_pLocaleMgr, FALSE);
-  CFX_WideStringArray wsPatterns;
-  pFormat->SplitFormatString(wsPattern, wsPatterns);
-  FX_BOOL bRet = FALSE;
-  int32_t iCount = wsPatterns.GetSize();
-  for (int32_t i = 0; i < iCount && !bRet; i++) {
-    CFX_WideString wsFormat = wsPatterns[i];
-    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
-    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
-    switch (eCategory) {
-      case FX_LOCALECATEGORY_Null:
-        bRet = pFormat->ParseNull(wsValue, wsFormat);
-        if (bRet) {
-          m_wsValue.Empty();
-        }
-        break;
-      case FX_LOCALECATEGORY_Zero:
-        bRet = pFormat->ParseZero(wsValue, wsFormat);
-        if (bRet) {
-          m_wsValue = FX_WSTRC(L"0");
-        }
-        break;
-      case FX_LOCALECATEGORY_Num: {
-        CFX_WideString fNum;
-        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
-        if (bRet) {
-          m_wsValue = fNum;
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_Text:
-        bRet = pFormat->ParseText(wsValue, wsFormat, m_wsValue);
-        break;
-      case FX_LOCALECATEGORY_Date: {
-        CFX_Unitime dt;
-        bRet = ValidateCanonicalDate(wsValue, dt);
-        if (!bRet) {
-          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
-                                        dt);
-        }
-        if (bRet) {
-          SetDate(dt);
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_Time: {
-        CFX_Unitime dt;
-        bRet =
-            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
-        if (bRet) {
-          SetTime(dt);
-        }
-        break;
-      }
-      case FX_LOCALECATEGORY_DateTime: {
-        CFX_Unitime dt;
-        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
-                                      FX_DATETIMETYPE_DateTime, dt);
-        if (bRet) {
-          SetDateTime(dt);
-        }
-        break;
-      }
-      default:
-        m_wsValue = wsValue;
-        bRet = TRUE;
-        break;
-    }
-  }
-  if (!bRet) {
-    m_wsValue = wsValue;
-  }
-  pFormat->Release();
-  if (pLocale) {
-    m_pLocaleMgr->SetDefLocale(locale);
-  }
-  return bRet;
-}
-void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat,
-                                         int32_t nIntLen,
-                                         int32_t nDecLen,
-                                         FX_BOOL bSign) {
-  FXSYS_assert(wsFormat.IsEmpty());
-  FXSYS_assert(nIntLen >= -1 && nDecLen >= -1);
-  int32_t nTotalLen = (nIntLen >= 0 ? nIntLen : 2) + (bSign ? 1 : 0) +
-                      (nDecLen >= 0 ? nDecLen : 2) + (nDecLen == 0 ? 0 : 1);
-  FX_WCHAR* lpBuf = wsFormat.GetBuffer(nTotalLen);
-  int32_t nPos = 0;
-  if (bSign) {
-    lpBuf[nPos++] = L's';
-  }
-  if (nIntLen == -1) {
-    lpBuf[nPos++] = L'z';
-    lpBuf[nPos++] = L'*';
-  } else {
-    while (nIntLen) {
-      lpBuf[nPos++] = L'z';
-      nIntLen--;
-    }
-  }
-  if (nDecLen != 0) {
-    lpBuf[nPos++] = L'.';
-  }
-  if (nDecLen == -1) {
-    lpBuf[nPos++] = L'z';
-    lpBuf[nPos++] = L'*';
-  } else {
-    while (nDecLen) {
-      lpBuf[nPos++] = L'z';
-      nDecLen--;
-    }
-  }
-  wsFormat.ReleaseBuffer(nTotalLen);
-}
-FX_BOOL CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric,
-                                              CFX_WideString& wsFormat,
-                                              IFX_Locale* pLocale,
-                                              int32_t* pos) {
-  if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) {
-    return TRUE;
-  }
-  const FX_WCHAR* pNum = wsNumeric.c_str();
-  const FX_WCHAR* pFmt = wsFormat.c_str();
-  int32_t n = 0, nf = 0;
-  FX_WCHAR c = pNum[n];
-  FX_WCHAR cf = pFmt[nf];
-  if (cf == L's') {
-    if (c == L'-' || c == L'+') {
-      ++n;
-    }
-    ++nf;
-  }
-  FX_BOOL bLimit = TRUE;
-  int32_t nCount = wsNumeric.GetLength();
-  int32_t nCountFmt = wsFormat.GetLength();
-  while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) &&
-         XFA_IsDigit(c = pNum[n])) {
-    if (bLimit == TRUE) {
-      if ((cf = pFmt[nf]) == L'*') {
-        bLimit = FALSE;
-      } else if (cf == L'z') {
-        nf++;
-      } else {
-        return FALSE;
-      }
-    }
-    n++;
-  }
-  if (n == nCount) {
-    return TRUE;
-  }
-  if (nf == nCountFmt) {
-    return FALSE;
-  }
-  while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') {
-    FXSYS_assert(cf == L'z' || cf == L'*');
-    ++nf;
-  }
-  CFX_WideString wsDecimalSymbol;
-  if (pLocale) {
-    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol);
-  } else {
-    wsDecimalSymbol = CFX_WideString(L'.');
-  }
-  if (pFmt[nf] != L'.') {
-    return FALSE;
-  }
-  if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') {
-    return FALSE;
-  }
-  ++nf;
-  ++n;
-  bLimit = TRUE;
-  while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) &&
-         XFA_IsDigit(c = pNum[n])) {
-    if (bLimit == TRUE) {
-      if ((cf = pFmt[nf]) == L'*') {
-        bLimit = FALSE;
-      } else if (cf == L'z') {
-        nf++;
-      } else {
-        return FALSE;
-      }
-    }
-    n++;
-  }
-  return n == nCount;
-}
diff --git a/xfa/src/fxfa/parser/xfa_localevalue.h b/xfa/src/fxfa/parser/xfa_localevalue.h
deleted file mode 100644
index bcdf037..0000000
--- a/xfa/src/fxfa/parser/xfa_localevalue.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_LOCALEVALUE_H_
-#define XFA_SRC_FXFA_PARSER_XFA_LOCALEVALUE_H_
-
-#include "xfa/include/fxfa/fxfa_objectacc.h"
-
-class IFX_Locale;
-class CFX_Unitime;
-class CXFA_LocaleMgr;
-
-#define XFA_VT_NULL 0
-#define XFA_VT_BOOLEAN 1
-#define XFA_VT_INTEGER 2
-#define XFA_VT_DECIMAL 4
-#define XFA_VT_FLOAT 8
-#define XFA_VT_TEXT 16
-#define XFA_VT_DATE 32
-#define XFA_VT_TIME 64
-#define XFA_VT_DATETIME 128
-
-class CXFA_LocaleValue {
- public:
-  CXFA_LocaleValue();
-  CXFA_LocaleValue(const CXFA_LocaleValue& value);
-  CXFA_LocaleValue(FX_DWORD dwType, CXFA_LocaleMgr* pLocaleMgr);
-  CXFA_LocaleValue(FX_DWORD dwType,
-                   const CFX_WideString& wsValue,
-                   CXFA_LocaleMgr* pLocaleMgr);
-  CXFA_LocaleValue(FX_DWORD dwType,
-                   const CFX_WideString& wsValue,
-                   const CFX_WideString& wsFormat,
-                   IFX_Locale* pLocale,
-                   CXFA_LocaleMgr* pLocaleMgr);
-  ~CXFA_LocaleValue();
-  CXFA_LocaleValue& operator=(const CXFA_LocaleValue& value);
-
-  FX_BOOL ValidateValue(const CFX_WideString& wsValue,
-                        const CFX_WideString& wsPattern,
-                        IFX_Locale* pLocale,
-                        CFX_WideString* pMatchFormat = NULL);
-  FX_BOOL FormatPatterns(CFX_WideString& wsResult,
-                         const CFX_WideString& wsFormat,
-                         IFX_Locale* pLocale,
-                         XFA_VALUEPICTURE eValueType) const;
-  FX_BOOL FormatSinglePattern(CFX_WideString& wsResult,
-                              const CFX_WideString& wsFormat,
-                              IFX_Locale* pLocale,
-                              XFA_VALUEPICTURE eValueType) const;
-  FX_BOOL ValidateCanonicalValue(const CFX_WideString& wsValue,
-                                 FX_DWORD dwVType);
-  FX_BOOL ValidateCanonicalDate(const CFX_WideString& wsDate,
-                                CFX_Unitime& unDate);
-  FX_BOOL ValidateCanonicalTime(const CFX_WideString& wsTime);
-  FX_BOOL ValidateCanonicalDateTime(const CFX_WideString& wsDateTime);
-  void GetNumbericFormat(CFX_WideString& wsFormat,
-                         int32_t nIntLen,
-                         int32_t nDecLen,
-                         FX_BOOL bSign = TRUE);
-  FX_BOOL ValidateNumericTemp(CFX_WideString& wsNumeric,
-                              CFX_WideString& wsFormat,
-                              IFX_Locale* pLocale = NULL,
-                              int32_t* pos = NULL);
-
-  CFX_WideString GetValue() const;
-  FX_DWORD GetType() const;
-  void SetValue(const CFX_WideString& wsValue, FX_DWORD dwType);
-  CFX_WideString GetText() const;
-  FX_FLOAT GetNum() const;
-  FX_DOUBLE GetDoubleNum() const;
-  CFX_Unitime GetDate() const;
-  CFX_Unitime GetTime() const;
-  CFX_Unitime GetDateTime() const;
-  FX_BOOL SetText(const CFX_WideString& wsText);
-  FX_BOOL SetText(const CFX_WideString& wsText,
-                  const CFX_WideString& wsFormat,
-                  IFX_Locale* pLocale);
-  FX_BOOL SetNum(FX_FLOAT fNum);
-  FX_BOOL SetNum(const CFX_WideString& wsNum,
-                 const CFX_WideString& wsFormat,
-                 IFX_Locale* pLocale);
-  FX_BOOL SetDate(const CFX_Unitime& d);
-  FX_BOOL SetDate(const CFX_WideString& wsDate,
-                  const CFX_WideString& wsFormat,
-                  IFX_Locale* pLocale);
-  FX_BOOL SetTime(const CFX_Unitime& t);
-  FX_BOOL SetTime(const CFX_WideString& wsTime,
-                  const CFX_WideString& wsFormat,
-                  IFX_Locale* pLocale);
-  FX_BOOL SetDateTime(const CFX_Unitime& dt);
-  FX_BOOL SetDateTime(const CFX_WideString& wsDateTime,
-                      const CFX_WideString& wsFormat,
-                      IFX_Locale* pLocale);
-  bool IsNull() const { return m_dwType == XFA_VT_NULL; }
-  FX_BOOL IsEmpty() const { return m_wsValue.IsEmpty(); }
-  FX_BOOL IsValid() const { return m_bValid; }
-
- protected:
-  FX_BOOL ParsePatternValue(const CFX_WideString& wsValue,
-                            const CFX_WideString& wsPattern,
-                            IFX_Locale* pLocale);
-  CXFA_LocaleMgr* m_pLocaleMgr;
-  CFX_WideString m_wsValue;
-  FX_DWORD m_dwType;
-  FX_BOOL m_bValid;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_LOCALEVALUE_H_
diff --git a/xfa/src/fxfa/parser/xfa_object.h b/xfa/src/fxfa/parser/xfa_object.h
deleted file mode 100644
index 949ca87..0000000
--- a/xfa/src/fxfa/parser/xfa_object.h
+++ /dev/null
@@ -1,803 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_OBJECT_H_
-#define XFA_SRC_FXFA_PARSER_XFA_OBJECT_H_
-
-#include "xfa/src/fde/xml/fde_xml.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-class CXFA_Document;
-class CXFA_Node;
-class CXFA_NodeList;
-class CXFA_OrdinaryObject;
-
-enum XFA_OBJECTTYPE {
-  XFA_OBJECTTYPE_OrdinaryObject = 0x0,
-  XFA_OBJECTTYPE_OrdinaryList = 0x1,
-  XFA_OBJECTTYPE_NodeList = 0x2,
-  XFA_OBJECTTYPE_Node = 0x4,
-  XFA_OBJECTTYPE_NodeC = 0x5,
-  XFA_OBJECTTYPE_NodeV = 0x6,
-  XFA_OBJECTTYPE_ModelNode = 0x8,
-  XFA_OBJECTTYPE_TextNode = 0x9,
-  XFA_OBJECTTYPE_ContainerNode = 0xA,
-  XFA_OBJECTTYPE_ContentNode = 0xB,
-  XFA_OBJECTTYPE_VariablesThis = 0xC,
-  XFA_OBJECTTYPEMASK = 0xF,
-  XFA_NODEFLAG_Initialized = 0x00020,
-  XFA_NODEFLAG_HasRemoved = 0x00200,
-  XFA_NODEFLAG_NeedsInitApp = 0x00400,
-  XFA_NODEFLAG_BindFormItems = 0x00800,
-  XFA_NODEFLAG_UserInteractive = 0x01000,
-  XFA_NODEFLAG_SkipDataBinding = 0x02000,
-  XFA_NODEFLAG_OwnXMLNode = 0x04000,
-  XFA_NODEFLAG_UnusedNode = 0x08000,
-  XFA_NODEFLAG_LayoutGeneratedNode = 0x10000,
-};
-class CXFA_Object {
- public:
-  CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags);
-  CXFA_Document* GetDocument() const { return m_pDocument; }
-  FX_DWORD GetFlag() const { return m_uFlags; }
-  XFA_OBJECTTYPE GetObjectType() const {
-    return (XFA_OBJECTTYPE)(m_uFlags & XFA_OBJECTTYPEMASK);
-  }
-
-  FX_BOOL IsNode() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) >= XFA_OBJECTTYPE_Node;
-  }
-  FX_BOOL IsOrdinaryObject() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryObject;
-  }
-  FX_BOOL IsNodeList() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_NodeList;
-  }
-  FX_BOOL IsOrdinaryList() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_OrdinaryList;
-  }
-  FX_BOOL IsContentNode() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContentNode;
-  }
-  FX_BOOL IsContainerNode() const {
-    return (m_uFlags & XFA_OBJECTTYPEMASK) == XFA_OBJECTTYPE_ContainerNode;
-  }
-
-  CXFA_Node* AsNode();
-  CXFA_OrdinaryObject* AsOrdinaryObject();
-  CXFA_NodeList* AsNodeList();
-
-  const CXFA_Node* AsNode() const;
-  const CXFA_OrdinaryObject* AsOrdinaryObject() const;
-  const CXFA_NodeList* AsNodeList() const;
-
-  XFA_ELEMENT GetClassID() const;
-  void GetClassName(CFX_WideStringC& wsName) const;
-  uint32_t GetClassHashCode() const;
-  void Script_ObjectClass_ClassName(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void ThrowScriptErrorMessage(int32_t iStringID, ...);
-
- protected:
-  CXFA_Document* const m_pDocument;
-  FX_DWORD m_uFlags;
-};
-
-#define XFA_NODEFILTER_Children 0x01
-#define XFA_NODEFILTER_Properties 0x02
-#define XFA_NODEFILTER_OneOfProperty 0x04
-#define XFA_CLONEFLAG_Content 0x01
-enum XFA_NODEITEM {
-  XFA_NODEITEM_Parent,
-  XFA_NODEITEM_FirstChild,
-  XFA_NODEITEM_NextSibling,
-  XFA_NODEITEM_PrevSibling,
-};
-enum XFA_SOM_MESSAGETYPE {
-  XFA_SOM_ValidationMessage,
-  XFA_SOM_FormatMessage,
-  XFA_SOM_MandatoryMessage
-};
-
-typedef CFX_ArrayTemplate<CXFA_Node*> CXFA_NodeArray;
-typedef CFX_StackTemplate<CXFA_Node*> CXFA_NodeStack;
-typedef CXFA_PtrSetTemplate<CXFA_Node*> CXFA_NodeSet;
-typedef void (*PD_CALLBACK_DUPLICATEDATA)(void*& pData);
-
-struct XFA_MAPDATABLOCKCALLBACKINFO {
-  PD_CALLBACK_FREEDATA pFree;
-  PD_CALLBACK_DUPLICATEDATA pCopy;
-};
-
-struct XFA_MAPDATABLOCK {
-  uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); }
-  XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo;
-  int32_t iBytes;
-};
-
-struct XFA_MAPMODULEDATA {
-  CFX_MapPtrToPtr m_ValueMap;
-  CFX_MapPtrTemplate<void*, XFA_MAPDATABLOCK*> m_BufferMap;
-};
-
-#define XFA_CalcRefCount (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'R')
-#define XFA_CalcData (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'C')
-#define XFA_LAYOUTITEMKEY (void*)(uintptr_t) FXBSTR_ID('L', 'Y', 'I', 'M')
-class CXFA_Node : public CXFA_Object {
- public:
-  XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
-  FX_DWORD GetPacketID() const { return m_ePacket; }
-  FX_BOOL HasFlag(FX_DWORD dwFlag) const;
-  void SetFlag(FX_DWORD dwFlag, FX_BOOL bOn = TRUE, FX_BOOL bNotify = TRUE);
-  FX_BOOL IsAttributeInXML();
-  FX_BOOL IsFormContainer() {
-    return m_ePacket == XFA_XDPPACKET_Form && IsContainerNode();
-  }
-  void SetXMLMappingNode(IFDE_XMLNode* pXMLNode) { m_pXMLNode = pXMLNode; }
-  IFDE_XMLNode* GetXMLMappingNode() const { return m_pXMLNode; }
-  IFDE_XMLNode* CreateXMLMappingNode();
-  FX_BOOL IsNeedSavingXMLNode();
-  FX_DWORD GetNameHash() const { return m_dwNameHash; }
-  bool IsUnnamed() const { return m_dwNameHash == 0; }
-  CXFA_Node* GetModelNode();
-  void UpdateNameHash();
-  FX_BOOL HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit = FALSE);
-  FX_BOOL SetAttribute(XFA_ATTRIBUTE eAttr,
-                       const CFX_WideStringC& wsValue,
-                       FX_BOOL bNotify = FALSE);
-  FX_BOOL GetAttribute(XFA_ATTRIBUTE eAttr,
-                       CFX_WideString& wsValue,
-                       FX_BOOL bUseDefault = TRUE);
-  FX_BOOL SetAttribute(const CFX_WideStringC& wsAttr,
-                       const CFX_WideStringC& wsValue,
-                       FX_BOOL bNotify = FALSE);
-  FX_BOOL GetAttribute(const CFX_WideStringC& wsAttr,
-                       CFX_WideString& wsValue,
-                       FX_BOOL bUseDefault = TRUE);
-  FX_BOOL RemoveAttribute(const CFX_WideStringC& wsAttr);
-  FX_BOOL SetContent(const CFX_WideString& wsContent,
-                     const CFX_WideString& wsXMLValue,
-                     FX_BOOL bNotify = FALSE,
-                     FX_BOOL bScriptModify = FALSE,
-                     FX_BOOL bSyncData = TRUE);
-  FX_BOOL TryContent(CFX_WideString& wsContent,
-                     FX_BOOL bScriptModify = FALSE,
-                     FX_BOOL bProto = TRUE);
-  CFX_WideString GetContent();
-
-  FX_BOOL TryNamespace(CFX_WideString& wsNamespace);
-
-  FX_BOOL SetBoolean(XFA_ATTRIBUTE eAttr,
-                     FX_BOOL bValue,
-                     FX_BOOL bNotify = FALSE) {
-    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, (void*)(uintptr_t)bValue,
-                    bNotify);
-  }
-  FX_BOOL TryBoolean(XFA_ATTRIBUTE eAttr,
-                     FX_BOOL& bValue,
-                     FX_BOOL bUseDefault = TRUE);
-  FX_BOOL GetBoolean(XFA_ATTRIBUTE eAttr) {
-    FX_BOOL bValue;
-    return TryBoolean(eAttr, bValue, TRUE) ? bValue : FALSE;
-  }
-  FX_BOOL SetInteger(XFA_ATTRIBUTE eAttr,
-                     int32_t iValue,
-                     FX_BOOL bNotify = FALSE) {
-    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, (void*)(uintptr_t)iValue,
-                    bNotify);
-  }
-  FX_BOOL TryInteger(XFA_ATTRIBUTE eAttr,
-                     int32_t& iValue,
-                     FX_BOOL bUseDefault = TRUE);
-  int32_t GetInteger(XFA_ATTRIBUTE eAttr) {
-    int32_t iValue;
-    return TryInteger(eAttr, iValue, TRUE) ? iValue : 0;
-  }
-  FX_BOOL SetEnum(XFA_ATTRIBUTE eAttr,
-                  XFA_ATTRIBUTEENUM eValue,
-                  FX_BOOL bNotify = FALSE) {
-    return SetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, (void*)(uintptr_t)eValue,
-                    bNotify);
-  }
-  FX_BOOL TryEnum(XFA_ATTRIBUTE eAttr,
-                  XFA_ATTRIBUTEENUM& eValue,
-                  FX_BOOL bUseDefault = TRUE);
-  XFA_ATTRIBUTEENUM GetEnum(XFA_ATTRIBUTE eAttr) {
-    XFA_ATTRIBUTEENUM eValue;
-    return TryEnum(eAttr, eValue, TRUE) ? eValue : XFA_ATTRIBUTEENUM_Unknown;
-  }
-  FX_BOOL SetCData(XFA_ATTRIBUTE eAttr,
-                   const CFX_WideString& wsValue,
-                   FX_BOOL bNotify = FALSE,
-                   FX_BOOL bScriptModify = FALSE);
-  FX_BOOL SetAttributeValue(const CFX_WideString& wsValue,
-                            const CFX_WideString& wsXMLValue,
-                            FX_BOOL bNotify = FALSE,
-                            FX_BOOL bScriptModify = FALSE);
-  FX_BOOL TryCData(XFA_ATTRIBUTE eAttr,
-                   CFX_WideString& wsValue,
-                   FX_BOOL bUseDefault = TRUE,
-                   FX_BOOL bProto = TRUE);
-  FX_BOOL TryCData(XFA_ATTRIBUTE eAttr,
-                   CFX_WideStringC& wsValue,
-                   FX_BOOL bUseDefault = TRUE,
-                   FX_BOOL bProto = TRUE);
-  CFX_WideStringC GetCData(XFA_ATTRIBUTE eAttr) {
-    CFX_WideStringC wsValue;
-    return TryCData(eAttr, wsValue) ? wsValue : CFX_WideStringC();
-  }
-  FX_BOOL SetMeasure(XFA_ATTRIBUTE eAttr,
-                     CXFA_Measurement mValue,
-                     FX_BOOL bNotify = FALSE);
-  FX_BOOL TryMeasure(XFA_ATTRIBUTE eAttr,
-                     CXFA_Measurement& mValue,
-                     FX_BOOL bUseDefault = TRUE) const;
-  CXFA_Measurement GetMeasure(XFA_ATTRIBUTE eAttr) const;
-  FX_BOOL SetObject(XFA_ATTRIBUTE eAttr,
-                    void* pData,
-                    XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
-  FX_BOOL TryObject(XFA_ATTRIBUTE eAttr, void*& pData);
-  void* GetObject(XFA_ATTRIBUTE eAttr) {
-    void* pData;
-    return TryObject(eAttr, pData) ? pData : NULL;
-  }
-  FX_BOOL SetUserData(void* pKey,
-                      void* pData,
-                      XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
-  FX_BOOL TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso = FALSE);
-  void* GetUserData(void* pKey, FX_BOOL bProtoAlso = FALSE) {
-    void* pData;
-    return TryUserData(pKey, pData, bProtoAlso) ? pData : NULL;
-  }
-  CXFA_Node* GetProperty(int32_t index,
-                         XFA_ELEMENT eProperty,
-                         FX_BOOL bCreateProperty = TRUE);
-  int32_t CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild = FALSE);
-  CXFA_Node* GetChild(int32_t index,
-                      XFA_ELEMENT eElement,
-                      FX_BOOL bOnlyChild = FALSE);
-  int32_t InsertChild(int32_t index, CXFA_Node* pNode);
-  FX_BOOL InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode = NULL);
-  FX_BOOL RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify = TRUE);
-  CXFA_Node* Clone(FX_BOOL bRecursive);
-  CXFA_Node* GetNodeItem(XFA_NODEITEM eItem) const;
-  CXFA_Node* GetNodeItem(XFA_NODEITEM eItem, XFA_OBJECTTYPE eType) const;
-  int32_t GetNodeList(CXFA_NodeArray& nodes,
-                      FX_DWORD dwTypeFilter = XFA_NODEFILTER_Children |
-                                              XFA_NODEFILTER_Properties,
-                      XFA_ELEMENT eElementFilter = XFA_ELEMENT_UNKNOWN,
-                      int32_t iLevel = 1);
-  CXFA_Node* CreateSamePacketNode(XFA_ELEMENT eElement,
-                                  FX_DWORD dwFlags = XFA_NODEFLAG_Initialized);
-  CXFA_Node* CloneTemplateToForm(FX_BOOL bRecursive);
-  CXFA_Node* GetTemplateNode() const;
-  void SetTemplateNode(CXFA_Node* pTemplateNode);
-  CXFA_Node* GetDataDescriptionNode();
-  void SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode);
-  CXFA_Node* GetBindData();
-  int32_t GetBindItems(CXFA_NodeArray& formItems);
-  int32_t AddBindItem(CXFA_Node* pFormNode);
-  int32_t RemoveBindItem(CXFA_Node* pFormNode);
-  FX_BOOL HasBindItem();
-  CXFA_WidgetData* GetWidgetData();
-  CXFA_WidgetData* GetContainerWidgetData();
-  FX_BOOL GetLocaleName(CFX_WideString& wsLocaleName);
-  XFA_ATTRIBUTEENUM GetIntact();
-  CXFA_Node* GetFirstChildByName(const CFX_WideStringC& wsNodeName) const;
-  CXFA_Node* GetFirstChildByName(FX_DWORD dwNodeNameHash) const;
-  CXFA_Node* GetFirstChildByClass(XFA_ELEMENT eNodeClass) const;
-  CXFA_Node* GetNextSameNameSibling(FX_DWORD dwNodeNameHash) const;
-  CXFA_Node* GetNextSameNameSibling(const CFX_WideStringC& wsNodeName) const;
-  CXFA_Node* GetNextSameClassSibling(XFA_ELEMENT eNodeClass) const;
-  int32_t GetNodeSameNameIndex() const;
-  int32_t GetNodeSameClassIndex() const;
-  void GetSOMExpression(CFX_WideString& wsSOMExpression);
-  CXFA_Node* GetInstanceMgrOfSubform();
-
-  CXFA_Node* GetOccurNode();
-  void Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments);
-  void Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments);
-  void Script_Som_ResolveNodeList(FXJSE_HVALUE hValue,
-                                  CFX_WideString wsExpression,
-                                  FX_DWORD dwFlag,
-                                  CXFA_Node* refNode = NULL);
-  void Script_TreeClass_All(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_Nodes(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_ClassAll(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_Parent(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_Index(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_TreeClass_SomExpression(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_Clone(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments);
-  void Script_NodeClass_Ns(FXJSE_HVALUE hValue,
-                           FX_BOOL bSetting,
-                           XFA_ATTRIBUTE eAttribute);
-  void Script_NodeClass_Model(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_NodeClass_IsContainer(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_NodeClass_IsNull(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-  void Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments);
-  void Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments);
-  void Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments);
-  void Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments);
-  void Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments);
-  void Script_ModelClass_Context(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute);
-  void Script_ModelClass_AliasNode(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments);
-  void Script_Delta_Restore(CFXJSE_Arguments* pArguments);
-  void Script_Delta_CurrentValue(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute);
-  void Script_Delta_SavedValue(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-  void Script_Delta_Target(FXJSE_HVALUE hValue,
-                           FX_BOOL bSetting,
-                           XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_SendAttributeChangeMessage(void* eAttribute,
-                                                   void* eValue,
-                                                   FX_BOOL bScriptModify);
-  void Script_Attribute_Integer(FXJSE_HVALUE hValue,
-                                FX_BOOL bSetting,
-                                XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_IntegerRead(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_BOOL(FXJSE_HVALUE hValue,
-                             FX_BOOL bSetting,
-                             XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_BOOLRead(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_String(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-  void Script_Attribute_StringRead(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_Som_ValidationMessage(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_Field_Length(FXJSE_HVALUE hValue,
-                           FX_BOOL bSetting,
-                           XFA_ATTRIBUTE eAttribute);
-  void Script_Som_DefaultValue(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-  void Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_Boolean_Value(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_Som_Message(FXJSE_HVALUE hValue,
-                          FX_BOOL bSetting,
-                          XFA_SOM_MESSAGETYPE iMessageType);
-  void Script_Som_BorderColor(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_Som_BorderWidth(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_Som_FillColor(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_Som_DataNode(FXJSE_HVALUE hValue,
-                           FX_BOOL bSetting,
-                           XFA_ATTRIBUTE eAttribute);
-  void Script_Som_FontColor(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_Som_Mandatory(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_Som_MandatoryMessage(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_Som_InstanceIndex(FXJSE_HVALUE hValue,
-                                FX_BOOL bSetting,
-                                XFA_ATTRIBUTE eAttribute);
-  void Script_Draw_DefaultValue(FXJSE_HVALUE hValue,
-                                FX_BOOL bSetting,
-                                XFA_ATTRIBUTE eAttribute);
-  void Script_Field_DefaultValue(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute);
-  void Script_Field_EditValue(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_Field_FormatMessage(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_Field_FormattedValue(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_Field_ParentSubform(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_Field_SelectedIndex(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_Field_ClearItems(CFXJSE_Arguments* pArguments);
-  void Script_Field_ExecEvent(CFXJSE_Arguments* pArguments);
-  void Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments);
-  void Script_Field_DeleteItem(CFXJSE_Arguments* pArguments);
-  void Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments);
-  void Script_Field_BoundItem(CFXJSE_Arguments* pArguments);
-  void Script_Field_GetItemState(CFXJSE_Arguments* pArguments);
-  void Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments);
-  void Script_Field_SetItems(CFXJSE_Arguments* pArguments);
-  void Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments);
-  void Script_Field_SetItemState(CFXJSE_Arguments* pArguments);
-  void Script_Field_AddItem(CFXJSE_Arguments* pArguments);
-  void Script_Field_ExecValidate(CFXJSE_Arguments* pArguments);
-  void Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute);
-  void Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_ExclGroup_Transient(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments);
-  void Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments);
-  void Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments);
-  void Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments);
-  void Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments);
-  void Script_Subform_InstanceManager(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_Subform_Locale(FXJSE_HVALUE hValue,
-                             FX_BOOL bSetting,
-                             XFA_ATTRIBUTE eAttribute);
-  void Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments);
-  void Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments);
-  void Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments);
-  void Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments);
-  void Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments);
-
-  int32_t Subform_and_SubformSet_InstanceIndex();
-  void Script_Template_FormNodes(CFXJSE_Arguments* pArguments);
-  void Script_Template_Remerge(CFXJSE_Arguments* pArguments);
-  void Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments);
-  void Script_Template_CreateNode(CFXJSE_Arguments* pArguments);
-  void Script_Template_Recalculate(CFXJSE_Arguments* pArguments);
-  void Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments);
-  void Script_Template_ExecValidate(CFXJSE_Arguments* pArguments);
-  void Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments);
-  void Script_InstanceManager_Count(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_InstanceManager_Max(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_InstanceManager_Min(FXJSE_HVALUE hValue,
-                                  FX_BOOL bSetting,
-                                  XFA_ATTRIBUTE eAttribute);
-  void Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments);
-  void Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments);
-  void Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments);
-  void Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments);
-  void Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments);
-  int32_t InstanceManager_SetInstances(int32_t iCount);
-  int32_t InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom);
-  void Script_Occur_Max(FXJSE_HVALUE hValue,
-                        FX_BOOL bSetting,
-                        XFA_ATTRIBUTE eAttribute);
-  void Script_Occur_Min(FXJSE_HVALUE hValue,
-                        FX_BOOL bSetting,
-                        XFA_ATTRIBUTE eAttribute);
-  void Script_Desc_Metadata(CFXJSE_Arguments* pArguments);
-  void Script_Form_FormNodes(CFXJSE_Arguments* pArguments);
-  void Script_Form_Remerge(CFXJSE_Arguments* pArguments);
-  void Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments);
-  void Script_Form_Recalculate(CFXJSE_Arguments* pArguments);
-  void Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments);
-  void Script_Form_ExecValidate(CFXJSE_Arguments* pArguments);
-  void Script_Form_Checksum(FXJSE_HVALUE hValue,
-                            FX_BOOL bSetting,
-                            XFA_ATTRIBUTE eAttribute);
-  void Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments);
-  void Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments);
-  void Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments);
-  void Script_Packet_Content(FXJSE_HVALUE hValue,
-                             FX_BOOL bSetting,
-                             XFA_ATTRIBUTE eAttribute);
-  void Script_Source_Next(CFXJSE_Arguments* pArguments);
-  void Script_Source_CancelBatch(CFXJSE_Arguments* pArguments);
-  void Script_Source_First(CFXJSE_Arguments* pArguments);
-  void Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments);
-  void Script_Source_Previous(CFXJSE_Arguments* pArguments);
-  void Script_Source_IsBOF(CFXJSE_Arguments* pArguments);
-  void Script_Source_IsEOF(CFXJSE_Arguments* pArguments);
-  void Script_Source_Cancel(CFXJSE_Arguments* pArguments);
-  void Script_Source_Update(CFXJSE_Arguments* pArguments);
-  void Script_Source_Open(CFXJSE_Arguments* pArguments);
-  void Script_Source_Delete(CFXJSE_Arguments* pArguments);
-  void Script_Source_AddNew(CFXJSE_Arguments* pArguments);
-  void Script_Source_Requery(CFXJSE_Arguments* pArguments);
-  void Script_Source_Resync(CFXJSE_Arguments* pArguments);
-  void Script_Source_Close(CFXJSE_Arguments* pArguments);
-  void Script_Source_Last(CFXJSE_Arguments* pArguments);
-  void Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments);
-  void Script_Source_Db(FXJSE_HVALUE hValue,
-                        FX_BOOL bSetting,
-                        XFA_ATTRIBUTE eAttribute);
-  void Script_Xfa_This(FXJSE_HVALUE hValue,
-                       FX_BOOL bSetting,
-                       XFA_ATTRIBUTE eAttribute);
-  void Script_Handler_Version(FXJSE_HVALUE hValue,
-                              FX_BOOL bSetting,
-                              XFA_ATTRIBUTE eAttribute);
-  void Script_SubmitFormat_Mode(FXJSE_HVALUE hValue,
-                                FX_BOOL bSetting,
-                                XFA_ATTRIBUTE eAttribute);
-  void Script_Extras_Type(FXJSE_HVALUE hValue,
-                          FX_BOOL bSetting,
-                          XFA_ATTRIBUTE eAttribute);
-  void Script_Encrypt_Format(FXJSE_HVALUE hValue,
-                             FX_BOOL bSetting,
-                             XFA_ATTRIBUTE eAttribute);
-  void Script_Script_Stateless(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-
- protected:
-  CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement);
-  ~CXFA_Node();
-  friend class CXFA_Document;
-  CXFA_Node* Deprecated_GetPrevSibling();
-  FX_BOOL SetValue(XFA_ATTRIBUTE eAttr,
-                   XFA_ATTRIBUTETYPE eType,
-                   void* pValue,
-                   FX_BOOL bNotify);
-  FX_BOOL GetValue(XFA_ATTRIBUTE eAttr,
-                   XFA_ATTRIBUTETYPE eType,
-                   FX_BOOL bUseDefault,
-                   void*& pValue);
-  void OnRemoved(CXFA_Node* pParent, CXFA_Node* pRemoved, FX_BOOL bNotify);
-  void OnChanging(XFA_ATTRIBUTE eAttr, void* pNewValue, FX_BOOL bNotify);
-  void OnChanged(XFA_ATTRIBUTE eAttr,
-                 void* pNewValue,
-                 FX_BOOL bNotify,
-                 FX_BOOL bScriptModify = FALSE);
-  int32_t execSingleEventByName(const CFX_WideStringC& wsEventName,
-                                XFA_ELEMENT eElementType);
-  FX_BOOL SetScriptContent(const CFX_WideString& wsContent,
-                           const CFX_WideString& wsXMLValue,
-                           FX_BOOL bNotify = TRUE,
-                           FX_BOOL bScriptModify = FALSE,
-                           FX_BOOL bSyncData = TRUE);
-  CFX_WideString GetScriptContent(FX_BOOL bScriptModify = FALSE);
-  XFA_MAPMODULEDATA* CreateMapModuleData();
-  XFA_MAPMODULEDATA* GetMapModuleData() const;
-  void SetMapModuleValue(void* pKey, void* pValue);
-  FX_BOOL GetMapModuleValue(void* pKey, void*& pValue);
-  void SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue);
-  FX_BOOL GetMapModuleString(void* pKey, CFX_WideStringC& wsValue);
-  void SetMapModuleBuffer(void* pKey,
-                          void* pValue,
-                          int32_t iBytes,
-                          XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = NULL);
-  FX_BOOL GetMapModuleBuffer(void* pKey,
-                             void*& pValue,
-                             int32_t& iBytes,
-                             FX_BOOL bProtoAlso = TRUE) const;
-  FX_BOOL HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso = FALSE);
-  void RemoveMapModuleKey(void* pKey = NULL);
-  void MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr = TRUE);
-  void MoveBufferMapData(CXFA_Node* pDstModule, void* pKey);
-  void MoveBufferMapData(CXFA_Node* pSrcModule,
-                         CXFA_Node* pDstModule,
-                         void* pKey,
-                         FX_BOOL bRecursive = FALSE);
-
-  CXFA_Node* m_pNext;
-  CXFA_Node* m_pChild;
-  CXFA_Node* m_pLastChild;
-  CXFA_Node* m_pParent;
-  IFDE_XMLNode* m_pXMLNode;
-  XFA_ELEMENT m_eNodeClass;
-  FX_WORD m_ePacket;
-  FX_DWORD m_dwNameHash;
-  CXFA_Node* m_pAuxNode;
-  XFA_MAPMODULEDATA* m_pMapModuleData;
-};
-class CXFA_OrdinaryObject : public CXFA_Object {
- public:
-  CXFA_OrdinaryObject(CXFA_Document* pDocument, XFA_ELEMENT eElement)
-      : CXFA_Object(pDocument, XFA_OBJECTTYPE_OrdinaryObject),
-        m_uScriptHash(0) {
-    m_eNodeClass = eElement;
-  }
-  XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
-  uint32_t GetScriptObjHash() { return m_uScriptHash; }
-
- protected:
-  XFA_ELEMENT m_eNodeClass;
-  uint32_t m_uScriptHash;
-};
-class CXFA_ThisProxy : public CXFA_Object {
- public:
-  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode)
-      : CXFA_Object(pThisNode->GetDocument(), XFA_OBJECTTYPE_VariablesThis),
-        m_pThisNode(NULL),
-        m_pScriptNode(NULL) {
-    m_pThisNode = pThisNode;
-    m_pScriptNode = pScriptNode;
-  }
-  virtual ~CXFA_ThisProxy() {}
-  CXFA_Node* GetThisNode() { return m_pThisNode; }
-  CXFA_Node* GetScriptNode() { return m_pScriptNode; }
-
- private:
-  CXFA_Node* m_pThisNode;
-  CXFA_Node* m_pScriptNode;
-};
-class CXFA_NodeList : public CXFA_Object {
- public:
-  explicit CXFA_NodeList(CXFA_Document* pDocument);
-  virtual ~CXFA_NodeList() {}
-  XFA_ELEMENT GetClassID() const { return XFA_ELEMENT_NodeList; }
-  CXFA_Node* NamedItem(const CFX_WideStringC& wsName);
-  virtual int32_t GetLength() = 0;
-  virtual FX_BOOL Append(CXFA_Node* pNode) = 0;
-  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) = 0;
-  virtual FX_BOOL Remove(CXFA_Node* pNode) = 0;
-  virtual CXFA_Node* Item(int32_t iIndex) = 0;
-
-  void Script_ListClass_Append(CFXJSE_Arguments* pArguments);
-  void Script_ListClass_Insert(CFXJSE_Arguments* pArguments);
-  void Script_ListClass_Remove(CFXJSE_Arguments* pArguments);
-  void Script_ListClass_Item(CFXJSE_Arguments* pArguments);
-
-  void Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments);
-  void Script_ListClass_Length(FXJSE_HVALUE hValue,
-                               FX_BOOL bSetting,
-                               XFA_ATTRIBUTE eAttribute);
-};
-class CXFA_ArrayNodeList : public CXFA_NodeList {
- public:
-  explicit CXFA_ArrayNodeList(CXFA_Document* pDocument);
-  void SetArrayNodeList(const CXFA_NodeArray& srcArray);
-  virtual int32_t GetLength();
-  virtual FX_BOOL Append(CXFA_Node* pNode);
-  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
-  virtual FX_BOOL Remove(CXFA_Node* pNode);
-  virtual CXFA_Node* Item(int32_t iIndex);
-
- protected:
-  CXFA_NodeArray m_array;
-};
-class CXFA_AttachNodeList : public CXFA_NodeList {
- public:
-  CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode);
-
-  virtual int32_t GetLength();
-  virtual FX_BOOL Append(CXFA_Node* pNode);
-  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
-  virtual FX_BOOL Remove(CXFA_Node* pNode);
-  virtual CXFA_Node* Item(int32_t iIndex);
-
- protected:
-  CXFA_Node* m_pAttachNode;
-};
-class CXFA_TraverseStrategy_XFAContainerNode {
- public:
-  static CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode,
-                                  void* pUserData = NULL) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild,
-                                      XFA_OBJECTTYPE_ContainerNode);
-  }
-  static CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode,
-                                   void* pUserData = NULL) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling,
-                                      XFA_OBJECTTYPE_ContainerNode);
-  }
-  static CXFA_Node* GetParent(CXFA_Node* pTemplateNode,
-                              void* pUserData = NULL) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent,
-                                      XFA_OBJECTTYPE_ContainerNode);
-  }
-};
-typedef CXFA_NodeIteratorTemplate<CXFA_Node,
-                                  CXFA_TraverseStrategy_XFAContainerNode>
-    CXFA_ContainerIterator;
-class CXFA_TraverseStrategy_XFANode {
- public:
-  static inline CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  }
-  static inline CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  static inline CXFA_Node* GetParent(CXFA_Node* pTemplateNode) {
-    return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-};
-typedef CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
-    CXFA_NodeIterator;
-
-inline CXFA_Node* CXFA_Object::AsNode() {
-  return IsNode() ? static_cast<CXFA_Node*>(this) : nullptr;
-}
-inline CXFA_OrdinaryObject* CXFA_Object::AsOrdinaryObject() {
-  return IsOrdinaryObject() ? static_cast<CXFA_OrdinaryObject*>(this) : nullptr;
-}
-inline CXFA_NodeList* CXFA_Object::AsNodeList() {
-  return IsNodeList() ? static_cast<CXFA_NodeList*>(this) : nullptr;
-}
-
-inline const CXFA_Node* CXFA_Object::AsNode() const {
-  return IsNode() ? static_cast<const CXFA_Node*>(this) : nullptr;
-}
-inline const CXFA_OrdinaryObject* CXFA_Object::AsOrdinaryObject() const {
-  return IsOrdinaryObject() ? static_cast<const CXFA_OrdinaryObject*>(this)
-                            : nullptr;
-}
-inline const CXFA_NodeList* CXFA_Object::AsNodeList() const {
-  return IsNodeList() ? static_cast<const CXFA_NodeList*>(this) : nullptr;
-}
-
-inline CXFA_Node* ToNode(CXFA_Object* pObj) {
-  return pObj ? pObj->AsNode() : nullptr;
-}
-inline CXFA_OrdinaryObject* ToOrdinaryObject(CXFA_Object* pObj) {
-  return pObj ? pObj->AsOrdinaryObject() : nullptr;
-}
-inline CXFA_NodeList* ToNodeList(CXFA_Object* pObj) {
-  return pObj ? pObj->AsNodeList() : nullptr;
-}
-
-inline const CXFA_Node* ToNode(const CXFA_Object* pObj) {
-  return pObj ? pObj->AsNode() : nullptr;
-}
-inline const CXFA_OrdinaryObject* ToOrdinaryObject(const CXFA_Object* pObj) {
-  return pObj ? pObj->AsOrdinaryObject() : nullptr;
-}
-inline const CXFA_NodeList* ToNodeList(const CXFA_Object* pObj) {
-  return pObj ? pObj->AsNodeList() : nullptr;
-}
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_OBJECT_H_
diff --git a/xfa/src/fxfa/parser/xfa_object_imp.cpp b/xfa/src/fxfa/parser/xfa_object_imp.cpp
deleted file mode 100644
index 23b0644..0000000
--- a/xfa/src/fxfa/parser/xfa_object_imp.cpp
+++ /dev/null
@@ -1,5408 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fgas/crt/fgas_system.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_Object::CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags)
-    : m_pDocument(pDocument), m_uFlags(uFlags) {}
-void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const {
-  wsName = XFA_GetElementByID(GetClassID())->pName;
-}
-uint32_t CXFA_Object::GetClassHashCode() const {
-  return XFA_GetElementByID(GetClassID())->uHash;
-}
-XFA_ELEMENT CXFA_Object::GetClassID() const {
-  if (IsNode()) {
-    return AsNode()->GetClassID();
-  }
-  if (IsOrdinaryObject()) {
-    return AsOrdinaryObject()->GetClassID();
-  }
-  if (IsNodeList()) {
-    return AsNodeList()->GetClassID();
-  }
-  if (IsOrdinaryList()) {
-    return XFA_ELEMENT_List;
-  }
-  ASSERT(FALSE);
-  return (XFA_ELEMENT)0;
-}
-void CXFA_Object::Script_ObjectClass_ClassName(FXJSE_HVALUE hValue,
-                                               FX_BOOL bSetting,
-                                               XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CFX_WideStringC className;
-    GetClassName(className);
-    FXJSE_Value_SetUTF8String(
-        hValue, FX_UTF8Encode(className.GetPtr(), className.GetLength()));
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Object::ThrowScriptErrorMessage(int32_t iStringID, ...) {
-  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
-  FXSYS_assert(pAppProvider);
-  CFX_WideString wsFormat;
-  pAppProvider->LoadString(iStringID, wsFormat);
-  CFX_WideString wsMessage;
-  va_list arg_ptr;
-  va_start(arg_ptr, iStringID);
-  wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr);
-  va_end(arg_ptr);
-  FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
-}
-
-static void XFA_DeleteWideString(void* pData) {
-  delete static_cast<CFX_WideString*>(pData);
-}
-
-static void XFA_CopyWideString(void*& pData) {
-  if (pData) {
-    CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData);
-    pData = pNewData;
-  }
-}
-static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {
-    XFA_DeleteWideString, XFA_CopyWideString};
-static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) {
-  return (XFA_OBJECTTYPE)XFA_GetElementByID(eElement)->eObjectType;
-}
-CXFA_Node::CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement)
-    : CXFA_Object(pDoc, XFA_GetElementObjectType(eElement)),
-      m_pNext(nullptr),
-      m_pChild(nullptr),
-      m_pLastChild(nullptr),
-      m_pParent(nullptr),
-      m_pXMLNode(nullptr),
-      m_eNodeClass(eElement),
-      m_ePacket(ePacket),
-      m_dwNameHash(0),
-      m_pAuxNode(nullptr),
-      m_pMapModuleData(nullptr) {
-  ASSERT(m_pDocument);
-}
-CXFA_Node::~CXFA_Node() {
-  FXSYS_assert(m_pParent == NULL);
-  RemoveMapModuleKey();
-  CXFA_Node *pNext, *pNode = m_pChild;
-  while (pNode) {
-    pNext = pNode->m_pNext;
-    pNode->m_pParent = NULL;
-    delete pNode;
-    pNode = pNext;
-  }
-  if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) {
-    m_pXMLNode->Release();
-  }
-}
-CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) {
-  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
-  CXFA_Node* pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass);
-  if (!pClone) {
-    return NULL;
-  }
-  MergeAllData(pClone);
-  pClone->UpdateNameHash();
-  if (IsNeedSavingXMLNode()) {
-    IFDE_XMLNode* pCloneXML = NULL;
-    if (IsAttributeInXML()) {
-      CFX_WideString wsName;
-      GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
-      IFDE_XMLElement* pCloneXMLElement = IFDE_XMLElement::Create(wsName);
-      CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value);
-      if (!wsValue.IsEmpty()) {
-        pCloneXMLElement->SetTextData(wsValue);
-      }
-      pCloneXML = pCloneXMLElement;
-      pCloneXMLElement = NULL;
-      pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
-    } else {
-      pCloneXML = m_pXMLNode->Clone(FALSE);
-    }
-    pClone->SetXMLMappingNode(pCloneXML);
-    pClone->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-  }
-  if (bRecursive) {
-    for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
-         pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pClone->InsertChild(pChild->Clone(bRecursive));
-    }
-  }
-  pClone->SetFlag(XFA_NODEFLAG_Initialized);
-  pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-  return pClone;
-}
-CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const {
-  switch (eItem) {
-    case XFA_NODEITEM_NextSibling:
-      return m_pNext;
-    case XFA_NODEITEM_FirstChild:
-      return m_pChild;
-    case XFA_NODEITEM_Parent:
-      return m_pParent;
-    case XFA_NODEITEM_PrevSibling:
-      if (m_pParent) {
-        CXFA_Node* pSibling = m_pParent->m_pChild;
-        CXFA_Node* pPrev = NULL;
-        while (pSibling && pSibling != this) {
-          pPrev = pSibling;
-          pSibling = pSibling->m_pNext;
-        }
-        return pPrev;
-      }
-      return NULL;
-    default:
-      break;
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem,
-                                  XFA_OBJECTTYPE eType) const {
-  CXFA_Node* pNode = NULL;
-  switch (eItem) {
-    case XFA_NODEITEM_NextSibling:
-      pNode = m_pNext;
-      if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
-          pNode = pNode->m_pNext;
-        }
-      }
-      break;
-    case XFA_NODEITEM_FirstChild:
-      pNode = m_pChild;
-      if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
-          pNode = pNode->m_pNext;
-        }
-      }
-      break;
-    case XFA_NODEITEM_Parent:
-      pNode = m_pParent;
-      if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
-          pNode = pNode->m_pParent;
-        }
-      }
-      break;
-    case XFA_NODEITEM_PrevSibling:
-      if (m_pParent) {
-        CXFA_Node* pSibling = m_pParent->m_pChild;
-        while (pSibling && pSibling != this) {
-          if (eType == XFA_OBJECTTYPEMASK ||
-              eType == pSibling->GetObjectType()) {
-            pNode = pSibling;
-          }
-          pSibling = pSibling->m_pNext;
-        }
-      }
-      break;
-    default:
-      break;
-  }
-  return pNode;
-}
-int32_t CXFA_Node::GetNodeList(CXFA_NodeArray& nodes,
-                               FX_DWORD dwTypeFilter,
-                               XFA_ELEMENT eElementFilter,
-                               int32_t iLevel) {
-  if (--iLevel < 0) {
-    return nodes.GetSize();
-  }
-  if (eElementFilter != XFA_ELEMENT_UNKNOWN) {
-    CXFA_Node* pChild = m_pChild;
-    while (pChild) {
-      if (pChild->GetClassID() == eElementFilter) {
-        nodes.Add(pChild);
-        if (iLevel > 0) {
-          GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
-        }
-      }
-      pChild = pChild->m_pNext;
-    }
-  } else if (dwTypeFilter ==
-             (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) {
-    CXFA_Node* pChild = m_pChild;
-    while (pChild) {
-      nodes.Add(pChild);
-      if (iLevel > 0) {
-        GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
-      }
-      pChild = pChild->m_pNext;
-    }
-  } else if (dwTypeFilter != 0) {
-    FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0;
-    FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0;
-    FX_BOOL bFilterOneOfProperties =
-        (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0;
-    CXFA_Node* pChild = m_pChild;
-    while (pChild) {
-      const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
-          GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-      if (pProperty) {
-        if (bFilterProperties) {
-          nodes.Add(pChild);
-        } else if (bFilterOneOfProperties &&
-                   (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
-          nodes.Add(pChild);
-        } else if (bFilterChildren &&
-                   (pChild->GetClassID() == XFA_ELEMENT_Variables ||
-                    pChild->GetClassID() == XFA_ELEMENT_PageSet)) {
-          nodes.Add(pChild);
-        }
-      } else {
-        if (bFilterChildren) {
-          nodes.Add(pChild);
-        }
-      }
-      pChild = pChild->m_pNext;
-    }
-    if (bFilterOneOfProperties && nodes.GetSize() < 1) {
-      int32_t iProperties = 0;
-      const XFA_PROPERTY* pProperty =
-          XFA_GetElementProperties(GetClassID(), iProperties);
-      if (pProperty == NULL || iProperties < 1) {
-        return 0;
-      }
-      for (int32_t i = 0; i < iProperties; i++) {
-        if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) {
-          IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
-          const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(GetPacketID());
-          CXFA_Node* pNewNode =
-              pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName);
-          if (!pNewNode) {
-            break;
-          }
-          InsertChild(pNewNode, NULL);
-          pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
-          nodes.Add(pNewNode);
-          break;
-        }
-      }
-    }
-  }
-  return nodes.GetSize();
-}
-CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement,
-                                           FX_DWORD dwFlags) {
-  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
-  CXFA_Node* pNode = pFactory->CreateNode(m_ePacket, eElement);
-  pNode->SetFlag(dwFlags);
-  return pNode;
-}
-CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) {
-  FXSYS_assert(m_ePacket == XFA_XDPPACKET_Template);
-  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
-  CXFA_Node* pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass);
-  if (!pClone) {
-    return NULL;
-  }
-  pClone->SetTemplateNode(this);
-  pClone->UpdateNameHash();
-  pClone->SetXMLMappingNode(GetXMLMappingNode());
-  if (bRecursive) {
-    for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
-         pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive));
-    }
-  }
-  pClone->SetFlag(XFA_NODEFLAG_Initialized);
-  return pClone;
-}
-
-CXFA_Node* CXFA_Node::GetTemplateNode() const {
-  return m_pAuxNode;
-}
-
-void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
-  m_pAuxNode = pTemplateNode;
-}
-CXFA_Node* CXFA_Node::GetBindData() {
-  ASSERT(GetPacketID() == XFA_XDPPACKET_Form);
-  return static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
-}
-int32_t CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) {
-  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
-    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
-    formItems.Copy(*pItems);
-    return formItems.GetSize();
-  }
-  CXFA_Node* pFormNode =
-      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
-  if (pFormNode) {
-    formItems.Add(pFormNode);
-  }
-  return formItems.GetSize();
-}
-
-static void XFA_DataNodeDeleteBindItem(void* pData) {
-  delete static_cast<CXFA_NodeArray*>(pData);
-}
-
-static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {
-    XFA_DataNodeDeleteBindItem, NULL};
-int32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
-  ASSERT(pFormNode);
-  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
-    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
-    ASSERT(pItems);
-    if (pItems->Find(pFormNode) < 0) {
-      pItems->Add(pFormNode);
-    }
-    return pItems->GetSize();
-  }
-  CXFA_Node* pOldFormItem =
-      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
-  if (!pOldFormItem) {
-    SetObject(XFA_ATTRIBUTE_BindingNode, pFormNode);
-    return 1;
-  } else if (pOldFormItem == pFormNode) {
-    return 1;
-  }
-  CXFA_NodeArray* pItems = new CXFA_NodeArray;
-  SetObject(XFA_ATTRIBUTE_BindingNode, pItems, &deleteBindItemCallBack);
-  pItems->Add(pOldFormItem);
-  pItems->Add(pFormNode);
-  m_uFlags |= XFA_NODEFLAG_BindFormItems;
-  return 2;
-}
-int32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
-  if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
-    TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
-    ASSERT(pItems);
-    int32_t iIndex = pItems->Find(pFormNode);
-    int32_t iCount = pItems->GetSize();
-    if (iIndex >= 0) {
-      if (iIndex != iCount - 1) {
-        pItems->SetAt(iIndex, pItems->GetAt(iCount - 1));
-      }
-      pItems->RemoveAt(iCount - 1);
-      if (iCount == 2) {
-        CXFA_Node* pLastFormNode = pItems->GetAt(0);
-        SetObject(XFA_ATTRIBUTE_BindingNode, pLastFormNode);
-        m_uFlags &= ~XFA_NODEFLAG_BindFormItems;
-      }
-      iCount--;
-    }
-    return iCount;
-  }
-  CXFA_Node* pOldFormItem =
-      static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
-  if (pOldFormItem == pFormNode) {
-    SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-    pOldFormItem = NULL;
-  }
-  return pOldFormItem == NULL ? 0 : 1;
-}
-FX_BOOL CXFA_Node::HasBindItem() {
-  return (GetPacketID() == XFA_XDPPACKET_Datasets) &&
-         GetObject(XFA_ATTRIBUTE_BindingNode) != NULL;
-}
-CXFA_WidgetData* CXFA_Node::GetWidgetData() {
-  return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData);
-}
-CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() {
-  if (GetPacketID() != XFA_XDPPACKET_Form) {
-    return NULL;
-  }
-  XFA_ELEMENT classID = GetClassID();
-  if (classID == XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
-  CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
-  if (classID == XFA_ELEMENT_Field) {
-    CXFA_WidgetData* pFieldWidgetData = GetWidgetData();
-    if (pFieldWidgetData &&
-        pFieldWidgetData->GetChoiceListOpen() ==
-            XFA_ATTRIBUTEENUM_MultiSelect) {
-      return NULL;
-    } else {
-      CFX_WideString wsPicture;
-      if (pFieldWidgetData) {
-        pFieldWidgetData->GetPictureContent(wsPicture,
-                                            XFA_VALUEPICTURE_DataBind);
-      }
-      if (!wsPicture.IsEmpty()) {
-        return pFieldWidgetData;
-      }
-      CXFA_Node* pDataNode = GetBindData();
-      if (!pDataNode) {
-        return NULL;
-      }
-      pFieldWidgetData = NULL;
-      CXFA_NodeArray formNodes;
-      pDataNode->GetBindItems(formNodes);
-      for (int32_t i = 0; i < formNodes.GetSize(); i++) {
-        CXFA_Node* pFormNode = formNodes.GetAt(i);
-        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-          continue;
-        }
-        pFieldWidgetData = pFormNode->GetWidgetData();
-        if (pFieldWidgetData) {
-          pFieldWidgetData->GetPictureContent(wsPicture,
-                                              XFA_VALUEPICTURE_DataBind);
-        }
-        if (!wsPicture.IsEmpty()) {
-          break;
-        }
-        pFieldWidgetData = NULL;
-      }
-      return pFieldWidgetData;
-    }
-  }
-  CXFA_Node* pGrandNode =
-      pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
-  CXFA_Node* pValueNode =
-      (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value)
-          ? pParentNode
-          : NULL;
-  if (!pValueNode) {
-    pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value)
-                     ? pGrandNode
-                     : NULL;
-  }
-  CXFA_Node* pParentOfValueNode =
-      pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
-  return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData()
-                            : NULL;
-}
-FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) {
-  CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode();
-  CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
-  FXSYS_assert(pTopSubform);
-  CXFA_Node* pLocaleNode = this;
-  FX_BOOL bLocale = FALSE;
-  do {
-    bLocale = pLocaleNode->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
-    if (!bLocale) {
-      pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent);
-    }
-  } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale);
-  if (bLocale) {
-    return bLocale;
-  }
-  CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
-  wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig);
-  if (!wsLocaleName.IsEmpty()) {
-    bLocale = TRUE;
-  }
-  if (bLocale) {
-    return bLocale;
-  }
-  if (pTopSubform) {
-    bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
-  }
-  if (bLocale) {
-    return bLocale;
-  }
-  IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale();
-  if (pLocale) {
-    wsLocaleName = pLocale->GetName();
-    bLocale = TRUE;
-  }
-  return bLocale;
-}
-XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() {
-  XFA_ELEMENT eElement = GetClassID();
-  CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep);
-  XFA_ATTRIBUTEENUM eLayoutType = GetEnum(XFA_ATTRIBUTE_Layout);
-  if (pKeep) {
-    XFA_ATTRIBUTEENUM eIntact;
-    if (pKeep->TryEnum(XFA_ATTRIBUTE_Intact, eIntact, FALSE)) {
-      if (eIntact == XFA_ATTRIBUTEENUM_None &&
-          eLayoutType == XFA_ATTRIBUTEENUM_Row &&
-          m_pDocument->GetCurVersionMode() < XFA_VERSION_208) {
-        CXFA_Node* pPreviewRow =
-            GetNodeItem(XFA_NODEITEM_PrevSibling, XFA_OBJECTTYPE_ContainerNode);
-        if (pPreviewRow &&
-            pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) ==
-                XFA_ATTRIBUTEENUM_Row) {
-          XFA_ATTRIBUTEENUM eValue;
-          if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) {
-            if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
-                eValue == XFA_ATTRIBUTEENUM_PageArea) {
-              return XFA_ATTRIBUTEENUM_ContentArea;
-            }
-          }
-          CXFA_Node* pKeep =
-              pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep);
-          if (pKeep) {
-            if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) {
-              if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
-                  eValue == XFA_ATTRIBUTEENUM_PageArea) {
-                return XFA_ATTRIBUTEENUM_ContentArea;
-              }
-            }
-          }
-        }
-      }
-      return eIntact;
-    }
-  }
-  switch (eElement) {
-    case XFA_ELEMENT_Subform:
-      switch (eLayoutType) {
-        case XFA_ATTRIBUTEENUM_Position:
-        case XFA_ATTRIBUTEENUM_Row:
-          return XFA_ATTRIBUTEENUM_ContentArea;
-        case XFA_ATTRIBUTEENUM_Tb:
-        case XFA_ATTRIBUTEENUM_Table:
-        case XFA_ATTRIBUTEENUM_Lr_tb:
-        case XFA_ATTRIBUTEENUM_Rl_tb:
-          return XFA_ATTRIBUTEENUM_None;
-        default:
-          break;
-      }
-      break;
-    case XFA_ELEMENT_Field: {
-      CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-      if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
-        return XFA_ATTRIBUTEENUM_ContentArea;
-      }
-      if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
-        XFA_ATTRIBUTEENUM eParLayout =
-            pParentNode->GetEnum(XFA_ATTRIBUTE_Layout);
-        if (eParLayout == XFA_ATTRIBUTEENUM_Position ||
-            eParLayout == XFA_ATTRIBUTEENUM_Row ||
-            eParLayout == XFA_ATTRIBUTEENUM_Table) {
-          return XFA_ATTRIBUTEENUM_None;
-        }
-        XFA_VERSION version = m_pDocument->GetCurVersionMode();
-        if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) {
-          CXFA_Measurement measureH;
-          if (TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) {
-            return XFA_ATTRIBUTEENUM_ContentArea;
-          }
-        }
-        return XFA_ATTRIBUTEENUM_None;
-      }
-      return XFA_ATTRIBUTEENUM_ContentArea;
-    }
-    case XFA_ELEMENT_Draw:
-      return XFA_ATTRIBUTEENUM_ContentArea;
-    default:
-      break;
-  }
-  return XFA_ATTRIBUTEENUM_None;
-}
-CXFA_Node* CXFA_Node::GetDataDescriptionNode() {
-  if (m_ePacket == XFA_XDPPACKET_Datasets) {
-    return m_pAuxNode;
-  }
-  return NULL;
-}
-void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
-  FXSYS_assert(m_ePacket == XFA_XDPPACKET_Datasets);
-  m_pAuxNode = pDataDescriptionNode;
-}
-void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNode");
-    return;
-  }
-  CFX_WideString wsExpression;
-  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-  wsExpression =
-      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  CXFA_Node* refNode = this;
-  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
-    refNode = ToNode(pScriptContext->GetThisObject());
-  }
-  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
-                    XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
-                    XFA_RESOLVENODE_Siblings;
-  XFA_RESOLVENODE_RS resoveNodeRS;
-  int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
-                                                resoveNodeRS, dwFlag);
-  if (iRet < 1) {
-    return FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  }
-  FXJSE_HVALUE hValue = NULL;
-  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    CXFA_Object* pNode = resoveNodeRS.nodes[0];
-    hValue = pScriptContext->GetJSValueFromMap(pNode);
-    FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
-  } else {
-    const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
-        resoveNodeRS.pScriptAttribute;
-    if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) {
-      hValue = FXJSE_Value_Create(pScriptContext->GetRuntime());
-      (resoveNodeRS.nodes[0]->*(lpAttributeInfo->lpfnCallback))(
-          hValue, FALSE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
-      FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
-      FXJSE_Value_Release(hValue);
-    } else {
-      FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    }
-  }
-}
-void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"resolveNodes");
-    return;
-  }
-  CFX_WideString wsExpression;
-  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-  wsExpression =
-      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (!hValue) {
-    return;
-  }
-  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
-                    XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
-                    XFA_RESOLVENODE_Siblings;
-  CXFA_Node* refNode = this;
-  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
-    refNode = ToNode(m_pDocument->GetScriptContext()->GetThisObject());
-  }
-  Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag, refNode);
-}
-void CXFA_Node::Script_Som_ResolveNodeList(FXJSE_HVALUE hValue,
-                                           CFX_WideString wsExpression,
-                                           FX_DWORD dwFlag,
-                                           CXFA_Node* refNode) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  XFA_RESOLVENODE_RS resoveNodeRS;
-  if (refNode == NULL) {
-    refNode = this;
-  }
-  pScriptContext->ResolveObjects(refNode, wsExpression, resoveNodeRS, dwFlag);
-  CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(m_pDocument);
-  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    for (int32_t i = 0; i < resoveNodeRS.nodes.GetSize(); i++) {
-      if (resoveNodeRS.nodes[i]->IsNode())
-        pNodeList->Append(resoveNodeRS.nodes[i]->AsNode());
-    }
-  } else {
-    CXFA_HVALUEArray hValueArray(pScriptContext->GetRuntime());
-    if (resoveNodeRS.GetAttributeResult(hValueArray) > 0) {
-      CXFA_ObjArray objectArray;
-      hValueArray.GetAttributeObject(objectArray);
-      for (int32_t i = 0; i < objectArray.GetSize(); i++) {
-        if (objectArray[i]->IsNode())
-          pNodeList->Append(objectArray[i]->AsNode());
-      }
-    }
-  }
-  FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
-                        pScriptContext->GetJseNormalClass());
-}
-void CXFA_Node::Script_TreeClass_All(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
-    CFX_WideString wsName;
-    GetAttribute(XFA_ATTRIBUTE_Name, wsName);
-    CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]");
-    Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
-  }
-}
-void CXFA_Node::Script_TreeClass_Nodes(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  if (bSetting) {
-    IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
-    FXSYS_assert(pAppProvider);
-    CFX_WideString wsMessage;
-    pAppProvider->LoadString(XFA_IDS_Unable_TO_SET, wsMessage);
-    FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
-  } else {
-    CXFA_AttachNodeList* pNodeList = new CXFA_AttachNodeList(m_pDocument, this);
-    FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
-                          pScriptContext->GetJseNormalClass());
-  }
-}
-void CXFA_Node::Script_TreeClass_ClassAll(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
-    CFX_WideStringC wsName;
-    GetClassName(wsName);
-    CFX_WideString wsExpression = FX_WSTRC(L"#") + wsName + FX_WSTRC(L"[*]");
-    Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
-  }
-}
-void CXFA_Node::Script_TreeClass_Parent(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
-    if (pParent) {
-      FXJSE_Value_Set(
-          hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent));
-    } else {
-      FXJSE_Value_SetNull(hValue);
-    }
-  }
-}
-void CXFA_Node::Script_TreeClass_Index(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FXJSE_Value_SetInteger(hValue, GetNodeSameNameIndex());
-  }
-}
-void CXFA_Node::Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FXJSE_Value_SetInteger(hValue, GetNodeSameClassIndex());
-  }
-}
-void CXFA_Node::Script_TreeClass_SomExpression(FXJSE_HVALUE hValue,
-                                               FX_BOOL bSetting,
-                                               XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CFX_WideString wsSOMExpression;
-    GetSOMExpression(wsSOMExpression);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsSOMExpression));
-  }
-}
-void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"applyXSL");
-    return;
-  }
-  CFX_WideString wsExpression;
-  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-  wsExpression =
-      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-}
-void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 3) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"assignNode");
-    return;
-  }
-  CFX_WideString wsExpression;
-  CFX_WideString wsValue;
-  int32_t iAction = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsValue = pArguments->GetUTF8String(1);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-  }
-  if (iLength >= 3) {
-    iAction = pArguments->GetInt32(2);
-  }
-}
-void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone");
-    return;
-  }
-  FX_BOOL bClone = TRUE;
-  bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
-  CXFA_Node* pCloneNode = Clone(bClone);
-  FXJSE_Value_Set(
-      pArguments->GetReturnValue(),
-      m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode));
-}
-void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"getAttribute");
-    return;
-  }
-  CFX_WideString wsExpression;
-  CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-  wsExpression =
-      CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  CFX_WideString wsValue;
-  GetAttribute(wsExpression, wsValue);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-  }
-}
-void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getElement");
-    return;
-  }
-  CFX_WideString wsExpression;
-  int32_t iValue = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  }
-  if (iLength >= 2) {
-    iValue = pArguments->GetInt32(1);
-  }
-  const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression);
-  CXFA_Node* pNode = GetProperty(iValue, pElementInfo->eName);
-  FXJSE_Value_Set(pArguments->GetReturnValue(),
-                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
-}
-void CXFA_Node::Script_NodeClass_IsPropertySpecified(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 3) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"isPropertySpecified");
-    return;
-  }
-  CFX_WideString wsExpression;
-  FX_BOOL bParent = TRUE;
-  int32_t iIndex = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  }
-  if (iLength >= 2) {
-    bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  if (iLength >= 3) {
-    iIndex = pArguments->GetInt32(2);
-  }
-  FX_BOOL bHas = FALSE;
-  const XFA_ATTRIBUTEINFO* pAttributeInfo =
-      XFA_GetAttributeByName(wsExpression);
-  CFX_WideString wsValue;
-  if (pAttributeInfo) {
-    bHas = HasAttribute(pAttributeInfo->eName);
-  }
-  if (!bHas) {
-    const XFA_ELEMENTINFO* pElementInfo = XFA_GetElementByName(wsExpression);
-    bHas = (GetProperty(iIndex, pElementInfo->eName) != NULL);
-  }
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, bHas);
-  }
-}
-void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 3) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"loadXML");
-    return;
-  }
-  CFX_WideString wsExpression;
-  FX_BOOL bIgnoreRoot = TRUE;
-  FX_BOOL bOverwrite = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-    if (wsExpression.IsEmpty()) {
-      return;
-    }
-  }
-  if (iLength >= 2) {
-    bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  if (iLength >= 3) {
-    bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
-  }
-  IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument);
-  if (!pParser) {
-    return;
-  }
-  IFDE_XMLNode* pXMLNode = NULL;
-  int32_t iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL);
-  if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) {
-    pParser->Release();
-    pParser = NULL;
-    return;
-  }
-  if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element ||
-                      XFA_RecognizeRichText((IFDE_XMLElement*)pXMLNode))) {
-    bIgnoreRoot = FALSE;
-  }
-  CXFA_Node* pFakeRoot = Clone(FALSE);
-  CFX_WideStringC wsContentType = GetCData(XFA_ATTRIBUTE_ContentType);
-  if (!wsContentType.IsEmpty()) {
-    pFakeRoot->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-  }
-  IFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode();
-  if (!pFakeXMLRoot) {
-    IFDE_XMLNode* pThisXMLRoot = GetXMLMappingNode();
-    pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL;
-  }
-  if (!pFakeXMLRoot) {
-    CFX_WideStringC wsClassName;
-    GetClassName(wsClassName);
-    pFakeXMLRoot = IFDE_XMLElement::Create(wsClassName);
-  }
-  if (bIgnoreRoot) {
-    IFDE_XMLNode* pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-    while (pXMLChild) {
-      IFDE_XMLNode* pXMLSibling =
-          pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling);
-      pXMLNode->RemoveChildNode(pXMLChild);
-      pFakeXMLRoot->InsertChildNode(pXMLChild);
-      pXMLChild = pXMLSibling;
-    }
-  } else {
-    IFDE_XMLNode* pXMLParent = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
-    if (pXMLParent) {
-      pXMLParent->RemoveChildNode(pXMLNode);
-    }
-    pFakeXMLRoot->InsertChildNode(pXMLNode);
-  }
-  pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot);
-  pFakeRoot = pParser->GetRootNode();
-  if (pFakeRoot) {
-    if (bOverwrite) {
-      CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild);
-      CXFA_Node* pNewChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-      int32_t index = 0;
-      while (pNewChild) {
-        CXFA_Node* pItem = pNewChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-        pFakeRoot->RemoveChild(pNewChild);
-        InsertChild(index++, pNewChild);
-        pNewChild->SetFlag(XFA_NODEFLAG_Initialized);
-        pNewChild = pItem;
-      }
-      while (pChild) {
-        CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-        RemoveChild(pChild);
-        pFakeRoot->InsertChild(pChild);
-        pChild = pItem;
-      }
-      if (GetPacketID() == XFA_XDPPACKET_Form &&
-          GetClassID() == XFA_ELEMENT_ExData) {
-        IFDE_XMLNode* pTempXMLNode = GetXMLMappingNode();
-        SetXMLMappingNode(pFakeXMLRoot);
-        SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-        if (pTempXMLNode &&
-            pTempXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL) {
-          pFakeXMLRoot = pTempXMLNode;
-        } else {
-          pFakeXMLRoot = NULL;
-        }
-      }
-      MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE);
-    } else {
-      CXFA_Node* pChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-      while (pChild) {
-        CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-        pFakeRoot->RemoveChild(pChild);
-        InsertChild(pChild);
-        pChild->SetFlag(XFA_NODEFLAG_Initialized);
-        pChild = pItem;
-      }
-    }
-    if (pFakeXMLRoot) {
-      pFakeRoot->SetXMLMappingNode(pFakeXMLRoot);
-      pFakeRoot->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-    }
-    pFakeRoot->SetFlag(XFA_NODEFLAG_HasRemoved, TRUE, FALSE);
-  } else {
-    if (pFakeXMLRoot) {
-      pFakeXMLRoot->Release();
-      pFakeXMLRoot = NULL;
-    }
-  }
-  pParser->Release();
-  pParser = NULL;
-}
-void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) {
-}
-
-void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 0 || iLength > 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML");
-    return;
-  }
-  FX_BOOL bPrettyMode = FALSE;
-  if (iLength == 1) {
-    CFX_ByteString bsPretty = pArguments->GetUTF8String(0);
-    if (!bsPretty.Equal("pretty")) {
-      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-      return;
-    }
-    bPrettyMode = TRUE;
-  }
-  CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-  if (GetPacketID() == XFA_XDPPACKET_Form) {
-    IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
-    IFX_Stream* pStream = IFX_Stream::CreateStream(
-        (IFX_FileWrite*)pMemoryStream,
-        FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
-    if (!pStream) {
-      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
-      pMemoryStream->Release();
-      pMemoryStream = NULL;
-      return;
-    }
-    pStream->SetCodePage(FX_CODEPAGE_UTF8);
-    pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
-    XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE);
-    FXJSE_Value_SetUTF8String(
-        pArguments->GetReturnValue(),
-        CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize()));
-    pStream->Release();
-    pStream = NULL;
-    if (pMemoryStream) {
-      pMemoryStream->Release();
-      pMemoryStream = NULL;
-    }
-    return;
-  }
-  if (GetPacketID() == XFA_XDPPACKET_Datasets) {
-    IFDE_XMLNode* pElement = GetXMLMappingNode();
-    if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
-      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
-      return;
-    }
-    XFA_DataExporter_DealWithDataGroupNode(this);
-    IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
-    IFX_Stream* pStream = IFX_Stream::CreateStream(
-        (IFX_FileWrite*)pMemoryStream,
-        FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
-    if (pStream) {
-      pStream->SetCodePage(FX_CODEPAGE_UTF8);
-      pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
-      pElement->SaveXMLNode(pStream);
-      FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
-                                CFX_ByteStringC(pMemoryStream->GetBuffer(),
-                                                pMemoryStream->GetSize()));
-      pStream->Release();
-      pStream = NULL;
-    }
-    if (pMemoryStream) {
-      pMemoryStream->Release();
-      pMemoryStream = NULL;
-    }
-    return;
-  }
-  FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
-}
-
-void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"setAttribute");
-    return;
-  }
-  CFX_WideString wsAttribute;
-  CFX_WideString wsAttributeValue;
-  CFX_ByteString bsAttributeValue = pArguments->GetUTF8String(0);
-  CFX_ByteString bsAttribute = pArguments->GetUTF8String(1);
-  wsAttributeValue =
-      CFX_WideString::FromUTF8(bsAttributeValue, bsAttributeValue.GetLength());
-  wsAttribute = CFX_WideString::FromUTF8(bsAttribute, bsAttribute.GetLength());
-  SetAttribute(wsAttribute, wsAttributeValue, TRUE);
-}
-void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1 && iLength != 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setElement");
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  CFX_WideString wsName;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsName = pArguments->GetUTF8String(1);
-    wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
-  }
-}
-void CXFA_Node::Script_NodeClass_Ns(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CFX_WideString wsNameSpace;
-    TryNamespace(wsNameSpace);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsNameSpace));
-  }
-}
-void CXFA_Node::Script_NodeClass_Model(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(
-                                GetModelNode()));
-  }
-}
-void CXFA_Node::Script_NodeClass_IsContainer(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FXJSE_Value_SetBoolean(hValue, IsContainerNode());
-  }
-}
-void CXFA_Node::Script_NodeClass_IsNull(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    if (GetClassID() == XFA_ELEMENT_Subform) {
-      FXJSE_Value_SetBoolean(hValue, FALSE);
-      return;
-    }
-    CFX_WideString strValue;
-    FXJSE_Value_SetBoolean(hValue, !TryContent(strValue) || strValue.IsEmpty());
-  }
-}
-void CXFA_Node::Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CXFA_NodeArray properts;
-    int32_t iSize = GetNodeList(properts, XFA_NODEFILTER_OneOfProperty);
-    if (iSize > 0) {
-      FXJSE_Value_Set(
-          hValue,
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0]));
-    }
-  }
-}
-void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {}
-void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) {
-  CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
-  FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
-                        m_pDocument->GetScriptContext()->GetJseNormalClass());
-}
-void CXFA_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) {
-}
-void CXFA_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) {
-  Script_Template_CreateNode(pArguments);
-}
-void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"isCompatibleNS");
-    return;
-  }
-  CFX_WideString wsNameSpace;
-  if (iLength >= 1) {
-    CFX_ByteString bsNameSpace = pArguments->GetUTF8String(0);
-    wsNameSpace =
-        CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
-  }
-  CFX_WideString wsNodeNameSpace;
-  TryNamespace(wsNodeNameSpace);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, wsNodeNameSpace.Equal(wsNameSpace));
-  }
-}
-void CXFA_Node::Script_ModelClass_Context(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_ModelClass_AliasNode(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Attribute_Integer(FXJSE_HVALUE hValue,
-                                         FX_BOOL bSetting,
-                                         XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    SetInteger(eAttribute, FXJSE_Value_ToInteger(hValue), TRUE);
-  } else {
-    FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
-  }
-}
-void CXFA_Node::Script_Attribute_IntegerRead(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_Attribute_BOOL(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    SetBoolean(eAttribute, FXJSE_Value_ToBoolean(hValue), TRUE);
-  } else {
-    FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
-  }
-}
-void CXFA_Node::Script_Attribute_BOOLRead(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_Attribute_SendAttributeChangeMessage(
-    void* eAttribute,
-    void* eValue,
-    FX_BOOL bScriptModify) {
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (!pLayoutPro) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  FX_DWORD dwPacket = GetPacketID();
-  if (dwPacket & XFA_XDPPACKET_Form) {
-    FX_BOOL bNeedFindContainer = FALSE;
-    XFA_ELEMENT eType = GetClassID();
-    switch (eType) {
-      case XFA_ELEMENT_Caption:
-        bNeedFindContainer = TRUE;
-        pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                             eValue, this, GetNodeItem(XFA_NODEITEM_Parent));
-        break;
-      case XFA_ELEMENT_Font:
-      case XFA_ELEMENT_Para: {
-        bNeedFindContainer = TRUE;
-        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-        if (pParentNode->GetClassID() == XFA_ELEMENT_Caption) {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, pParentNode,
-                               pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
-        } else {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, this, pParentNode);
-        }
-      } break;
-      case XFA_ELEMENT_Margin: {
-        bNeedFindContainer = TRUE;
-        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-        XFA_ELEMENT eParentType = pParentNode->GetClassID();
-        if (pParentNode->IsContainerNode()) {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, this, pParentNode);
-        } else if (eParentType == XFA_ELEMENT_Caption) {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, pParentNode,
-                               pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
-        } else {
-          CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
-          if (pNode && pNode->GetClassID() == XFA_ELEMENT_Ui) {
-            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                                 eValue, pNode,
-                                 pNode->GetNodeItem(XFA_NODEITEM_Parent));
-          }
-        }
-      } break;
-      case XFA_ELEMENT_Comb: {
-        CXFA_Node* pEditNode = GetNodeItem(XFA_NODEITEM_Parent);
-        XFA_ELEMENT eUIType = pEditNode->GetClassID();
-        if (pEditNode && (eUIType == XFA_ELEMENT_DateTimeEdit ||
-                          eUIType == XFA_ELEMENT_NumericEdit ||
-                          eUIType == XFA_ELEMENT_TextEdit)) {
-          CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent);
-          if (pUINode) {
-            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                                 eValue, pUINode,
-                                 pUINode->GetNodeItem(XFA_NODEITEM_Parent));
-          }
-        }
-      } break;
-      case XFA_ELEMENT_Button:
-      case XFA_ELEMENT_Barcode:
-      case XFA_ELEMENT_ChoiceList:
-      case XFA_ELEMENT_DateTimeEdit:
-      case XFA_ELEMENT_NumericEdit:
-      case XFA_ELEMENT_PasswordEdit:
-      case XFA_ELEMENT_TextEdit: {
-        CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent);
-        if (pUINode) {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, pUINode,
-                               pUINode->GetNodeItem(XFA_NODEITEM_Parent));
-        }
-      } break;
-      case XFA_ELEMENT_CheckButton: {
-        bNeedFindContainer = TRUE;
-        CXFA_Node* pUINode = GetNodeItem(XFA_NODEITEM_Parent);
-        if (pUINode) {
-          pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                               eValue, pUINode,
-                               pUINode->GetNodeItem(XFA_NODEITEM_Parent));
-        }
-      } break;
-      case XFA_ELEMENT_Keep:
-      case XFA_ELEMENT_Bookend:
-      case XFA_ELEMENT_Break:
-      case XFA_ELEMENT_BreakAfter:
-      case XFA_ELEMENT_BreakBefore:
-      case XFA_ELEMENT_Overflow:
-        bNeedFindContainer = TRUE;
-        break;
-      case XFA_ELEMENT_Area:
-      case XFA_ELEMENT_Draw:
-      case XFA_ELEMENT_ExclGroup:
-      case XFA_ELEMENT_Field:
-      case XFA_ELEMENT_Subform:
-      case XFA_ELEMENT_SubformSet:
-        pLayoutPro->AddChangedContainer(this);
-        pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                             eValue, this, this);
-        break;
-      case XFA_ELEMENT_Sharptext:
-      case XFA_ELEMENT_Sharpxml:
-      case XFA_ELEMENT_SharpxHTML: {
-        CXFA_Node* pTextNode = GetNodeItem(XFA_NODEITEM_Parent);
-        if (!pTextNode) {
-          return;
-        }
-        CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent);
-        if (!pValueNode) {
-          return;
-        }
-        XFA_ELEMENT eType = pValueNode->GetClassID();
-        if (eType == XFA_ELEMENT_Value) {
-          bNeedFindContainer = TRUE;
-          CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
-          if (pNode && pNode->IsContainerNode()) {
-            if (bScriptModify) {
-              pValueNode = pNode;
-            }
-            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                                 eValue, pValueNode, pNode);
-          } else {
-            pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                                 eValue, pNode,
-                                 pNode->GetNodeItem(XFA_NODEITEM_Parent));
-          }
-        } else {
-          if (eType == XFA_ELEMENT_Items) {
-            CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
-            if (pNode && pNode->IsContainerNode()) {
-              pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
-                                   eValue, pValueNode, pNode);
-            }
-          }
-        }
-      } break;
-      default:
-        break;
-    }
-    if (bNeedFindContainer) {
-      CXFA_Node* pParent = this;
-      while (pParent) {
-        if (pParent->IsContainerNode()) {
-          break;
-        }
-        pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
-      }
-      if (pParent) {
-        pLayoutPro->AddChangedContainer(pParent);
-      }
-    }
-  } else {
-    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue,
-                         this, this);
-  }
-}
-void CXFA_Node::Script_Attribute_String(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    CFX_ByteString szValue;
-    FXJSE_Value_ToUTF8String(hValue, szValue);
-    CFX_WideString wsValue =
-        CFX_WideString::FromUTF8(szValue, szValue.GetLength());
-    SetAttribute(eAttribute, wsValue, TRUE);
-    if (eAttribute == XFA_ATTRIBUTE_Use && GetClassID() == XFA_ELEMENT_Desc) {
-      CFX_WideString wsUseVal = wsValue, wsID, wsSOM;
-      CXFA_Node* pTemplateNode =
-          ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
-      CXFA_Node* pProtoRoot =
-          pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Subform)
-              ->GetFirstChildByClass(XFA_ELEMENT_Proto);
-      if (!wsUseVal.IsEmpty()) {
-        if (wsUseVal[0] == '#') {
-          wsID = CFX_WideString((const FX_WCHAR*)wsUseVal + 1,
-                                wsUseVal.GetLength() - 1);
-        } else {
-          wsSOM =
-              CFX_WideString((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength());
-        }
-      }
-      CXFA_Node* pProtoNode = NULL;
-      if (!wsSOM.IsEmpty()) {
-        FX_DWORD dwFlag = XFA_RESOLVENODE_Children |
-                          XFA_RESOLVENODE_Attributes |
-                          XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
-                          XFA_RESOLVENODE_Siblings;
-        XFA_RESOLVENODE_RS resoveNodeRS;
-        int32_t iRet = m_pDocument->GetScriptContext()->ResolveObjects(
-            pProtoRoot, wsSOM, resoveNodeRS, dwFlag);
-        if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) {
-          pProtoNode = resoveNodeRS.nodes[0]->AsNode();
-        }
-      } else if (!wsID.IsEmpty()) {
-        pProtoNode = m_pDocument->GetNodeByID(pProtoRoot, wsID);
-      }
-      if (pProtoNode) {
-        CXFA_Node* pHeadChild = GetNodeItem(XFA_NODEITEM_FirstChild);
-        while (pHeadChild) {
-          CXFA_Node* pSibling =
-              pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-          RemoveChild(pHeadChild);
-          pHeadChild = pSibling;
-        }
-        CXFA_Node* pProtoForm = pProtoNode->CloneTemplateToForm(TRUE);
-        pHeadChild = pProtoForm->GetNodeItem(XFA_NODEITEM_FirstChild);
-        while (pHeadChild) {
-          CXFA_Node* pSibling =
-              pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-          pProtoForm->RemoveChild(pHeadChild);
-          InsertChild(pHeadChild);
-          pHeadChild = pSibling;
-        }
-        m_pDocument->RemovePurgeNode(pProtoForm);
-        delete pProtoForm;
-      }
-    }
-  } else {
-    CFX_WideString wsValue;
-    GetAttribute(eAttribute, wsValue);
-    FXJSE_Value_SetUTF8String(hValue,
-                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
-  }
-}
-void CXFA_Node::Script_Attribute_StringRead(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CFX_WideString wsValue;
-    GetAttribute(eAttribute, wsValue);
-    FXJSE_Value_SetUTF8String(hValue,
-                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execute");
-  }
-}
-void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"restore");
-  }
-}
-void CXFA_Node::Script_Delta_CurrentValue(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Delta_SavedValue(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Delta_Target(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Som_Message(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_SOM_MESSAGETYPE iMessageType) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  FX_BOOL bNew = FALSE;
-  CXFA_Validate validate = pWidgetData->GetValidate();
-  if (!validate) {
-    validate = pWidgetData->GetValidate(TRUE);
-    bNew = TRUE;
-  }
-  if (bSetting) {
-    CFX_ByteString bsMessage;
-    FXJSE_Value_ToUTF8String(hValue, bsMessage);
-    switch (iMessageType) {
-      case XFA_SOM_ValidationMessage:
-        validate.SetScriptMessageText(
-            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
-        break;
-      case XFA_SOM_FormatMessage:
-        validate.SetFormatMessageText(
-            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
-        break;
-      case XFA_SOM_MandatoryMessage:
-        validate.SetNullMessageText(
-            CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
-        break;
-      default:
-        break;
-    }
-    if (!bNew) {
-      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-      if (!pNotify) {
-        return;
-      }
-      pNotify->AddCalcValidate(this);
-    }
-  } else {
-    CFX_WideString wsMessage;
-    switch (iMessageType) {
-      case XFA_SOM_ValidationMessage:
-        validate.GetScriptMessageText(wsMessage);
-        break;
-      case XFA_SOM_FormatMessage:
-        validate.GetFormatMessageText(wsMessage);
-        break;
-      case XFA_SOM_MandatoryMessage:
-        validate.GetNullMessageText(wsMessage);
-        break;
-      default:
-        break;
-    }
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsMessage));
-  }
-}
-void CXFA_Node::Script_Som_ValidationMessage(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute) {
-  Script_Som_Message(hValue, bSetting, XFA_SOM_ValidationMessage);
-}
-void CXFA_Node::Script_Field_Length(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetInteger(hValue, 0);
-      return;
-    }
-    FXJSE_Value_SetInteger(hValue, pWidgetData->CountChoiceListItems(TRUE));
-  }
-}
-void CXFA_Node::Script_Som_DefaultValue(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {
-  XFA_ELEMENT classID = GetClassID();
-  if (classID == XFA_ELEMENT_Field) {
-    Script_Field_DefaultValue(hValue, bSetting, eAttribute);
-    return;
-  } else if (classID == XFA_ELEMENT_Draw) {
-    Script_Draw_DefaultValue(hValue, bSetting, eAttribute);
-    return;
-  } else if (classID == XFA_ELEMENT_Boolean) {
-    Script_Boolean_Value(hValue, bSetting, eAttribute);
-    return;
-  }
-  if (bSetting) {
-    CFX_ByteString newValue;
-    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
-      FXJSE_Value_ToUTF8String(hValue, newValue);
-    }
-    CFX_WideString wsNewValue =
-        CFX_WideString::FromUTF8(newValue, newValue.GetLength());
-    CFX_WideString wsFormatValue(wsNewValue);
-    CXFA_WidgetData* pContainerWidgetData = NULL;
-    if (GetPacketID() == XFA_XDPPACKET_Datasets) {
-      CXFA_NodeArray formNodes;
-      GetBindItems(formNodes);
-      CFX_WideString wsPicture;
-      for (int32_t i = 0; i < formNodes.GetSize(); i++) {
-        CXFA_Node* pFormNode = formNodes.GetAt(i);
-        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
-          continue;
-        }
-        pContainerWidgetData = pFormNode->GetContainerWidgetData();
-        if (pContainerWidgetData) {
-          pContainerWidgetData->GetPictureContent(wsPicture,
-                                                  XFA_VALUEPICTURE_DataBind);
-        }
-        if (!wsPicture.IsEmpty()) {
-          break;
-        }
-        pContainerWidgetData = NULL;
-      }
-    } else if (GetPacketID() == XFA_XDPPACKET_Form) {
-      pContainerWidgetData = GetContainerWidgetData();
-    }
-    if (pContainerWidgetData) {
-      pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
-    }
-    SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
-  } else {
-    CFX_WideString content = GetScriptContent(TRUE);
-    if (content.IsEmpty() && classID != XFA_ELEMENT_Text &&
-        classID != XFA_ELEMENT_SubmitUrl) {
-      FXJSE_Value_SetNull(hValue);
-    } else if (classID == XFA_ELEMENT_Integer) {
-      FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
-    } else if (classID == XFA_ELEMENT_Float || classID == XFA_ELEMENT_Decimal) {
-      CFX_Decimal decimal(content);
-      FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
-    } else {
-      FXJSE_Value_SetUTF8String(hValue,
-                                FX_UTF8Encode(content, content.GetLength()));
-    }
-  }
-}
-void CXFA_Node::Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CFX_WideString content = GetScriptContent(TRUE);
-  if (content.IsEmpty()) {
-    FXJSE_Value_SetNull(hValue);
-  } else {
-    FXJSE_Value_SetUTF8String(hValue,
-                              FX_UTF8Encode(content, content.GetLength()));
-  }
-}
-void CXFA_Node::Script_Boolean_Value(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    CFX_ByteString newValue;
-    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
-      FXJSE_Value_ToUTF8String(hValue, newValue);
-    }
-    int32_t iValue = FXSYS_atoi(newValue);
-    CFX_WideString wsNewValue = (iValue == 0) ? FX_WSTRC(L"0") : FX_WSTRC(L"1");
-    CFX_WideString wsFormatValue(wsNewValue);
-    CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
-    if (pContainerWidgetData) {
-      pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
-    }
-    SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
-  } else {
-    CFX_WideString wsValue = GetScriptContent(TRUE);
-    FXJSE_Value_SetBoolean(hValue, wsValue.Equal(FX_WSTRC(L"1")));
-  }
-}
-struct XFA_ExecEventParaInfo {
- public:
-  uint32_t m_uHash;
-  const FX_WCHAR* m_lpcEventName;
-  XFA_EVENTTYPE m_eventType;
-  uint32_t m_validFlags;
-};
-static const XFA_ExecEventParaInfo gs_eventParaInfos[] = {
-    {0x02a6c55a, L"postSubmit", XFA_EVENT_PostSubmit, 0},
-    {0x0ab466bb, L"preSubmit", XFA_EVENT_PreSubmit, 0},
-    {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, 5},
-    {0x17fad373, L"postPrint", XFA_EVENT_PostPrint, 0},
-    {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, 7},
-    {0x2196a452, L"initialize", XFA_EVENT_Initialize, 1},
-    {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, 5},
-    {0x33c43dec, L"docClose", XFA_EVENT_DocClose, 0},
-    {0x361fa1b6, L"preSave", XFA_EVENT_PreSave, 0},
-    {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, 6},
-    {0x4731d6ba, L"exit", XFA_EVENT_Exit, 2},
-    {0x56bf456b, L"docReady", XFA_EVENT_DocReady, 0},
-    {0x7233018a, L"validate", XFA_EVENT_Validate, 1},
-    {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, 3},
-    {0x891f4606, L"change", XFA_EVENT_Change, 4},
-    {0x9528a7b4, L"prePrint", XFA_EVENT_PrePrint, 0},
-    {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, 5},
-    {0xcdce56b3, L"full", XFA_EVENT_Full, 4},
-    {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, 5},
-    {0xd95657a6, L"click", XFA_EVENT_Click, 4},
-    {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, 1},
-    {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, 7},
-    {0xe28dce7e, L"enter", XFA_EVENT_Enter, 2},
-    {0xfc82d695, L"postSave", XFA_EVENT_PostSave, 0},
-    {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, 6},
-};
-const XFA_ExecEventParaInfo* GetEventParaInfoByName(
-    const CFX_WideStringC& wsEventName) {
-  int32_t iLength = wsEventName.GetLength();
-  uint32_t uHash = FX_HashCode_String_GetW(wsEventName.GetPtr(), iLength);
-  const XFA_ExecEventParaInfo* eventParaInfo = NULL;
-  int32_t iStart = 0,
-          iEnd = (sizeof(gs_eventParaInfos) / sizeof(gs_eventParaInfos[0])) - 1;
-  int32_t iMid = (iStart + iEnd) / 2;
-  do {
-    iMid = (iStart + iEnd) / 2;
-    eventParaInfo = &gs_eventParaInfos[iMid];
-    if (uHash == eventParaInfo->m_uHash) {
-      return eventParaInfo;
-    } else if (uHash < eventParaInfo->m_uHash) {
-      iEnd = iMid - 1;
-    } else {
-      iStart = iMid + 1;
-    }
-  } while (iStart <= iEnd);
-  return NULL;
-}
-void XFA_STRING_TO_RGB(CFX_WideString& strRGB,
-                       int32_t& r,
-                       int32_t& g,
-                       int32_t& b) {
-  r = 0;
-  g = 0;
-  b = 0;
-  FX_WCHAR zero = '0';
-  int32_t iIndex = 0;
-  int32_t iLen = strRGB.GetLength();
-  for (int32_t i = 0; i < iLen; ++i) {
-    FX_WCHAR ch = strRGB.GetAt(i);
-    if (ch == L',') {
-      ++iIndex;
-    }
-    if (iIndex > 2) {
-      break;
-    }
-    int32_t iValue = ch - zero;
-    if (iValue >= 0 && iValue <= 9) {
-      switch (iIndex) {
-        case 0:
-          r = r * 10 + iValue;
-          break;
-        case 1:
-          g = g * 10 + iValue;
-          break;
-        default:
-          b = b * 10 + iValue;
-          break;
-      }
-    }
-  }
-}
-void CXFA_Node::Script_Som_BorderColor(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CXFA_Border border = pWidgetData->GetBorder(TRUE);
-  int32_t iSize = border.CountEdges();
-  CFX_WideString strColor;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    strColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    int32_t r = 0, g = 0, b = 0;
-    XFA_STRING_TO_RGB(strColor, r, g, b);
-    FX_ARGB rgb = ArgbEncode(100, r, g, b);
-    for (int32_t i = 0; i < iSize; ++i) {
-      CXFA_Edge edge = border.GetEdge(i);
-      edge.SetColor(rgb);
-    }
-  } else {
-    CXFA_Edge edge = border.GetEdge(0);
-    FX_ARGB color = edge.GetColor();
-    int32_t a, r, g, b;
-    ArgbDecode(color, a, r, g, b);
-    strColor.Format(L"%d,%d,%d", r, g, b);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(strColor));
-  }
-}
-void CXFA_Node::Script_Som_BorderWidth(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CXFA_Border border = pWidgetData->GetBorder(TRUE);
-  int32_t iSize = border.CountEdges();
-  CFX_WideString wsThickness;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsThickness = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    for (int32_t i = 0; i < iSize; ++i) {
-      CXFA_Edge edge = border.GetEdge(i);
-      CXFA_Measurement thickness(wsThickness);
-      edge.SetMSThickness(thickness);
-    }
-  } else {
-    CXFA_Edge edge = border.GetEdge(0);
-    CXFA_Measurement thickness = edge.GetMSThickness();
-    thickness.ToString(wsThickness);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsThickness));
-  }
-}
-void CXFA_Node::Script_Som_FillColor(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CXFA_Border border = pWidgetData->GetBorder(TRUE);
-  CXFA_Fill borderfill = border.GetFill(TRUE);
-  CXFA_Node* pNode = borderfill.GetNode();
-  if (!pNode) {
-    return;
-  }
-  CFX_WideString wsColor;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    int32_t r, g, b;
-    XFA_STRING_TO_RGB(wsColor, r, g, b);
-    FX_ARGB color = ArgbEncode(0xff, r, g, b);
-    borderfill.SetColor(color);
-  } else {
-    FX_ARGB color = borderfill.GetColor();
-    int32_t a, r, g, b;
-    ArgbDecode(color, a, r, g, b);
-    wsColor.Format(L"%d,%d,%d", r, g, b);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
-  }
-}
-void CXFA_Node::Script_Som_DataNode(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CXFA_Node* pDataNode = GetBindData();
-    if (pDataNode) {
-      FXJSE_Value_Set(
-          hValue,
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode));
-    } else {
-      FXJSE_Value_SetNull(hValue);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_Draw_DefaultValue(FXJSE_HVALUE hValue,
-                                         FX_BOOL bSetting,
-                                         XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    if (FXJSE_Value_IsUTF8String(hValue)) {
-      CXFA_WidgetData* pWidgetData = GetWidgetData();
-      FXSYS_assert(pWidgetData);
-      XFA_ELEMENT uiType = pWidgetData->GetUIType();
-      if (uiType == XFA_ELEMENT_Text) {
-        CFX_ByteString newValue;
-        FXJSE_Value_ToUTF8String(hValue, newValue);
-        CFX_WideString wsNewValue =
-            CFX_WideString::FromUTF8(newValue, newValue.GetLength());
-        CFX_WideString wsFormatValue(wsNewValue);
-        SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
-      } else if (uiType != XFA_ELEMENT_Image) {
-      }
-    }
-  } else {
-    CFX_WideString content = GetScriptContent(TRUE);
-    if (content.IsEmpty()) {
-      FXJSE_Value_SetNull(hValue);
-    } else {
-      FXJSE_Value_SetUTF8String(hValue,
-                                FX_UTF8Encode(content, content.GetLength()));
-    }
-  }
-}
-void CXFA_Node::Script_Field_DefaultValue(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  if (bSetting) {
-    if (FXJSE_Value_IsNull(hValue)) {
-      pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
-      pWidgetData->m_bIsNull = TRUE;
-    } else {
-      pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
-      pWidgetData->m_bIsNull = FALSE;
-    }
-    CFX_ByteString newValue;
-    if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
-      FXJSE_Value_ToUTF8String(hValue, newValue);
-    }
-    CFX_WideString wsNewText =
-        CFX_WideString::FromUTF8(newValue, newValue.GetLength());
-    CXFA_Node* pUIChild = pWidgetData->GetUIChild();
-    if (pUIChild->GetClassID() == XFA_ELEMENT_NumericEdit) {
-      int32_t iLeadDigits = 0;
-      int32_t iFracDigits = 0;
-      pWidgetData->GetLeadDigits(iLeadDigits);
-      pWidgetData->GetFracDigits(iFracDigits);
-      wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
-    }
-    CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
-    CFX_WideString wsFormatText(wsNewText);
-    if (pContainerWidgetData) {
-      pContainerWidgetData->GetFormatDataValue(wsNewText, wsFormatText);
-    }
-    SetScriptContent(wsNewText, wsFormatText, TRUE, TRUE);
-  } else {
-    CFX_WideString content = GetScriptContent(TRUE);
-    if (content.IsEmpty()) {
-      FXJSE_Value_SetNull(hValue);
-    } else {
-      CXFA_Node* pUIChild = pWidgetData->GetUIChild();
-      XFA_ELEMENT eUI = pUIChild->GetClassID();
-      CXFA_Value defVal = pWidgetData->GetFormValue();
-      CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (pNode && pNode->GetClassID() == XFA_ELEMENT_Decimal) {
-        if (eUI == XFA_ELEMENT_NumericEdit &&
-            (pNode->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) {
-          FXJSE_Value_SetUTF8String(
-              hValue, FX_UTF8Encode(content, content.GetLength()));
-        } else {
-          CFX_Decimal decimal(content);
-          FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
-        }
-      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Integer) {
-        FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
-      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Boolean) {
-        FXJSE_Value_SetBoolean(hValue, FXSYS_wtoi(content) == 0 ? FALSE : TRUE);
-      } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Float) {
-        CFX_Decimal decimal(content);
-        FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
-      } else {
-        FXJSE_Value_SetUTF8String(hValue,
-                                  FX_UTF8Encode(content, content.GetLength()));
-      }
-    }
-  }
-}
-void CXFA_Node::Script_Field_EditValue(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CFX_WideString wsValue;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Edit);
-  } else {
-    pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Edit);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-  }
-}
-void CXFA_Node::Script_Som_FontColor(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CXFA_Font font = pWidgetData->GetFont(TRUE);
-  CXFA_Node* pNode = font.GetNode();
-  if (!pNode) {
-    return;
-  }
-  CFX_WideString wsColor;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    int32_t r, g, b;
-    XFA_STRING_TO_RGB(wsColor, r, g, b);
-    FX_ARGB color = ArgbEncode(0xff, r, g, b);
-    font.SetColor(color);
-  } else {
-    FX_ARGB color = font.GetColor();
-    int32_t a, r, g, b;
-    ArgbDecode(color, a, r, g, b);
-    wsColor.Format(L"%d,%d,%d", r, g, b);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
-  }
-}
-void CXFA_Node::Script_Field_FormatMessage(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  Script_Som_Message(hValue, bSetting, XFA_SOM_FormatMessage);
-}
-void CXFA_Node::Script_Field_FormattedValue(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CFX_WideString wsValue;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Display);
-  } else {
-    pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Display);
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-  }
-}
-void CXFA_Node::Script_Som_Mandatory(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CXFA_Validate validate = pWidgetData->GetValidate(TRUE);
-  CFX_WideString wsValue;
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-    validate.SetNullTest(wsValue);
-  } else {
-    int32_t iValue = validate.GetNullTest();
-    const XFA_ATTRIBUTEENUMINFO* pInfo =
-        XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)iValue);
-    if (pInfo) {
-      wsValue = pInfo->pName;
-    }
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-  }
-}
-void CXFA_Node::Script_Som_MandatoryMessage(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  Script_Som_Message(hValue, bSetting, XFA_SOM_MandatoryMessage);
-}
-void CXFA_Node::Script_Field_ParentSubform(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    FXJSE_Value_SetNull(hValue);
-  }
-}
-void CXFA_Node::Script_Field_SelectedIndex(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  if (bSetting) {
-    int32_t iIndex = FXJSE_Value_ToInteger(hValue);
-    if (iIndex == -1) {
-      pWidgetData->ClearAllSelections();
-      return;
-    }
-    pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
-  } else {
-    FXJSE_Value_SetInteger(hValue, pWidgetData->GetSelectedItem());
-  }
-}
-void CXFA_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  pWidgetData->DeleteItem(-1, TRUE);
-}
-void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    int32_t iRet = execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
-        XFA_ELEMENT_Field);
-    if (eventString == "validate") {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
-                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
-  }
-}
-void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, FALSE, FALSE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execInitialize");
-  }
-}
-void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"deleteItem");
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  FX_BOOL bValue = pWidgetData->DeleteItem(iIndex, TRUE, TRUE);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, bValue);
-  }
-}
-void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getSaveItem");
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  if (iIndex < 0) {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    return;
-  }
-  CFX_WideString wsValue;
-  FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, TRUE);
-  if (bHasItem) {
-    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
-                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
-  } else {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  }
-}
-void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"boundItem");
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CFX_ByteString bsValue = pArguments->GetUTF8String(0);
-  CFX_WideString wsValue =
-      CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-  CFX_WideString wsBoundValue;
-  pWidgetData->GetItemValue(wsValue, wsBoundValue);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsBoundValue));
-  }
-}
-void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"getItemState");
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  FX_BOOL bValue = pWidgetData->GetItemState(iIndex);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, bValue);
-  }
-}
-void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, FALSE, FALSE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execCalculate");
-  }
-}
-void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {}
-void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"getDisplayItem");
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  if (iIndex < 0) {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    return;
-  }
-  CFX_WideString wsValue;
-  FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, FALSE);
-  if (bHasItem) {
-    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
-                              FX_UTF8Encode(wsValue, wsValue.GetLength()));
-  } else {
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  }
-}
-void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"setItemState");
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  if (pArguments->GetInt32(1) != 0) {
-    pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
-  } else {
-    if (pWidgetData->GetItemState(iIndex)) {
-      pWidgetData->SetItemState(iIndex, FALSE, TRUE, TRUE);
-    }
-  }
-}
-void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addItem");
-    return;
-  }
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  CFX_WideString wsLabel;
-  CFX_WideString wsValue;
-  if (iLength >= 1) {
-    CFX_ByteString bsLable = pArguments->GetUTF8String(0);
-    wsLabel = CFX_WideString::FromUTF8(bsLable, bsLable.GetLength());
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsValue = pArguments->GetUTF8String(1);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-  }
-  pWidgetData->InsertItem(wsLabel, wsValue, -1, TRUE);
-}
-void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      int32_t iRet =
-          pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, FALSE, FALSE);
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
-                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execValidate");
-  }
-}
-void CXFA_Node::Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue,
-                                                    FX_BOOL bSetting,
-                                                    XFA_ATTRIBUTE eAttribute) {
-  CXFA_WidgetData* pWidgetData = GetWidgetData();
-  if (!pWidgetData) {
-    return;
-  }
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    pWidgetData->SetSelectedMemberByValue(
-        CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()), TRUE, TRUE);
-  } else {
-    CFX_WideString wsValue = GetScriptContent(TRUE);
-    XFA_VERSION curVersion = GetDocument()->GetCurVersionMode();
-    if (wsValue.IsEmpty() && curVersion >= XFA_VERSION_300) {
-      FXJSE_Value_SetNull(hValue);
-    } else {
-      FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-    }
-  }
-}
-void CXFA_Node::Script_ExclGroup_Transient(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
-        XFA_ELEMENT_ExclGroup);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
-  }
-}
-void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    } else {
-      CXFA_Node* pReturnNode = NULL;
-      if (argc == 0) {
-        pReturnNode = pWidgetData->GetSelectedMember();
-      } else {
-        CFX_ByteString szName;
-        szName = pArguments->GetUTF8String(0);
-        pReturnNode = pWidgetData->SetSelectedMember(
-            CFX_WideString::FromUTF8(szName, szName.GetLength()));
-      }
-      if (pReturnNode) {
-        FXJSE_Value_Set(
-            pArguments->GetReturnValue(),
-            m_pDocument->GetScriptContext()->GetJSValueFromMap(pReturnNode));
-      } else {
-        FXJSE_Value_SetNull(pArguments->GetReturnValue());
-      }
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"selectedMember");
-  }
-}
-void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execInitialize");
-  }
-}
-void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execCalculate");
-  }
-}
-void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
-                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execValidate");
-  }
-}
-static CXFA_Node* XFA_ScriptInstanceManager_GetItem(CXFA_Node* pInstMgrNode,
-                                                    int32_t iIndex) {
-  ASSERT(pInstMgrNode);
-  int32_t iCount = 0;
-  FX_DWORD dwNameHash = 0;
-  for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    XFA_ELEMENT eCurType = pNode->GetClassID();
-    if (eCurType == XFA_ELEMENT_InstanceManager) {
-      break;
-    }
-    if ((eCurType != XFA_ELEMENT_Subform) &&
-        (eCurType != XFA_ELEMENT_SubformSet)) {
-      continue;
-    }
-    if (iCount == 0) {
-      CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
-      CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
-      if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
-          wsInstName.Mid(1) != wsName) {
-        return NULL;
-      }
-      dwNameHash = pNode->GetNameHash();
-    }
-    if (dwNameHash != pNode->GetNameHash()) {
-      break;
-    }
-    iCount++;
-    if (iCount > iIndex) {
-      return pNode;
-    }
-  }
-  return NULL;
-}
-void CXFA_Node::Script_Som_InstanceIndex(FXJSE_HVALUE hValue,
-                                         FX_BOOL bSetting,
-                                         XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    int32_t iTo = FXJSE_Value_ToInteger(hValue);
-    int32_t iFrom = Subform_and_SubformSet_InstanceIndex();
-    CXFA_Node* pManagerNode = NULL;
-    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
-         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
-      if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
-        pManagerNode = pNode;
-        break;
-      }
-    }
-    if (pManagerNode) {
-      pManagerNode->InstanceManager_MoveInstance(iTo, iFrom);
-      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-      if (!pNotify) {
-        return;
-      }
-      CXFA_Node* pToInstance =
-          XFA_ScriptInstanceManager_GetItem(pManagerNode, iTo);
-      if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
-        pNotify->RunSubformIndexChange(pToInstance);
-      }
-      CXFA_Node* pFromInstance =
-          XFA_ScriptInstanceManager_GetItem(pManagerNode, iFrom);
-      if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
-        pNotify->RunSubformIndexChange(pFromInstance);
-      }
-    }
-  } else {
-    FXJSE_Value_SetInteger(hValue, Subform_and_SubformSet_InstanceIndex());
-  }
-}
-void CXFA_Node::Script_Subform_InstanceManager(FXJSE_HVALUE hValue,
-                                               FX_BOOL bSetting,
-                                               XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
-    CXFA_Node* pInstanceMgr = NULL;
-    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
-         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
-      if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
-        CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name);
-        if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' &&
-            wsInstMgrName.Mid(1) == wsName) {
-          pInstanceMgr = pNode;
-        }
-        break;
-      }
-    }
-    if (pInstanceMgr) {
-      FXJSE_Value_Set(
-          hValue,
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
-    } else {
-      FXJSE_Value_SetNull(hValue);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-void CXFA_Node::Script_Subform_Locale(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    CFX_ByteString bsLocaleName;
-    FXJSE_Value_ToUTF8String(hValue, bsLocaleName);
-    SetCData(XFA_ATTRIBUTE_Locale,
-             CFX_WideString::FromUTF8(bsLocaleName, bsLocaleName.GetLength()),
-             TRUE, TRUE);
-  } else {
-    CFX_WideString wsLocaleName;
-    GetLocaleName(wsLocaleName);
-    FXJSE_Value_SetUTF8String(
-        hValue, FX_UTF8Encode(wsLocaleName, wsLocaleName.GetLength()));
-  }
-}
-void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
-        XFA_ELEMENT_Subform);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
-  }
-}
-void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execInitialize");
-  }
-}
-void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execCalculate");
-  }
-}
-void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
-                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execValidate");
-  }
-}
-void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"getInvalidObjects");
-  }
-}
-int32_t CXFA_Node::Subform_and_SubformSet_InstanceIndex() {
-  int32_t index = 0;
-  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
-    if ((pNode->GetClassID() == XFA_ELEMENT_Subform) ||
-        (pNode->GetClassID() == XFA_ELEMENT_SubformSet)) {
-      index++;
-    } else {
-      break;
-    }
-  }
-  return index;
-}
-void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
-  }
-}
-void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    m_pDocument->DoDataRemerge(TRUE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
-  }
-}
-void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execInitialize");
-  }
-}
-void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    CFX_WideString strTagName;
-    CFX_WideString strName;
-    CFX_WideString strNameSpace;
-    CFX_ByteString bsTagName = pArguments->GetUTF8String(0);
-    strTagName = CFX_WideString::FromUTF8(bsTagName, bsTagName.GetLength());
-    if (argc > 1) {
-      CFX_ByteString bsName = pArguments->GetUTF8String(1);
-      strName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
-      if (argc == 3) {
-        CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2);
-        strNameSpace =
-            CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
-      }
-    }
-    const XFA_ELEMENTINFO* pElement = XFA_GetElementByName(strTagName);
-    CXFA_Node* pNewNode = CreateSamePacketNode(pElement->eName);
-    if (!pNewNode) {
-      FXJSE_Value_SetNull(pArguments->GetReturnValue());
-    } else {
-      if (!strName.IsEmpty()) {
-        if (XFA_GetAttributeOfElement(pElement->eName, XFA_ATTRIBUTE_Name,
-                                      XFA_XDPPACKET_UNKNOWN)) {
-          pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName, TRUE);
-          if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) {
-            pNewNode->CreateXMLMappingNode();
-          }
-          FXJSE_Value_Set(
-              pArguments->GetReturnValue(),
-              m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
-        } else {
-          ThrowScriptErrorMessage(XFA_IDS_NOT_HAVE_PROPERTY,
-                                  (const FX_WCHAR*)strTagName, L"name");
-        }
-      } else {
-        FXJSE_Value_Set(
-            pArguments->GetReturnValue(),
-            m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
-      }
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"createNode");
-  }
-}
-void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) {
-  if (pArguments->GetLength() == 1) {
-    FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
-  }
-}
-void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execCalculate");
-  }
-}
-void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execValidate");
-  }
-}
-void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"evaluate");
-  }
-}
-void CXFA_Node::Script_InstanceManager_Max(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CXFA_Occur nodeOccur(GetOccurNode());
-  FXJSE_Value_SetInteger(hValue, nodeOccur.GetMax());
-}
-void CXFA_Node::Script_InstanceManager_Min(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CXFA_Occur nodeOccur(GetOccurNode());
-  FXJSE_Value_SetInteger(hValue, nodeOccur.GetMin());
-}
-static int32_t XFA_ScriptInstanceManager_GetCount(CXFA_Node* pInstMgrNode) {
-  ASSERT(pInstMgrNode);
-  int32_t iCount = 0;
-  FX_DWORD dwNameHash = 0;
-  for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    XFA_ELEMENT eCurType = pNode->GetClassID();
-    if (eCurType == XFA_ELEMENT_InstanceManager) {
-      break;
-    }
-    if ((eCurType != XFA_ELEMENT_Subform) &&
-        (eCurType != XFA_ELEMENT_SubformSet)) {
-      continue;
-    }
-    if (iCount == 0) {
-      CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
-      CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
-      if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
-          wsInstName.Mid(1) != wsName) {
-        return iCount;
-      }
-      dwNameHash = pNode->GetNameHash();
-    }
-    if (dwNameHash != pNode->GetNameHash()) {
-      break;
-    }
-    iCount++;
-  }
-  return iCount;
-}
-static void
-XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
-    const CXFA_NodeSet& rgNodeSet,
-    CXFA_NodeArray& rgNodeArray,
-    CFX_ArrayTemplate<int32_t>& rgIdxArray) {
-  int32_t iCount = rgNodeSet.GetCount();
-  rgNodeArray.SetSize(iCount);
-  rgIdxArray.SetSize(iCount);
-  if (iCount == 0) {
-    return;
-  }
-  int32_t iIndex = -1, iTotalIndex = -1;
-  CXFA_Node* pNode = NULL;
-  FX_POSITION pos = rgNodeSet.GetStartPosition();
-  rgNodeSet.GetNextAssoc(pos, pNode);
-  for (pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent)
-                   ->GetNodeItem(XFA_NODEITEM_FirstChild);
-       pNode && iIndex < iCount;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    iTotalIndex++;
-    if (rgNodeSet.Lookup(pNode)) {
-      iIndex++;
-      rgNodeArray[iIndex] = pNode;
-      rgIdxArray[iIndex] = iTotalIndex;
-    }
-  }
-}
-struct CXFA_DualNodeArray {
-  CXFA_NodeSet firstNodeList;
-  CXFA_NodeSet secondNodeList;
-};
-static void XFA_ScriptInstanceManager_ReorderDataNodes(CXFA_NodeSet& sSet1,
-                                                       CXFA_NodeSet& sSet2,
-                                                       FX_BOOL bInsertBefore) {
-  CFX_MapPtrTemplate<CXFA_Node*,
-                     CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>*>
-      rgNodeListMap;
-  FX_POSITION pos;
-  pos = sSet1.GetStartPosition();
-  while (pos) {
-    CXFA_Node* pNode = NULL;
-    sSet1.GetNextAssoc(pos, pNode);
-    CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-    FX_DWORD dwNameHash = pNode->GetNameHash();
-    if (!pParentNode || !dwNameHash) {
-      continue;
-    }
-    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
-        rgNodeListMap[pParentNode];
-    if (!pNodeListChildMap) {
-      rgNodeListMap[pParentNode] = pNodeListChildMap =
-          new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
-    }
-    CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
-    if (!pDualNodeArray) {
-      (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
-          new CXFA_DualNodeArray;
-    }
-    pDualNodeArray->firstNodeList.Add(pNode);
-  }
-  pos = sSet2.GetStartPosition();
-  while (pos) {
-    CXFA_Node* pNode = NULL;
-    sSet2.GetNextAssoc(pos, pNode);
-    CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-    FX_DWORD dwNameHash = pNode->GetNameHash();
-    if (!pParentNode || !dwNameHash) {
-      continue;
-    }
-    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
-        rgNodeListMap[pParentNode];
-    if (!pNodeListChildMap) {
-      rgNodeListMap[pParentNode] = pNodeListChildMap =
-          new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
-    }
-    CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
-    if (!pDualNodeArray) {
-      (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
-          new CXFA_DualNodeArray;
-    }
-    if (pDualNodeArray->firstNodeList.Lookup(pNode)) {
-      pDualNodeArray->firstNodeList.RemoveKey(pNode);
-    } else {
-      pDualNodeArray->secondNodeList.Add(pNode);
-    }
-  }
-  pos = rgNodeListMap.GetStartPosition();
-  while (pos) {
-    CXFA_Node* pParentNode = NULL;
-    CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = NULL;
-    rgNodeListMap.GetNextAssoc(pos, pParentNode, pNodeListChildMap);
-    if (!pNodeListChildMap) {
-      continue;
-    }
-    FX_POSITION childpos = pNodeListChildMap->GetStartPosition();
-    while (childpos) {
-      FX_DWORD dwNameHash = 0;
-      CXFA_DualNodeArray* pDualNodeArray = NULL;
-      pNodeListChildMap->GetNextAssoc(childpos, dwNameHash, pDualNodeArray);
-      if (!pDualNodeArray) {
-        continue;
-      }
-      if (pDualNodeArray->firstNodeList.GetCount() != 0 &&
-          pDualNodeArray->secondNodeList.GetCount() != 0) {
-        CXFA_NodeArray rgNodeArray1, rgNodeArray2;
-        CFX_ArrayTemplate<int32_t> rgIdxArray1, rgIdxArray2;
-        XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
-            pDualNodeArray->firstNodeList, rgNodeArray1, rgIdxArray1);
-        XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
-            pDualNodeArray->secondNodeList, rgNodeArray2, rgIdxArray2);
-        CXFA_Node *pParentNode = NULL, *pBeforeNode = NULL;
-        if (bInsertBefore) {
-          pBeforeNode = rgNodeArray2[0];
-          pParentNode = pBeforeNode->GetNodeItem(XFA_NODEITEM_Parent);
-        } else {
-          CXFA_Node* pLastNode = rgNodeArray2[rgIdxArray2.GetSize() - 1];
-          pParentNode = pLastNode->GetNodeItem(XFA_NODEITEM_Parent);
-          pBeforeNode = pLastNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-        }
-        for (int32_t iIdx = 0, iCount = rgIdxArray1.GetSize(); iIdx < iCount;
-             iIdx++) {
-          CXFA_Node* pCurNode = rgNodeArray1[iIdx];
-          pParentNode->RemoveChild(pCurNode);
-          pParentNode->InsertChild(pCurNode, pBeforeNode);
-        }
-      }
-      delete pDualNodeArray;
-    }
-    pNodeListChildMap->RemoveAll();
-  }
-  rgNodeListMap.RemoveAll();
-}
-static void XFA_ScriptInstanceManager_InsertItem(
-    CXFA_Node* pInstMgrNode,
-    CXFA_Node* pNewInstance,
-    int32_t iPos,
-    int32_t iCount = -1,
-    FX_BOOL bMoveDataBindingNodes = TRUE) {
-  if (iCount < 0) {
-    iCount = XFA_ScriptInstanceManager_GetCount(pInstMgrNode);
-  }
-  if (iPos < 0) {
-    iPos = iCount;
-  }
-  if (iPos == iCount) {
-    CXFA_Node* pNextSibling =
-        iCount > 0
-            ? XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iCount - 1)
-                  ->GetNodeItem(XFA_NODEITEM_NextSibling)
-            : pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
-        ->InsertChild(pNewInstance, pNextSibling);
-    if (bMoveDataBindingNodes) {
-      CXFA_NodeSet sNew, sAfter;
-      CXFA_NodeIteratorTemplate<CXFA_Node,
-                                CXFA_TraverseStrategy_XFAContainerNode>
-          sIteratorNew(pNewInstance);
-      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
-           pNode = sIteratorNew.MoveToNext()) {
-        CXFA_Node* pDataNode = pNode->GetBindData();
-        if (!pDataNode) {
-          continue;
-        }
-        sNew.Add(pDataNode);
-      }
-      CXFA_NodeIteratorTemplate<CXFA_Node,
-                                CXFA_TraverseStrategy_XFAContainerNode>
-          sIteratorAfter(pNextSibling);
-      for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode;
-           pNode = sIteratorAfter.MoveToNext()) {
-        CXFA_Node* pDataNode = pNode->GetBindData();
-        if (!pDataNode) {
-          continue;
-        }
-        sAfter.Add(pDataNode);
-      }
-      XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sAfter, FALSE);
-    }
-  } else {
-    CXFA_Node* pBeforeInstance =
-        XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iPos);
-    pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
-        ->InsertChild(pNewInstance, pBeforeInstance);
-    if (bMoveDataBindingNodes) {
-      CXFA_NodeSet sNew, sBefore;
-      CXFA_NodeIteratorTemplate<CXFA_Node,
-                                CXFA_TraverseStrategy_XFAContainerNode>
-          sIteratorNew(pNewInstance);
-      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
-           pNode = sIteratorNew.MoveToNext()) {
-        CXFA_Node* pDataNode = pNode->GetBindData();
-        if (!pDataNode) {
-          continue;
-        }
-        sNew.Add(pDataNode);
-      }
-      CXFA_NodeIteratorTemplate<CXFA_Node,
-                                CXFA_TraverseStrategy_XFAContainerNode>
-          sIteratorBefore(pBeforeInstance);
-      for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode;
-           pNode = sIteratorBefore.MoveToNext()) {
-        CXFA_Node* pDataNode = pNode->GetBindData();
-        if (!pDataNode) {
-          continue;
-        }
-        sBefore.Add(pDataNode);
-      }
-      XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sBefore, TRUE);
-    }
-  }
-}
-static void XFA_ScriptInstanceManager_RemoveItem(
-    CXFA_Node* pInstMgrNode,
-    CXFA_Node* pRemoveInstance,
-    FX_BOOL bRemoveDataBinding = TRUE) {
-  pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pRemoveInstance);
-  if (!bRemoveDataBinding) {
-    return;
-  }
-  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
-      sIterator(pRemoveInstance);
-  for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode;
-       pFormNode = sIterator.MoveToNext()) {
-    CXFA_Node* pDataNode = pFormNode->GetBindData();
-    if (!pDataNode) {
-      continue;
-    }
-    if (pDataNode->RemoveBindItem(pFormNode) == 0) {
-      if (CXFA_Node* pDataParent =
-              pDataNode->GetNodeItem(XFA_NODEITEM_Parent)) {
-        pDataParent->RemoveChild(pDataNode);
-      }
-    }
-    pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-  }
-}
-static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance(
-    CXFA_Node* pInstMgrNode,
-    FX_BOOL bDataMerge) {
-  CXFA_Document* pDocument = pInstMgrNode->GetDocument();
-  CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode();
-  CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent);
-  CXFA_Node* pDataScope = NULL;
-  for (CXFA_Node* pRootBoundNode = pFormParent;
-       pRootBoundNode &&
-       pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
-       pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) {
-    pDataScope = pRootBoundNode->GetBindData();
-    if (pDataScope) {
-      break;
-    }
-  }
-  if (!pDataScope) {
-    pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
-    ASSERT(pDataScope);
-  }
-  CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer(
-      pTemplateNode, pFormParent, pDataScope, TRUE, bDataMerge);
-  if (pInstance) {
-    pDocument->DataMerge_UpdateBindingRelations(pInstance);
-    pFormParent->RemoveChild(pInstance);
-  }
-  return pInstance;
-}
-void CXFA_Node::Script_InstanceManager_Count(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    int32_t iDesired = FXJSE_Value_ToInteger(hValue);
-    InstanceManager_SetInstances(iDesired);
-  } else {
-    FXJSE_Value_SetInteger(hValue, XFA_ScriptInstanceManager_GetCount(this));
-  }
-}
-void CXFA_Node::Script_InstanceManager_MoveInstance(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 2) {
-    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
-    return;
-  }
-  int32_t iFrom = pArguments->GetInt32(0);
-  int32_t iTo = pArguments->GetInt32(1);
-  InstanceManager_MoveInstance(iTo, iFrom);
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(this, iTo);
-  if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
-    pNotify->RunSubformIndexChange(pToInstance);
-  }
-  CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
-  if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
-    pNotify->RunSubformIndexChange(pFromInstance);
-  }
-}
-void CXFA_Node::Script_InstanceManager_RemoveInstance(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 1) {
-    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
-  if (iIndex < 0 || iIndex >= iCount) {
-    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
-    return;
-  }
-  CXFA_Occur nodeOccur(GetOccurNode());
-  int32_t iMin = nodeOccur.GetMin();
-  if (iCount - 1 < iMin) {
-    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
-    return;
-  }
-  CXFA_Node* pRemoveInstance = XFA_ScriptInstanceManager_GetItem(this, iIndex);
-  XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (pNotify) {
-    for (int32_t i = iIndex; i < iCount - 1; i++) {
-      CXFA_Node* pSubformInstance = XFA_ScriptInstanceManager_GetItem(this, i);
-      if (pSubformInstance &&
-          pSubformInstance->GetClassID() == XFA_ELEMENT_Subform) {
-        pNotify->RunSubformIndexChange(pSubformInstance);
-      }
-    }
-  }
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (!pLayoutPro) {
-    return;
-  }
-  pLayoutPro->AddChangedContainer(
-      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
-}
-void CXFA_Node::Script_InstanceManager_SetInstances(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 1) {
-    FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
-    return;
-  }
-  int32_t iDesired = pArguments->GetInt32(0);
-  InstanceManager_SetInstances(iDesired);
-}
-void CXFA_Node::Script_InstanceManager_AddInstance(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc != 0) && (argc != 1)) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addInstance");
-    return;
-  }
-  FX_BOOL fFlags = TRUE;
-  if (argc == 1) {
-    fFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
-  }
-  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
-  CXFA_Occur nodeOccur(GetOccurNode());
-  int32_t iMax = nodeOccur.GetMax();
-  if (iMax >= 0 && iCount >= iMax) {
-    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
-    return;
-  }
-  CXFA_Node* pNewInstance =
-      XFA_ScriptInstanceManager_CreateInstance(this, fFlags);
-  XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
-                                       FALSE);
-  FXJSE_Value_Set(
-      pArguments->GetReturnValue(),
-      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  pNotify->RunNodeInitialize(pNewInstance);
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (!pLayoutPro) {
-    return;
-  }
-  pLayoutPro->AddChangedContainer(
-      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
-}
-void CXFA_Node::Script_InstanceManager_InsertInstance(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc != 1) && (argc != 2)) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"insertInstance");
-    return;
-  }
-  int32_t iIndex = pArguments->GetInt32(0);
-  FX_BOOL bBind = FALSE;
-  if (argc == 2) {
-    bBind = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  CXFA_Occur nodeOccur(GetOccurNode());
-  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
-  if (iIndex < 0 || iIndex > iCount) {
-    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
-    return;
-  }
-  int32_t iMax = nodeOccur.GetMax();
-  if (iMax >= 0 && iCount >= iMax) {
-    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
-    return;
-  }
-  CXFA_Node* pNewInstance =
-      XFA_ScriptInstanceManager_CreateInstance(this, bBind);
-  XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iIndex, iCount,
-                                       TRUE);
-  FXJSE_Value_Set(
-      pArguments->GetReturnValue(),
-      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  pNotify->RunNodeInitialize(pNewInstance);
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (!pLayoutPro) {
-    return;
-  }
-  pLayoutPro->AddChangedContainer(
-      ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
-}
-int32_t CXFA_Node::InstanceManager_SetInstances(int32_t iDesired) {
-  CXFA_Occur nodeOccur(GetOccurNode());
-  int32_t iMax = nodeOccur.GetMax();
-  int32_t iMin = nodeOccur.GetMin();
-  if (iDesired < iMin) {
-    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
-    return 1;
-  }
-  if ((iMax >= 0) && (iDesired > iMax)) {
-    ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
-    return 2;
-  }
-  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
-  if (iDesired == iCount) {
-    return 0;
-  }
-  if (iDesired < iCount) {
-    CFX_WideStringC wsInstManagerName = GetCData(XFA_ATTRIBUTE_Name);
-    CFX_WideString wsInstanceName = wsInstManagerName.IsEmpty()
-                                        ? wsInstManagerName
-                                        : wsInstManagerName.Mid(1);
-    FX_DWORD dInstanceNameHash =
-        wsInstanceName.IsEmpty() ? 0 : FX_HashCode_String_GetW(
-                                           wsInstanceName,
-                                           wsInstanceName.GetLength());
-    CXFA_Node* pPrevSibling =
-        (iDesired == 0) ? this
-                        : XFA_ScriptInstanceManager_GetItem(this, iDesired - 1);
-    while (iCount > iDesired) {
-      CXFA_Node* pRemoveInstance =
-          pPrevSibling->GetNodeItem(XFA_NODEITEM_NextSibling);
-      if (pRemoveInstance->GetClassID() != XFA_ELEMENT_Subform &&
-          pRemoveInstance->GetClassID() != XFA_ELEMENT_SubformSet) {
-        continue;
-      }
-      if (pRemoveInstance->GetClassID() == XFA_ELEMENT_InstanceManager) {
-        FXSYS_assert(FALSE);
-        break;
-      }
-      if (pRemoveInstance->GetNameHash() == dInstanceNameHash) {
-        XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
-        iCount--;
-      }
-    }
-  } else if (iDesired > iCount) {
-    while (iCount < iDesired) {
-      CXFA_Node* pNewInstance =
-          XFA_ScriptInstanceManager_CreateInstance(this, TRUE);
-      XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
-                                           FALSE);
-      iCount++;
-      IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-      if (!pNotify) {
-        return 0;
-      }
-      pNotify->RunNodeInitialize(pNewInstance);
-    }
-  }
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (pLayoutPro) {
-    pLayoutPro->AddChangedContainer(
-        ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
-  }
-  return 0;
-}
-int32_t CXFA_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) {
-  int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
-  if (iFrom > iCount || iTo > iCount - 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
-    return 1;
-  }
-  if (iFrom < 0 || iTo < 0 || iFrom == iTo) {
-    return 0;
-  }
-  CXFA_Node* pMoveInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
-  XFA_ScriptInstanceManager_RemoveItem(this, pMoveInstance, FALSE);
-  XFA_ScriptInstanceManager_InsertItem(this, pMoveInstance, iTo, iCount - 1,
-                                       TRUE);
-  CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
-  if (pLayoutPro) {
-    pLayoutPro->AddChangedContainer(
-        ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form)));
-  }
-  return 0;
-}
-void CXFA_Node::Script_Occur_Max(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute) {
-  CXFA_Occur occur(this);
-  if (bSetting) {
-    int32_t iMax = FXJSE_Value_ToInteger(hValue);
-    occur.SetMax(iMax);
-  } else {
-    FXJSE_Value_SetInteger(hValue, occur.GetMax());
-  }
-}
-void CXFA_Node::Script_Occur_Min(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute) {
-  CXFA_Occur occur(this);
-  if (bSetting) {
-    int32_t iMin = FXJSE_Value_ToInteger(hValue);
-    occur.SetMin(iMin);
-  } else {
-    FXJSE_Value_SetInteger(hValue, occur.GetMin());
-  }
-}
-void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"metadata");
-  }
-}
-void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pDataNode) {
-      CXFA_NodeArray formItems;
-      CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
-      pFormNodes->SetArrayNodeList(formItems);
-      FXJSE_Value_SetObject(
-          pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
-          m_pDocument->GetScriptContext()->GetJseNormalClass());
-    } else {
-      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
-  }
-}
-void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    m_pDocument->DoDataRemerge(TRUE);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
-  }
-}
-void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execInitialize");
-  }
-}
-void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) {
-  CXFA_EventParam* pEventParam =
-      m_pDocument->GetScriptContext()->GetEventParam();
-  if (pEventParam->m_eType == XFA_EVENT_Calculate ||
-      pEventParam->m_eType == XFA_EVENT_InitCalculate) {
-    return;
-  }
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    const bool bScriptFlags = pArguments->GetInt32(0) != 0;
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    if (bScriptFlags) {
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, TRUE);
-    } else {
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
-  }
-}
-void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execCalculate");
-  }
-}
-void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
-                             ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"execValidate");
-  }
-}
-void CXFA_Node::Script_Form_Checksum(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    CFX_ByteString bsChecksum;
-    FXJSE_Value_ToUTF8String(hValue, bsChecksum);
-    SetAttribute(XFA_ATTRIBUTE_Checksum,
-                 CFX_WideString::FromUTF8(bsChecksum, bsChecksum.GetLength()));
-  } else {
-    CFX_WideString wsChecksum;
-    GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, FALSE);
-    FXJSE_Value_SetUTF8String(
-        hValue, FX_UTF8Encode(wsChecksum, wsChecksum.GetLength()));
-  }
-}
-void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0);
-    CFX_WideString wsAttributeValue;
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      ((IFDE_XMLElement*)pXMLNode)
-          ->GetString(CFX_WideString::FromUTF8(bsAttributeName,
-                                               bsAttributeName.GetLength()),
-                      wsAttributeValue);
-    }
-    FXJSE_Value_SetUTF8String(
-        pArguments->GetReturnValue(),
-        FX_UTF8Encode(wsAttributeValue, wsAttributeValue.GetLength()));
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"getAttribute");
-  }
-}
-void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 2) {
-    CFX_ByteString bsValue = pArguments->GetUTF8String(0);
-    CFX_ByteString bsName = pArguments->GetUTF8String(1);
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      ((IFDE_XMLElement*)pXMLNode)
-          ->SetString(CFX_WideString::FromUTF8(bsName, bsName.GetLength()),
-                      CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
-    }
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"setAttribute");
-  }
-}
-void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString bsName = pArguments->GetUTF8String(0);
-    CFX_WideString wsName =
-        CFX_WideString::FromUTF8(bsName, bsName.GetLength());
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      if (pXMLElement->HasAttribute(wsName)) {
-        pXMLElement->RemoveAttribute(wsName);
-      }
-    }
-    FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"removeAttribute");
-  }
-}
-void CXFA_Node::Script_Packet_Content(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    CFX_ByteString bsNewContent;
-    FXJSE_Value_ToUTF8String(hValue, bsNewContent);
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      pXMLElement->SetTextData(
-          CFX_WideString::FromUTF8(bsNewContent, bsNewContent.GetLength()));
-    }
-  } else {
-    CFX_WideString wsTextData;
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      pXMLElement->GetTextData(wsTextData);
-    }
-    FXJSE_Value_SetUTF8String(
-        hValue, FX_UTF8Encode(wsTextData, wsTextData.GetLength()));
-  }
-}
-void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"next");
-  }
-}
-void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancelBatch");
-  }
-}
-void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"first");
-  }
-}
-void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"updateBatch");
-  }
-}
-void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"previous");
-  }
-}
-void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isBOF");
-  }
-}
-void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isEOF");
-  }
-}
-void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancel");
-  }
-}
-void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"update");
-  }
-}
-void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"open");
-  }
-}
-void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"delete");
-  }
-}
-void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addNew");
-  }
-}
-void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"requery");
-  }
-}
-void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resync");
-  }
-}
-void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"close");
-  }
-}
-void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"last");
-  }
-}
-void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"hasDataChanged");
-  }
-}
-void CXFA_Node::Script_Source_Db(FXJSE_HVALUE hValue,
-                                 FX_BOOL bSetting,
-                                 XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Xfa_This(FXJSE_HVALUE hValue,
-                                FX_BOOL bSetting,
-                                XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CXFA_Object* pThis = m_pDocument->GetScriptContext()->GetThisObject();
-    FXSYS_assert(pThis);
-    FXJSE_Value_Set(hValue,
-                    m_pDocument->GetScriptContext()->GetJSValueFromMap(pThis));
-  }
-}
-void CXFA_Node::Script_Handler_Version(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_SubmitFormat_Mode(FXJSE_HVALUE hValue,
-                                         FX_BOOL bSetting,
-                                         XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Extras_Type(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute) {}
-void CXFA_Node::Script_Script_Stateless(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(FX_WSTRC(L"0")));
-}
-void CXFA_Node::Script_Encrypt_Format(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute) {}
-enum XFA_KEYTYPE {
-  XFA_KEYTYPE_Custom,
-  XFA_KEYTYPE_Element,
-};
-void* XFA_GetMapKey_Custom(const CFX_WideStringC& wsKey) {
-  FX_DWORD dwKey = FX_HashCode_String_GetW(wsKey.GetPtr(), wsKey.GetLength());
-  return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom);
-}
-void* XFA_GetMapKey_Element(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute) {
-  return (void*)(uintptr_t)((eElement << 16) | (eAttribute << 8) |
-                            XFA_KEYTYPE_Element);
-}
-FX_BOOL CXFA_Node::HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  return HasMapModuleKey(pKey, bCanInherit);
-}
-FX_BOOL CXFA_Node::SetAttribute(XFA_ATTRIBUTE eAttr,
-                                const CFX_WideStringC& wsValue,
-                                FX_BOOL bNotify) {
-  const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
-  if (pAttr == NULL) {
-    return FALSE;
-  }
-  XFA_ATTRIBUTETYPE eType = pAttr->eType;
-  if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
-    const XFA_NOTSUREATTRIBUTE* pNotsure =
-        XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
-    eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
-  }
-  switch (eType) {
-    case XFA_ATTRIBUTETYPE_Enum: {
-      const XFA_ATTRIBUTEENUMINFO* pEnum = XFA_GetAttributeEnumByName(wsValue);
-      return SetEnum(pAttr->eName,
-                     pEnum ? pEnum->eName
-                           : (XFA_ATTRIBUTEENUM)(intptr_t)(pAttr->pDefValue),
-                     bNotify);
-    } break;
-    case XFA_ATTRIBUTETYPE_Cdata:
-      return SetCData(pAttr->eName, wsValue, bNotify);
-    case XFA_ATTRIBUTETYPE_Boolean:
-      return SetBoolean(pAttr->eName, wsValue != FX_WSTRC(L"0"), bNotify);
-    case XFA_ATTRIBUTETYPE_Integer:
-      return SetInteger(
-          pAttr->eName,
-          FXSYS_round(FX_wcstof(wsValue.GetPtr(), wsValue.GetLength())),
-          bNotify);
-    case XFA_ATTRIBUTETYPE_Measure:
-      return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify);
-    default:
-      break;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Node::GetAttribute(XFA_ATTRIBUTE eAttr,
-                                CFX_WideString& wsValue,
-                                FX_BOOL bUseDefault) {
-  const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
-  if (pAttr == NULL) {
-    return FALSE;
-  }
-  XFA_ATTRIBUTETYPE eType = pAttr->eType;
-  if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
-    const XFA_NOTSUREATTRIBUTE* pNotsure =
-        XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
-    eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
-  }
-  switch (eType) {
-    case XFA_ATTRIBUTETYPE_Enum: {
-      XFA_ATTRIBUTEENUM eValue;
-      if (!TryEnum(pAttr->eName, eValue, bUseDefault)) {
-        return FALSE;
-      }
-      wsValue = XFA_GetAttributeEnumByID(eValue)->pName;
-      return TRUE;
-    } break;
-    case XFA_ATTRIBUTETYPE_Cdata: {
-      CFX_WideStringC wsValueC;
-      if (!TryCData(pAttr->eName, wsValueC, bUseDefault)) {
-        return FALSE;
-      }
-      wsValue = wsValueC;
-      return TRUE;
-    } break;
-    case XFA_ATTRIBUTETYPE_Boolean: {
-      FX_BOOL bValue;
-      if (!TryBoolean(pAttr->eName, bValue, bUseDefault)) {
-        return FALSE;
-      }
-      wsValue = bValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0");
-      return TRUE;
-    } break;
-    case XFA_ATTRIBUTETYPE_Integer: {
-      int32_t iValue;
-      if (!TryInteger(pAttr->eName, iValue, bUseDefault)) {
-        return FALSE;
-      }
-      wsValue.Format(L"%d", iValue);
-      return TRUE;
-    } break;
-    case XFA_ATTRIBUTETYPE_Measure: {
-      CXFA_Measurement mValue;
-      if (!TryMeasure(pAttr->eName, mValue, bUseDefault)) {
-        return FALSE;
-      }
-      mValue.ToString(wsValue);
-      return TRUE;
-    } break;
-    default:
-      break;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Node::SetAttribute(const CFX_WideStringC& wsAttr,
-                                const CFX_WideStringC& wsValue,
-                                FX_BOOL bNotify) {
-  const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsValue);
-  if (pAttributeInfo) {
-    return SetAttribute(pAttributeInfo->eName, wsValue, bNotify);
-  }
-  void* pKey = XFA_GetMapKey_Custom(wsAttr);
-  SetMapModuleString(pKey, wsValue);
-  return TRUE;
-}
-FX_BOOL CXFA_Node::GetAttribute(const CFX_WideStringC& wsAttr,
-                                CFX_WideString& wsValue,
-                                FX_BOOL bUseDefault) {
-  const XFA_ATTRIBUTEINFO* pAttributeInfo = XFA_GetAttributeByName(wsAttr);
-  if (pAttributeInfo) {
-    return GetAttribute(pAttributeInfo->eName, wsValue, bUseDefault);
-  }
-  void* pKey = XFA_GetMapKey_Custom(wsAttr);
-  CFX_WideStringC wsValueC;
-  if (GetMapModuleString(pKey, wsValueC)) {
-    wsValue = wsValueC;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Node::RemoveAttribute(const CFX_WideStringC& wsAttr) {
-  void* pKey = XFA_GetMapKey_Custom(wsAttr);
-  RemoveMapModuleKey(pKey);
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr,
-                              FX_BOOL& bValue,
-                              FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) {
-    return FALSE;
-  }
-  bValue = (FX_BOOL)(uintptr_t)pValue;
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr,
-                              int32_t& iValue,
-                              FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) {
-    return FALSE;
-  }
-  iValue = (int32_t)(uintptr_t)pValue;
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr,
-                           XFA_ATTRIBUTEENUM& eValue,
-                           FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) {
-    return FALSE;
-  }
-  eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
-  return TRUE;
-}
-FX_BOOL CXFA_Node::SetMeasure(XFA_ATTRIBUTE eAttr,
-                              CXFA_Measurement mValue,
-                              FX_BOOL bNotify) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  OnChanging(eAttr, &mValue, bNotify);
-  SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement));
-  OnChanged(eAttr, &mValue, bNotify);
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryMeasure(XFA_ATTRIBUTE eAttr,
-                              CXFA_Measurement& mValue,
-                              FX_BOOL bUseDefault) const {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  void* pValue;
-  int32_t iBytes;
-  if (GetMapModuleBuffer(pKey, pValue, iBytes) && iBytes == sizeof(mValue)) {
-    FXSYS_memcpy(&mValue, pValue, sizeof(mValue));
-    return TRUE;
-  }
-  if (bUseDefault &&
-      XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
-                                   XFA_ATTRIBUTETYPE_Measure, m_ePacket)) {
-    FXSYS_memcpy(&mValue, pValue, sizeof(mValue));
-    return TRUE;
-  }
-  return FALSE;
-}
-
-CXFA_Measurement CXFA_Node::GetMeasure(XFA_ATTRIBUTE eAttr) const {
-  CXFA_Measurement mValue;
-  return TryMeasure(eAttr, mValue, TRUE) ? mValue : CXFA_Measurement();
-}
-
-FX_BOOL CXFA_Node::SetCData(XFA_ATTRIBUTE eAttr,
-                            const CFX_WideString& wsValue,
-                            FX_BOOL bNotify,
-                            FX_BOOL bScriptModify) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  OnChanging(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify);
-  if (eAttr == XFA_ATTRIBUTE_Value) {
-    CFX_WideString* pClone = new CFX_WideString(wsValue);
-    SetUserData(pKey, pClone, &deleteWideStringCallBack);
-  } else {
-    SetMapModuleString(pKey, wsValue);
-    if (eAttr == XFA_ATTRIBUTE_Name)
-      UpdateNameHash();
-  }
-  OnChanged(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify, bScriptModify);
-  if (IsNeedSavingXMLNode() && eAttr != XFA_ATTRIBUTE_QualifiedName &&
-      eAttr != XFA_ATTRIBUTE_BindingNode) {
-    if (eAttr == XFA_ATTRIBUTE_Name &&
-        (m_eNodeClass == XFA_ELEMENT_DataValue ||
-         m_eNodeClass == XFA_ELEMENT_DataGroup)) {
-      return TRUE;
-    }
-    if (eAttr == XFA_ATTRIBUTE_Value) {
-      FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
-      switch (eXMLType) {
-        case FDE_XMLNODE_Element:
-          if (IsAttributeInXML()) {
-            ((IFDE_XMLElement*)m_pXMLNode)
-                ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsValue);
-          } else {
-            FX_BOOL bDeleteChildren = TRUE;
-            if (GetPacketID() == XFA_XDPPACKET_Datasets) {
-              for (CXFA_Node* pChildDataNode =
-                       GetNodeItem(XFA_NODEITEM_FirstChild);
-                   pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
-                                       XFA_NODEITEM_NextSibling)) {
-                CXFA_NodeArray formNodes;
-                if (pChildDataNode->GetBindItems(formNodes) > 0) {
-                  bDeleteChildren = FALSE;
-                  break;
-                }
-              }
-            }
-            if (bDeleteChildren) {
-              ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
-            }
-            ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsValue);
-          }
-          break;
-        case FDE_XMLNODE_Text:
-          ((IFDE_XMLText*)m_pXMLNode)->SetText(wsValue);
-          break;
-        default:
-          FXSYS_assert(0);
-      }
-      return TRUE;
-    }
-    const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr);
-    if (pInfo) {
-      FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
-      CFX_WideString wsAttrName = pInfo->pName;
-      if (pInfo->eName == XFA_ATTRIBUTE_ContentType) {
-        wsAttrName = FX_WSTRC(L"xfa:") + wsAttrName;
-      }
-      ((IFDE_XMLElement*)m_pXMLNode)->SetString(wsAttrName, wsValue);
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Node::SetAttributeValue(const CFX_WideString& wsValue,
-                                     const CFX_WideString& wsXMLValue,
-                                     FX_BOOL bNotify,
-                                     FX_BOOL bScriptModify) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), XFA_ATTRIBUTE_Value);
-  OnChanging(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify);
-  CFX_WideString* pClone = new CFX_WideString(wsValue);
-  SetUserData(pKey, pClone, &deleteWideStringCallBack);
-  OnChanged(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify,
-            bScriptModify);
-  if (IsNeedSavingXMLNode()) {
-    FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
-    switch (eXMLType) {
-      case FDE_XMLNODE_Element:
-        if (IsAttributeInXML()) {
-          ((IFDE_XMLElement*)m_pXMLNode)
-              ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsXMLValue);
-        } else {
-          FX_BOOL bDeleteChildren = TRUE;
-          if (GetPacketID() == XFA_XDPPACKET_Datasets) {
-            for (CXFA_Node* pChildDataNode =
-                     GetNodeItem(XFA_NODEITEM_FirstChild);
-                 pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
-                                     XFA_NODEITEM_NextSibling)) {
-              CXFA_NodeArray formNodes;
-              if (pChildDataNode->GetBindItems(formNodes) > 0) {
-                bDeleteChildren = FALSE;
-                break;
-              }
-            }
-          }
-          if (bDeleteChildren) {
-            ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
-          }
-          ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsXMLValue);
-        }
-        break;
-      case FDE_XMLNODE_Text:
-        ((IFDE_XMLText*)m_pXMLNode)->SetText(wsXMLValue);
-        break;
-      default:
-        FXSYS_assert(0);
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
-                            CFX_WideString& wsValue,
-                            FX_BOOL bUseDefault,
-                            FX_BOOL bProto) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  if (eAttr == XFA_ATTRIBUTE_Value) {
-    CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
-    if (pStr) {
-      wsValue = *pStr;
-      return TRUE;
-    }
-  } else {
-    CFX_WideStringC wsValueC;
-    if (GetMapModuleString(pKey, wsValueC)) {
-      wsValue = wsValueC;
-      return TRUE;
-    }
-  }
-  if (!bUseDefault) {
-    return FALSE;
-  }
-  void* pValue = NULL;
-  if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
-                                   XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
-    wsValue = (const FX_WCHAR*)pValue;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
-                            CFX_WideStringC& wsValue,
-                            FX_BOOL bUseDefault,
-                            FX_BOOL bProto) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  if (eAttr == XFA_ATTRIBUTE_Value) {
-    CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
-    if (pStr) {
-      wsValue = *pStr;
-      return TRUE;
-    }
-  } else {
-    if (GetMapModuleString(pKey, wsValue)) {
-      return TRUE;
-    }
-  }
-  if (!bUseDefault) {
-    return FALSE;
-  }
-  void* pValue = NULL;
-  if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
-                                   XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
-    wsValue = (CFX_WideStringC)(const FX_WCHAR*)pValue;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Node::SetObject(XFA_ATTRIBUTE eAttr,
-                             void* pData,
-                             XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  return SetUserData(pKey, pData, pCallbackInfo);
-}
-FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, void*& pData) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  pData = GetUserData(pKey);
-  return pData != NULL;
-}
-FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr,
-                            XFA_ATTRIBUTETYPE eType,
-                            void* pValue,
-                            FX_BOOL bNotify) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  OnChanging(eAttr, pValue, bNotify);
-  SetMapModuleValue(pKey, pValue);
-  OnChanged(eAttr, pValue, bNotify);
-  if (IsNeedSavingXMLNode()) {
-    FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
-    const XFA_ATTRIBUTEINFO* pInfo = XFA_GetAttributeByID(eAttr);
-    if (pInfo) {
-      switch (eType) {
-        case XFA_ATTRIBUTETYPE_Enum:
-          ((IFDE_XMLElement*)m_pXMLNode)
-              ->SetString(
-                  pInfo->pName,
-                  XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)(uintptr_t)pValue)
-                      ->pName);
-          break;
-        case XFA_ATTRIBUTETYPE_Boolean:
-          ((IFDE_XMLElement*)m_pXMLNode)
-              ->SetString(pInfo->pName,
-                          pValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0"));
-          break;
-        case XFA_ATTRIBUTETYPE_Integer:
-          ((IFDE_XMLElement*)m_pXMLNode)
-              ->SetInteger(pInfo->pName, (int32_t)(uintptr_t)pValue);
-          break;
-        default:
-          FXSYS_assert(0);
-      }
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Node::GetValue(XFA_ATTRIBUTE eAttr,
-                            XFA_ATTRIBUTETYPE eType,
-                            FX_BOOL bUseDefault,
-                            void*& pValue) {
-  void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
-  if (GetMapModuleValue(pKey, pValue)) {
-    return TRUE;
-  }
-  if (!bUseDefault) {
-    return FALSE;
-  }
-  return XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, eType,
-                                      m_ePacket);
-}
-static void XFA_DefaultFreeData(void* pData) {}
-static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {
-    XFA_DefaultFreeData, NULL};
-FX_BOOL CXFA_Node::SetUserData(void* pKey,
-                               void* pData,
-                               XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
-  SetMapModuleBuffer(pKey, &pData, sizeof(void*),
-                     pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData);
-  return TRUE;
-}
-FX_BOOL CXFA_Node::TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso) {
-  int32_t iBytes = 0;
-  if (!GetMapModuleBuffer(pKey, pData, iBytes, bProtoAlso)) {
-    return FALSE;
-  }
-  return iBytes == sizeof(void*) && FXSYS_memcpy(&pData, pData, iBytes);
-}
-FX_BOOL CXFA_Node::SetScriptContent(const CFX_WideString& wsContent,
-                                    const CFX_WideString& wsXMLValue,
-                                    FX_BOOL bNotify,
-                                    FX_BOOL bScriptModify,
-                                    FX_BOOL bSyncData) {
-  CXFA_Node* pNode = NULL;
-  CXFA_Node* pBindNode = NULL;
-  switch (GetObjectType()) {
-    case XFA_OBJECTTYPE_ContainerNode: {
-      if (XFA_FieldIsMultiListBox(this)) {
-        CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
-        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-        FXSYS_assert(pChildValue);
-        pChildValue->SetCData(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml"));
-        pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
-                                      bScriptModify, FALSE);
-        CXFA_Node* pBind = GetBindData();
-        if (bSyncData && pBind) {
-          CFX_WideStringArray wsSaveTextArray;
-          int32_t iSize = 0;
-          if (!wsContent.IsEmpty()) {
-            int32_t iStart = 0;
-            int32_t iLength = wsContent.GetLength();
-            int32_t iEnd = wsContent.Find(L'\n', iStart);
-            iEnd = (iEnd == -1) ? iLength : iEnd;
-            while (iEnd >= iStart) {
-              wsSaveTextArray.Add(wsContent.Mid(iStart, iEnd - iStart));
-              iStart = iEnd + 1;
-              if (iStart >= iLength) {
-                break;
-              }
-              iEnd = wsContent.Find(L'\n', iStart);
-              if (iEnd < 0) {
-                wsSaveTextArray.Add(wsContent.Mid(iStart, iLength - iStart));
-              }
-            }
-            iSize = wsSaveTextArray.GetSize();
-          }
-          if (iSize == 0) {
-            while (CXFA_Node* pChildNode =
-                       pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-              pBind->RemoveChild(pChildNode);
-            }
-          } else {
-            CXFA_NodeArray valueNodes;
-            int32_t iDatas = pBind->GetNodeList(
-                valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue);
-            if (iDatas < iSize) {
-              int32_t iAddNodes = iSize - iDatas;
-              CXFA_Node* pValueNodes = NULL;
-              while (iAddNodes-- > 0) {
-                pValueNodes =
-                    pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue);
-                pValueNodes->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value"));
-                pValueNodes->CreateXMLMappingNode();
-                pBind->InsertChild(pValueNodes);
-              }
-              pValueNodes = NULL;
-            } else if (iDatas > iSize) {
-              int32_t iDelNodes = iDatas - iSize;
-              while (iDelNodes-- > 0) {
-                pBind->RemoveChild(pBind->GetNodeItem(XFA_NODEITEM_FirstChild));
-              }
-            }
-            int32_t i = 0;
-            for (CXFA_Node* pValueNode =
-                     pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
-                 pValueNode; pValueNode = pValueNode->GetNodeItem(
-                                 XFA_NODEITEM_NextSibling)) {
-              pValueNode->SetAttributeValue(wsSaveTextArray[i],
-                                            wsSaveTextArray[i], FALSE);
-              i++;
-            }
-          }
-          CXFA_NodeArray nodeArray;
-          pBind->GetBindItems(nodeArray);
-          for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
-            CXFA_Node* pNode = nodeArray[i];
-            if (pNode == this) {
-              continue;
-            }
-            pNode->SetScriptContent(wsContent, wsContent, bNotify,
-                                    bScriptModify, FALSE);
-          }
-        }
-        break;
-      } else if (GetClassID() == XFA_ELEMENT_ExclGroup) {
-        pNode = this;
-      } else {
-        CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
-        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-        FXSYS_assert(pChildValue);
-        pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
-                                      bScriptModify, FALSE);
-      }
-      pBindNode = GetBindData();
-      if (pBindNode && bSyncData) {
-        pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
-                                    bScriptModify, FALSE);
-        CXFA_NodeArray nodeArray;
-        pBindNode->GetBindItems(nodeArray);
-        for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
-          CXFA_Node* pNode = nodeArray[i];
-          if (pNode == this) {
-            continue;
-          }
-          pNode->SetScriptContent(wsContent, wsContent, bNotify, TRUE, FALSE);
-        }
-      }
-      pBindNode = NULL;
-      break;
-    }
-    case XFA_OBJECTTYPE_ContentNode: {
-      CFX_WideString wsContentType;
-      if (GetClassID() == XFA_ELEMENT_ExData) {
-        GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
-        if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-          wsContentType = FX_WSTRC(L"");
-          SetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType);
-        }
-      }
-      CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!pContentRawDataNode) {
-        pContentRawDataNode =
-            CreateSamePacketNode((wsContentType.Equal(FX_WSTRC(L"text/xml")))
-                                     ? XFA_ELEMENT_Sharpxml
-                                     : XFA_ELEMENT_Sharptext);
-        InsertChild(pContentRawDataNode);
-      }
-      return pContentRawDataNode->SetScriptContent(
-          wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData);
-    } break;
-    case XFA_OBJECTTYPE_NodeC:
-    case XFA_OBJECTTYPE_TextNode:
-      pNode = this;
-      break;
-    case XFA_OBJECTTYPE_NodeV:
-      pNode = this;
-      if (bSyncData && GetPacketID() == XFA_XDPPACKET_Form) {
-        CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
-        if (pParent) {
-          pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
-        }
-        if (pParent && pParent->GetClassID() == XFA_ELEMENT_Value) {
-          pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
-          if (pParent && pParent->IsContainerNode()) {
-            pBindNode = pParent->GetBindData();
-            if (pBindNode) {
-              pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
-                                          bScriptModify, FALSE);
-            }
-          }
-        }
-      }
-      break;
-    default:
-      if (GetClassID() == XFA_ELEMENT_DataValue) {
-        pNode = this;
-        pBindNode = this;
-      }
-      break;
-  }
-  if (pNode) {
-    SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify);
-    if (pBindNode && bSyncData) {
-      CXFA_NodeArray nodeArray;
-      pBindNode->GetBindItems(nodeArray);
-      for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
-        CXFA_Node* pNode = nodeArray[i];
-        pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify,
-                                FALSE);
-      }
-    }
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Node::SetContent(const CFX_WideString& wsContent,
-                              const CFX_WideString& wsXMLValue,
-                              FX_BOOL bNotify,
-                              FX_BOOL bScriptModify,
-                              FX_BOOL bSyncData) {
-  return SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify,
-                          bSyncData);
-}
-CFX_WideString CXFA_Node::GetScriptContent(FX_BOOL bScriptModify) {
-  CFX_WideString wsContent;
-  return TryContent(wsContent, bScriptModify) ? wsContent : CFX_WideString();
-}
-CFX_WideString CXFA_Node::GetContent() {
-  return GetScriptContent();
-}
-FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent,
-                              FX_BOOL bScriptModify,
-                              FX_BOOL bProto) {
-  CXFA_Node* pNode = NULL;
-  switch (GetObjectType()) {
-    case XFA_OBJECTTYPE_ContainerNode:
-      if (GetClassID() == XFA_ELEMENT_ExclGroup) {
-        pNode = this;
-      } else {
-        CXFA_Node* pValue = GetChild(0, XFA_ELEMENT_Value);
-        if (!pValue) {
-          return FALSE;
-        }
-        CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-        if (pChildValue && XFA_FieldIsMultiListBox(this)) {
-          pChildValue->SetAttribute(XFA_ATTRIBUTE_ContentType,
-                                    FX_WSTRC(L"text/xml"));
-        }
-        return pChildValue
-                   ? pChildValue->TryContent(wsContent, bScriptModify, bProto)
-                   : FALSE;
-      }
-      break;
-    case XFA_OBJECTTYPE_ContentNode: {
-      CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!pContentRawDataNode) {
-        XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
-        if (GetClassID() == XFA_ELEMENT_ExData) {
-          CFX_WideString wsContentType;
-          GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
-          if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
-            element = XFA_ELEMENT_SharpxHTML;
-          } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
-            element = XFA_ELEMENT_Sharpxml;
-          }
-        }
-        pContentRawDataNode = CreateSamePacketNode(element);
-        InsertChild(pContentRawDataNode);
-      }
-      return pContentRawDataNode->TryContent(wsContent, bScriptModify, bProto);
-    }
-    case XFA_OBJECTTYPE_NodeC:
-    case XFA_OBJECTTYPE_NodeV:
-    case XFA_OBJECTTYPE_TextNode:
-      pNode = this;
-    default:
-      if (GetClassID() == XFA_ELEMENT_DataValue) {
-        pNode = this;
-      }
-      break;
-  }
-  if (pNode) {
-    if (bScriptModify) {
-      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-      if (pScriptContext) {
-        m_pDocument->GetScriptContext()->AddNodesOfRunScript(this);
-      }
-    }
-    return TryCData(XFA_ATTRIBUTE_Value, wsContent, FALSE, bProto);
-  }
-  return FALSE;
-}
-CXFA_Node* CXFA_Node::GetModelNode() {
-  switch (GetPacketID()) {
-    case XFA_XDPPACKET_XDP:
-      return m_pDocument->GetRoot();
-    case XFA_XDPPACKET_Config:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
-    case XFA_XDPPACKET_Template:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
-    case XFA_XDPPACKET_Form:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
-    case XFA_XDPPACKET_Datasets:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
-    case XFA_XDPPACKET_LocaleSet:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet));
-    case XFA_XDPPACKET_ConnectionSet:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet));
-    case XFA_XDPPACKET_SourceSet:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet));
-    case XFA_XDPPACKET_Xdc:
-      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc));
-    default:
-      return this;
-  }
-}
-FX_BOOL CXFA_Node::TryNamespace(CFX_WideString& wsNamespace) {
-  wsNamespace.Empty();
-  if (GetObjectType() == XFA_OBJECTTYPE_ModelNode ||
-      GetClassID() == XFA_ELEMENT_Packet) {
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (!pXMLNode || pXMLNode->GetType() != FDE_XMLNODE_Element) {
-      return FALSE;
-    }
-    ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
-    return TRUE;
-  } else if (GetPacketID() == XFA_XDPPACKET_Datasets) {
-    IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (!pXMLNode) {
-      return FALSE;
-    }
-    if (pXMLNode->GetType() != FDE_XMLNODE_Element) {
-      return TRUE;
-    }
-    if (GetClassID() == XFA_ELEMENT_DataValue &&
-        GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) {
-      return XFA_FDEExtension_ResolveNamespaceQualifier(
-          (IFDE_XMLElement*)pXMLNode, GetCData(XFA_ATTRIBUTE_QualifiedName),
-          wsNamespace);
-    }
-    ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
-    return TRUE;
-  } else {
-    CXFA_Node* pModelNode = GetModelNode();
-    return pModelNode->TryNamespace(wsNamespace);
-  }
-}
-CXFA_Node* CXFA_Node::GetProperty(int32_t index,
-                                  XFA_ELEMENT eProperty,
-                                  FX_BOOL bCreateProperty) {
-  XFA_ELEMENT eElement = GetClassID();
-  FX_DWORD dwPacket = GetPacketID();
-  const XFA_PROPERTY* pProperty =
-      XFA_GetPropertyOfElement(eElement, eProperty, dwPacket);
-  if (pProperty == NULL || index >= pProperty->uOccur) {
-    return NULL;
-  }
-  CXFA_Node* pNode = m_pChild;
-  int32_t iCount = 0;
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() == eProperty) {
-      iCount++;
-      if (iCount > index) {
-        return pNode;
-      }
-    }
-  }
-  if (!bCreateProperty) {
-    return NULL;
-  }
-  if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) {
-    pNode = m_pChild;
-    for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      const XFA_PROPERTY* pExistProperty =
-          XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket);
-      if (pExistProperty && (pExistProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
-        return NULL;
-      }
-    }
-  }
-  IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
-  const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(dwPacket);
-  CXFA_Node* pNewNode;
-  for (; iCount <= index; iCount++) {
-    pNewNode = pFactory->CreateNode(pPacket, eProperty);
-    if (!pNewNode) {
-      return NULL;
-    }
-    InsertChild(pNewNode, nullptr);
-    pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
-  }
-  return pNewNode;
-}
-int32_t CXFA_Node::CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild) {
-  CXFA_Node* pNode = m_pChild;
-  int32_t iCount = 0;
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
-      if (bOnlyChild) {
-        const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
-            GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-        if (pProperty) {
-          continue;
-        }
-      }
-      iCount++;
-    }
-  }
-  return iCount;
-}
-CXFA_Node* CXFA_Node::GetChild(int32_t index,
-                               XFA_ELEMENT eElement,
-                               FX_BOOL bOnlyChild) {
-  FXSYS_assert(index > -1);
-  CXFA_Node* pNode = m_pChild;
-  int32_t iCount = 0;
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
-      if (bOnlyChild) {
-        const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
-            GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-        if (pProperty) {
-          continue;
-        }
-      }
-      iCount++;
-      if (iCount > index) {
-        return pNode;
-      }
-    }
-  }
-  return NULL;
-}
-int32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
-  ASSERT(!pNode->m_pNext);
-  pNode->m_pParent = this;
-  FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
-  if (!bWasPurgeNode)
-    FXSYS_assert(false);
-
-  if (m_pChild == NULL || index == 0) {
-    if (index > 0) {
-      return -1;
-    }
-    pNode->m_pNext = m_pChild;
-    m_pChild = pNode;
-    index = 0;
-  } else if (index < 0) {
-    m_pLastChild->m_pNext = pNode;
-  } else {
-    CXFA_Node* pPrev = m_pChild;
-    int32_t iCount = 0;
-    while (++iCount != index && pPrev->m_pNext) {
-      pPrev = pPrev->m_pNext;
-    }
-    if (index > 0 && index != iCount) {
-      return -1;
-    }
-    pNode->m_pNext = pPrev->m_pNext;
-    pPrev->m_pNext = pNode;
-    index = iCount;
-  }
-  if (pNode->m_pNext == NULL) {
-    m_pLastChild = pNode;
-  }
-  ASSERT(m_pLastChild);
-  ASSERT(m_pLastChild->m_pNext == NULL);
-  pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (pNotify) {
-    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
-  }
-  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
-    FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
-    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index);
-    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
-  }
-  return index;
-}
-FX_BOOL CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
-  if (!pNode || pNode->m_pParent ||
-      (pBeforeNode && pBeforeNode->m_pParent != this)) {
-    FXSYS_assert(false);
-    return FALSE;
-  }
-  FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
-  if (!bWasPurgeNode)
-    FXSYS_assert(false);
-
-  int32_t nIndex = -1;
-  pNode->m_pParent = this;
-  if (m_pChild == NULL || pBeforeNode == m_pChild) {
-    pNode->m_pNext = m_pChild;
-    m_pChild = pNode;
-    nIndex = 0;
-  } else if (!pBeforeNode) {
-    pNode->m_pNext = m_pLastChild->m_pNext;
-    m_pLastChild->m_pNext = pNode;
-  } else {
-    nIndex = 1;
-    CXFA_Node* pPrev = m_pChild;
-    while (pPrev->m_pNext != pBeforeNode) {
-      pPrev = pPrev->m_pNext;
-      nIndex++;
-    }
-    pNode->m_pNext = pPrev->m_pNext;
-    pPrev->m_pNext = pNode;
-  }
-  if (pNode->m_pNext == NULL) {
-    m_pLastChild = pNode;
-  }
-  ASSERT(m_pLastChild);
-  ASSERT(m_pLastChild->m_pNext == NULL);
-  pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (pNotify) {
-    pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
-  }
-  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
-    FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
-    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex);
-    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() {
-  if (!m_pParent) {
-    return NULL;
-  }
-  for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling;
-       pSibling = pSibling->m_pNext) {
-    if (pSibling->m_pNext == this) {
-      return pSibling;
-    }
-  }
-  return NULL;
-}
-FX_BOOL CXFA_Node::RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify) {
-  if (pNode == NULL || pNode->m_pParent != this) {
-    FXSYS_assert(FALSE);
-    return FALSE;
-  }
-  if (m_pChild == pNode) {
-    m_pChild = pNode->m_pNext;
-    if (m_pLastChild == pNode) {
-      m_pLastChild = pNode->m_pNext;
-    }
-    pNode->m_pNext = NULL;
-    pNode->m_pParent = NULL;
-  } else {
-    CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling();
-    pPrev->m_pNext = pNode->m_pNext;
-    if (m_pLastChild == pNode) {
-      m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev;
-    }
-    pNode->m_pNext = NULL;
-    pNode->m_pParent = NULL;
-  }
-  ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL);
-  OnRemoved(this, pNode, bNotify);
-  pNode->SetFlag(XFA_NODEFLAG_HasRemoved);
-  m_pDocument->AddPurgeNode(pNode);
-  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
-    if (pNode->IsAttributeInXML()) {
-      FXSYS_assert(pNode->m_pXMLNode == m_pXMLNode &&
-                   m_pXMLNode->GetType() == FDE_XMLNODE_Element);
-      if (pNode->m_pXMLNode->GetType() == FDE_XMLNODE_Element) {
-        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)(pNode->m_pXMLNode);
-        CFX_WideStringC wsAttributeName =
-            pNode->GetCData(XFA_ATTRIBUTE_QualifiedName);
-        pXMLElement->RemoveAttribute(wsAttributeName.GetPtr());
-      }
-      CFX_WideString wsName;
-      pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
-      IFDE_XMLElement* pNewXMLElement = IFDE_XMLElement::Create(wsName);
-      CFX_WideStringC wsValue = GetCData(XFA_ATTRIBUTE_Value);
-      if (!wsValue.IsEmpty()) {
-        pNewXMLElement->SetTextData(wsValue);
-      }
-      pNode->m_pXMLNode = pNewXMLElement;
-      pNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
-    } else {
-      m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode);
-    }
-    pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_Node::GetFirstChildByName(const CFX_WideStringC& wsName) const {
-  return GetFirstChildByName(
-      wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
-                                                     wsName.GetLength()));
-}
-CXFA_Node* CXFA_Node::GetFirstChildByName(FX_DWORD dwNameHash) const {
-  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetNameHash() == dwNameHash) {
-      return pNode;
-    }
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const {
-  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() == eElement) {
-      return pNode;
-    }
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_DWORD dwNameHash) const {
-  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetNameHash() == dwNameHash) {
-      return pNode;
-    }
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_Node::GetNextSameNameSibling(
-    const CFX_WideStringC& wsNodeName) const {
-  return GetNextSameNameSibling(
-      wsNodeName.IsEmpty() ? 0
-                           : FX_HashCode_String_GetW(wsNodeName.GetPtr(),
-                                                     wsNodeName.GetLength()));
-}
-CXFA_Node* CXFA_Node::GetNextSameClassSibling(XFA_ELEMENT eElement) const {
-  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() == eElement) {
-      return pNode;
-    }
-  }
-  return NULL;
-}
-int32_t CXFA_Node::GetNodeSameNameIndex() const {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return -1;
-  }
-  return pScriptContext->GetIndexByName(const_cast<CXFA_Node*>(this));
-}
-int32_t CXFA_Node::GetNodeSameClassIndex() const {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return -1;
-  }
-  return pScriptContext->GetIndexByClassName(const_cast<CXFA_Node*>(this));
-}
-void CXFA_Node::GetSOMExpression(CFX_WideString& wsSOMExpression) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  pScriptContext->GetSomExpression(this, wsSOMExpression);
-}
-CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
-  CXFA_Node* pInstanceMgr = NULL;
-  if (m_ePacket == XFA_XDPPACKET_Form) {
-    CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-    if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) {
-      return pInstanceMgr;
-    }
-    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
-         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
-      XFA_ELEMENT eType = pNode->GetClassID();
-      if ((eType == XFA_ELEMENT_Subform || eType == XFA_ELEMENT_SubformSet) &&
-          pNode->m_dwNameHash != m_dwNameHash) {
-        break;
-      }
-      if (eType == XFA_ELEMENT_InstanceManager) {
-        CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
-        CFX_WideStringC wsInstName = pNode->GetCData(XFA_ATTRIBUTE_Name);
-        if (wsInstName.GetLength() > 0 && wsInstName.GetAt(0) == '_' &&
-            wsInstName.Mid(1) == wsName) {
-          pInstanceMgr = pNode;
-        }
-        break;
-      }
-    }
-  }
-  return pInstanceMgr;
-}
-CXFA_Node* CXFA_Node::GetOccurNode() {
-  return GetFirstChildByClass(XFA_ELEMENT_Occur);
-}
-FX_BOOL CXFA_Node::HasFlag(FX_DWORD dwFlag) const {
-  if (m_uFlags & dwFlag) {
-    return TRUE;
-  }
-  switch (dwFlag) {
-    case XFA_NODEFLAG_HasRemoved:
-      return m_pParent && m_pParent->HasFlag(dwFlag);
-    default:
-      break;
-  }
-  return FALSE;
-}
-void CXFA_Node::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn, FX_BOOL bNotify) {
-  if (bOn) {
-    switch (dwFlag) {
-      case XFA_NODEFLAG_Initialized:
-        if (bNotify && !HasFlag(XFA_NODEFLAG_Initialized)) {
-          IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-          if (pNotify) {
-            pNotify->OnNodeEvent(this, XFA_NODEEVENT_Ready);
-          }
-        }
-        break;
-      default:
-        break;
-    }
-    m_uFlags |= dwFlag;
-  } else {
-    m_uFlags &= ~dwFlag;
-  }
-}
-FX_BOOL CXFA_Node::IsAttributeInXML() {
-  return GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData;
-}
-void CXFA_Node::OnRemoved(CXFA_Node* pParent,
-                          CXFA_Node* pRemoved,
-                          FX_BOOL bNotify) {
-  if (bNotify && pParent) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (pNotify) {
-      pNotify->OnNodeEvent(pParent, XFA_NODEEVENT_ChildRemoved, pRemoved);
-    }
-  }
-}
-void CXFA_Node::OnChanging(XFA_ATTRIBUTE eAttr,
-                           void* pNewValue,
-                           FX_BOOL bNotify) {
-  if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (pNotify) {
-      pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanging,
-                           (void*)(uintptr_t)eAttr, pNewValue);
-    }
-  }
-}
-void CXFA_Node::OnChanged(XFA_ATTRIBUTE eAttr,
-                          void* pNewValue,
-                          FX_BOOL bNotify,
-                          FX_BOOL bScriptModify) {
-  if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
-    Script_Attribute_SendAttributeChangeMessage((void*)(uintptr_t)eAttr,
-                                                pNewValue, bScriptModify);
-  }
-}
-int32_t CXFA_Node::execSingleEventByName(const CFX_WideStringC& wsEventName,
-                                         XFA_ELEMENT eElementType) {
-  int32_t iRet = XFA_EVENTERROR_NotExist;
-  const XFA_ExecEventParaInfo* eventParaInfo =
-      GetEventParaInfoByName(wsEventName);
-  if (eventParaInfo) {
-    uint32_t validFlags = eventParaInfo->m_validFlags;
-    IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-    if (!pNotify) {
-      return iRet;
-    }
-    if (validFlags == 1) {
-      iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType);
-    } else if (validFlags == 2) {
-      iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                           FALSE, FALSE);
-    } else if (validFlags == 3) {
-      if (eElementType == XFA_ELEMENT_Subform) {
-        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                             FALSE, FALSE);
-      }
-    } else if (validFlags == 4) {
-      if (eElementType == XFA_ELEMENT_ExclGroup ||
-          eElementType == XFA_ELEMENT_Field) {
-        CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-        if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
-          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                               FALSE, FALSE);
-        }
-        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                             FALSE, FALSE);
-      }
-    } else if (validFlags == 5) {
-      if (eElementType == XFA_ELEMENT_Field) {
-        iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                             FALSE, FALSE);
-      }
-    } else if (validFlags == 6) {
-      CXFA_WidgetData* pWidgetData = GetWidgetData();
-      if (pWidgetData) {
-        CXFA_Node* pUINode = pWidgetData->GetUIChild();
-        if (pUINode->m_eNodeClass == XFA_ELEMENT_Signature) {
-          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                               FALSE, FALSE);
-        }
-      }
-    } else if (validFlags == 7) {
-      CXFA_WidgetData* pWidgetData = GetWidgetData();
-      if (pWidgetData) {
-        CXFA_Node* pUINode = pWidgetData->GetUIChild();
-        if ((pUINode->m_eNodeClass == XFA_ELEMENT_ChoiceList) &&
-            (!pWidgetData->IsListBox())) {
-          iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
-                                               FALSE, FALSE);
-        }
-      }
-    }
-  }
-  return iRet;
-}
-void CXFA_Node::UpdateNameHash() {
-  const XFA_NOTSUREATTRIBUTE* pNotsure =
-      XFA_GetNotsureAttribute(GetClassID(), XFA_ATTRIBUTE_Name);
-  if (!pNotsure || pNotsure->eType == XFA_ATTRIBUTETYPE_Cdata) {
-    CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
-    m_dwNameHash =
-        wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
-                                                       wsName.GetLength());
-  } else if (pNotsure->eType == XFA_ATTRIBUTETYPE_Enum) {
-    CFX_WideStringC wsName =
-        XFA_GetAttributeEnumByID(GetEnum(XFA_ATTRIBUTE_Name))->pName;
-    m_dwNameHash =
-        wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
-                                                       wsName.GetLength());
-  }
-}
-IFDE_XMLNode* CXFA_Node::CreateXMLMappingNode() {
-  if (!m_pXMLNode) {
-    CFX_WideStringC wsTag = GetCData(XFA_ATTRIBUTE_Name);
-    m_pXMLNode = IFDE_XMLElement::Create(wsTag);
-    SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-  }
-  return m_pXMLNode;
-}
-FX_BOOL CXFA_Node::IsNeedSavingXMLNode() {
-  return m_pXMLNode && (GetPacketID() == XFA_XDPPACKET_Datasets ||
-                        GetClassID() == XFA_ELEMENT_Xfa);
-}
-
-XFA_MAPMODULEDATA* CXFA_Node::CreateMapModuleData() {
-  if (!m_pMapModuleData)
-    m_pMapModuleData = new XFA_MAPMODULEDATA;
-  return m_pMapModuleData;
-}
-
-XFA_MAPMODULEDATA* CXFA_Node::GetMapModuleData() const {
-  return m_pMapModuleData;
-}
-
-void CXFA_Node::SetMapModuleValue(void* pKey, void* pValue) {
-  XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
-  pModule->m_ValueMap.SetAt(pKey, pValue);
-}
-
-FX_BOOL CXFA_Node::GetMapModuleValue(void* pKey, void*& pValue) {
-  CXFA_Node* pNode = this;
-  while (pNode) {
-    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
-    if (pModule && pModule->m_ValueMap.Lookup(pKey, pValue)) {
-      return TRUE;
-    }
-    pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets
-                ? pNode->GetTemplateNode()
-                : NULL;
-  }
-  return FALSE;
-}
-void CXFA_Node::SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue) {
-  SetMapModuleBuffer(pKey, (void*)wsValue.GetPtr(),
-                     wsValue.GetLength() * sizeof(FX_WCHAR));
-}
-FX_BOOL CXFA_Node::GetMapModuleString(void* pKey, CFX_WideStringC& wsValue) {
-  void* pValue;
-  int32_t iBytes;
-  if (!GetMapModuleBuffer(pKey, pValue, iBytes)) {
-    return FALSE;
-  }
-  wsValue = CFX_WideStringC((const FX_WCHAR*)pValue, iBytes / sizeof(FX_WCHAR));
-  return TRUE;
-}
-void CXFA_Node::SetMapModuleBuffer(
-    void* pKey,
-    void* pValue,
-    int32_t iBytes,
-    XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
-  XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
-  XFA_MAPDATABLOCK*& pBuffer = pModule->m_BufferMap[pKey];
-  if (pBuffer == NULL) {
-    pBuffer =
-        (XFA_MAPDATABLOCK*)FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes);
-  } else if (pBuffer->iBytes != iBytes) {
-    if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-      pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-    }
-    pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(uint8_t, pBuffer,
-                                            sizeof(XFA_MAPDATABLOCK) + iBytes);
-  } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-    pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-  }
-  if (pBuffer == NULL) {
-    return;
-  }
-  pBuffer->pCallbackInfo = pCallbackInfo;
-  pBuffer->iBytes = iBytes;
-  FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes);
-}
-FX_BOOL CXFA_Node::GetMapModuleBuffer(void* pKey,
-                                      void*& pValue,
-                                      int32_t& iBytes,
-                                      FX_BOOL bProtoAlso) const {
-  XFA_MAPDATABLOCK* pBuffer = NULL;
-  const CXFA_Node* pNode = this;
-  while (pNode) {
-    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
-    if (pModule && pModule->m_BufferMap.Lookup(pKey, pBuffer)) {
-      break;
-    }
-    pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
-                ? pNode->GetTemplateNode()
-                : NULL;
-  }
-  if (pBuffer == NULL) {
-    return FALSE;
-  }
-  pValue = pBuffer->GetData();
-  iBytes = pBuffer->iBytes;
-  return TRUE;
-}
-FX_BOOL CXFA_Node::HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso) {
-  CXFA_Node* pNode = this;
-  while (pNode) {
-    void* pVal;
-    XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
-    if (pModule &&
-        (pModule->m_ValueMap.Lookup(pKey, pVal) ||
-         pModule->m_BufferMap.Lookup(pKey, (XFA_MAPDATABLOCK*&)pVal))) {
-      return TRUE;
-    }
-    pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
-                ? pNode->GetTemplateNode()
-                : NULL;
-  }
-  return FALSE;
-}
-void CXFA_Node::RemoveMapModuleKey(void* pKey) {
-  XFA_MAPMODULEDATA* pModule = GetMapModuleData();
-  if (!pModule)
-    return;
-
-  if (pKey) {
-    XFA_MAPDATABLOCK* pBuffer = NULL;
-    pModule->m_BufferMap.Lookup(pKey, pBuffer);
-    if (pBuffer) {
-      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-      }
-      FX_Free(pBuffer);
-    }
-    pModule->m_BufferMap.RemoveKey(pKey);
-    pModule->m_ValueMap.RemoveKey(pKey);
-  } else {
-    XFA_MAPDATABLOCK* pBuffer;
-    FX_POSITION posBuffer = pModule->m_BufferMap.GetStartPosition();
-    while (posBuffer) {
-      pModule->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer);
-      if (pBuffer) {
-        if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-          pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-        }
-        FX_Free(pBuffer);
-      }
-    }
-    pModule->m_BufferMap.RemoveAll();
-    pModule->m_ValueMap.RemoveAll();
-    delete pModule;
-  }
-}
-void CXFA_Node::MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr) {
-  XFA_MAPMODULEDATA* pDstModuleData =
-      static_cast<CXFA_Node*>(pDstModule)->CreateMapModuleData();
-  XFA_MAPMODULEDATA* pSrcModuleData = GetMapModuleData();
-  if (!pSrcModuleData) {
-    return;
-  }
-  FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition();
-  while (psValue) {
-    void* pKey;
-    void* pValue;
-    pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue);
-    if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) {
-      pDstModuleData->m_ValueMap.SetAt(pKey, pValue);
-    }
-  }
-  FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition();
-  while (psBuffer) {
-    void* pKey;
-    XFA_MAPDATABLOCK* pSrcBuffer;
-    pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer);
-    XFA_MAPDATABLOCK*& pBuffer = pDstModuleData->m_BufferMap[pKey];
-    if (pBuffer && !bUseSrcAttr) {
-      continue;
-    }
-    if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree &&
-        !pSrcBuffer->pCallbackInfo->pCopy) {
-      if (pBuffer) {
-        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-        pDstModuleData->m_BufferMap.RemoveKey(pKey);
-      }
-      continue;
-    }
-    if (pBuffer == NULL) {
-      pBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
-          uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
-    } else if (pBuffer->iBytes != pSrcBuffer->iBytes) {
-      if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-        pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-      }
-      pBuffer = (XFA_MAPDATABLOCK*)FX_Realloc(
-          uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
-    } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
-      pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
-    }
-    if (pBuffer == NULL) {
-      continue;
-    }
-    pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
-    pBuffer->iBytes = pSrcBuffer->iBytes;
-    FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes);
-    if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) {
-      pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData());
-    }
-  }
-}
-void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, void* pKey) {
-  if (!pDstModule) {
-    return;
-  }
-  FX_BOOL bNeedMove = TRUE;
-  if (!pKey) {
-    bNeedMove = FALSE;
-  }
-  if (pDstModule->GetClassID() != GetClassID()) {
-    bNeedMove = FALSE;
-  }
-  XFA_MAPMODULEDATA* pSrcModuleData = NULL;
-  XFA_MAPMODULEDATA* pDstModuleData = NULL;
-  if (bNeedMove) {
-    pSrcModuleData = GetMapModuleData();
-    if (!pSrcModuleData) {
-      bNeedMove = FALSE;
-    }
-    pDstModuleData = pDstModule->CreateMapModuleData();
-  }
-  if (bNeedMove) {
-    void* pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey);
-    if (pBufferBlockData) {
-      pSrcModuleData->m_BufferMap.RemoveKey(pKey);
-      pDstModuleData->m_BufferMap.RemoveKey(pKey);
-      pDstModuleData->m_BufferMap.SetAt(pKey,
-                                        (XFA_MAPDATABLOCK*)pBufferBlockData);
-    }
-  }
-  if (pDstModule->GetObjectType() == XFA_OBJECTTYPE_NodeV) {
-    CFX_WideString wsValue = pDstModule->GetScriptContent(FALSE);
-    CFX_WideString wsFormatValue(wsValue);
-    CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData();
-    if (pWidgetData) {
-      pWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
-    }
-    pDstModule->SetScriptContent(wsValue, wsFormatValue, TRUE, TRUE);
-  }
-}
-void CXFA_Node::MoveBufferMapData(CXFA_Node* pSrcModule,
-                                  CXFA_Node* pDstModule,
-                                  void* pKey,
-                                  FX_BOOL bRecursive) {
-  if (!pSrcModule || !pDstModule || !pKey) {
-    return;
-  }
-  if (bRecursive) {
-    CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild);
-    CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pSrcChild && pDstChild;
-         pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling),
-         pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      MoveBufferMapData(pSrcChild, pDstChild, pKey, TRUE);
-    }
-  }
-  pSrcModule->MoveBufferMapData(pDstModule, pKey);
-}
-CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument)
-    : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) {
-  m_pDocument->GetScriptContext()->CacheList(this);
-}
-CXFA_Node* CXFA_NodeList::NamedItem(const CFX_WideStringC& wsName) {
-  int32_t iCount = GetLength();
-  FX_DWORD dwHashCode =
-      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_Node* ret = Item(i);
-    if (dwHashCode == ret->GetNameHash()) {
-      return ret;
-    }
-  }
-  return NULL;
-}
-void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pNode) {
-      Append(pNode);
-    } else {
-      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"append");
-  }
-}
-void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 2) {
-    CXFA_Node* pNewNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    CXFA_Node* pBeforeNode = static_cast<CXFA_Node*>(pArguments->GetObject(1));
-    if (pNewNode) {
-      Insert(pNewNode, pBeforeNode);
-    } else {
-      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insert");
-  }
-}
-void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pNode) {
-      Remove(pNode);
-    } else {
-      ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remove");
-  }
-}
-void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    int32_t iIndex = pArguments->GetInt32(0);
-    if ((iIndex >= 0) && (iIndex + 1 <= GetLength())) {
-      FXJSE_Value_Set(
-          pArguments->GetReturnValue(),
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex)));
-    } else {
-      ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
-    }
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"item");
-  }
-}
-void CXFA_NodeList::Script_TreelistClass_NamedItem(
-    CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString szName = pArguments->GetUTF8String(0);
-    CXFA_Node* pNode =
-        NamedItem(CFX_WideString::FromUTF8(szName, szName.GetLength()));
-    if (!pNode) {
-      return;
-    }
-    FXJSE_Value_Set(pArguments->GetReturnValue(),
-                    m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"namedItem");
-  }
-}
-void CXFA_NodeList::Script_ListClass_Length(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    FXJSE_Value_SetInteger(hValue, GetLength());
-  } else {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  }
-}
-CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument)
-    : CXFA_NodeList(pDocument) {}
-void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray& srcArray) {
-  if (srcArray.GetSize() > 0) {
-    m_array.Copy(srcArray);
-  }
-}
-int32_t CXFA_ArrayNodeList::GetLength() {
-  return m_array.GetSize();
-}
-FX_BOOL CXFA_ArrayNodeList::Append(CXFA_Node* pNode) {
-  m_array.Add(pNode);
-  return TRUE;
-}
-FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode,
-                                   CXFA_Node* pBeforeNode) {
-  if (pBeforeNode == NULL) {
-    m_array.Add(pNewNode);
-  } else {
-    int32_t iSize = m_array.GetSize();
-    for (int32_t i = 0; i < iSize; ++i) {
-      if (m_array[i] == pBeforeNode) {
-        m_array.InsertAt(i, pNewNode);
-        break;
-      }
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_ArrayNodeList::Remove(CXFA_Node* pNode) {
-  int32_t iSize = m_array.GetSize();
-  for (int32_t i = 0; i < iSize; ++i) {
-    if (m_array[i] == pNode) {
-      m_array.RemoveAt(i);
-      break;
-    }
-  }
-  return TRUE;
-}
-CXFA_Node* CXFA_ArrayNodeList::Item(int32_t iIndex) {
-  int32_t iSize = m_array.GetSize();
-  if (iIndex >= 0 && iIndex < iSize) {
-    return m_array[iIndex];
-  }
-  return NULL;
-}
-CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument,
-                                         CXFA_Node* pAttachNode)
-    : CXFA_NodeList(pDocument) {
-  m_pAttachNode = pAttachNode;
-}
-int32_t CXFA_AttachNodeList::GetLength() {
-  return m_pAttachNode->CountChildren(
-      XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
-}
-FX_BOOL CXFA_AttachNodeList::Append(CXFA_Node* pNode) {
-  CXFA_Node* pParent = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParent) {
-    pParent->RemoveChild(pNode);
-  }
-  return m_pAttachNode->InsertChild(pNode);
-}
-FX_BOOL CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode,
-                                    CXFA_Node* pBeforeNode) {
-  CXFA_Node* pParent = pNewNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParent) {
-    pParent->RemoveChild(pNewNode);
-  }
-  return m_pAttachNode->InsertChild(pNewNode, pBeforeNode);
-}
-FX_BOOL CXFA_AttachNodeList::Remove(CXFA_Node* pNode) {
-  return m_pAttachNode->RemoveChild(pNode);
-}
-CXFA_Node* CXFA_AttachNodeList::Item(int32_t iIndex) {
-  return m_pAttachNode->GetChild(
-      iIndex, XFA_ELEMENT_UNKNOWN,
-      m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
-}
diff --git a/xfa/src/fxfa/parser/xfa_objectacc_imp.cpp b/xfa/src/fxfa/parser/xfa_objectacc_imp.cpp
deleted file mode 100644
index 9515237..0000000
--- a/xfa/src/fxfa/parser/xfa_objectacc_imp.cpp
+++ /dev/null
@@ -1,3760 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-static FX_ARGB XFA_WStringToColor(const CFX_WideStringC& wsValue) {
-  uint8_t r = 0, g = 0, b = 0;
-  if (wsValue.GetLength() == 0) {
-    return 0xff000000;
-  }
-  int cc = 0;
-  const FX_WCHAR* str = wsValue.GetPtr();
-  int len = wsValue.GetLength();
-  while (XFA_IsSpace(str[cc]) && cc < len) {
-    cc++;
-  }
-  if (cc >= len) {
-    return 0xff000000;
-  }
-  while (cc < len) {
-    if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-      break;
-    }
-    r = r * 10 + str[cc] - '0';
-    cc++;
-  }
-  if (cc < len && str[cc] == ',') {
-    cc++;
-    while (XFA_IsSpace(str[cc]) && cc < len) {
-      cc++;
-    }
-    while (cc < len) {
-      if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-        break;
-      }
-      g = g * 10 + str[cc] - '0';
-      cc++;
-    }
-    if (cc < len && str[cc] == ',') {
-      cc++;
-      while (XFA_IsSpace(str[cc]) && cc < len) {
-        cc++;
-      }
-      while (cc < len) {
-        if (str[cc] == ',' || !XFA_IsDigit(str[cc])) {
-          break;
-        }
-        b = b * 10 + str[cc] - '0';
-        cc++;
-      }
-    }
-  }
-  return (0xff << 24) | (r << 16) | (g << 8) | b;
-}
-XFA_ELEMENT CXFA_Data::GetClassID() const {
-  return m_pNode ? m_pNode->GetClassID() : XFA_ELEMENT_UNKNOWN;
-}
-FX_BOOL CXFA_Data::TryMeasure(XFA_ATTRIBUTE eAttr,
-                              FX_FLOAT& fValue,
-                              FX_BOOL bUseDefault) const {
-  CXFA_Measurement ms;
-  if (m_pNode->TryMeasure(eAttr, ms, bUseDefault)) {
-    fValue = ms.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_Data::SetMeasure(XFA_ATTRIBUTE eAttr, FX_FLOAT fValue) {
-  CXFA_Measurement ms(fValue, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(eAttr, ms);
-}
-CXFA_Fill::CXFA_Fill(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-CXFA_Fill::~CXFA_Fill() {}
-int32_t CXFA_Fill::GetPresence() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-}
-void CXFA_Fill::SetColor(FX_ARGB color) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(color, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-}
-FX_ARGB CXFA_Fill::GetColor(FX_BOOL bText) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    if (pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE)) {
-      return XFA_WStringToColor(wsColor);
-    }
-  }
-  if (bText) {
-    return 0xFF000000;
-  }
-  return 0xFFFFFFFF;
-}
-int32_t CXFA_Fill::GetFillType() {
-  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChild) {
-    int32_t eType = pChild->GetClassID();
-    if (eType != XFA_ELEMENT_Color && eType != XFA_ELEMENT_Extras) {
-      return eType;
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return XFA_ELEMENT_Solid;
-}
-int32_t CXFA_Fill::GetPattern(FX_ARGB& foreColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    foreColor = XFA_WStringToColor(wsColor);
-  } else {
-    foreColor = 0xFF000000;
-  }
-  return pNode->GetEnum(XFA_ATTRIBUTE_Type);
-}
-int32_t CXFA_Fill::GetStipple(FX_ARGB& stippleColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
-  int32_t eAttr = 50;
-  pNode->TryInteger(XFA_ATTRIBUTE_Rate, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    stippleColor = XFA_WStringToColor(wsColor);
-  } else {
-    stippleColor = 0xFF000000;
-  }
-  return eAttr;
-}
-int32_t CXFA_Fill::GetLinear(FX_ARGB& endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
-  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    endColor = XFA_WStringToColor(wsColor);
-  } else {
-    endColor = 0xFF000000;
-  }
-  return eAttr;
-}
-int32_t CXFA_Fill::GetRadial(FX_ARGB& endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
-  pNode->TryEnum(XFA_ATTRIBUTE_Type, eAttr);
-  if (CXFA_Node* pColor = pNode->GetChild(0, XFA_ELEMENT_Color)) {
-    CFX_WideStringC wsColor;
-    pColor->TryCData(XFA_ATTRIBUTE_Value, wsColor, FALSE);
-    endColor = XFA_WStringToColor(wsColor);
-  } else {
-    endColor = 0xFF000000;
-  }
-  return eAttr;
-}
-FX_BOOL CXFA_Fill::SetPresence(int32_t iPresence) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
-}
-FX_BOOL CXFA_Fill::SetFillType(int32_t iType) {
-  return FALSE;
-}
-FX_BOOL CXFA_Fill::SetPattern(int32_t iPattern, FX_ARGB foreColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Pattern);
-  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(foreColor, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iPattern);
-}
-FX_BOOL CXFA_Fill::SetStipple(int32_t iStipple, FX_ARGB stippleColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Stipple);
-  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(stippleColor, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-  return pNode->SetEnum(XFA_ATTRIBUTE_Rate, (XFA_ATTRIBUTEENUM)iStipple);
-}
-FX_BOOL CXFA_Fill::SetLinear(int32_t iLinear, FX_ARGB endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Linear);
-  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(endColor, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iLinear);
-}
-FX_BOOL CXFA_Fill::SetRadial(int32_t iRadial, FX_ARGB endColor) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Radial);
-  CXFA_Node* pColor = pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(endColor, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pColor->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-  return pNode->SetEnum(XFA_ATTRIBUTE_Type, (XFA_ATTRIBUTEENUM)iRadial);
-}
-CXFA_Margin::CXFA_Margin(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_Margin::GetLeftInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetTopInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_TopInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetRightInset(FX_FLOAT& fInset, FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_RightInset, fInset);
-}
-FX_BOOL CXFA_Margin::GetBottomInset(FX_FLOAT& fInset,
-                                    FX_FLOAT fDefInset) const {
-  fInset = fDefInset;
-  return TryMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
-}
-FX_BOOL CXFA_Margin::SetLeftInset(FX_FLOAT fInset) {
-  return SetMeasure(XFA_ATTRIBUTE_LeftInset, fInset);
-}
-FX_BOOL CXFA_Margin::SetTopInset(FX_FLOAT fInset) {
-  return SetMeasure(XFA_ATTRIBUTE_TopInset, fInset);
-}
-FX_BOOL CXFA_Margin::SetRightInset(FX_FLOAT fInset) {
-  return SetMeasure(XFA_ATTRIBUTE_RightInset, fInset);
-}
-FX_BOOL CXFA_Margin::SetBottomInset(FX_FLOAT fInset) {
-  return SetMeasure(XFA_ATTRIBUTE_BottomInset, fInset);
-}
-CXFA_Font::CXFA_Font(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_FLOAT CXFA_Font::GetBaselineShift() {
-  return m_pNode->GetMeasure(XFA_ATTRIBUTE_BaselineShift).ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Font::GetHorizontalScale() {
-  CFX_WideString wsValue;
-  m_pNode->TryCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
-  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
-  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
-}
-FX_FLOAT CXFA_Font::GetVerticalScale() {
-  CFX_WideString wsValue;
-  m_pNode->TryCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
-  int32_t iScale = FXSYS_wtoi((const FX_WCHAR*)wsValue);
-  return iScale > 0 ? (FX_FLOAT)iScale : 100.0f;
-}
-FX_FLOAT CXFA_Font::GetLetterSpacing() {
-  CFX_WideStringC wsValue;
-  if (!m_pNode->TryCData(XFA_ATTRIBUTE_LetterSpacing, wsValue)) {
-    return 0;
-  }
-  CXFA_Measurement ms(wsValue);
-  if (ms.GetUnit() == XFA_UNIT_Em) {
-    return ms.GetValue() * GetFontSize();
-  }
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-int32_t CXFA_Font::GetLineThrough() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_LineThrough, iValue);
-  return iValue;
-}
-int32_t CXFA_Font::GetLineThroughPeriod() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_LineThroughPeriod, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Font::GetOverline() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_Overline, iValue);
-  return iValue;
-}
-int32_t CXFA_Font::GetOverlinePeriod() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_OverlinePeriod, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Font::GetUnderline() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_Underline, iValue);
-  return iValue;
-}
-int32_t CXFA_Font::GetUnderlinePeriod() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_All;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_UnderlinePeriod, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Font::GetFontSize() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_Size, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-void CXFA_Font::GetTypeface(CFX_WideStringC& wsTypeFace) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Typeface, wsTypeFace);
-}
-FX_BOOL CXFA_Font::IsBold() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Weight, eAttr);
-  return eAttr == XFA_ATTRIBUTEENUM_Bold;
-}
-FX_BOOL CXFA_Font::IsItalic() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Normal;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Posture, eAttr);
-  return eAttr == XFA_ATTRIBUTEENUM_Italic;
-}
-FX_BOOL CXFA_Font::IsUseKerning() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_KerningMode, eAttr);
-  return eAttr == XFA_ATTRIBUTEENUM_Pair;
-}
-void CXFA_Font::SetColor(FX_ARGB color) {
-  CXFA_Fill fill(m_pNode->GetProperty(0, XFA_ELEMENT_Fill));
-  fill.SetColor(color);
-}
-FX_ARGB CXFA_Font::GetColor() {
-  CXFA_Fill fill(m_pNode->GetChild(0, XFA_ELEMENT_Fill));
-  return fill ? fill.GetColor(TRUE) : 0xFF000000;
-}
-FX_BOOL CXFA_Font::SetBaselineShift(FX_FLOAT fBaselineShift) {
-  CXFA_Measurement ms(fBaselineShift, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_BaselineShift, ms);
-}
-FX_BOOL CXFA_Font::SetHorizontalScale(FX_FLOAT fHorizontalScale) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%d", (int32_t)fHorizontalScale);
-  return m_pNode->SetCData(XFA_ATTRIBUTE_FontHorizontalScale, wsValue);
-}
-FX_BOOL CXFA_Font::SetVerticalScale(FX_FLOAT fVerticalScale) {
-  CFX_WideString wsValue;
-  wsValue.Format(L"%d", (int32_t)fVerticalScale);
-  return m_pNode->SetCData(XFA_ATTRIBUTE_FontVerticalScale, wsValue);
-}
-FX_BOOL CXFA_Font::SetLetterSpacing(FX_FLOAT fLetterSpacing, XFA_UNIT eUnit) {
-  return FALSE;
-}
-FX_BOOL CXFA_Font::SetLineThrough(int32_t iLineThrough) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_LineThrough, iLineThrough);
-}
-FX_BOOL CXFA_Font::SetLineThroughPeriod(int32_t iLineThroughPeriod) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_LineThroughPeriod,
-                          (XFA_ATTRIBUTEENUM)iLineThroughPeriod);
-}
-FX_BOOL CXFA_Font::SetOverline(int32_t iOverline) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_Overline, iOverline);
-}
-FX_BOOL CXFA_Font::SetOverlinePeriod(int32_t iOverlinePeriod) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_OverlinePeriod,
-                          (XFA_ATTRIBUTEENUM)iOverlinePeriod);
-}
-FX_BOOL CXFA_Font::SetUnderline(int32_t iUnderline) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_Underline, iUnderline);
-}
-FX_BOOL CXFA_Font::SetUnderlinePeriod(int32_t iUnderlinePeriod) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_UnderlinePeriod,
-                          (XFA_ATTRIBUTEENUM)iUnderlinePeriod);
-}
-CXFA_Caption::CXFA_Caption(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Caption::GetPresence() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Visible;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Presence, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Caption::GetPlacementType() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Placement, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Caption::GetReserve() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_Reserve, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-CXFA_Margin CXFA_Caption::GetMargin() {
-  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) : NULL);
-}
-CXFA_Font CXFA_Caption::GetFont() {
-  return CXFA_Font(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Font) : NULL);
-}
-CXFA_Value CXFA_Caption::GetValue() {
-  return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Value) : NULL);
-}
-CXFA_Para CXFA_Caption::GetPara() {
-  return CXFA_Para(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Para) : NULL);
-}
-FX_BOOL CXFA_Caption::SetPresence(int32_t iPresence) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
-}
-FX_BOOL CXFA_Caption::SetPlacementType(int32_t iType) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Placement, (XFA_ATTRIBUTEENUM)iType);
-}
-FX_BOOL CXFA_Caption::SetReserve(FX_FLOAT fReserve) {
-  CXFA_Measurement ms(fReserve, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_Reserve, ms);
-}
-CXFA_Para::CXFA_Para(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Para::GetHorizontalAlign() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Left;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_HAlign, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Para::GetVerticalAlign() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_Top;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_VAlign, eAttr);
-  return eAttr;
-}
-FX_FLOAT CXFA_Para::GetLineHeight() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_LineHeight, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetMarginLeft() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetMarginRight() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_MarginRight, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-int32_t CXFA_Para::GetOrphans() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_Orphans, iValue);
-  return iValue;
-}
-FX_FLOAT CXFA_Para::GetRadixOffset() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetSpaceAbove() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetSpaceBelow() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-FX_FLOAT CXFA_Para::GetTextIndent() {
-  CXFA_Measurement ms;
-  m_pNode->TryMeasure(XFA_ATTRIBUTE_TextIndent, ms);
-  return ms.ToUnit(XFA_UNIT_Pt);
-}
-int32_t CXFA_Para::GetWidows() {
-  int32_t iValue = 0;
-  m_pNode->TryInteger(XFA_ATTRIBUTE_Widows, iValue);
-  return iValue;
-}
-FX_BOOL CXFA_Para::SetHorizontalAlign(int32_t iHorizontalAlign) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_HAlign,
-                          (XFA_ATTRIBUTEENUM)iHorizontalAlign);
-}
-FX_BOOL CXFA_Para::SetVerticalAlign(int32_t iVerticalAlign) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_VAlign,
-                          (XFA_ATTRIBUTEENUM)iVerticalAlign);
-}
-FX_BOOL CXFA_Para::SetLineHeight(FX_FLOAT fLineHeight) {
-  CXFA_Measurement ms;
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_LineHeight, ms);
-}
-FX_BOOL CXFA_Para::SetMarginLeft(FX_FLOAT fMarginLeft) {
-  CXFA_Measurement ms(fMarginLeft, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginLeft, ms);
-}
-FX_BOOL CXFA_Para::SetMarginRight(FX_FLOAT fMarginRight) {
-  CXFA_Measurement ms(fMarginRight, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_MarginRight, ms);
-}
-FX_BOOL CXFA_Para::SetOrphans(int32_t iOrphans) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_Orphans, iOrphans);
-}
-FX_BOOL CXFA_Para::SetRadixOffset(FX_FLOAT fRadixOffset) {
-  CXFA_Measurement ms(fRadixOffset, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_RadixOffset, ms);
-}
-FX_BOOL CXFA_Para::SetSpaceAbove(FX_FLOAT fSpaceAbove) {
-  CXFA_Measurement ms(fSpaceAbove, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceAbove, ms);
-}
-FX_BOOL CXFA_Para::SetSpaceBelow(FX_FLOAT fSpaceBelow) {
-  CXFA_Measurement ms(fSpaceBelow, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_SpaceBelow, ms);
-}
-FX_BOOL CXFA_Para::SetTextIndent(FX_FLOAT fTextIndent) {
-  CXFA_Measurement ms(fTextIndent, XFA_UNIT_Pt);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_TextIndent, ms);
-}
-FX_BOOL CXFA_Para::SetWidows(int32_t iWidows) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_Widows, iWidows);
-}
-CXFA_Keep::CXFA_Keep(CXFA_Node* pNode, CXFA_Node* pParent)
-    : CXFA_Data(pNode), m_pParent(pParent) {}
-int32_t CXFA_Keep::GetIntact() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
-  switch (m_pParent->GetClassID()) {
-    case XFA_ELEMENT_Subform: {
-      XFA_ATTRIBUTEENUM eAttrSubForm;
-      m_pParent->TryEnum(XFA_ATTRIBUTE_Layout, eAttrSubForm);
-      if (eAttrSubForm == XFA_ATTRIBUTEENUM_Position ||
-          eAttrSubForm == XFA_ATTRIBUTEENUM_Row) {
-        eAttr = XFA_ATTRIBUTEENUM_ContentArea;
-      }
-    } break;
-    case XFA_ELEMENT_Draw:
-      eAttr = XFA_ATTRIBUTEENUM_ContentArea;
-      break;
-    default:
-      break;
-  }
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Intact, eAttr, FALSE);
-  return eAttr;
-}
-int32_t CXFA_Keep::GetNext() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Next, eAttr);
-  return eAttr;
-}
-int32_t CXFA_Keep::GetPrevious() {
-  XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_None;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Previous, eAttr);
-  return eAttr;
-}
-FX_BOOL CXFA_Keep::SetIntact(int32_t iIntact) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Intact, (XFA_ATTRIBUTEENUM)iIntact);
-}
-FX_BOOL CXFA_Keep::SetNext(int32_t iNext) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Next, (XFA_ATTRIBUTEENUM)iNext);
-}
-FX_BOOL CXFA_Keep::SetPrevious(int32_t iPrevious) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Previous, (XFA_ATTRIBUTEENUM)iPrevious);
-}
-CXFA_Event::CXFA_Event(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Event::GetActivity() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Activity);
-}
-int32_t CXFA_Event::GetEventType() {
-  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChild) {
-    int32_t eType = pChild->GetClassID();
-    if (eType != XFA_ELEMENT_Extras) {
-      return eType;
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return XFA_ELEMENT_UNKNOWN;
-}
-void CXFA_Event::GetRef(CFX_WideStringC& wsRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-int32_t CXFA_Event::GetExecuteRunAt() {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  return pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
-}
-int32_t CXFA_Event::GetExecuteType() {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  return pNode->GetEnum(XFA_ATTRIBUTE_ExecuteType);
-}
-void CXFA_Event::GetExecuteConnection(CFX_WideString& wsConnection) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  CFX_WideStringC cData;
-  pNode->TryCData(XFA_ATTRIBUTE_Connection, cData);
-  wsConnection = cData;
-}
-CXFA_Script CXFA_Event::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-CXFA_Submit CXFA_Event::GetSubmit() {
-  return CXFA_Submit(m_pNode->GetChild(0, XFA_ELEMENT_Submit));
-}
-int32_t CXFA_Event::GetSignDataOperation() {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
-  return pNode->GetEnum(XFA_ATTRIBUTE_Operation);
-}
-void CXFA_Event::GetSignDataTarget(CFX_WideString& wsTarget) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
-    CFX_WideStringC wsCData;
-    pNode->TryCData(XFA_ATTRIBUTE_Target, wsCData);
-    wsTarget = wsCData;
-  }
-}
-FX_BOOL CXFA_Event::SetActivity(int32_t iActivity) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Activity, (XFA_ATTRIBUTEENUM)iActivity);
-}
-FX_BOOL CXFA_Event::SetEventType(int32_t iEventType) {
-  return FALSE;
-}
-FX_BOOL CXFA_Event::SetExecuteRunAt(int32_t iExecuteRunAt) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  return pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iExecuteRunAt);
-}
-FX_BOOL CXFA_Event::SetExecuteType(int32_t iExecuteType) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  return pNode->SetEnum(XFA_ATTRIBUTE_ExecuteType,
-                        (XFA_ATTRIBUTEENUM)iExecuteType);
-}
-FX_BOOL CXFA_Event::SetExecuteConnection(const CFX_WideString& wsConnection) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Execute);
-  return pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
-}
-FX_BOOL CXFA_Event::SetSignDataOperation(int32_t iOperation) {
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData);
-  return pNode->SetEnum(XFA_ATTRIBUTE_Operation, (XFA_ATTRIBUTEENUM)iOperation);
-}
-FX_BOOL CXFA_Event::SetSignDataTarget(const CFX_WideString& wsTarget) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_SignData)) {
-    return pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
-  }
-  return FALSE;
-}
-CXFA_Script::CXFA_Script(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_Script::GetBinding(CFX_WideString& wsBinding) {
-  CFX_WideStringC cData;
-  m_pNode->TryCData(XFA_ATTRIBUTE_Binding, cData);
-  wsBinding = cData;
-}
-XFA_SCRIPTTYPE CXFA_Script::GetContentType() {
-  CFX_WideStringC cData;
-  if (m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, cData, FALSE)) {
-    if (cData == FX_WSTRC(L"application/x-javascript")) {
-      return XFA_SCRIPTTYPE_Javascript;
-    } else if (cData == FX_WSTRC(L"application/x-formcalc")) {
-      return XFA_SCRIPTTYPE_Formcalc;
-    } else {
-      return XFA_SCRIPTTYPE_Unkown;
-    }
-  }
-  return XFA_SCRIPTTYPE_Formcalc;
-}
-int32_t CXFA_Script::GetRunAt() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_RunAt);
-}
-void CXFA_Script::GetExpression(CFX_WideString& wsExpression) {
-  m_pNode->TryContent(wsExpression);
-}
-FX_BOOL CXFA_Script::SetBinding(const CFX_WideString& wsBinding) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Binding, wsBinding);
-}
-FX_BOOL CXFA_Script::SetContentType(XFA_SCRIPTTYPE eType) {
-  CFX_WideString wsType;
-  switch (eType) {
-    case XFA_SCRIPTTYPE_Javascript:
-      wsType = L"application/x-javascript";
-      break;
-    case XFA_SCRIPTTYPE_Formcalc:
-      wsType = L"application/x-formcalc";
-      break;
-    default:
-      break;
-  }
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsType);
-}
-FX_BOOL CXFA_Script::SetRunAt(int32_t iRunAt) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_RunAt, (XFA_ATTRIBUTEENUM)iRunAt);
-}
-FX_BOOL CXFA_Script::SetExpression(const CFX_WideString& wsExpression) {
-  return m_pNode->SetContent(wsExpression, wsExpression);
-}
-CXFA_Submit::CXFA_Submit(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_Submit::IsSubmitEmbedPDF() {
-  return m_pNode->GetBoolean(XFA_ATTRIBUTE_EmbedPDF);
-}
-int32_t CXFA_Submit::GetSubmitFormat() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Format);
-}
-void CXFA_Submit::GetSubmitTarget(CFX_WideStringC& wsTarget) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Target, wsTarget);
-}
-XFA_TEXTENCODING CXFA_Submit::GetSubmitTextEncoding() {
-  CFX_WideStringC wsCData;
-  if (!m_pNode->TryCData(XFA_ATTRIBUTE_TextEncoding, wsCData)) {
-    return XFA_TEXTENCODING_None;
-  }
-  CFX_WideString wsValue(wsCData);
-  if (wsValue == L"Big-Five") {
-    return XFA_TEXTENCODING_Big5;
-  } else if (wsValue == L"fontSpecific") {
-    return XFA_TEXTENCODING_FontSpecific;
-  } else if (wsValue == L"GBK") {
-    return XFA_TEXTENCODING_GBK;
-  } else if (wsValue == L"GB-18030") {
-    return XFA_TEXTENCODING_GB18030;
-  } else if (wsValue == L"GB-2312") {
-    return XFA_TEXTENCODING_GB2312;
-  } else if (wsValue == L"ISO-8859-NN") {
-    return XFA_TEXTENCODING_ISO8859NN;
-  } else if (wsValue == L"KSC-5601") {
-    return XFA_TEXTENCODING_KSC5601;
-  } else if (wsValue == L"Shift-JIS") {
-    return XFA_TEXTENCODING_ShiftJIS;
-  } else if (wsValue == L"UCS-2") {
-    return XFA_TEXTENCODING_UCS2;
-  } else if (wsValue == L"UTF-16") {
-    return XFA_TEXTENCODING_UTF16;
-  } else if (wsValue == L"UTF-8") {
-    return XFA_TEXTENCODING_UTF8;
-  }
-  return XFA_TEXTENCODING_None;
-}
-void CXFA_Submit::GetSubmitXDPContent(CFX_WideStringC& wsContent) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_XdpContent, wsContent);
-}
-FX_BOOL CXFA_Submit::SetSubmitFormat(int32_t iSubmitFormat) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Format,
-                          (XFA_ATTRIBUTEENUM)iSubmitFormat);
-}
-FX_BOOL CXFA_Submit::SetSubmitTarget(const CFX_WideString& wsTarget) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Target, wsTarget);
-}
-FX_BOOL CXFA_Submit::SetSubmitTextEncoding(XFA_TEXTENCODING eTextEncoding) {
-  CFX_WideString wsValue;
-  switch (eTextEncoding) {
-    case XFA_TEXTENCODING_Big5:
-      wsValue = L"Big-Five";
-      break;
-    case XFA_TEXTENCODING_FontSpecific:
-      wsValue = L"fontSpecific";
-      break;
-    case XFA_TEXTENCODING_GBK:
-      wsValue = L"GBK";
-      break;
-    case XFA_TEXTENCODING_GB18030:
-      wsValue = L"GB-18030";
-      break;
-    case XFA_TEXTENCODING_GB2312:
-      wsValue = L"GB-2312";
-      break;
-    case XFA_TEXTENCODING_ISO8859NN:
-      wsValue = L"ISO-8859-NN";
-      break;
-    case XFA_TEXTENCODING_KSC5601:
-      wsValue = L"KSC-5601";
-      break;
-    case XFA_TEXTENCODING_ShiftJIS:
-      wsValue = L"Shift-JIS";
-      break;
-    case XFA_TEXTENCODING_UCS2:
-      wsValue = L"UCS-2";
-      break;
-    case XFA_TEXTENCODING_UTF16:
-      wsValue = L"UTF-16";
-      break;
-    case XFA_TEXTENCODING_UTF8:
-      wsValue = L"UTF-8";
-      break;
-    default:
-      break;
-  }
-  return m_pNode->SetCData(XFA_ATTRIBUTE_TextEncoding, wsValue);
-}
-FX_BOOL CXFA_Submit::SetSubmitXDPContent(const CFX_WideString& wsContent) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_XdpContent, wsContent);
-}
-XFA_ELEMENT CXFA_Value::GetChildValueClassID() {
-  if (!m_pNode) {
-    return XFA_ELEMENT_UNKNOWN;
-  }
-  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-    return pNode->GetClassID();
-  }
-  return XFA_ELEMENT_UNKNOWN;
-}
-FX_BOOL CXFA_Value::GetChildValueContent(CFX_WideString& wsContent) {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-    return pNode->TryContent(wsContent);
-  }
-  return FALSE;
-}
-CXFA_Arc CXFA_Value::GetArc() {
-  return CXFA_Arc(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                          : nullptr);
-}
-CXFA_Line CXFA_Value::GetLine() {
-  return CXFA_Line(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                           : nullptr);
-}
-CXFA_Rectangle CXFA_Value::GetRectangle() {
-  return CXFA_Rectangle(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                                : nullptr);
-}
-CXFA_Text CXFA_Value::GetText() {
-  return CXFA_Text(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                           : nullptr);
-}
-CXFA_ExData CXFA_Value::GetExData() {
-  return CXFA_ExData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
-                             : nullptr);
-}
-CXFA_Image CXFA_Value::GetImage() {
-  return CXFA_Image(
-      m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : nullptr,
-      TRUE);
-}
-FX_BOOL CXFA_Value::SetChildValueContent(const CFX_WideString& wsContent,
-                                         FX_BOOL bNotify,
-                                         XFA_ELEMENT iType) {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (!pNode) {
-    if (iType == XFA_ELEMENT_UNKNOWN) {
-      return FALSE;
-    }
-    pNode = m_pNode->GetProperty(0, iType);
-  }
-  CFX_WideString wsFormatContent(wsContent);
-  CXFA_WidgetData* pContainerWidgetData = pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsContent, wsFormatContent);
-  }
-  return pNode->SetContent(wsContent, wsFormatContent, bNotify);
-}
-int32_t CXFA_Line::GetHand() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
-}
-FX_BOOL CXFA_Line::GetSlop() {
-  XFA_ATTRIBUTEENUM eSlop = m_pNode->GetEnum(XFA_ATTRIBUTE_Slope);
-  return eSlop == XFA_ATTRIBUTEENUM_Slash;
-}
-CXFA_Edge CXFA_Line::GetEdge() {
-  return CXFA_Edge(m_pNode->GetChild(0, XFA_ELEMENT_Edge));
-}
-FX_BOOL CXFA_Line::SetHand(int32_t iHand) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Hand, (XFA_ATTRIBUTEENUM)iHand);
-}
-FX_BOOL CXFA_Line::SetSlop(int32_t iSlop) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Slope, (XFA_ATTRIBUTEENUM)iSlop);
-}
-CXFA_Text::CXFA_Text(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_Text::GetName(CFX_WideStringC& wsName) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-}
-int32_t CXFA_Text::GetMaxChars() {
-  return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxChars);
-}
-void CXFA_Text::GetRid(CFX_WideStringC& wsRid) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
-}
-void CXFA_Text::GetContent(CFX_WideString& wsText) {
-  m_pNode->TryContent(wsText);
-}
-void CXFA_Text::SetContent(CFX_WideString wsText, FX_BOOL bNotify) {
-  CFX_WideString wsFormatValue(wsText);
-  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
-  }
-  m_pNode->SetContent(wsText, wsFormatValue, bNotify);
-}
-FX_BOOL CXFA_Text::SetName(const CFX_WideString& wsName) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
-}
-FX_BOOL CXFA_Text::SetMaxChars(int32_t iMaxChars) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxChars, iMaxChars);
-}
-FX_BOOL CXFA_Text::SetRid(const CFX_WideString& wsRid) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
-}
-CXFA_ExData::CXFA_ExData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_ExData::GetContentType(CFX_WideStringC& wsContentType) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-void CXFA_ExData::GetHref(CFX_WideStringC& wsHref) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
-}
-int32_t CXFA_ExData::GetMaxLength() {
-  return m_pNode->GetInteger(XFA_ATTRIBUTE_MaxLength);
-}
-void CXFA_ExData::GetRid(CFX_WideStringC& wsRid) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Rid, wsRid);
-}
-int32_t CXFA_ExData::GetTransferEncoding() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
-}
-void CXFA_ExData::GetContent(CFX_WideString& wsText) {
-  m_pNode->TryContent(wsText);
-}
-FX_BOOL CXFA_ExData::SetContentType(const CFX_WideString& wsContentType) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-FX_BOOL CXFA_ExData::SetHref(const CFX_WideString& wsHref) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
-}
-FX_BOOL CXFA_ExData::SetMaxLength(int32_t iMaxLength) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_MaxLength, iMaxLength);
-}
-FX_BOOL CXFA_ExData::SetRid(const CFX_WideString& wsRid) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Rid, wsRid);
-}
-FX_BOOL CXFA_ExData::SetTransferEncoding(int32_t iTransferEncoding) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
-                          (XFA_ATTRIBUTEENUM)iTransferEncoding);
-}
-FX_BOOL CXFA_ExData::SetContent(const CFX_WideString& wsText,
-                                FX_BOOL bNotify,
-                                FX_BOOL bScriptModify,
-                                FX_BOOL bSyncData) {
-  CFX_WideString wsFormatValue(wsText);
-  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
-  }
-  return m_pNode->SetContent(wsText, wsFormatValue, bNotify, bScriptModify,
-                             bSyncData);
-}
-CXFA_Image::CXFA_Image(CXFA_Node* pNode, FX_BOOL bDefValue)
-    : CXFA_Data(pNode), m_bDefValue(bDefValue) {}
-int32_t CXFA_Image::GetAspect() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Aspect);
-}
-FX_BOOL CXFA_Image::GetContentType(CFX_WideString& wsContentType) {
-  return m_pNode->TryCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-FX_BOOL CXFA_Image::GetHref(CFX_WideString& wsHref) {
-  if (m_bDefValue) {
-    return m_pNode->TryCData(XFA_ATTRIBUTE_Href, wsHref);
-  }
-  return m_pNode->GetAttribute(FX_WSTRC(L"href"), wsHref);
-}
-int32_t CXFA_Image::GetTransferEncoding() {
-  if (m_bDefValue) {
-    return m_pNode->GetEnum(XFA_ATTRIBUTE_TransferEncoding);
-  }
-  return XFA_ATTRIBUTEENUM_Base64;
-}
-FX_BOOL CXFA_Image::GetContent(CFX_WideString& wsText) {
-  return m_pNode->TryContent(wsText);
-}
-FX_BOOL CXFA_Image::SetAspect(int32_t iAspect) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Aspect, (XFA_ATTRIBUTEENUM)iAspect);
-}
-FX_BOOL CXFA_Image::SetContentType(const CFX_WideString& wsContentType) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
-}
-FX_BOOL CXFA_Image::SetHref(const CFX_WideString& wsHref) {
-  if (m_bDefValue) {
-    return m_pNode->SetCData(XFA_ATTRIBUTE_Href, wsHref);
-  }
-  return m_pNode->SetAttribute(XFA_ATTRIBUTE_Href, wsHref);
-}
-FX_BOOL CXFA_Image::SetTransferEncoding(int32_t iTransferEncoding) {
-  if (m_bDefValue) {
-    return m_pNode->SetEnum(XFA_ATTRIBUTE_TransferEncoding,
-                            (XFA_ATTRIBUTEENUM)iTransferEncoding);
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Image::SetContent(const CFX_WideString& wsText) {
-  CFX_WideString wsFormatValue(wsText);
-  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsText, wsFormatValue);
-  }
-  return m_pNode->SetContent(wsText, wsFormatValue);
-}
-CXFA_Calculate::CXFA_Calculate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Calculate::GetOverride() {
-  XFA_ATTRIBUTEENUM eAtt = XFA_ATTRIBUTEENUM_Error;
-  m_pNode->TryEnum(XFA_ATTRIBUTE_Override, eAtt, FALSE);
-  return eAtt;
-}
-CXFA_Script CXFA_Calculate::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-void CXFA_Calculate::GetMessageText(CFX_WideString& wsMessage) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
-    CXFA_Text text(pNode->GetChild(0, XFA_ELEMENT_Text));
-    if (text) {
-      text.GetContent(wsMessage);
-    }
-  }
-}
-FX_BOOL CXFA_Calculate::SetOverride(int32_t iOverride) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Override, (XFA_ATTRIBUTEENUM)iOverride);
-}
-FX_BOOL CXFA_Calculate::SetMessageText(const CFX_WideString& wsMessage) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Message)) {
-    CXFA_Node* pChildNode = pNode->GetProperty(0, XFA_ELEMENT_Text);
-    return pChildNode->SetContent(wsMessage, wsMessage);
-  }
-  return FALSE;
-}
-CXFA_Validate::CXFA_Validate(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Validate::GetFormatTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_FormatTest);
-}
-FX_BOOL CXFA_Validate::SetTestValue(int32_t iType,
-                                    CFX_WideString& wsValue,
-                                    XFA_ATTRIBUTEENUM eName) {
-  const XFA_ATTRIBUTEENUMINFO* pInfo = XFA_GetAttributeEnumByName(wsValue);
-  if (pInfo) {
-    eName = pInfo->eName;
-  }
-  m_pNode->SetEnum((XFA_ATTRIBUTE)iType, eName, FALSE);
-  return TRUE;
-}
-FX_BOOL CXFA_Validate::SetFormatTest(CFX_WideString wsValue) {
-  return SetTestValue(XFA_ATTRIBUTE_FormatTest, wsValue,
-                      XFA_ATTRIBUTEENUM_Warning);
-}
-FX_BOOL CXFA_Validate::SetNullTest(CFX_WideString wsValue) {
-  return SetTestValue(XFA_ATTRIBUTE_NullTest, wsValue,
-                      XFA_ATTRIBUTEENUM_Disabled);
-}
-int32_t CXFA_Validate::GetNullTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_NullTest);
-}
-int32_t CXFA_Validate::GetScriptTest() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_ScriptTest);
-}
-void CXFA_Validate::GetMessageText(CFX_WideString& wsMessage,
-                                   const CFX_WideStringC& wsMessageType) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, FALSE)) {
-    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pItemNode;
-         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
-        continue;
-      }
-      CFX_WideStringC wsName;
-      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName.IsEmpty() || wsName == wsMessageType) {
-        pItemNode->TryContent(wsMessage);
-        return;
-      }
-    }
-  }
-}
-void CXFA_Validate::SetFormatMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
-}
-void CXFA_Validate::GetFormatMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"formatTest"));
-}
-void CXFA_Validate::SetNullMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
-}
-void CXFA_Validate::GetNullMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"nullTest"));
-}
-void CXFA_Validate::SetMessageText(CFX_WideString& wsMessage,
-                                   const CFX_WideStringC& wsMessageType) {
-  if (CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Message, TRUE)) {
-    CXFA_Node* pItemNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pItemNode;
-         pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pItemNode->GetClassID() != XFA_ELEMENT_Text) {
-        continue;
-      }
-      CFX_WideStringC wsName;
-      pItemNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName.IsEmpty() || wsName == wsMessageType) {
-        pItemNode->SetContent(wsMessage, wsMessage, FALSE);
-        return;
-      }
-    }
-    CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_ELEMENT_Text);
-    pNode->InsertChild(pTextNode);
-    pTextNode->SetCData(XFA_ATTRIBUTE_Name, wsMessageType, FALSE);
-    pTextNode->SetContent(wsMessage, wsMessage, FALSE);
-  }
-}
-void CXFA_Validate::GetScriptMessageText(CFX_WideString& wsMessage) {
-  GetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
-}
-void CXFA_Validate::SetScriptMessageText(CFX_WideString wsMessage) {
-  SetMessageText(wsMessage, FX_WSTRC(L"scriptTest"));
-}
-void CXFA_Validate::GetPicture(CFX_WideString& wsPicture) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
-    pNode->TryContent(wsPicture);
-  }
-}
-CXFA_Script CXFA_Validate::GetScript() {
-  return CXFA_Script(m_pNode->GetChild(0, XFA_ELEMENT_Script));
-}
-CXFA_Variables::CXFA_Variables(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Variables::CountScripts() {
-  return m_pNode->CountChildren(XFA_ELEMENT_Script);
-}
-CXFA_Script CXFA_Variables::GetScript(int32_t nIndex) {
-  return CXFA_Script(m_pNode->GetChild(nIndex, XFA_ELEMENT_Script));
-}
-CXFA_Bind::CXFA_Bind(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Bind::GetMatch() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Match);
-}
-void CXFA_Bind::GetRef(CFX_WideStringC& wsRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-void CXFA_Bind::GetPicture(CFX_WideString& wsPicture) {
-  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
-    pPicture->TryContent(wsPicture);
-  }
-}
-FX_BOOL CXFA_Bind::SetMatch(int32_t iMatch) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Match, (XFA_ATTRIBUTEENUM)iMatch);
-}
-FX_BOOL CXFA_Bind::SetRef(const CFX_WideString& wsRef) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-FX_BOOL CXFA_Bind::SetPicture(const CFX_WideString& wsPicture) {
-  if (CXFA_Node* pPicture = m_pNode->GetChild(0, XFA_ELEMENT_Picture)) {
-    return pPicture->SetContent(wsPicture, wsPicture);
-  }
-  return FALSE;
-}
-CXFA_Assist::CXFA_Assist(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-CXFA_ToolTip CXFA_Assist::GetToolTip() {
-  return CXFA_ToolTip(m_pNode->GetChild(0, XFA_ELEMENT_ToolTip));
-}
-CXFA_ToolTip::CXFA_ToolTip(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-FX_BOOL CXFA_ToolTip::GetTip(CFX_WideString& wsTip) {
-  return m_pNode->TryContent(wsTip);
-}
-FX_BOOL CXFA_ToolTip::SetTip(const CFX_WideString& wsTip) {
-  return m_pNode->SetContent(wsTip, wsTip);
-}
-CXFA_BindItems::CXFA_BindItems(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-void CXFA_BindItems::GetConnection(CFX_WideStringC& wsConnection) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Connection, wsConnection);
-}
-void CXFA_BindItems::GetLabelRef(CFX_WideStringC& wsLabelRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
-}
-void CXFA_BindItems::GetValueRef(CFX_WideStringC& wsValueRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
-}
-void CXFA_BindItems::GetRef(CFX_WideStringC& wsRef) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-FX_BOOL CXFA_BindItems::SetConnection(const CFX_WideString& wsConnection) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Connection, wsConnection);
-}
-FX_BOOL CXFA_BindItems::SetLabelRef(const CFX_WideString& wsLabelRef) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_LabelRef, wsLabelRef);
-}
-FX_BOOL CXFA_BindItems::SetValueRef(const CFX_WideString& wsValueRef) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_ValueRef, wsValueRef);
-}
-FX_BOOL CXFA_BindItems::SetRef(const CFX_WideString& wsRef) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Ref, wsRef);
-}
-int32_t CXFA_Box::GetBreak() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Close;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Break);
-}
-int32_t CXFA_Box::GetHand() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Even;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand);
-}
-int32_t CXFA_Box::GetPresence() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Hidden;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-}
-int32_t CXFA_Box::CountCorners() const {
-  if (!m_pNode) {
-    return 0;
-  }
-  return m_pNode->CountChildren(XFA_ELEMENT_Corner);
-}
-CXFA_Corner CXFA_Box::GetCorner(int32_t nIndex) const {
-  return CXFA_Corner(
-      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Corner, nIndex == 0)
-              : nullptr);
-}
-int32_t CXFA_Box::CountEdges() const {
-  if (!m_pNode) {
-    return 0;
-  }
-  return m_pNode->CountChildren(XFA_ELEMENT_Edge);
-}
-CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const {
-  return CXFA_Edge(
-      m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0)
-              : nullptr);
-}
-static void XFA_BOX_GetStrokes(CXFA_Node* pNode,
-                               CXFA_StrokeArray& strokes,
-                               FX_BOOL bNULL) {
-  strokes.RemoveAll();
-  if (!pNode) {
-    return;
-  }
-  strokes.SetSize(8);
-  int32_t i, j;
-  for (i = 0, j = 0; i < 4; i++) {
-    CXFA_Corner corner =
-        CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0));
-    if (corner || i == 0) {
-      strokes.SetAt(j, corner);
-    } else if (bNULL) {
-      strokes.SetAt(j, CXFA_Stroke(nullptr));
-    } else if (i == 1) {
-      strokes.SetAt(j, strokes[0]);
-    } else if (i == 2) {
-      strokes.SetAt(j, strokes[0]);
-    } else {
-      strokes.SetAt(j, strokes[2]);
-    }
-    j++;
-    CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0));
-    if (edge || i == 0) {
-      strokes.SetAt(j, edge);
-    } else if (bNULL) {
-      strokes.SetAt(j, CXFA_Stroke(nullptr));
-    } else if (i == 1) {
-      strokes.SetAt(j, strokes[1]);
-    } else if (i == 2) {
-      strokes.SetAt(j, strokes[1]);
-    } else {
-      strokes.SetAt(j, strokes[3]);
-    }
-    j++;
-  }
-}
-void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const {
-  XFA_BOX_GetStrokes(m_pNode, strokes, FALSE);
-}
-FX_BOOL CXFA_Box::IsCircular() const {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular);
-}
-FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const {
-  fStartAngle = 0;
-  if (!m_pNode) {
-    return FALSE;
-  }
-  CXFA_Measurement ms;
-  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE);
-  if (bRet) {
-    fStartAngle = ms.GetValue();
-  }
-  return bRet;
-}
-FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const {
-  fSweepAngle = 360;
-  if (!m_pNode) {
-    return FALSE;
-  }
-  CXFA_Measurement ms;
-  FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE);
-  if (bRet) {
-    fSweepAngle = ms.GetValue();
-  }
-  return bRet;
-}
-CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const {
-  if (!m_pNode) {
-    return CXFA_Fill(nullptr);
-  }
-  CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified);
-  return CXFA_Fill(pFillNode);
-}
-CXFA_Margin CXFA_Box::GetMargin() const {
-  return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin)
-                             : nullptr);
-}
-static FX_BOOL XFA_BOX_SameStyles(const CXFA_StrokeArray& strokes) {
-  int32_t iCount = strokes.GetSize();
-  if (iCount < 1) {
-    return TRUE;
-  }
-  CXFA_Stroke stroke1 = strokes[0];
-  for (int32_t i = 1; i < iCount; i++) {
-    CXFA_Stroke stroke2 = strokes[i];
-    if (!stroke2) {
-      continue;
-    }
-    if (!stroke1) {
-      stroke1 = stroke2;
-    } else if (!stroke1.SameStyles(stroke2)) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_Box::SameStyles() const {
-  if (IsArc()) {
-    return TRUE;
-  }
-  CXFA_StrokeArray strokes;
-  XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
-  return XFA_BOX_SameStyles(strokes);
-}
-static int32_t XFA_BOX_3DStyle(const CXFA_StrokeArray& strokes,
-                               CXFA_Stroke& stroke) {
-  int32_t iCount = strokes.GetSize();
-  if (iCount < 1) {
-    return 0;
-  }
-  stroke = strokes[0];
-  for (int32_t i = 1; i < iCount; i++) {
-    CXFA_Stroke find = strokes[i];
-    if (!find) {
-      continue;
-    }
-    if (!stroke) {
-      stroke = find;
-    } else if (stroke.GetStrokeType() != find.GetStrokeType()) {
-      stroke = find;
-      break;
-    }
-  }
-  int32_t iType = stroke.GetStrokeType();
-  if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised ||
-      iType == XFA_ATTRIBUTEENUM_Etched ||
-      iType == XFA_ATTRIBUTEENUM_Embossed) {
-    return iType;
-  }
-  return 0;
-}
-int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const {
-  if (IsArc()) {
-    return 0;
-  }
-  CXFA_StrokeArray strokes;
-  XFA_BOX_GetStrokes(m_pNode, strokes, TRUE);
-  CXFA_Stroke stroke(NULL);
-  int32_t iType = XFA_BOX_3DStyle(strokes, stroke);
-  if (iType) {
-    bVisible = stroke.IsVisible();
-    fThickness = stroke.GetThickness();
-  }
-  return iType;
-}
-int32_t CXFA_Stroke::GetPresence() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Presence)
-                 : XFA_ATTRIBUTEENUM_Invisible;
-}
-int32_t CXFA_Stroke::GetCapType() const {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Square;
-  }
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Cap);
-}
-int32_t CXFA_Stroke::GetStrokeType() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Stroke)
-                 : XFA_ATTRIBUTEENUM_Solid;
-}
-FX_FLOAT CXFA_Stroke::GetThickness() const {
-  return GetMSThickness().ToUnit(XFA_UNIT_Pt);
-}
-CXFA_Measurement CXFA_Stroke::GetMSThickness() const {
-  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Thickness)
-                 : XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT_Edge,
-                                                        XFA_ATTRIBUTE_Thickness,
-                                                        XFA_XDPPACKET_Form);
-}
-void CXFA_Stroke::SetThickness(FX_FLOAT fThickness) {
-  if (!m_pNode) {
-    return;
-  }
-  CXFA_Measurement thickness(fThickness, XFA_UNIT_Pt);
-  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, thickness);
-}
-void CXFA_Stroke::SetMSThickness(CXFA_Measurement msThinkness) {
-  if (!m_pNode) {
-    return;
-  }
-  m_pNode->SetMeasure(XFA_ATTRIBUTE_Thickness, msThinkness);
-}
-FX_ARGB CXFA_Stroke::GetColor() const {
-  if (!m_pNode) {
-    return 0xFF000000;
-  }
-  CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Color);
-  if (!pNode) {
-    return 0xFF000000;
-  }
-  CFX_WideStringC wsColor;
-  pNode->TryCData(XFA_ATTRIBUTE_Value, wsColor);
-  return XFA_WStringToColor(wsColor);
-}
-void CXFA_Stroke::SetColor(FX_ARGB argb) {
-  if (!m_pNode) {
-    return;
-  }
-  CXFA_Node* pNode = m_pNode->GetProperty(0, XFA_ELEMENT_Color);
-  CFX_WideString wsColor;
-  int a, r, g, b;
-  ArgbDecode(argb, a, r, g, b);
-  wsColor.Format(L"%d,%d,%d", r, g, b);
-  pNode->SetCData(XFA_ATTRIBUTE_Value, wsColor);
-}
-int32_t CXFA_Stroke::GetJoinType() const {
-  return m_pNode ? m_pNode->GetEnum(XFA_ATTRIBUTE_Join)
-                 : XFA_ATTRIBUTEENUM_Square;
-}
-FX_BOOL CXFA_Stroke::IsInverted() const {
-  return m_pNode ? m_pNode->GetBoolean(XFA_ATTRIBUTE_Inverted) : FALSE;
-}
-FX_FLOAT CXFA_Stroke::GetRadius() const {
-  return m_pNode ? m_pNode->GetMeasure(XFA_ATTRIBUTE_Radius).ToUnit(XFA_UNIT_Pt)
-                 : 0;
-}
-FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, FX_DWORD dwFlags) const {
-  if (m_pNode == stroke.GetNode()) {
-    return TRUE;
-  }
-  if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) {
-    return FALSE;
-  }
-  if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 &&
-      IsVisible() != stroke.IsVisible()) {
-    return FALSE;
-  }
-  if (GetStrokeType() != stroke.GetStrokeType()) {
-    return FALSE;
-  }
-  if (GetColor() != stroke.GetColor()) {
-    return FALSE;
-  }
-  if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 &&
-      FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) {
-    return FALSE;
-  }
-  return TRUE;
-}
-FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
-                              FX_BOOL b3DStyle,
-                              int32_t nIndex) {
-  FX_FLOAT fThickness = 0;
-  {
-    if (strokes[nIndex * 2 + 1].GetPresence() == XFA_ATTRIBUTEENUM_Visible) {
-      if (nIndex == 0) {
-        fThickness += 2.5f;
-      }
-      fThickness += strokes[nIndex * 2 + 1].GetThickness() * (b3DStyle ? 4 : 2);
-    }
-  }
-  return fThickness;
-}
-CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
-    : CXFA_Data(pNode),
-      m_bIsNull(TRUE),
-      m_bPreNull(TRUE),
-      m_pUiChildNode(NULL),
-      m_eUIType(XFA_ELEMENT_UNKNOWN) {}
-CXFA_Node* CXFA_WidgetData::GetUIChild() {
-  if (m_eUIType == XFA_ELEMENT_UNKNOWN) {
-    m_pUiChildNode = XFA_CreateUIChild(m_pNode, m_eUIType);
-  }
-  return m_pUiChildNode;
-}
-XFA_ELEMENT CXFA_WidgetData::GetUIType() {
-  GetUIChild();
-  return m_eUIType;
-}
-CFX_WideString CXFA_WidgetData::GetRawValue() {
-  return m_pNode->GetContent();
-}
-int32_t CXFA_WidgetData::GetAccess(FX_BOOL bTemplate) {
-  if (bTemplate) {
-    CXFA_Node* pNode = m_pNode->GetTemplateNode();
-    if (pNode) {
-      return pNode->GetEnum(XFA_ATTRIBUTE_Access);
-    }
-    return XFA_ATTRIBUTEENUM_Open;
-  }
-  CXFA_Node* pNode = m_pNode;
-  while (pNode) {
-    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Access);
-    if (iAcc != XFA_ATTRIBUTEENUM_Open) {
-      return iAcc;
-    }
-    pNode =
-        pNode->GetNodeItem(XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
-  }
-  return XFA_ATTRIBUTEENUM_Open;
-}
-FX_BOOL CXFA_WidgetData::GetAccessKey(CFX_WideStringC& wsAccessKey) {
-  return m_pNode->TryCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
-}
-int32_t CXFA_WidgetData::GetAnchorType() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
-}
-int32_t CXFA_WidgetData::GetColSpan() {
-  return m_pNode->GetInteger(XFA_ATTRIBUTE_ColSpan);
-}
-int32_t CXFA_WidgetData::GetPresence() {
-  return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-  CXFA_Node* pNode = m_pNode;
-  while (pNode && pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
-    int32_t iAcc = pNode->GetEnum(XFA_ATTRIBUTE_Presence);
-    if (iAcc != XFA_ATTRIBUTEENUM_Visible) {
-      return iAcc;
-    }
-    pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-  return XFA_ATTRIBUTEENUM_Visible;
-}
-int32_t CXFA_WidgetData::GetRotate() {
-  CXFA_Measurement ms;
-  if (!m_pNode->TryMeasure(XFA_ATTRIBUTE_Rotate, ms, FALSE)) {
-    return 0;
-  }
-  int32_t iRotate = FXSYS_round(ms.GetValue());
-  iRotate = XFA_MapRotation(iRotate);
-  return iRotate / 90 * 90;
-}
-CXFA_Border CXFA_WidgetData::GetBorder(FX_BOOL bModified) {
-  return CXFA_Border(m_pNode->GetProperty(0, XFA_ELEMENT_Border, bModified));
-}
-CXFA_Caption CXFA_WidgetData::GetCaption(FX_BOOL bModified) {
-  return CXFA_Caption(m_pNode->GetProperty(0, XFA_ELEMENT_Caption, bModified));
-}
-CXFA_Font CXFA_WidgetData::GetFont(FX_BOOL bModified) {
-  return CXFA_Font(m_pNode->GetProperty(0, XFA_ELEMENT_Font, bModified));
-}
-CXFA_Margin CXFA_WidgetData::GetMargin(FX_BOOL bModified) {
-  return CXFA_Margin(m_pNode->GetProperty(0, XFA_ELEMENT_Margin, bModified));
-}
-CXFA_Para CXFA_WidgetData::GetPara(FX_BOOL bModified) {
-  return CXFA_Para(m_pNode->GetProperty(0, XFA_ELEMENT_Para, bModified));
-}
-CXFA_Keep CXFA_WidgetData::GetKeep(FX_BOOL bModified) {
-  return CXFA_Keep(m_pNode->GetProperty(0, XFA_ELEMENT_Keep, bModified),
-                   m_pNode);
-}
-void CXFA_WidgetData::GetEventList(CXFA_NodeArray& events) {
-  m_pNode->GetNodeList(events, 0, XFA_ELEMENT_Event);
-}
-int32_t CXFA_WidgetData::GetEventByActivity(int32_t iActivity,
-                                            CXFA_NodeArray& events,
-                                            FX_BOOL bIsFormReady) {
-  CXFA_NodeArray allEvents;
-  GetEventList(allEvents);
-  int32_t iCount = allEvents.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    CXFA_Event event(allEvents[i]);
-    if (event.GetActivity() == iActivity) {
-      if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
-        CFX_WideStringC wsRef;
-        event.GetRef(wsRef);
-        if (bIsFormReady) {
-          if (wsRef == CFX_WideStringC(L"$form")) {
-            events.Add(allEvents[i]);
-          }
-        } else {
-          if (wsRef == CFX_WideStringC(L"$layout")) {
-            events.Add(allEvents[i]);
-          }
-        }
-      } else {
-        events.Add(allEvents[i]);
-      }
-    }
-  }
-  return events.GetSize();
-}
-CXFA_Value CXFA_WidgetData::GetDefaultValue(FX_BOOL bModified) {
-  CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
-  return CXFA_Value(pTemNode
-                        ? pTemNode->GetProperty(0, XFA_ELEMENT_Value, bModified)
-                        : nullptr);
-}
-CXFA_Value CXFA_WidgetData::GetFormValue(FX_BOOL bModified) {
-  return CXFA_Value(m_pNode->GetProperty(0, XFA_ELEMENT_Value, bModified));
-}
-CXFA_Calculate CXFA_WidgetData::GetCalculate(FX_BOOL bModified) {
-  return CXFA_Calculate(
-      m_pNode->GetProperty(0, XFA_ELEMENT_Calculate, bModified));
-}
-CXFA_Validate CXFA_WidgetData::GetValidate(FX_BOOL bModified) {
-  return CXFA_Validate(
-      m_pNode->GetProperty(0, XFA_ELEMENT_Validate, bModified));
-}
-CXFA_Variables CXFA_WidgetData::GetVariables(FX_BOOL bModified) {
-  return CXFA_Variables(
-      m_pNode->GetProperty(0, XFA_ELEMENT_Variables, bModified));
-}
-CXFA_Bind CXFA_WidgetData::GetBind(FX_BOOL bModified) {
-  return CXFA_Bind(m_pNode->GetProperty(0, XFA_ELEMENT_Bind, bModified));
-}
-CXFA_Assist CXFA_WidgetData::GetAssist(FX_BOOL bModified) {
-  return CXFA_Assist(m_pNode->GetProperty(0, XFA_ELEMENT_Assist, bModified));
-}
-void CXFA_WidgetData::GetRelevant(CFX_WideStringC& wsRelevant) {
-  m_pNode->TryCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
-}
-FX_BOOL CXFA_WidgetData::GetWidth(FX_FLOAT& fWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_W, fWidth);
-}
-FX_BOOL CXFA_WidgetData::GetHeight(FX_FLOAT& fHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_H, fHeight);
-}
-FX_BOOL CXFA_WidgetData::GetMinWidth(FX_FLOAT& fMinWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
-}
-FX_BOOL CXFA_WidgetData::GetMinHeight(FX_FLOAT& fMinHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
-}
-FX_BOOL CXFA_WidgetData::GetMaxWidth(FX_FLOAT& fMaxWidth) {
-  return TryMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
-}
-FX_BOOL CXFA_WidgetData::GetMaxHeight(FX_FLOAT& fMaxHeight) {
-  return TryMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
-}
-CXFA_BindItems CXFA_WidgetData::GetBindItems() {
-  return CXFA_BindItems(m_pNode->GetChild(0, XFA_ELEMENT_BindItems));
-}
-FX_BOOL CXFA_WidgetData::SetAccess(int32_t iAccess, FX_BOOL bNotify) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Access, (XFA_ATTRIBUTEENUM)iAccess,
-                          bNotify);
-}
-FX_BOOL CXFA_WidgetData::SetAccessKey(const CFX_WideString& wsAccessKey) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_AccessKey, wsAccessKey);
-}
-FX_BOOL CXFA_WidgetData::SetAnchorType(int32_t iType) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_AnchorType, (XFA_ATTRIBUTEENUM)iType);
-}
-FX_BOOL CXFA_WidgetData::SetColSpan(int32_t iColSpan) {
-  return m_pNode->SetInteger(XFA_ATTRIBUTE_ColSpan,
-                             (XFA_ATTRIBUTEENUM)iColSpan);
-}
-FX_BOOL CXFA_WidgetData::SetPresence(int32_t iPresence) {
-  return m_pNode->SetEnum(XFA_ATTRIBUTE_Presence, (XFA_ATTRIBUTEENUM)iPresence);
-}
-FX_BOOL CXFA_WidgetData::SetRotate(int32_t iRotate) {
-  iRotate = XFA_MapRotation(iRotate);
-  CXFA_Measurement ms((FX_FLOAT)iRotate, XFA_UNIT_Angle);
-  return m_pNode->SetMeasure(XFA_ATTRIBUTE_Rotate, ms);
-}
-FX_BOOL CXFA_WidgetData::SetRelevant(const CFX_WideString& wsRelevant) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Relevant, wsRelevant);
-}
-FX_BOOL CXFA_WidgetData::SetStatus(FX_DWORD dwStatus) {
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::SetWidth(FX_FLOAT fWidth) {
-  return SetMeasure(XFA_ATTRIBUTE_W, fWidth);
-}
-FX_BOOL CXFA_WidgetData::SetHeight(FX_FLOAT fHeight) {
-  return SetMeasure(XFA_ATTRIBUTE_H, fHeight);
-}
-FX_BOOL CXFA_WidgetData::SetMinWidth(FX_FLOAT fMinWidth) {
-  return SetMeasure(XFA_ATTRIBUTE_MinW, fMinWidth);
-}
-FX_BOOL CXFA_WidgetData::SetMinHeight(FX_FLOAT fMinHeight) {
-  return SetMeasure(XFA_ATTRIBUTE_MinH, fMinHeight);
-}
-FX_BOOL CXFA_WidgetData::SetMaxWidth(FX_FLOAT fMaxWidth) {
-  return SetMeasure(XFA_ATTRIBUTE_MaxW, fMaxWidth);
-}
-FX_BOOL CXFA_WidgetData::SetMaxHeight(FX_FLOAT fMaxHeight) {
-  return SetMeasure(XFA_ATTRIBUTE_MaxH, fMaxHeight);
-}
-FX_BOOL CXFA_WidgetData::SetPos(FX_FLOAT x, FX_FLOAT y) {
-  return SetMeasure(XFA_ATTRIBUTE_X, x) && SetMeasure(XFA_ATTRIBUTE_Y, y);
-}
-FX_BOOL CXFA_WidgetData::SetName(const CFX_WideString& wsName) {
-  return m_pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
-}
-FX_BOOL CXFA_WidgetData::SetButtonHighlight(int32_t iButtonHighlight) {
-  CXFA_Node* pUiChildNode = GetUIChild();
-  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Highlight,
-                               (XFA_ATTRIBUTEENUM)iButtonHighlight);
-}
-FX_BOOL CXFA_WidgetData::SetButtonRollover(const CFX_WideString& wsRollover,
-                                           FX_BOOL bRichText) {
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::SetButtonDown(const CFX_WideString& wsDown,
-                                       FX_BOOL bRichText) {
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::SetCheckButtonShape(int32_t iCheckButtonShape) {
-  CXFA_Node* pUiChildNode = GetUIChild();
-  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Shape,
-                               (XFA_ATTRIBUTEENUM)iCheckButtonShape);
-}
-FX_BOOL CXFA_WidgetData::SetCheckButtonMark(int32_t iCheckButtonMark) {
-  CXFA_Node* pUiChildNode = GetUIChild();
-  return pUiChildNode->SetEnum(XFA_ATTRIBUTE_Mark,
-                               (XFA_ATTRIBUTEENUM)iCheckButtonMark);
-}
-FX_BOOL CXFA_WidgetData::SetCheckButtonSize(FX_FLOAT fCheckButtonMark) {
-  CXFA_Node* pUiChildNode = GetUIChild();
-  if (pUiChildNode) {
-    CXFA_Measurement ms(fCheckButtonMark, XFA_UNIT_Pt);
-    return pUiChildNode->SetMeasure(XFA_ATTRIBUTE_Size, ms);
-  }
-  return FALSE;
-}
-CXFA_Border CXFA_WidgetData::GetUIBorder(FX_BOOL bModified) {
-  CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Border(
-      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Border, bModified)
-               : nullptr);
-}
-CXFA_Margin CXFA_WidgetData::GetUIMargin(FX_BOOL bModified) {
-  CXFA_Node* pUIChild = GetUIChild();
-  return CXFA_Margin(
-      pUIChild ? pUIChild->GetProperty(0, XFA_ELEMENT_Margin, bModified)
-               : nullptr);
-}
-void CXFA_WidgetData::GetUIMargin(CFX_RectF& rtUIMargin) {
-  rtUIMargin.Reset();
-  CXFA_Margin mgUI = GetUIMargin();
-  if (!mgUI) {
-    return;
-  }
-  CXFA_Border border = GetUIBorder();
-  if (border && border.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
-    return;
-  }
-  FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
-  FX_BOOL bLeft = mgUI.GetLeftInset(fLeftInset);
-  FX_BOOL bTop = mgUI.GetTopInset(fTopInset);
-  FX_BOOL bRight = mgUI.GetRightInset(fRightInset);
-  FX_BOOL bBottom = mgUI.GetBottomInset(fBottomInset);
-  if (border) {
-    FX_BOOL bVisible = FALSE;
-    FX_FLOAT fThickness = 0;
-    border.Get3DStyle(bVisible, fThickness);
-    if (!bLeft || !bTop || !bRight || !bBottom) {
-      CXFA_StrokeArray strokes;
-      border.GetStrokes(strokes);
-      if (!bTop) {
-        fTopInset = XFA_GetEdgeThickness(strokes, bVisible, 0);
-      }
-      if (!bRight) {
-        fRightInset = XFA_GetEdgeThickness(strokes, bVisible, 1);
-      }
-      if (!bBottom) {
-        fBottomInset = XFA_GetEdgeThickness(strokes, bVisible, 2);
-      }
-      if (!bLeft) {
-        fLeftInset = XFA_GetEdgeThickness(strokes, bVisible, 3);
-      }
-    }
-  }
-  rtUIMargin.Set(fLeftInset, fTopInset, fRightInset, fBottomInset);
-}
-int32_t CXFA_WidgetData::GetButtonHighlight() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Highlight);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_Button, XFA_ATTRIBUTE_Highlight, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::GetButtonRollover(CFX_WideString& wsRollover,
-                                           FX_BOOL& bRichText) {
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    while (pText) {
-      CFX_WideStringC wsName;
-      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName == FX_WSTRC(L"rollover")) {
-        pText->TryContent(wsRollover);
-        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
-        return !wsRollover.IsEmpty();
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetButtonDown(CFX_WideString& wsDown,
-                                       FX_BOOL& bRichText) {
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    while (pText) {
-      CFX_WideStringC wsName;
-      pText->TryCData(XFA_ATTRIBUTE_Name, wsName);
-      if (wsName == FX_WSTRC(L"down")) {
-        pText->TryContent(wsDown);
-        bRichText = pText->GetClassID() == XFA_ELEMENT_ExData;
-        return !wsDown.IsEmpty();
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return FALSE;
-}
-int32_t CXFA_WidgetData::GetCheckButtonShape() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Shape);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Shape, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetCheckButtonMark() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Mark);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Mark, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsRadioButton() {
-  if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent)) {
-    return pParent->GetClassID() == XFA_ELEMENT_ExclGroup;
-  }
-  return FALSE;
-}
-FX_FLOAT CXFA_WidgetData::GetCheckButtonSize() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetMeasure(XFA_ATTRIBUTE_Size).ToUnit(XFA_UNIT_Pt);
-  }
-  return XFA_GetAttributeDefaultValue_Measure(
-             XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_Size, XFA_XDPPACKET_Form)
-      .ToUnit(XFA_UNIT_Pt);
-}
-FX_BOOL CXFA_WidgetData::IsAllowNeutral() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_AllowNeutral);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_CheckButton, XFA_ATTRIBUTE_AllowNeutral, XFA_XDPPACKET_Form);
-}
-XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
-  CFX_WideString wsValue = GetRawValue();
-  if (wsValue.IsEmpty()) {
-    return XFA_CHECKSTATE_Off;
-  }
-  if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    int32_t i = 0;
-    while (pText) {
-      CFX_WideString wsContent;
-      if (pText->TryContent(wsContent) && (wsContent == wsValue)) {
-        return (XFA_CHECKSTATE)i;
-      }
-      i++;
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-  }
-  return XFA_CHECKSTATE_Off;
-}
-void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState,
-                                    FX_BOOL bNotify) {
-  CXFA_WidgetData exclGroup(GetExclGroupNode());
-  if (exclGroup) {
-    CFX_WideString wsValue;
-    if (eCheckState != XFA_CHECKSTATE_Off) {
-      if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items)) {
-        CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-        if (pText) {
-          pText->TryContent(wsValue);
-        }
-      }
-    }
-    CXFA_Node* pChild =
-        exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      if (pChild->GetClassID() != XFA_ELEMENT_Field) {
-        continue;
-      }
-      CXFA_Node* pItem = pChild->GetChild(0, XFA_ELEMENT_Items);
-      if (!pItem) {
-        continue;
-      }
-      CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-      if (!pItemchild) {
-        continue;
-      }
-      CFX_WideString text = pItemchild->GetContent();
-      CFX_WideString wsChildValue = text;
-      if (wsValue != text) {
-        pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
-        if (pItemchild) {
-          wsChildValue = pItemchild->GetContent();
-        } else {
-          wsChildValue.Empty();
-        }
-      }
-      CXFA_WidgetData ch(pChild);
-      ch.SyncValue(wsChildValue, bNotify);
-    }
-    exclGroup.SyncValue(wsValue, bNotify);
-  } else {
-    CXFA_Node* pItems = m_pNode->GetChild(0, XFA_ELEMENT_Items);
-    if (!pItems) {
-      return;
-    }
-    int32_t i = -1;
-    CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    CFX_WideString wsContent;
-    while (pText) {
-      i++;
-      if (i == eCheckState) {
-        pText->TryContent(wsContent);
-        break;
-      }
-      pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    SyncValue(wsContent, bNotify);
-  }
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupNode() {
-  CXFA_Node* pExcl = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_Parent));
-  if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
-  return pExcl;
-}
-CXFA_Node* CXFA_WidgetData::GetSelectedMember() {
-  CXFA_Node* pSelectedMember = NULL;
-  CFX_WideString wsState = GetRawValue();
-  if (wsState.IsEmpty()) {
-    return pSelectedMember;
-  }
-  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    CXFA_WidgetData widgetData(pNode);
-    if (widgetData.GetCheckState() == XFA_CHECKSTATE_On) {
-      pSelectedMember = pNode;
-      break;
-    }
-  }
-  return pSelectedMember;
-}
-CXFA_Node* CXFA_WidgetData::SetSelectedMember(const CFX_WideStringC& wsName,
-                                              FX_BOOL bNotify) {
-  CXFA_Node* pSelectedMember = NULL;
-  FX_DWORD nameHash =
-      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
-  for (CXFA_Node* pNode = ToNode(m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild));
-       pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetNameHash() == nameHash) {
-      CXFA_WidgetData widgetData(pNode);
-      widgetData.SetCheckState(XFA_CHECKSTATE_On, bNotify);
-      pSelectedMember = pNode;
-      break;
-    }
-  }
-  return pSelectedMember;
-}
-void CXFA_WidgetData::SetSelectedMemberByValue(const CFX_WideStringC& wsValue,
-                                               FX_BOOL bNotify,
-                                               FX_BOOL bScriptModify,
-                                               FX_BOOL bSyncData) {
-  CFX_WideString wsExclGroup;
-  for (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
-       pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Field) {
-      continue;
-    }
-    CXFA_Node* pItem = pNode->GetChild(0, XFA_ELEMENT_Items);
-    if (!pItem) {
-      continue;
-    }
-    CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (!pItemchild) {
-      continue;
-    }
-    CFX_WideString wsChildValue = pItemchild->GetContent();
-    if (wsValue != wsChildValue) {
-      pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling);
-      if (pItemchild) {
-        wsChildValue = pItemchild->GetContent();
-      } else {
-        wsChildValue.Empty();
-      }
-    } else {
-      wsExclGroup = wsValue;
-    }
-    pNode->SetContent(wsChildValue, wsChildValue, bNotify, bScriptModify,
-                      FALSE);
-  }
-  if (m_pNode) {
-    m_pNode->SetContent(wsExclGroup, wsExclGroup, bNotify, bScriptModify,
-                        bSyncData);
-  }
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupFirstMember() {
-  CXFA_Node* pExcl = GetNode();
-  if (!pExcl) {
-    return NULL;
-  }
-  CXFA_Node* pNode = pExcl->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pNode) {
-    if (pNode->GetClassID() == XFA_ELEMENT_Field) {
-      return pNode;
-    }
-    pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_WidgetData::GetExclGroupNextMember(CXFA_Node* pNode) {
-  if (!pNode) {
-    return NULL;
-  }
-  CXFA_Node* pNodeField = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-  while (pNodeField) {
-    if (pNodeField->GetClassID() == XFA_ELEMENT_Field) {
-      return pNodeField;
-    }
-    pNodeField = pNodeField->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  return NULL;
-}
-int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_CommitOn);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_CommitOn, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsChoiceListAllowTextEntry() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_TextEntry);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_TextEntry, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetChoiceListOpen() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_Open);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_ChoiceList, XFA_ATTRIBUTE_Open, XFA_XDPPACKET_Form);
-}
-FX_BOOL CXFA_WidgetData::IsListBox() {
-  int32_t iOpenMode = GetChoiceListOpen();
-  return (iOpenMode == XFA_ATTRIBUTEENUM_Always ||
-          iOpenMode == XFA_ATTRIBUTEENUM_MultiSelect);
-}
-int32_t CXFA_WidgetData::CountChoiceListItems(FX_BOOL bSaveValue) {
-  CXFA_NodeArray pItems;
-  CXFA_Node* pItem = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItems.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return 0;
-  }
-  pItem = pItems[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItem = pItems[1];
-    }
-  }
-  pItems.RemoveAll();
-  return pItem->CountChildren(XFA_ELEMENT_UNKNOWN);
-}
-FX_BOOL CXFA_WidgetData::GetChoiceListItem(CFX_WideString& wsText,
-                                           int32_t nIndex,
-                                           FX_BOOL bSaveValue) {
-  wsText.Empty();
-  CXFA_NodeArray pItemsArray;
-  CXFA_Node* pItems = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItemsArray.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return FALSE;
-  }
-  pItems = pItemsArray[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItemsArray[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItemsArray[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItems = pItemsArray[1];
-    }
-  }
-  if (pItems) {
-    CXFA_Node* pItem = pItems->GetChild(nIndex, XFA_ELEMENT_UNKNOWN);
-    if (pItem) {
-      pItem->TryContent(wsText);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::GetChoiceListItems(CFX_WideStringArray& wsTextArray,
-                                         FX_BOOL bSaveValue) {
-  CXFA_NodeArray pItems;
-  CXFA_Node* pItem = NULL;
-  int32_t iCount = 0;
-  CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    pItems.Add(pNode);
-    if (iCount == 2) {
-      break;
-    }
-  }
-  if (iCount == 0) {
-    return;
-  }
-  pItem = pItems[0];
-  if (iCount > 1) {
-    FX_BOOL bItemOneHasSave = pItems[0]->GetBoolean(XFA_ATTRIBUTE_Save);
-    FX_BOOL bItemTwoHasSave = pItems[1]->GetBoolean(XFA_ATTRIBUTE_Save);
-    if (bItemOneHasSave != bItemTwoHasSave && bSaveValue == bItemTwoHasSave) {
-      pItem = pItems[1];
-    }
-  }
-  pItems.RemoveAll();
-  pNode = pItem->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    pNode->TryContent(wsTextArray.Add());
-  }
-}
-int32_t CXFA_WidgetData::CountSelectedItems() {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  if (IsListBox() || !IsChoiceListAllowTextEntry()) {
-    return wsValueArray.GetSize();
-  }
-  int32_t iSelected = 0;
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t i = 0; i < iValues; i++) {
-    int32_t iSaves = wsSaveTextArray.GetSize();
-    for (int32_t j = 0; j < iSaves; j++) {
-      if (wsValueArray[i] == wsSaveTextArray[j]) {
-        iSelected++;
-        break;
-      }
-    }
-  }
-  return iSelected;
-}
-int32_t CXFA_WidgetData::GetSelectedItem(int32_t nIndex) {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iSaves = wsSaveTextArray.GetSize();
-  for (int32_t j = 0; j < iSaves; j++) {
-    if (wsValueArray[nIndex] == wsSaveTextArray[j]) {
-      return j;
-    }
-  }
-  return -1;
-}
-void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  if (iValues < 1) {
-    return;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  int32_t iSaves = wsSaveTextArray.GetSize();
-  for (int32_t i = 0; i < iValues; i++) {
-    for (int32_t j = 0; j < iSaves; j++) {
-      if (wsValueArray[i] == wsSaveTextArray[j]) {
-        iSelArray.Add(j);
-        break;
-      }
-    }
-  }
-}
-void CXFA_WidgetData::GetSelectedItemsValue(
-    CFX_WideStringArray& wsSelTextArray) {
-  CFX_WideString wsValue = GetRawValue();
-  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    if (!wsValue.IsEmpty()) {
-      int32_t iStart = 0;
-      int32_t iLength = wsValue.GetLength();
-      int32_t iEnd = wsValue.Find(L'\n', iStart);
-      iEnd = (iEnd == -1) ? iLength : iEnd;
-      while (iEnd >= iStart) {
-        wsSelTextArray.Add(wsValue.Mid(iStart, iEnd - iStart));
-        iStart = iEnd + 1;
-        if (iStart >= iLength) {
-          break;
-        }
-        iEnd = wsValue.Find(L'\n', iStart);
-        if (iEnd < 0) {
-          wsSelTextArray.Add(wsValue.Mid(iStart, iLength - iStart));
-        }
-      }
-    }
-  } else {
-    wsSelTextArray.Add(wsValue);
-  }
-}
-FX_BOOL CXFA_WidgetData::GetItemState(int32_t nIndex) {
-  if (nIndex < 0) {
-    return FALSE;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  if (wsSaveTextArray.GetSize() <= nIndex) {
-    return FALSE;
-  }
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t j = 0; j < iValues; j++) {
-    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::SetItemState(int32_t nIndex,
-                                   FX_BOOL bSelected,
-                                   FX_BOOL bNotify,
-                                   FX_BOOL bScriptModify,
-                                   FX_BOOL bSyncData) {
-  if (nIndex < 0) {
-    return;
-  }
-  CFX_WideStringArray wsSaveTextArray;
-  GetChoiceListItems(wsSaveTextArray, TRUE);
-  if (wsSaveTextArray.GetSize() <= nIndex) {
-    return;
-  }
-  int32_t iSel = -1;
-  CFX_WideStringArray wsValueArray;
-  GetSelectedItemsValue(wsValueArray);
-  int32_t iValues = wsValueArray.GetSize();
-  for (int32_t j = 0; j < iValues; j++) {
-    if (wsValueArray[j] == wsSaveTextArray[nIndex]) {
-      iSel = j;
-      break;
-    }
-  }
-  if (GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    if (bSelected) {
-      if (iSel < 0) {
-        CFX_WideString wsValue = GetRawValue();
-        if (!wsValue.IsEmpty()) {
-          wsValue += L"\n";
-        }
-        wsValue += wsSaveTextArray[nIndex];
-        m_pNode->SetContent(wsValue, wsValue, bNotify, bScriptModify,
-                            bSyncData);
-      }
-    } else if (iSel >= 0) {
-      CFX_Int32Array iSelArray;
-      GetSelectedItems(iSelArray);
-      for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
-        if (iSelArray[i] == nIndex) {
-          iSelArray.RemoveAt(i);
-          break;
-        }
-      }
-      SetSelectdItems(iSelArray, bNotify, bScriptModify, bSyncData);
-    }
-  } else {
-    if (bSelected) {
-      if (iSel < 0) {
-        CFX_WideString wsSaveText = wsSaveTextArray[nIndex];
-        CFX_WideString wsFormatText(wsSaveText);
-        GetFormatDataValue(wsSaveText, wsFormatText);
-        m_pNode->SetContent(wsSaveText, wsFormatText, bNotify, bScriptModify,
-                            bSyncData);
-      }
-    } else if (iSel >= 0) {
-      m_pNode->SetContent(CFX_WideString(), CFX_WideString(), bNotify,
-                          bScriptModify, bSyncData);
-    }
-  }
-}
-void CXFA_WidgetData::SetSelectdItems(CFX_Int32Array& iSelArray,
-                                      FX_BOOL bNotify,
-                                      FX_BOOL bScriptModify,
-                                      FX_BOOL bSyncData) {
-  CFX_WideString wsValue;
-  int32_t iSize = iSelArray.GetSize();
-  if (iSize >= 1) {
-    CFX_WideStringArray wsSaveTextArray;
-    GetChoiceListItems(wsSaveTextArray, TRUE);
-    CFX_WideString wsItemValue;
-    for (int32_t i = 0; i < iSize; i++) {
-      wsItemValue = (iSize == 1)
-                        ? wsSaveTextArray[iSelArray[i]]
-                        : wsSaveTextArray[iSelArray[i]] + FX_WSTRC(L"\n");
-      wsValue += wsItemValue;
-    }
-  }
-  CFX_WideString wsFormat(wsValue);
-  if (GetChoiceListOpen() != XFA_ATTRIBUTEENUM_MultiSelect) {
-    GetFormatDataValue(wsValue, wsFormat);
-  }
-  m_pNode->SetContent(wsValue, wsFormat, bNotify, bScriptModify, bSyncData);
-}
-void CXFA_WidgetData::ClearAllSelections() {
-  CXFA_Node* pBind = m_pNode->GetBindData();
-  if (pBind && GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
-    while (CXFA_Node* pChildNode =
-               pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      pBind->RemoveChild(pChildNode);
-    }
-  } else {
-    SyncValue(CFX_WideString(), FALSE);
-  }
-}
-void CXFA_WidgetData::InsertItem(const CFX_WideString& wsLabel,
-                                 const CFX_WideString& wsValue,
-                                 int32_t nIndex,
-                                 FX_BOOL bNotify) {
-  CFX_WideString wsNewValue(wsValue);
-  if (wsNewValue.IsEmpty()) {
-    wsNewValue = wsLabel;
-  }
-  CXFA_NodeArray listitems;
-  int32_t iCount = 0;
-  CXFA_Node* pItemNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItemNode;
-       pItemNode = pItemNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItemNode->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    listitems.Add(pItemNode);
-    iCount++;
-  }
-  if (iCount < 1) {
-    CXFA_Node* pItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pItems);
-    InsertListTextItem(pItems, wsLabel, nIndex);
-    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pSaveItems);
-    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
-    InsertListTextItem(pSaveItems, wsNewValue, nIndex);
-  } else if (iCount > 1) {
-    for (int32_t i = 0; i < 2; i++) {
-      CXFA_Node* pNode = listitems[i];
-      FX_BOOL bHasSave = pNode->GetBoolean(XFA_ATTRIBUTE_Save);
-      if (bHasSave) {
-        InsertListTextItem(pNode, wsNewValue, nIndex);
-      } else {
-        InsertListTextItem(pNode, wsLabel, nIndex);
-      }
-    }
-  } else {
-    CXFA_Node* pNode = listitems[0];
-    pNode->SetBoolean(XFA_ATTRIBUTE_Save, FALSE);
-    pNode->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Visible);
-    CXFA_Node* pSaveItems = m_pNode->CreateSamePacketNode(XFA_ELEMENT_Items);
-    m_pNode->InsertChild(-1, pSaveItems);
-    pSaveItems->SetBoolean(XFA_ATTRIBUTE_Save, TRUE);
-    pSaveItems->SetEnum(XFA_ATTRIBUTE_Presence, XFA_ATTRIBUTEENUM_Hidden);
-    listitems.RemoveAll();
-    CXFA_Node* pListNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    int32_t i = 0;
-    while (pListNode) {
-      CFX_WideString wsOldValue;
-      pListNode->TryContent(wsOldValue);
-      InsertListTextItem(pSaveItems, wsOldValue, i);
-      i++;
-      pListNode = pListNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    InsertListTextItem(pNode, wsLabel, nIndex);
-    InsertListTextItem(pSaveItems, wsNewValue, nIndex);
-  }
-  if (!bNotify) {
-    return;
-  }
-  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
-      this, XFA_WIDGETEVENT_ListItemAdded, (void*)(const FX_WCHAR*)wsLabel,
-      (void*)(const FX_WCHAR*)wsValue, (void*)(uintptr_t)nIndex);
-}
-void CXFA_WidgetData::GetItemLabel(const CFX_WideStringC& wsValue,
-                                   CFX_WideString& wsLabel) {
-  int32_t iCount = 0;
-  CXFA_NodeArray listitems;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    listitems.Add(pItems);
-  }
-  if (iCount <= 1) {
-    wsLabel = wsValue;
-  } else {
-    CXFA_Node* pLabelItems = listitems[0];
-    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
-    CXFA_Node* pSaveItems = NULL;
-    if (bSave) {
-      pSaveItems = pLabelItems;
-      pLabelItems = listitems[1];
-    } else {
-      pSaveItems = listitems[1];
-    }
-    iCount = 0;
-    int32_t iSearch = -1;
-    CFX_WideString wsContent;
-    CXFA_Node* pChildItem = pSaveItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChildItem;
-         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pChildItem->TryContent(wsContent);
-      if (wsContent == wsValue) {
-        iSearch = iCount;
-        break;
-      }
-      iCount++;
-    }
-    if (iSearch < 0) {
-      return;
-    }
-    if (CXFA_Node* pText =
-            pLabelItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
-      pText->TryContent(wsLabel);
-    }
-  }
-}
-void CXFA_WidgetData::GetItemValue(const CFX_WideStringC& wsLabel,
-                                   CFX_WideString& wsValue) {
-  int32_t iCount = 0;
-  CXFA_NodeArray listitems;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    iCount++;
-    listitems.Add(pItems);
-  }
-  if (iCount <= 1) {
-    wsValue = wsLabel;
-  } else {
-    CXFA_Node* pLabelItems = listitems[0];
-    FX_BOOL bSave = pLabelItems->GetBoolean(XFA_ATTRIBUTE_Save);
-    CXFA_Node* pSaveItems = NULL;
-    if (bSave) {
-      pSaveItems = pLabelItems;
-      pLabelItems = listitems[1];
-    } else {
-      pSaveItems = listitems[1];
-    }
-    iCount = 0;
-    int32_t iSearch = -1;
-    CFX_WideString wsContent;
-    CXFA_Node* pChildItem = pLabelItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-    for (; pChildItem;
-         pChildItem = pChildItem->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-      pChildItem->TryContent(wsContent);
-      if (wsContent == wsLabel) {
-        iSearch = iCount;
-        break;
-      }
-      iCount++;
-    }
-    if (iSearch < 0) {
-      return;
-    }
-    if (CXFA_Node* pText = pSaveItems->GetChild(iSearch, XFA_ELEMENT_UNKNOWN)) {
-      pText->TryContent(wsValue);
-    }
-  }
-}
-FX_BOOL CXFA_WidgetData::DeleteItem(int32_t nIndex,
-                                    FX_BOOL bNotify,
-                                    FX_BOOL bScriptModify,
-                                    FX_BOOL bSyncData) {
-  FX_BOOL bSetValue = FALSE;
-  CXFA_Node* pItems = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pItems; pItems = pItems->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    if (pItems->GetClassID() != XFA_ELEMENT_Items) {
-      continue;
-    }
-    if (nIndex < 0) {
-      while (CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-        pItems->RemoveChild(pNode);
-      }
-    } else {
-      if (!bSetValue && pItems->GetBoolean(XFA_ATTRIBUTE_Save)) {
-        SetItemState(nIndex, FALSE, TRUE, bScriptModify, bSyncData);
-        bSetValue = TRUE;
-      }
-      int32_t i = 0;
-      CXFA_Node* pNode = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
-      while (pNode) {
-        if (i == nIndex) {
-          pItems->RemoveChild(pNode);
-          break;
-        }
-        i++;
-        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
-      }
-    }
-  }
-  if (!bNotify) {
-    return TRUE;
-  }
-  m_pNode->GetDocument()->GetNotify()->OnWidgetDataEvent(
-      this, XFA_WIDGETEVENT_ListItemRemoved, (void*)(uintptr_t)nIndex);
-  return TRUE;
-}
-int32_t CXFA_WidgetData::GetHorizontalScrollPolicy() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_HScrollPolicy);
-  }
-  return XFA_ATTRIBUTEENUM_Auto;
-}
-int32_t CXFA_WidgetData::GetNumberOfCells() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (!pUIChild) {
-    return -1;
-  }
-  if (CXFA_Node* pNode = pUIChild->GetChild(0, XFA_ELEMENT_Comb)) {
-    return pNode->GetInteger(XFA_ATTRIBUTE_NumberOfCells);
-  }
-  return -1;
-}
-FX_BOOL CXFA_WidgetData::IsDateTimeEditUsePicker() {
-  return TRUE;
-}
-CFX_WideString CXFA_WidgetData::GetBarcodeType() {
-  CXFA_Node* pUIChild = GetUIChild();
-  return pUIChild ? pUIChild->GetCData(XFA_ATTRIBUTE_Type) : NULL;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_CharEncoding(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsCharEncoding;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_CharEncoding, wsCharEncoding)) {
-    if (wsCharEncoding.CompareNoCase(L"UTF-16")) {
-      val = CHAR_ENCODING_UNICODE;
-      return TRUE;
-    } else if (wsCharEncoding.CompareNoCase(L"UTF-8")) {
-      val = CHAR_ENCODING_UTF8;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Checksum(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  XFA_ATTRIBUTEENUM eChecksum;
-  if (pUIChild->TryEnum(XFA_ATTRIBUTE_Checksum, eChecksum)) {
-    switch (eChecksum) {
-      case XFA_ATTRIBUTEENUM_None:
-        val = 0;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Auto:
-        val = 1;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_1mod10:
-        break;
-      case XFA_ATTRIBUTEENUM_1mod10_1mod11:
-        break;
-      case XFA_ATTRIBUTEENUM_2mod10:
-        break;
-      default:
-        break;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_DataLength(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsDataLength;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_DataLength, wsDataLength)) {
-    val = FXSYS_wtoi(wsDataLength);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_StartChar(FX_CHAR& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideStringC wsStartEndChar;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_StartChar, wsStartEndChar)) {
-    if (wsStartEndChar.GetLength()) {
-      val = (FX_CHAR)wsStartEndChar.GetAt(0);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_EndChar(FX_CHAR& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideStringC wsStartEndChar;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_EndChar, wsStartEndChar)) {
-    if (wsStartEndChar.GetLength()) {
-      val = (FX_CHAR)wsStartEndChar.GetAt(0);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ECLevel(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsECLevel;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_ErrorCorrectionLevel, wsECLevel)) {
-    val = FXSYS_wtoi(wsECLevel);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleWidth(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CXFA_Measurement mModuleWidthHeight;
-  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleWidth, mModuleWidthHeight)) {
-    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_ModuleHeight(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CXFA_Measurement mModuleWidthHeight;
-  if (pUIChild->TryMeasure(XFA_ATTRIBUTE_ModuleHeight, mModuleWidthHeight)) {
-    val = (int32_t)mModuleWidthHeight.ToUnit(XFA_UNIT_Pt);
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_PrintChecksum(FX_BOOL& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  FX_BOOL bPrintCheckDigit;
-  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_PrintCheckDigit, bPrintCheckDigit)) {
-    val = bPrintCheckDigit;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_TextLocation(int32_t& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  XFA_ATTRIBUTEENUM eTextLocation;
-  if (pUIChild->TryEnum(XFA_ATTRIBUTE_TextLocation, eTextLocation)) {
-    switch (eTextLocation) {
-      case XFA_ATTRIBUTEENUM_None:
-        val = BC_TEXT_LOC_NONE;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Above:
-        val = BC_TEXT_LOC_ABOVE;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_Below:
-        val = BC_TEXT_LOC_BELOW;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_AboveEmbedded:
-        val = BC_TEXT_LOC_ABOVEEMBED;
-        return TRUE;
-      case XFA_ATTRIBUTEENUM_BelowEmbedded:
-        val = BC_TEXT_LOC_BELOWEMBED;
-        return TRUE;
-      default:
-        break;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_Truncate(FX_BOOL& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  FX_BOOL bTruncate;
-  if (pUIChild->TryBoolean(XFA_ATTRIBUTE_Truncate, bTruncate)) {
-    val = bTruncate;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetBarcodeAttribute_WideNarrowRatio(FX_FLOAT& val) {
-  CXFA_Node* pUIChild = GetUIChild();
-  CFX_WideString wsWideNarrowRatio;
-  if (pUIChild->TryCData(XFA_ATTRIBUTE_WideNarrowRatio, wsWideNarrowRatio)) {
-    FX_STRSIZE ptPos = wsWideNarrowRatio.Find(':');
-    FX_FLOAT fRatio = 0;
-    if (ptPos >= 0) {
-      fRatio = (FX_FLOAT)FXSYS_wtoi(wsWideNarrowRatio);
-    } else {
-      int32_t fA, fB;
-      fA = FXSYS_wtoi(wsWideNarrowRatio.Left(ptPos));
-      fB = FXSYS_wtoi(wsWideNarrowRatio.Mid(ptPos + 1));
-      if (fB) {
-        fRatio = (FX_FLOAT)fA / fB;
-      }
-    }
-    val = fRatio;
-    return TRUE;
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::GetPasswordChar(CFX_WideString& wsPassWord) {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    pUIChild->TryCData(XFA_ATTRIBUTE_PasswordChar, wsPassWord);
-  } else {
-    wsPassWord = XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT_PasswordEdit,
-                                                    XFA_ATTRIBUTE_PasswordChar,
-                                                    XFA_XDPPACKET_Form);
-  }
-}
-FX_BOOL CXFA_WidgetData::IsAllowRichText() {
-  CXFA_Node* pUIChild = GetUIChild();
-  FX_BOOL bValue = FALSE;
-  if (pUIChild &&
-      pUIChild->TryBoolean(XFA_ATTRIBUTE_AllowRichText, bValue, FALSE)) {
-    return bValue;
-  }
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      return pChild->GetClassID() == XFA_ELEMENT_ExData;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::IsMultiLine() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetBoolean(XFA_ATTRIBUTE_MultiLine);
-  }
-  return XFA_GetAttributeDefaultValue_Boolean(
-      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_MultiLine, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
-  CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
-    return pUIChild->GetEnum(XFA_ATTRIBUTE_VScrollPolicy);
-  }
-  return XFA_GetAttributeDefaultValue_Enum(
-      XFA_ELEMENT_TextEdit, XFA_ATTRIBUTE_VScrollPolicy, XFA_XDPPACKET_Form);
-}
-int32_t CXFA_WidgetData::GetMaxChars(XFA_ELEMENT& eType) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) {
-      switch (pChild->GetClassID()) {
-        case XFA_ELEMENT_Text:
-          eType = XFA_ELEMENT_Text;
-          return pChild->GetInteger(XFA_ATTRIBUTE_MaxChars);
-        case XFA_ELEMENT_ExData: {
-          eType = XFA_ELEMENT_ExData;
-          int32_t iMax = pChild->GetInteger(XFA_ATTRIBUTE_MaxLength);
-          return iMax < 0 ? 0 : iMax;
-        }
-        default:
-          break;
-      }
-    }
-  }
-  return 0;
-}
-FX_BOOL CXFA_WidgetData::GetFracDigits(int32_t& iFracDigits) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
-      return pChild->TryInteger(XFA_ATTRIBUTE_FracDigits, iFracDigits);
-    }
-  }
-  iFracDigits = -1;
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetLeadDigits(int32_t& iLeadDigits) {
-  if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_ELEMENT_Value)) {
-    if (CXFA_Node* pChild = pNode->GetChild(0, XFA_ELEMENT_Decimal)) {
-      return pChild->TryInteger(XFA_ATTRIBUTE_LeadDigits, iLeadDigits);
-    }
-  }
-  iLeadDigits = -1;
-  return FALSE;
-}
-CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
-                                int32_t iLead,
-                                int32_t iTread) {
-  if ((iLead == -1) && (iTread == -1)) {
-    return wsValue;
-  }
-  CFX_WideString wsRet;
-  int32_t iLead_ = 0, iTread_ = -1;
-  int32_t iCount = wsValue.GetLength();
-  if (iCount == 0) {
-    return wsValue;
-  }
-  int32_t i = 0;
-  if (wsValue[i] == L'-') {
-    wsRet += L'-';
-    i++;
-  }
-  for (; i < iCount; i++) {
-    FX_WCHAR wc = wsValue[i];
-    if (XFA_IsDigit(wc)) {
-      if (iLead >= 0) {
-        iLead_++;
-        if (iLead_ > iLead) {
-          return L"0";
-        }
-      } else if (iTread_ >= 0) {
-        iTread_++;
-        if (iTread_ > iTread) {
-          if (iTread != -1) {
-            CFX_Decimal wsDeci = CFX_Decimal(wsValue);
-            wsDeci.SetScale(iTread);
-            wsRet = wsDeci;
-          }
-          return wsRet;
-        }
-      }
-    } else if (wc == L'.') {
-      iTread_ = 0;
-      iLead = -1;
-    }
-    wsRet += wc;
-  }
-  return wsRet;
-}
-FX_BOOL CXFA_WidgetData::SetValue(const CFX_WideString& wsValue,
-                                  XFA_VALUEPICTURE eValueType) {
-  if (wsValue.IsEmpty()) {
-    SyncValue(wsValue, TRUE);
-    return TRUE;
-  }
-  m_bPreNull = m_bIsNull;
-  m_bIsNull = FALSE;
-  CFX_WideString wsNewText(wsValue);
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, eValueType);
-  FX_BOOL bValidate = TRUE;
-  FX_BOOL bSyncData = FALSE;
-  CXFA_Node* pNode = GetUIChild();
-  if (!pNode) {
-    return TRUE;
-  }
-  XFA_ELEMENT uiType = pNode->GetClassID();
-  if (!wsPicture.IsEmpty()) {
-    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
-    IFX_Locale* pLocale = GetLocal();
-    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-    bValidate =
-        widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture);
-    if (bValidate) {
-      widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNewText,
-                                     wsPicture, pLocale, pLocalMgr);
-      wsNewText = widgetValue.GetValue();
-      if (uiType == XFA_ELEMENT_NumericEdit) {
-        int32_t iLeadDigits = 0;
-        int32_t iFracDigits = 0;
-        GetLeadDigits(iLeadDigits);
-        GetFracDigits(iFracDigits);
-        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
-      }
-      bSyncData = TRUE;
-    }
-  } else {
-    if (uiType == XFA_ELEMENT_NumericEdit) {
-      if (wsNewText != FX_WSTRC(L"0")) {
-        int32_t iLeadDigits = 0;
-        int32_t iFracDigits = 0;
-        GetLeadDigits(iLeadDigits);
-        GetFracDigits(iFracDigits);
-        wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
-      }
-      bSyncData = TRUE;
-    }
-  }
-  if (uiType != XFA_ELEMENT_NumericEdit || bSyncData) {
-    SyncValue(wsNewText, TRUE);
-  }
-  return bValidate;
-}
-FX_BOOL CXFA_WidgetData::GetPictureContent(CFX_WideString& wsPicture,
-                                           XFA_VALUEPICTURE ePicture) {
-  if (ePicture == XFA_VALUEPICTURE_Raw) {
-    return FALSE;
-  }
-  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-  switch (ePicture) {
-    case XFA_VALUEPICTURE_Display: {
-      if (CXFA_Node* pFormat = m_pNode->GetChild(0, XFA_ELEMENT_Format)) {
-        if (CXFA_Node* pPicture = pFormat->GetChild(0, XFA_ELEMENT_Picture)) {
-          if (pPicture->TryContent(wsPicture)) {
-            return TRUE;
-          }
-        }
-      }
-      CFX_WideString wsDataPicture, wsTimePicture;
-      IFX_Locale* pLocale = GetLocal();
-      if (!pLocale) {
-        return FALSE;
-      }
-      FX_DWORD dwType = widgetValue.GetType();
-      switch (dwType) {
-        case XFA_VT_DATE:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
-          break;
-        case XFA_VT_TIME:
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
-          break;
-        case XFA_VT_DATETIME:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsDataPicture);
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsTimePicture);
-          wsPicture = wsDataPicture + FX_WSTRC(L"T") + wsTimePicture;
-          break;
-        case XFA_VT_DECIMAL:
-        case XFA_VT_FLOAT:
-          break;
-        default:
-          break;
-      }
-    }
-      return TRUE;
-    case XFA_VALUEPICTURE_Edit: {
-      CXFA_Node* pUI = m_pNode->GetChild(0, XFA_ELEMENT_Ui);
-      if (pUI) {
-        if (CXFA_Node* pPicture = pUI->GetChild(0, XFA_ELEMENT_Picture)) {
-          if (pPicture->TryContent(wsPicture)) {
-            return TRUE;
-          }
-        }
-      }
-      {
-        CFX_WideString wsDataPicture, wsTimePicture;
-        IFX_Locale* pLocale = GetLocal();
-        if (!pLocale) {
-          return FALSE;
-        }
-        FX_DWORD dwType = widgetValue.GetType();
-        switch (dwType) {
-          case XFA_VT_DATE:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_TIME:
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_DATETIME:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsDataPicture);
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsTimePicture);
-            wsPicture = wsDataPicture + L"T" + wsTimePicture;
-            break;
-          default:
-            break;
-        }
-      }
-    }
-      return TRUE;
-    case XFA_VALUEPICTURE_DataBind: {
-      if (CXFA_Bind bind = GetBind()) {
-        bind.GetPicture(wsPicture);
-        return TRUE;
-      }
-    } break;
-    default:
-      break;
-  }
-  return FALSE;
-}
-IFX_Locale* CXFA_WidgetData::GetLocal() {
-  IFX_Locale* pLocale = NULL;
-  if (!m_pNode) {
-    return pLocale;
-  }
-  FX_BOOL bLocale = FALSE;
-  CFX_WideString wsLocaleName;
-  bLocale = m_pNode->GetLocaleName(wsLocaleName);
-  if (bLocale) {
-    if (wsLocaleName.Equal(FX_WSTRC(L"ambient"))) {
-      pLocale = m_pNode->GetDocument()->GetLocalMgr()->GetDefLocale();
-    } else {
-      pLocale =
-          m_pNode->GetDocument()->GetLocalMgr()->GetLocaleByName(wsLocaleName);
-    }
-  }
-  return pLocale;
-}
-static FX_BOOL XFA_SplitDateTime(const CFX_WideString& wsDateTime,
-                                 CFX_WideString& wsDate,
-                                 CFX_WideString& wsTime) {
-  wsDate = L"";
-  wsTime = L"";
-  if (wsDateTime.IsEmpty()) {
-    return FALSE;
-  }
-  int nSplitIndex = -1;
-  nSplitIndex = wsDateTime.Find('T');
-  if (nSplitIndex < 0) {
-    nSplitIndex = wsDateTime.Find(' ');
-  }
-  if (nSplitIndex < 0) {
-    return FALSE;
-  }
-  wsDate = wsDateTime.Left(nSplitIndex);
-  if (!wsDate.IsEmpty()) {
-    int32_t iCount = wsDate.GetLength();
-    int32_t i = 0;
-    for (i = 0; i < iCount; i++) {
-      if (wsDate[i] >= '0' && wsDate[i] <= '9') {
-        break;
-      }
-    }
-    if (i == iCount) {
-      return FALSE;
-    }
-  }
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
-  if (!wsTime.IsEmpty()) {
-    int32_t iCount = wsTime.GetLength();
-    int32_t i = 0;
-    for (i = 0; i < iCount; i++) {
-      if (wsTime[i] >= '0' && wsTime[i] <= '9') {
-        break;
-      }
-    }
-    if (i == iCount) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-
-FX_BOOL CXFA_WidgetData::GetValue(CFX_WideString& wsValue,
-                                  XFA_VALUEPICTURE eValueType) {
-  wsValue = m_pNode->GetContent();
-
-  if (eValueType == XFA_VALUEPICTURE_Display)
-    GetItemLabel(wsValue, wsValue);
-
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, eValueType);
-  CXFA_Node* pNode = GetUIChild();
-  if (!pNode)
-    return TRUE;
-
-  XFA_ELEMENT uiType = GetUIChild()->GetClassID();
-  switch (uiType) {
-    case XFA_ELEMENT_ChoiceList: {
-      if (eValueType == XFA_VALUEPICTURE_Display) {
-        int32_t iSelItemIndex = GetSelectedItem(0);
-        if (iSelItemIndex >= 0) {
-          GetChoiceListItem(wsValue, iSelItemIndex);
-          wsPicture.Empty();
-        }
-      }
-    } break;
-    case XFA_ELEMENT_NumericEdit:
-      if (eValueType != XFA_VALUEPICTURE_Raw && wsPicture.IsEmpty()) {
-        IFX_Locale* pLocale = GetLocal();
-        if (eValueType == XFA_VALUEPICTURE_Display && pLocale) {
-          CFX_WideString wsOutput;
-          NormalizeNumStr(wsValue, wsOutput);
-          FormatNumStr(wsOutput, pLocale, wsOutput);
-          wsValue = wsOutput;
-        }
-      }
-      break;
-    default:
-      break;
-  }
-  if (wsPicture.IsEmpty())
-    return TRUE;
-
-  if (IFX_Locale* pLocale = GetLocal()) {
-    CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-    CXFA_LocaleMgr* pLocalMgr = m_pNode->GetDocument()->GetLocalMgr();
-    switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
-          if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
-            return TRUE;
-        }
-        break;
-      }
-      case XFA_VT_TIME: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
-          if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
-            return TRUE;
-        }
-        break;
-      }
-      default:
-        break;
-    }
-    widgetValue.FormatPatterns(wsValue, wsPicture, pLocale, eValueType);
-  }
-  return TRUE;
-}
-
-FX_BOOL CXFA_WidgetData::GetNormalizeDataValue(
-    const CFX_WideStringC& wsValue,
-    CFX_WideString& wsNormalizeValue) {
-  wsNormalizeValue = wsValue;
-  if (wsValue.IsEmpty()) {
-    return TRUE;
-  }
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
-  if (wsPicture.IsEmpty()) {
-    return TRUE;
-  }
-  FXSYS_assert(GetNode());
-  CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
-  IFX_Locale* pLocale = GetLocal();
-  CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
-  if (widgetValue.ValidateValue(wsValue, wsPicture, pLocale, &wsPicture)) {
-    widgetValue = CXFA_LocaleValue(widgetValue.GetType(), wsNormalizeValue,
-                                   wsPicture, pLocale, pLocalMgr);
-    wsNormalizeValue = widgetValue.GetValue();
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_WidgetData::GetFormatDataValue(const CFX_WideStringC& wsValue,
-                                            CFX_WideString& wsFormatedValue) {
-  wsFormatedValue = wsValue;
-  if (wsValue.IsEmpty()) {
-    return TRUE;
-  }
-  CFX_WideString wsPicture;
-  GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind);
-  if (wsPicture.IsEmpty()) {
-    return TRUE;
-  }
-  if (IFX_Locale* pLocale = GetLocal()) {
-    FXSYS_assert(GetNode());
-    CXFA_Node* pNodeValue = GetNode()->GetChild(0, XFA_ELEMENT_Value);
-    if (!pNodeValue) {
-      return FALSE;
-    }
-    CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (!pValueChild) {
-      return FALSE;
-    }
-    int32_t iVTType = XFA_VT_NULL;
-    XFA_ELEMENT eType = pValueChild->GetClassID();
-    switch (eType) {
-      case XFA_ELEMENT_Decimal:
-        iVTType = XFA_VT_DECIMAL;
-        break;
-      case XFA_ELEMENT_Float:
-        iVTType = XFA_VT_FLOAT;
-        break;
-      case XFA_ELEMENT_Date:
-        iVTType = XFA_VT_DATE;
-        break;
-      case XFA_ELEMENT_Time:
-        iVTType = XFA_VT_TIME;
-        break;
-      case XFA_ELEMENT_DateTime:
-        iVTType = XFA_VT_DATETIME;
-        break;
-      case XFA_ELEMENT_Boolean:
-        iVTType = XFA_VT_BOOLEAN;
-        break;
-      case XFA_ELEMENT_Integer:
-        iVTType = XFA_VT_INTEGER;
-        break;
-      case XFA_ELEMENT_Text:
-        iVTType = XFA_VT_TEXT;
-        break;
-      default:
-        iVTType = XFA_VT_NULL;
-        break;
-    }
-    CXFA_LocaleMgr* pLocalMgr = GetNode()->GetDocument()->GetLocalMgr();
-    CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocalMgr);
-    switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocalMgr);
-          if (date.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                                  XFA_VALUEPICTURE_DataBind)) {
-            return TRUE;
-          }
-        }
-        break;
-      }
-      case XFA_VT_TIME: {
-        CFX_WideString wsDate, wsTime;
-        if (XFA_SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocalMgr);
-          if (time.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                                  XFA_VALUEPICTURE_DataBind)) {
-            return TRUE;
-          }
-        }
-        break;
-      }
-      default:
-        break;
-    }
-    widgetValue.FormatPatterns(wsFormatedValue, wsPicture, pLocale,
-                               XFA_VALUEPICTURE_DataBind);
-  }
-  return FALSE;
-}
-void CXFA_WidgetData::NormalizeNumStr(const CFX_WideString& wsValue,
-                                      CFX_WideString& wsOutput) {
-  if (wsValue.IsEmpty()) {
-    return;
-  }
-  wsOutput = wsValue;
-  wsOutput.TrimLeft('0');
-  int32_t dot_index = wsOutput.Find('.');
-  int32_t iFracDigits = 0;
-  if (!wsOutput.IsEmpty() && dot_index >= 0 &&
-      (!GetFracDigits(iFracDigits) || iFracDigits != -1)) {
-    wsOutput.TrimRight(L"0");
-    wsOutput.TrimRight(L".");
-  }
-  if (wsOutput.IsEmpty() || wsOutput[0] == '.') {
-    wsOutput.Insert(0, '0');
-  }
-}
-void CXFA_WidgetData::FormatNumStr(const CFX_WideString& wsValue,
-                                   IFX_Locale* pLocale,
-                                   CFX_WideString& wsOutput) {
-  if (wsValue.IsEmpty()) {
-    return;
-  }
-  CFX_WideString wsSrcNum = wsValue;
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
-  FX_BOOL bNeg = FALSE;
-  if (wsSrcNum[0] == '-') {
-    bNeg = TRUE;
-    wsSrcNum.Delete(0, 1);
-  }
-  int32_t len = wsSrcNum.GetLength();
-  int32_t dot_index = wsSrcNum.Find('.');
-  if (dot_index == -1) {
-    dot_index = len;
-  }
-  int32_t cc = dot_index - 1;
-  if (cc >= 0) {
-    int nPos = dot_index % 3;
-    wsOutput.Empty();
-    for (int32_t i = 0; i < dot_index; i++) {
-      if (i % 3 == nPos && i != 0) {
-        wsOutput += wsGroupSymbol;
-      }
-      wsOutput += wsSrcNum[i];
-    }
-    if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
-      wsOutput += wsSrcNum.Right(len - dot_index - 1);
-    }
-    if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
-    }
-  }
-}
-void CXFA_WidgetData::SyncValue(const CFX_WideString& wsValue,
-                                FX_BOOL bNotify) {
-  if (!m_pNode) {
-    return;
-  }
-  CFX_WideString wsFormatValue(wsValue);
-  CXFA_WidgetData* pContainerWidgetData = m_pNode->GetContainerWidgetData();
-  if (pContainerWidgetData) {
-    pContainerWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
-  }
-  m_pNode->SetContent(wsValue, wsFormatValue, bNotify);
-}
-void CXFA_WidgetData::InsertListTextItem(CXFA_Node* pItems,
-                                         const CFX_WideStringC& wsText,
-                                         int32_t nIndex) {
-  CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_ELEMENT_Text);
-  pItems->InsertChild(nIndex, pText);
-  pText->SetContent(wsText, wsText, FALSE, FALSE, FALSE);
-}
-CXFA_Filter CXFA_WidgetData::GetFilter(FX_BOOL bModified) {
-  if (!m_pUiChildNode) {
-    return CXFA_Filter(nullptr);
-  }
-  return CXFA_Filter(
-      m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Filter, bModified));
-}
-CXFA_Manifest CXFA_WidgetData::GetManifest(FX_BOOL bModified) {
-  if (!m_pUiChildNode) {
-    return CXFA_Manifest(nullptr);
-  }
-  return CXFA_Manifest(
-      m_pUiChildNode->GetProperty(0, XFA_ELEMENT_Manifest, bModified));
-}
-CXFA_Occur::CXFA_Occur(CXFA_Node* pNode) : CXFA_Data(pNode) {}
-int32_t CXFA_Occur::GetMax() {
-  int32_t iMax = 1;
-  if (m_pNode) {
-    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, TRUE)) {
-      iMax = GetMin();
-    }
-  }
-  return iMax;
-}
-int32_t CXFA_Occur::GetMin() {
-  int32_t iMin = 1;
-  if (m_pNode) {
-    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, TRUE) || iMin < 0) {
-      iMin = 1;
-    }
-  }
-  return iMin;
-}
-int32_t CXFA_Occur::GetInitial() {
-  int32_t iInit = 1;
-  if (m_pNode) {
-    int32_t iMin = GetMin();
-    if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, TRUE) ||
-        iInit < iMin) {
-      iInit = iMin;
-    }
-  }
-  return iInit;
-}
-FX_BOOL CXFA_Occur::GetOccurInfo(int32_t& iMin, int32_t& iMax, int32_t& iInit) {
-  if (!m_pNode) {
-    return FALSE;
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE) || iMin < 0) {
-    iMin = 1;
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
-    if (iMin == 0) {
-      iMax = 1;
-    } else {
-      iMax = iMin;
-    }
-  }
-  if (!m_pNode->TryInteger(XFA_ATTRIBUTE_Initial, iInit, FALSE) ||
-      iInit < iMin) {
-    iInit = iMin;
-  }
-  return TRUE;
-}
-void CXFA_Occur::SetMax(int32_t iMax) {
-  iMax = (iMax != -1 && iMax < 1) ? 1 : iMax;
-  m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-  int32_t iMin = GetMin();
-  if (iMax != -1 && iMax < iMin) {
-    iMin = iMax;
-    m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
-  }
-}
-void CXFA_Occur::SetMin(int32_t iMin) {
-  iMin = (iMin < 0) ? 1 : iMin;
-  m_pNode->SetInteger(XFA_ATTRIBUTE_Min, iMin, FALSE);
-  int32_t iMax = GetMax();
-  if (iMax > 0 && iMax < iMin) {
-    iMax = iMin;
-    m_pNode->SetInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
-  }
-}
-XFA_ATTRIBUTEENUM XFA_GetEnumTypeAttribute(
-    CXFA_Node* pNode,
-    XFA_ATTRIBUTE attributeValue = XFA_ATTRIBUTE_Type,
-    XFA_ATTRIBUTEENUM eDefaultValue = XFA_ATTRIBUTEENUM_Optional) {
-  XFA_ATTRIBUTEENUM eType = eDefaultValue;
-  if (pNode) {
-    if (!pNode->TryEnum(attributeValue, eType, TRUE)) {
-      eType = eDefaultValue;
-    }
-  }
-  return eType;
-}
-CFX_WideString CXFA_Filter::GetFilterString(XFA_ATTRIBUTE eAttribute) {
-  CFX_WideString wsStringValue;
-  if (m_pNode) {
-    m_pNode->GetAttribute(eAttribute, wsStringValue, FALSE);
-  }
-  return wsStringValue;
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetAppearanceFilterType() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Optional;
-  }
-  CXFA_Node* pAppearanceFilterNode =
-      m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
-  return XFA_GetEnumTypeAttribute(pAppearanceFilterNode);
-}
-CFX_WideString CXFA_Filter::GetAppearanceFilterContent() {
-  CFX_WideString wsContent;
-  if (m_pNode) {
-    CXFA_Node* pAppearanceFilterNode =
-        m_pNode->GetProperty(0, XFA_ELEMENT_AppearanceFilter);
-    pAppearanceFilterNode->TryContent(wsContent);
-  }
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetCertificatesCredentialServerPolicy() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Optional;
-  }
-  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
-  return XFA_GetEnumTypeAttribute(pCertsNode,
-                                  XFA_ATTRIBUTE_CredentialServerPolicy);
-}
-CFX_WideString CXFA_Filter::GetCertificatesURL() {
-  CFX_WideString wsURL;
-  if (m_pNode) {
-    CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
-    pCertsNode->GetAttribute(XFA_ATTRIBUTE_Url, wsURL, FALSE);
-  }
-  return wsURL;
-}
-CFX_WideString CXFA_Filter::GetCertificatesURLPolicy() {
-  CFX_WideString wsURLPolicy;
-  if (m_pNode) {
-    CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
-    pCertsNode->GetAttribute(XFA_ATTRIBUTE_UrlPolicy, wsURLPolicy, FALSE);
-  }
-  return wsURLPolicy;
-}
-CXFA_WrapCertificate CXFA_Filter::GetCertificatesEncryption(FX_BOOL bModified) {
-  if (!m_pNode) {
-    return CXFA_WrapCertificate(NULL);
-  }
-  CXFA_Node* pCertsNode =
-      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
-  return CXFA_WrapCertificate(
-      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Encryption, bModified)
-                 : NULL);
-}
-CXFA_WrapCertificate CXFA_Filter::GetCertificatesIssuers(FX_BOOL bModified) {
-  if (!m_pNode) {
-    return CXFA_WrapCertificate(NULL);
-  }
-  CXFA_Node* pCertsNode =
-      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
-  return CXFA_WrapCertificate(
-      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Issuers, bModified)
-                 : NULL);
-}
-CFX_WideString CXFA_Filter::GetCertificatesKeyUsageString(
-    XFA_ATTRIBUTE eAttribute) {
-  if (!m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
-  CXFA_Node* pKeyUsageNode = pCertsNode->GetProperty(0, XFA_ELEMENT_KeyUsage);
-  CFX_WideString wsAttributeValue;
-  pKeyUsageNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
-  return wsAttributeValue;
-}
-CXFA_Oids CXFA_Filter::GetCertificatesOids() {
-  if (!m_pNode) {
-    return CXFA_Oids(NULL);
-  }
-  CXFA_Node* pCertsNode = m_pNode->GetProperty(0, XFA_ELEMENT_Certificates);
-  return CXFA_Oids(pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Oids)
-                              : NULL);
-}
-CXFA_WrapCertificate CXFA_Filter::GetCertificatesSigning(FX_BOOL bModified) {
-  if (!m_pNode) {
-    return CXFA_WrapCertificate(NULL);
-  }
-  CXFA_Node* pCertsNode =
-      m_pNode->GetProperty(0, XFA_ELEMENT_Certificates, bModified);
-  return CXFA_WrapCertificate(
-      pCertsNode ? pCertsNode->GetProperty(0, XFA_ELEMENT_Signing, bModified)
-                 : NULL);
-}
-CXFA_DigestMethods CXFA_Filter::GetDigestMethods(FX_BOOL bModified) {
-  return CXFA_DigestMethods(
-      m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_DigestMethods, bModified)
-              : NULL);
-}
-CXFA_Encodings CXFA_Filter::GetEncodings(FX_BOOL bModified) {
-  return CXFA_Encodings(
-      m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Encodings, bModified)
-              : NULL);
-}
-CXFA_EncryptionMethods CXFA_Filter::GetEncryptionMethods(FX_BOOL bModified) {
-  return CXFA_EncryptionMethods(
-      m_pNode
-          ? m_pNode->GetProperty(0, XFA_ELEMENT_EncryptionMethods, bModified)
-          : NULL);
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetHandlerType() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Optional;
-  }
-  CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
-  return XFA_GetEnumTypeAttribute(pHandlerNode);
-}
-CFX_WideString CXFA_Filter::GetHandlerContent() {
-  CFX_WideString wsContent;
-  if (m_pNode) {
-    CXFA_Node* pHandlerNode = m_pNode->GetProperty(0, XFA_ELEMENT_Handler);
-    pHandlerNode->TryContent(wsContent);
-  }
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetlockDocumentType() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Optional;
-  }
-  CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
-  return XFA_GetEnumTypeAttribute(pLockDocNode);
-}
-CFX_WideString CXFA_Filter::GetlockDocumentContent() {
-  CFX_WideString wsContent = FX_WSTRC(L"auto");
-  if (m_pNode) {
-    CXFA_Node* pLockDocNode = m_pNode->GetProperty(0, XFA_ELEMENT_LockDocument);
-    pLockDocNode->TryContent(wsContent);
-  }
-  return wsContent;
-}
-int32_t CXFA_Filter::GetMDPPermissions() {
-  int32_t iPermissions = 2;
-  if (m_pNode) {
-    CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
-    if (!pMDPNode->TryInteger(XFA_ATTRIBUTE_Permissions, iPermissions, TRUE)) {
-      iPermissions = 2;
-    }
-  }
-  return iPermissions;
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetMDPSignatureType() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Filter;
-  }
-  CXFA_Node* pMDPNode = m_pNode->GetProperty(0, XFA_ELEMENT_Mdp);
-  return XFA_GetEnumTypeAttribute(pMDPNode, XFA_ATTRIBUTE_SignatureType,
-                                  XFA_ATTRIBUTEENUM_Filter);
-}
-CXFA_Reasons CXFA_Filter::GetReasons(FX_BOOL bModified) {
-  return CXFA_Reasons(m_pNode ? m_pNode->GetProperty(0, XFA_ELEMENT_Reasons)
-                              : NULL);
-}
-CFX_WideString CXFA_Filter::GetTimeStampServer() {
-  CFX_WideString wsServerURI;
-  if (m_pNode) {
-    CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
-    pTimeStampNode->GetAttribute(XFA_ATTRIBUTE_Server, wsServerURI, FALSE);
-  }
-  return wsServerURI;
-}
-XFA_ATTRIBUTEENUM CXFA_Filter::GetTimeStampType() {
-  if (!m_pNode) {
-    return XFA_ATTRIBUTEENUM_Optional;
-  }
-  CXFA_Node* pTimeStampNode = m_pNode->GetProperty(0, XFA_ELEMENT_TimeStamp);
-  return XFA_GetEnumTypeAttribute(pTimeStampNode);
-}
-CFX_WideString CXFA_Certificate::GetCertificateName() {
-  CFX_WideString wsName;
-  if (m_pNode) {
-    m_pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
-  }
-  return wsName;
-}
-CFX_WideString CXFA_Certificate::GetCertificateContent() {
-  CFX_WideString wsContent;
-  if (m_pNode) {
-    m_pNode->TryContent(wsContent);
-  }
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_WrapCertificate::GetType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_WrapCertificate::CountCertificates() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Certificate) : 0;
-}
-CXFA_Certificate CXFA_WrapCertificate::GetCertificate(int32_t nIndex) {
-  return CXFA_Certificate(
-      (nIndex > -1 && m_pNode)
-          ? m_pNode->GetChild(nIndex, XFA_ELEMENT_Certificate)
-          : NULL);
-}
-XFA_ATTRIBUTEENUM CXFA_Oids::GetOidsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_Oids::CountOids() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Oid) : 0;
-}
-CFX_WideString CXFA_Oids::GetOidContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pOidNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Oid);
-  if (!pOidNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pOidNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_SubjectDNs::GetSubjectDNsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_SubjectDNs::CountSubjectDNs() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_SubjectDN) : 0;
-}
-CFX_WideString CXFA_SubjectDNs::GetSubjectDNString(int32_t nIndex,
-                                                   XFA_ATTRIBUTE eAttribute) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
-  if (!pSubjectDNNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsAttributeValue;
-  pSubjectDNNode->GetAttribute(eAttribute, wsAttributeValue, FALSE);
-  return wsAttributeValue;
-}
-CFX_WideString CXFA_SubjectDNs::GetSubjectDNContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pSubjectDNNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_SubjectDN);
-  if (!pSubjectDNNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pSubjectDNNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_DigestMethods::GetDigestMethodsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_DigestMethods::CountDigestMethods() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_DigestMethod) : 0;
-}
-CFX_WideString CXFA_DigestMethods::GetDigestMethodContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pDigestMethodNode =
-      m_pNode->GetChild(nIndex, XFA_ELEMENT_DigestMethod);
-  if (!pDigestMethodNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pDigestMethodNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_Encodings::GetEncodingsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_Encodings::CountEncodings() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Encoding) : 0;
-}
-CFX_WideString CXFA_Encodings::GetEncodingContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pEncodingNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Encoding);
-  if (!pEncodingNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pEncodingNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_EncryptionMethods::GetEncryptionMethodsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_EncryptionMethods::CountEncryptionMethods() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_EncryptionMethod) : 0;
-}
-CFX_WideString CXFA_EncryptionMethods::GetEncryptionMethodContent(
-    int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pEncryMethodNode =
-      m_pNode->GetChild(nIndex, XFA_ELEMENT_EncryptionMethod);
-  if (!pEncryMethodNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pEncryMethodNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_Reasons::GetReasonsType() {
-  return XFA_GetEnumTypeAttribute(m_pNode);
-}
-int32_t CXFA_Reasons::CountReasons() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Reason) : 0;
-}
-CFX_WideString CXFA_Reasons::GetReasonContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pReasonNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Reason);
-  if (!pReasonNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pReasonNode->TryContent(wsContent);
-  return wsContent;
-}
-XFA_ATTRIBUTEENUM CXFA_Manifest::GetAction() {
-  return XFA_GetEnumTypeAttribute(m_pNode, XFA_ATTRIBUTE_Action,
-                                  XFA_ATTRIBUTEENUM_Include);
-}
-int32_t CXFA_Manifest::CountReives() {
-  return m_pNode ? m_pNode->CountChildren(XFA_ELEMENT_Ref) : 0;
-}
-CFX_WideString CXFA_Manifest::GetRefContent(int32_t nIndex) {
-  if (nIndex <= -1 || !m_pNode) {
-    return FX_WSTRC(L"");
-  }
-  CXFA_Node* pRefNode = m_pNode->GetChild(nIndex, XFA_ELEMENT_Ref);
-  if (!pRefNode) {
-    return FX_WSTRC(L"");
-  }
-  CFX_WideString wsContent;
-  pRefNode->TryContent(wsContent);
-  return wsContent;
-}
diff --git a/xfa/src/fxfa/parser/xfa_parser.h b/xfa/src/fxfa/parser/xfa_parser.h
deleted file mode 100644
index 8142281..0000000
--- a/xfa/src/fxfa/parser/xfa_parser.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_PARSER_H_
-#define XFA_SRC_FXFA_PARSER_XFA_PARSER_H_
-
-#include "xfa/src/fxfa/parser/xfa_document.h"
-
-class IXFA_Parser {
- public:
-  static IXFA_Parser* Create(IXFA_ObjFactory* pFactory,
-                             FX_BOOL bDocumentParser = FALSE);
-  virtual ~IXFA_Parser() {}
-  virtual void Release() = 0;
-  virtual int32_t StartParse(IFX_FileRead* pStream,
-                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP) = 0;
-  virtual int32_t DoParse(IFX_Pause* pPause = NULL) = 0;
-  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
-                               IFDE_XMLNode*& pXMLNode,
-                               IFX_Pause* pPause = NULL) = 0;
-  virtual void ConstructXFANode(CXFA_Node* pXFANode,
-                                IFDE_XMLNode* pXMLNode) = 0;
-  virtual IXFA_ObjFactory* GetFactory() const = 0;
-  virtual CXFA_Node* GetRootNode() const = 0;
-  virtual IFDE_XMLDoc* GetXMLDoc() const = 0;
-  virtual void CloseParser() = 0;
-};
-class IXFA_DocParser : public IXFA_Parser {
- public:
-  static IXFA_DocParser* Create(IXFA_Notify* pNotify);
-  virtual CXFA_Document* GetDocument() const = 0;
-  virtual IXFA_Notify* GetNotify() const = 0;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_PARSER_H_
diff --git a/xfa/src/fxfa/parser/xfa_parser_imp.cpp b/xfa/src/fxfa/parser/xfa_parser_imp.cpp
deleted file mode 100644
index a3d4f94..0000000
--- a/xfa/src/fxfa/parser/xfa_parser_imp.cpp
+++ /dev/null
@@ -1,1568 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_parser_imp.h"
-
-#include "xfa/src/fgas/crt/fgas_codepage.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_basic_imp.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-IXFA_Parser* IXFA_Parser::Create(IXFA_ObjFactory* pFactory,
-                                 FX_BOOL bDocumentParser) {
-  return new CXFA_SimpleParser(pFactory, bDocumentParser);
-}
-CXFA_SimpleParser::CXFA_SimpleParser(IXFA_ObjFactory* pFactory,
-                                     FX_BOOL bDocumentParser)
-    : m_pXMLParser(nullptr),
-      m_pXMLDoc(nullptr),
-      m_pStream(nullptr),
-      m_pFileRead(nullptr),
-      m_pFactory(pFactory),
-      m_pRootNode(nullptr),
-      m_ePacketID(XFA_XDPPACKET_UNKNOWN),
-      m_bDocumentParser(bDocumentParser) {}
-CXFA_SimpleParser::~CXFA_SimpleParser() {
-  CloseParser();
-}
-void CXFA_SimpleParser::SetFactory(IXFA_ObjFactory* pFactory) {
-  m_pFactory = pFactory;
-}
-static IFDE_XMLNode* XFA_FDEExtension_GetDocumentNode(
-    IFDE_XMLDoc* pXMLDoc,
-    FX_BOOL bVerifyWellFormness = FALSE) {
-  if (!pXMLDoc) {
-    return NULL;
-  }
-  IFDE_XMLNode* pXMLFakeRoot = pXMLDoc->GetRoot();
-  for (IFDE_XMLNode* pXMLNode =
-           pXMLFakeRoot->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      if (bVerifyWellFormness) {
-        for (IFDE_XMLNode* pNextNode =
-                 pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling);
-             pNextNode;
-             pNextNode = pNextNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-          if (pNextNode->GetType() == FDE_XMLNODE_Element) {
-            return FALSE;
-          }
-        }
-      }
-      return pXMLNode;
-    }
-  }
-  return NULL;
-}
-int32_t CXFA_SimpleParser::StartParse(IFX_FileRead* pStream,
-                                      XFA_XDPPACKET ePacketID) {
-  CloseParser();
-  m_pFileRead = pStream;
-  m_pStream = IFX_Stream::CreateStream(
-      pStream, FX_STREAMACCESS_Read | FX_STREAMACCESS_Text);
-  if (m_pStream == NULL) {
-    return XFA_PARSESTATUS_StreamErr;
-  }
-  FX_WORD wCodePage = m_pStream->GetCodePage();
-  if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
-      wCodePage != FX_CODEPAGE_UTF8) {
-    m_pStream->SetCodePage(FX_CODEPAGE_UTF8);
-  }
-  m_pXMLDoc = IFDE_XMLDoc::Create();
-  if (m_pXMLDoc == NULL) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  m_pXMLParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream);
-  if (m_pXMLParser == NULL) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  if (!m_pXMLDoc->LoadXML(m_pXMLParser)) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  m_ePacketID = ePacketID;
-  return XFA_PARSESTATUS_Ready;
-}
-int32_t CXFA_SimpleParser::DoParse(IFX_Pause* pPause) {
-  if (m_pXMLDoc == NULL || m_ePacketID == XFA_XDPPACKET_UNKNOWN) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  int32_t iRet = m_pXMLDoc->DoLoad(pPause);
-  if (iRet < 0) {
-    return XFA_PARSESTATUS_SyntaxErr;
-  }
-  if (iRet < 100) {
-    return iRet / 2;
-  }
-  m_pRootNode = ParseAsXDPPacket(XFA_FDEExtension_GetDocumentNode(m_pXMLDoc),
-                                 m_ePacketID);
-  m_pXMLDoc->CloseXML();
-  if (m_pStream) {
-    m_pStream->Release();
-    m_pStream = NULL;
-  }
-  if (!m_pRootNode) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  return XFA_PARSESTATUS_Done;
-}
-int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML,
-                                        IFDE_XMLNode*& pXMLNode,
-                                        IFX_Pause* pPause) {
-  CloseParser();
-  pXMLNode = NULL;
-  IFX_Stream* pStream = XFA_CreateWideTextRead(wsXML);
-  if (!pStream) {
-    return XFA_PARSESTATUS_StreamErr;
-  }
-  m_pStream = pStream;
-  m_pXMLDoc = IFDE_XMLDoc::Create();
-  if (m_pXMLDoc == NULL) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  CXFA_XMLParser* pParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream);
-  if (pParser == NULL) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-
-  pParser->m_dwCheckStatus = 0x03;
-  if (!m_pXMLDoc->LoadXML(pParser)) {
-    return XFA_PARSESTATUS_StatusErr;
-  }
-  int32_t iRet = m_pXMLDoc->DoLoad(pPause);
-  if (iRet < 0 || iRet >= 100) {
-    m_pXMLDoc->CloseXML();
-  }
-  if (iRet < 0) {
-    return XFA_PARSESTATUS_SyntaxErr;
-  }
-  if (iRet < 100) {
-    return iRet / 2;
-  }
-  if (m_pStream) {
-    m_pStream->Release();
-    m_pStream = NULL;
-  }
-  pXMLNode = XFA_FDEExtension_GetDocumentNode(m_pXMLDoc);
-  return XFA_PARSESTATUS_Done;
-}
-
-void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode,
-                                         IFDE_XMLNode* pXMLNode) {
-  XFA_XDPPACKET ePacketID = (XFA_XDPPACKET)pXFANode->GetPacketID();
-  if (ePacketID == XFA_XDPPACKET_Datasets) {
-    if (pXFANode->GetClassID() == XFA_ELEMENT_DataValue) {
-      for (IFDE_XMLNode* pXMLChild =
-               pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-           pXMLChild;
-           pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-        FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
-        if (eNodeType == FDE_XMLNODE_Instruction)
-          continue;
-
-        if (eNodeType == FDE_XMLNODE_Element) {
-          CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
-                                                        XFA_ELEMENT_DataValue);
-          if (!pXFAChild)
-            return;
-
-          CFX_WideString wsNodeStr;
-          ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr);
-          pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr);
-          CFX_WideString wsChildValue;
-          XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild,
-                                       wsChildValue);
-          if (!wsChildValue.IsEmpty())
-            pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsChildValue);
-
-          pXFANode->InsertChild(pXFAChild);
-          pXFAChild->SetXMLMappingNode(pXMLChild);
-          pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-          break;
-        }
-      }
-      m_pRootNode = pXFANode;
-    } else {
-      m_pRootNode = DataLoader(pXFANode, pXMLNode, TRUE);
-    }
-  } else if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) {
-    ParseContentNode(pXFANode, pXMLNode, ePacketID);
-    m_pRootNode = pXFANode;
-  } else {
-    m_pRootNode = NormalLoader(pXFANode, pXMLNode, ePacketID);
-  }
-}
-
-FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
-    IFDE_XMLElement* pNode,
-    const CFX_WideStringC& wsQualifier,
-    CFX_WideString& wsNamespaceURI) {
-  if (!pNode) {
-    return FALSE;
-  }
-  IFDE_XMLNode* pFakeRoot = pNode->GetNodeItem(IFDE_XMLNode::Root);
-  CFX_WideString wsNSAttribute;
-  FX_BOOL bRet = FALSE;
-  if (wsQualifier.IsEmpty()) {
-    wsNSAttribute = FX_WSTRC(L"xmlns");
-    bRet = TRUE;
-  } else {
-    wsNSAttribute = FX_WSTRC(L"xmlns:") + wsQualifier;
-  }
-  for (; pNode != pFakeRoot;
-       pNode = (IFDE_XMLElement*)pNode->GetNodeItem(IFDE_XMLNode::Parent)) {
-    if (pNode->GetType() != FDE_XMLNODE_Element) {
-      continue;
-    }
-    if (pNode->HasAttribute(wsNSAttribute)) {
-      pNode->GetString(wsNSAttribute, wsNamespaceURI);
-      return TRUE;
-    }
-  }
-  wsNamespaceURI.Empty();
-  return bRet;
-}
-static inline void XFA_FDEExtension_GetElementTagNamespaceURI(
-    IFDE_XMLElement* pElement,
-    CFX_WideString& wsNamespaceURI) {
-  CFX_WideString wsNodeStr;
-  pElement->GetNamespacePrefix(wsNodeStr);
-  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr,
-                                                  wsNamespaceURI)) {
-    wsNamespaceURI.Empty();
-  }
-}
-static FX_BOOL XFA_FDEExtension_MatchNodeName(
-    IFDE_XMLNode* pNode,
-    const CFX_WideStringC& wsLocalTagName,
-    const CFX_WideStringC& wsNamespaceURIPrefix,
-    FX_DWORD eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) {
-  if (!pNode || pNode->GetType() != FDE_XMLNODE_Element) {
-    return FALSE;
-  }
-  IFDE_XMLElement* pElement = reinterpret_cast<IFDE_XMLElement*>(pNode);
-  CFX_WideString wsNodeStr;
-  pElement->GetLocalTagName(wsNodeStr);
-  if (wsNodeStr != wsLocalTagName) {
-    return FALSE;
-  }
-  XFA_FDEExtension_GetElementTagNamespaceURI(pElement, wsNodeStr);
-  if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH) {
-    return TRUE;
-  }
-  if (eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) {
-    return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) ==
-           wsNamespaceURIPrefix;
-  }
-  return wsNodeStr == wsNamespaceURIPrefix;
-}
-static FX_BOOL XFA_FDEExtension_GetAttributeLocalName(
-    const CFX_WideStringC& wsAttributeName,
-    CFX_WideString& wsLocalAttrName) {
-  CFX_WideString wsAttrName(wsAttributeName);
-  FX_STRSIZE iFind = wsAttrName.Find(L':', 0);
-  if (iFind < 0) {
-    wsLocalAttrName = wsAttrName;
-    return FALSE;
-  } else {
-    wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - iFind - 1);
-    return TRUE;
-  }
-}
-static FX_BOOL XFA_FDEExtension_ResolveAttribute(
-    IFDE_XMLElement* pElement,
-    const CFX_WideStringC& wsAttributeName,
-    CFX_WideString& wsLocalAttrName,
-    CFX_WideString& wsNamespaceURI) {
-  CFX_WideString wsAttrName(wsAttributeName);
-  CFX_WideString wsNSPrefix;
-  if (XFA_FDEExtension_GetAttributeLocalName(wsAttributeName,
-                                             wsLocalAttrName)) {
-    wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() -
-                                 wsLocalAttrName.GetLength() - 1);
-  }
-  if (wsLocalAttrName == FX_WSTRC(L"xmlns") ||
-      wsNSPrefix == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xml")) {
-    return FALSE;
-  }
-  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
-                                                  wsNamespaceURI)) {
-    wsNamespaceURI.Empty();
-    return FALSE;
-  }
-  return TRUE;
-}
-static FX_BOOL XFA_FDEExtension_FindAttributeWithNS(
-    IFDE_XMLElement* pElement,
-    const CFX_WideStringC& wsLocalAttributeName,
-    const CFX_WideStringC& wsNamespaceURIPrefix,
-    CFX_WideString& wsValue,
-    FX_BOOL bMatchNSAsPrefix = FALSE) {
-  if (!pElement) {
-    return FALSE;
-  }
-  CFX_WideString wsAttrName;
-  CFX_WideString wsAttrValue;
-  CFX_WideString wsAttrNS;
-  for (int32_t iAttrCount = pElement->CountAttributes(), i = 0; i < iAttrCount;
-       i++) {
-    pElement->GetAttribute(i, wsAttrName, wsAttrValue);
-    FX_STRSIZE iFind = wsAttrName.Find(L':', 0);
-    CFX_WideString wsNSPrefix;
-    if (iFind < 0) {
-      if (wsLocalAttributeName != wsAttrName) {
-        continue;
-      }
-    } else {
-      if (wsLocalAttributeName !=
-          wsAttrName.Right(wsAttrName.GetLength() - iFind - 1)) {
-        continue;
-      }
-      wsNSPrefix = wsAttrName.Left(iFind);
-    }
-    if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
-                                                    wsAttrNS)) {
-      continue;
-    }
-    if (bMatchNSAsPrefix) {
-      if (wsAttrNS.Left(wsNamespaceURIPrefix.GetLength()) !=
-          wsNamespaceURIPrefix) {
-        continue;
-      }
-    } else {
-      if (wsAttrNS != wsNamespaceURIPrefix) {
-        continue;
-      }
-    }
-    wsValue = wsAttrValue;
-    return TRUE;
-  }
-  return FALSE;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode,
-                                               XFA_XDPPACKET ePacketID) {
-  switch (ePacketID) {
-    case XFA_XDPPACKET_UNKNOWN:
-      return NULL;
-    case XFA_XDPPACKET_XDP:
-      return ParseAsXDPPacket_XDP(pXMLDocumentNode, ePacketID);
-    case XFA_XDPPACKET_Config:
-      return ParseAsXDPPacket_Config(pXMLDocumentNode, ePacketID);
-    case XFA_XDPPACKET_Template:
-    case XFA_XDPPACKET_Form:
-      return ParseAsXDPPacket_TemplateForm(pXMLDocumentNode, ePacketID);
-    case XFA_XDPPACKET_Datasets:
-      return ParseAsXDPPacket_Data(pXMLDocumentNode, ePacketID);
-    case XFA_XDPPACKET_Xdc:
-      return ParseAsXDPPacket_Xdc(pXMLDocumentNode, ePacketID);
-    case XFA_XDPPACKET_LocaleSet:
-    case XFA_XDPPACKET_ConnectionSet:
-    case XFA_XDPPACKET_SourceSet:
-      return ParseAsXDPPacket_LocaleConnectionSourceSet(pXMLDocumentNode,
-                                                        ePacketID);
-    default:
-      return ParseAsXDPPacket_User(pXMLDocumentNode, ePacketID);
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  if (!XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName,
-          XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) {
-    return nullptr;
-  }
-  CXFA_Node* pXFARootNode =
-      m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa);
-  if (!pXFARootNode) {
-    return nullptr;
-  }
-  m_pRootNode = pXFARootNode;
-  pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa"));
-  {
-    IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLDocumentNode;
-    int32_t iAttributeCount = pElement->CountAttributes();
-    for (int32_t i = 0; i < iAttributeCount; i++) {
-      CFX_WideString wsAttriName, wsAttriValue;
-      pElement->GetAttribute(i, wsAttriName, wsAttriValue);
-      if (wsAttriName == FX_WSTRC(L"uuid")) {
-        pXFARootNode->SetCData(XFA_ATTRIBUTE_Uuid, wsAttriValue);
-      } else if (wsAttriName == FX_WSTRC(L"timeStamp")) {
-        pXFARootNode->SetCData(XFA_ATTRIBUTE_TimeStamp, wsAttriValue);
-      }
-    }
-  }
-  IFDE_XMLNode* pXMLConfigDOMRoot = nullptr;
-  CXFA_Node* pXFAConfigDOMRoot = nullptr;
-  {
-    for (IFDE_XMLNode* pChildItem =
-             pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-         pChildItem;
-         pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-      const XFA_PACKETINFO* pPacketInfo =
-          XFA_GetPacketByIndex(XFA_PACKET_Config);
-      if (!XFA_FDEExtension_MatchNodeName(pChildItem, pPacketInfo->pName,
-                                          pPacketInfo->pURI,
-                                          pPacketInfo->eFlags)) {
-        continue;
-      }
-      if (pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
-        return nullptr;
-      }
-      pXMLConfigDOMRoot = pChildItem;
-      pXFAConfigDOMRoot =
-          ParseAsXDPPacket_Config(pXMLConfigDOMRoot, XFA_XDPPACKET_Config);
-      pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL);
-    }
-  }
-  IFDE_XMLNode* pXMLDatasetsDOMRoot = nullptr;
-  IFDE_XMLNode* pXMLFormDOMRoot = nullptr;
-  IFDE_XMLNode* pXMLTemplateDOMRoot = nullptr;
-  {
-    for (IFDE_XMLNode* pChildItem =
-             pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-         pChildItem;
-         pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-      if (!pChildItem || pChildItem->GetType() != FDE_XMLNODE_Element) {
-        continue;
-      }
-      if (pChildItem == pXMLConfigDOMRoot) {
-        continue;
-      }
-      IFDE_XMLElement* pElement =
-          reinterpret_cast<IFDE_XMLElement*>(pChildItem);
-      CFX_WideString wsPacketName;
-      pElement->GetLocalTagName(wsPacketName);
-      const XFA_PACKETINFO* pPacketInfo = XFA_GetPacketByName(wsPacketName);
-      if (pPacketInfo && pPacketInfo->pURI) {
-        if (!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName,
-                                            pPacketInfo->pURI,
-                                            pPacketInfo->eFlags)) {
-          pPacketInfo = nullptr;
-        }
-      }
-      XFA_XDPPACKET ePacket =
-          pPacketInfo ? pPacketInfo->eName : XFA_XDPPACKET_USER;
-      if (ePacket == XFA_XDPPACKET_XDP) {
-        continue;
-      }
-      if (ePacket == XFA_XDPPACKET_Datasets) {
-        if (pXMLDatasetsDOMRoot) {
-          return nullptr;
-        }
-        pXMLDatasetsDOMRoot = pElement;
-      } else if (ePacket == XFA_XDPPACKET_Form) {
-        if (pXMLFormDOMRoot) {
-          return nullptr;
-        }
-        pXMLFormDOMRoot = pElement;
-      } else if (ePacket == XFA_XDPPACKET_Template) {
-        if (pXMLTemplateDOMRoot) {
-          // Found a duplicate template packet.
-          return nullptr;
-        }
-        CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
-        if (pPacketNode) {
-          pXMLTemplateDOMRoot = pElement;
-          pXFARootNode->InsertChild(pPacketNode);
-        }
-      } else {
-        CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
-        if (pPacketNode) {
-          if (pPacketInfo &&
-              (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) &&
-              pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
-            return nullptr;
-          }
-          pXFARootNode->InsertChild(pPacketNode);
-        }
-      }
-    }
-  }
-  if (!pXMLTemplateDOMRoot) {
-    // No template is found.
-    return nullptr;
-  }
-  if (pXMLDatasetsDOMRoot) {
-    CXFA_Node* pPacketNode =
-        ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets);
-    if (pPacketNode) {
-      pXFARootNode->InsertChild(pPacketNode);
-    }
-  }
-  if (pXMLFormDOMRoot) {
-    CXFA_Node* pPacketNode =
-        ParseAsXDPPacket(pXMLFormDOMRoot, XFA_XDPPACKET_Form);
-    if (pPacketNode) {
-      pXFARootNode->InsertChild(pPacketNode);
-    }
-  }
-  pXFARootNode->SetXMLMappingNode(pXMLDocumentNode);
-  return pXFARootNode;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Config(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  if (!XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName,
-          XFA_GetPacketByIndex(XFA_PACKET_Config)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_Config)->eFlags)) {
-    return NULL;
-  }
-  CXFA_Node* pNode =
-      m_pFactory->CreateNode(XFA_XDPPACKET_Config, XFA_ELEMENT_Config);
-  if (!pNode) {
-    return NULL;
-  }
-  pNode->SetCData(XFA_ATTRIBUTE_Name,
-                  XFA_GetPacketByIndex(XFA_PACKET_Config)->pName);
-  if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
-    return NULL;
-  }
-  pNode->SetXMLMappingNode(pXMLDocumentNode);
-  return pNode;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_TemplateForm(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  CXFA_Node* pNode = NULL;
-  if (ePacketID == XFA_XDPPACKET_Template) {
-    if (XFA_FDEExtension_MatchNodeName(
-            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_Template)->eFlags)) {
-      pNode =
-          m_pFactory->CreateNode(XFA_XDPPACKET_Template, XFA_ELEMENT_Template);
-      if (!pNode) {
-        return NULL;
-      }
-      pNode->SetCData(XFA_ATTRIBUTE_Name,
-                      XFA_GetPacketByIndex(XFA_PACKET_Template)->pName);
-      if (m_bDocumentParser) {
-        CFX_WideString wsNamespaceURI;
-        IFDE_XMLElement* pXMLDocumentElement =
-            (IFDE_XMLElement*)pXMLDocumentNode;
-        pXMLDocumentElement->GetNamespaceURI(wsNamespaceURI);
-        if (wsNamespaceURI.IsEmpty()) {
-          pXMLDocumentElement->GetString(L"xmlns:xfa", wsNamespaceURI);
-        }
-        pNode->GetDocument()->RecognizeXFAVersionNumber(wsNamespaceURI);
-      }
-      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
-        return NULL;
-      }
-    }
-  } else if (ePacketID == XFA_XDPPACKET_Form) {
-    if (XFA_FDEExtension_MatchNodeName(
-            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_Form)->eFlags)) {
-      IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode;
-      CFX_WideString wsChecksum;
-      pXMLDocumentElement->GetString(L"checksum", wsChecksum);
-      if (wsChecksum.GetLength() != 28 ||
-          m_pXMLParser->m_dwCheckStatus != 0x03) {
-        return NULL;
-      }
-      IXFA_ChecksumContext* pChecksum = XFA_Checksum_Create();
-      pChecksum->StartChecksum();
-      pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0],
-                                m_pXMLParser->m_nSize[0]);
-      pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[1],
-                                m_pXMLParser->m_nSize[1]);
-      pChecksum->FinishChecksum();
-      CFX_ByteString bsCheck;
-      pChecksum->GetChecksum(bsCheck);
-      pChecksum->Release();
-      if (bsCheck != wsChecksum.UTF8Encode()) {
-        return NULL;
-      }
-
-      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form);
-      if (!pNode) {
-        return NULL;
-      }
-      pNode->SetCData(XFA_ATTRIBUTE_Name,
-                      XFA_GetPacketByIndex(XFA_PACKET_Form)->pName);
-      pNode->SetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum);
-      CXFA_Node* pTemplateRoot =
-          m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template);
-      CXFA_Node* pTemplateChosen =
-          pTemplateRoot
-              ? pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform)
-              : NULL;
-      FX_BOOL bUseAttribute = TRUE;
-      if (pTemplateChosen &&
-          pTemplateChosen->GetEnum(XFA_ATTRIBUTE_RestoreState) !=
-              XFA_ATTRIBUTEENUM_Auto) {
-        bUseAttribute = FALSE;
-      }
-      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID, bUseAttribute)) {
-        return NULL;
-      }
-    }
-  }
-  if (pNode) {
-    pNode->SetXMLMappingNode(pXMLDocumentNode);
-  }
-  return pNode;
-}
-static IFDE_XMLNode* XFA_GetDataSetsFromXDP(IFDE_XMLNode* pXMLDocumentNode) {
-  if (XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName,
-          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
-    return pXMLDocumentNode;
-  }
-  if (!XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName,
-          XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) {
-    return NULL;
-  }
-  for (IFDE_XMLNode* pDatasetsNode =
-           pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pDatasetsNode;
-       pDatasetsNode = pDatasetsNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    if (!XFA_FDEExtension_MatchNodeName(
-            pDatasetsNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
-      continue;
-    }
-    return pDatasetsNode;
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Data(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  IFDE_XMLNode* pDatasetsXMLNode = XFA_GetDataSetsFromXDP(pXMLDocumentNode);
-  if (pDatasetsXMLNode) {
-    CXFA_Node* pNode =
-        m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel);
-    if (!pNode) {
-      return NULL;
-    }
-    pNode->SetCData(XFA_ATTRIBUTE_Name,
-                    XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName);
-    if (!DataLoader(pNode, pDatasetsXMLNode, FALSE)) {
-      return NULL;
-    }
-    pNode->SetXMLMappingNode(pDatasetsXMLNode);
-    return pNode;
-  }
-  IFDE_XMLNode* pDataXMLNode = NULL;
-  if (XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, FX_WSTRC(L"data"),
-          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) {
-    ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa");
-    pDataXMLNode = pXMLDocumentNode;
-  } else {
-    IFDE_XMLElement* pDataElement =
-        IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data"));
-    IFDE_XMLNode* pParentXMLNode =
-        pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::Parent);
-    if (pParentXMLNode) {
-      pParentXMLNode->RemoveChildNode(pXMLDocumentNode);
-    }
-    FXSYS_assert(pXMLDocumentNode->GetType() == FDE_XMLNODE_Element);
-    if (pXMLDocumentNode->GetType() == FDE_XMLNODE_Element) {
-      ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa");
-    }
-    pDataElement->InsertChildNode(pXMLDocumentNode);
-    pDataXMLNode = pDataElement;
-  }
-  if (pDataXMLNode) {
-    CXFA_Node* pNode =
-        m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup);
-    if (!pNode) {
-      if (pDataXMLNode != pXMLDocumentNode) {
-        pDataXMLNode->Release();
-      }
-      return NULL;
-    }
-    CFX_WideString wsLocalName;
-    ((IFDE_XMLElement*)pDataXMLNode)->GetLocalTagName(wsLocalName);
-    pNode->SetCData(XFA_ATTRIBUTE_Name, wsLocalName);
-    if (!DataLoader(pNode, pDataXMLNode, TRUE)) {
-      return NULL;
-    }
-    pNode->SetXMLMappingNode(pDataXMLNode);
-    if (pDataXMLNode != pXMLDocumentNode) {
-      pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
-    }
-    return pNode;
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_LocaleConnectionSourceSet(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  CXFA_Node* pNode = NULL;
-  if (ePacketID == XFA_XDPPACKET_LocaleSet) {
-    if (XFA_FDEExtension_MatchNodeName(
-            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->eFlags)) {
-      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_LocaleSet,
-                                     XFA_ELEMENT_LocaleSet);
-      if (!pNode) {
-        return NULL;
-      }
-      pNode->SetCData(XFA_ATTRIBUTE_Name,
-                      XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName);
-      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
-        return NULL;
-      }
-    }
-  } else if (ePacketID == XFA_XDPPACKET_ConnectionSet) {
-    if (XFA_FDEExtension_MatchNodeName(
-            pXMLDocumentNode,
-            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->eFlags)) {
-      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_ConnectionSet,
-                                     XFA_ELEMENT_ConnectionSet);
-      if (!pNode) {
-        return NULL;
-      }
-      pNode->SetCData(XFA_ATTRIBUTE_Name,
-                      XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName);
-      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
-        return NULL;
-      }
-    }
-  } else if (ePacketID == XFA_XDPPACKET_SourceSet) {
-    if (XFA_FDEExtension_MatchNodeName(
-            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName,
-            XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pURI,
-            XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->eFlags)) {
-      pNode = m_pFactory->CreateNode(XFA_XDPPACKET_SourceSet,
-                                     XFA_ELEMENT_SourceSet);
-      if (!pNode) {
-        return NULL;
-      }
-      pNode->SetCData(XFA_ATTRIBUTE_Name,
-                      XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName);
-      if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) {
-        return NULL;
-      }
-    }
-  }
-  if (pNode) {
-    pNode->SetXMLMappingNode(pXMLDocumentNode);
-  }
-  return pNode;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Xdc(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  if (XFA_FDEExtension_MatchNodeName(
-          pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName,
-          XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pURI,
-          XFA_GetPacketByIndex(XFA_PACKET_Xdc)->eFlags)) {
-    CXFA_Node* pNode =
-        m_pFactory->CreateNode(XFA_XDPPACKET_Xdc, XFA_ELEMENT_Xdc);
-    if (!pNode) {
-      return NULL;
-    }
-    pNode->SetCData(XFA_ATTRIBUTE_Name,
-                    XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName);
-    pNode->SetXMLMappingNode(pXMLDocumentNode);
-    return pNode;
-  }
-  return NULL;
-}
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_User(
-    IFDE_XMLNode* pXMLDocumentNode,
-    XFA_XDPPACKET ePacketID) {
-  CXFA_Node* pNode =
-      m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Packet);
-  if (!pNode) {
-    return NULL;
-  }
-  CFX_WideString wsName;
-  ((IFDE_XMLElement*)pXMLDocumentNode)->GetLocalTagName(wsName);
-  pNode->SetCData(XFA_ATTRIBUTE_Name, wsName);
-  if (!UserPacketLoader(pNode, pXMLDocumentNode)) {
-    return NULL;
-  }
-  pNode->SetXMLMappingNode(pXMLDocumentNode);
-  return pNode;
-}
-CXFA_Node* CXFA_SimpleParser::UserPacketLoader(CXFA_Node* pXFANode,
-                                               IFDE_XMLNode* pXMLDoc) {
-  return pXFANode;
-}
-static FX_BOOL XFA_FDEExtension_IsStringAllWhitespace(CFX_WideString wsText) {
-  wsText.TrimRight(L"\x20\x9\xD\xA");
-  return wsText.IsEmpty();
-}
-CXFA_Node* CXFA_SimpleParser::DataLoader(CXFA_Node* pXFANode,
-                                         IFDE_XMLNode* pXMLDoc,
-                                         FX_BOOL bDoTransform) {
-  ParseDataGroup(pXFANode, pXMLDoc, XFA_XDPPACKET_Datasets);
-  return pXFANode;
-}
-CXFA_Node* CXFA_SimpleParser::NormalLoader(CXFA_Node* pXFANode,
-                                           IFDE_XMLNode* pXMLDoc,
-                                           XFA_XDPPACKET ePacketID,
-                                           FX_BOOL bUseAttribute) {
-  FX_BOOL bOneOfPropertyFound = FALSE;
-  for (IFDE_XMLNode* pXMLChild = pXMLDoc->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    switch (pXMLChild->GetType()) {
-      case FDE_XMLNODE_Element: {
-        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
-        CFX_WideString wsTagName;
-        pXMLElement->GetLocalTagName(wsTagName);
-        const XFA_ELEMENTINFO* pElemInfo = XFA_GetElementByName(wsTagName);
-        if (!pElemInfo) {
-          continue;
-        }
-        const XFA_PROPERTY* pPropertyInfo = XFA_GetPropertyOfElement(
-            pXFANode->GetClassID(), pElemInfo->eName, ePacketID);
-        if (pPropertyInfo &&
-            ((pPropertyInfo->uFlags &
-              (XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf)) != 0)) {
-          if (bOneOfPropertyFound) {
-            break;
-          }
-          bOneOfPropertyFound = TRUE;
-        }
-        CXFA_Node* pXFAChild =
-            m_pFactory->CreateNode(ePacketID, pElemInfo->eName);
-        if (pXFAChild == NULL) {
-          return NULL;
-        }
-        if (ePacketID == XFA_XDPPACKET_Config) {
-          pXFAChild->SetAttribute(XFA_ATTRIBUTE_Name, wsTagName);
-        }
-        FX_BOOL IsNeedValue = TRUE;
-        for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count;
-             i++) {
-          CFX_WideString wsAttrQualifiedName;
-          CFX_WideString wsAttrName;
-          CFX_WideString wsAttrValue;
-          pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue);
-          XFA_FDEExtension_GetAttributeLocalName(wsAttrQualifiedName,
-                                                 wsAttrName);
-          if (wsAttrName == FX_WSTRC(L"nil") &&
-              wsAttrValue == FX_WSTRC(L"true")) {
-            IsNeedValue = FALSE;
-          }
-          const XFA_ATTRIBUTEINFO* lpAttrInfo =
-              XFA_GetAttributeByName(wsAttrName);
-          if (!lpAttrInfo) {
-            continue;
-          }
-          if (!bUseAttribute && lpAttrInfo->eName != XFA_ATTRIBUTE_Name &&
-              lpAttrInfo->eName != XFA_ATTRIBUTE_Save) {
-            continue;
-          }
-          pXFAChild->SetAttribute(lpAttrInfo->eName, wsAttrValue);
-        }
-        pXFANode->InsertChild(pXFAChild);
-        if (pElemInfo->eName == XFA_ELEMENT_Validate ||
-            pElemInfo->eName == XFA_ELEMENT_Locale) {
-          if (ePacketID == XFA_XDPPACKET_Config) {
-            ParseContentNode(pXFAChild, pXMLElement, ePacketID);
-          } else {
-            NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute);
-          }
-          break;
-        }
-        switch (pXFAChild->GetObjectType()) {
-          case XFA_OBJECTTYPE_ContentNode:
-          case XFA_OBJECTTYPE_TextNode:
-          case XFA_OBJECTTYPE_NodeC:
-          case XFA_OBJECTTYPE_NodeV:
-            if (IsNeedValue) {
-              ParseContentNode(pXFAChild, pXMLElement, ePacketID);
-            }
-            break;
-          default:
-            NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute);
-            break;
-        }
-      } break;
-      case FDE_XMLNODE_Instruction:
-        ParseInstruction(pXFANode, (IFDE_XMLInstruction*)pXMLChild, ePacketID);
-        break;
-      default:
-        break;
-    }
-  }
-  return pXFANode;
-}
-FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode) {
-  if (pRichTextXMLNode) {
-    CFX_WideString wsNamespaceURI;
-    XFA_FDEExtension_GetElementTagNamespaceURI(pRichTextXMLNode,
-                                               wsNamespaceURI);
-    if (wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/1999/xhtml")) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-class RichTextNodeVisitor {
- public:
-  static inline IFDE_XMLNode* GetFirstChild(IFDE_XMLNode* pNode) {
-    return pNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-  }
-  static inline IFDE_XMLNode* GetNextSibling(IFDE_XMLNode* pNode) {
-    return pNode->GetNodeItem(IFDE_XMLNode::NextSibling);
-  }
-  static inline IFDE_XMLNode* GetParent(IFDE_XMLNode* pNode) {
-    return pNode->GetNodeItem(IFDE_XMLNode::Parent);
-  }
-};
-
-void XFA_ConvertXMLToPlainText(IFDE_XMLElement* pRootXMLNode,
-                               CFX_WideString& wsOutput) {
-  for (IFDE_XMLNode* pXMLChild =
-           pRootXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    switch (pXMLChild->GetType()) {
-      case FDE_XMLNODE_Element: {
-        CFX_WideString wsTextData;
-        ((IFDE_XMLElement*)pXMLChild)->GetTextData(wsTextData);
-        wsTextData += FX_WSTRC(L"\n");
-        wsOutput += wsTextData;
-      } break;
-      case FDE_XMLNODE_Text: {
-        CFX_WideString wsText;
-        ((IFDE_XMLText*)pXMLChild)->GetText(wsText);
-        if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) {
-          continue;
-        } else {
-          wsOutput = wsText;
-        }
-      } break;
-      case FDE_XMLNODE_CharData: {
-        CFX_WideString wsCharData;
-        ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsCharData);
-        if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) {
-          continue;
-        } else {
-          wsOutput = wsCharData;
-        }
-      } break;
-      default:
-        FXSYS_assert(FALSE);
-        break;
-    }
-  }
-}
-
-void CXFA_SimpleParser::ParseContentNode(CXFA_Node* pXFANode,
-                                         IFDE_XMLNode* pXMLNode,
-                                         XFA_XDPPACKET ePacketID) {
-  XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
-  if (pXFANode->GetClassID() == XFA_ELEMENT_ExData) {
-    CFX_WideStringC wsContentType =
-        pXFANode->GetCData(XFA_ATTRIBUTE_ContentType);
-    if (wsContentType == FX_WSTRC(L"text/html"))
-      element = XFA_ELEMENT_SharpxHTML;
-    else if (wsContentType == FX_WSTRC(L"text/xml"))
-      element = XFA_ELEMENT_Sharpxml;
-  }
-  if (element == XFA_ELEMENT_SharpxHTML)
-    pXFANode->SetXMLMappingNode(pXMLNode);
-
-  CFX_WideString wsValue;
-  for (IFDE_XMLNode* pXMLChild =
-           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
-    if (eNodeType == FDE_XMLNODE_Instruction)
-      continue;
-
-    if (element == XFA_ELEMENT_SharpxHTML) {
-      if (eNodeType != FDE_XMLNODE_Element)
-        break;
-
-      if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild))
-        XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsValue);
-    } else if (element == XFA_ELEMENT_Sharpxml) {
-      if (eNodeType != FDE_XMLNODE_Element)
-        break;
-      XFA_ConvertXMLToPlainText((IFDE_XMLElement*)pXMLChild, wsValue);
-    } else {
-      if (eNodeType == FDE_XMLNODE_Element)
-        break;
-      if (eNodeType == FDE_XMLNODE_Text)
-        ((IFDE_XMLText*)pXMLChild)->GetText(wsValue);
-      else if (eNodeType == FDE_XMLNODE_CharData)
-        ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsValue);
-    }
-    break;
-  }
-  if (!wsValue.IsEmpty()) {
-    if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) {
-      CXFA_Node* pContentRawDataNode =
-          m_pFactory->CreateNode(ePacketID, element);
-      FXSYS_assert(pContentRawDataNode);
-      pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsValue);
-      pXFANode->InsertChild(pContentRawDataNode);
-    } else {
-      pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsValue);
-    }
-  }
-}
-
-void CXFA_SimpleParser::ParseDataGroup(CXFA_Node* pXFANode,
-                                       IFDE_XMLNode* pXMLNode,
-                                       XFA_XDPPACKET ePacketID) {
-  for (IFDE_XMLNode* pXMLChild =
-           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    switch (pXMLChild->GetType()) {
-      case FDE_XMLNODE_Element: {
-        IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild;
-        {
-          CFX_WideString wsNamespaceURI;
-          XFA_FDEExtension_GetElementTagNamespaceURI(pXMLElement,
-                                                     wsNamespaceURI);
-          if (wsNamespaceURI ==
-                  FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") ||
-              wsNamespaceURI ==
-                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") ||
-              wsNamespaceURI ==
-                  FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance")) {
-            continue;
-          }
-          if (0) {
-            continue;
-          }
-        }
-        XFA_ELEMENT eNodeType = XFA_ELEMENT_DataModel;
-        if (eNodeType == XFA_ELEMENT_DataModel) {
-          CFX_WideString wsDataNodeAttr;
-          if (XFA_FDEExtension_FindAttributeWithNS(
-                  pXMLElement, FX_WSTRC(L"dataNode"),
-                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"),
-                  wsDataNodeAttr)) {
-            if (wsDataNodeAttr == FX_WSTRC(L"dataGroup")) {
-              eNodeType = XFA_ELEMENT_DataGroup;
-            } else if (wsDataNodeAttr == FX_WSTRC(L"dataValue")) {
-              eNodeType = XFA_ELEMENT_DataValue;
-            }
-          }
-        }
-        CFX_WideString wsContentType;
-        if (eNodeType == XFA_ELEMENT_DataModel) {
-          if (XFA_FDEExtension_FindAttributeWithNS(
-                  pXMLElement, FX_WSTRC(L"contentType"),
-                  FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"),
-                  wsContentType)) {
-            if (!wsContentType.IsEmpty()) {
-              eNodeType = XFA_ELEMENT_DataValue;
-            }
-          }
-        }
-        if (eNodeType == XFA_ELEMENT_DataModel) {
-          for (IFDE_XMLNode* pXMLDataChild =
-                   pXMLElement->GetNodeItem(IFDE_XMLNode::FirstChild);
-               pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNodeItem(
-                                  IFDE_XMLNode::NextSibling)) {
-            if (pXMLDataChild->GetType() == FDE_XMLNODE_Element) {
-              if (!XFA_RecognizeRichText((IFDE_XMLElement*)pXMLDataChild)) {
-                eNodeType = XFA_ELEMENT_DataGroup;
-                break;
-              }
-            }
-          }
-        }
-        if (eNodeType == XFA_ELEMENT_DataModel) {
-          eNodeType = XFA_ELEMENT_DataValue;
-        }
-        CXFA_Node* pXFAChild =
-            m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, eNodeType);
-        if (pXFAChild == NULL) {
-          return;
-        }
-        CFX_WideString wsNodeName;
-        pXMLElement->GetLocalTagName(wsNodeName);
-        pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeName);
-        FX_BOOL bNeedValue = TRUE;
-        if (1) {
-          for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count;
-               i++) {
-            CFX_WideString wsAttrQualifiedName;
-            CFX_WideString wsAttrValue;
-            CFX_WideString wsAttrName;
-            CFX_WideString wsAttrNamespaceURI;
-            pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue);
-            if (!XFA_FDEExtension_ResolveAttribute(
-                    pXMLElement, wsAttrQualifiedName, wsAttrName,
-                    wsAttrNamespaceURI)) {
-              continue;
-            }
-            if (wsAttrName == FX_WSTRC(L"nil") &&
-                wsAttrValue == FX_WSTRC(L"true")) {
-              bNeedValue = FALSE;
-              continue;
-            }
-            if (wsAttrNamespaceURI ==
-                    FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") ||
-                wsAttrNamespaceURI ==
-                    FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") ||
-                wsAttrNamespaceURI ==
-                    FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance") ||
-                wsAttrNamespaceURI ==
-                    FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")) {
-              continue;
-            }
-            if (0) {
-              continue;
-            }
-            CXFA_Node* pXFAMetaData = m_pFactory->CreateNode(
-                XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue);
-            if (pXFAMetaData == NULL) {
-              return;
-            }
-            pXFAMetaData->SetCData(XFA_ATTRIBUTE_Name, wsAttrName);
-            pXFAMetaData->SetCData(XFA_ATTRIBUTE_QualifiedName,
-                                   wsAttrQualifiedName);
-            pXFAMetaData->SetCData(XFA_ATTRIBUTE_Value, wsAttrValue);
-            pXFAMetaData->SetEnum(XFA_ATTRIBUTE_Contains,
-                                  XFA_ATTRIBUTEENUM_MetaData);
-            pXFAChild->InsertChild(pXFAMetaData);
-            pXFAMetaData->SetXMLMappingNode(pXMLElement);
-            pXFAMetaData->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-          }
-          if (!bNeedValue) {
-            CFX_WideString wsNilName = FX_WSTRC(L"xsi:nil");
-            pXMLElement->RemoveAttribute(wsNilName);
-          }
-        }
-        pXFANode->InsertChild(pXFAChild);
-        if (eNodeType == XFA_ELEMENT_DataGroup) {
-          ParseDataGroup(pXFAChild, pXMLElement, ePacketID);
-        } else {
-          if (bNeedValue) {
-            ParseDataValue(pXFAChild, pXMLChild, XFA_XDPPACKET_Datasets);
-          }
-        }
-        pXFAChild->SetXMLMappingNode(pXMLElement);
-        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      }
-        continue;
-      case FDE_XMLNODE_CharData: {
-        IFDE_XMLCharData* pXMLCharData = (IFDE_XMLCharData*)pXMLChild;
-        CFX_WideString wsCharData;
-        pXMLCharData->GetCharData(wsCharData);
-        if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) {
-          continue;
-        }
-        CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
-                                                      XFA_ELEMENT_DataValue);
-        if (pXFAChild == NULL) {
-          return;
-        }
-        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCharData);
-        pXFANode->InsertChild(pXFAChild);
-        pXFAChild->SetXMLMappingNode(pXMLCharData);
-        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      }
-        continue;
-      case FDE_XMLNODE_Text: {
-        IFDE_XMLText* pXMLText = (IFDE_XMLText*)pXMLChild;
-        CFX_WideString wsText;
-        pXMLText->GetText(wsText);
-        if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) {
-          continue;
-        }
-        CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets,
-                                                      XFA_ELEMENT_DataValue);
-        if (pXFAChild == NULL) {
-          return;
-        }
-        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsText);
-        pXFANode->InsertChild(pXFAChild);
-        pXFAChild->SetXMLMappingNode(pXMLText);
-        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      }
-        continue;
-      case FDE_XMLNODE_Instruction:
-        continue;
-      default:
-        continue;
-    }
-  }
-}
-
-void CXFA_SimpleParser::ParseDataValue(CXFA_Node* pXFANode,
-                                       IFDE_XMLNode* pXMLNode,
-                                       XFA_XDPPACKET ePacketID) {
-  CFX_WideTextBuf wsValueTextBuf;
-  CFX_WideTextBuf wsCurValueTextBuf;
-  FX_BOOL bMarkAsCompound = FALSE;
-  IFDE_XMLNode* pXMLCurValueNode = nullptr;
-  for (IFDE_XMLNode* pXMLChild =
-           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pXMLChild;
-       pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    FDE_XMLNODETYPE eNodeType = pXMLChild->GetType();
-    if (eNodeType == FDE_XMLNODE_Instruction)
-      continue;
-
-    CFX_WideString wsText;
-    if (eNodeType == FDE_XMLNODE_Text) {
-      ((IFDE_XMLText*)pXMLChild)->GetText(wsText);
-      if (!pXMLCurValueNode)
-        pXMLCurValueNode = pXMLChild;
-
-      wsCurValueTextBuf << wsText;
-    } else if (eNodeType == FDE_XMLNODE_CharData) {
-      ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsText);
-      if (!pXMLCurValueNode)
-        pXMLCurValueNode = pXMLChild;
-
-      wsCurValueTextBuf << wsText;
-    } else if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) {
-      XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsText);
-      if (!pXMLCurValueNode)
-        pXMLCurValueNode = pXMLChild;
-
-      wsCurValueTextBuf << wsText;
-    } else {
-      bMarkAsCompound = TRUE;
-      if (pXMLCurValueNode) {
-        CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString();
-        if (!wsCurValue.IsEmpty()) {
-          CXFA_Node* pXFAChild =
-              m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
-          if (!pXFAChild)
-            return;
-
-          pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L""));
-          pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue);
-          pXFANode->InsertChild(pXFAChild);
-          pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
-          pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-          wsValueTextBuf << wsCurValue;
-          wsCurValueTextBuf.Clear();
-        }
-        pXMLCurValueNode = nullptr;
-      }
-      CXFA_Node* pXFAChild =
-          m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
-      if (!pXFAChild)
-        return;
-
-      CFX_WideString wsNodeStr;
-      ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr);
-      pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr);
-      ParseDataValue(pXFAChild, pXMLChild, ePacketID);
-      pXFANode->InsertChild(pXFAChild);
-      pXFAChild->SetXMLMappingNode(pXMLChild);
-      pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      CFX_WideStringC wsCurValue = pXFAChild->GetCData(XFA_ATTRIBUTE_Value);
-      wsValueTextBuf << wsCurValue;
-    }
-  }
-  if (pXMLCurValueNode) {
-    CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString();
-    if (!wsCurValue.IsEmpty()) {
-      if (bMarkAsCompound) {
-        CXFA_Node* pXFAChild =
-            m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue);
-        if (!pXFAChild)
-          return;
-
-        pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L""));
-        pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue);
-        pXFANode->InsertChild(pXFAChild);
-        pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
-        pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE);
-      }
-      wsValueTextBuf << wsCurValue;
-      wsCurValueTextBuf.Clear();
-    }
-    pXMLCurValueNode = nullptr;
-  }
-  CFX_WideStringC wsNodeValue = wsValueTextBuf.GetWideString();
-  pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsNodeValue);
-}
-
-void CXFA_SimpleParser::ParseInstruction(CXFA_Node* pXFANode,
-                                         IFDE_XMLInstruction* pXMLInstruction,
-                                         XFA_XDPPACKET ePacketID) {
-  if (!m_bDocumentParser) {
-    return;
-  }
-  CFX_WideString wsTargetName;
-  pXMLInstruction->GetTargetName(wsTargetName);
-  if (wsTargetName == FX_WSTRC(L"originalXFAVersion")) {
-    CFX_WideString wsData;
-    if (pXMLInstruction->GetData(0, wsData) &&
-        (pXFANode->GetDocument()->RecognizeXFAVersionNumber(wsData) !=
-         XFA_VERSION_UNKNOWN)) {
-      wsData.Empty();
-      if (pXMLInstruction->GetData(1, wsData) &&
-          wsData == FX_WSTRC(L"v2.7-scripting:1")) {
-        pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, TRUE);
-      }
-    }
-  } else if (wsTargetName == FX_WSTRC(L"acrobat")) {
-    CFX_WideString wsData;
-    if (pXMLInstruction->GetData(0, wsData) &&
-        wsData == FX_WSTRC(L"JavaScript")) {
-      if (pXMLInstruction->GetData(1, wsData) &&
-          wsData == FX_WSTRC(L"strictScoping")) {
-        pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, TRUE);
-      }
-    }
-  }
-}
-void CXFA_SimpleParser::CloseParser() {
-  if (m_pXMLDoc) {
-    m_pXMLDoc->Release();
-    m_pXMLDoc = NULL;
-  }
-  if (m_pStream) {
-    m_pStream->Release();
-    m_pStream = NULL;
-  }
-}
-IXFA_DocParser* IXFA_DocParser::Create(IXFA_Notify* pNotify) {
-  return new CXFA_DocumentParser(pNotify);
-}
-CXFA_DocumentParser::CXFA_DocumentParser(IXFA_Notify* pNotify)
-    : m_nodeParser(NULL, TRUE), m_pNotify(pNotify), m_pDocument(NULL) {}
-CXFA_DocumentParser::~CXFA_DocumentParser() {
-  CloseParser();
-}
-int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream,
-                                        XFA_XDPPACKET ePacketID) {
-  CloseParser();
-  int32_t nRetStatus = m_nodeParser.StartParse(pStream, ePacketID);
-  if (nRetStatus == XFA_PARSESTATUS_Ready) {
-    m_pDocument = new CXFA_Document(this);
-    m_nodeParser.SetFactory(m_pDocument);
-  }
-  return nRetStatus;
-}
-int32_t CXFA_DocumentParser::DoParse(IFX_Pause* pPause) {
-  int32_t nRetStatus = m_nodeParser.DoParse(pPause);
-  if (nRetStatus >= XFA_PARSESTATUS_Done) {
-    FXSYS_assert(m_pDocument);
-    m_pDocument->SetRoot(m_nodeParser.GetRootNode());
-  }
-  return nRetStatus;
-}
-int32_t CXFA_DocumentParser::ParseXMLData(const CFX_WideString& wsXML,
-                                          IFDE_XMLNode*& pXMLNode,
-                                          IFX_Pause* pPause) {
-  CloseParser();
-  int32_t nRetStatus = m_nodeParser.ParseXMLData(wsXML, pXMLNode, NULL);
-  if (nRetStatus == XFA_PARSESTATUS_Done && pXMLNode) {
-    m_pDocument = new CXFA_Document(this);
-    m_nodeParser.SetFactory(m_pDocument);
-  }
-  return nRetStatus;
-}
-void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode,
-                                           IFDE_XMLNode* pXMLNode) {
-  if (!pXFANode || !pXMLNode) {
-    return;
-  }
-  m_nodeParser.ConstructXFANode(pXFANode, pXMLNode);
-  CXFA_Node* pRootNode = m_nodeParser.GetRootNode();
-  if (m_pDocument && pRootNode) {
-    m_pDocument->SetRoot(pRootNode);
-  }
-}
-void CXFA_DocumentParser::CloseParser() {
-  if (m_pDocument) {
-    delete m_pDocument;
-    m_pDocument = NULL;
-  }
-  m_nodeParser.CloseParser();
-}
-CXFA_XMLParser::CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream)
-    : m_nElementStart(0),
-      m_dwCheckStatus(0),
-      m_dwCurrentCheckStatus(0),
-      m_pRoot(pRoot),
-      m_pStream(pStream),
-      m_pParser(nullptr),
-      m_pParent(pRoot),
-      m_pChild(nullptr),
-      m_NodeStack(16),
-      m_dwStatus(FDE_XMLSYNTAXSTATUS_None) {
-  ASSERT(m_pParent && m_pStream);
-  m_NodeStack.Push(m_pParent);
-  m_pParser = IFDE_XMLSyntaxParser::Create();
-  m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024);
-}
-CXFA_XMLParser::~CXFA_XMLParser() {
-  if (m_pParser) {
-    m_pParser->Release();
-  }
-  m_NodeStack.RemoveAll();
-  m_ws1.Empty();
-  m_ws2.Empty();
-}
-int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
-  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) {
-    return -1;
-  }
-  if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
-    return 100;
-  }
-  int32_t iCount = 0;
-  while (TRUE) {
-    m_dwStatus = m_pParser->DoSyntaxParse();
-    switch (m_dwStatus) {
-      case FDE_XMLSYNTAXSTATUS_InstructionOpen:
-        break;
-      case FDE_XMLSYNTAXSTATUS_InstructionClose:
-        if (m_pChild) {
-          if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
-            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-            break;
-          }
-        }
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementOpen:
-        if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) {
-          m_nElementStart = m_pParser->GetCurrentPos() - 1;
-        }
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementBreak:
-        break;
-      case FDE_XMLSYNTAXSTATUS_ElementClose:
-        if (m_pChild->GetType() != FDE_XMLNODE_Element) {
-          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_pParser->GetTagName(m_ws1);
-        ((IFDE_XMLElement*)m_pChild)->GetTagName(m_ws2);
-        if (m_ws1.GetLength() > 0 && !m_ws1.Equal(m_ws2)) {
-          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        }
-        m_NodeStack.Pop();
-        if (m_NodeStack.GetSize() < 1) {
-          m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-          break;
-        } else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) {
-          m_nSize[m_dwCurrentCheckStatus - 1] =
-              m_pParser->GetCurrentBinaryPos() -
-              m_nStart[m_dwCurrentCheckStatus - 1];
-          m_dwCurrentCheckStatus = 0;
-        }
-
-        m_pParent = (IFDE_XMLNode*)*m_NodeStack.GetTopElement();
-        m_pChild = m_pParent;
-        iCount++;
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetName:
-        m_pParser->GetTargetName(m_ws1);
-        if (m_ws1 == FX_WSTRC(L"originalXFAVersion") ||
-            m_ws1 == FX_WSTRC(L"acrobat")) {
-          m_pChild = IFDE_XMLInstruction::Create(m_ws1);
-          m_pParent->InsertChildNode(m_pChild);
-        } else {
-          m_pChild = NULL;
-        }
-        m_ws1.Empty();
-        break;
-      case FDE_XMLSYNTAXSTATUS_TagName:
-        m_pParser->GetTagName(m_ws1);
-        m_pChild = IFDE_XMLElement::Create(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_NodeStack.Push(m_pChild);
-        m_pParent = m_pChild;
-
-        if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) {
-          CFX_WideString wsTag;
-          ((IFDE_XMLElement*)m_pChild)->GetLocalTagName(wsTag);
-          if (wsTag == FX_WSTRC(L"template")) {
-            m_dwCheckStatus |= 0x01;
-            m_dwCurrentCheckStatus = 0x01;
-            m_nStart[0] = m_pParser->GetCurrentBinaryPos() -
-                          (m_pParser->GetCurrentPos() - m_nElementStart);
-          } else if (wsTag == FX_WSTRC(L"datasets")) {
-            m_dwCheckStatus |= 0x02;
-            m_dwCurrentCheckStatus = 0x02;
-            m_nStart[1] = m_pParser->GetCurrentBinaryPos() -
-                          (m_pParser->GetCurrentPos() - m_nElementStart);
-          }
-        }
-        break;
-      case FDE_XMLSYNTAXSTATUS_AttriName:
-        m_pParser->GetAttributeName(m_ws1);
-        break;
-      case FDE_XMLSYNTAXSTATUS_AttriValue:
-        if (m_pChild) {
-          m_pParser->GetAttributeName(m_ws2);
-          if (m_pChild->GetType() == FDE_XMLNODE_Element) {
-            ((IFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2);
-          }
-        }
-        m_ws1.Empty();
-        break;
-      case FDE_XMLSYNTAXSTATUS_Text:
-        m_pParser->GetTextData(m_ws1);
-        m_pChild = IFDE_XMLText::Create(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_CData:
-        m_pParser->GetTextData(m_ws1);
-        m_pChild = IFDE_XMLCharData::Create(m_ws1);
-        m_pParent->InsertChildNode(m_pChild);
-        m_pChild = m_pParent;
-        break;
-      case FDE_XMLSYNTAXSTATUS_TargetData:
-        if (m_pChild) {
-          if (m_pChild->GetType() != FDE_XMLNODE_Instruction) {
-            m_dwStatus = FDE_XMLSYNTAXSTATUS_Error;
-            break;
-          }
-          if (!m_ws1.IsEmpty()) {
-            ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
-          }
-          m_pParser->GetTargetData(m_ws1);
-          ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1);
-        }
-        m_ws1.Empty();
-        break;
-      default:
-        break;
-    }
-    if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error ||
-        m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
-      break;
-    }
-    if (pPause && iCount > 500 && pPause->NeedToPauseNow()) {
-      break;
-    }
-  }
-  return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1)
-             ? -1
-             : m_pParser->GetStatus();
-}
diff --git a/xfa/src/fxfa/parser/xfa_parser_imp.h b/xfa/src/fxfa/parser/xfa_parser_imp.h
deleted file mode 100644
index f288bc0..0000000
--- a/xfa/src/fxfa/parser/xfa_parser_imp.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_PARSER_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_PARSER_IMP_H_
-
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-
-class CXFA_XMLParser;
-
-class CXFA_SimpleParser : public IXFA_Parser {
- public:
-  CXFA_SimpleParser(IXFA_ObjFactory* pFactory, FX_BOOL bDocumentParser = FALSE);
-  ~CXFA_SimpleParser();
-  virtual void Release() { delete this; }
-
-  virtual int32_t StartParse(IFX_FileRead* pStream,
-                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP);
-  virtual int32_t DoParse(IFX_Pause* pPause = NULL);
-  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
-                               IFDE_XMLNode*& pXMLNode,
-                               IFX_Pause* pPause = NULL);
-  virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode);
-  virtual IXFA_ObjFactory* GetFactory() const { return m_pFactory; }
-  virtual CXFA_Node* GetRootNode() const { return m_pRootNode; }
-  virtual IFDE_XMLDoc* GetXMLDoc() const { return m_pXMLDoc; }
-  virtual void CloseParser();
-
- protected:
-  CXFA_Node* ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode,
-                              XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_XDP(IFDE_XMLNode* pXMLDocumentNode,
-                                  XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_Config(IFDE_XMLNode* pXMLDocumentNode,
-                                     XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_TemplateForm(IFDE_XMLNode* pXMLDocumentNode,
-                                           XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_Data(IFDE_XMLNode* pXMLDocumentNode,
-                                   XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_LocaleConnectionSourceSet(
-      IFDE_XMLNode* pXMLDocumentNode,
-      XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_Xdc(IFDE_XMLNode* pXMLDocumentNode,
-                                  XFA_XDPPACKET ePacketID);
-  CXFA_Node* ParseAsXDPPacket_User(IFDE_XMLNode* pXMLDocumentNode,
-                                   XFA_XDPPACKET ePacketID);
-  CXFA_Node* NormalLoader(CXFA_Node* pXFANode,
-                          IFDE_XMLNode* pXMLDoc,
-                          XFA_XDPPACKET ePacketID,
-                          FX_BOOL bUseAttribute = TRUE);
-  CXFA_Node* DataLoader(CXFA_Node* pXFANode,
-                        IFDE_XMLNode* pXMLDoc,
-                        FX_BOOL bDoTransform);
-  CXFA_Node* UserPacketLoader(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLDoc);
-  void ParseContentNode(CXFA_Node* pXFANode,
-                        IFDE_XMLNode* pXMLNode,
-                        XFA_XDPPACKET ePacketID);
-  void ParseDataValue(CXFA_Node* pXFANode,
-                      IFDE_XMLNode* pXMLNode,
-                      XFA_XDPPACKET ePacketID);
-  void ParseDataGroup(CXFA_Node* pXFANode,
-                      IFDE_XMLNode* pXMLNode,
-                      XFA_XDPPACKET ePacketID);
-  void ParseInstruction(CXFA_Node* pXFANode,
-                        IFDE_XMLInstruction* pXMLInstruction,
-                        XFA_XDPPACKET ePacketID);
-  void SetFactory(IXFA_ObjFactory* pFactory);
-
-  CXFA_XMLParser* m_pXMLParser;
-  IFDE_XMLDoc* m_pXMLDoc;
-  IFX_Stream* m_pStream;
-  IFX_FileRead* m_pFileRead;
-  IXFA_ObjFactory* m_pFactory;
-  CXFA_Node* m_pRootNode;
-  XFA_XDPPACKET m_ePacketID;
-  FX_BOOL m_bDocumentParser;
-  friend class CXFA_DocumentParser;
-};
-
-class CXFA_DocumentParser : public IXFA_DocParser {
- public:
-  CXFA_DocumentParser(IXFA_Notify* pNotify);
-  ~CXFA_DocumentParser();
-  virtual void Release() { delete this; }
-  virtual int32_t StartParse(IFX_FileRead* pStream,
-                             XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP);
-  virtual int32_t DoParse(IFX_Pause* pPause = NULL);
-  virtual int32_t ParseXMLData(const CFX_WideString& wsXML,
-                               IFDE_XMLNode*& pXMLNode,
-                               IFX_Pause* pPause = NULL);
-  virtual void ConstructXFANode(CXFA_Node* pXFANode, IFDE_XMLNode* pXMLNode);
-  virtual IXFA_ObjFactory* GetFactory() const {
-    return m_nodeParser.GetFactory();
-  }
-  virtual CXFA_Node* GetRootNode() const { return m_nodeParser.GetRootNode(); }
-  virtual IFDE_XMLDoc* GetXMLDoc() const { return m_nodeParser.GetXMLDoc(); }
-  virtual IXFA_Notify* GetNotify() const { return m_pNotify; }
-  virtual CXFA_Document* GetDocument() const { return m_pDocument; }
-  virtual void CloseParser();
-
- protected:
-  CXFA_SimpleParser m_nodeParser;
-  IXFA_Notify* m_pNotify;
-  CXFA_Document* m_pDocument;
-};
-typedef CFX_StackTemplate<IFDE_XMLNode*> CXFA_XMLNodeStack;
-
-class CXFA_XMLParser : public IFDE_XMLParser {
- public:
-  CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream);
-  ~CXFA_XMLParser();
-
-  virtual void Release() { delete this; }
-  virtual int32_t DoParser(IFX_Pause* pPause);
-
-  FX_FILESIZE m_nStart[2];
-  size_t m_nSize[2];
-  FX_FILESIZE m_nElementStart;
-  FX_WORD m_dwCheckStatus;
-  FX_WORD m_dwCurrentCheckStatus;
-
- protected:
-  IFDE_XMLNode* m_pRoot;
-  IFX_Stream* m_pStream;
-  IFDE_XMLSyntaxParser* m_pParser;
-
-  IFDE_XMLNode* m_pParent;
-  IFDE_XMLNode* m_pChild;
-  CXFA_XMLNodeStack m_NodeStack;
-  CFX_WideString m_ws1;
-  CFX_WideString m_ws2;
-  FX_DWORD m_dwStatus;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_PARSER_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_script.h b/xfa/src/fxfa/parser/xfa_script.h
deleted file mode 100644
index 286e8f7..0000000
--- a/xfa/src/fxfa/parser/xfa_script.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_H_
-
-#include "xfa/include/fxfa/fxfa.h"
-#include "xfa/include/fxfa/fxfa_objectacc.h"
-
-#define XFA_RESOLVENODE_Children 0x0001
-#define XFA_RESOLVENODE_Attributes 0x0004
-#define XFA_RESOLVENODE_Properties 0x0008
-#define XFA_RESOLVENODE_Siblings 0x0020
-#define XFA_RESOLVENODE_Parent 0x0040
-#define XFA_RESOLVENODE_AnyChild 0x0080
-#define XFA_RESOLVENODE_ALL 0x0100
-#define XFA_RESOLVENODE_CreateNode 0x0400
-#define XFA_RESOLVENODE_Bind 0x0800
-#define XFA_RESOLVENODE_BindNew 0x1000
-
-enum XFA_SCRIPTLANGTYPE {
-  XFA_SCRIPTLANGTYPE_Formcalc = XFA_SCRIPTTYPE_Formcalc,
-  XFA_SCRIPTLANGTYPE_Javascript = XFA_SCRIPTTYPE_Javascript,
-  XFA_SCRIPTLANGTYPE_Unkown = XFA_SCRIPTTYPE_Unkown,
-};
-
-enum XFA_RESOVENODE_RSTYPE {
-  XFA_RESOVENODE_RSTYPE_Nodes,
-  XFA_RESOVENODE_RSTYPE_Attribute,
-  XFA_RESOLVENODE_RSTYPE_CreateNodeOne,
-  XFA_RESOLVENODE_RSTYPE_CreateNodeAll,
-  XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll,
-  XFA_RESOVENODE_RSTYPE_ExistNodes,
-};
-
-class CXFA_HVALUEArray : public CFX_ArrayTemplate<FXJSE_HVALUE> {
- public:
-  CXFA_HVALUEArray(FXJSE_HRUNTIME hRunTime) : m_hRunTime(hRunTime) {}
-  ~CXFA_HVALUEArray() {
-    for (int32_t i = 0; i < GetSize(); i++) {
-      FXJSE_Value_Release(GetAt(i));
-    }
-  }
-  void GetAttributeObject(CXFA_ObjArray& objArray) {
-    for (int32_t i = 0; i < GetSize(); i++) {
-      CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(GetAt(i), NULL);
-      objArray.Add(pObject);
-    }
-  }
-  FXJSE_HRUNTIME m_hRunTime;
-};
-
-struct XFA_RESOLVENODE_RS {
-  XFA_RESOLVENODE_RS()
-      : dwFlags(XFA_RESOVENODE_RSTYPE_Nodes), pScriptAttribute(NULL) {}
-  ~XFA_RESOLVENODE_RS() { nodes.RemoveAll(); }
-  int32_t GetAttributeResult(CXFA_HVALUEArray& hValueArray) const {
-    if (pScriptAttribute && pScriptAttribute->eValueType == XFA_SCRIPT_Object) {
-      FXJSE_HRUNTIME hRunTime = hValueArray.m_hRunTime;
-      for (int32_t i = 0; i < nodes.GetSize(); i++) {
-        FXJSE_HVALUE hValue = FXJSE_Value_Create(hRunTime);
-        (nodes[i]->*(pScriptAttribute->lpfnCallback))(
-            hValue, FALSE, (XFA_ATTRIBUTE)pScriptAttribute->eAttribute);
-        hValueArray.Add(hValue);
-      }
-    }
-    return hValueArray.GetSize();
-  }
-
-  CXFA_ObjArray nodes;
-  XFA_RESOVENODE_RSTYPE dwFlags;
-  const XFA_SCRIPTATTRIBUTEINFO* pScriptAttribute;
-};
-
-struct XFA_JSBUILTININFO {
-  uint32_t uUnicodeHash;
-  const FX_CHAR* pName;
-};
-
-const XFA_JSBUILTININFO* XFA_GetJSBuiltinByHash(uint32_t uHashCode);
-
-class IXFA_ScriptContext {
- public:
-  virtual ~IXFA_ScriptContext() {}
-  virtual void Release() = 0;
-  virtual void Initialize(FXJSE_HRUNTIME hRuntime) = 0;
-
-  virtual void SetEventParam(CXFA_EventParam param) = 0;
-  virtual CXFA_EventParam* GetEventParam() = 0;
-  virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType,
-                            const CFX_WideStringC& wsScript,
-                            FXJSE_HVALUE hRetValue,
-                            CXFA_Object* pThisObject = NULL) = 0;
-  virtual int32_t ResolveObjects(CXFA_Object* refNode,
-                                 const CFX_WideStringC& wsExpression,
-                                 XFA_RESOLVENODE_RS& resolveNodeRS,
-                                 FX_DWORD dwStyles = XFA_RESOLVENODE_Children,
-                                 CXFA_Node* bindNode = NULL) = 0;
-  virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject) = 0;
-  virtual void CacheList(CXFA_NodeList* pList) = 0;
-  virtual CXFA_Object* GetThisObject() const = 0;
-  virtual FXJSE_HRUNTIME GetRuntime() const = 0;
-  virtual int32_t GetIndexByName(CXFA_Node* refNode) = 0;
-  virtual int32_t GetIndexByClassName(CXFA_Node* refNode) = 0;
-  virtual void GetSomExpression(CXFA_Node* refNode,
-                                CFX_WideString& wsExpression) = 0;
-
-  virtual void SetNodesOfRunScript(CXFA_NodeArray* pArray) = 0;
-  virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes) = 0;
-  virtual void AddNodesOfRunScript(CXFA_Node* pNode) = 0;
-  virtual FXJSE_HCLASS GetJseNormalClass() = 0;
-  virtual XFA_SCRIPTLANGTYPE GetType() = 0;
-  virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) = 0;
-  virtual FX_BOOL IsRunAtClient() = 0;
-};
-IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_datawindow.cpp b/xfa/src/fxfa/parser/xfa_script_datawindow.cpp
deleted file mode 100644
index 33146ad..0000000
--- a/xfa/src/fxfa/parser/xfa_script_datawindow.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_datawindow.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_DataWindow::CScript_DataWindow(CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_DataWindow) {
-  m_uScriptHash = XFA_HASHCODE_DataWindow;
-}
-CScript_DataWindow::~CScript_DataWindow() {}
-void CScript_DataWindow::Script_DataWindow_MoveCurrentRecord(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_DataWindow::Script_DataWindow_Record(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_DataWindow::Script_DataWindow_GotoRecord(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_DataWindow::Script_DataWindow_IsRecordGroup(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_DataWindow::Script_DataWindow_RecordsBefore(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {}
-void CScript_DataWindow::Script_DataWindow_CurrentRecordNumber(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {}
-void CScript_DataWindow::Script_DataWindow_RecordsAfter(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {}
-void CScript_DataWindow::Script_DataWindow_IsDefined(FXJSE_HVALUE hValue,
-                                                     FX_BOOL bSetting,
-                                                     XFA_ATTRIBUTE eAttribute) {
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_datawindow.h b/xfa/src/fxfa/parser/xfa_script_datawindow.h
deleted file mode 100644
index 2639d3c..0000000
--- a/xfa/src/fxfa/parser/xfa_script_datawindow.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CScript_DataWindow : public CXFA_OrdinaryObject {
- public:
-  CScript_DataWindow(CXFA_Document* pDocument);
-  virtual ~CScript_DataWindow();
-  void Script_DataWindow_MoveCurrentRecord(CFXJSE_Arguments* pArguments);
-  void Script_DataWindow_Record(CFXJSE_Arguments* pArguments);
-  void Script_DataWindow_GotoRecord(CFXJSE_Arguments* pArguments);
-  void Script_DataWindow_IsRecordGroup(CFXJSE_Arguments* pArguments);
-  void Script_DataWindow_RecordsBefore(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_DataWindow_CurrentRecordNumber(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute);
-  void Script_DataWindow_RecordsAfter(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_DataWindow_IsDefined(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_DATAWINDOW_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.cpp b/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.cpp
deleted file mode 100644
index 8c8cd52..0000000
--- a/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_EventPseudoModel::CScript_EventPseudoModel(CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_EventPseudoModel) {
-  m_uScriptHash = XFA_HASHCODE_Event;
-}
-CScript_EventPseudoModel::~CScript_EventPseudoModel() {}
-void Script_EventPseudoModel_StringProperty(FXJSE_HVALUE hValue,
-                                            CFX_WideString& wsValue,
-                                            FX_BOOL bSetting) {
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
-  } else {
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-  }
-}
-void Script_EventPseudoModel_InterProperty(FXJSE_HVALUE hValue,
-                                           int32_t& iValue,
-                                           FX_BOOL bSetting) {
-  if (bSetting) {
-    iValue = FXJSE_Value_ToInteger(hValue);
-  } else {
-    FXJSE_Value_SetInteger(hValue, iValue);
-  }
-}
-void Script_EventPseudoModel_BooleanProperty(FXJSE_HVALUE hValue,
-                                             FX_BOOL& bValue,
-                                             FX_BOOL bSetting) {
-  if (bSetting) {
-    bValue = FXJSE_Value_ToBoolean(hValue);
-  } else {
-    FXJSE_Value_SetBoolean(hValue, bValue);
-  }
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Property(
-    FXJSE_HVALUE hValue,
-    FX_DWORD dwFlag,
-    FX_BOOL bSetting) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
-  if (!pEventParam) {
-    return;
-  }
-  switch (dwFlag) {
-    case XFA_EVENT_CANCELACTION:
-      Script_EventPseudoModel_BooleanProperty(
-          hValue, pEventParam->m_bCancelAction, bSetting);
-      break;
-    case XFA_EVENT_CHANGE:
-      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsChange,
-                                             bSetting);
-      break;
-    case XFA_EVENT_COMMITKEY:
-      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iCommitKey,
-                                            bSetting);
-      break;
-    case XFA_EVENT_FULLTEXT:
-      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsFullText,
-                                             bSetting);
-      break;
-    case XFA_EVENT_KEYDOWN:
-      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bKeyDown,
-                                              bSetting);
-      break;
-    case XFA_EVENT_MODIFIER:
-      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bModifier,
-                                              bSetting);
-      break;
-    case XFA_EVENT_NEWCONTENTTYPE:
-      Script_EventPseudoModel_StringProperty(
-          hValue, pEventParam->m_wsNewContentType, bSetting);
-      break;
-    case XFA_EVENT_NEWTEXT:
-      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsNewText,
-                                             bSetting);
-      break;
-    case XFA_EVENT_PREVCONTENTTYPE:
-      Script_EventPseudoModel_StringProperty(
-          hValue, pEventParam->m_wsPrevContentType, bSetting);
-      break;
-    case XFA_EVENT_PREVTEXT:
-      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsPrevText,
-                                             bSetting);
-      break;
-    case XFA_EVENT_REENTER:
-      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bReenter,
-                                              bSetting);
-      break;
-    case XFA_EVENT_SELEND:
-      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelEnd,
-                                            bSetting);
-      break;
-    case XFA_EVENT_SELSTART:
-      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelStart,
-                                            bSetting);
-      break;
-    case XFA_EVENT_SHIFT:
-      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bShift,
-                                              bSetting);
-      break;
-    case XFA_EVENT_SOAPFAULTCODE:
-      Script_EventPseudoModel_StringProperty(
-          hValue, pEventParam->m_wsSoapFaultCode, bSetting);
-      break;
-    case XFA_EVENT_SOAPFAULTSTRING:
-      Script_EventPseudoModel_StringProperty(
-          hValue, pEventParam->m_wsSoapFaultString, bSetting);
-      break;
-    case XFA_EVENT_TARGET:
-      break;
-    default:
-      break;
-  }
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_CancelAction(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_CANCELACTION, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Change(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_CHANGE, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_CommitKey(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_COMMITKEY, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_FullText(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_FULLTEXT, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_KeyDown(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_KEYDOWN, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Modifier(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_MODIFIER, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_NewContentType(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWCONTENTTYPE, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_NewText(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWTEXT, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_PrevContentType(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVCONTENTTYPE, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_PrevText(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVTEXT, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Reenter(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_REENTER, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_SelEnd(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELEND, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_SelStart(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELSTART, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Shift(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SHIFT, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultCode(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTCODE, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultString(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTSTRING, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Target(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  Script_EventPseudoModel_Property(hValue, XFA_EVENT_TARGET, bSetting);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Emit(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
-  if (!pEventParam) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_WidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler();
-  if (!pWidgetHandler) {
-    return;
-  }
-  pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam);
-}
-void CScript_EventPseudoModel::Script_EventPseudoModel_Reset(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
-    return;
-  }
-  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
-  if (!pEventParam) {
-    return;
-  }
-  pEventParam->Reset();
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h b/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h
deleted file mode 100644
index 770ec2e..0000000
--- a/xfa/src/fxfa/parser/xfa_script_eventpseudomodel.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-#define XFA_EVENT_CHANGE 0
-#define XFA_EVENT_COMMITKEY 1
-#define XFA_EVENT_FULLTEXT 2
-#define XFA_EVENT_KEYDOWN 3
-#define XFA_EVENT_MODIFIER 4
-#define XFA_EVENT_NEWCONTENTTYPE 5
-#define XFA_EVENT_NEWTEXT 6
-#define XFA_EVENT_PREVCONTENTTYPE 7
-#define XFA_EVENT_PREVTEXT 8
-#define XFA_EVENT_REENTER 9
-#define XFA_EVENT_SELEND 10
-#define XFA_EVENT_SELSTART 11
-#define XFA_EVENT_SHIFT 12
-#define XFA_EVENT_SOAPFAULTCODE 13
-#define XFA_EVENT_SOAPFAULTSTRING 14
-#define XFA_EVENT_TARGET 15
-#define XFA_EVENT_CANCELACTION 16
-
-class CScript_EventPseudoModel : public CXFA_OrdinaryObject {
- public:
-  explicit CScript_EventPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_EventPseudoModel();
-
-  void Script_EventPseudoModel_CancelAction(FXJSE_HVALUE hValue,
-                                            FX_BOOL bSetting,
-                                            XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_Change(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_CommitKey(FXJSE_HVALUE hValue,
-                                         FX_BOOL bSetting,
-                                         XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_FullText(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_KeyDown(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_Modifier(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_NewContentType(FXJSE_HVALUE hValue,
-                                              FX_BOOL bSetting,
-                                              XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_NewText(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_PrevContentType(FXJSE_HVALUE hValue,
-                                               FX_BOOL bSetting,
-                                               XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_PrevText(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_Reenter(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_SelEnd(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_SelStart(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_Shift(FXJSE_HVALUE hValue,
-                                     FX_BOOL bSetting,
-                                     XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_SoapFaultCode(FXJSE_HVALUE hValue,
-                                             FX_BOOL bSetting,
-                                             XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_SoapFaultString(FXJSE_HVALUE hValue,
-                                               FX_BOOL bSetting,
-                                               XFA_ATTRIBUTE eAttribute);
-  void Script_EventPseudoModel_Target(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-
-  void Script_EventPseudoModel_Emit(CFXJSE_Arguments* pArguments);
-  void Script_EventPseudoModel_Reset(CFXJSE_Arguments* pArguments);
-
- protected:
-  void Script_EventPseudoModel_Property(FXJSE_HVALUE hValue,
-                                        FX_DWORD dwFlag,
-                                        FX_BOOL bSetting);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_EVENTPSEUDOMODEL_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.cpp b/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.cpp
deleted file mode 100644
index 4e5be8f..0000000
--- a/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.cpp
+++ /dev/null
@@ -1,800 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_HostPseudoModel) {
-  m_uScriptHash = XFA_HASHCODE_Host;
-}
-CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
-void CScript_HostPseudoModel::Script_HostPseudoModel_LoadString(
-    FXJSE_HVALUE hValue,
-    IXFA_Notify* pNotify,
-    FX_DWORD dwFlag) {
-  CFX_WideString wsValue;
-  pNotify->GetAppProvider()->LoadString(dwFlag, wsValue);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_AppType(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CFX_WideString wsAppType;
-  pNotify->GetAppProvider()->GetAppType(wsAppType);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitAppType(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CFX_WideString wsAppType;
-  pNotify->GetAppProvider()->GetFoxitAppType(wsAppType);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_CalculationsEnabled(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  if (bSetting) {
-    pNotify->GetDocProvider()->SetCalculationsEnabled(
-        hDoc, FXJSE_Value_ToBoolean(hValue));
-    return;
-  }
-  FX_BOOL bEnabled = pNotify->GetDocProvider()->IsCalculationsEnabled(hDoc);
-  FXJSE_Value_SetBoolean(hValue, bEnabled);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentPage(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  if (bSetting) {
-    pNotify->GetDocProvider()->SetCurrentPage(hDoc,
-                                              FXJSE_Value_ToInteger(hValue));
-    return;
-  }
-  int32_t iCurrentPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
-  FXJSE_Value_SetInteger(hValue, iCurrentPage);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Language(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_LANGUAGE);
-    return;
-  }
-  CFX_WideString wsLanguage;
-  pNotify->GetAppProvider()->GetLanguage(wsLanguage);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsLanguage));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_NumPages(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_NUMPAGES);
-    return;
-  }
-  int32_t iNumPages = pNotify->GetDocProvider()->CountPages(hDoc);
-  FXJSE_Value_SetInteger(hValue, iNumPages);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Platform(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_PLATFORM);
-    return;
-  }
-  CFX_WideString wsPlatform;
-  pNotify->GetAppProvider()->GetPlatform(wsPlatform);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsPlatform));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Title(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  if (bSetting) {
-    CFX_ByteString bsValue;
-    FXJSE_Value_ToUTF8String(hValue, bsValue);
-    pNotify->GetDocProvider()->SetTitle(
-        hDoc, CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
-    return;
-  }
-  CFX_WideString wsTitle;
-  pNotify->GetDocProvider()->GetTitle(hDoc, wsTitle);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsTitle));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_ValidationsEnabled(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  if (bSetting) {
-    pNotify->GetDocProvider()->SetValidationsEnabled(
-        hDoc, FXJSE_Value_ToBoolean(hValue));
-    return;
-  }
-  FX_BOOL bEnabled = pNotify->GetDocProvider()->IsValidationsEnabled(hDoc);
-  FXJSE_Value_SetBoolean(hValue, bEnabled);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Variation(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VARIATION);
-    return;
-  }
-  CFX_WideString wsVariation;
-  pNotify->GetAppProvider()->GetVariation(wsVariation);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVariation));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Version(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
-    return;
-  }
-  CFX_WideString wsVersion;
-  pNotify->GetAppProvider()->GetVersion(wsVersion);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitVersion(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
-    return;
-  }
-  CFX_WideString wsVersion;
-  pNotify->GetAppProvider()->GetFoxitVersion(wsVersion);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Name(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CFX_WideString wsAppName;
-  pNotify->GetAppProvider()->GetAppName(wsAppName);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppName));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitName(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-    return;
-  }
-  CFX_WideString wsFoxitAppName;
-  pNotify->GetAppProvider()->GetFoxitAppName(wsFoxitAppName);
-  FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsFoxitAppName));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_GotoURL(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"gotoURL");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CFX_WideString wsURL;
-  if (iLength >= 1) {
-    CFX_ByteString bsURL = pArguments->GetUTF8String(0);
-    wsURL = CFX_WideString::FromUTF8(bsURL, bsURL.GetLength());
-  }
-  pNotify->GetDocProvider()->GotoURL(hDoc, wsURL);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_OpenList(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"openList");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    FXJSE_HVALUE hValue = pArguments->GetValue(0);
-    if (FXJSE_Value_IsObject(hValue)) {
-      pNode = static_cast<CXFA_Node*>(FXJSE_Value_ToObject(hValue, nullptr));
-    } else if (FXJSE_Value_IsUTF8String(hValue)) {
-      CFX_ByteString bsString;
-      FXJSE_Value_ToUTF8String(hValue, bsString);
-      CFX_WideString wsExpression =
-          CFX_WideString::FromUTF8(bsString, bsString.GetLength());
-      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-      if (!pScriptContext) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      CXFA_Object* pObject = pScriptContext->GetThisObject();
-      if (!pObject) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
-                        XFA_RESOLVENODE_Siblings;
-      XFA_RESOLVENODE_RS resoveNodeRS;
-      int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
-                                                    resoveNodeRS, dwFlag);
-      if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      pNode = resoveNodeRS.nodes[0]->AsNode();
-    }
-    FXJSE_Value_Release(hValue);
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
-  if (!hWidget) {
-    return;
-  }
-  pNotify->GetDocProvider()->SetFocusWidget(pNotify->GetHDOC(), hWidget);
-  pNotify->OpenDropDownList(hWidget);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Response(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 4) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"response");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CFX_WideString wsQuestion;
-  CFX_WideString wsTitle;
-  CFX_WideString wsDefaultAnswer;
-  FX_BOOL bMark = FALSE;
-  if (iLength >= 1) {
-    CFX_ByteString bsQuestion = pArguments->GetUTF8String(0);
-    wsQuestion = CFX_WideString::FromUTF8(bsQuestion, bsQuestion.GetLength());
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsTitle = pArguments->GetUTF8String(1);
-    wsTitle = CFX_WideString::FromUTF8(bsTitle, bsTitle.GetLength());
-  }
-  if (iLength >= 3) {
-    CFX_ByteString bsDefaultAnswer = pArguments->GetUTF8String(2);
-    wsDefaultAnswer =
-        CFX_WideString::FromUTF8(bsDefaultAnswer, bsDefaultAnswer.GetLength());
-  }
-  if (iLength >= 4) {
-    bMark = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
-  }
-  CFX_WideString wsAnswer;
-  pNotify->GetAppProvider()->Response(wsAnswer, wsQuestion, wsTitle,
-                                      wsDefaultAnswer, bMark);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAnswer));
-  }
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentInBatch(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  int32_t iCur = pNotify->GetAppProvider()->GetCurDocumentInBatch();
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iCur);
-  }
-}
-static int32_t XFA_FilterName(const CFX_WideStringC& wsExpression,
-                              int32_t nStart,
-                              CFX_WideString& wsFilter) {
-  FXSYS_assert(nStart > -1);
-  int32_t iLength = wsExpression.GetLength();
-  if (nStart >= iLength) {
-    return iLength;
-  }
-  FX_WCHAR* pBuf = wsFilter.GetBuffer(iLength - nStart);
-  int32_t nCount = 0;
-  const FX_WCHAR* pSrc = wsExpression.GetPtr();
-  FX_WCHAR wCur;
-  while (nStart < iLength) {
-    wCur = pSrc[nStart++];
-    if (wCur == ',') {
-      break;
-    }
-    pBuf[nCount++] = wCur;
-  }
-  wsFilter.ReleaseBuffer(nCount);
-  wsFilter.TrimLeft();
-  wsFilter.TrimRight();
-  return nStart;
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_ResetData(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 0 || iLength > 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resetData");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CFX_WideString wsExpression;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  }
-  if (wsExpression.IsEmpty()) {
-    pNotify->ResetData();
-    return;
-  }
-  int32_t iStart = 0;
-  CFX_WideString wsName;
-  CXFA_Node* pNode = NULL;
-  int32_t iExpLength = wsExpression.GetLength();
-  while (iStart < iExpLength) {
-    iStart = XFA_FilterName(wsExpression, iStart, wsName);
-    IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-    if (!pScriptContext) {
-      return;
-    }
-    CXFA_Object* pObject = pScriptContext->GetThisObject();
-    if (!pObject) {
-      return;
-    }
-    FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
-                      XFA_RESOLVENODE_Siblings;
-    XFA_RESOLVENODE_RS resoveNodeRS;
-    int32_t iRet =
-        pScriptContext->ResolveObjects(pObject, wsName, resoveNodeRS, dwFlag);
-    if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
-      continue;
-    }
-    pNode = resoveNodeRS.nodes[0]->AsNode();
-    pNotify->ResetData(pNode->GetWidgetData());
-  }
-  if (!pNode) {
-    pNotify->ResetData();
-  }
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Beep(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 0 || iLength > 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"beep");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  FX_DWORD dwType = 4;
-  if (iLength >= 1) {
-    dwType = pArguments->GetInt32(0);
-  }
-  pNotify->GetAppProvider()->Beep(dwType);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_SetFocus(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setFocus");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    FXJSE_HVALUE hValue = pArguments->GetValue(0);
-    if (FXJSE_Value_IsObject(hValue)) {
-      pNode = static_cast<CXFA_Node*>(FXJSE_Value_ToObject(hValue, NULL));
-    } else if (FXJSE_Value_IsUTF8String(hValue)) {
-      CFX_ByteString bsString;
-      FXJSE_Value_ToUTF8String(hValue, bsString);
-      CFX_WideString wsExpression =
-          CFX_WideString::FromUTF8(bsString, bsString.GetLength());
-      IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-      if (!pScriptContext) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      CXFA_Object* pObject = pScriptContext->GetThisObject();
-      if (!pObject) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
-                        XFA_RESOLVENODE_Siblings;
-      XFA_RESOLVENODE_RS resoveNodeRS;
-      int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
-                                                    resoveNodeRS, dwFlag);
-      if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
-        FXJSE_Value_Release(hValue);
-        return;
-      }
-      pNode = resoveNodeRS.nodes[0]->AsNode();
-    }
-    FXJSE_Value_Release(hValue);
-  }
-  pNotify->SetFocusWidgetNode(pNode);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_GetFocus(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CXFA_Node* pNode = pNotify->GetFocusWidgetNode();
-  if (!pNode) {
-    return;
-  }
-  FXJSE_Value_Set(pArguments->GetReturnValue(),
-                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_MessageBox(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 4) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"messageBox");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CFX_WideString wsMessage;
-  CFX_WideString bsTitle;
-  FX_DWORD dwMessageType = XFA_MBICON_Error;
-  FX_DWORD dwButtonType = XFA_MB_OK;
-  if (iLength >= 1) {
-    if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 0, wsMessage)) {
-      return;
-    }
-  }
-  if (iLength >= 2) {
-    if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 1, bsTitle)) {
-      return;
-    }
-  }
-  if (iLength >= 3) {
-    dwMessageType = pArguments->GetInt32(2);
-    if (dwMessageType > XFA_MBICON_Status) {
-      dwMessageType = XFA_MBICON_Error;
-    }
-  }
-  if (iLength >= 4) {
-    dwButtonType = pArguments->GetInt32(3);
-    if (dwButtonType > XFA_MB_YesNoCancel) {
-      dwButtonType = XFA_MB_OK;
-    }
-  }
-  int32_t iValue = pNotify->GetAppProvider()->MsgBox(
-      wsMessage, bsTitle, dwMessageType, dwButtonType);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iValue);
-  }
-}
-FX_BOOL CScript_HostPseudoModel::Script_HostPseudoModel_ValidateArgsForMsg(
-    CFXJSE_Arguments* pArguments,
-    int32_t iArgIndex,
-    CFX_WideString& wsValue) {
-  if (pArguments == NULL || iArgIndex < 0) {
-    return FALSE;
-  }
-  FX_BOOL bIsJsType = FALSE;
-  if (m_pDocument->GetScriptContext()->GetType() ==
-      XFA_SCRIPTLANGTYPE_Javascript) {
-    bIsJsType = TRUE;
-  }
-  FXJSE_HVALUE hValueArg = pArguments->GetValue(iArgIndex);
-  if (!FXJSE_Value_IsUTF8String(hValueArg) && bIsJsType) {
-    ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
-    FXJSE_Value_Release(hValueArg);
-    return FALSE;
-  }
-  if (FXJSE_Value_IsNull(hValueArg)) {
-    wsValue = FX_WSTRC(L"");
-  } else {
-    CFX_ByteString byMessage;
-    FXJSE_Value_ToUTF8String(hValueArg, byMessage);
-    wsValue = CFX_WideString::FromUTF8(byMessage, byMessage.GetLength());
-  }
-  FXJSE_Value_Release(hValueArg);
-  return TRUE;
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentCountInBatch(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  int32_t iValue = pNotify->GetAppProvider()->GetDocumentCountInBatch();
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iValue);
-  }
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_Print(
-    CFXJSE_Arguments* pArguments) {
-  if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
-    return;
-  }
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 8) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"print");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  FX_DWORD dwOptions = 0;
-  FX_BOOL bShowDialog = TRUE;
-  if (iLength >= 1) {
-    bShowDialog = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
-  }
-  if (bShowDialog) {
-    dwOptions |= XFA_PRINTOPT_ShowDialog;
-  }
-  int32_t nStartPage = 0;
-  if (iLength >= 2) {
-    nStartPage = pArguments->GetInt32(1);
-  }
-  int32_t nEndPage = 0;
-  if (iLength >= 3) {
-    nEndPage = pArguments->GetInt32(2);
-  }
-  FX_BOOL bCanCancel = TRUE;
-  if (iLength >= 4) {
-    bCanCancel = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
-  }
-  if (bCanCancel) {
-    dwOptions |= XFA_PRINTOPT_CanCancel;
-  }
-  FX_BOOL bShrinkPage = TRUE;
-  if (iLength >= 5) {
-    bShrinkPage = pArguments->GetInt32(4) == 0 ? FALSE : TRUE;
-  }
-  if (bShrinkPage) {
-    dwOptions |= XFA_PRINTOPT_ShrinkPage;
-  }
-  FX_BOOL bAsImage = TRUE;
-  if (iLength >= 6) {
-    bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
-  }
-  if (bAsImage) {
-    dwOptions |= XFA_PRINTOPT_AsImage;
-  }
-  FX_BOOL bReverseOrder = TRUE;
-  if (iLength >= 7) {
-    bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
-  }
-  bReverseOrder = pArguments->GetInt32(6) == 0 ? FALSE : TRUE;
-  if (bReverseOrder) {
-    dwOptions |= XFA_PRINTOPT_ReverseOrder;
-  }
-  FX_BOOL bPrintAnnot = TRUE;
-  if (iLength >= 8) {
-    bPrintAnnot = pArguments->GetInt32(7) == 0 ? FALSE : TRUE;
-  }
-  if (bPrintAnnot) {
-    dwOptions |= XFA_PRINTOPT_PrintAnnot;
-  }
-  pNotify->GetDocProvider()->Print(hDoc, nStartPage, nEndPage, dwOptions);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_ImportData(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 0 || iLength > 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"importData");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CFX_WideString wsFilePath;
-  if (iLength > 0) {
-    CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
-    wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  pNotify->GetDocProvider()->ImportData(hDoc, wsFilePath);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_ExportData(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 0 || iLength > 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"exportData");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CFX_WideString wsFilePath;
-  FX_BOOL bXDP = TRUE;
-  if (iLength >= 1) {
-    CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
-    wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
-  }
-  if (iLength >= 2) {
-    bXDP = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  pNotify->GetDocProvider()->ExportData(hDoc, wsFilePath, bXDP);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_PageUp(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
-  int32_t nNewPage = 0;
-  if (nCurPage <= 1) {
-    return;
-  }
-  nNewPage = nCurPage - 1;
-  pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_PageDown(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
-  int32_t nPageCount = pNotify->GetDocProvider()->CountPages(hDoc);
-  if (!nPageCount || nCurPage == nPageCount) {
-    return;
-  }
-  int32_t nNewPage = 0;
-  if (nCurPage >= nPageCount) {
-    nNewPage = nPageCount - 1;
-  } else {
-    nNewPage = nCurPage + 1;
-  }
-  pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
-}
-void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentDateTime(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  CFX_WideString wsDataTime = pNotify->GetCurrentDateTime();
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsDataTime));
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h b/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h
deleted file mode 100644
index 7154a25..0000000
--- a/xfa/src/fxfa/parser/xfa_script_hostpseudomodel.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
-
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CScript_HostPseudoModel : public CXFA_OrdinaryObject {
- public:
-  CScript_HostPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_HostPseudoModel();
-
-  void Script_HostPseudoModel_AppType(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_FoxitAppType(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_CalculationsEnabled(FXJSE_HVALUE hValue,
-                                                  FX_BOOL bSetting,
-                                                  XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_CurrentPage(FXJSE_HVALUE hValue,
-                                          FX_BOOL bSetting,
-                                          XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Language(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_NumPages(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Platform(FXJSE_HVALUE hValue,
-                                       FX_BOOL bSetting,
-                                       XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Title(FXJSE_HVALUE hValue,
-                                    FX_BOOL bSetting,
-                                    XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_ValidationsEnabled(FXJSE_HVALUE hValue,
-                                                 FX_BOOL bSetting,
-                                                 XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Variation(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Version(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_FoxitVersion(FXJSE_HVALUE hValue,
-                                           FX_BOOL bSetting,
-                                           XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_Name(FXJSE_HVALUE hValue,
-                                   FX_BOOL bSetting,
-                                   XFA_ATTRIBUTE eAttribute);
-  void Script_HostPseudoModel_FoxitName(FXJSE_HVALUE hValue,
-                                        FX_BOOL bSetting,
-                                        XFA_ATTRIBUTE eAttribute);
-
-  void Script_HostPseudoModel_GotoURL(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_OpenList(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_Response(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_DocumentInBatch(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_ResetData(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_Beep(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_SetFocus(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_GetFocus(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_MessageBox(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_DocumentCountInBatch(
-      CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_Print(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_ImportData(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_ExportData(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_PageUp(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_PageDown(CFXJSE_Arguments* pArguments);
-  void Script_HostPseudoModel_CurrentDateTime(CFXJSE_Arguments* pArguments);
-
- protected:
-  void Script_HostPseudoModel_LoadString(FXJSE_HVALUE hValue,
-                                         IXFA_Notify* pNotify,
-                                         FX_DWORD dwFlag);
-  FX_BOOL Script_HostPseudoModel_ValidateArgsForMsg(
-      CFXJSE_Arguments* pArguments,
-      int32_t iArgIndex,
-      CFX_WideString& wsValue);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_HOSTPSEUDOMODEL_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_imp.cpp b/xfa/src/fxfa/parser/xfa_script_imp.cpp
deleted file mode 100644
index 3682580..0000000
--- a/xfa/src/fxfa/parser/xfa_script_imp.cpp
+++ /dev/null
@@ -1,781 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_imp.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_script_nodehelper.h"
-#include "xfa/src/fxfa/parser/xfa_script_resolveprocessor.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_ScriptContext::CXFA_ScriptContext(CXFA_Document* pDocument)
-    : m_pDocument(pDocument),
-      m_hJsContext(nullptr),
-      m_hJsRuntime(nullptr),
-      m_hJsClass(nullptr),
-      m_eScriptType(XFA_SCRIPTLANGTYPE_Unkown),
-      m_pScriptNodeArray(nullptr),
-      m_pResolveProcessor(nullptr),
-      m_hFM2JSContext(nullptr),
-      m_pThisObject(nullptr),
-      m_dwBuiltInInFlags(0),
-      m_eRunAtType(XFA_ATTRIBUTEENUM_Client) {
-  FXSYS_memset(&m_JsGlobalClass, 0, sizeof(FXJSE_CLASS));
-  FXSYS_memset(&m_JsNormalClass, 0, sizeof(FXJSE_CLASS));
-}
-CXFA_ScriptContext::~CXFA_ScriptContext() {
-  FX_POSITION ps = m_mapXFAToHValue.GetStartPosition();
-  while (ps) {
-    CXFA_Object* pXFAObj;
-    FXJSE_HVALUE pValue;
-    m_mapXFAToHValue.GetNextAssoc(ps, pXFAObj, pValue);
-    FXJSE_Value_Release(pValue);
-  }
-  m_mapXFAToHValue.RemoveAll();
-  ReleaseVariablesMap();
-  if (m_hFM2JSContext) {
-    XFA_FM2JS_ContextRelease(m_hFM2JSContext);
-    m_hFM2JSContext = NULL;
-  }
-  if (m_hJsContext) {
-    FXJSE_Context_Release(m_hJsContext);
-    m_hJsContext = NULL;
-  }
-  if (m_pResolveProcessor) {
-    delete m_pResolveProcessor;
-    m_pResolveProcessor = NULL;
-  }
-  m_upObjectArray.RemoveAll();
-  for (int32_t i = 0; i < m_CacheListArray.GetSize(); i++) {
-    delete ((CXFA_NodeList*)m_CacheListArray[i]);
-  }
-  m_CacheListArray.RemoveAll();
-}
-void CXFA_ScriptContext::Initialize(FXJSE_HRUNTIME hRuntime) {
-  m_hJsRuntime = hRuntime;
-  DefineJsContext();
-  DefineJsClass();
-  m_pResolveProcessor = new CXFA_ResolveProcessor;
-}
-void CXFA_ScriptContext::Release() {
-  delete this;
-}
-FX_BOOL CXFA_ScriptContext::RunScript(XFA_SCRIPTLANGTYPE eScriptType,
-                                      const CFX_WideStringC& wsScript,
-                                      FXJSE_HVALUE hRetValue,
-                                      CXFA_Object* pThisObject) {
-  CFX_ByteString btScript;
-  XFA_SCRIPTLANGTYPE eSaveType = m_eScriptType;
-  m_eScriptType = eScriptType;
-  if (eScriptType == XFA_SCRIPTLANGTYPE_Formcalc) {
-    if (!m_hFM2JSContext) {
-      m_hFM2JSContext = XFA_FM2JS_ContextCreate();
-      XFA_FM2JS_ContextInitialize(m_hFM2JSContext, m_hJsRuntime, m_hJsContext,
-                                  m_pDocument);
-    }
-    CFX_WideTextBuf wsJavaScript;
-    CFX_WideString wsErrorInfo;
-    int32_t iFlags = XFA_FM2JS_Translate(wsScript, wsJavaScript, wsErrorInfo);
-    if (iFlags) {
-      FXJSE_Value_SetUndefined(hRetValue);
-      return FALSE;
-    }
-    btScript =
-        FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength());
-  } else {
-    btScript = FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength());
-  }
-  CXFA_Object* pOriginalObject = m_pThisObject;
-  m_pThisObject = pThisObject;
-  FXJSE_HVALUE pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL;
-  FX_BOOL bRet = FXJSE_ExecuteScript(m_hJsContext, btScript, hRetValue, pValue);
-  m_pThisObject = pOriginalObject;
-  m_eScriptType = eSaveType;
-  return bRet;
-}
-void CXFA_ScriptContext::GlobalPropertySetter(FXJSE_HOBJECT hObject,
-                                              const CFX_ByteStringC& szPropName,
-                                              FXJSE_HVALUE hValue) {
-  CXFA_Object* lpOrginalNode =
-      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  CXFA_Document* pDoc = lpOrginalNode->GetDocument();
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pDoc->GetScriptContext();
-  CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode);
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  FX_DWORD dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings |
-                    XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                    XFA_RESOLVENODE_Attributes;
-  CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
-  if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
-    pRefNode = ToNode(lpCurNode);
-  }
-  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
-                                       TRUE)) {
-    return;
-  }
-  if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
-    if (FXJSE_Value_IsUndefined(hValue)) {
-      FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue);
-      return;
-    }
-  }
-  IXFA_Notify* pNotify = pDoc->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  pNotify->GetDocProvider()->SetGlobalProperty(pNotify->GetHDOC(), szPropName,
-                                               hValue);
-}
-FX_BOOL CXFA_ScriptContext::QueryNodeByFlag(CXFA_Node* refNode,
-                                            const CFX_WideStringC& propname,
-                                            FXJSE_HVALUE hValue,
-                                            FX_DWORD dwFlag,
-                                            FX_BOOL bSetting) {
-  if (!refNode)
-    return false;
-  XFA_RESOLVENODE_RS resolveRs;
-  if (ResolveObjects(refNode, propname, resolveRs, dwFlag) <= 0)
-    return false;
-  if (resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
-    FXJSE_HVALUE pValue = GetJSValueFromMap(resolveRs.nodes[0]);
-    FXJSE_Value_Set(hValue, pValue);
-    return true;
-  }
-  if (resolveRs.dwFlags == XFA_RESOVENODE_RSTYPE_Attribute) {
-    const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = resolveRs.pScriptAttribute;
-    if (lpAttributeInfo) {
-      (resolveRs.nodes[0]->*(lpAttributeInfo->lpfnCallback))(
-          hValue, bSetting, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
-    }
-  }
-  return true;
-}
-void CXFA_ScriptContext::GlobalPropertyGetter(FXJSE_HOBJECT hObject,
-                                              const CFX_ByteStringC& szPropName,
-                                              FXJSE_HVALUE hValue) {
-  CXFA_Object* pOrginalObject =
-      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  CXFA_Document* pDoc = pOrginalObject->GetDocument();
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pDoc->GetScriptContext();
-  CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOrginalObject);
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) {
-    if (szPropName == FOXIT_XFA_FM2JS_FORMCALC_RUNTIME) {
-      XFA_FM2JS_GlobalPropertyGetter(lpScriptContext->m_hFM2JSContext, hValue);
-      return;
-    }
-    uint32_t uHashCode =
-        FX_HashCode_String_GetW(wsPropName, wsPropName.GetLength());
-    if (uHashCode != XFA_HASHCODE_Layout) {
-      CXFA_Object* pObject =
-          lpScriptContext->GetDocument()->GetXFAObject(uHashCode);
-      if (pObject) {
-        FXJSE_Value_Set(hValue, lpScriptContext->GetJSValueFromMap(pObject));
-        return;
-      }
-    }
-  }
-  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                    XFA_RESOLVENODE_Attributes;
-  CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
-  if (pOrginalObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
-    pRefNode = ToNode(lpCurNode);
-  }
-  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
-                                       FALSE)) {
-    return;
-  }
-  dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings;
-  if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
-                                       FALSE)) {
-    return;
-  }
-  CXFA_Object* pScriptObject =
-      lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
-  if (pScriptObject &&
-      lpScriptContext->QueryVariableHValue(pScriptObject->AsNode(), szPropName,
-                                           hValue, TRUE)) {
-    return;
-  }
-  IXFA_Notify* pNotify = pDoc->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  pNotify->GetDocProvider()->GetGlobalProperty(pNotify->GetHDOC(), szPropName,
-                                               hValue);
-}
-void CXFA_ScriptContext::NormalPropertyGetter(FXJSE_HOBJECT hObject,
-                                              const CFX_ByteStringC& szPropName,
-                                              FXJSE_HVALUE hValue) {
-  CXFA_Object* pOrginalObject =
-      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  if (pOrginalObject == NULL) {
-    FXJSE_Value_SetUndefined(hValue);
-    return;
-  }
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
-  CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
-  if (wsPropName == FX_WSTRC(L"xfa")) {
-    FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap(
-        lpScriptContext->GetDocument()->GetRoot());
-    FXJSE_Value_Set(hValue, pValue);
-    return;
-  }
-  FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
-                    XFA_RESOLVENODE_Attributes;
-  FX_BOOL bRet = lpScriptContext->QueryNodeByFlag(ToNode(pObject), wsPropName,
-                                                  hValue, dwFlag, FALSE);
-  if (bRet) {
-    return;
-  }
-  if (pObject == lpScriptContext->GetThisObject() ||
-      (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Javascript &&
-       !lpScriptContext->IsStrictScopeInJavaScript())) {
-    dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings;
-    bRet = lpScriptContext->QueryNodeByFlag(ToNode(pObject), wsPropName, hValue,
-                                            dwFlag, FALSE);
-  }
-  if (bRet) {
-    return;
-  }
-  CXFA_Object* pScriptObject =
-      lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
-  if (pScriptObject) {
-    bRet = lpScriptContext->QueryVariableHValue(ToNode(pScriptObject),
-                                                szPropName, hValue, TRUE);
-  }
-  if (!bRet) {
-    FXJSE_Value_SetUndefined(hValue);
-  }
-}
-void CXFA_ScriptContext::NormalPropertySetter(FXJSE_HOBJECT hObject,
-                                              const CFX_ByteStringC& szPropName,
-                                              FXJSE_HVALUE hValue) {
-  CXFA_Object* pOrginalObject =
-      (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  if (pOrginalObject == NULL) {
-    return;
-  }
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
-  CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
-      XFA_GetScriptAttributeByName(pObject->GetClassID(), wsPropName);
-  if (lpAttributeInfo) {
-    (pObject->*(lpAttributeInfo->lpfnCallback))(
-        hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
-  } else {
-    if (pObject->IsNode()) {
-      if (wsPropName.GetAt(0) == '#') {
-        wsPropName = wsPropName.Right(wsPropName.GetLength() - 1);
-      }
-      CXFA_Node* pNode = ToNode(pObject);
-      CXFA_Node* pPropOrChild = NULL;
-      const XFA_ELEMENTINFO* lpElementInfo = XFA_GetElementByName(wsPropName);
-      if (lpElementInfo) {
-        pPropOrChild = pNode->GetProperty(0, lpElementInfo->eName);
-      } else {
-        pPropOrChild = pNode->GetFirstChildByName(wsPropName);
-      }
-      if (pPropOrChild) {
-        CFX_WideString wsDefaultName = FX_WSTRC(L"{default}");
-        const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
-            XFA_GetScriptAttributeByName(pPropOrChild->GetClassID(),
-                                         wsDefaultName);
-        if (lpAttributeInfo) {
-          (pPropOrChild->*(lpAttributeInfo->lpfnCallback))(
-              hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
-          return;
-        }
-      }
-    }
-    CXFA_Object* pScriptObject =
-        lpScriptContext->GetVariablesThis(pOrginalObject, TRUE);
-    if (pScriptObject) {
-      lpScriptContext->QueryVariableHValue(ToNode(pScriptObject), szPropName,
-                                           hValue, FALSE);
-    }
-  }
-}
-int32_t CXFA_ScriptContext::NormalPropTypeGetter(
-    FXJSE_HOBJECT hObject,
-    const CFX_ByteStringC& szPropName,
-    FX_BOOL bQueryIn) {
-  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  if (pObject == NULL) {
-    return FXJSE_ClassPropType_None;
-  }
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
-  pObject = lpScriptContext->GetVariablesThis(pObject);
-  XFA_ELEMENT objElement = pObject->GetClassID();
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  if (XFA_GetMethodByName(objElement, wsPropName)) {
-    return FXJSE_ClassPropType_Method;
-  }
-  if (bQueryIn && !XFA_GetScriptAttributeByName(objElement, wsPropName)) {
-    return FXJSE_ClassPropType_None;
-  }
-  return FXJSE_ClassPropType_Property;
-}
-int32_t CXFA_ScriptContext::GlobalPropTypeGetter(
-    FXJSE_HOBJECT hObject,
-    const CFX_ByteStringC& szPropName,
-    FX_BOOL bQueryIn) {
-  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-  if (pObject == NULL) {
-    return FXJSE_ClassPropType_None;
-  }
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
-  pObject = lpScriptContext->GetVariablesThis(pObject);
-  XFA_ELEMENT objElement = pObject->GetClassID();
-  CFX_WideString wsPropName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength());
-  if (XFA_GetMethodByName(objElement, wsPropName)) {
-    return FXJSE_ClassPropType_Method;
-  }
-  return FXJSE_ClassPropType_Property;
-}
-void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis,
-                                          const CFX_ByteStringC& szFuncName,
-                                          CFXJSE_Arguments& args) {
-  CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL);
-  if (pObject == NULL) {
-    return;
-  }
-  CXFA_ScriptContext* lpScriptContext =
-      (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
-  pObject = lpScriptContext->GetVariablesThis(pObject);
-  CFX_WideString wsFunName = CFX_WideString::FromUTF8(
-      (const FX_CHAR*)szFuncName.GetPtr(), szFuncName.GetLength());
-  const XFA_METHODINFO* lpMethodInfo =
-      XFA_GetMethodByName(pObject->GetClassID(), wsFunName);
-  if (NULL == lpMethodInfo) {
-    return;
-  }
-  (pObject->*(lpMethodInfo->lpfnCallback))(&args);
-}
-FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() {
-  return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping);
-}
-XFA_SCRIPTLANGTYPE CXFA_ScriptContext::GetType() {
-  return m_eScriptType;
-}
-void CXFA_ScriptContext::DefineJsContext() {
-  m_JsGlobalClass.constructor = NULL;
-  m_JsGlobalClass.name = "Root";
-  m_JsGlobalClass.propNum = 0;
-  m_JsGlobalClass.properties = NULL;
-  m_JsGlobalClass.methNum = 0;
-  m_JsGlobalClass.methods = NULL;
-  m_JsGlobalClass.dynPropGetter = CXFA_ScriptContext::GlobalPropertyGetter;
-  m_JsGlobalClass.dynPropSetter = CXFA_ScriptContext::GlobalPropertySetter;
-  m_JsGlobalClass.dynPropTypeGetter = CXFA_ScriptContext::GlobalPropTypeGetter;
-  m_JsGlobalClass.dynPropDeleter = NULL;
-  m_JsGlobalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall;
-  m_hJsContext = FXJSE_Context_Create(m_hJsRuntime, &m_JsGlobalClass,
-                                      m_pDocument->GetRoot());
-  RemoveBuiltInObjs(m_hJsContext);
-  FXJSE_Context_EnableCompatibleMode(
-      m_hJsContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS);
-}
-FXJSE_HCONTEXT CXFA_ScriptContext::CreateVariablesContext(
-    CXFA_Node* pScriptNode,
-    CXFA_Node* pSubform) {
-  if (pScriptNode == NULL || pSubform == NULL) {
-    return NULL;
-  }
-  if (m_mapVariableToHValue.GetCount() == 0) {
-    m_JsGlobalVariablesClass.constructor = NULL;
-    m_JsGlobalVariablesClass.name = "XFAScriptObject";
-    m_JsGlobalVariablesClass.propNum = 0;
-    m_JsGlobalVariablesClass.properties = NULL;
-    m_JsGlobalVariablesClass.methNum = 0;
-    m_JsGlobalVariablesClass.methods = NULL;
-    m_JsGlobalVariablesClass.dynPropGetter =
-        CXFA_ScriptContext::GlobalPropertyGetter;
-    m_JsGlobalVariablesClass.dynPropSetter =
-        CXFA_ScriptContext::GlobalPropertySetter;
-    m_JsGlobalVariablesClass.dynPropTypeGetter =
-        CXFA_ScriptContext::NormalPropTypeGetter;
-    m_JsGlobalVariablesClass.dynPropDeleter = NULL;
-    m_JsGlobalVariablesClass.dynMethodCall =
-        CXFA_ScriptContext::NormalMethodCall;
-  }
-  CXFA_ThisProxy* lpVariableNode = new CXFA_ThisProxy(pSubform, pScriptNode);
-  FXJSE_HCONTEXT hVariablesContext = FXJSE_Context_Create(
-      m_hJsRuntime, &m_JsGlobalVariablesClass, (CXFA_Object*)lpVariableNode);
-  RemoveBuiltInObjs(hVariablesContext);
-  FXJSE_Context_EnableCompatibleMode(
-      hVariablesContext, FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS);
-  m_mapVariableToHValue.SetAt(pScriptNode, hVariablesContext);
-  return hVariablesContext;
-}
-CXFA_Object* CXFA_ScriptContext::GetVariablesThis(CXFA_Object* pObject,
-                                                  FX_BOOL bScriptNode) {
-  if (pObject->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
-    return bScriptNode ? ((CXFA_ThisProxy*)pObject)->GetScriptNode()
-                       : ((CXFA_ThisProxy*)pObject)->GetThisNode();
-  }
-  return pObject;
-}
-FX_BOOL CXFA_ScriptContext::RunVariablesScript(CXFA_Node* pScriptNode) {
-  if (pScriptNode == NULL) {
-    return FALSE;
-  }
-  if (pScriptNode->GetClassID() == XFA_ELEMENT_Script) {
-    CXFA_Node* pParent = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent);
-    if (!pParent || pParent->GetClassID() != XFA_ELEMENT_Variables) {
-      return FALSE;
-    }
-    if (m_mapVariableToHValue.GetValueAt(pScriptNode)) {
-      return TRUE;
-    }
-    CXFA_Node* pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (!pTextNode) {
-      return FALSE;
-    }
-    CFX_WideStringC wsScript;
-    if (!pTextNode->TryCData(XFA_ATTRIBUTE_Value, wsScript)) {
-      return FALSE;
-    }
-    CFX_ByteString btScript =
-        FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength());
-    FXJSE_HVALUE hRetValue = FXJSE_Value_Create(m_hJsRuntime);
-    CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent);
-    FXJSE_HCONTEXT hVariablesContext =
-        CreateVariablesContext(pScriptNode, pThisObject);
-    CXFA_Object* pOriginalObject = m_pThisObject;
-    m_pThisObject = pThisObject;
-    FX_BOOL bRet = FXJSE_ExecuteScript(hVariablesContext, btScript, hRetValue);
-    m_pThisObject = pOriginalObject;
-    FXJSE_Value_Release(hRetValue);
-    return bRet;
-  }
-  return TRUE;
-}
-FX_BOOL CXFA_ScriptContext::QueryVariableHValue(
-    CXFA_Node* pScriptNode,
-    const CFX_ByteStringC& szPropName,
-    FXJSE_HVALUE hValue,
-    FX_BOOL bGetter) {
-  if (!pScriptNode || pScriptNode->GetClassID() != XFA_ELEMENT_Script) {
-    return FALSE;
-  }
-  CXFA_Node* variablesNode = pScriptNode->GetNodeItem(XFA_NODEITEM_Parent);
-  if (!variablesNode || variablesNode->GetClassID() != XFA_ELEMENT_Variables) {
-    return FALSE;
-  }
-  FX_BOOL bRes = FALSE;
-  void* lpVariables = m_mapVariableToHValue.GetValueAt(pScriptNode);
-  if (lpVariables) {
-    FXJSE_HCONTEXT hVariableContext = (FXJSE_HCONTEXT)lpVariables;
-    FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext);
-    FXJSE_HVALUE hVariableValue = FXJSE_Value_Create(m_hJsRuntime);
-    if (!bGetter) {
-      FXJSE_Value_SetObjectOwnProp(hObject, szPropName, hValue);
-      bRes = TRUE;
-    } else if (FXJSE_Value_ObjectHasOwnProp(hObject, szPropName, FALSE)) {
-      FXJSE_Value_GetObjectProp(hObject, szPropName, hVariableValue);
-      if (FXJSE_Value_IsFunction(hVariableValue)) {
-        FXJSE_Value_SetFunctionBind(hValue, hVariableValue, hObject);
-      } else if (bGetter) {
-        FXJSE_Value_Set(hValue, hVariableValue);
-      } else {
-        FXJSE_Value_Set(hVariableValue, hValue);
-      }
-      bRes = TRUE;
-    }
-    FXJSE_Value_Release(hVariableValue);
-    FXJSE_Value_Release(hObject);
-  }
-  return bRes;
-}
-void CXFA_ScriptContext::ReleaseVariablesMap() {
-  FX_POSITION ps = m_mapVariableToHValue.GetStartPosition();
-  while (ps) {
-    CXFA_Object* pScriptNode;
-    FXJSE_HCONTEXT hVariableContext;
-    m_mapVariableToHValue.GetNextAssoc(ps, pScriptNode, hVariableContext);
-    FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(hVariableContext);
-    CXFA_Object* lpCurNode = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
-    if (lpCurNode) {
-      delete (CXFA_ThisProxy*)lpCurNode;
-      lpCurNode = NULL;
-    }
-    FXJSE_Value_Release(hObject);
-    FXJSE_Context_Release(hVariableContext);
-    hVariableContext = NULL;
-  }
-  m_mapVariableToHValue.RemoveAll();
-}
-void CXFA_ScriptContext::DefineJsClass() {
-  m_JsNormalClass.constructor = NULL;
-  m_JsNormalClass.name = "XFAObject";
-  m_JsNormalClass.propNum = 0;
-  m_JsNormalClass.properties = NULL;
-  m_JsNormalClass.methNum = 0;
-  m_JsNormalClass.methods = NULL;
-  m_JsNormalClass.dynPropGetter = CXFA_ScriptContext::NormalPropertyGetter;
-  m_JsNormalClass.dynPropSetter = CXFA_ScriptContext::NormalPropertySetter;
-  m_JsNormalClass.dynPropTypeGetter = CXFA_ScriptContext::NormalPropTypeGetter;
-  m_JsNormalClass.dynPropDeleter = NULL;
-  m_JsNormalClass.dynMethodCall = CXFA_ScriptContext::NormalMethodCall;
-  m_hJsClass = FXJSE_DefineClass(m_hJsContext, &m_JsNormalClass);
-}
-void CXFA_ScriptContext::RemoveBuiltInObjs(FXJSE_HCONTEXT jsContext) const {
-  static const CFX_ByteStringC OBJ_NAME[2] = {"Number", "Date"};
-  FXJSE_HVALUE hObject = FXJSE_Context_GetGlobalObject(jsContext);
-  FXJSE_HVALUE hProp = FXJSE_Value_Create(m_hJsRuntime);
-  for (int i = 0; i < 2; ++i) {
-    if (FXJSE_Value_GetObjectProp(hObject, OBJ_NAME[i], hProp))
-      FXJSE_Value_DeleteObjectProp(hObject, OBJ_NAME[i]);
-  }
-  FXJSE_Value_Release(hProp);
-  FXJSE_Value_Release(hObject);
-}
-FXJSE_HCLASS CXFA_ScriptContext::GetJseNormalClass() {
-  return m_hJsClass;
-}
-int32_t CXFA_ScriptContext::ResolveObjects(CXFA_Object* refNode,
-                                           const CFX_WideStringC& wsExpression,
-                                           XFA_RESOLVENODE_RS& resolveNodeRS,
-                                           FX_DWORD dwStyles,
-                                           CXFA_Node* bindNode) {
-  if (wsExpression.IsEmpty()) {
-    return 0;
-  }
-  if (m_eScriptType != XFA_SCRIPTLANGTYPE_Formcalc ||
-      (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
-    m_upObjectArray.RemoveAll();
-  }
-  if (refNode && refNode->IsNode() &&
-      (dwStyles & (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings))) {
-    m_upObjectArray.Add(refNode->AsNode());
-  }
-  FX_BOOL bNextCreate = FALSE;
-  if (dwStyles & XFA_RESOLVENODE_CreateNode) {
-    m_pResolveProcessor->GetNodeHelper()->XFA_SetCreateNodeType(bindNode);
-  }
-  m_pResolveProcessor->GetNodeHelper()->m_pCreateParent = NULL;
-  m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart = -1;
-  CXFA_ResolveNodesData rndFind;
-  int32_t nStart = 0;
-  int32_t nLevel = 0;
-  int32_t nRet = -1;
-  rndFind.m_pSC = this;
-  CXFA_ObjArray findNodes;
-  findNodes.Add(refNode ? refNode : m_pDocument->GetRoot());
-  int32_t nNodes = 0;
-  while (TRUE) {
-    nNodes = findNodes.GetSize();
-    int32_t i = 0;
-    rndFind.m_dwStyles = dwStyles;
-    m_pResolveProcessor->m_iCurStart = nStart;
-    nStart = m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression,
-                                                             nStart, rndFind);
-    if (nStart < 1) {
-      if ((dwStyles & XFA_RESOLVENODE_CreateNode) && !bNextCreate) {
-        CXFA_Node* pDataNode = NULL;
-        nStart = m_pResolveProcessor->GetNodeHelper()->m_iCurAllStart;
-        if (nStart != -1) {
-          pDataNode = m_pDocument->GetNotBindNode(findNodes);
-          if (pDataNode) {
-            findNodes.RemoveAll();
-            findNodes.Add(pDataNode);
-            break;
-          }
-        } else {
-          pDataNode = findNodes[0]->AsNode();
-          findNodes.RemoveAll();
-          findNodes.Add(pDataNode);
-          break;
-        }
-        dwStyles |= XFA_RESOLVENODE_Bind;
-        findNodes.RemoveAll();
-        findNodes.Add(m_pResolveProcessor->GetNodeHelper()->m_pAllStartParent);
-        continue;
-      } else {
-        break;
-      }
-    }
-    if (bNextCreate) {
-      FX_BOOL bCreate =
-          m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
-              rndFind.m_wsName, rndFind.m_wsCondition,
-              nStart == wsExpression.GetLength(), this);
-      if (bCreate) {
-        continue;
-      } else {
-        break;
-      }
-    }
-    CXFA_ObjArray retNodes;
-    while (i < nNodes) {
-      FX_BOOL bDataBind = FALSE;
-      if (((dwStyles & XFA_RESOLVENODE_Bind) ||
-           (dwStyles & XFA_RESOLVENODE_CreateNode)) &&
-          nNodes > 1) {
-        CXFA_ResolveNodesData rndBind;
-        m_pResolveProcessor->XFA_ResolveNodes_GetFilter(wsExpression, nStart,
-                                                        rndBind);
-        m_pResolveProcessor->XFA_ResolveNode_SetIndexDataBind(
-            rndBind.m_wsCondition, i, nNodes);
-        bDataBind = TRUE;
-      }
-      rndFind.m_CurNode = findNodes[i++];
-      rndFind.m_nLevel = nLevel;
-      rndFind.m_dwFlag = XFA_RESOVENODE_RSTYPE_Nodes;
-      nRet = m_pResolveProcessor->XFA_ResolveNodes(rndFind);
-      if (nRet < 1) {
-        continue;
-      }
-      if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute &&
-          rndFind.m_pScriptAttribute && nStart < wsExpression.GetLength()) {
-        FXJSE_HVALUE hValue = FXJSE_Value_Create(m_hJsRuntime);
-        (rndFind.m_Nodes[0]->*(rndFind.m_pScriptAttribute->lpfnCallback))(
-            hValue, FALSE,
-            (XFA_ATTRIBUTE)rndFind.m_pScriptAttribute->eAttribute);
-        rndFind.m_Nodes.SetAt(0,
-                              (CXFA_Object*)FXJSE_Value_ToObject(hValue, NULL));
-        FXJSE_Value_Release(hValue);
-      }
-      int32_t iSize = m_upObjectArray.GetSize();
-      if (iSize) {
-        m_upObjectArray.RemoveAt(iSize - 1);
-      }
-      retNodes.Append(rndFind.m_Nodes);
-      rndFind.m_Nodes.RemoveAll();
-      if (bDataBind) {
-        break;
-      }
-    }
-    findNodes.RemoveAll();
-    nNodes = retNodes.GetSize();
-    if (nNodes < 1) {
-      if (dwStyles & XFA_RESOLVENODE_CreateNode) {
-        bNextCreate = TRUE;
-        if (m_pResolveProcessor->GetNodeHelper()->m_pCreateParent == NULL) {
-          m_pResolveProcessor->GetNodeHelper()->m_pCreateParent =
-              ToNode(rndFind.m_CurNode);
-          m_pResolveProcessor->GetNodeHelper()->m_iCreateCount = 1;
-        }
-        FX_BOOL bCreate =
-            m_pResolveProcessor->GetNodeHelper()->XFA_ResolveNodes_CreateNode(
-                rndFind.m_wsName, rndFind.m_wsCondition,
-                nStart == wsExpression.GetLength(), this);
-        if (bCreate) {
-          continue;
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-    }
-    findNodes.Copy(retNodes);
-    rndFind.m_Nodes.RemoveAll();
-    if (nLevel == 0) {
-      dwStyles &= ~(XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
-    }
-    nLevel++;
-  }
-  if (!bNextCreate) {
-    resolveNodeRS.dwFlags = rndFind.m_dwFlag;
-    if (nNodes > 0) {
-      resolveNodeRS.nodes.Append(findNodes);
-    }
-    if (rndFind.m_dwFlag == XFA_RESOVENODE_RSTYPE_Attribute) {
-      resolveNodeRS.pScriptAttribute = rndFind.m_pScriptAttribute;
-      return 1;
-    }
-  }
-  if (dwStyles & (XFA_RESOLVENODE_CreateNode | XFA_RESOLVENODE_Bind |
-                  XFA_RESOLVENODE_BindNew)) {
-    m_pResolveProcessor->XFA_ResolveNode_SetResultCreateNode(
-        resolveNodeRS, rndFind.m_wsCondition);
-    if (!bNextCreate && (dwStyles & XFA_RESOLVENODE_CreateNode)) {
-      resolveNodeRS.dwFlags = XFA_RESOVENODE_RSTYPE_ExistNodes;
-    }
-    return resolveNodeRS.nodes.GetSize();
-  }
-  return nNodes;
-}
-FXJSE_HVALUE CXFA_ScriptContext::GetJSValueFromMap(CXFA_Object* pObject) {
-  if (!pObject) {
-    return NULL;
-  }
-  if (pObject->IsNode()) {
-    RunVariablesScript(pObject->AsNode());
-  }
-  void* pValue = m_mapXFAToHValue.GetValueAt(pObject);
-  if (pValue == NULL) {
-    FXJSE_HVALUE jsHvalue = FXJSE_Value_Create(m_hJsRuntime);
-    FXJSE_Value_SetObject(jsHvalue, pObject, m_hJsClass);
-    m_mapXFAToHValue.SetAt(pObject, jsHvalue);
-    pValue = jsHvalue;
-  }
-  return (FXJSE_HVALUE)pValue;
-}
-int32_t CXFA_ScriptContext::GetIndexByName(CXFA_Node* refNode) {
-  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
-  return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
-                                    lpNodeHelper->XFA_NodeIsProperty(refNode),
-                                    FALSE);
-}
-int32_t CXFA_ScriptContext::GetIndexByClassName(CXFA_Node* refNode) {
-  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
-  return lpNodeHelper->XFA_GetIndex(refNode, XFA_LOGIC_Transparent,
-                                    lpNodeHelper->XFA_NodeIsProperty(refNode),
-                                    TRUE);
-}
-void CXFA_ScriptContext::GetSomExpression(CXFA_Node* refNode,
-                                          CFX_WideString& wsExpression) {
-  CXFA_NodeHelper* lpNodeHelper = m_pResolveProcessor->GetNodeHelper();
-  lpNodeHelper->XFA_GetNameExpression(refNode, wsExpression, TRUE,
-                                      XFA_LOGIC_Transparent);
-}
-void CXFA_ScriptContext::SetNodesOfRunScript(CXFA_NodeArray* pArray) {
-  m_pScriptNodeArray = pArray;
-}
-void CXFA_ScriptContext::AddNodesOfRunScript(const CXFA_NodeArray& nodes) {
-  if (!m_pScriptNodeArray) {
-    return;
-  }
-  if (nodes.GetSize() > 0) {
-    m_pScriptNodeArray->Copy(nodes);
-  }
-}
-void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) {
-  if (!m_pScriptNodeArray) {
-    return;
-  }
-  if (m_pScriptNodeArray->Find(pNode) == -1) {
-    m_pScriptNodeArray->Add(pNode);
-  }
-}
-IXFA_ScriptContext* XFA_ScriptContext_Create(CXFA_Document* pDocument) {
-  return new CXFA_ScriptContext(pDocument);
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_imp.h b/xfa/src/fxfa/parser/xfa_script_imp.h
deleted file mode 100644
index 529ab6d..0000000
--- a/xfa/src/fxfa/parser/xfa_script_imp.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_IMP_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_IMP_H_
-
-#include <map>
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-#define XFA_RESOLVENODE_TagName 0x0002
-
-class CXFA_ResolveProcessor;
-
-class CXFA_ScriptContext : public IXFA_ScriptContext {
- public:
-  explicit CXFA_ScriptContext(CXFA_Document* pDocument);
-  ~CXFA_ScriptContext();
-
-  virtual void Release();
-  virtual void Initialize(FXJSE_HRUNTIME hRuntime);
-  virtual void SetEventParam(CXFA_EventParam param) { m_eventParam = param; }
-  virtual CXFA_EventParam* GetEventParam() { return &m_eventParam; }
-  virtual FX_BOOL RunScript(XFA_SCRIPTLANGTYPE eScriptType,
-                            const CFX_WideStringC& wsScript,
-                            FXJSE_HVALUE hRetValue,
-                            CXFA_Object* pThisObject = NULL);
-
-  virtual int32_t ResolveObjects(CXFA_Object* refNode,
-                                 const CFX_WideStringC& wsExpression,
-                                 XFA_RESOLVENODE_RS& resolveNodeRS,
-                                 FX_DWORD dwStyles = XFA_RESOLVENODE_Children,
-                                 CXFA_Node* bindNode = NULL);
-  virtual FXJSE_HVALUE GetJSValueFromMap(CXFA_Object* pObject);
-  virtual void CacheList(CXFA_NodeList* pList) { m_CacheListArray.Add(pList); }
-  virtual CXFA_Object* GetThisObject() const { return m_pThisObject; }
-  virtual FXJSE_HRUNTIME GetRuntime() const { return m_hJsRuntime; }
-
-  virtual int32_t GetIndexByName(CXFA_Node* refNode);
-  virtual int32_t GetIndexByClassName(CXFA_Node* refNode);
-  virtual void GetSomExpression(CXFA_Node* refNode,
-                                CFX_WideString& wsExpression);
-
-  virtual void SetNodesOfRunScript(CXFA_NodeArray* pArray);
-  virtual void AddNodesOfRunScript(const CXFA_NodeArray& nodes);
-  virtual void AddNodesOfRunScript(CXFA_Node* pNode);
-  virtual FXJSE_HCLASS GetJseNormalClass();
-
-  virtual void SetRunAtType(XFA_ATTRIBUTEENUM eRunAt) { m_eRunAtType = eRunAt; }
-  virtual FX_BOOL IsRunAtClient() {
-    return m_eRunAtType != XFA_ATTRIBUTEENUM_Server;
-  }
-  FX_BOOL QueryNodeByFlag(CXFA_Node* refNode,
-                          const CFX_WideStringC& propname,
-                          FXJSE_HVALUE hValue,
-                          FX_DWORD dwFlag,
-                          FX_BOOL bSetting);
-  FX_BOOL QueryVariableHValue(CXFA_Node* pScriptNode,
-                              const CFX_ByteStringC& szPropName,
-                              FXJSE_HVALUE hValue,
-                              FX_BOOL bGetter);
-  FX_BOOL QueryBuiltinHValue(const CFX_ByteStringC& szPropName,
-                             FXJSE_HVALUE hValue);
-  static void GlobalPropertyGetter(FXJSE_HOBJECT hObject,
-                                   const CFX_ByteStringC& szPropName,
-                                   FXJSE_HVALUE hValue);
-  static void GlobalPropertySetter(FXJSE_HOBJECT hObject,
-                                   const CFX_ByteStringC& szPropName,
-                                   FXJSE_HVALUE hValue);
-  static void NormalPropertyGetter(FXJSE_HOBJECT hObject,
-                                   const CFX_ByteStringC& szPropName,
-                                   FXJSE_HVALUE hValue);
-  static void NormalPropertySetter(FXJSE_HOBJECT hObject,
-                                   const CFX_ByteStringC& szPropName,
-                                   FXJSE_HVALUE hValue);
-  static void NormalMethodCall(FXJSE_HOBJECT hThis,
-                               const CFX_ByteStringC& szFuncName,
-                               CFXJSE_Arguments& args);
-  static int32_t NormalPropTypeGetter(FXJSE_HOBJECT hObject,
-                                      const CFX_ByteStringC& szPropName,
-                                      FX_BOOL bQueryIn);
-  static int32_t GlobalPropTypeGetter(FXJSE_HOBJECT hObject,
-                                      const CFX_ByteStringC& szPropName,
-                                      FX_BOOL bQueryIn);
-  FX_BOOL RunVariablesScript(CXFA_Node* pScriptNode);
-  CXFA_Object* GetVariablesThis(CXFA_Object* pObject,
-                                FX_BOOL bScriptNode = FALSE);
-  void ReleaseVariablesMap();
-  FX_BOOL IsStrictScopeInJavaScript();
-  XFA_SCRIPTLANGTYPE GetType();
-  CXFA_NodeArray& GetUpObjectArray() { return m_upObjectArray; }
-  CXFA_Document* GetDocument() const { return m_pDocument; }
-
- protected:
-  void DefineJsContext();
-  FXJSE_HCONTEXT CreateVariablesContext(CXFA_Node* pScriptNode,
-                                        CXFA_Node* pSubform);
-  void DefineJsClass();
-  void RemoveBuiltInObjs(FXJSE_HCONTEXT jsContext) const;
-
-  CXFA_Document* m_pDocument;
-  FXJSE_HCONTEXT m_hJsContext;
-  FXJSE_HRUNTIME m_hJsRuntime;
-  FXJSE_HCLASS m_hJsClass;
-  XFA_SCRIPTLANGTYPE m_eScriptType;
-  FXJSE_CLASS m_JsGlobalClass;
-  FXJSE_CLASS m_JsNormalClass;
-  CFX_MapPtrTemplate<CXFA_Object*, FXJSE_HVALUE> m_mapXFAToHValue;
-  FXJSE_CLASS m_JsGlobalVariablesClass;
-  CFX_MapPtrTemplate<CXFA_Object*, FXJSE_HCONTEXT> m_mapVariableToHValue;
-  CXFA_EventParam m_eventParam;
-  CXFA_NodeArray m_upObjectArray;
-  CFX_PtrArray m_CacheListArray;
-  CXFA_NodeArray* m_pScriptNodeArray;
-  CXFA_ResolveProcessor* m_pResolveProcessor;
-  XFA_HFM2JSCONTEXT m_hFM2JSContext;
-  CXFA_Object* m_pThisObject;
-  FX_DWORD m_dwBuiltInInFlags;
-  XFA_ATTRIBUTEENUM m_eRunAtType;
-};
-
-#endif  //  XFA_SRC_FXFA_PARSER_XFA_SCRIPT_IMP_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.cpp b/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.cpp
deleted file mode 100644
index fe8990a..0000000
--- a/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.cpp
+++ /dev/null
@@ -1,552 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h"
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_LayoutPseudoModel::CScript_LayoutPseudoModel(CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LayoutPseudoModel) {
-  m_uScriptHash = XFA_HASHCODE_Layout;
-}
-CScript_LayoutPseudoModel::~CScript_LayoutPseudoModel() {}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Ready(
-    FXJSE_HVALUE hValue,
-    FX_BOOL bSetting,
-    XFA_ATTRIBUTE eAttribute) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  if (bSetting) {
-    ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_READY);
-    return;
-  }
-  int32_t iStatus = pNotify->GetLayoutStatus();
-  FXJSE_Value_SetBoolean(hValue, iStatus >= 2);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_HWXY(
-    CFXJSE_Arguments* pArguments,
-    XFA_LAYOUTMODEL_HWXY layoutModel) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 3) {
-    const FX_WCHAR* methodName = NULL;
-    switch (layoutModel) {
-      case XFA_LAYOUTMODEL_H:
-        methodName = L"h";
-        break;
-      case XFA_LAYOUTMODEL_W:
-        methodName = L"w";
-        break;
-      case XFA_LAYOUTMODEL_X:
-        methodName = L"x";
-        break;
-      case XFA_LAYOUTMODEL_Y:
-        methodName = L"y";
-        break;
-    }
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  CFX_WideString wsUnit = FX_WSTRC(L"pt");
-  int32_t iIndex = 0;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsUnit = pArguments->GetUTF8String(1);
-    if (!bsUnit.IsEmpty()) {
-      wsUnit = CFX_WideString::FromUTF8(bsUnit, bsUnit.GetLength());
-    }
-  }
-  if (iLength >= 3) {
-    iIndex = pArguments->GetInt32(2);
-  }
-  if (!pNode) {
-    return;
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  CFX_RectF rtRect;
-  CXFA_Measurement measure;
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
-  if (!pLayoutItem) {
-    return;
-  }
-  while (iIndex > 0 && pLayoutItem) {
-    pLayoutItem = pLayoutItem->GetNext();
-    iIndex--;
-  }
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (!pLayoutItem) {
-    FXJSE_Value_SetFloat(hValue, 0);
-    return;
-  }
-  pLayoutItem->GetRect(rtRect, TRUE);
-  switch (layoutModel) {
-    case XFA_LAYOUTMODEL_H:
-      measure.Set(rtRect.height, XFA_UNIT_Pt);
-      break;
-    case XFA_LAYOUTMODEL_W:
-      measure.Set(rtRect.width, XFA_UNIT_Pt);
-      break;
-    case XFA_LAYOUTMODEL_X:
-      measure.Set(rtRect.left, XFA_UNIT_Pt);
-      break;
-    case XFA_LAYOUTMODEL_Y:
-      measure.Set(rtRect.top, XFA_UNIT_Pt);
-      break;
-  }
-  XFA_UNIT unit = measure.GetUnit(wsUnit);
-  FX_FLOAT fValue = measure.ToUnit(unit);
-  fValue = FXSYS_round(fValue * 1000) / 1000.0f;
-  if (hValue) {
-    FXJSE_Value_SetFloat(hValue, fValue);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_H(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_H);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_W(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_W);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_X(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_X);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Y(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_Y);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_NumberedPageCount(
-    CFXJSE_Arguments* pArguments,
-    FX_BOOL bNumbered) {
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  int32_t iPageCount = 0;
-  int32_t iPageNum = pDocLayout->CountPages();
-  if (bNumbered) {
-    for (int32_t i = 0; i < iPageNum; i++) {
-      IXFA_LayoutPage* pLayoutPage = pDocLayout->GetPage(i);
-      if (!pLayoutPage) {
-        continue;
-      }
-      CXFA_Node* pMasterPage = pLayoutPage->GetMasterPage();
-      if (pMasterPage->GetInteger(XFA_ATTRIBUTE_Numbered)) {
-        iPageCount++;
-      }
-    }
-  } else {
-    iPageCount = iPageNum;
-  }
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageCount);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageCount(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_NumberedPageCount(pArguments, TRUE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageSpan(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageSpan");
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (!pNode) {
-    return;
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
-  if (!pLayoutItem) {
-    FXJSE_Value_SetInteger(hValue, -1);
-    return;
-  }
-  int32_t iLast = pLayoutItem->GetLast()->GetPage()->GetPageIndex();
-  int32_t iFirst = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
-  int32_t iPageSpan = iLast - iFirst + 1;
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageSpan);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Page(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_PageImp(pArguments, FALSE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_GetObjArray(
-    IXFA_DocLayout* pDocLayout,
-    int32_t iPageNo,
-    const CFX_WideString& wsType,
-    FX_BOOL bOnPageArea,
-    CXFA_NodeArray& retArray) {
-  CXFA_ContainerLayoutItem* pLayoutPage =
-      (CXFA_ContainerLayoutItem*)pDocLayout->GetPage(iPageNo);
-  if (!pLayoutPage) {
-    return;
-  }
-  if (wsType == FX_WSTRC(L"pageArea")) {
-    if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
-      retArray.Add(pMasterPage);
-    }
-    return;
-  }
-  if (wsType == FX_WSTRC(L"contentArea")) {
-    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
-         pItem = pItem->m_pNextSibling) {
-      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
-        retArray.Add(pItem->m_pFormNode);
-      }
-    }
-    return;
-  }
-  CFX_MapPtrToPtr formItems;
-  formItems.InitHashTable(256, TRUE);
-  if (wsType.IsEmpty()) {
-    if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
-      retArray.Add(pMasterPage);
-    }
-    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
-         pItem = pItem->m_pNextSibling) {
-      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
-        retArray.Add(pItem->m_pFormNode);
-        if (!bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
-              continue;
-            }
-            XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
-            if (eElementType != XFA_ELEMENT_Field &&
-                eElementType != XFA_ELEMENT_Draw &&
-                eElementType != XFA_ELEMENT_Subform &&
-                eElementType != XFA_ELEMENT_Area) {
-              continue;
-            }
-            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
-              continue;
-            }
-            formItems.SetAt(pItemChild->m_pFormNode, this);
-            retArray.Add(pItemChild->m_pFormNode);
-          }
-        }
-      } else {
-        if (bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator((CXFA_ContentLayoutItem*)pItem);
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
-              continue;
-            }
-            XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
-            if (eElementType != XFA_ELEMENT_Field &&
-                eElementType != XFA_ELEMENT_Draw &&
-                eElementType != XFA_ELEMENT_Subform &&
-                eElementType != XFA_ELEMENT_Area) {
-              continue;
-            }
-            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
-              continue;
-            }
-            formItems.SetAt(pItemChild->m_pFormNode, this);
-            retArray.Add(pItemChild->m_pFormNode);
-          }
-        }
-      }
-    }
-    return;
-  }
-  XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
-  if (wsType == FX_WSTRC(L"field")) {
-    eType = XFA_ELEMENT_Field;
-  } else if (wsType == FX_WSTRC(L"draw")) {
-    eType = XFA_ELEMENT_Draw;
-  } else if (wsType == FX_WSTRC(L"subform")) {
-    eType = XFA_ELEMENT_Subform;
-  } else if (wsType == FX_WSTRC(L"area")) {
-    eType = XFA_ELEMENT_Area;
-  }
-  if (eType != XFA_ELEMENT_UNKNOWN) {
-    for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
-         pItem = pItem->m_pNextSibling) {
-      if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
-        if (!bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
-              continue;
-            }
-            if (pItemChild->m_pFormNode->GetClassID() != eType) {
-              continue;
-            }
-            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
-              continue;
-            }
-            formItems.SetAt(pItemChild->m_pFormNode, this);
-            retArray.Add(pItemChild->m_pFormNode);
-          }
-        }
-      } else {
-        if (bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator((CXFA_ContentLayoutItem*)pItem);
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
-              continue;
-            }
-            if (pItemChild->m_pFormNode->GetClassID() != eType) {
-              continue;
-            }
-            if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
-              continue;
-            }
-            formItems.SetAt(pItemChild->m_pFormNode, this);
-            retArray.Add(pItemChild->m_pFormNode);
-          }
-        }
-      }
-    }
-    return;
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageContent(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 3) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageContent");
-    return;
-  }
-  int32_t iIndex = 0;
-  CFX_WideString wsType;
-  FX_BOOL bOnPageArea = FALSE;
-  if (iLength >= 1) {
-    iIndex = pArguments->GetInt32(0);
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsType = pArguments->GetUTF8String(1);
-    wsType = CFX_WideString::FromUTF8(bsType, bsType.GetLength());
-  }
-  if (iLength >= 3) {
-    bOnPageArea = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  CXFA_NodeArray retArray;
-  Script_LayoutPseudoModel_GetObjArray(pDocLayout, iIndex, wsType, bOnPageArea,
-                                       retArray);
-  CXFA_ArrayNodeList* pArrayNodeList = new CXFA_ArrayNodeList(m_pDocument);
-  pArrayNodeList->SetArrayNodeList(retArray);
-  FXJSE_Value_SetObject(pArguments->GetReturnValue(),
-                        (CXFA_Object*)pArrayNodeList,
-                        m_pDocument->GetScriptContext()->GetJseNormalClass());
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCount(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCountInBatch(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t iPageCount = pNotify->GetDocProvider()->AbsPageCountInBatch(hDoc);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageCount);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCountInBatch(
-    CFXJSE_Arguments* pArguments) {
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t iPageCount = pNotify->GetDocProvider()->SheetCountInBatch(hDoc);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageCount);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Relayout(
-    CFXJSE_Arguments* pArguments) {
-  CXFA_Node* pRootNode = m_pDocument->GetRoot();
-  CXFA_Node* pFormRoot = pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form);
-  FXSYS_assert(pFormRoot);
-  CXFA_Node* pContentRootNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
-  CXFA_LayoutProcessor* pLayoutProcessor = m_pDocument->GetLayoutProcessor();
-  if (pContentRootNode) {
-    pLayoutProcessor->AddChangedContainer(pContentRootNode);
-  }
-  pLayoutProcessor->SetForceReLayout(TRUE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageSpan(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_PageSpan(pArguments);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageInBatch(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"absPageInBatch");
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (!pNode) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
-  if (!hWidget) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t iPageCount = pNotify->GetDocProvider()->AbsPageInBatch(hDoc, hWidget);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageCount);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetInBatch(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                            L"sheetInBatch");
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (!pNode) {
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
-  if (!hWidget) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  int32_t iPageCount = pNotify->GetDocProvider()->SheetInBatch(hDoc, hWidget);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, iPageCount);
-  }
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Sheet(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_RelayoutPageArea(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCount(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPage(
-    CFXJSE_Arguments* pArguments) {
-  Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
-}
-void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageImp(
-    CFXJSE_Arguments* pArguments,
-    FX_BOOL bAbsPage) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 1) {
-    const FX_WCHAR* methodName;
-    if (bAbsPage) {
-      methodName = L"absPage";
-    } else {
-      methodName = L"page";
-    }
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
-    return;
-  }
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  int32_t iPage = 0;
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (!pNode && hValue) {
-    FXJSE_Value_SetInteger(hValue, iPage);
-  }
-  IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
-  if (!pDocLayout) {
-    return;
-  }
-  CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
-  if (!pLayoutItem) {
-    FXJSE_Value_SetInteger(hValue, -1);
-    return;
-  }
-  iPage = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, bAbsPage ? iPage : iPage + 1);
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h b/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h
deleted file mode 100644
index 5b0dbb8..0000000
--- a/xfa/src/fxfa/parser/xfa_script_layoutpseudomodel.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
-
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-enum XFA_LAYOUTMODEL_HWXY {
-  XFA_LAYOUTMODEL_H,
-  XFA_LAYOUTMODEL_W,
-  XFA_LAYOUTMODEL_X,
-  XFA_LAYOUTMODEL_Y
-};
-
-class CScript_LayoutPseudoModel : public CXFA_OrdinaryObject {
- public:
-  explicit CScript_LayoutPseudoModel(CXFA_Document* pDocument);
-  ~CScript_LayoutPseudoModel();
-
-  void Script_LayoutPseudoModel_Ready(FXJSE_HVALUE hValue,
-                                      FX_BOOL bSetting,
-                                      XFA_ATTRIBUTE eAttribute);
-
-  void Script_LayoutPseudoModel_HWXY(CFXJSE_Arguments* pArguments,
-                                     XFA_LAYOUTMODEL_HWXY layoutModel);
-  void Script_LayoutPseudoModel_H(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_W(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_X(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_Y(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_NumberedPageCount(CFXJSE_Arguments* pArguments,
-                                                  FX_BOOL bNumbered);
-  void Script_LayoutPseudoModel_PageCount(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_PageSpan(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_Page(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_PageContent(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_AbsPageCount(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_AbsPageCountInBatch(
-      CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_SheetCountInBatch(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_Relayout(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_AbsPageSpan(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_AbsPageInBatch(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_SheetInBatch(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_Sheet(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_RelayoutPageArea(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_SheetCount(CFXJSE_Arguments* pArguments);
-  void Script_LayoutPseudoModel_AbsPage(CFXJSE_Arguments* pArguments);
-
- protected:
-  void Script_LayoutPseudoModel_GetObjArray(IXFA_DocLayout* pDocLayout,
-                                            int32_t iPageNo,
-                                            const CFX_WideString& wsType,
-                                            FX_BOOL bOnPageArea,
-                                            CXFA_NodeArray& retArray);
-  void Script_LayoutPseudoModel_PageImp(CFXJSE_Arguments* pArguments,
-                                        FX_BOOL bAbsPage);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LAYOUTPSEUDOMODEL_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_logpseudomodel.cpp b/xfa/src/fxfa/parser/xfa_script_logpseudomodel.cpp
deleted file mode 100644
index d5ddd81..0000000
--- a/xfa/src/fxfa/parser/xfa_script_logpseudomodel.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_logpseudomodel.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_LogPseudoModel::CScript_LogPseudoModel(CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LogPseudoModel) {
-  m_uScriptHash = XFA_HASHCODE_Log;
-}
-CScript_LogPseudoModel::~CScript_LogPseudoModel() {}
-void CScript_LogPseudoModel::Script_LogPseudoModel_Message(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_LogPseudoModel::Script_LogPseudoModel_TraceEnabled(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_LogPseudoModel::Script_LogPseudoModel_TraceActivate(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_LogPseudoModel::Script_LogPseudoModel_TraceDeactivate(
-    CFXJSE_Arguments* pArguments) {}
-void CScript_LogPseudoModel::Script_LogPseudoModel_Trace(
-    CFXJSE_Arguments* pArguments) {}
diff --git a/xfa/src/fxfa/parser/xfa_script_logpseudomodel.h b/xfa/src/fxfa/parser/xfa_script_logpseudomodel.h
deleted file mode 100644
index ee3d35c..0000000
--- a/xfa/src/fxfa/parser/xfa_script_logpseudomodel.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CScript_LogPseudoModel : public CXFA_OrdinaryObject {
- public:
-  explicit CScript_LogPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_LogPseudoModel();
-
-  void Script_LogPseudoModel_Message(CFXJSE_Arguments* pArguments);
-  void Script_LogPseudoModel_TraceEnabled(CFXJSE_Arguments* pArguments);
-  void Script_LogPseudoModel_TraceActivate(CFXJSE_Arguments* pArguments);
-  void Script_LogPseudoModel_TraceDeactivate(CFXJSE_Arguments* pArguments);
-  void Script_LogPseudoModel_Trace(CFXJSE_Arguments* pArguments);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_LOGPSEUDOMODEL_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_nodehelper.cpp b/xfa/src/fxfa/parser/xfa_script_nodehelper.cpp
deleted file mode 100644
index e2f0475..0000000
--- a/xfa/src/fxfa/parser/xfa_script_nodehelper.cpp
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_nodehelper.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_script_imp.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_NodeHelper::CXFA_NodeHelper(void)
-    : m_eLastCreateType(XFA_ELEMENT_DataValue),
-      m_pCreateParent(NULL),
-      m_iCreateCount(0),
-      m_iCreateFlag(XFA_RESOLVENODE_RSTYPE_CreateNodeOne),
-      m_iCurAllStart(-1),
-      m_pAllStartParent(NULL) {}
-CXFA_NodeHelper::~CXFA_NodeHelper(void) {}
-CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetOneChild(
-    CXFA_Node* parent,
-    const FX_WCHAR* pwsName,
-    FX_BOOL bIsClassName) {
-  if (parent == NULL) {
-    return NULL;
-  }
-  CXFA_NodeArray siblings;
-  uint32_t uNameHash = FX_HashCode_String_GetW(pwsName, FXSYS_wcslen(pwsName));
-  XFA_NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
-  if (siblings.GetSize() == 0) {
-    return NULL;
-  }
-  return siblings[0];
-}
-int32_t CXFA_NodeHelper::XFA_CountSiblings(CXFA_Node* pNode,
-                                           XFA_LOGIC_TYPE eLogicType,
-                                           CXFA_NodeArray* pSiblings,
-                                           FX_BOOL bIsClassName) {
-  if (!pNode)
-    return 0;
-  CXFA_Node* parent =
-      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
-  if (!parent)
-    return 0;
-  const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
-      parent->GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-  if (!pProperty && eLogicType == XFA_LOGIC_Transparent) {
-    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
-    if (parent == NULL) {
-      return 0;
-    }
-  }
-  if (bIsClassName) {
-    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
-                                        pSiblings, eLogicType, bIsClassName);
-  } else {
-    return XFA_NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
-                                        eLogicType, bIsClassName);
-  }
-}
-int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseAnySiblings(
-    CXFA_Node* parent,
-    FX_DWORD dNameHash,
-    CXFA_NodeArray* pSiblings,
-    FX_BOOL bIsClassName) {
-  if (parent == NULL || pSiblings == NULL) {
-    return 0;
-  }
-  int32_t nCount = 0;
-  int32_t i = 0;
-  CXFA_NodeArray properties;
-  parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
-  int32_t nProperties = properties.GetSize();
-  for (i = 0; i < nProperties; ++i) {
-    CXFA_Node* child = properties[i];
-    if (bIsClassName) {
-      if (child->GetClassHashCode() == dNameHash) {
-        pSiblings->Add(child);
-        nCount++;
-      }
-    } else {
-      if (child->GetNameHash() == dNameHash) {
-        pSiblings->Add(child);
-        nCount++;
-      }
-    }
-    if (nCount > 0) {
-      return nCount;
-    }
-    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
-                                              bIsClassName);
-  }
-  CXFA_NodeArray children;
-  parent->GetNodeList(children, XFA_NODEFILTER_Children);
-  int32_t nChildren = children.GetSize();
-  for (i = 0; i < nChildren; i++) {
-    CXFA_Node* child = children[i];
-    if (bIsClassName) {
-      if (child->GetClassHashCode() == dNameHash) {
-        if (pSiblings) {
-          pSiblings->Add(child);
-        }
-        nCount++;
-      }
-    } else {
-      if (child->GetNameHash() == dNameHash) {
-        if (pSiblings) {
-          pSiblings->Add(child);
-        }
-        nCount++;
-      }
-    }
-    if (nCount > 0) {
-      return nCount;
-    }
-    nCount += XFA_NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings,
-                                              bIsClassName);
-  }
-  return nCount;
-}
-int32_t CXFA_NodeHelper::XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
-                                                      FX_DWORD dNameHash,
-                                                      CXFA_NodeArray* pSiblings,
-                                                      XFA_LOGIC_TYPE eLogicType,
-                                                      FX_BOOL bIsClassName,
-                                                      FX_BOOL bIsFindProperty) {
-  if (parent == NULL || pSiblings == NULL) {
-    return 0;
-  }
-  int32_t nCount = 0;
-  int32_t i = 0;
-  if (bIsFindProperty) {
-    CXFA_NodeArray properties;
-    parent->GetNodeList(properties, XFA_NODEFILTER_Properties);
-    int32_t nProperties = properties.GetSize();
-    for (i = 0; i < nProperties; ++i) {
-      CXFA_Node* child = properties[i];
-      if (bIsClassName) {
-        if (child->GetClassHashCode() == dNameHash) {
-          pSiblings->Add(child);
-          nCount++;
-        }
-      } else {
-        if (child->GetNameHash() == dNameHash) {
-          if (child->GetClassID() != XFA_ELEMENT_PageSet &&
-              child->GetClassID() != XFA_ELEMENT_Extras &&
-              child->GetClassID() != XFA_ELEMENT_Items) {
-            pSiblings->Add(child);
-            nCount++;
-          }
-        }
-      }
-      if (child->IsUnnamed() && child->GetClassID() == XFA_ELEMENT_PageSet) {
-        nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
-                                               eLogicType, bIsClassName, FALSE);
-      }
-    }
-    if (nCount > 0) {
-      return nCount;
-    }
-  }
-  CXFA_NodeArray children;
-  parent->GetNodeList(children, XFA_NODEFILTER_Children);
-  int32_t nChildren = children.GetSize();
-  for (i = 0; i < nChildren; i++) {
-    CXFA_Node* child = children[i];
-    if (child->GetClassID() == XFA_ELEMENT_Variables) {
-      continue;
-    }
-    if (bIsClassName) {
-      if (child->GetClassHashCode() == dNameHash) {
-        if (pSiblings) {
-          pSiblings->Add(child);
-        }
-        nCount++;
-      }
-    } else {
-      if (child->GetNameHash() == dNameHash) {
-        if (pSiblings) {
-          pSiblings->Add(child);
-        }
-        nCount++;
-      }
-    }
-    if (eLogicType == XFA_LOGIC_NoTransparent) {
-      continue;
-    }
-    if (XFA_NodeIsTransparent(child) &&
-        child->GetClassID() != XFA_ELEMENT_PageSet) {
-      nCount += XFA_NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
-                                             eLogicType, bIsClassName, FALSE);
-    }
-  }
-  return nCount;
-}
-CXFA_Node* CXFA_NodeHelper::XFA_ResolveNodes_GetParent(
-    CXFA_Node* pNode,
-    XFA_LOGIC_TYPE eLogicType) {
-  if (!pNode) {
-    return NULL;
-  }
-  if (eLogicType == XFA_LOGIC_NoTransparent) {
-    return pNode->GetNodeItem(XFA_NODEITEM_Parent);
-  }
-  CXFA_Node* parent;
-  CXFA_Node* node = pNode;
-  while (TRUE) {
-    parent = XFA_ResolveNodes_GetParent(node);
-    if (parent == NULL) {
-      break;
-    }
-    XFA_ELEMENT parentElement = parent->GetClassID();
-    if ((!parent->IsUnnamed() && parentElement != XFA_ELEMENT_SubformSet) ||
-        parentElement == XFA_ELEMENT_Variables) {
-      break;
-    }
-    node = parent;
-  }
-  return parent;
-}
-int32_t CXFA_NodeHelper::XFA_GetIndex(CXFA_Node* pNode,
-                                      XFA_LOGIC_TYPE eLogicType,
-                                      FX_BOOL bIsProperty,
-                                      FX_BOOL bIsClassIndex) {
-  CXFA_Node* parent =
-      XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
-  if (parent == NULL) {
-    return 0;
-  }
-  if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
-    parent = XFA_ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
-    if (parent == NULL) {
-      return 0;
-    }
-  }
-  FX_DWORD dwHashName = pNode->GetNameHash();
-  if (bIsClassIndex) {
-    dwHashName = pNode->GetClassHashCode();
-  }
-  CXFA_NodeArray siblings;
-  int32_t iSize = XFA_NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
-                                               eLogicType, bIsClassIndex);
-  for (int32_t i = 0; i < iSize; ++i) {
-    CXFA_Node* child = siblings[i];
-    if (child == pNode) {
-      return i;
-    }
-  }
-  return 0;
-}
-void CXFA_NodeHelper::XFA_GetNameExpression(CXFA_Node* refNode,
-                                            CFX_WideString& wsName,
-                                            FX_BOOL bIsAllPath,
-                                            XFA_LOGIC_TYPE eLogicType) {
-  wsName.Empty();
-  if (bIsAllPath) {
-    XFA_GetNameExpression(refNode, wsName, FALSE, eLogicType);
-    CFX_WideString wsParent;
-    CXFA_Node* parent =
-        XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
-    while (parent) {
-      XFA_GetNameExpression(parent, wsParent, FALSE, eLogicType);
-      wsParent += L".";
-      wsParent += wsName;
-      wsName = wsParent;
-      parent = XFA_ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
-    }
-    return;
-  }
-
-  CFX_WideStringC wsTagName;
-  CFX_WideString ws;
-  FX_BOOL bIsProperty = XFA_NodeIsProperty(refNode);
-  if (refNode->IsUnnamed() ||
-      (bIsProperty && refNode->GetClassID() != XFA_ELEMENT_PageSet)) {
-    refNode->GetClassName(wsTagName);
-    ws = wsTagName;
-    wsName.Format(L"#%s[%d]", (const FX_WCHAR*)ws,
-                  XFA_GetIndex(refNode, eLogicType, bIsProperty, TRUE));
-    return;
-  }
-  ws = refNode->GetCData(XFA_ATTRIBUTE_Name);
-  ws.Replace(L".", L"\\.");
-  wsName.Format(L"%s[%d]", (const FX_WCHAR*)ws,
-                XFA_GetIndex(refNode, eLogicType, bIsProperty, FALSE));
-}
-
-FX_BOOL CXFA_NodeHelper::XFA_NodeIsTransparent(CXFA_Node* refNode) {
-  if (refNode == NULL) {
-    return FALSE;
-  }
-  XFA_ELEMENT eRefNode = refNode->GetClassID();
-  if ((refNode->IsUnnamed() && refNode->IsContainerNode()) ||
-      eRefNode == XFA_ELEMENT_SubformSet || eRefNode == XFA_ELEMENT_Area ||
-      eRefNode == XFA_ELEMENT_Proto) {
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_NodeHelper::XFA_CreateNode_ForCondition(
-    CFX_WideString& wsCondition) {
-  int32_t iLen = wsCondition.GetLength();
-  CFX_WideString wsIndex = FX_WSTRC(L"0");
-  FX_BOOL bAll = FALSE;
-
-  if (iLen == 0) {
-    m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
-    return FALSE;
-  }
-  if (wsCondition.GetAt(0) == '[') {
-    int32_t i = 1;
-    for (; i < iLen; ++i) {
-      FX_WCHAR ch = wsCondition[i];
-      if (ch == ' ') {
-        continue;
-      }
-      if (ch == '+' || ch == '-') {
-        break;
-      } else if (ch == '*') {
-        bAll = TRUE;
-        break;
-      } else {
-        break;
-      }
-    }
-    if (bAll) {
-      wsIndex = FX_WSTRC(L"1");
-      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeAll;
-    } else {
-      m_iCreateFlag = XFA_RESOLVENODE_RSTYPE_CreateNodeOne;
-      wsIndex = wsCondition.Mid(i, iLen - 1 - i);
-    }
-    int32_t iIndex = wsIndex.GetInteger();
-    m_iCreateCount = iIndex;
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CXFA_NodeHelper::XFA_ResolveNodes_CreateNode(
-    CFX_WideString wsName,
-    CFX_WideString wsCondition,
-    FX_BOOL bLastNode,
-    CXFA_ScriptContext* pScriptContext) {
-  if (m_pCreateParent == NULL) {
-    return FALSE;
-  }
-  FX_BOOL bIsClassName = FALSE;
-  FX_BOOL bResult = FALSE;
-  if (wsName.GetAt(0) == '!') {
-    wsName = wsName.Right(wsName.GetLength() - 1);
-    m_pCreateParent = ToNode(
-        pScriptContext->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
-  }
-  if (wsName.GetAt(0) == '#') {
-    bIsClassName = TRUE;
-    wsName = wsName.Right(wsName.GetLength() - 1);
-  }
-  if (m_iCreateCount == 0) {
-    XFA_CreateNode_ForCondition(wsCondition);
-  }
-  if (bIsClassName) {
-    const XFA_ELEMENTINFO* lpElement = XFA_GetElementByName(wsName);
-    if (lpElement == NULL) {
-      return FALSE;
-    }
-    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
-      CXFA_Node* pNewNode =
-          m_pCreateParent->CreateSamePacketNode(lpElement->eName);
-      if (pNewNode) {
-        m_pCreateParent->InsertChild(pNewNode);
-        if (iIndex == m_iCreateCount - 1) {
-          m_pCreateParent = pNewNode;
-        }
-        bResult = TRUE;
-      }
-    }
-  } else {
-    XFA_ELEMENT eClassType = XFA_ELEMENT_DataGroup;
-    if (bLastNode) {
-      eClassType = m_eLastCreateType;
-    }
-    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
-      CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
-      if (pNewNode) {
-        pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, wsName);
-        pNewNode->CreateXMLMappingNode();
-        m_pCreateParent->InsertChild(pNewNode);
-        if (iIndex == m_iCreateCount - 1) {
-          m_pCreateParent = pNewNode;
-        }
-        bResult = TRUE;
-      }
-    }
-  }
-  if (!bResult) {
-    m_pCreateParent = NULL;
-  }
-  return bResult;
-}
-void CXFA_NodeHelper::XFA_SetCreateNodeType(CXFA_Node* refNode) {
-  if (refNode == NULL) {
-    return;
-  }
-  if (refNode->GetClassID() == XFA_ELEMENT_Subform) {
-    m_eLastCreateType = XFA_ELEMENT_DataGroup;
-  } else if (refNode->GetClassID() == XFA_ELEMENT_Field) {
-    m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
-                            ? XFA_ELEMENT_DataGroup
-                            : XFA_ELEMENT_DataValue;
-  } else if (refNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
-    m_eLastCreateType = XFA_ELEMENT_DataValue;
-  }
-}
-FX_BOOL CXFA_NodeHelper::XFA_NodeIsProperty(CXFA_Node* refNode) {
-  CXFA_Node* parent =
-      XFA_ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
-  return parent && refNode &&
-         XFA_GetPropertyOfElement(parent->GetClassID(), refNode->GetClassID(),
-                                  XFA_XDPPACKET_UNKNOWN);
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_nodehelper.h b/xfa/src/fxfa/parser/xfa_script_nodehelper.h
deleted file mode 100644
index 318a5a1..0000000
--- a/xfa/src/fxfa/parser/xfa_script_nodehelper.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-class CXFA_ScriptContext;
-
-enum XFA_LOGIC_TYPE {
-  XFA_LOGIC_NoTransparent,
-  XFA_LOGIC_Transparent,
-};
-
-class CXFA_NodeHelper {
- public:
-  CXFA_NodeHelper(void);
-  ~CXFA_NodeHelper(void);
-  CXFA_Node* XFA_ResolveNodes_GetOneChild(CXFA_Node* parent,
-                                          const FX_WCHAR* pwsName,
-                                          FX_BOOL bIsClassName = FALSE);
-  CXFA_Node* XFA_ResolveNodes_GetParent(
-      CXFA_Node* pNode,
-      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);
-
-  int32_t XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
-                                       FX_DWORD dNameHash,
-                                       CXFA_NodeArray* pSiblings,
-                                       XFA_LOGIC_TYPE eLogicType,
-                                       FX_BOOL bIsClassName = FALSE,
-                                       FX_BOOL bIsFindProperty = TRUE);
-  int32_t XFA_NodeAcc_TraverseAnySiblings(CXFA_Node* parent,
-                                          FX_DWORD dNameHash,
-                                          CXFA_NodeArray* pSiblings,
-                                          FX_BOOL bIsClassName = FALSE);
-  int32_t XFA_CountSiblings(CXFA_Node* pNode,
-                            XFA_LOGIC_TYPE eLogicType,
-                            CXFA_NodeArray* pSiblings,
-                            FX_BOOL bIsClassName = FALSE);
-  int32_t XFA_GetIndex(CXFA_Node* pNode,
-                       XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent,
-                       FX_BOOL bIsProperty = FALSE,
-                       FX_BOOL bIsClassIndex = FALSE);
-  void XFA_GetNameExpression(
-      CXFA_Node* refNode,
-      CFX_WideString& wsName,
-      FX_BOOL bIsAllPath,
-      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);
-  FX_BOOL XFA_NodeIsTransparent(CXFA_Node* refNode);
-  FX_BOOL XFA_ResolveNodes_CreateNode(CFX_WideString wsName,
-                                      CFX_WideString wsCondition,
-                                      FX_BOOL bLastNode,
-                                      CXFA_ScriptContext* pScriptContext);
-  FX_BOOL XFA_CreateNode_ForCondition(CFX_WideString& wsCondition);
-  void XFA_SetCreateNodeType(CXFA_Node* refNode);
-  FX_BOOL XFA_NodeIsProperty(CXFA_Node* refNode);
-
- public:
-  XFA_ELEMENT m_eLastCreateType;
-  CXFA_Node* m_pCreateParent;
-  int32_t m_iCreateCount;
-  XFA_RESOVENODE_RSTYPE m_iCreateFlag;
-  int32_t m_iCurAllStart;
-  CXFA_Node* m_pAllStartParent;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_resolveprocessor.cpp b/xfa/src/fxfa/parser/xfa_script_resolveprocessor.cpp
deleted file mode 100644
index 3f4a9c7..0000000
--- a/xfa/src/fxfa/parser/xfa_script_resolveprocessor.cpp
+++ /dev/null
@@ -1,825 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_resolveprocessor.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_script_imp.h"
-#include "xfa/src/fxfa/parser/xfa_script_nodehelper.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CXFA_ResolveProcessor::CXFA_ResolveProcessor(void)
-    : m_pNodeHelper(NULL), m_iCurStart(0) {
-  m_pNodeHelper = new CXFA_NodeHelper;
-}
-CXFA_ResolveProcessor::~CXFA_ResolveProcessor(void) {
-  if (m_pNodeHelper) {
-    delete m_pNodeHelper;
-    m_pNodeHelper = NULL;
-  }
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes(CXFA_ResolveNodesData& rnd) {
-  if (rnd.m_CurNode == NULL) {
-    return -1;
-  }
-  if (!rnd.m_CurNode->IsNode()) {
-    if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) {
-      return XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, rnd.m_wsName);
-    }
-    return 0;
-  }
-  if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild) {
-    return XFA_ResolveNodes_AnyChild(rnd);
-  }
-  FX_WCHAR wch = rnd.m_wsName.GetAt(0);
-  switch (wch) {
-    case '$':
-      return XFA_ResolveNodes_Dollar(rnd);
-    case '!':
-      return XFA_ResolveNodes_Excalmatory(rnd);
-    case '#':
-      return XFA_ResolveNodes_NumberSign(rnd);
-    case '*':
-      return XFA_ResolveNodes_Asterisk(rnd);
-    case '.':
-      return XFA_ResolveNodes_AnyChild(rnd);
-    default:
-      break;
-  }
-  if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) {
-    rnd.m_Nodes.Add(rnd.m_pSC->GetThisObject());
-    return 1;
-  } else if (rnd.m_CurNode->GetClassID() == XFA_ELEMENT_Xfa) {
-    CXFA_Object* pObjNode =
-        rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName);
-    if (pObjNode) {
-      rnd.m_Nodes.Add(pObjNode);
-    } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) {
-      rnd.m_Nodes.Add(rnd.m_CurNode);
-    } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) &&
-               XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd,
-                                               rnd.m_wsName)) {
-      return 1;
-    }
-    if (rnd.m_Nodes.GetSize() > 0) {
-      XFA_ResolveNode_FilterCondition(rnd, rnd.m_wsCondition);
-    }
-    return rnd.m_Nodes.GetSize();
-  }
-  int32_t nRet = XFA_ResolveNodes_Normal(rnd);
-  if (nRet < 1 && rnd.m_uHashName == XFA_HASHCODE_Xfa) {
-    rnd.m_Nodes.Add(rnd.m_pSC->GetDocument()->GetRoot());
-  }
-  return rnd.m_Nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_AnyChild(
-    CXFA_ResolveNodesData& rnd) {
-  CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
-  CFX_WideString wsCondition = rnd.m_wsCondition;
-  CXFA_Node* findNode = NULL;
-  CXFA_NodeArray siblings;
-  FX_BOOL bClassName = FALSE;
-  if (wsName.GetAt(0) == '#') {
-    bClassName = TRUE;
-    wsName = wsName.Right(wsName.GetLength() - 1);
-  }
-  findNode = m_pNodeHelper->XFA_ResolveNodes_GetOneChild(ToNode(rnd.m_CurNode),
-                                                         wsName, bClassName);
-  if (findNode == NULL) {
-    return 0;
-  }
-  if (wsCondition.IsEmpty()) {
-    rnd.m_Nodes.Add(findNode);
-    return rnd.m_Nodes.GetSize();
-  }
-  m_pNodeHelper->XFA_CountSiblings(findNode, XFA_LOGIC_Transparent,
-                                   (CXFA_NodeArray*)&rnd.m_Nodes, bClassName);
-  XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-  return rnd.m_Nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Dollar(
-    CXFA_ResolveNodesData& rnd) {
-  CXFA_ObjArray& nodes = rnd.m_Nodes;
-  CFX_WideString wsName = rnd.m_wsName;
-  CFX_WideString wsCondition = rnd.m_wsCondition;
-  int32_t iNameLen = wsName.GetLength();
-  if (iNameLen == 1) {
-    nodes.Add(rnd.m_CurNode);
-    return 1;
-  }
-  if (rnd.m_nLevel > 0) {
-    return -1;
-  }
-  FX_DWORD dwNameHash =
-      FX_HashCode_String_GetW((const FX_WCHAR*)wsName + 1, iNameLen - 1);
-  if (dwNameHash == XFA_HASHCODE_Xfa) {
-    nodes.Add(rnd.m_pSC->GetDocument()->GetRoot());
-  } else {
-    CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash);
-    if (pObjNode) {
-      rnd.m_Nodes.Add(pObjNode);
-    }
-  }
-  if (rnd.m_Nodes.GetSize() > 0) {
-    XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-  }
-  return rnd.m_Nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Excalmatory(
-    CXFA_ResolveNodesData& rnd) {
-  if (rnd.m_nLevel > 0) {
-    return 0;
-  }
-  CXFA_Node* datasets =
-      ToNode(rnd.m_pSC->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
-  if (!datasets) {
-    return 0;
-  }
-  CXFA_ResolveNodesData rndFind;
-  rndFind.m_pSC = rnd.m_pSC;
-  rndFind.m_CurNode = datasets;
-  rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
-  rndFind.m_uHashName =
-      FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength());
-  rndFind.m_nLevel = rnd.m_nLevel + 1;
-  rndFind.m_dwStyles = XFA_RESOLVENODE_Children;
-  rndFind.m_wsCondition = rnd.m_wsCondition;
-  XFA_ResolveNodes(rndFind);
-  if (rndFind.m_Nodes.GetSize() > 0) {
-    rnd.m_Nodes.Append(rndFind.m_Nodes);
-    rndFind.m_Nodes.RemoveAll();
-  }
-  return rnd.m_Nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_NumberSign(
-    CXFA_ResolveNodesData& rnd) {
-  CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
-  CFX_WideString wsCondition = rnd.m_wsCondition;
-  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
-  if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) {
-    return 1;
-  }
-  CXFA_ResolveNodesData rndFind;
-  rndFind.m_pSC = rnd.m_pSC;
-  rndFind.m_nLevel = rnd.m_nLevel + 1;
-  rndFind.m_dwStyles = rnd.m_dwStyles;
-  rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName;
-  rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes;
-  rndFind.m_wsName = wsName;
-  rndFind.m_uHashName =
-      FX_HashCode_String_GetW(rndFind.m_wsName, rndFind.m_wsName.GetLength());
-  rndFind.m_wsCondition = wsCondition;
-  rndFind.m_CurNode = curNode;
-  XFA_ResolveNodes_Normal(rndFind);
-  if (rndFind.m_Nodes.GetSize() > 0) {
-    if (wsCondition.GetLength() == 0 && rndFind.m_Nodes.Find(curNode) >= 0) {
-      rnd.m_Nodes.Add(curNode);
-    } else {
-      rnd.m_Nodes.Append(rndFind.m_Nodes);
-      rndFind.m_Nodes.RemoveAll();
-    }
-  }
-  return rnd.m_Nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_ForAttributeRs(
-    CXFA_Object* curNode,
-    CXFA_ResolveNodesData& rnd,
-    const CFX_WideStringC& strAttr) {
-  const XFA_SCRIPTATTRIBUTEINFO* lpScriptAttribute =
-      XFA_GetScriptAttributeByName(curNode->GetClassID(), strAttr);
-  if (lpScriptAttribute) {
-    rnd.m_pScriptAttribute = lpScriptAttribute;
-    rnd.m_Nodes.Add(curNode);
-    rnd.m_dwFlag = XFA_RESOVENODE_RSTYPE_Attribute;
-    return 1;
-  }
-  return 0;
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Normal(
-    CXFA_ResolveNodesData& rnd) {
-  if (rnd.m_nLevel > 32) {
-    return 0;
-  }
-  if (!rnd.m_CurNode->IsNode()) {
-    return 0;
-  }
-  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
-  CXFA_ObjArray& nodes = rnd.m_Nodes;
-  int32_t nNum = nodes.GetSize();
-  FX_DWORD dwStyles = rnd.m_dwStyles;
-  CFX_WideString& wsName = rnd.m_wsName;
-  uint32_t uNameHash = rnd.m_uHashName;
-  CFX_WideString& wsCondition = rnd.m_wsCondition;
-  CXFA_ResolveNodesData rndFind;
-  rndFind.m_wsName = rnd.m_wsName;
-  rndFind.m_wsCondition = rnd.m_wsCondition;
-  rndFind.m_pSC = rnd.m_pSC;
-  rndFind.m_nLevel = rnd.m_nLevel + 1;
-  rndFind.m_uHashName = uNameHash;
-  CXFA_NodeArray children;
-  CXFA_NodeArray properties;
-  CXFA_Node* pVariablesNode = NULL;
-  CXFA_Node* pPageSetNode = NULL;
-  CXFA_Node* pChild = curNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-  while (pChild) {
-    if (pChild->GetClassID() == XFA_ELEMENT_Variables) {
-      pVariablesNode = pChild;
-      pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-      continue;
-    } else if (pChild->GetClassID() == XFA_ELEMENT_PageSet) {
-      pPageSetNode = pChild;
-      pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-      continue;
-    } else {
-      const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement(
-          curNode->GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-      if (pPropert) {
-        properties.Add(pChild);
-      } else {
-        children.Add(pChild);
-      }
-    }
-    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
-  }
-  if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) {
-    uint32_t uPropHash = pVariablesNode->GetClassHashCode();
-    if (uPropHash == uNameHash) {
-      nodes.Add(pVariablesNode);
-    } else {
-      rndFind.m_CurNode = pVariablesNode;
-      XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind);
-      CFX_WideString wsSaveCondition = rndFind.m_wsCondition;
-      rndFind.m_wsCondition.Empty();
-      XFA_ResolveNodes_Normal(rndFind);
-      rndFind.m_wsCondition = wsSaveCondition;
-      if (rndFind.m_Nodes.GetSize() > 0) {
-        nodes.Append(rndFind.m_Nodes);
-        rndFind.m_Nodes.RemoveAll();
-      }
-    }
-    if (nodes.GetSize() > nNum) {
-      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-      if (nodes.GetSize() > 0) {
-        return 1;
-      }
-      return 0;
-    }
-  }
-  if (dwStyles & XFA_RESOLVENODE_Children) {
-    FX_BOOL bSetFlag = FALSE;
-    if (pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties)) {
-      children.Add(pPageSetNode);
-    }
-    for (int32_t i = 0; i < children.GetSize(); i++) {
-      CXFA_Node* child = children[i];
-      if (dwStyles & XFA_RESOLVENODE_TagName) {
-        if (child->GetClassHashCode() == uNameHash) {
-          nodes.Add(child);
-        }
-      } else if (child->GetNameHash() == uNameHash) {
-        nodes.Add(child);
-      }
-      if (m_pNodeHelper->XFA_NodeIsTransparent(child) &&
-          child->GetClassID() != XFA_ELEMENT_PageSet) {
-        if (!bSetFlag) {
-          XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind);
-          bSetFlag = TRUE;
-        }
-        rndFind.m_CurNode = child;
-        CFX_WideString wsSaveCondition = rndFind.m_wsCondition;
-        rndFind.m_wsCondition.Empty();
-        XFA_ResolveNodes_Normal(rndFind);
-        rndFind.m_wsCondition = wsSaveCondition;
-        if (rndFind.m_Nodes.GetSize() > 0) {
-          nodes.Append(rndFind.m_Nodes);
-          rndFind.m_Nodes.RemoveAll();
-        }
-      }
-    }
-    if (nodes.GetSize() > nNum) {
-      if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
-        CXFA_NodeArray upArrayNodes;
-        if (m_pNodeHelper->XFA_NodeIsTransparent(ToNode(curNode))) {
-          m_pNodeHelper->XFA_CountSiblings(
-              ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes,
-              !!(dwStyles & XFA_RESOLVENODE_TagName));
-        }
-        if (upArrayNodes.GetSize() > nodes.GetSize()) {
-          upArrayNodes[0] = ToNode(nodes[0]);
-          nodes.RemoveAll();
-          nodes.Append((CXFA_ObjArray&)upArrayNodes);
-          upArrayNodes.RemoveAll();
-        }
-      }
-      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-      if (nodes.GetSize() > 0) {
-        return 1;
-      }
-      return 0;
-    }
-  }
-  if (dwStyles & XFA_RESOLVENODE_Attributes) {
-    if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName)) {
-      return 1;
-    }
-  }
-  if (dwStyles & XFA_RESOLVENODE_Properties) {
-    for (int32_t i = 0; i < properties.GetSize(); i++) {
-      CXFA_Node* childProperty = properties[i];
-      if (childProperty->IsUnnamed()) {
-        uint32_t uPropHash = childProperty->GetClassHashCode();
-        if (uPropHash == uNameHash) {
-          nodes.Add(childProperty);
-        }
-      } else if (childProperty->GetNameHash() == uNameHash &&
-                 childProperty->GetClassID() != XFA_ELEMENT_Extras &&
-                 childProperty->GetClassID() != XFA_ELEMENT_Items) {
-        nodes.Add(childProperty);
-      }
-    }
-    if (nodes.GetSize() > nNum) {
-      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-      if (nodes.GetSize() > 0) {
-        return 1;
-      }
-      return 0;
-    }
-    CXFA_Node* pProp = NULL;
-    if (XFA_ELEMENT_Subform == curNode->GetClassID() &&
-        XFA_HASHCODE_Occur == uNameHash) {
-      CXFA_Node* pInstanceManager =
-          curNode->AsNode()->GetInstanceMgrOfSubform();
-      if (pInstanceManager) {
-        pProp = pInstanceManager->GetProperty(0, XFA_ELEMENT_Occur, TRUE);
-      }
-    } else {
-      const XFA_ELEMENTINFO* pElement = XFA_GetElementByName(wsName);
-      if (pElement) {
-        pProp = curNode->AsNode()->GetProperty(
-            0, pElement->eName, pElement->eName != XFA_ELEMENT_PageSet);
-      }
-    }
-    if (pProp) {
-      nodes.Add(pProp);
-      return nodes.GetSize();
-    }
-  }
-  CXFA_Node* parentNode = m_pNodeHelper->XFA_ResolveNodes_GetParent(
-      curNode->AsNode(), XFA_LOGIC_NoTransparent);
-  uint32_t uCurClassHash = curNode->GetClassHashCode();
-  if (!parentNode) {
-    if (uCurClassHash == uNameHash) {
-      nodes.Add(curNode->AsNode());
-      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-      if (nodes.GetSize() > 0) {
-        return 1;
-      }
-    }
-    return 0;
-  }
-  if (dwStyles & XFA_RESOLVENODE_Siblings) {
-    CXFA_Node* child = parentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
-    FX_DWORD dwSubStyles =
-        XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties;
-    if (dwStyles & XFA_RESOLVENODE_TagName) {
-      dwSubStyles |= XFA_RESOLVENODE_TagName;
-    }
-    if (dwStyles & XFA_RESOLVENODE_ALL) {
-      dwSubStyles |= XFA_RESOLVENODE_ALL;
-    }
-    rndFind.m_dwStyles = dwSubStyles;
-    while (child) {
-      if (child == curNode) {
-        if (dwStyles & XFA_RESOLVENODE_TagName) {
-          if (uCurClassHash == uNameHash) {
-            nodes.Add(curNode);
-          }
-        } else {
-          if (child->GetNameHash() == uNameHash) {
-            nodes.Add(curNode);
-            if (rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) {
-              nodes.RemoveAll();
-              nodes.Add(curNode);
-              return 1;
-            }
-          }
-        }
-        child = child->GetNodeItem(XFA_NODEITEM_NextSibling);
-        continue;
-      }
-      if (dwStyles & XFA_RESOLVENODE_TagName) {
-        if (child->GetClassHashCode() == uNameHash) {
-          nodes.Add(child);
-        }
-      } else if (child->GetNameHash() == uNameHash) {
-        nodes.Add(child);
-      }
-      const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement(
-          parentNode->GetClassID(), child->GetClassID(), XFA_XDPPACKET_UNKNOWN);
-      FX_BOOL bInnerSearch = FALSE;
-      if (pPropert) {
-        if ((child->GetClassID() == XFA_ELEMENT_Variables ||
-             child->GetClassID() == XFA_ELEMENT_PageSet)) {
-          bInnerSearch = TRUE;
-        }
-      } else {
-        if (m_pNodeHelper->XFA_NodeIsTransparent(child)) {
-          bInnerSearch = TRUE;
-        }
-      }
-      if (bInnerSearch) {
-        rndFind.m_CurNode = child;
-        CFX_WideString wsOriginCondition = rndFind.m_wsCondition;
-        rndFind.m_wsCondition.Empty();
-        FX_DWORD dwOriginStyle = rndFind.m_dwStyles;
-        rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL;
-        XFA_ResolveNodes_Normal(rndFind);
-        rndFind.m_dwStyles = dwOriginStyle;
-        rndFind.m_wsCondition = wsOriginCondition;
-        if (rndFind.m_Nodes.GetSize() > 0) {
-          nodes.Append(rndFind.m_Nodes);
-          rndFind.m_Nodes.RemoveAll();
-        }
-      }
-      child = child->GetNodeItem(XFA_NODEITEM_NextSibling);
-    }
-    if (nodes.GetSize() > nNum) {
-      if (m_pNodeHelper->XFA_NodeIsTransparent(parentNode)) {
-        CXFA_NodeArray upArrayNodes;
-        m_pNodeHelper->XFA_CountSiblings(
-            ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes,
-            !!(dwStyles & XFA_RESOLVENODE_TagName));
-        if (upArrayNodes.GetSize() > nodes.GetSize()) {
-          upArrayNodes[0] = ToNode(nodes[0]);
-          nodes.RemoveAll();
-          nodes.Append((CXFA_ObjArray&)upArrayNodes);
-          upArrayNodes.RemoveAll();
-        }
-      }
-      XFA_ResolveNode_FilterCondition(rnd, wsCondition);
-      if (nodes.GetSize() > 0) {
-        return 1;
-      }
-      return 0;
-    }
-  }
-  if (dwStyles & XFA_RESOLVENODE_Parent) {
-    FX_DWORD dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
-                           XFA_RESOLVENODE_Properties;
-    if (dwStyles & XFA_RESOLVENODE_TagName) {
-      dwSubStyles |= XFA_RESOLVENODE_TagName;
-    }
-    if (dwStyles & XFA_RESOLVENODE_ALL) {
-      dwSubStyles |= XFA_RESOLVENODE_ALL;
-    }
-    rndFind.m_dwStyles = dwSubStyles;
-    rndFind.m_CurNode = parentNode;
-    CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray();
-    array.Add(parentNode);
-    XFA_ResolveNodes_Normal(rndFind);
-    if (rndFind.m_Nodes.GetSize() > 0) {
-      nodes.Append(rndFind.m_Nodes);
-      rndFind.m_Nodes.RemoveAll();
-    }
-    if (nodes.GetSize() > nNum) {
-      return 1;
-    }
-  }
-  return 0;
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Asterisk(
-    CXFA_ResolveNodesData& rnd) {
-  CXFA_Node* curNode = ToNode(rnd.m_CurNode);
-  CXFA_ObjArray& nodes = rnd.m_Nodes;
-  CXFA_NodeArray array;
-  curNode->GetNodeList(array,
-                       XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties);
-  nodes.Append((CXFA_ObjArray&)array);
-  return nodes.GetSize();
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_PopStack(
-    CFX_Int32Array& stack) {
-  int32_t nType = -1;
-  int32_t iSize = stack.GetSize() - 1;
-  if (iSize > -1) {
-    nType = stack[iSize];
-    stack.RemoveAt(iSize, 1);
-  }
-  return nType;
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_GetFilter(
-    const CFX_WideStringC& wsExpression,
-    int32_t nStart,
-    CXFA_ResolveNodesData& rnd) {
-  FXSYS_assert(nStart > -1);
-  int32_t iLength = wsExpression.GetLength();
-  if (nStart >= iLength) {
-    return 0;
-  }
-  CFX_WideString& wsName = rnd.m_wsName;
-  CFX_WideString& wsCondition = rnd.m_wsCondition;
-  FX_WCHAR* pNameBuf = wsName.GetBuffer(iLength - nStart);
-  FX_WCHAR* pConditionBuf = wsCondition.GetBuffer(iLength - nStart);
-  int32_t nNameCount = 0;
-  int32_t nConditionCount = 0;
-  CFX_Int32Array stack;
-  int32_t nType = -1;
-  const FX_WCHAR* pSrc = wsExpression.GetPtr();
-  FX_WCHAR wPrev = 0, wCur;
-  FX_BOOL bIsCondition = FALSE;
-  while (nStart < iLength) {
-    wCur = pSrc[nStart++];
-    if (wCur == '.') {
-      if (wPrev == '\\') {
-        pNameBuf[nNameCount - 1] = wPrev = '.';
-        continue;
-      }
-      if (nNameCount == 0) {
-        pNameBuf[nNameCount++] = wCur;
-        continue;
-      }
-      FX_WCHAR wLookahead = nStart < iLength ? pSrc[nStart] : 0;
-      if (wLookahead != '[' && wLookahead != '(') {
-        if (nType < 0) {
-          break;
-        }
-      }
-    }
-    if (wCur == '[' || wCur == '(') {
-      bIsCondition = TRUE;
-    } else if (wCur == '.' && nStart < iLength &&
-               (pSrc[nStart] == '[' || pSrc[nStart] == '(')) {
-      bIsCondition = TRUE;
-    }
-    if (bIsCondition) {
-      pConditionBuf[nConditionCount++] = wCur;
-    } else {
-      pNameBuf[nNameCount++] = wCur;
-    }
-    FX_BOOL bRecursive = TRUE;
-    switch (nType) {
-      case 0:
-        if (wCur == ']') {
-          nType = XFA_ResolveNodes_PopStack(stack);
-          bRecursive = FALSE;
-        }
-        break;
-      case 1:
-        if (wCur == ')') {
-          nType = XFA_ResolveNodes_PopStack(stack);
-          bRecursive = FALSE;
-        }
-        break;
-      case 2:
-        if (wCur == '"') {
-          nType = XFA_ResolveNodes_PopStack(stack);
-          bRecursive = FALSE;
-        }
-        break;
-    }
-    if (bRecursive) {
-      switch (wCur) {
-        case '[':
-          stack.Add(nType);
-          nType = 0;
-          break;
-        case '(':
-          stack.Add(nType);
-          nType = 1;
-          break;
-        case '"':
-          stack.Add(nType);
-          nType = 2;
-          break;
-      }
-    }
-    wPrev = wCur;
-  }
-  if (stack.GetSize() > 0) {
-    return -1;
-  }
-  wsName.ReleaseBuffer(nNameCount);
-  wsName.TrimLeft();
-  wsName.TrimRight();
-  wsCondition.ReleaseBuffer(nConditionCount);
-  wsCondition.TrimLeft();
-  wsCondition.TrimRight();
-  rnd.m_uHashName = FX_HashCode_String_GetW(wsName, wsName.GetLength());
-  return nStart;
-}
-void CXFA_ResolveProcessor::XFA_ResolveNode_ConditionArray(
-    int32_t iCurIndex,
-    CFX_WideString wsCondition,
-    int32_t iFoundCount,
-    CXFA_ResolveNodesData& rnd) {
-  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
-  int32_t iLen = wsCondition.GetLength();
-  FX_BOOL bRelative = FALSE;
-  FX_BOOL bAll = FALSE;
-  int32_t i = 1;
-  for (; i < iLen; ++i) {
-    FX_WCHAR ch = wsCondition[i];
-    if (ch == ' ') {
-      continue;
-    }
-    if (ch == '+' || ch == '-') {
-      bRelative = TRUE;
-      break;
-    } else if (ch == '*') {
-      bAll = TRUE;
-      break;
-    } else {
-      break;
-    }
-  }
-  if (bAll) {
-    if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
-      if (rnd.m_dwStyles & XFA_RESOLVENODE_Bind) {
-        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
-        m_pNodeHelper->m_iCreateCount = 1;
-        findNodes.RemoveAll();
-        m_pNodeHelper->m_iCurAllStart = -1;
-        m_pNodeHelper->m_pAllStartParent = NULL;
-      } else {
-        if (m_pNodeHelper->m_iCurAllStart == -1) {
-          m_pNodeHelper->m_iCurAllStart = m_iCurStart;
-          m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurNode);
-        }
-      }
-    } else if (rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) {
-      if (m_pNodeHelper->m_iCurAllStart == -1) {
-        m_pNodeHelper->m_iCurAllStart = m_iCurStart;
-      }
-    }
-    return;
-  }
-  if (iFoundCount == 1 && !iLen) {
-    return;
-  }
-  CFX_WideString wsIndex;
-  wsIndex = wsCondition.Mid(i, iLen - 1 - i);
-  int32_t iIndex = wsIndex.GetInteger();
-  if (bRelative) {
-    iIndex += iCurIndex;
-  }
-  if (iFoundCount <= iIndex || iIndex < 0) {
-    if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
-      m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
-      m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1;
-    }
-    findNodes.RemoveAll();
-  } else {
-    CXFA_Node* ret = findNodes[iIndex];
-    findNodes.RemoveAll();
-    findNodes.Add(ret);
-  }
-}
-void CXFA_ResolveProcessor::XFA_ResolveNode_DoPredicateFilter(
-    int32_t iCurIndex,
-    CFX_WideString wsCondition,
-    int32_t iFoundCount,
-    CXFA_ResolveNodesData& rnd) {
-  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
-  FXSYS_assert(iFoundCount == findNodes.GetSize());
-  CFX_WideString wsExpression;
-  IXFA_ScriptContext* pContext = NULL;
-  XFA_SCRIPTLANGTYPE eLangType = XFA_SCRIPTLANGTYPE_Unkown;
-  if (wsCondition.Left(2) == FX_WSTRC(L".[") &&
-      wsCondition.Right(1) == FX_WSTRC(L"]")) {
-    eLangType = XFA_SCRIPTLANGTYPE_Formcalc;
-  } else if (wsCondition.Left(2) == FX_WSTRC(L".(") &&
-             wsCondition.Right(1) == FX_WSTRC(L")")) {
-    eLangType = XFA_SCRIPTLANGTYPE_Javascript;
-  } else {
-    return;
-  }
-  pContext = rnd.m_pSC;
-  wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3);
-  for (int32_t i = iFoundCount - 1; i >= 0; i--) {
-    CXFA_Object* node = findNodes[i];
-    FX_BOOL bRet = FALSE;
-    FXJSE_HVALUE pRetValue = FXJSE_Value_Create(rnd.m_pSC->GetRuntime());
-    bRet = pContext->RunScript(eLangType, wsExpression, pRetValue, node);
-    if (!bRet || !FXJSE_Value_ToBoolean(pRetValue)) {
-      findNodes.RemoveAt(i);
-    }
-    FXJSE_Value_Release(pRetValue);
-  }
-}
-
-void CXFA_ResolveProcessor::XFA_ResolveNode_FilterCondition(
-    CXFA_ResolveNodesData& rnd,
-    CFX_WideString wsCondition) {
-  CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes;
-  int32_t iCurrIndex = 0;
-  const CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray();
-  int32_t iSize = array.GetSize();
-  if (iSize) {
-    CXFA_Node* curNode = array[iSize - 1];
-    FX_BOOL bIsProperty = m_pNodeHelper->XFA_NodeIsProperty(curNode);
-    if (curNode->IsUnnamed() ||
-        (bIsProperty && curNode->GetClassID() != XFA_ELEMENT_PageSet)) {
-      iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent,
-                                               bIsProperty, TRUE);
-    } else {
-      iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent,
-                                               bIsProperty, FALSE);
-    }
-  }
-  int32_t iFoundCount = findNodes.GetSize();
-  wsCondition.TrimLeft();
-  wsCondition.TrimRight();
-  int32_t iLen = wsCondition.GetLength();
-  if (!iLen) {
-    if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL) {
-      return;
-    }
-    if (iFoundCount == 1) {
-      return;
-    }
-    if (iFoundCount <= iCurrIndex) {
-      if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
-        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode);
-        m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1;
-      }
-      findNodes.RemoveAll();
-      return;
-    } else {
-      CXFA_Node* ret = findNodes[iCurrIndex];
-      findNodes.RemoveAll();
-      findNodes.Add(ret);
-      return;
-    }
-  }
-  FX_WCHAR wTypeChar = wsCondition[0];
-  switch (wTypeChar) {
-    case '[':
-      XFA_ResolveNode_ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd);
-      return;
-    case '(':
-      return;
-    case '"':
-      return;
-    case '.':
-      if (iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '(')) {
-        XFA_ResolveNode_DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount,
-                                          rnd);
-      }
-    default:
-      return;
-  }
-}
-void CXFA_ResolveProcessor::XFA_ResolveNodes_SetStylesForChild(
-    FX_DWORD dwParentStyles,
-    CXFA_ResolveNodesData& rnd) {
-  FX_DWORD dwSubStyles = XFA_RESOLVENODE_Children;
-  if (dwParentStyles & XFA_RESOLVENODE_TagName) {
-    dwSubStyles |= XFA_RESOLVENODE_TagName;
-  }
-  dwSubStyles &= ~XFA_RESOLVENODE_Parent;
-  dwSubStyles &= ~XFA_RESOLVENODE_Siblings;
-  dwSubStyles &= ~XFA_RESOLVENODE_Properties;
-  dwSubStyles |= XFA_RESOLVENODE_ALL;
-  rnd.m_dwStyles = dwSubStyles;
-}
-int32_t CXFA_ResolveProcessor::XFA_ResolveNode_SetResultCreateNode(
-    XFA_RESOLVENODE_RS& resolveNodeRS,
-    CFX_WideString& wsLastCondition) {
-  if (m_pNodeHelper->m_pCreateParent) {
-    resolveNodeRS.nodes.Add(m_pNodeHelper->m_pCreateParent);
-  } else {
-    m_pNodeHelper->XFA_CreateNode_ForCondition(wsLastCondition);
-  }
-  resolveNodeRS.dwFlags = m_pNodeHelper->m_iCreateFlag;
-  if (resolveNodeRS.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) {
-    if (m_pNodeHelper->m_iCurAllStart != -1) {
-      resolveNodeRS.dwFlags = XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll;
-    }
-  }
-  return resolveNodeRS.nodes.GetSize();
-}
-void CXFA_ResolveProcessor::XFA_ResolveNode_SetIndexDataBind(
-    CFX_WideString& wsNextCondition,
-    int32_t& iIndex,
-    int32_t iCount) {
-  if (m_pNodeHelper->XFA_CreateNode_ForCondition(wsNextCondition)) {
-    if (m_pNodeHelper->m_eLastCreateType == XFA_ELEMENT_DataGroup) {
-      iIndex = 0;
-    } else {
-      iIndex = iCount - 1;
-    }
-  } else {
-    iIndex = iCount - 1;
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_resolveprocessor.h b/xfa/src/fxfa/parser/xfa_script_resolveprocessor.h
deleted file mode 100644
index 36e8939..0000000
--- a/xfa/src/fxfa/parser/xfa_script_resolveprocessor.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
-
-#include "xfa/include/fxfa/fxfa_objectacc.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-class CXFA_NodeHelper;
-class CXFA_ScriptContext;
-
-class CXFA_ResolveNodesData {
- public:
-  CXFA_ResolveNodesData(CXFA_ScriptContext* pSC = NULL)
-      : m_pSC(pSC),
-        m_CurNode(NULL),
-        m_wsName(),
-        m_uHashName(0),
-        m_wsCondition(),
-        m_nLevel(0),
-        m_Nodes(),
-        m_dwStyles(XFA_RESOLVENODE_Children),
-        m_pScriptAttribute(NULL),
-        m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {}
-  ~CXFA_ResolveNodesData() { m_Nodes.RemoveAll(); }
-  CXFA_ScriptContext* m_pSC;
-  CXFA_Object* m_CurNode;
-  CFX_WideString m_wsName;
-  uint32_t m_uHashName;
-  CFX_WideString m_wsCondition;
-  int32_t m_nLevel;
-  CXFA_ObjArray m_Nodes;
-  FX_DWORD m_dwStyles;
-  const XFA_SCRIPTATTRIBUTEINFO* m_pScriptAttribute;
-  XFA_RESOVENODE_RSTYPE m_dwFlag;
-};
-class CXFA_ResolveProcessor {
- public:
-  CXFA_ResolveProcessor(void);
-  ~CXFA_ResolveProcessor(void);
-  int32_t XFA_ResolveNodes(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_AnyChild(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_Dollar(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_Excalmatory(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_NumberSign(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_Asterisk(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_Normal(CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_ForAttributeRs(CXFA_Object* curNode,
-                                          CXFA_ResolveNodesData& rnd,
-                                          const CFX_WideStringC& strAttr);
-  void XFA_ResolveNode_ConditionArray(int32_t iCurIndex,
-                                      CFX_WideString wsCondition,
-                                      int32_t iFoundCount,
-                                      CXFA_ResolveNodesData& rnd);
-  void XFA_ResolveNode_DoPredicateFilter(int32_t iCurIndex,
-                                         CFX_WideString wsCondition,
-                                         int32_t iFoundCount,
-                                         CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNodes_GetFilter(const CFX_WideStringC& wsExpression,
-                                     int32_t nStart,
-                                     CXFA_ResolveNodesData& rnd);
-  void XFA_ResolveNode_FilterCondition(CXFA_ResolveNodesData& rnd,
-                                       CFX_WideString wsCondition);
-  int32_t XFA_ResolveNodes_PopStack(CFX_Int32Array& stack);
-  void XFA_ResolveNodes_SetStylesForChild(FX_DWORD dwParentStyles,
-                                          CXFA_ResolveNodesData& rnd);
-  int32_t XFA_ResolveNode_SetResultCreateNode(XFA_RESOLVENODE_RS& resolveNodeRS,
-                                              CFX_WideString& wsLastCondition);
-  void XFA_ResolveNode_SetIndexDataBind(CFX_WideString& wsNextCondition,
-                                        int32_t& iIndex,
-                                        int32_t iCount);
-  CXFA_NodeHelper* GetNodeHelper() { return m_pNodeHelper; }
-
- private:
-  CXFA_NodeHelper* m_pNodeHelper;
-
- public:
-  int32_t m_iCurStart;
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_RESOLVEPROCESSOR_H_
diff --git a/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.cpp b/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.cpp
deleted file mode 100644
index a721338..0000000
--- a/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h"
-
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-CScript_SignaturePseudoModel::CScript_SignaturePseudoModel(
-    CXFA_Document* pDocument)
-    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_SignaturePseudoModel) {
-  m_uScriptHash = XFA_HASHCODE_Signature;
-}
-CScript_SignaturePseudoModel::~CScript_SignaturePseudoModel() {}
-void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Verify(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 4) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"verify");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CXFA_Node* pNode = NULL;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  int32_t bVerify = pNotify->GetDocProvider()->Verify(hDoc, pNode);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetInteger(hValue, bVerify);
-  }
-}
-void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Sign(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 3 || iLength > 7) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"sign");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CXFA_NodeList* pNodeList = NULL;
-  CFX_WideString wsExpression;
-  CFX_WideString wsXMLIdent;
-  if (iLength >= 1) {
-    pNodeList = (CXFA_NodeList*)pArguments->GetObject(0);
-  }
-  if (iLength >= 2) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(1);
-    wsExpression =
-        CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
-  }
-  if (iLength >= 3) {
-    CFX_ByteString bsXMLIdent = pArguments->GetUTF8String(2);
-    wsXMLIdent = CFX_WideString::FromUTF8(bsXMLIdent, bsXMLIdent.GetLength());
-  }
-  FX_BOOL bSign = pNotify->GetDocProvider()->Sign(hDoc, pNodeList, wsExpression,
-                                                  wsXMLIdent);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, bSign);
-  }
-}
-void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Enumerate(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength != 0) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"enumerate");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CXFA_NodeList* pList = pNotify->GetDocProvider()->Enumerate(hDoc);
-  if (!pList)
-    return;
-  FXJSE_Value_Set(pArguments->GetReturnValue(),
-                  m_pDocument->GetScriptContext()->GetJSValueFromMap(pList));
-}
-void CScript_SignaturePseudoModel::Script_SignaturePseudoModel_Clear(
-    CFXJSE_Arguments* pArguments) {
-  int32_t iLength = pArguments->GetLength();
-  if (iLength < 1 || iLength > 2) {
-    ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clear");
-    return;
-  }
-  IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
-  if (!pNotify) {
-    return;
-  }
-  IXFA_Doc* hDoc = pNotify->GetHDOC();
-  CXFA_Node* pNode = NULL;
-  FX_BOOL bClear = TRUE;
-  if (iLength >= 1) {
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  }
-  if (iLength >= 2) {
-    bClear = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  FX_BOOL bFlag = pNotify->GetDocProvider()->Clear(hDoc, pNode, bClear);
-  FXJSE_HVALUE hValue = pArguments->GetReturnValue();
-  if (hValue) {
-    FXJSE_Value_SetBoolean(hValue, bFlag);
-  }
-}
diff --git a/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h b/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h
deleted file mode 100644
index f7c6497..0000000
--- a/xfa/src/fxfa/parser/xfa_script_signaturepseudomodel.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
-#define XFA_SRC_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
-
-#include "xfa/src/fxfa/parser/xfa_object.h"
-
-class CScript_SignaturePseudoModel : public CXFA_OrdinaryObject {
- public:
-  CScript_SignaturePseudoModel(CXFA_Document* pDocument);
-  ~CScript_SignaturePseudoModel();
-  void Script_SignaturePseudoModel_Verify(CFXJSE_Arguments* pArguments);
-  void Script_SignaturePseudoModel_Sign(CFXJSE_Arguments* pArguments);
-  void Script_SignaturePseudoModel_Enumerate(CFXJSE_Arguments* pArguments);
-  void Script_SignaturePseudoModel_Clear(CFXJSE_Arguments* pArguments);
-};
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_SCRIPT_SIGNATUREPSEUDOMODEL_H_
diff --git a/xfa/src/fxfa/parser/xfa_utils.h b/xfa/src/fxfa/parser/xfa_utils.h
deleted file mode 100644
index 497cb29..0000000
--- a/xfa/src/fxfa/parser/xfa_utils.h
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXFA_PARSER_XFA_UTILS_H_
-#define XFA_SRC_FXFA_PARSER_XFA_UTILS_H_
-
-#include "xfa/include/fxfa/fxfa_basic.h"
-#include "xfa/src/fde/xml/fde_xml.h"
-
-class CXFA_LocaleValue;
-
-FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
-    IFDE_XMLElement* pNode,
-    const CFX_WideStringC& wsQualifier,
-    CFX_WideString& wsNamespaceURI);
-template <class NodeType, class TraverseStrategy>
-class CXFA_NodeIteratorTemplate {
- public:
-  CXFA_NodeIteratorTemplate(NodeType* pRootNode = NULL) : m_pRoot(pRootNode) {
-    if (pRootNode) {
-      m_NodeStack.Push(pRootNode);
-    }
-  }
-  FX_BOOL Init(NodeType* pRootNode) {
-    if (!pRootNode) {
-      return FALSE;
-    }
-    m_pRoot = pRootNode;
-    m_NodeStack.RemoveAll();
-    m_NodeStack.Push(pRootNode);
-    return TRUE;
-  }
-  void Clear() { m_NodeStack.RemoveAll(); }
-  void Reset() {
-    Clear();
-    if (m_pRoot) {
-      m_NodeStack.Push(m_pRoot);
-    }
-  }
-  FX_BOOL SetCurrent(NodeType* pCurNode) {
-    m_NodeStack.RemoveAll();
-    if (pCurNode) {
-      CFX_StackTemplate<NodeType*> revStack;
-      NodeType* pNode;
-      for (pNode = pCurNode; pNode && pNode != m_pRoot;
-           pNode = TraverseStrategy::GetParent(pNode)) {
-        revStack.Push(pNode);
-      }
-      if (!pNode) {
-        return FALSE;
-      }
-      revStack.Push(m_pRoot);
-      while (revStack.GetSize()) {
-        m_NodeStack.Push(*revStack.GetTopElement());
-        revStack.Pop();
-      }
-    }
-    return TRUE;
-  }
-  NodeType* GetCurrent() const {
-    return m_NodeStack.GetSize() ? *m_NodeStack.GetTopElement() : NULL;
-  }
-  NodeType* GetRoot() const { return m_pRoot; }
-  NodeType* MoveToPrev() {
-    int32_t nStackLength = m_NodeStack.GetSize();
-    if (nStackLength == 1) {
-      return NULL;
-    } else if (nStackLength > 1) {
-      NodeType* pCurItem = *m_NodeStack.GetTopElement();
-      m_NodeStack.Pop();
-      NodeType* pParentItem = *m_NodeStack.GetTopElement();
-      NodeType* pParentFirstChildItem =
-          TraverseStrategy::GetFirstChild(pParentItem);
-      if (pCurItem == pParentFirstChildItem) {
-        return pParentItem;
-      }
-      NodeType *pPrevItem = pParentFirstChildItem, *pPrevItemNext = NULL;
-      for (; pPrevItem; pPrevItem = pPrevItemNext) {
-        pPrevItemNext = TraverseStrategy::GetNextSibling(pPrevItem);
-        if (!pPrevItemNext || pPrevItemNext == pCurItem) {
-          break;
-        }
-      }
-      m_NodeStack.Push(pPrevItem);
-    } else {
-      m_NodeStack.RemoveAll();
-      if (m_pRoot) {
-        m_NodeStack.Push(m_pRoot);
-      }
-    }
-    if (m_NodeStack.GetSize() > 0) {
-      NodeType* pChildItem = *m_NodeStack.GetTopElement();
-      while ((pChildItem = TraverseStrategy::GetFirstChild(pChildItem)) !=
-             NULL) {
-        while (NodeType* pNextItem =
-                   TraverseStrategy::GetNextSibling(pChildItem)) {
-          pChildItem = pNextItem;
-        }
-        m_NodeStack.Push(pChildItem);
-      }
-      return *m_NodeStack.GetTopElement();
-    }
-    return NULL;
-  }
-  NodeType* MoveToNext() {
-    NodeType** ppNode = NULL;
-    NodeType* pCurrent = GetCurrent();
-    while (m_NodeStack.GetSize() > 0) {
-      while ((ppNode = m_NodeStack.GetTopElement())) {
-        if (pCurrent != *ppNode) {
-          return *ppNode;
-        }
-        NodeType* pChild = TraverseStrategy::GetFirstChild(*ppNode);
-        if (pChild == NULL) {
-          break;
-        }
-        m_NodeStack.Push(pChild);
-      }
-      while ((ppNode = m_NodeStack.GetTopElement())) {
-        NodeType* pNext = TraverseStrategy::GetNextSibling(*ppNode);
-        m_NodeStack.Pop();
-        if (m_NodeStack.GetSize() == 0) {
-          break;
-        }
-        if (pNext) {
-          m_NodeStack.Push(pNext);
-          break;
-        }
-      }
-    }
-    return NULL;
-  }
-  NodeType* SkipChildrenAndMoveToNext() {
-    NodeType** ppNode = NULL;
-    while ((ppNode = m_NodeStack.GetTopElement())) {
-      NodeType* pNext = TraverseStrategy::GetNextSibling(*ppNode);
-      m_NodeStack.Pop();
-      if (m_NodeStack.GetSize() == 0) {
-        break;
-      }
-      if (pNext) {
-        m_NodeStack.Push(pNext);
-        break;
-      }
-    }
-    return GetCurrent();
-  }
-
- protected:
-  NodeType* m_pRoot;
-  CFX_StackTemplate<NodeType*> m_NodeStack;
-};
-template <class KeyType>
-class CXFA_PtrSetTemplate : private CFX_MapPtrToPtr {
- public:
-  CXFA_PtrSetTemplate() : CFX_MapPtrToPtr(10) {}
-
-  int GetCount() const { return CFX_MapPtrToPtr::GetCount(); }
-
-  FX_BOOL IsEmpty() const { return CFX_MapPtrToPtr::IsEmpty(); }
-
-  FX_BOOL Lookup(KeyType key) const {
-    void* pValue = NULL;
-    return CFX_MapPtrToPtr::Lookup((void*)key, pValue);
-  }
-
-  FX_BOOL operator[](KeyType key) { return Lookup(key); }
-
-  void Add(KeyType key) { CFX_MapPtrToPtr::SetAt((void*)key, (void*)key); }
-
-  FX_BOOL RemoveKey(KeyType key) {
-    return CFX_MapPtrToPtr::RemoveKey((void*)key);
-  }
-
-  void RemoveAll() { CFX_MapPtrToPtr::RemoveAll(); }
-
-  FX_POSITION GetStartPosition() const {
-    return CFX_MapPtrToPtr::GetStartPosition();
-  }
-
-  void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey) const {
-    void* pKey = NULL;
-    void* pValue = NULL;
-    CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);
-    rKey = (KeyType)(uintptr_t)pKey;
-  }
-};
-class CXFA_Node;
-class CXFA_WidgetData;
-
-CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType);
-CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData);
-CFX_WideString XFA_NumericLimit(const CFX_WideString& wsValue,
-                                int32_t iLead,
-                                int32_t iTread);
-FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString& wsStringVal);
-FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal);
-int32_t XFA_MapRotation(int32_t nRotation);
-
-FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode);
-void XFA_GetPlainTextFromRichText(IFDE_XMLNode* pXMLNode,
-                                  CFX_WideString& wsPlainText);
-FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode);
-IFX_Stream* XFA_CreateWideTextRead(const CFX_WideString& wsBuffer);
-FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement,
-                            FX_BOOL bLayoutContainer = FALSE);
-FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence);
-FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout);
-FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout);
-void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode);
-void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode,
-                                         IFX_Stream* pStream,
-                                         const FX_CHAR* pChecksum = NULL,
-                                         FX_BOOL bSaveXML = FALSE);
-
-#endif  // XFA_SRC_FXFA_PARSER_XFA_UTILS_H_
diff --git a/xfa/src/fxfa/parser/xfa_utils_imp.cpp b/xfa/src/fxfa/parser/xfa_utils_imp.cpp
deleted file mode 100644
index 32f5ce1..0000000
--- a/xfa/src/fxfa/parser/xfa_utils_imp.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-#include "core/include/fxcrt/fx_ext.h"
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h"
-#include "xfa/src/fxfa/parser/xfa_docdata.h"
-#include "xfa/src/fxfa/parser/xfa_doclayout.h"
-#include "xfa/src/fxfa/parser/xfa_document.h"
-#include "xfa/src/fxfa/parser/xfa_localemgr.h"
-#include "xfa/src/fxfa/parser/xfa_localevalue.h"
-#include "xfa/src/fxfa/parser/xfa_object.h"
-#include "xfa/src/fxfa/parser/xfa_parser.h"
-#include "xfa/src/fxfa/parser/xfa_script.h"
-
-CXFA_Node* XFA_CreateUIChild(CXFA_Node* pNode, XFA_ELEMENT& eWidgetType) {
-  XFA_ELEMENT eType = pNode->GetClassID();
-  eWidgetType = eType;
-  if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_Draw) {
-    return NULL;
-  }
-  eWidgetType = XFA_ELEMENT_UNKNOWN;
-  XFA_ELEMENT eUIType = XFA_ELEMENT_UNKNOWN;
-  CXFA_Value defValue(pNode->GetProperty(0, XFA_ELEMENT_Value, TRUE));
-  XFA_ELEMENT eValueType = (XFA_ELEMENT)defValue.GetChildValueClassID();
-  switch (eValueType) {
-    case XFA_ELEMENT_Boolean:
-      eUIType = XFA_ELEMENT_CheckButton;
-      break;
-    case XFA_ELEMENT_Integer:
-    case XFA_ELEMENT_Decimal:
-    case XFA_ELEMENT_Float:
-      eUIType = XFA_ELEMENT_NumericEdit;
-      break;
-    case XFA_ELEMENT_ExData:
-    case XFA_ELEMENT_Text:
-      eUIType = XFA_ELEMENT_TextEdit;
-      eWidgetType = XFA_ELEMENT_Text;
-      break;
-    case XFA_ELEMENT_Date:
-    case XFA_ELEMENT_Time:
-    case XFA_ELEMENT_DateTime:
-      eUIType = XFA_ELEMENT_DateTimeEdit;
-      break;
-    case XFA_ELEMENT_Image:
-      eUIType = XFA_ELEMENT_ImageEdit;
-      eWidgetType = XFA_ELEMENT_Image;
-      break;
-    case XFA_ELEMENT_Arc:
-    case XFA_ELEMENT_Line:
-    case XFA_ELEMENT_Rectangle:
-      eUIType = XFA_ELEMENT_DefaultUi;
-      eWidgetType = eValueType;
-      break;
-    default:
-      break;
-  }
-  CXFA_Node* pUIChild = NULL;
-  CXFA_Node* pUI = pNode->GetProperty(0, XFA_ELEMENT_Ui, TRUE);
-  CXFA_Node* pChild = pUI->GetNodeItem(XFA_NODEITEM_FirstChild);
-  for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
-    XFA_ELEMENT eChild = pChild->GetClassID();
-    if (eChild == XFA_ELEMENT_Extras || eChild == XFA_ELEMENT_Picture) {
-      continue;
-    }
-    const XFA_PROPERTY* pProperty =
-        XFA_GetPropertyOfElement(XFA_ELEMENT_Ui, eChild, XFA_XDPPACKET_Form);
-    if (pProperty && (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
-      pUIChild = pChild;
-      break;
-    }
-  }
-  if (eType == XFA_ELEMENT_Draw) {
-    XFA_ELEMENT eDraw = pUIChild ? pUIChild->GetClassID() : XFA_ELEMENT_UNKNOWN;
-    switch (eDraw) {
-      case XFA_ELEMENT_TextEdit:
-        eWidgetType = XFA_ELEMENT_Text;
-        break;
-      case XFA_ELEMENT_ImageEdit:
-        eWidgetType = XFA_ELEMENT_Image;
-        break;
-      default:
-        eWidgetType =
-            eWidgetType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_Text : eWidgetType;
-        break;
-    }
-  } else {
-    if (pUIChild && pUIChild->GetClassID() == XFA_ELEMENT_DefaultUi) {
-      eWidgetType = XFA_ELEMENT_TextEdit;
-    } else {
-      eWidgetType = pUIChild
-                        ? pUIChild->GetClassID()
-                        : (eUIType == XFA_ELEMENT_UNKNOWN ? XFA_ELEMENT_TextEdit
-                                                          : eUIType);
-    }
-  }
-  if (!pUIChild) {
-    if (eUIType == XFA_ELEMENT_UNKNOWN) {
-      eUIType = XFA_ELEMENT_TextEdit;
-      defValue.GetNode()->GetProperty(0, XFA_ELEMENT_Text, TRUE);
-    }
-    pUIChild = pUI->GetProperty(0, eUIType, TRUE);
-  } else if (eUIType == XFA_ELEMENT_UNKNOWN) {
-    switch (pUIChild->GetClassID()) {
-      case XFA_ELEMENT_CheckButton: {
-        eValueType = XFA_ELEMENT_Text;
-        if (CXFA_Node* pItems = pNode->GetChild(0, XFA_ELEMENT_Items)) {
-          if (CXFA_Node* pItem = pItems->GetChild(0, XFA_ELEMENT_UNKNOWN)) {
-            eValueType = pItem->GetClassID();
-          }
-        }
-      } break;
-      case XFA_ELEMENT_DateTimeEdit:
-        eValueType = XFA_ELEMENT_DateTime;
-        break;
-      case XFA_ELEMENT_ImageEdit:
-        eValueType = XFA_ELEMENT_Image;
-        break;
-      case XFA_ELEMENT_NumericEdit:
-        eValueType = XFA_ELEMENT_Float;
-        break;
-      case XFA_ELEMENT_ChoiceList: {
-        eValueType = (pUIChild->GetEnum(XFA_ATTRIBUTE_Open) ==
-                      XFA_ATTRIBUTEENUM_MultiSelect)
-                         ? XFA_ELEMENT_ExData
-                         : XFA_ELEMENT_Text;
-      } break;
-      case XFA_ELEMENT_Barcode:
-      case XFA_ELEMENT_Button:
-      case XFA_ELEMENT_PasswordEdit:
-      case XFA_ELEMENT_Signature:
-      case XFA_ELEMENT_TextEdit:
-      default:
-        eValueType = XFA_ELEMENT_Text;
-        break;
-    }
-    defValue.GetNode()->GetProperty(0, eValueType, TRUE);
-  }
-  return pUIChild;
-}
-CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData) {
-  CXFA_Node* pNodeValue =
-      pWidgetData->GetNode()->GetChild(0, XFA_ELEMENT_Value);
-  if (!pNodeValue) {
-    return CXFA_LocaleValue();
-  }
-  CXFA_Node* pValueChild = pNodeValue->GetNodeItem(XFA_NODEITEM_FirstChild);
-  if (!pValueChild) {
-    return CXFA_LocaleValue();
-  }
-  int32_t iVTType = XFA_VT_NULL;
-  XFA_ELEMENT eType = pValueChild->GetClassID();
-  switch (eType) {
-    case XFA_ELEMENT_Decimal:
-      iVTType = XFA_VT_DECIMAL;
-      break;
-    case XFA_ELEMENT_Float:
-      iVTType = XFA_VT_FLOAT;
-      break;
-    case XFA_ELEMENT_Date:
-      iVTType = XFA_VT_DATE;
-      break;
-    case XFA_ELEMENT_Time:
-      iVTType = XFA_VT_TIME;
-      break;
-    case XFA_ELEMENT_DateTime:
-      iVTType = XFA_VT_DATETIME;
-      break;
-    case XFA_ELEMENT_Boolean:
-      iVTType = XFA_VT_BOOLEAN;
-      break;
-    case XFA_ELEMENT_Integer:
-      iVTType = XFA_VT_INTEGER;
-      break;
-    case XFA_ELEMENT_Text:
-      iVTType = XFA_VT_TEXT;
-      break;
-    default:
-      iVTType = XFA_VT_NULL;
-      break;
-  }
-  return CXFA_LocaleValue(iVTType, pWidgetData->GetRawValue(),
-                          pWidgetData->GetNode()->GetDocument()->GetLocalMgr());
-}
-void XFA_GetPlainTextFromRichText(IFDE_XMLNode* pXMLNode,
-                                  CFX_WideString& wsPlainText) {
-  if (pXMLNode == NULL) {
-    return;
-  }
-  switch (pXMLNode->GetType()) {
-    case FDE_XMLNODE_Element: {
-      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
-      CFX_WideString wsTag;
-      pXMLElement->GetLocalTagName(wsTag);
-      uint32_t uTag = FX_HashCode_String_GetW(wsTag, wsTag.GetLength(), TRUE);
-      if (uTag == 0x0001f714) {
-        wsPlainText += L"\n";
-      } else if (uTag == 0x00000070) {
-        if (!wsPlainText.IsEmpty()) {
-          wsPlainText += L"\n";
-        }
-      } else if (uTag == 0xa48ac63) {
-        if (!wsPlainText.IsEmpty() &&
-            wsPlainText[wsPlainText.GetLength() - 1] != '\n') {
-          wsPlainText += L"\n";
-        }
-      }
-    } break;
-    case FDE_XMLNODE_Text: {
-      CFX_WideString wsContent;
-      ((IFDE_XMLText*)pXMLNode)->GetText(wsContent);
-      wsPlainText += wsContent;
-    } break;
-    case FDE_XMLNODE_CharData: {
-      CFX_WideString wsCharData;
-      ((IFDE_XMLCharData*)pXMLNode)->GetCharData(wsCharData);
-      wsPlainText += wsCharData;
-    } break;
-    default:
-      break;
-  }
-  for (IFDE_XMLNode* pChildXML =
-           pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
-       pChildXML;
-       pChildXML = pChildXML->GetNodeItem(IFDE_XMLNode::NextSibling)) {
-    XFA_GetPlainTextFromRichText(pChildXML, wsPlainText);
-  }
-}
-FX_BOOL XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode) {
-  FX_BOOL bRet = FALSE;
-  if (!pFieldNode) {
-    return bRet;
-  }
-  CXFA_Node* pUIChild = pFieldNode->GetChild(0, XFA_ELEMENT_Ui);
-  if (pUIChild) {
-    CXFA_Node* pFirstChild = pUIChild->GetNodeItem(XFA_NODEITEM_FirstChild);
-    if (pFirstChild && pFirstChild->GetClassID() == XFA_ELEMENT_ChoiceList) {
-      bRet = pFirstChild->GetEnum(XFA_ATTRIBUTE_Open) ==
-             XFA_ATTRIBUTEENUM_MultiSelect;
-    }
-  }
-  return bRet;
-}
-FX_BOOL XFA_IsLayoutElement(XFA_ELEMENT eElement, FX_BOOL bLayoutContainer) {
-  switch (eElement) {
-    case XFA_ELEMENT_Draw:
-    case XFA_ELEMENT_Field:
-    case XFA_ELEMENT_InstanceManager:
-      return !bLayoutContainer;
-    case XFA_ELEMENT_Area:
-    case XFA_ELEMENT_Subform:
-    case XFA_ELEMENT_ExclGroup:
-    case XFA_ELEMENT_SubformSet:
-      return TRUE;
-    case XFA_ELEMENT_PageArea:
-    case XFA_ELEMENT_Form:
-      return TRUE;
-    default:
-      return FALSE;
-  }
-  return FALSE;
-}
-FX_BOOL XFA_IsTakingupSpace(XFA_ATTRIBUTEENUM ePresence) {
-  switch (ePresence) {
-    case XFA_ATTRIBUTEENUM_Visible:
-    case XFA_ATTRIBUTEENUM_Invisible:
-      return TRUE;
-    default:
-      return FALSE;
-  }
-  return FALSE;
-}
-FX_BOOL XFA_IsFlowingLayout(XFA_ATTRIBUTEENUM eLayout) {
-  switch (eLayout) {
-    case XFA_ATTRIBUTEENUM_Tb:
-    case XFA_ATTRIBUTEENUM_Lr_tb:
-    case XFA_ATTRIBUTEENUM_Rl_tb:
-      return TRUE;
-    default:
-      return FALSE;
-  }
-  return FALSE;
-}
-FX_BOOL XFA_IsHorizontalFlow(XFA_ATTRIBUTEENUM eLayout) {
-  switch (eLayout) {
-    case XFA_ATTRIBUTEENUM_Lr_tb:
-    case XFA_ATTRIBUTEENUM_Rl_tb:
-      return TRUE;
-    default:
-      return FALSE;
-  }
-  return FALSE;
-}
-static const FX_DOUBLE fraction_scales[] = {0.1,
-                                            0.01,
-                                            0.001,
-                                            0.0001,
-                                            0.00001,
-                                            0.000001,
-                                            0.0000001,
-                                            0.00000001,
-                                            0.000000001,
-                                            0.0000000001,
-                                            0.00000000001,
-                                            0.000000000001,
-                                            0.0000000000001,
-                                            0.00000000000001,
-                                            0.000000000000001,
-                                            0.0000000000000001};
-FX_DOUBLE XFA_WideStringToDouble(const CFX_WideString& wsStringVal) {
-  CFX_WideString wsValue = wsStringVal;
-  wsValue.TrimLeft();
-  wsValue.TrimRight();
-  int64_t nIntegral = 0;
-  FX_DWORD dwFractional = 0;
-  int32_t nExponent = 0;
-  int32_t cc = 0;
-  FX_BOOL bNegative = FALSE, bExpSign = FALSE;
-  const FX_WCHAR* str = (const FX_WCHAR*)wsValue;
-  int32_t len = wsValue.GetLength();
-  if (str[0] == '+') {
-    cc++;
-  } else if (str[0] == '-') {
-    bNegative = TRUE;
-    cc++;
-  }
-  int32_t nIntegralLen = 0;
-  while (cc < len) {
-    if (str[cc] == '.' || str[cc] == 'E' || str[cc] == 'e' ||
-        nIntegralLen > 17) {
-      break;
-    }
-    if (!XFA_IsDigit(str[cc])) {
-      return 0;
-    }
-    nIntegral = nIntegral * 10 + str[cc] - '0';
-    cc++;
-    nIntegralLen++;
-  }
-  nIntegral = bNegative ? -nIntegral : nIntegral;
-  int32_t scale = 0;
-  FX_DOUBLE fraction = 0.0;
-  if (cc < len && str[cc] == '.') {
-    cc++;
-    while (cc < len) {
-      fraction += fraction_scales[scale] * (str[cc] - '0');
-      scale++;
-      cc++;
-      if (cc == len) {
-        break;
-      }
-      if (scale == sizeof(fraction_scales) / sizeof(FX_DOUBLE) ||
-          str[cc] == 'E' || str[cc] == 'e') {
-        break;
-      }
-      if (!XFA_IsDigit(str[cc])) {
-        return 0;
-      }
-    }
-    dwFractional = (FX_DWORD)(fraction * 4294967296.0);
-  }
-  if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
-    cc++;
-    if (cc < len) {
-      if (str[cc] == '+') {
-        cc++;
-      } else if (str[cc] == '-') {
-        bExpSign = TRUE;
-        cc++;
-      }
-    }
-    while (cc < len) {
-      if (str[cc] == '.' || !XFA_IsDigit(str[cc])) {
-        return 0;
-      }
-      nExponent = nExponent * 10 + str[cc] - '0';
-      cc++;
-    }
-    nExponent = bExpSign ? -nExponent : nExponent;
-  }
-  FX_DOUBLE dValue = (dwFractional / 4294967296.0);
-  dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue);
-  if (nExponent != 0) {
-    dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
-  }
-  return dValue;
-}
-
-FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal) {
-  CFX_WideString wsValue =
-      CFX_WideString::FromUTF8(szStringVal.GetCStr(), szStringVal.GetLength());
-  return XFA_WideStringToDouble(wsValue);
-}
-
-int32_t XFA_MapRotation(int32_t nRotation) {
-  nRotation = nRotation % 360;
-  nRotation = nRotation < 0 ? nRotation + 360 : nRotation;
-  return nRotation;
-}
diff --git a/xfa/src/fxfa/parser/xfa_utils_imp_unittest.cpp b/xfa/src/fxfa/parser/xfa_utils_imp_unittest.cpp
deleted file mode 100644
index d5f0e4a..0000000
--- a/xfa/src/fxfa/parser/xfa_utils_imp_unittest.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "xfa/src/fxfa/parser/xfa_utils.h"
-
-TEST(XfaUtilsImp, XFA_MapRotation) {
-  struct TestCase {
-    int input;
-    int expected_output;
-  } TestCases[] = {{-1000000, 80}, {-361, 359}, {-360, 0},  {-359, 1},
-                   {-91, 269},     {-90, 270},  {-89, 271}, {-1, 359},
-                   {0, 0},         {1, 1},      {89, 89},   {90, 90},
-                   {91, 91},       {359, 359},  {360, 0},   {361, 1},
-                   {100000, 280}};
-
-  for (size_t i = 0; i < FX_ArraySize(TestCases); ++i) {
-    EXPECT_EQ(TestCases[i].expected_output,
-              XFA_MapRotation(TestCases[i].input));
-  }
-}
diff --git a/xfa/src/fxgraphics/fx_graphics.cpp b/xfa/src/fxgraphics/fx_graphics.cpp
deleted file mode 100644
index 249c72e..0000000
--- a/xfa/src/fxgraphics/fx_graphics.cpp
+++ /dev/null
@@ -1,1548 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/include/fxgraphics/fx_graphics.h"
-
-#include <memory>
-
-#include "xfa/src/fxgraphics/fx_path_generator.h"
-#include "xfa/src/fxgraphics/pre.h"
-
-class CAGG_Graphics {
- public:
-  CAGG_Graphics();
-  FX_ERR Create(CFX_Graphics* owner,
-                int32_t width,
-                int32_t height,
-                FXDIB_Format format);
-  virtual ~CAGG_Graphics();
-
- private:
-  CFX_Graphics* _owner;
-};
-CFX_Graphics::CFX_Graphics() {
-  _type = FX_CONTEXT_None;
-  _info._graphState.SetDashCount(0);
-  _info._isAntialiasing = TRUE;
-  _info._strokeAlignment = FX_STROKEALIGNMENT_Center;
-  _info._CTM.SetIdentity();
-  _info._isActOnDash = FALSE;
-  _info._strokeColor = NULL;
-  _info._fillColor = NULL;
-  _info._font = NULL;
-  _info._fontSize = 40.0;
-  _info._fontHScale = 1.0;
-  _info._fontSpacing = 0.0;
-  _renderDevice = NULL;
-  _aggGraphics = NULL;
-}
-FX_ERR CFX_Graphics::Create(CFX_RenderDevice* renderDevice,
-                            FX_BOOL isAntialiasing) {
-  if (!renderDevice)
-    return FX_ERR_Parameter_Invalid;
-  if (_type != FX_CONTEXT_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_CONTEXT_Device;
-  _info._isAntialiasing = isAntialiasing;
-  _renderDevice = renderDevice;
-  if (_renderDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP) {
-    return FX_ERR_Succeeded;
-  }
-  return FX_ERR_Indefinite;
-}
-FX_ERR CFX_Graphics::Create(int32_t width,
-                            int32_t height,
-                            FXDIB_Format format,
-                            FX_BOOL isNative,
-                            FX_BOOL isAntialiasing) {
-  if (_type != FX_CONTEXT_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_CONTEXT_Device;
-  _info._isAntialiasing = isAntialiasing;
-  {
-    _aggGraphics = new CAGG_Graphics;
-    return _aggGraphics->Create(this, width, height, format);
-  }
-}
-CFX_Graphics::~CFX_Graphics() {
-  if (_aggGraphics) {
-    delete _aggGraphics;
-    _aggGraphics = NULL;
-  }
-  _renderDevice = NULL;
-  _info._graphState.SetDashCount(0);
-  _type = FX_CONTEXT_None;
-}
-FX_ERR CFX_Graphics::GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      capVal = _renderDevice->GetDeviceCaps(capID);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::IsPrinterDevice(FX_BOOL& isPrinter) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      int32_t deviceClass = _renderDevice->GetDeviceClass();
-      if (deviceClass == FXDC_PRINTER) {
-        isPrinter = TRUE;
-      } else {
-        isPrinter = FALSE;
-      }
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::EnableAntialiasing(FX_BOOL isAntialiasing) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._isAntialiasing = isAntialiasing;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SaveGraphState() {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _renderDevice->SaveState();
-      TInfo* info = new TInfo;
-      info->_graphState.Copy(_info._graphState);
-      info->_isAntialiasing = _info._isAntialiasing;
-      info->_strokeAlignment = _info._strokeAlignment;
-      info->_CTM = _info._CTM;
-      info->_isActOnDash = _info._isActOnDash;
-      info->_strokeColor = _info._strokeColor;
-      info->_fillColor = _info._fillColor;
-      info->_font = _info._font;
-      info->_fontSize = _info._fontSize;
-      info->_fontHScale = _info._fontHScale;
-      info->_fontSpacing = _info._fontSpacing;
-      _infoStack.Add(info);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::RestoreGraphState() {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _renderDevice->RestoreState();
-      int32_t size = _infoStack.GetSize();
-      if (size <= 0) {
-        return FX_ERR_Intermediate_Value_Invalid;
-      }
-      int32_t topIndex = size - 1;
-      TInfo* info = (TInfo*)_infoStack.GetAt(topIndex);
-      if (!info)
-        return FX_ERR_Intermediate_Value_Invalid;
-      _info._graphState.Copy(info->_graphState);
-      _info._isAntialiasing = info->_isAntialiasing;
-      _info._strokeAlignment = info->_strokeAlignment;
-      _info._CTM = info->_CTM;
-      _info._isActOnDash = info->_isActOnDash;
-      _info._strokeColor = info->_strokeColor;
-      _info._fillColor = info->_fillColor;
-      _info._font = info->_font;
-      _info._fontSize = info->_fontSize;
-      _info._fontHScale = info->_fontHScale;
-      _info._fontSpacing = info->_fontSpacing;
-      delete info;
-      info = NULL;
-      _infoStack.RemoveAt(topIndex);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetLineCap(CFX_GraphStateData::LineCap& lineCap) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      lineCap = _info._graphState.m_LineCap;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetLineCap(CFX_GraphStateData::LineCap lineCap) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._graphState.m_LineCap = lineCap;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetDashCount(int32_t& dashCount) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      dashCount = _info._graphState.m_DashCount;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray) {
-  if (!dashArray)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      dashPhase = _info._graphState.m_DashPhase;
-      FXSYS_memcpy(dashArray, _info._graphState.m_DashArray,
-                   _info._graphState.m_DashCount * sizeof(FX_FLOAT));
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetLineDash(FX_FLOAT dashPhase,
-                                 FX_FLOAT* dashArray,
-                                 int32_t dashCount) {
-  if (dashCount > 0 && !dashArray) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  dashCount = dashCount < 0 ? 0 : dashCount;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      FX_FLOAT scale = 1.0;
-      if (_info._isActOnDash) {
-        scale = _info._graphState.m_LineWidth;
-      }
-      _info._graphState.m_DashPhase = dashPhase;
-      _info._graphState.SetDashCount(dashCount);
-      for (int32_t i = 0; i < dashCount; i++) {
-        _info._graphState.m_DashArray[i] = dashArray[i] * scale;
-      }
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetLineDash(FX_DashStyle dashStyle) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceSetLineDash(dashStyle);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      lineJoin = _info._graphState.m_LineJoin;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetLineJoin(CFX_GraphStateData::LineJoin lineJoin) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._graphState.m_LineJoin = lineJoin;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetMiterLimit(FX_FLOAT& miterLimit) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      miterLimit = _info._graphState.m_MiterLimit;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetMiterLimit(FX_FLOAT miterLimit) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._graphState.m_MiterLimit = miterLimit;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetLineWidth(FX_FLOAT& lineWidth) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      lineWidth = _info._graphState.m_LineWidth;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._graphState.m_LineWidth = lineWidth;
-      _info._isActOnDash = isActOnDash;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      strokeAlignment = _info._strokeAlignment;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetStrokeAlignment(FX_StrokeAlignment strokeAlignment) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._strokeAlignment = strokeAlignment;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetStrokeColor(CFX_Color* color) {
-  if (!color)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._strokeColor = color;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetFillColor(CFX_Color* color) {
-  if (!color)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._fillColor = color;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::StrokePath(CFX_Path* path, CFX_Matrix* matrix) {
-  if (!path)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceStrokePath(path, matrix);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::FillPath(CFX_Path* path,
-                              FX_FillMode fillMode,
-                              CFX_Matrix* matrix) {
-  if (!path)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceFillPath(path, fillMode, matrix);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::ClipPath(CFX_Path* path,
-                              FX_FillMode fillMode,
-                              CFX_Matrix* matrix) {
-  if (!path)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      FX_BOOL result = _renderDevice->SetClip_PathFill(
-          path->GetPathData(), (CFX_Matrix*)matrix, fillMode);
-      if (!result)
-        return FX_ERR_Indefinite;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::DrawImage(CFX_DIBSource* source,
-                               const CFX_PointF& point,
-                               CFX_Matrix* matrix) {
-  if (!source)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceDrawImage(source, point, matrix);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::StretchImage(CFX_DIBSource* source,
-                                  const CFX_RectF& rect,
-                                  CFX_Matrix* matrix) {
-  if (!source)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceStretchImage(source, rect, matrix);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::ConcatMatrix(const CFX_Matrix* matrix) {
-  if (!matrix)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._CTM.Concat(*matrix);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-CFX_Matrix* CFX_Graphics::GetMatrix() {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return NULL;
-      return &_info._CTM;
-    }
-    default: { return NULL; }
-  }
-}
-FX_ERR CFX_Graphics::GetClipRect(CFX_RectF& rect) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      FX_RECT r = _renderDevice->GetClipBox();
-      rect.left = (FX_FLOAT)r.left;
-      rect.top = (FX_FLOAT)r.top;
-      rect.width = (FX_FLOAT)r.Width();
-      rect.height = (FX_FLOAT)r.Height();
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetClipRect(const CFX_RectF& rect) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      if (!_renderDevice->SetClip_Rect(
-              FX_RECT(FXSYS_round(rect.left), FXSYS_round(rect.top),
-                      FXSYS_round(rect.right()), FXSYS_round(rect.bottom())))) {
-        return FX_ERR_Method_Not_Supported;
-      }
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::ClearClip() {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetFont(CFX_Font* font) {
-  if (!font)
-    return FX_ERR_Parameter_Invalid;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._font = font;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetFontSize(const FX_FLOAT size) {
-  FX_FLOAT fontSize = size <= 0 ? 1.0f : size;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._fontSize = fontSize;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetFontHScale(const FX_FLOAT scale) {
-  FX_FLOAT fontHScale = scale <= 0 ? 1.0f : scale;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._fontHScale = fontHScale;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetCharSpacing(const FX_FLOAT spacing) {
-  FX_FLOAT fontSpacing = spacing < 0 ? 0 : spacing;
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      _info._fontSpacing = fontSpacing;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::SetTextDrawingMode(const int32_t mode) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::ShowText(const CFX_PointF& point,
-                              const CFX_WideString& text,
-                              CFX_Matrix* matrix) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      return RenderDeviceShowText(point, text, matrix);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::CalcTextRect(CFX_RectF& rect,
-                                  const CFX_WideString& text,
-                                  FX_BOOL isMultiline,
-                                  CFX_Matrix* matrix) {
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      int32_t length = text.GetLength();
-      FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length);
-      FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length);
-      CalcTextInfo(text, charCodes, charPos, rect);
-      FX_Free(charPos);
-      FX_Free(charCodes);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics,
-                              const CFX_Matrix* matrix) {
-  if (!graphics)
-    return FX_ERR_Parameter_Invalid;
-  CFX_Matrix m;
-  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-        _info._CTM.f);
-  if (matrix) {
-    m.Concat(*matrix);
-  }
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      {
-        if (!graphics->_renderDevice)
-          return FX_ERR_Parameter_Invalid;
-        CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap();
-        FX_BOOL result = _renderDevice->SetDIBits(bitmap, 0, 0);
-        if (!result)
-          return FX_ERR_Method_Not_Supported;
-      }
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::Transfer(CFX_Graphics* graphics,
-                              FX_FLOAT srcLeft,
-                              FX_FLOAT srcTop,
-                              const CFX_RectF& dstRect,
-                              const CFX_Matrix* matrix) {
-  if (!graphics)
-    return FX_ERR_Parameter_Invalid;
-  CFX_Matrix m;
-  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-        _info._CTM.f);
-  if (matrix) {
-    m.Concat(*matrix);
-  }
-  switch (_type) {
-    case FX_CONTEXT_Device: {
-      if (!_renderDevice)
-        return FX_ERR_Property_Invalid;
-      {
-        if (!graphics->_renderDevice)
-          return FX_ERR_Parameter_Invalid;
-        CFX_DIBitmap* bitmap = graphics->_renderDevice->GetBitmap();
-        CFX_DIBitmap bmp;
-        FX_BOOL result =
-            bmp.Create((int32_t)dstRect.width, (int32_t)dstRect.height,
-                       bitmap->GetFormat());
-        if (!result)
-          return FX_ERR_Intermediate_Value_Invalid;
-        result = graphics->_renderDevice->GetDIBits(&bmp, (int32_t)srcLeft,
-                                                    (int32_t)srcTop);
-        if (!result)
-          return FX_ERR_Method_Not_Supported;
-        result = _renderDevice->SetDIBits(&bmp, (int32_t)dstRect.left,
-                                          (int32_t)dstRect.top);
-        if (!result)
-          return FX_ERR_Method_Not_Supported;
-        return FX_ERR_Succeeded;
-      }
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-CFX_RenderDevice* CFX_Graphics::GetRenderDevice() {
-  return _renderDevice;
-}
-FX_ERR CFX_Graphics::InverseRect(const CFX_RectF& rect) {
-  if (!_renderDevice)
-    return FX_ERR_Property_Invalid;
-  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
-  if (!bitmap)
-    return FX_ERR_Property_Invalid;
-  CFX_RectF temp(rect);
-  _info._CTM.TransformRect(temp);
-  CFX_RectF r;
-  r.Set(0, 0, (FX_FLOAT)bitmap->GetWidth(), (FX_FLOAT)bitmap->GetWidth());
-  r.Intersect(temp);
-  if (r.IsEmpty()) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  FX_ARGB* pBuf =
-      (FX_ARGB*)(bitmap->GetBuffer() + int32_t(r.top) * bitmap->GetPitch());
-  int32_t bottom = (int32_t)r.bottom();
-  int32_t right = (int32_t)r.right();
-  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
-    FX_ARGB* pLine = pBuf + (int32_t)r.left;
-    for (int32_t j = (int32_t)r.left; j < right; j++) {
-      FX_ARGB c = *pLine;
-      *pLine++ = (c & 0xFF000000) | (0xFFFFFF - (c & 0x00FFFFFF));
-    }
-    pBuf = (FX_ARGB*)((uint8_t*)pBuf + bitmap->GetPitch());
-  }
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::XorDIBitmap(const CFX_DIBitmap* srcBitmap,
-                                 const CFX_RectF& rect) {
-  if (!_renderDevice)
-    return FX_ERR_Property_Invalid;
-  CFX_DIBitmap* dst = _renderDevice->GetBitmap();
-  if (!dst)
-    return FX_ERR_Property_Invalid;
-  CFX_RectF temp(rect);
-  _info._CTM.TransformRect(temp);
-  CFX_RectF r;
-  r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth());
-  r.Intersect(temp);
-  if (r.IsEmpty()) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() +
-                                int32_t(r.top) * srcBitmap->GetPitch());
-  FX_ARGB* pDstBuf =
-      (FX_ARGB*)(dst->GetBuffer() + int32_t(r.top) * dst->GetPitch());
-  int32_t bottom = (int32_t)r.bottom();
-  int32_t right = (int32_t)r.right();
-  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
-    FX_ARGB* pSrcLine = pSrcBuf + (int32_t)r.left;
-    FX_ARGB* pDstLine = pDstBuf + (int32_t)r.left;
-    for (int32_t j = (int32_t)r.left; j < right; j++) {
-      FX_ARGB c = *pDstLine;
-      *pDstLine++ =
-          ArgbEncode(FXARGB_A(c), (c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF));
-      pSrcLine++;
-    }
-    pSrcBuf = (FX_ARGB*)((uint8_t*)pSrcBuf + srcBitmap->GetPitch());
-    pDstBuf = (FX_ARGB*)((uint8_t*)pDstBuf + dst->GetPitch());
-  }
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::EqvDIBitmap(const CFX_DIBitmap* srcBitmap,
-                                 const CFX_RectF& rect) {
-  if (!_renderDevice)
-    return FX_ERR_Property_Invalid;
-  CFX_DIBitmap* dst = _renderDevice->GetBitmap();
-  if (!dst)
-    return FX_ERR_Property_Invalid;
-  CFX_RectF temp(rect);
-  _info._CTM.TransformRect(temp);
-  CFX_RectF r;
-  r.Set(0, 0, (FX_FLOAT)dst->GetWidth(), (FX_FLOAT)dst->GetWidth());
-  r.Intersect(temp);
-  if (r.IsEmpty()) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  FX_ARGB* pSrcBuf = (FX_ARGB*)(srcBitmap->GetBuffer() +
-                                int32_t(r.top) * srcBitmap->GetPitch());
-  FX_ARGB* pDstBuf =
-      (FX_ARGB*)(dst->GetBuffer() + int32_t(r.top) * dst->GetPitch());
-  int32_t bottom = (int32_t)r.bottom();
-  int32_t right = (int32_t)r.right();
-  for (int32_t i = (int32_t)r.top; i < bottom; i++) {
-    FX_ARGB* pSrcLine = pSrcBuf + (int32_t)r.left;
-    FX_ARGB* pDstLine = pDstBuf + (int32_t)r.left;
-    for (int32_t j = (int32_t)r.left; j < right; j++) {
-      FX_ARGB c = *pDstLine;
-      *pDstLine++ =
-          ArgbEncode(FXARGB_A(c), ~((c & 0xFFFFFF) ^ (*pSrcLine & 0xFFFFFF)));
-      pSrcLine++;
-    }
-    pSrcBuf = (FX_ARGB*)((uint8_t*)pSrcBuf + srcBitmap->GetPitch());
-    pDstBuf = (FX_ARGB*)((uint8_t*)pDstBuf + dst->GetPitch());
-  }
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::RenderDeviceSetLineDash(FX_DashStyle dashStyle) {
-  switch (dashStyle) {
-    case FX_DASHSTYLE_Solid: {
-      _info._graphState.SetDashCount(0);
-      return FX_ERR_Succeeded;
-    }
-    case FX_DASHSTYLE_Dash: {
-      FX_FLOAT dashArray[] = {3, 1};
-      SetLineDash(0, dashArray, 2);
-      return FX_ERR_Succeeded;
-    }
-    case FX_DASHSTYLE_Dot: {
-      FX_FLOAT dashArray[] = {1, 1};
-      SetLineDash(0, dashArray, 2);
-      return FX_ERR_Succeeded;
-    }
-    case FX_DASHSTYLE_DashDot: {
-      FX_FLOAT dashArray[] = {3, 1, 1, 1};
-      SetLineDash(0, dashArray, 4);
-      return FX_ERR_Succeeded;
-    }
-    case FX_DASHSTYLE_DashDotDot: {
-      FX_FLOAT dashArray[] = {4, 1, 2, 1, 2, 1};
-      SetLineDash(0, dashArray, 6);
-      return FX_ERR_Succeeded;
-    }
-    default: { return FX_ERR_Parameter_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::RenderDeviceStrokePath(CFX_Path* path,
-                                            CFX_Matrix* matrix) {
-  if (!_info._strokeColor)
-    return FX_ERR_Property_Invalid;
-  CFX_Matrix m;
-  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-        _info._CTM.f);
-  if (matrix) {
-    m.Concat(*matrix);
-  }
-  switch (_info._strokeColor->_type) {
-    case FX_COLOR_Solid: {
-      FX_BOOL result = _renderDevice->DrawPath(
-          path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState, 0x0,
-          _info._strokeColor->_argb, 0);
-      if (!result)
-        return FX_ERR_Indefinite;
-      return FX_ERR_Succeeded;
-    }
-    case FX_COLOR_Pattern: {
-      return StrokePathWithPattern(path, &m);
-    }
-    case FX_COLOR_Shading: {
-      return StrokePathWithShading(path, &m);
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::RenderDeviceFillPath(CFX_Path* path,
-                                          FX_FillMode fillMode,
-                                          CFX_Matrix* matrix) {
-  if (!_info._fillColor)
-    return FX_ERR_Property_Invalid;
-  CFX_Matrix m;
-  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-        _info._CTM.f);
-  if (matrix) {
-    m.Concat(*matrix);
-  }
-  switch (_info._fillColor->_type) {
-    case FX_COLOR_Solid: {
-      FX_BOOL result = _renderDevice->DrawPath(
-          path->GetPathData(), (CFX_Matrix*)&m, &_info._graphState,
-          _info._fillColor->_argb, 0x0, fillMode);
-      if (!result)
-        return FX_ERR_Indefinite;
-      return FX_ERR_Succeeded;
-    }
-    case FX_COLOR_Pattern: {
-      { return FillPathWithPattern(path, fillMode, &m); }
-    }
-    case FX_COLOR_Shading: {
-      { return FillPathWithShading(path, fillMode, &m); }
-    }
-    default: { return FX_ERR_Property_Invalid; }
-  }
-}
-FX_ERR CFX_Graphics::RenderDeviceDrawImage(CFX_DIBSource* source,
-                                           const CFX_PointF& point,
-                                           CFX_Matrix* matrix) {
-  CFX_Matrix m1;
-  m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-         _info._CTM.f);
-  if (matrix) {
-    m1.Concat(*matrix);
-  }
-  CFX_Matrix m2;
-  m2.Set((FX_FLOAT)source->GetWidth(), 0.0, 0.0, (FX_FLOAT)source->GetHeight(),
-         point.x, point.y);
-  m2.Concat(m1);
-  int32_t left, top;
-  CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE);
-  CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m2, left, top);
-  CFX_RectF r;
-  GetClipRect(r);
-  FX_ERR result = FX_ERR_Indefinite;
-  {
-    CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
-    CFX_DIBitmap bmp;
-    bmp.Create(bitmap->GetWidth(), bitmap->GetHeight(), FXDIB_Argb);
-    _renderDevice->GetDIBits(&bmp, 0, 0);
-    bmp.TransferBitmap(FXSYS_round(r.left), FXSYS_round(r.top),
-                       FXSYS_round(r.Width()), FXSYS_round(r.Height()), bmp2,
-                       FXSYS_round(r.left - left), FXSYS_round(r.top - top));
-    _renderDevice->SetDIBits(&bmp, 0, 0);
-    result = FX_ERR_Succeeded;
-  }
-  if (bmp2) {
-    delete bmp2;
-    bmp2 = NULL;
-  }
-  if (bmp1) {
-    delete bmp1;
-    bmp1 = NULL;
-  }
-  return result;
-}
-FX_ERR CFX_Graphics::RenderDeviceStretchImage(CFX_DIBSource* source,
-                                              const CFX_RectF& rect,
-                                              CFX_Matrix* matrix) {
-  CFX_Matrix m1;
-  m1.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-         _info._CTM.f);
-  if (matrix) {
-    m1.Concat(*matrix);
-  }
-  CFX_DIBitmap* bmp1 =
-      source->StretchTo((int32_t)rect.Width(), (int32_t)rect.Height());
-  CFX_Matrix m2;
-  m2.Set(rect.Width(), 0.0, 0.0, rect.Height(), rect.left, rect.top);
-  m2.Concat(m1);
-  int32_t left, top;
-  CFX_DIBitmap* bmp2 = bmp1->FlipImage(FALSE, TRUE);
-  CFX_DIBitmap* bmp3 = bmp2->TransformTo((CFX_Matrix*)&m2, left, top);
-  CFX_RectF r;
-  GetClipRect(r);
-  FX_ERR result = FX_ERR_Indefinite;
-  {
-    CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
-    bitmap->CompositeBitmap(FXSYS_round(r.left), FXSYS_round(r.top),
-                            FXSYS_round(r.Width()), FXSYS_round(r.Height()),
-                            bmp3, FXSYS_round(r.left - left),
-                            FXSYS_round(r.top - top));
-    result = FX_ERR_Succeeded;
-  }
-  if (bmp3) {
-    delete bmp3;
-    bmp3 = NULL;
-  }
-  if (bmp2) {
-    delete bmp2;
-    bmp2 = NULL;
-  }
-  if (bmp1) {
-    delete bmp1;
-    bmp1 = NULL;
-  }
-  return result;
-}
-FX_ERR CFX_Graphics::RenderDeviceShowText(const CFX_PointF& point,
-                                          const CFX_WideString& text,
-                                          CFX_Matrix* matrix) {
-  int32_t length = text.GetLength();
-  FX_DWORD* charCodes = FX_Alloc(FX_DWORD, length);
-  FXTEXT_CHARPOS* charPos = FX_Alloc(FXTEXT_CHARPOS, length);
-  CFX_RectF rect;
-  rect.Set(point.x, point.y, 0, 0);
-  CalcTextInfo(text, charCodes, charPos, rect);
-  CFX_Matrix m;
-  m.Set(_info._CTM.a, _info._CTM.b, _info._CTM.c, _info._CTM.d, _info._CTM.e,
-        _info._CTM.f);
-  m.Translate(0, _info._fontSize * _info._fontHScale);
-  if (matrix) {
-    m.Concat(*matrix);
-  }
-  FX_BOOL result = _renderDevice->DrawNormalText(
-      length, charPos, _info._font, CFX_GEModule::Get()->GetFontCache(),
-      -_info._fontSize * _info._fontHScale, (CFX_Matrix*)&m,
-      _info._fillColor->_argb, FXTEXT_CLEARTYPE);
-  if (!result)
-    return FX_ERR_Indefinite;
-  FX_Free(charPos);
-  FX_Free(charCodes);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix) {
-  return FX_ERR_Method_Not_Supported;
-}
-FX_ERR CFX_Graphics::StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix) {
-  return FX_ERR_Method_Not_Supported;
-}
-FX_ERR CFX_Graphics::FillPathWithPattern(CFX_Path* path,
-                                         FX_FillMode fillMode,
-                                         CFX_Matrix* matrix) {
-  CFX_Pattern* pattern = _info._fillColor->_pattern;
-  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
-  int32_t width = bitmap->GetWidth();
-  int32_t height = bitmap->GetHeight();
-  CFX_DIBitmap bmp;
-  bmp.Create(width, height, FXDIB_Argb);
-  _renderDevice->GetDIBits(&bmp, 0, 0);
-  switch (pattern->_type) {
-    case FX_PATTERN_Bitmap: {
-      int32_t xStep = FXSYS_round(pattern->_x1Step);
-      int32_t yStep = FXSYS_round(pattern->_y1Step);
-      int32_t xCount = width / xStep + 1;
-      int32_t yCount = height / yStep + 1;
-      for (int32_t i = 0; i <= yCount; i++) {
-        for (int32_t j = 0; j <= xCount; j++) {
-          bmp.TransferBitmap(j * xStep, i * yStep, xStep, yStep,
-                             pattern->_bitmap, 0, 0);
-        }
-      }
-      break;
-    }
-    case FX_PATTERN_Hatch: {
-      FX_HatchStyle hatchStyle = _info._fillColor->_pattern->_hatchStyle;
-      if (hatchStyle < FX_HATCHSTYLE_Horizontal ||
-          hatchStyle > FX_HATCHSTYLE_SolidDiamond) {
-        return FX_ERR_Intermediate_Value_Invalid;
-      }
-      const FX_HATCHDATA& data = hatchBitmapData[hatchStyle];
-      CFX_DIBitmap mask;
-      mask.Create(data.width, data.height, FXDIB_1bppMask);
-      FXSYS_memcpy(mask.GetBuffer(), data.maskBits,
-                   mask.GetPitch() * data.height);
-      CFX_FloatRect rectf = path->GetPathData()->GetBoundingBox();
-      if (matrix) {
-        rectf.Transform((const CFX_Matrix*)matrix);
-      }
-      FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top),
-                   FXSYS_round(rectf.right), FXSYS_round(rectf.bottom));
-      CFX_FxgeDevice device;
-      device.Attach(&bmp);
-      device.FillRect(&rect, _info._fillColor->_pattern->_backArgb);
-      for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight()) {
-        for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) {
-          device.SetBitMask(&mask, i, j, _info._fillColor->_pattern->_foreArgb);
-        }
-      }
-      break;
-    }
-  }
-  _renderDevice->SaveState();
-  _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix,
-                                  fillMode);
-  SetDIBitsWithMatrix(&bmp, &pattern->_matrix);
-  _renderDevice->RestoreState();
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::FillPathWithShading(CFX_Path* path,
-                                         FX_FillMode fillMode,
-                                         CFX_Matrix* matrix) {
-  CFX_DIBitmap* bitmap = _renderDevice->GetBitmap();
-  int32_t width = bitmap->GetWidth();
-  int32_t height = bitmap->GetHeight();
-  FX_FLOAT start_x = _info._fillColor->_shading->_beginPoint.x;
-  FX_FLOAT start_y = _info._fillColor->_shading->_beginPoint.y;
-  FX_FLOAT end_x = _info._fillColor->_shading->_endPoint.x;
-  FX_FLOAT end_y = _info._fillColor->_shading->_endPoint.y;
-  CFX_DIBitmap bmp;
-  bmp.Create(width, height, FXDIB_Argb);
-  _renderDevice->GetDIBits(&bmp, 0, 0);
-  int32_t pitch = bmp.GetPitch();
-  FX_BOOL result = FALSE;
-  switch (_info._fillColor->_shading->_type) {
-    case FX_SHADING_Axial: {
-      FX_FLOAT x_span = end_x - start_x;
-      FX_FLOAT y_span = end_y - start_y;
-      FX_FLOAT axis_len_square = (x_span * x_span) + (y_span * y_span);
-      for (int32_t row = 0; row < height; row++) {
-        FX_DWORD* dib_buf = (FX_DWORD*)(bmp.GetBuffer() + row * pitch);
-        for (int32_t column = 0; column < width; column++) {
-          FX_FLOAT x = (FX_FLOAT)(column);
-          FX_FLOAT y = (FX_FLOAT)(row);
-          FX_FLOAT scale =
-              (((x - start_x) * x_span) + ((y - start_y) * y_span)) /
-              axis_len_square;
-          if (scale < 0) {
-            if (!_info._fillColor->_shading->_isExtendedBegin) {
-              continue;
-            }
-            scale = 0;
-          } else if (scale > 1.0f) {
-            if (!_info._fillColor->_shading->_isExtendedEnd) {
-              continue;
-            }
-            scale = 1.0f;
-          }
-          int32_t index = (int32_t)(scale * (FX_SHADING_Steps - 1));
-          dib_buf[column] = _info._fillColor->_shading->_argbArray[index];
-        }
-      }
-      result = TRUE;
-      break;
-    }
-    case FX_SHADING_Radial: {
-      FX_FLOAT start_r = _info._fillColor->_shading->_beginRadius;
-      FX_FLOAT end_r = _info._fillColor->_shading->_endRadius;
-      FX_FLOAT a = ((start_x - end_x) * (start_x - end_x)) +
-                   ((start_y - end_y) * (start_y - end_y)) -
-                   ((start_r - end_r) * (start_r - end_r));
-      for (int32_t row = 0; row < height; row++) {
-        FX_DWORD* dib_buf = (FX_DWORD*)(bmp.GetBuffer() + row * pitch);
-        for (int32_t column = 0; column < width; column++) {
-          FX_FLOAT x = (FX_FLOAT)(column);
-          FX_FLOAT y = (FX_FLOAT)(row);
-          FX_FLOAT b = -2 * (((x - start_x) * (end_x - start_x)) +
-                             ((y - start_y) * (end_y - start_y)) +
-                             (start_r * (end_r - start_r)));
-          FX_FLOAT c = ((x - start_x) * (x - start_x)) +
-                       ((y - start_y) * (y - start_y)) - (start_r * start_r);
-          FX_FLOAT s;
-          if (a == 0) {
-            s = -c / b;
-          } else {
-            FX_FLOAT b2_4ac = (b * b) - 4 * (a * c);
-            if (b2_4ac < 0) {
-              continue;
-            }
-            FX_FLOAT root = (FXSYS_sqrt(b2_4ac));
-            FX_FLOAT s1, s2;
-            if (a > 0) {
-              s1 = (-b - root) / (2 * a);
-              s2 = (-b + root) / (2 * a);
-            } else {
-              s2 = (-b - root) / (2 * a);
-              s1 = (-b + root) / (2 * a);
-            }
-            if (s2 <= 1.0f || _info._fillColor->_shading->_isExtendedEnd) {
-              s = (s2);
-            } else {
-              s = (s1);
-            }
-            if ((start_r) + s * (end_r - start_r) < 0) {
-              continue;
-            }
-          }
-          if (s < 0) {
-            if (!_info._fillColor->_shading->_isExtendedBegin) {
-              continue;
-            }
-            s = 0;
-          }
-          if (s > 1.0f) {
-            if (!_info._fillColor->_shading->_isExtendedEnd) {
-              continue;
-            }
-            s = 1.0f;
-          }
-          int index = (int32_t)(s * (FX_SHADING_Steps - 1));
-          dib_buf[column] = _info._fillColor->_shading->_argbArray[index];
-        }
-      }
-      result = TRUE;
-      break;
-    }
-    default: { result = FALSE; }
-  }
-  if (result) {
-    _renderDevice->SaveState();
-    _renderDevice->SetClip_PathFill(path->GetPathData(), (CFX_Matrix*)matrix,
-                                    fillMode);
-    SetDIBitsWithMatrix(&bmp, matrix);
-    _renderDevice->RestoreState();
-  }
-  return result;
-}
-FX_ERR CFX_Graphics::SetDIBitsWithMatrix(CFX_DIBSource* source,
-                                         CFX_Matrix* matrix) {
-  if (matrix->IsIdentity()) {
-    _renderDevice->SetDIBits(source, 0, 0);
-  } else {
-    CFX_Matrix m;
-    m.Set((FX_FLOAT)source->GetWidth(), 0, 0, (FX_FLOAT)source->GetHeight(), 0,
-          0);
-    m.Concat(*matrix);
-    int32_t left, top;
-    CFX_DIBitmap* bmp1 = source->FlipImage(FALSE, TRUE);
-    CFX_DIBitmap* bmp2 = bmp1->TransformTo((CFX_Matrix*)&m, left, top);
-    _renderDevice->SetDIBits(bmp2, left, top);
-    if (bmp2) {
-      delete bmp2;
-      bmp2 = NULL;
-    }
-    if (bmp1) {
-      delete bmp1;
-      bmp1 = NULL;
-    }
-  }
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Graphics::CalcTextInfo(const CFX_WideString& text,
-                                  FX_DWORD* charCodes,
-                                  FXTEXT_CHARPOS* charPos,
-                                  CFX_RectF& rect) {
-  std::unique_ptr<CFX_UnicodeEncoding> encoding(
-      new CFX_UnicodeEncoding(_info._font));
-  int32_t length = text.GetLength();
-  FX_FLOAT penX = (FX_FLOAT)rect.left;
-  FX_FLOAT penY = (FX_FLOAT)rect.top;
-  FX_FLOAT left = (FX_FLOAT)(0);
-  FX_FLOAT top = (FX_FLOAT)(0);
-  charCodes[0] = text.GetAt(0);
-  charPos[0].m_OriginX = penX + left;
-  charPos[0].m_OriginY = penY + top;
-  charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[0]);
-  charPos[0].m_FontCharWidth = FXSYS_round(
-      _info._font->GetGlyphWidth(charPos[0].m_GlyphIndex) * _info._fontHScale);
-  charPos[0].m_bGlyphAdjust = TRUE;
-  charPos[0].m_AdjustMatrix[0] = -1;
-  charPos[0].m_AdjustMatrix[1] = 0;
-  charPos[0].m_AdjustMatrix[2] = 0;
-  charPos[0].m_AdjustMatrix[3] = 1;
-  penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * _info._fontSize / 1000 +
-          _info._fontSpacing;
-  for (int32_t i = 1; i < length; i++) {
-    charCodes[i] = text.GetAt(i);
-    charPos[i].m_OriginX = penX + left;
-    charPos[i].m_OriginY = penY + top;
-    charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(charCodes[i]);
-    charPos[i].m_FontCharWidth =
-        FXSYS_round(_info._font->GetGlyphWidth(charPos[i].m_GlyphIndex) *
-                    _info._fontHScale);
-    charPos[i].m_bGlyphAdjust = TRUE;
-    charPos[i].m_AdjustMatrix[0] = -1;
-    charPos[i].m_AdjustMatrix[1] = 0;
-    charPos[i].m_AdjustMatrix[2] = 0;
-    charPos[i].m_AdjustMatrix[3] = 1;
-    penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * _info._fontSize / 1000 +
-            _info._fontSpacing;
-  }
-  rect.width = (FX_FLOAT)penX - rect.left;
-  rect.height = rect.top + _info._fontSize * _info._fontHScale - rect.top;
-  return FX_ERR_Succeeded;
-}
-CAGG_Graphics::CAGG_Graphics() {
-  _owner = NULL;
-}
-FX_ERR CAGG_Graphics::Create(CFX_Graphics* owner,
-                             int32_t width,
-                             int32_t height,
-                             FXDIB_Format format) {
-  if (owner->_renderDevice) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  if (_owner) {
-    return FX_ERR_Property_Invalid;
-  }
-  CFX_FxgeDevice* device = new CFX_FxgeDevice;
-  device->Create(width, height, format);
-  _owner = owner;
-  _owner->_renderDevice = device;
-  _owner->_renderDevice->GetBitmap()->Clear(0xFFFFFFFF);
-  return FX_ERR_Succeeded;
-}
-CAGG_Graphics::~CAGG_Graphics() {
-  if (_owner->_renderDevice) {
-    delete (CFX_FxgeDevice*)_owner->_renderDevice;
-  }
-  _owner = NULL;
-}
-CFX_Path::CFX_Path() {
-  _generator = NULL;
-}
-FX_ERR CFX_Path::Create() {
-  if (_generator) {
-    return FX_ERR_Property_Invalid;
-  }
-  _generator = new CFX_PathGenerator;
-  _generator->Create();
-  return FX_ERR_Succeeded;
-}
-CFX_Path::~CFX_Path() {
-  if (_generator) {
-    delete _generator;
-    _generator = NULL;
-  }
-}
-FX_ERR CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->MoveTo(x, y);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->LineTo(x, y);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::BezierTo(FX_FLOAT ctrlX1,
-                          FX_FLOAT ctrlY1,
-                          FX_FLOAT ctrlX2,
-                          FX_FLOAT ctrlY2,
-                          FX_FLOAT toX,
-                          FX_FLOAT toY) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::ArcTo(FX_FLOAT left,
-                       FX_FLOAT top,
-                       FX_FLOAT width,
-                       FX_FLOAT height,
-                       FX_FLOAT startAngle,
-                       FX_FLOAT sweepAngle) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2,
-                    startAngle, sweepAngle);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::Close() {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->Close();
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddLine(x1, y1, x2, y2);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddBezier(FX_FLOAT startX,
-                           FX_FLOAT startY,
-                           FX_FLOAT ctrlX1,
-                           FX_FLOAT ctrlY1,
-                           FX_FLOAT ctrlX2,
-                           FX_FLOAT ctrlY2,
-                           FX_FLOAT endX,
-                           FX_FLOAT endY) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX,
-                        endY);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddRectangle(FX_FLOAT left,
-                              FX_FLOAT top,
-                              FX_FLOAT width,
-                              FX_FLOAT height) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddRectangle(left, top, left + width, top + height);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddEllipse(FX_FLOAT left,
-                            FX_FLOAT top,
-                            FX_FLOAT width,
-                            FX_FLOAT height) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddEllipse(left + width / 2, top + height / 2, width / 2,
-                         height / 2);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddEllipse(const CFX_RectF& rect) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddEllipse(rect.left + rect.Width() / 2,
-                         rect.top + rect.Height() / 2, rect.Width() / 2,
-                         rect.Height() / 2);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddArc(FX_FLOAT left,
-                        FX_FLOAT top,
-                        FX_FLOAT width,
-                        FX_FLOAT height,
-                        FX_FLOAT startAngle,
-                        FX_FLOAT sweepAngle) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2,
-                     startAngle, sweepAngle);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddPie(FX_FLOAT left,
-                        FX_FLOAT top,
-                        FX_FLOAT width,
-                        FX_FLOAT height,
-                        FX_FLOAT startAngle,
-                        FX_FLOAT sweepAngle) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2,
-                     startAngle, sweepAngle);
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::AddSubpath(CFX_Path* path) {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->AddPathData(path->GetPathData());
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Path::Clear() {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  _generator->GetPathData()->SetPointCount(0);
-  return FX_ERR_Succeeded;
-}
-FX_BOOL CFX_Path::IsEmpty() {
-  if (!_generator)
-    return FX_ERR_Property_Invalid;
-  if (_generator->GetPathData()->GetPointCount() == 0) {
-    return TRUE;
-  }
-  return FALSE;
-}
-CFX_PathData* CFX_Path::GetPathData() {
-  if (!_generator)
-    return NULL;
-  return _generator->GetPathData();
-}
-CFX_Color::CFX_Color() {
-  _type = FX_COLOR_None;
-}
-CFX_Color::CFX_Color(const FX_ARGB argb) {
-  _type = FX_COLOR_None;
-  Set(argb);
-}
-CFX_Color::CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb) {
-  _type = FX_COLOR_None;
-  Set(pattern, argb);
-}
-CFX_Color::CFX_Color(CFX_Shading* shading) {
-  _type = FX_COLOR_None;
-  Set(shading);
-}
-CFX_Color::~CFX_Color() {
-  _type = FX_COLOR_None;
-}
-FX_ERR CFX_Color::Set(const FX_ARGB argb) {
-  _type = FX_COLOR_Solid;
-  _argb = argb;
-  _pattern = NULL;
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Color::Set(CFX_Pattern* pattern, const FX_ARGB argb) {
-  if (!pattern)
-    return FX_ERR_Parameter_Invalid;
-  _type = FX_COLOR_Pattern;
-  _argb = argb;
-  _pattern = pattern;
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Color::Set(CFX_Shading* shading) {
-  if (!shading)
-    return FX_ERR_Parameter_Invalid;
-  _type = FX_COLOR_Shading;
-  _shading = shading;
-  return FX_ERR_Succeeded;
-}
-CFX_Pattern::CFX_Pattern() {
-  _type = FX_PATTERN_None;
-  _matrix.SetIdentity();
-}
-FX_ERR CFX_Pattern::Create(CFX_DIBitmap* bitmap,
-                           const FX_FLOAT xStep,
-                           const FX_FLOAT yStep,
-                           CFX_Matrix* matrix) {
-  if (!bitmap)
-    return FX_ERR_Parameter_Invalid;
-  if (_type != FX_PATTERN_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_PATTERN_Bitmap;
-  _bitmap = bitmap;
-  _x1Step = xStep;
-  _y1Step = yStep;
-  if (matrix) {
-    _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
-                matrix->f);
-  }
-  return FX_ERR_Succeeded;
-}
-FX_ERR CFX_Pattern::Create(FX_HatchStyle hatchStyle,
-                           const FX_ARGB foreArgb,
-                           const FX_ARGB backArgb,
-                           CFX_Matrix* matrix) {
-  if (hatchStyle < FX_HATCHSTYLE_Horizontal ||
-      hatchStyle > FX_HATCHSTYLE_SolidDiamond) {
-    return FX_ERR_Parameter_Invalid;
-  }
-  if (_type != FX_PATTERN_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_PATTERN_Hatch;
-  _hatchStyle = hatchStyle;
-  _foreArgb = foreArgb;
-  _backArgb = backArgb;
-  if (matrix) {
-    _matrix.Set(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
-                matrix->f);
-  }
-  return FX_ERR_Succeeded;
-}
-CFX_Pattern::~CFX_Pattern() {
-  _type = FX_PATTERN_None;
-}
-CFX_Shading::CFX_Shading() {
-  _type = FX_SHADING_None;
-}
-FX_ERR CFX_Shading::CreateAxial(const CFX_PointF& beginPoint,
-                                const CFX_PointF& endPoint,
-                                FX_BOOL isExtendedBegin,
-                                FX_BOOL isExtendedEnd,
-                                const FX_ARGB beginArgb,
-                                const FX_ARGB endArgb) {
-  if (_type != FX_SHADING_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_SHADING_Axial;
-  _beginPoint = beginPoint;
-  _endPoint = endPoint;
-  _isExtendedBegin = isExtendedBegin;
-  _isExtendedEnd = isExtendedEnd;
-  _beginArgb = beginArgb;
-  _endArgb = endArgb;
-  return InitArgbArray();
-}
-FX_ERR CFX_Shading::CreateRadial(const CFX_PointF& beginPoint,
-                                 const CFX_PointF& endPoint,
-                                 const FX_FLOAT beginRadius,
-                                 const FX_FLOAT endRadius,
-                                 FX_BOOL isExtendedBegin,
-                                 FX_BOOL isExtendedEnd,
-                                 const FX_ARGB beginArgb,
-                                 const FX_ARGB endArgb) {
-  if (_type != FX_SHADING_None) {
-    return FX_ERR_Property_Invalid;
-  }
-  _type = FX_SHADING_Radial;
-  _beginPoint = beginPoint;
-  _endPoint = endPoint;
-  _beginRadius = beginRadius;
-  _endRadius = endRadius;
-  _isExtendedBegin = isExtendedBegin;
-  _isExtendedEnd = isExtendedEnd;
-  _beginArgb = beginArgb;
-  _endArgb = endArgb;
-  return InitArgbArray();
-}
-CFX_Shading::~CFX_Shading() {
-  _type = FX_SHADING_None;
-}
-FX_ERR CFX_Shading::InitArgbArray() {
-  int32_t a1, r1, g1, b1;
-  ArgbDecode(_beginArgb, a1, r1, g1, b1);
-  int32_t a2, r2, g2, b2;
-  ArgbDecode(_endArgb, a2, r2, g2, b2);
-  FX_FLOAT f = (FX_FLOAT)(FX_SHADING_Steps - 1);
-  FX_FLOAT aScale = (FX_FLOAT)(1.0 * (a2 - a1) / f);
-  FX_FLOAT rScale = (FX_FLOAT)(1.0 * (r2 - r1) / f);
-  FX_FLOAT gScale = (FX_FLOAT)(1.0 * (g2 - g1) / f);
-  FX_FLOAT bScale = (FX_FLOAT)(1.0 * (b2 - b1) / f);
-  int32_t a3, r3, g3, b3;
-  for (int32_t i = 0; i < FX_SHADING_Steps; i++) {
-    a3 = (int32_t)(i * aScale);
-    r3 = (int32_t)(i * rScale);
-    g3 = (int32_t)(i * gScale);
-    b3 = (int32_t)(i * bScale);
-    _argbArray[i] =
-        FXARGB_TODIB(FXARGB_MAKE((a1 + a3), (r1 + r3), (g1 + g3), (b1 + b3)));
-  }
-  return FX_ERR_Succeeded;
-}
-class CFX_Pause : public IFX_Pause {
- public:
-  virtual FX_BOOL NeedToPauseNow() { return TRUE; }
-};
diff --git a/xfa/src/fxgraphics/fx_path_generator.cpp b/xfa/src/fxgraphics/fx_path_generator.cpp
deleted file mode 100644
index 8b0bab0..0000000
--- a/xfa/src/fxgraphics/fx_path_generator.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxgraphics/fx_path_generator.h"
-
-#include "xfa/src/fxgraphics/pre.h"
-
-CFX_PathGenerator::CFX_PathGenerator() {
-  m_pPathData = NULL;
-}
-void CFX_PathGenerator::Create() {
-  m_pPathData = new CFX_PathData;
-}
-CFX_PathGenerator::~CFX_PathGenerator() {
-  if (m_pPathData) {
-    delete m_pPathData;
-    m_pPathData = NULL;
-  }
-}
-void CFX_PathGenerator::AddPathData(CFX_PathData* pPathData) {
-  if (pPathData && pPathData->GetPointCount() > 0) {
-    int nCount = pPathData->GetPointCount();
-    FX_PATHPOINT* pPoints = pPathData->GetPoints();
-    AddPathData(pPoints, nCount);
-  }
-}
-void CFX_PathGenerator::AddPathData(FX_PATHPOINT* pPoints, int nCount) {
-  if (pPoints && nCount > 0) {
-    int nOldCount = m_pPathData->GetPointCount();
-    m_pPathData->AddPointCount(nCount);
-    FX_PATHPOINT* pDstPoints = m_pPathData->GetPoints();
-    FXSYS_memcpy(pDstPoints + nOldCount, pPoints,
-                 sizeof(FX_PATHPOINT) * nCount);
-  }
-}
-void CFX_PathGenerator::MoveTo(FX_FLOAT x, FX_FLOAT y) {
-  m_pPathData->AddPointCount(1);
-  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_MOVETO);
-}
-void CFX_PathGenerator::LineTo(FX_FLOAT x, FX_FLOAT y) {
-  m_pPathData->AddPointCount(1);
-  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_LINETO);
-}
-void CFX_PathGenerator::BezierTo(FX_FLOAT ctrl_x1,
-                                 FX_FLOAT ctrl_y1,
-                                 FX_FLOAT ctrl_x2,
-                                 FX_FLOAT ctrl_y2,
-                                 FX_FLOAT to_x,
-                                 FX_FLOAT to_y) {
-  int old_count = m_pPathData->GetPointCount();
-  m_pPathData->AddPointCount(3);
-  m_pPathData->SetPoint(old_count, ctrl_x1, ctrl_y1, FXPT_BEZIERTO);
-  m_pPathData->SetPoint(old_count + 1, ctrl_x2, ctrl_y2, FXPT_BEZIERTO);
-  m_pPathData->SetPoint(old_count + 2, to_x, to_y, FXPT_BEZIERTO);
-}
-void CFX_PathGenerator::Close() {
-  if (m_pPathData->GetPointCount() > 0) {
-    int index = m_pPathData->GetPointCount() - 1;
-    FX_PATHPOINT* pPoints = m_pPathData->GetPoints();
-    pPoints[index].m_Flag |= FXPT_CLOSEFIGURE;
-  }
-}
-void CFX_PathGenerator::AddLine(FX_FLOAT x1,
-                                FX_FLOAT y1,
-                                FX_FLOAT x2,
-                                FX_FLOAT y2) {
-  int old_count = m_pPathData->GetPointCount();
-  m_pPathData->AddPointCount(2);
-  m_pPathData->SetPoint(old_count, x1, y1, FXPT_MOVETO);
-  m_pPathData->SetPoint(old_count + 1, x2, y2, FXPT_LINETO);
-}
-void CFX_PathGenerator::AddBezier(FX_FLOAT start_x,
-                                  FX_FLOAT start_y,
-                                  FX_FLOAT ctrl_x1,
-                                  FX_FLOAT ctrl_y1,
-                                  FX_FLOAT ctrl_x2,
-                                  FX_FLOAT ctrl_y2,
-                                  FX_FLOAT end_x,
-                                  FX_FLOAT end_y) {
-  int old_count = m_pPathData->GetPointCount();
-  m_pPathData->AddPointCount(4);
-  m_pPathData->SetPoint(old_count, start_x, start_y, FXPT_MOVETO);
-  m_pPathData->SetPoint(old_count + 1, ctrl_x1, ctrl_y1, FXPT_BEZIERTO);
-  m_pPathData->SetPoint(old_count + 2, ctrl_x2, ctrl_y2, FXPT_BEZIERTO);
-  m_pPathData->SetPoint(old_count + 3, end_x, end_y, FXPT_BEZIERTO);
-}
-void CFX_PathGenerator::AddRectangle(FX_FLOAT x1,
-                                     FX_FLOAT y1,
-                                     FX_FLOAT x2,
-                                     FX_FLOAT y2) {
-  m_pPathData->AppendRect(x1, y1, x2, y2);
-}
-void CFX_PathGenerator::AddEllipse(FX_FLOAT x,
-                                   FX_FLOAT y,
-                                   FX_FLOAT width,
-                                   FX_FLOAT height) {
-  AddArc(x, y, width, height, 0, FX_PI * 2);
-}
-void CFX_PathGenerator::ArcTo(FX_FLOAT x,
-                              FX_FLOAT y,
-                              FX_FLOAT width,
-                              FX_FLOAT height,
-                              FX_FLOAT start_angle,
-                              FX_FLOAT sweep_angle) {
-  FX_FLOAT x0 = FXSYS_cos(sweep_angle / 2);
-  FX_FLOAT y0 = FXSYS_sin(sweep_angle / 2);
-  FX_FLOAT tx = ((1.0f - x0) * 4) / (3 * 1.0f);
-  FX_FLOAT ty = y0 - ((tx * x0) / y0);
-  FX_FLOAT px[3], py[3];
-  px[0] = x0 + tx;
-  py[0] = -ty;
-  px[1] = x0 + tx;
-  py[1] = ty;
-  FX_FLOAT sn = FXSYS_sin(start_angle + sweep_angle / 2);
-  FX_FLOAT cs = FXSYS_cos(start_angle + sweep_angle / 2);
-  int old_count = m_pPathData->GetPointCount();
-  m_pPathData->AddPointCount(3);
-  FX_FLOAT bezier_x, bezier_y;
-  bezier_x = x + (width * ((px[0] * cs) - (py[0] * sn)));
-  bezier_y = y + (height * ((px[0] * sn) + (py[0] * cs)));
-  m_pPathData->SetPoint(old_count, bezier_x, bezier_y, FXPT_BEZIERTO);
-  bezier_x = x + (width * ((px[1] * cs) - (py[1] * sn)));
-  bezier_y = y + (height * ((px[1] * sn) + (py[1] * cs)));
-  m_pPathData->SetPoint(old_count + 1, bezier_x, bezier_y, FXPT_BEZIERTO);
-  bezier_x = x + (width * FXSYS_cos(start_angle + sweep_angle));
-  bezier_y = y + (height * FXSYS_sin(start_angle + sweep_angle));
-  m_pPathData->SetPoint(old_count + 2, bezier_x, bezier_y, FXPT_BEZIERTO);
-}
-void CFX_PathGenerator::AddArc(FX_FLOAT x,
-                               FX_FLOAT y,
-                               FX_FLOAT width,
-                               FX_FLOAT height,
-                               FX_FLOAT start_angle,
-                               FX_FLOAT sweep_angle) {
-  if (sweep_angle == 0) {
-    return;
-  }
-
-  const FX_FLOAT bezier_arc_angle_epsilon = 0.01f;
-  while (start_angle > FX_PI * 2) {
-    start_angle -= FX_PI * 2;
-  }
-  while (start_angle < 0) {
-    start_angle += FX_PI * 2;
-  }
-  if (sweep_angle >= FX_PI * 2) {
-    sweep_angle = FX_PI * 2;
-  }
-  if (sweep_angle <= -FX_PI * 2) {
-    sweep_angle = -FX_PI * 2;
-  }
-  m_pPathData->AddPointCount(1);
-  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1,
-                        x + (width * FXSYS_cos(start_angle)),
-                        y + (height * FXSYS_sin(start_angle)), FXPT_MOVETO);
-  FX_FLOAT total_sweep = 0, local_sweep = 0, prev_sweep = 0;
-  FX_BOOL done = FALSE;
-  do {
-    if (sweep_angle < 0) {
-      prev_sweep = total_sweep;
-      local_sweep = -FX_PI / 2;
-      total_sweep -= FX_PI / 2;
-      if (total_sweep <= sweep_angle + bezier_arc_angle_epsilon) {
-        local_sweep = sweep_angle - prev_sweep;
-        done = TRUE;
-      }
-    } else {
-      prev_sweep = total_sweep;
-      local_sweep = FX_PI / 2;
-      total_sweep += FX_PI / 2;
-      if (total_sweep >= sweep_angle - bezier_arc_angle_epsilon) {
-        local_sweep = sweep_angle - prev_sweep;
-        done = TRUE;
-      }
-    }
-    ArcTo(x, y, width, height, start_angle, local_sweep);
-    start_angle += local_sweep;
-  } while (!done);
-}
-void CFX_PathGenerator::AddPie(FX_FLOAT x,
-                               FX_FLOAT y,
-                               FX_FLOAT width,
-                               FX_FLOAT height,
-                               FX_FLOAT start_angle,
-                               FX_FLOAT sweep_angle) {
-  if (sweep_angle == 0) {
-    int old_count = m_pPathData->GetPointCount();
-    m_pPathData->AddPointCount(2);
-    m_pPathData->SetPoint(old_count, x, y, FXPT_MOVETO);
-    m_pPathData->SetPoint(old_count + 1, x + (width * FXSYS_cos(start_angle)),
-                          y + (height * FXSYS_sin(start_angle)), FXPT_LINETO);
-    return;
-  }
-  AddArc(x, y, width, height, start_angle, sweep_angle);
-  m_pPathData->AddPointCount(1);
-  m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y,
-                        FXPT_LINETO | FXPT_CLOSEFIGURE);
-}
diff --git a/xfa/src/fxgraphics/fx_path_generator.h b/xfa/src/fxgraphics/fx_path_generator.h
deleted file mode 100644
index b825396..0000000
--- a/xfa/src/fxgraphics/fx_path_generator.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXGRAPHICS_FX_PATH_GENERATOR_H_
-#define XFA_SRC_FXGRAPHICS_FX_PATH_GENERATOR_H_
-
-#include "core/include/fxge/fx_ge.h"
-
-class CFX_PathGenerator {
- public:
-  CFX_PathGenerator();
-  void Create();
-  ~CFX_PathGenerator();
-  CFX_PathData* GetPathData() const { return m_pPathData; }
-  void AddPathData(CFX_PathData* path_data);
-  void AddPathData(FX_PATHPOINT* points, int count);
-  void MoveTo(FX_FLOAT x, FX_FLOAT y);
-  void LineTo(FX_FLOAT x, FX_FLOAT y);
-  void BezierTo(FX_FLOAT ctrl_x1,
-                FX_FLOAT ctrl_y1,
-                FX_FLOAT ctrl_x2,
-                FX_FLOAT ctrl_y2,
-                FX_FLOAT to_x,
-                FX_FLOAT to_y);
-  void Close();
-  void ArcTo(FX_FLOAT x,
-             FX_FLOAT y,
-             FX_FLOAT width,
-             FX_FLOAT height,
-             FX_FLOAT start_angle,
-             FX_FLOAT sweep_angle);
-
-  void AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
-  void AddBezier(FX_FLOAT start_x,
-                 FX_FLOAT start_y,
-                 FX_FLOAT ctrl_x1,
-                 FX_FLOAT ctrl_y1,
-                 FX_FLOAT ctrl_x2,
-                 FX_FLOAT ctrl_y2,
-                 FX_FLOAT end_x,
-                 FX_FLOAT end_y);
-  void AddRectangle(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
-  void AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height);
-  void AddArc(FX_FLOAT x,
-              FX_FLOAT y,
-              FX_FLOAT width,
-              FX_FLOAT height,
-              FX_FLOAT start_angle,
-              FX_FLOAT sweep_angle);
-  void AddPie(FX_FLOAT x,
-              FX_FLOAT y,
-              FX_FLOAT width,
-              FX_FLOAT height,
-              FX_FLOAT start_angle,
-              FX_FLOAT sweep_angle);
-
- protected:
-  CFX_PathData* m_pPathData;
-};
-
-#endif  // XFA_SRC_FXGRAPHICS_FX_PATH_GENERATOR_H_
diff --git a/xfa/src/fxgraphics/pre.h b/xfa/src/fxgraphics/pre.h
deleted file mode 100644
index 625df39..0000000
--- a/xfa/src/fxgraphics/pre.h
+++ /dev/null
@@ -1,586 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXGRAPHICS_PRE_H_
-#define XFA_SRC_FXGRAPHICS_PRE_H_
-
-enum {
-  FX_CONTEXT_None = 0,
-  FX_CONTEXT_Device,
-};
-enum { FX_COLOR_None = 0, FX_COLOR_Solid, FX_COLOR_Pattern, FX_COLOR_Shading };
-enum { FX_PATTERN_None = 0, FX_PATTERN_Bitmap, FX_PATTERN_Hatch };
-enum { FX_SHADING_None = 0, FX_SHADING_Axial, FX_SHADING_Radial };
-
-#define FX_HATCHSTYLE_Total 53
-
-struct FX_HATCHDATA {
-  int32_t width;
-  int32_t height;
-  uint8_t maskBits[64];
-};
-typedef FX_HATCHDATA const* FX_LPCHATCHDATA;
-
-static const FX_HATCHDATA hatchBitmapData[FX_HATCHSTYLE_Total] = {
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x40, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x40, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x51, 0x51, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x15, 0x15, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xee, 0xee, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xbb, 0xbb, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xdd, 0xdd, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xef, 0xef, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xef, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xf7, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x7f, 0x7f, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x33, 0x33, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x33, 0x33, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xc1, 0xc1, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-         0x07, 0x07, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00,
-         0xe0, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
-         0x1c, 0x1c, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00,
-         0x83, 0x83, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x83, 0x83, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-         0x1c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-         0xe0, 0xe0, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x83, 0x83, 0x00, 0x00,
-         0x07, 0x07, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00,
-         0xc1, 0xc1, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x00,
-         0xcc, 0xcc, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x20, 0x20, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
-         0x04, 0x04, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xb1, 0xb1, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
-         0x1b, 0x1b, 0x00, 0x00, 0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
-         0x0c, 0x0c, 0x00, 0x00, 0x8d, 0x8d, 0x00, 0x00, 0xb1, 0xb1, 0x00, 0x00,
-         0x30, 0x30, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00,
-         0xd8, 0xd8, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,
-         0x8d, 0x8d, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
-         0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-         0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00,
-         0xc0, 0xc0, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00,
-         0x42, 0x42, 0x00, 0x00, 0x81, 0x81, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x02, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x18, 0x18, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x42, 0x00, 0x00,
-         0x81, 0x81, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x88, 0x88, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x45, 0x45, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x54, 0x54, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x14, 0x14, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x51, 0x51, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x55, 0x55, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-         0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x03, 0x03, 0x00, 0x00, 0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00,
-         0x30, 0x30, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
-         0x84, 0x84, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-         0x0c, 0x0c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x77, 0x77, 0x00, 0x00, 0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
-         0x8f, 0x8f, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00,
-         0xf8, 0xf8, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00,
-         0x89, 0x89, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00,
-         0x77, 0x77, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00,
-         0xf8, 0xf8, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0xff, 0xff, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00,
-         0x88, 0x88, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x99, 0x99, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00,
-         0x99, 0x99, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
-         0x0f, 0x0f, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x82, 0x82, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00,
-         0x82, 0x82, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
-         0x44, 0x44, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x28, 0x28, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x82, 0x82, 0x00, 0x00,
-         0x01, 0x01, 0x00, 0x00,
-     }},
-    {16,
-     16,
-     {
-         0x10, 0x10, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
-         0xfe, 0xfe, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
-         0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x38, 0x38, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00,
-         0x7c, 0x7c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,
-         0x00, 0x00, 0x00, 0x00,
-     }},
-};
-#if defined(__WIN32__) || defined(_WIN32)
-#define FX_START_TIMER    \
-  SYSTEMTIME start, stop; \
-  ::GetLocalTime(&start);
-#define FX_STOP_TIMER                                            \
-  ::GetLocalTime(&stop);                                         \
-  WORD wSecond = stop.wSecond - start.wSecond;                   \
-  WORD wMilliseconds = stop.wMilliseconds - start.wMilliseconds; \
-  char buf[256];                                                 \
-  memset(buf, 0, sizeof(buf));                                   \
-  snprintf(buf, sizeof(buf) - 1, "duration is %d millisecond\n", \
-           wSecond * 1000 + wMilliseconds);                      \
-  ::OutputDebugString(buf);
-#elif defined(__linux) || defined(linux)
-#define FX_START_TIMER
-#define FX_STOP_TIMER
-#elif defined(__APPLE__) || defined(__MACOSX__)
-#define FX_START_TIMER        \
-  NSTimeInterval start, stop; \
-  start = [NSDate timeIntervalSinceReferenceDate];
-#define FX_STOP_TIMER                             \
-  stop = [NSDate timeIntervalSinceReferenceDate]; \
-  NSTimeInterval duration = stop - start;         \
-  printf("duration is %f millisecond\n", duration * 1000);
-#else
-#endif
-
-#endif  // XFA_SRC_FXGRAPHICS_PRE_H_
diff --git a/xfa/src/fxjse/class.cpp b/xfa/src/fxjse/class.cpp
deleted file mode 100644
index bccbe2b..0000000
--- a/xfa/src/fxjse/class.cpp
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxjse/class.h"
-
-#include "xfa/src/fxjse/context.h"
-#include "xfa/src/fxjse/scope_inline.h"
-#include "xfa/src/fxjse/util_inline.h"
-#include "xfa/src/fxjse/value.h"
-
-static void FXJSE_V8ConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info);
-static void FXJSE_V8FunctionCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info);
-static void FXJSE_V8GetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info);
-static void FXJSE_V8SetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<void>& info);
-
-void FXJSE_DefineFunctions(FXJSE_HCONTEXT hContext,
-                           const FXJSE_FUNCTION* lpFunctions,
-                           int nNum) {
-  CFXJSE_Context* lpContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  ASSERT(lpContext);
-  CFXJSE_ScopeUtil_IsolateHandleContext scope(lpContext);
-  v8::Isolate* pIsolate = lpContext->GetRuntime();
-  v8::Local<v8::Object> hGlobalObject =
-      FXJSE_GetGlobalObjectFromContext(scope.GetLocalContext());
-  for (int32_t i = 0; i < nNum; i++) {
-    v8::Maybe<bool> maybe_success = hGlobalObject->DefineOwnProperty(
-        scope.GetLocalContext(),
-        v8::String::NewFromUtf8(pIsolate, lpFunctions[i].name),
-        v8::Function::New(
-            pIsolate, FXJSE_V8FunctionCallback_Wrapper,
-            v8::External::New(pIsolate,
-                              const_cast<FXJSE_FUNCTION*>(lpFunctions + i))),
-        static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
-    if (!maybe_success.FromMaybe(false))
-      return;
-  }
-}
-
-FXJSE_HCLASS FXJSE_DefineClass(FXJSE_HCONTEXT hContext,
-                               const FXJSE_CLASS* lpClass) {
-  CFXJSE_Context* lpContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  ASSERT(lpContext);
-  return reinterpret_cast<FXJSE_HCLASS>(
-      CFXJSE_Class::Create(lpContext, lpClass, FALSE));
-}
-
-FXJSE_HCLASS FXJSE_GetClass(FXJSE_HCONTEXT hContext,
-                            const CFX_ByteStringC& szName) {
-  return reinterpret_cast<FXJSE_HCLASS>(CFXJSE_Class::GetClassFromContext(
-      reinterpret_cast<CFXJSE_Context*>(hContext), szName));
-}
-
-static void FXJSE_V8FunctionCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_FUNCTION* lpFunctionInfo =
-      static_cast<FXJSE_FUNCTION*>(info.Data().As<v8::External>()->Value());
-  if (!lpFunctionInfo) {
-    return;
-  }
-  CFX_ByteStringC szFunctionName(lpFunctionInfo->name);
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(info.This());
-  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
-  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
-  lpFunctionInfo->callbackProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                               szFunctionName,
-                               reinterpret_cast<CFXJSE_Arguments&>(impl));
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-  delete lpRetValue;
-  lpRetValue = NULL;
-  delete lpThisValue;
-  lpThisValue = NULL;
-}
-
-static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_CLASS* lpClassDefinition =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  if (!lpClassDefinition) {
-    return;
-  }
-  CFX_ByteStringC szFunctionName(lpClassDefinition->name);
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(info.This());
-  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
-  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
-  lpClassDefinition->constructor(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                                 szFunctionName,
-                                 reinterpret_cast<CFXJSE_Arguments&>(impl));
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-  delete lpRetValue;
-  lpRetValue = NULL;
-  delete lpThisValue;
-  lpThisValue = NULL;
-}
-
-static void FXJSE_V8GetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  const FXJSE_PROPERTY* lpPropertyInfo =
-      static_cast<FXJSE_PROPERTY*>(info.Data().As<v8::External>()->Value());
-  if (!lpPropertyInfo) {
-    return;
-  }
-  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(info.This());
-  lpPropertyInfo->getProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                          szPropertyName,
-                          reinterpret_cast<FXJSE_HVALUE>(lpPropValue));
-  info.GetReturnValue().Set(lpPropValue->DirectGetValue());
-  delete lpThisValue;
-  lpThisValue = NULL;
-  delete lpPropValue;
-  lpPropValue = NULL;
-}
-
-static void FXJSE_V8SetterCallback_Wrapper(
-    v8::Local<v8::String> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<void>& info) {
-  const FXJSE_PROPERTY* lpPropertyInfo =
-      static_cast<FXJSE_PROPERTY*>(info.Data().As<v8::External>()->Value());
-  if (!lpPropertyInfo) {
-    return;
-  }
-  CFX_ByteStringC szPropertyName(lpPropertyInfo->name);
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  CFXJSE_Value* lpPropValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(info.This());
-  lpPropValue->ForceSetValue(value);
-  lpPropertyInfo->setProc(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                          szPropertyName,
-                          reinterpret_cast<FXJSE_HVALUE>(lpPropValue));
-  delete lpThisValue;
-  lpThisValue = NULL;
-  delete lpPropValue;
-  lpPropValue = NULL;
-}
-
-static void FXJSE_V8ConstructorCallback_Wrapper(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_CLASS* lpClassDefinition =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  if (!lpClassDefinition) {
-    return;
-  }
-  FXSYS_assert(info.This()->InternalFieldCount());
-  info.This()->SetAlignedPointerInInternalField(0, NULL);
-}
-
-FXJSE_HRUNTIME CFXJSE_Arguments::GetRuntime() const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return reinterpret_cast<FXJSE_HRUNTIME>(
-      lpArguments->m_pRetValue->GetIsolate());
-}
-
-int32_t CFXJSE_Arguments::GetLength() const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return lpArguments->m_pInfo->Length();
-}
-
-FXJSE_HVALUE CFXJSE_Arguments::GetValue(int32_t index) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  CFXJSE_Value* lpArgValue = CFXJSE_Value::Create(v8::Isolate::GetCurrent());
-  ASSERT(lpArgValue);
-  lpArgValue->ForceSetValue((*lpArguments->m_pInfo)[index]);
-  return reinterpret_cast<FXJSE_HVALUE>(lpArgValue);
-}
-
-FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return (*lpArguments->m_pInfo)[index]->BooleanValue();
-}
-
-int32_t CFXJSE_Arguments::GetInt32(int32_t index) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return static_cast<int32_t>((*lpArguments->m_pInfo)[index]->NumberValue());
-}
-
-FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return static_cast<FX_FLOAT>((*lpArguments->m_pInfo)[index]->NumberValue());
-}
-
-CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  v8::Local<v8::String> hString = (*lpArguments->m_pInfo)[index]->ToString();
-  v8::String::Utf8Value szStringVal(hString);
-  return CFX_ByteString(*szStringVal);
-}
-
-void* CFXJSE_Arguments::GetObject(int32_t index, FXJSE_HCLASS hClass) const {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  v8::Local<v8::Value> hValue = (*lpArguments->m_pInfo)[index];
-  ASSERT(!hValue.IsEmpty());
-  if (!hValue->IsObject()) {
-    return NULL;
-  }
-  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
-  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), lpClass);
-}
-
-FXJSE_HVALUE CFXJSE_Arguments::GetReturnValue() {
-  const CFXJSE_ArgumentsImpl* lpArguments =
-      reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this);
-  return reinterpret_cast<FXJSE_HVALUE>(lpArguments->m_pRetValue);
-}
-static void FXJSE_Context_GlobalObjToString(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  if (!lpClass) {
-    return;
-  }
-  if (info.This() == info.Holder() && lpClass->name) {
-    CFX_ByteString szStringVal;
-    szStringVal.Format("[object %s]", lpClass->name);
-    info.GetReturnValue().Set(v8::String::NewFromUtf8(
-        info.GetIsolate(), (const FX_CHAR*)szStringVal,
-        v8::String::kNormalString, szStringVal.GetLength()));
-  } else {
-    v8::Local<v8::String> local_str =
-        info.This()
-            ->ObjectProtoToString(info.GetIsolate()->GetCurrentContext())
-            .FromMaybe(v8::Local<v8::String>());
-    info.GetReturnValue().Set(local_str);
-  }
-}
-
-CFXJSE_Class* CFXJSE_Class::Create(CFXJSE_Context* lpContext,
-                                   const FXJSE_CLASS* lpClassDefinition,
-                                   FX_BOOL bIsJSGlobal) {
-  if (!lpContext || !lpClassDefinition) {
-    return NULL;
-  }
-  CFXJSE_Class* pClass =
-      GetClassFromContext(lpContext, lpClassDefinition->name);
-  if (pClass) {
-    return pClass;
-  }
-  v8::Isolate* pIsolate = lpContext->m_pIsolate;
-  pClass = new CFXJSE_Class(lpContext);
-  pClass->m_szClassName = lpClassDefinition->name;
-  pClass->m_lpClassDefinition = lpClassDefinition;
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::FunctionTemplate> hFunctionTemplate = v8::FunctionTemplate::New(
-      pIsolate, bIsJSGlobal ? 0 : FXJSE_V8ConstructorCallback_Wrapper,
-      v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(lpClassDefinition)));
-  hFunctionTemplate->SetClassName(
-      v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name));
-  hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1);
-  v8::Local<v8::ObjectTemplate> hObjectTemplate =
-      hFunctionTemplate->InstanceTemplate();
-  SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition);
-
-  if (lpClassDefinition->propNum) {
-    for (int32_t i = 0; i < lpClassDefinition->propNum; i++) {
-      hObjectTemplate->SetNativeDataProperty(
-          v8::String::NewFromUtf8(pIsolate,
-                                  lpClassDefinition->properties[i].name),
-          lpClassDefinition->properties[i].getProc
-              ? FXJSE_V8GetterCallback_Wrapper
-              : NULL,
-          lpClassDefinition->properties[i].setProc
-              ? FXJSE_V8SetterCallback_Wrapper
-              : NULL,
-          v8::External::New(pIsolate, const_cast<FXJSE_PROPERTY*>(
-                                          lpClassDefinition->properties + i)),
-          static_cast<v8::PropertyAttribute>(v8::DontDelete));
-    }
-  }
-  if (lpClassDefinition->methNum) {
-    for (int32_t i = 0; i < lpClassDefinition->methNum; i++) {
-      hObjectTemplate->Set(
-          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name),
-          v8::FunctionTemplate::New(
-              pIsolate, FXJSE_V8FunctionCallback_Wrapper,
-              v8::External::New(pIsolate, const_cast<FXJSE_FUNCTION*>(
-                                              lpClassDefinition->methods + i))),
-          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
-    }
-  }
-  if (lpClassDefinition->constructor) {
-    if (bIsJSGlobal) {
-      hObjectTemplate->Set(
-          v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
-          v8::FunctionTemplate::New(
-              pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
-              v8::External::New(pIsolate,
-                                const_cast<FXJSE_CLASS*>(lpClassDefinition))),
-          static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete));
-    } else {
-      v8::Local<v8::Context> hLocalContext =
-          v8::Local<v8::Context>::New(pIsolate, lpContext->m_hContext);
-      FXJSE_GetGlobalObjectFromContext(hLocalContext)
-          ->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name),
-                v8::Function::New(
-                    pIsolate, FXJSE_V8ClassGlobalConstructorCallback_Wrapper,
-                    v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(
-                                                    lpClassDefinition))));
-    }
-  }
-  if (bIsJSGlobal) {
-    hObjectTemplate->Set(
-        v8::String::NewFromUtf8(pIsolate, "toString"),
-        v8::FunctionTemplate::New(
-            pIsolate, FXJSE_Context_GlobalObjToString,
-            v8::External::New(pIsolate,
-                              const_cast<FXJSE_CLASS*>(lpClassDefinition))));
-  }
-  pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate);
-  lpContext->m_rgClasses.Add(pClass);
-  return pClass;
-}
-CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext,
-                                                const CFX_ByteStringC& szName) {
-  for (int count = pContext->m_rgClasses.GetSize(), i = 0; i < count; i++) {
-    CFXJSE_Class* pClass = pContext->m_rgClasses[i];
-    if (pClass->m_szClassName == szName) {
-      return pClass;
-    }
-  }
-  return NULL;
-}
diff --git a/xfa/src/fxjse/class.h b/xfa/src/fxjse/class.h
deleted file mode 100644
index f5738eb..0000000
--- a/xfa/src/fxjse/class.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_CLASS_H_
-#define XFA_SRC_FXJSE_CLASS_H_
-
-#include "v8/include/v8.h"
-#include "xfa/include/fxjse/fxjse.h"
-
-class CFXJSE_Context;
-class CFXJSE_Value;
-
-class CFXJSE_Class {
- protected:
-  CFXJSE_Class(CFXJSE_Context* lpContext)
-      : m_lpClassDefinition(nullptr), m_pContext(lpContext) {}
-
- public:
-  inline CFXJSE_Context* GetContext() { return m_pContext; }
-  inline v8::Global<v8::FunctionTemplate>& GetTemplate() { return m_hTemplate; }
-
- public:
-  static CFXJSE_Class* Create(CFXJSE_Context* pContext,
-                              const FXJSE_CLASS* lpClassDefintion,
-                              FX_BOOL bIsJSGlobal = FALSE);
-  static CFXJSE_Class* GetClassFromContext(CFXJSE_Context* pContext,
-                                           const CFX_ByteStringC& szName);
-  static void SetUpNamedPropHandler(
-      v8::Isolate* pIsolate,
-      v8::Local<v8::ObjectTemplate>& hObjectTemplate,
-      const FXJSE_CLASS* lpClassDefinition);
-
- protected:
-  CFX_ByteString m_szClassName;
-  const FXJSE_CLASS* m_lpClassDefinition;
-  CFXJSE_Context* m_pContext;
-  v8::Global<v8::FunctionTemplate> m_hTemplate;
-  friend class CFXJSE_Context;
-  friend class CFXJSE_Value;
-};
-struct CFXJSE_ArgumentsImpl {
-  const v8::FunctionCallbackInfo<v8::Value>* m_pInfo;
-  CFXJSE_Value* m_pRetValue;
-};
-
-#endif  // XFA_SRC_FXJSE_CLASS_H_
diff --git a/xfa/src/fxjse/context.cpp b/xfa/src/fxjse/context.cpp
deleted file mode 100644
index 485869d..0000000
--- a/xfa/src/fxjse/context.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxjse/context.h"
-
-#include "xfa/src/fxjse/class.h"
-#include "xfa/src/fxjse/scope_inline.h"
-#include "xfa/src/fxjse/util_inline.h"
-#include "xfa/src/fxjse/value.h"
-
-FXJSE_HCONTEXT FXJSE_Context_Create(FXJSE_HRUNTIME hRuntime,
-                                    const FXJSE_CLASS* lpGlobalClass,
-                                    void* lpGlobalObject) {
-  CFXJSE_Context* pContext = CFXJSE_Context::Create(
-      reinterpret_cast<v8::Isolate*>(hRuntime), lpGlobalClass, lpGlobalObject);
-  return reinterpret_cast<FXJSE_HCONTEXT>(pContext);
-}
-
-void FXJSE_Context_Release(FXJSE_HCONTEXT hContext) {
-  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  if (pContext) {
-    delete pContext;
-  }
-}
-
-FXJSE_HVALUE FXJSE_Context_GetGlobalObject(FXJSE_HCONTEXT hContext) {
-  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  if (!pContext) {
-    return NULL;
-  }
-  CFXJSE_Value* lpValue = CFXJSE_Value::Create(pContext->GetRuntime());
-  ASSERT(lpValue);
-  pContext->GetGlobalObject(lpValue);
-  return reinterpret_cast<FXJSE_HVALUE>(lpValue);
-}
-
-FXJSE_HRUNTIME FXJSE_Context_GetRuntime(FXJSE_HCONTEXT hContext) {
-  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  return pContext ? reinterpret_cast<FXJSE_HRUNTIME>(pContext->GetRuntime())
-                  : NULL;
-}
-
-static const FX_CHAR* szCompatibleModeScripts[] = {
-    "(function(global, list) {\n"
-    "  'use strict';\n"
-    "  var objname;\n"
-    "  for (objname in list) {\n"
-    "    var globalobj = global[objname];\n"
-    "    if (globalobj) {\n"
-    "      list[objname].forEach(function(name) {\n"
-    "        if (!globalobj[name]) {\n"
-    "          Object.defineProperty(globalobj, name, {\n"
-    "            writable: true,\n"
-    "            enumerable: false,\n"
-    "            value: (function(obj) {\n"
-    "              if (arguments.length === 0) {\n"
-    "                throw new TypeError('missing argument 0 when calling "
-    "                    function ' + objname + '.' + name);\n"
-    "              }\n"
-    "              return globalobj.prototype[name].apply(obj, "
-    "                  Array.prototype.slice.call(arguments, 1));\n"
-    "            })\n"
-    "          });\n"
-    "        }\n"
-    "      });\n"
-    "    }\n"
-    "  }\n"
-    "}(this, {String: ['substr', 'toUpperCase']}));"};
-void FXJSE_Context_EnableCompatibleMode(FXJSE_HCONTEXT hContext,
-                                        FX_DWORD dwCompatibleFlags) {
-  for (uint32_t i = 0; i < (uint32_t)FXJSE_COMPATIBLEMODEFLAGCOUNT; i++) {
-    if (dwCompatibleFlags & (1 << i)) {
-      FXJSE_ExecuteScript(hContext, szCompatibleModeScripts[i], NULL, NULL);
-    }
-  }
-}
-
-FX_BOOL FXJSE_ExecuteScript(FXJSE_HCONTEXT hContext,
-                            const FX_CHAR* szScript,
-                            FXJSE_HVALUE hRetValue,
-                            FXJSE_HVALUE hNewThisObject) {
-  CFXJSE_Context* pContext = reinterpret_cast<CFXJSE_Context*>(hContext);
-  ASSERT(pContext);
-  return pContext->ExecuteScript(
-      szScript, reinterpret_cast<CFXJSE_Value*>(hRetValue),
-      reinterpret_cast<CFXJSE_Value*>(hNewThisObject));
-}
-
-v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
-                                              v8::TryCatch& trycatch) {
-  v8::Local<v8::Object> hReturnValue = v8::Object::New(pIsolate);
-  if (trycatch.HasCaught()) {
-    v8::Local<v8::Value> hException = trycatch.Exception();
-    v8::Local<v8::Message> hMessage = trycatch.Message();
-    if (hException->IsObject()) {
-      v8::Local<v8::Value> hValue;
-      hValue = hException.As<v8::Object>()->Get(
-          v8::String::NewFromUtf8(pIsolate, "name"));
-      if (hValue->IsString() || hValue->IsStringObject()) {
-        hReturnValue->Set(0, hValue);
-      } else {
-        hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
-      }
-      hValue = hException.As<v8::Object>()->Get(
-          v8::String::NewFromUtf8(pIsolate, "message"));
-      if (hValue->IsString() || hValue->IsStringObject()) {
-        hReturnValue->Set(1, hValue);
-      } else {
-        hReturnValue->Set(1, hMessage->Get());
-      }
-    } else {
-      hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error"));
-      hReturnValue->Set(1, hMessage->Get());
-    }
-    hReturnValue->Set(2, hException);
-    hReturnValue->Set(3, v8::Integer::New(pIsolate, hMessage->GetLineNumber()));
-    hReturnValue->Set(4, hMessage->GetSourceLine());
-    v8::Maybe<int32_t> maybe_int =
-        hMessage->GetStartColumn(pIsolate->GetCurrentContext());
-    hReturnValue->Set(5, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0)));
-    maybe_int = hMessage->GetEndColumn(pIsolate->GetCurrentContext());
-    hReturnValue->Set(6, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0)));
-  }
-  return hReturnValue;
-}
-
-FX_BOOL FXJSE_ReturnValue_GetMessage(FXJSE_HVALUE hRetValue,
-                                     CFX_ByteString& utf8Name,
-                                     CFX_ByteString& utf8Message) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
-  if (!lpValue) {
-    return FALSE;
-  }
-  v8::Isolate* pIsolate = lpValue->GetIsolate();
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::Value> hValue =
-      v8::Local<v8::Value>::New(pIsolate, lpValue->DirectGetValue());
-  if (!hValue->IsObject()) {
-    return FALSE;
-  }
-  v8::String::Utf8Value hStringVal0(
-      hValue.As<v8::Object>()->Get(0)->ToString());
-  utf8Name = *hStringVal0;
-  v8::String::Utf8Value hStringVal1(
-      hValue.As<v8::Object>()->Get(1)->ToString());
-  utf8Message = *hStringVal1;
-  return TRUE;
-}
-
-FX_BOOL FXJSE_ReturnValue_GetLineInfo(FXJSE_HVALUE hRetValue,
-                                      int32_t& nLine,
-                                      int32_t& nCol) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
-  if (!lpValue) {
-    return FALSE;
-  }
-  v8::Isolate* pIsolate = lpValue->GetIsolate();
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::Value> hValue =
-      v8::Local<v8::Value>::New(pIsolate, lpValue->DirectGetValue());
-  if (!hValue->IsObject()) {
-    return FALSE;
-  }
-  v8::MaybeLocal<v8::Int32> maybe_int =
-      hValue.As<v8::Object>()->Get(3)->ToInt32(pIsolate->GetCurrentContext());
-  nLine = maybe_int.FromMaybe(v8::Local<v8::Int32>())->Value();
-  maybe_int =
-      hValue.As<v8::Object>()->Get(5)->ToInt32(pIsolate->GetCurrentContext());
-  nCol = maybe_int.FromMaybe(v8::Local<v8::Int32>())->Value();
-  return TRUE;
-}
-
-CFXJSE_Context* CFXJSE_Context::Create(v8::Isolate* pIsolate,
-                                       const FXJSE_CLASS* lpGlobalClass,
-                                       void* lpGlobalObject) {
-  CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate);
-  CFXJSE_Context* pContext = new CFXJSE_Context(pIsolate);
-  CFXJSE_Class* lpGlobalClassObj = NULL;
-  v8::Local<v8::ObjectTemplate> hObjectTemplate;
-  if (lpGlobalClass) {
-    lpGlobalClassObj = CFXJSE_Class::Create(pContext, lpGlobalClass, TRUE);
-    ASSERT(lpGlobalClassObj);
-    v8::Local<v8::FunctionTemplate> hFunctionTemplate =
-        v8::Local<v8::FunctionTemplate>::New(pIsolate,
-                                             lpGlobalClassObj->m_hTemplate);
-    hObjectTemplate = hFunctionTemplate->InstanceTemplate();
-  } else {
-    hObjectTemplate = v8::ObjectTemplate::New(pIsolate);
-    hObjectTemplate->SetInternalFieldCount(1);
-  }
-  v8::Local<v8::Context> hNewContext =
-      v8::Context::New(pIsolate, NULL, hObjectTemplate);
-  v8::Local<v8::Context> hRootContext = v8::Local<v8::Context>::New(
-      pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
-  hNewContext->SetSecurityToken(hRootContext->GetSecurityToken());
-  v8::Local<v8::Object> hGlobalObject =
-      FXJSE_GetGlobalObjectFromContext(hNewContext);
-  FXJSE_UpdateObjectBinding(hGlobalObject, lpGlobalObject);
-  pContext->m_hContext.Reset(pIsolate, hNewContext);
-  return pContext;
-}
-
-CFXJSE_Context::~CFXJSE_Context() {
-  for (int32_t i = 0, count = m_rgClasses.GetSize(); i < count; i++) {
-    CFXJSE_Class* pClass = m_rgClasses[i];
-    if (pClass) {
-      delete pClass;
-    }
-  }
-  m_rgClasses.RemoveAll();
-}
-
-void CFXJSE_Context::GetGlobalObject(CFXJSE_Value* pValue) {
-  ASSERT(pValue);
-  CFXJSE_ScopeUtil_IsolateHandleContext scope(this);
-  v8::Local<v8::Context> hContext =
-      v8::Local<v8::Context>::New(m_pIsolate, m_hContext);
-  v8::Local<v8::Object> hGlobalObject = hContext->Global();
-  pValue->ForceSetValue(hGlobalObject);
-}
-
-FX_BOOL CFXJSE_Context::ExecuteScript(const FX_CHAR* szScript,
-                                      CFXJSE_Value* lpRetValue,
-                                      CFXJSE_Value* lpNewThisObject) {
-  CFXJSE_ScopeUtil_IsolateHandleContext scope(this);
-  v8::TryCatch trycatch(m_pIsolate);
-  v8::Local<v8::String> hScriptString =
-      v8::String::NewFromUtf8(m_pIsolate, szScript);
-  if (lpNewThisObject == NULL) {
-    v8::Local<v8::Script> hScript = v8::Script::Compile(hScriptString);
-    if (!trycatch.HasCaught()) {
-      v8::Local<v8::Value> hValue = hScript->Run();
-      if (!trycatch.HasCaught()) {
-        if (lpRetValue) {
-          lpRetValue->m_hValue.Reset(m_pIsolate, hValue);
-        }
-        return TRUE;
-      }
-    }
-    if (lpRetValue) {
-      lpRetValue->m_hValue.Reset(m_pIsolate,
-                                 FXJSE_CreateReturnValue(m_pIsolate, trycatch));
-    }
-    return FALSE;
-  } else {
-    v8::Local<v8::Value> hNewThis =
-        v8::Local<v8::Value>::New(m_pIsolate, lpNewThisObject->m_hValue);
-    ASSERT(!hNewThis.IsEmpty());
-    v8::Local<v8::Script> hWrapper =
-        v8::Script::Compile(v8::String::NewFromUtf8(
-            m_pIsolate, "(function () { return eval(arguments[0]); })"));
-    v8::Local<v8::Value> hWrapperValue = hWrapper->Run();
-    ASSERT(hWrapperValue->IsFunction());
-    v8::Local<v8::Function> hWrapperFn = hWrapperValue.As<v8::Function>();
-    if (!trycatch.HasCaught()) {
-      v8::Local<v8::Value> rgArgs[] = {hScriptString};
-      v8::Local<v8::Value> hValue =
-          hWrapperFn->Call(hNewThis.As<v8::Object>(), 1, rgArgs);
-      if (!trycatch.HasCaught()) {
-        if (lpRetValue) {
-          lpRetValue->m_hValue.Reset(m_pIsolate, hValue);
-        }
-        return TRUE;
-      }
-    }
-    if (lpRetValue) {
-      lpRetValue->m_hValue.Reset(m_pIsolate,
-                                 FXJSE_CreateReturnValue(m_pIsolate, trycatch));
-    }
-    return FALSE;
-  }
-}
diff --git a/xfa/src/fxjse/context.h b/xfa/src/fxjse/context.h
deleted file mode 100644
index b35a280..0000000
--- a/xfa/src/fxjse/context.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_CONTEXT_H_
-#define XFA_SRC_FXJSE_CONTEXT_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "v8/include/v8.h"
-#include "xfa/include/fxjse/fxjse.h"
-
-class CFXJSE_Class;
-class CFXJSE_Value;
-
-class CFXJSE_Context {
- protected:
-  CFXJSE_Context(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
-
- public:
-  static CFXJSE_Context* Create(v8::Isolate* pIsolate,
-                                const FXJSE_CLASS* lpGlobalClass = NULL,
-                                void* lpGlobalObject = NULL);
-  ~CFXJSE_Context();
-  V8_INLINE v8::Isolate* GetRuntime(void) { return m_pIsolate; }
-  void GetGlobalObject(CFXJSE_Value* pValue);
-  FX_BOOL ExecuteScript(const FX_CHAR* szScript,
-                        CFXJSE_Value* lpRetValue,
-                        CFXJSE_Value* lpNewThisObject = NULL);
-
- protected:
-  CFXJSE_Context();
-  CFXJSE_Context(const CFXJSE_Context&);
-  CFXJSE_Context& operator=(const CFXJSE_Context&);
-
- protected:
-  v8::Global<v8::Context> m_hContext;
-  v8::Isolate* m_pIsolate;
-  CFX_ArrayTemplate<CFXJSE_Class*> m_rgClasses;
-  friend class CFXJSE_Class;
-  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
-  friend class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext;
-};
-v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
-                                              v8::TryCatch& trycatch);
-
-#endif  // XFA_SRC_FXJSE_CONTEXT_H_
diff --git a/xfa/src/fxjse/dynprop.cpp b/xfa/src/fxjse/dynprop.cpp
deleted file mode 100644
index 55ca6ed..0000000
--- a/xfa/src/fxjse/dynprop.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxjse/class.h"
-#include "xfa/src/fxjse/value.h"
-
-static void FXJSE_DynPropGetterAdapter_MethodCallback(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> hCallBackInfo = info.Data().As<v8::Object>();
-  FXJSE_CLASS* lpClass = static_cast<FXJSE_CLASS*>(
-      hCallBackInfo->GetAlignedPointerFromInternalField(0));
-  v8::Local<v8::String> hPropName =
-      hCallBackInfo->GetInternalField(1).As<v8::String>();
-  ASSERT(lpClass && !hPropName.IsEmpty());
-  v8::String::Utf8Value szPropName(hPropName);
-  CFX_ByteStringC szFxPropName = *szPropName;
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(info.This());
-  CFXJSE_Value* lpRetValue = CFXJSE_Value::Create(info.GetIsolate());
-  CFXJSE_ArgumentsImpl impl = {&info, lpRetValue};
-  lpClass->dynMethodCall(reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                         szFxPropName,
-                         reinterpret_cast<CFXJSE_Arguments&>(impl));
-  if (!lpRetValue->DirectGetValue().IsEmpty()) {
-    info.GetReturnValue().Set(lpRetValue->DirectGetValue());
-  }
-  delete lpRetValue;
-  lpRetValue = nullptr;
-  delete lpThisValue;
-  lpThisValue = nullptr;
-}
-
-static void FXJSE_DynPropGetterAdapter(const FXJSE_CLASS* lpClass,
-                                       FXJSE_HOBJECT hObject,
-                                       const CFX_ByteStringC& szPropName,
-                                       FXJSE_HVALUE hValue) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
-  if (nPropType == FXJSE_ClassPropType_Property) {
-    if (lpClass->dynPropGetter) {
-      lpClass->dynPropGetter(hObject, szPropName, hValue);
-    }
-  } else if (nPropType == FXJSE_ClassPropType_Method) {
-    if (lpClass->dynMethodCall && hValue) {
-      CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-      v8::Isolate* pIsolate = lpValue->GetIsolate();
-      v8::HandleScope hscope(pIsolate);
-      v8::Local<v8::ObjectTemplate> hCallBackInfoTemplate =
-          v8::ObjectTemplate::New(pIsolate);
-      hCallBackInfoTemplate->SetInternalFieldCount(2);
-      v8::Local<v8::Object> hCallBackInfo =
-          hCallBackInfoTemplate->NewInstance();
-      hCallBackInfo->SetAlignedPointerInInternalField(
-          0, const_cast<FXJSE_CLASS*>(lpClass));
-      hCallBackInfo->SetInternalField(
-          1, v8::String::NewFromUtf8(
-                 pIsolate, reinterpret_cast<const char*>(szPropName.GetPtr()),
-                 v8::String::kNormalString, szPropName.GetLength()));
-      lpValue->ForceSetValue(v8::Function::New(
-          lpValue->GetIsolate(), FXJSE_DynPropGetterAdapter_MethodCallback,
-          hCallBackInfo));
-    }
-  }
-}
-
-static void FXJSE_DynPropSetterAdapter(const FXJSE_CLASS* lpClass,
-                                       FXJSE_HOBJECT hObject,
-                                       const CFX_ByteStringC& szPropName,
-                                       FXJSE_HVALUE hValue) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
-  if (nPropType != FXJSE_ClassPropType_Method) {
-    if (lpClass->dynPropSetter) {
-      lpClass->dynPropSetter(hObject, szPropName, hValue);
-    }
-  }
-}
-
-static FX_BOOL FXJSE_DynPropQueryAdapter(const FXJSE_CLASS* lpClass,
-                                         FXJSE_HOBJECT hObject,
-                                         const CFX_ByteStringC& szPropName) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(hObject, szPropName, TRUE);
-  return nPropType != FXJSE_ClassPropType_None;
-}
-
-static FX_BOOL FXJSE_DynPropDeleterAdapter(const FXJSE_CLASS* lpClass,
-                                           FXJSE_HOBJECT hObject,
-                                           const CFX_ByteStringC& szPropName) {
-  ASSERT(lpClass);
-  int32_t nPropType =
-      lpClass->dynPropTypeGetter == nullptr
-          ? FXJSE_ClassPropType_Property
-          : lpClass->dynPropTypeGetter(hObject, szPropName, FALSE);
-  if (nPropType != FXJSE_ClassPropType_Method) {
-    if (lpClass->dynPropDeleter) {
-      return lpClass->dynPropDeleter(hObject, szPropName);
-    } else {
-      return nPropType == FXJSE_ClassPropType_Property ? FALSE : TRUE;
-    }
-  }
-  return FALSE;
-}
-
-static void FXJSE_V8_GenericNamedPropertyQueryCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Integer>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::HandleScope scope(pIsolate);
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(thisObject);
-  if (FXJSE_DynPropQueryAdapter(lpClass,
-                                reinterpret_cast<FXJSE_HOBJECT>(lpThisValue),
-                                szFxPropName)) {
-    info.GetReturnValue().Set(v8::DontDelete);
-  } else {
-    const int32_t iV8Absent = 64;
-    info.GetReturnValue().Set(iV8Absent);
-  }
-  delete lpThisValue;
-  lpThisValue = nullptr;
-}
-
-static void FXJSE_V8_GenericNamedPropertyDeleterCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Boolean>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::HandleScope scope(pIsolate);
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(thisObject);
-  info.GetReturnValue().Set(
-      FXJSE_DynPropDeleterAdapter(
-          lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName)
-          ? true
-          : false);
-  delete lpThisValue;
-  lpThisValue = nullptr;
-}
-
-static void FXJSE_V8_GenericNamedPropertyGetterCallback(
-    v8::Local<v8::Name> property,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(thisObject);
-  CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate());
-  FXJSE_DynPropGetterAdapter(
-      lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName,
-      reinterpret_cast<FXJSE_HVALUE>(lpNewValue));
-  info.GetReturnValue().Set(lpNewValue->DirectGetValue());
-  delete lpThisValue;
-  lpThisValue = nullptr;
-}
-
-static void FXJSE_V8_GenericNamedPropertySetterCallback(
-    v8::Local<v8::Name> property,
-    v8::Local<v8::Value> value,
-    const v8::PropertyCallbackInfo<v8::Value>& info) {
-  v8::Local<v8::Object> thisObject = info.This();
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  v8::String::Utf8Value szPropName(property);
-  CFX_ByteStringC szFxPropName(*szPropName, szPropName.length());
-  CFXJSE_Value* lpThisValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpThisValue->ForceSetValue(thisObject);
-  CFXJSE_Value* lpNewValue = CFXJSE_Value::Create(info.GetIsolate());
-  lpNewValue->ForceSetValue(value);
-  FXJSE_DynPropSetterAdapter(
-      lpClass, reinterpret_cast<FXJSE_HOBJECT>(lpThisValue), szFxPropName,
-      reinterpret_cast<FXJSE_HVALUE>(lpNewValue));
-  info.GetReturnValue().Set(value);
-  delete lpThisValue;
-  lpThisValue = nullptr;
-}
-
-static void FXJSE_V8_GenericNamedPropertyEnumeratorCallback(
-    const v8::PropertyCallbackInfo<v8::Array>& info) {
-  const FXJSE_CLASS* lpClass =
-      static_cast<FXJSE_CLASS*>(info.Data().As<v8::External>()->Value());
-  v8::Isolate* pIsolate = info.GetIsolate();
-  v8::Local<v8::Array> newArray = v8::Array::New(pIsolate, lpClass->propNum);
-  for (int i = 0; i < lpClass->propNum; i++) {
-    newArray->Set(
-        i, v8::String::NewFromUtf8(pIsolate, lpClass->properties[i].name));
-  }
-  info.GetReturnValue().Set(newArray);
-}
-
-void CFXJSE_Class::SetUpNamedPropHandler(
-    v8::Isolate* pIsolate,
-    v8::Local<v8::ObjectTemplate>& hObjectTemplate,
-    const FXJSE_CLASS* lpClassDefinition) {
-  v8::NamedPropertyHandlerConfiguration configuration(
-      lpClassDefinition->dynPropGetter
-          ? FXJSE_V8_GenericNamedPropertyGetterCallback
-          : 0,
-      lpClassDefinition->dynPropSetter
-          ? FXJSE_V8_GenericNamedPropertySetterCallback
-          : 0,
-      lpClassDefinition->dynPropTypeGetter
-          ? FXJSE_V8_GenericNamedPropertyQueryCallback
-          : 0,
-      lpClassDefinition->dynPropDeleter
-          ? FXJSE_V8_GenericNamedPropertyDeleterCallback
-          : 0,
-      FXJSE_V8_GenericNamedPropertyEnumeratorCallback,
-      v8::External::New(pIsolate, const_cast<FXJSE_CLASS*>(lpClassDefinition)),
-      v8::PropertyHandlerFlags::kNonMasking);
-  hObjectTemplate->SetHandler(configuration);
-}
diff --git a/xfa/src/fxjse/runtime.cpp b/xfa/src/fxjse/runtime.cpp
deleted file mode 100644
index 69a0ed1..0000000
--- a/xfa/src/fxjse/runtime.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxjse/runtime.h"
-
-#include "fpdfsdk/include/jsapi/fxjs_v8.h"
-#include "xfa/src/fxjse/scope_inline.h"
-
-// Duplicates fpdfsdk's JS_Runtime.h, but keeps XFA from depending on it.
-// TODO(tsepez): make a single version of this.
-class FXJSE_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
-  void* Allocate(size_t length) override { return calloc(1, length); }
-  void* AllocateUninitialized(size_t length) override { return malloc(length); }
-  void Free(void* data, size_t length) override { free(data); }
-};
-
-static void FXJSE_KillV8() {
-  v8::V8::Dispose();
-}
-
-void FXJSE_Initialize() {
-  if (!CFXJSE_RuntimeData::g_RuntimeList) {
-    CFXJSE_RuntimeData::g_RuntimeList = new CFXJSE_RuntimeList;
-  }
-  static FX_BOOL bV8Initialized = FALSE;
-  if (bV8Initialized) {
-    return;
-  }
-  bV8Initialized = TRUE;
-  atexit(FXJSE_KillV8);
-}
-
-static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate) {
-  {
-    v8::Locker locker(pIsolate);
-    if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
-      delete pData->m_pFXJSERuntimeData;
-      pData->m_pFXJSERuntimeData = nullptr;
-    }
-  }
-  pIsolate->Dispose();
-}
-
-void FXJSE_Finalize() {
-  if (CFXJSE_RuntimeData::g_RuntimeList) {
-    CFXJSE_RuntimeData::g_RuntimeList->RemoveAllRuntimes(
-        FXJSE_Runtime_DisposeCallback);
-    delete CFXJSE_RuntimeData::g_RuntimeList;
-    CFXJSE_RuntimeData::g_RuntimeList = NULL;
-  }
-}
-
-FXJSE_HRUNTIME FXJSE_Runtime_Create() {
-  v8::Isolate::CreateParams params;
-  params.array_buffer_allocator = new FXJSE_ArrayBufferAllocator();
-  v8::Isolate* pIsolate = v8::Isolate::New(params);
-  ASSERT(pIsolate && CFXJSE_RuntimeData::g_RuntimeList);
-  CFXJSE_RuntimeData::g_RuntimeList->AppendRuntime(pIsolate);
-  return reinterpret_cast<FXJSE_HRUNTIME>(pIsolate);
-}
-
-void FXJSE_Runtime_Release(FXJSE_HRUNTIME hRuntime, bool bOwnedRuntime) {
-  v8::Isolate* pIsolate = reinterpret_cast<v8::Isolate*>(hRuntime);
-  if (!pIsolate)
-    return;
-  if (bOwnedRuntime) {
-    ASSERT(CFXJSE_RuntimeData::g_RuntimeList);
-    CFXJSE_RuntimeData::g_RuntimeList->RemoveRuntime(
-        pIsolate, FXJSE_Runtime_DisposeCallback);
-  } else {
-    if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
-      delete pData->m_pFXJSERuntimeData;
-      pData->m_pFXJSERuntimeData = nullptr;
-    }
-  }
-}
-
-CFXJSE_RuntimeData* CFXJSE_RuntimeData::Create(v8::Isolate* pIsolate) {
-  CFXJSE_RuntimeData* pRuntimeData = new CFXJSE_RuntimeData(pIsolate);
-  CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate);
-  v8::Local<v8::FunctionTemplate> hFuncTemplate =
-      v8::FunctionTemplate::New(pIsolate);
-  v8::Local<v8::Context> hContext =
-      v8::Context::New(pIsolate, 0, hFuncTemplate->InstanceTemplate());
-  hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate));
-  pRuntimeData->m_hRootContextGlobalTemplate.Reset(pIsolate, hFuncTemplate);
-  pRuntimeData->m_hRootContext.Reset(pIsolate, hContext);
-  return pRuntimeData;
-}
-
-CFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) {
-  FXJS_PerIsolateData::SetUp(pIsolate);
-  FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
-  if (!pData->m_pFXJSERuntimeData)
-    pData->m_pFXJSERuntimeData = CFXJSE_RuntimeData::Create(pIsolate);
-  return pData->m_pFXJSERuntimeData;
-}
-
-CFXJSE_RuntimeList* CFXJSE_RuntimeData::g_RuntimeList = NULL;
-void CFXJSE_RuntimeList::AppendRuntime(v8::Isolate* pIsolate) {
-  m_RuntimeList.Add(pIsolate);
-}
-
-void CFXJSE_RuntimeList::RemoveRuntime(
-    v8::Isolate* pIsolate,
-    CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
-  int32_t iIdx = m_RuntimeList.Find(pIsolate, 0);
-  if (iIdx >= 0) {
-    m_RuntimeList.RemoveAt(iIdx, 1);
-  }
-  if (lpfnDisposeCallback) {
-    lpfnDisposeCallback(pIsolate);
-  }
-}
-
-void CFXJSE_RuntimeList::RemoveAllRuntimes(
-    CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
-  int32_t iSize = m_RuntimeList.GetSize();
-  if (lpfnDisposeCallback) {
-    for (int32_t iIdx = 0; iIdx < iSize; iIdx++) {
-      lpfnDisposeCallback(m_RuntimeList[iIdx]);
-    }
-  }
-  m_RuntimeList.RemoveAll();
-}
diff --git a/xfa/src/fxjse/runtime.h b/xfa/src/fxjse/runtime.h
deleted file mode 100644
index a93a589..0000000
--- a/xfa/src/fxjse/runtime.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_RUNTIME_H_
-#define XFA_SRC_FXJSE_RUNTIME_H_
-
-#include "core/include/fxcrt/fx_basic.h"
-#include "v8/include/v8.h"
-
-class CFXJSE_RuntimeList;
-
-class CFXJSE_RuntimeData {
- protected:
-  CFXJSE_RuntimeData(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
-
- public:
-  static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate);
-  static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate);
-
- public:
-  v8::Isolate* m_pIsolate;
-  v8::Global<v8::FunctionTemplate> m_hRootContextGlobalTemplate;
-  v8::Global<v8::Context> m_hRootContext;
-
- public:
-  static CFXJSE_RuntimeList* g_RuntimeList;
-
- protected:
-  CFXJSE_RuntimeData();
-  CFXJSE_RuntimeData(const CFXJSE_RuntimeData&);
-  CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&);
-};
-
-class CFXJSE_RuntimeList {
- public:
-  typedef void (*RuntimeDisposeCallback)(v8::Isolate*);
-
- public:
-  void AppendRuntime(v8::Isolate* pIsolate);
-  void RemoveRuntime(v8::Isolate* pIsolate,
-                     RuntimeDisposeCallback lpfnDisposeCallback);
-  void RemoveAllRuntimes(RuntimeDisposeCallback lpfnDisposeCallback);
-
- protected:
-  CFX_ArrayTemplate<v8::Isolate*> m_RuntimeList;
-};
-
-#endif  // XFA_SRC_FXJSE_RUNTIME_H_
diff --git a/xfa/src/fxjse/scope_inline.h b/xfa/src/fxjse/scope_inline.h
deleted file mode 100644
index 6105590..0000000
--- a/xfa/src/fxjse/scope_inline.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_SCOPE_INLINE_H_
-#define XFA_SRC_FXJSE_SCOPE_INLINE_H_
-
-#include "xfa/src/fxjse/context.h"
-#include "xfa/src/fxjse/runtime.h"
-
-class CFXJSE_ScopeUtil_IsolateHandle {
- protected:
-  v8::Isolate* m_isolate;
-  v8::Locker m_locker;
-  v8::Isolate::Scope m_iscope;
-  v8::HandleScope m_hscope;
-
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate)
-      : m_isolate(pIsolate),
-        m_locker(pIsolate),
-        m_iscope(pIsolate),
-        m_hscope(pIsolate) {}
-  v8::Isolate* GetIsolate() { return m_isolate; }
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&);
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandle&);
-  void* operator new(size_t size);
-  void operator delete(void*, size_t);
-};
-class CFXJSE_ScopeUtil_IsolateHandleRootContext {
-  CFXJSE_ScopeUtil_IsolateHandle m_parent;
-  v8::Context::Scope m_cscope;
-
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate)
-      : m_parent(pIsolate),
-        m_cscope(v8::Local<v8::Context>::New(
-            pIsolate,
-            CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandleRootContext(
-      const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
-  void* operator new(size_t size);
-  void operator delete(void*, size_t);
-};
-class CFXJSE_ScopeUtil_IsolateHandleContext {
-  CFXJSE_Context* m_context;
-  CFXJSE_ScopeUtil_IsolateHandle m_parent;
-  v8::Context::Scope m_cscope;
-
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext)
-      : m_context(pContext),
-        m_parent(pContext->m_pIsolate),
-        m_cscope(v8::Local<v8::Context>::New(pContext->m_pIsolate,
-                                             pContext->m_hContext)) {}
-  v8::Isolate* GetIsolate() { return m_context->m_pIsolate; }
-  v8::Local<v8::Context> GetLocalContext() {
-    return v8::Local<v8::Context>::New(m_context->m_pIsolate,
-                                       m_context->m_hContext);
-  }
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandleContext(
-      const CFXJSE_ScopeUtil_IsolateHandleContext&);
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&);
-  void* operator new(size_t size);
-  void operator delete(void*, size_t);
-};
-class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext {
-  CFXJSE_Context* m_context;
-  CFXJSE_ScopeUtil_IsolateHandle m_parent;
-  v8::Context::Scope m_cscope;
-
- public:
-  explicit CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
-      v8::Isolate* pIsolate,
-      CFXJSE_Context* pContext)
-      : m_context(pContext),
-        m_parent(pIsolate),
-        m_cscope(v8::Local<v8::Context>::New(
-            pIsolate,
-            pContext ? pContext->m_hContext
-                     : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
-  v8::Isolate* GetIsolate() { return m_parent.GetIsolate(); }
-  v8::Local<v8::Context> GetLocalContext() {
-    v8::Isolate* pIsolate = m_parent.GetIsolate();
-    return v8::Local<v8::Context>::New(
-        pIsolate, m_context
-                      ? m_context->m_hContext
-                      : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
-  }
-
- private:
-  CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
-      const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
-  void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
-  void* operator new(size_t size);
-  void operator delete(void*, size_t);
-};
-
-#endif  // XFA_SRC_FXJSE_SCOPE_INLINE_H_
diff --git a/xfa/src/fxjse/util_inline.h b/xfa/src/fxjse/util_inline.h
deleted file mode 100644
index c29c22e..0000000
--- a/xfa/src/fxjse/util_inline.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_UTIL_INLINE_H_
-#define XFA_SRC_FXJSE_UTIL_INLINE_H_
-
-#include "xfa/src/fxjse/context.h"
-
-static V8_INLINE v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
-    const v8::Local<v8::Context>& hContext) {
-  return hContext->Global()->GetPrototype().As<v8::Object>();
-}
-static V8_INLINE void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
-                                                void* lpNewBinding) {
-  ASSERT(!hObject.IsEmpty());
-  ASSERT(hObject->InternalFieldCount() > 0);
-  hObject->SetAlignedPointerInInternalField(0, lpNewBinding);
-}
-static V8_INLINE void* FXJSE_RetrieveObjectBinding(
-    const v8::Local<v8::Object>& hJSObject,
-    CFXJSE_Class* lpClass = NULL) {
-  ASSERT(!hJSObject.IsEmpty());
-  if (!hJSObject->IsObject()) {
-    return NULL;
-  }
-  v8::Local<v8::Object> hObject = hJSObject;
-  if (hObject->InternalFieldCount() == 0) {
-    v8::Local<v8::Value> hProtoObject = hObject->GetPrototype();
-    if (hProtoObject.IsEmpty() || !hProtoObject->IsObject()) {
-      return NULL;
-    }
-    hObject = hProtoObject.As<v8::Object>();
-    if (hObject->InternalFieldCount() == 0) {
-      return NULL;
-    }
-  }
-  if (lpClass) {
-    v8::Local<v8::FunctionTemplate> hClass =
-        v8::Local<v8::FunctionTemplate>::New(
-            lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate());
-    if (!hClass->HasInstance(hObject)) {
-      return NULL;
-    }
-  }
-  return hObject->GetAlignedPointerFromInternalField(0);
-}
-
-#endif  // XFA_SRC_FXJSE_UTIL_INLINE_H_
diff --git a/xfa/src/fxjse/value.cpp b/xfa/src/fxjse/value.cpp
deleted file mode 100644
index f7b0409..0000000
--- a/xfa/src/fxjse/value.cpp
+++ /dev/null
@@ -1,582 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/src/fxjse/value.h"
-
-#include <math.h>
-
-#include "xfa/src/fxjse/class.h"
-#include "xfa/src/fxjse/util_inline.h"
-
-FX_BOOL FXJSE_Value_IsUndefined(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsUndefined();
-}
-
-FX_BOOL FXJSE_Value_IsNull(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsNull();
-}
-
-FX_BOOL FXJSE_Value_IsBoolean(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsBoolean();
-}
-
-FX_BOOL FXJSE_Value_IsUTF8String(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsString();
-}
-
-FX_BOOL FXJSE_Value_IsNumber(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsNumber();
-}
-
-FX_BOOL FXJSE_Value_IsInteger(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsInteger();
-}
-
-FX_BOOL FXJSE_Value_IsObject(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsObject();
-}
-
-FX_BOOL FXJSE_Value_IsArray(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsArray();
-}
-
-FX_BOOL FXJSE_Value_IsFunction(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsFunction();
-}
-
-FX_BOOL FXJSE_Value_IsDate(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  return lpValue && lpValue->IsDate();
-}
-
-FX_BOOL FXJSE_Value_ToBoolean(FXJSE_HVALUE hValue) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToBoolean();
-}
-
-FX_FLOAT FXJSE_Value_ToFloat(FXJSE_HVALUE hValue) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToFloat();
-}
-
-FXJSE_DOUBLE FXJSE_Value_ToDouble(FXJSE_HVALUE hValue) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToDouble();
-}
-
-void FXJSE_Value_ToUTF8String(FXJSE_HVALUE hValue,
-                              CFX_ByteString& szStrOutput) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToString(szStrOutput);
-}
-
-int32_t FXJSE_Value_ToInteger(FXJSE_HVALUE hValue) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToInteger();
-}
-
-void* FXJSE_Value_ToObject(FXJSE_HVALUE hValue, FXJSE_HCLASS hClass) {
-  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
-  return reinterpret_cast<CFXJSE_Value*>(hValue)->ToObject(lpClass);
-}
-
-void FXJSE_Value_SetUndefined(FXJSE_HVALUE hValue) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetUndefined();
-}
-
-void FXJSE_Value_SetNull(FXJSE_HVALUE hValue) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetNull();
-}
-
-void FXJSE_Value_SetBoolean(FXJSE_HVALUE hValue, FX_BOOL bBoolean) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetBoolean(bBoolean);
-}
-
-void FXJSE_Value_SetUTF8String(FXJSE_HVALUE hValue,
-                               const CFX_ByteStringC& szString) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetString(szString);
-}
-
-void FXJSE_Value_SetInteger(FXJSE_HVALUE hValue, int32_t nInteger) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetInteger(nInteger);
-}
-
-void FXJSE_Value_SetFloat(FXJSE_HVALUE hValue, FX_FLOAT fFloat) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetFloat(fFloat);
-}
-
-void FXJSE_Value_SetDouble(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetDouble(dDouble);
-}
-
-void FXJSE_Value_SetObject(FXJSE_HVALUE hValue,
-                           void* lpObject,
-                           FXJSE_HCLASS hClass) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Class* lpClass = reinterpret_cast<CFXJSE_Class*>(hClass);
-  if (!lpClass) {
-    ASSERT(!lpObject);
-    lpValue->SetJSObject();
-  } else {
-    lpValue->SetHostObject(lpObject, lpClass);
-  }
-}
-
-void FXJSE_Value_SetArray(FXJSE_HVALUE hValue,
-                          uint32_t uValueCount,
-                          FXJSE_HVALUE* rgValues) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)
-      ->SetArray(uValueCount, reinterpret_cast<CFXJSE_Value**>(rgValues));
-}
-
-void FXJSE_Value_SetDate(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble) {
-  reinterpret_cast<CFXJSE_Value*>(hValue)->SetDate(dDouble);
-}
-
-void FXJSE_Value_Set(FXJSE_HVALUE hValue, FXJSE_HVALUE hOriginalValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpOriginalValue =
-      reinterpret_cast<CFXJSE_Value*>(hOriginalValue);
-  ASSERT(lpValue && lpOriginalValue);
-  lpValue->Assign(lpOriginalValue);
-}
-
-FX_BOOL FXJSE_Value_GetObjectProp(FXJSE_HVALUE hValue,
-                                  const CFX_ByteStringC& szPropName,
-                                  FXJSE_HVALUE hPropValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
-  ASSERT(lpValue && lpPropValue);
-  return lpValue->GetObjectProperty(szPropName, lpPropValue);
-}
-
-FX_BOOL FXJSE_Value_SetObjectProp(FXJSE_HVALUE hValue,
-                                  const CFX_ByteStringC& szPropName,
-                                  FXJSE_HVALUE hPropValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
-  ASSERT(lpValue && lpPropValue);
-  return lpValue->SetObjectProperty(szPropName, lpPropValue);
-}
-
-FX_BOOL FXJSE_Value_GetObjectPropByIdx(FXJSE_HVALUE hValue,
-                                       uint32_t uPropIdx,
-                                       FXJSE_HVALUE hPropValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
-  ASSERT(lpValue && lpPropValue);
-  return lpValue->GetObjectProperty(uPropIdx, lpPropValue);
-}
-
-FX_BOOL FXJSE_Value_SetObjectPropByIdx(FXJSE_HVALUE hValue,
-                                       uint32_t uPropIdx,
-                                       FXJSE_HVALUE hPropValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
-  ASSERT(lpValue && lpPropValue);
-  return lpValue->SetObjectProperty(uPropIdx, lpPropValue);
-}
-
-FX_BOOL FXJSE_Value_DeleteObjectProp(FXJSE_HVALUE hValue,
-                                     const CFX_ByteStringC& szPropName) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)
-      ->DeleteObjectProperty(szPropName);
-}
-
-FX_BOOL FXJSE_Value_ObjectHasOwnProp(FXJSE_HVALUE hValue,
-                                     const CFX_ByteStringC& szPropName,
-                                     FX_BOOL bUseTypeGetter) {
-  return reinterpret_cast<CFXJSE_Value*>(hValue)
-      ->HasObjectOwnProperty(szPropName, bUseTypeGetter);
-}
-
-FX_BOOL FXJSE_Value_SetObjectOwnProp(FXJSE_HVALUE hValue,
-                                     const CFX_ByteStringC& szPropName,
-                                     FXJSE_HVALUE hPropValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpPropValue = reinterpret_cast<CFXJSE_Value*>(hPropValue);
-  ASSERT(lpValue && lpPropValue);
-  return lpValue->SetObjectOwnProperty(szPropName, lpPropValue);
-}
-
-FX_BOOL FXJSE_Value_SetFunctionBind(FXJSE_HVALUE hValue,
-                                    FXJSE_HVALUE hOldFunction,
-                                    FXJSE_HVALUE hNewThis) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  CFXJSE_Value* lpOldFunction = reinterpret_cast<CFXJSE_Value*>(hOldFunction);
-  CFXJSE_Value* lpNewThis = reinterpret_cast<CFXJSE_Value*>(hNewThis);
-  ASSERT(lpValue && lpOldFunction && lpNewThis);
-  return lpValue->SetFunctionBind(lpOldFunction, lpNewThis);
-}
-
-FX_BOOL FXJSE_Value_CallFunction(FXJSE_HVALUE hFunction,
-                                 FXJSE_HVALUE hThis,
-                                 FXJSE_HVALUE hRetValue,
-                                 uint32_t nArgCount,
-                                 FXJSE_HVALUE* lpArgs) {
-  CFXJSE_Value* lpThis = reinterpret_cast<CFXJSE_Value*>(hThis);
-  CFXJSE_Value* lpRetValue = reinterpret_cast<CFXJSE_Value*>(hRetValue);
-  return reinterpret_cast<CFXJSE_Value*>(hFunction)
-      ->Call(lpThis, lpRetValue, nArgCount, lpArgs);
-}
-
-FXJSE_HVALUE FXJSE_Value_Create(FXJSE_HRUNTIME hRuntime) {
-  return reinterpret_cast<FXJSE_HVALUE>(
-      CFXJSE_Value::Create(reinterpret_cast<v8::Isolate*>(hRuntime)));
-}
-
-void FXJSE_Value_Release(FXJSE_HVALUE hValue) {
-  CFXJSE_Value* lpValue = reinterpret_cast<CFXJSE_Value*>(hValue);
-  delete lpValue;
-}
-
-FXJSE_HRUNTIME FXJSE_Value_GetRuntime(FXJSE_HVALUE hValue) {
-  return reinterpret_cast<FXJSE_HRUNTIME>(
-      reinterpret_cast<CFXJSE_Value*>(hValue)->GetIsolate());
-}
-
-void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Name,
-                        const CFX_ByteStringC& utf8Message) {
-  v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
-  ASSERT(pIsolate);
-
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
-  v8::Local<v8::String> hMessage = v8::String::NewFromUtf8(
-      pIsolate, utf8Message.GetCStr(), v8::String::kNormalString,
-      utf8Message.GetLength());
-  v8::Local<v8::Value> hError;
-
-  if (utf8Name == "RangeError") {
-    hError = v8::Exception::RangeError(hMessage);
-  } else if (utf8Name == "ReferenceError") {
-    hError = v8::Exception::ReferenceError(hMessage);
-  } else if (utf8Name == "SyntaxError") {
-    hError = v8::Exception::SyntaxError(hMessage);
-  } else if (utf8Name == "TypeError") {
-    hError = v8::Exception::TypeError(hMessage);
-  } else {
-    hError = v8::Exception::Error(hMessage);
-    if (utf8Name != "Error" && !utf8Name.IsEmpty()) {
-      hError.As<v8::Object>()->Set(
-          v8::String::NewFromUtf8(pIsolate, "name"),
-          v8::String::NewFromUtf8(pIsolate, utf8Name.GetCStr(),
-                                  v8::String::kNormalString,
-                                  utf8Name.GetLength()));
-    }
-  }
-  pIsolate->ThrowException(hError);
-}
-
-CFXJSE_Value* CFXJSE_Value::Create(v8::Isolate* pIsolate) {
-  return new CFXJSE_Value(pIsolate);
-}
-
-void* CFXJSE_Value::ToObject(CFXJSE_Class* lpClass) const {
-  ASSERT(!m_hValue.IsEmpty());
-
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hValue = v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  ASSERT(!hValue.IsEmpty());
-
-  if (!hValue->IsObject())
-    return nullptr;
-
-  return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), lpClass);
-}
-
-V8_INLINE static double FXJSE_ftod(FX_FLOAT fNumber) {
-  if (sizeof(FX_FLOAT) != 4) {
-    ASSERT(FALSE);
-    return fNumber;
-  }
-
-  uint32_t nFloatBits = (uint32_t&)fNumber;
-  uint8_t nExponent = (uint8_t)(nFloatBits >> 16 >> 7);
-  if (nExponent == 0 || nExponent == 255)
-    return fNumber;
-
-  int8_t nErrExp = nExponent - 127 - 23;
-  if (nErrExp >= 0)
-    return fNumber;
-
-  double dwError = pow(2.0, nErrExp), dwErrorHalf = dwError / 2;
-  double dNumber = fNumber, dNumberAbs = fabs(fNumber);
-  double dNumberAbsMin = dNumberAbs - dwErrorHalf,
-         dNumberAbsMax = dNumberAbs + dwErrorHalf;
-  int32_t iErrPos = 0;
-  if (floor(dNumberAbsMin) == floor(dNumberAbsMax)) {
-    dNumberAbsMin = fmod(dNumberAbsMin, 1.0);
-    dNumberAbsMax = fmod(dNumberAbsMax, 1.0);
-    int32_t iErrPosMin = 1, iErrPosMax = 38;
-    do {
-      int32_t iMid = (iErrPosMin + iErrPosMax) / 2;
-      double dPow = pow(10.0, iMid);
-      if (floor(dNumberAbsMin * dPow) == floor(dNumberAbsMax * dPow)) {
-        iErrPosMin = iMid + 1;
-      } else {
-        iErrPosMax = iMid;
-      }
-    } while (iErrPosMin < iErrPosMax);
-    iErrPos = iErrPosMax;
-  }
-  double dPow = pow(10.0, iErrPos);
-  return fNumber < 0 ? ceil(dNumber * dPow - 0.5) / dPow
-                     : floor(dNumber * dPow + 0.5) / dPow;
-}
-
-void CFXJSE_Value::SetFloat(FX_FLOAT fFloat) {
-  CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-  v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, FXJSE_ftod(fFloat));
-  m_hValue.Reset(m_pIsolate, hValue);
-}
-
-void CFXJSE_Value::SetHostObject(void* lpObject, CFXJSE_Class* lpClass) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  ASSERT(lpClass);
-  v8::Local<v8::FunctionTemplate> hClass =
-      v8::Local<v8::FunctionTemplate>::New(m_pIsolate, lpClass->m_hTemplate);
-  v8::Local<v8::Object> hObject = hClass->InstanceTemplate()->NewInstance();
-  FXJSE_UpdateObjectBinding(hObject, lpObject);
-  m_hValue.Reset(m_pIsolate, hObject);
-}
-
-void CFXJSE_Value::SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Array> hArrayObject = v8::Array::New(m_pIsolate, uValueCount);
-  if (rgValues) {
-    for (uint32_t i = 0; i < uValueCount; i++) {
-      if (rgValues[i]) {
-        hArrayObject->Set(i, v8::Local<v8::Value>::New(
-                                 m_pIsolate, rgValues[i]->DirectGetValue()));
-      }
-    }
-  }
-  m_hValue.Reset(m_pIsolate, hArrayObject);
-}
-
-void CFXJSE_Value::SetDate(FXJSE_DOUBLE dDouble) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hDate = v8::Date::New(m_pIsolate, dDouble);
-  m_hValue.Reset(m_pIsolate, hDate);
-}
-
-FX_BOOL CFXJSE_Value::SetObjectProperty(const CFX_ByteStringC& szPropName,
-                                        CFXJSE_Value* lpPropValue) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::Value> hPropValue =
-      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->DirectGetValue());
-  return (FX_BOOL)hObject.As<v8::Object>()->Set(
-      v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(),
-                              v8::String::kNormalString,
-                              szPropName.GetLength()),
-      hPropValue);
-}
-
-FX_BOOL CFXJSE_Value::GetObjectProperty(const CFX_ByteStringC& szPropName,
-                                        CFXJSE_Value* lpPropValue) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::Value> hPropValue =
-      hObject.As<v8::Object>()->Get(v8::String::NewFromUtf8(
-          m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
-          szPropName.GetLength()));
-  lpPropValue->ForceSetValue(hPropValue);
-  return TRUE;
-}
-
-FX_BOOL CFXJSE_Value::SetObjectProperty(uint32_t uPropIdx,
-                                        CFXJSE_Value* lpPropValue) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::Value> hPropValue =
-      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->DirectGetValue());
-  return (FX_BOOL)hObject.As<v8::Object>()->Set(uPropIdx, hPropValue);
-}
-
-FX_BOOL CFXJSE_Value::GetObjectProperty(uint32_t uPropIdx,
-                                        CFXJSE_Value* lpPropValue) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::Value> hPropValue = hObject.As<v8::Object>()->Get(uPropIdx);
-  lpPropValue->ForceSetValue(hPropValue);
-  return TRUE;
-}
-
-FX_BOOL CFXJSE_Value::DeleteObjectProperty(const CFX_ByteStringC& szPropName) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  hObject.As<v8::Object>()->Delete(v8::String::NewFromUtf8(
-      m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
-      szPropName.GetLength()));
-  return TRUE;
-}
-
-FX_BOOL CFXJSE_Value::HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                                           FX_BOOL bUseTypeGetter) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::String> hKey = v8::String::NewFromUtf8(
-      m_pIsolate, szPropName.GetCStr(), v8::String::kNormalString,
-      szPropName.GetLength());
-  return hObject.As<v8::Object>()->HasRealNamedProperty(hKey) ||
-         (bUseTypeGetter &&
-          hObject.As<v8::Object>()
-              ->HasOwnProperty(m_pIsolate->GetCurrentContext(), hKey)
-              .FromMaybe(false));
-}
-
-FX_BOOL CFXJSE_Value::SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                                           CFXJSE_Value* lpPropValue) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hObject =
-      v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-  if (!hObject->IsObject())
-    return FALSE;
-
-  v8::Local<v8::Value> hValue =
-      v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->m_hValue);
-  return hObject.As<v8::Object>()
-      ->DefineOwnProperty(
-          m_pIsolate->GetCurrentContext(),
-          v8::String::NewFromUtf8(m_pIsolate, szPropName.GetCStr(),
-                                  v8::String::kNormalString,
-                                  szPropName.GetLength()),
-          hValue)
-      .FromMaybe(false);
-}
-
-FX_BOOL CFXJSE_Value::SetFunctionBind(CFXJSE_Value* lpOldFunction,
-                                      CFXJSE_Value* lpNewThis) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> rgArgs[2];
-  v8::Local<v8::Value> hOldFunction =
-      v8::Local<v8::Value>::New(m_pIsolate, lpOldFunction->DirectGetValue());
-  if (hOldFunction.IsEmpty() || !hOldFunction->IsFunction())
-    return FALSE;
-
-  rgArgs[0] = hOldFunction;
-  v8::Local<v8::Value> hNewThis =
-      v8::Local<v8::Value>::New(m_pIsolate, lpNewThis->DirectGetValue());
-  if (hNewThis.IsEmpty())
-    return FALSE;
-
-  rgArgs[1] = hNewThis;
-  v8::Local<v8::String> hBinderFuncSource =
-      v8::String::NewFromUtf8(m_pIsolate,
-                              "(function (oldfunction, newthis) { return "
-                              "oldfunction.bind(newthis); })");
-  v8::Local<v8::Function> hBinderFunc =
-      v8::Script::Compile(hBinderFuncSource)->Run().As<v8::Function>();
-  v8::Local<v8::Value> hBoundFunction =
-      hBinderFunc->Call(m_pIsolate->GetCurrentContext()->Global(), 2, rgArgs);
-  if (hBoundFunction.IsEmpty() || !hBoundFunction->IsFunction())
-    return FALSE;
-
-  m_hValue.Reset(m_pIsolate, hBoundFunction);
-  return TRUE;
-}
-
-#define FXJSE_INVALID_PTR ((void*)(intptr_t)-1)
-FX_BOOL CFXJSE_Value::Call(CFXJSE_Value* lpReceiver,
-                           CFXJSE_Value* lpRetValue,
-                           uint32_t nArgCount,
-                           FXJSE_HVALUE* lpArgs) {
-  CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-  v8::Local<v8::Value> hFunctionValue =
-      v8::Local<v8::Value>::New(m_pIsolate, DirectGetValue());
-  v8::Local<v8::Object> hFunctionObject =
-      !hFunctionValue.IsEmpty() && hFunctionValue->IsObject()
-          ? hFunctionValue.As<v8::Object>()
-          : v8::Local<v8::Object>();
-
-  v8::TryCatch trycatch(m_pIsolate);
-  if (hFunctionObject.IsEmpty() || !hFunctionObject->IsCallable()) {
-    if (lpRetValue)
-      lpRetValue->ForceSetValue(FXJSE_CreateReturnValue(m_pIsolate, trycatch));
-    return FALSE;
-  }
-
-  v8::Local<v8::Value> hReturnValue;
-  v8::Local<v8::Value>* lpLocalArgs = NULL;
-  if (nArgCount) {
-    lpLocalArgs = FX_Alloc(v8::Local<v8::Value>, nArgCount);
-    for (uint32_t i = 0; i < nArgCount; i++) {
-      new (lpLocalArgs + i) v8::Local<v8::Value>;
-      CFXJSE_Value* lpArg = (CFXJSE_Value*)lpArgs[i];
-      if (lpArg) {
-        lpLocalArgs[i] =
-            v8::Local<v8::Value>::New(m_pIsolate, lpArg->DirectGetValue());
-      }
-      if (lpLocalArgs[i].IsEmpty()) {
-        lpLocalArgs[i] = v8::Undefined(m_pIsolate);
-      }
-    }
-  }
-
-  FX_BOOL bRetValue = TRUE;
-  if (lpReceiver == FXJSE_INVALID_PTR) {
-    v8::MaybeLocal<v8::Value> maybe_retvalue =
-        hFunctionObject->CallAsConstructor(m_pIsolate->GetCurrentContext(),
-                                           nArgCount, lpLocalArgs);
-    hReturnValue = maybe_retvalue.FromMaybe(v8::Local<v8::Value>());
-  } else {
-    v8::Local<v8::Value> hReceiver;
-    if (lpReceiver) {
-      hReceiver =
-          v8::Local<v8::Value>::New(m_pIsolate, lpReceiver->DirectGetValue());
-    }
-    if (hReceiver.IsEmpty() || !hReceiver->IsObject())
-      hReceiver = v8::Object::New(m_pIsolate);
-
-    v8::MaybeLocal<v8::Value> maybe_retvalue = hFunctionObject->CallAsFunction(
-        m_pIsolate->GetCurrentContext(), hReceiver, nArgCount, lpLocalArgs);
-    hReturnValue = maybe_retvalue.FromMaybe(v8::Local<v8::Value>());
-  }
-
-  if (trycatch.HasCaught()) {
-    hReturnValue = FXJSE_CreateReturnValue(m_pIsolate, trycatch);
-    bRetValue = FALSE;
-  }
-
-  if (lpRetValue)
-    lpRetValue->ForceSetValue(hReturnValue);
-
-  if (lpLocalArgs) {
-    for (uint32_t i = 0; i < nArgCount; i++)
-      lpLocalArgs[i].~Local();
-    FX_Free(lpLocalArgs);
-  }
-  return bRetValue;
-}
diff --git a/xfa/src/fxjse/value.h b/xfa/src/fxjse/value.h
deleted file mode 100644
index 55c9c72..0000000
--- a/xfa/src/fxjse/value.h
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_SRC_FXJSE_VALUE_H_
-#define XFA_SRC_FXJSE_VALUE_H_
-
-#include "xfa/src/fxjse/scope_inline.h"
-
-class CFXJSE_Value {
- public:
-  CFXJSE_Value(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}
-
- protected:
-  CFXJSE_Value();
-  CFXJSE_Value(const CFXJSE_Value&);
-  CFXJSE_Value& operator=(const CFXJSE_Value&);
-
- public:
-  V8_INLINE FX_BOOL IsUndefined() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsUndefined();
-  }
-  V8_INLINE FX_BOOL IsNull() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsNull();
-  }
-  V8_INLINE FX_BOOL IsBoolean() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsBoolean();
-  }
-  V8_INLINE FX_BOOL IsString() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsString();
-  }
-  V8_INLINE FX_BOOL IsNumber() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsNumber();
-  }
-  V8_INLINE FX_BOOL IsInteger() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsInt32();
-  }
-  V8_INLINE FX_BOOL IsObject() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsObject();
-  }
-  V8_INLINE FX_BOOL IsArray() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsArray();
-  }
-  V8_INLINE FX_BOOL IsFunction() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsFunction();
-  }
-  V8_INLINE FX_BOOL IsDate() const {
-    if (m_hValue.IsEmpty()) {
-      return FALSE;
-    }
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return hValue->IsDate();
-  }
-
- public:
-  V8_INLINE FX_BOOL ToBoolean() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<FX_BOOL>(hValue->BooleanValue());
-  }
-  V8_INLINE FX_FLOAT ToFloat() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<FX_FLOAT>(hValue->NumberValue());
-  }
-  V8_INLINE FXJSE_DOUBLE ToDouble() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<FXJSE_DOUBLE>(hValue->NumberValue());
-  }
-  V8_INLINE int32_t ToInteger() const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    return static_cast<int32_t>(hValue->NumberValue());
-  }
-  V8_INLINE void ToString(CFX_ByteString& szStrOutput) const {
-    ASSERT(!m_hValue.IsEmpty());
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Local<v8::Value>::New(m_pIsolate, m_hValue);
-    v8::Local<v8::String> hString = hValue->ToString();
-    v8::String::Utf8Value hStringVal(hString);
-    szStrOutput = *hStringVal;
-  }
-  void* ToObject(CFXJSE_Class* lpClass) const;
-
- public:
-  V8_INLINE void SetUndefined() {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Undefined(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetNull() {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Null(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetBoolean(FX_BOOL bBoolean) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue =
-        v8::Boolean::New(m_pIsolate, bBoolean != FALSE);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetInteger(int32_t nInteger) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Integer::New(m_pIsolate, nInteger);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetDouble(FXJSE_DOUBLE dDouble) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Number::New(m_pIsolate, dDouble);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetString(const CFX_ByteStringC& szString) {
-    CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::String::NewFromUtf8(
-        m_pIsolate, reinterpret_cast<const char*>(szString.GetPtr()),
-        v8::String::kNormalString, szString.GetLength());
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void SetFloat(FX_FLOAT fFloat);
-  V8_INLINE void SetJSObject() {
-    CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate);
-    v8::Local<v8::Value> hValue = v8::Object::New(m_pIsolate);
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  void SetHostObject(void* lpObject, CFXJSE_Class* lpClass);
-  void SetArray(uint32_t uValueCount, CFXJSE_Value** rgValues);
-  void SetDate(FXJSE_DOUBLE dDouble);
-
- public:
-  FX_BOOL GetObjectProperty(const CFX_ByteStringC& szPropName,
-                            CFXJSE_Value* lpPropValue);
-  FX_BOOL SetObjectProperty(const CFX_ByteStringC& szPropName,
-                            CFXJSE_Value* lpPropValue);
-  FX_BOOL GetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
-  FX_BOOL SetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue);
-  FX_BOOL DeleteObjectProperty(const CFX_ByteStringC& szPropName);
-  FX_BOOL HasObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                               FX_BOOL bUseTypeGetter);
-  FX_BOOL SetObjectOwnProperty(const CFX_ByteStringC& szPropName,
-                               CFXJSE_Value* lpPropValue);
-  FX_BOOL SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis);
-  FX_BOOL Call(CFXJSE_Value* lpReceiver,
-               CFXJSE_Value* lpRetValue,
-               uint32_t nArgCount,
-               FXJSE_HVALUE* lpArgs);
-
- public:
-  V8_INLINE v8::Isolate* GetIsolate() const { return m_pIsolate; }
-  V8_INLINE const v8::Global<v8::Value>& DirectGetValue() const {
-    return m_hValue;
-  }
-  V8_INLINE void ForceSetValue(v8::Local<v8::Value> hValue) {
-    m_hValue.Reset(m_pIsolate, hValue);
-  }
-  V8_INLINE void Assign(const CFXJSE_Value* lpValue) {
-    if (lpValue) {
-      m_hValue.Reset(m_pIsolate, lpValue->m_hValue);
-    } else {
-      m_hValue.Reset();
-    }
-  }
-
- public:
-  static CFXJSE_Value* Create(v8::Isolate* pIsolate);
-
- protected:
-  v8::Isolate* m_pIsolate;
-  v8::Global<v8::Value> m_hValue;
-  friend class CFXJSE_Context;
-  friend class CFXJSE_Class;
-};
-
-#endif  // XFA_SRC_FXJSE_VALUE_H_
